基于玩家画像的游戏推荐与行为分析系统(GameRec)项目介绍
一句话简介:一个前后端分离的智能游戏推荐系统,基于 Steam 公开数据集构建玩家画像,融合 6 种推荐算法为用户个性化推荐游戏,并内置基于大模型的 AI 助手。
技术栈:Spring Boot · MyBatis-Plus · MySQL · Vue 2 · Element UI · ECharts · 大模型 API
适用范围:Java 后端 / 前端 / 推荐算法 / 数据分析方向的课程设计、毕业设计参考项目。
目录
1. 项目简介
GameRec 是一套完整的 游戏推荐 + 玩家行为分析 系统,解决的核心问题是:
面对数万款游戏,如何根据玩家的历史行为(购买、游玩时长),精准推荐他可能感兴趣的游戏?
项目以 Steam 平台公开数据集为基础,构建了从 数据清洗 → 玩家画像 → 推荐算法 → 效果评估 → 可视化分析 → AI 问答 的完整链路,是一个覆盖"数据工程 + 算法 + 工程实现"的综合性项目。
主要数据规模:
| 指标 | 规模 |
|---|---|
| 游戏库 | 2.6 万+ 款 Steam 游戏 |
| 玩家 | 5.6 万+ 名(模拟行为数据) |
| 行为记录 | 10 万+ 条购买/游玩记录 |
项目亮点:
- ✅ 6 种推荐算法全部落地(User-CF / Item-CF / 内容 / 流行度 / SVD / 混合),支持离线评估对比;
- ✅ 基于 RFM 模型 + 时间衰减活跃度 + 兴趣标签的玩家画像体系;
- ✅ 内置 AI 助手,基于系统真实数据回答游戏 / 玩家 / 统计问题,API Key 由用户自行配置,源码零密钥;
- ✅ 前后端分离,ECharts 可视化看板,开箱即用的一键启动脚本。
2. 核心功能
2.1 玩家画像
基于用户行为数据自动计算每位玩家的多维画像:
- RFM 价值分层:最近游玩(R)、游玩频率(F)、平均评分(M),综合划分为高 / 中 / 低价值与沉默用户;
- 活跃度评估:基于时间衰减加权的活跃度评分,划分高热 / 中热 / 低热 / 冰封;
- 兴趣标签:自动聚类玩家高频游玩的游戏类型,生成 TOP-N 兴趣标签;
- 玩家类型:硬核 / 休闲 / 尝鲜 / 收藏四类。
2.2 智能推荐
| 算法 | 原理 | 适用场景 |
|---|---|---|
| User-CF | 相似用户协同过滤 | 新游戏冷门、老用户 |
| Item-CF | 物品相似度协同过滤 | 依赖用户历史评分 |
| Content-Based | 基于游戏属性内容 | 缓解冷启动 |
| Popularity | 热门游戏流行度 | 新用户冷启动 |
| SVD | 矩阵分解隐因子 | 大数据稀疏场景 |
| Hybrid | 多算法加权融合 | 综合最优 |
2.3 数据分析与可视化
- 全局数据看板(用户数、游戏数、评分分布、热门游戏);
- 开发者 / 发行商 / 平台 / 价格 / 标签等多维度分析;
- KPI 趋势、发布年份趋势、类型趋势;
- 算法评估:Precision@K / Recall@K / F1@K / NDCG@K 多 K 值对比。
2.4 AI 助手(大模型接入)
- 全局浮窗 AI 助手 + 游戏详情页 / 玩家画像页场景化问答;
- 所有回答严格基于系统数据库真实数据,不编造信息;
- AI 接口(Key / 模型 / 地址)在「系统设置」页面由用户自行配置,源码不含任何真实密钥。
3. 技术栈
| 层次 | 技术 | 版本 |
|---|---|---|
| 后端 | Spring Boot | 2.7.14 |
| 持久层 | MyBatis-Plus | 3.5.3 |
| 数据库 | MySQL | 8.0+ |
| 前端 | Vue.js | 2.7.14 |
| UI 组件 | Element UI | 2.15.x |
| 可视化 | ECharts | 5.4.3 |
| 大模型 | 智谱 BigModel(GLM 系列) | 免费模型 |
| 构建 | Maven / npm / Vue CLI | 3.9+ / 18+ / 5.x |
4. 系统架构
┌────────────────────────────────────────────────────────────┐
│ 前端(Vue 2) │
│ 首页看板 │ 玩家画像 │ 智能推荐 │ 数据分析 │ 算法评估 │
│ 游戏搜索 │ 数据管理 │ 系统设置 │ AI 助手(浮窗) │
└──────────────────────────┬─────────────────────────────────┘
│ RESTful API(Axios,8081 → 8080)
┌──────────────────────────▼─────────────────────────────────┐
│ 后端(Spring Boot) │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Controller│ │ Service │ │ Mapper │ │ 算法服务 │ │
│ │ REST 层 │ │ 业务层 │ │ 持久层 │ │ 推荐/画像 │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│ - 统一返回 Result / 全局异常 / 跨域配置 │
│ - AI 服务:动态读取用户配置,调用大模型 API │
└──────────────────────────┬─────────────────────────────────┘
│ JDBC
┌──────────────────────────▼─────────────────────────────────┐
│ MySQL:game_recommend_db │
│ user / game / rating / rating_train / rating_test │
│ user_profile / evaluation_result / ai_settings 等 10 表 │
└────────────────────────────────────────────────────────────┘
AI 配置优先级:数据库配置(系统设置页面) > 环境变量 > 配置文件默认值,修改后无需重启服务。
5. 数据库设计
核心表共 10 张,关键设计如下:
| 表名 | 说明 |
|---|---|
user | 玩家表(购买数、游玩数、总时长、转化率) |
game | 游戏表(2.6 万+ 款,含名称、类型、价格、评分、评价等 40+ 字段) |
rating | 评分表(游玩时长分箱 → 1-5 分伪评分,支持逻辑删除) |
rating_train / rating_test | 训练集 / 测试集(按行为序列 8:2 划分) |
user_profile | 玩家画像表(RFM 评分、价值等级、活跃度、兴趣标签、玩家类型) |
evaluation_result | 算法离线评估结果表(Precision / Recall / F1 / NDCG) |
data_import_record | 数据导入日志表 |
game_alias | 游戏别名表(支持 CS:GO 等缩写搜索) |
ai_settings | AI 接口设置表(用户自行配置 API Key / 模型 / 地址,单行存储) |
特色设计:评分采用「游玩时长分箱 → 伪评分」方案,保留原始时长数据的同时解决评分稀疏问题;is_valid 字段实现逻辑删除,支撑数据清洗流程。
6. 核心实现(代码节选)
说明:以下仅展示具有代表性的核心代码片段,完整代码以实际项目为准。
6.1 用户协同过滤(User-CF):相似用户计算
// UserCFService.java(节选)
// 1. 计算目标用户与所有其他用户的余弦相似度
Map<Long, Double> similarities = new HashMap<>();
for (Map.Entry<Long, Map<Long, Integer>> entry : ratingMatrix.entrySet()) {
Long otherUserId = entry.getKey();
if (otherUserId.equals(userId)) continue;
Map<Long, Integer> otherRatings = entry.getValue();
double similarity = SimilarityUtil.cosineSimilarityInt(targetRatings, otherRatings);
if (similarity > 0) {
similarities.put(otherUserId, similarity);
}
}
// 2. 取 Top-K 相似用户
List<Map.Entry<Long, Double>> topKSimilar = similarities.entrySet().stream()
.sorted((a, b) -> Double.compare(b.getValue(), a.getValue()))
.limit(topK)
.collect(Collectors.toList());
6.2 混合推荐(Hybrid):多算法加权融合
// HybridService.java(节选)
// 各算法结果按 1/rank 计分,乘以权重后累加,最终按总分排序
private void addScores(List<Map<String, Object>> recommendations, double weight,
Map<Long, Map<String, Object>> allItems,
Map<Long, Double> scores) {
for (int i = 0; i < recommendations.size(); i++) {
Long gameId = (Long) recommendations.get(i).get("gameId");
double rankScore = 1.0 / (i + 1); // 1/rank 位置加权
scores.merge(gameId, weight * rankScore, Double::sum);
if (!allItems.containsKey(gameId)) {
allItems.put(gameId, recommendations.get(i));
}
}
}
// 默认权重示例:[User-CF, Item-CF, CB, SVD, Popularity] = {0.35, 0.25, 0.15, 0.15, 0.10}
6.3 AI 助手:用户自定义 API 配置(动态生效)
// AiSettingsService.java(节选)
// 计算「生效配置」:数据库优先,yml / 环境变量兜底
public AiConfig getEffectiveConfig() {
AiConfig effective = new AiConfig();
// 1. 复制 yml 默认值(环境变量可覆盖)
effective.setApiKey(aiConfig.getApiKey());
effective.setModel(aiConfig.getModel());
effective.setBaseUrl(aiConfig.getBaseUrl());
// ... 其余字段同理 ...
// 2. 数据库配置覆盖(用户在系统设置页面填写,无需重启)
AiSettings s = getSettings();
if (s != null) {
if (isValidKey(s.getApiKey())) effective.setApiKey(s.getApiKey());
if (s.getModel() != null && !s.getModel().trim().isEmpty()) {
effective.setModel(s.getModel().trim());
}
if (s.getBaseUrl() != null && !s.getBaseUrl().trim().isEmpty()) {
effective.setBaseUrl(s.getBaseUrl().trim());
}
}
return effective;
}
// API Key 脱敏展示:仅保留前 4 位与后 4 位
public String maskKey(String apiKey) {
if (!isValidKey(apiKey)) return "";
return apiKey.substring(0, 4) + "****" + apiKey.substring(apiKey.length() - 4);
}
# application.yml(AI 配置,默认 Key 为空,由用户自行填写)
game-rec:
ai:
enabled: true
api-key: ${AI_API_KEY:}
model: glm-4-flash-250414
base-url: https://open.bigmodel.cn/api/paas/v4
6.4 前端:设置页面保存逻辑(Vue 2)
// Settings.vue(节选)
async saveSettings() {
// 安全约定:输入框为空或与脱敏值相同 → 传空字符串,后端保留原 Key
const submittedKey = this.form.apiKey.trim();
const payload = {
enabled: this.form.enabled ? 1 : 0,
apiKey: submittedKey === '' || submittedKey === this.apiKeyMasked ? '' : submittedKey,
model: this.form.model.trim(),
baseUrl: this.form.baseUrl.trim(),
maxTokens: this.form.maxTokens,
temperature: this.form.temperature,
timeoutSeconds: this.form.timeoutSeconds
};
const res = await this.$axios.post('/ai/settings', payload);
if (res.data.code === 200) {
this.$message.success('AI 设置已保存,立即生效(无需重启服务)');
}
}
7. 项目目录结构
智能游戏推荐与玩家行为分析系统/
├── start.bat / start.ps1 # 一键启动脚本(构建 + 启动 + 开浏览器)
├── SETUP.md # 部署文档
│
├── game-recommend-system/ # 后端(Spring Boot)
│ └── src/main/java/com/xinyang/gamerecommend/
│ ├── controller/ # REST 接口层(10+ 控制器)
│ ├── service/ # 业务层(推荐算法 / 画像 / AI 等)
│ ├── ai/ # AI 助手模块(服务 + 配置 + 请求模型)
│ ├── entity/ mapper/ dto/ util/ # 实体 / 持久层 / DTO / 工具类
│ └── config/ # 跨域 / 全局异常 / MyBatis-Plus 配置
│
├── game-recommend-frontend/ # 前端(Vue 2 + Element UI + ECharts)
│ └── src/
│ ├── views/ # 11 个页面(看板 / 画像 / 推荐 / 分析 / 评估 / 设置等)
│ ├── components/ # AI 助手等 7 个通用组件
│ ├── api/ router/ utils/ styles/# 接口封装 / 路由 / 工具 / 设计令牌
│
├── sql/ # 建表 DDL + 索引优化 + 数据导入脚本
├── scripts/ # Python 数据处理 / 数据库工具脚本
├── data/ # 原始 CSV 数据集
└── generated-images/ # AI 生成的游戏封面图
8. 运行与部署
8.1 环境要求
| 组件 | 版本 |
|---|---|
| JDK | 17+ |
| Node.js | 18+ |
| MySQL | 8.0+ |
| Maven | 3.8+(可选,重新打包时用) |
8.2 启动步骤
# 1. 初始化数据库(建表 + 导入数据)
mysql -u root -p < sql/01_create_database.sql
python scripts/init_database.py # 导入 CSV 数据
# 2. 启动后端(端口 8080)
cd game-recommend-system
mvn spring-boot:run
# 3. 启动前端(端口 8081)
cd game-recommend-frontend
npm install
npm run serve
项目还提供
start.ps1/start.bat一键启动脚本,自动完成环境检查、构建、端口清理与服务启动。
8.3 访问地址
| 服务 | 地址 |
|---|---|
| 前端界面 | http://localhost:8081 |
| 后端 API | http://localhost:8080 |
9. 数据来源与版权声明
数据来源:
- 游戏基础数据:来自 Steam 平台公开游戏数据(通过 Kaggle 等公开渠道获取的 Steam 游戏数据集,包含游戏名称、类型、价格、评分、评价等元数据);
- 用户行为数据:为模拟生成的公开行为数据集(购买 / 游玩记录),不涉及任何真实用户个人信息;
- 游戏封面图:由 AI 工具生成的示意图片。
版权声明:
- 本项目代码为原创,仅用于学习交流与个人项目展示,请勿用于商业用途;
- Steam 及其游戏名称为 Valve Corporation 的商标,数据版权归原平台 / 原作者所有,本项目仅作学术研究使用;
- 大模型能力由智谱 AI 开放平台提供,接口调用请遵循其服务条款;
- 文中不包含任何真实 API Key、数据库密码或个人敏感信息,可放心用于开源与博客分享;
- 转载或参考本文档内容,请注明出处。
10. 总结
GameRec 项目完整实践了一条 数据 → 画像 → 算法 → 评估 → 应用 的推荐系统开发链路:
- 工程层面:前后端分离、分层架构、统一返回与异常处理、一键部署;
- 算法层面:6 种推荐算法实现与离线评估,覆盖冷启动与稀疏场景;
- 数据层面:完整的数据清洗、矩阵构建、画像计算的闭环;
- 应用层面:大模型 AI 助手、可视化分析看板,且密钥由用户自行配置,安全可开源。
如果你正在做推荐系统方向的设计或开发,这个项目从架构到算法实现都值得参考。
提示:本文档用于项目展示与交流,仅展示核心代码节选;如需完整代码与部署文档,可私信交流。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2302_80657338/article/details/166736157







