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": [],
|
||||
"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",
|
||||
|
||||
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 导出默认网路配置
|
||||
**/
|
||||
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,
|
||||
|
||||
@@ -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解密
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user