摘要: 本文围绕大数据毕业设计项目 Data Insight Platform(数据洞察平台) 展开,介绍了一个以"低门槛、全链路、可追溯"为核心理念的一站式数据分析平台。平台基于 FastAPI、Vue 3、PostgreSQL、Redis、MinIO、Celery 与 ClickHouse 构建,打通数据上传、清洗、分析、挖掘、特征工程、机器学习到 AI 智能分析的全流程;通过数据血缘追溯、双轨认证与数据隔离、智能任务分发、远程数据源 SQL 聚合下推、大表分析加速与缓存降级等机制,保障系统的易用性、性能与可审计性。
目录
- [1. 选题背景与意义](#1. 选题背景与意义)
- [2. 系统需求分析](#2. 系统需求分析)
- [2.1 功能需求](#2.1 功能需求)
- [2.2 非功能需求](#2.2 非功能需求)
- [3. 系统总体设计](#3. 系统总体设计)
- [3.1 系统架构设计](#3.1 系统架构设计)
- [3.2 技术栈选型](#3.2 技术栈选型)
- [3.3 智能任务分发机制](#3.3 智能任务分发机制)
- [4. 数据库设计](#4. 数据库设计)
- [4.1 用户表(User)](#4.1 用户表(User))
- [4.2 数据集表(Dataset)](#4.2 数据集表(Dataset))
- [4.3 任务记录表(TaskRecord)](#4.3 任务记录表(TaskRecord))
- [5. 核心功能模块设计与实现](#5. 核心功能模块设计与实现)
- [5.1 双轨认证与数据隔离](#5.1 双轨认证与数据隔离)
- [5.2 数据流转与血缘追溯](#5.2 数据流转与血缘追溯)
- [5.3 五大分析模块设计](#5.3 五大分析模块设计)
- [5.4 远程数据源接入](#5.4 远程数据源接入)
- [5.5 跨模块导入与数据源管理](#5.5 跨模块导入与数据源管理)
- [5.6 AI 智能分析模块](#5.6 AI 智能分析模块)
- [5.7 操作历史模块](#5.7 操作历史模块)
- [6. 关键技术实现](#6. 关键技术实现)
- [6.1 大表分析加速](#6.1 大表分析加速)
- [6.2 缓存降级机制](#6.2 缓存降级机制)
- [6.3 任务记录留痕](#6.3 任务记录留痕)
- [7. 系统测试](#7. 系统测试)
- [7.1 测试内容](#7.1 测试内容)
- [8. 一键部署与快速开始](#8. 一键部署与快速开始)
- [8.1 环境准备](#8.1 环境准备)
- [8.2 Windows 一键启动](#8.2 Windows 一键启动)
- [8.3 Linux/macOS 启动](#8.3 Linux/macOS 启动)
- [8.4 访问地址](#8.4 访问地址)
- [8.5 可选:配置 AI 分析](#8.5 可选:配置 AI 分析)
- [8.6 停止服务](#8.6 停止服务)
- [9. 项目截图](#9. 项目截图)
- [10. 总结与展望](#10. 总结与展望)
项目支持 Docker Compose 一键部署,适合作为大数据专业毕业设计参考与验收。
1. 选题背景与意义
随着大数据技术的普及,企业每天都在产生海量的业务数据。然而,从原始数据到有价值的分析结论之间,往往横亘着较高的技术门槛:数据清洗需要编写脚本、分析建模需要掌握机器学习库、结果呈现需要搭建可视化组件。对于缺乏编码能力的数据分析师和业务人员而言,这一链路既繁琐又容易出错。
针对上述痛点,本毕业设计提出并实现了一套 Data Insight Platform(数据洞察平台)。平台以"低门槛、全链路、可追溯"为核心理念,面向数据分析师、业务人员和开发者,提供从数据上传、清洗、分析、挖掘、特征工程到机器学习建模和 AI 智能分析的一站式数据处理能力。用户无需编写代码即可完成复杂的数据分析任务,同时系统通过血缘追溯机制保证每一个数据产物都能回溯到最初的原始数据。
本课题的研究意义主要体现在以下三个方面:
- 降低数据分析门槛:将清洗、分析、挖掘、建模等环节封装为可视化操作,缩短从数据到洞察的路径。
- 打通全链路数据流转:通过模块化设计实现数据在清洗、分析、挖掘、特征工程、机器学习等模块间的有序流转,避免数据孤岛。
- 增强可追溯性与安全性:引入数据血缘追踪、回收站机制、用户数据隔离和任务留痕,保证分析过程可审计、数据资产可保护。
2. 系统需求分析
2.1 功能需求
结合数据分析业务的实际场景,平台需要满足以下核心功能需求:
- 用户认证与数据隔离:支持用户注册、登录、个人资料维护和密码修改;所有数据必须按用户隔离,任何用户只能访问自己的数据集与任务记录。
- 数据上传与远程数据源接入:支持上传 CSV、Excel、JSON 等格式文件,同时支持接入 MySQL、PostgreSQL 远程数据库作为数据来源。
- 数据清洗:提供缺失值处理、异常值检测、重复值去除、数据类型转换等清洗能力。
- 数据分析:支持单变量、多变量分析,生成包含图表的 HTML 分析报告。
- 数据挖掘:提供聚类分析、关联规则挖掘、序列模式挖掘等算法。
- 特征工程:支持特征构造、编码、缩放、降维和特征选择。
- 机器学习:支持监督学习模型训练、批量预测、模型评估和报告导出。
- AI 智能分析:基于大语言模型实现自然语言对话式分析,支持上下文注入辅助决策。
- 管理后台:提供用户管理、数据管理、任务监控、存储管理、数据库管理等运维功能。
2.2 非功能需求
| 需求类别 | 具体说明 |
|---|---|
| 性能 | 根据数据集规模智能分发同步/异步任务,避免大文件阻塞接口 |
| 安全 | JWT 双轨认证、密码哈希存储、登录失败锁定、账号禁用即时生效 |
| 可靠性 | 回收站软删除 + 永久删除三级保护,任务失败可重试 |
| 可扩展性 | 模块化架构,算法通过注册表统一管理,支持远程数据源扩展 |
| 可维护性 | 前后端分离、分层架构、任务记录留痕,便于问题定位 |
3. 系统总体设计
3.1 系统架构设计
平台采用前后端分离的分层架构。后端基于 FastAPI 构建 RESTful API,前端使用 Vue 3 配合 Vite 构建用户端与管理端两个独立应用。整个系统由七大服务组成,通过 Docker Compose 统一编排。各服务职责单一、通过 RESTful 接口与消息队列解耦,既保证了模块的独立演进,也便于后续按需横向扩展。
#mermaid-svg-fz94efpDAvY8IQOa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fz94efpDAvY8IQOa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fz94efpDAvY8IQOa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fz94efpDAvY8IQOa .error-icon{fill:#552222;}#mermaid-svg-fz94efpDAvY8IQOa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fz94efpDAvY8IQOa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fz94efpDAvY8IQOa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fz94efpDAvY8IQOa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fz94efpDAvY8IQOa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fz94efpDAvY8IQOa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fz94efpDAvY8IQOa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fz94efpDAvY8IQOa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fz94efpDAvY8IQOa .marker.cross{stroke:#333333;}#mermaid-svg-fz94efpDAvY8IQOa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fz94efpDAvY8IQOa p{margin:0;}#mermaid-svg-fz94efpDAvY8IQOa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fz94efpDAvY8IQOa .cluster-label text{fill:#333;}#mermaid-svg-fz94efpDAvY8IQOa .cluster-label span{color:#333;}#mermaid-svg-fz94efpDAvY8IQOa .cluster-label span p{background-color:transparent;}#mermaid-svg-fz94efpDAvY8IQOa .label text,#mermaid-svg-fz94efpDAvY8IQOa span{fill:#333;color:#333;}#mermaid-svg-fz94efpDAvY8IQOa .node rect,#mermaid-svg-fz94efpDAvY8IQOa .node circle,#mermaid-svg-fz94efpDAvY8IQOa .node ellipse,#mermaid-svg-fz94efpDAvY8IQOa .node polygon,#mermaid-svg-fz94efpDAvY8IQOa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fz94efpDAvY8IQOa .rough-node .label text,#mermaid-svg-fz94efpDAvY8IQOa .node .label text,#mermaid-svg-fz94efpDAvY8IQOa .image-shape .label,#mermaid-svg-fz94efpDAvY8IQOa .icon-shape .label{text-anchor:middle;}#mermaid-svg-fz94efpDAvY8IQOa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fz94efpDAvY8IQOa .rough-node .label,#mermaid-svg-fz94efpDAvY8IQOa .node .label,#mermaid-svg-fz94efpDAvY8IQOa .image-shape .label,#mermaid-svg-fz94efpDAvY8IQOa .icon-shape .label{text-align:center;}#mermaid-svg-fz94efpDAvY8IQOa .node.clickable{cursor:pointer;}#mermaid-svg-fz94efpDAvY8IQOa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fz94efpDAvY8IQOa .arrowheadPath{fill:#333333;}#mermaid-svg-fz94efpDAvY8IQOa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fz94efpDAvY8IQOa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fz94efpDAvY8IQOa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fz94efpDAvY8IQOa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fz94efpDAvY8IQOa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fz94efpDAvY8IQOa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fz94efpDAvY8IQOa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fz94efpDAvY8IQOa .cluster text{fill:#333;}#mermaid-svg-fz94efpDAvY8IQOa .cluster span{color:#333;}#mermaid-svg-fz94efpDAvY8IQOa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fz94efpDAvY8IQOa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fz94efpDAvY8IQOa rect.text{fill:none;stroke-width:0;}#mermaid-svg-fz94efpDAvY8IQOa .icon-shape,#mermaid-svg-fz94efpDAvY8IQOa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fz94efpDAvY8IQOa .icon-shape p,#mermaid-svg-fz94efpDAvY8IQOa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fz94efpDAvY8IQOa .icon-shape .label rect,#mermaid-svg-fz94efpDAvY8IQOa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fz94efpDAvY8IQOa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fz94efpDAvY8IQOa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fz94efpDAvY8IQOa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户浏览器
前端应用(Vue 3 + Vite)
管理员浏览器
管理后台(Vue 3 独立应用)
FastAPI 后端服务
PostgreSQL 数据库
Redis 缓存
MinIO 对象存储
Celery 异步任务队列
ClickHouse 分析加速
3.2 技术栈选型
| 层次 | 技术 | 选型说明 |
|---|---|---|
| 后端框架 | FastAPI + Python 3.11 | 高并发异步框架,自动生成 API 文档 |
| 前端框架 | Vue 3 + Vite + Element Plus | 响应式开发,用户端与管理端双应用 |
| 数据库 | PostgreSQL 17 | 强制使用,保障事务与数据一致性 |
| 缓存 | Redis | 数据集列表缓存与 Celery 消息代理 |
| 对象存储 | MinIO | 存储上传文件与中间产物 |
| 异步任务 | Celery | 大文件处理与耗时任务异步化 |
| 分析加速 | ClickHouse | 大表聚合分析下推加速 |
| 部署 | Docker Compose | 七服务一体化编排 |
3.3 智能任务分发机制
平台实现了基于数据规模的任务分发策略:当数据集行数大于等于 ASYNC_THRESHOLD 阈值(默认 10000)时,任务自动分发到 Celery 异步执行;小于阈值时同步执行,避免小任务因队列调度产生额外开销。该阈值并非写死,而是通过配置项动态调整,便于在不同硬件环境与业务规模下灵活调优。同时引入单用户任务并发控制,通过运行中任务上限、等待队列上限和总任务上限三重约束(默认每用户最多 2 个任务同时运行、10 个任务排队等待,总任务数不超过 12 个)保证系统在高并发场景下的稳定性。
下面是智能任务分发的完整决策流程:
#mermaid-svg-SyuFsmmugFtuIbjr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SyuFsmmugFtuIbjr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SyuFsmmugFtuIbjr .error-icon{fill:#552222;}#mermaid-svg-SyuFsmmugFtuIbjr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SyuFsmmugFtuIbjr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SyuFsmmugFtuIbjr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SyuFsmmugFtuIbjr .marker.cross{stroke:#333333;}#mermaid-svg-SyuFsmmugFtuIbjr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SyuFsmmugFtuIbjr p{margin:0;}#mermaid-svg-SyuFsmmugFtuIbjr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SyuFsmmugFtuIbjr .cluster-label text{fill:#333;}#mermaid-svg-SyuFsmmugFtuIbjr .cluster-label span{color:#333;}#mermaid-svg-SyuFsmmugFtuIbjr .cluster-label span p{background-color:transparent;}#mermaid-svg-SyuFsmmugFtuIbjr .label text,#mermaid-svg-SyuFsmmugFtuIbjr span{fill:#333;color:#333;}#mermaid-svg-SyuFsmmugFtuIbjr .node rect,#mermaid-svg-SyuFsmmugFtuIbjr .node circle,#mermaid-svg-SyuFsmmugFtuIbjr .node ellipse,#mermaid-svg-SyuFsmmugFtuIbjr .node polygon,#mermaid-svg-SyuFsmmugFtuIbjr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SyuFsmmugFtuIbjr .rough-node .label text,#mermaid-svg-SyuFsmmugFtuIbjr .node .label text,#mermaid-svg-SyuFsmmugFtuIbjr .image-shape .label,#mermaid-svg-SyuFsmmugFtuIbjr .icon-shape .label{text-anchor:middle;}#mermaid-svg-SyuFsmmugFtuIbjr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SyuFsmmugFtuIbjr .rough-node .label,#mermaid-svg-SyuFsmmugFtuIbjr .node .label,#mermaid-svg-SyuFsmmugFtuIbjr .image-shape .label,#mermaid-svg-SyuFsmmugFtuIbjr .icon-shape .label{text-align:center;}#mermaid-svg-SyuFsmmugFtuIbjr .node.clickable{cursor:pointer;}#mermaid-svg-SyuFsmmugFtuIbjr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SyuFsmmugFtuIbjr .arrowheadPath{fill:#333333;}#mermaid-svg-SyuFsmmugFtuIbjr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SyuFsmmugFtuIbjr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SyuFsmmugFtuIbjr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SyuFsmmugFtuIbjr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SyuFsmmugFtuIbjr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SyuFsmmugFtuIbjr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SyuFsmmugFtuIbjr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SyuFsmmugFtuIbjr .cluster text{fill:#333;}#mermaid-svg-SyuFsmmugFtuIbjr .cluster span{color:#333;}#mermaid-svg-SyuFsmmugFtuIbjr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SyuFsmmugFtuIbjr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SyuFsmmugFtuIbjr rect.text{fill:none;stroke-width:0;}#mermaid-svg-SyuFsmmugFtuIbjr .icon-shape,#mermaid-svg-SyuFsmmugFtuIbjr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SyuFsmmugFtuIbjr .icon-shape p,#mermaid-svg-SyuFsmmugFtuIbjr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SyuFsmmugFtuIbjr .icon-shape .label rect,#mermaid-svg-SyuFsmmugFtuIbjr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SyuFsmmugFtuIbjr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SyuFsmmugFtuIbjr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SyuFsmmugFtuIbjr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
否
是
用户提交数据处理任务
数据集行数 ≥ ASYNC_THRESHOLD?
同步执行
运行中任务数 < 上限?
进入等待队列
等待队列未满?
排队等待调度
拒绝任务并提示
分发至 Celery 异步执行
返回处理结果
4. 数据库设计
系统共设计 13 张数据库表,覆盖用户、数据集、任务记录、AI 会话、数据源连接、支撑工单等核心实体。以下是关键表的结构设计:
4.1 用户表(User)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| username | String | 用户名,唯一索引 |
| String | 邮箱,可空 | |
| hashed_password | String | SHA256 哈希密码 |
| role | String | 角色,默认 user |
| is_active | Boolean | 账号是否启用 |
| failed_login_count | Integer | 连续登录失败次数 |
| locked_until | DateTime | 登录锁定截止时间 |
| last_login_at | DateTime | 最后登录时间 |
| last_login_ip | String | 最后登录 IP |
4.2 数据集表(Dataset)
数据集表是数据血缘追踪的核心载体,通过 parent_id 和 root_dataset_id 两个字段建立数据产物之间的父子关系,配合 module_source、module_label、artifact_type 等标签字段实现产物的模块归属与类型识别。对于远程数据源产生的衍生数据集,还通过 connection_id、table_name、source_type 字段记录来源连接与表信息,使血缘链路同时覆盖本地与远程数据。
#mermaid-svg-uomZqkJhPdldjKMz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uomZqkJhPdldjKMz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uomZqkJhPdldjKMz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uomZqkJhPdldjKMz .error-icon{fill:#552222;}#mermaid-svg-uomZqkJhPdldjKMz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uomZqkJhPdldjKMz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uomZqkJhPdldjKMz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uomZqkJhPdldjKMz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uomZqkJhPdldjKMz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uomZqkJhPdldjKMz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uomZqkJhPdldjKMz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uomZqkJhPdldjKMz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uomZqkJhPdldjKMz .marker.cross{stroke:#333333;}#mermaid-svg-uomZqkJhPdldjKMz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uomZqkJhPdldjKMz p{margin:0;}#mermaid-svg-uomZqkJhPdldjKMz .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-uomZqkJhPdldjKMz .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-uomZqkJhPdldjKMz .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-uomZqkJhPdldjKMz .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-uomZqkJhPdldjKMz .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-uomZqkJhPdldjKMz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uomZqkJhPdldjKMz .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-uomZqkJhPdldjKMz .node rect,#mermaid-svg-uomZqkJhPdldjKMz .node circle,#mermaid-svg-uomZqkJhPdldjKMz .node ellipse,#mermaid-svg-uomZqkJhPdldjKMz .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uomZqkJhPdldjKMz .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-uomZqkJhPdldjKMz .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-uomZqkJhPdldjKMz .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uomZqkJhPdldjKMz .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-uomZqkJhPdldjKMz .edgeLabel .label text{fill:#333;}#mermaid-svg-uomZqkJhPdldjKMz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 拥有
派生(parent_id)
触发
关联
配置
提交
Dataset
Integer
id
PK
Integer
user_id
FK
String
dataset_name
Integer
parent_id
FK
Integer
root_dataset_id
FK
String
module_source
String
module_label
String
artifact_type
String
status
Integer
row_count
DateTime
created_at
User
TaskRecord
DataSourceConnection
SupportMessage
数据集生命周期通过 status 字段管理,流转路径如下:
#mermaid-svg-dK8ww4EFPM61QM0k{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dK8ww4EFPM61QM0k .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dK8ww4EFPM61QM0k .error-icon{fill:#552222;}#mermaid-svg-dK8ww4EFPM61QM0k .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dK8ww4EFPM61QM0k .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dK8ww4EFPM61QM0k .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dK8ww4EFPM61QM0k .marker.cross{stroke:#333333;}#mermaid-svg-dK8ww4EFPM61QM0k svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dK8ww4EFPM61QM0k p{margin:0;}#mermaid-svg-dK8ww4EFPM61QM0k defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-dK8ww4EFPM61QM0k g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-dK8ww4EFPM61QM0k g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-dK8ww4EFPM61QM0k g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-dK8ww4EFPM61QM0k g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-dK8ww4EFPM61QM0k g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-dK8ww4EFPM61QM0k .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-dK8ww4EFPM61QM0k .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-dK8ww4EFPM61QM0k .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-dK8ww4EFPM61QM0k .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-dK8ww4EFPM61QM0k .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-dK8ww4EFPM61QM0k .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-dK8ww4EFPM61QM0k .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-dK8ww4EFPM61QM0k .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dK8ww4EFPM61QM0k .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dK8ww4EFPM61QM0k .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dK8ww4EFPM61QM0k .edgeLabel .label text{fill:#333;}#mermaid-svg-dK8ww4EFPM61QM0k .label div .edgeLabel{color:#333;}#mermaid-svg-dK8ww4EFPM61QM0k .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-dK8ww4EFPM61QM0k .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-dK8ww4EFPM61QM0k .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-dK8ww4EFPM61QM0k .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-dK8ww4EFPM61QM0k .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-dK8ww4EFPM61QM0k .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dK8ww4EFPM61QM0k .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dK8ww4EFPM61QM0k #statediagram-barbEnd{fill:#333333;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dK8ww4EFPM61QM0k .cluster-label,#mermaid-svg-dK8ww4EFPM61QM0k .nodeLabel{color:#131300;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-dK8ww4EFPM61QM0k .note-edge{stroke-dasharray:5;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-note text{fill:black;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram-note .nodeLabel{color:black;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagram .edgeLabel{color:red;}#mermaid-svg-dK8ww4EFPM61QM0k #dependencyStart,#mermaid-svg-dK8ww4EFPM61QM0k #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-dK8ww4EFPM61QM0k .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dK8ww4EFPM61QM0k :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 上传/创建
软删除(进入回收站)
永久删除
MinIO 文件丢失
active
deleted
corrupted
4.3 任务记录表(TaskRecord)
所有用户操作都会写入任务记录,用于操作留痕、进度追踪与统计。关键字段包括任务类型、关联数据集、操作参数、任务状态、失败原因和执行耗时等。任务类型共 14 种,覆盖文件上传、数据治理、清洗、分析、挖掘、特征工程五个子类、机器学习、模型训练、AI 分析和账号管理。
5. 核心功能模块设计与实现
5.1 双轨认证与数据隔离
用户认证采用普通用户与管理员分离的双轨机制。普通用户通过 /api/users/login 登录并获取 JWT Token,管理员通过独立的 /admin/auth/login 端点认证。密码使用 SHA256 单向哈希存储,JWT 采用 HS256 算法签名,默认有效期 120 分钟。
双轨认证的交互流程如下:
PostgreSQL FastAPI 后端 管理员 普通用户 PostgreSQL FastAPI 后端 管理员 普通用户 #mermaid-svg-elLPGQYtxEVkva78{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-elLPGQYtxEVkva78 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-elLPGQYtxEVkva78 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-elLPGQYtxEVkva78 .error-icon{fill:#552222;}#mermaid-svg-elLPGQYtxEVkva78 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-elLPGQYtxEVkva78 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-elLPGQYtxEVkva78 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-elLPGQYtxEVkva78 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-elLPGQYtxEVkva78 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-elLPGQYtxEVkva78 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-elLPGQYtxEVkva78 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-elLPGQYtxEVkva78 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-elLPGQYtxEVkva78 .marker.cross{stroke:#333333;}#mermaid-svg-elLPGQYtxEVkva78 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-elLPGQYtxEVkva78 p{margin:0;}#mermaid-svg-elLPGQYtxEVkva78 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-elLPGQYtxEVkva78 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-elLPGQYtxEVkva78 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-elLPGQYtxEVkva78 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-elLPGQYtxEVkva78 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-elLPGQYtxEVkva78 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-elLPGQYtxEVkva78 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-elLPGQYtxEVkva78 .sequenceNumber{fill:white;}#mermaid-svg-elLPGQYtxEVkva78 #sequencenumber{fill:#333;}#mermaid-svg-elLPGQYtxEVkva78 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-elLPGQYtxEVkva78 .messageText{fill:#333;stroke:none;}#mermaid-svg-elLPGQYtxEVkva78 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-elLPGQYtxEVkva78 .labelText,#mermaid-svg-elLPGQYtxEVkva78 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-elLPGQYtxEVkva78 .loopText,#mermaid-svg-elLPGQYtxEVkva78 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-elLPGQYtxEVkva78 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-elLPGQYtxEVkva78 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-elLPGQYtxEVkva78 .noteText,#mermaid-svg-elLPGQYtxEVkva78 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-elLPGQYtxEVkva78 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-elLPGQYtxEVkva78 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-elLPGQYtxEVkva78 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-elLPGQYtxEVkva78 .actorPopupMenu{position:absolute;}#mermaid-svg-elLPGQYtxEVkva78 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-elLPGQYtxEVkva78 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-elLPGQYtxEVkva78 .actor-man circle,#mermaid-svg-elLPGQYtxEVkva78 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-elLPGQYtxEVkva78 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} POST /api/users/login 校验用户名与密码 返回用户信息 签发普通用户 JWT POST /admin/auth/login 校验管理员凭证 返回管理员信息 签发管理员 JWT
安全机制上,系统实现了连续失败 5 次锁定 15 分钟的防暴力破解策略,同时管理员禁用账号后通过 get_current_user 依赖注入即时生效,已登录用户的后续请求也会被统一拦截。
数据隔离遵循"所有数据查询必须包含 user_id 过滤条件"的核心原则,具体落实到三个方面:
python
# API 层:数据集查询强制按用户过滤
datasets = db.query(Dataset).filter(Dataset.user_id == current_user.id).all()
# 工具层:统一校验数据集归属
def get_dataset_or_404(db, dataset_id, user_id):
dataset = db.query(Dataset).filter(
Dataset.id == dataset_id,
Dataset.user_id == user_id
).first()
if not dataset:
raise HTTPException(status_code=404, detail="数据集不存在")
return dataset
# 缓存层:缓存键包含用户 ID,避免跨用户读到脏数据
cache_key = f"datasets:user:{user_id}:list"
5.2 数据流转与血缘追溯
平台的核心创新点在于全链路的数据血缘追踪机制。每个数据产物记录 parent_id 指向直接父数据集,root_dataset_id 回溯到最原始的上传数据,从而构建出完整的数据派生链路。数据分析报告、机器学习报告等产物的 report_content 字段以 JSON 格式存储报告内容,实现结构化留存。
#mermaid-svg-IMGuc0QuYpmpgLYY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IMGuc0QuYpmpgLYY .error-icon{fill:#552222;}#mermaid-svg-IMGuc0QuYpmpgLYY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IMGuc0QuYpmpgLYY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IMGuc0QuYpmpgLYY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IMGuc0QuYpmpgLYY .marker.cross{stroke:#333333;}#mermaid-svg-IMGuc0QuYpmpgLYY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IMGuc0QuYpmpgLYY p{margin:0;}#mermaid-svg-IMGuc0QuYpmpgLYY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY .cluster-label text{fill:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY .cluster-label span{color:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY .cluster-label span p{background-color:transparent;}#mermaid-svg-IMGuc0QuYpmpgLYY .label text,#mermaid-svg-IMGuc0QuYpmpgLYY span{fill:#333;color:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY .node rect,#mermaid-svg-IMGuc0QuYpmpgLYY .node circle,#mermaid-svg-IMGuc0QuYpmpgLYY .node ellipse,#mermaid-svg-IMGuc0QuYpmpgLYY .node polygon,#mermaid-svg-IMGuc0QuYpmpgLYY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IMGuc0QuYpmpgLYY .rough-node .label text,#mermaid-svg-IMGuc0QuYpmpgLYY .node .label text,#mermaid-svg-IMGuc0QuYpmpgLYY .image-shape .label,#mermaid-svg-IMGuc0QuYpmpgLYY .icon-shape .label{text-anchor:middle;}#mermaid-svg-IMGuc0QuYpmpgLYY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IMGuc0QuYpmpgLYY .rough-node .label,#mermaid-svg-IMGuc0QuYpmpgLYY .node .label,#mermaid-svg-IMGuc0QuYpmpgLYY .image-shape .label,#mermaid-svg-IMGuc0QuYpmpgLYY .icon-shape .label{text-align:center;}#mermaid-svg-IMGuc0QuYpmpgLYY .node.clickable{cursor:pointer;}#mermaid-svg-IMGuc0QuYpmpgLYY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IMGuc0QuYpmpgLYY .arrowheadPath{fill:#333333;}#mermaid-svg-IMGuc0QuYpmpgLYY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IMGuc0QuYpmpgLYY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IMGuc0QuYpmpgLYY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IMGuc0QuYpmpgLYY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IMGuc0QuYpmpgLYY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IMGuc0QuYpmpgLYY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IMGuc0QuYpmpgLYY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IMGuc0QuYpmpgLYY .cluster text{fill:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY .cluster span{color:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IMGuc0QuYpmpgLYY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IMGuc0QuYpmpgLYY rect.text{fill:none;stroke-width:0;}#mermaid-svg-IMGuc0QuYpmpgLYY .icon-shape,#mermaid-svg-IMGuc0QuYpmpgLYY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IMGuc0QuYpmpgLYY .icon-shape p,#mermaid-svg-IMGuc0QuYpmpgLYY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IMGuc0QuYpmpgLYY .icon-shape .label rect,#mermaid-svg-IMGuc0QuYpmpgLYY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IMGuc0QuYpmpgLYY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IMGuc0QuYpmpgLYY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IMGuc0QuYpmpgLYY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始数据上传
数据清洗
数据分析
分析报告
数据挖掘
聚类/关联/序列产物
特征工程
特征产物
机器学习
模型/预测产物
5.3 五大分析模块设计
平台将数据清洗、数据分析、数据挖掘、特征工程、机器学习设计为五个既独立又相互关联的模块。各模块拥有独立的原始数据池,产物通过 module_source 和 artifact_type 标签化管理。用户在任意模块上传数据后,可通过跨模块导入接口将数据集导入其他模块,导入时自动记录 parent_id 血缘关系并保留原始元数据。
各模块的产物类型与算法说明如下表:
| 模块 | 产物类型 | 核心能力 |
|---|---|---|
| 数据清洗 | cleaning_result | 缺失值、异常值、重复值、类型转换 |
| 数据分析 | analysis_data / analysis_report | 单变量、多变量分析,HTML 报告 |
| 数据挖掘 | cluster_result / association_rules / sequential_patterns | 聚类、关联规则、序列模式 |
| 特征工程 | feature_result | 构造、编码、缩放、降维、特征选择 |
| 机器学习 | ml_model / ml_prediction / ml_report | 监督学习、批量预测、模型评估 |
数据清洗模块采用五步向导设计,引导用户从"问题检测"到"清洗执行"再到"结果审计",全程可视化、无需编写代码:
| 步骤 | 名称 | 作用 |
|---|---|---|
| 1 | 预检 | 自动检测缺失值、重复行、类型识别、异常值、类型错误 |
| 2 | 契约 | 为每列配置期望类型与范围/枚举/日期等约束 |
| 3 | 问题清单 | 按契约分析 6 类问题,逐条或批量设置处理方式 |
| 4 | 管道 | 自动生成清洗步骤,可调整顺序、追加列操作/行过滤 |
| 5 | 审计 | 前后对比、质量评分、行级差异,确认后保存结果 |
在"问题清单"步骤中,系统按契约识别 6 类数据问题,每类问题均提供多种处理策略:
| 问题类型 | 处理策略(数值列 / 非数值列) |
|---|---|
| 缺失值 | 均值填充 / 中位数填充 / 众数填充 / 删除行 / 自定义值 / 标记列 |
| 类型错误 | 强制转换 / 标记为缺失 / 删除行 |
| 范围错误 | 截断到边界 / 删除行 / 标记 / 均值 / 中位数 / 自定义值 |
| 异常值 | 截断到 IQR 边界(默认)/ 均值 / 中位数 / 众数 / 删除行 / 标记 / 自定义值 |
| 行重复 | 保留第一条(默认)/ 保留最后一条 / 全部删除 |
| 列重复 | 保留第一条 / 保留最后一条 / 全部删除 / 手动选择保留行 |
清洗管道支持拖拽调整顺序 ,并可追加列操作(重命名/删除列)与行过滤(条件式,如 age > 18 & status == 'active')。系统内置推荐执行顺序:行重复 → 列重复 → 类型错误 → 范围错误 → 异常值 → 缺失值 → 列操作 → 行过滤。其中缺失值放在最后处理,因为填充可能产生不符合类型要求、超出范围或异常的值,先处理其他问题再填充结果更干净。列操作和行过滤必须位于管道末尾,且列操作必须在行过滤之前,否则会阻断执行。
执行前系统会进行 dry-run 预检:错误 (如"列操作在行过滤之后")会阻断执行;警告 (如数据丢失风险超过 50%)可在确认弹窗中选择"强制执行"或"返回修改"。执行完成后生成审计报告 ,包含清洗摘要、4 维度质量评分(完整性、唯一性、一致性、有效性)与行级差异明细,确认后保存为 cleaning_result 产物进入数据管理,并自动写入算法描述。异常值检测默认采用 IQR 方法 (四分位距),超出 Q1 - 1.5×IQR 至 Q3 + 1.5×IQR 视为异常值;远程大表(>5 万行采样)只允许预览清洗结果,禁止保存,需先导入本地数据集再全量清洗。
数据分析模块帮助用户快速掌握数据全貌:查看统计摘要、评估数据质量、绘制各类图表,并一键生成分析报告。
统计摘要:选择数据集后自动加载,包含三部分:
- 基本信息:总行数、总列数、数值列数、分类列数。
- 列信息表:每列的列名(可重命名)、类型(数值/分类,可点击切换)、缺失数、缺失率、完整性等级、唯一性等级、质量评分(0-100)。质量评分权重为完整性 60% + 唯一性 20% + 类型 20%。
- 数值列统计(16 项指标):均值、中位数、标准差、最小值、最大值、缺失数、缺失率、偏度、峰度、P90/P95/P99、变异系数、众数、零值数、零值率。
- 分类列统计:唯一值数、缺失数、缺失率、TOP 值及频数。
数据质量概览:顶部质量卡片展示 5 个指标------总体缺失率、含缺失值列数、含无穷大列数(非 0 时标红提示,建议先在清洗模块处理)、重复行数、常量列数(唯一值数 ≤ 1)。三项核心指标全为 0 时提示"数据质量良好"。
图表分析:平台内置 15 种图表,按用途分为 4 组,选择图表类型后按提示选择对应列即可:
| 分组 | 图表 | 需要的数据条件 |
|---|---|---|
| 数据分布 | 直方图、箱线图、KDE密度图、标准化QQ图 | 至少 1 个数值列 |
| 趋势与对比 | 面积图、多折线图、柱状图、堆叠柱状图、双Y轴图 | 数值列(柱状图需 1 分类+1 数值;双Y轴需 2 数值列) |
| 变量关系 | 散点图、气泡图、热力图、表格热力图 | 2 个以上数值列 |
| 占比构成 | 饼图 | 1 个分类列 |
| 特殊图表 | 雷达图 | 至少 3 个数值列 |
常用参数方面:柱状/散点/面积图支持 X 列(分类或留空用行索引)、Y 列(数值多选)与 TOP N;直方图/箱线图/KDE/QQ 图支持数值列多选(直方图分箱数由后端按样本量自动计算);饼图支持分类列 + TOP N(默认 10);热力图支持数值列多选(默认全选计算相关性矩阵)。选好图表后可点"添加到分析报告",把该图表纳入后续生成的报告。
生成分析报告 :点击"选择数据集"卡片标题栏的"生成分析报告"按钮,可勾选 6 个章节------数据预览(预览行数 0-50,默认 5)、数据质量概览(可勾选各质量指标)、列信息(全部列的类型/缺失/质量评分,固定展示)、数值列统计(可勾选 16 项统计指标)、分类列统计(可勾选 4 项 + TOP 值数量 1-20,默认 10)、自定义图表(已"添加到分析报告"的图表)。预览报告后可"导出到数据管理"保存为分析报告产物,供随时查看与下载。
使用建议:先看质量概览再决定是否清洗,缺失/无穷大/重复过高时先去数据清洗模块处理;分析"两列数值量纲差异大(>10 倍)"的关系时推荐使用双Y轴图;判断正态分布用 QQ 图,看分布形态用直方图/KDE,看相关性用热力图/散点图;报告生成 ≥1 万行时自动异步执行,可在任务面板查看进度。
特征工程模块通过构造新特征、编码、缩放、降维、选择五大能力,把原始数据加工成更适合机器学习模型的特征。所有操作基于"列池"进行,执行后原地更新数据集,其他模块可立即使用新列。
特征构造 (7 种操作):四则运算(除法分母含 0 时拒绝构造)、多项式(生成 x²...xⁿ 系列特征)、对数变换(log1p(clip(0)),负值裁剪为 0 并告警)、分箱(等宽/等频,箱数 2-20)、时间拆解(year/month/day/weekday/quarter/is_weekend,每项生成一列)、类别交叉(≥2 个类别列生成组合特征)、Target 编码(用目标列按类别分组的均值替换)。
特征编码 :OneHot 独热编码生成 ohe_{列}_类别 系列 0/1 列,高基数列上限 100 ,超过会拒绝并建议改用 Label 编码或先分箱;Label 标签编码生成 le_{列} 列,类别映射为整数 0,1,2...。
特征缩放 :StandardScaler 标准化(前缀 std_,均值 0、方差 1,适合距离类/梯度类算法如 SVM、KMeans、神经网络);MinMaxScaler 归一化(前缀 norm_,映射到 0,1,适合取值范围有限或对量纲敏感的算法)。执行缩放要求数据无无穷大/缺失值/常量列,建议先清洗。
特征降维:PCA 主成分分析为线性降维,输出各主成分解释方差比,适合特征冗余多时压缩维度;t-SNE 为非线性降维,适合可视化(降维维度强制 ≤ 3)。降维前会自动做标准化,建议先执行"特征缩放"再降维,效果更佳。
特征选择(按评分选 Top-K,默认 10):卡方检验 chi2(仅分类,特征需非负)、互信息 mutual_info(分类/回归,度量特征与目标关联强度,默认推荐)、皮尔逊相关 pearson(回归,用相关系数绝对值排序)、随机森林重要度 tree(分类/回归,用模型特征重要性排序)。选择目标列与 Top-K 后,可"导出特征选择产物"生成新数据集。
列池管理:列按模块分组展示(原始列 / 特征构造 / 特征编码 / 特征缩放 / 特征降维);仅构造列可删除,原始列禁止删除(防止破坏源数据);原始列与构造列均可重命名;支持按模块分组多选导出 CSV,作为特征工程产物。
预检建议:选择数据集后自动预检各列质量(类型、NaN、无穷大、常量、高基数列等),并给出操作可行性------特征选择需存在可用数值列;特征构造无硬性限制(有问题列时新列可能继承缺失值);特征编码需存在非数值列,高基数列不建议 OneHot;特征缩放与特征降维需存在可用数值列(降维需 ≥ 2 个)。
使用建议 :推荐顺序为清洗 → 构造/编码 → 缩放 → 降维 → 选择 ;类别特征低基数(≤ 100 类)优先 OneHot,高基数用 Label 编码或 Target 编码;连续特征分布偏斜明显时优先对数变换 再缩放;特征列多(> 500)时先用特征选择/降维压缩再训练模型,可显著提速;特征工程产物会按模块分组保存在数据管理,供机器学习模块直接选择。
数据挖掘模块提供三类经典任务:聚类分析 、关联规则 、序列模式,每类均有预检与算法推荐,帮助零基础用户也能快速上手。
聚类分析:将样本划分为若干簇,发现数据内在分组,支持 KMeans、DBSCAN、层次聚类三种算法。KMeans 参数包括聚类数 n_clusters(默认 5,自动推荐,范围 2-10)、初始中心 init(默认 k-means++,可选 random)、最大迭代 max_iter(默认 300,范围 100-1000)、运行次数 n_init(默认 10,范围 1-20,越大结果越稳定);DBSCAN 参数包括邻域半径 eps(默认 0.5,范围 0.01-10,越小簇越细)、最小样本 min_samples(默认 5,范围 1-100)、距离度量 metric(默认 euclidean,可选 euclidean/manhattan/cosine);层次聚类参数包括聚类数 n_clusters(默认 3,自动推荐,范围 2-10)、连接方式 linkage(默认 ward,可选 ward/average/complete/single)。
自动推荐原理 :聚类数 K 综合轮廓系数 (主)与肘部法则 (辅)在 2 到 min(10, √行数) 中寻找最优;DBSCAN 的 eps 通过 k-距离图拐点确定,min_samples 按数据量分级(<100 行取 3、100-1000 行取 5、>1000 行取 10)。
关联规则:挖掘"买了 A 也买 B"的频繁共现模式(购物篮分析),支持 Apriori、FP-Growth 算法。数据格式支持 basket(购物篮,需选事务标识列+项列)与 binary(自动二值化);最小支持度 min_support 默认 0.1(范围 0.01-1.0,支持度 = 项集出现次数 / 事务数);最小置信度 min_confidence 默认 0.8(范围 0.5-1.0,置信度 = 条件概率 P(B|A));最小提升度 min_lift 默认 1.0(>1 表示 A 与 B 正相关,越大越强);最大项集长度默认不限制(范围 1-10)。
自动推荐原理 :按事务数分级------<100 行建议
支持度 0.2 / 置信度 0.8;100-1000 行0.1 / 0.7;>1000 行0.05 / 0.6。
序列模式:按时间顺序挖掘频繁发生的事件序列,支持 PrefixSpan、GSP 算法。最小支持度 min_support 默认 0.1(范围 0.01-1.0);最大序列长度 max_len 默认 10(0 表示不限制)。
自动推荐原理:按序列数分级------<50 个序列支持度 0.3;50-500 个 0.1;>500 个 0.05。
预检与算法推荐:选择数据集后自动预检,给出数据概况(行数、列数、数值列/类别列数、缺失值比例、异常值比例(IQR 法)、时间列、ID 列);阻断错误(行数 < 3 样本过少、无数值列无法聚类时阻止执行);警告(缺失率 > 30%、异常值比例 > 10%、列数 > 50、类别列唯一值 > 100 时关联规则可能产生大量项集)。算法推荐理由:KMeans 经典聚类算法适用性广(始终推荐);层次聚类在行数 ≤ 2000 时推荐(数据量大时性能较差);DBSCAN 在行数 ≥ 50 或数值列 ≥ 3 时推荐(可发现任意形状的簇);FP-Growth 在数据量 ≥ 500 行时推荐(效率更高);PrefixSpan / GSP 检测到时间列时均推荐。
使用建议 :聚类前建议先到清洗模块处理缺失值/异常值,并在特征工程做特征缩放 (KMeans 基于距离);关联规则适合高维稀疏 的"事务-商品"数据,类别列唯一值过多时会告警,可先筛选高频类别;序列模式需要数据含时间列,且需明确序列标识列与事件列(也可自动检测);挖掘结果可预览、下载 CSV,也可保存为挖掘产物供特征工程/AI 分析使用。
机器学习模块提供 14 种经典算法的分类与回归训练、自动调参和批量预测。全程有预检、目标列推荐、算法评分推荐与特征列自动勾选,从零开始也能完成高质量建模。
训练前预检:选择数据集后自动预检并给出数据概况(行数、列数、数值/分类列数、缺失率、常量列、高基数列(唯一值 > 100));阻断错误(行数 < 10、无数值列且分类列 ≤ 1 时阻止训练);警告(缺失率 > 30%、存在常量列、高基数分类列(建议先编码)、数值特征 < 3、数值列唯一值 2-20 误用为回归目标(R² 可能为负)等);提示(行数 ≥ 1 万自动异步执行;列数 > 500 建议先特征选择/降维)。
目标列与特征列推荐 :选择目标列后立即联动推荐。目标列推荐规则:数值列且唯一值 > 10 → 推荐回归 (预测连续数值);数值列且唯一值 2-10 → 推荐分类 (唯一值 = 2 为二分类);分类列且唯一值 2-20 → 推荐分类 ;唯一值 < 2(常量)或缺失率 > 50% 或唯一值 > 20 的分类列 → 不推荐。特征列自动勾选(评分 ≥ 0.1 自动选中):数值特征 vs 数值目标用 Pearson 相关系数 绝对值;数值特征 vs 分类目标用 ANOVA F 值 归一化;分类特征 vs 分类目标用 卡方检验 统计量归一化;分类特征 vs 数值目标用 组间方差占比 (eta squared)。点击"自动推荐"按钮可一键填充任务类型 + 最高评分算法 + 高关联特征列。
算法选择(14 种):分类(11 种)支持逻辑回归、SVM、决策树、朴素贝叶斯、KNN、随机森林、AdaBoost、GBDT、XGBoost、LightGBM、MLP;回归(12 种)支持线性回归、岭回归、Lasso、SVM、决策树、KNN、随机森林、AdaBoost、GBDT、XGBoost、LightGBM、MLP。
算法评分推荐(0-100 分) ,主要依据数据量:大数据(≥1 万行)随机森林 / XGBoost / LightGBM 92 分,逻辑回归 / 线性 / 岭 / Lasso 75 分;小数据(<100 行)逻辑回归 / 决策树 / 朴素贝叶斯 / 线性回归 88 分,神经网络 / 树集成 55 分且不推荐 (过拟合风险);中等数据(100-10000 行)XGBoost / LightGBM 88 分(工业首选),随机森林 85 分,逻辑 / 线性 / 决策树 78 分(良好基线);SVM / KNN 在数据 > 10000 行时仅 25 分且不推荐(复杂度 O(n²)~O(n³),训练极慢)。选中"不推荐"算法时会有确认提示,确认后可强制使用。缺失值处理:XGBoost / LightGBM 原生支持缺失值(保留 NaN 自行处理);其余算法自动均值填充 + 0 填充,并先做标准化再训练。
训练参数:测试集比例 test_size 默认 0.2(<1000 行用 0.3;1000-10000 行 0.2;>10000 行 0.1);K 折交叉验证 cv_folds 默认 5(2-20,稀有类别样本不足时自动降折);随机种子 random_seed 默认 42(固定后结果可复现);自动调优默认关闭(关闭用默认参数直接训练);调优方法支持 random / grid 两种。
自动调参 :L2 随机搜索(random)用 RandomizedSearchCV 随机采样超参组合,速度快,适合大搜索空间;L3 网格搜索(grid)用 GridSearchCV 穷举全部组合,最准确但耗时最长。调优评分指标:分类用 f1_weighted ,回归用 r2。超参搜索空间按算法内置默认(如随机森林的 n_estimators 50,100,200、max_depth 3,5,10 等),也可手动指定。
评估原理:训练集+测试集两划分,用 K 折交叉验证代替独立验证集,测试集完全独立用于最终评估,避免数据泄露。
训练结果与预测 :训练结果包含模型文件(.pkl)、性能指标(分类准确率/f1、回归 R² 等)、特征重要性、最优超参数、调优记录,全部保存在数据管理"机器学习产物"中。支持批量预测:上传待预测数据,选择已训练模型进行预测,结果保存为预测产物。
使用建议 :建模顺序为清洗 → 特征工程 → 预检 → 训练 → 评估 → 预测;小数据优先简单模型(线性/逻辑/决策树),大数据优先树集成(RF/XGB/LGBM);目标列需先经数据清洗处理缺失值(分类任务不允许缺失目标值);训练 ≥1 万行自动异步执行,可在任务面板/操作历史查看进度。
5.5 远程数据源接入参考右侧时间与行数信息。
跨模块导入:顶部"数据导入"可将已有产物复制到其他模块使用。可导入的来源包括原始数据、清洗产物、挖掘产物(聚类/关联/序列)、特征工程产物等;目标模块覆盖数据分析、数据清洗、数据挖掘、特征工程、机器学习与 AI 分析。导入即创建一份副本,后续可在对应模块中直接选择使用。
数据源管理 :点击右上角"数据源"按钮打开数据源管理弹窗,包含本地数据集 (各模块上传后自动汇总)与远程数据库(新建/编辑连接,目前支持 MySQL、PostgreSQL,配置连接名称、主机、端口、数据库名、用户名、密码及额外参数,可先"测试连接"再保存;"浏览表"可查看表名/行数/列数,并支持"在模块中使用"直接跳转到指定模块加载该远程表)。
使用建议 :上传文件统一在各业务模块内进行(数据分析/清洗/挖掘/特征/ML 页面的"数据上传"卡片),数据管理页负责统一查看与管理;需要全量分析远程大表时,先在数据管理中把远程表导入为本地数据集,避免采样带来的误差;删除是软删除,误删可在回收站恢复,永久删除与清空回收站不可在用户端找回。
5.4 远程数据源接入
平台在本地文件上传之外,扩展了远程数据库数据源能力,支持 MySQL 和 PostgreSQL 的连接管理、结构探查与 SQL 下推聚合。连接密码经 Fernet 对称加密后存储,密钥从应用配置表中懒加载,避免明文凭据落盘;同时通过标识符白名单校验与参数化查询,从源头阻断 SQL 注入风险。远程连接统一采用 5 秒超时,所有路由以同步方式实现并通过线程池执行,避免阻塞事件循环。
关键设计是 SQL 聚合下推:针对大表的均值、计数等聚合操作,系统将计算下推到远程数据库执行,仅返回聚合结果,大幅降低网络传输和本地计算开销。
SQL 聚合下推的处理流程如下:
#mermaid-svg-nXFaTk9Ih4x4K975{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nXFaTk9Ih4x4K975 .error-icon{fill:#552222;}#mermaid-svg-nXFaTk9Ih4x4K975 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nXFaTk9Ih4x4K975 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nXFaTk9Ih4x4K975 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nXFaTk9Ih4x4K975 .marker.cross{stroke:#333333;}#mermaid-svg-nXFaTk9Ih4x4K975 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nXFaTk9Ih4x4K975 p{margin:0;}#mermaid-svg-nXFaTk9Ih4x4K975 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 .cluster-label text{fill:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 .cluster-label span{color:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 .cluster-label span p{background-color:transparent;}#mermaid-svg-nXFaTk9Ih4x4K975 .label text,#mermaid-svg-nXFaTk9Ih4x4K975 span{fill:#333;color:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 .node rect,#mermaid-svg-nXFaTk9Ih4x4K975 .node circle,#mermaid-svg-nXFaTk9Ih4x4K975 .node ellipse,#mermaid-svg-nXFaTk9Ih4x4K975 .node polygon,#mermaid-svg-nXFaTk9Ih4x4K975 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nXFaTk9Ih4x4K975 .rough-node .label text,#mermaid-svg-nXFaTk9Ih4x4K975 .node .label text,#mermaid-svg-nXFaTk9Ih4x4K975 .image-shape .label,#mermaid-svg-nXFaTk9Ih4x4K975 .icon-shape .label{text-anchor:middle;}#mermaid-svg-nXFaTk9Ih4x4K975 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nXFaTk9Ih4x4K975 .rough-node .label,#mermaid-svg-nXFaTk9Ih4x4K975 .node .label,#mermaid-svg-nXFaTk9Ih4x4K975 .image-shape .label,#mermaid-svg-nXFaTk9Ih4x4K975 .icon-shape .label{text-align:center;}#mermaid-svg-nXFaTk9Ih4x4K975 .node.clickable{cursor:pointer;}#mermaid-svg-nXFaTk9Ih4x4K975 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nXFaTk9Ih4x4K975 .arrowheadPath{fill:#333333;}#mermaid-svg-nXFaTk9Ih4x4K975 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nXFaTk9Ih4x4K975 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nXFaTk9Ih4x4K975 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nXFaTk9Ih4x4K975 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nXFaTk9Ih4x4K975 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nXFaTk9Ih4x4K975 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nXFaTk9Ih4x4K975 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nXFaTk9Ih4x4K975 .cluster text{fill:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 .cluster span{color:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nXFaTk9Ih4x4K975 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nXFaTk9Ih4x4K975 rect.text{fill:none;stroke-width:0;}#mermaid-svg-nXFaTk9Ih4x4K975 .icon-shape,#mermaid-svg-nXFaTk9Ih4x4K975 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nXFaTk9Ih4x4K975 .icon-shape p,#mermaid-svg-nXFaTk9Ih4x4K975 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nXFaTk9Ih4x4K975 .icon-shape .label rect,#mermaid-svg-nXFaTk9Ih4x4K975 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nXFaTk9Ih4x4K975 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nXFaTk9Ih4x4K975 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nXFaTk9Ih4x4K975 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户发起聚合分析
选择远程数据源表
生成 SQL 聚合语句
下推至远程数据库执行
仅返回聚合结果
前端渲染图表
5.7 操作历史模块
操作历史记录平台上的全部异步任务(上传、清洗、分析、挖掘、特征工程、机器学习、AI 对话等),支持多维筛选、详情查看、失败重试与任务取消。从数据管理的"历史"按钮进入时,会自动携带该数据的 dataset_id 过滤,右上角标签可随时清除。
筛选条件:操作大类(文件上传 / 数据治理 / 数据清洗 / 数据分析 / 数据挖掘 / 特征工程 / 机器学习 / AI分析 / 账号管理)与具体操作二级联动;状态支持成功 / 失败 / 运行中 / 等待中 / 已取消;数据来源区分本地数据与远程数据库;时间范围支持今天 / 近7天 / 近30天 / 自定义日期时间范围;关键字可按数据集名称搜索。
列表信息:操作类型展示大类标签 + 操作子类(如"数据清洗 · 执行清洗"),远程任务带远程标记;操作对象本地显示数据集名/文件名,远程显示连接名/表名;状态以不同颜色标签区分;执行时间毫秒级格式化显示,创建/完成时间以上海时区展示。
任务详情:点击"详情"查看抽屉面板,包含基本信息(操作类型、操作对象、状态、耗时、时间)、操作参数(该任务的配置参数,过滤掉进度类字段,大字段自动折叠)、执行结果(清洗的变动详情、训练指标、预测结果等)、进度时间线(阶段 + 进度百分比 + 阶段消息)与错误信息(失败时展示错误信息与失败分类:参数错误 / 数据问题 / 系统故障 / 执行超时 / 网络错误 / 未知)。
重试与取消 :仅失败任务且支持重试时可点击重试(can_retry)。分类为"参数错误 / 数据问题"的任务不支持重试,需修改参数或数据后重新执行;"系统故障 / 超时 / 网络错误"可点击重试。运行中/等待中的任务可取消。
使用建议 :运行中的任务列表每 10 秒自动刷新 ,无需手动操作;排查失败任务先看失败分类,再决定是改参数重跑还是直接重试;大数据集(≥1 万行)的清洗/挖掘/建模均在此留痕,可随时回溯参数与结果。
5.6 AI 智能分析模块## 6. 关键技术实现
6.1 大表分析加速
针对大规模数据集的聚合分析,系统引入了 ClickHouse 作为分析加速层。上传或导入的本地数据集会自动同步副本到 ClickHouse,数据分析模块的统计、质量检测、图表绘制与图表推荐接口在数据行数达到最小阈值(默认 10000)时优先走 ClickHouse 加速路径;若 ClickHouse 查询超时或同步失败则自动降级到 pandas 本地计算,保证请求永不阻塞。这种"加速优先、降级兜底"的双轨策略,在享受列式存储聚合性能的同时,也规避了外部组件故障导致的单点风险。
ClickHouse 加速与降级的决策流程如下:
#mermaid-svg-t1TjyO2dCWpRMLS5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-t1TjyO2dCWpRMLS5 .error-icon{fill:#552222;}#mermaid-svg-t1TjyO2dCWpRMLS5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-t1TjyO2dCWpRMLS5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .marker.cross{stroke:#333333;}#mermaid-svg-t1TjyO2dCWpRMLS5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-t1TjyO2dCWpRMLS5 p{margin:0;}#mermaid-svg-t1TjyO2dCWpRMLS5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .cluster-label text{fill:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .cluster-label span{color:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .cluster-label span p{background-color:transparent;}#mermaid-svg-t1TjyO2dCWpRMLS5 .label text,#mermaid-svg-t1TjyO2dCWpRMLS5 span{fill:#333;color:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .node rect,#mermaid-svg-t1TjyO2dCWpRMLS5 .node circle,#mermaid-svg-t1TjyO2dCWpRMLS5 .node ellipse,#mermaid-svg-t1TjyO2dCWpRMLS5 .node polygon,#mermaid-svg-t1TjyO2dCWpRMLS5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .rough-node .label text,#mermaid-svg-t1TjyO2dCWpRMLS5 .node .label text,#mermaid-svg-t1TjyO2dCWpRMLS5 .image-shape .label,#mermaid-svg-t1TjyO2dCWpRMLS5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-t1TjyO2dCWpRMLS5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .rough-node .label,#mermaid-svg-t1TjyO2dCWpRMLS5 .node .label,#mermaid-svg-t1TjyO2dCWpRMLS5 .image-shape .label,#mermaid-svg-t1TjyO2dCWpRMLS5 .icon-shape .label{text-align:center;}#mermaid-svg-t1TjyO2dCWpRMLS5 .node.clickable{cursor:pointer;}#mermaid-svg-t1TjyO2dCWpRMLS5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .arrowheadPath{fill:#333333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t1TjyO2dCWpRMLS5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-t1TjyO2dCWpRMLS5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t1TjyO2dCWpRMLS5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-t1TjyO2dCWpRMLS5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .cluster text{fill:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 .cluster span{color:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-t1TjyO2dCWpRMLS5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-t1TjyO2dCWpRMLS5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-t1TjyO2dCWpRMLS5 .icon-shape,#mermaid-svg-t1TjyO2dCWpRMLS5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t1TjyO2dCWpRMLS5 .icon-shape p,#mermaid-svg-t1TjyO2dCWpRMLS5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-t1TjyO2dCWpRMLS5 .icon-shape .label rect,#mermaid-svg-t1TjyO2dCWpRMLS5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t1TjyO2dCWpRMLS5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-t1TjyO2dCWpRMLS5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-t1TjyO2dCWpRMLS5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
本地数据集上传/导入
同步副本至 ClickHouse
发起聚合分析请求
行数 ≥ CLICKHOUSE_MIN_ROWS?
直接 pandas 本地计算
ClickHouse 聚合查询
查询超时或不可用?
返回 ClickHouse 结果
返回最终结果
6.2 缓存降级机制
缓存层实现了 Redis 与内存缓存的双轨降级:Redis 可用时缓存数据集列表等高频查询结果并设置 TTL;Redis 不可用时自动降级到进程内内存缓存,保证基本功能可用。缓存键统一携带用户 ID,确保降级场景下也不会产生跨用户数据泄漏。
6.3 任务记录留痕
任务记录贯穿所有用户操作与管理员操作,是平台可审计性的基础。任务标签通过统一的映射引擎将模块标识、任务类型转换为中文标签,前端展示与后端存储解耦。管理员执行的恢复、永久删除、重置密码、解锁账号等操作同样写入任务记录,实现管理行为可追溯。
7. 系统测试
7.1 测试内容
系统测试覆盖功能测试、接口测试与构建验证三个层面:
- 功能测试:覆盖用户注册登录、数据上传清洗、各模块分析流程、远程数据源连接、AI 对话、管理后台核心操作等主流程。
- 接口测试:对 171 条 API 路由逐一验证请求参数、鉴权逻辑与响应结果,重点验证用户数据隔离与异常处理。
- 构建验证 :后端 19 个 Python 文件通过
py_compile编译检查;前端用户端与管理端均通过vite build构建,退出码为 0。
8. 一键部署与快速开始
项目源码已托管在 GitHub:Data-Insight-Platform。系统通过 Docker Compose 统一编排七大服务,并提供一键启动脚本,便于快速复现和验收。
8.1 环境准备
本地需安装 Docker Desktop(Windows)或 Docker + Docker Compose(Linux/macOS)。
8.2 Windows 一键启动
在项目根目录执行:
powershell
.\start.ps1
若在 CMD(命令提示符)中运行 PowerShell 脚本,可使用:
cmd
powershell -ExecutionPolicy Bypass -File start.ps1
脚本会自动完成环境检查、端口检测、模板配置生成(随机生成密码与密钥,已有配置不覆盖),并以开发模式启动全部服务。
生产模式或强制重新生成配置:
powershell
.\start.ps1 -Mode prod
.\start.ps1 -Force
8.3 Linux/macOS 启动
bash
cp docker-compose.example.yml docker-compose.yml
cd backend && cp .env.example .env && cd ..
docker compose --profile dev up -d --build
8.4 访问地址
| 模式 | 用户端 | 管理后台 | API 文档 |
|---|---|---|---|
| 开发(dev) | http://localhost:5173 | http://localhost:5174/ | http://localhost:8000/docs |
| 生产(prod) | http://localhost | http://localhost/admin.html | http://localhost:8000/docs |
管理后台初始账号会在 start.ps1 执行结束时输出,或从 backend/.env 中的 ADMIN_USERNAME、ADMIN_PASSWORD 查看。
8.5 可选:配置 AI 分析
如需启用 AI 分析,在 backend/.env 中配置 OpenAI 兼容接口参数:
dotenv
OPENAI_API_KEY=sk-xxxxxxxx
OPENAI_API_BASE=https://api.deepseek.com/v1
OPENAI_MODEL=deepseek-chat
配置完成后重启后端容器:
powershell
docker compose --profile dev restart backend
8.6 停止服务
powershell
docker compose --profile dev down # 开发模式
docker compose --profile prod down # 生产模式
9. 项目截图
用户端












管理端












10. 总结与展望
Data Insight Platform 以"低门槛、全链路、可追溯"为核心理念,打通了从数据上传、清洗、分析、挖掘到机器学习的一站式流程。平台的核心创新体现在:通过五大模块实现低门槛可视化分析;借助 parent_id 与 root_dataset_id 构建全链路血缘追溯;基于数据规模和用户并发的智能任务分发机制;引入 ClickHouse 加速大表分析并支持降级;扩展远程数据源接入实现 SQL 聚合下推。这些设计有效提升了系统的易用性、可追溯性与性能。
未来平台可进一步扩展更多数据挖掘与机器学习算法,支持多租户隔离与权限体系,并引入 Flink 等实时流处理能力,向实时数据分析方向演进。
如需要项目请私信,可以帮助配置和启动