基于SSM框架的在线家政预约管理系统 - 源码深度解析

JavaScriptHTMLCSSSSM框架JSP+ServletMySQL
2026-02-0711 浏览

文章摘要

在现代服务业快速发展的背景下,家政服务行业面临着数字化转型的重要机遇。传统电话预约方式已无法满足用户对便捷性、透明度和效率的需求。为此,我们设计并实现了一个基于SSM(Spring+SpringMVC+MyBatis)框架的企业级家政服务预约平台,该系统通过标准化的服务流程和智能化的管理功能,为用户提供全方位的在线预约体验。

系统架构与技术栈

该平台采用经典的三层架构模式,前端使用JSP+JavaScript+HTML+CSS技术组合,后端基于SSM框架构建,数据持久层采用MyBatis,数据库选用MySQL 5.7。这种技术组合确保了系统的稳定性、可扩展性和维护性。

核心架构组件

  • 表现层:JSP页面负责视图渲染,jQuery处理前端交互
  • 控制层:Spring MVC框架实现请求路由和业务逻辑控制
  • 业务层:Spring IoC容器管理服务组件和事务
  • 持久层:MyBatis实现ORM映射,提供灵活的SQL定制能力

数据库设计亮点分析

订单信息表设计优化

dingdanxinxi表的设计体现了电商系统的典型特征:

CREATE TABLE `dingdanxinxi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `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=9 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单信息表'

设计亮点

  1. 金额精度控制:使用decimal(18,2)类型确保金融计算的精确性
  2. 状态管理zhuangtai字段支持灵活的订单状态流转
  3. 支付标识iszf字段采用枚举思想,简化支付状态判断
  4. 时间戳addtime自动记录创建时间,便于数据追踪

订单管理界面

家政服务信息表设计

fuwuxinxi表的设计展现了商品管理的专业水准:

CREATE TABLE `fuwuxinxi` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `fuwubianhao` varchar(50) NOT NULL COMMENT '家政服务编号',
  `fuwumingcheng` varchar(255) NOT NULL COMMENT '家政服务名称',
  `fenlei` int(10) unsigned NOT NULL COMMENT '分类',
  `fuwutupian` text NOT NULL COMMENT '家政服务图片',
  `shichangjiage` decimal(20,6) NOT NULL DEFAULT 0.000000 COMMENT '市场价格',
  `xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
  `kucun` int(11) NOT NULL COMMENT '库存',
  `zuozhe` varchar(50) NOT NULL COMMENT '联系电话',
  `chubanshe` varchar(50) NOT NULL COMMENT '预计耗时',
  `fuwuxiangqing` longtext NOT NULL COMMENT '家政服务详情',
  `tianjiaren` varchar(50) NOT NULL COMMENT '添加人',
  `addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
  PRIMARY KEY (`id`),
  KEY `fuwuxinxi_fenlei_index` (`fenlei`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='家政服务信息'

索引优化策略

  • 主键索引:基于id的聚簇索引,提升查询效率
  • 分类索引:fenlei字段的辅助索引,加速分类查询
  • 图片存储:fuwutupian采用TEXT类型,支持大容量图片URL存储

家政服务管理

核心功能实现深度解析

1. 购物车功能实现

购物车模块采用经典的Session+数据库双重存储策略,确保数据持久化和用户体验的平衡。

实体类设计

@Entity
@Table(name = "gouwuche")
public class ShoppingCart implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "fuwuxinxiid", nullable = false)
    private Long serviceId;
    
    @Column(name = "fuwumingcheng", length = 255, nullable = false)
    private String serviceName;
    
    @Column(name = "xiaoshoujiage", precision = 18, scale = 2, nullable = false)
    private BigDecimal salePrice;
    
    @Column(name = "goumaishuliang", nullable = false)
    private Integer quantity;
    
    @Column(name = "xiaoji", precision = 18, scale = 2, nullable = false)
    private BigDecimal subtotal;
    
    @Column(name = "goumairen", length = 50, nullable = false)
    private String buyer;
    
    // Getter和Setter方法
}

控制器逻辑

@Controller
@RequestMapping("/cart")
public class ShoppingCartController {
    
    @Autowired
    private ShoppingCartService cartService;
    
    @RequestMapping("/add")
    public String addToCart(@RequestParam Long serviceId, 
                           @RequestParam Integer quantity,
                           HttpSession session) {
        // 获取当前用户信息
        User currentUser = (User) session.getAttribute("currentUser");
        if (currentUser == null) {
            return "redirect:/login";
        }
        
        // 构建购物车项
        ShoppingCartItem item = new ShoppingCartItem();
        item.setServiceId(serviceId);
        item.setQuantity(quantity);
        item.setBuyer(currentUser.getUsername());
        
        // 计算小计金额
        ServiceInfo service = serviceService.findById(serviceId);
        BigDecimal subtotal = service.getSalePrice().multiply(new BigDecimal(quantity));
        item.setSubtotal(subtotal);
        
        // 保存到数据库
        cartService.addItem(item);
        
        return "redirect:/cart/view";
    }
    
    @RequestMapping("/view")
    public String viewCart(Model model, HttpSession session) {
        User currentUser = (User) session.getAttribute("currentUser");
        List<ShoppingCartItem> cartItems = cartService.getItemsByUser(currentUser.getUsername());
        
        // 计算总金额
        BigDecimal totalAmount = cartItems.stream()
            .map(ShoppingCartItem::getSubtotal)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
            
        model.addAttribute("cartItems", cartItems);
        model.addAttribute("totalAmount", totalAmount);
        
        return "shopping_cart";
    }
}

购物车界面

2. 订单管理功能

订单管理模块实现了完整的业务流程,包括订单创建、状态追踪和签收管理。

订单创建服务

@Service
@Transactional
public class OrderService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private ShoppingCartService cartService;
    
    public String createOrder(OrderInfo order, List<Long> cartItemIds) {
        // 生成订单编号
        String orderNumber = generateOrderNumber();
        order.setOrderNumber(orderNumber);
        
        // 计算订单总金额
        BigDecimal totalAmount = calculateTotalAmount(cartItemIds);
        order.setTotalAmount(totalAmount);
        
        // 保存订单主信息
        orderMapper.insert(order);
        
        // 处理订单明细
        for (Long cartItemId : cartItemIds) {
            ShoppingCartItem item = cartService.getItemById(cartItemId);
            OrderDetail detail = convertToOrderDetail(item, order.getId());
            orderMapper.insertDetail(detail);
            
            // 清除购物车项
            cartService.removeItem(cartItemId);
        }
        
        return orderNumber;
    }
    
    private String generateOrderNumber() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String timestamp = sdf.format(new Date());
        Random random = new Random();
        int randomNum = random.nextInt(9999);
        return "DD" + timestamp + String.format("%04d", randomNum);
    }
}

订单状态更新控制器

@RestController
@RequestMapping("/api/order")
public class OrderApiController {
    
    @PostMapping("/updateStatus")
    public ResponseEntity<Map<String, Object>> updateOrderStatus(
            @RequestParam Long orderId,
            @RequestParam String newStatus) {
        
        Map<String, Object> result = new HashMap<>();
        try {
            orderService.updateStatus(orderId, newStatus);
            result.put("success", true);
            result.put("message", "订单状态更新成功");
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "状态更新失败: " + e.getMessage());
            return ResponseEntity.badRequest().body(result);
        }
    }
}

3. 管理员权限控制

系统采用基于角色的访问控制(RBAC)模型,确保不同权限的管理员只能访问授权功能。

管理员实体类

@Table(name = "admins")
public class Admins implements Serializable {
    @Id
    @GeneratedValue(generator = "JDBC")
    @Column(name = "id", insertable = false)
    private Integer id;

    @Column(name = "username")
    private String username;
    
    @Column(name = "pwd")
    private String password;
    
    @Column(name = "addtime")
    private String addTime;
    
    @Transient
    private List<Role> roles; // 关联角色信息

    // Getter和Setter方法
}

权限验证拦截器

@Component
public class AuthInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        
        HttpSession session = request.getSession();
        Admins admin = (Admins) session.getAttribute("admin");
        
        if (admin == null) {
            response.sendRedirect(request.getContextPath() + "/admin/login");
            return false;
        }
        
        // 检查权限
        String requestURI = request.getRequestURI();
        if (!hasPermission(admin, requestURI)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "权限不足");
            return false;
        }
        
        return true;
    }
    
    private boolean hasPermission(Admins admin, String uri) {
        // 根据管理员角色和请求URI判断权限
        return permissionService.checkPermission(admin.getId(), uri);
    }
}

管理员登录界面

实体模型设计

系统采用标准的JPA注解进行实体关系映射,确保数据模型的一致性和完整性。

完整的服务信息实体

@Entity
@Table(name = "fuwuxinxi")
public class ServiceInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "fuwubianhao", nullable = false, length = 50)
    private String serviceNumber;
    
    @Column(name = "fuwumingcheng", nullable = false, length = 255)
    private String serviceName;
    
    @ManyToOne
    @JoinColumn(name = "fenlei", referencedColumnName = "id")
    private ServiceCategory category;
    
    @Column(name = "fuwutupian", columnDefinition = "TEXT")
    private String serviceImage;
    
    @Column(name = "xiaoshoujiage", precision = 18, scale = 2)
    private BigDecimal salePrice;
    
    @Column(name = "kucun")
    private Integer stock;
    
    @Column(name = "zuozhe", length = 50)
    private String contactPhone;
    
    @Column(name = "chubanshe", length = 50)
    private String estimatedTime;
    
    @Lob
    @Column(name = "fuwuxiangqing")
    private String serviceDetails;
    
    // 关联关系
    @OneToMany(mappedBy = "serviceInfo", cascade = CascadeType.ALL)
    private List<ShoppingCart> cartItems;
    
    @OneToMany(mappedBy = "serviceInfo")
    private List<OrderDetail> orderDetails;
    
    // 标准的getter和setter方法
}

功能展望与优化方向

1. 引入Redis缓存优化

现状分析:当前系统频繁查询服务分类、热门服务等静态数据,造成数据库压力。

优化方案

@Service
public class CacheableServiceInfoService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Cacheable(value = "serviceCategories", key = "'all_categories'")
    public List<ServiceCategory> getAllCategories() {
        return categoryMapper.selectAll();
    }
    
    @Cacheable(value = "hotServices", key = "'hot_services'")
    public List<ServiceInfo> getHotServices() {
        return serviceMapper.selectHotServices();
    }
    
    @CacheEvict(value = {"serviceCategories", "hotServices"}, allEntries = true)
    public void clearCache() {
        // 缓存清除逻辑
    }
}

2. 微服务架构改造

架构设计

  • 用户服务:独立处理用户注册、登录、个人信息管理
  • 订单服务:专门处理订单创建、状态管理、支付对接
  • 商品服务:管理服务信息、库存、分类体系
  • 网关服务:统一入口,处理认证、限流、路由

3. 移动端适配与PWA应用

技术方案

  • 开发响应式前端界面,支持移动端访问
  • 实现PWA(渐进式Web应用),支持离线功能
  • 开发原生App,通过RESTful API与后端交互

4. 智能推荐系统

实现思路

@Service
public class RecommendationService {
    
    public List<ServiceInfo> recommendServices(Long userId) {
        // 基于协同过滤算法
        List<Long> similarUsers = findSimilarUsers(userId);
        List<Long> recommendedServiceIds = 
            collaborativeFiltering(similarUsers, userId);
        
        // 基于内容过滤
        List<Long> contentBasedRecommendations = 
            contentBasedFiltering(userId);
            
        // 混合推荐
        return mergeRecommendations(recommendedServiceIds, 
                                  contentBasedRecommendations);
    }
}

5. 支付系统集成与优化

扩展功能

  • 集成微信支付、支付宝多种支付方式
  • 实现分账功能,支持平台与服务提供方分成
  • 增加退款、发票管理等财务功能

总结

该家政服务预约平台通过严谨的架构设计和精细的功能实现,构建了一个完整的在线服务生态系统。系统在数据库设计上体现了专业的数据建模能力,在业务逻辑实现上展现了SSM框架的强大功能。特别是订单管理、购物车功能和权限控制等核心模块,通过合理的代码组织和优化的算法设计,确保了系统的高效运行和良好的用户体验。

未来通过引入缓存机制、微服务改造、移动端适配等优化措施,可以进一步提升系统的性能、可扩展性和用户体验。该平台不仅满足了当前家政服务行业的基本需求,更为未来的业务扩展和技术升级奠定了坚实的基础,具备良好的发展前景和应用价值。

本文关键词
SSM框架家政预约系统源码解析订单管理数据库设计

上下篇

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