12 KiB
12 KiB
基于Tauri的新闻文本分类系统 - 流程图
1. 系统整体架构图
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. 用户登录认证流程
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. 新闻爬取与自动分类流程
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. 新闻浏览与展示流程
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. 手动发布新闻与分类流程
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. 数据可视化统计流程
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. 系统状态流转图
stateDiagram-v2
[*] --> 未登录
未登录 --> 已登录: 登录成功
未登录 --> 未登录: 登录失败
已登录 --> 浏览新闻: 查看列表
浏览新闻 --> 已登录: 返回
已登录 --> 查看详情: 点击新闻
查看详情 --> 已登录: 返回
已登录 --> 搜索新闻: 输入关键词
搜索新闻 --> 已登录: 返回
已登录 --> 查看统计: 点击统计页
查看统计 --> 已登录: 返回
已登录 --> 管理员后台: 角色为ADMIN
管理员后台 --> 已登录: 返回
管理员后台 --> 发布新闻: 填写表单
发布新闻 --> 管理员后台: 发布成功
管理员后台 --> 管理分类: 分类管理
管理分类 --> 管理员后台: 返回
管理员后台 --> 管理用户: 用户管理
管理用户 --> 管理员后台: 返回
已登录 --> 未登录: 登出/Token过期
8. 文本分类算法决策流程
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. 缓存更新策略流程
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. 新闻爬虫详细工作流程
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
流程图说明
关键模块交互说明
-
客户端-后端交互
- 使用RESTful API进行通信
- JWT Token进行身份认证
- 响应格式统一:
{code, message, data, timestamp}
-
文本分类流程
- 支持传统机器学习(朴素贝叶斯/SVM)
- 可选深度学习(BERT)
- 混合分类器选择置信度最高的结果
- 置信度低于阈值时使用默认分类
-
缓存策略
- Redis缓存热点数据
- 缓存过期时间: 30分钟
- Cache-Aside模式
-
数据流转
- 爬虫 → 分类 → 数据库 → 缓存 → 客户端
- 管理员操作 → 数据库 → 缓存更新
- 用户浏览 → 缓存/数据库 → 展示