Browse Source

1、字典数据加入tagType、styleSetting、classSetting字段,用于定义在表格中显示的样式
2、字典数据加入extData字段,用于个别业务可能需要根据字段类型来获取复杂的业务配置内容
3、加长remark用于备用
4、”自动生成代码”功能中字典控件改为从本地缓存获取数据

yzp 2 năm trước cách đây
mục cha
commit
22a2fc4975

+ 89 - 62
Admin.NET/Admin.NET.Core/Entity/SysDictData.cs

@@ -1,63 +1,90 @@
-// 麻省理工学院许可证
-//
-// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
-//
-// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
-//
-// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
-// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
-
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 系统字典值表
-/// </summary>
-[SugarTable(null, "系统字典值表")]
-[SysTable]
-public class SysDictData : EntityBase
-{
-    /// <summary>
-    /// 字典类型Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "字典类型Id")]
-    public long DictTypeId { get; set; }
-
-    /// <summary>
-    /// 字典类型
-    /// </summary>
-    [Navigate(NavigateType.OneToOne, nameof(DictTypeId))]
-    public SysDictType DictType { get; set; }
-
-    /// <summary>
-    /// 值
-    /// </summary>
-    [SugarColumn(ColumnDescription = "值", Length = 128)]
-    [Required, MaxLength(128)]
-    public virtual string Value { get; set; }
-
-    /// <summary>
-    /// 编码
-    /// </summary>
-    [SugarColumn(ColumnDescription = "编码", Length = 64)]
-    [Required, MaxLength(64)]
-    public virtual string Code { get; set; }
-
-    /// <summary>
-    /// 排序
-    /// </summary>
-    [SugarColumn(ColumnDescription = "排序")]
-    public int OrderNo { get; set; } = 100;
-
-    /// <summary>
-    /// 备注
-    /// </summary>
-    [SugarColumn(ColumnDescription = "备注", Length = 128)]
-    [MaxLength(128)]
-    public string? Remark { get; set; }
-
-    /// <summary>
-    /// 状态
-    /// </summary>
-    [SugarColumn(ColumnDescription = "状态")]
-    public StatusEnum Status { get; set; } = StatusEnum.Enable;
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 系统字典值表
+/// </summary>
+[SugarTable(null, "系统字典值表")]
+[SysTable]
+public class SysDictData : EntityBase
+{
+    /// <summary>
+    /// 字典类型Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "字典类型Id")]
+    public long DictTypeId { get; set; }
+
+    /// <summary>
+    /// 字典类型
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(DictTypeId))]
+    public SysDictType DictType { get; set; }
+
+    /// <summary>
+    /// 值
+    /// </summary>
+    [SugarColumn(ColumnDescription = "值", Length = 128)]
+    [Required, MaxLength(128)]
+    public virtual string Value { get; set; }
+
+    /// <summary>
+    /// 编码
+    /// </summary>
+    [SugarColumn(ColumnDescription = "编码", Length = 64)]
+    [Required, MaxLength(64)]
+    public virtual string Code { get; set; }
+
+    /// <summary>
+    /// 标签颜色
+    /// </summary>
+    [SugarColumn(ColumnDescription = "标签颜色", Length = 12)]
+    [MaxLength(12)]
+    public string TagType { get; set; }
+
+    /// <summary>
+    /// Style(允许在字典中直接控制显示样式)
+    /// </summary>
+    [SugarColumn(ColumnDescription = "Style", Length = 512)]
+    [MaxLength(512)]
+    public string StyleSetting { get; set; }
+
+    /// <summary>
+    /// Class(允许在字典中直接控制显示样式)
+    /// </summary>
+    [SugarColumn(ColumnDescription = "Class", Length = 512)]
+    [MaxLength(512)]
+    public string ClassSetting { get; set; }
+
+    /// <summary>
+    /// 排序
+    /// </summary>
+    [SugarColumn(ColumnDescription = "排序")]
+    public int OrderNo { get; set; } = 100;
+
+    /// <summary>
+    /// 备注
+    /// </summary>
+    [SugarColumn(ColumnDescription = "备注", Length = 2048)]
+    [MaxLength(2048)]
+    public string Remark { get; set; }
+
+    /// <summary>
+    /// 拓展数据(可用于保存一些业务功能的配置项)
+    /// </summary>
+    [SugarColumn(ColumnDescription = "拓展数据(可用于保存一些业务功能的配置项)", ColumnDataType = SqlSugar.StaticConfig.CodeFirst_BigString)]
+    public string ExtData { get; set; }
+
+    /// <summary>
+    /// 状态
+    /// </summary>
+    [SugarColumn(ColumnDescription = "状态")]
+    public StatusEnum Status { get; set; } = StatusEnum.Enable;
 }

+ 2 - 20
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm

@@ -78,7 +78,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 v-model="ruleForm.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)">
-								@:<el-option v-for="(item,index) in  getEdit@(@column.LowerPropertyName)Data"  :key="index" :value="item.code" :label="item.value"></el-option>
+								@:<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')"  :key="index" :value="item.code" :label="`[${item.code}] ${item.value}`"></el-option>
 								@:
 							</el-select>
 							@:
@@ -174,6 +174,7 @@
 	}
 @if(@Model.TableField.Any(x=>x.EffectType == "Upload")){
     @:import { Plus } from "@@element-plus/icons-vue";
+	@:import { getDictDataList as dl } from '/@@/utils/dict-utils';
     @:import { UploadRequestOptions } from "element-plus";
     @:import {@string.Join(",",Model.TableField.Where(x=>x.EffectType == "Upload").Select(x=>"upload"+x.PropertyName).ToList())} from '/@@/api/main/@(@Model.LowerClassName)';
 }
@@ -187,18 +188,12 @@
 	@:import { get@(@column.FkEntityName)@(@column.PropertyName)Dropdown } from '/@@/api/main/@(@Model.LowerClassName)';
 	}
 	}
-	@if(@Model.TableField.Any(x=>x.EffectType == "Select")){
-	@:import { getDictDataList } from '/@@/api/system/admin';
-	}
 	@if(@Model.TableField.Any(x=>x.EffectType == "EnumSelector")){
 	@:import { getAPI } from '/@@/utils/axios-utils';
 	@:import { SysEnumApi } from '/@@/api-services/api';
 	}
 
 	@foreach (var column in Model.TableField){
-	if(@column.EffectType == "Select"){
-	@:const getEdit@(@column.LowerPropertyName)Data = ref<any>([]);
-	}
 	if(@column.EffectType == "EnumSelector"){
 	@:const getEnum@(@column.PropertyName)Data = ref<any>([]);
 	}
@@ -265,16 +260,6 @@
 		});
 	};
 
-	@foreach (var column in Model.TableField){
-	if(@column.EffectType == "Select"){
-		@:const dictTypeDataList = async (val: any) => {
-		@:let list = await getDictDataList(val);
-		@:return list.data.result ?? [];
-		@:};
-		break;
-	}
-	}
-
 	@foreach (var column in Model.TableField){
 	if(@column.EffectType == "fk" && @column.WhetherAddUpdate == "Y"){
 	@:const @LowerFirstLetter(@column.FkEntityName)@(@column.PropertyName)DropdownList = ref<any>([]); 
@@ -325,9 +310,6 @@
 	// 页面加载时
 	onMounted(async () => {
 		@foreach (var column in Model.TableField){
-		if(@column.EffectType == "Select"){
-		@:getEdit@(@column.LowerPropertyName)Data.value= await dictTypeDataList('@(@column.DictTypeCode)');
-		}
 		if(@column.EffectType == "EnumSelector"){
 			@:getEnum@(@column.PropertyName)Data.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('@(@column.DictTypeCode)')).data.result ?? [];
 		}

+ 10 - 24
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -1,4 +1,4 @@
-@{
+@{
   var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault();
   string pkFieldName = LowerFirstLetter(pkField.PropertyName);
   Dictionary<string, int> definedObjects = new Dictionary<string, int>();
@@ -47,7 +47,7 @@
         }else if(@column.EffectType == "Select"){
         @:<el-form-item label="@column.ColumnComment">
           @:<el-select clearable="" v-model="queryParams.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)">
-            @:<el-option v-for="(item,index) in get@(@column.LowerPropertyName)Data" :key="index" :value="item.code" :label="item.value" />
+            @:<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="item.code" :label="`[${item.code}] ${item.value}`" />
             @:
           </el-select>
           @:
@@ -128,6 +128,13 @@
           @:
         </el-table-column>
         }
+        else if(@column.EffectType == "Select"){
+          @:<el-table-column prop="@column.LowerPropertyName" label="@column.ColumnComment" width="@(column.ColumnComment!=null && column.ColumnComment.Length > 5 ? column.ColumnComment.Length * 15 : 140)" show-overflow-tooltip="" >
+            @:<template #default="scope">
+              @:<el-tag :type="di('@(@column.DictTypeCode)', scope.row.@(@column.LowerPropertyName))?.tagType"> {{di("@(@column.DictTypeCode)", scope.row.@(@column.LowerPropertyName))?.value}} </el-tag>
+            @:</template>
+          @:</el-table-column>
+        }
         else if(@column.EffectType == "EnumSelector"){
           @:<el-table-column prop="@column.LowerPropertyName" label="@column.ColumnComment" width="@(column.ColumnComment!=null && column.ColumnComment.Length > 5 ? column.ColumnComment.Length * 15 : 140)" show-overflow-tooltip="" >
             @:<template #default="scope">
@@ -174,6 +181,7 @@
   @if(@Model.TableField.Any(x=>x.EffectType == "ConstSelector")){
   @:import { codeToName, getConstType } from "/@@/utils/constHelper";
   } 
+  import { getDictDataItem as di, getDictDataList as dl } from '/@@/utils/dict-utils';
   //import { formatDate } from '/@@/utils/formatTime';
 
   import editDialog from '/@@/views/main/@(@Model.LowerClassName)/component/editDialog.vue'
@@ -183,12 +191,6 @@
   @:import { get@(@column.FkEntityName)@(@column.PropertyName)Dropdown } from '/@@/api/main/@(@Model.LowerClassName)';
   }
   }
-  @foreach (var column in Model.QueryWhetherList){
-  if(@column.EffectType == "Select"){
-  @:import { getDictDataList } from '/@@/api/system/admin';
-  break;
-  }
-  }
   @if(@Model.QueryWhetherList.Any(x=>x.EffectType == "EnumSelector")){
 	@:import { getAPI } from '/@@/utils/axios-utils';
 	@:import { SysEnumApi } from '/@@/api-services/api';
@@ -196,9 +198,6 @@
 	}
 
   @foreach (var column in Model.QueryWhetherList){
-  if(@column.EffectType == "Select"){
-  @:const get@(@column.LowerPropertyName)Data = ref<any>([]);
-  }
   if(@column.EffectType == "EnumSelector"){
   @:const getEnum@(@column.PropertyName)Data = ref<any>([]);
   }
@@ -228,9 +227,6 @@
     tableParams.value.total = res.data.result?.total;
     loading.value = false;
   @foreach (var column in Model.QueryWhetherList){
-  if(@column.EffectType == "Select"){
-    @:get@(@column.LowerPropertyName)Data.value = await dictTypeDataList('@(@column.DictTypeCode)');
-  }
   if(@column.EffectType == "EnumSelector"){
     @:getEnum@(@column.PropertyName)Data.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('@(@column.DictTypeCode)')).data.result ?? [];
   }
@@ -287,16 +283,6 @@
 @:
   }
 }
-
-@foreach (var column in Model.QueryWhetherList){
-  if(@column.EffectType == "Select"){
-    @:const dictTypeDataList = async (val: any) => {
-      @:let list = await getDictDataList(val);
-      @:return list.data.result ?? [];
-    @:};
-    break;
-  }
-}
   handleQuery();
 </script>
 

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

@@ -0,0 +1,46 @@
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
+
+
+const stores = useUserInfo();
+const { dictList } = storeToRefs(stores);
+
+// 用于在 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:string): any{
+    const dict = dictList.value.filter(item => item.code === dicName);
+    if (dict.length === 0)
+        return null;
+    const dictData = dict[0].children.filter(item => item.code === dicItemCode);
+    if (dictData.length === 0)
+        return null;
+    return dictData[0];
+}
+
+// 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{
+    const dict = dictList.value.filter(item => item.code === dicName);
+    if (dict.length === 0)
+        return null;
+    return dict[0];
+}
+
+export function getDictDataList(dicName:string): any{
+    const result = getDictType(dicName)?.children;
+    return result ?? [];
+}

+ 9 - 4
Web/src/views/system/dict/component/dictDataDialog.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="sys-dictData-container">
-		<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="950px">
+		<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="980px">
 			<template #header>
 				<div style="color: #fff">
 					<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>
@@ -30,8 +30,12 @@
 			<el-card class="full-table" shadow="hover" style="margin-top: 8px">
 				<el-table :data="state.dictDataData" style="width: 100%" v-loading="state.loading" border>
 					<el-table-column type="index" label="序号" width="55" align="center" />
-					<el-table-column prop="value" label="字典值" header-align="center" show-overflow-tooltip />
-					<el-table-column prop="code" label="编码" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="value" label="字典值" header-align="center" width="140" show-overflow-tooltip >
+						<template #default="scope">
+							<el-tag :type="scope.row.tagType" :style="scope.row.styleSetting" :class="scope.row.classSetting" >{{scope.row.value}}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="code" label="编码" header-align="center" width="90" 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>
@@ -39,8 +43,9 @@
 						</template>
 					</el-table-column>
 					<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
-					<el-table-column prop="createTime" label="修改时间" width="130" align="center" show-overflow-tooltip />
+					<el-table-column prop="createTime" label="修改时间" width="120" align="center" show-overflow-tooltip />
 					<el-table-column prop="remark" label="备注" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="extData" label="拓展数据" header-align="center" show-overflow-tooltip />
 					<el-table-column label="操作" width="140" fixed="right" align="center" show-overflow-tooltip>
 						<template #default="scope">
 							<el-button icon="ele-Edit" size="small" text type="primary" @click="openEditDictData(scope.row)"> 编辑 </el-button>

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

@@ -9,16 +9,37 @@
 			</template>
 			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
 				<el-row :gutter="35">
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="字典值" prop="value" :rules="[{ required: true, message: '字典值不能为空', trigger: 'blur' }]">
 							<el-input v-model="state.ruleForm.value" placeholder="字典值" clearable />
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="编码" prop="code" :rules="[{ required: true, message: '编码不能为空', trigger: 'blur' }]">
 							<el-input v-model="state.ruleForm.code" placeholder="编码" clearable />
 						</el-form-item>
 					</el-col>
+					<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.tagType">
+								<el-radio label="default"><el-tag type="default">主题色</el-tag></el-radio>
+								<el-radio type="success" label="success"><el-tag type="success">success</el-tag></el-radio>
+								<el-radio type="info" label="info"><el-tag type="info">info</el-tag></el-radio>
+								<el-radio type="warning" label="warning"><el-tag type="warning">warning</el-tag></el-radio>
+								<el-radio type="danger" label="danger"><el-tag type="danger" style="font:">danger</el-tag></el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="样式(Style)" prop="styleSetting">
+							<el-input v-model="state.ruleForm.styleSetting" placeholder="样式(Style)" clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="样式(Class)" prop="classSetting">
+							<el-input v-model="state.ruleForm.classSetting" placeholder="样式(Class)" clearable />
+						</el-form-item>
+					</el-col>
 					<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.status">
@@ -34,7 +55,12 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="备注">
-							<el-input v-model="state.ruleForm.remark" placeholder="请输入备注内容" clearable type="textarea" />
+							<el-input v-model="state.ruleForm.remark" placeholder="请输入备注内容" clearable type="textarea" rows="6" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="拓展数据">
+							<el-input v-model="state.ruleForm.extData" placeholder="请输入拓展数据" clearable type="textarea" rows="12" />
 						</el-form-item>
 					</el-col>
 				</el-row>