news-classifier/docs/系统流程图.md

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

流程图说明

关键模块交互说明

  1. 客户端-后端交互

    • 使用RESTful API进行通信
    • JWT Token进行身份认证
    • 响应格式统一: {code, message, data, timestamp}
  2. 文本分类流程

    • 支持传统机器学习(朴素贝叶斯/SVM)
    • 可选深度学习(BERT)
    • 混合分类器选择置信度最高的结果
    • 置信度低于阈值时使用默认分类
  3. 缓存策略

    • Redis缓存热点数据
    • 缓存过期时间: 30分钟
    • Cache-Aside模式
  4. 数据流转

    • 爬虫 → 分类 → 数据库 → 缓存 → 客户端
    • 管理员操作 → 数据库 → 缓存更新
    • 用户浏览 → 缓存/数据库 → 展示