From 437d956cad5067a8a1ec0b4d65782a15c39a761b Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 12 Dec 2025 23:39:09 +0800 Subject: [PATCH] chore: email template --- packages/core/basic/src/utils/util.env.ts | 2 +- packages/ui/certd-server/package.json | 2 +- .../certd-server/src/modules/auto/auto-z.ts | 3 +- .../src/modules/basic/service/code-service.ts | 8 ++- .../src/plugins/plugin-template/api.ts | 10 ++++ .../plugin-template/email/plugin-base.ts | 57 +++++++++++++++++++ .../plugin-template/email/plugin-register.ts | 28 +++++++++ .../src/plugins/plugin-template/index.ts | 0 8 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 packages/ui/certd-server/src/plugins/plugin-template/api.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-template/email/plugin-base.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-template/email/plugin-register.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-template/index.ts diff --git a/packages/core/basic/src/utils/util.env.ts b/packages/core/basic/src/utils/util.env.ts index 4454fff7d..6f65775b1 100644 --- a/packages/core/basic/src/utils/util.env.ts +++ b/packages/core/basic/src/utils/util.env.ts @@ -1,4 +1,4 @@ export function isDev() { - const nodeEnv = process.env.NODE_ENV || ''; + const nodeEnv = process.env.NODE_ENV || 'dev'; return nodeEnv === 'development' || nodeEnv.includes('local') || nodeEnv.startsWith('dev'); } diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index a78bccdcf..59d5c2f51 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -6,7 +6,7 @@ "type": "module", "scripts": { "start": "cross-env NODE_ENV=production node --optimize-for-size ./bootstrap.js", - "dev-start": "mwtsc --watch --run @midwayjs/mock/app", + "dev-start": "cross-env NODE_ENV=dev & mwtsc --watch --run @midwayjs/mock/app", "dc": "cd ../../../ && pnpm run dev", "dev": "cross-env NODE_ENV=local & pnpm run dev-start", "dev-commlocal": "cross-env NODE_ENV=dev-commlocal mwtsc --watch --run @midwayjs/mock/app", diff --git a/packages/ui/certd-server/src/modules/auto/auto-z.ts b/packages/ui/certd-server/src/modules/auto/auto-z.ts index 3fe499880..d1cc836d2 100644 --- a/packages/ui/certd-server/src/modules/auto/auto-z.ts +++ b/packages/ui/certd-server/src/modules/auto/auto-z.ts @@ -26,6 +26,7 @@ export class AutoZPrint { async init() { //监听https this.startHttpsServer(); + logger.info("ENV:", process.env.NODE_ENV); if (isDev()) { this.startHeapLog(); } @@ -49,7 +50,7 @@ export class AutoZPrint { setInterval(() => { const mu = process.memoryUsage(); logger.info(`rss:${format(mu.rss)},heapUsed: ${format(mu.heapUsed)},heapTotal: ${format(mu.heapTotal)},external: ${format(mu.external)}`); - }, 60000); + }, 20000); } startHttpsServer() { diff --git a/packages/ui/certd-server/src/modules/basic/service/code-service.ts b/packages/ui/certd-server/src/modules/basic/service/code-service.ts index 13f361947..e7ec6abac 100644 --- a/packages/ui/certd-server/src/modules/basic/service/code-service.ts +++ b/packages/ui/certd-server/src/modules/basic/service/code-service.ts @@ -109,8 +109,14 @@ export class CodeService { const code = randomNumber(verificationCodeLength); + const templateData = { + code, duration, siteTitle + } + + const titleTemplate = opts?.title? + const title = `【${siteTitle}】${!!opts?.title ? opts.title : '验证码'}`; - const content = !!opts.content ? this.compile(opts.content)({code, duration}) : `您的验证码是${code},请勿泄露`; + const content = !!opts.content ? this.compile(opts.content)(templateData) : `您的验证码是${code},请勿泄露`; await this.emailService.send({ subject: title, diff --git a/packages/ui/certd-server/src/plugins/plugin-template/api.ts b/packages/ui/certd-server/src/plugins/plugin-template/api.ts new file mode 100644 index 000000000..4a8811df5 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-template/api.ts @@ -0,0 +1,10 @@ + +export type BuildContentReq = { + data: any; +} + +export type BuildContentReply = Record; + +export interface ITemplateProvider { + buildContent: (params: BuildContentReq) => Promise; +} \ No newline at end of file diff --git a/packages/ui/certd-server/src/plugins/plugin-template/email/plugin-base.ts b/packages/ui/certd-server/src/plugins/plugin-template/email/plugin-base.ts new file mode 100644 index 000000000..80711281c --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-template/email/plugin-base.ts @@ -0,0 +1,57 @@ +import { AddonInput, BaseAddon } from "@certd/lib-server"; +import { BuildContentReply, BuildContentReq, ITemplateProvider } from "../api.js"; +import { get } from "lodash-es"; + + +export class BaseEmailTemplateProvider extends BaseAddon implements ITemplateProvider { + @AddonInput({ + title: "配置说明", + component:{ + name:"a-alert", + props:{ + type:"info", + message:"在标题和内容模版中,通过${param}引用参数,例如: 感谢注册${siteTitle},您的注册验证码为:${code}", + } + }, + order: 1, + col:{span:24}, + }) + useIntro = ""; + + @AddonInput({ + title: "邮件标题模版", + required: true, + order: 10, + }) + titleTemplate = ""; + + @AddonInput({ + title: "邮件内容模版", + component: { + placeholder: "邮件内容模版", + }, + order: 20, + required: true, + }) + contentTemplate = ""; + + + async buildContent(params: BuildContentReq) : Promise{ + const title = this.compile(this.titleTemplate)(params.data) + const content = this.compile(this.contentTemplate)(params.data) + return { + title, + content, + } + }; + + compile(templateString: string) { + return function(data:any):string { + return templateString.replace(/\${(.*?)}/g, (match, key) => { + const value = get(data, key, ''); + return String(value); + }); + }; + } + +} diff --git a/packages/ui/certd-server/src/plugins/plugin-template/email/plugin-register.ts b/packages/ui/certd-server/src/plugins/plugin-template/email/plugin-register.ts new file mode 100644 index 000000000..1db299b86 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-template/email/plugin-register.ts @@ -0,0 +1,28 @@ +import { AddonInput, IsAddon } from "@certd/lib-server"; +import { BaseEmailTemplateProvider } from "./plugin-base.js"; + +@IsAddon({ + addonType: "emailTemplate", + name: 'register', + title: '注册邮件模版', + desc: '注册邮件模版', + icon:"simple-icons:gitee:red", + showTest: false, +}) +export class RegisterEmailTemplateProvider extends BaseEmailTemplateProvider { + + @AddonInput({ + title: "可用参数", + component:{ + name:"a-alert", + props:{ + type:"info", + message:"站点名称:${siteTitle};注册验证码:${code};有效期:${duration}分钟", + } + }, + order: 5, + col:{span:24}, + }) + paramIntro = ""; + +} diff --git a/packages/ui/certd-server/src/plugins/plugin-template/index.ts b/packages/ui/certd-server/src/plugins/plugin-template/index.ts new file mode 100644 index 000000000..e69de29bb