首页 > 编程语言 >JAVA进阶--日志框架、阶段项目实战--2022年9月5日

JAVA进阶--日志框架、阶段项目实战--2022年9月5日

时间:2022-09-05 20:11:43浏览次数:81  
标签:JAVA 进阶 -- movie System String println public out

第一节  日志框架

  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、调用日志对象的方法记录日志信息

      

 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配置详解-输出位置、格式设置

    

 

     总结:

      

 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(忽略大小写),只输出当前级别及高于该级别日志

    

第二节  阶段项目实战--电影购票系统

=====================================================================================================

 

 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
 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
 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
 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
  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

相关文章

  • 【图像处理笔记】图像分割基础知识
    形态学处理相同,图像分割操作的输入是图像,输出是从图像中提取出来的属性。本章的大多数分割算法都基于图像灰度值的两个基本性质之一:不连续性和相似性。第一类方法根据灰度......
  • 选择器与属性和浮动,定位(3)
    分组与嵌套#多个选择器可以并列公用一套css样式div,p,span{}#不同选择器之间也可以混合使用.c1,#d1>span{}伪类选择器a:link{}#访问之前状态a:hover{}......
  • DKK 模型
    QsymmPythonimportnumpyasnpimportsympyimportqsymm#SpatialinversionpU=np.array([[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]......
  • 遇到ImportError: cannot import name ‘soft_unicode’ from 'markupsafe’问题
    运行jupyternotebook的时候报错:ImportError:cannotimportname'soft_unicode'from'markupsafe'这个报错应该怎么解决呢?1、根据错误提示,我们发现是导入markupsafe这......
  • python学习(元组、字典、set集合)
    (一)、列表 1、列表的嵌套 需求:输出数字9 解决:利用索引层级输出   2、列表的切片   (二)、元组:tuple1、列表与元组的区别?列表是可变的,元组是不可变的......
  • 51 | JAVA_数据库JDBC_连接池
    JDBC连接池类似的,在执行JDBC的增删改查的操作时,如果每一次操作都来一次打开连接,操作,关闭连接,那么创建和销毁JDBC连接的开销就太大了。为了避免频繁地创建和销毁JDBC连接,我......
  • 53 | JAVA_TCP编程
    TCP编程使用Socket进行网络编程时,本质上就是两个进程之间的网络通信。其中一个进程必须充当服务器端,它会主动监听某个指定的端口,另一个进程必须充当客户端,它必须主动连接......
  • python(二)元组、字典、集合
    11.列表的嵌套##列表的嵌套、字符类型#list4=[1,'go','你好',1008.21,True['json','java','c++','go',[1,2,3,7]]]#print(list4[])##列表的切片,获取列表中指定范围的......
  • 52 | JAVA_网络编程基础
    网络编程基础ip地址在互联网中,一个IP地址用于唯一标识一个网络接口(NetworkInterface)。一台联入互联网的计算机肯定有一个IP地址,但也可能有多个IP地址。IP地址又......
  • Directory.GetFiles、GetDirectories 的三个参数
    Directory.GetFiles、GetDirectories的三个参数Directory.GetFiles获取指定目录下的文件路径。第一个参数是目录路径。第二个参数默认是取所有文件,可以指定通配符限定,......