JAVA电影购票系统

一、功能描述

电影购票系统简介、项目功能演示

日志框架搭建、系统角色分析

首页设计、登录、商家界面、用户界面实现

商家-详情页设计、影片上架、退出

商家-影片下架、影片修改

用户-展示全部影片

用户-购票功能 用户-评分功能

用户-评分降序展示

用户-根据片名查询全部影片信息

D:\Java\jre\bin\java.exe "-javaagent:D:\java\Intellij_IDEA\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar=64025:D:\java\Intellij_IDEA\IntelliJ IDEA 2021.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\java\jre\jre\lib\charsets.jar;D:\java\jre\jre\lib\deploy.jar;D:\java\jre\jre\lib\ext\access-bridge-64.jar;D:\java\jre\jre\lib\ext\cldrdata.jar;D:\java\jre\jre\lib\ext\dnsns.jar;D:\java\jre\jre\lib\ext\jaccess.jar;D:\java\jre\jre\lib\ext\jfxrt.jar;D:\java\jre\jre\lib\ext\localedata.jar;D:\java\jre\jre\lib\ext\nashorn.jar;D:\java\jre\jre\lib\ext\sunec.jar;D:\java\jre\jre\lib\ext\sunjce_provider.jar;D:\java\jre\jre\lib\ext\sunmscapi.jar;D:\java\jre\jre\lib\ext\sunpkcs11.jar;D:\java\jre\jre\lib\ext\zipfs.jar;D:\java\jre\jre\lib\javaws.jar;D:\java\jre\jre\lib\jce.jar;D:\java\jre\jre\lib\jfr.jar;D:\java\jre\jre\lib\jfxswt.jar;D:\java\jre\jre\lib\jsse.jar;D:\java\jre\jre\lib\management-agent.jar;D:\java\jre\jre\lib\plugin.jar;D:\java\jre\jre\lib\resources.jar;D:\java\jre\jre\lib\rt.jar;D:\java\code\javase\out\production\Movie;D:\java\code\javase\Movie\lib\logback-classic-1.2.3.jar;D:\java\code\javase\Movie\lib\logback-core-1.2.3.jar;D:\java\code\javase\Movie\lib\slf4j-api-1.7.26.jar com.lou.run.movieSystem
=========电影首页=========
1、登录
2、用户注册
3、商家注册
4、退出系统
请输入操作命令:
2
=============================用户注册========================
请输入登录名称:
老白
请输入登录密码:
121
请再次输入登录密码:
121
请输入真实名称:
白展堂
请输入性别:
男
请输入电话:
12
请输入账户金额:
123
老白注册成功
=========电影首页=========
1、登录
2、用户注册
3、商家注册
4、退出系统
请输入操作命令:
1
请输入登录名称:
老白
请输入登录密码:
111
密码错误
请输入登录名称:
老白
请输入登录密码:
121
登录成功
白展堂女士欢迎您进入系统	余额:123.0
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
1
=============================展示全部商家排片信息========================
橘子国际影城		电话:110110		地址:火星6号2B二层
片名			主演			时长			评分			票价			余票数量			放映时间
东邪西毒		大环境		180.0		0.0			100.0			200			2022/05/18 12:00:00
==================================================================================
青苹果国际影城		电话:110110		地址:火星8号8B八层
片名			主演			时长			评分			票价			余票数量			放映时间
武林外传		白展堂		180.0		0.0			100.0			200			2022/05/18 18:00:00
==================================================================================
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
5
白展堂先生您好	余额:123.0
您还没有购买记录
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
6
还没有评分数据
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
4
=============================展示全部商家排片信息========================
橘子国际影城		电话:110110		地址:火星6号2B二层
片名			主演			时长			评分			票价			余票数量			放映时间
东邪西毒		大环境		180.0		0.0			100.0			200			2022/05/18 12:00:00
==================================================================================
青苹果国际影城		电话:110110		地址:火星8号8B八层
片名			主演			时长			评分			票价			余票数量			放映时间
武林外传		白展堂		180.0		0.0			100.0			200			2022/05/18 18:00:00
==================================================================================
=============================用户购票功能========================
请输入您想要买票的影城:
青苹果
请输入需要购买电影的名称:
武林
请您输入需要购买的票数:
12
您的钱不够
是否继续买票?(y/f):
y
请您输入需要购买的票数:
1
您成功购买了1张《武林外传》,花费了100.0元钱
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
5
白展堂先生您好	余额:23.0
您已经购买的电影为:
武林外传
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
3
请您对:武林外传进行打分(0-10):
5
=============================展示全部商家排片信息========================
橘子国际影城		电话:110110		地址:火星6号2B二层
片名			主演			时长			评分			票价			余票数量			放映时间
东邪西毒		大环境		180.0		0.0			100.0			200			2022/05/18 12:00:00
==================================================================================
青苹果国际影城		电话:110110		地址:火星8号8B八层
片名			主演			时长			评分			票价			余票数量			放映时间
武林外传		白展堂		180.0		0.0			100.0			199			2022/05/18 18:00:00
==================================================================================
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
6
武林外传		5.0
============电影客户界面===================
请您选择要操作的功能:
1、展示全部影片信息功能:
2、根据电影名称查询电影信息:
3、评分功能:
4、购票功能:
5、显示用户详细信息:
6、评分降序展示:
7、退出系统:
请输入您要操作的命令:
7

二、功能实现

1、系统角色类准备

集成日志框架、用于后期记录日志信息。

定义一个电影类Movie类,Movie类包含:片名、主演、评分、时长、票价、余票 系统包含2个用户角色:客户、商家。存在大量相同属性信息。

定义User类作为父类,属性:登录名称、密码、真实名称、性别、电话、账户金额

定义Business类代表商家角色,属性:店铺名称、地址。

定义Customer类代表客户角色,属性: 空

定义集合List<User>用户存放系统注册的用户对象信息。

定义集合Map<Business, List<Movie>>存放商家和其排片信息。

准备一些测试数据。

(1)定义一个电影类Movie类,Movie类包含:片名、主演、评分、时长、票价、余票

package com.lou.bean;

import java.util.Date;

/**
 * 定义一个电影类Movie类,Movie类包含:片名、主演、评分、时长、票价、余票
 */
public class movie {
    private String name;
    private String actor;
    private double score;
    private double time;
    private double price;
    private int num;
    private Date startData;//放映时间

    public movie() {
    }

    @Override
    public String toString() {
        return "movie{" +
                "name='" + name + '\'' +
                ", actor='" + actor + '\'' +
                ", score=" + score +
                ", time=" + time +
                ", price=" + price +
                ", num=" + num +
                ", startData=" + startData +
                '}';
    }

    public movie(String name, String actor, double score, double time, double price, int num, Date startData) {
        this.name = name;
        this.actor = actor;
        this.score = score;
        this.time = time;
        this.price = price;
        this.num = num;
        this.startData = startData;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public double getTime() {
        return time;
    }

    public void setTime(double time) {
        this.time = time;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public Date getStartData() {
        return startData;
    }

    public void setStartData(Date startData) {
        this.startData = startData;
    }
}

(2)定义User类作为父类,属性:登录名称、密码、真实名称、性别、电话、账户金额

package com.lou.bean;

import java.io.InputStreamReader;

/**
 * 定义User类作为父类,属性:登录名称、密码、真实名称、性别、电话、账户金额
 */
public class User {
    private String loginName;
    private String password;
    private String userName;
    private char sex;
    private String phone;
    private double money;

    public User(String loginName, String password, String userName, char sex, String phone, double money) {
        this.loginName = loginName;
        this.password = password;
        this.userName = userName;
        this.sex = sex;
        this.phone = phone;
        this.money = money;
    }

    public User() {
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}

(3)定义Business类代表商家角色,属性:店铺名称、地址。定义Customer类代表客户角色,属性: 空

package com.lou.bean;

/**
 * 定义Business类代表商家角色,属性:店铺名称、地址。
 *
 * 定义Customer类代表客户角色,属性: 空
 */
public class Business extends User{
    //独有属性
    private String shopName;
    private String shopAddress;

    public String getShopName() {
        return shopName;
    }

    public void setShopName(String shopName) {
        this.shopName = shopName;
    }

    public String getShopAddress() {
        return shopAddress;
    }

    public void setShopAddress(String shopAddress) {
        this.shopAddress = shopAddress;
    }
}
package com.lou.bean;

public class Custom extends User{
    
}

(4)定义集合List<User>用户存放系统注册的用户对象信息。 定义集合Map<Business,List<Movie>>存放商家和其排片信息

    //定义集合List<User>用户存放系统注册的用户对象信息。
    public static final List<User>ALL_USERS=new ArrayList<>();

    //定义集合Map<Business, List<Movie>>存放商家和其排片信息。
    public static final Map<Business, List<movie>>ALL_MOVIE=new HashMap<>();

(5)准备一些测试数据(代码块)

 //准备一些测试数据。(代码块)
    static {
        Custom c = new Custom();
        c.setLoginName("备");
        c.setPassword("123456");
        c.setUserName("刘备");
        c.setSex('男');
        c.setMoney(10000);
        c.setPhone("110110");
        ALL_USERS.add(c);

        Custom c1 = new Custom();
        c1.setLoginName("羽");
        c1.setPassword("123456");
        c1.setUserName("羽");
        c1.setSex('女');
        c1.setMoney(2000);
        c1.setPhone("111111");
        ALL_USERS.add(c1);

        Business b = new Business();
        b.setLoginName("小猫");
        b.setPassword("123456");
        b.setUserName("小明");
        b.setMoney(0);
        b.setSex('男');
        b.setPhone("110110");
        b.setShopAddress("火星6号2B二层");
        b.setShopName("橘子国际影城");
        ALL_USERS.add(b);
        // 注意,商家一定需要加入到店铺排片信息中去
        List<movie> movies = new ArrayList<>();
        ALL_MOVIES.put(b , movies); // b = []

        Business b2 = new Business();
        b2.setLoginName("小狗");
        b2.setPassword("123456");
        b2.setUserName("小玲");
        b2.setMoney(0);
        b2.setSex('女');
        b2.setPhone("110110");
        b2.setShopAddress("火星8号8B八层");
        b2.setShopName("青苹果国际影城");
        ALL_USERS.add(b2);
        // 注意,商家一定需要加入到店铺排片信息中去
        List<movie> movies3 = new ArrayList<>();
        ALL_MOVIES.put(b2 , movies3); // b2 = []
    }

2、首页、登录、商家界面、用户界面实现

首页需要包含登录,商家入驻,客户注册功能。

商家和客户可以共用一个登录功能。

判断登录成功的用户的真实类型,根据用户类型完成对应的操作界面设计。

(1) 首页需要包含登录,商家入驻,客户注册功能

 /**
     * 首页
     */
    private static void showMain() {
        System.out.println("=========电影首页=========");
        System.out.println("1、登录");
        System.out.println("2、用户注册");
        System.out.println("3、商家注册");
        System.out.println("请输入操作命令:");
        String command = SC.nextLine();
        while (true) {
            switch (command) {
                case "1":
                    break;
                case "2":
                    break;
                case "3":
                    break;
                default:
                    System.out.println("命令有误,请重新确认");
            }
        }
    }

(2)商家和客户可以共用一个登录功能

/**
     * 登录
     */
    private static void login() {
        while (true) {
            System.out.println("请输入登录名称:");
            String loginName=SC.nextLine();
            System.out.println("请输入登录密码:");
            String loginPassword=SC.nextLine();
            //根据登录名称查询用户对象
            User user=getUserByLoginName(loginName);
            if(user!=null){
                //比对密码是否正确
                if(user.getPassword().equals(loginPassword)){
                    System.out.println("登录成功");
                }
                else {
                    System.out.println("密码错误");
                }
            }
            else {
                System.out.println("登录名称错误,请确认");
            }
        }
    }

(3)判断登录成功的用户的真实类型,根据用户类型完成对应的操作界面设计

                    if(user instanceof Custom){
                        //普通用户
                        showCustomer();
                    }
                    else {
                        //商家用户
                        showBusiness();
                    }

 3、商家功能-展示详情、影片上架、退出

展示本商家的信息和其排片情况。

提供影片上架功能:就是创建一个影片对象,存入到商家的集合中去。

退出,需要回到登录的首页。

提供影片下架功能:其实就是从商家的集合中删除影片对象。

影片修改功能:拿到需要修改的影片对象,修改里面的数据。

(1) 展示本商家的信息和其排片情况

    /**
     * 展示本商家的信息和其排片情况。
     */
    private static void showBusinessInfos() {
        //根据商家对象,作为Map集合的键,提取对应的值就是排片信息
        //loginUser属于User类,要转为Business类才能访问到商家独有属性
        Business business=(Business)loginUser;
        System.out.println(business.getShopName()+"\t\t电话:"+business.getPhone()+"\t\t地址:"+business.getShopAddress());
        List<movie>movies=ALL_MOVIES.get(loginUser);
        if(movies.size()>0){
            System.out.println("片名\t\t\t主演\t\t\t时长\t\t\t评分\t\t\t票价\t\t\t余票数量\t\t\t放映时间");
            for(movie m:movies){
                System.out.println(m.getName()+"\t\t"+m.getActor()+"\t\t\t"+m.getTime()+"\t\t\t"+m.getScore()+"\t\t\t"+
                        m.getPrice()+"\t\t\t"+m.getNum()+"\t\t\t"+sdf.format(m.getStartData()));
            }
        }
        else {
            System.out.println("当前影院无影片");
        }
    }

(2)提供影片上架功能:就是创建一个影片对象,存入到商家的集合中去

   /**
     * 提供影片上架功能:就是创建一个影片对象,存入到商家的集合中去
     */
    private static void addMovie() {
        Business business = (Business) loginUser;
        List<movie> movies = ALL_MOVIES.get(loginUser);

        System.out.println("请您输入新片名:");
        String name = SC.nextLine();
        System.out.println("请您输入主演:");
        String actor = SC.nextLine();
        System.out.println("请您输入时长:");
        String time = SC.nextLine();
        System.out.println("请您输入票价:");
        String price = SC.nextLine();
        System.out.println("请您输入票数:");
        String totalNumber = SC.nextLine(); // 200\n
        while (true) {
            try {
                System.out.println("请您输入影片放映时间:");
                String stime = SC.nextLine();
                movie m = new movie(name, actor, Double.valueOf(time), Double.valueOf(price)
                        , Integer.valueOf(totalNumber), sdf.parse(stime));
                movies.add(m);
                System.out.println("您已经成功上架了:《" + m.getName() + "》");
                return; // 直接退出去
            }
            catch (ParseException e) {
                e.printStackTrace();
                logger.error("时间解析出了问题");
            }
        }
    }

(3)提供影片下架功能:其实就是从商家的集合中删除影片对象

    /**
     * 提供影片下架功能:其实就是从商家的集合中删除影片对象
     */
    private static void deleteMovie() {
        Business business = (Business) loginUser;
        List<movie> movies = ALL_MOVIES.get(business);
        if (movies.size() == 0) {
            System.out.println("当前无影片可以下架");
            return;
        }
        System.out.println("输入要下架的电影名称:");
        String name = SC.nextLine();
        movie m = getMovieByName(name);
        if (m != null) {
            System.out.println("下架《"+m.getName()+"》成功");
            movies.remove(m);
            return;
        }
        System.out.println("没有找到这个名称的电影");
    }

(4)影片修改功能:拿到需要修改的影片对象,修改里面的数据

 /**
     * 影片修改功能:拿到需要修改的影片对象,修改里面的数据
     */
    private static void updateMovie() {
        Business business = (Business) loginUser;
        List<movie> movies = ALL_MOVIES.get(business);
        if (movies.size() == 0) {
            System.out.println("当前无影片可以修改");
            return;
        }
        System.out.println("输入要修改的电影名称:");
        String filmName = SC.nextLine();
        movie m = getMovieByName(filmName);
        if (m != null) {
            System.out.println("是否要修改片名(y/f):");
            String command1 = SC.nextLine();
            if (command1.equals("y")) {
                System.out.println("请您输入新片名:");
                String name = SC.nextLine();
                m.setName(name);
            }

            System.out.println("是否要修改主演(y/f):");
            String command2 = SC.nextLine();
            if (command2.equals("y")) {
                System.out.println("请您输入主演:");
                String actor = SC.nextLine();
                m.setActor(actor);
            }

            System.out.println("是否要修改时长(y/f):");
            String command3 = SC.nextLine();
            if (command3.equals("y")) {
                System.out.println("请您输入时长:");
                String time = SC.nextLine();
                m.setTime(Double.valueOf(time));
            }

            System.out.println("是否要修改票价(y/f):");
            String command4 = SC.nextLine();
            if (command4.equals("y")) {
                System.out.println("请您输入票价:");
                String price = SC.nextLine();
                m.setPrice(Double.valueOf(price));
            }

            System.out.println("是否要修改票数(y/f):");
            String command5 = SC.nextLine();
            if (command5.equals("y")) {
                System.out.println("请您输入票数:");
                String totalNumber = SC.nextLine(); // 200\n
                m.setNum(Integer.valueOf(totalNumber));
            }

            System.out.println("是否要修改影片放映时间(y/f):");
            String command6 = SC.nextLine();
            if (command6.equals("y")) {
                while (true) {
                    try {
                        System.out.println("请您输入影片放映时间(2022/05/18 12:00:00):");
                        String stime = SC.nextLine();
                        m.setStartData(sdf.parse(stime));
                        System.out.println("您已经成功修改了:《" + m.getName() + "》");
                        showBusinessInfos();
                        return; // 直接退出去
                    } catch (ParseException e) {
                        e.printStackTrace();
                        logger.error("时间解析出了问题");
                    }
                }
            }
            System.out.println("您已经成功修改了:《" + m.getName() + "》");
            showBusinessInfos();
            return;
        }
        System.out.println("没有找到这个名称的电影");
    }

4、用户功能

展示全部影片信息

购票操作

评分功能[拓展]

评分降序展示

根据片名查询全部影片信息

(1) 展示全部影片信息

  /**
     * 展示全部影片信息
     */
    private static void showAllMovies() {
        System.out.println("=============================展示全部商家排片信息========================");
        ALL_MOVIES.forEach((business, movies) -> {
            System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() + "\t\t地址:" + business.getShopAddress());
            System.out.println("片名\t\t\t主演\t\t\t时长\t\t\t评分\t\t\t票价\t\t\t余票数量\t\t\t放映时间");
            for (movie m : movies) {
                System.out.println(m.getName() + "\t\t" + m.getActor() + "\t\t" + m.getTime() + "\t\t" + m.getScore() + "\t\t\t" +
                        m.getPrice() + "\t\t\t" + m.getNum() + "\t\t\t" + sdf.format(m.getStartData()));
            }
            System.out.println("==================================================================================");
        });
    }

(2)购票操作

   /**
     * 用户购票功能
     */
    private static void buyMovie() {
        showAllMovies();
        System.out.println("=============================用户购票功能========================");
        while (true) {
            System.out.println("请输入您想要买票的影城:");
            String shopName = SC.nextLine();
            //查询是否存在该商家
            Business business = getUserByShopName(shopName);
            if (business != null) {
                //此商家全部影片
                List<movie> movies = ALL_MOVIES.get(business);
                if (movies.size() > 0) {
                    while (true) {
                        System.out.println("请输入需要购买电影的名称:");
                        String movieName=SC.nextLine();
                        //在当前商家查询该电影对象
                        movie m=getMovieByShopName(movieName,business);
                        if(m!=null){
                            while (true) {
                                //开始购票
                                System.out.println("请您输入需要购买的票数:");
                                String movieNum=SC.nextLine();
                                int buyNum=Integer.valueOf(movieNum);
                                //判断电影票数是否足够
                                if(m.getNum()>=buyNum){
                                    //当前需要花费的金额
                                    double money= BigDecimal.valueOf(m.getPrice()).multiply(BigDecimal.valueOf(buyNum)).doubleValue();
                                    if(loginUser.getMoney()>=money){
                                        System.out.println("您成功购买了"+buyNum+"张《"+m.getName()+"》,花费了"+money+"元钱");
                                        //更新客户和商家数据
                                        loginUser.setMoney(loginUser.getMoney()-money);
                                        m.setNum(m.getNum()-buyNum);
                                        business.setMoney(business.getMoney()+money);
                                        return;
                                    }
                                    else {
                                        System.out.println("您的钱不够");
                                        System.out.println("是否继续买票?(y/f):");
                                        String command = SC.nextLine();
                                        switch (command) {
                                            case "y":
                                                break;
                                            default:
                                                System.out.println("好的");
                                                return;
                                        }
                                    }
                                }
                                else {
                                    System.out.println("票数不够,您当前最多购买"+m.getNum()+"张");
                                    System.out.println("是否继续买票?(y/f):");
                                    String command = SC.nextLine();
                                    switch (command) {
                                        case "y":
                                            break;
                                        default:
                                            System.out.println("好的");
                                            return;
                                    }
                                }
                            }
                        }
                        else {
                            System.out.println("该影城无该电影");
                        }
                    }
                } else {
                    System.out.println("该影城无电影放映");
                    System.out.println("是否继续买票?(y/f):");
                    String command = SC.nextLine();
                    switch (command) {
                        case "y":
                            break;
                        default:
                            System.out.println("好的");
                            return;
                    }
                }
            } else {
                System.out.println("对不起没有该影城");
            }
        }
    }

(3)评分功能[拓展]

   /**
     * 评分功能
     */
    private static void scoreMovie() {
        // 1、查询当前登录成功的用户历史购买记录,看哪些电影是它可以评分的。
        Custom c = (Custom) loginUser;
        Map<String, Boolean> movies = c.getBuyMovies();
        if(movies.size() == 0 ){
            System.out.println("当前您没有看过电影,不能评价!");
            return;
        }

        // 买过了 ,看哪些电影是它可以评分的。
        movies.forEach((name, flag) -> {
            if(flag){
                System.out.println(name +"此电影已评价");
            }else {
                System.out.println("请您对:" + name +"进行打分(0-10):");
                double score = Double.valueOf(SC.nextLine());

                // 先根据电影名称拿到评分数据
                List<Double> scores = MOVIES_SCORE.get(name); // MOVIES_SCORE = [ 名称=[10] , ... ]
                if(scores == null){
                    // 说明此电影是第一次评价
                    scores = new ArrayList<>();
                    scores.add(score);
                    MOVIES_SCORE.put(name , scores);
                }else {
                    scores.add(score);
                }
                movies.put(name, true);
            }
        });
    }

(4)评分降序展示

    /**
     * 评分降序展示
     */
    private static void scoreSort() {
        if (MOVIES_SCORE.size() > 0) {
            List<Score> scores = new ArrayList<>();
            MOVIES_SCORE.forEach(new BiConsumer<String, List<Double>>() {
                @Override
                public void accept(String s, List<Double> doubles) {
                    List<Double> list = MOVIES_SCORE.get(s);
                    double sum = 0;
                    for (Double d : list) {
                        sum = BigDecimal.valueOf(sum).add(BigDecimal.valueOf(d)).doubleValue();
                    }
                    scores.add(new Score(s, BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(list.size())).doubleValue()));
                }
            });
            scores.sort((o1,  o2)->Double.compare(o2.getScore(),o1.getScore()));
            scores.forEach(score->System.out.println(score.getMovieName()+"\t\t"+score.getScore()));
        }
        else {
            System.out.println("还没有评分数据");
        }
    }

(5)根据片名查询全部影片信息

    public static void getInfoByMovieName() {
        System.out.println("请输入想要查询的电影名称:");
        String movieName=SC.nextLine();
        ALL_MOVIES.forEach((business, movies) -> {
            for (movie m : movies) {
                if(m.getName().equals(movieName)) {
                    System.out.println("==================================================================================");
                    System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() + "\t\t地址:" + business.getShopAddress());
                    System.out.println("片名\t\t\t主演\t\t\t时长\t\t\t评分\t\t\t票价\t\t\t余票数量\t\t\t放映时间");
                    System.out.println(m.getName() + "\t\t" + m.getActor() + "\t\t" + m.getTime() + "\t\t" + m.getScore() + "\t\t\t" +
                            m.getPrice() + "\t\t\t" + m.getNum() + "\t\t\t" + sdf.format(m.getStartData()));
                }
            }
        });
    }

5、客户注册

    /**
     * 用户注册
     */
    private static void customerRegister() {
        Custom user = new Custom();
        System.out.println("=============================用户注册========================");
        //定义User类作为父类,属性:登录名称、密码、真实名称、性别、电话、账户金额
        System.out.println("请输入登录名称:");
        String loginName = SC.nextLine();
        while (true) {
            System.out.println("请输入登录密码:");
            String loginPasswordFirst = SC.nextLine();
            System.out.println("请再次输入登录密码:");
            String loginPasswordSecond = SC.nextLine();
            if (loginPasswordSecond.equals(loginPasswordFirst)) {
                user.setPassword(loginPasswordSecond);
                break;
            } else {
                System.out.println("两次输入的密码不一致,请再次输入");
            }
        }
        System.out.println("请输入真实名称:");
        String userName = SC.nextLine();
        System.out.println("请输入性别:");
        String sex = SC.nextLine();
        System.out.println("请输入电话:");
        String phone = SC.nextLine();
        System.out.println("请输入账户金额:");
        String money = SC.nextLine();

        user.setMoney(Double.valueOf(money));
        user.setUserName(userName);
        user.setPhone(phone);
        user.setSex(sex);
        user.setLoginName(loginName);
        ALL_USERS.add(user);
        System.out.println(user.getLoginName() + "注册成功");
    }

6、商家注册

 /**
     * 商家注册
     */
    private static void businessRegister() {
        Business user = new Business();
        System.out.println("=============================商家注册========================");
        //定义User类作为父类,属性:登录名称、密码、真实名称、性别、电话、账户金额
        System.out.println("请输入登录名称:");
        String loginName = SC.nextLine();
        while (true) {
            System.out.println("请输入登录密码:");
            String loginPasswordFirst = SC.nextLine();
            System.out.println("请再次输入登录密码:");
            String loginPasswordSecond = SC.nextLine();
            if (loginPasswordSecond.equals(loginPasswordFirst)) {
                user.setPassword(loginPasswordSecond);
                break;
            } else {
                System.out.println("两次输入的密码不一致,请再次输入");
            }
        }
        System.out.println("请输入真实名称:");
        String userName = SC.nextLine();
        System.out.println("请输入性别:");
        String sex = SC.nextLine();
        System.out.println("请输入电话:");
        String phone = SC.nextLine();
        System.out.println("请输入账户金额:");
        String money = SC.nextLine();
        System.out.println("请输入店铺名称:");
        String shopName = SC.nextLine();
        System.out.println("请输入店铺地址:");
        String address = SC.nextLine();

        user.setMoney(Double.valueOf(money));
        user.setUserName(userName);
        user.setPhone(phone);
        user.setSex(sex);
        user.setLoginName(loginName);
        user.setShopAddress(address);
        user.setShopName(shopName);
        ALL_USERS.add(user);
        System.out.println(user.getLoginName() + "注册成功");
    }

基于Java的电影购票系统-Java文档类资源-CSDN下载日志框架搭建、系统角色分析首页设计、登录、商家界面、用户界面实现商家-详情页设计、影片上架、更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_44771627/85095268

  • 22
    点赞
  • 242
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是Java电影购票系统的设计和实现: 1. 首先,我们需要定义一个Movie类,该类包含电影的名称,导演,演员,类型和时长等属性。 ```java public class Movie { private String name; private String director; private String[] actors; private String type; private int duration; public Movie(String name, String director, String[] actors, String type, int duration) { this.name = name; this.director = director; this.actors = actors; this.type = type; this.duration = duration; } // getter and setter methods } ``` 2. 接下来,我们需要定义一个Cinema类,该类包含电影院的名称,地址和座位等属性,以及一个Movie类型的数组,表示该电影院正在上映的电影。 ```java public class Cinema { private String name; private String address; private int seats; private Movie[] movies; public Cinema(String name, String address, int seats, Movie[] movies) { this.name = name; this.address = address; this.seats = seats; this.movies = movies; } // getter and setter methods } ``` 3. 然后,我们需要定义一个Ticket类,该类包含电影票的价格,座位号和电影等属性。 ```java public class Ticket { private double price; private int seatNumber; private Movie movie; public Ticket(double price, int seatNumber, Movie movie) { this.price = price; this.seatNumber = seatNumber; this.movie = movie; } // getter and setter methods } ``` 4. 最后,我们需要定义一个TicketBookingSystem类,该类包含一个Cinema类型的数组,表示所有的电影院,以及一个Ticket类型的数组,表示所有已售出的电影票。 ```java public class TicketBookingSystem { private Cinema[] cinemas; private Ticket[] tickets; public TicketBookingSystem(Cinema[] cinemas) { this.cinemas = cinemas; this.tickets = new Ticket[0]; } // method to book a ticket public void bookTicket(int cinemaIndex, int movieIndex, int seatNumber) { Cinema cinema = cinemas[cinemaIndex]; Movie movie = cinema.getMovies()[movieIndex]; double price = calculatePrice(movie.getDuration()); Ticket ticket = new Ticket(price, seatNumber, movie); tickets = Arrays.copyOf(tickets, tickets.length + 1); tickets[tickets.length - 1] = ticket; } // method to calculate ticket price based on movie duration private double calculatePrice(int duration) { if (duration <= 60) { return 8.0; } else if (duration <= 120) { return 12.0; } else { return 15.0; } } // getter and setter methods } ``` 以上就是Java电影购票系统的设计和实现。用户可以通过调用TicketBookingSystem类的bookTicket方法来购买电影票。系统会根据电影的时长自动计算票价,并将售出的电影票保存在tickets数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿( ﹡ˆoˆ﹡ )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值