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

embedded/2025/2/27 6:55:47/

目录

项目介绍

页面预览

需求分析

管理员登录注册

人员模块

奖品模块

活动模块

抽奖模块

系统设计

系统架构

项目环境

数据库设计

安全设计


完整代码:项目完整代码/在线抽奖系统/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 等

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

-- 设置客户端与服务器之间的字符集为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 进行用户身份验证,强制用户在某些页面必须进行登录操作

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


http://www.ppmy.cn/embedded/167474.html

相关文章

深度学习笔记数学方面——矩阵计算,自动求导

坚持每天打卡学习深度学习,今天学了数学部分。 1.列向量的导数是横向量 2 分子布局符号 分母布局符号对于分子布局和分母布局的结果来说,两者相差一个转置。 3.一些求导公式,加粗为向量 4.自动求导,计算一个函数在指定值上的导…

使用 Python 实现声纹和声音识别并集成到会议记录程序中

要使用 Python 实现声纹和声音识别并集成到会议记录程序中,可以按照以下步骤进行: 1. 安装必要的库 需要安装一些 Python 库,如 SpeechRecognition 用于语音识别,pyAudio 用于音频输入,resemblyzer 用于声纹识别。可…

【论文笔记】ClipSAM: CLIP and SAM collaboration for zero-shot anomaly segmentation

原文链接 摘要 近年来,CLIP 和 SAM 等基础模型在零样本异常分割 (ZSAS) 任务中展现出良好的性能。然而,无论是基于 CLIP 还是基于 SAM 的 ZSAS 方法,仍然存在不可忽视的关键缺陷:1) CLIP 主要关注不同输入之间的全局特征对齐&am…

AI手机的技术细节

前序:先说各个功能涉及到的技术,再说宏观系统架构。AI手机有这样几个做法,给手机侧边增加一个按键;把手机的语音助手做的很好,能够快速稳定的进行唤醒;通过特殊形式的触摸手机的曲面屏位置等来进行唤醒AI …

用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解

DeepSeek R1 的完整训练流程核心在于,在其基础模型 DeepSeek V3 之上,运用了多种强化学习策略。 本文将从一个可本地运行的基础模型起步,并参照其技术报告,完全从零开始构建 DeepSeek R1,理论结合实践,逐步…

清华大学DeepSeek赋能职场教程下载,清华大学DeepSeek文档下载(完成版下载)

文章目录 一、清华大学DeepSeek赋能职场教程下载二、DeepSeek的三种模式三、DeepSeek两种模型的对比四、DeepSeek两种模型的提示语差异:五、DeepSeek的应用场景: 一、清华大学DeepSeek赋能职场教程下载 该文档是清华大学DeepSeek在职场应用中的赋能展开,涵盖团队背…

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

ChatGPT入驻Safari,AI搜索时代加速到来

2月25日,人工智能领域巨头OpenAI宣布了一项重磅更新:为其广受欢迎的ChatGPT应用新增Safari浏览器扩展功能,并支持用户将ChatGPT设置为Safari地址栏的默认搜索引擎。这一举措标志着OpenAI在将ChatGPT整合进用户日常网络浏览体验方面迈出了重要…