基于java+ssm+vue的在线电影票购买系统

项目介绍

社会和科技的不断进步带来更便利的生活,计算机技术也越来越平民化。二十一世纪是数据时代,各种信息经过统计分析都可以得到想要的结果,所以也可以更好的为人们工作、生活服务。电影是生活娱乐的一部分,特别对喜欢看电影的用户来说是非常重要的事情。把计算机技术和影院售票相结合可以更符合现代、用户的要求,实现更为方便的购买电影票的方式。

本基于Java Web的在线电影票购买系统采用Java语言和Vue技术,框架采用SSM,搭配MySQL数据库,运行在Idea里。本基于Java Web的在线电影票购买系统提供管理员、用户两种角色的服务。总的功能包括电影的查询、电影票的购买、评价和订单管理。本系统可以帮助管理员更新电影信息和管理订单信息,帮助用户实现在线的购票方式,并可以实现选座。本系统采用成熟技术开发可以完成影院售票管理的相关工作。

3.1系统功能结构设计
系统的功能结构是采用树形图来绘制功能设计。根据分析所得,本系统的功能设计为管理员、用户两部分。管理员为电影管理、公告管理、订单管理、电影类型管理、用户管理、个人中心管理等,用户的功能为查询电影,在线选座、购票、管理个人信息等。用户可以注册进行登录。本基于Java Web的在线电影票购买系统的功能结构设计图如下图3-1所示:
在这里插入图片描述

开发环境

编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序/vue/爬虫/c#/asp.net

系统实现

4.1用户登录功能的详细实现
用户登录界面起到验证身份的作用,本界面采用粉色背景进行设计。在用户登录界面里设置了程序的名称和用户、密码的文本框。在文本框下是用户登录、注册用户两个按钮。用户在信息输入完成后可以使用相关按钮进行相对应的操作。用户登录功能的实现界面如下图4-1所示:
在这里插入图片描述

图4-1用户登录实现界面

4.2管理员权限的功能实现
4.2.1用户信息管理功能的详细实现
管理员负责用户信息的审核和管理,用户的账号和密码都可以由管理员在此功能里看到。管理员查询用户信息的功能实现如下图4-2所示:
在这里插入图片描述

图4-2管理员查询用户信息的实现界面

4.2.2电影管理功能的详细实现
管理员可以对电影的信息进行发布和修改、删除。本功能可以实现电影的定时更新和审核管理。管理员查询电影信息的实现界面如下图4-3所示:
在这里插入图片描述

图4-3管理员查询电影信息的实现界面

4.2.3基础数据管理功能的详细实现
本功能包括对公告类型信息和电影类型进行管理。可以添加、查询公告类型信息和电影类型信息。基础数据管理功能的实现详情如下图4-4所示:
在这里插入图片描述

图4-4基础数据管理功能的实现界面

4.2.4电影评价管理功能的详细实现
管理员可以查看电影的评价信息,做好评价收集可以更好的安排电影。电影评价功能的实现界面如下图4-5所示:
在这里插入图片描述

图4-5电影评价信息的实现界面

4.2.5电影订单管理功能的详细实现
管理员可以管理用户的订单,用户是否付款也可以在该功能里看到。电影订单管理功能的实现界面如下图4-6所示:
在这里插入图片描述

图4-6电影订单管理功能的实现界面

4.2.6个人中心管理功能的详细实现
管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员添加管理员账号的实现界面如下图4-7所示:
在这里插入图片描述

图4-7添加管理员账号功能的实现界面

4.2.7公告管理功能的实现界面
管理员可以发布公告和实现公告的编辑、删除。管理员查询公告信息的实现界面如下图4-8所示:
在这里插入图片描述

图4-8查询公告信息的实现界面

4.2.8轮播图信息管理功能的实现界面
管理员可以添加图片和设置首页的图片播放。查询轮播图信息的实现界面如下图4-9所示:
在这里插入图片描述

图4-9轮播图信息的查找界面

4.3用户权限的功能详细实现
4.3.1电影查询功能的详细实现
用户可以根据电影的发布时间查询电影信息。用户查询电影的界面实现如下图4-10所示:
在这里插入图片描述

图4-10电影查询功能的运行界面

4.3.2在线选座功能的详细实现
用户在想要购买电影票时可以选择自己想坐的座位,已选择的座位以绿色表示,未选择的座位以灰色表示。在线选座功能的实现界面如下图4-11所示:
在这里插入图片描述

图4-11在线选座功能的实现界面

4.3.3我的订票管理功能的详细实现
选座完成后可以进行订单支付和管理。我的订票管理功能的实现界面如下图4-12所示:
在这里插入图片描述

图4-12我的订票管理功能的运行界面

4.3.4用户注册功能的详细实现
非用户可以在注册功能里实现成为用户。在注册界面里按照要求填写信息就可以完成。用户注册的实现界面如下图4-13所示:
在这里插入图片描述

图4-13用户注册功能的运行界面

核心代码

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("/dianying")
public class DianyingController {
    private static final Logger logger = LoggerFactory.getLogger(DianyingController.class);

    @Autowired
    private DianyingService dianyingService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service

    @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"));
        params.put("dianyingDeleteStart",1);params.put("dianyingDeleteEnd",1);
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = dianyingService.queryPage(params);

        //字典表数据转换
        List<DianyingView> list =(List<DianyingView>)page.getList();
        for(DianyingView 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);
        DianyingEntity dianying = dianyingService.selectById(id);
        if(dianying !=null){
            //entity转view
            DianyingView view = new DianyingView();
            BeanUtils.copyProperties( dianying , view );//把实体数据重构到view中

            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody DianyingEntity dianying, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,dianying:{}",this.getClass().getName(),dianying.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");

        Wrapper<DianyingEntity> queryWrapper = new EntityWrapper<DianyingEntity>()
            .eq("dianying_name", dianying.getDianyingName())
            .eq("dianying_address", dianying.getDianyingAddress())
            .eq("dianying_types", dianying.getDianyingTypes())
            .eq("dianying_shijian", dianying.getDianyingShijian())
            .eq("zuowei_number", dianying.getZuoweiNumber())
            .eq("dianying_clicknum", dianying.getDianyingClicknum())
            .eq("shangxia_types", dianying.getShangxiaTypes())
            .eq("dianying_delete", dianying.getDianyingDelete())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        DianyingEntity dianyingEntity = dianyingService.selectOne(queryWrapper);
        if(dianyingEntity==null){
            dianying.setDianyingClicknum(1);
            dianying.setShangxiaTypes(1);
            dianying.setDianyingDelete(1);
            dianying.setCreateTime(new Date());
            dianyingService.insert(dianying);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody DianyingEntity dianying, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,dianying:{}",this.getClass().getName(),dianying.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
        //根据字段查询是否有相同数据
        Wrapper<DianyingEntity> queryWrapper = new EntityWrapper<DianyingEntity>()
            .notIn("id",dianying.getId())
            .andNew()
            .eq("dianying_name", dianying.getDianyingName())
            .eq("dianying_address", dianying.getDianyingAddress())
            .eq("dianying_types", dianying.getDianyingTypes())
            .eq("dianying_shijian", dianying.getDianyingShijian())
            .eq("zuowei_number", dianying.getZuoweiNumber())
            .eq("dianying_clicknum", dianying.getDianyingClicknum())
            .eq("shangxia_types", dianying.getShangxiaTypes())
            .eq("dianying_delete", dianying.getDianyingDelete())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        DianyingEntity dianyingEntity = dianyingService.selectOne(queryWrapper);
        if("".equals(dianying.getDianyingPhoto()) || "null".equals(dianying.getDianyingPhoto())){
                dianying.setDianyingPhoto(null);
        }
        if(dianyingEntity==null){
            dianyingService.updateById(dianying);//根据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());
        ArrayList<DianyingEntity> list = new ArrayList<>();
        for(Integer id:ids){
            DianyingEntity dianyingEntity = new DianyingEntity();
            dianyingEntity.setId(id);
            dianyingEntity.setDianyingDelete(2);
            list.add(dianyingEntity);
        }
        if(list != null && list.size() >0){
            dianyingService.updateBatchById(list);
        }
        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<DianyingEntity> dianyingList = 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("../../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){
                            //循环
                            DianyingEntity dianyingEntity = new DianyingEntity();
//                            dianyingEntity.setDianyingName(data.get(0));                    //电影名称 要改的
//                            dianyingEntity.setDianyingPhoto("");//详情和图片
//                            dianyingEntity.setDianyingAddress(data.get(0));                    //放映地点 要改的
//                            dianyingEntity.setDianyingTypes(Integer.valueOf(data.get(0)));   //电影类型 要改的
//                            dianyingEntity.setDianyingShijian(data.get(0));                    //开始时间 要改的
//                            dianyingEntity.setDianyingOldMoney(data.get(0));                    //电影原价 要改的
//                            dianyingEntity.setDianyingNewMoney(data.get(0));                    //现价 要改的
//                            dianyingEntity.setZuoweiNumber(Integer.valueOf(data.get(0)));   //座位 要改的
//                            dianyingEntity.setDianyingClicknum(Integer.valueOf(data.get(0)));   //热度 要改的
//                            dianyingEntity.setShangxiaTypes(Integer.valueOf(data.get(0)));   //是否上架 要改的
//                            dianyingEntity.setDianyingDelete(1);//逻辑删除字段
//                            dianyingEntity.setDianyingContent("");//详情和图片
//                            dianyingEntity.setCreateTime(date);//时间
                            dianyingList.add(dianyingEntity);


                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        dianyingService.insertBatch(dianyingList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            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 = dianyingService.queryPage(params);

        //字典表数据转换
        List<DianyingView> list =(List<DianyingView>)page.getList();
        for(DianyingView 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);
        DianyingEntity dianying = dianyingService.selectById(id);
            if(dianying !=null){

                //点击数量加1
                dianying.setDianyingClicknum(dianying.getDianyingClicknum()+1);
                dianyingService.updateById(dianying);

                //entity转view
                DianyingView view = new DianyingView();
                BeanUtils.copyProperties( dianying , view );//把实体数据重构到view中

                //修改对应字典表字段
                dictionaryService.dictionaryConvert(view, request);
                return R.ok().put("data", view);
            }else {
                return R.error(511,"查不到数据");
            }
    }


    /**
    * 前端保存
    */
    @RequestMapping("/add")
    public R add(@RequestBody DianyingEntity dianying, HttpServletRequest request){
        logger.debug("add方法:,,Controller:{},,dianying:{}",this.getClass().getName(),dianying.toString());
        Wrapper<DianyingEntity> queryWrapper = new EntityWrapper<DianyingEntity>()
            .eq("dianying_name", dianying.getDianyingName())
            .eq("dianying_address", dianying.getDianyingAddress())
            .eq("dianying_types", dianying.getDianyingTypes())
            .eq("dianying_shijian", dianying.getDianyingShijian())
            .eq("zuowei_number", dianying.getZuoweiNumber())
            .eq("dianying_clicknum", dianying.getDianyingClicknum())
            .eq("shangxia_types", dianying.getShangxiaTypes())
            .eq("dianying_delete", dianying.getDianyingDelete())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        DianyingEntity dianyingEntity = dianyingService.selectOne(queryWrapper);
        if(dianyingEntity==null){
            dianying.setDianyingDelete(1);
            dianying.setCreateTime(new Date());
        dianyingService.insert(dianying);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }


}

论文参考

在这里插入图片描述

目 录
摘 要 1
Abstract 2
第1章 绪论 5
1.1课题研究背景与现状 5
1.2课题实现目的和研究意义 5
1.3课题研究内容 5
1.4论文结构安排 6
第2章 系统分析 7
2.1系统开发中使用相关技术介绍 7
2.1.1Java介绍 7
2.1.2MySQL数据库介绍 7
2.1.3B/s架构介绍 8
2.1.4 Tomcat服务器介绍 8
2.1.5Vue技术介绍 9
2.2系统可行性分析 9
2.2.1经济可行性分析 9
2.2.2操作可行性分析 10
2.2.3技术可行性分析 10
2.3系统需求分析 10
2.4系统性能分析 10
2.5系统功能分析 11
2.6系统操作流程分析 11
第3章 系统设计 13
3.1系统功能结构设计 13
3.2数据库设计 13
3.2.1数据ER图设计 14
3.2.2数据库表设计 15
第4章 系统详细实现 20
4.1用户登录功能的详细实现 20
4.2管理员权限的功能实现 20
4.2.1用户信息管理功能的详细实现 20
4.2.2电影管理功能的详细实现 21
4.2.3基础数据管理功能的详细实现 21
4.2.4电影评价管理功能的详细实现 22
4.2.5电影订单管理功能的详细实现 22
4.2.6个人中心管理功能的详细实现 23
4.2.7公告管理功能的实现界面 23
4.2.8轮播图信息管理功能的实现界面 24
4.3用户权限的功能详细实现 24
4.3.1电影查询功能的详细实现 24
4.3.2在线选座功能的详细实现 25
4.3.3我的订票管理功能的详细实现 25
4.3.4用户注册功能的详细实现 26
第5章 系统测试 27
5.1系统测试的方法与选择 27
5.2测试环境与测试条件 27
5.3详细功能测试 27
5.3.1用户登录功能的测试 27
5.3.2电影管理功能的测试 28
5.3.3购票功能的测试 29
5.3.4选座功能的测试 29
5.4测试总结 30
总 结 31
参考文献 32
致 谢 34

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值