# 有职 App 开发进度与规划文档 > 生成日期:2026-09-10 > 最后更新:2026-09-15(登录方式改为「验证码 / 密码 / 运营商一键登录」三通道 · 密码闭环打通 · 登录态未写入的严重缺口已修复) > 范围:项目健康审查 + 已开发 / 待开发清单 > 结论先行:**当前项目可运行**(`tsc` 0 错误、`eslint` 0 error、路由 0 失效跳转),无需修正阻塞错误。 --- ## 一、健康审查结论 | 检查项 | 命令 / 方式 | 结果 | |---|---|---| | 类型检查 | `npx tsc --noEmit` | ✅ 0 错误(Exit 0) | | 代码规范 | `npx eslint .` | ✅ 0 error / ⚠️ 8 warning(均为 `any` 软警告) | | 路由闭合 | `node scripts/check-routes.mjs` | ✅ 67 路由全部存在,0 失效跳转(2026-09-15 复跑) | | 入口接线 | 读 `app/_layout.tsx` / `app/index.tsx` | ✅ 根栈 → 入口围栏 → 双端 Tab 完整 | | 应用配置 | `app.config.js` | ✅ name「有职」、scheme `youzhi`、plugins 正确 | **判定**:项目处于可启动状态(`expo start` 即可运行),未发现阻塞运行的错误。本次未进入"修正"环节。 --- ## 二、技术栈与架构 - **框架**:Expo SDK 57 · React Native 0.86.3 · React 19 · TypeScript 6 · Expo Router(文件路由) - **双端同构**: - 求职端 `(tabs)`:岗位 / 沟通 / 成长 / 我的(落地 `jobs`) - 企业端 `(enterprise)`:岗位 / 人才 / 沟通 / 我的(落地 `job-management`) - **分层(src/)**:`types`(领域模型) · `api`(5088 行 mock 数据层) · `hooks`(语义化取数) · `components`(42 组件) · `context`(Auth/Role) · `theme`(colors token) · `constants` · `utils` · `lib`(storage / wechat-sdk) - **数据链路**:页面 → Hook(`useXxx`) → API(`fetchXxx`) → 后端。当前全 mock,签名已固化,接真实后端只改 `src/api/api.ts` 函数体。 - **配色治理**:统一走 `src/theme/colors.ts`,禁止硬编码十六进制;透明度用 token + `15`/`20` 后缀。 --- ## 三、已开发模块(按业务域) > 页面规模以行数为代理指标;5 行薄壳(如隐私政策 / 用户协议)是合理架构——内容由 `LegalDocScreen` 按 `docId` 加载,**非空壳**。 ### 3.1 用户端(求职端) | 业务域 | 路由 | 关键页面(行数) | 规模 | 状态 | |---|---|---|---|---| | 引导 / 注册 | `/guide` `/register` `/onboarding` | guide(194) · register(69) · onboarding(488) | 中 | 已开发 | | 岗位 | `/jobs` `/jobs/[id]` `/jobs/compare` `/jobs/rank` `/jobs/offer-compare` `/jobs/weight-settings` | jobs(756) · [id](612) · compare(306) · rank(753) · offer-compare(676) · weight-settings(285) | 大 | 已开发 | | 沟通 | `/chat` `/chat/[id]` | chat(556) · [id](750) | 大 | 已开发 | | 成长 | `/growth` `/game` `/game/level` `/progress` `/assessment` `/ability` `/holland*` `/interview*` `/resume*` `/job-preference` | 多页 300–600 行 | 大 | 已开发(逐关内容见四.2) | | 我的 / 设置 | `/profile` `/settings` 及 10 个子页 | profile(743) · settings(262) · about / account / account-cancel / privacy* / notification / delete-data / user-agreement / privacy-policy | 大 | 已开发 | | 增值 / 合规 / 工具 | `/legal*` `/tools/*` `/hr-evaluation` `/audit-report` `/appeal` `/operation-rules` `/enterprise-certification` `/personal-data-export` `/candidate-detail` `/article/[id]` `/history` `/favorites` `/job-evaluations` | 多页 300–720 行 | 大 | 已开发 | ### 3.2 企业端 | 业务域 | 路由 | 关键页面(行数) | 规模 | 状态 | |---|---|---|---|---| | 岗位管理 | `/job-management` `/job-publish` `/job-evaluations` | job-management(645) · job-publish(633) · job-evaluations(752) | 大 | 已开发 | | 人才 | `/talent-recommendation` `/candidate-detail` | talent-recommendation(684) · candidate-detail(719) | 大 | 已开发 | | 沟通 | `/enterprise-chat` | enterprise-chat(611) | 大 | 已开发 | | 我的 | `/enterprise-overview` | enterprise-overview(594) | 大 | 已开发(【设置】入口已接线 `/settings`;Tab 选中色已统一 `primary`) | > 企业端设置类页面复用根级 `app/settings/*`,符合「设置类统一收纳于【设置】页」规范。 --- ## 四、待开发 / 进行中 / 风险 ### 4.1 既定任务(来自项目规范,需逐项核实) - **企业端三项**(历史记录为待办,代码审查显示已基本完成): 1. Tab 选中色统一回 `primary` —— ✅ 代码已用 `colors.primary` 2. 我的页补【设置】入口 —— ✅ `enterprise-overview.tsx` 第 281 行已 `router.push('/settings')` 3. 统一快捷入口话术 —— ✅ 已完成(2026-09-10):`MOCK_ENTERPRISE_QUICK_ACTIONS` 与沟通页 `QUICK_ACTIONS` 中 6 处 label 已对齐规范词(人才库→人才推荐、评价管理→岗位评价管理、沟通→企业沟通、面试日程/面试安排→面试评分),与「我的」菜单、`/interview-score` 路由名一致。 4. 沟通页快捷操作接线 —— ✅ 已完成(2026-09-10):`QuickActions` 死入口已绑定 `onPress`;批量发邀请→`/talent-recommendation`、面试评分→`/interview-score`(根级自包含页、可返回)走跳转,批量发Offer / 群发通知无对应企业端页、按项目约定弹 `Alert '功能开发中'`。tsc/eslint 0 问题。 - **微信登录**:⚠️ **入口已于 2026-09-15 按产品决定摘除**(丁总:前端不做 QQ / 微信登录)。三分支(`new` / `active` / `deleted`)状态机、`P2W` / `B1` 页面、`src/lib/wechat-sdk.ts`、相关 hook / 类型 / 接口**全部保留未删**,仅 `P1Login` / `P2PhoneCode` 不再挂入口;`app/register.tsx` 的 `P2W` / `B1` case 亦保留。**接入路线图仍见 `微信登录接入方案.md`**(该文档开头已加摘除说明)。恢复入口 = 重新挂上按钮与 `useWechatLogin` 状态机。 - **登录方式(2026-09-15 改造)**:现为「手机号 + 验证码」(`P2`)·「手机号 + 密码」(`P2P`)·「运营商一键登录」(`P2Q`)三通道,微信入口已摘除。 - **修复了一个此前存在的严重缺口**:`P2PhoneCode` / `P2QuickLogin` 原先只 `navigate('P3')` 而**从不写入登录态**(`useLogin` / `loginByPhone` 写好却无人调用),全项目唯一写 token 的地方是微信链路 —— 入口一摘 `isTokenValid` 将恒为 false、每次冷启动都被打回登录页。现三条通道均已接入 `useAuth().login()`。 - **密码闭环**:`P2P` 密码登录 → `P2R` 设置/重置密码(**同页两阶段**:验证手机号 → 设新密码,成功后直接下发登录态)→ 设置页 `/settings/password` 修改密码(改完强制重登)。「登录即注册」的用户天生无密码,**首次获得密码即走「忘记密码」入口**,不额外插入注册步骤。 - 密码规则(8–20 位、需含字母和数字)在 `src/api/api.ts` 的 `validatePassword` 统一计算,错误码 → 文案映射在 `src/constants` 的 `PASSWORD_RULE_LABEL`;新增测试 `src/__tests__/password.test.ts`(24 例)。 - 新增公共件:`src/components/PasswordField.tsx`(密码输入 + 明文切换)、`src/hooks/useAgreementGate.ts`(协议门卫,此前逐字复制 3 份)、`src/utils/validators.ts`(手机号 / 验证码规则单一来源)。 - **按钮底色全局改深**:`components/onboarding/ui/PrimaryButton.tsx` 的 `colors.primary`(#2C83FD) → `colors.primaryBtn`(#1F6FDB)。原白字对比仅 **3.64:1,不满足 WCAG AA**;`primaryBtn` 为 **4.82:1**,且 AGENTS.md 配色规范本就要求 primary 不作白字按钮底。**副作用:整条注册流程按钮视觉变深,如已对外出图需重新确认。** - 账号与安全页的「微信账号」项已随入口一并移除(`MOCK_ACCOUNT_SECURITY`),避免留下有出口无入口的死项;「修改登录密码」项补上 `route: '/settings/password'`,此前点击无任何反应。 ### 4.2 功能完整性缺口(标注【待确认】为推断项,需与产品对齐) - **通关小游戏(7 关)**:框架页 `game.tsx` + `game/level.tsx` 已建,7 关(认识自己 → 能力 → 岗位 → 企业 → 简历 → 面试 → 签约)**内容与数据已完整**:`MOCK_GAME_LEVELS` 共 22 题(self 4 / 其余各 3),题型含单选/多选/输入,配套解析与 `tags` 用于岗位推荐。评分(≥60 通关)、解锁、进度聚合逻辑均在 `submitGameLevel` 实现。✅ 2026-09-10 完成内容增厚(每关由 1–2 题补至 3 题左右)。 - **阿布阿诺 AI 法律服务**:免费层(咨询 / 模板 / FAQ)页已建;付费层 `legal/upgrade.tsx` 已建,**付费 / 支付链路已接通(mock 支付闭环)**——`legal/checkout.tsx` 选套餐→选支付方式→模拟支付→会员态激活并 AsyncStorage 持久化;`legal.tsx` / `upgrade.tsx` 套餐卡可点击进入结算,会员态在返回时即时刷新。真实支付 SDK 后续仅换 `api.ts` 的 `createLegalOrder` / `payLegalOrder` 函数体。**付费后权益已兑现**:新增 `legal/service.tsx` 会员服务使用页——未开通点会员服务仍引导开通,已开通则进入使用页(服务说明 + 引导语 + 需求输入框 + 提交申请 + 申请记录持久化),`legal.tsx` 会员卡标签按态显示「会员 / 已开通」。 - **岗位评价发布(双向透明评价生态核心)**:✅ 2026-09-10 接通。此前 `jobs/[id].tsx` 底部发布按钮为「功能开发中」占位——产品核心定位即评价体系却无法发布。现已新增 `createJobReview`(AsyncStorage 键 `job:reviews`,按 jobId 归属),`fetchEmployeeReviews` 合并「本人发布(置顶)+ 内置评价」,`useJobDetail` 暴露 `publishReview`,页面接线含空输入拦截、发布中 loading、成功后清空输入框并自动刷新列表。 - **隐私政策 / 用户协议内容**:`src/api/api.ts` 中 `MOCK_PRIVACY_POLICY` / `MOCK_USER_AGREEMENT` 已含完整合规草案(各 9–10 章),**18 岁门槛已落地**(隐私政策第六章 + 用户协议前言)。仅余【待确认】占位待法务/产品替换:公司全称、注册地址、客服邮箱/电话、个人信息保护负责人邮箱、管辖法院。属**上架硬性审查项**,占位填妥即可提交审核。 ### 4.3 工程与上线 - **应用图标**:✅ 已完成(提交 `878710c`)。`assets/icon.png` 已替换为「有职」logo,实测 1024×1024,符合商店要求。 - **启动屏**:✅ 已接线。安装 `expo-splash-screen@57.0.9`,在 `app.config.js` 以 config plugin 形式配置 `assets/splash-icon.png`(1024×1024、`imageWidth: 200`、`resizeMode: 'contain'`、白底)。此前该资源为死资源且冷启动白屏。因应用为纯亮色(`userInterfaceStyle: 'light'`),未配置 `dark` 分支。**注意**:启动屏属原生配置,Expo Go 内不生效,需 `eas build` 出包后可见。 - **EAS / OTA**:`eas.json` 配置骨架(development / preview / production + submit)已建;`app.config.js` 的 `runtimeVersion` / `ios.bundleIdentifier` / `android.package` / `extra.eas.projectId` 字段已就位。**以下两项占位符会直接阻塞 `eas build` / `eas submit`,上架前必做**: 1. `owner: 'REPLACE_WITH_EAS_OWNER'` —— 需替换为你的 Expo 账号名; 2. `extra.eas.projectId: 'REPLACE_WITH_PROJECT_ID'` —— 需替换为真实 EAS 项目 ID。 两者均可由 `eas login` 后执行 `eas init` 自动注入,**不要手工填**。`ios.bundleIdentifier` / `android.package` 当前为 `com.youzhi.app`,可按开发者账号调整。 - **`updates`(OTA)块当前为注释状态,属有意为之**:见提交 `aa7b171`。占位的 `REPLACE_WITH_PROJECT_ID` 会让 Expo Go(开发期)启动时去拉取不存在的远程更新,报 "Failed to download remote update" 并蓝屏。待 `eas init` 注入真实 projectId 后再取消注释启用 OTA。 - **真实后端**:全量 mock(`src/api/api.ts` 5088 行),未切换真实 `fetch`。 - **技术债**:8 处 `any` 软警告已全部清理(图标断言改为 `keyof typeof Ionicons.glyphMap`、路由断言改为 `as string`),`eslint .` 现 0 error 0 warning,`tsc --noEmit` 保持 0 错误。 --- ## 五、后续增量开发建议(优先级) - **P0(上架前必做)**:~~图标替换~~ **应用图标【已完成,`878710c`,1024×1024「有职」logo】** · ~~隐私 / 协议内容填充~~ **隐私/协议草案【已存在,含 18 岁门槛,待填【待确认】占位】** · ~~EAS 初始化~~ **EAS 配置骨架【已完成,`owner` / `projectId` 两处占位符阻塞 `eas build`,需 `eas init` 注入,详见 4.3】** · ~~18 岁门槛核对~~ **18 岁门槛【已在隐私政策第六章 + 用户协议前言落地】** · ~~微信登录接入评估~~ **微信登录接入评估【已完成 → 见 `微信登录接入方案.md`,SDK 接入阻塞于微信开放平台 AppID】** · ~~启动屏接线~~ **启动屏【已完成,`expo-splash-screen` + `splash-icon.png`,需出包验证】**。 - **P1(核心差异化)**:~~微信登录接入方案~~ **微信登录接入方案【已落文档,真实 SDK 接入阻塞于微信开放平台移动应用申请】** · ~~企业端快捷入口话术统一~~ **企业端快捷入口话术统一【已完成,6 处 label 对齐规范词;含沟通页快捷操作 onPress 接线,tsc/eslint 0 问题】** · ~~付费法律服务支付~~ **付费法律服务支付【已完成:mock 支付闭环,选套餐→结算→模拟支付→会员激活持久化,tsc/eslint 0 问题】** · ~~通关小游戏 7 关内容~~ **通关小游戏 7 关内容【已完成:结构原已建成,本次增厚至 7 关 22 题,tsc/eslint 0 问题】**。 - **P2(打磨)**:~~技术债清理~~ **技术债已清理(8 处 `any` → 明确类型,`eslint` 0 warning)** · 真实后端对接 · OTA 通道验证。 --- ## 六、附:审查命令速查 ```bash # 类型检查(硬门槛,必须 0 错误) npx tsc --noEmit # 代码规范 npx eslint . # 路由闭合审计(改动路由后必跑) node scripts/check-routes.mjs # 单元测试(src/__tests__ 下纯逻辑) npm test # 启动 npm start # 即 expo start ```