feat: 搜索实现spec技术方案
This commit is contained in:
parent
8fa426644f
commit
8423f61a3f
@ -32,8 +32,6 @@ yarn dev
|
||||
| `txw-gxzx-web` | 个人工作台 |
|
||||
| `txw-kxtfwzx-web` | 科学碳体重中心 |
|
||||
| `txw-mhzc-web` | 碳门户主页 |
|
||||
| `txw-tzzx-web` | 碳资讯 |
|
||||
| `txw-ytzx-web` | 碳云学堂 |
|
||||
| `txw-yygl-web` | 运营管理 |
|
||||
| `local-nodemodules` | 本地私有包(ggzc-web 组件库) |
|
||||
|
||||
|
||||
1709
docs/superpowers/plans/2026-04-10-search-plan.md
Normal file
1709
docs/superpowers/plans/2026-04-10-search-plan.md
Normal file
File diff suppressed because it is too large
Load Diff
359
docs/superpowers/specs/2026-04-10-search-design.md
Normal file
359
docs/superpowers/specs/2026-04-10-search-design.md
Normal file
@ -0,0 +1,359 @@
|
||||
# 全站搜索功能设计文档
|
||||
|
||||
## 1. 概述
|
||||
|
||||
### 1.1 功能说明
|
||||
|
||||
为碳信网(txw-mhzc-web)提供全站统一的搜索功能,支持搜索全站内容(碳证中心、服务中心、行业专题等),提供搜索建议、搜索历史、热门搜索等辅助功能。
|
||||
|
||||
### 1.2 项目背景
|
||||
|
||||
- 碳信网各子系统(供需大厅、绿色金融、绿色交易等)目前分散独立
|
||||
- 用户需要在全站范围内快速查找内容
|
||||
- 需要为后续子系统迁移到 txw-mhzc 做准备
|
||||
|
||||
### 1.3 设计原则
|
||||
|
||||
- 前端聚合在 txw-mhzc-web
|
||||
- 后端聚合在 txw-mhzc
|
||||
- 搜索服务架构先搭好,后期快速对接迁移后的子系统
|
||||
|
||||
---
|
||||
|
||||
## 2. 前端设计
|
||||
|
||||
### 2.1 路由
|
||||
|
||||
| 路径 | 组件 | 说明 |
|
||||
|------|------|------|
|
||||
| `/search` | SearchView | 搜索结果页 |
|
||||
|
||||
### 2.2 页面结构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Header (复用现有) - Logo + 网站名 + 登录/注册 + 工作台 │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ 搜索区域 (灰色背景 #F5F5F5) │
|
||||
│ [分类 ▼] [搜索输入框........................] [搜索] │
|
||||
│ 热门搜索:江苏电厂配额 | 林业碳汇开发 | CBAM 报告... │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ [全部] [碳证中心] [服务中心] ← 分类Tab (左侧) │
|
||||
│ ───────────── (绿色下划线指示选中) │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ 搜索结果列表 (单列) │
|
||||
│ ┌─────────────────────────────────────────────────┐ │
|
||||
│ │ [行业专题] 构建新型碳排放数据治理框架 │ │
|
||||
│ │ 2025年5月29日 核算技术双轨并行发展... │ │
|
||||
│ └─────────────────────────────────────────────────┘ │
|
||||
│ ┌─────────────────────────────────────────────────┐ │
|
||||
│ │ [碳减排服务] 碳排放... │ │
|
||||
│ │ 2025年5月29日 ... │ │
|
||||
│ └─────────────────────────────────────────────────┘ │
|
||||
│ ... │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ [1] [2] [3] [4] [5] [下一页] ← 分页 │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ 版权信息等 │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**说明:**
|
||||
- 搜索区域包含:分类下拉、搜索输入框、搜索按钮、热门搜索词
|
||||
- 搜索历史在搜索区域下方显示(横向排列,右侧有"清除全部")
|
||||
- 分类Tab在分隔线下方,左对齐
|
||||
- 结果列表单列展示,包含分类标签、标题、日期、摘要
|
||||
- 无左侧边栏
|
||||
|
||||
### 2.3 组件列表
|
||||
|
||||
| 组件 | 说明 |
|
||||
|------|------|
|
||||
| SearchView | 搜索结果页主组件(外层使用现有 Nav 组件) |
|
||||
| SearchArea | 搜索区域(输入框+下拉+按钮+热门词) |
|
||||
| SearchSuggestion | 搜索建议下拉 |
|
||||
| SearchHistoryBar | 搜索历史横条(历史词+清除按钮) |
|
||||
| SearchCategoryTabs | 分类Tab(全部/碳证中心/服务中心) |
|
||||
| SearchResultList | 结果列表 |
|
||||
| SearchResultItem | 结果项 |
|
||||
| SearchPagination | 分页组件(复用 TDesign) |
|
||||
| SearchEmpty | 空状态 |
|
||||
| SearchLoading | 加载状态 |
|
||||
|
||||
> **Header/Nav 复用项目现有 `Nav` 组件**,搜索页只需开发 SearchArea 及以下部分
|
||||
|
||||
### 2.4 分类筛选
|
||||
|
||||
| 分类 | categoryType | 说明 |
|
||||
|------|--------------|------|
|
||||
| 全部 | all | 所有内容 |
|
||||
| 碳证中心 | carbon_cert | 碳证相关 |
|
||||
| 服务中心 | service | 服务市场、金融市场、需求市场、数据市场 |
|
||||
| 行业专题 | news | 新闻资讯 |
|
||||
|
||||
### 2.5 搜索建议
|
||||
|
||||
触发方式:用户输入时,延迟 300ms 后请求(前端防抖)
|
||||
限流:接口级别限流,相同关键词 1 分钟内不重复请求
|
||||
数据来源:
|
||||
- 用户输入匹配(模糊匹配标题/内容)
|
||||
- 历史搜索词(取当前用户最近 10 条)
|
||||
- 运营配置的热门词
|
||||
|
||||
---
|
||||
|
||||
## 3. 后端设计
|
||||
|
||||
### 3.1 技术栈
|
||||
|
||||
- Spring Boot
|
||||
- MyBatis Plus
|
||||
- Redis(缓存搜索历史、热门词)
|
||||
|
||||
### 3.2 接口设计
|
||||
|
||||
#### 3.2.1 搜索
|
||||
|
||||
```
|
||||
GET /search?keyword=碳排放&categoryType=all&page=1&pageSize=10
|
||||
|
||||
参数说明:
|
||||
- keyword: 搜索关键词(必填,最大 50 字符,需 XSS 过滤)
|
||||
- categoryType: 分类筛选(all, carbon_cert, service, news)
|
||||
- page: 页码(默认 1)
|
||||
- pageSize: 每页条数(默认 10,最大 50)
|
||||
|
||||
Response:
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "",
|
||||
"data": {
|
||||
"total": 18,
|
||||
"categoryCount": {
|
||||
"all": 18,
|
||||
"carbon_cert": 2,
|
||||
"service": 16,
|
||||
"news": 0
|
||||
},
|
||||
"list": [
|
||||
{
|
||||
"id": "xxx",
|
||||
"title": "构建新型<em>碳排放</em>数据治理框架",
|
||||
"summary": "核算技术双轨并行发展...",
|
||||
"category": "行业专题",
|
||||
"categoryType": "news",
|
||||
"source": "碳证中心",
|
||||
"sourceType": "carbon_cert",
|
||||
"publishTime": "2025-05-29",
|
||||
"url": "/gxzx/detail/xxx"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.2 搜索建议
|
||||
|
||||
```
|
||||
GET /search/suggest?keyword=碳排
|
||||
|
||||
参数说明:
|
||||
- keyword: 搜索关键词(必填,最大 50 字符)
|
||||
|
||||
Response:
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "",
|
||||
"data": {
|
||||
"suggestions": [
|
||||
"碳排放",
|
||||
"碳排放权",
|
||||
"碳排放核算"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.3 热门搜索
|
||||
|
||||
```
|
||||
GET /search/hot
|
||||
|
||||
Response:
|
||||
{
|
||||
"code": 0,
|
||||
"data": [
|
||||
"江苏电厂配额",
|
||||
"林业碳汇开发",
|
||||
"CBAM 报告",
|
||||
"零碳展会"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.4 搜索历史
|
||||
|
||||
```
|
||||
GET /search/history
|
||||
|
||||
Response:
|
||||
{
|
||||
"code": 0,
|
||||
"data": [
|
||||
"碳排放",
|
||||
"林业碳汇",
|
||||
"CBAM"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.5 清除搜索历史
|
||||
|
||||
```
|
||||
DELETE /search/history
|
||||
|
||||
Response:
|
||||
{
|
||||
"code": 0,
|
||||
"msg": ""
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 数据模型
|
||||
|
||||
#### 3.3.1 搜索结果(SearchResultVO)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | String | 内容ID |
|
||||
| title | String | 标题(关键词高亮,使用 `<em>` 标签) |
|
||||
| summary | String | 摘要(截取前 200 字符) |
|
||||
| thumbnail | String | 缩略图URL(可为空) |
|
||||
| category | String | 分类标签(展示用,如"行业专题") |
|
||||
| categoryType | String | 分类类型(筛选用,如"news") |
|
||||
| source | String | 来源名称 |
|
||||
| sourceType | String | 来源类型 |
|
||||
| publishTime | String | 发布时间 |
|
||||
| url | String | 跳转链接 |
|
||||
|
||||
#### 3.3.2 热门搜索配置(HotSearchConfig)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Long | 主键 |
|
||||
| keyword | String | 关键词 |
|
||||
| sort | Integer | 排序 |
|
||||
| status | Integer | 状态(0禁用1启用) |
|
||||
| startTime | LocalDateTime | 生效开始时间(可选) |
|
||||
| endTime | LocalDateTime | 生效结束时间(可选) |
|
||||
|
||||
> 注:支持临时活动配置热门词,通过生效时间控制
|
||||
|
||||
#### 3.3.3 搜索历史(SearchHistory)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Long | 主键 |
|
||||
| userId | String | 用户ID(登录用户) |
|
||||
| deviceId | String | 设备ID(游客,用于关联未登录用户) |
|
||||
| keyword | String | 搜索词 |
|
||||
| searchTime | LocalDateTime | 搜索时间 |
|
||||
|
||||
> 注:搜索历史最多存储 20 条,超出后删除最早的记录
|
||||
|
||||
### 3.4 搜索聚合服务
|
||||
|
||||
由于目前各子系统还没有迁移,搜索聚合服务采用以下策略:
|
||||
|
||||
**阶段一(当前)**:
|
||||
- 只搜索资讯中心 `/sy/zxxx` 的内容
|
||||
- 数据直接存储在 txw-mhzc 中
|
||||
|
||||
**阶段二(子系统迁移后)**:
|
||||
- 各子系统迁移到 txw-mhzc 后
|
||||
- SearchAggregatorService 并行调用各子系统的搜索方法
|
||||
- 聚合去重后返回
|
||||
|
||||
---
|
||||
|
||||
## 4. 文件结构
|
||||
|
||||
### 4.1 前端(txw-mhzc-web)
|
||||
|
||||
```
|
||||
txw-mhzc-web/src/pages/index/
|
||||
├── views/
|
||||
│ └── search/
|
||||
│ └── index.vue # 搜索结果页
|
||||
├── components/
|
||||
│ └── search/
|
||||
│ ├── SearchArea.vue # 搜索区域
|
||||
│ ├── SearchSuggestion.vue # 搜索建议下拉
|
||||
│ ├── SearchHistoryBar.vue # 搜索历史横条
|
||||
│ ├── SearchCategoryTabs.vue # 分类Tab
|
||||
│ ├── SearchResultList.vue
|
||||
│ └── SearchResultItem.vue
|
||||
└── api/
|
||||
└── search.js # 搜索接口
|
||||
```
|
||||
|
||||
### 4.2 后端(txw-mhzc)
|
||||
|
||||
```
|
||||
txw-mhzc/txw-mhzc-service-biz/src/main/java/com/css/txw/mhzc/
|
||||
├── controller/
|
||||
│ └── SearchController.java
|
||||
├── service/
|
||||
│ ├── SearchService.java
|
||||
│ └── impl/
|
||||
│ └── SearchServiceImpl.java
|
||||
├── mapper/
|
||||
│ └── SearchMapper.java
|
||||
└── pojo/
|
||||
├── dto/
|
||||
│ └── SearchDTO.java
|
||||
└── vo/
|
||||
├── SearchReqVO.java
|
||||
├── SearchResultVO.java
|
||||
├── HotSearchConfig.java
|
||||
└── SearchHistory.java
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 开发计划
|
||||
|
||||
### 5.1 第一阶段(预计 3 天)
|
||||
|
||||
| 任务 | 优先级 | 预估工时 |
|
||||
|------|--------|----------|
|
||||
| 前端:搜索页面基础结构 | P0 | 0.5d |
|
||||
| 前端:搜索框组件 + 搜索建议 | P0 | 0.5d |
|
||||
| 前端:左侧边栏(历史+热门+分类) | P0 | 0.5d |
|
||||
| 前端:结果列表展示 | P0 | 0.5d |
|
||||
| 前端:分类筛选 + 分页 | P0 | 0.5d |
|
||||
| 后端:搜索接口(资讯中心)| P0 | 1d |
|
||||
| 后端:搜索建议接口 | P1 | 0.5d |
|
||||
| 后端:热门搜索接口 | P1 | 0.5d |
|
||||
| 后端:搜索历史接口 | P1 | 0.5d |
|
||||
| **前后端联调 + 测试** | P0 | 1d |
|
||||
|
||||
### 5.2 第二阶段(子系统迁移后)
|
||||
|
||||
- [ ] 后端:聚合其他子系统搜索
|
||||
- [ ] 搜索结果去重优化
|
||||
- [ ] 搜索权重配置
|
||||
|
||||
### 5.3 数据埋点(可后续迭代)
|
||||
|
||||
- 搜索关键词上报
|
||||
- 搜索结果点击上报
|
||||
- 热门词曝光点击统计
|
||||
|
||||
---
|
||||
|
||||
## 6. 待确认
|
||||
|
||||
1. ~~ 搜索结果高亮标签使用 `<em>` 还是其他?~~ → **使用 `<em>`**
|
||||
2. ~~每个分类的数量是否需要实时从后端获取?~~ → **随搜索结果一起返回,在 data.categoryCount 中**
|
||||
3. 搜索结果点击后跳转到原详情页,详情页是否需要开发? → **由各子系统详情页处理,搜索只提供 URL**
|
||||
@ -1,35 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 复制 git 变更文件到 change 目录,保留原文件相对路径
|
||||
|
||||
set -e
|
||||
|
||||
TARGET_DIR="change"
|
||||
|
||||
# 创建目标目录
|
||||
mkdir -p "$TARGET_DIR"
|
||||
|
||||
# 获取所有变更文件(包含未跟踪文件)
|
||||
files=$(git status --porcelain | awk '{print $2}')
|
||||
|
||||
if [ -z "$files" ]; then
|
||||
echo "没有变更文件"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
count=0
|
||||
for f in $files; do
|
||||
# 跳过目录(如 docs/)
|
||||
if [ -d "$f" ]; then
|
||||
mkdir -p "$TARGET_DIR/$f"
|
||||
cp -r "$f" "$TARGET_DIR/$f"
|
||||
echo "✓ $f/"
|
||||
elif [ -f "$f" ]; then
|
||||
mkdir -p "$TARGET_DIR/$(dirname "$f")"
|
||||
cp "$f" "$TARGET_DIR/$f"
|
||||
echo "✓ $f"
|
||||
((count++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "已完成,复制了 $count 个文件到 $TARGET_DIR 目录"
|
||||
Loading…
Reference in New Issue
Block a user