diff --git a/package.json b/package.json index c556045..abded73 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ }, "files": [ "src/mods", - "src/utils/util.js" + "src/utils/util.js", + "src/utils/dict.js", + "src/utils/moment.js" ], "workspaces": [ "src/components", diff --git a/src/main.js b/src/main.js index 1a82f52..f81d444 100644 --- a/src/main.js +++ b/src/main.js @@ -4,19 +4,10 @@ import store from './store' import axios from "./utils/axios" import utils from './utils/util' import config from './utils/config' -import dayjs from 'dayjs' import vui from 'uview-ui' import 'uview-ui/theme.scss' -import AiAreaPicker from '@/components/AiAreaPicker/AiAreaPicker' -import AiLogin from '@/components/AiLogin/AiLogin' -import AiRadio from '@/components/AiRadio/AiRadio' -import AiCheckbox from '@/components/AiCheckbox/AiCheckbox' Vue.use(vui) -Vue.component('ai-area-picker', AiAreaPicker) -Vue.component('AiLogin', AiLogin) -Vue.component('AiRadio', AiRadio) -Vue.component('AiCheckbox', AiCheckbox) Vue.config.productionTip = false Vue.prototype.$instance = axios.instance Vue.prototype.$areaId = config.areaId; @@ -25,15 +16,9 @@ Vue.prototype.$cdn = 'https://cdn.cunwuyun.cn/' App.mpType = 'app' -var relativeTime = require('dayjs/plugin/relativeTime') -var duration = require('dayjs/plugin/duration') -require('dayjs/locale/zh-cn') - -dayjs.extend(duration) -dayjs.extend(relativeTime) -Vue.prototype.$dayjs = dayjs Object.keys(utils).map(e => Vue.prototype[e] = utils[e]) +utils.$dict.init(axios.instance) const app = new Vue({ store, diff --git a/src/utils/dict.js b/src/utils/dict.js new file mode 100644 index 0000000..967f9ba --- /dev/null +++ b/src/utils/dict.js @@ -0,0 +1,56 @@ +export default { + instance: null, + init(instance) { + this.instance = instance + }, + dicts() { + return uni.getStorageSync('dicts') || []; + }, + load(...code) { + return this.instance?.post('/admin/dictionary/queryValsByCodeList?codeList=' + code.join(','), null, { + withoutToken: true + }).then((res) => { + if (res && res.data) { + let cacheDicts = {}, + meta = {}; + this.dicts().map((e) => (cacheDicts[e.key] = e)); + res.data.map((e) => (meta[e.key] = e)); + let dicts = {...cacheDicts, ...meta}; + uni.setStorageSync('dicts', Object.values(dicts)); + } + }); + }, + getDict(key) { + if (this.dicts().length) { + let dict = this.dicts().find((e) => e.key == key); + return dict ? dict.values : []; + } else return []; + }, + getValue(key, label) { + if (this.dicts().length) { + let dict = this.dicts().find((e) => e.key == key); + if (dict) { + let item = dict.values.find((v) => v.dictName == label); + return item ? item.dictValue : label; + } else return label; + } else return label; + }, + getLabel(key, value) { + if (this.dicts().length) { + let dict = this.dicts().find((e) => e.key == key); + if (dict) { + let item = dict.values.find((v) => v.dictValue == value); + return item ? item.dictName : value; + } else return value ? value : ''; + } else return value ? value : ''; + }, + getColor(key, value) { + if (this.dicts().length) { + let dict = this.dicts().find((e) => e.key == key); + if (dict) { + let item = dict.values.find((v) => v.dictValue == value); + return item ? item.dictColor : value; + } else return value; + } else return value; + } +} diff --git a/src/utils/moment.js b/src/utils/moment.js new file mode 100644 index 0000000..a157d57 --- /dev/null +++ b/src/utils/moment.js @@ -0,0 +1,35 @@ +import moment from 'dayjs' +import duration from 'dayjs/plugin/duration' +import updateLocale from 'dayjs/plugin/updateLocale' +import customParseFormat from 'dayjs/plugin/customParseFormat' +import 'dayjs/locale/zh-cn' + +moment.locale('zh-cn') +moment.extend(updateLocale) +moment.extend(customParseFormat) +moment.extend(duration) +moment.updateLocale('zh-cn', { + weekdays: "星期日|星期一|星期二|星期三|星期四|星期五|星期六".split("|"), + meridiem(hour) { + let word = "" + if (hour < 6) { + word = "凌晨" + } else if (hour < 9) { + word = "早上" + } else if (hour < 12) { + word = "上午" + } else if (hour < 14) { + word = "中午" + } else if (hour < 17) { + word = "下午" + } else if (hour < 19) { + word = "傍晚" + } else if (hour < 22) { + word = "晚上" + } else { + word = "夜里" + } + return word; + } +}) +export default moment diff --git a/src/utils/util.js b/src/utils/util.js index e535210..1ab2f6a 100644 --- a/src/utils/util.js +++ b/src/utils/util.js @@ -1,206 +1,322 @@ -import request from './axios'; -import store from '../store'; - -/** - * 字典工具 - */ -const $dict = { - dicts() { - return uni.getStorageSync('dicts') || []; - }, - load(...code) { - return request.instance.post('/admin/dictionary/queryValsByCodeList?codeList=' + code.join(','), null, { - withoutToken: true - }).then((res) => { - if (res && res.data) { - let cacheDicts = {}, - meta = {}; - $dict.dicts().map((e) => (cacheDicts[e.key] = e)); - res.data.map((e) => (meta[e.key] = e)); - let dicts = { ...cacheDicts, ...meta }; - uni.setStorageSync('dicts', Object.values(dicts)); - } - }); - }, - getDict(key) { - if ($dict.dicts().length) { - let dict = $dict.dicts().find((e) => e.key == key); - return dict ? dict.values : []; - } else return []; - }, - getValue(key, label) { - if ($dict.dicts().length) { - let dict = $dict.dicts().find((e) => e.key == key); - if (dict) { - let item = dict.values.find((v) => v.dictName == label); - return item ? item.dictValue : label; - } else return label; - } else return label; - }, - getLabel(key, value) { - if ($dict.dicts().length) { - let dict = $dict.dicts().find((e) => e.key == key); - if (dict) { - let item = dict.values.find((v) => v.dictValue == value); - return item ? item.dictName : value; - } else return value ? value: ''; - } else return value ? value: ''; - }, - getColor(key, value) { - if ($dict.dicts().length) { - let dict = $dict.dicts().find((e) => e.key == key); - if (dict) { - let item = dict.values.find((v) => v.dictValue == value); - return item ? item.dictColor : value; - } else return value; - } else return value; - } -}; +import $dayjs from './moment' +import $dict from './dict' const $toast = (obj) => { - let params = { title: '', duration: 2000, icon: 'none' }; - if (typeof obj == 'string') { - params.title = obj; - } else { - Object.assign(params, obj); - } - uni.showToast(params); + let params = {title: '', duration: 2000, icon: 'none'}; + if (typeof obj == 'string') { + params.title = obj; + } else { + Object.assign(params, obj); + } + uni.showToast(params); }; const $loading = (title) => { - uni.showLoading({ - title: title ? title : '加载中', - mask: true - }); + uni.showLoading({ + title: title ? title : '加载中', + mask: true + }); }; const $hideLoading = () => { - uni.hideLoading(); + uni.hideLoading(); }; const $dialog = { - alert: (params) => { - return new Promise((resolve) => { - uni.showModal({ - title: '温馨提示', - showCancel: false, - confirmColor: '#197DF0', - confirmText: params.confirmButtonText ? params.confirmButtonText : '确定', - ...params, - success: (res) => { - if (res.confirm) { - resolve(); - } - } - }); - }); - }, + alert: (params) => { + return new Promise((resolve) => { + uni.showModal({ + title: '温馨提示', + showCancel: false, + confirmColor: '#197DF0', + confirmText: params.confirmButtonText ? params.confirmButtonText : '确定', + ...params, + success: (res) => { + if (res.confirm) { + resolve(); + } + } + }); + }); + }, - confirm: (params) => { - return new Promise((resolve, reject) => { - uni.showModal({ - title: '温馨提示', - showCancel: true, - confirmColor: '#197DF0', - cancelText: params.cancelButtonText ? params.cancelButtonText : '取消', - confirmText: params.confirmButtonText ? params.confirmButtonText : '确定', - ...params, - success: (res) => { - if (res.confirm) { - resolve(); - } else if (res.cancel) { - reject(); - } - } - }); - }); - } + confirm: (params) => { + return new Promise((resolve, reject) => { + uni.showModal({ + title: '温馨提示', + showCancel: true, + confirmColor: '#197DF0', + cancelText: params.cancelButtonText ? params.cancelButtonText : '取消', + confirmText: params.confirmButtonText ? params.confirmButtonText : '确定', + ...params, + success: (res) => { + if (res.confirm) { + resolve(); + } else if (res.cancel) { + reject(); + } + } + }); + }); + } }; const $linkTo = (url) => { - uni.navigateTo({ - url - }); + uni.navigateTo({ + url + }); }; const $formatName = (name) => { - if (name == undefined) { - return; - } - return name.substr(name.length - 2, name.length > 2 ? name.length - 1 : name.length); + if (name == undefined) { + return; + } + return name.substr(name.length - 2, name.length > 2 ? name.length - 1 : name.length); }; const $previewImage = (list, index, urlName) => { - uni.previewImage({ - current: list[index][urlName], - urls: list.map((v) => v[urlName]) - }); + uni.previewImage({ + current: list[index][urlName], + urls: list.map((v) => v[urlName]) + }); }; -const $getLoginCode = () => { - return new Promise(function(resolve, reject) { - uni.login({ - success: function(res) { - if (res.code) { - resolve(res); - } else { - reject(res); - } - }, - fail: function() { - reject(false); - } - }); - }); -}; - -const $autoLogin = (params) => { - params = params? params: {}; - return new Promise(function(resolve, reject) { - $getLoginCode().then((res) => { - let body = { ...params, code: res.code }; - store.commit('getToken', { - ...body, - then: (v1) => { - if (v1) { - store.commit('getUserInfo', (v2) => { - if (v2) { - resolve(v2); - } else { - reject(v2); - } - }); - } else { - reject(v1); - } - } - }); - }); - }); -}; const $getUserProfile = () => { - return new Promise(function(resolve, reject) { - wx.getUserProfile({ - desc: '用于完善会员资料', - lang: 'zh_CN', - success: (data) => { - resolve(data); - } - }); - }); + return new Promise(function (resolve) { + wx.getUserProfile({ + desc: '用于完善会员资料', + lang: 'zh_CN', + success: (data) => { + resolve(data); + } + }); + }); }; +/** + * 身份证工具包 + */ +const idCardNoUtil = { + /*省,直辖市代码表*/ + provinceAndCitys: { + 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: "国外" + }, + /*每位加权因子*/ + powers: ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"], + + /*第18位校检码*/ + parityBit: ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"], + + /*性别*/ + genders: {male: "男", female: "女"}, + + /*校验地址码*/ + checkAddressCode: function (addressCode) { + const check = /^[1-9]\d{5}$/.test(addressCode); + if (!check) return false; + return !!idCardNoUtil.provinceAndCitys[parseInt(addressCode.substring(0, 2))]; + }, + + /*校验日期码*/ + checkBirthDayCode: function (birDayCode) { + const check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/.test(birDayCode); + if (!check) return false; + const yyyy = parseInt(birDayCode.substring(0, 4), 10); + const mm = parseInt(birDayCode.substring(4, 6), 10); + const dd = parseInt(birDayCode.substring(6), 10); + const xdata = new Date(yyyy, mm - 1, dd); + if (xdata > new Date()) { + return false; //生日不能大于当前日期 + } else return (xdata.getFullYear() == yyyy) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == dd); + }, + + /*计算校检码*/ + getParityBit: function (idCardNo) { + const id17 = idCardNo.substring(0, 17); + /*加权 */ + let power = 0; + for (let i = 0; i < 17; i++) { + power += parseInt(id17.charAt(i), 10) * parseInt(idCardNoUtil.powers[i]); + } + /*取模*/ + const mod = power % 11; + return idCardNoUtil.parityBit[mod]; + }, + + /*验证校检码*/ + checkParityBit: function (idCardNo) { + const parityBit = idCardNo.charAt(17).toUpperCase(); + return idCardNoUtil.getParityBit(idCardNo) == parityBit; + }, + + /*校验15位或18位的身份证号码*/ + checkIdCardNo: function (idCardNo) { + //15位和18位身份证号码的基本校验 + const check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo); + if (!check) return false; + //判断长度为15位或18位 + if (idCardNo.length == 15) { + return idCardNoUtil.check15IdCardNo(idCardNo); + } else if (idCardNo.length == 18) { + return idCardNoUtil.check18IdCardNo(idCardNo); + } else { + return false; + } + }, + +//校验15位的身份证号码 + check15IdCardNo: function (idCardNo) { + //15位身份证号码的基本校验 + let check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo); + if (!check) return false; + //校验地址码 + const addressCode = idCardNo.substring(0, 6); + check = idCardNoUtil.checkAddressCode(addressCode); + if (!check) return false; + const birDayCode = '19' + idCardNo.substring(6, 12); + //校验日期码 + return idCardNoUtil.checkBirthDayCode(birDayCode); + }, + +//校验18位的身份证号码 + check18IdCardNo: function (idCardNo) { + //18位身份证号码的基本格式校验 + let check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo); + if (!check) return false; + //校验地址码 + const addressCode = idCardNo.substring(0, 6); + check = idCardNoUtil.checkAddressCode(addressCode); + if (!check) return false; + //校验日期码 + const birDayCode = idCardNo.substring(6, 14); + check = idCardNoUtil.checkBirthDayCode(birDayCode); + if (!check) return false; + //验证校检码 + return idCardNoUtil.checkParityBit(idCardNo); + }, + + formateDateCN: function (day) { + const yyyy = day.substring(0, 4); + const mm = day.substring(4, 6); + const dd = day.substring(6); + return yyyy + '-' + mm + '-' + dd; + }, + +//获取信息 + getIdCardInfo: function (idCardNo) { + let aday; + let idCardInfo = { + gender: "", //性别 + birthday: "", // 出生日期(yyyy-mm-dd) + sex: ""//系统性别码 + }; + if (idCardNo.length == 15) { + aday = '19' + idCardNo.substring(6, 12); + idCardInfo.birthday = idCardNoUtil.formateDateCN(aday); + if (parseInt(idCardNo.charAt(14)) % 2 == 0) { + idCardInfo.gender = idCardNoUtil.genders.female; + } else { + idCardInfo.gender = idCardNoUtil.genders.male; + } + } else if (idCardNo.length == 18) { + aday = idCardNo.substring(6, 14); + idCardInfo.birthday = idCardNoUtil.formateDateCN(aday); + if (parseInt(idCardNo.charAt(16)) % 2 == 0) { + idCardInfo.gender = idCardNoUtil.genders.female; + } else { + idCardInfo.gender = idCardNoUtil.genders.male; + } + idCardInfo.sex = "" + Number(idCardNo.substring(16, 17)) % 2 + } + return idCardInfo; + }, + + /*18位转15位*/ + getId15: function (idCardNo) { + if (idCardNo.length == 15) { + return idCardNo; + } else if (idCardNo.length == 18) { + return idCardNo.substring(0, 6) + idCardNo.substring(8, 17); + } else { + return null; + } + }, + + /*15位转18位*/ + getId18: function (idCardNo) { + if (idCardNo.length == 15) { + const id17 = idCardNo.substring(0, 6) + '19' + idCardNo.substring(6); + const parityBit = idCardNoUtil.getParityBit(id17); + return id17 + parityBit; + } else if (idCardNo.length == 18) { + return idCardNo; + } else { + return null; + } + }, + hideId(code) { + return code && code.replace(/^(\d{10})\d{4}(.{4}$)/g, `$1${Array(5).join('*')}$2`) || "-" + } +} +/** + * 获取年龄 + * @param code + */ +const $calcAge = (code) => { + let birthday + if (typeof code == 'string' && code.length == 18) { + birthday = $dayjs(code.substring(6, 14), 'YYYYMMDD') + } else if (typeof code == 'object') { + birthday = code + } + return Math.ceil($dayjs.duration($dayjs().unix() - $dayjs(birthday).unix(), 's').asYears()) +} export default { - $dict, - $toast, - $loading, - $hideLoading, - $dialog, - $linkTo, - $formatName, - $previewImage, - $getLoginCode, - $getUserProfile, - $autoLogin, + $toast, + $loading, + $hideLoading, + $dialog, + $linkTo, + $formatName, + $previewImage, + $getUserProfile, + $idCardNoUtil: idCardNoUtil, + $calcAge, + $dayjs, + $dict };