基于SpringBoot+Vue实现剧本杀服务平台【源码+LW+PPT+部署】

 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业讲师以及同行交流合作

主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等

业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-XX-317

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:SpringBoot+Vue

二,项目简介

随着互联网趋势的到来,在不少95后00后的眼里,“剧本杀”已经成为“Z世代”们交友聚会的新潮流。当前,年轻人休闲娱乐较为依赖线上的形式,而剧本杀也打开了线上社交市场,加上用户付费意愿较高,市场发展前景可期。因此在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设剧本杀服务平台。

本设计主要实现集人性化、高效率、便捷等优点于一身的剧本杀服务平台,完成公告消息管理、剧本资讯、、系统用户、优质店铺、剧本信息、购买信息、剧本拼团、玩家拼团、剧本拼团信息、玩家拼团信息等功能模块。系统通过浏览器与服务器进行通信,实现数据的交互与变更。只需通过一台电脑,动动手指就可以操作系统,实现数据通信管理。整个系统的设计过程都充分考虑了数据的安全、稳定及可靠等问题,而且操作过程简单。本系统通过科学的管理方式、便捷的服务提高了工作效率,减少了数据存储上的错误和遗漏。

剧本杀服务平台使用Java语言,采用基于B/S架构的SpringBoot技术进行开发,使用 MyEclipse编译器编写,数据方面主要采用的是MySQL关系型数据库来作为数据存储媒介,配合MyBatis、Redis等技术完成系统的开发。

三,系统展示

四,核心代码展示

package com.project.demo.controller;import com.alibaba.fastjson.JSONObject;
import com.project.demo.entity.AccessToken;
import com.project.demo.entity.User;
import com.project.demo.entity.UserGroup;
import com.project.demo.service.AccessTokenService;
import com.project.demo.service.UserGroupService;
import com.project.demo.service.UserService;import com.project.demo.controller.base.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;/*** 用户账户:用于保存用户登录信息(User)表控制层*/
@Slf4j
@RestController
@RequestMapping("user")
public class UserController extends BaseController<User, UserService> {/*** 服务对象*/@Autowiredpublic UserController(UserService service) {setService(service);}/*** Token服务*/@Autowiredprivate AccessTokenService tokenService;@Autowiredprivate UserGroupService userGroupService;/*** 注册* @param user* @return*/@PostMapping("register")public Map<String, Object> signUp(@RequestBody User user) {// 查询用户Map<String, String> query = new HashMap<>();query.put("username",user.getUsername());List list = service.select(query, new HashMap<>()).getResultList();if (list.size()>0){return error(30000, "用户已存在");}user.setUserId(null);user.setPassword(service.encryption(user.getPassword()));service.save(user);return success(1);}/*** 找回密码* @param form* @return*/@PostMapping("forget_password")public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {JSONObject ret = new JSONObject();String username = form.getUsername();String code = form.getCode();String password = form.getPassword();// 判断条件if(code == null || code.length() == 0){return error(30000, "验证码不能为空");}if(username == null || username.length() == 0){return error(30000, "用户名不能为空");}if(password == null || password.length() == 0){return error(30000, "密码不能为空");}// 查询用户Map<String, String> query = new HashMap<>();query.put("username",username);Query select = service.select(query, service.readConfig(request));List list = select.getResultList();if (list.size() > 0) {User o = (User) list.get(0);JSONObject query2 = new JSONObject();JSONObject form2 = new JSONObject();// 修改用户密码query2.put("user_id",o.getUserId());form2.put("password",service.encryption(password));service.update(query, service.readConfig(request), form2);return success(1);}return error(70000,"用户不存在");}/*** 登录* @param data* @param httpServletRequest* @return*/@PostMapping("login")public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {log.info("[执行登录接口]");String username = data.get("username");String email = data.get("email");String phone = data.get("phone");String password = data.get("password");List resultList = null;Map<String, String> map = new HashMap<>();if(username != null && "".equals(username) == false){map.put("username", username);resultList = service.select(map, new HashMap<>()).getResultList();}else if(email != null && "".equals(email) == false){map.put("email", email);resultList = service.select(map, new HashMap<>()).getResultList();}else if(phone != null && "".equals(phone) == false){map.put("phone", phone);resultList = service.select(map, new HashMap<>()).getResultList();}else{return error(30000, "账号或密码不能为空");}if (resultList == null || password == null) {return error(30000, "账号或密码不能为空");}//判断是否有这个用户if (resultList.size()<=0){return error(30000,"用户不存在");}User byUsername = (User) resultList.get(0);Map<String, String> groupMap = new HashMap<>();groupMap.put("name",byUsername.getUserGroup());List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();if (groupList.size()<1){return error(30000,"用户组不存在");}UserGroup userGroup = (UserGroup) groupList.get(0);//查询用户审核状态if (!StringUtils.isEmpty(userGroup.getSourceTable())){String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();String res = String.valueOf(service.runCountSql(sql).getSingleResult());if (res==null){return error(30000,"用户不存在");}if (!res.equals("已通过")){return error(30000,"该用户审核未通过");}}//查询用户状态if (byUsername.getState()!=1){return error(30000,"用户非可用状态,不能登录");}String md5password = service.encryption(password);if (byUsername.getPassword().equals(md5password)) {// 存储Token到数据库AccessToken accessToken = new AccessToken();accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));accessToken.setUser_id(byUsername.getUserId());tokenService.save(accessToken);// 返回用户信息JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));user.put("token", accessToken.getToken());JSONObject ret = new JSONObject();ret.put("obj",user);return success(ret);} else {return error(30000, "账号或密码不正确");}}/*** 修改密码* @param data* @param request* @return*/@PostMapping("change_password")public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){// 根据Token获取UserIdString token = request.getHeader("x-auth-token");Integer userId = tokenGetUserId(token);// 根据UserId和旧密码获取用户Map<String, String> query = new HashMap<>();String o_password = data.get("o_password");query.put("user_id" ,String.valueOf(userId));query.put("password" ,service.encryption(o_password));Query ret = service.count(query, service.readConfig(request));List list = ret.getResultList();Object s = list.get(0);int count = Integer.parseInt(list.get(0).toString());if(count > 0){// 修改密码Map<String,Object> form = new HashMap<>();form.put("password",service.encryption(data.get("password")));service.update(query,service.readConfig(request),form);return success(1);}return error(10000,"密码修改失败!");}/*** 登录态* @param request* @return*/@GetMapping("state")public Map<String, Object> state(HttpServletRequest request) {JSONObject ret = new JSONObject();// 获取状态String token = request.getHeader("x-auth-token");// 根据登录态获取用户IDInteger userId = tokenGetUserId(token);log.info("[返回userId] {}",userId);if(userId == null || userId == 0){return error(10000,"用户未登录!");}// 根据用户ID获取用户Map<String,String> query = new HashMap<>();query.put("user_id" ,String.valueOf(userId));// 根据用户ID获取Query select = service.select(query,service.readConfig(request));List resultList = select.getResultList();if (resultList.size() > 0) {JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(resultList.get(0)));user.put("token",token);ret.put("obj",user);return success(ret);} else {return error(10000,"用户未登录!");}}/*** 登录态* @param request* @return*/@GetMapping("quit")public Map<String, Object> quit(HttpServletRequest request) {String token = request.getHeader("x-auth-token");JSONObject ret = new JSONObject();Map<String, String> query = new HashMap<>(16);query.put("token", token);try{tokenService.delete(query,service.readConfig(request));}catch (Exception e){e.printStackTrace();}return success("退出登录成功!");}/*** 获取登录用户ID* @param token* @return*/public Integer tokenGetUserId(String token) {log.info("[获取的token] {}",token);// 根据登录态获取用户IDif(token == null || "".equals(token)){return 0;}Map<String, String> query = new HashMap<>(16);query.put("token", token);AccessToken byToken = tokenService.findOne(query);if(byToken == null){return 0;}return byToken.getUser_id();}/*** 重写add* @return*/@PostMapping("/add")@Transactionalpublic Map<String, Object> add(HttpServletRequest request) throws IOException {Map<String,Object> map = service.readBody(request.getReader());map.put("password",service.encryption(String.valueOf(map.get("password"))));service.insert(map);return success(1);}}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12969.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

企业系统集成方案:吉客云与金蝶云星空的无缝对接

企业系统集成方案&#xff1a;吉客云与金蝶云星空的无缝对接 项目背景&#xff1a; 一家领先的3C数码电子产品企业&#xff0c;专注于充电宝、按摩仪等高科技产品的自主研发、设计、生产和销售。企业紧跟市场趋势&#xff0c;积极拓展国内外市场&#xff0c;业务覆盖亚洲、美…

Hi3516CV610 超高清智慧视觉 SoC 产品简介

Hi3516CV610 Hi3516CV610 超高清智慧视觉SoC 内置人脸检测、人形检测、车辆检测、宠物检测、包裹检测算法 总体介绍 Hi3516CV610是一颗应用在安防市场的IPC SoC。在开放操作系统、新一代视频编解码标准、 网络安全和隐私保护、人工智能方面引领行业发 展&#xff0c;主要面…

【短视频内容管理系统的源代码解析与技术交流】

打造短视频矩阵源码&#xff0c;优化细节决胜负 开发和部署短视频矩阵源代码实际上并不复杂。它主要依赖于抖音平台提供的开放权限进行研发&#xff0c;市场上常见的代码功能架构也大同小异。关键在于细节处理和产品优化上的差异。 例如&#xff1a; 1. 在视频制作模块中&…

PH热榜 | 2024-11-12

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Spiky 标语&#xff1a;实时洞察&#xff0c;助力销售决策更快更明智。 介绍&#xff1a;Spiky AI 帮你用实时指导提升团…

C++ 关于基于范围的for循环(C++11) 语法 详解

范围for的语法 在 C98 中如果要遍历一个数组 void TestFor() { int array[] { 1, 2, 3, 4, 5 }; for (int i 0; i < sizeof(array) / sizeof(array[0]); i)array[i] * 2; for (int* p array; p < array sizeof(array)/ sizeof(array[0]); p)cout << *p <<…

【入门篇】判断推理是否有效的实例2——多语言版

跳转原题&#xff1a;判断推理是否有效的实例2 问题分析 根据题目给出的推理逻辑&#xff0c;我们有以下几个条件&#xff1a; 如果张老师来了&#xff08;(P)&#xff09;&#xff0c;问题可以解答&#xff08;(R)&#xff09;&#xff1a;(P \rightarrow R)如果李老师来了&…

5GAP模型:探寻服务质量问题的产生源头

| 91%的消费者表示&#xff0c;他们更有可能在获得卓越的服务体验后再次购买——Salesforce Research 一、什么是5GAP模型&#xff1f; 5GAP模型&#xff0c;指的是服务质量差距模型&#xff08;Service Quality Model&#xff09;&#xff0c;它是由美国营销学家帕拉休拉曼、…

期刊论文查重率多少,才会不被认定为学术不端?

Q问&#xff1a;论文查重和学术不端具有紧密的相关性&#xff0c;但是被认定为学术不端的查重率的界限是什么&#xff1f; A答&#xff1a;关于论文和查重&#xff0c;虽然这两者之间有着“说不清也道不明”的关系&#xff0c;这其中很重要的一个原因是很多人对查重都有一定的…

JAVA中重写与重载的极简区别

重载就是同样的一个方法能够根据输入数据的不同&#xff0c;做出不同的处理重写就是当子类继承自父类的相同方法&#xff0c;输入数据一样&#xff0c;但要做出有别于父类的响应时&#xff0c;你就要覆盖父类方法 方法的重写(Overriding)和重载(Overloading)是java多态性的不同…

[Linux]:IO多路转接之epoll

1. IO 多路转接之epoll 1.1 epoll概述 epoll是Linux内核为处理大规模并发网络连接而设计的高效I/O多路转接技术。它基于事件驱动模型&#xff0c;通过在内核中维护一个事件表&#xff0c;能够快速响应多个文件描述符上的I/O事件&#xff0c;如可读、可写、异常等&#xff0c;…

从0开始学习Linux——用户管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

Docker 安装Immich教程

Immich 是一个开源的自托管照片和视频管理平台,专为帮助用户存储、管理、和分享个人媒体库而设计。Immich 的目标是提供一个类似 Google Photos 的替代方案,但不依赖于第三方服务,用户可以完全控制自己的数据。 本章教程,记录如何用Docker部署安装Immich,使用的操作系统的…

回首遥望-C++内存对齐的思考

这一章节主要巩固一下学习C/C时内存对齐相关的内容&#xff01; 文章目录 什么是内存对齐&#xff1f;为什么要有内存对齐&#xff1f;如何进行内存对齐&#xff1f;致谢&#xff1a; 什么是内存对齐&#xff1f; 这里不提及一堆啰嗦概念&#xff0c;就结合实际出发&#xff0…

从代码到云端:使用PyCharm打包Python项目并部署至服务器的完整指南

从代码到云端&#xff1a;使用PyCharm打包Python项目并部署至服务器的完整指南 引言 随着云计算技术的发展&#xff0c;越来越多的开发者选择将自己的应用部署到云服务器上。对于Python开发人员来说&#xff0c;如何高效地将本地开发完成的应用程序迁移到远程服务器成为了一个…

【ComfyUI +BrushNet+PowerPaint】图像修复(根据题词填充目标)——ComfyUI-BrushNet

运行代码&#xff1a;https://github.com/nullquant/ComfyUI-BrushNet 源码1&#xff1a;https://github.com/TencentARC/BrushNet 源码2&#xff1a;https://github.com/open-mmlab/PowerPaint 上图&#xff0c;中间未 random_mask.safetensors结果&#xff0c;最右边图未segm…

(时序论文阅读)TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting

来源论文iclr2024 论文地址&#xff1a;https://arxiv.org/abs/2405.14616 源码地址&#xff1a; https://github.com/kwuking/TimeMixer 背景 数据是有连续性&#xff0c;周期性&#xff0c;趋势性的。我们这篇文章主要围绕的是用MLP结构来预测数据的周期性具体为&#xff…

大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

3196. I’m stuck!-13年12月CCF计算机软件能力认证

关键词 图通路&#xff0c;DFS/BFS 题目 思路 几点想说明的&#xff1a; 为什么要两个DFS&#xff1b;dfs1表示的是求从S出发能到达的所有的点&#xff1b;dfs2是考虑从T出发回溯&#xff0c;能到达的所有点&#xff0c;回溯去走&#xff0c;相当于此时T才是起点check函数&…

若依笔记(九):商城系统apk打包与调试

目录 env修改 nginx修改 apk打包 按照前文所述app版本保持2.2&#xff0c;使用uniapp作为生成工具&#xff0c;因为app版本涉及到登录、商品、支付&#xff0c;微信小程序打包需要企业主权限&#xff0c;所以使用apk打包&#xff0c;使用uniapp自带的云打包&#xff0c;本地…

算法练习记录

dp&#xff08;完全&#xff0c;线性&#xff0c;树状&#xff0c;状压&#xff0c;数位&#xff09;> 搜索 基础算法&#xff08;二分&#xff0c;前缀和&#xff0c;高精度&#xff0c;公约数&#xff0c;公倍数&#xff0c;质数&#xff0c;排序&#xff09; > 数据结…