加油站会员管理系统的设计与实现:基于SpringBoot+Vue+微信小程序
系统概述
本文介绍一个面向攀枝花市金河加油站的会员管理系统,采用前后端分离架构,后端使用Spring Boot框架,前端Web端采用Vue.js,移动端通过微信小程序实现。系统提供会员注册、积分累计、消费查询、优惠活动推送等核心功能,同时支持管理员在后台进行数据统计与权限管理。
技术选型与框架优势
- Spring Boot:内置Tomcat容器,自动配置减少XML配置,集成Spring Data JPA与Spring Security,快速构建RESTful API。
- Vue.js:采用虚拟DOM实现高效渲染,组件化开发易于维护,响应式数据绑定使UI与状态同步。
- MyBatis-Plus:基于MyBatis的增强工具,提供分页、条件构造器、乐观锁等,并通过代码生成器自动生成Mapper和实体。
- 微信小程序:实现会员自助登录、会员卡查看、积分兑换,基于WeUI组件提升移动端体验。
系统架构
系统分为三个终端:Web管理端、微信小程序端和RESTful API服务端。所有终端共享同一套后端服务,采用Token认证机制。前端通过Axios发送HTTP请求,后端使用JWT(JSON Web Token)管理会话。数据存储使用MySQL,通过MyBatis-Plus进行ORM操作。
核心功能模块
- 会员管理:注册、信息编辑、积分记录、会员等级升降。
- 消费管理:加油记录录入、积分自动计算、支付接口预留。
- 优惠活动:管理员发布满减、折扣活动,小程序端推送通知。
- 数据统计:按日/周/月统计消费额、新增会员数、活动参与率。
关键设计:权限与Token拦截
系统通过自定义拦截器验证每次请求的Token。以下代码展示了Token的生成逻辑和拦截器核心流程(已重构变量名和结构):
// Token生成服务
@Service
public class TokenGenService {
@Autowired
private TokenRepo tokenRepo;
public String createToken(Long userId, String userName, String tableName, String role) {
// 先查找是否已有有效token
TokenEntity existing = tokenRepo.findByUserIdAndRole(userId, role);
String rawToken = UUID.randomUUID().toString().replace("-", "");
LocalDateTime expire = LocalDateTime.now().plusHours(2);
if (existing != null) {
existing.setRawToken(rawToken);
existing.setExpireTime(expire);
tokenRepo.updateById(existing);
} else {
tokenRepo.insert(new TokenEntity(userId, userName, tableName, role, rawToken, expire));
}
return rawToken;
}
}
// 自定义拦截器,继承HandlerInterceptor
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Autowired
private TokenRepo tokenRepo;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
// 跨域处理
resp.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
resp.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
resp.setStatus(HttpStatus.OK.value());
return false;
}
// 检查方法是否有@NoAuth注解
if (handler instanceof HandlerMethod) {
if (((HandlerMethod) handler).getMethodAnnotation(NoAuth.class) != null) {
return true;
}
}
String token = req.getHeader("Authorization");
if (StringUtils.isBlank(token)) {
writeError(resp, "未提供认证令牌");
return false;
}
TokenEntity entity = tokenRepo.findByRawToken(token);
if (entity == null || entity.getExpireTime().isBefore(LocalDateTime.now())) {
writeError(resp, "令牌无效或已过期");
return false;
}
// 设置用户信息到session
req.getSession().setAttribute("userId", entity.getUserId());
req.getSession().setAttribute("role", entity.getRole());
return true;
}
private void writeError(HttpServletResponse resp, String msg) throws IOException {
resp.setContentType("application/json;charset=UTF-8");
resp.getWriter().write("{\"code\":401,\"msg\":\"" + msg + "\"}");
}
}
测试方案与结果
采用黑盒测试对登录、会员注册、积分查询等功能进行测试。测试用例覆盖边界值、必填项校验、角色权限等场景。结果表明所有功能满足预期,未出现严重缺陷。例如,登录模块测试了正确/错误密码、空输入、验证码错误等情况,系统均给出合理提示。
数据表设计(Token表)
以下为重构后的token表结构(字段名已调整):
CREATE TABLE `token_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`login_name` varchar(100) NOT NULL COMMENT '登录名',
`table_source` varchar(100) DEFAULT NULL COMMENT '用户表名',
`user_role` varchar(100) DEFAULT NULL COMMENT '角色',
`access_token` varchar(200) NOT NULL COMMENT '令牌',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`expire_time` timestamp NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '过期时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='令牌记录表';
总结
本系统利用Spring Boot、Vue.js与微信小程序,实现了加油站会员管理的高效解决方案。通过Token认证保证了接口安全,MyBatis-Plus简化了数据操作,前端组件化提升了开发效率。实际测试验证了系统的稳定性和可用性。