ALANE\Sevy.Jiang 3 лет назад
Родитель
Сommit
2a7a0bcdc2
41 измененных файлов с 4409 добавлено и 295 удалено
  1. 11 3
      Admin.NET/Admin.NET.Application/AppConfig.json
  2. 35 0
      Admin.NET/Admin.NET.Application/Entity/generatetest.cs
  3. 41 0
      Admin.NET/Admin.NET.Application/Service/generatetest/Dto/generatetestDto.cs
  4. 80 0
      Admin.NET/Admin.NET.Application/Service/generatetest/Dto/generatetestInput.cs
  5. 46 0
      Admin.NET/Admin.NET.Application/Service/generatetest/Dto/generatetestOutput.cs
  6. 96 0
      Admin.NET/Admin.NET.Application/Service/generatetest/generatetestService.cs
  7. 5 0
      Admin.NET/Admin.NET.Core/Admin.NET.Core.xml
  8. 6 0
      Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs
  9. 23 23
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
  10. 5 0
      Admin.NET/Admin.NET.Core/Service/DataBase/SysDataBaseService.cs
  11. 3 0
      Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj
  12. 42 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage - Copy.js.vm
  13. 64 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js - Copy.cshtml
  14. 46 26
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js.vm
  15. 1 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm
  16. 220 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue - Copy.cshtml
  17. 209 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm
  18. 270 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue - Copy (2).cshtml
  19. 133 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue - Copy.vm
  20. 259 123
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm
  21. 40 0
      Web/src/api/main/generatetest.ts
  22. 180 36
      Web/src/api/system/admin.ts
  23. 30 0
      Web/src/api/system/enum.ts
  24. 754 0
      Web/src/api/system/interface.ts
  25. 2 0
      Web/src/main.ts
  26. 1 0
      Web/src/stores/interface/index.ts
  27. 13 0
      Web/src/stores/userInfo.ts
  28. 32 0
      Web/src/utils/helper/constSelectorHelper.ts
  29. 0 0
      Web/src/utils/http/requset.js
  30. 121 0
      Web/src/views/main/generatetest/component/editDialog.vue
  31. 180 0
      Web/src/views/main/generatetest/index.vue
  32. 235 0
      Web/src/views/system/codeGen/component/codeGenerateDialog.vue
  33. 137 0
      Web/src/views/system/codeGen/component/fkDialog.vue
  34. 284 0
      Web/src/views/system/codeGen/component/generateConfigDialog.vue
  35. 155 0
      Web/src/views/system/codeGen/component/treeDialog.vue
  36. 196 0
      Web/src/views/system/codeGen/index.vue
  37. 201 0
      Web/src/views/system/database/component/addColumn.vue
  38. 75 56
      Web/src/views/system/database/component/addTable.vue
  39. 1 2
      Web/src/views/system/database/component/editTable.vue
  40. 98 0
      Web/src/views/system/database/component/generateEntity.vue
  41. 79 26
      Web/src/views/system/database/index.vue

+ 11 - 3
Admin.NET/Admin.NET.Application/AppConfig.json

@@ -4,7 +4,7 @@
     "ConnectionConfigs": [
       // 默认第一个为主库
       {
-        "ConfigId": "eolane",
+        "ConfigId": "default",
         "DbType": "MySql", // MySql、SqlServer、Sqlite、Oracle、PostgreSQL、Dm、Kdbndp、Oscar、MySqlConnector、Access
         "ConnectionString": "Server=localhost;uid=root;pwd=123456;Database=eolane_platform;pooling=true;min pool size=5;max pool size=32767;connect timeout=30000;charset=utf8;", // DataSource=C:\\db\\Admin.NET.db
         "EnableInitDb": false, // 启用库表初始化
@@ -12,18 +12,26 @@
       },
       // 其他业务库
       {
-        "ConfigId": "Test",
+        "ConfigId": "test",
         "DbType": "Sqlite",
         "ConnectionString": "DataSource=./Test.db",
         "EnableInitDb": false, // 启用库表初始化
         "EnableDiffLog": false // 启用库表差异日志
+      },
+      // 其他业务库
+      {
+        "ConfigId": "wms",
+        "DbType": "SqlServer",
+        "ConnectionString": "Server=.;Database=WMS_TEST;User=sa;Password=P@SSWORD123;MultipleActiveResultSets=True;",
+        "EnableInitDb": false, // 启用库表初始化
+        "EnableDiffLog": false // 启用库表差异日志
       }
     ]
   },
   // 代码生成配置项-程序集名称集合
   "CodeGen": {
     "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application" ],
-    "FrontRootPath": "Vben2", //前端文件根目录
+    "FrontRootPath": "Web", //前端文件根目录
     "BackendApplicationNamespace": "Admin.NET.Application" //后端生成到的项目
   },
   "Wechat": {

+ 35 - 0
Admin.NET/Admin.NET.Application/Entity/generatetest.cs

@@ -0,0 +1,35 @@
+using System;
+using SqlSugar;
+using System.ComponentModel;
+using Admin.NET.Core;
+namespace Admin.NET.Application.Entity
+{
+     /// <summary>
+     /// 代码测试
+     /// </summary>
+      [SugarTable("generate_test")]
+      [Description("代码测试")]
+      public class generatetest  : EntityBase
+      {
+          /// <summary>
+          /// 编码
+          /// </summary>
+          public string Code { get; set; }
+          /// <summary>
+          /// 名称
+          /// </summary>
+          public string Name { get; set; }
+          /// <summary>
+          /// 价格
+          /// </summary>
+          public decimal Price { get; set; }
+          /// <summary>
+          /// 过期日期
+          /// </summary>
+          public DateTime ExpireDate { get; set; }
+          /// <summary>
+          /// 状态
+          /// </summary>
+          public bool Status { get; set; }
+}	
+}

+ 41 - 0
Admin.NET/Admin.NET.Application/Service/generatetest/Dto/generatetestDto.cs

@@ -0,0 +1,41 @@
+using System;
+
+namespace Admin.NET.Application
+{
+    /// <summary>
+    /// GenerateTest输出参数
+    /// </summary>
+    public class generatetestDto
+    {
+        /// <summary>
+        /// 主键Id
+        /// </summary>
+        public long Id { get; set; }
+        
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public string Code { get; set; }
+        
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Name { get; set; }
+        
+        /// <summary>
+        /// 价格
+        /// </summary>
+        public decimal Price { get; set; }
+        
+        /// <summary>
+        /// 过期日期
+        /// </summary>
+        public DateTime ExpireDate { get; set; }
+        
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public bool Status { get; set; }
+        
+    }
+}

+ 80 - 0
Admin.NET/Admin.NET.Application/Service/generatetest/Dto/generatetestInput.cs

@@ -0,0 +1,80 @@
+using System;
+using Admin.NET.Core;
+using System.ComponentModel.DataAnnotations;
+using System.Collections.Generic;
+
+namespace Admin.NET.Application
+{
+    /// <summary>
+    /// GenerateTest输入参数
+    /// </summary>
+    public class generatetestInput : BasePageInput
+    {
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public virtual string Code { get; set; }
+        
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public virtual string Name { get; set; }
+        
+        /// <summary>
+        /// 价格
+        /// </summary>
+        public virtual decimal Price { get; set; }
+        
+        /// <summary>
+        /// 过期日期
+        /// </summary>
+        public virtual DateTime ExpireDate { get; set; }
+        
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public virtual bool Status { get; set; }
+        
+    }
+
+    public class AddgeneratetestInput : generatetestInput
+    {
+        /// <summary>
+        /// 编码
+        /// </summary>
+        [Required(ErrorMessage = "编码不能为空")]
+        public override string Code { get; set; }
+        
+        /// <summary>
+        /// 名称
+        /// </summary>
+        [Required(ErrorMessage = "名称不能为空")]
+        public override string Name { get; set; }
+        
+    }
+
+    public class DeletegeneratetestInput : BaseIdInput
+    {
+        /// <summary>
+        /// 主键Id
+        /// </summary>
+        [Required(ErrorMessage = "主键Id不能为空")]
+        public long Id { get; set; }
+        
+    }
+
+    public class UpdategeneratetestInput : generatetestInput
+    {
+        /// <summary>
+        /// 主键Id
+        /// </summary>
+        [Required(ErrorMessage = "主键Id不能为空")]
+        public long Id { get; set; }
+        
+    }
+
+    public class QueryegeneratetestInput : DeletegeneratetestInput
+    {
+
+    }
+}

+ 46 - 0
Admin.NET/Admin.NET.Application/Service/generatetest/Dto/generatetestOutput.cs

@@ -0,0 +1,46 @@
+using SqlSugar;
+using Admin.NET.Core;
+using Admin.NET.Core.Service;
+using System.Collections.Generic;
+using System;
+namespace Admin.NET.Application
+{
+    /// <summary>
+    /// GenerateTest输出参数
+    /// </summary>
+    public class generatetestOutput
+    {
+       /// <summary>
+       /// 主键Id
+       /// </summary>
+       public long Id { get; set; }
+    
+       /// <summary>
+       /// 编码
+       /// </summary>
+       public string Code { get; set; }
+    
+       /// <summary>
+       /// 名称
+       /// </summary>
+       public string Name { get; set; }
+    
+       /// <summary>
+       /// 价格
+       /// </summary>
+       public decimal Price { get; set; }
+    
+       /// <summary>
+       /// 过期日期
+       /// </summary>
+       public DateTime ExpireDate { get; set; }
+    
+       /// <summary>
+       /// 状态
+       /// </summary>
+       public bool Status { get; set; }
+    
+    }
+
+
+}

+ 96 - 0
Admin.NET/Admin.NET.Application/Service/generatetest/generatetestService.cs

@@ -0,0 +1,96 @@
+using Admin.NET.Application.Const;
+using Admin.NET.Application.Entity;
+using Mapster;
+
+namespace Admin.NET.Application;
+/// <summary>
+/// GenerateTest服务
+/// </summary>
+[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
+public class generatetestService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<generatetest> _rep;
+    public generatetestService(SqlSugarRepository<generatetest> rep)
+    {
+        _rep = rep;
+    }
+
+    /// <summary>
+    /// 分页查询GenerateTest
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/generatetest/page")]
+    public async Task<dynamic> Page(generatetestInput input)
+    {
+        var query= _rep.Context.Queryable<generatetest>()
+
+                    .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim()))
+                    .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
+;
+
+        query = query.OrderBuilder(input);
+        return await query.ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 增加GenerateTest
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/generatetest/add")]
+    public async Task Add(AddgeneratetestInput input)
+    {
+        var entity = input.Adapt<generatetest>();
+        await _rep.InsertWithDiffLogAsync(entity);
+    }
+
+    /// <summary>
+    /// 删除GenerateTest
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/generatetest/delete")]
+    public async Task Delete(DeletegeneratetestInput input)
+    {
+        var entity = await _rep.GetFirstAsync(u => u.Id == input.Id);
+        await _rep.FakeDeleteAsync(entity);   //假删除
+    }
+
+    /// <summary>
+    /// 更新GenerateTest
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/generatetest/edit")]
+    public async Task Update(UpdategeneratetestInput input)
+    {
+        var entity = input.Adapt<generatetest>();
+        await _rep.UpdateWithDiffLogAsync(entity);
+    }
+
+    /// <summary>
+    /// 获取GenerateTest
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet("/generatetest/detail")]
+    public async Task<generatetest> Get([FromQuery] QueryegeneratetestInput input)
+    {
+        return await _rep.GetFirstAsync(u => u.Id == input.Id);
+    }
+
+    /// <summary>
+    /// 获取GenerateTest列表
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet("/generatetest/list")]
+    public async Task<dynamic> List([FromQuery] generatetestInput input)
+    {
+        return await _rep.AsQueryable().ToListAsync();
+    }
+
+
+
+}

+ 5 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -2558,6 +2558,11 @@
             数据表不存在
             </summary>
         </member>
+        <member name="F:Admin.NET.Core.ErrorCodeEnum.db1002">
+            <summary>
+            数据表不存在
+            </summary>
+        </member>
         <member name="F:Admin.NET.Core.ErrorCodeEnum.R2000">
             <summary>
             父节点不存在

+ 6 - 0
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -486,6 +486,12 @@ public enum ErrorCodeEnum
     [ErrorCodeItemMetadata("数据表不存在")]
     db1001,
 
+    /// <summary>
+    /// 数据表不存在
+    /// </summary>
+    [ErrorCodeItemMetadata("不允许添加相同字段名")]
+    db1002,
+
     /// <summary>
     /// 父节点不存在
     /// </summary>

+ 23 - 23
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -200,28 +200,31 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         // 先删除该表已生成的菜单列表
         var templatePathList = GetTemplatePathList();
         var targetPathList = GetTargetPathList(input);
+
+        var tableFieldList = await _codeGenConfigService.List(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 == "fk").ToList();// 需要连表查询的字段
+        (string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList);// 获取连表的实体名和别名
+
+        var data = new CustomViewEngine(_db)
+        {
+            ConfigId = input.ConfigId,
+            AuthorName = input.AuthorName,
+            BusName = input.BusName,
+            NameSpace = input.NameSpace,
+            ClassName = input.TableName,
+            ProjectLastName = input.NameSpace.Split('.').Last(),
+            QueryWhetherList = queryWhetherList,
+            TableField = tableFieldList,
+            IsJoinTable = joinTableList.Count > 0,
+            IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(),
+        };
+
         for (var i = 0; i < templatePathList.Count; i++)
         {
             var tContent = File.ReadAllText(templatePathList[i]);
 
-            var tableFieldList = await _codeGenConfigService.List(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 == "fk").ToList();//需要连表查询的字段
-            (string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList);//获取连表的实体名和别名
-
-            var data = new CustomViewEngine(_db)
-            {
-                ConfigId = input.ConfigId,
-                AuthorName = input.AuthorName,
-                BusName = input.BusName,
-                NameSpace = input.NameSpace,
-                ClassName = input.TableName,
-                ProjectLastName = input.NameSpace.Split('.').Last(),
-                QueryWhetherList = queryWhetherList,
-                TableField = tableFieldList,
-                IsJoinTable = joinTableList.Count > 0,
-                IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(),
-            };
             var tResult = _viewEngine.RunCompile<CustomViewEngine>(tContent, data, builderAction: builder =>
             {
                 builder.AddAssemblyReferenceByName("System.Linq");
@@ -397,8 +400,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             Path.Combine(templatePath , "Output.cs.vm"),
             Path.Combine(templatePath , "Dto.cs.vm"),
             Path.Combine(templatePath , "index.vue.vm"),
-            Path.Combine(templatePath , "data.data.ts.vm"),
-            Path.Combine(templatePath , "dataModal.vue.vm"),
+            Path.Combine(templatePath , "editDialog.vue.vm"),
             Path.Combine(templatePath , "manage.js.vm"),
         };
     }
@@ -417,8 +419,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         var viewPath = Path.Combine(backendPath, "Dto", input.TableName + "Dto.cs");
         var frontendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.Parent.FullName, _codeGenOptions.FrontRootPath, "src", "views", "main");
         var indexPath = Path.Combine(frontendPath, input.TableName, "index.vue");
-        var formDataPath = Path.Combine(frontendPath, input.TableName, "data.data.ts");
-        var formModalPath = Path.Combine(frontendPath, input.TableName, "dataModal.vue");
+        var formModalPath = Path.Combine(frontendPath, input.TableName, "component", "editDialog.vue");
         var apiJsPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.Parent.FullName, _codeGenOptions.FrontRootPath, "src", "api", "main", input.TableName + ".ts");
 
         return new List<string>()
@@ -428,7 +429,6 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             outputPath,
             viewPath,
             indexPath,
-            formDataPath,
             formModalPath,
             apiJsPath
         };

+ 5 - 0
Admin.NET/Admin.NET.Core/Service/DataBase/SysDataBaseService.cs

@@ -115,6 +115,11 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any())
             throw Oops.Oh(ErrorCodeEnum.db1000);
 
+        if (input.DbColumnInfoList.GroupBy(q => q.DbColumnName).Any(q => q.Count() > 1))
+        {
+            throw Oops.Oh(ErrorCodeEnum.db1002);
+        }
+
         input.DbColumnInfoList.ForEach(m =>
         {
             columns.Add(new DbColumnInfo

+ 3 - 0
Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -51,6 +51,9 @@
 		<Content Update="wwwroot\Template\Input.cs.vm">
 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 		</Content>
+		<Content Update="wwwroot\Template\Manage - Copy.js.vm">
+		  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+		</Content>
 		<Content Update="wwwroot\Template\Manage.js.vm">
 			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 		</Content>

+ 42 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage - Copy.js.vm

@@ -0,0 +1,42 @@
+import { defHttp } from '/@@/utils/http/axios';
+enum Api {
+  Add@(@Model.ClassName) = '/@(@Model.ClassName)/add',
+  Delete@(@Model.ClassName) = '/@(@Model.ClassName)/delete',
+  Update@(@Model.ClassName) = '/@(@Model.ClassName)/edit',
+  Get@(@Model.ClassName)Page = '/@(@Model.ClassName)/page',
+  @foreach (var column in Model.TableField){
+if(@column.EffectType == "fk"){
+  @:Get@(@column.FkEntityName)Dropdown = '/@(@Model.ClassName)/@(@column.FkEntityName)Dropdown',
+}else if(@column.EffectType == "ApiTreeSelect"){
+  @:Get@(@column.FkEntityName)Tree = '/@(@Model.ClassName)/@(@column.FkEntityName)Tree',
+}
+}
+}
+
+//增加@(@Model.BusName)
+export function add@(@Model.ClassName)(params: any) {
+  return defHttp.post<any>({ url: Api.Add@(@Model.ClassName), params });
+}
+//删除@(@Model.BusName)
+export function delete@(@Model.ClassName)(params: any) {
+  return defHttp.post<any>({ url: Api.Delete@(@Model.ClassName), params });
+}
+//编辑@(@Model.BusName)
+export function update@(@Model.ClassName)(params: any) {
+  return defHttp.post<any>({ url: Api.Update@(@Model.ClassName), params });
+}
+//分页查询@(@Model.BusName)
+export function get@(@Model.ClassName)PageList(params?: any) {
+  return defHttp.post<any>({ url: Api.Get@(@Model.ClassName)Page, params });
+}
+@foreach (var column in Model.TableField){
+if(@column.EffectType == "fk"){
+@:export function get@(@column.FkEntityName)Dropdown() {
+  @:return defHttp.get<any>({ url: Api.Get@(@column.FkEntityName)Dropdown });
+@:}
+}else if(@column.EffectType == "ApiTreeSelect"){
+@:export function get@(@column.FkEntityName)Tree() {
+  @:return defHttp.get<any>({ url: Api.Get@(@column.FkEntityName)Tree });
+@:}
+}
+}

+ 64 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js - Copy.cshtml

@@ -0,0 +1,64 @@
+@Model  Admin.Net.Core.CustomEngine
+import request from '/@@/utils/request';
+
+enum Api {
+  Add@(@Model.ClassName) = '/@(@Model.ClassName)/add',
+  Delete@(@Model.ClassName) = '/@(@Model.ClassName)/delete',
+  Update@(@Model.ClassName) = '/@(@Model.ClassName)/edit',
+  Get@(@Model.ClassName)Page = '/@(@Model.ClassName)/page',
+  @foreach (var column in Model.TableField){
+if(@column.EffectType == "fk"){
+  @:Get@(@column.FkEntityName)Dropdown = '/@(@Model.ClassName)/@(@column.FkEntityName)Dropdown',
+}else if(@column.EffectType == "ApiTreeSelect"){
+  @:Get@(@column.FkEntityName)Tree = '/@(@Model.ClassName)/@(@column.FkEntityName)Tree',
+}
+}
+}
+
+// 增加@(@Model.BusName)
+export function add@(@Model.ClassName)(params?: any) =>
+	request({
+		url: Api.Add@(@Model.ClassName),
+		method: 'post',
+		data: params,
+	});
+
+// 删除@(@Model.BusName)
+export function delete@(@Model.ClassName)(params?: any) => 
+	request({
+			url: Api.Delete@(@Model.ClassName),
+			method: 'post',
+			data: params,
+		});
+
+// 编辑@(@Model.BusName)
+export function update@(@Model.ClassName)(params?: any) => 
+	request({
+			url: Api.Update@(@Model.ClassName),
+			method: 'post',
+			data: params,
+		});
+
+// 分页查询@(@Model.BusName)
+export function get@(@Model.ClassName)PageList(params?: any) => 
+	request({
+			url: Api.Get@(@Model.ClassName)Page,
+			method: 'get',
+			data: params,
+		});
+
+@foreach (var column in Model.TableField){
+if(@column.EffectType == "fk"){
+@:export function get@(@column.FkEntityName)Dropdown() =>
+  @:request({
+			@:url: Api.Get@(@Model.FkEntityName)Dropdown,
+			@:method: 'get'
+		@:});
+}else if(@column.EffectType == "ApiTreeSelect"){
+@:export function get@(@column.FkEntityName)Tree() =>
+   @:request({
+			@:url: Api.Get@(@Model.FkEntityName)Tree,
+			@:method: 'get'
+		@:});
+	}
+}

+ 46 - 26
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js.vm

@@ -1,4 +1,4 @@
-import { defHttp } from '/@@/utils/http/axios';
+import request from '/@@/utils/request';
 enum Api {
   Add@(@Model.ClassName) = '/@(@Model.ClassName)/add',
   Delete@(@Model.ClassName) = '/@(@Model.ClassName)/delete',
@@ -13,30 +13,50 @@ if(@column.EffectType == "fk"){
 }
 }
 
-//增加@(@Model.BusName)
-export function add@(@Model.ClassName)(params: any) {
-  return defHttp.post<any>({ url: Api.Add@(@Model.ClassName), params });
-}
-//删除@(@Model.BusName)
-export function delete@(@Model.ClassName)(params: any) {
-  return defHttp.post<any>({ url: Api.Delete@(@Model.ClassName), params });
-}
-//编辑@(@Model.BusName)
-export function update@(@Model.ClassName)(params: any) {
-  return defHttp.post<any>({ url: Api.Update@(@Model.ClassName), params });
-}
-//分页查询@(@Model.BusName)
-export function get@(@Model.ClassName)PageList(params?: any) {
-  return defHttp.post<any>({ url: Api.Get@(@Model.ClassName)Page, params });
-}
+// 增加@(@Model.BusName)
+export const add@(@Model.ClassName) = (params?: any) =>
+	request({
+		url: Api.Add@(@Model.ClassName),
+		method: 'post',
+		data: params,
+	});
+
+// 删除@(@Model.BusName)
+export const delete@(@Model.ClassName) = (params?: any) => 
+	request({
+			url: Api.Delete@(@Model.ClassName),
+			method: 'post',
+			data: params,
+		});
+
+// 编辑@(@Model.BusName)
+export const update@(@Model.ClassName) = (params?: any) => 
+	request({
+			url: Api.Update@(@Model.ClassName),
+			method: 'post',
+			data: params,
+		});
+
+// 分页查询@(@Model.BusName)
+export const get@(@Model.ClassName)PageList = (params?: any) => 
+	request({
+			url: Api.Get@(@Model.ClassName)Page,
+			method: 'get',
+			data: params,
+		});
+
 @foreach (var column in Model.TableField){
-if(@column.EffectType == "fk"){
-@:export function get@(@column.FkEntityName)Dropdown() {
-  @:return defHttp.get<any>({ url: Api.Get@(@column.FkEntityName)Dropdown });
-@:}
-}else if(@column.EffectType == "ApiTreeSelect"){
-@:export function get@(@column.FkEntityName)Tree() {
-  @:return defHttp.get<any>({ url: Api.Get@(@column.FkEntityName)Tree });
-@:}
-}
+	if(@column.EffectType == "fk"){
+		@:export const get@(@column.FkEntityName)Dropdown = () =>
+		@:request({
+		@:url: Api.Get@(@column.FkEntityName)Dropdown,
+		@:method: 'get'
+		@:});
+	}else if(@column.EffectType == "ApiTreeSelect"){
+		@:export const get@(@column.FkEntityName)Tree = () =>
+		@:request({
+		@:url: Api.Get@(@column.FkEntityName)Tree,
+		@:method: 'get'
+		@:});
+		}
 }

+ 1 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm

@@ -1,5 +1,6 @@
 using @(@Model.NameSpace).Const;
 using @(@Model.NameSpace).Entity;
+using Mapster;
 
 namespace @Model.NameSpace;
 /// <summary>

+ 220 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue - Copy.cshtml

@@ -0,0 +1,220 @@
+@Model  Admin.Net.Core.CustomEngine
+<template>
+	<div class="@(@Model.ClassName)-container">
+		<el-dialog
+		v-model="isShowDialog"
+		:title="title"
+		:width="700"
+		draggable>
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px" :rules="rules">
+				<el-row :gutter="35">
+					@foreach (var column in Model.TableField){
+					if(@column.ColumnKey == "True"){
+					@:<el-form-item v-show="false"><el-input v-model="ruleForm.@(@column.ColumnName)" /></el-form-item>
+					}else{
+					if (@column.WhetherAddUpdate == "Y"){
+					if(@column.EffectType == "fk"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-select clearable= v-model="ruleForm.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-select-option v-for="(item,index) in get@(@column.FkEntityName)DropdownList" :key="index" :value="item.code">{{ item.name }}</el-select-option>
+								@:</el-select>
+							@:</el-form-item>
+						@:</el-col>
+					}else if(@column.EffectType == "Input"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-input v-model="ruleForm.@(@column.ColumnName)" placeholder="ruleForm.@(@column.ColumnName)" clearable/>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "InputNumber"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-input-number v-model="ruleForm.@(@column.ColumnName)" placeholder="ruleForm.@(@column.ColumnName)" clearable/>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "InputTextArea"){
+					@:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-input v-model="ruleForm.@(@column.ColumnName)" placeholder="ruleForm.@(@column.ColumnName)" type="textarea" clearable/>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "Select"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-select clearable v-model="ruleForm.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-select-option v-for="(item,index) in getDictDataDropdownList('@(@column.DictTypeCode)')" :key="index" :value="item.value">{{ item.label }}</el-select-option>
+							@:</el-select>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "ConstSelector"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-select clearable="" v-model="ruleForm.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-select-option v-for="(item,index) in getSelectorList('@(@column.DictTypeCode)')" :key="index" :value="item.code">{{ item.name }}</el-select-option>
+								@:</el-select>
+							@:</el-form-item>
+						@:</el-col>
+					}else if(@column.EffectType == "Switch"){				
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-switch v-model="ruleForm.@(@column.ColumnName)" active-text="是" inactive-text="否" />
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "DatePicker"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-date-picker v-model="ruleForm.@(@column.ColumnName)" type="datetime" placeholder="@column.ColumnComment"  />
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "Upload"){
+					
+					}else{
+
+					}
+					}
+					}
+					}
+						</el-row>
+					</el-form>
+					<template #footer="">
+						<span class="dialog-footer">
+							<el-button @@click="cancel" size="default">取 消</el-button>
+							<el-button type="primary" @@click="submit" size="default">确 定</el-button>
+						</span>
+					</template>
+		</el-dialog>	
+	</div>
+</template>
+
+<script>
+	import { ref, toRefs, reactive, onMounted, defineComponent, getCurrentInstance, onUnmounted } from 'vue';
+	import { ElMessageBox, ElMessage } from 'element-plus';
+	import { auth } from '/@@/utils/authFunction';
+	import { formatDate } from '/@@/utils/formatTime';
+	import type { FormInstance, FormRules } from 'element-plus'
+
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "fk"){
+	@:import { get@(@column.FkEntityName)Dropdown } from '/@@/api/main/@(@Model.ClassName)';
+	}
+	}
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "Select"){
+	@:import { getDictDataDropdown } from '/@@/api/system/admin';
+	}
+	}
+
+	export default defineComponent({
+	name: 'edit@(@Model.ClassName)',
+	props: {
+	title: {
+	type: String,
+	default: '',
+	},
+	},
+	setup() {
+	const { proxy } = getCurrentInstance() as any;
+	const state = reactive({
+	isShowDialog: false,
+	ruleForm: {} as any,
+	});
+
+	const rules = reactive<FormRules>({
+	@foreach (var column in Model.TableField){
+		if(@column.WhetherRequired == "Y"){
+			if(@column.EffectType == "Input" || @column.EffectType == "InputNumber" ||@column.EffectType == "InputTextArea"){
+			@:@column.ColumnName: [{required: true, message: '请输入@(@column.ColumnComment)!', trigger: 'blur',},],
+			}else if(@column.EffectType == "DatePicker" || @column.EffectType == "Select" ||@column.EffectType == "ApiTreeSelect"){
+			@:@column.ColumnName: [{required: true, message: '请选择@(@column.ColumnComment)!', trigger: 'change',},],
+			}
+		}
+	}
+	});
+	onMounted(async () => {
+	handleQuery();
+
+	proxy.mittBus.on('submitRefresh', () => {
+	handleQuery();
+	});
+	});
+
+	onUnmounted(() => {
+	proxy.mittBus.off('submitRefresh');
+	});
+
+	// 打开弹窗
+	const openDialog = (row: any) => {
+	state.ruleForm = row;
+	state.isShowDialog = true;
+	};
+
+	// 关闭弹窗
+	const closeDialog = () => {
+	proxy.mittBus.emit('submitRefresh');
+	state.isShowDialog = false;
+	};
+
+	// 取消
+	const cancel = () => {
+	state.isShowDialog = false;
+	};
+
+	// 提交
+	const submit = () => {
+	ruleFormRef.value.validate(async (valid: boolean) => {
+	if (!valid) return;
+	if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
+	await update@(@Model.ClassName)(values);
+	} else {
+	await add@(@Model.ClassName)(state.ruleForm);
+	}
+	closeDialog();
+	});
+	};
+
+	@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+	@:const get@(@column.FkEntityName)DropdownList = await () => {
+	@:let list = await get@(@column.FkEntityName)Dropdown();
+	@:return list.data.result ?? [];
+	@:};
+	break;
+	}
+	}
+
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "Select"){
+	@:const getDictDataDropdownList = await (val: any) => {
+	@:let list = await getDictDataDropdownList(val);
+	@:return list.data.result ?? [];
+	@:};
+	break;
+	}
+	}
+	return {
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "fk"){
+	@:get@(@column.FkEntityName)DropdownList,
+	break;
+	}
+	}
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "Select"){
+	@:getDictDataDropdownList,
+	break;
+	}
+	}
+	ruleFormRef,
+	openDialog,
+	closeDialog,
+	cancel,
+	submit,
+	...toRefs(state),
+	rules,
+	};
+	}
+	})
+
+	}
+</script>

+ 209 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm

@@ -0,0 +1,209 @@
+<template>
+	<div class="@(@Model.ClassName)-container">
+		<el-dialog
+		v-model="isShowDialog"
+		:title="title"
+		:width="700"
+		draggable>
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px" :rules="rules">
+				<el-row :gutter="35">
+					@foreach (var column in Model.TableField){
+					if(@column.ColumnKey == "True"){
+					@:<el-form-item v-show="false"><el-input v-model="ruleForm.@(@column.ColumnName)" /></el-form-item>
+					}else{
+					if (@column.WhetherAddUpdate == "Y"){
+					if(@column.EffectType == "fk"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-select clearable= v-model="ruleForm.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-select-option v-for="(item,index) in get@(@column.FkEntityName)DropdownList" :key="index" :value="item.code">{{ item.name }}</el-select-option>
+								@:</el-select>
+							@:</el-form-item>
+						@:</el-col>
+					}else if(@column.EffectType == "Input"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-input v-model="ruleForm.@(@column.ColumnName)" placeholder="ruleForm.@(@column.ColumnName)" clearable/>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "InputNumber"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-input-number v-model="ruleForm.@(@column.ColumnName)" placeholder="ruleForm.@(@column.ColumnName)" clearable/>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "InputTextArea"){
+					@:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-input v-model="ruleForm.@(@column.ColumnName)" placeholder="ruleForm.@(@column.ColumnName)" type="textarea" clearable/>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "Select"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-select clearable v-model="ruleForm.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-select-option v-for="(item,index) in getDictDataDropdownList('@(@column.DictTypeCode)')" :key="index" :value="item.value">{{ item.label }}</el-select-option>
+							@:</el-select>
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "ConstSelector"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-select clearable="" v-model="ruleForm.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-select-option v-for="(item,index) in getSelectorList('@(@column.DictTypeCode)')" :key="index" :value="item.code">{{ item.name }}</el-select-option>
+								@:</el-select>
+							@:</el-form-item>
+						@:</el-col>
+					}else if(@column.EffectType == "Switch"){				
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-switch v-model="ruleForm.@(@column.ColumnName)" active-text="是" inactive-text="否" />
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "DatePicker"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment">
+							@:<el-date-picker v-model="ruleForm.@(@column.ColumnName)" type="datetime" placeholder="@column.ColumnComment"  />
+						@:</el-form-item>
+					@:</el-col>
+					}else if(@column.EffectType == "Upload"){
+					
+					}else{
+
+					}
+					}
+					}
+					}
+						</el-row>
+					</el-form>
+					<template #footer>
+						<span class="dialog-footer">
+							<el-button @@click="cancel" size="default">取 消</el-button>
+							<el-button type="primary" @@click="submit" size="default">确 定</el-button>
+						</span>
+					</template>
+		</el-dialog>	
+	</div>
+</template>
+
+<script lang="ts">
+	import { ref, toRefs, reactive, onMounted, defineComponent, getCurrentInstance, onUnmounted } from 'vue';
+	import { ElMessageBox, ElMessage } from 'element-plus';
+	import { auth } from '/@@/utils/authFunction';
+	import { formatDate } from '/@@/utils/formatTime';
+	import type { FormInstance, FormRules } from 'element-plus'
+
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "fk"){
+	@:import { get@(@column.FkEntityName)Dropdown } from '/@@/api/main/@(@Model.ClassName)';
+	}
+	}
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "Select"){
+	@:import { getDictDataDropdown } from '/@@/api/system/admin';
+	}
+	}
+
+	export default defineComponent({
+	name: 'edit@(@Model.ClassName)',
+	props: {
+	title: {
+	type: String,
+	default: '',
+	},
+	},
+	setup() {
+	const { proxy } = getCurrentInstance() as any;
+	const ruleFormRef = ref();
+	const state = reactive({
+	isShowDialog: false,
+	ruleForm: {} as any,
+	});
+
+	const rules = reactive<FormRules>({
+	@foreach (var column in Model.TableField){
+		if(@column.WhetherRequired == "Y"){
+			if(@column.EffectType == "Input" || @column.EffectType == "InputNumber" ||@column.EffectType == "InputTextArea"){
+			@:@column.ColumnName: [{required: true, message: '请输入@(@column.ColumnComment)!', trigger: 'blur',},],
+			}else if(@column.EffectType == "DatePicker" || @column.EffectType == "Select" ||@column.EffectType == "ApiTreeSelect"){
+			@:@column.ColumnName: [{required: true, message: '请选择@(@column.ColumnComment)!', trigger: 'change',},],
+			}
+		}
+	}
+	});
+
+	// 打开弹窗
+	const openDialog = (row: any) => {
+	state.ruleForm = row;
+	state.isShowDialog = true;
+	};
+
+	// 关闭弹窗
+	const closeDialog = () => {
+	proxy.mittBus.emit('submitRefresh');
+	state.isShowDialog = false;
+	};
+
+	// 取消
+	const cancel = () => {
+	state.isShowDialog = false;
+	};
+
+	// 提交
+	const submit = () => {
+	ruleFormRef.value.validate(async (valid: boolean) => {
+	if (!valid) return;
+	if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
+	await update@(@Model.ClassName)(values);
+	} else {
+	await add@(@Model.ClassName)(state.ruleForm);
+	}
+	closeDialog();
+	});
+	};
+
+	@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+	@:const get@(@column.FkEntityName)DropdownList = await () => {
+	@:let list = await get@(@column.FkEntityName)Dropdown();
+	@:return list.data.result ?? [];
+	@:};
+	break;
+	}
+	}
+
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "Select"){
+	@:const getDictDataDropdownList = await (val: any) => {
+	@:let list = await getDictDataDropdownList(val);
+	@:return list.data.result ?? [];
+	@:};
+	break;
+	}
+	}
+	return {
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "fk"){
+	@:get@(@column.FkEntityName)DropdownList,
+	break;
+	}
+	}
+	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "Select"){
+	@:getDictDataDropdownList,
+	break;
+	}
+	}
+	ruleFormRef,
+	openDialog,
+	closeDialog,
+	cancel,
+	submit,
+	...toRefs(state),
+	rules,
+	};
+	}
+	})
+
+	}
+</script>

+ 270 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue - Copy (2).cshtml

@@ -0,0 +1,270 @@
+@Model  Admin.Net.Core.CustomEngine
+<template>
+  <div class="@(@Model.ClassName)-container">
+    <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+		          
+@if(Model.QueryWhetherList.Count > 0){
+     @:<el-form :model="queryParams" ref="queryForm" :inline="true">
+		 @:<a-row>
+foreach (var column in Model.QueryWhetherList){
+    if(@column.EffectType == "Input" || @column.EffectType == "InputTextArea"){
+       @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+       @:<el-form-item label="@column.ColumnComment">
+       @:<el-input v-model="queryParam.@(@column.ColumnName)" clearable placeholder="请输入@(@column.ColumnComment)"/>
+       @:</el-form-item>
+       @:</el-col>
+    }else if(@column.EffectType == "InputTextArea"){
+		@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-input-number v-model="queryParam.@(@column.ColumnName)"  clearable placeholder="请输入@(@column.ColumnComment)"/>
+        @:</el-form-item>
+        @:</el-col>
+    }else if(@column.EffectType == "InputNumber"){
+		@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-input-number v-model="queryParam.@(@column.ColumnName)"  clearable placeholder="请输入@(@column.ColumnComment)"/>
+        @:</el-form-item>
+        @:</el-col>
+    }else if(@column.EffectType == "fk"){
+        @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-select clearable v-model="queryParam.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+        @:<el-select-option v-for="(item,index) in get@(@column.FkEntityName)DropdownList" :key="index" :value="item.vaue">{{ item.label }}</el-select-option>
+        @:</el-select>
+        @:</el-form-item>
+        @:</el-col>
+    }else if(@column.EffectType == "Select"){
+         @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+         @:<el-form-item label="@column.ColumnComment">
+         @:<el-select clearable v-model="queryParam.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+         @:<el-select-option v-for="(item,index) in getDictDataDropdownList('@(@column.DictTypeCode)')" :key="index" :value="item.code">{{ item.name }}</el-select-option>
+         @:</el-select>
+         @:</el-form-item>
+         @:</el-col>
+    }else if(@column.EffectType == "DatePicker"){
+        @:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-date-picker placeholder="请选择@(@column.ColumnComment)" v-model="queryParam.@(@column.ColumnName)Date" />
+        @:</el-form-item>
+        @:</el-col>
+    }
+			@:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" >
+             @: <span class="table-page-search-submitButtons">
+                @: <el-button icon="ele-Refresh" @@click="() => queryParam = {}"> 重置 </el-button>
+              @: <el-button type="primary" icon="ele-Search" @@click="handleQuery" v-auth="'@(@Model.ClassName):page'"> 查询 </el-button>
+				@:  <el-button icon="ele-Plus" @@click="openAdd@(@Model.ClassName)" v-auth="'@(@Model.ClassName):add'"> 新增 </el-button>  
+             @: </span>
+           @: </el-col>
+          @:</a-row>
+        @:</a-form>
+}
+}
+      
+    </a-card>
+    <a-card :bordered="false">
+	<el-table 
+		:data="userData" 
+		style="width: 100%" 
+		v-loading="loading" 
+		tooltip-effect="light"
+		row-key="id"
+		border>
+		<el-table-column type="index" label="序号" width="55" align="center" fixed />
+		@foreach (var column in Model.TableField){		   
+		     if(@column.WhetherTable == "Y"){
+			     if(@column.EffectType == "Upload"||@column.EffectType == "fk"||@column.EffectType == "Switch"||@column.EffectType == "ConstSelector"){
+				 @: <el-table-column prop="@column.ColumnName" label="@column.ColumnComment" fixed show-overflow-tooltip>
+					    @:<template #default="scope">
+			                if(@column.EffectType == "Upload"){
+								@:<el-image
+							        @:style="width: 60px; height: 60px"
+							        @::src="scope.row.url"
+							        @::lazy="true"
+							        @::hide-on-click-modal="true"
+							        @::preview-src-list="[scope.row.url]"
+							        @::initial-index="0"
+							        @:fit="scale-down"
+							        @:preview-teleported
+						         @:/>
+                            }else if(@column.EffectType == "fk"){
+                                @:<span>{{scope.row.fk@(@column.ColumnName).@(@column.LowerFkColumnName)}}</span>
+                            }else if(@column.EffectType == "Switch"){
+								@:<el-tag v-if="scope.row.@(@column.LowerColumnName)"> 是 </el-tag>
+								@:<el-tag type="danger" v-else> 否 </el-tag>
+                            }else if(@column.EffectType == "ConstSelector"){
+								@:<span>{{codeToName(scope.row.@(@column.LowerColumnName), '@(@column.DictTypeCode)')}</span>
+                            }
+					    @:</template>
+					@:</el-table-column>
+			     }
+                 else {
+				    @: <el-table-column prop="@column.ColumnName" label="@column.ColumnComment" fixed show-overflow-tooltip />
+				 }
+		    }
+			}
+			           <el-table-column label="操作" width="110" align="center" fixed="right" show-overflow-tooltip v-if="auth('@(@Model.ClassName):edit') || auth('@(@Model.ClassName):delete')">
+							<template #default="scope">
+								<el-button icon="ele-Edit" size="small" text type="primary" @@click="openEdit@(@Model.ClassName)(scope.row)" v-auth="'@(@Model.ClassName):update'"> 编辑 </el-button>
+								<el-button icon="ele-Edit" size="small" text type="primary" @@click="del@(@Model.ClassName)(scope.row)" v-auth="'@(@Model.ClassName):delete'"> 删除 </el-button>								
+							</template>
+		</el-table-column>
+	</el-table>
+	<el-pagination
+		v-model:currentPage="tableParams.page"
+		v-model:page-size="tableParams.pageSize"
+		:total="tableParams.total"
+		:page-sizes="[10, 20, 50, 100]"
+		small
+		background
+		@@size-change="handleSizeChange"
+		@@current-change="handleCurrentChange"
+		layout="total, sizes, prev, pager, next, jumper"
+	/>	 
+<editDialog ref="editDialogRef" :title="edit@(@Model.ClassName)Title"/>
+    </a-card>
+  </div>
+</template>
+
+<script lang="ts">
+	import { ref, toRefs, reactive, onMounted, defineComponent, getCurrentInstance, onUnmounted } from 'vue';
+    import { ElMessageBox, ElMessage } from 'element-plus';
+	import { auth } from '/@@/utils/authFunction';
+	import { formatDate } from '/@@/utils/formatTime';
+	
+	import editDialog from '/@@/views/main/@(@Model.ClassName)/component/editDialog.vue'
+	import { get@(@Model.ClassName)Page, delete@(@Model.ClassName) } from '/@@/api/main/@(@Model.ClassName)';
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+  @:import { get@(@column.FkEntityName)Dropdown } from '/@@/api/main/@(@Model.ClassName)';		
+	}
+}
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "Select"){
+  @:import { getDictDataDropdown } from '/@@/api/system/admin';
+  break;
+	}
+}	
+	export default defineComponent({
+	    name: '@(@Model.ClassName)',
+		components: { editDialog },
+		setup() {
+		    const { proxy } = getCurrentInstance() as any;
+			const editDialogRef = ref();
+			const state = reactive({
+			    loading: false,
+			    tableData: [] as any,
+			    queryParams: {} as any,
+			    tableParams: {
+				    page: 1,
+				    pageSize: 10,
+				    total: 0 as any,
+			    },
+			    edit@(@Model.ClassName)Title: '',
+		    });
+			
+			onMounted(async () => {
+			    handleQuery();
+
+			    proxy.mittBus.on('submitRefresh', () => {
+				    handleQuery();
+			    });
+		    });
+			
+		    onUnmounted(() => {
+			    proxy.mittBus.off('submitRefresh');
+		    });	
+			
+			// 查询操作
+		    const handleQuery = async () => {
+			    state.loading = true;
+			    var res = await get@(@Model.ClassName)Page(Object.assign(state.queryParams, state.tableParams));
+			    state.tableData = res.data.result?.items ?? [];
+			    state.tableParams.total = res.data.result?.total;
+			    state.loading = false;
+		    };
+			
+			// 打开新增页面
+		    const openAdd@(@Model.ClassName) = () => {
+			    state.edit@(@Model.ClassName)Title = '添加@(@Model.BusName)';
+			    editDialogRef.value.openDialog({});
+		    };
+			
+		    // 打开编辑页面
+		    const openEdit@(@Model.ClassName) = (row: any) => {
+			    state.edit@(@Model.ClassName)Title = '编辑@(@Model.BusName)';
+			    editDialogRef.value.openDialog(row);
+		    };
+			
+		    // 删除
+		    const del@(@Model.ClassName) = (row: any) => {
+			    ElMessageBox.confirm(`确定要删除吗?`, '提示', {
+				    confirmButtonText: '确定',
+				    cancelButtonText: '取消',
+				    type: 'warning',
+			    })
+				    .then(async () => {
+					    await delete@(@Model.ClassName)(row);
+					    handleQuery();
+					    ElMessage.success('删除成功');
+				    })
+				    .catch(() => {});
+		    };
+			
+		    // 改变页面容量
+		    const handleSizeChange = (val: number) => {
+			    state.tableParams.pageSize = val;
+			    handleQuery();
+		    };
+			
+		    // 改变页码序号
+		    const handleCurrentChange = (val: number) => {
+			    state.tableParams.page = val;
+			    handleQuery();
+		    };
+			
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+			@:const get@(@column.FkEntityName)DropdownList = await () => {
+				@:let list = await get@(@column.FkEntityName)Dropdown();
+			    @:return list.data.result ?? [];
+		    @:};
+			break;
+	}
+}
+
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "Select"){
+			@:const getDictDataDropdownList = await (val: any) => {
+				@:let list = await getDictDataDropdownList(val);
+			    @:return list.data.result ?? [];
+		    @:};
+			break;
+	}
+}
+            return {
+			    handleQuery,
+			    editDialogRef,
+			    openAdd@(@Model.ClassName),
+			    openEdit@(@Model.ClassName),
+			    del@(@Model.ClassName),
+			    handleSizeChange,
+			    handleCurrentChange,
+			    formatDate,
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+			@:get@(@column.FkEntityName)DropdownList,
+			break;
+	}
+}
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "Select"){
+			@:getDictDataDropdownList,
+			break;
+	}
+}				
+			    auth,
+			    ...toRefs(state),
+		   };
+		}
+	})
+</script>

+ 133 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue - Copy.vm

@@ -0,0 +1,133 @@
+<template>
+  <div>
+    <BasicTable @@register="registerTable">
+      <template #toolbar>
+        <a-button type="primary" @@click="handleCreate" :disabled="!hasPermission('@(@Model.ClassName):add')">新增@(@Model.BusName)</a-button>
+      </template>
+@foreach (var column in Model.TableField){
+if(@column.EffectType == "Upload"){
+      @:<template #@(@column.LowerColumnName)="{ text, record }">
+        <TableImg
+          v-if="record.@(@column.LowerColumnName)Attachment"
+          :size="60"
+          :simpleShow="true"
+          :showBadge="false"
+          :imgList="[downUrl + '/' + record.@(@column.LowerColumnName)Attachment.id + record.@(@column.LowerColumnName)Attachment.suffix]"
+        />
+      </template>
+}
+}
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'action'">
+          <TableAction
+            :actions="[
+              {
+                icon: 'clarity:note-edit-line',
+                label: '编辑',
+                onClick: handleEdit.bind(null, record),
+                disabled: !hasPermission('@(@Model.ClassName):edit'),
+              },
+              {
+                icon: 'ant-design:delete-outlined',
+                color: 'error',
+                label: '删除',
+                ifShow: hasPermission('@(@Model.ClassName):delete'),
+                popConfirm: {
+                  title: '是否确认删除',
+                  placement: 'left',
+                  confirm: handleDelete.bind(null, record),
+                },
+              },
+            ]"
+          />
+        </template>
+      </template>
+    </BasicTable>
+    <@(@Model.ClassName)Modal @@register="registerModal" @@success="handleSuccess" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent } from 'vue';
+  import { usePermission } from '/@@/hooks/web/usePermission';
+  @if(Model.IsUpload){
+  @:import { BasicTable, useTable, TableAction, TableImg } from '/@@/components/Table';
+  }else{
+  @:import { BasicTable, useTable, TableAction } from '/@@/components/Table';
+  }
+  import { useModal } from '/@@/components/Modal';
+  import @(@Model.ClassName)Modal from './dataModal.vue';
+
+  import { columns, searchFormSchema } from './data.data';
+  import { useMessage } from '/@@/hooks/web/useMessage';
+  import { get@(@Model.ClassName)PageList, delete@(@Model.ClassName) } from '/@@/api/main/@(@Model.ClassName)';
+  export default defineComponent({
+  @if(Model.IsUpload){
+    @:components: { BasicTable, @(@Model.ClassName)Modal, TableAction, TableImg },
+  }else{
+     @:components:{ BasicTable, @(@Model.ClassName)Modal, TableAction },
+  }
+    setup() {
+      const { hasPermission } = usePermission();
+      const { createMessage } = useMessage();
+      const [registerModal, { openModal }] = useModal();
+	  const hasPage = hasPermission('@(@Model.ClassName):page');
+      const [registerTable, { reload }] = useTable({
+        title: '@(@Model.BusName)列表',
+        api: get@(@Model.ClassName)PageList,
+        pagination: true,
+        rowKey: 'id',
+        columns,
+        formConfig: {
+          labelWidth: 120,
+          schemas: searchFormSchema,
+          autoSubmitOnEnter: true,
+        },
+        useSearchForm: hasPage,
+        immediate: hasPage,
+        showTableSetting: hasPage,
+        bordered: true,
+        canResize: true,
+        actionColumn: {
+          width: 160,
+          title: '操作',
+          dataIndex: 'action',
+          //slots: { customRender: 'action' },
+        },
+      });
+
+      function handleCreate() {
+        openModal(true, {
+          isUpdate: false,
+        });
+      }
+
+      function handleEdit(record: Recordable) {
+        openModal(true, {
+          record,
+          isUpdate: true,
+        });
+      }
+
+      async function handleDelete(record: Recordable) {
+        await delete@(@Model.ClassName)(record);
+        reload();
+        createMessage.success('删除成功!');
+      }
+      function handleSuccess() {
+        reload();
+      }
+      return {
+        hasPermission,
+        registerTable,
+        registerModal,
+        handleCreate,
+        handleEdit,
+        handleDelete,
+        handleSuccess,
+@if(@Model.IsUpload){
+        @:downUrl: import.meta.env.VITE_GLOB_DOWNLOAD_URL,
+}
+      };
+    },
+  });
+</script>

+ 259 - 123
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -1,133 +1,269 @@
 <template>
-  <div>
-    <BasicTable @@register="registerTable">
-      <template #toolbar>
-        <a-button type="primary" @@click="handleCreate" :disabled="!hasPermission('@(@Model.ClassName):add')">新增@(@Model.BusName)</a-button>
-      </template>
-@foreach (var column in Model.TableField){
-if(@column.EffectType == "Upload"){
-      @:<template #@(@column.LowerColumnName)="{ text, record }">
-        <TableImg
-          v-if="record.@(@column.LowerColumnName)Attachment"
-          :size="60"
-          :simpleShow="true"
-          :showBadge="false"
-          :imgList="[downUrl + '/' + record.@(@column.LowerColumnName)Attachment.id + record.@(@column.LowerColumnName)Attachment.suffix]"
-        />
-      </template>
+  <div class="@(@Model.ClassName)-container">
+    <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+		          
+@if(Model.QueryWhetherList.Count > 0){
+     @:<el-form :model="queryParams" ref="queryForm" :inline="true">
+		 @:<a-row>
+foreach (var column in Model.QueryWhetherList){
+    if(@column.EffectType == "Input" || @column.EffectType == "InputTextArea"){
+       @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+       @:<el-form-item label="@column.ColumnComment">
+       @:<el-input v-model="queryParam.@(@column.ColumnName)" clearable placeholder="请输入@(@column.ColumnComment)"/>
+       @:</el-form-item>
+       @:</el-col>
+    }else if(@column.EffectType == "InputTextArea"){
+		@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-input-number v-model="queryParam.@(@column.ColumnName)"  clearable placeholder="请输入@(@column.ColumnComment)"/>
+        @:</el-form-item>
+        @:</el-col>
+    }else if(@column.EffectType == "InputNumber"){
+		@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-input-number v-model="queryParam.@(@column.ColumnName)"  clearable placeholder="请输入@(@column.ColumnComment)"/>
+        @:</el-form-item>
+        @:</el-col>
+    }else if(@column.EffectType == "fk"){
+        @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-select clearable v-model="queryParam.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+        @:<el-select-option v-for="(item,index) in get@(@column.FkEntityName)DropdownList" :key="index" :value="item.vaue">{{ item.label }}</el-select-option>
+        @:</el-select>
+        @:</el-form-item>
+        @:</el-col>
+    }else if(@column.EffectType == "Select"){
+         @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+         @:<el-form-item label="@column.ColumnComment">
+         @:<el-select clearable v-model="queryParam.@(@column.ColumnName)" placeholder="请选择@(@column.ColumnComment)">
+         @:<el-select-option v-for="(item,index) in getDictDataDropdownList('@(@column.DictTypeCode)')" :key="index" :value="item.code">{{ item.name }}</el-select-option>
+         @:</el-select>
+         @:</el-form-item>
+         @:</el-col>
+    }else if(@column.EffectType == "DatePicker"){
+        @:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" >
+        @:<el-form-item label="@column.ColumnComment">
+        @:<el-date-picker placeholder="请选择@(@column.ColumnComment)" v-model="queryParam.@(@column.ColumnName)Date" />
+        @:</el-form-item>
+        @:</el-col>
+    }
+			@:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" >
+             @: <span class="table-page-search-submitButtons">
+                @: <el-button icon="ele-Refresh" @@click="() => queryParam = {}"> 重置 </el-button>
+              @: <el-button type="primary" icon="ele-Search" @@click="handleQuery" v-auth="'@(@Model.ClassName):page'"> 查询 </el-button>
+				@:  <el-button icon="ele-Plus" @@click="openAdd@(@Model.ClassName)" v-auth="'@(@Model.ClassName):add'"> 新增 </el-button>  
+             @: </span>
+           @: </el-col>
+          @:</a-row>
+        @:</a-form>
 }
 }
-      <template #bodyCell="{ column, record }">
-        <template v-if="column.key === 'action'">
-          <TableAction
-            :actions="[
-              {
-                icon: 'clarity:note-edit-line',
-                label: '编辑',
-                onClick: handleEdit.bind(null, record),
-                disabled: !hasPermission('@(@Model.ClassName):edit'),
-              },
-              {
-                icon: 'ant-design:delete-outlined',
-                color: 'error',
-                label: '删除',
-                ifShow: hasPermission('@(@Model.ClassName):delete'),
-                popConfirm: {
-                  title: '是否确认删除',
-                  placement: 'left',
-                  confirm: handleDelete.bind(null, record),
-                },
-              },
-            ]"
-          />
-        </template>
-      </template>
-    </BasicTable>
-    <@(@Model.ClassName)Modal @@register="registerModal" @@success="handleSuccess" />
+      
+    </a-card>
+    <a-card :bordered="false">
+	<el-table 
+		:data="tableData" 
+		style="width: 100%" 
+		v-loading="loading" 
+		tooltip-effect="light"
+		row-key="id"
+		border>
+		<el-table-column type="index" label="序号" width="55" align="center" fixed />
+		@foreach (var column in Model.TableField){		   
+		     if(@column.WhetherTable == "Y"){
+			     if(@column.EffectType == "Upload"||@column.EffectType == "fk"||@column.EffectType == "Switch"||@column.EffectType == "ConstSelector"){
+				 @: <el-table-column prop="@column.ColumnName" label="@column.ColumnComment" fixed show-overflow-tooltip>
+					    @:<template #default="scope">
+			                if(@column.EffectType == "Upload"){
+								@:<el-image
+							        @:style="width: 60px; height: 60px"
+							        @::src="scope.row.url"
+							        @::lazy="true"
+							        @::hide-on-click-modal="true"
+							        @::preview-src-list="[scope.row.url]"
+							        @::initial-index="0"
+							        @:fit="scale-down"
+							        @:preview-teleported
+						         @:/>
+                            }else if(@column.EffectType == "fk"){
+                                @:<span>{{scope.row.fk@(@column.ColumnName).@(@column.LowerFkColumnName)}}</span>
+                            }else if(@column.EffectType == "Switch"){
+								@:<el-tag v-if="scope.row.@(@column.LowerColumnName)"> 是 </el-tag>
+								@:<el-tag type="danger" v-else> 否 </el-tag>
+                            }else if(@column.EffectType == "ConstSelector"){
+								@:<span>{{codeToName(scope.row.@(@column.LowerColumnName), '@(@column.DictTypeCode)')}</span>
+                            }
+					    @:</template>
+					@:</el-table-column>
+			     }
+                 else {
+				    @: <el-table-column prop="@column.ColumnName" label="@column.ColumnComment" fixed show-overflow-tooltip />
+				 }
+		    }
+			}
+			           <el-table-column label="操作" width="110" align="center" fixed="right" show-overflow-tooltip v-if="auth('@(@Model.ClassName):edit') || auth('@(@Model.ClassName):delete')">
+							<template #default="scope">
+								<el-button icon="ele-Edit" size="small" text type="primary" @@click="openEdit@(@Model.ClassName)(scope.row)" v-auth="'@(@Model.ClassName):update'"> 编辑 </el-button>
+								<el-button icon="ele-Edit" size="small" text type="primary" @@click="del@(@Model.ClassName)(scope.row)" v-auth="'@(@Model.ClassName):delete'"> 删除 </el-button>								
+							</template>
+		</el-table-column>
+	</el-table>
+	<el-pagination
+		v-model:currentPage="tableParams.page"
+		v-model:page-size="tableParams.pageSize"
+		:total="tableParams.total"
+		:page-sizes="[10, 20, 50, 100]"
+		small
+		background
+		@@size-change="handleSizeChange"
+		@@current-change="handleCurrentChange"
+		layout="total, sizes, prev, pager, next, jumper"
+	/>	 
+<editDialog ref="editDialogRef" :title="edit@(@Model.ClassName)Title"/>
+    </a-card>
   </div>
 </template>
-<script lang="ts">
-  import { defineComponent } from 'vue';
-  import { usePermission } from '/@@/hooks/web/usePermission';
-  @if(Model.IsUpload){
-  @:import { BasicTable, useTable, TableAction, TableImg } from '/@@/components/Table';
-  }else{
-  @:import { BasicTable, useTable, TableAction } from '/@@/components/Table';
-  }
-  import { useModal } from '/@@/components/Modal';
-  import @(@Model.ClassName)Modal from './dataModal.vue';
-
-  import { columns, searchFormSchema } from './data.data';
-  import { useMessage } from '/@@/hooks/web/useMessage';
-  import { get@(@Model.ClassName)PageList, delete@(@Model.ClassName) } from '/@@/api/main/@(@Model.ClassName)';
-  export default defineComponent({
-  @if(Model.IsUpload){
-    @:components: { BasicTable, @(@Model.ClassName)Modal, TableAction, TableImg },
-  }else{
-     @:components:{ BasicTable, @(@Model.ClassName)Modal, TableAction },
-  }
-    setup() {
-      const { hasPermission } = usePermission();
-      const { createMessage } = useMessage();
-      const [registerModal, { openModal }] = useModal();
-	  const hasPage = hasPermission('@(@Model.ClassName):page');
-      const [registerTable, { reload }] = useTable({
-        title: '@(@Model.BusName)列表',
-        api: get@(@Model.ClassName)PageList,
-        pagination: true,
-        rowKey: 'id',
-        columns,
-        formConfig: {
-          labelWidth: 120,
-          schemas: searchFormSchema,
-          autoSubmitOnEnter: true,
-        },
-        useSearchForm: hasPage,
-        immediate: hasPage,
-        showTableSetting: hasPage,
-        bordered: true,
-        canResize: true,
-        actionColumn: {
-          width: 160,
-          title: '操作',
-          dataIndex: 'action',
-          //slots: { customRender: 'action' },
-        },
-      });
 
-      function handleCreate() {
-        openModal(true, {
-          isUpdate: false,
-        });
-      }
+<script lang="ts">
+	import { ref, toRefs, reactive, onMounted, defineComponent, getCurrentInstance, onUnmounted } from 'vue';
+    import { ElMessageBox, ElMessage } from 'element-plus';
+	import { auth } from '/@@/utils/authFunction';
+	import { formatDate } from '/@@/utils/formatTime';
+	
+	import editDialog from '/@@/views/main/@(@Model.ClassName)/component/editDialog.vue'
+	import { get@(@Model.ClassName)Page, delete@(@Model.ClassName) } from '/@@/api/main/@(@Model.ClassName)';
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+  @:import { get@(@column.FkEntityName)Dropdown } from '/@@/api/main/@(@Model.ClassName)';		
+	}
+}
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "Select"){
+  @:import { getDictDataDropdown } from '/@@/api/system/admin';
+  break;
+	}
+}	
+	export default defineComponent({
+	    name: '@(@Model.ClassName)',
+		components: { editDialog },
+		setup() {
+		    const { proxy } = getCurrentInstance() as any;
+			const editDialogRef = ref();
+			const state = reactive({
+			    loading: false,
+			    tableData: [] as any,
+			    queryParams: {} as any,
+			    tableParams: {
+				    page: 1,
+				    pageSize: 10,
+				    total: 0 as any,
+			    },
+			    edit@(@Model.ClassName)Title: '',
+		    });
+			
+			onMounted(async () => {
+			    handleQuery();
 
-      function handleEdit(record: Recordable) {
-        openModal(true, {
-          record,
-          isUpdate: true,
-        });
-      }
+			    proxy.mittBus.on('submitRefresh', () => {
+				    handleQuery();
+			    });
+		    });
+			
+		    onUnmounted(() => {
+			    proxy.mittBus.off('submitRefresh');
+		    });	
+			
+			// 查询操作
+		    const handleQuery = async () => {
+			    state.loading = true;
+			    var res = await get@(@Model.ClassName)Page(Object.assign(state.queryParams, state.tableParams));
+			    state.tableData = res.data.result?.items ?? [];
+			    state.tableParams.total = res.data.result?.total;
+			    state.loading = false;
+		    };
+			
+			// 打开新增页面
+		    const openAdd@(@Model.ClassName) = () => {
+			    state.edit@(@Model.ClassName)Title = '添加@(@Model.BusName)';
+			    editDialogRef.value.openDialog({});
+		    };
+			
+		    // 打开编辑页面
+		    const openEdit@(@Model.ClassName) = (row: any) => {
+			    state.edit@(@Model.ClassName)Title = '编辑@(@Model.BusName)';
+			    editDialogRef.value.openDialog(row);
+		    };
+			
+		    // 删除
+		    const del@(@Model.ClassName) = (row: any) => {
+			    ElMessageBox.confirm(`确定要删除吗?`, '提示', {
+				    confirmButtonText: '确定',
+				    cancelButtonText: '取消',
+				    type: 'warning',
+			    })
+				    .then(async () => {
+					    await delete@(@Model.ClassName)(row);
+					    handleQuery();
+					    ElMessage.success('删除成功');
+				    })
+				    .catch(() => {});
+		    };
+			
+		    // 改变页面容量
+		    const handleSizeChange = (val: number) => {
+			    state.tableParams.pageSize = val;
+			    handleQuery();
+		    };
+			
+		    // 改变页码序号
+		    const handleCurrentChange = (val: number) => {
+			    state.tableParams.page = val;
+			    handleQuery();
+		    };
+			
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+			@:const get@(@column.FkEntityName)DropdownList = await () => {
+				@:let list = await get@(@column.FkEntityName)Dropdown();
+			    @:return list.data.result ?? [];
+		    @:};
+			break;
+	}
+}
 
-      async function handleDelete(record: Recordable) {
-        await delete@(@Model.ClassName)(record);
-        reload();
-        createMessage.success('删除成功!');
-      }
-      function handleSuccess() {
-        reload();
-      }
-      return {
-        hasPermission,
-        registerTable,
-        registerModal,
-        handleCreate,
-        handleEdit,
-        handleDelete,
-        handleSuccess,
-@if(@Model.IsUpload){
-        @:downUrl: import.meta.env.VITE_GLOB_DOWNLOAD_URL,
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "Select"){
+			@:const getDictDataDropdownList = await (val: any) => {
+				@:let list = await getDictDataDropdownList(val);
+			    @:return list.data.result ?? [];
+		    @:};
+			break;
+	}
+}
+            return {
+			    handleQuery,
+			    editDialogRef,
+			    openAdd@(@Model.ClassName),
+			    openEdit@(@Model.ClassName),
+			    del@(@Model.ClassName),
+			    handleSizeChange,
+			    handleCurrentChange,
+			    formatDate,
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "fk"){
+			@:get@(@column.FkEntityName)DropdownList,
+			break;
+	}
 }
-      };
-    },
-  });
+@foreach (var column in Model.QueryWhetherList){
+	if(@column.EffectType == "Select"){
+			@:getDictDataDropdownList,
+			break;
+	}
+}				
+			    auth,
+			    ...toRefs(state),
+		   };
+		}
+	})
 </script>

+ 40 - 0
Web/src/api/main/generatetest.ts

@@ -0,0 +1,40 @@
+import request from '/@/utils/request';
+enum Api {
+  Addgeneratetest = '/generatetest/add',
+  Deletegeneratetest = '/generatetest/delete',
+  Updategeneratetest = '/generatetest/edit',
+  GetgeneratetestPage = '/generatetest/page',
+}
+
+// 增加GenerateTest
+export const addgeneratetest = (params?: any) =>
+	request({
+		url: Api.Addgeneratetest,
+		method: 'post',
+		data: params,
+	});
+
+// 删除GenerateTest
+export const deletegeneratetest = (params?: any) => 
+	request({
+			url: Api.Deletegeneratetest,
+			method: 'post',
+			data: params,
+		});
+
+// 编辑GenerateTest
+export const updategeneratetest = (params?: any) => 
+	request({
+			url: Api.Updategeneratetest,
+			method: 'post',
+			data: params,
+		});
+
+// 分页查询GenerateTest
+export const getgeneratetestPageList = (params?: any) => 
+	request({
+			url: Api.GetgeneratetestPage,
+			method: 'get',
+			data: params,
+		});
+

+ 180 - 36
Web/src/api/system/admin.ts

@@ -1,6 +1,21 @@
 import request from '/@/utils/request';
 
 enum Api {
+	// 获取菜单列表
+	GetMenuList = '/sysMenu/list',
+	// 字典接口
+	GetDictTypePageList = '/sysDictType/pageList',
+	GetDictTypeList = '/sysDictType/list',
+	AddDictType = '/sysDictType/add',
+	UpdateDictType = '/sysDictType/update',
+	DeleteDictType = '/sysDictType/delete',
+
+	GetDictDataPageList = '/sysDictData/pageList',
+	AddDictData = '/sysDictData/add',
+	UpdateDictData = '/sysDictData/update',
+	DeleteDictData = '/sysDictData/delete',
+	GetDictDataDropdown = '/sysDictData/DictDataDropdown',
+	QueryDictDataDropdown = '/sysDictData/queryDictDataDropdown',
 	// 代码生成接口
 	GetGeneratePage = '/codeGenerate/page',
 	AddGenerate = '/codeGenerate/add',
@@ -12,6 +27,7 @@ enum Api {
 	GenerateRunDown = '/codeGenerate/runDown',
 	GetGenerateConfigList = '/sysCodeGenerateConfig/list',
 	UpdateGenerateConfig = '/sysCodeGenerateConfig/edit',
+	GetDatabaseList = '/codeGenerate/DatabaseList',
 
 	// 数据库接口
 	GetColumnInfoList = '/sysDatabase/columnList',
@@ -22,9 +38,137 @@ enum Api {
 	AddColumn = '/sysDatabase/column/add',
 	UpdateColumn = '/sysDatabase/column/update',
 	DeleteColumn = '/sysDatabase/column/delete',
-	CreateEntity = '/sysDatabase/entity/createEntity',
+	CreateEntity = '/sysDatabase/entity/create',
+
+	// 常量下拉框接口
+	AllConstSelector = '/constSelector/allConstSelector',
+	ConstSelector = '/constSelector/constSelector',
+	AllConstSelectorWithOptions = '/constSelector/allConstSelectorWithOptions',
 }
 
+////////// 常量下拉框管理接口 //////////
+// 获取所有常量下拉框列表
+export const getAllConstSelector = () =>
+	request({
+		url: Api.AllConstSelector,
+		method: 'get',
+	});
+
+// 根据类名获取下拉框数据
+export const getConstSelector = (typeName?: string) =>
+	request({
+		url: Api.ConstSelector,
+		method: 'get',
+		data: { typeName },
+	});
+
+// 获取所有下拉框及选项
+export const getAllConstSelectorWithOptions = () =>
+	request({
+		url: Api.AllConstSelectorWithOptions,
+		method: 'get',
+	});
+
+export const getDictTypeList = (params?: any) =>
+	request({
+		url: Api.GetDictTypeList,
+		method: 'get',
+		data: params,
+	});
+
+export const getMenuList = (params?: any) =>
+	request({
+		url: Api.GetMenuList,
+		method: 'get',
+		data: params,
+	});
+
+// 从字典中值,下拉框控件使用
+export const getDictDataDropdown = (params: any) =>
+	request({
+		url: Api.GetDictDataDropdown + '/' + params,
+		method: 'get',
+	});
+
+////////// 代码生成接口 //////////
+// 分页查询代码生成
+export const getGeneratePage = (params?: any) =>
+	request({
+		url: Api.GetGeneratePage,
+		method: 'get',
+		data: params,
+	});
+
+// 增加代码生成
+export const addGenerate = (params: any) =>
+	request({
+		url: Api.AddGenerate,
+		method: 'post',
+		data: params,
+	});
+
+// 修改代码生成
+export const updateGenerate = (params: any) =>
+	request({
+		url: Api.UpdateGenerate,
+		method: 'post',
+		data: params,
+	});
+
+// 删除代码生成
+export const deleGenerate = (params: any) =>
+	request({
+		url: Api.DeleGenerate,
+		method: 'post',
+		data: params,
+	});
+
+// 获取数据库(上下文定位器)集合
+export const getDatabaseList = (params?: any) =>
+	request({
+		url: Api.GetDatabaseList,
+		method: 'get',
+		data: params,
+	});
+
+// 获取数据库表(实体)集合
+export const getTableList = (configId: string) =>
+	request({
+		url: Api.GetTableList + '/' + configId,
+		method: 'get',
+	});
+
+// 根据表名获取列
+export const getColumnList = (configId: string, tableName: string) =>
+	request({
+		url: Api.GetColumnList + '/' + configId + '/' + tableName,
+		method: 'get',
+	});
+
+// 本地生成
+export const generateRunLocal = (params: any) =>
+	request({
+		url: Api.GenerateRunLocal,
+		method: 'post',
+		data: params,
+	});
+
+// 代码生成详细配置列表
+export const getGenerateConfigList = (params?: any) =>
+	request({
+		url: Api.GetGenerateConfigList,
+		method: 'get',
+		data: params,
+	});
+
+// 编辑代码生成详细配置
+export const updateGenerateConfig = (params: any) =>
+	request({
+		url: Api.UpdateGenerateConfig,
+		method: 'post',
+		data: params,
+	});
+
 //////////数据库管理接口 //////////
 // 获取表字段
 export const getColumnInfoList = (params: any) =>
@@ -44,56 +188,56 @@ export const getTableInfoList = (params?: any) =>
 
 // 添加表
 export const addTable = (params: any) =>
-request({
-    url: Api.AddTable,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.AddTable,
+		method: 'post',
+		data: params,
+	});
 
 // 修改表
 export const updateTable = (params: any) =>
-request({
-    url: Api.UpdateTable,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.UpdateTable,
+		method: 'post',
+		data: params,
+	});
 
 // 删除表
 export const deleteTable = (params: any) =>
-request({
-    url: Api.DeleTetable,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.DeleTetable,
+		method: 'post',
+		data: params,
+	});
 
 // 添加字段
 export const addColumn = (params: any) =>
-request({
-    url: Api.AddColumn,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.AddColumn,
+		method: 'post',
+		data: params,
+	});
 
 // 修改字段
 export const updateColumn = (params: any) =>
-request({
-    url: Api.UpdateColumn,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.UpdateColumn,
+		method: 'post',
+		data: params,
+	});
 
 // 删除字段
 export const deleteColumn = (params: any) =>
-request({
-    url: Api.DeleteColumn,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.DeleteColumn,
+		method: 'post',
+		data: params,
+	});
 
 // 生成实体
 export const createEntity = (params: any) =>
-request({
-    url: Api.CreateEntity,
-    method: 'post',
-    data: params,
-});
+	request({
+		url: Api.CreateEntity,
+		method: 'post',
+		data: params,
+	});

+ 30 - 0
Web/src/api/system/enum.ts

@@ -0,0 +1,30 @@
+/**
+ * 
+ * @export
+ * @enum {string}
+ */
+ export enum DbObjectType {
+    NUMBER_0 = 0,
+    NUMBER_1 = 1,
+    NUMBER_2 = 2
+}
+/**
+ * 系统菜单类型枚举<br />&nbsp;目录 Dir = 1<br />&nbsp;菜单 Menu = 2<br />&nbsp;按钮 Btn = 3<br />
+ * @export
+ * @enum {string}
+ */
+ export enum MenuTypeEnum {
+    NUMBER_1 = 1,
+    NUMBER_2 = 2,
+    NUMBER_3 = 3
+}
+
+/**
+ * 通用状态枚举<br />&nbsp;启用 Enable = 1<br />&nbsp;停用 Disable = 2<br />
+ * @export
+ * @enum {string}
+ */
+ export enum StatusEnum {
+    NUMBER_1 = 1,
+    NUMBER_2 = 2
+}

+ 754 - 0
Web/src/api/system/interface.ts

@@ -0,0 +1,754 @@
+import { DbObjectType, MenuTypeEnum, StatusEnum } from './enum';
+
+/**
+ *
+ * @export
+ * @interface DbTableInfo
+ */
+export interface DbTableInfo {
+	/**
+	 *
+	 * @type {string}
+	 * @memberof DbTableInfo
+	 */
+	name?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof DbTableInfo
+	 */
+	description?: string | null;
+	/**
+	 *
+	 * @type {DbObjectType}
+	 * @memberof DbTableInfo
+	 */
+	// dbObjectType?: DbObjectType;
+}
+
+/**
+ *
+ * @export
+ * @interface EditRecordRow
+ */
+export interface EditRecordRow {
+	columnDescription?: string | null;
+	dataType?: string | null;
+	dbColumnName?: string | null;
+	decimalDigits: number;
+	isIdentity: number;
+	isNullable: number;
+	isPrimarykey: number;
+	length: number;
+	key?: number;
+	editable?: boolean;
+	isNew: boolean;
+}
+
+/**
+ *
+ * @export
+ * @interface UpdateDbTableInput
+ */
+export interface UpdateDbTableInput {
+	/**
+	 *
+	 * @type {string}
+	 * @memberof UpdateDbTableInput
+	 */
+	configId?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof UpdateDbTableInput
+	 */
+	tableName?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof UpdateDbTableInput
+	 */
+	oldTableName?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof UpdateDbTableInput
+	 */
+	description?: string | null;
+}
+
+/**
+ *
+ * @export
+ * @interface AddDbColumnInput
+ */
+export interface AddDbColumnInput {
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	configId?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	tableName?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	columnDescription?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	dataType?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	dbColumnName?: string | null;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	decimalDigits: number;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	isIdentity: number;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	isNullable: number;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	isPrimarykey: number;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	length: number;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	key: number;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	editable: boolean;
+	/**
+	 *
+	 * @type {string}
+	 * @memberof AddDbColumnInput
+	 */
+	isNew: boolean;
+}
+
+/**
+ *
+ * @export
+ * @interface AddCodeGenInput
+ */
+export interface AddCodeGenInput {
+	/**
+	 * 当前页码
+	 * @type {number}
+	 * @memberof AddCodeGenInput
+	 */
+	page?: number;
+	/**
+	 * 页码容量
+	 * @type {number}
+	 * @memberof AddCodeGenInput
+	 */
+	pageSize?: number;
+	/**
+	 * 排序字段
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	field?: string | null;
+	/**
+	 * 排序方向
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	order?: string | null;
+	/**
+	 * 降序排序
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	descStr?: string | null;
+	/**
+	 * 类名
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	className?: string | null;
+	/**
+	 * 是否移除表前缀
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	tablePrefix?: string | null;
+	/**
+	 * 库定位器名
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	configId?: string | null;
+	/**
+	 * 数据库名(保留字段)
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	dbName?: string | null;
+	/**
+	 * 数据库类型
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	dbType: string;
+	/**
+	 * 数据库类型
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	dbTypeString?: string | null;
+	/**
+	 * 数据库链接
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	connectionString?: string | null;
+	/**
+	 * 功能名(数据库表名称)
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	tableComment?: string | null;
+	/**
+	 * 菜单应用分类(应用编码)
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	menuApplication?: string | null;
+	/**
+	 * 数据库表名
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	tableName: string;
+	/**
+	 * 业务名(业务代码包名称)
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	busName: string;
+	/**
+	 * 命名空间
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	nameSpace: string;
+	/**
+	 * 作者姓名
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	authorName: string;
+	/**
+	 * 生成方式
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	generateType: string;
+	/**
+	 * 菜单父级
+	 * @type {number}
+	 * @memberof AddCodeGenInput
+	 */
+	menuPid: number;
+	/**
+	 * 菜单父级
+	 * @type {number}
+	 * @memberof AddCodeGenInput
+	 */
+	id: number;
+	/**
+	 * 生成方式
+	 * @type {string}
+	 * @memberof AddCodeGenInput
+	 */
+	type: string;
+}
+/**
+ * 代码生成表
+ * @export
+ * @interface SysCodeGen
+ */
+export interface SysCodeGen {
+	/**
+	 * 雪花Id
+	 * @type {number}
+	 * @memberof SysCodeGen
+	 */
+	id?: number;
+	/**
+	 * 创建时间
+	 * @type {Date}
+	 * @memberof SysCodeGen
+	 */
+	createTime?: Date | null;
+	/**
+	 * 更新时间
+	 * @type {Date}
+	 * @memberof SysCodeGen
+	 */
+	updateTime?: Date | null;
+	/**
+	 * 创建者Id
+	 * @type {number}
+	 * @memberof SysCodeGen
+	 */
+	createUserId?: number | null;
+	/**
+	 * 修改者Id
+	 * @type {number}
+	 * @memberof SysCodeGen
+	 */
+	updateUserId?: number | null;
+	/**
+	 * 软删除
+	 * @type {boolean}
+	 * @memberof SysCodeGen
+	 */
+	isDelete?: boolean;
+	/**
+	 * 作者姓名
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	authorName?: string | null;
+	/**
+	 * 是否移除表前缀
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	tablePrefix?: string | null;
+	/**
+	 * 生成方式
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	generateType?: string | null;
+	/**
+	 * 库定位器名
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	configId?: string | null;
+	/**
+	 * 数据库名(保留字段)
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	dbName?: string | null;
+	/**
+	 * 数据库类型
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	dbType?: string | null;
+	/**
+	 * 数据库链接
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	connectionString?: string | null;
+	/**
+	 * 数据库表名
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	tableName?: string | null;
+	/**
+	 * 命名空间
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	nameSpace?: string | null;
+	/**
+	 * 业务名
+	 * @type {string}
+	 * @memberof SysCodeGen
+	 */
+	busName?: string | null;
+	/**
+	 * 菜单编码
+	 * @type {number}
+	 * @memberof SysCodeGen
+	 */
+	menuPid?: number;
+}
+
+/**
+ * 系统菜单表
+ * @export
+ * @interface SysMenu
+ */
+export interface SysMenu {
+	/**
+	 * 雪花Id
+	 * @type {number}
+	 * @memberof SysMenu
+	 */
+	id?: number;
+	/**
+	 * 创建时间
+	 * @type {Date}
+	 * @memberof SysMenu
+	 */
+	createTime?: Date | null;
+	/**
+	 * 更新时间
+	 * @type {Date}
+	 * @memberof SysMenu
+	 */
+	updateTime?: Date | null;
+	/**
+	 * 创建者Id
+	 * @type {number}
+	 * @memberof SysMenu
+	 */
+	createUserId?: number | null;
+	/**
+	 * 修改者Id
+	 * @type {number}
+	 * @memberof SysMenu
+	 */
+	updateUserId?: number | null;
+	/**
+	 * 软删除
+	 * @type {boolean}
+	 * @memberof SysMenu
+	 */
+	isDelete?: boolean;
+	/**
+	 * 父Id
+	 * @type {number}
+	 * @memberof SysMenu
+	 */
+	pid?: number;
+	/**
+	 *
+	 * @type {MenuTypeEnum}
+	 * @memberof SysMenu
+	 */
+	type?: MenuTypeEnum;
+	/**
+	 * 名称
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	name?: string | null;
+	/**
+	 * 路由地址
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	path?: string | null;
+	/**
+	 * 组件路径
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	component?: string | null;
+	/**
+	 * 重定向
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	redirect?: string | null;
+	/**
+	 * 权限标识
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	permission?: string | null;
+	/**
+	 * 标题
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	title: string;
+	/**
+	 * 图标
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	icon?: string | null;
+	/**
+	 * 是否内嵌
+	 * @type {boolean}
+	 * @memberof SysMenu
+	 */
+	isIframe?: boolean;
+	/**
+	 * 外链链接
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	outLink?: string | null;
+	/**
+	 * 是否隐藏
+	 * @type {boolean}
+	 * @memberof SysMenu
+	 */
+	isHide?: boolean;
+	/**
+	 * 是否缓存
+	 * @type {boolean}
+	 * @memberof SysMenu
+	 */
+	isKeepAlive?: boolean;
+	/**
+	 * 是否固定
+	 * @type {boolean}
+	 * @memberof SysMenu
+	 */
+	isAffix?: boolean;
+	/**
+	 * 排序
+	 * @type {number}
+	 * @memberof SysMenu
+	 */
+	order?: number;
+	/**
+	 *
+	 * @type {StatusEnum}
+	 * @memberof SysMenu
+	 */
+	status?: StatusEnum;
+	/**
+	 * 备注
+	 * @type {string}
+	 * @memberof SysMenu
+	 */
+	remark?: string | null;
+	/**
+	 * 菜单子项
+	 * @type {Array<SysMenu>}
+	 * @memberof SysMenu
+	 */
+	children?: Array<SysMenu> | null;
+}
+
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+/**
+ * 代码生成字段配置表
+ * @export
+ * @interface SysCodeGenConfig
+ */
+ export interface SysCodeGenConfig {
+    /**
+     * 雪花Id
+     * @type {number}
+     * @memberof SysCodeGenConfig
+     */
+    id?: number;
+    /**
+     * 创建时间
+     * @type {Date}
+     * @memberof SysCodeGenConfig
+     */
+    createTime?: Date | null;
+    /**
+     * 更新时间
+     * @type {Date}
+     * @memberof SysCodeGenConfig
+     */
+    updateTime?: Date | null;
+    /**
+     * 创建者Id
+     * @type {number}
+     * @memberof SysCodeGenConfig
+     */
+    createUserId?: number | null;
+    /**
+     * 修改者Id
+     * @type {number}
+     * @memberof SysCodeGenConfig
+     */
+    updateUserId?: number | null;
+    /**
+     * 软删除
+     * @type {boolean}
+     * @memberof SysCodeGenConfig
+     */
+    isDelete?: boolean;
+    /**
+     * 代码生成主表Id
+     * @type {number}
+     * @memberof SysCodeGenConfig
+     */
+    codeGenId?: number;
+    /**
+     * 数据库字段名
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    columnName: string;
+    /**
+     * 字段描述
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    columnComment?: string | null;
+    /**
+     * .NET数据类型
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    netType?: string | null;
+    /**
+     * 作用类型(字典)
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    effectType?: string | null;
+    /**
+     * 外键实体名称
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    fkEntityName?: string | null;
+    /**
+     * 外键表名称
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    fkTableName?: string | null;
+    /**
+     * 外键显示字段
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    fkColumnName?: string | null;
+    /**
+     * 外键显示字段.NET类型
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    fkColumnNetType?: string | null;
+    /**
+     * 字典编码
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    dictTypeCode?: string | null;
+    /**
+     * 列表是否缩进(字典)
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    whetherRetract?: string | null;
+    /**
+     * 是否必填(字典)
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    whetherRequired?: string | null;
+    /**
+     * 是否是查询条件
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    queryWhether?: string | null;
+    /**
+     * 查询方式
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    queryType?: string | null;
+    /**
+     * 列表显示
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    whetherTable?: string | null;
+    /**
+     * 增改
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    whetherAddUpdate?: string | null;
+    /**
+     * 主键
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    columnKey?: string | null;
+    /**
+     * 数据库中类型(物理类型)
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    dataType?: string | null;
+    /**
+     * 是否通用字段
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    whetherCommon?: string | null;
+    /**
+     * 显示文本字段
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    displayColumn?: string | null;
+    /**
+     * 选中值字段
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    valueColumn?: string | null;
+    /**
+     * 父级字段
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    pidColumn?: string | null;
+}

+ 2 - 0
Web/src/main.ts

@@ -17,11 +17,13 @@ import VueGridLayout from 'vue-grid-layout';
 import VueSignaturePad from 'vue-signature-pad'; // 电子签名
 import vue3TreeOrg from 'vue3-tree-org'; // 组织架构图
 import 'vue3-tree-org/lib/vue3-tree-org.css';
+import { setupConstSelectorFilter } from './utils/helper/constSelectorHelper';
 
 const app = createApp(App);
 
 directive(app);
 other.elSvg(app);
+setupConstSelectorFilter(app);
 
 app.use(pinia).use(router).use(ElementPlus, { i18n: i18n.global.t }).use(VForm3).use(i18n).use(VueGridLayout).use(VueSignaturePad).use(vue3TreeOrg).mount('#app');
 

+ 1 - 0
Web/src/stores/interface/index.ts

@@ -19,6 +19,7 @@ export interface UserInfosState {
 }
 export interface UserInfosStates {
 	userInfos: UserInfosState;
+	constSelectorWithOptions: [];
 }
 
 // 路由缓存列表

+ 13 - 0
Web/src/stores/userInfo.ts

@@ -4,6 +4,8 @@ import { Session } from '/@/utils/storage';
 
 import { getAPI } from '/@/utils/axios-utils';
 import { SysAuthApi } from '/@/api-services/api';
+import request from '/@/utils/request';
+import { getAllConstSelectorWithOptions } from '/@/api/system/admin';
 
 /**
  * 用户信息
@@ -12,7 +14,13 @@ import { SysAuthApi } from '/@/api-services/api';
 export const useUserInfo = defineStore('userInfo', {
 	state: (): UserInfosStates => ({
 		userInfos: {} as UserInfosState,
+		constSelectorWithOptions: [],
 	}),
+	getters: {
+		getAllConstSelectorWithOptions(): any[] {
+			return this.constSelectorWithOptions || getAllConstSelectorWithOptions();
+		},
+	},
 	actions: {
 		async setUserInfos() {
 			// 缓存用户信息
@@ -48,5 +56,10 @@ export const useUserInfo = defineStore('userInfo', {
 					});
 			});
 		},
+		// 获取当前用户信息
+		async getAllConstSelectorWithOptionsAction() {
+			var res = await getAllConstSelectorWithOptions();
+			this.constSelectorWithOptions = res.data.result ?? [];
+		},
 	},
 });

+ 32 - 0
Web/src/utils/helper/constSelectorHelper.ts

@@ -0,0 +1,32 @@
+import type { App } from 'vue';
+import { useUserInfo } from '/@/stores/userInfo';
+
+export function setupConstSelectorFilter(app: App) {
+  // 全局过滤器  在vue文件中调用  $filters.codeToName(code,type)
+  app.config.globalProperties.$filters = {
+    codeToName(code:any, type:any) {
+      return codeToName(code, type);
+    },
+  };
+}
+
+//常量值转换
+export function codeToName(code:any, type:any) {
+  const userStore = useUserInfo();
+  try {
+    const name = userStore.constSelectorWithOptions
+      .filter((x:any) => x.code === type)
+      .map((x:any) => x.data)
+      .map((x:any) => x.filter((y:any) => y.code === code))
+      .map((x:any) => x[0].name);
+    return name[0];
+  } catch (error) {
+    return code;
+  }
+}
+
+export function getSelector(type:any) {
+  const userStore = useUserInfo();
+  const selector = userStore.constSelectorWithOptions.filter((x:any) => x.code === type)[0].data;
+  return selector;
+}

+ 0 - 0
Web/src/utils/http/requset.js


+ 121 - 0
Web/src/views/main/generatetest/component/editDialog.vue

@@ -0,0 +1,121 @@
+<template>
+	<div class="generatetest-container">
+		<el-dialog
+		v-model="isShowDialog"
+		:title="title"
+		:width="700"
+		draggable>
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px" :rules="rules">
+				<el-row :gutter="35">
+					<el-form-item v-show="false"><el-input v-model="ruleForm.Id" /></el-form-item>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="编码">
+							<el-input v-model="ruleForm.Code" placeholder="ruleForm.Code" 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-input v-model="ruleForm.Name" placeholder="ruleForm.Name" 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-input v-model="ruleForm.Price" placeholder="ruleForm.Price" 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-date-picker v-model="ruleForm.ExpireDate" type="datetime" placeholder="过期日期"  />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="状态">
+							<el-switch v-model="ruleForm.Status" active-text="是" inactive-text="否" />
+						</el-form-item>
+					</el-col>
+						</el-row>
+					</el-form>
+					<template #footer>
+						<span class="dialog-footer">
+							<el-button @click="cancel" size="default">取 消</el-button>
+							<el-button type="primary" @click="submit" size="default">确 定</el-button>
+						</span>
+					</template>
+		</el-dialog>	
+	</div>
+</template>
+
+<script lang="ts">
+	import { ref, toRefs, reactive, onMounted, defineComponent, getCurrentInstance, onUnmounted } from 'vue';
+	import { ElMessageBox, ElMessage } from 'element-plus';
+	import { auth } from '/@/utils/authFunction';
+	import { formatDate } from '/@/utils/formatTime';
+	import type { FormInstance, FormRules } from 'element-plus'
+
+
+	export default defineComponent({
+	name: 'editgeneratetest',
+	props: {
+	title: {
+	type: String,
+	default: '',
+	},
+	},
+	setup() {
+	const { proxy } = getCurrentInstance() as any;
+	const ruleFormRef = ref();
+	const state = reactive({
+	isShowDialog: false,
+	ruleForm: {} as any,
+	});
+
+	const rules = reactive<FormRules>({
+			Code: [{required: true, message: '请输入编码!', trigger: 'blur',},],
+			Name: [{required: true, message: '请输入名称!', trigger: 'blur',},],
+	});
+
+	// 打开弹窗
+	const openDialog = (row: any) => {
+	state.ruleForm = row;
+	state.isShowDialog = true;
+	};
+
+	// 关闭弹窗
+	const closeDialog = () => {
+	proxy.mittBus.emit('submitRefresh');
+	state.isShowDialog = false;
+	};
+
+	// 取消
+	const cancel = () => {
+	state.isShowDialog = false;
+	};
+
+	// 提交
+	const submit = () => {
+	ruleFormRef.value.validate(async (valid: boolean) => {
+	if (!valid) return;
+	if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
+	await updategeneratetest(values);
+	} else {
+	await addgeneratetest(state.ruleForm);
+	}
+	closeDialog();
+	});
+	};
+
+
+	return {
+	ruleFormRef,
+	openDialog,
+	closeDialog,
+	cancel,
+	submit,
+	...toRefs(state),
+	rules,
+	};
+	}
+	})
+
+	}
+</script>

+ 180 - 0
Web/src/views/main/generatetest/index.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="generatetest-container">
+    <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+		          
+     <el-form :model="queryParams" ref="queryForm" :inline="true">
+		 <a-row>
+       <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+       <el-form-item label="编码">
+       <el-input v-model="queryParam.Code" clearable placeholder="请输入编码"/>
+       </el-form-item>
+       </el-col>
+			<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" >
+              <span class="table-page-search-submitButtons">
+                 <el-button icon="ele-Refresh" @click="() => queryParam = {}"> 重置 </el-button>
+               <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'generatetest:page'"> 查询 </el-button>
+				  <el-button icon="ele-Plus" @click="openAddgeneratetest" v-auth="'generatetest:add'"> 新增 </el-button>  
+              </span>
+            </el-col>
+          </a-row>
+        </a-form>
+       <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+       <el-form-item label="名称">
+       <el-input v-model="queryParam.Name" clearable placeholder="请输入名称"/>
+       </el-form-item>
+       </el-col>
+			<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" >
+              <span class="table-page-search-submitButtons">
+                 <el-button icon="ele-Refresh" @click="() => queryParam = {}"> 重置 </el-button>
+               <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'generatetest:page'"> 查询 </el-button>
+				  <el-button icon="ele-Plus" @click="openAddgeneratetest" v-auth="'generatetest:add'"> 新增 </el-button>  
+              </span>
+            </el-col>
+          </a-row>
+        </a-form>
+      
+    </a-card>
+    <a-card :bordered="false">
+	<el-table 
+		:data="tableData" 
+		style="width: 100%" 
+		v-loading="loading" 
+		tooltip-effect="light"
+		row-key="id"
+		border>
+		<el-table-column type="index" label="序号" width="55" align="center" fixed />
+				     <el-table-column prop="Code" label="编码" fixed show-overflow-tooltip />
+				     <el-table-column prop="Name" label="名称" fixed show-overflow-tooltip />
+				     <el-table-column prop="Price" label="价格" fixed show-overflow-tooltip />
+				     <el-table-column prop="ExpireDate" label="过期日期" fixed show-overflow-tooltip />
+				  <el-table-column prop="Status" label="状态" fixed show-overflow-tooltip>
+					    <template #default="scope">
+								<el-tag v-if="scope.row.status"> 是 </el-tag>
+								<el-tag type="danger" v-else> 否 </el-tag>
+					    </template>
+					</el-table-column>
+			           <el-table-column label="操作" width="110" align="center" fixed="right" show-overflow-tooltip v-if="auth('generatetest:edit') || auth('generatetest:delete')">
+							<template #default="scope">
+								<el-button icon="ele-Edit" size="small" text type="primary" @click="openEditgeneratetest(scope.row)" v-auth="'generatetest:update'"> 编辑 </el-button>
+								<el-button icon="ele-Edit" size="small" text type="primary" @click="delgeneratetest(scope.row)" v-auth="'generatetest:delete'"> 删除 </el-button>								
+							</template>
+		</el-table-column>
+	</el-table>
+	<el-pagination
+		v-model:currentPage="tableParams.page"
+		v-model:page-size="tableParams.pageSize"
+		:total="tableParams.total"
+		:page-sizes="[10, 20, 50, 100]"
+		small
+		background
+		@size-change="handleSizeChange"
+		@current-change="handleCurrentChange"
+		layout="total, sizes, prev, pager, next, jumper"
+	/>	 
+<editDialog ref="editDialogRef" :title="editgeneratetestTitle"/>
+    </a-card>
+  </div>
+</template>
+
+<script lang="ts">
+	import { ref, toRefs, reactive, onMounted, defineComponent, getCurrentInstance, onUnmounted } from 'vue';
+    import { ElMessageBox, ElMessage } from 'element-plus';
+	import { auth } from '/@/utils/authFunction';
+	import { formatDate } from '/@/utils/formatTime';
+	
+	import editDialog from '/@/views/main/generatetest/component/editDialog.vue'
+	import { getgeneratetestPage, deletegeneratetest } from '/@/api/main/generatetest';
+	export default defineComponent({
+	    name: 'generatetest',
+		components: { editDialog },
+		setup() {
+		    const { proxy } = getCurrentInstance() as any;
+			const editDialogRef = ref();
+			const state = reactive({
+			    loading: false,
+			    tableData: [] as any,
+			    queryParams: {} as any,
+			    tableParams: {
+				    page: 1,
+				    pageSize: 10,
+				    total: 0 as any,
+			    },
+			    editgeneratetestTitle: '',
+		    });
+			
+			onMounted(async () => {
+			    handleQuery();
+
+			    proxy.mittBus.on('submitRefresh', () => {
+				    handleQuery();
+			    });
+		    });
+			
+		    onUnmounted(() => {
+			    proxy.mittBus.off('submitRefresh');
+		    });	
+			
+			// 查询操作
+		    const handleQuery = async () => {
+			    state.loading = true;
+			    var res = await getgeneratetestPage(Object.assign(state.queryParams, state.tableParams));
+			    state.tableData = res.data.result?.items ?? [];
+			    state.tableParams.total = res.data.result?.total;
+			    state.loading = false;
+		    };
+			
+			// 打开新增页面
+		    const openAddgeneratetest = () => {
+			    state.editgeneratetestTitle = '添加GenerateTest';
+			    editDialogRef.value.openDialog({});
+		    };
+			
+		    // 打开编辑页面
+		    const openEditgeneratetest = (row: any) => {
+			    state.editgeneratetestTitle = '编辑GenerateTest';
+			    editDialogRef.value.openDialog(row);
+		    };
+			
+		    // 删除
+		    const delgeneratetest = (row: any) => {
+			    ElMessageBox.confirm(`确定要删除吗?`, '提示', {
+				    confirmButtonText: '确定',
+				    cancelButtonText: '取消',
+				    type: 'warning',
+			    })
+				    .then(async () => {
+					    await deletegeneratetest(row);
+					    handleQuery();
+					    ElMessage.success('删除成功');
+				    })
+				    .catch(() => {});
+		    };
+			
+		    // 改变页面容量
+		    const handleSizeChange = (val: number) => {
+			    state.tableParams.pageSize = val;
+			    handleQuery();
+		    };
+			
+		    // 改变页码序号
+		    const handleCurrentChange = (val: number) => {
+			    state.tableParams.page = val;
+			    handleQuery();
+		    };
+			
+
+            return {
+			    handleQuery,
+			    editDialogRef,
+			    openAddgeneratetest,
+			    openEditgeneratetest,
+			    delgeneratetest,
+			    handleSizeChange,
+			    handleCurrentChange,
+			    formatDate,
+			    auth,
+			    ...toRefs(state),
+		   };
+		}
+	})
+</script>

+ 235 - 0
Web/src/views/system/codeGen/component/codeGenerateDialog.vue

@@ -0,0 +1,235 @@
+<template>
+	<div class="sys-codeGenerate-container">
+		<el-dialog v-model="isShowDialog" :title="title" draggable width="700px">
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="库定位器" prop="configId">
+							<el-select clearable v-model="ruleForm.configId" placeholder="库名" filterable @change="DbChanged()">
+								<el-option v-for="item in dbData" :key="item.configId" :label="item.configId" :value="item.configId" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="数据库类型" prop="dbType" :rules="[{ required: true, message: '描述不能为空', trigger: 'blur' }]">
+							<el-input v-model="ruleForm.dbTypeString" disabled />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="链接串" prop="connectionString">
+							<el-input v-model="ruleForm.connectionString" disabled clearable type="textarea" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="生成表" prop="tableName" :rules="[{ required: true, message: '生成表不能为空', trigger: 'blur' }]">
+							<el-select v-model="ruleForm.tableName" class="m-2" filterable clearable>
+								<el-option v-for="item in tableData" :key="item.entityName" :label="item.tableName" :value="item.entityName" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="业务名" prop="busName">
+							<el-input v-model="ruleForm.busName" placeholder="请输入" clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="父级菜单" prop="menuPid">
+							<el-cascader
+								:options="menuData"
+								:props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'title' }"
+								placeholder="请选择上级菜单"
+								clearable
+								class="w100"
+								v-model="ruleForm.menuPid"
+							>
+								<template #default="{ node, data }">
+									<span>{{ data.title }}</span>
+									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+								</template>
+							</el-cascader>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="命名空间" prop="nameSpace">
+							<el-input v-model="ruleForm.nameSpace" clearable placeholder="请输入" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="作者姓名" prop="authorName">
+							<el-input v-model="ruleForm.authorName" clearable placeholder="请输入" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="生成方式" prop="generateType">
+							<el-select v-model="ruleForm.generateType" class="m-2" filterable clearable>
+								<el-option v-for="item in codeGenerateTypeList" :key="item.value" :label="item.label" :value="item.value" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent, getCurrentInstance, ref } from 'vue';
+
+import { getDatabaseList, getTableList, addGenerate, updateGenerate } from '/@/api/system/admin';
+import { AddCodeGenInput, DbTableInfo } from '/@/api/system/interface';
+
+export default defineComponent({
+	name: 'codeGenerateDialog',
+	components: {},
+	props: {
+		title: {
+			type: String,
+			default: '',
+		},
+		menuData: {
+			type: Array,
+			default: () => [],
+		},
+		codeGenerateTypeList: {
+			type: Array,
+			default: () => [] as any,
+		},
+	},
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		const ruleFormRef = ref();
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {} as AddCodeGenInput,
+			tableData: [] as any,
+			dbData: [] as any,
+		});
+
+		onMounted(async () => {
+			var res = await getDatabaseList();
+			state.dbData = res.data.result;
+		});
+
+		// DbChanged
+		const DbChanged = async () => {
+			if (state.ruleForm.configId === '') return;
+			let res = await getTableList(state.ruleForm.configId as string);
+			state.tableData = res.data.result ?? [];
+
+			let db = state.dbData.filter((u: any) => u.configId == state.ruleForm.configId);
+			state.ruleForm.connectionString = db[0].connectionString;
+			state.ruleForm.dbType = db[0].dbType.toString();
+			state.ruleForm.dbTypeString = convertDbType(db[0].dbType);
+		};
+
+		// 打开弹窗
+		const openDialog = (addRow: AddCodeGenInput) => {
+			state.ruleForm = addRow;
+			if (state.ruleForm .type === '1') {
+				state.ruleForm.nameSpace = 'Admin.NET.Application';
+				state.ruleForm.authorName = 'one';
+				state.ruleForm.generateType = '2';
+			} else {
+				state.ruleForm.dbTypeString = convertDbType(parseInt(state.ruleForm.dbType));
+			}
+			state.isShowDialog = true;
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			proxy.mittBus.emit('submitRefresh');
+			state.isShowDialog = false;
+		};
+
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+
+		// 提交
+		const submit = () => {
+			ruleFormRef.value.validate(async (valid: boolean) => {
+				if (!valid) return;
+
+				if (state.ruleForm.type === '1') {
+					await addGenerate(state.ruleForm);
+				} else {
+					await updateGenerate(state.ruleForm);
+				}
+				closeDialog();
+			});
+		};
+
+		const convertDbType = (dbType: number) => {
+			let result = '';
+			switch (dbType) {
+				case 0:
+					result = 'MySql';
+					break;
+				case 1:
+					result = 'SqlServer';
+					break;
+				case 2:
+					result = 'Sqlite';
+					break;
+				case 3:
+					result = 'Oracle';
+					break;
+				case 4:
+					result = 'PostgreSql';
+					break;
+				case 5:
+					result = 'Dm';
+					break;
+				case 6:
+					result = 'Kdbndp';
+					break;
+				case 7:
+					result = 'Oscar';
+					break;
+				case 8:
+					result = 'MySqlConnector';
+					break;
+				case 9:
+					result = 'Access';
+					break;
+				default:
+					result = 'Custom';
+					break;
+			}
+			return result;
+		};
+
+		const isOrNotSelect = () => {
+			return [
+				{
+					label: '是',
+					value: 1,
+				},
+				{
+					label: '否',
+					value: 0,
+				},
+			];
+		};
+
+		return {
+			ruleFormRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+			convertDbType,
+			isOrNotSelect,
+			DbChanged,
+		};
+	},
+});
+</script>

+ 137 - 0
Web/src/views/system/codeGen/component/fkDialog.vue

@@ -0,0 +1,137 @@
+<template>
+	<div class="fk-container">
+		<el-dialog v-model="isShowDialog" title="外键配置" draggable width="600px">
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px">
+				<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-select clearable v-model="ruleForm.configId" placeholder="库名" filterable @change="DbChanged()">
+								<el-option v-for="item in 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-select v-model="ruleForm.tableName" class="m-2" filterable clearable @change="TableChanged()">
+								<el-option v-for="item in tableData" :key="item.entityName" :label="item.tableName" :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="columnName">
+							<el-select v-model="ruleForm.columnName">
+								<el-option v-for="item in columnData" :key="item.columnName" :label="item.columnName" :value="item.columnName" />
+							</el-select>
+						</el-form-item>
+					</el-col>					
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, getCurrentInstance, ref, onMounted } from 'vue';
+
+import { getDatabaseList, getTableList, getColumnList } from '/@/api/system/admin';
+
+export default defineComponent({
+	name: 'fk',
+	components: {},
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		var rowdata = {} as any;
+		const ruleFormRef = ref();
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {} as any,
+			dbData: [] as any,
+			tableData: [] as any,
+			columnData: [] as any,
+		});
+
+		onMounted(async () => {
+			var res = await getDatabaseList();
+			state.dbData = res.data.result;
+		});
+
+		const DbChanged = async () => {
+			state.tableData = [];
+			state.columnData = [];
+			await getTableInfoList();
+		};
+
+		const TableChanged = async () => {
+			state.columnData = [];
+			await getColumnInfoList();
+		};
+
+		const getDbList = async () => {
+			var res = await getDatabaseList();
+			state.dbData = res.data.result;
+		};
+
+		const getTableInfoList = async () => {
+			if (state.ruleForm.configId == '') return;
+			var res = await getTableList(state.ruleForm.configId);
+			state.tableData = res.data.result;
+		};
+
+		const getColumnInfoList = async () => {
+			if (state.ruleForm.configId == '' || state.ruleForm.tableName == '') return;
+            console.log(state.ruleForm.configId, state.ruleForm.tableName)
+			var res = await getColumnList(state.ruleForm.configId, state.ruleForm.tableName);
+			state.columnData = res.data.result;
+		};
+
+		// 打开弹窗
+		const openDialog = (row: any) => {
+			rowdata = row;
+			state.isShowDialog = true;
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			rowdata.fkTableName = state.ruleForm.tableName;
+			// rowdata.fkEntityName = state.ruleForm.entityName;
+			rowdata.fkColumnName = state.ruleForm.columnName;
+			// rowdata.fkColumnNetType = state.ruleForm.columnNetType;
+			proxy.mittBus.emit('submitRefreshFk', rowdata);
+			state.isShowDialog = false;
+		};
+
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+
+		// 提交
+		const submit = () => {
+			ruleFormRef.value.validate(async (valid: boolean) => {
+				if (!valid) return;
+				closeDialog();
+			});
+		};
+
+		return {
+			ruleFormRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+			DbChanged,
+			TableChanged,
+			getDbList,
+			getTableInfoList,
+			getColumnInfoList,
+		};
+	},
+});
+</script>

+ 284 - 0
Web/src/views/system/codeGen/component/generateConfigDialog.vue

@@ -0,0 +1,284 @@
+<template>
+	<div class="codeGenerateConfig-container">
+		<el-dialog v-model="isShowDialog" title="配置" draggable width="100%">
+			<el-table :data="tableData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="columnName" 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="数据类型" show-overflow-tooltip />
+				<el-table-column prop="effectType" label="作用类型" show-overflow-tooltip>
+					<template #default="scope">
+						<el-select v-model="scope.row.effectType" class="m-2" placeholder="Select" :disabled="judgeColumns(scope.row)" @change="effectTypeChange(scope.row, scope.$index)">
+							<el-option v-for="item in effectTypeList" :key="item.value" :label="item.label" :value="item.value" />
+						</el-select>
+					</template>
+				</el-table-column>
+				<el-table-column prop="dictTypeCode" label="字典" show-overflow-tooltip>
+					<template #default="scope">
+						<el-select v-model="scope.row.dictTypeCode" class="m-2" :disabled="effectTypeEnable(scope.row)">
+							<el-option v-for="item in dictTypeCodeList" :key="item.code" :label="item.name" :value="item.code" />
+						</el-select>
+					</template>
+				</el-table-column>
+
+				<el-table-column prop="whetherTable" label="列表显示" 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="增改" 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="whetherRequired" label="必填" 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="queryWhether" label="是否是查询" 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="查询方式" 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 queryTypeList" :key="item.value" :label="item.label" :value="item.value" />
+						</el-select>
+					</template>
+				</el-table-column>
+			</el-table>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+		<fkDialog ref="fkDialogRef" />
+		<treeDialog ref="treeDialogRef" />
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, onUnmounted, defineComponent, getCurrentInstance, ref } from 'vue';
+import fkDialog from '/@/views/system/codeGen/component/fkDialog.vue';
+import treeDialog from '/@/views/system/codeGen/component/treeDialog.vue';
+
+import { getGenerateConfigList, getDictDataDropdown, getDictTypeList, updateGenerateConfig, getAllConstSelector } from '/@/api/system/admin';
+import { AddCodeGenInput, DbTableInfo } from '/@/api/system/interface';
+
+export default defineComponent({
+	name: 'codeGenerateConfig',
+	components: { fkDialog, treeDialog },
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		const fkDialogRef = ref();
+		const treeDialogRef = ref();
+		const state = reactive({
+			isShowDialog: false,
+			loading: false,
+			tableData: [] as any,
+			dbData: [] as any,
+			effectTypeList: [] as any,
+			dictTypeCodeList: [] as any,
+			dictDataAll: [] as any,
+			queryTypeList: [] as any,
+			allConstSelector: [] as any,
+		});
+
+		onMounted(async () => {
+			let res = await getDictDataDropdown('code_gen_effect_type');
+			state.effectTypeList = res.data.result;
+
+			res = await getDictTypeList();
+			state.dictTypeCodeList = res.data.result;
+			state.dictDataAll = res.data.result;
+
+			res = await getDictDataDropdown('code_gen_query_type');
+			state.queryTypeList = res.data.result;
+
+			res = await getAllConstSelector();
+			state.allConstSelector = res.data.result;
+
+			proxy.mittBus.on('submitRefreshFk', (data: any) => {
+				state.tableData[data.index] = data;
+			});
+		});
+
+		onUnmounted(() => {
+			proxy.mittBus.off('submitRefresh');
+			proxy.mittBus.off('submitRefreshFk');
+		});
+		// 控件类型改变
+		const effectTypeChange = (data: any, index: number) => {
+			let value = data.effectType;
+			if (value === 'fk') {
+				openFkDialog(data, index);
+			} else if (value === 'ApiTreeSelect') {
+				openTreeDialog(data, index);
+			} else if (value === 'Select') {
+				data.dictTypeCode = '';
+				state.dictTypeCodeList = state.dictDataAll;
+			} else if (value === 'ConstSelector') {
+				data.dictTypeCode = '';
+				state.dictTypeCodeList = state.allConstSelector;
+			}
+		};
+
+		// 查询操作
+		const handleQuery = async (row: any) => {
+			state.loading = true;
+			var res = await getGenerateConfigList({ codeGenId: row.id });
+			var data = res.data.result ?? [];
+			data.forEach((item: any) => {
+				for (const key in item) {
+					if (item[key] === 'Y') {
+						item[key] = true;
+					}
+					if (item[key] === 'N') {
+						item[key] = false;
+					}
+				}
+			});
+			state.tableData = data;
+			state.loading = false;
+		};
+
+		// 判断是否(用于是否能选择或输入等)
+		function judgeColumns(data: any) {
+			var lst = ['createdUserName', 'createdTime', 'updatedUserName', 'updatedTime'];
+			return lst.indexOf(data.columnName) > -1 || data.columnKey === 'True';
+		}
+
+		function effectTypeEnable(data: any) {
+			var lst = ['Radio', 'Select', 'Checkbox', 'ConstSelector'];
+			return lst.indexOf(data.effectType) === -1;
+		}
+
+		// 打开弹窗
+		const openDialog = (addRow: any) => {
+			handleQuery(addRow);
+			state.isShowDialog = true;
+		};
+
+		// 打开弹窗
+		const openFkDialog = (addRow: any, index: number) => {
+			addRow.index = index;
+			fkDialogRef.value.openDialog(addRow);
+		};
+
+		const openTreeDialog = (addRow: any, index: number) => {
+			addRow.index = index;
+			treeDialogRef.value.openDialog(addRow);
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			proxy.mittBus.emit('submitRefresh');
+			state.isShowDialog = false;
+		};
+
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+
+		// 提交
+		const submit = async () => {
+			state.loading = true;
+			var lst = state.tableData;
+			lst.forEach((item: any) => {
+				// 必填那一项转换
+				for (const key in item) {
+					if (item[key] === true) {
+						item[key] = 'Y';
+					}
+					if (item[key] === false) {
+						item[key] = 'N';
+					}
+				}
+			});
+			await updateGenerateConfig(lst);
+			state.loading = false;
+			closeDialog();
+		};
+
+		const convertDbType = (dbType: number) => {
+			let result = '';
+			switch (dbType) {
+				case 0:
+					result = 'MySql';
+					break;
+				case 1:
+					result = 'SqlServer';
+					break;
+				case 2:
+					result = 'Sqlite';
+					break;
+				case 3:
+					result = 'Oracle';
+					break;
+				case 4:
+					result = 'PostgreSql';
+					break;
+				case 5:
+					result = 'Dm';
+					break;
+				case 6:
+					result = 'Kdbndp';
+					break;
+				case 7:
+					result = 'Oscar';
+					break;
+				case 8:
+					result = 'MySqlConnector';
+					break;
+				case 9:
+					result = 'Access';
+					break;
+				default:
+					result = 'Custom';
+					break;
+			}
+			return result;
+		};
+
+		const isOrNotSelect = () => {
+			return [
+				{
+					label: '是',
+					value: 1,
+				},
+				{
+					label: '否',
+					value: 0,
+				},
+			];
+		};
+
+		return {
+			fkDialogRef,
+			treeDialogRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+			convertDbType,
+			isOrNotSelect,
+			handleQuery,
+			judgeColumns,
+			effectTypeEnable,
+			openFkDialog,
+			openTreeDialog,
+			effectTypeChange,
+		};
+	},
+});
+</script>

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

@@ -0,0 +1,155 @@
+<template>
+	<div class="tree-container">
+		<el-dialog v-model="isShowDialog" title="树选择配置" draggable width="600px">
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px">
+				<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-select clearable v-model="ruleForm.configId" placeholder="库名" filterable @change="DbChanged()">
+								<el-option v-for="item in 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-select v-model="ruleForm.tableName" class="m-2" filterable clearable @change="TableChanged()">
+								<el-option v-for="item in tableData" :key="item.entityName" :label="item.tableName" :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="ruleForm.displayColumn">
+								<el-option v-for="item in columnData" :key="item.columnName" :label="item.columnName" :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-select v-model="ruleForm.valueColumn">
+								<el-option v-for="item in columnData" :key="item.columnName" :label="item.columnName" :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-select v-model="ruleForm.pidColumn">
+								<el-option v-for="item in columnData" :key="item.columnName" :label="item.columnName" :value="item.columnName" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, getCurrentInstance, ref, onMounted } from 'vue';
+
+import { getDatabaseList, getTableList, getColumnList } from '/@/api/system/admin';
+import { AddDbColumnInput } from '/@/api/system/interface';
+
+export default defineComponent({
+	name: 'tree',
+	components: {},
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		const ruleFormRef = ref();
+		var rowdata = {} as any;
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {} as any,
+			dbData: [] as any,
+			tableData: [] as any,
+			columnData: [] as any,
+		});
+
+		onMounted(async () => {
+			var res = await getDatabaseList();
+			state.dbData = res.data.result;
+		});
+
+		const DbChanged = async () => {
+			state.tableData = [];
+			state.columnData = [];
+			await getTableInfoList();
+		};
+
+		const TableChanged = async () => {
+			state.columnData = [];
+			await getColumnInfoList();
+		};
+
+		const getDbList = async () => {
+			var res = await getDatabaseList();
+			state.dbData = res.data.result;
+		};
+
+		const getTableInfoList = async () => {
+			if (state.ruleForm.configId == '') return;
+			var res = await getTableList(state.ruleForm.configId);
+			state.tableData = res.data.result;
+		};
+
+		const getColumnInfoList = async () => {
+			if (state.ruleForm.configId == '' || state.ruleForm.tableName == '') return;
+			console.log(state.ruleForm.configId, state.ruleForm.tableName);
+			var res = await getColumnList(state.ruleForm.configId, state.ruleForm.tableName);
+			state.columnData = res.data.result;
+		};
+
+		// 打开弹窗
+		const openDialog = (row: any) => {
+			rowdata = row;
+			state.isShowDialog = true;
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			rowdata.fkTableName = state.ruleForm.tableName;
+			// rowdata.fkEntityName = state.ruleForm.entityName;
+			// rowdata.fkColumnName = state.ruleForm.columnName;
+			// rowdata.fkColumnNetType = state.ruleForm.columnNetType;
+			rowdata.displayColumn = state.ruleForm.displayColumn;
+			rowdata.valueColumn = state.ruleForm.valueColumn;
+			rowdata.pidColumn = state.ruleForm.pidColumn;
+			proxy.mittBus.emit('submitRefreshFk', rowdata);
+			state.isShowDialog = false;
+		};
+
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+		// 提交
+		const submit = () => {
+			ruleFormRef.value.validate(async (valid: boolean) => {
+				if (!valid) return;
+
+				closeDialog();
+			});
+		};
+
+		return {
+			ruleFormRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+			DbChanged,
+			TableChanged,
+			getDbList,
+			getTableInfoList,
+			getColumnInfoList,
+		};
+	},
+});
+</script>

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

@@ -0,0 +1,196 @@
+<template>
+	<div class="sys-codegenerate-container">
+		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+			<el-form :model="queryParams" ref="queryForm" :inline="true" v-loading="loading">
+				<el-form-item>
+					<el-button type="primary" icon="ele-Plus" @click="openAddDialog">增加</el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+
+		<el-card shadow="hover" style="margin-top: 8px">
+			<el-table :data="tableData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="configId" label="库定位器" show-overflow-tooltip />
+				<el-table-column prop="tableName" label="表名称" show-overflow-tooltip />
+				<el-table-column prop="busName" label="业务名" show-overflow-tooltip />
+				<el-table-column prop="nameSpace" label="命名空间" show-overflow-tooltip />
+				<el-table-column prop="authorName" label="作者姓名" show-overflow-tooltip />
+				<el-table-column prop="generateType" label="生成方式" show-overflow-tooltip>
+					<template #default="scope">
+						<span>{{ getGenerateTypeString(scope.row.generateType) }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="操作" width="200" fixed="right" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-button size="small" text type="primary" @click="handleGenerate(scope.row)">开始生成</el-button>
+						<el-button size="small" text type="primary" @click="openConfigDialog(scope.row)">配置</el-button>
+						<el-button size="small" text type="primary" @click="openEditDialog(scope.row)">编辑</el-button>
+						<el-button size="small" text type="primary" @click="deleConfig(scope.row)">删除</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination
+				v-model:currentPage="tableParams.page"
+				v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total"
+				:page-sizes="[10, 20, 50, 100]"
+				small
+				background
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper"
+			/>
+		</el-card>
+		<CodeGenerateDialog :code-generate-type-list="codeGenerateTypeList" :menu-data="menudata" :title="editMenuTitle" ref="CodeGenerateRef" />
+		<CodeConfigDialog ref="CodeConfigRef" />
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent, onUnmounted, getCurrentInstance, toRaw } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import CodeGenerateDialog from '/@/views/system/codeGen/component/codeGenerateDialog.vue';
+import CodeConfigDialog from '/@/views/system/codeGen/component/generateConfigDialog.vue';
+
+import { AddCodeGenInput, SysCodeGen, SysMenu } from '/@/api/system/interface';
+import { getGeneratePage, getMenuList, getDictDataDropdown, deleGenerate, generateRunLocal } from '/@/api/system/admin';
+
+export default defineComponent({
+	name: 'codeGen',
+	components: { CodeGenerateDialog, CodeConfigDialog },
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		const CodeGenerateRef = ref();
+		const CodeConfigRef = ref();
+		const state = reactive({
+			loading: false,
+			loading1: false,
+			dbData: [] as any,
+			configId: '',
+			tableData: [] as Array<SysCodeGen>,
+			tableName: '',
+			queryParams: {
+				name: undefined,
+				code: undefined,
+			},
+			tableParams: {
+				page: 1,
+				pageSize: 10,
+				total: 0 as any,
+			},
+			editMenuTitle: '',
+			menudata: [] as Array<SysMenu>,
+			codeGenerateTypeList: [] as any,
+		});
+
+		onMounted(async () => {
+			handleQuery();
+			let res = await getMenuList();
+			state.menudata = res.data.result;
+
+			let list = await getDictDataDropdown('code_gen_create_type');
+			state.codeGenerateTypeList = list.data.result;
+			proxy.mittBus.on('submitRefresh', () => {
+				handleQuery();
+			});
+			proxy.mittBus.on('submitRefreshFk', (res: any) => {
+				state.tableData;
+			});
+		});
+
+		onUnmounted(() => {
+			proxy.mittBus.off('submitRefresh');
+			proxy.mittBus.off('submitRefreshFk');
+		});
+
+		const openConfigDialog = (row: any) => {
+			CodeConfigRef.value.openDialog(row);
+		};
+		// 表查询操作
+		const handleQuery = async () => {
+			state.loading = true;
+			let params = Object.assign(state.queryParams, state.tableParams);
+			let res = await getGeneratePage(params);
+			state.tableData = res.data.result?.items ?? [];
+			state.tableParams.total = res.data.result?.total;
+			state.loading = false;
+		};
+
+		// 获取生成方式
+		const getGenerateTypeString = (val: string) => {
+			let lst = state.codeGenerateTypeList.filter((u: any) => u.value == val);
+			return lst[0]?.label;
+		};
+
+		// 改变页面容量
+		const handleSizeChange = (val: number) => {
+			state.tableParams.pageSize = val;
+			handleQuery();
+		};
+
+		// 改变页码序号
+		const handleCurrentChange = (val: number) => {
+			state.tableParams.page = val;
+			handleQuery();
+		};
+
+		// 打开表增加页面
+		const openAddDialog = () => {
+			state.editMenuTitle = '新增';
+			CodeGenerateRef.value.openDialog({ type: '1' });
+		};
+		// 打开列编辑页面
+		const openEditDialog = (row: any) => {
+			state.editMenuTitle = '编辑';
+			row.type = '2';
+			CodeGenerateRef.value.openDialog(row);
+		};
+
+		// 删除表
+		const deleConfig = (row: any) => {
+			ElMessageBox.confirm(`确定删除吗?`, '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(async () => {
+					await deleGenerate([{ id: row.id }]);
+					handleQuery();
+					ElMessage.success('操作成功');
+				})
+				.catch(() => {});
+		};
+
+		// 开始生成代码
+		const handleGenerate = (row: any) => {
+			ElMessageBox.confirm(`确定要生成吗?`, '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(async () => {
+					await generateRunLocal(row);
+					handleQuery();
+					ElMessage.success('操作成功');
+				})
+				.catch(() => {});
+		};
+
+		return {
+			handleQuery,
+			openAddDialog,
+			openEditDialog,
+			deleConfig,
+			CodeGenerateRef,
+			handleSizeChange,
+			handleCurrentChange,
+			getGenerateTypeString,
+			...toRefs(state),
+			CodeConfigRef,
+			openConfigDialog,
+			handleGenerate,
+		};
+	},
+});
+</script>

+ 201 - 0
Web/src/views/system/database/component/addColumn.vue

@@ -0,0 +1,201 @@
+<template>
+	<div class="sys-dbColumn-container">
+		<el-dialog v-model="isShowDialog" title="列编辑" draggable width="600px">
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="列名称" prop="dbColumnName" :rules="[{ required: true, message: '名称不能为空', trigger: 'blur' }]">
+							<el-input v-model="ruleForm.dbColumnName" 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="描述" prop="columnDescription" :rules="[{ required: true, message: '描述不能为空', trigger: 'blur' }]">
+							<el-input v-model="ruleForm.columnDescription" placeholder="描述" clearable type="textarea" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="主键" prop="isPrimarykey">
+							<el-select v-model="ruleForm.isPrimarykey">
+								<el-option v-for="item in isOrNotSelect()" :key="item.value" :label="item.label" :value="item.value" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="自增" prop="isIdentity">
+							<el-select v-model="ruleForm.isIdentity" class="m-2">
+								<el-option v-for="item in isOrNotSelect()" :key="item.value" :label="item.label" :value="item.value" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="类型" prop="dataType">
+							<el-select v-model="ruleForm.dataType">
+								<el-option v-for="item in apiTypeSelect()" :key="item.value" :label="item.value" :value="item.value" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="可空" prop="isNullable">
+							<el-select v-model="ruleForm.isNullable">
+								<el-option v-for="item in isOrNotSelect()" :key="item.value" :label="item.label" :value="item.value" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="长度" prop="length">
+							<el-input-number v-model="ruleForm.length" size="default" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="保留几位小数" prop="decimalDigits">
+							<el-input-number v-model="ruleForm.decimalDigits" size="default" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, getCurrentInstance, ref } from 'vue';
+
+import { addColumn } from '/@/api/system/admin';
+import { AddDbColumnInput } from '/@/api/system/interface';
+
+export default defineComponent({
+	name: 'sysAddColumn',
+	components: {},
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		const ruleFormRef = ref();
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {} as AddDbColumnInput,
+		});
+		// 打开弹窗
+		const openDialog = (addRow: AddDbColumnInput) => {
+			state.ruleForm = addRow;
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			proxy.mittBus.emit('submitRefreshColumn');
+			state.isShowDialog = false;
+		};
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+		// 提交
+		const submit = () => {
+			ruleFormRef.value.validate(async (valid: boolean) => {
+				if (!valid) return;
+
+				await addColumn(state.ruleForm);
+				closeDialog();
+			});
+		};
+
+		const apiTypeSelect = () => {
+			return [
+				{
+					value: 'text',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'varchar',
+					hasLength: true,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'nvarchar',
+					hasLength: true,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'char',
+					hasLength: true,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'nchar',
+					hasLength: true,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'timestamp',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'int',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'smallint',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'tinyint',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'bigint',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'bit',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+				{
+					value: 'decimal',
+					hasLength: true,
+					hasDecimalDigits: true,
+				},
+				{
+					value: 'datetime',
+					hasLength: false,
+					hasDecimalDigits: false,
+				},
+			];
+		};
+
+		const isOrNotSelect = () => {
+			return [
+				{
+					label: '是',
+					value: 1,
+				},
+				{
+					label: '否',
+					value: 0,
+				},
+			];
+		};
+
+		return {
+			ruleFormRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+			apiTypeSelect,
+			isOrNotSelect,
+		};
+	},
+});
+</script>

+ 75 - 56
Web/src/views/system/database/component/addTable.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="sys-dbTable-container">
-		<el-dialog v-model="isShowDialog" title="表编辑" draggable width="1400px">
+		<el-dialog v-model="isShowDialog" title="表新增" draggable width="1400px">
 			<el-divider content-position="left">数据表信息</el-divider>
 			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="80px">
 				<el-row :gutter="35">
@@ -28,38 +28,35 @@
 						<el-input v-model="scope.row.columnDescription" autocomplete="off" />
 					</template>
 				</el-table-column>
-				<el-table-column prop="isPrimarykey" label="主键" >
+				<el-table-column prop="isPrimarykey" label="主键">
 					<template #default="scope">
 						<el-select v-model="scope.row.isPrimarykey" class="m-2" placeholder="Select">
 							<el-option v-for="item in isOrNotSelect()" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
-						<!-- <el-switch v-model="scope.row.isPrimarykey" active-text="是" inactive-text="否" /> -->
 					</template>
 				</el-table-column>
-				<el-table-column prop="isIdentity" label="自增" >
+				<el-table-column prop="isIdentity" label="自增">
 					<template #default="scope">
 						<el-select v-model="scope.row.isIdentity" class="m-2" placeholder="Select">
 							<el-option v-for="item in isOrNotSelect()" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
-						<!-- <el-switch v-model="scope.row.isIdentity" active-text="是" inactive-text="否" /> -->
 					</template>
 				</el-table-column>
-				<el-table-column prop="dataType" label="类型" >
+				<el-table-column prop="dataType" label="类型">
 					<template #default="scope">
 						<el-select v-model="scope.row.dataType" class="m-2" placeholder="Select">
 							<el-option v-for="item in apiTypeSelect()" :key="item.value" :label="item.value" :value="item.value" />
 						</el-select>
 					</template>
 				</el-table-column>
-				<el-table-column prop="isNullable" label="可空" >
+				<el-table-column prop="isNullable" label="可空">
 					<template #default="scope">
 						<el-select v-model="scope.row.isNullable" class="m-2" placeholder="Select">
 							<el-option v-for="item in isOrNotSelect()" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
-						<!-- <el-switch v-model="scope.row.isNullable" active-text="是" inactive-text="否" /> -->
 					</template>
 				</el-table-column>
-				<el-table-column prop="length" label="长度" >
+				<el-table-column prop="length" label="长度">
 					<template #default="scope">
 						<el-input-number v-model="scope.row.length" size="small" />
 					</template>
@@ -69,17 +66,19 @@
 						<el-input-number v-model="scope.row.decimalDigits" size="small" />
 					</template>
 				</el-table-column>
-				<el-table-column fixed="right" label="操作" width="120">
+				<el-table-column fixed="right" label="操作" width="220">
 					<template #default="scope">
-						<el-button link type="primary" size="small" @click.prevent="deleteRow(scope.$index)"> Remove </el-button>
+						<el-button link type="primary" icon="el-icon-delete" size="small" @click.prevent="handleColDelete(scope.$index)">删除</el-button>
+						<el-button v-if="tableData.length > 1" link type="primary" icon="ele-Top" size="small" @click.prevent="handleColTop(scope.row, scope.$index)">上移</el-button>
+						<el-button v-if="tableData.length > 1" link type="primary" icon="ele-Bottom" size="small" @click.prevent="handleColDown(scope.row, scope.$index)">下移</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
-			<div style="text-align: center">
-				<el-button type="primary" text bg @click="addPrimaryColumn">新增主键字段</el-button>
-				<el-button type="primary" text bg @click="addColumn">新增普通字段</el-button>
-				<el-button type="primary" text bg @click="addTenantColumn">新增租户字段</el-button>
-				<el-button type="primary" text bg @click="addBaseColumn">新增基础字段</el-button>
+			<div style="text-align: left; margin-top: 10px">
+				<el-button icon="ele-Plus" @click="addPrimaryColumn">新增主键字段</el-button>
+				<el-button icon="ele-Plus" @click="addColumn">新增普通字段</el-button>
+				<el-button icon="ele-Plus" @click="addTenantColumn">新增租户字段</el-button>
+				<el-button icon="ele-Plus" @click="addBaseColumn">新增基础字段</el-button>
 			</div>
 
 			<template #footer>
@@ -93,61 +92,59 @@
 </template>
 
 <script lang="ts">
-import { reactive, toRefs, defineComponent, getCurrentInstance, ref } from 'vue';
+import { reactive, toRefs, defineComponent, getCurrentInstance, ref, toRaw } from 'vue';
+import { EditRecordRow, UpdateDbTableInput } from '/@/api/system/interface';
+import { ElMessage } from 'element-plus';
 
-import { getAPI } from '/@/utils/axios-utils';
-import { SysDatabaseApi } from '/@/api-services/api';
-import { UpdateDbTableInput } from '/@/api-services/models';
+import { addTable } from '/@/api/system/admin';
 
 export default defineComponent({
-	name: 'sysEditTable',
+	name: 'sysAddTable',
 	components: {},
 	setup() {
 		var colIndex = 0;
-		/**
-		 *
-		 * @export
-		 * @interface EditRecordRow
-		 */
-		interface EditRecordRow {
-			columnDescription?: string | null;
-			dataType?: string | null;
-			dbColumnName?: string | null;
-			decimalDigits: number;
-			isIdentity: number;
-			isNullable: number;
-			isPrimarykey: number;
-			length: number;
-			key?: number;
-			editable?: boolean;
-			isNew: boolean;
-		}
 		const { proxy } = getCurrentInstance() as any;
 		const ruleFormRef = ref();
-		const tableData = reactive([]) as Array<EditRecordRow>;
 		const state = reactive({
 			isShowDialog: false,
 			ruleForm: {} as UpdateDbTableInput,
+			tableData: [] as Array<EditRecordRow>,
 		});
+
 		// 打开弹窗
 		const openDialog = (row: any) => {
 			state.ruleForm = row;
 			state.isShowDialog = true;
 		};
+
 		// 关闭弹窗
 		const closeDialog = () => {
-			proxy.mittBus.emit('submitRefreshTable');
+			proxy.mittBus.emit('addTableSubmitted', state.ruleForm.tableName);
+			state.tableData = [];
 			state.isShowDialog = false;
 		};
+
 		// 取消
 		const cancel = () => {
 			state.isShowDialog = false;
 		};
+
 		// 提交
 		const submit = () => {
 			ruleFormRef.value.validate(async (valid: boolean) => {
 				if (!valid) return;
-				await getAPI(SysDatabaseApi).sysDatabaseTableUpdatePost(state.ruleForm);
+				if (state.tableData.length === 0) {
+					ElMessage({
+						type: 'error',
+						message: `请选择库名!`,
+					});
+					return;
+				}
+				const params: any = {
+					dbColumnInfoList: state.tableData,
+					...state.ruleForm,
+				};
+				await addTable(params);
 				closeDialog();
 			});
 		};
@@ -226,19 +223,15 @@ export default defineComponent({
 			return [
 				{
 					label: '是',
-					value: 1
+					value: 1,
 				},
 				{
 					label: '否',
-					value: 0
-				}
+					value: 0,
+				},
 			];
 		};
 
-		const deleteRow = (index: number) => {
-			tableData.splice(index, 1);
-		};
-
 		function addPrimaryColumn() {
 			const addRow: EditRecordRow = {
 				columnDescription: '主键Id',
@@ -253,7 +246,7 @@ export default defineComponent({
 				editable: true,
 				isNew: true,
 			};
-			tableData.push(addRow);
+			state.tableData.push(addRow);
 			colIndex++;
 		}
 
@@ -271,7 +264,7 @@ export default defineComponent({
 				editable: true,
 				isNew: true,
 			};
-			tableData.push(addRow);
+			state.tableData.push(addRow);
 			colIndex++;
 		}
 
@@ -289,7 +282,7 @@ export default defineComponent({
 				editable: true,
 				isNew: true,
 			};
-			tableData.push(addRow);
+			state.tableData.push(addRow);
 			colIndex++;
 		}
 
@@ -324,7 +317,7 @@ export default defineComponent({
 			];
 
 			fileds.forEach((m: any) => {
-				tableData.push({
+				state.tableData.push({
 					columnDescription: m.desc,
 					dataType: m.dataType,
 					dbColumnName: m.name,
@@ -340,6 +333,31 @@ export default defineComponent({
 				colIndex++;
 			});
 		}
+
+		function handleColDelete(index: number) {
+			state.tableData.splice(index, 1);
+		}
+
+		function handleColTop(record: EditRecordRow, index: number) {
+			if (record.isNew) {
+				var data1 = ChangeExForArray(index, index - 1, state.tableData);
+				return data1;
+			}
+		}
+
+		function handleColDown(record: EditRecordRow, index: number) {
+			if (record.isNew) {
+				return ChangeExForArray(index, index + 1, state.tableData);
+			}
+		}
+
+		function ChangeExForArray(index1: number, index2: number, array: Array<EditRecordRow>) {
+			let temp = array[index1];
+			array[index1] = array[index2];
+			array[index2] = temp;
+			return array;
+		}
+
 		return {
 			ruleFormRef,
 			openDialog,
@@ -347,14 +365,15 @@ export default defineComponent({
 			cancel,
 			submit,
 			...toRefs(state),
-			tableData,
-			deleteRow,
 			apiTypeSelect,
 			addPrimaryColumn,
 			addColumn,
 			addTenantColumn,
 			addBaseColumn,
-			isOrNotSelect
+			isOrNotSelect,
+			handleColTop,
+			handleColDown,
+			handleColDelete,
 		};
 	},
 });

+ 1 - 2
Web/src/views/system/database/component/editTable.vue

@@ -1,7 +1,6 @@
 <template>
 	<div class="sys-dbTable-container">
-		<el-dialog v-model="isShowDialog" title="表编辑" draggable width="1400px">
-			<el-divider content-position="left">数据表信息</el-divider>
+		<el-dialog v-model="isShowDialog" title="表编辑" draggable width="1000px">
 			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="80px">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">

+ 98 - 0
Web/src/views/system/database/component/generateEntity.vue

@@ -0,0 +1,98 @@
+<template>
+	<div class="sys-dbColumn-container">
+		<el-dialog v-model="isShowDialog" title="配置实体" draggable width="600px">
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="表名" prop="tableName" :rules="[{ required: true, message: '表名不能为空', trigger: 'blur' }]">
+							<el-input disabled v-model="ruleForm.tableName" 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="实体名称" prop="entityName" :rules="[{ required: true, message: '实体名称不能为空', trigger: 'blur' }]">
+							<el-input v-model="ruleForm.entityName" 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="基类" prop="baseClassName">
+							<el-select v-model="ruleForm.baseClassName" clearable>
+								<el-option label="EntityBaseId" value="EntityBaseId" />
+								<el-option label="EntityBase" value="EntityBase" />
+								<el-option label="EntityTenant" value="EntityTenant" />
+							</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="position" clearable>
+							<el-select v-model="ruleForm.position">
+								<el-option label="Admin.NET.Application" value="Admin.NET.Application" />
+								<el-option label="Admin.NET.Core" value="Admin.NET.Core" />
+							</el-select>
+						</el-form-item>
+					</el-col>				
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, getCurrentInstance, ref } from 'vue';
+
+import { createEntity } from '/@/api/system/admin';
+
+export default defineComponent({
+	name: 'generateEntity',
+	components: {},
+	setup() {
+		const { proxy } = getCurrentInstance() as any;
+		const ruleFormRef = ref();
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {} as any,
+		});
+
+		// 打开弹窗
+		const openDialog = (row: any) => {
+			state.ruleForm.configId = row.configId;
+			state.ruleForm.tableName = row.tableName;
+			state.ruleForm.baseClassName = 'EntityBase';
+			state.ruleForm.position = 'Admin.NET.Application';
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			proxy.mittBus.emit('submitRefreshColumn');
+			state.isShowDialog = false;
+		};
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+		// 提交
+		const submit = () => {
+			ruleFormRef.value.validate(async (valid: boolean) => {
+				if (!valid) return;
+
+				await createEntity(state.ruleForm);
+				closeDialog();
+			});
+		};
+
+		return {
+			ruleFormRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+		};
+	},
+});
+</script>

+ 79 - 26
Web/src/views/system/database/index.vue

@@ -18,6 +18,7 @@
 					<el-button icon="ele-Delete" type="danger" @click="delTable"> 删除表 </el-button>
 					<el-button icon="ele-Plus" @click="openAddTable"> 增加表 </el-button>
 					<el-button icon="ele-Plus" @click="openAddColumn"> 增加列 </el-button>
+					<el-button icon="ele-Plus" type="primary" @click="openGenerateDialog"> 生成实体 </el-button>
 				</el-form-item>
 			</el-form>
 		</el-card>
@@ -59,6 +60,9 @@
 		</el-card>
 		<EditTable ref="editTableRef" />
 		<EditColumn ref="editColumnRef" />
+		<AddTable ref="addTableRef" />
+		<AddColumn ref="addColumnRef" />
+		<GenerateEntity ref="generateEntityRef" />
 	</div>
 </template>
 
@@ -67,19 +71,25 @@ import { toRefs, reactive, onMounted, ref, defineComponent, onUnmounted, getCurr
 import { ElMessageBox, ElMessage } from 'element-plus';
 import EditTable from '/@/views/system/database/component/editTable.vue';
 import EditColumn from '/@/views/system/database/component/editColumn.vue';
+import AddTable from '/@/views/system/database/component/addTable.vue';
+import AddColumn from '/@/views/system/database/component/addColumn.vue';
+import GenerateEntity from '/@/views/system/database/component/generateEntity.vue';
 
 import { getAPI } from '/@/utils/axios-utils';
 import { SysDatabaseApi } from '/@/api-services/api';
-import { getTableInfoList, getColumnInfoList } from '/@/api/system/admin';
 import { DbColumnOutput, DbTableInfo } from '/@/api-services/models';
+import { AddDbColumnInput } from '/@/api/system/interface';
 
 export default defineComponent({
 	name: 'sysDatabase',
-	components: { EditTable, EditColumn },
+	components: { EditTable, EditColumn, AddTable,AddColumn,GenerateEntity },
 	setup() {
 		const { proxy } = getCurrentInstance() as any;
 		const editTableRef = ref();
 		const editColumnRef = ref();
+		const addTableRef = ref();
+		const addColumnRef = ref();
+		const generateEntityRef = ref();
 		const state = reactive({
 			loading: false,
 			loading1: false,
@@ -97,7 +107,6 @@ export default defineComponent({
 		onMounted(async () => {
 			state.loading = true;
 			var res = await getAPI(SysDatabaseApi).sysDatabaseListGet();
-			// var res = await getTableInfoList({});
 			state.dbData = res.data.result;
 			state.loading = false;
 
@@ -107,35 +116,33 @@ export default defineComponent({
 			proxy.mittBus.on('submitRefreshColumn', () => {
 				handleQueryColunm();
 			});
+			proxy.mittBus.on('addTableSubmitted', (res: any) => {
+				handleQueryTable();
+				state.tableName = res;
+				handleQueryColunm();
+			});
 		});
 		onUnmounted(() => {
 			proxy.mittBus.off('submitRefreshTable');
 			proxy.mittBus.off('submitRefreshColumn');
+			proxy.mittBus.off('addTableSubmitted');
 		});
 		// 表查询操作
 		const handleQueryTable = async () => {
 			state.tableName = '';
 			state.columnData = [];
-
 			state.loading = true;
-			getTableInfoList({ configId: state.configId }).then((res) => {
-				state.tableData = res.data.result ?? [];
-				state.loading = false;
-			});
-			// var res = await getAPI(SysDatabaseApi).sysDatabaseTableListGet(state.configId);
-			// state.tableData = res.data.result ?? [];
-			// state.loading = false;
+
+			var res = await getAPI(SysDatabaseApi).sysDatabaseTableListGet(state.configId);
+			state.tableData = res.data.result ?? [];
+			state.loading = false;
 		};
 		// 列查询操作
 		const handleQueryColunm = async () => {
 			state.loading1 = true;
-			// var res = await getAPI(SysDatabaseApi).sysDatabaseColumnListGet(state.tableName, state.configId);
-			// state.columnData = res.data.result ?? [];
-			// state.loading1 = false;
-			getColumnInfoList({ tableName: state.tableName, configId: state.configId }).then((res) => {
-				state.columnData = res.data.result ?? [];
-				state.loading1 = false;
-			});
+			var res = await getAPI(SysDatabaseApi).sysDatabaseColumnListGet(state.tableName, state.configId);
+			state.columnData = res.data.result ?? [];
+			state.loading1 = false;
 		};
 		// 打开表编辑页面
 		const openEditTable = () => {
@@ -150,12 +157,35 @@ export default defineComponent({
 			};
 			editTableRef.value.openDialog(table);
 		};
+
+		// 打开实体生成页面
+		const openGenerateDialog = () => {
+			if (state.configId == '' || state.tableName == '') return;
+
+			var res = state.tableData.filter((u: any) => u.name == state.tableName);
+			var table: any = {
+				configId: state.configId,
+				tableName: state.tableName
+			};
+			generateEntityRef.value.openDialog(table);
+		};
 		// 打开表增加页面
 		const openAddTable = () => {
-			ElMessage({
-				type: 'success',
-				message: `期待您的PR! ${state.configId}`,
-			});
+			if (state.configId == '') {
+				ElMessage({
+					type: 'error',
+					message: `请选择库名!`,
+				});
+				return;
+			}
+
+			var table: any = {
+				configId: state.configId,
+				tableName: '',
+				oldTableName: '',
+				description: '',
+			};
+			addTableRef.value.openDialog(table);
 		};
 		// 打开列编辑页面
 		const openEditColumn = (row: any) => {
@@ -170,10 +200,29 @@ export default defineComponent({
 		};
 		// 打开列增加页面
 		const openAddColumn = () => {
-			ElMessage({
-				type: 'success',
-				message: `期待您的PR! ${state.configId}`,
-			});
+			if (state.configId == '' || state.tableName == '') {
+				ElMessage({
+					type: 'error',
+					message: `请选择库名和表名!`,
+				});
+				return;
+			}
+			const addRow: AddDbColumnInput = {
+				configId: state.configId,
+				tableName: state.tableName,
+				columnDescription: '',
+				dataType: '',
+				dbColumnName: '',
+				decimalDigits: 0,
+				isIdentity: 0,
+				isNullable: 0,
+				isPrimarykey: 0,
+				length: 0,
+				key: 0,
+				editable: true,
+				isNew: true,
+			};
+			addColumnRef.value.openDialog(addRow);
 		};
 		// 删除表
 		const delTable = () => {
@@ -212,8 +261,12 @@ export default defineComponent({
 			openAddColumn,
 			delTable,
 			delColumn,
+			openGenerateDialog,
 			editTableRef,
 			editColumnRef,
+			addTableRef,
+			addColumnRef,
+			generateEntityRef,
 			...toRefs(state),
 		};
 	},