From 00d20664ac8941bc1d2508d81e559cbfcda40328 Mon Sep 17 00:00:00 2001 From: zzyuan <781948537@qq.com> Date: Fri, 13 Dec 2024 16:12:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=82=E6=95=B0=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=EF=BC=8C=E9=80=9A=E8=BF=87=E8=AF=B7=E6=B1=82=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=8A=A0=E8=A7=A3=E5=AF=86=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 6 +- src/api/config.js | 9 ++ src/assets/img/myImage/point_grey.png | Bin 0 -> 6799 bytes src/assets/img/myImage/point_red.png | Bin 10269 -> 3441 bytes src/components/home/countryMap.vue | 11 +- src/main.js | 4 +- src/utils/bonus.js | 7 ++ src/utils/chapter.js | 76 ------------ src/utils/config.js | 11 ++ src/utils/configure.js | 85 +++---------- src/utils/dict/Dict.js | 3 +- src/utils/dict/DictMeta.js | 2 +- src/utils/dict/DictOptions.js | 3 +- src/utils/download.js | 26 ++++ src/utils/globalUrl.js | 26 ---- src/utils/index.js | 14 +-- src/utils/jsencrypt copy.js | 30 ----- src/utils/request.js | 48 +++----- src/utils/sm.js | 35 +++++- src/utils/validate.js | 168 +++++++++++++------------- src/views/Lines/index.vue | 4 +- src/views/Substation/index.vue | 1 + src/views/homePage/index.vue | 1 + 23 files changed, 230 insertions(+), 340 deletions(-) create mode 100644 src/api/config.js create mode 100644 src/assets/img/myImage/point_grey.png delete mode 100644 src/utils/chapter.js create mode 100644 src/utils/config.js create mode 100644 src/utils/download.js delete mode 100644 src/utils/globalUrl.js delete mode 100644 src/utils/jsencrypt copy.js diff --git a/src/App.vue b/src/App.vue index 4505a7b..85f382b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,7 +9,7 @@ // import ThemePicker from '@/components/ThemePicker' import autofit from 'autofit.js' - +import { get } from '@/utils/config' export default { name: 'App', // components: { ThemePicker }, @@ -25,7 +25,9 @@ export default { }, } }, - + created() { + get(); + }, mounted() { autofit.init({ /* designHeight: 1080, diff --git a/src/api/config.js b/src/api/config.js new file mode 100644 index 0000000..6c834fb --- /dev/null +++ b/src/api/config.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取系统配置 +export const getConfig = () => { + return request({ + url: '/auth/getConfig', + method: 'get' + }) +} diff --git a/src/assets/img/myImage/point_grey.png b/src/assets/img/myImage/point_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b0f554c7cede7053ea68e047071805168be011 GIT binary patch literal 6799 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 literal 0 HcmV?d00001 diff --git a/src/assets/img/myImage/point_red.png b/src/assets/img/myImage/point_red.png index 9d6bc78d7da901f3248f7686bed971935dd7bcdc..6748f4e2280a93f7e72ac271c3a8f22abe52003f 100644 GIT binary patch literal 3441 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 TEHl9O00000NkvXXu0mjf!m+Up literal 10269 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 diff --git a/src/components/home/countryMap.vue b/src/components/home/countryMap.vue index e5c4310..33d2594 100644 --- a/src/components/home/countryMap.vue +++ b/src/components/home/countryMap.vue @@ -558,16 +558,19 @@ export default { roam: false, coordinateSystem: 'geo', //使用坐标系 zlevel: 1, - symbolSize: [80, 90], + symbolSize: [60, 70], symbol: (value, params) => { if (params.data.errorNum>0) { return ( 'image://' + require('@/assets/img/myImage/point_red.png') ) } else { - return ( - 'image://' + require('@/assets/img/myImage/point.png') - ) + if(params.data.devStatus==0){ + return ('image://' + require('@/assets/img/myImage/point_grey.png')) + }else{ + return ('image://' + require('@/assets/img/myImage/point.png')) + } + } /*if (params.name == '安徽省') { return 'image://' + require('@/assets/img/myImage/markPoints.png') diff --git a/src/main.js b/src/main.js index a378822..7f444f9 100644 --- a/src/main.js +++ b/src/main.js @@ -47,7 +47,7 @@ import TableModel from '@/components/TableModel' import JsonExcel from 'vue-json-excel' Vue.prototype.$eventBus = new Vue() -import global_ from '@/utils/globalUrl' +// import global_ from '@/utils/globalUrl' // 全局方法挂载 Vue.prototype.getDicts = getDicts @@ -60,7 +60,7 @@ Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.download = download Vue.prototype.downloadJson = downloadJson Vue.prototype.handleTree = handleTree -Vue.prototype.globalUrl = global_ +// Vue.prototype.globalUrl = global_ Vue.prototype.indexContinuation = indexContinuation // 全局组件挂载 diff --git a/src/utils/bonus.js b/src/utils/bonus.js index 36e2b1a..ef2cbd4 100644 --- a/src/utils/bonus.js +++ b/src/utils/bonus.js @@ -232,3 +232,10 @@ export function tansParams(params) { export function blobValidate(data) { return data.type !== 'application/json' } + +// 处理表格索引延续问题 +export function indexContinuation(num, size) { + return (num - 1) * size + 1 +} + + diff --git a/src/utils/chapter.js b/src/utils/chapter.js deleted file mode 100644 index 69871a3..0000000 --- a/src/utils/chapter.js +++ /dev/null @@ -1,76 +0,0 @@ -let chapter = (text, companyName) => { - let canvas = document.getElementById("canvas"); - let context = canvas.getContext("2d"); - - //let text = "XXX专用章"; - //let companyName = "XXX科技股份有限公司"; - - // 绘制印章边框 - let width = canvas.width / 2; - let height = canvas.height / 2; - context.lineWidth = 3; - context.strokeStyle = "#f00"; - context.beginPath(); - context.arc(width, height, 80, 0, Math.PI * 2); //宽、高、半径 - context.stroke(); - - //画五角星 - create5star(context, width, height, 20, "#f00", 0); - - // 绘制印章名称 - context.font = "14px 宋体"; - context.textBaseline = "middle"; //设置文本的垂直对齐方式 - context.textAlign = "center"; //设置文本的水平对对齐方式 - context.lineWidth = 1; - context.strokeStyle = "#f00"; - context.strokeText(text, width, height + 50); - - // 绘制印章单位 - context.translate(width, height); // 平移到此位置, - context.font = "14px 宋体"; - let count = companyName.length; // 字数 - let angle = (4 * Math.PI) / (3 * (count - 1)); // 字间角度 - let chars = companyName.split(""); - let c; - for (let i = 0; i < count; i++) { - c = chars[i]; // 需要绘制的字符 - if (i == 0) { - context.rotate((5 * Math.PI) / 6); - } else { - context.rotate(angle); - } - - context.save(); - context.translate(65, 0); // 平移到此位置,此时字和x轴垂直,公司名称和最外圈的距离 - context.rotate(Math.PI / 2); // 旋转90度,让字平行于x轴 - context.strokeText(c, 0, 0); // 此点为字的中心点 - context.restore(); - } - - //绘制五角星 - function create5star(context, sx, sy, radius, color, rotato) { - context.save(); - context.fillStyle = color; - context.translate(sx, sy); //移动坐标原点 - context.rotate(Math.PI + rotato); //旋转 - context.beginPath(); //创建路径 - // let x = Math.sin(0); - // let y = Math.cos(0); - let dig = (Math.PI / 5) * 4; - for (let i = 0; i < 5; i++) { - //画五角星的五条边 - let x = Math.sin(i * dig); - let y = Math.cos(i * dig); - context.lineTo(x * radius, y * radius); - } - context.closePath(); - context.stroke(); - context.fill(); - context.restore(); - } - }; - - export default chapter; - - - \ No newline at end of file diff --git a/src/utils/config.js b/src/utils/config.js new file mode 100644 index 0000000..9c1f849 --- /dev/null +++ b/src/utils/config.js @@ -0,0 +1,11 @@ +import { getConfig } from '@/api/config'; +export function get() { + getConfig() + .then(response => { + console.log(response) + localStorage.setItem('systemConfig', JSON.stringify(response.data)); + }) + .catch(error => { + console.error('Failed to fetch config:', error); + }); +} diff --git a/src/utils/configure.js b/src/utils/configure.js index b0396c2..e6274c3 100644 --- a/src/utils/configure.js +++ b/src/utils/configure.js @@ -1,80 +1,23 @@ -// 密码强度级别常量 -const STRENGTH_LEVELS = { - WEAK: 'weak', // 弱:一类字符 - MEDIUM: 'medium', // 中:两类字符 - STRONG: 'strong', // 强:三类字符 - VERY_STRONG: 'very-strong' // 非常强:四类字符 -} - -// 数据设置常量 -const DATA_SETTINGS = { - OPEN: true, // 开启 - CLOSE: false // 关闭 -} - // SM 配置 -const SM_CONFIG = { - SALT: '2cc0c5f9f1749f1632efa9f63e902323' // SM3 盐值(16 字节) +export const SM_CONFIG = { + SALT: '2cc0c5f9f1749f1632efa9f63e902323', // SM3 盐值(16 字节) + SM4_KEY: "78d1295afa99449b99d6f83820e6965c", // SM4 对称加密密钥 + SM4_SALT: "f555adf6c01d0ab0761e626a2dae34a2", + SM2_PUBLIC_KEY: 'your-public-key', // SM2 公钥 + SM2_PRIVATE_KEY: 'your-private-key' // SM2 私钥 } - // AES 配置 -const AES_CONFIG = { +export const AES_CONFIG = { AES_KEY: 'zhgd@bonus@zhgd@bonus@1234567890', // AES key值 AES_IV: '1234567812345678' // AES 偏移量 } -// 登录配置 -const LOGIN_CONFIG = { - CODE_PHONE_LOGIN: DATA_SETTINGS.CLOSE, // 手机号验证码登录(true:开启,false:关闭) - CODE_EMAIL_LOGIN: DATA_SETTINGS.OPEN,// 邮箱验证码登录(true:开启,false:关闭) - PHONE_LOGIN: DATA_SETTINGS.OPEN, // 手机号密码登录(true:开启,false:关闭) - EMAIL_LOGIN: DATA_SETTINGS.CLOSE // 邮箱密码登录(true:开启,false:关闭) -} -//注册配置 -const REGISTER_CONFIG = { - PHONE_REGISTER: DATA_SETTINGS.OPEN, // 手机号注册(true:开启,false:关闭) - EMAIL_REGISTER: DATA_SETTINGS.CLOSE // 邮箱注册(true:开启,false:关闭) +export function generateUUID() { + // 使用当前时间戳和随机数生成一个 UUID + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + const r = Math.random() * 16 | 0; // 生成随机数 + const v = c === 'x' ? r : (r & 0x3 | 0x8); // 根据 UUID 规范生成相应的值 + return v.toString(16); // 转换为十六进制 + }); } -// 配置设置 -const CONFIG = { - STRENGTH: STRENGTH_LEVELS.STRONG,//密码强度配置 - IS_OPEN_REGISTER: REGISTER_CONFIG.PHONE_REGISTER || REGISTER_CONFIG.EMAIL_REGISTER, // 是否开启注册 - IS_CODE_LOGIN: LOGIN_CONFIG.CODE_EMAIL_LOGIN || LOGIN_CONFIG.CODE_PHONE_LOGIN, // 是否开启短信登录 - // 数据设置 - dataSettings: { - integrityCheck: DATA_SETTINGS.OPEN, // 数据完整性校验(true:开启,false:关闭) - encryptRequest: DATA_SETTINGS.OPEN, // 数据传输加密(true:开启,false:关闭) - encryptResponse: DATA_SETTINGS.OPEN // 数据返回解密(true:开启,false:关闭) - } -} - -// 获取占位符文本的函数 -// 获取占位符文本的函数 -function getPlaceholderText() { - const loginOptions = [] - if (LOGIN_CONFIG.PHONE_LOGIN) loginOptions.push('手机号') - if (LOGIN_CONFIG.EMAIL_LOGIN) loginOptions.push('邮箱') - return `用户名${loginOptions.length ? '/' + loginOptions.join('/') : ''}` -} - -// 获取占位符文本的函数 -// 获取占位符文本的函数 -function getCodePlaceholderText() { - const loginOptions = [] - if (LOGIN_CONFIG.CODE_PHONE_LOGIN) loginOptions.push('手机号') - if (LOGIN_CONFIG.CODE_EMAIL_LOGIN) loginOptions.push('邮箱') - return loginOptions.length ? loginOptions.join('/') : '' -} - -module.exports = { - STRENGTH_LEVELS, - DATA_SETTINGS, - CONFIG, - SM_CONFIG, - AES_CONFIG, - LOGIN_CONFIG, - REGISTER_CONFIG, - getPlaceholderText, - getCodePlaceholderText -} diff --git a/src/utils/dict/Dict.js b/src/utils/dict/Dict.js index 8fb6ca0..9d5069f 100644 --- a/src/utils/dict/Dict.js +++ b/src/utils/dict/Dict.js @@ -1,5 +1,5 @@ import Vue from 'vue' -import { mergeRecursive } from "@/utils/ruoyi"; +import { mergeRecursive } from "@/utils/bonus"; import DictMeta from './DictMeta' import DictData from './DictData' @@ -77,7 +77,6 @@ function loadDict(dict, dictMeta) { dicts.forEach(d => { Vue.set(dict.label[type], d.value, d.label) }) - // console.log(dict) return dicts }) } diff --git a/src/utils/dict/DictMeta.js b/src/utils/dict/DictMeta.js index 9779daa..355483d 100644 --- a/src/utils/dict/DictMeta.js +++ b/src/utils/dict/DictMeta.js @@ -1,4 +1,4 @@ -import { mergeRecursive } from "@/utils/ruoyi"; +import { mergeRecursive } from "@/utils/bonus"; import DictOptions from './DictOptions' /** diff --git a/src/utils/dict/DictOptions.js b/src/utils/dict/DictOptions.js index 338a94e..76f6d93 100644 --- a/src/utils/dict/DictOptions.js +++ b/src/utils/dict/DictOptions.js @@ -1,4 +1,4 @@ -import { mergeRecursive } from "@/utils/ruoyi"; +import { mergeRecursive } from "@/utils/bonus"; import dictConverter from './DictConverter' export const options = { @@ -8,7 +8,6 @@ export const options = { * 字典请求,方法签名为function(dictMeta: DictMeta): Promise */ request: (dictMeta) => { - console.log(`load dict ${dictMeta.type}`) return Promise.resolve([]) }, /** diff --git a/src/utils/download.js b/src/utils/download.js new file mode 100644 index 0000000..aba2d53 --- /dev/null +++ b/src/utils/download.js @@ -0,0 +1,26 @@ +// 下载blob文件 +export const downloadFile = ({ fileData, fileType, fileName }) => { + const blob = new Blob([fileData], { + type: fileType + }) + const link = document.createElement('a') + link.href = URL.createObjectURL(blob) + link.download = fileName + link.style.display = 'none' + document.body.appendChild(link) + link.click() + URL.revokeObjectURL(link.href) + document.body.removeChild(link) +} + +// 通用a链接下载 +export const downloadFileByUrl = (url) => { + const link = document.createElement('a') + link.href = url + link.setAttribute('download', '') + link.style.display = 'none' + document.body.appendChild(link) + link.click() + URL.revokeObjectURL(link.href) + document.body.removeChild(link) +} diff --git a/src/utils/globalUrl.js b/src/utils/globalUrl.js deleted file mode 100644 index d82b573..0000000 --- a/src/utils/globalUrl.js +++ /dev/null @@ -1,26 +0,0 @@ - -// const qrUrl = 'http://192.168.0.14:21624/qrCode/qrCodePage?qrCode='; //测试 -// const qrUrl = 'http://112.29.103.165:21626/qrCode/qrCodePage?qrCode='; //重庆 -// const qrUrl = 'http://112.29.103.165:21624/qrCode/qrCodePage?qrCode='; //宁夏 -// const qrUrl = 'https://z.csgmall.com.cn/gl/qrCode/qrCodePage?qrCode='; //南网 - -// const qrUrl = process.env.NODE_ENV === 'production' ? 'http://192.168.0.14:18866/qrCode/qrCodePage?qrCode=' : 'http://192.168.0.14:21624/qrCode/qrCodePage?qrCode=' -let qrUrl = '' -const origin = window.location.origin -if (origin == 'http://112.29.103.165:21626') { - qrUrl = 'http://112.29.103.165:21626/qrCode/qrCodePage?qrCode=' -} else { - qrUrl = 'http://192.168.0.14:18866/qrCode/qrCodePage?qrCode=' -} - -export default { - qrUrl, -} - - - - - - - - diff --git a/src/utils/index.js b/src/utils/index.js index 4e65504..64e371e 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,16 +1,16 @@ -import { parseTime } from './ruoyi' +import { parseTime } from './bonus' /** * 表格时间格式化 */ export function formatDate(cellValue) { if (cellValue == null || cellValue == "") return ""; - var date = new Date(cellValue) + var date = new Date(cellValue) var year = date.getFullYear() var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 - var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() - var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() - var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds } @@ -330,7 +330,7 @@ export function makeMap(str, expectsLowerCase) { ? val => map[val.toLowerCase()] : val => map[val] } - + export const exportDefault = 'export default ' export const beautifierConf = { @@ -387,4 +387,4 @@ export function camelCase(str) { export function isNumberStr(str) { return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) } - + diff --git a/src/utils/jsencrypt copy.js b/src/utils/jsencrypt copy.js deleted file mode 100644 index 78d9523..0000000 --- a/src/utils/jsencrypt copy.js +++ /dev/null @@ -1,30 +0,0 @@ -import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' - -// 密钥对生成 http://web.chacuo.net/netrsakeypair - -const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + - 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' - -const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + - '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + - 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + - 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + - 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + - 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + - 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + - 'UP8iWi1Qw0Y=' - -// 加密 -export function encrypt(txt) { - const encryptor = new JSEncrypt() - encryptor.setPublicKey(publicKey) // 设置公钥 - return encryptor.encrypt(txt) // 对数据进行加密 -} - -// 解密 -export function decrypt(txt) { - const encryptor = new JSEncrypt() - encryptor.setPrivateKey(privateKey) // 设置私钥 - return encryptor.decrypt(txt) // 对数据进行解密 -} - diff --git a/src/utils/request.js b/src/utils/request.js index 71618ac..7d2be68 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -6,11 +6,10 @@ import errorCode from '@/utils/errorCode' import { tansParams, blobValidate } from '@/utils/bonus' import cache from '@/plugins/cache' import { saveAs } from 'file-saver' -import { encryptCBC, decryptCBC } from '@/utils/aescbc' -import { CONFIG } from '@/utils/configure' -import { hashWithSM3AndSalt } from '@/utils/sm' - -//let token = localStorage.getItem("tokens"); +import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm' +const systemConfig = JSON.parse(localStorage.getItem('systemConfig')) || { + requestConfig: { encryptRequest: false, checkIntegrity: false, encryptResponse: false } +}; let downloadLoadingInstance // 是否显示重新登录 @@ -40,11 +39,11 @@ service.interceptors.request.use(config => { // 设置请求头 //入参加密 - config.headers['encryptRequest'] = CONFIG.dataSettings.encryptRequest && encryptRequest ? 'true' : 'false' + config.headers['encryptRequest'] = systemConfig.requestConfig.encryptRequest && encryptRequest ? 'true' : 'false' // 数据完整性校验 - config.headers['checkIntegrity'] = CONFIG.dataSettings.integrityCheck && checkIntegrity ? 'true' : 'false' + config.headers['checkIntegrity'] = systemConfig.requestConfig.checkIntegrity && checkIntegrity ? 'true' : 'false' //回参是否加密 - config.headers['encryptResponse'] = CONFIG.dataSettings.encryptResponse && encryptResponse ? 'true' : 'false' + config.headers['encryptResponse'] = systemConfig.requestConfig.encryptResponse && encryptResponse ? 'true' : 'false' const isRepeatSubmit = repeatSubmit // 处理 Token @@ -52,21 +51,6 @@ service.interceptors.request.use(config => { config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义 token } - // // 处理 GET 请求 - // if (config.method === 'get' && config.params) { - // let params = tansParams(config.params).slice(0, -1) - // // 数据完整性校验 - // if (CONFIG.dataSettings.integrityCheck && checkIntegrity) { - // config.headers['Params-Hash'] = hashWithSM3AndSalt(params) - // } - // // 加密参数 - // if (CONFIG.dataSettings.encryptRequest && encryptRequest) { - // params = encryptCBC(params) - // } - // config.url = `${config.url}?${params}` - // config.params = {} - // } - // get请求映射params参数 if (config.method === 'get' && config.params) { let url = config.url + '?' + tansParams(config.params); @@ -78,15 +62,12 @@ service.interceptors.request.use(config => { if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { let data = typeof config.data === 'object' ? JSON.stringify(config.data) : config.data let contentType = config.headers['Content-Type'] - if (contentType.includes('application/json')) { - // 数据完整性校验 - if (CONFIG.dataSettings.integrityCheck && checkIntegrity) { - config.headers['Params-Hash'] = hashWithSM3AndSalt(data) - config.data = data - } + if (contentType.includes('application/json') && typeof data !== 'undefined') { // 加密数据 - if (CONFIG.dataSettings.encryptRequest && encryptRequest) { - config.data = encryptCBC(data) + if (systemConfig.requestConfig.encryptRequest && encryptRequest) { + console.log(data); + console.log(hashWithSM3AndSalt(data)); + config.data = encryptWithSM4(data+"|"+hashWithSM3AndSalt(data)) } } // 检查请求数据大小 @@ -115,8 +96,8 @@ service.interceptors.request.use(config => { // 响应拦截器 service.interceptors.response.use(res => { - if (res.headers.encryptresponse) { - res.data = JSON.parse(decryptCBC(res.data)) + if (res.headers.encryptresponse && !res.data.hasOwnProperty('code')) { + res.data = JSON.parse(decryptWithSM4(res.data)) } // 未设置状态码则默认成功状态 const code = res.data.code || 200 @@ -157,7 +138,6 @@ service.interceptors.response.use(res => { } }, error => { - console.log('err' + error) let { message } = error if (message == 'Network Error') { message = '后端接口连接异常' diff --git a/src/utils/sm.js b/src/utils/sm.js index 2bdc324..8ed7008 100644 --- a/src/utils/sm.js +++ b/src/utils/sm.js @@ -1,6 +1,9 @@ // src/utils/encryption.js -import sm3 from 'sm-crypto/src/sm3' +import { sm2, sm3, sm4 } from 'sm-crypto' +// 配置项,例如盐值、SM2 公私钥、SM4 密钥 import { SM_CONFIG } from './configure' +import SM4 from 'sm-crypto/src/sm4' +import { hexToArray } from 'sm-crypto/src/sm2/utils' // SM3 哈希 export function hashSM3(text) { @@ -15,3 +18,33 @@ export function hashWithSM3AndSalt(text) { // 使用 SM3 进行哈希 return hashSM3(textWithSalt) } + +// SM2 加密 +export function encryptWithSM2(text) { + // SM2 公钥加密 + return sm2.doEncrypt(text, SM_CONFIG.SM2_PUBLIC_KEY) +} + +// SM2 解密 +export function decryptWithSM2(encryptedText) { + // SM2 私钥解密 + return sm2.doDecrypt(encryptedText, SM_CONFIG.SM2_PRIVATE_KEY) +} +/** + * 加密函数 + * @param {string} plainText + * @returns {string} 加密后的密文(Hex 编码格式) + */ +export function encryptWithSM4(plainText) { + return sm4.encrypt(plainText, SM_CONFIG.SM4_KEY,{ mode: 'cbc', padding: 'pkcs#5',iv:SM_CONFIG.SM4_SALT}); +} + +/** + * 解密函数 + * @param {string} cipherText + * @returns {string} 解密后的明文 + */ +export function decryptWithSM4(cipherText){ + return SM4.decrypt(cipherText, SM_CONFIG.SM4_KEY,{ mode: 'cbc', padding: 'pkcs#5' ,iv:SM_CONFIG.SM4_SALT}); +} + diff --git a/src/utils/validate.js b/src/utils/validate.js index e5a1abc..1dca102 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,6 +1,4 @@ -import { CONFIG } from '@/utils/configure' -import passwordConfig from '@/utils/passwordConfig' - +const systemConfig = JSON.parse(localStorage.getItem('systemConfig')); /** * @param {string} path * @returns {Boolean} @@ -92,71 +90,12 @@ export function validPwd(value) { return reg.test(value) } -/** - * 弱:长度至少为8个字符。 - * 一般:长度至少为8个字符,并包含至少一种字符类型。 - * 强:长度至少为8个字符,并包含至少两种字符类型。 - * 非常强:长度至少为8个字符,并包含所有四种字符类型。 - * @param rule - * @param value - * @param callback - * @returns {*} - */ - -export function validatePassword(rule, value, callback) { - if (!value) { - return callback(new Error('请输入密码')) - } - - const lengthRegex = /^.{8,20}$/ - const uppercaseRegex = /[A-Z]/ - const lowercaseRegex = /[a-z]/ - const digitRegex = /\d/ - const specialCharRegex = /[!@#$%^&*(),.?":{}|<>]/ - - if (!lengthRegex.test(value)) { - return callback(new Error('密码长度必须为8到20位')) - } - - const checks = [ - { regex: uppercaseRegex, message: '必须包含至少一个大写字母' }, - { regex: lowercaseRegex, message: '必须包含至少一个小写字母' }, - { regex: digitRegex, message: '必须包含至少一个数字' }, - { regex: specialCharRegex, message: '必须包含至少一个特殊字符' } - ] - - let passedChecks = checks.filter(check => check.regex.test(value)).length - - let requiredChecks - switch (CONFIG.STRENGTH) { - case 'weak': - requiredChecks = 1 - break - case 'medium': - requiredChecks = 2 - break - case 'strong': - requiredChecks = 3 - break - case 'very-strong': - requiredChecks = 4 - break - default: - return callback(new Error('请选择有效的密码强度')) - } - - if (passedChecks < requiredChecks) { - return callback(new Error(`密码至少包含 ${requiredChecks} 类字符(大写字母,小写字母,数字,特殊字符)`)) - } - callback() -} - export function validateNewPassword(rule, value, callback) { // 使用配置文件中的策略进行验证 // 1. 检查密码长度 - if (value.length < passwordConfig.minLength || value.length > passwordConfig.maxLength) { - callback(new Error('密码长度应为' + passwordConfig.minLength + '至' + passwordConfig.maxLength + '位!')) + if (value.length < systemConfig.passwordConfig.minLength || value.length > systemConfig.passwordConfig.maxLength) { + callback(new Error('密码长度应为' + systemConfig.passwordConfig.minLength + '至' + systemConfig.passwordConfig.maxLength + '位!')) return } @@ -166,46 +105,113 @@ export function validateNewPassword(rule, value, callback) { const hasDigit = /\d/.test(value) const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value) - if (passwordConfig.requireUpperCase && !hasUpperCase) { + if (systemConfig.passwordConfig.requireUpperCase && !hasUpperCase) { callback(new Error('密码必须包含大写字母!')) return } - if (passwordConfig.requireLowerCase && !hasLowerCase) { + if (systemConfig.passwordConfig.requireLowerCase && !hasLowerCase) { callback(new Error('密码必须包含小写字母!')) return } - if (passwordConfig.requireDigit && !hasDigit) { + if (systemConfig.passwordConfig.requireDigit && !hasDigit) { callback(new Error('密码必须包含数字!')) return } - if (passwordConfig.requireSpecialChar && !hasSpecialChar) { + if (systemConfig.passwordConfig.requireSpecialChar && !hasSpecialChar) { callback(new Error('密码必须包含特殊字符!')) return } // 3. 检查是否包含弱密码 - for (const weakPwd of passwordConfig.weakPasswords) { - if (value.includes(weakPwd)) { + for (const weakPwd of systemConfig.passwordConfig.weakPasswords) { + // 将密码和弱密码都转换为小写进行比较 + if (value.toLowerCase().includes(weakPwd.toLowerCase())) { callback(new Error(`密码包含常见的弱密码片段: ${weakPwd}`)) return } } // 4. 检查是否包含超过规定数量的连续字符 - if (passwordConfig.restrictConsecutiveChars && containsConsecutiveCharacters(value, passwordConfig.maxConsecutiveChars)) { - callback(new Error(`密码不能包含超过${passwordConfig.maxConsecutiveChars}位连续字符!`)) + if (systemConfig.passwordConfig.restrictConsecutiveChars && containsConsecutiveCharacters(value, systemConfig.passwordConfig.maxConsecutiveChars)) { + callback(new Error(`密码不能包含超过${systemConfig.passwordConfig.maxConsecutiveChars}位连续字符!`)) return } callback() // 验证成功 } -function containsConsecutiveCharacters(password, maxConsecutive) { - let count = 1 - for (let i = 1; i < password.length; i++) { - if (password[i] === password[i - 1]) { - count++ - if (count > maxConsecutive) return true - } else { - count = 1 +/** + * 检查密码中是否包含超过 n 个连续相同字符、连续递增/递减的数字或字母(不区分大小写) + */ +function containsConsecutiveCharacters(password, n) { + // 检查连续相同字符 + n = n + 1; // 允许最多 n 个连续字符 + for (let i = 0; i <= password.length - n; i++) { + let consecutiveSameChar = true; + for (let j = 1; j < n; j++) { + if (password[i + j] !== password[i]) { + consecutiveSameChar = false; + break; + } + } + if (consecutiveSameChar) { + return true; // 包含超过 n 个连续相同字符 } } - return false + + // 检查连续递增或递减的数字 + for (let i = 0; i <= password.length - n; i++) { + let consecutiveIncreasing = true; + let consecutiveDecreasing = true; + for (let j = 1; j < n; j++) { + const currentChar = password[i]; + const nextChar = password[i + j]; + + // 检查数字递增或递减 + if (/\d/.test(currentChar) && /\d/.test(nextChar)) { + if (nextChar.charCodeAt(0) !== currentChar.charCodeAt(0) + j) { + consecutiveIncreasing = false; + } + if (nextChar.charCodeAt(0) !== currentChar.charCodeAt(0) - j) { + consecutiveDecreasing = false; + } + } else { + consecutiveIncreasing = false; + consecutiveDecreasing = false; + break; + } + } + if (consecutiveIncreasing || consecutiveDecreasing) { + return true; // 包含超过 n 个递增或递减的连续数字 + } + } + + // 检查连续递增或递减的字母(不区分大小写) + for (let i = 0; i <= password.length - n; i++) { + let consecutiveIncreasing = true; + let consecutiveDecreasing = true; + for (let j = 1; j < n; j++) { + const currentChar = password[i].toLowerCase(); // 转为小写 + const nextChar = password[i + j].toLowerCase(); // 转为小写 + + // 检查字母递增或递减 + if (/[a-zA-Z]/.test(currentChar) && /[a-zA-Z]/.test(nextChar)) { + if (nextChar.charCodeAt(0) !== currentChar.charCodeAt(0) + j) { + consecutiveIncreasing = false; + } + if (nextChar.charCodeAt(0) !== currentChar.charCodeAt(0) - j) { + consecutiveDecreasing = false; + } + } else { + consecutiveIncreasing = false; + consecutiveDecreasing = false; + break; + } + } + if (consecutiveIncreasing || consecutiveDecreasing) { + return true; // 包含超过 n 个递增或递减的连续字母 + } + } + + // 不包含连续相同字符、数字或字母序列 + return false; } + + diff --git a/src/views/Lines/index.vue b/src/views/Lines/index.vue index 7af4be2..d470981 100644 --- a/src/views/Lines/index.vue +++ b/src/views/Lines/index.vue @@ -272,7 +272,9 @@ export default { handelCloseSub(){ this.showProjSec = true this.showLefSec = false - this.renderAllProj() + setTimeout(()=>{ + this.getProjData() + },500) }, validForbid(value) { value = value.replace(/[`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g, '').replace(/\s/g, ""); return value; } diff --git a/src/views/Substation/index.vue b/src/views/Substation/index.vue index 0303199..f1a3716 100644 --- a/src/views/Substation/index.vue +++ b/src/views/Substation/index.vue @@ -188,6 +188,7 @@ export default { devNum: item.devNum, successNum: item.successNum, errorNum: item.errorNum, + devStatus: item.devStatus, itemStyle: { normal: { areaColor: '#7DDEFF' diff --git a/src/views/homePage/index.vue b/src/views/homePage/index.vue index 59f2268..52d21d0 100644 --- a/src/views/homePage/index.vue +++ b/src/views/homePage/index.vue @@ -222,6 +222,7 @@ export default { devNum: item.devNum, successNum: item.successNum, errorNum: item.errorNum, + devStatus: item.devStatus, itemStyle: { normal: { areaColor: '#7DDEFF',