汽车4S店售后预约系统的全栈架构与实现
在汽车后市场数字化转型的背景下,构建一个高效、稳定的售后服务预约系统对于提升4S店运营效率和用户体验至关重要。本文将探讨一个基于 SpringBoot 后端框架、Vue.js 管理后台以及 Uniapp 移动端应用的全栈解决方案。
核心架构技术栈
1. 后端框架:SpringBoot
该系统后端采用 SpringBoot 框架,利用其"约定优于配置"的核心思想,极大地简化了开发流程。通过内嵌的 Tomcat 容器和自动配置特性,开发者可以专注于业务逻辑的实现。其强大的生态系统能够轻松集成安全校验、日志管理和数据库连接池。
2. 持久层框架:MyBatis
持久层使用 MyBatis 框架,通过 XML 映射文件将 SQL 语句与 Java 代码解耦。这种方式不仅提高了 SQL 的可维护性,还支持动态 SQL 生成,能够灵活处理复杂的售后业务查询需求。配合数据库连接池,系统在高并发预约场景下表现出良好的稳定性。
3. 前端与移动端:Vue.js & Uniapp
管理后台基于 Vue.js 构建,利用其组件化开发模式和虚拟 DOM 技术,确保了复杂后台界面的响应速度。移动端则采用 Uniapp 框架,实现了一套代码多端发布(微信小程序、H5、App),方便车主随时随地进行保养或维修预约。
系统实现截图



关键代码实现
1. 身份验证逻辑
系统通过 JWT 或 Token 机制保障接口安全。以下是用户登录及 Token 生成的核心逻辑实现:
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private AccountService accountService;
@Autowired
private TokenManager tokenManager;
@PostMapping("/executeLogin")
public ResultResponse doLogin(@RequestBody LoginRequest loginReq) {
// 根据账号检索用户信息
AccountInfo user = accountService.queryByAccount(loginReq.getUsername());
// 校验用户状态及密码一致性
if (user == null || !user.getCredential().equals(loginReq.getPassword())) {
return ResultResponse.error("认证失败:账号或密码错误");
}
// 签发访问令牌
String accessToken = tokenManager.issueToken(user.getGuid(), user.getAccountName(), user.getAccessRole());
return ResultResponse.success().put("accessToken", accessToken);
}
}
@Service
public class TokenManagerImpl implements TokenManager {
@Override
public String issueToken(Long uid, String name, String role) {
// 检索旧令牌防止重复签发
TokenRecord oldToken = this.selectOne(new EntityWrapper<TokenRecord>().eq("user_id", uid));
String secureToken = UUID.randomUUID().toString().replace("-", "");
Calendar expiryTime = Calendar.getInstance();
expiryTime.add(Calendar.MINUTE, 60); // 令牌有效期60分钟
if (oldToken != null) {
oldToken.setTokenContent(secureToken);
oldToken.setDeadline(expiryTime.getTime());
this.updateById(oldToken);
} else {
this.insert(new TokenRecord(uid, name, secureToken, expiryTime.getTime(), role));
}
return secureToken;
}
}
2. 安全拦截器配置
为了保护非公开接口,系统实现了拦截器对请求头中的 Token 进行校验:
public class SecurityInterceptor implements HandlerInterceptor {
@Autowired
private TokenManager tokenManager;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
// 处理预检请求
if (RequestMethod.OPTIONS.name().equals(req.getMethod())) {
res.setStatus(HttpServletResponse.SC_OK);
return true;
}
// 检查是否有免密注解
if (!(handler instanceof HandlerMethod)) return true;
IgnoreSecurity ignoreSecurity = ((HandlerMethod) handler).getMethodAnnotation(IgnoreSecurity.class);
if (ignoreSecurity != null) return true;
// 令牌合法性校验
String authHeader = req.getHeader("X-Auth-Token");
TokenRecord tokenRecord = null;
if (StringUtils.isNotBlank(authHeader)) {
tokenRecord = tokenManager.validate(authHeader);
}
if (tokenRecord != null) {
// 注入用户信息到 Session
req.setAttribute("current_uid", tokenRecord.getUserId());
return true;
}
res.setContentType("application/json;charset=UTF-8");
res.getWriter().print("{\"code\": 401, \"msg\": \"未授权的访问\"}");
return false;
}
}
数据库设计
系统核心表结构设计如下,涵盖了用户信息、服务地址以及社区互动功能:
-- 用户信息表
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '加密密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`phone_number` varchar(20) DEFAULT NULL COMMENT '联系电话',
`points` double DEFAULT '0' COMMENT '会员积分',
`wallet_balance` double DEFAULT '0' COMMENT '账户余额',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_account` (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 售后服务预约地址
CREATE TABLE `service_location` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`owner_id` bigint(20) NOT NULL COMMENT '所属用户ID',
`full_address` varchar(255) NOT NULL COMMENT '详细地址',
`contact_person` varchar(50) NOT NULL COMMENT '联系人',
`contact_phone` varchar(20) NOT NULL COMMENT '联系电话',
`is_primary` tinyint(1) DEFAULT '0' COMMENT '是否为默认地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
功能测试方案
系统通过严格的单元测试和集成测试,确保业务逻辑的严密性。以下为登录功能的测试用例设计:
| 测试场景 | 输入参数 | 预期输出 | 测试状态 |
|---|---|---|---|
| 合法用户登录 | 正确账号/正确密码 | 返回 Token 并跳转首页 | 通过 |
| 密码错误校验 | 正确账号/错误密码 | 提示"账号或密码错误" | 通过 |
| 空值检查 | 账号为空/任意密码 | 提示"账号不能为空" | 通过 |
| 重复注册测试 | 已存在的用户名 | 提示"该账号已存在" | 通过 |
此外,针对预约流程、评价系统以及积分商城等模块,均进行了压力测试与兼容性测试,确保在不同移动设备和浏览器环境下均能提供一致的使用体验。