Bladeren bron

chore: 优化字典数据渲染逻辑

喵你个旺呀 1 jaar geleden
bovenliggende
commit
898814cb5e
32 gewijzigde bestanden met toevoegingen van 136 en 435 verwijderingen
  1. 1 1
      Web/src/components/table/dictLabel.vue
  2. 7 98
      Web/src/stores/userInfo.ts
  3. 0 1
      Web/src/types/pinia.d.ts
  4. 0 48
      Web/src/utils/dict-utils.ts
  5. 16 29
      Web/src/views/system/codeGen/component/editCodeGenDialog.vue
  6. 22 108
      Web/src/views/system/codeGen/component/genConfigDialog.vue
  7. 1 0
      Web/src/views/system/codeGen/index.vue
  8. 6 10
      Web/src/views/system/database/component/genEntity.vue
  9. 2 8
      Web/src/views/system/database/component/genSeedData.vue
  10. 1 1
      Web/src/views/system/dict/component/editDictData.vue
  11. 3 5
      Web/src/views/system/dict/index.vue
  12. 3 3
      Web/src/views/system/job/component/editJobDetail.vue
  13. 2 3
      Web/src/views/system/job/index.vue
  14. 2 2
      Web/src/views/system/ldap/index.vue
  15. 4 4
      Web/src/views/system/menu/component/editMenu.vue
  16. 6 8
      Web/src/views/system/menu/index.vue
  17. 3 2
      Web/src/views/system/notice/component/editNotice.vue
  18. 6 6
      Web/src/views/system/notice/index.vue
  19. 3 9
      Web/src/views/system/openAccess/component/generateSign.vue
  20. 5 8
      Web/src/views/system/org/component/editOrg.vue
  21. 12 15
      Web/src/views/system/org/index.vue
  22. 2 2
      Web/src/views/system/plugin/index.vue
  23. 2 2
      Web/src/views/system/pos/index.vue
  24. 3 4
      Web/src/views/system/print/component/editPrint.vue
  25. 2 2
      Web/src/views/system/print/index.vue
  26. 4 9
      Web/src/views/system/role/component/grantData.vue
  27. 3 8
      Web/src/views/system/role/index.vue
  28. 3 2
      Web/src/views/system/tenant/component/editTenant.vue
  29. 2 2
      Web/src/views/system/tenant/index.vue
  30. 6 25
      Web/src/views/system/user/component/editUser.vue
  31. 2 4
      Web/src/views/system/user/index.vue
  32. 2 6
      Web/src/views/system/weChatUser/index.vue

+ 1 - 1
Web/src/components/table/dictLabel.vue

@@ -29,7 +29,7 @@ const state = reactive({
 });
 
 onMounted(() => {
-	const dictList = useUserInfo().getDictDatasByCode(props.code as string);
+	const dictList = useUserInfo().getDictDataByCode(props.code as string);
 	const dict = dictList?.find((x: any) => x[props.propValue] == props.value + "") ?? {};
 	if (dict) {
 		state.label = dict[props.propLabel] || props.defaultValue;

+ 7 - 98
Web/src/stores/userInfo.ts

@@ -15,7 +15,6 @@ export const useUserInfo = defineStore('userInfo', {
 		userInfos: {} as any,
 		constList: [] as any,
 		dictList: {} as any,
-		dictListInt: {} as any,
 	}),
 	getters: {
 		// // 获取系统常量列表
@@ -28,36 +27,19 @@ export const useUserInfo = defineStore('userInfo', {
 	actions: {
 		// 存储用户信息到浏览器缓存
 		async setUserInfos() {
-			if (Session.get('userInfo')) {
-				this.userInfos = Session.get('userInfo');
-			} else {
-				const userInfos = <UserInfos>await this.getApiUserInfo();
-				this.userInfos = userInfos;
-			}
+			this.userInfos = Session.get('userInfo') ?? <UserInfos>await this.getApiUserInfo();
 		},
 
 		// 存储常量信息到浏览器缓存
 		async setConstList() {
-			if (Session.get('constList')) {
-				this.constList = Session.get('constList');
-			} else {
-				const constList = <any[]>await this.getSysConstList();
-				Session.set('constList', constList);
-				this.constList = constList;
-			}
+			this.constList = Session.get('constList') ?? <any[]>await this.getSysConstList();
+			if (!Session.get('constList')) Session.set('constList', this.constList);
 		},
 
 		// 存储字典信息到浏览器缓存
 		async setDictList() {
-			var res = await getAPI(SysDictTypeApi).apiSysDictTypeAllDictListGet();
-			this.dictList = res.data.result;
-			// if (Session.get('dictList')) {
-			// 	this.dictList = Session.get('dictList');
-			// } else {
-			//	const dictList = <any[]>await this.getAllDictList();
-			//	Session.set('dictList', dictList);
-			//	this.dictList = dictList;
-			// }
+			this.dictList = await getAPI(SysDictTypeApi).apiSysDictTypeAllDictListGet().then(res => res.data.result ?? {});
+			for (const key in this.dictList) if (key.endsWith("Enum")) this.dictList[key].forEach(e => e.code = Number(e.code));
 		},
 
 		// 获取当前用户信息
@@ -115,82 +97,9 @@ export const useUserInfo = defineStore('userInfo', {
 			});
 		},
 
-		// 获取字典集合
-		getAllDictList() {
-			return new Promise((resolve) => {
-				if (this.dictList) {
-					resolve(this.dictList);
-				} else {
-					getAPI(SysDictTypeApi)
-						.apiSysDictTypeAllDictListGet()
-						.then((res: any) => {
-							resolve(res.data.result ?? []);
-						});
-				}
-			});
-		},
-
-		// 根据字典类型和代码取字典项
-		getDictItemByCode(typePCode: string, val: string) {
-			if (val != undefined && val !== '') {
-				const _val = val.toString();
-				const ds = this.getDictDatasByCode(typePCode);
-				for (const element of ds) {
-					if (element.code === _val) {
-						return element;
-					}
-				}
-			}
-			return {};
-		},
-
-		// 根据字典类型和值取描述
-		getDictLabelByVal(typePCode: string, val: string) {
-			if (val != undefined && val !== '') {
-				const _val = val.toString();
-				const ds = this.getDictDatasByCode(typePCode);
-				for (const element of ds) {
-					if (element.value === _val) {
-						return element;
-					}
-				}
-			}
-			return {};
-		},
-
-		// 根据字典类型和描述取值
-		getDictValByLabel(typePCode: string, label: string) {
-			if (!label) return '';
-			const ds = this.getDictDatasByCode(typePCode);
-			for (const element of ds) {
-				if (element.name === label) {
-					return element;
-				}
-			}
-			return ''; // 明确返回空字符串
-		},
-
 		// 根据字典类型获取字典数据
-		getDictDatasByCode(dictTypeCode: string) {
+		getDictDataByCode(dictTypeCode: string) {
 			return this.dictList[dictTypeCode] || [];
-		},
-
-		// 根据字典类型获取字典数据(值转为数字类型)
-		getDictIntDatasByCode(dictTypeCode: string) {
-			let ds = this.dictListInt[dictTypeCode];
-			if (ds) {
-				return ds;
-			}
-
-			const dictList = this.dictList[dictTypeCode];
-			if (dictList) {
-				ds = dictList.map((element: { code: any }) => {
-					return { ...element, code: Number(element.code) };
-				});
-				this.dictListInt[dictTypeCode] = ds;
-			}
-
-			return ds;
-		},
+		}
 	},
 });

+ 0 - 1
Web/src/types/pinia.d.ts

@@ -15,7 +15,6 @@ declare interface UserInfosState {
 	userInfos: UserInfos;
 	constList: T[];
 	dictList: T;
-	dictListInt: T;
 }
 
 // 路由缓存列表

+ 0 - 48
Web/src/utils/dict-utils.ts

@@ -1,48 +0,0 @@
-import { useUserInfo } from '/@/stores/userInfo';
-
-const stores = useUserInfo();
-
-// 用于在 Table 中把字段的代码转换为名称,示例如下:
-/*
-import { getDictDataItem as di, getDictDataList as dl } from '/@/utils/dict-utils';
-
-<el-table-column prop="字段名" label="描述" width="140">
-    <template #default="scope">
-    <el-tag :type="di('字典名代码', scope.row.credentialsType)?.tagType"> [{{di("字典名代码", scope.row.credentialsType)?.code}}]{{di("字典名代码", scope.row.credentialsType)?.value}} </el-tag>
-    </template>
-</el-table-column>
-*/
-
-export function getDictDataItem(dicName: string, dicItemCode: any): any {
-	return stores.getDictItemByCode(dicName, dicItemCode);
-}
-
-export function getDictValByLabel(dicName: string, dicItemCode: any): any {
-	return stores.getDictValByLabel(dicName, dicItemCode);
-}
-
-export function getDictLabelByVal(dicName: string, dicItemCode: any): any {
-	return stores.getDictLabelByVal(dicName, dicItemCode);
-}
-
-// select 控件使用,用于获取字典列表,示例如下:
-/*
-import { getDictDataItem as di, getDictDataList as dl } from '/@/utils/dict-utils';
-
-<el-select clearable v-model="ruleForm.字段" placeholder="请选择证件提示">
-    <el-option v-for="(item,index) in  dl('字段名名码')"  :key="index" :value="item.code" :label="`[${item.code}] ${item.value}`"></el-option>
-</el-select>
-*/
-
-export function getDictType(dicName: string): any {
-	return stores.dictList[dicName];
-}
-
-export function getDictDataList(dicName: string): any {
-	return stores.getDictDatasByCode(dicName);
-}
-
-// 获取数字类型的
-export function getDictDataListInt(dicName: string): any {
-	return stores.getDictIntDatasByCode(dicName);
-}

+ 16 - 29
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -118,14 +118,14 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="生成方式" prop="generateType">
 							<el-select v-model="state.ruleForm.generateType" filterable class="w100">
-								<el-option v-for="item in state.codeGenTypeList" :key="item.value" :label="item.value" :value="item.code" />
+								<el-option v-for="item in getDictDataByCode('code_gen_create_type')" :key="item.value" :label="item.value" :value="item.code" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="支持打印" prop="printType">
 							<el-select v-model="state.ruleForm.printType" filterable class="w100" @change="printTypeChanged">
-								<el-option v-for="item in state.printTypeList" :key="item.value" :label="item.value" :value="item.code" />
+								<el-option v-for="item in getDictDataByCode('code_gen_print_type')" :key="item.value" :label="item.value" :value="item.code" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -182,10 +182,12 @@ import { computed, onMounted, reactive, ref } from 'vue';
 import IconSelector from '/@/components/iconSelector/index.vue';
 import other from '/@/utils/other';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
-import { SysCodeGenApi, SysDictDataApi, SysMenuApi, SysPrintApi } from '/@/api-services/api';
+import { SysCodeGenApi, SysMenuApi, SysPrintApi } from '/@/api-services/api';
 import { UpdateCodeGenInput, AddCodeGenInput, SysMenu, SysPrint } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo().getDictDataByCode;
 const props = defineProps({
 	title: String,
 	applicationNamespaces: Array<String>,
@@ -194,44 +196,26 @@ const emits = defineEmits(['handleQuery']);
 const ruleFormRef = ref();
 const state = reactive({
 	isShowDialog: false,
-	ruleForm: {} as UpdateCodeGenInput,
+	ruleForm: {} as any,
 	tableData: [] as any,
 	dbData: [] as any,
 	columnData: [] as any,
 	menuData: [] as Array<SysMenu>,
-	codeGenTypeList: [] as any,
-	printTypeList: [] as any,
 	printList: [] as Array<SysPrint>,
 });
 // 级联选择器配置选项
 const cascaderProps = { checkStrictly: true, emitPath: false, value: 'id', label: 'title' };
 
 onMounted(async () => {
-	var resDb = await getAPI(SysCodeGenApi).apiSysCodeGenDatabaseListGet();
-	state.dbData = resDb.data.result;
-
-	let resMenu = await getAPI(SysMenuApi).apiSysMenuListGet();
-	state.menuData = resMenu.data.result ?? [];
-
-	let resDicData = await getAPI(SysDictDataApi).apiSysDictDataDataListCodeGet('code_gen_create_type');
-	state.codeGenTypeList = resDicData.data.result;
-
-	let printTypeResDicData = await getAPI(SysDictDataApi).apiSysDictDataDataListCodeGet('code_gen_print_type');
-	state.printTypeList = printTypeResDicData.data.result;
-
-	let resPrintIdData = await getAPI(SysPrintApi).apiSysPrintPagePost();
-	state.printList = resPrintIdData.data.result?.items ?? [];
-
-	// 默认使用第一个库
-	//state.ruleForm.configId = state.dbData[0].configId;
-	//await dbChanged();
+  state.dbData = await getAPI(SysCodeGenApi).apiSysCodeGenDatabaseListGet().then(res => res.data.result ?? []);
+  state.printList = await getAPI(SysPrintApi).apiSysPrintPagePost().then(res => res.data.result?.items ?? []);
+  state.menuData = await getAPI(SysMenuApi).apiSysMenuListGet().then(res => res.data.result ?? []);
 });
 
 // db改变
 const dbChanged = async () => {
 	if (state.ruleForm.configId === '') return;
-	let res = await getAPI(SysCodeGenApi).apiSysCodeGenTableListConfigIdGet(state.ruleForm.configId as string);
-	state.tableData = res.data.result ?? [];
+  state.tableData = await getAPI(SysCodeGenApi).apiSysCodeGenTableListConfigIdGet(state.ruleForm.configId as string).then(res => res.data.result ?? []);
 
 	let db = state.dbData.filter((u: any) => u.configId == state.ruleForm.configId);
 	state.ruleForm.connectionString = db[0].connectionString;
@@ -242,6 +226,7 @@ const dbChanged = async () => {
 const tableChanged = (item: any) => {
 	state.ruleForm.tableName = item.entityName;
 	state.ruleForm.busName = item.tableComment;
+  state.ruleForm.tableUniqueList = [];
 	getColumnInfoList();
 };
 
@@ -254,8 +239,10 @@ const changeTableUniqueColumn = (value: any, index: number) => {
 
 const getColumnInfoList = async () => {
 	if (state.ruleForm.configId == '' || state.ruleForm.tableName == '') return;
-	var res = await getAPI(SysCodeGenApi).apiSysCodeGenColumnListByTableNameTableNameConfigIdGet(state.ruleForm.tableName, state.ruleForm.configId);
-	state.columnData = res.data.result;
+  state.columnData = await getAPI(SysCodeGenApi)
+      .apiSysCodeGenColumnListByTableNameTableNameConfigIdGet(state.ruleForm.tableName, state.ruleForm.configId)
+      .then(res => res.data.result)
+      ?? [];
 };
 
 // 菜单改变
@@ -278,9 +265,9 @@ const getGlobalComponentSize = computed(() => {
 const openDialog = (row: any) => {
 	state.ruleForm = JSON.parse(JSON.stringify(row));
 	state.ruleForm.tableUniqueList = JSON.parse(row.tableUniqueConfig ?? "[]");
+  dbChanged().then(() => getColumnInfoList());
 	state.isShowDialog = true;
 	ruleFormRef.value?.resetFields();
-	getColumnInfoList();
 };
 
 // 关闭弹窗

+ 22 - 108
Web/src/views/system/codeGen/component/genConfigDialog.vue

@@ -20,7 +20,7 @@
 					<template #default="scope">
 						<div class="effect-type-container">
 							<el-select v-model="scope.row.effectType" class="m-2" placeholder="Select" :disabled="judgeColumns(scope.row)" @change="effectTypeChange(scope.row, scope.$index)">
-								<el-option v-for="item in state.effectTypeList" :key="item.code" :label="item.value" :value="item.code" />
+								<el-option v-for="item in getDictDataByCode('code_gen_effect_type')" :key="item.code" :label="item.value" :value="item.code" />
 							</el-select>
 							<el-button
 								v-if="scope.row.effectType === 'ApiTreeSelector' || scope.row.effectType === 'ForeignKey'"
@@ -37,12 +37,9 @@
 					<template #default="scope">
 						<el-select v-model="scope.row.dictTypeCode" class="m-2" :disabled="effectTypeEnable(scope.row)">
 							<el-option
-							v-for="item in scope.row.effectType == 'Select' ? state.dictDataAll :
-								scope.row.effectType == 'EnumSelector' ? state.allEnumSelector :
-								scope.row.effectType == 'ConstSelector' ? allConstSelector :
-								state.dictTypeCodeList" 
+							v-for="item in state.selectDataMap[scope.row.effectType] ?? []"
 							:key="item.code"
-							:label="item.name" 
+							:label="item.name"
 							:value="item.code" />
 						</el-select>
 					</template>
@@ -81,7 +78,7 @@
 				<el-table-column prop="queryType" label="查询方式" min-width="120" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-select v-model="scope.row.queryType" class="m-2" placeholder="Select" :disabled="!scope.row.queryWhether">
-							<el-option v-for="item in state.queryTypeList" :key="item.code" :label="item.value" :value="item.code" />
+							<el-option v-for="item in getDictDataByCode('code_gen_query_type')" :key="item.code" :label="item.value" :value="item.code" />
 						</el-select>
 					</template>
 				</el-table-column>
@@ -105,53 +102,34 @@
 </template>
 
 <script lang="ts" setup name="sysCodeGenConfig">
-import { onMounted, onUnmounted, reactive, ref } from 'vue';
-import mittBus from '/@/utils/mitt';
+import { onMounted, reactive, ref } from 'vue';
 import { Edit } from '@element-plus/icons-vue';
 
 import fkDialog from '/@/views/system/codeGen/component/fkDialog.vue';
 import treeDialog from '/@/views/system/codeGen/component/treeDialog.vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
-import { SysCodeGenConfigApi, SysConstApi, SysDictDataApi, SysDictTypeApi, SysEnumApi } from '/@/api-services/api';
+import { SysCodeGenConfigApi, SysDictTypeApi } from '/@/api-services/api';
 import { CodeGenConfig } from '/@/api-services/models/code-gen-config';
 
+const getDictDataByCode = useUserInfo().getDictDataByCode;
 const emits = defineEmits(['handleQuery']);
 const fkDialogRef = ref();
 const treeDialogRef = ref();
 const state = reactive({
 	isShowDialog: false,
 	loading: false,
-	tableData: [] as CodeGenConfig[],
-	dbData: [] as any,
-	effectTypeList: [] as any,
-	dictTypeCodeList: [] as any,
-	dictDataAll: [] as any,
-	queryTypeList: [] as any,
-	allConstSelector: [] as any,
-	allEnumSelector: [] as any,
+  selectDataMap: {} as any,
+  tableData: [] as CodeGenConfig[]
 });
 
 onMounted(async () => {
-	var res = await getAPI(SysDictDataApi).apiSysDictDataDataListCodeGet('code_gen_effect_type');
-	state.effectTypeList = res.data.result;
-
-	var res1 = await getAPI(SysDictTypeApi).apiSysDictTypeListGet();
-	state.dictTypeCodeList = res1.data.result.filter(x => !x.code.endsWith("Enum"));
-	state.dictDataAll = state.dictTypeCodeList;
-
-	var res2 = await getAPI(SysDictDataApi).apiSysDictDataDataListCodeGet('code_gen_query_type');
-	state.queryTypeList = res2.data.result;
-
-	var res3 = await getAPI(SysConstApi).apiSysConstListGet();
-	state.allConstSelector = res3.data.result;
-
-	let resEnum = await getAPI(SysEnumApi).apiSysEnumEnumTypeListGet();
-	state.allEnumSelector = resEnum.data.result?.map((item) => ({ ...item, name: `${item.typeDescribe} [${item.typeName?.replace('Enum', '')}]`, code: item.typeName }));
-
-	mittBus.on('submitRefreshFk', (data: any) => {
-		state.tableData[data.index] = data;
-	});
+  state.selectDataMap.DictSelector = [];
+  state.selectDataMap.EnumSelector = [];
+  state.selectDataMap.ConstSelector = useUserInfo().constList;
+  const dictList = await getAPI(SysDictTypeApi).apiSysDictTypeListGet().then(res => res.data.result ?? []);
+  for (const item of dictList) state.selectDataMap[item.code?.endsWith('Enum') ? 'EnumSelector' : 'DictSelector'].push(item);
 });
 
 // 更新主键
@@ -159,10 +137,6 @@ const submitRefreshFk = (data: any) => {
 	state.tableData[data.index] = data;
 };
 
-onUnmounted(() => {
-	mittBus.off('submitRefresh', () => {});
-	mittBus.off('submitRefreshFk', () => {});
-});
 // 控件类型改变
 const effectTypeChange = (data: any, index: number) => {
 	let value = data.effectType;
@@ -178,15 +152,13 @@ const effectTypeChange = (data: any, index: number) => {
 // 查询操作
 const handleQuery = async (row: any) => {
 	state.loading = true;
-	var res = await getAPI(SysCodeGenConfigApi).apiSysCodeGenConfigListGet(undefined, row.id);
-	var data = res.data.result ?? [];
-	let lstWhetherColumn = ['whetherTable', 'whetherAddUpdate', 'whetherImport', 'whetherRequired', 'whetherSortable']; //列表显示的checkbox
-	data.forEach((item: any) => {
+	const data = await getAPI(SysCodeGenConfigApi).apiSysCodeGenConfigListGet(undefined, row.id).then(res => res.data.result ?? []);
+  const lstWhetherColumn = ['whetherTable', 'whetherAddUpdate', 'whetherImport', 'whetherRequired', 'whetherSortable']; //列表显示的checkbox
+  data.forEach((item: any) => {
 		for (const key in item) {
 			if (item[key] === 'Y') {
 				item[key] = true;
-			}
-			if (item[key] === 'N' || (lstWhetherColumn.includes(key) && item[key] === null)) {
+			} else if (item[key] === 'N' || (lstWhetherColumn.includes(key) && item[key] === null)) {
 				item[key] = false;
 			}
 		}
@@ -236,15 +208,10 @@ const cancel = () => {
 const submit = async () => {
 	state.loading = true;
 	var lst = state.tableData;
-	lst.forEach((item: CodeGenConfig) => {
-		// 必填那一项转换
+  const whetherMap = { true: 'Y', false: 'N' } as any;
+	lst.forEach((item: any) => { // 转换是否字段值
 		for (var key in item) {
-			if (item[key] === true) {
-				item[key] = 'Y';
-			}
-			if (item[key] === false) {
-				item[key] = 'N';
-			}
+      item[key] = whetherMap[item[key]] || item[key];
 		}
 	});
 	await getAPI(SysCodeGenConfigApi).apiSysCodeGenConfigUpdatePost(lst);
@@ -252,59 +219,6 @@ const submit = async () => {
 	closeDialog();
 };
 
-const convertDbType = (dbType: number) => {
-	let result = '';
-	switch (dbType) {
-		case 0:
-			result = 'MySql';
-			break;
-		case 1:
-			result = 'SqlServer';
-			break;
-		case 2:
-			result = 'Sqlite';
-			break;
-		case 3:
-			result = 'Oracle';
-			break;
-		case 4:
-			result = 'PostgreSql';
-			break;
-		case 5:
-			result = 'Dm';
-			break;
-		case 6:
-			result = 'Kdbndp';
-			break;
-		case 7:
-			result = 'Oscar';
-			break;
-		case 8:
-			result = 'MySqlConnector';
-			break;
-		case 9:
-			result = 'Access';
-			break;
-		default:
-			result = 'Custom';
-			break;
-	}
-	return result;
-};
-
-const isOrNotSelect = () => {
-	return [
-		{
-			label: '是',
-			value: 1,
-		},
-		{
-			label: '否',
-			value: 0,
-		},
-	];
-};
-
 // 导出对象
 defineExpose({ openDialog });
 </script>

+ 1 - 0
Web/src/views/system/codeGen/index.vue

@@ -174,6 +174,7 @@ const openCopyDialog = (row: any) => {
 	copyRow.id = 0;
 	copyRow.busName = '';
 	copyRow.tableName = '';
+  copyRow.tableUniqueConfig = undefined;
 	EditCodeGenRef.value?.openDialog(copyRow);
 };
 

+ 6 - 10
Web/src/views/system/database/component/genEntity.vue

@@ -22,7 +22,7 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="基类" prop="baseClassName">
 							<el-select v-model="state.ruleForm.baseClassName" clearable class="w100">
-								<el-option v-for="item in state.codeGenBaseClassName" :key="item.code" :label="item.value" :value="item.code" />
+								<el-option v-for="item in getDictDataByCode('code_gen_base_class') ?? []" :key="item.code" :label="item.value" :value="item.code" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -47,28 +47,24 @@
 </template>
 
 <script lang="ts" setup name="sysGenEntity">
-import { onMounted, reactive, ref } from 'vue';
+import { reactive, ref } from 'vue';
 import { camelCase, upperFirst } from 'lodash-es';
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
-import { SysDatabaseApi, SysDictTypeApi } from '/@/api-services/api';
+import { SysDatabaseApi } from '/@/api-services/api';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const emits = defineEmits(['handleQueryColumn']);
 const ruleFormRef = ref();
 const state = reactive({
 	isShowDialog: false,
-	ruleForm: {} as any,
-	codeGenBaseClassName: [] as any,
+	ruleForm: {} as any
 });
 
 const props = defineProps({
 	applicationNamespaces: { type: Array },
 });
 
-onMounted(async () => {
-	let resDicData = await getAPI(SysDictTypeApi).apiSysDictTypeDataListGet('code_gen_base_class');
-	state.codeGenBaseClassName = resDicData.data.result;
-});
-
 // 打开弹窗
 const openDialog = (row: any) => {
 	state.ruleForm.configId = row.configId;

+ 2 - 8
Web/src/views/system/database/component/genSeedData.vue

@@ -45,10 +45,10 @@
 </template>
 
 <script lang="ts" setup name="sysGenEntity">
-import { onMounted, reactive, ref } from 'vue';
+import { reactive, ref } from 'vue';
 
 import { getAPI } from '/@/utils/axios-utils';
-import { SysDatabaseApi, SysDictTypeApi } from '/@/api-services/api';
+import { SysDatabaseApi } from '/@/api-services/api';
 
 const emits = defineEmits(['handleQueryColumn']);
 
@@ -60,15 +60,9 @@ const ruleFormRef = ref();
 const state = reactive({
 	isShowDialog: false,
 	ruleForm: {} as any,
-	codeGenBaseClassName: [] as any,
 	rules: { position: [{ required: true, message: '请选择存放位置', trigger: 'blur' }] },
 });
 
-onMounted(async () => {
-	let resDicData = await getAPI(SysDictTypeApi).apiSysDictTypeDataListGet('code_gen_base_class');
-	state.codeGenBaseClassName = resDicData.data.result;
-});
-
 // 打开弹窗
 const openDialog = (row: any) => {
 	state.ruleForm.configId = row.configId;

+ 1 - 1
Web/src/views/system/dict/component/editDictData.vue

@@ -31,7 +31,7 @@
 								<el-radio value="success"><el-tag type="success">success</el-tag></el-radio>
 								<el-radio value="info"><el-tag type="info">info</el-tag></el-radio>
 								<el-radio value="warning"><el-tag type="warning">warning</el-tag></el-radio>
-								<el-radio value="danger"><el-tag type="danger" style="font:">danger</el-tag></el-radio>
+								<el-radio value="danger"><el-tag type="danger">danger</el-tag></el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>

+ 3 - 5
Web/src/views/system/dict/index.vue

@@ -30,8 +30,7 @@
 						<el-table-column prop="code" label="字典编码" min-width="140" header-align="center" show-overflow-tooltip />
 						<el-table-column prop="status" label="状态" width="70" align="center" show-overflow-tooltip>
 							<template #default="scope">
-								<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-								<el-tag type="danger" v-else>禁用</el-tag>
+                <DictLabel :value="scope.row.status" code="StatusEnum" />
 							</template>
 						</el-table-column>
 						<el-table-column prop="orderNo" label="排序" width="60" align="center" show-overflow-tooltip />
@@ -108,8 +107,7 @@
 						</el-table-column>
 						<el-table-column prop="status" label="状态" width="70" align="center" show-overflow-tooltip>
 							<template #default="scope">
-								<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-								<el-tag type="danger" v-else>禁用</el-tag>
+                <DictLabel :value="scope.row.status" code="StatusEnum" />
 							</template>
 						</el-table-column>
 						<el-table-column prop="orderNo" label="排序" width="60" align="center" show-overflow-tooltip />
@@ -160,10 +158,10 @@ import EditDictData from '/@/views/system/dict/component/editDictData.vue';
 import ModifyRecord from '/@/components/table/modifyRecord.vue';
 
 import { getAPI } from '/@/utils/axios-utils';
-import { Session } from '/@/utils/storage';
 import { useUserInfo } from '/@/stores/userInfo';
 import { SysDictTypeApi, SysDictDataApi } from '/@/api-services/api';
 import { SysDictType, SysDictData, UpdateDictDataInput } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editDictTypeRef = ref<InstanceType<typeof EditDictType>>();
 const editDictDataRef = ref<InstanceType<typeof EditDictData>>();

+ 3 - 3
Web/src/views/system/job/component/editJobDetail.vue

@@ -24,9 +24,7 @@
 							<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 								<el-form-item label="创建类型">
 									<el-radio-group v-model="state.ruleForm.createType" :disabled="isEdit">
-										<el-radio :value="JobCreateTypeEnum.NUMBER_0" v-show="isEdit">内置</el-radio>
-										<el-radio :value="JobCreateTypeEnum.NUMBER_1">脚本</el-radio>
-										<el-radio :value="JobCreateTypeEnum.NUMBER_2">Http请求</el-radio>
+										<el-radio :value="item.code" v-show="item.code == JobCreateTypeEnum.NUMBER_0 ? isEdit : true" v-for="(item, index) in getDictDataByCode('JobCreateTypeEnum') ?? []" :key="index">{{item.value}}</el-radio>
 									</el-radio-group>
 								</el-form-item>
 							</el-col>
@@ -106,10 +104,12 @@ import { reactive, ref, computed } from 'vue';
 import * as monaco from 'monaco-editor';
 import { JobScriptCode } from './JobScriptCode';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysJobApi } from '/@/api-services/api';
 import { JobCreateTypeEnum, UpdateJobDetailInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 // HttpMethod 定义,来源后端 HttpMethod 对象的序列化
 // 下面定义内容【不要】加空格,否则 getHttpJobMessage 中 JSON.stringify(httpJobMessageNet.HttpMethod) 后无法匹配
 const httpMethodDef = {

+ 2 - 3
Web/src/views/system/job/index.vue

@@ -142,9 +142,7 @@
 				</el-table-column>
 				<el-table-column prop="jobDetail.createType" label="作业创建类型" width="110" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="info" v-if="(scope.row as JobDetailOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_0"> 内置 </el-tag>
-						<el-tag type="warning" v-if="(scope.row as JobDetailOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_1"> 脚本 </el-tag>
-						<el-tag type="success" v-if="(scope.row as JobDetailOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_2"> HTTP请求 </el-tag>
+            <DictLabel :value="(scope.row as JobDetailOutput).jobDetail?.createType ?? ''" code="JobCreateTypeEnum" />
 					</template>
 				</el-table-column>
 				<!-- <el-table-column prop="jobDetail.includeAnnotations" label="扫描特性触发器" align="center" show-overflow-tooltip>
@@ -281,6 +279,7 @@ import JobCluster from '/@/views/system/job/component/jobCluster.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysJobApi } from '/@/api-services/api';
 import { JobCreateTypeEnum, JobDetailOutput, SysJobTrigger } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const router = useRouter();
 const editJobDetailRef = ref<InstanceType<typeof EditJobDetail>>();

+ 2 - 2
Web/src/views/system/ldap/index.vue

@@ -32,8 +32,7 @@
 				<el-table-column prop="version" label="Ldap版本" show-overflow-tooltip="" />
 				<el-table-column prop="status" label="状态" width="80" align="center" show-overflow-tooltip="">
 					<template #default="scope">
-						<el-tag v-if="scope.row.status"> 是 </el-tag>
-						<el-tag type="danger" v-else> 否 </el-tag>
+            <DictLabel :value="scope.row.status" code="StatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -76,6 +75,7 @@ import EditLdap from './component/editLdap.vue';
 
 import { getAPI } from '/@/utils/axios-utils';
 import { SysLdapApi } from '/@/api-services/api';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editLdapRef = ref<InstanceType<typeof EditLdap>>();
 const state = reactive({

+ 4 - 4
Web/src/views/system/menu/component/editMenu.vue

@@ -22,9 +22,7 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="菜单类型" prop="type" :rules="[{ required: true, message: '菜单类型不能为空', trigger: 'blur' }]">
 							<el-radio-group v-model="state.ruleForm.type">
-								<el-radio :value="1">目录</el-radio>
-								<el-radio :value="2">菜单</el-radio>
-								<el-radio :value="3">按钮</el-radio>
+								<el-radio :value="item.code" v-for="(item, index) in getDictDataByCode('MenuTypeEnum') ?? []" :key="index">{{item.value}}</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
@@ -143,11 +141,13 @@
 import { computed, reactive, ref } from 'vue';
 import IconSelector from '/@/components/iconSelector/index.vue';
 
-import { getAPI } from '/@/utils/axios-utils';
 import other from '/@/utils/other';
+import {useUserInfo} from "/@/stores/userInfo";
+import { getAPI } from '/@/utils/axios-utils';
 import { SysMenuApi } from '/@/api-services/api';
 import { SysMenu, UpdateMenuInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const props = defineProps({
 	title: String,
 	menuData: Array<SysMenu>,

+ 6 - 8
Web/src/views/system/menu/index.vue

@@ -7,9 +7,7 @@
 				</el-form-item>
 				<el-form-item label="类型">
 					<el-select v-model="state.queryParams.type" placeholder="类型" clearable>
-						<el-option label="目录" :value="1" />
-						<el-option label="菜单" :value="2" />
-						<el-option label="按钮" :value="3" />
+            <el-option :value="item.value" :label="item.name" v-for="(item, index) in getDictDataByCode('MenuTypeEnum')" :key="index" />
 					</el-select>
 				</el-form-item>
 				<el-form-item>
@@ -34,9 +32,7 @@
 				</el-table-column>
 				<el-table-column label="类型" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="warning" v-if="scope.row.type === 1">目录</el-tag>
-						<el-tag v-else-if="scope.row.type === 2">菜单</el-tag>
-						<el-tag type="info" v-else>按钮</el-tag>
+            <DictLabel :value="scope.row.type" code="MenuTypeEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="path" label="路由路径" header-align="center" show-overflow-tooltip />
@@ -45,8 +41,7 @@
 				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 				<el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-						<el-tag type="danger" v-else>禁用</el-tag>
+            <DictLabel :value="scope.row.status" code="StatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -77,7 +72,10 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysMenuApi } from '/@/api-services/api';
 import { SysMenu, UpdateMenuInput } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
+import {useUserInfo} from "/@/stores/userInfo";
 
+const getDictDataByCode = useUserInfo().getDictDataByCode;
 const editMenuRef = ref<InstanceType<typeof EditMenu>>();
 const state = reactive({
 	loading: false,

+ 3 - 2
Web/src/views/system/notice/component/editNotice.vue

@@ -17,8 +17,7 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="类型" prop="type" :rules="[{ required: true, message: '类型不能为空', trigger: 'blur' }]">
 							<el-select v-model="state.ruleForm.type" placeholder="类型" filterable allow-create default-first-option style="width: 100%">
-								<el-option label="通知" :value="1" />
-								<el-option label="公告" :value="2" />
+                <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('NoticeTypeEnum') ?? []" :key="index" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -43,10 +42,12 @@
 import { reactive, ref } from 'vue';
 import Editor from '/@/components/editor/index.vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysNoticeApi } from '/@/api-services/api';
 import { UpdateNoticeInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const props = defineProps({
 	title: String,
 });

+ 6 - 6
Web/src/views/system/notice/index.vue

@@ -7,8 +7,7 @@
 				</el-form-item>
 				<el-form-item label="类型">
 					<el-select v-model="state.queryParams.type" placeholder="类型" clearable>
-						<el-option label="通知" :value="1" />
-						<el-option label="公告" :value="2" />
+            <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('NoticeTypeEnum') ?? []" :key="index" />
 					</el-select>
 				</el-form-item>
 				<el-form-item>
@@ -32,15 +31,13 @@
 				</el-table-column>
 				<el-table-column prop="type" label="类型" width="100" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag v-if="scope.row.type === 1"> 通知 </el-tag>
-						<el-tag type="warning" v-else> 公告 </el-tag>
+            <DictLabel :value="scope.row.type" code="NoticeTypeEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="createTime" label="创建时间" align="center" show-overflow-tooltip />
 				<el-table-column prop="status" label="状态" width="100" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="info" v-if="scope.row.status === 1"> 已发布 </el-tag>
-						<el-tag type="warning" v-else> 未发布 </el-tag>
+            <DictLabel :value="scope.row.status" code="NoticeStatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="publicUserName" label="发布者" align="center" show-overflow-tooltip />
@@ -76,10 +73,13 @@ import { ElMessageBox, ElMessage } from 'element-plus';
 import commonFunction from '/@/utils/commonFunction';
 import EditNotice from '/@/views/system/notice/component/editNotice.vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysNoticeApi } from '/@/api-services/api';
 import { SysNotice } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const editNoticeRef = ref<InstanceType<typeof EditNotice>>();
 const { removeHtml } = commonFunction();
 const state = reactive({

+ 3 - 9
Web/src/views/system/openAccess/component/generateSign.vue

@@ -24,15 +24,7 @@
 							<el-input v-model="state.ruleForm.url" placeholder="接口请求地址" class="input-with-select" clearable>
 								<template #prepend>
 									<el-select v-model="state.ruleForm.method" placeholder="请求方法" style="width: 100px">
-										<el-option label="Get" :value="HttpMethodEnum.NUMBER_0" />
-										<el-option label="Post" :value="HttpMethodEnum.NUMBER_1" />
-										<el-option label="Put" :value="HttpMethodEnum.NUMBER_2" />
-										<el-option label="Delete" :value="HttpMethodEnum.NUMBER_3" />
-										<el-option label="Patch" :value="HttpMethodEnum.NUMBER_4" />
-										<el-option label="Head" :value="HttpMethodEnum.NUMBER_5" />
-										<el-option label="Options" :value="HttpMethodEnum.NUMBER_6" />
-										<el-option label="Trace" :value="HttpMethodEnum.NUMBER_7" />
-										<el-option label="Connect" :value="HttpMethodEnum.NUMBER_8" />
+                    <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('HttpMethodEnum') ?? []" :key="index" />
 									</el-select>
 								</template>
 							</el-input>
@@ -70,10 +62,12 @@
 <script lang="ts" setup name="sysOpenAccessEdit">
 import { reactive, ref, watch } from 'vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysOpenAccessApi } from '/@/api-services/api';
 import { GenerateSignatureInput, HttpMethodEnum } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const props = defineProps({
 	title: String,
 });

+ 5 - 8
Web/src/views/system/org/component/editOrg.vue

@@ -37,7 +37,7 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="机构类型">
 							<el-select v-model="state.ruleForm.type" filterable clearable class="w100">
-								<el-option v-for="item in state.orgTypeList" :key="item.value" :label="item.value" :value="item.code" />
+                <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('org_type') ?? []" :key="index" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -72,12 +72,14 @@
 </template>
 
 <script lang="ts" setup name="sysEditOrg">
-import { onMounted, reactive, ref } from 'vue';
+import { reactive, ref } from 'vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
-import { SysOrgApi, SysDictDataApi } from '/@/api-services/api';
+import { SysOrgApi } from '/@/api-services/api';
 import { SysOrg, UpdateOrgInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const props = defineProps({
 	title: String,
 	orgData: Array<SysOrg>,
@@ -92,11 +94,6 @@ const state = reactive({
 // 级联选择器配置选项
 const cascaderProps = { checkStrictly: true, emitPath: false, value: 'id', label: 'name' };
 
-onMounted(async () => {
-	let resDicData = await getAPI(SysDictDataApi).apiSysDictDataDataListCodeGet('org_type');
-	state.orgTypeList = resDicData.data.result;
-});
-
 // 打开弹窗
 const openDialog = (row: any) => {
 	state.ruleForm = JSON.parse(JSON.stringify(row));

+ 12 - 15
Web/src/views/system/org/index.vue

@@ -15,7 +15,7 @@
 						</el-form-item> -->
 						<el-form-item label="机构类型">
 							<el-select v-model="state.queryParams.type" filterable clearable>
-								<el-option v-for="item in state.orgTypeList" :key="item.value" :label="item.value" :value="item.code" />
+                <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('org_type') ?? []" :key="index" />
 							</el-select>
 						</el-form-item>
 						<el-form-item>
@@ -35,12 +35,15 @@
 						<el-table-column prop="name" label="机构名称" min-width="160" header-align="center" show-overflow-tooltip />
 						<el-table-column prop="code" label="机构编码" align="center" show-overflow-tooltip />
 						<el-table-column prop="level" label="级别" width="70" align="center" show-overflow-tooltip />
-						<el-table-column prop="type" label="机构类型" align="center" :formatter="dictFormatter" show-overflow-tooltip />
+						<el-table-column prop="type" label="机构类型" align="center" show-overflow-tooltip>
+              <template #default="scope">
+                <DictLabel :value="scope.row.type" code="org_type" />
+              </template>
+            </el-table-column>
 						<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 						<el-table-column label="状态" width="70" align="center" show-overflow-tooltip>
 							<template #default="scope">
-								<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-								<el-tag type="danger" v-else>禁用</el-tag>
+                <DictLabel :value="scope.row.status" code="StatusEnum" />
 							</template>
 						</el-table-column>
 						<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -74,10 +77,13 @@ import OrgTree from '/@/views/system/org/component/orgTree.vue';
 import EditOrg from '/@/views/system/org/component/editOrg.vue';
 import ModifyRecord from '/@/components/table/modifyRecord.vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
-import { SysOrgApi, SysDictDataApi } from '/@/api-services/api';
+import { SysOrgApi } from '/@/api-services/api';
 import { SysOrg, UpdateOrgInput } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const editOrgRef = ref<InstanceType<typeof EditOrg>>();
 const orgTreeRef = ref<InstanceType<typeof OrgTree>>();
 const state = reactive({
@@ -90,15 +96,11 @@ const state = reactive({
 		code: undefined,
 		type: undefined,
 	},
-	editOrgTitle: '',
-	orgTypeList: [] as any,
+	editOrgTitle: ''
 });
 
 onMounted(async () => {
 	handleQuery();
-
-	let resDicData = await getAPI(SysDictDataApi).apiSysDictDataDataListCodeGet('org_type');
-	state.orgTypeList = resDicData.data.result;
 });
 
 // 查询操作
@@ -173,9 +175,4 @@ const nodeClick = async (node: any) => {
 	state.queryParams.type = undefined;
 	handleQuery();
 };
-
-// 字典转换
-const dictFormatter = (row: any, column: any, cellValue: any) => {
-	return state.orgTypeList.find((u: any) => u.code == cellValue)?.value;
-};
 </script>

+ 2 - 2
Web/src/views/system/plugin/index.vue

@@ -25,8 +25,7 @@
 				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 				<el-table-column label="状态" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-						<el-tag type="danger" v-else>禁用</el-tag>
+            <DictLabel :value="scope.row.status" code="StatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -67,6 +66,7 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysPluginApi } from '/@/api-services/api';
 import { SysPlugin } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editPluginRef = ref<InstanceType<typeof EditPlugin>>();
 const state = reactive({

+ 2 - 2
Web/src/views/system/pos/index.vue

@@ -28,8 +28,7 @@
 				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 				<el-table-column label="状态" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-						<el-tag type="danger" v-else>禁用</el-tag>
+            <DictLabel :value="scope.row.status" code="StatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -60,6 +59,7 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysPosApi } from '/@/api-services/api';
 import { SysPos, UpdatePosInput } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editPosRef = ref<InstanceType<typeof EditPos>>();
 const state = reactive({

+ 3 - 4
Web/src/views/system/print/component/editPrint.vue

@@ -51,8 +51,7 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="打印类型">
 							<el-radio-group v-model="state.ruleForm.printType">
-								<el-radio :value="1">浏览器打印</el-radio>
-								<el-radio :value="2">客户端打印</el-radio>
+                <el-radio :value="item.code" v-for="(item, index) in getDictDataByCode('PrintTypeEnum') ?? []" :key="index">{{item.value}}</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
@@ -87,14 +86,14 @@
 import { onMounted, reactive, ref, nextTick } from 'vue';
 import HiprintDesign from '/@/views/system/print/component/hiprint/index.vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysPrintApi } from '/@/api-services/api';
 import { UpdatePrintInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const hiprintDesignRef = ref<InstanceType<typeof HiprintDesign>>();
-
 const mode = ref(0);
-
 const props = defineProps({
 	title: String,
 });

+ 2 - 2
Web/src/views/system/print/index.vue

@@ -25,8 +25,7 @@
 				<el-table-column prop="orderNo" label="排序" align="center" show-overflow-tooltip />
 				<el-table-column label="状态" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-						<el-tag type="danger" v-else>禁用</el-tag>
+            <DictLabel :value="scope.row.status" code="StatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -67,6 +66,7 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysPrintApi } from '/@/api-services/api';
 import { SysPrint } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editPrintRef = ref<InstanceType<typeof EditPrint>>();
 const state = reactive({

+ 4 - 9
Web/src/views/system/role/component/grantData.vue

@@ -12,7 +12,7 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl1="24" class="mb20">
 						<el-form-item label="数据范围:">
 							<el-select v-model="state.ruleForm.dataScope" placeholder="数据范围" style="width: 100%">
-								<el-option v-for="d in state.dataScopeType" :key="d.value" :label="d.label" :value="d.value" />
+                <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('DataScopeEnum') ?? []" :key="index" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -37,22 +37,17 @@
 import { reactive, ref } from 'vue';
 import OrgTree from '/@/views/system/org/component/orgTree.vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysRoleApi } from '/@/api-services/api';
 import { RoleOrgInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const emits = defineEmits(['handleQuery']);
 const orgTreeRef = ref();
 const state = reactive({
 	isShowDialog: false,
-	ruleForm: {} as RoleOrgInput,
-	dataScopeType: [
-		{ value: 1, label: '全部数据' },
-		{ value: 2, label: '本部门及以下数据' },
-		{ value: 3, label: '本部门数据' },
-		{ value: 4, label: '仅本人数据' },
-		{ value: 5, label: '自定义数据' },
-	],
+	ruleForm: {} as RoleOrgInput
 });
 
 // 打开弹窗

+ 3 - 8
Web/src/views/system/role/index.vue

@@ -27,18 +27,13 @@
 				<el-table-column prop="code" label="角色编码" align="center" show-overflow-tooltip />
 				<el-table-column label="数据范围" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag effect="plain" v-if="scope.row.dataScope === 1">全部数据</el-tag>
-						<el-tag effect="plain" v-else-if="scope.row.dataScope === 2">本部门及以下数据</el-tag>
-						<el-tag effect="plain" v-else-if="scope.row.dataScope === 3">本部门数据</el-tag>
-						<el-tag effect="plain" v-else-if="scope.row.dataScope === 4">仅本人数据</el-tag>
-						<el-tag effect="plain" v-else-if="scope.row.dataScope === 5">自定义数据</el-tag>
+            <DictLabel :value="scope.row.dataScope" code="DataScopeEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 				<el-table-column label="状态" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
-						<el-tag type="danger" v-else>禁用</el-tag>
+            <DictLabel :value="scope.row.status" code="StatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -75,7 +70,6 @@
 <script lang="ts" setup name="sysRole">
 import { onMounted, reactive, ref } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
-import { auth } from '/@/utils/authFunction';
 import EditRole from '/@/views/system/role/component/editRole.vue';
 import GrantData from '/@/views/system/role/component/grantData.vue';
 import ModifyRecord from '/@/components/table/modifyRecord.vue';
@@ -83,6 +77,7 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysRoleApi } from '/@/api-services/api';
 import { SysRole } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editRoleRef = ref<InstanceType<typeof EditRole>>();
 const grantDataRef = ref<InstanceType<typeof GrantData>>();

+ 3 - 2
Web/src/views/system/tenant/component/editTenant.vue

@@ -12,8 +12,7 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="租户类型" :rules="[{ required: true, message: '租户类型不能为空', trigger: 'blur' }]">
 							<el-radio-group v-model="state.ruleForm.tenantType" :disabled="state.ruleForm.id != undefined">
-								<el-radio :value="0">ID隔离</el-radio>
-								<el-radio :value="1">库隔离</el-radio>
+                <el-radio :value="item.code" v-for="(item, index) in getDictDataByCode('TenantTypeEnum') ?? []" :key="index">{{item.value}}</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
@@ -119,10 +118,12 @@
 <script lang="ts" setup name="sysEditTenant">
 import { reactive, ref } from 'vue';
 
+import {useUserInfo} from "/@/stores/userInfo";
 import { getAPI } from '/@/utils/axios-utils';
 import { SysTenantApi } from '/@/api-services/api';
 import { UpdateTenantInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const props = defineProps({
 	title: String,
 });

+ 2 - 2
Web/src/views/system/tenant/index.vue

@@ -30,8 +30,7 @@
 				<!-- <el-table-column prop="email" label="邮箱" show-overflow-tooltip /> -->
 				<el-table-column prop="tenantType" label="租户类型" width="100" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag v-if="scope.row.tenantType === 0"> ID隔离 </el-tag>
-						<el-tag type="danger" v-else> 库隔离 </el-tag>
+            <DictLabel :value="scope.row.status" code="TenantTypeEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column label="状态" width="70" align="center" show-overflow-tooltip>
@@ -122,6 +121,7 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysTenantApi } from '/@/api-services/api';
 import { TenantOutput } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editTenantRef = ref<InstanceType<typeof EditTenant>>();
 const grantMenuRef = ref<InstanceType<typeof GrantMenu>>();

+ 6 - 25
Web/src/views/system/user/component/editUser.vue

@@ -41,9 +41,7 @@
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 								<el-form-item label="账号类型" prop="accountType" :rules="[{ required: true, message: '账号类型不能为空', trigger: 'blur' }]">
 									<el-select v-model="state.ruleForm.accountType" placeholder="账号类型" collapse-tags collapse-tags-tooltip class="w100">
-										<el-option label="系统管理员" :value="888" :disabled="userInfos.accountType != 888 && userInfos.accountType != 999" />
-										<el-option label="普通账号" :value="777" />
-										<el-option label="会员" :value="666" />
+                    <el-option :disabled="item.name == 'SysAdmin' && ![888, 999].some(x => x == userInfos.accountType)" :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('AccountTypeEnum').filter(x => x.name != 'SuperAdmin') ?? []" :key="index" />
 									</el-select>
 								</el-form-item>
 							</el-col>
@@ -136,11 +134,7 @@
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 								<el-form-item label="证件类型" prop="cardType">
 									<el-select v-model="state.ruleForm.cardType" placeholder="证件类型" class="w100">
-										<el-option label="身份证" :value="0" />
-										<el-option label="护照" :value="1" />
-										<el-option label="出生证" :value="2" />
-										<el-option label="港澳台通行证" :value="3" />
-										<el-option label="外国人居留证" :value="4" />
+                    <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('CardTypeEnum') ?? []" :key="index" />
 									</el-select>
 								</el-form-item>
 							</el-col>
@@ -157,11 +151,8 @@
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 								<el-form-item label="性别">
 									<el-radio-group v-model="state.ruleForm.sex">
-										<el-radio :value="1">男</el-radio>
-										<el-radio :value="2">女</el-radio>
-										<el-radio :value="0">未知</el-radio>
-										<el-radio :value="9">未说明</el-radio>
-									</el-radio-group>
+                    <el-radio :value="item.code" v-for="(item, index) in getDictDataByCode('GenderEnum') ?? []" :key="index">{{item.value}}</el-radio>
+                  </el-radio-group>
 								</el-form-item>
 							</el-col>
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb5">
@@ -187,18 +178,7 @@
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 								<el-form-item label="文化程度">
 									<el-select v-model="state.ruleForm.cultureLevel" placeholder="文化程度" class="w100">
-										<el-option label="其他" :value="0" />
-										<el-option label="小学" :value="1" />
-										<el-option label="初中" :value="2" />
-										<el-option label="普通高中" :value="3" />
-										<el-option label="技工学校" :value="4" />
-										<el-option label="职业教育" :value="5" />
-										<el-option label="职业高中" :value="6" />
-										<el-option label="中等专科" :value="7" />
-										<el-option label="大学专科" :value="8" />
-										<el-option label="大学本科" :value="9" />
-										<el-option label="硕士研究生" :value="10" />
-										<el-option label="博士研究生" :value="11" />
+                    <el-option :label="item.value" :value="item.code" v-for="(item, index) in getDictDataByCode('CultureLevelEnum') ?? []" :key="index" />
 									</el-select>
 								</el-form-item>
 							</el-col>
@@ -255,6 +235,7 @@ import { getAPI } from '/@/utils/axios-utils';
 import { SysPosApi, SysRoleApi, SysUserApi } from '/@/api-services/api';
 import { RoleOutput, SysOrg, SysPos, UpdateUserInput } from '/@/api-services/models';
 
+const getDictDataByCode = useUserInfo.getDictDataByCode;
 const props = defineProps({
 	title: String,
 	orgData: Array<SysOrg>,

+ 2 - 4
Web/src/views/system/user/index.vue

@@ -58,10 +58,7 @@
 						</el-table-column> -->
 						<el-table-column label="账号类型" width="110" align="center" show-overflow-tooltip>
 							<template #default="scope">
-								<el-tag v-if="scope.row.accountType === 888"> 系统管理员 </el-tag>
-								<el-tag v-else-if="scope.row.accountType === 777"> 普通账号 </el-tag>
-								<el-tag v-else-if="scope.row.accountType === 666"> 会员 </el-tag>
-								<el-tag v-else> 其他 </el-tag>
+                <DictLabel :value="scope.row.status" code="AccountTypeEnum" />
 							</template>
 						</el-table-column>
 						<el-table-column prop="roleName" label="角色集合" min-width="150" align="center" show-overflow-tooltip />
@@ -128,6 +125,7 @@ import 'splitpanes/dist/splitpanes.css';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysUserApi, SysOrgApi } from '/@/api-services/api';
 import { SysUser, SysOrg, UpdateUserInput } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const orgTreeRef = ref<InstanceType<typeof OrgTree>>();
 const editUserRef = ref<InstanceType<typeof EditUser>>();

+ 2 - 6
Web/src/views/system/weChatUser/index.vue

@@ -24,12 +24,7 @@
 				<el-table-column prop="unionId" label="UnionId" align="center" show-overflow-tooltip />
 				<el-table-column prop="platformType" label="平台类型" width="110" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag v-if="scope.row.platformType === 1"> 微信公众号 </el-tag>
-						<el-tag v-else-if="scope.row.platformType === 2"> 微信小程序 </el-tag>
-						<el-tag v-else-if="scope.row.platformType === 3"> QQ </el-tag>
-						<el-tag v-else-if="scope.row.platformType === 4"> Alipay </el-tag>
-						<el-tag v-else-if="scope.row.platformType === 5"> Gitee </el-tag>
-						<el-tag v-else> 未知 </el-tag>
+            <DictLabel :value="scope.row.platformType" code="PlatformTypeEnum" default-value="其他" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="nickName" label="昵称" align="center" show-overflow-tooltip />
@@ -80,6 +75,7 @@ import EditWeChatUser from '/@/views/system/weChatUser/component/editWeChatUser.
 import { getAPI } from '/@/utils/axios-utils';
 import { SysWechatUserApi } from '/@/api-services/api';
 import { SysWechatUser } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const editWeChatUserRef = ref<InstanceType<typeof EditWeChatUser>>();
 const state = reactive({