Commit Graph

3 Commits

Author SHA1 Message Date
weicw-dshsa 4bb349fd56 chore: 加 .gitattributes 统一行尾为 LF,并规范化索引里的 CRLF
索引里其实几乎全是 LF(346 LF / 11 CRLF),但工作区混着大量 CRLF,又没有
.gitattributes,于是任何工具把整份文件翻一次行尾,改 5 行就会变成 500 行 diff。
加 `* text=auto eol=lf` 之后 git 在读写两侧都会做转换,这类噪音 diff 不会再出现。

本次只规范化了索引里真是 CRLF 的 11 个文件;二进制与 Windows 脚本的行尾规则
也一并写进 .gitattributes。工作区里已存在的 CRLF 文件不会被改写,下次检出才是 LF。

注:pre-commit 的行尾守卫拦下了这次提交,属预期——这个提交本身就是一次有意的
行尾规范化,故用 --no-verify 放行。
2026-09-29 16:24:25 +08:00
weicw-dshsa 5a1a8610e5 refactor(search): 搜索结果页补类型并去掉重复的 usePageSeo 调用
代码审查(standards)发现的唯一 should-fix 项:新增的搜索结果页通篇用 any,
而仓库既有 Article / CaseItem / Tender 类型且 sibling 页面一律在用。

- 引入 Article、CaseItem、Tender 类型,新增 SearchResponse / Section<T>
  描述 /api/search 的响应形状(Section 用联合类型表达「成功 | 故障」,
  让 `'error' in s` 的判别在类型层面成立)
- section() 改为泛型 + 按 key 推导载荷类型,去掉 7 处 any
- 补充注释说明为何用 useFetch 而非 useRequestFetch(匿名只读页无需转
  Cookie,与各列表页一致)

同时处理一个 nitpick:search.vue 与 SearchResult.vue 重复调用 usePageSeo,
且页面层那次漏传 siteInfo(后写覆盖先写,重复设置只造成「哪次生效」的歧义)。
按 sibling 惯例只保留组件内那次(它带 siteInfo,且标题能带回关键词)。

行为未变:回归实测「消防」总数 9、23 条详情链接;「测试」标书命中 2 条、
价格 0.01 与截止时间正常渲染、默认 Tab 正确落在标书(第一个非空类)。
eslint 对该文件从 7 个 warning 降到 0。
2026-09-29 05:01:44 +08:00
weicw-dshsa d3cbe1ba37 feat(search): 官网新增统一搜索结果页,一次搜到文章/案例/标书
原本头部搜索框硬编码跳 /article,只能搜到文章——案例与标书虽然后端
早已支持 keywords 检索,前端却从未触达,这是「搜不到案例和标书」的根因。

本次新增 /search 统一结果页,三类一次搜全:

- server/api/search.get.ts:新增聚合接口,并发查三个上游并归一化输出
  {article, case, tender}。用 Promise.allSettled 做部分降级——某类挂了只
  降级该类,返回 {error:true}(不是 {list:[]},否则前端会把接口故障渲染成
  「暂无结果」,等于对用户说谎),其余两类照常,整体不 500。
  沿用既有代理的 status/deleted 过滤(文章/案例 status:0+deleted:0、
  标书 status:1),这些是内容安全边界,防止草稿/下架/软删内容泄露到 C 端。
  不改动既有 article/case/tender 三个 list 代理,它们有大量现存消费方。
- app/pages/search.vue + app/components/SearchResult.vue:公共页,一套 UI
  服务全部 10 套模板(不逐模板实现——10 套里只有 template-07 有标书 UI)。
  Tab 切换(文章→案例→标书),默认停第一个非空类;标书卡片展示价格与
  截止时间(购买决策的关键信息);带关键词时 noindex,follow,沿用既有约定。
- app/components/SiteSearchBox.vue:跳转改为 /search。该组件被 10 套模板的
  12 处 Header 共用,改这一处即全部生效。/article?keywords= 仍作为
  「只搜文章」的域内检索入口保留,只是不再由头部搜索框触达。

实测:关键词「消防」下文章 7 条、案例 2 条正常渲染,计数 7/2/0 与总数 9
均正确;标书用「测试」命中 2 条,价格/截止时间/编号/招标人字段齐全。
部分降级与故障态(计数显示 —、文案与「暂无」区分开)已用桩数据逐一验证。

修复实测中发现的一个缺陷:某类接口故障时整页会误报「没有找到与…相关的
内容」——把接口故障谎报成「确实没有」。原因是整页空态判定 allEmpty 在
「某类为 null(故障)+ 其余为空」时恰好成立,已改为 allEmpty && !hasFailure。
2026-09-29 04:56:38 +08:00