# 活动管理系统
**本文档引用的文件**
- [src/index.ts](file://src/index.ts)
- [src/command/index.ts](file://src/command/index.ts)
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
- [src/scheduler/index.ts](file://src/scheduler/index.ts)
- [wrangler.jsonc](file://wrangler.jsonc)
- [package.json](file://package.json)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
活动管理系统是一个基于 Telegram 的摄影活动管理机器人,为用户提供活动浏览、详情查看、预约管理等完整功能。系统采用 Cloudflare Workers 架构,通过 API 客户端与外部摄影平台进行数据交互。
该系统的核心功能包括:
- 活动列表获取与展示(支持分页和筛选)
- 活动详情页面设计(图片展示、时间槽信息、价格显示、可用性状态)
- 实时通知机制(新活动提醒)
- 用户认证与会话管理
- 预约历史查询与管理
## 项目结构
项目采用模块化架构设计,主要分为以下几个层次:
```mermaid
graph TB
subgraph "应用入口层"
A[src/index.ts] --> B[src/command/index.ts]
end
subgraph "命令处理层"
B --> C[src/command/handlers/events.ts]
B --> D[src/command/handlers/eventDetails.ts]
B --> E[src/command/handlers/bookEvent.ts]
B --> F[src/command/handlers/history.ts]
B --> G[src/command/handlers/login.ts]
B --> H[src/command/handlers/cancel.ts]
B --> I[src/command/handlers/logout.ts]
end
subgraph "服务客户端层"
J[src/client/cosmoe.ts] --> K[外部摄影平台API]
end
subgraph "调度服务层"
L[src/scheduler/index.ts] --> M[Cloudflare Cron触发器]
end
subgraph "配置层"
N[wrangler.jsonc] --> O[环境变量配置]
P[package.json] --> Q[依赖管理]
end
C --> J
D --> J
E --> J
F --> J
G --> J
H --> J
L --> J
```
**图表来源**
- [src/index.ts](file://src/index.ts#L1-L47)
- [src/command/index.ts](file://src/command/index.ts#L1-L110)
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
**章节来源**
- [src/index.ts](file://src/index.ts#L1-L47)
- [src/command/index.ts](file://src/command/index.ts#L1-L110)
- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
## 核心组件
### API 客户端 (CosmoeClient)
CosmoeClient 是系统的核心数据访问组件,负责与外部摄影平台 API 进行通信。该类提供了完整的 CRUD 操作能力:
```mermaid
classDiagram
class CosmoeClient {
-string baseUrl
-number userId
-string token
+getToken(username, password) ApiResponse~TokenResponse~
+setCredentials(userId, token) void
+getCredentials() Object|null
+isAuthenticated() boolean
+getEvents() ApiResponse~Event[]~
+getEventDetail(eventId) ApiResponse~EventDetail~
+getProfile() ApiResponse~ProfileData~
+getMyBookings() ApiResponse~Booking[]~
+bookEvent(bookingRequest) ApiResponse~any~
+getAvailableCoupons(eventId) ApiResponse~Coupon[]~
+cancelBooking(bookingId) ApiResponse~any~
+updatePaymentOrder(bookingId, paymentOrderId) ApiResponse~any~
+updateBookingNote(bookingId, note) ApiResponse~any~
+selfReschedule(bookingId, newTimeSlot) ApiResponse~any~
+selfTransfer(bookingId, recipientUsername) ApiResponse~any~
+register(key, username, email, password, userIdentity) ApiResponse~Object~
}
class Event {
+string id
+string name
+string description
+string event_date
+string cover_image_url
+string description_brief
}
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 TimeSlot {
+string range
+string price
+number capacity
+number remaining
}
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
}
CosmoeClient --> Event : "获取活动列表"
CosmoeClient --> EventDetail : "获取活动详情"
CosmoeClient --> TimeSlot : "包含时间槽信息"
CosmoeClient --> Booking : "管理预约"
```
**图表来源**
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
### 命令处理器系统
系统采用命令模式处理用户输入,每个命令都有专门的处理器:
```mermaid
sequenceDiagram
participant U as 用户
participant B as Bot核心
participant C as 命令处理器
participant A as API客户端
participant S as 外部服务
U->>B : 发送命令
B->>C : 路由到对应处理器
C->>A : 调用API方法
A->>S : 发起HTTP请求
S-->>A : 返回响应数据
A-->>C : 处理后的业务数据
C-->>U : 格式化后的消息
```
**图表来源**
- [src/command/index.ts](file://src/command/index.ts#L20-L110)
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
**章节来源**
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
- [src/command/index.ts](file://src/command/index.ts#L1-L110)
## 架构概览
系统采用分层架构设计,确保各组件职责清晰、耦合度低:
```mermaid
graph TB
subgraph "表现层"
UI[Telegram界面]
end
subgraph "控制层"
CMD[命令路由]
CONV[对话管理]
end
subgraph "业务逻辑层"
EVT[活动管理]
BK[预约管理]
ACC[账户管理]
HIS[历史记录]
end
subgraph "数据访问层"
KV[KV存储]
API[API客户端]
end
subgraph "外部服务"
EXT[摄影平台API]
TG[Telegram API]
end
UI --> CMD
CMD --> CONV
CONV --> EVT
CONV --> BK
CONV --> ACC
CONV --> HIS
EVT --> KV
BK --> KV
ACC --> KV
HIS --> KV
EVT --> API
BK --> API
ACC --> API
HIS --> API
API --> EXT
KV --> TG
```
**图表来源**
- [src/index.ts](file://src/index.ts#L13-L46)
- [src/command/index.ts](file://src/command/index.ts#L20-L110)
### 数据流处理
系统的数据流遵循以下模式:
```mermaid
flowchart TD
A[用户请求] --> B[命令解析]
B --> C[参数验证]
C --> D{需要认证?}
D --> |是| E[读取KV存储]
D --> |否| F[直接处理]
E --> G[验证凭据]
G --> H[调用API客户端]
F --> H
H --> I[处理业务逻辑]
I --> J[格式化响应]
J --> K[发送Telegram消息]
K --> L[更新状态]
L --> M[结束]
```
**图表来源**
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
## 详细组件分析
### 活动列表获取与展示
活动列表功能通过 `/events` 命令实现,提供最新的摄影活动信息:
```mermaid
sequenceDiagram
participant U as 用户
participant B as Bot
participant H as EventsHandler
participant C as CosmoeClient
participant S as API服务
U->>B : /events
B->>H : handleEventsCommand
H->>C : getEvents()
C->>S : GET /api.php?action=get_events
S-->>C : 活动列表数据
C-->>H : ApiResponse
H->>H : 处理数据(取前10条)
H->>U : 发送Markdown格式消息
```
**图表来源**
- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
#### 分页处理机制
系统实现了简单的分页策略:
- 默认只显示最新的10个活动
- 支持按事件ID排序(降序)
- 自动截断超出限制的消息内容
#### 活动过滤与排序
```mermaid
flowchart TD
A[获取所有活动] --> B[按ID排序(降序)]
B --> C[取前N条记录]
C --> D[生成Markdown列表]
D --> E[发送给用户]
F[用户点击活动链接] --> G[解析活动ID]
G --> H[调用getEventDetail]
H --> I[返回详细信息]
```
**图表来源**
- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L8-L17)
**章节来源**
- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
### 活动详情页面设计
活动详情页面提供了丰富的信息展示:
```mermaid
sequenceDiagram
participant U as 用户
participant B as Bot
participant DH as EventDetailsHandler
participant C as CosmoeClient
participant S as API服务
U->>B : /event_{id}
B->>DH : handleEventDetails
DH->>C : getEventDetail(eventId)
C->>S : GET /api.php?action=get_event_detail
S-->>C : 活动详情数据
C-->>DH : ApiResponse
DH->>DH : 处理时间槽和价格信息
DH->>DH : 计算可用性状态
DH->>U : 发送包含图片、时间槽、价格的详细信息
```
**图表来源**
- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
#### 图片展示机制
系统支持多种图片展示:
- 封面图片:用于活动的主要视觉展示
- 详情图片:活动的扩展图片集合
- 图片URL验证:确保图片链接的有效性
#### 时间槽信息管理
```mermaid
flowchart TD
A[获取活动详情] --> B[解析时间槽数组]
B --> C[按时间段排序]
C --> D[计算剩余容量]
D --> E{是否在活动日期内?}
E --> |是| F[显示预约按钮]
E --> |否| G[仅显示信息]
F --> H[标记可预约状态]
G --> I[标记不可预约状态]
```
**图表来源**
- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L22-L45)
#### 价格显示与可用性状态
系统实现了智能的价格和状态显示:
- 显示原价和剩余容量
- 根据活动日期动态调整可用性状态
- 提供预约链接(仅对可预约的时间槽)
**章节来源**
- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
### 预约管理功能
预约功能是系统的核心业务逻辑:
```mermaid
sequenceDiagram
participant U as 用户
participant B as Bot
participant BH as BookEventHandler
participant C as CosmoeClient
participant S as API服务
participant K as KV存储
U->>B : /book_{event_id}_{slot_index}
B->>BH : handleBookEvent
BH->>K : 读取用户凭据
K-->>BH : 凭据数据
BH->>C : setCredentials
BH->>C : getEventDetail(eventId)
C-->>BH : 活动详情
BH->>BH : 验证时间槽可用性
BH->>C : getAvailableCoupons(eventId)
C-->>BH : 可用优惠券
BH->>U : 显示优惠券选择
U->>B : 选择优惠券
B->>BH : handleCouponSelection
BH->>C : bookEvent(bookingRequest)
C-->>BH : 预约结果
BH-->>U : 预约确认信息
```
**图表来源**
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
#### 优惠券系统集成
系统支持多种类型的优惠券:
- 固定金额折扣
- 百分比折扣
- 自动选择最优优惠券
- 手动选择特定优惠券
#### 实时状态更新
```mermaid
flowchart TD
A[用户发起预约] --> B[检查时间槽剩余容量]
B --> C{剩余容量 > 0?}
C --> |否| D[提示已满]
C --> |是| E[检查可用优惠券]
E --> F[处理优惠券应用]
F --> G[提交预约请求]
G --> H[等待API响应]
H --> I[更新本地状态]
I --> J[发送确认消息]
```
**图表来源**
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L60-L63)
**章节来源**
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
### 用户认证与会话管理
系统采用交互式对话方式进行用户认证:
```mermaid
sequenceDiagram
participant U as 用户
participant B as Bot
participant LC as LoginConversation
participant C as CosmoeClient
participant S as API服务
participant K as KV存储
U->>B : /login
B->>LC : 启动登录对话
LC->>U : 请求用户名
U->>LC : 输入用户名
LC->>U : 请求密码
U->>LC : 输入密码
LC->>C : getToken(username, password)
C->>S : POST 认证请求
S-->>C : 返回token
C-->>LC : 认证结果
LC->>K : 存储凭据
K-->>LC : 存储成功
LC-->>U : 登录成功消息
```
**图表来源**
- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
- [src/command/index.ts](file://src/command/index.ts#L54-L57)
#### 凭据存储策略
系统使用 Cloudflare KV 存储用户凭据:
- 使用 Telegram 用户ID作为键
- 存储用户ID、token和时间戳
- 支持凭据的读取、写入和删除操作
**章节来源**
- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
- [src/command/index.ts](file://src/command/index.ts#L20-L52)
### 预约历史管理
历史记录功能允许用户查看和管理过去的预约:
```mermaid
flowchart TD
A[用户请求历史] --> B[读取KV存储中的凭据]
B --> C{凭据存在?}
C --> |否| D[提示先登录]
C --> |是| E[初始化CosmoeClient]
E --> F[调用getMyBookings]
F --> G[处理预约数据]
G --> H{有历史记录?}
H --> |否| I[提示无记录]
H --> |是| J[格式化历史消息]
J --> K[按日期排序(最新在前)]
K --> L[限制显示数量]
L --> M[发送历史记录]
```
**图表来源**
- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
**章节来源**
- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
### 实时通知系统
系统通过 Cloudflare Cron 触发器实现定时任务:
```mermaid
sequenceDiagram
participant CRON as Cron触发器
participant SCH as Scheduler
participant C as CosmoeClient
participant S as API服务
participant K as KV存储
participant U as 用户
CRON->>SCH : 每分钟触发
SCH->>C : getEvents()
C->>S : 获取活动列表
S-->>C : 返回最新活动
C-->>SCH : 活动数据
SCH->>K : 读取最新活动ID
K-->>SCH : 最新ID
SCH->>SCH : 过滤新活动
SCH->>K : 获取所有用户ID
K-->>SCH : 用户列表
SCH->>U : 发送新活动通知
SCH->>K : 更新最新活动ID
```
**图表来源**
- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
#### 通知策略
系统实现了智能的新活动通知机制:
- 持续监控活动变化
- 仅向注册用户发送通知
- 使用 KV 存储跟踪最新活动ID
- 支持 Markdown 格式的富文本通知
**章节来源**
- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
## 依赖关系分析
系统依赖关系清晰,各组件职责明确:
```mermaid
graph TB
subgraph "外部依赖"
A[grammy - Telegram Bot框架]
B[@grammyjs/conversations - 对话插件]
C[@grammyjs/storage-cloudflare - KV存储适配器]
D[Cloudflare Workers Runtime]
end
subgraph "内部模块"
E[src/index.ts - 应用入口]
F[src/command/index.ts - 命令路由]
G[src/client/cosmoe.ts - API客户端]
H[src/command/handlers/* - 业务处理器]
I[src/scheduler/index.ts - 定时任务]
end
E --> F
F --> G
F --> H
I --> G
A --> E
B --> F
C --> F
D --> E
D --> I
```
**图表来源**
- [package.json](file://package.json#L18-L22)
- [src/index.ts](file://src/index.ts#L1-L47)
### 外部服务集成
系统与多个外部服务进行集成:
```mermaid
erDiagram
TELEGRAM_BOT {
string BOT_TOKEN
object BOT_INFO
string USER_ID
string MESSAGE
}
COSMOE_API {
string BASE_URL
string API_KEY
string TOKEN
number USER_ID
}
CLOUDFLARE_KV {
string COSMOE_CREDENTIALS
string COSMOE_STORAGE
string LATEST_EVENT_ID
}
USER {
number TELEGRAM_ID
string USERNAME
string PASSWORD
string ACCESS_TOKEN
}
EVENT {
string ID
string NAME
string DESCRIPTION
string EVENT_DATE
string COVER_IMAGE_URL
}
BOOKING {
number ID
number USER_ID
string EVENT_ID
string TIME_SLOT
string STATUS
string FINAL_PRICE
}
TELEGRAM_BOT ||--o{ USER : "认证"
USER ||--o{ BOOKING : "创建"
BOOKING ||--|| EVENT : "关联"
COSMOE_API ||--o{ EVENT : "提供"
COSMOE_API ||--o{ BOOKING : "管理"
CLOUDFLARE_KV ||--o{ USER : "存储凭据"
CLOUDFLARE_KV ||--o{ EVENT : "跟踪活动"
```
**图表来源**
- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
**章节来源**
- [package.json](file://package.json#L1-L24)
- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
## 性能考虑
### 缓存策略
系统采用多层缓存策略优化性能:
1. **KV存储缓存**
- 用户凭据缓存(短期有效)
- 最新活动ID缓存(避免重复通知)
- 会话状态缓存(对话管理)
2. **内存缓存**
- API响应缓存(短期)
- 配置信息缓存
- 统计数据缓存
### 并发处理
系统支持高并发场景:
- 异步处理用户请求
- 非阻塞的API调用
- 流水线化的数据处理
### 错误处理与重试
```mermaid
flowchart TD
A[API调用] --> B{请求成功?}
B --> |是| C[正常处理]
B --> |否| D{错误类型}
D --> |网络错误| E[指数退避重试]
D --> |认证失败| F[重新认证]
D --> |业务错误| G[返回用户友好错误]
E --> H{重试次数}
H --> |达到上限| I[记录日志并返回错误]
H --> |未达上限| A
F --> J[刷新凭据]
J --> A
```
**图表来源**
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
## 故障排除指南
### 常见问题诊断
#### 认证相关问题
**症状**: 用户无法登录或收到认证错误
**排查步骤**:
1. 检查用户凭据是否正确存储在 KV 中
2. 验证 API 令牌是否过期
3. 确认用户 ID 和 token 格式正确
#### API连接问题
**症状**: 系统无法获取活动数据
**排查步骤**:
1. 检查网络连接状态
2. 验证 API 端点可达性
3. 查看 API 响应状态码
#### 会话管理问题
**症状**: 对话无法正常结束或状态丢失
**排查步骤**:
1. 检查 KV 存储的会话数据
2. 验证会话超时设置
3. 确认对话生命周期管理
### 日志记录与监控
系统实现了全面的日志记录机制:
- 关键操作的执行日志
- 错误和异常的详细记录
- 性能指标的监控数据
- 用户行为的追踪记录
**章节来源**
- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L83)
## 结论
活动管理系统是一个功能完整、架构清晰的 Telegram 机器人应用。系统通过模块化设计实现了良好的可维护性和扩展性,同时采用了多种优化策略确保了良好的用户体验。
### 主要优势
1. **架构清晰**: 分层设计使得各组件职责明确,便于维护和测试
2. **功能完整**: 覆盖了活动管理的全流程需求
3. **性能优化**: 采用缓存和异步处理提升系统响应速度
4. **用户体验**: 提供直观的界面和及时的通知机制
### 改进建议
1. **增加搜索功能**: 实现基于关键词的活动搜索
2. **增强过滤选项**: 支持按日期、价格、地点等条件过滤
3. **优化移动端体验**: 针对移动设备优化界面布局
4. **添加数据分析**: 提供活动参与率等统计信息
## 附录
### API 接口规范
系统主要 API 接口包括:
- 获取活动列表:`GET /api.php?action=get_events`
- 获取活动详情:`GET /api.php?action=get_event_detail&event_id={id}`
- 用户认证:`POST /api.php?action=login`
- 预约管理:`POST /api.php?action=book_event`
### 配置选项
系统支持的配置项:
- BOT_TOKEN: Telegram 机器人的访问令牌
- BOT_INFO: 机器人基本信息
- COSMOE_CREDENTIALS: KV 命名空间绑定
- COSMOE_STORAGE: KV 存储命名空间
### 部署要求
- Node.js 版本: 16+
- Wrangler CLI: 3.0+
- Cloudflare Workers: 免费套餐即可运行