在信息爆炸的时代,我们每天都被海量的新闻内容包围。作为一名长期关注技术应用的开发者,我发现传统新闻平台存在三个显著痛点:一是"千人一面"的推送方式无法满足个性化需求;二是用户与内容缺乏有效互动;三是后台管理效率低下。这正是我选择开发智能新闻推荐系统作为毕业设计项目的初衷。
这个基于Java+SpringBoot的Web系统,通过算法推荐引擎和高效管理后台的有机结合,实现了新闻内容的精准分发与全流程管理。系统采用主流的前后端分离架构(SpringBoot+Vue),配合MySQL数据库,在保证性能的同时提供了良好的扩展性。从技术选型到功能设计,我都力求在毕业设计的框架内做出一个具有实际应用价值的作品。
选择SpringBoot作为后端框架主要基于三点考虑:
前端选用Vue.js则是因为:
数据库选择MySQL 5.7的原因:
系统采用经典的三层架构设计:
code复制表现层(Presentation Layer)
├── 前端:Vue.js + Element UI
└── 后端接口:Spring MVC
业务逻辑层(Business Layer)
├── 推荐算法服务
├── 用户行为分析
└── 内容管理服务
数据持久层(Persistence Layer)
├── MyBatis-Plus 数据访问
└── MySQL 数据存储
这种分层设计使得各层职责明确,当需要修改推荐算法时,只需调整业务层相关模块,不会影响其他层级的功能。
系统采用混合推荐策略,结合协同过滤与内容特征:
java复制// 基于用户的协同过滤算法核心代码片段
public List<News> recommendNews(Long userId) {
// 1. 获取用户历史行为数据
List<UserBehavior> behaviors = behaviorMapper.selectByUser(userId);
// 2. 计算相似用户
Map<Long, Double> similarUsers = findSimilarUsers(userId);
// 3. 生成推荐列表
return similarUsers.entrySet().stream()
.flatMap(entry -> getTopNews(entry.getKey(), 5).stream())
.distinct()
.sorted(comparingDouble(News::getHotScore).reversed())
.limit(10)
.collect(Collectors.toList());
}
实际开发中发现,纯算法推荐在新用户冷启动阶段效果不佳。为此增加了以下策略:
mermaid复制graph TD
A[管理员登录] --> B[填写新闻表单]
B --> C{自动保存草稿}
C --> D[提交审核]
D --> E[编辑审核]
E -->|通过| F[发布上线]
E -->|驳回| B
这个流程中特别需要注意:
用户行为数据收集采用埋点方案:
重要提示:用户隐私数据需要脱敏处理,行为数据应去标识化存储
用户表(user)
sql复制CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '加密密码',
`salt` varchar(20) DEFAULT NULL COMMENT '加密盐值',
`nickname` varchar(50) DEFAULT NULL COMMENT '显示名称',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`interests` varchar(255) DEFAULT NULL COMMENT '兴趣标签,逗号分隔',
`status` tinyint(4) DEFAULT '1' COMMENT '状态(0-禁用,1-正常)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
新闻表(news)
sql复制CREATE TABLE `news` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL COMMENT '新闻标题',
`cover_img` varchar(255) DEFAULT NULL COMMENT '封面图URL',
`content` longtext COMMENT '新闻内容(HTML格式)',
`category_id` int(11) NOT NULL COMMENT '分类ID',
`source` varchar(50) DEFAULT NULL COMMENT '新闻来源',
`publish_time` datetime DEFAULT NULL COMMENT '发布时间',
`status` tinyint(4) DEFAULT '0' COMMENT '状态(0-草稿,1-待审,2-已发布)',
`view_count` int(11) DEFAULT '0' COMMENT '浏览次数',
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`),
KEY `idx_publish` (`publish_time`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
索引优化:
缓存策略:
SQL优化示例:
sql复制-- 优化前
SELECT * FROM news WHERE DATE(publish_time) = '2023-06-01';
-- 优化后
SELECT * FROM news
WHERE publish_time >= '2023-06-01 00:00:00'
AND publish_time < '2023-06-02 00:00:00';
前端开发时遇到的典型跨域错误:
code复制Access-Control-Allow-Origin header is missing
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
当多个用户同时点赞时可能出现计数不准,采用Redis原子操作解决:
java复制public void likeNews(Long newsId) {
String key = "news:like:" + newsId;
// 使用INCR保证原子性
long count = redisTemplate.opsForValue().increment(key);
// 异步持久化到数据库
threadPool.execute(() -> {
newsMapper.updateLikeCount(newsId, count);
});
}
新新闻缺乏用户行为数据时推荐效果差,采用的解决方案:
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 1.8+ | 建议OpenJDK 11 |
| MySQL | 5.7+ | 需要配置utf8mb4字符集 |
| Redis | 5.0+ | 用作缓存和会话存储 |
| Node.js | 14.x | 前端构建依赖 |
| Nginx | 1.18+ | 反向代理和静态资源服务 |
bash复制mvn clean package -DskipTests
bash复制java -jar news-recommend.jar \
--spring.profiles.active=prod \
--server.port=8080
ini复制[program:news-recommend]
command=java -jar /path/to/news-recommend.jar
user=www
autostart=true
autorestart=true
stderr_logfile=/var/log/news-recommend.err.log
stdout_logfile=/var/log/news-recommend.out.log
bash复制npm run build -- --mode production
nginx复制server {
listen 80;
server_name news.example.com;
location / {
root /path/to/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
在实际开发过程中,我发现系统还有多个可优化点:
推荐算法增强:
系统性能提升:
管理功能完善:
这个项目从技术选型到功能实现都让我收获颇丰,特别是在处理高并发场景和算法优化方面积累了大量实战经验。对于想学习Java全栈开发的同学,我认为有几点特别重要:一是要理解业务需求背后的技术原理,二是要注重代码的可维护性,三是要培养解决问题的系统性思维。