Projeto e implementação de sistema de reserva de ingressos de cinema online baseado na web

Página inicial do autor: Programando guindastes de papel

Sobre o autor: Java, front-end e Python foram desenvolvidos há muitos anos e trabalharam como engenheiros, gerentes de projeto e arquitetos.

Conteúdo principal: desenvolvimento de projetos Java, desenvolvimento de projetos Python, dados universitários e desenvolvimento de projetos de IA, design de projetos de microcontroladores, compilação de tecnologia de entrevista, compartilhamento de tecnologia mais recente

Colecione, curta e não se perca, é bom acompanhar o autor.

Obtenha o código-fonte no final do artigo

 

Número do projeto: BS-PT-097

1. Introdução ao meio ambiente

Localidade: Java: jdk1.8

Banco de dados: Mysql: mysql5.7

Servidor de aplicativos: Tomcat: tomcat8.5.31

Ferramentas de desenvolvimento: IDEA ou eclipse

Tecnologia de desenvolvimento: Springboot + Vue

2. Introdução ao Projeto

A melhoria dos padrões materiais de vida permitiu que as pessoas da nova era consumissem mais entretenimento, mas os filmes ainda são um lugar importante para passatempos e passatempos amadores. Três anos após a epidemia, muitas salas de cinema tiveram que fechar ou suspender as operações. Haverá uma certa recuperação do consumo em 2023, mas ainda há muitas dificuldades. Se novas tecnologias, novos meios de comunicação e outros métodos são utilizados para injetar nova vitalidade no cinema, trazer mais tráfego e atrair mais clientes, este é o foco principal deste tópico. Este tópico é baseado principalmente na tecnologia de desenvolvimento WEB, usando Springboot + Vue para completar um sistema de plataforma de compra de ingressos de cinema online baseado em formulário WEB.Espera-se que, através da aplicação da tecnologia da Internet, possa ajudar os cinemas a fazer mais promoção e ajudá-los a superar dificuldades. Este tópico é baseado principalmente na tecnologia de desenvolvimento back-end e na tecnologia de desenvolvimento front-end aprendida e, com base em pesquisas e análises de campo, são projetadas as funções relevantes da plataforma de ingressos de cinema.O desenvolvimento back-end usa a estrutura Springboot para integrar MybatisPlus e o desenvolvimento front-end usam componentes Vue + ElementUI para desenvolver e implementar armazenamento de dados. Use MYSQL para implementação de armazenamento e complete os módulos de negócios correspondentes, como compra de ingressos on-line, comunicação em fórum e visualização de notícias.

O sistema de compra de ingressos de cinema pode gerenciar centralmente as informações dos filmes de cinema e realmente evitar as deficiências da gestão tradicional. O sistema de compra de ingressos de cinema é um sistema aplicativo projetado e implementado usando tecnologia de desenvolvimento de software. Ele pode obter processamento rápido de informações. Seja para adição de dados, manutenção de dados e estatísticas, bem como consulta de dados e outros requisitos de processamento, a compra de ingressos de cinema sistema pode Pode ser tratado facilmente. Portanto, a utilização de sistemas de compra de ingressos de cinema é a melhor forma de atualizar a gestão da informação cinematográfica. Ele pode atender aos requisitos de conveniência do processamento de informações e também padronizar o processo de processamento de informações, tornando o processamento de transações uma tarefa simples nas mãos dos gerentes, em vez da difícil tarefa de processamento manual antes. Embora o sistema de compra de bilhetes de cinema tenha funções relativamente completas, os gestores também precisam de utilizar o seu tempo livre para melhorar a sua própria qualidade e capacidades pessoais.Ao operar o sistema de compra de bilhetes de cinema, podem maximizar a utilização das funções proporcionadas pela compra de bilhetes de cinema. sistema, para que o sistema possa atender às necessidades dos usuários de alto nível.Ao processar dados de forma eficiente, ele pode sempre operar de forma estável e também pode garantir a confiabilidade dos dados e a qualidade do processamento de dados.

Os usuários do sistema são divididos em duas categorias, uma é o usuário membro front-end e a outra é o usuário administrador back-end. A seguir, é usado um diagrama de casos de uso para mostrar os casos de uso funcionais dos dois tipos de usuários.

1. Usuários membros front-end: após se registrar e fazer login, você pode realizar operações de dados relevantes on-line, incluindo principalmente visualização de notícias, recomendação de filmes (recomendação de filmes correspondentes aos usuários com base no comportamento operacional do usuário), visualização de informações de filmes e ingressos on-line operações de compra. Ao mesmo tempo, você pode coletar e avaliar filmes, os amantes do cinema também podem se comunicar on-line no fórum de comunicação fornecido no front-end do sistema. O módulo de centro pessoal pode gerenciar seus próprios dados de pedidos, dados de coleta, avaliação dados, etc.

Figura 3-1 Caso de uso de membro

2. Usuários membros de back-end: após o login, o administrador pode realizar operações relevantes de gerenciamento de dados em segundo plano, que incluem principalmente módulos como gerenciamento de notícias, gerenciamento de filmes, gerenciamento de tipo de filme, gerenciamento de pedidos, gerenciamento de avaliação, gerenciamento de usuários, notícias gerenciamento, gerenciamento de fórum, etc. A exibição específica é mostrada na Figura 3-2 abaixo.

Figura 3-2 Caso de uso de funcionário administrador

3. Exibição do sistema

Esta parte mostra principalmente o efeito final da codificação com base na análise de demanda inicial e no design relacionado.O que precisa ser exibido é um sistema de site de compra de ingressos on-line completo e utilizável. A implementação do sistema é dividida em implementação das funções front-end e implementação das funções de gerenciamento back-end do sistema. O seguinte mostra a implementação da função front-end e a interface de implementação da função back-end do sistema, respectivamente.

5.1 Implementação de funções de usuário em segundo plano

5.1.1Gerenciamento de informações do usuário

A Figura 5.1 mostra a página de gerenciamento de informações do usuário. As funções fornecidas por esta página aos administradores incluem: gerenciamento de consultas de informações do usuário, informações do usuário podem ser excluídas, informações do usuário podem ser modificadas, informações do usuário podem ser adicionadas e consultas difusas sobre nomes de usuários também podem ser executada.Operação de consulta condicional.

Figura 5.1 Página de gerenciamento de informações do usuário

5. 1.2 Gerenciamento de informações de filmes

A Figura 5.2 mostra a página de gerenciamento de informações do filme. As funções fornecidas aos administradores nesta página incluem: visualizar dados de informações do filme publicados, modificar informações do filme, invalidar as informações do filme e, em seguida, excluí-las. Isso também desfoca o nome das informações do filme. Consulta informações do filme, consulta de tipo de informação e outras condições.

Figura 5.2 Página de gerenciamento de informações do filme

5. 1.3 Gestão de avaliação de filmes

A Figura 5.3 mostra a página de gerenciamento de avaliação de filmes. As funções fornecidas aos administradores nesta página incluem: consulta condicional baseada na avaliação de filmes e a capacidade de adicionar, modificar, consultar, etc.

Figura 5.3 Página de gerenciamento de avaliação de filmes

5. 1.4 Gestão de informações de notícias

A Figura 5.4 mostra a página de gerenciamento de informações de notícias. As funções fornecidas aos administradores nesta página incluem: adicionar, modificar, consultar operações, etc.

Figura 5.4 Página de gerenciamento de informações de notícias

5.2 Implementação de funções de usuário front-end

5.2.1 Cadastro e login do usuário

Os usuários front-end que se registram e fazem login podem realizar reserva de ingressos on-line, interação on-line e outras operações. Essas operações exigem status de associação. A seguir é mostrada a interface de registro e login para usuários front-end do sistema.

Figura 5.5 Página de registro de usuário

5.2.2 Navegação de filmes

Na página inicial do sistema de reserva de filmes, os usuários podem navegar pelas informações dos filmes por categoria ou realizar consultas difusas com base nos nomes dos filmes. As informações dos filmes são exibidas na paginação. A interface frontal da lista de filmes é mostrada abaixo.

Figura 5.7 Página da lista de filmes front-end

5.2.3 Seleção de assentos de cinema e reserva de ingressos

Os usuários podem visualizar os detalhes do filme na página inicial do sistema de reserva de ingressos de cinema, nesta interface eles podem selecionar a data e hora, selecionar o assento correspondente e comprar ingressos online.

Figura 5.8 Página da lista de filmes front-end


Outras funções não serão exibidas uma por uma

4. Exibição do código principal


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,"您已经收藏过了");
        }
    }


}

5. Exibição de trabalhos relacionados

Projetos práticos baseados em desenvolvimento Java, desenvolvimento Python, desenvolvimento PHP, desenvolvimento C# e outras linguagens relacionadas

Projetos práticos de front-end desenvolvidos com base em Nodejs, Vue e outras tecnologias de front-end

Trabalhos relacionados baseados no miniaplicativo WeChat e no desenvolvimento de aplicativos Android APP

Desenvolvimento e aplicação de Internet das Coisas embarcada baseada em 51 microcontroladores e outros dispositivos embarcados

Aplicativos inteligentes de IA baseados em vários algoritmos

Vários sistemas de gerenciamento e recomendação de dados baseados em big data

 

 

Acho que você gosta

Origin blog.csdn.net/BS009/article/details/133278501
Recomendado
Clasificación