设备类型维护页面,表单开发中添加设备类型下拉框

This commit is contained in:
shih
2026-04-01 10:44:59 +08:00
parent 213811c84d
commit abba12dd82
16 changed files with 852 additions and 21 deletions

View File

@@ -0,0 +1,198 @@
<template>
<ContentWrap>
<avue-crud
ref="crudRef"
v-model="tableForm"
v-model:search="tableSearch"
:table-loading="loading"
:data="tableData"
:option="tableOption"
:permission="permission"
:before-open="beforeOpen"
@search-change="searchChange"
@search-reset="resetChange"
@row-save="rowSave"
@row-update="rowUpdate"
@row-del="rowDel"
@refresh-change="getTableData"
>
<!-- 表单 -->
<template #parentId-form>
<el-tree-select
v-model="tableForm.parentId"
:data="sblxTree"
:props="{ children: 'children', label: 'industryName', value: 'id' }"
check-strictly
default-expand-all
placeholder="请选择上级设备类型"
value-key="id"
style="width: 366px"
/>
</template>
<!-- 自定义按钮 -->
<template #menu-left="{ size }">
<el-button
plain
:size="size"
@click="defaultExpandAllShow = !defaultExpandAllShow"
type="danger"
icon="el-icon-sort"
>展开/折叠</el-button
>
</template>
</avue-crud>
</ContentWrap>
</template>
<script lang="ts" setup>
import { defaultProps, handleTree } from '@/utils/tree'
import * as SblxApi from '@/api/system/sblx'
defineOptions({ name: 'SystemSblx' })
const crudRef = ref()
useCrudHeight(crudRef)
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const { getCurrPermi } = useCrudPermi()
const loading = ref(true) // 列表的加载中
const defaultExpandAllShow = ref(true) // 默认展开所有表项
const tableOption = reactive({
align: 'center',
headerAlign: 'center',
searchMenuSpan: 6,
searchMenuPosition: 'left',
labelSuffix: ' ',
span: 24,
rowKey: 'id',
rowParentKey: 'parentId',
defaultExpandAll: defaultExpandAllShow,
dialogWidth: '50%',
column: {
parentId: {
label: '上级设备类型',
hide: true,
minWidth: 100,
rules: [{ required: true, message: '上级设备类型不能为空', trigger: 'blur' }]
},
industryName: {
label: '设备类型名称',
align: 'left',
headerAlign: 'left',
search: true,
minWidth: 100,
rules: [{ required: true, message: '设备类型名称不能为空', trigger: 'blur' }]
},
industryCode: {
label: '设备类型编码',
minWidth: 100,
rules: [{ required: true, message: '设备类型编码不能为空', trigger: 'blur' }]
},
sort: {
label: '显示顺序',
width: 80,
span: 12,
type: 'number',
rules: [{ required: true, message: '显示顺序不能为空', trigger: 'blur' }]
}
}
}) //表格配置
const tableForm = ref<any>({})
const tableData = ref()
const tableSearch = ref({})
const sblxTree = ref() // 上级设备类型
const permission = getCurrPermi(['system:sblx'])
/** 查询列表 */
const getTableData = async () => {
loading.value = true
let searchObj = {
...tableSearch.value
}
for (let key in searchObj) if (searchObj[key] === '') delete searchObj[key]
try {
const data = await SblxApi.getSblxPage(searchObj)
tableData.value = handleTree(data)
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const searchChange = (params, done) => {
getTableData().finally(() => {
done()
})
}
/** 清空按钮操作 */
const resetChange = () => {
searchChange({}, () => {})
}
/** 表单打开前 */
const beforeOpen = async (done, type) => {
await getTree()
const id = tableForm.value.id
if (['edit', 'view'].includes(type) && id) {
tableForm.value = await SblxApi.getSblx(id)
}
done()
}
/** 新增操作 */
const rowSave = async (form, done, loading) => {
let bool = await SblxApi.createSblx(form).catch(() => false)
if (bool) {
message.success(t('common.createSuccess'))
resetChange()
done()
} else loading()
}
/** 编辑操作 */
const rowUpdate = async (form, index, done, loading) => {
let bool = await SblxApi.updateSblx(form).catch(() => false)
if (bool) {
message.success(t('common.updateSuccess'))
getTableData()
done()
} else loading()
}
/** 删除按钮操作 */
const rowDel = async (form, index) => {
try {
// 删除的二次确认
await message.delConfirm()
// 发起删除
await SblxApi.deleteSblx(form.id)
message.success(t('common.delSuccess'))
// 刷新列表
await getTableData()
} catch {}
}
/** 获得设备类型树 */
const getTree = async () => {
sblxTree.value = []
const data = await SblxApi.getSimpleSblxList()
let sblx: SblxTree = { id: 0, industryName: '顶级设备类型', children: [] }
sblx.children = handleTree(data, 'id', 'parentId')
sblxTree.value.push(sblx)
}
watch(
() => defaultExpandAllShow.value,
() => {
crudRef.value?.refreshTable()
}
)
/** 初始化 **/
onMounted(async () => {
await getTableData()
})
</script>