优化代码生成,DataAnnotations生成时间范围验证

This commit is contained in:
轻风2016 2024-08-29 10:52:20 +08:00
parent 9c7e79356d
commit 7ed3f1706e
5 changed files with 126 additions and 59 deletions

View File

@ -94,9 +94,15 @@ if (@column.WhetherAddUpdate == "Y"){
@if(rule.Type=="pattern"){ @if(rule.Type=="pattern"){
@:[RegularExpression(@@"@(@FormatPattern(rule.Pattern))", ErrorMessage = "@(@rule.Message)")] @:[RegularExpression(@@"@(@FormatPattern(rule.Pattern))", ErrorMessage = "@(@rule.Message)")]
} }
@if(rule.Type=="length"){ @if(rule.Type=="length"&&column.NetType.StartsWith("string")){
@:[StringLength(@(@rule.Max),MinimumLength = @(@rule.Min), ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)至@(@rule.Max)字符")] @:[StringLength(@(@rule.Max),MinimumLength = @(@rule.Min), ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)至@(@rule.Max)字符")]
} }
@if(rule.Type=="length"&&column.NetType.StartsWith("DateTime")){
@:[Range(typeof(DateTime), "@(@rule.Min)", "@(@rule.Max)", ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)到@(@rule.Max)")]
}
@if(rule.Type=="length"&&(column.NetType.StartsWith("int")||column.NetType.StartsWith("long")||column.NetType.StartsWith("decimal")||column.NetType.StartsWith("float")||column.NetType.StartsWith("double"))){
@:[Range(@(@rule.Min), @(@rule.Max), ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)至@(@rule.Max)")]
}
} }
} }
@:public override @column.NetType @column.PropertyName { get; set; } @:public override @column.NetType @column.PropertyName { get; set; }
@ -151,9 +157,15 @@ if (@column.WhetherAddUpdate == "Y"){
@if(rule.Type=="pattern"){ @if(rule.Type=="pattern"){
@:[RegularExpression(@@"@(@FormatPattern(rule.Pattern))", ErrorMessage = "@(@rule.Message)")] @:[RegularExpression(@@"@(@FormatPattern(rule.Pattern))", ErrorMessage = "@(@rule.Message)")]
} }
@if(rule.Type=="length"){ @if(rule.Type=="length"&&column.NetType.StartsWith("string")){
@:[StringLength(@(@rule.Max),MinimumLength = @(@rule.Min), ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)至@(@rule.Max)字符")] @:[StringLength(@(@rule.Max),MinimumLength = @(@rule.Min), ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)至@(@rule.Max)字符")]
} }
@if(rule.Type=="length"&&column.NetType.StartsWith("DateTime")){
@:[Range(typeof(DateTime), "@(@rule.Min)", "@(@rule.Max)", ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)到@(@rule.Max)")]
}
@if(rule.Type=="length"&&(column.NetType.StartsWith("int")||column.NetType.StartsWith("long")||column.NetType.StartsWith("decimal")||column.NetType.StartsWith("float")||column.NetType.StartsWith("double"))){
@:[Range(@(@rule.Min), @(@rule.Max), ErrorMessage = "@(@column.ColumnComment)只能是@(@rule.Min)至@(@rule.Max)")]
}
} }
} }
@:public override @column.NetType @column.PropertyName { get; set; } @:public override @column.NetType @column.PropertyName { get; set; }

View File

@ -253,7 +253,7 @@ const rules = ref<FormRules>({
@:{required: true, message: '@(@triggerTip)@(@column.ColumnComment)!', trigger: '@(@trigger)',}, @:{required: true, message: '@(@triggerTip)@(@column.ColumnComment)!', trigger: '@(@trigger)',},
}else if(rule.Type=="array"){ }else if(rule.Type=="array"){
@:{ type: 'array', required: true, message: '请选择至少一种@(@column.ColumnComment)', trigger: 'change', }, @:{ type: 'array', required: true, message: '请选择至少一种@(@column.ColumnComment)', trigger: 'change', },
}else if(rule.Type=="length"){ }else if(rule.Type=="length"&&(column.EffectType=="Input"||column.EffectType == "InputTextArea")){
@:{ min: @(@rule.Min), max: @(@rule.Max), message: '长度应该是@(@rule.Min)到@(@rule.Max)', trigger: '@(@trigger)' }, @:{ min: @(@rule.Min), max: @(@rule.Max), message: '长度应该是@(@rule.Min)到@(@rule.Max)', trigger: '@(@trigger)' },
}else if(rule.Type=="pattern"){ }else if(rule.Type=="pattern"){
@:{ pattern: @(@rule.Pattern), message: '@(@column.ColumnComment)', trigger: '@(@trigger)' }, @:{ pattern: @(@rule.Pattern), message: '@(@column.ColumnComment)', trigger: '@(@trigger)' },

View File

@ -289,7 +289,7 @@ const cancel = () => {
const submit = async () => { const submit = async () => {
state.loading = true; state.loading = true;
var lst = state.tableData; var lst = state.tableData;
console.log(lst); // console.log(lst);
let ignoreFields = ['remoteVerify', 'anyRule', 'columnKey']; let ignoreFields = ['remoteVerify', 'anyRule', 'columnKey'];
lst.forEach((item: any) => { lst.forEach((item: any) => {
// //

View File

@ -3,39 +3,76 @@
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="800px"> <el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="800px">
<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> 编辑规则 </span> <span> 编辑规则 </span>
</div> </div>
</template> </template>
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
<el-row :gutter="35"> <el-row :gutter="35">
<el-form-item v-show="false"> <el-form-item style="display: none !important;">
<el-input v-model="state.ruleForm.id" /> <el-input v-model="state.ruleForm.id" />
</el-form-item> </el-form-item>
<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="type"> <el-form-item label="">
本字段的数据库类型是{{ state.column.dataType }}.Net类型是{{ state.column.netType }}
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="验证类型" prop="type" :rules="rules.type">
<el-select v-model="state.ruleForm.type" placeholder="请选择类型" @change="handleTypeChange"> <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-option v-for="(item, index) in validTypeData" :key="index" :label="item.name"
:value="item.code" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="state.ruleForm.type == 'pattern'"> <template v-if="state.ruleForm.type == 'length'&&(state.column.netType.includes('int')||state.column.netType.includes('long')||state.column.netType.includes('string'))">
<el-form-item label="提示信息" prop="message"> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-input v-model="state.ruleForm.message" placeholder="请输入提示信息" maxlength="128" show-word-limit clearable /> <el-form-item label="最小值" prop="min" :rules="rules.min">
</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-input-number v-model="state.ruleForm.min" :min="0" :max="100000" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="state.ruleForm.type == 'length'"> <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="最大值" prop="max"> <el-form-item label="最大值" prop="max" :rules="rules.max">
<el-input-number v-model="state.ruleForm.max" :min="0" :max="100000" /> <el-input-number v-model="state.ruleForm.max" :min="0" :max="100000" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" v-if="state.ruleForm.type == 'pattern'"> </template>
<el-form-item label="正则式" prop="pattern"> <template v-if="state.ruleForm.type == 'length'&&(state.column.netType.includes('decimal')||state.column.netType.includes('float')||state.column.netType.includes('double'))">
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="最小值" prop="min" :rules="rules.minDecimal">
<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">
<el-form-item label="最大值" prop="max" :rules="rules.maxDecimal">
<el-input-number v-model="state.ruleForm.max" :min="0" :max="100000" />
</el-form-item>
</el-col>
</template>
<template v-if="state.ruleForm.type == 'length'&&state.column.netType.includes('DateTime')">
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="起始日期" prop="min" :rules="rules.minDate">
<el-date-picker v-model="state.ruleForm.min" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" placeholder="请选择起始日期" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="结束日期" prop="max" :rules="rules.maxDate">
<el-date-picker v-model="state.ruleForm.max" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" placeholder="请选择结束日期" />
</el-form-item>
</el-col>
</template>
<template v-if="state.ruleForm.type == 'pattern'">
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="提示信息" prop="message" :rules="rules.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">
<el-form-item label="正则式" prop="pattern" :rules="rules.pattern">
<el-input v-model="state.ruleForm.pattern" placeholder="请输入正则表达式"> <el-input v-model="state.ruleForm.pattern" placeholder="请输入正则表达式">
<template #append> <template #append>
<el-button @click="openPatternDialog">选择正则</el-button> <el-button @click="openPatternDialog">选择正则</el-button>
@ -43,14 +80,7 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" </template>
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-row>
</el-form> </el-form>
<template #footer> <template #footer>
@ -100,6 +130,21 @@ const rules = ref<FormRules>({
trigger: 'blur', trigger: 'blur',
}, },
], ],
minDecimal: [
{
required: true,
message: '请输入正确的数字',
trigger: 'blur',
},
],
minDate: [
{
required: true,
pattern: /^\d{4}-\d{2}-\d{2}$/,
message: '请选择起始日期',
trigger: ['change', 'blur'],
},
],
max: [ max: [
{ {
type:'integer', type:'integer',
@ -109,6 +154,21 @@ const rules = ref<FormRules>({
trigger: 'blur', trigger: 'blur',
}, },
], ],
maxDecimal: [
{
required: true,
message: '请输入正确的数字',
trigger: 'blur',
},
],
maxDate: [
{
required: true,
pattern: /^\d{4}-\d{2}-\d{2}$/,
message: '请选择结束日期',
trigger: ['change', 'blur'],
},
],
message: [ message: [
{ {
required: true, required: true,
@ -117,13 +177,6 @@ const rules = ref<FormRules>({
}, },
], ],
pattern: [{ required: true, message: '请输入正则表达式', trigger: 'blur' }], pattern: [{ required: true, message: '请输入正则表达式', trigger: 'blur' }],
// dataType: [
// {
// required: true,
// message: '',
// trigger: 'change',
// },
// ]
}); });
const ruleFormRef = ref(); const ruleFormRef = ref();
const patternDialogRef = ref(); const patternDialogRef = ref();
@ -134,24 +187,22 @@ const validTypeData = ref([
{ code: 'pattern', name: '正则模式' }, { code: 'pattern', name: '正则模式' },
{ code: 'length', name: '长度限制' }, { code: 'length', name: '长度限制' },
]); ]);
// const dataTypeData = ref([
// { code: 'string', name: '' },
// { code: 'integer', name: '' },
// ]);
const state = reactive({ const state = reactive({
isShowDialog: false, isShowDialog: false,
loading: false, loading: false,
ruleForm: {} as any, ruleForm: {} as any,
id: 0, id: 0,
column: {} as any,
}); });
// //
const openDialog = (id: number) => { const openDialog = (row: any) => {
// const data = JSON.parse(JSON.stringify(row)); // const data = JSON.parse(JSON.stringify(row));
// state.ruleForm = data; // state.ruleForm = data;
state.id = id; state.id = row.id;
state.isShowDialog = true; state.isShowDialog = true;
state.column = row;
}; };
// //

View File

@ -13,8 +13,8 @@
<el-table :data="state.tableData" style="width: 100%" v-loading="state.loading" border> <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="type" label="类型" width="120" show-overflow-tooltip />
<el-table-column prop="message" label="提示信息" minWidth="180" 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="min" label="最小值" minWidth="100" show-overflow-tooltip />
<el-table-column prop="max" label="最大值" minWidth="100" show-overflow-tooltip />
<el-table-column prop="pattern" label="正则式" minWidth="120" 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> <el-table-column prop="action" label="操作" width="100" align="center" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
@ -45,7 +45,9 @@ const state = reactive({
loading: false, loading: false,
tableData: [] as any, tableData: [] as any,
title: '', title: '',
column: {} as any,
}); });
const column=ref();
// //
const openDialog = (row: any) => { const openDialog = (row: any) => {
@ -58,11 +60,13 @@ const openDialog = (row: any) => {
// state.tableData = row.rules; // state.tableData = row.rules;
state.id = row.id; state.id = row.id;
state.isShowDialog = true; state.isShowDialog = true;
state.column = row;
// console.log('column',row);
}; };
// //
const openRuleDialog = () => { const openRuleDialog = () => {
ruleDialogRef.value.openDialog(state.id); ruleDialogRef.value.openDialog(state.column);
}; };
// //