ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微信小程序宠物项目+SSM:从工程拆解到联调排错全指南

微信小程序宠物项目+SSM:从工程拆解到联调排错全指南 简介基于Spring、Spring MVC和MyBatis框架构建的微信小程序宠物服务平台源码是面向Java后端与小程序开发方向的课程设计项目。系统涵盖宠物档案管理、保健提醒、在线预约、社区互动、宠物商店和后台数据分析等模块从用户端到管理端形成完整业务闭环。压缩包共1277个文件大小约15.22MB其中Java文件承载SSM后端逻辑vue文件构成管理端页面wxml、wxss、js等实现小程序端交互png、svg、jpg等图片资源提供界面素材另有sql数据库脚本、xml配置和启动脚本方便环境搭建与二次开发。目前已有190人学习下载资源目录结构清晰代码注释明确适合学习者深入理解SSM框架与微信小程序的整合方式也可直接作为宠物服务类毕业设计或课程设计的参考基础。1. 微信小程序宠物小程序ssm.zip 是套什么样的项目微信商城、校园跑腿、宠物救助这类标题在毕业设计资源包里一年能见到几百次。「微信小程序宠物小程序ssm.zip」拆开看是三条信息前端用微信小程序后端用 SSMSpring SpringMVC MyBatis三件套交付形态是一个压缩包。它要解决的核心问题可以概括为让一个没有任何前端基础的 Java 学习者用最小成本把一套「小程序页面 Java 接口 MySQL 数据库」的完整链路跑起来。这类资源包的价值不在代码复杂度而在于它把联调骨架搭好了。你拿到手只需要做三件事确认依赖版本和本机环境一致、把 pet.sql 灌进 MySQL、改配置并启动 Tomcat。听起来简单坑全在细节里——压缩包损坏、MySQL 时区不一致、Tomcat 端口冲突、微信开发者工具的合法域名校验。下文按「拆包 → 跑通 → 改业务 → 排错」的顺序把这些细节逐个过一遍。2. 拆开 .zip宠物小程序前后端目录结构与选型理由2.1 一个标准宠物毕设包的典型目录长什么样解压后通常能看到两个一级目录和一个 SQL 脚本前端目录一般叫 miniprogram 或 pet-weapp后端叫 pet-server 或 ssm-pet数据库脚本叫 pet.sql。我先给出最常见的布局你拿到手可以先对照一下自己的包里少了哪块。pet-project/ ├── miniprogram/ # 微信小程序前端 │ ├── app.js │ ├── app.json │ ├── project.config.json │ ├── pages/ │ │ ├── index/ # 首页 │ │ ├── pet/ # 宠物列表/详情 │ │ ├── adopt/ # 领养申请 │ │ ├── cart/ # 购物车 │ │ └── user/ # 个人中心 │ └── utils/ │ └── request.js # 统一请求封装 ├── pet-server/ # SSM 后端 │ ├── pom.xml │ ├── src/main/java/ # controller/service/dao/entity/common │ ├── src/main/resources/ │ │ ├── jdbc.properties │ │ ├── spring-mybatis.xml │ │ ├── spring-mvc.xml │ │ └── mybatis/ # mapper 文件 │ └── src/main/webapp/WEB-INF/web.xml └── sql/ └── pet.sql # 建库建表 初始数据这种布局几乎铁打不动因为它对应一条固定的联调链小程序 utils/request.js 发 HTTP 请求到后端 controllercontroller 调 serviceservice 调 MyBatis 的 mappermapper 查 MySQL。目录里的每个文件都能在这条链上对号入座。我把各层的职责和联调关系整理成下面的表排查问题时先想清楚问题出在链上哪一环。目录/文件职责联调对应关系miniprogram/pages/*页面与交互调用 request.js 封装好的接口miniprogram/utils/request.js配置 baseURL、header、错误处理指向 http://ip:8080/pet/pet-server/controller接收前端参数返回 JSONwx.request 拿到的响应体pet-server/service业务逻辑与事务边界多表操作的编排层pet-server/dao mybatisSQL 落地操作 MySQL 中的 pet 相关表sql/pet.sql初始化数据决定程序跑起来后看到什么内容2.2 为什么是 SSM 而不是 Spring Boot第一次接触这种包的人常问都什么年代了为什么不用 Spring Boot理由很现实课程设计和毕业设计的评分标准通常还停留在 SSM 上教材、答辩 PPT、指导老师给的框架示例也大多是 SSM。Spring Boot 把配置自动化了但对初学者而言「一个请求如何从 controller 走到 dao」这个核心链路反而被隐藏了。SSM 的显式配置——spring-mvc.xml 里的组件扫描、spring-mybatis.xml 里的数据源与 SqlSessionFactory——本身就是最好的教材。pom.xml 里常见的依赖组合是 Spring 5.x MyBatis 3.4/3.5 Jackson 2.9数据库驱动分两种MySQL 5.7 用com.mysql.jdbc.DriverMySQL 8.0 用com.mysql.cj.jdbc.Driver。拿到包先看 jdbc.properties 里写的是哪个驱动再确认本机 MySQL 版本这是跑通项目的第一步。典型的配置如下jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/pet_db?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456serverTimezoneAsia/Shanghai必须写。MySQL 8 的驱动要求显式时区不写会直接抛The server time zone异常。useSSLfalse是开发环境的惯用配置生产环境才需要证书。characterEncodingutf8mb4决定中文和 emoji 能否存进数据库宠物昵称、疫苗备注里时常有 emoji漏了这项会出现乱码或Incorrect string value报错。2.3 为什么小程序端用原生而不是 uni-app同类包里偶尔会混进 uni-app 工程判断方法看根目录有没有main.js和pages.json。原生微信小程序的特征非常明显app.json、project.config.json、每个页面一组同名的.wxml/.wxss/.js/.json四件套。这个包用原生好处是零框架依赖、微信开发者工具直接打开就能跑不需要 HBuilderX 或 npm 编译链对课程设计场景来说是最不容易中途失败的路径。原生的代价是要手动管理页面与导航栏配置。app.json里pages数组的第一项就是小程序启动后进入的加载页面也就是很多人问的「修改刚进入的加载页面」。想换启动页不是改文件名而是把这个页面的路径挪到第一行{ pages: [ pages/index/index, pages/pet/pet, pages/adopt/adopt, pages/cart/cart, pages/user/user ], window: { navigationBarTitleText: 宠物之家, navigationBarBackgroundColor: #ff8c5a, navigationBarTextStyle: white } }pages数组的顺序同时决定启动页和路由表的注册顺序第一项永远是默认入口。顶部导航栏高度在原生环境里不需要自己量默认就是微信原生导航标题和背景色在window里配置即可只有当你要做沉浸式导航头把navigationStyle改成custom时才需要处理状态栏高度。配置说明可写成「AppID 用测试号或自己的号都行但 4.1 节登录流程对 AppID 有依赖最好先用真实小程序账号」。3. 本地把宠物小程序跑起来的四条关键路径3.1 数据库导入从 pet.sql 到 MySQL 的完整动作先在 MySQL 里建库再导入脚本这是最不容易出错的顺序。命令行操作比图形化工具更可复现也方便写进文档让答辩老师照着走mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS pet_db DEFAULT CHARACTER SET utf8mb4; mysql -uroot -p pet_db pet.sql第二行的pet.sql是相对路径表示如果文件在sql/目录下需要写成sql/pet.sql。导入成功后执行show tables;确认能看到 pet、adopt、vaccine、cart、orders 等表再抽查一条数据SELECT id, name, breed, status FROM pet LIMIT 5;status字段在这种系统里一般是 0/1 或 pending/adopted 之类的枚举值查询结果可以直接对应上后端的枚举含义。如果导入报错 1366说明 sql 文件编码不是 utf8mb4用文本编辑器转成 UTF-8 再导一次报错 1049 说明数据库没建成功多半是权限或拼写问题。3.2 后端启动Tomcat 部署前的三处必配后端是 War 包形态需要装 Tomcat。开发环境推荐 JDK 1.8 Tomcat 8.5这个组合与 SSM 5.x 兼容性最稳。部署前检查三处jdbc.properties 里的数据库密码、spring-mvc.xml 里的包扫描路径、web.xml 里的 DispatcherServlet 映射。web.xml 的典型配置servlet servlet-namedispatcher/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcher/servlet-name url-pattern//url-pattern /servlet-mappingurl-pattern写成/表示所有请求都进 SpringMVC静态资源需要在 spring-mvc.xml 里放行。放行配置是mvc:annotation-driven / mvc:default-servlet-handler / context:component-scan base-packagecom.pet.controller /default-servlet-handler的意思是「SpringMVC 不认识的请求交给容器默认 Servlet 处理」没有它页面上图片地址经常返回 404。日志里看到No mapping found for HTTP request with URI /upload/xxx.jpg第一反应就该来这里找原因。确认没问题后编译打包将 war 包放进 Tomcat 的 webapps 目录启动。检查点命令/位置预期结果数据库表show tables;看到 pet、adopt 等表Tomcat 进程ps -ef | grep tomcat有 java 进程驻留端口lsof -i :80808080 被 Tomcat 占用接口curl http://localhost:8080/pet/login返回 JSON而非 4043.3 小程序端 request.jsbaseURL、token、错误码一次说清小程序端的联调入口只有一个文件utils/request.js。所有页面都经它发请求所以 baseURL 写哪里、header 带什么、后端返回非成功码时怎么提示都集中在这里。一个能直接用的封装const BASE_URL http://localhost:8080/pet function request(path, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: ${BASE_URL}${path}, method, data, header: { Content-Type: application/json, Authorization: wx.getStorageSync(token) || }, success(res) { if (res.data.code 200) { resolve(res.data.data) } else { wx.showToast({ title: res.data.msg, icon: none }) reject(res.data) } }, fail(err) { wx.showToast({ title: 网络异常, icon: none }) reject(err) } }) }) } module.exports { request }BASE_URL是开发机地址真机预览时要替换成电脑的局域网 IP。Authorization头从 Storage 里取后端拦截器用它换登录态。code 200是后端统一返回体里的业务成功码字段名要与第 4 章的 Result 类保持同步。method统一用大写wx.request会原样透传给后端节省一层大小写判断的麻烦。3.4 接口连通验证从 Network 面板到后端日志联调第一步不是写页面而是验证「小程序能不能碰到后端」。打开微信开发者工具调试器的 Network 面板看请求状态同时在后端加一行请求日志这是最直接的验证手段。以拦截器实现为例Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println([REQ] request.getMethod() request.getRequestURI()); return true; }Network 面板显示 pending 或 fail先 ping 后端机器看网络通不通显示 404检查url-pattern和RequestMapping路径是否一致显示 403多半是拦截器拦截或跨域问题看后端日志里有没有[REQ]这一行有则说明请求已到达后端问题出在逻辑代码里。4. 宠物业务的 SSM 接口设计登录、图片上传与统一返回4.1 微信登录从 wx.login 到 openid 的完整链路宠物小程序通常有「我的宠物」「领养申请」这类需要识别用户身份的场景标准做法是微信静默登录。前端调wx.login拿临时 code后端拿 code 和 appid/secret 去微信接口换 openid。前端侧只需要两步wx.login({ success(res) { request(/login, POST, { code: res.code }).then(userInfo { wx.setStorageSync(token, userInfo.token) wx.setStorageSync(openid, userInfo.openid) }) } })后端 Controller 负责调微信接口并落库。常见做法是用 HttpClient 或 Hutool 请求微信官方接口拿到 openid 后查 user 表新用户则插入一条记录同时生成自定义 token 返回给前端。常见的坑有三个appid 与 secret 不匹配导致 errcode 40013用测试号跑登录流程但真实 AppID 未配置code 只能使用一次重复提交会报code been used。头像昵称的获取方式已经变了。旧版wx.getUserProfile拿到的昵称是「微信用户」且头像可能显示灰色默认图。现在正确做法是用原生组件button设置open-typechooseAvatar选头像input设置typenickname填昵称后端存下这两个字段临时头像 URL 需要前端先wx.uploadFile传到自己的服务器换永久地址。4.2 统一返回体与分页参数约定后端所有接口返回同一个 JSON 结构前端解析时才不用在每处都写分支。宠物系统里最常用的 Result 类public class ResultT { private Integer code; private String msg; private T data; public static T ResultT ok(T data) { ResultT r new Result(); r.code 200; r.msg success; r.data data; return r; } }列表接口统一用 PageHelper 做分页避免每个 controller 手写 limit 和 count 两套查询。先引入分页依赖再在 service 层配合使用RequestMapping(/pet/list) ResponseBody public ResultPageInfoPet list(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); ListPet pets petService.queryByCondition(); return Result.ok(new PageInfo(pets)); }PageHelper.startPage必须紧跟要分页的查询语句中间不能插入其他查询否则分页参数会作用到错误的语句上。返回PageInfo的好处是 total、pageNum、pageSize、list 都在里面小程序端直接用res.list和res.total就能驱动触底加载。接口清单如下前后端对照时按表核对路径与方法接口路径方法入参返回结果/loginPOSTcodeUserInfo token/pet/listGETpageNum, pageSizePageInfoPet/pet/detailGETidPet 详情/uploadPOSTfile, dir文件访问路径/adopt/applyPOSTAdoptApply JSON成功/失败4.3 宠物图片上传MultipartFile 与访问路径宠物小程序一定涉及图片宠物照片、疫苗本照片、领养人身份证照片。前端用wx.uploadFile上传后端用 MultipartFile 接收RequestMapping(/upload) ResponseBody public ResultString upload(RequestParam(file) MultipartFile file, RequestParam(defaultValue pet) String dir) { String realPath /data/pet-server/upload/ dir /; String ext file.getOriginalFilename() .substring(file.getOriginalFilename().lastIndexOf(.)); String fileName System.currentTimeMillis() _ UUID.randomUUID().toString().replace(-, ) ext; file.transferTo(new File(realPath, fileName)); return Result.ok(/upload/ dir / fileName); }originalFilename是前端传上来的文件名直接保存有风险中文和空格会干扰 URL重名会覆盖旧文件。这里用时间戳加 UUID 重新生成文件名只保留原扩展名。dir参数区分图片业务类型比如 pet、vaccine、user方便在服务器上分类管理。上传成功后返回相对路径最终访问地址由部署环境的前缀拼出来。这个方案的弱点是文件落在本地磁盘重启服务器文件还在但迁移机器或扩容多实例时文件会丢。课程设计场景本地目录够用如果要长期维护应换成对象存储把transferTo改为表单直传或后端转存。还要注意在 spring-mvc.xml 里给上传目录配置虚拟路径映射否则图片 URL 打不开前端会一直看到裂图。4.4 核心表设计pet 表支撑列表、详情与领养状态宠物模块的核心表一般有 pet、adopt、vaccine 三张。pet 存宠物基本信息和状态vaccine 存疫苗记录adopt 存领养申请。以下 DDL 是课程设计最常用的落地形态CREATE TABLE pet ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT 宠物名, species VARCHAR(20) NOT NULL COMMENT cat/dog, breed VARCHAR(50) COMMENT 品种, age INT COMMENT 月龄, gender TINYINT COMMENT 0母 1公, status TINYINT DEFAULT 0 COMMENT 0待领养 1已申请 2已领养, images VARCHAR(500) COMMENT 逗号分隔多图, vaccine_record TEXT COMMENT 免疫时间线, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;status用数字表示状态机比字符串省空间也比布尔值多一个中间态。「0待领养 1已申请 2已领养」正好覆盖宠物生命周期列表页只查 status0详情页展示状态流转过程。images用逗号分隔多个图片路径小程序端split(,)就能得到轮播图数组不必单独建图片表。MyBatis 的 mapper 必须开启驼峰映射否则create_time映射不到createTime属性上settings setting namemapUnderscoreToCamelCase valuetrue/ /settingsmapUnderscoreToCamelCasetrue把数据库下划线命名自动翻译成 Java 驼峰字段。没开这个配置时create_time查出来始终是 null页面时间显示空白这是 SSM 项目中最隐蔽却最常见的坑之一。注意该配置在 SqlSessionFactory 里设置而不是 applicationContext 里。5. 宠物页面与后端联动列表分页、领养表单和疫苗时间线5.1 首页宠物列表WXML 渲染与触底加载首页通常是宠物卡片流。页面 JS 里维护pets数组、pageNum和finished标记触底时追加下一页Page({ data: { pets: [], pageNum: 1, pageSize: 10, finished: false }, loadPets() { if (this.data.finished) return const { pageNum, pageSize } this.data request(/pet/list?pageNum${pageNum}pageSize${pageSize}).then(res { const list res.list || [] this.setData({ pets: this.data.pets.concat(list), pageNum: pageNum 1, finished: list.length pageSize }) }) }, onReachBottom() { this.loadPets() } })onReachBottom是小程序原生的页面触底事件只有页面内容超出屏幕高度才会触发。finished标记用「返回条数小于 pageSize」判断是否到底避免滚动频繁时发重复请求。pageNum每次请求后加一后端 PageHelper 会按新页码查询这就实现了最常见的加载更多交互。WXML 侧用wx:for渲染卡片图片加modeaspectFill和lazy-load能明显改善滚动列表的加载体验view classcard wx:for{{pets}} wx:keyid image src{{item.images.split(,)[0]}} modeaspectFill lazy-load / text{{item.name}} · {{item.breed}}/text text wx:if{{item.status 0}}待领养/text /viewwx:key必须写它是列表渲染的 diff 依据不写会告警且加载更多时列表可能出现整屏抖动。item.images.split(,)[0]在 WXML 里直接做字符串运算取第一张图作封面省去在 JS 里二次加工的步骤数据量小的时候完全够用。5.2 领养申请表单校验与后端事务领养申请页的核心是一个表单宠物 ID、领养人姓名、手机号、家庭住址、是否有养宠经验。小程序端用radio-group做经验选择提交前先做手机号校验submitAdopt() { const form this.data.form if (!/^1[3-9]\d{9}$/.test(form.phone)) { wx.showToast({ title: 手机号格式不正确, icon: none }) return } request(/adopt/apply, POST, form).then(() { wx.showToast({ title: 申请成功 }) wx.redirectTo({ url: /pages/user/user }) }) }手机号正则^1[3-9]\d{9}$覆盖目前主流号段是最常用的前端格式校验。校验不通过用showToast即时反馈不发起网络请求。后端在 /adopt/apply 接口里要做两件事插入 adopt 记录同时把 pet 表的 status 置为 1。这两步必须在一个事务里否则会出现「申请单查得到宠物还显示待领养」的数据不一致SSM 的做法是在 Service 层方法上加注解Transactional public void applyAdopt(AdoptApply apply) { adoptMapper.insert(apply); petMapper.updateStatus(apply.getPetId(), 1); }Transactional默认对 RuntimeException 回滚要注意它只对对外方法生效同类内部方法调用 this.applyAdopt() 时事务会失效这是 SSM 面试和答辩的高频提问点。排查事务不生效时可以看 MySQL 日志里有没有START TRANSACTION没有说明事务根本没开启。5.3 疫苗时间线一张表撑起详情页宠物详情页的疫苗记录是典型的时间线 UI。后端查询按接种时间升序前端用列表加左侧圆点实现不需要引入任何时间线组件库SELECT vaccine_name, inoculate_date, hospital, remark FROM vaccine WHERE pet_id #{petId} ORDER BY inoculate_date ASC;小程序端拿到结果直接渲染时间线 UI 本质就是「左侧一列圆点 右侧内容区块」WXML 用wx:for输出view classtimeline view classtimeline-item wx:for{{vaccines}} wx:keyinoculateDate view classtimeline-dot/view view classtimeline-content text{{item.vaccineName}}/text text{{item.inoculateDate}} · {{item.hospital}}/text text{{item.remark}}/text /view /view /view排序在数据库做不要在 JS 里 sort。数据量小时看不出差异多了之后数据库索引配合ORDER BY才是正确解法。时间线适合展示顺序强相关、内容不宜堆叠的信息疫苗记录正好满足这个特征疫苗名称、接种日期、医院和备注四个字段排成竖列信息密度和数据结构的复杂度都合适。5.4 购物车与订单状态机思想复用如果这个包还包含宠物用品售卖购物车和订单就是常规扩展点。订单状态沿用 pet 表「数字状态机」的思路0 待付款、1 待发货、2 待收货、3 已完成、4 已取消。前端只需要根据状态值切换按钮显隐后端在状态变更接口里校验转移合法性if (Arrays.asList(0, 1, 2).contains(order.getStatus()) targetStatus order.getStatus() 1) { order.setStatus(targetStatus); orderMapper.updateStatus(order); } else { throw new BusinessException(非法状态流转); }状态机校验能挡住「待付款直接变成已完成」这类越权操作。很多课程设计只写UPDATE orders SET status ?被追问状态流转时答不上来。这段代码用一个很轻的列表判断就完成了合法转移校验没有引入状态机框架对这种体量的项目恰到好处。同理第 4 章 pet 表的status字段也应当用同样的方式约束只有待领养状态才能发起领养申请。6. 部署与排错解压失败、端口占用和真机预览的坑6.1 zip 解压报「could not find eocd」的处理顺序EOCD 是 End Of Central Directory Record 的缩写位于 zip 文件末尾记录着「文件里有多少条目、每个条目在哪」。解压时抛出invalid zip archive: could not find eocd说明中心目录读不到几乎可以断定文件不完整。常见原因有三个下载被中断、文件被改名成 .zip、服务器返回的其实是 HTML 错误页。处理顺序先看文件大小与资源页标注是否一致再用unzip -t测试完整性unzip -t pet-project.zip输出End-of-central-directory signature not found就重新下载用支持断点的工具比浏览器单线程下载更稳。文件大小正常但解压失败时换 7-Zip 或系统自带解压工具再试。Gradle 或 Maven 构建时偶发的zip报错和这个不同那通常是本地仓库缓存损坏删掉对应目录重新拉取即可。6.2 端口占用和 404Tomcat 排错三板斧后端起不来八成是 8080 被占。先看端口归谁lsof -i :8080 # macOS/Linux netstat -ano | findstr 8080 # WindowsWindows 下记下最后一列 PID在任务管理器里结束对应进程不想结束就把 Tomcat 的server.xml里Connector port8080改成 8081同时改小程序端BASE_URL的端口。404 分接口 404 和资源 404。接口 404 检查RequestMapping与前端 path 是否一致注意访问路径里可能有两层相同的前缀http://localhost:8080/pet/pet/list第一个pet是 war 包上下文路径第二个是接口前缀。资源 404 回到第 2 章的default-servlet-handler复盘。6.3 开发者工具到真机域名、HTTPS 与局域网调试开发者工具里勾选「不校验合法域名」后能用http://localhost调试但真机预览和线上版本不会走这个开关iOS 与 Android 都会拦截未配置的请求。上线前的正道是在小程序管理后台配置服务器域名要求 HTTPS 且完成备案。开发阶段必须真机验证时用微信开发者工具自带的「真机调试」模式手机与电脑同局域网电脑 IP 可直接访问不需要提前备案域名。6.4 把 .zip 工程初始化为 git 仓库解压包不带版本历史建议第一时间纳入 git 管理后续改坏了方便回退cd pet-project git init git add . git commit -m init: import pet ssm project git remote add origin gityour-server:pet-project.git git push -u origin master远端仓库已有代码时先拉取并允许无关联历史合并git pull origin master --allow-unrelated-histories合并完成后跑一遍接口确认没有覆盖已有代码。这个操作把「zip 资源包」转成「可迭代的工程」后续接毕业设计迭代、多人协作都从这里开始。6.5 快速自检一条 curl 验证后端是否可用按下面清单过一遍能覆盖大部分启动问题数据库能连、表存在war 包已部署到 webappsTomcat 进程存活端口未被占用接口路径与前端一致。最后用一条命令验证后端真的在干活curl -s http://localhost:8080/pet/pet/list?pageNum1pageSize1 | python3 -m json.tool这条 curl 组合了-s静默模式和管道输出格式化返回的 JSON 里能直接看到code、msg、data的字段结构。小程序端解析字段对不上、页面数据渲染为空在这里就能一眼定位比反复点开发者工具高效得多。本文还有配套的精品资源点击获取
返回列表