Просмотр исходного кода

!1492 代码优化
Merge pull request !1492 from 喵你个汪/next

zuohuaijun 1 год назад
Родитель
Сommit
2c8b59cd78

+ 6 - 0
Admin.NET/Admin.NET.Core/Entity/SysCodeGen.cs

@@ -129,4 +129,10 @@ public partial class SysCodeGen : EntityBase
     [SugarColumn(ColumnDescription = "打印模版名称", Length = 32)]
     [MaxLength(32)]
     public string? PrintName { get; set; }
+
+    /// <summary>
+    /// 表唯一字段列表
+    /// </summary>
+    [SugarColumn(IsIgnore = true)]
+    public virtual List<TableUniqueConfigItem> TableUniqueList => string.IsNullOrWhiteSpace(TableUniqueConfig) ? null : JSON.Deserialize<List<TableUniqueConfigItem>>(TableUniqueConfig);
 }

+ 1 - 0
Admin.NET/Admin.NET.Core/Enum/SysUserEventTypeEnum.cs

@@ -9,6 +9,7 @@ namespace Admin.NET.Core;
 /// <summary>
 /// 事件类型-系统用户操作枚举
 /// </summary>
+[SuppressSniffer]
 [Description("事件类型-系统用户操作枚举")]
 public enum SysUserEventTypeEnum
 {

+ 19 - 27
Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenConfig.cs

@@ -74,24 +74,29 @@ public class CodeGenConfig
     /// <summary>
     /// 外键实体名称(首字母小写)
     /// </summary>
-    public string LowerFkEntityName =>
-        string.IsNullOrWhiteSpace(FkEntityName) ? null : FkEntityName[..1].ToLower() + FkEntityName[1..];
+    public string LowerFkEntityName => string.IsNullOrWhiteSpace(FkEntityName) ? null : FkEntityName[..1].ToLower() + FkEntityName[1..];
 
+    /// <summary>
+    /// 外键链接字段
+    /// </summary>
+    public string FkLinkColumnName { get; set; }
+    
     /// <summary>
     /// 外键显示字段
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     public string FkColumnName { get; set; }
-
+    
     /// <summary>
-    /// 外键链接字段
+    /// 外键显示字段
     /// </summary>
-    public string FkLinkColumnName { get; set; }
+    public List<string> FkColumnList { get; set; }
 
     /// <summary>
     /// 外键显示字段(首字母小写)
     /// </summary>
-    public string LowerFkColumnName =>
-        string.IsNullOrWhiteSpace(FkColumnName) ? null : FkColumnName[..1].ToLower() + FkColumnName[1..];
+    public List<string> LowerFkColumnList => FkColumnList?.Select(name => name[..1].ToLower() + name[1..]).ToList();
 
     /// <summary>
     /// 外键显示字段.NET类型
@@ -157,31 +162,18 @@ public class CodeGenConfig
     /// 是否是通用字段
     /// </summary>
     public string WhetherCommon { get; set; }
-
+    
     /// <summary>
-    /// 表的别名 Table as XXX
+    /// 外键显示字段
     /// </summary>
-    public string TableNickName
-    {
-        get
-        {
-            string str = "";
-            if (EffectType == "ForeignKey")
-            {
-                str = LowerFkEntityName + "_FK_" + LowerFkColumnName;
-            }
-            else if (EffectType == "Upload")
-            {
-                str = "sysFile_FK_" + LowerPropertyName;
-            }
-            return str;
-        }
-    }
-
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
+    public string DisplayColumn { get; set; }
+    
     /// <summary>
     /// 显示文本字段
     /// </summary>
-    public string DisplayColumn { get; set; }
+    public List<string> DisplayColumnList { get; set; }
 
     /// <summary>
     /// 选中值字段

+ 7 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenInput.cs

@@ -74,8 +74,15 @@ public class CodeGenInput : BasePageInput
     /// <summary>
     /// 表唯一字段
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     public virtual string TableUniqueConfig { get; set; }
     
+    /// <summary>
+    /// 表唯一字段列表
+    /// </summary>
+    public virtual List<TableUniqueConfigItem> TableUniqueList { get; set; }
+    
     /// <summary>
     /// 菜单应用分类(应用编码)
     /// </summary>

+ 7 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -33,6 +33,8 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
             .Mapper(u =>
             {
                 u.NetType = (u.EffectType == "EnumSelector" || u.EffectType == "ConstSelector" ? u.DictTypeCode : u.NetType);
+                u.DisplayColumnList = u.DisplayColumn?.Split(",").ToList();
+                u.FkColumnList = u.FkColumnName?.Split(",").ToList();
             })
             .OrderBy(u => new { u.OrderNo, u.Id })
             .ToListAsync();
@@ -48,6 +50,11 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
     public async Task UpdateCodeGenConfig(List<CodeGenConfig> inputList)
     {
         if (inputList == null || inputList.Count < 1) return;
+        inputList.ForEach(e =>
+        {
+            e.DisplayColumn = e.DisplayColumnList?.Count > 0 ? string.Join(",", e.DisplayColumnList) : null;
+            e.FkColumnName = e.FkColumnList?.Count > 0 ? string.Join(",", e.FkColumnList) : null;
+        });
         await _db.Updateable(inputList.Adapt<List<SysCodeGenConfig>>())
             .IgnoreColumns(u => new { u.ColumnLength, u.ColumnName, u.PropertyName })
             .ExecuteCommandAsync();

+ 7 - 33
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -5,7 +5,6 @@
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 using System.IO.Compression;
-using NewLife.Serialization;
 
 namespace Admin.NET.Core.Service;
 
@@ -56,8 +55,9 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     public async Task AddCodeGen(AddCodeGenInput input)
     {
         var isExist = await _db.Queryable<SysCodeGen>().Where(u => u.TableName == input.TableName).AnyAsync();
-        if (isExist)
-            throw Oops.Oh(ErrorCodeEnum.D1400);
+        if (isExist) throw Oops.Oh(ErrorCodeEnum.D1400);
+
+        if (input.TableUniqueList?.Count > 0) input.TableUniqueConfig = JSON.Serialize(input.TableUniqueList);
 
         var codeGen = input.Adapt<SysCodeGen>();
         var newCodeGen = await _db.Insertable(codeGen).ExecuteReturnEntityAsync();
@@ -76,9 +76,9 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     public async Task UpdateCodeGen(UpdateCodeGenInput input)
     {
         var isExist = await _db.Queryable<SysCodeGen>().AnyAsync(u => u.TableName == input.TableName && u.Id != input.Id);
-        if (isExist)
-            throw Oops.Oh(ErrorCodeEnum.D1400);
+        if (isExist) throw Oops.Oh(ErrorCodeEnum.D1400);
 
+        if (input.TableUniqueList?.Count > 0) input.TableUniqueConfig = JSON.Serialize(input.TableUniqueList);
         var codeGen = input.Adapt<SysCodeGen>();
         await _db.Updateable(codeGen).ExecuteCommandAsync();
 
@@ -347,7 +347,6 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         var tableFieldList = await _codeGenConfigService.GetList(new CodeGenConfig() { CodeGenId = input.Id }); // 字段集合
         var queryWhetherList = tableFieldList.Where(u => u.QueryWhether == YesNoEnum.Y.ToString()).ToList(); // 前端查询集合
         var joinTableList = tableFieldList.Where(u => u.EffectType == "Upload" || u.EffectType == "ForeignKey" || u.EffectType == "ApiTreeSelector").ToList(); // 需要连表查询的字段
-        (string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList); // 获取连表的实体名和别名
 
         var data = new CustomViewEngine(_db)
         {
@@ -357,7 +356,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             NameSpace = input.NameSpace,
             ClassName = input.TableName,
             PagePath = input.PagePath,
-            TableUniqueList = input.TableUniqueConfig?.ToJsonEntity<List<TableUniqueConfigItem>>() ?? new(),
+            TableUniqueList = input.TableUniqueList ?? new(),
             ProjectLastName = input.NameSpace.Split('.').Last(),
             QueryWhetherList = queryWhetherList,
             TableField = tableFieldList,
@@ -415,7 +414,6 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         var tableFieldList = await _codeGenConfigService.GetList(new CodeGenConfig() { CodeGenId = input.Id }); // 字段集合
         var queryWhetherList = tableFieldList.Where(u => u.QueryWhether == YesNoEnum.Y.ToString()).ToList(); // 前端查询集合
         var joinTableList = tableFieldList.Where(u => u.EffectType == "Upload" || u.EffectType == "ForeignKey" || u.EffectType == "ApiTreeSelector").ToList(); // 需要连表查询的字段
-        (string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList); // 获取连表的实体名和别名
 
         var data = new CustomViewEngine(_db)
         {
@@ -425,7 +423,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             NameSpace = input.NameSpace,
             ClassName = input.TableName,
             PagePath = input.PagePath,
-            TableUniqueList = input.TableUniqueConfig?.ToJsonEntity<List<TableUniqueConfigItem>>() ?? new(),
+            TableUniqueList = input.TableUniqueList ?? new(),
             ProjectLastName = input.NameSpace.Split('.').Last(),
             QueryWhetherList = queryWhetherList,
             TableField = tableFieldList,
@@ -460,30 +458,6 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         return result;
     }
 
-    /// <summary>
-    /// 获取连表的实体名和别名
-    /// </summary>
-    /// <param name="configs"></param>
-    /// <returns></returns>
-    private static (string, string) GetJoinTableStr(List<CodeGenConfig> configs)
-    {
-        var uploads = configs.Where(u => u.EffectType == "Upload").ToList();
-        var fks = configs.Where(u => u.EffectType == "ForeignKey").ToList();
-        string str = ""; // <Order, OrderItem, Custom>
-        string lowerStr = ""; // (o, i, c)
-        foreach (var item in uploads)
-        {
-            lowerStr += "sysFile_FK_" + item.LowerPropertyName + ",";
-            str += "SysFile,";
-        }
-        foreach (var item in fks)
-        {
-            lowerStr += item.LowerFkEntityName + "_FK_" + item.LowerFkColumnName + ",";
-            str += item.FkEntityName + ",";
-        }
-        return (str.TrimEnd(','), lowerStr.TrimEnd(','));
-    }
-
     /// <summary>
     /// 增加菜单
     /// </summary>

+ 13 - 14
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/editDialog.vue.vm

@@ -1,4 +1,5 @@
 @{
+	var hasDictData = Model.TableField.Any(x => x.EffectType == "ConstSelector" || x.EffectType == "DictSelector" || x.EffectType == "EnumSelector");
 	bool IsStatusEnum(dynamic column) => column.NetType == "StatusEnum" && column.PropertyName == "Status";
 	string LowerFirstLetter(string text) => text.ToString()[..1].ToLower() + text[1..];
 	var definedObjects = new Dictionary<string, int>();
@@ -78,7 +79,7 @@
 							@:<el-switch v-model="ruleForm.@column.LowerPropertyName" :active-value="1" :inactive-value="2" size="small" />
 							} else {
 							@:<el-select clearable filterable v-model="ruleForm.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
-								@:<el-option v-for="(item, index) in dl('@(column.DictTypeCode)')"  :key="index" :value="@(column.NetType.StartsWith("string") ? "item.code" : "Number(item.code)")" :label="`[${item.code}] ${item.value}`"></el-option>
+								@:<el-option v-for="(item, index) in getDictDataByCode('@(column.DictTypeCode)')"  :key="index" :value="item.code" :label="`[${item.code}]${item.value}`"></el-option>
 							@:</el-select>
 							}
 						</el-form-item>
@@ -87,7 +88,7 @@
 					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						@:<el-form-item label="@column.ColumnComment" prop="@(column.LowerPropertyName)">
 							@:<el-select clearable filterable v-model="ruleForm.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
-								@:<el-option v-for="(item,index) in getConstType('@column.DictTypeCode')" :key="index" :label="item.name" :value="@(column.NetType.StartsWith("string") ? "item.code" : "Number(item.code)")">{{ item.name }}</el-option>
+								@:<el-option v-for="(item, index) in getConstDataByType('@column.DictTypeCode')" :key="index" :label="item.name" :value="item.code">{{ item.name }}</el-option>
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -144,14 +145,8 @@
 	import { ref,onMounted } from "vue";
 	import { ElMessage } from "element-plus";
 	import type { FormRules } from "element-plus";
-@if(Model.TableField.Any(x=>x.EffectType == "ConstSelector")){
-	@:import { getConstType } from "/@@/utils/constHelper";
-} 
-@if(Model.TableField.Any(x=>x.EffectType == "DictSelector") || @Model.TableField.Any(x=>x.EffectType == "EnumSelector")){
-	@:import { getDictDataItem as di, getDictDataList as dl } from '/@@/utils/dict-utils';
-}
-@if(Model.TableField.Any(x=>x.EffectType == "EnumSelector")){
-	@:import { getDictLabelByVal as dv } from '/@@/utils/dict-utils';
+@if(hasDictData) {
+	@:import { useUserInfo } from "/@@/stores/userInfo";
 }
 @if(Model.TableField.Any(x=>x.EffectType == "DatePicker")){
   	@:import { formatDate } from '/@@/utils/formatTime';
@@ -159,13 +154,12 @@
 @if(Model.TableField.Any(x=>x.EffectType == "Upload")){
     @:import { Plus } from "@@element-plus/icons-vue";
     @:import { UploadRequestOptions } from "element-plus";
-}
-@if(Model.TableField.Any(x=>x.EffectType == "EnumSelector")){
-	@:import { getAPI } from '/@@/utils/axios-utils';
-	@:import { SysEnumApi } from '/@@/api-services/api';
 }
 	import { use@(Model.ClassName)Api } from '/@@/api/@(Model.PagePath)/@(Model.LowerClassName)';
 
+@if(hasDictData) {
+	@:const getDictDataByCode = useUserInfo().getDictDataByCode;
+}
 	//父级传递来的参数
 	var props = defineProps({
 		title: {
@@ -197,6 +191,11 @@
 
 	});
 
+	@if(Model.TableField.Any(x=>x.EffectType == "ConstSelector")){
+	@:// 获取根据常量类型获取常量数据列表
+	@:const getConstDataByType = (type: string) => useUserInfo().constList?.find(x => x.code == type)?.data?.result ?? [];
+	}
+
 	// 打开弹窗
 	const openDialog = async (row: any) => {
 		// ruleForm.value = JSON.parse(JSON.stringify(row));

+ 5 - 3
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/index.vue.vm

@@ -52,7 +52,7 @@
             }else if(column.EffectType == "DictSelector" || column.EffectType == "EnumSelector"){
             @:<el-form-item label="@column.ColumnComment">
               @:<el-select clearable filterable v-model="queryParams.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
-                @:<el-option v-for="(item,index) in dl('@(column.DictTypeCode)')" :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
+                @:<el-option v-for="(item,index) in getDictDataByCode('code_gen_create_type')('@(column.DictTypeCode)')" :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
               @:</el-select>
             @:</el-form-item>
             }else if(column.EffectType == "ApiTreeSelector"){
@@ -221,7 +221,7 @@
   @:import { codeToName, getConstType } from '/@@/utils/constHelper';
   }
   @if(Model.TableField.Any(x => x.EffectType == "DictSelector" || x.EffectType == "EnumSelector")) {
-  @:import { getDictDataList as dl } from '/@@/utils/dict-utils';
+  @:import { useUserInfo } from "/@@/stores/userInfo";
   }
   @if(Model.PrintType == "custom") {
   @:// 推荐设置操作 width 为 200
@@ -239,7 +239,9 @@
   import printDialog from '/@@/views/system/print/component/hiprint/preview.vue'
   import ModifyRecord from '/@@/components/table/modifyRecord.vue';
   import { use@(Model.ClassName)Api} from '/@@/api/@(Model.PagePath)/@(Model.LowerClassName)';
-  
+  @if(Model.TableField.Any(x => x.EffectType == "DictSelector" || x.EffectType == "EnumSelector")) {
+  @:const getDictDataByCode = useUserInfo().getDictDataByCode;
+  }
   const showAdvanceQueryUI = ref(@(haveLikeCdt ? "false" : "true"));
   const @(Model.LowerClassName)Api = use@(Model.ClassName)Api();
   const printDialogRef = ref();

+ 3 - 4
Web/src/views/home/notice/index.vue

@@ -29,15 +29,13 @@
 				</el-table-column>
 				<el-table-column prop="sysNotice.type" label="类型" width="100" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag v-if="scope.row.sysNotice.type === 1"> 通知 </el-tag>
-						<el-tag type="warning" v-else> 公告 </el-tag>
+            <DictLabel :value="scope.row.sysNotice.type" code="NoticeTypeEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="sysNotice.createTime" label="创建时间" align="center" show-overflow-tooltip />
 				<el-table-column prop="readStatus" label="阅读状态" width="100" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="info" v-if="scope.row.readStatus === 1"> 已读 </el-tag>
-						<el-tag type="danger" v-else> 未读 </el-tag>
+            <DictLabel :value="scope.row.readStatus" code="NoticeUserStatusEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="sysNotice.publicUserName" label="发布者" align="center" show-overflow-tooltip />
@@ -87,6 +85,7 @@ import commonFunction from '/@/utils/commonFunction';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysNoticeApi } from '/@/api-services/api';
 import { SysNoticeUser } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const { removeHtml } = commonFunction();
 const state = reactive({

+ 4 - 5
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -146,18 +146,18 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<template v-if="state.ruleForm.tableUniqueList != undefined && state.ruleForm.tableUniqueList.length > 0">
 							<el-row :gutter="35" v-for="(v, k) in state.ruleForm.tableUniqueList" :key="k">
-								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+								<el-col :xs="24" :sm="14" :md="14" :lg="14" :xl="14" class="mb20">
 									<el-form-item label="字段" :prop="`tableUniqueList[${k}].columns`" :rules="[{ required: true, message: `字段不能为空`, trigger: 'blur' }]">
 										<template #label>
 											<el-button icon="ele-Delete" type="danger" circle plain size="small" @click="() => state.ruleForm.tableUniqueList?.splice(k, 1)" />
 											<span class="ml5">字段</span>
 										</template>
-										<el-select v-model="state.ruleForm.tableUniqueList[k].columns" @change="(val: any) => changeTableUniqueColumn(val, k)" multiple filterable clearable class="w100">
+										<el-select v-model="state.ruleForm.tableUniqueList[k].columns" @change="(val: any) => changeTableUniqueColumn(val, k)" multiple filterable clearable collapse-tags collapse-tags-tooltip class="w100">
 											<el-option v-for="item in state.columnData" :key="item.columnName" :label="item.columnName + ' [' + item.columnComment + ']'" :value="item.columnName" />
 										</el-select>
 									</el-form-item>
 								</el-col>
-								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+								<el-col :xs="24" :sm="10" :md="10" :lg="10" :xl="10" class="mb20">
 									<el-form-item label="描述信息" :prop="`tableUniqueList[${k}].message`" :rules="[{ required: true, message: `描述信息不能为空`, trigger: 'blur' }]">
 										<el-input v-model="state.ruleForm.tableUniqueList[k].message" clearable placeholder="请输入" />
 									</el-form-item>
@@ -264,7 +264,6 @@ 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();
@@ -285,7 +284,7 @@ const cancel = () => {
 const submit = () => {
 	ruleFormRef.value.validate(async (valid: boolean) => {
 		if (!valid) return;
-		state.ruleForm.tableUniqueConfig = state.ruleForm.tableUniqueList?.length > 0 ? JSON.stringify(state.ruleForm.tableUniqueList) : undefined;
+    if (state.ruleForm.tableUniqueList?.length === 0) state.ruleForm.tableUniqueList = null;
 		if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
 			await getAPI(SysCodeGenApi).apiSysCodeGenUpdatePost(state.ruleForm as UpdateCodeGenInput);
 		} else {

+ 8 - 10
Web/src/views/system/codeGen/component/fkDialog.vue

@@ -24,8 +24,8 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="显示字段" prop="columnNames" :rules="[{ required: true, message: '显示字段不能为空', trigger: 'blur' }]">
-							<el-select v-model="state.ruleForm.columnNames" multiple filterable class="w100">
+						<el-form-item label="显示字段" prop="fkColumnList" :rules="[{ required: true, message: '显示字段不能为空', trigger: 'blur' }]">
+							<el-select v-model="state.ruleForm.fkColumnList" multiple filterable class="w100">
 								<el-option v-for="item in state.columnData" :key="item.columnName" :label="item.columnName + ' [' + item.columnComment + ']'" :value="item.columnName" />
 							</el-select>
 						</el-form-item>
@@ -83,8 +83,8 @@ const DbChanged = async () => {
 const TableChanged = async () => {
 	state.columnData = [];
 	await getColumnInfoList();
-	state.ruleForm.columnNames = undefined;
-	state.ruleForm.linkColumnName = undefined;
+  state.ruleForm.fkColumnList = null;
+  state.ruleForm.linkColumnName = null;
 };
 
 const getDbList = async () => {
@@ -110,12 +110,12 @@ const openDialog = async (row: any) => {
 	rowdata = row;
 	if (rowdata.fkConfigId) {
 		await getDbList();
+    state.ruleForm.configId = rowdata.fkConfigId;
 		state.ruleForm.tableName = rowdata.fkTableName;
-		state.ruleForm.columnNames = rowdata.fkColumnName?.split(",");
-		state.ruleForm.linkColumnName = rowdata.fkLinkColumnName;
-		state.ruleForm.configId = rowdata.fkConfigId;
 		await DbChanged();
 		await TableChanged();
+    state.ruleForm.fkColumnList = rowdata.fkColumnList;
+    state.ruleForm.linkColumnName = rowdata.fkLinkColumnName;
 	}
 	state.isShowDialog = true;
 };
@@ -125,7 +125,7 @@ const closeDialog = () => {
 	rowdata.fkTableName = state.ruleForm.tableName;
 	let tableData = state.tableData.filter((x: any) => x.tableName == state.ruleForm.tableName);
 	rowdata.fkEntityName = tableData.length == 0 ? '' : tableData[0].entityName;
-	rowdata.fkColumnName = state.ruleForm.fkColumnName;
+	rowdata.fkColumnList = state.ruleForm.fkColumnList;
 	rowdata.fkLinkColumnName = state.ruleForm.linkColumnName;
 	rowdata.fkConfigId = state.ruleForm.configId;
 	let columnData = state.columnData.filter((x: any) => x.columnName == state.ruleForm.columnName);
@@ -148,8 +148,6 @@ const cancel = () => {
 const submit = () => {
 	ruleFormRef.value.validate(async (valid: boolean) => {
 		if (!valid) return;
-		state.ruleForm.fkColumnName = state.ruleForm.columnNames.join()
-		state.ruleForm.columnNames = undefined;
 		closeDialog();
 	});
 };

+ 13 - 15
Web/src/views/system/codeGen/component/genConfigDialog.vue

@@ -9,14 +9,14 @@
 			</template>
 			<el-table :data="state.tableData" style="width: 100%" v-loading="state.loading" border>
 				<el-table-column type="index" label="序号" width="55" align="center" />
-				<el-table-column prop="propertyName" label="实体属性" width="180" show-overflow-tooltip />
-				<el-table-column prop="columnComment" label="描述" width="180" show-overflow-tooltip>
+				<el-table-column prop="propertyName" label="实体属性" show-overflow-tooltip />
+				<el-table-column prop="columnComment" label="描述" show-overflow-tooltip>
 					<template #default="scope">
 						<el-input v-model="scope.row.columnComment" autocomplete="off" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="netType" label="数据类型" min-width="90" show-overflow-tooltip />
-				<el-table-column prop="effectType" label="作用类型" width="140" show-overflow-tooltip>
+				<el-table-column prop="netType" label="数据类型" width="130" show-overflow-tooltip />
+				<el-table-column prop="effectType" label="作用类型" width="150" show-overflow-tooltip>
 					<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)">
@@ -25,7 +25,6 @@
 							<el-button
 								v-if="scope.row.effectType === 'ApiTreeSelector' || scope.row.effectType === 'ForeignKey'"
 								:icon="Edit"
-								type="dashed"
 								title="修改"
 								link
 								@click="effectTypeChange(scope.row, scope.$index)"
@@ -33,7 +32,7 @@
 						</div>
 					</template>
 				</el-table-column>
-				<el-table-column prop="dictTypeCode" label="字典" width="180" show-overflow-tooltip>
+				<el-table-column prop="dictTypeCode" label="字典" width="150" show-overflow-tooltip>
 					<template #default="scope">
 						<el-select v-model="scope.row.dictTypeCode" class="m-2" :disabled="effectTypeEnable(scope.row)">
 							<el-option
@@ -44,45 +43,44 @@
 						</el-select>
 					</template>
 				</el-table-column>
-
-				<el-table-column prop="whetherTable" label="列表显示" width="85" align="center" show-overflow-tooltip>
+				<el-table-column prop="whetherTable" label="列表显示" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-checkbox v-model="scope.row.whetherTable" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="whetherAddUpdate" label="增改" width="80" align="center" show-overflow-tooltip>
+				<el-table-column prop="whetherAddUpdate" label="增改" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-checkbox v-model="scope.row.whetherAddUpdate" :disabled="judgeColumns(scope.row)" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="whetherImport" label="导入" width="80" align="center" show-overflow-tooltip>
+				<el-table-column prop="whetherImport" label="导入" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-checkbox v-model="scope.row.whetherImport" :disabled="judgeColumns(scope.row)" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="whetherRequired" label="必填" width="80" align="center" show-overflow-tooltip>
+				<el-table-column prop="whetherRequired" label="必填" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-checkbox v-model="scope.row.whetherRequired" :disabled="judgeColumns(scope.row)" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="whetherSortable" label="可排序" width="80" align="center" show-overflow-tooltip>
+				<el-table-column prop="whetherSortable" label="可排序" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-checkbox v-model="scope.row.whetherSortable" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="queryWhether" label="是否是查询" min-width="80" align="center" show-overflow-tooltip>
+				<el-table-column prop="queryWhether" label="查询" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-switch v-model="scope.row.queryWhether" :active-value="true" :inactive-value="false" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="queryType" label="查询方式" min-width="120" align="center" show-overflow-tooltip>
+				<el-table-column prop="queryType" label="查询方式" width="110" 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 getDictDataByCode('code_gen_query_type')" :key="item.code" :label="item.value" :value="item.code" />
 						</el-select>
 					</template>
 				</el-table-column>
-				<el-table-column prop="orderNo" label="排序" width="100" show-overflow-tooltip>
+				<el-table-column prop="orderNo" label="排序" width="80" show-overflow-tooltip>
 					<template #default="scope">
 						<el-input v-model="scope.row.orderNo" autocomplete="off" type="number" />
 					</template>

+ 9 - 9
Web/src/views/system/codeGen/component/treeDialog.vue

@@ -24,8 +24,8 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="显示字段" prop="displayColumns" :rules="[{ required: true, message: '显示字段不能为空', trigger: 'blur' }]">
-							<el-select v-model="state.ruleForm.displayColumns" multiple filterable class="w100">
+						<el-form-item label="显示字段" prop="displayColumnList" :rules="[{ required: true, message: '显示字段不能为空', trigger: 'blur' }]">
+							<el-select v-model="state.ruleForm.displayColumnList" multiple filterable class="w100">
 								<el-option v-for="item in state.columnData" :key="item.columnName" :label="item.columnName + ' [' + item.columnComment + ']'" :value="item.columnName" />
 							</el-select>
 						</el-form-item>
@@ -90,7 +90,7 @@ const DbChanged = async () => {
 const TableChanged = async () => {
 	state.columnData = [];
 	await getColumnInfoList();
-	state.ruleForm.displayColumns = undefined;
+	state.ruleForm.displayColumnList = undefined;
 	state.ruleForm.valueColumn = undefined;
 	state.ruleForm.pidColumn = undefined;
 };
@@ -119,13 +119,15 @@ const openDialog = async (row: any) => {
 	ruleFormRef.value?.resetFields();
 	if (rowdata.fkConfigId) {
 		await getDbList();
+    state.ruleForm.configId = rowdata.fkConfigId;
 		state.ruleForm.tableName = rowdata.fkTableName;
-		state.ruleForm.displayColumns = rowdata.displayColumn?.split(",");
-		state.ruleForm.valueColumn = rowdata.valueColumn;
-		state.ruleForm.pidColumn = rowdata.pidColumn;
-		state.ruleForm.configId = rowdata.fkConfigId;
+
 		await DbChanged();
 		await TableChanged();
+
+    state.ruleForm.pidColumn = rowdata.pidColumn;
+    state.ruleForm.valueColumn = rowdata.valueColumn;
+    state.ruleForm.displayColumnList = rowdata.displayColumnList;
 	}
 };
 
@@ -160,8 +162,6 @@ const cancel = () => {
 const submit = () => {
 	ruleFormRef.value.validate(async (valid: boolean) => {
 		if (!valid) return;
-		state.ruleForm.displayColumn = state.ruleForm.displayColumns.join()
-		state.ruleForm.displayColumns = undefined;
 		closeDialog();
 	});
 };

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

@@ -30,12 +30,7 @@
 				<el-table-column prop="authorName" label="作者姓名" align="center" show-overflow-tooltip />
 				<el-table-column prop="generateType" label="生成方式" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag v-if="scope.row.generateType == 100"> 下载压缩包 </el-tag>
-						<el-tag v-else-if="scope.row.generateType == 111"> 下载压缩包(前端) </el-tag>
-						<el-tag v-else-if="scope.row.generateType == 121"> 下载压缩包(后端) </el-tag>
-						<el-tag v-else-if="scope.row.generateType == 211"> 生成到本项目(前端) </el-tag>
-						<el-tag v-else-if="scope.row.generateType == 221"> 生成到本项目(后端) </el-tag>
-						<el-tag type="danger" v-else> 生成到本项目 </el-tag>
+            <DictLabel :value="scope.row.generateType" code="code_gen_create_type" />
 					</template>
 				</el-table-column>
 				<el-table-column label="操作" width="280" fixed="right" align="center" show-overflow-tooltip>
@@ -79,6 +74,7 @@ import { downloadByUrl } from '/@/utils/download';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysCodeGenApi } from '/@/api-services/api';
 import { SysCodeGen } from '/@/api-services/models';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 const PreviewDialog = defineAsyncComponent(() => import('./component/previewDialog.vue'));
 

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

@@ -11,8 +11,7 @@
 					<el-button v-if="state.selectlist.length > 0" type="danger" icon="ele-Delete" @click="bacthDelete" v-auth="'sysConfig:batchDelete'"> 批量删除 </el-button>
 				</template>
 				<template #sysFlag="scope">
-					<el-tag v-if="scope.row.sysFlag === 1"> 是 </el-tag>
-					<el-tag type="danger" v-else> 否 </el-tag>
+          <DictLabel :value="scope.row.sysFlag" code="YesNoEnum" />
 				</template>
 				<template #remark="scope">
 					<ModifyRecord :data="scope.row" />
@@ -37,6 +36,7 @@ import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysConfigApi } from '/@/api-services/api';
 import { auth } from '/@/utils/authFunction';
+import DictLabel from "/@/components/table/dictLabel.vue";
 
 // 引入组件
 const Table = defineAsyncComponent(() => import('/@/components/table/index.vue'));