LecPunch 是一个团队打卡系统 monorepo。当前仓库已经收口到 V1.1 基线,包含成员端打卡闭环、同团队数据查看,以及最小可用的后台管理能力。
当前已纳入范围的能力:
- Web 与 Election 桌面端统一使用 LEC SSO(OIDC Authorization Code + PKCE)
- 以后端为真值的上卡 / 下卡业务规则
- 当前打卡状态、我的记录、成员记录、个人周历史
- 团队本周统计与同团队访问控制
- LecPunch 展示资料编辑;密码和身份资料由 LEC SSO 统一管理
- 后台成员管理
- 后台网络策略管理
- 后台团队记录 CSV 导出
- 有效打卡每满 1 分钟自动获得 1 积分(服务端确认并保存)
当前明确不在 V1.1 范围内:
- 多团队产品化流程
- 请假 / 补卡流程
- Excel 导出
- 推送提醒
- 离线同步
- 当前工作区脚本之外的完整部署自动化
- 仅服务端已确认的有效打卡时长参与积分;未满一分钟不计分。
- 每次打卡按
floor(有效秒数 / 60)结算积分;心跳暂停期间不累计。 - 超过 5 小时而作废的打卡记录积分会自动归零。
- MongoDB 使用
point_ledger_entries保存积分明细,每个打卡 session 只有一条明细记录并设有唯一索引,避免重复请求重复加分。 - 已登录用户可通过
GET /points/me查询当前总积分,响应形如{ "totalPoints": 42 }。
pnpmworkspace + Turboapps/api: NestJS + MongoDBapps/web: React + Vite + Zustand + Axios + Tailwindpackages/shared: 前后端共享领域契约与常量packages/ui: 共享展示组件
- Node.js 20+
- pnpm 8+
- 本地 MongoDB,默认连接串为
mongodb://localhost:27017/lecpunch
pnpm install如果 packages/shared/dist 缺失,且 API 启动时报 @lecpunch/shared 无法解析,可先执行一次:
pnpm --filter @lecpunch/shared build复制示例文件:
Copy-Item apps/api/.env.example apps/api/.env关键变量说明:
MONGODB_URI:MongoDB 连接串LOGTO_ENDPOINT:LEC SSO 地址;生产环境必须使用 HTTPSLOGTO_API_RESOURCE:LecPunch API audience,默认https://api.lecpunch.lec.orgLOGTO_ORGANIZATION_ID:获准访问的 Logto Organization ID,默认lec-studioAUTH_SECRET:成员分享链接的 HMAC 密钥,至少 16 位(不用于登录 JWT)LECPUNCH_TEAM_ID:生产环境建议固定为现有 Mongo 团队 IDDEFAULT_TEAM_NAME:未配置团队 ID 时使用的默认团队名ALLOW_ANY_NETWORK:设为false后才真正启用打卡网络白名单ALLOWED_PUBLIC_IPS:逗号分隔的精确客户端 IP 白名单ALLOWED_CIDRS:逗号分隔的 CIDR 白名单TRUST_PROXY:是否信任X-Forwarded-ForTRUSTED_PROXY_HOPS:TRUST_PROXY=true时按代理链右侧计算的可信跳数
本地演示建议保持:
LOGTO_ENDPOINT=http://localhost:3001
ALLOW_ANY_NETWORK=true重要约束:当 ALLOW_ANY_NETWORK=false 时,ALLOWED_PUBLIC_IPS 或 ALLOWED_CIDRS 至少要配置一个。
复制示例文件:
Copy-Item apps/web/.env.example apps/web/.env本地开发让 Vite 通过 /api 代理到 API,并配置 LecPunch Web SPA:
VITE_API_BASE_URL=
VITE_LOGTO_ENDPOINT=http://localhost:3001
VITE_LOGTO_APP_ID=lecpunch-web
VITE_LOGTO_RESOURCE=https://api.lecpunch.lec.org
VITE_LOGTO_ORGANIZATION_ID=lec-studio只有在前端需要直连已部署 API 时,才填写完整地址。生产环境的 API 与 SSO 均必须使用 HTTPS。
复制 apps/election/.env.example 后配置 LECPUNCH_API_BASE_URL 与 LECPUNCH_LOGTO_*。桌面端通过系统浏览器完成 PKCE 登录,Refresh Token 仅由 Electron 主进程使用 safeStorage 加密保存,Access Token 只保留在内存并通过受限 IPC 获取。
API 工作区保留可重复执行的业务演示数据脚本;这些旧本地密码账号不能用于 SSO 登录,仅用于非认证数据准备:
pnpm --filter @lecpunch/api seed它会确保默认团队存在,并在账号缺失时创建:
demo-admin/123456demo-member/123456
使用在 LEC SSO 中拥有 studio:admin:access 的 Captain 账号验证后台入口:
/admin/members/admin/network-policy/admin/records-export
启动 API:
pnpm --filter @lecpunch/api dev默认地址:http://localhost:4000
在另一个终端启动 Web:
pnpm --filter @lecpunch/web dev默认地址:http://localhost:5173
全仓:
pnpm typecheck
pnpm test
pnpm build单独执行:
pnpm --filter @lecpunch/api test
pnpm --filter @lecpunch/web test定向示例:
pnpm --filter @lecpunch/api exec vitest run src/modules/attendance/attendance.service.spec.ts
pnpm --filter @lecpunch/web exec vitest run src/pages/dashboard/DashboardPage.test.tsx从零开始做一轮本地演示时,按这个顺序:
pnpm install- 配置两份
.env - 启动 MongoDB
- 执行
pnpm --filter @lecpunch/api seed - 启动 API 和 Web
- 用
demo-admin验证成员管理、网络策略和记录导出 - 用
demo-member验证成员端打卡主链路
- 架构设计:
docs/superpowers/specs/2026-03-31-lecpunch-architecture-design.md - 当前执行计划:
docs/superpowers/plans/2026-04-09-v1.1-execution-plan.md - Agent 协作规则:
AGENTS.md