Jelajahi Sumber

fix: 自营管理弹窗补全前端必填校验规则(rules + 日期区间实时同步)

LaveyD 3 minggu lalu
induk
melakukan
72abae6855

+ 17 - 1
src/views/selfManage/saleCalendar/CalendarRuleDialog.vue

@@ -6,6 +6,7 @@
     append-to-body>
     <el-form
       :model="form"
+      :rules="rules"
       ref="form"
       label-width="100px">
       <el-form-item
@@ -110,7 +111,22 @@ export default {
       SELF_WEEKDAYS,
       form: this.emptyForm(),
       specificDates: [],
-      weeklyRange: []
+      weeklyRange: [],
+      rules: {
+        price: [{
+          required: true,
+          validator: (rule, value, callback) => {
+            if (value === null || value === undefined || value === '' || Number(value) <= 0) {
+              callback(new Error('请输入大于 0 的价格'))
+            } else {
+              callback()
+            }
+          },
+          trigger: 'change'
+        }],
+        isSale: [{ required: true, message: '请选择是否可售', trigger: 'change' }],
+        ruleType: [{ required: true, message: '请选择规则类型', trigger: 'change' }]
+      }
     }
   },
   methods: {

+ 6 - 1
src/views/selfManage/scenic/FormDialog.vue

@@ -6,6 +6,7 @@
     width="640px">
     <el-form
       :model="form"
+      :rules="rules"
       ref="form"
       class="form-wrap"
       label-width="110px">
@@ -123,7 +124,11 @@ export default {
       fileList: [],
       uploadUrl: window.config && window.config.uploadUrl ? window.config.uploadUrl : 'https://pres.cleartv.cn/upload',
       previewVisible: false,
-      previewUrl: ''
+      previewUrl: '',
+      rules: {
+        name: [{ required: true, message: '请输入景点名称', trigger: 'blur' }],
+        isOpen: [{ required: true, message: '请选择开放状态', trigger: 'change' }]
+      }
     }
   },
   methods: {

+ 19 - 12
src/views/selfManage/thirdParty/FormDialog.vue

@@ -6,6 +6,7 @@
     width="560px">
     <el-form
       :model="form"
+      :rules="rules"
       ref="form"
       class="form-wrap"
       label-width="110px">
@@ -111,7 +112,24 @@ export default {
       visible: false,
       submitting: false,
       dialogType: 'add',
-      form: this.emptyForm()
+      form: this.emptyForm(),
+      rules: {
+        name: [{ required: true, message: '请输入分销商名称', trigger: 'blur' }],
+        loginName: [{ required: true, message: '请输入登录名', trigger: 'blur' }],
+        password: [{
+          message: '请输入密码',
+          trigger: 'blur',
+          validator: (rule, value, callback) => {
+            if (this.dialogType === 'add' && !value) {
+              callback(new Error('请输入密码'))
+            } else if (value && !PWD_RE.test(value)) {
+              callback(new Error('至少 8 位,且包含大写字母、小写字母和数字'))
+            } else {
+              callback()
+            }
+          }
+        }]
+      }
     }
   },
   methods: {
@@ -161,17 +179,6 @@ export default {
     submit () {
       this.$refs.form.validate(valid => {
         if (!valid) return
-        if (this.dialogType === 'add') {
-          if (!PWD_RE.test(this.form.password)) {
-            this.$message.warning('密码至少 8 位,且包含大写字母、小写字母和数字')
-            return
-          }
-        } else if (this.form.password) {
-          if (!PWD_RE.test(this.form.password)) {
-            this.$message.warning('新密码至少 8 位,且包含大写字母、小写字母和数字')
-            return
-          }
-        }
         this.submitting = true
         const payload = { ...this.form }
         if (this.dialogType === 'edit' && !payload.password) {

+ 14 - 0
src/views/selfManage/thirdParty/MoneyDialog.vue

@@ -9,6 +9,7 @@
     </div>
     <el-form
       :model="form"
+      :rules="rules"
       ref="form"
       label-width="100px">
       <el-form-item
@@ -53,6 +54,19 @@ export default {
       row: {},
       form: {
         amount: 0
+      },
+      rules: {
+        amount: [{
+          required: true,
+          validator: (rule, value, callback) => {
+            if (value === null || value === undefined || value === '' || Number(value) <= 0) {
+              callback(new Error('请输入大于 0 的金额(最小 0.01)'))
+            } else {
+              callback()
+            }
+          },
+          trigger: 'change'
+        }]
       }
     }
   },

+ 27 - 1
src/views/selfManage/ticketType/FormDialog.vue

@@ -6,6 +6,7 @@
     width="760px">
     <el-form
       :model="form"
+      :rules="rules"
       ref="form"
       class="form-wrap"
       label-width="120px">
@@ -413,7 +414,26 @@ export default {
       scenicOptions: [],
       saleDateRange: [],
       saleTimeRange: [],
-      useDateRange: []
+      useDateRange: [],
+      rules: {
+        ticketTypeId: [{ required: true, message: '请选择线下票种', trigger: 'change' }],
+        category: [{ required: true, message: '请选择票种大类', trigger: 'change' }],
+        name: [{ required: true, message: '请输入票种名称', trigger: 'blur' }],
+        price: [{
+          required: true,
+          validator: (rule, value, callback) => {
+            if (value === null || value === undefined || value === '' || Number(value) <= 0) {
+              callback(new Error('请输入大于 0 的底价'))
+            } else {
+              callback()
+            }
+          },
+          trigger: 'change'
+        }],
+        saleDateStart: [{ required: true, message: '请选择可售日期区间', trigger: 'change' }],
+        saleTimeStart: [{ required: true, message: '请选择每日可售时间', trigger: 'change' }],
+        channels: [{ required: true, type: 'array', min: 1, message: '请至少勾选一个销售渠道', trigger: 'change' }]
+      }
     }
   },
   computed: {
@@ -424,6 +444,12 @@ export default {
       return (this.selectedOffline && this.selectedOffline.batchConfigList) || []
     }
   },
+  watch: {
+    // 日期/时间区间组件绑定的是数组字段,需实时同步回 form,保证 validate 读到最新值
+    saleDateRange: 'syncDateRange',
+    saleTimeRange: 'syncDateRange',
+    useDateRange: 'syncDateRange'
+  },
   methods: {
     emptyForm () {
       return {