青鲤汉服电商平台:基于SSM框架的垂直领域B2C解决方案
在传统文化复兴的浪潮下,汉服市场呈现出蓬勃发展的态势。然而,传统汉服销售渠道分散、信息不透明、购买流程繁琐等问题制约着行业的数字化转型。青鲤汉服电商平台应运而生,采用成熟的SSM(Spring+SpringMVC+MyBatis)技术栈,为汉服爱好者打造专业的一站式购物体验。
系统架构与技术栈设计
该平台采用经典的三层架构模式,前后端分离设计确保系统的高可维护性和扩展性。后端以Spring框架为核心,负责业务逻辑的统一管理和依赖注入控制;SpringMVC作为Web层框架,通过DispatcherServlet实现请求路由与控制器分离;MyBatis作为数据持久层框架,通过XML映射文件实现Java对象与数据库表的ORM映射。
前端采用JSP动态页面技术,结合JavaScript实现丰富的交互体验。项目使用Maven进行依赖管理,确保第三方库版本的一致性。数据库选用MySQL 5.7+,支持事务处理和并发访问。
// SpringMVC控制器配置示例
@Controller
@RequestMapping("/item")
public class ItemController extends BaseController {
@Autowired
private ItemService itemService;
@RequestMapping("/detail/{id}")
public String getItemDetail(@PathVariable("id") Integer id, Model model) {
Item item = itemService.getItemById(id);
model.addAttribute("item", item);
return "item/detail";
}
@ResponseBody
@RequestMapping("/list")
public String getItemList(@RequestParam Map<String, Object> params) {
PageInfo<Item> page = itemService.getItemList(params);
return responseResult(page);
}
}
数据库设计亮点分析
商品表设计:支持灵活的商品属性管理
商品表(item)的设计体现了对汉服商品特殊属性的充分考虑。除了基本的商品信息字段外,该表设计了多个URL字段存储商品图片,支持多角度展示汉服细节。参数字段(pam1、pam2、pam3)与值字段(val1、val2、val3)的对应设计,为汉服特有的属性(如形制、朝代、材质等)提供了灵活的存储方案。
-- 商品表核心字段设计
CREATE TABLE `item` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`name` varchar(255) DEFAULT NULL COMMENT '名字',
`price` varchar(255) DEFAULT NULL COMMENT '价格',
`scNum` int(11) DEFAULT NULL COMMENT '收藏数',
`gmNum` int(11) DEFAULT NULL COMMENT '购买数',
`url1` varchar(255) DEFAULT NULL COMMENT '图片链接1',
`url2` varchar(255) DEFAULT NULL COMMENT '图片链接2',
-- ... 更多图片字段
`ms` text DEFAULT NULL COMMENT '描述',
`pam1` varchar(255) DEFAULT NULL COMMENT '参数1(如:形制)',
`pam2` varchar(255) DEFAULT NULL COMMENT '参数2(如:朝代)',
`pam3` varchar(255) DEFAULT NULL COMMENT '参数3(如:材质)',
`val1` varchar(255) DEFAULT NULL COMMENT '值1',
`val2` varchar(255) DEFAULT NULL COMMENT '值2',
`val3` varchar(255) DEFAULT NULL COMMENT '值3',
`type` int(11) DEFAULT NULL COMMENT '类型',
`zk` int(10) DEFAULT NULL COMMENT '折扣',
`kz` int(10) DEFAULT NULL COMMENT '库存',
`category_id_one` int(11) DEFAULT NULL COMMENT '一级类别id',
`category_id_two` int(11) DEFAULT NULL COMMENT '二级类别id',
`isDelete` int(2) DEFAULT NULL COMMENT '软删除标志',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';
这种设计允许平台动态定义商品属性,无需修改表结构即可适应不同汉服品类的特殊需求。二级分类体系(category_id_one、category_id_two)支持精细化的商品分类管理,便于用户按朝代、形制等维度进行筛选。
订单详情表:支持复杂的交易场景
订单详情表(order_detail)采用与主订单表分离的设计,有效解决了单订单多商品的业务场景。status字段支持退货状态跟踪,num和total字段分别记录购买数量和总价,为后续的销售统计和库存管理提供数据支持。
-- 订单详情表设计
CREATE TABLE `order_detail` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`item_id` int(255) DEFAULT NULL COMMENT '商品ID',
`order_id` int(11) DEFAULT NULL COMMENT '订单ID',
`status` int(11) DEFAULT NULL COMMENT '0.未退货 1已退货',
`num` int(11) DEFAULT NULL COMMENT '数量',
`total` varchar(255) DEFAULT NULL COMMENT '总价',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单详情表';

核心功能实现深度解析
商品浏览与筛选系统
平台实现了强大的商品浏览和筛选功能,用户可以根据汉服特有的属性进行精准搜索。前端通过AJAX技术实现无刷新筛选,后端采用动态SQL构建查询条件。
// 商品筛选服务实现
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ItemMapper itemMapper;
@Override
public PageInfo<Item> getItemList(Map<String, Object> params) {
PageHelper.startPage(Integer.parseInt(params.get("pageNum").toString()),
Integer.parseInt(params.get("pageSize").toString()));
List<Item> itemList = itemMapper.selectByCondition(params);
return new PageInfo<>(itemList);
}
@Override
public Item getItemById(Integer id) {
return itemMapper.selectByPrimaryKey(id);
}
}
// MyBatis动态SQL映射
<!-- ItemMapper.xml -->
<select id="selectByCondition" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM item
WHERE isDelete = 0
<if test="categoryIdOne != null">
AND category_id_one = #{categoryIdOne}
</if>
<if test="categoryIdTwo != null">
AND category_id_two = #{categoryIdTwo}
</if>
<if test="minPrice != null">
AND price >= #{minPrice}
</if>
<if test="maxPrice != null">
AND price <= #{maxPrice}
</if>
<if test="keyWords != null and keyWords != ''">
AND (name LIKE CONCAT('%', #{keyWords}, '%')
OR ms LIKE CONCAT('%', #{keyWords}, '%'))
</if>
ORDER BY
<choose>
<when test="sortType == 'price_asc'">price ASC</when>
<when test="sortType == 'price_desc'">price DESC</when>
<when test="sortType == 'sales'">gmNum DESC</when>
<when test="sortType == 'collection'">scNum DESC</when>
<otherwise>id DESC</otherwise>
</choose>
</select>

购物车与订单管理系统
购物车功能采用Session与数据库相结合的方式,为登录用户提供持久的购物车存储。订单生成过程包含完整的库存校验和价格计算逻辑。
// 购物车服务核心逻辑
@Service
public class CartServiceImpl implements CartService {
@Autowired
private ItemMapper itemMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderDetailMapper orderDetailMapper;
@Transactional
@Override
public String createOrder(Integer userId, List<CartItem> cartItems) {
// 库存校验
for (CartItem cartItem : cartItems) {
Item item = itemMapper.selectByPrimaryKey(cartItem.getItemId());
if (item.getKz() < cartItem.getNum()) {
throw new RuntimeException("商品库存不足:" + item.getName());
}
}
// 生成订单
Order order = new Order();
order.setUserId(userId);
order.setStatus(0); // 待付款
order.setAddTime(new Date());
orderMapper.insert(order);
BigDecimal totalAmount = BigDecimal.ZERO;
// 生成订单详情
for (CartItem cartItem : cartItems) {
Item item = itemMapper.selectByPrimaryKey(cartItem.getItemId());
OrderDetail detail = new OrderDetail();
detail.setOrderId(order.getId());
detail.setItemId(item.getId());
detail.setNum(cartItem.getNum());
BigDecimal itemTotal = new BigDecimal(item.getPrice())
.multiply(new BigDecimal(cartItem.getNum()));
detail.setTotal(itemTotal.toString());
totalAmount = totalAmount.add(itemTotal);
orderDetailMapper.insert(detail);
// 更新库存
item.setKz(item.getKz() - cartItem.getNum());
itemMapper.updateByPrimaryKey(item);
}
order.setTotal(totalAmount.toString());
orderMapper.updateByPrimaryKey(order);
return order.getId().toString();
}
}

用户权限管理与安全控制
平台采用基于角色的权限控制(RBAC)模型,区分普通用户和管理员权限。Spring Security框架确保系统安全性,密码采用MD5加盐加密存储。
// 用户认证服务
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.selectByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
if ("admin".equals(user.getRole())) {
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
} else {
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
}
return new org.springframework.security.core.userdetails.User(
user.getUsername(),
user.getPassword(),
authorities
);
}
}
// 密码工具类
@Component
public class PasswordUtil {
private static final String SALT = "hanfu_salt_2024";
public static String encrypt(String password) {
return DigestUtils.md5DigestAsHex((password + SALT).getBytes());
}
public static boolean matches(String rawPassword, String encodedPassword) {
return encrypt(rawPassword).equals(encodedPassword);
}
}

后台管理系统功能
管理员后台提供完整的商品管理、订单处理、内容管理等功能。采用响应式设计,支持多终端访问。
// 后台商品管理控制器
@Controller
@RequestMapping("/admin/item")
public class AdminItemController extends BaseController {
@Autowired
private ItemService itemService;
@RequestMapping("/list")
public String itemList(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
Model model) {
Map<String, Object> params = new HashMap<>();
params.put("pageNum", pageNum);
params.put("pageSize", pageSize);
PageInfo<Item> pageInfo = itemService.getItemList(params);
model.addAttribute("pageInfo", pageInfo);
return "admin/item/list";
}
@ResponseBody
@RequestMapping("/delete")
public String deleteItem(Integer id) {
try {
Item item = new Item();
item.setId(id);
item.setIsDelete(1); // 软删除
itemService.updateItem(item);
return responseResult("删除成功");
} catch (Exception e) {
logger.error("删除商品失败", e);
return responseResult("删除失败");
}
}
}

实体模型设计
系统采用经典的领域模型设计,核心实体包括用户(User)、商品(Item)、订单(Order)、订单详情(OrderDetail)、分类(Category)等。实体间的关系通过外键约束确保数据一致性。
// 商品实体类
public class Item {
private Integer id;
private String name;
private String price;
private Integer scNum; // 收藏数
private Integer gmNum; // 购买数
private String url1;
private String url2;
private String url3;
private String url4;
private String url5;
private String ms; // 描述
private String pam1; // 参数1
private String pam2; // 参数2
private String pam3; // 参数3
private String val1; // 值1
private String val2; // 值2
private String val3; // 值3
private Integer type;
private Integer zk; // 折扣
private Integer kz; // 库存
private Integer categoryIdOne;
private Integer categoryIdTwo;
private Integer isDelete;
// getter和setter方法
// 构造方法
}
功能展望与系统优化方向
1. 引入Redis缓存提升系统性能
当前系统在高并发场景下可能存在数据库访问瓶颈。引入Redis作为缓存层,可以显著提升商品列表、用户会话等高频数据的访问速度。
// Redis缓存配置示例
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(om);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
// 缓存增强的商品服务
@Service
public class ItemServiceWithCache {
@Autowired
private ItemMapper itemMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String ITEM_CACHE_KEY = "item:detail:";
private static final long CACHE_EXPIRE = 3600; // 1小时
@Cacheable(value = "item", key = "#id")
public Item getItemById(Integer id) {
String cacheKey = ITEM_CACHE_KEY + id;
Item item = (Item) redisTemplate.opsForValue().get(cacheKey);
if (item == null) {
item = itemMapper.selectByPrimaryKey(id);
if (item != null) {
redisTemplate.opsForValue().set(cacheKey, item, CACHE_EXPIRE, TimeUnit.SECONDS);
}
}
return item;
}
}
2. 微服务架构改造
随着业务规模扩大,单体架构可能面临维护困难的问题。可以考虑将系统拆分为商品服务、订单服务、用户服务等微服务,提高系统的可扩展性和可维护性。
# 微服务配置示例
spring:
application:
name: hanfu-platform
cloud:
nacos:
discovery:
server-addr: localhost:8848
server:
port: 8080
# 商品服务配置
item-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
3. 移动端适配与PWA支持
开发响应式移动端界面,并引入PWA(渐进式Web应用)技术,支持离线访问、消息推送等原生应用特性,提升移动用户体验。
4. 智能推荐系统集成
基于用户行为数据构建推荐算法,实现个性化商品推荐。可以采用协同过滤、内容推荐等算法提升用户购物体验。
// 推荐服务接口设计
@Service
public class RecommendationService {
@Autowired
private UserBehaviorMapper behaviorMapper;
@Autowired
private ItemMapper itemMapper;
public List<Item> getPersonalizedRecommendations(Integer userId) {
// 基于用户历史行为计算推荐商品
List<UserBehavior> behaviors = behaviorMapper.selectByUserId(userId);
Map<Integer, Double> itemScores = new HashMap<>();
// 实现推荐算法逻辑
// ...
return getTopKItems(itemScores, 10);
}
private List<Item> getTopKItems(Map<Integer, Double> scores, int k) {
return scores.entrySet().stream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.limit(k)
.map(entry -> itemMapper.selectByPrimaryKey(entry.getKey()))
.collect(Collectors.toList());
}
}
5. 第三方支付与物流集成
扩展支付渠道,集成微信支付、支付宝等主流支付方式。对接物流API,实现订单物流跟踪功能,提升用户体验。
总结
青鲤汉服电商平台基于成熟的SSM技术栈,构建了一个功能完善、性能稳定的B2C电子商务系统。系统在数据库设计上充分考虑了汉服商品的特殊属性,支持灵活的商品管理;在功能实现上涵盖了完整的电商业务流程,从商品展示到订单处理均有详细的设计。
通过引入缓存、微服务改造、移动端优化等未来规划,平台具备良好的扩展性和演进能力。该架构不仅适用于汉服垂直