中国海洋水质数据可视化分析系统 --- 技术文档
1 系统概述
本系统基于 Django + Vue 技术栈构建,面向中国海洋水质监测数据,提供数据管理、统计分析、机器学习建模、异常检测、聚类分析、时间序列预测、同比环比对比、地理可视化、知识爬取与报告导出等一体化分析能力。
1.1 技术架构
| 层次 | 技术 | 版本 |
|---|---|---|
| 前端框架 | Vue 3 + TypeScript | 3.x |
| UI 组件库 | Element Plus | --- |
| 图表库 | ECharts | 5.x |
| 地图 | 高德地图 AMAP | --- |
| HTTP 客户端 | Axios | --- |
| 后端框架 | Django | 4.x |
| 数据库 | MySQL | 5.7+ |
| 数据处理 | Pandas / NumPy | --- |
| 机器学习 | Scikit-learn | --- |
| 统计检验 | SciPy | --- |
| 报告导出 | ReportLab / OpenPyXL | --- |
| 爬虫 | Requests + BeautifulSoup | --- |
1.2 系统架构图
┌─────────────────────────────────────────────────┐
│ 浏览器 │
│ Vue 3 SPA + Element Plus + ECharts + AMAP │
└────────────────────┬────────────────────────────┘
│ Axios (REST API)
▼
┌─────────────────────────────────────────────────┐
│ Django 后端 (端口 8000) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ users │ │ core │ │ analytics│ │
│ │ (认证) │ │ (数据管理)│ │ (分析页) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌─────────────────────────┐ │
│ │ shared/ 核心模块 │ │
│ │ analysis stats reg │ │
│ │ anomaly cluster ts │ │
│ │ comparative report │ │
│ │ crawler predictor │ │
│ └──────────┬──────────────┘ │
└────────────────────┼────────────────────────────┘
│ ORM
▼
┌──────────────┐
│ MySQL │
│ design_150_ │
│water_quality │
└──────────────┘
2 项目结构
code/
├── backend/ # Django 后端
│ ├── config.yaml # 项目配置(所有可变参数)
│ ├── database.py # 数据库连接与 ORM 初始化
│ ├── run.py # 启动入口
│ ├── requirements.txt # Python 依赖
│ ├── config/ # Django 项目配置
│ │ ├── settings.py
│ │ ├── urls.py # 根路由
│ │ └── wsgi.py
│ ├── apps/
│ │ ├── users/ # 用户认证模块
│ │ │ ├── views.py # 登录/注册/信息
│ │ │ ├── urls.py
│ │ │ └── models.py
│ │ ├── core/ # 核心数据管理模块
│ │ │ ├── views.py # CRUD / 导入导出 / 仪表盘
│ │ │ ├── urls.py
│ │ │ └── models.py
│ │ └── analytics/ # 分析页模块
│ │ ├── views.py # 各分析页路由转发
│ │ └── urls.py
│ └── shared/ # 核心算法模块(不修改,直接调用)
│ ├── analysis_core.py # 数据分析
│ ├── predictor_core.py # ML 训练/预测/评估
│ ├── crawler_core.py # 知识爬虫
│ ├── stats_core.py # 统计检验
│ ├── regression_core.py # 回归分析
│ ├── anomaly_core.py # 异常检测
│ ├── comparative_core.py # 同比环比
│ ├── clustering_core.py # 聚类分析
│ ├── timeseries_core.py # 时间序列
│ └── report_core.py # 报告导出
│
├── frontend/ # Vue 3 前端
│ ├── package.json
│ ├── vite.config.ts
│ ├── tsconfig.json
│ └── src/
│ ├── main.ts # 入口
│ ├── App.vue
│ ├── router/index.ts # 路由配置
│ ├── stores/ # Pinia 状态管理
│ │ └── user.ts
│ ├── api/index.ts # Axios 封装 & API 定义
│ ├── utils/request.ts # 请求拦截器
│ ├── views/ # 页面组件
│ │ ├── Login.vue
│ │ ├── Register.vue
│ │ ├── Layout.vue
│ │ ├── Dashboard.vue
│ │ ├── DataManage.vue
│ │ ├── StatisticalAnalysis.vue
│ │ ├── Regression.vue
│ │ ├── AnomalyDetection.vue
│ │ ├── Comparative.vue
│ │ ├── Clustering.vue
│ │ ├── TimeSeries.vue
│ │ ├── ReportExport.vue
│ │ ├── GeoMap.vue
│ │ └── Knowledge.vue
│ └── assets/ # 静态资源
│
└── data/
└── 水质数据.csv # 原始数据集





































3 数据模型
3.1 数据集特征
| 字段名 | 中文名 | 类型 | 说明 |
|---|---|---|---|
| pH | pH值 | numeric | 海水酸碱度 (0--14) |
| 溶解氧 | 溶解氧 | numeric | 水中溶解氧含量 (mg/L) |
| 化学需氧量 | 化学需氧量 | numeric | COD (mg/L) |
| 无机氮 | 无机氮 | numeric | 无机氮含量 (mg/L) |
| 活性磷酸盐 | 活性磷酸盐 | numeric | 活性磷酸盐含量 (mg/L) |
| 石油类 | 石油类 | numeric | 石油类污染物 (mg/L) |
| 海区 | 海区 | categorical | 渤海/黄海/东海/南海 |
| 省份 | 省份 | categorical | 沿海省份 |
| 地市 | 地市 | categorical | 沿海地市 |
| 监测时间 | 监测时间 | text | 采样时间 |
| 水质类别 | 水质类别 | categorical | Ⅰ/Ⅱ/Ⅲ/Ⅳ/劣Ⅳ |
| 实测经度 | 实测经度 | numeric | 采样点经度 |
| 实测纬度 | 实测纬度 | numeric | 采样点纬度 |
3.2 用户模型
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 主键 |
| username | varchar | 用户名 |
| password | varchar | 哈希密码 |
| role | enum | user / admin |
| create_time | datetime | 创建时间 |
4 后端 API 接口
4.1 认证模块 (/api/users/)
| 方法 | 路径 | 说明 | 权限 |
|---|---|---|---|
| POST | /api/users/login/ |
用户登录 | 公开 |
| POST | /api/users/register/ |
用户注册 | 公开 |
| GET | /api/users/info/ |
获取当前用户信息 | 登录 |
| PUT | /api/users/info/ |
更新用户信息 | 登录 |
登录请求示例:
json
{
"username": "admin",
"password": "123456"
}
登录响应示例:
json
{
"code": 200,
"msg": "登录成功",
"data": {
"token": "xxx",
"role": "admin",
"username": "admin"
}
}
4.2 数据管理模块 (/api/core/)
| 方法 | 路径 | 说明 | 权限 |
|---|---|---|---|
| GET | /api/core/data/ |
分页查询水质数据 | 登录 |
| POST | /api/core/data/ |
新增数据 | admin |
| PUT | /api/core/data/<id>/ |
修改数据 | admin |
| DELETE | /api/core/data/<id>/ |
删除数据 | admin |
| POST | /api/core/import/ |
CSV 批量导入 | admin |
| GET | /api/core/export/ |
导出数据 | 登录 |
| GET | /api/core/dashboard/ |
仪表盘统计 | 登录 |
4.3 分析模块 (/api/analytics/)
| 方法 | 路径 | 说明 | 权限 |
|---|---|---|---|
| POST | /api/analytics/statistical/ |
统计分析 | 登录 |
| POST | /api/analytics/regression/ |
回归分析 | 登录 |
| POST | /api/analytics/anomaly/ |
异常检测 | 登录 |
| POST | /api/analytics/comparative/ |
同比环比分析 | 登录 |
| POST | /api/analytics/clustering/ |
聚类分析 | 登录 |
| POST | /api/analytics/timeseries/ |
时间序列预测 | 登录 |
| POST | /api/analytics/predict/ |
ML 预测 | 登录 |
| GET | /api/analytics/geo/ |
地理分布数据 | 登录 |
| GET | /api/analytics/knowledge/ |
知识爬取 | 登录 |
| POST | /api/analytics/report/ |
报告导出 | 登录 |
5 核心算法模块 (shared/)
5.1 analysis_core.py --- 数据分析
提供水质数据的基础统计分析能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
descriptive_stats(df, columns) |
描述性统计 | DataFrame, 列名列表 | 均值/中位数/标准差/分位数 |
distribution_analysis(df, column) |
分布分析 | DataFrame, 列名 | 直方图数据+正态性检验 |
correlation_analysis(df, columns) |
相关性分析 | DataFrame, 列名列表 | 相关系数矩阵 |
group_comparison(df, group_col, value_col) |
分组对比 | DataFrame, 分组列, 数值列 | 各组统计量 |
5.2 stats_core.py --- 统计检验
提供统计假设检验能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
t_test(sample1, sample2) |
独立样本 t 检验 | 两组数据 | t 值, p 值 |
anova_test(groups) |
单因素方差分析 | 多组数据 | F 值, p 值 |
chi_square_test(observed) |
卡方检验 | 观测频数表 | χ² 值, p 值 |
normality_test(data) |
正态性检验 (Shapiro-Wilk) | 样本数据 | W 值, p 值 |
mann_whitney_u(sample1, sample2) |
Mann-Whitney U 检验 | 两组数据 | U 值, p 值 |
5.3 regression_core.py --- 回归分析
提供多种回归建模能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
linear_regression(X, y) |
线性回归 | 特征矩阵, 目标变量 | 系数, R², 预测值 |
polynomial_regression(X, y, degree) |
多项式回归 | 特征, 目标, 阶数 | 系数, R², 预测值 |
ridge_regression(X, y, alpha) |
岭回归 | 特征, 目标, 正则化系数 | 系数, R² |
lasso_regression(X, y, alpha) |
Lasso 回归 | 特征, 目标, 正则化系数 | 系数, R² |
evaluate_model(y_true, y_pred) |
模型评估 | 真实值, 预测值 | MSE, RMSE, MAE, R² |
5.4 anomaly_core.py --- 异常检测
提供基于多种策略的异常值识别能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
zscore_detection(df, column, threshold) |
Z-Score 异常检测 | 数据, 列名, 阈值 | 异常值索引及分数 |
iqr_detection(df, column, factor) |
IQR 异常检测 | 数据, 列名, 倍数 | 异常值索引 |
isolation_forest(df, columns, contamination) |
孤立森林检测 | 数据, 列名列表, 污染比例 | 异常标签及分数 |
dbscan_detection(df, columns, eps, min_samples) |
DBSCAN 密度检测 | 数据, 列名列表, 半径, 最小样本 | 噪声点标签 |
5.5 clustering_core.py --- 聚类分析
提供无监督聚类能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
kmeans(X, n_clusters) |
K-Means 聚类 | 特征矩阵, 簇数 | 标签, 质心, 惯性 |
hierarchical_clustering(X, n_clusters) |
层次聚类 | 特征矩阵, 簇数 | 标签, 树状图数据 |
dbscan_clustering(X, eps, min_samples) |
DBSCAN 聚类 | 特征矩阵, 半径, 最小样本 | 标签, 核心样本索引 |
evaluate_clustering(X, labels) |
聚类评估 | 特征矩阵, 标签 | 轮廓系数, CH 指数 |
elbow_method(X, max_k) |
肘部法则 | 特征矩阵, 最大簇数 | 各 K 值对应的惯性 |
5.6 timeseries_core.py --- 时间序列
提供时间序列分析与预测能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
decompose(df, column, period) |
时序分解 | 数据, 列名, 周期 | 趋势/季节/残差 |
moving_average(df, column, window) |
移动平均 | 数据, 列名, 窗口 | 平滑序列 |
arima_forecast(df, column, order, steps) |
ARIMA 预测 | 数据, 列名, 阶数, 步数 | 预测值, 置信区间 |
seasonal_analysis(df, column) |
季节性分析 | 数据, 列名 | 季节指数 |
5.7 comparative_core.py --- 同比环比
提供时间维度的对比分析能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
yoy_analysis(df, column, time_col) |
同比分析 | 数据, 列名, 时间列 | 各期同比变化率 |
mom_analysis(df, column, time_col) |
环比分析 | 数据, 列名, 时间列 | 各期环比变化率 |
period_comparison(df, column, time_col, period1, period2) |
自定义时段对比 | 数据, 列名, 时间列, 两时段 | 差异及变化率 |
5.8 predictor_core.py --- ML 训练/预测/评估
提供完整的机器学习建模流水线。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
train_model(X, y, model_type, params) |
训练模型 | 特征, 标签, 模型类型, 参数 | 训练好的模型 |
predict(model, X) |
预测 | 模型, 特征 | 预测结果 |
evaluate(model, X, y) |
评估模型 | 模型, 特征, 标签 | 评估指标 |
cross_validate(X, y, model_type, cv) |
交叉验证 | 特征, 标签, 模型类型, 折数 | 各折得分 |
支持的模型类型:
random_forest--- 随机森林svm--- 支持向量机knn--- K 近邻decision_tree--- 决策树logistic_regression--- 逻辑回归gradient_boosting--- 梯度提升
5.9 crawler_core.py --- 知识爬虫
提供水质相关知识内容的爬取能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
crawl(keyword, max_results) |
爬取知识 | 关键词, 最大结果数 | 标题/摘要/来源列表 |
parse_content(url) |
解析页面内容 | URL | 正文文本 |
5.10 report_core.py --- 报告导出
提供分析结果的多格式导出能力。
| 函数 | 说明 | 参数 | 返回 |
|---|---|---|---|
generate_pdf(data, template) |
生成 PDF 报告 | 数据, 模板 | PDF 文件流 |
generate_excel(data, sheets) |
生成 Excel 报告 | 数据, 工作表配置 | Excel 文件流 |
generate_word(data, template) |
生成 Word 报告 | 数据, 模板 | Word 文件流 |
6 前端页面说明
6.1 页面路由
| 路径 | 组件 | 说明 | 权限 |
|---|---|---|---|
/login |
Login.vue | 登录页 | 公开 |
/register |
Register.vue | 注册页 | 公开 |
/ |
Layout.vue | 主布局 | 登录 |
/dashboard |
Dashboard.vue | 数据仪表盘 | 登录 |
/data-manage |
DataManage.vue | 数据管理 | 登录 |
/statistical-analysis |
StatisticalAnalysis.vue | 统计分析 | 登录 |
/regression |
Regression.vue | 回归分析 | 登录 |
/anomaly-detection |
AnomalyDetection.vue | 异常检测 | 登录 |
/comparative |
Comparative.vue | 同比环比 | 登录 |
/clustering |
Clustering.vue | 聚类分析 | 登录 |
/timeseries |
TimeSeries.vue | 时间序列 | 登录 |
/report-export |
ReportExport.vue | 报告导出 | 登录 |
/geo-map |
GeoMap.vue | 地理可视化 | 登录 |
/knowledge |
Knowledge.vue | 知识库 | 登录 |
6.2 页面功能详解
Dashboard(仪表盘)
- 水质类别分布饼图
- 各海区监测站点数柱状图
- 关键指标趋势折线图
- 数据概览统计卡片(总记录数、监测站点数、最新监测时间)
DataManage(数据管理)
- 水质数据表格(分页、排序、筛选)
- 新增/编辑/删除数据行(admin 权限)
- CSV 批量导入
- 数据导出
StatisticalAnalysis(统计分析)
- 描述性统计:均值、中位数、标准差、四分位数
- 相关性热力图
- 分组统计(按海区/省份/水质类别)
- 正态性检验与分布直方图
Regression(回归分析)
- 线性/多项式/岭/Lasso 回归模型选择
- 特征选择与目标变量配置
- 回归拟合图与残差图
- 模型评估指标(R²、MSE、RMSE、MAE)
AnomalyDetection(异常检测)
- Z-Score / IQR / 孤立森林 / DBSCAN 四种检测方法
- 异常值散点图标注
- 异常数据列表与导出
- 阈值参数可调
Comparative(同比环比)
- 按年/季/月维度对比
- 同比变化率与环比变化率图表
- 自定义时段对比
- 变化率热力图
Clustering(聚类分析)
- K-Means / 层次聚类 / DBSCAN 三种方法
- 肘部法则自动推荐簇数
- 聚类散点图与雷达图
- 轮廓系数评估
TimeSeries(时间序列)
- 时序分解(趋势/季节/残差)
- ARIMA 预测及置信区间
- 移动平均平滑
- 季节性分析图
GeoMap(地理可视化)
- 高德地图底图上标注监测站点
- 按水质类别着色标记
- 站点详情弹窗(各指标值)
- 海区边界展示
Knowledge(知识库)
- 输入关键词爬取海洋水质相关知识
- 知识列表与全文检索
- 来源链接追溯
ReportExport(报告导出)
- 选择分析模块与时间范围
- PDF / Excel / Word 三种导出格式
- 图表嵌入报告
7 配置说明 (config.yaml)
项目所有可变参数集中在 backend/config.yaml,新增分析页只需在 analysis_pages 添加配置即可。
配置结构
yaml
# 数据库配置
database:
engine: django.db.backends.mysql
name: design_150_water_quality
host: 127.0.0.1
port: 3306
user: root
password: ""
# 服务器配置
server:
port: 8000
# 数据集配置
dataset:
path: data/水质数据.csv
target_col: null # 分析型项目,无目标列
features:
- name: pH
type: numeric
- name: 溶解氧
type: numeric
- name: 化学需氧量
type: numeric
- name: 无机氮
type: numeric
- name: 活性磷酸盐
type: numeric
- name: 石油类
type: numeric
- name: 海区
type: categorical
- name: 省份
type: categorical
- name: 地市
type: categorical
- name: 监测时间
type: text
- name: 水质类别
type: categorical
- name: 实测经度
type: numeric
- name: 实测纬度
type: numeric
# 角色体系
roles:
- user
- admin
# 已启用模块
modules:
- auth
- analytics
- data_manage
- dashboard
- statistical_analysis
- regression
- anomaly_detection
- comparative
- clustering
- timeseries
- report_export
- geo_map
- knowledge
# 分析页配置(新增分析页只需在此添加)
analysis_pages:
- key: statistical_analysis
name: 统计分析
module: statistical_analysis
- key: regression
name: 回归分析
module: regression
- key: anomaly_detection
name: 异常检测
module: anomaly_detection
- key: comparative
name: 同比环比
module: comparative
- key: clustering
name: 聚类分析
module: clustering
- key: timeseries
name: 时间序列
module: timeseries
8 部署指南
8.1 环境要求
- Python 3.9+
- Node.js 16+
- MySQL 5.7+
- npm 或 yarn
8.2 后端部署
bash
# 1. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 2. 安装依赖
cd backend
pip install -r requirements.txt
# 3. 配置数据库
# 修改 config.yaml 中 database 配置项
# 创建 MySQL 数据库
mysql -u root -p -e "CREATE DATABASE design_150_water_quality DEFAULT CHARACTER SET utf8mb4;"
# 4. 执行迁移
python manage.py makemigrations
python manage.py migrate
# 5. 导入初始数据
python manage.py import_data data/水质数据.csv
# 6. 创建超级用户
python manage.py createsuperuser
# 7. 启动服务
python run.py
# 服务运行在 http://127.0.0.1:8000
8.3 前端部署
bash
# 1. 安装依赖
cd frontend
npm install
# 2. 开发模式启动
npm run dev
# 3. 生产构建
npm run build
# 构建产物在 dist/ 目录,由 Django 的 static 配置托管
8.4 生产部署建议
bash
# 使用 Gunicorn 作为 WSGI 服务器
pip install gunicorn
gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 4
# Nginx 反向代理配置示例
server {
listen 80;
server_name your-domain.com;
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
root /path/to/frontend/dist;
try_files $uri $uri/ /index.html;
}
location /static/ {
alias /path/to/backend/static/;
}
}
9 开发规范
9.1 新增分析页
只需两步:
- 在
config.yaml的analysis_pages添加配置项 - 在
frontend/src/views/创建对应 Vue 组件并注册路由
后端路由由 analytics/views.py 统一转发到 shared/ 核心模块,无需新增 Django view。
9.2 调用核心模块
python
# views.py 中调用示例
from shared.stats_core import t_test, anova_test
def statistical_view(request):
df = get_dataframe()
result = t_test(df['pH'], df['溶解氧'])
return JsonResponse(result)
9.3 编码规范
- 禁止蓝紫渐变配色:使用单一主题色同色系调色板
- 禁止 N+1 查询:列表页使用 JOIN 或批量查询,分页在 SQL 层 LIMIT/OFFSET
- 代码复用:3 处以上相似代码必须重构为可复用单元
- CSS 变量:使用 CSS 变量和复用 class,不写多份相同样式
- 核心模块不修改 :业务逻辑调用
shared/核心模块,Web 层只做路由转发和模板渲染
10 安全设计
| 安全措施 | 说明 |
|---|---|
| JWT 认证 | 基于令牌的无状态认证 |
| 角色权限 | user / admin 二级角色体系 |
| CORS 配置 | 跨域请求白名单 |
| SQL 注入防护 | Django ORM 参数化查询 |
| XSS 防护 | Vue 模板自动转义 + 后端输入校验 |
| CSRF 防护 | Django 中间件默认启用 |
| 密码存储 | bcrypt/PBKDF2 哈希 |
11 数据流
用户操作 (Vue)
│
├─ 选择分析参数 ──→ Axios POST ──→ Django View
│ │
│ ├─ 参数校验
│ ├─ 读取数据 (ORM)
│ ├─ 调用 shared/ 核心模块
│ └─ 返回 JSON 结果
│ │
│◄──────────────── JSON Response ◄─────────────┘
│
└─ ECharts / AMAP 渲染图表
12 关键依赖版本
Python 依赖 (requirements.txt)
Django>=4.0
mysqlclient>=2.1
pandas>=1.5
numpy>=1.23
scikit-learn>=1.2
scipy>=1.10
reportlab>=3.6
openpyxl>=3.0
requests>=2.28
beautifulsoup4>=4.11
前端依赖 (package.json)
vue: ^3.3
vue-router: ^4.2
pinia: ^2.1
element-plus: ^2.4
echarts: ^5.4
axios: ^1.6
typescript: ^5.0
vite: ^5.0
13 常见问题
Q: 数据库连接失败?
确认 MySQL 服务已启动,config.yaml 中数据库配置正确,且 design_150_water_quality 库已创建。
Q: 前端页面空白?
确认后端服务在 8000 端口运行,前端 vite.config.ts 中代理配置指向 http://127.0.0.1:8000。
Q: 地图不显示?
高德地图需要 API Key,在 GeoMap.vue 中替换为你自己的 Key。
Q: 新增分析页后前端路由不生效?
确认 router/index.ts 已添加对应路由,且组件路径正确。