基于Web的线上影院订票系统的设计与实现

简介: 基于Web的线上影院订票系统的设计与实现

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Springboot+Vue

二,项目简介

生活物质水平的提升让新时代的人们有了更多的娱乐消费,但电影仍然是业余消遣和自己爱好的一个主要场所。疫情三年让很多电影院不得不关门或停业,2023年有一定的消费反弹,但仍然是困难重重。如果利用新技术,新媒体等方式,为电影院注入新的活力,带来更多的流量,引来更多的客户,是本课题主要关注的重点。本课题主要基于WEB开发技术,使用Springboot+Vue来完成一个基于WEB形式的网上电影购票平台系统,希望能通过互联网技术的应用帮助电影院做更多的推广,帮助他们度过难关。本课题主要基于所学的后台开技术和前端开发技术,根据实地调研分析设计出有关电影售票平台的相关功能,后台开发使用Springboot框架集成MybatisPlus,前台开发使用Vue+ElementUI组件来开发实现,数据存储使用MYSQL来进行存储实现,完成了在线购票、论坛交流、新闻查看等相应的业务模块。

电影院购票系统可以对影院影片信息进行集中管理,可以真正避免传统管理的缺陷。电影院购票系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,电影院购票系统都可以轻松应对。所以,电影院购票系统的运用是让影院信息管理升级的最好方式。它可以实现信息处理的便利化要求,还可以规范信息处理的流程,让事务处理成为管理人员手中的一件简单事,而不是之前手工处理时的困难事。尽管电影院购票系统具备较完善的功能,但是也需要管理人员利用闲暇时间提升自身素质以及个人能力,在操作电影院购票系统时可以最大化运用电影院购票系统提供的功能,让系统在满足高效率处理数据的同时,也能始终稳定运行,还可以确保数据的可靠性与数据处理的质量。

系统的用户分为两类,一个是前端会员用户,一类是后台管理员用户。下面通过用例图来展示一下两类用户各自的功能用例。

1、前端会员用户:注册登陆后方可在线进行相关的数据操作,主要包含新闻查看,电影推荐(根据用户的操作行为来为用户推荐相应的电影)、电影信息查看、在线购票操作,同时可以对电影进行收藏和评价,电影爱好者还可以在系统前端提供的交流论坛进行在线交流,个人中心模块可以管理自己订单数据、收藏数据和评价数据等。

图3-1 会员用例

2、后端会员用户:管理员登陆后可以在后台进行相关的数据管理操作,主要包含新闻管理,电影管理、电影类型管理、订单管理、评价管理、用户管理、新闻管理、论坛管理等模块,具体展示如下图3-2所示。

图3-2 管理员员工用例

三,系统展示

本部分主要展示根据前端的需求分析和相关设计,来编码实现的最终效果,需要展示的就是一个完整可使用的在线购票网站系统。系统的实现分为系统的前端功能实现和后台管理功能实现。下面分别展示一下系统的前端功能实现和后台功能实现界面。

5.1 后台用户功能实现

5.1.1用户信息管理

如图5.1显示的就是用户信息管理页面,此页面提供给管理员的功能有:用户信息的查询管理,可以删除用户信息、修改用户信息、新增用户信息,还进行了对用户名称的模糊查询的条件查询操作。

图5.1 用户信息管理页面

5.1.2 电影信息管理

如图5.2显示的就是电影信息管理页面,此页面提供给管理员的功能有:查看已发布的电影信息数据,修改电影信息,电影信息作废,即可删除,还进行了对电影信息名称的模糊查询 电影信息信息的类型查询等等一些条件。

图5.2 电影信息管理页面

5.1.3电影评价管理

如图5.3显示的就是电影评价管理页面,此页面提供给管理员的功能有:根据电影评价进行条件查询,还可以对电影评价进行新增、修改、查询操作等等。

图5.3 电影评价管理页面

5.1.4新闻信息管理

如图5.4显示的就是新闻信息管理页面,此页面提供给管理员的功能有:根据新闻信息进行新增、修改、查询操作等等。

图5.4 新闻信息管理页面

5.2 前端用户功能实现

5.2.1 用户注册登陆

前端用户注册登陆方可以进行在线订票,在线互动等操作,这些操作都需要是会员身份才可以进行的操作,下面展示一下系统前端用户的注册和登陆界面。

图5.5 用户注册页面

5.2.2 电影浏览

用户在电影订票系统的前端页面,可以分类来浏览电影信息,也可以根据电影名字进行模糊查询,电影信息以分页的形式来进行展示,下面展示一下前端电影列表界面。

图5.7 前端电影列表页面

5.2.3 电影选座订票

用户在电影订票系统的前端页面,可以查看电影详情信息,在此界面可以选择日期时间,选择相应的座位,在线进行购票操作。

图5.8 前端电影列表页面

其它功能不再一一展示

四,核心代码展示

package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
 * 电影收藏
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/dianyingCollection")
public class DianyingCollectionController {
    private static final Logger logger = LoggerFactory.getLogger(DianyingCollectionController.class);
    @Autowired
    private DianyingCollectionService dianyingCollectionService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;
    //级联表service
    @Autowired
    private DianyingService dianyingService;
    @Autowired
    private YonghuService yonghuService;
    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("用户".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = dianyingCollectionService.queryPage(params);
        //字典表数据转换
        List<DianyingCollectionView> list =(List<DianyingCollectionView>)page.getList();
        for(DianyingCollectionView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }
    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        DianyingCollectionEntity dianyingCollection = dianyingCollectionService.selectById(id);
        if(dianyingCollection !=null){
            //entity转view
            DianyingCollectionView view = new DianyingCollectionView();
            BeanUtils.copyProperties( dianyingCollection , view );//把实体数据重构到view中
                //级联表
                DianyingEntity dianying = dianyingService.selectById(dianyingCollection.getDianyingId());
                if(dianying != null){
                    BeanUtils.copyProperties( dianying , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setDianyingId(dianying.getId());
                }
                //级联表
                YonghuEntity yonghu = yonghuService.selectById(dianyingCollection.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }
    }
    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody DianyingCollectionEntity dianyingCollection, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,dianyingCollection:{}",this.getClass().getName(),dianyingCollection.toString());
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");
        else if("用户".equals(role))
            dianyingCollection.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        Wrapper<DianyingCollectionEntity> queryWrapper = new EntityWrapper<DianyingCollectionEntity>()
            .eq("dianying_id", dianyingCollection.getDianyingId())
            .eq("yonghu_id", dianyingCollection.getYonghuId())
            .eq("dianying_collection_types", dianyingCollection.getDianyingCollectionTypes())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        DianyingCollectionEntity dianyingCollectionEntity = dianyingCollectionService.selectOne(queryWrapper);
        if(dianyingCollectionEntity==null){
            dianyingCollection.setInsertTime(new Date());
            dianyingCollection.setCreateTime(new Date());
            dianyingCollectionService.insert(dianyingCollection);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }
    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody DianyingCollectionEntity dianyingCollection, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,dianyingCollection:{}",this.getClass().getName(),dianyingCollection.toString());
        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
//        else if("用户".equals(role))
//            dianyingCollection.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        //根据字段查询是否有相同数据
        Wrapper<DianyingCollectionEntity> queryWrapper = new EntityWrapper<DianyingCollectionEntity>()
            .notIn("id",dianyingCollection.getId())
            .andNew()
            .eq("dianying_id", dianyingCollection.getDianyingId())
            .eq("yonghu_id", dianyingCollection.getYonghuId())
            .eq("dianying_collection_types", dianyingCollection.getDianyingCollectionTypes())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        DianyingCollectionEntity dianyingCollectionEntity = dianyingCollectionService.selectOne(queryWrapper);
        if(dianyingCollectionEntity==null){
            dianyingCollectionService.updateById(dianyingCollection);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }
    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        dianyingCollectionService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        try {
            List<DianyingCollectionEntity> dianyingCollectionList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            DianyingCollectionEntity dianyingCollectionEntity = new DianyingCollectionEntity();
//                            dianyingCollectionEntity.setDianyingId(Integer.valueOf(data.get(0)));   //电影 要改的
//                            dianyingCollectionEntity.setYonghuId(Integer.valueOf(data.get(0)));   //用户 要改的
//                            dianyingCollectionEntity.setDianyingCollectionTypes(Integer.valueOf(data.get(0)));   //类型 要改的
//                            dianyingCollectionEntity.setInsertTime(date);//时间
//                            dianyingCollectionEntity.setCreateTime(date);//时间
                            dianyingCollectionList.add(dianyingCollectionEntity);
                            //把要查询是否重复的字段放入map中
                        }
                        //查询是否重复
                        dianyingCollectionService.insertBatch(dianyingCollectionList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }
    /**
    * 前端列表
    */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        // 没有指定排序字段就默认id倒序
        if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
            params.put("orderBy","id");
        }
        PageUtils page = dianyingCollectionService.queryPage(params);
        //字典表数据转换
        List<DianyingCollectionView> list =(List<DianyingCollectionView>)page.getList();
        for(DianyingCollectionView c:list)
            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
        return R.ok().put("data", page);
    }
    /**
    * 前端详情
    */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        DianyingCollectionEntity dianyingCollection = dianyingCollectionService.selectById(id);
            if(dianyingCollection !=null){
                //entity转view
                DianyingCollectionView view = new DianyingCollectionView();
                BeanUtils.copyProperties( dianyingCollection , view );//把实体数据重构到view中
                //级联表
                    DianyingEntity dianying = dianyingService.selectById(dianyingCollection.getDianyingId());
                if(dianying != null){
                    BeanUtils.copyProperties( dianying , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setDianyingId(dianying.getId());
                }
                //级联表
                    YonghuEntity yonghu = yonghuService.selectById(dianyingCollection.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
                //修改对应字典表字段
                dictionaryService.dictionaryConvert(view, request);
                return R.ok().put("data", view);
            }else {
                return R.error(511,"查不到数据");
            }
    }
    /**
    * 前端保存
    */
    @RequestMapping("/add")
    public R add(@RequestBody DianyingCollectionEntity dianyingCollection, HttpServletRequest request){
        logger.debug("add方法:,,Controller:{},,dianyingCollection:{}",this.getClass().getName(),dianyingCollection.toString());
        Wrapper<DianyingCollectionEntity> queryWrapper = new EntityWrapper<DianyingCollectionEntity>()
            .eq("dianying_id", dianyingCollection.getDianyingId())
            .eq("yonghu_id", dianyingCollection.getYonghuId())
            .eq("dianying_collection_types", dianyingCollection.getDianyingCollectionTypes())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        DianyingCollectionEntity dianyingCollectionEntity = dianyingCollectionService.selectOne(queryWrapper);
        if(dianyingCollectionEntity==null){
            dianyingCollection.setInsertTime(new Date());
            dianyingCollection.setCreateTime(new Date());
        dianyingCollectionService.insert(dianyingCollection);
            return R.ok();
        }else {
            return R.error(511,"您已经收藏过了");
        }
    }
}

五,相关作品展示

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

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

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

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

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

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


相关文章
|
6月前
|
Java 关系型数据库 MySQL
基于Web的影院信息管理系统设计与实现(论文+源码)_kaic
基于Web的影院信息管理系统设计与实现(论文+源码)_kaic
|
6月前
|
存储 前端开发 JavaScript
基于Web的线上影院订票系统的设计与实现
基于Web的线上影院订票系统的设计与实现
|
6月前
|
存储 前端开发 JavaScript
基于Web的线上影院订票系统的设计与实现
电影院购票系统可以对影院影片信息进行集中管理,可以真正避免传统管理的缺陷。电影院购票系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,电影院购票系统都可以轻松应对。所以,电影院购票系统的运用是让影院信息管理升级的最好方式。它可以实现信息处理的便利化要求,还可以规范信息处理的流程,让事务处理成为管理人员手中的一件简单事,而不是之前手工处理时的困难事。尽管电影院购票系统具备较完善的功能,但是也需要管理人员利用闲暇时间提升自身素质以及个人能力,在操作电影院购票系统时可以最大化运用电影院购票系统提供的功能,让系统在
651 0
|
存储 Java
Java实现Web航空订票系统(servlet+jdbc+jsp+mysql)(下)
Java实现Web航空订票系统(servlet+jdbc+jsp+mysql)
221 0
|
Java 关系型数据库 MySQL
Java实现Web航空订票系统(servlet+jdbc+jsp+mysql)(上)
Java实现Web航空订票系统(servlet+jdbc+jsp+mysql)
645 0
Java实现Web航空订票系统(servlet+jdbc+jsp+mysql)(上)
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
113 3
|
23天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
125 45
|
5天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
19 2
|
19天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
33 1
|
22天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
下一篇
无影云桌面