personnel_management_mobile/pages/manage/dict.vue

490 lines
13 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<view class="safe-area-inset-bottom">
<rider-curd
v-model="form"
:option="option"
:data="list"
:rules="rules"
:readonly.sync="readonly"
@search="onSearch"
@action-click="onActionClick"
@submit="onSubmit"
@del="onRemove"
ref="crud"
>
<template #form>
<u-form-item label="字典编号" prop="code" :label-width="option.labelWidth || 160" required>
<u-input v-model="form.code" :disabled="readonly" placeholder="字典编号" />
</u-form-item>
<u-form-item label="字典名称" prop="dictValue" :label-width="option.labelWidth || 160" required>
<u-input v-model="form.dictValue" :disabled="readonly" placeholder="字典名称" />
</u-form-item>
<u-form-item label="字典排序" prop="sort" :label-width="option.labelWidth || 160" required>
<u-input v-model="form.sort" :disabled="readonly" type="number" placeholder="字典排序" />
</u-form-item>
<u-form-item label="封存" prop="isSealed" :label-width="option.labelWidth || 160" required>
<u-radio-group v-model="form.isSealed" :disabled="readonly">
<u-radio shape="circle" :name="1" active-color="#4E7FF9">是</u-radio>
<u-radio shape="circle" :name="0" active-color="#4E7FF9">否</u-radio>
</u-radio-group>
</u-form-item>
<u-form-item label="字典备注" :label-width="option.labelWidth || 160" prop="remark">
<u-input
v-model="form.remark"
:disabled="readonly"
type="textarea"
:maxlength="-1"
:height="35"
placeholder="字典备注"
/>
</u-form-item>
</template>
<template #loadmore>
<u-loadmore :status="loadStatus" @loadmore="getList()" />
</template>
</rider-curd>
</view>
<!-- 字典配置 -->
<u-popup v-model="configShow" mode="bottom" height="100vh" @close="onConfigClose" :mask-close-able="false">
<scroll-view scroll-y="true" style="height: 100vh; background: #f5f5f5">
<rider-curd
ref="childCrud"
v-model="childForm"
:navBack="onConfigClose"
@search="onChildSearch"
:option="{ ...configOption, navTitle: `${configName} - 字典配置` }"
:data="childList"
:rules="rules"
:readonly.sync="readonly"
@action-click="onActionClick"
@submit="onSubmit"
@del="onRemove"
>
<template #form>
<u-form-item label="字典编号" prop="code" :label-width="configOption.labelWidth || 160" required>
<u-input v-model="childForm.code" disabled placeholder="字典编号" />
</u-form-item>
<u-form-item label="字典名称" prop="dictValue" :label-width="configOption.labelWidth || 160" required>
<u-input v-model="childForm.dictValue" :disabled="readonly" placeholder="字典名称" />
</u-form-item>
<u-form-item label="上级字典" :label-width="configOption.labelWidth || 160">
<u-input v-model="parentData.dictValue" disabled placeholder="上级字典" />
</u-form-item>
<u-form-item label="字典键值" prop="dictKey" :label-width="configOption.labelWidth || 160" required>
<u-input v-model="childForm.dictKey" :disabled="readonly" placeholder="字典键值" />
</u-form-item>
<u-form-item label="字典排序" prop="sort" :label-width="configOption.labelWidth || 160" required>
<u-input v-model="childForm.sort" :disabled="readonly" type="number" placeholder="字典排序" />
</u-form-item>
<u-form-item label="封存" prop="isSealed" :label-width="configOption.labelWidth || 160" required>
<u-radio-group v-model="childForm.isSealed" :disabled="readonly">
<u-radio shape="circle" :name="1" active-color="#4E7FF9"></u-radio>
<u-radio shape="circle" :name="0" active-color="#4E7FF9"></u-radio>
</u-radio-group>
</u-form-item>
<u-form-item label="字典备注" prop="remark" :label-width="configOption.labelWidth || 160">
<u-input
v-model="childForm.remark"
:disabled="readonly"
type="textarea"
:maxlength="-1"
:height="35"
placeholder="字典备注"
/>
</u-form-item>
</template>
<template #loadmore>
<u-loadmore :status="childLoadStatus" @loadmore="getChild()" />
</template>
</rider-curd>
</scroll-view>
</u-popup>
</view>
</template>
<script>
import riderCurd from '@/components/rider-crud/index'
import { parentList, add, update, remove, dictionary, child, dictTree } from '@/api/system/dict.js'
import { getDicLabel } from '@/components/rider-crud/util/tool.js'
export default {
components: { riderCurd },
data() {
return {
configShow: false, //字典管理弹窗
form: {
isSealed: 0
},
list: [],
params: {
current: 1,
size: 10
},
readonly: false, // 查看时控制表单只读
parentData: {}, // 上级数据信息
childList: [],
childForm: {
isSealed: 0
},
childParams: {
current: 1,
size: 10,
parentId: null
},
loadStatus: 'loadmore', // 列表加载状态
childLoadStatus: 'loadmore', // 列表加载状态
option: {
navTitle: '字典管理', //标题
manageBtn: true, // 右上角管理按钮,默认不显示
searchShow: true, //是否显示搜索,默认不显示
labelWidth: 160, //form表单lable宽度 默认160单位rpx
column: [
{
label: '字典编号',
prop: 'code'
},
{
label: '字典名称',
prop: 'dictValue'
},
{
label: '字典排序',
prop: 'sort'
},
{
label: '封存',
prop: 'sealedName'
},
{
label: '字典备注',
prop: 'remark'
}
],
actions: [
{
name: '编辑', // 操作名称
icon: 'edit-pen', //操作图标,有图标文字不显示
color: '#333', // 字体颜色
fontsize: 30, //字体大小单位rpx
width: 40, // 宽度单位px
background: '#fff' // 菜单按钮背景色
},
{
name: '删除',
icon: 'trash',
color: '#333',
fontsize: 30,
width: 40,
background: '#fff'
},
{
name: '设置',
icon: 'setting',
color: '#333',
fontsize: 30,
width: 40,
background: '#fff'
}
]
},
configName: '',
configOption: {
navBackIcon: 'close', //导航栏左上角icon
manageBtn: true, // 右上角管理按钮,默认不显示
searchShow: true, //是否显示搜索,默认不显示
labelWidth: 160, //form表单lable宽度 默认160单位rpx
column: [
{
label: '字典编号',
prop: 'code'
},
{
label: '字典名称',
prop: 'dictValue'
},
{
label: '字典键值',
prop: 'dictKey'
},
{
label: '字典排序',
prop: 'sort'
},
{
label: '封存',
prop: 'sealedName'
},
{
label: '字典备注',
prop: 'remark'
}
],
actions: [
{
name: '编辑', // 操作名称
icon: 'edit-pen', //操作图标,有图标文字不显示
color: '#333', // 字体颜色
fontsize: 30, //字体大小单位rpx
width: 40, // 宽度单位px
background: '#fff' // 菜单按钮背景色
},
{
name: '删除',
icon: 'trash',
color: '#333',
fontsize: 30,
width: 40,
background: '#fff'
},
{
name: '新增子项',
icon: 'plus',
color: '#333',
fontsize: 30,
width: 40,
background: '#fff'
}
]
},
rules: {
code: [{ required: true, message: '请输入字典编号', trigger: 'blur' }],
dictValue: [{ required: true, message: '请输入字典名称', trigger: 'blur' }],
sort: [{ required: true, message: '请输入字典排序', trigger: 'blur', type: 'number' }],
isSealed: [{ required: true, message: '请选择是否封存', trigger: 'blur', type: 'number' }],
dictKey: [{ required: true, message: '请输入字典键值', trigger: 'blur' }]
}
}
},
onReady() {
this.getList(true)
},
onPullDownRefresh() {
this.getList(true)
this.getChild(true)
},
onReachBottom() {
if (this.loadStatus == 'nomore') return
this.getList()
if (this.childLoadStatus == 'nomore') return
this.getChild()
},
methods: {
// 获取列表
getList(override = false) {
if (override) {
this.params.current = 1
}
const { size } = this.params
parentList(this.params)
.then(res => {
const { records } = res.data
if (records.length < size) this.loadStatus = 'nomore'
else this.loadStatus = 'loadmore'
if (override) {
this.list = records
} else {
this.list = this.list.concat(records)
}
if (this.list && this.list.length > 0) {
this.list.map(e => {
e.sealedName = e.isSealed ? '是' : '否'
})
}
this.params.current++
uni.stopPullDownRefresh()
})
.catch(err => {
uni.stopPullDownRefresh()
})
},
// 获取子类列表
getChild(override = false) {
if (override) {
this.childParams.current = 1
}
const { size } = this.childParams
child(this.childParams)
.then(res => {
const records = res.data
if (records.length < size) this.childLoadStatus = 'nomore'
else this.childLoadStatus = 'loadmore'
if (override) {
this.childList = records
} else {
this.childList = this.childList.concat(records)
}
if (this.childList && this.childList.length > 0) {
this.childList.map(e => {
e.sealedName = e.isSealed ? '是' : '否'
})
}
this.childParams.current++
uni.stopPullDownRefresh()
})
.catch(err => {
uni.stopPullDownRefresh()
})
},
// 左滑按钮点击
onActionClick({ index, data, action, done }) {
const { name } = action
switch (name) {
case '新增':
if (this.parentData.code) {
this.$set(this.childForm, 'code', this.parentData.code)
this.$set(this.childForm, 'parentId', this.parentData.id)
this.$set(this.childParams, 'parentId', this.parentData.id)
}
done()
break
case '删除':
this.onRemove(data.id)
break
case '查看':
this.readonly = true
case '编辑':
if (data.id) done()
break
case '设置':
this.childForm = {}
this.parentData = data
this.configName = data.dictValue
this.$set(this.childParams, 'parentId', data.id)
this.getChild(true)
setTimeout(() => {
this.configShow = true
}, 100)
break
case '新增子项':
this.childForm = {}
this.parentData = data
this.$set(this.childForm, 'code', data.code)
this.$set(this.childForm, 'parentId', data.id)
this.$set(this.childParams, 'parentId', data.id)
done()
break
}
if (['删除', '编辑', '新增子项'].includes(name)) {
this.$refs['crud'].hideChildren()
this.$refs['childCrud'].hideChildren()
}
},
// 删除
onRemove(id) {
uni.showModal({
title: '确定要删除吗?',
success: action => {
if (action.confirm) {
remove(id).then(() => {
uni.showToast({
title: '删除成功',
icon: 'none'
})
setTimeout(() => {
this.$refs['crud'].allCheckHide(false)
}, 100)
// #ifdef APP
this.getList(true)
// #endif
// #ifndef APP
uni.startPullDownRefresh({})
// #endif
})
}
}
})
},
// 表单提交
onSubmit(form, action, unloading, done) {
if (action == '新增' || action == '新增子项') {
add(form)
.then(res => {
uni.showToast({
title: '新增成功',
icon: 'none'
})
done()
uni.startPullDownRefresh({})
})
.catch(() => {
unloading()
})
} else if (action == '编辑') {
update(form)
.then(res => {
uni.showToast({
title: '编辑成功',
icon: 'none'
})
done()
uni.startPullDownRefresh({})
})
.catch(() => {
unloading()
})
}
},
//字典配置关闭
onConfigClose() {
this.configShow = false
this.childParams = {
current: 1,
size: 10,
parentId: null
}
this.parentData = {}
this.form = { isSealed: 0 }
this.childForm = { isSealed: 0 }
setTimeout(() => {
this.getChild(true)
})
},
// 搜索 (自行配置搜索内容)
onSearch(val) {
this.params = {
current: 1,
size: 10,
dictValue: val
}
this.getList(true)
},
// 子级搜索
onChildSearch(val) {
this.childForm = {
current: 1,
size: 10,
dictValue: val
}
this.getChild(true)
}
}
}
</script>
<style>
page {
background: #f6f6f6;
}
</style>
<style lang="scss" scoped>
.nav-right {
color: #fff;
font-size: 28rpx;
font-weight: normal;
padding-right: 24rpx;
}
.config-title {
padding: 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 20rpx solid #f5f5f5;
color: #fff;
background: linear-gradient(45deg, #4e7ff9 0%, #59a5fb 100%);
}
</style>