From e1b028d486713eaf55aaf35fbf334aa568059c0d Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期二, 14 四月 2026 15:46:54 +0800
Subject: [PATCH] 项目复制

---
 src/utils/ruleGenerator.js |  227 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 227 insertions(+), 0 deletions(-)

diff --git a/src/utils/ruleGenerator.js b/src/utils/ruleGenerator.js
new file mode 100644
index 0000000..7a7aed7
--- /dev/null
+++ b/src/utils/ruleGenerator.js
@@ -0,0 +1,227 @@
+//琛ㄥ崟鏍¢獙瑙勫垯
+
+export const ruleGenerator = {
+  // 蹇呭~瀛楁
+  required(message = '姝ゅ瓧娈典负蹇呭~椤�') {
+    return { required: true, message, trigger: ['blur', 'change'] }
+  },
+  
+  // 闀垮害闄愬埗
+  length(min, max, fieldName = '') {
+    const message = fieldName 
+      ? `${fieldName}闀垮害搴斿湪${min}鍒�${max}涓瓧绗︿箣闂碻
+      : `闀垮害搴斿湪${min}鍒�${max}涓瓧绗︿箣闂碻
+    
+    return { 
+      validator: (rule, value, callback) => {
+        if (!value || (value.length >= min && value.length <= max)) {
+          callback()
+        } else {
+          callback(new Error(message))
+        }
+      }, 
+      trigger: 'blur' 
+    }
+  },
+  
+  // 鎵嬫満鍙烽獙璇�
+  phone() {
+    return {
+      validator: (rule, value, callback) => {
+        const reg = /^1[3-9]\d{9}$/
+        if (!value || reg.test(value)) {
+          callback()
+        } else {
+          callback(new Error('璇疯緭鍏ユ纭殑鎵嬫満鍙风爜'))
+        }
+      },
+      trigger: ['blur']
+    }
+  },
+  //楠岃瘉鐮侀獙璇�
+  code() {
+    return {
+      validator: (rule, value, callback) => {
+        const reg = /^\d{4}$/
+        if (!value || reg.test(value)) {
+          callback()
+        } else {
+          callback(new Error('璇疯緭鍏ユ纭殑楠岃瘉鐮�'))
+        }
+      },
+      trigger: ['blur', 'change']
+    }
+  },
+  password() {
+    return {
+      validator: (rule, value, callback) => {
+        const reg = /^\d{6}$/
+        if (!value || reg.test(value)) {
+          callback()
+        } else {
+          callback(new Error('瀵嗙爜鏍煎紡涓�6涓瓧绗�'))
+        }
+      },
+      trigger: ['blur', 'change']
+    }
+  },
+  
+  // 閭楠岃瘉
+  email() {
+    return {
+      validator: (rule, value, callback) => {
+        const reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
+        if (!value || reg.test(value)) {
+          callback()
+        } else {
+          callback(new Error('璇疯緭鍏ユ纭殑閭鍦板潃'))
+        }
+      },
+      trigger: 'blur'
+    }
+  },
+
+  // 澶т簬绛変簬0鐨勬鏁存暟楠岃瘉
+  positiveInteger(min = 0) {
+    return {
+      validator: (rule, value, callback) => {
+        if (!value) {
+          callback()
+        } else {
+          // 妫�鏌ユ槸鍚︿负姝f暣鏁颁笖澶т簬绛変簬min
+          const num = Number(value)
+          const isPositiveInteger = Number.isInteger(num) && num >= min && num >= 0
+          if (isPositiveInteger) {
+            callback()
+          } else {
+            callback(new Error(min === 0 ? '璇疯緭鍏ュぇ浜庣瓑浜�0鐨勬鏁存暟' : `璇疯緭鍏ュぇ浜庣瓑浜�${min}鐨勬鏁存暟`))
+          }
+        }
+      },
+      trigger: ['blur', 'change']
+    }
+  },
+
+  // 韬唤璇佸彿楠岃瘉
+  idCard() {
+    return {
+      validator: (rule, value, callback) => {
+        if (!value) {
+          callback()
+          return
+        }
+
+        // 18浣嶈韩浠借瘉姝e垯琛ㄨ揪寮�
+        const reg18 = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/
+        // 15浣嶈韩浠借瘉姝e垯琛ㄨ揪寮忥紙鑰佸紡锛�
+        const reg15 = /^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$/
+
+        if (reg18.test(value)) {
+          // 18浣嶈韩浠借瘉鏍¢獙鐮侀獙璇�
+          const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
+          const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
+          let sum = 0
+          for (let i = 0; i < 17; i++) {
+            sum += parseInt(value[i]) * weights[i]
+          }
+          const checkCode = checkCodes[sum % 11]
+          if (checkCode.toUpperCase() === value[17].toUpperCase()) {
+            callback()
+          } else {
+            callback(new Error('璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�'))
+          }
+        } else if (reg15.test(value)) {
+          // 15浣嶈韩浠借瘉鏍¢獙閫氳繃
+          callback()
+        } else {
+          callback(new Error('璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�'))
+        }
+      },
+      trigger: ['blur', 'change']
+    }
+  },
+
+  // 缁熶竴绀句細淇$敤浠g爜楠岃瘉
+  creditCode() {
+    return {
+      validator: (rule, value, callback) => {
+        if (!value) {
+          callback()
+          return
+        }
+
+        // 缁熶竴绀句細淇$敤浠g爜鐢�18浣嶅瓧绗︾粍鎴愶細1浣嶇櫥璁扮鐞嗛儴闂ㄤ唬鐮� + 1浣嶆満鏋勭被鍒唬鐮� + 6浣嶇櫥璁扮鐞嗘満鍏宠鏀垮尯鍒掔爜 + 9浣嶄富浣撹瘑鍒爜锛堢粍缁囨満鏋勪唬鐮侊級 + 1浣嶆牎楠岀爜
+        const reg = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/
+
+        if (!reg.test(value)) {
+          callback(new Error('璇疯緭鍏ユ纭殑缁熶竴绀句細淇$敤浠g爜'))
+          return
+        }
+
+        // 鏍¢獙鐮佽绠�
+        const weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
+        const checkCodes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y']
+
+        let sum = 0
+        for (let i = 0; i < 17; i++) {
+          const char = value[i]
+          // 灏嗗瓧绗﹁浆鎹负瀵瑰簲鐨勬暟鍊�
+          const num = char >= '0' && char <= '9' ? parseInt(char) : char.charCodeAt(0) - 55
+          sum += num * weights[i]
+        }
+
+        const mod = 31
+        const remainder = sum % mod
+        const checkCode = checkCodes[(mod - remainder) % mod]
+
+        if (checkCode === value[17].toUpperCase()) {
+          callback()
+        } else {
+          callback(new Error('璇疯緭鍏ユ纭殑缁熶竴绀句細淇$敤浠g爜'))
+        }
+      },
+      trigger: ['blur', 'change']
+    }
+  },
+
+  // 閲戦楠岃瘉锛堜繚鐣�2浣嶅皬鏁帮級
+  money(min = 0) {
+    return {
+      validator: (rule, value, callback) => {
+        if (!value) {
+          callback()
+          return
+        }
+
+        // 閲戦姝e垯锛氭暣鏁伴儴鍒嗕笉闄愪綅鏁帮紝灏忔暟閮ㄥ垎鏈�澶�2浣�
+        const reg = /^(0|[1-9]\d*)(\.\d{1,2})?$/
+
+        if (!reg.test(value)) {
+          callback(new Error('璇疯緭鍏ユ纭殑閲戦'))
+          return
+        }
+
+        const num = parseFloat(value)
+        if (num < min) {
+          callback(new Error(`閲戦涓嶈兘灏忎簬${min}`))
+        } else {
+          callback()
+        }
+      },
+      trigger: ['blur', 'change']
+    }
+  },
+    // 澶氶�夋楠岃瘉
+  checkbox(message) {
+    return { 
+      validator: (rule, value, callback) => {
+        if (!value) {
+          callback(new Error(message));
+        } else {
+          callback();
+        }
+      }, 
+      trigger: 'change' 
+    }
+  },
+}
\ No newline at end of file

--
Gitblit v1.8.0