基于SSM框架的鲜花在线销售平台 - 源码深度解析
随着互联网技术的快速发展,传统鲜花零售行业面临着信息不透明、交易效率低下、库存管理困难等痛点。鲜花在线销售平台应运而生,采用成熟的SSM(Spring+SpringMVC+MyBatis)框架构建,为中小型花店和花卉批发商提供完整的电商解决方案。该系统通过标准化的业务流程,实现了鲜花选购、在线支付、订单跟踪、库存同步等核心功能的数字化管理。
系统架构与技术栈
该平台采用典型的三层架构设计,前端使用HTML、CSS和JavaScript构建用户界面,后端基于SSM框架实现业务逻辑。
技术栈详解
前端技术:
- HTML5 + CSS3:构建响应式用户界面
- JavaScript/jQuery:实现动态交互效果
- Bootstrap框架:保证跨设备兼容性
后端技术栈:
- Spring框架:负责依赖注入和事务管理,确保业务组件的松耦合和数据一致性
- SpringMVC:作为Web层框架,处理用户请求的路由和视图渲染,实现前后端分离的开发模式
- MyBatis:作为持久层框架,通过灵活的XML配置实现数据库操作的映射,支持动态SQL生成
// Spring配置示例
@Configuration
@EnableTransactionManagement
@ComponentScan("com.spring.service")
public class SpringConfig {
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/flower_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 连接池配置优化
dataSource.setInitialSize(5);
dataSource.setMinIdle(5);
dataSource.setMaxActive(20);
dataSource.setMaxWait(60000);
return dataSource;
}
}
数据库设计亮点
购物车表设计优化
gouwuche表的设计体现了电商平台的核心业务需求,采用适当的字段类型和索引策略确保高性能的购物车操作:
CREATE TABLE `gouwuche` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`flowerxinxiid` int(10) unsigned NOT NULL COMMENT '鲜花信息id',
`flowerbianhao` varchar(50) NOT NULL COMMENT '鲜花编号',
`flowermingcheng` varchar(255) NOT NULL COMMENT '鲜花名称',
`fenlei` int(10) unsigned NOT NULL COMMENT '分类',
`xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
`goumaishuliang` int(11) NOT NULL COMMENT '购买数量',
`xiaoji` decimal(18,2) NOT NULL COMMENT '小计',
`goumairen` varchar(50) NOT NULL COMMENT '购买人',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `gouwuche_flowerxinxiid_index` (`flowerxinxiid`),
KEY `gouwuche_fenlei_index` (`fenlei`),
KEY `gouwuche_goumairen_index` (`goumairen`) -- 新增用户索引优化查询
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='购物车'
设计亮点分析:
- 精确数值处理:使用
decimal(18,2)类型存储金额,确保财务计算的精确性 - 索引优化策略:为关键查询字段建立复合索引,优化关联查询性能
- 预计算优化:
xiaoji字段预计算小计金额,减少实时计算开销 - 存储引擎选择:采用InnoDB存储引擎,支持事务处理和行级锁定
- 字符集配置:统一使用utf8字符集,支持多语言环境
订单信息表的关系设计
dingdanxinxi表与dingdanqianshou_dingdanxinxi表构成了完整的订单管理体系:
CREATE TABLE `dingdanxinxi` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dingdanbianhao` varchar(50) NOT NULL UNIQUE COMMENT '订单编号',
`dingdanxinxi` text NOT NULL COMMENT '订单信息',
`zongjijine` decimal(18,2) NOT NULL COMMENT '总计金额',
`shouhuoren` varchar(50) NOT NULL COMMENT '收货人',
`dianhua` varchar(50) NOT NULL COMMENT '电话',
`dizhi` varchar(255) NOT NULL COMMENT '地址',
`beizhu` text NOT NULL COMMENT '备注',
`zhuangtai` enum('待支付','已支付','配送中','已完成','已取消') NOT NULL COMMENT '状态',
`xiadanren` varchar(50) NOT NULL COMMENT '下单人',
`iszf` varchar(10) NOT NULL DEFAULT '否' COMMENT '是否支付',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `dingdanxinxi_xiadanren_index` (`xiadanren`),
KEY `dingdanxinxi_zhuangtai_index` (`zhuangtai`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单信息'

核心功能实现
用户购物车管理
购物车功能采用Session与数据库结合的方式实现,确保用户数据的持久化和一致性:
@Controller
@RequestMapping("/cart")
public class CartController extends BaseController {
@Autowired
private GouwucheService gouwucheService;
@RequestMapping("/add")
@ResponseBody
public Map<String, Object> addToCart(HttpServletRequest request) {
Map<String, Object> result = new HashMap<>();
try {
String flowerxinxiid = Request.get("flowerxinxiid");
String goumaishuliang = Request.get("goumaishuliang");
String goumairen = session.getAttribute("username").toString();
// 参数验证
if(StringUtils.isEmpty(flowerxinxiid) || StringUtils.isEmpty(goumaishuliang)) {
result.put("success", false);
result.put("message", "参数不完整");
return result;
}
// 检查商品是否已存在购物车
Example example = new Example(Gouwuche.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("flowerxinxiid", flowerxinxiid);
criteria.andEqualTo("goumairen", goumairen);
List<Gouwuche> list = gouwucheService.selectExample(example);
if(list.size() > 0) {
// 更新数量
Gouwuche cart = list.get(0);
int newQuantity = cart.getGoumaishuliang() + Integer.parseInt(goumaishuliang);
cart.setGoumaishuliang(newQuantity);
cart.setXiaoji(cart.getXiaoshoujiage().multiply(new BigDecimal(newQuantity)));
gouwucheService.update(cart);
} else {
// 新增购物车项
Gouwuche cart = new Gouwuche();
// 设置商品基本信息
cart.setFlowerxinxiid(Integer.parseInt(flowerxinxiid));
cart.setGoumaishuliang(Integer.parseInt(goumaishuliang));
cart.setGoumairen(goumairen);
// 查询商品详情并设置其他字段
FlowerXinxi flower = flowerService.selectById(flowerxinxiid);
if(flower != null) {
cart.setFlowerbianhao(flower.getBianhao());
cart.setFlowermingcheng(flower.getMingcheng());
cart.setFenlei(flower.getFenlei());
cart.setXiaoshoujiage(flower.getXiaoshoujiage());
cart.setXiaoji(flower.getXiaoshoujiage().multiply(new BigDecimal(goumaishuliang)));
}
gouwucheService.insert(cart);
}
result.put("success", true);
result.put("message", "添加成功");
} catch (Exception e) {
result.put("success", false);
result.put("message", "系统错误:" + e.getMessage());
}
return result;
}
}

订单处理流程
订单处理采用状态机模式,确保订单状态流转的准确性:
@Service
@Transactional
public class OrderService {
@Autowired
private DingdanxinxiMapper dingdanxinxiMapper;
@Autowired
private GouwucheService gouwucheService;
@Autowired
private InventoryService inventoryService;
public OrderResult createOrder(Dingdanxinxi order, List<Gouwuche> cartItems) {
OrderResult result = new OrderResult();
try {
// 生成唯一订单编号
String orderNo = generateOrderNumber();
order.setDingdanbianhao(orderNo);
// 计算总金额并验证库存
BigDecimal totalAmount = BigDecimal.ZERO;
for(Gouwuche item : cartItems) {
// 检查库存是否充足
if(!inventoryService.checkInventory(item.getFlowerxinxiid(), item.getGoumaishuliang())) {
throw new InventoryException("商品库存不足");
}
totalAmount = totalAmount.add(item.getXiaoji());
}
order.setZongjijine(totalAmount);
// 设置订单初始状态
order.setZhuangtai("待支付");
order.setIszf("否");
// 保存订单信息
dingdanxinxiMapper.insert(order);
// 扣减库存
for(Gouwuche item : cartItems) {
inventoryService.reduceInventory(item.getFlowerxinxiid(), item.getGoumaishuliang());
}
// 清空购物车
gouwucheService.clearCart(order.getXiadanren());
result.setSuccess(true);
result.setOrderNo(orderNo);
result.setMessage("订单创建成功");
} catch (Exception e) {
result.setSuccess(false);
result.setMessage("订单创建失败:" + e.getMessage());
// 事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
private String generateOrderNumber() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timestamp = sdf.format(new Date());
Random random = new Random();
return "DD" + timestamp + String.format("%04d", random.nextInt(10000));
}
}
性能优化策略
数据库层面优化:
- 使用连接池技术管理数据库连接
- 合理设置索引,避免全表扫描
- 采用读写分离架构提升并发处理能力
业务层面优化:
- 实现页面静态化,减少动态内容生成
- 使用Redis缓存热点数据
- 采用消息队列处理异步任务
该系统通过SSM框架的合理运用,为鲜花电商行业提供了稳定、高效的解决方案,具有良好的扩展性和维护性。