保险行业数据可视化分析系统 — 技术文档
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 3 | ^3.4.21 | 前端框架(Composition API + <script setup>) |
| Vue Router | ^4.3.0 | 路由管理(History 模式) |
| Pinia | ^2.1.7 | 状态管理 |
| Element Plus | ^2.6.1 | UI 组件库 |
| @element-plus/icons-vue | ^2.3.1 | 图标库 |
| ECharts | ^5.5.0 | 数据可视化图表 |
| Axios | ^1.6.7 | HTTP 请求 |
| NProgress | ^0.2.0 | 路由切换进度条 |
| dayjs | ^1.11.10 | 日期处理 |
| Vite | ^5.1.6 | 构建工具 |
| TypeScript | ^5.4.2 | 类型系统 |
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 # 原始数据集 (30,000 行 × 30 列) └── code/ # 项目代码目录 ├── run.py # 启动脚本(启动 Flask 后端) │ ├── backend/ # ===== 后端 ===== │ ├── app.py # Flask 主应用(1,267 行,所有 API 路由) │ ├── database.py # 数据库操作层(422 行) │ ├── config.yaml # 项目配置文件 │ ├── requirements.txt # Python 依赖 │ ├── 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 # Vite 配置(含 API 代理) │ ├── env.d.ts │ └── src/ │ ├── main.ts # 入口文件 │ ├── App.vue # 根组件 │ ├── assets/ │ │ └── theme.css # 全局主题样式(Element Plus 覆盖) │ ├── components/ │ │ └── Layout.vue # 应用布局(导航栏 + 内容区 + 页脚) │ ├── router/ │ │ └── index.ts # 路由定义 + 导航守卫 │ ├── stores/ │ │ ├── config.ts # 项目配置 Store │ │ └── user.ts # 用户认证 Store │ ├── utils/ │ │ └── request.ts # Axios 封装(拦截器 + JWT 注入) │ ├── api/ │ │ ├── auth.ts # 认证 API │ │ ├── config.ts # 配置 API │ │ ├── analytics.ts # 分析/聚类/时间序列/关联/报告/地图 API │ │ └── admin.ts # 管理员 API │ └── views/ │ ├── Home.vue # 首页(Hero + KPI 卡片 + 功能卡片) │ ├── Login.vue # 登录页(左右分栏布局) │ ├── Register.vue # 注册页 │ ├── Profile.vue # 个人中心 │ ├── Analytics.vue # 分析总览(统计卡片 + 模块入口) │ ├── AnalyticsPage.vue # 通用分析页(1,913 行,含所有分析类型) │ ├── MapDrilldown.vue # 地图下钻(全国 → 省 → 城市) │ ├── Clustering.vue # 聚类分析 │ ├── Timeseries.vue # 时间序列分析 │ ├── Association.vue # 关联规则挖掘 │ ├── Reports.vue # 报告导出 │ └── admin/ │ ├── Dashboard.vue # 管理后台首页 │ ├── Users.vue # 用户管理 │ └── Data.vue # 数据管理(CRUD + CSV 导入) │ └── docs/ # ===== 项目文档 ===== ├── 技术文档.md # 本文档 ├── api.md # API 接口文档 ├── 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:3306user: root password:'123456'database: design_313_insurance charset: utf8mb4
5.2 数据表结构
系统仅使用 2 张数据表:
users 表(用户管理)
CREATETABLE users ( id INTPRIMARYKEYAUTO_INCREMENT, username VARCHAR(100)UNIQUENOTNULL,-- 用户名 email VARCHAR(200)UNIQUENOTNULL,-- 邮箱 password_hash VARCHAR(255)NOTNULL,-- bcrypt 哈希密码 role VARCHAR(20)DEFAULT'user',-- 角色: user / adminstatusVARCHAR(20)DEFAULT'active',-- 状态: active / disabled full_name VARCHAR(100)DEFAULT'',-- 姓名 phone VARCHAR(30)DEFAULT'',-- 电话 gender VARCHAR(20)DEFAULT'',-- 性别 age INTNULL,-- 年龄 department VARCHAR(100)DEFAULT'',-- 部门 title VARCHAR(100)DEFAULT'',-- 职位 bio TEXTNULL,-- 个人简介 last_login_at DATETIMENULL,-- 最近登录时间 created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP-- 注册时间)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;
dataset_data 表(业务数据)
根据 config.yaml 的 features 配置动态生成,30 个字段均映射为 SQL 列:
numeric 类型 → DOUBLEcategorical / text 类型 → VARCHAR(200)binary 类型 → INT
5.3 数据来源说明
| 数据操作 | 数据来源 | 说明 |
|---|
| 分析可视化 | CSV 文件(pandas) | 所有分析功能直接读取 CSV,无需导入数据库 |
| 数据管理 CRUD | MySQL dataset_data 表 | 管理员在数据管理页面操作数据库 |
| CSV 导入 | CSV → MySQL | 管理员可将 CSV 导入数据库 |
| 用户管理 | MySQL users 表 | 注册、登录、权限管理 |
6. API 接口设计
6.1 接口总览
系统共 28 个 API 接口,统一返回格式:
{"code":0,// 0=成功, 1=失败"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) |
ECharts 全局配色数组:
['#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 Scorekmeans_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 地图下钻
ECharts 地图实现方案:
- GeoJSON 来源:阿里云 DataV CDN(
geo.datav.aliyun.com),按需加载 - 全国级:
100000_full.json,10 省着色 - 省级:
{adcode}_full.json,下钻到区/市 - 指标切换:投保数量、保费/保额/理赔/佣金的总额与均值
- 配色映射:
#E3F2FD → #0D47A1(蓝色渐变 6 级 visualMap)
省份 adcode 映射表:
| 省份 | 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 路由守卫
前端 Vue Router 守卫规则:
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 数据库初始化
CREATEDATABASE design_313_insurance CHARACTERSET utf8mb4 COLLATE utf8mb4_unicode_ci;
数据库表会在首次启动后端时自动创建,默认管理员账号 admin / admin123 自动写入。
10.3 后端启动
cd code/backend # 安装 Python 依赖 pip install-r requirements.txt # 启动 Flask(方式一:直接运行) python -c"from app import app; app.run(host='localhost', port=8000, debug=True)"# 启动 Flask(方式二:使用启动脚本)cd code python run.py
后端启动后监听 http://localhost:8000。
10.4 前端启动
cd code/frontend # 安装 Node 依赖npminstall# 开发模式启动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:8000theme_color:'#1565C0'dataset:# 数据集配置file: insurance_data.csv features:[...]# 30 个特征定义(key, label, type, options, range)modules:# 功能模块开关auth:trueanalytics:truedata_manage:truestatistical_analysis:trueregression:trueanomaly_detection:truecomparative:trueclustering:truetimeseries:trueassociation_rules:truereport_export:trueanalysis_pages:[...]# 13 个分析页面配置clustering:# 聚类参数columns:[年龄, 保费, 保额,...]max_k:10timeseries:# 时间序列参数date_column: 起保日期 value_columns:[保费, 理赔金额]association:# 关联规则参数columns:[性别, 教育程度, 职业,...]
11.2 Vite 代理配置
// frontend/vite.config.ts 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 生命周期管理