更新完善字典相关功能

This commit is contained in:
2026-02-18 17:15:33 +08:00
parent 5450777bd7
commit 378b9bd71f
23 changed files with 1657 additions and 572 deletions
@@ -70,6 +70,7 @@
:pagination="false"
:row-key="rowKey"
:row-selection="rowSelection"
:default-expand-all="true"
@refresh="refreshTable"
@select="handleSelectChange"
@selectAll="handleSelectAll"
@@ -15,7 +15,7 @@
<a-input-number v-model:value="form.sort" :min="0" :step="1" style="width: 100%" placeholder="请输入排序" />
</a-form-item>
<a-form-item label="状态" name="status">
<a-switch v-model:checked="statusChecked" checked-children="启用" un-checked-children="禁用" />
<sc-select v-model:value="form.status" source-type="dictionary" dictionary-code="role_status" placeholder="请选择状态" allow-clear />
</a-form-item>
</a-form>
<template #footer>
@@ -30,6 +30,7 @@
<script setup>
import { ref, reactive, computed } from 'vue'
import { message } from 'ant-design-vue'
import scSelect from '@/components/scSelect/index.vue'
import authApi from '@/api/auth'
const emit = defineEmits(['success', 'closed'])
@@ -50,15 +51,7 @@ const form = reactive({
code: '',
description: '',
sort: 1,
status: 1
})
// 状态开关计算属性
const statusChecked = computed({
get: () => form.status === 1,
set: (val) => {
form.status = val ? 1 : 0
}
status: null
})
// 表单引用
@@ -132,7 +125,7 @@ const setData = (data) => {
form.code = data.code
form.description = data.description || ''
form.sort = data.sort
form.status = data.status !== undefined ? data.status : 1
form.status = data.status !== undefined ? data.status : null
}
// 暴露方法给父组件
@@ -38,8 +38,11 @@
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="性别" name="gender">
<sc-select v-model:value="form.gender" source-type="dictionary" dictionary-code="gender" placeholder="请选择性别" allow-clear />
</a-form-item>
<a-form-item label="状态" name="status">
<a-switch v-model:checked="statusChecked" checked-children="启用" un-checked-children="禁用" />
<sc-select v-model:value="form.status" source-type="dictionary" dictionary-code="user_status" placeholder="请选择状态" allow-clear />
</a-form-item>
</a-form>
<template #footer>
@@ -53,6 +56,7 @@
import { ref, reactive, computed } from 'vue'
import { message } from 'ant-design-vue'
import scUpload from '@/components/scUpload/index.vue'
import scSelect from '@/components/scSelect/index.vue'
import authApi from '@/api/auth'
const emit = defineEmits(['success', 'closed'])
@@ -76,15 +80,8 @@ const form = reactive({
phone: '',
department_id: null,
role_ids: [],
status: 1
})
// 状态开关计算属性
const statusChecked = computed({
get: () => form.status === 1,
set: (val) => {
form.status = val ? 1 : 0
}
gender: null,
status: null
})
// 表单引用
@@ -204,6 +201,7 @@ const submit = async () => {
phone: form.phone,
department_id: form.department_id,
role_ids: form.role_ids,
gender: form.gender,
status: form.status
}
@@ -242,7 +240,8 @@ const setData = (data) => {
form.phone = data.phone
form.department_id = data.department_id
form.role_ids = data.roles ? data.roles.map(item => item.id) : []
form.status = data.status !== undefined ? data.status : 1
form.gender = data.gender !== undefined ? data.gender : null
form.status = data.status !== undefined ? data.status : null
}
// 组件挂载时加载数据
+34 -3
View File
@@ -9,13 +9,14 @@
</a-input>
</div>
<div class="body">
<a-tree v-model:selectedKeys="selectedDeptKeys" :tree-data="filteredDepartmentTree"
:field-names="{ title: 'name', key: 'id', children: 'children' }" show-line default-expand-all @select="onDeptSelect">
<a-tree v-if="filteredDepartmentTree.length > 0" v-model:selectedKeys="selectedDeptKeys" v-model:expandedKeys="expandedDeptKeys" :tree-data="filteredDepartmentTree"
:field-names="{ title: 'name', key: 'id', children: 'children' }" show-line @select="onDeptSelect">
<template #icon="{ dataRef }">
<ApartmentOutlined v-if="dataRef.children && dataRef.children.length > 0" />
<UserOutlined v-else />
</template>
</a-tree>
<a-empty v-else description="暂无部门数据" />
</div>
</div>
<div class="right-box">
@@ -144,7 +145,7 @@
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ref, reactive, onMounted, watch } from 'vue'
import { message, Modal } from 'ant-design-vue'
import {
SearchOutlined,
@@ -225,10 +226,40 @@ const departmentTree = ref([])
const filteredDepartmentTree = ref([])
const selectedDeptKeys = ref([])
const departmentKeyword = ref('')
const expandedDeptKeys = ref([])
// 行key
const rowKey = 'id'
// 递归获取所有部门节点的key
const getAllDepartmentKeys = (nodes) => {
const keys = []
const traverse = (list) => {
list.forEach(node => {
// 如果节点有children且不为空,则该节点需要展开
if (node.children && node.children.length > 0) {
keys.push(node.id)
traverse(node.children)
}
})
}
traverse(nodes)
return keys
}
// 监听部门树数据变化,自动展开所有节点
watch(
() => filteredDepartmentTree.value,
(newData) => {
if (newData && newData.length > 0) {
expandedDeptKeys.value = getAllDepartmentKeys(newData)
} else {
expandedDeptKeys.value = []
}
},
{ immediate: true, deep: true }
)
// 表格列配置
const columns = [
{ title: '头像', dataIndex: 'avatar', key: 'avatar', width: 80, align: 'center', slot: 'avatar' },