diff --git a/STATUS.md b/STATUS.md index f2cd3a60e..43c541c61 100644 --- a/STATUS.md +++ b/STATUS.md @@ -7,7 +7,8 @@ ## 当前阶段 -**Phase 1 已完成** - 核心平台层已搭建完成并稳定化中 +**Phase 1 已完成** - 核心平台层已搭建完成并稳定化中 +**Phase 2 进行中** - 项目管理模块已落地 --- @@ -28,11 +29,17 @@ - ✅ Asset(素材) - ✅ IngestJob(入库任务:PENDING → PROCESSING → COMPLETED/FAILED) - ✅ ClassificationJob(分类任务:含 9 种分类) +- ✅ **Task(任务:支持状态/进度/优先级/子任务/计划时间/实际时间)** +- ✅ **Milestone(里程碑)** +- ✅ **TaskIssue(任务问题/卡点)** ### 核心业务流程 - ✅ 上传 → 入库 → Asset 创建链路 - ✅ 分类任务链路 - ✅ 完整异步任务处理(Celery + Redis) +- ✅ **任务创建 → 状态更新 → 进度跟踪链路** +- ✅ **里程碑管理** +- ✅ **任务问题/卡点记录与解决** ### 基础设施 - ✅ **MinIO 真实文件存储**(`apps/api/app/core/storage.py`) @@ -41,29 +48,34 @@ - ✅ API 文档(Swagger) ### 测试与质量 -- ✅ 8 个集成测试全绿 +- ✅ **15 个集成测试全绿**(素材管理 8 个 + 项目管理 7 个) - ✅ 测试策略:集成测试优先,覆盖核心业务流程 --- ## 进行中 +### 项目推进器前端页面 +- 🔄 Next.js 页面设计与开发(下一步) +- 🔄 树形任务视图 +- 🔄 甘特图视图 +- 🔄 里程碑时间轴 +- 🔄 问题卡点面板 + ### 稳定化与部署打磨 -- 🔄 Gitea workflows 持续优化(最近 10+ commits) +- 🔄 Gitea workflows 持续优化 - 🔄 部署流程与环境隔离稳定化 - 🔄 Docker 构建优化(国内镜像源、多阶段构建) -### 前端页面 -- 🔄 Next.js 前端占位已建立,实际页面待补 - --- ## 下一步优先级 -1. **前端页面补齐** - - 项目/素材库管理页面 - - 素材上传/预览页面 - - 任务状态监控页面 +1. **项目推进器前端页面** + - 任务列表与详情页 + - 里程碑管理页 + - 问题卡点面板 + - 甘特图/时间线视图 2. **更完整的 SAAS 产品化能力** - 多租户/组织/权限体系 @@ -115,6 +127,7 @@ - 测试策略:集成测试优先,覆盖核心业务流程 - 数据库迁移从第一天起就版本化管理 - CI/CD 基于 Gitea Actions + 自建 runner +- **旧项目推进器(纯前端 HTML)已废弃,项目管理功能重新在 SAAS 里实现** --- @@ -123,7 +136,7 @@ - **本地路径**: `F:\openclaw-saas` - **远程仓库**: `xiaoxia-server:/var/lib/xiaoxia-ci/xiaoxia-saas.git` - **分支**: `main` -- **最新提交**: `2c78407 fix: pass commit metadata into deploy builds` +- **最新提交**: `355dd0f feat: add project management module (tasks, milestones, issues)` --- diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css new file mode 100644 index 000000000..6209f4970 --- /dev/null +++ b/apps/web/app/globals.css @@ -0,0 +1,26 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Microsoft YaHei", sans-serif; + background: #F5F7FA; + color: #1D2129; + height: 100vh; + overflow: hidden; +} + +:root { + --primary: #165DFF; + --primary-hover: #0e48d1; + --border: #E5E6EB; + --bg-white: #fff; + --bg-gray: #F5F7FA; + --text-primary: #1D2129; + --text-secondary: #6E7681; + --success: #00B42A; + --warning: #FF7D00; + --error: #F53F3F; +} diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 928393710..87f087c02 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,9 +1,16 @@ -export const metadata = { - title: 'xiaoxia-saas', - description: 'Xiaoxia SaaS scaffold', +import type { Metadata } from "next"; +import "./globals.css"; + +export const metadata: Metadata = { + title: "小虾 SaaS - 项目推进器", + description: "AI 视频自动化剪辑系统 - 项目管理", }; -export default function RootLayout({ children }: { children: React.ReactNode }) { +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { return ( {children} diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 5015b7760..6afcdd944 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -1,14 +1,48 @@ export default function HomePage() { return ( -
-

xiaoxia-saas

-

SaaS 新主线前端骨架已创建。

- -
+
+

+ 📁 小虾 SaaS 项目推进器 +

+

+ 项目管理模块开发中... +

+
+ + 进入项目列表 + + + 查看 API 文档 + +
+
); } diff --git a/apps/web/app/projects/page.tsx b/apps/web/app/projects/page.tsx new file mode 100644 index 000000000..2a3dddfe2 --- /dev/null +++ b/apps/web/app/projects/page.tsx @@ -0,0 +1,243 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import Link from 'next/link'; + +interface Task { + id: string; + name: string; + status: string; + priority: string; + progress: number; + assignee_user_id: string; + created_at: string; + updated_at: string; +} + +const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'; + +export default function ProjectsPage() { + const [tasks, setTasks] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(''); + + // 模拟项目ID,生产环境应该从路由或上下文获取 + const projectId = 'demo_project_1'; + + useEffect(() => { + fetchTasks(); + }, []); + + const fetchTasks = async () => { + try { + const res = await fetch(`${API_BASE}/api/v1/project-management/tasks?project_id=${projectId}`); + if (!res.ok) throw new Error('获取任务列表失败'); + const data = await res.json(); + setTasks(data); + } catch (err: any) { + setError(err.message); + } finally { + setLoading(false); + } + }; + + const getStatusColor = (status: string) => { + const colors: Record = { + pending: '#86909C', + in_progress: '#165DFF', + completed: '#00B42A', + blocked: '#F53F3F', + cancelled: '#6E7681', + }; + return colors[status] || '#6E7681'; + }; + + const getStatusText = (status: string) => { + const texts: Record = { + pending: '待开始', + in_progress: '进行中', + completed: '已完成', + blocked: '阻塞', + cancelled: '已取消', + }; + return texts[status] || status; + }; + + const getPriorityText = (priority: string) => { + const texts: Record = { + low: '低', + medium: '中', + high: '高', + urgent: '紧急', + }; + return texts[priority] || priority; + }; + + if (loading) { + return ( +
+

加载中...

+
+ ); + } + + return ( +
+ {/* Header */} +
+
+ + 📁 项目推进器 + + Demo 项目 +
+
+ + +
+
+ + {/* Main Content */} +
+ {error && ( +
+ {error} +
+ )} + + {tasks.length === 0 ? ( +
+

暂无任务

+

点击右上角"+ 新增任务"创建第一个任务

+
+ ) : ( +
+ + + + + + + + + + + + {tasks.map((task) => ( + + + + + + + + ))} + +
任务名称状态优先级进度创建时间
{task.name} + + {getStatusText(task.status)} + + + {getPriorityText(task.priority)} + +
+
+
+
+ + {task.progress}% + +
+
+ {new Date(task.created_at).toLocaleDateString('zh-CN')} +
+
+ )} +
+ + {/* Footer */} + +
+ ); +}