尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

微信小程序畅阅读管理系统:从需求到部署的毕设全栈实践

微信小程序畅阅读管理系统:从需求到部署的毕设全栈实践 这段时间后台一直有人问微信小程序方向的项目怎么做今天就拿我最近整理完的一个完整项目出来聊聊——基于微信小程序的畅阅读管理系统。这套项目是我早前带学生做毕业设计时从零搭起来的前后端代码完整文档和论文说明也一并整理好了。如果你正在纠结毕设选题或者想拿小程序练手但又不想做那种烂大街的商城、点餐系统这个阅读管理系统是个非常合适的切入点。先把这个项目是什么说清楚。畅阅读管理系统核心解决的是“读书这件事怎么被数字化管理”的需求。用户端是一个微信小程序提供图书浏览、搜索、收藏、阅读记录、书签、笔记摘录、阅读时长统计等功能管理端是一个Web后台给管理员用来管理书籍、用户、评论、统计数据。整一套就是典型的“小程序Spring Boot后端MySQL数据库”三段式结构也是目前毕业设计里最稳、最容易讲清楚、工作量又饱满的组合。这个项目拿来做什么用往小了说一份合格的毕设往大了说小程序前后端联调的全流程你都摸了一遍。涉及的知识点覆盖了微信生态API、权限认证、RESTful接口设计、数据库表结构设计、报表统计等面试聊项目的时候素材也足够。下面我把整个项目从需求拆解到上线避坑按实际开发顺序一条条展开讲。1. 项目整体设计与需求拆解1.1 用户角色和核心业务流程做管理系统第一步不是写代码而是把角色和流程理清楚。畅阅读管理系统的用户分两类普通微信用户和系统管理员。普通用户通过微信授权登录小程序进入系统后可以做这些事浏览推荐书籍、按分类找书、搜索书名或作者、查看书籍详情、收藏书籍、开始阅读内置文本阅读器、写读后感笔记、记录阅读进度、查看个人阅读统计、参与书籍评论。管理员则是通过Web后台登录系统负责书籍上下架管理、书籍分类维护、用户列表冻结/解封、评论审核与删除、阅读数据概览、每日活跃统计。这里有一个容易被忽略的地方图书阅读本身的内容版权问题。我的处理方式是把它定位成“个人藏书管理阅读笔记记录”工具而不是内置海量盗版电子书。书籍信息、封面、简介可以从公开书库API导入阅读器支持用户自己录入或导入文本内容。这样避免了版权争议也能把管理系统的核心功能讲完整。做毕设的同学一定要留意这点答辩时老师也很喜欢问。1.2 功能模块拆解整个系统我拆成了六个核心功能模块这也对应论文里的功能结构图用户认证模块微信登录、Token签发与校验、管理员账号登录图书管理模块图书列表、分类筛选、关键字搜索、图书详情、收藏/取消收藏阅读管理模块阅读器界面、字号/背景调节、阅读进度记录、书签添加删除笔记评论模块读书笔记新增/编辑/删除、书籍评论、评论点赞数据统计模块用户阅读总时长、图书热度榜、每日/每周阅读趋势系统管理模块管理员对书籍、分类、用户、评论的管理操作每个模块之间是解耦的接口设计也是按资源来划分。这样做的好处是开发时可以并行推进论文里画模块图的时候也特别清晰每个模块都能单独拎出去讲。2. 技术选型和系统架构2.1 为什么选微信小程序而不是App或H5这个选择既是题目的要求也是很合理的方案。微信小程序相比原生App最大的优势是免安装、用完即走用户在微信里扫码或搜索就能打开。这对于阅读这种高频但轻量的使用场景非常契合——用户随时点开看两页写一条笔记不需要额外下载一个App。和H5相比小程序有自己的原生API能力比如微信授权登录直接拿openid、本地缓存、分享朋友圈、订阅消息提醒这些是H5很难顺畅实现的。小程序端的开发方式我选了微信原生语法WXMLWXSSJS没有用uni-app或Taro。原因很直接毕业设计要展示你对小程序本身的理解如果直接用跨端框架老师一问到小程序生命周期、原生组件适配就容易被问住。原生写法虽然多写几行代码但你能把每一步的逻辑都讲清楚项目的“含金量”反而更高。2.2 后端框架选型后端我选的是Spring Boot 2.7 MyBatis Plus MySQL 8.0。这套组合目前在国内中小型项目里占据绝对主流网上资料多踩坑帖子也多对新手极度友好。Spring Boot负责对外提供JSON接口MyBatis Plus负责数据库的CRUD操作大大减少了手写SQL的工作量。为什么不用JPA我个人经验是JPA在复杂联表查询和导师提问环节比较吃亏MyBatis Plus的selectPage、LambdaQueryWrapper简直就是为管理系统量身定做的代码写起来简洁面试和答辩时也更容易解释。2.3 整体架构分层项目采用经典的前后端分离架构小程序端用户 ──HTTP/JSON── Spring Boot后端API ── MySQL数据库 后台管理端管理员 ──HTTP/JSON── Spring Boot后端API ── MySQL数据库后端内部仍然按三层架构组织Controller层接收请求参数并返回统一结果封装Service层负责业务逻辑处理Mapper层负责数据库操作。这里我额外做了一个GlobalExceptionHandler统一处理参数校验异常、业务异常、未知异常。这个小细节在答辩时很加分能体现你考虑到了代码的健壮性。统一返回结果类我用的结构是{ code, msg, data }code200表示成功code400表示参数错误code401表示未认证code500表示服务器异常。小程序端封装了一个request.js统一拦截非200的响应并弹出提示这样前端处理错误只需要写一遍。3. 数据库设计与核心表结构3.1 数据库设计原则管理系统类的项目数据库设计是整个项目的地基。地基没打好后面的统计SQL写起来想哭。我的设计原则是每个业务实体一张表表名字段名清晰易懂不做过度设计但要预留扩展字段。畅阅读管理系统一共有7张核心表用户表、书籍表、分类表、收藏表、阅读记录表、书签表、笔记表。评论和点赞我合并到了笔记相关的表中简化了表数量但功能不缺失。3.2 核心表字段说明用户表t_userid主键自增openid微信用户openid唯一索引这是用户身份的全局凭证nickname用户昵称avatar用户头像URLrole角色标识1-普通用户 2-管理员total_read_time累计阅读时长秒status账号状态1-正常 0-冻结create_time注册时间书籍表t_bookid主键book_name书名author作者cover封面图URLcategory_id分类外键description内容简介content_url正文内容地址存的是小程序端可访问的文本资源路径word_count字数统计is_hot是否热门推荐status上架状态1-上架 0-下架这两张表我特别说一下设计时的考虑。openid加唯一索引是必须的因为微信登录每次都返回同一个openid没有唯一索引的话用户重复点击登录就会生成多条垃圾数据。total_read_time这个字段放在用户表而没单独建表因为商城类的徽章和排行榜都需要实时读这个值单表查询是最快的。如果你要统计数据历史变化趋势那就得另外建一张每日阅读统计表了。3.3 建表SQL示例这里给出图书表和阅读记录表的关键SQL其他表可以照着同样的风格扩展CREATE TABLE t_book ( id bigint(20) NOT NULL AUTO_INCREMENT, book_name varchar(128) NOT NULL COMMENT 书名, author varchar(64) DEFAULT NULL COMMENT 作者, cover varchar(512) DEFAULT NULL COMMENT 封面图, category_id bigint(20) DEFAULT NULL COMMENT 分类ID, description text COMMENT 简介, content_url varchar(512) DEFAULT NULL COMMENT 正文地址, word_count int(11) DEFAULT 0 COMMENT 字数, is_hot tinyint(1) DEFAULT 0 COMMENT 是否热门, status tinyint(1) DEFAULT 1 COMMENT 上架状态, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_category (category_id) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT图书表; CREATE TABLE t_read_record ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL COMMENT 用户ID, book_id bigint(20) NOT NULL COMMENT 书籍ID, read_duration int(11) DEFAULT 0 COMMENT 本次阅读时长秒, read_date date DEFAULT NULL COMMENT 阅读日期, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_date (user_id, read_date) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4 COMMENT阅读记录表;阅读记录表按“用户日期”建联合索引是为了支撑“每日阅读趋势”这个统计功能。如果不加这个索引数据量上来之后统计接口会非常慢一张表几万条数据就开始卡了。4. 小程序端核心功能实现4.1 微信登录与Token鉴权小程序端的登录流程是一个标准的“wx.login 换取openid 后端签发Token”三步走。需要注意的是微信官方已经在调整登录策略wx.getUserProfile接口现在的限制很多我的实现方式是先使用wx.login拿到code传给后端调用微信接口换取openid然后创建或更新用户记录最后签发一个自定义Tokenuuid字符串返回给小程序。用户昵称头像通过button组件的open-typechooseAvatar和nickname输入框来引导用户完善这样既解决了合规问题又能拿到真实的头像昵称。前端请求后端时在header里带上Authorization: Bearer token后端用一个拦截器校验Token是否有效。小程序端的每次请求都由统一封装的request.js发送不用每页单独处理Token逻辑。4.2 首页书籍推荐和搜索首页主要是信息流展示。顶部是一个搜索框下面是可以横向滑动的分类tab再下面是根据is_hot标记拉取的热门书籍列表下拉到底部自动加载下一页。这个页面最值得展开讲的是分类tab的逻辑。我没用swiper组件来联动页面切换而是点击分类后用SetData更新当前分类ID再重新请求对应分类的书籍列表。为什么这么做因为如果用swiper一次性创建多个滑动页面每个页面都要渲染书籍列表小程序一直保持多页面状态会比较耗费内存。简单项目不需要那种复杂交互牺牲一点动画效果换来的是代码清晰度和流畅度的提升。搜索功能用的是输入框防抖。防抖函数是自己在utils里写的300毫秒内只有用户停止输入才发出请求。这个小细节看起来很不起眼但接口压力差别很大总不至于用户打一个字就请求一次数据库吧。4.3 阅读器进度记录与时长统计阅读器是整个项目中“技术含量”最高的部分。它不是简单展示文本而是要把用户读到第几章、第几段、滚动位置记录下来下次打开能继续读。我的实现方案是这样的阅读器页面加载后先从后端拉取该用户名下这本书的最近一次阅读进度。用户滚动阅读时通过onPageScroll监听滚动位置切换章节时把当前章节ID和滚动位置scrollTop值保存到本地缓存同时上报到后端。上报时机不是每次滚动都触发而是防抖后每10秒一次和页面卸载时各上报一次。这样兼顾了实时性和请求次数。阅读时长统计这块我采用“累计增量上报”。前端在阅读器页面记录进入时间用户退出或切换页面时计算停留秒数通过一个单独接口上报给后端。后端的处理逻辑是User user userMapper.selectById(userId); user.setTotalReadTime(user.getTotalReadTime() duration); userMapper.updateById(user); ReadRecord record new ReadRecord(); record.setUserId(userId); record.setBookId(bookId); record.setReadDuration(duration); record.setReadDate(LocalDate.now()); readRecordMapper.insert(record);为什么要拆成两个操作一个更新用户表的累计时长一个向每日记录表插入一条流水。用户表用于排行榜和总时长展示每日记录表用于按时间维度绘制统计图表。如果只更新用户表不记录流水后面做“过去七天阅读趋势”的折线图时就没有数据可查了。4.4 笔记摘录与评论笔记功能我做成两种口径一种是在阅读器里选中文字后点击“做笔记”弹窗填写心得另一种是读完书后在书籍详情页直接写书评。笔记列表支持按书籍筛选和按时间排序也允许用户删改自己的笔记。评论功能支持发评论和评论点赞涉及多用户协作我做了一个简单的限制同一用户对同一条评论只能点赞一次点赞状态存在表里用唯一索引约束。这个逻辑虽然简单但能防止有人重复刷赞在答辩时可以当做一个亮点来提。5. 后端管理系统的实现5.1 管理员登录和权限控制管理端我不建议单独开发一个前台页面因为那意味着你要重新写一套Web前端。我这里的管理端是基于一个轻量级后台模板改的页面通过Ajax请求后端API功能上完全够用。管理员的权限控制区别于普通用户管理员登录走独立的登录接口后端校验账号密码后签发管理员Token管理端所有请求都需要校验这个Token且role必须为2。这个逻辑放在AuthInterceptor里统一处理新增管理接口时只要加注解即可。5.2 书籍上下架和分类管理后台的书籍管理核心是两个操作新增/编辑书籍、上下架切换。新增书籍时需要上传封面图和正文内容文件。封面图我先通过管理端上传到服务器指定目录然后把URL存到数据库。content_url存的是一个文本资源的路径小程序端通过wx.downloadFile把正文下载到本地后解析渲染。分类管理就是一个简单的树形结构表支持添加子分类。这个功能实现不复杂但论文里的功能结构图会显得很完整。5.3 数据统计与可视化统计模块是管理系统里的“锦上添花”部分也是简历上可以大写特写的内容。我做了三个维度总数据概览用户总数、书籍总数、笔记总数、今日新增阅读时长每日阅读趋势近7天或近30天的阅读时长折线图书籍热度排行按累计阅读时长排名的Top10书籍管理端用ECharts绘制图表后端提供对应的统计接口。例如近7天趋势的SQL可以这样写SELECT read_date, SUM(read_duration) AS total_duration FROM t_read_record WHERE read_date DATE_SUB(CURDATE(), INTERVAL 6 DAY) GROUP BY read_date ORDER BY read_date;对新手来说这条SQL就是“分组聚合”的典型教学案例。统计接口单独开一个/admin/stats路由与业务接口分离也方便论文里单独画一个小节来写。6. 项目源码和论文说明的使用指南6.1 如何把源码跑起来这套项目源码我整理得很完整但很多同学下载后第一步就卡住了所以这里写一个快速启动指南。小程序端下载微信开发者工具导入项目文件夹填入自己的小程序AppID如果没有AppID可用测试号代替。在app.js里修改后端接口地址把http://localhost:8080改成你自己电脑的局域网IP或云端服务器地址。注意微信开发者工具默认不校验合法域名开发阶段直接勾选“不校验合法域名”才能正常请求本地接口。后端用IDEA打开Spring Boot项目等待Maven依赖下载完成修改application.yml里的数据库账号密码执行项目根目录下的init.sql脚本建库建表最后运行主启动类。如果端口冲突把server.port改成8081小程序端记得同步改。后台管理端打开后台文件夹直接用浏览器访问index.html登录账号在数据库的t_user表里把某个用户的role改成2就能使用管理员权限。6.2 论文结构怎么组织论文说明文档里我写了一版可参考的目录结构在这里也分享给大家第一章 绪论研究背景与意义、国内外研究现状、研究内容与方法第二章 相关技术介绍微信小程序开发框架、Spring Boot框架、MySQL数据库、RESTful API第三章 系统需求分析可行性分析、功能需求分析、非功能需求分析、用例图第四章 系统设计系统总体架构、功能模块设计、数据库设计ER图表结构第五章 系统实现每个核心模块的界面截图关键代码解析第六章 系统测试测试环境、功能测试用例表、测试结果分析论文的关键不是堆字数而是每张图、每段代码、每张表都要能对上你的实际项目。比如数据库设计这一章直接把init.sql里的建表语句贴上去配一张用PowerDesigner画好的ER图这一章就很扎实了。6.3 答辩时容易被问的问题答辩时老师最爱追问的通常集中在选题意义、技术选型原因、核心难点解决方案这三个方向。我这里给你整理几个高频问题及回答思路“为什么用Token不用Session”——因为小程序端和后端是分离的Session依赖Cookie小程序无法维持传统的Session会话所以用Token在请求头中传递认证信息。“阅读时长是怎么统计的”——前端记录页面停留时间防抖后上报后端把增量累加到用户表总时长同时插入每日记录表。展示时段统计增量展示排行时读取总时长字段。“如果用户中途退出小程序阅读进度怎么保存”——小程序有onHide和onUnload生命周期页面隐藏时把当前章节和滚动位置上报后端下次进入时读取最近记录。6.4 基于二次开发的三条建议如果你拿到源码后想进一步延展我个人提供三个改造方向一是增加积分签到系统。用户每天签到获得积分连续签到额外奖励阅读时长达到一定门槛也可以折换积分积分用来兑换书币。这能把用户留存率这个指标的故事讲完整。二是增加订阅消息推送。用微信订阅消息给用户推送“您收藏的书籍已上架”“本周阅读报告已生成”等模板消息。这块属于微信开放平台的增量能力能增加项目的技术新颖度。三是增加社交排行榜。好友之间按照本周阅读时长排名实现拼多多那种“周报社交分享”的模式增加小程序的传播性。排行榜的SQL就是GROUP BY user_id ORDER BY SUM(read_duration) DESC技术难度不大但社交属性的想象力空间很大。7. 常见问题与避坑记录这里整理一下开发和调试过程中最常见的几类问题每一个都是我实际踩过的坑写出来帮你跳过。7.1 微信开发者工具请求不到后端接口这个问题出现频率最高。症状是前端请求发出去Network面板显示statusCode: -1或errMsg: request:fail。原因基本分三种一是工具没勾选“不校验合法域名”开发调试模式下必须去详情页勾上二是后端服务没启动或者改了端口后前端没同步修改app.js里的baseUrl三是电脑防火墙拦截了局域网访问手机预览时尤其常见解决方法是关闭防火墙或做端口放行。另外注意真机调试时localhost是手机自己必须改成电脑的局域网IP。7.2 数据库中文乱码建库的时候没指定字符集或者连接串缺少characterEncodingutf8就会导致中文存进去变成问号。我的init.sql里已经全部指定了utf8mb4但你后续自己新增表的时候一定要记得带上。连接串里加上?useUnicodetruecharacterEncodingutf8Spring Boot MySQL 8的配置别忘了时区参数serverTimezoneAsia/Shanghai否则插入时间会差8小时。7.3 小程序端真机预览白屏开发者工具上一切正常一到真机就白屏这个问题的排查思路是打开调试模式看Console报错。绝大多数情况出在以下三处接口请求被合法域名校验拦截真机无法像工具那样勾选跳过需要在小程序管理后台配置request合法域名使用了不支持的ES6语法图片或文件用了本地路径而真机上没有这个文件。我自己遇到最多的是第一种。正式发布前你需要把后端接口所在服务器的域名配置到微信公众平台的“开发管理-服务器域名”里而且必须是没有备案问题的HTTPS域名。做毕设演示时如果没备案的HTTPS域名建议直接用开发者工具的“预览”二维码功能发到手机上看效果但仍然会受域名限制稳妥的方案是找一台有备案域名的测试服务器部署后端。7.4 页面滚动和阅读进度下拉错乱阅读器页面最容易出的bug是滚动到底部自动加载下一章后页面回跳到顶部然后又继续滚动。解决思路是先记录加载前的滚动位置等下一页内容渲染完成后用wx.pageScrollTo滚回原位置。另外onPageScroll在快速滚动时会频繁触发一定要做节流处理否则SetData频繁更新会导致页面卡顿甚至闪退。这类联调问题七七八八我踩过太多但换个角度看每个坑都是很好的论文测试用例素材。我在论文的“系统测试”里就专门列了一张表把类似上述的故障现象、原因分析、解决方案写进去测试章节看起来非常有说服力。8. 项目延展与个人心得做完这套系统之后我的一个核心体会是管理系统的难点从来不在单点技术而在数据关系和流程闭环。用户登录—记录阅读—累积时长—展示排名这条链路看起来简单但每一步都需要前后端密切配合任何一个环节断开系统的“管理”价值就体现不出来。从我自己带项目的经验来看能在源码基础上真正做出增量的人往往不是基础最好的而是愿意反复打断点、读日志、跟前端联调的人。小程序端的坑比想象中多但兜兜转转把一条完整链路跑通之后你对“一个项目从零到上线”的全部环节就都有了体感。这套畅阅读管理系统源码、数据库脚本、后台管理端、论文说明文档、答辩PPT模板都打包好了。如果你打算拿它当毕设或者项目经历强烈建议不要只停留在“跑起来”这个层面选一个我上面提到的延展方向自己动手改一改。改完一遍之后你就能底气十足地在简历上写独立设计并开发了一款基于微信小程序的阅读管理系统实现了从需求分析、数据库设计、前后端开发到部署上线的全流程实践。我个人最推荐的改造方向是微信订阅消息推送。原因很简单——市面上绝大多数毕设项目都没做这块你做了含金量立马不一样而且模板消息的代码量不大花一个周末就能搞定。剩下的社交排行榜和积分签到可以根据你的精力再决定。项目本身是死的思路是活的这大概是这份源码能带给你的最大价值了。
返回列表