diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs index e5a596fc..344e0b36 100644 --- a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs @@ -146,11 +146,18 @@ public class SysCodeGenService : IDynamicApiController, ITransient var dbTableNames = dbTableInfos.Select(u => u.Name.ToLower()).ToList(); IEnumerable entityInfos = await GetEntityInfos(); + entityInfos = entityInfos.OrderBy(u => u.EntityName.StartsWith("Sys")? 1 : 0).ThenBy(u => u.EntityName); var tableOutputList = new List(); foreach (var item in entityInfos) - { - var table = dbTableInfos.FirstOrDefault(u => u.Name.ToLower() == (config!.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName).ToLower()); + { + string dbTableName = item.DbTableName; + int bracketIndex = dbTableName.IndexOf('{'); + if (bracketIndex != -1) + { + dbTableName = dbTableName.Substring(0, bracketIndex); + } + var table = dbTableInfos.FirstOrDefault(x => x.Name.ToLower().StartsWith(config != null && config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(dbTableName) : dbTableName)); if (table == null) continue; tableOutputList.Add(new TableOutput { @@ -200,6 +207,16 @@ public class SysCodeGenService : IDynamicApiController, ITransient return null; var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId); var dbTableName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(entityType.DbTableName) : entityType.DbTableName; + + int bracketIndex = dbTableName.IndexOf('{'); + if (bracketIndex != -1) + { + dbTableName = dbTableName.Substring(0, bracketIndex); + var dbTableInfos = _db.AsTenant().GetConnectionScope(input.ConfigId).DbMaintenance.GetTableInfoList(false); + var table = dbTableInfos.FirstOrDefault(x => x.Name.ToLower().StartsWith(config != null && config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(dbTableName) : dbTableName)); + if (table != null) + dbTableName = table.Name; + } // 切库---多库代码生成用 var provider = _db.AsTenant().GetConnectionScope(!string.IsNullOrEmpty(input.ConfigId) ? input.ConfigId : SqlSugarConst.MainConfigId); @@ -369,7 +386,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient string targetFile = templateList[i].OutputFile .Replace("{TableName}", input.TableName) - .Replace("{TableNameLower}", input.TableName!.ToLower()); + .Replace("{TableNameLower}", ToFirstLetterLowerCase(input.TableName!)); string tmpPath; if (!input.GenerateType.StartsWith('1')) @@ -723,4 +740,21 @@ public class SysCodeGenService : IDynamicApiController, ITransient .ToList(); } } + + /// + /// 小驼峰命名法(camelCase):首字母小写 + /// + /// + /// + public static string ToFirstLetterLowerCase(string input) + { + // 检查字符串是否为空或空格 + if (string.IsNullOrWhiteSpace(input)) + { + return input; + } + + // 只转换首字母为小写 + return char.ToLower(input[0]) + input.Substring(1); + } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_api.ts.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_api.ts.vm index fd7d5b4f..50d4ea93 100644 --- a/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_api.ts.vm +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_api.ts.vm @@ -13,7 +13,7 @@ if(@column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.Quer @{definedObjects.Add("Get@(@column.FkEntityName)Tree", 1);} @:Get@(@column.FkEntityName)Tree = '/api/@(@Model.LowerClassName)/@(@column.FkEntityName)Tree', }else if(@column.EffectType == "Upload"){ - @:Upload@(@column.PropertyName) = '/api/@(@Model.LowerClassName)/Upload@(@column.PropertyName)', + @:Upload@(@column.PropertyName) = '/api/@(@Model.LowerClassName)/upload@(@column.PropertyName)', } } } @@ -29,64 +29,62 @@ export const add@(@Model.ClassName) = (params?: any) => // 删除@(@Model.BusName) export const delete@(@Model.ClassName) = (params?: any) => request({ - url: Api.Delete@(@Model.ClassName), - method: 'post', - data: params, - }); + 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, - }); + url: Api.Update@(@Model.ClassName), + method: 'post', + data: params, + }); // 分页查询@(@Model.BusName) export const page@(@Model.ClassName) = (params?: any) => request({ - url: Api.Page@(@Model.ClassName), - method: 'post', - data: params, - }); + url: Api.Page@(@Model.ClassName), + method: 'post', + data: params, + }); // 详情@(@Model.BusName) export const detail@(@Model.ClassName) = (id: any) => request({ - url: Api.Detail@(@Model.ClassName), - method: 'get', - data: { id }, - }); + url: Api.Detail@(@Model.ClassName), + method: 'get', + data: { id }, + }); @foreach (var column in Model.TableField){ if(@column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){ @:export const get@(@column.FkEntityName)@(@column.PropertyName)Dropdown = () => - @:request({ + @:request({ @:url: Api.Get@(@column.FkEntityName)@(@column.PropertyName)Dropdown, @:method: 'get' - @:}); - }else if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("get@(@column.FkEntityName)Tree")){ - @{definedObjects.Add("get@(@column.FkEntityName)Tree", 1);} + @:}); +}else if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("get@(@column.FkEntityName)Tree")){ +@{definedObjects.Add("get@(@column.FkEntityName)Tree", 1);} @:export const get@(@column.FkEntityName)Tree = () => - @:request({ + @:request({ @:url: Api.Get@(@column.FkEntityName)Tree, @:method: 'get' - @:}); - }else if(@column.EffectType == "Upload"){ + @:}); +}else if(@column.EffectType == "Upload"){ - @:/** - @:* 上传@(@column.ColumnComment) - @:*/ -@:export const upload@(@column.PropertyName) = (params: any) => - @:uploadFileHandle(params, Api.Upload@(@column.PropertyName)) - } +@:// 上传@(@column.ColumnComment) +@:export const upload@(@column.PropertyName) = (params: any) => uploadFileHandle(params, Api.Upload@(@column.PropertyName)) + } } @foreach (var column in Model.TableField){ - if(@column.EffectType == "Upload"){ - @:export const uploadFileHandle = (params: any, url: string) => { +if(@column.EffectType == "Upload"){ +@:export const uploadFileHandle = (params: any, url: string) => { @:const formData = new window.FormData(); @:formData.append('file', params.file); + @://自定义参数 @:if (params.data) { @:Object.keys(params.data).forEach((key) => { @@ -99,18 +97,18 @@ export const detail@(@Model.ClassName) = (id: any) => @:} @:formData.append(key, params.data![key]); @:}); - @:} - @:return request({ - @:url: url, - @:method: 'POST', - @:data: formData, - @:headers: { - @:'Content-type': 'multipart/form-data;charset=UTF-8', - @:// ts-ignore - @:ignoreCancelToken: true, +@:} +@:return request({ + @:url: url, + @:method: 'POST', + @:data: formData, + @:headers: { + @:'Content-type': 'multipart/form-data;charset=UTF-8', + @:// ts-ignore + @:ignoreCancelToken: true, @:}, @:}); @:}; - break; - } + break; + } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_editDialog.vue.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_editDialog.vue.vm index 2d36b5cd..5717e7b3 100644 --- a/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_editDialog.vue.vm +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_editDialog.vue.vm @@ -158,7 +158,7 @@ import type { FormRules } from "element-plus"; if(@Model.TableField.Any(x=>x.EffectType == "Upload")){ @:import { Plus } from "@@element-plus/icons-vue"; @:import { UploadRequestOptions } from "element-plus"; -@:import {@string.Join(",",Model.TableField.Where(x=>x.EffectType == "Upload").Select(x=>"upload"+x.PropertyName).ToList())} from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)'; +@:import { @string.Join(",",Model.TableField.Where(x=>x.EffectType == "Upload").Select(x=>"upload"+x.PropertyName).ToList()) } from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)'; } foreach (var column in Model.QueryWhetherList){ if(@column.EffectType == "fk"){ @@ -166,7 +166,6 @@ if(@column.EffectType == "fk"){ } } } - @if(@Model.TableField.Any(x=>x.EffectType == "ConstSelector")){ @:import { getConstType } from "/@@/utils/constHelper"; } @@ -179,10 +178,6 @@ if(@column.EffectType == "fk"){ @if(@Model.TableField.Any(x=>x.EffectType == "DatePicker")){ @:import { formatDate } from '/@@/utils/formatTime'; } -@if(@Model.TableField.Any(x=>x.EffectType == "Upload")){ -@:import { Plus } from "@@element-plus/icons-vue"; -@:import { UploadRequestOptions } from "element-plus"; -} @foreach (var column in Model.TableField){ if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("import__@(@column.FkEntityName)Tree")){ @{definedObjects.Add("import__@(@column.FkEntityName)Tree", 1);} @@ -195,35 +190,35 @@ if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("import_ //父级传递来的参数 var props = defineProps({ title: { - type: String, - default: "", -}, + type: String, + default: "", + }, }); //父级传递来的函数,用于回调 const emit = defineEmits(["reloadTable"]); const ruleFormRef = ref(); const state = reactive({ -isShowDialog: false, -@if (@Model.IsApiService) { -@:ruleForm: {} as Update@(@Model.ClassName)Input, -} -else -{ -@:ruleForm: {}, -} + isShowDialog: false, + @if (@Model.IsApiService) { + @:ruleForm: {} as Update@(@Model.ClassName)Input, + } + else + { + @:ruleForm: {}, + } }); //自行添加其他规则 const rules = ref({ -@foreach (var column in Model.TableField){ -if(@column.WhetherRequired == "Y"){ -if(@column.EffectType == "Input" || @column.EffectType == "InputNumber" ||@column.EffectType == "InputTextArea"){ -@:@column.LowerPropertyName: [{required: true, message: '请输入@(@column.ColumnComment)!', trigger: 'blur',},], -}else if(@column.EffectType == "DatePicker" || @column.EffectType == "Select" ||@column.EffectType == "ApiTreeSelect"){ -@:@column.LowerPropertyName: [{required: true, message: '请选择@(@column.ColumnComment)!', trigger: 'change',},], -} -} -} + @foreach (var column in Model.TableField){ + if(@column.WhetherRequired == "Y"){ + if(@column.EffectType == "Input" || @column.EffectType == "InputNumber" ||@column.EffectType == "InputTextArea"){ + @:@column.LowerPropertyName: [{required: true, message: '请输入@(@column.ColumnComment)!', trigger: 'blur',},], + }else if(@column.EffectType == "DatePicker" || @column.EffectType == "Select" ||@column.EffectType == "ApiTreeSelect"){ + @:@column.LowerPropertyName: [{required: true, message: '请选择@(@column.ColumnComment)!', trigger: 'change',},], + } + } + } }); // 页面加载时 @@ -232,17 +227,17 @@ onMounted(() => { // 打开弹窗 const openDialog = async (row: any) => { -// state.ruleForm = JSON.parse(JSON.stringify(row)); -// 改用detail获取最新数据来编辑 -let rowData = JSON.parse(JSON.stringify(row)); -if (rowData.id) - @if (@Model.IsApiService) { - @:state.ruleForm = (await getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)DetailGet(rowData.id)).data.result; - } else { - @:state.ruleForm = (await detail@(@Model.ClassName)(rowData.id)).data.result; - } -else - state.ruleForm = rowData; + // state.ruleForm = JSON.parse(JSON.stringify(row)); + // 改用detail获取最新数据来编辑 + let rowData = JSON.parse(JSON.stringify(row)); + if (rowData.id) + @if (@Model.IsApiService) { + @:state.ruleForm = (await getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)DetailGet(rowData.id)).data.result; + } else { + @:state.ruleForm = (await detail@(@Model.ClassName)(rowData.id)).data.result; + } + else + state.ruleForm = rowData; state.isShowDialog = true; }; @@ -328,9 +323,9 @@ if(column.WhetherAddUpdate=="N") continue; if(@column.EffectType == "Upload"){ @:const upload@(@column.PropertyName)Handle = async (options: UploadRequestOptions) => { @if (@Model.IsApiService) { - @:let list = await getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)Upload@(@column.FkEntityName)PostForm(options); + @:let res = await getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)Upload@(@column.FkEntityName)PostForm(options); } else { - @:let list = await upload@(@column.PropertyName)(options); + @:let res = await upload@(@column.PropertyName)(options); } @:state.ruleForm.@(column.LowerPropertyName) = res.data.result?.url; @:}; diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_listDialog.vue.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_listDialog.vue.vm deleted file mode 100644 index 1e8acf74..00000000 --- a/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_listDialog.vue.vm +++ /dev/null @@ -1,465 +0,0 @@ -@{ - string LowerFirstLetter(string text) - { - return text.ToString()[..1].ToLower() + text[1..]; // 首字母小写 - } - var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault(); - string pkFieldName = null; - if(pkField != null && !string.IsNullOrEmpty(pkField.PropertyName)) - { - pkFieldName = LowerFirstLetter(pkField.PropertyName); - } - Dictionary definedObjects = new Dictionary(); - bool haveLikeCdt = false; - foreach (var column in Model.TableField){ - if (column.QueryWhether == "Y" && column.QueryType == "like"){ - haveLikeCdt = true; - } - } -} - - - - -