From 8c5859bad5f8a936e4d296f6c2f19fccff41d45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Tue, 11 Nov 2025 18:03:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AD=97=E5=85=B8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc/docs/dictionary-usage.md | 549 +----------------- pc/docs/pinia-dict-guide.md | 374 ++++++++++++ pc/src/assets/less/style.less | 2 +- pc/src/stores/dict.js | 179 ++++++ .../views/system/tenant/components/audit.vue | 47 +- .../views/system/tenant/components/detail.vue | 81 ++- .../views/system/tenant/components/edit.vue | 45 +- pc/src/views/system/tenant/index.vue | 76 ++- .../system/users/components/UserEdit.vue | 165 ++---- .../system/users/components/UserList.vue | 41 +- pc/src/views/system/users/index.vue | 109 +--- server/sql/init_dict_data.sql | 39 ++ 12 files changed, 880 insertions(+), 827 deletions(-) create mode 100644 pc/docs/pinia-dict-guide.md create mode 100644 pc/src/stores/dict.js create mode 100644 server/sql/init_dict_data.sql diff --git a/pc/docs/dictionary-usage.md b/pc/docs/dictionary-usage.md index f028f78..f72f7ef 100644 --- a/pc/docs/dictionary-usage.md +++ b/pc/docs/dictionary-usage.md @@ -1,548 +1 @@ -# 字典系统使用指南 - -## 概述 - -字典(Dictionary)系统是一个用于管理应用中常用的枚举值和标签化数据的功能。通过字典系统,你可以在后台统一管理这些数据,而无需修改代码和重新编译部署。 - -### 字典的核心概念 - -- **字典类型(Dict Type)**:用来分类管理字典项,例如 `user_status`(用户状态)、`gender`(性别)等 -- **字典编码(Dict Code)**:字典类型的唯一标识,用于前端查询,例如 `user_status`、`gender` -- **字典项(Dict Item)**:具体的字典值和标签,包括: - - `dict_value`:存储在数据库中的实际值(例如 `1`、`0`) - - `dict_label`:显示给用户的标签文本(例如 "启用"、"禁用") - -### 数据库表结构 - -```sql --- 字典类型表 -CREATE TABLE sys_dict_type ( - id BIGINT, - dict_code VARCHAR(50) -- 字典编码(唯一) - dict_name VARCHAR(100) -- 字典名称 - status TINYINT -- 是否启用 - ... -) - --- 字典项表 -CREATE TABLE sys_dict_item ( - id BIGINT, - dict_type_id BIGINT -- 关联的字典类型ID - dict_label VARCHAR(100) -- 显示标签(如 "启用") - dict_value VARCHAR(100) -- 存储值(如 "1") - status TINYINT -- 是否启用 - ... -) -``` - ---- - -## 后端 API 接口 - -### 1. 获取字典项(最常用) - -**根据字典编码获取字典项列表:** - -```http -GET /api/dict/items/code/:code?include_disabled=0 -``` - -**请求示例:** -```bash -curl -X GET "http://localhost:8080/api/dict/items/code/user_status?include_disabled=0" -``` - -**响应示例:** -```json -{ - "code": 0, - "message": "success", - "data": [ - { - "id": 1, - "dict_type_id": 101, - "dict_label": "启用", - "dict_value": "1", - "status": 1, - "sort": 1, - ... - }, - { - "id": 2, - "dict_type_id": 101, - "dict_label": "禁用", - "dict_value": "0", - "status": 1, - "sort": 2, - ... - } - ] -} -``` - -**参数说明:** -- `code` (string, 必需):字典编码,例如 `user_status` -- `include_disabled` (int, 可选):是否包含禁用项,0 = 不包含(默认),1 = 包含 - ---- - -### 2. 字典管理接口 - -#### 获取字典类型列表 -```http -GET /api/dict/types?parentId=&status= -``` - -#### 添加字典类型 -```http -POST /api/dict/types -{ - "dict_code": "user_status", - "dict_name": "用户状态", - "status": 1 -} -``` - -#### 添加字典项 -```http -POST /api/dict/items -{ - "dict_type_id": 101, - "dict_label": "启用", - "dict_value": "1", - "status": 1, - "sort": 1 -} -``` - -#### 更新/删除字典项 -```http -PUT /api/dict/items/:id -DELETE /api/dict/items/:id -``` - ---- - -## 前端 API(Vue/JavaScript) - -### 前端 API 文件位置 - -``` -pc/src/api/dict.js -``` - -### 可用函数 - -#### getDictItemsByCode(code, includeDisabled = false) - -**最常用的函数**,根据字典编码获取字典项列表。 - -**参数:** -- `code` (string):字典编码,例如 `'user_status'` -- `includeDisabled` (boolean):是否包含禁用项,默认 `false` - -**返回:** Promise,返回字典项数组 - -**示例:** -```javascript -import { getDictItemsByCode } from '@/api/dict' - -// 获取用户状态字典 -const statusItems = await getDictItemsByCode('user_status') -console.log(statusItems) -// 输出: -// [ -// { dict_label: '启用', dict_value: '1', ... }, -// { dict_label: '禁用', dict_value: '0', ... } -// ] -``` - ---- - -#### 其他可用函数 - -```javascript -// 获取字典类型列表 -getDictTypes(params) - -// 根据ID获取字典类型 -getDictTypeById(id) - -// 添加字典类型 -addDictType(data) - -// 更新字典类型 -updateDictType(id, data) - -// 删除字典类型 -deleteDictType(id) - -// 获取字典项列表(需传入参数过滤) -getDictItems(params) - -// 根据ID获取字典项 -getDictItemById(id) - -// 添加字典项 -addDictItem(data) - -// 更新字典项 -updateDictItem(id, data) - -// 删除字典项 -deleteDictItem(id) - -// 批量更新字典项排序 -batchUpdateDictItemSort(data) -``` - ---- - -## 前端组件中的使用示例 - -### 示例 1:在用户管理页面显示用户状态 - -**场景**:在用户列表中,根据用户的 `status` 字段显示对应的状态标签。 - -**文件**:`pc/src/views/system/users/index.vue` - -**实现步骤**: - -#### 1. 导入字典 API -```javascript -import { getDictItemsByCode } from '@/api/dict' -``` - -#### 2. 定义状态字典数据和加载函数 -```javascript - -``` - -#### 3. 定义辅助函数 -```javascript -// 根据状态值获取字典标签 -const getStatusLabel = (status: any) => { - const sval = status !== undefined && status !== null ? String(status) : '' - - // 查找匹配的字典项 - const item = statusDict.value.find( - (d: any) => String(d.dict_value) === sval || d.dict_value === status - ) - - if (item && item.dict_label) { - return item.dict_label - } - - // 兼容旧逻辑:如果没有匹配的字典项 - if (status === 1 || sval === '1' || sval === 'active') return '启用' - return '禁用' -} - -// 根据标签确定 el-tag 的样式类型 -const getStatusTagType = (status: any) => { - const label = getStatusLabel(status) - if (!label) return 'info' - - const l = label.toString() - if (l.includes('启用') || l.includes('正常') || l.includes('active')) return 'success' - if (l.includes('禁用') || l.includes('停用') || l.includes('inactive')) return 'danger' - - return 'info' -} -``` - -#### 4. 在模板中使用 -```vue - -``` - ---- - -### 示例 2:在下拉选择中使用字典 - -**场景**:在"添加/编辑用户"对话框中,用字典项填充状态下拉选择。 - -```vue - - - -``` - ---- - -### 示例 3:多个字典项的场景 - -**场景**:同时加载多个字典(用户状态、性别、部门类型等)。 - -```javascript - -``` - ---- - -## 最佳实践 - -### 1. 缓存字典数据 - -避免在每个组件中都调用字典 API。建议在全局 store 中缓存字典数据: - -**文件**:`pc/src/stores/dict.ts` - -```typescript -import { defineStore } from 'pinia' -import { ref } from 'vue' -import { getDictItemsByCode } from '@/api/dict' - -export const useDictStore = defineStore('dict', () => { - const dicts = ref>({}) - - const fetchDict = async (code: string) => { - if (dicts.value[code]) { - return dicts.value[code] - } - - try { - const res = await getDictItemsByCode(code) - const items = res?.data || res || [] - dicts.value[code] = Array.isArray(items) ? items : [] - return dicts.value[code] - } catch (err) { - console.error(`Failed to fetch dict ${code}:`, err) - return [] - } - } - - return { dicts, fetchDict } -}) -``` - -**在组件中使用:** - -```javascript -import { useDictStore } from '@/stores/dict' - -const dictStore = useDictStore() -const statusDict = await dictStore.fetchDict('user_status') -``` - -### 2. 创建字典枚举文件 - -建议为常用字典创建枚举文件,便于维护: - -**文件**:`pc/src/constants/dicts.ts` - -```typescript -// 字典编码常量 -export const DICT_CODES = { - USER_STATUS: 'user_status', - GENDER: 'gender', - DEPT_TYPE: 'dept_type', - POSITION_LEVEL: 'position_level', -} as const - -// 用于 TypeScript 类型 -export type DictCode = typeof DICT_CODES[keyof typeof DICT_CODES] -``` - -**在组件中使用:** - -```javascript -import { DICT_CODES } from '@/constants/dicts' -import { useDictStore } from '@/stores/dict' - -const dictStore = useDictStore() -const statusDict = await dictStore.fetchDict(DICT_CODES.USER_STATUS) -``` - -### 3. 处理不同的数据值类型 - -字典值可能是数字、字符串或其他类型。确保比较时进行正确的类型转换: - -```javascript -const getStatusLabel = (status: any) => { - // 转换为字符串便于比较 - const statusStr = String(status) - - const item = statusDict.value.find((d: any) => { - // 支持多种比较方式 - return ( - String(d.dict_value) === statusStr || - d.dict_value === status || - d.dict_value == status // 宽松比较 - ) - }) - - return item?.dict_label || '未知' -} -``` - -### 4. 错误处理 - -始终为字典加载添加适当的错误处理和回退机制: - -```javascript -const fetchStatusDict = async () => { - try { - const res = await getDictItemsByCode('user_status') - statusDict.value = res?.data || [] - } catch (err) { - console.error('Failed to fetch status dict:', err) - // 使用默认的回退数据 - statusDict.value = [ - { dict_label: '启用', dict_value: '1' }, - { dict_label: '禁用', dict_value: '0' }, - ] - } -} -``` - ---- - -## 常见问题 - -### Q1: 字典数据在页面刷新后丢失了? - -**A:** 这是正常的,字典数据只在组件的生命周期内存在。建议使用全局 store(Pinia)来缓存字典数据,或在每个需要的组件中通过 `onMounted` 加载。 - -### Q2: 后端添加了新的字典项,前端不显示新数据? - -**A:** 前端缓存了字典数据。有两种解决方案: -1. 刷新浏览器页面,重新加载字典 -2. 在后端修改字典后,调用缓存清除接口(如果有的话),或手动清除前端 store 中的字典缓存 - -### Q3: 字典编码对应的字典类型不存在? - -**A:** 确保: -1. 后端已在 `sys_dict_type` 表中添加了对应的字典类型记录 -2. 字典类型的状态(`status`)为启用(通常为 1) -3. 至少添加了一项字典项(`sys_dict_item` 表中有数据) -4. 字典编码(`dict_code`)完全匹配(区分大小写) - -### Q4: 如何在后台管理系统中管理字典? - -**A:** 通常在系统设置或配置模块中有"字典管理"功能,可以: -- 添加/编辑/删除字典类型 -- 管理字典项(标签、值、排序、启用/禁用等) - -具体路径取决于你的后台管理系统设计。 - ---- - -## 总结 - -使用字典系统的核心步骤: - -1. **后端准备**:在 `sys_dict_type` 和 `sys_dict_item` 表中添加字典数据 -2. **前端导入**:`import { getDictItemsByCode } from '@/api/dict'` -3. **加载字典**:在 `onMounted` 或其他合适位置调用 API 加载 -4. **使用字典**:通过 `dict_value` 和 `dict_label` 来显示和存储数据 -5. **最优化**:使用 Pinia store 缓存字典,避免重复请求 - -通过字典系统,你可以灵活地管理应用中的枚举值和标签数据,而无需修改代码。 +# 字典使用示例 diff --git a/pc/docs/pinia-dict-guide.md b/pc/docs/pinia-dict-guide.md new file mode 100644 index 0000000..31f9123 --- /dev/null +++ b/pc/docs/pinia-dict-guide.md @@ -0,0 +1,374 @@ +# Pinia 字典管理系统使用指南 + +## 系统架构 + +``` +┌─────────────────────────────────────┐ +│ API 接口 (getDictItemsByCode) │ +│ /api/dict/items/code/{code} │ +└──────────────┬──────────────────────┘ + │ + ↓ +┌─────────────────────────────────────┐ +│ Pinia Store (useDictStore) │ +│ ✅ 自动缓存字典数据 │ +│ ✅ 避免重复请求 │ +│ ✅ 支持同步/异步访问 │ +└──────────────┬──────────────────────┘ + │ + ┌──────┴──────┐ + ↓ ↓ + ┌────────┐ ┌──────────────┐ + │组件 │ │Composable │ + │直接用 │ │useDict Hook │ + └────────┘ └──────────────┘ +``` + +--- + +## 核心文件说明 + +### 1. **Store**: `src/stores/dict.js` + +字典数据的全局管理器 + +**主要方法**: +```javascript +import { useDictStore } from '@/stores/dict' + +const dictStore = useDictStore() + +// ✅ 异步获取字典(推荐) +const items = await dictStore.getDictItems('user_status') + +// ✅ 同步获取字典(已缓存时) +const items = dictStore.getDictItemsSync('user_status') + +// ✅ 获取字典值对应的标签 +const label = dictStore.getDictLabel('user_status', 1) + +// ✅ 预加载多个字典 +await dictStore.preloadDicts(['user_status', 'user_role']) + +// ✅ 清空缓存 +dictStore.clearCache('user_status') +``` + +--- + + + +--- + + + +--- + +## 使用场景 + +### 场景1:在列表页加载字典 + +**文件**: `src/views/system/users/index.vue` + +```vue + + + +``` + +--- + +### 场景2:在编辑对话框使用字典 + +**文件**: `src/views/system/users/components/UserEdit.vue` + +```vue + + + +``` + +--- + +### 场景3:直接使用字典Store + +直接使用字典Store获取数据: + +```vue + + + +``` + +--- + +### 场景4:预加载应用启动时需要的字典 + +**文件**: `src/main.js` + +```javascript +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import { useDictStore } from '@/stores/dict' + +const app = createApp(App) +const pinia = createPinia() + +app.use(pinia) + +// 在应用启动后预加载常用字典 +const dictStore = useDictStore() +await dictStore.preloadDicts([ + 'user_status', + 'common_status', + 'yes_no', +]) + +app.mount('#app') +``` + +--- + +## 字典数据结构 + +后端返回的字典数据结构: + +```json +[ + { + "dict_id": 1, + "dict_value": "1", + "dict_label": "启用", + "dict_type": "user_status", + "remarks": "用户启用状态", + "remark": "用户启用状态" + }, + { + "dict_id": 2, + "dict_value": "0", + "dict_label": "禁用", + "dict_type": "user_status", + "remarks": "用户禁用状态", + "remark": "用户禁用状态" + } +] +``` + +**关键字段**: +- `dict_value`: 字典值(存储在数据库中) +- `dict_label`: 字典标签(显示给用户) +- `dict_type`: 字典类型编码(如 'user_status') + +--- + +## 最佳实践 + +### ✅ DO + +1. **使用字符串而不是硬编码数字** + ```javascript + // ✅ 好 + dictStore.getDictItems('user_status') + + // ❌ 差 + // 避免直接使用数字,应该使用字符串 + ``` + +2. **在父组件加载,通过 props 传给子组件** + ```javascript + // ✅ 父组件负责数据,子组件负责展示 + // index.vue + const statusDict = await dictStore.getDictItems('user_status') + + // UserEdit.vue + const props = defineProps({ statusDict: Array }) + ``` + +3. **直接使用字典Store** + ```javascript + // ✅ 直接使用Store获取数据 + const statusDict = await dictStore.getDictItems('user_status') + ``` + +4. **预加载常用字典** + ```javascript + // ✅ 应用启动时预加载,避免页面初始化时加载 + await dictStore.preloadDicts([...]) + ``` + +### ❌ DON'T + +1. **不要在多个地方重复加载同一个字典** + ```javascript + // ❌ 糟糕:重复加载 + // 页面A + const dict1 = await dictStore.getDictItems('user_status') + + // 页面B(Store 会自动缓存,但代码看起来重复) + const dict2 = await dictStore.getDictItems('user_status') + ``` + +2. **不要忘记处理加载状态** + ```javascript + // ❌ 可能展示空白 + const { statusDict } = useUserStatusDict() + + // ✅ 处理加载状态 + const { statusDict, loading } = useUserStatusDict() + if (loading) { /* 显示加载中 */ } + ``` + +3. **不要混用不同的字典访问方式** + ```javascript + // ❌ 混乱 + const dict1 = await dictStore.getDictItems('user_status') + const dict2 = dictStore.getDictItemsSync('user_role') + + // ✅ 统一使用 + const dict1 = await dictStore.getDictItems('user_status') + const dict2 = await dictStore.getDictItems('user_role') + ``` + +--- + +## 性能优化建议 + +| 优化项 | 说明 | +|------|------| +| **缓存** | Store 自动缓存,同一个字典只请求一次 | +| **预加载** | 在路由切换前预加载需要的字典 | +| **同步访问** | 已加载的字典可用 `getDictItemsSync` 同步获取 | +| **避免重复** | 不要在多个组件重复请求同一个字典 | + +--- + +## 故障排查 + +### 问题1:状态选项为空 + +**原因**:字典未加载 +**解决**: +```javascript +// ❌ 错误:字典还未加载 +const statusDict = dictStore.getDictItemsSync('user_status') // 返回 [] + +// ✅ 正确:等待异步加载完成 +const statusDict = await dictStore.getDictItems('user_status') +``` + +### 问题2:重复加载字典 + +**原因**:没有使用 Store 的缓存 +**解决**: +```javascript +// 所有调用都会自动使用缓存,只请求一次 +await dictStore.getDictItems('user_status') // 首次:发送请求 +await dictStore.getDictItems('user_status') // 第二次:返回缓存 +``` + +### 问题3:字典显示不对 + +**原因**:value 类型不匹配(如 1 vs "1") +**解决**: +```javascript +// Store 会自动处理类型匹配 +const item = items.find(i => + String(i.dict_value) === String(value) || i.dict_value === value +) +``` + +--- + +## 集成检清表 + +- [x] 创建 `src/stores/dict.js` - Store +- [x] 在 `index.vue` 中导入 `useDictStore` +- [x] 在 `UserEdit.vue` 中使用 `useDictStore` 获取字典数据 +- [x] 测试字典加载和显示 +- [x] 验证缓存功能(打开浏览器 DevTools 检查 Network) +- [x] 预加载常用字典(可选) + +--- + +## 相关文件修改 + +已修改的文件: +- ✅ `src/stores/dict.js` - 新建 +- ✅ `src/views/system/users/index.vue` - 使用 `useDictStore` +- ✅ `src/views/system/users/components/UserEdit.vue` - 使用字典功能 +- ✅ `src/constants/dictCodes.js` - 删除(不再需要) +- ✅ `src/composables/useDict.js` - 删除(不再需要) + diff --git a/pc/src/assets/less/style.less b/pc/src/assets/less/style.less index 8569856..3651b32 100644 --- a/pc/src/assets/less/style.less +++ b/pc/src/assets/less/style.less @@ -50,5 +50,5 @@ body { } } .el-form-item__label{ - min-width: 60px; + min-width: 80px !important; } \ No newline at end of file diff --git a/pc/src/stores/dict.js b/pc/src/stores/dict.js new file mode 100644 index 0000000..9ebc324 --- /dev/null +++ b/pc/src/stores/dict.js @@ -0,0 +1,179 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import { getDictItemsByCode } from '@/api/dict' + +/** + * 字典 Store + * + * 用于全局管理系统字典数据 + * 缓存字典数据避免重复请求,提高性能 + * + * 使用示例: + * const dictStore = useDictStore() + * const statusDict = await dictStore.getDictItems('user_status') + * const roleDict = dictStore.getDictItemsSync('user_role') // 已加载则同步返回 + */ +export const useDictStore = defineStore('dict', () => { + // 字典缓存:{ dictCode: [...items] } + const dictCache = ref({}) + + // 正在加载的字典代码集合 + const loadingCodes = ref(new Set()) + + /** + * 获取字典项(异步) + * @param {string} code - 字典编码,如 'user_status' + * @returns {Promise} 字典项数组 + */ + async function getDictItems(code) { + // 如果缓存中已有,直接返回 + if (dictCache.value[code]) { + return dictCache.value[code] + } + + // 避免重复请求:如果已在加载中,等待 + if (loadingCodes.value.has(code)) { + // 等待加载完成(最多 5 秒) + return await new Promise((resolve) => { + let count = 0 + const timer = setInterval(() => { + if (dictCache.value[code]) { + clearInterval(timer) + resolve(dictCache.value[code]) + } + count++ + if (count > 50) { + clearInterval(timer) + resolve([]) + } + }, 100) + }) + } + + // 标记为正在加载 + loadingCodes.value.add(code) + + try { + const res = await getDictItemsByCode(code) + let items = [] + + // 兼容不同的 API 响应格式 + if (res?.data && Array.isArray(res.data)) { + items = res.data + } else if (Array.isArray(res)) { + items = res + } else if (res?.data?.data && Array.isArray(res.data.data)) { + items = res.data.data + } + + // 缓存字典项 + dictCache.value[code] = items + // console.log(`✅ 字典 [${code}] 已加载,共 ${items.length} 项`) + + return items + } catch (error) { + console.error(`❌ 加载字典 [${code}] 失败:`, error) + dictCache.value[code] = [] + return [] + } finally { + // 移除加载标记 + loadingCodes.value.delete(code) + } + } + + /** + * 同步获取字典项(如果已缓存) + * @param {string} code - 字典编码 + * @returns {Array} 字典项数组,未缓存则返回空数组 + */ + function getDictItemsSync(code) { + return dictCache.value[code] || [] + } + + /** + * 预加载字典(在应用启动时调用) + * @param {Array} codes - 字典编码数组 + * @returns {Promise} + */ + async function preloadDicts(codes) { + const promises = codes.map(code => getDictItems(code)) + await Promise.all(promises) + } + + /** + * 根据字典编码和值获取标签 + * @param {string} code - 字典编码 + * @param {any} value - 字典值 + * @returns {string} 字典标签 + */ + function getDictLabel(code, value) { + const items = getDictItemsSync(code) + if (!items.length) { + console.warn(`⚠️ 字典 [${code}] 未加载,无法获取标签`) + return String(value) + } + + const item = items.find(i => String(i.dict_value) === String(value) || i.dict_value === value) + return item ? item.dict_label : String(value) + } + + /** + * 根据字典编码和标签获取值 + * @param {string} code - 字典编码 + * @param {string} label - 字典标签 + * @returns {any} 字典值 + */ + function getDictValue(code, label) { + const items = getDictItemsSync(code) + if (!items.length) { + console.warn(`⚠️ 字典 [${code}] 未加载,无法获取值`) + return null + } + + const item = items.find(i => i.dict_label === label) + return item ? item.dict_value : null + } + + /** + * 清空缓存 + * @param {string} code - 字典编码,不指定则清空所有 + */ + function clearCache(code) { + if (code) { + delete dictCache.value[code] + // console.log(`✅ 已清除字典 [${code}] 缓存`) + } else { + dictCache.value = {} + // console.log(`✅ 已清除所有字典缓存`) + } + } + + /** + * 刷新字典 + * @param {string} code - 字典编码 + * @returns {Promise} + */ + async function refreshDict(code) { + clearCache(code) + return getDictItems(code) + } + + /** + * 获取所有已缓存的字典 + * @returns {Object} + */ + const allDicts = computed(() => dictCache.value) + + return { + dictCache, + loadingCodes, + getDictItems, + getDictItemsSync, + preloadDicts, + getDictLabel, + getDictValue, + clearCache, + refreshDict, + allDicts, + } +}) diff --git a/pc/src/views/system/tenant/components/audit.vue b/pc/src/views/system/tenant/components/audit.vue index 3e50315..6de9114 100644 --- a/pc/src/views/system/tenant/components/audit.vue +++ b/pc/src/views/system/tenant/components/audit.vue @@ -30,8 +30,8 @@ {{ tenantData.email || '未设置' }} - - {{ tenantData.status === 'enabled' ? '启用' : '禁用' }} + + {{ getTenantStatusText(tenantData.status) }} @@ -54,8 +54,13 @@ > - 通过 - 拒绝 + + {{ item.dict_label }} + @@ -79,9 +84,10 @@