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'; // 检查内容,将