Files

336 lines
8.8 KiB
Markdown
Raw Permalink Normal View History

2026-04-16 16:11:09 +08:00
# Journal - zl-q
2026-04-16 16:11:09 +08:00
> Development session records for worktree: feat-starter-package-purchase-tracking
---
2026-04-16 16:11:09 +08:00
## Session 1: 新人初始礼包购买追踪功能 - 计划制定
2026-04-10 18:51:30 +08:00
2026-04-16 16:11:09 +08:00
**Date**: 2026-04-16
**Task**: starter-package-purchase-tracking
2026-04-15 16:50:29 +08:00
### Summary
2026-04-16 16:11:09 +08:00
在独立 worktree 中创建新人初始礼包购买追踪功能的实现计划。
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
### Background
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
用户需求:追踪用户是否已购买新人初始礼包($0.99/60积分),以便前端支付页面决定是否展示该礼包。
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
### Analysis
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
1. **现有数据结构分析**
- `register_bonus_claims` 表已存在,用于注册送分去重
- 表结构包含:`email_hash`(唯一)、`user_email_snapshot``first_user_id_snapshot``balance_snapshot``grant_event_id`
- 已支持删除账号后重注册恢复余额的功能
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
2. **设计方案**
-`register_bonus_claims` 添加 `has_purchased_starter_pack` 字段
- 利用现有 `email_hash` 唯一约束保证同一邮箱只能购买一次
- 后端提供 `/api/v1/points/starter-pack/eligibility` API
- 前端根据 API 返回决定是否展示礼包
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
3. **参考现有实现**
- 已有计划文档:`docs/plans/ios-new-user-pack-payment-plan.md`
- 完整支付计划包含:支付订单表、支付事件审计表、验单流程等
- 本期仅实现资格查询,不涉及支付流程
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
### Implementation Plan
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
#### Phase 1: 数据库层
- 创建 Alembic 迁移:`20260416_0001_add_starter_pack_tracking.py`
- 添加字段:`has_purchased_starter_pack BOOLEAN NOT NULL DEFAULT FALSE`
- 更新 Model`backend/src/models/register_bonus_claims.py`
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
#### Phase 2: 后端 API
- Schema:定义 `StarterPackEligibilityResponse``StarterPackInfo`
- Repository:添加 `has_purchased_starter_pack()` 方法
- Service:实现 `check_starter_pack_eligibility()` 逻辑
- Router:添加 `GET /api/v1/points/starter-pack/eligibility` 路由
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
#### Phase 3: 前端集成
- 创建 API 调用层
- 更新支付页面 UI 展示逻辑
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
#### Phase 4: 文档与测试
- 更新协议文档
- 编写单元测试和集成测试
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
### Key Decisions
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
1. **字段命名**`has_purchased_starter_pack`(布尔型),简洁明确
2. **API 设计**:仅返回资格状态和礼包信息,不涉及支付逻辑
3. **本期限制**
- 不实现支付流程
- 不实现支付验证
- `has_purchased_starter_pack` 字段暂时只读
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
### Files Created
2026-04-15 16:50:29 +08:00
2026-04-16 16:11:09 +08:00
| File | Purpose |
2026-04-15 16:50:29 +08:00
|------|---------|
2026-04-16 16:11:09 +08:00
| `.trellis/tasks/04-16-starter-package-purchase-tracking/task.json` | 任务配置 |
| `.trellis/tasks/04-16-starter-package-purchase-tracking/prd.md` | 需求与实现计划 |
2026-04-15 16:50:29 +08:00
### Next Steps
2026-04-16 16:11:09 +08:00
1. 实现 Phase 1:数据库迁移和 Model 更新
2. 实现 Phase 2:后端 API
3. 实现 Phase 3:前端集成
4. 实现 Phase 4:文档与测试
2026-04-15 18:19:25 +08:00
### Status
2026-04-16 16:11:09 +08:00
# **In Progress** - 计划已制定,等待实现
2026-04-16 16:15:22 +08:00
## Session 2: 新人初始礼包购买追踪功能实现
**Date**: 2026-04-16
**Task**: 新人初始礼包购买追踪功能实现
### Summary
(Add summary)
### Main Changes
## 功能概述
实现新人初始礼包购买追踪功能,支持动态套餐配置和按国家/地区区分。
## 后端实现
| 模块 | 变更 |
|------|------|
| 数据库 | 添加 `has_purchased_starter_pack` 字段到 `register_bonus_claims` |
| 配置管理 | 创建 `backend/src/core/config/packages/` 静态配置加载层 |
| 路径工具 | 创建 `backend/src/utils/paths.py` 统一路径管理 |
| API | 新增 `GET /api/v1/points/packages` 返回可用套餐 |
| 默认值 | Profile 默认国家改为 `US`ISO 3166-1 alpha-2 |
## 前端实现
| 模块 | 变更 |
|------|------|
| 数据模型 | 创建 `ProductCode` 枚举约束,前后端类型安全 |
| API 调用 | 新增 `PointsApi.getPackages()` |
| UI | `CoinCenterScreen` 动态渲染套餐,移除硬编码 |
| l10n | 添加 `settingsCoinPackStarter` 翻译 |
## 配置文件
- `backend/src/core/config/static/packages/us.yaml` - 美国区套餐配置
- `backend/src/core/config/static/packages/default.yaml` - 默认套餐配置
## 技术亮点
- ProductCode 枚举约束:后端 Pydantic Literal + 前端 Dart enum
- 统一路径管理:移除 5 处硬编码路径拼接
- Cross-layer 检查:修复 `profile_api.dart` fallback 不一致问题
## 文件统计
- 38 files changed
- +1452 insertions
- -2535 deletions
### Git Commits
| Hash | Message |
|------|---------|
| `ff40ff9` | (see git log) |
| `fd0df28` | (see git log) |
### Testing
- [OK] (Add test results)
### Status
[OK] **Completed**
### Next Steps
- None - task complete
2026-04-16 17:53:16 +08:00
## Session 3: 修复通知 targets 约束、合并注册脚本、路径缩短及清理重复索引
**Date**: 2026-04-16
**Task**: 修复通知 targets 约束、合并注册脚本、路径缩短及清理重复索引
### Summary
(Add summary)
### Main Changes
## 完成的四项任务
| 任务 | 描述 |
|------|------|
| 重复索引清理 | 创建 Alembic migration drop `ix_llm_factory_name``ix_llms_model_code` |
| 脚本合并 | `register-notifications.sh` 合并到 `dev-migrate.sh sync-notifications` 子命令 |
| 路径缩短 | `static/notification/notifications/``static/notifications/` |
| Targets 语义约束 | `NotificationTargetMode` 枚举 + 注册流程按 target_mode 分发通知 |
## 关键变更
| 模块 | 变更 |
|------|------|
| 枚举 | `NotificationTargetMode` (new_users/exist_users/all_users/user_ids) |
| ORM | `Notification.target_mode` VARCHAR + CHECK constraint |
| 注册流程 | `RegisterBonusResult.is_first_registration` 区分首次注册 |
| 通知分发 | `link_notifications_for_registered_user` 按 target_mode 过滤 |
| YAML | `welcome_points.yaml` mode 改为 `new_users` |
| 死代码 | 删除 `link_published_notifications_to_user` |
## 数据库 Migration
- `20260416_0002_drop_duplicate_llm_indexes.py` - 清理重复索引
- `20260416_0003_add_notification_target_mode.py` - 添加 target_mode 列
## 测试
- 44 个单元测试
- 1 个集成测试 (注册 + 重新注册通知分发)
- 全部通过
## 文件统计
- 26 files changed
- +1011 insertions
- -49 deletions
### Git Commits
| Hash | Message |
|------|---------|
| `c79c773` | (see git log) |
### Testing
- [OK] (Add test results)
### Status
[OK] **Completed**
### Next Steps
- None - task complete
2026-04-20 12:50:54 +08:00
## Session 4: 用户反馈投送功能
**Date**: 2026-04-20
**Task**: 用户反馈投送功能
### Summary
实现用户反馈收集系统完整功能:前端反馈表单(类型选择/内容输入/图片上传/匿名选项) + 后端存储(user_feedback表+RLS策略) + xlsx报告生成(openpyxl+图片嵌入) + 飞书SMTP邮件推送(HTML模板+附件) + 定时任务(taskiq cron)。包含完整的协议文档、错误码定义和单元/集成测试。
### Main Changes
### Git Commits
| Hash | Message |
|------|---------|
| `6a2a9d2c87e1e1dd35a23ff2e184b6ed9f04d03d` | (see git log) |
### Testing
- [OK] (Add test results)
### Status
[OK] **Completed**
### Next Steps
- None - task complete
2026-04-20 12:52:35 +08:00
## Session 5: Do Not Sell My Personal Information 开关
**Date**: 2026-04-20
**Task**: Do Not Sell My Personal Information 开关
### Summary
实现 CCPA/CPRA 合规的 Do Not Sell 开关功能:后端 PrivacySettings 结构化存储(can_sell字段默认false) + 前端 GeneralSettingsScreen 主开关 + 移除冗余 PrivacyNotificationSettingsScreen + 协议文档更新。
### Main Changes
### Git Commits
| Hash | Message |
|------|---------|
| `913ed26f8de434a64d795a68a5326e2aa34ad358` | (see git log) |
### Testing
- [OK] (Add test results)
### Status
[OK] **Completed**
### Next Steps
- None - task complete
2026-04-29 14:28:16 +08:00
## Session 6: 新增追问模式和英文输出优化
**Date**: 2026-04-29
**Task**: 新增追问模式和英文输出优化
### Summary
(Add summary)
### Main Changes
| Feature | Description |
|---------|-------------|
| 追问模式 | 新增 follow_up runtime mode,支持用户对解卦结果追问 |
| 英文输出优化 | 重构 worker_rules.py,英文输出面向普通读者,最小化中文字符 |
| iOS 本地化 | 新增 en/zh-Hans/zh-Hant 的 InfoPlist.strings |
| 国际化术语 | 添加五行、六神、地支等术语的多语言翻译 |
| 输出模型重构 | AgentOutput → PersistedAgentOutput,新增 SignLevel 枚举 |
**Updated Files**:
- `backend/src/core/agentscope/prompts/worker_rules.py` - 重构英文输出规则
- `backend/src/core/agentscope/prompts/user_prompt.py` - 优化语言约束
- `backend/src/core/agentscope/prompts/agent_prompt.py` - 支持 follow_up 模式
- `backend/src/schemas/agent/runtime_models.py` - 重构输出模型
- `apps/lib/l10n/*.arb` - 新增五行、六神等术语翻译
- `apps/ios/Runner/*.lproj/InfoPlist.strings` - iOS 本地化
### Git Commits
| Hash | Message |
|------|---------|
| `16cb47e` | (see git log) |
### Testing
- [OK] (Add test results)
### Status
[OK] **Completed**
### Next Steps
- None - task complete