1. 项目概述:智慧小饭桌微信小程序开发实践
作为一名有10年全栈开发经验的工程师,我近期完成了一个基于SpringBoot的智慧小饭桌微信小程序项目。这个项目主要解决都市白领和独居人士的日常用餐需求,通过线上平台连接家庭厨房和用餐者,打造一个安全、便捷的餐饮服务平台。
这个项目采用前后端分离架构,后端使用SpringBoot+MyBatisPlus技术栈,前端采用微信小程序+Vue.js组合。系统包含用户端和管理端两大模块,实现了从菜品展示、下单支付到订单管理的完整闭环。特别适合作为计算机相关专业的毕业设计选题,因为它涵盖了现代Web开发的典型技术要素。
技术选型考量:选择SpringBoot是因为其快速开发特性和丰富的生态;微信小程序作为前端载体具有天然的流量优势;MySQL作为关系型数据库能很好支撑业务数据的一致性需求。
2. 系统架构设计
2.1 技术栈全景图
本系统采用分层架构设计,主要技术组件如下:
| 层级 | 技术选型 | 版本 | 选型理由 |
|---|---|---|---|
| 前端 | 微信小程序+Vue.js | Vue2.6 | 小程序生态成熟,Vue开发效率高 |
| 网关 | Nginx | 1.18 | 高性能反向代理和负载均衡 |
| 后端 | SpringBoot | 2.5.6 | 快速构建微服务,约定优于配置 |
| ORM | MyBatisPlus | 3.4.3 | 简化CRUD操作,内置分页插件 |
| 数据库 | MySQL | 8.0 | 关系型数据库,ACID特性保障 |
| 缓存 | Redis | 6.2 | 提升系统响应速度,减轻DB压力 |
2.2 核心架构模式
系统采用经典的MVC模式,但进行了现代化改进:
-
视图层(View):微信小程序页面使用WXML+WXSS构建,采用组件化开发模式。每个页面由4个文件组成:
- .json 配置文件
- .wxml 模板文件
- .wxss 样式文件
- .js 逻辑文件
-
控制层(Controller):SpringBoot的@RestController处理HTTP请求,主要职责包括:
- 参数校验
- 权限控制
- 异常处理
- 响应封装
-
服务层(Service):业务逻辑的核心实现层,采用领域驱动设计(DDD)思想,包含:
- 应用服务:协调领域对象完成业务用例
- 领域服务:封装核心业务逻辑
- 基础设施服务:如短信、支付等第三方集成
-
持久层(Repository):MyBatisPlus实现数据访问,主要特性包括:
- Lambda表达式查询
- 自动分页
- 逻辑删除
- 乐观锁
架构设计心得:在实际开发中,我们特别注重层与层之间的隔离。例如,Controller只负责流程控制,不包含业务逻辑;Service层保持无状态,所有依赖都通过接口注入。
3. 数据库设计与优化
3.1 核心表结构设计
系统数据库包含12张核心表,以下是关键表的设计:
用户表(t_user)
sql复制CREATE TABLE `t_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '登录账号',
`password` varchar(64) NOT NULL COMMENT '加密后的密码',
`salt` varchar(32) NOT NULL COMMENT '加密盐值',
`phone` varchar(11) DEFAULT NULL COMMENT '手机号',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`user_type` tinyint NOT NULL DEFAULT '1' COMMENT '1-普通用户 2-厨师',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '0-禁用 1-正常',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
菜品表(t_dish)
sql复制CREATE TABLE `t_dish` (
`id` bigint NOT NULL AUTO_INCREMENT,
`chef_id` bigint NOT NULL COMMENT '厨师ID',
`name` varchar(64) NOT NULL COMMENT '菜品名称',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`image_url` varchar(255) DEFAULT NULL COMMENT '图片URL',
`category_id` int DEFAULT NULL COMMENT '分类ID',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '0-下架 1-上架',
`sales` int NOT NULL DEFAULT '0' COMMENT '销量',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_chef_id` (`chef_id`),
KEY `idx_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜品表';
3.2 数据库优化实践
-
索引优化:
- 为所有外键字段添加普通索引
- 高频查询条件建立组合索引
- 使用EXPLAIN分析执行计划
-
SQL优化:
- 避免SELECT *,只查询必要字段
- 使用JOIN替代子查询
- 大数据量分页使用延迟关联
-
缓存策略:
- 热点数据使用Redis缓存
- 采用多级缓存架构
- 缓存失效策略:LRU+超时双重机制
数据库设计经验:在毕业设计项目中,建议先完成核心表的ER图设计,再通过PowerDesigner等工具进行正向工程生成DDL。特别注意字段注释和索引设计,这对后期性能优化至关重要。
4. 核心功能模块实现
4.1 用户认证与授权
系统采用改良版的RBAC权限模型,主要实现要点:
- 密码安全处理:
java复制// 密码加密工具类
public class PasswordUtil {
private static final int HASH_ITERATIONS = 1024;
public static String encrypt(String password, String salt) {
return new SimpleHash("SHA-256", password, salt, HASH_ITERATIONS).toHex();
}
public static String generateSalt() {
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
}
}
- JWT令牌实现:
java复制public class JwtTokenUtil {
private static final String SECRET = "your-secret-key";
private static final long EXPIRATION = 86400L; // 24小时
public static String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("sub", userDetails.getUsername());
claims.put("created", new Date());
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION * 1000))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static String getUsernameFromToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
4.2 订单业务流程
订单状态机设计:
mermaid复制stateDiagram-v2
[*] --> PENDING
PENDING --> PAID: 支付成功
PENDING --> CANCELLED: 用户取消
PAID --> PREPARING: 商家接单
PREPARING --> DELIVERING: 开始配送
DELIVERING --> COMPLETED: 确认收货
DELIVERING --> REFUNDING: 申请退款
REFUNDING --> REFUNDED: 退款成功
REFUNDING --> DELIVERING: 拒绝退款
关键实现代码:
java复制@Transactional
public OrderDTO createOrder(OrderCreateVO createVO) {
// 1. 参数校验
validateOrderParams(createVO);
// 2. 库存预扣减
reduceInventory(createVO.getItems());
// 3. 生成订单号
String orderNo = generateOrderNo();
// 4. 保存订单主表
Order order = new Order();
order.setOrderNo(orderNo);
order.setUserId(SecurityUtil.getCurrentUserId());
order.setStatus(OrderStatus.PENDING.getCode());
orderMapper.insert(order);
// 5. 保存订单明细
saveOrderItems(order.getId(), createVO.getItems());
// 6. 发送延迟消息检查支付状态
sendPaymentCheckMessage(orderNo);
return convertToDTO(order);
}
5. 系统部署与运维
5.1 生产环境部署方案
推荐使用Docker Compose进行容器化部署:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: xiaofanzhuo
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
restart: always
redis:
image: redis:6.2
container_name: redis
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
restart: always
backend:
build: ./backend
container_name: backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
- SPRING_PROFILES_ACTIVE=prod
restart: always
5.2 性能优化建议
-
前端优化:
- 小程序分包加载
- 图片懒加载
- 接口合并请求
- 本地缓存策略
-
后端优化:
- Nginx配置Gzip压缩
- 接口响应缓存
- 异步化处理
- 连接池优化
-
数据库优化:
- 读写分离
- 慢查询监控
- 定期维护索引
6. 毕业设计实施建议
6.1 开发里程碑规划
建议按照以下阶段推进项目:
-
需求分析阶段(1周)
- 完成需求规格说明书
- 绘制用例图
- 确定技术栈
-
设计阶段(1周)
- 数据库ER设计
- 接口文档设计
- UI原型设计
-
编码阶段(3周)
- 搭建基础框架
- 核心功能实现
- 单元测试编写
-
测试阶段(1周)
- 功能测试
- 性能测试
- 安全测试
-
文档编写(1周)
- 毕业论文撰写
- 答辩PPT制作
- 项目文档整理
6.2 常见问题解决方案
-
微信登录失败:
- 检查appid和secret配置
- 确认域名白名单设置
- 检查网络请求是否被拦截
-
支付功能调试:
- 使用沙箱环境测试
- 检查签名算法
- 验证回调地址
-
性能瓶颈排查:
- Arthas诊断工具
- SkyWalking监控
- JProfiler分析
项目开发心得:在开发过程中,建议每天进行代码提交,并编写有意义的commit message。使用Git分支管理功能,如feature分支开发新功能,hotfix分支修复紧急问题。这不仅能提高开发效率,也能为毕业答辩展示规范的开发流程。