代码生成可以选择模板

This commit is contained in:
轻风2016 2024-08-29 19:21:10 +08:00
parent cf9ae38e3b
commit 06988c6eb5
10 changed files with 405 additions and 169 deletions

View File

@ -128,4 +128,10 @@ public partial class SysCodeGen : EntityBase
/// </summary> /// </summary>
[SugarColumn(ColumnDescription = "是否使用 Api Service")] [SugarColumn(ColumnDescription = "是否使用 Api Service")]
public bool IsApiService { get; set; } = false; public bool IsApiService { get; set; } = false;
/// <summary>
/// 模板关系
/// </summary>
[Navigate(NavigateType.OneToMany, nameof(SysCodeGenTemplateRelation.CodeGenId))]//SysCodeGenTemplateRelation表中的CodeGenId
public List<SysCodeGenTemplateRelation> CodeGenTemplateRelations { get; set; }//注意禁止给CodeGenTemplateRelations手动赋值
} }

View File

@ -32,6 +32,12 @@ public partial class SysCodeGenTemplate : EntityBase
[SugarColumn(ColumnDescription = "是否是内置模板")] [SugarColumn(ColumnDescription = "是否是内置模板")]
public YesNoEnum SysFlag { get; set; } = YesNoEnum.Y; public YesNoEnum SysFlag { get; set; } = YesNoEnum.Y;
/// <summary>
/// 是否默认
/// </summary>
[SugarColumn(ColumnDescription = "是否默认")]
public bool? IsDefault { get; set; }
/// <summary> /// <summary>
/// 输出位置 /// 输出位置
/// </summary> /// </summary>

View File

@ -0,0 +1,29 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;
/// <summary>
/// 代码生成模板关系表
/// </summary>
[SugarTable(null, "代码生成模板关系表")]
[SysTable]
public partial class SysCodeGenTemplateRelation : EntityBaseId
{
/// <summary>
/// 代码生成Id
/// </summary>
[SugarColumn(ColumnDescription = "代码生成Id")]
[Required]
public long CodeGenId { get; set; }
/// <summary>
/// 模板Id
/// </summary>
[SugarColumn(ColumnDescription = "模板Id")]
[Required]
public long TemplateId { get; set; }
}

View File

@ -4,6 +4,8 @@
// //
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using Microsoft.AspNetCore.Server.IISIntegration;
namespace Admin.NET.Core; namespace Admin.NET.Core;
/// <summary> /// <summary>
@ -19,13 +21,13 @@ public class SysCodeGenTemplateSeedData : ISqlSugarEntitySeedData<SysCodeGenTemp
{ {
return new[] return new[]
{ {
new SysCodeGenTemplate{ Id=36036980201001, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_api.ts.vm", OutputFile="api/{PagePath}/{TableNameLower}.ts", Describe ="(WEB)接口"}, new SysCodeGenTemplate{ Id=36036980201001, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_api.ts.vm", OutputFile="api/{PagePath}/{TableNameLower}.ts", Describe ="(WEB)接口",IsDefault=true},
new SysCodeGenTemplate{ Id=36036980201002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_index.vue.vm", OutputFile="views/{PagePath}/{TableNameLower}/index.vue", Describe ="(WEB)列表页面"}, new SysCodeGenTemplate{ Id=36036980201002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_index.vue.vm", OutputFile="views/{PagePath}/{TableNameLower}/index.vue", Describe ="(WEB)列表页面",IsDefault=true},
new SysCodeGenTemplate{ Id=36036980201003, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_editDialog.vue.vm", OutputFile="views/{PagePath}/{TableNameLower}/component/editDialog.vue", Describe ="(WEB)编辑对话框"}, new SysCodeGenTemplate{ Id=36036980201003, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_editDialog.vue.vm", OutputFile="views/{PagePath}/{TableNameLower}/component/editDialog.vue", Describe ="(WEB)编辑对话框",IsDefault=true},
new SysCodeGenTemplate{ Id=36036980202001, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_Service.cs.vm", OutputFile="Service/{TableName}/{TableName}Service.cs", Describe ="(服务端)业务"}, new SysCodeGenTemplate{ Id=36036980202001, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_Service.cs.vm", OutputFile="Service/{TableName}/{TableName}Service.cs", Describe ="(服务端)业务",IsDefault=true},
new SysCodeGenTemplate{ Id=36036980202002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_InputDto.cs.vm", OutputFile="Service/{TableName}/Dto/{TableName}Input.cs", Describe ="(服务端)输入参数"}, new SysCodeGenTemplate{ Id=36036980202002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_InputDto.cs.vm", OutputFile="Service/{TableName}/Dto/{TableName}Input.cs", Describe ="(服务端)输入参数",IsDefault=true},
new SysCodeGenTemplate{ Id=36036980202003, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_OutputDto.cs.vm", OutputFile="Service/{TableName}/Dto/{TableName}Output.cs", Describe ="(服务端)输出参数"}, new SysCodeGenTemplate{ Id=36036980202003, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_OutputDto.cs.vm", OutputFile="Service/{TableName}/Dto/{TableName}Output.cs", Describe ="(服务端)输出参数",IsDefault=true},
}; };
} }
} }

View File

@ -172,6 +172,11 @@ public class AddCodeGenInput : PageCodeGenInput
/// 是否使用 Api Service /// 是否使用 Api Service
/// </summary> /// </summary>
public override bool IsApiService { get; set; } public override bool IsApiService { get; set; }
/// <summary>
/// 模板Id集合
/// </summary>
public List<long> CodeGenTemplateIds { get; set; }
} }
public class DeleteCodeGenInput public class DeleteCodeGenInput

View File

@ -42,6 +42,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
public async Task<SqlSugarPagedList<SysCodeGen>> Page(PageCodeGenInput input) public async Task<SqlSugarPagedList<SysCodeGen>> Page(PageCodeGenInput input)
{ {
return await _db.Queryable<SysCodeGen>() return await _db.Queryable<SysCodeGen>()
.Includes(u => u.CodeGenTemplateRelations)
.WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName!.Contains(input.TableName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName!.Contains(input.TableName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BusName), u => u.BusName!.Contains(input.BusName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.BusName), u => u.BusName!.Contains(input.BusName.Trim()))
.OrderBy(u => u.Id, OrderByType.Desc) .OrderBy(u => u.Id, OrderByType.Desc)
@ -62,12 +63,41 @@ public class SysCodeGenService : IDynamicApiController, ITransient
throw Oops.Oh(ErrorCodeEnum.D1400); throw Oops.Oh(ErrorCodeEnum.D1400);
var codeGen = input.Adapt<SysCodeGen>(); var codeGen = input.Adapt<SysCodeGen>();
var newCodeGen = await _db.Insertable(codeGen).ExecuteReturnEntityAsync(); long id = YitIdHelper.NextId();
var templateRelations = GetCodeGenTemplateRelation(id, input.CodeGenTemplateIds);
codeGen.Id = id;
codeGen.CodeGenTemplateRelations = templateRelations;
//var newCodeGen = await _db.Insertable(codeGen).ExecuteReturnEntityAsync();
var newCodeGen = await _db.InsertNav(codeGen)
.Include(t => t.CodeGenTemplateRelations)
.ExecuteReturnEntityAsync();
// 增加配置表 // 增加配置表
_codeGenConfigService.AddList(GetColumnList(input), newCodeGen); _codeGenConfigService.AddList(GetColumnList(input), newCodeGen);
} }
/// <summary>
/// 获取代码生成模板关系集合 🔖
/// </summary>
/// <param name="codeGenId"></param>
/// <param name="templateIds"></param>
/// <returns></returns>
private List<SysCodeGenTemplateRelation> GetCodeGenTemplateRelation(long codeGenId, List<long> templateIds)
{
List<SysCodeGenTemplateRelation> list = new List<SysCodeGenTemplateRelation>();
foreach (var item in templateIds)
{
SysCodeGenTemplateRelation relation = new SysCodeGenTemplateRelation();
relation.CodeGenId = codeGenId;
relation.TemplateId = item;
list.Add(relation);
}
return list;
}
/// <summary> /// <summary>
/// 更新代码生成 🔖 /// 更新代码生成 🔖
/// </summary> /// </summary>
@ -82,7 +112,12 @@ public class SysCodeGenService : IDynamicApiController, ITransient
throw Oops.Oh(ErrorCodeEnum.D1400); throw Oops.Oh(ErrorCodeEnum.D1400);
var codeGen = input.Adapt<SysCodeGen>(); var codeGen = input.Adapt<SysCodeGen>();
await _db.Updateable(codeGen).ExecuteCommandAsync(); var templateRelations = GetCodeGenTemplateRelation(codeGen.Id, input.CodeGenTemplateIds);
codeGen.CodeGenTemplateRelations = templateRelations;
//await _db.Updateable(codeGen).ExecuteCommandAsync();
await _db.UpdateNav(codeGen)
.Include(t => t.CodeGenTemplateRelations)
.ExecuteCommandAsync();
// 更新配置表 // 更新配置表
_codeGenConfigService.AddList(GetColumnList(input.Adapt<AddCodeGenInput>()), codeGen); _codeGenConfigService.AddList(GetColumnList(input.Adapt<AddCodeGenInput>()), codeGen);
@ -102,7 +137,10 @@ public class SysCodeGenService : IDynamicApiController, ITransient
var codeGenConfigTaskList = new List<Task>(); var codeGenConfigTaskList = new List<Task>();
inputs.ForEach(u => inputs.ForEach(u =>
{ {
_db.Deleteable<SysCodeGen>().In(u.Id).ExecuteCommand(); //_db.Deleteable<SysCodeGen>().In(u.Id).ExecuteCommand();
_db.DeleteNav<SysCodeGen>(t=>t.Id==u.Id)
.Include(t => t.CodeGenTemplateRelations)
.ExecuteCommand();
// 删除配置表 // 删除配置表
codeGenConfigTaskList.Add(_codeGenConfigService.DeleteCodeGenConfig(u.Id)); codeGenConfigTaskList.Add(_codeGenConfigService.DeleteCodeGenConfig(u.Id));
@ -775,22 +813,26 @@ public class SysCodeGenService : IDynamicApiController, ITransient
/// <returns></returns> /// <returns></returns>
private List<SysCodeGenTemplate> GetTemplateList(SysCodeGen input) private List<SysCodeGenTemplate> GetTemplateList(SysCodeGen input)
{ {
//var codeGen= _codeGenRep.AsQueryable()
//TODO: 只获取选中的模板 //TODO: 只获取选中的模板
if (input.GenerateType!.Substring(1, 1).Contains('1')) if (input.GenerateType!.Substring(1, 1).Contains('1'))
{ {
return _codeGetTemplateRep.AsQueryable() return _codeGetTemplateRep.AsQueryable()
.Where(u => u.Type == CodeGenTypeEnum.Frontend) .Where(u => u.Type == CodeGenTypeEnum.Frontend)
.Where(u => u.Id == SqlFunc.Subqueryable<SysCodeGenTemplateRelation>().Where(s => s.CodeGenId == input.Id).GroupBy(s => s.TemplateId).Select(s => s.TemplateId))
.ToList(); .ToList();
} }
else if (input.GenerateType.Substring(1, 1).Contains('2')) else if (input.GenerateType.Substring(1, 1).Contains('2'))
{ {
return _codeGetTemplateRep.AsQueryable() return _codeGetTemplateRep.AsQueryable()
.Where(u => u.Type == CodeGenTypeEnum.Backend) .Where(u => u.Type == CodeGenTypeEnum.Backend)
.Where(u => u.Id == SqlFunc.Subqueryable<SysCodeGenTemplateRelation>().Where(s => s.CodeGenId == input.Id).GroupBy(s => s.TemplateId).Select(s => s.TemplateId))
.ToList(); .ToList();
} }
else else
{ {
return _codeGetTemplateRep.AsQueryable() return _codeGetTemplateRep.AsQueryable()
.Where(u => u.Id == SqlFunc.Subqueryable<SysCodeGenTemplateRelation>().Where(s => s.CodeGenId == input.Id).GroupBy(s => s.TemplateId).Select(s => s.TemplateId))
.ToList(); .ToList();
} }
} }

View File

@ -0,0 +1,31 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
/// <summary>
/// 代码生成模板配置服务 🧩
/// </summary>
[ApiDescriptionSettings(Order = 260)]
public class SysCodeGenTemplateService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<SysCodeGenTemplate> _codeGenTemplateRep;
public SysCodeGenTemplateService(SqlSugarRepository<SysCodeGenTemplate> codeGenTemplateRep)
{
_codeGenTemplateRep = codeGenTemplateRep;
}
/// <summary>
/// 获取代码生成模板配置列表
/// </summary>
/// <returns></returns>
[ApiDescriptionSettings(Name = "list", Description = "获取代码生成模板配置列表", Order = 950), HttpGet]
[DisplayName("获取代码生成模板配置列表")]
public async Task<List<SysCodeGenTemplate>> List()
{
return await _codeGenTemplateRep.AsQueryable().Select<SysCodeGenTemplate>().ToListAsync();
}
}

View File

@ -249,4 +249,12 @@ export interface UpdateCodeGenInput {
* @memberof UpdateCodeGenInput * @memberof UpdateCodeGenInput
*/ */
id: number; id: number;
/**
*
*
* @type {any[]}
* @memberof UpdateCodeGenInput
*/
codeGenTemplateRelations:any[];
} }

View File

@ -0,0 +1,14 @@
import request from '/@/utils/request';
enum Api {
ListSysCodeGenTemplate = '/api/sysCodeGenTemplate/list',
}
// 获取代码生成模板配置列表
export const listSysCodeGenTemplate = (params?: any) =>
request({
url: Api.ListSysCodeGenTemplate,
method: 'get',
data: params,
});

View File

@ -3,10 +3,13 @@
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="700px"> <el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="700px">
<template #header> <template #header>
<div style="color: #fff"> <div style="color: #fff">
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon> <el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit />
</el-icon>
<span> {{ props.title }} </span> <span> {{ props.title }} </span>
</div> </div>
</template> </template>
<el-tabs v-model="activeTab" class="demo-tabs">
<el-tab-pane label="代码生成" name="codeGen">
<div style="color: red; padding: 10px 10px; background: #faecd8; margin-bottom: 10px"> <div style="color: red; padding: 10px 10px; background: #faecd8; margin-bottom: 10px">
<el-icon style="transform: translateY(2px)"><ele-Bell /></el-icon> <el-icon style="transform: translateY(2px)"><ele-Bell /></el-icon>
<span> 如果是在前端生成的实体/在生成表选择项里面找不到请重启后台服务后再进行代码生成 </span> <span> 如果是在前端生成的实体/在生成表选择项里面找不到请重启后台服务后再进行代码生成 </span>
@ -15,14 +18,18 @@
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="库定位器" prop="configId"> <el-form-item label="库定位器" prop="configId">
<el-select v-model="state.ruleForm.configId" placeholder="库名" filterable @change="dbChanged()" class="w100"> <el-select v-model="state.ruleForm.configId" placeholder="库名" filterable
<el-option v-for="item in state.dbData" :key="item.configId" :label="item.configId" :value="item.configId" /> @change="dbChanged()" class="w100">
<el-option v-for="item in state.dbData" :key="item.configId"
:label="item.configId" :value="item.configId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <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-form-item label="库类型" prop="dbType"
<el-select v-model="state.ruleForm.dbType" placeholder="数据库类型" filterable clearable disabled class="w100"> :rules="[{ required: true, message: '描述不能为空', trigger: 'blur' }]">
<el-select v-model="state.ruleForm.dbType" placeholder="数据库类型" filterable clearable
disabled class="w100">
<el-option label="MySql" :value="'0'" /> <el-option label="MySql" :value="'0'" />
<el-option label="SqlServer" :value="'1'" /> <el-option label="SqlServer" :value="'1'" />
<el-option label="Sqlite" :value="'2'" /> <el-option label="Sqlite" :value="'2'" />
@ -53,21 +60,28 @@
</el-col> </el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="库地址" prop="connectionString"> <el-form-item label="库地址" prop="connectionString">
<el-input v-model="state.ruleForm.connectionString" disabled clearable type="textarea" /> <el-input v-model="state.ruleForm.connectionString" disabled clearable
type="textarea" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <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-form-item label="生成表" prop="tableName"
:rules="[{ required: true, message: '生成表不能为空', trigger: 'blur' }]">
<template v-slot:label> <template v-slot:label>
<div> <div>
生成表 生成表
<el-tooltip raw-content content="如果是在前端生成的实体/表(在生成表选择项里面找不到),请重启后台服务后再进行代码生成。" placement="top"> <el-tooltip raw-content
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon> content="如果是在前端生成的实体/表(在生成表选择项里面找不到),请重启后台服务后再进行代码生成。" placement="top">
<el-icon size="16"
style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon>
</el-tooltip> </el-tooltip>
</div> </div>
</template> </template>
<el-select v-model="state.ruleForm.tableName" @change="tableChanged" value-key="value" filterable clearable class="w100"> <el-select v-model="state.ruleForm.tableName" @change="tableChanged"
<el-option v-for="item in state.tableData" :key="item.entityName" :label="item.entityName + ' ( ' + item.tableName + ' ) [' + item.tableComment + ']'" :value="item" /> value-key="value" filterable clearable class="w100">
<el-option v-for="item in state.tableData" :key="item.entityName"
:label="item.entityName + ' ( ' + item.tableName + ' ) [' + item.tableComment + ']'"
:value="item" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -86,21 +100,16 @@
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="菜单图标" prop="menuIcon"> <el-form-item label="菜单图标" prop="menuIcon">
<IconSelector v-model="state.ruleForm.menuIcon" :size="getGlobalComponentSize" placeholder="菜单图标" type="all" /> <IconSelector v-model="state.ruleForm.menuIcon" :size="getGlobalComponentSize"
placeholder="菜单图标" type="all" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="父级菜单" prop="menuPid"> <el-form-item label="父级菜单" prop="menuPid">
<el-cascader <el-cascader :options="state.menuData"
:options="state.menuData"
:props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'title' }" :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'title' }"
placeholder="请选择上级菜单" placeholder="请选择上级菜单" :disabled="!state.ruleForm.generateMenu" clearable
:disabled="!state.ruleForm.generateMenu" class="w100" v-model="state.ruleForm.menuPid" @change="menuChange">
clearable
class="w100"
v-model="state.ruleForm.menuPid"
@change="menuChange"
>
<template #default="{ node, data }"> <template #default="{ node, data }">
<span>{{ data.title }}</span> <span>{{ data.title }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
@ -109,10 +118,13 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="命名空间" prop="nameSpace" :rules="[{ required: true, message: '请选择命名空间', trigger: 'blur' }]"> <el-form-item label="命名空间" prop="nameSpace"
:rules="[{ required: true, message: '请选择命名空间', trigger: 'blur' }]">
<!-- <el-input v-model="state.ruleForm.nameSpace" clearable placeholder="请输入" /> --> <!-- <el-input v-model="state.ruleForm.nameSpace" clearable placeholder="请输入" /> -->
<el-select v-model="state.ruleForm.nameSpace" filterable clearable class="w100" placeholder="命名空间"> <el-select v-model="state.ruleForm.nameSpace" filterable clearable class="w100"
<el-option v-for="(item, index) in props.applicationNamespaces" :key="index" :label="item" :value="item" /> placeholder="命名空间">
<el-option v-for="(item, index) in props.applicationNamespaces" :key="index"
:label="item" :value="item" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -129,7 +141,8 @@
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="生成方式" prop="generateType"> <el-form-item label="生成方式" prop="generateType">
<el-select v-model="state.ruleForm.generateType" filterable class="w100"> <el-select v-model="state.ruleForm.generateType" filterable class="w100">
<el-option v-for="item in state.codeGenTypeList" :key="item.value" :label="item.value" :value="item.code" /> <el-option v-for="item in state.codeGenTypeList" :key="item.value"
:label="item.value" :value="item.code" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -138,8 +151,11 @@
<template v-slot:label> <template v-slot:label>
<div> <div>
接口模式 接口模式
<el-tooltip raw-content content="API Service 模式是自动生成前端接口请求文件,推荐此模式。不使用则是指自定义前端接口请求。" placement="top"> <el-tooltip raw-content
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon> content="API Service 模式是自动生成前端接口请求文件,推荐此模式。不使用则是指自定义前端接口请求。"
placement="top">
<el-icon size="16"
style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon>
</el-tooltip> </el-tooltip>
</div> </div>
</template> </template>
@ -151,20 +167,34 @@
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="支持打印" prop="printType"> <el-form-item label="支持打印" prop="printType">
<el-select v-model="state.ruleForm.printType" filterable class="w100" @change="printTypeChanged"> <el-select v-model="state.ruleForm.printType" filterable class="w100"
<el-option v-for="item in state.printTypeList" :key="item.value" :label="item.value" :value="item.code" /> @change="printTypeChanged">
<el-option v-for="item in state.printTypeList" :key="item.value"
:label="item.value" :value="item.code" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.printType == 'custom'"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"
v-if="state.ruleForm.printType == 'custom'">
<el-form-item label="打印模版" prop="printName"> <el-form-item label="打印模版" prop="printName">
<el-select v-model="state.ruleForm.printName" filterable class="w100"> <el-select v-model="state.ruleForm.printName" filterable class="w100">
<el-option v-for="item in state.printList" :key="item.id" :label="item.name" :value="item.name" /> <el-option v-for="item in state.printList" :key="item.id" :label="item.name"
:value="item.name" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-tab-pane>
<el-tab-pane label="选择模板" name="template">
<el-table ref="templateTableRef" :data="templateTableData" @selection-change="handleSelectionChange"
style="width: 100%">
<el-table-column type="selection" width="55" />
<el-table-column property="name" label="模板文件名" width="200" />
<el-table-column property="describe" label="描述" show-overflow-tooltip />
</el-table>
</el-tab-pane>
</el-tabs>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
@ -176,14 +206,17 @@
</template> </template>
<script lang="ts" setup name="sysEditCodeGen"> <script lang="ts" setup name="sysEditCodeGen">
import { computed, onMounted, reactive, ref } from 'vue'; import { computed, onMounted, reactive, ref, nextTick } from 'vue';
import IconSelector from '/@/components/iconSelector/index.vue'; import IconSelector from '/@/components/iconSelector/index.vue';
import { ElMessage } from "element-plus";
import other from '/@/utils/other'; import other from '/@/utils/other';
import { getAPI } from '/@/utils/axios-utils'; import { getAPI } from '/@/utils/axios-utils';
import { SysCodeGenApi, SysDictDataApi, SysMenuApi, SysPrintApi } from '/@/api-services/api'; import { SysCodeGenApi, SysDictDataApi, SysMenuApi, SysPrintApi } from '/@/api-services/api';
import { UpdateCodeGenInput, AddCodeGenInput, SysMenu, SysPrint } from '/@/api-services/models'; import { UpdateCodeGenInput, AddCodeGenInput, SysMenu, SysPrint } from '/@/api-services/models';
import { listSysCodeGenTemplate } from "/@/api/system/sysCodeGenTemplate";
const props = defineProps({ const props = defineProps({
title: String, title: String,
applicationNamespaces: Array<String>, applicationNamespaces: Array<String>,
@ -201,6 +234,11 @@ const state = reactive({
printList: [] as Array<SysPrint>, printList: [] as Array<SysPrint>,
}); });
const activeTab = ref('codeGen');
const templateTableRef = ref();
const multipleSelection = ref([] as any)
const templateTableData = ref([] as any);
onMounted(async () => { onMounted(async () => {
var resDb = await getAPI(SysCodeGenApi).apiSysCodeGenDatabaseListGet(); var resDb = await getAPI(SysCodeGenApi).apiSysCodeGenDatabaseListGet();
state.dbData = resDb.data.result; state.dbData = resDb.data.result;
@ -222,6 +260,44 @@ onMounted(async () => {
//await dbChanged(); //await dbChanged();
}); });
//
const getSysCodeGenTemplateList = async () => {
let res = await listSysCodeGenTemplate();
let data = res.data.result ?? [];
templateTableData.value = data;
//
nextTick(() => {
let checkedRows = [] as any;
if (state.ruleForm.id) {
// console.log('state.ruleForm.codeGenTemplateRelations', state.ruleForm.codeGenTemplateRelations);
//
data.forEach((element: any) => {
if (element.isDefault && state.ruleForm.codeGenTemplateRelations.some((ele: any) => ele.templateId == element.id)) {
checkedRows.push(element);
templateTableRef.value.toggleRowSelection(element, true);
}
});
} else {
//
data.forEach((element: any) => {
if (element.isDefault) {
checkedRows.push(element);
templateTableRef.value.toggleRowSelection(element, true);
}
});
}
multipleSelection.value = checkedRows;
});
};
//
const handleSelectionChange = (val: any[]) => {
multipleSelection.value = val;
// console.log(val);
}
// db // db
const dbChanged = async () => { const dbChanged = async () => {
if (state.ruleForm.configId === '') return; if (state.ruleForm.configId === '') return;
@ -260,21 +336,38 @@ const openDialog = (row: any) => {
state.ruleForm = JSON.parse(JSON.stringify(row)); state.ruleForm = JSON.parse(JSON.stringify(row));
state.isShowDialog = true; state.isShowDialog = true;
ruleFormRef.value?.resetFields(); ruleFormRef.value?.resetFields();
getSysCodeGenTemplateList();
}; };
// //
const closeDialog = () => { const closeDialog = () => {
emits('handleQuery'); emits('handleQuery');
state.isShowDialog = false; state.isShowDialog = false;
activeTab.value = 'codeGen';
}; };
// //
const cancel = () => { const cancel = () => {
state.isShowDialog = false; state.isShowDialog = false;
activeTab.value = 'codeGen';
}; };
// //
const submit = () => { const submit = () => {
//
if (multipleSelection.value.length == 0) {
ElMessage({
message: `请选择模板`,
type: "error",
});
activeTab.value = 'template';
return;
};
let codeGenTemplateIds: any[] = [];
multipleSelection.value.forEach((item: any) => {
codeGenTemplateIds.push(item.id);
});
state.ruleForm.codeGenTemplateIds = codeGenTemplateIds;
ruleFormRef.value.validate(async (valid: boolean) => { ruleFormRef.value.validate(async (valid: boolean) => {
if (!valid) return; if (!valid) return;
if (state.ruleForm.id != undefined && state.ruleForm.id > 0) { if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {