电影院购票管理系统

文章目录

  • 电影院购票管理系统
    • 一、项目演示
    • 二、项目介绍
    • 三、部分功能截图
    • 四、部分代码展示
    • 五、底部获取项目源码(9.9¥带走)

电影院购票管理系统

一、项目演示

电影院售票管理系统

二、项目介绍

基于springboot+vue的前后端分离电影院购票管理系统
(1)用户功能

登录、退出、注册、修改个人信息、上映|即将上映|热播影片浏览、搜索、上映|即将上映|热播榜单浏览、选座购票、订单查看

(2)管理员功能

影院信息管理、影片管理:电影信息、电影类型、影厅管理:影厅信息、场次信息管理、订单管理、用户管理

2、项目技术
语言:java
前端技术:Vue、Element-Plus
后端技术:SpringBoot、Mybatis-Plus
数据库:MySQL

三、部分功能截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、部分代码展示

package com.movie.web.controller.system;import com.movie.common.exception.DataNotFoundException;
import com.movie.common.response.ResponseResult;
import com.movie.common.utils.ApplicationContextUtils;
import com.movie.system.domin.SysBill;
import com.movie.system.domin.SysMovie;
import com.movie.system.domin.SysSession;
import com.movie.system.domin.vo.SysBillVo;
import com.movie.system.service.impl.SysBillServiceImpl;
import com.movie.system.service.impl.SysMovieServiceImpl;
import com.movie.system.service.impl.SysSessionServiceImpl;
import com.movie.web.controller.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Random;@RestController
public class SysBillController extends BaseController {@Autowiredprivate SysBillServiceImpl sysBillService;@Autowiredprivate SysSessionServiceImpl sysSessionService;@Autowiredprivate SysMovieServiceImpl sysMovieService;@GetMapping("/sysBill")public ResponseResult findAllBills(SysBill sysBill) {startPage();// 取消所有超时订单并释放占座资源ApplicationContextUtils.getBean("cancelTimeoutBill");List<SysBill> data = sysBillService.findAllBills(sysBill);return getResult(data);}@GetMapping("/sysBill/{id}")public ResponseResult findBillById(@PathVariable Long id) {return getResult(sysBillService.findBillById(id));}@PostMapping("/sysBill")public ResponseResult addBill(@Validated @RequestBody SysBillVo sysBillVo) {// 获取当前场次信息SysSession curSession = sysSessionService.findOneSession(sysBillVo.getSysBill().getSessionId());if (curSession == null) {throw new DataNotFoundException("添加订单的场次没找到");}System.out.println(curSession.getSessionSeats());curSession.setSessionSeats(sysBillVo.getSessionSeats());int addSallNums = sysBillVo.getSysBill().getSeats().split(",").length;curSession.setSallNums(curSession.getSallNums() + addSallNums);// 更新场次座位信息sysSessionService.updateSession(curSession);Random random = new Random();int temp = random.nextInt(6);Object obj = sysBillService.addBill(sysBillVo.getSysBill());if (obj instanceof Integer) {return getResult((Integer) obj);}return getResult(obj);}@PutMapping("/sysBill")public ResponseResult pay(@RequestBody SysBill sysBill) {int rows = sysBillService.updateBill(sysBill);if (rows > 0 && sysBill.getPayState()) {//更新场次的座位状态SysSession curSession = sysSessionService.findOneSession(sysBill.getSessionId());if (curSession == null) {throw new DataNotFoundException("支付订单的场次没找到");}//更新电影票房SysMovie curMovie = sysMovieService.findOneMovie(curSession.getMovieId());if (curMovie == null) {throw new DataNotFoundException("支付订单的电影没找到");}//订单的座位数int seatNum = sysBill.getSeats().split(",").length;double price = curSession.getSessionPrice();curMovie.setMovieBoxOffice(curMovie.getMovieBoxOffice() + seatNum * price);sysMovieService.updateMovie(curMovie);}return getResult(rows);}@PutMapping("/sysBill/cancel")public ResponseResult cancel(@RequestBody SysBillVo sysBillVo) {// 订单取消,更新订单状态int rows = sysBillService.updateBill(sysBillVo.getSysBill());if (rows > 0 && sysBillVo.getSysBill().getCancelState()) {// 订单取消座位不再占用,更新场次的座位状态SysSession curSession = sysSessionService.findOneSession(sysBillVo.getSysBill().getSessionId());// 取消的订单座位数int cancelSallNums = sysBillVo.getSysBill().getSeats().split(",").length;curSession.setSallNums(curSession.getSallNums() - cancelSallNums);if (curSession == null) {throw new DataNotFoundException("添加订单的场次没找到");}curSession.setSessionSeats(sysBillVo.getSessionSeats());sysSessionService.updateSession(curSession);}return getResult(rows);}@DeleteMapping("/sysBill/{ids}")public ResponseResult deleteBill(@PathVariable Long[] ids) {return getResult(sysBillService.deleteBill(ids));}}
package com.movie.web.controller.system;import com.movie.common.response.ResponseResult;
import com.movie.system.domin.SysCinema;
import com.movie.system.domin.SysSession;
import com.movie.system.service.impl.SysCinemaServiceImpl;
import com.movie.system.service.impl.SysSessionServiceImpl;
import com.movie.web.controller.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.List;@RestController
public class SysCinemaController extends BaseController {@Autowiredprivate SysCinemaServiceImpl sysCinemaService;@Autowiredprivate SysSessionServiceImpl sysSessionService;@GetMapping("/sysCinema")public ResponseResult findCinema() {return getResult(sysCinemaService.findCinema());}@PutMapping("/sysCinema/update")public ResponseResult updateCinema(@Validated @RequestBody SysCinema sysCinema) {return getResult(sysCinemaService.updateCinema(sysCinema));}@GetMapping(value = {"/sysCinema/find/{cinemaId}/{movieId}", "/sysCinema/find/{cinemaId}"})public ResponseResult findCinemaById(@PathVariable Long cinemaId, @PathVariable(required = false) Long movieId) {SysCinema cinema = sysCinemaService.findCinemaById(cinemaId);if (movieId == null || movieId == 0) {movieId = cinema.getSysMovieList().size() > 0 ? cinema.getSysMovieList().get(0).getMovieId() : 0;}List<SysSession> sessions = null;if (movieId != null && movieId != 0) {sessions = sysSessionService.findSessionByMovieId(movieId);}HashMap<String, Object> response = new HashMap<>();response.put("cinema", cinema);response.put("sessions", sessions);return getResult(response);}}
package com.movie.common.controller;import com.movie.common.file.FileUploadUtils;
import com.movie.common.response.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.FileNotFoundException;
import java.io.IOException;/*** 封装图片上传请求*/
@Slf4j
@RestController
@RequestMapping("/upload")
public class FileUploadController {@PostMapping("/user")public ResponseResult uploadUser(@RequestParam("file") MultipartFile file) throws IOException {FileUploadUtils.setDefaultBaseDir(FileUploadUtils.userPath);String filename = FileUploadUtils.upload(file);log.debug("上传文件名 : " + filename);return ResponseResult.success((Object) filename);}@PostMapping("/movie")public ResponseResult uploadMovie(@RequestParam("file") MultipartFile file) throws IOException {FileUploadUtils.setDefaultBaseDir(FileUploadUtils.moviePath);String filename = FileUploadUtils.upload(file);log.debug("上传文件名 : " + filename);return ResponseResult.success((Object) filename);}@PostMapping("/cinema")public ResponseResult uploadCinema(@RequestParam("file") MultipartFile file) throws IOException {FileUploadUtils.setDefaultBaseDir(FileUploadUtils.cinemaPath);String filename = FileUploadUtils.upload(file);log.debug("上传文件名 : " + filename);return ResponseResult.success((Object) filename);}@PostMapping("/actor")public ResponseResult uploadActor(@RequestParam("file") MultipartFile file) throws IOException {FileUploadUtils.setDefaultBaseDir(FileUploadUtils.actorPath);String filename = FileUploadUtils.upload(file);log.debug("上传文件名 : " + filename);return ResponseResult.success((Object) filename);}@RequestMapping("/delete")public ResponseResult deletePicture(String filePath) {try {String path = ResourceUtils.getURL("classpath:").getPath().substring(1) + "static" + filePath;log.debug("删除文件路径为:" + path);boolean flag = FileUploadUtils.deleteFile(path);log.debug(flag ? "删除成功" : "删除失败");} catch (FileNotFoundException e) {System.out.println("删除文件不存在");} finally {return ResponseResult.success();}}}
package com.movie.common.file;import com.movie.common.exception.FileNameLengthLimitExceededException;
import com.movie.common.exception.FileSizeLimitExceededException;
import com.movie.common.exception.InvalidExtensionException;
import com.movie.common.utils.StringUtil;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.util.ClassUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;/*** 文件上传工具类*/
public class FileUploadUtils {/*** 默认大小 50M*/public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;/*** 默认的文件名最大长度 100*/public static final int DEFAULT_FILE_NAME_LENGTH = 100;/*** 默认存储图片目录*/private static final String parentPath = ClassUtils.getDefaultClassLoader().getResource("static/images").getPath();public static final String actorPath = "/actor";public static final String cinemaPath = "/cinema";public static final String moviePath = "/movie";public static final String userPath = "/user";/*** 默认上传的地址*/private static String defaultBaseDir = userPath;public static void setDefaultBaseDir(String defaultBaseDir) {FileUploadUtils.defaultBaseDir = defaultBaseDir;}public static String getDefaultBaseDir() {return defaultBaseDir;}public static String getParentPath() {return parentPath;}/*** 以默认配置进行文件上传** @param file 上传的文件* @return 文件名称* @throws Exception*/public static final String upload(MultipartFile file) throws IOException {try {return upload(getParentPath() + getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);} catch (Exception e) {throw new IOException(e.getMessage(), e);}}/*** 文件上传** @param baseDir          相对应用的基目录* @param file             上传的文件* @param allowedExtension 上传文件类型* @return 返回上传成功的文件名* @throws FileSizeLimitExceededException       如果超出最大大小* @throws FileNameLengthLimitExceededException 文件名太长* @throws IOException                          比如读写文件出错时* @throws InvalidExtensionException            文件校验异常*/public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,InvalidExtensionException {int fileNamelength = file.getOriginalFilename().length();if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {throw new FileNameLengthLimitExceededException("文件名称长度不能超过" + FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);}assertAllowed(file, allowedExtension);String fileName = extractFilename(file);File desc = getAbsoluteFile(baseDir, fileName);System.err.println("baseDir"+": "+baseDir);file.transferTo(desc);String pathFileName = getPathFileName(baseDir, fileName);System.err.println("pathFileName"+": "+baseDir);return pathFileName;}/*** 编码文件名 如 : images/user/2021/3/4/***.png*/public static final String extractFilename(MultipartFile file) {String fileName = file.getOriginalFilename();String extension = getExtension(file);fileName = DateFormatUtils.format(new Date(), "yyyy/MM/dd") + "/" + UUID.randomUUID().toString().replaceAll("-", "") + "." + extension;System.err.println("fileName"+": "+fileName);return fileName;}/*** 判断文件名是否存在 不存在创建一个* @param uploadDir* @param fileName* @return* @throws IOException*/private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {File desc = new File(uploadDir + File.separator + fileName);if (!desc.getParentFile().exists()) {desc.getParentFile().mkdirs();}if (!desc.exists()) {desc.createNewFile();}return desc;}private static final String getPathFileName(String uploadDir, String fileName) throws IOException {int dirLastIndex = parentPath.length() + 1;String currentDir = StringUtils.substring(uploadDir, dirLastIndex);String pathFileName = "/images/" + currentDir + "/" + fileName;return pathFileName;}/*** 文件大小校验** @param file 上传的文件* @return* @throws FileSizeLimitExceededException 如果超出最大大小* @throws InvalidExtensionException*/public static final void assertAllowed(MultipartFile file, String[] allowedExtension)throws FileSizeLimitExceededException, InvalidExtensionException {long size = file.getSize();if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {throw new FileSizeLimitExceededException("文件大小不能超过" + DEFAULT_MAX_SIZE / 1024 / 1024 + "MB");}String fileName = file.getOriginalFilename();String extension = getExtension(file);if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) {throw new InvalidExtensionException("图片格式不支持" + extension + "格式");}}}/*** 判断MIME类型是否是允许的MIME类型** @param extension* @param allowedExtension* @return*/public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {for (String str : allowedExtension) {if (str.equalsIgnoreCase(extension)) {return true;}}return false;}/*** 获取文件名的后缀** @param file 表单文件* @return 后缀名*/public static final String getExtension(MultipartFile file) {String extension = FilenameUtils.getExtension(file.getOriginalFilename());if (!StringUtil.isNotEmpty(extension)) {extension = MimeTypeUtils.getExtension(file.getContentType());}return extension;}/*** 删除文件** @param filePath 文件* @return*/public static boolean deleteFile(String filePath) {boolean flag = false;File file = new File(filePath);// 路径为文件且不为空则进行删除if (file.isFile() && file.exists()) {file.delete();flag = true;}return flag;}}

五、底部获取项目源码(9.9¥带走)

有问题,或者需要协助调试运行项目的也可以

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux软件基础知识】如何使用 run_list 字段将任务放入就绪队列中

在给定的代码片段中,struct task_struct 表示内核中任务或进程的进程控制块 (PCB)。 run_list 字段的类型为 struct list_head,这表明它是链表实现的一部分。 run_list字段在Linux内核中常用来表示任务在调度队列中的位置,例如就绪队列或各种优先级队列。 init_task是一个…

《Python编程从入门到实践》day25

# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…

Sqlite在Mybatis Plus中关于时间字段的处理

我的个人项目中&#xff0c;使用Mybatis-Plus 和 Sqlite数据库&#xff0c; 但是在存储和查询时间字段的时候&#xff0c;总是出现问题&#xff0c;记录下我解决问题的过程。 Sqlite会默认把时间字段转成时间戳存储到数据库的字段中&#xff0c;看起来不直观&#xff0c;所以我…

刷代码随想录有感(63):将有序数组转换为二叉搜索树(其实时二叉平衡搜索树)

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* traversal(vector<int>& nums, int left, int right){if(left > right)return NULL;int mid left (right - left)/2;TreeNode* NewRoot new TreeNode(nums[mid]);NewRoot->left tra…

2024最新从0部署Django项目(nginx+uwsgi+mysql)

云服务器 我这里用的是腾讯云免费试用的2H4Gcentos服务器&#xff08;后升级为2H8G&#xff0c;保险一点提高内存&#xff09; 因为网上很多关于django部属的教程都是宝塔啊&#xff0c;python版本控制器啊这种的&#xff0c;我也误打误撞安装了宝塔面板&#xff0c;但这里我…

【吊打面试官系列】Java高并发篇 - 同步方法和同步块,哪个是更好的选择?

大家好&#xff0c;我是锋哥。今天分享关于 【同步方法和同步块&#xff0c;哪个是更好的选择&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 同步方法和同步块&#xff0c;哪个是更好的选择&#xff1f; 同步块是更好的选择&#xff0c;因为它不会锁住整个对象…

【notepad++】使用

1 notepad 下载路径 https://notepad-plus.en.softonic.com/download 2 设置护眼模式 . 设置——语言格式设置——前景色——黑色 . 背景色——RGB &#xff1a;199 237 204 . 勾选“使用全局背景色”、“使用全局前景色” . 保存并关闭

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 2.Flume基础架构…

【Web后端】jsp基础知识_请求转发和重定向

1.jsp基础知识 1.1简介 java server page&#xff0c;运行在服务器端的页面java代码html代码java代码全部都放在<%%>中间 1.2jsp表达式 作用&#xff1a;将动态信息显示在页面上&#xff0c;以字符串方式&#xff0c;返回给浏览器端语法&#xff1a;<%变量或表达式…

Debian安装Redis、RabbitMQ、Nacos

安装Redis&#xff1a; 启动Redis、开机自启动 sudo systemctl start redis-server #启动sudo systemctl enable redis-server #开机自启 Redis状态(是否在运行) sudo systemctl status redis-server #查看运行状态 redis-cli ping # 客户端尝试连接 安装RabbitMQ&#xff0c;…

【回溯 网格 状态压缩】52. N 皇后 II

本文涉及知识点 回溯 网格 状态压缩 LeetCode52. N 皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#x…

conan2 基础入门(02)-安装

conan2 基础入门(02)-安装 文章目录 conan2 基础入门(02)-安装⭐前言⭐安装python安装安装包安装自行操作 ⭐验证配置环境变量命令行验证conan配置文件 END ⭐前言 Conan 2.0: C and C Open Source Package Manager 官方提供三种安装conan的方式。分别为&#xff1a; Recommen…

1290.二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进制…

在k8s中部署Prometheus并实现对k8s集群的监控

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Prometheus&#xff1a;监控的神》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s简介 2、 Prometheus概述 二、准备k8s环境 1、…

IDEA安装使用Git

IDEA安装使用Git 1 Git下载与安装 2 在IDEA中使用Git 2.1 IDEA中配置Git 在IDEA中使用Git&#xff0c;本质上还是使用本地安装的Git软件&#xff0c;所以需要在IDEA中配置Git。 2.2 在IDEA中使用Git 2.2.1 获取Git仓库 在IDEA中使用Git获取仓库有两种方式: 本地初始化仓库从…

HTTP超时时间设置

在进行超时时间设置之前我们需要了解一次http请求经历的过程 浏览器进行DNS域名解析&#xff0c;得到对应的IP地址根据这个IP&#xff0c;找到对应的服务器建立连接&#xff08;三次握手&#xff09;建立TCP连接后发起HTTP请求&#xff08;一个完整的http请求报文&#xff09;服…

在R的 RGui中,使用devtools 安装trajeR

创建于&#xff1a;2024.5.5 文章目录 1. 报错信息2. 尝试使用指定的清华镜像&#xff0c;没有解决3. 找到原因&#xff1a;官网把包删除了4. 尝试从网上下载&#xff0c;然后安装。没有成功5. 使用devtools安装5.1 尝试直接安装&#xff1a;install.packages("devtools&q…

Vue从入门到实战Day04

一、组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; 1. scoped样式冲突 默认情况&#xff1a;写在组件中的样式会全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式&#xff1a;默认组件中的样式会作用到全局 2. 局部样式&#xff1a;可以…

浅谈运维数据安全

在数字化日益深入的今天&#xff0c;运维数据安全已经成为企业信息安全体系中的核心要素。运维工作涉及到企业信息系统的各个方面&#xff0c;从硬件维护到软件升级&#xff0c;从网络配置到数据备份&#xff0c;无一不需要严谨的数据安全保障措施。本文将从运维数据安全的重要…

122. Kafka问题与解决实践

文章目录 前言顺序问题1. 为什么要保证消息的顺序&#xff1f;2.如何保证消息顺序&#xff1f;3.出现意外4.解决过程 消息积压1. 消息体过大2. 路由规则不合理3. 批量操作引起的连锁反应4. 表过大 主键冲突数据库主从延迟重复消费多环境消费问题后记 前言 假如有家公司是做餐饮…