本文引用的文件
本文件面向 Cosmoe Bot 的数据管理系统,聚焦于 Cloudflare KV 的配置与使用、会话状态管理、数据模型设计、数据访问模式最佳实践、迁移与备份恢复策略、性能优化以及与 Cosmoe 服务端 API 的数据同步与冲突解决策略。文档基于仓库中实际代码进行分析,帮助开发者快速理解并维护该系统。
调度层:基于 Cron 定时任务,向已注册用户推送新活动通知,并持久化最新活动 ID。
graph TB
A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
B --> C["会话存储: Cloudflare KV(COSMOE_STORAGE)"]
B --> D["命令处理器<br/>login/history/bookEvent/cancel"]
D --> E["客户端: src/client/cosmoe.ts"]
A --> F["调度器: src/scheduler/index.ts"]
F --> G["KV(COSMOE_STORAGE) 最新活动ID"]
F --> H["KV(COSMOE_CREDENTIALS) 注册用户列表"]
图表来源
章节来源
章节来源
下图展示从用户交互到服务端 API 与 KV 存储的整体流程。
sequenceDiagram
participant U as "用户"
participant B as "Bot(grammy)"
participant CMD as "命令处理器"
participant KV as "Cloudflare KV"
participant API as "Cosmoe API 客户端"
participant S as "Cosmoe 服务端"
U->>B : "/login" 或 "/events" 等命令
B->>CMD : 分发到对应处理器
CMD->>KV : 读取/写入会话/凭证/配置
CMD->>API : 调用认证/查询/预约/取消等接口
API->>S : 发起 HTTP 请求
S-->>API : 返回 JSON 结果
API-->>CMD : 返回业务结果
CMD-->>B : 组织消息回复
B-->>U : 发送消息/内联键盘
图表来源
错误处理
读写异常均捕获并记录日志,避免中断对话流程。
flowchart TD
Start(["进入命令"]) --> GetCreds["从 KV(COSMOE_CREDENTIALS) 获取用户凭证"]
GetCreds --> HasCreds{"是否存在凭证?"}
HasCreds -- 否 --> PromptLogin["提示先执行 /login"]
HasCreds -- 是 --> UseClient["初始化 CosmoeClient 并 setCredentials"]
UseClient --> CallAPI["调用 Cosmoe API 接口"]
CallAPI --> UpdateKV["必要时更新 KV(COSMOE_STORAGE/COSMOE_CREDENTIALS)"]
UpdateKV --> Reply["构造并发送回复"]
PromptLogin --> Reply
图表来源
章节来源
销毁
会话结束自动清理;注销命令可结合业务逻辑删除相关 KV 条目(当前实现未显式删除,建议在 logout 中扩展)。
sequenceDiagram
participant U as "用户"
participant Conv as "对话(Conversation)"
participant KV as "KV(COSMOE_STORAGE)"
participant Login as "登录处理器"
U->>Conv : 触发 /login
Conv->>Login : 进入登录对话
Login->>KV : 写入凭证(JSON)
KV-->>Login : 成功
Login-->>Conv : 登录成功
Conv-->>U : 返回结果
图表来源
章节来源
预约记录
查询:通过 CosmoeClient.getMyBookings 获取。
classDiagram
class UserInfo {
+number id
+string username
+string email
+string user_identity
+string role
+number is_active
+string created_at
}
class Event {
+string id
+string name
+string description
+string event_date
+string cover_image_url
+string description_brief
}
class TimeSlot {
+string range
+string price
+number capacity
+number remaining
}
class EventDetail {
+number id
+string name
+string description
+string event_date
+string time_slots_with_prices
+string cover_image_url
+string detail_image_urls
+number is_listed
+number login_required
+number allow_coupons
+string created_at
+TimeSlot[] slots
+string[] gallery
}
class Booking {
+number id
+string status
+string booking_date
+string time_slot
+string final_price
+string payment_order_id
+string notes_by_user
+string created_at
+string event_name
}
class Credentials {
+number user_id
+string token
+number timestamp
}
EventDetail --> TimeSlot : "包含多个"
Credentials <.. UserInfo : "关联用户"
Booking <.. UserInfo : "关联用户"
图表来源
章节来源
章节来源
章节来源
章节来源
章节来源
冲突解决
取消与变更:通过回调确认与服务端接口完成,失败时保留本地状态并提示用户重试。
sequenceDiagram
participant Cron as "定时任务"
participant KV as "KV(COSMOE_STORAGE)"
participant API as "Cosmoe API"
participant Users as "已注册用户"
Cron->>KV : 读取 latestEventId
Cron->>API : 获取所有活动
API-->>Cron : 返回活动列表
Cron->>KV : 更新 latestEventId(最大ID)
loop 遍历新活动
Cron->>Users : 发送通知
end
图表来源
章节来源
配置依赖
Wrangler 将 KV 命名空间绑定到环境变量,供运行时访问。
graph LR
Pkg["package.json 依赖"] --> G["@grammyjs/conversations"]
Pkg --> GC["@grammyjs/storage-cloudflare"]
Pkg --> GM["grammy"]
W["wrangler.jsonc"] --> KVC["COSMOE_CREDENTIALS"]
W --> KVS["COSMOE_STORAGE"]
图表来源
章节来源
章节来源
章节来源
本系统通过 Cloudflare KV 实现会话状态与业务数据的持久化,结合 @grammyjs/conversations 与 Cosmoe API 客户端,提供了完整的用户交互与数据同步能力。建议在现有基础上进一步完善凭证与会话的生命周期管理、KV TTL 与缓存策略、以及对外部 API 的重试与限流机制,以提升稳定性与性能。
章节来源