fix: decrypt

This commit is contained in:
zzc
2025-05-05 18:14:22 +08:00
parent 496a0cce52
commit 36ad546e99
13 changed files with 8815 additions and 6561 deletions

1
.env.development Normal file
View File

@@ -0,0 +1 @@
VUE_APP_API_BASE_URL=https://apis.lihailezzc.com

1
.env.production Normal file
View File

@@ -0,0 +1 @@
VUE_APP_API_BASE_URL=https://apis.lihailezzc.com

34
Dockerfile Normal file
View File

@@ -0,0 +1,34 @@
# 1⃣ 构建阶段
FROM node:18 AS build
# 设置工作目录
WORKDIR /app
# 拷贝 package.json 并安装依赖(可利用缓存)
COPY package*.json ./
COPY . .
ENV CI=true
ENV NODE_OPTIONS=--openssl-legacy-provider
RUN npm install pnpm -g
RUN pnpm install --force
# 拷贝全部代码并构建
RUN pnpm run build
# 2⃣ 生产部署阶段(用 nginx 托管)
FROM nginx:alpine
# 拷贝构建好的 dist 到 nginx 的 html 目录
COPY --from=build /app/dist /usr/share/nginx/html
# 拷贝自定义 nginx 配置(可选)
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 默认端口
EXPOSE 80
# 启动 nginx
CMD ["nginx", "-g", "daemon off;"]

11
nginx.conf Normal file
View File

@@ -0,0 +1,11 @@
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}

View File

@@ -5,8 +5,8 @@
"participants": [],
"homepage": "https://vuejs-core.cn",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"serve": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
"build": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
"serve:node20": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
"build:node20": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
"serve:mac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
@@ -43,6 +43,7 @@
"layouts": "file:layouts",
"lodash": "^4.17.21",
"mockjs": "^1.1.0",
"node-forge": "^1.3.1",
"nprogress": "^0.2.0",
"qs": "^6.14.0",
"quill": "^2.0.3",

15185
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,9 +2,7 @@
* @description 导出默认网路配置
**/
const network = {
// 默认的接口地址 如果是开发环境和生产环境走vab-mock-server当然你也可以选择自己配置成需要的接口地址
baseURL: process.env.NODE_ENV === 'development' ? 'http://127.0.0.1:3999' : 'http://127.0.0.1:3999',
//配后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8
baseURL: process.env.VUE_APP_API_BASE_URL,
contentType: 'application/json;charset=UTF-8',
//消息框消失时间
messageDuration: 3000,

View File

@@ -1,5 +1,6 @@
import JSEncrypt from 'jsencrypt'
import { getPublicKey } from '@/api/publicKey'
import forge from 'node-forge'
const privateKey =
'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMFPa+v52FkSUXvcUnrGI/XzW3EpZRI0s9BCWJ3oNQmEYA5luWW5p8h0uadTIoTyYweFPdH4hveyxlwmS7oefvbIdiP+o+QIYW/R4Wjsb4Yl8MhR4PJqUE3RCy6IT9fM8ckG4kN9ECs6Ja8fQFc6/mSl5dJczzJO3k1rWMBhKJD/AgMBAAECgYEAucMakH9dWeryhrYoRHcXo4giPVJsH9ypVt4KzmOQY/7jV7KFQK3x//27UoHfUCak51sxFw9ek7UmTPM4HjikA9LkYeE7S381b4QRvFuf3L6IbMP3ywJnJ8pPr2l5SqQ00W+oKv+w/VmEsyUHr+k4Z+4ik+FheTkVWp566WbqFsECQQDjYaMcaKw3j2Zecl8T6eUe7fdaRMIzp/gcpPMfT/9rDzIQk+7ORvm1NI9AUmFv/FAlfpuAMrdL2n7p9uznWb7RAkEA2aP934kbXg5bdV0R313MrL+7WTK/qdcYxATUbMsMuWWQBoS5irrt80WCZbG48hpocJavLNjbtrjmUX3CuJBmzwJAOJg8uP10n/+ZQzjEYXh+BszEHDuw+pp8LuT/fnOy5zrJA0dO0RjpXijO3vuiNPVgHXT9z1LQPJkNrb5ACPVVgQJBALPeb4uV0bNrJDUb5RB4ghZnIxv18CcaqNIft7vuGCcFBAIPIRTBprR+RuVq+xHDt3sNXdsvom4h49+Hky1b0ksCQBBwUtVaqH6ztCtwUF1j2c/Zcrt5P/uN7IHAd44K0gIJc1+Csr3qPG+G2yoqRM8KVqLI8Z2ZYn9c+AvEE+L9OQY='
@@ -10,24 +11,93 @@ const privateKey =
* @param data
* @returns {Promise<{param: PromiseLike<ArrayBuffer>}|*>}
*/
// export async function encryptedData(data) {
// let publicKey = ''
// const res = await getPublicKey()
// publicKey = res.data.publicKey
// if (res.data.mockServer) {
// publicKey = ''
// }
// if (publicKey == '') {
// return data
// }
// const encrypt = new JSEncrypt()
// encrypt.setPublicKey(`-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`)
// data = encrypt.encrypt(JSON.stringify(data))
// return {
// param: data,
// }
// }
export async function encryptedData(data) {
let publicKey = ''
const res = await getPublicKey()
publicKey = res.data.publicKey
if (res.data.mockServer) {
publicKey = ''
}
if (publicKey == '') {
let publicKey = res.data.publicKey
if (res.data.mockServer || !publicKey) {
return data
}
const encrypt = new JSEncrypt()
encrypt.setPublicKey(`-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`)
data = encrypt.encrypt(JSON.stringify(data))
const pem = `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`
const forgePublicKey = forge.pki.publicKeyFromPem(pem)
const encrypted = forgePublicKey.encrypt(JSON.stringify(data), 'RSA-OAEP', {
md: forge.md.sha256.create(), // OAEP + SHA-256
})
return {
param: data,
param: forge.util.encode64(encrypted),
}
}
// export async function encryptedData(data) {
// const res = await getPublicKey()
// let publicKey = res.data.publicKey
// if (res.data.mockServer || !publicKey) {
// return data
// }
// // 构造 PEM 格式
// publicKey = `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`
// // 将 PEM 公钥导入为 CryptoKey
// const importedKey = await importPublicKey(publicKey)
// // 加密数据
// const encodedData = new TextEncoder().encode(JSON.stringify(data))
// const encryptedBuffer = await crypto.subtle.encrypt(
// {
// name: 'RSA-OAEP',
// },
// importedKey,
// encodedData
// )
// // 转 Base64 字符串,方便传输
// const base64Encrypted = btoa(String.fromCharCode(...new Uint8Array(encryptedBuffer)))
// return { param: base64Encrypted }
// }
// // 把 PEM 格式公钥转换为 CryptoKey
// async function importPublicKey(pem) {
// const b64 = pem
// .replace(/-----BEGIN PUBLIC KEY-----/, '')
// .replace(/-----END PUBLIC KEY-----/, '')
// .replace(/\s/g, '')
// const binaryDer = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0))
// return crypto.subtle.importKey(
// 'spki',
// binaryDer.buffer,
// {
// name: 'RSA-OAEP',
// hash: 'SHA-256',
// },
// false,
// ['encrypt']
// )
// }
/**
* @author https://github.com/zxwk1998/vue-admin-better 不想保留author可删除
* @description RSA解密

View File

@@ -16,7 +16,7 @@
<el-form-item label="封面" prop="coverUrl">
<single-upload
style="width: 100px; height: 100px"
upload-url="http://127.0.0.1:3999/management/api/common/upload"
:upload-url="uploadUrl"
:value="form.coverUrl"
@upload-success="handleUploadSuccess"
/>
@@ -58,6 +58,11 @@
},
}
},
computed: {
uploadUrl() {
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
},
},
created() {
this.fetchData()
this.articleId = this.$route.query.id

View File

@@ -7,7 +7,7 @@
<el-form-item label="轮播图片" prop="appIcon">
<single-upload
style="width: 100px; height: 100px"
upload-url="http://127.0.0.1:3999/management/api/common/upload"
:upload-url="uploadUrl"
:value="form.url"
@upload-success="handleUploadSuccess"
/>
@@ -42,6 +42,11 @@
dialogFormVisible: false,
}
},
computed: {
uploadUrl() {
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
},
},
created() {},
methods: {
handleUploadSuccess(url) {

View File

@@ -7,7 +7,7 @@
<el-form-item label="照片" prop="appIcon">
<single-upload
style="width: 100px; height: 100px"
upload-url="http://127.0.0.1:3999/management/api/common/upload"
:upload-url="uploadUrl"
:value="form.url"
@upload-success="handleUploadSuccess"
/>
@@ -53,6 +53,11 @@
dialogFormVisible: false,
}
},
computed: {
uploadUrl() {
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
},
},
created() {},
methods: {
handleUploadSuccess(url) {

View File

@@ -15,11 +15,7 @@
<el-input v-model="form.description" autocomplete="off" />
</el-form-item>
<el-form-item label="APP图标" prop="appIcon">
<single-upload
style="width: 100px; height: 100px"
upload-url="http://127.0.0.1:3999/management/api/common/upload"
@upload-success="handleUploadSuccess"
/>
<single-upload style="width: 100px; height: 100px" :upload-url="uploadUrl" @upload-success="handleUploadSuccess" />
</el-form-item>
</el-form>
@@ -54,6 +50,11 @@
dialogFormVisible: false,
}
},
computed: {
uploadUrl() {
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
},
},
created() {},
methods: {
handleUploadSuccess(url) {

View File

@@ -21,11 +21,7 @@
</el-select>
</el-form-item>
<el-form-item label="头像" prop="avatar">
<single-upload
style="width: 100px; height: 100px"
upload-url="http://127.0.0.1:3999/management/api/common/upload"
@upload-success="handleUploadSuccess"
/>
<single-upload style="width: 100px; height: 100px" :upload-url="uploadUrl" @upload-success="handleUploadSuccess" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@@ -68,6 +64,11 @@
},
}
},
computed: {
uploadUrl() {
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
},
},
created() {
this.fetchRoleData()
this.fetchApplicationData()