Prechádzať zdrojové kódy

!1476 模板优化
Merge pull request !1476 from 喵你个汪/dev

zuohuaijun 1 rok pred
rodič
commit
4f0dd0e5b0

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Dto.cs.vm

@@ -4,7 +4,7 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
-namespace @Model.NameSpace.Service;
+namespace @(Model.NameSpace).Service;
 
 /// <summary>
 /// @(Model.BusName)输出参数

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Entity.cs.vm

@@ -7,7 +7,7 @@
 @if(Model.BaseClassName!=""){
 @:using Admin.NET.Core;
 }
-namespace @Model.NameSpace.Entity;
+namespace @(Model.NameSpace).Entity;
 
 /// <summary>
 /// @(Model.Description)

+ 1 - 2
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Input.cs.vm

@@ -7,7 +7,7 @@
 using Admin.NET.Core;
 using System.ComponentModel.DataAnnotations;
 
-namespace @Model.NameSpace.Service;
+namespace @(Model.NameSpace).Service;
 
 /// <summary>
 /// @(Model.BusName)基础输入参数
@@ -135,7 +135,6 @@ if (Regex.IsMatch(column.NetType, "(.*?Enum|int|long|double|float|bool)[?]?")){
 /// </summary>
 public class QueryById@(Model.ClassName)Input : Delete@(Model.ClassName)Input
 {
-
 }
 
 @if (Model.TableField.Any(x => x.WhetherImport == "Y")){

+ 17 - 48
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Manage.js.vm

@@ -3,6 +3,9 @@
 	var hasSetStatus = Model.TableField.Any(col => col.NetType == "StatusEnum" && col.PropertyName == "Status");
 }
 import request from '/@@/utils/request';
+@if (Model.TableField.Any(col => col.EffectType == "Upload")) {
+@:import uploadFile from '/@/api/system/uploadFile';
+}
 enum Api {
   Add@(Model.ClassName) = '/api/@(Model.LowerClassName)/add',
   Delete@(Model.ClassName) = '/api/@(Model.LowerClassName)/delete',
@@ -22,7 +25,7 @@ if(column.EffectType == "fk" && (column.WhetherAddUpdate == "Y" || column.QueryW
   @:Get@(column.FkEntityName)@(column.PropertyName)Dropdown = '/api/@(Model.LowerClassName)/@(column.FkEntityName)@(column.PropertyName)Dropdown',
 }else if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("Get@(column.FkEntityName)Tree")){
   @{definedObjects.Add("Get@(column.FkEntityName)Tree", 1);}
-  @:Get@(column.FkEntityName)Tree = '/api/@(Model.LowerClassName)/@(column.FkEntityName)Tree',
+  @:Get@(column.FkEntityName)Tree = '/api/@(Model.LowerClassName)/@(column.FkEntityName[..1].ToLower() + column.FkEntityName[1..])Tree',
 }else if(column.EffectType == "Upload"){
   @:Upload@(column.PropertyName) = '/api/@(Model.LowerClassName)/Upload@(column.PropertyName)',
 }
@@ -110,59 +113,25 @@ export const detail@(Model.ClassName) = (id: any) =>
 @:}
 }
 
-@foreach (var column in Model.TableField){
+@foreach (var column in Model.TableField) {
 	if(column.EffectType == "fk" && (column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){
-@:export const get@(column.FkEntityName)@(column.PropertyName)Dropdown = () =>
-		@:request({
+@:// 获取@(column.ColumnComment)选择数据
+@:export const get@(column.FkEntityName)@(column.PropertyName)Dropdown = () => 
+	@:request({
 		@:url: Api.Get@(column.FkEntityName)@(column.PropertyName)Dropdown,
 		@:method: 'get'
-		@:});
+	@:});
 	}else if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("get@(column.FkEntityName)Tree")){
-		@{definedObjects.Add("get@(column.FkEntityName)Tree", 1);}
+		definedObjects.Add("get@(column.FkEntityName)Tree", 1);
+@:// 获取@(column.ColumnComment)选择数据
 @:export const get@(column.FkEntityName)Tree = () =>
-		@:request({
+	@:request({
 		@:url: Api.Get@(column.FkEntityName)Tree,
 		@:method: 'get'
-		@:});
-    }else if(column.EffectType == "Upload"){
-	
-	@:/**
-	@:* 上传@(column.ColumnComment) 
-	@:*/
+	@:});
+    } else if (column.EffectType == "Upload") {
+@:// 上传@(column.ColumnComment)
 @:export const upload@(column.PropertyName) = (params: any) =>
-		@:uploadFileHandle(params, Api.Upload@(column.PropertyName))
-		}
+	@:uploadFile(params, Api.Upload@(column.PropertyName));
+	}
 }
-
-@foreach (var column in Model.TableField){
-	if(column.EffectType == "Upload"){
-	@:export const uploadFileHandle = (params: any, url: string) => { 
-	@:const formData = new window.FormData();
-	@:formData.append('file', params.file);
-	@://自定义参数
-	@:if (params.data) {
-		@:Object.keys(params.data).forEach((key) => {
-			@:const value = params.data![key];
-			@:if (Array.isArray(value)) {
-				@:value.forEach((item) => {
-					@:formData.append(`${key}[]`, item);
-				@:});
-				@:return;
-			@:}
-			@:formData.append(key, params.data![key]);
-		@:});
-	@:}
-	@:return request({
-		@:url: url,
-		@:method: 'POST',
-		@:data: formData,
-		@:headers: {
-			@:'Content-type': 'multipart/form-data;charset=UTF-8',
-			@:// ts-ignore
-			@:ignoreCancelToken: true,
-		@:},
-	@:});
-@:};
-		break;
-		}
-}

+ 22 - 18
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Output.cs.vm

@@ -4,7 +4,7 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
-namespace @Model.NameSpace.Service;
+namespace @(Model.NameSpace).Service;
 
 /// <summary>
 /// @(Model.BusName)输出参数
@@ -33,7 +33,7 @@ if(column.EffectType == "fk")
     @:/// <summary>
     @:/// @(column.ColumnComment) 描述 
     @:/// </summary>
-    @:public string? @(column.PropertyName)@(column.DisplayColumn) { get; set; } 
+    @:public string? @(column.PropertyName)Display { get; set; } 
 }else{
     @:public @column.NetType @(column.PropertyName) { get; set; }
 }
@@ -43,22 +43,26 @@ if(column.EffectType == "fk")
 @foreach (var column in Model.TableField){
 if (column.EffectType == "ApiTreeSelect"){
 @:
-    @:// 使用实际实体@(column.FkTableName),所以这里就删了
-    @:/*
-    @:[SugarTable("@(column.FkTableName)")]
-    @:public class @(column.FkEntityName)TreeOutput: EntityBaseId
-    @:{
-        @:[SugarColumn(ColumnName = "@(column.DisplayColumn)")]
-        @:public @(Model.GetColumnNetType(@column.FkTableName,@column.DisplayColumn)) Label { get; set; }
-
-        @:[SugarColumn(ColumnName = "@(column.ValueColumn)", IsPrimaryKey = true, IsIdentity = false)]
-        @:public @(Model.GetColumnNetType(@column.FkTableName,@column.ValueColumn))  Value { get; set; }
-
-        @:public @(Model.GetColumnNetType(@column.FkTableName,@column.PidColumn)) @column.PidColumn { get; set; }
-        @:[SugarColumn(IsIgnore = true)]
-        @:public List<@(column.FkEntityName)TreeOutput> Children { get; set; }
-    @:}
-    @:*/
+@:/// <summary>
+@:/// @(Model.BusName)树选择器输出参数
+@:/// </summary>
+@:public class @(column.FkEntityName)TreeOutput : @(column.FkEntityName)
+@:{
+    @:/// <summary>
+    @:/// 显示文本
+    @:/// </summary>
+    @:public string Label { get; set; }
+    @:
+    @:/// <summary>
+    @:/// 选项值
+    @:/// </summary>
+    @:public @(Model.GetColumnNetType(@column.FkTableName, @column.ValueColumn)) Value { get; set; }
+    @:
+    @:/// <summary>
+    @:/// 子集列表
+    @:/// </summary>
+    @:public List<@(column.FkEntityName)TreeOutput> Children { get; set; }
+@:}
 }
 }
 @if (Model.TableField.Any(x => x.WhetherImport == "Y")) {

+ 2 - 2
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/SeedData.cs.vm

@@ -7,12 +7,12 @@
 using Admin.NET.Core;
 using @Model.EntityNameSpace;
 
-namespace @Model.NameSpace.SeedData;
+namespace @(Model.NameSpace).SeedData;
 
 /// <summary>
 /// @(Model.Description) 表种子数据
 /// </summary>
-public class @(Model.SeedDataName): ISqlSugarEntitySeedData<@(Model.EntityName)>
+public class @(Model.SeedDataName) : ISqlSugarEntitySeedData<@(Model.EntityName)>
 {
     /// <summary>
     /// 种子数据

+ 40 - 36
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Service.cs.vm

@@ -20,11 +20,12 @@ using Microsoft.AspNetCore.Http;
     var dictTableField = Model.TableField.Where(x => x.WhetherImport == "Y" && x.EffectType == "Select") ?? default;
     var hasdictService = dictTableField.Count() > 0;
     var importField = Model.TableField.Where(x => x.WhetherImport == "Y");
+    var displayColumnList = new List<string>();
 }
-namespace @Model.NameSpace.Service;
+namespace @(Model.NameSpace).Service;
 
 /// <summary>
-/// @(Model.BusName)服务
+/// @(Model.BusName)服务 🧩
 /// </summary>
 [ApiDescriptionSettings(@(Model.ProjectLastName)Const.GroupName, Order = 100)]
 public class @(Model.ClassName)Service : IDynamicApiController, ITransient
@@ -45,12 +46,11 @@ public class @(Model.ClassName)Service : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 分页查询@(Model.BusName)
+    /// 分页查询@(Model.BusName) 🔖
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpPost]
-    [ApiDescriptionSettings(Name = "Page")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
     [DisplayName("分页查询@(Model.BusName)")]
     public async Task<SqlSugarPagedList<@(Model.ClassName)Output>> Page(Page@(Model.ClassName)Input input)
     {
@@ -100,9 +100,10 @@ if (column.QueryWhether == "Y"){
                 if(column.EffectType == "fk"){
                 @:@(column.PropertyName) = u.@(column.PropertyName), 
                 @:@(column.PropertyName)@(column.FkColumnName) = @(joinTableAlias).@(column.FkColumnName),
-                } else if(column.EffectType == "ApiTreeSelect"){  
+                } else if(column.EffectType == "ApiTreeSelect"){
+                displayColumnList = column.DisplayColumn.Split(",").Select(u => $"{{{joinTableAlias}.{u}}}").ToList();
                 @:@(column.PropertyName) = u.@(column.PropertyName),  
-                @:@(column.PropertyName)@(column.DisplayColumn) = @(joinTableAlias).@(column.DisplayColumn),
+                @:@(column.PropertyName)Display = $"@(string.Join("-", displayColumnList))",
                 } else if(column.NetType?.TrimEnd('?').EndsWith("Enum") == true){
                 @:@(column.PropertyName) = u.@(column.PropertyName),
                 } else {
@@ -124,12 +125,11 @@ if (column.QueryWhether == "Y"){
     }
 
     /// <summary>
-    /// 增加@(Model.BusName)
+    /// 增加@(Model.BusName) ➕
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpPost]
-    [ApiDescriptionSettings(Name = "Add")]
+    [ApiDescriptionSettings(Name = "Add"), HttpPost]
     [DisplayName("增加@(Model.BusName)")]
     public async Task<long> Add(Add@(Model.ClassName)Input input)
     {
@@ -139,12 +139,11 @@ if (column.QueryWhether == "Y"){
     }
 
     /// <summary>
-    /// 删除@(Model.BusName)
+    /// 删除@(Model.BusName) ❌
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpPost]
-    [ApiDescriptionSettings(Name = "Delete")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
     [DisplayName("删除@(Model.BusName)")]
     public async Task Delete(Delete@(Model.ClassName)Input input)
     {
@@ -156,12 +155,11 @@ if (column.QueryWhether == "Y"){
     }
 
     /// <summary>
-    /// 批量删除@(Model.BusName)
+    /// 批量删除@(Model.BusName) ❌
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpPost]
-    [ApiDescriptionSettings(Name = "BatchDelete")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
     [DisplayName("批量删除@(Model.BusName)")]
     public async Task<int> BatchDelete(BatchDelete@(Model.ClassName)Input input)
     {
@@ -173,12 +171,11 @@ if (column.QueryWhether == "Y"){
     }
 
     /// <summary>
-    /// 更新@(Model.BusName)
+    /// 更新@(Model.BusName) ✏️
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpPost]
-    [ApiDescriptionSettings(Name = "Update")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
     [DisplayName("更新@(Model.BusName)")]
     public async Task Update(Update@(Model.ClassName)Input input)
     {
@@ -188,7 +185,7 @@ if (column.QueryWhether == "Y"){
 @if (hasSetStatus) {
 @:
     @:/// <summary>
-    @:/// 设置@(Model.BusName)状态
+    @:/// 设置@(Model.BusName)状态 🚫
     @:/// </summary>
     @:/// <param name="input"></param>
     @:/// <returns></returns>
@@ -201,12 +198,11 @@ if (column.QueryWhether == "Y"){
 }
 
     /// <summary>
-    /// 获取@(Model.BusName)
+    /// 获取@(Model.BusName) ℹ️
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet]
-    [ApiDescriptionSettings(Name = "Detail")]
+    [ApiDescriptionSettings(Name = "Detail"), HttpGet]
     [DisplayName("获取@(Model.BusName)")]
     public async Task<@(Model.ClassName)> Detail([FromQuery] QueryById@(Model.ClassName)Input input)
     {
@@ -218,12 +214,11 @@ if (@column.ColumnKey == "True"){
     }
 
     /// <summary>
-    /// 获取@(Model.BusName)列表
+    /// 获取@(Model.BusName)列表 🔖
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [HttpGet]
-    [ApiDescriptionSettings(Name = "List")]
+    [ApiDescriptionSettings(Name = "List"), HttpGet]
     [DisplayName("获取@(Model.BusName)列表")]
     public async Task<List<@(Model.ClassName)Output>> List([FromQuery] Page@(Model.ClassName)Input input)
     {
@@ -233,7 +228,7 @@ if (@column.ColumnKey == "True"){
 if(column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){
 @:
     @:/// <summary>
-    @:/// 获取@(column.ColumnComment)列表
+    @:/// 获取@(column.ColumnComment)列表 🔖
     @:/// </summary>
     @:/// <returns></returns>
     @:[ApiDescriptionSettings(Name = "@(column.FkEntityName)@(column.PropertyName)Dropdown"), HttpGet]
@@ -253,7 +248,7 @@ if(column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.Query
 if(column.EffectType == "Upload"){
 @:
     @:/// <summary>
-    @:/// 上传@(column.ColumnComment)
+    @:/// 上传@(column.ColumnComment) ⬆️
     @:/// </summary>
     @:/// <param name="file"></param>
     @:/// <returns></returns>
@@ -269,22 +264,31 @@ if(column.EffectType == "Upload"){
 @foreach (var column in Model.TableField){
 if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(column.FkEntityName)Tree")){
 @:
-    @{definedObjects.Add("@(column.FkEntityName)Tree", 1);}
-    @:[HttpGet("@(column.FkEntityName)Tree")]
-    @:[DisplayName("获取@(column.FkEntityName)Tree")]
-    @:public async Task<dynamic> @(column.FkEntityName)Tree()
+    definedObjects.Add("@(column.FkEntityName)Tree", 1);
+    @:/// <summary>
+    @:/// 获取@(column.ColumnComment)选择数据 🔖
+    @:/// </summary>
+    @:[ApiDescriptionSettings(Name = "@(column.FkEntityName)Tree"), HttpGet]
+    @:[DisplayName("获取@(column.ColumnComment)选择数据")]
+    @:public async Task<List<@(column.FkEntityName)TreeOutput>> @(column.FkEntityName)Tree()
     @:{
-        @:return await _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>().ToTreeAsync(u => u.Children, u => u.@(column.PidColumn), 0);
+        displayColumnList = column.DisplayColumn.Split(",").Select(u => $"{{u.{u}}}").ToList();
+        @:return await _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>().Select(u => new @(column.FkEntityName)TreeOutput {
+            @:Label = $"@(string.Join("-", displayColumnList))",
+            @:Value = u.@column.ValueColumn
+        @:}, true).ToTreeAsync(u => u.Children, u => u.@(column.PidColumn), @(column.WhetherRequired == "Y" ? "0" : "null"));
     @:}
 }
 }
 @if (hasdictService) {
 @:
     @:/// <summary>
-    @:/// 获取字典文本列表
+    @:/// 获取字典文本列表 🔖
     @:/// </summary>
     @:/// <param name="dictTypeCode"></param>
     @:/// <returns></returns>
+    @:[ApiDescriptionSettings, HttpGet]
+    @:[DisplayName("获取字典文本列表")]
     @:private List<string> GetDictDataTextList(string dictTypeCode)
     @:{
     @:    return _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = dictTypeCode }).Result?.Select(x => x.Value).ToList();
@@ -293,7 +297,7 @@ if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(column
 @if (importField?.Count() > 0) {
 @:
     @:/// <summary>
-    @:/// 下载@(Model.BusName)数据导入模板
+    @:/// 下载@(Model.BusName)数据导入模板 ⬇️
     @:/// </summary>
     @:/// <returns></returns>
     @:[DisplayName("下载@(Model.BusName)数据导入模板")]
@@ -304,7 +308,7 @@ if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(column
     @:}
 @:
     @:/// <summary>
-    @:/// 导入@(Model.BusName)记录 📃
+    @:/// 导入@(Model.BusName)记录 💾
     @:/// </summary>
     @:/// <returns></returns>
     @:[DisplayName("导入@(Model.BusName)记录")]

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

@@ -2,6 +2,7 @@
 	var definedObjects = new Dictionary<string, int>();
 	var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault();
 	var pkFieldName = LowerFirstLetter(pkField.PropertyName);
+	var displayColumnList = new List<string>();
 }
 <template>
 	<div class="@(Model.LowerClassName)-container">
@@ -30,18 +31,19 @@
 						</el-form-item>
 					</el-col>
 					}else if(column.EffectType == "ApiTreeSelect"){
+					displayColumnList = column.DisplayColumn.Split(",").Select(u => $"${{data.{LowerFirstLetter(u)}}}").ToList();
 					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						@:<el-form-item label="@column.ColumnComment" prop="@(column.LowerPropertyName)">
 							<el-cascader
 								@:options="@LowerFirstLetter(@column.FkEntityName)TreeData"
-								@:props="{ checkStrictly: true, emitPath: false, value: '@LowerFirstLetter(@column.ValueColumn)', label: '@LowerFirstLetter(@column.DisplayColumn)' }"
+								@:props="{ checkStrictly: true, emitPath: false, value: '@LowerFirstLetter(@column.ValueColumn)' }"
 								placeholder="请选择@(column.ColumnComment)"
 								clearable=""
 								class="w100"
 								v-model="ruleForm.@(column.LowerPropertyName)"
 							>
 								<template #default="{ node, data }">
-									<span>{{ data.name }}</span>
+									<span>{{ data.label }}</span>
 									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
 								</template>
 							</el-cascader>

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

@@ -59,6 +59,22 @@
                 @:<el-option v-for="(item,index) in dl('@(column.DictTypeCode)')" :key="index" :value="item.value" :label="`${item.name} (${item.code}) [${item.value}] `" />
               @:</el-select>
             @:</el-form-item>
+            }else if(column.EffectType == "ApiTreeSelect"){
+            @:<el-form-item label="@column.ColumnComment">
+              @:<el-cascader
+                  @::options="@LowerFirstLetter(@column.FkEntityName)TreeData"
+                  @:@:props="{ checkStrictly: true, emitPath: false, value: '@LowerFirstLetter(@column.ValueColumn)' }"
+                  @:placeholder="请选择@(column.ColumnComment)"
+                  @:clearable=""
+                  @:class="w100"
+                  @:v-model="queryParams.@(column.LowerPropertyName)"
+                  @:>
+                @:<template #default="{ node, data }">
+                  @:<span>{{ data.label }}</span>
+                  @:<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                @:</template>
+              @:</el-cascader>
+            @:</el-form-item>
             }else if(column.EffectType == "DatePicker"){
             @:<el-form-item label="@column.ColumnComment">
               if(column.QueryType == "~"){
@@ -124,7 +140,7 @@
             }else if(column.EffectType == "fk"){
             @:<span>{{scope.row.@LowerFirstLetter(@column.PropertyName)@(column.FkColumnName)}}</span>
             }else if(column.EffectType == "ApiTreeSelect"){
-            @:<span>{{scope.row.@LowerFirstLetter(@column.PropertyName)@(column.DisplayColumn)}}</span>
+            @:<span>{{scope.row.@LowerFirstLetter(@column.PropertyName)Display}}</span>
             }else if(column.EffectType == "Switch"){
             @:<el-tag v-if="scope.row.@(column.LowerPropertyName)"> 是 </el-tag>
             @:<el-tag type="danger" v-else> 否 </el-tag>
@@ -229,6 +245,9 @@
   @foreach (var column in Model.QueryWhetherList.Where(u => u.EffectType == "fk")) {
   @:import { get@(@column.FkEntityName)@(@column.PropertyName)Dropdown } from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)';
   }
+  @foreach (var column in Model.QueryWhetherList.Where(u => u.EffectType == "ApiTreeSelect")) {
+  @:import { get@(column.FkEntityName)Tree } from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)';
+  }
 
   const showAdvanceQueryUI = ref(@(@haveLikeCdt ? "false" : "true"));
   const printDialogRef = ref();
@@ -354,15 +373,27 @@
     handleQuery();
   };
 
-  @foreach (var column in Model.QueryWhetherList.Where(u => u.EffectType == "fk")){
-  @:const @LowerFirstLetter(@column.FkEntityName)@(@column.PropertyName)DropdownList = ref<any>([]); 
+@foreach (var column in Model.TableField) {
+  if (column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("define_get@(@column.FkEntityName)TreeData")) {
+  definedObjects.Add("define_get@(@column.FkEntityName)TreeData", 1);
+  @:const @LowerFirstLetter(@column.FkEntityName)TreeData = ref<any>([]);
+  @:const get@(column.FkEntityName)TreeData = async () => {
+    @:let list = await get@(column.FkEntityName)Tree();
+    @:@LowerFirstLetter(@column.FkEntityName)TreeData.value = list.data.result ?? [];
+  @:};
+  @:get@(column.FkEntityName)TreeData();
+  @:
+  } else if (column.EffectType == "fk") {
+  @:const @LowerFirstLetter(@column.FkEntityName)@(@column.PropertyName)DropdownList = ref<any>([]);
   @:const get@(@column.FkEntityName)@(@column.PropertyName)DropdownList = async () => {
     @:let list = await get@(@column.FkEntityName)@(@column.PropertyName)Dropdown();
     @:@LowerFirstLetter(@column.FkEntityName)@(@column.PropertyName)DropdownList.value = list.data.result ?? [];
   @:};
   @:get@(@column.FkEntityName)@(@column.PropertyName)DropdownList();
   @:
+  }
 }
+
   handleQuery();
 </script>
 <style scoped>

+ 26 - 0
Web/src/api/system/uploadFile.ts

@@ -0,0 +1,26 @@
+import request from "/@/utils/request";
+
+export const uploadFile = (params: any, url: string) => { 
+	const formData = new FormData();
+	formData.append('file', params.file);
+	// 自定义参数
+	if (params.data) {
+		Object.keys(params.data).forEach((key) => {
+			const value = params.data![key];
+			if (Array.isArray(value)) {
+				value.forEach((item) => formData.append(`${key}[]`, item));
+				return;
+			}
+			formData.append(key, params.data![key]);
+		});
+	}
+	return request({
+		url: url,
+		method: 'POST',
+		data: formData,
+		headers: {
+			'Content-type': 'multipart/form-data;charset=UTF-8',
+			ignoreCancelToken: true,
+		},
+	});
+};

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

@@ -10,35 +10,35 @@
 			<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-form-item label="库定位器" prop="configId">
+						<el-form-item label="库定位器" prop="configId" :rules="[{ required: true, message: '库不能为空', trigger: 'blur' }]">
 							<el-select clearable v-model="state.ruleForm.configId" placeholder="库名" filterable @change="DbChanged()" class="w100">
 								<el-option v-for="item in state.dbData" :key="item.configId" :label="item.configId" :value="item.configId" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="数据库表" prop="tableName">
+						<el-form-item label="数据库表" prop="tableName" :rules="[{ required: true, message: '数据表不能为空', trigger: 'blur' }]">
 							<el-select v-model="state.ruleForm.tableName" class="w100" filterable clearable @change="TableChanged()">
 								<el-option v-for="item in state.tableData" :key="item.entityName" :label="item.tableName + ' [' + item.tableComment + ']'" :value="item.tableName" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="显示字段" prop="displayColumn">
-							<el-select v-model="state.ruleForm.displayColumn" class="w100">
+						<el-form-item label="显示字段" prop="displayColumns" :rules="[{ required: true, message: '显示字段不能为空', trigger: 'blur' }]">
+							<el-select v-model="state.ruleForm.displayColumns" multiple 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="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="选择值字段" prop="valueColumn">
+						<el-form-item label="选择值字段" prop="valueColumn" :rules="[{ required: true, message: '值字段不能为空', trigger: 'blur' }]">
 							<el-select v-model="state.ruleForm.valueColumn" 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="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="父级字段" prop="pidColumn">
+						<el-form-item label="父级字段" prop="pidColumn" :rules="[{ required: true, message: '父级字段不能为空', trigger: 'blur' }]">
 							<el-select v-model="state.ruleForm.pidColumn" class="w100">
 								<el-option v-for="item in state.columnData" :key="item.columnName" :label="item.columnName + ' [' + item.columnComment + ']'" :value="item.columnName" />
 							</el-select>
@@ -117,7 +117,7 @@ const openDialog = async (row: any) => {
 	if (rowdata.fkConfigId) {
 		await getDbList();
 		state.ruleForm.tableName = rowdata.fkTableName;
-		state.ruleForm.displayColumn = rowdata.displayColumn;
+		state.ruleForm.displayColumns = rowdata.displayColumn?.split(",");
 		state.ruleForm.valueColumn = rowdata.valueColumn;
 		state.ruleForm.pidColumn = rowdata.pidColumn;
 		state.ruleForm.configId = rowdata.fkConfigId;
@@ -157,7 +157,8 @@ 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();
 	});
 };