1. 项目背景与核心需求
鲜花电商系统作为典型的B2C垂直领域应用,面临着季节性流量波动大、商品时效性强、订单地域集中等业务特点。传统鲜花店受限于物理空间和营业时间,而线上平台能实现24小时营业、跨区域配送和个性化定制服务。这个基于SSM框架的鲜花商城系统,正是为了解决以下行业痛点:
- 库存动态管理:鲜花属于易损耗商品,需要实时同步线上线下库存
- 时效性订单处理:特殊节日订单量激增时需保证系统稳定性
- 多维度商品展示:需要支持360°图片、视频等富媒体展示方式
- 灵活的促销体系:需支持节日特惠、组合花束、会员折扣等营销玩法
2. 技术架构设计解析
2.1 框架选型依据
选择SSM(Spring+SpringMVC+MyBatis)组合主要基于以下考量:
-
Spring 5.x:
- 控制反转(IoC)管理Service层业务组件
- 声明式事务管理(@Transactional)确保订单数据一致性
- AOP实现日志记录、性能监控等横切关注点
- 实际配置示例:
xml复制<!-- 事务管理器配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
-
SpringMVC:
- RESTful风格API设计支持多端接入
- 拦截器实现权限验证(如@Auth注解)
- 文件上传组件处理花束定制图片
- 典型控制器示例:
java复制@RestController @RequestMapping("/api/flower") public class FlowerController { @Autowired private FlowerService flowerService; @GetMapping("/{id}") public Result<FlowerVO> getDetail(@PathVariable Long id) { return Result.success(flowerService.getDetail(id)); } }
-
MyBatis 3.x:
- 动态SQL处理复杂商品查询条件
- 二级缓存缓解节日期间数据库压力
- 插件实现分页逻辑复用
- 动态SQL示例:
xml复制<select id="selectByCondition" resultType="Flower"> SELECT * FROM t_flower <where> <if test="priceMin != null">AND price >= #{priceMin}</if> <if test="priceMax != null">AND price <= #{priceMax}</if> <if test="keywords != null"> AND name LIKE CONCAT('%',#{keywords},'%') </if> </where> ORDER BY sales DESC </select>
2.2 系统分层架构
code复制表现层:JSP/JSTL + Bootstrap (前台) | Vue.js (后台管理)
↓
控制层:SpringMVC (@Controller)
↓
业务层:Spring (@Service)
↓
持久层:MyBatis (Mapper接口)
↓
数据层:MySQL 8.0 (主从分离) + Redis (缓存)
3. 核心业务模块实现
3.1 商品模块设计
数据模型优化:
java复制public class Flower {
private Long id;
private String name; // 商品名称
private BigDecimal price; // 基准价格
private Integer stock; // 可用库存
private Integer virtualStock; // 虚拟库存
private Integer categoryId; // 分类ID
private List<FlowerImage> images; // 商品图集
private List<FlowerSpec> specs; // 规格选项
}
库存扣减策略:
- 采用乐观锁防止超卖:
sql复制UPDATE t_flower SET stock = stock - #{quantity} WHERE id = #{id} AND stock >= #{quantity} - 库存预占机制:下单时先扣减虚拟库存,支付成功再扣真实库存
3.2 订单模块设计
状态机设计:
java复制public enum OrderStatus {
UNPAID(1, "待支付"),
PAID(2, "已支付"),
DELIVERED(3, "已发货"),
COMPLETED(4, "已完成"),
CANCELLED(-1, "已取消");
// 状态流转校验逻辑
public static boolean canChangeTo(OrderStatus from, OrderStatus to) {
// 具体校验规则...
}
}
分布式ID生成:
采用Snowflake算法保证订单ID全局唯一:
java复制public class OrderIdGenerator {
private final long datacenterId;
private final long machineId;
private long sequence = 0L;
private long lastTimestamp = -1L;
public synchronized long nextId() {
// 实现细节...
}
}
3.3 支付集成方案
-
支付宝沙箱环境配置:
properties复制# application-payment.properties alipay.gateway=https://openapi.alipaydev.com/gateway.do alipay.appId=2021000122634567 alipay.privateKey=MIICeAIBADANBgkqh... alipay.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD... -
支付结果异步通知处理:
java复制@PostMapping("/payment/notify") public String handleAlipayNotify(@RequestParam Map<String,String> params) { boolean verifyResult = AlipaySignature.rsaCheckV1(...); if(verifyResult && "TRADE_SUCCESS".equals(params.get("trade_status"))) { orderService.processPaidOrder(params.get("out_trade_no")); return "success"; } return "failure"; }
4. 性能优化实践
4.1 缓存策略设计
多级缓存架构:
code复制请求 → Nginx本地缓存 → Redis集群 → 数据库
缓存击穿解决方案:
java复制public Flower getById(Long id) {
String cacheKey = "flower:" + id;
// 1. 先查Redis
Flower flower = redisTemplate.opsForValue().get(cacheKey);
if(flower == null) {
// 2. 获取分布式锁
RLock lock = redissonClient.getLock("lock:flower:" + id);
try {
lock.lock();
// 3. 二次检查
flower = redisTemplate.opsForValue().get(cacheKey);
if(flower == null) {
// 4. 查数据库
flower = flowerMapper.selectById(id);
// 5. 回填缓存并设置过期时间
redisTemplate.opsForValue().set(
cacheKey, flower, 30, TimeUnit.MINUTES);
}
} finally {
lock.unlock();
}
}
return flower;
}
4.2 数据库优化
索引设计:
sql复制-- 商品表索引
CREATE INDEX idx_category_price ON t_flower(category_id, price);
CREATE INDEX idx_sales ON t_flower(sales DESC);
-- 订单表分库分键设计
-- 按用户ID哈希分片
CREATE TABLE t_order_0 (
id BIGINT PRIMARY KEY,
user_id BIGINT,
...
) ENGINE=InnoDB;
慢查询监控:
xml复制<!-- mybatis-config.xml -->
<settings>
<setting name="logImpl" value="SLF4J"/>
<setting name="defaultStatementTimeout" value="3"/>
</settings>
5. 安全防护措施
5.1 常见漏洞防护
-
XSS防护:
java复制@ControllerAdvice public class XssConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new XssInterceptor()) .addPathPatterns("/**"); } } -
CSRF防护:
jsp复制<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> -
SQL注入防护:
- 始终使用MyBatis参数绑定
- 禁止拼接SQL语句
5.2 敏感数据保护
-
密码加密存储:
java复制public class PasswordUtil { private static final int SALT_LENGTH = 8; public static String encrypt(String password) { byte[] salt = SecureRandom.getSeed(SALT_LENGTH); // PBKDF2WithHmacSHA1算法 PBEKeySpec spec = new PBEKeySpec( password.toCharArray(), salt, 1000, 256); // ... } } -
日志脱敏处理:
java复制@Around("execution(* com..mapper.*.*(..))") public Object around(ProceedingJoinPoint pjp) throws Throwable { Object[] args = pjp.getArgs(); // 参数脱敏处理 if(args != null) { for(int i=0; i<args.length; i++) { if(args[i] instanceof User) { User user = (User)args[i]; user.setPassword("******"); } } } return pjp.proceed(args); }
6. 部署方案设计
6.1 环境准备
服务器配置建议:
- 应用服务器:4核8G × 2台(Tomcat 9)
- 数据库服务器:8核16G(MySQL 8.0主从)
- 缓存服务器:4核8G × 3台(Redis Cluster)
Tomcat优化参数:
xml复制<!-- server.xml -->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="500"
minSpareThreads="30"
acceptCount="300"
compression="on"
URIEncoding="UTF-8"/>
6.2 高可用方案
-
Nginx负载均衡:
nginx复制upstream flower-cluster { server 192.168.1.101:8080 weight=3; server 192.168.1.102:8080 weight=2; keepalive 32; } -
数据库主从同步:
sql复制-- 主库配置 [mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW -- 从库配置 CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;
7. 项目扩展方向
-
多端适配:
- 小程序端:基于uni-app开发微信/支付宝小程序
- APP端:React Native混合开发
- 管理端:Vue.js + Element UI
-
智能推荐:
java复制public List<Flower> recommendFlowers(Long userId) { // 基于协同过滤的推荐算法 List<Long> similarUsers = findSimilarUsers(userId); return flowerMapper.selectRecommended(similarUsers); } -
物流跟踪:
- 对接快递鸟API实现物流轨迹查询
- 电子面单打印功能集成
-
大数据分析:
- 使用Flink实时分析用户行为
- 基于Spark构建销售预测模型
关键实施建议:
- 节日流量预案:提前进行压力测试,准备自动扩容方案
- 商品数据预热:大促前将热销商品加载到Redis
- 监控体系:集成Prometheus+Grafana监控关键指标
- 灰度发布:采用Nginx+lua脚本实现AB测试
