#龙马UI lm-ui
安装
首先创建项目,使用vue-cli3创建项目
vue create lm-ui-element-test
创建好后,进入项目文件夹lm-ui-element-test,先安装element-ui,然后安装lm-ui-element
安装element-ui
npm i element-ui
使用npm安装
npm i lm-ui-element
使用cnpm安装
cnpm i lm-ui-element
main.js
import Vue from 'vue'
import App from './App.vue'
/**
* 除了lm-calendar组件,其他组件均依赖element-ui,所以请先引入element-ui
*/
import ElementUi from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import LmUIElement from 'lm-ui-element' //引入lm-ui-element
import 'lm-ui-element/lib/lm-ui-element-style/index.css' //引入样式文件
Vue.use(ElementUi)
Vue.use(LmUIElement)
Vue.config.productionTip = false
new Vue({
render: h => h(App)
}).$mount('#app')
使用
安装好后可直接在项目中使用 App.vue
<template>
<div class="exampleBox">
<div class="lm-ui-title rowCenter">
<strong>龙马-ui</strong>
</div>
<div class="componentsBox">
<div class="componentItemBox columnCenter">
<lm-calendar></lm-calendar>
<el-button type="text">日历</el-button>
</div>
<el-form width="1000">
<el-row>
<lm-input></lm-input>
<lm-select></lm-select>
</el-row>
<el-row>
<lm-date-time></lm-date-time>
<lm-cascader></lm-cascader>
</el-row>
</el-form>
</div>
</div>
</template>
自定义主题
lm-ui-element基于element-ui,除了不依赖element-ui的组件,其他组件的主题,请直接使用element-ui的主题设定方式
组件
lm-calendar 日历
日历组件,提供日历基础显示功能以及数据插入功能(有数据标志),日期点击,月份切换等
基础用法
<lm-calendar></lm-calendar>
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
initDate | 初始化日期值 | String / Date / Number | -- | new Date() |
width | 日历宽度 | String / Number | -- | 100% |
height | 日历高度 | String/ Number | -- | 100% |
calendarClass | 日历自定义样式类名 | String | -- | -- |
titleClass | 年月标题自定义样式类名 | String | -- | -- |
titleH | 年月标题高度 | String / Number | -- | 35px |
titleBk | 年月标题颜色 | String | -- | #ffffff |
bodyBk | 日历体背景 | String | -- | #ffffff |
bodyClass | 日历体自定义样式类名 | String | -- | -- |
dateDefaultClass | 自定义日期默认类名 | String | -- | -- |
dateActivDateClass | 自定义日期选中类名 | String | -- | -- |
dateDisabledDateClass | 自定义日期不可用类名 | String | -- | -- |
titleDateConnector | 标题日期连接符 | String | -- | -- |
insertData | 插入的数据 | Array | -- | [] |
weeks | 日历头部周数据 | Array | -- | ['日','一','二','三','四','五','六'] |
dateProp | 自定义表示时间的字段 | String | -- | -- |
calenCellClass | 日历单元格自定义样式 | String | -- | -- |
firstRowCellClass | 日历第一行单元格自定义样式 | String | -- | -- |
cellBorder | 是否有边框 | Boolean | -- | -- |
cellTitleHeight | 日历标题高度 | String / Number | -- | 40px |
cellTitleColor | 日历标题颜色 | String | -- | #333333 |
options | 配置 | Object | -- | { range:[] } |
Slots
name | 说明 |
---|---|
calendarTitle | 日历顶部标题内容 |
calendarHead | 日历头内容 |
changeMonthBtn | 月份切换按钮 |
weeks | 日历头部周数据 |
day | 日期 |
haveDataTag | 有数据标志 |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
getChooseDate | 选择日期 | (date:String) |
monthChange | 月份改变 | (date:String) |
使用示例
<template>
<div class="canlendarExample">
<lm-calendar ref="canlendar" @getChooseDate="checkDate=>date=checkDate" :insert-data="insertData" :options="{range:['',new Date()]}" date-prop="hasDataDate" @monthChange="v=>date=v">
<template #weeks>
<div class="weeksBox rowCenter">
<div class="weekItem rowCenter font16" v-for="(week,index) in weeks" :key="week">
<span class="week">{{week}}</span>
<span class="rightLine verticalLine"></span>
<span class="leftLine verticalLine" v-if="index===0"></span>
</div>
</div>
</template>
<template #calendarHead="{currentYear,currentMonth,changeMonth}">
<div class="canlendar-top-box">
<div class="canlendar-top-inner-box rowCenter">
<div class="rowCenter year-back-box">
<span class="changeMonth rowCenter el-icon-caret-left" @click="changeMonth(0)"></span>
<strong style="margin:0 20px;">{{date}}</strong>
<span class="changeMonth rowCenter el-icon-caret-right" @click="changeMonth(1)"></span>
</div>
<span class="violet back-today font14 rowCenter" @click="changeMonth(2)">返回今天</span>
</div>
</div>
</template>
<template #haveDataTag="{day}">
<div class="haveDataTag rowCenter font12 violet"></div>
</template>
<template #day="{day,index}">
<div class="dayBox columnStart" :class="[day.dateClass,index%7===0 ? 'dayBorderLeft' : '',index<7 ? 'dayBorderTop' : '']">
<span class="font30 daySpan">{{day.day}}</span>
<div class="otherDataBox font20 rowBtween">
<i class="iconfont icon-weather-qing" :style="{color:'#333333'}"></i>
<i class="iconfont icon-weather-duoyun" :style="{color:'#333333'}"></i>
<i class="iconfont icon-weather-xiaoyu" :style="{color:'#333333'}"></i>
<i class="iconfont icon-weather-yin" :style="{color:'#333333'}"></i>
</div>
</div>
</template>
</lm-calendar>
</div>
</template>
<script>
import {formatDate} from "lm-ui-element/lib/utils/global-methods";
export default {
name: "LmCanlendarComponent",
components: {},
props: {},
data() {
return {
insertData: [],//插入的数据
date:'',//日期
changeMonth:null,//月份改变函数
weeks:['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
}
},
computed: {},
created() {
this.date=formatDate(new Date(),'-')
let roundNumArr=[]
for(let i=0;i<10;i++){
let roundNum=Math.floor(Math.random()*(28-1+1)+1)
roundNum<0 && (roundNum='0'+roundNum)
roundNumArr.push(roundNum)
}
let year=new Date().getFullYear()
let month=new Date().getMonth()+1
month<0 && (month='0'+month)
for(let i=0;i<roundNumArr.length;i++){
this.insertData.push({
hasDataDate:`${year}-${month}-${roundNumArr[i]}`
})
}
},
mounted() {
},
methods: {
//月份改变
getMonthChange({changeMonth,currentYear,currentMonth,type}){
//console.log(currentYear,currentMonth)
let currentMonthArr=[currentMonth-1,currentMonth+1]
this.$sunRainMethods.getMonthChange(changeMonth,type,{currentYear,currentMonth:currentMonthArr[type],that:this})
},
},
watch: {}
}
</script>
<style lang="scss" scoped type="text/scss">
@import "lm-ui-element/lm-ui-element-style/src/common/mix";
.canlendarExample{
.customCalendarHeadBox{
background:#ffffff;
padding:20px;
border-bottom:solid 1px #dddddd;
.monthBox{
.changeMonthBtnBox{
width:50px;
font-weight: bold;
margin-right:20px;
cursor:pointer;
}
.monthTextBox{
strong{
cursor:default;
letter-spacing: 2px;
}
}
}
}
.canlendar-top-box{
margin-bottom:20px;
.canlendar-top-inner-box{
width:100%;
position: relative;
.year-back-box{
.changeMonth{
width: 38px;
height: 38px;
background: #FFFFFF;
border: 1px solid #CCCCCC;
border-radius: 2px;
cursor:pointer;
}
}
.back-today{
margin-right:10px;
cursor:pointer;
@include positionTopRightSizeIndex($width:auto,$height:auto,$translateX:-50%,$translateY:-50%,$top:50%);
}
}
}
.dayBox{
height:40px;
border-right:solid 1px #cccccc;
border-bottom:solid 1px #cccccc;
padding:10px 0 10px 15px;
align-items: flex-start;
position: relative;
}
.dateDefaultCss{
.daySpan{
color:#333333;
}
}
.dateActiveCss{
background:rgba(84, 94, 188, 0.2);
.daySpan{
color:#333333;
}
}
.disableDateCss{
}
.dayBorderLeft{
border-left:solid 1px #cccccc;
}
.dayBorderTop{
border-Top:solid 1px #E7E9FC;
}
.haveDataTag{
@include positionLeftBottomSizeIndex($width:6px,$height:6px,$radius:50%,$bottom:10px,$left:50%,$translateX:-50%);
background:#37C37C;
}
.otherDataBox{
flex-wrap:wrap;
@include positionTopRightSizeIndex($width:50%,$height:72px,$top:5px,$right:1px);
.iconfont{
width:50%;
}
}
.weeksBox{
width:100%;
.weekItem{
height:48px;
width:14%;
border-top:solid 1px #cccccc;
border-bottom:solid 1px #cccccc;
background:#ebeef5;
position: relative;
.week{
}
.verticalLine{
background:#cccccc;
@include positionTopRightSizeIndex($width:1px,$height:48px);
}
.leftLine{
left:0;
}
}
}
}
</style>
<style>
.canlendarExample .calen-cell{
margin-bottom:0 !important;
}
.canlendarExample .body-title{
border-bottom:solid 1px #cccccc;
border-top:solid 1px #cccccc;
background:#eeeeee;
}
</style>
表单组件
表单组件共有lm-input输入框,lm-select选择框(包含单个下拉选择,多个下拉先选择,单项选择radio,),lm-date-time时间日期选择器,lm-cascader级联选择器
lm-form 表单组件包含 lm-input、lm-select、lm-date-time 、lm-cascader 组件 表单组件必须包含在 element-ui 的 el-form 组件和 el-row 组件中,请确保引入了element-ui 的 ElFrom、ElFormItem、ElRow 组件 表单组件支持表单状态(可编辑修改)和查看状态,不可见状态的切换,只需根据条件设置is-edit属性和disabled属性即可。
所有表单组件Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
span | 位置占位 | Number | 同 el-col 的span属性 | 12 |
label | 标题 | String | -- | '' |
prop | 验证属性值 | String | -- | '' |
width | 宽度 | Number / String | -- | -- |
height | 高度 | Number / String | -- | -- |
size | 尺寸 | String | medium / small / mini | -- |
labelWidth | 表单项文字宽度 | String | -- | -- |
isEdit | 是否是编辑状态 | Boolean | -- | true |
spanStyle | 查看状态下样式 | Object | -- | {} |
lmRef | 标志以及按回车下一次跳转标志 | Array | -- | [] |
disabled | 是否禁用 | Boolean | -- | -- |
required | 是否必须 | Boolean | -- | -- |
marginBottom | 表单项下边距 | String | -- | -- |
lm-input 输入框
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
value | 值 | String / Number | -- | -- |
appendText | 尾部文字 | String | -- | -- |
appendIcon | 尾部图标 | String | -- | -- |
placeholder | placeholder | String | -- | 请输入 |
type | 类型 | String | text,textarea 和其他 原生 input 的 type 值 | text |
prefixIcon | 输入框前置图标 | String | -- | -- |
maxlength | 最大长度 | String / Number | -- | -- |
minlength | 最小长度 | String / Number | -- | -- |
min | 最小值 | Number | -- | -- |
max | 最大值 | Number | -- | -- |
toFixed | 保留的小数 | Number | -- | -- |
autosize | type="textarea"有效,自动尺寸 | Boolean / Object | -- | { minRows: 2 } |
elAuto | 是否启用el-autocomplete组件 | Boolean | -- | -- |
valueKey | elAuto=true 有效,el-autocomplete输入建议对象中用于显示的键名 | String | -- | name |
placement | elAuto=true 有效,el-autocomplete菜单弹出位置 | String | -- | -- |
triggerOnFocus | elAuto=true 有效,el-autocomplete组件是否在输入框 focus 时显示建议列表 | Boolean | -- | false |
inputQueryData | elAuto=true 有效,el-autocomplete输入框建议数据 | Array | -- | [] |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
change | 输入框改变 | (any) |
enter | 回车事件 | -- |
lm-select 下拉选择框和单选按钮
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
value | 值 | String / Number /Array | -- | -- |
formType | 表单类型 | String | radio / multiSelect | select |
list | 尾部图标 | Array | -- | ['否','是'] |
placeholder | placeholder | String / Array | -- | 请选择 |
selectClass | select类名 | String | -- | -- |
oName | 选项文字 | String / Array | -- | name |
oValue | 选项值 | String / Array | -- | value |
filterable | 是否可搜索 | Boolean | -- | true |
changeFun | 下拉框改变的函数 | Function / Array | -- | -- |
multiMargin | 多个下拉框的边距 | String | -- | 0 10px 0 0 |
multiList | 多个下拉框的数据 | Array | -- | -- |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
change | 下拉框,单选框改变 | (value:Object/Array) |
lm-date-time 日期时间选择器
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
value | 值 | String / Number /Array / Date | -- | -- |
formType | 表单类型 | String | rangeDateTime | dateTime |
dateTimeType | 日期时间类型(同element-ui el-date-picker) | String | year/month/date/dates/ week/datetime/datetimerange/ daterange/monthrange | date |
placeholder | placeholder | String / Array | -- | 请选择 |
defaultDateTimeValue | 默认值 | String / Array / Date / Number | -- | -- |
dateTimeValueFormat | 时间格式(格式同element-ui el-date-picker) | String | -- | -- |
dateTimeFormat | 时间格式(格式同element-ui el-date-picker) | String | -- | -- |
pickerOptions | 时间日期配置(配置内容同element-ui el-date-picker配置,formType=rangeDateTime时晴传数组) | Object / Array | -- | -- |
conectionText | formType=rangeDateTime有效,时间范围连接符 | String | -- | - |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
change | 事件日期改变 | (date:String/Number/Date/Array) |
lm-cascader 级联选择器
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
value | 值 | String / Number | -- | -- |
placeholder | placeholder | 请选择 | ||
options | 数据 | Array | -- | -- |
oName | 选项文字 | String | -- | name |
oValue | 选项值 | String | -- | value |
filterable | 是否可搜索 | Boolean | -- | true |
pickerOptions | 级联配置(配置内容同element-ui el-cascader配置 props) | Object | -- | -- |
代码示例
<template>
<el-form :model="form" ref="form" :rules="rules" class="form" label-width="110px" size="mini">
<el-row >
<lm-input label="姓名:" v-model="form.name" prop="name" :lm-ref="['name','phoneNum']" :maxlength="20"/>
<lm-input label="手机号:" v-model="form.phoneNum" prop="phoneNum" type="tel" :lm-ref="['phoneNum','orgId']" v-if="!isCert"/>
</el-row>
<el-row >
<lm-select form-type="select" label="公司:" v-model="form.orgId" :list="addPersonCompanys" prop="orgId" :lm-ref="['orgId','idcard']" @change="companyChange" :disabled="!!personDetailInfo.position"/>
<lm-input label="身份证号:" v-model="form.idcard" prop="idcard" :lm-ref="['idcard','sex']" type="idcard"/>
</el-row>
<el-row>
<lm-select form-type="radio" label="性别:" v-model="form.sex" :list="['女','男']" prop="sex"/>
<lm-date-time
label="出生日期:"
prop="birthday"
v-model="form.birthday"
:picker-options="{disabledDate:birthdayDisableFun}"
:default-date-time-value="Date.now()-10*365*24*60*60*1000"
/>
</el-row>
<el-row>
<lm-date-time :span="16" form-type="rangeDateTime" label="有效时间:" prop="effectiveTime" :placeholder="['请选择开始时间','请选择结束时间']" :disabled="[false,true]" v-model="form.effectiveTime" :width="220">
<template #dateTimeConection><span style="display: inline-block; margin:auto 10px;">至</span></template>
</lm-date-time>
</el-row>
<el-row>
<el-button type="primary" @click="savePersonInfo" style="width:90px;height:40px;">保存</el-button>
</el-row>
</el-form>
</template>
<script>
import {validPhone,validIDCard} from 'lm-ui-element/lib/utils/lm-validate-methods'
export default {
data(){
return {
form:{},//表单
rules: {
orgId: [{required: true, message: "请选择公司", trigger: ['blur', 'change']}],
name: [{required: true,message: '请输入姓名'},{min: 1,max: 10,message: '长度在 1 到 10 个字符'}],
phoneNum: [{required: true,message: '请输入联系方式',validator: validPhone},{min: 11,max: 11,message: '11位长度'}],
sex: [{required: true,message:'请选择性别',trigger: ['blur', 'change']}],
idcard: [{required: true,validator:validIDCard, trigger: ['blur', 'change']}],
birthday: [{required: true,message: '请选择出生日期', trigger: ['blur', 'change']}],
effectiveTime:[{
required: true,
validator:(rule, value, callback)=> validRangeDateTime(rule, value, callback,'请选择有效日期',this.idcardIsLongPeriod,{startRequired:true}),
trigger: ['blur', 'change']}],
},//实名表单验证
inputWidth:300,
},
},
methods: {
//保存信息
async savePersonInfo(){
await this.$refs.form.validate()
//console.log(this.form)
},
//分包单位改变
companyChange({value}){
//console.log(value)
},
},
}
</script>
地址选择组件
自带中国省市区县地址数据,组件较大,请按需引入。提供地址选择,地址搜索,根据地址获取经纬度功能
使用地址组件,请确保在项目中引入高德地图或者百度地图(0.7.6版本开始支持),确保AMap或者BMapGL或者BMap实例正确初始化,也可以不初始化地图实例,使用web服务api
以高德地图为例,实例初始化可在入口html文件,即index.html中引入 示例:
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的key"></script>
如果使用vue-amap的则要在main.js中引入 示例:
import VueAMap from 'vue-amap'; // 高德地图
VueAMap.initAMapApiLoader({
key:'你的key',
plugin: ['AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.Scale', 'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PolyEditor', 'AMap.CircleEditor', 'AMap.Geolocation', 'AMap.DistrictSearch'],
v: '1.4.4',
uiVersion: '1.0.11', // 版本号
})
严格来说地址组件也属于表单组件,lm-address组件必须包含在element-ui的el-form组件内部,lm-address默认占一行的位置,所以通常情况下,你不需要在lm-address外面套上el-row,也没有span属性 需要做表单校验的,可以从'lm-ui-element/lib/utils/lm-validate-methods'引入validAddressInfo进行校验,校验rule规则同element-ui的表单校验。或者自定义校验方法。
lm-address支持表单状态(可编辑修改)和查看状态,不可见状态的切换,只需根据条件设置is-edit属性和disabled属性即可。
当你在页面中直接从编辑状态切换到查看状态时,地址显示数据可能不能正确更新,可以使用setFullAddress方法解决
由于获取经纬度是异步的,有可能用户点击保存的时候,经纬度还没获取到或者还没更新,这时候如果直接保存,经纬度数据就不正确。 解决方案:lm-address 提供了addressChange事件,你可以在使用的组件中声明变量来确定是否获取到了经纬度,默认false,当获取到经纬度后改为true,addressChange事件触发时,改为false,这样就可以确保用户提交后的经纬度数据为正确数据
通过web api调用高德配置amap-key属性,百度地图配置bmap-key属性
当高德地图和百度地图均有配置时,只会使用高德地图
基础用法
<template>
<el-form ref="form" :rules="rules" :model="form" label-width="120px">
<lm-address v-model="form.address"/>
</el-form>
</template>
<script>
import {validAddressInfo} from 'lm-ui-element/lib/utils/lm-validate-methods'
export default {
data(){
return {
form:{},//表单
rules: {
address:[{validator:validAddressInfo,trigger:['blur']}],
},
}
}
}
</script>
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
required | 是否必须 | Boolean | -- | true |
title | 标题 | String | -- | 选择地址 |
maxlength | 最大长度 | String / Number | -- | -- |
showStreet | 是否显示输入详情地址 | Boolean | -- | true |
defaultAddress | 默认地址 | Object | -- | -- |
isEdit | 是否为编辑状态 | Boolean | -- | true |
size | 尺寸 | String | -- | -- |
inputWidth | 详情地址输入框宽度 | Number / String | -- | 'auto' |
filterable | 省市区选择栏是否可搜索 | Boolean | -- | true |
elAuto | 是否选择el-autocomplete组件(用于自动搜索匹配的目标地址) | Boolean | -- | true |
valueKey | elAuto为true有效,el-autocomplete组件输入建议对象中用于显示的键名 | String | -- | name |
placement | elAuto为true有效,el-autocomplete组件菜单弹出位置 | String | -- | -- |
triggerOnFocus | elAuto为true有效,el-autocomplete组件是否在输入框 focus 时显示建议列表 | Boolean | -- | -- |
maxlength | 地址输入框的最大长度 | String,Number | -- | -- |
selectWidth | 下拉框宽度 | String,Number | -- | -- |
disabled | 是否可见 | Boolean,Array | -- | -- |
getLngLat | 是否获取默认经纬度 | Boolean | false | true |
amapKey | 高德地图web服务api key | String | -- | -- |
bmapKey | 百度地图web服务api key | String | -- | -- |
bmapRetCoordtype | 百度地图经纬度类型 | String | -- | gcj02ll |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
addressChange | 地址发生变化 | (address:Object) |
getLngLatInfo | 获取经纬度 | ({lng:String,lat:String}:Object) |
provinceChange | 省发生改变回调 | (address:Object) |
cityChange | 市发生改变回调 | (address:Object) |
districtChange | 区县发生改变回调 | (address:Object) |
streetChange | 详细地址发生改变回调 | (address:Object) |
Methods
方法名 | 说明 | 参数 |
---|---|---|
setFullAddress | 设置地址全名(用于查看状态下) | (address:String) |
使用示例
<template>
<div>
<el-button @click="isEdit=!isEdit">{{isEdit ? '查看' : '编辑'}}</div>
<el-form ref="form" :rules="rules" :model="form" label-width="120px">
<lm-address
v-model="form.companyAddress"
:is-edit="isEdit"
ref="address"
@getLngLatFun="getLngLatInfo"
title="公司地址:"
input-width="300px"
address-prop="companyAddress"
@addressChange="isGetLonLat=false"
:disabled="[true,false,true,fasle]"
/>
</el-form>
<div>
<el-button @click="cancel"></el-button>
<el-button type="primary" @click="save"></el-button>
</div>
</div>
</template>
<script>
import {validAddressInfo} from 'lm-ui-element/lib/utils/lm-validate-methods'
import axios from 'axios'
export default {
data(){
return {
form:{},//表单
rules: {
companyAddress:[{validator:validAddressInfo,trigger:['blur']}],
},
isEdit:false,//是否编辑
lngLatInfo:{},//经纬度信息
isGetLonLat:false,//是否获取到经纬度
}
},
methods:{
//获取经纬度
getLngLatInfo(lngLatInfo){
this.lngLatInfo=lngLatInfo
// 获取到了经纬度后将isGetLonLat设为true
this.isGetLonLat=true
},
//保存
async save(){
await this.$refs.form.validate()
let {lngLatInfo,form,isGetLonLat}=this
if(!isGetLonLat){
//确保已经获取到了经纬度或者经纬度数据已经更新
this.$message.warning('正在努力获取经纬度,请稍后再试!')
}
let {msg,code}=await axios({
url:'/save',
data:{
...form,
...lngLatInfo
},
method:'POST'
})
this.isEdit=false
//console.log(code+msg)
if(code===1){
//成功
this.$refs.address.setFullAddress(form.addressArea.join(' '))
}
}
}
}
</script>
自定义弹窗组件
使用时请确保引入了element-ui 的 ElButton 组件
基础用法
<template>
<div class="exampleBox">
<el-button type="primary" @click="showDialog=true">打开弹窗</el-button>
<lm-dialog v-if="showDialog" @cancel="showDialog=false" @close="showDialog=false" @sure="sure">
<span>弹窗内容</span>
</lm-dialog>
</div>
</template>
<script>
export default {
data() {
return {
showDialog:false,//是否显示弹窗
}
},
methods: {
sure(){
this.showDialog=false
},
},
}
</script>
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
title | 标题 | String | -- | -- |
width | 宽度 | String / Number | -- | 400 |
background | 背景色 | String / Number | -- | 40 |
titleHeight | 标题栏高度 | String | -- | -- |
titleBk | 标题背景色 | String | -- | -- |
titleTextColor | 标题文字颜色 | String | -- | -- |
bottomPadding | 底部内边距 | String / Number | -- | 30 |
contentMarginBottom | 内容底部外边距 | String / Number | -- | 30 |
contentPadding | 内容区域内边距 | String / Number | -- | '30px 20px 10px 20px' |
showFooter | 是否显示底部 | Boolean | -- | true |
saveText | 保存按钮文字 | String | -- | -- |
backText | 返回按钮文字 | String | -- | -- |
btnWidth | 按钮宽度 | String | -- | 100px |
btnHeight | 按钮高度 | String | -- | 40px |
showLoading | 是否显示保存按钮的加载状态 | Boolean | -- | -- |
contentBoxStyle | 内容框样式 | Object | -- | -- |
Slots
name | 说明 |
---|---|
footer | 底部内容 |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
close | 关闭弹窗 | -- |
sure | 点击确定 | -- |
cancel | 点击取消 | -- |
文件图片上传组件
文件上传组件和图片上传组件虽然不是表单,但是是为表单设计的,必须放在element-ui的el-form标签中,基于element-ui的el-upload组件实现,带进度条,删除,预览功能。
0.7.7版本开始支持 v-model
请确保引入了element-ui 的 ElFrom、ElFormItem、ElUpload、ElButton、ElProgress、ElIcon 组件
若需要使用拍照功能,请确保引入element-ui的el-radio-group和el-radio组件
文件上传组件和图片上传组件支持表单状态(可编辑修改)和查看状态,只需根据条件设置is-edit属性即可
fileList属性和action属性必填
基础用法
<template>
<div>
<el-form>
<lm-up-img :file-list="imgList" action="http:xxx.com/upload"/>
<lm-up-file :file-list="fileList" action="http:xxx.com/upload"/>
</el-form>
</div>
</template>
<script>
export default {
data(){
return{
fileList:[],//文件
imgList:[],//图片
}
}
}
</script>
文件和图片上传组件公用Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
fileList | 文件/图片数据 | Array | -- | -- |
isEdit | 是否编辑状态 | Boolean | -- | true |
drag | 启用拖拽上传 | Boolean | -- | -- |
limit | 文件限制数量 | Number | -- | -- |
otherData | 上传附带的额外参数 | Boolean | -- | -- |
required | 是否必须 | Array | -- | -- |
hiddenCamera | 是否隐藏拍照 | Boolean | -- | true |
action | 上传地址 | String | -- | -- |
fileBaseUrl | 文件域名 | String | -- | -- |
customPreviewImgMethod | 自定义图片预览方法 | Function | -- | -- |
fileProp | 校验的prop,使用v-model时有效 | String | -- | fileList |
fields | 字段配置,使用v-model时有效 | Object | -- | -- |
resConfig | 返回值配置,使用v-model时有效 | Object | -- | -- |
fields配置说明
字段 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
fileId | 文件路径 | String | -- | fileId |
fileName | 文件名称 | String | -- | fileName |
fileType | 文件类型 | String | -- | fileType |
resConfig配置说明
字段 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
fileId | 文件路径 | String | -- | url |
fileType | 文件类型 | String | -- | fileType |
fileSize | 文件大小 | String | -- | fileSize |
文件和图片上传组件Slots
name | 说明 |
---|---|
fileView | 文件/图片列表内容 |
chooseFileBtn | 选择图片/文件按钮 |
cameraFile | 拍照的文件/图片 |
dragCameraBtn | 拖拽时相机图标 |
cameraBtn | 相机按钮 |
fileMethod | 文件图片上传方式(拍照还是上传) |
文件和图片上传组件Events
事件名 | 说明 | 回调参数 |
---|---|---|
filePreview | 图片文件预览 | (file:File) |
fileChange | 图片文件改变 | ({file:File,fileList:Array}) |
beforeUpload | 图片文件上传之前 | -- |
fileSuccess | 图片文件上传成功 | ({canICommit:Boolean,fileList:Array}) |
delFile | 图片文件删除 | -- |
fileMethodChange | 拍照和上传切换 | -- |
fileErr | 上传出错 | {err,file,fileList} |
文件和图片上传校验
校验函数为 validIsEnd,返回Promise,可以使用ref调用
lm-up-file 文件上传
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
label | 表单项标题 | String | -- | isEdit 为true时: '上传文件:,false时: '文件:' |
btnText | 按钮名称 | String | -- | 选择文件 |
fileAccept | 文件类型 | String | -- | .jpg,.jpeg,.png,.pdf,.webp' |
toastText | 提示文字 | String | -- | -- |
cameraText | 相机按钮文字 | String | -- | 点击拍照 |
toastColumn | 相机按钮文字 | String | -- | 点击拍照 |
cameraText | 提示文字是否竖排 | Boolean | -- | -- |
fileListStyle | 文件列表样式 | Object | -- | -- |
multiple | 是否多张 | Boolean | false | true |
overViewAccept | 可预览文件 | Array | -- | ['.png','.jpg','.jpeg','.webp','.pdf','.docx'] |
Slots
name | 说明 |
---|---|
filePrev | 文件前置内容 |
lm-up-file 图片上传
图片上传组件,如果需要图片裁剪,确保引入lm-ui-element的lm-img-cropper组件。
当图片大于200kb时,默认开启图片压缩
headImg属性为true时,默认开启图片裁剪
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
label | 表单项标题 | String | -- | isEdit 为true时: '上传图片:,false时: '图片:' |
imgWidth | 图片宽度 | String / Number | -- | 120px |
imgHeight | 图片高度 | String / Number | -- | 90px |
compressSize | 压缩尺寸 | Object | -- | { width:400 } |
hiddenCropper | 不裁剪图片 | Boolean | -- | true |
headImg | 是否是头像 | Boolean | -- | -- |
multiple | 是否多张 | Boolean | -- | -- |
Slots
name | 说明 |
---|---|
delIcon | 图片删除按钮 |
代码示例
<template>
<div>
<el-form ref="uploadMaterial" label-width="120px" size="small">
<el-row>
<lm-up-img
label="项目鸟瞰图"
:fileList="fileList"
:otherData="{bucketName:'project'}"
@fileSuccess="v=>canICommitImg=v.canICommitImg"
@beforeUpload="canICommitImg=false" multiple
@delFile="canICommitImg=true"
/>
</el-row>
<el-row>
<lm-up-file
:hiddenCamera="true"
:file-list="fileList"
:other-data="{bucketName:'material'}"
@fileSuccess="v=>canICommit=v.canICommit"
@beforeUpload="canICommit=false"
label="上传资料:"
fileAccept="*"
:file-list-style="{'padding-left':'40px'}"
@delFile="canICommitImg=true"
>
<template #filePrev="{fileViewForm,file}">
<el-row style="width:40%;" class="fileViewFormRow">
<lm-input width="200" :span="24" label="文件名称:" v-model="file.name" margin-bottom="0"/>
</el-row>
</template>
</lm-up-file>
</el-row>
</el-form>
<div>
<el-button @click="save">保存</el-button>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
fileList:[],//文件
canICommit:true,//是否可以提交文件
imgList:[],//图片
canICommitImg:true,//是否可以提交图片
}
},
methods: {
//确定上传
async save(){
let {fileList,imgList,canICommitImg,canICommit}=this
if(!canICommit){
this.$message.warning('请等待文件上传完成')
return
}
if(!canICommitImg){
this.$message.warning('请等待文件上传完成')
return
}
let res=await axios.post('/save',{fileList,imgList})
code===0 ? this.$message.success(res.data.msg) : this.$message.warning(res.data.msg)
}
},
}
</script>
使用v-model(0.7.7版本开始支持)
<template>
<el-form v-model="form" :model="form" ref="form" :rules="rules" label-width="120px">
<lm-up-file v-model="form.fileList"
action="/admin/sys-file/upload"
:fields="{fileId:'fileUrl',fileType:'type',fileSize:'size'}"
ref="fileList"
/>
<lm-up-img
v-model="form.imgList"
file-prop="imgList"
action="/admin/sys-file/upload"
:fields="{fileId:'fileUrl',fileType:'type',fileSize:'size'}"
ref="imgList"
/>
<el-row>
<el-button @click="save">保存</el-button>
</el-row>
</el-form>
</template>
<script>
export default {
data() {
return {
form:{},//
rules:{
imgList:[{required:true,message:'请上传图片',trigger:['change','blue']}],
fileList:[{required:true,message:'请上传文件',trigger:['change','blue']}],
},
}
},
methods: {
async save(){
await this.$refs.form.validate()
await this.$refs.fileList.validIsEnd()
await this.$refs.imgList.validIsEnd()
console.log(this.form)
},
},
}
</script>
图片裁剪组件
图片裁剪弹窗组件,基于vue-cropper插件,同时组件内部使用lm-dialog弹窗组件,使用时确保引入element-ui的el-button组件,lm-ui-element的lm-dialog组件
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
imgSrc | 裁剪图片的地址 | String / Blob | -- | -- |
info | 显示裁剪框的大小信息 | Boolean | -- | true |
outputSize | 剪切后的图片质量 | Number | 0.1~1 | 1 |
full | 输出原图比例截图 | Boolean | -- | true |
outputType | 裁剪生成额图片的格式 | String | -- | -- |
canMove | 能否拖动图片 | Boolean | -- | true |
original | 上传图片是否显示原始宽高 | Boolean | -- | true |
canMoveBox | 能否拖动截图框 | Boolean | -- | true |
autoCrop | 是否默认生成截图框 | Boolean | -- | true |
autoCropWidth | 裁剪框宽度 | Number | -- | 200 |
autoCropHeight | 裁剪框高度 | Number | -- | 260 |
fixedBox | 截图框固定大小 | Boolean | -- | true |
fileSize | 文件尺寸 | Number | -- | -- |
exampleImg | 示例图片路径 | String | -- | -- |
maxSize | 图片最大值 | String / Number | -- | 200 |
title | 标题 | String | -- | 图片裁剪 |
width | 截图弹窗宽度 | String / Number | -- | 850 |
previewText | 预览文字 | String | -- | 预览 |
exampleText | 示例文字 | String | -- | 示例 |
completeBtnText | 裁剪完成按钮 | String | -- | 裁剪完成 |
cancelBtnText | 取消裁剪按钮 | String | -- | 不裁剪 |
Slots
name | 说明 |
---|---|
footer | 底部内容 |
sizeWarning | 尺寸超出时提示内容 |
Methods
方法名 | 说明 | 参数 | 返回值 :---|:---:|:---|: --- openDialog|打开裁剪弹窗|--| 点击裁剪成功,返回裁剪的文件对象file,点击关闭无返回值
Events
事件名 | 说明 | 回调参数 |
---|---|---|
cropperSuccess | 裁剪成功事件 | (file:File) |
close | 关闭弹窗 | -- |
loading组件
可在main.js中全局引入
import {LmLoading} from 'lm-ui-element'
Vue.use(LmLoading)
Vue.prototype.$lmLoading=LmLoading
页面调用
//显示加载
this.$lmLoading.show()
//改变加载图标颜色,大小
this.$lmLoading.show({color:'#ffffff',size:32})
//关闭加载
this.$lmLoading.hidden()
Slots
name | 说明 |
---|---|
footer | 底部内容 |
sizeWarning | 尺寸超出时提示内容 |
Methods
方法名 | 说明 | 参数 | 返回值 :---|:---:|:---|: --- openDialog|打开裁剪弹窗|--| 点击裁剪成功,返回裁剪的文件对象file,点击关闭无返回值
Events
事件名 | 说明 | 回调参数 |
---|---|---|
cropperSuccess | 裁剪成功事件 | (file:File) |
close | 关闭弹窗 | -- |
公用方法,lm_methods,lm-validate,lm-validate-methods
lm-methods
提供部分公共函数 引用示例:
import {formatDate} from "lm-ui-element/lib/utils/global-methods";
函数名 | 说明 | 参数说明 | 返回值 |
---|---|---|---|
formatDate | 日期格式化,年月日 | 接收两个参数,第一个参数为时间(date:String/Number/Date,connector),第二个参数为日期连接符,默认为'/' | 字符串格式日期 |
formatDateTime | 日期格式化,年月日 时分秒 | 接收两个参数,第一个参数为时间(date:String/Number/Date,connector),第二个参数为日期连接符,默认为'/' | 字符串格式日期 |
noRepeatArrHasObject | 带对象的数组去重 | 接收两个参数,第一个参数为需要去重的目标数组(arr:Array),第二个参数为用于比较的具有唯一值的id属性名(onlyId:String),默认为"id" | 去重后的数组 |
isIEFun | 是否是ie浏览器 | -- | true或false |
isEdgFun | 是否是edg浏览器 | -- | true或false |
compressImageFun | 判断文件类型与压缩图片 | 接收一个对象做参数:{file, width, height, quality = 0.8, maxWidth = 1920, maxHeight = 1080,compressSize=200000,maxSize=9000000},file:File,二进制图片数据;width:Number,图片宽度;height:Number,图片高度;quality:Number,压缩质量,默认0.8,可选值0.1~1;maxWidth:Number,最大宽度,默认1920;maxHeight:Number,最大高度,默认1080;compressSize:Number,图片大于多少开始压缩,单位字节,默认200000字节;maxSize:Number,可接受的最大大小,单位字节,默认9000000字节 | 返回对象:{code:Number,msg:String,data:File}。code=1,成功;code=2成功但压缩后的图片大小大于maxSize;data为二进制文件数据 |
base64ToBlob | 将base64转换为blob | 接收一个参数,base64字符串(base64Str:String) | Blob |
base64ToFile | 将base64转换为file | 接收一个参数,base64字符串(base64Str:String) | File |
toThousands | 金额格式(分隔) | 接收两个参数,第一个参数是数字num:Number,第二个参数是是否带小数isFloat:Boolean,默认true | File |
lm-validate
提供验证函数 引用示例:
import {isvalidPhone} from "lm-ui-element/lib/utils/lm-validate";
函数名 | 说明 | 参数说明 | 返回值 |
---|---|---|---|
isvalidPhone | 验证手机号 | (phone:any) | true或false |
isvalidCardNo | 验证身份证 | (idCard:any) | true或false |
isvalidBankNo | 验证银行卡 | (bankNo:any) | true或false |
isvalidNo | 非数字证验证 | (str:any) | true或false |
isValidDate | 判断日期格式是否正确 | (dateTime:any) | 返回对象,正确时返回{dateTime:Date,isValid:true},错误时返回{isValid:false} |
isNumber | 判断是否为数字,整数或者小数 | (val:any) | true或false |
lm-validate-methods
封装elememt-ui的自定义表单验证方法,rule, value, callback是element-ui自定义验证回调参数 引用用法示例:
import {validPhone} from "lm-ui-element/lib/utils/lm-validate-methods";
data(){
return {
rules:{
mobile: [{required: true, validator:validPhone,trigger: ['blur', 'change']}],
}
}
}
函数名 | 说明 | 参数说明 |
---|---|---|
validPhone | 验证手机号 | (rule, value, callback) |
validIDCard | 验证身份证 | (rule, value, callback,config) ,其中config为配置项,可选配置参数为:maxAge 最大年龄 Number,默认81 ;minAge 最小年龄 Number,默认15 |
validBankNo | 验证银行卡 | (rule, value, callback) |
towPassIsAlike | 两次密码是否一致校验 | (rule, value, callback,confirmPass) ,其中confirmPass为确认密码 |
validAddressInfo | 检查地址是否完善,通常和地址组件lm-address配套使用 | (rule, value, callback,config) ,config为配置对象,可配置参数为:msg 错误信息 String,默认值“请完善地址信息”;isReset 是否是重置表单 Boolean |
validMultiSelect | 多个级联下拉框校验,通常配合lm-select form-type="multiSelect"使用 | (rule, value, callback,length,msg) ,length是下拉框个数 Number,msg是信息 String,默认为“请完善信息” |
validRangeDateTime | 验证时间范围,通常配合lm-date-time form-type="rangeDateTime" 使用, | (rule, value, callback,msg,stopValid) ,其中msg时错误信息 String,默认为“请完善信息”,stopValid为是否停止验证的条件 Boolean |
validateChinese | 中文校验 | (rule, value, callback,config) ,其中config为配置对象,可选参数为:msgs 错误信息,Array,默认值是['请输入'] ; min 字符最小长度 Number ;max 字符最大长度 Number ; required 是否必须 Boolean ,默认值true |
validateAbcAndNumber | 字母数字校验 | (rule, value, callback,config) ,其中config为配置对象,可选参数为:msg 错误信息 String,默认值是"请输入数字或者字母" ; min 字符最小长度 Number ;max 字符最大长度 Number ; required 是否必须 Boolean ,默认值true |
validateCertificateNo | 企业资质编号校验 | (rule, value, callback,config) ,其中config为配置对象,可选参数为:msg 错误信息 String,默认值"企业资质编号为中文开头的13~20位字符串"; required 是否必须 Boolean ,默认值true |
validateLngLat | 经纬度校验 | (rule, value, callback,isLgnOrLat) ,isLgnOrLat用于区分 是经度还是纬度 String,可选值有lng 经度,lat 纬度 |
validateAbcAnd_ | 验证字母和下划线正则 | (rule, value, callback,config) ,其中config为配置对象,可选参数为:msg 错误信息 String,默认值是"请输入字母和下划线组成的字符串" ; required 是否必须 Boolean ,默认值true |
挂在在vue原型链上的方法 $lm
有些函数需要挂载到原型链上,主要方便在dom中使用,当然在生命周期和方法中也可以使用。这部分方法统一挂在到$lm下
函数名 | 说明 | 参数说明 |
---|---|---|
dateRangeDisabled | 日期范围内不可见设置 | 接收三个参数,(time, range, config) ,time是时间组件返回的时间 Date;range是时间范围值,由开始时间和结束时间组成的一个数组 Array,第一个值是开始时间 String/Date/Number,第二个值是结束时间 String/Date/Number;config 配置信息,包含startEqual 开始日期是否可以相等 Boolean,endEqual 结束日期是否可以相等 Boolean |
使用示例: 首先在main.js中添加如下代码
import $lm from 'lm-ui-element/lib/utils/$lm'
Vue.use($lm)
使用
<template>
<el-form width="1000" ref="form" :model="form" label-width="100px">
<el-row>
<lm-date-time label="日期范围:" v-model="form.date" form-type="rangeDateTime" width="46%"
date-time-type="datetime"
:picker-options="[
{
disabledDate:(time)=>$lm.dateRangeDisabled(time,[0,form.date ? form.date[1] : new Date()],{endEqual:true})
},
{
disabledDate:time=> $lm.dateRangeDisabled(time,[form.date ? form.date[0] : 0,new Date()],{endEqual:true,startEqual:true})
}
]"
/>
</el-row>
</el-form>
</template>
<script>
export default {
data(){
return{
form:{},//表单
}
}
}
</script>