第一节 日志框架
1、什么是日志
用来记录程序运行过程中的信息,并且可以进行永久存储
2、输出语句存在哪些问题,日志结束应该具备哪些特点和优势
3、日志接口是什么,常见的有几种形式
日志接口大多是一些规范,用来约束日志实现框架的设计
Commons Logging、Simple Logging Facade for Java(slf4j)
4、常见的日志实现框架有哪些
Log4j、Logback(我们重点学习的,其他的都大同小异)
Logback是基于slf4j日志接口实现的日志框架
5、使用Logback至少需要使用那几个模块,各自的作用是什么
slf4j-api:日志接口
logback-core:基础模块
logack-classic:功能模块,它完整实现了slf4j API
6、Logback快速入门
A、使用Logback的开发步骤是怎么样的?
a、在项目下新建文件夹lib,导入Logback的相关jar包到该文件夹下,并添加到项目库中去
b、必须将Logback的核心配置文件logback.xml直接拷贝到src目录下
c、在代码中获取日志的对象
d、调用日志对象的方法记录日志信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.maofugui.logback; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 public class logbackDemo01 { 7 public static final Logger LOGGER = LoggerFactory.getLogger(logbackDemo01.class); 8 public static void main(String[] args){ 9 LOGGER.info("main方法info开始"); 10 LOGGER.debug("main方法debug第二行"); 11 LOGGER.trace("main方法trace第三行"); 12 } 13 }logback简单使用
7、Logback配置详解-输出位置、格式设置
总结:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration> 3 <!-- 4 CONSOLE :表示当前的日志信息是可以输出到控制台的。 5 --> 6 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 7 <!--输出流对象 默认 System.out 改为 System.err--> 8 <target>System.out</target> 9 <encoder> 10 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 11 %msg:日志消息,%n是换行符--> 12 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern> 13 </encoder> 14 </appender> 15 16 <!-- File是输出的方向通向文件的 --> 17 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 18 <encoder> 19 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 20 <charset>utf-8</charset> 21 </encoder> 22 <!--日志输出路径--> 23 <file>E:/code/itheima-data.log</file> 24 <!--指定日志文件拆分和压缩规则--> 25 <rollingPolicy 26 class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 27 <!--通过指定压缩文件名称,来确定分割文件方式--> 28 <fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern> 29 <!--文件拆分大小--> 30 <maxFileSize>1MB</maxFileSize> 31 </rollingPolicy> 32 </appender> 33 34 <!-- 35 36 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF 37 , 默认debug 38 <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。 39 --> 40 <root level="ALL"> 41 <!--注意:如果这里不配置不配置关联打印日志,该位置将不会记录日志--> 42 <!--比如下方,就只有控制台和文件中有日志打印信息,数据库中没有--> 43 <appender-ref ref="CONSOLE"/> 44 <appender-ref ref="FILE" /> 45 </root> 46 </configuration>logback.xml
8、Logback配置详解--日志级别设置
A、如果系统上线后想关闭日志,或者只想记录一些错误的日志信息,怎么办?
可以通过设置日志的输出级别来控制哪些日志信息输出或者不输出
B、设置日志输出级别的作用是什么
用于控制系统中哪些日志级别是可以输出的
C、Logback的日志级别是什么样的
ALL和OFF分别是打开全部日志和关闭全部日志
级别程度依次是:TRECK<DEBUG<INFO<WARM<ERROR
默认级别是debug(忽略大小写),只输出当前级别及高于该级别日志
第二节 阶段项目实战--电影购票系统
=====================================================================================================
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.bean; 2 3 /** 4 用户类(客户和商家的父类 ) 5 */ 6 public class User { 7 private String loginName; // 假名 不能重复 8 private String userName; // 真名 9 private String passWord; 10 private char sex; 11 private String phone; 12 private double money; 13 14 public User(){ 15 16 } 17 18 public User(String loginName, String userName, String passWord, char sex, String phone, double money) { 19 this.loginName = loginName; 20 this.userName = userName; 21 this.passWord = passWord; 22 this.sex = sex; 23 this.phone = phone; 24 this.money = money; 25 } 26 27 public String getLoginName() { 28 return loginName; 29 } 30 31 public void setLoginName(String loginName) { 32 this.loginName = loginName; 33 } 34 35 public String getUserName() { 36 return userName; 37 } 38 39 public void setUserName(String userName) { 40 this.userName = userName; 41 } 42 43 public String getPassWord() { 44 return passWord; 45 } 46 47 public void setPassWord(String passWord) { 48 this.passWord = passWord; 49 } 50 51 public char getSex() { 52 return sex; 53 } 54 55 public void setSex(char sex) { 56 this.sex = sex; 57 } 58 59 public String getPhone() { 60 return phone; 61 } 62 63 public void setPhone(String phone) { 64 this.phone = phone; 65 } 66 67 public double getMoney() { 68 return money; 69 } 70 71 public void setMoney(double money) { 72 this.money = money; 73 } 74 }bean-user
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.bean; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 /** 7 客户角色 8 */ 9 public class Customer extends User{ 10 // 定义一个属性存储购买记录。 11 private Map<String, Boolean> buyMovies = new HashMap<>(); 12 13 public Map<String, Boolean> getBuyMovies() { 14 return buyMovies; 15 } 16 17 public void setBuyMovies(Map<String, Boolean> buyMovies) { 18 this.buyMovies = buyMovies; 19 } 20 }bean-customer
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.bean; 2 3 public class Business extends User{ 4 // 店铺名称 5 private String shopName; 6 // 店铺地址 7 private String address; 8 9 public String getShopName() { 10 return shopName; 11 } 12 13 public void setShopName(String shopName) { 14 this.shopName = shopName; 15 } 16 17 public String getAddress() { 18 return address; 19 } 20 21 public void setAddress(String address) { 22 this.address = address; 23 } 24 }bean-business
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.bean; 2 3 import com.itheima.run.MovieSystem; 4 5 import java.math.BigDecimal; 6 import java.math.RoundingMode; 7 import java.util.Date; 8 import java.util.List; 9 10 public class Movie { 11 private String name; 12 private String actor; 13 private double time; 14 private double price; 15 private int number; // 余票 16 private Date startTime; // 放映时间 17 18 public Movie() { 19 } 20 21 public Movie(String name, String actor, double time, double price, int number, Date startTime) { 22 this.name = name; 23 this.actor = actor; 24 this.time = time; 25 this.price = price; 26 this.number = number; 27 this.startTime = startTime; 28 } 29 30 public String getName() { 31 return name; 32 } 33 34 public void setName(String name) { 35 this.name = name; 36 } 37 38 public String getActor() { 39 return actor; 40 } 41 42 public void setActor(String actor) { 43 this.actor = actor; 44 } 45 46 public double getScore() { 47 List<Double> scores = MovieSystem.MOVIES_SCORE.get(name); 48 if(scores!=null && scores.size() > 0){ 49 double sum = 0; 50 for (Double score : scores) { 51 sum += score; 52 } 53 return BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(scores.size()), 2 , RoundingMode.UP).doubleValue(); 54 }else { 55 return 0; 56 } 57 } 58 59 60 public double getTime() { 61 return time; 62 } 63 64 public void setTime(double time) { 65 this.time = time; 66 } 67 68 public double getPrice() { 69 return price; 70 } 71 72 public void setPrice(double price) { 73 this.price = price; 74 } 75 76 public int getNumber() { 77 return number; 78 } 79 80 public void setNumber(int number) { 81 this.number = number; 82 } 83 84 public Date getStartTime() { 85 return startTime; 86 } 87 88 public void setStartTime(Date startTime) { 89 this.startTime = startTime; 90 } 91 }bean-movie
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.run; 2 3 import com.itheima.bean.Business; 4 import com.itheima.bean.Customer; 5 import com.itheima.bean.Movie; 6 import com.itheima.bean.User; 7 import org.slf4j.Logger; 8 import org.slf4j.LoggerFactory; 9 10 import java.math.BigDecimal; 11 import java.text.ParseException; 12 import java.text.SimpleDateFormat; 13 import java.util.*; 14 15 public class MovieSystem { 16 /** 17 定义系统的数据容器用户存储数据 18 1、存储很多用户(客户对象,商家对象) 19 */ 20 public static final List<User> ALL_USERS = new ArrayList<>(); 21 /** 22 2、存储系统全部商家和其排片信息 。 23 商家1 = [p1,p2,p3,...] 24 商家2 = [p2,p3,...] 25 ... 26 */ 27 public static final Map<Business, List<Movie>> ALL_MOVIES = new HashMap<>(); 28 29 public static final Scanner SYS_SC = new Scanner(System.in); 30 31 // 定义一个静态的User类型的变量记住当前登录成功的用户对象 32 public static User loginUser; 33 public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 34 35 public static final Logger LOGGER = LoggerFactory.getLogger("MovieSystem.class"); 36 37 /** 38 3、准备一些测试数据 39 */ 40 static { 41 Customer c = new Customer(); 42 c.setLoginName("zyf888"); 43 c.setPassWord("123456"); 44 c.setUserName("黑马刘德华"); 45 c.setSex('男'); 46 c.setMoney(10000); 47 c.setPhone("110110"); 48 ALL_USERS.add(c); 49 50 Customer c1 = new Customer(); 51 c1.setLoginName("gzl888"); 52 c1.setPassWord("123456"); 53 c1.setUserName("黑马关之琳"); 54 c1.setSex('女'); 55 c1.setMoney(2000); 56 c1.setPhone("111111"); 57 ALL_USERS.add(c1); 58 59 Business b = new Business(); 60 b.setLoginName("baozugong888"); 61 b.setPassWord("123456"); 62 b.setUserName("黑马包租公"); 63 b.setMoney(0); 64 b.setSex('男'); 65 b.setPhone("110110"); 66 b.setAddress("火星6号2B二层"); 67 b.setShopName("甜甜圈国际影城"); 68 ALL_USERS.add(b); 69 // 注意,商家一定需要加入到店铺排片信息中去 70 List<Movie> movies = new ArrayList<>(); 71 ALL_MOVIES.put(b , movies); // b = [] 72 73 Business b2 = new Business(); 74 b2.setLoginName("baozupo888"); 75 b2.setPassWord("123456"); 76 b2.setUserName("黑马包租婆"); 77 b2.setMoney(0); 78 b2.setSex('女'); 79 b2.setPhone("110110"); 80 b2.setAddress("火星8号8B八层"); 81 b2.setShopName("巧克力国际影城"); 82 ALL_USERS.add(b2); 83 // 注意,商家一定需要加入到店铺排片信息中去 84 List<Movie> movies3 = new ArrayList<>(); 85 ALL_MOVIES.put(b2 , movies3); // b2 = [] 86 } 87 88 89 public static void main(String[] args) { 90 showMain(); 91 } 92 93 /** 94 首页展示 95 */ 96 private static void showMain() { 97 while (true) { 98 System.out.println("===============黑马电影首页================="); 99 System.out.println("1、登录"); 100 System.out.println("2、用户注册"); 101 System.out.println("3、商家注册"); 102 System.out.println("请输入操作命令:"); 103 String command = SYS_SC.nextLine(); 104 switch (command) { 105 case "1": 106 // 登录了 107 login(); 108 break; 109 case "2": 110 // 111 break; 112 case "3": 113 break; 114 default: 115 System.out.println("命令有误,请确认!"); 116 } 117 } 118 } 119 120 /** 121 登录功能 122 */ 123 private static void login() { 124 while (true) { 125 System.out.println("请您输入登录名称:"); 126 String loginName = SYS_SC.nextLine(); 127 System.out.println("请您输入登录密码:"); 128 String passWord = SYS_SC.nextLine(); 129 130 // 1、根据登录名称查询用户对象。 131 User u = getUserByLoginName(loginName); 132 // 2、判断用户对象是否存在,存在说明登录名称正确了 133 if(u != null){ 134 // 3、比对密码是否正确 135 if(u.getPassWord().equals(passWord)){ 136 // 登录成功了:... 137 loginUser = u; // 记住登录成功的用户 138 LOGGER.info(u.getUserName() +"登录了系统~~~"); 139 // 判断是用户登录的,还是商家登录的。 140 if(u instanceof Customer) { 141 // 当前登录的是普通用户 142 showCustomerMain(); 143 }else { 144 // 当前登录的肯定是商家用户 145 showBusinessMain(); 146 } 147 return; 148 }else { 149 System.out.println("密码有毛病~~"); 150 } 151 }else { 152 System.out.println("登录名称错误,请确认"); 153 } 154 } 155 } 156 157 /** 158 商家的后台操作界面 159 */ 160 private static void showBusinessMain() { 161 while (true) { 162 System.out.println("============黑马电影商家界面==================="); 163 System.out.println(loginUser.getUserName() + (loginUser.getSex()=='男'? "先生":"女士" + "欢迎您进入系统")); 164 System.out.println("1、展示详情:"); 165 System.out.println("2、上架电影:"); 166 System.out.println("3、下架电影:"); 167 System.out.println("4、修改电影:"); 168 System.out.println("5、退出:"); 169 170 System.out.println("请输入您要操作的命令:"); 171 String command = SYS_SC.nextLine(); 172 switch (command){ 173 case "1": 174 // 展示全部排片信息 175 showBusinessInfos(); 176 break; 177 case "2": 178 // 上架电影信息 179 addMovie(); 180 break; 181 case "3": 182 // 下架电影信息 183 deleteMovie(); 184 break; 185 case "4": 186 // 修改电影信息 187 updateMovie(); 188 break; 189 case "5": 190 System.out.println(loginUser.getUserName() +"请您下次再来啊~~~"); 191 return; // 干掉方法 192 default: 193 System.out.println("不存在该命令!!"); 194 break; 195 } 196 } 197 } 198 199 /** 200 影片修改功能 201 */ 202 private static void updateMovie() { 203 System.out.println("================修改电影===================="); 204 Business business = (Business) loginUser; 205 List<Movie> movies = ALL_MOVIES.get(business); 206 207 if(movies.size() == 0) { 208 System.out.println("当期无片可以修改~~"); 209 return; 210 } 211 212 // 2、让用户选择需要下架的电影名称 213 while (true) { 214 System.out.println("请您输入需要修改的电影名称:"); 215 String movieName = SYS_SC.nextLine(); 216 217 // 3、去查询有没有这个影片对象。 218 Movie movie = getMovieByName(movieName); 219 if(movie != null){ 220 // 修改它 221 System.out.println("请您输入修改后的片名:"); 222 String name = SYS_SC.nextLine(); 223 System.out.println("请您输入修改后主演:"); 224 String actor = SYS_SC.nextLine(); 225 System.out.println("请您输入修改后时长:"); 226 String time = SYS_SC.nextLine(); 227 System.out.println("请您输入修改后票价:"); 228 String price = SYS_SC.nextLine(); 229 System.out.println("请您输入修改后票数:"); 230 String totalNumber = SYS_SC.nextLine(); // 200\n 231 while (true) { 232 try { 233 System.out.println("请您输入修改后的影片放映时间:"); 234 String stime = SYS_SC.nextLine(); 235 236 movie.setName(name); 237 movie.setActor(actor); 238 movie.setPrice(Double.valueOf(price)); 239 movie.setTime(Double.valueOf(time)); 240 movie.setNumber(Integer.valueOf(totalNumber)); 241 movie.setStartTime(sdf.parse(stime)); 242 243 System.out.println("恭喜您,您成功修改了该影片了!!!"); 244 showBusinessInfos(); 245 return; // 直接退出去 246 } catch (Exception e) { 247 e.printStackTrace(); 248 LOGGER.error("时间解析出了毛病"); 249 } 250 } 251 }else { 252 System.out.println("您的店铺没有上架该影片!"); 253 System.out.println("请问继续修改吗?y/n"); 254 String command = SYS_SC.nextLine(); 255 switch (command) { 256 case "y": 257 break; 258 default: 259 System.out.println("好的!"); 260 return; 261 } 262 } 263 } 264 } 265 266 /** 267 影片下架功能 268 */ 269 private static void deleteMovie() { 270 System.out.println("================下架电影===================="); 271 Business business = (Business) loginUser; 272 List<Movie> movies = ALL_MOVIES.get(business); 273 if(movies.size() == 0) { 274 System.out.println("当期无片可以下架~~"); 275 return; 276 } 277 278 // 2、让用户选择需要下架的电影名称 279 while (true) { 280 System.out.println("请您输入需要下架的电影名称:"); 281 String movieName = SYS_SC.nextLine(); 282 283 // 3、去查询有没有这个影片对象。 284 Movie movie = getMovieByName(movieName); 285 if(movie != null){ 286 // 下架它 287 movies.remove(movie); 288 System.out.println("您当前店铺已经成功下架了:" + movie.getName()); 289 showBusinessInfos(); 290 return; 291 }else { 292 System.out.println("您的店铺没有上架该影片!"); 293 System.out.println("请问继续下架吗?y/n"); 294 String command = SYS_SC.nextLine(); 295 switch (command) { 296 case "y": 297 break; 298 default: 299 System.out.println("好的!"); 300 return; 301 } 302 } 303 } 304 } 305 306 /** 307 去查询当前商家下的排片 308 */ 309 public static Movie getMovieByName(String movieName){ 310 Business business = (Business) loginUser; 311 List<Movie> movies = ALL_MOVIES.get(business); 312 for (Movie movie : movies) { 313 if(movie.getName().contains(movieName)) { 314 return movie; 315 } 316 } 317 return null; 318 } 319 320 /** 321 商家进行电影上架 322 Map<Business , List<Movie>> ALL_MOVIES 323 u1 = [p1,p2,p3] 324 u2 = [p1,p2,p3] 325 */ 326 private static void addMovie() { 327 System.out.println("================上架电影===================="); 328 // 根据商家对象(就是登录的用户loginUser),作为Map集合的键 提取对应的值就是其排片信息 :Map<Business , List<Movie>> ALL_MOVIES 329 Business business = (Business) loginUser; 330 List<Movie> movies = ALL_MOVIES.get(business); 331 332 System.out.println("请您输入新片名:"); 333 String name = SYS_SC.nextLine(); 334 System.out.println("请您输入主演:"); 335 String actor = SYS_SC.nextLine(); 336 System.out.println("请您输入时长:"); 337 String time = SYS_SC.nextLine(); 338 System.out.println("请您输入票价:"); 339 String price = SYS_SC.nextLine(); 340 System.out.println("请您输入票数:"); 341 String totalNumber = SYS_SC.nextLine(); // 200\n 342 while (true) { 343 try { 344 System.out.println("请您输入影片放映时间:"); 345 String stime = SYS_SC.nextLine(); 346 // public Movie(String name, String actor, double time, double price, int number, Date startTime) // 封装成电影对象 ,加入集合movices中去 347 Movie movie = new Movie(name, actor ,Double.valueOf(time) , Double.valueOf(price) 348 , Integer.valueOf(totalNumber) , sdf.parse(stime)); 349 movies.add(movie); 350 System.out.println("您已经成功上架了:《" + movie.getName() + "》"); 351 return; // 直接退出去 352 } catch (ParseException e) { 353 e.printStackTrace(); 354 LOGGER.error("时间解析出了毛病"); 355 } 356 } 357 } 358 359 /** 360 定义一个静态的Map集合存储电影的评分 361 */ 362 public static final Map<String , List<Double>> MOVIES_SCORE = new HashMap<>(); 363 364 /** 365 展示商家的详细:展示当前商家的信息。 366 */ 367 private static void showBusinessInfos() { 368 System.out.println("================商家详情界面================="); 369 LOGGER.info(loginUser.getUserName() +"商家,正在看自己的详情~~~"); 370 // 根据商家对象(就是登录的用户loginUser),作为Map集合的键 提取对应的值就是其排片信息 :Map<Business , List<Movie>> ALL_MOVIES 371 Business business = (Business) loginUser; 372 System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() 373 + "\t\t地址:" + business.getAddress() + "\t\t余额:" + business.getMoney()); 374 List<Movie> movies = ALL_MOVIES.get(business); 375 if(movies.size() > 0) { 376 System.out.println("片名\t\t\t主演\t\t时长\t\t评分\t\t票价\t\t余票数量\t\t放映时间"); 377 for (Movie movie : movies) { 378 379 System.out.println(movie.getName()+"\t\t\t" + movie.getActor()+ "\t\t" + movie.getTime() 380 + "\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t" + movie.getNumber() + "\t\t" 381 + sdf.format(movie.getStartTime())); 382 } 383 }else { 384 System.out.println("您的店铺当前无片在放映~~~~"); 385 } 386 } 387 388 /** 389 客户操作界面 390 */ 391 private static void showCustomerMain() { 392 while (true) { 393 System.out.println("============黑马电影客户界面==================="); 394 System.out.println(loginUser.getUserName() + (loginUser.getSex()=='男'? "先生":"女士" + "欢迎您进入系统" + 395 "\t余额:" + loginUser.getMoney())); 396 System.out.println("请您选择要操作的功能:"); 397 System.out.println("1、展示全部影片信息功能:"); 398 System.out.println("2、根据电影名称查询电影信息:"); 399 System.out.println("3、评分功能:"); 400 System.out.println("4、购票功能:"); 401 System.out.println("5、退出系统:"); 402 System.out.println("请输入您要操作的命令:"); 403 String command = SYS_SC.nextLine(); 404 switch (command){ 405 case "1": 406 // 展示全部排片信息 407 showAllMovies(); 408 break; 409 case "2": 410 break; 411 case "3": 412 // 评分功能 413 scoreMovie(); 414 showAllMovies(); 415 break; 416 case "4": 417 // 购票功能 418 buyMovie(); 419 break; 420 case "5": 421 return; // 干掉方法 422 default: 423 System.out.println("不存在该命令!!"); 424 break; 425 } 426 } 427 } 428 429 private static void scoreMovie() { 430 // 1、查询当前登录成功的用户历史购买记录,看哪些电影是它可以评分的。 431 Customer c = (Customer) loginUser; 432 Map<String, Boolean> movies = c.getBuyMovies(); 433 if(movies.size() == 0 ){ 434 System.out.println("当前您没有看过电影,不能评价!"); 435 return; 436 } 437 438 // 买过了 ,看哪些电影是它可以评分的。 439 movies.forEach((name, flag) -> { 440 if(flag){ 441 System.out.println(name +"此电影已评价"); 442 }else { 443 System.out.println("请您对:" + name +"进行打分(0-10):"); 444 double score = Double.valueOf(SYS_SC.nextLine()); 445 446 // 先根据电影名称拿到评分数据 447 List<Double> scores = MOVIES_SCORE.get(name); // MOVIES_SCORE = [ 名称=[10] , ... ] 448 if(scores == null){ 449 // 说明此电影是第一次评价 450 scores = new ArrayList<>(); 451 scores.add(score); 452 MOVIES_SCORE.put(name , scores); 453 }else { 454 scores.add(score); 455 } 456 457 movies.put(name, true); 458 } 459 }); 460 } 461 462 /** 463 用户购票功能 ALL_MOVIES = {b1=[p1,p2,p3,..] , b2=[p2,p3,...]} 464 */ 465 private static void buyMovie() { 466 showAllMovies(); 467 System.out.println("=============用户购票功能================="); 468 while (true) { 469 System.out.println("请您输入需要买票的门店:"); 470 String shopName = SYS_SC.nextLine(); 471 // 1、查询是否存在该商家。 472 Business business = getBusinessByShopName(shopName); 473 if(business == null){ 474 System.out.println("对不起,没有该店铺!请确认"); 475 }else { 476 // 2、此商家全部的排片 477 List<Movie> movies = ALL_MOVIES.get(business); 478 // 3、判断是否存在上映的电影 479 if(movies.size() > 0) { 480 // 4、开始进行选片购买 481 while (true) { 482 System.out.println("请您输入需要购买电影名称:"); 483 String movieName = SYS_SC.nextLine(); 484 // 去当前商家下,查询该电影对象。 485 Movie movie = getMovieByShopAndName(business, movieName); 486 if(movie != null){ 487 // 开始购买 488 while (true) { 489 System.out.println("请您输入要购买的电影票数:"); 490 String number = SYS_SC.nextLine(); 491 int buyNumber = Integer.valueOf(number); 492 // 判断电影是否购票 493 if(movie.getNumber() >= buyNumber){ 494 // 可以购买了 495 // 当前需要花费的金额 496 double money = BigDecimal.valueOf(movie.getPrice()).multiply(BigDecimal.valueOf(buyNumber)) 497 .doubleValue(); 498 if(loginUser.getMoney() >= money){ 499 // 终于可以买票了 500 System.out.println("您成功购买了"+ movie.getName() + buyNumber + 501 "张票!总金额是:" + money); 502 // 更新自己的金额 更新商家的金额 503 loginUser.setMoney(loginUser.getMoney() - money); 504 business.setMoney(business.getMoney() + money); 505 movie.setNumber(movie.getNumber() - buyNumber); 506 507 Customer c = (Customer) loginUser; 508 // 记录购买电影的信息 509 // 第一个参数是购买的电影,第二个参数是没有评价的标记! 510 c.getBuyMovies().put(movie.getName(), false); 511 512 return;// 结束方法 513 }else { 514 // 钱不够! 515 System.out.println("是否继续~~"); 516 System.out.println("是否继续买票?y/n"); 517 String command = SYS_SC.nextLine(); 518 switch (command) { 519 case "y": 520 break; 521 default: 522 System.out.println("好的!"); 523 return; 524 } 525 } 526 }else { 527 // 票数不够 528 System.out.println("您当前最多可以购买:" + movie.getNumber()); 529 System.out.println("是否继续买票?y/n"); 530 String command = SYS_SC.nextLine(); 531 switch (command) { 532 case "y": 533 break; 534 default: 535 System.out.println("好的!"); 536 return; 537 } 538 } 539 } 540 541 }else { 542 System.out.println("电影名称有毛病~~"); 543 } 544 } 545 546 }else { 547 System.out.println("该电影院关门了~~~"); 548 System.out.println("是否继续买票?y/n"); 549 String command = SYS_SC.nextLine(); 550 switch (command) { 551 case "y": 552 break; 553 default: 554 System.out.println("好的!"); 555 return; 556 } 557 } 558 } 559 } 560 } 561 562 public static Movie getMovieByShopAndName(Business business , String name){ 563 List<Movie> movies = ALL_MOVIES.get(business); 564 for (Movie movie : movies) { 565 if(movie.getName().contains(name)){ 566 return movie; 567 } 568 } 569 return null; 570 } 571 572 /** 573 根据商家店铺名称查询商家对象 574 * @return 575 */ 576 public static Business getBusinessByShopName(String shopName){ 577 Set<Business> businesses = ALL_MOVIES.keySet(); 578 for (Business business : businesses) { 579 if(business.getShopName().equals(shopName)){ 580 return business; 581 } 582 } 583 return null; 584 } 585 586 /** 587 用户功能:展示全部商家和其排片信息 588 */ 589 private static void showAllMovies() { 590 System.out.println("=============展示全部商家排片信息================="); 591 ALL_MOVIES.forEach((business, movies) -> { 592 System.out.println(business.getShopName() + "\t\t电话:" + business.getPhone() + "\t\t地址:" + business.getAddress()); 593 System.out.println("\t\t\t片名\t\t\t主演\t\t时长\t\t评分\t\t票价\t\t余票数量\t\t放映时间"); 594 for (Movie movie : movies) { 595 System.out.println("\t\t\t" + movie.getName()+"\t\t\t" + movie.getActor()+ "\t\t" + movie.getTime() 596 + "\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t" + movie.getNumber() + "\t\t" 597 + sdf.format(movie.getStartTime())); 598 } 599 }); 600 } 601 602 public static User getUserByLoginName(String loginName){ 603 for (User user : ALL_USERS) { 604 // 判断这个用户的登录名称是否是我们想要的 605 if(user.getLoginName().equals(loginName)){ 606 return user; 607 } 608 } 609 return null; // 查询此用户登录名称 610 } 611 }movieSystem
标签:JAVA,进阶,--,movie,System,String,println,public,out From: https://www.cnblogs.com/Flower--Dance/p/16657777.html