Tree:
55a9222e77
master
${ noResults }
6 Commits (55a9222e7789adcbf87387b7989b2cd8ebdbd255)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
410b1b7386 |
refactor(theme): 卡片间隔令牌化收尾,borderRadius/padding:8 收敛为 spacing.card
- 82 个 .tsx 文件的卡片 borderRadius/padding(含 H/V):8 收敛为 spacing.card(值恒 8,零视觉变化) - 自动补齐 spacing 的 theme 导入(复用已有导入或按目录深度计算相对路径) - check-spacing 令牌引用命中 954 处且仍 0 违规,审计网未撕裂 - 更新项目开发状态.md(4.21 残留①标记完成 + 新增 4.23) |
1 month ago |
|
|
3070a966b7 |
style: 边距间隔统一 8px(页面留白 / 卡片内边距 / 卡片间隔)
AGENTS.md 第 15 行的「边距间隔一致」在本批次中途补上了数值「,为8px」。
此前按众数取 16 落的 176 处因此作废——回滚还原不回 8(原本就是 16 的 66 张卡
同样要降),故改为按目标值重算,73 个 .tsx 文件共 +390 / -398。
三个维度全部收敛到 8:
- 页面留白:28 个主 ScrollView 的 contentContainerStyle,另加共享页壳 LegalDocScreen
- 卡片内边距:padding / paddingHorizontal / paddingVertical
- 卡片间隔:marginTop / marginBottom,以及分隔卡片的容器 gap
判定口径从「命名」改为「结构」:有 borderRadius 且(有 backgroundColor 或
borderWidth)即为卡片。4.17 的命名判定漏掉了 pendingItem、dimItem、
resume/{education,experience,project} 的 row、suggestionRow、reasonRow、
explanation、option、taxItem,以及一批 radius 已是 8 但内边距非 8 的卡
(matchBanner / offerBanner / salaryBox / cardBase / cardOffer / replyBlock /
rank.section / memberBanner / draftBanner / pathSummary / aiTip 等),本批补齐。
明确排除(附理由,非遗漏):表单控件、标签胶囊、选项卡、按钮、图标底与装饰;
错误重试态的 center 容器(改会把重试页居中打散);引导页 components/onboarding/**
(自成一套 12/14/18 圆角体系)。刻意保留:resume/preview 的 paper.padding 20
(导出文档的屏幕代理版心,对应 resumeHtml.ts 的 @page 34px 38px)、
SliderCaptcha 的 knob 阴影(控件对照项)。
顺带修复一个既有缺陷:skill-cloud 的行业 Tab 在搜索框出现后被纵向裁切,
只剩 6 个可点却看不见的胶囊。根因是 tabsWrap 的 maxHeight 未配 flexShrink: 0。
git diff 确认 tabsWrap 不在本批改动内,确系既有问题。
门槛:tsc / eslint / 365 用例 / check:icons / check:affordances /
check-backend-stubs / check-routes 全绿;已在模拟器截图核对 11 个页面。
详细记录见 项目开发状态.md §4.18。
|
1 month ago |
|
|
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 |
|
|
0c2ebf6149 |
feat: 清零假交互,补全导出分享与企业端写通道,修复四态与图标缺陷
合并 2026-09-18 当天的 4.9–4.13 五个批次。范围仅前端:后端(Java + SpringBoot)
由其他成员实现,本次新增接口一律按约定在 api.ts 中预留注释版 fetch,未写后端代码。
4.9 假交互盲区 + 四态缺口 + 企业端写通道
- 修掉 4.8「死控件已清零」结论的盲区:审计脚本只认「无处理函数 / 空处理函数」的
Pressable,查不到「有处理函数、点了只弹『功能开发中』」这一类,全仓实有 37 处。
- 按「能真做的真做,不能做的删入口」逐条处理:能接线的接线(如「评分申诉」→ /appeal);
能真导出的复用 shareText;无落点的删入口,并同步删掉 api.ts 里对应的下发项,
不留「数据里有、页面不渲染」的悬空字段。
- 修复 error 被静默丢弃的真 bug:legal/checkout 与 legal/service 的网络故障会被渲染成
「套餐不存在 / 服务不存在」,把用户引向错误的自救路径;另有 5 处有 error 分支但无重试
入口、1 处 refresh 已在作用域内却没用。统一改用既有 StateView(ErrorState 自带 onRetry)。
- 企业端岗位管理补「下架 + 刷新」写通道:新增 updateJobStatus / refreshJob,经 storage
覆盖表叠加(mockRequest 不深拷贝,直接改常量会污染全局且重启即丢),JobManagementJob
补 refreshedAt 字段,hook 补写方法与进行中标志,页面加二次确认,并补写通道单测。
- 企业端列表页补筛选/排序真实现,修掉一个无 value/onChangeText 的死输入框;Tab 过滤
从页面 useMemo 下沉到 api 层(原与「业务规则放 API 层」相悖)。
- 扩展 scripts/check-affordances.mjs 覆盖上述盲区,防止同类问题再次逃过审计。
4.10 平台资质证照页 + 死链修复 + 推送缺口
- 新增 app/settings/qualifications.tsx(平台运营主体自身的证照公示,合规 / 应用商店
上架审核用),配套 src/types/qualification.ts、src/hooks/useQualifications.ts、
api 取数函数与单测。注意它和企业端 EnterpriseCertificationForm 不是一回事:后者是
入驻企业上传自己的营业执照以取得认证,主体 / 目的 / 入口全不同,已在类型文件顶部写明。
- 修复死链。
- 补记 09-11~09-17 共 12 个提交从未推送的缺口(远端一直停在 09-10),并把「提交之后
必须推送」写进 AGENTS.md:17:50 的动作明确为 commit → push 两步,9:20 拉取前先看
git rev-list --left-right --count HEAD...@{u}。
4.11 企业端状态文案缺陷 + 状态映射下沉
- 修 4.9 写通道回看时暴露的缺陷:标着「草稿」的卡片按钮显示「重新上架」。JobManagementJobStatus
有三个值(active | offline | draft),三元表达式只分了两支,草稿落进「已下线」那一支;
确认文案「重新上架后,候选人可以再次看到该岗位」对从未上架过的草稿两句都不成立。
- 状态 → 文案映射下沉到 api 层,页面不再自行分叉。
4.12 六处导出 / 分享真机验证 + 霍兰德参与人数两处不一致
- 6 处导出 / 分享路径在 Android 模拟器上逐个验到系统分享面板,并借面板的文本预览核对
拼装内容与页面一致(数字、名称、状态)。
- 修正一处数据前后不一致(霍兰德参与人数两处对不上)。
4.13 六处空态实测 + 无效图标名缺陷 + check:icons 新门槛 + 缓存失败态结案 + 分享文本测试锁
- 用「注入空数据 + 逐个截图」把 4.9 遗留的 6 处空态实测通过(progress / legal /
hr-evaluation / ability / jobs/offer-compare / jobs/[id]),确认按设计渲染、无死代码。
- 修复文书模板 gavel-outline 无效字形名:Ionicons 全库 1357 个字形里没有 gavel,运行时会
打 "not a valid icon name" 且图标渲染为空白;页面的 `as keyof typeof Ionicons.glyphMap`
断言把类型错误吞掉了,故 tsc 一直没报。改用语义最接近的 hammer-outline。
- 新增 scripts/check-icons.mjs + npm run check:icons 门槛:直接读取已安装包的 glyphmap
(另存一份必然与真实图标库脱节),扫描 app/ 与 src/ 中的图标名字面量,含灵敏度验证。
- 结案 settings 缓存「读取失败」态:不是「未验证」,而是 readCacheBytes() 把异常全吞成 0,
故障传不上来,该分支在任何条件下都不可达。新增 cache.test.ts(12 例),以「构造会抛错的
文件系统」把这条永不抛错的契约锁住。
- 补上第七处分享路径(入职清单导出)的真机验证,7 处分享至此全部验过。
- 新增 share-text.test.ts(28 例),补 4.9 同批 5 个分享拼装函数一直缺的测试锁(4.9 方案里
写了「并补单测」,当时只给范式 buildChecklistText 补了)。侧重锁三类:空值守卫、取的
是本地选择态而非接口默认值、对外可见格式;并把 4.12 那个真机证伪实验固化成不依赖设备的断言。
- 顺带把「数据层引用外部词表」三类系统排查完:图标名(已修 + 已设门槛)、路由(已被
check-routes 覆盖,本次补验其数据层灵敏度)、颜色(硬编码色值 0 处)。
其他
- AGENTS.md 第九节记录暗模式决策:本项目维持纯亮色。理由是全仓 3302 处静态 colors.X 分布在
124 个文件,其中 119 个为模块级 StyleSheet.create —— 模块级样式在启动时即固化颜色,与
运行时切换主题不相容,接入暗模式属重构级工程,且当前无自动化视觉回归手段可验证这 3302 处
改动。故本轮只记录决策、不改代码,将来应作为独立重构批次推进。
- 项目开发状态.md 同步各批次结论与证据(含一次错误归因的更正:深链不路由不是 expo-dev-client
缺失,而是应用跑在 Expo Go 里、Expo Go 只注册 exp://,已补 am start 实测证据)。
门槛:tsc 0 / eslint 0 / 23 文件 302 例 / check:routes 0 / check:affordances 0 /
check:backend-stubs 140 / check:icons 0
|
1 month ago |
|
|
8ca6d2e44e |
feat(content): 文章详情页正文真实化,消除占位文案
- Article 接口新增 content 字段承载文章正文 - MOCK_ARTICLES 三篇(简历/面试/薪资)补真实 mock 正文,与标题标签匹配 - article/[id].tsx 用 article.content 替换原占位文本(保留三态与样式) 说明:企业端「更多服务」6 个子页经核查均已存在真实页面 (job-management/talent-recommendation/enterprise-chat 为 Tab, job-publish/job-evaluations/interview-score 为已治理真实页),无需填充; 故本次边界项聚焦文章正文真实化。 |
2 months ago |
|
|
7a239ffe5a |
feat: 补全 P1 占位页与 P2 空 onPress 接线
P1 收藏/历史占位页补真实数据: - 新增 fetchFavorites/fetchHistory 接口(api.ts + index.ts 登记) - 新增 useFavorites/useHistory hooks 并注册导出 - 新增复用组件 JobCard,favorites/history 接入真实列表+三态+点击进 /jobs/[id] P2 空 onPress 接线: - growth 设置→/settings、文章卡与"更多"→/article/[id] - legal 四分支:chat/templates/faq/upgrade 分别跳对应子页 - 新增 articles 详情页 /article/[id] 与 legal 三子页(faq/upgrade/templates) - appeal 提交成功弹 Alert 并 router.back() |
2 months ago |