java练习---简单电影购票系统项目
介绍:购票系统项目,整个项目分商家和用户两块,比ATM系统稍微复杂,集合循环的嵌套运用更灵活。
商家功能:上架、下架、查询
用户功能:购票、退票、查询、浏览
一、Bean类
1、Fare 电影票类
1 /**
2 * 电影票Bean:电影名、类型、票价
3 * */
4 public class Fare {
5 private String MovName ;
6 private String type;
7 private int price;
8 private int account; //卖出的数量
9
10 public Fare() {
11 }
12
13 public Fare(String movName, String type, int price,int account) {
14 this.MovName = movName;
15 this.type = type;
16 this.price = price;
17 this.account=account;
18 }
19
20 @Override
21 public String toString() {
22 return "Fare{" +
23 "MovName='" + MovName + '\'' +
24 ", type='" + type + '\'' +
25 ", price=" + price +
26 ", account=" + account +
27 '}';
28 }
29
30 public void setAccount(int account) {
31 this.account = account;
32 }
33
34 public int getAccount() {
35 return account;
36 }
37
38 public void setMovName(String movName) {
39 MovName = movName;
40 }
41
42 public void setType(String type) {
43 this.type = type;
44 }
45
46 public void setPrice(int price) {
47 this.price = price;
48 }
49
50 public String getMovName() {
51 return MovName;
52 }
53
54 public String getType() {
55 return type;
56 }
57
58 public int getPrice() {
59 return price;
60 }
61 }
2、Deal 商家类
1 public class Deal { 2 private String id; 3 private String passwd_deal; 4 private Collection<Fare[]> mov; //初始null 5 6 public Deal() { 7 } 8 9 public Deal(String id, String passwd_deal, Collection mov) { 10 this.id = id; 11 this.passwd_deal = passwd_deal; 12 this.mov = mov; 13 } 14 15 public void setId(String id) { 16 this.id = id; 17 } 18 19 public void setPasswd_deal(String passwd_deal) { 20 this.passwd_deal = passwd_deal; 21 } 22 23 public void setMov(Collection<Fare[]> mov) { 24 this.mov = mov; 25 } 26 27 public String getId() { 28 return id; 29 } 30 31 public String getPasswd_deal() { 32 return passwd_deal; 33 } 34 35 public Collection getMov() { 36 return mov; 37 } 38 }
3、User 用户类
1 public class User { 2 private String id ; 3 private String passwd_user; 4 private int cost; //初始0 5 private Collection<Fare[]> fare; //初始null 6 7 public User() { 8 } 9 10 public User(String id, String passwd_user, int cost, Collection fare) { 11 this.id = id; 12 this.passwd_user = passwd_user; 13 this.cost = cost; 14 this.fare = fare; 15 } 16 17 public void setId(String id) { 18 this.id = id; 19 } 20 21 public void setPasswd_user(String passwd_user) { 22 this.passwd_user = passwd_user; 23 } 24 25 public void setCost(int cost) { 26 this.cost = cost; 27 } 28 29 public void setFare(Collection<Fare[]> fare) { 30 this.fare=fare; 31 } 32 33 public String getId() { 34 return id; 35 } 36 37 public String getPasswd_user() { 38 return passwd_user; 39 } 40 41 public int getCost() { 42 return cost; 43 } 44 45 public Collection getFare() { 46 return fare; 47 } 48 }
二、功能实现
1、main方法【主要写整个系统的一套逻辑】
1 //先有main提供整体运行逻辑
2 public static void main(String[] args) {
3 //前提准备
4 Scanner sc = new Scanner(in);//交互
5 Deal deal = new Deal(); //创建商家
6 User user = new User();//创建用户
7 Fare m1 = new Fare(); //创建电影票对象
8 Collection<Deal> list_deal = new ArrayList<>();
9 Collection<User> list_user = new ArrayList<>();
10 Collection<Fare> list_fare = new ArrayList<>();//集合存电影票Fare
11 String id = null; //标识符
12 int a = 0; //判断符
13 int opt; //选择
14 // 循环switch整体选择
15 while (true) {
16 out.println("=======登录电影系统========");
17 while (true) {
18 out.println("请选择首页操作:1:登录用户模式 2:登录商家模式 3:注册账号 4:退出系统");
19 opt = sc.nextInt();
20 switch (opt) {
21 case 1:
22 id = User_login(user, sc);
23 if (id != null) {
24 a = 2;
25 }
26 break;
27 case 2:
28 id = Deal_login(deal, sc);
29 if (id != null) {
30 a = 3;
31 }
32 break;
33 case 3:
34 register(sc, list_deal, list_user);
35 break;
36 case 4:
37 out.println("正在退出系统......");
38 a = 1;
39 break;
40 default:
41 out.println("你的输入有误!请重新输入!");
42 continue;
43 }
44 if (a == 0) { //a=0,登录循环
45 continue;
46 } else { //a!=0 ,表示操作成功,
47 break;
48 }
49 }
50 if ( a == 3) { //a=3 是商家版
51 out.println("请选择你要做什么:1、上架电影 2、下架电影 3、查看售票");
52 int selection = sc.nextInt();
53 switch (selection) {
54 case 1:
55 update(list_fare,list_deal, id, sc);
56 break;
57 case 2:
58 undermine(list_fare,list_deal, id, sc);
59 break;
60 case 3:
61 view(id,list_deal);
62 break;
63 default:
64 out.println("你的输入有误!退出系统");
65 break;
66 }
67 } else if (a == 2) { //用户版
68 while (true) {
69 out.println("请选择你要做什么:1、查看电影票信息 2、指定购票 3、查看个人购票信息");
70 int selection = sc.nextInt();
71 switch (selection) {
72 case 1:
73 looking(list_fare,sc,list_user,id);
74 break;
75 case 2:
76 grave(sc, list_fare,id,list_user);
77 break;
78 case 3:
79 personBuy(id,list_user);
80 break;
81 default:
82 out.println("输入有误,退出登录!!!");
83 break;
84 }
85 }
86 } else {
87 out.println("已退出购票系统!欢迎下次再来");
88 }
89 }
90 }
2、共用功能
2.1 注册
1 private static void register(Scanner sc, Collection<Deal> list_deal, Collection<User> list_user) { 2 out.println("请选择注册账号类型:1、商家 2、用户"); 3 int option = sc.nextInt(); 4 String id = null; 5 String passwd = null; 6 switch (option) { 7 case 1://商家 8 id = "d" + obtainId(); 9 out.println("输入你的密码:"); 10 passwd = sc.next(); 11 Deal d = new Deal(id, passwd, null); 12 list_deal.add(d); 13 out.println("已注册成功!你的账号id是:" + id); 14 break; 15 case 2: //用户 16 id = "u" + obtainId(); 17 out.println("输入你的密码:"); 18 passwd = sc.next(); 19 User u = new User(id, passwd, 0, null); 20 list_user.add(u); 21 out.println("已注册成功!你的账号id是:" + id); 22 break; 23 default: 24 out.println("你的输入有误!退出注册程序......"); 25 break; 26 } 27 }
【获得id】
1 //获得id
2 private static String obtainId() {
3 Random r = new Random();
4 String id = null;
5 StringBuilder sb = new StringBuilder();
6 while (true) {
7 for (int i = 0; i < 10; i++) { //10位id
8 sb.append(r.nextInt(10));
9 } // 0 对应的ascii码是 48
10 if (sb.charAt(0) == 48 && sb.length() != 10) {
11 continue;
12 } else {
13 id = sb.toString();
14 return id;
15 }
16 }
17 }
3、用户各功能
3.1用户登录 【登录功能做了两种,稍微有些累赘,还可以优化,但是两种对后续功能实现更方便】
1 private static String User_login(User user, Scanner sc) {
2 for (int i = 0; i < 3; i++) {
3 out.println("请输入账号id:");
4 String id = sc.next();
5 out.println("请输入你的密码:");
6 String passwd = sc.next();
7 if (user.getId().equals(id) && user.getPasswd_user().equals(passwd)) {
8 out.println("登录成功~~~");
9 return id;
10 } else {
11 out.println("输入有误重新输入!还有" + i + 1 + "次机会");
12 }
13 }
14 out.println("机会用完,退出登录系统......");
15 return null;
16 }
3.2查询用户个人信息
1 private static void personBuy(String id, Collection<User> list_user) { 2 out.println("========以下是"+id+"用户的购票信息========"); 3 for (User user : list_user) { 4 if (user.getId().equals(id)){ 5 Collection<Fare[]>massage = user.getFare(); 6 for (Fare[] fares : massage) { 7 int i = 0; 8 out.println((i+1)+":\n"+fares[i]); 9 i += 1 ; 10 } 11 } 12 } 13 }
3.3购买和浏览电影信息
1 private static void looking(Collection<Fare> list_fare, Scanner sc, Collection<User> list_user, String id) { 2 out.println("========电影信息========="); 3 for (Fare fare : list_fare) { 4 fare.toString(); 5 } 6 out.println("请选择需要购买的电影名:"); 7 String name = sc.next(); 8 out.println("正在购买......"); 9 for (User user : list_user) { 10 if(user.getId().equals(id)){ //锁定用户 11 for (Fare fare : list_fare) { 12 if(fare.getMovName().equals(name)){ //锁定电影 13 fare.setAccount(fare.getAccount()+1); //售出量+1 14 Fare[] fares = {new Fare(name, fare.getType(), fare.getPrice(), fare.getAccount())}; 15 Collection<Fare[]> list = user.getFare(); 16 int price = fare.getPrice(); 17 int cost = price; 18 user.setCost(cost); 19 list.add(fares); 20 user.setFare(list); 21 out.println("购买成功~~"); 22 personBuy(id,list_user); 23 } 24 } 25 } 26 } 27 }
3.4退票【不做展示】
1 private static void grave(Scanner sc, Collection<Fare> list_fare, String id, Collection<User> list_user) { 2 out.println("========退票========="); 3 out.println("请输入想要退票的电影:"); 4 String name = sc.next(); 5 out.println("正在退票........"); 6 for (User user : list_user) { 7 if (user.getId().equals(id)) { 8 if (user.getId().equals(id)) { //锁定用户 9 for (Fare fare : list_fare) { 10 if (fare.getMovName().equals(name)) { //锁定电影 11 fare.setAccount(fare.getAccount()-1); //售出量-1 12 int price = fare.getPrice();//修改cost 13 int cost = user.getCost(); 14 user.setCost(cost-price); 15 Collection<Fare[]> list = user.getFare(); 16 for (Fare[] fares : list) { 17 int i = 0; 18 if (fares[i].getMovName().equals(name)){ 19 list.remove(fares[i]); 20 } 21 i+=1; 22 } 23 user.setFare(list); 24 out.println("退票成功~~"); 25 personBuy(id, list_user); 26 } 27 } 28 } 29 } 30 } 31 }
4、商家各功能
4.1上架电影
1 //上架电影:先在Fare中添加mov信息,更新到list_fare,再使用id在list_deal定位deal位置,找到mov集合属性,更新mov
2 private static void update(Collection<Fare> list_fare, Collection<Deal> list_deal, String id, Scanner sc) {
3 out.println("=========上架电影===========");
4 boolean flag = true; //标识符
5 while (true) {
6 out.println("请输入MovName:");
7 String name = sc.next();
8 out.println("请输入MovType:");
9 String type = sc.next();
10 out.println("请输入MovPrice:");
11 int price = sc.nextInt();
12 int account = 0;
13 Fare f = new Fare(name, type, price, account);
14 for (Fare fare : list_fare) {
15 if (fare.getMovName().equals(f.getMovName())) {
16 out.println("该电影已经存在了~请重新添加");
17 flag = false;
18 break; //直接重新开始上架输入
19 }
20 }
21 if (flag == true) {
22 list_fare.add(f);
23 for (Deal deal : list_deal) {
24 if (deal.getId().equals(id)){
25 //通过id锁定对象,创建新内容,取原内容,对原内容修改后产生新内容,替换set原内容
26 Fare [] mov = {new Fare(name,type,price,0)};
27 Collection<Fare[]> mov2 = deal.getMov();
28 mov2.add(mov);
29 deal.setMov(mov2);
30 break;
31 }
32 }
33 out.println("上架电影成功!");
34 break;
35 }
36 }
37 }
4.2下架电影【其实需要在进入之前再做一个判断,如果该商家的电影列表为空的话,就无法进行下架操作】
1 //下架电影:通过id找到list_deal,删除对应mov信息,遍历list_fare,找到删除 2 private static void undermine(Collection<Fare> list_fare, Collection<Deal> list_deal, String id, Scanner sc) { 3 out.println("=========下架电影==========="); 4 boolean flag = true; //标识符 5 while (true) { 6 out.println("请输入MovName:"); 7 String name = sc.next(); 8 for (Deal deal : list_deal) { 9 if (deal.getId().equals(id)){ 10 Collection<Fare[]> mov1 = deal.getMov(); 11 for (Fare[] fares : mov1) { 12 int i = 0; //相当于遍历数组,取movname 13 if (fares[i].getMovName().equals(name)){ 14 out.println(fares[i]); 15 mov1.remove(fares[i]); 16 } 17 i+=1; 18 } 19 deal.setMov(mov1); //改变后再替换 20 } 21 } 22 //遍历电影信息,修改 23 for (Fare fare : list_fare) { 24 if (fare.getMovName().equals(name)){ 25 out.println(fare); 26 list_fare.remove(fare); 27 break; 28 } 29 } 30 if (flag == true){ 31 out.println("下架电影成功!"); 32 break; 33 } 34 } 35 }
4.3查询电影售票情况
//查看电影售票(name+account)情况:直接显示mov集合
private static void view(String id, Collection<Deal> list_deal) {
for (Deal deal : list_deal) {
if (deal.getId().equals(id)){
Collection<Fare[]> list = deal.getMov();
for (Fare[] fares : list) {
int i = 0;
out.println(i+1+"号:");
out.println("电影名:"+fares[i].getMovName()+
"\n电影售票量:"+fares[i].getAccount());
}
break;
}
}
}
【以上就结束啦,各位在参考的同时可以做更多优化改进】