# AI智能数据分析中台 **Repository Path**: akatini/ai-data-analytics-platform ## Basic Information - **Project Name**: AI智能数据分析中台 - **Description**: AI 驱动的数据分析中台:自然语言问数 → 自动生成 SQL → 只读执行 → 可视化(柱/折/饼)。配套 CSV 导入自动建表(ETL)、查询收藏与图表画布、菜单级 RBAC。技术栈:Spring Boot 3 + Vue 3 + MySQL 8 + Redis 7 + DeepSeek API。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-08-21 - **Last Updated**: 2026-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI 数据中台 > **DEMO 版本** · AI 驱动的数据分析平台:自然语言问数 → 自动生成 SQL → 执行 → 可视化,另含 CSV 数据导入与基于菜单的 RBAC 权限控制。 --- ## 功能 | 模块 | 说明 | | --- | --- | | **AI 问答** | 自然语言提问 → SSE 流式返回 SQL → 可编辑 → 一键执行(只读 SELECT,带安全校验)→ 结果表格 / 导出 CSV / 收藏 | | **我的查询** | 管理收藏的 SQL:手动新建(对话框直接录 SQL)、按名搜索、改名、删除、重跑、导出;执行结果带 Redis 缓存 | | **查询画布** | 基于已保存 SQL 生成图表(柱 BAR / 折 LINE / 饼 PIE 三种),支持画布列表缩略图、详情预览、星标 / 复制 / 删除 | | **数据导入** | 管理员把 CSV 上传自动建表、或用表单 / SQL 自定义建表;元数据登记后 AI 问答立即可见 | | **系统管理** | 用户 / 角色管理:角色绑定「菜单 + 按钮」权限树(type 1 目录 / 2 菜单 / 3 按钮),按钮级权限控制 | --- ## 界面预览 > 截图来自本地测试环境。业务数据由 `data-generator` 生成(约 25 万行,带季节性 / 周末 / 大促峰值等业务规律),因此能直接跑出有真实感的查询结果。 ### 登录 ![登录页](docs/images/login.png) ### AI 问答 自然语言提问 → AI 流式生成 SQL(可编辑)→ 一键执行 → 结果表格 / 导出 CSV: ![AI 问答](docs/images/ai-chat.png) ### 查询管理 收藏 AI 生成的 SQL,或点「新建查询」在对话框里直接录入 SQL;支持按名搜索、改名、再执行、导出: ![查询管理](docs/images/saved-query.png) ### 查询画布 从已保存 SQL 生成柱 / 折 / 饼图:列表页以缩略图网格浏览,点开即看详情大图: ![查询画布 · 列表](docs/images/canvas-list.png) ![查询画布 · 详情](docs/images/canvas-detail.png) ### 数据导入 CSV 上传 → 自动建表 → 写入仓库,表元数据与行数在列表中实时可见: ![数据导入 · 表列表](docs/images/etl-list.png) ![数据导入 · CSV 上传](docs/images/etl-import-data.png) ### 系统管理 用户 / 角色管理,角色通过「菜单 + 按钮」权限树实现按钮级权限控制: ![系统管理](docs/images/rbac.png) --- ## 快速开始 ### 0. 依赖 - Docker(MySQL 8.0 / Redis 7 容器) - JDK 17+ 与 Maven(后端) - Node.js 18+(前端) ### 1. 启动基础设施(MySQL + Redis) ```bash cd docker docker compose up -d mysql redis ``` > ⚠️ **首次启动自动执行初始化 SQL**(挂载自 `docker/mysql/init/`): > - `01-sys-init.sql`:建全部 `sys_*` 表(RBAC 5 张 + AI 会话/消息 2 张 + 我的查询/画布 2 张 + ETL 元数据 1 张)+ seed(admin 账号、3 个角色、菜单与权限、角色-菜单绑定) > - `02-mock_business.sql`:建 6 张 mock 业务表(`ods_*`,空表)并在 `sys_etl_table` 登记元数据 > > 跳过这一步直接启后端会导致登录失败(admin 用户不存在)。重新初始化可清空 `docker/mysql/data` 或用 `scripts/db-reset.sh`(仅重置 `sys_*`)。 ### 2. 生成业务数据(可选但推荐) 默认账号 `admin` 登录后,AI 问答要能查到数据,先跑数据生成器(连接 `analytics_warehouse`,约生成 25 万行): ```bash cd data-generator mvn -q package -DskipTests java -jar target/data-generator-1.0.0-SNAPSHOT.jar ``` ### 3. 启动后端 ```bash cd backend mvn spring-boot:run -pl analytics-web ``` - 监听 `http://localhost:8080` - 数据库 / Redis 连接在 `backend/analytics-web/src/main/resources/application.yml`(公共默认),本地覆盖放 `application-dev.yml`(已 gitignore) - **AI 问答需要 LLM Key**:在 `application-dev.yml` 配置 `akatini.llm.openai.api-key`(默认 `deepseek-chat`);没配 Key 时仅 AI 问答不可用,其余功能不受影响 ### 4. 启动前端 本地开发(Vite Dev Server,`/api` 已代理到 8080): ```bash cd frontend npm install npm run dev ``` 打开 `http://localhost:5173`。 生产 / Nginx 托管(可选):`npm run build` 产出 `frontend/dist`,再 `cd docker && docker compose up -d nginx`,访问 `http://localhost`(Nginx 托管静态页并把 `/api/*` 反代到宿主机 8080,SSE 已关闭缓冲)。 --- ## 默认账号与角色 | 用户名 | 密码 | 角色 | 可见功能 | | --- | --- | --- | --- | | `admin` | `admin123` | 超级管理员 | 全部(AI 问答 / 我的查询 / 数据导入 / 系统管理) | | — | — | 数据分析师(`analyst`) | AI 问答 + 我的查询(查询管理 / 查询画布) | - 角色 `viewer` 为预置模板,未挂载任何菜单,未启用 - `analyst` / `viewer` 无默认账号:由 `admin` 在「系统管理 → 用户管理」创建并绑定角色 --- ## 系统架构 ```mermaid graph LR Browser -->|HTTP :80| Nginx[Nginx 容器] Nginx -->|"/ 静态托管"| Dist[frontend/dist] Nginx -->|"/api/* 反代 + SSE 实时转发"| Backend[Spring Boot :8080] Backend -->|JDBC| MySQL[(MySQL 8.0)] Backend -->|Lettuce| Redis[(Redis 7)] Backend -->|SSE 流式| LLM[DeepSeek API] ``` - 单库模式:`sys_*` 系统表(AI 不可访问)与 `ods_*` 业务表(AI 只读)共存于 `analytics_warehouse` - `sys_etl_table` 是业务表元数据的唯一权威源(列结构 / 行数 / 来源类型),AI 的 schema 自省从这里读取 - 业务表数据两来源:`data-generator` 生成的 mock 数据、管理员通过「数据导入」装载的 CSV - 说明:当前后端跑在宿主机 8080(未容器化),Nginx 容器经 `host.docker.internal` 访问;后端 Docker 镜像与 CI/CD 未落地(DEMO 边界) --- ## AI 问答典型流程 ```mermaid sequenceDiagram actor User as 用户 participant Chat as AI 问答页 participant API as Spring Boot participant LLM as DeepSeek User->>Chat: 输入"最近 30 天销售前 5 的商品" Chat->>API: POST /api/chat/conversations (建会话,先返回 convId) Chat->>API: POST /api/chat/conversations/{id}/messages/stream API->>LLM: 流式请求(prompt 内含业务 schema) LLM-->>API: SSE chunks(增量文本) API-->>Chat: 逐 chunk 推送 → SQL 编辑框实时填充 User->>Chat: 在 SQL 编辑框中调整(可选)→ 点"执行" Chat->>API: POST /api/ai/sql/execute(只读校验 + Redis 缓存) API-->>Chat: SqlExecuteResultVO(列 + 行) User->>Chat: 点"保存到我的查询" → 进入查询管理 ``` --- ## 目录结构 ``` ai-data-analytics-platform/ ├── backend/ # Spring Boot 3.3.5 多模块工程(8 模块,Java 17) │ ├── analytics-common/ # Result / ErrorCode / BizException / 常量 │ ├── analytics-domain/ # Entity / DTO / VO / 枚举 │ ├── analytics-dao/ # MyBatis-Plus Mapper + XML │ ├── analytics-infrastructure/ # Sa-Token 集成 / Redis / CurrentUser 封装 │ ├── analytics-ai/ # LLM Provider(OpenAI 兼容 / Anthropic)+ SQL 安全校验 + JDBC 执行器 │ ├── analytics-etl/ # Schema 自省 / CSV 解析 / ETL 校验 │ ├── analytics-service/ # 业务服务(auth / chat / saved-query / canvas / etl / system) │ └── analytics-web/ # Controller / 配置 / 启动入口(:8080) ├── frontend/ # Vue 3 + TypeScript + Vite │ └── src/ │ ├── views/ # login / chat / saved-query(+canvas) / etl / system / profile │ ├── components/ # SqlBlock / ResultTable 等公共组件 │ ├── stores/ # Pinia(auth / chat / layout) │ └── api/ · router/ · types/ · assets/ 等 ├── docker/ # docker-compose(mysql / redis / nginx)+ mysql/init 初始化 SQL ├── data-generator/ # 独立 Maven 工程:带业务规律的 mock 数据生成器 ├── docs/ # 架构 / 设计文档 + images/ 界面截图 └── scripts/ # db-reset.sh 等运维脚本 ``` --- ## 技术栈 | 层 | 技术 | | --- | --- | | 前端 | Vue 3.5 · TypeScript · Vite 8 · Pinia 2.3 · Vue Router 4.6 · Element Plus 2.14 · ECharts 5.6 + vue-echarts 7 · Axios | | 后端 | Spring Boot 3.3.5(Java 17)· MyBatis-Plus 3.5.9 · Sa-Token 1.39.0(Redis 存储)· Hutool 5.8 · jBCrypt | | 数据 | MySQL 8.0(utf8mb4)· Redis 7 | | AI | DeepSeek(OpenAI 兼容接口,SSE 流式;Provider 支持 OpenAI 兼容 / Anthropic 切换) |