From 73bbe44fbc515abdb5f6c2ab6a9a6e2db3e3f4a5 Mon Sep 17 00:00:00 2001 From: anghunk Date: Mon, 19 Jan 2026 17:02:19 +0800 Subject: [PATCH] =?UTF-8?q?refactor(cors):=20=E7=AE=80=E5=8C=96CORS?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=B9=B6=E7=A7=BB=E9=99=A4=E6=9C=AA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat(email): 提取邮箱验证逻辑到共享模块并增强验证 docs: 更新文档移除不再使用的ALLOW_ORIGIN配置 style(admin): 为设置页面添加加载状态和样式优化 fix(comments): 在邮件发送前增加邮箱格式验证 --- .claude/CLAUDE.md | 15 +- README.md | 17 +- cwd-comments-admin/src/views/CommentsView.vue | 32 +++ cwd-comments-admin/src/views/SettingsView.vue | 230 +++++++++++------- .../src/api/admin/setAdminEmail.ts | 5 +- .../src/api/public/postComment.ts | 8 +- cwd-comments-api/src/utils/cors.ts | 2 +- cwd-comments-api/src/utils/email.ts | 25 +- docs/guide/backend-config.md | 1 - 9 files changed, 217 insertions(+), 118 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 793fb6a..41f98c4 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -62,14 +62,13 @@ src/ ## 环境变量 -| 变量名 | 说明 | 必填 | -|--------|------|------| -| `ADMIN_NAME` | 管理员用户名 | 是 | -| `ADMIN_PASSWORD` | 管理员密码 | 是 | -| `ALLOW_ORIGIN` | CORS 白名单(逗号分隔) | 是 | -| `RESEND_API_KEY` | Resend API 密钥 | 否 | -| `RESEND_FROM_EMAIL` | 发件邮箱 | 否 | -| `EMAIL_ADDRESS` | 站长接收邮箱 | 否 | +| 变量名 | 说明 | 必填 | +| ------------------- | --------------- | ---- | +| `ADMIN_NAME` | 管理员用户名 | 是 | +| `ADMIN_PASSWORD` | 管理员密码 | 是 | +| `RESEND_API_KEY` | Resend API 密钥 | 否 | +| `RESEND_FROM_EMAIL` | 发件邮箱 | 否 | +| `EMAIL_ADDRESS` | 站长接收邮箱 | 否 | ## 本地开发 diff --git a/README.md b/README.md index e3b9a0c..b130df8 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,13 @@ Cloudflare Worker 版本基于 Cloudflare Workers + D1 + KV 实现,无需服务器即可部署运行的评论组件。 -> 基于 https://github.com/Motues/Momo-Backend 进行二次开发的 Cloudflare Worker 版本,做了大量扩展更新。 - [文档地址](https://cwd-comments.zishu.me) ## 特性 - ⚡️ **极速响应**:基于 Cloudflare 全球边缘网络 - 🔒 **安全可靠**:内置管理员认证、CORS 保护 -- 📧 **邮件通知**:支持 Resend 邮件服务 +- 📧 **邮件通知**:基于 Cloudflare Workers 发送邮件 - 🎨 **易于集成**:提供完整的 REST API ## 前置要求 @@ -27,13 +25,18 @@ Cloudflare Worker 版本基于 Cloudflare Workers + D1 + KV 实现,无需服 ```bash # 克隆项目 git clone https://github.com/anghunk/cwd-comments -cd cwd-comments -# 安装依赖 +# API 项目 +cd cwd-comments-api +# 部署请查看文档 + +# 前端项目 +cd cwd-comments-web npm install + ``` ## 配置 -- [后端配置](./backend-config.md) -- [前端配置](./frontend-config.md) +- [后端配置](https://cwd-comments-docs.zishu.me/guide/backend-config.html) +- [前端配置](https://cwd-comments-docs.zishu.me/guide/frontend-config.html) diff --git a/cwd-comments-admin/src/views/CommentsView.vue b/cwd-comments-admin/src/views/CommentsView.vue index b6e544c..f551f03 100644 --- a/cwd-comments-admin/src/views/CommentsView.vue +++ b/cwd-comments-admin/src/views/CommentsView.vue @@ -399,6 +399,38 @@ onMounted(() => { text-align: center; } +.loading-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 0; + gap: 12px; +} + +.loading-spinner { + width: 32px; + height: 32px; + border: 3px solid #f0f0f0; + border-top-color: #0969da; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +.loading-text { + font-size: 14px; + color: #57606a; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + .pagination { margin-top: 8px; display: flex; diff --git a/cwd-comments-admin/src/views/SettingsView.vue b/cwd-comments-admin/src/views/SettingsView.vue index 6868304..d2ad0cb 100644 --- a/cwd-comments-admin/src/views/SettingsView.vue +++ b/cwd-comments-admin/src/views/SettingsView.vue @@ -1,151 +1,199 @@ - diff --git a/cwd-comments-api/src/api/admin/setAdminEmail.ts b/cwd-comments-api/src/api/admin/setAdminEmail.ts index 6c4add1..a6f8495 100644 --- a/cwd-comments-api/src/api/admin/setAdminEmail.ts +++ b/cwd-comments-api/src/api/admin/setAdminEmail.ts @@ -1,9 +1,6 @@ import { Context } from 'hono'; import { Bindings } from '../../bindings'; - -function isValidEmail(email: string) { - return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); -} +import { isValidEmail } from '../../utils/email'; export const setAdminEmail = async (c: Context<{ Bindings: Bindings }>) => { try { diff --git a/cwd-comments-api/src/api/public/postComment.ts b/cwd-comments-api/src/api/public/postComment.ts index 26707ea..9de7f0d 100644 --- a/cwd-comments-api/src/api/public/postComment.ts +++ b/cwd-comments-api/src/api/public/postComment.ts @@ -1,7 +1,7 @@ import { Context } from 'hono'; import { UAParser } from 'ua-parser-js'; import { Bindings } from '../../bindings'; -import { sendCommentNotification, sendCommentReplyNotification } from '../../utils/email'; +import { sendCommentNotification, sendCommentReplyNotification, isValidEmail } from '../../utils/email'; // 检查内容,将