颐和园 · 十七孔桥
Chapter 06

颐和园 · 十七孔桥的晨光

从一份 CSV 到一座能跑的站,中间是可验证的四层结构
Architecture / 06

关于项目

一套可复现的「数据 → 存储 → 服务 → 展示」链路

资源清单

对应课设要求第 2 条 · 工具类与参考类

工具类资源(JS 插件 / 软件)

  • ECharts 5.6本地化 JS 图表插件,覆盖 12 种图表类型
  • Cloudflared隧道工具,内网穿透 + 自动 HTTPS
  • Flask / Jinja2路由服务与模板引擎
  • Pillow / pandas缩略图处理与数据清洗
  • Chrome DevTools调试、CDP 自动化验收

参考的主题相近资源

  • 阿里天池基础数据来源平台(携程北京景点数据集)
  • 携程旅行数据集原始数据方,页面信息架构参考
  • ECharts 官方示例地图、散点、桑基等图表选型参考
  • 数据透视表多维聚合与分组分析思路参照
  • 美团 / 大众点评商圈分级与标签体系参考
  • BI 软件(FineBI / Tableau)大屏布局与 KPI 卡片设计参考

数据分析版面与跳转逻辑

对应课设要求第 3 条 · 6 个分析版面

跳转逻辑:未登录访问任何分析页自动跳转登录页;登录后进入数据总览,通过六张跳转卡片或顶部导航进入各分析版面;各版面之间可通过顶部导航互相直达,形成闭环。

四层架构

自下而上单向依赖
04

展示层 · Presentation

Jinja2 模板 + ECharts 5.6(本地化部署,无外链依赖)· 7 个主题页面 + 登录页 · 响应式栅格

首页实时大屏景点分析商圈分布标签口碑算法模型关于登录
03

服务层 · Service

Flask 3.1 路由与 7 组业务 JSON 接口(另含 1 个健康检查)· Session 鉴权 · 登录行为审计

/api/health/api/overview/api/spots/api/districts/api/tags/api/predict/api/realtime
02

存储层 · Storage

SQLite · 第三范式 8 张表 + 3 个视图

attractionregiontagattraction_tagapp_userlogin_logspot_algomodel_report
01

数据层 · Data

阿里天池 · 携程景点数据集 20,635 行 · 按 ID 去重后 150 个景点 · 评论总量 748,025 条

spot_clean.csvinit_db.pytrain_model.py

数据流水线

每一步都可脚本复现
01原始 CSV20,635 行
→
02按 ID 去重150 个景点
→
03类型清洗数值 / 标签
→
04入库建模8 表 + 3 视图
→
05算法训练K-Means + XGBoost
→
06接口与图表7 个主题页 + 登录

坑一 · 去重

DATA-01

原始表 20,635 行,实际只有 150 个景点,每景点被重复约 138 次。若直接入库,评论总量会从 74.8 万虚高到 1.03 亿。因此先去重再聚合成硬性前置条件。

坑二 · 标签解析

DATA-02

标签列是 JSON 数组字符串(["遛娃宝藏地","赏花胜地"]),必须用 json.loads 解析;用 ast.literal_eval 在含双引号结构时会解析失败。

坑三 · 密码存储

SEC-01

登录不比对明文,改用 werkzeug.security.generate_password_hash(scrypt)落库、check_password_hash 校验,并把每次登录写入审计表。

技术栈

全部可离线运行
Python 3.12运行时
Flask 3.1Web 框架
SQLite 3关系型存储
pandas 2.2数据清洗
scikit-learnK-Means / 标准化
XGBoost 3.4热度回归
ECharts 5.6可视化
Jinja2模板渲染

域名与网络空间

对应课设要求第 5 条
域名

jingview.website
阿里云注册 · 已实名认证
有效期 2026-11-06 至 2027-11-06

演示期网络空间

本机运行 + Cloudflare Tunnel
无需公网 IP,HTTPS 自动签发
域名经 CNAME 接入隧道

正式上线方案

云服务器 + gunicorn + nginx
香港地域免备案,A 记录解析
详见 docs/部署与域名指南.md