首页 > 编程语言 >Java学习案例:控制台实现电影院管理系统

Java学习案例:控制台实现电影院管理系统

时间:2024-09-02 22:26:14浏览次数:12  
标签:功能 Java 电影院 电影 用户 System 管理员 控制台 out

文章目录

前言

   最近学习把java SE的内容全部过了一遍,大致的内容和其他编程语言没有很大的区别,但在细节上确实有很多的关键点值得一提,比如java不支持多继承,但是可以通过内部类来实现相同效果。
   通过案例把这几天学的东西融会贯通一下,还是和上次一样先展示案例效果,源码的下载链接

 tip:这次代码量比上回稍微多了一些,源码我以上传并设置成免费的,大家可以下载下来 !

一、实现效果

1、登录界面以及注册功能演示

   如下图所示,当用户需要注册时会遇到一个验证码功能,此功能会随机生成包含大小写字母和数字的六位验证码,当用户输入正确后才能继续进行注册功能!(不区分大小写)
用户类型分为管理员和普通用户,注册管理员账户时需要输入管理员注册码666666才可以成功注册。
在这里插入图片描述

2、普通用户登录

普通用户登录后会显示五项功能:

1、热映影片:
  显示管理员已设置排片时间和影厅号的电影,用户可以通过此功能查看排片电影详情、购买电影票、申请退票。

2、即将上映
  显示系统中所有未排片的电影

3、个人信息
  显示用户的个人信息,用户也可以通过此功能修改这些信息

4、票夹
  显示用户购买的电影票(包括电影开场时间、影厅号)

5、退出系统
  返回上级操作界面

普通用户登录后欢迎界面如下图所示:
在这里插入图片描述

(1)热映影片

    效果如下图所示,用户可以通过此功能查看所有管理员已排片的电影信息、购买电影票。当用户输入1指令进入热映影片界面时,会简单列出当前的存在的排片信息。用户继续输入指令1时,会提示用户输入指定的电影名字来查看电影详情。
在这里插入图片描述

    用户在热映影片界面输入指令2,可以购买电影票并自由选择座位。被预定的座位会显示随机emoji表情,如果用户误选已被预选的座位,系统也会给出提示并让用户重新选择.
在这里插入图片描述
在这里插入图片描述

(2)即将上映

    效果如下,用户可以通过此功能查看所有管理员还未排片的电影简介。
在这里插入图片描述

(3)个人信息

    个人信息功能如下图所示,用户可以通过此功能查看并修改个人信息。
在这里插入图片描述
在这里插入图片描述
如下图所示,用户在修改信息后,系统相关设置会更新。
在这里插入图片描述

(4)票夹

    票夹功能如下图所示,用户可以通过此功能查看所有已购电影票。
在这里插入图片描述

3、管理员登录

   管理员登录后会显示四项功能:

1、电影管理:
  电影管理功能包含:
    1、浏览电影
      管理员可以通过此功能查看所有已上架的电影

    2、电影上架
      管理员可以使用此功能添加电影(上架电影,普通用户会在 <即将上映> 界面看到该电影的信息)

    3、电影下架
      管理员通过指定电影名字删除已上架电影的信息

    4、修改电影
      管理员通过此功能修改电影的信息,能修改电影名、电影导演、电影主演、电影简介等信息

    5、排片设置

      管理员可以通过此功能设置电影的排片信息,设置电影播放的影厅号、开始的时间、电影票售价等信息


2、用户管理
  显示系统中所有未排片的电影

3、个人信息
  显示管理员的个人信息,管理也可以通过此功能修改这些信息(包括登录名、密码、网名昵称等等)

4、退出
  返回上级操作界面

管理员登录后欢迎界面如下图所示:
在这里插入图片描述

(1)电影管理

    电影管理包含浏览电影、电影上架、电影下架、修改电影、排片设置等功能,管理员通过选择电影管理下的子功能设置相关电影信息。
在这里插入图片描述
在这里插入图片描述

(2)用户管理

    管理员可以用户管理设置用户相关信息。
在这里插入图片描述

(3)个人信息

    管理员个人信息展示界面和普通用户一样(调用的是同一个方法),图片略。

二、功能源码

1、接收用户的合法输入

   如下代码所示,当需用户重复输入指定指令时,可以采用死循环的方法。

public class Demo {
	//放在类中方法外,设置为成员变量,可以全局使用sc变量
    Scanner sc = new Scanner(System.in);
    public void fun(){
        //定义在死循环外,防止重复创建对象
        String choise;
        while (true){
            //变量赋值放在死循环中,以便重复接受用户的输入
            choise = sc.next();
            switch (choise){
                case "1":
                    showUserList();
                    break;
					......

                case "3":
                    System.out.println("已退出!");
                    //return;直接结束方法!
                    return;
                default:
                    //只要用户输入的不是需要的指令就提示输入不规范
                    System.out.println("您的输入不规范!");
                    break;
            }
        }
    }
}

2、控制台格式化输出

   如下代

//控制台格式化打印
System.out.printf("字符串", 形参列表...);  
//在IDEA中的快捷使用方法是 (返回值为String的方法).souf 或 (变量).souf
//或者直接输入souf回车

用法示例:
int a = 10;
System.out.printf("a的值是%d", number);  
控制台打印:
a的值是10


以上示例中字符串里的%d是占位符,类似的还有:

1、%s:字符串占位符,用于插入字符串类型的值。它可以用来替换任何类型的对象,
	  包括字符串、数字等,因为所有对象都可以调用toString()方法转换为字符串。

2、%d:整数占位符,用于插入整数类型的值。适用于int、long等整数类型。

3、%f:浮点占位符,用于插入浮点类型的值。适用于float、double等浮点数类型。

4、%b:布尔值占位符,用于插入布尔值类型的值。

常用的就%s、%d、%f三种,只记这三种就行。网上还搜到%tY表示四位数的年份、
%tB表示英文月份等不常用的。

===============================================================================
控制台格式化打印的进阶技巧:

double pi = 3.141592653589793;  
System.out.printf("浮点数(保留两位小数):%.2f%n", pi);  
输出:浮点数(保留两位小数):3.14
[ps:这里的%n不是占位符,这里表示换行的意思,printf默认不加换行。你也可以输入转义字符\r\n]
-------------------------------------------------------------------------------
设置:宽度为10,右对齐,保留两位小数  
System.out.printf("宽度为10,右对齐,保留两位小数:%10.2f%n", pi);  
输出:宽度为10,右对齐,保留两位小数:      3.14  
-------------------------------------------------------------------------------
设置:宽度为10,右对齐,保留两位小数,用0填充  
System.out.printf("宽度为10,右对齐,0填充,保留两位小数:%010.2f%n", pi);  
输出:宽度为10,右对齐,0填充,保留两位小数:0000003.14	
-------------------------------------------------------------------------------
总结:%[index$][标识]*[最小宽度][.精度]转换符

   更多占位符相关知识,请查看博主旷野历程的这篇文章:JAVA字符串占位符使用
   java中涉及到使用占位符的,还有String.format()方法、PrintStream类与PrintWriter类中的printf()方法、MessageFormat类等方法

3、创建工具类

   专门创建工具类来存放一些功能,可以在书写功能类时避免混淆、减少重复代码。工具类一般使用Utils或Tools后缀。

//防止继承,设置为final
public final class movieUtils {
    //禁止用户通过new实例来调用,将无参构造器标记为private
    private movieUtils(){}
    
    //打印分割线
    public static void printPartingLineLite() {
        System.out.println("\r\n-------------------------------------------------------------------");
    }
    //方法重载,打印不同类型的分割线
    public static void printPartingLineLite(String serviceName) {
        System.out.printf("\r\n------------------------------%s------------------------------\r\n", serviceName);
    }

    public static void printPartingLine() {
        System.out.println("\r\n============================================================");
    }

    public static void printPartingLine(String serviceName) {
        System.out.printf("\r\n============================%s=============================\r\n", serviceName);
    }

    //设置电影简介的打印格式,到一定长度就换行
    public static String printDesc(String Desc) {
        StringBuilder str = new StringBuilder(Desc);
        for (int i = 0; i < str.length(); i++) {
            if (i == 0) continue;
            if ((i % 42) == 0)
                str.insert(i, "\r\n\t ");
        }

        return str.toString();
    }

	//创建随机六位字母数字组成的验证码
    private static boolean verificationCode() {
        Random rd = new Random();
        String str = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
        StringBuilder st = new StringBuilder();
        int temp;
        for (int i = 0; i < 6; i++) {
            temp = rd.nextInt(str.length());
            st.append(str.toCharArray()[temp]);
        }
        System.out.println("验证码:" + st.toString());
        System.out.println("请输入验证码:");
        String code = sc.next();
        if ((st.toString()).equalsIgnoreCase(code)) {
            return false;
        }
        System.out.println("验证码输入错误");
        return true;
    }

    private static void verification() {
        boolean check = true;
        while (check) {
            check = verificationCode();
        }
    }
    ....略

4、多个类之间数据传递

   在构建整个系统时,数据传递无疑是一个核心环节。本文采用了类的构造函数来传递参数,这种方式确保了在Java中执行非静态类的方法时,类的构造函数能够被适时调用,从而初始化对象并传递必要的数据。


    public class A {
        public static void main(String[] args) {
    //        main方法程序的入口
    //        运行欢迎程序,打印系统初始界面
            new B().hello();
        }
    }
    
    class B {
        ArrayList<Student> list;
    
        B() {
            SystemData data = new SystemData();
            this.list = data.list;
        }
    
        void hello() {
        	//这里的this就是B类的地址值,将其作为实参传递给C类
            new C(this);
        }
    }
    
    class C {
        ArrayList<Student> list;
    
        public C(B b) {
			//通过B类地址值获取B类的成员变量list,并将其赋给C类中的成员变量list
            this.list = b.list;
        }
    }
    
    class SystemData {
        //    数据初始化类(存储所有数据、整个管理系统运行时赋予系统初始数据)
        ArrayList<Student> list;
    
        public SystemData() {
            this.list = new ArrayList<>();
            list.add(new Student());
        }
    }
    
    class Student {
        //    JavaBean类
        private String name;
        private int age;
        //get、set、构造器略
    }

三、总结

   实现这种控制台的简易系统并不困难,但是就是繁琐、大量的死循环、重复的功能的调用。但通过上手练习,能够有效的贯通这段时间学习的基础语法知识,实现一些看似复杂但很简单的功能。

标签:功能,Java,电影院,电影,用户,System,管理员,控制台,out
From: https://blog.csdn.net/Vincent_Williams/article/details/141564320

相关文章

  • 《JavaEE进阶》----9.<SpringMVC实践项目:【简易对话留言板(数据存在数据库中)】>
    本篇博客讲解设计的一个网页版简易对话留言板。这个是将数据存在数据库中。我们通过链接本地数据库。在这里面存入的数据。此时数据存在在硬盘中,只要数据不被删除,硬盘不损坏。那么这些数据就会被永久保存引入的依赖:配置数据库:spring:datasource:#数据库连接配置......
  • Java表达式与语句
    文章目录Java表达式和语句1.变量2.运算符与表达式3.语句Java表达式和语句1.变量变量及作用域局部变量在一个方法或由一对{}表示的代码块内定义的变量称为局部变量,有时也称为自动变量、临时变量或堆栈变量。局部变量的作用域是所在的方法或代码块,当程序执行流......
  • Java 面向对象编程的四个基本原则(封装、继承、多态和抽象),并给出一个简单的例子说明如
    面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。在Java中,面向对象编程的四个基本原则是封装、继承、多态和抽象。每个原则都有其特定的目标,帮助开发者构建更加模块化、可维护和可扩展的代码。封装封装是指将数据(属性)和行为(方法)捆绑在一起,并隐藏对象的具体实现细......
  • Java 面试题:事务隔离级别以及并行事务会出现什么问题&&怎么解决脏读、不可重复读和幻
    文章目录四种事务隔离级别MySQL中设置事务隔离级别四种事务隔离级别在并行事务中可能会遇到的问题脏读、不可重复读和幻读三者区别事务的隔离级别是怎么解决这三个问题的?ReadView是什么ReadView包含的信息ReadView在MVCC中的工作原理工作流程总结事务的隔......
  • 探索Groovy的Elvis操作符及其在Java中的替代方案
    在编程的世界里,我们经常需要处理变量的默认值问题,尤其是在变量可能为null的情况下。Groovy语言提供了一种优雅的方式来处理这种情况,那就是Elvis操作符。本文将探讨Elvis操作符的用法,并展示如何在Java中实现类似的功能。Elvis操作符简介Elvis操作符(?:)是Groovy语言中的一种......
  • 解耦利器 - Java中的SPI机制
    为什么需要SPI机制SPI和API的区别是什么SPI是一种跟API相对应的反向设计思想:API由实现方确定标准规范和功能,调用方无权做任何干预;而SPI是由调用方确定标准规范,也就是接口,然后调用方依赖此接口,第三方实现此接口,这样做就可以方便的进行扩展,类似于插件机制,这是SPI出现的需求背景。......
  • 解耦利器 - Java中的SPI机制
    为什么需要SPI机制SPI和API的区别是什么SPI是一种跟API相对应的反向设计思想:API由实现方确定标准规范和功能,调用方无权做任何干预;而SPI是由调用方确定标准规范,也就是接口,然后调用方依赖此接口,第三方实现此接口,这样做就可以方便的进行扩展,类似于插件机制,这是SPI出现的需求背景。......
  • JAVA 内部类与Lambda
    JAVA内部类与Lambda目录JAVA内部类与Lambda1内部类1.1内部类基础1.2私有成员内部类1.3静态内部类1.4局部内部类1.5匿名内部类2Lambda表达式2.1初识Lambda2.1.1无参无返回值抽象方法2.1.2Lambda有参无返回值抽象方法2.1.3Lambda无参有返回值抽象方法2.1.4有参有......
  • Java API:MATH
    JavaAPI:MATH目录JavaAPI:MATH1MATH2示例1MATHMath包含执行基本数字运算的方法;Math类提供的所有方法都是类方法;Math类方法变量和类型方法描述staticintabs(inta)返回int值的绝对值。staticdoubleceil(doublea)返回大于或等于参数且等于数学......
  • Java API:System
    JavaAPI:System目录JavaAPI:System1System2示例代码1SystemSystem类包含几个有用的类字段和方法。它无法实例化。System类提供的设施包括标准输入,标准输出和错误输出流;访问外部定义的属性和环境变量;加载文件和库的方法;以及用于快速复制阵列的一部分的实用方法。......