=> {
@@ -26,16 +27,36 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
pageRequest,
addRequest,
editRequest,
- delRequest
+ delRequest,
},
rowHandle: {
- fixed: "right"
+ fixed: "right",
+ buttons: {
+ unlock: {
+ title: "解除登录锁定",
+ text: null,
+ type: "link",
+ icon: "ion:lock-open-outline",
+ click: async ({ row }) => {
+ Modal.confirm({
+ title: "提示",
+ content: "确定要解除该用户的登录锁定吗?",
+ onOk: async () => {
+ await api.Unlock(row.id);
+ notification.success({
+ message: "解除成功",
+ });
+ },
+ });
+ },
+ },
+ },
},
table: {
scroll: {
//使用固定列时需要设置此值,并且大于等于列宽度之和的值
- x: 1400
- }
+ x: 1400,
+ },
},
columns: {
id: {
@@ -44,8 +65,8 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
form: { show: false }, // 表单配置
column: {
width: 100,
- sorter: true
- }
+ sorter: true,
+ },
},
createTime: {
title: "创建时间",
@@ -53,8 +74,8 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
form: { show: false }, // 表单配置
column: {
width: 180,
- sorter: true
- }
+ sorter: true,
+ },
},
// updateTime: {
// title: "修改时间",
@@ -72,64 +93,64 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
form: {
rules: [
{ required: true, message: "请输入用户名" },
- { max: 50, message: "最大50个字符" }
- ]
+ { max: 50, message: "最大50个字符" },
+ ],
},
editForm: { component: { disabled: false } },
column: {
sorter: true,
- width: 200
- }
+ width: 200,
+ },
},
password: {
title: "密码",
type: "text",
key: "password",
column: {
- show: false
+ show: false,
},
form: {
rules: [{ max: 50, message: "最大50个字符" }],
component: {
- showPassword: true
+ showPassword: true,
},
- helper: "填写则修改密码"
- }
+ helper: "填写则修改密码",
+ },
},
nickName: {
title: "昵称",
type: "text",
search: { show: true }, // 开启查询
form: {
- rules: [{ max: 50, message: "最大50个字符" }]
+ rules: [{ max: 50, message: "最大50个字符" }],
},
column: {
- sorter: true
- }
+ sorter: true,
+ },
},
email: {
title: "邮箱",
type: "text",
search: { show: true }, // 开启查询
form: {
- rules: [{ max: 50, message: "最大50个字符" }]
+ rules: [{ max: 50, message: "最大50个字符" }],
},
column: {
sorter: true,
- width: 160
- }
+ width: 160,
+ },
},
mobile: {
title: "手机号",
type: "text",
search: { show: true }, // 开启查询
form: {
- rules: [{ max: 50, message: "最大50个字符" }]
+ rules: [{ max: 50, message: "最大50个字符" }],
},
column: {
sorter: true,
- width: 130
- }
+ width: 130,
+ },
},
avatar: {
title: "头像",
@@ -140,12 +161,12 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
//设置高度,修复操作列错位的问题
style: {
height: "30px",
- width: "auto"
+ width: "auto",
},
buildUrl(key: string) {
return `/api/basic/file/download?&key=` + key;
- }
- }
+ },
+ },
},
form: {
component: {
@@ -154,7 +175,7 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
cropper: {
aspectRatio: 1,
autoCropArea: 1,
- viewMode: 0
+ viewMode: 0,
},
onReady: null,
uploader: {
@@ -162,17 +183,17 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
action: "/basic/file/upload",
name: "file",
headers: {
- Authorization: "Bearer " + userStore.getToken
+ Authorization: "Bearer " + userStore.getToken,
},
successHandle(res: any) {
return res;
- }
+ },
},
buildUrl(key: string) {
return `/api/basic/file/download?&key=` + key;
- }
- }
- }
+ },
+ },
+ },
},
status: {
title: "状态",
@@ -180,24 +201,24 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
dict: dict({
data: [
{ label: "启用", value: 1, color: "green" },
- { label: "禁用", value: 0, color: "red" }
- ]
+ { label: "禁用", value: 0, color: "red" },
+ ],
}),
column: {
align: "center",
sorter: true,
- width: 100
- }
+ width: 100,
+ },
},
remark: {
title: "备注",
type: "text",
column: {
- sorter: true
+ sorter: true,
},
form: {
- rules: [{ max: 100, message: "最大100个字符" }]
- }
+ rules: [{ max: 100, message: "最大100个字符" }],
+ },
},
roles: {
title: "角色",
@@ -205,17 +226,17 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
dict: dict({
url: "/sys/authority/role/list",
value: "id",
- label: "name"
+ label: "name",
}), // 数据字典
form: {
- component: { mode: "multiple" }
+ component: { mode: "multiple" },
},
column: {
width: 250,
- sortable: true
- }
- }
- }
- }
+ sortable: true,
+ },
+ },
+ },
+ },
};
}
diff --git a/packages/ui/certd-client/src/views/sys/settings/api.ts b/packages/ui/certd-client/src/views/sys/settings/api.ts
index e2d57609..cb0c3299 100644
--- a/packages/ui/certd-client/src/views/sys/settings/api.ts
+++ b/packages/ui/certd-client/src/views/sys/settings/api.ts
@@ -103,3 +103,4 @@ export async function GetSmsTypeDefine(type: string) {
},
});
}
+
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 a2624b6a..c16a76c5 100644
--- a/packages/ui/certd-client/src/views/sys/settings/index.vue
+++ b/packages/ui/certd-client/src/views/sys/settings/index.vue
@@ -5,8 +5,8 @@
-
-
+
+
@@ -14,6 +14,9 @@
+
+
+
@@ -23,6 +26,7 @@
import SettingBase from "/@/views/sys/settings/tabs/base.vue";
import SettingRegister from "/@/views/sys/settings/tabs/register.vue";
import SettingPayment from "/@/views/sys/settings/tabs/payment.vue";
+import SettingSafe from "/@/views/sys/settings/tabs/safe.vue";
import { useRoute, useRouter } from "vue-router";
import { ref } from "vue";
import { useSettingStore } from "/@/store/settings";
@@ -30,11 +34,11 @@ defineOptions({
name: "SysSettings",
});
const settingsStore = useSettingStore();
-const activeKey = ref("");
+const activeKey = ref("base");
const route = useRoute();
const router = useRouter();
if (route.query.tab) {
- activeKey.value = (route.query.tab as string) || "";
+ activeKey.value = (route.query.tab as string) || "base";
}
function onChange(value: string) {
@@ -52,7 +56,7 @@ function onChange(value: string) {
diff --git a/packages/ui/certd-client/vite.config.ts b/packages/ui/certd-client/vite.config.ts
index 78b0f166..2bf69c22 100644
--- a/packages/ui/certd-client/vite.config.ts
+++ b/packages/ui/certd-client/vite.config.ts
@@ -14,36 +14,19 @@ import DefineOptions from "unplugin-vue-define-options/vite";
// 增加环境变量 _
process.env.VITE_APP_VERSION = require("./package.json").version;
process.env.VITE_APP_BUILD_TIME = require("dayjs")().format("YYYY-M-D HH:mm:ss");
-
-import { theme } from "ant-design-vue";
import * as https from "node:https";
-const { defaultAlgorithm, defaultSeed } = theme;
-
-const mapToken = defaultAlgorithm(defaultSeed);
export default ({ command, mode }) => {
console.log("args", command, mode);
const env = loadEnv(mode, process.cwd());
- let devServerFs: any = {};
- let devAlias: any[] = [];
- if (mode.startsWith("debug")) {
- devAlias = [
- { find: /@fast-crud\/fast-crud\/dist/, replacement: path.resolve("../../fast-crud/src/") },
- // { find: /@fast-crud\/fast-crud$/, replacement: path.resolve("../../fast-crud/src/") },
- { find: /@fast-crud\/fast-extends\/dist/, replacement: path.resolve("../../fast-extends/src/") },
- // { find: /@fast-crud\/fast-extends$/, replacement: path.resolve("../../fast-extends/src/") },
- // { find: /@fast-crud\/ui-antdv$/, replacement: path.resolve("../../ui/ui-antdv/src/") },
- // { find: /@fast-crud\/ui-interface$/, replacement: path.resolve("../../ui/ui-interface/src/") }
- { find: /@fast-crud\/ui-antdv4\/dist/, replacement: path.resolve("../../ui/ui-antdv4/src/") }
- ];
- devServerFs = {
- // 这里配置dev启动时读取的项目根目录
- allow: ["../../../"]
- };
- console.log("devAlias", devAlias);
- }
+ const devServerFs: any = {};
+ const devAlias: any[] = [];
+ const base = "/";
+ // if (mode.startsWith("dev")) {
+ // base = "/dev";
+ // }
return {
- base: "/",
+ base: base,
plugins: [
DefineOptions(),
vueJsx(),
@@ -52,12 +35,12 @@ export default ({ command, mode }) => {
inject: {
data: {
title: env.VITE_APP_TITLE,
- projectPath: env.VITE_APP_PROJECT_PATH
- }
- }
+ projectPath: env.VITE_APP_PROJECT_PATH,
+ },
+ },
}),
// 压缩build后的代码
- viteCompression()
+ viteCompression(),
//主题色替换
//...configThemePlugin(true),
// viteThemePlugin({
@@ -71,29 +54,29 @@ export default ({ command, mode }) => {
drop: command === "build" ? ["debugger"] : [],
pure: ["console.log", "debugger"],
jsxFactory: "h",
- jsxFragment: "Fragment"
+ jsxFragment: "Fragment",
},
resolve: {
alias: [...devAlias, { find: "/@", replacement: path.resolve("./src") }, { find: "/#", replacement: path.resolve("./types") }],
- dedupe: ["vue"]
+ dedupe: ["vue"],
},
optimizeDeps: {
- include: ["ant-design-vue"]
+ include: ["ant-design-vue"],
},
build: {
rollupOptions: {
- plugins: [visualizer()]
- }
+ plugins: [visualizer()],
+ },
},
css: {
preprocessorOptions: {
less: {
// 修改默认主题颜色,配置less变量
// modifyVars: generateModifyVars(),
- javascriptEnabled: true
+ javascriptEnabled: true,
// modifyVars: mapToken
- }
- }
+ },
+ },
},
server: {
host: "0.0.0.0",
@@ -105,9 +88,9 @@ export default ({ command, mode }) => {
//配套后端 https://github.com/fast-crud/fs-server-js
target: "https://127.0.0.1:7002",
//忽略证书
- agent: new https.Agent({ rejectUnauthorized: false })
- }
- }
- }
+ agent: new https.Agent({ rejectUnauthorized: false }),
+ },
+ },
+ },
};
};
diff --git a/packages/ui/certd-server/src/configuration.ts b/packages/ui/certd-server/src/configuration.ts
index e854055f..bc27b11f 100644
--- a/packages/ui/certd-server/src/configuration.ts
+++ b/packages/ui/certd-server/src/configuration.ts
@@ -19,6 +19,7 @@ import * as libServer from '@certd/lib-server';
import * as commercial from '@certd/commercial-core';
import * as upload from '@midwayjs/upload';
import { setLogger } from '@certd/acme-client';
+import {HiddenMiddleware} from "./middleware/hidden.js";
process.on('uncaughtException', error => {
console.error('未捕获的异常:', error);
// 在这里可以添加日志记录、发送错误通知等操作
@@ -77,6 +78,8 @@ export class MainConfiguration {
this.app.useMiddleware([
//统一异常处理
GlobalExceptionMiddleware,
+ //站点隐藏
+ HiddenMiddleware,
//预览模式限制修改id<1000的数据
PreviewMiddleware,
//授权处理
diff --git a/packages/ui/certd-server/src/controller/basic/unhidden-controller.ts b/packages/ui/certd-server/src/controller/basic/unhidden-controller.ts
new file mode 100644
index 00000000..1e450e1d
--- /dev/null
+++ b/packages/ui/certd-server/src/controller/basic/unhidden-controller.ts
@@ -0,0 +1,66 @@
+import {Body, Controller, Get, Inject, Post, Provide} from '@midwayjs/core';
+import {Constants, NotFoundException, ParamException, SysInstallInfo, SysSettingsService} from '@certd/lib-server';
+import {utils} from "@certd/basic";
+import {hiddenStatus, SafeService} from "../../modules/sys/settings/safe-service.js";
+import {IMidwayKoaContext} from "@midwayjs/koa";
+
+const unhiddenHtml = `
+
+
+certd解除站点隐藏
+
+
+
+
解除站点隐藏
+
+
+
+
+
+`
+
+@Provide()
+@Controller('/api/unhidden')
+export class HnhiddenController {
+ @Inject()
+ ctx: IMidwayKoaContext;
+ @Inject()
+ safeService: SafeService;
+ @Inject()
+ sysSettingsService: SysSettingsService;
+
+
+ @Post('/:randomPath', {summary: Constants.per.guest})
+ async randomPath(@Body("password") password: any) {
+ await this.checkUnhiddenPath()
+ const hiddenSetting = await this.safeService.getHiddenSetting()
+ if (utils.hash.md5(password) === hiddenSetting.openPassword) {
+ //解锁
+ hiddenStatus.isHidden = false;
+ const setting = await this.sysSettingsService.getSetting(SysInstallInfo)
+ const bindUrl = setting.bindUrl
+ //解锁成功,跳转回首页,redirect
+ this.ctx.response.redirect(bindUrl || "/");
+ return
+ } else {
+ //密码错误
+ throw new ParamException('解锁密码错误');
+ }
+ }
+
+ @Get('/:randomPath', {summary: Constants.per.guest})
+ async unhiddenGet() {
+ await this.checkUnhiddenPath()
+ this.ctx.response.body = unhiddenHtml
+ }
+
+ async checkUnhiddenPath() {
+ const hiddenSetting = await this.safeService.getHiddenSetting()
+ if (this.ctx.path != `/api/unhidden/${hiddenSetting.openPath}`) {
+ this.ctx.res.statusCode = 404
+ throw new NotFoundException("Page not found")
+ }
+ }
+}
diff --git a/packages/ui/certd-server/src/controller/sys/settings/sys-safe-settings-controller.ts b/packages/ui/certd-server/src/controller/sys/settings/sys-safe-settings-controller.ts
new file mode 100644
index 00000000..8bc963f3
--- /dev/null
+++ b/packages/ui/certd-server/src/controller/sys/settings/sys-safe-settings-controller.ts
@@ -0,0 +1,39 @@
+import {ALL, Body, Controller, Inject, Post, Provide} from '@midwayjs/core';
+import {BaseController, SysSafeSetting} from '@certd/lib-server';
+import {cloneDeep} from 'lodash-es';
+import {SafeService} from "../../../modules/sys/settings/safe-service.js";
+
+
+/**
+ */
+@Provide()
+@Controller('/api/sys/settings/safe')
+export class SysSettingsController extends BaseController {
+ @Inject()
+ safeService: SafeService;
+
+
+
+ @Post("/get", { summary: "sys:settings:view" })
+ async safeGet() {
+ const res = await this.safeService.getSafeSetting()
+ const clone:SysSafeSetting = cloneDeep(res);
+ delete clone.hidden?.openPassword;
+ return this.ok(clone);
+ }
+
+ @Post("/save", { summary: "sys:settings:edit" })
+ async safeSave(@Body(ALL) body: any) {
+ await this.safeService.saveSafeSetting(body);
+ return this.ok({});
+ }
+
+ /**
+ * 立即隐藏
+ */
+ @Post("/hidden", { summary: "sys:settings:edit" })
+ async hiddenImmediate() {
+ await this.safeService.hiddenImmediately();
+ return this.ok({});
+ }
+}
diff --git a/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts b/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts
index cc20be2e..14f58f5b 100644
--- a/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts
+++ b/packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts
@@ -1,12 +1,19 @@
-import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
-import { CrudController, SysPrivateSettings, SysPublicSettings, SysSettingsEntity, SysSettingsService } from '@certd/lib-server';
-import { merge } from 'lodash-es';
-import { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';
-import { UserSettingsService } from '../../../modules/mine/service/user-settings-service.js';
-import { getEmailSettings } from '../../../modules/sys/settings/fix.js';
-import { http, logger, simpleNanoId } from '@certd/basic';
-import { CodeService } from '../../../modules/basic/service/code-service.js';
-import { SmsServiceFactory } from '../../../modules/basic/sms/factory.js';
+import {ALL, Body, Controller, Inject, Post, Provide, Query} from '@midwayjs/core';
+import {
+ CrudController,
+ SysPrivateSettings,
+ SysPublicSettings,
+ SysSafeSetting,
+ SysSettingsEntity,
+ SysSettingsService
+} from '@certd/lib-server';
+import {cloneDeep, merge} from 'lodash-es';
+import {PipelineService} from '../../../modules/pipeline/service/pipeline-service.js';
+import {UserSettingsService} from '../../../modules/mine/service/user-settings-service.js';
+import {getEmailSettings} from '../../../modules/sys/settings/fix.js';
+import {http, logger, simpleNanoId, utils} from '@certd/basic';
+import {CodeService} from '../../../modules/basic/service/code-service.js';
+import {SmsServiceFactory} from '../../../modules/basic/sms/factory.js';
/**
@@ -159,4 +166,29 @@ export class SysSettingsController extends CrudController {
async getSmsTypeDefine(@Body('type') type: string) {
return this.ok(SmsServiceFactory.getDefine(type));
}
+
+
+
+ @Post("/safe/get", { summary: "sys:settings:view" })
+ async safeGet() {
+ const res = await this.service.getSetting(SysSafeSetting);
+ const clone:SysSafeSetting = cloneDeep(res);
+ delete clone.hidden?.openPassword;
+ return this.ok(clone);
+ }
+
+ @Post("/safe/save", { summary: "sys:settings:edit" })
+ async safeSave(@Body(ALL) body: any) {
+ if(body.hidden.openPassword){
+ body.hidden.openPassword = utils.hash.md5(body.hidden.openPassword);
+ }
+ const blankSetting = new SysSafeSetting()
+ const setting = await this.service.getSetting(SysSafeSetting);
+ const newSetting = merge(blankSetting,cloneDeep(setting), body);
+ if(newSetting.hidden?.enabled && !newSetting.hidden?.openPassword){
+ throw new Error("首次设置需要填写解锁密码")
+ }
+ await this.service.saveSetting(blankSetting);
+ return this.ok({});
+ }
}
diff --git a/packages/ui/certd-server/src/middleware/hidden.ts b/packages/ui/certd-server/src/middleware/hidden.ts
new file mode 100644
index 00000000..7e135f7c
--- /dev/null
+++ b/packages/ui/certd-server/src/middleware/hidden.ts
@@ -0,0 +1,54 @@
+import {Inject, Provide} from '@midwayjs/core';
+import {IMidwayKoaContext, IWebMiddleware, NextFunction} from '@midwayjs/koa';
+import {hiddenStatus, SafeService} from "../modules/sys/settings/safe-service.js";
+import {SiteOffException} from "@certd/lib-server";
+
+
+/**
+ * 隐藏环境
+ */
+@Provide()
+export class HiddenMiddleware implements IWebMiddleware {
+ @Inject()
+ hiddenService: SafeService;
+
+ resolve() {
+ return async (ctx: IMidwayKoaContext, next: NextFunction) => {
+
+ async function pass() {
+ hiddenStatus.updateRequestTime()
+ await next();
+ }
+
+ const hiddenSetting = await this.hiddenService.getHiddenSetting();
+ if (!hiddenSetting || !hiddenSetting?.enabled) {
+ //未开启站点隐藏,直接通过
+ return await pass()
+ }
+
+ const req = ctx.request;
+ if (hiddenSetting.hiddenOpenApi === false && req.url.startsWith(`/api/v1/`) ) {
+ //不隐藏开放接口
+ await next();
+ return
+ }
+
+ //判断当前是否是隐藏状态
+ if (!hiddenStatus.isHidden) {
+ return await pass()
+ }
+
+ //判断是否有解锁文件,如果有就返回true并删除文件
+ if (hiddenStatus.hasUnHiddenFile()) {
+ //临时修改为未隐藏
+ hiddenStatus.isHidden = false;
+ return await pass()
+ }
+
+ if (req.url === `/api/unhidden/${hiddenSetting.openPath}`) {
+ return await pass();
+ }
+ throw new SiteOffException('此站点已关闭');
+ }
+ }
+}
diff --git a/packages/ui/certd-server/src/modules/auto/auto-a-init-site.ts b/packages/ui/certd-server/src/modules/auto/auto-a-init-site.ts
index 052aa9b1..13fe23cc 100644
--- a/packages/ui/certd-server/src/modules/auto/auto-a-init-site.ts
+++ b/packages/ui/certd-server/src/modules/auto/auto-a-init-site.ts
@@ -4,6 +4,7 @@ import { UserService } from '../sys/authority/service/user-service.js';
import { PlusService, SysInstallInfo, SysPrivateSettings, SysSettingsService } from '@certd/lib-server';
import { nanoid } from 'nanoid';
import crypto from 'crypto';
+import {SafeService} from "../sys/settings/safe-service.js";
@Autoload()
@Scope(ScopeEnum.Request, { allowDowngrade: true })
@@ -18,6 +19,8 @@ export class AutoAInitSite {
sysSettingsService: SysSettingsService;
@Inject()
plusService: PlusService;
+ @Inject()
+ safeService: SafeService;
@Init()
async init() {
@@ -57,6 +60,8 @@ export class AutoAInitSite {
logger.error('授权许可验证失败', e);
}
+ //加载站点隐藏配置
+ await this.safeService.reloadHiddenStatus(true)
logger.info('初始化站点完成');
}
diff --git a/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts b/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts
new file mode 100644
index 00000000..46fbbc2a
--- /dev/null
+++ b/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts
@@ -0,0 +1,110 @@
+import {Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';
+import {SiteHidden, SysSafeSetting, SysSettingsService} from "@certd/lib-server";
+import fs from "fs";
+import {logger, utils} from "@certd/basic";
+import {cloneDeep, merge} from "lodash-es";
+
+
+export class HiddenStatus {
+
+
+ isHidden = false;
+ lastRequestTime = 0;
+ intervalId: any = null;
+
+ hasUnHiddenFile() {
+ if (fs.existsSync(`./data/.unhidden`)) {
+ fs.unlinkSync(`./data/.unhidden`)
+ return true
+ }
+ return false
+ }
+
+ updateRequestTime() {
+ this.lastRequestTime = Date.now();
+ }
+
+ startCheck(autoHiddenTimes = 5) {
+ this.stopCheck()
+ this.intervalId = setInterval(() => {
+ //默认5分钟后自动隐藏
+ if (!this.isHidden && Date.now() - this.lastRequestTime > 1000 * 60 * autoHiddenTimes) {
+ this.isHidden = true;
+ }
+ }, 1000 * 60)
+ }
+
+ stopCheck() {
+ if (this.intervalId) {
+ clearInterval(this.intervalId)
+ this.intervalId = null
+ }
+ }
+
+}
+
+export const hiddenStatus = new HiddenStatus();
+
+
+@Provide('safeService')
+@Scope(ScopeEnum.Request, {allowDowngrade: true})
+export class SafeService {
+
+ @Inject()
+ sysSettingsService: SysSettingsService;
+
+
+ async reloadHiddenStatus(immediate = false) {
+ const hidden = await this.getHiddenSetting()
+ if (hidden.enabled) {
+ logger.error("启动站点隐藏");
+ hiddenStatus.isHidden = false
+ if (immediate) {
+ hiddenStatus.isHidden = true;
+ }
+ const autoHiddenTimes = hidden.autoHiddenTimes || 5;
+ hiddenStatus.startCheck(autoHiddenTimes);
+ } else {
+ logger.error("关闭站点隐藏");
+ hiddenStatus.isHidden = false;
+ hiddenStatus.stopCheck()
+ }
+ }
+
+
+ async getHiddenSetting(): Promise {
+ const safeSetting = await this.getSafeSetting()
+ return safeSetting.hidden || {enabled: false}
+ }
+
+ async getSafeSetting() {
+ return await this.sysSettingsService.getSetting(SysSafeSetting)
+ }
+
+ async hiddenImmediately() {
+ return hiddenStatus.isHidden = true
+ }
+
+ async saveSafeSetting(body: SysSafeSetting) {
+
+ // 更新hidden配置
+ if (body.hidden.openPassword) {
+ body.hidden.openPassword = utils.hash.md5(body.hidden.openPassword);
+ }
+ const blankSetting = new SysSafeSetting()
+ const setting = await this.getSafeSetting()
+ const newSetting = merge(blankSetting, cloneDeep(setting), body);
+ if (newSetting.hidden?.enabled && !newSetting.hidden?.openPassword) {
+ throw new Error("首次设置需要填写解锁密码")
+ }
+
+ if(isNaN(newSetting.hidden.autoHiddenTimes) || newSetting.hidden.autoHiddenTimes < 1){
+ newSetting.hidden.autoHiddenTimes = 1
+ }
+
+ await this.sysSettingsService.saveSetting(newSetting);
+
+ await this.reloadHiddenStatus(false)
+
+ }
+}
diff --git a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-all/index.ts b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-all/index.ts
index e40b637c..263de102 100644
--- a/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-all/index.ts
+++ b/packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-all/index.ts
@@ -128,11 +128,11 @@ export class DeployCertToTencentAll extends AbstractTaskPlugin {
});
let certId:string = null
- if (typeof certId === 'string') {
- certId = this.tencentCertId as string;
- } else {
+ if (typeof certId === 'object') {
//上传
certId = await this.uploadToTencent(access,this.tencentCertId as CertInfo);
+ } else {
+ certId = this.tencentCertId as string;
}
const params = {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 363562ec..d7f73fc7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -46,7 +46,7 @@ importers:
packages/core/acme-client:
dependencies:
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../basic
'@peculiar/x509':
specifier: ^1.11.0
@@ -204,11 +204,11 @@ importers:
packages/core/pipeline:
dependencies:
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../basic
'@certd/plus-core':
- specifier: ^1.33.0
- version: link:../../pro/plus-core
+ specifier: ^1.33.2
+ version: 1.33.2
dayjs:
specifier: ^1.11.7
version: 1.11.13
@@ -412,7 +412,7 @@ importers:
packages/libs/lib-k8s:
dependencies:
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/basic
'@kubernetes/client-node':
specifier: 0.21.0
@@ -452,17 +452,17 @@ importers:
packages/libs/lib-server:
dependencies:
'@certd/acme-client':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/acme-client
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/basic
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/pipeline
'@certd/plus-core':
- specifier: ^1.33.0
- version: link:../../pro/plus-core
+ specifier: ^1.33.2
+ version: 1.33.2
'@midwayjs/cache':
specifier: ~3.14.0
version: 3.14.0
@@ -604,16 +604,16 @@ importers:
packages/plugins/plugin-cert:
dependencies:
'@certd/acme-client':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/acme-client
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/basic
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/pipeline
'@certd/plugin-lib':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../plugin-lib
'@google-cloud/publicca':
specifier: ^1.3.0
@@ -680,10 +680,10 @@ importers:
specifier: ^1.7.10
version: 1.8.0
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/basic
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/pipeline
'@kubernetes/client-node':
specifier: 0.21.0
@@ -771,19 +771,19 @@ importers:
packages/pro/commercial-core:
dependencies:
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../core/basic
'@certd/lib-server':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../libs/lib-server
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../core/pipeline
'@certd/plugin-plus':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../plugin-plus
'@certd/plus-core':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../plus-core
'@midwayjs/core':
specifier: ~3.20.3
@@ -868,22 +868,22 @@ importers:
specifier: ^1.0.2
version: 1.0.2
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../core/basic
'@certd/lib-k8s':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../libs/lib-k8s
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../core/pipeline
'@certd/plugin-cert':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../plugins/plugin-lib
'@certd/plus-core':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../plus-core
ali-oss:
specifier: ^6.21.0
@@ -980,7 +980,7 @@ importers:
packages/pro/plus-core:
dependencies:
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.32.0
version: link:../../core/basic
dayjs:
specifier: ^1.11.7
@@ -1223,6 +1223,9 @@ importers:
sortablejs:
specifier: ^1.15.3
version: 1.15.6
+ spark-md5:
+ specifier: ^3.0.2
+ version: 3.0.2
tailwind-merge:
specifier: ^3.0.2
version: 3.0.2
@@ -1267,10 +1270,10 @@ importers:
version: 0.1.3(zod@3.24.2)
devDependencies:
'@certd/lib-iframe':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../libs/lib-iframe
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/pipeline
'@rollup/plugin-commonjs':
specifier: ^25.0.7
@@ -1450,44 +1453,44 @@ importers:
specifier: ^3.705.0
version: 3.758.0(aws-crt@1.25.3)
'@certd/acme-client':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/acme-client
'@certd/basic':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/basic
'@certd/commercial-core':
- specifier: ^1.33.0
- version: link:../../pro/commercial-core
+ specifier: ^1.33.2
+ version: 1.33.2(better-sqlite3@11.8.1)(encoding@0.1.13)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))
'@certd/jdcloud':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../libs/lib-jdcloud
'@certd/lib-huawei':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../libs/lib-huawei
'@certd/lib-k8s':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../libs/lib-k8s
'@certd/lib-server':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../libs/lib-server
'@certd/midway-flyway-js':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../libs/midway-flyway-js
'@certd/pipeline':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../core/pipeline
'@certd/plugin-cert':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
- specifier: ^1.33.0
+ specifier: ^1.33.2
version: link:../../plugins/plugin-lib
'@certd/plugin-plus':
- specifier: ^1.33.0
- version: link:../../pro/plugin-plus
+ specifier: ^1.33.2
+ version: 1.33.2(encoding@0.1.13)
'@certd/plus-core':
- specifier: ^1.33.0
- version: link:../../pro/plus-core
+ specifier: ^1.33.2
+ version: 1.33.2
'@corsinvest/cv4pve-api-javascript':
specifier: ^8.3.0
version: 8.3.0
@@ -2617,6 +2620,15 @@ packages:
'@better-scroll/zoom@2.5.1':
resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==}
+ '@certd/commercial-core@1.33.2':
+ resolution: {integrity: sha512-LTRvwRAkMEU+knG+/eA8QbyK3EE2Z2eyn4763ILadCY/qHLAWqxg7NUD+fwsuAoByvsr3l5qLPPOF73p5s1iEA==}
+
+ '@certd/plugin-plus@1.33.2':
+ resolution: {integrity: sha512-x8qdJ1qtYfqVNBQ3uWJuFVYUHHnteoaH/3vnYKjgAnEAcosruZAz8h5RwwOjDhR+Vsdda/sSRdjlTCVDLidHZg==}
+
+ '@certd/plus-core@1.33.2':
+ resolution: {integrity: sha512-CsD+/P3Ycne3KzxrZAkFXGpCO9ZQNY4p28WAA2XfKQ6sLIYLuuDBP18V/E7EygfJEZ/c9KJWMkYgx/4wGGvb6w==}
+
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -14791,6 +14803,75 @@ snapshots:
dependencies:
'@better-scroll/core': 2.5.1
+ '@certd/commercial-core@1.33.2(better-sqlite3@11.8.1)(encoding@0.1.13)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))':
+ dependencies:
+ '@certd/basic': link:packages/core/basic
+ '@certd/lib-server': link:packages/libs/lib-server
+ '@certd/pipeline': link:packages/core/pipeline
+ '@certd/plugin-plus': 1.33.2(encoding@0.1.13)
+ '@certd/plus-core': 1.33.2
+ '@midwayjs/core': 3.20.3
+ '@midwayjs/koa': 3.20.3
+ '@midwayjs/logger': 3.4.2
+ '@midwayjs/typeorm': 3.20.3
+ alipay-sdk: 4.13.0
+ dayjs: 1.11.13
+ typeorm: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))
+ wechatpay-node-v3: 2.2.1
+ transitivePeerDependencies:
+ - '@google-cloud/spanner'
+ - '@sap/hana-client'
+ - better-sqlite3
+ - encoding
+ - hdb-pool
+ - ioredis
+ - mongodb
+ - mssql
+ - mysql2
+ - oracledb
+ - pg
+ - pg-native
+ - pg-query-stream
+ - proxy-agent
+ - redis
+ - reflect-metadata
+ - sql.js
+ - sqlite3
+ - supports-color
+ - ts-node
+ - typeorm-aurora-data-api-driver
+
+ '@certd/plugin-plus@1.33.2(encoding@0.1.13)':
+ dependencies:
+ '@alicloud/pop-core': 1.8.0
+ '@baiducloud/sdk': 1.0.2
+ '@certd/basic': link:packages/core/basic
+ '@certd/lib-k8s': link:packages/libs/lib-k8s
+ '@certd/pipeline': link:packages/core/pipeline
+ '@certd/plugin-cert': link:packages/plugins/plugin-cert
+ '@certd/plugin-lib': link:packages/plugins/plugin-lib
+ '@certd/plus-core': 1.33.2
+ ali-oss: 6.22.0
+ baidu-aip-sdk: 4.16.16
+ basic-ftp: 5.0.5
+ cos-nodejs-sdk-v5: 2.14.6
+ crypto-js: 4.2.0
+ dayjs: 1.11.13
+ form-data: 4.0.2
+ https-proxy-agent: 7.0.6
+ jsencrypt: 3.3.2
+ qiniu: 7.14.0
+ tencentcloud-sdk-nodejs: 4.0.1045(encoding@0.1.13)
+ transitivePeerDependencies:
+ - encoding
+ - proxy-agent
+ - supports-color
+
+ '@certd/plus-core@1.33.2':
+ dependencies:
+ '@certd/basic': link:packages/core/basic
+ dayjs: 1.11.13
+
'@colors/colors@1.5.0':
optional: true