# 公共组件
# 1、sh-echart 图表
<sh-echart :data="data"></sh-echart>
具体使用同 pc 端组件
# 2、sh-list 列表
包含请求接口、下拉刷新、拉上请求更多数据。
/**
* :api 接口
* :param 请求参数
* :minHeight 列表最小高度,默认:80vh
* :immediate 加载时默认请求接口,默认:true
* :page 当期页,默认:1
* :limit 每页条数,默认:10
*/
<sh-list :api="listApi" :param="form" ref="list">
<div slot-scope="scope"></div>
</sh-list>
// 重载列表
this.$refs.list.loadList()
用法示例:
<sh-list :api="listApi" :param="form" ref="list">
<div slot-scope="scope">
<div class="link">
<p class="type">
<span>开始时间:{{ scope.item.egressStartTime }}</span>
</p>
<p class="type">
<span>结束时间:{{ scope.item.egressStartTime }}</span>
</p>
<p class="type">
<span>时长(小时):{{ $dayjs(scope.item.egressEndTime).diff(scope.item.egressStartTime,'minute') / 60 }}</span>
</p>
</div>
</div>
</sh-list>
后端数据格式和pc端分页保持一致:
入参:
{
page: 1,
limit: 10
}
出参:
{
code: 0,
count: 2,
data: [
{id: "9a97ad53dd254e27aa33e5265a2cb421", createTime: "2021-04-19 08:31:50"},
{id: "9a97ad53dd254e27aa33e5265a2cb422", createTime: "2021-04-19 08:31:50"},
],
msg: "成功"
}
# 3、sh-select 下拉框
默认使用:
<sh-select label="项目" v-model="value" :columns="columns"></sh-select>
参数:
/**
* :label 左侧文本
* v-model value值
* :columns 数组数据,如:[{label: '账号', value: '3h100'}]
* :option 显示的键值,默认:{label: 'label', value: 'value'}
* @change 改变时触发方法,return 选中项
*/
例如:
<sh-select label="项目" v-model="id" :columns="projectList" :option="{label: 'name', value: 'id'}"></sh-select>
// data数据
projectList: [
{id: 'SGXK13213465', name: '三和项目'},
{id: '914512006750', name: '一洲项目'}
]
# 4、sh-loading 加载
使用:
<template>
<sh-loading :loading="loading"></sh-loading>
</template>
参数:
/**
* @param loading {Boolean} 是否显示加载
* @param text {String} 加载文案,默认:正在加载...
* @param size {String} 加载图标大小,默认:40px
*/
# 5、sh-field 输入框
基于 van-field 封装
使用:
<template>
<sh-field rules="required" placeholder="请输入目的地" label="目的地" v-model="form.endPoint"></sh-field>
</template>
参数:
/**
* @param rules {String|Array} 校验规则,type 为 string,可传入为:rules="required",type 为 Array,参考 van-field 的 Rule 数据结构
* @param label {String} 输入框左侧文本
* @param input-align {String} 输入框对齐方式,可选值为 center left,默认 right
*/
# 6、sh-checkbox 复选框组
使用:
<template>
<sh-checkbox :label="label" :columns="columns" rules="required" v-model="form.epidemicHistory" ></sh-checkbox>
</template>
参数:
/**
* @param label {String} 输入框左侧文本
* @param columns {Array} 选项
* @param v-model {String} 选中的值,以逗号隔开
* @param disabled {Boolean} 是否禁用复选框,默认false
* @param rules {String|Array} 校验规则,type 为 string,可传入为:rules="required",type 为 Array,参考 van-field 的 Rule 数据结构
*/
# 7、sh-city-cascader 省市区街道级联
使用:
<template>
<sh-city-cascader :label="label" :level="4" rules="required" v-model="form.workCity" :value2.sync="form.workCityIds"></sh-city-cascader>
</template>
参数:
/**
* @param label {String} 输入框左侧文本
* @param level {Number} 级别,1、2、3、4 对应 省、市、区、街道
* @param v-model {String} 名称,以逗号隔开
* @param value2.sync {String} id,以逗号隔开
* @param isLink {Boolean} 是否展示右侧箭头并开启点击反馈,默认true
* @param disabled {Boolean} 是否禁用,默认false
* @param rules {String|Array} 校验规则,type 为 string,可传入为:rules="required",type 为 Array,参考 van-field 的 Rule 数据结构
*/
# 8、sh-date 日历
使用:
<template>
<sh-date :label="label" v-model="date"></sh-date>
</template>
参数:
/**
* @param label {String} 输入框左侧文本
* @param v-model {String} 当前选中的时间
* @param disabled {Boolean} 是否禁用,默认false
* @param rules {String|Array} 校验规则,type 为 string,可传入为:rules="required",type 为 Array,参考 van-field 的 Rule 数据结构
*/
# 9、sh-date-time 时间选择
使用:
<template>
<sh-date-time :label="label" v-model="form.birthday"></sh-date-time>
</template>
参数:
/**
* @param label {String} 输入框左侧文本
* @param v-model {String} 当前选中的时间
* @param type {String} 时间类型,可选值为 date time year-month month-day datehour,默认datetime
* @param disabled {Boolean} 是否禁用,默认false
* @param rules {String|Array} 校验规则,type 为 string,可传入为:rules="required",type 为 Array,参考 van-field 的 Rule 数据结构
*/
# 10、sh-select-time 时间选择器(间隔 30min)
使用:
<template>
<sh-select-time :show.sync="timeShow" @confirm="onConfirmTime"></sh-select-time>
</template>
参数:
/**
* @param show.sync {Boolean} 是否展示时间选择器
* @confirm 点击完成按钮时触发的事件,value: 当前选中的时间
*/
# 11、sh-form 表单
将表单组件组合使用
使用示例:
<template>
<sh-form ref="form">
<sh-field placeholder="正则校验" label="文本" v-model="form.text" :rules="['required',{ pattern, message: '文本必须不少于6位' }]"></sh-field>
<sh-field placeholder="请输入目的地" rules="required" label="目的地" v-model="form.endPoint"></sh-field>
<sh-field type='textarea' placeholder='用车线路说明' rules="required" label="用车线路说明" v-model="form.routeDescription"></sh-field>
<sh-checkbox rules="required" label="是否有以下情况" v-model="form.epidemicHistory" :columns="epidemicHistory"></sh-checkbox>
<sh-date label="返程日期" rules="required" :minDate="minBackDate" v-model="form.backDate"></sh-date>
<sh-date-time rules="required" label="出生日期" v-model="form.birthDay"></sh-date-time>
<sh-field rules="required" label="单选框">
<template #input>
<van-radio-group v-model="form.radio" direction="horizontal">
<van-radio name="1">单选框 1</van-radio>
<van-radio name="2">单选框 2</van-radio>
</van-radio-group>
</template>
</sh-field>
<sh-field readonly :value="form.startTime" clickable rules="required" label="开始时间" @click="timeShow = true" />
<sh-select-time :show.sync="timeShow" @confirm="onConfirmTime"></sh-select-time>
<div style="margin: 16px;">
<van-button round block type="info" @click="submit">提交</van-button>
</div>
</sh-form>
</template>
<script>
export default {
data() {
return {
form: {
text:'',
endPoint:'',
routeDescription:'',
epidemicHistory:'',
epidemicHistory: '',
startTime: '',
backDate: '',
birthDay: '',
radio:null
},
pattern: /\d{6}/,
minBackDate: new Date(2020, 7, 1),
epidemicHistory: [
{ value: '0', label: '来自中高风险地区' },
{ value: '1', label: '1周内到过中高风险地区' },
{ value: '2', label: '2周内接触中高风险地区人' },
{ value: '3', label: '2周内居住或到过中高风险地区' },
{ value: '4', label: '2周内家人或朋友有类似症状' },
{ value: '5', label: '2周内家人或朋友到过中高风险地区' },
{ value: '6', label: '周围1公里有新增确诊' }
],
timeShow: false
}
},
methods: {
onConfirmTime(date) {
this.form.startTime = date
},
submit() {
this.$refs.form.validate(valid => {
if (!valid) {
console.log(this.form)
this.$toast('提交成功!')
}
})
}
}
}
</script>
校验方法:
this.$refs.form.validate(valid => {
if (!valid) {
...
}
})
# 12、sh-select-field 下拉搜索
使用:
<template>
<sh-select-field :form="form" :option="option" :width="width" @loadList="loadList"></sh-select-field>
</template>
参数:
/**
* @param form {Object} 属性与option标识符一致
* @param option {String} 选项数组,text表示文字,value表示标识符。
* @param width {String} 选中项显示的宽度,默认:100px
* @loadList 加载方法
*/
# 13、sh-select-search 选择搜索
使用:
<template>
<sh-select-search :option="option" :form="form" border searchLabel="searchValue" @loadList="loadList">
</sh-select-search>
</template>
<script>
export default {
data() {
return {
form: {
selectkey1: 0, // 下拉选择搜索,
selectkey2: 'a',
searchValue: '搜索值'// 输入框搜索字段
},
option: { // key为下拉框绑定字段,value(Array)为van-dropdown-menu option
selectkey1: [
{ text: '默认排序', value: 0 },
{ text: '按紧急程度', value: 1 },
{ text: '按最近创建时间', value: 2 },
{ text: '按最早截止时间', value: 3 }]
// selectkey2: [
// { text: '默认排序', value: 'a' },
// { text: '好评排序', value: 'b' },
// { text: '销量排序', value: 'c' }]
}
}
},
methods: {
loadList() {
// 发送请求
console.log('form', this.form, '')
}
}
}
</script>
参数:
/**
* @param option {Object} 搜索框配置项,key为下拉框所要绑定字段,value(Array)为van-dropdown-menu 的 option
* @param form {Object} 组件绑定字段项,请与searchLabel及option的key值对应,可设置默认值
* @param border {Boolean} 是否显示下边框,默认false
* @param searchLabel {String} 输入框搜索绑定字段,为必填项
* @param placeholder {String} 输入框占位提示文字
* @param defaultLoad {Boolean} 是否默认首次加载,默认是
* @loadList {funtcion} 重载列表方法
*/
# 14、sh-org-person 选择人员
使用:
<template>
<div>
<van-cell-group>
<van-field v-model="name" label="单选" placeholder="选择人员" readonly @click="show = true"/>
<van-field v-model="names" label="多选" placeholder="选择人员" readonly @click="shows = true"/>
</van-cell-group>
<sh-org-person :show.sync="show" @getPerson="getPerson"></sh-org-person>
<sh-org-person :show.sync="shows" @getPerson="getPersons" :checkbox="true" :data="defaultData"></sh-org-person>
</div>
</template>
参数:
/**
* @param show.sync {Boolean} 是否展示人员选择器
* @param isActiveObj {Object} 人员回显
* @param checkbox {Boolean} 是否多选,默认false,单选
* @getPerson 选中触发的事件
*/
# 15、sh-view-image 图片预览
使用:
<sh-view-image :src='src'></sh-view-image>
参数:
/**
* @param src {String} 图片链接
* @param closeable {Boolean} 是否显示关闭图标,默认true
* @param width {Number | String} 缩略图宽度,默认单位为px
* @param height {Number | String} 缩略图高度,默认单位为px
* /
插槽:
| 名称 | 说明 | 参数 |
|---|---|---|
| default | 自定义显示内容,默认为图片 | - |
# 16、sh-tree 树形控件
基于 liquor-tree 封装,如此组件不能满足您的需求,请参考文档 (opens new window)自行定制
使用
<template>
<sh-tree ref="tree" checkbox :api='api' v-model="shows" :default-checked-keys='defaultData' @onSubmit='onSubmit'>
</sh-tree>
</template>
参数:
/**
* @param v-model {Boolean} 是否显示弹出层,默认false
* @param api {String} 接口
* @param param {Object} 接口请求参数
* @param data {Array} 展示数据
* @param checkbox {Boolean} 是否多选,默认 false
* @param defaultExpandAll {Boolean} 是否默认展开所有节点,默认 false
* @param defaultExpandedFirstLevel {Boolean} 当数据length为 1,即树状结构存在唯一顶级时,是否展开第一级,默认 true
* @param autoCheckChildren {Boolean} 在显示复选框的情况下,是否严格的遵循父子互相关联的做法,默认true
* @param props {Object} 树形控件的结构配置,默认为: {children: 'children',text: 'text'}
* @param nodeIndent {Number} 缩进,默认 8
* @param defaultCheckedKeys {Array} 默认选中节点的 主键 的数组
* @param defaultExpandedKeys {Array} 默认展开的节点的 主键 的数组
* @onSubmit {Function} 点击确定后的回调处理,checkbox 为 true 时返回选中节点的数组,单选模式时返回对应选中的节点(Object)
*/
使用:
组件提供两种数据展示方式
- 1、data 传入
- 2、api 接口传入(post请求),可通过 param 传入请求参数
重新定义默认树的结构
例如,你有数据:
[
{ 'SOME-AWESOME-PROPERTY-FOR-TEXT': 'Item 1' },
{ 'SOME-AWESOME-PROPERTY-FOR-TEXT': 'Item 2' },
{ 'SOME-AWESOME-PROPERTY-FOR-TEXT': 'Item 3', 'kids': [
{ 'SOME-AWESOME-PROPERTY-FOR-TEXT': 'Item 3.1' },
{ 'SOME-AWESOME-PROPERTY-FOR-TEXT': 'Item 3.2' }
]}
]
你只需要在组件中添加 props 选项:
{
'children': 'kids',
'text': 'SOME-AWESOME-PROPERTY-FOR-TEXT'
}
自定义树节点的内容
提供插槽用于自定义树节点的内容
如:
<sh-tree ref="tree" :api='api' v-model="shows1" @onSubmit='onSubmit1'>
<template slot-scope="{node}">
<span class="tree-text">
<template v-if="!node.hasChildren()">
<van-icon name="user-o" size="18" class="icon" />
{{ node.text }}
</template>
<template v-else>
{{ node.text }}
</template>
</span>
</template>
</sh-tree>
具体使用示例:
<template>
<div>
<!-- 多选 -->
<sh-field readonly label='人员(多选)' @click="()=>shows = true" :value='select' placeholder="请选择" is-link />
<sh-tree class="tree" ref="tree" checkbox :api='api' v-model="shows" :default-checked-keys='defaultData' @onSubmit='onSubmit'>
<template slot-scope="{node}">
<span class="tree-text">
<template v-if="!node.hasChildren()">
<van-icon name="user-o" size="18" class="icon" />
{{ node.text }}
</template>
<template v-else>
{{ node.text }}
</template>
</span>
</template>
</sh-tree>
<!-- 单选 -->
<sh-field readonly label='人员(单选)' @click="()=>shows1 = true" :value='select1' placeholder="请选择" is-link></sh-field>
<sh-tree ref="tree" :api='api' v-model="shows1" @onSubmit='onSubmit1'></sh-tree>
<!-- 自定义数据及结构 -->
<sh-field readonly label='自定义' @click="()=>shows2 = true" :value='select2' placeholder="请选择" is-link></sh-field>
<sh-tree ref="tree" checkbox :data='data' :props="{children:'children',text: 'label'}" :defaultExpandedKeys="[1,4]" :defaultCheckedKeys="[10]" v-model="shows2" @onSubmit='onSubmit2' :autoCheckChildren='false'>
</sh-tree>
</div>
</template>
<script>
import { PERSON_TREES } from '@/apis/admin'
export default {
data() {
return {
shows: false,
shows1: false,
shows2: false,
api: PERSON_TREES,
select: '测试,王五',
select1: '',
select2: '三级 1-1-2',
data: [{
id: 1,
label: '一级 1',
children: [{
id: 4,
label: '二级 1-1',
children: [{
id: 9,
label: '三级 1-1-1'
}, {
id: 10,
label: '三级 1-1-2'
}]
}]
}, {
id: 2,
label: '一级 2',
children: [{
id: 5,
label: '二级 2-1'
}, {
id: 6,
label: '二级 2-2'
}]
}, {
id: 3,
label: '一级 3',
children: [{
id: 7,
label: '二级 3-1'
}, {
id: 8,
label: '二级 3-2'
}]
}],
defaultData: ['c4a30f6e0cfa4d1b8a0e6f8e75569514', 'a71c513875b54ad28cbc958311ab99ce']
}
},
methods: {
onSubmit(data) {
console.log(data)
this.select = data.map(c => c.text).join(',')
this.shows = false
},
onSubmit1(data) {
console.log(data)
this.select1 = data.text
this.shows1 = false
},
onSubmit2(data) {
console.log(data)
this.select2 = data.map(c => c.text).join(',')
this.shows2 = false
}
}
}
</script>
<style lang="scss" scoped>
.tree-text {
display: flex;
align-items: center;
.icon {
margin-right: 5px;
}
}
</style>
# 17、sh-signature-pad 数字签名
基于 signature_pad 封装
使用:
<sh-signature-pad :visible.sync='visible' @cancel="cancel" fileName='signature' @confirm="confirm" :api='api' :url='signUrl'></sh-signature-pad>
参数:
/**
* @param :visible.sync {Boolean} 是否显示弹出层,默认false
* @param {String} fileName 文件名
* @param api {String} 接口 (post请求/Content-Type: multipart/form-data)
* @param params {Object} 接口请求参数
* @param url {String} 签名图片链接
* @param {Function} @confirm 点击确定的回调,返回签名图片的信息
* @param {Function} @cancel 点击取消的回调
* @param {Object} options 签名属性配置项,默认 {
penColor: '#000000', // 笔刷颜色
minWidth: 0.5, // 最小宽度
maxWidth: 6,
backgroundColor: '#f2f2f2'
}
*/
# 18、sh-pdf-popup pdf预览
基于 pdfh5 封装,提供 h5 pdf预览手势缩放,懒加载
使用:
<sh-field label='pdf预览' is-link readonly @click="()=>show=true"></sh-field>
<sh-pdf-popup v-model="show" :api='api' :params='params' :lazy='false' @complete='complete'></sh-pdf-popup>
组件提供两种 pdf 展示方式
- 1、url 传入 pdf 地址
- 2、api 接口传入(get请求),可通过 param 传入请求参数
参数:
/**
* @param v-model {Boolean} 是否显示弹出层,默认false
* @param api {String} 接口
* @param params {Object} 接口请求参数
* @param url {Object} pdf地址
* @param lazy {Boolean} 是否懒加载,默认false
* @param complete {Function} pdf加载完成事件,加载失败、渲染成功都会触发。status有两种状态success和error,依次返回状态、信息、耗时、pdf页数 (status, msg, time, totalNum)
*/
# 19、sh-svg-icon svg图标
用法同网页端 sh-svg-icon