在线抽奖系统——项目介绍

目录

项目介绍

页面预览

需求分析

管理员登录注册

人员模块

奖品模块

活动模块

抽奖模块

系统设计

系统架构

项目环境

数据库设计

安全设计


完整代码项目完整代码/在线抽奖系统/lottery-system · Echo/project - 码云 - 开源中国

项目介绍

利用 MySQL、Redis、RabbitMQ 等常用组件,构建一个功能全面、操作容易、安全可靠的抽奖平台:

人员、奖品和活动管理:允许管理员管理人员信息、奖品信息 和 活动信息

安全性保证:实施安全措施,包括数据加密、用户身份验证,保护用户数据和系统安全

抽奖公平性保证: 在进行抽奖时,使用获奖者不重复中奖机制,确保抽奖的公平性

数据一致性保证:通过事务管理和数据同步机制,确保数据的一致性和完整性

提高扩展性:采用模块化设计并使用合适的设计模式,提高系统的灵活性和可扩展性

降低维护成本:提供全面的日志记录和异常处理机制,简化问题诊断和系统维护

页面预览

管理员注册:

密码登录:

验证码登录:

活动中心:

人员管理:

人员列表:

普通用户注册:

奖品管理:

奖品列表:

奖品创建:

活动管理:

活动列表:

活动创建:

圈选人员:

圈选奖品:

抽奖:

点击开始抽奖(闪动人名):

点击确定:

抽奖完成:

点击分享结果

中奖通知:

需求分析

整个项目主要分为以下模块:

  1. 管理员登录注册

  2. 人员模块

  3. 奖品模块

  4. 活动模块

  5. 抽奖模块

管理员登录注册

包含管理员的注册登录

注册内容:姓名、邮箱、手机号、密码

登录

  1. 密码登录:手机号/邮箱 + 密码

  2. 验证码登录:手机号 + 验证码

人员模块

包含人员列表普通用户注册

人员列表:人员 id、姓名、身份信息(普通用户/管理员)

普通用户注册:姓名、邮箱、手机号

奖品模块

奖品列表:奖品id、奖品图、奖品名称、奖品描述、奖品价格,列表支持翻页

奖品创建:奖品名称、奖品描述、奖品价格、奖品图片(上传图片文件)

活动模块

活动列表 :活动名称、活动描述、活动状态(若活动状态为进行中 ,显示"活动进行中,去抽奖",点击可跳转到抽奖页面进行抽奖;若活动状态为已完成,显示"活动已完成,查看中奖名单",点击可跳转到抽奖结果页查看中奖结果),活动列表支持翻页

活动创建:活动名称、活动描述、圈选奖品(勾选活动奖品,设置奖品等级 和 奖品数量)、圈选人员(勾选参与抽奖人员),圈选的人员数量需大于等于圈选的奖品总数量

抽奖模块

未完成的活动:只有管理员才能进行抽奖,包含多轮抽奖,每轮包含以下环节:

  1. 展示奖品图(奖品图片、奖品数量)

  2. 点击 "开始抽奖" 按钮,闪动参与抽奖人员姓名

  3. 点击 "点我确定",展示抽奖名单

  4. 点击 "已抽完,下一步",若还有奖品未抽取,展示下一个奖品信息;若奖品已抽完,则展示全部中奖名单

  5. 点击 "查看上一奖项",展示上一奖品信息

每轮抽奖的中奖人数要与当轮奖品数量匹配,且每个人只能中奖一次

若抽奖过程中出现异常情况,如抽奖过程中刷新页面,需保证抽取成功的奖项不能重新抽取,即,若当前奖品已抽完,刷新页面后,点击 "开始抽奖",直接展示当前奖品中奖名单

抽奖完成后点,新增 "分享结果" 按钮,点击可复制当前页链接

已完成活动:展示活动名称、中奖结果以及 "分享结果" 按钮

抽奖完成后,需以邮件方式通知中奖者中奖结果

此外,管理端涉及的所有活动页面(除管理员登录和注册页面外),都需要管理员登录后才可访问,若未登录就进行访问,则会强制跳转至登录页面

系统设计

系统架构

前端:使用 JavaScript 管理用户界面的动态性,提供流畅的用户体验,使用 AJAX 技术技术从后端 API 获取数据

后端:使用 Spring Boot 构建后端应用,实现业务逻辑

数据库:使用 MySQL 作为主数据库,存储用户数据和抽奖活动相关信息

缓存:使用 Redis 作为缓存,减少数据库访问次数,提高响应速度

消息队列:使用 RabbitMQ 处理异步任务

日志和安全:使用 SLF4J + logback 记录日志,使用 JWT 进行用户身份认证

项目环境

编程语言:HTML+CSS+JavaScript(前端),Java(后端)

开发工具包:JDK 17

后端框架:Spring Boot

数据库:MySQL

缓存:Redis

消息队列:RabbitMQ

日志:logback

安全:JWT + 密码算法加密

数据库设计

用户表:存储用户信息,如用户名、手机号、密码、邮箱等

奖品表:存储奖品信息,如奖品名称、奖品图片等

活动表:存储活动信息,如活动名称、活动描述、活动状态等

活动奖品关联表:存储一个活动下关联了哪些奖品,如活动 id、奖品 id、奖品数量等

活动用户关联表:存储一个活动下关联了哪些人员,如活动 id、人员 id、人员姓名等

中奖记录表:存储活动的中奖名单,如活动 id、奖品 id、中奖人员 id等

异常消息表:存储处理异常的 RabbitMQ 消息,如 消息 id、活动 id、奖品 id 等

创建对应数据库和数据表:

sql 复制代码
-- 设置客户端与服务器之间的字符集为utf8mb4,这个字符集可以存储任何Unicode字符。
SET NAMES utf8mb4;
-- 关闭外键约束检查,这通常在创建或修改表结构时使用,以避免由于外键约束而导致的创建失败。
SET FOREIGN_KEY_CHECKS = 0;

drop database IF EXISTS `lottery_system`;
create DATABASE `lottery_system` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE `lottery_system`;

-- ----------------------------
-- Table structure for activity
-- ----------------------------
drop table IF EXISTS `activity`;
create TABLE `activity`  (
                             `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                             `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                             `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                             `activity_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '活动名称',
                             `description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '活动描述',
                             `status` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '活动状态',
                             PRIMARY KEY (`id`) USING BTREE,
                             UNIQUE INDEX `uk_id`(`id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 24 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;
-- ENGINE = InnoDB:指定表的存储引擎为InnoDB,这是MySQL的默认存储引擎,支持事务、外键等特性。
-- AUTO_INCREMENT = 24:为自动增长的ID字段设置起始值。
-- ROW_FORMAT = DYNAMIC:设置行的存储格式为动态,允许行随着数据的变化而变化。

-- ----------------------------
-- Table structure for activity_prize
-- ----------------------------
drop table IF EXISTS `activity_prize`;
create TABLE `activity_prize`  (
                                   `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                                   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                                   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                                   `activity_id` bigint NOT NULL comment '活动id',
                                   `prize_id` bigint NOT NULL comment '活动关联的奖品id',
                                   `prize_amount` bigint NOT NULL DEFAULT 1 comment '关联奖品的数量',
                                   `prize_tiers` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '奖品等级',
                                   `status` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '活动奖品状态',
                                   PRIMARY KEY (`id`) USING BTREE,
                                   UNIQUE INDEX `uk_id`(`id` ASC) USING BTREE,
                                   UNIQUE INDEX `uk_a_p_id`(`activity_id` ASC, `prize_id` ASC) USING BTREE,
                                   INDEX `idx_activity_id`(`activity_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Table structure for activity_user
-- ----------------------------
drop table IF EXISTS `activity_user`;
create TABLE `activity_user`  (
                                  `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                                  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                                  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                                  `activity_id` bigint NOT NULL comment '活动时间',
                                  `user_id` bigint NOT NULL comment '圈选的用户id',
                                  `user_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '用户名',
                                  `status` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '用户状态',
                                  PRIMARY KEY (`id`) USING BTREE,
                                  UNIQUE INDEX `uk_id`(`id` ASC) USING BTREE,
                                  UNIQUE INDEX `uk_a_u_id`(`activity_id` ASC, `user_id` ASC) USING BTREE,
                                  INDEX `idx_activity_id`(`activity_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Table structure for prize
-- ----------------------------
drop table IF EXISTS `prize`;
create TABLE `prize`  (
                          `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                          `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                          `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                          `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '奖品名称',
                          `description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL comment '奖品描述',
                          `price` decimal(10, 2) NOT NULL comment '奖品价值',
                          `image_url` varchar(2048) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL comment '奖品展示图',
                          PRIMARY KEY (`id`) USING BTREE,
                          UNIQUE INDEX `uk_id`(`id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Table structure for user
-- ----------------------------
drop table IF EXISTS `user`;
create TABLE `user`  (
                         `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                         `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                         `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                         `user_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '用户姓名',
                         `email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '邮箱',
                         `phone_number` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '手机号',
                         `password` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL comment '登录密码',
                         `identity` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '用户身份',
                         PRIMARY KEY (`id`) USING BTREE,
                         UNIQUE INDEX `uk_id`(`id` ASC) USING BTREE,
                         UNIQUE INDEX `uk_email`(`email`(30) ASC) USING BTREE,
                         UNIQUE INDEX `uk_phone_number`(`phone_number`(11) ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 39 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Table structure for winning_record
-- ----------------------------
drop table IF EXISTS `winning_record`;
create TABLE `winning_record`  (
                                   `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                                   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                                   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                                   `activity_id` bigint NOT NULL comment '活动id',
                                   `activity_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '活动名称',
                                   `prize_id` bigint NOT NULL comment '奖品id',
                                   `prize_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '奖品名称',
                                   `prize_tier` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '奖品等级',
                                   `winner_id` bigint NOT NULL comment '中奖人id',
                                   `winner_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '中奖人姓名',
                                   `winner_email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '中奖人邮箱',
                                   `winner_phone_number` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '中奖人电话',
                                   `winning_time` datetime NOT NULL comment '中奖时间',
                                   PRIMARY KEY (`id`) USING BTREE,
                                   UNIQUE INDEX `uk_id`(`id` ASC) USING BTREE,
                                   UNIQUE INDEX `uk_w_a_p_id`(`winner_id` ASC, `activity_id` ASC, `prize_id` ASC) USING BTREE,
                                   INDEX `idx_activity_id`(`activity_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 69 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;


-- ----------------------------
-- Table structure for error_message
-- ----------------------------
drop table IF EXISTS `error_message`;
create TABLE `error_message`(
                                `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT comment '主键',
                                `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
                                `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP comment '更新时间',
                                `message_id` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '消息id',
                                `processed` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '异常数据是否已被处理',
                                `activity_id` bigint NOT NULL comment '活动id',
                                `prize_id` bigint NOT NULL comment '奖品id',
                                `winner_id` bigint NOT NULL comment '获奖人员id',
                                `winner_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL comment '获奖者姓名',
                                `winning_time` datetime NOT NULL comment '中奖时间',
                                PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;

-- SET FOREIGN_KEY_CHECKS = 1;:在脚本的最后,重新开启外键约束检查。
SET FOREIGN_KEY_CHECKS = 1;

使用 source命令导入上述 .sql 文件,查看导入是否成功:

安全设计

用户登录身份验证:使用 JWT 进行用户身份验证,强制用户在某些页面必须进行登录操作

加密:对敏感数据进行加密,如手机号、用户密码等敏感信息数据落库需要进行加密

相关推荐
陈卓41012 分钟前
MySQL-主从复制&分库分表
android·mysql·adb
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
RainbowSea1 小时前
问题:后端由于字符内容过长,前端展示精度丢失修复
java·spring boot·后端
C182981825751 小时前
OOM电商系统订单缓存泄漏,这是泄漏还是溢出
java·spring·缓存
风象南2 小时前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
长征coder2 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
我是一只代码狗2 小时前
springboot中使用线程池
java·spring boot·后端
ladymorgana2 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
hello早上好2 小时前
JDK 代理原理
java·spring boot·spring
PanZonghui2 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql