基于SSM框架的在线宠物销售与美容服务平台 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenMySQL
2026-02-0815 浏览

文章摘要

本项目是一款基于SSM(Spring + Spring MVC + MyBatis)框架构建的综合性在线服务平台,专注于宠物销售与美容服务两大核心业务。平台旨在解决传统宠物行业信息不对称、服务预约流程繁琐以及商品购买渠道单一的痛点,通过一体化的数字解决方案,为宠物主人提供便捷、可靠的线上消费体验。 ...

在传统宠物行业数字化转型的浪潮中,一个集宠物销售与专业美容服务于一体的综合性在线平台应运而生。该平台基于成熟的SSM(Spring + Spring MVC + MyBatis)技术栈构建,为宠物主人提供了从商品购买到服务预约的全流程数字化解决方案。

系统架构与技术栈设计

该平台采用经典的三层架构模式,每一层都选择了业界验证的稳定技术框架。表现层使用Spring MVC框架处理HTTP请求和响应,通过清晰的控制器映射实现前后端分离。业务逻辑层基于Spring框架的核心IoC容器管理所有业务对象,利用AOP实现事务管理、日志记录等横切关注点。数据持久层采用MyBatis框架,通过灵活的SQL映射配置实现高效的数据访问。

技术栈配置如下:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.22</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.7</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
</dependencies>

项目使用Maven进行依赖管理和构建,确保了开发环境的一致性。前端采用HTML5、CSS3和JavaScript技术,结合响应式设计理念,为不同设备用户提供一致的交互体验。

数据库设计深度解析

订单表设计的业务逻辑体现

订单表(ordermsg)的设计充分考虑了电商业务的复杂性,通过巧妙的字段设计支持了多种业务场景:

CREATE TABLE `ordermsg` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `ddno` varchar(255) DEFAULT NULL COMMENT '订单编号',
  `memberid` varchar(255) DEFAULT NULL COMMENT '会员ID',
  `productid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `num` int(11) DEFAULT NULL COMMENT '购买数量',
  `total` double(255,2) DEFAULT NULL COMMENT '订单总额',
  `fkstatus` varchar(255) DEFAULT NULL COMMENT '付款状态',
  `shstatus` varchar(11) DEFAULT NULL COMMENT '收货状态',
  `addr` varchar(255) DEFAULT NULL COMMENT '收货地址',
  `savetime` varchar(255) DEFAULT NULL COMMENT '下单时间',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `shfs` varchar(255) DEFAULT NULL COMMENT '配送方式',
  `zffs` varchar(255) DEFAULT NULL COMMENT '支付方式',
  `saver` varchar(255) DEFAULT NULL COMMENT '操作人',
  `isdd` varchar(255) DEFAULT NULL COMMENT '是否订单',
  `fid` varchar(255) DEFAULT NULL COMMENT '父级ID',
  `goodsid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `goodstype` varchar(255) DEFAULT NULL COMMENT '商品类型',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单表'

该表设计的亮点在于:

  • 状态字段分离fkstatus(付款状态)、shstatus(收货状态)、delstatus(删除状态)分别管理不同维度的订单生命周期
  • 业务扩展性:通过goodstype字段区分商品类型,支持宠物、用品、服务等不同业务线的统一订单管理
  • 树形结构支持fid字段实现了订单的父子关系,为售后、退款等衍生业务提供数据结构基础
  • 审计追踪saver字段记录操作人,满足业务操作的可追溯性需求

商品表的多维分类体系

商品表(product)设计了完善的多级分类和营销标识体系:

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `productno` varchar(255) DEFAULT NULL COMMENT '商品编号',
  `productname` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `filename` varchar(255) DEFAULT NULL COMMENT '图片名称',
  `price` decimal(10,2) DEFAULT NULL COMMENT '现价',
  `tprice` decimal(10,2) DEFAULT NULL COMMENT '原价',
  `fid` varchar(255) DEFAULT NULL COMMENT '一级分类ID',
  `sid` varchar(255) DEFAULT NULL COMMENT '二级分类ID',
  `content` text DEFAULT NULL COMMENT '商品详情',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `issj` varchar(255) DEFAULT NULL COMMENT '是否上架',
  `istj` varchar(255) DEFAULT NULL COMMENT '是否推荐',
  `saver` varchar(255) DEFAULT NULL COMMENT '操作人',
  `productid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `leibie` varchar(255) DEFAULT NULL COMMENT '类别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'

该表的关键设计特点:

  • 价格策略price(现价)和tprice(原价)字段支持促销价格展示
  • 双重分类fidsid实现两级分类,leibie提供额外的分类维度
  • 商品状态管理issj控制上架状态,istj实现推荐商品标记
  • 富文本支持content字段使用text类型存储详细的商品描述和HTML内容

商品管理界面

核心功能实现深度解析

1. 统一内容管理模块

平台的内容管理模块采用高度可配置的设计,AboutController展示了如何实现统一的内容编辑和展示逻辑:

@Controller
public class AboutController extends BaseController {
    @Resource
    AboutDAO aboutDAO;
    @Resource
    CategoryDAO categoryDAO;
    @Resource
    Saveobject saveobject;
    
    @RequestMapping("/admin/showAbout")
    public String showAbout(int id,HttpServletRequest request){
        String pagemsg = request.getParameter("pagemsg");
        About about = aboutDAO.findById(id);
        request.setAttribute("about", about);
        request.setAttribute("pagemsg", pagemsg);
        return "admin/aboutedit";
    }
    
    @RequestMapping("/admin/aboutEdit")
    public String aboutEdit(About about,HttpServletRequest request){
        aboutDAO.update(about);
        return "redirect:showAbout.do?id=1";
    }

    @RequestMapping("About")
    public String About(int id,HttpServletRequest request){
        About about = aboutDAO.findById(id);
        request.setAttribute("about", about);
        saveobject.getCart(request);
        saveobject.getCategoryObject(request);
        saveobject.hotSales("",request);
        List<Product> zphlist = saveobject.hotSales("",request);
        request.setAttribute("zphlist", zphlist);
        return "about";
    }
}

该控制器的设计亮点:

  • 职责分离:管理员接口和用户展示接口分离,确保安全性
  • 数据预加载:通过Saveobject统一加载购物车、分类等公共数据
  • 热销商品集成:在关于页面智能推荐热销商品,提升转化率

关于我们编辑界面

2. 智能购物车与订单系统

购物车功能通过Session管理实现无状态用户的临时数据存储,订单生成时进行数据持久化:

@Service
public class CartService {
    
    public void addToCart(HttpServletRequest request, Product product, int quantity) {
        HttpSession session = request.getSession();
        Map<Integer, CartItem> cart = (Map<Integer, CartItem>) session.getAttribute("cart");
        
        if (cart == null) {
            cart = new HashMap<>();
        }
        
        if (cart.containsKey(product.getId())) {
            CartItem item = cart.get(product.getId());
            item.setQuantity(item.getQuantity() + quantity);
        } else {
            CartItem newItem = new CartItem(product, quantity);
            cart.put(product.getId(), newItem);
        }
        
        session.setAttribute("cart", cart);
    }
    
    public Order generateOrder(HttpServletRequest request, Member member, String address) {
        Map<Integer, CartItem> cart = getCart(request);
        Order order = new Order();
        order.setDdno(generateOrderNo());
        order.setMemberid(member.getId().toString());
        order.setTotal(calculateTotal(cart));
        order.setAddr(address);
        order.setSavetime(new Date().toString());
        order.setFkstatus("待付款");
        
        for (CartItem item : cart.values()) {
            OrderDetail detail = new OrderDetail();
            detail.setProductid(item.getProduct().getId());
            detail.setNum(item.getQuantity());
            detail.setPrice(item.getProduct().getPrice());
            order.addDetail(detail);
        }
        
        return order;
    }
}

订单生成的关键业务流程:

  1. 从Session中获取购物车数据
  2. 生成唯一订单编号
  3. 计算订单总金额
  4. 创建订单主表和明细记录
  5. 清空购物车并跳转支付页面

提交订单界面

3. 宠物美容服务预约系统

服务预约模块结合了时间管理和资源调度功能:

@Controller
@RequestMapping("/service")
public class ServiceAppointmentController {
    
    @Resource
    private ServiceAppointmentDAO appointmentDAO;
    @Resource
    private GroomerDAO groomerDAO;
    
    @RequestMapping("/appointment")
    public String makeAppointment(@RequestParam Integer serviceId,
                                 @RequestParam String appointmentTime,
                                 @RequestParam Integer groomerId,
                                 HttpServletRequest request) {
        
        // 检查时间冲突
        boolean isAvailable = appointmentDAO.checkTimeSlot(groomerId, appointmentTime);
        if (!isAvailable) {
            request.setAttribute("error", "该时间段已被预约,请选择其他时间");
            return "service/appointment";
        }
        
        ServiceAppointment appointment = new ServiceAppointment();
        appointment.setServiceId(serviceId);
        appointment.setAppointmentTime(appointmentTime);
        appointment.setGroomerId(groomerId);
        appointment.setMemberId(getCurrentMemberId(request));
        appointment.setStatus("待确认");
        
        appointmentDAO.insert(appointment);
        return "redirect:/service/success";
    }
    
    @RequestMapping("/groomers")
    @ResponseBody
    public List<Groomer> getAvailableGroomers(@RequestParam String date) {
        return groomerDAO.findAvailableGroomersByDate(date);
    }
}

服务预约的技术特点:

  • 实时资源检查:在预约前验证美容师时间可用性
  • 异步数据加载:通过AJAX动态加载可用美容师列表
  • 状态机管理:预约状态从"待确认"到"已完成"的完整生命周期

美容服务详情

4. 多维度商品检索系统

商品检索功能结合分类、关键词、价格区间等多条件筛选:

@Repository
public interface ProductDAO {
    
    List<Product> searchProducts(@Param("keyword") String keyword,
                                @Param("categoryId") Integer categoryId,
                                @Param("minPrice") BigDecimal minPrice,
                                @Param("maxPrice") BigDecimal maxPrice,
                                @Param("isRecommend") Boolean isRecommend,
                                @Param("offset") Integer offset,
                                @Param("limit") Integer limit);
    
    Integer countSearchProducts(@Param("keyword") String keyword,
                               @Param("categoryId") Integer categoryId,
                               @Param("minPrice") BigDecimal minPrice,
                               @Param("maxPrice") BigDecimal maxPrice,
                               @Param("isRecommend") Boolean isRecommend);
}

<!-- MyBatis映射文件 -->
<select id="searchProducts" resultType="Product">
    SELECT * FROM product 
    WHERE delstatus = '0' AND issj = '1'
    <if test="keyword != null and keyword != ''">
        AND (productname LIKE CONCAT('%', #{keyword}, '%') 
             OR content LIKE CONCAT('%', #{keyword}, '%'))
    </if>
    <if test="categoryId != null">
        AND (fid = #{categoryId} OR sid = #{categoryId})
    </if>
    <if test="minPrice != null">
        AND price >= #{minPrice}
    </if>
    <if test="maxPrice != null">
        AND price <= #{maxPrice}
    </if>
    <if test="isRecommend != null and isRecommend">
        AND istj = '1'
    </if>
    ORDER BY id DESC
    LIMIT #{offset}, #{limit}
</select>

检索系统的优化策略:

  • 动态SQL构建:根据查询条件动态生成SQL,避免全表扫描
  • 分页查询:支持大数据量的高效分页显示
  • 多字段模糊匹配:在商品名称和详情中同时搜索关键词

商城首页

实体模型设计精要

实体类设计遵循JavaBean规范,与数据库表结构严格对应:

package com.entity;

import java.util.*;

public class About {
    private int id;
    private String content;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getContent() {
        return content;
    }
    public void setId(String content) {
        this.content = content;
    }
    
    @Override
    public String toString() {
        return "About [content=" + content + ", id=" + id + "]";
    }
}

// 订单实体类扩展设计
public class Order {
    private Integer id;
    private String ddno;
    private String memberid;
    private Double total;
    private String fkstatus;
    private String shstatus;
    private List<OrderDetail> details;
    
    // 关联查询方法
    public Member getMember() {
        return memberDAO.findById(Integer.parseInt(memberid));
    }
    
    public List<OrderDetail> getDetails() {
        if (details == null) {
            details = orderDetailDAO.findByOrderId(id);
        }
        return details;
    }
}

实体设计的核心原则:

  • 数据封装:所有字段私有化,通过getter/setter方法访问
  • 关联延迟加载:关联对象在需要时才从数据库加载
  • 业务方法封装:在实体类中封装常用的业务逻辑方法

功能展望与系统优化方向

1. 缓存架构优化

引入Redis分布式缓存,提升系统性能:

@Service
public class ProductServiceWithCache {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    
    public Product getProductById(Integer id) {
        String cacheKey = "product:" + id;
        Product product = (Product) redisTemplate.opsForValue().get(cacheKey);
        if (product == null) {
            product = productDAO.findById(id);
            redisTemplate.opsForValue().set(cacheKey, product, Duration.ofHours(1));
        }
        return product;
    }
}

2. 微服务架构改造

将单体应用拆分为商品服务、订单服务、用户服务等独立微服务:

# Spring Cloud配置示例
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        - id: product-service
          uri: lb://product-service
          predicates:
            - Path=/api/products/**

3. 消息队列集成

使用RabbitMQ处理高并发订单和异步任务:

@Component
public class OrderMessageProducer {
    @Resource
    private RabbitTemplate rabbitTemplate;
    
    public void sendOrderCreateMessage(Order order) {
        rabbitTemplate.convertAndSend("order.exchange", 
                                    "order.create", 
                                    order);
    }
}

4. 移动端适配升级

开发React Native跨平台移动应用,提升用户体验:

// 移动端商品列表组件
import React from 'react';
import {FlatList, View, Text, Image} from 'react-native';

const ProductList = ({products}) => (
    <FlatList
        data={products}
        renderItem={({item}) => (
            <View style={styles.productItem}>
                <Image source={{uri: item.image}} style={styles.productImage} />
                <Text style={styles.productName}>{item.productname}</Text>
                <Text style={styles.productPrice}>¥{item.price}</Text>
            </View>
        )}
    />
);

5. 智能推荐系统

基于用户行为数据实现个性化推荐:

@Service
public class RecommendationService {
    public List<Product> getPersonalizedRecommendations(Integer userId) {
        // 基于协同过滤算法
        List<Integer> similarUsers = findSimilarUsers(userId);
        return productDAO.findProductsByUserPreferences(similarUsers);
    }
}

系统架构总结

该宠物电商与服务平台通过SSM框架的有机整合,实现了业务逻辑的清晰分离和数据访问的高效管理。数据库设计体现了对电商业务复杂性的深刻理解,特别是在订单状态管理和商品分类体系方面的设计尤为出色。控制器层的设计遵循了RESTful原则,同时保持了足够的灵活性以应对业务变化。

系统的扩展性设计为未来升级预留了充足空间,无论是向微服务架构演进还是引入新技术组件,现有的代码结构都能提供良好的支持。实体模型的设计严格遵循领域驱动设计原则,为业务逻辑的持续演进奠定了坚实基础。

平台在用户体验方面的考虑十分周到,从直观的商品展示到便捷的服务预约流程,都体现了以用户为中心的设计理念。后台管理功能的完备性确保了运营人员能够高效管理复杂的宠物商品和服务业务。

本文关键词
SSM框架在线宠物销售宠物美容服务平台源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章