Merge pull request 'main' (#111) from 616036448/Admin.NET.Pro:main into main
Reviewed-on: http://101.43.53.74:3000/Admin.NET/Admin.NET.Pro/pulls/111
This commit is contained in:
commit
ee85cef0a0
@ -128,4 +128,10 @@ public partial class SysCodeGen : EntityBase
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "是否使用 Api Service")]
|
||||
public bool IsApiService { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 模板关系
|
||||
/// </summary>
|
||||
[Navigate(NavigateType.OneToMany, nameof(SysCodeGenTemplateRelation.CodeGenId))]//SysCodeGenTemplateRelation表中的CodeGenId
|
||||
public List<SysCodeGenTemplateRelation> CodeGenTemplateRelations { get; set; }//注意禁止给CodeGenTemplateRelations手动赋值
|
||||
}
|
||||
@ -32,6 +32,12 @@ public partial class SysCodeGenTemplate : EntityBase
|
||||
[SugarColumn(ColumnDescription = "是否是内置模板")]
|
||||
public YesNoEnum SysFlag { get; set; } = YesNoEnum.Y;
|
||||
|
||||
/// <summary>
|
||||
/// 是否默认
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "是否默认")]
|
||||
public bool? IsDefault { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 输出位置
|
||||
/// </summary>
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
@ -4,6 +4,8 @@
|
||||
//
|
||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||
|
||||
using Microsoft.AspNetCore.Server.IISIntegration;
|
||||
|
||||
namespace Admin.NET.Core;
|
||||
|
||||
/// <summary>
|
||||
@ -19,13 +21,13 @@ public class SysCodeGenTemplateSeedData : ISqlSugarEntitySeedData<SysCodeGenTemp
|
||||
{
|
||||
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=36036980201002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_index.vue.vm", OutputFile="views/{PagePath}/{TableNameLower}/index.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)编辑对话框"},
|
||||
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)列表页面",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)编辑对话框",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=36036980202002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Backend, Name="service_InputDto.cs.vm", OutputFile="Service/{TableName}/Dto/{TableName}Input.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 ="(服务端)输出参数"},
|
||||
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 ="(服务端)输入参数",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 ="(服务端)输出参数",IsDefault=true},
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -172,6 +172,11 @@ public class AddCodeGenInput : PageCodeGenInput
|
||||
/// 是否使用 Api Service
|
||||
/// </summary>
|
||||
public override bool IsApiService { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 模板Id集合
|
||||
/// </summary>
|
||||
public List<long> CodeGenTemplateIds { get; set; }
|
||||
}
|
||||
|
||||
public class DeleteCodeGenInput
|
||||
|
||||
@ -42,6 +42,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
|
||||
public async Task<SqlSugarPagedList<SysCodeGen>> Page(PageCodeGenInput input)
|
||||
{
|
||||
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.BusName), u => u.BusName!.Contains(input.BusName.Trim()))
|
||||
.OrderBy(u => u.Id, OrderByType.Desc)
|
||||
@ -62,12 +63,41 @@ public class SysCodeGenService : IDynamicApiController, ITransient
|
||||
throw Oops.Oh(ErrorCodeEnum.D1400);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/// <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>
|
||||
@ -82,7 +112,12 @@ public class SysCodeGenService : IDynamicApiController, ITransient
|
||||
throw Oops.Oh(ErrorCodeEnum.D1400);
|
||||
|
||||
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);
|
||||
@ -102,7 +137,10 @@ public class SysCodeGenService : IDynamicApiController, ITransient
|
||||
var codeGenConfigTaskList = new List<Task>();
|
||||
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));
|
||||
@ -775,22 +813,26 @@ public class SysCodeGenService : IDynamicApiController, ITransient
|
||||
/// <returns></returns>
|
||||
private List<SysCodeGenTemplate> GetTemplateList(SysCodeGen input)
|
||||
{
|
||||
//var codeGen= _codeGenRep.AsQueryable()
|
||||
//TODO: 只获取选中的模板
|
||||
if (input.GenerateType!.Substring(1, 1).Contains('1'))
|
||||
{
|
||||
return _codeGetTemplateRep.AsQueryable()
|
||||
.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();
|
||||
}
|
||||
else if (input.GenerateType.Substring(1, 1).Contains('2'))
|
||||
{
|
||||
return _codeGetTemplateRep.AsQueryable()
|
||||
.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();
|
||||
}
|
||||
else
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -249,4 +249,12 @@ export interface UpdateCodeGenInput {
|
||||
* @memberof UpdateCodeGenInput
|
||||
*/
|
||||
id: number;
|
||||
|
||||
/**
|
||||
* 模板关系
|
||||
*
|
||||
* @type {any[]}
|
||||
* @memberof UpdateCodeGenInput
|
||||
*/
|
||||
codeGenTemplateRelations:any[];
|
||||
}
|
||||
|
||||
14
Web/src/api/system/sysCodeGenTemplate.ts
Normal file
14
Web/src/api/system/sysCodeGenTemplate.ts
Normal 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,
|
||||
});
|
||||
|
||||
|
||||
@ -3,168 +3,198 @@
|
||||
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="700px">
|
||||
<template #header>
|
||||
<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>
|
||||
</div>
|
||||
</template>
|
||||
<div style="color: red; padding: 10px 10px; background: #faecd8; margin-bottom: 10px">
|
||||
<el-icon style="transform: translateY(2px)"><ele-Bell /></el-icon>
|
||||
<span> 如果是在前端生成的实体/表(在生成表选择项里面找不到),请重启后台服务后再进行代码生成。 </span>
|
||||
</div>
|
||||
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
|
||||
<el-row :gutter="10">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="库定位器" prop="configId">
|
||||
<el-select v-model="state.ruleForm.configId" placeholder="库名" filterable @change="dbChanged()" class="w100">
|
||||
<el-option v-for="item in state.dbData" :key="item.configId" :label="item.configId" :value="item.configId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="库类型" prop="dbType" :rules="[{ required: true, message: '描述不能为空', trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.dbType" placeholder="数据库类型" filterable clearable disabled class="w100">
|
||||
<el-option label="MySql" :value="'0'" />
|
||||
<el-option label="SqlServer" :value="'1'" />
|
||||
<el-option label="Sqlite" :value="'2'" />
|
||||
<el-option label="Oracle" :value="'3'" />
|
||||
<el-option label="PostgreSQL" :value="'4'" />
|
||||
<el-option label="Dm" :value="'5'" />
|
||||
<el-option label="Kdbndp" :value="'6'" />
|
||||
<el-option label="Oscar" :value="'7'" />
|
||||
<el-option label="MySqlConnector" :value="'8'" />
|
||||
<el-option label="Access" :value="'9'" />
|
||||
<el-option label="OpenGauss" :value="'10'" />
|
||||
<el-option label="QuestDB" :value="'11'" />
|
||||
<el-option label="HG" :value="'12'" />
|
||||
<el-option label="ClickHouse" :value="'13'" />
|
||||
<el-option label="GBase" :value="'14'" />
|
||||
<el-option label="Odbc" :value="'15'" />
|
||||
<el-option label="OceanBaseForOracle" :value="'16'" />
|
||||
<el-option label="TDengine" :value="'17'" />
|
||||
<el-option label="GaussDB" :value="'18'" />
|
||||
<el-option label="OceanBase" :value="'19'" />
|
||||
<el-option label="Tidb" :value="'20'" />
|
||||
<el-option label="Vastbase" :value="'21'" />
|
||||
<el-option label="PolarDB" :value="'22'" />
|
||||
<el-option label="Doris" :value="'23'" />
|
||||
<el-option label="Custom" :value="'900'" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="库地址" prop="connectionString">
|
||||
<el-input v-model="state.ruleForm.connectionString" disabled clearable type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="生成表" prop="tableName" :rules="[{ required: true, message: '生成表不能为空', trigger: 'blur' }]">
|
||||
<template v-slot:label>
|
||||
<div>
|
||||
生成表
|
||||
<el-tooltip raw-content content="如果是在前端生成的实体/表(在生成表选择项里面找不到),请重启后台服务后再进行代码生成。" placement="top">
|
||||
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-select v-model="state.ruleForm.tableName" @change="tableChanged" 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-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="业务名" prop="busName">
|
||||
<el-input v-model="state.ruleForm.busName" placeholder="请输入" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="生成菜单" prop="generateMenu">
|
||||
<el-radio-group v-model="state.ruleForm.generateMenu">
|
||||
<el-radio :value="true">是</el-radio>
|
||||
<el-radio :value="false">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="菜单图标" prop="menuIcon">
|
||||
<IconSelector v-model="state.ruleForm.menuIcon" :size="getGlobalComponentSize" placeholder="菜单图标" type="all" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="父级菜单" prop="menuPid">
|
||||
<el-cascader
|
||||
:options="state.menuData"
|
||||
:props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'title' }"
|
||||
placeholder="请选择上级菜单"
|
||||
:disabled="!state.ruleForm.generateMenu"
|
||||
clearable
|
||||
class="w100"
|
||||
v-model="state.ruleForm.menuPid"
|
||||
@change="menuChange"
|
||||
>
|
||||
<template #default="{ node, data }">
|
||||
<span>{{ data.title }}</span>
|
||||
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
||||
</template>
|
||||
</el-cascader>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="命名空间" prop="nameSpace" :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">
|
||||
<el-form-item label="前端目录" prop="pagePath">
|
||||
<el-input v-model="state.ruleForm.pagePath" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="作者姓名" prop="authorName">
|
||||
<el-input v-model="state.ruleForm.authorName" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="生成方式" prop="generateType">
|
||||
<el-select v-model="state.ruleForm.generateType" filterable class="w100">
|
||||
<el-option v-for="item in state.codeGenTypeList" :key="item.value" :label="item.value" :value="item.code" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="接口模式" prop="isApiService">
|
||||
<template v-slot:label>
|
||||
<div>
|
||||
接口模式
|
||||
<el-tooltip raw-content content="API Service 模式是自动生成前端接口请求文件,推荐此模式。不使用则是指自定义前端接口请求。" placement="top">
|
||||
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-radio-group v-model="state.ruleForm.isApiService">
|
||||
<el-radio :value="true">使用API Service</el-radio>
|
||||
<el-radio :value="false">不使用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="支持打印" prop="printType">
|
||||
<el-select v-model="state.ruleForm.printType" filterable class="w100" @change="printTypeChanged">
|
||||
<el-option v-for="item in state.printTypeList" :key="item.value" :label="item.value" :value="item.code" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<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-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-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<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">
|
||||
<el-icon style="transform: translateY(2px)"><ele-Bell /></el-icon>
|
||||
<span> 如果是在前端生成的实体/表(在生成表选择项里面找不到),请重启后台服务后再进行代码生成。 </span>
|
||||
</div>
|
||||
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
|
||||
<el-row :gutter="10">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="库定位器" prop="configId">
|
||||
<el-select v-model="state.ruleForm.configId" placeholder="库名" filterable
|
||||
@change="dbChanged()" class="w100">
|
||||
<el-option v-for="item in state.dbData" :key="item.configId"
|
||||
:label="item.configId" :value="item.configId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="库类型" prop="dbType"
|
||||
:rules="[{ required: true, message: '描述不能为空', trigger: 'blur' }]">
|
||||
<el-select v-model="state.ruleForm.dbType" placeholder="数据库类型" filterable clearable
|
||||
disabled class="w100">
|
||||
<el-option label="MySql" :value="'0'" />
|
||||
<el-option label="SqlServer" :value="'1'" />
|
||||
<el-option label="Sqlite" :value="'2'" />
|
||||
<el-option label="Oracle" :value="'3'" />
|
||||
<el-option label="PostgreSQL" :value="'4'" />
|
||||
<el-option label="Dm" :value="'5'" />
|
||||
<el-option label="Kdbndp" :value="'6'" />
|
||||
<el-option label="Oscar" :value="'7'" />
|
||||
<el-option label="MySqlConnector" :value="'8'" />
|
||||
<el-option label="Access" :value="'9'" />
|
||||
<el-option label="OpenGauss" :value="'10'" />
|
||||
<el-option label="QuestDB" :value="'11'" />
|
||||
<el-option label="HG" :value="'12'" />
|
||||
<el-option label="ClickHouse" :value="'13'" />
|
||||
<el-option label="GBase" :value="'14'" />
|
||||
<el-option label="Odbc" :value="'15'" />
|
||||
<el-option label="OceanBaseForOracle" :value="'16'" />
|
||||
<el-option label="TDengine" :value="'17'" />
|
||||
<el-option label="GaussDB" :value="'18'" />
|
||||
<el-option label="OceanBase" :value="'19'" />
|
||||
<el-option label="Tidb" :value="'20'" />
|
||||
<el-option label="Vastbase" :value="'21'" />
|
||||
<el-option label="PolarDB" :value="'22'" />
|
||||
<el-option label="Doris" :value="'23'" />
|
||||
<el-option label="Custom" :value="'900'" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
|
||||
<el-form-item label="库地址" prop="connectionString">
|
||||
<el-input v-model="state.ruleForm.connectionString" disabled clearable
|
||||
type="textarea" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="生成表" prop="tableName"
|
||||
:rules="[{ required: true, message: '生成表不能为空', trigger: 'blur' }]">
|
||||
<template v-slot:label>
|
||||
<div>
|
||||
生成表
|
||||
<el-tooltip raw-content
|
||||
content="如果是在前端生成的实体/表(在生成表选择项里面找不到),请重启后台服务后再进行代码生成。" placement="top">
|
||||
<el-icon size="16"
|
||||
style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-select v-model="state.ruleForm.tableName" @change="tableChanged"
|
||||
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-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="业务名" prop="busName">
|
||||
<el-input v-model="state.ruleForm.busName" placeholder="请输入" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="生成菜单" prop="generateMenu">
|
||||
<el-radio-group v-model="state.ruleForm.generateMenu">
|
||||
<el-radio :value="true">是</el-radio>
|
||||
<el-radio :value="false">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="菜单图标" prop="menuIcon">
|
||||
<IconSelector v-model="state.ruleForm.menuIcon" :size="getGlobalComponentSize"
|
||||
placeholder="菜单图标" type="all" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="父级菜单" prop="menuPid">
|
||||
<el-cascader :options="state.menuData"
|
||||
:props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'title' }"
|
||||
placeholder="请选择上级菜单" :disabled="!state.ruleForm.generateMenu" clearable
|
||||
class="w100" v-model="state.ruleForm.menuPid" @change="menuChange">
|
||||
<template #default="{ node, data }">
|
||||
<span>{{ data.title }}</span>
|
||||
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
||||
</template>
|
||||
</el-cascader>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="命名空间" prop="nameSpace"
|
||||
: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">
|
||||
<el-form-item label="前端目录" prop="pagePath">
|
||||
<el-input v-model="state.ruleForm.pagePath" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="作者姓名" prop="authorName">
|
||||
<el-input v-model="state.ruleForm.authorName" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="生成方式" prop="generateType">
|
||||
<el-select v-model="state.ruleForm.generateType" filterable class="w100">
|
||||
<el-option v-for="item in state.codeGenTypeList" :key="item.value"
|
||||
:label="item.value" :value="item.code" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="接口模式" prop="isApiService">
|
||||
<template v-slot:label>
|
||||
<div>
|
||||
接口模式
|
||||
<el-tooltip raw-content
|
||||
content="API Service 模式是自动生成前端接口请求文件,推荐此模式。不使用则是指自定义前端接口请求。"
|
||||
placement="top">
|
||||
<el-icon size="16"
|
||||
style="margin-right: 3px; display: inline; vertical-align: middle"><ele-QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</template>
|
||||
<el-radio-group v-model="state.ruleForm.isApiService">
|
||||
<el-radio :value="true">使用API Service</el-radio>
|
||||
<el-radio :value="false">不使用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
|
||||
<el-form-item label="支持打印" prop="printType">
|
||||
<el-select v-model="state.ruleForm.printType" filterable class="w100"
|
||||
@change="printTypeChanged">
|
||||
<el-option v-for="item in state.printTypeList" :key="item.value"
|
||||
:label="item.value" :value="item.code" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<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-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-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</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>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
@ -176,14 +206,17 @@
|
||||
</template>
|
||||
|
||||
<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 { ElMessage } from "element-plus";
|
||||
import other from '/@/utils/other';
|
||||
|
||||
import { getAPI } from '/@/utils/axios-utils';
|
||||
import { SysCodeGenApi, SysDictDataApi, SysMenuApi, SysPrintApi } from '/@/api-services/api';
|
||||
import { UpdateCodeGenInput, AddCodeGenInput, SysMenu, SysPrint } from '/@/api-services/models';
|
||||
|
||||
import { listSysCodeGenTemplate } from "/@/api/system/sysCodeGenTemplate";
|
||||
|
||||
const props = defineProps({
|
||||
title: String,
|
||||
applicationNamespaces: Array<String>,
|
||||
@ -201,6 +234,11 @@ const state = reactive({
|
||||
printList: [] as Array<SysPrint>,
|
||||
});
|
||||
|
||||
const activeTab = ref('codeGen');
|
||||
const templateTableRef = ref();
|
||||
const multipleSelection = ref([] as any)
|
||||
const templateTableData = ref([] as any);
|
||||
|
||||
onMounted(async () => {
|
||||
var resDb = await getAPI(SysCodeGenApi).apiSysCodeGenDatabaseListGet();
|
||||
state.dbData = resDb.data.result;
|
||||
@ -222,6 +260,44 @@ onMounted(async () => {
|
||||
//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改变
|
||||
const dbChanged = async () => {
|
||||
if (state.ruleForm.configId === '') return;
|
||||
@ -260,21 +336,38 @@ const openDialog = (row: any) => {
|
||||
state.ruleForm = JSON.parse(JSON.stringify(row));
|
||||
state.isShowDialog = true;
|
||||
ruleFormRef.value?.resetFields();
|
||||
getSysCodeGenTemplateList();
|
||||
};
|
||||
|
||||
// 关闭弹窗
|
||||
const closeDialog = () => {
|
||||
emits('handleQuery');
|
||||
state.isShowDialog = false;
|
||||
activeTab.value = 'codeGen';
|
||||
};
|
||||
|
||||
// 取消
|
||||
const cancel = () => {
|
||||
state.isShowDialog = false;
|
||||
activeTab.value = 'codeGen';
|
||||
};
|
||||
|
||||
// 提交
|
||||
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) => {
|
||||
if (!valid) return;
|
||||
if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user