‘完善代码生成器,添加验证规则’

This commit is contained in:
轻风2016 2024-08-27 22:04:07 +08:00
parent d3a47716f2
commit adf293aa1e
15 changed files with 1148 additions and 54 deletions

View File

@ -204,4 +204,10 @@ public partial class SysCodeGenConfig : EntityBase
/// </summary>
[SugarColumn(ColumnDescription = "排序")]
public int OrderNo { get; set; } = 100;
/// <summary>
/// 字段验证规则
/// </summary>
[SugarColumn(ColumnDescription = "字段验证规则", ColumnDataType = StaticConfig.CodeFirst_BigString)]
public string? Rules { get; set; }
}

View File

@ -19,9 +19,9 @@ public class SysCodeGenTemplateSeedData : ISqlSugarEntitySeedData<SysCodeGenTemp
{
return new[]
{
new SysCodeGenTemplate{ Id=36036980201001, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_api.ts.vm", OutputFile="api/main/{TableNameLower}.ts", Describe ="(WEB)接口"},
new SysCodeGenTemplate{ Id=36036980201002, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_index.vue.vm", OutputFile="views/main/{TableNameLower}/index.vue", Describe ="(WEB)列表页面"},
new SysCodeGenTemplate{ Id=36036980201003, SysFlag=YesNoEnum.Y, Type=CodeGenTypeEnum.Frontend, Name="web_views_editDialog.vue.vm", OutputFile="views/main/{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)接口"},
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=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 ="(服务端)输入参数"},

View File

@ -54,6 +54,11 @@ public class CustomViewEngine : ViewEngineModel
public bool IsApiService { get; set; }
/// <summary>
/// 远程验证
/// </summary>
public bool RemoteVerify { get; set; }
public List<CodeGenConfig> QueryWhetherList { get; set; }
public List<CodeGenConfig> TableField { get; set; }

View File

@ -192,4 +192,32 @@ public class CodeGenConfig
/// 排序
/// </summary>
public int OrderNo { get; set; }
/// <summary>
/// 字段验证规则
/// </summary>
public string Rules { get; set; }
#region
/// <summary>
/// 字段验证集合
/// </summary>
public List<VerifyRuleItem>? RuleItems { get; set; }
/// <summary>
/// 是否远程验证
/// </summary>
public bool RemoteVerify { get; set; } = false;
/// <summary>
/// 是否存在验证规则
/// </summary>
public bool AnyRule { get; set; } = false;
/// <summary>
/// 验证触发器
/// </summary>
public string Trigger { get; set; }
#endregion
}

View File

@ -0,0 +1,36 @@
namespace Admin.NET.Core.Service;
/// <summary>
/// 验证规则选项
/// </summary>
public class VerifyRuleItem
{
/// <summary>
/// 编码
/// </summary>
public long Key { get; set; }
/// <summary>
/// 验证类型
/// </summary>
public string Type { get; set; }
/// <summary>
/// 验证错误消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 最小值
/// </summary>
public string Min { get; set; }
/// <summary>
/// 最大值
/// </summary>
public string Max { get; set; }
/// <summary>
/// 正则表达式
/// </summary>
public string Pattern { get; set; }
/// <summary>
/// 数据类型(搭配正则)
/// </summary>
public string DataType { get; set; }
}

View File

@ -119,7 +119,25 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
codeGenConfig.WhetherRetract = YesNoEnum.N.ToString();
// 生成代码时,主键并不是必要输入项,故一定要排除主键字段
codeGenConfig.WhetherRequired = (tableColumn.IsNullable || tableColumn.IsPrimarykey) ? YesNoEnum.N.ToString() : YesNoEnum.Y.ToString();
//codeGenConfig.WhetherRequired = (tableColumn.IsNullable || tableColumn.IsPrimarykey) ? YesNoEnum.N.ToString() : YesNoEnum.Y.ToString();
#region
//添加校验规则
codeGenConfig.Id = YitIdHelper.NextId();
//验证规则
List<VerifyRuleItem> ruleItems = new List<VerifyRuleItem>();
if (!tableColumn.IsNullable && !tableColumn.IsPrimarykey)
{
ruleItems.Add(new VerifyRuleItem()
{
Key = codeGenConfig.Id,
Type = "required",
Message = $"{tableColumn.ColumnComment}不能为空",
});
}
codeGenConfig.WhetherRequired = ruleItems.Any(t => t.Type == "required") ? YesNoEnum.Y.ToString() : YesNoEnum.N.ToString();
codeGenConfig.Rules = ruleItems.ToJson();
#endregion
codeGenConfig.QueryWhether = YesOrNo;
codeGenConfig.WhetherAddUpdate = YesOrNo;
codeGenConfig.WhetherTable = YesOrNo;

View File

@ -157,7 +157,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
{
dbTableName = dbTableName.Substring(0, bracketIndex);
}
var table = dbTableInfos.FirstOrDefault(x => x.Name.ToLower().StartsWith(config != null && config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(dbTableName) : dbTableName));
var table = dbTableInfos.FirstOrDefault(x => x.Name.ToLower().StartsWith((config != null && config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(dbTableName) : dbTableName).ToLower()));
if (table == null) continue;
tableOutputList.Add(new TableOutput
{
@ -234,6 +234,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
ColumnKey = u.IsPrimarykey.ToString(),
NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
DataType = u.DataType,
//DataType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
ColumnComment = string.IsNullOrWhiteSpace(u.ColumnDescription) ? u.DbColumnName : u.ColumnDescription
}).ToList();
@ -345,26 +346,48 @@ public class SysCodeGenService : IDynamicApiController, ITransient
Directory.Delete(outputPath, true);
var tableFieldList = await _codeGenConfigService.GetList(new CodeGenConfig() { CodeGenId = input.Id }); // 字段集合
#region
foreach (var item in tableFieldList)
{
List<VerifyRuleItem> list = new List<VerifyRuleItem>();
if (!string.IsNullOrWhiteSpace(item.Rules))
{
if (item.Rules != "[]")
{
list = JSON.Deserialize<List<VerifyRuleItem>>(item.Rules);
}
}
else
{
item.Rules = "[]";
}
item.RuleItems = list;
item.WhetherRequired = list.Any(t => t.Type == "required") ? YesNoEnum.Y.ToString() : YesNoEnum.N.ToString();
item.AnyRule = list.Count > 0;
item.RemoteVerify = list.Any(t => t.Type == "remote");
}
#endregion
var queryWhetherList = tableFieldList.Where(u => u.QueryWhether == YesNoEnum.Y.ToString()).ToList(); // 前端查询集合
var joinTableList = tableFieldList.Where(u => u.EffectType == "Upload" || u.EffectType == "fk" || u.EffectType == "ApiTreeSelect").ToList(); // 需要连表查询的字段
(string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList); // 获取连表的实体名和别名
var data = new CustomViewEngine(_db)
{
ConfigId = input.ConfigId!,
AuthorName = input.AuthorName!,
BusName = input.BusName!,
NameSpace = input.NameSpace!,
ClassName = input.TableName!,
PagePath = input.PagePath!,
ProjectLastName = input.NameSpace!.Split('.').Last(),
QueryWhetherList = queryWhetherList,
TableField = tableFieldList,
IsJoinTable = joinTableList.Count > 0,
IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(),
PrintType = input.PrintType!,
PrintName = input.PrintName!,
IsApiService = input.IsApiService
ConfigId = input.ConfigId!,//库定位器名
AuthorName = input.AuthorName!,//作者
BusName = input.BusName!,//业务名称
NameSpace = input.NameSpace!,//命名空间
ClassName = input.TableName!,//类名称
PagePath = input.PagePath!,//页面目录
ProjectLastName = input.NameSpace!.Split('.').Last(),//项目最后个名称,生成的时候赋值
QueryWhetherList = queryWhetherList,//查询条件
TableField = tableFieldList,//表字段配置信息
IsJoinTable = joinTableList.Count > 0,//是否联表
IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(),//是否上传
PrintType = input.PrintType!,//支持打印类型
PrintName = input.PrintName!,//打印模板名称
IsApiService = input.IsApiService,
RemoteVerify = tableFieldList.Any(t => t.RemoteVerify == true),//远程验证
};
// 模板
@ -385,6 +408,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
});
string targetFile = templateList[i].OutputFile
.Replace("{PagePath}", input.PagePath)
.Replace("{TableName}", input.TableName)
.Replace("{TableNameLower}", ToFirstLetterLowerCase(input.TableName!));
@ -432,26 +456,48 @@ public class SysCodeGenService : IDynamicApiController, ITransient
public async Task<Dictionary<string, string>> Preview(SysCodeGen input)
{
var tableFieldList = await _codeGenConfigService.GetList(new CodeGenConfig() { CodeGenId = input.Id }); // 字段集合
#region
foreach (var item in tableFieldList)
{
List<VerifyRuleItem> list = new List<VerifyRuleItem>();
if (!string.IsNullOrWhiteSpace(item.Rules))
{
if (item.Rules != "[]")
{
list = JSON.Deserialize<List<VerifyRuleItem>>(item.Rules);
}
}
else
{
item.Rules = "[]";
}
item.RuleItems = list;
item.WhetherRequired = list.Any(t => t.Type == "required") ? YesNoEnum.Y.ToString() : YesNoEnum.N.ToString();
item.AnyRule = list.Count > 0;
item.RemoteVerify = list.Any(t => t.Type == "remote");
}
#endregion
var queryWhetherList = tableFieldList.Where(u => u.QueryWhether == YesNoEnum.Y.ToString()).ToList(); // 前端查询集合
var joinTableList = tableFieldList.Where(u => u.EffectType == "Upload" || u.EffectType == "fk" || u.EffectType == "ApiTreeSelect").ToList(); // 需要连表查询的字段
(string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList); // 获取连表的实体名和别名
var data = new CustomViewEngine(_db)
{
ConfigId = input.ConfigId!,
AuthorName = input.AuthorName!,
BusName = input.BusName!,
NameSpace = input.NameSpace!,
ClassName = input.TableName!,
PagePath = input.PagePath!,
ProjectLastName = input.NameSpace!.Split('.').Last(),
QueryWhetherList = queryWhetherList,
TableField = tableFieldList,
IsJoinTable = joinTableList.Count > 0,
IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(),
PrintType = input.PrintType!,
PrintName = input.PrintName!,
IsApiService = input.IsApiService
ConfigId = input.ConfigId!,//库定位器名
AuthorName = input.AuthorName!,//作者
BusName = input.BusName!,//业务名称
NameSpace = input.NameSpace!,//命名空间
ClassName = input.TableName!,//类名称
PagePath = input.PagePath!,//页面目录
ProjectLastName = input.NameSpace!.Split('.').Last(),//项目最后个名称,生成的时候赋值
QueryWhetherList = queryWhetherList,//查询条件
TableField = tableFieldList,//表字段配置信息
IsJoinTable = joinTableList.Count > 0,//是否联表
IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(),//是否上传
PrintType = input.PrintType!,//支持打印类型
PrintName = input.PrintName!,//打印模板名称
IsApiService = input.IsApiService,
RemoteVerify = tableFieldList.Any(t => t.RemoteVerify == true)//远程验证
};
// 获取模板文件并替换

View File

@ -6,6 +6,18 @@
using Admin.NET.Core;
using System.ComponentModel.DataAnnotations;
@{
string RemoteField="";
string PKName="";
foreach (var column in Model.TableField){
if(column.RemoteVerify){
RemoteField=@column.PropertyName;
}
if(column.ColumnKey == "True"){
PKName=column.PropertyName;
}
}
}
namespace @Model.NameSpace;
@ -67,11 +79,20 @@ if (@column.ColumnKey != "True"){
public class Add@(@Model.ClassName)Input : @(@Model.ClassName)BaseInput
{
@foreach (var column in Model.TableField){
if (@column.WhetherRequired == "Y"){
if (@column.WhetherAddUpdate == "Y"){
@:/// <summary>
@:/// @column.ColumnComment
@:/// </summary>
@if(@column.WhetherRequired=="Y"){
@:[Required(ErrorMessage = "@(@column.ColumnComment)不能为空")]
}
@if(@column.AnyRule){
@foreach(var rule in @column.RuleItems){
@if(rule.Type=="pattern"){
@:[RegularExpression(@@"@(@rule.Pattern)", ErrorMessage = "@(@rule.Message)")]
}
}
}
@:public override @column.NetType @column.PropertyName { get; set; }
@:
}
@ -109,6 +130,23 @@ if (@column.ColumnKey == "True"){
@:public @column.NetType @column.PropertyName { get; set; }
@:
}
if (@column.WhetherAddUpdate == "Y"){
@:/// <summary>
@:/// @column.ColumnComment
@:/// </summary>
@if(@column.WhetherRequired=="Y"){
@:[Required(ErrorMessage = "@(@column.ColumnComment)不能为空")]
}
@if(@column.AnyRule){
@foreach(var rule in @column.RuleItems){
@if(rule.Type=="pattern"){
@:[RegularExpression(@@"@(@rule.Pattern)", ErrorMessage = "@(@rule.Message)")]
}
}
}
@:public override @column.NetType @column.PropertyName { get; set; }
@:
}
}
}
@ -119,3 +157,22 @@ if (@column.ColumnKey == "True"){
{
}
@if(@Model.RemoteVerify){
@:/// <summary>
@:/// 检查@(RemoteField)字段参数
@:/// </summary>
@:public class Exists@(RemoteField)Input
@:{
@:/// <summary>
@:/// 字段名称
@:/// </summary>
@:public string FieldName { get; set; }
@:
@:/// <summary>
@:/// 旧字段名
@:/// </summary>
@:public string OldFieldName { get; set; }
@:}
}

View File

@ -10,10 +10,18 @@ using Microsoft.AspNetCore.Http;
string joinTableName = "u";
Dictionary<string, int> definedObjects = new Dictionary<string, int>();
bool haveLikeCdt = false;
string RemoteField="";
string PKName="";
foreach (var column in Model.TableField){
if (column.QueryWhether == "Y" && column.QueryType == "like"){
haveLikeCdt = true;
}
if(column.RemoteVerify){
RemoteField=@column.PropertyName;
}
if(column.ColumnKey == "True"){
PKName=column.PropertyName;
}
}
}
namespace @Model.NameSpace;
@ -121,8 +129,16 @@ if (@column.QueryWhether == "Y"){
public async Task<long> Add(Add@(@Model.ClassName)Input input)
{
var entity = input.Adapt<@(@Model.ClassName)>();
@if(Model.RemoteVerify){
@://验证重复值
@:if (await _@(@Model.LowerClassName)Rep.IsAnyAsync(t => t.@(RemoteField) == entity.@(RemoteField)))
@:{
@://已存在
@:throw Oops.Oh(ErrorCodeEnum.D1006);
@:}
}
await _@(@Model.LowerClassName)Rep.InsertAsync(entity);
return entity.Id;
return entity.@(@PKName);
}
/// <summary>
@ -153,7 +169,15 @@ if (@column.ColumnKey == "True"){
public async Task Update(Update@(@Model.ClassName)Input input)
{
var entity = input.Adapt<@(@Model.ClassName)>();
await _@(@Model.LowerClassName)Rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
@if(Model.RemoteVerify){
@://验证重复值
@:if (await _advertsRep.IsAnyAsync(t => t.@(RemoteField) == entity.@(RemoteField) && t.@(@PKName) != entity.@(@PKName)))
@:{
@://已存在
@:throw Oops.Oh(ErrorCodeEnum.D1006);
@:}
}
await _@(@Model.LowerClassName)Rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
}
/// <summary>
@ -233,4 +257,32 @@ if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(@colu
@:}
}
}
@if(Model.RemoteVerify){
@:/// <summary>
@:/// 检查@(RemoteField)字段是否可用
@:/// </summary>
@:/// <param name="param">检查字段参数</param>
@:/// <returns></returns>
@:[ApiDescriptionSettings(Name = "exists@(RemoteField)",Description = "检查@(RemoteField)字段是否可用", Order = 940), HttpPost]
@:[DisplayName("检查@(RemoteField)字段是否可用")]
@:public async Task<bool> Exists@(RemoteField)Async(Exists@(RemoteField)Input param)
@:{
@:if (string.IsNullOrWhiteSpace(param.FieldName))
@:{
@:return false;
@:}
@:if (!string.IsNullOrWhiteSpace(param.OldFieldName))
@:{
@:if (param.FieldName.Trim() == param.OldFieldName.Trim())
@:{
@://编辑状态下触发的
@:return true;
@:}
@:}
@:return !(await _@(@Model.LowerClassName)Rep.IsAnyAsync(t => t.@(RemoteField).Equals(param.FieldName.Trim())));
@:}
}
}

View File

@ -1,4 +1,16 @@
@{Dictionary<string, int> definedObjects = new Dictionary<string, int>();}
@{
Dictionary<string, int> definedObjects = new Dictionary<string, int>();
string RemoteField="";
string PKName="";
foreach (var column in Model.TableField){
if(column.RemoteVerify){
RemoteField=@column.PropertyName;
}
if(column.ColumnKey == "True"){
PKName=column.PropertyName;
}
}
}
import request from '/@@/utils/request';
enum Api {
Add@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/add',
@ -6,6 +18,9 @@ enum Api {
Update@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/update',
Page@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/page',
Detail@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/detail',
@if(Model.RemoteVerify){
@:Exists@(RemoteField) = '/api/@(@Model.LowerClassName)/exists@(RemoteField)',
}
@foreach (var column in Model.TableField){
if(@column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){
@:Get@(@column.FkEntityName)@(@column.PropertyName)Dropdown = '/api/@(@Model.LowerClassName)/@(@column.FkEntityName)@(@column.PropertyName)Dropdown',
@ -111,4 +126,14 @@ if(@column.EffectType == "Upload"){
@:};
break;
}
}
@if(Model.RemoteVerify){
@:// 检查@(RemoteField)是否存在
@:export const exists@(RemoteField) = (params?: any) =>
@:request({
@:url: Api.Exists@(RemoteField),
@:method: 'post',
@:data: params,
@:});
}

View File

@ -1,6 +1,18 @@
@{Dictionary<string, int> definedObjects = new Dictionary<string, int>();}
@{var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault();}
@{string pkFieldName = LowerFirstLetter(pkField.PropertyName);}
@{
string pkFieldName = LowerFirstLetter(pkField.PropertyName);
string RemoteField="";
string PKName="";
foreach (var column in Model.TableField){
if(column.RemoteVerify){
RemoteField=@column.PropertyName;
}
if(column.ColumnKey == "True"){
PKName=column.PropertyName;
}
}
}
<template>
<div class="@(@Model.LowerClassName)-container">
<el-dialog v-model="state.isShowDialog" :width="800" draggable="" :close-on-click-modal="false">
@ -153,7 +165,13 @@ import type { FormRules } from "element-plus";
// 模型
@:import { Update@(@Model.ClassName)Input } from '/@@/api-services/models';
} else {
@:import { add@(@Model.ClassName), update@(@Model.ClassName), detail@(@Model.ClassName) } from "/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)";
@:import {
@if(Model.RemoteVerify){
@:exists@(RemoteField),
}
@:add@(@Model.ClassName),
@:update@(@Model.ClassName),
@:detail@(@Model.ClassName) } from "/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)";
if(@Model.TableField.Any(x=>x.EffectType == "Upload")){
@:import { Plus } from "@@element-plus/icons-vue";
@ -211,12 +229,51 @@ const state = reactive({
//自行添加其他规则
const rules = ref<FormRules>({
@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',},],
}
if(@column.WhetherAddUpdate == "Y"){
string triggerTip="请输入";
@if(@column.AnyRule){
@:@column.LowerPropertyName: [
@foreach(var rule in @column.RuleItems){
string trigger="blur";
if(@column.EffectType == "DatePicker" || @column.EffectType == "Select" ||@column.EffectType == "ApiTreeSelect"){
trigger="change";
}
if(rule.Type=="required"){
@:{required: true, message: '@(@triggerTip)@(@column.ColumnComment)!', trigger: '@(@trigger)',},
}else if(rule.Type=="array"){
@:{ type: 'array', required: true, message: '请选择至少一种@(@column.ColumnComment)', trigger: 'change', },
}else if(rule.Type=="length"){
@:{ min: @(@rule.Min), max: @(@rule.Max), message: '长度应该是@(@rule.Min)到@(@rule.Max)', trigger: '@(@trigger)' },
}else if(rule.Type=="pattern"){
@:{ pattern: @(@rule.Pattern), message: '@(@column.ColumnComment)', trigger: '@(@trigger)' },
}else if(rule.Type=="remote"){
@:{
@:asyncValidator: (rule, value, callback) => {
@:if (!value) {
@:callback(new Error("请输入@(@column.ColumnComment)"));
@:}
@:let param = {
@:fieldName: value,
@:oldFieldName: ruleForm.old@(RemoteField)
@:};
@:exists@(RemoteField)(param).then((res) => {
@:if (res.data.result) {
@:callback();
@:} else {
@:callback(new Error("@(@column.ColumnComment)不可用"));
@:}
@:}).finally(() => {
@:callback(new Error("发生错误了!"));
@:});
@:}, trigger: '@(@trigger)'
@:},
}else{
}
}
@:],
}
}
}
});
@ -230,14 +287,25 @@ const openDialog = async (row: any) => {
// state.ruleForm = JSON.parse(JSON.stringify(row));
// 改用detail获取最新数据来编辑
let rowData = JSON.parse(JSON.stringify(row));
if (rowData.id)
if (rowData.@(@pkFieldName)) {
@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;
@:let data = (await getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)DetailGet(rowData.@(@pkFieldName))).data.result;
@if(Model.RemoteVerify){
@:const { @LowerFirstLetter(@RemoteField) } = data;
@:data.old@(RemoteField) = @LowerFirstLetter(@RemoteField);
}
else
@:state.ruleForm = data;
} else {
@:let data = (await detail@(@Model.ClassName)(rowData.@(@pkFieldName))).data.result;
@if(Model.RemoteVerify){
@:const { @LowerFirstLetter(@RemoteField) } = data;
@:data.old@(RemoteField) = @LowerFirstLetter(@RemoteField);
}
@:state.ruleForm = data;
}
} else {
state.ruleForm = rowData;
}
state.isShowDialog = true;
};

View File

@ -19,7 +19,7 @@
<el-table-column prop="effectType" label="作用类型" width="140" show-overflow-tooltip>
<template #default="scope">
<div class="effect-type-container">
<el-select v-model="scope.row.effectType" class="m-2" placeholder="Select" :disabled="judgeColumns(scope.row)" @change="effectTypeChange(scope.row, scope.$index)" filterable>
<el-select v-model="scope.row.effectType" class="m-2" style="width: 90%" placeholder="Select" :disabled="judgeColumns(scope.row)" @change="effectTypeChange(scope.row, scope.$index)" filterable>
<el-option v-for="item in state.effectTypeList" :key="item.code" :label="item.value" :value="item.code" />
</el-select>
<el-button
@ -53,7 +53,9 @@
</el-table-column>
<el-table-column prop="whetherRequired" label="必填" width="70" align="center" show-overflow-tooltip>
<template #default="scope">
<el-checkbox v-model="scope.row.whetherRequired" :disabled="judgeColumns(scope.row)" />
<!-- <el-checkbox v-model="scope.row.whetherRequired" :disabled="judgeColumns(scope.row)" /> -->
<el-tag v-if="scope.row.whetherRequired" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column prop="whetherSortable" label="可排序" width="80" align="center" show-overflow-tooltip>
@ -78,6 +80,13 @@
<el-input v-model="scope.row.orderNo" autocomplete="off" type="number" />
</template>
</el-table-column>
<el-table-column prop="orderNo" label="校验" width="120" align="center" show-overflow-tooltip>
<template #default="scope">
<el-button type="primary" v-if="(scope.row.columnKey=== 'False') && (!scope.row.whetherCommon)"
@click="openVerifyDialog(scope.row)">规则{{ scope.row.ruleCount }}</el-button>
<span v-else></span>
</template>
</el-table-column>
</el-table>
<template #footer>
<span class="dialog-footer">
@ -89,6 +98,7 @@
<fkDialog ref="fkDialogRef" @submitRefreshFk="submitRefreshFk" />
<treeDialog ref="treeDialogRef" @submitRefreshFk="submitRefreshFk" />
<verifyDialog ref="verifyDialogRef" @submitVerify="submitVerifyOk" />
</div>
</template>
@ -99,6 +109,7 @@ import { Edit } from '@element-plus/icons-vue';
import fkDialog from '/@/views/system/codeGen/component/fkDialog.vue';
import treeDialog from '/@/views/system/codeGen/component/treeDialog.vue';
import verifyDialog from '/@/views/system/codeGen/component/verifyDialog.vue';
import { getAPI } from '/@/utils/axios-utils';
import { SysCodeGenConfigApi, SysConstApi, SysDictDataApi, SysDictTypeApi, SysEnumApi } from '/@/api-services/api';
@ -107,6 +118,7 @@ import { CodeGenConfig } from '/@/api-services/models/code-gen-config';
const emits = defineEmits(['handleQuery']);
const fkDialogRef = ref();
const treeDialogRef = ref();
const verifyDialogRef = ref();
const state = reactive({
isShowDialog: false,
loading: false,
@ -186,7 +198,13 @@ const handleQuery = async (row: any) => {
if (item[key] === 'N' || (lstWhetherColumn.includes(key) && item[key] === null)) {
item[key] = false;
}
};
//
let rules = new Array();
if (item.rules != '' && item.rules !== null) {
rules = JSON.parse(item.rules);
}
item.ruleCount = rules.length > 0 ? `${rules.length}` : '';
});
state.tableData = data;
state.loading = false;
@ -219,6 +237,36 @@ const openTreeDialog = (addRow: any, index: number) => {
treeDialogRef.value.openDialog(addRow);
};
//
const openVerifyDialog = (row: any) => {
// handleQuery(addRow);
// state.isShowDialog = true;
verifyDialogRef.value.openDialog(row);
};
//
const submitVerifyOk = (data: any) => {
console.log('submitVerifyOk', data);
for (let i = 0; i < state.tableData.length; i++) {
if (state.tableData[i].id == data.id) {
state.tableData[i].rules = data.rules;
state.tableData[i].ruleCount = data.ruleCount;
//
let rules = new Array();
if (data.rules != '' && data.rules !== null) {
rules = JSON.parse(data.rules);
let requiredRule = rules.find(t => t.type === 'required');
if (requiredRule) {
state.tableData[i].whetherRequired = true;
} else {
state.tableData[i].whetherRequired = false;
}
};
break;
}
}
};
//
const closeDialog = () => {
emits('handleQuery');
@ -234,13 +282,15 @@ const cancel = () => {
const submit = async () => {
state.loading = true;
var lst = state.tableData;
console.log(lst);
let ignoreFields=['remoteVerify','anyRule','columnKey'];
lst.forEach((item: CodeGenConfig) => {
//
for (var key in item) {
if (item[key] === true) {
if (item[key] === true&&!ignoreFields.includes(key)) {
item[key] = 'Y';
}
if (item[key] === false) {
if (item[key] === false&&!ignoreFields.includes(key)) {
item[key] = 'N';
}
}

View File

@ -0,0 +1,343 @@
<template>
<div class="sys-codeGenConfig-container">
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="600px">
<template #header>
<div style="color: #fff">
<span> 选择正则 </span>
</div>
</template>
<div class="pattern-box">
<div class="pattern-item" v-for="(item, index) in patternData" :key="index"
:class="{ active: state.index == index }" @click="handlePatternClick(item, index)">
<div class="title">{{ item.title }}</div>
<div class="info">{{ item.info }}</div>
<div class="pattern">{{ item.pattern }}</div>
</div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { onMounted, onUnmounted, reactive, ref, toRaw } from 'vue';
import { ElMessage } from "element-plus";
const patternData = ref([
{
title: '手机号',
info: '',
pattern: '/^1[3,4,5,6,7,8,9][0-9]{9}$/',
},
{
title: '邮箱',
info: '',
pattern: '/^([a-zA-Z]|[0-9])(\\w|\\-)+@[a-zA-Z0-9]+\\.([a-zA-Z]{2,4})$/',
},
{
title: '网址',
info: '',
pattern: '/^http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?$/',
},
{
title: '字母/数字/下划线',
info: '',
pattern: '/^\\w+$/',
},
{
title: '中英文/数字/下划线',
info: '',
pattern: '/^[\\u4e00-\\u9fa5_a-zA-Z0-9]+$/',
},
{
title: '中文/英文',
info: '',
pattern: '/^[\\u4e00-\\u9fa5a-zA-Z]+$/',
},
{
title: '规范金额',
info: '',
pattern: '/(^[\\d]|^[1-9][\\d]*)($|[\\.][\\d]{0,2}$)/',
},
{
title: '用户名不能全是数字',
info: '',
pattern: '/[^\\d]/g',
},
{
title: '中文',
info: '',
pattern: '/^[\\u4e00-\\u9fa5]+$/',
},
{
title: '非中文',
info: '',
pattern: '/^[^\\u4e00-\\u9fa5]*$/',
},
{
title: '限制长度',
info: '',
pattern: '/^\\d{1,20}$/',
},
{
title: '数字',
info: '',
pattern: '/^[0-9]*$/',
},
{
title: '正整数及整数',
info: '',
pattern: '/^[1-9]\\d*$/',
},
{
title: '数字(可正负)',
info: '',
pattern: '/^-[0-9]*[1-9][0-9]*$/',
},
{
title: '数字/小数点',
info: '',
pattern: '/^\\d+$|^\\d*\\.\\d+$/',
},
{
title: '合法IP地址',
info: '',
pattern: '/^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/',
},
{
title: '手机号码或者固话',
info: '',
pattern: '/^((0\\d{2,3}-\\d{7,8})|(1[3456789]\\d{9}))$/',
},
{
title: '身份证号码',
info: '',
pattern: '/(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/',
},
{
title: '大写字母',
info: '',
pattern: '/^[A-Z]+$/',
},
{
title: '小写字母',
info: '',
pattern: '/^[a-z]+$/',
},
{
title: '大小写混合',
info: '',
pattern: '/^[A-Za-z]+$/',
},
{
title: '多个8位数字格式(yyyyMMdd)并以逗号隔开',
info: '',
pattern: '/^\\d{8}(\\,\\d{8})*$/',
},
{
title: '数字加英文',
info: '',
pattern: '/^[a-zA-Z0-9]+$/',
},
{
title: '前两位是数字后一位是英文',
info: '',
pattern: '/^\\d{2}[a-zA-Z]+$/',
},
{
title: '1到100的数字',
info: '',
pattern: '/^[0-9]\\d{0,1}$/',
},
{
title: '1-1000两位小数',
info: '',
pattern: '/^(.*[^0-9]|)(1000|[1-9]\\d{0,2})([^0-9].*|)$/',
},
{
title: '小数点后只能有两位数(可为0)',
info: '',
pattern: '/^(-?\\d+)(\\.\\d{1,2})?$/',
},
{
title: '密码正则',
info: '以字母开头长度在6~18之间只能包含字母、数字和下划线',
pattern: '/^[a-zA-Z]\\w{5,17}$/',
},
{
title: '强密码',
info: '必须包含大小写字母和数字的组合不能使用特殊字符长度在8-10之间',
pattern: '/^(?=.\\d)(?=.[a-z])(?=.[A-Z]).{8,10}$/',
},
{
title: '强密码',
info: '最少6位包括至少1个大写字母1个小写字母1个数字1个特殊字符',
pattern: '/^.*(?=.{6,})(?=.*\\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/',
},
{
title: 'QQ号码',
info: '',
pattern: '/^[1-9][0-9]{4,12}$/',
},
{
title: '微信号码',
info: '',
pattern: '/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/',
},
{
title: '域名',
info: '',
pattern: '/^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?$/',
},
{
title: '车牌号码',
info: '',
pattern: '/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/',
},
{
title: '护照',
info: '',
pattern: '/^(P\\d{7}|G\\d{7,8}|TH\\d{7,8}|S\\d{7,8}|A\\d{7,8}|L\\d{7,8}|\\d{9}|D\\d+|1[4,5]\\d{7})$/',
},
{
title: '固定电话',
info: '',
pattern: '/^(\\(\\d{3,4}\\)|\\d{3,4}-|\\s)?\\d{8}$/',
},
{
title: '邮政编码',
info: '',
pattern: '/^[1-9]{1}(\\d+){5}$/',
},
{
title: '经度',
info: '',
pattern: '/^(\\-|\\+)?(((\\d|[1-9]\\d|1[0-7]\\d|0{1,3})\\.\\d{0,6})|(\\d|[1-9]\\d|1[0-7]\\d|0{1,3})|180\\.0{0,6}|180)$/',
},
{
title: '纬度',
info: '',
pattern: '/^(\\-|\\+)?([0-8]?\\d{1}\\.\\d{0,6}|90\\.0{0,6}|[0-8]?\\d{1}|90)$/',
},
{
title: '正整数 + 0',
info: '',
pattern: '/^\\d+$/',
},
{
title: '正整数',
info: '',
pattern: '/^[0-9]*[1-9][0-9]*$/',
},
{
title: '负整数 + 0',
info: '',
pattern: '/^((-\\d+)|(0+))$/',
},
{
title: '负整数',
info: '',
pattern: '/^-[0-9]*[1-9][0-9]*$/',
},
{
title: '匹配整数',
info: '',
pattern: '/^-?\\d+$/',
},
]);
const state = reactive({
isShowDialog: false,
loading: false,
selectPattern: null,
index: -1,
});
const emit = defineEmits(["submitPattern"]);
//
const openDialog = () => {
state.isShowDialog = true;
};
//
const closeDialog = () => {
state.isShowDialog = false;
};
//
const cancel = () => {
closeDialog();
};
const handlePatternClick = (item: any, index: number) => {
state.selectPattern = item;
state.index = index;
ElMessage({
message: `点击确定完成操作!`,
type: "success",
});
}
//
const submit = async () => {
emit('submitPattern', state.selectPattern);
closeDialog();
};
//
defineExpose({ openDialog });
</script>
<style lang="scss" scoped>
.pattern-box {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
height: 400px;
overflow-y: auto;
padding: 0px 10px;
.pattern-item {
width: 48%;
border: 1px solid #D9D9D9;
box-sizing: border-box;
padding: 10px;
border-radius: 5px;
cursor: pointer;
flex-shrink: 0;
margin: 5px 0px;
.title {
font-weight: 700;
}
.info {
font-size: 12px;
margin-top: 5px;
}
.pattern {
font-size: 10px;
margin-top: 5px;
background: #1D1F21;
padding: 3px 5px;
color: #D9D9D9;
border-radius: 3px;
}
&:hover {
//border: 1px solid red;
box-shadow: 0px 0px 2px 1px rgba(0, 0, 0, 0.2);
}
}
}
.active {
border: 1px solid red !important;
}
</style>

View File

@ -0,0 +1,229 @@
<template>
<div class="sys-codeGenConfig-container">
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="800px">
<template #header>
<div style="color: #fff">
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit />
</el-icon>
<span> 编辑规则 </span>
</div>
</template>
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules">
<el-row :gutter="35">
<el-form-item v-show="false">
<el-input v-model="state.ruleForm.id" />
</el-form-item>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="验证类型" prop="type">
<el-select v-model="state.ruleForm.type" placeholder="请选择类型" @change="handleTypeChange">
<el-option v-for="(item, index) in validTypeData" :key="index" :label="item.name"
:value="item.code" />
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"
v-if="state.ruleForm.type == 'pattern'">
<el-form-item label="提示信息" prop="message">
<el-input v-model="state.ruleForm.message" placeholder="请输入提示信息" maxlength="128" show-word-limit
clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"
v-if="state.ruleForm.type == 'length'">
<el-form-item label="最小值" prop="min">
<el-input-number v-model="state.ruleForm.min" :min="0" :max="100000" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"
v-if="state.ruleForm.type == 'length'">
<el-form-item label="最大值" prop="max">
<el-input-number v-model="state.ruleForm.max" :min="0" :max="100000" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"
v-if="state.ruleForm.type == 'pattern'">
<el-form-item label="正则式" prop="pattern">
<el-input v-model="state.ruleForm.pattern" placeholder="请输入正则表达式">
<template #append>
<el-button @click="openPatternDialog">选择正则</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<!-- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"
v-if="state.ruleForm.type == 'pattern'">
<el-form-item label="数据类型" prop="dataType">
<el-radio-group v-model="state.ruleForm.dataType">
<el-radio v-for="(item, index) in dataTypeData" :key="index" :value="item.code" :label="item.name"></el-radio>
</el-radio-group>
</el-form-item>
</el-col> -->
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</template>
</el-dialog>
<patternDialog ref="patternDialogRef" @submit-pattern="submitPatternOK" />
</div>
</template>
<style lang="scss" scoped>
.tool-box {
padding-bottom: 20px;
display: flex;
gap: 20px;
align-items: center;
// background: red;
}
</style>
<script lang="ts" setup>
import { onMounted, onUnmounted, reactive, ref, toRaw, isReactive } from 'vue';
import patternDialog from '/@/views/system/codeGen/component/patternDialog.vue';
import { ElMessage, dialogEmits } from "element-plus";
import type { FormRules } from "element-plus";
const emit = defineEmits(["submitRule"]);
//
const rules = ref<FormRules>({
type: [
{
required: true,
message: '请选择验证类型',
trigger: 'change',
},
],
min: [
{
type: 'integer',
required: true,
pattern: /[^\d]/g,
message: '请输入正确的数字',
trigger: 'blur'
}
],
max: [
{
type: 'integer',
required: true,
pattern: /[^\d]/g,
message: '请输入正确的数字',
trigger: 'blur'
}
],
message: [
{
required: true,
message: '请输入提示信息',
trigger: 'blur',
},
],
pattern: [
{ required: true, message: '请输入正则表达式', trigger: 'blur' },
],
// dataType: [
// {
// required: true,
// message: '',
// trigger: 'change',
// },
// ]
});
const ruleFormRef = ref();
const patternDialogRef = ref();
const validTypeData = ref([
{ code: 'required', name: '必填验证' },
{ code: 'remote', name: '远程验证' },
{ code: 'array', name: '数组验证' },
{ code: 'pattern', name: '正则模式' },
{ code: 'length', name: '长度限制' },
]);
// const dataTypeData = ref([
// { code: 'string', name: '' },
// { code: 'integer', name: '' },
// ]);
const state = reactive({
isShowDialog: false,
loading: false,
ruleForm: {} as any,
id: 0,
});
//
const openDialog = (id: number) => {
// const data = JSON.parse(JSON.stringify(row));
// state.ruleForm = data;
state.id = id;
state.isShowDialog = true;
};
//
const closeDialog = () => {
// emit("reloadTable");
ruleFormRef.value.resetFields();
state.isShowDialog = false;
};
//
const openPatternDialog = () => {
patternDialogRef.value.openDialog();
}
//
const cancel = () => {
// state.isShowDialog = false;
closeDialog();
};
const submitPatternOK = (data: any) => {
// console.log('submitPatternOK', data);
state.ruleForm.pattern = data.pattern;
}
//
const submit = async () => {
ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => {
if (isValid) {
let values = toRaw(state.ruleForm);
values.key = toRaw(state.id);
emit("submitRule", Object.assign({}, values));
closeDialog();
} else {
ElMessage({
message: `表单有${Object.keys(fields).length}处验证失败,请修改后再提交`,
type: "error",
});
}
});
};
//
const handleTypeChange=()=>{
resetFields();
};
//
const resetFields=()=>{
state.ruleForm.message="";
state.ruleForm.min=0;
state.ruleForm.max=10;
state.ruleForm.pattern="";
// state.ruleForm.dataType=null;
}
//
defineExpose({ openDialog });
</script>

View File

@ -0,0 +1,131 @@
<template>
<div class="sys-codeGenConfig-container">
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="800px">
<template #header>
<div style="color: #fff">
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit />
</el-icon>
<span> {{ state.title }} </span>
</div>
</template>
<div class="tool-box">
<el-button type="primary" icon="ele-Plus" @click="openRuleDialog"> 新增 </el-button>
</div>
<el-table :data="state.tableData" style="width: 100%" v-loading="state.loading" border>
<el-table-column prop="type" label="类型" width="120" show-overflow-tooltip />
<el-table-column prop="message" label="提示信息" minWidth="180" show-overflow-tooltip />
<el-table-column prop="max" label="最大值" minWidth="100" show-overflow-tooltip />
<el-table-column prop="min" label="最小值" minWidth="100" show-overflow-tooltip />
<el-table-column prop="pattern" label="正则式" minWidth="120" show-overflow-tooltip />
<el-table-column prop="action" label="操作" width="100" align="center" show-overflow-tooltip>
<template #default="scope">
<el-button type="primary" @click="handleDeleteRule(scope)">删除</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</template>
</el-dialog>
<ruleDialog ref="ruleDialogRef" @submitRule="submitRuleOK" />
</div>
</template>
<style lang="scss" scoped>
.tool-box {
padding-bottom: 20px;
display: flex;
gap: 20px;
align-items: center;
// background: red;
}
</style>
<script lang="ts" setup>
import { onMounted, onUnmounted, reactive, ref, toRaw } from 'vue';
import ruleDialog from '/@/views/system/codeGen/component/ruleDialog.vue';
const emits = defineEmits(['submitVerify']);
// const fkDialogRef = ref();
const ruleDialogRef = ref();
const state = reactive({
id: 0,
isShowDialog: false,
loading: false,
tableData: [] as any,
title: ''
});
onMounted(async () => {
});
//
const submitRuleOK = (data: any) => {
let row = toRaw(data);
if (state.tableData === null) {
state.tableData = [];
}
console.log('row', state.tableData);
state.tableData.push(row);
// console.log('submitRuleOK',state.tableData);
};
onUnmounted(() => {
// mittBus.off('submitRefresh', () => { });
//mittBus.off('submitRefreshFk', () => { });
});
//
const openDialog = (row: any) => {
// handleQuery(addRow);
state.title = `${row.columnComment} -- 校验规则`;
// console.log('row',row);
state.tableData = new Array();
if (row.rules != '') {
state.tableData = JSON.parse(row.rules);
}
// state.tableData = row.rules;
state.id = row.id;
state.isShowDialog = true;
};
//
const openRuleDialog = () => {
ruleDialogRef.value.openDialog(state.id);
};
//
const closeDialog = () => {
state.isShowDialog = false;
};
//
const cancel = () => {
state.isShowDialog = false;
};
//
const submit = async () => {
let data = toRaw(state);
let newData = Object.assign({}, data);
let ruleCount = newData.tableData.length > 0 ? `${newData.tableData.length}` : '';
emits('submitVerify', { id: newData.id, rules: JSON.stringify(newData.tableData), ruleCount: ruleCount });
closeDialog();
};
//
const handleDeleteRule = (scope: any) => {
state.tableData.splice(scope.$index, 1);
}
//
defineExpose({ openDialog });
</script>