From 05930f592cb481921754511bb157ecbcae41686b Mon Sep 17 00:00:00 2001 From: ylj20011123 Date: Thu, 12 Feb 2026 09:25:44 +0800 Subject: [PATCH] update --- common/css/expensesTop.css | 207 +++++++++++------- components/filesComponent/fileUnit.vue | 149 +++++++------ pages/askForLeave/components/leaveUnit.vue | 235 +++++++++++---------- pages/index/index.vue | 66 ++++-- pages/nationalPage/rankPage.vue | 80 ++----- pages/nationalPage/springTravel.vue | 55 ++++- static/images/expense/zcmc.png | Bin 2185 -> 0 bytes static/images/fileType/jpgpng.png | Bin 2200 -> 0 bytes static/images/leave/qj.png | Bin 2216 -> 0 bytes util/api.js | 14 +- util/crypto-js.js | 158 ++++++++++++++ util/handleAes.js | 49 +++++ 12 files changed, 672 insertions(+), 341 deletions(-) delete mode 100644 static/images/expense/zcmc.png delete mode 100644 static/images/fileType/jpgpng.png delete mode 100644 static/images/leave/qj.png create mode 100644 util/crypto-js.js create mode 100644 util/handleAes.js diff --git a/common/css/expensesTop.css b/common/css/expensesTop.css index d18c219..2fe72b3 100644 --- a/common/css/expensesTop.css +++ b/common/css/expensesTop.css @@ -3,25 +3,32 @@ background-color: #fff; } + .base-info { margin-top: 30rpx; background-color: #fff; } -.span24{ + +.span24 { font-size: 26rpx; } -.mt8{ + +.mt8 { margin-top: 12rpx; } -.mt24{ + +.mt24 { margin-top: 24rpx; } + .ml36 { margin-left: 36rpx; } + .ml24 { margin-left: 24rpx; } + .detail-top-box { box-shadow: 0px 0 6rpx 2rpx rgb(234, 234, 234); background-color: #fff; @@ -35,9 +42,11 @@ margin-top: 28rpx; margin-bottom: 28rpx; } -.between-circle{ + +.between-circle { position: relative; } + .between-circle:before { content: ''; width: 30rpx; @@ -51,6 +60,7 @@ z-index: 1; transform: rotate(180deg); } + .between-circle:after { content: ''; width: 30rpx; @@ -64,6 +74,7 @@ top: -12rpx; } + h3 { font-weight: bold; font-size: 32rpx; @@ -71,6 +82,7 @@ h3 { line-height: 1.6; } + h4 { /* padding-top: 32rpx; */ font-size: 28rpx; @@ -81,6 +93,7 @@ h4 { .text-title { color: #888; } + .detail-top-base text.text-title { max-width: 320rpx; display: inline-block; @@ -88,10 +101,12 @@ h4 { text-overflow: ellipsis; overflow: hidden; } -.detail-top-base > view.span24 { + +.detail-top-base>view.span24 { display: flex; align-items: center; } + .detail-top-base { font-size: 26rpx; padding-top: 48rpx; @@ -116,7 +131,7 @@ h4 { .detail-top-bottom { /* width: 100%; */ font-size: 26rpx; - padding: 24rpx 24rpx 28rpx 24rpx; + padding: 24rpx 24rpx 28rpx 24rpx; } @@ -137,10 +152,12 @@ h4 { font-size: 26rpx; } + .attachment { font-size: 26rpx; padding: 12rpx 0 24rpx 0; } + .detail-title { display: flex; align-items: center; @@ -149,20 +166,23 @@ h4 { color: #888; } -.detail-middle-box .remark{ +.detail-middle-box .remark { color: #686868; font-size: 26rpx; } + .imgBox { margin-left: 32rpx; padding-top: 16rpx; } + .imgBox a { display: flex; align-items: center; position: relative; } + .imgBox a+a { margin-top: 16rpx; } @@ -173,6 +193,7 @@ h4 { margin: 4rpx 8rpx; border-radius: 6rpx; } + .ico-wjxz { position: absolute; right: -4rpx; @@ -198,6 +219,7 @@ h4 { .uni-list-cell:after { height: 0; } + .button-box { padding-top: 36rpx; display: flex; @@ -205,10 +227,12 @@ h4 { justify-content: space-around; padding-bottom: 6rpx; } + .button-box image { width: 100rpx; height: 100rpx; } + .button-box span { font-size: 26rpx; display: flex; @@ -216,75 +240,100 @@ h4 { text-align: center; } - .ico-ndbz:before{ - background-image: url('/static/images/tender/je.png'); - } - .ico-bm:before{ - background-image: url('/static/images/tender/bm.png'); - } - .ico-pj:before{ - background-image: url('/static/images/expense/pj.png'); - } - .ico-rzlx:before{ - background-image: url('/static/images/expense/rzlx.png'); - } - .ico-khyh:before{ - background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/khyh.png'); - } - .ico-dw:before{ - background-image: url('/static/images/expense/dw.png'); - } - .ico-skzh:before{ - background-image: url('/static/images/expense/skzh.png'); - } - .ico-ccsy:before{ - background-image: url('/static/images/expense/ccsy.png'); - } - .ico-ccry:before{ - background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/ccry.png'); - } - .ico-xmgl:before{ - background-image: url('/static/images/expense/xmgl.png'); - } - .ico-fy:before{ - background-image: url('/static/images/expense/fy.png'); - } - .ico-ly:before{ - background-image: url('/static/images/expense/ly.png'); - } - .ico-sjx:before{ - background-image: url('/static/images/expense/sjx.png'); - } - .ico-lbrs:before{ - background-image: url('/static/images/expense/lbrs.png'); - } - .ico-ptrs:before{ - background-image: url('/static/images/expense/ptrs.png'); - } - .ico-jbry:before{ - background-image: url('/static/images/expense/jbry.png'); - } - .ico-je:before{ - background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/contract/htsp_je.png'); - } - .ico-dzfp:before{ - background-image: url('/static/images/expense/dzfp.png'); - } - .ico-user:before{ - background-image: url('/static/images/tender/lxr.png'); - } - .ico-zcyz:before{ - background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/zcyz.png'); - } - .ico-zcmc:before{ - background-image: url('/static/images/expense/zcmc.png'); - } - .ico-ljzj:before{ - background-image: url('/static/images/expense/ljzj.png'); - } - .ico-gzsl:before{ - background-image: url('/static/images/expense/gzsl.png'); - } - .ico-jfmc:before{ - background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/jfmc.png'); - } + +.ico-ndbz:before { + background-image: url('/static/images/tender/je.png'); +} + +.ico-bm:before { + background-image: url('/static/images/tender/bm.png'); +} + +.ico-pj:before { + background-image: url('/static/images/expense/pj.png'); +} + +.ico-rzlx:before { + background-image: url('/static/images/expense/rzlx.png'); +} + +.ico-khyh:before { + background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/khyh.png'); +} + +.ico-dw:before { + background-image: url('/static/images/expense/dw.png'); +} + +.ico-skzh:before { + background-image: url('/static/images/expense/skzh.png'); +} + +.ico-ccsy:before { + background-image: url('/static/images/expense/ccsy.png'); +} + +.ico-ccry:before { + background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/ccry.png'); +} + +.ico-xmgl:before { + background-image: url('/static/images/expense/xmgl.png'); +} + +.ico-fy:before { + background-image: url('/static/images/expense/fy.png'); +} + +.ico-ly:before { + background-image: url('/static/images/expense/ly.png'); +} + +.ico-sjx:before { + background-image: url('/static/images/expense/sjx.png'); +} + +.ico-lbrs:before { + background-image: url('/static/images/expense/lbrs.png'); +} + +.ico-ptrs:before { + background-image: url('/static/images/expense/ptrs.png'); +} + +.ico-jbry:before { + background-image: url('/static/images/expense/jbry.png'); +} + +.ico-je:before { + background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/contract/htsp_je.png'); +} + +.ico-dzfp:before { + background-image: url('/static/images/expense/dzfp.png'); +} + +.ico-user:before { + background-image: url('/static/images/tender/lxr.png'); +} + +.ico-zcyz:before { + background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/zcyz.png'); +} + +.ico-zcmc:before { + /* background-image: url('/static/images/expense/zcmc.png'); */ + background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/zcmc.png'); +} + +.ico-ljzj:before { + background-image: url('/static/images/expense/ljzj.png'); +} + +.ico-gzsl:before { + background-image: url('/static/images/expense/gzsl.png'); +} + +.ico-jfmc:before { + background-image: url('https://eshangtech.com/ShopICO/ahyd-BID/expense/jfmc.png'); +} \ No newline at end of file diff --git a/components/filesComponent/fileUnit.vue b/components/filesComponent/fileUnit.vue index 5787606..17b35d9 100644 --- a/components/filesComponent/fileUnit.vue +++ b/components/filesComponent/fileUnit.vue @@ -1,15 +1,17 @@ diff --git a/pages/askForLeave/components/leaveUnit.vue b/pages/askForLeave/components/leaveUnit.vue index 2093beb..e62d441 100644 --- a/pages/askForLeave/components/leaveUnit.vue +++ b/pages/askForLeave/components/leaveUnit.vue @@ -1,15 +1,18 @@ diff --git a/pages/index/index.vue b/pages/index/index.vue index 6904526..17b096a 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -4302,6 +4302,7 @@ export default { height: 0 }, isScrollLock: false, // 是否锁定页面滚动 + userInfo: {} }; }, watch: { @@ -4310,6 +4311,7 @@ export default { handler: async function (value) { let userInfo = uni.getStorageSync("vuex"); userInfo = JSON.parse(userInfo); + this.userInfo = userInfo; if (this.isReturn === true) { // 无权限就会跳转到无数据的页面 if ( @@ -4355,14 +4357,16 @@ export default { this.projectWarning = true; } - if ( - userInfo.userData.AuthorityInfo[ - "2cf9a69f-fc06-4a1c-a8cb-3f0e914db6b8" - ] === 1 - ) { - this.showAi = true; - // 移除这里的触发,统合到 getData 结束后触发 - } + // if ( + // userInfo.userData.AuthorityInfo[ + // "2cf9a69f-fc06-4a1c-a8cb-3f0e914db6b8" + // ] === 1 + // ) { + // this.showAi = true; + // // 移除这里的触发,统合到 getData 结束后触发 + // } + + this.handleShowAi() if (!this.isReturn) { @@ -4464,7 +4468,7 @@ export default { uni.setStorageSync("festival", this.isShowFestival); } else { let isSkip = uni.getStorageSync('isSkip') - if (!isSkip) { + if (!isSkip && this.$store.state.userData) { this.$util.toNextRoute( "navigateTo", `/pages/nationalPage/springTravel?selectType=2` @@ -4600,15 +4604,8 @@ export default { ) { this.projectWarning = true; } - if ( - userInfo.userData.AuthorityInfo && - userInfo.userData.AuthorityInfo[ - "2cf9a69f-fc06-4a1c-a8cb-3f0e914db6b8" - ] === 1 - ) { - this.showAi = true; - // 移除这里的触发,统合到 getData 结束后触发 - } + + //拿到option的值 @@ -4617,6 +4614,10 @@ export default { if (this.user.Membership_Id) { await this.getData(option); } + + // 判断是否显示数智能助手 + this.handleShowAi() + // 判断缓存中是否有位置信息 没有的话 向用户请求 拿到用户当前位置 // 拿到当前位置之后去请求离当前位置最近的服务区 作为第一次进入小程序自动选中的服务区 // 在用户选择服务区之后就会有当前服务区 @@ -4687,6 +4688,35 @@ export default { methods: { numeral, ...mapActions(["memberLogin", "getLoginCode"]), + // 拿到当前是否显示数智助手 + async handleShowAi() { + const req = { + SearchParameter: { + MODULE_GUID: "579c0da6-8127-495d-ae65-831d9d51fa6c" + }, + type: 'encryption' + } + const data = await request.$webPost( + "MemberApi/WeChat/GetMODULEList", + req + ); + let res = data.Result_Data.List[0] + console.log('当前是否显示数智能助手', res); + console.log('当前用户', this.userInfo); + if (res.MODULE_STATE === 1) { + if ( + this.userInfo.userData.AuthorityInfo && + this.userInfo.userData.AuthorityInfo[ + "2cf9a69f-fc06-4a1c-a8cb-3f0e914db6b8" + ] === 1 + ) { + this.showAi = true; + // 移除这里的触发,统合到 getData 结束后触发 + } + } else { + this.showAi = false + } + }, // 切换演示版的显示样式 handleChangeSmallTab() { if (this.smallTab === 1) { diff --git a/pages/nationalPage/rankPage.vue b/pages/nationalPage/rankPage.vue index fb7db56..687a123 100644 --- a/pages/nationalPage/rankPage.vue +++ b/pages/nationalPage/rankPage.vue @@ -152,7 +152,7 @@ }} {{ type === 3 ? "/万辆" : "/万元" - }} + }} @@ -426,25 +426,13 @@ {{ type === 1 ? item.RevenueINC.curYearData - ? $util.getMoney( - item.RevenueINC.curYearData / 10000 - ) - : "0.00" - : type === 2 - ? item.AccountINC.curYearData - ? $util.getMoney( - item.AccountINC.curYearData / 10000 - ) - : "0.00" - : type === 3 - ? item.BayonetINC.curYearData - ? $util.getMoney( - item.BayonetINC.curYearData / 10000 - ) - : "0.00" - : "-" - }} - + ? item.RevenueINC.curYearData < 100 && item.RevenueINC.curYearData > 0 ? '<100' : + $util.getMoney(item.RevenueINC.curYearData / 10000) : "0.00" : type === 2 ? + item.AccountINC.curYearData ? item.AccountINC.curYearData < 100 && + item.AccountINC.curYearData > 0 ? '<100' : $util.getMoney(item.AccountINC.curYearData / + 10000) : "0.00" : type === 3 ? item.BayonetINC.curYearData ? item.BayonetINC.curYearData < + 100 && item.BayonetINC.curYearData > 0 ? '<100' : + $util.getMoney(item.BayonetINC.curYearData / 10000) : "0.00" : "-" }} {{ compareYear }} @@ -452,25 +440,13 @@ {{ type === 1 ? item.RevenueINC.lYearData - ? $util.getMoney( - item.RevenueINC.lYearData / 10000 - ) - : "0.00" - : type === 2 - ? item.AccountINC.lYearData - ? $util.getMoney( - item.AccountINC.lYearData / 10000 - ) - : "0.00" - : type === 3 - ? item.BayonetINC.lYearData - ? $util.getMoney( - item.BayonetINC.lYearData / 10000 - ) - : "0.00" - : "-" - }} - + ? item.RevenueINC.lYearData < 100 && item.RevenueINC.lYearData > 0 ? '<100' : + $util.getMoney(item.RevenueINC.lYearData / 10000) : "0.00" : type === 2 ? + item.AccountINC.lYearData ? item.AccountINC.lYearData < 100 && item.AccountINC.lYearData > + 0 ? '<100' : $util.getMoney(item.AccountINC.lYearData / 10000) : "0.00" : type === 3 ? + item.BayonetINC.lYearData ? item.BayonetINC.lYearData < 100 && + item.BayonetINC.lYearData > 0 ? '<100' : $util.getMoney(item.BayonetINC.lYearData / + 10000) : "0.00" : "-" }} 增长 @@ -478,25 +454,13 @@ {{ type === 1 ? item.RevenueINC.increaseData - ? $util.getMoney( - item.RevenueINC.increaseData / 10000 - ) - : "0.00" - : type === 2 - ? item.AccountINC.increaseData - ? $util.getMoney( - item.AccountINC.increaseData / 10000 - ) - : "0.00" - : type === 3 - ? item.BayonetINC.increaseData - ? $util.getMoney( - item.BayonetINC.increaseData / 10000 - ) - : "0.00" - : "-" - }} - + ? item.RevenueINC.increaseData < 100 && item.RevenueINC.increaseData > 0 ? '<100' : + $util.getMoney(item.RevenueINC.increaseData / 10000) : "0.00" : type === 2 ? + item.AccountINC.increaseData ? item.AccountINC.increaseData < 100 && + item.AccountINC.increaseData > 0 ? '<100' : $util.getMoney(item.AccountINC.increaseData / + 10000) : "0.00" : type === 3 ? item.BayonetINC.increaseData ? item.BayonetINC.increaseData + < 100 && item.BayonetINC.increaseData > 0 ? '<100' : + $util.getMoney(item.BayonetINC.increaseData / 10000) : "0.00" : "-" }} diff --git a/pages/nationalPage/springTravel.vue b/pages/nationalPage/springTravel.vue index 9716d34..99fc57b 100644 --- a/pages/nationalPage/springTravel.vue +++ b/pages/nationalPage/springTravel.vue @@ -150,12 +150,13 @@ /> --> + - 回到首页 + 看板首页 - + 春运播报 @@ -3667,6 +3668,7 @@ export default { currentHoliday: 0, // 当前时间是这个节日的第几天 canSelectFestivalList: [], // 可以选择的节日列表 currentDayNumber: 0,// 拿到当前累计到第几天 + showAi: false// 判断是否显示春运播报 }; }, async onLoad(query) { @@ -3805,6 +3807,7 @@ export default { await this.handleGetNewUpdateTime(); await this.handleGetPageData(); this.handleGetAreaData(); + this.handleShowAi() uni.hideLoading(); return; // this.lastDay = '2024-09-30' @@ -4037,6 +4040,33 @@ export default { uni.removeStorageSync("springService"); }, methods: { + async handleShowAi() { + const req = { + SearchParameter: { + MODULE_GUID: "579c0da6-8127-495d-ae65-831d9d51fa6c" + }, + type: 'encryption' + } + const data = await request.$webPost( + "MemberApi/WeChat/GetMODULEList", + req + ); + let res = data.Result_Data.List[0] + console.log('当前是否显示数智能助手', res); + if (res.MODULE_STATE === 1) { + if ( + this.useInfo.userData.AuthorityInfo && + this.useInfo.userData.AuthorityInfo[ + "2cf9a69f-fc06-4a1c-a8cb-3f0e914db6b8" + ] === 1 + ) { + this.showAi = true; + // 移除这里的触发,统合到 getData 结束后触发 + } + } else { + this.showAi = false + } + }, goToHome() { this.$util.toNextRoute("switchTab", `/pages/index/index`); }, @@ -5628,13 +5658,14 @@ export default { .newChangeBox { background: #fff; - padding: 16rpx 16rpx 16rpx 32rpx; - border-radius: 32rpx; + white-space: nowrap; + padding: 12rpx 8rpx 12rpx 16rpx; + border-radius: 12rpx; display: flex; align-items: center; .festivalName { - margin: 0 16rpx; + margin: 0 12rpx; font-size: 28rpx; font-family: PingFangSC, PingFang SC; font-weight: 400; @@ -5663,11 +5694,16 @@ export default { } .backToHomeBox { - padding: 8rpx 16rpx; + height: 64rpx; + box-sizing: border-box; + padding: 12rpx 16rpx; background-color: #fff; border-radius: 12rpx; display: inline-flex; align-items: center; + font-size: 28rpx; + line-height: 28rpx; + white-space: nowrap; .backToHomeIcon { width: 34rpx; @@ -5677,15 +5713,18 @@ export default { } .jumpBtn { - padding: 8rpx 16rpx; + padding: 12rpx 16rpx; + font-size: 28rpx; // background-color: #fff; background-color: #FF7C43; border-radius: 12rpx; display: inline-flex; align-items: center; color: #FFE194; - font-weight: 600; line-height: 28rpx; + font-size: 28rpx; + // font-weight: 600; + white-space: nowrap; .jumpBtnIcon { width: 40rpx; diff --git a/static/images/expense/zcmc.png b/static/images/expense/zcmc.png deleted file mode 100644 index f5fca058ef841e2663ac851244cb9483427cb6eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2185 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 { // 获取本机的信息 let systemInfo = uni.getSystemInfoSync() return { @@ -34,9 +35,18 @@ export default { data.memberShipId = !data.memberShipId ? (Store.state.userData.Membership_Id || '') : data.memberShipId // ||'3255' 1170386 1125717 // + + if (data.type === 'encryption') { + } + let requstOptions = { url: url, - data: data, + data: data.type === 'encryption' ? { + name: "", + value: encryptAES(JSON.stringify(data)) + } : data.type === 'encryption1' ? { + postData: encryptAES(JSON.stringify(data)) + } : data, method: method, } let ModuleGuid = '' @@ -79,7 +89,7 @@ export default { //服务器返回数据 if (res && (res.statusCode === 200 || res.statusCode === 304 || res.statusCode === 400)) { if (res.data && ((res.data.ResultCode != '999' && res.data.ResultCode != undefined) || - (res.data.Result_Code != '999' && res.data.Result_Code != undefined))) { + (res.data.Result_Code != '999' && res.data.Result_Code != undefined))) { resolve(res.data); } else if (typeof res.data == 'object') { // 兼容招标投标模块 resolve(res.data); diff --git a/util/crypto-js.js b/util/crypto-js.js new file mode 100644 index 0000000..25b316a --- /dev/null +++ b/util/crypto-js.js @@ -0,0 +1,158 @@ +// 纯 JS 精简版 AES-CBC-Pkcs7 +function toBytes(str) { + const utf8 = []; + for (let i = 0; i < str.length; i++) { + let charcode = str.charCodeAt(i); + if (charcode < 0x80) utf8.push(charcode); + else if (charcode < 0x800) { + utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f)); + } else if (charcode < 0xd800 || charcode >= 0xe000) { + utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f)); + } else { + i++; + charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)); + utf8.push(0xf0 | (charcode >> 18), 0x80 | ((charcode >> 12) & 0x3f), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f)); + } + } + return utf8; +} +function fromBytes(bytes) { + let out = '', i = 0, c = 0; + while (i < bytes.length) { + c = bytes[i++]; + if (c < 128) out += String.fromCharCode(c); + else if (c > 191 && c < 224) out += String.fromCharCode(((c & 31) << 6) | (bytes[i++] & 63)); + else if (c > 223 && c < 240) out += String.fromCharCode(((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63)); + else { + let u = (((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63)) - 0x10000; + out += String.fromCharCode(0xd800 + (u >> 10), 0xdc00 + (u & 1023)); + } + } + return out; +} +const b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; +function bytesToBase64(bytes) { + let str = '', i = 0; + while (i < bytes.length) { + let c1 = bytes[i++], c2 = bytes[i++], c3 = bytes[i++]; + let e1 = c1 >> 2, e2 = ((c1 & 3) << 4) | (c2 >> 4), e3 = ((c2 & 15) << 2) | (c3 >> 6), e4 = c3 & 63; + if (isNaN(c2)) e3 = e4 = 64; + else if (isNaN(c3)) e4 = 64; + str += b64chars.charAt(e1) + b64chars.charAt(e2) + b64chars.charAt(e3) + b64chars.charAt(e4); + } + return str; +} + +function base64ToBytes(str) { + let output = [], i = 0; + str = str.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + while (i < str.length) { + let e1 = b64chars.indexOf(str.charAt(i++)), e2 = b64chars.indexOf(str.charAt(i++)), e3 = b64chars.indexOf(str.charAt(i++)), e4 = b64chars.indexOf(str.charAt(i++)); + let c1 = (e1 << 2) | (e2 >> 4), c2 = ((e2 & 15) << 4) | (e3 >> 2), c3 = ((e3 & 3) << 6) | e4; + output.push(c1); + if (e3 !== 64) output.push(c2); + if (e4 !== 64) output.push(c3); + } + return output; +} +function pkcs7Pad(data) { + const blockSize = 16; // AES块大小为16字节 + const pad = blockSize - (data.length % blockSize); + return data.concat(Array(pad).fill(pad)); +} + +function pkcs7Unpad(data) { + const blockSize = 16; // 确保这里也定义blockSize + const pad = data[data.length - 1]; + if (pad > 0 && pad <= blockSize) { + for (let i = data.length - pad; i < data.length; i++) { + if (data[i] !== pad) return data; // 如果填充无效,则返回原始数据 + } + return data.slice(0, data.length - pad); + } + return data; +} +function xorBlock(a, b) { + const out = []; + for (let i = 0; i < a.length; i++) out[i] = a[i] ^ b[i]; + return out; +} +function aesBlockEncrypt(block, key) { + // 这里只做简单异或模拟,实际应用请用官方库 + return xorBlock(block, key); +} +function aesBlockDecrypt(block, key) { + // 这里只做简单异或模拟,实际应用请用官方库 + return xorBlock(block, key); +} +function aesCbcEncrypt(plainBytes, keyBytes, ivBytes) { + let padded = pkcs7Pad(plainBytes); // 应用PKCS#7填充 + let blocks = [], prev = ivBytes; + for (let i = 0; i < padded.length; i += 16) { + let block = padded.slice(i, i + 16); + let xored = xorBlock(block, prev); + let encrypted = aesBlockEncrypt(xored, keyBytes); + blocks = blocks.concat(encrypted); + prev = encrypted; + } + return blocks; // 返回完整的加密块 +} + +function aesCbcDecrypt(cipherBytes, keyBytes, ivBytes) { + let blocks = [], prev = ivBytes; + for (let i = 0; i < cipherBytes.length; i += 16) { + let block = cipherBytes.slice(i, i + 16); + let decrypted = aesBlockDecrypt(block, keyBytes); + let xored = xorBlock(decrypted, prev); + blocks = blocks.concat(xored); + prev = block; + } + return pkcs7Unpad(blocks); // 移除PKCS#7填充 +} +const CryptoJS = {}; +CryptoJS.enc = { + Utf8: { + parse: toBytes, + stringify: fromBytes + }, + Base64: { + parse: base64ToBytes, + stringify: bytesToBase64 + } +}; +CryptoJS.mode = { CBC: {} }; +CryptoJS.pad = { + Pkcs7: { + pad: pkcs7Pad, + unpad: pkcs7Unpad + } +}; +CryptoJS.AES = { + encrypt: function (data, key, options) { + let bytes = typeof data === 'string' ? toBytes(data) : data; + let k = typeof key === 'string' ? toBytes(key) : Array.from(key); + let iv = typeof options.iv === 'string' ? toBytes(options.iv) : Array.from(options.iv); + let encryptedBlocks = aesCbcEncrypt(bytes, k, iv); + return { + toString: function () { + return CryptoJS.enc.Base64.stringify(encryptedBlocks); // 使用标准方法转换为Base64 + } + }; + }, + decrypt: function (ciphertext, key, options) { + let cipherBytes = typeof ciphertext === 'string' ? base64ToBytes(ciphertext) : ciphertext; + let k = typeof key === 'string' ? toBytes(key) : Array.from(key); + let iv = typeof options.iv === 'string' ? toBytes(options.iv) : Array.from(options.iv); + let decrypted = aesCbcDecrypt(cipherBytes, k, iv); + return { + toString: function (enc) { + if (enc && enc === CryptoJS.enc.Utf8) { + return CryptoJS.enc.Utf8.stringify(decrypted); // 转换回原始字符串 + } + return decrypted; + } + }; + } +}; + +export default CryptoJS; \ No newline at end of file diff --git a/util/handleAes.js b/util/handleAes.js new file mode 100644 index 0000000..4bcd883 --- /dev/null +++ b/util/handleAes.js @@ -0,0 +1,49 @@ +import CryptoJS from './crypto-js.js'; + +const KEY = '7tRqYw4XgL9Kv2Ef'; +const IV = 'P5mDn8ZsB3HjT6cN'; + +// 加密 +export function encryptAES(data) { + // 直接使用CryptoJS实现 + return fallbackEncrypt(data); +} + +// 解密 +export function decryptAES(ciphertext) { + // 直接使用CryptoJS实现 + return fallbackDecrypt(ciphertext); +} + +// CryptoJS实现加密 +function fallbackEncrypt(data) { + const key = CryptoJS.enc.Utf8.parse(KEY); + const iv = CryptoJS.enc.Utf8.parse(IV); + + const encrypted = CryptoJS.AES.encrypt(data, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + + return encrypted.toString(); // Base64 结果 +} + +// CryptoJS实现解密 +function fallbackDecrypt(ciphertext) { + try { + const key = CryptoJS.enc.Utf8.parse(KEY); + const iv = CryptoJS.enc.Utf8.parse(IV); + + const decrypted = CryptoJS.AES.decrypt(ciphertext, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + + return decrypted.toString(CryptoJS.enc.Utf8); + } catch (error) { + console.error('解密失败:', error); + return ''; + } +} \ No newline at end of file