温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着互联网和移动支付的普及,线上购物已成为人们日常生活的重要组成部分。鲜花作为一种具有时效性、季节性和情感属性的特殊商品,其线上销售模式与传统电商存在显著差异:消费者对鲜花的新鲜度、配送时效和包装品质要求极高,同时鲜花品类繁多、库存管理复杂、节日性需求波动大。传统线下花店受限于门店辐射范围、营业时间和人工成本,难以满足日益增长的线上消费需求。
因此,开发一套基于SpringBoot的鲜花在线商城管理系统具有重要的现实意义:
- 提升购物体验:为消费者提供全天候、跨地域的鲜花选购渠道,支持在线浏览、下单、支付和订单跟踪。
- 优化库存管理:通过系统化的库存预警和进销存管理,减少鲜花因滞销或过度采购造成的损耗。
- 降低运营成本:自动化处理订单、配送和客户管理流程,减少人工干预,提高花店运营效率。
- 数据驱动决策:通过销售数据统计分析,帮助商家掌握热销品类、节日消费规律,制定精准营销策略。
2. 系统技术栈
本系统采用前后端分离的架构设计,后端基于SpringBoot框架构建,前端使用Vue.js配合Element UI组件库,数据库选用MySQL,缓存层使用Redis。整体技术栈如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | SpringBoot 2.7.x | 简化Spring应用搭建与配置,内嵌Tomcat容器 |
| 持久层框架 | MyBatis-Plus | 简化数据库操作,内置通用CRUD与分页插件 |
| 数据库 | MySQL 8.0 | 存储用户、商品、订单等核心业务数据 |
| 缓存 | Redis | 缓存热点商品数据、验证码和购物车会话 |
| 安全认证 | Spring Security + JWT | 实现用户登录认证与接口权限控制 |
| 前端框架 | Vue.js 3 + Element UI | 构建响应式管理后台与商城前端页面 |
| 构建工具 | Maven | 项目依赖管理与构建打包 |
| 接口文档 | Swagger / Knife4j | 自动生成在线接口调试文档 |
3. 系统功能模块设计
系统按用户角色划分为前台商城和后台管理两大端,主要功能模块如下:
3.1 前台商城模块
- 用户注册与登录:支持手机号注册、密码登录、JWT令牌鉴权。
- 鲜花浏览与搜索:按分类、价格、销量等条件筛选商品,支持关键词模糊搜索。
- 购物车管理:商品加入购物车、修改数量、删除商品、批量结算。
- 订单管理:提交订单、在线支付(模拟)、订单状态查询、取消订单。
- 个人中心:收货地址管理、订单历史、个人信息修改。
3.2 后台管理模块
- 商品管理:鲜花商品的增删改查、上下架、库存设置、图片上传。
- 分类管理:维护鲜花分类层级,如玫瑰、百合、康乃馨等。
- 订单管理:查看全部订单、发货处理、订单状态流转。
- 用户管理:查看注册用户列表、禁用/启用账号。
- 数据统计:按日/月统计销售额、订单量、热销商品排行。
4. 数据库设计
系统核心数据表包括用户表、商品表、分类表、购物车表、订单表和订单明细表。以下为关键表结构设计:
-- 用户表 CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL, `phone` VARCHAR(20), `avatar` VARCHAR(255), `role` TINYINT DEFAULT 0 COMMENT '0-普通用户 1-管理员', `status` TINYINT DEFAULT 1 COMMENT '1-正常 0-禁用', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 商品表 CREATE TABLE `flower` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, `category_id` BIGINT NOT NULL, `price` DECIMAL(10,2) NOT NULL, `stock` INT DEFAULT 0, `image` VARCHAR(255), `description` TEXT, `sales` INT DEFAULT 0, `status` TINYINT DEFAULT 1 COMMENT '1-上架 0-下架', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 订单表 CREATE TABLE `orders` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `order_no` VARCHAR(32) NOT NULL UNIQUE, `user_id` BIGINT NOT NULL, `total_amount` DECIMAL(10,2) NOT NULL, `status` TINYINT DEFAULT 0 COMMENT '0-待支付 1-已支付 2-已发货 3-已完成 4-已取消', `receiver_name` VARCHAR(50), `receiver_phone` VARCHAR(20), `receiver_address` VARCHAR(255), `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP );5. 核心代码实现
5.1 SpringBoot启动类与全局配置
@SpringBootApplication @MapperScan("com.flower.shop.mapper") public class FlowerShopApplication { public static void main(String[] args) { SpringApplication.run(FlowerShopApplication.class, args); } }5.2 商品实体类
@Data @TableName("flower") public class Flower { @TableId(type = IdType.AUTO) private Long id; private String name; private Long categoryId; private BigDecimal price; private Integer stock; private String image; private String description; private Integer sales; private Integer status; private LocalDateTime createTime; }5.3 商品查询接口
@RestController @RequestMapping("/api/flower") public class FlowerController { @Autowired private FlowerService flowerService; @GetMapping("/list") public Result<Page<Flower>> list( @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, @RequestParam(required = false) Long categoryId, @RequestParam(required = false) String keyword) { Page<Flower> pageResult = flowerService.queryFlowerPage(page, size, categoryId, keyword); return Result.success(pageResult); } @GetMapping("/{id}") public Result<Flower> detail(@PathVariable Long id) { return Result.success(flowerService.getById(id)); } }5.4 商品服务实现类
@Service public class FlowerServiceImpl extends ServiceImpl<FlowerMapper, Flower> implements FlowerService { @Override public Page<Flower> queryFlowerPage(Integer page, Integer size, Long categoryId, String keyword) { LambdaQueryWrapper<Flower> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Flower::getStatus, 1); if (categoryId != null) { wrapper.eq(Flower::getCategoryId, categoryId); } if (StringUtils.hasText(keyword)) { wrapper.like(Flower::getName, keyword); } wrapper.orderByDesc(Flower::getSales); return this.page(new Page<>(page, size), wrapper); } }5.5 下单核心逻辑
@Service public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService { @Autowired private FlowerService flowerService; @Override @Transactional(rollbackFor = Exception.class) public Orders createOrder(OrderCreateDTO dto, Long userId) { // 生成订单号 String orderNo = "FL" + System.currentTimeMillis() + RandomUtil.randomNumbers(4); Orders order = new Orders(); order.setOrderNo(orderNo); order.setUserId(userId); order.setReceiverName(dto.getReceiverName()); order.setReceiverPhone(dto.getReceiverPhone()); order.setReceiverAddress(dto.getReceiverAddress()); // 计算订单总金额并扣减库存 BigDecimal total = BigDecimal.ZERO; for (OrderItemDTO item : dto.getItems()) { Flower flower = flowerService.getById(item.getFlowerId()); if (flower == null || flower.getStock() < item.getQuantity()) { throw new BusinessException("商品库存不足:" + flower.getName()); } // 扣减库存 flower.setStock(flower.getStock() - item.getQuantity()); flower.setSales(flower.getSales() + item.getQuantity()); flowerService.updateById(flower); total = total.add(flower.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); } order.setTotalAmount(total); order.setStatus(0); this.save(order); return order; } }5.6 JWT登录认证核心代码
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Autowired private StringRedisTemplate redisTemplate; @Override public String login(String username, String password) { User user = this.getOne(new LambdaQueryWrapper<User>() .eq(User::getUsername, username)); if (user == null || !MD5Util.verify(password, user.getPassword())) { throw new BusinessException("用户名或密码错误"); } if (user.getStatus() == 0) { throw new BusinessException("账号已被禁用"); } // 生成JWT令牌 String token = JwtUtil.createToken(user.getId(), user.getUsername(), user.getRole()); // 缓存登录状态 redisTemplate.opsForValue().set("login:token:" + user.getId(), token, 24, TimeUnit.HOURS); return token; } }6. 系统部署与运行
项目采用Maven进行依赖管理,打包后生成可执行的Jar包。部署时需预先安装MySQL和Redis服务,并在application.yml中配置数据库连接和Redis地址。启动命令如下:
mvn clean package -DskipTests java -jar flower-shop.jar --spring.profiles.active=prod7. 总结
本文围绕基于SpringBoot的鲜花在线商城管理系统,从项目背景意义、技术栈选型、功能模块设计、数据库设计到核心代码实现进行了系统阐述。该系统充分利用SpringBoot的快速开发特性,结合MyBatis-Plus、Redis和JWT等主流技术,实现了鲜花商品展示、在线下单、订单管理和后台数据统计等完整业务闭环。通过该系统的建设,能够有效帮助花店商家拓展线上销售渠道,提升运营效率,也为同类电商系统的开发提供了可参考的实践方案。