Java阶段项目展示 -- 电影购票系统
步骤一、
- 集成日志框架、用于后期记录日志信息;
- 定义一个电影类,Movie类包含:片名、主演、评分、时长、票价、余票;
- 系统包含2种角色类型:商家、客户,存在大量相同属性信息;
- 定义User类作为父类,属性:登录名称、密码、真实名称、性别、电话、账户金额;
- 定义Business类代表客户角色,继承User类,独有属性:店铺名称、地址;
- 定义Customer类代表客户角色,继承User类,独有属性:暂无;
- 定义集合List<User>用户存放系统注册的用户对象信息;
- 定义集合Map<Business,List<Movie>>存放商家和其拍片信息。
步骤二、
- 首页需要包含登录,商家入驻,客户注册功能;
- 商家和客户可以共用一个登录功能;
- 判断登录成功的用户的真实类型,根据用户类型完成对应的操作界面设计;
步骤三、【商家功能--展示详情、影片下架、退出】
- 展示本商家的信息和其拍片情况;
- 提供影片上架功能:就是创建一个影片对象,存入到商家的集合中去;
- 退出:回到登录的首页
步骤四、【影片修改、影片下架】
- 影片修改功能:拿到需要修改的影片对象,修改里边的数据后重新将改影片上架;
- 影片下架功能:从商家集合中移除改影片对象
步骤五、【展示全部影片信息、用户购票功能】
- 其实就是遍历全部商家和其拍片信息并展示出来;
- 用户可以选择需要购买票的商家和其电影信息;
- 选择购买数量,购买成功后需要支付金额,并更新商家金额和客户金额
示例代码部分:
1 package com.companyName.bean;
2 /**
3 * 用户类(客户和商家的父类)
4 * */
5 public class User {
6 private String loginName;
7 private String realName;
8 private String password;
9 private char sex;
10 private String phone;
11 private double money;
12
13 public User() {
14 }
15
16 public User(String loginName, String realName, String password, char sex, String phone, double money) {
17 this.loginName = loginName;
18 this.realName = realName;
19 this.password = password;
20 this.sex = sex;
21 this.phone = phone;
22 this.money = money;
23 }
24
25 public String getLoginName() {
26 return loginName;
27 }
28
29 public void setLoginName(String loginName) {
30 this.loginName = loginName;
31 }
32
33 public String getRealName() {
34 return realName;
35 }
36
37 public void setRealName(String realName) {
38 this.realName = realName;
39 }
40
41 public String getPassword() {
42 return password;
43 }
44
45 public void setPassword(String password) {
46 this.password = password;
47 }
48
49 public char getSex() {
50 return sex;
51 }
52
53 public void setSex(char sex) {
54 this.sex = sex;
55 }
56
57 public String getPhone() {
58 return phone;
59 }
60
61 public void setPhone(String phone) {
62 this.phone = phone;
63 }
64
65 public double getMoney() {
66 return money;
67 }
68
69 public void setMoney(double money) {
70 this.money = money;
71 }
72 }
1 package com.companyName.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 }
1 package com.companyName.bean;
2 //客户类
3 public class Customer extends User{
4
5 }
1 package com.companyName.run;
2
3 import com.companyName.bean.Business;
4 import com.companyName.bean.Customer;
5 import com.companyName.bean.Movie;
6 import com.companyName.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 * @param args
19 * //1、存储用户(商家对象、客户对象)
20 */
21 public static final List<User> USERS = new ArrayList<>();
22
23 //定义一个系统扫描器
24 public static final Scanner SYS_SCAN = new Scanner(System.in);
25 //定义一个静态的User类型的变量记住当前登录成功的用户对象(同一时刻只能有一个人处于登录状态<单线程>)
26 public static User loginUser;
27 //定义一个日期格式化类的对象用于格式化时间为我们的自定义形式
28 public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
29 //日志记录
30 public static Logger logger = LoggerFactory.getLogger("MovieSystem");
31 /**
32 * 2、存储系统全部商家和其拍片信息
33 * 商家1 = [m1,m2,m3...]
34 * 商家2 = [m1,m2,m3...]
35 * 商家3 = [m1,m2,m3...]
36 * ......
37 * @param args
38 */
39 public static Map<Business, List<Movie>> MOVIES = new HashMap<>();
40
41 /**
42 * 3、准备一些测试数据
43 * @param args
44 */
45 static {
46 Business c_b = new Business();
47 c_b.setLoginName("阿飞");
48 c_b.setRealName("佐菲");
49 c_b.setPassword("123");
50 c_b.setSex('男');
51 c_b.setPhone("03718512");
52 c_b.setMoney(100);
53 c_b.setShopName("泰华国际影视中心");
54 c_b.setAddress("影院街26号3楼");
55 List<Movie> c_movies = new ArrayList<>();
56 try {
57 Movie m = new Movie("我不是药神","徐峥",9.8,125,35,
58 150,SDF.parse("2021/02/05 15:30:00"));
59 c_movies.add(m);
60 USERS.add(c_b);
61 MOVIES.put(c_b,c_movies);
62 } catch (ParseException e) {
63 System.out.println("解析时间出现异常");
64 e.printStackTrace();
65 }
66
67 Customer c = new Customer();
68 c.setLoginName("用户1号");
69 c.setPassword("123456");
70 c.setRealName("张楠");
71 c.setSex('男');
72 c.setMoney(500);
73 c.setPhone("18342256987");
74 USERS.add(c);
75
76 Customer c1 = new Customer();
77 c1.setLoginName("用户2号");
78 c1.setPassword("234567");
79 c1.setRealName("李嘉佳");
80 c1.setSex('女');
81 c1.setMoney(1500);
82 c1.setPhone("18389468532");
83 USERS.add(c1);
84
85 Customer c2 = new Customer();
86 c2.setLoginName("用户3号");
87 c2.setPassword("345678");
88 c2.setRealName("赵冰琪");
89 c2.setSex('女');
90 c2.setMoney(300);
91 c2.setPhone("15515698956");
92 USERS.add(c2);
93
94 //注意:商家一定要加入到店铺拍片信息中
95
96 Business b = new Business();
97 b.setLoginName("商家1号");
98 b.setPassword("123456");
99 b.setRealName("李乐");
100 b.setSex('男');
101 b.setMoney(0);
102 b.setPhone("03715645");
103 b.setAddress("影院街");
104 b.setShopName("中英数字影城");
105 USERS.add(b);
106 //一个影院可以对应多部影片信息,【当前不放影片信息】
107 List<Movie> movies = new ArrayList<>();
108 MOVIES.put(b,movies);
109
110 Business b2 = new Business();
111 b2.setLoginName("商家2号");
112 b2.setPassword("123456");
113 b2.setRealName("赵倩");
114 b2.setSex('女');
115 b2.setMoney(0);
116 b2.setPhone("060-1812-5356");
117 b2.setAddress("小夏街");
118 b2.setShopName("奥斯卡数字影城");
119 USERS.add(b2);
120 //一个影院可以对应多部影片信息,【当前不放影片信息】
121 List<Movie> movies2 = new ArrayList<>();
122 MOVIES.put(b2,movies2);
123
124 }
125 public static void main(String[] args) {
126 showMain();//展示主界面
127 }
128 private static void showMain() {
129 while (true) {
130 System.out.println("***********电影系统主界面*************");
131 System.out.println("******1、登录 2、用户注册*********");
132 System.out.println("******3、商家注册 *********");
133 System.out.println("************************************");
134
135 System.out.println("请输入操作命令");
136 String command = SYS_SCAN.nextLine();
137 switch (command){
138 case "1":
139 //登录功能
140 login();
141 break;
142 case "2":
143 break;
144 case "3":
145 break;
146 default:
147 System.out.println("该操作不被支持,请重新选择~");
148 }
149 }
150 }
151
152 private static void login() {
153 while (true) {
154 System.out.println("请输入登录名:");
155 String loginName = SYS_SCAN.nextLine();
156 //根据用户名到USERS集合里面查询用户
157 User user = getUserByLoginName(loginName);
158 if (user == null){
159 System.out.println("登录名不正确,请重新输入~");
160 }else {
161 //用户名正确,校验密码
162 System.out.println("请输入密码:");
163 String password = SYS_SCAN.nextLine();
164 if (user.getPassword().equals(password)){
165 //密码正确,登录成功
166 loginUser = user;
167 //判断用户的真实类型(商家、客户)
168 if (user instanceof Business){
169 //展示商家界面
170 showBusinessMain();
171 }else if(user instanceof Customer){
172 //展示客户界面
173 showCustomerMain();
174 }
175 return;
176 }else {
177 System.out.println("密码错误,请重新输入~");
178 }
179 }
180 }
181 }
182
183 //客户操作界面
184 private static void showCustomerMain() {
185 logger.info(loginUser.getRealName() + "客户登录了系统,正在进行客户操作");
186 System.out.println("******* 客户界面 ************");
187 System.out.println("欢迎" + loginUser.getRealName() + (loginUser.getSex() == '男' ? "先生" : "女士") + "进入系统");
188 System.out.println("******1、展示全部的影片信息 2、根据电影名称查询影片信息 *********");
189 System.out.println("******3、购票 4、退出系统 *********");
190 System.out.println("*******************************************************");
191 while (true){
192 System.out.println("请输入操作命令:");
193 String command = SYS_SCAN.nextLine();
194 switch (command){
195 case "1":
196 //展示全部影片信息
197 showAllMovies();
198 break;
199 case "2":
200 break;
201 case "3":
202 //用户购票
203 buyMovieTicket();
204 break;
205 case "4":
206 return;
207 default:
208 System.out.println("该操作不被支持~");
209 }
210 }
211 }
212
213 //用户购票
214 private static void buyMovieTicket() {
215 showAllMovies();
216 System.out.println("********用户购票**********");
217 while (true) {
218 System.out.println("请输入你要购买的影院名称:");
219 String shopName = SYS_SCAN.nextLine();
220 //根据店铺名,在MOVIES中查找是否存在改影院
221 Business b = findShopByShopName(shopName);
222 if (b == null){
223 System.out.println("你所查找的影院不存在");
224 continueOrNot();
225 }else {
226 //影院存在,展示改店铺下的所有影片信息
227 List<Movie> movies = MOVIES.get(b);
228 if (movies.size() > 0){
229 System.out.println("店铺名:" + b.getShopName() + ",店铺地址:" + b.getAddress() + ",联系电话:" + b.getPhone());
230 //遍历movies集合
231 System.out.println("影片名:" + "\t\t" + "主演:" + "\t\t" + "评分:" + "\t\t" +
232 "时长:" + "\t\t" + "票价:" + "\t\t" + "放映时间:" );
233 for (Movie movie : movies) {
234 System.out.println(movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getScore() + "\t\t" +
235 movie.getTime() + "\t\t" + movie.getPrice() + "\t\t" + SDF.format(movie.getStartTime()));
236 }
237 //查询影片(从当前movies集合中)
238 while (true) {
239 System.out.println("请输入影片名:");
240 String movieName = SYS_SCAN.nextLine();
241 Movie movie = findMovieByMovieNameAndBusiness(movies,movieName);
242 if (movie == null){
243 System.out.println("影片不存在,请重新确认");
244 continueOrNot();
245 }else {
246 //影片存在,展示改影片的详情
247 System.out.println("模糊匹配到影片:" + movie.getName());
248 System.out.println("影片名:" + "\t\t" + "主演:" + "\t\t" + "评分:" + "\t\t" +
249 "时长:" + "\t\t" + "票价:" + "\t\t" + "放映时间:" );
250 System.out.println(movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getScore() + "\t\t" +
251 movie.getTime() + "\t\t" + movie.getPrice() + "\t\t" + SDF.format(movie.getStartTime()));
252 while (true) {
253 System.out.println("请输入您要购买的票数:");
254 String numberOfTicket = SYS_SCAN.nextLine();
255 int number = Integer.valueOf(numberOfTicket);
256 double price = movie.getPrice();
257 double total = BigDecimal.valueOf(number).multiply(BigDecimal.valueOf(price)).doubleValue();
258 System.out.println("总金额为:" + total);
259 Customer c = (Customer) loginUser;
260 if(total < c.getMoney()){
261 //成功买票、计算金额(商家、顾客),更改票数
262 b.setMoney(b.getMoney() + total);
263 c.setMoney(c.getMoney() - total);
264 movie.setNumber(movie.getNumber() - number);
265 System.out.println("尊敬的客户:" + c.getRealName() + ",您已经在影院" + b.getShopName() + "购买了" + number + "张" +
266 "电影票 -- 《" + movie.getName() + "》,放映时间为:" + SDF.format(movie.getStartTime()) + ",请牢记," + "当前账户余额:" + c.getMoney());
267 return;
268 }else {
269 System.out.println("金额不足");
270 continueOrNot();
271 }
272 }
273 }
274 }
275 }else {
276 System.out.println("当前无片可播~");
277 }
278 }
279 }
280 }
281
282 private static Movie findMovieByMovieNameAndBusiness(List<Movie> movies, String movieName) {
283 for (Movie movie : movies) {
284 if (movie.getName().contains(movieName)){
285 return movie;
286 }
287 }
288 return null;
289 }
290
291 private static void continueOrNot() {
292 System.out.println("继续否? y/n");
293 String command = SYS_SCAN.nextLine();
294 switch (command){
295 case "y":
296 break;
297 case "n":
298 return;
299 default:
300 System.out.println("操作不被支持");
301 }
302 }
303
304
305 private static Business findShopByShopName(String shopName) {
306 Set<Business> businesses = MOVIES.keySet();
307 for (Business business : businesses) {
308 if (business.getShopName().equals(shopName)){
309 return business;
310 }
311 }
312 return null;
313 }
314
315
316 /**
317 * 展示系统全部的影片信息
318 */
319 private static void showAllMovies() {
320 System.out.println("**********展示全部影院及拍片详情页*************");
321 MOVIES.forEach((b, movies) -> {
322 System.out.println("店铺名:" + b.getShopName() + ",店铺地址:" + b.getAddress() + ",联系电话:" + b.getPhone());
323 System.out.println("影片名:" + "\t\t" + "主演:" + "\t\t" + "评分:" + "\t\t" +
324 "时长:" + "\t\t" + "票价:" + "\t\t" + "放映时间:" );
325 for (Movie movie : movies) {
326 System.out.println("\t\t" + movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getScore() + "\t\t" +
327 movie.getTime() + "\t\t" + movie.getPrice() + "\t\t" + SDF.format(movie.getStartTime()));
328 }
329 });
330 }
331
332 //商家操作界面
333 private static void showBusinessMain() {
334 logger.info(loginUser.getRealName() + "商家登录了商家操作界面");
335 while (true){
336 System.out.println("*********商家操作主界面***************");
337 System.out.println("欢迎" + loginUser.getRealName() + (loginUser.getSex() == '男' ? "先生" : "女士") + "进入系统");
338 System.out.println("当前账户余额:----------------> " + loginUser.getMoney());
339 System.out.println("****1、展示影片详情 2、上架电影****");
340 System.out.println("****3、下架电影 4、修改电影*****");
341 System.out.println("********** 5、退出 **************");
342 System.out.println("***********************************");
343 System.out.println("请输入操作命令");
344 String command = SYS_SCAN.nextLine();
345 switch (command){
346 case "1":
347 //展示当前登录商家的拍片信息
348 showBusinessInfo();
349 break;
350 case "2":
351 //上架电影
352 addMovie();
353 break;
354 case "3":
355 //下架电影
356 removeMovies();
357 break;
358 case "4":
359 //修改电影
360 updateMovie();
361 break;
362 case "5":
363 //退出
364 return;
365 default:
366 System.out.println("您的操作不被支持,请重新选择");
367 }
368 }
369 }
370
371 private static void updateMovie() {
372 System.out.println("********修改电影界面**********");
373 Business b = (Business) loginUser;
374 List<Movie> movies = MOVIES.get(b);
375 System.out.println("请输入您要修改的电影名称:");
376 String movieName = SYS_SCAN.nextLine();
377 Movie movie = findMovieByMovieName(movieName);
378 if (movie == null){
379 System.out.println("影片不存在,请问需要继续修改吗?y/n");
380 String command = SYS_SCAN.nextLine();
381 switch (command){
382 case "y":
383 break;
384 case "n":
385 return;
386 }
387 }else {
388 //找到电影了哈~
389 System.out.println("模糊检索到电影名为:" + movie.getName());
390 System.out.println("**********商家修改电影页面*************");
391 System.out.println("请输入修改后的电影名:");
392 String name = SYS_SCAN.nextLine();
393 System.out.println("请输入修改后的主演:");
394 String actor = SYS_SCAN.nextLine();
395 System.out.println("请输入修改后的评分:");
396 String str_score = SYS_SCAN.nextLine();
397 System.out.println("请输入修改后的时长:");
398 String time = SYS_SCAN.nextLine();
399 System.out.println("请输入修改后的票价:");
400 String str_price = SYS_SCAN.nextLine();
401 System.out.println("请输入修改后的余票:");
402 String str_number = SYS_SCAN.nextLine();
403 while (true) {
404 try {
405 System.out.println("放映时间:(格式:yyyy/MM/dd HH:mm:ss");
406 String str_starTime = SYS_SCAN.nextLine();
407 // Movie update_movie = new Movie(name,actor,Double.valueOf(str_score),Double.valueOf(time),
408 // Double.valueOf(str_price),Integer.valueOf(str_number),SDF.parse(str_starTime));
409 movie.setName(name);
410 movie.setActor(actor);
411 movie.setScore(Double.valueOf(str_score));
412 movie.setTime(Double.valueOf(time));
413 movie.setPrice(Double.valueOf(str_price));
414 movie.setNumber(Integer.valueOf(str_number));
415 movie.setStartTime(SDF.parse(str_starTime));
416 System.out.println("修改后的影片《" + movie.getName() + "》已上架成功");
417 showBusinessInfo();
418 return;
419 } catch (ParseException e) {
420 logger.error("解析时间出现异常");
421 System.out.println("时间格式不正确,请重新输入");
422 e.printStackTrace();
423 }
424 }
425 }
426 }
427
428 private static void removeMovies() {
429 while (true) {
430 System.out.println("**********商家下架电影页面**********");
431 System.out.println("请输入您要下架的电影名称:");
432 Business b = (Business)loginUser;
433 List<Movie> movies = MOVIES.get(b);
434 String movieName = SYS_SCAN.nextLine();
435 Movie movie = findMovieByMovieName(movieName);
436 if (movie == null){
437 System.out.println("您的系统中不存在改影片,请确认");
438 while (true){
439 System.out.println("要下架其它的影片吗,y/n?");
440 String command = SYS_SCAN.nextLine();
441 switch (command){
442 case "y":
443 break;
444 case "n":
445 return;
446 default:
447 System.out.println("操作不被支持");
448 }
449 }
450 }else {
451 movies.remove(movie);
452 System.out.println("影片《" + movie.getName() + "》已被成功下架");
453 return;
454 }
455 }
456 }
457
458 private static Movie findMovieByMovieName(String movieName) {
459 Business b = (Business)loginUser;
460 //从商家对象(根据商家对象)查询到改店铺所有的影片信息,将其放置在集合中
461 List<Movie> movies = MOVIES.get(b);
462 for (Movie movie : movies) {
463 if (movie.getName().contains(movieName)){ //模糊匹配,equals:精准匹配
464 return movie;
465 }
466 }
467 return null;
468 }
469
470 private static void addMovie() {
471 Business b = (Business)loginUser;
472 List<Movie> movies = MOVIES.get(b);
473
474 System.out.println("**********商家上架电影页面*************");
475 System.out.println("请输入电影名:");
476 String name = SYS_SCAN.nextLine();
477 System.out.println("主演:");
478 String actor = SYS_SCAN.nextLine();
479 System.out.println("评分:");
480 String str_score = SYS_SCAN.nextLine();
481 System.out.println("时长:");
482 String time = SYS_SCAN.nextLine();
483 System.out.println("票价:");
484 String str_price = SYS_SCAN.nextLine();
485 System.out.println("余票:");
486 String str_number = SYS_SCAN.nextLine();
487 while (true) {
488 try {
489 System.out.println("放映时间:(格式:yyyy/MM/dd HH:mm:ss");
490 String str_starTime = SYS_SCAN.nextLine();
491 Movie movie = new Movie(name,actor,Double.valueOf(str_score),Double.valueOf(time),
492 Double.valueOf(str_price),Integer.valueOf(str_number),SDF.parse(str_starTime));
493 movies.add(movie);
494 System.out.println("影片" + movie.getName() + "已上架成功");
495 return;
496 } catch (ParseException e) {
497 logger.error("解析时间出现异常");
498 System.out.println("时间格式不正确,请重新输入");
499 e.printStackTrace();
500 }
501 }
502 }
503
504 private static void showBusinessInfo() {
505 logger.info(loginUser.getRealName() + "商家正在查看影院详情");
506 System.out.println("*********商家详情页面***********");
507 Business b = (Business)loginUser;
508 //商家名 -- > 改商家的详细信息:地址、店铺名、影片...
509 List<Movie> movies = MOVIES.get(b);
510 if (movies.size() > 0){
511 System.out.println("店铺名:" + b.getShopName() + ",店铺地址:" + b.getAddress() + ",联系电话:" + b.getPhone() + ",金额:" + b.getMoney());
512 //遍历movies集合
513 System.out.println("影片名:" + "\t\t" + "主演:" + "\t\t" + "评分:" + "\t\t" +
514 "时长:" + "\t\t" + "票价:" + "\t\t" + "放映时间:" );
515 for (Movie movie : movies) {
516 System.out.println(movie.getName() + "\t\t" + movie.getActor() + "\t\t" + movie.getScore() + "\t\t" +
517 movie.getTime() + "\t\t" + movie.getPrice() + "\t\t" + SDF.format(movie.getStartTime()));
518 }
519 }else {
520 System.out.println("当前无片可播~");
521 }
522 }
523
524 private static User getUserByLoginName(String loginName) {
525 for (User user : USERS) {
526 if (user.getLoginName().equals(loginName)){
527 //判断用户的真实类型(商家、客户)
528 return user;
529 }
530 }
531 return null;
532 }
533 }
总的来说,项目逻辑结构倒不是多难,只是挺繁琐的,由于功能较为繁多,在此的示例运行代码就不意义列举了哈~
分类:
Java语言学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY