Переглянути джерело

feat: add tg-live-game-hono submodule and update workspace configuration

- Introduced tg-live-game-hono as a new submodule in .gitmodules with its corresponding URL.
- Updated workspace.json to include new last opened files related to tg-live-game-hono, enhancing project accessibility.
- Removed obsolete files from tg-live-game-hono_bak to streamline the project structure.
yb 3 тижнів тому
батько
коміт
3b36021f94

+ 3 - 0
.gitmodules

@@ -10,3 +10,6 @@ url = https://github.com/FanLide/online-order-uniapp.git
 [submodule "tg-live-game/tg-live-game-web"]
 path = tg-live-game/tg-live-game-web
 url = https://sg-git.pwtk.cc/tg/tg-live-game-web.git
+[submodule "tg-live-game/tg-live-game-hono"]
+	path = tg-live-game/tg-live-game-hono
+	url = https://github.com/bbbond123/tg-live-game-hono.git

+ 18 - 18
.obsidian/workspace.json

@@ -181,6 +181,23 @@
   },
   "active": "cf8a89fa88ac988b",
   "lastOpenFiles": [
+    "tg-live-game/tg-live-game-hono/workflow.md",
+    "tg-live-game/tg-live-game-hono/d1-database.canvas",
+    "tg-live-game/tg-live-game-hono/CLAUDE.md",
+    "tg-live-game/tg-live-game-hono/auth-system.canvas",
+    "tg-live-game/tg-live-game-hono/architecture.canvas",
+    "tg-live-game/tg-live-game-hono/_project.md",
+    "tg-live-game/tg-live-game-hono/wrangler.toml",
+    "tg-live-game/tg-live-game-hono/vitest.config.ts",
+    "tg-live-game/tg-live-game-hono/tsconfig.json",
+    "tg-live-game/tg-live-game-hono/tg-live-game.postman_collection.json",
+    "tg-live-game/tg-live-game-hono/src/utils/password.ts",
+    "tg-live-game/tg-live-game-hono/src/utils/jwt.ts",
+    "tg-live-game/tg-live-game-hono/src/types/index.ts",
+    "tg-live-game/tg-live-game-hono/src/middleware/rateLimit.ts",
+    "tg-live-game/tg-live-game-hono/src/middleware/error.ts",
+    "tg-live-game/tg-live-game-hono/src/middleware/auth.ts",
+    "tg-live-game/tg-live-game-hono/README.md",
     "tg-live-game/tg-live-game-hono_bak/workflow.md",
     "tg-live-game/tg-live-game-hono_bak/d1-database.canvas",
     "tg-live-game/tg-live-game-hono_bak/auth-system.canvas",
@@ -188,16 +205,6 @@
     "tg-live-game/tg-live-game-hono_bak/CLAUDE.md",
     "tg-live-game/tg-live-game-hono_bak/_project.md",
     "tg-live-game/tg-live-game-hono_bak/README.md",
-    "tg-live-game/tg-live-game-hono_bak",
-    "tg-live-game/tg-live-game-web/tg-live-game.postman_collection.json",
-    "tg-live-game/tg-live-game-web/src/views/user/index.vue",
-    "tg-live-game/tg-live-game-web/src/views/user",
-    "tg-live-game/tg-live-game-web/src/views/stream/video-list.vue",
-    "tg-live-game/tg-live-game-web/src/views/stream/live-list.vue",
-    "tg-live-game/tg-live-game-web/src/views/stream/config.vue",
-    "tg-live-game/tg-live-game-web/src/views/stream",
-    "tg-live-game/tg-live-game-web/src/views/camera/stream-test.vue",
-    "tg-live-game/tg-live-game-web/src/types/cloudflare.ts",
     "tg-live-game/tg-live-game-web/CLAUDE.md",
     "tg-live-game/tg-live-game-web/_project.md",
     "tg-live-game/tg-live-game-web/src/assets/vue.svg",
@@ -219,10 +226,6 @@
     "yshop/yshop-drink-uniapp/uni_modules/uv-ui/readme.md",
     "yshop/yshop-drink-uniapp/uni_modules/uv-ui/changelog.md",
     "yshop/yshop-drink-uniapp/uni_modules/uv-transition/readme.md",
-    "yshop/yshop-drink-uniapp/uni_modules/uv-transition/changelog.md",
-    "yshop/yshop-drink-uniapp/uni_modules/uv-tooltip/readme.md",
-    "yshop/yshop-drink-uniapp/uni_modules/uv-tooltip/changelog.md",
-    "yshop/yshop-drink-uniapp/uni_modules/uv-toolbar/readme.md",
     "yshop/yshop-drink-uniapp/static/images/tabBar/order.png",
     "yshop/yshop-drink-uniapp/static/images/tabBar/order-selected.png",
     "yshop/yshop-drink-uniapp/static/images/tabBar/mine_selected.png",
@@ -233,9 +236,6 @@
     "askyi/architecture.canvas",
     "tg-live-game/architecture.canvas",
     "tg-live-game/architecture-v1.canvas",
-    "tg-live-game/rtsp-cloudflare-stream.canvas",
-    "yshop/architecture.canvas",
-    "yshop/backend-modules.canvas",
-    "yshop/database.canvas"
+    "tg-live-game/rtsp-cloudflare-stream.canvas"
   ]
 }

+ 1 - 0
tg-live-game/tg-live-game-hono

@@ -0,0 +1 @@
+Subproject commit b45064eab38d4bdb74053f0fa9f6b1aa7d9dbebd

+ 0 - 114
tg-live-game/tg-live-game-hono_bak/CLAUDE.md

@@ -1,114 +0,0 @@
-# TG Live Game Hono 后端 - Claude Code 配置
-
-> 2级子项目配置 | 继承自 tg-live-game (1级)
-
-## 项目信息
-
-| 属性 | 值 |
-|------|-----|
-| 项目名称 | tg-live-game-hono |
-| 所属项目 | tg-live-game |
-| 项目类型 | backend (后端 API) |
-| 框架 | Hono 4.x |
-| 运行时 | Cloudflare Workers |
-| 数据库 | Cloudflare D1 (SQLite) |
-
-## 技术栈
-
-| 类别 | 技术 | 版本 |
-|------|------|------|
-| 框架 | Hono | 4.11.1 |
-| 运行时 | Cloudflare Workers | - |
-| 数据库 | Cloudflare D1 | - |
-| 验证 | Zod | 4.3.5 |
-| 语言 | TypeScript | 5.9.3 |
-| 测试 | Vitest | 3.2.4 |
-| Lint | Biome | 2.3.11 |
-| 部署 | Wrangler | 4.56.0 |
-
-## 项目结构
-
-```
-src/
-├── index.ts              # 应用入口
-├── node.ts               # Node.js 本地开发入口
-├── middleware/           # 中间件
-│   └── auth.ts          # JWT 认证 + RBAC 权限
-├── routes/              # API 路由
-│   ├── auth.ts         # 认证接口
-│   ├── user.ts         # 用户管理 (admin only)
-│   ├── cameras.ts      # 摄像头管理
-│   ├── sessions.ts     # 会话管理
-│   ├── stats.ts        # 观看统计
-│   ├── stream.ts       # Cloudflare Stream
-│   └── audit.ts        # 审计日志
-├── services/            # 业务服务
-├── types/               # TypeScript 类型
-└── utils/               # 工具函数
-```
-
-## API 路由
-
-### 公开接口
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| POST | `/api/auth/login` | 用户登录 |
-| POST | `/api/auth/refresh` | 刷新 Token |
-
-### 认证接口
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| GET | `/api/auth/me` | 获取当前用户 |
-| POST | `/api/auth/logout` | 退出登录 |
-| GET/POST/PUT/DELETE | `/api/users/*` | 用户管理 (admin) |
-| GET/POST/PUT/DELETE | `/api/cameras/*` | 摄像头管理 |
-| GET/POST/DELETE | `/api/stream/*` | Stream 管理 |
-| GET | `/api/stats/*` | 观看统计 |
-| GET | `/api/audit/*` | 审计日志 |
-
-## RBAC 角色
-
-| 角色 | 权限 |
-|------|------|
-| admin | 所有权限 |
-| operator | 摄像头/视频/直播管理 |
-| viewer | 只读访问 |
-
-## 部署信息
-
-| 属性 | 值 |
-|------|------|
-| Worker 名称 | tg-live-game-api |
-| 域名 | https://tg-live-game-api.ifoodme.com |
-| D1 Database ID | 970f081e-42c8-46bb-b385-b7c1ab2ceaa5 |
-
-## 开发命令
-
-```bash
-pnpm install          # 安装依赖
-pnpm dev              # 本地开发 (使用本地 D1)
-pnpm dev:remote       # 远程开发 (使用远程 D1)
-pnpm typecheck        # 类型检查
-pnpm test             # 运行测试
-pnpm lint             # 代码检查
-pnpm deploy           # 部署
-```
-
-### D1 数据库操作
-
-```bash
-# 本地执行 SQL
-npx wrangler d1 execute tg_live_game --command "SELECT * FROM users;"
-
-# 远程执行 SQL
-npx wrangler d1 execute tg_live_game --remote --command "SELECT * FROM users;"
-```
-
-## 核心文档
-
-| 文档 | 位置 | 内容 |
-|------|------|------|
-| 子系统架构 | `architecture.canvas` | API 架构图 |
-| 数据库设计 | `d1-database.canvas` | D1 表结构 |
-| 认证系统 | `auth-system.canvas` | JWT + RBAC |
-| 整体架构 | `../architecture.canvas` | 系统架构图 |

+ 0 - 43
tg-live-game/tg-live-game-hono_bak/README.md

@@ -1,43 +0,0 @@
-# tg-live-game-hono
-
-> 此目录仅包含项目规划和架构文档,代码实现位于:
-> `/Users/yibu/dev_workspace/frontend/tg-live-game/tg-live-game-hono/`
-
-## 项目概述
-
-TG Live Game 后端 API 服务,基于 Hono + Cloudflare Workers 构建。
-
-## 文档
-
-- `architecture.canvas` - 项目架构图 (Obsidian Canvas 格式)
-
-## 功能模块
-
-| 模块 | 描述 | 状态 |
-|------|------|------|
-| 视频管理 | CRUD、导入、上传 | ✅ 已实现 |
-| 直播管理 | CRUD、播放信息 | ✅ 已实现 |
-| Cloudflare API | Stream API 封装 | ✅ 已实现 |
-
-## 技术栈
-
-- **框架**: Hono v4
-- **运行时**: Cloudflare Workers
-- **语言**: TypeScript
-- **API**: Cloudflare Stream API
-
-## 开发命令
-
-```bash
-# 进入代码目录
-cd /Users/yibu/dev_workspace/frontend/tg-live-game/tg-live-game-hono
-
-# 安装依赖
-npm install
-
-# 本地开发
-npm run dev
-
-# 部署到 Cloudflare
-npm run deploy
-```

+ 0 - 224
tg-live-game/tg-live-game-hono_bak/_project.md

@@ -1,224 +0,0 @@
----
-type: project
-name: tg-live-game-hono
-status: active
-created: 2024-12-31
-updated: 2026-01-06
-kanban_id: 7c6bb2ce-90a2-4e96-bc04-5facdcdb337f
-parent: "[[_project|TG Live Game]]"
----
-
-# TG Live Game Hono
-
-后端 API 服务,基于 Hono + Cloudflare Workers + D1 构建。
-
-## 技术栈
-
-| 类别 | 技术 | 版本 |
-|------|------|------|
-| 框架 | Hono | 4.11.1 |
-| 运行时 | Cloudflare Workers | - |
-| 数据库 | Cloudflare D1 (SQLite) | - |
-| 验证 | Zod | 4.3.5 |
-| 语言 | TypeScript | 5.9.3 |
-| 测试 | Vitest | 3.2.4 |
-| Lint | Biome | 2.3.11 |
-| 部署 | Wrangler | 4.56.0 |
-
-## 项目结构
-
-```
-src/
-├── index.ts              # 应用入口
-├── node.ts               # Node.js 本地开发入口
-├── middleware/           # 中间件
-│   └── auth.ts          # JWT 认证 + RBAC 权限
-├── routes/              # API 路由
-│   ├── auth.ts         # 认证接口
-│   ├── user.ts         # 用户管理 (admin only)
-│   ├── cameras.ts      # 摄像头管理
-│   ├── sessions.ts     # 会话管理
-│   ├── stats.ts        # 观看统计
-│   ├── stream.ts       # Cloudflare Stream
-│   └── audit.ts        # 审计日志
-├── services/            # 业务服务
-├── types/               # TypeScript 类型
-└── utils/               # 工具函数
-```
-
-## API 路由
-
-### 公开接口
-
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| POST | `/api/auth/login` | 用户登录 |
-| POST | `/api/auth/refresh` | 刷新 Token |
-
-### 认证接口
-
-| 方法 | 路由 | 描述 | 权限 |
-|------|------|------|------|
-| GET | `/api/auth/me` | 获取当前用户 | * |
-| POST | `/api/auth/logout` | 退出登录 | * |
-| POST | `/api/auth/change-password` | 修改密码 | * |
-
-### 用户管理 (admin)
-
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| GET | `/api/users` | 用户列表 |
-| GET | `/api/users/:id` | 用户详情 |
-| POST | `/api/users` | 创建用户 |
-| PUT | `/api/users/:id` | 更新用户 |
-| DELETE | `/api/users/:id` | 删除用户 |
-
-### 摄像头管理
-
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| GET | `/api/cameras` | 摄像头列表 |
-| GET | `/api/cameras/:id` | 摄像头详情 |
-| POST | `/api/cameras` | 创建摄像头 |
-| PUT | `/api/cameras/:id` | 更新摄像头 |
-| DELETE | `/api/cameras/:id` | 删除摄像头 |
-
-### Stream 管理
-
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| GET | `/api/stream/videos` | 视频列表 |
-| GET | `/api/stream/live-inputs` | 直播输入列表 |
-| POST | `/api/stream/live-inputs` | 创建直播输入 |
-| DELETE | `/api/stream/live-inputs/:id` | 删除直播输入 |
-
-### 统计 & 审计
-
-| 方法 | 路由 | 描述 |
-|------|------|------|
-| GET | `/api/stats/*` | 观看统计 |
-| GET | `/api/audit/*` | 审计日志 |
-
-## 数据库设计
-
-### D1 配置
-
-```toml
-[[d1_databases]]
-binding = "DB"
-database_name = "tg_live_game"
-database_id = "970f081e-42c8-46bb-b385-b7c1ab2ceaa5"
-```
-
-### 数据表
-
-| 表名 | 描述 |
-|------|------|
-| users | 用户信息 |
-| user_permissions | 用户权限 |
-| cameras | 摄像头配置 |
-| live_sessions | 直播会话 |
-| videos | 视频记录 |
-| view_stats | 观看统计 |
-| audit_logs | 审计日志 |
-
-## 认证系统
-
-### JWT 配置
-
-```toml
-[vars]
-JWT_EXPIRES_IN = "86400"      # 24小时
-REFRESH_EXPIRES_IN = "604800"  # 7天
-```
-
-### RBAC 角色
-
-| 角色 | 权限 |
-|------|------|
-| admin | 所有权限 |
-| operator | 摄像头/视频/直播管理 |
-| viewer | 只读访问 |
-
-### 中间件
-
-```typescript
-// 认证中间件
-authMiddleware()
-
-// 角色检查
-requireRole('admin')
-requireRole('admin', 'operator')
-```
-
-## 部署信息
-
-| 属性 | 值 |
-|------|------|
-| Worker 名称 | tg-live-game-api |
-| 域名 | https://tg-live-game-api.ifoodme.com |
-| Account ID | d31caaf9d62da3682d7d98e07f8b96d5 |
-| D1 Database ID | 970f081e-42c8-46bb-b385-b7c1ab2ceaa5 |
-
-## 开发命令
-
-```bash
-# 安装依赖
-pnpm install
-
-# 本地开发 (使用本地 D1)
-pnpm dev
-
-# 远程开发 (使用远程 D1)
-pnpm dev:remote
-
-# 类型检查
-pnpm typecheck
-
-# 运行测试
-pnpm test
-
-# 代码检查
-pnpm lint
-
-# 格式化代码
-pnpm format
-
-# 部署
-pnpm deploy
-```
-
-### D1 数据库操作
-
-```bash
-# 本地执行 SQL
-npx wrangler d1 execute tg_live_game --command "SELECT * FROM users;"
-
-# 远程执行 SQL
-npx wrangler d1 execute tg_live_game --remote --command "SELECT * FROM users;"
-
-# 初始化 Schema
-npx wrangler d1 execute tg_live_game --remote --file=./schema.sql
-```
-
-### Secrets 管理
-
-```bash
-wrangler secret put JWT_SECRET
-wrangler secret put CF_ACCOUNT_ID
-wrangler secret put CF_API_TOKEN
-wrangler secret put CUSTOMER_SUBDOMAIN
-```
-
-## 代码仓库
-
-| 环境 | 路径 |
-|------|------|
-| 开发 | `/Users/yibu/dev_workspace/frontend/tg-live-game/tg-live-game-hono` |
-
-## 相关文档
-
-- [[_project|TG Live Game]] - 父项目
-- [[tg-live-game-web/_project|tg-live-game-web]] - 前端项目
-- [[architecture-v1]] - 系统架构
-- [[workflow]] - 开发工作流

+ 0 - 28
tg-live-game/tg-live-game-hono_bak/architecture.canvas

@@ -1,28 +0,0 @@
-{
-	"nodes":[
-		{"id":"database","type":"text","text":"**D1 数据库**\n\n表:\n- users\n- user_permissions\n- cameras\n- live_sessions\n- videos\n- view_stats\n- audit_logs\n\n详见: d1-database.canvas","x":-760,"y":240,"width":280,"height":460,"color":"1"},
-		{"id":"env_vars","type":"text","text":"**环境变量**\n\nCloudflare:\n- CF_ACCOUNT_ID\n- CF_API_TOKEN\n- CUSTOMER_SUBDOMAIN\n\nJWT:\n- JWT_SECRET\n- JWT_EXPIRES_IN\n- REFRESH_EXPIRES_IN\n\nD1:\n- DB binding","x":-760,"y":960,"width":280,"height":480,"color":"4"},
-		{"id":"types","type":"text","text":"**类型定义**\n`src/types/index.ts`\n\n新增:\n- JwtPayload\n- LoginRequest\n- RegisterRequest\n- AuthResponse\n- User\n- UserPermission\n- Camera\n- LiveSession\n- ...","x":560,"y":608,"width":270,"height":435,"color":"5"},
-		{"id":"services_cf","type":"text","text":"**Stream 服务**\n`src/services/cloudflare.ts`\n\nCloudflareStreamService:\n- 视频 CRUD\n- 直播 CRUD\n- 播放信息","x":585,"y":60,"width":220,"height":310,"color":"3"},
-		{"id":"routes_stream","type":"text","text":"**Stream 路由**\n`src/routes/stream.ts`\n\n视频管理 (13个端点)\n直播管理\n\n需认证 ✅","x":585,"y":-360,"width":220,"height":240,"color":"2"},
-		{"id":"routes_user","type":"text","text":"**用户路由**\n`src/routes/user.ts`\n\n需 admin 角色:\n- GET /users\n- GET /users/:id\n- POST /users\n- PUT /users/:id\n- DELETE /users/:id\n\n权限管理:\n- GET /users/:id/permissions\n- POST /users/:id/permissions\n- DELETE /users/:id/permissions/:id","x":110,"y":-500,"width":280,"height":520,"color":"2"},
-		{"id":"title","type":"text","text":"# tg-live-game-hono 架构\n\n**版本**: v1.1.0\n**技术栈**: Hono + Cloudflare Workers + D1\n**状态**: ✅ 已实现\n\n新增功能:\n- JWT 认证\n- 用户管理\n- RBAC 权限","x":-300,"y":-1020,"width":630,"height":340,"color":"6"},
-		{"id":"services_auth","type":"text","text":"**认证服务**\n`src/services/auth.ts`\n\nAuthService:\n- login()\n- register()\n- refreshToken()\n- getCurrentUser()\n- changePassword()\n- logAudit()","x":-300,"y":280,"width":260,"height":380,"color":"3"},
-		{"id":"utils","type":"text","text":"**工具函数**\n`src/utils/`\n\njwt.ts:\n- createToken()\n- verifyToken()\n- generateId()\n\npassword.ts:\n- hashPassword()\n- verifyPassword()\n\n算法: PBKDF2 + HMAC-SHA256","x":200,"y":265,"width":280,"height":410,"color":"4"},
-		{"id":"entry","type":"text","text":"**入口文件**\n`src/index.ts`\n\n功能:\n- Hono 应用初始化\n- CORS/日志中间件\n- 路由挂载\n  - /api/auth (公开)\n  - /api/users (admin)\n  - /api/stream\n\n端口: localhost:8787","x":-760,"y":-760,"width":280,"height":370,"color":"4"},
-		{"id":"middleware","type":"text","text":"**中间件**\n`src/middleware/auth.ts`\n\n- authMiddleware()\n  验证 JWT Token\n- requireRole(roles)\n  角色权限检查\n- requirePermission()\n  资源权限检查\n- optionalAuth()\n  可选认证","x":-760,"y":-240,"width":280,"height":320,"color":"5"},
-		{"id":"routes_auth","type":"text","text":"**认证路由**\n`src/routes/auth.ts`\n\n公开接口:\n- POST /login\n- POST /register\n- POST /refresh\n\n需认证:\n- GET /me\n- POST /change-password\n- POST /logout","x":-300,"y":-240,"width":260,"height":405,"color":"2"}
-	],
-	"edges":[
-		{"id":"edge_entry_mw","fromNode":"entry","fromSide":"bottom","toNode":"middleware","toSide":"top","label":"use()"},
-		{"id":"edge_entry_auth","fromNode":"entry","fromSide":"right","toNode":"routes_auth","toSide":"left","label":"/api/auth"},
-		{"id":"edge_entry_user","fromNode":"entry","fromSide":"right","toNode":"routes_user","toSide":"left","label":"/api/users"},
-		{"id":"edge_user_stream","fromNode":"routes_user","fromSide":"right","toNode":"routes_stream","toSide":"left","label":"/api/stream"},
-		{"id":"edge_auth_service","fromNode":"routes_auth","fromSide":"bottom","toNode":"services_auth","toSide":"top","label":"AuthService"},
-		{"id":"edge_service_utils","fromNode":"services_auth","fromSide":"right","toNode":"utils","toSide":"left","label":"jwt/password"},
-		{"id":"edge_stream_cf","fromNode":"routes_stream","fromSide":"bottom","toNode":"services_cf","toSide":"top","label":"StreamService"},
-		{"id":"edge_mw_db","fromNode":"middleware","fromSide":"bottom","toNode":"database","toSide":"top","label":"权限查询"},
-		{"id":"edge_service_db","fromNode":"services_auth","fromSide":"left","toNode":"database","toSide":"right","label":"用户查询"},
-		{"id":"edge_cf_types","fromNode":"services_cf","fromSide":"bottom","toNode":"types","toSide":"top","label":"import"}
-	]
-}

+ 0 - 21
tg-live-game/tg-live-game-hono_bak/auth-system.canvas

@@ -1,21 +0,0 @@
-{
-	"nodes":[
-		{"id":"title","type":"text","text":"# 认证鉴权系统设计\n\n**方案**: JWT + D1\n**状态**: 📋 设计中\n\n特点:\n- 无状态 JWT 认证\n- 基于角色的访问控制 (RBAC)\n- 细粒度资源权限\n- 边缘计算友好","x":-100,"y":-600,"width":380,"height":160,"color":"6"},
-		{"id":"auth_flow","type":"text","text":"## 认证流程\n\n```\n1. 登录请求\n   POST /api/auth/login\n   { username, password }\n        ↓\n2. 验证密码\n   bcrypt.compare()\n        ↓\n3. 生成 JWT\n   { userId, role, exp }\n        ↓\n4. 返回 Token\n   { accessToken, refreshToken }\n        ↓\n5. 客户端存储\n   Authorization: Bearer <token>\n```","x":-500,"y":-380,"width":300,"height":340,"color":"2"},
-		{"id":"jwt_structure","type":"text","text":"## JWT 结构\n\n**Header**\n```json\n{ \"alg\": \"HS256\", \"typ\": \"JWT\" }\n```\n\n**Payload**\n```json\n{\n  \"sub\": \"user-id\",\n  \"username\": \"admin\",\n  \"role\": \"admin\",\n  \"iat\": 1704067200,\n  \"exp\": 1704153600\n}\n```\n\n**有效期**\n- accessToken: 24h\n- refreshToken: 7d","x":-130,"y":-380,"width":300,"height":320,"color":"4"},
-		{"id":"rbac","type":"text","text":"## RBAC 角色权限\n\n| 角色 | 权限 |\n|------|------|\n| admin | 全部操作 |\n| operator | 摄像头管理、直播控制 |\n| viewer | 仅查看 |\n\n**资源权限**\n```\nuser_permissions 表\n- view: 查看摄像头\n- control: 控制直播\n- manage: 管理配置\n```","x":240,"y":-380,"width":280,"height":280,"color":"3"},
-		{"id":"middleware","type":"text","text":"## 中间件设计\n\n**authMiddleware**\n- 解析 Bearer Token\n- 验证 JWT 签名\n- 检查过期时间\n- 注入 c.set('user', payload)\n\n**requireRole(roles)**\n- 检查用户角色\n- 403 Forbidden\n\n**requirePermission(resource, action)**\n- 查询 user_permissions\n- 检查资源权限","x":-500,"y":20,"width":300,"height":260,"color":"5"},
-		{"id":"api_endpoints","type":"text","text":"## API 端点\n\n**认证**\n- POST /api/auth/login\n- POST /api/auth/register\n- POST /api/auth/refresh\n- POST /api/auth/logout\n- GET  /api/auth/me\n\n**用户管理 (admin)**\n- GET  /api/users\n- GET  /api/users/:id\n- POST /api/users\n- PUT  /api/users/:id\n- DELETE /api/users/:id\n\n**权限管理 (admin)**\n- GET  /api/users/:id/permissions\n- POST /api/users/:id/permissions\n- DELETE /api/permissions/:id","x":-130,"y":0,"width":300,"height":340,"color":"2"},
-		{"id":"file_structure","type":"text","text":"## 文件结构\n\n```\nsrc/\n├── middleware/\n│   └── auth.ts\n├── services/\n│   ├── auth.ts\n│   └── user.ts\n├── routes/\n│   ├── auth.ts\n│   └── user.ts\n├── utils/\n│   ├── jwt.ts\n│   └── password.ts\n└── types/\n    └── index.ts\n```","x":240,"y":-40,"width":280,"height":280,"color":"4"},
-		{"id":"security","type":"text","text":"## 安全措施\n\n- 密码 bcrypt 哈希 (cost=12)\n- JWT 密钥环境变量\n- HTTPS 强制\n- Rate Limiting\n- 登录失败锁定\n- Audit Log 记录\n- CORS 白名单","x":-500,"y":340,"width":300,"height":180,"color":"1"},
-		{"id":"env_config","type":"text","text":"## 环境配置\n\n**.dev.vars**\n```\nJWT_SECRET=your-secret-key\nJWT_EXPIRES_IN=86400\nREFRESH_EXPIRES_IN=604800\n```\n\n**wrangler secret**\n```bash\nwrangler secret put JWT_SECRET\n```","x":-130,"y":400,"width":300,"height":180,"color":"4"},
-		{"id":"protected_routes","type":"text","text":"## 路由保护\n\n**公开路由**\n- /api/auth/login\n- /api/auth/register\n- / (健康检查)\n\n**需要认证**\n- /api/stream/*\n- /api/users/*\n- /api/auth/me\n\n**需要 admin**\n- POST/PUT/DELETE /api/users\n- /api/permissions/*","x":240,"y":300,"width":280,"height":240,"color":"3"}
-	],
-	"edges":[
-		{"id":"edge_flow_jwt","fromNode":"auth_flow","fromSide":"right","toNode":"jwt_structure","toSide":"left","label":"生成"},
-		{"id":"edge_jwt_rbac","fromNode":"jwt_structure","fromSide":"right","toNode":"rbac","toSide":"left","label":"携带 role"},
-		{"id":"edge_mw_api","fromNode":"middleware","fromSide":"right","toNode":"api_endpoints","toSide":"left","label":"保护"},
-		{"id":"edge_api_files","fromNode":"api_endpoints","fromSide":"right","toNode":"file_structure","toSide":"left","label":"实现"},
-		{"id":"edge_mw_security","fromNode":"middleware","fromSide":"bottom","toNode":"security","toSide":"top","label":"安全策略"}
-	]
-}

+ 0 - 23
tg-live-game/tg-live-game-hono_bak/d1-database.canvas

@@ -1,23 +0,0 @@
-{
-	"nodes":[
-		{"id":"title","type":"text","text":"# D1 数据库设计\n\n**数据库名**: tg_live_game\n**引擎**: Cloudflare D1 (SQLite)\n**状态**: 📋 设计中\n\n设计原则:\n- Cloudflare Stream 为主数据源\n- D1 存储业务扩展元数据\n- 支持离线查询和统计","x":-100,"y":-600,"width":380,"height":180,"color":"6"},
-		{"id":"table_cameras","type":"text","text":"**cameras** 摄像头管理\n\n```sql\nid          TEXT PRIMARY KEY\nname        TEXT NOT NULL\ntype        TEXT -- 'mac'|'ip'|'rtsp'\nprotocol    TEXT -- 'rtmps'|'srt'|'whip'\nrtsp_url    TEXT\nlocation    TEXT\nstatus      TEXT -- 'online'|'offline'\nlive_input_id TEXT -- CF Stream ID\ncreated_at  INTEGER\nupdated_at  INTEGER\n```\n\n索引: status, type","x":-500,"y":-340,"width":300,"height":280,"color":"4"},
-		{"id":"table_live_sessions","type":"text","text":"**live_sessions** 直播会话\n\n```sql\nid          TEXT PRIMARY KEY\ncamera_id   TEXT REFERENCES cameras\nlive_input_id TEXT -- CF Stream ID\nstarted_at  INTEGER NOT NULL\nended_at    INTEGER\nduration    INTEGER -- 秒\nstatus      TEXT -- 'live'|'ended'|'error'\nviewer_count INTEGER DEFAULT 0\nrecording_id TEXT -- 录像视频ID\ncreated_at  INTEGER\n```\n\n索引: camera_id, status, started_at","x":-130,"y":-340,"width":320,"height":280,"color":"2"},
-		{"id":"table_videos","type":"text","text":"**videos** 视频元数据\n\n```sql\nid          TEXT PRIMARY KEY\ncf_uid      TEXT UNIQUE -- CF Stream UID\ncamera_id   TEXT REFERENCES cameras\nsession_id  TEXT REFERENCES live_sessions\ntitle       TEXT\ndescription TEXT\ntags        TEXT -- JSON array\nthumbnail   TEXT\nduration    INTEGER\nsize        INTEGER\nstatus      TEXT -- 'ready'|'processing'\nis_public   INTEGER DEFAULT 0\nview_count  INTEGER DEFAULT 0\ncreated_at  INTEGER\nupdated_at  INTEGER\n```\n\n索引: cf_uid, camera_id, status","x":260,"y":-340,"width":320,"height":340,"color":"3"},
-		{"id":"table_users","type":"text","text":"**users** 用户管理\n\n```sql\nid          TEXT PRIMARY KEY\nusername    TEXT UNIQUE\nemail       TEXT UNIQUE\npassword_hash TEXT\nrole        TEXT -- 'admin'|'operator'|'viewer'\nstatus      TEXT -- 'active'|'disabled'\nlast_login  INTEGER\ncreated_at  INTEGER\nupdated_at  INTEGER\n```\n\n索引: username, email, role","x":-500,"y":0,"width":300,"height":240,"color":"5"},
-		{"id":"table_permissions","type":"text","text":"**user_permissions** 权限\n\n```sql\nid          TEXT PRIMARY KEY\nuser_id     TEXT REFERENCES users\ncamera_id   TEXT REFERENCES cameras\npermission  TEXT -- 'view'|'control'|'manage'\ngranted_at  INTEGER\ngranted_by  TEXT REFERENCES users\n```\n\n索引: user_id, camera_id","x":-130,"y":0,"width":320,"height":200,"color":"5"},
-		{"id":"table_view_stats","type":"text","text":"**view_stats** 观看统计\n\n```sql\nid          TEXT PRIMARY KEY\nvideo_id    TEXT REFERENCES videos\nsession_id  TEXT REFERENCES live_sessions\nuser_id     TEXT -- 可为空(匿名)\nip_address  TEXT\nuser_agent  TEXT\nwatch_duration INTEGER -- 秒\nstarted_at  INTEGER\nended_at    INTEGER\ncountry     TEXT\ncity        TEXT\n```\n\n索引: video_id, session_id, started_at","x":260,"y":60,"width":320,"height":260,"color":"1"},
-		{"id":"table_audit_logs","type":"text","text":"**audit_logs** 操作日志\n\n```sql\nid          TEXT PRIMARY KEY\nuser_id     TEXT REFERENCES users\naction      TEXT -- 'create'|'update'|'delete'\nresource    TEXT -- 'camera'|'video'|'user'\nresource_id TEXT\ndetails     TEXT -- JSON\nip_address  TEXT\ncreated_at  INTEGER\n```\n\n索引: user_id, action, created_at","x":-500,"y":300,"width":300,"height":220,"color":"1"},
-		{"id":"er_diagram","type":"text","text":"## ER 关系图\n\n```\nusers ──1:N──> user_permissions\n  │                  │\n  │                  v\n  │            cameras ──1:N──> live_sessions\n  │               │                   │\n  │               │                   v\n  └──1:N──> audit_logs         videos <──1:N── view_stats\n```\n\n核心关系:\n- 摄像头 → 多个直播会话\n- 直播会话 → 录像视频\n- 用户 → 摄像头权限","x":-130,"y":260,"width":320,"height":260,"color":"6"},
-		{"id":"wrangler_config","type":"text","text":"## wrangler.toml 配置\n\n```toml\n[[d1_databases]]\nbinding = \"DB\"\ndatabase_name = \"tg_live_game\"\ndatabase_id = \"<your-database-id>\"\n```\n\n## 创建命令\n\n```bash\nwrangler d1 create tg_live_game\nwrangler d1 execute tg_live_game \\\n  --file=./schema.sql\n```","x":260,"y":380,"width":320,"height":240,"color":"4"},
-		{"id":"5aa4ab97e1a61931","x":-780,"y":-710,"width":500,"height":310,"type":"text","text":"任务20260101-01\n\n数据库备份\n\n1. 要求如下\n\n2. 每天备份一次,文件要按照日期命名\n"}
-	],
-	"edges":[
-		{"id":"edge_camera_session","fromNode":"table_cameras","fromSide":"right","toNode":"table_live_sessions","toSide":"left","label":"1:N"},
-		{"id":"edge_session_video","fromNode":"table_live_sessions","fromSide":"right","toNode":"table_videos","toSide":"left","label":"1:1"},
-		{"id":"edge_user_perm","fromNode":"table_users","fromSide":"right","toNode":"table_permissions","toSide":"left","label":"1:N"},
-		{"id":"edge_perm_camera","fromNode":"table_permissions","fromSide":"top","toNode":"table_cameras","toSide":"bottom","label":"N:1"},
-		{"id":"edge_video_stats","fromNode":"table_videos","fromSide":"bottom","toNode":"table_view_stats","toSide":"top","label":"1:N"},
-		{"id":"edge_user_audit","fromNode":"table_users","fromSide":"bottom","toNode":"table_audit_logs","toSide":"top","label":"1:N"}
-	]
-}

+ 0 - 152
tg-live-game/tg-live-game-hono_bak/workflow.md

@@ -1,152 +0,0 @@
-# 开发工作流
-
-> 本文档描述 Obsidian + Vibe Kanban + Claude Code 三者协作的工作流程
-
-## 三者关系
-
-```
-┌─────────────────────────────────────────────────────────────────┐
-│  Obsidian (文档中心 - 单一数据源)                                  │
-│  路径: /Users/jamesw/dev_workspace/vibe-coding-cn                │
-│  ├── 架构设计 (*.canvas)                                         │
-│  ├── 需求文档                                                    │
-│  └── 任务卡片 → 同步到 Kanban                                     │
-└─────────────────────────────────────────────────────────────────┘
-                         ↓ 读取文档 / 同步任务
-┌─────────────────────────────────────────────────────────────────┐
-│  Vibe Kanban (任务管理)                                           │
-│  ├── Project: tg-live-game-hono                                  │
-│  ├── Project ID: 7c6bb2ce-90a2-4e96-bc04-5facdcdb337f            │
-│  └── 任务状态: todo → inprogress → inreview → done               │
-└─────────────────────────────────────────────────────────────────┘
-                         ↓ 领取任务 / 执行开发
-┌─────────────────────────────────────────────────────────────────┐
-│  Claude Code (代码开发)                                           │
-│  工作目录: /Users/jamesw/dev_workspace/frontend/tg-live-game/    │
-│           tg-live-game-hono                                      │
-│  ├── 读取 Obsidian 架构文档                                       │
-│  ├── 根据 Kanban 任务开发                                         │
-│  └── 完成后更新任务状态                                            │
-└─────────────────────────────────────────────────────────────────┘
-```
-
-## 工作流程
-
-### 1. 需求设计阶段 (Obsidian)
-
-在 Obsidian 的 canvas 中设计架构和需求:
-
-1. 打开相关的 `.canvas` 文件
-2. 添加新的组件/功能卡片
-3. 使用任务卡片格式标记待开发内容:
-
-```
-任务YYYYMMDD-NN
-─────────────────
-任务标题
-
-1. 需求描述
-2. 具体要求
-3. ...
-```
-
-### 2. 任务同步阶段 (Obsidian → Kanban)
-
-当 canvas 有新的任务卡片时:
-
-1. Claude Code 读取 canvas 文件
-2. 解析新增的任务卡片
-3. 提取任务名称和描述
-4. 调用 Vibe Kanban API 创建任务
-
-**同步命令示例**:
-```
-"同步 d1-database.canvas 的新任务到 Kanban"
-```
-
-### 3. 开发阶段 (Claude Code)
-
-1. 从 Kanban 获取任务
-2. 读取 Obsidian 文档理解架构
-3. 在代码目录执行开发
-4. 完成后提交代码
-
-### 4. 任务完成阶段
-
-1. 代码提交到 git
-2. 更新 Kanban 任务状态为 `done`
-3. 如有需要,更新 Obsidian 文档
-
-## 文件路径映射
-
-| 位置 | 路径 | 用途 |
-|------|------|------|
-| Obsidian 文档 | `/Users/jamesw/dev_workspace/vibe-coding-cn/tg-live-game/tg-live-game-hono/` | 架构设计、需求文档 |
-| 代码仓库 | `/Users/jamesw/dev_workspace/frontend/tg-live-game/tg-live-game-hono/` | 代码实现 |
-| Claude 配置 | `{代码仓库}/CLAUDE.md` | 项目关联配置 |
-
-## 任务卡片规范
-
-### 格式
-```
-任务YYYYMMDD-NN
-
-任务标题
-
-1. 第一个要求
-2. 第二个要求
-...
-```
-
-### 示例
-```
-任务20260101-01
-
-数据库备份
-
-1. 要求如下
-2. 每天备份一次,文件要按照日期命名
-```
-
-### 解析规则
-- **任务编号**: `任务YYYYMMDD-NN` 格式,用于唯一标识
-- **任务标题**: 编号后的第一行非空文本
-- **任务描述**: 剩余所有内容
-
-## 多项目协作
-
-当任务涉及前后端同时开发时,参考父项目的工作流文档:[[../workflow]]
-
-### Claude Code 启动位置
-
-```bash
-# 仅后端开发
-cd /Users/jamesw/dev_workspace/frontend/tg-live-game/tg-live-game-hono
-claude
-
-# 前后端协作(推荐)
-cd /Users/jamesw/dev_workspace/frontend/tg-live-game
-claude
-```
-
-### 关联任务格式
-
-```
-任务YYYYMMDD-NN-hono
-─────────────────
-后端:功能名称
-
-project: tg-live-game-hono
-related: 任务YYYYMMDD-NN-web
-
-1. 需求描述
-```
-
-## 相关文件
-
-- [[architecture]] - 整体架构设计
-- [[auth-system]] - 认证鉴权系统
-- [[d1-database]] - 数据库设计
-- [[README]] - 项目概述
-- [[../workflow]] - 父项目工作流(多项目协作)
-- [[../_project]] - 父项目配置