Spring Boot+微信小程序高校共享图书借阅系统实战解析
去年帮某高校的一位学弟做毕设对方只丢过来一句话“想做一个高校共享图书借阅的小程序后端用Spring Boot。”这句话听起来不难但真正动手才发现共享借阅这事儿背后藏着一整条业务链用户身份认证、图书发布与审核、借阅状态流转、逾期处理、消息通知还得应付小程序端各种诡异的兼容问题。这篇文章就把整个项目从需求到落地的过程完整拆一遍内容包括技术选型为什么是Spring Boot 小程序、数据库表怎么设计、核心接口怎么实现、小程序端怎么联调、最后上线要注意什么。适合正在做同类课题的人照着抄也适合想快速上手Spring Boot 微信小程序全栈开发的读者。1. 高校共享图书借阅小程序的项目画像与需求拆解1.1 这个题目到底在做什么把标题拆开看核心是“高校共享图书借阅”载体是“小程序”后端技术是“java基于springboot”。它的业务本质不是什么新鲜东西就是让高校里的学生把自己的闲置图书放到平台上其他学生可以检索、借阅、归还实现图书在校内循环流通。和校园图书馆系统最大的区别在于图书来源不是学校采购而是学生个人共享所以天然带有“C2C”的属性。这个定位决定了系统不能只做借阅管理还要处理图书共享者、借阅者、管理员三方之间的协作。比如一本图书被上传后要不要审核审核通过后谁来保管借阅者怎么联系到共享者归还后怎么确认图书完好这些问题在传统图书馆系统里根本不需要考虑但在共享模式下都是绕不开的细节。做项目时最容易犯的错就是一上来先写代码结果写到一半发现业务逻辑对不上。所以拿到这种题目第一步一定是把“人、书、流程”梳理清楚。1.2 需求拆解共享、借阅、高校三个词“高校”这个词给系统加上了很强的边界条件。首先是用户范围基本限定在校内学生和教职工所以需要学号/工号认证而不是像开放平台一样随便注册。其次是借阅半径图书需要在校园内流转所以校区、宿舍楼这类位置信息很有用方便共享者和借阅者约定取书地点。“共享”意味着每个用户都可以是图书的贡献者。这里要区分两个概念发布图书不等于直接挂卖而是“我愿意把这本书借给别人”。所以系统要支持个人书架管理、图书上下架、共享状态展示。上传图书时最好能通过ISBN自动填充书名、作者、封面等信息减少用户手动输入成本。“借阅”是整个系统的核心动作。借阅流程不是简单地把书从A手里给到B手里它包含申请、确认、取书、归还、评价等多个节点。系统必须记录每一本书当前在哪里、在谁手上、状态是否正常。这也是后文数据库状态机设计的动因。如果把需求做成一张功能清单大概长这样用户端微信登录、学号绑定、个人信息维护、我的借阅、我的共享、收藏、消息中心。图书端发布共享图书、图书检索、图书详情、扫码查看、借阅申请、确认借出、确认归还。管理端图书审核、用户管理、借阅记录查看、违规处理、数据统计。1.3 核心用户角色与主流程系统一共三类角色共享者、借阅者、管理员。一个人可以既是共享者又是借阅者这很常见。重点在于流程设计上要把“申请—确认—取书—归还—确认”这个链条走通。以一次完整的借阅为例借阅者在小程序里搜索图书查看详情确认可借之后点击“申请借阅”。系统创建一条借阅单状态为“待确认”同时通知共享者。共享者看到申请后可以选择“同意借出”或“拒绝”。同意后双方线下碰面取书共享者在系统里点击“确认已借出”借阅单状态变为“借用中”。借阅者阅读完后在小程序里点击“申请归还”状态变为“待归还确认”。共享者收到消息后确认图书完好并点击“确认归还”状态变为“已归还”。这个流程看起来清晰但每一步都要考虑异常情况申请被拒绝了怎么办借出去之后对方一直不还怎么办图书丢失了怎么办这些在设计阶段就要想清楚不能等编码的时候再临时拍脑袋。下面是简化版的角色权限边界共享者可以管理自己发布的图书、处理借阅申请、确认借出和归还。借阅者可以搜索图书、发起申请、确认归还、查看借阅历史。管理员可以审核图书、查看全平台借阅数据、处理纠纷、封禁违规账号。2. 技术选型决策Spring Boot 小程序的组合逻辑2.1 为什么后端选Spring Boot而不是其他框架技术选型不能只看“流行”要看团队熟悉度和项目场景。大多数高校项目团队对Java最熟而Spring Boot在Java后端里几乎是事实标准选它几乎没有试错成本。对比一下其他方案用Python的Flask/Django也完全能做但很多同学的Java课件、毕业设计模板、资料都是围绕Spring Boot展开的后续查资料、写论文都能省不少时间。Spring Boot真正的优势体现在这几个方面一是自动配置不用像Spring MVC那样写一堆xml配置文件起步快。二是生态成熟Spring Data JPA、MyBatis-Plus、Spring Security、Redis、RabbitMQ都有对应的starter项目做到后期要加缓存、加消息队列都方便。三是对小程序后端这种典型的JSON API服务支持很到位默认的Jackson序列化、Spring MVC注解、全局异常处理机制写接口效率非常高。在这个项目里我选了Spring Boot 2.7.x版本搭配MyBatis-Plus作为ORM框架。为什么不选JPA因为这类借阅系统查询条件很杂比如按书名模糊搜索、按状态筛选、分页排序MyBatis-Plus的条件构造器写起来更直观SQL也能自己控制出了问题好排查。2.2 小程序端为什么是微信小程序不是App/H5高校场景下用户的使用习惯是“即用即走”。微信小程序不需要下载安装扫码或者搜索就能打开传播成本低。相比之下独立App需要安装、需要维护两个平台对毕设项目来说工作量直接翻倍。H5虽然也可以但在调用微信登录、扫码、订阅消息这些能力时体验不如原生小程序自然。小程序端的技术方案也有讲究。目前主流有三条路原生小程序、uni-app、Taro。我当时选了原生小程序原因是项目本身不复杂页面数量大概在十五个以内原生开发足够。如果你还想打包成其他平台或者团队里有人更熟悉Vue那选uni-app会更合适。但要注意uni-app在自定义组件和第三方插件适配上有时候会踩坑调试成本并不比原生低。登录这块要重点说明小程序端用微信授权登录获取code后端拿着code调用微信的接口换取openid和session_key然后用jwt生成一个自定义token返回给小程序。注意不能直接把openid当token用一是没有过期机制二是接口一旦被抓包等于用户身份完全暴露。2.3 关键技术栈与版本约定这个项目的完整技术栈如下开发环境JDK 1.8、Maven 3.6、Node.js 16、微信开发者工具。后端Spring Boot 2.7.x、MyBatis-Plus 3.5.x、MySQL 8.0、Redis 5.x、JWTjjwt 0.9.x。小程序端原生微信小程序、Vant Weapp组件库、微信订阅消息。工具类Hutool、Lombok、Apache Commons Lang3。为什么MySQL要选8.0因为8.0对JSON字段、窗口函数的支持更好而且默认字符集utf8mb4能正确存emoji表情。图书备注里如果出现了特殊符号老版本utf8可能会有问题。Redis在这个项目里主要做两件事一是缓存图书检索的热点数据二是做借阅申请时的分布式锁防止同一本书被并发申请。项目规模不大这两个场景用Redis足够不需要再引入消息队列。版本选择上有个经验不要一上来就追最新版。Spring Boot 3.x虽然已经发布但要求JDK 17很多同学本机还是JDK 8而且3.x的javax换成了jakarta很多老教程直接作废。选2.7.x是最稳妥的网上资料最多遇到问题百度一下基本都能解决。3. 数据库设计表结构、状态机与并发控制3.1 实体关系梳理数据库设计是整个项目的根基。很多同学喜欢直接按页面反推表这种做法容易漏掉业务状态。我习惯先梳理实体关系再落到建表语句。核心实体有五个用户、图书、借阅单、收藏、消息。它们之间的关系如下用户与图书一对多一个用户可以共享多本图书。用户与借阅单借阅者角度一个用户可以发出多个借阅申请共享者角度一个用户可收到多个借阅申请。所以用借阅单表同时记录共享者ID和借阅者ID。图书与借阅单一对多一本图书可以有多条借阅历史但同一时间只能有一条“进行中”的记录。用户与收藏一对多。用户与消息一对多。画完关系图后会发现借阅单是整个系统最核心的表。它既要关联图书又要关联两个用户还要记录每个状态变更的时间点所以字段设计必须非常完整。3.2 核心表结构与字段设计下面挑几张核心表来说明。建表语句就不整段贴了字段设计更有参考价值。用户表t_userid主键自增。openid微信openid唯一。nickname昵称。avatar头像URL。student_no学号唯一可空。real_name真实姓名学号绑定时填写。campus所属校区。phone手机号。role角色1普通用户2管理员。status状态1正常0封禁。create_time、update_time。图书表t_bookid主键。isbnISBN号便于调用第三方API补全信息。title书名。author作者。publisher出版社。cover封面图URL。description图书描述。owner_id共享者ID关联用户表。status图书状态0待审核1可借2已借出3已下架4审核拒绝。location取书地点如“3号宿舍楼A栋一楼大厅”。borrow_count累计借阅次数。create_time、update_time。关键字段status一定要用数字存不要用字符串因为后续做条件查询和数据统计时数字比字符串更高效。另一个容易忽略的点是图书表里没有直接存“当前借阅者ID”这个信息要通过借阅单表查。原因是借阅单要记录完整的历史轨迹如果直接在图书表冗余一个current_borrower_id历史查询会变得很别扭。借阅单表t_borrow_recordid主键。book_id图书ID。borrower_id借阅者ID。owner_id共享者ID。status借阅状态0待确认1已同意待取书2借用中3申请归还4已归还5已拒绝6已取消7已逾期。apply_time申请时间。confirm_time共享者同意时间。borrow_time确认借出时间。return_apply_time归还申请时间。return_time实际归还时间。due_time应还时间。remark备注如“约好周三下午取书”。这张表加了两个索引一个复合索引(owner_id, status)方便共享者查看自己的待办另一个复合索引(borrower_id, status)方便借阅者查看我的借阅。表设计阶段就要考虑查询场景不要等SQL跑慢了再补索引。3.3 借阅状态机与超时释放策略借阅单的状态流转不能靠脑补最好画成状态机然后把状态迁移规则写进代码。状态机如下待确认 - 已同意 待确认 - 已拒绝 待确认 - 已取消借阅者发起 已同意 - 借用中共享者确认已借出 借用中 - 申请归还借阅者发起 申请归还 - 已归还共享者确认 借用中/申请归还 - 已逾期定时任务触发这里最容易出问题的是“待确认”和“已同意”这两个状态。比如借阅者提交申请后共享者一直不处理这条记录就会挂在那里。所以需要设定超时策略申请超过24小时未确认自动变为“已取消”同时释放图书的可借状态共享者同意借出后如果48小时内没有确认“已借出”自动取消并释放图书。这样做的好处是图书状态的变更始终有据可依不会出现一本书在系统里显示“可借”但实际已经被某个人占用了的情况。释放逻辑一定要放在借阅单状态变更的同时。如果你把“图书状态改为可借”和“借阅单状态改为已取消”分开写很可能因为某个接口报错造成数据不一致。并发控制方面最关键的是“一本书不能被多个人同时申请借阅”。解决方案有两种一是数据库层面用乐观锁在图书表加version字段update时带上version二是借阅申请前用Redis的setnx加锁。我推荐两种结合Redis锁拦住高并发请求数据库乐观锁兜底。这样即便Redis没锁住数据库更新时也会因为version不匹配而失败从而保证只有一个人能申请成功。4. 后端核心实现从登录到借阅全链路4.1 微信登录与Token认证后端的第一道关卡是登录认证。小程序端调用wx.login拿到code请求后端接口后端再用code调用微信的code2Session接口换取openid和session_key。微信接口调用建议封装成单独的服务类。用Hutool的HttpUtil发起请求然后解析返回的JSON。拿到openid后先查用户表是否已存在如果不存在就自动注册一个“未绑定学号”的账号存在则正常登录。登录成功后生成JWT返回给小程序。JWT的秘钥不要写在代码里要放到配置文件中并且要用足够长的随机字符串。payload里只放userId和role不放敏感信息。过期时间设置为7天到期后小程序端需要静默重新登录。拦截器是必须的。写一个WebMvcConfigurer注册HandlerInterceptor在preHandle里从请求头的Authorization字段取出token并解析。解析不到或者过期返回统一的401错误码。这里有个坑小程序端有时候会先加载页面再等登录完成导致部分请求在token还没设置好的时候就发出去了。解决方案是在小程序端加一个请求拦截器如果发现本地没有token先执行登录流程再放行请求。4.2 图书发布、检索与详情图书发布接口的入参包括ISBN、书名、作者、出版社、封面图、描述、取书地点。为了用户体验前端可以在用户输入ISBN后调用后端接口通过ISBN查询第三方图书API自动填充信息。但这块要加兜底第三方接口可能超时所以即使用户手填也要允许提交。图书发布后不能直接显示在“可借”列表里需要管理员审核。审核通过后status变为1可借。这里提醒一点上传封面图要使用对象存储比如阿里云OSS或腾讯云COS不要直接把图片存到MySQL的BLOB字段里。数据库只存URL图片上传接口单独写一个。图书检索用MyBatis-Plus的LambdaQueryWrapper实现。基本条件是status1可借然后根据关键字模糊匹配标题、作者、出版社。如果用户按校区筛选再加上campus条件。排序规则很重要默认按发布时间倒序如果图书借阅次数高可以按borrow_count升序优先展示这样能让共享者的书有更多被借的机会。图书详情接口需要返回基本信息、共享者信息、借阅状态。注意不要直接返回共享者手机号要在详情页设计“联系共享者”按钮点击后调用后端接口获取手机号并且记录一条消息。这样可以防止用户绕过平台直接私下交易。4.3 借阅、归还、续借的接口设计借阅申请接口路径可以定义为POST /api/borrow/apply入参是bookId和remark。接口内部逻辑顺序很重要校验图书是否存在且状态为可借。校验借阅者不是共享者本人。通过Redis分布式锁锁定bookId。再次查询图书状态防止期间状态变化。创建借阅单状态为待确认。将图书状态改为“锁定”这里可以加一个状态待确认时可借状态暂时改为“借出中”避免其他人看到还能申请。第6步很多人会纠结图书还在共享者手里改成“借出中”会不会误导实际上加了“待确认”状态后图书应该立刻不可申请。所以我建议把图书状态直接变为“借出中”或者新增一个“锁定中”。借阅单被拒绝后再恢复为“可借”。确认借用接口由共享者触发路径POST /api/borrow/confirm入参是recordId。执行时把借阅单状态改为“借用中”同时设置due_time为当前时间加30天。这里不要在前端计算到期时间日期计算放在后端统一处理避免用户修改本地时间造成数据错乱。归还申请接口是借阅者点“申请归还”状态变为“申请归还”。共享者看到后线下确认书没问题再点“确认归还”状态变为“已归还”同时把图书状态恢复为“可借”borrow_count加一。如果共享者发现书有损坏可以在备注里记录并拒绝确认归还这时候就需要管理员介入处理。续借功能不是必须的但如果要做建议限制只能续借一次续借天数不超过15天而且必须是在借阅状态为“借用中”且未逾期时才能申请。续借本质上就是更新due_time并记录一条操作日志。4.4 消息通知、逾期处理与定时任务高校共享借阅场景里消息通知是提升体验的关键。接入了微信订阅消息但订阅消息的特点是“一次性”用户点了同意授权后端才能发一条。所以不要在用户每次操作时都弹授权而是把授权时机放在“申请借阅”“确认借出”这些关键动作上。消息表t_message字段包括id、userId、title、content、type、isRead、create_time。站内信是保底即使微信订阅消息发送失败用户登录小程序后也能看到消息提醒。逾期处理必须靠定时任务。实现方式有两种Spring自带的Scheduled或者集成xxl-job。这个项目并发量不大用Scheduled足够。启动类加上EnableScheduling写一个定时任务类每五分钟执行一次查出所有状态为“借用中”且due_time小于当前时间的借阅单。将状态改为“已逾期”。给借阅者发送逾期通知内容包含图书名和应还日期。如果逾期超过7天给共享者发送提醒建议发起纠纷。定时任务的逻辑不复杂但要注意SQL性能。比如“查询所有借用中且due_time小于now”这种语句一定要在due_time和status上建联合索引否则数据量大了之后定时任务会拖垮数据库。4.5 全局异常、参数校验与接口安全后端的健壮性取决于异常处理。我用RestControllerAdvice ExceptionHandler做统一异常处理。自定义业务异常类BizException带有错误码和错误信息。接口里遇到业务不满足的情况直接throw new BizException(ErrorCode.BOOK_NOT_AVAILABLE)即可全局异常处理器负责把错误信息转成统一的JSON结构返回。统一返回结构非常重要。我定义了Result类包含code、message、data三个字段。成功时code为0业务失败时code为业务码系统异常时code为500。这样小程序端可以根据code做统一的错误提示不用每个接口单独判断。参数校验用javax.validation在Controller入参的实体类上添加NotBlank、NotNull等注解。但要注意小程序端传来的参数有时候会出现“空字符串”而不是“null”尤其是输入框没填时。前端要在提交前做一次trim后端除了加NotBlank还在业务代码里再做了一次StringUtils.isBlank判断双重保险。接口安全方面除了JWT认证和参数校验还要注意SQL注入。MyBatis-Plus的条件构造器默认防止注入但如果你自己写了SQL一定要用#{}而不是${}。另外所有列表接口都要做分页不能一次性查全表。MyBatis-Plus的Page对象可以直接传入LambdaQueryWrapper返回分页结果非常方便。5. 小程序端实现与前后端联调5.1 页面架构与路由设计小程序端的目录结构建议pages/login登录页pages/index首页图书推荐、搜索入口pages/book-list图书列表pages/book-detail图书详情pages/publish发布共享图书pages/my-books我的共享pages/my-borrow我的借阅pages/messages消息中心pages/profile个人中心pages/audit管理员审核页底部TabBar只需要四个入口首页、发布、消息、我的。发布按钮放中间可以做特殊样式但TabBar一定要选微信原生支持的配置不要自定义组件不然会出现切换时页面闪动。首页规划为一个图书推荐流数据来自后端的推荐接口。推荐逻辑可以简单一点优先展示最新发布、借阅次数多的书再按用户的默认校区过滤。页面顶部放一个搜索框点击跳转到图书列表页列表页支持关键字搜索和状态筛选。5.2 登录、扫码借书、图书详情交互登录页的逻辑比较绕建议这样处理进入小程序后先通过wx.login拿到code调用后端登录接口换取token然后用token请求“查询用户信息”接口。如果用户还没绑定学号个人信息接口会返回一个标识前端看到后就跳转到绑定页。绑定时需要输入学号和真实姓名后端可以对接学校的接口做校验但大多数毕设项目里直接存数据库、由管理员审核即可。图书详情页是整个小程序最复杂的页面包括图书封面、信息、共享者信息、借阅按钮。核心交互是“借阅申请”按钮点击后弹出确认框然后调用后端申请接口。如果成功按钮变成“已申请等待确认”。这个状态变化要交给后端返回的数据驱动不能只在前端本地改。因为如果别人已经借走这本书后端返回错误前端就要重新拉取图书详情刷新状态。扫码借书功能可以做一个加分项。管理员或者共享者扫码后直接进入图书详情页。实现上不需要自己写二维码生成小程序端可以用wx.scanCode扫码后端生成二维码时只需要把图书ID编码进去比如https://yourdomain.com/book?id123。这样扫码后进入详情页用户点“借阅申请”即可。5.3 联调中的“隐形坑”前后端联调是项目耗时最多的阶段这里集中说几个我踩过的坑。第一个是请求地址问题。小程序端不能用域名访问本地后端必须配置“不校验合法域名”。开发模式下可以在微信开发者工具里打开这个选项但真机预览时手机会默认校验合法域名。解决办法是绑定一个HTTPS域名或者用内网穿透工具临时调试。这个坑几乎每个人都会遇到如果不提前配置真机一调试就白屏。第二个是JSON字段格式问题。后端Long类型的id传到小程序端会丢失精度因为JavaScript的Number类型最大安全整数是2^53-1一旦超出精度就会出错。解决办法是在后端序列化时把Long类型统一转成String。可以在Jackson配置里把Long序列化为String或者用注解JsonSerialize(using ToStringSerializer.class)单独处理id字段。第三个是时间格式问题。后端返回的时间是Java的LocalDateTime默认序列化结果是“2025-01-05T12:00:00”小程序端new Date()解析这个格式在iOS上会报错但在安卓上是好的。所以统一在后端返回时间戳或者把Jackson的时间格式改成“yyyy-MM-dd HH:mm:ss”。这个差异非常隐蔽测试时一定要用iPhone真机跑一遍。第四个是请求拦截器的执行顺序。小程序端在App.onLaunch里异步调登录接口可是Page.onLoad里的接口可能已经发出了。此时本地token还没拿到所以请求会被拦截器拦住。解决办法是在登录接口的Promise调用中把页面请求放进队列等token获取成功后再统一放行。或者更简单一点把登录流程做成同步的PROMISE首页在拿到token后再加载数据。6. 部署上线与问题排查实录6.1 环境准备与服务器打包后端部署我建议用一台2核4G的云服务器就够跑。操作系统选CentOS 7或Ubuntu 20.04安装JDK 8、MySQL 8.0、Redis、Nginx。打包时用Maven命令mvn clean package -DskipTests生成jar包后通过scp上传到服务器用java -jar命令启动。为了让项目在服务器上常驻运行可以用shell脚本配合nohup启动或者用systemd服务管理。我更推荐systemd因为进程崩溃后能自动重启。写一个服务文件[Unit] Descriptionlibrary project Afternetwork.target [Service] ExecStart/usr/bin/java -jar /opt/library/app.jar --spring.profiles.activeprod Restarton-failure [Install] WantedBymulti-user.target生产环境的application-prod.yml要单独配置数据源密码、Redis密码都不能写在代码仓库里。可以用Jasypt加密配置文件或者在服务器上用环境变量覆盖。毕设项目的话用环境变量就足够了例如SPRING_DATASOURCE_PASSWORDyourpassword小程序端上线需要注册微信小程序账号、上传代码、提交审核。个人主体的小程序不支持开通微信支付和部分类目但图书借阅类目一般是可以的。审核的时候注意如果涉及“图书共享”这种UGC内容最好在详情里说明有内容审核机制不然可能被拒。6.2 高频问题与排查方法我在项目里遇到过各种奇奇怪怪的问题这里整理一个速查表问题现象可能原因排查方法小程序真机白屏域名未配置或未开启HTTPS登录页面控制台看请求是否失败配置合法域名登录接口返回401token过期或未设置请求头检查本地token检查拦截器是否给请求加AuthorizationISBN自动填充失败第三方接口超时或被限流后端打印日志确认依赖接口是否可用做降级处理图书申请成功后状态没变前端未重新拉取详情检查接口返回确认前端有刷新逻辑定时任务不执行忘记加EnableScheduling检查启动类注解看日志中是否有调度输出日期显示少8小时时区配置问题MySQL连接串加serverTimezoneAsia/Shanghai并发借阅同一本成功两次分布式锁或乐观锁失效检查Redis锁key是否唯一检查version字段是否更新排查问题的时候日志最重要。建议后端启动时把日志级别调成DEBUG但生产环境用INFO。遇到问题先在本地复现再一步步打日志缩小范围。不要一上来就改代码先把请求参数和返回结果打印出来十有八九是参数对不上。6.3 优化建议与个人踩坑体会这个项目如果只是应付答辩做到这步基本够了。但如果你想把它当作品集项目还可以做几个优化方向一是检索能力提升。现在用的是MySQL模糊查询数据量小没问题但如果图书数量上千搜索响应就会变慢。可以引入Elasticsearch或者MeiliSearch做全文检索把图书索引和搜索分离。不过在毕设体量下这个优化的意义不大再说清楚就行。二是借阅信用体系。可以给用户增加信用分功能按时归还加分逾期扣分信用分过低不能借书。这块能很好体现你对产品逻辑的思考答辩时非常加分。三是数据统计分析。管理员后台加一个统计页面用ECharts展示每日借阅量、热门图书Top10、共享贡献榜。把MySQL的聚合查询练熟这个功能几天就能做完。最后说点个人的实际操作体会。这个项目表面上是技术题但真正难的是把借阅流程定义清楚。我陪着学弟改了三版状态机才算稳定。第一版只设计了四个状态结果发现共享者拒绝申请后图书状态没恢复书就这样“消失”了。第二版加了逾期状态但没用定时任务去驱动导致逾期单永远卡死。第三版才把自动释放、定时扫描、消息通知全部串起来。所以我还是那句话不要急着写代码。把状态机画清楚把每条状态迁移产生的影响想明白再动手写。Spring Boot和小程序本身都不难难的是把业务规则落地成稳定可靠的系统。希望这篇拆解能让你少走点弯路。