一、项目简介

业务范围:该系统主要为公司活动(如年会等)提供在线抽奖功能,满足奖品、抽奖人员的管理,及抽奖活动的需要.
开发环境与技术栈:Windows、Maven、Lombok、Spring、SpringMVC、SpringBoot MySQL、Mybatis、Druid.
主要功能:用户注册、用户登录、奖项设置(增删改查)、抽奖人员设置(增删改查)、抽奖、删除获奖人员.

二、数据库设计

分析具体业务后数据库表设计如下

drop database if exists lucky_draw;
create database lucky_draw character set utf8mb4;use lucky_draw;drop table if exists user;
create table user(id int primary key auto_increment,username varchar(20) not null unique comment '用户账号',password varchar(20) not null comment '密码',nickname varchar(20) comment '用户昵称',email varchar(50) comment '邮箱',age int comment '年龄',head varchar(255) comment '头像url',create_time timestamp default NOW() comment '创建时间'
) comment '用户表';drop table if exists setting;
create table setting(id int primary key auto_increment,user_id int not null comment '用户id',batch_number int not null comment '每次抽奖人数',create_time timestamp default NOW() comment '创建时间',foreign key (user_id) references user(id)
) comment '抽奖设置';drop table if exists award;
create table award(id int primary key auto_increment,name varchar(20) not null comment '奖项名称',count int not null comment '奖项人数',award varchar(20) not null comment '奖品',setting_id int not null comment '抽奖设置id',create_time timestamp default NOW() comment '创建时间',foreign key (setting_id) references setting(id)
) comment '奖项';drop table if exists member;
create table member(id int primary key auto_increment,name varchar(20) not null comment '姓名',no varchar(20) not null comment '工号',setting_id int not null comment '抽奖设置id',create_time timestamp default NOW() comment '创建时间',foreign key (setting_id) references setting(id)
) comment '抽奖人员';drop table if exists record;
create table record(id int primary key auto_increment,member_id int not null comment '中奖人员id',award_id int not null comment '中奖奖项id',create_time timestamp default NOW() comment '创建时间',foreign key (member_id) references member(id),foreign key (award_id) references award(id)
) comment '中奖记录';

三、后端实现

五段代码只包含五个实体类从controller层到service层的调用
完整项目代码链接:Github

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Object register(User user, MultipartFile headFile){//保存上传的用户头像到服务端本地if(headFile != null) {String head = userService.saveHead(headFile);//上传的路径映射为http服务路径//用户头像的http路径设置到user.head,把user插入数据库user.setHead(head);}userService.register(user);return null;}@PostMapping("/login")public Object login(@RequestBody User user, HttpServletRequest req){//username, password//根据账号查用户User exist = userService.queryByUsername(user.getUsername());//用户不存在if(exist == null) throw new AppException("LOG001", "用户不存在");//用户存在,校验密码if(!user.getPassword().equals(exist.getPassword()))throw new AppException("LOG002", "账号或密码错误");//校验通过,保存数据库的用户(包含所有字段)到sessionHttpSession session = req.getSession();//先创建sessionsession.setAttribute("user", exist);return null;//登录成功}@GetMapping("/logout")public Object logout(HttpSession session){session.removeAttribute("user");return null;}
}@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate SettingMapper settingMapper;private static final DateFormat DF = new SimpleDateFormat("yyyyMMdd");@Value("${user.head.local-path}")private String headLocalPath;@Value("${user.head.remote-path}")private String headRemotePath;public String saveHead(MultipartFile headFile) {//保存在本地路径//文件夹为当天:文件路径的间隔符和操作系统相关,可以使用File.separator,但是java也会根据操作系统自行设置Date now = new Date();String dirUri = "/"+DF.format(now);//20210203File dir = new File(headLocalPath+dirUri);if(!dir.exists()) dir.mkdirs();//保存在本地以天为单位的文件夹,保证文件唯一:随机字符串作为文件名,但是后缀还需要保留String suffix = headFile.getOriginalFilename().substring(headFile.getOriginalFilename().lastIndexOf("."));String headName = UUID.randomUUID().toString()+suffix;String uri = dirUri+"/"+headName;try {headFile.transferTo(new File(headLocalPath+uri));} catch (IOException e) {throw new AppException("REG001", "上传用户头像出错");}return headRemotePath+uri;}//事务处理:多个更新必须,有部分查询+更新有时候也需要//内部实现:aop,方法前加入开启事务逻辑,方法执行后,抛异常rollback,没有异常commit//禁止使用try catch吃异常@Transactional//可以手动指定隔离级别和传播特性public void register(User user) {//数据库校验:校验用户名不能重复,省略,自行扩展//插入user数据:插入后自增主键会按照useGeneratedKeys=true设置到对象属性int n = userMapper.insertSelective(user);//插入setting数据:登录后,进入设置页面,添加奖项和抽奖人员,需要setting_idSetting setting = new Setting();setting.setUserId(user.getId());setting.setBatchNumber(8);//每次抽奖的数量:设置一个默认值(业务决定)settingMapper.insertSelective(setting);}public User queryByUsername(String username) {return userMapper.selectByUsername(username);}
}
@RestController
@RequestMapping("/setting")
public class SettingController {@Autowiredprivate SettingService settingService;@Autowiredprivate AwardService awardService;@Autowiredprivate MemberService memberService;/*** 进入抽奖设置页面,初始化的接口,返回页面所有需要的数据:* setting对象中的属性:batchNumber* setting对象目前没有的属性:* (1)user(用户信息)* (2)awards(奖项列表:根据setting_id查)* (3)members(抽奖人员列表:根据setting_id查)*/@GetMapping("/query")public Object query(HttpSession session){//已经登录,所以可以直接使用HttpSession//获取session中的userUser user = (User) session.getAttribute("user");//根据userid查setting信息Setting setting = settingService.queryByUserId(user.getId());//把user设置到setting新增属性user中setting.setUser(user);//根据setting_id查award列表,设置到setting新增属性awards中List<Award> awards = awardService.queryBySettingId(setting.getId());setting.setAwards(awards);//根据setting_id查member列表,设置到setting新增属性members中List<Member> members = memberService.queryBySettingId(setting.getId());setting.setMembers(members);return setting;}@GetMapping("/update")public Object update(Integer batchNumber, HttpSession session){User user = (User) session.getAttribute("user");int n = settingService.update(batchNumber, user.getId());return null;}
}@Service
public class SettingService {@Autowiredprivate SettingMapper settingMapper;public Setting queryByUserId(Integer id) {return settingMapper.selectByUserId(id);}public int update(Integer batchNumber, Integer userId) {return settingMapper.update(batchNumber, userId);}
}
@RestController
@RequestMapping("/award")
public class AwardController {@Autowiredprivate AwardService awardService;@PostMapping("/add")public Object add(@RequestBody Award award, HttpSession session){User user = (User) session.getAttribute("user");int n = awardService.add(award, user.getId());return award.getId();//插入后,返回给前端自增主键id}@PostMapping("/update")public Object update(@RequestBody Award award){int n = awardService.update(award);return null;}@GetMapping("/delete/{id}")public Object delete(@PathVariable Integer id){int n = awardService.delete(id);return null;}
}@Service
public class AwardService {@Autowiredprivate AwardMapper awardMapper;@Autowiredprivate SettingMapper settingMapper;public List<Award> queryBySettingId(Integer id) {return awardMapper.selectBySettingId(id);}public int add(Award award, Integer userId) {//通过userId找settingId: 可以调用已有的selectByUserIdInteger settingId = settingMapper.queryIdByUserId(userId);//设置award中settingId属性award.setSettingId(settingId);//插入一条award数据/对象return awardMapper.insertSelective(award);}public int update(Award award) {return awardMapper.updateByPrimaryKeySelective(award);}public int delete(Integer id) {return awardMapper.deleteByPrimaryKey(id);}
}
@RestController
@RequestMapping("/member")
public class MemberController {@Autowiredprivate MemberService memberService;@PostMapping("/add")public Object add(@RequestBody Member member, HttpSession session){User user = (User) session.getAttribute("user");int n = memberService.add(member, user.getId());return member.getId();}@PostMapping("/update")public Object update(@RequestBody Member member){int n = memberService.update(member);return null;}@GetMapping("/delete/{id}")public Object delete(@PathVariable Integer id){int n = memberService.delete(id);return null;}
}@Service
public class MemberService {@Autowiredprivate MemberMapper memberMapper;@Autowiredprivate SettingMapper settingMapper;public List<Member> queryBySettingId(Integer id) {return memberMapper.selectBySettingId(id);}public int add(Member member, Integer userId) {Integer settingId = settingMapper.queryIdByUserId(userId);member.setSettingId(settingId);return memberMapper.insertSelective(member);}public int update(Member member) {return memberMapper.updateByPrimaryKeySelective(member);}public int delete(Integer id) {return memberMapper.deleteByPrimaryKey(id);}
}
@RestController
@RequestMapping("/record")
public class RecordController {@Autowiredprivate RecordService recordService;//抽奖:某个奖项下抽奖,一次抽多个人(插入多条抽奖记录)@PostMapping("/add/{awardId}")public Object add(@RequestBody List<Integer> memberIds, @PathVariable Integer awardId){int n = recordService.add(memberIds, awardId);return null;}@GetMapping("/delete/member")public Object deleteByMemberId(Integer id){int n = recordService.deleteByMemberId(id);return null;}@GetMapping("/delete/award")public Object deleteByAwardId(Integer id){int n = recordService.deleteByAwardId(id);return null;}@GetMapping("/delete/setting")public Object deleteBySetting(HttpSession session){User user = (User) session.getAttribute("user");//获取userid--->关联setting_id---->关联member_id, award_id//--->删除关联recordint n = recordService.deleteByUserId(user.getId());return null;}
}@Service
public class RecordService {@Autowiredprivate RecordMapper recordMapper;//批量插入抽奖记录public int add(List<Integer> memberIds, Integer awardId) {return recordMapper.batchInsert(memberIds, awardId);}public int deleteByMemberId(Integer memberId) {return recordMapper.deleteByMemberId(memberId);}public int deleteByAwardId(Integer id) {return recordMapper.deleteByAwardId(id);}public int deleteByUserId(Integer id) {return recordMapper.deleteByUserId(id);}
}

四、项目运行结果

注册界面

登陆界面

抽奖设置

人员设置

抽奖界面

基于SpringBoot的抽奖系统相关推荐

  1. KS001 基于Springboot机票预订系统

    基于Springboot机票预订系统 本项目基于Springboot框架构建,使用SpringMvc和Mybatis框架进行相应的开发,数据库采用mysql,前端页面采用html实现,基于Jquery ...

  2. 抽奖功能java开发_基于Java实现抽奖系统

    摘要:这篇Java开发技术栏目下的"基于Java实现抽奖系统",介绍的技术点是"抽奖系统.Java.抽奖.基于.系统.实现",希望对大家开发技术学习和问题解决有 ...

  3. java 抽奖系统源码_基于jsp的抽奖系统-JavaEE实现抽奖系统 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的抽奖系统, 该项目可用各类java课程设计大作业中, 抽奖系统的系统架构分为前后台两部分, 最终实现在线上进行抽奖 ...

  4. 基于springboot小型命题系统毕业设计源码011508

    基于springboot小型命题系统  摘  要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于小型命题系统当然也不能排除在外,随着网络技术的不断成熟,带 ...

  5. 基于springboot电影购票系统(源代码+数据库)012

    部分代码地址 https://gitee.com/ynwynwy/Movie-Ticket-Purchasing-public 基于springboot电影购票系统(源代码+数据库) 一.系统介绍 前 ...

  6. 基于springboot地方旅游系统的设计与实现

    摘    要 本次设计内容是基于Springboot的旅游系统的设计与实现,采用B/S三层架构分别是Web表现层.Service业务层.Dao数据访问层,并使用Springboot,MyBatis二大 ...

  7. 基于SpringBOOT的订餐系统

    1,项目功能: 卖家端: (1)商品管理:卖家可以在该模块下进行商品信息添加,商品信息查看,商品信息修改以及商品商品信息删除等功能. (2)订单管理:卖家可以查看订单信息,并对订单信息进行确认,同时也 ...

  8. 基于springBoot的记账系统

    开发环境 idea+mysql8.0+jdk1.8 系统简介 本系统实现一个记账系统,用户登录系统以后,可以对自己的支出,收入,借入,借出账单进行管理,具体功能可看演示视频! 演示视频 基于sprin ...

  9. 基于springboot题库管理系统的设计与实现

    目前,许多高校绝大多数课程还采用考教统一的模式来完成教学过程,这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性.另外随着各高校近年来学生规模的扩大,教学任务日益繁重,教师的工作量 ...

  10. 基于SpringBoot的ERP系统,自带进销存+财务+生产功能

    今日推荐 推荐一款开源 Java 版的视频管理系统 基于 Springboot 2.0 + LayUI 开发的物流管理系统 14个项目 作者 | 季圣华 整理 | 我是程序汪 华夏ERP基于Sprin ...

最新文章

  1. linux syn 队列,linux 防御SYN攻击
  2. 通过zabbix自动发现Tomcat服务端口
  3. PMP-【第1章 引论】-2020-12-29(25页-34页)
  4. 读书笔记:黑客与画家
  5. HighCharts报表 API
  6. 机器学习之基于A*搜索解决八数码问题15数码问题
  7. Python查找包含指定字符串的所有Office文档
  8. vim设置Tab为空格
  9. 从os.cpus()来分析nodejs源码结构
  10. 34个省域统计年鉴合集(32省更新至2020年)
  11. 支付宝小程序导航栏背景颜色全部更换和单个更换
  12. php短信验证码随机数_深入解读PHP短信验证码原理
  13. 【吐槽】Android 第一步,雀氏纸尿裤
  14. Acwing-873. 欧拉函数
  15. 解决IE浏览器无法删除证书的问题
  16. mac M1 安装navicat亲测有效
  17. 十年测试老鸟聊聊移动端兼容性测试
  18. 【JAVA_POI】解析PPT文档(ppt和pptx)4.1.2版本
  19. guest用户计算机管理中没有,guest账户开启与关闭
  20. Jmeter 入门 从0-1 基础篇-实操

热门文章

  1. conky - linux desktop 漂亮的桌面系统资源使用监控软件
  2. 信安软考 第十四章 恶意代码防范技术原理
  3. 探索第二个合数世纪C语言,第一单元 探索计算机的奥秘
  4. 利用IE登陆windows 2003 的终端服务器
  5. 推荐几个资源搜索网站
  6. 金蝶K3系统的网络服务端口
  7. C程序设计汇编试题(第三版 )谭浩强主编 第三章 选择题
  8. HTML5 视频、图片截图实例
  9. linux下声卡配置文件,Linux设备配置之声卡配置
  10. ActionForm的详解