本项目主要实现的功能是:主要服务于管理员用户,其可圈选奖品,人员来创建抽奖活动,并进行在线抽奖,并可通过短信或邮件的方式通知中奖者,同时普通用户可查看已结束的抽奖活动的中奖结果;
一、项目技术栈及环境
编程语言:后端:Java 17,前端 JavaScript
后端框架:SpringBoot 3
数据库:Mysql
持久层框架:Mybatis,Mybatis-Plus
缓存:Redis
消息队列:RabbitMQ
日志服务:Slf4j
安全校验:JWT
加密解密:hutool
开发工具:lombok
其他:邮箱服务,阿里云短信服务
项目依赖的 pom.xml 文件:点这里
二、项目模块分类
- 用户模块:管理员注册,登录,普通用户的创建,普通用户中奖状态的管理
- 奖品模块:奖品的创建,图片的上传,奖品的状态
- 活动模块:对抽奖活动及活动状态管理
- 抽奖模块:完成抽奖功能,并展示抽奖结果
- 中奖通知模块:通过发送邮件和短信来进行中奖通知
三、数据库设计
- 用户表:存储用户信息,如用户名、密码、邮箱等
- 奖品表:存储奖品信息,如奖品名称,奖品图片,奖品价值等
- 活动表:存储活动信息,如活动名称、描述、活动状态等
- 活动奖品关联表:存储每个活动下关联的奖品,包括奖品数量,奖品等级
- 活动人员关联表:存储参与每个活动的人员
- 中奖记录表:存储每个活动的中奖信息名单
sql 文件 点这里 使用source 命令执行 .sql 文件(路径不要存在中文)
数据库表 ER 图
四、统一处理
- 全局错误码:描述错误的状态,便于更精确的指出问题所在
- 自定义异常类:更精确地捕获和处理特定类型的错误,提高代码的可读性
- 统一结果返回:作为控制器层方法的返回类型,封装 HTTP 接口调用的结果,包括成功数据,错误信息和状态码
- 全局异常捕获:集中管理、统一处理和记录异常信息,提高了系统的健壮性、可维护性
- 拦截器:验证用户身份,在请求处理的早期阶段进行检查,防止未授权的访问
五、枚举类
-
GlobalErrorCodeEnum:全局错误码枚举,是错误码中的 code 部分
-
UserIdentityEnum:用户身份信息枚举,包括普通用户 NORMAL 和 管理员 ADMIN
-
ActivityStatusEnum:活动状态枚举,包括进行中 RUNNING 和 已完成 COMPLETED
-
ActivityUserStatusEnum:参与某个活动的用户状态枚举,包括初始化态 INIT 和 已完成 COMPLETED,以此来区分用户是否已经中奖,已经中奖的用户不能参与该活动下的后续抽奖
-
ActivityPrizeStatusEnum:参与某个活动的奖品状态枚举,包括初始化态 INIT 和 已完成 COMPLETED,以此来区分奖品是否已经被抽取完,被抽取完的奖品不能再次抽取
-
PrizeGradeEnum:奖品等级枚举,包括一等奖 FIRST_PRIZE、二等奖 SECOND_PRIZE 和 三等奖 THIRED_PRIZE
六、工具类
- JacksonUtil:包含静态的序列化和反序列化的方法,实现对象与 json 格式的转化
- JWTUtil:包含生成 token 和校验 token 的静态方法,实现用户身份认证
- RegexUtil:包含校验邮箱格式,手机号格式是否正确的静态方法,完成参数的校验
- MailUtil:封装发送邮件的方法
- SMSUtil:封装向手机号发送短信的方法
- CaptchaUtil:封装生成随机短信验证码的方法
- RedisUtil:封装操作 redis 的方法
- DateUtil:包含日期格式化的静态方法
七、业务实现
1. 用户模块
使用 hutool 将敏感字段如(手机号,密码)加密存储
1)注册功能
时序图:
前后端交互接口:
请求
url: '/register',
type: 'POST',
contentType: 'application/json',
data: {"name": "xxx", "email": "xxx", "phoneNumber": "xxx", "password": "xxx", "identity": "admin"}
响应
"code": 200,
"data": { userId: 11 },
"msg": ""
后端处理
- 首先校验用户输入的注册信息,包括邮箱格式,手机号格式等
- 校验通过之后,构造 User 对象,并存储在数据库中,同时对用户密码和手机号进行加密
- 构造响应,返回 userId
2)发送验证码功能
时序图
前后端交互接口
请求
url: '/verifyCode/send',
type: 'POST',
data: {"phoneNumber": "xxx"}
响应
"code": 200,
"data": true,
"msg": ""
后端实现
首先校验手机号格式是否正确,若正确则通过 CaptchaUtil 类生成随机验证码,并使用 SMSUtil 类的方法发送验证码,并将验证码缓存在 Redis 中,最后构造响应并返回;
3)登录功能
时序图