跳到主要内容基于 Python 的保险行业数据可视化分析系统 | 极客日志PythonAI大前端算法
基于 Python 的保险行业数据可视化分析系统
综述由AI生成档详细阐述了基于 Flask 和 Vue 3 的保险行业数据可视化分析系统的技术架构与实现细节。系统涵盖客户画像、产品分析、地域分布、聚类分析、时间序列预测及关联规则挖掘等 13 个核心功能模块。后端采用 Python 技术栈处理数据分析,前端利用 ECharts 实现地图下钻与图表展示。支持 JWT 认证、权限管理及 Excel/PDF 报告导出。数据库设计包含用户管理与业务数据存储,整体采用前后端分离架构,确保高可用性与可扩展性。
墨染流年5.4K 浏览 保险行业数据可视化分析系统 — 技术文档
1. 项目概述
1.1 基本信息
| 项目属性 | 值 |
|---|
| 项目编号 | 313 |
| 项目名称 | 保险行业数据可视化分析系统 |
| 项目类型 | 分析型(无预测目标列) |
| 技术栈 | Flask + Vue 3(前后端分离) |
| 数据规模 | 30,000 行 × 30 列 |
| 后端端口 | 8000 |
| 前端端口 | 5173 |
| 数据库 | MySQL 8.0(design_313_insurance) |
| 管理员账号 | admin / admin123 |
1.2 系统功能
本系统是一个面向保险行业的全维度数据可视化分析平台,提供以下核心能力:
- 13 个数据分析页面:覆盖客户画像、产品分析、地域分布、渠道分析、保费保额、理赔分析、时间趋势、关联分析、统计检验、回归分析、异常检测、同比环比
- 地图下钻分析:基于 ECharts 的全国省份 → 城市级地图下钻,支持多指标切换
- 聚类分析:K-Means / DBSCAN 算法,最优 K 值分析,聚类画像
- 时间序列分析:季节性分解、ARIMA 预测
- 关联规则挖掘:Apriori 算法,频繁项集与关联规则发现
- 报告导出:Excel / PDF 自动生成与下载
- 用户与权限:JWT 认证,user / admin 双角色体系
- 数据管理:CRUD 操作 + CSV 批量导入
2. 技术架构
2.1 整体架构
┌─────────────────────────────────────────────────────────┐
│ 浏览器客户端 │
│ http://localhost:5173 │
└────────────────────────┬────────────────────────────────┘
│ Vite Dev Proxy /api/* → :8000
┌────────────────────────▼────────────────────────────────┐
│ Flask API 后端 │
│ http://localhost:8000 │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────┐
│ │ 路由层 │→ │ 数据转换层 │→ │ shared 核心模块 │
│ │ (app.py) │ │ (结构适配) │ │ (纯 Python 计算) │
│ └──────────┘ └──────────────┘ └──────────────────┘
│ │
│ ▼
│ ┌──────────┐ ┌──────────┐
│ │ database │ │ CSV 文件 │
│ │ .py │ │ (pandas) │
│ └────┬─────┘ └──────────┘
└───────┼─────────────────────────────────────────────────┘
┌─────▼─────┐
│ MySQL │
│ 用户/数据 │
└───────────┘
2.2 前端技术栈
| Vue Router | ^4.3.0 | 路由管理(History 模式) |
| @element-plus/icons-vue | ^2.3.1 | 图标库 |
2.3 后端技术栈
| 技术 | 用途 |
|---|
| Flask | Web 框架(纯 JSON API) |
| Flask-CORS | 跨域支持 |
| Flask-JWT-Extended | JWT 认证 |
| PyMySQL | MySQL 数据库驱动 |
| Passlib + bcrypt | 密码哈希 |
| Pandas + NumPy | 数据处理与分析 |
| SciPy | 统计检验(t 检验、ANOVA、卡方、正态性) |
| scikit-learn | K-Means、DBSCAN、Isolation Forest、标准化 |
| statsmodels | 回归分析、时间序列分解、ARIMA |
| mlxtend | Apriori 关联规则挖掘 |
| openpyxl | Excel 报告生成 |
| reportlab | PDF 报告生成 |
| PyYAML | 配置文件解析 |
2.4 项目演示
3. 项目目录结构
313-基于 Python 的保险行业数据可视化分析系统/
├── insurance_data.csv
└── code/
├── run.py
├── backend/
│ ├── app.py
│ ├── database.py
│ ├── config.yaml
│ ├── requirements.txt
│ ├── data/
│ │ └── insurance_data.csv
│ └── shared/
│ ├── __init__.py
│ ├── analysis_core.py
│ ├── stats_core.py
│ ├── regression_core.py
│ ├── anomaly_core.py
│ ├── comparative_core.py
│ ├── clustering_core.py
│ ├── timeseries_core.py
│ ├── association_core.py
│ └── report_core.py
├── frontend/
│ ├── package.json
│ ├── vite.config.ts
│ ├── env.d.ts
│ └── src/
│ ├── main.ts
│ ├── App.vue
│ ├── assets/
│ │ └── theme.css
│ ├── components/
│ │ └── Layout.vue
│ ├── router/
│ │ └── index.ts
│ ├── stores/
│ │ ├── config.ts
│ │ └── user.ts
│ ├── utils/
│ │ └── request.ts
│ ├── api/
│ │ ├── auth.ts
│ │ ├── config.ts
│ │ ├── analytics.ts
│ │ └── admin.ts
│ └── views/
│ ├── Home.vue
│ ├── Login.vue
│ ├── Register.vue
│ ├── Profile.vue
│ ├── Analytics.vue
│ ├── AnalyticsPage.vue
│ ├── MapDrilldown.vue
│ ├── Clustering.vue
│ ├── Timeseries.vue
│ ├── Association.vue
│ ├── Reports.vue
│ └── admin/
│ ├── Dashboard.vue
│ ├── Users.vue
│ └── Data.vue
└── docs/
├── 技术文档.md
├── api.md
├── design-system.md
├── dev-rules.md
├── acceptance-report.md
├── backend-log.md
└── frontend-log.md
3.1 代码量统计
| 模块 | 文件数 | 代码行数 |
|---|
| 后端 Python(app.py + database.py) | 2 | 1,688 |
| 后端 shared 核心模块 | 9 | 2,243 |
| 前端 Vue 组件 | 14 | 5,386 |
| 前端 TS 逻辑(路由/状态/API/工具) | 7 | 374 |
| 前端 CSS 主题 | 1 | 143 |
| 配置文件 | 3 | ~420 |
| 总计 | 36 | ~10,254 |
4. 数据集说明
4.1 数据集概况
- 文件名:insurance_data.csv
- 编码:UTF-8
- 数据量:30,000 行
- 特征数:30 列(12 数值型 + 8 分类型 + 10 文本型)
- 空值:仅
代理人编号 列有 25,095 个空值(线上渠道无代理人)
4.2 字段定义
客户信息(6 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 保单号 | text | 唯一标识 | 30,000 个唯一值 |
| 客户编号 | text | 客户 ID | 15,000 个唯一值(一客多保单) |
| 客户姓名 | text | 客户姓名 | 15,000 个唯一值 |
| 性别 | categorical | 性别 | 男,女 |
| 年龄 | numeric | 年龄 | 18 ~ 80 岁 |
| 教育程度 | categorical | 学历 | 高中及以下,大专,本科,硕士,博士 |
职业与收入(2 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 职业 | categorical | 职业类别 | 教师,销售,工程师,自由职业,学生,个体经营,退休人员,医生,企业职员,公务员 |
| 收入水平 | categorical | 收入区间 | 3000 以下,3000-5000, 5000-8000, 8000-12000, 12000-20000, 20000-50000, 50000 以上 |
地域信息(2 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 省份 | categorical | 省份 | 北京,上海,广东,浙江,江苏,山东,福建,湖北,四川,河南(10 省) |
| 城市 | text | 城市/区 | 50 个城市(每省 5 个) |
保单信息(8 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 保险类型 | categorical | 险种分类 | 寿险,健康险,意外险,车险,财产险,旅游险 |
| 产品名称 | text | 具体产品 | 30 个唯一值 |
| 保险期限_年 | numeric | 保障期限 | 1 ~ 30 年 |
| 起保日期 | text | 保单生效日期 | 2020 ~ 2024 年 |
| 终保日期 | text | 保单到期日期 | - |
| 销售渠道 | categorical | 销售来源 | 代理人,银行渠道,线上直销,电销,经纪公司,第三方平台 |
| 代理人编号 | text | 代理人 ID | 500 个唯一值(83.65% 空值) |
| 缴费方式 | categorical | 缴费频次 | 年交,季交,月交,趸交 |
财务指标(4 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 保费 | numeric | 保费金额 | 44.17 ~ 38,992.45 元,均值 6,093.93 |
| 保额 | numeric | 保障金额 | 23,299 ~ 19,123,333 元,均值 1,623,885 |
| 理赔金额 | numeric | 理赔支出 | 0 ~ 11,766,697 元,均值 86,201 |
| 佣金 | numeric | 渠道佣金 | 1.33 ~ 5,848.87 元,均值 537.13 |
保单状态(4 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 保单状态 | categorical | 保单有效性 | 有效,退保,满期,理赔中,失效 |
| 续保次数 | numeric | 续保轮数 | 0 ~ 5 次 |
| 出险次数 | numeric | 出险频率 | 0 ~ 3 次 |
| 理赔状态 | categorical | 理赔进度 | 未出险,已报案,审核中,已赔付,拒赔 |
客户评价与时间(4 列)
| 字段名 | 类型 | 说明 | 值域 |
|---|
| 客户满意度 | numeric | 评分 | 3.5 ~ 5.0 |
| 投保年份 | numeric | 年份 | 2020 ~ 2024 |
| 投保季度 | numeric | 季度 | 1 ~ 4 |
| 投保月份 | numeric | 月份 | 1 ~ 12 |
5. 数据库设计
5.1 数据库配置
host: localhost
port: 3306
user: root
password:
database: design_313_insurance
charset: utf8mb4
5.2 数据表结构
users 表(用户管理)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) UNIQUE NOT NULL,
email VARCHAR(200) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role VARCHAR(20) DEFAULT 'user',
status VARCHAR(20) DEFAULT 'active',
full_name VARCHAR(100) DEFAULT '',
phone VARCHAR(30) DEFAULT '',
gender VARCHAR(20) DEFAULT '',
age INT NULL,
department VARCHAR(100) DEFAULT '',
title VARCHAR(100) DEFAULT '',
bio TEXT NULL,
last_login_at DATETIME NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
dataset_data 表(业务数据)
根据 config.yaml 的 features 配置动态生成,30 个字段均映射为 SQL 列:
numeric 类型 → DOUBLE
categorical / text 类型 → VARCHAR(200)
binary 类型 → INT
5.3 数据来源说明
| 数据操作 | 数据来源 | 说明 |
|---|
| 分析可视化 | CSV 文件(pandas) | 所有分析功能直接读取 CSV,无需导入数据库 |
| 数据管理 CRUD | MySQL dataset_data 表 | 管理员在数据管理页面操作数据库 |
| CSV 导入 | CSV → MySQL | 管理员可将 CSV 导入数据库 |
| 用户管理 | MySQL users 表 | 注册、登录、权限管理 |
6. API 接口设计
6.1 接口总览
{"code":0,
"message":"success",
"data":{...}}
认证方式:JWT Bearer Token(Authorization: Bearer <token>),有效期 24 小时。
6.2 接口清单
公开接口(无需认证)
| 方法 | 路径 | 说明 |
|---|
| GET | /api/config | 获取项目配置(特征、分析页、模块) |
| POST | /api/auth/login | 用户登录,返回 JWT token |
| POST | /api/auth/register | 用户注册 |
认证接口(需登录)
| 方法 | 路径 | 说明 |
|---|
| GET | /api/auth/profile | 获取当前用户资料 |
| PUT | /api/auth/profile | 更新用户资料 |
| POST | /api/auth/change_password | 修改密码 |
分析接口(需登录)
| 方法 | 路径 | 说明 |
|---|
| GET | /api/analytics/overview | 数据概览(总记录数、数值统计摘要) |
| GET | /api/analytics/<page_route> | 通用分析页(13 个分析路由共用) |
| GET | /api/analytics/map_data | 地图下钻数据(省份/城市维度聚合) |
聚类分析接口
| 方法 | 路径 | 说明 |
|---|
| GET | /api/clustering/optimal | 最优 K 值分析(Elbow + Silhouette) |
| POST | /api/clustering/run | 执行聚类(K-Means / DBSCAN) |
时间序列接口
| 方法 | 路径 | 说明 |
|---|
| POST | /api/timeseries/decompose | 时间序列分解(趋势 + 季节 + 残差) |
| POST | /api/timeseries/forecast | ARIMA 预测 |
关联规则接口
| 方法 | 路径 | 说明 |
|---|
| GET | /api/association/prepare | 获取可用列与项集支持度 |
| POST | /api/association/mine | Apriori 挖掘(支持度/置信度/top_n) |
报告导出接口
| 方法 | 路径 | 说明 |
|---|
| GET | /api/reports | 获取已生成报告列表 |
| POST | /api/reports/generate | 生成 Excel/PDF 报告 |
| GET | /api/reports/download/<filename> | 下载报告文件 |
数据管理接口
| 方法 | 路径 | 说明 |
|---|
| GET | /api/data | 分页查询数据 |
| POST | /api/data | 新增记录 |
| GET | /api/data/<id> | 查看单条记录 |
| PUT | /api/data/<id> | 更新记录 |
| DELETE | /api/data/<id> | 删除记录 |
| POST | /api/data/import_csv | CSV 批量导入 |
管理员接口(需 admin 角色)
| 方法 | 路径 | 说明 |
|---|
| GET | /api/admin/stats | 系统统计(用户数、数据量、今日登录、7 天活跃) |
| GET | /api/admin/users | 用户列表 |
| POST | /api/admin/users | 创建用户 |
| PUT | /api/admin/users/<id>/role | 修改角色 |
| PUT | /api/admin/users/<id>/status | 启用/禁用 |
| POST | /api/admin/users/<id>/reset_password | 重置密码(重置为 123456) |
| DELETE | /api/admin/users/<id> | 删除用户 |
7. 前端页面设计
7.1 页面路由
| 路径 | 页面 | 权限 | 说明 |
|---|
/ | Home.vue | 公开 | 首页(Hero + 统计卡片) |
/login | Login.vue | 仅未登录 | 登录(左品牌 + 右表单) |
/register | Register.vue | 仅未登录 | 注册 |
/analytics | Analytics.vue | 公开 | 分析总览仪表盘 |
/analytics/:route | AnalyticsPage.vue | 公开 | 13 个分析子页面 |
/map | MapDrilldown.vue | 需登录 | 地图下钻分析 |
/clustering | Clustering.vue | 需登录 | 聚类分析 |
/timeseries | Timeseries.vue | 需登录 | 时间序列分析 |
/association | Association.vue | 需登录 | 关联规则挖掘 |
/reports | Reports.vue | 需登录 | 报告导出 |
/profile | Profile.vue | 需登录 | 个人中心 |
/admin | admin/Dashboard.vue | admin | 管理后台 |
/admin/users | admin/Users.vue | admin | 用户管理 |
/admin/data | admin/Data.vue | admin | 数据管理 |
7.2 分析页面类型
AnalyticsPage.vue 是一个 1,913 行的通用分析组件,通过 page_route 参数自动渲染对应类型的图表:
| 路由 | 标题 | 分析类型 | 核心模块 | 交叉分析 |
|---|
customer_profile | 客户画像分析 | 通用分布 | analysis_core | 年龄×性别,职业×收入,教育×保险类型 |
product_analysis | 产品分析 | 通用分布 | analysis_core | 保险类型×保费,产品×保单状态,险种×期限 |
region_distribution | 地域分布分析 | 通用分布 | analysis_core | 省份保费排名,省份×类型热力图,城市 TOP15 |
channel_analysis | 渠道分析 | 通用分布 | analysis_core | 渠道×保费,渠道×险种,缴费×保费 |
premium_coverage | 保费保额分析 | 通用分布 | analysis_core | 保费×保额散点,保费分段分布,佣金×保费 |
claims_analysis | 理赔分析 | 通用分布 | analysis_core | 理赔状态×金额,出险×理赔,险种×理赔率 |
time_trend | 时间趋势分析 | 通用分布 | analysis_core | 年度保费趋势,月度分布,险种×年度 |
correlation | 关联分析 | 相关性 | analysis_core | 相关性热力图 |
stat_tests | 统计检验 | statistical | stats_core | 描述性统计,正态性,t 检验,ANOVA, 卡方 |
regression_analysis | 回归分析 | regression | regression_core | 线性回归,残差图,系数 |
anomaly | 异常值检测 | anomaly | anomaly_core | IQR, Z-Score, Isolation Forest |
period_compare | 同比环比 | comparative | comparative_core | 月度对比,增长率,移动平均 |
7.3 导航结构
首页 | 数据分析 ▼ | 地图下钻 | 聚类分析 | 时间序列 | 关联规则 | 报告导出 | 系统管理 ▼
├── 分析总览
├── 客户画像分析 (登录后显示)
├── 管理后台
├── 产品分析
├── 用户管理
├── 地域分布分析
└── 数据管理
├── 渠道分析 (仅 admin)
├── 保费保额分析
├── 理赔分析
├── 时间趋势分析
├── 关联分析
├── 统计检验分析
├── 回归分析
├── 异常值检测
└── 同比环比分析
7.4 主题设计系统
| 设计变量 | 值 | 说明 |
|---|
| 主色 | #1565C0 | 专业蓝 |
| 成功色 | #2E7D32 | 深绿 |
| 警告色 | #F57F17 | 琥珀 |
| 危险色 | #C62828 | 深红 |
| 正文色 | #303133 | 深灰 |
| 辅助文字 | #909399 | 中灰 |
| 背景色 | #f5f7fa | 浅灰蓝 |
| 卡片圆角 | 12px | 现代感 |
| 阴影 | 0 1px 3px rgba(0,0,0,0.05) | 轻量级 |
| 导航栏 | 毛玻璃效果 | backdrop-filter: blur(12px) |
['#1565C0','#2E7D32','#F57F17','#C62828','#0277BD','#6A1B9A','#00838F','#AD1457','#283593','#558B2F']
8. 核心模块详解
8.1 shared 分析模块
所有 shared 模块为纯 Python 计算模块,不依赖 Flask,通过参数驱动,路由层负责数据结构转换。
analysis_core.py(246 行)
get_overview():数据集概览(行数、数值统计摘要)
get_distribution(columns):分类列频率分布 + 数值列直方图分箱
get_correlation(columns):数值特征间 Pearson 相关系数矩阵
get_category_stats(columns):分类列交叉统计
stats_core.py(249 行)
descriptive_stats(columns):均值、中位数、标准差、偏度、峰度
normality_test(columns):Shapiro-Wilk / Kolmogorov-Smirnov 检验
t_test(col, group_col):独立样本 t 检验
anova_test(col, group_col):单因素 ANOVA 检验
chi_square_test(col1, col2):卡方独立性检验
regression_core.py(247 行)
simple_regression(x, y):简单线性回归(斜率、截距、R²、p 值)
multiple_regression(target, predictors):多元线性回归(系数、VIF、诊断)
- 输出:系数表、残差图数据、预测值 vs 实际值散点
anomaly_core.py(228 行)
iqr_detection(columns):四分位距法(1.5×IQR)
zscore_detection(columns, threshold=3):Z-Score 法
isolation_forest(columns):Isolation Forest 算法
- 输出:异常点标记、异常比例、异常数据详情
comparative_core.py(233 行)
period_comparison(date_col, value_cols, period):时段对比
growth_rate(date_col, value_cols):增长率计算
moving_average(date_col, value_col, window):移动平均线
clustering_core.py(245 行)
find_optimal_k(columns, max_k):Elbow 法 + Silhouette Score
kmeans_clustering(columns, k):K-Means 聚类
dbscan_clustering(columns, eps, min_samples):DBSCAN 密度聚类
get_cluster_profile(columns, labels):聚类画像(每簇均值对比)
timeseries_core.py(294 行)
decompose(date_col, value_col):STL 分解(趋势 + 季节 + 残差)
arima_forecast(date_col, value_col, periods):ARIMA 预测
seasonal_pattern(date_col, value_col):季节性模式识别
association_core.py(195 行)
prepare_transactions(columns):事务编码(One-Hot)
mine_rules(columns, min_support, min_confidence):Apriori 频繁项集
top_rules(columns, top_n, sort_by):Top-N 规则(按 lift 排序)
report_core.py(304 行)
generate_excel():Excel 报告(多 Sheet,含统计图表)
generate_pdf():PDF 报告(中文排版,含统计摘要)
8.2 数据结构转换层
路由层(app.py)是 shared 模块与前端之间的桥梁,需要进行数据结构转换。主要转换类型:
| 转换类型 | 示例 | 说明 |
|---|
| 键名重命名 | f_p_value → f_pvalue | shared 返回键名与前端期望不同 |
| 列表 → 字典 | coefficients: [{name, coef}] → {name: coef} | 前端期望键值对形式 |
| 嵌套 → 扁平 | result.data.items → result.items | 减少前端嵌套访问 |
| 补算指标 | DBSCAN 的 silhouette_score | shared 未返回但前端需要 |
8.3 地图下钻
- GeoJSON 来源:阿里云 DataV CDN(
geo.datav.aliyun.com),按需加载
- 全国级:
100000_full.json,10 省着色
- 省级:
{adcode}_full.json,下钻到区/市
- 指标切换:投保数量、保费/保额/理赔/佣金的总额与均值
- 配色映射:
#E3F2FD → #0D47A1(蓝色渐变 6 级 visualMap)
| 省份 | adcode | 城市数 |
|---|
| 北京 | 110000 | 5 区 |
| 上海 | 310000 | 5 区 |
| 广东 | 440000 | 5 市 |
| 浙江 | 330000 | 5 市 |
| 江苏 | 320000 | 5 市 |
| 山东 | 370000 | 5 市 |
| 福建 | 350000 | 5 市 |
| 湖北 | 420000 | 5 市 |
| 四川 | 510000 | 5 市 |
| 河南 | 410000 | 5 市 |
9. 认证与权限
9.1 认证流程
用户提交用户名 + 密码
│
▼ Flask 验证(bcrypt 比对)
│
▼ 生成 JWT Token(有效期 24h)
│
▼ 前端存入 localStorage
│
▼ 后续请求 Axios 拦截器自动注入 Authorization: Bearer <token>
│
▼ Flask @jwt_required() 校验 Token → 获取 user_id
9.2 角色权限矩阵
| 功能 | 游客 | user | admin |
|---|
| 查看首页 | ✅ | ✅ | ✅ |
| 查看分析页面 | ✅ | ✅ | ✅ |
| 聚类/时间序列/关联/报告 | ❌ | ✅ | ✅ |
| 地图下钻 | ❌ | ✅ | ✅ |
| 个人中心 | ❌ | ✅ | ✅ |
| 管理后台 | ❌ | ❌ | ✅ |
| 用户管理 | ❌ | ❌ | ✅ |
| 数据管理(CRUD + CSV 导入) | ❌ | ❌ | ✅ |
9.3 路由守卫
meta.guest: true:仅未登录可访问(登录页、注册页),已登录跳转 /
meta.auth: true:需要登录,未登录跳转 /login?redirect=当前路径
meta.role: 'admin':需要 admin 角色,非 admin 跳转 /
10. 部署与运行
10.1 环境要求
| 环境 | 版本要求 |
|---|
| Python | 3.8+ |
| Node.js | 16+ |
| MySQL | 5.7+ / 8.0 |
| npm | 8+ |
10.2 数据库初始化
CREATE DATABASE design_313_insurance CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
数据库表会在首次启动后端时自动创建,默认管理员账号 admin / admin123 自动写入。
10.3 后端启动
cd code/backend
pip install -r requirements.txt
python -c "from app import app; app.run(host='localhost', port=8000, debug=True)"
cd code
python run.py
后端启动后监听 http://localhost:8000。
10.4 前端启动
cd code/frontend
npm install
npm run dev
前端启动后访问 http://localhost:5173,Vite 自动代理 /api/* 请求到后端 8000 端口。
10.5 生产构建
cd code/frontend
npm run build
产出 dist/ 目录,可部署到 Nginx。生产环境需配置 Nginx 反向代理:
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /path/to/dist;
try_files $uri $uri/ /index.html;
}
# API 代理
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
11. 配置说明
11.1 config.yaml 结构
project:
id: '313'
name: 保险行业数据可视化分析系统
stack: flask_vue
db_name: design_313_insurance
port: 8000
theme_color: '#1565C0'
dataset:
file: insurance_data.csv
features: [...]
modules:
auth: true
analytics: true
data_manage: true
statistical_analysis: true
regression: true
anomaly_detection: true
comparative: true
clustering: true
timeseries: true
association_rules: true
report_export: true
analysis_pages: [...]
clustering:
columns: [年龄,保费,保额,...]
max_k: 10
timeseries:
date_column: 起保日期
value_columns: [保费,理赔金额]
association:
columns: [性别,教育程度,职业,...]
11.2 Vite 代理配置
server: {
host: '0.0.0.0',
port: 5173,
proxy: {
'/api': {
target: process.env.VITE_API_URL || 'http://127.0.0.1:8000',
changeOrigin: true,
},
},
}
12. 关键设计决策
12.1 为什么分析数据读 CSV 而非数据库?
- 数据集 30,000 行完全可以放入内存,pandas 处理速度极快
- CSV 是原始数据来源,避免导入过程中的数据类型转换损失
- shared 核心模块设计为纯 pandas 驱动,与数据库解耦
- 数据库仅用于用户管理和 CRUD 操作
12.2 为什么使用单一 AnalyticsPage.vue?
- 13 个分析页面共享相同的布局模式(页头 + 图表网格 + 表格)
- 通过
page_route 参数动态切换分析类型和图表组合
- 避免 13 个几乎相同的 Vue 文件导致的代码膨胀和维护负担
- 不同分析类型(statistical、regression、anomaly、comparative)通过条件渲染分支处理
12.3 GeoJSON 按需加载策略
- 全国地图 GeoJSON 约 500KB,10 个省份 GeoJSON 各 50~150KB
- 首次加载全国 GeoJSON,点击省份时才加载对应省级 GeoJSON
- 已加载的 GeoJSON 通过
echarts.registerMap() 缓存,不重复请求
- 使用阿里云 DataV CDN,国内访问速度有保障
12.4 JWT 而非 Session 的选择
- 前后端分离架构,API 无状态更适合 JWT
- Token 存储在 localStorage,前端 Axios 拦截器自动注入
- 24 小时过期策略平衡安全性与用户体验
- Flask-JWT-Extended 提供成熟的 JWT 生命周期管理
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online