本文实例为大家分享了JavaSE实现电影院系统的具体代码,供大家参考,具体内容如下
利用Java的面向对象进阶知识,结合日志,创建一个简单电影院系统
一.定义一个User作为父类,减少代码冗余
public class User {
//用户类,充当父类
private String loginName; //假名(昵称),不重复
private String username; //真名
private String passWord;
private String sex;
private String phone;
private double money;
public User() {
}
public User(String loginName, String username, String passWord, String sex, String phone) {
this.loginName = loginName;
this.username = username;
this.passWord = passWord;
this.sex = sex;
this.phone = phone;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getSex() {
return sex;
}
public void setSex(String 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;
}
}
二.定义顾客类,以及商家类
public class Business extends User {
//商家角色,独有属性
private String shopName; //店铺名称
private String address;
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Customer extends User{
//客户角色
}
三.定义一个电影类
import java.util.*;
public class Movie {
private String name;
private String actor;
private double score;
private double time;
private double price;
private int number; //余票
private Date startTime; //放映时间
public Movie() {
}
public Movie(String name, String actor, double time, double price, int number, Date startTime) {
this.name = name;
this.actor = actor;
this.score = score;
this.time = time;
this.price = price;
this.number = number;
this.startTime = startTime;
}
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 getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
}
四.添加logback.xml配置文件
注意:输出日志的格式为ERROR即可,如果设置ALL,不要在控制台打印
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="E:/log" />
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<Encoding>UTF-8</Encoding>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/myApp.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>1MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="ERROR">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
五.测试类
import com.lll.bean.Business;
import com.lll.bean.Customer;
import com.lll.bean.Movie;
import com.lll.bean.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class MovieSystem {
//定义系统的数据容器,用于存储数据
// 1。存储很多用户(客户,商家)
public static final List<User> ALL_USERS = new ArrayList<>();
public static Map<List<Movie>,Double>MOVIE_SCORE=new HashMap<>();
/*
* 存储商家拍片信息
* 商家1=【p1,p2,p3】
* 商家2=【p1,p2,p3】
* */
public static final Map<Business, List<Movie>> ALL_MOVIES = new HashMap<>();
public static final Scanner sc = new Scanner(System.in);
public static User loginUser;
public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static final Logger LOGGER = LoggerFactory.getLogger("MovieSystem.class");
/*
* 准备一些测试数据
*
* */
static {
Customer c = new Customer();
c.setLoginName("lzb123");
c.setPassWord("123456");
c.setUsername("刘六");
c.setSex("男");
c.setMoney(1000);
c.setPhone("110011");
ALL_USERS.add(c);
Customer c1 = new Customer();
c1.setLoginName("w123");
c1.setPassWord("123456");
c1.setUsername("老王");
c1.setSex("男");
c1.setMoney(0);
c1.setPhone("110111");
ALL_USERS.add(c1);
Business b = new Business();
b.setLoginName("马化腾66");
b.setPassWord("123456");
b.setUsername("马化腾");
b.setMoney(0);
b.setSex("男");
b.setPhone("8888");
b.setShopName("腾讯影视");
b.setAddress("北京市海淀区中关村1号");
ALL_USERS.add(b);
List<Movie> movies = new ArrayList<>();
ALL_MOVIES.put(b, movies);
Business b1 = new Business();
b1.setLoginName("马云66");
b1.setPassWord("123456");
b1.setUsername("马云");
b1.setMoney(10000);
b1.setSex("男");
b1.setPhone("6666");
b1.setShopName("阿里影视");
b1.setAddress("北京市海淀区中关村2号");
ALL_USERS.add(b1);
List<Movie> movies1 = new ArrayList<>();
ALL_MOVIES.put(b1, movies1);
}
public static void main(String[] args) {
shouMain();
}
public static void NewCustomer()
{
System.out.println("==========用户注册==========");
System.out.println("输入用户名:");
String loginName=sc.nextLine();
System.out.println("输入姓名:");
String username=sc.nextLine();
while (true) {
System.out.println("输入密码:");
String passWord=sc.nextLine();
System.out.println("请再次输入密码:");
String passWord2=sc.nextLine();
if(passWord.equals(passWord2)==false)
{
System.out.println("两次密码输入不一致!");
}
else
{
System.out.println("输入性别:");
String sex=sc.nextLine();
while (true) {
System.out.println("输入手机号码:");
String phone=sc.nextLine();
if(phone.matches("^1[3|4|5|7|8][0-9]\\d{4,8}$"))
{
System.out.println("注册成功!");
User user=new User(loginName,username,passWord,sex,phone);
ALL_USERS.add(user);
return;
}
else
{
System.out.println("手机号输入不合法!");
}
}
}
}
}
public static void NewBusiness()
{
System.out.println("==========商家入驻==========");
System.out.println("输入用户名:");
String loginName=sc.nextLine();
System.out.println("输入姓名:");
String username=sc.nextLine();
while (true) {
System.out.println("输入密码:");
String passWord=sc.nextLine();
System.out.println("请再次输入密码:");
String passWord2=sc.nextLine();
if(passWord.equals(passWord2)==false)
{
System.out.println("两次密码输入不一致!");
}
else
{
System.out.println("输入性别:");
String sex=sc.nextLine();
while (true) {
System.out.println("输入手机号码:");
String phone=sc.nextLine();
if(phone.matches("^1[3|4|5|7|8][0-9]\\d{4,8}$"))
{
System.out.println("请输入店铺名称:");
String shopName=sc.nextLine();
System.out.println("请输入店铺地址:");
String address=sc.nextLine();
System.out.println("注册成功!");
Business b=new Business();
b.setLoginName(loginName);
b.setPassWord(passWord);
b.setUsername(username);
b.setSex(sex);
b.setPhone(phone);
b.setShopName(shopName);
b.setAddress(address);
ALL_USERS.add(b);
List<Movie> movies = new ArrayList<>();
ALL_MOVIES.put(b, movies);
return;
}
else
{
System.out.println("手机号输入不合法!");
}
}
}
}
}
private static void shouMain() {
while (true) {
System.out.println("==========ZB电影首页==========");
System.out.println("1.登录");
System.out.println("2.用户注册");
System.out.println("3.商家入驻");
System.out.println("请输入操作命令");
String command = sc.nextLine();
switch (command) {
case "1":
//登录
longin();
break;
case "2":
//注册
NewCustomer();
break;
case "3":
NewBusiness();
break;
default:
System.out.println("命令有误!请重新输入!");
break;
}
}
}
private static void longin() {
while (true) {
System.out.println("请输入登录名称:");
String loginName = sc.nextLine();
System.out.println("请输入登录密码:");
String passWord = sc.nextLine();
//根据登录名查询用户对象
User u = getUserByLoginName(loginName);
//判断用户对象是否存在
if (u != null) {
if (u.getPassWord().equals(passWord)) {
System.out.println("登录成功!");
loginUser = u;
LOGGER.info(u.getUsername() + "登录系统");
//判断登录为用户是商家还是顾客
if (u instanceof Customer) // 对象运算符(instanceof)用来判断一个对象是否属于某个指定的类或其子类的实例,如果是,返回真(true),否则返回假(false)。
{
//登录为顾客
showCustomerMain();
} else {
//登录为商家
showBusinessMain();
}
return;
} else {
System.out.println("密码错误!");
}
} else {
System.out.println("登录名称错误,请重新输入!");
}
}
}
//商家操作
private static void showBusinessMain() {
while (true) {
System.out.println("==========商家界面==========");
System.out.println(loginUser.getUsername() + (loginUser.getSex() .equals("男") ? "先生" : "女士") + "您好," + "请选择商家操作的功能:");
while (true) {
System.out.println("1.展示详情:");
System.out.println("2.上架电影:");
System.out.println("3.下架电影:");
System.out.println("4.修改电影:");
System.out.println("5.退出");
System.out.println("选择操作命令:");
String command = sc.nextLine();
switch (command) {
case "1":
showBusinessInfos();
break;
case "2":
addMovie();
break;
case "3":
deleteMovie();
break;
case "4":
updateMovie();
break;
case "5":
System.out.println("退出系统成功!");
return;
default:
System.out.println("您输入的命令有误!请重新输入");
break;
}
}
}
}
private static void updateMovie() {
Business business = (Business) loginUser;
List<Movie> movies = ALL_MOVIES.get(business);
if (movies.size() == 0) {
System.out.println("您的系统内无影视资源!无法修改");
return;
}
while (true) {
System.out.println("请您输入需要修改的电影名称:");
String movieName = sc.nextLine();
Movie movie = getMovieByName(movieName);
if (movie != null) {
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();
while (true) {
try {
System.out.println("请输入影片修改后的放映时间:");
String startTime = sc.nextLine();
movie.setName(name);
movie.setActor(actor);
movie.setTime(Double.valueOf(time));
movie.setPrice(Double.valueOf(price));
movie.setNumber(Integer.valueOf(totalNumber));
movie.setStartTime(sdf.parse(startTime));
System.out.println("您已经成功修改!");
System.out.println("==========影片详情==========");
showBusinessInfos();
return;
} catch (ParseException e) {
e.printStackTrace();
LOGGER.error("时间解析错误!");
}
}
} else {
System.out.println("不存在该影片!");
System.out.println("继续修改按1,退出按其他任意键");
String command = sc.nextLine();
switch (command) {
case "1":
break;
default:
return;
}
}
}
}
//影片下架功能
private static void deleteMovie() {
System.out.println("==========下架电影===========");
Business business = (Business) loginUser;
List<Movie> movies = ALL_MOVIES.get(business);
if (movies.size() == 0) {
System.out.println("您的系统内无影视资源!无法下架");
return;
}
while (true) {
System.out.println("请您输入需要下架的电影名称:");
String movieName = sc.nextLine();
Movie movie = getMovieByName(movieName);
if (movie != null) {
movies.remove(movie);
System.out.println(movieName + "下架成功!");
System.out.println("==========影片详情==========");
showBusinessInfos();
return;
} else {
System.out.println("不存在该影片!");
System.out.println("继续下架按1,退出按其他任意键");
String command = sc.nextLine();
switch (command) {
case "1":
break;
default:
return;
}
}
}
}
//根据影片名查找影片
public static Movie getMovieByName(String movieName) {
Business business = (Business) loginUser;
List<Movie> movies = ALL_MOVIES.get(business);
for (Movie movie : movies) {
if (movie.getName().contains(movieName))
//equals只能判断两个变量的值是否相等。 contains常用与集合中判断某个对象是否含有这个元素
{
return movie;
}
}
return null;
}
//展示当前商家详细信息
private static void showBusinessInfos() {
System.out.println("==========商家详情==========");
LOGGER.info(loginUser.getUsername() + "查看详情");
//根据商家对象提取相应的值 Map<Business List<Movie>>
Business business = (Business) loginUser;
System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() + "\t\t地址:" + business.getAddress());
List<Movie> movies = ALL_MOVIES.get(business);
if (movies.size() > 0) {
System.out.println("片名" + "\t\t" + "主演" + "\t\t" + "时长" + "\t\t" + "评分" + "\t\t" + "票价" + "\t\t" + "余票" + "\t\t" + "放映时间");
for (Movie movie : movies) {
System.out.println(movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getTime() + "\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t" + movie.getNumber() + "\t\t" + sdf.format(movie.getStartTime()));
}
} else {
System.out.println("您的店铺当前没有影视资源!");
}
}
//上架电影
private static void addMovie() {
System.out.println("==========上架电影==========");
Business business = (Business) loginUser;
List<Movie> movies = ALL_MOVIES.get(business); //键值对
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();
while (true) {
try {
System.out.println("请输入影片放映时间:");
String startTime = sc.nextLine();
Movie movie = new Movie(name, actor, Double.valueOf(time), Double.valueOf(price), Integer.valueOf(totalNumber), sdf.parse(startTime));
movies.add(movie);
System.out.println("您已经成功上架《" + movie.getName() + "》");
return;
} catch (ParseException e) {
e.printStackTrace();
LOGGER.error("时间解析错误!");
}
}
}
//顾客操作
private static void showCustomerMain() {
System.out.println("==========客户界面==========");
while (true) {
System.out.println(loginUser.getUsername() + (loginUser.getSex().equals("男") ? "先生" : "女士") + "您好," + "请选择客户操作的功能:");
System.out.println("账户余额" + loginUser.getMoney());
System.out.println("1.展示全部影片信息功能:");
System.out.println("2.根据电影名称查询电影信息:");
System.out.println("3.购票系统:");
System.out.println("4.退出系统:");
String command = sc.nextLine();
switch (command) {
case "1":
showAllMovies();
break;
case "2":
NameMovie();
break;
case "3":
buyMovie();
break;
case "4":
System.out.println("退出系统成功!");
return;
default:
System.out.println("您输入的命令有误!请重新输入");
break;
}
}
}
private static void NameMovie() {
System.out.println("===========根据影片名查询电影===========");
System.out.println("请输入影片名:");
String Findname = sc.nextLine();
ALL_MOVIES.forEach((business, movies) -> {
System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() + "\t\t地址:" + business.getAddress());
System.out.println("\t\t\t" + "片名" + "\t\t" + "主演" + "\t\t" + "时长" + "\t\t" + "评分" + "\t\t" + "票价" + "\t\t" + "余票" + "\t\t" + "放映时间");
for (Movie movie : movies) {
if (movie.getName().equals(Findname))
System.out.println("\t\t\t" + movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getTime() + "\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t" + movie.getNumber() + "\t\t" + sdf.format(movie.getStartTime()));
}
});
}
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 movie = getMovieByShopName(business, MovieName);
if (movie != null) {
while (true) {
System.out.println("输入购买电影票数:");
String Number = sc.nextLine();
int buyNumber = Integer.valueOf(Number);
if (movie.getNumber() >= buyNumber) {
double money = BigDecimal.valueOf(movie.getPrice()).multiply(BigDecimal.valueOf(buyNumber))
.doubleValue();
System.out.println("当前需要花费的金额为" + money);
if (loginUser.getMoney() >= money) {
System.out.println("购票成功!");
System.out.println("您成功购买了" + movie.getName() + "的" + buyNumber + "张票"
+ "总金额为" + money);
loginUser.setMoney(loginUser.getMoney() - money);
business.setMoney(business.getMoney() + money);
movie.setNumber(movie.getNumber() - buyNumber);
return;
} else {
System.out.println("账户余额不足!");
System.out.println("继续购买按1,退出按其他任意键");
String command = sc.nextLine();
switch (command) {
case "1":
break;
default:
return;
}
}
} else {
System.out.println("余票不足!还剩" + movie.getNumber() + "张票");
System.out.println("继续购买按1,退出按其他任意键");
String command = sc.nextLine();
switch (command) {
case "1":
break;
default:
return;
}
}
}
} else {
System.out.println("该电影不存在!");
}
}
} else {
System.out.println("该店铺无影视资源!");
System.out.println("继续购买按1,退出按其他任意键");
String command = sc.nextLine();
switch (command) {
case "1":
break;
default:
return;
}
}
return;
} else {
System.out.println("不存在该店铺!");
System.out.println("继续购买按1,退出按其他任意键");
String command = sc.nextLine();
switch (command) {
case "1":
break;
default:
return;
}
}
}
}
private static void showAllMovies() {
System.out.println("==========展示全部商家信息==========");
ALL_MOVIES.forEach((business, movies) -> {
System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() + "\t\t地址:" + business.getAddress());
System.out.println("\t\t\t" + "片名" + "\t\t" + "主演" + "\t\t" + "时长" + "\t\t" + "评分" + "\t\t" + "票价" + "\t\t" + "余票" + "\t\t" + "放映时间");
for (Movie movie : movies) {
System.out.println("\t\t\t" + movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getTime() + "\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t" + movie.getNumber() + "\t\t" + sdf.format(movie.getStartTime()));
}
});
}
//根据商家店铺名称查询商家对象
public static Business getUserByShopName(String shopName) {
Set<Business> businesses = ALL_MOVIES.keySet();
for (Business business : businesses) {
if (business.getShopName().equals(shopName)) {
return business;
}
}
return null;
}
//查询商家的电影
public static Movie getMovieByShopName(Business business, String name) {
List<Movie> movies = ALL_MOVIES.get(business);
for (Movie movie : movies) {
if (movie.getName().contains(name)) {
return movie;
}
}
return null;
}
public static User getUserByLoginName(String loginName) {
for (User user : ALL_USERS) {
//判断用户登录名
if (user.getLoginName().equals(loginName)) {
return user;
}
}
return null; //查无此人
}
}