Ver Fonte

调整自动生成实体、种子数据、代码时保存的位置

liteap há 2 anos atrás
pai
commit
b7979f1244

+ 2 - 2
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" ],
@@ -14,6 +14,6 @@
       //"BaseId": [ "Id" ]
     },
     "FrontRootPath": "Web", // 前端文件根目录
-    "BackendApplicationNamespace": "Admin.NET.Application" // 后端生成到的项目
+    "BackendApplicationNamespaces": [ "Admin.NET.Application", "Admin.NET.Application2" ] // 后端生成到的项目(如果有多个)
   }
 }

+ 7 - 1
Admin.NET/Admin.NET.Application/GlobalUsings.cs

@@ -16,4 +16,10 @@ global using SqlSugar;
 global using System;
 global using System.ComponentModel;
 global using System.ComponentModel.DataAnnotations;
-global using System.Threading.Tasks;
+global using System.Threading.Tasks;
+global using System.Collections.Generic;
+
+global using Admin.NET.Core;
+global using Furion.DependencyInjection;
+global using Furion.FriendlyException;
+global using SKIT.FlurlHttpClient.Wechat.Api.Events;

+ 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; }
 }

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

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

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

@@ -250,7 +250,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;

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

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

+ 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';
@@ -83,6 +84,49 @@ export const SysCodeGenApiAxiosParamCreator = function (configuration?: Configur
         },
         /**
          * 
+         * @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 根据表名获取列集合
          * @param {string} tableName 
          * @param {string} configId 
@@ -497,6 +541,19 @@ export const SysCodeGenApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
+         * @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 根据表名获取列集合
          * @param {string} tableName 
          * @param {string} configId 
@@ -628,6 +685,15 @@ export const SysCodeGenApiFactory = function (configuration?: Configuration, bas
         },
         /**
          * 
+         * @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 根据表名获取列集合
          * @param {string} tableName 
          * @param {string} configId 
@@ -729,6 +795,16 @@ export class SysCodeGenApi extends BaseAPI {
     }
     /**
      * 
+     * @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 根据表名获取列集合
      * @param {string} tableName 
      * @param {string} configId 

+ 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>;
 });
 
 // 增加表