电影院购票管理系统

文章目录

  • 电影院购票管理系统
    • 一、项目演示
    • 二、项目介绍
    • 三、部分功能截图
    • 四、部分代码展示
    • 五、底部获取项目源码(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.mzph.cn/diannao/10525.shtml

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

相关文章

开发利器 - docker 安装运行 mysql

本文选择安装的mysql版本为5.7 &#xff0c;安装环境 mac 1、查看镜像是否存在 docker search mysql:5.7 2、拉取镜像 docker pull mysql:5.7 3、运行镜像 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 --name&#xff1a;指定容器…

淘宝买的知识付费系统,在线教育电销怎么做你知道吗?

在线教育行业的销售推销的产品其实就是课程&#xff0c;只不过变成了一种虚拟产品&#xff0c;在线教育的销售一般有课程销售、平台搭建销售&#xff0c;还有就是老师其实也是一种销售&#xff0c;这几个里面最容易上手的就是课程销售了&#xff0c;课程销售一般采用电话销售方…

【UniApp踩坑记录】在subNvue页面中使用Map,添加marker后不显示

一、背景 最近将一个小程序项目转化为 APP&#xff0c;想着正好体验一下 uniapp 宣称的一套代码&#xff0c;多端运行理念&#xff0c;于是运行到了真机环境。好消息是运行成功了&#xff0c;坏消息是部分样式不完善&#xff0c;部分功能失效。跨端成功了&#xff0c;但没完全…

00 深度学习 PyTorch框架介绍

PyTorch框架介绍 什么是PyTorch&#xff1f; PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 的人工智能研究团队开发&#xff0c;提供了强大的 GPU 加速的张量计算库和基于 autograd 系统的深度神经网络&#xff08;DNN&#xff09;库。它的设计强调简单性和直观…

4---自动化构建代码(逻辑梳理,轻松理解)

一、需求引出&#xff1a; 在使用编译器编译代码时&#xff0c;无论我们在一个项目中写了多少个文件(包括头文件、源文件)&#xff0c;我们都可以一键完成编译&#xff0c;编译器会自动处理各个文件之间的包含&#xff0c;调用关系。但是在Linux中&#xff0c;我们在一个目录下…

CSS 定位

为什么需要浮动? 我们在访问一些网站的时候, 经常会遇到如下这种情况, 有一个组件, 一直固定在屏幕的固定位置, 无论你如何滑动这个网页, 就会固定在哪里, 如下, 下图是王者荣耀的一个官网: 要实现上面的效果, 标准流或者是浮动是无法快速实现的, 此时就需要使用定位来实现.…

复习用到知识(asp.net)

public partial class teacheDetails : System.Web.UI.Page { // 页面加载时触发的事件 protected void Page_Load(object sender, EventArgs e) { // 检查是否是首次加载页面&#xff08;非回发&#xff09; if (!IsPostBack) { // 检查URL查询字符串中是否包含"…

H3C DHCP快速配置指南

1 配置DHCP服务器动态分配IPv4地址 1.1 简介 本案例介绍配置接口工作在DHCP服务器模式&#xff0c;实现动态分配IPv4地址的方法。 1.2 组网需求 如1.2 图1所示&#xff0c;公司将交换机做为核心交换机&#xff0c;现在需要在核心交换机上划分3个VLAN网段&#xff0c;Ho…

数据结构与算法学习笔记三---循环队列的表示和实现(C++)

目录 前言 1.为什么要使用循环队列 2.队列的顺序存储方式的实现 1.定义 2.队列初始化 3.销毁 4.清空队列 5.队列是否为空 6.队列长度 7.队头 8.入队 9.出队 10.遍历队列 11.完整代码 3.参考资料 前言 这篇文章介绍循环队列的表示和用法。 1.为什么要使用循环队…

深入理解Linux下的网络监控工具:iftop

目录标题 1. 什么是iftop?2. 安装iftop在Debian/Ubuntu上安装在CentOS/RHEL上安装在其他Linux发行版上 3. 使用iftop监控网络流量命令行选项界面说明交互命令 4. 相关参数及说明 在维护和监控Linux服务器时&#xff0c;了解网络流量的细节非常重要。网络监控可以帮助我们诊断延…

20240511金融读报:信贷风控卫星遥感系统实例蓝色金融

1、兴业银行信贷风控方面&#xff0c;卫星遥感应用系统&#xff08;看其他人吹了那么久&#xff0c;终于有个出来讲细节了&#xff09;&#xff1a;适用范围&#xff08;农业种植&#xff08;面积、长势、产量、市场价格、病虫害风险&#xff09;、林业&#xff08;面积、砍伐、…

远程服务器监控工具Navicat Monitor全新发布v3.0 - 支持PostgreSQL用户

Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure 和阿里云等云数据库兼容。Nav…

C# 统计代码运行时长

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace Sci {/// <summary>/// 统计代码…

AlmaLinux 文件拷贝 cp命令用法示例

AlmaLinux 文件拷贝 在Linux系统中&#xff0c;文件复制可以使用cp命令。以下是一些基本的cp命令用法示例&#xff1a; 复制文件到目标目录&#xff1a; cp source.txt /destination/directory/ 复制多个文件到目标目录&#xff1a; cp file1.txt file2.txt /destination/d…

网易灵犀办公企业邮箱的IMAP和POP3服务器地址

IMAP 电子邮件地址&#xff1a;saleyouxiang.com 帐户类型&#xff1a;IMAP 接收邮件服务器&#xff1a;imaphz.qiye.163.com 发送邮件服务器&#xff1a;smtphz.qiye.163.com 用户名&#xff1a;saleyouxiang.comPOP3 电子邮件地址&#xff1a;saleyouxiang.com 帐户类型&…

进程间通信:连接不同程序世界的桥梁

目录 一、进程间通信的重要性 二、常见的进程间通信方式 三、进程间通信的目的 四、进程间通信的本质 在计算机编程的领域中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一个至关重要的概念。当我们在操作系统中运行多个程…

YOLOv5-7.0改进(四)添加EMA注意力机制

前言 关于网络中注意力机制的改进有很多种&#xff0c;本篇内容从EMA注意力机制开始&#xff01; 往期回顾 YOLOv5-7.0改进&#xff08;一&#xff09;MobileNetv3替换主干网络 YOLOv5-7.0改进&#xff08;二&#xff09;BiFPN替换Neck网络 YOLOv5-7.0改进&#xff08;三&…

【智能算法】鹭鹰优化算法(SBOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;Y Fu受到自然界中鹭鹰生存行为启发&#xff0c;提出了鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;。 2.算法原理 2.1算法思想…

MySQL:数据库管理的强大工具

MySQL&#xff1a;数据库管理的强大工具 文章目录 MySQL&#xff1a;数据库管理的强大工具引言MySQL的核心特性使用场景为什么选择MySQL结语 引言 在当今的数据驱动时代&#xff0c;数据库管理系统(DBMS)扮演着至关重要的角色。MySQL&#xff0c;作为一个开源的关系数据库管理…

Python - with语句 - 写一个支持with方法调用的类

Python - with语句 - 写一个支持with方法调用的类 前言 使用语句with open(a.txt, r) as f:可以自动关闭文件句柄&#xff0c;使用语句with torcu.no_grad()可以不计算梯度。 我学Py的时候咋好像没学过open和no_grad是怎么实现的&#xff1f; 于是今日了解了一下。 实现一…