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 @@
-
-
系统设置
-
-
通知邮箱设置
-
-
-
-
-
- {{ message }}
-
-
-
-
-
-
+
+
系统设置
+
加载中...
+
+
+
通知邮箱设置
+
+
+
+
+
+ {{ message }}
+
+
+
+
+
+
+
-
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';
// 检查内容,将