Browse Source

feat: 输入框校验

chenhao 2 năm trước cách đây
mục cha
commit
cf1a2e3183

+ 3 - 2
src/components/shared/SendBackMark.vue

@@ -20,7 +20,7 @@ import useForm from '@/hooks/useForm'
 import useFetch from '@/hooks/useFetch'
 import useFetch from '@/hooks/useFetch'
 import useVW from '@/hooks/useVW'
 import useVW from '@/hooks/useVW'
 
 
-import type { EpFormItem } from 'global-type'
+import type { EpFormItem, EpFormRules } from 'global-type'
 
 
 const emits = defineEmits<{
 const emits = defineEmits<{
   (e: 'rejected'): void
   (e: 'rejected'): void
@@ -51,8 +51,9 @@ watch(visible, () => {
   }
   }
 })
 })
 
 
-const rules = {
+const rules: EpFormRules = {
   reason: [{ required: true, message: '请选择打回原因' }],
   reason: [{ required: true, message: '请选择打回原因' }],
+  description: [{ type: 'string', max: 50, message: '说明文字限制50字以内' }],
 }
 }
 
 
 const reason = ['给分太高', '给分太低', '注意,评分偏紧', '注意,评分偏松', '评分不稳定,请认真评卷'].map((v) => ({
 const reason = ['给分太高', '给分太低', '注意,评分偏紧', '注意,评分偏松', '评分不稳定,请认真评卷'].map((v) => ({

+ 4 - 1
src/components/shared/UpdateUserPwd.vue

@@ -44,7 +44,10 @@ watch(
 )
 )
 
 
 const rules: EpFormRules = {
 const rules: EpFormRules = {
-  password: [{ required: true, message: '请填写登录密码' }],
+  password: [
+    { required: true, message: '请填写登录密码' },
+    { pattern: /[0-9a-zA-Z~!@#¥%&\*]/, message: '密码限制"数字、字母、~!@#¥%&\*"' },
+  ],
   rePassword: [
   rePassword: [
     {
     {
       required: true,
       required: true,

+ 10 - 4
src/modules/admin-data/marking/index.vue

@@ -137,8 +137,14 @@ watch(
 const rules: EpFormRules = {
 const rules: EpFormRules = {
   subjectCode: [{ required: true, message: '请选择科目' }],
   subjectCode: [{ required: true, message: '请选择科目' }],
   mainNumber: [{ required: true, message: '请选择大题' }],
   mainNumber: [{ required: true, message: '请选择大题' }],
-  packageTaskCount: [{ required: true, message: '请设置每包打包人数' }],
-  dayNumber: [{ required: true, message: '请设置计划评卷天数' }],
+  packageTaskCount: [
+    { required: true, message: '请设置每包打包人数' },
+    { type: 'number', min: 0, max: 999999, message: '每包打包人数限制0-999999之间' },
+  ],
+  dayNumber: [
+    { required: true, message: '请设置计划评卷天数' },
+    { type: 'number', min: 0, max: 999999, message: '计划评卷天数限制0-999999之间' },
+  ],
   separator: [{ required: true, message: '请设置分隔符' }],
   separator: [{ required: true, message: '请设置分隔符' }],
   file: [{ required: true, message: '请选择导入文件' }],
   file: [{ required: true, message: '请选择导入文件' }],
 }
 }
@@ -179,14 +185,14 @@ const items = computed<EpFormItem[]>(() => {
       label: '每包打包人数',
       label: '每包打包人数',
       prop: 'packageTaskCount',
       prop: 'packageTaskCount',
       slotType: 'inputNumber',
       slotType: 'inputNumber',
-      slot: { placeholder: '每包打包人数' },
+      slot: { placeholder: '每包打包人数', step: 1, stepStrictly: true },
     }),
     }),
     span7({
     span7({
       rowKey: 'row-3',
       rowKey: 'row-3',
       label: '计划评卷天数',
       label: '计划评卷天数',
       prop: 'dayNumber',
       prop: 'dayNumber',
       slotType: 'inputNumber',
       slotType: 'inputNumber',
-      slot: { placeholder: '计划评卷天数' },
+      slot: { placeholder: '计划评卷天数', step: 1, stepStrictly: true },
       itemDescription: { description: '系统将按各省考生平均分配到计划评卷天数中,确保各天的评卷进度一致' },
       itemDescription: { description: '系统将按各省考生平均分配到计划评卷天数中,确保各天的评卷进度一致' },
     }),
     }),
     span7({
     span7({

+ 2 - 2
src/modules/admin-data/paper/components/rf.vue

@@ -106,7 +106,7 @@ watch(
 const rules: EpFormRules = {
 const rules: EpFormRules = {
   subjectCode: [{ required: true, message: '请选择科目' }],
   subjectCode: [{ required: true, message: '请选择科目' }],
   mainNumber: [{ required: true, message: '请选择大题' }],
   mainNumber: [{ required: true, message: '请选择大题' }],
-  prefix: [{ required: true, message: '请设置试卷密前缀' }],
+  prefix: [{ required: true, message: '请设置试卷密前缀' }],
   separator: [{ required: true, message: '请设置分隔符' }],
   separator: [{ required: true, message: '请设置分隔符' }],
   file: [{ required: true, message: '请选择导入文件' }],
   file: [{ required: true, message: '请选择导入文件' }],
 }
 }
@@ -138,7 +138,7 @@ const items = computed<EpFormItem[]>(() => {
     }),
     }),
     span8({
     span8({
       rowKey: 'row-2',
       rowKey: 'row-2',
-      label: '试卷密前缀',
+      label: '试卷密前缀',
       prop: 'prefix',
       prop: 'prefix',
       slotName: 'prefix',
       slotName: 'prefix',
       itemDescription: { description: '导用区别正常考生说试卷,导入卷密号为8位,如20000000' },
       itemDescription: { description: '导用区别正常考生说试卷,导入卷密号为8位,如20000000' },

+ 2 - 2
src/modules/admin-data/paper/components/sample.vue

@@ -109,7 +109,7 @@ const rules: EpFormRules = {
   subjectCode: [{ required: true, message: '请选择科目' }],
   subjectCode: [{ required: true, message: '请选择科目' }],
   mainNumber: [{ required: true, message: '请选择大题' }],
   mainNumber: [{ required: true, message: '请选择大题' }],
   paperType: [{ required: true, message: '请选择分组代码' }],
   paperType: [{ required: true, message: '请选择分组代码' }],
-  prefix: [{ required: true, message: '请设置试卷密前缀' }],
+  prefix: [{ required: true, message: '请设置试卷密前缀' }],
   separator: [{ required: true, message: '请设置分隔符' }],
   separator: [{ required: true, message: '请设置分隔符' }],
   file: [{ required: true, message: '请选择导入文件' }],
   file: [{ required: true, message: '请选择导入文件' }],
 }
 }
@@ -154,7 +154,7 @@ const items = computed<EpFormItem[]>(() => {
     }),
     }),
     span8({
     span8({
       rowKey: 'row-3',
       rowKey: 'row-3',
-      label: '试卷密前缀',
+      label: '试卷密前缀',
       prop: 'prefix',
       prop: 'prefix',
       slotName: 'prefix',
       slotName: 'prefix',
       itemDescription: { description: '导用区别正常考生说试卷,导入卷密号为8位,如10000000' },
       itemDescription: { description: '导用区别正常考生说试卷,导入卷密号为8位,如10000000' },

+ 29 - 5
src/modules/admin-data/task-setting/index.vue

@@ -153,17 +153,35 @@ const items = computed<EpFormItem[]>(() => [
     rowKey: 'row-3',
     rowKey: 'row-3',
     label: '任务数设置',
     label: '任务数设置',
     prop: 'markTotalCount',
     prop: 'markTotalCount',
-    slotType: 'input',
+    slotType: 'inputNumber',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+    },
     hidden: isGroupSetting.value,
     hidden: isGroupSetting.value,
   }),
   }),
   Span7({
   Span7({
     rowKey: 'row-3',
     rowKey: 'row-3',
     label: '每日任务量',
     label: '每日任务量',
     prop: 'markDayCount',
     prop: 'markDayCount',
-    slotType: 'input',
+    slotType: 'inputNumber',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+    },
     hidden: isGroupSetting.value,
     hidden: isGroupSetting.value,
   }),
   }),
-  Span7({ rowKey: 'row-3', label: '统一追加量', prop: 'markCount', slotType: 'input', hidden: !isGroupSetting.value }),
+  Span7({
+    rowKey: 'row-3',
+    label: '统一追加量',
+    prop: 'markCount',
+    slotType: 'inputNumber',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+    },
+    hidden: !isGroupSetting.value,
+  }),
   Span7({ rowKey: 'row-3', slotName: 'confirm' }),
   Span7({ rowKey: 'row-3', slotName: 'confirm' }),
 ])
 ])
 
 
@@ -176,8 +194,14 @@ const rules = computed<EpFormRules>(() => {
     obj['markingGroupNumber'] = [{ required: true, message: '请选择小组' }]
     obj['markingGroupNumber'] = [{ required: true, message: '请选择小组' }]
     obj['markCount'] = [{ required: true, message: '请设置统一追加量' }]
     obj['markCount'] = [{ required: true, message: '请设置统一追加量' }]
   } else {
   } else {
-    obj['markTotalCount'] = [{ required: true, message: '请设置任务数' }]
-    obj['markDayCount'] = [{ required: true, message: '请设置每日任务量' }]
+    obj['markTotalCount'] = [
+      { required: true, message: '请设置任务数' },
+      { type: 'number', min: 0, max: 999999, message: '任务数限制0-999999之间' },
+    ]
+    obj['markDayCount'] = [
+      { required: true, message: '请设置每日任务量' },
+      { type: 'number', min: 0, max: 999999, message: '每日任务量限制0-999999之间' },
+    ]
   }
   }
   return obj
   return obj
 })
 })

+ 6 - 2
src/modules/admin-exam/edit-exam/index.vue

@@ -12,7 +12,7 @@
 
 
 <script setup lang="ts" name="EditExam">
 <script setup lang="ts" name="EditExam">
 /** 创建考试 */
 /** 创建考试 */
-import { reactive, ref } from 'vue'
+import { reactive } from 'vue'
 import { useRouter } from 'vue-router'
 import { useRouter } from 'vue-router'
 import { ElCard, ElFormItem, ElMessage } from 'element-plus'
 import { ElCard, ElFormItem, ElMessage } from 'element-plus'
 import BaseForm from '@/components/element/BaseForm.vue'
 import BaseForm from '@/components/element/BaseForm.vue'
@@ -49,7 +49,11 @@ const model = reactive<ExtractApiParams<'saveExamInfo'>>(initModel)
 const { formRef, elFormRef, defineColumn, _ } = useForm()
 const { formRef, elFormRef, defineColumn, _ } = useForm()
 
 
 const rules: EpFormRules = {
 const rules: EpFormRules = {
-  name: [{ required: true, message: '请填写考试名称' }],
+  name: [
+    { required: true, message: '请填写考试名称' },
+    { type: 'string', max: 50, message: '考试名称长度限制50字以内' },
+    { type: 'string', pattern: /[0-9a-zA-Z-\/\u4e00-\u9fa5]/, message: '考试名称限制数字、字母、中文、-/' },
+  ],
   markingMode: [{ required: true, message: '请选择评卷模式' }],
   markingMode: [{ required: true, message: '请选择评卷模式' }],
   maxMarkingDuration: [
   maxMarkingDuration: [
     { required: true, message: '请设置在线评卷时长' },
     { required: true, message: '请设置在线评卷时长' },

+ 3 - 1
src/modules/admin-subject/manage/index.vue

@@ -122,11 +122,13 @@ const rules = computed<EpFormRules>(() => {
   return {
   return {
     code: [
     code: [
       { required: !editInfo.id, message: '请填写科目代码' },
       { required: !editInfo.id, message: '请填写科目代码' },
-      { max: 50, message: '科目代码限制50字以内' },
+      { type: 'string', max: 50, message: '科目代码限制50字以内' },
+      { pattern: /[0-9a-zA-Z]/, message: '科目代码限制"数字、字母"' },
     ],
     ],
     name: [
     name: [
       { required: true, message: '请填写科目名称' },
       { required: true, message: '请填写科目名称' },
       { max: 50, message: '科目名称限制50字以内' },
       { max: 50, message: '科目名称限制50字以内' },
+      { pattern: /[0-9a-zA-Z\u4e00-\u9fa5]/, message: '科目名称限制"数字、字母、中文"' },
     ],
     ],
     objectiveScore: [
     objectiveScore: [
       { required: true, message: '请填写科目客观分总分' },
       { required: true, message: '请填写科目客观分总分' },

+ 29 - 7
src/modules/admin-user/bulk-add-user/index.vue

@@ -60,12 +60,28 @@ const rules = computed<EpFormRules>(() => {
     mainNumber: [{ required: true, message: '请选择大题' }],
     mainNumber: [{ required: true, message: '请选择大题' }],
     markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
     markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
     role: [{ required: true, message: '请选择用户角色' }],
     role: [{ required: true, message: '请选择用户角色' }],
-    loginNameLength: [{ required: true, message: '请填写账号代码位数' }],
-    password: [{ required: true, message: '请填写用户密码' }],
+    loginNameLength: [
+      { required: true, message: '请填写账号代码位数' },
+      { type: 'number', min: 0, max: 9, message: '账号代码位数限制0-9之间' },
+    ],
+    password: [
+      { required: true, message: '请填写用户密码' },
+      { pattern: /[0-9a-zA-Z~!@#¥%&\*]/, message: '密码限制"数字、字母、~!@#¥%&\*"' },
+    ],
     enable: [{ required: true, message: '请选择用户状态' }],
     enable: [{ required: true, message: '请选择用户状态' }],
-    markingGroupAccounts: [{ required: true, message: '请填写分组账号数量' }],
-    prefix: [{ required: true, message: '请填写账号前缀' }],
-    start: [{ required: true, message: '请填写账号起始数' }],
+    markingGroupAccounts: [
+      { required: true, message: '请填写分组账号数量' },
+      { type: 'number', min: 0, max: 999999, message: '分组账号数量限制0-999999之间' },
+    ],
+    prefix: [
+      { required: true, message: '请填写账号前缀' },
+      { type: 'string', max: 50, message: '账号前缀限制50字以内' },
+      { pattern: /[0-9a-zA-Z]/, message: '账号前缀限制"数字、字母"' },
+    ],
+    start: [
+      { required: true, message: '请填写账号起始数' },
+      { type: 'number', min: 0, max: 999999, message: '账号起始数限制0-999999之间' },
+    ],
   }
   }
 })
 })
 
 
@@ -157,24 +173,30 @@ const items = computed<EpFormItem[]>(() => {
       prop: 'loginNameLength',
       prop: 'loginNameLength',
       slot: {
       slot: {
         placeholder: '账号代码位数',
         placeholder: '账号代码位数',
+        step: 1,
+        stepStrictly: true,
       },
       },
     }),
     }),
     span7({
     span7({
       rowKey: 'row-7',
       rowKey: 'row-7',
       label: '起始数',
       label: '起始数',
-      slotType: 'input',
+      slotType: 'inputNumber',
       prop: 'start',
       prop: 'start',
       slot: {
       slot: {
         placeholder: '起始数',
         placeholder: '起始数',
+        step: 1,
+        stepStrictly: true,
       },
       },
     }),
     }),
     span7({
     span7({
       rowKey: 'row-7',
       rowKey: 'row-7',
       label: '账号数量',
       label: '账号数量',
-      slotType: 'input',
+      slotType: 'inputNumber',
       prop: 'markingGroupAccounts',
       prop: 'markingGroupAccounts',
       slot: {
       slot: {
         placeholder: '账号数量',
         placeholder: '账号数量',
+        step: 1,
+        stepStrictly: true,
       },
       },
     }),
     }),
     span7({
     span7({

+ 9 - 2
src/modules/admin-user/edit-user/index.vue

@@ -56,9 +56,16 @@ const rules = computed<EpFormRules>(() => {
     mainNumber: [{ required: true, message: '请选择大题' }],
     mainNumber: [{ required: true, message: '请选择大题' }],
     markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
     markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
     role: [{ required: true, message: '请选择用户角色' }],
     role: [{ required: true, message: '请选择用户角色' }],
-    loginName: [{ required: true, message: '请填写账号代码' }],
-    password: [{ required: true, message: '请填写用户密码' }],
+    loginName: [
+      { required: true, message: '请填写账号代码' },
+      { pattern: /[0-9a-zA-Z]/, message: '账号代码限制"数字、字母"' },
+    ],
+    password: [
+      { required: true, message: '请填写用户密码' },
+      { pattern: /[0-9a-zA-Z~!@#¥%&\*]/, message: '密码限制"数字、字母、~!@#¥%&\*"' },
+    ],
     enable: [{ required: true, message: '请选择用户状态' }],
     enable: [{ required: true, message: '请选择用户状态' }],
+    name: [{ type: 'string', max: 50, message: '用户名称限制50字以内' }],
   }
   }
 })
 })
 
 

+ 9 - 2
src/modules/bootstrap/init-name/index.vue

@@ -3,7 +3,7 @@
     <div class="init-name-modal">
     <div class="init-name-modal">
       <div class="p-l-large modal-header">首次登录,请填写姓名</div>
       <div class="p-l-large modal-header">首次登录,请填写姓名</div>
       <div class="login-modal-content">
       <div class="login-modal-content">
-        <base-form ref="formRef" :model="model" :items="items" size="large"></base-form>
+        <base-form ref="formRef" :rules="rules" :model="model" :items="items" size="large"></base-form>
         <div class="m-t-super-large">
         <div class="m-t-super-large">
           <confirm-button ok-text="确定" cancel-text="退出" :loading="loading" @confirm="onSubmit" @cancel="logout()">
           <confirm-button ok-text="确定" cancel-text="退出" :loading="loading" @confirm="onSubmit" @cancel="logout()">
           </confirm-button>
           </confirm-button>
@@ -23,7 +23,7 @@ import useForm from '@/hooks/useForm'
 import useMainStore from '@/store/main'
 import useMainStore from '@/store/main'
 import { logout } from '@/utils/shared'
 import { logout } from '@/utils/shared'
 
 
-import type { EpFormItem } from 'global-type'
+import type { EpFormItem, EpFormRules } from 'global-type'
 
 
 const { replace } = useRouter()
 const { replace } = useRouter()
 
 
@@ -33,6 +33,13 @@ const model = reactive<{ name: string }>({ name: '' })
 
 
 const { formRef, elFormRef } = useForm()
 const { formRef, elFormRef } = useForm()
 
 
+const rules: EpFormRules = {
+  name: [
+    { required: true, message: '请填写用户姓名' },
+    { type: 'string', max: 50, message: '用户姓名限制50字以内' },
+  ],
+}
+
 const items: EpFormItem[] = [
 const items: EpFormItem[] = [
   {
   {
     prop: 'name',
     prop: 'name',

+ 5 - 2
src/modules/example/Components.vue

@@ -257,8 +257,11 @@ const items: EpFormProps<typeof formModel>['items'] = [
     rowKey: 'row-3',
     rowKey: 'row-3',
     label: '计划评卷天数',
     label: '计划评卷天数',
     prop: 'day',
     prop: 'day',
-    slotType: 'input',
-    slot: {},
+    slotType: 'inputNumber',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+    },
     itemDescription: {
     itemDescription: {
       requiredAsterisk: true,
       requiredAsterisk: true,
       description: '系统将按各省考生平均分配到计划评卷天数中,确保各天的评卷进度一致',
       description: '系统将按各省考生平均分配到计划评卷天数中,确保各天的评卷进度一致',

+ 17 - 5
src/modules/expert/standard/index.vue

@@ -14,7 +14,7 @@
         </div>
         </div>
       </div>
       </div>
       <div class="flex direction-column p-base radius-base fill-blank scroll-auto m-l-base table-view">
       <div class="flex direction-column p-base radius-base fill-blank scroll-auto m-l-base table-view">
-        <base-form size="small" :model="formModel" :items="formItems" :label-width="useVW(52)">
+        <base-form ref="formRef" size="small" :model="formModel" :items="formItems" :label-width="useVW(52)">
           <template #form-item-search>
           <template #form-item-search>
             <el-button type="primary" @click="onSearch">查询</el-button>
             <el-button type="primary" @click="onSearch">查询</el-button>
           </template>
           </template>
@@ -61,7 +61,7 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 
 
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
-import type { MarkHeaderInstance, EpFormItem, EpTableColumn } from 'global-type'
+import type { MarkHeaderInstance, EpFormItem, EpTableColumn, EpFormRules } from 'global-type'
 
 
 type RowType = ExtractMultipleApiResponse<'getStandardList'> & { index: number }
 type RowType = ExtractMultipleApiResponse<'getStandardList'> & { index: number }
 
 
@@ -102,7 +102,7 @@ watch(dataModel, () => {
   formModel.mainNumber = dataModel.question
   formModel.mainNumber = dataModel.question
 })
 })
 
 
-const { defineColumn, _ } = useForm()
+const { formRef, elFormRef, defineColumn, _ } = useForm()
 
 
 const span10 = defineColumn(_, '', { span: 10 })
 const span10 = defineColumn(_, '', { span: 10 })
 const span5 = defineColumn(_, '', { span: 5 })
 const span5 = defineColumn(_, '', { span: 5 })
@@ -133,13 +133,25 @@ const formItems = computed<EpFormItem[]>(() => [
     rowKey: 'row-2',
     rowKey: 'row-2',
     label: '分数',
     label: '分数',
     prop: 'scoreStart',
     prop: 'scoreStart',
-    slotType: 'input',
+    slotType: 'inputNumber',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+    },
   }),
   }),
   span5({
   span5({
     rowKey: 'row-2',
     rowKey: 'row-2',
     label: '至',
     label: '至',
     prop: 'scoreEnd',
     prop: 'scoreEnd',
-    slotType: 'input',
+    slotType: 'inputNumber',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+    },
   }),
   }),
 ])
 ])
 
 

+ 12 - 0
src/modules/marking/inquiry/index.vue

@@ -181,12 +181,24 @@ const items = computed<EpFormItem[]>(() => [
     label: '分数',
     label: '分数',
     slotType: 'inputNumber',
     slotType: 'inputNumber',
     prop: 'scoreStart',
     prop: 'scoreStart',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+    },
   }),
   }),
   FourRow({
   FourRow({
     label: '至',
     label: '至',
     labelWidth: useVW(35),
     labelWidth: useVW(35),
     slotType: 'inputNumber',
     slotType: 'inputNumber',
     prop: 'scoreEnd',
     prop: 'scoreEnd',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+    },
   }),
   }),
   Span7(
   Span7(
     {
     {