JavaSE电影院系统
LIiuxb 人气:0利用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; //查无此人 } }
加载全部内容