# 仿飞书应用-23班6组 **Repository Path**: grade24-fullstack-class2/fang-feishu-app-class2-group6 ## Basic Information - **Project Name**: 仿飞书应用-23班6组 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2026-07-02 - **Last Updated**: 2026-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 仿飞书应用-2班6组 ## 当前交付状态(以此节为准) **当前没有可部署、可分发或可视为最终交付的 release。** `release/` 中的 Windows、Android、小程序、服务端目录及其证据属于 2026-07-19 的历史 V0020 测试产物,已经被当前 V0021/V0022 源码和跨端修复取代。它们不得上传、同步到官网、部署到服务器或作为本次交付证据。 - 当前本地目标:完成 Android、Windows、PC Web、Mobile H5、微信小程序和后端的同一套 API 契约、全量回归及真实设备验收。 - 允许顺序:先跑不改写产物的源代码门禁;再构建仅用于验收的私有候选包;完成 Android USB、Windows 清洁安装、微信开发者工具/真机验收并记录;最后才生成正式 release 和服务器交付包。 - 禁止顺序:在上述步骤完成前,不得运行正式同步、官网分发、服务器迁移、Caddy 更新、服务重启或部署命令。 - 当前 API/网站地址仅作为现有历史测试环境,不证明当前本地源码已经上线。完整的历史清单和当前门禁见 [release/FINAL_DELIVERY_MANIFEST.md](release/FINAL_DELIVERY_MANIFEST.md)。 > 下方带日期的阶段记录均为历史开发证据,不能覆盖本节的当前交付状态。 ## 2026-07-09 历史验收基线:后端可替换边界 当前项目已经推进到“可替换 Mock 后端基础”阶段:`backend/mock-api/runtime/backend-runtime.js` 统一创建 data source、session store、permission provider 和 repository registry,`backend/mock-api/runtime/data-sources/mock-json-data-source.js` 单独承接 Mock JSON data source adapter,`backend/mock-api/runtime/session-stores/session-store-adapter.js` 单独承接 Mock/Redis/JWT session provider adapter,`backend/mock-api/runtime/permission-providers/permission-provider-adapter.js` 单独承接静态角色矩阵和外部 RBAC provider adapter,`backend/mock-api/runtime/repositories/repository-registry-adapter.js` 单独承接默认 Mock repository registry、外部 registry provider 与未来 repository factory adapter,`server.js` 与各 controller/service 不再直接绑定一份不可替换的静态 Mock 数据。`GET /health` 会在统一 `{ code, message, data, traceId }` 响应内返回 `backendMode`、业务数据 driver、session driver、permission provider、repository registry/stores 和 schema 状态,便于后续替换 PostgreSQL、Redis session、真实 RBAC provider 或 .NET/Node repository。 当前仍然不是生产完成态:Mock JSON store 只证明后端分层、接口契约、权限语义、待办状态流和多端 API 调用链已经具备可继续替换的边界;它不等同真实 PostgreSQL/EF Core 迁移、生产 JWT/refresh token、SSO/MFA、完整 RBAC、WebSocket IM、对象存储、Android APK、Windows 安装包、微信开发者工具真机验收或生产级审计中心已经完成。 最新验收范围以运行命令为准:后端启动、`/health`、登录 token/session、未登录 `401`、无权限 `403`、统一待办列表/完成/退回、核心维护隔离,以及 PC Web、Mobile H5、Mobile App、小程序预览、PC Client 壳通过 API 获取工作台/待办/联系人/IM/企业/核心数据,均由 `test:mock-api`、`smoke:mock-api`、`smoke:frontend-api`、`smoke:core-sdk-e2e` 和 `check` 继续验证。新增 repository registry adapter 后,运行时可通过默认 Mock registry、注入式 registry provider 或 repository factory 生成每次请求的 repositories;新增 service dependency resolver 后,当前使用 repositories/stores 的业务 service 已统一优先消费注入式 repositories/services,再兼容旧 stores,最后才落回 Mock store factory;`check:architecture` 也会防止 runtime 和这些 service 重新退回内联仓库创建逻辑或恢复局部 `resolveDependency()` helper。 # 2026-07-09 PC Web / Mobile H5 浏览器级 API 验收 本轮补充真实浏览器级联调证据:复用默认 Mock API `http://127.0.0.1:5086`,启动 PC Web `http://127.0.0.1:5186` 与 Mobile H5 `http://127.0.0.1:5286` 后,在浏览器中实际提交登录表单并观察页面渲染。PC Web 员工端从 `#/login` 登录后进入 `#/employee`,页面展示后端返回的 `Contract Profile User`、`QR-LQ-2026`、联系人、IM 未读、账号安全中心等数据;PC Web 企业端使用隔离 origin `http://localhost:5186` 登录后进入 `#/enterprise`,页面展示企业工作台、员工数 `8`、后端待办 `5`、审批模板、工作台卡片和安全中心。 Mobile H5 员工端登录后显示 `sdkLoaded=true`、`sdkRequests=21`、`fallbackRequests=0`,页面展示移动工作台、后端待办、应用、二维码、假勤、通讯录、IM 会话和账号安全中心;Mobile H5 企业端使用 `http://localhost:5286` 隔离存储后登录,显示 `sdkLoaded=true`、`sdkRequests=11`、`fallbackRequests=0`,页面展示企业工作台、员工总数 `8`、后端待办 `7`、应用数量 `6`、工作台卡片 `6`、假勤规则和企业风险。H5 退出后尝试 `core@fang.cn` 登录仍停留在认证页,不出现员工/企业移动端壳,证明核心账号没有进入移动客户端。 该验收补强了“前端 UI 真实通过 API 渲染”的证据,但仍不等同自动化 Playwright 回归、Android 真机包、Windows 安装包、微信开发者工具真机调试、真实 PostgreSQL 部署或生产级 JWT/RBAC/SSO 完成。 本轮同时给 PC Web 请求层补充运行时诊断:`frontend/pc-web/core/api.js` 会维护 `window.__fangPcWebDiagnostics`,并同步 `document.documentElement.dataset.pcWebApiRequests`、`pcWebSdkRequests`、`pcWebFallbackRequests`、`pcWebDesktopBridgeRequests`、`pcWebFailedRequests`。诊断会记录最近 20 条后端路径和使用的适配器(shared SDK / fetch fallback / desktop bridge),后续浏览器验收可直接证明 PC Web 页面是否真实请求 `/api/v1`,而不是只看 DOM 文案。当前验证:`npm.cmd run test:pc-web-core` 166/166 通过。 # 2026-07-09 PC Client 桥接 API 扩展 本轮继续把 PC Client 壳从“只桥接登录、资料和待办”推进到更完整的后端 API 桥:`frontend/pc-client/bridge-api.js` 新增用户会话、二维码、安全中心、登录审计、应用中心、工作台卡片、联系人、联系人申请、企业通讯录、IM 会话/消息/成员/已读/发送、企业员工/风险/审批、核心租户/发布/策略/运维告警/工单等读取方法,并保留 `request(path, options)` 作为统一 `/api/v1` 请求入口。桌面桥新增 `executeAction(action, token, body)`,只执行后端返回的完整 action 契约,不在客户端根据资源 id 或状态推导路径;动态 IM 路径会做 path segment 编码,绝对 URL 仍会在桥层被拒绝。 该能力仍是 Electron 壳体 Mock API 桥,不等同 Windows `.exe` 安装包、真实系统通知、文件拖拽上传、设备合规、生产自动更新或离线缓存;它的价值是让 PC Client 渲染层也能统一通过后端能力获取工作台、联系人、IM、企业和核心维护数据,而不是在桌面壳里保留另一套静态业务模型。当前验证:`npm.cmd run test:pc-client` 18/18 通过,新增覆盖桌面桥读取工作台/通讯录/IM/企业/核心 API、通用后端 action 执行、动态路径编码和 preload 暴露方法。 # 2026-07-09 小程序认证入口 API 化 本轮继续把微信小程序从“只允许预设账号登录,注册/找回/邀请提示去 PC Web”的静态入口推进为后端认证 API 驱动:`frontend/mini-program/utils/core-sdk.js` 新增 `registerAccount()`、`resetPassword()`、`acceptInvite()`,分别调用 `POST /api/v1/auth/register`、`POST /api/v1/auth/password/reset`、`POST /api/v1/auth/invite/accept`;注册和邀请成功后复用同一 `hydrateSession()`,继续从后端拉取用户资料、二维码、账号安全中心、登录审计、工作台、统一待办、IM 和企业管理数据。`frontend/mini-program/app.js` 只作为薄 facade 暴露认证方法,`pages/login/login.js` / `login.wxml` 改为登录、注册、找回、邀请入企四个认证模式,页面不再把这些能力降级成“去 PC 操作”的提示。 该能力仍是 Mock API 预览,不等同生产级短信/邮件验证码、微信授权登录、OAuth/SSO、风控、人机校验、正式小程序审核发布或真机验收;它的价值是让小程序端也遵守“未登录只能进入认证页,认证和角色分流由后端返回”的前后端分离边界。当前验证:`npm.cmd run test:mini-program` 26/26 通过,新增覆盖小程序 SDK 注册/重置/邀请码入企请求体、小程序登录页四类认证模式,以及核心账号继续不能进入小程序客户端。 # 2026-07-09 IM Store 收口 本轮继续把 IM 会话、消息、群成员、已读、撤回、联系人接受后的直聊创建,以及统一待办里的群邀请接受/拒绝从 `im-service` / `contacts-service` / `todo-service` 私有逻辑推进到可替换 store 边界:新增 `backend/mock-api/stores/im-store.js`,统一负责 `chats` / `chatMessages` 集合初始化、会话可见性、消息列表读取并清零当前账号未读、发送文本/文件消息时生成消息 ID 和时间戳、维护 `lastMessage/updatedAt/unreadByAccount`、创建群聊默认字段和系统消息、群成员加入、直聊会话复用/创建、已读回执、本人消息撤回,以及群邀请接受/拒绝时更新 pending/accepted/rejected/member 列表和系统消息。`im-service` 现在主要保留同企业成员过滤、账号资料补全和响应 contract shape;`contacts-service` 接受联系人申请后的直聊创建也调用同一 `im-store`;`todo-service` 处理 `im_group_invite` 待办时不再直接维护会话源数组。 该能力仍是 Mock IM store,不等同生产级 WebSocket、长连接推送、离线消息投递、多端同步、消息 ACK、群主管理、群公告、群权限、消息审计、敏感词/风控或真实文件传输;它的价值是让会话和消息状态具备明确 repository 边界,后续迁移真实数据库、消息队列或 .NET repository 时,不需要把消息未读、撤回、群成员和群邀请状态流散落在多个 service 私有逻辑里。当前验证:局部 IM/联系人/待办联动状态 30/30,`npm.cmd run test:mock-api` 198/198,`npm.cmd run check`、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api` 和 `npm.cmd run smoke:core-sdk-e2e` 均通过。 # 2026-07-09 联系人 Store 收口 本轮继续把联系人列表、联系人申请、扫码申请、接受/拒绝申请和双向联系人关系从 `contacts-service` / `todo-service` 私有逻辑推进到可替换 store 边界:新增 `backend/mock-api/stores/contacts-store.js`,统一负责 `contacts` / `contactRequests` 集合初始化、联系人列表和申请列表按时间排序并返回副本、重复联系人判断、待处理申请复用、扫码申请默认字段生成、接受申请时写入 `ACCEPTED/handledAt` 并创建双向联系人关系、拒绝申请时写入 `REJECTED/handledAt/result`。`contacts-service` 现在主要保留账号资料补全、响应 contract shape、企业目录和接受后临时直聊创建;`todo-service` 处理联系人申请待办完成/退回时也回到同一 `contacts-store` 状态流,不再直接维护联系人申请源数组。 该能力仍是 Mock 联系人 store,不等同生产级通讯录权限、好友关系审计、反骚扰/风控、联系人分组、外部联系人管理、组织架构同步或完整 IM 会话 repository;它的价值是让联系人申请和联系人关系具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把扫码申请默认值、联系人双向关系和待办回写散落在 service 私有逻辑里。当前验证:局部联系人/待办联动状态 23/23,`npm.cmd run test:mock-api` 189/189,`npm.cmd run check`、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api` 和 `npm.cmd run smoke:core-sdk-e2e` 均通过;直聊会话和 IM 消息集合仍由后续 IM store 继续收口。 # 2026-07-09 核心维护 Store 收口 本轮继续把核心租户、发布任务、核心策略、运维告警、支持工单,以及统一待办里的核心运维告警回写从 `core-service` / `todo-service` 私有逻辑推进到可替换 store 边界:新增 `backend/mock-api/stores/core-store.js`,统一负责 `coreTenants` / `releases` / `corePolicies` / `coreOpsAlerts` / `supportTickets` 集合初始化、核心维护列表读取副本、创建发布任务时生成 `version/type/coverage/status` 后端默认值,以及核心运维告警完成时写入 `resolvedAt/resolvedBy`。`core-service` 现在主要保留响应 contract shape 和账号审计写入;`todo-service` 处理 `core_ops_alert` 待办时也回到同一 `core-store` 状态流,不再直接维护核心告警源数组。 该能力仍是 Mock 核心维护 store,不等同生产级租户管理、灰度发布平台、策略中心、运维告警中心、工单系统、任务队列、发布审计或真实核心运维权限系统;它的价值是让核心维护端事实具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把核心发布默认值、核心列表读取和核心告警回写散落在 service 私有逻辑里。当前验证:局部核心/待办联动状态 19/19,`npm.cmd run test:mock-api` 182/182,`npm.cmd run check`、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api` 和 `npm.cmd run smoke:core-sdk-e2e` 均通过。 # 2026-07-09 企业管理 Store 收口 本轮继续把企业员工列表、员工占位创建、企业风险列表,以及统一待办里的入职、离职和系统安全风险回写从 `enterprise-service` / `todo-service` 私有逻辑推进到可替换 store 边界:新增 `backend/mock-api/stores/enterprise-store.js`,统一负责 `enterpriseEmployees` / `enterpriseRisks` 集合初始化、企业显式归属过滤、缺失企业字段时按关联账号回退判断归属、创建员工时生成 `id/name/department/status/portal/enterprise` 后端默认值、入职完成/退回、离职确认/恢复和安全风险确认时间戳写入。`enterprise-service` 现在主要保留响应 contract shape,`todo-service` 处理企业入职/离职和安全风险待办时也回到同一 `enterprise-store` 状态流,不再直接维护企业员工或风险源数组。 该能力仍是 Mock 企业管理 store,不等同生产级组织架构、HR 入转调离流程、真实 RBAC、账号生命周期、资产交接、安全风控引擎或生产级审计;它的价值是让企业员工和企业风险这类后端事实具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把企业隔离、员工默认值、入职/离职状态流和风险处理散落在 service 私有逻辑里。当前验证:局部企业/待办联动状态 23/23,`npm.cmd run test:mock-api` 177/177,`npm.cmd run check`、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api` 和 `npm.cmd run smoke:core-sdk-e2e` 均通过。 # 2026-07-09 假勤 Store 收口 本轮继续把员工打卡状态、上下班状态流、企业假勤规则默认值和假勤待办联动从 `attendance-service` 私有逻辑推进到可替换 store 边界:新增 `backend/mock-api/stores/attendance-store.js`,统一负责 `attendanceByAccount` / `attendanceRules` 集合初始化、缺失员工打卡状态默认值、上班打卡写入 `checkedIn/checkInAt/checkOutAt`、下班打卡写入 `checkedOut/checkOutAt`、无上班记录时补齐 `checkInAt`,以及企业规则缺失时生成标准班次、机器人提醒、异常审批和机器人渠道配置。`attendance-service` 现在主要保留响应 contract shape 和账号审计写入,不再直接维护 `data.attendanceByAccount` / `data.attendanceRules` 的状态流;统一待办仍从 `todo-store` 聚合未下班打卡状态,完成假勤待办时通过 `attendance-service.checkOut()` 回到同一 store 状态流。 该能力仍是 Mock 假勤 store,不等同真实定位校验、Wi-Fi/蓝牙围栏、排班系统、补卡流程、异常审批引擎、假勤报表或生产级考勤合规;它的价值是让打卡事实和企业假勤规则具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把打卡状态流、规则默认值和待办回写散落在 service 私有逻辑里。当前验证:局部假勤/待办联动状态 20/20,`npm.cmd run test:mock-api` 170/170,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 审批 Store 收口 本轮继续把审批模板、审批实例列表、提交审批、企业审核和统一待办里的审批回写从 `approvals-service` / `todo-service` 私有逻辑推进到可替换 store 边界:新增 `backend/mock-api/stores/approvals-store.js`,统一负责 `approvals` / `approvalInstances` 集合初始化、员工与企业账号的模板可见范围、企业审批配置范围、审批实例按申请人/企业范围可见、按创建时间排序、提交审批时生成 `id/templateId/applicantAccount/title/status/amount/startAt/endAt/createdAt/reviewedAt/reviewerAccount/comment`,以及审核时写回 `APPROVED/REJECTED`、`reviewedAt/reviewerAccount/comment`。`approvals-service` 现在主要保留参数错误、HTTP 业务错误、响应 contract shape 和后端 action 描述;`todo-service` 处理审批待办完成/退回时也调用同一 `approvals-store.reviewInstance()`,不再单独手写审批实例状态流。 该能力仍是 Mock 审批 store,不等同真实 BPM 流程引擎、自定义表单、加签/转交/撤回、多级审批、审批权限策略或生产级审计;它的价值是让审批模板和审批实例状态具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把模板可见性、企业审核范围和待办回写散落在多个 service 私有逻辑里。当前验证:局部审批/待办联动状态 24/24,`npm.cmd run test:mock-api` 164/164,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 日程会议 Store 收口 本轮继续把日历事件列表、新建日程、会议预约、会议加入和会议同步日历状态从 `calendar-service` / `meetings-service` 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/calendar-store.js` 与 `backend/mock-api/stores/meetings-store.js`,统一负责 `calendarEvents` / `meetings` 集合初始化、按账号参与关系过滤可见日程和会议、按开始时间排序、创建日程时生成 `id/type/startAt/endAt/location/ownerAccount/participantAccounts/source/status`,创建会议时生成 `id/hostAccount/participantAccounts/durationMinutes/room/status/recordingEnabled/joinedAccounts` 并同步生成会议日历事件,加入会议时写回会议 `LIVE` 状态并同步会议日历事件状态。`calendar-service` 和 `meetings-service` 现在主要保留标题参数错误、HTTP 业务错误、响应 contract shape 和账号审计写入,不再直接维护 `data.calendarEvents` / `data.meetings` 的状态流。 该能力仍是 Mock 日程/会议 store,不等同真实重复日程、共享日历、提醒策略、会议室资源预订、音视频会议 SDK、录制文件、会议权限或生产级日历同步;它的价值是让日程和会议状态具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把参与人过滤、会议日历同步和加入状态回写散落在 service 私有逻辑里。当前验证:局部日程/会议状态 12/12,`npm.cmd run test:mock-api` 159/159,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 云文档 Store 收口 本轮继续把云文档列表、创建、正文保存、版本历史和评论从 `docs-service` 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/docs-store.js`,统一负责 `docs`、`docVersions`、`docComments` 集合初始化、按账号/企业/成员关系过滤可见文档、按更新时间排序、创建文档时生成 `id/ownerAccount/enterprise/space/status/version/updatedAt/memberAccounts/content` 和初始版本记录、正文保存时递增版本并写入版本历史、评论写入和评论排序。`docs-service` 现在主要保留标题/正文/评论参数错误、HTTP 业务错误、响应 contract shape、默认展示正文兜底和账号审计写入,不再直接维护 `data.docs` / `data.docVersions` / `data.docComments` 的状态流。 该能力仍是 Mock 云文档 store,不等同真实富文本编辑器、多人实时协作、冲突合并、权限继承、文档空间管理、评论线程或审计留痕;它的价值是让文档元数据、正文版本和评论状态具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把版本递增、评论写入和可见范围散落在 service 私有逻辑里。当前验证:局部云文档状态 8/8,`npm.cmd run test:mock-api` 151/151,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 云盘 Store 收口 本轮继续把云盘文件列表、上传默认值、访问校验、分享和下载元数据从 `drive-service` 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/drive-store.js`,统一负责 `driveFiles` 集合初始化、按账号/企业/共享关系过滤可见文件、按更新时间排序、上传时生成 `id/type/size/ownerAccount/enterprise/permission/sharedAccounts/updatedAt/previewText` 后端默认字段、分享时写入 `sharedAccounts/permission/updatedAt`,以及详情和下载前的访问校验。`drive-service` 现在主要保留文件名参数错误、分享目标账号同企业校验、HTTP 业务错误、响应 contract shape 和账号审计写入,不再直接维护 `data.driveFiles` 的可见性和状态流。 该能力仍是 Mock 云盘 store,不等同真实对象存储、二进制上传、下载签名、病毒扫描、文件版本、空间配额或企业级权限模型;它的价值是让云盘文件元数据、可见范围和分享状态具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把文件可见性、上传默认值和分享回写散落在 service 私有逻辑里。当前验证:局部云盘文件状态 7/7,`npm.cmd run test:mock-api` 145/145,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 通知 Store 收口 本轮继续把消息通知列表、摘要、发送和已读状态从 `notifications-service` 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/notifications-store.js`,统一负责 `notifications` 集合初始化、按收件账号过滤和时间排序、发送通知时的 `id/channel/category/status/createdAt/readAt/actionText` 后端默认值、单条已读状态写入、全部已读批量状态写入,以及摘要里的总数、未读数和渠道统计。`notifications-service` 现在主要保留同企业收件人校验、参数错误、响应 contract shape 和账号审计写入,不再直接维护 `data.notifications` 的列表、状态流和摘要统计。 该能力仍是 Mock 通知 store,不等同真实邮件/短信网关、移动推送、站内信投递服务、失败重试、投递回执或通知偏好中心;它的价值是让通知状态和统计口径具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把未读统计、已读回写和发送默认值散落在 service 私有逻辑里。当前验证:局部通知状态 8/8,`npm.cmd run test:mock-api` 140/140,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 开放平台 Store 收口 本轮继续把开放平台自建应用、Webhook 和投递日志从 `open-platform-service` 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/open-platform-store.js`,统一负责 `openPlatformApps`、`webhooks`、`webhookDeliveries` 集合初始化、企业范围过滤、自建应用密钥和默认启用状态生成、Webhook 默认投递状态、轮换密钥时间戳、测试投递记录创建,以及 Webhook 最后投递状态回写。`open-platform-service` 现在主要保留 OpenAPI 目录、参数校验、HTTP 业务错误、响应 contract shape 和操作日志写入,不再直接维护开放平台资源集合。 该能力仍是 Mock 开放平台 store,不等同生产级 OAuth/OpenAPI 网关、真实应用市场、Webhook 签名验签、投递重试队列、应用审核或多租户开发者平台;它的价值是让自建应用凭证、Webhook 配置和投递日志这类后端事实具备明确 repository 边界,后续迁移真实数据库和 .NET repository 时,不需要把密钥生成、投递状态回写和企业隔离散落在 service 私有逻辑里。当前验证:局部开放平台资源 10/10,`npm.cmd run test:mock-api` 134/134,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 应用中心 / 工作台 Store 收口 本轮继续把应用中心和工作台配置从 `apps-service` 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/apps-store.js`,统一负责 `apps` 与 `workbenchCards` 集合初始化、企业/员工账号可见范围过滤、员工端只看已上架应用、员工端只看已启用且应用已上架的工作台卡片、企业端状态更新时的后端时间戳写入,以及工作台卡片按 `sortOrder` 排序和应用状态补充。`apps-service` 现在主要保留参数校验、HTTP 业务错误、响应 contract shape 和操作日志写入,不再直接维护 `data.apps` / `data.workbenchCards` 的筛选与更新规则。 该能力仍是 Mock 应用配置 store,不等同真实应用市场、插件运行时、企业级应用分发、灰度发布或生产级多租户配置中心;它的价值是让应用目录和工作台卡片这类后端配置事实具备明确 repository 边界,后续替换真实数据库表或 .NET repository 时,不需要把员工端/企业端可见性规则散落在客户端或 service 私有逻辑里。当前验证:局部应用/工作台配置 8/8,`npm.cmd run test:mock-api` 127/127,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 管理后台配置 Store 收口 本轮继续把管理后台从 service 直接读写 Mock 集合推进到可替换 store 边界:新增 `backend/mock-api/stores/admin-store.js`,统一负责 `adminRoles` 和 `dataDictionaries` 集合初始化、角色列表读取、数据字典排序、重复值校验、字典项创建默认字段和排序号递增。`admin-service` 现在只负责当前企业管理员权限语义、参数错误、响应 shape 和操作日志,不再直接维护 `data.adminRoles` / `data.dataDictionaries` 的业务规则。 该能力仍是 Mock 管理配置 store,不等同生产 RBAC 权限表、数据字典管理后台、审批发布流程或多租户配置中心已经完成;它的价值是让角色/字典这类管理配置数据具备明确 repository 边界,后续可迁移到真实数据库表和 .NET repository。当前验证:局部管理后台配置 10/10,`npm.cmd run test:mock-api` 122/122,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-09 账号审计写入 Store 收口 本轮继续把后端账号审计事实收回到可替换 store 边界:`attendance-service`、`docs-service`、`drive-service`、`calendar-service`、`meetings-service`、`notifications-service` 和 `core-service` 原来各自手写的 `loginAudits.unshift(...).slice(0, 12)` 已统一改为调用 `stores/account-store.js#appendLoginAudit()`。打卡、云文档创建/保存/评论、云盘上传/分享、日历新建、会议预约/加入、通知发送和核心发布现在使用同一套 Mock 登录/操作审计字段:`id/loginIp/deviceName/loginResult/createdAt`。 这一步仍是 Mock 账号审计边界,不等同生产安全审计、设备指纹、登录地点识别或不可篡改审计中心;它的价值是让账号侧审计写入集中在 `account-store`,后续替换真实数据库账号表、登录审计表或安全事件表时,不需要逐个改协作业务 service。当前验证:局部审计链路 22/22,`npm.cmd run test:mock-api` 116/116,`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `node --test tests/e2e/contract.test.cjs` 均通过。 # 2026-07-08 Mock 数据 schema 元信息与迁移边界 本轮继续把 Mock 后端往“以后可替换真实数据库/真实仓储层”的方向推进:`backend/mock-api/stores/schema-registry.js` 新增非业务 metadata 字段 `__mockMeta`,记录当前 `schemaVersion=2026-07-08.mock-db.v1`、存储类型、初始化来源、创建/更新时间和迁移历史。`createMockDataStore()` 现在会在 seed 初始化、reset、文件持久化加载时统一套用 `initializeSchemaData()`;如果读取到旧版持久化 JSON 文件且没有 metadata,会自动写入 `legacy -> 2026-07-08.mock-db.v1` 迁移记录,并把补齐后的 schema 边界落回文件。 `GET /health` 的 `schema` 现在除了集合总数、记录数和集合状态,也返回 `metadata.status/current/initializedFrom/migrations`,运行级 smoke 可以确认 Mock 数据文件不仅可读写,也带有可检查的 schema 元信息。该能力仍然只证明 Mock JSON store 的边界、迁移记录和自检能力,不代表真实 PostgreSQL/EF Core 迁移、事务、生产级 JWT/RBAC/SSO 或生产部署已经完成。 # 2026-07-08 多端身份与安全默认值收口 本轮继续把“前端不得生成后端业务事实”落到多端 shape 层:`shared/core-sdk/src/shapes.js` 不再为缺失的姓名、职位、企业、部门、联系人来源、登录 IP、登录结果、角色文案、可信设备数、假勤班次/提醒/异常/机器人规则等字段生成默认业务值;缺失字段保留空值或 `null`,由 PC Web、Mobile H5 和微信小程序展示“等待后端同步”类提示。PC Web `auth` 归一化、`portal-shapers`、Mobile H5 fallback、小程序 SDK 同步收紧,避免某一端继续把缺失后端字段伪装成“未命名企业 / 企业员工 / SUCCESS / 127.0.0.1 / 0 台设备”。 企业端“一键新增员工”也从前端生成姓名和部门改为只调用 `POST /api/v1/enterprise/employees`,员工占位档案的姓名、部门、状态、端类型和企业归属继续由 `enterprise-service` 生成。当前验证:`node --test backend/mock-api/services/tests/enterprise-service.test.cjs frontend/pc-web/core/tests/portal-actions.test.js frontend/mobile-h5/tests/auth.test.cjs shared/core-sdk/tests/shapes.test.js frontend/mini-program/utils/tests/core-sdk.test.cjs` 68/68,`npm.cmd run test:pc-web-core` 163/163,`npm.cmd run test:mobile-h5` 15/15,`npm.cmd run test:mini-program` 18/18。 # 2026-07-08 账号安全会话中心后端闭环 本轮继续把账号安全中心从前端展示推进到后端 Mock API 业务能力:新增 `GET /api/v1/users/me/security/sessions` 查询当前账号的后端活跃会话,新增 `POST /api/v1/users/me/security/sessions/revoke-others` 撤销同账号其他端会话,路由分别使用 `user.self:read` 与 `user.self:write` 权限。会话列表只返回脱敏 `sessionId`、账号、角色、客户端类型、创建时间、过期时间、是否当前会话和状态,不把原始 Bearer token 暴露给客户端;撤销后只保留当前 token,并把账号安全中心的可信设备数更新为后端活跃会话数。 共享 SDK 新增 `user.getSecuritySessions(token)` 与 `user.revokeOtherSecuritySessions(token)`,`hydrate()` 会把 `securitySessions` 写入会话。PC Web 员工端设置页与企业端安全页已通过 `portal-loaders` 请求该接口,并只通过后端 POST 执行“撤销其他会话”;页面不再只展示本地静态安全信息。该能力仍是 Mock session 基线,不等同生产 JWT、刷新令牌、SSO、真实设备指纹、完整登录地点识别或生产级账号保护策略。 本轮继续把“账号保护”从展示开关推进为后端认证规则:`auth-service` 在开启 `accountProtection` 时记录连续错误密码次数,达到 3 次后写入 `security.failedLoginAttempts / lockedUntil / lastFailedLoginAt`,锁定期内即使密码正确也返回 HTTP `403`、业务码 `40303`;锁定过期后成功登录会由后端清零失败计数。该状态由 `account-store` 维护,文件型 Mock 模式会在失败响应中落盘,`smoke:mock-api` 已验证注册账号、连续失败、锁定、标准响应包络和重启后安全中心状态仍可读取。该能力仍是 Mock 风控基线,不等同生产设备指纹、短信/邮箱验证、MFA 挑战、风控模型或真实安全审计中心已完成。 当前验证:`npm.cmd run test:mock-api` 100/100,`npm.cmd run smoke:mock-api` 通过并输出 `openapiPaths=73`、`securitySessions=revoked 1`,`npm.cmd run smoke:core-sdk-e2e` 2/2,`node --test tests/e2e/contract.test.cjs` 通过,PC Web 账号安全会话相关单测 53/53 通过。 # 2026-07-08 OpenAPI 权限元数据补齐 本轮继续把路由层权限契约同步到 `/openapi.json`:`backend/mock-api/contracts/openapi-spec.js` 现在会从真实注册路由读取 `public` 与 `permission`,为公开接口写入 `security: []` 和 `x-public=true`,为受保护接口写入 `security: [{ bearerAuth: [] }]` 和对应 `x-permission`,同时在 `components.securitySchemes.bearerAuth` 声明 Mock Bearer 会话。新增 OpenAPI 测试逐条比对路由权限与文档权限,确保登录/注册/OAuth token 等公开接口不伪装成受保护接口,待办、用户中心、企业管理、核心维护等受保护接口都能在契约里看到后端 permission。当前验证:`npm.cmd run test:mock-api` 90/90、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e`、`npm.cmd run check` 均通过。 # 2026-07-08 路由层权限契约显式化 本轮继续把“权限和角色必须由后端控制”往路由注册层收紧:所有受保护的 Mock API 路由现在都在 `backend/mock-api/routes/*-routes.js` 显式声明 `permission`,`dispatchLayeredRoute()` 会在调用 controller 前先执行 route-level permission 校验;controller/service 原有的 `requirePermission()` 仍保留,形成路由入口和业务入口两层后端防线。公开接口如登录、注册、找回密码、邀请码入企和开放平台 OAuth token 交换继续标记为 `public` 且不声明 permission。`permission-middleware.test.cjs` 新增全量路由扫描,保证 87 条注册路由中每条受保护 API 都声明合法后端权限,并验证 `POST /api/v1/auth/logout` 这类会话写接口必须先通过路由层权限。当前验证:`npm.cmd run test:mock-api` 90/90、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e`、`npm.cmd run check` 均通过。 # 2026-07-08 OpenAPI 契约模块分层 本轮继续把 HTTP 入口里的接口契约下沉到 contracts 层:`backend/mock-api/server.js` 不再内联 OpenAPI 对象,而是通过 `backend/mock-api/contracts/openapi-spec.js` 输出 `openApiSpec`,入口只在 `/openapi.json` 时返回该契约。`backend/mock-api/contracts/tests/openapi-spec.test.cjs` 已覆盖 OpenAPI 元信息、登录/注册、用户中心、统一待办、通讯录、IM、假勤、工作台、企业管理、管理后台和核心维护等关键路径,以及待办完成/退回、管理后台状态更新、假勤打卡、核心发布等写入方法声明;本轮继续新增“注册路由 method/path 与 OpenAPI paths 全量一致”测试,防止后续新增 API 只改路由或只改文档导致契约漂移。`npm.cmd run smoke:mock-api` 现在也会真实请求 `/openapi.json`,验证该契约对外可访问并包含关键路径,本轮输出 `openapiPaths=70`。当前验证:`npm.cmd run test:mock-api` 90/90、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e`、`npm.cmd run check` 均通过。 # 2026-07-08 Mock API 入口瘦身与 seed 数据分层 本轮继续把后端入口从“大文件堆数据”往真实分层推进:`backend/mock-api/server.js` 不再内联 500 多行 Mock seed 和建模 helper,入口只保留 HTTP 启动、鉴权、路由分发、测试 reset 和持久化提交;基础账号、企业、IM、假勤、工作台、审批、核心维护等初始数据已抽到 `backend/mock-api/stores/seed-data.js`,作为 store 层的可替换 seed 模块。新增 `backend/mock-api/stores/tests/seed-data.test.cjs` 验证员工/企业/核心三类账号、假勤规则、核心策略和运维告警等后端基线数据可初始化 `createMockDataStore()`。当前验证:`npm.cmd run test:mock-api` 90/90、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e`、`node --test tests/e2e/contract.test.cjs`、`npm.cmd run check` 均通过。 # 2026-07-08 Mock API 可选文件持久化基准 本轮把 Mock API 从纯内存运行推进到可选文件持久化:`backend/mock-api/stores/mock-data-store.js` 支持通过 `FANG_MOCK_DATA_FILE` 从 JSON 文件恢复业务数据并在成功写请求后落盘,`backend/mock-api/stores/session-store.js` 支持通过 `FANG_MOCK_SESSION_FILE` 持久化 Bearer session。默认不设置环境变量时仍是内存模式,不污染单测,也不把当前阶段伪装成真实数据库;它只是为后续替换真实数据库、真实仓储层和生产级认证系统预留稳定边界。`backend/mock-api/server.js` 已在非 GET 成功请求后统一提交业务数据,注册账号、资料修改、待办处理、打卡、消息、企业管理等 Mock 写入可以在本地重启后保留。`npm.cmd run smoke:mock-api` 现在会临时启用数据文件和 session 文件,完成待办/管理后台写操作后重启 Mock API,并用原 token 验证状态仍可读取;当前验证:`npm.cmd run test:mock-api` 90/90、`npm.cmd run smoke:mock-api` 通过,smoke 输出包含 `persistence=verified after restart`。 # 2026-07-08 前端审批/应用状态展示去默认业务值 本轮继续清理前端展示层的本地业务推导:PC Web `portal-shapers.shapeApprovalRow()` 只在后端明确返回 `PUBLISHED/DRAFT` 时显示“已发布/草稿”,缺状态审批配置保留空值,不再把缺字段伪装成草稿;PC Web `appStatusLabel()` 也只把明确 `DRAFT` 显示为草稿,未知状态直接展示后端原值。Mobile App 员工页 `firstApprovalTemplate` 不再在没有已发布模板时退回选择第一条模板,缺状态或草稿模板不会触发“提交审批”轻操作,而是提示等待后端返回已发布模板。当前验证:`node --test frontend/pc-web/core/tests/shapes.test.js frontend/pc-web/core/tests/portal-shapers.test.js frontend/pc-web/core/tests/enterprise-pages.test.js` 27/27、`node --test frontend/mobile-app/utils/tests/pages.test.cjs` 7/7 通过。 # 2026-07-08 管理/通讯录/企业/会议契约继续去默认值 本轮继续把后端契约层的隐式业务默认值收回 service:Mock API `admin-contract.shapeAdminUser()` 不再把缺失 `status/portal/role` 补成在岗、员工端或员工角色,账号安全开关缺失时保留 `null`;`shapeAdminRole()` 不再补 `ENABLED`,`shapeDictionary()` 不再把缺失 `enabled` 补成 `false`,缺 `method` 的管理后台 action 会被丢弃。`contacts-contract.shapeDirectoryEntry()` 不再补 `portal=employee`;`enterprise-contract.shapeEnterpriseEmployee()` / `shapeEnterpriseApproval()` 不再补 `待激活/employee/DRAFT`;`meetings-contract.shapeActions()` 不再给半截 action 补 `POST`;`open-platform-contract.shapeOpenApi()` 不再把缺失目录方法补成 `GET`。创建字典、新增员工、创建会议、创建开放平台资源等默认值仍由后端 service 显式写入。当前验证:`npm.cmd run test:mock-api` 76/76、`npm.cmd --prefix shared/core-sdk test` 47/47、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `git diff --check` 均通过。 # 2026-07-08 通知缺状态后端契约去默认值 本轮继续收紧通知状态边界:Mock API `notifications-contract.shapeNotification()` 不再把缺失 `status` 补成 `UNREAD`,`notificationActions()` 也只会在后端明确返回 `UNREAD` 时生成 `mark-read` action;`notifications-service` 的摘要未读数和 `readAll()` 也只处理显式未读通知,缺状态旧数据保留为空状态、不会被统计为未读,也不会被“全部已读”改写。当前验证:`npm.cmd run test:mock-api` 63/63 通过。 # 2026-07-08 日历事件状态后端契约去默认值 本轮继续收紧日历事件状态边界:Mock API `calendar-contract.shapeCalendarEvent()` 不再把缺失 `status` 补成 `SCHEDULED`,缺状态日历事件保留为空值;`calendar-service.create()` 新建日程时仍由后端明确写入真实 `SCHEDULED`,会议预约同步日历也仍由后端写入状态。新增 `calendar-service` 单测覆盖缺状态旧事件不被 contract 伪造成已预约,以及新建日程默认状态由后端生成。当前验证:`npm.cmd run test:mock-api` 65/65 通过。 # 2026-07-08 云文档状态后端契约去默认值 本轮继续收紧云文档状态边界:Mock API `docs-contract.shapeDoc()` 不再把缺失 `status` 补成“协作中”,缺状态文档在列表和详情中都保留为空值;`docs-service.create()` 新建文档时仍由后端明确写入真实“协作中”,保存正文、评论和版本流转仍由后端维护。新增 `docs-service` 单测覆盖缺状态旧文档不被 contract 伪造成协作中,以及新建文档默认状态由后端生成。当前验证:`npm.cmd run test:mock-api` 67/67 通过。 # 2026-07-08 应用中心与工作台后端契约去默认值 本轮继续收紧应用中心/工作台状态边界:Mock API `apps-contract.shapeApp()` 不再把缺失 `status` 补成 `DRAFT`,缺状态应用不会自动获得 `publish` action;`shapeWorkbenchCard()` 不再把缺失 `appStatus/portal/enabled` 补成 `DRAFT/employee/false`,缺开关卡片不会自动获得启停 action。`shapeAction()` 也不再为缺 `method` 的不完整 action 补 `POST`,避免旧数据被伪造成可执行后端动作。共享 SDK 与 Mobile H5 fallback 同步移除工作台 `portal=employee` 默认值。当前验证:`npm.cmd run test:mock-api` 68/68、`npm.cmd --prefix shared/core-sdk test` 47/47、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 和 `git diff --check` 均通过。 # 2026-07-08 会议状态与加入动作去后端契约默认值 本轮继续收紧会议状态和加入动作边界:Mock API `meetings-contract.shapeMeeting()` 不再把缺失 `status` 补成 `SCHEDULED`,缺状态会议保留为空值;`join` action 也不再仅凭会议 id 生成,必须基于后端明确的会议状态。`meetings` service 新建会议时仍负责写入真实 `SCHEDULED`,加入会议时写回 `LIVE` 并同步日历事件。当前验证:`npm.cmd run test:mock-api` 63/63、`npm.cmd --prefix shared/core-sdk test` 47/47 通过。 # 2026-07-08 审批状态后端契约去默认值 本轮继续补齐审批流程的后端契约边界:Mock API `approvals-contract.shapeApprovalTemplate()` 不再把缺失 `status` 补成 `PUBLISHED`,`shapeApprovalInstance()` 不再把缺失 `status` 补成 `PENDING`;新建审批实例时仍由 `approvals` service 明确生成真实 `PENDING`,审核流转由 service 写回 `APPROVED/REJECTED`。这样缺状态旧数据不会被 contract 伪造成已发布模板或待审批实例,也不会得到审核 action。当前验证:`npm.cmd run test:mock-api` 63/63、`npm.cmd --prefix shared/core-sdk test` 47/47 通过。 # 2026-07-08 联系人申请后端契约去默认状态 本轮补齐联系人申请的后端契约边界:Mock API `contacts-contract.shapeContactRequest()` 不再把缺失的 `status` 补成 `PENDING`,缺字段会原样保留为空值;新建扫码申请时仍由 `contacts` service 明确写入真实 `PENDING`。这样后端 contract 不会把旧数据或缺字段响应伪造成待处理申请,前端仍只展示后端状态和完整 `actions[]`。当前验证:`npm.cmd run test:mock-api` 62/62、`npm.cmd --prefix shared/core-sdk test` 47/47 通过。 # 2026-07-08 企业风险等级去前端默认值 本轮继续把企业风险等级收回后端:`shared/core-sdk.shapeEnterpriseRisk()`、Mock API `enterprise-contract` 和微信小程序适配层不再把缺失的 `level` 补成 `MEDIUM`;PC Web、Mobile H5 和 Mobile App 展示层遇到缺等级风险时显示等待后端风险等级同步,而不是伪装成中优先级或待处理。高风险待办仍由后端 `todo-store` 基于明确的 `level=HIGH` 派生,客户端只消费后端返回的风险事实和待办 action。当前验证:`npm.cmd --prefix shared/core-sdk test` 47/47、`npm.cmd run test:mock-api` 61/61、`npm.cmd run test:pc-web-core` 162/162、`npm.cmd run test:mini-program` 17/17、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mobile-app` 35/35 通过。 # 2026-07-08 会议录制开关去前端默认值 本轮继续把会议配置事实收回后端:`shared/core-sdk.shapeMeeting()` 和 Mock API `meetings-contract` 不再把缺失的 `recordingEnabled` 补成 `false`,缺字段保留为 `null`;Mobile App 预约会议也不再在用户未明确选择录制时提交 `recordingEnabled=false`,由后端 service 负责创建默认值。会议加入按钮仍只消费后端返回的完整 `actions[]`。当前验证:`npm.cmd --prefix shared/core-sdk test` 47/47、`npm.cmd run test:mock-api` 60/60、`npm.cmd run test:mobile-app` 35/35 通过。 # 2026-07-08 管理后台权限声明去前端默认值 本轮继续收紧企业管理后台权限字段:`shared/core-sdk.shapeAdminUser()` 不再把后端缺失的 `canChangeStatus` 补成 `false`,而是保留为 `null`;后端明确返回 `true/false` 时才展示为明确权限事实。用户冻结/恢复按钮仍只根据后端完整 `actions[].code/method/apiPath/body` 渲染和提交,缺少 action 时不执行任何状态流。当前验证:`npm.cmd --prefix shared/core-sdk test` 47/47 通过。 # 2026-07-08 Mobile H5 待办来源兜底去前端默认值 本轮继续收紧 Mobile H5 离线 fallback:`frontend/mobile-h5/app.js#shapeTodoRow()` 不再在共享 SDK 未加载时把缺失的待办 `sourceType` 补成 `system`,也不再把缺失的 `priority` 补成 `NORMAL`;页面缺少来源时显示“等待后端来源同步”,缺少优先级时继续显示“等待后端优先级同步”。这样即使 H5 处在 fallback 模式,也不会把后端未返回的待办来源和优先级伪造成系统待办或普通优先级。当前验证:`npm.cmd run test:mobile-h5` 13/13 通过。 # 2026-07-08 账号安全与打卡布尔状态去前端默认值 本轮继续把账号安全开关和员工打卡状态从客户端默认值中收回:`shared/core-sdk.shapeSecurity()`、`shapeAttendance()`、`shapeAdminUser()` 不再在后端缺少 `accountProtection/deviceApproval/loginAlert/abnormalLoginGuard/mfaEnabled/checkedIn/checkedOut` 时补成 `false`,而是保留为 `null`。PC Web、Mobile H5、Mobile App 预览和微信小程序遇到缺字段时显示“等待后端状态同步 / 等待后端打卡状态同步”,只有后端明确返回 `true/false` 时才展示开启、关闭、已打卡或未打卡;设置表单和管理动作仍会把用户明确选择提交给后端。当前验证:`npm.cmd --prefix shared/core-sdk test` 47/47、`npm.cmd run test:pc-web-core` 162/162、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mini-program` 17/17、`npm.cmd run test:mobile-app` 35/35、`npm.cmd run test:mock-api` 60/60、`node --test tests/e2e/contract.test.cjs` 14/14、`npm.cmd run check`、`npm.cmd run smoke:mock-api`、`npm.cmd run smoke:core-sdk-e2e` 均通过。 # 2026-07-08 启停开关展示去前端默认值 本轮继续把后端配置开关从客户端默认值中收回:`shared/core-sdk.shapeAttendanceReminder()`、`shapeAttendanceException()`、`shapeWorkbenchCard()` 和 `shapeDictionary()` 不再在后端缺少 `enabled` 时默认成启用或停用,而是保留为 `null`;PC Web 企业假勤规则、工作台配置、企业后台数据字典以及 Mobile H5/微信小程序工作台适配层遇到缺开关字段时显示或保留“等待后端状态同步”。企业侧边栏统计也只把后端明确返回 `enabled=false` 的工作台卡片计入待发布/停用数量,不再把缺字段算作停用。当前验证:`npm.cmd --prefix shared/core-sdk test` 47/47、PC Web 企业页/企业后台/侧边栏相关测试 21/21、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mini-program` 17/17 通过。 # 2026-07-08 协作流程状态展示去前端默认值 本轮继续把通知、云文档、日程会议、审批、应用中心、工作台卡片和假勤班次的业务状态收回后端:`shared/core-sdk.shapeNotification()`、`shapeDoc()`、`shapeCalendarEvent()`、`shapeMeeting()`、`shapeApprovalTemplate()`、`shapeApprovalInstance()`、`shapeApp()`、`shapeWorkbenchCard()` 和 `shapeAttendanceShift()` 不再在后端缺少状态字段时补成 `UNREAD/协作中/SCHEDULED/PUBLISHED/PENDING/DRAFT/ENABLED`。PC Web 员工协作页和企业管理页遇到缺状态时统一显示“等待后端状态同步”,不再把缺字段伪装成已读、协作中、待加入、待审批、草稿或启用。当前验证:`npm.cmd --prefix shared/core-sdk test` 47/47、`npm.cmd run test:pc-web-core` 162/162、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mini-program` 17/17、`npm.cmd run test:mobile-app` 34/34 通过。 # 2026-07-08 联系人申请状态展示去前端默认值 本轮继续收紧联系人申请请求流:`shared/core-sdk.shapeContactRequest()` 不再在后端缺少 `status` 时补成 `PENDING`;PC Web、Mobile H5、Mobile App 预览和微信小程序工作台遇到缺状态联系人申请时显示等待后端状态同步,不再默认为“待处理”或空白。联系人申请的通过按钮仍只来自后端返回的完整 `actions[].code/method/apiPath/resultField/defaultComment`,前端不再根据 `direction/status` 推导操作。当前验证:`npm.cmd --prefix shared/core-sdk test` 46/46、`npm.cmd run test:pc-web-core` 162/162、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mini-program` 17/17、`npm.cmd run test:mobile-app` 34/34 通过。 # 2026-07-08 统一待办状态展示去前端默认值 本轮继续把统一待办的业务状态收回后端:`shared/core-sdk.shapeTodo()` 不再在后端缺少 `sourceType/priority/status` 时补成 `system/NORMAL/PENDING`;PC Web 员工端与企业端、Mobile H5、Mobile App 预览和微信小程序适配层也不再把缺失待办状态显示成“待处理”或把缺失优先级显示成“普通/NORMAL”。缺字段时端侧只显示等待后端状态或优先级同步,待办按钮仍只来自后端返回的完整 `actions[]`。当前验证:`npm.cmd --prefix shared/core-sdk test` 46/46、`npm.cmd run test:pc-web-core` 162/162、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mini-program` 17/17、`npm.cmd run test:mobile-app` 34/34 通过。 # 2026-07-08 管理后台与核心维护状态展示去前端默认值 本轮继续收紧管理后台和核心维护端的业务状态边界:`shared/core-sdk.shapeAdminUser()` 不再把缺失的 `status/portal` 补成 `在岗/employee`,`shapeAdminRole()` 不再把缺失的角色 `scope/status` 补成 `企业端/ENABLED`,`shapeTenant()`、`shapePolicy()`、`shapeOpsAlert()`、`shapeSupportTicket()` 也不再为缺失的租户、策略、告警或工单状态补默认业务值。PC Web 企业管理后台和核心维护页遇到缺失状态时统一显示“等待后端状态同步”,避免客户端把未返回字段伪造成启用、待激活或处理中。当前验证:`npm.cmd --prefix shared/core-sdk test` 46/46、`npm.cmd run test:pc-web-core` 162/162 通过。 # 2026-07-08 企业员工与核心发布状态展示去前端默认值 本轮继续收紧“后端拥有业务状态”的展示边界:`shared/core-sdk.shapeEnterpriseEmployee()` 不再把缺失的 `status/portal` 补成 `待激活/employee`,`shapeRelease()` 不再把缺失的发布 `status` 补成 `进行中`;PC Web 企业员工表、核心发布页、Mobile H5 企业员工 shape 和小程序企业员工 shape 均改为保留后端返回结果,缺字段时显示等待后端同步。创建员工和创建发布任务时的默认状态仍由 Mock API 后端生成,前端只展示后端实际返回。当前验证:`npm.cmd --prefix shared/core-sdk test` 46/46、PC Web 相关页面/shaper 测试 17/17、`npm.cmd run test:mobile-h5` 13/13、`npm.cmd run test:mini-program` 17/17 通过。 # 2026-07-08 开放平台状态展示去前端默认值 本轮继续把开放平台状态事实收回后端:`shared/core-sdk` 的 `shapeOpenPlatformApp()`、`shapeWebhook()` 和 `shapeWebhookDelivery()` 不再在后端缺少 `status/lastDeliveryStatus` 时补成 `ENABLED/PENDING`;PC Web 企业开放平台页也不再把缺状态资源显示成“停用”,而是显示“等待后端状态同步 / 等待后端投递状态同步”。这样创建默认值由后端生成,展示缺失字段也不会被前端伪造成业务状态。当前验证:`npm.cmd --prefix shared/core-sdk test` 46/46、`node --test frontend/pc-web/core/tests/enterprise-open-platform-pages.test.js frontend/pc-web/core/tests/portal-shapers.test.js` 8/8 通过。 # 2026-07-08 后端运行级基准复验 本轮对“能跑起来的后端基准”做了真实进程复验:`npm.cmd run smoke:mock-api` 会临时启动 Mock API 并验证 `/health`、未登录 `401/40100`、跨角色 `403/40300`、核心维护端隔离、企业管理后台和待办 action 完成/退回;本次输出 `corePolicies=8`、`coreOpsAlerts=6`、`adminUsers=5`、`operationLogs=5`、`todos=4`,并完成 `todo-risk-risk-1`、退回 `todo-approval-approval-inst-1`。`npm.cmd run smoke:core-sdk-e2e` 同步通过员工端“登录 -> hydrate -> 加好友 -> 同意 -> 发消息 -> 打卡 -> 通知 -> 退出”和企业端“登录 -> 拉企业数据 -> 退出”2 条端到端链路。 # 2026-07-08 管理后台用户状态 action 契约收紧 本轮继续把企业管理后台用户冻结/恢复从 SDK 直连写入口收回到后端契约:`shared/core-sdk` 已移除公开的 `admin.updateUserStatus(account, status, token)`,新增 `admin.executeAction(action, body, token)` / `admin.normalizeAdminUserAction()` 统一执行 `/admin/users` 返回的完整 `actions[].code/method/apiPath/body`。PC Web 企业管理后台原本已按后端 action 渲染按钮,现在 SDK 入口也不会再鼓励上层按账号和本地状态拼 `/admin/users/{account}/status`。当前验证:`npm --prefix shared/core-sdk test` 45/45 通过。 # 2026-07-08 应用中心 / 开放平台 action 契约收紧 本轮继续把共享 SDK 中应用中心、工作台和开放平台资源状态写入口收回到后端契约:`shared/core-sdk` 已移除公开的 `apps.updateAppStatus()`、`apps.updateCard()`、`workbench.updateCard()`、`openPlatform.rotateSecret()` 与 `openPlatform.sendWebhookTest()`,新增 `apps.executeAction()` / `openPlatform.executeAction()` 统一执行后端 `/apps`、`/workbench/cards`、`/open-platform/apps`、`/open-platform/webhooks` 返回的完整 `actions[].code/method/apiPath/body`。PC Web 原本已经按后端 action 渲染按钮,现在 SDK 入口也不会再鼓励上层按资源 id 或状态拼接应用上下架、工作台启停、轮换密钥或 Webhook 测试投递路径。当前验证:`npm --prefix shared/core-sdk test` 45/45 通过,`npm run check` 通过。 # 2026-07-08 通知汇总全读 action 契约收紧 本轮继续把通知“全部已读”从前端固定入口收回到后端契约:`GET /api/v1/notifications/summary` 在存在未读通知时返回 `actions[].code=read-all`、`method`、`apiPath`、`body`,PC Web 和 Mobile App 只在摘要里存在完整 `read-all` action 时渲染“全部已读”按钮,并通过 `notifications.executeAction()` 或后端 `apiPath/method/body` 提交;缺少该 action 时只显示等待/空态,不再由客户端自行拼 `/notifications/read-all`。当前验证:`npm run test:mobile-app` 34/34 通过,`npm --prefix shared/core-sdk test` 45/45 通过。 # 2026-07-08 认证后端基准测试补强 本轮把注册、登录、找回密码和登出纳入后端 service 单测:新增 `backend/mock-api/services/tests/auth-service.test.cjs`,覆盖公开注册员工/企业管理员、注册后由后端生成个人资料、二维码、账号安全中心、登录审计、会话 token 和员工档案占位,拒绝公开注册 `core` 账号、重复账号和缺字段注册,并验证登录失败、登录成功、密码重置与登出会话删除。`auth-service` 的注册标签拆分已支持逗号、中文逗号、分号和空白;`npm run test:mock-api` 当前 54/54 通过。 # 2026-07-08 统一待办后端来源同步 本轮继续把统一待办从“启动时一次性 Mock 种子”推进为“后端按业务源同步的请求/返回模型”。`backend/mock-api/stores/todo-store.js` 现在会在读取 `/api/v1/todos` 或处理待办前同步联系人申请、审批实例、假勤未下班状态、企业入职占位、企业离职交接、企业安全风险、IM 群邀请和核心运维告警等来源;新建联系人申请、提交审批或新增待激活员工后,再次读取待办会由后端生成对应 `sourceType` 待办。源状态已完成时,联系人申请、审批、假勤、企业入职/离职和 IM 群邀请待办会由后端同步为完成或退回,IM 群邀请完成/退回还会写回群邀请名单、成员列表和系统消息,避免前端保留过期流程状态。`npm run test:mock-api` 已扩展到 54/54,新增覆盖待办来源动态同步、源状态回写、企业离职待办来源、待办处理回写业务源、来源级动作声明、未声明动作后端拒绝和 IM 群邀请源回写。 # 2026-07-08 Shared SDK legacy write helper 清理 本轮继续把共享层里残留的 direct write helper 收口:`shared/core-sdk` 已移除 `contacts.accept()`、`attendance.checkIn()/checkOut()`、`notifications.readOne()/readAll()`、`meetings.join()`、`approvals.approve()/reject()`、`admin.updateUserStatus()`、`apps.updateAppStatus()/updateCard()` 与 `openPlatform.rotateSecret()/sendWebhookTest()`。这些状态流写操作现在统一要求消费后端返回的 `actions[]`,再通过各领域 `executeAction()` 发请求,避免上层继续按资源 id 或本地状态拼接流程接口。`npm --prefix shared/core-sdk test` 与端到端 SDK 联调测试会同步验证这一点。 # 2026-07-08 Mobile App legacy helper 清理 本轮继续收紧移动 App 写入边界:`frontend/mobile-app/utils/session.js` 已移除 `acceptContactRequest(requestId)`、`approveMobileApproval(instanceId)` 和 `rejectMobileApproval(instanceId)` 这些按 resource id 拼接路径的 legacy facade。员工端联系人申请和企业端审批页现在只能通过 `executeContactRequestAction(action)` 与 `executeMobileApprovalAction(action)` 消费后端 `/contacts/requests`、`/approvals/instances` 返回的完整 `actions[]` 契约,不再留下移动端按 id 直接写入的侧门。`npm run test:mobile-app` 已新增断言,确认 session facade 不再导出这些 helper。 # 2026-07-08 小程序联系人申请 legacy helper 清理 本轮继续收紧微信小程序联系人申请边界:`frontend/mini-program/utils/core-sdk.js` 与 `frontend/mini-program/app.js` 已移除固定 `acceptContactRequest(requestId)` 通道,小程序工作台只保留 `executeContactRequestAction(action, body)` 作为写入口,必须消费后端 `/contacts/requests` 返回的完整 `actions[].code/method/apiPath/resultField` 后才能提交请求;页面 `workbench.js` 中的 legacy wrapper 也已移除,避免前端再按申请 id 拼 `/contacts/requests/{id}/accept`。`npm run test:mini-program` 当前为 17/17。 # 2026-07-08 Mobile App 会议/通知 actions 契约收紧 本轮继续把 Mobile App 员工端“加入会议”和通知“单条已读 / 全部已读”收回到后端契约:员工页只在后端 `/meetings`、`/notifications`、`/notifications/summary` 返回完整 `actions[]` 时渲染对应按钮,点击后分别通过 `executeMobileMeetingAction(action)`、`executeMobileNotificationAction(action)` 或摘要 `read-all` action 执行后端给出的 `apiPath/method/body`;移动 App facade 已移除固定 `joinMobileMeeting()` / `markMobileNotificationRead()` 导出,`markAllMobileNotificationsRead()` 也必须先取得 `notificationSummary.actions[].code=read-all`,避免页面继续按资源 id 或固定路径拼 `/meetings/{id}/join`、`/notifications/{id}/read`、`/notifications/read-all`。`shared/core-sdk` 新增 `meetings.executeAction()` / `notifications.executeAction()` 及对应 `normalize*Action()`,会拒绝缺少 `code/method/apiPath` 或绝对 URL 的 action。`npm run test:mobile-app` 当前为 34/34,`npm --prefix shared/core-sdk test` 扩展到 45/45。 # 2026-07-08 Mobile App 假勤打卡 actions 契约收紧 本轮继续把 Mobile App 员工端假勤“上班打卡 / 下班打卡”收回到后端契约:`pages/employee/employee.vue` 只遍历 `session.attendance.actions[]` 渲染按钮,点击后通过 `executeMobileAttendanceAction(action)` 执行后端给出的 `apiPath/method/body`;移动 App facade 已移除固定 `checkIn()` / `checkOut()` 导出,避免页面继续拼 `/attendance/check-in|check-out`。`shared/core-sdk` 新增 `attendance.executeAction(action, body, token)` 与 `normalizeAttendanceAction()`,会拒绝缺少 `code/method/apiPath` 或绝对 URL 的 action。当前回归验证:`npm run test:mobile-app` 34/34,`npm --prefix shared/core-sdk test` 45/45。 # 2026-07-08 Mobile H5 假勤打卡 actions 契约收紧 本轮继续把 Mobile H5 员工端假勤“上班打卡 / 下班打卡”收回到后端契约:H5 只根据 `/api/v1/attendance/status` 返回的完整 `actions[].code/method/apiPath/body` 渲染 `attendance-action` 按钮,点击时按后端给出的 `apiPath/method/body` 提交;旧的 `data-action="check-in"` / `data-action="check-out"` 和固定 `/attendance/check-in|check-out` 路径已移除。缺少完整 action 时 H5 只显示“等待后端打卡动作同步”。`npm run test:mobile-h5` 当前为 12/12。 # 2026-07-08 PC Web 假勤打卡 actions 契约收紧 本轮把员工端假勤“上班打卡 / 下班打卡”也收回到后端契约:`GET /api/v1/attendance/status` 会根据当前账号打卡状态返回 `actions[].code/label/method/apiPath/tone/body/defaultComment`,未上班返回 `check-in`,已上班未下班返回 `check-out`,已下班返回空 `actions`。PC Web 员工假勤页只渲染后端提供的 `attendance-action`,并按 `apiPath/method/body` 提交;不再由前端固定生成 `/attendance/check-in` 或 `/attendance/check-out` 请求。当前回归验证:`npm run test:pc-web-core` 160/160,`npm --prefix shared/core-sdk test` 45/45,`npm run test:mock-api` 54/54。 # 2026-07-08 PC Web 会议加入 actions 契约收紧 本轮把员工端会议“加入会议”也收回到后端契约:`GET /api/v1/meetings` 与 `POST /api/v1/meetings` 会为当前账号可加入但尚未加入的会议返回 `actions[].code/label/method/apiPath/tone/body/defaultComment`,已加入会议和缺少完整 action 的旧数据只显示状态。PC Web 日历会议页只渲染后端提供的 `join` action,并按 `apiPath/method/body` 提交;不再由前端按会议 id 自行拼 `/meetings/{id}/join`。当前回归验证:`npm run test:pc-web-core` 160/160,`npm --prefix shared/core-sdk test` 45/45,`npm run test:mock-api` 54/54。 # 2026-07-08 PC Web 通知已读 actions 契约收紧 本轮把员工端通知单条“标记已读”也收回到后端契约:`GET /api/v1/notifications` 会为当前账号未读通知返回 `actions[].code/label/method/apiPath/tone/body/defaultComment`,已读通知和缺少完整 action 的旧数据只显示状态。PC Web 通知页只渲染后端提供的 `mark-read` action,并按 `apiPath/method/body` 提交;不再由前端按通知 id 自行拼 `/notifications/{id}/read`。当前回归验证:`npm run test:pc-web-core` 160/160,`npm --prefix shared/core-sdk test` 45/45,`npm run test:mock-api` 54/54。 # 2026-07-08 PC Web 开放平台 actions 契约收紧 本轮把企业开放平台自建应用“轮换密钥”和 Webhook“测试投递”也收回到后端契约:`GET /api/v1/open-platform/apps` 与 `GET /api/v1/open-platform/webhooks` 会为启用资源返回 `actions[].code/label/method/apiPath/tone/body/defaultComment`,停用资源或缺少完整 action 的旧数据只显示状态。PC Web 开放平台页只渲染这些后端 action,并按 `apiPath/method/body` 提交;不再由前端拼 `/open-platform/apps/{id}/rotate-secret` 或 `/open-platform/webhooks/{id}/send-test`。`npm run test:pc-web-core` 已扩展到 157/157,`npm run test:mock-api` 已扩展到 36/36。 # 2026-07-08 PC Web 管理后台用户状态 actions 契约收紧 本轮把企业管理后台员工冻结/恢复也收回到后端契约:`GET /api/v1/admin/users` 会为可操作员工返回 `actions[].code/label/method/apiPath/tone/body/defaultComment`,企业管理员本人、核心账号和不可流转状态返回空 `actions`。PC Web 管理后台只渲染这些后端 action,并按 `apiPath/method/body` 提交;旧的 `canChangeStatus=true` 数据缺少完整 action 时只显示状态,不再根据当前 `status` 自行推导 `FROZEN/ACTIVE` 或冻结/恢复按钮。`npm run test:pc-web-core` 已扩展到 156/156。 # 2026-07-08 PC Web 应用中心 / 工作台 actions 契约收紧 本轮把企业端应用上架/下架、工作台卡片启用/停用也收回到后端契约:`GET /api/v1/apps` 与 `GET /api/v1/workbench/cards` 会为企业管理员返回 `actions[].code/label/method/apiPath/tone/body/defaultComment`,员工端同一接口返回空 `actions`。PC Web 企业应用页只渲染这些后端 action,并按 `apiPath/method/body` 提交;缺少完整 action 的旧数据只显示状态,不再根据 `status === "PUBLISHED"` 或 `enabled` 自行推导下一步按钮。`npm run test:pc-web-core` 已扩展到 155/155,`npm run test:mock-api` 已扩展到 35/35。 # 2026-07-08 PC Web 企业审批 actions 契约收紧 本轮把 PC Web 企业端审批实例的通过/驳回入口也收回到后端契约:企业审批页现在只遍历 `/api/v1/approvals/instances` 返回的 `actions[].code/label/method/apiPath/tone/resultField/defaultComment` 渲染按钮,点击时按后端给出的 `apiPath/method/resultField/defaultComment` 发起请求;缺少完整 action 的旧 `PENDING` 审批只显示状态,不再根据 `status === "PENDING"` 自行生成 approve/reject 按钮或拼 `/approvals/instances/{id}/approve|reject`。`npm run test:pc-web-core` 已扩展到 154/154。 # 2026-07-08 PC Web / Mobile H5 联系人申请 actions 契约收紧 本轮继续把员工端联系人申请的“通过”入口从前端状态判断收回到后端契约:PC Web 与 Mobile H5 现在都只遍历 `/api/v1/contacts/requests` 返回的 `actions[].code/label/method/apiPath/tone/resultField/defaultComment` 渲染联系人申请按钮,点击时按后端给出的 `apiPath/method/resultField/defaultComment` 发起请求;缺少完整 action 的 incoming pending 旧数据只显示状态,不再根据 `direction === "incoming"` 与 `status === "PENDING"` 自行拼 `/contacts/requests/{id}/accept`。`npm run test:pc-web-core` 已扩展到 153/153,`npm run test:mobile-h5` 当前已随状态等待态验证扩展到 12/12。 # 2026-07-08 移动 App 联系人申请 actions 契约收紧 本轮把员工端联系人申请的“通过”操作也收回到后端契约:`GET /api/v1/contacts/requests` 现在会为当前账号可处理的 incoming pending 申请返回 `actions[].code/label/method/apiPath/tone/resultField/defaultComment`,移动 App 员工页只按后端 `actions[]` 渲染联系人申请按钮,不再根据 `direction === "incoming"` 和 `status === "PENDING"` 自行判断可操作性。`shared/core-sdk` 新增 `contacts.executeAction(action, body, token)`,会拒绝缺少 `code/method/apiPath/resultField` 或绝对 URL 的联系人申请 action;旧 `acceptContactRequest(requestId)` 仅作为兼容入口保留。 # 2026-07-08 小程序联系人申请 actions 契约收紧 本轮继续把微信小程序工作台联系人申请收口到后端契约:`frontend/mini-program/utils/core-sdk.js` 会保留 `/contacts/requests` 返回的完整 `actions[]`,新增 `executeContactRequestAction(action, body)` 校验 `code/method/apiPath/resultField` 并拒绝绝对 URL;`pages/workbench/workbench.wxml` 只遍历 `item.actions` 渲染按钮,不再根据 `direction === "incoming"` 与 `status === "PENDING"` 判断“通过”入口,页面点击后执行后端给出的 `apiPath/method/resultField`。 # 2026-07-08 移动 App 审批 actions 契约收紧 本轮把企业端审批轻操作也收回到后端契约:`GET /api/v1/approvals/instances` 会为企业审核账号返回 `actions[].code/label/method/apiPath/tone/resultField/defaultComment`,移动 App 企业页只按后端 `actions[]` 渲染通过/驳回按钮,不再根据 `status === "PENDING"` 或前端固定 `approve/reject` 方法判断可操作性。`shared/core-sdk` 新增 `approvals.executeAction(action, body, token)`,会拒绝缺少 `code/method/apiPath/resultField` 或绝对 URL 的审批 action;Mock API 审批服务在审核完成后返回空 `actions`,保证流程状态和权限边界由后端维护。 # 2026-07-08 管理后台状态权限收紧 本轮继续把企业管理后台的操作权限放回后端:`GET /api/v1/admin/users` 返回的 `canChangeStatus` 现在是员工冻结/恢复按钮是否可显示的唯一依据,`shared/core-sdk` 和 PC Web shaper 不再根据 `role === employee` 或当前账号自行推导可操作状态。Mock API 的 `admin-contract` 仍由后端根据当前企业管理员、目标账号和自改限制生成 `canChangeStatus`;前端只渲染后端返回的结果,真正提交状态更新时仍由 `PATCH /api/v1/admin/users/{account}/status` 做权限校验。 # 2026-07-08 用户中心默认业务数据清理 本轮继续清理用户中心前端默认业务数据:`shared/core-sdk`、PC Web、Mobile H5 和小程序适配层不再在缺少后端字段时生成固定二维码口令、二维码可见范围、账号保护开启状态、登录提醒开启状态或双重验证开启状态。头像、姓名、我的二维码、个性标签、企业、账号安全中心等展示仍由 `/api/v1/users/me/profile`、`/api/v1/users/me/qr-code`、`/api/v1/users/me/security` 水合;缺少后端二维码或安全策略时前端展示“等待后端同步/待生成”,复制二维码会提示后端口令未生成,避免客户端静态默认值冒充后端状态。 # 2026-07-08 多端假勤默认业务数据清理 本轮继续收紧假勤边界:`shared/core-sdk`、PC Web 员工假勤页、Mobile H5 fallback 和小程序适配层不再把缺失的后端假勤字段补成固定“09:00 - 18:00 / 总部 A 栋 / 上下班提醒”。班次、办公地点和提醒策略必须来自 `/api/v1/attendance/status` 或 `/api/v1/attendance/rules`;缺少后端规则时前端展示“等待后端假勤规则同步”。PC Web 与 Mobile H5 员工假勤页还会进一步只根据 `/api/v1/attendance/status` 返回的 `actions[]` 渲染上班/下班打卡按钮,缺少完整 action 时只显示空态,避免 UI 用静态业务配置或固定接口路径冒充后端状态。 # 2026-07-08 用户中心写接口与设置页联调 本轮把用户中心从“登录后只读资料”继续推进为后端可维护状态:新增 `PATCH /api/v1/users/me/profile` 和 `PATCH /api/v1/users/me/security`,由 `routes/user-routes.js`、`controllers/user-controller.js`、`services/user-service.js`、`stores/account-store.js` 分层处理。PC Web 员工设置页新增个人资料和账号安全中心保存表单,提交时调用后端 PATCH,再通过 `hydratePortalData()` 重新水合;shared core-sdk 新增 `user.updateProfile()` 与 `user.updateSecurity()`,e2e 契约覆盖 PATCH 后再 GET 验证后端状态。 # 2026-07-08 共享 SDK 待办执行入口收紧 本轮把 `shared/core-sdk` 的待办写操作继续收口为后端 action 契约:`todos` 领域不再公开 `complete(todoId)` / `reject(todoId)` 这类前端按 ID 推导路径的方法,改为 `executeAction(action, body, token)`。调用方必须传入 `/api/v1/todos` 返回的完整 `actions[].code/method/apiPath/resultField`,SDK 会拒绝缺字段或绝对 URL 的 action,并自动兼容后端返回 `/api/v1/...` 或 `/todos/...` 两种相对路径。 # 2026-07-08 共享 SDK 待办 actions 契约收紧 本轮继续收紧 `shared/core-sdk` 的统一待办 shape:`shapeTodoActions()` 只接受后端返回的完整 `actions[]`,不再从旧 `availableActions` 或只有 `code` 的 action 自动补 `apiPath/method/resultField/defaultComment`。`availableActions` 仍作为兼容展示字段保留,但不能再通过共享 SDK 变成可执行流程,PC Web、Mobile H5、Mobile App 和小程序通过 SDK 水合时会共同遵守后端 actions 契约。 # 2026-07-08 小程序待办 actions 契约收紧 本轮把微信小程序适配层也收紧到后端待办契约:`frontend/mini-program/utils/core-sdk.js` 不再把旧 `availableActions` 升级成可执行 `actions`,只保留为兼容展示字段。小程序 session 中真正可执行的待办动作必须来自后端 `actions[].apiPath/method/resultField/defaultComment`,缺少 `apiPath/method/resultField` 的 action 会被丢弃,避免后续页面在前端自行拼完成/退回流程。 # 2026-07-08 Mobile H5 待办 actions 契约收紧 本轮把 Mobile H5 的统一待办操作也收紧为后端契约驱动:H5 页面不再根据 `availableActions` 生成 `todo-complete/todo-reject` 按钮,也不再自行拼 `/todos/{id}/complete|reject`。待办按钮只来自后端 `actions[]`,点击后按 `apiPath/method/resultField/defaultComment` 发起请求;旧本地状态缺少个人标签时也会安全渲染,等待后端资料水合。 # 2026-07-08 PC Web 待办操作契约收紧 本轮继续把统一待办从“前端根据 `availableActions` 推导按钮和接口”收紧为“PC Web 只消费后端 `actions` 契约”。员工端和企业端待办按钮必须由 `/api/v1/todos` 返回的 `actions[].code/label/method/apiPath/resultField/defaultComment` 渲染;点击处理也必须使用后端给出的 `apiPath` 与 `resultField` 发请求,缺少契约时只提示刷新,不再由 UI 自行拼 `/todos/{id}/complete|reject`。`smoke:mock-api` 同步改为真实 HTTP 验证按后端 action 完成一条待办并退回一条待办。 # 2026-07-08 PC Web 默认状态去静态业务种子 本轮清理 PC Web `createDefaultPortalState()` 中的企业员工、企业风险、审批模板、核心租户、发布记录和支持工单静态样例。默认状态只保留空集合和展示所需的安全/二维码空壳,登录后的企业端、核心端数据必须由 `/enterprise/*`、`/admin/*`、`/core/*`、`/todos` 等接口水合;退出登录时也会清空企业/核心端水合数据,避免旧会话或本地缓存继续展示前端假数据。PC Web 右侧侧边栏也同步改为数据驱动:企业管理员提醒里的待发布工作台卡片、新员工待激活数量来自 `enterpriseWorkbenchCards` 和 `enterpriseEmployees`;核心端说明和支持多端来自 `/core/policies`、`/core/ops-alerts` 水合后的分类数据。 # 2026-07-08 核心维护端策略/告警 API 水合 本轮把 PC Web 核心维护端的“能力矩阵 / 核心策略 / 运维告警 / 服务边界”从前端静态数组改为后端数据驱动。`GET /api/v1/core/policies` 现在通过 `category=capability|policy` 区分能力矩阵和核心策略;`GET /api/v1/core/ops-alerts` 通过 `category=ops|boundary` 区分运维告警和服务边界。PC Web 核心端登录水合会请求这两个接口,页面只渲染后端返回的数据,`smoke:mock-api` 和 e2e 契约也已验证分类字段。 # 2026-07-07 Mock API 后端冒烟脚本 本轮新增 `npm run smoke:mock-api`,会在独立端口 `5096` 临时启动 Mock API,并通过真实 HTTP 验证 `/health`、未登录访问统一待办返回 `40100`、员工访问管理后台返回 `40300`、企业账号访问核心维护接口返回 `40300`、核心账号访问企业客户端接口返回 `40300`、核心账号可读取核心租户、企业管理员可读取用户并更新员工状态、操作日志排除核心账号,以及 `/api/v1/todos` 返回后端 `actions` 并可完成待办。该脚本把“能跑起来的后端基准”沉淀为可重复命令。 本轮同时新增 `npm run smoke:core-sdk-e2e`,会在独立端口 `5097` 临时启动 Mock API,并把 `FANG_API_BASE` 指向该实例后执行 `shared/core-sdk/tests/e2e.mock-api.test.js`。该脚本验证员工端“登录 -> hydrate -> 加好友 -> 同意 -> 发消息 -> 打卡 -> 通知 -> 退出”和企业端“登录 -> 拉企业数据 -> 退出”,把“共享 SDK 真实走后端契约”也沉淀为可重复命令。 # 2026-07-07 多端企业假勤规则 API 水合 本轮把 `GET /api/v1/attendance/rules` 从 PC Web 扩展到 shared core-sdk `hydrate()`、Mobile H5、Mobile App 预览和微信小程序预览。企业端会话统一携带 `enterpriseAttendanceRules`,前端只展示后端返回的 `shifts/reminders/exceptions/robot`,不再由各端单独维护企业假勤规则静态数据。 # 2026-07-07 统一待办后端 actions 契约进展 本轮把统一待办从“前端读取 `availableActions` 后自行拼按钮”推进为“后端返回完整 `actions` 操作描述”。`GET /api/v1/todos` 现在会为每条待办返回 `actions[].code/label/method/apiPath/tone/resultField/defaultComment`,PC Web 和 Mobile H5 优先按该后端契约渲染按钮并提交请求;`availableActions` 继续保留用于旧端兼容。`POST /api/v1/todos/{todoId}/complete|reject` 的返回 `data.request` 也带回 `apiPath`,便于前端、SDK 和契约测试追踪请求/返回闭环。 # 2026-07-07 企业假勤规则 API 进展 本轮新增 `GET /api/v1/attendance/rules`,企业端从后端读取班次、提醒、异常审批和假勤机器人规则;PC Web 企业端假勤页已改为消费后端 `shifts/reminders/exceptions/robot`,不再把企业假勤规则写死在页面里。该接口由后端权限矩阵控制,员工账号访问返回 `40300`。 ## 📌 项目简介 本项目为高职软件技术专业(全栈开发方向)暑期实习的分组实战项目,目标是**全量复刻飞书(Lark)的核心业务功能**,覆盖即时通讯、协同文档、视频会议、日历、审批、云盘、通讯录、应用中心等核心模块,最终交付一个可在生产环境运行的**企业级协同办公平台**。 项目采用前后端分离架构,前端多端统一,后端高内聚低耦合,强调**业务完整度**、**工程规范**、**文档可追溯**与**可交付性**。 > ⚠️ **实习要求**:本项目不是 Demo 演示,而是面向真实业务场景的"准生产级"交付物,所有功能必须可演示、可回归、可交付。 --- ## 🎯 业务目标(全量功能复刻清单) | 序号 | 业务模块 | 核心功能 | 优先级 | | :--: | :------- | :------- | :----: | | 1 | 用户中心 | 注册/登录/找回密码/SSO 单点登录/三方登录 | P0 | | 2 | 通讯录 | 组织架构/部门管理/员工名片/搜索 | P0 | | 3 | 即时通讯(IM) | 单聊/群聊/消息已读/历史消息/文件传输/消息撤回 | P0 | | 4 | 协同文档 | 富文本编辑/多人实时协作/版本历史/评论 | P0 | | 5 | 视频会议 | 预约会议/即时会议/屏幕共享/会议录制 | P1 | | 6 | 日历 | 日程创建/重复事件/提醒/共享日历 | P1 | | 7 | 审批(OA) | 自定义表单/审批流/加签/转交 | P1 | | 8 | 云盘 | 文件上传下载/在线预览/权限管理/分享 | P1 | | 9 | 应用中心 | 应用上下架/工作台配置 | P2 | | 10 | 消息通知 | 系统通知/邮件/短信/站内信 | P1 | | 11 | 管理后台 | 用户管理/权限管理/数据字典/操作日志 | P0 | | 12 | 开放平台 | OpenAPI/Webhook/应用鉴权 | P2 | --- ## 🛠️ 技术栈 ### 前端 - **核心框架**:Vue 3(Composition API + `