1. 项目概述
这个基于Spring Boot的花店鲜花销售管理系统是一个典型的B/S架构电商平台,专为中小型花店设计开发。作为一名有10年Java开发经验的工程师,我在实际开发中发现很多花店还在使用手工记账或简单的Excel管理,这种传统方式存在库存不透明、订单易遗漏、客户管理混乱等问题。这个系统正是为了解决这些痛点而生。
系统采用前后端分离架构,后端使用Spring Boot+MyBatis Plus技术栈,前端基于Vue.js实现响应式布局,数据库选用MySQL 8.0。从技术选型来看,这套组合既保证了开发效率,又能满足中小型花店的性能需求。我在实际部署测试中,系统在2核4G的云服务器上可以稳定支持200+的并发访问。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型解析
选择Spring Boot作为后端框架主要基于三个实际考量:
- 快速启动:通过starter依赖和自动配置,3天就搭建好了基础框架
- 微服务友好:未来扩展线上商城时可以直接拆分为微服务
- 生态丰富:整合MyBatis、Redis、RabbitMQ等中间件非常方便
前端选择Vue.js而非React或Angular,主要是考虑到:
- 学习曲线平缓,花店员工容易上手
- 组件化开发效率高,我们复用了很多电商通用组件
- 与Element UI配合良好,快速构建管理后台
数据库选用MySQL 8.0而非MongoDB,因为:
- 花店数据关系明确,适合关系型数据库
- MySQL事务支持完善,订单处理更可靠
- 运维成本低,中小团队更容易掌握
2.2 核心架构设计
系统采用经典的三层架构:
code复制表示层(Vue) → 业务逻辑层(Spring Boot) → 数据访问层(MyBatis Plus)
这种分层带来了几个实际好处:
- 开发时可以并行工作,前端和后端工程师只需约定API接口
- 故障隔离性好,去年双十一期间前端出现性能问题,后端服务依然稳定
- 便于扩展,我们后来新增的微信小程序直接复用现有API
经验分享:在实际部署时,建议将静态资源(图片、CSS等)放在CDN上。我们测试发现这样能使页面加载时间减少40%左右。
3. 核心功能实现
3.1 商品管理模块
商品管理是系统的核心功能之一,包含以下几个关键点:
数据库设计:
sql复制CREATE TABLE `flower` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '花名',
`category_id` int NOT NULL COMMENT '分类ID',
`price` decimal(10,2) NOT NULL COMMENT '售价',
`cost_price` decimal(10,2) DEFAULT NULL COMMENT '成本价',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存',
`image_url` varchar(255) DEFAULT NULL COMMENT '主图',
`status` tinyint NOT NULL DEFAULT '1' 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_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键业务逻辑:
- 库存预警:当库存低于阈值时自动发送通知
java复制public void checkStockWarning(Long flowerId) {
Flower flower = flowerMapper.selectById(flowerId);
if (flower.getStock() < STOCK_WARNING_THRESHOLD) {
String message = String.format("商品%s库存不足,当前库存%d",
flower.getName(), flower.getStock());
notificationService.sendStockWarning(message);
}
}
- 价格变动记录:使用AOP记录价格修改历史
java复制@Aspect
@Component
public class PriceChangeAspect {
@AfterReturning(pointcut = "execution(* com.flower.service.FlowerService.updatePrice(..))",
returning = "result")
public void logPriceChange(JoinPoint jp, Object result) {
Object[] args = jp.getArgs();
Long flowerId = (Long) args[0];
BigDecimal newPrice = (BigDecimal) args[1];
Flower flower = flowerMapper.selectById(flowerId);
priceChangeLogMapper.insert(new PriceChangeLog(
flowerId, flower.getPrice(), newPrice, "系统修改"));
}
}
3.2 订单处理流程
订单模块采用了状态机模式来管理订单生命周期:
java复制public enum OrderStatus {
UNPAID(1, "待支付"),
PAID(2, "已支付"),
SHIPPED(3, "已发货"),
COMPLETED(4, "已完成"),
CANCELLED(5, "已取消"),
REFUNDED(6, "已退款");
// 状态转换规则
private static final Map<OrderStatus, Set<OrderStatus>> STATUS_TRANSITIONS =
ImmutableMap.<OrderStatus, Set<OrderStatus>>builder()
.put(UNPAID, ImmutableSet.of(PAID, CANCELLED))
.put(PAID, ImmutableSet.of(SHIPPED, REFUNDED))
.put(SHIPPED, ImmutableSet.of(COMPLETED, REFUNDED))
.build();
public static boolean canTransition(OrderStatus from, OrderStatus to) {
return STATUS_TRANSITIONS.getOrDefault(from, Collections.emptySet())
.contains(to);
}
}
踩坑记录:最初没有使用状态机模式,直接通过if-else判断状态转换,导致代码难以维护。后来重构为状态机模式后,新增状态转换规则变得非常清晰。
4. 系统安全设计
4.1 认证与授权
系统采用JWT+Spring Security实现安全控制:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
安全实践心得:
- 密码存储使用BCrypt加密,不要使用MD5或SHA-1
- JWT token设置合理过期时间(建议2小时)
- 敏感操作(如删除、退款)需要二次确认
- 定期审计权限分配,避免权限过度集中
4.2 数据安全
- 数据库层面:
- 敏感字段(如手机号、地址)加密存储
- 定期备份(我们设置的是每日凌晨3点全量备份)
- 使用SQL注入防护(MyBatis Plus自带防护)
- 传输层面:
- 全站HTTPS
- 敏感API请求体加密
- 日志记录:
- 关键操作记录详细日志
- 日志文件定期归档
5. 性能优化实践
5.1 缓存策略
采用多级缓存架构:
- 本地缓存(Caffeine):缓存热点商品信息
- Redis缓存:
- 商品详情
- 购物车数据
- 首页推荐
java复制@Service
public class FlowerServiceImpl implements FlowerService {
@Cacheable(value = "flower", key = "#id")
public Flower getById(Long id) {
return flowerMapper.selectById(id);
}
@CachePut(value = "flower", key = "#flower.id")
public Flower update(Flower flower) {
flowerMapper.updateById(flower);
return flower;
}
}
5.2 数据库优化
- 索引优化:
- 为常用查询字段建立组合索引
- 避免过度索引,我们定期使用EXPLAIN分析慢查询
- 分表策略:
- 订单表按月分表
- 日志表按周分表
- SQL优化:
- 避免SELECT *
- 使用JOIN替代子查询
- 大数据量查询使用分页
6. 部署与监控
6.1 部署方案
我们采用Docker Compose部署方案:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
ports:
- "3306:3306"
redis:
image: redis:6.2
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
- SPRING_PROFILES_ACTIVE=prod
6.2 监控方案
- Spring Boot Actuator:提供健康检查、metrics等端点
- Prometheus + Grafana:监控系统指标
- ELK:收集和分析日志
运维经验:一定要设置合理的告警阈值。我们曾经因为磁盘空间告警设置过高,导致日志写满磁盘服务宕机。
7. 项目扩展方向
在实际运营过程中,我们发现系统还可以在以下方面进行扩展:
- 微信小程序端:开发配套小程序,提升用户购物体验
- 智能推荐:基于用户购买历史实现个性化推荐
- 供应链管理:整合供应商系统,实现自动补货
- 数据分析:增加销售数据可视化分析功能
这个项目从技术选型到架构设计都经过精心考量,在实际运行中表现稳定。特别是在情人节、母亲节等高峰时段,系统成功支撑了日均500+订单的处理需求。对于计算机专业的学生来说,通过研究这个项目的源码,可以学习到企业级Java应用的完整开发流程和最佳实践。
