在现代花卉零售行业数字化转型的浪潮中,传统鲜花销售模式面临着信息不透明、选购流程繁琐、订单处理效率低下的挑战。针对这些痛点,我们设计并实现了一个基于SSM框架的企业级鲜花电商平台,该系统通过标准化的商品展示与智能化的订单管理,为商家和消费者构建了一个高效、便捷的交易环境。
系统架构与技术栈选型
该平台采用经典的SSM(Spring+SpringMVC+MyBatis)框架组合,构建了分层清晰、可维护性强的系统架构。Spring框架负责业务对象管理和事务控制,通过依赖注入和面向切面编程实现了松耦合的组件管理。SpringMVC作为Web层框架,采用前端控制器模式处理用户请求与页面跳转,实现了请求响应的标准化处理。MyBatis作为数据持久层框架,通过XML映射文件灵活配置SQL语句,支持动态查询与结果集封装。
技术栈配置如下:
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
<!-- MyBatis集成 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
系统严格遵循MVC设计模式,代码结构分为实体层、DAO层、服务层和控制器层。实体层对应数据库表结构,DAO层负责数据访问逻辑,服务层封装业务规则,控制器层处理HTTP请求和响应。这种分层架构便于团队协作开发与功能扩展维护。
数据库设计亮点分析
商品表(goods)的设计优化
商品表作为系统的核心数据表,其设计体现了多个优化考量:
CREATE TABLE `goods` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`cover` varchar(255) DEFAULT NULL COMMENT '封面',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`intro` varchar(255) DEFAULT NULL COMMENT '介绍',
`spec` varchar(255) DEFAULT NULL COMMENT '规格',
`price` int(11) NOT NULL DEFAULT 0 COMMENT '价格',
`stock` int(11) NOT NULL DEFAULT 0 COMMENT '库存',
`sales` int(11) NOT NULL DEFAULT 0 COMMENT '销量',
`content` text DEFAULT NULL COMMENT '详情',
`type_id` int(11) NOT NULL DEFAULT 0 COMMENT '分类ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8 COMMENT='商品'
设计亮点分析:
- 价格字段优化:使用
int(11)类型存储价格,以分为单位,避免浮点数计算精度问题 - 索引策略:主键采用自增ID,同时建议为
type_id和sales字段添加复合索引,提升分类查询和热销商品排序性能 - 存储引擎选择:使用InnoDB引擎支持事务处理,确保库存扣减等操作的原子性
- 字段长度规划:
name和intro字段采用varchar(255)长度,平衡存储效率与业务需求
订单表(orders)的事务完整性设计
订单表的设计重点考虑了电商业务的事务完整性要求:
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`total` int(11) NOT NULL DEFAULT 0 COMMENT '订单金额',
`amount` int(11) NOT NULL DEFAULT 0 COMMENT '商品总数',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '订单状态(1未付款/2已付款/3已发货/4已完成)',
`paytype` tinyint(4) NOT NULL DEFAULT 0 COMMENT '支付方式 (1微信/2支付宝/3积分)',
`name` varchar(255) DEFAULT NULL COMMENT '收货人',
`phone` varchar(255) DEFAULT NULL COMMENT '收货电话',
`address` varchar(255) DEFAULT NULL COMMENT '收货地址',
`systime` datetime DEFAULT NULL COMMENT '下单时间',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '下单用户ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8 COMMENT='订单'
事务完整性保障:
- 状态字段使用tinyint类型,通过枚举值确保状态流转的规范性
- 金额字段统一使用整数类型,避免金额计算误差
- 时间戳字段记录完整的订单生命周期
- 用户ID外键关联确保数据一致性

推荐商品表(tops)的灵活扩展设计
推荐系统采用可扩展的表结构设计:
CREATE TABLE `tops` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '推荐类型(1今日推荐)',
`good_id` int(11) NOT NULL DEFAULT 0 COMMENT '商品ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='推荐商品'
该设计支持多种推荐类型扩展,通过type字段区分不同的推荐策略,为后续个性化推荐功能预留了扩展空间。
核心功能实现详解
1. 管理员权限控制与登录机制
系统采用Session-based的身份认证机制,管理员控制器实现了完整的登录验证流程:
@Controller
@RequestMapping("/admin")
public class AdminController {
@Autowired
private AdminService adminService;
/**
* 管理员登录处理
*/
@PostMapping("/login")
public String login(String username, String password,
HttpServletRequest request, HttpSession session) {
Admins admin = adminService.getByUsernameAndPassword(username, password);
if (Objects.nonNull(admin)) {
session.setAttribute("admin", admin);
return "redirect:index";
}
request.setAttribute("msg", "用户名或密码错误!");
return "/admin/login.jsp";
}
/**
* 安全退出机制
*/
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute("admin");
return "/admin/login.jsp";
}
}

2. 商品分类管理的层级设计
分类管理采用扁平化结构,支持动态排序功能:
@Service
public class TypeServiceImpl implements TypeService {
@Autowired
private TypeMapper typeMapper;
@Override
public List<Types> getList() {
// 按照排序号升序排列,支持自定义分类显示顺序
return typeMapper.selectByExample(new TypesExample() {{
setOrderByClause("num ASC");
}});
}
@Override
@Transactional
public void add(Types type) throws Exception {
// 验证分类名称唯一性
if (typeMapper.countByName(type.getName()) > 0) {
throw new Exception("分类名称已存在");
}
typeMapper.insertSelective(type);
}
}
对应的分类表结构支持灵活的排序机制:
CREATE TABLE `types` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(50) DEFAULT NULL COMMENT '名称',
`num` int(11) DEFAULT 0 COMMENT '排序号 (从小到大)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='分类'

3. 购物车功能的并发控制
购物车模块实现了商品数量的实时更新和并发安全控制:
@Service
public class CartServiceImpl implements CartService {
@Autowired
private CartMapper cartMapper;
@Autowired
private GoodMapper goodMapper;
@Override
@Transactional
public void addOrUpdate(Carts cart) {
// 检查商品库存
Goods goods = goodMapper.selectByPrimaryKey(cart.getGoodId());
if (goods.getStock() < cart.getAmount()) {
throw new RuntimeException("商品库存不足");
}
// 查询用户是否已有该商品的购物车记录
CartsExample example = new CartsExample();
example.createCriteria()
.andUserIdEqualTo(cart.getUserId())
.andGoodIdEqualTo(cart.getGoodId());
List<Carts> existingCarts = cartMapper.selectByExample(example);
if (existingCarts.isEmpty()) {
// 新增购物车记录
cartMapper.insertSelective(cart);
} else {
// 更新已有记录数量
Carts existingCart = existingCarts.get(0);
existingCart.setAmount(existingCart.getAmount() + cart.getAmount());
cartMapper.updateByPrimaryKey(existingCart);
}
}
}

4. 订单状态机与业务流程
订单系统实现了完整的状态流转机制:
@Service
public class OrderServiceImpl implements OrderService {
private static final Map<Integer, String> STATUS_MAP = new HashMap<>();
static {
STATUS_MAP.put(1, "未付款");
STATUS_MAP.put(2, "已付款");
STATUS_MAP.put(3, "已发货");
STATUS_MAP.put(4, "已完成");
}
@Override
@Transactional
public void createOrder(Orders order, List<Carts> cartItems) {
// 1. 验证库存
for (Carts cart : cartItems) {
Goods goods = goodMapper.selectByPrimaryKey(cart.getGoodId());
if (goods.getStock() < cart.getAmount()) {
throw new RuntimeException("商品[" + goods.getName() + "]库存不足");
}
}
// 2. 创建订单
order.setSystime(new Date());
order.setStatus(1); // 未付款状态
orderMapper.insertSelective(order);
// 3. 扣减库存并生成订单项
for (Carts cart : cartItems) {
// 扣减库存
goodMapper.decreaseStock(cart.getGoodId(), cart.getAmount());
// 生成订单项记录
OrderItems item = new OrderItems();
item.setOrderId(order.getId());
item.setGoodId(cart.getGoodId());
item.setAmount(cart.getAmount());
orderItemMapper.insertSelective(item);
}
// 4. 清空购物车
cartMapper.deleteByUserId(order.getUserId());
}
}

5. 商品详情页的动态渲染
商品详情页面通过JSP动态渲染技术展示完整的商品信息:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div class="product-detail">
<div class="product-image">
<img src="${pageContext.request.contextPath}${good.cover}"
alt="${good.name}" class="img-responsive">
</div>
<div class="product-info">
<h2>${good.name}</h2>
<p class="intro">${good.intro}</p>
<div class="specification">
<span>规格:${good.spec}</span>
</div>
<div class="price-section">
<span class="price">¥${good.price / 100}</span>
<span class="stock">库存:${good.stock}件</span>
</div>
<div class="action-buttons">
<input type="number" id="quantity" value="1" min="1" max="${good.stock}">
<button onclick="addToCart(${good.id})" class="btn-cart">加入购物车</button>
</div>
</div>
</div>
<script>
function addToCart(goodId) {
const quantity = parseInt($('#quantity').val());
$.post('${pageContext.request.contextPath}/cart/add', {
goodId: goodId,
amount: quantity
}, function(response) {
if (response.success) {
alert('添加购物车成功');
} else {
alert('添加失败:' + response.message);
}
});
}
</script>

实体模型设计规范
系统实体类严格遵循JavaBean规范,支持Spring的依赖注入和MyBatis的自动映射:
package com.entity;
public class Admins {
private int id;
private String username;
private String password;
private String passwordNew;
// Getter和Setter方法符合JavaBean规范
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
// 业务逻辑相关方法
public boolean validatePassword(String inputPassword) {
return this.password.equals(hashPassword(inputPassword));
}
}
功能展望与系统优化方向
1. 引入Redis缓存提升性能
实现方案:为商品信息、分类数据等高频读取数据建立多级缓存策略
@Service
public class CachedGoodService {
@Autowired
private RedisTemplate<String, Goods> redisTemplate;
private static final String GOODS_CACHE_KEY = "goods:";
private static final long CACHE_EXPIRE = 3600; // 1小时
public Goods getGoodsWithCache(int id) {
String cacheKey = GOODS_CACHE_KEY + id;
Goods goods = redisTemplate.opsForValue().get(cacheKey);
if (goods == null) {
goods = goodMapper.selectByPrimaryKey(id);
if (goods != null) {
redisTemplate.opsForValue().set(cacheKey, goods,
CACHE_EXPIRE, TimeUnit.SECONDS);
}
}
return goods;
}
}
2. 消息队列实现异步订单处理
技术选型:采用RabbitMQ或RocketMQ处理高并发订单
@Component
public class OrderMessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrderCreateMessage(Orders order) {
rabbitTemplate.convertAndSend("order.exchange",
"order.create", order.getId());
}
}
@Component
public class OrderMessageConsumer {
@RabbitListener(queues = "order.queue")
public void processOrderCreate(Integer orderId) {
// 异步处理库存扣减、日志记录等耗时操作
inventoryService.decreaseStockAsync(orderId);
logService.recordOrderLog(orderId);
}
}
3. 微服务架构改造
架构规划:将单体应用拆分为商品服务、订单服务、用户服务等独立微服务
# Spring Cloud配置示例
spring:
application:
name: flower-mall-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/api/product/**
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
4. 移动端适配与PWA支持
技术实现:采用响应式设计 + Service Worker技术
// 注册Service Worker实现离线缓存
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('SW registered: ', registration);
});
}
5. 智能推荐算法集成
算法方案:基于用户行为数据的协同过滤推荐
# Python推荐算法示例(可通过微服务接口集成)
def recommend_flowers(user_id, top_n=10):
# 基于用户历史购买记录和相似用户行为
user_vector = build_user_vector(user_id)
similar_users = find_similar_users(user_vector)
return generate_recommendations(similar_users, top_n)
该鲜花电商平台通过严谨的架构设计和精细的功能实现,为传统花卉零售企业提供了完整的数字化转型解决方案。系统在保证稳定性的同时,具有良好的扩展性和可维护性,为后续的技术演进和业务拓展奠定了坚实基础。