在现代电商快速发展的背景下,传统水果零售行业面临着销售渠道单一、库存管理效率低下、客户服务体验不佳等挑战。针对这些痛点,我们设计并实现了一个基于SSM框架的企业级水果电商平台,为中小型水果商家提供完整的线上销售解决方案。
系统架构与技术栈
该平台采用经典的三层架构设计,后端基于Spring+Spring MVC+MyBatis技术栈构建。Spring框架作为核心容器,通过依赖注入(DI)和面向切面编程(AOP)实现业务逻辑的解耦;Spring MVC负责Web请求的调度和处理;MyBatis作为数据持久层框架,通过灵活的XML映射实现对象关系映射。
前端采用JSP技术进行页面渲染,结合HTML、CSS和JavaScript构建用户界面。项目使用Maven进行依赖管理,确保项目结构的规范性和可维护性。
// 基础控制器类
package com.neusoft.base;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
public class BaseController {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
public String responseResult(Object obj) {
String jsonObj = null;
if (obj != null) {
logger.info("后端返回对象:{}", obj);
jsonObj = JSONObject.toJSONString(obj);
logger.info("后端返回数据:" + jsonObj);
}
return jsonObj;
}
public boolean isEmpty(String str) {
return (null == str) || (str.trim().length() <= 0);
}
public Map<String,Object> getMap(){
return new HashMap<String,Object>();
}
}
数据库设计亮点分析
商品表设计优化
商品表(item)的设计充分考虑了电商平台的业务需求,采用多字段存储商品信息和展示数据:
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 '图片URL1',
`url2` varchar(255) DEFAULT NULL COMMENT '图片URL2',
`url3` varchar(255) DEFAULT NULL COMMENT '图片URL3',
`url4` varchar(255) DEFAULT NULL COMMENT '图片URL4',
`url5` varchar(255) DEFAULT NULL COMMENT '图片URL5',
`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',
`val3` varchar(255) DEFAULT NULL COMMENT '值3',
`val2` varchar(255) DEFAULT NULL COMMENT '值2',
`val1` varchar(255) DEFAULT NULL COMMENT '值1',
`type` int(11) DEFAULT NULL COMMENT '类型',
`zk` int(10) DEFAULT NULL COMMENT '折扣',
`category_id_one` int(11) DEFAULT NULL COMMENT '类别id',
`category_id_two` int(11) DEFAULT NULL COMMENT '类别2级',
`isDelete` int(2) DEFAULT NULL COMMENT '0否 1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8 COMMENT='商品表'
设计亮点分析:
- 采用多图片URL字段设计,支持商品详情页的多图展示
- 通过
scNum和gmNum字段实时统计收藏数和购买数,便于热门商品推荐 - 使用
isDelete字段实现逻辑删除,保留历史数据的同时确保数据安全 - 二级分类设计(
category_id_one、category_id_two)支持灵活的商品分类管理
购物车表设计
购物车表(car)的设计注重用户体验和数据完整性:
CREATE TABLE `car` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`item_id` int(11) DEFAULT NULL COMMENT '商品ID',
`user_id` int(11) DEFAULT NULL COMMENT '用户ID',
`num` int(11) DEFAULT NULL COMMENT '数量',
`price` decimal(10,2) DEFAULT NULL COMMENT '价格',
`total` varchar(255) DEFAULT NULL COMMENT '总价',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 COMMENT='购物车表'
设计特点:
- 使用
decimal(10,2)类型存储价格,确保金额计算的精确性 - 独立存储商品价格快照,避免商品调价影响已加入购物车的商品
- 通过
user_id和item_id建立用户与商品的关联关系

核心功能实现
商品管理模块
商品管理模块采用MVC模式实现,控制器负责接收前端请求,服务层处理业务逻辑,数据访问层与数据库交互:
@Controller
@RequestMapping("/item")
public class ItemController extends BaseController {
@Autowired
private ItemService itemService;
@RequestMapping("/list")
@ResponseBody
public String getItemList(@RequestParam Map<String, Object> params) {
try {
Map<String, Object> result = itemService.getItemList(params);
return responseResult(result);
} catch (Exception e) {
logger.error("获取商品列表失败:", e);
return responseResult(Result.error("系统错误"));
}
}
@RequestMapping("/detail/{id}")
public String getItemDetail(@PathVariable("id") Integer id, Model model) {
Item item = itemService.getItemById(id);
model.addAttribute("item", item);
return "item/detail";
}
}
服务层实现业务逻辑处理和数据校验:
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ItemMapper itemMapper;
@Override
public Map<String, Object> getItemList(Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
// 构建查询条件
Example example = new Example(Item.class);
Example.Criteria criteria = example.createCriteria();
if (!isEmpty(params.get("categoryId"))) {
criteria.andEqualTo("categoryIdOne", params.get("categoryId"));
}
if (!isEmpty(params.get("keyword"))) {
criteria.andLike("name", "%" + params.get("keyword") + "%");
}
// 分页查询
PageHelper.startPage(Integer.parseInt(params.get("page").toString()),
Integer.parseInt(params.get("limit").toString()));
List<Item> itemList = itemMapper.selectByExample(example);
PageInfo<Item> pageInfo = new PageInfo<>(itemList);
result.put("data", itemList);
result.put("count", pageInfo.getTotal());
result.put("code", 0);
return result;
}
}

购物车功能实现
购物车功能涉及复杂的业务逻辑,包括商品数量变更、价格计算和库存校验:
@Service
public class CarServiceImpl implements CarService {
@Autowired
private CarMapper carMapper;
@Autowired
private ItemMapper itemMapper;
@Override
@Transactional
public Result addToCart(Car car) {
// 校验商品是否存在
Item item = itemMapper.selectByPrimaryKey(car.getItemId());
if (item == null || item.getIsDelete() == 1) {
return Result.error("商品不存在或已下架");
}
// 检查库存
if (item.getStock() < car.getNum()) {
return Result.error("库存不足");
}
// 检查是否已加入购物车
Example example = new Example(Car.class);
example.createCriteria()
.andEqualTo("userId", car.getUserId())
.andEqualTo("itemId", car.getItemId());
Car existingCar = carMapper.selectOneByExample(example);
if (existingCar != null) {
// 更新数量
existingCar.setNum(existingCar.getNum() + car.getNum());
existingCar.setTotal(calculateTotal(existingCar));
carMapper.updateByPrimaryKey(existingCar);
} else {
// 新增记录
car.setPrice(item.getPrice());
car.setTotal(calculateTotal(car));
carMapper.insert(car);
}
return Result.success("添加成功");
}
private String calculateTotal(Car car) {
BigDecimal price = new BigDecimal(car.getPrice().toString());
BigDecimal num = new BigDecimal(car.getNum());
return price.multiply(num).toString();
}
}
订单管理模块
订单管理模块处理完整的交易流程,包括订单生成、支付状态更新和发货管理:
@Controller
@RequestMapping("/order")
public class OrderController extends BaseController {
@Autowired
private OrderService orderService;
@RequestMapping("/create")
@ResponseBody
public String createOrder(@RequestBody OrderVO orderVO) {
try {
Result result = orderService.createOrder(orderVO);
return responseResult(result);
} catch (Exception e) {
logger.error("创建订单失败:", e);
return responseResult(Result.error("创建订单失败"));
}
}
@RequestMapping("/list")
public String orderList(@RequestParam Map<String, Object> params, Model model) {
Map<String, Object> result = orderService.getOrderList(params);
model.addAttribute("orderList", result.get("data"));
model.addAttribute("total", result.get("count"));
return "order/list";
}
}

实体模型设计
系统采用面向对象的设计思想,核心实体模型之间建立了清晰的关联关系:
// 商品实体类
public class Item {
private Integer id;
private String name;
private BigDecimal 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 Integer type;
private Integer zk;
private Integer categoryIdOne;
private Integer categoryIdTwo;
private Integer isDelete;
// getter和setter方法
}
// 购物车实体类
public class Car {
private Integer id;
private Integer itemId;
private Integer userId;
private Integer num;
private BigDecimal price;
private String total;
// 关联商品信息
private Item item;
// getter和setter方法
}
MyBatis映射文件配置:
<!-- 商品映射配置 -->
<mapper namespace="com.neusoft.mapper.ItemMapper">
<resultMap id="BaseResultMap" type="com.neusoft.entity.Item">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="price" property="price" jdbcType="DECIMAL"/>
<result column="scNum" property="scNum" jdbcType="INTEGER"/>
<result column="gmNum" property="gmNum" jdbcType="INTEGER"/>
<result column="url1" property="url1" jdbcType="VARCHAR"/>
<result column="url2" property="url2" jdbcType="VARCHAR"/>
<result column="url3" property="url3" jdbcType="VARCHAR"/>
<result column="url4" property="url4" jdbcType="VARCHAR"/>
<result column="url5" property="url5" jdbcType="VARCHAR"/>
<result column="ms" property="ms" jdbcType="LONGVARCHAR"/>
<result column="type" property="type" jdbcType="INTEGER"/>
<result column="zk" property="zk" jdbcType="INTEGER"/>
<result column="category_id_one" property="categoryIdOne" jdbcType="INTEGER"/>
<result column="category_id_two" property="categoryIdTwo" jdbcType="INTEGER"/>
<result column="isDelete" property="isDelete" jdbcType="INTEGER"/>
</resultMap>
</mapper>
功能展望与优化
基于当前系统架构,未来可以从以下几个方向进行优化和功能扩展:
1. 引入Redis缓存提升性能
@Service
public class ItemServiceWithCache {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String ITEM_CACHE_KEY = "item:detail:";
private static final long CACHE_EXPIRE = 3600; // 1小时
public Item getItemWithCache(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. 消息队列实现异步处理
引入RabbitMQ或Kafka处理高并发场景下的订单创建、库存扣减等操作,提升系统吞吐量。
3. 微服务架构改造
将单体应用拆分为商品服务、订单服务、用户服务等微服务,提高系统的可扩展性和可维护性。
4. 移动端适配与PWA支持
开发响应式前端界面,支持PWA(渐进式Web应用)特性,提供接近原生应用的移动端体验。
5. 智能推荐系统
基于用户行为数据构建推荐算法,实现个性化商品推荐:
@Service
public class RecommendationService {
public List<Item> getRecommendedItems(Integer userId) {
// 基于协同过滤算法实现商品推荐
// 分析用户历史行为、相似用户偏好等
return recommendedItemList;
}
}

总结
该水果电商平台通过SSM框架的合理运用,实现了稳定可靠的电商业务功能。系统采用分层架构设计,代码结构清晰,便于维护和扩展。数据库设计充分考虑了电商业务的特点,在数据一致性和查询性能之间取得了良好平衡。
平台目前已经具备了完整的商品管理、购物车、订单处理等核心功能,为水果零售商提供了有效的线上销售渠道。未来通过引入缓存、消息队列、微服务等先进技术,可以进一步提升系统的性能和可扩展性,满足更大规模的业务需求。
系统的模块化设计和标准化的编码规范为后续的功能扩展奠定了良好基础,可以根据业务发展需要灵活添加新的功能模块,如会员体系、促销活动、数据分析等,打造更加完善的电商生态系统。