doublex001
|
0f8ab9a6b6
|
feat(api): 补齐简历多版本(P0-5)列表/创建/详情/修改/删除/设默认/导出任务
- api: 新增 resume-versions 全链路 9 个端点(对齐 /profile/me/resume-versions 与 /resume-export-tasks)
mock 以模块级可变数组模拟持久态;真实路径含 multipart 上传占位说明
- hook: useResumeVersions 覆盖列表/创建/设默认/删除/导出轮询
- 页面:app/resume-versions.tsx 版本卡(默认徽标/设默认/导出/删除)+ 新建弹窗,四态齐全
- 入口:简历页头部加「版本」入口;路由在 _layout 注册
- 主题:补充 scrimLight 遮罩 token(亮/暗双模式)
|
4 weeks ago |
doublex001
|
3aa3c60004
|
feat: 软件改名「轻松聘」,引导页改为三屏满屏主题色
改名(带断言的白名单脚本,逐文件核对改前出现次数,对不上不写盘):
- 显示名「有职」→「轻松聘」:代码+配置 13 文件 50 处,文档 12 处
- 标识符 youzhi → qingsongpin:app.config.js 的 slug / scheme /
ios.bundleIdentifier / android.package、storage 键前缀、高德 URL 的 src、
screenshots 截图流水线 manifest 的 scheme
- 注意:storage 的 KEY_PREFIX 变更会让本机旧数据读不到(未上架、仅开发数据,
可接受;若已有线上用户数据必须写迁移而非直接换前缀)
引导页 app/guide.tsx 四屏 → 三屏(标题为产品文案):
求职开挂 AI护驾 / 真实能力 一测便知 / 一起解锁 职场秘籍
- 副标题只写仓库里查得到的已上线模块,未编造能力
- 整页底色改用新增 token onboardingGradient(primary → primaryBtn → primaryDark):
现成的 headerGradient 三支末端是青 #4FD1C5,白字仅约 1.9:1,只适合顶部深色区,
不能做整页底色;配 locations=[0,0.34,1] 使正文落在 5.2:1 以上
- 底部按钮反色为白底 + primaryText 蓝字;前两屏「下一步」、第三屏「开启体验」
- 状态栏加 style="light"(根布局是 dark,深蓝底上会黑压黑)
- 素材位 guideEvaluate/guideWeightDim/guideGameMap/guideLegalAI
→ guideAiCopilot/guideAbilityTest/guideGrowthUnlock
待补图(已逐张打开确认,非推测):assets/icon.png、splash-icon.png、
brand-logo.jpg、android-icon-{foreground,background,monochrome}.png 仍是有职字标
门槛:tsc 0 / eslint 0 / 26 套件 365 用例全过 / check:spacing 196 张卡片全 8px 全绿
真机:模拟器像素测量,CTA 按钮左边界 16.0dp、高 50.0dp,渐变三点与理论值吻合
|
1 month ago |
doublex001
|
65f138bae2
|
refactor: 收敛 14 处重复声明的映射表与业务规则
接 4.14 / 4.15 的同一类缺陷排查。那两批治的是「同一个事实两处取值不同」,
本批治它的另一半:**取值当时相同,但同一张映射表 / 同一段业务规则被抄了多份**。
后者平时看不出来,代价有两个:改一处漏一处;以及测试锁的是**没人渲染的那份**。
本批不改任何取值,属纯重构 —— 已逐条核对 git diff 的删除行,无一色值被改。
修法:14 处本地声明 → 6 张单一来源的表
- 评级 → 文字色 **5 份 → 1**:growth / jobs / ability / assessment 四处同名同值
(三处叫 LEVEL_TEXT_COLOR、一处叫 LEVEL_COLOR),hr-evaluation 另有一份中文键版。
- 霍兰德六型 → 强调色 3 份 → 1(介绍 / 答题 / 结果三页各一份 TYPE_COLORS)。
- 语义色名 → 色值 3 份 → 1(企业看板 / 面试评分 / AI 面试各一份 COLOR_TOKENS)。
- 文章缩略图 2 种写法 → 1:成长页是 {violet:{bg,color}} 对象表,详情页则拆成
THUMBNAIL_BG + THUMBNAIL_COLOR 两份平行 Record。
- 社保基数 clamp **3 份 → 1**:权威那份在接口层 computeSalaryResult 里,另两份在
计算器页(一个同名 helper + handleSelectCity 内联)。提取时把 city 提成**显式参数** ——
页面内联那份的成因正是 helper 读的是 inputs.city(旧城市),而切城市要用新城市的上限,
所以「简化成调用 helper」会静默算错城市。
- 时间戳 → 「月-日 时:分」2 份 → 1:utils.formatDateTime 收 ISO 串、页面 formatRecordTime
收时间戳,格式逐字节相同。formatDateTime 改为接受 string | number。
副作用(正向的):时间戳版本原先不判 NaN,坏值会渲染出「NaN-NaN NaN:NaN」,现返回空串。
- 手机号脱敏 2 份 → 1:登录页内联的那段与 api.maskPhone 逐字节相同,而
carrier-login.test.ts 里那条 describe 的名字就是「脱敏在接口层,页面不自己切字符串」,
《运营商一键登录接入方案.md》也写明「页面不做脱敏」—— 页面违反了它自己的约定。
- 企业端发布页自持的学历 / 工作类型选项表接回 src/constants(工作类型的编码与标签
成对定义,标签列表由它派生,避免「有编码没标签」的悬空项)。
放置位置按职责定,不是就近塞:颜色映射进 theme(该文件自己写着「色值是本文件独占的职责」,
且已有 templateAccentColors 先例);clamp 进 api 层(AGENTS.md 规定业务规则在接口层,
权威那份本来就在那里);时间格式化进 utils;选项词表进 constants。
一处是**派生**而不是搬家
hr-evaluation 的键是中文评级('优秀'),不是 JobLevel —— 根因是数据层
EvaluationDimension.level 声明为 string 且直接下发中文评级。这是「同一事实、两个键域」,
把字面量搬个地方等于把「两份同值」换成「两份同值、只是搬了家」。故 levelLabelTextColors
按引用派生自 jobLevelTextColors,将来换色只改一处。断言锁的是关系(同键同值),不是字面量。
刻意**不**合并的两处
- 经验要求:constants 的 EXPERIENCE_OPTIONS 是**筛选**项(含「不限」、不含「1年以内」),
发布页那份是**必填要求**(含「1年以内」、无「不限」),不是同一个事实。已加反向锁
把差异写死,防止后来者按名字想当然地合并。
- DIMENSION_LEVEL(profile.tsx)不在收敛范围:键的是 DimensionScore['level'](只有两档),
且「良好」用 textSecondary 而非另外五处的 primary。两处对同一档取色确实不同,
属需要产品定夺的配色分歧,**未擅自统一**,已记入《项目开发状态.md》4.16。
测试
- 新增 shared-color-maps.test.ts(26 例)。断言分两类:**关系**(中文评级表与
jobLevelTextColors 同键同值、各表内部色值互不相同、计算器养老金额可由 clampSocialBase
反推、formatDateTime 两种入参格式一致)与**接线锁**(读源码断言 14 处旧声明名不再出现、
页面必须引用新表名)—— 值对了但页面不读表,缺陷照旧。
- 灵敏度验证:一次性注入 6 个缺陷(重建旧声明 + input.city 换成 '北京' +
levelLabelTextColors 改回字面量),**6 例如期全红**,逐字还原后 grep 确认 0 残留。
- 一处如实记录:clamp 那条接线锁**第一版是写错的** —— 断言「页面不得出现 socialBaseUpper」,
而页面本来就该读它展示「基数范围 ¥x – ¥y(城市)」。错的是断言不是代码,已改为精确锁
「上下限字段与 Math.min/Math.max 同现」(那才是旧版内联 clamp 的形状)。
另有一次 edit 吃掉了 `const DIM_COLORS =` 后的空格,已复原到与 HEAD 逐字节一致。
如实记录:一份子代理报告的三条说法未通过核对
- 称 DIMENSION_LEVEL 重复声明 —— 不成立,全仓只有 profile.tsx 一处。
- 称 THUMBNAIL_* 重复「×2」—— 不精确,实为一个对象表 + 两份平行 Record(两种写法)。
- 给的 clamp 行号不准,且**没提权威那份在 api.ts**。
与既有一贯口径一致:代理报告是模型输出、不是证据,每条都独立 grep + 逐行读过才动手。
实测(Android 模拟器 emulator-5554,截图核对,非代码走查)
- 本批取值未变,真机的价值在「没崩、没落到兜底」:成长页三个缩略图色系全部解析;
HR 评价「优秀」「良好」都有色、无一落兜底灰;企业看板统计四宫格与快捷入口
**五个语义色各不相同**(若有键写错会静默全变蓝,多色并存即证明未落兜底);
发布页学历 5 项 / 经验 6 项 / 工作类型 4 项且选中态正确;薪资格算器切城市后
提示与区间正确更新。
- 未验到的:clamp 本身未在真机制造出越界值 —— 社保基数输入框**逐键 clamp**,
手工输入停不到目标值(既有交互,非本批改动),故 clamp 语义以单测 + 注入为准;
岗位列表 / 能力 / 测评的评级色、霍兰德三页六型色、面试两页语义色、登录页掩码手机号、
薪资历史记录时间格式 —— 均有类型约束或测试锁盖住,但本轮未逐屏截图。
仍未做(需产品定夺,未自行选择)
- 「良好」一档在个人页与其余五处取色不同(灰 vs 蓝),统一只改一行。
- JobExperienceRequirement 的「1年以内」是死值(全仓仅见于类型声明,mock 数据没用过、
筛选表也没这项),留还是删。
- 数据层 color: string 未收紧成联合类型,故 semanticColorTokens 的键只能保持
Record<string, string>,代价是数据层写错色名会静默落到 ?? colors.primary。已在注释与
测试里把「这是刻意的」写死,根治属另一批。
门槛:tsc 0 / eslint 0 / 26 文件 365 例全绿(较 4.15 的 339 例 +26)/ check-routes 0 /
check:affordances 0 / check:icons 0(194 文件、1357 字形)/ check-backend-stubs 140
|
1 month ago |
doublex001
|
aff9fc8b19
|
fix: 收敛「同一事实两个数」类数据矛盾并补颜色 lint 盲区
合并 2026-09-20 当天的 4.14、4.15 两个批次。范围仅前端:后端(Java + SpringBoot)
由其他成员实现,本次未写后端代码,接口仍按约定在 api.ts 中预留注释版 fetch。
主线索是一类反复出现的缺陷:**同一个业务事实被写了两份,两处取值不同**。
修法一律是让重复的那一份在接口层从权威源**派生**,而不是把两个字面量手工对齐 ——
手工对齐只解决这一次,下次改数据照样分叉。
4.14 求职意向词表统一 + 四处数据自相矛盾
- 引导采集的期望薪资 / 求职状态 / 期望城市三组选项,引导页与「设置求职意向」页
各有一份词表,三组全部匹配不上:走完引导进来的用户看到三组 chip 一个都没选中,
像资料丢了。更严重的是在那里选「暂不考虑」保存后,简历仍把他记成积极求职中
(判定常量与页面词表不是同一个字符串)。三组选项下沉到 src/constants 单一来源,
新增 withCurrentOption 处理引导阶梯能拼出、快捷档覆盖不到的薪资组合。
- 顺带收敛四处数据矛盾:当前用户 Offer 数、求职进度每月 Offer 之和、企业端在招岗位、
企业端评价数、企业名(全称 / 简称两个值)。
- 撤回 4.10 第 7 条的错误结论:该条断言「常量无消费者、缺页脚组件」,实际
components/onboarding/ui/SupportFooter.tsx 早一天就已存在并挂在 P1Login / P2QuickLogin
两页上,页脚一直渲染。该结论朝「把已完成的当成未完成」的方向错,已改为如实。
4.15 数据自相矛盾批量收敛 + 半透明色 token 化 + lint 补盲区
- 又查出并修掉 10 组同源不同值,多为跨页面 / 跨层级,翻页时肉眼不易对照:
· 求职进度 stats 五项之和 30 ≠ 总数 28(ended 改为由其余四项相减得出,求和成为结构性的)
· 月度图表投递合计 52 / 面试合计 16,而卡片写 28 / 6(六个月三列重排为 28 / 6 / 2)
· 我的页收藏徽标 12 与收藏列表 3
· 勋章「投递满100次」显示已获得,而实际只有 28 次投递(obtained / progress 改由
buildUserStats() 派生)
· 匹配成功横幅写 3 家,而会话列表里 matched 为 true 的只有 2 条
· 岗位详情综合分恒为 92 分·优秀(fetchJobOverallScore 里是 `void id;`),9 个岗位里
只有第 1 个对得上;雷达图八维改按该岗位实际分等比缩放,否则 65 分的岗位会配一张
最低 78 分的图
· 对比页把产品经理与 UI 设计师的综合评分正好写反
· 候选人 4–8 号点进去全叫「张明远」(身份改取自人才推荐列表)
· 岗位 1 的公司所在地在列表卡写海淀区、详情页写朝阳区
· 待回复卡片写 3 人,而它跳转的「未回复」Tab 只有 2 条 —— 两者不是同一集合
(有未读消息 vs 未回复)。判据应是「与去向一致」,不是「某个内部集合的长度」
- 顺带修掉一处同屏矛盾:求职进度页标题「求职中 {stats.interviewing}」压在按 Tab 过滤的
companies 上(4 条),标题写 2、下面列 4 行,切到「面试中」Tab 只剩 1 行。该事实当时有
三份副本(统计卡 / 标题 / Tab 列表),已去掉标题这一份。
**未解决并如实记录**:companies 是 28 条投递的抽样,故统计卡的分阶段数字在 Tab 列表里
永远对不上行数 —— 属全量 vs 抽样的结构问题,两条修法都会改变用户看到的页面,需产品定夺。
- 5 处 rgba(255,255,255,x) 逐处看下来不是同一个 token 被写重 5 次,而是 4 个不同角色
(卡片底 / 弱底色 / 分割线 / 进度条轨道),故按角色拆成 4 个 token,值等于现状、一像素未改;
resume.tsx 的 rgba(0,0,0,0.4) 改用已有 colors.scrim。
- 补 lint 盲区:no-hardcoded-hex-color 只匹配纯 hex,拦不住 rgba()/hsl()。已扩到函数式颜色,
并加 TemplateElement 访问器,否则模板字符串里的颜色照样漏网。
- formatCompact(企业端看板内联的 .toFixed(1)k)与 formatThousands 下沉到 src/utils。
formatCompact 刻意保留尾随 .0(2000 → 2.0k),与 formatViews 去掉 .0 的做法不一致且是有意的,
改口径会动到看板现状显示。
测试
- 新增 data-consistency.test.ts(22 例),断言刻意写成「A 必须等于 B」的关系而非「A 等于 28」:
以后调整 mock 数据不会让测试变红,只有把派生关系改回写字面量才会红。
- 新增 job-preference-options.test.ts(15 例),含源码级接线锁。
- 修正 enterprise-filters.test.ts 一条把矛盾当契约的断言:原先锁的是「有未读消息的会话数」,
与卡片跳转过去的「未回复」Tab 不是同一集合,等于把缺陷固化成了期望。现锁「与去向一致」。
- 灵敏度验证:注入缺陷确认对应断言确实变红(含一次一次性注入 3 个缺陷、5 例如期失败),
随后逐字还原并 grep 确认无残留。
- 两处如实记录:一次用 python 做注入时脚本静默失败(本机 python 是 Windows 商店占位存根,
非交互调用不执行也不报错),文件其实没被改动 —— 若没先 grep 确认注入物存在,就会拿一次
「未注入」的运行去证明「规则有效」;以及 data-consistency.test.ts 初版把「累计面试邀请数」
与「当前面试中数」当成同一个事实而断言相等,红的是测试不是数据,已改为反向断言并写明注释。
实测(Android 模拟器 emulator-5554,截图核对,非代码走查)
- 求职进度统计卡 28 / 6 / 2 / 2 / 18,6+2+2+18 = 28 成立;月度图表三列合计 28 / 6 / 2;
段落标题随 Tab 变化,不再出现与列表矛盾的数字。
- 我的页 投递 28 / 收藏 3 / 沟通 8 / Offer 2(收藏 12 → 3);勋章 28/100、6/10、95/100,
其中诚信之星 95 与同屏「八大维度 → 诚信记录 95」同源,肉眼可自查。
- 未验到的:候选人详情 4–8 号姓名、岗位详情评分、对比页评分互换、收藏列表条数 ——
均有测试锁盖住,但本轮未逐屏截图,按「未做真机验证」记录,不当成已验证。
门槛:tsc 0 / eslint 0 / 25 文件 339 例全绿 / check:routes 0 / check:affordances 0 /
check:icons 0(194 文件、1357 字形)/ check:backend-stubs 140
|
1 month ago |
doublex001
|
00522d53f9
|
feat: 死控件清零并修复一键登录取号、重做引导页
一键登录(P2Q)取不到手机号的根因不在取号:页面读的是 data.phone,而该字段
只有短信通道才写入,且 loginByCarrier 返回的 phone 被直接丢弃,于是号码位恒为
占位「本机号码」。现改为进页面即预取(useCarrierPhone + fetchCarrierPhone),
失败时置灰按钮并给出「重新获取 / 改用验证码登录」,成功后把号码写回引导资料
(P2P/P2R 预填与 B3 联系人电话同源)。真实取号是运营商原生 SDK,Expo Go 跑不了,
接入路线图见新增文档《运营商一键登录接入方案.md》。
引导页重做四屏内容与配图,配图位走新增组件 ImageSlot:素材未到位时在页面上标注
「配图待补」+ 该放什么图,补图只改 assets.ts 的 source 一行;设置页补「查看引导页」
入口(此前只有首次启动能进,看过一次就再也进不去),并区分「首次启动」与
「已登录回顾」两种出口,避免把已登录用户甩回注册流程。
企业沟通 / 人才推荐两页的 Tab 与搜索真正生效:Tab 计数与待办数量改由列表推导
(原先写死的数字与示例数据对不上,会出现「Tab 写 3、列表 0 条」),无对应页面的
漏斗图标摘除,筛选复位不再只是弹提示;申诉举证接真实选图,候选人详情「发起沟通」
跳会话页,面试评分支持本地草稿与恢复,入职清单勾选落库并可增删自定义待办、导出文本,
薪资计算器「更多工具」改指真实路由(原先三项都指回自己),技能词云接搜索与学习路径生成。
测试新增 3 个文件 51 例(共 219 例全绿),存储 mock 由「恒返回 null」改为带状态 Map,
使「存了要能读回来」这类行为真正被验证;tsc / eslint / 三个审计脚本(0 失效跳转、
0 死控件、137 个接口预留)均 0 问题。
另:package-lock.json(本项目统一用 yarn.lock)与本地调试截图加入 .gitignore。
|
1 month ago |
doublex001
|
a55799490e
|
test: 补齐 ESLint+jest 工程化配置,治理 shadowColor 硬编码为 colors.shadow,tsconfig 排除测试目录
|
2 months ago |
doublex001
|
fe70c4cf9f
|
docs: 更新设计令牌与开发规范文档
- src/theme:补充企业端与工具页所需的设计令牌
- AGENTS.md:同步分层架构、配色规范与 Git 提交规范
- screenshots:补充商店截图素材目录约定(README + capture-manifest,PNG 已由 .gitignore 排除)
|
2 months ago |
doublex001
|
30cc3dc106
|
feat: 完成求职App核心页面与数据层并迁移至 Expo Router
|
2 months ago |