Files
xiaoxia-saas/scripts/init_tracker_direct.py
T

283 lines
14 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
直接写入 tracker.db 的脚本
"""
import sqlite3
from datetime import datetime
DB_PATH = "tracker.db"
def init_database():
"""初始化所有 Phase 4 和 Phase 6 的任务数据"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
# 清空现有数据
cursor.execute("DELETE FROM logs")
cursor.execute("DELETE FROM tasks")
cursor.execute("DELETE FROM milestones")
print("=" * 60)
print("初始化 xiaoxia-saas 项目数据到 tracker.db")
print("=" * 60)
# ========== Phase 4: SAAS 产品化 ==========
print("\n[Phase 4] 初始化任务...")
# Milestone 1: 认证与账号体系
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("认证与账号体系", "Phase 4", "2026-06-10", "2026-06-17", "completed", "JWT 登录、注册、密码管理"))
milestone1_id = cursor.lastrowid
auth_tasks = [
("JWT 工具类实现", "sign/verify/refresh Token 功能", "completed", "high"),
("bcrypt 密码哈希工具", "密码加密存储", "completed", "high"),
("Redis Session 存储", "refresh_token 存储和管理", "completed", "high"),
("邮件服务封装", "SMTP + 邮件模板", "completed", "medium"),
("User 实体扩展", "新增 password_hash/email_verified 等字段", "completed", "high"),
("注册 API", "邮箱 + 密码注册", "completed", "high"),
("登录 API", "JWT 签发 access_token", "completed", "high"),
("登出 API", "撤销 refresh_token", "completed", "high"),
("刷新 Token API", "用 refresh_token 换取新 access_token", "completed", "high"),
("密码重置流程", "忘记密码 + 邮件重置", "completed", "medium"),
]
for name, desc, status, priority in auth_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 4", "认证与账号体系", priority, datetime.now().isoformat()))
# Milestone 2: 多租户权限体系
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("多租户权限体系", "Phase 4", "2026-06-10", "2026-06-17", "completed", "4 种角色、成员管理、邀请系统"))
permission_tasks = [
("WorkspaceMembership 实体", "成员关系实体设计", "completed", "high"),
("WorkspaceRole 枚举", "owner/admin/member/viewer", "completed", "high"),
("权限检查中间件", "基于角色的访问控制", "completed", "high"),
("数据隔离过滤器", "确保跨租户数据隔离", "completed", "high"),
("邀请成员 API", "发送邀请邮件", "completed", "high"),
("接受/拒绝邀请 API", "处理邀请响应", "completed", "medium"),
("移除成员 API", "删除成员关系", "completed", "medium"),
("修改成员角色 API", "角色变更", "completed", "medium"),
("转让 Workspace 所有权", "转让 owner 角色", "completed", "low"),
("权限矩阵验证", "测试所有权限组合", "completed", "high"),
]
for name, desc, status, priority in permission_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 4", "多租户权限体系", priority, datetime.now().isoformat()))
# Milestone 3: 订阅与计费
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("订阅与计费体系", "Phase 4", "2026-06-10", "2026-06-17", "completed", "Free/Pro/Enterprise 套餐"))
subscription_tasks = [
("Subscription 实体与 Repository", "订阅数据模型", "completed", "high"),
("SubscriptionPlan 枚举", "free/pro/enterprise", "completed", "high"),
("配额检查工具", "检查项目数量、存储限制", "completed", "high"),
("套餐限制中间件", "API 调用时检查配额", "completed", "high"),
("支付宝 SDK 集成", "支付宝支付接口", "pending", "medium"),
("微信支付 SDK 集成", "微信支付接口", "pending", "medium"),
("创建支付订单 API", "生成支付订单", "pending", "medium"),
("支付回调处理", "处理支付通知", "pending", "medium"),
("Invoice 实体与 Repository", "账单数据模型", "completed", "medium"),
("生成账单 PDF", "PDF 账单生成", "pending", "low"),
]
for name, desc, status, priority in subscription_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 4", "订阅与计费体系", priority, datetime.now().isoformat()))
print("[OK] Phase 4 任务已录入")
# ========== Phase 6: 前端完善 ==========
print("\n[Phase 6] 初始化任务...")
# Milestone 1: 基础搭建
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("前端基础搭建", "Phase 6", "2026-06-17", "2026-06-17", "completed", "Vite + React + TypeScript"))
foundation_tasks = [
("项目初始化:Vite + React + TypeScript", "创建 Vite 项目", "completed", "high"),
("安装配置依赖包", "Ant Design, React Router 等", "completed", "high"),
("搭建基础布局组件", "Header, Sidebar, Footer", "completed", "high"),
("API 客户端封装", "Axios 拦截器和 token 管理", "completed", "high"),
("路由配置", "React Router 路由定义", "completed", "high"),
("设计系统配置", "CSS 变量、色彩系统", "completed", "medium"),
("TypeScript 类型定义", "API 响应、实体类型", "completed", "medium"),
]
for name, desc, status, priority in foundation_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "前端基础搭建", priority, datetime.now().isoformat()))
# Milestone 2: 认证页面
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("认证系统", "Phase 6", "2026-06-17", "2026-06-17", "completed", "登录、注册、密码重置"))
auth_ui_tasks = [
("登录页面", "用户登录界面和逻辑", "completed", "high"),
("注册页面", "用户注册界面和验证", "completed", "high"),
("忘记密码页面", "密码重置请求", "completed", "high"),
("重置密码页面", "密码重置界面", "completed", "high"),
("Token 管理和刷新", "自动 token 刷新", "completed", "high"),
]
for name, desc, status, priority in auth_ui_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "认证系统", priority, datetime.now().isoformat()))
# Milestone 3: 工作空间管理
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("工作空间管理", "Phase 6", "2026-06-17", "2026-06-17", "completed", "工作空间 CRUD、成员管理"))
workspace_tasks = [
("工作空间列表页面", "显示所有工作空间", "completed", "high"),
("工作空间详情页面", "工作空间概览、配额", "completed", "high"),
("成员列表和管理", "成员列表、角色修改", "completed", "high"),
("邀请成员功能", "邀请成员弹窗", "completed", "high"),
("权限矩阵展示", "各角色权限说明", "completed", "medium"),
("工作空间设置", "修改名称、删除", "completed", "medium"),
]
for name, desc, status, priority in workspace_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "工作空间管理", priority, datetime.now().isoformat()))
# Milestone 4: 订阅管理
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("订阅管理", "Phase 6", "2026-06-17", "2026-06-17", "completed", "套餐选择、升级流程"))
subscription_ui_tasks = [
("套餐选择页面", "Free/Pro/Enterprise 对比", "completed", "high"),
("升级流程", "订阅升级流程和确认", "completed", "high"),
("配额展示组件", "项目数量、存储使用", "completed", "high"),
("账单页面", "历史账单列表", "completed", "medium"),
("发票申请入口", "发票申请表单", "completed", "low"),
]
for name, desc, status, priority in subscription_ui_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "订阅管理", priority, datetime.now().isoformat()))
# Milestone 5: Admin 后台
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("Admin 后台", "Phase 6", "2026-06-17", "2026-06-17", "completed", "Dashboard、用户管理"))
admin_tasks = [
("Dashboard 仪表盘", "关键指标和图表", "completed", "high"),
("用户管理页面", "用户列表、搜索", "completed", "high"),
("用户操作功能", "封禁、解封、重置密码", "completed", "high"),
("系统监控页面", "API 性能、数据库状态", "completed", "medium"),
("日志查看器", "错误日志和慢查询", "completed", "medium"),
]
for name, desc, status, priority in admin_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "Admin 后台", priority, datetime.now().isoformat()))
# Milestone 6: 个人中心
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("个人中心", "Phase 6", "2026-06-17", "2026-06-17", "completed", "个人设置、安全设置"))
profile_tasks = [
("个人设置页面", "基本信息、头像上传", "completed", "medium"),
("账号安全设置", "修改密码、修改邮箱", "completed", "high"),
("通知设置", "邮件通知、类型选择", "completed", "medium"),
("Session 管理", "设备列表、登出设备", "completed", "medium"),
]
for name, desc, status, priority in profile_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "个人中心", priority, datetime.now().isoformat()))
# Milestone 7: 测试与优化
cursor.execute("""
INSERT INTO milestones (name, phase, start_date, end_date, status, description)
VALUES (?, ?, ?, ?, ?, ?)
""", ("测试与优化", "Phase 6", "2026-06-17", "2026-06-17", "completed", "单元测试、E2E 测试、性能优化"))
test_tasks = [
("单元测试", "Vitest + React Testing Library", "completed", "high"),
("E2E 测试:认证流程", "Playwright 自动化测试", "completed", "high"),
("E2E 测试:工作空间", "工作空间管理流程测试", "completed", "high"),
("E2E 测试:订阅管理", "订阅升级流程测试", "completed", "medium"),
("性能优化:代码分割", "Vendor chunks 分割", "completed", "high"),
("性能优化:图片和资源", "压缩和懒加载", "completed", "medium"),
("可访问性优化", "WCAG 2.1 AA 标准", "completed", "medium"),
("移动端适配优化", "响应式设计验证", "completed", "medium"),
]
for name, desc, status, priority in test_tasks:
cursor.execute("""
INSERT INTO tasks (name, description, status, phase, milestone, priority, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
""", (name, desc, status, "Phase 6", "测试与优化", priority, datetime.now().isoformat()))
print("[OK] Phase 6 任务已录入")
conn.commit()
# 统计
cursor.execute("SELECT COUNT(*) FROM milestones")
milestone_count = cursor.fetchone()[0]
cursor.execute("SELECT COUNT(*) FROM tasks")
task_count = cursor.fetchone()[0]
cursor.execute("SELECT phase, COUNT(*) FROM tasks GROUP BY phase")
phase_stats = cursor.fetchall()
conn.close()
print("\n" + "=" * 60)
print("[SUCCESS] 数据初始化完成!")
print("=" * 60)
print(f"✅ 里程碑总数: {milestone_count}")
print(f"✅ 任务总数: {task_count}")
print("\n各 Phase 任务统计:")
for phase, count in phase_stats:
print(f" - {phase}: {count} 个任务")
print("\n推进器地址: http://47.98.113.167:8088/projects")
print("=" * 60)
if __name__ == "__main__":
init_database()