Files
hjc-web/app/pages/search.vue
T
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

17 lines
531 B
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<SearchResult />
</template>
<script setup lang="ts">
/**
* 统一搜索结果页 /search?keywords=xxx
*
* 一套公共页服务全部 10 套模板(不走模板组件清单,见 issues/01 的决定 3)。
* 页面实现在 app/components/SearchResult.vue(Nuxt 自动导入)。
*
* 路由优先级:Nuxt 文件路由中静态段优先于动态段,故 /search 命中本文件,
* 不会被 app/pages/[slug].vue 抢走。
*/
usePageSeo({ title: '搜索', path: '/search' })
</script>