495 lines
12 KiB
Markdown
495 lines
12 KiB
Markdown
# 基于Tauri的新闻文本分类系统 - 流程图
|
|
|
|
## 1. 系统整体架构图
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "客户端层 - Tauri Desktop"
|
|
Client[桌面客户端<br/>Tauri + Vue3]
|
|
end
|
|
|
|
subgraph "后端服务层 - Spring Boot"
|
|
API[API 网关]
|
|
Auth[认证模块<br/>Spring Security + JWT]
|
|
NewsSvc[新闻服务]
|
|
UserSvc[用户服务]
|
|
ClassifySvc[分类服务]
|
|
CrawlerSvc[爬虫服务]
|
|
StatisticsSvc[统计服务]
|
|
end
|
|
|
|
subgraph "数据存储层"
|
|
MySQL[(MySQL数据库)]
|
|
Redis[(Redis缓存)]
|
|
end
|
|
|
|
subgraph "机器学习模块"
|
|
ML[传统ML分类器<br/>朴素贝叶斯/SVM]
|
|
DL[深度学习分类器<br/>BERT<br/>可选]
|
|
Hybrid[混合分类器<br/>置信度融合]
|
|
end
|
|
|
|
Client -->|HTTP/WebSocket| API
|
|
API --> Auth
|
|
API --> NewsSvc
|
|
API --> UserSvc
|
|
API --> ClassifySvc
|
|
API --> CrawlerSvc
|
|
API --> StatisticsSvc
|
|
|
|
NewsSvc --> MySQL
|
|
NewsSvc --> Redis
|
|
UserSvc --> MySQL
|
|
UserSvc --> Redis
|
|
|
|
ClassifySvc --> ML
|
|
ClassifySvc --> DL
|
|
ClassifySvc --> Hybrid
|
|
|
|
CrawlerSvc -->|抓取新闻| ClassifySvc
|
|
CrawlerSvc -->|存储| MySQL
|
|
|
|
ML --> MySQL
|
|
DL --> MySQL
|
|
Hybrid --> MySQL
|
|
|
|
style Client fill:#e1f5ff
|
|
style API fill:#fff4e6
|
|
style MySQL fill:#f0f0f0
|
|
style Redis fill:#f0f0f0
|
|
style ML fill:#e8f5e9
|
|
style DL fill:#e8f5e9
|
|
style Hybrid fill:#e8f5e9
|
|
```
|
|
|
|
## 2. 用户登录认证流程
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant C as 桌面客户端
|
|
participant API as 后端API
|
|
participant Auth as 认证模块
|
|
participant DB as MySQL数据库
|
|
participant Redis as Redis缓存
|
|
|
|
C->>API: POST /auth/login<br/>{username, password}
|
|
API->>Auth: 转发登录请求
|
|
Auth->>DB: 查询用户信息
|
|
DB-->>Auth: 返回用户数据
|
|
|
|
alt 用户存在且密码正确
|
|
Auth->>Auth: 验证通过<br/>生成JWT Token
|
|
Auth->>Redis: 缓存用户会话
|
|
Auth-->>API: 返回Token和用户信息
|
|
API-->>C: 200 OK<br/>{token, user}
|
|
C->>C: 存储Token到localStorage
|
|
else 用户不存在或密码错误
|
|
Auth-->>API: 401 Unauthorized
|
|
API-->>C: 登录失败
|
|
end
|
|
|
|
Note over C,Redis: 后续请求携带Token
|
|
C->>API: 请求其他接口<br/>Authorization: Bearer {token}
|
|
API->>Auth: 验证Token
|
|
Auth->>Redis: 检查Token有效性
|
|
Redis-->>Auth: Token有效
|
|
Auth-->>API: 验证通过
|
|
API-->>C: 返回请求数据
|
|
```
|
|
|
|
## 3. 新闻爬取与自动分类流程
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start([定时任务触发<br/>每30分钟]) --> Crawl[新闻爬虫模块]
|
|
|
|
Crawl -->|并行抓取| Source1[今日头条]
|
|
Crawl -->|并行抓取| Source2[腾讯新闻]
|
|
Crawl -->|并行抓取| Source3[新浪新闻]
|
|
Crawl -->|可配置| SourceN[其他新闻源...]
|
|
|
|
Source1 --> Clean1[数据清洗]
|
|
Source2 --> Clean2[数据清洗]
|
|
Source3 --> Clean3[数据清洗]
|
|
SourceN --> CleanN[数据清洗]
|
|
|
|
Clean1 --> Merge{合并数据}
|
|
Clean2 --> Merge
|
|
Clean3 --> Merge
|
|
CleanN --> Merge
|
|
|
|
Merge --> Dedup[去重处理]
|
|
Dedup --> Validate[数据验证]
|
|
|
|
Validate -->|标题和内容完整| Classify[文本分类服务]
|
|
Validate -->|数据不完整| Discard[丢弃]
|
|
|
|
Classify --> Hybrid{混合分类器}
|
|
|
|
Hybrid --> ML1[传统ML分类器<br/>关键词匹配]
|
|
Hybrid --> ML2[深度学习分类器<br/>BERT<br/>可选]
|
|
|
|
ML1 --> Confidence[置信度计算]
|
|
ML2 --> Confidence
|
|
|
|
Confidence --> Threshold{置信度 >= 0.75?}
|
|
|
|
Threshold -->|是| Success[分类成功]
|
|
Threshold -->|否| Default[使用默认分类<br/>科技类]
|
|
|
|
Success --> Save[保存到数据库]
|
|
Default --> Save
|
|
|
|
Save --> Cache[更新Redis缓存]
|
|
Cache --> End([流程结束])
|
|
|
|
Discard --> Log[记录日志]
|
|
Log --> End
|
|
|
|
style Start fill:#e3f2fd
|
|
style End fill:#e8f5e9
|
|
style Classify fill:#fff3e0
|
|
style Save fill:#f3e5f5
|
|
style Cache fill:#f3e5f5
|
|
```
|
|
|
|
## 4. 新闻浏览与展示流程
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant U as 用户
|
|
participant C as 客户端
|
|
participant Cache as Redis缓存
|
|
participant API as 后端API
|
|
participant DB as MySQL数据库
|
|
participant ML as 分类服务
|
|
|
|
U->>C: 点击新闻列表
|
|
C->>Cache: 查询缓存
|
|
alt 缓存命中
|
|
Cache-->>C: 返回缓存数据
|
|
C-->>U: 展示新闻列表
|
|
else 缓存未命中
|
|
C->>API: GET /news/list<br/>?page=1&size=20
|
|
API->>DB: 分页查询新闻
|
|
DB-->>API: 返回新闻数据
|
|
API->>Cache: 写入缓存
|
|
Cache-->>API: 写入成功
|
|
API-->>C: 返回新闻列表
|
|
C-->>U: 展示新闻列表
|
|
end
|
|
|
|
U->>C: 点击某条新闻
|
|
C->>API: GET /news/{id}
|
|
API->>DB: 查询新闻详情
|
|
DB-->>API: 返回详情数据
|
|
API->>DB: 增加浏览量+1
|
|
API-->>C: 返回详情
|
|
C-->>U: 展示新闻详情
|
|
|
|
U->>C: 按分类筛选
|
|
C->>API: GET /news/category<br/>?categoryCode=TECHNOLOGY
|
|
API->>DB: 按分类查询
|
|
DB-->>API: 返回分类新闻
|
|
API-->>C: 返回结果
|
|
C-->>U: 展示分类新闻
|
|
|
|
U->>C: 搜索新闻
|
|
C->>API: GET /news/search<br/>?keyword=人工智能
|
|
API->>DB: 全文搜索
|
|
alt 使用Elasticsearch
|
|
API->>DB: ES搜索引擎
|
|
end
|
|
DB-->>API: 返回搜索结果
|
|
API-->>C: 返回结果
|
|
C-->>U: 展示搜索结果
|
|
```
|
|
|
|
## 5. 手动发布新闻与分类流程
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start([管理员登录]) --> Verify{验证管理员权限}
|
|
|
|
Verify -->|权限不足| Deny[提示权限不足]
|
|
Verify -->|权限通过| Access[进入管理后台]
|
|
|
|
Access --> Click[点击发布新闻]
|
|
Click --> Form[填写新闻表单]
|
|
Form --> Input[输入标题、内容、<br/>选择分类、上传封面]
|
|
|
|
Input --> Option{是否自动分类?}
|
|
|
|
Option -->|是| AutoClassify[调用分类API]
|
|
Option -->|否| ManualClassify[手动选择分类]
|
|
|
|
AutoClassify --> ClassifySvc[文本分类服务]
|
|
ClassifySvc --> Hybrid{混合分类器}
|
|
|
|
Hybrid --> ML[传统ML分类]
|
|
Hybrid --> DL[深度学习分类<br/>可选]
|
|
|
|
ML --> Result[获取分类结果<br/>+ 置信度]
|
|
DL --> Result
|
|
|
|
Result --> ShowResult[显示推荐分类<br/>置信度: 0.85]
|
|
ShowResult --> Confirm{管理员确认?}
|
|
|
|
Confirm -->|修改| ManualClassify
|
|
Confirm -->|确认| Validate[验证数据]
|
|
|
|
ManualClassify --> Validate
|
|
|
|
Validate --> Check{数据是否完整?}
|
|
|
|
Check -->|否| Error[提示错误信息]
|
|
Check -->|是| Save[保存到数据库]
|
|
|
|
Save --> Status[状态: 已发布]
|
|
Status --> UpdateCache[更新Redis缓存]
|
|
UpdateCache --> Log[记录操作日志]
|
|
Log --> End([发布成功])
|
|
|
|
Error --> Form
|
|
|
|
Deny --> End
|
|
|
|
style Start fill:#e3f2fd
|
|
style End fill:#e8f5e9
|
|
style ClassifySvc fill:#fff3e0
|
|
style Save fill:#f3e5f5
|
|
style UpdateCache fill:#f3e5f5
|
|
```
|
|
|
|
## 6. 数据可视化统计流程
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
subgraph "数据采集"
|
|
DB[(MySQL数据库)]
|
|
Cache[(Redis缓存)]
|
|
end
|
|
|
|
subgraph "统计计算"
|
|
Count[分类统计]
|
|
Trend[趋势分析]
|
|
Hot[热门排行]
|
|
Accuracy[准确率分析]
|
|
end
|
|
|
|
subgraph "数据返回"
|
|
JSON[JSON数据]
|
|
end
|
|
|
|
subgraph "前端展示"
|
|
Pie[饼图<br/>分类分布]
|
|
Line[折线图<br/>发布趋势]
|
|
Bar[柱状图<br/>热门排行]
|
|
Gauge[仪表盘<br/>准确率]
|
|
end
|
|
|
|
DB --> Count
|
|
Cache --> Count
|
|
Count --> JSON
|
|
|
|
DB --> Trend
|
|
Trend --> JSON
|
|
|
|
DB --> Hot
|
|
Cache --> Hot
|
|
Hot --> JSON
|
|
|
|
DB --> Accuracy
|
|
Accuracy --> JSON
|
|
|
|
JSON --> Pie
|
|
JSON --> Line
|
|
JSON --> Bar
|
|
JSON --> Gauge
|
|
|
|
style DB fill:#f0f0f0
|
|
style Cache fill:#f0f0f0
|
|
style JSON fill:#e1f5ff
|
|
style Pie fill:#fff3e0
|
|
style Line fill:#fff3e0
|
|
style Bar fill:#fff3e0
|
|
style Gauge fill:#fff3e0
|
|
```
|
|
|
|
## 7. 系统状态流转图
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> 未登录
|
|
|
|
未登录 --> 已登录: 登录成功
|
|
未登录 --> 未登录: 登录失败
|
|
|
|
已登录 --> 浏览新闻: 查看列表
|
|
浏览新闻 --> 已登录: 返回
|
|
|
|
已登录 --> 查看详情: 点击新闻
|
|
查看详情 --> 已登录: 返回
|
|
|
|
已登录 --> 搜索新闻: 输入关键词
|
|
搜索新闻 --> 已登录: 返回
|
|
|
|
已登录 --> 查看统计: 点击统计页
|
|
查看统计 --> 已登录: 返回
|
|
|
|
已登录 --> 管理员后台: 角色为ADMIN
|
|
管理员后台 --> 已登录: 返回
|
|
|
|
管理员后台 --> 发布新闻: 填写表单
|
|
发布新闻 --> 管理员后台: 发布成功
|
|
|
|
管理员后台 --> 管理分类: 分类管理
|
|
管理分类 --> 管理员后台: 返回
|
|
|
|
管理员后台 --> 管理用户: 用户管理
|
|
管理用户 --> 管理员后台: 返回
|
|
|
|
已登录 --> 未登录: 登出/Token过期
|
|
```
|
|
|
|
## 8. 文本分类算法决策流程
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Input[输入: 新闻标题 + 内容] --> Preprocess{文本预处理}
|
|
|
|
Preprocess --> Clean[去除HTML标签<br/>去除特殊字符<br/>统一编码]
|
|
Clean --> Segment[中文分词<br/>jieba]
|
|
|
|
Segment --> Parallel{并行分类}
|
|
|
|
Parallel --> Trad[传统ML分类器<br/>TF-IDF + 朴素贝叶斯]
|
|
Parallel --> Deep[深度学习分类器<br/>BERT<br/>可选]
|
|
|
|
Trad --> TradResult[结果1: 科技<br/>置信度: 0.82]
|
|
Deep --> DeepResult[结果2: 科技<br/>置信度: 0.88]
|
|
|
|
TradResult --> Compare[置信度比较]
|
|
DeepResult --> Compare
|
|
|
|
Compare --> Select{选择最高置信度}
|
|
|
|
Select --> CheckThreshold{置信度 >= 0.75?}
|
|
|
|
CheckThreshold -->|是| Return[返回分类结果<br/>科技, 0.88, HYBRID]
|
|
CheckThreshold -->|否| Default[返回默认分类<br/>科技, 0.50, HYBRID]
|
|
|
|
Return --> Output[输出分类结果]
|
|
Default --> Output
|
|
|
|
style Input fill:#e3f2fd
|
|
style Output fill:#e8f5e9
|
|
style Parallel fill:#fff3e0
|
|
style Compare fill:#f3e5f5
|
|
style Return fill:#c8e6c9
|
|
style Default fill:#ffccbc
|
|
```
|
|
|
|
## 9. 缓存更新策略流程
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Request[请求到达] --> CheckCache{检查Redis缓存}
|
|
|
|
CheckCache -->|命中| Hit[返回缓存数据]
|
|
CheckCache -->|未命中| Miss[查询MySQL数据库]
|
|
|
|
Miss --> QueryDB[执行SQL查询]
|
|
QueryDB --> Result[获取查询结果]
|
|
|
|
Result --> WriteCache[写入Redis缓存]
|
|
WriteCache --> SetExpire[设置过期时间<br/>30分钟]
|
|
|
|
SetExpire --> Return[返回数据]
|
|
|
|
Hit --> Return
|
|
|
|
Return --> End[请求结束]
|
|
|
|
style CheckCache fill:#fff3e0
|
|
style WriteCache fill:#f3e5f5
|
|
style Hit fill:#c8e6c9
|
|
style Miss fill:#ffccbc
|
|
```
|
|
|
|
## 10. 新闻爬虫详细工作流程
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Trigger[定时任务触发<br/>Cron: 0 */30 * * * ?] --> Config{读取配置}
|
|
|
|
Config --> GetSources[获取启用的新闻源列表]
|
|
|
|
GetSources --> Loop{遍历每个新闻源}
|
|
|
|
Loop --> Fetch[发送HTTP请求]
|
|
Fetch --> CheckResp{响应状态码 200?}
|
|
|
|
CheckResp -->|否| ErrorLog[记录错误日志]
|
|
CheckResp -->|是| Parse[解析HTML<br/>Jsoup]
|
|
|
|
Parse --> Extract[提取新闻数据<br/>标题/内容/链接/时间]
|
|
|
|
Extract --> ValidateData{数据验证}
|
|
|
|
ValidateData -->|标题为空| ErrorLog
|
|
ValidateData -->|内容为空| ErrorLog
|
|
ValidateData -->|数据完整| Continue[继续处理]
|
|
|
|
Continue --> CheckDup{检查URL是否重复?}
|
|
|
|
CheckDup -->|已存在| Skip[跳过该新闻]
|
|
CheckDup -->|不存在| Process[处理新闻]
|
|
|
|
Process --> Classify[调用分类服务]
|
|
Classify --> SaveDB[保存到MySQL]
|
|
SaveDB --> UpdateCache[更新Redis缓存]
|
|
|
|
UpdateCache --> Next{还有新闻源?}
|
|
|
|
ErrorLog --> Next
|
|
Skip --> Next
|
|
|
|
Next -->|是| Loop
|
|
Next -->|否| Summary[生成爬取报告]
|
|
Summary --> Finish([任务结束])
|
|
|
|
style Trigger fill:#e3f2fd
|
|
style Finish fill:#e8f5e9
|
|
style Classify fill:#fff3e0
|
|
style SaveDB fill:#f3e5f5
|
|
style UpdateCache fill:#f3e5f5
|
|
```
|
|
|
|
---
|
|
|
|
## 流程图说明
|
|
|
|
### 关键模块交互说明
|
|
|
|
1. **客户端-后端交互**
|
|
- 使用RESTful API进行通信
|
|
- JWT Token进行身份认证
|
|
- 响应格式统一: `{code, message, data, timestamp}`
|
|
|
|
2. **文本分类流程**
|
|
- 支持传统机器学习(朴素贝叶斯/SVM)
|
|
- 可选深度学习(BERT)
|
|
- 混合分类器选择置信度最高的结果
|
|
- 置信度低于阈值时使用默认分类
|
|
|
|
3. **缓存策略**
|
|
- Redis缓存热点数据
|
|
- 缓存过期时间: 30分钟
|
|
- Cache-Aside模式
|
|
|
|
4. **数据流转**
|
|
- 爬虫 → 分类 → 数据库 → 缓存 → 客户端
|
|
- 管理员操作 → 数据库 → 缓存更新
|
|
- 用户浏览 → 缓存/数据库 → 展示
|