news 2026/10/2 10:36:08

微信商城小程序毕业设计源码解析与前后端MySQL联调实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信商城小程序毕业设计源码解析与前后端MySQL联调实战指南

简介:面向高校学生与初学者的微信商城小程序毕业设计源码包,整合了完整前后端、MySQL数据库、说明文档与LW论文,适合毕业设计、课程设计或小程序电商入门实践。项目覆盖商品展示、购物车、下单处理、支付对接与订单管理等核心功能,并提供Java/PHP两种后端实现思路,运行环境为JDK1.8、MySQL5.7及以上,配套Navicat数据库工具与uniapp/原生小程序前端框架,便于快速部署复现。压缩包共2000个文件,包含Java源码、Vue页面、SQL脚本、配置、说明文档以及后台管理操作录屏等,整体约97MB,目录结构清晰,可按模块查阅。已有465人学习下载。对准备答辩或二次开发的学生而言,这套资料提供了可直接运行的商城业务闭环、数据库表结构说明、后台操作演示和配置指引,能有效缩短项目搭建与排错时间。

1. 这不是一个普通小程序:微信商城毕业设计源码成色与受众

很多人把「微信商城小程序源码」这套 zip 拖回来,解压,双击 html,发现没反应,然后怀疑资源坏了。其实它不是一个小程序前端就完事的东西,而是一整套毕业设计交付物:小程序端负责界面交互,后端提供接口,MySQL 存数据,说明文档和 LW(论文)支撑开题、中期和答辩材料。把它当成「小程序前端 + 后台接口 + 数据库设计 + 论文底稿」的组合体,后面每一步才不会跑偏。

对做毕业设计的学生来说,它把最花时间的「从零搭一套可演示系统」压缩成了「配置好就能跑」,省下的时间用来理解代码、准备答辩。对想练前后端分离项目实战的新手,它也是完整样例:登录态怎么保持、订单状态怎么流转、接口怎么设计,都能在源码对应位置找到实现。

适合它的人主要有两类:要交毕设的计算机相关专业学生,和小程序开发与 MySQL 联调的新手。如果只想要一个能直接上线的商城模板,这套源码反而未必合适——它的侧重点在结构完整,不在高并发和支付安全。

2. 拆解前后端与MySQL:这套商城源码的骨架和分层设计

2.1 先分清前端:原生小程序还是 uniapp,决定了你怎么改

解压之后先别急着找启动文件,第一件事是判断小程序端是原生微信小程序还是 uniapp 工程。原生项目的标志很明确:根目录有 app.json、app.js、project.config.json,页面在 pages 目录下按 .wxml/.wxss/.js/.json 四件套组织。uniapp 工程的特征是根目录有 src/pages 加 manifest.json、pages.json,或者直接有 uni.scss 和 vite.config.js 这类文件。

判断错会带来连锁麻烦。原生小程序可以直接用微信开发者工具打开根目录就编译;uniapp 需要先 npm install 再 npm run dev:mp-weixin,生成 dist 目录之后用开发者工具导入 dist。如果拿 uniapp 工程当原生工程打开,界面白屏还不报什么有用错误,挺劝退的。从毕设资源的常见构成看,多数商城类项目用的是原生小程序,因为导师容易读代码,答辩时随便挑一个页面的 wxml 就能讲;也有部分是 uniapp,声称一套代码能跑微信、安卓、iOS 和鸿蒙,但实际联调时经常在小程序端的自定义组件上出兼容问题,反而不如原生省心。

另外看一眼 app.json 里的 navigationBarTitleText,如果所有页面标题都从这里配,说明是原生导航栏;如果页面 json 里大量用 navigationStyle: custom,说明做了自定义导航栏。自定义导航栏在后期适配 iPhone 刘海屏时,要自己计算状态栏高度和胶囊按钮位置,这也是毕设里最容易翻车的地方。建议先跑默认导航栏,别为了好看去改 custom,省下的时间够你调试好几个接口了。

2.2 后端分了三层:接口、业务、数据访问到底在哪

后端是这套源码的另一半。最常见的毕业设计后端是 Spring Boot 工程,用 @RestController 暴露 JSON 接口,Service 层写业务,Mapper 或 DAO 层操作数据库。也有少量包是 Node.js 的 Express 或者 PHP 工程,但分层思路一致:路由(controller)到业务逻辑(service)再到数据查询(model/mapper)。

以 Spring Boot 为例,入口类一般是 XxxApplication.java,接口代码在 controller 目录下。登录接口常见写法是 @PostMapping("/api/user/login"),商品列表常见 @GetMapping("/api/goods/list")。拿到源码先全局搜 /api/ 这个前缀,接口清单基本就出来了。可以快速看这段简化代码:

@RestController @RequestMapping("/api/goods") public class GoodsController { @Autowired private GoodsService goodsService; @GetMapping("/list") public Result list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { return Result.ok(goodsService.pageList(page, size)); } }

这段代码的逻辑不复杂:前端请求 GET /api/goods/list?page=1&size=10,Controller 把参数接住,交给 goodsService 分页查询,最终通过 Result.ok 包一层统一结构返回。参数说明里要留意的有两个,一个是 @RequestParam 的 defaultValue,前端不传 page、size 也能跑;另一个是 Result 这个统一封装类,很多毕设的返回结构是 {code, msg, data},前端 request 封装就是靠这个 code 字段判断请求成功还是失败。如果你拿到的包用的不是 Result,而是直接返回 Map 或实体,那前端拦截器里的判断逻辑要对应调整。

如果解压后看到的是 app.js 加 routes/ 目录,这是 Node.js 工程,登录路由通常在 routes/user.js 里,格式类似 router.post('/login', userController.login);看到 index.php 和 controllers 目录,就是 PHP 工程,接口入口在 index.php,具体方法在 controllers/Goods.php 这类文件里。定位方法都一样:从小程序端请求的 URL 反推后端路由,再用 IDE 的全局搜索确认文件位置。小程序端所有接口地址一般集中在 utils/config.js 或 api.js 里,先看这个文件就知道整个项目有多少个接口、分别长什么样。

2.3 MySQL 库表:看懂商品、订单、用户三张核心表,就懂了大半

数据库脚本一般是一个 mall.sql 或 shop.sql 文件。导入之前先浏览一遍里面的建表语句,重点是字段名和状态位设计。常见的商城表有这些:user(会员)、category(分类)、goods(商品)、cart(购物车)、order(订单)、order_item(订单明细)、address(收货地址)、banner(轮播图)。如果包里有用户表没有角色表,说明它做的是单角色 C 端商城,管理员后台可能被省略了或单独在另一套代码里。

商品表是理解整个项目的钥匙,拿最常见的字段设计举例:

CREATE TABLE `goods` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID', `category_id` int(11) NOT NULL DEFAULT 0 COMMENT '分类ID', `name` varchar(120) NOT NULL COMMENT '商品名称', `subtitle` varchar(200) DEFAULT '' COMMENT '副标题', `main_image` varchar(255) DEFAULT '' COMMENT '主图URL', `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '售价', `stock` int(11) NOT NULL DEFAULT 0 COMMENT '库存', `sales` int(11) NOT NULL DEFAULT 0 COMMENT '销量', `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1上架 0下架', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

这段建表 SQL 可以当成阅读其他表的模板,字段说明都在 COMMENT 里。留意三个容易改错的地方:price 用 decimal(10,2) 而不是 float,避免金额精度问题;status 用 tinyint 状态位,1 和 0 代表上架与下架,查询时记得带上 status=1 条件,下架商品不该出现在小程序列表里;stock 是 int,后续做订单扣库存时直接 stock = stock - 数量,加锁和事务在高并发场景才有意义,毕设不深究。DEFAULT 0 在 order、cart 这类表里也很常见,比如默认收货地址字段 addr_default,0 表示非默认,1 表示默认。

订单表的设计决定了下单流程怎么写。常见 order 表有 order_no(订单号)、user_id、total_price、status、address_snapshot、pay_time、create_time,其中 status 一般用 0 待付款、1 待发货、2 待收货、3 已完成、4 已取消 这样的枚举。order_item 表记录每个商品的下单快照:goods_id、goods_name、goods_image、price、count,这里存的是商品信息的副本,不是外键引用 goods 表——因为商品改名或下架后,历史订单里的信息不能跟着变。这是电商系统里一个非常重要的设计细节,也是答辩老师常问的点。

顺便说一句外键:从业界惯例看,商城项目的表很少直接加 FOREIGN KEY 约束,外键关系由程序在业务层保证。理由是外键在批量导入、订单删除和分库分表时会拖累性能,还容易出现导入顺序问题。如果你的 sql 文件里已经写了外键,导入报错时先查外键顺序,先导父表再导子表;如果没写外键,那是正常做法,不用补。

3. 本地跑通微信商城:数据库导入、后端启动与小程序编译三步走

3.1 环境清单:版本不对,后面全是玄学

跑这套项目之前先对齐环境,很多莫名报错其实是版本差出来的。毕业设计常见的后端是 Spring Boot 2.x,对应 JDK 1.8,不要手滑装 JDK 17,否则 maven 编译会报一些和 javax 包相关的兼容错误。MySQL 用 5.7 最稳,用 8.0 也行,但连接驱动和账号认证方式会有差异,这个在第 5 章单独说。小程序端用微信开发者工具最新稳定版,不需要申请 AppID,选「测试号」也能编译大部分页面,只有涉及登录和支付的功能才必须换正式 AppID。

列一份我常用的环境对照表:

组件版本建议说明
JDK1.8Spring Boot 2.x 项目默认,maven 配置与编译不易出幺蛾子
MySQL5.7 或 8.05.7 最容易跑通,8.0 需处理认证插件
微信开发者工具最新稳定版基础库版本会影响 ES6 语法兼容
后端启动方式mvn 或 IDEIDEA 打开后端工程直接跑,或 mvn spring-boot:run
数据库客户端Navicat 或命令行导入 sql 用,选顺手的一个即可

这里我一般先把 MySQL 装好,默认端口 3306,root 密码设一个纯数字短密码,比如 123456。这不是生产环境的安全建议,但毕设项目里写复杂的密码只会增加配置出错概率,密码复杂度和字母大小写问题不值得在联调阶段浪费时间。

3.2 导入数据库:命令行与 Navicat 两条路

数据库文件通常叫 mall.sql、db_mall.sql 或 shop.sql,在压缩包根目录或者 sql/ 文件夹下。导入前先打开 sql 文件拉到开头,看里面有没有 CREATE DATABASE 和 USE 语句。有的话,直接导入即可,库会被自动创建;没有的话,需要先手动建一个空库再把 sql 灌进去。

命令行方式最直接:

mysql -uroot -p123456 < /path/to/mall.sql

登录 MySQL 之后检查表是否到位:

SHOW DATABASES; USE mall; SHOW TABLES; SELECT COUNT(*) FROM goods;

第一行命令的作用是以 root 身份执行 mall.sql 里的全部语句,把建库、建表、初始数据一次做完。如果终端报 ERROR 1049 (42000): Unknown database,说明 sql 里没有建库语句,你需要先执行 CREATE DATABASE mall CHARACTER SET utf8mb4; 再重新导入;如果报 ERROR 1064,多半是 sql 文件的字符集和终端不一致,改用 Navicat 导入能规避大多数编码问题。

Navicat for MySQL 的路径是:连接本地 MySQL 服务,新建一个同名数据库(排序规则选 utf8mb4_general_ci),右键该库选「运行 SQL 文件」,选中 mall.sql 执行。完成后刷新,表结构出现在左侧列表。Navicat 的好处是能看到每条报错对应哪一行 SQL,但要注意导入前确认文件编码是 UTF-8,否则中文注释和商品名会变成乱码。

3.3 改配置三件套:数据库账号密码、接口地址、小程序 AppID

导入成功之后,改三处配置就能把项目串起来。

第一处是后端数据库连接配置。Spring Boot 工程在 src/main/resources/application.yml(或 .properties)里,找到 spring.datasource 这一段:

spring: datasource: url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

这段配置里最容易错的是 url 后面的参数。useUnicode=true 和 characterEncoding=utf8 保证中文不乱码;serverTimezone=Asia/Shanghai 是 MySQL 8.0 连接必须加的,否则会报时区错误;driver-class-name 在 5.7 用 com.mysql.jdbc.Driver,8.0 建议写 com.mysql.cj.jdbc.Driver,写错会在启动时直接抛 ClassNotFoundException。如果包里用的是 druid 连接池,配置项会前缀变成 spring.datasource.druid,本质逻辑一样。

第二处是小程序端接口地址。找到 utils/config.js 或 api.js,里面一般长这样:

module.exports = { baseUrl: 'http://localhost:8080', // baseUrl: 'http://192.168.1.100:8080', // 真机调试时换成电脑局域网IP timeout: 10000 }

baseUrl 决定了小程序所有请求去哪台服务器。开发者工具里可以用 localhost,真机预览时必须改成你电脑的局域网 IP,比如 192.168.1.100,且手机和电脑连同一个 WiFi。忘记换 IP 是「开发者工具正常、真机全部失败」最常见的原因。

第三处是 project.config.json 里的 appid。如果只是本地编译,把 appid 改成你的测试号或者留空,开发者工具会弹提示帮你补;如果要做登录功能,需要在小程序后台申请正式 AppID,并把服务器域名配置到 request 合法域名里。本地调试阶段可以直接勾选开发者工具右上角「详情-本地设置-不校验合法域名」。

3.4 启动后端并验证接口:curl 打一个商品接口

配置改完,启动后端。IDEA 里直接运行 XxxApplication 主类;命令行则进入后端根目录执行:

mvn spring-boot:run

看到 Tomcat started on port(s): 8080 字样表示启动成功。如果启动时报数据库连接失败,回到 3.3 检查密码和 url;如果报端口被占用,用 netstat -ano | findstr 8080 查占用进程,或者改 application.yml 里的 server.port。

启动后先在浏览器或 curl 验证一个只读接口:

curl "http://localhost:8080/api/goods/list?page=1&size=5"

返回 JSON 数组且包含商品名称、价格字段,说明后端到数据库的整条链路是通的。如果返回 404,到 Controller 里核对 @RequestMapping 的实际路径,常见情况是多了 /api 或少了 context-path 前缀;如果返回 500 且日志里有 SQL 异常,去 3.3 检查表名是否和 Mapper 里的 @TableName 或 SQL 对得上。接口通了再进小程序开发者工具,此时商品页应该能拉到真实数据。

有些毕业设计后端不是 spring-boot:run 直接启动,而是打成 war 包放进本地 Tomcat 的 webapps 目录。这种情况下接口路径会带项目名,例如 http://localhost:8080/mall/api/goods/list,小程序 baseUrl 里也要相应带上 /mall 前缀。判断方法很简单:看后端源码里有没有 web.xml 或 extends SpringBootServletInitializer 的入口,有的话按 war 方式部署,启动后访问 http://localhost:8080/mall 看是否出现接口文档页或登录页。

4. 前后端联调:登录态、跨域与 request 封装的三个关键点

4.1 微信登录链路:wx.login 的 code 只能换一次 openid

小程序商城的登录和网页登录完全不同。网页登录是输入账号密码,小程序里更常见的方式是「静默登录」:前端调 wx.login() 拿到一个一次性 code,把它发给后端;后端拿 code 加小程序的 AppID 与 AppSecret 去微信接口换 openid 和 session_key;后端再拿 openid 查 user 表,有新用户就自动注册,老用户直接生成一个 token 返回给前端。前端把 token 存到本地缓存,后续所有请求带上它,后端就知道你是谁。

这段链路里新手最常踩的坑是把 code 当成固定凭证反复用。code 有效期只有五分钟,而且只能用一次,同一段演示代码里如果调用了两次 wx.login 再把 code 发出去,第二次必定失败,接口返回 40029。所以毕设代码里登录逻辑应该写成:进入小程序首页先检查本地有没有 token,没有才调 wx.login,不要每次进页面都重新登录。

小程序端登录代码常见是这样:

wx.login({ success: async (res) => { if (res.code) { const { data } = await request({ url: '/api/user/login', method: 'POST', data: { code: res.code } }) wx.setStorageSync('token', data.token) wx.setStorageSync('userInfo', data.userInfo) } } })

登录接口的入参只需要一个 code,不需要用户名密码。这里 request 是封装过的请求方法,统一加了 baseUrl 和 Content-Type。后端拿到 code 之后要做的核心事情是请求微信的 jscode2session 接口换 openid——注意这一步必须在后端完成,不能在小程序端直接调,因为 AppSecret 放在前端等于直接泄露。后端换完 openid 后,查库、发 token、返回用户资料三步走完,前端拿到结果存缓存,再跳转页面。

4.2 request 封装:注入 token,401 直接踢回登录页

小程序原生 wx.request 写起来很啰嗦,每个页面都要重复写 url、method、header,所以毕设项目里一般都会有一层封装。封装的职责是三件事:自动拼接 baseUrl、自动从缓存取 token 放进 header、统一处理返回结构里的 code 和 HTTP 状态码。

一个够用的封装长这样:

const request = (options) => { return new Promise((resolve, reject) => { wx.request({ url: getApp().globalData.baseUrl + options.url, method: options.method || 'GET', data: options.data || {}, header: { 'Content-Type': 'application/json', 'token': wx.getStorageSync('token') }, success: (res) => { if (res.data.code === 0) { resolve(res.data.data) } else if (res.statusCode === 401 || res.data.code === 401) { wx.removeStorageSync('token') wx.navigateTo({ url: '/pages/login/login' }) reject(res.data) } else { wx.showToast({ title: res.data.msg, icon: 'none' }) reject(res.data) } }, fail: (err) => reject(err) }) }) }

header 里传 token 是常见做法,字段名由后端决定,有的是 Authorization,有的是 token,拿到包先看后端拦截器源码里读的是哪个 header,对不上就改这里。401 的处理是整个封装的精髓:token 过期或无效时,后端返回 401,封装里清掉本地缓存并跳登录页,避免用户停留在需要登录的页面上一脸懵。很多毕业设计翻车就翻在没做这层处理,token 过期后商品页一直弹加载失败。

4.3 接口地址与域名校验:本地改一处,真机全废

联调阶段最折磨人的是「开发者工具里一切正常,手机一扫码全部请求失败」。九成原因是 baseUrl 里的 localhost 在手机上指向手机自身,而不是你的电脑。解决办法前面提过:改成本机局域网 IP,手机和电脑同 WiFi。

这里一定注意微信小程序的域名限制:正式环境小程序的 wx.request 只能请求 HTTPS 且在小程序后台配置过 request 合法域名的地址。本地开发可以通过「详情-本地设置-不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」绕过,但一旦上传体验版,没配置合法域名的接口直接被拦截。毕业设计演示一般用开发者工具或真机调试顶过去,但评审老师如果坚持用体验版,域名这关逃不掉——要么买域名配 HTTPS 证书做反向代理,要么让后端把接口部署到已备案的 HTTPS 服务器上,这个成本在毕设阶段确实不低,很多人最后是借免费证书临时搞定,或者干脆用测试号在开发者工具里全程演示。

前后端分离项目里后端接口常遇到跨域问题,但小程序客户端本身没有浏览器同源策略,跨域主要影响的是你用浏览器直接访问后端接口调试的场景。为了方便浏览器调试,后端 Controller 或配置类里一般会加跨域支持,常见是 WebMvcConfigurer 里 addCorsMappings 允许所有来源;如果拿到包没有加,浏览器调试接口会看到 CORS 报错,curl 却能正常返回,不用慌,给后端补一个跨域配置类或者改用 curl 调试即可。

请求超时也值得单独设。有的毕设代码里 wx.request 没配 timeout,小程序默认 60 秒超时,接口挂了用户要干等一分钟才看到报错。封装时建议把 timeout 设为 10000,配合全局 loading(wx.showLoading 和 wx.hideLoading),至少让用户知道请求在进行。另外部分项目会把商品列表和购物车数据用 wx.setStorage 做本地缓存,避免每次打开都请求网络,这在网络慢的演示环境里有奇效,但要注意缓存 key 的设计和更新时机——购物车数量变化后必须清掉旧缓存,否则会出现「加了商品列表页数量不变」的尴尬。

5. 微信商城源码常见问题排查:5 个高频故障的定位与解决

5.1 MySQL 起不来:error 2002 与 1251 两座山

现象:后端启动或 Navicat 连接时报 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'。

原因:MySQL 服务没有运行,或者 socket 文件路径不对。Linux 和 macOS 上刚装完 MySQL 后服务默认不自动启动,Windows 上则是服务没启动或 3306 端口被占用。

解决:Linux 执行 systemctl start mysqld(或 service mysql start),macOS 用 brew services start mysql,Windows 在服务管理器里启动 MySQL 服务。如果服务已经启动仍然报 2002,大概率是连接时写的主机名或 socket 路径不对,Navicat 里主机写 127.0.0.1 而不是 localhost,可以绕开 socket 走 TCP。另一个常见变体是 MySQL 8.0 报 1251:Client does not support authentication protocol requested by server,原因是 8.0 默认认证插件是 caching_sha2_password,而旧版 JDBC 驱动或 Navicat 版本只支持 mysql_native_password。解决方法是执行一遍下面这条 SQL,把 root 的认证方式改回去:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES;

这行命令把 root 用户的密码插件改成 mysql_native_password,密码同步改成 123456。改完后重启 MySQL 服务,旧客户端就能连上了。如果项目里还有多个数据库账号,同样方式逐个改即可。MySQL 8.0 连接时还常看到 SSL connection error 或 SSL 证书校验失败的报错,Navicat 连接属性里把 SSL 选项设为禁用,或 JDBC url 末尾加上 useSSL=false,就能绕开证书校验的问题。毕设场景不需要启用 SSL 加密连接,能省则省。

5.2 端口占用:后端起不来先查 8080

现象:mvn spring-boot:run 启动时报 Port 8080 was already in use。

原因:之前启动的后端进程没关干净,或者有别的程序占了 8080。

解决:Windows 用 netstat -ano | findstr 8080 找到占用 PID,然后 taskkill /PID /F;Linux 用 lsof -i:8080,kill 掉对应进程。改端口也行,但要记得同步改小程序 config.js 里的 baseUrl。另外 IDEA 里停止项目时如果用的是 Debug 模式,有时进程残留,直接看控制台右侧的停止按钮是否置灰。这个问题不大,但答辩现场真遇到了很耽误时间,建议演示前一晚把后端、数据库、小程序三件套完整重启一遍,把端口和内存分配问题提前暴露出来。

5.3 小程序编译报错:ES6 语法不兼容基础库

现象:开发者工具编译报 SyntaxError,指向某个箭头函数或 async/await 文件,或者页面打开白屏但编辑器没有明显报错。

原因:开发者工具的「ES6 转 ES5」没勾上,或者基础库版本太低,不支持部分新语法。毕业设计源码常混用 const、箭头函数、Promise、async/await,这些在老基础库上会出问题。

解决:详情 -> 本地设置 -> 勾选「ES6 转 ES5」。如果勾了还报错,把基础库版本往上调一档(详情里调试基础库,选较新的稳定版)。还有一类情况是开发者工具缓存,改完设置后「清缓存 -> 全部清除」再重新编译。必要时在 project.config.json 里检查有没有 libVersion 字段限制版本。这个坑看起来小,但在没有网络环境下演示时会直接卡死开场。

5.4 登录接口 404 或 401:按三层定位法查

现象:小程序点登录没反应,Network 面板里请求显示 404 或 401,或者提示「请求的 URL 不在合法域名列表中」。

原因:404 多半是接口路径写错或后端没启动;401 多是 token 缺失或过期;「不在合法域名」是没开不校验合法域名的开关。

解决:按三层定位。第一层看请求 URL,和 config.js 里的 baseUrl 拼接一下,确认地址打到了后端;第二层用 curl 直接请求同一个接口,如果 curl 通而小程序不通,问题在前端网络配置;如果 curl 也不通,问题在后端路由或拦截器。登录接口的 401 最常见是拦截器放行名单里没把 /api/user/login 放行,后端代码里加一个白名单配置即可。这个定位方法用顺了之后,前后端联调时会有一种「不再靠猜」的踏实感——很多血泪教训都是从不分青红皂白改代码开始的。

5.5 开发版过期与演示白屏:答辩前一天必查项目

现象:扫码预览提示「开发版小程序已过期,请在开发者工具重新扫码」,或者真机打开后页面一片空白但开发者工具正常。

原因:开发版预览有 30 天有效期,过期就没法打开;白屏多半是 baseUrl 还是 localhost,或者电脑防火墙拦了手机请求。

解决:重新打开开发者工具,上传或预览一次,生成新的开发版二维码;白屏就把 baseUrl 改成电脑局域网 IP,并在 Windows 防火墙里放行 8080 端口。这里有一个答辩前必做的清单:断网环境下,开发者工具能否编译通过、后端能否启动、MySQL 能否连接。答辩现场的局域网不一定允许访问外网,如果登录功能依赖微信接口,最好提前把登录的降级方案准备好,比如后端写死一个测试账号直接放行。不要赌现场网络,这是最实在的一条经验。

6. 答辩之前:用抓包、状态机和文档一致性给商城源码加码

6.1 先用抓包验证三个核心链路

答辩演示最重要的不是功能多,而是每个动作都有预期结果。把系统压缩成三个链路反复过:登录到商品列表(数据从 MySQL 读到前端)、加购到下单到订单列表(数据写回 MySQL)、个人中心到退出登录(缓存清理)。微信开发者工具的 Network 面板就能看请求四要素:URL、状态码、请求参数、响应数据。抓包时留意登录接口的响应时间,超过 2 秒就查慢 SQL;下单后去数据库查 order 表最新记录的 status 是否为预期状态,把截图放进论文,「系统可用性验证」这一节就扎实了。

6.2 答辩老师爱问的订单状态机与动态标题

订单状态机是商城类毕设被问概率最高的问题。状态一般设为 0 待付款、1 待发货、2 待收货、3 已完成、4 已取消。老师追问「30 分钟未付款怎么关单」时,答不出实现可以给出方案:order 表加 expire_time 字段,后端定时任务扫描并置为已取消。另外两个容易出彩的细节:页面标题用 wx.setNavigationBarTitle 按登录用户动态修改;商品列表和购物车做本地缓存时把时间戳一起存,超时后重新请求,封装一个几十行的 setCache 带过期时间方法,论文里也能写。

6.3 文档一致性检查与离线演练

说明文档和 LW 的质量参差,先做一致性检查:架构图对照后端目录,E-R 图对照 mall.sql 的建表语句,时序图对照登录接口走一遍,不一致改文档比改代码快。论文里的功能列表逐条对着页面过一遍,没实现的功能果断删,别让老师发现文档和系统对不上。我自己的习惯是答辩前三天把全流程在离线状态走两遍,一遍正常演示,一遍模拟后端挂掉看报错是否可接受,前者保证功能完整,后者保证老师突然追问时心里有底。这套经验送给你,希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 10:35:46

第一次作业高效完成指南:三问法拆解模糊任务,锁定交付与验收标准

“无标题”三个字加“第一次作业”&#xff0c;让我想起很多年前第一次接到任务时的状态&#xff1a;光标在空白文档里一闪一闪&#xff0c;脑子里同样一片空白。后来带过不少新人&#xff0c;也帮人改过各种“第一次作业”&#xff0c;发现大家卡住的点惊人地一致——不是不会…

作者头像 李华
网站建设 2026/10/2 10:35:46

企业级Agent落地实战:工具调用、权限、上下文与评测四道坎

1. 从Demo到生产&#xff1a;企业Agent落地的真实鸿沟做过企业Agent项目的人大概都有这种体验&#xff1a;周五下午给老板演示&#xff0c;Agent流畅地查数据、调接口、生成报告&#xff0c;会议室里一片赞叹&#xff1b;周一早上推到生产环境&#xff0c;用户第一条真实请求就…

作者头像 李华
网站建设 2026/10/2 10:35:10

本地部署DeepSeek与RAG知识库实战:从Ollama安装到报错排查

我自己是在一个普通的深夜开始折腾这件事的&#xff1a;机器是一台普通游戏本&#xff0c;显卡不算好&#xff0c;显存只有8GB&#xff0c;装好Ollama之后满怀期待敲下ollama pull deepseek-r1&#xff0c;结果一等就是两个小时&#xff0c;进度条还卡在百分之十几。后来好不容…

作者头像 李华
网站建设 2026/10/2 10:34:52

2026年Unity热更方案:YooAsset与HybridCLR实战指南

1. 为什么2026年还要死磕YooAsset加HybridCLR这套组合 如果你是从Unity 2018、2019那个年代一路走过来的开发者&#xff0c;大概率经历过用AssetBundle手写依赖管理、自己维护版本清单、热更代码靠反射或者Lua桥接的苦日子。那个阶段能跑通一套热更流程的人&#xff0c;基本都算…

作者头像 李华
网站建设 2026/10/2 10:33:00

生成式引擎优化GEO:从SEO到AI引用时代的内容策略

最近在一个营销圈的小群里看到一张截图&#xff0c;有人拿某个消费品牌的名称去问AI助手“这个牌子和XX比怎么样”&#xff0c;AI给出了一段看起来非常客观的答复&#xff0c;但里面作为“可信参考来源”被点名的&#xff0c;是竞品。提问的人有点无奈&#xff1a;“我以前做SE…

作者头像 李华
网站建设 2026/10/2 10:32:57

模型文件5.9GB,显存为何只占2.7GB?自养Agent低显存部署实测拆解

“自养Agent”这个系列写到第三篇&#xff0c;我后台收到最多的私信其实是同一个问题&#xff1a;你这Agent到底吃了多少显存&#xff1f;尤其是我在上篇日志里顺嘴提了一句“模型权重文件5.9GB”之后&#xff0c;好几个人发来差不多的疑问——文件都5.9GB了&#xff0c;显卡怎…

作者头像 李华