在现代互联网消费领域,宠物经济正展现出强劲的增长势头。针对宠物主人在购买用品时面临的信息不对称和专业指导匮乏等痛点,开发了一款集宠物商品在线交易与科学养宠知识普及于一体的综合性服务平台。该平台采用成熟的SSM(Spring+SpringMVC+MyBatis)技术框架,通过严谨的三层架构设计,实现了电商功能与内容社区的有机融合。
系统架构与技术栈深度解析
该宠物生活服务平台采用经典的分层架构模式,各层职责明确,耦合度低。表现层使用SpringMVC框架处理用户请求,通过@Controller注解定义处理器,利用@RequestMapping映射URL请求,实现前后端数据的高效交互。
@Controller
public class AdminsController extends BaseController {
@Autowired
private AdminsMapper dao;
@Autowired
private AdminsService service;
@RequestMapping("/admins_list")
public String list() {
if(!checkLogin()){
return showError("尚未登录", "./login.do");
}
String order = Request.get("order", "id");
String sort = Request.get("sort", "desc");
Example example = new Example(Admins.class);
Example.Criteria criteria = example.createCriteria();
String where = " 1=1 ";
where += getWhere();
criteria.andCondition(where);
if(sort.equals("desc")){
example.orderBy(order).desc();
}else{
example.orderBy(order).asc();
}
int page = request.getParameter("page") == null ? 1 :
Integer.valueOf(request.getParameter("page"));
page = Math.max(1, page);
List<Admins> list = service.selectPageExample(example, page, 12);
assign("list", list);
assign("orderby", order);
assign("sort", sort);
assign("where", where);
return "admins_list";
}
}
业务逻辑层基于Spring框架的IoC容器进行Bean管理,通过@Service注解标识业务组件,利用@Transactional注解实现声明式事务管理,确保订单处理、库存更新等核心业务的数据一致性。
数据持久层采用MyBatis框架,通过XML映射文件配置SQL语句,实现对象关系映射。@Mapper注解的接口与XML文件协同工作,提供灵活的数据访问能力。
数据库设计亮点与优化策略
数据库设计是系统稳定性的基石,该平台采用MySQL数据库,通过18张数据表的合理规划,支撑复杂的业务逻辑。
订单信息表的核心设计
CREATE TABLE `dingdanxinxi` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dingdanbianhao` varchar(50) NOT NULL 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` varchar(255) 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`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单信息'
该表设计具有以下技术亮点:
- 金额字段精度控制:使用decimal(18,2)类型存储金额,确保财务计算的精确性
- 状态字段扩展性:varchar(255)类型的状态字段支持多种订单状态流转
- 时间戳自动化:addtime字段默认值为当前时间戳,自动化记录创建时间
- 支付状态标识:iszf字段提供清晰的支付状态标识,便于对账和统计
购物车表的关系设计
CREATE TABLE `gouwuche` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`petxinxiid` int(10) unsigned NOT NULL COMMENT '宠物信息id',
`petbianhao` varchar(50) NOT NULL COMMENT '宠物编号',
`petmingcheng` 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_petxinxiid_index` (`petxinxiid`),
KEY `gouwuche_fenlei_index` (`fenlei`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='购物车'
购物车表的索引优化策略:
- petxinxiid索引:加速基于商品ID的查询操作
- fenlei索引:支持按商品分类进行快速检索
- 计算字段优化:xiaoji字段预计算减少实时计算开销

实体模型设计与数据映射
实体类设计采用JPA注解方式,实现对象与数据库表的映射关系,提高代码的可读性和维护性。
@Table(name = "admins")
public class Admins implements Serializable {
@GeneratedValue(generator = "JDBC")
@Id
@Column(name = "id",insertable=false)
private Integer id;
@Column(name = "username")
private String username;
@Column(name = "pwd")
private String pwd;
@Column(name = "addtime")
private String addtime;
private static final long serialVersionUID = 1L;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? "" : username.trim();
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd == null ? "" : pwd.trim();
}
public String getAddtime() {
return addtime;
}
public void setAddtime(String addtime) {
this.addtime = addtime;
}
}
实体类设计特点:
- 空值安全处理:setter方法中对null值进行安全处理,避免空指针异常
- 序列化支持:实现Serializable接口,支持对象序列化
- 字段映射精确:通过@Column注解精确控制字段映射关系
核心业务功能实现详解
购物车与订单管理模块
购物车功能采用会话级存储与数据库持久化相结合的方式,确保用户数据的完整性和一致性。订单生成过程包含完整的业务校验和事务控制。
@RequestMapping("/addToCart")
public String addToCart() {
// 获取商品信息
int petxinxiid = Request.getInt("petxinxiid");
int goumaishuliang = Request.getInt("goumaishuliang");
// 验证用户登录状态
if(!checkUserLogin()){
return showError("请先登录", "../login.do");
}
// 查询商品详细信息
PetXinxi petInfo = petXinxiService.find(petxinxiid);
if(petInfo == null){
return showError("商品不存在");
}
// 构建购物车对象
Gouwuche cartItem = new Gouwuche();
cartItem.setPetxinxiid(petxinxiid);
cartItem.setPetbianhao(petInfo.getBianhao());
cartItem.setPetmingcheng(petInfo.getMingcheng());
cartItem.setFenlei(petInfo.getFenlei());
cartItem.setXiaoshoujiage(petInfo.getXiaoshoujiage());
cartItem.setGoumaishuliang(goumaishuliang);
// 计算小计金额
BigDecimal xiaoji = petInfo.getXiaoshoujiage()
.multiply(new BigDecimal(goumaishuliang));
cartItem.setXiaoji(xiaoji);
cartItem.setGoumairen(getUserSession().getUsername());
// 保存到数据库
gouwucheService.insert(cartItem);
return showSuccess("添加成功", "../gouwuche_list.do");
}

商品分类与检索系统
宠物分类系统采用树形结构设计,支持多级分类管理,提供高效的商品检索和筛选能力。
CREATE TABLE `petfenlei` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fenleimingcheng` varchar(255) NOT NULL COMMENT '分类名称',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='宠物分类'
分类管理功能实现代码:
@RequestMapping("/petfenlei_list")
public String petfenleiList() {
if(!checkLogin()){
return showError("尚未登录", "./login.do");
}
String order = Request.get("order", "id");
String sort = Request.get("sort", "desc");
Example example = new Example(Petfenlei.class);
Example.Criteria criteria = example.createCriteria();
String where = " 1=1 ";
// 动态条件构建
if(!Request.get("fenleimingcheng").equals("")) {
where += " AND fenleimingcheng LIKE '%"+Request.get("fenleimingcheng")+"%' ";
}
criteria.andCondition(where);
if(sort.equals("desc")){
example.orderBy(order).desc();
}else{
example.orderBy(order).asc();
}
int page = request.getParameter("page") == null ? 1 :
Integer.valueOf(request.getParameter("page"));
page = Math.max(1, page);
List<Petfenlei> list = petfenleiService.selectPageExample(example, page, 12);
assign("total", Query.make("petfenlei").where(where).count());
assign("list", list);
assign("orderby", order);
assign("sort", sort);
return "petfenlei_list";
}

订单状态流转管理
订单系统实现完整的状态机管理,从下单、支付、发货到签收,每个环节都有严格的状态控制和权限验证。
@RequestMapping("/updateOrderStatus")
public String updateOrderStatus() {
int orderId = Request.getInt("id");
String newStatus = Request.get("zhuangtai");
// 权限验证
if(!checkAdminLogin()){
return showError("无操作权限");
}
Dingdanxinxi order = dingdanxinxiService.find(orderId);
if(order == null){
return showError("订单不存在");
}
// 状态流转验证
if(!isValidStatusTransition(order.getZhuangtai(), newStatus)){
return showError("状态流转不合法");
}
order.setZhuangtai(newStatus);
dingdanxinxiService.update(order);
// 记录操作日志
saveOperationLog("更新订单状态", "订单ID:" + orderId + ", 新状态:" + newStatus);
return showSuccess("操作成功", "../dingdanxinxi_list.do");
}
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("已签收", "退货中"));
List<String> allowed = validTransitions.get(currentStatus);
return allowed != null && allowed.contains(newStatus);
}

用户权限与安全管理
系统采用基于角色的访问控制(RBAC)模型,实现精细化的权限管理。
public class BaseController {
protected boolean checkLogin() {
Object admin = session.getAttribute("admin");
return admin != null;
}
protected boolean checkUserLogin() {
Object user = session.getAttribute("user");
return user != null;
}
protected String showError(String message, String jumpUrl) {
request.setAttribute("message", message);
request.setAttribute("jumpUrl", jumpUrl);
return "error";
}
protected String showSuccess(String message, String jumpUrl) {
request.setAttribute("message", message);
request.setAttribute("jumpUrl", jumpUrl);
return "success";
}
protected void assign(String name, Object value) {
request.setAttribute(name, value);
}
}

功能展望与系统优化方向
基于当前架构和技术实现,该宠物生活服务平台在未来有以下优化和发展方向:
1. 引入Redis缓存层提升性能
// 商品信息缓存示例
@Service
public class PetInfoCacheService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String CACHE_PREFIX = "pet:info:";
private static final long EXPIRATION = 3600; // 1小时
public PetXinxi getPetInfoById(Integer id) {
String cacheKey = CACHE_PREFIX + id;
PetXinxi petInfo = (PetXinxi) redisTemplate.opsForValue().get(cacheKey);
if (petInfo == null) {
petInfo = petXinxiMapper.selectByPrimaryKey(id);
if (petInfo != null) {
redisTemplate.opsForValue().set(cacheKey, petInfo, EXPIRATION, TimeUnit.SECONDS);
}
}
return petInfo;
}
}
2. 微服务架构改造
将单体应用拆分为商品服务、订单服务、用户服务、内容服务等微服务模块,提高系统的可扩展性和维护性。
3. 移动端适配与PWA应用
开发响应式前端界面,支持PWA(渐进式Web应用)特性,提供接近原生应用的移动端体验。
4. 智能推荐系统集成
基于用户行为数据构建推荐算法,实现个性化商品推荐和内容推送。
5. 支付系统扩展与多渠道整合
集成微信支付、支付宝等多种支付方式,支持分期付款等灵活的支付方案。
技术实现深度解析
MyBatis高级映射技巧
系统采用MyBatis的复杂结果映射处理多表关联查询,提高数据检索效率。
<!-- 订单详情结果映射 -->
<resultMap id="OrderDetailResultMap" type="com.spring.entity.OrderDetailDTO">
<id column="id" property="id"/>
<result column="dingdanbianhao" property="orderNumber"/>
<result column="zongjijine" property="totalAmount"/>
<result column="shouhuoren" property="receiver"/>
<result column="zhuangtai" property="status"/>
<!-- 集合映射:订单商品列表 -->
<collection property="orderItems" ofType="com.spring.entity.OrderItem">
<id column="item_id" property="id"/>
<result column="petmingcheng" property="productName"/>
<result column="xiaoshoujiage" property="price"/>
<result column="goumaishuliang" property="quantity"/>
<result column="xiaoji" property="subtotal"/>
</collection>
</resultMap>
<select id="selectOrderWithDetails" resultMap="OrderDetailResultMap">
SELECT o.*, oi.id as item_id, oi.petmingcheng, oi.xiaoshoujiage,
oi.goumaishuliang, oi.xiaoji
FROM dingdanxinxi o
LEFT JOIN dingdanqianshou_dingdanxinxi oi ON o.id = oi.dingdanqianshouid
WHERE o.id = #{orderId}
</select>
Spring事务管理最佳实践
使用声明式事务管理确保业务操作的数据一致性。
@Service
@Transactional
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private InventoryMapper inventoryMapper;
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
public boolean createOrder(OrderDTO orderDTO) {
try {
// 1. 验证库存
for (OrderItem item : orderDTO.getItems()) {
Inventory inventory = inventoryMapper.selectByProductId(item.getProductId());
if (inventory.getStock() < item.getQuantity()) {
throw new InventoryShortageException("库存不足");
}
}
// 2. 扣减库存
for (OrderItem item : orderDTO.getItems()) {
inventoryMapper.decreaseStock(item.getProductId(), item.getQuantity());
}
// 3. 创建订单
orderMapper.insert(orderDTO);