这段时间帮人把一个中小学生阅读平台从零到一搭上线,小程序端、后端接口、推荐策略和管理后台都走了一遍。整个流程跑下来,最深的感受是:这种带"个性化"字样的项目,真正的难点不在书库管理,而在怎么把推荐策略做得既有逻辑又不过度复杂,同时还得保证数据上报、登录授权这些基础链路稳得住。这篇就把这个项目里我认为值得展开的技术决策、实现思路和踩坑过程拆开讲一讲,如果你也在做类似的小程序项目,或者正准备做小程序方向的设计与实现,应该能少走不少弯路。
这个项目的定位很简单:面向6-15岁的中小学生,按年龄、阅读兴趣和阅读记录给学生推荐合适的图书,同时支持阅读打卡、时长统计、阅读报告生成。小程序端负责登录、书库浏览、阅读记录和个性化推荐展示;后端负责用户管理、图书管理、行为上报、推荐策略计算和报告数据聚合。技术栈选的是原生微信小程序加Spring Boot加MySQL,这个组合在中小型项目里最稳,文档多、排错容易,也方便后续扩展。
1. 一开始不要把系统做成"书架加搜索":架构设计阶段我做的几个关键决策
很多阅读类项目开工会直接扑到图书列表页上去,页面写完了才发现"个性化"根本落不了地。我在设计阶段最庆幸的一件事,是把用户兴趣画像和数据上报单独拎了出来,作为和图书管理并列的核心模块。因为个性化推荐的输入不是书单本身,而是用户的行为数据和兴趣标签,这两块如果不在架构里提前留位置,后面想加会非常痛苦。
1.1 需求拆解:阅读平台的核心不是书库,是"个性化"
"个性化"这三个字,落到实际需求上其实可以拆成四层:
- 第一层是基础身份识别。用户是谁,几年级,家长还是学生本人,这决定了内容分级的基调。
- 第二层是兴趣建模。学生喜欢什么类型的书,玄幻还是科普,冒险还是校园,这些信息需要显式采集(注册时选标签)和隐式采集(阅读行为)两条腿走路。
- 第三层是推荐策略。基于前两层的数据,计算每本书对该学生的推荐分数,并从书库中召回合适的结果。
- 第四层是反馈闭环。推荐之后,学生看了、没看、看完、中途放弃,这些结果要回流到画像里,让下一次推荐更准。
我见过不少项目把大量精力花在书库美化上,书封、详情页做得花团锦簇,但推荐接口只是简单按分类列表返回,用户看到的内容和"个性化"三个字毫无关系。与其这样,不如在需求阶段就跟自己确认清楚:这个平台的核心价值是帮学生在海量图书中找到愿意读下去的书,而不是把书架搬上线。
1.2 技术选型:为什么选原生小程序加Spring Boot,而不是uni-app加云开发
选型这件事,很多新手的误区是追新追热。我当时评估过三套方案:
- 原生微信小程序加Spring Boot加MySQL。优点是小程序端调试直观、微信生态能力接入最省事;后端用成熟框架,权限控制、事务管理、定时任务都好做;MySQL在数据规模不大时完全够用,查询也直观。
- uni-app加Spring Boot加MySQL。优点是多端复用,如果将来要做App或H5可以省不少事。但中小学生的阅读场景有很强的"家长协同"属性,家长端用H5或公众号内嵌页面就够了,没必要硬上多端,反而增加跨端的兼容性调试成本。
- 小程序云开发。优点是省去服务器和备案,数据操作走云函数即可,适合轻量原型。但本项目涉及定时推荐、报告聚合、可能的批量导入图书数据,云函数在长任务和复杂事务上并不顺手,尤其到后期要接第三方ISBN书库或者做精细化权限控制,云开发的约束感会比较强。
最终选了原生小程序加Spring Boot。小程序端不用额外框架,导航栏、下拉刷新、订阅消息这些原生能力直接用最顺手;后端按模块化结构组织,controller、service、mapper分层清晰,后面写设计文档也好展开。有一点值得提醒:如果你将来打算把项目作为毕业设计或课程设计提交,这种经典技术栈在"可行性分析"和"技术路线"部分是最好写、最好答辩的,因为每个模块都有成熟的参考方案。
1.3 项目目录与数据流:让每个模块的边界一开始就清楚
我在后端按业务域划分了模块,而不是按三层架构平铺。这样做的原因是阅读平台的功能耦合度不高,按业务域组织代码,后续每个模块能独立演进:
- user模块:登录、资料、年级、兴趣标签
- book模块:图书信息、分类、标签、书单
- reading模块:阅读记录、打卡、时长上报
- recommend模块:推荐策略、推荐结果缓存、冷启动逻辑
- report模块:阅读报告数据聚合、分享卡片生成
- admin模块:图书入库、用户管理、数据统计
小程序端页面对应七个主页面:登录页、首页(推荐流)、书库页、书籍详情页、阅读页(WebView或富文本)、我的页(个人中心)、报告页(报告和个人统计)。
数据流方面,最核心的一条链路是:学生在阅读页停留、翻页或点击"读完本章"时,前端会向reading模块上报行为数据;后端收到后写入阅读记录表,同时异步更新用户兴趣画像表;当学生进入首页或书库页请求推荐时,recommend模块从画像表和图书标签表计算推荐分数,取TopN返回。这条链路是项目的生命线,所以
