diff --git a/AGENTS.md b/AGENTS.md index 92d02adb9..081b24094 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -229,5 +229,6 @@ Certd 是可私有化部署的 SSL/TLS 证书自动化管理平台,提供 Web - 审计日志是 Plus 版功能,非 Plus 版不会写入。 - Controller 继承 `BaseController`,通过 `this.auditLog({ content: "xxx" })` 记录日志。 +- Controller 中的 `@Post("/add", { summary: "xxxx" })`, 这个summary是必须要的,他是日志action字段的来源 - `getAuditType()` 返回类型常量,中间件自动从 ctx.path 判定 scope(`/api/sys/` → system,其他 → user)。 - 操作日志有系统级(scope=system)和用户级(scope=user)区分。 diff --git a/packages/ui/certd-server/src/controller/sys/access/access-controller.ts b/packages/ui/certd-server/src/controller/sys/access/access-controller.ts index d45b7b8e4..bef93c9ed 100644 --- a/packages/ui/certd-server/src/controller/sys/access/access-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/access/access-controller.ts @@ -37,12 +37,12 @@ export class SysAccessController extends AccessController { return await super.list(body); } - @Post("/add", { description: "sys:settings:edit" }) + @Post("/add", { description: "sys:settings:edit", summary: "添加系统授权配置" }) async add(@Body(ALL) bean: any) { return await super.add(bean); } - @Post("/update", { description: "sys:settings:edit" }) + @Post("/update", { description: "sys:settings:edit", summary: "更新系统授权配置" }) async update(@Body(ALL) bean: any) { return await super.update(bean); } @@ -51,7 +51,7 @@ export class SysAccessController extends AccessController { return await super.info(id); } - @Post("/delete", { description: "sys:settings:edit" }) + @Post("/delete", { description: "sys:settings:edit", summary: "删除系统授权配置" }) async delete(@Query("id") id: number) { return await super.delete(id); } diff --git a/packages/ui/certd-server/src/controller/sys/account/account-controller.ts b/packages/ui/certd-server/src/controller/sys/account/account-controller.ts index ab4c595d1..8a9ac4953 100644 --- a/packages/ui/certd-server/src/controller/sys/account/account-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/account/account-controller.ts @@ -29,7 +29,6 @@ export class BasicController extends BaseController { throw new Error("用户ID不能为空"); } await this.plusService.userPreBind(body.userId); - await this.auditLog({ content: `预绑定了用户(ID:${body.userId})` }); return this.ok({}); } @@ -41,7 +40,7 @@ export class BasicController extends BaseController { const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); installInfo.bindUserId = body.userId; await this.sysSettingsService.saveSetting(installInfo); - await this.auditLog({ content: `绑定了用户(ID:${body.userId})` }); + await this.auditLog({ content: `绑定了袖手科技用户(ID:${body.userId})` }); return this.ok({}); } @@ -50,14 +49,13 @@ export class BasicController extends BaseController { const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo); installInfo.bindUserId = null; await this.sysSettingsService.saveSetting(installInfo); - await this.auditLog({ content: "解绑了用户" }); + await this.auditLog({ content: "解绑了袖手科技用户" }); return this.ok({}); } @Post("/updateLicense", { description: "sys:settings:edit", summary: "更新许可证" }) public async updateLicense(@Body(ALL) body: { license: string }) { await this.plusService.updateLicense(body.license); - await this.auditLog({ content: "更新了许可证" }); return this.ok(true); } } 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 index 30d0109ca..401ddc8b3 100644 --- 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 @@ -36,10 +36,10 @@ export class SysSettingsController extends BaseController { /** * 立即隐藏 */ - @Post("/hidden", { description: "sys:settings:edit", summary: "立刻隐藏系统" }) + @Post("/hidden", { description: "sys:settings:edit", summary: "隐藏系统" }) async hiddenImmediate() { await this.safeService.hiddenImmediately(); - await this.auditLog({ content: "立刻隐藏了系统" }); + await this.auditLog({ content: "隐藏了系统" }); return this.ok({}); } } diff --git a/packages/ui/certd-server/src/controller/user/enterprise/project-controller.ts b/packages/ui/certd-server/src/controller/user/enterprise/project-controller.ts index 83727de61..41f973e6d 100644 --- a/packages/ui/certd-server/src/controller/user/enterprise/project-controller.ts +++ b/packages/ui/certd-server/src/controller/user/enterprise/project-controller.ts @@ -68,7 +68,7 @@ export class UserProjectController extends BaseController { async applyJoin(@Body(ALL) body: any) { const userId = this.getUserId(); const res = await this.service.applyJoin({ userId, projectId: body.projectId }); - this.auditLog({ content: "申请了加入项目" }); + this.auditLog({ content: `申请了加入项目 项目ID:${body.projectId}` }); return this.ok(res); } @@ -90,7 +90,7 @@ export class UserProjectController extends BaseController { status, permission, }); - this.auditLog({ content: "更新了项目成员" }); + this.auditLog({ content: `更新了项目成员 「项目ID:${projectId} 用户ID:${userId}」` }); return this.ok(res); } @@ -99,7 +99,7 @@ export class UserProjectController extends BaseController { const { projectId } = await this.getProjectUserIdAdmin(); const { status, permission, userId } = body; const res = await this.service.approveJoin({ userId, projectId: projectId, status, permission }); - this.auditLog({ content: "审批了加入项目申请" }); + this.auditLog({ content: `审批了加入项目申请 「项目ID:${projectId} 用户ID:${userId}」` }); return this.ok(res); } @@ -110,7 +110,7 @@ export class UserProjectController extends BaseController { projectId, userId: body.userId, }); - this.auditLog({ content: "删除了项目成员" }); + this.auditLog({ content: `删除了项目成员 「项目ID:${projectId} 用户ID:${body.userId}」` }); return this.ok(); } @@ -122,7 +122,7 @@ export class UserProjectController extends BaseController { projectId, userId, }); - this.auditLog({ content: "离开了项目" }); + this.auditLog({ content: `离开了项目 「项目ID:${projectId} 用户ID:${userId}」` }); return this.ok(); } } diff --git a/packages/ui/certd-server/src/controller/user/enterprise/transfer-controller.ts b/packages/ui/certd-server/src/controller/user/enterprise/transfer-controller.ts index c31c92767..bb1dfebe2 100644 --- a/packages/ui/certd-server/src/controller/user/enterprise/transfer-controller.ts +++ b/packages/ui/certd-server/src/controller/user/enterprise/transfer-controller.ts @@ -43,7 +43,7 @@ export class TransferController extends BaseController { const { projectId } = await this.getProjectUserIdRead(); const userId = this.getUserId(); await this.service.transferAll(userId, projectId); - this.auditLog({ content: "迁移了项目资源" }); + this.auditLog({ content: `迁移了项目资源 「用户ID:${userId} -> 项目ID:${projectId}」` }); return this.ok(); } } diff --git a/packages/ui/certd-server/src/controller/user/mine/email-controller.ts b/packages/ui/certd-server/src/controller/user/mine/email-controller.ts index c1b062e17..94cdca4ac 100644 --- a/packages/ui/certd-server/src/controller/user/mine/email-controller.ts +++ b/packages/ui/certd-server/src/controller/user/mine/email-controller.ts @@ -22,7 +22,7 @@ export class EmailController extends BaseController { public async test(@Body("receiver") receiver) { const userId = super.getUserId(); await this.emailService.test(userId, receiver); - this.auditLog({ content: "测试了邮件发送" }); + this.auditLog({ content: "测试邮件发送" }); return this.ok({}); } @@ -37,7 +37,7 @@ export class EmailController extends BaseController { public async add(@Body("email") email) { const userId = super.getUserId(); await this.emailService.add(userId, email); - this.auditLog({ content: "添加了邮件" }); + this.auditLog({ content: `添加了邮箱地址 「${email}」` }); return this.ok({}); } @@ -45,7 +45,7 @@ export class EmailController extends BaseController { public async delete(@Body("email") email) { const userId = super.getUserId(); await this.emailService.delete(userId, email); - this.auditLog({ content: "删除了邮件" }); + this.auditLog({ content: `删除了邮箱地址 「${email}」` }); return this.ok({}); } } diff --git a/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts b/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts index 7d6b5f8ab..ff12be6dd 100644 --- a/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts +++ b/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts @@ -101,7 +101,7 @@ export class MineController extends BaseController { avatar: body.avatar, nickName: body.nickName, }); - this.auditLog({ content: "更新了个人资料" }); + this.auditLog({ content: `更新了个人资料` }); return this.ok({}); } @@ -140,10 +140,16 @@ export class MineController extends BaseController { phoneCode: body.phoneCode, mobile: body.mobile, }); - this.auditLog({ content: "修改了手机号" }); + //手机号脱敏处理 + const mobile = this.maskPhone(body.mobile); + this.auditLog({ content: `修改了手机号 「${mobile}」` }); return this.ok({}); } + private maskPhone(phone: string) { + return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2"); + } + @Post("/contact/email", { description: Constants.per.authOnly, summary: "绑定或修改邮箱" }) public async updateEmail(@Body(ALL) body: { email: string; validateCode: string; identityValidationCode: string }) { const userId = this.getUserId(); @@ -157,7 +163,7 @@ export class MineController extends BaseController { await this.userService.updateEmail(userId, { email: body.email, }); - this.auditLog({ content: "修改了邮箱" }); + this.auditLog({ content: `修改了邮箱地址 「${body.email}」` }); return this.ok({}); } diff --git a/packages/ui/certd-server/src/controller/user/mine/passkey-controller.ts b/packages/ui/certd-server/src/controller/user/mine/passkey-controller.ts index 5d7603c37..8205e4379 100644 --- a/packages/ui/certd-server/src/controller/user/mine/passkey-controller.ts +++ b/packages/ui/certd-server/src/controller/user/mine/passkey-controller.ts @@ -67,7 +67,7 @@ export class MinePasskeyController extends BaseController { const result = await this.passkeyService.registerPasskey(userId, response, challenge, deviceName, this.ctx); - this.auditLog({ content: "注册了Passkey" }); + this.auditLog({ content: `注册了Passkey ${deviceName}` }); return this.ok(result); } @@ -96,7 +96,7 @@ export class MinePasskeyController extends BaseController { } await this.passkeyService.delete([passkey.id]); - this.auditLog({ content: "解绑了Passkey" }); + this.auditLog({ content: `解绑了Passkey ${passkey.deviceName}` }); return this.ok({}); } } diff --git a/packages/ui/certd-server/src/controller/user/mine/setting-two-factor-controller.ts b/packages/ui/certd-server/src/controller/user/mine/setting-two-factor-controller.ts index 75b3c96c0..07c97aabf 100644 --- a/packages/ui/certd-server/src/controller/user/mine/setting-two-factor-controller.ts +++ b/packages/ui/certd-server/src/controller/user/mine/setting-two-factor-controller.ts @@ -47,7 +47,7 @@ export class UserTwoFactorSettingController extends BaseController { } await this.service.saveSetting(userId, null, setting); - this.auditLog({ content: "保存了双因子认证设置" }); + this.auditLog({ content: `保存了双因子认证设置 ${setting.authenticator.enabled ? "启用" : "禁用"}` }); return this.ok({}); } @@ -68,7 +68,7 @@ export class UserTwoFactorSettingController extends BaseController { userId, verifyCode: bean.verifyCode, }); - this.auditLog({ content: "保存了验证器设置" }); + this.auditLog({ content: `保存了验证器设置` }); return this.ok(); } diff --git a/packages/ui/certd-server/src/controller/user/mine/user-settings-controller.ts b/packages/ui/certd-server/src/controller/user/mine/user-settings-controller.ts index e8eb8424d..0c523ee1e 100644 --- a/packages/ui/certd-server/src/controller/user/mine/user-settings-controller.ts +++ b/packages/ui/certd-server/src/controller/user/mine/user-settings-controller.ts @@ -94,7 +94,7 @@ export class UserSettingsController extends CrudController merge(setting, bean); await this.service.saveSetting(userId, null, setting); - this.auditLog({ content: "保存了授权设置" }); + this.auditLog({ content: `保存了授权设置 「${setting.allowAdminViewCerts ? "允许管理员查看证书" : "禁止管理员查看证书"}」` }); return this.ok({}); } } diff --git a/packages/ui/certd-server/src/controller/user/monitor/site-info-controller.ts b/packages/ui/certd-server/src/controller/user/monitor/site-info-controller.ts index 036a78ae1..30a1d803d 100644 --- a/packages/ui/certd-server/src/controller/user/monitor/site-info-controller.ts +++ b/packages/ui/certd-server/src/controller/user/monitor/site-info-controller.ts @@ -111,7 +111,7 @@ export class SiteInfoController extends CrudController { await this.checkOwner(this.service, id, "write"); const res = await super.delete(id); this.auditLog({ - content: `删除了站点监控(ID:${id})`, + content: `删除了站点监控 「ID:${id}」`, }); return res; } @@ -150,7 +150,7 @@ export class SiteInfoController extends CrudController { userId, projectId, }); - this.auditLog({ content: "导入了站点监控" }); + this.auditLog({ content: `导入了站点监控 「${body.text}」` }); return this.ok(); } @@ -222,6 +222,7 @@ export class SiteInfoController extends CrudController { id: bean.id, disabled: bean.disabled, }); + this.auditLog({ content: `${bean.disabled ? "禁用" : "启用"}` }); return this.ok(); } @@ -239,6 +240,7 @@ export class SiteInfoController extends CrudController { merge(setting, bean); await this.service.saveSetting(userId, projectId, setting); + this.auditLog({}); return this.ok({}); } } diff --git a/packages/ui/certd-server/src/controller/user/monitor/site-ip-controller.ts b/packages/ui/certd-server/src/controller/user/monitor/site-ip-controller.ts index 65008f4b7..c87784a1b 100644 --- a/packages/ui/certd-server/src/controller/user/monitor/site-ip-controller.ts +++ b/packages/ui/certd-server/src/controller/user/monitor/site-ip-controller.ts @@ -132,7 +132,7 @@ export class SiteInfoController extends CrudController { siteId: body.siteId, projectId, }); - this.auditLog({ content: "导入了站点IP" }); + this.auditLog({ content: `导入了站点IP 「${body.text}」` }); return this.ok(); } } diff --git a/packages/ui/certd-server/src/modules/sys/enterprise/service/audit-constants.ts b/packages/ui/certd-server/src/modules/sys/enterprise/service/audit-constants.ts index c8689ba0b..ba7d61a9f 100644 --- a/packages/ui/certd-server/src/modules/sys/enterprise/service/audit-constants.ts +++ b/packages/ui/certd-server/src/modules/sys/enterprise/service/audit-constants.ts @@ -25,6 +25,13 @@ export const AuditType = { jobHistory: { value: "jobHistory", label: "监控历史", color: "default" }, account: { value: "account", label: "账号管理", color: "geekblue" }, plus: { value: "plus", label: "Plus许可", color: "volcano" }, + site: { value: "site", label: "站点设置", color: "blue" }, + wallet: { value: "wallet", label: "钱包管理", color: "gold" }, + invite: { value: "invite", label: "邀请管理", color: "cyan" }, + trade: { value: "trade", label: "交易订单", color: "volcano" }, + product: { value: "product", label: "产品管理", color: "purple" }, + activationCode: { value: "activationCode", label: "激活码管理", color: "orange" }, + userSuite: { value: "userSuite", label: "用户套餐", color: "geekblue" }, } as const; export const AuditAction = {