npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

lm-ui-element

v0.7.7

Published

首先创建项目,使用vue-cli3创建项目 ````javascript vue create lm-ui-element-test ```` 创建好后,进入项目文件夹lm-ui-element-test,先安装element-ui,然后安装lm-ui-element

Downloads

58

Readme

#龙马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-inputlm-selectlm-date-timelm-cascader 组件 表单组件必须包含在 element-uiel-form 组件和 el-row 组件中,请确保引入了element-uiElFrom、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-uiel-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-uiElButton 组件

基础用法

<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-uiElFrom、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>