fix: decrypt
This commit is contained in:
1
.env.development
Normal file
1
.env.development
Normal file
@@ -0,0 +1 @@
|
|||||||
|
VUE_APP_API_BASE_URL=https://apis.lihailezzc.com
|
||||||
1
.env.production
Normal file
1
.env.production
Normal file
@@ -0,0 +1 @@
|
|||||||
|
VUE_APP_API_BASE_URL=https://apis.lihailezzc.com
|
||||||
34
Dockerfile
Normal file
34
Dockerfile
Normal 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
11
nginx.conf
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,8 +5,8 @@
|
|||||||
"participants": [],
|
"participants": [],
|
||||||
"homepage": "https://vuejs-core.cn",
|
"homepage": "https://vuejs-core.cn",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve",
|
"serve": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
|
||||||
"build": "vue-cli-service build",
|
"build": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
|
||||||
"serve:node20": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
|
"serve:node20": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
|
||||||
"build:node20": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
|
"build:node20": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
|
||||||
"serve:mac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
|
"serve:mac": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
|
||||||
@@ -43,6 +43,7 @@
|
|||||||
"layouts": "file:layouts",
|
"layouts": "file:layouts",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mockjs": "^1.1.0",
|
"mockjs": "^1.1.0",
|
||||||
|
"node-forge": "^1.3.1",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"qs": "^6.14.0",
|
"qs": "^6.14.0",
|
||||||
"quill": "^2.0.3",
|
"quill": "^2.0.3",
|
||||||
|
|||||||
15187
pnpm-lock.yaml
generated
15187
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -2,9 +2,7 @@
|
|||||||
* @description 导出默认网路配置
|
* @description 导出默认网路配置
|
||||||
**/
|
**/
|
||||||
const network = {
|
const network = {
|
||||||
// 默认的接口地址 如果是开发环境和生产环境走vab-mock-server,当然你也可以选择自己配置成需要的接口地址
|
baseURL: process.env.VUE_APP_API_BASE_URL,
|
||||||
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
|
|
||||||
contentType: 'application/json;charset=UTF-8',
|
contentType: 'application/json;charset=UTF-8',
|
||||||
//消息框消失时间
|
//消息框消失时间
|
||||||
messageDuration: 3000,
|
messageDuration: 3000,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import JSEncrypt from 'jsencrypt'
|
import JSEncrypt from 'jsencrypt'
|
||||||
import { getPublicKey } from '@/api/publicKey'
|
import { getPublicKey } from '@/api/publicKey'
|
||||||
|
import forge from 'node-forge'
|
||||||
|
|
||||||
const privateKey =
|
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='
|
'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
|
* @param data
|
||||||
* @returns {Promise<{param: PromiseLike<ArrayBuffer>}|*>}
|
* @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) {
|
export async function encryptedData(data) {
|
||||||
let publicKey = ''
|
|
||||||
const res = await getPublicKey()
|
const res = await getPublicKey()
|
||||||
publicKey = res.data.publicKey
|
let publicKey = res.data.publicKey
|
||||||
if (res.data.mockServer) {
|
|
||||||
publicKey = ''
|
if (res.data.mockServer || !publicKey) {
|
||||||
}
|
|
||||||
if (publicKey == '') {
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
const encrypt = new JSEncrypt()
|
|
||||||
encrypt.setPublicKey(`-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`)
|
const pem = `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`
|
||||||
data = encrypt.encrypt(JSON.stringify(data))
|
const forgePublicKey = forge.pki.publicKeyFromPem(pem)
|
||||||
|
const encrypted = forgePublicKey.encrypt(JSON.stringify(data), 'RSA-OAEP', {
|
||||||
|
md: forge.md.sha256.create(), // OAEP + SHA-256
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
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可删除)
|
* @author https://github.com/zxwk1998/vue-admin-better (不想保留author可删除)
|
||||||
* @description RSA解密
|
* @description RSA解密
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<el-form-item label="封面" prop="coverUrl">
|
<el-form-item label="封面" prop="coverUrl">
|
||||||
<single-upload
|
<single-upload
|
||||||
style="width: 100px; height: 100px"
|
style="width: 100px; height: 100px"
|
||||||
upload-url="http://127.0.0.1:3999/management/api/common/upload"
|
:upload-url="uploadUrl"
|
||||||
:value="form.coverUrl"
|
:value="form.coverUrl"
|
||||||
@upload-success="handleUploadSuccess"
|
@upload-success="handleUploadSuccess"
|
||||||
/>
|
/>
|
||||||
@@ -58,6 +58,11 @@
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
uploadUrl() {
|
||||||
|
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
|
||||||
|
},
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
this.articleId = this.$route.query.id
|
this.articleId = this.$route.query.id
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<el-form-item label="轮播图片" prop="appIcon">
|
<el-form-item label="轮播图片" prop="appIcon">
|
||||||
<single-upload
|
<single-upload
|
||||||
style="width: 100px; height: 100px"
|
style="width: 100px; height: 100px"
|
||||||
upload-url="http://127.0.0.1:3999/management/api/common/upload"
|
:upload-url="uploadUrl"
|
||||||
:value="form.url"
|
:value="form.url"
|
||||||
@upload-success="handleUploadSuccess"
|
@upload-success="handleUploadSuccess"
|
||||||
/>
|
/>
|
||||||
@@ -42,6 +42,11 @@
|
|||||||
dialogFormVisible: false,
|
dialogFormVisible: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
uploadUrl() {
|
||||||
|
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
|
||||||
|
},
|
||||||
|
},
|
||||||
created() {},
|
created() {},
|
||||||
methods: {
|
methods: {
|
||||||
handleUploadSuccess(url) {
|
handleUploadSuccess(url) {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<el-form-item label="照片" prop="appIcon">
|
<el-form-item label="照片" prop="appIcon">
|
||||||
<single-upload
|
<single-upload
|
||||||
style="width: 100px; height: 100px"
|
style="width: 100px; height: 100px"
|
||||||
upload-url="http://127.0.0.1:3999/management/api/common/upload"
|
:upload-url="uploadUrl"
|
||||||
:value="form.url"
|
:value="form.url"
|
||||||
@upload-success="handleUploadSuccess"
|
@upload-success="handleUploadSuccess"
|
||||||
/>
|
/>
|
||||||
@@ -53,6 +53,11 @@
|
|||||||
dialogFormVisible: false,
|
dialogFormVisible: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
uploadUrl() {
|
||||||
|
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
|
||||||
|
},
|
||||||
|
},
|
||||||
created() {},
|
created() {},
|
||||||
methods: {
|
methods: {
|
||||||
handleUploadSuccess(url) {
|
handleUploadSuccess(url) {
|
||||||
|
|||||||
@@ -15,11 +15,7 @@
|
|||||||
<el-input v-model="form.description" autocomplete="off" />
|
<el-input v-model="form.description" autocomplete="off" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="APP图标" prop="appIcon">
|
<el-form-item label="APP图标" prop="appIcon">
|
||||||
<single-upload
|
<single-upload style="width: 100px; height: 100px" :upload-url="uploadUrl" @upload-success="handleUploadSuccess" />
|
||||||
style="width: 100px; height: 100px"
|
|
||||||
upload-url="http://127.0.0.1:3999/management/api/common/upload"
|
|
||||||
@upload-success="handleUploadSuccess"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
@@ -54,6 +50,11 @@
|
|||||||
dialogFormVisible: false,
|
dialogFormVisible: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
uploadUrl() {
|
||||||
|
return `${process.env.VUE_APP_API_BASE_URL}/management/api/common/upload`
|
||||||
|
},
|
||||||
|
},
|
||||||
created() {},
|
created() {},
|
||||||
methods: {
|
methods: {
|
||||||
handleUploadSuccess(url) {
|
handleUploadSuccess(url) {
|
||||||
|
|||||||
@@ -21,11 +21,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="头像" prop="avatar">
|
<el-form-item label="头像" prop="avatar">
|
||||||
<single-upload
|
<single-upload style="width: 100px; height: 100px" :upload-url="uploadUrl" @upload-success="handleUploadSuccess" />
|
||||||
style="width: 100px; height: 100px"
|
|
||||||
upload-url="http://127.0.0.1:3999/management/api/common/upload"
|
|
||||||
@upload-success="handleUploadSuccess"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div slot="footer" class="dialog-footer">
|
<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() {
|
created() {
|
||||||
this.fetchRoleData()
|
this.fetchRoleData()
|
||||||
this.fetchApplicationData()
|
this.fetchApplicationData()
|
||||||
|
|||||||
Reference in New Issue
Block a user