14 KiB
有职 App 开发进度与规划文档
生成日期:2026-09-10 最后更新:2026-09-15(登录方式改为「验证码 / 密码 / 运营商一键登录」三通道 · 密码闭环打通 · 登录态未写入的严重缺口已修复) 范围:项目健康审查 + 已开发 / 待开发清单 结论先行:当前项目可运行(
tsc0 错误、eslint0 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 · compare(306) · rank(753) · offer-compare(676) · weight-settings(285) | 大 | 已开发 |
| 沟通 | /chat /chat/[id] |
chat(556) · id | 大 | 已开发 |
| 成长 | /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 既定任务(来自项目规范,需逐项核实)
- 企业端三项(历史记录为待办,代码审查显示已基本完成):
- Tab 选中色统一回
primary—— ✅ 代码已用colors.primary - 我的页补【设置】入口 —— ✅
enterprise-overview.tsx第 281 行已router.push('/settings') - 统一快捷入口话术 —— ✅ 已完成(2026-09-10):
MOCK_ENTERPRISE_QUICK_ACTIONS与沟通页QUICK_ACTIONS中 6 处 label 已对齐规范词(人才库→人才推荐、评价管理→岗位评价管理、沟通→企业沟通、面试日程/面试安排→面试评分),与「我的」菜单、/interview-score路由名一致。 - 沟通页快捷操作接线 —— ✅ 已完成(2026-09-10):
QuickActions死入口已绑定onPress;批量发邀请→/talent-recommendation、面试评分→/interview-score(根级自包含页、可返回)走跳转,批量发Offer / 群发通知无对应企业端页、按项目约定弹Alert '功能开发中'。tsc/eslint 0 问题。
- Tab 选中色统一回
- 微信登录:⚠️ 入口已于 2026-09-15 按产品决定摘除(丁总:前端不做 QQ / 微信登录)。三分支(
new/active/deleted)状态机、P2W/B1页面、src/lib/wechat-sdk.ts、相关 hook / 类型 / 接口全部保留未删,仅P1Login/P2PhoneCode不再挂入口;app/register.tsx的P2W/B1case 亦保留。接入路线图仍见微信登录接入方案.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,上架前必做:owner: 'REPLACE_WITH_EAS_OWNER'—— 需替换为你的 Expo 账号名;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.ts5088 行),未切换真实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→ 明确类型,eslint0 warning) · 真实后端对接 · OTA 通道验证。
六、附:审查命令速查
# 类型检查(硬门槛,必须 0 错误)
npx tsc --noEmit
# 代码规范
npx eslint .
# 路由闭合审计(改动路由后必跑)
node scripts/check-routes.mjs
# 单元测试(src/__tests__ 下纯逻辑)
npm test
# 启动
npm start # 即 expo start