diff --git a/src/assets/js/util.js b/src/assets/js/util.js index 6670b208..5dbf7b99 100644 --- a/src/assets/js/util.js +++ b/src/assets/js/util.js @@ -1,7 +1,7 @@ import axios from 'axios' //获取前天-2,昨天-1,今天0,明天1等时间 yyyy/MM/dd format,分隔符 export function GetDateStr(AddDayCount, format, from) { - var dd = !from ? new Date() : stringToDate(from,format); + var dd = !from ? new Date() : stringToDate(from, format); dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期 var year = dd.getFullYear(); var month = dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1; @@ -10,77 +10,81 @@ export function GetDateStr(AddDayCount, format, from) { } //计算时间间隔 export function GetTimeDiff(startTime, endTime) { - var startTime = new Date(Date.parse(startTime.replace(/-/g, "-"))).getTime(); - var endTime = new Date(Date.parse(endTime.replace(/-/g, "-"))).getTime(); - var hours = Math.abs((startTime - endTime)) / (1000 * 60 * 60); - return hours; + var startTime = new Date(Date.parse(startTime.replace(/-/g, "-"))).getTime(); + var endTime = new Date(Date.parse(endTime.replace(/-/g, "-"))).getTime(); + var hours = Math.abs((startTime - endTime)) / (1000 * 60 * 60); + return hours; } export function GetTimeStr(AddDayCount, format, from) { - var dd = !from ? new Date() : stringToDate(from, format); - dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期 - var year = dd.getFullYear(); - var month = dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1; - var date = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate(); - var hour = dd.getHours() < 10 ? "0" + dd.getHours() : dd.getHours(); - var min = dd.getMinutes() < 10 ? "0" + dd.getMinutes() : dd.getMinutes(); - var second = dd.getSeconds() < 10 ? "0" + dd.getSeconds() : dd.getSeconds(); - return year + format + month + format + date + " " + hour + ":" + min + ":" + second; + var dd = !from ? new Date() : stringToDate(from, format); + dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期 + var year = dd.getFullYear(); + var month = dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1; + var date = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate(); + var hour = dd.getHours() < 10 ? "0" + dd.getHours() : dd.getHours(); + var min = dd.getMinutes() < 10 ? "0" + dd.getMinutes() : dd.getMinutes(); + var second = dd.getSeconds() < 10 ? "0" + dd.getSeconds() : dd.getSeconds(); + return year + format + month + format + date + " " + hour + ":" + min + ":" + second; } //手机号码验证 -export function checkPhone(phone){ - if(!(/^1(3|4|5|6|7|8|9)\d{9}$/.test(phone))){ +export function checkPhone(phone) { + if (!(/^1(3|4|5|6|7|8|9)\d{9}$/.test(phone))) { return false; - }else{ - return true; + } else { + return true; } } //获取随机颜色 -export function getRandomColor(){ - var r = Math.floor(Math.random() * 256); - var g = Math.floor(Math.random() * 256); - var b = Math.floor(Math.random() * 256); - return "rgba(" + r + "," + g + "," + b + ",0.6)"; +export function getRandomColor() { + var r = Math.floor(Math.random() * 256); + var g = Math.floor(Math.random() * 256); + var b = Math.floor(Math.random() * 256); + return "rgba(" + r + "," + g + "," + b + ",0.6)"; } //将时间戳转换成日期格式 -export function timestampToTime(timestamp,type) { - if(timestamp.length<13){ - timestamp=timestamp*1000 - } -         var date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 - -         let Y = date.getFullYear() + '-'; - -         let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-'; - -         let D = date.getDate()<10?'0'+date.getDate():date.getDate(); - -         let h = ' '+date.getHours() + ':'; - -         let m = date.getMinutes() + ':'; - -         let s = date.getSeconds(); - if(type=='date'){ - return Y+M+D; - }else if(type=='time'){ - return Y+M+D+h+m+s; - } -         - -     } +export function timestampToTime(timestamp, type) { + if (timestamp.length < 13) { + timestamp = timestamp * 1000 + }     + var date = new Date(timestamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000 + +      + let Y = date.getFullYear() + '-'; + +      + let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; + +      + let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); + +      + let h = ' ' + date.getHours() + ':'; + +      + let m = date.getMinutes() + ':'; + +      + let s = date.getSeconds(); + if (type == 'date') { + return Y + M + D; + } else if (type == 'time') { + return Y + M + D + h + m + s; + }     + +    +} //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码、出生日期、校验位验证 -export function IdentityCodeValid(code) { - var city={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:"国外 "}; +export function IdentityCodeValid(code) { + var city = { 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: "国外 " }; var tip = ""; - var pass= true; - - if(!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)){ + var pass = true; + + if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)) { tip = "身份证号格式错误"; pass = false; - } - - else if(!city[code.substr(0,2)]){ + } else if (!city[code.substr(0, 2)]) { tip = "地址编码错误"; pass = false; } @@ -111,50 +115,50 @@ export function IdentityCodeValid(code) { // } console.log(tip) return pass; - } +} - //验证企业 社会统一信用代码 +//验证企业 社会统一信用代码 export function CheckSocialCreditCode(Code) { // var Code = el.val() var patrn = /^[0-9A-Z]+$/; //18位校验及大写校验 if ((Code.length != 18) || (patrn.test(Code) == false)) { - - // el.focus() - return false; - } else { - var Ancode;//统一社会信用代码的每一个值 - var Ancodevalue;//统一社会信用代码每一个值的权重 - var total = 0; - var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子 - var str = '0123456789ABCDEFGHJKLMNPQRTUWXY'; - //不用I、O、S、V、Z - for (var i = 0; i < Code.length - 1; i++) { - Ancode = Code.substring(i, i + 1); - Ancodevalue = str.indexOf(Ancode); - total = total + Ancodevalue * weightedfactors[i]; - //权重与加权因子相乘之和 - } - var logiccheckcode = 31 - total % 31; - - if (logiccheckcode == 31) { - logiccheckcode = 0; - } - var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y"; - var Array_Str = Str.split(','); - logiccheckcode = Array_Str[logiccheckcode]; - - var checkcode = Code.substring(17, 18); - if (logiccheckcode != checkcode) { - // showTipsDialog("不是有效的统一社会信用编码!"); + // el.focus() return false; - } + } else { + var Ancode; //统一社会信用代码的每一个值 + var Ancodevalue; //统一社会信用代码每一个值的权重 + var total = 0; + var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]; //加权因子 + var str = '0123456789ABCDEFGHJKLMNPQRTUWXY'; + //不用I、O、S、V、Z + for (var i = 0; i < Code.length - 1; i++) { + Ancode = Code.substring(i, i + 1); + Ancodevalue = str.indexOf(Ancode); + total = total + Ancodevalue * weightedfactors[i]; + //权重与加权因子相乘之和 + } + var logiccheckcode = 31 - total % 31; + + if (logiccheckcode == 31) { + logiccheckcode = 0; + } + var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y"; + var Array_Str = Str.split(','); + logiccheckcode = Array_Str[logiccheckcode]; + + var checkcode = Code.substring(17, 18); + if (logiccheckcode != checkcode) { + // showTipsDialog("不是有效的统一社会信用编码!"); + // el.focus() + return false; + } } return true; - } +} //获取天气 // export function loadWeather(type,cityCode,_this){ // var weatherJson = { @@ -246,32 +250,34 @@ export function CheckSocialCreditCode(Code) { // }) // } /** - * 根据日期字符串获取星期几 - * @param dateString 日期字符串(如:2020-05-02) - * @returns {String} - */ - function getWeek(dateString) { - var dateArray = dateString.split("-"); - var date = new Date(dateArray[0], parseInt(dateArray[1] - 1), dateArray[2]); - return "周" + "日一二三四五六".charAt(date.getDay()); - }; -export function loadWeather(_this){ - // ?version=v1&appid=79112751&appsecret=EBqjU987&vue=1 - axios.get('https://tianqiapi.com/api', - {params:{ - version:'v1', - appid:'79112751', - appsecret:'EBqjU987', - vue:1 - },headers: {'Authorization': ''}}).then((res)=>{ - var json = res.data; + * 根据日期字符串获取星期几 + * @param dateString 日期字符串(如:2020-05-02) + * @returns {String} + */ +function getWeek(dateString) { + var dateArray = dateString.split("-"); + var date = new Date(dateArray[0], parseInt(dateArray[1] - 1), dateArray[2]); + return "周" + "日一二三四五六".charAt(date.getDay()); +}; +export function loadWeather(_this) { + // ?version=v1&appid=79112751&appsecret=EBqjU987&vue=1 + axios.get('https://tianqiapi.com/api', { + params: { + version: 'v1', + appid: '79112751', + appsecret: 'EBqjU987', + vue: 1 + }, + headers: { 'Authorization': '' } + }).then((res) => { + var json = res.data; var list = json.data list.forEach(element => { - element.week=getWeek(element.date) - element.date = element.date.substring(5,element.date.length) - element.url = require('@/assets/images/weather/'+element.wea_img+'.png') + element.week = getWeek(element.date) + element.date = element.date.substring(5, element.date.length) + element.url = require('@/assets/images/weather/' + element.wea_img + '.png') }); json.data = list - _this.weatherInfo=json - }) + _this.weatherInfo = json + }) } \ No newline at end of file diff --git a/src/util/util.js b/src/util/util.js new file mode 100644 index 00000000..7ede5540 --- /dev/null +++ b/src/util/util.js @@ -0,0 +1,116 @@ +/** + * 处理后端脱敏数据的方法 + * 当数据没有被修改时,传递null给后端 + * @param {Object} formData - 表单数据对象 + * @param {Object} originalData - 后端返回的原始数据对象 + * @param {Array} sensitiveFields - 需要检查的敏感字段数组 + * @returns {Object} 处理后的数据对象 + */ +export function handleMaskedData(formData, originalData, sensitiveFields = []) { + const processedData = {...formData }; + + // 默认敏感字段 + const defaultSensitiveFields = [ + 'phone', 'mobile', 'userTel', 'phoneNumber', + 'idCard', 'idNumber', 'identityCard', + 'realName', 'userName', 'name', + 'email', 'personMail', 'emailAddress', + 'bankCard', 'cardNumber', + 'address', 'homeAddress' + ]; + + const fieldsToCheck = sensitiveFields.length > 0 ? sensitiveFields : defaultSensitiveFields; + + fieldsToCheck.forEach(field => { + if (formData.hasOwnProperty(field) && originalData.hasOwnProperty(field)) { + const currentValue = formData[field]; + const originalValue = originalData[field]; + + // 检查是否为脱敏数据(包含*号或长度异常) + if (isMaskedData(currentValue) && currentValue === originalValue) { + // 如果当前值与原值相同且为脱敏数据,则传递null + processedData[field] = null; + } + } + }); + + return processedData; +} + +/** + * 判断数据是否为脱敏数据 + * @param {String} value - 要检查的值 + * @returns {Boolean} 是否为脱敏数据 + */ +export function isMaskedData(value) { + if (!value || typeof value !== 'string') { + return false; + } + + // 检查是否包含*号 + if (value.includes('*')) { + return true; + } + + // 检查手机号脱敏模式 (如: 138****5678) + if (/^1[3-9]\d\*\*\*\*\d{4}$/.test(value)) { + return true; + } + + // 检查身份证脱敏模式 (如: 110101********1234) + if (/^\d{6}\*{8,}\d{4}$/.test(value)) { + return true; + } + + // 检查姓名脱敏模式 (如: 张**) + if (/^[\u4e00-\u9fa5]\*{2,}$/.test(value)) { + return true; + } + + // 检查邮箱脱敏模式 (如: zh***@example.com) + if (/^[a-zA-Z0-9]\*{2,}@/.test(value)) { + return true; + } + + return false; +} + +/** + * 批量处理表单中的脱敏数据 + * @param {Object} formData - 表单数据 + * @param {Object} originalData - 原始数据 + * @param {Object} fieldMapping - 字段映射关系 {formField: originalField} + * @returns {Object} 处理后的数据 + */ +export function batchHandleMaskedData(formData, originalData, fieldMapping = {}) { + const processedData = {...formData }; + + Object.keys(fieldMapping).forEach(formField => { + const originalField = fieldMapping[formField]; + + if (formData.hasOwnProperty(formField) && originalData.hasOwnProperty(originalField)) { + const currentValue = formData[formField]; + const originalValue = originalData[originalField]; + + if (isMaskedData(currentValue) && currentValue === originalValue) { + processedData[formField] = null; + } + } + }); + + return processedData; +} + +/** + * 检查并处理单个字段的脱敏数据 + * @param {String} fieldName - 字段名 + * @param {String} currentValue - 当前值 + * @param {String} originalValue - 原始值 + * @returns {String|null} 处理后的值 + */ +export function handleSingleMaskedField(fieldName, currentValue, originalValue) { + if (isMaskedData(currentValue) && currentValue === originalValue) { + return null; + } + return currentValue; +} \ No newline at end of file diff --git a/src/views/companyAdmin/companyDiagram.vue b/src/views/companyAdmin/companyDiagram.vue index 5e8e66f7..2e1fc822 100644 --- a/src/views/companyAdmin/companyDiagram.vue +++ b/src/views/companyAdmin/companyDiagram.vue @@ -8,7 +8,7 @@ v-if=" ($store.state.userInfo.addProjectType == 1 && $store.state.userInfo.accountType != 7) || - $store.state.userInfo.addProjectType == 0 + $store.state.userInfo.addProjectType == 0 " class="plusBtn" @click=" @@ -345,7 +345,7 @@
调整组织 @@ -353,7 +353,7 @@
-