From 5aece3ce7e010459757739e54e359506d1ece081 Mon Sep 17 00:00:00 2001
From: jonkee <zzzgoo@gmail.com>
Date: Thu, 16 Nov 2017 20:51:19 +0800
Subject: [PATCH] add form validation demo

---
 package.json                     |   5 +-
 src/router/index.js              |   1 +
 src/views/example/validation.vue | 110 +++++++++++++++++++++++++++++++
 3 files changed, 114 insertions(+), 2 deletions(-)
 create mode 100644 src/views/example/validation.vue

diff --git a/package.json b/package.json
index 2723c6a4..978c2dcc 100644
--- a/package.json
+++ b/package.json
@@ -20,8 +20,10 @@
     "echarts": "3.8.2",
     "element-ui": "1.4.2",
     "file-saver": "1.3.3",
+    "hakim": "^0.2.5",
     "js-cookie": "2.1.4",
     "jsonlint": "1.6.2",
+    "jszip": "^3.1.4",
     "mockjs": "1.0.1-beta3",
     "normalize.css": "7.0.0",
     "nprogress": "0.2.0",
@@ -36,8 +38,7 @@
     "vue-splitpane": "^1.0.0",
     "vuedraggable": "2.14.1",
     "vuex": "2.3.1",
-    "xlsx": "^0.10.8",
-    "jszip": "^3.1.4"
+    "xlsx": "^0.10.8"
   },
   "devDependencies": {
     "autoprefixer": "7.1.1",
diff --git a/src/router/index.js b/src/router/index.js
index a4cc7b9b..1c16ed16 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -119,6 +119,7 @@ export const asyncRouterMap = [
       },
       { path: 'form/edit', icon: 'form', component: _import('example/form'), name: '编辑Form', meta: { isEdit: true }},
       { path: 'form/create', icon: 'form', component: _import('example/form'), name: '创建Form' },
+      { path: 'form/validate', icon: 'form', component: _import('example/validation'), name: '验证Form' },
       { path: 'tab/index', icon: 'tab', component: _import('example/tab/index'), name: 'Tab' }
     ]
   },
diff --git a/src/views/example/validation.vue b/src/views/example/validation.vue
new file mode 100644
index 00000000..029e9c27
--- /dev/null
+++ b/src/views/example/validation.vue
@@ -0,0 +1,110 @@
+<template>
+  <div>
+    <div class="info">
+      element-ui自带的表单验证,有诸多不足。比如:一个表单项,要么为空,要么为整数,如何写?为了解决这个问题,引入hakim这个小工具,
+      可以用<span class="code">与</span>与<span class="code">或</span>的方式来组合多条规则,灵活方便
+      https://github.com/zzzgit/hakim
+    </div>
+    <div style="width: 400px">
+      <el-form :model="formModel" :rules="rules" ref="form" label-width="250px">
+        <el-form-item label="大于0的数字,最多1位小数" prop="item1">
+          <el-input v-model="formModel.item1"></el-input>
+        </el-form-item>
+        <el-form-item label="同时包含英文和数字" prop="item2">
+          <el-input v-model="formModel.item2"></el-input>
+        </el-form-item>
+        <el-form-item label="为空,为正整数,或者为电子邮件" prop="item3">
+          <el-input v-model="formModel.item3"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submitForm('form')">校验</el-button>
+          <el-button @click="resetForm('form')">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+
+<script>
+import Hakim from 'hakim'
+export default {
+  name: 'articleDetail',
+  data() {
+    return {
+      formModel: {
+        item1: null,
+        item2: null,
+        item3: null
+      },
+      rules: {
+        item1: [
+          {
+            required: true,
+            trigger: 'change',
+            validator: (rule, value, resolve) => {
+              if (!new Hakim([{ is: 'number' }, { gt: 0 }, { dplacesLt: 2 }]).validate(value)) {
+                return resolve(new Error('大于0的数字,最多1位小数'))
+              }
+              return resolve()
+            }
+          }
+        ],
+        item2: [
+          {
+            required: true,
+            trigger: 'change',
+            validator: (rule, value, resolve) => {
+              if (!new Hakim([{ isNot: 'empty' }, { exist: 'latin' }, { exist: 'digit' }]).validate(value)) {
+                return resolve(new Error('同时包含英文和数字'))
+              }
+              return resolve()
+            }
+          }
+        ],
+        item3: [
+          {
+            trigger: 'change',
+            validator: (rule, value, resolve) => {
+              if (!new Hakim([{ is: 'empty' }, [{ is: 'number' }, { is: 'positive' }, { is: 'integer' }], { is: 'email' }, true]).validate(value)) {
+                return resolve(new Error('为空,为正整数,或者为电子邮件'))
+              }
+              return resolve()
+            }
+          }
+        ]
+      }
+    }
+  },
+  methods: {
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          alert('submit!')
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields()
+    }
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+  @import "src/styles/mixin.scss";
+  .info{
+    height: 80px;
+    padding-top: 20px;
+    padding-left: 10px;
+    background-color: gray;
+    margin-bottom: 20px;
+  }
+  .code{
+    background-color: yellow;
+  }
+
+</style>