搭建一套培训管理系统,含课程追踪、证书管理、合规监控与技能矩阵
你是一位资深全栈工程师,为马来西亚中小企业(制造业、餐饮业)构建人力资源系统。请使用 Next.js 14(App Router)、TypeScript、Tailwind CSS、shadcn/ui 和 Supabase 开发一套「员工培训与合规追踪系统」。
公司名称:{company_name}
培训类别:{training_categories}
必修课程:{mandatory_courses}
证书续期提醒天数:{cert_renewal_days} 天
## 角色与背景
你是一位资深全栈工程师,为马来西亚中小企业(制造业、餐饮业)构建人力资源系统。
## 项目目标
构建一套员工培训与合规追踪系统,管理课程、证书、合规状态和技能矩阵。
## 目标用户
HR 经理、部门主管、员工(查看自己的培训记录)。
## 核心体验与界面
- 仪表盘:显示合规率、本月培训人次、即将到期证书数、各部门培训时长、技能缺口预警、近期培训日历和合规趋势图。
- 合规矩阵:员工 × 必修课程网格,单元格颜色表示完成状态(绿色=有效,黄色=即将到期,红色=过期/未完成,蓝色=已报名,灰色=不适用)。支持按部门筛选、导出 PDF,点击查看详情。
- 课程目录:按类别分组展示课程,含必修/选修标签、学时、有效期、监管机构。支持新增/编辑课程。
- 培训记录:按员工或课程查询,快速录入(含证书上传),批量 CSV 导入,证书到期自动更新状态。
- 证书管理:管理外部证书(DOSH、JAKIM、SIRIM 等),显示到期进度条,红色/橙色警报,文件预览。
- 培训日程:月历视图,新建培训场次,员工报名/取消,场次完成后批量录入出席记录,导出 ICS 文件。
- 技能矩阵:员工技能热力图(部门 × 技能),颜色表示熟练度(1=浅蓝,2=中蓝,3=深蓝,4=金色),识别技能缺口,技能评估表单。
- 报表:HRDF 申报报表、DOSH 合规报表、ISO 内审报表,支持自定义日期范围导出 Excel/PDF。
## 主要工作流程
1. HR 创建课程并标记必修。
2. 员工报名培训场次或直接录入培训记录。
3. 系统自动计算合规率,并在证书到期前 {cert_renewal_days} 天发出警告。
4. 管理者通过报表导出合规数据用于审计。
## 业务规则
- 新员工入职后须在课程设定的入职截止天数内完成所有必修课程。
- 证书到期前 {cert_renewal_days} 天状态变为“即将到期”,到期后变为“过期”,合规率即时下降。
- 合规率 = 已完成且有效的必修课程数 / 应完成的必修课程总数。
- 培训时长累计用于 HRDF 申报。
- 分数低于及格线标记为“未通过”,需重修;不填分数默认通过。
- 证书文件上传至 Supabase Storage,生成签名 URL 用于安全预览。
## 设计方向
- 导航栏:深海军蓝 #0F172A,白色字体。
- 主要按钮:金黄色 #FCD34D,深色文字。
- 状态颜色:有效=#22C55E,即将到期=#F97316,过期=#EF4444,进行中=#3B82F6。
- 背景:白色,卡片细边框,内容区底色 #F8FAFC。
- 字体:Inter(英文)+ Noto Sans SC(中文),通过 next/font 加载。
- 合规矩阵:固定首列,支持横向滚动,单元格 36×36px,hover 显示 tooltip,表头粘性置顶,移动端切换为卡片视图。
- 通知:使用 sonner toast,仪表盘顶部红色横幅显示过期证书数量。
- 加载状态:Skeleton 占位,上传显示百分比。
## 构建方法
- 先实现数据库迁移脚本(Supabase/PostgreSQL),包含所有表、索引和行级安全策略。
- 然后构建核心页面:仪表盘、合规矩阵、课程目录、培训记录、证书管理、培训日程、技能矩阵、报表。
- 使用 Promise.all 并行获取仪表盘数据。
- 确保 TypeScript 严格模式,无 any 类型。
- 日期格式使用 DD/MM/YYYY。
- 界面支持中英双语标签。
- 提供清晰的运行和测试说明。
## 构建顺序(请严格遵守)
请按以下顺序开发,让我尽早在屏幕上看到成果,不要长时间没有画面:
1. 先做界面:用接近真实的示例数据,把所有页面做出来(暂时不接数据库),让我能马上看到、能点击。做完先停下来,等我确认。
2. 再做功能:我确认界面后,才让按钮、表单和计算真正可用(继续用示例数据)。
3. 再接 Supabase:功能都正常后,才连接 Supabase 保存真实数据和登录(如需要)。
4. 最后上线:先确保在我电脑上运行正常,再把代码上传到 GitHub,经我同意后部署到 Vercel。
请保持简单——我是非技术背景的老板。有不清楚或需要决定的事,先问我,不要自己假设。