轻松聘
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

14 KiB

有职 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 · 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 既定任务(来自项目规范,需逐项核实)

  • 企业端三项(历史记录为待办,代码审查显示已基本完成):
    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 通道验证。

六、附:审查命令速查

# 类型检查(硬门槛,必须 0 错误)
npx tsc --noEmit

# 代码规范
npx eslint .

# 路由闭合审计(改动路由后必跑)
node scripts/check-routes.mjs

# 单元测试(src/__tests__ 下纯逻辑)
npm test

# 启动
npm start   # 即 expo start