简介:面向高校计算机相关专业的鲜花销售微信小程序毕业设计源码包,覆盖首页、个人中心、用户管理、商家管理、鲜花信息管理、鲜花分类管理、管理员管理及系统管理等核心功能模块。项目采用Java技术栈与SSM框架,小程序端支持uniapp与原生开发,数据库使用MySQL 5.7,技术结构完整,适合需要快速落地全栈毕设方案或系统学习小程序开发的人群。资源包内含1341个文件,涵盖后端Java源码、前端Vue与JS脚本、小程序页面文件、数据库SQL脚本、XML配置、说明文档和演示文稿,整体大小约20.28MB。资源按前后端和数据库分层组织,检索方便;文档对设计思路和核心模块作了说明,便于理解整体实现。目前已有85人学习浏览,对正在准备毕设答辩或课程设计展示的同学有直接参考价值。下载后即可获得一套可运行验证的完整项目,以及用于需求分析和功能讲解的配套文档,是高效完成鲜花销售类小程序课题的实用素材。
1. 一款能直接跑起来的鲜花销售微信小程序,到底解决了什么
如果你正在找一套能拿来当毕业设计的鲜花销售微信小程序,大概率见过那种「完整前后端 + MySQL + 说明文档 + LW」的压缩包。这套东西的核心价值不是代码多华丽,而是把一条真实交易链路完整摆在你面前:用户从小程序里登录、刷花、加购物车、下单、在后台管理商品和订单,每一个环节都有请求、有落库、有状态流转。适合三类人:想快速交付毕设的高校学生,刚入门小程序前后端联调的开发者,以及想基于一套标品改造出自己鲜花商城的运营者。
它能解决的最大痛点其实是「从零搭到能演示」这段路太漫长。很多同学不是不会写代码,而是卡在环境配置、前后端端口、数据库字符集这些细碎问题上,一个晚上搭不起来,后面全崩。这套完整源码的价值就在于此:结构清楚、文档齐全,你只需要把它跑起来,再按自己的理解改业务,就能在短时间内拿到一个能演示、能讲原理、能过答辩的项目。接下来我从选型、结构、数据库、启动步骤、核心代码和踩坑六个方面,把这套东西完整拆给你看。
2. 拆源码包先看架构:为什么是「原生小程序 + Spring Boot + MySQL」这个组合
2.1 技术栈选型不是玄学:从答辩得分和落地稳定性两个维度看
市面上的小程序商城源码,前端常见有三类:微信原生小程序、uni-app 跨端框架、Taro 等 React 系框架。后端常见有 Spring Boot、Node.js(Express/Nest)、Python(Flask/Django)。这套以「鲜花销售微信小程序」命名的毕设源码,绝大多数情况下走的是原生小程序 + Spring Boot + MySQL 的路线,这个组合在高校毕设语境里几乎是标准答案。
为什么这套组合最稳?第一,原生小程序不需要额外编译层,微信开发者工具打开就能改,WXML、WXSS、JS 都是微信官方语法,答辩时老师问「这个组件怎么实现的」,你能直接定位到具体文件和代码行;第二,Spring Boot 在 Java 生态里属于「约定大于配置」,一个@RestController就把接口暴露出来了,事务、拦截器、参数校验都有现成注解,写起来快,讲解时也有话可说;第三,MySQL 是关系型数据库里资料最多、最容易被老师认可的,班级里十个人有八个用的 MySQL,遇到问题网上随便搜都有答案。
如果你拿到的源码后端是 Node.js 或别的语言,先别急着换。毕设评审看的不是你用了多新的技术,而是你能不能讲清楚「为什么这么选」。原生小程序 + Spring Boot + MySQL 的最大优点是每个环节都有大量可查资料,踩坑成本最低。我见过有同学为了追求时髦,用微服务拆了四五个模块,结果答辩现场服务起不来,连演示都做不完,这种翻车是最可惜的。一个小程序商城,单体应用足够,拆微服务反而给自己挖坑。
2.2 源码包的目录结构:前端、后端、数据库脚本、说明文档各放在哪
拿到压缩包,先不要急着双击运行,第一步是把目录结构看清楚。我一般会先把.zip解压到一个全英文路径下,比如D:/flower-shop,然后按「前端、后端、数据库、文档」四个维度把文件归类。不同来源的源码包命名习惯不完全一样,但核心内容基本逃不出下面这几类。
| 目录/文件 | 常见命名 | 里面装什么 |
|---|---|---|
| 小程序前端 | miniprogram、wechat-app、frontend | WXML/WXSS/JS 页面、app.js、project.config.json |
| 后端服务 | server、backend、springboot | Maven 工程、src/main/java、application.yml |
| 数据库脚本 | sql、database、flower_shop.sql | 建库建表语句、初始数据 |
| 说明文档 | README、说明文档、开发文档 | 环境要求、启动步骤、接口说明 |
| LW 目录 | LW、论文、lunwen | 毕业论文、开题报告、答辩 PPT 素材 |
这里想特别提醒一点:LW 目录里的论文文档是整个包最容易被人忽略,但又最值钱的部分。很多同学拿到源码只顾着跑代码,等到写毕业论文时才开始编系统设计,其实文档里通常已经把选题背景、需求分析、数据库设计、系统测试这些章节写好了骨架。你可以以它为底稿,用自己的话重写一遍,并配上自己实际跑通的截图,这样论文和代码才是真正对得上的。不要直接照搬,至少把数据流、接口路径、页面名称改一致,不然答辩时老师随便问一个类名你都不知道在哪。
2.3 数据库怎么建:商城的 8 张核心表与字段设计思路
鲜花商城这种业务,数据库表设计其实是有固定套路的。无论源码包的 SQL 文件叫什么名字,你打开后大概率会看到下面这几张核心表:用户表、分类表、商品表(鲜花表)、购物车表、订单表、订单明细表、收货地址表、管理员表。把它们的关系理清楚,整个业务就懂一半了。
| 表名 | 核心字段 | 作用 |
|---|---|---|
user | id、openid、nickname、avatar、phone | 小程序用户,openid 是微信侧唯一标识 |
category | id、name、icon、sort | 鲜花分类,如玫瑰、百合、永生花 |
flower | id、category_id、name、price、stock、main_image | 商品表,库存和价格是关键 |
cart | id、user_id、flower_id、quantity、checked | 购物车,checked 控制是否选中结算 |
orders | id、order_no、user_id、total_amount、status、address_id | 订单主表,状态字段驱动整条流程 |
order_item | id、order_id、flower_id、flower_name、price、quantity | 订单快照,防止商品改价后订单受影响 |
address | id、user_id、name、phone、detail、is_default | 收货地址,下单时读取 |
admin | id、username、password、role | 后台管理员,登录后台时用 |
以商品表为例,建表语句一般长这样。注意price用decimal(10,2),不要用float,避免金额精度翻车;stock用int并且设置默认值 0,代表库存。
CREATE TABLE `flower` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `category_id` int NOT NULL COMMENT '分类id,关联category表', `name` varchar(128) NOT NULL COMMENT '鲜花名称', `description` varchar(500) DEFAULT NULL COMMENT '商品描述', `price` decimal(10,2) NOT NULL COMMENT '销售价', `original_price` decimal(10,2) DEFAULT NULL COMMENT '原价,用于划线价展示', `stock` int NOT NULL DEFAULT '0' COMMENT '库存数量', `main_image` varchar(255) DEFAULT NULL COMMENT '主图路径', `sales` int DEFAULT '0' COMMENT '销量,列表排序用', `status` tinyint DEFAULT '1' COMMENT '1上架 0下架', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_category_id` (`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鲜花商品表';这里有两个设计细节值得你在答辩时主动讲出来:第一,为什么order_item里要冗余flower_name和price字段?因为商品可能会改价、改名甚至下架,订单明细做成快照,才能保证历史订单永远能还原当时购买的商品信息;第二,为什么订单主表要有个order_no业务订单号而不是直接用自增 id?因为订单号要展示给用户、要对接后续物流和售后,用一个yyyyMMddHHmmss + 随机数生成的唯一编号,比裸的自增 id 更专业。这些点不需要你额外做多少工作,只要在答辩时说清楚,就能明显拉开和「只会跑代码」的同学的差距。
3. 本地跑通这套小程序:环境、MySQL 导入、后端启动与开发者工具联调
3.1 环境清单:JDK、Node、MySQL 的版本怎么选最省事
跑这套「前端小程序 + 后端 Spring Boot + MySQL」的毕设源码,环境配置是第一个分水岭。我见过太多人卡在这一步,原因往往不是代码有问题,而是 JDK 版本和 Spring Boot 版本不匹配。Spring Boot 2.x 需要 JDK 8 或 JDK 11,Spring Boot 3.x 则要求 JDK 17,如果你装了新版 JDK 去跑老项目,启动时大概率会报一堆看不懂的NoSuchMethodError,这是典型的「版本玄学」,本质上是编译和运行环境不一致。
我建议按下面的清单准备环境,这套组合在高校机房和家用电脑上跑得都很稳:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| JDK | 1.8 或 11 | 先看源码里 pom.xml 的<java.version>再装 |
| Maven | 3.6 以上 | 不用单独配置,IDE 自带的也能用 |
| MySQL | 5.7 或 8.0 | 8.0 注意驱动名是com.mysql.cj.jdbc.Driver |
| 微信开发者工具 | 最新稳定版 | 调试小程序前端 |
| IDE | IDEA 或 Eclipse | 推荐 IDEA,社区版足够 |
一个小建议:把 MySQL 的密码设成简单的,比如root,并确保后端配置文件里写的也是同一个值。很多源码包默认密码就是root,如果你本地密码不一致,启动后第一件事就是连不上数据库,报错信息往往还很误导人。先把环境变量JAVA_HOME配好,再在命令行执行java -version确认版本,这是排查一切后续问题的前提。
3.2 导入 MySQL:从建库到执行 SQL 脚本的完整命令
数据库导入这一步看起来简单,但坑最多。如果你直接双击运行.sql文件,通常会弹出一种图形化客户端,这种方式导入容易遇到字符集问题。我推荐的稳妥做法是先用命令行建库,再指定编码执行脚本。打开终端,输入下面的命令(用你自己的 MySQL 密码替换123456):
mysql -uroot -p123456进入 MySQL 命令行后,依次执行建库、看编码、切换到目标库:
CREATE DATABASE IF NOT EXISTS flower_shop DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; SHOW VARIABLES LIKE 'character_set%'; USE flower_shop;然后再回到系统终端,把源码包里的 SQL 文件导入。假设文件名是flower_shop.sql,放在D:/flower-shop/sql/下:
mysql -uroot -p123456 --default-character-set=utf8mb4 flower_shop < D:/flower-shop/sql/flower_shop.sql这里有两个参数值得解释一下:--default-character-set=utf8mb4的作用是让客户端和 MySQL 服务端通信时统一使用 utf8mb4 编码,能避免中文变成问号;<是重定向符,意思是把 SQL 文件的内容喂给 mysql 命令执行,比复制粘贴更稳妥。导入完成后,用SHOW TABLES;看一下表是否存在,再执行一条SELECT COUNT(*) FROM flower;确认不是空表,一般初始数据会有几十条鲜花记录,看到数字不为零才算成功。
如果你导入时报ERROR 1044访问被拒绝,多半是当前用户没有建库权限,这时候可以用 root 登录或者换个有权限的账号;如果报ERROR 1064语法错误,则是 SQL 文件本身可能混入了图形化客户端导出的头注释,把文件用记事本打开,删除开头的/*!...*/;段再重新导入。这两条我在帮别人跑项目时遇到得最多,提前知道能省不少时间。
3.3 起后端服务:从 application.yml 改配置到验证第一个接口
数据库就绪后,第二步是启动后端。用 IDEA 打开后端的 Maven 工程(通常有pom.xml的那一层就是根目录),先别急着点运行,第一件事是找到application.yml或application.properties文件,修改数据库连接信息。下面是一个典型的配置片段:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/flower_shop?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver这里的url有三个参数很关键:useUnicode=true表示使用 Unicode 编码,characterEncoding=utf8mb4保证中文不乱码,serverTimezone=Asia/Shanghai用来解决 MySQL 8.0 的时区报错。如果你的源码针对 MySQL 5.7,driver-class-name可能是com.mysql.jdbc.Driver,这两个驱动类在 MySQL 8.0 环境下的写法不同,改配置时一定连这个一起看。server.port默认是 8080,如果这个端口被占用,启动日志里会直接报Port 8080 was already in use。
改完配置后,等待 Maven 把依赖下载完,然后运行启动类——它一般叫FlowerShopApplication之类的名字,带@SpringBootApplication注解。看日志输出,出现Tomcat started on port(s): 8080 (http)就代表启动成功。这时候在浏览器访问http://localhost:8080/api/flower/list或者源码里定义的任意一个商品查询接口,如果能返回 JSON 数组,说明后端和数据库已经打通。我习惯把浏览器当成第一个调试客户端,因为它能直接看到接口返回的真实数据,比在小程序里排查快得多。
3.4 前端联调:在微信开发者工具里打开小程序并配置合法域名
后端跑通后,最后一步是把小程序前端在微信开发者工具里打开。启动工具,选择「导入项目」,目录指向源码包里的前端文件夹,AppID 可以先选「测试号」。这个阶段最关键的设置藏在右上角「详情 - 本地设置」里:勾选「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」。如果你不勾这一项,devtools 会拦截所有http://localhost的请求,页面白屏但控制台没有任何明显错误,这种问题最容易让人怀疑代码写错了,其实只是开发环境校验问题。
打开前端的app.js或请求封装文件,找到类似于request的公共方法,把baseUrl改成后端的局域网地址。注意一个关键差异:在模拟器里用http://localhost:8080没问题,但一旦你用手机真机预览,手机访问的localhost是手机自己而不是你的电脑,所以必须改成电脑的局域网 IP,比如http://192.168.1.100:8080。查看局域网 IP 的方式在命令行执行ipconfig(Windows)或ifconfig(Mac),找到IPv4那行即可。
到这里,整个项目的启动链路就完整了:MySQL 有数据,后端接口能返回 JSON,小程序端能请求到后端。我建议你在前端里点一次「获取鲜花列表」,然后打开开发者工具自带的 Network 面板,确认请求没有红色报错、响应里有数据,就说明全链路已经打通。后续不管你是要改页面、改接口还是写论文,都有了可以依赖的基础环境。
4. 把核心业务读透:登录、商品、购物车和下单这条主链路
4.1 微信登录:wx.login 换 openid,token 为什么要放在请求头
鲜花商城和普通网页最大的区别在登录环节。网页登录用的是账号密码,小程序里用户不会主动注册,前端通过wx.login()拿到一个临时 code,再由后端拿这个 code 去微信接口换取openid——这是每个微信用户在小程序体系里的唯一身份证。下面是小程序端的常见写法:
// 小程序端:获取登录凭证并请求后端登录接口 wx.login({ success(res) { if (res.code) { wx.request({ url: 'http://localhost:8080/api/user/login', method: 'POST', data: { code: res.code }, success(resp) { const token = resp.data.data.token; wx.setStorageSync('token', token); } }); } } });这段代码里res.code是 wx.login 拿到的临时凭证,有效期只有几分钟,必须马上发给后端。后端拿到 code 后,会用appid和secret去调用微信的jscode2session接口,换回openid和session_key。注意secret绝对不能出现在小程序前端代码里,否则任何人都能拿到它并冒充你的小程序身份,这是刚入门的同学最容易犯的安全错误。
后端处理逻辑大体是:先拿 code 换 openid,去数据库查这个 openid 是否存在,不存在就插入一条新用户,存在就更新最近登录时间,最后生成一个 token 返回。token 的常见实现是UUID,也可以直接用JWT在线生成。我平时习惯用 UUID 存 Redis 或内存 Map,对毕设来说,把 token 存在数据库字段或内存里都够用。前端之后每次请求都在请求头里带上Authorization: Bearer <token>,后端用一个拦截器统一解析,这样就能区分「这个请求是谁发起的」,购物车、下单、地址管理都依赖这个身份。你在讲解时把这条链路说清楚,老师基本能判断你是真懂而不是只会抄。
4.2 商品列表与分类筛选:接口入参与前端渲染的配合
商品列表页是小程序的门面,核心诉求是:默认加载全部分类,点顶部分类 Tab 后按分类筛选,向下滑动加载更多。后端接口设计上,常见做法是提供一个带分页的商品查询接口,入参包含page、size、categoryId和可选的关键词keyword。后端 Controller 层的写法一般长这样:
@RestController @RequestMapping("/api/flower") public class FlowerController { @GetMapping("/list") public Result list( @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, @RequestParam(required = false) Integer categoryId) { // 调用 service 层,按条件查询并返回分页结果 return Result.ok(flowerService.pageFlowers(page, size, categoryId)); } }这里@RequestParam(defaultValue = "1")的意思是前端没传 page 时默认取第 1 页,required = false表示 categoryId 是可选的,前端不传就查全部分类。前端接到返回的list数组后,用wx:for渲染卡片。每个商品卡片通常绑定一个跳转事件,点进去到详情页,再把id通过wx.navigateTo的url参数传过去。
这一节最值得你在答辩时讲的点,是「为什么列表接口要做分页而不是一次返回全部数据」。如果一次性把几百条鲜花数据全传到小程序端,首屏加载会明显卡顿,用户下拉还会越来越慢。分页配合小程序的onReachBottom触底事件、loading锁,能保证每次只加载一页数据,这是真实项目里最基本的性能意识。代码里注意一个常见坑:当page重置时要先把列表清空,否则会出现「下拉后新旧数据叠加」的 bug,这个问题我在给学生改代码时至少遇到过十次。
4.3 购物车与下单:事务、库存扣减和订单状态机
购物车和下单是整套源码里业务最重、最容易出 bug 的环节,也是毕设答辩的高频提问区。购物车的核心操作有四个:加车、改数量、勾选、删除。由于它依赖登录态,接口设计上通常不从前端传userId,而是通过 token 解析出用户身份,防止一个用户操作别人的购物车。
加购的后端代码核心是把购物车记录 upsert 进数据库。常见的写法是先按user_id + flower_id查一遍,如果已经存在就把数量加一,否则插入一条新记录:
Cart cart = cartMapper.findByUserIdAndFlowerId(userId, flowerId); if (cart != null) { cart.setQuantity(cart.getQuantity() + 1); cartMapper.updateById(cart); } else { Cart newCart = new Cart(); newCart.setUserId(userId); newCart.setFlowerId(flowerId); newCart.setQuantity(1); cartMapper.insert(newCart); }这段代码展示了「先查后插」的幂等思路,比直接insert更能避免重复行。需要注意quantity要加上限校验,比如最大 99,防止前端被恶意循环调用时把数量刷到几千,下单时金额溢出。
下单的逻辑是核心中的核心。用户提交订单时,后端要同时做四件事:生成订单主表记录、生成订单明细快照、扣减库存、清空购物车。这四步必须在一个数据库事务里完成,否则任何一步失败都会留下脏数据。在 Spring Boot 里,你只需要在 Service 方法上加上@Transactional注解:
@Transactional public OrderVO createOrder(OrderCreateDTO dto) { // 1. 校验收货地址、商品上下架状态 // 2. 计算总金额 // 3. 插入orders表 // 4. 批量插入order_item // 5. 循环扣减库存 // 6. 删除该用户购物车中已勾选的记录 return orderVO; }扣减库存这句 SQL 是所有库存类系统里最值得背下来的写法:
UPDATE flower SET stock = stock - #{quantity} WHERE id = #{flowerId} AND stock >= #{quantity};这个 SQL 的精妙之处在于一次 UPDATE 同时完成了「数量扣减」和「库存充足判断」:如果剩余库存不足,stock >= #{quantity}条件不成立,受影响行数为 0,程序就可以立刻抛出异常回滚事务,避免超卖。比先SELECT再UPDATE的方式可靠得多,后面即使并发高一点也不会超卖。订单状态建议维护成一个状态机:待付款(0) → 已付款(1) → 已发货(2) → 已完成(3) / 已取消(4),状态字段只用整数,在代码里用常量或枚举管理,不要直接写魔法数字。
5. 避坑指南:从本地环境到答辩演示最常见的 5 个翻车点
5.1 后端一启动就端口占用或 MySQL 连接失败:先检查这四处配置
现象:点击启动后 IDEA 控制台立刻报红,常见两句话——Port 8080 was already in use或者Access denied for user 'root'@'localhost'。第一句话是端口被其他进程占了,第二句话是数据库账号密码不对。原因分布很规律:前者多半是你电脑上已经跑过别的 Spring Boot 或 Tomcat 服务,后者多半是application.yml里的密码和你本地 MySQL 的不一致。解决:端口占用就在命令行执行netstat -ano | findstr 8080找到占用进程 PID,到任务管理器结束它,或者改server.port为 8081;数据库密码问题就把 yml 里的password改成你安装 MySQL 时设定的值。记住一个排错顺序:配置问题 > 端口问题 > 依赖问题,不要一上来就怀疑代码。
5.2 真机预览时接口全部超时:AppID 和 request 合法域名是重灾区
现象:小程序模拟器里一切正常,但手机扫码预览后页面一直转圈,Network 面板看到请求超时或者ERR_CONNECTION_REFUSED。原因有两个层面:一是真机的localhost指的是手机本身,不是你的电脑,请求根本发不到后端;二是开发工具里「不校验合法域名」这个设置只对模拟器生效,真机预览时依然受微信的域名白名单限制。解决:把前端所有请求的 baseUrl 从http://localhost:8080改成电脑的局域网 IPhttp://192.168.x.x:8080,并确保手机和电脑在同一个 Wi-Fi 下;如果真机仍然报「域名不合法」,可以在开发工具里的「详情 - 本地设置」勾选不校验域名后重新扫码,测试阶段这样处理是合理且可行的。后端在截获请求时也要注意CORS跨域问题,加一个@CrossOrigin或WebMvcConfigurer的跨域配置,否则即使网络通了,浏览器和微信请求也会被拦截。
5.3 SQL 导入报错和中文乱码:utf8mb4 要贯穿到底
现象:导入 SQL 后,前端页面上的鲜花名称显示成「???」,或者数据库表结构混乱、导入报错。原因多是 SQL 文件和 MySQL 服务端、小程序端三处的字符集不完全一致。解决思路是让 utf8mb4 贯穿整条链路:导入时用--default-character-set=utf8mb4,建表语句里统一建utf8mb4,MySQL 的my.cnf或my.ini里character-set-server=utf8mb4,前端开发工具里 project.config.json 中也指定"setting"的字符集相关参数。这条链路有一点断掉,中文就可能变问号或乱码。排查时执行SHOW CREATE TABLE flower;,确认CHARSET=utf8mb4,再执行SELECT name FROM flower;看终端显示是否正常,两步定位法基本够用。
5.4 下单成功但库存没扣:事务没开、库存字段设计太粗糙
现象:用户下单流程走完,订单表里也能查到记录,但flower表里的stock纹丝不动。原因通常有两种:第一种是 Service 方法没有加@Transactional,四个操作各提交各的,扣库存失败时前面的订单已经写进去了;第二种是 update 语句写成了UPDATE flower SET stock = stock - 1没有加stock >= 1条件,或者根本没校验受影响行数。解决:第一,确认事务注解加在 public 方法上,并且没有在同类内部调用导致事务失效;第二,把库存扣减改成带WHERE stock >= #{quantity}的原子更新,并检查返回值int affectedRows,为 0 就抛异常。另外stock字段别设计成tinyint,它范围只有 -128 到 127,批量导入初始数据时一旦超过就报Out of range value,务必用int或bigint。
5.5 图片加载不出来和登录态失效:别把锅甩给代码
现象:商品卡片上的鲜花图片一片空白,或者用户本来登录了,刷新后又回到登录页。图片问题常见原因是源码里配的图片路径是作者本机的绝对路径,比如D:/flower/images/xxx.jpg,微信小程序端访问不了这种本地路径;正确做法是把图片放到后端的static目录下,通过http://服务器IP:8080/images/xxx.jpg访问。登录态失效则要检查前端wx.setStorageSync('token')和后端拦截器是否配对,很多源码会把 token 校验逻辑写在拦截器里,如果拦截器没有放行 login 接口,就会出现「永远无法登录」的循环。登录成功的判断标准是打开开发者工具的 Storage 面板能看到 token,再用它请求一次需要身份认证的接口能得到 200,而不是 401。
6. 从毕设到可上线:上线前必做的三件事与答辩演示顺序
6.1 上线前收尾:密码加密、接口鉴权和库存并发验证
如果你不只是交毕设,还想把项目部署到服务器上给真实用户用,有三件事必须做。第一,管理员密码不能明文存数据库,至少换成 BCrypt 加密,Spring Security 或 Hutool 都有现成实现,不要自己发明加密算法。第二,后端接口做统一鉴权,除了 login 接口,其余都要走 token 校验,防止有人猜接口地址直接操作数据。第三,花一点时间模拟并发下单,用 JMeter 或简单的多线程循环调用下单接口,观察库存扣减是否超卖,这能验证你的事务和那个WHERE stock >= #{quantity}是否真的生效。
6.2 答辩演示建议:按这条链路操作最不容易翻车
答辩现场的演示顺序建议固定成一条主链路:先展示数据库里有数据,再启动后端看接口返回,接着打开小程序跑通「登录 - 浏览 - 加购 - 下单 - 后台看到订单」这个完整流程。全程不要在中途切页面去展示无关功能,避免把自己的节奏打乱。如果现场网络条件差,提前准备一份接口 JSON 的截图放在 PPT 里作为备用,以防真机演示时请求超时。带上你自己的电脑,提前把所有服务起好,用一台备用手机做真机演示比依赖答辩教室的设备稳得多。
最后说个我自己的习惯:无论时间多紧,我拿到一套源码都会先从头到尾读一遍说明文档再动手,因为文档里通常藏着作者踩过的坑和约定好的接口规范。刚才提到的数据库字符集、端口占用、真机域名这几个问题,我在这类项目上至少各翻车过一次,后来全都在文档或源码注释里找到了答案。希望你拿到这套鲜花销售小程序源码后,能少走这几段弯路,把更多时间花在真正理解业务和代码上,而不是耗在环境排查里。希望帮到你。
本文还有配套的精品资源,点击获取