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

Merge branch 'next' of https://gitee.com/zuohuaijun/Admin.NET into next

林海波 2 лет назад
Родитель
Сommit
e782a5c04c
32 измененных файлов с 398 добавлено и 82 удалено
  1. 1 1
      Admin.NET/Admin.NET.Application/Configuration/Captcha.json
  2. 3 3
      Admin.NET/Admin.NET.Application/Configuration/CodeGen.json
  3. 2 2
      Admin.NET/Admin.NET.Application/Configuration/OSS.json
  4. 4 0
      Admin.NET/Admin.NET.Application/GlobalUsings.cs
  5. 5 5
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  6. 40 16
      Admin.NET/Admin.NET.Core/Enum/CultureLevelEnum.cs
  7. 38 0
      Admin.NET/Admin.NET.Core/Enum/MaritalStatusEnum.cs
  8. 1 1
      Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs
  9. 10 0
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
  10. 13 1
      Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs
  11. 2 2
      Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs
  12. 0 8
      Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs
  13. 1 0
      Admin.NET/Admin.NET.Web.Core/Startup.cs
  14. 1 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Input.cs.vm
  15. 22 1
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm
  16. 32 2
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm
  17. 76 0
      Web/src/api-services/apis/sys-code-gen-api.ts
  18. 85 0
      Web/src/api-services/apis/sys-database-api.ts
  19. 6 2
      Web/src/api-services/models/culture-level-enum.ts
  20. 2 2
      Web/src/components/auth/authAll.vue
  21. 1 1
      Web/src/components/table/index.vue
  22. 2 2
      Web/src/directive/authDirective.ts
  23. 1 1
      Web/src/layout/navBars/topBar/user.vue
  24. 1 1
      Web/src/stores/userInfo.ts
  25. 1 1
      Web/src/utils/arrayOperation.ts
  26. 2 2
      Web/src/utils/authFunction.ts
  27. 5 0
      Web/src/utils/commonFunction.ts
  28. 6 15
      Web/src/views/system/codeGen/component/editCodeGenDialog.vue
  29. 6 2
      Web/src/views/system/codeGen/index.vue
  30. 9 3
      Web/src/views/system/database/component/genEntity.vue
  31. 13 5
      Web/src/views/system/database/component/genSeedData.vue
  32. 7 3
      Web/src/views/system/database/index.vue

+ 1 - 1
Admin.NET/Admin.NET.Application/Configuration/Captcha.json

@@ -3,7 +3,7 @@
 
   "CaptchaOptions": {
     "CaptchaType": 10, // 验证码类型0、1、2、3、4、5、6、7、8、9、10、11
-    "CodeLength": 2, // 验证码长度, 要放在CaptchaType设置后  当类型为算术表达式时,长度代表操作的个数, 例如2
+    "CodeLength": 1, // 验证码长度, 要放在CaptchaType设置后  当类型为算术表达式时,长度代表操作的个数, 例如2
     "ExpirySeconds": 60, // 验证码过期秒数
     "IgnoreCase": true, // 比较时是否忽略大小写
     "StoreageKeyPrefix": "", // 存储键前缀

+ 3 - 3
Admin.NET/Admin.NET.Application/Configuration/CodeGen.json

@@ -4,7 +4,7 @@
   // 代码生成配置项-程序集名称集合
   "CodeGen": {
     "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application" ],
-    "BaseEntityNames": [ "EntityTenantId", "EntityTenant","EntityBaseData", "EntityBase", "EntityBaseId" ],
+    "BaseEntityNames": [ "EntityTenantId", "EntityTenant", "EntityBaseData", "EntityBase", "EntityBaseId" ],
     "EntityBaseColumn": {
       "EntityTenantId": [ "Id", "TenantId" ],
       "EntityTenant": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "IsDelete", "TenantId" ],
@@ -13,7 +13,7 @@
       "EntityBaseId": [ "Id" ]
       //"BaseId": [ "Id" ]
     },
-    "FrontRootPath": "Web", // 前端文件根目录
-    "BackendApplicationNamespace": "Admin.NET.Application" // 后端生成到的项目
+    "FrontRootPath": "Web", // 前端项目根目录
+    "BackendApplicationNamespaces": [ "Admin.NET.Application", "Admin.NET.Application2" ] // 后端生成到的项目
   }
 }

+ 2 - 2
Admin.NET/Admin.NET.Application/Configuration/OSS.json

@@ -3,8 +3,8 @@
 
   "Upload": {
     "Path": "Upload/{yyyy}/{MM}/{dd}", // 文件上传目录
-    "MaxSize": 1048576, // 文件最大限制
-    "ContentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif", "image/bmp", "text/plain", "application/pdf", "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ],
+    "MaxSize": 20971520, // 文件最大限制1024*1024*20
+    "ContentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif", "image/bmp", "text/plain", "application/pdf", "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "video/mp4" ],
     "EnableMd5": true // 启用文件MDF5验证-防止重复上传
   },
   "OSSProvider": {

+ 4 - 0
Admin.NET/Admin.NET.Application/GlobalUsings.cs

@@ -7,13 +7,17 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
+global using Admin.NET.Core;
 global using Furion;
+global using Furion.DependencyInjection;
 global using Furion.DynamicApiController;
+global using Furion.FriendlyException;
 global using Mapster;
 global using Microsoft.AspNetCore.Mvc;
 global using Microsoft.Extensions.DependencyInjection;
 global using SqlSugar;
 global using System;
+global using System.Collections.Generic;
 global using System.ComponentModel;
 global using System.ComponentModel.DataAnnotations;
 global using System.Threading.Tasks;

+ 5 - 5
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -22,9 +22,9 @@
     <PackageReference Include="AspNet.Security.OAuth.Weixin" Version="6.0.15" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
     <PackageReference Include="FluentEmail.Smtp" Version="3.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.8.44" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.8.44" />
-    <PackageReference Include="Furion.Pure" Version="4.8.8.44" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.8.45" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.8.45" />
+    <PackageReference Include="Furion.Pure" Version="4.8.8.45" />
     <PackageReference Include="IPTools.China" Version="1.6.0" />
     <PackageReference Include="Lazy.Captcha.Core" Version="2.0.6" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.5" />
@@ -32,11 +32,11 @@
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.22" />
     <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="6.0.22" />
     <PackageReference Include="NEST" Version="7.17.5" />
-    <PackageReference Include="NewLife.Redis" Version="5.5.2023.803" />
+    <PackageReference Include="NewLife.Redis" Version="5.5.2023.1001" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.33.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.20.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.107" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.108" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.5" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />

+ 40 - 16
Admin.NET/Admin.NET.Core/Enum/CultureLevelEnum.cs

@@ -15,51 +15,75 @@ namespace Admin.NET.Core;
 [Description("文化程度枚举")]
 public enum CultureLevelEnum
 {
+    /// <summary>
+    /// 其他
+    /// </summary>
+    [Description("其他")]
+    Level0 = 0,
+
     /// <summary>
     /// 小学
     /// </summary>
     [Description("小学")]
-    Level1 = 0,
+    Level1 = 1,
 
     /// <summary>
     /// 初中
     /// </summary>
     [Description("初中")]
-    Level2 = 1,
+    Level2 = 2,
+
+    /// <summary>
+    /// 普通高中
+    /// </summary>
+    [Description("普通高中")]
+    Level3 = 3,
+
+    /// <summary>
+    /// 技工学校
+    /// </summary>
+    [Description("技工学校")]
+    Level4 = 4,
+
+    /// <summary>
+    /// 职业教育
+    /// </summary>
+    [Description("职业教育")]
+    Level5 = 5,
 
     /// <summary>
-    /// 高中
+    /// 职业高中
     /// </summary>
-    [Description("高中")]
-    Level3 = 2,
+    [Description("职业高中")]
+    Level6 = 6,
 
     /// <summary>
-    /// 中专
+    /// 中
     /// </summary>
-    [Description("中专")]
-    Level4 = 3,
+    [Description("中")]
+    Level7 = 7,
 
     /// <summary>
-    /// 大专
+    /// 大
     /// </summary>
-    [Description("大专")]
-    Level5 = 4,
+    [Description("大")]
+    Level8 = 8,
 
     /// <summary>
-    /// 本科
+    /// 大学本科
     /// </summary>
-    [Description("本科")]
-    Level6 = 5,
+    [Description("大学本科")]
+    Level9 = 9,
 
     /// <summary>
     /// 硕士研究生
     /// </summary>
     [Description("硕士研究生")]
-    Level7 = 6,
+    Level10 = 10,
 
     /// <summary>
     /// 博士研究生
     /// </summary>
     [Description("博士研究生")]
-    Level8 = 7,
+    Level11 = 11,
 }

+ 38 - 0
Admin.NET/Admin.NET.Core/Enum/MaritalStatusEnum.cs

@@ -0,0 +1,38 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 婚姻状况枚举
+/// </summary>
+[Description("婚姻状况枚举")]
+public enum MaritalStatusEnum
+{
+    /// <summary>
+    /// 未知
+    /// </summary>
+    [Description("未知")]
+    None = 0,
+
+    /// <summary>
+    /// 未婚
+    /// </summary>
+    [Description("未婚")]
+    UnMarried = 1,
+
+    /// <summary>
+    /// 已婚
+    /// </summary>
+    [Description("已婚")]
+    Married = 2,
+
+    /// <summary>
+    /// 离异
+    /// </summary>
+    [Description("离异")]
+    Divorce = 3,
+
+    /// <summary>
+    /// 丧偶
+    /// </summary>
+    [Description("丧偶")]
+    Widowed = 4,
+}

+ 1 - 1
Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs

@@ -37,5 +37,5 @@ public sealed class CodeGenOptions : IConfigurableOptions
     /// <summary>
     /// 后端生成到的项目
     /// </summary>
-    public string BackendApplicationNamespace { get; set; }
+    public List<string> BackendApplicationNamespaces { get; set; }
 }

+ 10 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -288,6 +288,16 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         return await Task.FromResult(entityInfos);
     }
 
+    /// <summary>
+    /// 获取程序保存位置
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("获取程序保存位置")]
+    public List<string> GetApplicationNamespaces()
+    {
+        return _codeGenOptions.BackendApplicationNamespaces;
+    }
+
     /// <summary>
     /// 代码生成到本地
     /// </summary>

+ 13 - 1
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -57,6 +57,18 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         return db.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt<List<DbColumnOutput>>();
     }
 
+    /// <summary>
+    /// 获取数据库数据类型列表
+    /// </summary>
+    /// <param name="configId"></param>
+    /// <returns></returns>
+    [DisplayName("获取数据库数据类型列表")]
+    public List<string> GetDbTypeList(string configId = SqlSugarConst.MainConfigId)
+    {
+        var db = _db.AsTenant().GetConnectionScope(configId);
+        return db.DbMaintenance.GetDbTypes().OrderBy(u => u).ToList();
+    }
+
     /// <summary>
     /// 增加列
     /// </summary>
@@ -250,7 +262,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
 
         var templatePath = GetSeedDataTemplatePath();
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
-        var tableInfo = db.DbMaintenance.GetTableInfoList(false).FirstOrDefault(u => u.Name == input.TableName); // 表名
+        var tableInfo = db.DbMaintenance.GetTableInfoList(false).First(u => u.Name == input.TableName); // 表名
         List<DbColumnInfo> dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false); // 所有字段
         IEnumerable<EntityInfo> entityInfos = await GetEntityInfos();
         Type entityType = null;

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -111,12 +111,12 @@ public class SysOrgService : IDynamicApiController, ITransient
             if (orgIdList.Count < 1 || !orgIdList.Contains(input.Pid))
                 throw Oops.Oh(ErrorCodeEnum.D2003);
         }
-        
+
         // 删除与此父机构有关的用户机构缓存
         var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
         if (pOrg != null)
             DeleteUserOrgCache(pOrg.Id, pOrg.Pid);
-        
+
         var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
         return newOrg.Id;
     }

+ 0 - 8
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -74,14 +74,6 @@ public static class SqlSugarSetup
                     column.IsNullable = true;
                 if (config.DbSettings.EnableUnderLine && !column.IsIgnore && !column.DbColumnName.Contains('_'))
                     column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName); // 驼峰转下划线
-
-                if (config.DbType == SqlSugar.DbType.Oracle)
-                {
-                    if (type.PropertyType == typeof(long) || type.PropertyType == typeof(long?))
-                        column.DataType = "number(18)";
-                    if (type.PropertyType == typeof(bool) || type.PropertyType == typeof(bool?))
-                        column.DataType = "number(1)";
-                }
             },
             DataInfoCacheService = new SqlSugarCache(),
         };

+ 1 - 0
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -61,6 +61,7 @@ public class Startup : AppStartup
         // Json序列化设置
         static void SetNewtonsoftJsonSetting(JsonSerializerSettings setting)
         {
+            setting.DateFormatHandling = DateFormatHandling.IsoDateFormat;
             setting.DateTimeZoneHandling = DateTimeZoneHandling.Local;
             setting.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 时间格式化
             setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 忽略循环引用

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

@@ -1,3 +1,4 @@
+using Admin.NET.Core;
 using System.ComponentModel.DataAnnotations;
 
 namespace @Model.NameSpace;

+ 22 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm

@@ -131,6 +131,17 @@
 						</el-form-item>
 						@:
 					</el-col>
+					}else if(@column.EffectType == "EnumSelector"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
+							@:<el-select clearable v-model="ruleForm.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)">
+								@:<el-option v-for="(item,index) in  getEnum@(@column.PropertyName)Data"  :key="index" :value="item.value" :label="item.describe"></el-option>
+								@:
+							</el-select>
+							@:
+						</el-form-item>
+						@:
+					</el-col>
 					}else{
 
 					}
@@ -178,12 +189,19 @@
 	}
 	@if(@Model.TableField.Any(x=>x.EffectType == "Select")){
 	@:import { getDictDataList } from '/@@/api/system/admin';
-
 	}
+	@if(@Model.TableField.Any(x=>x.EffectType == "EnumSelector")){
+	@:import { getAPI } from '/@@/utils/axios-utils';
+	@:import { SysEnumApi } from '/@@/api-services/api';
+	}
+
 	@foreach (var column in Model.TableField){
 	if(@column.EffectType == "Select"){
 	@:const getEdit@(@column.LowerPropertyName)Data = ref<any>([]);
 	}
+	if(@column.EffectType == "EnumSelector"){
+	@:const getEnum@(@column.PropertyName)Data = ref<any>([]);
+	}
 	}
 	//父级传递来的参数
 	var props = defineProps({
@@ -310,6 +328,9 @@
 		if(@column.EffectType == "Select"){
 		@:getEdit@(@column.LowerPropertyName)Data.value= await dictTypeDataList('@(@column.DictTypeCode)');
 		}
+		if(@column.EffectType == "EnumSelector"){
+			@:getEnum@(@column.PropertyName)Data.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('@(@column.DictTypeCode)')).data.result ?? [];
+		}
 		}
 	});
 

+ 32 - 2
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -52,6 +52,14 @@
           </el-select>
           @:
         </el-form-item>
+        }else if(@column.EffectType == "EnumSelector"){
+        @:<el-form-item label="@column.ColumnComment">
+          @:<el-select clearable="" v-model="queryParams.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)">
+            @:<el-option v-for="(item,index) in getEnum@(@column.LowerPropertyName)Data" :key="index" :value="item.value" :label="item.describe" />
+            @:
+          </el-select>
+          @:
+        </el-form-item>
         }else if(@column.EffectType == "DatePicker"){
         @:<el-form-item label="@column.ColumnComment">
           if(@column.QueryType == "~"){
@@ -119,6 +127,13 @@
           @:
         </el-table-column>
         }
+        else if(@column.EffectType == "EnumSelector"){
+          @:<el-table-column prop="@column.LowerPropertyName" label="@column.ColumnComment" width="@(column.ColumnComment!=null && column.ColumnComment.Length > 5 ? column.ColumnComment.Length * 15 : 140)" show-overflow-tooltip="" >
+            @:<template #default="scope">
+              @:<el-tag>{{ getEnumDesc(scope.row.@column.LowerPropertyName, getEnum@(@column.PropertyName)Data)}}</el-tag>
+            @:</template>
+          @:</el-table-column>
+        }
         else {
         @:<el-table-column prop="@column.LowerPropertyName" label="@column.ColumnComment" width="@(column.ColumnComment!=null && column.ColumnComment.Length > 5 ? column.ColumnComment.Length * 15 : 140)" show-overflow-tooltip="" />
         }
@@ -173,12 +188,24 @@
   break;
   }
   }
+  @if(@Model.QueryWhetherList.Any(x=>x.EffectType == "EnumSelector")){
+	@:import { getAPI } from '/@@/utils/axios-utils';
+	@:import { SysEnumApi } from '/@@/api-services/api';
+  @:import commonFunction from '/@@/utils/commonFunction';
+	}
 
   @foreach (var column in Model.QueryWhetherList){
   if(@column.EffectType == "Select"){
   @:const get@(@column.LowerPropertyName)Data = ref<any>([]);
-    }
-    }
+  }
+  if(@column.EffectType == "EnumSelector"){
+  @:const getEnum@(@column.PropertyName)Data = ref<any>([]);
+  }
+  }
+
+  @if(@Model.QueryWhetherList.Any(x=>x.EffectType == "EnumSelector")){
+	@:const { getEnumDesc } = commonFunction();
+	}
 
   const editDialogRef = ref();
   const loading = ref(false);
@@ -203,6 +230,9 @@
   if(@column.EffectType == "Select"){
     @:get@(@column.LowerPropertyName)Data.value = await dictTypeDataList('@(@column.DictTypeCode)');
   }
+  if(@column.EffectType == "EnumSelector"){
+    @:getEnum@(@column.PropertyName)Data.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('@(@column.DictTypeCode)')).data.result ?? [];
+  }
   }
   };
 

+ 76 - 0
Web/src/api-services/apis/sys-code-gen-api.ts

@@ -19,6 +19,7 @@ import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } fr
 import { AddCodeGenInput } from '../models';
 import { AdminResultListColumnOuput } from '../models';
 import { AdminResultListDatabaseOutput } from '../models';
+import { AdminResultListString } from '../models';
 import { AdminResultListTableOutput } from '../models';
 import { AdminResultObject } from '../models';
 import { AdminResultSqlSugarPagedListSysCodeGen } from '../models';
@@ -81,6 +82,49 @@ export const SysCodeGenApiAxiosParamCreator = function (configuration?: Configur
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 获取程序保存位置
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysCodeGenApplicationNamespacesGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysCodeGen/applicationNamespaces`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 根据表名获取列集合
@@ -495,6 +539,19 @@ export const SysCodeGenApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 获取程序保存位置
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCodeGenApplicationNamespacesGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListString>>> {
+            const localVarAxiosArgs = await SysCodeGenApiAxiosParamCreator(configuration).apiSysCodeGenApplicationNamespacesGet(options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 根据表名获取列集合
@@ -626,6 +683,15 @@ export const SysCodeGenApiFactory = function (configuration?: Configuration, bas
         async apiSysCodeGenAddPost(body?: AddCodeGenInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
             return SysCodeGenApiFp(configuration).apiSysCodeGenAddPost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 获取程序保存位置
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCodeGenApplicationNamespacesGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListString>> {
+            return SysCodeGenApiFp(configuration).apiSysCodeGenApplicationNamespacesGet(options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 根据表名获取列集合
@@ -727,6 +793,16 @@ export class SysCodeGenApi extends BaseAPI {
     public async apiSysCodeGenAddPost(body?: AddCodeGenInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
         return SysCodeGenApiFp(this.configuration).apiSysCodeGenAddPost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 获取程序保存位置
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysCodeGenApi
+     */
+    public async apiSysCodeGenApplicationNamespacesGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListString>> {
+        return SysCodeGenApiFp(this.configuration).apiSysCodeGenApplicationNamespacesGet(options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 根据表名获取列集合

+ 85 - 0
Web/src/api-services/apis/sys-database-api.ts

@@ -19,6 +19,7 @@ import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } fr
 import { AdminResultListDbColumnOutput } from '../models';
 import { AdminResultListDbTableInfo } from '../models';
 import { AdminResultListObject } from '../models';
+import { AdminResultListString } from '../models';
 import { CreateEntityInput } from '../models';
 import { CreateSeedDataInput } from '../models';
 import { DbColumnInput } from '../models';
@@ -280,6 +281,55 @@ export const SysDatabaseApiAxiosParamCreator = function (configuration?: Configu
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 获取数据库数据类型列表
+         * @param {string} configId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysDatabaseDbTypeListConfigIdGet: async (configId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'configId' is not null or undefined
+            if (configId === null || configId === undefined) {
+                throw new RequiredError('configId','Required parameter configId was null or undefined when calling apiSysDatabaseDbTypeListConfigIdGet.');
+            }
+            const localVarPath = `/api/sysDatabase/dbTypeList/{configId}`
+                .replace(`{${"configId"}}`, encodeURIComponent(String(configId)));
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 删除列
@@ -644,6 +694,20 @@ export const SysDatabaseApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 获取数据库数据类型列表
+         * @param {string} configId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysDatabaseDbTypeListConfigIdGet(configId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListString>>> {
+            const localVarAxiosArgs = await SysDatabaseApiAxiosParamCreator(configuration).apiSysDatabaseDbTypeListConfigIdGet(configId, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 删除列
@@ -787,6 +851,16 @@ export const SysDatabaseApiFactory = function (configuration?: Configuration, ba
         async apiSysDatabaseCreateSeedDataPost(body?: CreateSeedDataInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
             return SysDatabaseApiFp(configuration).apiSysDatabaseCreateSeedDataPost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 获取数据库数据类型列表
+         * @param {string} configId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysDatabaseDbTypeListConfigIdGet(configId: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListString>> {
+            return SysDatabaseApiFp(configuration).apiSysDatabaseDbTypeListConfigIdGet(configId, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 删除列
@@ -912,6 +986,17 @@ export class SysDatabaseApi extends BaseAPI {
     public async apiSysDatabaseCreateSeedDataPost(body?: CreateSeedDataInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
         return SysDatabaseApiFp(this.configuration).apiSysDatabaseCreateSeedDataPost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 获取数据库数据类型列表
+     * @param {string} configId 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysDatabaseApi
+     */
+    public async apiSysDatabaseDbTypeListConfigIdGet(configId: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListString>> {
+        return SysDatabaseApiFp(this.configuration).apiSysDatabaseDbTypeListConfigIdGet(configId, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 删除列

+ 6 - 2
Web/src/api-services/models/culture-level-enum.ts

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 文化程度枚举<br />&nbsp;小学 Level1 = 0<br />&nbsp;初中 Level2 = 1<br />&nbsp;高中 Level3 = 2<br />&nbsp;中专 Level4 = 3<br />&nbsp;大专 Level5 = 4<br />&nbsp;本科 Level6 = 5<br />&nbsp;硕士研究生 Level7 = 6<br />&nbsp;博士研究生 Level8 = 7<br />
+ * 文化程度枚举<br />&nbsp;其他 Level0 = 0<br />&nbsp;小学 Level1 = 1<br />&nbsp;初中 Level2 = 2<br />&nbsp;普通高中 Level3 = 3<br />&nbsp;技工学校 Level4 = 4<br />&nbsp;职业教育 Level5 = 5<br />&nbsp;职业高中 Level6 = 6<br />&nbsp;中等专科 Level7 = 7<br />&nbsp;大学专科 Level8 = 8<br />&nbsp;大学本科 Level9 = 9<br />&nbsp;硕士研究生 Level10 = 10<br />&nbsp;博士研究生 Level11 = 11<br />
  * @export
  * @enum {string}
  */
@@ -24,6 +24,10 @@ export enum CultureLevelEnum {
     NUMBER_4 = 4,
     NUMBER_5 = 5,
     NUMBER_6 = 6,
-    NUMBER_7 = 7
+    NUMBER_7 = 7,
+    NUMBER_8 = 8,
+    NUMBER_9 = 9,
+    NUMBER_10 = 10,
+    NUMBER_11 = 11
 }
 

+ 2 - 2
Web/src/components/auth/authAll.vue

@@ -6,7 +6,7 @@
 import { computed } from 'vue';
 import { storeToRefs } from 'pinia';
 import { useUserInfo } from '/@/stores/userInfo';
-import { judementSameArr } from '/@/utils/arrayOperation';
+import { judgementSameArr } from '/@/utils/arrayOperation';
 
 // 定义父组件传过来的值
 const props = defineProps({
@@ -22,6 +22,6 @@ const { userInfos } = storeToRefs(stores);
 
 // 获取 pinia 中的用户权限
 const getUserAuthBtnList = computed(() => {
-	return judementSameArr(props.value, userInfos.value.authBtnList);
+	return judgementSameArr(props.value, userInfos.value.authBtnList);
 });
 </script>

+ 1 - 1
Web/src/components/table/index.vue

@@ -255,7 +255,7 @@ const importData = (data: Array<EmptyObjectType>) => {
 	}
 	exportExcel(
 		exportData,
-		`${props.config.exportFileName ? props.config.exportFileName : themeConfig.value.globalTitle}_${new Date().toLocaleString()}.xlsx`,
+		`${props.config.exportFileName ? props.config.exportFileName : themeConfig.value.globalTitle}_${new Date().toLocaleString()}`,
 		setHeader.value.filter((item) => {
 			return item.type != 'action';
 		}),

+ 2 - 2
Web/src/directive/authDirective.ts

@@ -1,6 +1,6 @@
 import type { App } from 'vue';
 import { useUserInfo } from '/@/stores/userInfo';
-import { judementSameArr } from '/@/utils/arrayOperation';
+import { judgementSameArr } from '/@/utils/arrayOperation';
 
 /**
  * 用户权限指令
@@ -33,7 +33,7 @@ export function authDirective(app: App) {
 	app.directive('auth-all', {
 		mounted(el, binding) {
 			const stores = useUserInfo();
-			const flag = judementSameArr(binding.value, stores.userInfos.authBtnList);
+			const flag = judgementSameArr(binding.value, stores.userInfos.authBtnList);
 			if (!flag) el.parentNode.removeChild(el);
 		},
 	});

+ 1 - 1
Web/src/layout/navBars/topBar/user.vue

@@ -55,7 +55,7 @@
 		<el-dropdown :show-timeout="70" :hide-timeout="50" @command="onHandleCommandClick">
 			<span class="layout-navbars-breadcrumb-user-link">
 				<img :src="userInfos.avatar" class="layout-navbars-breadcrumb-user-link-photo mr5" />
-				{{ userInfos.realName == '' ? userInfos.account: userInfos.realName }}
+				{{ userInfos.realName == '' ? userInfos.account : userInfos.realName }}
 				<el-icon class="el-icon--right">
 					<ele-ArrowDown />
 				</el-icon>

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

@@ -34,7 +34,7 @@ export const useUserInfo = defineStore('userInfo', {
 				this.userInfos = userInfos;
 			}
 		},
-        async setConstList() {
+		async setConstList() {
 			// 存储用户信息到浏览器缓存
 			if (Session.get('constList')) {
 				this.constList = Session.get('constList');

+ 1 - 1
Web/src/utils/arrayOperation.ts

@@ -4,7 +4,7 @@
  * @param old 源数据
  * @returns 两数组相同返回 `true`,反之则反
  */
-export function judementSameArr(newArr: unknown[] | string[], oldArr: string[]): boolean {
+export function judgementSameArr(newArr: unknown[] | string[], oldArr: string[]): boolean {
 	const news = removeDuplicate(newArr);
 	const olds = removeDuplicate(oldArr);
 	let count = 0;

+ 2 - 2
Web/src/utils/authFunction.ts

@@ -1,5 +1,5 @@
 import { useUserInfo } from '/@/stores/userInfo';
-import { judementSameArr } from '/@/utils/arrayOperation';
+import { judgementSameArr } from '/@/utils/arrayOperation';
 
 /**
  * 单个权限验证
@@ -34,5 +34,5 @@ export function auths(value: Array<string>): boolean {
  */
 export function authAll(value: Array<string>): boolean {
 	const stores = useUserInfo();
-	return judementSameArr(value, stores.userInfos.authBtnList);
+	return judgementSameArr(value, stores.userInfos.authBtnList);
 }

+ 5 - 0
Web/src/utils/commonFunction.ts

@@ -64,6 +64,10 @@ export default function () {
 	const removeHtml = (value: string) => {
 		return value.replace(/<[^>]+>/g, '');
 	};
+	// 获取枚举描述
+	const getEnumDesc = (key: any, lstEnum: any) => {
+		return lstEnum.find((x: any) => x.value == key)?.describe;
+	};
 	return {
 		percentFormat,
 		dateFormatYMD,
@@ -74,5 +78,6 @@ export default function () {
 		copyText,
 		removeHtmlSub,
 		removeHtml,
+		getEnumDesc,
 	};
 }

+ 6 - 15
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -73,8 +73,11 @@
 						</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="state.ruleForm.nameSpace" clearable placeholder="请输入" />
+						<el-form-item label="命名空间" prop="nameSpace" :rules="[{ required: true, message: '请选择命名空间', trigger: 'blur' }]">
+							<!-- <el-input v-model="state.ruleForm.nameSpace" clearable placeholder="请输入" /> -->
+							<el-select v-model="state.ruleForm.nameSpace" filterable clearable class="w100" placeholder="命名空间">
+								<el-option v-for="(item,index) in props.applicationNamespaces" :key="index" :label="item" :value="item" />
+							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
@@ -110,6 +113,7 @@ import { UpdateCodeGenInput, AddCodeGenInput, SysMenu } from '/@/api-services/mo
 
 const props = defineProps({
 	title: String,
+	applicationNamespaces: Array<String>,
 });
 const emits = defineEmits(['handleQuery']);
 const ruleFormRef = ref();
@@ -175,19 +179,6 @@ const submit = () => {
 	});
 };
 
-const isOrNotSelect = () => {
-	return [
-		{
-			label: '是',
-			value: 1,
-		},
-		{
-			label: '否',
-			value: 0,
-		},
-	];
-};
-
 // 导出对象
 defineExpose({ openDialog });
 </script>

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

@@ -60,7 +60,7 @@
 			/>
 		</el-card>
 
-		<EditCodeGenDialog :title="state.editMenuTitle" ref="EditCodeGenRef" @handleQuery="handleQuery" />
+		<EditCodeGenDialog :title="state.editMenuTitle" ref="EditCodeGenRef" @handleQuery="handleQuery" :application-namespaces="state.applicationNamespaces" />
 		<CodeConfigDialog ref="CodeConfigRef" @handleQuery="handleQuery" />
 	</div>
 </template>
@@ -97,10 +97,14 @@ const state = reactive({
 		total: 0 as any,
 	},
 	editMenuTitle: '',
+	applicationNamespaces: [] as Array<string>,
 });
 
 onMounted(async () => {
 	handleQuery();
+
+	let res = await getAPI(SysCodeGenApi).apiSysCodeGenApplicationNamespacesGet();
+	state.applicationNamespaces = res.data.result as Array<string>;
 });
 
 const openConfigDialog = (row: any) => {
@@ -139,7 +143,7 @@ const handleCurrentChange = (val: number) => {
 // 打开表增加页面
 const openAddDialog = () => {
 	state.editMenuTitle = '增加';
-	EditCodeGenRef.value?.openDialog({ nameSpace: 'Admin.NET.Application', authorName: 'Admin.NET', generateType: '200' });
+	EditCodeGenRef.value?.openDialog({ authorName: 'Admin.NET', generateType: '200' });
 };
 
 // 打开表编辑页面

+ 9 - 3
Web/src/views/system/database/component/genEntity.vue

@@ -28,7 +28,10 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="存放位置" prop="position">
-							<el-input v-model="state.ruleForm.position" placeholder="存放位置" clearable >Admin.NET.Application</el-input>
+							<!-- <el-input v-model="state.ruleForm.position" placeholder="存放位置" clearable>Admin.NET.Application</el-input> -->
+							<el-select v-model="state.ruleForm.position" filterable clearable class="w100" placeholder="存放位置">
+								<el-option v-for="(item,index) in props.applicationNamespaces" :key="index" :label="item" :value="item" />
+							</el-select>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -57,6 +60,10 @@ const state = reactive({
 	codeGenBaseClassName: [] as any,
 });
 
+const props = defineProps({
+	applicationNamespaces: { type: Array },
+});
+
 onMounted(async () => {
 	let resDicData = await getAPI(SysDictTypeApi).apiSysDictTypeDataListGet('code_gen_base_class');
 	state.codeGenBaseClassName = resDicData.data.result;
@@ -66,8 +73,7 @@ onMounted(async () => {
 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.ruleForm.baseClassName = 'EntityBase';	
 	state.isShowDialog = true;
 };
 

+ 13 - 5
Web/src/views/system/database/component/genSeedData.vue

@@ -7,7 +7,7 @@
 					<span> 生成种子数据 </span>
 				</div>
 			</template>
-			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="state.rules">
 				<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' }]">
@@ -21,7 +21,10 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="存放位置" prop="position">
-							<el-input v-model="state.ruleForm.position" placeholder="存放位置" clearable >Admin.NET.Core</el-input>
+							<!-- <el-input v-model="state.ruleForm.position" placeholder="存放位置" clearable >Admin.NET.Core</el-input> -->
+							<el-select v-model="state.ruleForm.position" filterable clearable class="w100" placeholder="存放位置">
+								<el-option v-for="(item, index) in props.applicationNamespaces" :key="index" :label="item" :value="item" />
+							</el-select>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -43,11 +46,17 @@ import { getAPI } from '/@/utils/axios-utils';
 import { SysDatabaseApi, SysDictTypeApi } from '/@/api-services/api';
 
 const emits = defineEmits(['handleQueryColumn']);
+
+const props = defineProps({
+	applicationNamespaces: { type: Array },
+});
+
 const ruleFormRef = ref();
 const state = reactive({
 	isShowDialog: false,
 	ruleForm: {} as any,
 	codeGenBaseClassName: [] as any,
+	rules: { position: [{ required: true, message: '请选择存放位置',trigger: 'blur' }] },
 });
 
 onMounted(async () => {
@@ -59,10 +68,9 @@ onMounted(async () => {
 const openDialog = (row: any) => {
 	state.ruleForm.configId = row.configId;
 	state.ruleForm.tableName = row.tableName;
-	//state.ruleForm.position = 'Admin.NET.Core';
-	if (state.ruleForm.position == undefined)
-		state.ruleForm.position = 'Admin.NET.Application';
 	state.isShowDialog = true;
+
+	ruleFormRef.value?.resetFields();
 };
 
 // 关闭弹窗

+ 7 - 3
Web/src/views/system/database/index.vue

@@ -63,8 +63,8 @@
 		<EditColumn ref="editColumnRef" @handleQueryColumn="handleQueryColumn" />
 		<AddTable ref="addTableRef" @addTableSubmitted="addTableSubmitted" />
 		<AddColumn ref="addColumnRef" @handleQueryColumn="handleQueryColumn" />
-		<GenEntity ref="genEntityRef" @handleQueryColumn="handleQueryColumn" />
-		<GenSeedData ref="genSeedDataRef" />
+		<GenEntity ref="genEntityRef" @handleQueryColumn="handleQueryColumn" :application-namespaces="state.appNamespaces" />
+		<GenSeedData ref="genSeedDataRef" :application-namespaces="state.appNamespaces" />
 	</div>
 </template>
 
@@ -79,7 +79,7 @@ import GenEntity from '/@/views/system/database/component/genEntity.vue';
 import GenSeedData from '/@/views/system/database/component/genSeedData.vue';
 
 import { getAPI } from '/@/utils/axios-utils';
-import { SysDatabaseApi } from '/@/api-services/api';
+import { SysDatabaseApi, SysCodeGenApi } from '/@/api-services/api';
 import { DbColumnOutput, DbTableInfo, DbColumnInput, DeleteDbTableInput, DeleteDbColumnInput } from '/@/api-services/models';
 
 const editTableRef = ref<InstanceType<typeof EditTable>>();
@@ -101,6 +101,7 @@ const state = reactive({
 		code: undefined,
 	},
 	editPosTitle: '',
+	appNamespaces: [] as Array<String>, // 存储位置
 });
 
 onMounted(async () => {
@@ -108,6 +109,9 @@ onMounted(async () => {
 	var res = await getAPI(SysDatabaseApi).apiSysDatabaseListGet();
 	state.dbData = res.data.result;
 	state.loading = false;
+
+	let appNamesRes = await getAPI(SysCodeGenApi).apiSysCodeGenApplicationNamespacesGet();
+	state.appNamespaces = appNamesRes.data.result as Array<string>;
 });
 
 // 增加表