每年到这个时间点,就会有一批计算机相关专业的同学开始为毕业设计发愁。前两天还有学弟问我,“想做一个微信小程序类的毕设,后端用Spring Boot,但不知道选什么题目好”。我直接就给他推荐了“农村旅游管理与服务”这个方向。这确实是一个非常经典、也非常稳的选题。
为什么说它稳?因为这类项目业务链路完整,技术覆盖面广,却又不至于难到让你做不完。游客端要看景点、要搜索、要预订民宿、要买农产品、要发表评价,管理端要维护景点数据、处理订单、看统计报表——这几乎把一套商用信息系统的常见模块全走了一遍。你既能讲清楚业务逻辑,又能展示技术实现,中期检查和最终答辩都站得住脚。
如果你的毕业设计也是类似方向,或者你对“Spring Boot + 微信小程序”这套前后端分离的组合还处于一知半解的状态,那这篇文章就是写给你的。我会把这个项目从选题拆解、技术选型、数据库设计、核心接口实现,到部署上线的完整链路都过一遍,并把我见过的、学生最容易踩的坑提前给你标出来。
1. 项目定位与整体架构拆解
1.1 这个选题为什么值得做
一个毕业设计能不能拿高分,我总结了三个关键点:业务完整性、技术覆盖面、可运行可演示。
从业务完整性来看,农村旅游管理与服务这条线,天然包含用户端和管理端两大板块。用户端有景点浏览、分类搜索、民宿预订、农产品购买、收藏评论;管理端有景点维护、订单处理、用户管理、数据统计。这里面既有C端用户的使用场景,又有B端管理员的运维场景,业务链条是闭合的。评委问你“项目解决了什么问题”,你可以很清晰地说:景点信息线下获取不透明、民宿预订靠电话、农产品销售缺渠道、管理方没有数据沉淀。这些都是真实存在的痛点,不是凭空编的。
从技术覆盖面来看,一个Spring Boot项目能把常用的Web开发组件都覆盖到:Spring MVC写接口、MyBatis-Plus操作数据库、Spring Validation做参数校验、JWT做身份认证、拦截器做登录校验、Redis做缓存、Quartz做定时任务。微信小程序端又涉及登录授权、请求封装、页面路由、组件复用、本地存储。这一套做下来,你对该“前后端分离”架构的理解会非常具体,面试被问到也能说得上话。
从可运行可演示来看,微信小程序几乎是“天然可演示”的载体。评委不用装App,微信扫一扫就能打开你的毕设;你也不需要买苹果开发者账号,个人小程序主体就够用了。后端代码本地跑起来,小程序开发工具连上局域网接口,现场演示完全没压力。
1.2 功能模块怎么划分与取舍
毕设最怕的是“贪多嚼不烂”。我见过不少同学一开始列了十几个功能模块,最后写到一半发现时间根本不够,只能草草收尾,反而连基本功能都没做好。合理的做法是:核心功能做扎实,扩展功能有加分就行。
我建议按下面这个范围来定。
游客端(小程序内):
- 景点列表与详情:分页展示景点,支持按分类(自然风光、民俗文化、农事体验等)筛选,支持关键词搜索。详情页包含图片轮播、文字介绍、地图导航、用户评价。
- 民宿预订:选择入住日期和离店日期,查看可订房源,提交订单。这里可以配合支付流程,也可以做成“提交订单后线下付款”的简化版本,看你的精力。
- 农产品商城:浏览农产品、加入购物车、提交订单。购物车功能可以砍成“直接购买”,减轻前后端的工作量。
- 个人中心:微信登录后的用户信息展示、我的订单列表、我的收藏、联系客服。
管理端(Web页面或小程序内嵌管理页):
- 景点管理:管理员对景点信息做增删改查,上传图片,上下架。
- 订单管理:查看所有订单,按状态筛选,处理订单(确认、取消、完成)。
- 用户管理:查看注册用户列表,禁用异常账号。
- 数据统计:统计每日访问量、订单数量、热门景点排行、销售额变化趋势。
我建议管理端用简单的Web页面来做,因为小程序里再做一套管理后台,页面层级会很绕,而且小程序提交审核时,管理后台类页面还容易被驳回。用Spring Boot模板渲染或者Vue做一个独立管理页,都能把逻辑讲清楚。
没有耐心的同学,可以把农产品商城、购物车、地图导航这些直接砍掉,保留“景点浏览 + 民宿预订 + 个人中心 + 管理端”这条主线,工作量大概能少三分之一,但业务闭环依然完整。
1.3 前后端分离的架构与数据流转
这个项目的整体架构可以用一句话概括:微信小程序只做界面展示和用户交互,所有的业务逻辑和数据存取全部交给后端的Spring Boot服务,小程序通过HTTP接口与后端通信,数据格式统一使用JSON。
具体的数据流转是这样的:小程序启动后,调用wx.login()拿到一个临时登录凭证code,把这个code传给后端,后端用code去微信的接口换取用户的openid和session_key,然后基于openid生成一个JWT令牌返回给小程序。小程序后续每次请求都带上这个令牌,后端通过拦截器校验令牌,从中解析出用户身份。整个登录链路我不夸张地说,是这类项目里最容易出问题的环节,后面我会拿出完整的篇幅来讲。
其他业务数据的流向更直接。比如用户在小程序里搜索“民宿”,小程序把关键字通过GET请求传给后端的/api/attractions/search接口,后端去MySQL里执行模糊查询,把结果转成JSON返回,小程序再把数据渲染到页面上。用户提交一个民宿预订订单,小程序把订单信息POST到后端,后端校验库存和日期后写入数据库,同时修改房源的剩余可订状态。整个链路的业务逻辑全部收敛在后端的Service层,小程序端只做“发起请求”和“展示结果”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与版本避坑指南
2.1 Spring Boot版本:别追新,求稳
这是我要重点强调的一个坑。最近这几年Spring Boot的版本迭代非常快,Spring Boot 3.x已经是很成熟的版本了,但问题是它有两个很折腾人的变化:强制要求JDK 17及以上;底层从javax命名空间迁移到了jakarta。这意味着你上网搜到的很多老教程、老依赖配置直接就不兼容了,会报一堆莫名其妙的错误。
对于毕业设计来说,最稳的选择是Spring Boot 2.7.x版本,配合JDK 8。为什么?因为JDK 8是绝大多数学校机器、学生笔记本上已经装好的环境,不需要重新折腾。而且2.7.x版本的生态资料极其丰富,搜任何报错都能找到对应的解决方案。你用Spring Boot 2.7.18 + JDK 8 + MyBatis-Plus 3.5.x这套组合,基本可以一路顺畅地从开发做到部署。
如果你非要尝试Spring Boot 3.x,那我也拦不住,但请做好心理准备,并确保自己的JDK已经是17以上版本。这篇博文后面的内容,我都以Spring Boot 2.7.x为例来写。
2.2 小程序端:原生开发还是用uniapp
微信小程序端的开发方式有两种主流选择:原生微信小程序和DCloud的uniapp。如果你的毕设只面向微信平台,我建议直接用原生小程序开发。原因很朴素:原生框架不用引入额外的编译链路,微信开发者工具里面直接写WXML、WXSS、JS,调试起来最直接,遇到问题也好百度。而且原生小程序的组件和API调用方式,官方文档说得很清楚,不太容易出现“框架封装导致底层功能用不了”的尴尬。
不过如果你有跨平台的想法,比如想把同一个项目以后也跑成支付宝小程序或抖音小程序,那uniapp是一个不错的选择。它用Vue语法写页面,编译到微信平台时会自动转换成小程序的代码结构。uniapp的代价是:你还要多学一层框架概念,编译过程中偶尔会出现“模拟器正常、真机异常”的诡异问题,排查起来比较消耗时间。
我的建议很简单:大多数毕设场景,选原生,别犹豫。省下来的时间用来打磨后端接口和数据库设计,性价比高得多。
2.3 一套可直接上手的版本搭配
这里给出一套我实测过、踩过坑之后最终确定下来的版本组合,你可以直接照抄:
| 组件 | 版本选择 | 说明 |
|---|---|---|
| JDK | 1.8 | 稳定、够用,不需要升级 |
| Spring Boot | 2.7.18 | 2.7.x系列的最后版本,兼容性好 |
| MyBatis-Plus | 3.5.3 | 与Spring Boot 2.x配合顺畅 |
| MySQL | 5.7或8.0 | 8.0也行,注意驱动配置 |
| Redis | 可选,5.x以上 | 做缓存和验证码存储 |
| JWT库 | jjwt 0.9.1 | 简单易用 |
| 微信开发者工具 | 最新稳定版即可 | 调试小程序端 |
| Maven | 3.6+ | 项目构建工具 |
这套组合最大的好处是资料多、兼容性好。你在开发过程中遇到的大部分报错,搜索引擎一搜就能得到解答。别小看这一点,毕业设计写到后期,很多时候拼的不是技术有多新,而是谁能在有限的排错时间里更快地解决问题。
3. 核心业务模块设计与实现细节
3.1 微信登录:踩坑最多的一环
微信登录是整个项目里最容易出问题的环节。很多同学在网上找教程,照着一顿写,结果登录一直失败,报错信息里经常带一个类似于wx1cb4398e1413dce7这样的appid标识,或者提示“获取登录后的微信用户失败”。这个报错的过程我太熟悉了,我把正确流程和常见坑点都梳理一下。
先说正确流程,总共四个步骤:
第一步,小程序端调用wx.login(),拿到一个临时的code。这个code有效期只有五分钟,而且只能用一次,用完就失效。
第二步,小程序把这个code通过请求发送到后端接口,比如POST /api/user/login,参数是{ code: "临时code" }。
第三步,后端收到code后,用code去请求微信的接口:
code复制GET https://api.weixin.qq.com/sns/jscode2session?appid=你的appid&secret=你的secret&js_code=临时code&grant_type=authorization_code
注意这里的appid和secret必须和你的小程序主体完全一致,前后端用的必须是一套。微信接口会返回openid、session_key和unionid。openid就是用户在这个小程序里的唯一身份标识,你应该把这个openid作为业务主键存到用户表里。
第四步,后端拿到openid后,先去数据库查这个用户是否已经存在,不存在就自动注册一个新用户。然后生成JWT令牌,把令牌和用户基本信息返回给小程序。小程序把令牌存到wx.setStorageSync里,后续所有请求都带上它。
常见的坑有三个。第一个坑是appid与AppSecret不匹配,或者AppSecret填成了别人项目的密钥,导致微信接口返回40013或40125错误码。第二个坑是后端调用微信接口时网络不通,尤其是服务器在国外或者本地网络被限制时,会超时。第三个坑是JWT生成和解析的密钥不一致,导致前端拿到的令牌后端不认。
排查登录问题有一个很实用的思路:先把后端接口用Postman单独测通,不看小程序端。如果Postman能正常返回用户数据,那问题一定出在小程序端的请求拼接或参数传递上;如果Postman也报错,那问题就在后端调微信接口那一步。这样一层层剥开,比瞎试快得多。
关于用户头像和昵称,这里要特别提醒一句:微信官方从2022年下半年开始,把wx.getUserProfile接口的返回规则改了,很多场景下拿不到用户的真实头像和昵称。最稳妥的做法是:让用户在小程序里自己上传头像、输入昵称,或者在登录成功后再做一次“完善个人资料”的引导。你在网上看到的老教程里“登录时直接弹窗获取头像昵称”的写法,在新版微信里已经行不通了。
3.2 景点列表、搜索与图片管理
景点模块是整个小程序里最基础、也最能直接体现Spring Boot后端能力的功能。
后端接口层面,我建议设计两个接口:
GET /api/attractions:分页获取景点列表,支持按分类筛选、按关键字模糊搜索。GET /api/attractions/{id}:获取景点详情,包含图片列表、介绍、位置、联系方式和所有评价。
分页用MyBatis-Plus自带的Page对象就足够了,不需要自己写LIMIT语句。搜索逻辑的话,可以在Service层里判断传入的keyword是否为空,如果不为空就在QueryWrapper上加一个like条件。分类筛选同理。
图片管理是这个模块里最容易忽略、却最影响体验的部分。景点的图片通常由管理员上传,后端接收MultipartFile,把文件保存到服务器的某个目录下,然后把访问URL返回给前端。这里要记住两件事:第一,在application.yml里配置Spring MVC的文件上传大小限制,不然图片稍大一点就会报FileSizeLimitExceededException;第二,要配置静态资源映射,把上传目录映射成HTTP可访问的URL。比如:
code复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
mvc:
static-path-pattern: /upload/**
resources:
static-locations: file:D:/upload/
这样设置之后,管理员上传的图片会保存到D:/upload/目录,前端可以通过http://你的服务器地址:8080/upload/xxx.jpg直接访问。
很多同学做景点图片时,直接用外链图片地址,这样做风险很大。如果外链图片挂了,景点详情页就是一片空白,演示时非常尴尬。把图片下载到自己服务器,哪怕麻烦一点,至少可控。
3.3 民宿预订与订单状态管理
民宿预订是这个项目里最考验逻辑设计的地方。它不只是一个简单的“写入一条订单记录”,而是要处理好几件事:日期校验、库存判断、订单状态流转、超时取消。
先看日期校验。用户提交预订请求时,会带上民宿ID、入住日期和离店日期。后端必须校验离店日期晚于入住日期,并且入住日期不能早于当天。如果对端传过来一个已经过去的日期,要直接拒绝。这个校验用Spring Validation的注解就能做,实在不行自己写一个方法判断也行。
再看库存判断。这里有一个经典的并发问题:同一间民宿、同一个日期段,可能同时被两个用户下单。如果只是查询一下“没有订单”就直接写入,高并发下很容易超卖。对于毕设来说,你不需要上Redis分布式锁这么复杂的方案,只需要在数据库层面加一层约束即可。一个简单的做法是:在民宿表里加一个total_rooms字段和booked_rooms字段,下单前用SELECT ... FOR UPDATE锁住这条民宿记录,然后判断booked_rooms是否已经等于total_rooms,如果没满就更新booked_rooms。这样在MySQL的InnoDB引擎下,同一时间只有一个人能修改这条记录,能解决绝大多数的超卖问题。
订单状态机这部分建议用一个整数字段来管理:
| 状态值 | 含义 | 可操作行为 |
|---|---|---|
| 0 | 待支付 | 用户支付或取消 |
| 1 | 已支付/待入住 | 管理员确认,用户入住 |
| 2 | 已入住 | 管理员操作核销 |
| 3 | 已完成 | 用户评价 |
| 4 | 已取消 | 无 |
| 5 | 已退款 | 无 |
每次状态变更,都建议在OrderService里写一个统一的方法,比如changeOrderStatus(orderId, targetStatus),在方法内部完成状态合法性的判断,避免业务逻辑散落在Controller层。
还有一个容易被忽略的点是超时关单。用户提交订单后如果一直不支付,民宿的库存就一直被占用着,这会引发管理员的投诉。最简单的方案是引入Spring Boot整合Quartz,做一个定时任务,每分钟扫描一次超过30分钟未支付的订单,自动把它们改成已取消,同时释放库存。这个功能做出来之后,在答辩时是很亮眼的加分点。
3.4 管理端与数据统计的加分设计
管理端不做复杂权限系统,一个简单的用户名密码登录,加上一个管理员表即可。管理员登录后,能看到所有订单、所有景点、所有用户。
数据统计模块是拉开设计档次的重点。用一行SQL就能查出“最近7天的订单量变化”:
sql复制SELECT DATE(create_time) AS date, COUNT(*) AS count
FROM orders
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY DATE(create_time)
再配合一个简单的柱状图或折线图,就能很直观地展示运营情况。小程序端如果懒得上图表库,用纯CSS画动态柱状图也可以;管理端Web页面可以引入ECharts,一行echarts.init(dom)就能搞定。
我见过有学生在这个模块做了“热门景点排行”和“游客来源分布”,效果非常好。热门景点排行本质上就是按景点ID分组统计订单量,再关联景点表查出名称。游客来源分布则需要在小程序端获取用户地理位置,把经纬度转换成省市区信息存到用户表里。这两个功能都不难,但视觉冲击力强,答辩老师看了会觉得你有数据思维。
4. 手把手实操:从建项目到前后端联调
4.1 后端Spring Boot项目初始化
我建议直接用Spring Initializr来创建项目,IDEA社区版和旗舰版都内置了这个工具。选择Spring Boot 2.7.18,Java版本选8,Dependencies里勾选Spring Web、MyBatis Framework、MySQL Driver,如果需要Redis就再加Spring Data Redis。生成后把Maven仓库的镜像源换成阿里云镜像,不然下载依赖会慢到怀疑人生。
项目结构上推荐按controller、service、mapper、entity、config、common这几层来分包。新手最容易犯的错误是把所有代码都堆在Controller里,一个接口几百行,看起来就像一锅粥。合理的做法是Controller只负责接收请求、返回响应,业务逻辑写在Service层,数据访问写在Mapper层。
4.2 核心配置与数据库准备
在application.yml里,除了常规的数据源配置,还有几个地方要注意。第一个是server.port,确保不会被其他程序占用,8080就行。第二个是数据库连接串,MySQL 8.0需要在连接串后面加useSSL=false&serverTimezone=Asia/Shanghai,不然会报时区错误。第三个是MyBatis-Plus的逻辑删除配置,给所有表加一个deleted字段,然后配置全局逻辑删除,这样删除操作自动变成更新操作,数据不容易丢。
数据库表的设计,我建议至少包含这六张核心表:
user:用户表,字段有id、openid、昵称、头像、手机号、创建时间。attraction:景点表,字段有id、名称、分类、简介、详细地址、图片URL、经度、纬度。homestay:民宿表,字段有id、名称、介绍、价格、总房间数、已订房间数、图片URL。orders:订单表,字段有id、订单编号、用户ID、民宿ID、入住日期、离店日期、金额、状态、创建时间。comment:评论表,字段有id、用户ID、景点ID、评分、内容、创建时间。admin:管理员表,字段有id、用户名、密码、创建时间。
表结构的核心原则是:字段能加就加,命名要见名知义,不要用中文,不要用a、b这种无意义的缩写。
4.3 小程序端登录态与请求封装
小程序端最基础、也最重要的一段代码,是封装一个统一的请求函数。你不可能在每个页面里都重复写一遍wx.request,而是在utils/request.js里统一封装。
javascript复制const BASE_URL = 'http://localhost:8080'
function request(url, method, data) {
return new Promise((resolve, reject) => {
wx.request({
url: BASE_URL + url,
method: method,
data: data,
header: {
'Content-Type': 'application/json',
'Authorization': wx.getStorageSync('token') || ''
},
success: (res) => {
if (res.data.code === 200) {
resolve(res.data.data)
} else if (res.data.code === 401) {
wx.navigateTo({ url: '/pages/login/login' })
reject(res.data)
} else {
reject(res.data)
}
},
fail: (err) => {
reject(err)
}
})
})
}
module.exports = {
get: (url, data) => request(url, 'GET', data),
post: (url, data) => request(url, 'POST', data)
}
这样封装之后,页面里调用接口就变得很简洁:
javascript复制const request = require('../../utils/request')
request.get('/api/attractions', { page: 1, size: 10 }).then(res => {
this.setData({ list: res.records })
})
登录态的处理逻辑是:小程序启动时先检查本地存储里有没有token,没有就跳转登录页,有就直接进入首页。后端拦截器会对每个需要登录的接口校验token,token过期或无效时返回401,前端统一拦截到401后跳转登录页。
4.4 本地联调环境配置
本地联调最容易犯的错误是:小程序端请求的后端地址写成了http://localhost:8080。在微信开发者工具里,localhost指的是你电脑的地址,如果是同一台电脑上把小程序模拟器和后端都跑起来,这个确实能用。但如果你想用手机真机调试,手机访问不到电脑的localhost,必须把地址改成电脑在局域网内的IP,比如http://192.168.1.105:8080。
另外,小程序默认只允许访问HTTPS域名,本地开发时需要在微信开发者工具的“详情 - 本地设置”里勾选“不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书”。不勾选的话,请求直接会被拦截,报的错也很让人困惑。
如果你在真机调试时遇到net::ERR_CONNECTION_RESET,大概率是手机和电脑不在同一个Wi-Fi下,或者电脑防火墙拦截了来自手机的请求。解决办法是:确保两者连同一个路由器,然后暂时关闭电脑防火墙试一下。
5. 部署上线与高频问题排查
5.1 打包部署:JAR包方式与Docker方式
后端项目写完后,用Maven打包成可执行的JAR包:
bash复制mvn clean package
打包完成后,在target目录下会生成一个xxx.jar文件。然后在服务器上执行:
bash复制java -jar xxx.jar
后端服务就跑起来了。如果你用JDK 1.8打包,部署的服务器也要装JDK 1.8,版本不一致会直接启动失败。很多人在本地打包顺利,放到服务器却跑不起来,第一个要检查的就是JDK版本。
如果你学了Docker,也可以把Spring Boot项目打包成Docker镜像。方式不复杂:写一个Dockerfile,基础镜像选择openjdk:8-jre-alpine,把JAR包复制进去,然后指定启动命令。用docker build构建镜像,用docker run启动容器。本地Windows环境用Docker Desktop来跑这套流程,是现在比较主流的做法。唯一的坑是Docker Desktop的配置需要给足内存,不然大项目构建时容易OOM(内存溢出)。
小程序端部署上线则要走微信公众平台的后台流程:提交代码、填写版本描述、提交审核、审核通过后发布。整个流程一般需要1到3个工作日,所以如果你的毕设需要上线演示,一定要提前至少一周开始走审核流程。
5.2 高频问题速查表
我整理了一份自己带学生时高频遇到的问题清单,按出现频率排序:
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
登录报错获取登录后的微信用户失败 |
后端用code换openid失败,或JWT生成解析不一致 | 先用Postman单测后端微信登录接口,确认appid和secret正确 |
真机调试请求失败net::ERR_CONNECTION_RESET |
手机与电脑不在同一网络,或防火墙拦截 | 改为局域网IP地址,关闭电脑防火墙 |
| 图片上传后访问不到 | 静态资源映射未配置,或路径拼接错误 | 检查static-locations配置,拼接完整URL测试 |
| Spring Boot 3.x下MyBatis-Plus报错 | 版本不兼容,MyBatis-Plus未适配jakarta | 降级到Spring Boot 2.7.x,或升级MyBatis-Plus到3.5.4+ |
| 页面白屏或接口返回404 | Controller路径写错,或小程序端BASE_URL配错 | 检查后端控制台日志,确认请求路径和后端映射一致 |
| 定时任务不执行 | 未添加@EnableScheduling注解 |
在启动类上补加注解 |
| 数据库插入中文乱码 | 数据库连接串和表的字符集不一致 | 连接串加characterEncoding=utf8,表结构统一utf8mb4 |
这些坑我基本都陪学生踩过一遍。大部分问题不是技术有多难,而是配置文件或路径的小错误,一旦定位到根本原因,修复通常只需要几分钟。
5.3 中期检查和答辩时的展示技巧
毕设做到能运行只是第一步,答辩时怎么展示也很关键。我有几个经验可以分享。
第一,提前准备一份“演示脚本”,从头到尾把核心流程串一遍。比如:小程序启动 → 登录 → 搜索“民宿” → 打开景点详情 → 提交民宿订单 → 切到管理端,看到这个订单 → 管理员确认订单 → 回到小程序端刷新,订单状态变化。整个演示过程控制在三到五分钟,节奏紧凑,评委一看就知道你的项目是能跑通闭环的。
第二,准备几个“彩蛋”功能点。比如数据库里的某个查询用了索引,某处接口做了缓存,定时任务会定期清理过期订单。这些细节不需要刻意堆砌,就在讲解业务时不经意地带到,会让评委觉得你不仅会调API,还懂设计。
第三,千万不要在答辩现场现场演示微信登录。因为登录依赖微信服务器,一旦现场网络不稳定,登录失败会非常影响观感。正确做法是在演示前提前登录好,或者准备一个“游客模式”入口,绕开登录直接浏览景点。
最后再分享一点个人经验
这套“Spring Boot + 微信小程序”的组合,我已经看着一届又一届的学生用过了。说实话,它不会让你变成技术大牛,但一定会让你对“一个真实项目是如何从0到1跑起来的”有非常直观的认知。我自己刚学后端那会儿,也总想着一口气用上最新的技术、最炫的架构,后来才明白,能按时交付、稳定运行、把业务闭环讲清楚,比什么都重要。
如果你也正在做类似的毕业设计,我建议你先别急着写代码,花两天时间把数据库表设计和接口列表先列出来,列清楚每个页面需要哪些接口、每个接口返回什么字段。这个准备工作看起来不起眼,但能帮你省下后期至少一半的返工时间。项目写到一半遇到问题觉得“根本做不完”是很正常的,别慌,拆一拆、理一理,很多问题没有你想象的那么难。
