SpringBoot+微信小程序打造电影交流社区实战
📅 2026/7/3 12:23:29
👁️ 阅读次数
📝 编程学习
1. 项目背景与核心需求
电影爱好者需要一个能够自由交流、分享观影体验的平台。传统的论坛模式在移动端体验不佳,而微信小程序凭借其轻量化和易传播的特性,成为构建电影交流社区的理想载体。本项目基于SpringBoot后端+微信小程序前端的技术栈,打造了一个功能完整的电影交流平台。
技术选型上,我们采用SpringBoot 2.7作为后端框架,主要基于以下考虑:
- 自动配置特性大幅减少XML配置
- 内嵌Tomcat简化部署流程
- Starter依赖管理让组件集成更便捷
- 完善的监控机制(Actuator)便于后期运维
数据库选择MySQL 5.7而非更新的8.0版本,主要因为:
- 5.7版本在企业环境中稳定性久经考验
- 对JSON类型的支持已满足业务需求
- 与现有运维体系兼容性更好
2. 系统架构设计
2.1 整体技术架构
系统采用经典的三层架构:
表现层:微信小程序(Vue.js) + 管理端H5 业务层:SpringBoot + Spring MVC + MyBatis 数据层:MySQL 5.7 + Redis缓存2.2 核心功能模块
2.2.1 用户端功能
- 电影信息浏览(分页查询+ES搜索)
- 影评发布与互动(富文本编辑+敏感词过滤)
- 个人收藏管理(Redis缓存优化)
- 消息通知系统(WebSocket实时推送)
2.2.2 管理端功能
- 电影信息CRUD(批量导入导出)
- 用户行为分析(基于Spring Batch的离线统计)
- 内容审核流程(状态机设计模式)
- 系统监控看板(SpringBoot Admin集成)
2.3 数据库设计要点
主要实体关系设计:
CREATE TABLE `movie` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `title` varchar(100) NOT NULL COMMENT '电影名称', `cover_url` varchar(255) NOT NULL COMMENT '封面图', `douban_score` decimal(3,1) DEFAULT NULL COMMENT '豆瓣评分', `description` text COMMENT '剧情简介', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), FULLTEXT KEY `ft_idx_title_desc` (`title`,`description`) COMMENT '全文索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `comment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `movie_id` bigint(20) NOT NULL, `user_id` bigint(20) NOT NULL, `content` text NOT NULL, `like_count` int(11) NOT NULL DEFAULT '0', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0-待审核 1-已发布 2-已删除', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_movie_id` (`movie_id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;3. 关键实现细节
3.1 微信小程序登录流程
// 微信登录Controller @RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private WxService wxService; @PostMapping("/wxLogin") public Result<LoginVO> wxLogin(@RequestBody WxLoginDTO dto) { // 1. 调用微信接口获取openid String openid = wxService.getOpenid(dto.getCode()); // 2. 查询或创建用户 User user = userService.getOrCreate(openid); // 3. 生成JWT令牌 String token = JwtUtil.generateToken(user.getId()); // 4. 返回用户基本信息 return Result.success(new LoginVO(user, token)); } }3.2 影评发布防刷机制
// 使用Guava RateLimiter实现限流 public class CommentService { private final RateLimiter rateLimiter = RateLimiter.create(2.0); // 每秒2次 @Transactional public Long publishComment(CommentDTO dto) { // 限流检查 if (!rateLimiter.tryAcquire()) { throw new BusinessException("操作过于频繁,请稍后再试"); } // 敏感词过滤 String filteredContent = SensitiveFilter.filter(dto.getContent()); // 持久化评论 Comment comment = new Comment(); comment.setMovieId(dto.getMovieId()); comment.setUserId(dto.getUserId()); comment.setContent(filteredContent); commentMapper.insert(comment); // 异步更新电影评论数 eventPublisher.publishEvent(new CommentEvent(comment)); return comment.getId(); } }4. 性能优化实践
4.1 缓存策略设计
采用多级缓存架构:
- 本地缓存(Caffeine):存储热点电影信息,TTL=5分钟
- Redis缓存:存储用户会话、排行榜数据,TTL=1小时
- MySQL:持久化存储,配合索引优化
缓存更新策略:
@CacheEvict(value = "movie", key = "#movieId") public void updateMovie(Long movieId, MovieUpdateDTO dto) { // 先更新数据库 movieMapper.update(/*...*/); // 异步刷新ES索引 esService.refreshMovie(movieId); }4.2 SQL优化案例
慢查询优化前:
SELECT * FROM comment WHERE movie_id = ? ORDER BY create_time DESC LIMIT 10;优化方案:
- 添加联合索引:
ALTER TABLE comment ADD INDEX idx_movie_time (movie_id, create_time) - 使用覆盖索引:
SELECT id, content FROM comment WHERE movie_id = ? ORDER BY create_time DESC LIMIT 10;5. 安全防护措施
5.1 接口安全设计
- 所有API采用HTTPS传输
- 敏感接口添加@PreAuthorize注解
@PreAuthorize("hasRole('ADMIN')") @PostMapping("/movie/audit") public Result<?> auditMovie(@RequestBody AuditDTO dto) { // 管理员专属逻辑 }- 使用Spring Security配置防护:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/admin/**").hasRole("ADMIN") .antMatchers("/api/**").authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())); } }6. 部署方案
6.1 服务器配置建议
最低生产环境要求:
- 2核4G云服务器(推荐阿里云ECS)
- CentOS 7.6+ 操作系统
- MySQL 5.7 独立实例(2核4G)
- Redis 5.0+ 缓存服务
6.2 Docker部署示例
后端服务Dockerfile:
FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]启动命令:
docker run -d -p 8080:8080 \ -e "SPRING_PROFILES_ACTIVE=prod" \ -e "MYSQL_URL=jdbc:mysql://mysql:3306/movie" \ --name movie-backend \ movie-backend:1.07. 踩坑经验分享
- 微信小程序图片上传问题:
- 需要配置服务器域名白名单
- 超过1MB的文件需要压缩处理
- 建议使用COS存储而非本地存储
- 事务失效的常见场景:
- 同类方法内调用(需通过AopContext解决)
- 异常类型非RuntimeException
- 方法访问权限非public
- MyBatis批量插入优化:
// 错误做法:循环中单条insert // 正确做法:使用批量插入 <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO comment (...) VALUES <foreach collection="list" item="item" separator=","> (#{item.movieId}, #{item.userId}, ...) </foreach> </insert>- 时间字段处理建议:
- 数据库使用datetime类型
- 前端传递时间戳而非字符串
- 统一设置时区:
spring.jackson.time-zone=GMT+8
8. 扩展优化方向
- 推荐算法集成:
- 基于用户行为的协同过滤
- 使用Apache Mahout实现
- 离线计算+实时推荐结���
- 弹幕功能实现:
- 使用WebSocket协议
- 消息队列削峰填谷
- 敏感词实时过滤
- 小程序分包加载:
- 主包只保留核心页面
- 影评模块单独分包
- 按需加载资源
- 监控体系建设:
- Prometheus采集指标
- Grafana可视化看板
- 关键业务告警配置
这个项目从技术选型到最终上线,完整实践了现代Web应用的开发流程。特别需要注意的是,微信小程序与后端接口的联调过程中,要特别注意域名配置和签名验证问题。在实际运营中,建议每天定时备份数据库,并对接口访问日志进行监控分析
编程学习
技术分享
实战经验