From 11a9fe9014d96cba929e5a066e78f2af7ae59d14 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 5 Oct 2024 01:46:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AB=99=E7=82=B9=E4=B8=AA=E6=80=A7?= =?UTF-8?q?=E5=8C=96=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/package.json | 3 +- packages/core/pipeline/src/utils/index.ts | 3 + .../core/pipeline/src/utils/util.promise.ts | 19 ++ packages/libs/lib-server/package.json | 4 +- .../libs/lib-server/src/basic/constants.ts | 8 + .../lib-server/src/basic/exception/index.ts | 16 +- .../basic/exception/not-found-exception.ts | 10 + .../src/basic/exception/param-exception.ts | 10 + .../basic/exception/permission-exception.ts | 6 +- .../basic/exception/validation-exception.ts | 6 +- .../src/system/{plus => basic}/index.ts | 1 + .../src/system/basic/service/file-service.ts | 86 +++++++++ .../{plus => basic}/service/plus-service.ts | 0 packages/libs/lib-server/src/system/index.ts | 2 +- .../src/system/settings/service/models.ts | 1 + packages/ui/certd-client/.env | 3 +- .../ui/certd-client/public/static/logo.svg | 7 - .../certd-client/src/api/modules/api.basic.ts | 7 + .../certd-client/src/api/modules/api.user.ts | 7 - .../src/components/vip-button/directive.ts | 9 +- .../src/components/vip-button/index.vue | 166 +++++++--------- .../src/layout/components/menu/index.tsx | 5 + .../src/layout/layout-framework.vue | 109 +++++------ .../src/layout/layout-outside.vue | 59 +++--- .../ui/certd-client/src/router/resolve.ts | 1 - .../src/router/source/modules/sys.ts | 43 +++-- .../src/store/modules/settings.ts | 108 +++++++++-- .../ui/certd-client/src/store/modules/user.ts | 41 +--- .../ui/certd-client/src/style/common.less | 6 + .../ui/certd-client/src/utils/util.env.ts | 5 +- .../views/certd/pipeline/certd-form/crud.tsx | 2 +- .../src/views/certd/pipeline/crud.tsx | 2 +- .../pi-notification-form-email.vue | 5 +- .../pipeline/component/step-form/index.vue | 5 +- .../pipeline/component/task-form/index.vue | 4 +- .../views/certd/pipeline/pipeline/index.vue | 13 +- .../views/certd/settings/email-setting.vue | 6 +- .../views/framework/home/content/index.vue | 23 +-- .../views/framework/home/page-cover/helper.ts | 31 --- .../framework/home/page-cover/image/crud.png | Bin 202647 -> 0 bytes .../home/page-cover/image/darkblue@2x.png | Bin 9259 -> 0 bytes .../framework/home/page-cover/image/logo.svg | 178 ------------------ .../views/framework/home/page-cover/index.vue | 136 ------------- .../src/views/framework/login/index.vue | 10 +- .../src/views/sys/account/index.vue | 6 +- .../src/views/sys/settings/index.vue | 25 ++- .../ui/certd-client/src/views/sys/site/api.ts | 4 +- .../certd-client/src/views/sys/site/index.vue | 100 ++++++++-- .../src/views/ui/form/input/index.vue | 21 --- packages/ui/certd-server/.env.commdev.yaml | 39 ++++ packages/ui/certd-server/package.json | 6 +- .../certd-server/src/config/config.default.ts | 21 ++- packages/ui/certd-server/src/configuration.ts | 6 +- .../certd-server/src/middleware/authority.ts | 4 +- .../basic/controller/file-controller.ts | 46 +++++ .../basic/controller/settings-controller.ts | 17 +- .../mine/controller/mine-controller.ts | 12 +- 57 files changed, 710 insertions(+), 763 deletions(-) create mode 100644 packages/libs/lib-server/src/basic/exception/not-found-exception.ts create mode 100644 packages/libs/lib-server/src/basic/exception/param-exception.ts rename packages/libs/lib-server/src/system/{plus => basic}/index.ts (50%) create mode 100644 packages/libs/lib-server/src/system/basic/service/file-service.ts rename packages/libs/lib-server/src/system/{plus => basic}/service/plus-service.ts (100%) delete mode 100644 packages/ui/certd-client/public/static/logo.svg delete mode 100644 packages/ui/certd-client/src/views/framework/home/page-cover/helper.ts delete mode 100644 packages/ui/certd-client/src/views/framework/home/page-cover/image/crud.png delete mode 100644 packages/ui/certd-client/src/views/framework/home/page-cover/image/darkblue@2x.png delete mode 100644 packages/ui/certd-client/src/views/framework/home/page-cover/image/logo.svg delete mode 100644 packages/ui/certd-client/src/views/framework/home/page-cover/index.vue delete mode 100644 packages/ui/certd-client/src/views/ui/form/input/index.vue create mode 100644 packages/ui/certd-server/.env.commdev.yaml create mode 100644 packages/ui/certd-server/src/modules/basic/controller/file-controller.ts diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index d94a0d4e..9c2f102e 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -27,7 +27,8 @@ "node-forge": "^1.3.1", "nodemailer": "^6.9.3", "proxy-agent": "^6.4.0", - "qs": "^6.11.2" + "qs": "^6.11.2", + "dayjs": "^1.11.7" }, "devDependencies": { "@rollup/plugin-commonjs": "^23.0.4", diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts index febde694..ae5bf08c 100644 --- a/packages/core/pipeline/src/utils/index.ts +++ b/packages/core/pipeline/src/utils/index.ts @@ -16,6 +16,8 @@ import { promises } from "./util.promise.js"; import { fileUtils } from "./util.file.js"; import _ from "lodash-es"; import { cache } from "./util.cache.js"; +import dayjs from 'dayjs'; + export const utils = { sleep, http, @@ -27,4 +29,5 @@ export const utils = { mergeUtils, cache, nanoid, + dayjs }; diff --git a/packages/core/pipeline/src/utils/util.promise.ts b/packages/core/pipeline/src/utils/util.promise.ts index 81e5f8fc..88288676 100644 --- a/packages/core/pipeline/src/utils/util.promise.ts +++ b/packages/core/pipeline/src/utils/util.promise.ts @@ -25,7 +25,26 @@ export function safePromise(callback: (resolve: (ret: T) => void, reject: (re }); } +export function promisify(func: any) { + return function (...args: any) { + return new Promise((resolve, reject) => { + try { + func(...args, (err: any, data: any) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + } catch (e) { + reject(e); + } + }); + }; +} + export const promises = { TimeoutPromise, safePromise, + promisify, }; diff --git a/packages/libs/lib-server/package.json b/packages/libs/lib-server/package.json index db39dc18..2e172b94 100644 --- a/packages/libs/lib-server/package.json +++ b/packages/libs/lib-server/package.json @@ -35,7 +35,9 @@ "@midwayjs/cache": "^3", "better-sqlite3": "^11.1.2", "typeorm": "^0.3.20", - "lodash-es": "^4.17.21" + "lodash-es": "^4.17.21", + "dayjs": "^1.11.7", + "@midwayjs/upload": "3" }, "devDependencies": { "mwts": "^1.3.0", diff --git a/packages/libs/lib-server/src/basic/constants.ts b/packages/libs/lib-server/src/basic/constants.ts index b2933666..1bac0592 100644 --- a/packages/libs/lib-server/src/basic/constants.ts +++ b/packages/libs/lib-server/src/basic/constants.ts @@ -44,6 +44,14 @@ export const Constants = { code: 402, message: '您没有权限', }, + param: { + code: 400, + message: '参数错误', + }, + notFound: { + code: 404, + message: '页面/文件/资源不存在', + }, preview: { code: 10001, message: '对不起,预览环境不允许修改此数据', diff --git a/packages/libs/lib-server/src/basic/exception/index.ts b/packages/libs/lib-server/src/basic/exception/index.ts index a8034613..da4c38b2 100644 --- a/packages/libs/lib-server/src/basic/exception/index.ts +++ b/packages/libs/lib-server/src/basic/exception/index.ts @@ -1,7 +1,9 @@ -export * from './auth-exception.js' -export * from './base-exception.js' -export * from './permission-exception.js' -export * from './preview-exception.js' -export * from './validation-exception.js' -export * from './vip-exception.js' -export * from './common-exception.js' +export * from './auth-exception.js'; +export * from './base-exception.js'; +export * from './permission-exception.js'; +export * from './preview-exception.js'; +export * from './validation-exception.js'; +export * from './vip-exception.js'; +export * from './common-exception.js'; +export * from './not-found-exception.js'; +export * from './param-exception.js'; diff --git a/packages/libs/lib-server/src/basic/exception/not-found-exception.ts b/packages/libs/lib-server/src/basic/exception/not-found-exception.ts new file mode 100644 index 00000000..f056c29b --- /dev/null +++ b/packages/libs/lib-server/src/basic/exception/not-found-exception.ts @@ -0,0 +1,10 @@ +import { Constants } from '../constants.js'; +import { BaseException } from './base-exception.js'; +/** + * 资源不存在 + */ +export class NotFoundException extends BaseException { + constructor(message) { + super('NotFoundException', Constants.res.notFound.code, message ? message : Constants.res.notFound.message); + } +} diff --git a/packages/libs/lib-server/src/basic/exception/param-exception.ts b/packages/libs/lib-server/src/basic/exception/param-exception.ts new file mode 100644 index 00000000..675c224e --- /dev/null +++ b/packages/libs/lib-server/src/basic/exception/param-exception.ts @@ -0,0 +1,10 @@ +import { Constants } from '../constants.js'; +import { BaseException } from './base-exception.js'; +/** + * 参数异常 + */ +export class ParamException extends BaseException { + constructor(message) { + super('ParamException', Constants.res.param.code, message ? message : Constants.res.param.message); + } +} diff --git a/packages/libs/lib-server/src/basic/exception/permission-exception.ts b/packages/libs/lib-server/src/basic/exception/permission-exception.ts index 3b4d1f29..4796f282 100644 --- a/packages/libs/lib-server/src/basic/exception/permission-exception.ts +++ b/packages/libs/lib-server/src/basic/exception/permission-exception.ts @@ -5,10 +5,6 @@ import { BaseException } from './base-exception.js'; */ export class PermissionException extends BaseException { constructor(message?: string) { - super( - 'PermissionException', - Constants.res.permission.code, - message ? message : Constants.res.permission.message - ); + super('PermissionException', Constants.res.permission.code, message ? message : Constants.res.permission.message); } } diff --git a/packages/libs/lib-server/src/basic/exception/validation-exception.ts b/packages/libs/lib-server/src/basic/exception/validation-exception.ts index 1a359678..448558c9 100644 --- a/packages/libs/lib-server/src/basic/exception/validation-exception.ts +++ b/packages/libs/lib-server/src/basic/exception/validation-exception.ts @@ -5,10 +5,6 @@ import { BaseException } from './base-exception.js'; */ export class ValidateException extends BaseException { constructor(message) { - super( - 'ValidateException', - Constants.res.validation.code, - message ? message : Constants.res.validation.message - ); + super('ValidateException', Constants.res.validation.code, message ? message : Constants.res.validation.message); } } diff --git a/packages/libs/lib-server/src/system/plus/index.ts b/packages/libs/lib-server/src/system/basic/index.ts similarity index 50% rename from packages/libs/lib-server/src/system/plus/index.ts rename to packages/libs/lib-server/src/system/basic/index.ts index 4d938497..859303a5 100644 --- a/packages/libs/lib-server/src/system/plus/index.ts +++ b/packages/libs/lib-server/src/system/basic/index.ts @@ -1 +1,2 @@ export * from './service/plus-service.js'; +export * from './service/file-service.js'; diff --git a/packages/libs/lib-server/src/system/basic/service/file-service.ts b/packages/libs/lib-server/src/system/basic/service/file-service.ts new file mode 100644 index 00000000..e6343bb7 --- /dev/null +++ b/packages/libs/lib-server/src/system/basic/service/file-service.ts @@ -0,0 +1,86 @@ +import { Provide } from '@midwayjs/core'; +import dayjs from 'dayjs'; +import path from 'path'; +import fs from 'fs'; +import { cache, logger, utils } from '@certd/pipeline'; +import { NotFoundException, ParamException, PermissionException } from '../../../basic/index.js'; + +export type UploadFileItem = { + filename: string; + tmpFilePath: string; +}; +const uploadRootDir = './data/upload'; +export const uploadTmpFileCacheKey = 'tmpfile_key_'; +/** + */ +@Provide() +export class FileService { + async saveFile(userId: number, tmpCacheKey: any, permission: 'public' | 'private') { + if (tmpCacheKey.startsWith(`/${permission}`)) { + //已经保存过,不需要再次保存 + return tmpCacheKey; + } + let fileName = ''; + let tmpFilePath = tmpCacheKey; + if (uploadTmpFileCacheKey && tmpCacheKey.startsWith(uploadTmpFileCacheKey)) { + const tmpFile: UploadFileItem = cache.get(tmpCacheKey); + if (!tmpFile) { + throw new ParamException('文件已过期,请重新上传'); + } + tmpFilePath = tmpFile.tmpFilePath; + fileName = tmpFile.filename || path.basename(tmpFilePath); + } + if (!tmpFilePath || !fs.existsSync(tmpFilePath)) { + throw new Error('文件不存在,请重新上传'); + } + const date = dayjs().format('YYYY_MM_DD'); + const random = Math.random().toString(36).substring(7); + const userIdMd5 = Buffer.from(Buffer.from(userId + '').toString('base64')).toString('hex'); + const key = `/${permission}/${userIdMd5}/${date}/${random}_${fileName}`; + let savePath = path.join(uploadRootDir, key); + savePath = path.resolve(savePath); + const parentDir = path.dirname(savePath); + if (!fs.existsSync(parentDir)) { + fs.mkdirSync(parentDir, { recursive: true }); + } + // eslint-disable-next-line node/no-unsupported-features/node-builtins + const copyFile = utils.promises.promisify(fs.copyFile); + await copyFile(tmpFilePath, savePath); + try { + fs.unlinkSync(tmpFilePath); + } catch (e) { + logger.error(e); + } + + return key; + } + + getFile(key: string, userId?: number) { + if (!key) { + throw new ParamException('参数错误'); + } + if (key.indexOf('..') >= 0) { + //安全性判断 + throw new ParamException('参数错误'); + } + if (!key.startsWith('/')) { + throw new ParamException('参数错误'); + } + const keyArr = key.split('/'); + const permission = keyArr[1]; + const userIdMd5 = keyArr[2]; + if (permission !== 'public') { + //非公开文件需要验证用户 + const userIdStr = Buffer.from(Buffer.from(userIdMd5, 'hex').toString('base64')).toString(); + const userIdInt: number = parseInt(userIdStr, 10); + if (userId == null || userIdInt !== userId) { + throw new PermissionException('无访问权限'); + } + } + const filePath = path.join(uploadRootDir, key); + if (!fs.existsSync(filePath)) { + throw new NotFoundException('文件不存在'); + } + return filePath; + } +} diff --git a/packages/libs/lib-server/src/system/plus/service/plus-service.ts b/packages/libs/lib-server/src/system/basic/service/plus-service.ts similarity index 100% rename from packages/libs/lib-server/src/system/plus/service/plus-service.ts rename to packages/libs/lib-server/src/system/basic/service/plus-service.ts diff --git a/packages/libs/lib-server/src/system/index.ts b/packages/libs/lib-server/src/system/index.ts index 22dd66d2..05c1293e 100644 --- a/packages/libs/lib-server/src/system/index.ts +++ b/packages/libs/lib-server/src/system/index.ts @@ -1,2 +1,2 @@ export * from './settings/index.js'; -export * from './plus/index.js'; +export * from './basic/index.js'; diff --git a/packages/libs/lib-server/src/system/settings/service/models.ts b/packages/libs/lib-server/src/system/settings/service/models.ts index df1d1713..0ade2738 100644 --- a/packages/libs/lib-server/src/system/settings/service/models.ts +++ b/packages/libs/lib-server/src/system/settings/service/models.ts @@ -52,4 +52,5 @@ export class SysSiteInfo extends BaseSettings { title?: string; slogan?: string; logo?: string; + loginLogo?: string; } diff --git a/packages/ui/certd-client/.env b/packages/ui/certd-client/.env index df344b87..b6cc7588 100644 --- a/packages/ui/certd-client/.env +++ b/packages/ui/certd-client/.env @@ -6,6 +6,7 @@ VITE_APP_SLOGAN=让你的证书永不过期 VITE_APP_COPYRIGHT_YEAR=2021-2024 VITE_APP_COPYRIGHT_NAME=handsfree.work VITE_APP_COPYRIGHT_URL=https://certd.handsfree.work -VITE_APP_LOGO=/statics/images/logo/logo.svg +VITE_APP_LOGO=/static/images/logo/logo.svg +VITE_APP_LOGIN_LOGO=/static/images/logo/rect-black.svg VITE_APP_PROJECT_PATH=https://github.com/certd/certd diff --git a/packages/ui/certd-client/public/static/logo.svg b/packages/ui/certd-client/public/static/logo.svg deleted file mode 100644 index edcdefbe..00000000 --- a/packages/ui/certd-client/public/static/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/packages/ui/certd-client/src/api/modules/api.basic.ts b/packages/ui/certd-client/src/api/modules/api.basic.ts index f12a65f4..741ddc30 100644 --- a/packages/ui/certd-client/src/api/modules/api.basic.ts +++ b/packages/ui/certd-client/src/api/modules/api.basic.ts @@ -38,3 +38,10 @@ export async function bindUrl(data): Promise { data }); } + +export async function getPlusInfo() { + return await request({ + url: "/basic/settings/plusInfo", + method: "get" + }); +} diff --git a/packages/ui/certd-client/src/api/modules/api.user.ts b/packages/ui/certd-client/src/api/modules/api.user.ts index d51e38eb..bb7a1973 100644 --- a/packages/ui/certd-client/src/api/modules/api.user.ts +++ b/packages/ui/certd-client/src/api/modules/api.user.ts @@ -64,10 +64,3 @@ export async function mine(): Promise { method: "post" }); } - -export async function getPlusInfo() { - return await request({ - url: "/mine/plusInfo", - method: "post" - }); -} diff --git a/packages/ui/certd-client/src/components/vip-button/directive.ts b/packages/ui/certd-client/src/components/vip-button/directive.ts index bf6f28de..c502aaaf 100644 --- a/packages/ui/certd-client/src/components/vip-button/directive.ts +++ b/packages/ui/certd-client/src/components/vip-button/directive.ts @@ -1,11 +1,12 @@ -import { message, notification } from "ant-design-vue"; -import { useUserStore } from "/@/store/modules/user"; +import { notification } from "ant-design-vue"; +import { useSettingStore } from "/@/store/modules/settings"; + export default { mounted(el: any, binding: any, vnode: any) { const { value } = binding; - const userStore = useUserStore(); + const settingStore = useSettingStore(); el.className = el.className + " need-plus"; - if (!userStore.isPlus) { + if (!settingStore.isPlus) { function checkPlus() { // 事件处理代码 notification.warn({ diff --git a/packages/ui/certd-client/src/components/vip-button/index.vue b/packages/ui/certd-client/src/components/vip-button/index.vue index 5f1048c6..5a1b0593 100644 --- a/packages/ui/certd-client/src/components/vip-button/index.vue +++ b/packages/ui/certd-client/src/components/vip-button/index.vue @@ -12,14 +12,14 @@ diff --git a/packages/ui/certd-client/src/views/framework/login/index.vue b/packages/ui/certd-client/src/views/framework/login/index.vue index b9b1f5ca..5a0cb263 100644 --- a/packages/ui/certd-client/src/views/framework/login/index.vue +++ b/packages/ui/certd-client/src/views/framework/login/index.vue @@ -64,13 +64,9 @@ - + + {{ smsTime <= 0 ? "发送" : smsTime + " s" }} + diff --git a/packages/ui/certd-client/src/views/sys/account/index.vue b/packages/ui/certd-client/src/views/sys/account/index.vue index 9889ac2a..aaf9c454 100644 --- a/packages/ui/certd-client/src/views/sys/account/index.vue +++ b/packages/ui/certd-client/src/views/sys/account/index.vue @@ -47,8 +47,8 @@ onMounted(() => { const subjectInfo: SubjectInfo = { subjectId: settingStore.installInfo.siteId, installTime: settingStore.installInfo.installTime, - vipType: userStore.plusInfo.vipType || "free", - expiresTime: userStore.plusInfo.expireTime + vipType: settingStore.plusInfo.vipType || "free", + expiresTime: settingStore.plusInfo.expireTime }; return subjectInfo; }); @@ -74,7 +74,7 @@ onMounted(() => { await userStore.reInit(); notification.success({ message: "更新成功", - description: "专业版已激活" + description: "专业版/商业版已激活" }); }); }); diff --git a/packages/ui/certd-client/src/views/sys/settings/index.vue b/packages/ui/certd-client/src/views/sys/settings/index.vue index abfd5c75..188ab5fb 100644 --- a/packages/ui/certd-client/src/views/sys/settings/index.vue +++ b/packages/ui/certd-client/src/views/sys/settings/index.vue @@ -20,14 +20,14 @@ - + - 保存 + 保存 @@ -41,7 +41,7 @@ diff --git a/packages/ui/certd-client/src/views/ui/form/input/index.vue b/packages/ui/certd-client/src/views/ui/form/input/index.vue deleted file mode 100644 index 6ffe47ec..00000000 --- a/packages/ui/certd-client/src/views/ui/form/input/index.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/packages/ui/certd-server/.env.commdev.yaml b/packages/ui/certd-server/.env.commdev.yaml new file mode 100644 index 00000000..f230dba9 --- /dev/null +++ b/packages/ui/certd-server/.env.commdev.yaml @@ -0,0 +1,39 @@ +# key: ./data/ssl/cert.key +# cert: ./data/ssl/cert.crt +#plus: +# server: +# baseUrl: 'http://127.0.0.1:11007' + +#flyway: +# scriptDir: './db/migration-pg' + +#typeorm: +# dataSource: +# default: +# type: postgres +# host: localhost +# port: 5433 +# username: postgres +# password: root +# database: postgres + +typeorm: + dataSource: + default: + database: './data/db-comm.sqlite' +#plus: +# server: +# baseUrls: ['https://api.ai.handsfree.work', 'https://api.ai.docmirror.cn'] +# +#account: +# server: +# baseUrl: 'https://ai.handsfree.work/subject' + + +plus: + server: + baseUrls: ['http://127.0.0.1:11007'] + +account: + server: + baseUrl: 'http://127.0.0.1:1017/subject' diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index a9a4b100..dee577a5 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -7,6 +7,7 @@ "scripts": { "start": "cross-env NODE_ENV=production node ./bootstrap.js", "dev": "cross-env NODE_ENV=local mwtsc --watch --run @midwayjs/mock/app", + "commdev": "cross-env NODE_ENV=commdev mwtsc --watch --run @midwayjs/mock/app", "pgdev": "cross-env NODE_ENV=pgdev mwtsc --watch --run @midwayjs/mock/app", "test": "cross-env NODE_ENV=unittest mocha", "cov": "cross-env c8 --all --reporter=text --reporter=lcovonly npm run test", @@ -23,11 +24,11 @@ "@alicloud/cs20151215": "^3.0.3", "@alicloud/pop-core": "^1.7.10", "@certd/acme-client": "^1.25.9", - "@certd/lib-huawei": "^1.25.9", - "@certd/lib-server": "^1.25.9", "@certd/commercial-core": "^1.25.9", + "@certd/lib-huawei": "^1.25.9", "@certd/lib-jdcloud": "^1.25.9", "@certd/lib-k8s": "^1.25.9", + "@certd/lib-server": "^1.25.9", "@certd/midway-flyway-js": "^1.25.9", "@certd/pipeline": "^1.25.9", "@certd/plugin-cert": "^1.25.9", @@ -43,6 +44,7 @@ "@midwayjs/logger": "^3.1.0", "@midwayjs/static-file": "^3.16.4", "@midwayjs/typeorm": "^3.16.4", + "@midwayjs/upload": "3", "@midwayjs/validate": "^3.16.4", "ali-oss": "^6.21.0", "axios": "^1.7.2", diff --git a/packages/ui/certd-server/src/config/config.default.ts b/packages/ui/certd-server/src/config/config.default.ts index 47271b2a..f928dc26 100644 --- a/packages/ui/certd-server/src/config/config.default.ts +++ b/packages/ui/certd-server/src/config/config.default.ts @@ -14,7 +14,9 @@ import { PipelineEntity } from '../modules/pipeline/entity/pipeline.js'; import { mergeConfig } from './loader.js'; import { libServerEntities } from '@certd/lib-server'; import { commercialEntities } from '@certd/commercial-core'; - +import { tmpdir } from 'node:os'; +import { uploadWhiteList, DefaultUploadFileMimeType } from '@midwayjs/upload'; +import path from 'path'; const env = process.env.NODE_ENV || 'development'; const development = { @@ -90,6 +92,23 @@ const development = { plus: { serverBaseUrls: ['http://127.0.0.1:11007'], }, + upload: { + // mode: UploadMode, 默认为file,即上传到服务器临时目录,可以配置为 stream + mode: 'file', + // fileSize: string, 最大上传文件大小,默认为 10mb + fileSize: '10mb', + whitelist: uploadWhiteList, //文件扩展名白名单 + mimeTypeWhiteList: DefaultUploadFileMimeType, //文件MIME类型白名单 + // whitelist: uploadWhiteList.filter(ext => ext !== '.pdf'), + // tmpdir: string,上传的文件临时存储路径 + tmpdir: path.join(tmpdir(), 'certd-upload-files'), + // cleanTimeout: number,上传的文件在临时目录中多久之后自动删除,默认为 5 分钟 + cleanTimeout: 5 * 60 * 1000, + // base64: boolean,设置原始body是否是base64格式,默认为false,一般用于腾讯云的兼容 + base64: false, + // 仅在匹配路径到 /api/upload 的时候去解析 body 中的文件信息 + match: /\/api\/basic\/file\/upload/, + }, } as MidwayConfig; mergeConfig(development, 'development'); diff --git a/packages/ui/certd-server/src/configuration.ts b/packages/ui/certd-server/src/configuration.ts index 949fbe2e..8b5beea3 100644 --- a/packages/ui/certd-server/src/configuration.ts +++ b/packages/ui/certd-server/src/configuration.ts @@ -16,6 +16,7 @@ import { ResetPasswdMiddleware } from './middleware/reset-passwd/middleware.js'; import DefaultConfig from './config/config.default.js'; import * as libServer from '@certd/lib-server'; import * as commercial from '@certd/commercial-core'; +import * as upload from '@midwayjs/upload'; process.on('uncaughtException', error => { console.error('未捕获的异常:', error); // 在这里可以添加日志记录、发送错误通知等操作 @@ -30,12 +31,13 @@ process.on('uncaughtException', error => { cron, staticFile, validate, + upload, + libServer, + commercial, { component: info, enabledEnvironment: ['local'], }, - libServer, - commercial, ], importConfigs: [ { diff --git a/packages/ui/certd-server/src/middleware/authority.ts b/packages/ui/certd-server/src/middleware/authority.ts index 988fb942..3a0b5a48 100644 --- a/packages/ui/certd-server/src/middleware/authority.ts +++ b/packages/ui/certd-server/src/middleware/authority.ts @@ -50,11 +50,11 @@ export class AuthorityMiddleware implements IWebMiddleware { let token = ctx.get('Authorization') || ''; token = token.replace('Bearer ', '').trim(); - if (token === '') { + if (!token) { //尝试从cookie中获取token token = ctx.cookies.get('token') || ''; } - if (token === '') { + if (!token) { //尝试从query中获取token token = (ctx.query.token as string) || ''; } diff --git a/packages/ui/certd-server/src/modules/basic/controller/file-controller.ts b/packages/ui/certd-server/src/modules/basic/controller/file-controller.ts new file mode 100644 index 00000000..e2842939 --- /dev/null +++ b/packages/ui/certd-server/src/modules/basic/controller/file-controller.ts @@ -0,0 +1,46 @@ +import { Controller, Fields, Files, Get, Inject, Post, Provide, Query } from '@midwayjs/core'; +import { BaseController, Constants, FileService, UploadFileItem, uploadTmpFileCacheKey } from '@certd/lib-server'; +import send from 'koa-send'; +import { nanoid } from 'nanoid'; +import { cache } from '@certd/pipeline'; +import { UploadFileInfo } from '@midwayjs/upload'; + +/** + */ +@Provide() +@Controller('/api/basic/file') +export class FileController extends BaseController { + @Inject() + fileService: FileService; + + @Post('/upload', { summary: 'sys:settings:view' }) + async upload(@Files() files: UploadFileInfo[], @Fields() fields: any) { + console.log('files', files, fields); + const cacheKey = uploadTmpFileCacheKey + nanoid(); + const file = files[0]; + cache.set( + cacheKey, + { + filename: file.filename, + tmpFilePath: file.data, + } as UploadFileItem, + { + ttl: 1000 * 60 * 60, + } + ); + return this.ok({ + key: cacheKey, + }); + } + + @Get('/download', { summary: Constants.per.guest }) + async download(@Query('key') key: string) { + let userId: any = null; + if (!key.startsWith('/public')) { + userId = this.getUserId(); + } + const filePath = this.fileService.getFile(key, userId); + this.ctx.response.attachment(filePath); + await send(this.ctx, filePath); + } +} diff --git a/packages/ui/certd-server/src/modules/basic/controller/settings-controller.ts b/packages/ui/certd-server/src/modules/basic/controller/settings-controller.ts index d805114c..26353d51 100644 --- a/packages/ui/certd-server/src/modules/basic/controller/settings-controller.ts +++ b/packages/ui/certd-server/src/modules/basic/controller/settings-controller.ts @@ -1,9 +1,6 @@ -import { Config, Controller, Get, Inject, Provide } from '@midwayjs/core'; -import { BaseController } from '@certd/lib-server'; -import { Constants } from '@certd/lib-server'; -import { SysSettingsService } from '@certd/lib-server'; -import { SysInstallInfo, SysPublicSettings, SysSiteInfo } from '@certd/lib-server'; -import { AppKey } from '@certd/pipeline'; +import { ALL, Body, Config, Controller, Get, Inject, Provide } from '@midwayjs/core'; +import { BaseController, Constants, SysInstallInfo, SysPublicSettings, SysSettingsService, SysSiteInfo } from '@certd/lib-server'; +import { AppKey, getPlusInfo } from '@certd/pipeline'; /** */ @@ -34,4 +31,12 @@ export class BasicSettingsController extends BaseController { const settings: SysSiteInfo = await this.sysSettingsService.getSetting(SysSiteInfo); return this.ok(settings); } + + @Get('/plusInfo', { summary: Constants.per.guest }) + async plusInfo(@Body(ALL) body: any) { + const info = getPlusInfo(); + return this.ok({ + ...info, + }); + } } diff --git a/packages/ui/certd-server/src/modules/mine/controller/mine-controller.ts b/packages/ui/certd-server/src/modules/mine/controller/mine-controller.ts index 831c86b9..d60a93b4 100644 --- a/packages/ui/certd-server/src/modules/mine/controller/mine-controller.ts +++ b/packages/ui/certd-server/src/modules/mine/controller/mine-controller.ts @@ -1,8 +1,6 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core'; -import { BaseController } from '@certd/lib-server'; -import { Constants } from '@certd/lib-server'; +import { BaseController, Constants } from '@certd/lib-server'; import { UserService } from '../../authority/service/user-service.js'; -import { getPlusInfo } from '@certd/pipeline'; import { RoleService } from '../../authority/service/role-service.js'; /** @@ -29,12 +27,4 @@ export class MineController extends BaseController { await this.userService.changePassword(userId, body); return this.ok({}); } - - @Post('/plusInfo', { summary: Constants.per.authOnly }) - async plusInfo(@Body(ALL) body) { - const info = getPlusInfo(); - return this.ok({ - ...info, - }); - } }