游戏账号数据可视化分析系统 --- 技术文档
一、项目概述
本系统是一个面向游戏账号交易数据的可视化分析平台,基于 FastAPI + SQLAlchemy 2 + Jinja2 + Bootstrap 5 + ECharts 构建。系统覆盖数据分析、账号浏览、收藏推荐、登录注册和后台管理五大模块,从 data/data.csv(约 25,000 条记录)导入数据后,提供多维度图表分析、个性化推荐、账号对比等能力。
技术栈
| 层级 | 技术 |
|---|---|
| 后端框架 | FastAPI (Python 3.11+) |
| ORM | SQLAlchemy 2.0 (Mapped 声明式) |
| 数据库 | MySQL 8.0 (utf8mb4) |
| 驱动 | PyMySQL |
| 模板引擎 | Jinja2 |
| 数据处理 | Pandas |
| 前端框架 | Bootstrap 5.3 |
| 图表库 | ECharts 5.5 |
| 认证 | Starlette SessionMiddleware + passlib (PBKDF2-SHA256) |
| 测试 | pytest + FastAPI TestClient |



























二、目录结构
code/
├── main.py # 顶层入口,uvicorn 启动器
├── requirements.txt # Python 依赖
├── package.json # Node 依赖 (bootstrap, echarts)
├── design_118_game.sql # MySQL 数据库导出文件
├── data/
│ └── data.csv # 原始数据集 (25,485 条)
├── scripts/
│ ├── init_db.py # 独立数据库初始化脚本
│ └── sync_steam_covers.py # 独立 Steam 封面同步脚本
├── tests/
│ └── test_app.py # 集成测试
└── app/
├── __init__.py
├── main.py # FastAPI 应用工厂 & 生命周期
├── config.py # 配置数据类
├── database.py # SQLAlchemy 引擎 & 会话管理
├── models.py # ORM 模型 (4 张表)
├── security.py # 认证 & 会话工具函数
├── routers/
│ ├── __init__.py
│ ├── auth.py # 登录、注册、登出路由
│ ├── api.py # JSON API 路由 (图表、账号、收藏、对比)
│ ├── admin.py # 后台管理路由
│ └── web.py # HTML 页面路由
├── services/
│ ├── __init__.py
│ ├── seed.py # 种子数据 (游戏、默认用户)
│ ├── ingest.py # CSV 导入 & 数据规范化
│ ├── analytics.py # 分析引擎 (图表、序列化、筛选、基准、对比)
│ ├── recommendation.py # 个性化推荐引擎
│ └── steam.py # Steam 封面图抓取
├── templates/ # Jinja2 模板 (17 个)
│ ├── base.html # 基础布局
│ ├── index.html # 首页
│ ├── dashboard.html # 分析看板
│ ├── accounts.html # 账号列表
│ ├── account_detail.html # 账号详情
│ ├── insights.html # 市场洞察
│ ├── compare.html # 对比分析
│ ├── login.html # 登录
│ ├── register.html # 注册
│ ├── favorites.html # 收藏
│ ├── admin.html # 后台管理首页
│ ├── admin_accounts.html # 后台账号列表
│ ├── admin_account_form.html # 后台新建/编辑表单
│ ├── _metric_cards.html # 指标卡片局部模板
│ └── _account_card.html # 账号卡片局部模板
└── static/
├── css/site.css # 自定义暗色主题 CSS (~1546 行)
├── js/app.js # 前端 JS (ECharts、对比、收藏)
└── img/*.svg # 7 个游戏封面 SVG
三、数据库设计
3.1 ER 关系
Game (1) ──── (N) GameAccount (1) ──── (N) Favorite (N) ──── (1) User
3.2 表结构
games --- 游戏表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT PK | 主键 |
| name | VARCHAR(60) UNIQUE | 游戏名称 |
| slug | VARCHAR(80) UNIQUE | URL 友好标识 |
| description | VARCHAR(255) | 游戏描述 |
| theme_color | VARCHAR(30) | 主题色 (默认 #2456f5) |
| cover_url | VARCHAR(500) | 封面图 URL |
| steam_query | VARCHAR(120) NULL | Steam 搜索关键词 |
| steam_app_id | INT NULL | Steam 应用 ID |
| mention_count | INT | 数据集中被提及次数 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
users --- 用户表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT PK | 主键 |
| username | VARCHAR(50) UNIQUE | 用户名 |
| VARCHAR(120) UNIQUE | 邮箱 | |
| password_hash | VARCHAR(255) | 密码哈希 (PBKDF2-SHA256) |
| is_admin | BOOLEAN | 是否管理员 |
| last_login_at | DATETIME NULL | 最后登录时间 |
| created_at | DATETIME | 注册时间 |
| updated_at | DATETIME | 更新时间 |
game_accounts --- 游戏账号表
| 字段 | 类型 | 索引 | 说明 |
|---|---|---|---|
| id | INT PK | 主键 | |
| game_id | INT FK | INDEX | 关联游戏 |
| source_key | VARCHAR(40) UNIQUE | 数据来源唯一标识 (SHA1) | |
| title | TEXT | 账号标题 | |
| excerpt | TEXT | 描述摘要 | |
| price | FLOAT | INDEX | 挂牌价格 |
| system_version | VARCHAR(30) | 系统版本 (iOS/Android) | |
| account_type | VARCHAR(30) | 账号类型 (QQ/微信) | |
| service_region | VARCHAR(60) | 服务区 | |
| server_name | VARCHAR(80) | 服务器名称 | |
| published_at | DATETIME NULL | INDEX | 上架时间 |
| rank | VARCHAR(50) | 段位 | |
| second_identity | VARCHAR(30) | 二次实名 (可二次/不可二次) | |
| vip_level | VARCHAR(20) | INDEX | 贵族等级 |
| skin_count | INT | INDEX | 皮肤数量 |
| hero_count | INT | 英雄数量 | |
| collection_count | INT | 典藏数量 | |
| peerless_count | INT | 无双数量 | |
| legend_count | INT | 传说数量 | |
| star_legend_count | INT | 星传说数量 | |
| anti_addiction | VARCHAR(30) | 防沉迷限制 | |
| quality_score | FLOAT | INDEX | 综合质量分 |
| title_length | INT | 标题字符长度 | |
| related_games_json | TEXT | 关联游戏 JSON | |
| feature_tags_json | TEXT | 特征标签 JSON | |
| raw_title_metrics_json | TEXT | 原始标题指标 JSON | |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 |
favorites --- 收藏表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT PK | 主键 |
| user_id | INT FK INDEX | 关联用户 |
| account_id | INT FK INDEX | 关联账号 |
| created_at | DATETIME | 收藏时间 |
| updated_at | DATETIME | 更新时间 |
唯一约束: (user_id, account_id)
四、配置系统
配置通过 app/config.py 中的 Settings 冻结数据类管理,所有值均可通过同名环境变量覆盖。
| 配置项 | 默认值 | 说明 |
|---|---|---|
| project_name | 游戏账号数据可视化分析系统 | 项目名称 |
| database_url | mysql+pymysql://root:123456@localhost:3306/design_118_game | 数据库连接串 |
| dataset_path | data/data.csv | 数据集文件路径 |
| secret_key | (内置默认) | Session 签名密钥 |
| session_cookie | design118_session | Cookie 名称 |
| admin_username | admin | 默认管理员用户名 |
| admin_email | admin@design118.local | 默认管理员邮箱 |
| admin_password | 123456 | 默认管理员密码 |
| default_user_username | user | 默认普通用户名 |
| default_user_email | user@design118.local | 默认普通用户邮箱 |
| default_user_password | 123456 | 默认普通用户密码 |
| page_size | 12 | 分页每页条数 |
| steam_timeout | 15 | Steam API 超时 (秒) |
使用 @lru_cache 实现单例模式,通过 get_settings() 获取。
五、应用启动流程
5.1 入口
main.py → uvicorn.run("app.main:app", host, port, reload)
5.2 生命周期 (app/main.py)
启动 (lifespan):
1. ensure_database() --- 连接 MySQL,若目标数据库不存在则创建
2. init_db() --- 根据 ORM 模型创建所有表
3. seed_reference_data() --- 写入 7 个游戏种子记录 (upsert)
4. seed_default_users() --- 创建/重置 admin 和 user 账户
5. import_accounts_from_csv(replace=False) --- 增量导入 CSV 数据
5.3 中间件 & 挂载
SessionMiddleware--- Starlette 签名 Cookie 会话/static→app/static/--- CSS、JS、图片/vendor→node_modules/--- Bootstrap、ECharts
5.4 路由注册
auth.router → /login, /register, /logout
api.router → /api/* (JSON 接口)
admin.router → /admin/* (后台管理)
web.router → /, /dashboard, /accounts, /insights, /compare, /favorites
六、后端架构
6.1 分层结构
路由层 (routers/) ← HTTP 请求分发、表单处理、响应渲染
↓ 依赖注入
服务层 (services/) ← 业务逻辑、数据计算、外部 API 调用
↓
数据层 (models.py + database.py) ← ORM 模型、会话管理
6.2 认证体系 (security.py)
| 函数 | 说明 |
|---|---|
hash_password(password) |
PBKDF2-SHA256 哈希 |
verify_password(password, hash) |
密码校验 |
login_user(request, user) |
写入 session,更新 last_login_at |
logout_user(request) |
清除 session |
get_current_user_optional() |
返回 User 或 None (FastAPI Depends) |
get_current_user() |
返回 User 或 401 (FastAPI Depends) |
require_admin() |
返回管理员 User 或 403 (FastAPI Depends) |
flash(request, msg, category) |
Flash 消息存入 session |
pop_flash(request) |
取出并清除 Flash 消息 |
6.3 路由模块详解
auth.py --- 认证路由
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /login | 登录页 |
| POST | /login | 登录处理 (支持用户名或邮箱) |
| GET | /register | 注册页 |
| POST | /register | 注册处理 (校验: 用户名≥3字符, 密码≥6字符, 确认密码一致, 唯一性) |
| POST | /logout | 登出 |
api.py --- JSON API 路由
账号与统计:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/summary | 全局统计摘要 |
| GET | /api/accounts | 分页账号列表 (支持 8 个筛选参数 + 6 种排序) |
| GET | /api/compare?ids=1,2,3 | 账号对比数据 |
收藏 (需登录):
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/favorites | 当前用户收藏列表 |
| POST | /api/favorites/{id} | 添加收藏 |
| DELETE | /api/favorites/{id} | 取消收藏 |
推荐:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/recommendations | 个性化推荐 (登录用户基于画像, 未登录按质量排序) |
图表数据 (21 个端点):
| 端点 | 图表类型 | 说明 |
|---|---|---|
| /api/charts/daily-trend | 折线图 | 每日上架趋势 |
| /api/charts/platform-mix | 饼图 | 平台分布 (QQ/微信/苹果) |
| /api/charts/publish-hour | 柱状图 | 上架时段分布 |
| /api/charts/weekday-activity | 柱状图 | 星期活跃度 |
| /api/charts/vip-price | 折线图 | VIP 等级与均价 |
| /api/charts/price-band | 柱状图 | 价格区间分布 |
| /api/charts/quality-band | 柱状图 | 质量分区间分布 |
| /api/charts/skin-value | 散点图 | 皮肤数与价格关系 |
| /api/charts/collection-curve | 折线图 | 典藏数分布曲线 |
| /api/charts/legend-curve | 折线图 | 传说数分布曲线 |
| /api/charts/rank-mix | 柱状图 | 段位分布 |
| /api/charts/game-mix | 饼图 | 游戏分布 |
| /api/charts/game-value | 柱状图 | 各游戏均价 |
| /api/charts/tag-hot | 玫瑰图 | 标签热度 |
| /api/charts/feature-treemap | 矩形树图 | 特征标签分布 |
| /api/charts/identity-premium | 柱状图 | 二次实名溢价 |
| /api/charts/region-top | 柱状图 | 区服 Top 10 |
| /api/charts/related-assets | 柱状图 | 关联资产分布 |
| /api/charts/related-premium | 柱状图 | 关联资产溢价 |
| /api/charts/rank-vip-heatmap | 热力图 | 段位×VIP 等级矩阵 |
| /api/charts/quality-scatter | 散点图 | 质量分与价格散点 |
所有图表端点均支持 chart_filters 依赖注入的 8 个筛选参数: q, game, system_version, account_type, vip_level, rank, price_min, price_max。
admin.py --- 后台管理路由 (需管理员权限)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /admin | 管理面板首页 |
| POST | /admin/reseed | 重建数据集 (清空后重新导入 CSV) |
| POST | /admin/sync-covers | 同步 Steam 游戏封面 |
| GET | /admin/accounts | 账号管理列表 (分页、搜索) |
| GET | /admin/accounts/new | 新建账号表单 |
| POST | /admin/accounts/new | 创建账号 |
| GET | /admin/accounts/{id}/edit | 编辑账号表单 |
| POST | /admin/accounts/{id}/edit | 更新账号 |
| POST | /admin/accounts/{id}/delete | 删除账号 |
web.py --- 页面路由
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / | 首页 (指标卡片、游戏展示、精选/性价比/推荐/最新账号) |
| GET | /dashboard | 分析看板 (筛选器 + 21 个图表) |
| GET | /accounts | 账号列表 (筛选、排序、分页) |
| GET | /accounts/{id} | 账号详情 (基准分析、相似推荐、收藏) |
| GET | /insights | 市场洞察 (标签云、服务器分布、高价/高性价比样本) |
| GET | /compare | 对比分析 (2-3 账号并排、雷达图、指标表) |
| GET | /favorites | 收藏与推荐 (需登录) |
七、服务层详解
7.1 数据导入 (ingest.py)
导入流程:
CSV 文件
↓ pandas 读取
原始 DataFrame
↓ 字段规范化 (全角转半角、价格提取、时间解析)
规范化 DataFrame
↓ 标题特征提取 (正则匹配 21 种标签)
enriched DataFrame
↓ 质量分计算
最终记录
↓ 批量写入 (每批 500 条)
数据库
标题特征提取: 通过正则表达式从账号标题中提取:
- 皮肤数量、英雄数量、典藏数量、无双数量、传说数量、星传说数量
- VIP 等级
- 21 种特征标签 (荣耀水晶、营地、贵族积分、女号、满铭文、金标 等)
质量分计算公式:
quality = skins × 1.25
+ heroes × 0.45
+ collections × 38
+ peerless × 55
+ legends × 7.5
+ star_legends × 11
+ rank_weight × 25
+ vip_bonus (每级 18)
+ identity_bonus (可二次 +18)
- anti_addiction_penalty (有防沉迷 -36)
去重机制: 使用标题+价格+服务器的 SHA1 哈希作为 source_key,插入时若已存在则跳过。
7.2 分析引擎 (analytics.py)
序列化 (serialize_account)
将 ORM 对象转换为前端可用的字典,包含计算字段:
price_text: 格式化价格 (¥1,234)price_band_label: 价格区间标签 (百元内/百元档/500 档/千元档/万元档)quality_tier: 质量等级 (S/A/B/C/D)value_score: 性价比分 (quality_score / price × 100)hero_line/rarity_line: 英雄/稀有资产摘要文本cover_theme: 基于 SHA1 的确定性颜色方案 (--cover-primary, --cover-secondary 等 CSS 变量)
筛选器 (build_filters)
支持 8 个筛选维度,均通过 SQLAlchemy where 子句实现:
q: 标题模糊搜索 (ILIKE)game: 游戏名称精确匹配system_version: 系统版本account_type: 账号类型vip_level: VIP 等级rank: 段位price_min/price_max: 价格范围
排序模式 (list_accounts)
| sort 参数 | 排序方式 |
|---|---|
| latest | published_at DESC |
| price_asc | price ASC |
| price_desc | price DESC |
| quality | quality_score DESC |
| skins | skin_count DESC |
| value | value_score DESC (quality_score / price) |
账号基准分析 (get_account_benchmark)
对单个账号在同游戏范围内计算:
- 价格百分位、质量百分位、皮肤百分位、性价比百分位
- 同价段样本数
- 同价段各项指标中位数
- 市场评语 (根据价格和质量百分位生成)
对比分析 (get_compare_payload)
支持 2-3 个账号并排对比:
- 指标行: 价格、质量分、皮肤、英雄、典藏、无双、传说、星传说、VIP
- 摘要卡片: 各维度最高值
- 雷达图数据: 6 维标准化数值
- 柱状图数据: 原始数值对比
- 胜负统计: 每个账号在多少维度领先
7.3 推荐引擎 (recommendation.py)
算法: 基于内容的过滤 (Content-Based Filtering)
流程:
- 若用户未登录 → 返回质量分 Top N
- 若用户已登录且有收藏:
- 从收藏记录构建用户画像: 平均价格、平均皮肤数、平均质量分、VIP 偏好、游戏偏好、标签偏好、关联游戏偏好
- 取 800 个候选账号,逐个评分
评分权重:
| 维度 | 权重 | 说明 |
|---|---|---|
| 同游戏 | +22 | 与偏好游戏匹配 |
| 价格接近度 | +16 (满分) | 与平均价格越接近越高 |
| 皮肤接近度 | +16 (满分) | 与平均皮肤数越接近越高 |
| 质量接近度 | +18 (满分) | 与平均质量分越接近越高 |
| VIP 匹配 | +10 | VIP 等级在偏好集中 |
| 共享标签 | +5.5/个 | 特征标签匹配数 |
| 共享关联游戏 | +7/个 | 关联游戏匹配数 |
| 二次身份 | +4 | 可二次实名加分 |
| 典藏数 | +4/个 | 典藏数量加分 |
返回 Top N 及每条推荐的人类可读原因。
7.4 Steam 封面同步 (steam.py)
- 调用 Steam 商店搜索 API (
store.steampowered.com/api/storesearch) - 按游戏的
steam_query字段搜索 - 获取
header.jpg封面图 URL - 更新
games表的cover_url和steam_app_id
八、前端架构
8.1 模板继承
base.html
├── index.html
├── dashboard.html
├── accounts.html
├── account_detail.html
├── insights.html
├── compare.html
├── login.html
├── register.html
├── favorites.html
├── admin.html
├── admin_accounts.html
└── admin_account_form.html
局部模板:
_metric_cards.html ← 首页、管理面板复用
_account_card.html ← 账号列表、首页、收藏、管理面板复用
8.2 CSS 设计系统 (site.css)
设计语言: 暗色赛博观测站风格 (Dark Cyber-Observatory)
CSS 自定义属性 (设计令牌):
css
--bg: #0a0e17 /* 主背景 */
--panel: #111827 /* 面板背景 */
--line: #1e293b /* 边框线 */
--line-hover: #334155 /* 悬停边框 */
--primary: #3d9eff /* 主色调 */
--accent: #7c3aed /* 强调色 */
--muted: #64748b /* 次要文字 */
--radius-lg: 16px /* 大圆角 */
--radius-xl: 20px /* 超大圆角 */
--font-mono: JetBrains Mono /* 等宽字体 */
--transition: 0.2s ease /* 过渡动画 */
--shadow-glow: ... /* 发光阴影 */
响应式断点:
991px: 导航栏折叠、网格列数调整576px: 指标卡片最小高度调整、字号缩小
特效:
- 毛玻璃效果:
backdrop-filter: blur(12px) - 渐变边框:
::before伪元素渐变 - 卡片悬停:
translateY(-2px)+ 发光阴影 - 交错动画: 卡片入场依次淡入上移
- 骨架屏加载: shimmer 动画
8.3 JavaScript (app.js)
对比系统
- 使用
localStorage存储对比账号 ID (最多 3 个) - 底部固定对比托盘实时渲染
- 对比按钮状态同步 (已添加/未添加)
- 选择 2-3 个后跳转
/compare页面
ECharts 集成
javascript
initChart(domId) // 初始化带暗色主题的 ECharts 实例
loadAndRenderChart(cfg) // 从 API 加载数据并渲染图表
decorateOption(option) // 统一暗色主题样式注入
21 个图表配置: 每个包含 URL、数据构建函数、图表类型 (line/bar/pie/heatmap/treemap/scatter/radar/rose)。
收藏功能
- 收藏按钮通过
data-account-id绑定 - POST
/api/favorites/{id}添加 / DELETE 取消 - 按钮状态实时更新 (已收藏/未收藏)
8.4 封面图生成
每个账号卡片的封面图是纯 CSS 生成的,而非真实图片:
- 基于账号属性的 SHA1 哈希生成确定性颜色方案
- 通过 CSS 自定义属性
--cover-primary,--cover-secondary,--cover-stripe实现 - 每个账号拥有独特的渐变色和条纹图案
- 游戏名称以大字叠加显示
九、页面功能详解
9.1 首页 (/)
| 区块 | 内容 |
|---|---|
| Hero 面板 | 指标卡片 (总账号数、中位挂牌价、高价值账号) + 系统介绍 |
| 系统能力 | 4 个功能入口卡片 (分析看板、市场洞察、对比分析、收藏推荐) |
| 市场速览 | 4 个关键信号 (Apple 溢价、微信溢价、二次实名占比、跨游戏占比) |
| 数据库封面 | 7 个游戏卡片 (封面图、样本数、均价、最近上架时间) |
| 精选账号 | 质量分最高的 8 个样本 |
| 高性价比 | 性价比最优的 8 个样本 |
| 推荐系统 | 个性化推荐 (登录用户) 或默认推荐 |
| 最新上架 | 最近上架的 8 个样本 |
9.2 分析看板 (/dashboard)
- 筛选器: 关键词、游戏、系统版本、账号类型、VIP 等级、段位、价格范围
- 指标卡片: 总账号数、中位挂牌价、高价值账号
- 市场速览: 4 个关键信号
- 21 个图表面板: 按网格排列,支持联动筛选
9.3 账号列表 (/accounts)
- 筛选器: 与看板相同 + 排序方式 (最新/价格升序/价格降序/质量/皮肤/性价比)
- 账号卡片网格: 展示封面、标题、价格、关键指标
- 分页控件: 首页/上一页/页码/下一页/末页
9.4 账号详情 (/accounts/{id})
- 封面区: CSS 生成封面 + 游戏标签 + 价格
- 元数据: VIP 等级、段位、平台、服务器、上架时间
- 基准分析: 同价段样本数、质量/皮肤/性价比百分位
- 资产指标: 6 个指标格 (皮肤、英雄、典藏、无双、传说、星传说)
- 特征标签: 从标题提取的标签列表
- 操作按钮: 收藏、加入对比、查看相似
- 市场定位表: 与同价段中位数对比
- 画像条: 4 维度百分位可视化
- 相似推荐: 同游戏、同价段、皮肤数相近的账号
9.5 市场洞察 (/insights)
- 市场速览: 4 个关键信号
- 标签云: Top 12 热门标签
- 服务器分布: Top 10 服务器
- 高价样本: 价格最高的账号
- 高性价比: 性价比最优的账号
9.6 对比分析 (/compare)
- 摘要卡片: 各维度最高值标注
- 雷达图: 6 维标准化对比
- 柱状图: 原始数值对比
- 胜负表: 每个账号领先维度数
- 账号卡片并排: 2-3 个账号横向排列
- 指标对比表: 逐行对比,最优值高亮
9.7 收藏与推荐 (/favorites)
- 需登录访问,未登录重定向到登录页
- 展示用户收藏的所有账号
- 基于收藏画像的个性化推荐
- 无收藏时显示空状态引导
9.8 后台管理 (/admin)
- 需管理员权限
- 操作卡片: 重建数据集、同步 Steam 封面、数据管理入口
- 指标卡片: 全局统计
- 最近注册用户: 最近 10 个注册用户
- 最常被收藏: 收藏数 Top 10 账号
- 高质量样本: 质量分最高的 8 个账号
9.9 账号数据管理 (/admin/accounts)
- 列表页: 分页表格 (ID、标题、价格、服务器、段位、皮肤数、质量分)、搜索、编辑/删除按钮
- 新建表单: 所有账号字段的表单
- 编辑表单: 预填现有数据的表单
- 删除: 带确认弹窗的删除操作
十、API 接口规范
10.1 通用响应格式
图表 API:
json
{
"labels": ["标签1", "标签2", ...],
"values": [100, 200, ...]
}
账号列表 API:
json
{
"items": [{ "id": 1, "title": "...", "price": 500, ... }],
"total": 25000,
"page": 1,
"page_size": 12,
"total_pages": 2084
}
收藏 API:
json
{
"ok": true,
"is_favorited": true,
"favorite_total": 5
}
10.2 账号序列化字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 账号 ID |
| title | string | 标题 |
| excerpt | string | 描述 |
| price | float | 价格 |
| price_text | string | 格式化价格 |
| price_band_label | string | 价格区间 |
| quality_score | float | 质量分 |
| quality_tier | string | 质量等级 (S/A/B/C/D) |
| value_score | float | 性价比分 |
| skin_count | int | 皮肤数 |
| hero_count | int | 英雄数 |
| collection_count | int | 典藏数 |
| rank | string | 段位 |
| vip_level | string | VIP 等级 |
| game_name | string | 游戏名称 |
| hero_line | string | 英雄摘要 |
| rarity_line | string | 稀有资产摘要 |
| cover_theme | object | 封面颜色方案 |
| recommendation_reason | string | 推荐原因 (仅推荐 API) |
十一、部署与运行
11.1 环境要求
- Python 3.11+
- MySQL 8.0+
- Node.js (仅用于安装 bootstrap 和 echarts)
11.2 安装步骤
bash
# 1. 安装 Python 依赖
pip install -r requirements.txt
# 2. 安装前端依赖
npm install
# 3. 配置数据库 (可选,通过环境变量)
export DATABASE_URL="mysql+pymysql://user:pass@localhost:3306/design_118_game"
# 4. 启动应用
python main.py
启动后自动执行:
- 创建数据库 (如不存在)
- 创建表结构
- 写入种子数据 (7 个游戏 + 2 个默认用户)
- 增量导入 CSV 数据
11.3 默认账户
| 角色 | 用户名 | 密码 |
|---|---|---|
| 管理员 | admin | 123456 |
| 普通用户 | user | 123456 |
11.4 访问地址
http://127.0.0.1:8000
11.5 独立脚本
bash
# 重新初始化数据库并全量导入
python scripts/init_db.py --replace
# 同步 Steam 游戏封面
python scripts/sync_steam_covers.py
十二、测试
12.1 运行测试
bash
pytest tests/ -v
12.2 测试覆盖
| 测试用例 | 说明 |
|---|---|
| test_public_pages_and_chart_apis | 所有公开页面可访问、21 个图表 API 返回正确格式、筛选参数生效 |
| test_register_favorite_and_recommendation_flow | 注册 → 登录 → 收藏 CRUD → 推荐 API |
| test_admin_login_and_dashboard | 管理员登录 → 后台面板访问 |
| test_default_user_login | 普通用户登录 → 收藏页访问 |
十三、已知问题
scripts/init_db.py导入错误: 引用了seed_admin_user,但实际函数名为seed_default_users,直接运行脚本会触发ImportError。- Session 密钥硬编码:
config.py中secret_key有内置默认值,生产环境应通过环境变量覆盖。 - 密码明文默认值: 默认管理员和用户密码为
123456,仅适用于开发环境。