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

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

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

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -32,7 +32,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
             .Select<CodeGenConfig>()
             .Mapper(u =>
             {
-                u.NetType = (u.EffectType is "EnumSelector" or "ConstSelector" ? u.DictTypeCode : u.NetType);
+                u.NetType = (u.EffectType == "EnumSelector" ? u.DictTypeCode : u.NetType);
                 u.FkDisplayColumnList = u.FkDisplayColumns?.Split(",").ToList();
             })
             .OrderBy(u => new { u.OrderNo, u.Id })

+ 27 - 36
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -680,14 +680,8 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// <returns></returns>
     private static List<string> GetTemplatePathList(SysCodeGen input)
     {
-        if (input.GenerateType!.Substring(1, 1).Contains('1'))
-        {
-            return new() { "index.vue.vm", "editDialog.vue.vm", "api.ts.vm" };
-        }
-        if (input.GenerateType.Substring(1, 1).Contains('2'))
-        {
-            return new() { "Service.cs.vm", "Input.cs.vm", "Output.cs.vm", "Dto.cs.vm" };
-        }
+        if (input.GenerateType!.Substring(1, 1).Contains('1')) return new() { "index.vue.vm", "editDialog.vue.vm", "api.ts.vm" };
+        if (input.GenerateType.Substring(1, 1).Contains('2')) return new() { "Service.cs.vm", "Input.cs.vm", "Output.cs.vm", "Dto.cs.vm" };
         return new() { "Service.cs.vm", "Input.cs.vm", "Output.cs.vm", "Dto.cs.vm", "index.vue.vm", "editDialog.vue.vm", "api.ts.vm" };
     }
 
@@ -725,7 +719,8 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                 apiJsPath
             };
         }
-        else if (input.GenerateType.Substring(1, 1).Contains('2'))
+
+        if (input.GenerateType.Substring(1, 1).Contains('2'))
         {
             // 生成到本项目(后端)
             return new List<string>()
@@ -736,20 +731,17 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                 viewPath,
             };
         }
-        else
-        {
-            // 前后端同时生成到本项目
-            return new List<string>()
-            {
-                servicePath,
-                inputPath,
-                outputPath,
-                viewPath,
-                indexPath,
-                formModalPath,
-                apiJsPath
-            };
-        }
+        // 前后端同时生成到本项目
+        return new List<string>()
+        {
+            servicePath,
+            inputPath,
+            outputPath,
+            viewPath,
+            indexPath,
+            formModalPath,
+            apiJsPath
+        };
     }
 
     /// <summary>
@@ -780,7 +772,8 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                 apiJsPath
             };
         }
-        else if (input.GenerateType.StartsWith("12"))
+
+        if (input.GenerateType.StartsWith("12"))
         {
             return new List<string>()
             {
@@ -790,18 +783,16 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                 viewPath
             };
         }
-        else
+
+        return new List<string>()
         {
-            return new List<string>()
-            {
-                servicePath,
-                inputPath,
-                outputPath,
-                viewPath,
-                indexPath,
-                formModalPath,
-                apiJsPath
-            };
-        }
+            servicePath,
+            inputPath,
+            outputPath,
+            viewPath,
+            indexPath,
+            formModalPath,
+            apiJsPath
+        };
     }
 }

+ 9 - 3
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Service.cs.vm

@@ -44,12 +44,18 @@ public class @(Model.ClassName)Service : IDynamicApiController, ITransient
           var queryFields = Model.TableField.Where(u => u.WhetherQuery == "Y");
           // 关键字模糊查询
           if (queryFields.Any(u => u.QueryType == "like")) {
-            @:.WhereIF(!string.IsNullOrEmpty(input.Keyword), u => @string.Join(" || ", queryFields.Where(u => u.QueryType == "like").Select(col => $"u.{col.PropertyName}.Contains(input.Keyword)")))
+            @:.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => @string.Join(" || ", queryFields.Where(u => u.QueryType == "like").Select(col => $"u.{col.PropertyName}.Contains(input.Keyword)")))
           }
+
+          // 单字段模糊查询
+          foreach(var column in queryFields.Where(u => u.QueryType == "like")) {
+            @:.WhereIF(!string.IsNullOrWhiteSpace(input.@(column.PropertyName)), u => u.@(column.PropertyName).Contains(input.@(column.PropertyName).Trim()))
+          }
+
           // 字段组合查询
-          foreach(var column in queryFields) {
+          foreach(var column in queryFields.Where(u => u.QueryType != "like")) {
             if (column.NetType.TrimEnd('?') == "string") {
-            @:.WhereIF(!string.IsNullOrWhiteSpace(input.@(column.PropertyName)), u => u.@(column.PropertyName)@(column.QueryType == "like" ? $".Contains(input.{column.PropertyName}.Trim())" : $" {column.QueryType} input.{column.PropertyName}.Trim()"))
+            @:.WhereIF(!string.IsNullOrWhiteSpace(input.@(column.PropertyName)), u => u.@(column.PropertyName) == input.@(column.PropertyName))
             } else if (column.NetType.TrimEnd('?') == "int" || column.NetType.TrimEnd('?') == "long") {
             @:.WhereIF(input.@(column.PropertyName) != null, u => u.@(column.PropertyName) @(column.QueryType) input.@(column.PropertyName))
             } else if (column.NetType.TrimEnd('?').EndsWith("Enum")) {

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

@@ -41,7 +41,7 @@ onMounted(async () => {
   @if (Model.DropdownFieldList.Count > 0) {
   @:const data = await @(Model.LowerClassName)Api.getDropdownData(false).then(res => res.data.result) ?? {};
   @foreach (var column in Model.DropdownFieldList) {
-  @:state.dropdownData.@(column.LowerPropertyName) = data.@(column.LowerPropertyName);
+  @:state.dropdownData.@(column.LowerPropertyName) = data.@(column.LowerPropertyName) ?? [];
   }
   }
 });
@@ -108,7 +108,7 @@ defineExpose({ openDialog });
 						if (column.IsSelectorEffectType) {
 							if (column.EffectType == "ApiTreeSelector") {
 							@:<el-cascader
-								@::options="state.dropdownData.@(column.LowerPropertyName) ?? []"
+								@::options="state.dropdownData.@(column.LowerPropertyName)"
 								@::props="{ checkStrictly: true, emitPath: false }"
 								@:v-model="state.ruleForm.@(column.LowerPropertyName)"
 								@:placeholder="请选择@(column.ColumnComment)"
@@ -123,11 +123,11 @@ defineExpose({ openDialog });
 							} else {
 							@:<el-select clearable filterable v-model="state.ruleForm.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
 								if (column.EffectType == "ForeignKey") {
-								@:<el-option v-for="(item,index) in state.dropdownData.@(column.LowerPropertyName) ?? []" :key="index" :value="item.value" :label="item.label" />
+								@:<el-option v-for="(item,index) in state.dropdownData.@(column.LowerPropertyName)" :key="index" :value="item.value" :label="item.label" />
 								} else if (column.EffectType == "ConstSelector") {
-								@:<el-option v-for="(item, index) in state.stores.getConstDataByType('@column.DictTypeCode') ?? []" :key="index" :label="item.name" :value="item.code" />
+								@:<el-option v-for="(item, index) in state.stores.getConstDataByTypeCode('@column.DictTypeCode')" :key="index" :label="item.name" :value="item.code" />
 								} else if (column.EffectType == "DictSelector" || column.EffectType == "EnumSelector") {
-								@:<el-option v-for="(item, index) in state.stores.getDictDataByCode('@(column.DictTypeCode)') ?? []"  :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
+								@:<el-option v-for="(item, index) in state.stores.getDictDataByCode('@(column.DictTypeCode)')"  :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
 								}
 							@:</el-select>
 							}

+ 18 - 32
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/index.vue.vm

@@ -1,20 +1,15 @@
 <script lang="ts" setup name="@(Model.LowerClassName)">
 import { ref, reactive, onMounted } from "vue";
 import { auth } from '/@@/utils/authFunction';
-import { getAPI } from '/@@/utils/axios-utils';
 import { ElMessageBox, ElMessage } from "element-plus";
 import { downloadStreamFile } from "/@@/utils/downloadFile";
-@if(Model.TableField.Any(x => x.EffectType == "ConstSelector")) {
-@:import { codeToName, getConstType } from '/@@/utils/constHelper';
-}
-@if(Model.TableField.Any(x => x.EffectType == "DatePicker")) {
-@:import { formatDate } from '/@@/utils/formatTime';
-}
 @if(Model.PrintType == "custom") {
 @:// 推荐设置操作 width 为 200
 @:import { hiprint } from 'vue-plugin-hiprint';
+@:import { getAPI } from '/@@/utils/axios-utils';
 @:import { SysPrintApi } from '/@@/api-services/api';
 @:import { SysPrint } from '/@@/api-services/models';
+@:import { formatDate } from '/@@/utils/formatTime';
 }
 import { use@(Model.ClassName)Api } from '/@@/api/@(Model.PagePath)/@(Model.LowerClassName)';
 @if(Model.HasDictField || Model.HasEnumField || Model.HasConstField) {
@@ -148,27 +143,24 @@ handleQuery();
           }
           foreach (var column in Model.QueryWhetherList) {
           @:<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
-            if(column.EffectType == "Input" || column.EffectType == "InputTextArea"){
             @:<el-form-item label="@column.ColumnComment">
+            if(column.EffectType == "Input" || column.EffectType == "InputTextArea"){
               @:<el-input v-model="state.tableQueryParams.@(column.LowerPropertyName)" clearable placeholder="请输入@(column.ColumnComment)"/>
-            @:</el-form-item>
             }else if(column.EffectType == "InputTextArea"){
-            @:<el-form-item label="@column.ColumnComment">
               @:<el-input-number v-model="state.tableQueryParams.@(column.LowerPropertyName)"  clearable placeholder="请输入@(column.ColumnComment)"/>
-              @:
-            @:</el-form-item>
             }else if(column.EffectType == "InputNumber"){
-            @:<el-form-item label="@column.ColumnComment">
               @:<el-input-number v-model="state.tableQueryParams.@(column.LowerPropertyName)"  clearable placeholder="请输入@(column.ColumnComment)"/>
-            @:</el-form-item>
-            }else if(column.EffectType == "ForeignKey") {
-            @:<el-form-item label="@column.ColumnComment">
+            }else if(column.IsSelectorEffectType || column.EffectType == "ForeignKey") {
               @:<el-select clearable filterable v-model="state.tableQueryParams.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
+                if (column.EffectType == "ForeignKey") {
                 @:<el-option v-for="(item,index) in state.dropdownData.@(column.LowerPropertyName) ?? []" :key="index" :value="item.value" :label="item.label" />
+                } else if (column.EffectType == "ConstSelector") {
+                @:<el-option v-for="(item, index) in state.stores.getConstDataByTypeCode('@column.DictTypeCode')" :key="index" :label="item.name" :value="item.code" />
+                } else {
+                @:<el-option v-for="(item,index) in state.stores.getDictDataByCode('@(column.DictTypeCode)')" :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
+                }
               @:</el-select>
-            @:</el-form-item>
             }else if(column.EffectType == "ApiTreeSelector"){
-            @:<el-form-item label="@column.ColumnComment">
               @:<el-cascader
                 @::options="state.dropdownData.@(column.LowerPropertyName) ?? []"
                 @:@:props="{ checkStrictly: true, emitPath: false }"
@@ -183,22 +175,16 @@ handleQuery();
                     @:<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                   @:</template>
               @:</el-cascader>
-            @:</el-form-item>
-            }else if(column.EffectType == "DictSelector" || column.EffectType == "EnumSelector"){
-            @:<el-form-item label="@column.ColumnComment">
-              @:<el-select clearable filterable v-model="state.tableQueryParams.@(column.LowerPropertyName)" placeholder="请选择@(column.ColumnComment)">
-                @:<el-option v-for="(item,index) in state.stores.getDictDataByCode('@(column.DictTypeCode)')" :key="index" :value="item.code" :label="`[${item.code}]${item.value}`" />
-              @:</el-select>
-            @:</el-form-item>
-            }else if(column.EffectType == "DatePicker"){
-            @:<el-form-item label="@column.ColumnComment">
+            } else if (column.EffectType == "DatePicker"){
               if (column.QueryType == "~") {
               @:<el-date-picker type="daterange" v-model="state.tableQueryParams.@(column.LowerPropertyName)Range"  value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" />
               } else {
               @:<el-date-picker placeholder="请选择@(column.ColumnComment)" value-format="YYYY/MM/DD"  v-model="state.tableQueryParams.@(column.LowerPropertyName)" />
               }
-            @:</el-form-item>
+            } else {
+              @:<el-input v-model="state.tableQueryParams.@(column.LowerPropertyName)" clearable placeholder="请输入@(column.ColumnComment)"/>
             }
+            @:</el-form-item>
           @:</el-col>
           }
           }
@@ -264,8 +250,8 @@ handleQuery();
           @:</template>
         @:</el-table-column>
       } else if (column.EffectType == "ConstSelector" || column.EffectType == "ForeignKey" || column.EffectType == "ApiTreeSelector") {
-        var formatter = column.EffectType == "ConstSelector" ? $"codeToName(row.{column.LowerPropertyName}, '{column.DictTypeCode}')" : $"row.{column.LowerExtendedPropertyName}";
-        @:<el-table-column @(Model.GetElTableColumnCustomProperty(column)) :formatter="(row) => @(formatter)" show-overflow-tooltip />
+        var formatter = column.EffectType == "ConstSelector" ? $"state.stores.getConstItemNameByType('{column.DictTypeCode}', row.{column.LowerPropertyName})" : $"row.{column.LowerExtendedPropertyName}";
+        @:<el-table-column @(Model.GetElTableColumnCustomProperty(column)) :formatter="(row: any) => @(formatter)" show-overflow-tooltip />
       } else {
         @:<el-table-column @(Model.GetElTableColumnCustomProperty(column)) show-overflow-tooltip />
       }
@@ -288,8 +274,8 @@ handleQuery();
       <el-pagination 
               v-model:currentPage="state.tableParams.page"
               v-model:page-size="state.tableParams.pageSize"
-              @@size-change="(val) => handleQuery({ pageSize: val })"
-              @@current-change="(val) => handleQuery({ page: val })"
+              @@size-change="(val: any) => handleQuery({ pageSize: val })"
+              @@current-change="(val: any) => handleQuery({ page: val })"
               layout="total, sizes, prev, pager, next, jumper"
               :page-sizes="[10, 20, 50, 100, 200, 500]"
               :total="state.tableParams.total"

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

@@ -1,5 +1,5 @@
 <template>
-	<el-Tag :type="state.tagType ?? ''">{{ state.label }}</el-Tag>
+	<el-Tag :type="state.tagType">{{ state.label }}</el-Tag>
 </template>
 
 <script lang="ts" setup>
@@ -8,7 +8,7 @@ import { reactive, onMounted, watch } from 'vue';
 
 const props = defineProps({
 	code: String,
-	value: Object,
+	value: null,
 	propLabel: {
 		type: String,
 		default: 'value',
@@ -25,7 +25,7 @@ const props = defineProps({
 
 const state = reactive({
 	label: '' as string,
-	tagType: '' as string,
+	tagType: "primary" as "success" | "warning" | "info" | "primary" | "danger"
 });
 
 onMounted(() => {
@@ -41,7 +41,7 @@ const setDictValue = (value: any) => {
   const dict = useUserInfo().dictList[props.code]?.find((x: any) => x[props.propValue] == value);
   if (dict) {
     state.label = dict[props.propLabel] || props.defaultValue;
-    state.tagType = dict.tagType;
+    state.tagType = dict.tagType ?? "primary";
   }
 }
 </script>

+ 6 - 15
Web/src/components/table/importData.vue

@@ -39,7 +39,7 @@
 <script lang="ts" setup name="sysImportData">
 import type {UploadInstance, UploadProps, UploadRawFile, UploadRequestOptions} from 'element-plus'
 import { ElUpload, ElMessage, genFileId } from 'element-plus';
-import { downloadFile } from '/@/utils/downloadFile';
+import { downloadStreamFile } from '/@/utils/downloadFile';
 import { reactive, ref } from 'vue';
 
 const uploadRef = ref<UploadInstance>();
@@ -70,15 +70,15 @@ const handleImportData = (opt: UploadRequestOptions) => {
   state.loading = true;
   props.import(opt.file).then((res: any) => {
     try {
-      handleFileStream(res);
-	  state.isShowDialog = false;
+      downloadStreamFile(res);
+	    state.isShowDialog = false;
       emit('refresh');
     } catch {
       ElMessage.error(res.data.message || '上传失败');
     }
-	state.loading = false;
+	  state.loading = false;
   }).catch(() => {
-	state.loading = false;
+	  state.loading = false;
   }).finally(() => {
     uploadRef.value?.clearFiles();
   });
@@ -86,16 +86,7 @@ const handleImportData = (opt: UploadRequestOptions) => {
 
 // 下载模板
 const download = () => {
-	props.download().then((res: any) => handleFileStream(res)).catch((res: any) => ElMessage.error('下载错误: ' + res));
-}
-
-// 下载文件流
-const handleFileStream = (res: any) => {
-  const contentType = res.headers['content-type'];
-  const contentDisposition = res.headers['content-disposition'];
-  const filename = decodeURIComponent(contentDisposition.split('; ')[1].split('=')[1])
-  const blob = res.data instanceof Blob ? res.data : new Blob([res.data], { type: contentType });
-  downloadFile(window.URL.createObjectURL(blob), filename);
+	props.download().then((res: any) => downloadStreamFile(res)).catch((res: any) => ElMessage.error('下载错误: ' + res));
 }
 
 // 导出对象

+ 12 - 1
Web/src/stores/userInfo.ts

@@ -39,7 +39,7 @@ export const useUserInfo = defineStore('userInfo', {
 		// 存储字典信息到浏览器缓存
 		async setDictList() {
 			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));
+			for (const key in this.dictList) if (key.endsWith("Enum")) this.dictList[key].forEach((e: any) => e.code = Number(e.code));
 		},
 
 		// 获取当前用户信息
@@ -97,6 +97,17 @@ export const useUserInfo = defineStore('userInfo', {
 			});
 		},
 
+		// 根据常量类名获取常量数据
+		getConstDataByTypeCode(typeCode: string) {
+			return this.constList.find((item: any) => item.code === typeCode)?.data?.result || [];
+		},
+
+		// 根据常量类名和编码获取常量值
+		getConstItemNameByType(typeCode: string, itemCode: string) {
+			const data = this.getConstDataByTypeCode(typeCode);
+			return data.find((item: any) => item.code === itemCode)?.name;
+		},
+
 		// 根据字典类型获取字典数据
 		getDictDataByCode(dictTypeCode: string) {
 			return this.dictList[dictTypeCode] || [];

+ 7 - 10
Web/src/views/login/component/account.vue

@@ -140,10 +140,8 @@ let timer: any = null;
 // 页面初始化
 onMounted(async () => {
 	// 若URL带有Token参数(第三方登录)
-	var accessToken = route.query.token;
-	if (accessToken != null && accessToken != undefined) {
-		await saveTokenAndInitRoutes(accessToken);
-	}
+	const accessToken = route.query.token;
+	if (accessToken) await saveTokenAndInitRoutes(accessToken);
 
 	// 获取登录配置
 	state.secondVerEnabled = themeConfig.value.secondVer ?? true;
@@ -174,8 +172,7 @@ onUnmounted(() => {
 
 // 检测大小写按键
 const handleKeyPress = (e: KeyboardEvent) => {
-	const isCapsLockOn = e.getModifierState('CapsLock');
-	state.capsLockVisible = isCapsLockOn;
+	state.capsLockVisible = e.getModifierState('CapsLock');
 };
 
 // 获取验证码
@@ -183,10 +180,10 @@ const getCaptcha = async () => {
 	if (!state.captchaEnabled) return;
 
 	state.ruleForm.code = '';
-	var res = await getAPI(SysAuthApi).apiSysAuthCaptchaGet();
-	state.captchaImage = 'data:text/html;base64,' + res.data.result?.img;
-	state.ruleForm.codeId = res.data.result?.id;
-	state.expirySeconds = res.data.result?.expirySeconds;
+	const res = await getAPI(SysAuthApi).apiSysAuthCaptchaGet().then(res => res.data.result);
+	state.captchaImage = 'data:text/html;base64,' + res?.img;
+	state.expirySeconds = res?.expirySeconds;
+  state.ruleForm.codeId = res?.id;
 };
 
 // 获取时间