Ver código fonte

fix:问卷加入正则表达式

magic v 4 anos atrás
pai
commit
dce98fcccd

+ 18 - 8
src/common/scss/bl-flex.scss

@@ -46,6 +46,9 @@
     &:first-child {
       margin-top: $sp-md;
     }
+    &[not-first] {
+      margin-top: 0;
+    }
   }
 
   // 方框大小,缩略之类的作用
@@ -102,6 +105,12 @@
   &[shadow], [shadow] {
     box-shadow: 0 0 12px 0 $color-5;
   }
+  &[shadow-top], [shadow-top] {
+    box-shadow: 0 -6px 12px 0 $color-5;
+  }
+  &[shadow-bottom], [shadow-bottom] {
+    box-shadow: 0 6px 12px 0 $color-5;
+  }
 
   &[opacity-1], [opacity-1] {
     opacity: 0.1;
@@ -148,16 +157,13 @@
     border-radius: $sp-md $sp-md 0 0;
     overflow: hidden;
   }
-  &[round-bottom], [round-top] {
+  &[round-bottom], [round-bottom] {
     border-radius: 0 0 $sp-md $sp-md;
     overflow: hidden;
   }
-  &[round-pie1], [round-pie1] {
-    border-radius: 9999px;
-  }
 
   // 边框
-  &[border], [boder] {
+  &[border], [border] {
     border: 1px solid $color-6;
   }
   &[border-bottom],[border-bottom] {
@@ -166,9 +172,6 @@
   &[border-top],[border-top] {
     border-top: 1px solid $color-6;
   }
-  &[border0], [border0] {
-    border: 0;
-  }
 
   // 相对定位 & 绝对定位
   &[relative], [relative] {
@@ -232,6 +235,9 @@
   &[color-text], [color-text] {
     color: $color-1;
   }
+  &[color-label], [color-label] {
+    color: $color-2;
+  }
   &[color-des], [color-des] {
     color: $color-3;
   }
@@ -486,4 +492,8 @@
   &[padding-bottom-xl], [padding-bottom-xl] {
     padding-bottom: $sp-xl;
   }
+
+  &[not-hidden], [not-hidden] {
+    overflow: visible;
+  }
 }

+ 34 - 17
src/pages/FormVolume/mixins/index.js

@@ -173,29 +173,46 @@ export default {
       let edatas = datas || [this.data]
       this.loading.submit = true
       try {
-        await Promise.all(edatas.map(data => {
-          return this.isForm(data.result, item => {
-            this.$dialog.alert({
-              title: '必填项',
-              message: `${item.title}`,
-            })
-          })
+        // await Promise.all(edatas.map(data => {
+        //   return this.isForm(data.result, item => {
+        //     this.$dialog.alert({
+        //       title: '必填项',
+        //       message: `${item.title}`,
+        //     })
+        //   })
+        // }))
+        
+        let ruleData = {}
+        let rule = {}
+        edatas.forEach(({ result }, rIndex) => result.forEach((item, index) => {
+          let k = `${rIndex}_${index}_val`
+          ruleData[k] = item.val
+          let reg = item.reg ? new RegExp(item.reg) : null
+          rule[k] = {
+            validator: (item.required && item.val instanceof Array) 
+              ? (value, rule) => !!value.length
+              : reg,
+            required: !!item.required,
+            message: item.regexp_message || `必填项\n${item.title}`
+          }
         }))
+
+        await this.$blRule(ruleData, rule, message => {
+          this.$toast(message)
+        })
+
+        await this.$dialog.confirm({
+          title: '模拟提交',
+          message: '请确认无误提交?',
+        })
+        ld = this.$toast.loading({ message: '提交中...', duration: 0 })
+
         if (this.isEdit) {
-          await this.$dialog.confirm({
-            title: '模拟提交',
-            message: '请确认无误提交?',
-          })
-          ld = this.$toast.loading({ message: '提交中...', duration: 0 })
           await new Promise(r => setTimeout(r, 2500))
           this.btnOpenSuccess()
           throw new Error('模拟提交')
         }
-        await this.$dialog.confirm({
-          title: '提示',
-          message: '请确认无误提交?',
-        })
-        ld = this.$toast.loading({ message: '提交中...', duration: 0 })
+
         let pms = edatas.map(data => this.btnSubmitItem(data.result, data.query))
         let arrRes = await Promise.all(pms)
         if (pms.length === 1 && this.$route.query.topic_id == 1) {

+ 4 - 0
src/pages/Manager/common.scss

@@ -43,5 +43,9 @@
     -webkit-overflow-scrolling: touch;
   }
 }
+.attr-input {
+  border: 0;
+  padding: $sp-sm 0;
+}
 
 

+ 25 - 8
src/pages/Manager/index.vue

@@ -186,14 +186,6 @@
                     type="textarea"
                     rows="1"
                     autosize />
-                  <van-field name="radio" label="是否必填">
-                    <template #input>
-                      <van-radio-group v-model="dataItem.required" direction="horizontal">
-                        <van-radio :name="1">是</van-radio>
-                        <van-radio :name="0">否</van-radio>
-                      </van-radio-group>
-                    </template>
-                  </van-field>
                   <van-field 
                     :value="dataItem.content.map(item => `${item.title}${item.memo ? ' | ' : ''}${item.memo||''}`).join('\n')"
                     label="题目选项" 
@@ -202,6 +194,31 @@
                     rows="5"
                     autosize
                     @change="onChangeContent" />
+                  <van-field name="radio" label="是否必填">
+                    <template #input>
+                      <van-radio-group v-model="dataItem.required" direction="horizontal">
+                        <van-radio :name="1">是</van-radio>
+                        <van-radio :name="0">否</van-radio>
+                      </van-radio-group>
+                    </template>
+                  </van-field>
+                  <van-field name="radio" label="规则验证">
+                    <template #input>
+                      <div class="bl-flex" column>
+                        <div margin-bottom-lg>
+                          <div border-bottom>
+                            <input class="attr-input" placeholder="请输入正则表达式" w100 v-model="dataItem.reg" />
+                          </div>
+                          <div border-bottom>
+                            <input class="attr-input" placeholder="请输入验证消息" w100 v-model="dataItem.regexp_message" />
+                          </div>
+                        </div>
+                        <van-radio-group v-model="dataItem.reg" @change="onRegExp" direction="horizontal">
+                          <van-radio :name="item.reg" v-for="(item, index) in regexp" :key="index">{{ item.name }}</van-radio>
+                        </van-radio-group>
+                      </div>
+                    </template>
+                  </van-field>
                   <van-field name="radio" label="对齐方式">
                     <template #input>
                       <van-radio-group v-model="dataItem.layout_align" direction="horizontal">

+ 2 - 0
src/pages/Manager/js/config.js

@@ -33,6 +33,8 @@ export function dataResult (opt) {
     "layout_align": "", // left 左对齐, right 右对齐
     "layout_inline": 0, // 0 继承 1 水平 2 垂直
     "val": "",  // 答案
+    "reg": "",  // 正则
+    "regexp_message": "", // 正则消息提醒
     ...opt
   }
 }

+ 13 - 1
src/pages/Manager/mixins/attribute.js

@@ -9,7 +9,12 @@ export default {
         attr: true,
         compt: false
       },
-      attrRemoveItems: []
+      attrRemoveItems: [],
+      regexp: [
+        { name: '身份证', reg: '^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$', message: '身份号格式错误' },
+        { name: '手机号', reg: '^[1]([3-9])[0-9]{9}$', message: '手机号格式错误' },
+        { name: '体温', reg: '((^3[5-9])(\.\d)?|^(4[0-2])(\.\d)?)$', message: '体温格式错误' }
+      ]
     }
   },
   computed: {
@@ -205,6 +210,13 @@ export default {
       } catch (err) {
         
       }
+    },
+    onRegExp (reg) {
+      let item = this.regexp.filter(it => it.reg === reg)[0]
+      // this.dataItem.reg = item.reg
+      if (item) {
+        this.dataItem.regexp_message = item.message
+      }
     }
   },
   created() {

+ 1 - 1
src/pages/Manager/mixins/index.js

@@ -112,7 +112,7 @@ export default {
       let ld = null
       try {
         ld = !b && this.$toast.loading({ message: '保存中...', duration: 0 })
-        let configKey = ['detail_id', 'content', 'layout_align', 'layout_inline', 'required', 'title', 'type', 'val', 'visual']
+        let configKey = ['detail_id', 'content', 'layout_align', 'layout_inline', 'required', 'title', 'type', 'val', 'visual', 'reg', 'regexp_message']
         let configTypeArr = ['checkbox']
         let obj = JSON.parse(JSON.stringify(this.data))
         // 增加删除状态