diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..af89681 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(find:*)", + "Bash(ls:*)", + "Bash(find:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2561bb4..a29738a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,55 @@ +# System files .DS_Store -node_modules/ +Thumbs.db + +# IDE and editor files +.idea/ +.vscode/ +.hbuilderx/ +.project +.settings/ + +# Uni-app specific unpackage/ dist/ +.hybrid/ +uni_modules/.git/ +src/uni_modules/.git/ -# local env files -.env.local -.env.*.local - -# Log files +# Node.js related +node_modules/ npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-lock.yaml -# Editor directories and files -.project -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw* +# Environment variables +.env.local +.env.*.local + +# Build output and cache +/.hbuilderx/ +/unpackage/dist/ +/unpackage/cache/ +/unpackage/release/ + +# Log files +*.log + +# OS generated files +*.swp +*.swo +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Deployment scripts +deploy.sh + +# Temporary files +*.tmp +*.temp diff --git a/.kilocode/mcp.json b/.kilocode/mcp.json new file mode 100644 index 0000000..7001130 --- /dev/null +++ b/.kilocode/mcp.json @@ -0,0 +1,3 @@ +{ + "mcpServers": {} +} \ No newline at end of file diff --git a/doc/后台集成接口类.rar b/doc/后台集成接口类.rar new file mode 100644 index 0000000..aec45ce Binary files /dev/null and b/doc/后台集成接口类.rar differ diff --git a/h5.html b/h5.html new file mode 100644 index 0000000..7cab347 --- /dev/null +++ b/h5.html @@ -0,0 +1,50 @@ + + + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + + + + + + + + +
+ + + + diff --git a/js_sdk/mineking-tool/tool.js b/js_sdk/mineking-tool/tool.js new file mode 100644 index 0000000..f2e96ce --- /dev/null +++ b/js_sdk/mineking-tool/tool.js @@ -0,0 +1,637 @@ +// 判断类型集合 +export const checkStr = (str, type) => { + switch (type) { + case 'phone': //手机号码 + return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str); + case 'tel': //座机 + return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str); + case 'card': //身份证 + return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str); + case 'pwd': //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线 + return /^[a-zA-Z]\w{5,17}$/.test(str) + case 'postal': //邮政编码 + return /[1-9]\d{5}(?!\d)/.test(str); + case 'QQ': //QQ号 + return /^[1-9][0-9]{4,9}$/.test(str); + case 'email': //邮箱 + return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str); + case 'money': //金额(小数点2位) + return /^\d*(?:\.\d{0,2})?$/.test(str); + case 'URL': //网址 + return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str) + case 'IP': //IP + return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str); + case 'date': //日期时间 + return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/ + .test(str) + case 'number': //数字 + return /^[0-9]$/.test(str); + case 'english': //英文 + return /^[a-zA-Z]+$/.test(str); + case 'chinese': //中文 + return /^[\\u4E00-\\u9FA5]+$/.test(str); + case 'lower': //小写 + return /^[a-z]+$/.test(str); + case 'upper': //大写 + return /^[A-Z]+$/.test(str); + case 'HTML': //HTML标记 + return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str); + default: + return true; + } +} + +// 格式化时间-小于10补0 +function formatDigit(n) { + return n.toString().replace(/^(\d)$/, '0$1'); +} +// 格式化时间,通用 +export const formatDate = (timestamp, formats) => { + /* formats格式包括: + 1. Y-M-D + 2. Y-M-D h:m:s + 3. Y年M月D日 + 4. Y年M月D日 h时m分 + 5. Y年M月D日 h时m分s秒 + 示例:console.log(formatDate(1500305226034, 'Y年M月D日 h:m:s')) ==> 2017年07月17日 23:27:06 + */ + formats = formats || 'Y-M-D'; + var myDate = undefined; + if (timestamp) { + if (typeof(timestamp) != 'string') { + myDate = timestamp; + } else { + myDate = new Date(timestamp); + } + } else { + myDate = new Date(); + } + + var year = myDate.getFullYear(); + var month = formatDigit(myDate.getMonth() + 1); + var day = formatDigit(myDate.getDate()); + var hour = formatDigit(myDate.getHours()); + var minute = formatDigit(myDate.getMinutes()); + var second = formatDigit(myDate.getSeconds()); + return formats.replace(/Y|M|D|h|m|s/g, (matches) => { + return { + Y: year, + M: month, + D: day, + h: hour, + m: minute, + s: second + } [matches]; + }); +} + +// 验证邮箱 +export const isEmail = (s) => { + return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s) +} +// 验证手机号码 +export const isMobile = (s) => { + return /^1[0-9]{10}$/.test(s) +} +// 验证电话号码 +export const isPhone = (s) => { + return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s) +} +// 验证是否url地址 +export const isURL = (s) => { + return /^http[s]?:\/\/.*/.test(s) +} +// 验证是否字符串 +export const isString = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'String' +} +// 验证是否是否数字 +export const isNumber = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Number' +} +// 验证是否是Boolean +export const isBoolean = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean' +} +// 验证是否是函数 +export const isFunction = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Function' +} +//是否为null +export const isNull = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Null' +} +//是否undefined +export const isUndefined = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined' +} +//是否对象 +export const isObj = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Object' +} +//是否数组 +export const isArray = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Array' +} +// 是否时间对象 +export const isDate = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Date' +} +//是否正则 +export const isRegExp = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp' +} +// 是否错误对象 +export const isError = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Error' +} +//是否Symbol函数 +export const isSymbol = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol' +} +// 是否Promise对象 +export const isPromise = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Promise' +} +// 是否Set对象 +export const isSet = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Set' +} +//判断数据是不是引用类型的数据 +export function isObject(value) { + let type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +// 字符串超出多少字显示省略号 +export function strOut(str, len=0,type) { + type=type||'star'; + var restr = ''; + if (str) { + if (str.length >= len) { + restr = str.substring(0, len) + (type=='star'?'***':'...'); + } else { + restr = str; + } + } + return restr; +} +//浮点数加法运算--解决精度丢失(传入Number,返回Number) +export function FloatAdd(arg1, arg2) { + var r1, r2, m; + try { + r1 = arg1.toString().split('.')[1].length; + } catch (e) { + r1 = 0; + } + try { + r2 = arg2.toString().split('.')[1].length; + } catch (e) { + r2 = 0; + } + m = Math.pow(10, Math.max(r1, r2)); + return (arg1 * m + arg2 * m) / m; +} + +//浮点数乘法运算--解决精度丢失(传入Number,返回Number) +export function FloatMul(arg1, arg2) { + var m = 0, + s1 = arg1.toString(), + s2 = arg2.toString(); + try { + m += s1.split('.')[1].length; + } catch (e) {} + try { + m += s2.split('.')[1].length; + } catch (e) {} + return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m); +} +//随机数时间戳 (返回数字符串) +export function uniqueId() { + var a = Math.random, + b = parseInt; + return Number(new Date()).toString() + b(10 * a()) + b(10 * a()) + b(10 * a()); +} + +// 数组随机洗牌算法 +export const shuffle = (arr) => { + var result = [], + random; + while (arr.length > 0) { + random = Math.floor(Math.random() * arr.length); + result.push(arr[random]) + arr.splice(random, 1) + } + return result; +} +// 严格的身份证号码校验 +export const isCardID = (sId) => { + if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) { + console.log('你输入的身份证长度或格式错误') + return false + } + //身份证城市 + var aCity = { + 11: "北京", + 12: "天津", + 13: "河北", + 14: "山西", + 15: "内蒙古", + 21: "辽宁", + 22: "吉林", + 23: "黑龙江", + 31: "上海", + 32: "江苏", + 33: "浙江", + 34: "安徽", + 35: "福建", + 36: "江西", + 37: "山东", + 41: "河南", + 42: "湖北", + 43: "湖南", + 44: "广东", + 45: "广西", + 46: "海南", + 50: "重庆", + 51: "四川", + 52: "贵州", + 53: "云南", + 54: "西藏", + 61: "陕西", + 62: "甘肃", + 63: "青海", + 64: "宁夏", + 65: "新疆", + 71: "台湾", + 81: "香港", + 82: "澳门", + 91: "国外" + }; + if (!aCity[parseInt(sId.substr(0, 2))]) { + console.log('你的身份证地区非法') + return false + } + + // 出生日期验证 + var sBirthday = (sId.substr(6, 4) + "-" + Number(sId.substr(10, 2)) + "-" + Number(sId.substr(12, 2))).replace(/-/g, + "/"), + d = new Date(sBirthday) + if (sBirthday != (d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate())) { + console.log('身份证上的出生日期非法') + return false + } + + // 身份证号码校验 + var sum = 0, + weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2], + codes = "10X98765432" + for (var i = 0; i < sId.length - 1; i++) { + sum += sId[i] * weights[i]; + } + var last = codes[sum % 11]; //计算出来的最后一位身份证号码 + if (sId[sId.length - 1] != last) { + console.log('你输入的身份证号非法') + return false + } + + return true +} +// 随机整数范围 +export const random = (min, max) => { + if (arguments.length === 2) { + return Math.floor(min + Math.random() * ((max + 1) - min)) + } else { + return null; + } +} +// 将阿拉伯数字翻译成中文的大写数字 +export const numberToChinese = (num) => { + var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"); + var BB = new Array("", "十", "百", "仟", "萬", "億", "点", ""); + var a = ("" + num).replace(/(^0*)/g, "").split("."), + k = 0, + re = ""; + for (var i = a[0].length - 1; i >= 0; i--) { + switch (k) { + case 0: + re = BB[7] + re; + break; + case 4: + if (!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$") + .test(a[0])) + re = BB[4] + re; + break; + case 8: + re = BB[5] + re; + BB[7] = BB[5]; + k = 0; + break; + } + if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) + re = AA[0] + re; + if (a[0].charAt(i) != 0) + re = AA[a[0].charAt(i)] + BB[k % 4] + re; + k++; + } + + if (a.length > 1) // 加上小数部分(如果有小数部分) + { + re += BB[6]; + for (var i = 0; i < a[1].length; i++) + re += AA[a[1].charAt(i)]; + } + if (re == '一十') + re = "十"; + if (re.match(/^一/) && re.length == 3) + re = re.replace("一", ""); + return re; +} +// 将数字转换为大写金额 +export const changeToChinese = (Num) => { + //判断如果传递进来的不是字符的话转换为字符 + if (typeof Num == "number") { + Num = new String(Num); + }; + Num = Num.replace(/,/g, "") //替换tomoney()中的“,” + Num = Num.replace(/ /g, "") //替换tomoney()中的空格 + Num = Num.replace(/¥/g, "") //替换掉可能出现的¥字符 + if (isNaN(Num)) { //验证输入的字符是否为数字 + //alert("请检查小写金额是否正确"); + return ""; + }; + //字符处理完毕后开始转换,采用前后两部分分别转换 + var part = String(Num).split("."); + var newchar = ""; + //小数点前进行转化 + for (var i = part[0].length - 1; i >= 0; i--) { + if (part[0].length > 10) { + return ""; + //若数量超过拾亿单位,提示 + } + var tmpnewchar = "" + var perchar = part[0].charAt(i); + switch (perchar) { + case "0": + tmpnewchar = "零" + tmpnewchar; + break; + case "1": + tmpnewchar = "壹" + tmpnewchar; + break; + case "2": + tmpnewchar = "贰" + tmpnewchar; + break; + case "3": + tmpnewchar = "叁" + tmpnewchar; + break; + case "4": + tmpnewchar = "肆" + tmpnewchar; + break; + case "5": + tmpnewchar = "伍" + tmpnewchar; + break; + case "6": + tmpnewchar = "陆" + tmpnewchar; + break; + case "7": + tmpnewchar = "柒" + tmpnewchar; + break; + case "8": + tmpnewchar = "捌" + tmpnewchar; + break; + case "9": + tmpnewchar = "玖" + tmpnewchar; + break; + } + switch (part[0].length - i - 1) { + case 0: + tmpnewchar = tmpnewchar + "元"; + break; + case 1: + if (perchar != 0) tmpnewchar = tmpnewchar + "拾"; + break; + case 2: + if (perchar != 0) tmpnewchar = tmpnewchar + "佰"; + break; + case 3: + if (perchar != 0) tmpnewchar = tmpnewchar + "仟"; + break; + case 4: + tmpnewchar = tmpnewchar + "万"; + break; + case 5: + if (perchar != 0) tmpnewchar = tmpnewchar + "拾"; + break; + case 6: + if (perchar != 0) tmpnewchar = tmpnewchar + "佰"; + break; + case 7: + if (perchar != 0) tmpnewchar = tmpnewchar + "仟"; + break; + case 8: + tmpnewchar = tmpnewchar + "亿"; + break; + case 9: + tmpnewchar = tmpnewchar + "拾"; + break; + } + var newchar = tmpnewchar + newchar; + } + //小数点之后进行转化 + if (Num.indexOf(".") != -1) { + if (part[1].length > 2) { + // alert("小数点之后只能保留两位,系统将自动截断"); + part[1] = part[1].substr(0, 2) + } + for (i = 0; i < part[1].length; i++) { + tmpnewchar = "" + perchar = part[1].charAt(i) + switch (perchar) { + case "0": + tmpnewchar = "零" + tmpnewchar; + break; + case "1": + tmpnewchar = "壹" + tmpnewchar; + break; + case "2": + tmpnewchar = "贰" + tmpnewchar; + break; + case "3": + tmpnewchar = "叁" + tmpnewchar; + break; + case "4": + tmpnewchar = "肆" + tmpnewchar; + break; + case "5": + tmpnewchar = "伍" + tmpnewchar; + break; + case "6": + tmpnewchar = "陆" + tmpnewchar; + break; + case "7": + tmpnewchar = "柒" + tmpnewchar; + break; + case "8": + tmpnewchar = "捌" + tmpnewchar; + break; + case "9": + tmpnewchar = "玖" + tmpnewchar; + break; + } + if (i == 0) tmpnewchar = tmpnewchar + "角"; + if (i == 1) tmpnewchar = tmpnewchar + "分"; + newchar = newchar + tmpnewchar; + } + } + //替换所有无用汉字 + while (newchar.search("零零") != -1) + newchar = newchar.replace("零零", "零"); + newchar = newchar.replace("零亿", "亿"); + newchar = newchar.replace("亿万", "亿"); + newchar = newchar.replace("零万", "万"); + newchar = newchar.replace("零元", "元"); + newchar = newchar.replace("零角", ""); + newchar = newchar.replace("零分", ""); + if (newchar.charAt(newchar.length - 1) == "元") { + newchar = newchar + "整" + } + return newchar; +} +// 判断一个元素是否在数组中 +export const arrContains = (arr, val) => { + return arr.indexOf(val) != -1 ? true : false; +} +// 数组去重 +export const unique = (arr) => { + if (Array.hasOwnProperty('from')) { + return Array.from(new Set(arr)); + } else { + var n = {}, + r = []; + for (var i = 0; i < arr.length; i++) { + if (!n[arr[i]]) { + n[arr[i]] = true; + r.push(arr[i]); + } + } + return r; + } +} + +// 数组删除其中一个元素 +export const arrRemove = (arr, ele) => { + var index = arr.indexOf(ele); + if (index > -1) { + arr.splice(index, 1); + } + return arr; +} + +// 求数组中的最大值 +export const arrMax = (arr) => { + return Math.max.apply(null, arr); +} +// 求数组中的最小值 +export const arrMin = (arr) => { + return Math.min.apply(null, arr); +} +// 数组中的值求和 +export const arrSum = (arr) => { + return arr.reduce((pre, cur) => { + return pre + cur + }) +} +// 去除空格,type: 1-所有空格 2-前后空格 3-前空格 4-后空格 +export const strTrim = (str, type) => { + type = type || 2 + switch (type) { + case 1: + return str.replace(/\s+/g, ""); + case 2: + return str.replace(/(^\s*)|(\s*$)/g, ""); + case 3: + return str.replace(/(^\s*)/g, ""); + case 4: + return str.replace(/(\s*$)/g, ""); + default: + return str; + } +} +// 字符转换,type: 1:首字母大写 2:首字母小写 3:大小写转换 4:全部大写 5:全部小写 +export const changeCase = (str, type) => { + type = type || 4 + switch (type) { + case 1: + return str.replace(/\b\w+\b/g, (word) => { + return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); + + }); + case 2: + return str.replace(/\b\w+\b/g, (word) => { + return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase(); + }); + case 3: + return str.split('').map((word) => { + if (/[a-z]/.test(word)) { + return word.toUpperCase(); + } else { + return word.toLowerCase() + } + }).join('') + case 4: + return str.toUpperCase(); + case 5: + return str.toLowerCase(); + default: + return str; + } +} +// 检测密码强度 等级1-5 +export const checkPwd = (str) => { + var Lv = 1; + if (str.length < 6) { + return Lv + } + if (/[0-9]/.test(str)) { + Lv++ + } + if (/[a-z]/.test(str)) { + Lv++ + } + if (/[A-Z]/.test(str)) { + Lv++ + } + if (/[\.|-|_]/.test(str)) { + Lv++ + } + return Lv; +} +// 在字符串中插入新字符串 +export const insertStr = (soure, index, newStr) => { + var str = soure.slice(0, index) + newStr + soure.slice(index); + return str; +} +// 16进制颜色值转RGBA字符串 +export const colorToRGB = (val, opa) => { + + var pattern = /^(#?)[a-fA-F0-9]{6}$/; //16进制颜色值校验规则 + var isOpa = typeof opa == 'number'; //判断是否有设置不透明度 + + if (!pattern.test(val)) { //如果值不符合规则返回空字符 + return ''; + } + + var v = val.replace(/#/, ''); //如果有#号先去除#号 + var rgbArr = []; + var rgbStr = ''; + + for (var i = 0; i < 3; i++) { + var item = v.substring(i * 2, i * 2 + 2); + var num = parseInt(item, 16); + rgbArr.push(num); + } + + rgbStr = rgbArr.join(); + rgbStr = 'rgb' + (isOpa ? 'a' : '') + '(' + rgbStr + (isOpa ? ',' + opa : '') + ')'; + return rgbStr; +} diff --git a/nameCard/card.vue b/nameCard/card.vue new file mode 100644 index 0000000..cae93f5 --- /dev/null +++ b/nameCard/card.vue @@ -0,0 +1,92 @@ + + + + + + diff --git a/nameCard/cardImg.vue b/nameCard/cardImg.vue new file mode 100644 index 0000000..6879730 --- /dev/null +++ b/nameCard/cardImg.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/nameCard/cardLeftImg.vue b/nameCard/cardLeftImg.vue new file mode 100644 index 0000000..612e09c --- /dev/null +++ b/nameCard/cardLeftImg.vue @@ -0,0 +1,123 @@ + + + + + + diff --git a/nameCard/cardLeftImg1.vue b/nameCard/cardLeftImg1.vue new file mode 100644 index 0000000..52a6cea --- /dev/null +++ b/nameCard/cardLeftImg1.vue @@ -0,0 +1,130 @@ + + + + + + diff --git a/nameCard/cardRightImg.vue b/nameCard/cardRightImg.vue new file mode 100644 index 0000000..2ac1e08 --- /dev/null +++ b/nameCard/cardRightImg.vue @@ -0,0 +1,123 @@ + + + + + + diff --git a/package.json b/package.json index 204dff3..24d399c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { - "name": "pda-cli", + "name": "HAOTOP", "version": "0.1.0", + "description": "HAOTOP移动端", "private": true, "scripts": { "serve": "npm run dev:h5", @@ -49,6 +50,10 @@ "test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i", "test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i" }, + "keywords": [ + "HAOTOP", + "浩拓移动端" + ], "dependencies": { "@dcloudio/uni-app": "^2.0.2-4070520250711001", "@dcloudio/uni-app-plus": "^2.0.2-4070520250711001", @@ -74,7 +79,10 @@ "core-js": "^3.8.3", "flyio": "^0.6.2", "vue": ">= 2.6.14 < 2.7", - "vuex": "^3.2.0" + "vuex": "^3.2.0", + "@icon-park/vue": "^1.3.5", + "dayjs": "^1.11.13", + "vue-i18n": "^8.20.0" }, "devDependencies": { "@dcloudio/types": "^3.3.2", diff --git a/src/App.vue b/src/App.vue index 8c2b732..6368c2f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,17 +1,362 @@ - + diff --git a/src/README.en.md b/src/README.en.md new file mode 100644 index 0000000..bb95845 --- /dev/null +++ b/src/README.en.md @@ -0,0 +1,36 @@ +# ruoyi-uniapp + +#### Description +若依-Ruoyi APP 移动解决方案,基于 uniapp+uView 封装的一套基础模版,开箱即用,一份代码多终端适配,支持H5+支付宝小程序+微信小程序+APP,实现了与ruoyi-vue后台完美对接的移动解决方案,可直接开始快速开发业务需求,全新UI设计,更多交互细节,我们将为您提供极致的交互体验体验,持续推出高质量的交互产品 + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..018e625 --- /dev/null +++ b/src/README.md @@ -0,0 +1,170 @@ +# RuoYi-Uniapp(若依-手机端)开源啦 + +#### 介绍 +    若依-Ruoyi APP 移动解决方案,基于 uniapp+uView 封装的一套基础模版,开箱即用,一份代码多终端适配,支持H5+支付宝小程序+微信小程序+APP,实现了与ruoyi-vue后台完美对接的移动解决方案,可直接开始快速开发业务需求,全新UI设计,更多交互细节,我们将为您提供极致的交互体验体验,持续推出高质量的交互产品。 + + 如果对您有帮助,您可以点右上角 “Star” 收藏一下 ,获取第一时间更新,谢谢!刚刚开源,BUG修复中 + +* 感谢jeesite,项目参考自[JeeSite Mobile Uni-App](https://gitee.com/thinkgem/jeesite4-uniapp) +* 感谢[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) +* 适配ruoyi-vue后端,将doc下的java类放进去即可 + +#### 请大家支持一下我 + 开源中国发起年度开源软件评选为了让我们的Ruoyi aidex Sharp平台走的更久更远,请大家为我投个票,感谢,[点我投票](https://www.oschina.net/project/top_cn_2021?id=590) + 微信扫码投票: + +       + +#### 快速体验 + +2、微信小程序端:扫码访问(目前只能用用户名密码方式登录,用户名:admin 密码:admin123)

+ + +#### 我的另一个项目: + + **AiDex Sharp 快速开发平台** 基于著名的开源项目“ **若依-RuoYi-Vue** ”改造而成,追求 **极致的UI交互体验** 和 **快速开发** ,一切向 **效率** 看齐, **重构优化** 后端的代码,对前端页面进行了 **美化** 。 **我们将持续升级,持续完善,欢迎友友们收藏和点赞** 。 + +* [打开Aidex Sharp](https://gitee.com/big-hedgehog/aidex-sharp) + + + + + + +
+ +#### 如何使用uni-app端 + +##### 一、导入uniapp项目 + + 1. 首先下载HBuilderX并安装,地址:https://www.dcloud.io/hbuilderx.html + 2. 打开HBuilderX -> 顶部菜单栏 -> 文件 -> 导入 -> 从本地目录导入 -> 选择uniapp端项目目录 + 3. 找到common/config.js文件,找到里面的apiUrl项,填入已搭建的后端url地址 + 4. 打开manifest.json文件,选择微信小程序配置,填写小程序的appid + +##### 二、本地调试 + + 1. 打开HBuilderX -> 顶部菜单栏 -> 运行 -> 运行到浏览器 -> Chrome + 2. 如果请求后端api时 提示跨域错误,可安装Chrome插件:【Allow CORS: Access-Control-Allow-Origin】,地址:https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf + +##### 三、打包发行(H5) + + 1. 打开HBuilderX -> 顶部菜单栏 -> 发行 -> 网站H5-手机版 + 2. 打包后的文件路径:/unpackage/dist/build/h5 + 3. 将打包完成的所有文件 复制到商城后端/pulic目录下,全部替换 + +##### 四、打包发行(微信小程序) + + 1. 下载微信开发者工具并安装,地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html + 2. 打开HBuilderX -> 顶部菜单栏 -> 发行 -> 小程序-微信 + 3. 打包后的文件路径:/unpackage/dist/build/mp-weixin + 5. 打开微信开发者工具 导入 打包完成的项目 + 6. 检查没有运行错误,在右上方上传小程序 + +##### 5、后端代码适配ruoyi-vue + + 1. 可以启动后端,直接访问http://aidex.vip的公共服务,如果要自己适配,请将doc目录下的代码放到项目中即可。 +#### 界面截图 + + + + + + + + + + + + + + + + + + + + + + + +
+ +## 我的另一个项目: + + **AiDex Sharp 快速开发平台** 基于著名的开源项目“ **若依-RuoYi-Vue** ”改造而成,追求 **极致的UI交互体验** 和 **快速开发** ,一切向 **效率** 看齐, **重构优化** 后端的代码,对前端页面进行了 **美化** 。 **我们将持续升级,持续完善,欢迎友友们收藏和点赞** 。 + +* [打开Aidex Sharp](https://gitee.com/big-hedgehog/aidex-sharp) + +官方QQ群 +Aidex Sharp快速开发平台3群 208511180 使用问题请入群由专人负责简答 + +## 后台系统截图 + + + + + + + + + + + + + + + + + + + + + + + + + + +
+更多功能请访问系统体验 + +## 在线体验 + +演示地址:http://aidex.vip 帐号:admin 密码:admin123 + +#### uniapp知识 + +1. uni-app介绍 +2. uni-app 官方视频教程 +3. uni-app开发工具 HBuilderX 下载及使用说明 +4. uni-app是什么?能解决什么问题 +5. Vue.js相关文档、视频教程 + +#### 技术手册 + +* uni-app 框架文档 +* uni-app 组件文档 +* uView 组件文档 +* uView JS 文档 + +#### 授权许可协议条款 + +1. Ruoyi-Uniapp采用MIT开源协议协议。 +2. 代码可用于个人项目等接私活或企业项目脚手架使用,Ruoyi-Uniapp开源版完全免费。 +3. 允许进行商用,但是不允许二次开源出来并进行收费,否则将追究侵权者法律责任。 +4. 请不要删除和修改Ruoyi-Uniapp源码头部的版权与作者声明及出处。 +5. 不得进行简单修改包装声称是自己的项目。 +6. 我们已经申请了相关的软件开发著作权和相关登记 +7. 需要在您的软件介绍明显位置说明出处:举例:本软件基于Ruoyi-Uniapp手机端 + +#### 关于我们 + +    我们擅长UI、前端开发、后端架构,有一颗热爱开源的心,致力于打造企业级的通用产品设计UI体系让项目 +或者更直观,更高效、更简单,未来将持续关注UI交互,持续推出高质量的交互产品。 +###### +       +       +       + +版权所有Copyright © 2017-2021 By AiDex (http://www.aidex.vip) All rights reserved。 diff --git a/src/chanpin/view/addCp.vue b/src/chanpin/view/addCp.vue new file mode 100644 index 0000000..010779f --- /dev/null +++ b/src/chanpin/view/addCp.vue @@ -0,0 +1,475 @@ + + + + + diff --git a/src/chanpin/view/chanpin.vue b/src/chanpin/view/chanpin.vue new file mode 100644 index 0000000..b9111c6 --- /dev/null +++ b/src/chanpin/view/chanpin.vue @@ -0,0 +1,512 @@ + + + + + diff --git a/src/chanpin/view/classify.vue b/src/chanpin/view/classify.vue new file mode 100644 index 0000000..c047a5f --- /dev/null +++ b/src/chanpin/view/classify.vue @@ -0,0 +1,366 @@ + + + + + diff --git a/src/chanpin/view/cpDetail.vue b/src/chanpin/view/cpDetail.vue new file mode 100644 index 0000000..26cd6a4 --- /dev/null +++ b/src/chanpin/view/cpDetail.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/src/chanpin/view/search.vue b/src/chanpin/view/search.vue new file mode 100644 index 0000000..d86d98d --- /dev/null +++ b/src/chanpin/view/search.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/src/chanpin/view/searchAdmin.vue b/src/chanpin/view/searchAdmin.vue new file mode 100644 index 0000000..7bf4d92 --- /dev/null +++ b/src/chanpin/view/searchAdmin.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/src/chanpin/view/shop.vue b/src/chanpin/view/shop.vue new file mode 100644 index 0000000..dc2b47f --- /dev/null +++ b/src/chanpin/view/shop.vue @@ -0,0 +1,765 @@ + + + + + diff --git a/src/common/base64.js b/src/common/base64.js new file mode 100644 index 0000000..3edc008 --- /dev/null +++ b/src/common/base64.js @@ -0,0 +1,74 @@ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function() {factory(root);}); + } else factory(root); +// node.js has always supported base64 conversions, while browsers that support +// web workers support base64 too, but you may never know. +})(typeof exports !== "undefined" ? exports : this, function(root) { + if (root.atob) { + // Some browsers' implementation of atob doesn't support whitespaces + // in the encoded string (notably, IE). This wraps the native atob + // in a function that strips the whitespaces. + // The original function can be retrieved in atob.original + try { + root.atob(" "); + } catch(e) { + root.atob = (function(atob) { + var func = function(string) { + return atob(String(string).replace(/[\t\n\f\r ]+/g, "")); + }; + func.original = atob; + return func; + })(root.atob); + } + return; + } + + // base64 character set, plus padding character (=) + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + // Regular expression to check formal correctness of base64 encoded strings + b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; + + root.btoa = function(string) { + string = String(string); + var bitmap, a, b, c, + result = "", i = 0, + rest = string.length % 3; // To determine the final padding + + for (; i < string.length;) { + if ((a = string.charCodeAt(i++)) > 255 + || (b = string.charCodeAt(i++)) > 255 + || (c = string.charCodeAt(i++)) > 255) + throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."); + + bitmap = (a << 16) | (b << 8) | c; + result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); + } + + // If there's need of padding, replace the last 'A's with equal signs + return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result; + }; + + root.atob = function(string) { + // atob can work with strings with whitespaces, even inside the encoded part, + // but only \t, \n, \f, \r and ' ', which can be stripped. + string = String(string).replace(/[\t\n\f\r ]+/g, ""); + if (!b64re.test(string)) + throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); + + // Adding the padding if missing, for semplicity + string += "==".slice(2 - (string.length & 3)); + var bitmap, result = "", r1, r2, i = 0; + for (; i < string.length;) { + bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 + | (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); + + result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) + : r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) + : String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); + } + return result; + }; +}); \ No newline at end of file diff --git a/src/common/common.js b/src/common/common.js new file mode 100644 index 0000000..e8b88ef --- /dev/null +++ b/src/common/common.js @@ -0,0 +1,15 @@ +/** + * 通用js方法封装处理 + * Copyright (c) 2019 aidex + */ + +export function replaceAll (text,stringToFind,stringToReplace) { + if ( stringToFind == stringToReplace) return this; + var temp = text; + var index = temp.indexOf(stringToFind); + while (index != -1) { + temp = temp.replace(stringToFind, stringToReplace); + index = temp.indexOf(stringToFind); + } + return temp; +} diff --git a/src/common/config.js b/src/common/config.js new file mode 100644 index 0000000..f3be7e7 --- /dev/null +++ b/src/common/config.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2013-Now http://aidex.vip All rights reserved. + */ + +// 判断是否为开发环境 +export const isDevelopment = process.env.NODE_ENV === 'development' + +const config = { + upgradeName: 'erp_pda_pre', + + // 产品名称 + productName: '浩拓技术', + + // 公司名称 + companyName: '浩拓科技', + + // 版本检查标识 + appCode: 'android', + + // 内部版本号码 + appVersion: 1, + + // 管理基础路径 + adminPath: 'https://hcscmpre.zzfzyc.com/hcscm/pda/v1', + + // 环境判断 + isDevelopment: isDevelopment, + + // 生产环境API URL + productionApiUrl: 'https://hcscmpre.zzfzyc.com/hcscm/pda/v1', + + // 开发环境API URL选项 + devApiUrlOptions: [ + { label: '测试环境', value: 'https://hcscmtest.zzfzyc.com/hcscm/pda/v1' }, + { label: '正式环境', value: 'https://hcscmpre.zzfzyc.com/hcscm/pda/v1' }, + { label: '自定义', value: 'custom' } + ] + +} + +// 设置后台接口服务的基础地址 - 使用动态API URL +// config.baseUrl = 'https://aidex.vip/api'; // 注释掉固定的baseUrl + +export default config; diff --git a/src/common/http.api.js b/src/common/http.api.js new file mode 100644 index 0000000..612862b --- /dev/null +++ b/src/common/http.api.js @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2013-Now http://aidex.vip All rights reserved. + */ +// 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作 +const install = (Vue, vm) => { + + // 参数配置对象 + const config = vm.vuex_config; + console.log('install u',config) + // 将各个定义的接口名称,统一放进对象挂载到vm.$u.api(因为vm就是this,也即this.$u.api)下 + vm.$u.api = { + + // 基础服务:登录登出、身份信息、菜单授权、切换系统、字典数据等 + lang: (params = {}) => vm.$u.get('/lang/'+params.lang), + index: (params = {}) => vm.$u.get(config.adminPath+'/mobile/index', params), + getUserInfo: (params = {}) => vm.$u.get(config.adminPath+'/mobile/user/getUserInfo', params), + login: (params = {}) => vm.$u.post(config.adminPath+'/mobile/login/loginByPassword', params), + // PDA登录接口 + pdaLogin: (params = {}) => vm.$u.postJson('/login', params), + pdaLogout: (params = {}) => vm.$u.postJson('/logout', params), + // 获取配布单列表 + getFpmArrangeOrderList: (params = {}) => vm.$u.get('/product/fpmArrangeOrder/getFpmArrangeOrderList', params), + // 获取成品配布单详情 + getFpmArrangeOrder: (params = {}) => vm.$u.get('/product/fpmArrangeOrder/getFpmArrangeOrder', params), + // 生成出仓单 + outFpmArrangeOrder: (params = {}) => vm.$u.put('/product/fpmArrangeOrder/outFpmArrangeOrder', params), + sendCode: (params = {}) => vm.$u.post(config.adminPath+'/mobile/login/sendCode', params), + registerUser: (params = {}) => vm.$u.post(config.adminPath+'/mobile/user/registerUser', params), + //首页相关api + getIndexCardInfo: (params = {}) => vm.$u.get(config.adminPath+'/mobile/index/getIndexCardInfo', params), + getM2mOrderFlowList: (params = {}) => vm.$u.get(config.adminPath+'/mobile/index/getM2mOrderFlowList', params), + //获取卡可购买套餐包 + getM2mOrderPackageList: (params = {}) => vm.$u.get(config.adminPath+'/mobile/index/getM2mOrderPackageList', params), + + logout: (params = {}) => vm.$u.get(config.adminPath+'/mobile/login/logout', params), + authInfo: (params = {}) => vm.$u.get(config.adminPath+'/authInfo', params), + menuTree: (params = {}) => vm.$u.get(config.adminPath+'/menuTree', params), + switchSys: (params = {}) => vm.$u.get(config.adminPath+'/switch/'+params.sysCode), + dictData: (params = {}) => vm.$u.get(config.a取dminPath+'/system/dict/data/type/'+params.dictType), + + // 账号服务:验证码接口、忘记密码接口、注册账号接口等 + validCode: (params = {}) => vm.$u.getText('/validCode', params), + getFpValidCode: (params = {}) => vm.$u.post('/account/getFpValidCode', params), + savePwdByValidCode: (params = {}) => vm.$u.post('/account/savePwdByValidCode', params), + getRegValidCode: (params = {}) => vm.$u.post('/account/getRegValidCode', params), + saveRegByValidCode: (params = {}) => vm.$u.post('/account/saveRegByValidCode', params), + + // APP公共服务 + upgradeCheck: (params = {}) => vm.$u.put(vm.$u.http.config.baseUrl.replace('/pda/v1', '') + '/version/check', params, { + 'content-type': 'application/json' + }), + commentSave: (params = {}) => vm.$u.post('/app/comment/save', params), + + // 个人信息修改 + user: { + saveUserInfo: (params = {}) => vm.$u.post(config.adminPath+'/mobile/user/saveUserInfo', params), + infoSavePwd: (params = {}) => vm.$u.put(config.adminPath+'/system/user/profile/updatePwd', params), + infoSavePqa: (params = {}) => vm.$u.post(config.adminPath+'/sys/user/infoSavePqa', params), + }, + + // 员工用户查询 + empUser: { + listData: (params = {}) => vm.$u.get(config.adminPath+'/sys/empUser/listData', params), + }, + + // 组织机构查询 + office: { + treeData: (params = {}) => vm.$u.get(config.adminPath+'/sys/office/treeData', params), + }, + + // 增删改查例子 + testData: { + form: (params = {}) => vm.$u.post(config.adminPath+'/test/testData/form', params), + list: (params = {}) => vm.$u.post(config.adminPath+'/test/testData/listData', params), + save: (params = {}) => vm.$u.postJson(config.adminPath+'/test/testData/save', params), + disable: (params = {}) => vm.$u.post(config.adminPath+'/test/testData/disable', params), + enable: (params = {}) => vm.$u.post(config.adminPath+'/test/testData/enable', params), + delete: (params = {}) => vm.$u.post(config.adminPath+'/test/testData/delete', params), + }, + + }; + +} + +export default { + install +} diff --git a/src/common/http.interceptor.js b/src/common/http.interceptor.js new file mode 100644 index 0000000..cc3645e --- /dev/null +++ b/src/common/http.interceptor.js @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2013-Now http://aidex.vip All rights reserved. + */ +// 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作 +const install = (Vue, vm) => { + // 通用请求头设定 + const ajaxHeader = 'x-ajax'; + const sessionIdHeader = 'Authorization'; + const rememberMeHeader = 'x-remember'; + + // 请求参数默认配置 + Vue.prototype.$u.http.setConfig({ + baseUrl: vm.$store.state.apiurl, + originalData: true, + // 默认头部,http2约定header名称统一小写 aidex + header: { + 'Platform': 2, + 'content-type': 'application/x-www-form-urlencoded', + 'x-requested-with': 'XMLHttpRequest' + } + }); + + // 请求拦截,配置Token等参数 + Vue.prototype.$u.http.interceptor.request = (req) => { + if (!req.header){ + req.header = []; + } + req.header["source"] = "app"; + + // 默认指定返回 JSON 数据 + if (!req.header[ajaxHeader]){ + req.header[ajaxHeader] = 'json'; + } + + // 设定传递 Token 认证参数 aidex + if (!req.header[sessionIdHeader] && vm.vuex_token){ + req.header[sessionIdHeader] = vm.vuex_token; + } + + // 为节省流量,记住我数据不是每次都发送的,当会话失效后,尝试重试登录 aidex + if (!req.header[rememberMeHeader] && vm.vuex_remember && req.remember){ + req.header[rememberMeHeader] = vm.vuex_remember; + req.remember = false; + } + console.log('request', req); + return req; + } + + // 响应拦截,判断状态码是否通过 + Vue.prototype.$u.http.interceptor.response = async (res, req) => { + console.log('response', res); + + // 处理401未授权状态码 + if (res.statusCode === 401) { + vm.$u.toast('登录已过期,请重新登录'); + // 清除token和用户信息 + uni.removeStorageSync('token'); + vm.$u.vuex('vuex_token', ''); + vm.$u.vuex('vuex_user', {}); + // 跳转到登录页面 + uni.reLaunch({ + url: '/pages/sys/login/index' + }); + return false; + } + if (!(res.data)){ + vm.$u.toast('未连接到服务器') + return Promise.reject(new Error('未连接到服务器')); + } + + if(res.data.code !== 0) { + vm.$u.toast(res.data.msg) + return Promise.reject(new Error(res.data.msg)) + } + let data = res.data.data; + console.log('data',data) + if (typeof data === 'object' && !(data instanceof Array)){ + if (data.token){ + console.log('token',data.token) + vm.$u.vuex('vuex_token', data.token); + if (data.user){ + vm.$u.vuex('vuex_user', data.user); + } + vm.$u.vuex('vuex_isAgent', data.isAgent); + } + if (data.result === 'login'){ + vm.$u.vuex('vuex_user', {}); + if (req.tryagain == undefined || req.tryagain){ + req.tryagain = false; req.remember = true; + await vm.$u.http.request(req).then(res => { + data = res; + }); + } + if (data.result === 'login'){ + if (!req.data.loginCheck){ + vm.$u.toast(data.msg); + } + req.tryagain = true; + } + } + } + + if (res.header && res.header[rememberMeHeader]){ + let remember = res.header[rememberMeHeader]; + if (remember && remember != 'deleteMe'){ + vm.$u.vuex('vuex_remember', remember); + }else{ + vm.$u.vuex('vuex_remember', ''); + } + } + + return data; + } + + // 封装 get text 请求 + vm.$u.getText = (url, data = {}, header = {}) => { + return vm.$u.http.request({ + dataType: 'text', + method: 'GET', + url, + header, + data + }) + } + + // 封装 post json 请求 + vm.$u.postJson = (url, data = {}, header = {}) => { + console.log('header', header, url, vm.$u) + header['content-type'] = 'application/json'; + return vm.$u.http.request({ + url, + method: 'POST', + header, + data + }) + } + +} + +export default { + install +} diff --git a/src/common/locales/en.js b/src/common/locales/en.js new file mode 100644 index 0000000..b68702e --- /dev/null +++ b/src/common/locales/en.js @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2013-Now http://aidex.vip All rights reserved. + */ +export default { + common: { + title: 'Aidex', + }, + nav: { + home: 'Home', + user: 'User', + msg: 'Msg' + }, + login: { + title: 'Login', + placeholderAccount: 'Enter Account', + placeholderPassword: 'Enter Password', + autoLogin: 'Auto Login', + loginButton: 'Login', + logoutButton: 'Logout', + forget: 'Forget Password', + reg: 'Resister Account', + noLogin: 'No Login' + }, + home: { + title: 'Home' + }, + user: { + title: 'User' + }, + msg: { + title: 'Message' + } + +} \ No newline at end of file diff --git a/src/common/locales/zh_CN.js b/src/common/locales/zh_CN.js new file mode 100644 index 0000000..c74ff05 --- /dev/null +++ b/src/common/locales/zh_CN.js @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2013-Now http://aidex.vip All rights reserved. + */ +export default { + common: { + title: 'Aidex', + }, + nav: { + home: '消息', + workbench: '工作台', + user: '我的', + book: '通讯录', + msg: '消息', + }, + login: { + title: '登录', + placeholderAccount: '请输入账号', + placeholderPassword: '请输入密码', + autoLogin: '记住密码', + loginButton: '登录', + logoutButton: '退出登录', + forget: '忘记密码', + reg: '注册账号', + noLogin: '未登录' + }, + home: { + title: '消息' + }, + workbench: { + title: '工作台' + }, + user: { + title: '用户中心' + }, + msg: { + title: '消息' + }, + book: { + title: '通讯录' + } +} diff --git a/src/common/md5.js b/src/common/md5.js new file mode 100644 index 0000000..d08cf62 --- /dev/null +++ b/src/common/md5.js @@ -0,0 +1,685 @@ +/** + * [js-md5]{@link https://github.com/emn178/js-md5} + * + * @namespace md5 + * @version 0.7.3 + * @author Chen, Yi-Cyuan [emn178@gmail.com] + * @copyright Chen, Yi-Cyuan 2014-2017 + * @license MIT + */ +(function () { + 'use strict'; + + var ERROR = 'input is invalid type'; + var WINDOW = typeof window === 'object'; + var root = WINDOW ? window : {}; + if (root.JS_MD5_NO_WINDOW) { + WINDOW = false; + } + var WEB_WORKER = !WINDOW && typeof self === 'object'; + var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; + if (NODE_JS) { + root = global; + } else if (WEB_WORKER) { + root = self; + } + var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports; + var AMD = typeof define === 'function' && define.amd; + var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined'; + var HEX_CHARS = '0123456789abcdef'.split(''); + var EXTRA = [128, 32768, 8388608, -2147483648]; + var SHIFT = [0, 8, 16, 24]; + var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64']; + var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + var blocks = [], buffer8; + if (ARRAY_BUFFER) { + var buffer = new ArrayBuffer(68); + buffer8 = new Uint8Array(buffer); + blocks = new Uint32Array(buffer); + } + + if (root.JS_MD5_NO_NODE_JS || !Array.isArray) { + Array.isArray = function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + } + + if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) { + ArrayBuffer.isView = function (obj) { + return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer; + }; + } + + /** + * @method hex + * @memberof md5 + * @description Output hash as hex string + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {String} Hex string + * @example + * md5.hex('The quick brown fox jumps over the lazy dog'); + * // equal to + * md5('The quick brown fox jumps over the lazy dog'); + */ + /** + * @method digest + * @memberof md5 + * @description Output hash as bytes array + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {Array} Bytes array + * @example + * md5.digest('The quick brown fox jumps over the lazy dog'); + */ + /** + * @method array + * @memberof md5 + * @description Output hash as bytes array + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {Array} Bytes array + * @example + * md5.array('The quick brown fox jumps over the lazy dog'); + */ + /** + * @method arrayBuffer + * @memberof md5 + * @description Output hash as ArrayBuffer + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {ArrayBuffer} ArrayBuffer + * @example + * md5.arrayBuffer('The quick brown fox jumps over the lazy dog'); + */ + /** + * @method buffer + * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead. + * @memberof md5 + * @description Output hash as ArrayBuffer + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {ArrayBuffer} ArrayBuffer + * @example + * md5.buffer('The quick brown fox jumps over the lazy dog'); + */ + /** + * @method base64 + * @memberof md5 + * @description Output hash as base64 string + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {String} base64 string + * @example + * md5.base64('The quick brown fox jumps over the lazy dog'); + */ + var createOutputMethod = function (outputType) { + return function (message) { + return new Md5(true).update(message)[outputType](); + }; + }; + + /** + * @method create + * @memberof md5 + * @description Create Md5 object + * @returns {Md5} Md5 object. + * @example + * var hash = md5.create(); + */ + /** + * @method update + * @memberof md5 + * @description Create and update Md5 object + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {Md5} Md5 object. + * @example + * var hash = md5.update('The quick brown fox jumps over the lazy dog'); + * // equal to + * var hash = md5.create(); + * hash.update('The quick brown fox jumps over the lazy dog'); + */ + var createMethod = function () { + var method = createOutputMethod('hex'); + if (NODE_JS) { + method = nodeWrap(method); + } + method.create = function () { + return new Md5(); + }; + method.update = function (message) { + return method.create().update(message); + }; + for (var i = 0; i < OUTPUT_TYPES.length; ++i) { + var type = OUTPUT_TYPES[i]; + method[type] = createOutputMethod(type); + } + return method; + }; + + var nodeWrap = function (method) { + var crypto = eval("require('crypto')"); + var Buffer = eval("require('buffer').Buffer"); + var nodeMethod = function (message) { + if (typeof message === 'string') { + return crypto.createHash('md5').update(message, 'utf8').digest('hex'); + } else { + if (message === null || message === undefined) { + throw ERROR; + } else if (message.constructor === ArrayBuffer) { + message = new Uint8Array(message); + } + } + if (Array.isArray(message) || ArrayBuffer.isView(message) || + message.constructor === Buffer) { + return crypto.createHash('md5').update(new Buffer(message)).digest('hex'); + } else { + return method(message); + } + }; + return nodeMethod; + }; + + + + /** + * Md5 class + * @class Md5 + * @description This is internal class. + * @see {@link md5.create} + */ + function Md5(sharedMemory) { + if (sharedMemory) { + blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = + blocks[4] = blocks[5] = blocks[6] = blocks[7] = + blocks[8] = blocks[9] = blocks[10] = blocks[11] = + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; + this.blocks = blocks; + this.buffer8 = buffer8; + } else { + if (ARRAY_BUFFER) { + var buffer = new ArrayBuffer(68); + this.buffer8 = new Uint8Array(buffer); + this.blocks = new Uint32Array(buffer); + } else { + this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + } + this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0; + this.finalized = this.hashed = false; + this.first = true; + } + + /** + * @method update + * @memberof Md5 + * @instance + * @description Update hash + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {Md5} Md5 object. + * @see {@link md5.update} + */ + Md5.prototype.update = function (message) { + if (this.finalized) { + return; + } + + var notString, type = typeof message; + if (type !== 'string') { + if (type === 'object') { + if (message === null) { + throw ERROR; + } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) { + message = new Uint8Array(message); + } else if (!Array.isArray(message)) { + if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) { + throw ERROR; + } + } + } else { + throw ERROR; + } + notString = true; + } + var code, index = 0, i, length = message.length, blocks = this.blocks; + var buffer8 = this.buffer8; + + while (index < length) { + if (this.hashed) { + this.hashed = false; + blocks[0] = blocks[16]; + blocks[16] = blocks[1] = blocks[2] = blocks[3] = + blocks[4] = blocks[5] = blocks[6] = blocks[7] = + blocks[8] = blocks[9] = blocks[10] = blocks[11] = + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; + } + + if (notString) { + if (ARRAY_BUFFER) { + for (i = this.start; index < length && i < 64; ++index) { + buffer8[i++] = message[index]; + } + } else { + for (i = this.start; index < length && i < 64; ++index) { + blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; + } + } + } else { + if (ARRAY_BUFFER) { + for (i = this.start; index < length && i < 64; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + buffer8[i++] = code; + } else if (code < 0x800) { + buffer8[i++] = 0xc0 | (code >> 6); + buffer8[i++] = 0x80 | (code & 0x3f); + } else if (code < 0xd800 || code >= 0xe000) { + buffer8[i++] = 0xe0 | (code >> 12); + buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); + buffer8[i++] = 0x80 | (code & 0x3f); + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + buffer8[i++] = 0xf0 | (code >> 18); + buffer8[i++] = 0x80 | ((code >> 12) & 0x3f); + buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); + buffer8[i++] = 0x80 | (code & 0x3f); + } + } + } else { + for (i = this.start; index < length && i < 64; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + blocks[i >> 2] |= code << SHIFT[i++ & 3]; + } else if (code < 0x800) { + blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else if (code < 0xd800 || code >= 0xe000) { + blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } + } + } + } + this.lastByteIndex = i; + this.bytes += i - this.start; + if (i >= 64) { + this.start = i - 64; + this.hash(); + this.hashed = true; + } else { + this.start = i; + } + } + if (this.bytes > 4294967295) { + this.hBytes += this.bytes / 4294967296 << 0; + this.bytes = this.bytes % 4294967296; + } + return this; + }; + + Md5.prototype.finalize = function () { + if (this.finalized) { + return; + } + this.finalized = true; + var blocks = this.blocks, i = this.lastByteIndex; + blocks[i >> 2] |= EXTRA[i & 3]; + if (i >= 56) { + if (!this.hashed) { + this.hash(); + } + blocks[0] = blocks[16]; + blocks[16] = blocks[1] = blocks[2] = blocks[3] = + blocks[4] = blocks[5] = blocks[6] = blocks[7] = + blocks[8] = blocks[9] = blocks[10] = blocks[11] = + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; + } + blocks[14] = this.bytes << 3; + blocks[15] = this.hBytes << 3 | this.bytes >>> 29; + this.hash(); + }; + + Md5.prototype.hash = function () { + var a, b, c, d, bc, da, blocks = this.blocks; + + if (this.first) { + a = blocks[0] - 680876937; + a = (a << 7 | a >>> 25) - 271733879 << 0; + d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708; + d = (d << 12 | d >>> 20) + a << 0; + c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375; + c = (c << 17 | c >>> 15) + d << 0; + b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209; + b = (b << 22 | b >>> 10) + c << 0; + } else { + a = this.h0; + b = this.h1; + c = this.h2; + d = this.h3; + a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936; + a = (a << 7 | a >>> 25) + b << 0; + d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586; + d = (d << 12 | d >>> 20) + a << 0; + c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819; + c = (c << 17 | c >>> 15) + d << 0; + b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330; + b = (b << 22 | b >>> 10) + c << 0; + } + + a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897; + a = (a << 7 | a >>> 25) + b << 0; + d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426; + d = (d << 12 | d >>> 20) + a << 0; + c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341; + c = (c << 17 | c >>> 15) + d << 0; + b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983; + b = (b << 22 | b >>> 10) + c << 0; + a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416; + a = (a << 7 | a >>> 25) + b << 0; + d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417; + d = (d << 12 | d >>> 20) + a << 0; + c += (b ^ (d & (a ^ b))) + blocks[10] - 42063; + c = (c << 17 | c >>> 15) + d << 0; + b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162; + b = (b << 22 | b >>> 10) + c << 0; + a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682; + a = (a << 7 | a >>> 25) + b << 0; + d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101; + d = (d << 12 | d >>> 20) + a << 0; + c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290; + c = (c << 17 | c >>> 15) + d << 0; + b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329; + b = (b << 22 | b >>> 10) + c << 0; + a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510; + a = (a << 5 | a >>> 27) + b << 0; + d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632; + d = (d << 9 | d >>> 23) + a << 0; + c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713; + c = (c << 14 | c >>> 18) + d << 0; + b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302; + b = (b << 20 | b >>> 12) + c << 0; + a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691; + a = (a << 5 | a >>> 27) + b << 0; + d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083; + d = (d << 9 | d >>> 23) + a << 0; + c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335; + c = (c << 14 | c >>> 18) + d << 0; + b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848; + b = (b << 20 | b >>> 12) + c << 0; + a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438; + a = (a << 5 | a >>> 27) + b << 0; + d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690; + d = (d << 9 | d >>> 23) + a << 0; + c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961; + c = (c << 14 | c >>> 18) + d << 0; + b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501; + b = (b << 20 | b >>> 12) + c << 0; + a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467; + a = (a << 5 | a >>> 27) + b << 0; + d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784; + d = (d << 9 | d >>> 23) + a << 0; + c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473; + c = (c << 14 | c >>> 18) + d << 0; + b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734; + b = (b << 20 | b >>> 12) + c << 0; + bc = b ^ c; + a += (bc ^ d) + blocks[5] - 378558; + a = (a << 4 | a >>> 28) + b << 0; + d += (bc ^ a) + blocks[8] - 2022574463; + d = (d << 11 | d >>> 21) + a << 0; + da = d ^ a; + c += (da ^ b) + blocks[11] + 1839030562; + c = (c << 16 | c >>> 16) + d << 0; + b += (da ^ c) + blocks[14] - 35309556; + b = (b << 23 | b >>> 9) + c << 0; + bc = b ^ c; + a += (bc ^ d) + blocks[1] - 1530992060; + a = (a << 4 | a >>> 28) + b << 0; + d += (bc ^ a) + blocks[4] + 1272893353; + d = (d << 11 | d >>> 21) + a << 0; + da = d ^ a; + c += (da ^ b) + blocks[7] - 155497632; + c = (c << 16 | c >>> 16) + d << 0; + b += (da ^ c) + blocks[10] - 1094730640; + b = (b << 23 | b >>> 9) + c << 0; + bc = b ^ c; + a += (bc ^ d) + blocks[13] + 681279174; + a = (a << 4 | a >>> 28) + b << 0; + d += (bc ^ a) + blocks[0] - 358537222; + d = (d << 11 | d >>> 21) + a << 0; + da = d ^ a; + c += (da ^ b) + blocks[3] - 722521979; + c = (c << 16 | c >>> 16) + d << 0; + b += (da ^ c) + blocks[6] + 76029189; + b = (b << 23 | b >>> 9) + c << 0; + bc = b ^ c; + a += (bc ^ d) + blocks[9] - 640364487; + a = (a << 4 | a >>> 28) + b << 0; + d += (bc ^ a) + blocks[12] - 421815835; + d = (d << 11 | d >>> 21) + a << 0; + da = d ^ a; + c += (da ^ b) + blocks[15] + 530742520; + c = (c << 16 | c >>> 16) + d << 0; + b += (da ^ c) + blocks[2] - 995338651; + b = (b << 23 | b >>> 9) + c << 0; + a += (c ^ (b | ~d)) + blocks[0] - 198630844; + a = (a << 6 | a >>> 26) + b << 0; + d += (b ^ (a | ~c)) + blocks[7] + 1126891415; + d = (d << 10 | d >>> 22) + a << 0; + c += (a ^ (d | ~b)) + blocks[14] - 1416354905; + c = (c << 15 | c >>> 17) + d << 0; + b += (d ^ (c | ~a)) + blocks[5] - 57434055; + b = (b << 21 | b >>> 11) + c << 0; + a += (c ^ (b | ~d)) + blocks[12] + 1700485571; + a = (a << 6 | a >>> 26) + b << 0; + d += (b ^ (a | ~c)) + blocks[3] - 1894986606; + d = (d << 10 | d >>> 22) + a << 0; + c += (a ^ (d | ~b)) + blocks[10] - 1051523; + c = (c << 15 | c >>> 17) + d << 0; + b += (d ^ (c | ~a)) + blocks[1] - 2054922799; + b = (b << 21 | b >>> 11) + c << 0; + a += (c ^ (b | ~d)) + blocks[8] + 1873313359; + a = (a << 6 | a >>> 26) + b << 0; + d += (b ^ (a | ~c)) + blocks[15] - 30611744; + d = (d << 10 | d >>> 22) + a << 0; + c += (a ^ (d | ~b)) + blocks[6] - 1560198380; + c = (c << 15 | c >>> 17) + d << 0; + b += (d ^ (c | ~a)) + blocks[13] + 1309151649; + b = (b << 21 | b >>> 11) + c << 0; + a += (c ^ (b | ~d)) + blocks[4] - 145523070; + a = (a << 6 | a >>> 26) + b << 0; + d += (b ^ (a | ~c)) + blocks[11] - 1120210379; + d = (d << 10 | d >>> 22) + a << 0; + c += (a ^ (d | ~b)) + blocks[2] + 718787259; + c = (c << 15 | c >>> 17) + d << 0; + b += (d ^ (c | ~a)) + blocks[9] - 343485551; + b = (b << 21 | b >>> 11) + c << 0; + + if (this.first) { + this.h0 = a + 1732584193 << 0; + this.h1 = b - 271733879 << 0; + this.h2 = c - 1732584194 << 0; + this.h3 = d + 271733878 << 0; + this.first = false; + } else { + this.h0 = this.h0 + a << 0; + this.h1 = this.h1 + b << 0; + this.h2 = this.h2 + c << 0; + this.h3 = this.h3 + d << 0; + } + }; + + /** + * @method hex + * @memberof Md5 + * @instance + * @description Output hash as hex string + * @returns {String} Hex string + * @see {@link md5.hex} + * @example + * hash.hex(); + */ + Md5.prototype.hex = function () { + this.finalize(); + + var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; + + return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] + + HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] + + HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] + + HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] + + HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] + + HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] + + HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] + + HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] + + HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] + + HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] + + HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] + + HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] + + HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] + + HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] + + HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] + + HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F]; + }; + + /** + * @method toString + * @memberof Md5 + * @instance + * @description Output hash as hex string + * @returns {String} Hex string + * @see {@link md5.hex} + * @example + * hash.toString(); + */ + Md5.prototype.toString = Md5.prototype.hex; + + /** + * @method digest + * @memberof Md5 + * @instance + * @description Output hash as bytes array + * @returns {Array} Bytes array + * @see {@link md5.digest} + * @example + * hash.digest(); + */ + Md5.prototype.digest = function () { + this.finalize(); + + var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; + return [ + h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF, + h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF, + h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF, + h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF + ]; + }; + + /** + * @method array + * @memberof Md5 + * @instance + * @description Output hash as bytes array + * @returns {Array} Bytes array + * @see {@link md5.array} + * @example + * hash.array(); + */ + Md5.prototype.array = Md5.prototype.digest; + + /** + * @method arrayBuffer + * @memberof Md5 + * @instance + * @description Output hash as ArrayBuffer + * @returns {ArrayBuffer} ArrayBuffer + * @see {@link md5.arrayBuffer} + * @example + * hash.arrayBuffer(); + */ + Md5.prototype.arrayBuffer = function () { + this.finalize(); + + var buffer = new ArrayBuffer(16); + var blocks = new Uint32Array(buffer); + blocks[0] = this.h0; + blocks[1] = this.h1; + blocks[2] = this.h2; + blocks[3] = this.h3; + return buffer; + }; + + /** + * @method buffer + * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead. + * @memberof Md5 + * @instance + * @description Output hash as ArrayBuffer + * @returns {ArrayBuffer} ArrayBuffer + * @see {@link md5.buffer} + * @example + * hash.buffer(); + */ + Md5.prototype.buffer = Md5.prototype.arrayBuffer; + + /** + * @method base64 + * @memberof Md5 + * @instance + * @description Output hash as base64 string + * @returns {String} base64 string + * @see {@link md5.base64} + * @example + * hash.base64(); + */ + Md5.prototype.base64 = function () { + var v1, v2, v3, base64Str = '', bytes = this.array(); + for (var i = 0; i < 15;) { + v1 = bytes[i++]; + v2 = bytes[i++]; + v3 = bytes[i++]; + base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + + BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] + + BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] + + BASE64_ENCODE_CHAR[v3 & 63]; + } + v1 = bytes[i]; + base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + + BASE64_ENCODE_CHAR[(v1 << 4) & 63] + + '=='; + return base64Str; + }; + + var exports = createMethod(); + + if (COMMON_JS) { + module.exports = exports; + } else { + /** + * @method md5 + * @description Md5 hash function, export to global in browsers. + * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash + * @returns {String} md5 hashes + * @example + * md5(''); // d41d8cd98f00b204e9800998ecf8427e + * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6 + * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0 + * + * // It also supports UTF-8 encoding + * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07 + * + * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` + * md5([]); // d41d8cd98f00b204e9800998ecf8427e + * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e + */ + root.md5 = exports; + if (AMD) { + define(function () { + return exports; + }); + } + } +})(); diff --git a/src/common/scanMixin.js b/src/common/scanMixin.js new file mode 100644 index 0000000..aca9889 --- /dev/null +++ b/src/common/scanMixin.js @@ -0,0 +1,207 @@ +// common/scanMixin.js +export default { + data() { + return { + scanReceiver: null, + isPageActive: false + } + }, + + methods: { + // 注册扫码广播(兼容多种设备) + registerScanBroadcast(scanCallback) { + try { + // 先尝试注册商米扫码头 + this.registerSunmiBroadcast(scanCallback) + .then(() => { + console.log('商米扫码头注册成功'); + }) + .catch((error) => { + console.log('商米扫码头注册失败,尝试新大陆扫码头:', error); + // 如果商米扫码头注册失败,尝试新大陆扫码头 + this.registerNewlandBroadcast(scanCallback); + }); + } catch (error) { + console.error("注册扫码广播失败:", error); + return false; + } + }, + + // 注册商米扫码头广播接收器 + registerSunmiBroadcast(scanCallback) { + return new Promise((resolve, reject) => { + try { + const main = plus.android.runtimeMainActivity(); + const IntentFilter = plus.android.importClass("android.content.IntentFilter"); + + const filter = new IntentFilter(); + filter.addAction("com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED"); + + const self = this; + const receiver = plus.android.implements( + "io.dcloud.feature.internal.reflect.BroadcastReceiver", + { + onReceive: (context, intent) => { + console.log('商米扫码广播接收,isPageActive:', self.isPageActive); + // 只有当页面活动时才处理广播 + if (!self.isPageActive) return; + + try { + // 导入 Intent 类以使用其方法 + const Intent = plus.android.importClass("android.content.Intent"); + + const scanResult = intent.getStringExtra("data"); + const sourceBytes = intent.getByteArrayExtra("source_byte"); + + console.log('商米扫码结果:', scanResult, sourceBytes); + + if (scanResult) { + self.handleScanResult(scanResult, scanCallback); + } + } catch (error) { + console.error('处理商米广播数据时出错:', error); + } + } + } + ); + + // 注册广播接收器 + main.registerReceiver(receiver, filter); + this.scanReceiver = receiver; + console.log('商米扫码广播接收器注册成功'); + resolve(); + } catch (error) { + console.error('注册商米广播接收器失败:', error); + reject(error); + } + }); + }, + + // 注册新大陆扫码头广播接收器 + registerNewlandBroadcast(scanCallback) { + try { + const main = plus.android.runtimeMainActivity(); + + // 先配置扫码枪广播设置 + try { + const Intent = plus.android.importClass("android.content.Intent"); + const intent = new Intent("com.android.scanner.service_settings"); + intent.putExtra( + "action_barcode_broadcast", + "com.android.server.scannerservice.broadcast" + ); + intent.putExtra("key_barcode_broadcast", "scannerdata"); + main.sendBroadcast(intent); + console.log('新大陆扫码枪广播配置完成'); + } catch (error) { + console.error("配置新大陆扫码枪广播失败:", error); + } + + // 注册广播接收器 + const IntentFilter = plus.android.importClass( + "android.content.IntentFilter" + ); + const filter = new IntentFilter(); + filter.addAction("com.android.server.scannerservice.broadcast"); + console.log("添加新大陆广播action完成"); + + const self = this; + const receiver = plus.android.implements( + "io.dcloud.feature.internal.reflect.BroadcastReceiver", + { + onReceive: (context, intent) => { + console.log('新大陆扫码广播接收,isPageActive:', self.isPageActive); + // 只有当页面活动时才处理广播 + if (!self.isPageActive) return; + + try { + // 导入 Intent 类以使用其方法 + const Intent = plus.android.importClass("android.content.Intent"); + + const scanResult = intent.getStringExtra("scannerdata"); + console.log("新大陆扫码结果:", scanResult); + if (scanResult) { + self.handleScanResult(scanResult, scanCallback); + } + } catch (error) { + console.error("处理新大陆广播数据时出错:", error); + } + }, + } + ); + + // 注册广播接收器 + main.registerReceiver(receiver, filter); + this.scanReceiver = receiver; + console.log("新大陆扫码广播注册成功,等待扫码..."); + } catch (error) { + console.error("注册新大陆扫码广播失败:", error); + throw error; + } + }, + + // 处理扫码结果的统一方法 + handleScanResult(scanResult, scanCallback) { + try { + // 数据清理:去除空格、换行符等 + let cleanCode = scanResult.replace(/\s+/g, '').replace(/[\r\n]/g, ''); + + console.log("扫码结果:", cleanCode); + + if (scanCallback) { + scanCallback(cleanCode); + } + } catch (error) { + console.error("处理扫码结果时出错:", error); + } + }, + + // 取消扫码广播监听 + unregisterScanBroadcast() { + if (this.scanReceiver) { + try { + const main = plus.android.runtimeMainActivity(); + main.unregisterReceiver(this.scanReceiver); + this.scanReceiver = null; + console.log("扫码广播注销成功"); + } catch (err) { + console.error("注销扫码广播失败:", err); + } + } + }, + + // 通用的商品扫描处理方法 + handleGoodsScan(scanCode, successCallback, errorCallback) { + const trimmedCode = scanCode ? scanCode.toString().trim() : ""; + + if (!trimmedCode) { + this.playError && this.playError(); + errorCallback && errorCallback("无效的二维码!"); + return; + } + + // 根据业务类型处理不同的扫码逻辑 + if (this.processScanCode) { + this.processScanCode(trimmedCode, successCallback, errorCallback); + } else { + // 默认处理方式 + successCallback && successCallback(trimmedCode); + } + } + }, + + // 页面激活状态管理 + onShow() { + this.isPageActive = true; + console.log('页面显示,设置 isPageActive 为 true'); + }, + + onHide() { + this.isPageActive = false; + }, + + onUnload() { + this.isPageActive = false; + this.unregisterScanBroadcast(); + } +} diff --git a/src/common/spark-md5.js b/src/common/spark-md5.js new file mode 100644 index 0000000..d2bdbbb --- /dev/null +++ b/src/common/spark-md5.js @@ -0,0 +1,751 @@ +(function (factory) { + if (typeof exports === 'object') { + // Node/CommonJS + module.exports = factory(); + } else if (typeof define === 'function' && define.amd) { + // AMD + define(factory); + } else { + // Browser globals (with support for web workers) + var glob; + + try { + glob = window; + } catch (e) { + glob = self; + } + + glob.SparkMD5 = factory(); + } +}(function (undefined) { + + 'use strict'; + + /* + * Fastest md5 implementation around (JKM md5). + * Credits: Joseph Myers + * + * @see http://www.myersdaily.org/joseph/javascript/md5-text.html + * @see http://jsperf.com/md5-shootout/7 + */ + + /* this function is much faster, + so if possible we use it. Some IEs + are the only ones I know of that + need the idiotic second function, + generated by an if clause. */ + var add32 = function (a, b) { + return (a + b) & 0xFFFFFFFF; + }, + hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; + + + function cmn(q, a, b, x, s, t) { + a = add32(add32(a, q), add32(x, t)); + return add32((a << s) | (a >>> (32 - s)), b); + } + + function md5cycle(x, k) { + var a = x[0], + b = x[1], + c = x[2], + d = x[3]; + + a += (b & c | ~b & d) + k[0] - 680876936 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[1] - 389564586 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[2] + 606105819 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[3] - 1044525330 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[4] - 176418897 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[5] + 1200080426 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[6] - 1473231341 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[7] - 45705983 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[8] + 1770035416 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[9] - 1958414417 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[10] - 42063 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[11] - 1990404162 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[12] + 1804603682 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[13] - 40341101 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[14] - 1502002290 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[15] + 1236535329 | 0; + b = (b << 22 | b >>> 10) + c | 0; + + a += (b & d | c & ~d) + k[1] - 165796510 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[6] - 1069501632 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[11] + 643717713 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[0] - 373897302 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[5] - 701558691 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[10] + 38016083 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[15] - 660478335 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[4] - 405537848 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[9] + 568446438 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[14] - 1019803690 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[3] - 187363961 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[8] + 1163531501 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[13] - 1444681467 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[2] - 51403784 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[7] + 1735328473 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[12] - 1926607734 | 0; + b = (b << 20 | b >>> 12) + c | 0; + + a += (b ^ c ^ d) + k[5] - 378558 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[8] - 2022574463 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[11] + 1839030562 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[14] - 35309556 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[1] - 1530992060 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[4] + 1272893353 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[7] - 155497632 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[10] - 1094730640 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[13] + 681279174 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[0] - 358537222 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[3] - 722521979 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[6] + 76029189 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[9] - 640364487 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[12] - 421815835 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[15] + 530742520 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[2] - 995338651 | 0; + b = (b << 23 | b >>> 9) + c | 0; + + a += (c ^ (b | ~d)) + k[0] - 198630844 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[5] - 57434055 | 0; + b = (b << 21 |b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[10] - 1051523 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0; + b = (b << 21 |b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[15] - 30611744 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0; + b = (b << 21 |b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[4] - 145523070 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[2] + 718787259 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[9] - 343485551 | 0; + b = (b << 21 | b >>> 11) + c | 0; + + x[0] = a + x[0] | 0; + x[1] = b + x[1] | 0; + x[2] = c + x[2] | 0; + x[3] = d + x[3] | 0; + } + + function md5blk(s) { + var md5blks = [], + i; /* Andy King said do it this way. */ + + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24); + } + return md5blks; + } + + function md5blk_array(a) { + var md5blks = [], + i; /* Andy King said do it this way. */ + + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24); + } + return md5blks; + } + + function md51(s) { + var n = s.length, + state = [1732584193, -271733879, -1732584194, 271733878], + i, + length, + tail, + tmp, + lo, + hi; + + for (i = 64; i <= n; i += 64) { + md5cycle(state, md5blk(s.substring(i - 64, i))); + } + s = s.substring(i - 64); + length = s.length; + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3); + } + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + + // Beware that the final length might not fit in 32 bits so we take care of that + tmp = n * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + + tail[14] = lo; + tail[15] = hi; + + md5cycle(state, tail); + return state; + } + + function md51_array(a) { + var n = a.length, + state = [1732584193, -271733879, -1732584194, 271733878], + i, + length, + tail, + tmp, + lo, + hi; + + for (i = 64; i <= n; i += 64) { + md5cycle(state, md5blk_array(a.subarray(i - 64, i))); + } + + // Not sure if it is a bug, however IE10 will always produce a sub array of length 1 + // containing the last element of the parent array if the sub array specified starts + // beyond the length of the parent array - weird. + // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue + a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0); + + length = a.length; + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= a[i] << ((i % 4) << 3); + } + + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + + // Beware that the final length might not fit in 32 bits so we take care of that + tmp = n * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + + tail[14] = lo; + tail[15] = hi; + + md5cycle(state, tail); + + return state; + } + + function rhex(n) { + var s = '', + j; + for (j = 0; j < 4; j += 1) { + s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F]; + } + return s; + } + + function hex(x) { + var i; + for (i = 0; i < x.length; i += 1) { + x[i] = rhex(x[i]); + } + return x.join(''); + } + + // In some cases the fast add32 function cannot be used.. + if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') { + add32 = function (x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF), + msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + }; + } + + // --------------------------------------------------- + + /** + * ArrayBuffer slice polyfill. + * + * @see https://github.com/ttaubert/node-arraybuffer-slice + */ + + if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { + (function () { + function clamp(val, length) { + val = (val | 0) || 0; + + if (val < 0) { + return Math.max(val + length, 0); + } + + return Math.min(val, length); + } + + ArrayBuffer.prototype.slice = function (from, to) { + var length = this.byteLength, + begin = clamp(from, length), + end = length, + num, + target, + targetArray, + sourceArray; + + if (to !== undefined) { + end = clamp(to, length); + } + + if (begin > end) { + return new ArrayBuffer(0); + } + + num = end - begin; + target = new ArrayBuffer(num); + targetArray = new Uint8Array(target); + + sourceArray = new Uint8Array(this, begin, num); + targetArray.set(sourceArray); + + return target; + }; + })(); + } + + // --------------------------------------------------- + + /** + * Helpers. + */ + + function toUtf8(str) { + if (/[\u0080-\uFFFF]/.test(str)) { + str = unescape(encodeURIComponent(str)); + } + + return str; + } + + function utf8Str2ArrayBuffer(str, returnUInt8Array) { + var length = str.length, + buff = new ArrayBuffer(length), + arr = new Uint8Array(buff), + i; + + for (i = 0; i < length; i += 1) { + arr[i] = str.charCodeAt(i); + } + + return returnUInt8Array ? arr : buff; + } + + function arrayBuffer2Utf8Str(buff) { + return String.fromCharCode.apply(null, new Uint8Array(buff)); + } + + function concatenateArrayBuffers(first, second, returnUInt8Array) { + var result = new Uint8Array(first.byteLength + second.byteLength); + + result.set(new Uint8Array(first)); + result.set(new Uint8Array(second), first.byteLength); + + return returnUInt8Array ? result : result.buffer; + } + + function hexToBinaryString(hex) { + var bytes = [], + length = hex.length, + x; + + for (x = 0; x < length - 1; x += 2) { + bytes.push(parseInt(hex.substr(x, 2), 16)); + } + + return String.fromCharCode.apply(String, bytes); + } + + // --------------------------------------------------- + + /** + * SparkMD5 OOP implementation. + * + * Use this class to perform an incremental md5, otherwise use the + * static methods instead. + */ + + function SparkMD5() { + // call reset to init the instance + this.reset(); + } + + /** + * Appends a string. + * A conversion will be applied if an utf8 string is detected. + * + * @param {String} str The string to be appended + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.append = function (str) { + // Converts the string to utf8 bytes if necessary + // Then append as binary + this.appendBinary(toUtf8(str)); + + return this; + }; + + /** + * Appends a binary string. + * + * @param {String} contents The binary string to be appended + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.appendBinary = function (contents) { + this._buff += contents; + this._length += contents.length; + + var length = this._buff.length, + i; + + for (i = 64; i <= length; i += 64) { + md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i))); + } + + this._buff = this._buff.substring(i - 64); + + return this; + }; + + /** + * Finishes the incremental computation, reseting the internal state and + * returning the result. + * + * @param {Boolean} raw True to get the raw string, false to get the hex string + * + * @return {String} The result + */ + SparkMD5.prototype.end = function (raw) { + var buff = this._buff, + length = buff.length, + i, + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ret; + + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3); + } + + this._finish(tail, length); + ret = hex(this._hash); + + if (raw) { + ret = hexToBinaryString(ret); + } + + this.reset(); + + return ret; + }; + + /** + * Resets the internal state of the computation. + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.reset = function () { + this._buff = ''; + this._length = 0; + this._hash = [1732584193, -271733879, -1732584194, 271733878]; + + return this; + }; + + /** + * Gets the internal state of the computation. + * + * @return {Object} The state + */ + SparkMD5.prototype.getState = function () { + return { + buff: this._buff, + length: this._length, + hash: this._hash.slice() + }; + }; + + /** + * Gets the internal state of the computation. + * + * @param {Object} state The state + * + * @return {SparkMD5} The instance itself + */ + SparkMD5.prototype.setState = function (state) { + this._buff = state.buff; + this._length = state.length; + this._hash = state.hash; + + return this; + }; + + /** + * Releases memory used by the incremental buffer and other additional + * resources. If you plan to use the instance again, use reset instead. + */ + SparkMD5.prototype.destroy = function () { + delete this._hash; + delete this._buff; + delete this._length; + }; + + /** + * Finish the final calculation based on the tail. + * + * @param {Array} tail The tail (will be modified) + * @param {Number} length The length of the remaining buffer + */ + SparkMD5.prototype._finish = function (tail, length) { + var i = length, + tmp, + lo, + hi; + + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(this._hash, tail); + for (i = 0; i < 16; i += 1) { + tail[i] = 0; + } + } + + // Do the final computation based on the tail and length + // Beware that the final length may not fit in 32 bits so we take care of that + tmp = this._length * 8; + tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); + lo = parseInt(tmp[2], 16); + hi = parseInt(tmp[1], 16) || 0; + + tail[14] = lo; + tail[15] = hi; + md5cycle(this._hash, tail); + }; + + /** + * Performs the md5 hash on a string. + * A conversion will be applied if utf8 string is detected. + * + * @param {String} str The string + * @param {Boolean} [raw] True to get the raw string, false to get the hex string + * + * @return {String} The result + */ + SparkMD5.hash = function (str, raw) { + // Converts the string to utf8 bytes if necessary + // Then compute it using the binary function + return SparkMD5.hashBinary(toUtf8(str), raw); + }; + + /** + * Performs the md5 hash on a binary string. + * + * @param {String} content The binary string + * @param {Boolean} [raw] True to get the raw string, false to get the hex string + * + * @return {String} The result + */ + SparkMD5.hashBinary = function (content, raw) { + var hash = md51(content), + ret = hex(hash); + + return raw ? hexToBinaryString(ret) : ret; + }; + + // --------------------------------------------------- + + /** + * SparkMD5 OOP implementation for array buffers. + * + * Use this class to perform an incremental md5 ONLY for array buffers. + */ + SparkMD5.ArrayBuffer = function () { + // call reset to init the instance + this.reset(); + }; + + /** + * Appends an array buffer. + * + * @param {ArrayBuffer} arr The array to be appended + * + * @return {SparkMD5.ArrayBuffer} The instance itself + */ + SparkMD5.ArrayBuffer.prototype.append = function (arr) { + var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), + length = buff.length, + i; + + this._length += arr.byteLength; + + for (i = 64; i <= length; i += 64) { + md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i))); + } + + this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0); + + return this; + }; + + /** + * Finishes the incremental computation, reseting the internal state and + * returning the result. + * + * @param {Boolean} raw True to get the raw string, false to get the hex string + * + * @return {String} The result + */ + SparkMD5.ArrayBuffer.prototype.end = function (raw) { + var buff = this._buff, + length = buff.length, + tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + i, + ret; + + for (i = 0; i < length; i += 1) { + tail[i >> 2] |= buff[i] << ((i % 4) << 3); + } + + this._finish(tail, length); + ret = hex(this._hash); + + if (raw) { + ret = hexToBinaryString(ret); + } + + this.reset(); + + return ret; + }; + + /** + * Resets the internal state of the computation. + * + * @return {SparkMD5.ArrayBuffer} The instance itself + */ + SparkMD5.ArrayBuffer.prototype.reset = function () { + this._buff = new Uint8Array(0); + this._length = 0; + this._hash = [1732584193, -271733879, -1732584194, 271733878]; + + return this; + }; + + /** + * Gets the internal state of the computation. + * + * @return {Object} The state + */ + SparkMD5.ArrayBuffer.prototype.getState = function () { + var state = SparkMD5.prototype.getState.call(this); + + // Convert buffer to a string + state.buff = arrayBuffer2Utf8Str(state.buff); + + return state; + }; + + /** + * Gets the internal state of the computation. + * + * @param {Object} state The state + * + * @return {SparkMD5.ArrayBuffer} The instance itself + */ + SparkMD5.ArrayBuffer.prototype.setState = function (state) { + // Convert string to buffer + state.buff = utf8Str2ArrayBuffer(state.buff, true); + + return SparkMD5.prototype.setState.call(this, state); + }; + + SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy; + + SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish; + + /** + * Performs the md5 hash on an array buffer. + * + * @param {ArrayBuffer} arr The array buffer + * @param {Boolean} [raw] True to get the raw string, false to get the hex one + * + * @return {String} The result + */ + SparkMD5.ArrayBuffer.hash = function (arr, raw) { + var hash = md51_array(new Uint8Array(arr)), + ret = hex(hash); + + return raw ? hexToBinaryString(ret) : ret; + }; + + return SparkMD5; +})); diff --git a/src/common/tool.js b/src/common/tool.js new file mode 100644 index 0000000..54c89a2 --- /dev/null +++ b/src/common/tool.js @@ -0,0 +1,858 @@ +// 判断类型集合 +export const checkStr = (str, type) => { + switch (type) { + case 'phone': //手机号码 + return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str); + case 'tel': //座机 + return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str); + case 'card': //身份证 + return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str); + case 'pwd': //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线 + return /^[a-zA-Z]\w{5,17}$/.test(str) + case 'postal': //邮政编码 + return /[1-9]\d{5}(?!\d)/.test(str); + case 'QQ': //QQ号 + return /^[1-9][0-9]{4,9}$/.test(str); + case 'email': //邮箱 + return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str); + case 'money': //金额(小数点2位) + return /^\d*(?:\.\d{0,2})?$/.test(str); + case 'URL': //网址 + return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str) + case 'IP': //IP + return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str); + case 'date': //日期时间 + return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/ + .test(str) + case 'number': //数字 + return /^[0-9]$/.test(str); + case 'english': //英文 + return /^[a-zA-Z]+$/.test(str); + case 'chinese': //中文 + return /^[\\u4E00-\\u9FA5]+$/.test(str); + case 'lower': //小写 + return /^[a-z]+$/.test(str); + case 'upper': //大写 + return /^[A-Z]+$/.test(str); + case 'HTML': //HTML标记 + return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str); + default: + return true; + } +} + +// 格式化时间-小于10补0 +function formatDigit(n) { + return n.toString().replace(/^(\d)$/, '0$1'); +} +// 格式化时间,通用 +export const formatDate = (timestamp, formats) => { + /* formats格式包括: + 1. Y-M-D + 2. Y-M-D h:m:s + 3. Y年M月D日 + 4. Y年M月D日 h时m分 + 5. Y年M月D日 h时m分s秒 + 示例:console.log(formatDate(1500305226034, 'Y年M月D日 h:m:s')) ==> 2017年07月17日 23:27:06 + */ + formats = formats || 'Y-M-D'; + var myDate = undefined; + if (timestamp) { + if (typeof(timestamp) != 'string') { + myDate = timestamp; + } else { + myDate = new Date(timestamp); + } + } else { + myDate = new Date(); + } + + var year = myDate.getFullYear(); + var month = formatDigit(myDate.getMonth() + 1); + var day = formatDigit(myDate.getDate()); + var hour = formatDigit(myDate.getHours()); + var minute = formatDigit(myDate.getMinutes()); + var second = formatDigit(myDate.getSeconds()); + return formats.replace(/Y|M|D|h|m|s/g, (matches) => { + return { + Y: year, + M: month, + D: day, + h: hour, + m: minute, + s: second + } [matches]; + }); +} + +// 验证邮箱 +export const isEmail = (s) => { + return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s) +} +// 验证手机号码 +export const isMobile = (s) => { + return /^1[0-9]{10}$/.test(s) +} +// 验证电话号码 +export const isPhone = (s) => { + return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s) +} +// 验证是否url地址 +export const isURL = (s) => { + return /^http[s]?:\/\/.*/.test(s) +} +// 验证是否字符串 +export const isString = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'String' +} +// 验证是否是否数字 +export const isNumber = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Number' +} +// 验证是否是Boolean +export const isBoolean = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean' +} +// 验证是否是函数 +export const isFunction = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Function' +} +//是否为null +export const isNull = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Null' +} +//是否undefined +export const isUndefined = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined' +} +//是否对象 +export const isObj = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Object' +} +//是否数组 +export const isArray = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Array' +} +// 是否时间对象 +export const isDate = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Date' +} +//是否正则 +export const isRegExp = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp' +} +// 是否错误对象 +export const isError = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Error' +} +//是否Symbol函数 +export const isSymbol = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol' +} +// 是否Promise对象 +export const isPromise = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Promise' +} +// 是否Set对象 +export const isSet = (o) => { + return Object.prototype.toString.call(o).slice(8, -1) === 'Set' +} +//判断数据是不是引用类型的数据 +export function isObject(value) { + let type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +// 字符串超出多少字显示省略号 +export function strOut(str, len=0,type) { + type=type||'star'; + var restr = ''; + if (str) { + if (str.length >= len) { + restr = str.substring(0, len) + (type=='star'?'***':'...'); + } else { + restr = str; + } + } + return restr; +} +//浮点数加法运算--解决精度丢失(传入Number,返回Number) +export function FloatAdd(arg1, arg2) { + var r1, r2, m; + try { + r1 = arg1.toString().split('.')[1].length; + } catch (e) { + r1 = 0; + } + try { + r2 = arg2.toString().split('.')[1].length; + } catch (e) { + r2 = 0; + } + m = Math.pow(10, Math.max(r1, r2)); + return (arg1 * m + arg2 * m) / m; +} + +//浮点数乘法运算--解决精度丢失(传入Number,返回Number) +export function FloatMul(arg1, arg2) { + var m = 0, + s1 = arg1.toString(), + s2 = arg2.toString(); + try { + m += s1.split('.')[1].length; + } catch (e) {} + try { + m += s2.split('.')[1].length; + } catch (e) {} + return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m); +} +//随机数时间戳 (返回数字符串) +export function uniqueId() { + var a = Math.random, + b = parseInt; + return Number(new Date()).toString() + b(10 * a()) + b(10 * a()) + b(10 * a()); +} + +// 数组随机洗牌算法 +export const shuffle = (arr) => { + var result = [], + random; + while (arr.length > 0) { + random = Math.floor(Math.random() * arr.length); + result.push(arr[random]) + arr.splice(random, 1) + } + return result; +} +// 严格的身份证号码校验 +export const isCardID = (sId) => { + if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) { + console.log('你输入的身份证长度或格式错误') + return false + } + //身份证城市 + var aCity = { + 11: "北京", + 12: "天津", + 13: "河北", + 14: "山西", + 15: "内蒙古", + 21: "辽宁", + 22: "吉林", + 23: "黑龙江", + 31: "上海", + 32: "江苏", + 33: "浙江", + 34: "安徽", + 35: "福建", + 36: "江西", + 37: "山东", + 41: "河南", + 42: "湖北", + 43: "湖南", + 44: "广东", + 45: "广西", + 46: "海南", + 50: "重庆", + 51: "四川", + 52: "贵州", + 53: "云南", + 54: "西藏", + 61: "陕西", + 62: "甘肃", + 63: "青海", + 64: "宁夏", + 65: "新疆", + 71: "台湾", + 81: "香港", + 82: "澳门", + 91: "国外" + }; + if (!aCity[parseInt(sId.substr(0, 2))]) { + console.log('你的身份证地区非法') + return false + } + + // 出生日期验证 + var sBirthday = (sId.substr(6, 4) + "-" + Number(sId.substr(10, 2)) + "-" + Number(sId.substr(12, 2))).replace(/-/g, + "/"), + d = new Date(sBirthday) + if (sBirthday != (d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate())) { + console.log('身份证上的出生日期非法') + return false + } + + // 身份证号码校验 + var sum = 0, + weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2], + codes = "10X98765432" + for (var i = 0; i < sId.length - 1; i++) { + sum += sId[i] * weights[i]; + } + var last = codes[sum % 11]; //计算出来的最后一位身份证号码 + if (sId[sId.length - 1] != last) { + console.log('你输入的身份证号非法') + return false + } + + return true +} +// 随机整数范围 +export const random = (min, max) => { + if (arguments.length === 2) { + return Math.floor(min + Math.random() * ((max + 1) - min)) + } else { + return null; + } +} +// 将阿拉伯数字翻译成中文的大写数字 +export const numberToChinese = (num) => { + var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"); + var BB = new Array("", "十", "百", "仟", "萬", "億", "点", ""); + var a = ("" + num).replace(/(^0*)/g, "").split("."), + k = 0, + re = ""; + for (var i = a[0].length - 1; i >= 0; i--) { + switch (k) { + case 0: + re = BB[7] + re; + break; + case 4: + if (!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$") + .test(a[0])) + re = BB[4] + re; + break; + case 8: + re = BB[5] + re; + BB[7] = BB[5]; + k = 0; + break; + } + if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) + re = AA[0] + re; + if (a[0].charAt(i) != 0) + re = AA[a[0].charAt(i)] + BB[k % 4] + re; + k++; + } + + if (a.length > 1) // 加上小数部分(如果有小数部分) + { + re += BB[6]; + for (var i = 0; i < a[1].length; i++) + re += AA[a[1].charAt(i)]; + } + if (re == '一十') + re = "十"; + if (re.match(/^一/) && re.length == 3) + re = re.replace("一", ""); + return re; +} +// 将数字转换为大写金额 +export const changeToChinese = (Num) => { + //判断如果传递进来的不是字符的话转换为字符 + if (typeof Num == "number") { + Num = new String(Num); + }; + Num = Num.replace(/,/g, "") //替换tomoney()中的“,” + Num = Num.replace(/ /g, "") //替换tomoney()中的空格 + Num = Num.replace(/¥/g, "") //替换掉可能出现的¥字符 + if (isNaN(Num)) { //验证输入的字符是否为数字 + //alert("请检查小写金额是否正确"); + return ""; + }; + //字符处理完毕后开始转换,采用前后两部分分别转换 + var part = String(Num).split("."); + var newchar = ""; + //小数点前进行转化 + for (var i = part[0].length - 1; i >= 0; i--) { + if (part[0].length > 10) { + return ""; + //若数量超过拾亿单位,提示 + } + var tmpnewchar = "" + var perchar = part[0].charAt(i); + switch (perchar) { + case "0": + tmpnewchar = "零" + tmpnewchar; + break; + case "1": + tmpnewchar = "壹" + tmpnewchar; + break; + case "2": + tmpnewchar = "贰" + tmpnewchar; + break; + case "3": + tmpnewchar = "叁" + tmpnewchar; + break; + case "4": + tmpnewchar = "肆" + tmpnewchar; + break; + case "5": + tmpnewchar = "伍" + tmpnewchar; + break; + case "6": + tmpnewchar = "陆" + tmpnewchar; + break; + case "7": + tmpnewchar = "柒" + tmpnewchar; + break; + case "8": + tmpnewchar = "捌" + tmpnewchar; + break; + case "9": + tmpnewchar = "玖" + tmpnewchar; + break; + } + switch (part[0].length - i - 1) { + case 0: + tmpnewchar = tmpnewchar + "元"; + break; + case 1: + if (perchar != 0) tmpnewchar = tmpnewchar + "拾"; + break; + case 2: + if (perchar != 0) tmpnewchar = tmpnewchar + "佰"; + break; + case 3: + if (perchar != 0) tmpnewchar = tmpnewchar + "仟"; + break; + case 4: + tmpnewchar = tmpnewchar + "万"; + break; + case 5: + if (perchar != 0) tmpnewchar = tmpnewchar + "拾"; + break; + case 6: + if (perchar != 0) tmpnewchar = tmpnewchar + "佰"; + break; + case 7: + if (perchar != 0) tmpnewchar = tmpnewchar + "仟"; + break; + case 8: + tmpnewchar = tmpnewchar + "亿"; + break; + case 9: + tmpnewchar = tmpnewchar + "拾"; + break; + } + var newchar = tmpnewchar + newchar; + } + //小数点之后进行转化 + if (Num.indexOf(".") != -1) { + if (part[1].length > 2) { + // alert("小数点之后只能保留两位,系统将自动截断"); + part[1] = part[1].substr(0, 2) + } + for (i = 0; i < part[1].length; i++) { + tmpnewchar = "" + perchar = part[1].charAt(i) + switch (perchar) { + case "0": + tmpnewchar = "零" + tmpnewchar; + break; + case "1": + tmpnewchar = "壹" + tmpnewchar; + break; + case "2": + tmpnewchar = "贰" + tmpnewchar; + break; + case "3": + tmpnewchar = "叁" + tmpnewchar; + break; + case "4": + tmpnewchar = "肆" + tmpnewchar; + break; + case "5": + tmpnewchar = "伍" + tmpnewchar; + break; + case "6": + tmpnewchar = "陆" + tmpnewchar; + break; + case "7": + tmpnewchar = "柒" + tmpnewchar; + break; + case "8": + tmpnewchar = "捌" + tmpnewchar; + break; + case "9": + tmpnewchar = "玖" + tmpnewchar; + break; + } + if (i == 0) tmpnewchar = tmpnewchar + "角"; + if (i == 1) tmpnewchar = tmpnewchar + "分"; + newchar = newchar + tmpnewchar; + } + } + //替换所有无用汉字 + while (newchar.search("零零") != -1) + newchar = newchar.replace("零零", "零"); + newchar = newchar.replace("零亿", "亿"); + newchar = newchar.replace("亿万", "亿"); + newchar = newchar.replace("零万", "万"); + newchar = newchar.replace("零元", "元"); + newchar = newchar.replace("零角", ""); + newchar = newchar.replace("零分", ""); + if (newchar.charAt(newchar.length - 1) == "元") { + newchar = newchar + "整" + } + return newchar; +} +// 判断一个元素是否在数组中 +export const arrContains = (arr, val) => { + return arr.indexOf(val) != -1 ? true : false; +} +// 数组去重 +export const unique = (arr) => { + if (Array.hasOwnProperty('from')) { + return Array.from(new Set(arr)); + } else { + var n = {}, + r = []; + for (var i = 0; i < arr.length; i++) { + if (!n[arr[i]]) { + n[arr[i]] = true; + r.push(arr[i]); + } + } + return r; + } +} + +// 数组删除其中一个元素 +export const arrRemove = (arr, ele) => { + var index = arr.indexOf(ele); + if (index > -1) { + arr.splice(index, 1); + } + return arr; +} + +// 求数组中的最大值 +export const arrMax = (arr) => { + return Math.max.apply(null, arr); +} +// 求数组中的最小值 +export const arrMin = (arr) => { + return Math.min.apply(null, arr); +} +// 数组中的值求和 +export const arrSum = (arr) => { + return arr.reduce((pre, cur) => { + return pre + cur + }) +} +// 去除空格,type: 1-所有空格 2-前后空格 3-前空格 4-后空格 +export const strTrim = (str, type) => { + type = type || 2 + switch (type) { + case 1: + return str.replace(/\s+/g, ""); + case 2: + return str.replace(/(^\s*)|(\s*$)/g, ""); + case 3: + return str.replace(/(^\s*)/g, ""); + case 4: + return str.replace(/(\s*$)/g, ""); + default: + return str; + } +} +// 字符转换,type: 1:首字母大写 2:首字母小写 3:大小写转换 4:全部大写 5:全部小写 +export const changeCase = (str, type) => { + type = type || 4 + switch (type) { + case 1: + return str.replace(/\b\w+\b/g, (word) => { + return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); + + }); + case 2: + return str.replace(/\b\w+\b/g, (word) => { + return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase(); + }); + case 3: + return str.split('').map((word) => { + if (/[a-z]/.test(word)) { + return word.toUpperCase(); + } else { + return word.toLowerCase() + } + }).join('') + case 4: + return str.toUpperCase(); + case 5: + return str.toLowerCase(); + default: + return str; + } +} +// 检测密码强度 等级1-5 +export const checkPwd = (str) => { + var Lv = 1; + if (str.length < 6) { + return Lv + } + if (/[0-9]/.test(str)) { + Lv++ + } + if (/[a-z]/.test(str)) { + Lv++ + } + if (/[A-Z]/.test(str)) { + Lv++ + } + if (/[\.|-|_]/.test(str)) { + Lv++ + } + return Lv; +} +// 在字符串中插入新字符串 +export const insertStr = (soure, index, newStr) => { + var str = soure.slice(0, index) + newStr + soure.slice(index); + return str; +} +// 16进制颜色值转RGBA字符串 +export const colorToRGB = (val, opa) => { + + var pattern = /^(#?)[a-fA-F0-9]{6}$/; //16进制颜色值校验规则 + var isOpa = typeof opa == 'number'; //判断是否有设置不透明度 + + if (!pattern.test(val)) { //如果值不符合规则返回空字符 + return ''; + } + + var v = val.replace(/#/, ''); //如果有#号先去除#号 + var rgbArr = []; + var rgbStr = ''; + + for (var i = 0; i < 3; i++) { + var item = v.substring(i * 2, i * 2 + 2); + var num = parseInt(item, 16); + rgbArr.push(num); + } + + rgbStr = rgbArr.join(); + rgbStr = 'rgb' + (isOpa ? 'a' : '') + '(' + rgbStr + (isOpa ? ',' + opa : '') + ')'; + return rgbStr; +} + +export const dateFormat = (fmt, date) => { + let ret; + const opt = { + "Y+": date.getFullYear().toString(), // 年 + "m+": (date.getMonth() + 1).toString(), // 月 + "d+": date.getDate().toString(), // 日 + "H+": date.getHours().toString(), // 时 + "M+": date.getMinutes().toString(), // 分 + "S+": date.getSeconds().toString() // 秒 + // 有其他格式化字符需求可以继续添加,必须转化成字符串 + }; + for (let k in opt) { + ret = new RegExp("(" + k + ")").exec(fmt); + if (ret) { + fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0"))) + }; + }; + return fmt; +} + +//uni-app request请求封装 +//使用方法 供新手参考 : +// 在vue文件中 import { uniAjax } from '@/js_sdk/common.js' +//uniAjax("api/userInfo",{name:"admin"},"POST",(res)=>{ +//成功回调函数 +// },(err)=>{ +//失败回调函数 +// },(data)=>{ +//完成回调函数 +// }) +export const uniAjax = (url, dataPost, type, successCallBack, errorCallBack, completeCallBack) => { + let obj = {}; + obj.url = url || ""; + obj.data = dataPost || {}; + obj.methods = type || "POST"; + obj.success = successCallBack || function(data) {}; + obj.error = errorCallBack || function(data) {}; + obj.complete = completeCallBack || function(data) {}; + uni.request({ + url: obj.url, + data: obj.data, + method: obj.methods, + header: "", + dataType: "json", + success: obj.success, + fail: obj.error, + complete: obj.complete + }); +} +// 数据深拷贝 +//使用方法 供新手参考 : +// 在vue文件中 import { cloneObj } from '@/js_sdk/common.js' +// let dataList = cloneObj(data) +export const cloneObj = (obj) => { + let newobj = obj.constructor === Array ? [] : {}; + if (typeof obj !== 'object') { + return; + } + for (let i in obj) { + newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i]; + } + return newobj +}; + +// 常用正则判断 +//使用方法 供新手参考 : +// 在vue文件中 import { regExpObj } from '@/js_sdk/common.js' +// let valueReg = regExpObj.regExpZh(value) +export const regExpObj = { + //匹配有没有中文 + regExpZh: (str) => { + return RegExp(/[\u4e00-\u9fa5]+/).test(str) + }, + //只允许中文 + onlyregExpZh: (str) => { + return RegExp(/^[\u4e00-\u9fa5]+$/).test(str) + }, + //只允许中文,英文字母,数字 + regExpZhEnNum: (str) => { + return RegExp(/^[\u4e00-\u9fa5A-Za-z0-9]+$/).test(str) + }, + //匹配身份证 + regExpIDCard: (str) => { + return RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(str); + }, + //匹配手机号 + regExpPhone: (str) => { + return RegExp(/^1[3456789]\d{9}$/).test(str); + }, + //匹配邮箱格式 + regExpEmail: (str) => { + return RegExp(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/).test(str); + }, + //匹配域名 + regExpRealmName: (str) => { + return RegExp(/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\/.?/).test(str) + }, + //匹配InternetURL + regExpInternetURL: (str) => { + return RegExp(/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/).test(str) + }, + //匹配密码(密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)) + regExpPwd: (str) => { + return RegExp(/^[a-zA-Z]\w{5,17}$/).test(str) + }, + //日期格式 2019-01-12 + regExpDate: (str) => { + return RegExp(/^\d{4}-\d{1,2}-\d{1,2}/).test(str) + }, + //匹配空白行 + regExpWhiteLine: (str) => { + return RegExp(/\n\s*\r/).test(str) + }, + //匹配正数、负数、和小数 + regExpNumberFloat: (str) => { + return RegExp(/^(\-|\+)?\d+(\.\d+)?$/).test(str) + }, + //匹配零和非零开头的数字 + regExpZeroNumber: (str) => { + return RegExp(/^(0|[1-9][0-9]*)$/).test(str) + }, + //匹配数字 + regExpNumber: (str) => { + return RegExp(/^[0-9]*$/).test(str) + }, + //长度为8-20的所有字符 + regExpAllByte: (str) => { + return RegExp(/^.{8,20}$/).test(str) + } +} + +//判断枚举对象取值 +// 在vue文件中 import { enumeration } from '@/js_sdk/common.js' +// let valueStatus = enumeration(enumObj,0); +export const enumeration = (enumObj, index) => { + //enumObj ====> 枚举对象 例如:{0:"不通过",1:"通过",2:"待审批"}; + //index ====> 查询属性值或属性名 + for (let i in enumObj) { + if (i == index) { + return enumObj[i]; + } else if (enumObj[i] == index) { + return i; + } + } +} + +//本地缓存 +export const dataStroage = { + //设置离线缓存 + setStroage: (key, data) => { + uni.setStorageSync(key, data); + }, + //获取离线缓存 + getStroage: (key) => { + let data = uni.getStorageSync(key); + return data; + }, + //移除某个离线缓存 + removeStroage: (key) => { + uni.removeStorageSync(key); + }, + //移除所有离线缓存 + closeAllStroage: () => { + uni.clearStorageSync(); + } +} + +// 原生Js获取URL传递的参数 +export const getUrlParam = (name) => { + let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + let r = window.location.search.substr(1).match(reg); + if (r != null) return unescape(r[2]); + return null; +} + +//大于固定字符串显示省略号 +export const handleStr = (str,length) => { + let handle_str; + str.length <= length ? handle_str = str : handle_str = str.slice(0, length) + "..."; + return handle_str +} + +/* 倒计时 + endtime 结束时间 + nowtime 开始时间 默认值时当前时间 +*/ +export const countDown = (endtime,nowtime) => { + let day = 0, + hour = 0, + minute = 0, + second = 0, //时间默认值 + newtime = nowtime || new Date().valueOf()/1000, + times = endtime - newtime; + if (times > 0) { + day = Math.floor(times / (60 * 60 * 24)); + hour = Math.floor(times / (60 * 60)) - (day * 24); + minute = Math.floor(times / 60) - (day * 24 * 60) - (hour * 60); + second = Math.floor(times) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60); + } + day <= 9 ? day = '0' + day : null; + hour <= 9 ? hour = '0' + hour : null; + minute <= 9 ? minute = '0' + minute : null; + second <= 9 ? second = '0' + second : null; + return {day,hour,minute,second} +} + +/* 判断数据类型 */ +export const isDataType = { + isArray:(obj) => { + return (typeof obj == 'object') && obj.constructor == Array; + }, + isObject:(obj) => { + return Object.prototype.toString.call(obj) === "[object Object]"; + }, + isEmptyObject:(obj) => { + let t; + for (t in obj) return !1; + return !0 + } +} \ No newline at end of file diff --git a/src/common/uni.css b/src/common/uni.css new file mode 100644 index 0000000..76340d7 --- /dev/null +++ b/src/common/uni.css @@ -0,0 +1,1459 @@ +@font-face { + font-family: uniicons; + font-weight: normal; + font-style: normal; + src: url('~@/static/uni.ttf') format('truetype'); +} + +/* #ifdef H5 */ +.fix-left-window { + padding-left: var(--window-left); +} +.pc-hide { + display: none !important; +} +/* #endif */ + +/*通用 */ + +/* view{ + font-size:28rpx; + line-height:1.8; +} */ +progress, checkbox-group{ + width: 100%; +} +form { + width: 100%; +} +.uni-flex { + display: flex; + flex-direction: row; +} +.uni-flex-item { + flex: 1; +} +.uni-row { + flex-direction: row; +} +.uni-column { + flex-direction: column; +} +.uni-link{ + color:#576B95; + font-size:26rpx; +} +.uni-center{ + text-align:center; +} +.uni-inline-item{ + display: flex; + flex-direction: row; + align-items:center; +} +.uni-inline-item text{ + margin-right: 20rpx; +} +.uni-inline-item text:last-child{ + margin-right: 0rpx; + margin-left: 20rpx; +} + +/* page */ +.common-page-head{ + padding:35rpx; + text-align: center; +} +.common-page-head-title { + display: inline-block; + padding: 0 40rpx; + font-size: 30rpx; + height: 88rpx; + line-height: 88rpx; + color: #BEBEBE; + box-sizing: border-box; + border-bottom: 2rpx solid #D8D8D8; +} + +.uni-padding-wrap{ + /* width:690rpx; */ + padding:0 30rpx; +} +.uni-word { + text-align: center; + padding:200rpx 100rpx; +} +.uni-title { + font-size:30rpx; + font-weight:500; + padding:20rpx 0; + line-height:1.5; +} +.uni-text{ + font-size:28rpx; +} +.uni-title text{ + font-size:24rpx; + color:#888; +} + +.uni-text-gray{ + color: #ccc; +} +.uni-text-small { + font-size:24rpx; +} +.uni-common-mb{ + margin-bottom:30rpx; +} +.uni-common-pb{ + padding-bottom:30rpx; +} +.uni-common-pl{ + padding-left:30rpx; +} +.uni-common-mt{ + margin-top:30rpx; +} +/* 背景色 */ +.uni-bg-red{ + background:#F76260; color:#FFF; +} +.uni-bg-green{ + background:#09BB07; color:#FFF; +} +.uni-bg-blue{ + background:#007AFF; color:#FFF; +} +/* 标题 */ +.uni-h1 {font-size: 80rpx; font-weight:700;} +.uni-h2 {font-size: 60rpx; font-weight:700;} +.uni-h3 {font-size: 48rpx; font-weight:700;} +.uni-h4 {font-size: 36rpx; font-weight:700;} +.uni-h5 {font-size: 28rpx; color: #8f8f94;} +.uni-h6 {font-size: 24rpx; color: #8f8f94;} +.uni-bold{font-weight:bold;} + +/* 文本溢出隐藏 */ +.uni-ellipsis {overflow: hidden; white-space: nowrap; text-overflow: ellipsis;} + +/* 竖向百分百按钮 */ +.uni-btn-v{ + padding:10rpx 0; +} +.uni-btn-v button{margin:20rpx 0;} + +/* 表单 */ +.uni-form-item{ + display:flex; + width:100%; + padding:10rpx 0; +} +.uni-form-item .title{ + padding:10rpx 25rpx; +} +.uni-label { + width: 210rpx; + word-wrap: break-word; + word-break: break-all; + text-indent:20rpx; +} +.uni-input { + height: 50rpx; + padding: 15rpx 25rpx; + line-height:50rpx; + font-size:28rpx; + background:#FFF; + flex: 1; +} +radio-group, checkbox-group{ + width:100%; +} +radio-group label, checkbox-group label{ + padding-right:20rpx; +} +.uni-form-item .with-fun{ + display:flex; + flex-wrap:nowrap; + background:#FFFFFF; +} +.uni-form-item .with-fun .uni-icon{ + width:40px; + height:80rpx; + line-height:80rpx; + flex-shrink:0; +} + +/* loadmore */ +.uni-loadmore{ + height:80rpx; + line-height:80rpx; + text-align:center; + padding-bottom:30rpx; +} +/*数字角标*/ +.uni-badge, +.uni-badge-default { + font-family: 'Helvetica Neue', Helvetica, sans-serif; + font-size: 12px; + line-height: 1; + display: inline-block; + padding: 3px 6px; + color: #333; + border-radius: 100px; + background-color: rgba(0, 0, 0, .15); +} +.uni-badge.uni-badge-inverted { + padding: 0 5px 0 0; + color: #929292; + background-color: transparent +} +.uni-badge-primary { + color: #fff; + background-color: #007aff +} +.uni-badge-blue.uni-badge-inverted, +.uni-badge-primary.uni-badge-inverted { + color: #007aff; + background-color: transparent +} +.uni-badge-green, +.uni-badge-success { + color: #fff; + background-color: #4cd964; +} +.uni-badge-green.uni-badge-inverted, +.uni-badge-success.uni-badge-inverted { + color: #4cd964; + background-color: transparent +} +.uni-badge-warning, +.uni-badge-yellow { + color: #fff; + background-color: #f0ad4e +} +.uni-badge-warning.uni-badge-inverted, +.uni-badge-yellow.uni-badge-inverted { + color: #f0ad4e; + background-color: transparent +} +.uni-badge-danger, +.uni-badge-red { + color: #fff; + background-color: #dd524d +} +.uni-badge-danger.uni-badge-inverted, +.uni-badge-red.uni-badge-inverted { + color: #dd524d; + background-color: transparent +} +.uni-badge-purple, +.uni-badge-royal { + color: #fff; + background-color: #8a6de9 +} +.uni-badge-purple.uni-badge-inverted, +.uni-badge-royal.uni-badge-inverted { + color: #8a6de9; + background-color: transparent +} + +/*折叠面板 */ +.uni-collapse-content { + height: 0; + width: 100%; + overflow: hidden; +} +.uni-collapse-content.uni-active { + height: auto; +} + +/*卡片视图 */ +.uni-card { + background: #fff; + border-radius: 8rpx; + margin:20rpx 0; + position: relative; + box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, .3); +} +.uni-card-content { + font-size: 30rpx; +} +.uni-card-content.image-view{ + width: 100%; + margin: 0; +} +.uni-card-content-inner { + position: relative; + padding: 30rpx; +} +.uni-card-footer, +.uni-card-header { + position: relative; + display: flex; + min-height: 50rpx; + padding: 20rpx 30rpx; + justify-content: space-between; + align-items: center; +} +.uni-card-header { + font-size: 36rpx; +} +.uni-card-footer { + color: #6d6d72; +} +.uni-card-footer:before, +.uni-card-header:after { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 2rpx; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #c8c7cc; +} +.uni-card-header:after { + top: auto; + bottom: 0; +} +.uni-card-media { + justify-content: flex-start; +} +.uni-card-media-logo { + height: 84rpx; + width: 84rpx; + margin-right: 20rpx; +} +.uni-card-media-body { + height: 84rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; +} +.uni-card-media-text-top { + line-height: 36rpx; + font-size: 34rpx; +} +.uni-card-media-text-bottom { + line-height: 30rpx; + font-size: 28rpx; + color: #8f8f94; +} +.uni-card-link { + color: #007AFF; +} + +/* 列表 */ +.uni-list { + background-color: #FFFFFF; + position: relative; + width: 100%; + display: flex; + flex-direction: column; +} +.uni-list:after { + position: absolute; + z-index: 10; + right: 0; + bottom: 0; + left: 0; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #dedfe2; +} +.uni-list::before { + position: absolute; + z-index: 10; + right: 0; + top: 0; + left: 0; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #dedfe2; +} +.uni-list-cell { + position: relative; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} +.uni-list-cell-hover { + background-color: #eee; +} +.uni-list-cell-pd { + padding: 22rpx 30rpx; +} +.uni-list-cell-left { + white-space: nowrap; + font-size:28rpx; + padding: 0 30rpx; +} +.uni-list-cell-db, +.uni-list-cell-right { + flex: 1; +} +.uni-list-cell::after { + position: absolute; + z-index: 3; + right: 0; + bottom: 0; + left: 140rpx; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #dedfe2; +} +.uni-list .uni-list-cell:last-child::after { + height: 0rpx; +} +.uni-list-cell-last.uni-list-cell::after { + height: 0rpx; +} +.uni-list-cell-divider { + position: relative; + display: flex; + color: #999; + background-color: #f7f7f7; + padding:15rpx 20rpx; +} +.uni-list-cell-divider::before { + position: absolute; + right: 0; + top: 0; + left: 0; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #c8c7cc; +} +.uni-list-cell-divider::after { + position: absolute; + right: 0; + bottom: 0; + left: 0rpx; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #c8c7cc; +} +.uni-list-cell-navigate { + font-size:30rpx; + padding: 22rpx 30rpx; + line-height: 48rpx; + position: relative; + display: flex; + box-sizing: border-box; + width: 100%; + flex: 1; + justify-content: space-between; + align-items: center; +} +.uni-list-cell-navigate { + padding-right: 36rpx; +} +.uni-navigate-badge { + padding-right: 50rpx; +} +.uni-list-cell-navigate.uni-navigate-right:after { + font-family: uniicons; + content: '\e583'; + position: absolute; + right: 24rpx; + top: 50%; + color: #bbb; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.uni-list-cell-navigate.uni-navigate-bottom:after { + font-family: uniicons; + content: '\e581'; + position: absolute; + right: 24rpx; + top: 50%; + color: #bbb; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.uni-list-cell-navigate.uni-navigate-bottom.uni-active::after { + font-family: uniicons; + content: '\e580'; + position: absolute; + right: 24rpx; + top: 50%; + color: #bbb; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.uni-collapse.uni-list-cell { + flex-direction: column; +} +.uni-list-cell-navigate.uni-active { + background: #eee; +} +.uni-list.uni-collapse { + box-sizing: border-box; + height: 0; + overflow: hidden; +} +.uni-collapse .uni-list-cell { + padding-left: 20rpx; +} +.uni-collapse .uni-list-cell::after { + left: 52rpx; +} +.uni-list.uni-active { + height: auto; +} + +/* 三行列表 */ +.uni-triplex-row { + display: flex; + flex: 1; + width: 100%; + box-sizing: border-box; + flex-direction: row; + padding: 22rpx 30rpx; +} +.uni-triplex-right, +.uni-triplex-left { + display: flex; + flex-direction: column; +} +.uni-triplex-left { + width: 84%; +} +.uni-triplex-left .uni-title{ + padding:8rpx 0; +} +.uni-triplex-left .uni-text, .uni-triplex-left .uni-text-small{color:#999999;} +.uni-triplex-right { + width: 16%; + text-align: right; +} + +/* 图文列表 */ +.uni-media-list { + padding: 22rpx 30rpx; + box-sizing: border-box; + display: flex; + width: 100%; + flex-direction: row; +} +.uni-navigate-right.uni-media-list { + padding-right: 74rpx; +} +.uni-pull-right { + flex-direction: row-reverse; +} +.uni-pull-right>.uni-media-list-logo { + margin-right: 0rpx; + margin-left: 20rpx; +} +.uni-media-list-logo { + height: 84rpx; + width: 84rpx; + margin-right: 20rpx; +} +.uni-media-list-logo image { + height: 100%; + width: 100%; +} +.uni-media-list-body { + height: 84rpx; + display: flex; + flex: 1; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; + overflow: hidden; +} +.uni-media-list-text-top { + width: 100%; + line-height: 36rpx; + font-size: 30rpx; + color: #202328; +} +.uni-media-list-text-bottom { + width: 100%; + line-height: 30rpx; + font-size: 26rpx; + color: #8f8f94; +} + +/* 九宫格 */ +.uni-grid-9 { + background: #f2f2f2; + width: 750rpx; + display: flex; + flex-direction: row; + flex-wrap: wrap; + border-top: 2rpx solid #eee; +} +.uni-grid-9-item { + width: 250rpx; + height: 200rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-bottom: 2rpx solid; + border-right: 2rpx solid; + border-color: #eee; + box-sizing: border-box; +} +.no-border-right { + border-right: none; +} +.uni-grid-9-image { + width: 100rpx; + height: 100rpx; +} +.uni-grid-9-text { + width: 250rpx; + line-height: 4rpx; + height: 40rpx; + text-align: center; + font-size: 30rpx; +} +.uni-grid-9-item-hover { + background: rgba(0, 0, 0, 0.1); +} + +/* 上传 */ +.uni-uploader { + flex: 1; + flex-direction: column; +} +.uni-uploader-head { + display: flex; + flex-direction: row; + justify-content: space-between; +} +.uni-uploader-info { + color: #B2B2B2; +} +.uni-uploader-body { + margin-top: 16rpx; +} +.uni-uploader__files { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} +.uni-uploader__file { + margin: 10rpx; + width: 210rpx; + height: 210rpx; +} +.uni-uploader__img { + display: block; + width: 210rpx; + height: 210rpx; +} +.uni-uploader__input-box { + position: relative; + margin:10rpx; + width: 208rpx; + height: 208rpx; + border: 2rpx solid #D9D9D9; +} +.uni-uploader__input-box:before, +.uni-uploader__input-box:after { + content: " "; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + background-color: #D9D9D9; +} +.uni-uploader__input-box:before { + width: 4rpx; + height: 79rpx; +} +.uni-uploader__input-box:after { + width: 79rpx; + height: 4rpx; +} +.uni-uploader__input-box:active { + border-color: #999999; +} +.uni-uploader__input-box:active:before, +.uni-uploader__input-box:active:after { + background-color: #999999; +} +.uni-uploader__input { + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; +} + +/*问题反馈*/ +.feedback-title { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 20rpx; + color: #8f8f94; + font-size: 28rpx; +} +.feedback-star-view.feedback-title { + justify-content: flex-start; + margin: 0; +} +.feedback-quick { + position: relative; + padding-right: 40rpx; +} +.feedback-quick:after { + font-family: uniicons; + font-size: 40rpx; + content: '\e581'; + position: absolute; + right: 0; + top: 50%; + color: #bbb; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); +} +.feedback-body { + background: #fff; +} +.feedback-textare { + height: 200rpx; + font-size: 34rpx; + line-height: 50rpx; + width: 100%; + box-sizing: border-box; + padding: 20rpx 30rpx 0; +} +.feedback-input { + font-size: 34rpx; + height: 50rpx; + min-height: 50rpx; + padding: 15rpx 20rpx; + line-height: 50rpx; +} +.feedback-uploader { + padding: 22rpx 20rpx; +} +.feedback-star { + font-family: uniicons; + font-size: 40rpx; + margin-left: 6rpx; +} +.feedback-star-view { + margin-left: 20rpx; +} +.feedback-star:after { + content: '\e408'; +} +.feedback-star.active { + color: #FFB400; +} +.feedback-star.active:after { + content: '\e438'; +} +.feedback-submit { + background: #007AFF; + color: #FFFFFF; + margin: 20rpx; +} + +/* input group */ +.uni-input-group { + position: relative; + padding: 0; + border: 0; + background-color: #fff; +} + +.uni-input-group:before { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 2rpx; + content: ''; + transform: scaleY(.5); + background-color: #c8c7cc; +} + +.uni-input-group:after { + position: absolute; + right: 0; + bottom: 0; + left: 0; + height: 2rpx; + content: ''; + transform: scaleY(.5); + background-color: #c8c7cc; +} + +.uni-input-row { + position: relative; + display: flex; + flex-direction: row; + font-size:28rpx; + padding: 22rpx 30rpx; + justify-content: space-between; +} + +.uni-input-group .uni-input-row:after { + position: absolute; + right: 0; + bottom: 0; + left: 30rpx; + height: 2rpx; + content: ''; + transform: scaleY(.5); + background-color: #c8c7cc; +} + +.uni-input-row label { + line-height: 70rpx; +} + +/* textarea */ +.uni-textarea{ + width:100%; + background:#FFF; +} +.uni-textarea textarea{ + width:96%; + padding:18rpx 2%; + line-height:1.6; + font-size:28rpx; + height:150rpx; +} + +/* tab bar */ +.uni-tab-bar { + display: flex; + flex: 1; + flex-direction: column; + overflow: hidden; + height: 100%; +} + +.uni-tab-bar .list { + width: 750rpx; + height: 100%; +} + +.uni-swiper-tab { + width: 100%; + white-space: nowrap; + line-height: 100rpx; + height: 100rpx; + border-bottom: 1px solid #c8c7cc; +} + +.swiper-tab-list { + font-size: 30rpx; + width: 150rpx; + display: inline-block; + text-align: center; + color: #555; +} + +.uni-tab-bar .active { + color: #007AFF; +} + +.uni-tab-bar .swiper-box { + flex: 1; + width: 100%; + height: calc(100% - 100rpx); +} + +.uni-tab-bar-loading{ + padding:20rpx 0; +} + +/* comment */ +.uni-comment{padding:5rpx 0; display: flex; flex-grow:1; flex-direction: column;} +.uni-comment-list{flex-wrap:nowrap; padding:10rpx 0; margin:10rpx 0; width:100%; display: flex;} +.uni-comment-face{width:70rpx; height:70rpx; border-radius:100%; margin-right:20rpx; flex-shrink:0; overflow:hidden;} +.uni-comment-face image{width:100%; border-radius:100%;} +.uni-comment-body{width:100%;} +.uni-comment-top{line-height:1.5em; justify-content:space-between;} +.uni-comment-top text{color:#0A98D5; font-size:24rpx;} +.uni-comment-date{line-height:38rpx; flex-direction:row; justify-content:space-between; display:flex !important; flex-grow:1;} +.uni-comment-date view{color:#666666; font-size:24rpx; line-height:38rpx;} +.uni-comment-content{line-height:1.6em; font-size:28rpx; padding:8rpx 0;} +.uni-comment-replay-btn{background:#FFF; font-size:24rpx; line-height:28rpx; padding:5rpx 20rpx; border-radius:30rpx; color:#333 !important; margin:0 10rpx;} + +/* swiper msg */ +.uni-swiper-msg{width:100%; padding:12rpx 0; flex-wrap:nowrap; display:flex;} +.uni-swiper-msg-icon{width:50rpx; margin-right:20rpx;} +.uni-swiper-msg-icon image{width:100%; flex-shrink:0;} +.uni-swiper-msg swiper{width:100%; height:50rpx;} +.uni-swiper-msg swiper-item{line-height:50rpx;} + +/* product */ +.uni-product-list { + display: flex; + width: 100%; + flex-wrap: wrap; + flex-direction: row; +} + +.uni-product { + padding: 20rpx; + display: flex; + flex-direction: column; +} + +.image-view { + height: 330rpx; + width: 330rpx; + margin:12rpx 0; +} + +.uni-product-image { + height: 330rpx; + width: 330rpx; +} + +.uni-product-title { + width: 300rpx; + word-break: break-all; + display: -webkit-box; + overflow: hidden; + line-height:1.5; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.uni-product-price { + margin-top:10rpx; + font-size: 28rpx; + line-height:1.5; + position: relative; +} + +.uni-product-price-original { + color: #e80080; +} + +.uni-product-price-favour { + color: #888888; + text-decoration: line-through; + margin-left: 10rpx; +} + +.uni-product-tip { + position: absolute; + right: 10rpx; + background-color: #ff3333; + color: #ffffff; + padding: 0 10rpx; + border-radius: 5rpx; +} + +/* timeline */ +.uni-timeline { + margin: 35rpx 0; + display: flex; + flex-direction: column; + position: relative; + } + + + .uni-timeline-item { + display: flex; + flex-direction: row; + position: relative; + padding-bottom: 20rpx; + box-sizing: border-box; + overflow: hidden; + + } + + .uni-timeline-item .uni-timeline-item-keynode { + width: 160rpx; + flex-shrink: 0; + box-sizing: border-box; + padding-right: 20rpx; + text-align: right; + line-height: 65rpx; + } + + .uni-timeline-item .uni-timeline-item-divider { + flex-shrink: 0; + position: relative; + width: 30rpx; + height: 30rpx; + top: 15rpx; + border-radius: 50%; + background-color: #bbb; + } + + + + .uni-timeline-item-divider::before, + .uni-timeline-item-divider::after { + position: absolute; + left: 15rpx; + width: 1rpx; + height: 100vh; + content: ''; + background: inherit; + } + + .uni-timeline-item-divider::before { + bottom: 100%; + } + + .uni-timeline-item-divider::after { + top: 100%; + } + + + .uni-timeline-last-item .uni-timeline-item-divider:after { + display: none; + } + + .uni-timeline-first-item .uni-timeline-item-divider:before { + display: none; + } + + .uni-timeline-item .uni-timeline-item-content { + padding-left: 20rpx; + } + + .uni-timeline-last-item .bottom-border::after{ + display: none; + } + + .uni-timeline-item-content .datetime{ + color: #CCCCCC; + } + + /* 自定义节点颜色 */ + .uni-timeline-last-item .uni-timeline-item-divider{ + background-color: #1AAD19; + } + + +/* uni-icon */ + +.uni-icon { + font-family: uniicons; + font-size: 24px; + font-weight: normal; + font-style: normal; + line-height: 1; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; +} + +.uni-icon.uni-active { + color: #007aff; +} + +.uni-icon-contact:before { + content: '\e100'; +} + +.uni-icon-person:before { + content: '\e101'; +} + +.uni-icon-personadd:before { + content: '\e102'; +} + +.uni-icon-contact-filled:before { + content: '\e130'; +} + +.uni-icon-person-filled:before { + content: '\e131'; +} + +.uni-icon-personadd-filled:before { + content: '\e132'; +} + +.uni-icon-phone:before { + content: '\e200'; +} + +.uni-icon-email:before { + content: '\e201'; +} + +.uni-icon-chatbubble:before { + content: '\e202'; +} + +.uni-icon-chatboxes:before { + content: '\e203'; +} + +.uni-icon-phone-filled:before { + content: '\e230'; +} + +.uni-icon-email-filled:before { + content: '\e231'; +} + +.uni-icon-chatbubble-filled:before { + content: '\e232'; +} + +.uni-icon-chatboxes-filled:before { + content: '\e233'; +} + +.uni-icon-weibo:before { + content: '\e260'; +} + +.uni-icon-weixin:before { + content: '\e261'; +} + +.uni-icon-pengyouquan:before { + content: '\e262'; +} + +.uni-icon-chat:before { + content: '\e263'; +} + +.uni-icon-qq:before { + content: '\e264'; +} + +.uni-icon-videocam:before { + content: '\e300'; +} + +.uni-icon-camera:before { + content: '\e301'; +} + +.uni-icon-mic:before { + content: '\e302'; +} + +.uni-icon-location:before { + content: '\e303'; +} + +.uni-icon-mic-filled:before, +.uni-icon-speech:before { + content: '\e332'; +} + +.uni-icon-location-filled:before { + content: '\e333'; +} + +.uni-icon-micoff:before { + content: '\e360'; +} + +.uni-icon-image:before { + content: '\e363'; +} + +.uni-icon-map:before { + content: '\e364'; +} + +.uni-icon-compose:before { + content: '\e400'; +} + +.uni-icon-trash:before { + content: '\e401'; +} + +.uni-icon-upload:before { + content: '\e402'; +} + +.uni-icon-download:before { + content: '\e403'; +} + +.uni-icon-close:before { + content: '\e404'; +} + +.uni-icon-redo:before { + content: '\e405'; +} + +.uni-icon-undo:before { + content: '\e406'; +} + +.uni-icon-refresh:before { + content: '\e407'; +} + +.uni-icon-star:before { + content: '\e408'; +} + +.uni-icon-plus:before { + content: '\e409'; +} + +.uni-icon-minus:before { + content: '\e410'; +} + +.uni-icon-circle:before, +.uni-icon-checkbox:before { + content: '\e411'; +} + +.uni-icon-close-filled:before, +.uni-icon-clear:before { + content: '\e434'; +} + +.uni-icon-refresh-filled:before { + content: '\e437'; +} + +.uni-icon-star-filled:before { + content: '\e438'; +} + +.uni-icon-plus-filled:before { + content: '\e439'; +} + +.uni-icon-minus-filled:before { + content: '\e440'; +} + +.uni-icon-circle-filled:before { + content: '\e441'; +} + +.uni-icon-checkbox-filled:before { + content: '\e442'; +} + +.uni-icon-closeempty:before { + content: '\e460'; +} + +.uni-icon-refreshempty:before { + content: '\e461'; +} + +.uni-icon-reload:before { + content: '\e462'; +} + +.uni-icon-starhalf:before { + content: '\e463'; +} + +.uni-icon-spinner:before { + content: '\e464'; +} + +.uni-icon-spinner-cycle:before { + content: '\e465'; +} + +.uni-icon-search:before { + content: '\e466'; +} + +.uni-icon-plusempty:before { + content: '\e468'; +} + +.uni-icon-forward:before { + content: '\e470'; +} + +.uni-icon-back:before, +.uni-icon-left-nav:before { + content: '\e471'; +} + +.uni-icon-checkmarkempty:before { + content: '\e472'; +} + +.uni-icon-home:before { + content: '\e500'; +} + +.uni-icon-navigate:before { + content: '\e501'; +} + +.uni-icon-gear:before { + content: '\e502'; +} + +.uni-icon-paperplane:before { + content: '\e503'; +} + +.uni-icon-info:before { + content: '\e504'; +} + +.uni-icon-help:before { + content: '\e505'; +} + +.uni-icon-locked:before { + content: '\e506'; +} + +.uni-icon-more:before { + content: '\e507'; +} + +.uni-icon-flag:before { + content: '\e508'; +} + +.uni-icon-home-filled:before { + content: '\e530'; +} + +.uni-icon-gear-filled:before { + content: '\e532'; +} + +.uni-icon-info-filled:before { + content: '\e534'; +} + +.uni-icon-help-filled:before { + content: '\e535'; +} + +.uni-icon-more-filled:before { + content: '\e537'; +} + +.uni-icon-settings:before { + content: '\e560'; +} + +.uni-icon-list:before { + content: '\e562'; +} + +.uni-icon-bars:before { + content: '\e563'; +} + +.uni-icon-loop:before { + content: '\e565'; +} + +.uni-icon-paperclip:before { + content: '\e567'; +} + +.uni-icon-eye:before { + content: '\e568'; +} + +.uni-icon-arrowup:before { + content: '\e580'; +} + +.uni-icon-arrowdown:before { + content: '\e581'; +} + +.uni-icon-arrowleft:before { + content: '\e582'; +} + +.uni-icon-arrowright:before { + content: '\e583'; +} + +.uni-icon-arrowthinup:before { + content: '\e584'; +} + +.uni-icon-arrowthindown:before { + content: '\e585'; +} + +.uni-icon-arrowthinleft:before { + content: '\e586'; +} + +.uni-icon-arrowthinright:before { + content: '\e587'; +} + +.uni-icon-pulldown:before { + content: '\e588'; +} + +.uni-icon-scan:before { + content: "\e612"; +} + +/* 分界线 */ +.uni-divider{ + height: 110rpx; + display: flex; + align-items:center; + justify-content: center; + position: relative; +} +.uni-divider__content{ + font-size: 28rpx; + color: #999; + padding: 0 20rpx; + position: relative; + z-index: 101; + background: #F4F5F6; +} +.uni-divider__line{ + background-color: #CCCCCC; + height: 1px; + width: 100%; + position: absolute; + z-index: 100; + top: 50%; + left: 0; + transform: translateY(50%); +} + +.left-win-active text{ + color: #007AFF !important; +} diff --git a/src/common/util.js b/src/common/util.js new file mode 100644 index 0000000..f653b26 --- /dev/null +++ b/src/common/util.js @@ -0,0 +1,378 @@ +/** + * 通用公共js库,主要定义api接口,auth apikey 常量值和通用函数 + */ +import store from '@/store/index.js'; + +// var apiurl = 'http://192.168.1.66:50002/hcscm/pda/v1/'; //开发环境 添 +// var apiurl = 'http://192.168.1.55:50002/hcscm/pda/v1/'; //开发环境 添 +//var apiurl ='http://192.168.1.127:50003/hcscm/pda/v1/'; //开发环境 添 +// var apiurl = 'https://hcscmpre.zzfzyc.com/hcscm/pda/v1/'; //预发布环境 +// var apiurl = 'https://hcscmtest.zzfzyc.com/hcscm/pda/v1/'; //测试环境 +//var apiurl = 'https://hcscmtest.zzfzyc.com/hcscm/'; //ERP测试环境 + +export const getApiUrl = () => store.state.apiurl + +export function updateApiUrl(newUrl) { + store.dispatch('updateApiUrl', newUrl); +} +// 添加统一请求方法 +export function request(options) { + const token = uni.getStorageSync('RemoteTokenData')?.token; + const apiurl = getApiUrl() + return uni.request({ + url: apiurl + options.url, + method: options.method || 'GET', + data: options.data, + header: { + 'Platform': 2, + 'Authorization': token, + ...(options.header || {}) + }, + success: options.success, + fail: options.fail, + complete: options.complete + }); +} +// 设置标识 app wx +var shebei = ''; +//#ifdef APP-PLUS +shebei = 'app'; +//#endif + +//#ifdef MP-WEIXIN +shebei = 'wx'; +//#endif + +const S4 = function() { + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); +}; +export function guid() { + return (S4() + S4() +'-' +S4() +'-' +S4() +'-' +S4() +'-' +S4() +S4() +S4() + ); +} + +// store 解析字符串或对象 +export function parGetData(v) { + if (v.indexOf('obj-') === 0) { + v = v.slice(4); + return JSON.parse(v); + } else { + if (v.indexOf('str-') === 0) { + return v.slice(4); + } + } +} +// localstore 存储字符串或对象 +export function parSetData(v) { + if (typeof v == 'object') { + v = JSON.stringify(v); + v = 'obj-' + v; + } else { + v = 'str-' + v; + } + return v; +} + +function getPrefixNumber(maybeNumStr) { + const numReg = /^[0-9]*[!0-9]*/; + if (numReg.test(maybeNumStr)) { + return maybeNumStr.match(numReg)[0]; + } +} + +export function parFabricGoodsBarCode2D(aSourceBarCode) { + let aOjbectBarCode = aSourceBarCode.toString(); + console.log(aOjbectBarCode); + var aCrockNo = ''; + var aGoodsBillNo = ''; + var aFabricGoodsNo = ''; + var aGoodsCodeNo = ''; + var aGoodsCodeName = ''; + var aQty = ''; + var aBarCodeDig = ''; + console.log("****************"); + if (aOjbectBarCode.indexOf('|') > 0) { + console.log("aOjbectBarCode--&8888888888->"); + var aBarCodeList = aOjbectBarCode.split('|'); + aCrockNo = aBarCodeList[3]; + aGoodsBillNo = aBarCodeList[5]; + aFabricGoodsNo = aBarCodeList[1]; + aGoodsCodeNo = aBarCodeList[2]; + aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + if (aGoodsCodeNo.length == 1) { + aGoodsCodeNo = '00' + aGoodsCodeNo; + } else if (aGoodsCodeNo.length == 2) { + aGoodsCodeNo = '0' + aGoodsCodeNo; + }; + aQty = aBarCodeList[6]; + aBarCodeDig = aBarCodeList[0]; + } else if (aOjbectBarCode.indexOf('$') > 0) { + console.log("aOjbectBarCode--&6555555->"); + aOjbectBarCode = aOjbectBarCode.replace('¥', '$'); + aOjbectBarCode = aOjbectBarCode.replace('#', '#'); + aOjbectBarCode = aOjbectBarCode.replace('##', '#'); + aOjbectBarCode = aOjbectBarCode.replace('^', '$'); + var aBarCodeList = aOjbectBarCode.split('$'); + + console.log("aBarCodeList.length---->" + aBarCodeList.length); + if (aBarCodeList.length <= 5) { + aCrockNo = aBarCodeList[0]; + aGoodsBillNo = aBarCodeList[1]; + aFabricGoodsNo = aBarCodeList[2]; + aGoodsCodeNo = aBarCodeList[3]; + console.log("aGoodsCodeNo---->" + aGoodsCodeNo); + + //aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + if (aGoodsCodeNo == '') { + aGoodsCodeNo = aBarCodeList[3]; + } + aGoodsCodeName = ""; + aQty = aBarCodeList[4]; + aBarCodeDig = aBarCodeList[1]; + } else { + aCrockNo = aBarCodeList[0]; + aGoodsBillNo = aBarCodeList[1]; + aFabricGoodsNo = aBarCodeList[2]; + aGoodsCodeNo = aBarCodeList[4]; + console.log("aGoodsCodeNo1111---->" + aGoodsCodeNo); + //aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + console.log("aGoodsCodeNo222---->" + aGoodsCodeNo); + if (aGoodsCodeNo == '') { + aGoodsCodeNo = aBarCodeList[4]; + } + console.log("aGoodsCodeNo33333333333---->" + aGoodsCodeNo); + aGoodsCodeName = aBarCodeList[5]; + aQty = aBarCodeList[6]; + aBarCodeDig = aBarCodeList[7]; + } + } else if (aOjbectBarCode.indexOf('^') > 0) { + var aBarCodeList = aOjbectBarCode.split('^'); + console.log(">>>aBarCodeList.length>>>>" + aBarCodeList.length.toString()); + if (aBarCodeList.length > 7) { + if (aBarCodeList[0] == '99' || aBarCodeList[0] == '96') { + aCrockNo = aBarCodeList[3]; + aGoodsBillNo = aBarCodeList[4]; + aFabricGoodsNo = aBarCodeList[5]; + aGoodsCodeNo = aBarCodeList[6]; + aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + aGoodsCodeName = aBarCodeList[6]; + aQty = aBarCodeList[7]; + aBarCodeDig = aBarCodeList[4]; + } else { + aCrockNo = aBarCodeList[1]; + aGoodsBillNo = aBarCodeList[3]; + aFabricGoodsNo = aBarCodeList[5].replace("ZH", ""); + aGoodsCodeNo = aBarCodeList[7]; + aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + aGoodsCodeName = aBarCodeList[7]; + aQty = aBarCodeList[8]; + aBarCodeDig = aBarCodeList[4]; + } + } else { + aCrockNo = aBarCodeList[0]; + aGoodsBillNo = aBarCodeList[1]; + aFabricGoodsNo = aBarCodeList[2]; + aGoodsCodeNo = aBarCodeList[4]; + aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + aGoodsCodeName = aBarCodeList[5]; + aQty = aBarCodeList[6]; + aBarCodeDig = aBarCodeList[7]; + } + } else if (aOjbectBarCode.indexOf('^') == 0) { + var aBarCodeList = aOjbectBarCode.split('^'); + aCrockNo = aBarCodeList[1]; + aGoodsBillNo = aBarCodeList[2]; + aFabricGoodsNo = aBarCodeList[3]; + aGoodsCodeNo = ''; + //aGoodsCodeNo = getPrefixNumber(aGoodsCodeNo); + //aGoodsCodeName = aBarCodeList[5]; + aQty = aBarCodeList[5]; + console.log(">>>>>>>>" + aCrockNo + ">>>" + aGoodsBillNo.toString() + ">>>>" + aQty.toString()); + aBarCodeDig = 0; + } else if (aOjbectBarCode.indexOf('http') > 0) { + console.log("aOjbectBarCode--&&&->"); + return ''; + } else { + aCrockNo = ''; + aGoodsBillNo = ''; + aFabricGoodsNo = ''; + aGoodsCodeNo = ''; + aGoodsCodeNo = ''; + aGoodsCodeName = ''; + aQty = 0; + aBarCodeDig = aSourceBarCode; + console.log("aOjbectBarCode--&66666->"+aBarCodeDig) ; + //return ''; + } + /* + if (aGoodsCodeNo.length == 1) { + aGoodsCodeNo = '00' + aGoodsCodeNo; + } else if (aGoodsCodeNo.length == 2) { + aGoodsCodeNo = '0' + aGoodsCodeNo; + }; + */ + + return aCrockNo + ',' + aGoodsBillNo + ',' + aBarCodeDig + ',' + aFabricGoodsNo + ',' + aGoodsCodeNo + ',' + aQty; +} + +export function GetGoodsQRBarCode(aSourceQRBarCode) { + let aQRBarCode = aSourceQRBarCode.toString().trimRight().trimLeft(); + aQRBarCode = aQRBarCode.replace('¥', '$'); + aQRBarCode = aQRBarCode.replace('#', '#'); + aQRBarCode = aQRBarCode.replace('##', '#'); + aQRBarCode = aQRBarCode.replace('^', '$'); + + if (aQRBarCode.indexOf('$') > 0) + { + var aQRBarCodeList = aQRBarCode.split('$'); + var aCrockNo = aQRBarCodeList[0]; + var aGoodsBillNo = aQRBarCodeList[1]; + var aFabricGoodsNo = aQRBarCodeList[2]; + var aSaleOrderNo = aQRBarCodeList[3]; + var aFabricGoodsName = ''; + var aGoodsCodeNo = aQRBarCodeList[4].split('#')[0]; + var aGoodsCodeName = aQRBarCodeList[4].split('#')[1]; + var aQty = aQRBarCodeList[5]; + var aBarCodeDig= ''; + + return aCrockNo + '^' + aGoodsBillNo + '^' + aBarCodeDig + '^' + + aFabricGoodsNo + '^' + aFabricGoodsName + '^' + aGoodsCodeNo + + '^' + aGoodsCodeName +'^' + aSaleOrderNo +'^'+ aQty+'^'; + } else if (aQRBarCode.indexOf('http') > 0) { + return ''; + } else { + return ''; + } +} + +export function parYarnGoodsBarCode2D(aSourceBarCode) { + aSourceBarCode = aSourceBarCode.replace('\n',''); + aSourceBarCode = aSourceBarCode.replace('\t',''); + aSourceBarCode = aSourceBarCode.replace('\s',''); + aSourceBarCode = aSourceBarCode.replace('\r',''); + let aOjbectBarCode = aSourceBarCode.toString(); + var aDyeWorksDigCode = ''; + var aCustomerPO = ''; + var aYarnGoodsCodeNo = ''; + var aYarnGoodsColorNo = ''; + var aYarnDyeOrderDate = ''; + var aYarnCrockNo = ''; + var aYarnBoxBillNo = ''; + var aYarnBoxRoll = ''; + var aYarnGrossQty = 0; + var aYarnNetQty = 0; + if (aOjbectBarCode.indexOf('^') >= 0) { + var aBarCodeList = aOjbectBarCode.split('^'); + aDyeWorksDigCode = aBarCodeList[1]; + aCustomerPO = aBarCodeList[2]; + aYarnGoodsCodeNo = aBarCodeList[3]; + aYarnGoodsColorNo = aBarCodeList[4]; + aYarnDyeOrderDate = aBarCodeList[5]; + aYarnCrockNo = aBarCodeList[6]; + aYarnBoxBillNo = aBarCodeList[7]; + aYarnBoxRoll = aBarCodeList[8]; + aYarnGrossQty = aBarCodeList[9]; + aYarnNetQty = aBarCodeList[10]; + } else if (aOjbectBarCode.indexOf('http') > 0) { + console.log("aOjbectBarCode-CCCC-&&&->"); + return ''; + } else { + aDyeWorksDigCode = ''; + aCustomerPO = ''; + aYarnGoodsCodeNo = ''; + aYarnGoodsColorNo = ''; + aYarnDyeOrderDate = ''; + aYarnCrockNo = ''; + aYarnBoxBillNo = ''; + aYarnBoxRoll = ''; + aYarnGrossQty = ''; + aYarnNetQty = ''; + //return ''; + } + return aDyeWorksDigCode + ',' + aCustomerPO + ',' + aYarnGoodsCodeNo + ',' + + aYarnGoodsColorNo + ',' + aYarnDyeOrderDate + ',' + aYarnCrockNo + ',' + + aYarnBoxBillNo + ',' + aYarnBoxRoll + ',' + aYarnGrossQty + ',' + aYarnNetQty; +} + +// 将对象中项目存到数组arr中 +function concat(arr, obj) { + Object.keys(obj).forEach(function(key) { + arr.push(obj[key]) + }); + return arr; +} + +// 新建一个audio实例 +function createAudio(src) { + //console.log("createInnerAudioContext"); + let innerAudioContext = uni.createInnerAudioContext(); + innerAudioContext.autoplay = true; + innerAudioContext.src = src; + innerAudioContext.onPlay(() => { + console.log("开始播放"); + }); + + innerAudioContext.onEnded(() => { + //console.log('i am onEnded') + //播放结束,销毁该实例 + //innerAudioContext.destroy(); + console.log('已执行destory()') + }); + innerAudioContext.onError(res => { + //console.log(res.errMsg); + //console.log(res.errCode); + innerAudioContext.stop(); + }); + return innerAudioContext; +} + +let successAudio = undefined; +let errorAudio = undefined; + +function playSuccessAudio() { + if (!successAudio) { + //console.log("create success"); + successAudio = createAudio('/static/audio/appright.wav'); + successAudio.onError(res => { + console.log(res.errMsg); + console.log(res.errCode); + console.log(res); + successAudio.destroy(); + successAudio = undefined; //createAudio('/static/audio/appright.wav'); + + }); + } + successAudio.stop(); + successAudio.play(); +} + +function playErrorAudio() { + if (!errorAudio) { + //console.log("create error"); + errorAudio = createAudio('/static/audio/apperror.wav'); + errorAudio.onError(res => { + console.log(res.errMsg); + console.log(res.errCode); + console.log(res); + errorAudio.destroy(); + errorAudio = undefined; //createAudio('/static/audio/apperror.wav'); + }) + } + console.log("create error"); + errorAudio.stop(); + errorAudio.play(); +} + + +export default { + get apiurl() { + return getApiUrl() + }, + request, + shebei, + updateApiUrl, + parSetData, + parGetData, + playSuccessAudio, + playErrorAudio, +}; diff --git a/src/common/vue-i18n.min.js b/src/common/vue-i18n.min.js new file mode 100644 index 0000000..8d0a5c0 --- /dev/null +++ b/src/common/vue-i18n.min.js @@ -0,0 +1,6 @@ +/*! + * vue-i18n v8.20.0 + * (c) 2020 kazuya kawaguchi + * Released under the MIT License. + */ +var t,e;t=this,e=function(){"use strict";var t=["style","currency","currencyDisplay","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","localeMatcher","formatMatcher","unit"];function e(t,e){"undefined"!=typeof console&&(console.warn("[vue-i18n] "+t),e&&console.warn(e.stack))}var n=Array.isArray;function r(t){return null!==t&&"object"==typeof t}function a(t){return"string"==typeof t}var i=Object.prototype.toString,o="[object Object]";function s(t){return i.call(t)===o}function l(t){return null==t}function c(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var n=null,a=null;return 1===t.length?r(t[0])||Array.isArray(t[0])?a=t[0]:"string"==typeof t[0]&&(n=t[0]):2===t.length&&("string"==typeof t[0]&&(n=t[0]),(r(t[1])||Array.isArray(t[1]))&&(a=t[1])),{locale:n,params:a}}function u(t){return JSON.parse(JSON.stringify(t))}function h(t,e){return!!~t.indexOf(e)}var f=Object.prototype.hasOwnProperty;function p(t,e){return f.call(t,e)}function m(t){for(var e=arguments,n=Object(t),a=1;a0;)e[n]=arguments[n+1];var r=this.$i18n;return r._t.apply(r,[t,r.locale,r._getMessages(),this].concat(e))},t.prototype.$tc=function(t,e){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];var a=this.$i18n;return a._tc.apply(a,[t,a.locale,a._getMessages(),this,e].concat(n))},t.prototype.$te=function(t,e){var n=this.$i18n;return n._te(t,n.locale,n._getMessages(),e)},t.prototype.$d=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this.$i18n).d.apply(e,[t].concat(n))},t.prototype.$n=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this.$i18n).n.apply(e,[t].concat(n))}}(F),F.mixin(g),F.directive("t",{bind:w,update:$,unbind:M}),F.component(v.name,v),F.component(k.name,k),F.config.optionMergeStrategies.i18n=function(t,e){return void 0===e?t:e}}var D=function(){this._caches=Object.create(null)};D.prototype.interpolate=function(t,e){if(!e)return[t];var n=this._caches[t];return n||(n=function(t){var e=[],n=0,r="";for(;n0)h--,u=R,f[W]();else{if(h=0,void 0===n)return!1;if(!1===(n=J(n)))return!1;f[j]()}};null!==u;)if("\\"!==(e=t[++c])||!p()){if(a=U(e),(i=(s=z[u])[a]||s.else||E)===E)return;if(u=i[0],(o=f[i[1]])&&(r=void 0===(r=i[2])?e:r,!1===o()))return;if(u===V)return l}}(t))&&(this._cache[t]=e),e||[]},q.prototype.getPathValue=function(t,e){if(!r(t))return null;var n=this.parsePath(e);if(0===n.length)return null;for(var a=n.length,i=t,o=0;o/,Z=/(?:@(?:\.[a-z]+)?:(?:[\w\-_|.]+|\([\w\-_|.]+\)))/g,K=/^@(?:\.([a-z]+))?:/,Q=/[()]/g,Y={upper:function(t){return t.toLocaleUpperCase()},lower:function(t){return t.toLocaleLowerCase()},capitalize:function(t){return""+t.charAt(0).toLocaleUpperCase()+t.substr(1)}},tt=new D,et=function(t){var e=this;void 0===t&&(t={}),!F&&"undefined"!=typeof window&&window.Vue&&I(window.Vue);var n=t.locale||"en-US",r=!1!==t.fallbackLocale&&(t.fallbackLocale||"en-US"),a=t.messages||{},i=t.dateTimeFormats||{},o=t.numberFormats||{};this._vm=null,this._formatter=t.formatter||tt,this._modifiers=t.modifiers||{},this._missing=t.missing||null,this._root=t.root||null,this._sync=void 0===t.sync||!!t.sync,this._fallbackRoot=void 0===t.fallbackRoot||!!t.fallbackRoot,this._formatFallbackMessages=void 0!==t.formatFallbackMessages&&!!t.formatFallbackMessages,this._silentTranslationWarn=void 0!==t.silentTranslationWarn&&t.silentTranslationWarn,this._silentFallbackWarn=void 0!==t.silentFallbackWarn&&!!t.silentFallbackWarn,this._dateTimeFormatters={},this._numberFormatters={},this._path=new q,this._dataListeners=[],this._componentInstanceCreatedListener=t.componentInstanceCreatedListener||null,this._preserveDirectiveContent=void 0!==t.preserveDirectiveContent&&!!t.preserveDirectiveContent,this.pluralizationRules=t.pluralizationRules||{},this._warnHtmlInMessage=t.warnHtmlInMessage||"off",this._postTranslation=t.postTranslation||null,this.getChoiceIndex=function(t,n){var r=Object.getPrototypeOf(e);if(r&&r.getChoiceIndex)return r.getChoiceIndex.call(e,t,n);var a,i;return e.locale in e.pluralizationRules?e.pluralizationRules[e.locale].apply(e,[t,n]):(a=t,i=n,a=Math.abs(a),2===i?a?a>1?1:0:1:a?Math.min(a,2):0)},this._exist=function(t,n){return!(!t||!n)&&(!l(e._path.getPathValue(t,n))||!!t[n])},"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||Object.keys(a).forEach(function(t){e._checkLocaleMessage(t,e._warnHtmlInMessage,a[t])}),this._initVM({locale:n,fallbackLocale:r,messages:a,dateTimeFormats:i,numberFormats:o})},nt={vm:{configurable:!0},messages:{configurable:!0},dateTimeFormats:{configurable:!0},numberFormats:{configurable:!0},availableLocales:{configurable:!0},locale:{configurable:!0},fallbackLocale:{configurable:!0},formatFallbackMessages:{configurable:!0},missing:{configurable:!0},formatter:{configurable:!0},silentTranslationWarn:{configurable:!0},silentFallbackWarn:{configurable:!0},preserveDirectiveContent:{configurable:!0},warnHtmlInMessage:{configurable:!0},postTranslation:{configurable:!0}};return et.prototype._checkLocaleMessage=function(t,n,r){var i=function(t,n,r,o){if(s(r))Object.keys(r).forEach(function(e){var a=r[e];s(a)?(o.push(e),o.push("."),i(t,n,a,o),o.pop(),o.pop()):(o.push(e),i(t,n,a,o),o.pop())});else if(Array.isArray(r))r.forEach(function(e,r){s(e)?(o.push("["+r+"]"),o.push("."),i(t,n,e,o),o.pop(),o.pop()):(o.push("["+r+"]"),i(t,n,e,o),o.pop())});else if(a(r)){if(X.test(r)){var l="Detected HTML in message '"+r+"' of keypath '"+o.join("")+"' at '"+n+"'. Consider component interpolation with '' to avoid XSS. See https://bit.ly/2ZqJzkp";"warn"===t?e(l):"error"===t&&function(t,e){"undefined"!=typeof console&&(console.error("[vue-i18n] "+t),e&&console.error(e.stack))}(l)}}};i(n,t,r,[])},et.prototype._initVM=function(t){var e=F.config.silent;F.config.silent=!0,this._vm=new F({data:t}),F.config.silent=e},et.prototype.destroyVM=function(){this._vm.$destroy()},et.prototype.subscribeDataChanging=function(t){this._dataListeners.push(t)},et.prototype.unsubscribeDataChanging=function(t){!function(t,e){if(t.length){var n=t.indexOf(e);if(n>-1)t.splice(n,1)}}(this._dataListeners,t)},et.prototype.watchI18nData=function(){var t=this;return this._vm.$watch("$data",function(){for(var e=t._dataListeners.length;e--;)F.nextTick(function(){t._dataListeners[e]&&t._dataListeners[e].$forceUpdate()})},{deep:!0})},et.prototype.watchLocale=function(){if(!this._sync||!this._root)return null;var t=this._vm;return this._root.$i18n.vm.$watch("locale",function(e){t.$set(t,"locale",e),t.$forceUpdate()},{immediate:!0})},et.prototype.onComponentInstanceCreated=function(t){this._componentInstanceCreatedListener&&this._componentInstanceCreatedListener(t,this)},nt.vm.get=function(){return this._vm},nt.messages.get=function(){return u(this._getMessages())},nt.dateTimeFormats.get=function(){return u(this._getDateTimeFormats())},nt.numberFormats.get=function(){return u(this._getNumberFormats())},nt.availableLocales.get=function(){return Object.keys(this.messages).sort()},nt.locale.get=function(){return this._vm.locale},nt.locale.set=function(t){this._vm.$set(this._vm,"locale",t)},nt.fallbackLocale.get=function(){return this._vm.fallbackLocale},nt.fallbackLocale.set=function(t){this._localeChainCache={},this._vm.$set(this._vm,"fallbackLocale",t)},nt.formatFallbackMessages.get=function(){return this._formatFallbackMessages},nt.formatFallbackMessages.set=function(t){this._formatFallbackMessages=t},nt.missing.get=function(){return this._missing},nt.missing.set=function(t){this._missing=t},nt.formatter.get=function(){return this._formatter},nt.formatter.set=function(t){this._formatter=t},nt.silentTranslationWarn.get=function(){return this._silentTranslationWarn},nt.silentTranslationWarn.set=function(t){this._silentTranslationWarn=t},nt.silentFallbackWarn.get=function(){return this._silentFallbackWarn},nt.silentFallbackWarn.set=function(t){this._silentFallbackWarn=t},nt.preserveDirectiveContent.get=function(){return this._preserveDirectiveContent},nt.preserveDirectiveContent.set=function(t){this._preserveDirectiveContent=t},nt.warnHtmlInMessage.get=function(){return this._warnHtmlInMessage},nt.warnHtmlInMessage.set=function(t){var e=this,n=this._warnHtmlInMessage;if(this._warnHtmlInMessage=t,n!==t&&("warn"===t||"error"===t)){var r=this._getMessages();Object.keys(r).forEach(function(t){e._checkLocaleMessage(t,e._warnHtmlInMessage,r[t])})}},nt.postTranslation.get=function(){return this._postTranslation},nt.postTranslation.set=function(t){this._postTranslation=t},et.prototype._getMessages=function(){return this._vm.messages},et.prototype._getDateTimeFormats=function(){return this._vm.dateTimeFormats},et.prototype._getNumberFormats=function(){return this._vm.numberFormats},et.prototype._warnDefault=function(t,e,n,r,i,o){if(!l(n))return n;if(this._missing){var s=this._missing.apply(null,[t,e,r,i]);if(a(s))return s}if(this._formatFallbackMessages){var u=c.apply(void 0,i);return this._render(e,o,u.params,e)}return e},et.prototype._isFallbackRoot=function(t){return!t&&!l(this._root)&&this._fallbackRoot},et.prototype._isSilentFallbackWarn=function(t){return this._silentFallbackWarn instanceof RegExp?this._silentFallbackWarn.test(t):this._silentFallbackWarn},et.prototype._isSilentFallback=function(t,e){return this._isSilentFallbackWarn(e)&&(this._isFallbackRoot()||t!==this.fallbackLocale)},et.prototype._isSilentTranslationWarn=function(t){return this._silentTranslationWarn instanceof RegExp?this._silentTranslationWarn.test(t):this._silentTranslationWarn},et.prototype._interpolate=function(t,e,n,r,i,o,c){if(!e)return null;var u,h=this._path.getPathValue(e,n);if(Array.isArray(h)||s(h))return h;if(l(h)){if(!s(e))return null;if(!a(u=e[n]))return null}else{if(!a(h))return null;u=h}return(u.indexOf("@:")>=0||u.indexOf("@.")>=0)&&(u=this._link(t,e,u,r,"raw",o,c)),this._render(u,i,o,n)},et.prototype._link=function(t,e,n,r,a,i,o){var s=n,l=s.match(Z);for(var c in l)if(l.hasOwnProperty(c)){var u=l[c],f=u.match(K),p=f[0],m=f[1],_=u.replace(p,"").replace(Q,"");if(h(o,_))return s;o.push(_);var g=this._interpolate(t,e,_,r,"raw"===a?"string":a,"raw"===a?void 0:i,o);if(this._isFallbackRoot(g)){if(!this._root)throw Error("unexpected error");var v=this._root.$i18n;g=v._translate(v._getMessages(),v.locale,v.fallbackLocale,_,r,a,i)}g=this._warnDefault(t,_,g,r,Array.isArray(i)?i:[i],a),this._modifiers.hasOwnProperty(m)?g=this._modifiers[m](g):Y.hasOwnProperty(m)&&(g=Y[m](g)),o.pop(),s=g?s.replace(u,g):s}return s},et.prototype._render=function(t,e,n,r){var i=this._formatter.interpolate(t,n,r);return i||(i=tt.interpolate(t,n,r)),"string"!==e||a(i)?i:i.join("")},et.prototype._appendItemToChain=function(t,e,n){var r=!1;return h(t,e)||(r=!0,e&&(r="!"!==e[e.length-1],e=e.replace(/!/g,""),t.push(e),n&&n[e]&&(r=n[e]))),r},et.prototype._appendLocaleToChain=function(t,e,n){var r,a=e.split("-");do{var i=a.join("-");r=this._appendItemToChain(t,i,n),a.splice(-1,1)}while(a.length&&!0===r);return r},et.prototype._appendBlockToChain=function(t,e,n){for(var r=!0,i=0;i0;)i[o]=arguments[o+4];if(!t)return"";var s=c.apply(void 0,i),l=s.locale||e,u=this._translate(n,l,this.fallbackLocale,t,r,"string",s.params);if(this._isFallbackRoot(u)){if(!this._root)throw Error("unexpected error");return(a=this._root).$t.apply(a,[t].concat(i))}return u=this._warnDefault(l,t,u,r,i,"string"),this._postTranslation&&null!=u&&(u=this._postTranslation(u,t)),u},et.prototype.t=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this)._t.apply(e,[t,this.locale,this._getMessages(),null].concat(n))},et.prototype._i=function(t,e,n,r,a){var i=this._translate(n,e,this.fallbackLocale,t,r,"raw",a);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n.i(t,e,a)}return this._warnDefault(e,t,i,r,[a],"raw")},et.prototype.i=function(t,e,n){return t?(a(e)||(e=this.locale),this._i(t,e,this._getMessages(),null,n)):""},et.prototype._tc=function(t,e,n,r,a){for(var i,o=[],s=arguments.length-5;s-- >0;)o[s]=arguments[s+5];if(!t)return"";void 0===a&&(a=1);var l={count:a,n:a},u=c.apply(void 0,o);return u.params=Object.assign(l,u.params),o=null===u.locale?[u.params]:[u.locale,u.params],this.fetchChoice((i=this)._t.apply(i,[t,e,n,r].concat(o)),a)},et.prototype.fetchChoice=function(t,e){if(!t&&!a(t))return null;var n=t.split("|");return n[e=this.getChoiceIndex(e,n.length)]?n[e].trim():t},et.prototype.tc=function(t,e){for(var n,r=[],a=arguments.length-2;a-- >0;)r[a]=arguments[a+2];return(n=this)._tc.apply(n,[t,this.locale,this._getMessages(),null,e].concat(r))},et.prototype._te=function(t,e,n){for(var r=[],a=arguments.length-3;a-- >0;)r[a]=arguments[a+3];var i=c.apply(void 0,r).locale||e;return this._exist(n[i],t)},et.prototype.te=function(t,e){return this._te(t,this.locale,this._getMessages(),e)},et.prototype.getLocaleMessage=function(t){return u(this._vm.messages[t]||{})},et.prototype.setLocaleMessage=function(t,e){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(t,this._warnHtmlInMessage,e),this._vm.$set(this._vm.messages,t,e)},et.prototype.mergeLocaleMessage=function(t,e){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(t,this._warnHtmlInMessage,e),this._vm.$set(this._vm.messages,t,m({},this._vm.messages[t]||{},e))},et.prototype.getDateTimeFormat=function(t){return u(this._vm.dateTimeFormats[t]||{})},et.prototype.setDateTimeFormat=function(t,e){this._vm.$set(this._vm.dateTimeFormats,t,e),this._clearDateTimeFormat(t,e)},et.prototype.mergeDateTimeFormat=function(t,e){this._vm.$set(this._vm.dateTimeFormats,t,m(this._vm.dateTimeFormats[t]||{},e)),this._clearDateTimeFormat(t,e)},et.prototype._clearDateTimeFormat=function(t,e){for(var n in e){var r=t+"__"+n;this._dateTimeFormatters.hasOwnProperty(r)&&delete this._dateTimeFormatters[r]}},et.prototype._localizeDateTime=function(t,e,n,r,a){for(var i=e,o=r[i],s=this._getLocaleChain(e,n),c=0;c0;)e[n]=arguments[n+1];var i=this.locale,o=null;return 1===e.length?a(e[0])?o=e[0]:r(e[0])&&(e[0].locale&&(i=e[0].locale),e[0].key&&(o=e[0].key)):2===e.length&&(a(e[0])&&(o=e[0]),a(e[1])&&(i=e[1])),this._d(t,i,o)},et.prototype.getNumberFormat=function(t){return u(this._vm.numberFormats[t]||{})},et.prototype.setNumberFormat=function(t,e){this._vm.$set(this._vm.numberFormats,t,e),this._clearNumberFormat(t,e)},et.prototype.mergeNumberFormat=function(t,e){this._vm.$set(this._vm.numberFormats,t,m(this._vm.numberFormats[t]||{},e)),this._clearNumberFormat(t,e)},et.prototype._clearNumberFormat=function(t,e){for(var n in e){var r=t+"__"+n;this._numberFormatters.hasOwnProperty(r)&&delete this._numberFormatters[r]}},et.prototype._getNumberFormatter=function(t,e,n,r,a,i){for(var o=e,s=r[o],c=this._getLocaleChain(e,n),u=0;u0;)n[i]=arguments[i+1];var o=this.locale,s=null,l=null;return 1===n.length?a(n[0])?s=n[0]:r(n[0])&&(n[0].locale&&(o=n[0].locale),n[0].key&&(s=n[0].key),l=Object.keys(n[0]).reduce(function(e,r){var a;return h(t,r)?Object.assign({},e,((a={})[r]=n[0][r],a)):e},null)):2===n.length&&(a(n[0])&&(s=n[0]),a(n[1])&&(o=n[1])),this._n(e,o,s,l)},et.prototype._ntp=function(t,e,n,r){if(!et.availabilities.numberFormat)return[];if(!n)return(r?new Intl.NumberFormat(e,r):new Intl.NumberFormat(e)).formatToParts(t);var a=this._getNumberFormatter(t,e,this.fallbackLocale,this._getNumberFormats(),n,r),i=a&&a.formatToParts(t);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n._ntp(t,e,n,r)}return i||[]},Object.defineProperties(et.prototype,nt),Object.defineProperty(et,"availabilities",{get:function(){if(!G){var t="undefined"!=typeof Intl;G={dateTimeFormat:t&&void 0!==Intl.DateTimeFormat,numberFormat:t&&void 0!==Intl.NumberFormat}}return G}}),et.install=I,et.version="8.20.0",et},"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueI18n=e(); \ No newline at end of file diff --git a/src/components/addBtn/addBtn.vue b/src/components/addBtn/addBtn.vue new file mode 100644 index 0000000..91f38d8 --- /dev/null +++ b/src/components/addBtn/addBtn.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/components/card/baojiadan.vue b/src/components/card/baojiadan.vue new file mode 100644 index 0000000..2aefede --- /dev/null +++ b/src/components/card/baojiadan.vue @@ -0,0 +1,89 @@ + + + + + + diff --git a/src/components/card/baseDataBillBusinessList.vue b/src/components/card/baseDataBillBusinessList.vue new file mode 100644 index 0000000..1a280e7 --- /dev/null +++ b/src/components/card/baseDataBillBusinessList.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/components/card/cp1Card.vue b/src/components/card/cp1Card.vue new file mode 100644 index 0000000..7e09264 --- /dev/null +++ b/src/components/card/cp1Card.vue @@ -0,0 +1,63 @@ + + + + + + diff --git a/src/components/card/dyeworksDyebackItem.vue b/src/components/card/dyeworksDyebackItem.vue new file mode 100644 index 0000000..48b3be9 --- /dev/null +++ b/src/components/card/dyeworksDyebackItem.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/src/components/card/fapiao.vue b/src/components/card/fapiao.vue new file mode 100644 index 0000000..cc8238d --- /dev/null +++ b/src/components/card/fapiao.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/src/components/card/form.vue b/src/components/card/form.vue new file mode 100644 index 0000000..5e0b88a --- /dev/null +++ b/src/components/card/form.vue @@ -0,0 +1,102 @@ + + + + + + diff --git a/src/components/card/genjin.vue b/src/components/card/genjin.vue new file mode 100644 index 0000000..c745776 --- /dev/null +++ b/src/components/card/genjin.vue @@ -0,0 +1,107 @@ + + + + + + diff --git a/src/components/card/hetong.vue b/src/components/card/hetong.vue new file mode 100644 index 0000000..abbc42d --- /dev/null +++ b/src/components/card/hetong.vue @@ -0,0 +1,73 @@ + + + + + + diff --git a/src/components/card/huikuanJH.vue b/src/components/card/huikuanJH.vue new file mode 100644 index 0000000..f97b4a8 --- /dev/null +++ b/src/components/card/huikuanJH.vue @@ -0,0 +1,85 @@ + + + + + + diff --git a/src/components/card/kehu.vue b/src/components/card/kehu.vue new file mode 100644 index 0000000..ce2620c --- /dev/null +++ b/src/components/card/kehu.vue @@ -0,0 +1,456 @@ + + + + + diff --git a/src/components/card/lianXiRen.vue b/src/components/card/lianXiRen.vue new file mode 100644 index 0000000..fe96c2c --- /dev/null +++ b/src/components/card/lianXiRen.vue @@ -0,0 +1,262 @@ + + + + + diff --git a/src/components/card/productweaveview.vue b/src/components/card/productweaveview.vue new file mode 100644 index 0000000..1d1bc5f --- /dev/null +++ b/src/components/card/productweaveview.vue @@ -0,0 +1,93 @@ + + + + + + diff --git a/src/components/card/qiandao.vue b/src/components/card/qiandao.vue new file mode 100644 index 0000000..28a4619 --- /dev/null +++ b/src/components/card/qiandao.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/components/card/shangji.vue b/src/components/card/shangji.vue new file mode 100644 index 0000000..06109ad --- /dev/null +++ b/src/components/card/shangji.vue @@ -0,0 +1,136 @@ + + + + + + diff --git a/src/components/card/shijiHK.vue b/src/components/card/shijiHK.vue new file mode 100644 index 0000000..b35c804 --- /dev/null +++ b/src/components/card/shijiHK.vue @@ -0,0 +1,93 @@ + + + + + + diff --git a/src/components/card/storeGoodsBusinessCheckItem.vue b/src/components/card/storeGoodsBusinessCheckItem.vue new file mode 100644 index 0000000..b3119b0 --- /dev/null +++ b/src/components/card/storeGoodsBusinessCheckItem.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/src/components/card/storeGoodsBusinessInItem.vue b/src/components/card/storeGoodsBusinessInItem.vue new file mode 100644 index 0000000..fa9d589 --- /dev/null +++ b/src/components/card/storeGoodsBusinessInItem.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/src/components/card/storeGoodsBusinessOutItem.vue b/src/components/card/storeGoodsBusinessOutItem.vue new file mode 100644 index 0000000..669da04 --- /dev/null +++ b/src/components/card/storeGoodsBusinessOutItem.vue @@ -0,0 +1,93 @@ + + + + + + diff --git a/src/components/card/storeGoodsBusinessStationMoveItem.vue b/src/components/card/storeGoodsBusinessStationMoveItem.vue new file mode 100644 index 0000000..df0b56f --- /dev/null +++ b/src/components/card/storeGoodsBusinessStationMoveItem.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/card/storeYarnBusinessCheckItem.vue b/src/components/card/storeYarnBusinessCheckItem.vue new file mode 100644 index 0000000..893b359 --- /dev/null +++ b/src/components/card/storeYarnBusinessCheckItem.vue @@ -0,0 +1,85 @@ + + + + + + diff --git a/src/components/card/storeYarnBusinessInItem.vue b/src/components/card/storeYarnBusinessInItem.vue new file mode 100644 index 0000000..628994e --- /dev/null +++ b/src/components/card/storeYarnBusinessInItem.vue @@ -0,0 +1,81 @@ + + + + + + diff --git a/src/components/card/storeYarnBusinessOutItem.vue b/src/components/card/storeYarnBusinessOutItem.vue new file mode 100644 index 0000000..5e6346d --- /dev/null +++ b/src/components/card/storeYarnBusinessOutItem.vue @@ -0,0 +1,81 @@ + + + + + + diff --git a/src/components/card/storefabricinbill.vue b/src/components/card/storefabricinbill.vue new file mode 100644 index 0000000..2895b25 --- /dev/null +++ b/src/components/card/storefabricinbill.vue @@ -0,0 +1,89 @@ + + + + + + diff --git a/src/components/card/threadCard.vue b/src/components/card/threadCard.vue new file mode 100644 index 0000000..66e33d8 --- /dev/null +++ b/src/components/card/threadCard.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/src/components/card/threadGenjin.vue b/src/components/card/threadGenjin.vue new file mode 100644 index 0000000..173c702 --- /dev/null +++ b/src/components/card/threadGenjin.vue @@ -0,0 +1,107 @@ + + + + + + diff --git a/src/components/common-navbar/index.vue b/src/components/common-navbar/index.vue new file mode 100644 index 0000000..8ddd381 --- /dev/null +++ b/src/components/common-navbar/index.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/components/dataNull/dataNull.vue b/src/components/dataNull/dataNull.vue new file mode 100644 index 0000000..abdce02 --- /dev/null +++ b/src/components/dataNull/dataNull.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/getMore/getMore.vue b/src/components/getMore/getMore.vue new file mode 100644 index 0000000..c8f02ee --- /dev/null +++ b/src/components/getMore/getMore.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/headnavbar/index.vue b/src/components/headnavbar/index.vue new file mode 100644 index 0000000..70357f1 --- /dev/null +++ b/src/components/headnavbar/index.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/lianxiRow/lianxiRow.vue b/src/components/lianxiRow/lianxiRow.vue new file mode 100644 index 0000000..aa4c52e --- /dev/null +++ b/src/components/lianxiRow/lianxiRow.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/components/mx-datepicker/mx-datepicker.vue b/src/components/mx-datepicker/mx-datepicker.vue new file mode 100644 index 0000000..08e569a --- /dev/null +++ b/src/components/mx-datepicker/mx-datepicker.vue @@ -0,0 +1,819 @@ + + + + + diff --git a/src/components/qianziyu-select/qianziyu-select.vue b/src/components/qianziyu-select/qianziyu-select.vue new file mode 100644 index 0000000..9299de5 --- /dev/null +++ b/src/components/qianziyu-select/qianziyu-select.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/components/searchView/searchView.vue b/src/components/searchView/searchView.vue new file mode 100644 index 0000000..aea5be2 --- /dev/null +++ b/src/components/searchView/searchView.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/skeleton/skeleton.vue b/src/components/skeleton/skeleton.vue new file mode 100644 index 0000000..91faa8f --- /dev/null +++ b/src/components/skeleton/skeleton.vue @@ -0,0 +1,231 @@ + + + + + diff --git a/src/components/topDropdown/topDropdown.vue b/src/components/topDropdown/topDropdown.vue new file mode 100644 index 0000000..eadbe0b --- /dev/null +++ b/src/components/topDropdown/topDropdown.vue @@ -0,0 +1,626 @@ + + + + + diff --git a/src/components/upload/uploadImg.vue b/src/components/upload/uploadImg.vue new file mode 100644 index 0000000..2f6aee8 --- /dev/null +++ b/src/components/upload/uploadImg.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/wyb-table/css/iconfont.css b/src/components/wyb-table/css/iconfont.css new file mode 100644 index 0000000..4ee0a6b --- /dev/null +++ b/src/components/wyb-table/css/iconfont.css @@ -0,0 +1,23 @@ +@font-face {font-family: "iconfont"; + src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAAsAAAAABzAAAALaAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDHAqBbIFSATYCJAMQCwoABCAFhG0HRhtCBsgOJUGS2IBhSABBPHyN/f7c3UVEk2hkSKLNE9NNSrBEgkhrJIYS7JuG/v7Pv7cbyBNUBB7u+/D8Cczd0qrAKui2UweV2+2Jz3M5bQIFMr+d5TbWojXpyo96AcZbAxpr0xYuoAS5pXYRBwav/GubCdQbFslkvbiyEawVpFcgLhUyDqx7fkWJUrVC9czEIh5YqE136RTAvf5+/IP4qCWpysjA3eMiEXJ/OnyLyVeVK52SRnqdC9E0MmaAQpzOxveZiYhjpr65uTmgVq3EVTXhP2MqFWvjw2L6l0dIMlGNkBvBrJfI/HTgBMHPcILEzxiSDAjR1faT88CGzx5UBz2+19V1ZP+Ku9i8v3xj0oPb8/DYW/HyOvCSHUz14N7Vleu2waXja7bOy1cOj1ridz1feeqBe5fDdm2dr93ynUqZbj7cXLr14cePR99QnyP4HxIbUmdfHxcc//rLnQ8Udwy/eHERdvFCLbSSeTLhHOI8cZIp+nn9/Hx4LPDc6fx1uum/+27vJ0s30CNb5dvUA0B+MVUAkD+bPkH2b3y7s5Xb45T5z7qhgFfGPmpTAdMCxqRgKWqlwJxSyom1lFzBJZWv6AX1SKhXD4SmafflCl0XOJtQq+uAr8ZQi6zWCL2wZ1ClwSyq1VpCvWkl0xt0oMxEqcOUOQeh1X0kzZ6QtTqjF/ZnVOn2F9VaI6PeXrgt2GAszmwLKHIMRcIPEYWg00rMzmxNZj3K+tQc7co1txmpUREicdGxw1QJapFeMcTYL4tnTCIS1WlIsbMdqtU6oqc6JQosWs6YPj0mRpq7UbSg04CtNRTiMEhE8IYQCgIdLUkWZmxHn6+HZPqocegKZSHaDFFGivqJONFiAfQSjRZE+ZVrjPrJxGMYCSGhdDSIYseF1DSuQ+jn2ykhARNNfiCqly7GyydBNdHP6zR/uAjqkcVLpMhRokrVgRwFla1SwWmZrm9Q6awaMwAAAA==') format('woff2') +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-check:before { + content: "\e60d"; +} + +.icon-arrow-down:before { + content: "\e62a"; +} + +.icon-arrow-up:before { + content: "\e62f"; +} \ No newline at end of file diff --git a/src/components/wyb-table/css/loader.css b/src/components/wyb-table/css/loader.css new file mode 100644 index 0000000..34e8993 --- /dev/null +++ b/src/components/wyb-table/css/loader.css @@ -0,0 +1,36 @@ +.loader-one { + width: 50rpx; + height: 50rpx; + position: relative; + -webkit-animation: loading-one 1s infinite linear; + animation: loading-one 1s infinite linear; +} + +.loader-one, +.loader-one:after { + border-radius: 50%; +} + +@-webkit-keyframes loading-one { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes loading-one { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/src/components/wyb-table/js/characterToPinyin.js b/src/components/wyb-table/js/characterToPinyin.js new file mode 100644 index 0000000..d116846 --- /dev/null +++ b/src/components/wyb-table/js/characterToPinyin.js @@ -0,0 +1,901 @@ +/*! +author:kooboy_li@163.com +MIT licensed +*/ + +let base = 19968, + middle = (40896 - base) / 2; +let EMPTY = ''; +let COMA = ','; +let chars = (() => { + let a = []; + for (let i = 33; i < 127; i++) { + if (i != 34 && i != 92 && i != 45) { + a.push(String.fromCharCode(i)); + } + } + return a.join(EMPTY); +})(); +let SDB = { + "a": { + "yi": "!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;Tk^l$lt?uJv$vMyE|R}a-!}-#&-#8-#L-#b-$Q-%?-+q-,6-,8", + "yu": "#V$l%S&9&I('(7(=)))m*#*$*B+2+F+v,0,b,i.W0.1F232L2a3(384>6P8n;';i;y<1>(>)>]@iB&X&m&s'2'X'd'f(9(c(i(j)@)l+'+M.).+1y1{2=3K4c6&6'6)606<6B6`9`9{:a`?`AgCLCuD%D2F2GyH&H1I;K~LkLuM&MYO0O3O9P8PbPcQqR5S2SCU0U~V%XYY&Z}[G^P`7cUc}dEeNgOj$j)l?m:n4p,sOuRv.y'{/|i}1~P-$B-%Y-)|-)}-*K-+G-+H-,m-.@-.M-/|-0y-2D-2c-4W-4`-4h-7a-7p-9c-9i", + "shang": ")Y6V9cJvR8UqXJXa])asbQc,s,uSvz-#+-.;", + "xia": "#Y#w&,&;'''I)1.u/j7=:[<'B[ByCtL'NmNyQOR([0`(cLh[iRkVt/t_u4uezFzM|W|{~d-&)-*4-.}-0a-5;-8S", + "han": "#,.m/h:l

MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V", + "wan": "#=$0&o.]0F4@5X5b6*628u9pk@,JhR`b$b`knmtujz'z0}<-#+-'I-*Q-16-7m", + "san": "3T3q3w3x7~uJuwzA-'n-([-,s", + "ji": "#r%''l'y)3)d)o*Z+'+9+G+M+T+Z+^+g+x._.c/R090d1S1W2;43484J4R5C5w6)6C6`7f7s878H8t8w9J9X9Z9{;8;<;B;C=(=2>6?YA$B+CHD0D8DbE:EQF2I*I|JEJnKKL)L:LkLzMdN'N5N:NiQ6QyRrUWVcVnWPWQWtX6XEXYXuY(ZAZ|[/]O]e^F^J^U^~`)b#b0c*ckc}dee!e$e9e>eyf+fXfrg)hFhriMjZlrqmr)sRt%uov3vevw|@};}N}g~!~+~F~{-!&-!u-#N-$%-&a-'u-(,-*x-+]-,W-.?-.V-._-.d-.g-/+-0$-0H-1%-1/-10-1^-1o-2/-2@-3'-4)-4o-5>-5H-5U-6,-6J-7/-7P-9e-9g-9h-9i-9j-:l", + "bu": "0$192,FKJgT=UYZ^e+hhjmm8mFoGpGp}sjw]w{-'7-'E-/m-3#-4.-6=", + "fou": "4I:L:O:Q~1-3:", + "mian": "!G!d#4$U$W$]3Y5X6A6_6o9g9w@qB/CkG!H_Q;-!L-!M-!P-/_-7y-7z-8'-8,-8q-8r", + "gai": "):5=5LD,ErI!J1Z'_/`TaYaac!lnpcw[|O}1", + "chou": "!+#n$N+0/y0}2:4e5/6#9jB*B.GNLfUmZ+^3^5_4e%e4fWkan]nbo.o6oU}u~$~*-.X-/>", + "zhuan": "%H'S'V.K0k1B1H1r2?7Z+7+f,8.#.|0K0p2O>#DNE1P.ccd]eMlpt8y>-0&", + "ju": "!Z$L$w%R*W,c,l/e1~3&3J8#:t=#=`=k@FBGC0DlD}FeGAIaIkJbMrN[OVP`RDTlU|W>Y`[$^Z`Ua*ccc{dWd]dae#e@eFeff8fSg*ga@'@2@KA%C|DQO+O]O^PvR!REScU'UfZw]m`l`na'i[l_m;p-4F-6'-63-91", + "shi": "!E!Q!e#?$p%$&+'$([(](q*^.&/5/n0[1w204zQQR9VYW2W@W^X2XNYxY{ZI[:[<[v]X^l^{^}_p`DaDbmgqi8ixjdk!kNkpl(lkntoMo^ocoeofp5ppq%q&q*q4qbr=t9x/-&^-&_-&}-'<-'@-(*-(8-)!-)H-+,-/<-0?-0d-0o-0p-2:-2O-3+-38-57-6M-9C-9E", + "qiu": "*6*7+a0r3k4D5]6j>7CaCeF`HEJXMhNgNjONP;QMQ_RfSWUUX?XUXqXrajc$d'jpjskXl]n@o.oup:r?-#5-#6-$8-/'-/k-0W-0X-1,-2Z-4v-7&-9U-:Y-:Z-:]", + "bing": "!n)F*4+/,>.75@DsOcZ7l`puqar||>-!:-!q-#,-#G-''-'C-(D-/O", + "ye": "$>$E(0,a6g=;@?HfSb[]_]lUlfn(oip=rmtDtTtevTx?-!O-!R-$5-%N-'F-'e-(T-*o-4Y-61", + "cong": "$'&Y1>8==g=l=p=vDIE=I2JUK0LsRZZk]$a}a~sKtBuKu_-*)-*V-+Y", + "dong": "&&.r0b5D?7?C@JD|G;I#KwQ([&jV~^-)T-/=-0)-4g-5/-6T-9,", + "si": "'?(b)^)g)p*+.+>0KxL+NLP7PiQnReS&W_`tp1pvp{qTqnr8r`tIuzyB-&6-&R-&^-&c-&s-&{-(:-)L-)q-*8-+.-0.-5j-6`-9N-:o", + "cheng": "#0$,$P&W*O*[*w+A+{,O,v/l5[7#:`?}FQOoS(UKZV_#cHcJk#m$nhrxtkuxv@vWx=xB|2-!A-$h-'w-)o-*>-+B-/u", + "diu": "r2xL-&&", + "liang": "3A3D3{6K@0CRF{Q%Up[,_Oe1h!h2hCiBiHojss-!=-)h-.J-.O", + "you": "(r)O*I7o8W;L;f=5=M>VDKFoFsFwG/KaOOOSPSQLY8ZN_;`qh%hMjWjnk6kPlYmEn3n>ncodp~r3x&x<-),-.y-/1-1p-1z-7N-8P-9D", + "yan": "##%F%L&%&F&T&v(Z,j/u1?2$5t7V;!;h?<@@AsCVCYCZD3FmGpH.JlN_PVQAT$UxV9WUX/XkXmXnY?Z3[U^1^C^E_e_~`B`C`RbDbPc;g/g7kIm#mNmsn5nHnsnyoPoVo`x+z7zkzmzn{A{`{e|}}2}b-%'-%,-%B-%v-'0-(#-)~-*$-*F-*j-*s-+C-.4-.H-.Y-0V-3$-3*-3B-3n-5#-5G-5u-7K-7r-8T-8W-8_-8`-8a-8d-8j-9L-9Q-9w-:1-:N", + "sang": "'EVNts-%2-%{", + "gun": "#<&#'U6F6z9dJ>JpTFTwUu]4h:?B@}AbB3BwECHxJ1NwOrP'U9UPXM[X[hhLhmq`tetlu.xSyUzTzU{W}4-!S-!s-#F-#`-#j-%f-(A-*%-+t-.3-/K-/U-1u-3T-3z-6g", + "ya": "#B%C&{'I*{,a.g=UDEKqO;T1WEWGY.^[g=i!j4lUp=s=v7x;}f-3C-3c-4U-6O-6V-9o-:;", + "pan": "!&!>!?!H!o'L'x2A76=F>R?$AIH+m/V2T4{6b99>j@`BnEkK*O:OBP^R2RKSzTKTNTO[@e^f>ohparHtQv5wbyF-3_-9@", + "jie": "#S%@&{(.*d+=.G0e4J5,599D;k=(@/CfD,G#G`J[LzOFP&P:PTQ=SKSQSqT/TITPTlU4U7UPVQXOXSX}Z%ZWZh]/^K^~_5ckdve=j^qGtNtXz,|1}.-!m-!u-$U-%c-&v-+i-.l-/@-2&-4{-5$", + "feng": "!@%N'40m5v7R:3C$FdHnN.PFSaWI[R^c`?b.c5k'n+n;r[u5uXxs-!$-!4-&%-&J-&L-(w-3(-3,-3F-8)", + "guan": "!'$b$j$k(W)B,Y/f0E6:9&:]:gBVFqIEWSW{X+X.a?bifMh?kmsUu>w7zOzS{,{2}{-'K-(N-0q-1N-1j-2e-2z-6D-7A", + "kuang": "!Y!z$Y%1%r%w(G+}/O/z5'538V8vZ-8>", + "chuan": ",40jA7BYB`BhBxEvale[hIkJp%wQ-5+", + "chan": "&6'W)K)q1N6D7$8*8A8[8_:6;xCODJIHKQQ2RGR_R{S1UeW!W`X3ZMZy]B^+^7_N_bfbi|n2n6o@rTr]uWw3xYz%ze{7{g-#Q-%D-%~-(%-(S-+Z", + "lin": "$B&['t0:393O5{8!S]SrU;VsD5E4GTO$WNYk`LdDdNgjozp?wr~~-!a-&.-.D-.`-/&-/0-1t-1v-1}-9=", + "dan": "!K%$%5)r,S0N1h4V8A=A=B=H=~>q@9ATAVH*JDOkPUTLV?VoXGX~ZK_'a|bBc3f{mHn&nKn~~t-$I-'G-'s-)*-)a-,C-3Z-8H-8b-8i", + "wei": "#o$M%}&0'#'D'M6/6p6r7+8y9f;6>n@gC+D!DOE+FCGBH)I&I(I4INJ]K$KJL7LdMDN0PwQ$QDQHR?T3T6V`WkX$Z)[#[^^*^4_I_^e;fefig@hbj>kg?:?k@N?#@!@D@E@nA3C!CWC}D*DFE'E,E]EpFFF|GKHKHjJXKsNSODOGOXOwPIPMQEQIQWTETsTvU.V(V6ViW+WKWMXpYS[C^H`Va4a{b4bXc(c7cRd=dZegh*hPhRiAiLlIm(m*mmnQowo|pFqZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X", + "tuo": "%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?", + "zhe": "#'%+%E'P2f2|_@eB>CADvFAI0I>J:L]M:M~TgWHWfY/Ya[|[}^6_ngmi6k`kll*l9r!tdwhxRzv}!-!j-%=-&9-&T-'(-'=-*&-0u-1I-2f-3;-3]-5F-5Y-7+-9T-:%", + "zhi": "!7!t$s%=(J(i(k(s(y)2)I)Z*2*>*A*T*^*c+(+)+J+Y,G/k4Q4b5T5W5s6~7^7|9(98;(<0=E=Q=b=}>L>|?+?QA4^4g=0D{OPOZX]Yb[(]G]W^ng=o;t*xHzI{N~J-&t-/9-/a-1{-22-9]-9`", + "hu": "(1(~.j0Z1M3!3^545r757G?0AMCtCxD5C_{u-$*-'1-(A-1!-1d-2i", + "yue": "$S%!(a){0^0|242S2_373H4<8sAlM{O,O.ZaZc_>cid2dCdFfZgApDqBw2whw}zczd{[-,V-6:-6B-8Y-:^-:m", + "lao": "&)'n,71s3<5>9M~CXE%F$H(JWMaOQP%Yg^jgrh>mAqa-$^-(w-/(-1w", + "pang": "!o'A1+=/>R?$?=A/B|QmWsd@jf~6~|-0k-2g-:K-:M", + "guai": "0,;%", + "sheng": "!D!^...t7*7q859e=[=x?*E(KM]^aMb1q2t2|#|Y|u-4_-9B", + "hao": "*:.,25-%|-0i", + "mie": "!`(D1G1dJxL>SNS~W]vt-1e-3M", + "nie": "1&294(4,=G=|B)B0E!GDMlSX^=e)e?eAezforAs$sJu*vfw9wByVyY{&|c}(-%L-%x-:#", + "xi": "!>#6$3$d%/&(&g'J's(!)P)n*l+7,,,n313z434i5j6H7?7W81878g979U;V;n<2<5<6>c>d@>A6BABBB}FUG]HeI9IbIwJ+JVKzL2NdPjQoQqRYRqSiT!U)UzW9WFWiWlX7XfXjXlZH[K[m]5]F_@`.`/`W`_a(cCcGcfcwesf)fulGlplwm&m4m_n:oIokp2p7pbqLqMqvsYu+ufv&w6wSxJy,z[{5{b}9}?}P}U~#~2~q-!%-&?-'2-'`-'r-(1-(C-*C-*O-*{-.)-/x-0_-1+-1J-2X-2q-46-6*-8I-9O", + "xiang": "!;)*+50U5Q6Y8b9u:U;E;J<4APC{HGHvLTaU4UI`]a$a]bxdRjGl{m/q#qOrXu,x$x>y`-$a-$e-%c-%d-)B-+5-3J-3q-4(-7i", + "mao": "!M#i$i*:/66e:uqcsVx,y%-,B-,O-4|", + "mai": "?W?XF>K^LgS{aKaxj(l+~g~h-!'-5{-7t-7u", + "luan": ";D?dAzA{L=NDW~o{r7w@-4'-6G-6h-:y", + "ru": "/M7F8G:1>AEgIYJ6KlLhQJSHU:VGW,inlEm`oSr+x_-%E-&!-1]-3)-3K-3x", + "xue": "$?,(A=C@E@IGLKStTnXd[p_[coe,hdibig~/-!_-#M-18-2k-6%-6^", + "sha": "%4&G052u4O8F8~<<WIYIuTJU!Zt`m`pgNlNlypHu7wcyZ~0-!d-.x", + "qian": "'K.(/~0A0t1'2*2D2R2p6+7[8J8q:G;h>b@vA~CnD(EIElF:I%IjK>KLNNO&O8P}VR[*[u]u_q`!`&gSh;i~kjk~p9pEpOq;q?r6sPtYukvqwPwgwtwvx+{x-#U-$z-*+-*/-*=-+U-,y-,z-0x-37-4M-6z-8G-8M", + "suo": "#*1Z1^4Z797U:?;cFaFbJ7P{VJcuk)tatju3u9xi-/b", + "gan": "!3%)*1*t.Y/x1*1}3%4s91>GCmE#T>Y^bJbTcAcTcti}nE-+e-.Q-1T-2w-3*-:i", + "gui": "!q#o$.$C%x%})0)s,E/?1K1T?NERJ;N%P/R*RpUgEi#lilxuyvlzY{P|M~#-#K-*;-.7-.:-.=-/S-1F-1U-2%-2r-34-:Y-:]", + "jue": "$Z$l$o%6,%525S8#9NA^D=KiKtNnO6RwRxU!WWWbX%X5X>XBXZXiY4Zj]N^f_}a0c[chd7h7x8D9V:4AQCyFOFPNxV}Zm]c_QazkFkHl.uqv!vF}*}/}G}H}w-#$-#r-+|-,/", + "gen": "CQEHdc", + "xie": "';(f*&3c4k5+595I5h6g6v7&8>8T92:B:M<3>l?T?V?ZA&LRLTM0Q7QKS+S@SBStTRV*V^W4XKXOXS[B[y^<_Z_mflfnl,lU-!i-!v-#1-#D-#h-$#-%c-/S-2%-9Z-9q-9t-9~-:b", + "zhai": "%X)3,92qP*Q,Znh5iGj+jM-.N", + "kang": "%<+U2v3tg1lJpgugwmz={L-17", + "da": "!W.u/(/S84;H=Xs]Q]fa`d0dhe3gvh_hfi;i?lvnkoHo]p#q]v*xW-'%-(B-*h-+;-/Q-1>-20-3|-5k-5s-78-:a", + "hai": "5L?Aj9l/lnnro<-'!-'~-)Z-)b-+>-+p", + "heng": "?J?mMZT9vc-3o-4$-6e", + "peng": "%c&'&S'+'Z+,.V1+1@5@8P>~AACgE%FdJRMkRiRjU3eSgbh:s9v{zL-$+-$0-):-*A-,X-,b-,q-4K-6y", + "mu": "!1#N%]+V7`7n:@?.C5DeF~G%O=e/qKqPx!~3~G-#9", + "ting": "/s5l%>&?qC)FnI7PWQ8ZJ[El=rUxKz`~K-!~-$g-%e-9F", + "qin": "$j$k*'*Q.d5c=>>MD1DAGZG^GkMRO8Q}RJS7TVWJWrZQc]pXpkriwix{}c-!]-$~-)f-+E-/c-33-4L", + "qing": "&/&Z'i046+60:ZDaHzQ#Wr[%]%_Agph+i7m;>t?fA!BuC,DrGWH=I'J{L4MmO^U+U,U6VrW5ZL[d]Rd8d_eKf@m3pxq5qFrVtow0wxw|x(yT-'4-'^-(E-(V-(d-(g-).-)[-*^-+)-+~-,$-/0-1=-1}-42-6k", + "lian": "'K+D2+2P2V6w7b8k94;s{M-#!", + "ren": "(o*,*e+#4A4U5)5y8x9$>?@AD)E}FGGDTUU2Y!ZC^I^Vg&gFi&p/p;pRqp-!W-![-#[-#w-&i-'#-(2-.^-3{", + "shen": "!U![$8$r$u%j)#)9,12e2g3T3U3q3w4l96:p:~>i>m?t@BFkHwH}JGK!LCPGPHUNX)Y1YHZ*[2^)_%_L_S_VfylPqRrj-$W-)W-.m-/z-0@-0|-1)-2N-4A-8b", + "ze": "#R#}$n(+*p/,0J1I=0BsKAS?Vz[(].a@b7b]c:jO-&t-6.-9s-:,", + "jin": "!#$j$k%M)8)G.U.m/J4W4`6L70:/B6F&F;GcGkJYM!TWW%WzXsTwGy2-!^-'m-(Y-)$-7D-88-::", + "pu": "$5*k+j0$8LBTBUFXGGGaH~IsIt[D]]_|bEfInprtupv=xbyqyu|[-/m", + "reng": "(_DGiu|z", + "zong": "&Y'h+?3P3]4$5z6E6Q6n6x7(7M7X7e7t9%9nawbKb^cYdgd}f;fhgBhHnfo'oPqvr#r$rFrqs0o334=4P4f5i8o8{;z*]+m.?/Q/i345D5N5`9PA@EjJPO1T,Z,cFj|ndq:qYqjxC-')-/L-2*", + "dai": "0,1n4x7%9AC?OMQ]TdW=Yd^xa7aLbqdff'gCgLg[i%jIk4p0~z-!0-)E-/>-3I-8N-8e", + "ling": "%d)D*M++.5/+4p6@9];K;U<.=KBqD[GiJJJmL%M|OiT(TcUjYVdLgZh/n8oWpts0x)zN|q~;~O~]~a~c-!2-$L-%`-)C-/$-05-2C-3L-6Y-7E-7q-9z-9{-:A-:T", + "chao": "!k,h,r2u6?9b;5J@mA+DTGMH!UlUqZfs&sWy+z'z(z0zh{1{a-#d-.0-02-1X-2H-2T-92-:d", + "sa": "8g?^HDK{LYY@fnpQuwwS}A-!c-!s-&,-&P-)&", + "fan": "%0(M/1/40i2A2d6R7i8$;o<[AIBcBfE0KNLPM>N!SOVqXva=bcfXo:-+g", + "wo": "#l&A,R,_6}>I@OAlB!G*HQLgP[Qbe:-(p-:4-:I-:L", + "jian": "!%#9#`$<$D$I&N&b','r'}(&(<(X+D.p/9/g0#0/0Q181k262I3_5U6Z788(899v:9$>S@fB4BoCICSCTETE~G-#O-#X-'A-'S-(7-(k-,h-0Y-0`-0h-1(-28-2h-37-40-4R-5@-71-7F-7I-7J-7W", + "fen": "#|%A*9./2x3=3r4S9';M;q;~ARD4IxKmO?O@TGY,`^`ff|hjnOpUvY}K~5-'W-'}-(c-(r-.w-1M-2Q-35-85-8n-9.-9:", + "bin": "%A8I::A)AiNc`X`cahailKvjya~l-$p-%G-%k-,'-,1-,E-,_-,p-.!", + "di": "!u#/%W')'.'{)<)_*U.v/*1=2c4+6c:);X;@WDXD_FMG9G_ICJMJrJwJ|M6Q+QVR-0>-69", + "fang": "!I!n(l4Y9*>TBjD;O!Y;^ed@lLp@siwn|,-,?-.v-1s-3E-51", + "pei": ">Q?(JBSwUrUsauc2hyiPnBn{s5y7|%|f~M-)#", + "diao": "$#&a,C,k.B1]5FJML|NhOaXxZ8Zv_M`ro~p_r!r:s*s[vawUxExR}v~D-.c-//-0%-2L-2{-3&-4O-9>", + "dun": "!^?gD'G!O'O(R/RO`ahShWiNu6zlzqzw{<{D{Q{c~4-#?-#{-%(-'f-)(-)4-.r-0g-0z-2V-36-3G-9<", + "xin": "!=(F?zBID7FkLZSyVtY3Y-%T-%U-*[-,w-.G-.W-1_", + "tang": "$f'@)f0{3V3j3o;l=)@zA4J4LJQSR$RAcMc~eef&g+m]o=tiu)uTv'wDx[yWyd{1}:-#I-']-'h-5:-96", + "huo": "!V$S$^(*)>)S*Y*_*`+|,W10=$=4AuCJG.IhMTSI[g`0a:4<%<@?R?U@.AEANAhG{THVmd#uQ}Y-$|", + "che": "$;%I&?&@=JFjP@gFA}EKFRFcK:LmRBTDW6Y7Zz[Q[o^;_V`$arb;c`cad>dKeagKimjHmDo@pAt(|C|o~H-5T-7]-9l-9m-:=", + "xun": "!x$Q*p,^4;8MAjEnF:KLKSL[LaMcRzS%XwY#Y)Yt^R^T_+j%jajlkclsmzoTv`-%A-(}-)U-+%-1?-1H-24-5A", + "chi": "!]!y$).X.y/A0+02133,5W<#<$>?2?D@SE9E|GeO%OHORR;U/U0UkVMYFZ9Zq[t`8aRcBc^d+dfeGj@jBkKkfkrkyl7q7q^qusx~9-&l-(4-(|-+&-.R-3Y-4!-4r-4w-4y-5]-6Z-8(-8C-9k-9v-:<", + "xuan": "!m!x#d$['5)k0R5?7J7d7w9K-+4", + "bai": "+&.;3;3M51L^W3b:b_-#k", + "gu": "!/$J'B)A*~+P.z010?0u3g75:r:v;Q>K@(AfE)G>GhJ,LSOdOjSeXFYR^h`%a]bxgdgehYi,iXk,nYprpws]wwy.}h-%@-%W-'Y-(Q-+`-/;-0'-2I-3^-5?-6S-7%-9*-9+", + "ni": "!h#P*G2m73=i>$>}@pABA{DqLpOLP.Q!XXZt`~d`h.jhmCpnx3}L~X-(e-0,-2J-7`-:+", + "ban": "*E2s5!9;>PBgBkQ*QvVKd[iciipPqEwfzx|$-!h-$F-%Z-.n-35", + "zhou": "!+#U$x&y062.2@2C3+384:777o8p9:B>o?#B^F@GoI$LfY][a]y^r_4_Manc0gkg{h,i0inCqg~Q-);-)`-)t-*r-+[-0(-3~-6f", + "qu": "$L'o(}.2.F/@2U3?4o5#<1u?/AxDlG:HhKbM}O[OfOpQdRDRlSkSpT'T:U&WxX!X&X=YeYjZj^tcjcld%d*fqf}g2gWw-#)", + "ga": "g=onsfwH-.A", + "dian": "&p'v,j1iIiKRPXdXeVewq!x%|8~@-!E-%3-%4-%z-*g-8Q-:8", + "tian": "!:#;'1'H,j4w6D>v@:BRBXGvWmX9atnTr#rFsXx%xM{%{n-!>-!G-'$-3f-5J-5S-8:", + "bi": "#L#M'!(w)L*@*C+;.n.o/E/Y0(0)1/1<2r2y4M4m6>7Q8@8};7<,=a>a>r@lA[BlC|E*F.FJG~H:J*>1>2GdYf^ucScxorpC&CqD^FyHSK}Tjh$la-#&-$)-,Z-/`", + "zuo": "(|*S+!+n/,/p4*7{?'D{F^H`HaJ?Th[(nWp||7-&t", + "ti": "!g#e')'?)Z)|*v/8285f6|9Y9y:{DXF!KgLIUzV&V'[qd)d2eJemexf~g8jxk=kLo&rDt)xy-%$-%r-*2-+m-,0-,L-,]-,a-/^-0B-2U-4;-4w-4y-5L-5M-5i-6r", + "zhan": "$H&b.33*6=9oGQLMN2N`NaOeWyYQZ/]h]l^B`#cghUhgiSl0n|zK~V-%~-&*-&N-&e-'|-*b-*l-.Z-1S-2y-37-60-7=-8i-:h", + "he": "&c()*(0z2i3@4?8r-:`", + "she": "'y(`BJBKBLJuNpOgP(S5Y>^dagakc'cDg~{!{^-#h-)u-7l", + "die": "!g!t&w5M9GpB5C6D~PmQ`R@V,V]YU[7_WcbdOdXdreigojNz+-#1-0S-2R-3d", + "gou": "/01%2)3g6t:&DhO[U#VBWwX;YNY~_(`ob5bgk_pMqHwl}k-#A-#m", + "kou": "!P!Z#r$$,P.2/W1OD+K=KFp$-5K", + "ning": "$P=R>!DpLevm-,~-64", + "yong": "%p&>A]DcIPP=Yre2e]l@mJmio9rHuVyh}n}~-%*-%s-'x-/y-0w-15-2A-2o-5`", + "wa": "%K,),?,E,`=N@r@xOyTuW1lc-#W-#^-#t-8w", + "ka": "?8U@qV", + "bao": ",<.~6h?,DgGYHcK`L4MJN^OJTeUdV4V5Vf`ib*d8q/w%x.zs~>-!6-&x-&|-(9-)/-+j-,M-/7-1~-3/-3A-6Q-9r-:B", + "huai": "=7N3N8VDVSeE-:f", + "ming": "!C!w#zEDJ'R,WuZ0m^n_q}xT-3.-6L", + "hen": "Y|-!y", + "quan": "$b%u/K0B5<6$7:9mEqI3NAP|SlXLZ#_)dkeIgzi=o5qxv%xO{#-#_-%M-&$-)V-*3-,e-0L-2^-9}", + "tiao": "!~(t),,J,g/!3/4.5F=S?PCdD^H0J@JMJNPnWdZ8Zv_McqdwjCr!rdtyxR-#%-,G-/o-1&-2;-9y-:C", + "xing": "!D#Z&$0Y0g6J@YApBFEuF7FhHrP9T#XVX_[_lMluo+pBqZqwrhwZx6|D|S-'V-(/-)p-+D-/5-0D", + "kan": "!N$=$g%?'^.QG&T%h8ho{4{q-%)-.+-:R-:X", + "lai": "#8#F/X0%2/2MG'H%MSW7Zqaob,c&c4k.mBsgxd-$q-$w-)y-0*-4B-4f-8%", + "kua": "50?>B~Z=d9dlq~-+s", + "gong": "'91*44474=8o;z>[OBXQXba6bZfzg$gtrG-!z-,T-:L-:Q-:W-:u", + "mi": "!s#p$A(w)')w*C1d2b2}3p407c;>;F?bClH{J#K'K/L}N#N6PaU*WZW[WcX1Z.[j[l_g_rjXo4oXoYo_r,z/-!K-66-7X-7Y-7j-82-9&", + "an": "!(!.;)?I@XEzGlHWHgJSUxZS[N_d`k`{r1s:x]zy}+~=-!w-!x-$1-(l-/E-4I-4u-6v-8c", + "lu": "!)#Q$_%|&L&d'])E)J*}+[+o071X1v2!2#2G2H3I6S8^9q:f?9A,AtBmBzCFCMCND.G@JcJeJtKcM[NSYXh[~aVb|d$dseCf#gxh^h|i/i>iTk5nwpis2sascu8uMumvGw&w+yr|A|t~x-%J-%_-)+-)r-*N-,3-.q-.t-00-1i-1r-1y-3w-4E-4P-6!-6>-6U-7;-7C-7M-7b-8l", + "mou": "!|7n:@Oq[[_Ue6t=-#9-3y-8!", + "cun": ".N2nA>lS", + "lv": "$()(*r+~0`5Z5~6S7_7j9q:*@wA(A8A;HkM,NKV=VZm'rJw#xDz_{T-*u-+*-5a", + "zhen": "!X!b!c!}%Y'%)5)T)b+I.A0X264N4w5Y7D7L9,:2=I?%B9H5I5IWJ&LnTpUSWaYKZb^pa2afbWc%g^hZi4iqkOnNoxq$r~s`tOu$u%wJyS|0|_~L-)D-,o-1f-3@-6R-8d", + "ce": "/%/U/^/t0G1W36F/H3HPJA", + "chai": ")&>HCjEJNzS9T[Xz`jp4wY", + "nong": ")v*j+q8C?cAXL,V~]iioipoL-,{-9a", + "hou": "#c$t0q3Z@AGFyHCKyL2LtNBNMP{DoU1UbVTdPllnm-+o-/R-:p", + "jun": "&].=/`0<0CFlGCI1O/PeTXWhaeg?m1p^qfr&t'wj|Q}^}l-$j-'8-(J-)m-+F-/]-2?-43-44-47-7U-7^-7d-:Y-:]", + "zu": "(x*J+10H4}95GqHbIkYm^kd6eLtdu2u;yk|6-!f", + "hun": "!F#O#W#]F6I8JyXT[=_2hczo{d-'>-(L-.C-9J", + "su": "';+1+3+],X1U3.324X7K7U:?>,>/@{DWFwJsM+M]MiXWYE[r^o_lcyf(k$khksnZrR-':-*_-+L-/i-1@-5p-6~", + "pai": "0'1z1|IOhBjLtV", + "biao": "'c,!1D@3A,A1AoJoM=T@UoVa[3]#b?seuZw$ycz#-&&-&+-&5-&D-&E-&F-&H-&O-&W-&X-*~-+@-+W-,;-2j-7Q", + "fei": "%[//1!6M9aO>e>r>z>{@GDFGjH$KhP_PuRuUtZp_GaObsvEyP|g~T-!/-!H-!I-&Y-&[-&]-'H-(j-*!-*,-0+-2F-9;", + "bei": "&i&r)`0'3f>wA[DfJ9M8PAU'V;ZLZwa1bVgch@iDlbm5mQqWrPv[wd|=-!l-#,-#C-+k-4N-6x", + "dao": ")=)H)x+B+K005F8hbdm?n~o,oJqQsMx#y8-$x", + "chui": "&U0D@8GPsFtny0|n-$u-:_", + "kong": "%.&V,/0@;gg,sA-#(-4[", + "juan": "!{#2#H5J5V7Z9S:|;=?w@7AaG[K3SfUM^&mTrZras6u0vHy5yXzt}^}l-#'-&k-'.-6m-:w", + "luo": "%T&!&='n/>0M2]5>8f9M:n;@@)@UAwF8H9HYJ5N9OrRHS6UvW~X'Z1dbf`g'kAl:uEw>y/yf}s-$f-('-)_-*P-*k-+=-+X-/K-4#-6)", + "song": "&P.@===yGOY0Z]^b_?jcu1-$@-%[-'[-)e-,c", + "leng": "#>&h++L@eD", + "ben": "/&<(DxRuaUblk/sIy&", + "cai": "#T677P8aGSK+U>a5b[dxeQob", + "ying": "!R$v&C&|(P)c+_2K2^6U7/8`9^:>:X:Y:c=?A:ASDzEAF7F9G0G1H@HAHBHZJKLqMwOmQ0QPQiR0S8SgVPWv[i]M]|adbHc@g:j/m2twv8vky?~_-##-$.-$i-%g-%o-%p-1V-3g-4q-5*-53-5o-5~-67-6C-74-7>", + "ruan": "&u(>6^U?sA7C~G3G}HRITJZQgSUb(hKn}o/sL|T-0#-0Q-4i-4~-6{", + "ruo": "0P1#DnI}mP-0e-0{-5<", + "dang": "!,#s%2'((2/[1f2&CDF3GbKuN(S)UCW&]b^A_kd&kEvWxB{9~A-8[", + "huang": "'w+e0f1q7O>=C1F#H|Q@RtSuYv[V[f_Xd,kWt3txu}yI},-$,-'P-*.-0T-1A-2]-5q-86-87", + "duan": "${'&.I1`2X6a:#IMK(QfRI]1a*g3kxu]yN|F~x-#J-+}-,*-5a", + "sou": "#v2BC;IQJ(L_M?Qum[o3t~uAyH-&:-&<-&S-'c-(R-*<", + "yuan": "!9!f)V.i0F6f7':.;m>CD3DYE?I?I_InLGLdO5PRPzQFQXQrT&TYUiUuV3VF[xa3bYh]iQj=k@kgl8lRnPphs'u(|^-%1-)9-*G-.o-30-3U-4V-5%-54-6K-6]-6}-8s-9!-90-95", + "rong": "+Q+S5E7@9C;^>FEFEfF5J/QhQwQxSDVEghthyb-)R", + "jiang": "(43u3|5P8:9L:F<>=.A2EaH^ILK.LAQjRM[w]=^W`6ngo>oF|H-#P-%5-12-2_", + "bang": "&<'A+%5_749B@uC8IcO!O*OvPt[s_olQlVt^y^-#3-,#", + "shan": "#:'m)K)q+W.s7g7}:D;p;r?pALATBaD&DtR}S,TCWjY%[b]r^ObFc?cVd^gGlAn#p!qtvBwRz4z5z;{@|P|X-'q-*J-+V-/l-1C-1D-2s-2y", + "que": "&5&E&g'6'7(1(N:P:RI]O6c}z}{*{l{p}a-4Q-6t", + "nuo": "+<+u3e3y4&5JiKWL.M4N*N+N7N@SPZ:^(^zhxnoqls?vPvvw:yz~<-!*-$O-$_-%7-%}-1Y-6<-9R", + "zao": ",y,~1R3sC#LlMPOC]`d1f4fNk%ktoCwA", + "cao": "3m>9C=C[EwJ_R:VbV|n)uc-*D-94", + "ao": "!T'Y}I-*S-+S-0~-2b-5X-8{", + "cou": "@ThJiK", + "chuang": "'_,H,L,q{+{E", + "piao": "$+).1D7a:;_tmuuCuUye-#!-%;-%y-'i-(Z-,t-,u-1*-2m", + "zun": "8':^U5]Pk|qqv+-1B-2u-4n-5|", + "deng": "$7'q.M/H1pCCW|`:f9l>mxv6yx}E", + "tie": "=VH8OhaPbndXq'qzv>vRx'-&z-'Q-*i", + "seng": "-,v", + "zhuang": "3:3nF)F]UBUZ", + "min": "!B%9&`.}/<1l6O6d:,:wDiSSb'pqs7tEzEzZ{K{S-1$-2n-3P-8q-8r", + "sai": "2'@cb6c9-%#-0_-2X", + "tai": "0+27>h>yB8BeD]GeLjdIl[nSpfw^-&/-)E-+7-/6-2$", + "lan": "17212Q4/8K8i9x;+I2F7I@sAHM9N?R1Z@[`l1~u-)S-*B-*v-0s-97", + "long": "!p$a%n&=(R(S,u.!.6/;1*162N=P>'?6E'[,A6;9l;1;;-&@-&C-&U-'b-(W-)M-)c-*@-*d-+T-.9-0m-5=-5_-7.-76-7[", + "shou": "6.9h@yC2uA-(_-:s", + "ran": "7v>ZDZIFOEOYTST`Tz-,A-,K", + "gang": "%.&q/{639!:N:W:x>Ep+s)ttwe", + "gua": "506}:z;%>xU^|cnedr#rFxM-&'-&1-*9-3k-6c", + "zui": "#G)C+15&8d;$KjRdXHi]nInqo!s$s8", + "qia": "%{'I?1HyU4dUnU-!{-+z", + "mei": "!L!_#)#a({)]+X0h3p;I;T?S?r@PE&FfI@QGTZdMg0mOnlrKtUtZyMyQ~N-#^-.>-.F-5(-7(-8V-8h", + "zhun": "+$,56(>UT8YAZ{_Pj.", + "du": "#K#b*f.T.^1,>DCsFBR&SZSmUyWqZd^$^D_E`3b%bNc)mMo(sDs|v}yL{!{^-!Y-#V-#s-#u-*E-,,-8]-8k", + "kai": "II`7gysvtbt{vCxGxvy@z<{({U-&;", + "hua": "%;&K'B3S8/BWD9D:GgIKK[MzR#XKZ&Ze[4[>]A]o_&`0p(p)rbsdunxN-*]-+<-5m-8=", + "bie": "FTNFObRmVuf6-19-2l-8|-:[", + "pao": "%e(@(O,!?|H>M=TeTfV>dDdTgfq/x.-!N-!o-7Q-7S-7|", + "geng": "56575d6m7,9Q;j;uAbArG?HYM3PfQ4Q[SRi_i`l6v|z$-#0-,k-0F", + "pou": "0$UO", + "tuan": "1H4'V8a%u<-5V-6#", + "zuan": "1B2Y808N8U8e:Kb3fjftq)vxw?w~", + "keng": "%t&3&RZOr>t1uOxg|&", + "gao": "#R#g)4)6)e*m+N+O/v0~3i7E:5;O;TA'B,GILrMHZ[_:m+ryu#xny]-#o-'_-,4-,5-5R-5v-93", + "lang": "&7*n/dC(F{IXJ.JHPOQlZEg%lzl~m.rLu&xzz^{]-)h", + "weng": "#q:b;}=rJ0L(Qstg-56-7,-9_", + "tao": ")?58617A7N9W9kG|PoUhX{Yn[{^MdwhXjPjenzs+|r-!k-!t-#@-#l-#|-&w-'d-'y-)P-)x-9/", + "nao": "%z&q'*?a@&@ZAkP6R~YZ]Ju|x@zJ{O-.'", + "zang": ";S?_AmAyB$I,K@M#abambLbUb}rC-)A-++-,.", + "suan": "(z.b/m0;1BI^nn", + "nian": "':*5*P1Y3*C/K6evf5f[h=iCiS-/4-0;-1x-2K-4%-8B", + "shuai": "7>:4RNTH", + "mang": "!5!6&<&D.ZCvEXEiG4G5M_OvRaSAlDp.rsx:-)g", + "rou": "*!2w3X>3?l@aHdQC]tekhEt$-#2-#f-*7-0R-4t", + "cen": "+W.m1A", + "shuang": "(V7;CPuh}z~b-*M-*y-+^-5c-6A-7B", + "po": "%g%i/70I3'7i<,IlK,jLn%n[o1oKotq9uswMwz|=-$K-%a-)7-,N-.E", + "a": "@@s@x}|:", + "tun": "AYAeC~OlVL`G`IgJ~Z-&h-(0-.j-1q-8J", + "hang": ".k/T5*9HBiDHOAT#UAa9j3lJ-$C-%]-.i", + "shun": "!x$&$1$9BZKo-$:-%S-,g", + "ne": "!vY6^]", + "chuo": "'j0^6?8&9bd!e'e`Q`b`va/hpj9k3l/lsn9tCvSyJy{{:{r}i}{-*|-,|-/n-0A-0K-2>-3?-4+-7<", + "ken": "&#>8>Y>fUFV$`S`wsh-:?-:E", + "chuai": "A0ACeb", + "pa": "/bm|roxk-.6-1K", + "nin": "?[", + "kun": "#7&H);*s+*5oGEPpUEUJUgV.`wo%sCy*z]zj{Y-)w-,<-,=-,D-0/-2G-4^-5'-6w", + "qun": "0<;_;`UVU^e.k&-7U", + "ri": "TMp/p;pd-)%-+(", + "lve": "+4rgrlxr", + "zhui": "&U((.h66729r:'@C@|[!b>c6j_o#s>sQvdy1})}Y-)s-+J-4Z", + "sao": "$O7m8<:A:HAdR4-&<-*#-*I-+Q-,:-0l-1R-2a", + "en": "J!", + "zou": "0&6GG=[)_CcNcOlem@mcn.|h-*H-+1-/w-06-2E-83-:.-:7-:n", + "nv": "2h=TSvSxp8wW", + "nuan": "-'M", + "shuo": "$m&+'$0cIvZaZc_>qttmv~x*", + "niu": "4H9.FxpTwq-!`", + "rao": "+i8)9FF,KdVvk}}B-'v-(>", + "niang": "nuoRoZ", + "shui": "#I)7*q*z@1U[ZaZcZg_>_KzG", + "nve": "&ONJ", + "niao": "@%E>K1T^UGVO-2{-6H", + "kuan": ",s,tAqw(-,&-,2", + "cuan": ",',Q,s,t,z1)1[fLfsrZw;yv", + "te": "?vRgr{xe", + "zen": "]V_y", + "zei": "S;a_bv-0M-1Q-2+", + "zhua": "2(AU-,Y", + "shuan": "5<@]z3{?", + "zhuai": "#1dmi'", + "nou": ";v=,tfv;", + "shai": "/Z121J1e2[[K", + "sen": "Ve", + "run": "$1AOz@zQ{F", + "ei": "ZH_@", + "gei": "5C9J", + "miu": "7n:@]+_w", + "neng": "?LR'", + "fiao": "WL", + "shei": "Zg", + "zhei": "j:", + "nun": "-84" + }, + "m": { + "yi": "-:~-:<-:;-:4-:3-:#-:!-9~-9T-92-8u-8R-8N-8I-8+-8(-7O-7M-74-6l-6c-6L-5z-5)-40-2U-2Q-2>-11-0o-/_-..-,o-,B-,3-+q-+[-+<-)X-(o-(5-'w-'k-'=-'#-&6-$'-!?~=}E}1|x{Zz|zzxix6x.x%wKw,v%uPs_rurorEr8r)pppdpXojoioVnxn_,^g]|]{]`]/[!Z=Y5XVVTTgT_T7T1SxSsR~RyR;QwQ0Q!PDP6NbN^N,MZMSLXLIL6L$J9I}IUIIHMG?EaEHE4D!CwCFBkBTBEB9B5@2?Y?K?I>K>H>'=a=R;m:~:48c8!7,5g4q3&2}2Y1j1f1`1M1/1'0t.O.K,_,,*x*f(c'G&.&&%b%Y%G%$$b$6$/#x#T!9", + "ding": "-:}-8q-)?-%!vipfkGiydzY2Ik6u+B&^&[%_", + "zheng": "-:}-9O-7L-0#{1{,yjuvsRm*lNlIi;eheZe8e4e3d/`x_v]3[+ZSY8Y2XlVFTYT#Q1C@A!4W3w07.),]%*#C", + "kao": "-:|n{k][#TbL>>R3p/,", + "qiao": "-:|-:(-6A-5v-4=-3(-2[-.@-,2-$H-$5-!q-!=y/y$xkx4rSm+m!k]k%j:iSi(hqbvaT_wVuV6V$T%KgGaF^FKFGEpDSBCBBB;8<2b1C1>.}#e", + "yu": "-:|-:p-9^-9P-9J-9H-80-7t-75-6'-5g-5b-5H-4U-3F-2l-20-1F-+K-)O-)+-(J-%a-$p-$K-$9-!7}]}W}5{7zizNzEvyvwv9v3tytjtetcsqsos@rsq|pyp+p%oQn6m%l8kyklk8jfgvguf%eGdWbtb(aLaKa:`1_1^:]e]d]KZOZ!YmXiTDS`SUS7RpQyNvLAKsJKJJJ;IAH|HmHVDVD:D*D#D!CrC[CDC,B*@K=Q<><<<1;h;_:v9G908=7M7I7A535#2{2R1b1:1(0;/q.(.&,1+G+9+7)n)h)F))(+&*%!$M$D$=#V!A!0", + "qi": "-:{-:r-9{-9E-9;-99-82-8$-5f-5(-3D-2{-1:-0G-.j-(Y-(A-(.-'v-'C-&%-%m-%I-%F-%E-%:-$D-#N-!Z-!B}$zvyHwbw;w1u~t[tFn;n3n$m~l^kkiBg/dpdTcKbJ4GyGJEW8l1T", + "xia": "-:y-:s-9u-6I-5e-3w-+T-*+-(v-'m-%n-!!}({Mwtwpm/logkeB_3YST)P~M-1A-/j-/i-*P-*J-(^-&C-&9-$k}[{Xtrrbp,n8lJl%dqbm_c_L]cZ(VLV%T]R_R^QRQQPOK9IJCH@l@^@?=k=Z=?y>]=x<`;t;(9.9(857&6{6d5m3D/;.j+?(>(!&8%{%t%4$X$,#H#>#'!w", + "bu": "-:q-7F-,M-*w-*t-(d-'K-&D{B{?{6zPtOm#izh'gfd,bi[rY}Y{YfQHM,C>C;C:'=", + "fou": "-:q-(cvCBj4H", + "mian": "-:o-42-1d-0w-,S-,H-$`tktQsZqpq#aDNWJ^E=D~@p?|;k;,7G/o", + "gai": "-:n-9w-6e-+u-+t|'uYm@dy^AW%T`QYNaHZGNGM:M8|'{&6!,", + "chou": "-:m-:l-8m-5_-4=-2A-(m~{t/r!iKhld$b3aS_%[_Y%W~N?N=LJJkI|E?B_0h/O.s.p&3&!%l#v!m", + "zhuan": "-:k-7o-3G-3+-2y-.I-)n-%+~EzRyPreq;<`,E%g#(", + "ju": "-:j-:?-9m-7n-62-5`-5S-4x-4j-2l-19-0%-.Z-.:-,.-+n-)H-'d-$|{/ztx_uct_tNt$o{nvnqnOnMmqmil`jYj9j7g+e%d:-(h-(c-%5-!.-!,~|~X}2|L{2xhvCs7*6e4n2x.Q.G,n)Q'(%k%h%@$p#R!U", + "shi": "-:h-:g-9q-9l-9N-9M-8t-8_-7R-6k-6]-1X-0m-,^-,:-+_-+6-++-*>-);-()-'{-',-%.-#t-#7-!W-!>{>z|y{xn=}:{:s:W:5:'9v7C7?6n4=4%28.3.+.#,0)$&3$}", + "qiu": "-:f-:^-8m-6#-)u-)9-&+~*|FyTsQl4j2j1cFc&]rWkO%KIHeF8BpAn@s@b?J=o;^:l:k:j2D/T.k+D*'([!P!(", + "bing": "-:e-:W-8h-8b-6u-5B-4T-3Y-1;-0a-0[{mp1ngnZhbhah&cm[vY,W5R0QpN/MQLQLLJnJbGXE:@~4E)r%,", + "ye": "-:d-9z-9.-9&-4e-2_-0U-)7-(u-'%-$W-#,-!]{:zIxqxdwgoVm$jxjw[hZzZ!YyY;X:X6UhUcUUUSURQUPxP@P?P,OmOkMYMXIQHsHpCXBh>i-,u-,G-,/-'I|/{)y&u^tXr*mSm>lKl?eNc3_H^LZhXL^>J=,7[6?1e=_=G<8:?7f7d6/05/f*6*2)c%x!'", + "diu": "-:_-:[", + "liang": "-:]-:Y-9)-5x-5[-5>-5%-1G-0B-&J-%y-%7-$Ly2bWY7Q*KJIwG%~n}bvRuAq=pZo8o6m1lyh[hZh(d]d$c|cqbY`,^xXkTaS4OVM;LAKGK=H{GFD}DJ@8@(?V?>=g;C:b976B/j/i/O.b.D,?,>+Z+Q&g&d%O%!", + "yan": "-:X-9d-5]-4]-4O-3;-1u-1Z-1Y-.a-.[-+:-*O-*F-*/-*$-){-)z-'%-&=-&2-%'-$N-$G-!L~~~a~Q~5{GzAydy7xLx@wMw>vPv>uFu@titfrgr?r9qwqfqWpKmhlEl'kuktk0jUjKjJjIjGgM-9<-9:-7m-5K-0W-.$-*H-*G-*A-*?-(s-(H-&n-&'-%;}L}@}9{j{5zbxTuBu3t%q2n,lVlUhKh?[`[ZZZY:XLN'KlIsIFA0A,}>k:c9s84684l0$/w&C&/&,!*", + "zhong": "-:P-8A-83-7x-4Z-0j-/C-$Tz8ysx$vMvHs^o)i)eqe0dddYS`MKC2@=?G4w2k.T$F!>", + "jie": "-:N-8i-8<-5$-4~-4W-4!-3j-2]-/@-/?-/)-,r-,a-*j-*i-(e-&c-%d-%H-$m-$8-#q~zzKz7vevOuit>sasVsCs(qSpIoJnpnln*m|lCkvkbjrjqjgjbhihIeEbr^S^;]_[,YZY+X{XwX?W_UmUOUJS9RINXNJL0KxKoI~I1HqHgHfH8EOB,>j>;:z9b882?/'.6+0)H)8&K&J%g%]%M%##D!~", + "feng": "-:M-8:-5L-4N-2Y-0]-0&-0!-/{-/y-%p{Rz9z5w}w9v7odoYl}l|l5W4MkKPI.E[?m?h=S;Y;#:R8e5Z4i3V3*2g1h/1,O)u%C$B", + "guan": "-:L-58-1=-0l-*vphb@b?af`LXqW*SRJ+G*D(B2>wRWQkP#L)?N>=0X.X.U", + "chuan": "-:K-7o-3G-2t-.K-$]}Tz3jFjDPMIRIDCbA?@i,H+<)7", + "chan": "-:J-91-2y-2R-1~-1/-/:-.k-.J-.*-*~-%$-$F-!n~P~@xBszr>q3l>kJkCkBjXh{hpgWdu^r^lXsX+W;VqVhU#S9RYJsJXDEB#=v:^967o7n71655d5B2V1I,#&v&u", + "lin": "-:I-9U-2g-0e-00-0/-)v-(l-%PxDlbk,gIgHc=bob)_=_6[MVGS?Q+PGN!FIEmEDQ>L#JuJfJ3J,IoGcDh@j=|=h.h)e)N", + "zhu": "-:G-:B-9]-7d-7G-7?-6Z-.&-,t-,n-#T-!z~4|=xpx3qVq!ploNnWnIl*i>[[[WT&StS;OqO1O0O.N>M#LzLFGWFmF,DhDbD^D0BH?&>Q;b7t7Z6s5x5>4V4A3y2^2@1+0x0?,K*K%B$J", + "ba": "-:F-8l-7`-1E-)^-)@-(b-&M-&I|_{[x>wCv0mumIj,fq]o]I]6]#[GZ)O+M'D,5?4R0+.m+@%N#/#!", + "dan": "-:D-8~-7{-7H-2r-2J-/V-,,-+G-*~-*{-'f-&2-%C-%B-$v-$F-!m-!b~[vTsjiofTfOfEb$aga>_q_P]4[VXuV@V?UjRiM/BeBSA*@)>rc>C=n=$;S;N;0:N:08?837i6R6G5|4]4>4$2]2O2F1]0u02/$.r,[,P,I*~)h);'f&H%!$N#X#U", + "jing": "-:A-9C-9+-9'-5r-5%-3A-2O-1N-0K-0C-/9-.~-,y-,k-,[|i|g|cyIvQt:t8t+pojAh|fdfZeeeWb/___NUoT+S&S%Q:Q3PIP0KZJpEvBsBn@I@H>m>%=><87]6#,r,'(^(B(<%($u", + "li": "-:@-6_-5u-5k-5Z-3s-2&-1z-08-/Q-/=-.o-.G-.'-.%-,l-,&-*L-*I-*:-*.-*!-)|-)Z-)X-(z-(2-&U-&0-%g-$C~g~`~A~>|`yrxEu+tat#rjqYq,nAmkm5m.lzjag@b]bXbRbB`l^&]q]gWYU@U3TsTlSpP_P>P%O&NmN^MqMSLnLcLYLUK!JoJdJMG1ECDuDjD_D8D.C/C+?k?[?Z=Y=U=/:/8z7@6C6$5H0a0U/>/=/#.z,~,u*V*$)z(t(_'x'u'l'W%R%F$l#P#A!Y", + "pie": "-:>rVV]V[PHAD8>", + "fu": "-:=-9c-8[-8#-7z-73-5y-5m-5j-5U-46-3v-0d-/|-/J-.R-+h-(=-(6-'[-'S-&E-!s|<|!{]wvwWvVvRuru'tDt,sbr5qJq/pmp3oWmgmFi~ifi7hzh;fwfkeje?c{ct^w]l]J]&]%[Y[QZ+YfV7S}SLS)ORN+M]MGM)M'L1KWJ2IYIPHKA:>~>Y=W-8%-6;-5|-4k-2k-2:-1q-.T-,|-,C-+y-+/-*V-(U-(T-(J-(?-(+-&)-%K-#v}4|^zLykxvvxv4u%tjthsurTownkn9n+lmkzk_j6hFgQfudbd`d@c'b[bZbKat_]^[]e]d]]Z4WGTTS7RoROQENvNtNoM&K#FLCVC=B3@[@Z@S?{>T>*=V;^:,874(3C322*1w/V/A+3*4*3(|(P')$h", + "tuo": "-:6-8X-77-6h-6.-'a-'G-%[-%$|Sz;v8sNrRmck'gzet]i]`[H[F[EZMYuV1NgN^MTM8ITI+GbFBF0AvA_@d?`?_?^-)C-(W-'v-'8|||{|T|:z~z{yFy@x$v%uNtsrGp&m7l0j+iridiahyh5h3ggf5eYeKe4e3dmdUcU`6`*_$^{^E]Y]F]E[u[HZtZpZ]Y{XvWpWVW2V{VvVtUKUJU>TjSMRwRgQ`Q/NOMyMcM2LqLhL6K~K7JjIuI]I*H+GHF_D|DnCAC6BiAJ@t@O@N?v?T?3>V>34`1_/9,x,^(R'w'[&3%c%;%7${$z$k$E", + "zha": "-:0-48-.N-.=-*C-(w-'X-'?-&K-$j-$O-$Aw/pNd6]s[m[XZdX4WIW#O2M7M1M0LvLlI?H4Fv;X:67u5#4@2N/p&d%.!M!H", + "hu": "-:/-:'-9j-9F-5E-0Z-+U-+L-'h-'W-%n-%Z-$_-$4-$1-#>-#2~k}v|;x1x0x,uGt4sEr]r[oxm[iphxfxfgdFd*d)cGa{^V^6^4^3^/^.^,^']y]9[xWWW$SXRFR-'$-&N-%z-#p-!}uSr`ljk/cY_f_eYtVZO:L=G5F!=O='8%7a3{/^./*<$f#c", + "yin": "-:+-7}-6^-0t-0;-*c-(j-(V-%o-$d-!T-!+~l~+~$}`}$|&{w{YzXz:w_u=t0t&p:n}lnlLlfya@`i`B_u_t_0SMO[L:KKEkE@E1DKCwC_BYBGA5>l>d>U<5;~:}:i9}9V6^6]4).],|,j*I(U$7#k#_#:", + "ping": "-:*-5i-0]-/z-/s-'u|Qz1u/ngnZmTi[iJi4heh&`0_zMfEU?6>6=A[KMbLw", + "sheng": "-:%-:$-4H-.X-.Q-,?-+0-(9}=x{x7u*k}_VS[RGQJQIOeMuIyG~E{BzBF?%;k;@:q7G2u/M.N*h)i&y&s&`!'", + "hao": "-:!-65-3k-2)-)6-'j-&_-#k-!t-!Y-!#~xxRvacOblRDR'QBPePaPWP7J!A~Ao=]-'6-&/-%]-$X-$:-!p-![~T~8y?xWwnw'tgs;rCr@nsncn`nRnHkgk9jpj`jZiqiOeceOe9djd_dEcscgcZcKc/bqbeb8ay`r`p_s_r^V^6^4^3]_]O]HW%R:QKQ9Q6PEOzNON)MdLZKSIdIGG{GUFkFRE|EjCzCuCmCMCJA4@e>X>S=f<[;i:+9h9)8p8/8,7N3e3R3K343&2Y2+2)2%1q1P1O1N0}0P/E/?/*.{.t.#+p*r)|(#'h$1!k", + "xiang": "-9x-9,-9(-6}-3*-1}-,4-,$-*0-(x-&r-%L~Ww~uXk5j)h7gqe'abQXP5LWH^F1DH;!8:*E'g'T", + "shu": "-9s-61-5g-55-54-1|-1F-)Y-'3yNyGu[tGq4oNoCnWnIg}gxdWchcgcIbt^X].Z.Z#Y>WBU9T'S|PvPtP*OhO1O0O.N[NBMtL`JtFuFYEpBuBKAaA`?c&=L/3,E,B*n*d&f%0$8", + "mao": "-9k-1,-1(-0|-0z-*dzLwksLmOkzi?a=_?^(S/QvPrN4M@I'B!AcAW?9;F/Y/#,J)E#$", + "mai": "-9i-7I-,{-,*-*}-#${Kx5", + "luan": "-9h-9Y-9V-*^}C}Bvmu0qXq:q$m)jOZ[TvOuL2D69K5J59#4#3", + "ru": "-9f-6K-2C-1K-(N-#{-!$vkv[s7qyq)jciX]kZgUTP+NzL(E0@W>7;Q9u6b+^", + "xue": "-9e-.x-(Q-!9|Bxbq>q+mmmMjzf=ckT/SlKvFc?!>u9j7>5y1&.B%L%<", + "sha": "-9b-4c-3?-2H-/,-.t-*+-%t-%^-%H-%4-$R-$0iCgkZEZDW$<%81806O5S4B2Z/J/B/2+%!l", + "suo": "-9_-9=-3]-&8-%x-$&-#j-#gu&s(as^$ZEZDW:PjKaJz:E9y+|)w)v)!(]", + "gan": "-9Z-8S-7J-5&-0=-/u-'c|Ro'o%o#o!hfh_dqa5U~T]T6R_NuMDKLH6FNEd@??;<:8f7_7/55+;*w'#%?!T", + "gui": "-9X-6q-3{-/(-/&-.7-.5-+Q-+J-+I-+F-*%}3{zv2u;s?rhrIp|k$jpj`iLhLh,gmf;cMVxVVTiThRCQ2O%M9L.KeIeI`GTGAG_k_Z^b]7Z`Y~Y9V^V;TnSgKTF7F6D[CvAG@:?!5P2|1d1>0S0G000/+z+M+)+'*](n(G%L$3", + "liao": "-9R-2|-!rrLovomo[>90%*F", + "chu": "-9K-5N-3d-3R-2K-2!-0$-/m-/Y-/I-,t-*)-!o{$x!s>n5hjgXcj`g_SWxW$VoTNS=NEIjI&HoHQF|E}EsESE#DsDdCzCG?@9r9q6x4N/+*+(,&;", + "kui": "-9I-3{-/4-+I-+F-$U-$;-!xwow4s/rBo*mQjVjHb]a.a,_y^BXgQdPyI2I0E&BV:S7x2l.q!/", + "yun": "-9G-7r-3q-1p-+}-+x-(0-&^-$^}xwEvsvEqOb}aca4a)`c]2[yRNQTP}MwHWF@BmBaA&A%@0=3=!:!7W2h2:202(2$1b.Y+(&P", + "sui": "-9A-5#-&F-#U{3wytvr1nwn4kpRqEWC1C0Ab=H9[7+6z5}2C1g0~(/'p", + "gen": "-9@-9?-&pX=X'L7", + "xie": "-9=-9!-7[-4J-4A-4/-39-1{-0s-0c-,w-,+-+'-+!-*k-*Z-)7-$(-!C~e{ry_wrw8w1u)sOq]opnenVnNm$jrgJeFcT`z`p_BZ~ZWZ8X9WnWMV*UiUFT}SWRePXMZLIK@JwI,HOH?H/FlC]?K>p>A;P9h7B695{5!4Q4P3b3E2,0w0s0O,C+k+e)8", + "zhai": "-9;-6B-4f-4*-3E-*K-*C-&c~zw{p{os[u[2YxW/UwU>SiSfH#EL#t", + "tou": "-98-4'-4&{$wNv'sqs@aK]*T0SQ", + "wang": "-97-8v-87-1JvYo7o1o0o/eoeiefe[dldJa}]>RTQ(OEODO=N1JD@J6;+E", + "kang": "-96-8)-+X}|rmkKg|dG`8]f](G=8_4d.a", + "da": "-95-.N-+f-'f-'R-&m-#~-!J{hxrw[v*d'ag_q]nWZVJ@f?}:<4Y0p&@&4$#", + "jiao": "-94-6n-6D-2q-2j-2I-.B-.6-,6-)B-(<-$H-#M-#K-#?-#(-!^-!=~IuUu1r=r6qcm+m(k1k%k!e.e+cJbl_~_i_KZjZTZ5X&W9VlVCV(ToTJT?T,SwSuSgSSQbPgP2LOIpG!>!:l:k9Y8w8<7b5[5C443,2b1>1*.9+l*X(5#e!v!^!V", + "hai": "-93-'V-'0-$#-#h~ey]vOq;pL[!A3=N3[,C", + "heng": "-90-&B-%QuJcXcLbaVKL/FiF&<|42*B", + "peng": "-90-5,-3J-.F-+o-!~zgyqyYfUe|cyc+`%[tZ?Z6YkXpWvW4OTKCJLIlIWGGFn?6t}sxk~hVhJh)gBg?g;dzZT8T.O)O(NfN^MrMTMSM&KuIRAh?`?^&D$i", + "men": "-8{-8G-53d8bcbCaz_9_&]VYgS^PZIh@>3=1,+((W", + "ren": "-8z-8y-8s-8U-8F-88-/d-/cx;vSu`n:n2d|dwdv]XO,NiLPLMK6J7/]", + "shen": "-8t-7V-6i-6/-5d-1Q-)l-)k-)j-)i-(V-'i-&}z^u|u>ttsys.qmp_pHorn7lui(fp`t`b]b]4WPTFR4P9P3M:J7J(IHHRA9@+=D<0n:(9U7C5[!e", + "jin": "-8o-8j-8d-7}-6<-35-2^-2=-01-,y-,k-,[-*X-*'-%o-!F~y{Fzkz6yE=q=M:I9$6~6g3h2M0i*Y)y)K(z(d(@(*", + "pu": "-8n-3$-+k-!S}^}O}<{BzPy(]p[rY{V0UvTeTdQ;PiPPP&O*M,FZE_AS=`:17k6T614r3a+v(C$m", + "reng": "-8g]m", + "zong": "-8f-5:-4y-43-3KzFpikxkrkNeJcdaraVY^XXX(W&Q|O>MxJQIKG28L8D8#3+1n1c0{,b,R%E#w", + "fo": "-8e-8;-73|IJl", + "lun": "-8c-7i-6S-4u}l}Y{.t*lSlRb9[{YMJa?j<6:3", + "cang": "-8a-89-7h-5;-3e-07-+OkeDW<];o:Y9g9_8a7;/G+J(!&Y&7", + "zai": "-8`-3V-2G-1!-&v}8pOl.]j]>L3>f;>:.4|4{3~&Y&7", + "ta": "-8^-6E-3^-#~-!&~Kz$yyy6vep}lc[HZXW`V&HCG}EqA[?}u.t`tZs~r~rOrNr9q`pUo;o:nBmylxlhjthhgCfhf+dI_a_X_R_'ZPYQXsWnWiVhVXVSU6U'QlQNPKNFMhGiFFEtDRC~ArA@>S=E=7:]:C7Q6*574*0l.=,s,G+f+c+U+O*|*s*T*,'3$c#b#Z", + "cha": "-8X-6Q-4D-/,-.t-)e-$A-$$~s{yvbu?o|m}kqj3]a]OZ7Z.XZX5WJW1NsM0LvK?I?GjEB@k,<%s", + "hong": "-8W-)w-).-(X-(K-(;-&{-%}-$)~i{kvXu6pqpjn=j[fvfBa*``XeVNQ[@E?y?<>@=b=S;J;B:R8J7U5(3|31+>+4'T", + "tong": "-8V-7/-6R-4Z-2h-,/-(}-&|-#Z}o|/mNm>m3h:f(c%`P`)Z1Q]PwwuqtKqdmdmVlQjhekYffd9]bDaxT:RBQtPcIiATX7s5L", + "fan": "-8E-0)-0(-0'-,1-+R-)a-!hy%v_tDr;r:iwhwdi_h]l[ARvRtNpMLKXJrJAG,FD@w@g?4955t5_3n2E15.l.[(A&O&/&,!.", + "miao": "-8D-,m-)v-$?vDscrPh>gtgSX^NP<#;A+K", + "yang": "-8C-7<-6{-3[-15-,f-,@-*g-'Z|J{xwTukswmrl6l3e`d4cEaA`m^}]T[lXRUz>`8N6A4y4D4.2B+6*O)4%Q$|$@#F", + "ang": "-8C-*gn.RLQoN0!5", + "wo": "-8?-4s-4L-*l-(/-'&-%q-$atCtBsfi8^TZYYbYSXKV#SRN8I>@1=#YqXmXjX7WmV!UGU'R{PpO_MoM(LEK3JgIfIJICI)HEG]FhFCEKE2DLC&BMBLA]>a>$OYOSN.K&J*J)F)A>@66}5i4v391=16+{+.", + "bin": "-86-3S-2EpAe}W?UNShJnImGXE:B^BO@r9I6q6Q6M6,+.(j((", + "di": "-85-7@-5a-4F-3:-*D-'}-&t-&$-%R-%&-#O-!(}0|h|d|@{Q{L{8zMyFy;x|w?tqsmrimUkIjoi`hBg:fofjeld#`7]g[g[=YFX]XGW2TLT!R[NfN(MrM3KAK:JCHiG7AI=g<};T9f9=3F/K.V+=*5'1%c##", + "fang": "-84-4}-+^|r{Qzcv5er^%TZS:S(RER6N/@<@'8*4c1@/!+m", + "wen": "-8,-/X-(M-(C-(&-%Jy`vNf)dfde]:X.WRSmQsKNHWH)C$B`@>;z;R:*4s+1*8(}(&$;$.", + "xin": "-8*-7f-5d-5G-!3-!0~%vSCR9N@N%D$C^4a3$", + "ai": "-8&-2W-09-)h-'!-&q-&5-%Y-$'-#]-#E-!;{SzIyfxUtgtUrxr'kaa9_7_,ZNYaT&T$QqP^P.CxClB.:%9t6U3.03(k(;#]!s!j!]", + "xiu": "-7~-5c-5V-''-$/~|p@mfmPh2N~G09~9F8I4+*P*#(N", + "xu": "-7~-7Y-6Y-6!-49-0x-,F-,E-*Y-)T-)+-'p-$e-$Q-#7-!o-!W}7{Wy,x+v&uxspsArFhHeXckcKc:b(`g^YY4XMTKT@RbRZR!QcP{O^OOLGI9GfC|CtCiCOCKBw@5@4>?=t<>;+;):P9r998W8B433W2H0m+t*N*?&;%T", + "tang": "-7y-5+-4M-3l-3U-1v-.2-&.-${-#.|XzpyukdilaA^cW^V~OsJFH%F{F<@P/:f8U6y6Y6+525127+_#@", + "hui": "-7u-7#-2u-1{-+H-+.-'/-&j-$[-#=-!f-!U-!D~p~,~&}u}Fz]xztEsgr7q]onn?n>i*gmg7g5f6f4f3e,e*cDcCcVEQSQCP|PQO]KeIOI3GRF4EiEZEQDqBVB>B=B7@n?D>h>g=y;+:S9X897x796y6:5,5)3t3q3k2h0y0q+h*9)G(=(2$~$)", + "kuai": "-7u-6@-2M-/p-&f-!8}:|ez&y'jEgMdXUkRrO]Cq=y79.*+g(2", + "cui": "-7s-5?-3N-04-%I-%>y8lYlWkhdSbE`TV|IxH*GHAg<48P6a331g)p(b%I$L!d", + "che": "-7n-5`-4I-,%-'y-&*|?vln|nGene/]QY.XcVsV>V<7`3r3b3E0C", + "chen": "-7h-4_-3e-2'-#|~ZyWyAw]pGoBdRa>[aY]THS~QAP$L[K_K'J(HUG3D]@+@*2n05)l%P$?$$", + "xun": "-7g-6O-4.-,Q-,A-,)-,(-+5-'3-!k-!P~u|y{=yixYxAw#uHqKq9o`oOmEj@j&j#g=ebe>c]`uXUTfRcP(NqL_KbF`BvB@Au@Y>5=r=l8+7y6V583O2h1{1D130j0Y0Q.5+b*H(L&T", + "chi": "-7c-7M-6b-6P-5E-3@-,W-,K-+_-*]-)<-)3-))-(:-&W-$z-$I-#l-!g-!=|@|)yLw/vBs6n|fsf$eweve6cBc9`X`7_|_2]`[f[!ZvZ/W+TxTCSNNcMPM3G1ChC6C4BX@T?Y;:8g4~4;3U1K.O'A$Y$U$E$2#G", + "xuan": "-7b-2N-/.-)o-)'-'(-$Y-$Mz)wsv&sWrqr.p]f[cobMaQaI_I^nX_SyS'RAR,QeQ$Q#PNK@HxHwEf?#;I8d4M3x2e+L*s*)*&)B(Z'~%/#E#<", + "nu": "-7a-3r-,svjq?ilfed1Wo", + "bai": "-7`-6z-(1-&:hJ[?[>ZwYeX}WAUfUCTAMFLN,n'D#*#)", + "gu": "-7_-3T-2e-0F-)I-'s-'N-&<-&;-%G-#y-#@}gzfx#uhrUq@o&lXl=j5j4d*`~]_]9TSNaM.K-27-+8-(%|Nzsznv/v)t'Y'R$*#[", + "zhou": "-7W-6M-2X-0{-'|-'z-'Q-'5-%X-$i-!G~{v.t/pgjCiceIY%QnQLQ8)<3;[5U3G2o0D(K(8#9", + "ci": "-7T-7B-6m-47-17-/+-/'-'t-'r-%@|*q}j3h<`hN|MILHD&C??56Z*p*k'E'6%=!{", + "beng": "-7S-#w-#+{R{#zgyXw!lBkYX0>v)d)[',&k&j$a", + "ga": "-7Q-'M-#A-#/-!4wIwDoEo>o.RaOM+C", + "dian": "-7K-7:-3m-18-**~M|P{lyBxfw6v~t6t!kXj]jNjMh@ao^!YOTrTWT9I_GqG_FPF5B?-(7-%`ylybwYvit=nodgc2b:Y#WPQ?LSB{?U-72-66-4E-'L-&,-#!|lmtmsj;h0d6YTV4R%M7M&)e", + "ti": "-7;-5N-5'-4R-/!-.n-*;-%H-$y-$3~w~rw?smsPnmnYnVl2foeCe6bnbjb#b!aU^)ZHY*X]XGU>OaONL$JxJCCQB]=0;T8O*5)A'r", + "zhan": "-7:-4>-2y-*s-!IrQnamRl>l)kCkBk.j|d+b0^M^?^5W|SJSGS0RsMjLiL-&t-%H-$j{szSmDl/kIi3c}cPa`^IZbX:QwP!M2HsGUBcAK?I0*/}/n'_&#%q%j%i", + "gou": "-71-3p-0y-+z-)H-'p-%W|C{uwdwcuTs0mnfM[CX%VcN6M^Gm?q:925.C*o%2", + "kou": "-71-0f-.C-,g-)J-)DpCp8fId3]^[|VpTV9@", + "ning": "-70-6>-4a-29-0.-'H-!)r%q!p2p)p'p!ot[4UMM5F/E5?17J6k.<+a&i", + "yong": "-7*-5t-3M-,U-,T-'T-$t-$+-!:{Oz!yCxcrlkUg{gAe{ceb{bzapaC`w`n`:[6XTU}M4LaGQ@}>x=9:p947:5T/{/i&p&l%)#S#8", + "wa": "-7)-/n-,e-(/-'P-'&-&x-%h-%A-#y-#nu5tbt3sGnCije[ZaWUTq>.:;8h'V'D'>&A", + "ka": "-7&-*r-'O-'M-'4-$u{g", + "bao": "-7%-5h-21-/>-.e-.]-,!-+{-+s~ozPzOz@sBqBpcpMp$ohoee&d:[w[kPPP1P&M]614J2<0_.u.h*G", + "huai": "-7#-',|mx^xIe_dC_:^oGhDX<25z", + "ming": "-6x-0g-06-(|-'guEs&`aXxR@PhOFH<>0:7,8", + "hen": "-6s-&p-!3eac6[0.:$y", + "quan": "-6p-1H-/.-.#-,5-,#-%%}X}Q{4w5u:t;q[m?jRf`c0b_b%['Y`WKNxJ:I[H_GLFjD>?F>F:a5841/I/H/7.o.n.m.O)2&I%'", + "tiao": "-6o-%Xr#pWmjmWh4cRZfSQRdQjOLO'NYK.Fo", + "xing": "-6j-5.-1<-/U-&g|0{auft{t5qljAh`f*cxb>aZUYR/P4Nl>ZG<9;H9<8o6o6l5n5G1z0B,a+T'h", + "an": "-6W-5J-4<-2D-*P-*J-')-%e-$x{b{&z_sYpwn@n8mXm:hXg~ZnXNQ.PnL'L&A1>M.g*w$V", + "lu": "-6V-33-1C-.H-,N-,<-*q-*o-!N~q~_};|G|5yVyUxMtVmChGgZgFf9f8^7XzW)V)UzUAU/O{MpLeJ#G&FyEuDvDaARAM>sb._,A$C", + "jiong": "-69-3'-1.-1$-0}}z|K{;]~]}?M=J7e4t4I3c2T2S1W1.", + "tui": "-6.-6(-3&y'tmo$ftfodrY(F>24", + "nan": "-6+-*|-$r~'~#v=tzstrb^e[sXfPqN*M6H}:d29&a&?", + "xiao": "-6*-5v-5R-3a-.x-,d-'j-'1-&l-&P-$}-$1-#D-#?-#&-!|-!v~c~J~CuUtHqGpPpJoKlGh/fFcJ_iX;V:TPT/SoSnQVQ'P;MiMaLOK+DOCYCLBAB4>B===8M=5;9*7)`$V$O!r", + "guang": "-5~-2}-1h-'@{~uIhXhTgOZsVKL+>28)5/4b4_4^3s.d+Y*U", + "ku": "-5}-/3-&Q-$6~R}PzrhDh+gN]dZiZ5OPMgL!I%3N.>$9", + "jun": "-5{-2T-0q-(n-(G|u{NuHollq_;Z3U5TzQPKMJH@F=l6V3G1B*1&'!Q!K!J", + "zu": "-5w-5?-+1-+$-&S-%rlYlAd(S#M1Ix0'*e", + "hun": "-5s-4o}_t9t'o9dMaz`oYDR?Q~JYJRBf=u>=4:&9z828&+F*L(F&r", + "lia": "-5[-5>", + "pai": "-5Q-&sg9eP[NY?JU?p>+;j;8/t.w,q", + "biao": "-5O-36-2/yJtIryi%f!VfNhLjFzEG<.9C66511o0c,k#|", + "fei": "-5M-.m-+M-*4-(i-%8w%vZt@t?nXh8gpgPbH]xSdQxQ%P:OPNLLxJVH5FOF)Di?Wq>O>N;y8^6F3{/(,T+P*M#y#5!Y", + "song": "-4q-3I-0D-)'u8pulDk^kOgydYdAb`a3a$`D_MZ#XXW0NK%J`HyEF-#*-!K~Oz%x#s{sXs9s%quqqq_q%kcj[jWhCgDexdha/_AVwV_U0U&R]R.Q:PwO?MHKpK]J{HvHdFbDMDI=_;E:U:K9d9O8K8F6j6i6N6=6&5~5o5j5M5A2w2r2_1x1)0b*:)*(y(S'i'5'%#j#;!B!;", + "ruan": "-4[zJxQsiVWOUE0):'}", + "chun": "-4Y-&7sda^RPR(PlOONDIBGrFQE(=T<,:[9N8u/6)C", + "ruo": "-4S-)[sskPf]Z:YUI8;y3'0^", + "dang": "-4M-2P-1V-/k-!1}*{fx]swpkl6kdf:aAZUUsTpKiEYD5@|8:7E5D*;(J(6'?%}", + "huang": "-4@-1L-/w-$PzDz.xtw&s[pEl9jBi0e@clcQa_a#`dXTQgQfPBOEHbH7D{@9:x9i8)4:2c2.1J0X+w)((E#i!}!g!Z", + "duan": "-4+-.Uz+s`SFS[$XOVUU8U*TwR1Q&PYKrEy6E5K't'k'c", + "za": "-4$-+Z-'b-'X-'2-$c-!c~B~:~5i}]s[$NyKr?r?a", + "lou": "-4#-38-.}-$7-#ByMu4tRo{n[kjkEg_`5X)W'HaG#:O9&8~1i'2$5#o#n", + "sou": "-3z-0J-)Q-)N-#z-#R-#QgsghZ#YvWlW>W0V:U`UBJ/DgCn:#,5#s", + "yuan": "-3u-1n-1)-0h-.z-*3-*1-)y-(0-&^-$Y-!<}{}t}Z}R}N}M}D{t{_yawlv6v(sSs:s)qhpepH0ErDk@/P>#;L9A8M.|,&&B%y%n%m", + "bang": "-3n{^ypiNi5h~hme|Z?YrWvS2KEJTJSH@=j/m++", + "shan": "-3h-3)-2R-/F-/<-.a-.E-*~-$q-$F-#H}'{Gy+y*ulubr2nDj|i(f+]zZ;Y3XuXsWaVhV?UySvQ8NrL|LlIVFSEhCI@`7|7p7O5F4B2Z211~.4*b%U%1", + "que": "-3f-*_-*W{Pyty$lgbNa+`KX!T8T.JBH$@j4e0|)O#q!N", + "nuo": "-3Q-1w-$ftxa6_#_!ZLXnWoWbWLK0HJF2Am", + "can": "-3P-2F-)l-)k-)j-)i-$D-#H~:r(q3amah`W`V`U_[XsVqVhO_BtBg;/784z1!0L(9", + "lei": "-3O-24-1t-,J-)q-#1|(z0xOx?rrU|U;G'E]DyDxD/?$>I=+JO7F5&2>1#(](7#&#%", + "cao": "-3L-#GnGk@`v`k`^_DVAUqOgOfG:8x", + "ao": "-3H-/n-*&-#X-#W|H|4xnxkv}vyvwsDs2rZmxmakAjnga`O_@]I]![DVuUeTBM*K=?>9;7M741m1^0Z,!+~(Y", + "cou": "-3D-0:Hl;1", + "chuang": "-3B-/b-/K-/5-.s-.i-.L-$T-!dhvhMd=`|W7O|;z;+:t8(+1*c)o)j)=$R!D", + "sai": "-2V-#b-#)-!/yod%a2XaAxAb", + "tai": "-2B-0_-)=}e|Mw[wXwOvzqvqCdodQdB`e[pU]SpR]MeE>@f@D@C>{:=4G4F1$*f", + "lan": "-2?-1@-)}-%P-!'~3|hx`xXt(qgqaqUmwkwhgb)_8_'^p[5X/UXU(TmSaS_PpLbHXDDD2D1=^9L8i7K6W5`5W5=5<46121%0n0d0I0@0>($'j", + "meng": "-2;-0k-,Lwaw`qEo2hnh*_._+^qXtUaP)O9K$F;EAANAF:A6h,Z+]'/&X#B!#", + "qiong": "-28-*fr.pza]`!K}F(3(3%2L1}*))J(G's'f", + "lie": "-25-0N-/O-,z-,w-,`-'<-&G{D{CuDjaj=djZeZ_YiUEL;JMA{>_=p403f2A1$0a0[.x,h,V+k+[", + "teng": "-2%i+9]8r1e%6%&", + "long": "-2#-'J-&]~^|7|6xHxGo2n=k6j_j^g.e([9U.QmOxO8LgKDGYDU>t:g9T9%5w0N*Z'n#f", + "rang": "-1}-,$~Nx[xC^mU$5b0K+S'X", + "xiong": "-1m-1j-/q-+v-+p-&zwsdLc?Sy@;>42w2r2#2!", + "chong": "-1l-0Y-#L{*p`oflelde0dc`+_dXT2NB6[6G5|5u$P", + "rui": "-1g-1e-1`-)LxFas]0M~KVF.@G)'&t", + "ke": "-1f-/*-.w-,]-,R-+;-)>-'o-'0-$!|Dzqx4u#p^oUmomIkvknjqc4bra6U4U0!/N//*j%>$O", + "tu": "-1c-1]-0H-/o-(y-&3-%?}n}c}J}I}A}?zezZyvxipvnUlskikFh.gVeVc}bsZ.YYX@W2K?EL@R=C=::r7u(i$r$>", + "nei": "-1I-1*-&TtvA(=w::8Q7V631r1[*a)~)%(v(?&S&>&%%r$(#d", + "shou": "-13-)`-)V-%l-!o{ox)x&pxo[]v]uYITcTN,", + "mei": "-0I~j|vz>yRv#sks]sTs4r

-+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~", + "bie": "-/A-/;fGe2`#M'M!$!#I", + "pao": "-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S", + "geng": "-/7-&A{TzHlrh=ZIOlK4IX=X2p&M", + "shua": "-//-%j", + "cuo": "-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'", + "kei": "-.woU", + "la": "-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A", + "pou": "-.l-'_-&[{]twtO]+]&Z+YGJS/<", + "tuan": "-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p", + "zuan": "-.)XOTt", + "keng": "-,x-([|t|kvIZCXlVgBF/C", + "gao": "-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t", + "lang": "-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s", + "weng": "-,@-#oyxv{kfU!Pd9o'N'&", + "tao": "-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=)'v", + "cen": "-)l-)k-)j-)i{Un#kH@?=1", + "shuang": "-)byOqeq^`NDB>t8R5w5^0&", + "po": "-)8-&M-#6~]|ZvztMoZmlmZg9W]TXR+O*E%?E>q>o>D;*:J8;6F3v,9*l!`", + "a": "-(s-'o-%O-$0", + "tun": "-(k-(7-%L-!`}}|snFhNdP_mRQPFOC@x=335", + "hang": "-([{dwSvIj)dGS8NML/@.", + "shun": "-(ZHnF?", + "ne": "-(R-(8-(%-&T]0%a", + "chuo": "-(Q-&@-%=~Hu!t~t.ssqVa|^2Z}UuCClMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#gKfVfSfC^P^N^>[zWQW!VySKMlIvGkFdEJ:)8{4[1s/|/z,f,.*{(p%m", + "pen": "-('-$E-$=-!6CN;'6}'Q!=", + "pin": "-&~~Yuatnrvq{[AZ{H]@_/c+!)r", + "ha": "-&wvz", + "yo": "-&`-%c-$B", + "o": "-&X-$a-!H-!%", + "n": "-&)-#a", + "huan": "-%v-$Z-$Y~G}D{_zWw@w2r.q[pYp0okm8l!h]bVaH_I^iYpXQUnU1KyK2GBD%CPCB>1=c<~;c8V7D734/3>2I.[.;,3+R*})9(1'b$d$:", + "ken": "-%V{qxjc*_CX~*I", + "chuai": "-%=XIW}Ch", + "pa": "-%/vLisihd.]oX|NC@r8608)P#!", + "se": "-%,-$,yogK_WY%X`W~J/J.Hl", + "nv": "vkc7OM@!", + "nuan": "vcPo;`:m2X2W", + "shuo": "v]a'WhT'S|OKGnCn>>470W+p", + "niu": "v?q=dKd0]S]![DN?@8@!4u/e/d.W", + "rao": "u2rA]PU?KkFJ", + "niang": "t|r&qb", + "shui": "t]iTZMYuA$A#@{=.=*", + "nve": "t)%S$%", + "nen": "sirarYc^", + "niao": "s!r+qsnwFq9x", + "kuan": "pBp#ooK)CoCfCd", + "cuan": "jPV'U*T~TwDtD7BU@o6E5K1S0<", + "te": "dsdr`R/F/9", + "zen": "d5VU", + "zei": "^H", + "den": "][]C", + "zhua": "],ZYV#ER0:09", + "shuan": "[&L^GL { + let result = 0, + temp = 1; + for (let idx = str.length; idx--;) { + result += temp * (chars.indexOf(str.charAt(idx))); + temp *= 91; + } + return result; + }, + fn = (a, f) => { + let p, gs, i, ch, num; + for (p in a) { + if (a.hasOwnProperty(p)) { + gs = a[p].match(ungroup); + for (i = 0; i < gs.length; i++) { + ch = gs[i].replace(rg, '#'); + num = fromX(ch); + ch = String.fromCharCode(base + middle + (f ? -num : num)); + if (sToC.hasOwnProperty(p)) { + sToC[p] += ch; + } else { + sToC[p] = ch; + } + if (cToS.hasOwnProperty(ch)) { + cToS[ch] += COMA + p; + } else { + cToS[ch] = p; + } + } + } + } + }; +fn(SDB.m, 1); +fn(SDB.a); +SDB = null; +export default { + getSpell(chars, polyphone, spliter) { + let cToS = DB.cToS; + let res = [], + pp = typeof (polyphone) == 'function'; //判断polyphone是否是函数 + chars = String(chars).split(EMPTY); + for (let i = 0, ch, ss; i < chars.length; i++) { + ch = chars[i]; + if (cToS.hasOwnProperty(ch)) { + ss = cToS[ch]; + if (~ss.indexOf(COMA)) { + ss = ss.split(COMA); + ss = pp ? polyphone(ch, ss) : '[' + ss + ']'; + res.push(ss); + } else { + res.push(ss); + } + } else { + res.push(ch); + } + } + return res.join(spliter || COMA); + }, + getChars(spell) { + let sToC = DB.sToC; + if (sToC.hasOwnProperty(spell)) { + return sToC[spell].split(EMPTY); + } + return []; + } +}; \ No newline at end of file diff --git a/src/components/wyb-table/js/inobounce.js b/src/components/wyb-table/js/inobounce.js new file mode 100644 index 0000000..20ee999 --- /dev/null +++ b/src/components/wyb-table/js/inobounce.js @@ -0,0 +1,137 @@ +/*! iNoBounce - v0.2.0 +* https://github.com/lazd/iNoBounce/ +* Copyright (c) 2013 Larry Davis ; Licensed BSD */ +(function(global) { + // Stores the Y position where the touch started + var startY = 0; + + // Store enabled status + var enabled = false; + + var supportsPassiveOption = false; + try { + var opts = Object.defineProperty({}, 'passive', { + get: function() { + supportsPassiveOption = true; + } + }); + window.addEventListener('test', null, opts); + } catch (e) {} + + var handleTouchmove = function(evt) { + // Get the element that was scrolled upon + var el = evt.target; + + // Allow zooming + var zoom = window.innerWidth / window.document.documentElement.clientWidth; + if (evt.touches.length > 1 || zoom !== 1) { + return; + } + + // Check all parent elements for scrollability + while (el !== document.body && el !== document) { + // Get some style properties + var style = window.getComputedStyle(el); + + if (!style) { + // If we've encountered an element we can't compute the style for, get out + break; + } + + // Ignore range input element + if (el.nodeName === 'INPUT' && el.getAttribute('type') === 'range') { + return; + } + + var scrolling = style.getPropertyValue('-webkit-overflow-scrolling'); + var overflowY = style.getPropertyValue('overflow-y'); + var height = parseInt(style.getPropertyValue('height'), 10); + + // Determine if the element should scroll + var isScrollable = scrolling === 'touch' && (overflowY === 'auto' || overflowY === 'scroll'); + var canScroll = el.scrollHeight > el.offsetHeight; + + if (isScrollable && canScroll) { + // Get the current Y position of the touch + var curY = evt.touches ? evt.touches[0].screenY : evt.screenY; + + // Determine if the user is trying to scroll past the top or bottom + // In this case, the window will bounce, so we have to prevent scrolling completely + var isAtTop = (startY <= curY && el.scrollTop === 0); + var isAtBottom = (startY >= curY && el.scrollHeight - el.scrollTop === height); + + // Stop a bounce bug when at the bottom or top of the scrollable element + if (isAtTop || isAtBottom) { + evt.preventDefault(); + } + + // No need to continue up the DOM, we've done our job + return; + } + + // Test the next parent + el = el.parentNode; + } + + // Stop the bouncing -- no parents are scrollable + evt.preventDefault(); + }; + + var handleTouchstart = function(evt) { + // Store the first Y position of the touch + startY = evt.touches ? evt.touches[0].screenY : evt.screenY; + }; + + var enable = function() { + // Listen to a couple key touch events + window.addEventListener('touchstart', handleTouchstart, supportsPassiveOption ? { passive : false } : false); + window.addEventListener('touchmove', handleTouchmove, supportsPassiveOption ? { passive : false } : false); + enabled = true; + }; + + var disable = function() { + // Stop listening + window.removeEventListener('touchstart', handleTouchstart, false); + window.removeEventListener('touchmove', handleTouchmove, false); + enabled = false; + }; + + var isEnabled = function() { + return enabled; + }; + + // Enable by default if the browser supports -webkit-overflow-scrolling + // Test this by setting the property with JavaScript on an element that exists in the DOM + // Then, see if the property is reflected in the computed style + var testDiv = document.createElement('div'); + document.documentElement.appendChild(testDiv); + testDiv.style.WebkitOverflowScrolling = 'touch'; + var scrollSupport = 'getComputedStyle' in window && window.getComputedStyle(testDiv)['-webkit-overflow-scrolling'] === 'touch'; + document.documentElement.removeChild(testDiv); + + if (scrollSupport) { + enable(); + } + + // A module to support enabling/disabling iNoBounce + var iNoBounce = { + enable: enable, + disable: disable, + isEnabled: isEnabled + }; + + if (typeof module !== 'undefined' && module.exports) { + // Node.js Support + module.exports = iNoBounce; + } + if (typeof global.define === 'function') { + // AMD Support + (function(define) { + define('iNoBounce', [], function() { return iNoBounce; }); + }(global.define)); + } + else { + // Browser support + global.iNoBounce = iNoBounce; + } +}(this)); diff --git a/src/components/wyb-table/js/objEqual.js b/src/components/wyb-table/js/objEqual.js new file mode 100644 index 0000000..f135845 --- /dev/null +++ b/src/components/wyb-table/js/objEqual.js @@ -0,0 +1,40 @@ +function isEqual(x, y) { + if (x === y) { + return true + } + if (!(x instanceof Object) || !(y instanceof Object)) { + return false + } + if (x.constructor !== y.constructor) { + return false + } + for (var p in x) { + if (x.hasOwnProperty(p)) { + if (!y.hasOwnProperty(p)) { + return false + } + + if (x[p] === y[p]) { + continue + } + + if (typeof(x[p]) !== "object") { + return false + } + + if (!Object.equals(x[p], y[p])) { + return false + } + } + } + for (p in y) { + if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) { + return false + } + } + return true +} + +module.exports = { + isEqual +} \ No newline at end of file diff --git a/src/components/wyb-table/wyb-table.vue b/src/components/wyb-table/wyb-table.vue new file mode 100644 index 0000000..dc8badf --- /dev/null +++ b/src/components/wyb-table/wyb-table.vue @@ -0,0 +1,1117 @@ + + + + + diff --git a/src/dev/core/base/base.service.js b/src/dev/core/base/base.service.js new file mode 100644 index 0000000..939af82 --- /dev/null +++ b/src/dev/core/base/base.service.js @@ -0,0 +1,12 @@ +import {HttpUtil} from '../../core/utils/http.util' +import {LocalStorageUtil} from '../utils/local-storage.util' +import globalVariable from "../global-variable"; + +export class BaseService { + + httpUtil = HttpUtil + + globalVariable = globalVariable + + localStorageUtil = LocalStorageUtil +} diff --git a/src/dev/core/global-variable.js b/src/dev/core/global-variable.js new file mode 100644 index 0000000..bf7eb4e --- /dev/null +++ b/src/dev/core/global-variable.js @@ -0,0 +1,25 @@ +const globalVariable = { + + key: '', // 数据签名key + localStoragePrefix: 'localStorage:demo-uview:app:', // todo 不同平台这里需要修改 + // localStoragePrefix: 'localStorage:wlsh-uview:app:', // todo 不同平台这里需要修改 + timestamp: new Date().getTime(), + + baseUrl: 'http://xxxxxxxxxxxxxxxxxxxxxxxx:33000/demo-mobile/', // 服务端地址 + + systemName: 'uview商城模板', + + runPlatform: "1", // 0-微信小程序版,1-APP版,2-h5版 todo 不同平台这里需要修改 + + userInfo: {}, + + token: null, + + coordinate: "", // 手机坐标 -- > 113.41189,22.94181 + + orderSequenceNumber: null, // 餐饮号 + + tempData: {}, // 存放临时数据,例如跳转页面时获取前一个页面保存的数据。 +}; + +export default globalVariable diff --git a/src/dev/core/interceptor/http.interceptor.js b/src/dev/core/interceptor/http.interceptor.js new file mode 100644 index 0000000..c88c7a1 --- /dev/null +++ b/src/dev/core/interceptor/http.interceptor.js @@ -0,0 +1,81 @@ +import {LocalStorageUtil} from "../utils/local-storage.util"; +import globalVariable from "../global-variable"; +import {CommonUtil} from "../utils/common.util"; +import {AuthUtil} from "../utils/auth.util"; + +// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token +// 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的 +const install = (Vue, vm) => { + Vue.prototype.$u.http.setConfig({ + // baseUrl: 'https://api.youzixy.com', + // 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data + // 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值 + originalData: true, + // 设置自定义头部content-type + // header: { + // 'content-type': 'xxx' + // } + }); + // 请求拦截,配置Token等参数 + Vue.prototype.$u.http.interceptor.request = (config) => { + // 添加token信息 + config.header.Authorization = globalVariable.token; + config.header.timestamp = new Date().getTime(); + config.header.sign = CommonUtil.generateSign(config.header.timestamp); + + // 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html + // config.header.token = vm.token; + + // 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取 + // config.header.token = vm.$store.state.token; + + // 方式三,如果token放在了globalData,通过getApp().globalData获取 + // config.header.token = getApp().globalData.username; + + // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值 + // const token = uni.getStorageSync('token'); + // config.header.token = token; + return config; + } + // 响应拦截,判断状态码是否通过 + Vue.prototype.$u.http.interceptor.response = (res) => { + console.log("Vue.prototype.$u.http.interceptor.response", res) + + if (res.header.Authorization) { + console.log('------------新的token-----------', res.header.Authorization) + globalVariable.token = res.header.Authorization + LocalStorageUtil.setItem('token', globalVariable.token) + } + + // 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据 + // 判断可能变成了res.statusCode,或者res.data.code之类的,请打印查看结果 + if (res.statusCode == 200) { + // // 这里对res.result进行返回,将会在this.$u.post(url).then(res => {})的then回调中的res的到 + // 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么 + return res.data; + } else { + if (res.statusCode == 401) { + AuthUtil.logout(); + } else { + let message = "系统异常"; + if (res.data.msg) { + message = res.data.msg; + } + if (res.data.message) { + message = res.data.message; + } + CommonUtil.alert(message) + } + + uni.hideLoading(); + + // 如果返回false,则会调用Promise的reject回调, + // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中,res为服务端的返回值 + return false; + } + } +} + +export default { + install +} diff --git a/src/dev/core/mixin/my.mixin.js b/src/dev/core/mixin/my.mixin.js new file mode 100644 index 0000000..bed73d2 --- /dev/null +++ b/src/dev/core/mixin/my.mixin.js @@ -0,0 +1,238 @@ +import globalVariable from "../global-variable"; +import {PaginationModel} from "../model/pagination.model"; +import {CommonUtil} from "../utils/common.util"; +import {UFormUtil} from "../utils/u-form.util"; +import {LocalStorageUtil} from "../utils/local-storage.util"; +import {TabbarUtil} from "../utils/tabbar.util"; + +/** + * mixin的作用是多个组件可以共享数据和方法,在使用mixin的组件中引入后,mixin中的方法和属性也就并入到该组件中, + * 可以直接使用,在已有的组件数据和方法进行了扩充。引入mixin分全局引用和局部引用。 + * todo 可以代替基类base的功能 + * + * todo Page页面生命周期函数执行顺序 + * beforeCreate => onLoad => onShow => created => beforeMount => onReady => mounted + * 刷新数据后 + * beforeUpdate => updated + * + * vue 父子组件的生命周期顺序加载渲染过程 + * 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted + * + * 子组件更新过程 + * 父beforeUpdate->子beforeUpdate->子updated->父updated + * + * 父组件更新过程 + * 父beforeUpdate->父updated + * + * 销毁过程 + * 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed + */ +const myMixin = { + data() { + return { + // _self: null, // todo 不能直接赋值否则u-view框架报错, 当vue作为组件引用时,组件模板页面