DevEnchantments/ptrack

GitHub: DevEnchantments/ptrack

基于 React、NestJS 和 Supabase 重建的项目组合管理应用,提供九种记录类型的完整 CRUD、字段级审计历史和文件附件管理。

Stars: 2 | Forks: 0

P-Track — Project Portfolio Management
[![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/DevEnchantments/ptrack/actions/workflows/ci.yml) ![React](https://img.shields.io/badge/React-19-61dafb?logo=react&logoColor=white&labelColor=0b1220) ![NestJS](https://img.shields.io/badge/NestJS-11-e0234e?logo=nestjs&logoColor=white&labelColor=0b1220) ![Supabase](https://img.shields.io/badge/Supabase-Postgres%20%C2%B7%20Auth%20%C2%B7%20Storage-3ecf8e?logo=supabase&logoColor=white&labelColor=0b1220) ![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178c6?logo=typescript&logoColor=white&labelColor=0b1220) ![Tailwind](https://img.shields.io/badge/Tailwind-CSS-38bdf8?logo=tailwindcss&logoColor=white&labelColor=0b1220) **将企业级 Oracle APEX PPM 应用从头重建为现代 Web 技术栈。** tracking › projects, milestones, action items, status reports
## ✨ 包含内容
Nine record types orbiting one project
| | 功能 | 说明 | |---|---|---| | 📁 | **完整的 CRUD,9 种记录类型** | 里程碑、行动项、问题、链接、资源、更新、状态报告、附件、人员 | | 🧙 | **4 步项目向导** | 外加编辑、删除、受限项目锁定和孤立的 Storage 清理 | | 🕓 | **字段级历史记录** | Postgres trigger 为每个更改的字段写入一条审计行——值在写入时解析,因此历史记录显示的是该值过去的*真实状态* | | 🗑️ | **删除审计** | 每次删除都会记录*谁*删除了*什么*,并在 UI 中进行二次确认 | | 📎 | **文件附件** | 由 Supabase Storage 支持,带有星标和标签功能 | | 📖 | **实时 API 文档** | 位于 `/api/docs` 的 Swagger,带有可运行的请求示例 | | 🔐 | **本地 JWT 验证** | Supabase token 在进程内通过 (JWKS) 验证——无需每次请求都进行认证往返 | | ✅ | **CI 门控** | 在每次推送时进行类型检查、lint、构建和测试 |
Audit trail: created, changed, owners changed, deleted
## 🏗 架构 ``` flowchart LR subgraph Browser R["⚛️ React + Vite
Tailwind · shadcn/ui"] end subgraph API [":3000"] N["🪺 NestJS
business logic · authz
feature-first modules"] end subgraph Supabase P[("🐘 Postgres
+ history triggers")] A["🔑 Auth"] S["🗄️ Storage"] end R -- "REST + Bearer JWT" --> N N -- "service-role key" --> P N --> S R -. "sign-in only" .-> A ```
Request pulse: React to NestJS (JWT verified in-process) to Supabase and back
## 🚀 快速开始 **前提条件:** Node 22+,一个 [Supabase](https://supabase.com) 项目。 ### 1 · 数据库 —— Supabase SQL 编辑器 按顺序运行一次以下脚本: | 脚本 | 用途 | |---|---| | `backend/db/ptrack_phase1_schema.sql` | 全部 28 张表、触发器、索引 | | `backend/db/record_history.sql` | 字段级审计捕获 + 数据回填 | | `backend/db/record_history_deleted.sql` | 将审计扩展到删除操作 | ### 2 · 后端 —— `:3000` ``` cd backend npm install npm run dev ```
npm run dev boots the NestJS API on :3000
创建 `backend/.env`: | 变量 | 必需 | 用途 | |---|---|---| | `SUPABASE_URL` | ✅ | 项目 URL — 仪表盘 → Settings → API | | `SUPABASE_SECRET_KEY` | ✅ | 服务角色 / 密钥(**仅限服务器使用,绝不要暴露给浏览器**) | | `SUPABASE_JWT_SECRET` | 可选 | 仅适用于旧版 HS256 项目;现代项目会自动通过公共 JWKS 进行验证 | ### 3 · 前端 —— `:5173` ``` cd frontend npm install npm run dev ``` 创建 `frontend/.env.local`: | 变量 | 必需 | 用途 | |---|---|---| | `VITE_SUPABASE_URL` | ✅ | 同上的项目 URL | | `VITE_SUPABASE_PUBLISHABLE_KEY` | ✅ | *publishable* (anon) key —— 对浏览器安全 | ### 4 · 探索 - 应用 → - API 文档(Swagger,仅限非生产环境)→ ## 🧪 质量 ``` cd backend && npm test # unit tests (audit diffing, auth guard verify/fallback) npx tsc --noEmit # typecheck — clean in both halves npx eslint "src/**/*.ts" # backend lint — zero errors, CI-blocking ``` CI 会在每次推送和 pull request 时运行上述所有检查以及完整的构建。
A commit travels the CI pipeline: typecheck, lint, test, merged
## 🗺 路线图 第一阶段(完整的 CRUD + 审计历史)已完成。接下来,大致按优先级排列: **仪表盘和报告**(甘特图 · 时间线 · 热力图) · **码表管理** · **搜索和已保存的搜索** · **电子邮件/通知子系统** · **弹性列** (无代码自定义字段) · **RLS 强制执行**。
Roadmap progress: Phase 1 complete, quality baseline complete, dashboards next
## 📚 更多文档 | 文件 | 涵盖内容 | |---|---| | [`CLAUDE.md`](CLAUDE.md) | 架构规则、约定、已知的坑 —— 贡献前必读 | | [`original-app-features.md`](original-app-features.md) | 正在重建的原始 Oracle APEX 应用程序的功能参考 |
Built with React, NestJS, Supabase, TypeScript, Tailwind 作为独立的重建项目构建——无法访问原始数据库,仅能访问其演示。1:1 的复刻不是目标;打造一个更好的 P-Track 才是。
标签:Linux 内核安全, NestJS, React, Supabase, Syscalls, TypeScript, 企业应用, 后端开发, 安全插件, 测试用例, 项目管理