在现代服务业快速发展的背景下,家政服务行业面临着数字化转型的重要机遇。传统电话预约方式已无法满足用户对便捷性、透明度和效率的需求。为此,我们设计并实现了一个基于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='订单信息表'
设计亮点:
- 金额精度控制:使用
decimal(18,2)类型确保金融计算的精确性 - 状态管理:
zhuangtai字段支持灵活的订单状态流转 - 支付标识:
iszf字段采用枚举思想,简化支付状态判断 - 时间戳:
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框架的强大功能。特别是订单管理、购物车功能和权限控制等核心模块,通过合理的代码组织和优化的算法设计,确保了系统的高效运行和良好的用户体验。
未来通过引入缓存机制、微服务改造、移动端适配等优化措施,可以进一步提升系统的性能、可扩展性和用户体验。该平台不仅满足了当前家政服务行业的基本需求,更为未来的业务扩展和技术升级奠定了坚实的基础,具备良好的发展前景和应用价值。