基于SSH框架的文创产品定制销售平台 - 源码深度解析
文创产业的数字化转型已成为当前文化创意企业发展的核心战略。传统线下销售模式在应对个性化、定制化需求方面存在明显短板。为突破这一瓶颈,我们设计并实现了一套企业级文创定制电商平台,通过标准化流程将创意设计、用户定制需求与后端生产供应链高效衔接,显著提升了业务响应速度与客户参与度。
系统架构与技术栈选型
整体架构设计
平台采用经典的三层架构模式,基于成熟的SSH(Struts2 + Spring + Hibernate)框架组合构建:
- 表现层:使用Struts2框架处理用户请求与页面跳转,通过Action类封装业务逻辑,实现MVC模式的清晰分离
- 业务逻辑层:由Spring框架统一管理,利用IoC容器实现服务组件的依赖注入,通过声明式事务控制确保业务操作的原子性
- 数据持久层:依托Hibernate实现对象关系映射(ORM),通过HQL语句完成复杂查询,大幅减少原生SQL编写工作量
前端与数据层技术
前端技术栈采用JSP页面结合JSTL标签库展示动态数据,表单验证与异步交互通过jQuery实现,确保用户界面的友好性和响应速度。数据库选用MySQL 5.7,充分利用其事务处理和并发访问控制能力,保证系统在高并发场景下的稳定性。
<!-- Spring核心配置文件示例 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/culture_db?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 连接池配置优化 -->
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>com/culture/entity/Goods.hbm.xml</value>
<value>com/culture/entity/Order.hbm.xml</value>
</list>
</property>
<!-- Hibernate属性配置 -->
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.format_sql=true
</value>
</property>
</bean>
数据库设计亮点分析
订单模块的精细化设计
订单管理作为电商系统的核心模块,平台通过t_order和t_orderitem表的分离设计实现了数据的规范化存储和高效查询:
- 双主键策略:
t_order表采用order_id作为物理主键提升查询性能,同时使用order_bianhao作为业务主键确保订单编号的唯一性和可读性 - 状态管理:通过
order_zhuangtai字段实现订单生命周期的完整跟踪,支持待支付、已支付、发货中、已完成等状态流转 - 扩展性考虑:地址和付款方式字段采用varchar类型,为后续支持多种配送和支付方式预留空间
-- 订单表核心字段设计
CREATE TABLE `t_order` (
`order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID(物理主键)',
`order_bianhao` varchar(50) NOT NULL COMMENT '订单编号(业务主键)',
`order_date` datetime NOT NULL COMMENT '订单日期',
`order_zhuangtai` varchar(20) DEFAULT '待支付' COMMENT '订单状态',
`order_songhuodizhi` varchar(200) DEFAULT NULL COMMENT '送货地址',
`order_fukuangfangshi` varchar(20) DEFAULT NULL COMMENT '付款方式',
`order_jine` decimal(10,2) DEFAULT '0.00' COMMENT '订单金额',
`order_user_id` int(11) NOT NULL COMMENT '订单用户ID',
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`order_id`),
UNIQUE KEY `idx_order_bianhao` (`order_bianhao`),
KEY `idx_user_id` (`order_user_id`),
KEY `idx_order_date` (`order_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单主表';
-- 订单项表设计
CREATE TABLE `t_orderitem` (
`item_id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '关联订单ID',
`goods_id` int(11) NOT NULL COMMENT '商品ID',
`goods_quantity` int(11) DEFAULT '1' COMMENT '商品数量',
`unit_price` decimal(10,2) DEFAULT NULL COMMENT '商品单价',
`shifouqueren` varchar(10) DEFAULT '否' COMMENT '是否确认',
`shifoufukuan` varchar(10) DEFAULT '否' COMMENT '是否付款',
`custom_data` text COMMENT '定制化数据JSON',
PRIMARY KEY (`item_id`),
KEY `fk_order` (`order_id`),
KEY `fk_goods` (`goods_id`),
CONSTRAINT `fk_orderitem_order` FOREIGN KEY (`order_id`) REFERENCES `t_order` (`order_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单项表';
商品模块的可扩展架构
商品表t_goods设计充分考虑了文创产品的多样性需求:
-- 商品表特色字段设计
CREATE TABLE `t_goods` (
`goods_id` int(11) NOT NULL AUTO_INCREMENT,
`goods_name` varchar(100) NOT NULL COMMENT '商品名称',
`goods_miaoshu` text COMMENT '商品描述',
`goods_yanse` varchar(50) DEFAULT NULL COMMENT '商品颜色',
`goods_shichangjia` decimal(10,2) DEFAULT '0.00' COMMENT '市场价',
`goods_tejia` decimal(10,2) DEFAULT NULL COMMENT '特价',
`goods_isnottejia` varchar(10) DEFAULT '否' COMMENT '是否特价',
`goods_isnottuijian` varchar(10) DEFAULT '否' COMMENT '是否推荐',
`goods_kucun` int(11) DEFAULT '0' COMMENT '库存',
`goods_catelog_id` int(11) DEFAULT NULL COMMENT '分类ID',
`goods_pinpai_id` int(11) DEFAULT NULL COMMENT '品牌ID',
`goods_image` varchar(200) DEFAULT NULL COMMENT '商品主图',
`customizable` varchar(10) DEFAULT '否' COMMENT '是否支持定制',
`shenhe` varchar(10) DEFAULT '待审核' COMMENT '审核状态',
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`goods_id`),
KEY `idx_catelog` (`goods_catelog_id`),
KEY `idx_pinpai` (`goods_pinpai_id`),
KEY `idx_tejia` (`goods_isnottejia`),
KEY `idx_tuijian` (`goods_isnottuijian`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
设计亮点:
- 状态字段采用字符串类型而非布尔值,支持"是/否/部分"等复杂状态
- 通过
customizable字段标识商品是否支持定制化 - 价格字段使用decimal类型确保计算精度
- 完善的索引设计提升查询效率
用户-商品关联的灵活配置
t_user_goods表的设计体现了平台对个性化需求的重视:
CREATE TABLE `t_user_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '用户ID',
`goods_id` int(11) NOT NULL COMMENT '商品ID',
`relation_type` varchar(20) NOT NULL COMMENT '关联类型:收藏/浏览/定制偏好',
`custom_data` text COMMENT '个性化配置数据',
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_goods_type` (`user_id`,`goods_id`,`relation_type`),
KEY `idx_user_id` (`user_id`),
KEY `idx_goods_id` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户商品关联表';

核心功能实现详解
商品定制化流程
平台的核心竞争力在于强大的商品定制能力,实现了完整的定制化业务流程:
/**
* 商品定制Action类 - 处理用户定制请求
*/
public class GoodsCustomizeAction extends ActionSupport {
private Integer goodsId;
private String customText;
private String customImage;
private Map<String, Object> customAttributes; // 扩展定制属性
private GoodsService goodsService;
private ImageProcessor imageProcessor;
/**
* 执行商品定制流程
*/
public String execute() {
try {
// 参数验证
if (goodsId == null) {
addActionError("商品ID不能为空");
return ERROR;
}
// 获取基础商品信息
Goods baseGoods = goodsService.getGoodsById(goodsId);
if (baseGoods == null || !"是".equals(baseGoods.getCustomizable())) {
addActionError("该商品不支持定制");
return ERROR;
}
// 构建定制商品对象
CustomGoods customGoods = createCustomGoods(baseGoods);
// 生成预览图
String previewImage = generatePreview(customGoods);
customGoods.setPreviewImage(previewImage);
// 保存定制会话
saveCustomSession(customGoods);
return SUCCESS;
} catch (Exception e) {
addActionError("定制过程出现错误:" + e.getMessage());
logger.error("商品定制异常", e);
return ERROR;
}
}
/**
* 创建定制商品对象
*/
private CustomGoods createCustomGoods(Goods baseGoods) {
CustomGoods customGoods = new CustomGoods();
customGoods.setBaseGoods(baseGoods);
customGoods.setCustomText(StringUtils.trimToEmpty(customText));
customGoods.setCustomAttributes(customAttributes);
// 处理定制图片
if (StringUtils.isNotEmpty(customImage)) {
String processedImage = imageProcessor.processImage(customImage);
customGoods.setCustomImage(processedImage);
}
// 计算定制价格
calculateCustomPrice(customGoods);
return customGoods;
}
/**
* 生成定制预览图
*/
private String generatePreview(CustomGoods customGoods) {
PreviewGenerator generator = new PreviewGenerator();
return generator.generate(
customGoods.getBaseGoods().getGoodsImage(),
customGoods.getCustomImage(),
customGoods.getCustomText()
);
}
/**
* 保存定制会话
*/
private void saveCustomSession(CustomGoods customGoods) {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
// 使用ConcurrentHashMap确保线程安全
@SuppressWarnings("unchecked")
Map<Integer, CustomGoods> customSessions = (Map<Integer, CustomGoods>)
session.getAttribute("customSessions");
if (customSessions == null) {
customSessions = new ConcurrentHashMap<>();
session.setAttribute("customSessions", customSessions);
}
customSessions.put(goodsId, customGoods);
}
// Getter和Setter方法
public void setGoodsService(GoodsService goodsService) {
this.goodsService = goodsService;
}
public void setImageProcessor(ImageProcessor imageProcessor) {
this.imageProcessor = imageProcessor;
}
// 其他属性getter/setter...
}

订单管理系统
订单处理模块采用状态机模式管理订单生命周期,确保业务流程的严谨性:
/**
* 订单服务实现类 - 采用声明式事务管理
*/
@Service("orderService")
@Transactional
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDAO orderDAO;
@Autowired
private GoodsService goodsService;
@Autowired
private InventoryService inventoryService;
/**
* 创建订单
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Order createOrder(OrderDTO orderDTO) throws BusinessException {
// 参数验证
validateOrderDTO(orderDTO);
// 库存检查
checkInventory(orderDTO.getItems());
// 生成订单编号
String orderNumber = generateOrderNumber();
// 创建订单主表记录
Order order = buildOrder(orderDTO, orderNumber);
orderDAO.save(order);
// 创建订单项
createOrderItems(order, orderDTO.getItems());
// 扣减库存
updateInventory(orderDTO.getItems());
return order;
}
/**
* 订单状态流转
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateOrderStatus(Integer orderId, String newStatus) throws BusinessException {
Order order = orderDAO.findById(orderId);
if (order == null) {
throw new BusinessException("订单不存在");
}
// 状态机验证
if (!isValidStatusTransition(order.getOrderZhuangtai(), newStatus)) {
throw new BusinessException("无效的状态流转");
}
order.setOrderZhuangtai(newStatus);
order.setUpdateTime(new Date());
orderDAO.update(order);
// 记录状态变更日志
logStatusChange(orderId, order.getOrderZhuangtai(), newStatus);
}
/**
* 验证状态流转是否合法
*/
private boolean isValidStatusTransition(String currentStatus, String newStatus) {
Map<String, List<String>> validTransitions = new HashMap<>();
validTransitions.put("待支付", Arrays.asList("已支付", "已取消"));
validTransitions.put("已支付", Arrays.asList("已确认", "退款中"));
validTransitions.put("已确认", Arrays.asList("发货中", "已完成"));
validTransitions.put("发货中", Arrays.asList("已完成"));
List<String> allowed = validTransitions.get(currentStatus);
return allowed != null && allowed.contains(newStatus);
}
// 其他业务方法...
}
技术优化与性能考量
数据库优化策略
- 索引优化:针对常用查询字段建立复合索引
- 分表分库:订单表按时间分表,用户表按业务分库
- 读写分离:采用主从复制实现读写分离
缓存机制应用
// Spring缓存配置示例
@Cacheable(value = "goodsCache", key = "#goodsId")
public Goods getGoodsById(Integer goodsId) {
return goodsDAO.findById(goodsId);
}
@CacheEvict(value = "goodsCache", key = "#goods.goodsId")
public void updateGoods(Goods goods) {
goodsDAO.update(goods);
}
本平台通过SSH框架的合理运用和精细的数据库设计,成功构建了一个高性能、可扩展的文创产品定制销售系统,为文创产业的数字化转型提供了有力的技术支撑。