java抽奖系统(一)

server/2024/11/25 12:05:58/

 1. 项⽬介绍

1.1 背景

        随着数字营销的兴起,企业越来越重视通过在线活动来吸引和留住客⼾。抽奖活动作为⼀种有效的营 销⼿段,能够显著提升⽤⼾参与度和品牌曝光率。于是我们就开发了以抽奖活动作为背景的Spring Boot项⽬,通过这个项⽬提供⼀个全⾯、可靠、易于维护的抽奖平台,该平台将采⽤以下策略:

         集成多种技术组件:利⽤MySQL、Redis、RabbitMQ等常⽤组件,构建⼀个稳定、⾼效、可扩展 的抽奖系统。

        活动、奖品与⼈员管理:允许管理员创建配置抽奖活动;管理奖品信息;管理⼈员信息。

         实现状态机管理:通过精⼼设计的状态机,精确控制活动及奖品状态的转换,提⾼系统的可控性和 可预测性。

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

        加强安全性:实施安全措施,包括数据加密、⽤⼾认证,保护⽤⼾数据和系统安全。

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

         提⾼扩展性:采⽤模块化设计与设计模式的使⽤,提⾼系统的灵活性和扩展性。

1.2 需求描述

        1. 包含管理员的注册与登录。

        a. 注册包含:姓名、邮箱、⼿机号、密码

        b. 登录包含两种⽅式:

                 i. 电话+密码登录;

                ii. 电话+短信登录; 验证码获取

                iii. 登录需要校验管理员⾝份。

        2. ⼈员管理:管理员⽀持创建普通⽤⼾,查看⽤⼾列表

                a. 创建普通⽤⼾:姓名,邮箱,⼿机号

                b. ⼈员列表:⼈员id、姓名、⾝份(普通⽤⼾、管理员)

        3. 管理端⽀持创建奖品、奖品列表展⽰功能。

                a. 创建的奖品信息包含:奖品名称、描述、价格、奖品图(上传)

                 b. 奖品列表展⽰(可翻⻚):奖品id、奖品图、奖品名、奖品描述、奖品价值(元)

        4. 管理端⽀持创建活动、活动列表展⽰功能。

                 a. 创建的活动信息包含:

                        i. 活动名称

                        ii. 活动描述

                        iii. 圈选奖品:勾选对应奖品,并设置奖品等级(⼀⼆三等奖),及奖品数量

                        iv. 圈选⼈员:勾选参与抽奖⼈员

                b. 活动列表展⽰(可翻⻚):

                         i. 活动名称

                         ii. 描述 

                        iii. 活动状态:

                                1. 活动状态为进⾏中:点击"活动进⾏中,去抽奖"按钮跳转抽奖⻚

                                2. 活动状态为已完成:点击"活动已完成,查看中奖名单"按钮跳转抽奖⻚查看结果

        5. 抽奖⻚⾯:

                a. 对于进⾏中的活动,管理员才可抽奖。

                b. 每轮抽奖的中奖⼈数跟随当前奖品数量。

                c. 每个⼈只能中⼀次奖

                d. 多轮抽奖,每轮抽奖有3个环节:展⽰奖品信息(奖品图、份数),⼈名闪动,停⽌闪动确定中 奖名单

                        i. 当前⻚展⽰奖品信息,点击‘开始抽奖’按钮,则跳转⾄⼈名闪动画⾯

                        ii. ⼈员闪动画⾯,点击’点我确定‘按钮,确认中奖名单。

                        iii. 当前⻚展⽰中奖名单,点击‘已抽完,下⼀步’按钮,若还有奖品未抽取,则展⽰下⼀个奖品 信息,否则展⽰全部中奖名单

                        iv. 点击’查看上⼀奖项‘按钮,展⽰上⼀个奖品信息

                e. 对于抽奖过程中的异常情况,如抽奖过程中刷新⻚⾯,要保证抽取成功的奖项不能重新抽取。

                        i. 刷新⻚⾯后,若当前奖品已抽完,点击"开始抽奖",则直接展⽰当前奖品中奖名单 f. 如该抽奖活动已完成:

                        ii. 展⽰所有奖项的全部中奖名单

                        iii. 新增"分享结果"按钮,点击可复制当前⻚链接,打开后隐藏其他按钮,只展⽰活动名称与中奖 结果,保留"分享结果"按钮

        6. 通知部分:抽奖完成需以邮件和短信⽅式通知中奖者。

                a. “Hi,xxx。恭喜你在xxx抽奖中获得⼀等奖:⼿机。中奖时间为:xx:xx。请尽快领取您的奖 品。”

        7. 管理端涉及的所有⻚⾯,包括抽奖⻚,需强制管理员登录后⽅可访问。

                a. 未登录强制跳转登录⻚⾯

1.3 系统架构

前端:使⽤JavaScript管理各界⾯的动态性,使⽤AJAX技术从后端API获取数据。  

后端:采⽤SpringBoot3构建后端应⽤,实现业务逻辑。

数据库:使⽤MySQL作为主数据库,存储⽤⼾数据和活动信息。

缓存:使⽤Redis作为缓存层,减少数据库访问次数。

消息队列:使⽤RabbitMQ处理异步任务,如处理抽奖⾏为。

⽇志与安全:使⽤JWT进⾏⽤⼾认证,使⽤SLF4J+logback完成⽇志。 

1.4 项⽬环境

         编程语⾔:Java(后端),JavaScript(前端)。

        开发⼯具包:JDK17 (⻅《JDK17安装》⽂档)

        后端框架:SpringBoot3。

         数据库:MySQL。

        缓存:Redis。

         消息队列:RabbitMQ。

         ⽇志:logback。

         安全:JWT+加密。 

1.5 业务功能模块

⼈员业务模块:管理员注册、登录,及普通⽤⼾的创建。

活动业务模块:活动管理及活动状态管理。

 奖品业务模块:奖品管理与奖品的分配。还包括奖品图的上传。

 通知业务模块:发送短信、邮件等业务,例如验证码发送,中奖通知。

 抽奖业务模块:完成抽奖动作,以及抽奖后的结果展⽰;

1.6 数据库设计

 ⽤⼾表:存储⽤⼾信息,如⽤⼾名、密码、邮箱等。

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

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

活动奖品关联表:存储⼀个活动下关联了哪些奖品。

活动⽤⼾关联表:存储⼀个活动下设置的参与⼈员。

中奖记录表:存储⼀个活动的中奖名单,如活动id,奖品id,中奖者id等 

2.  数据库设计

2.1 表的关联图

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;-- SET FOREIGN_KEY_CHECKS = 1;:在脚本的最后,重新开启外键约束检查。
SET FOREIGN_KEY_CHECKS = 1;

 2.2 使⽤source命令导⼊.sql⽂件

注意:使用的sql文件的绝对路径且在路径中不能有中文;

mysql> source E:\java_xiangmu\lottery_system\lottery_system.sql

结果如下:指令执行成功;

ps:未完待续


http://www.ppmy.cn/server/144791.html

相关文章

mysql约束和高级sql

约束 MySQL中的约束用于定义表中数据的规则,以确保数据的准确性和可靠性。以下是MySQL中常用的一些约束类型及其概述: PRIMARY KEY(主键):唯一标识表中每条记录的字段或字段组合,一个表中只能有一个主键。…

第2.3 AI文本—prompt入门

AIGC(生成式人工智能)对我们教师工作帮助是非常大的。我们教师要充分认识AIGC技术在辅助教学工作、行政工作、个人晋升成长、日常工作的重要性,并能熟练掌握国内主流的AIGC工具,最终达成教学工作提质增效目的。 辅助教学工作&…

PCA算法所体现的核心数学思维

一、PCA算法的基本思想 PCA算法的核心思想是通过线性变换,将数据从原始的高维空间投影到低维空间,同时尽可能保留数据的主要变异性。这种变换是通过找到一组新的坐标轴(即主成分)来实现的,这些坐标轴是原始数据空间的…

深入解析信号量:定义与环形队列生产消费模型剖析

一、定义 信号量,从本质上来说,它是一种特殊的计数器。其核心作用在于对临界资源中资源数量进行精确的描述与把控。以电影院为例,观众们会竞相选择不同的座位,而这些座位作为共享资源,被拆分成了多个独立的部分。只…

以太坊Beam Chain;后量子聚合签名;

目录 以太坊Beam Chain 愿景 技术层构建 区块生产: 质押: 密码学: 后量子聚合签名 后量子聚合签名简介 使用哈希函数实现后量子聚合签名 简单举例说明 优势 以太坊Beam Chain 提议是对以太坊共识层的一次大规模重新设计,旨在实现以太坊的长期愿景和技术目标。以…

moduo之线程池ThreadPool

简介 moduo实现了通用业务线程池,其任务使用无参的函数对象,其任务队列使用的是有界的队列 结构 #mermaid-svg-1tUORFhOtpA7H0hc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1tUORFhOtp…

yolo算法详解

作为一名计算机专业的专家,我对YOLO(You Only Look Once)算法有着深入的了解。以下是对YOLO的详细介绍: 一、基本概念YOLO是一种流行的目标检测算法,它基于卷积神经网络(CNN)进行目标检测任务。与传统的目标检测算法(如R-CNN系列)不同,YOLO的核心思想是将目标检测问题…

Figma入门-基本操作制作登录页

Figma入门-基本操作制作登录页 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的&am…