目錄
電影購票系統
日志框架搭建,系統角色分析
系統角色類准備
- 集成日志框架、用於后期記錄日志
- 定義一個電影類Movie類,Movie類包含:片名、主演、評分、時長、票價、余票
- 系統包含兩個用戶角色:客戶、商家、存在大量相同屬性信息
- 定義User類作為父類,屬性:登錄名稱,密碼、真實名稱、性別、電話、賬戶金額
- 定義Business類代表商家角色,屬性:店鋪名稱、地址
- 定義Customer類代表客戶角色,屬性:
- 定義集合List
用戶存放系統注冊的用戶對象信息 - 定義Map<Business,List
>存放商家和其排片信息
首頁設計、登錄、商家界面、用戶界面實現
- 首頁需要包含登錄,商家入駐,客戶注冊功能。
- 商家和客戶可以共用一個登錄功能。
- 判斷登錄成功的用戶的真實類型,根據用戶類型完成對應的操作界面設計
商家-詳情頁設計、影片上架、退出
- 展示本商家的信息和其排片情況。
- 提供影片上架功能:就是創建一個影片對象,存入到商家的集合中去
- 退出,需要回到登錄的首頁
商家-影片下架、影片修改
- 提供影片下架功能:其實就是從商家的集合中刪除影片對象
- 影片修改功能:拿到需要修改的影片對象,修改里面的數據
用戶-展示全部影片
- 其實就是 遍歷全部商家和其排片信息並展示出來
用戶-購票功能
- 用戶可以選擇需要購買的商家和電影信息
- 可以選擇購買數量
- 購買成功后需要支付金額,並更新商家金額和客戶金額
用戶-評分功能
用戶-評分降序展示
用戶-根據名片查詢全部影片信息
movie類
package com.csl.bean;
import java.util.Date;
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;
}
}
User類
package com.csl.bean;
public class User {
private String loginName;
private String passWord;
private String userName;//真實姓名
private char sex;
private String phone;
private double money;//賬戶余額
public User() {
}
public User(String loginName, String passWord, String realName, char sex, String phone, double money) {
this.loginName = loginName;
this.passWord = passWord;
this.userName = realName;
this.sex = sex;
this.phone = phone;
this.money = money;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char 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;
}
}
Customer和Business類
package com.csl.bean;
/**
客戶角色
*/
public class Customer extends User {
}
package com.csl.bean;
/**
商家角色
*/
public class Business extends User {
private String shopName;
private String address;
public Business() {
}
public Business(String shopName, String address) {
this.shopName = shopName;
this.address = 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;
}
}
MovieSystem
package com.csl.run;
import com.csl.bean.Business;
import com.csl.bean.Customer;
import com.csl.bean.Movie;
import com.csl.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.存儲很多用戶、(客戶對象,商家對象)
*/
private static final List<User> ALL_USERS = new ArrayList<>();
/**
* 2.存儲系統全部商家何其排片信息
* 商家1 = [p1,p2,p3...]
* 商家2 = 【p2,p3...]
*/
public static final Map<Business, List<Movie>> ALL_MOVIES = new HashMap<>();
public static final Scanner SYS_SC = new Scanner(System.in);
public static User loginUser;
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// public static final Logger LOGGER = LoggerFactory.getLogger("MovieSystem.class");
/**
3.准備一些測試數據
*/
static {
Customer c1 = new Customer();
c1.setLoginName("cs123");
c1.setPassWord("123456");
c1.setUserName("陳太帥");
c1.setMoney(1000);
c1.setSex('男');
c1.setPhone("95277");
ALL_USERS.add(c1);
Customer c2 = new Customer();
c2.setLoginName("sm999");
c2.setPassWord("123456");
c2.setUserName("小白龍");
c2.setMoney(2000);
c2.setSex('女');
c2.setPhone("11111");
ALL_USERS.add(c2);
Business b = new Business();
b.setLoginName("bjt666");
b.setPassWord("123123");
b.setUserName("白敬亭");
b.setMoney(0);
b.setSex('男');
b.setPhone("110110");
b.setShopName("江寧萬達影城");
b.setAddress("萬達商場");
ALL_USERS.add(b);
//注意:商家一定需要加入到店鋪排片信息中去
List<Movie> movies = new ArrayList<>();
ALL_MOVIES.put(b, movies);
Business b2 = new Business();
b2.setLoginName("zjm123");
b2.setPassWord("123123");
b2.setUserName("趙今麥");
b2.setMoney(0);
b2.setSex('女');
b2.setPhone("112112");
b2.setShopName("同曦巨幕影院");
b2.setAddress("吾悅廣場");
ALL_USERS.add(b2);
//注意:商家一定需要加入到店鋪排片信息中去
List<Movie> movies1 = new ArrayList<>();
ALL_MOVIES.put(b2, movies1);
}
public static void main(String[] args) {
showMain();
}
/**
* 首頁展示
*/
private static void showMain() {
while (true) {
System.out.println("============歡迎光臨購票系統============");
System.out.println("1.登錄");
System.out.println("2.商家入駐");
System.out.println("3.客戶注冊");
System.out.println("請輸入相應的指令:");
String command = SYS_SC.nextLine();
switch (command) {
case "1":
//登錄
login();
break;
case "2":
//商家入駐
break;
case "3":
//客戶注冊
break;
default:
System.out.println("你輸入的指令有誤!");
}
}
}
/**
* 用戶登錄功能
*/
private static void login() {
while (true) {
System.out.println("============登錄界面=============");
System.out.println("請輸入登錄名稱:");
String loginName = SYS_SC.nextLine();
System.out.println("請輸入登錄密碼:");
String passWord = SYS_SC.nextLine();
//1.根據用戶名稱去查用戶對象
User u = getUserByLoginName(loginName);
// LOGGER.info(u.getUserName() + "登錄了系統~~");
//2.判斷用戶名對象是否存在,存在說明用戶名正確
if (u != null) {
//3.判斷密碼是否正確
if (u.getPassWord().equals(passWord)) {
//登錄成功了
loginUser = u;//記住登錄成功的用戶
//判斷用戶是商家還是客戶
if (u instanceof Customer) {
//當前登錄的是客戶
showCustomerMain();
} else {
//當前登錄的是商家
showBusinessMain();
}
} else {
System.out.println("密碼不正確!");
}
} else {
System.out.println("輸入的用戶名有誤,請核實!");
}
}
}
/**
* 商家的后台操作頁面
*/
private static void showBusinessMain() {
while (true) {
System.out.println("===========商家電影操作界面===========");
System.out.println(loginUser.getUserName() + (loginUser.getSex() == '男' ? "先生" : "女士"));
System.out.println("請選擇要操作的功能:");
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 = SYS_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(loginUser.getUserName() + "歡迎下次再來!");
return;
default:
System.out.println("指令有誤!");
}
}
}
/**
* 修改電影
*/
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 = SYS_SC.nextLine();
Movie movie = getMovieByName(movieName);
if (movie != null) {
//修改它
System.out.println("請輸入修改后的新片名:");
String name = SYS_SC.nextLine();
System.out.println("請輸入修改后的主演:");
String actor = SYS_SC.nextLine();
System.out.println("請輸入修改后的時長:");
String time = SYS_SC.nextLine();
System.out.println("請輸入修改后的票價:");
String price = SYS_SC.nextLine();
System.out.println("請輸入修改后的票數:");
String totalNumber = SYS_SC.nextLine();
while (true) {
try {
System.out.println("請輸入修改后的影片放映時間:");
String stime = SYS_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(stime));
System.out.println("恭喜您成功修改了該影片!!!");
showBusinessInfos();
return;
} catch (Exception e) {
e.printStackTrace();
//LOGGER.error("時間解析錯誤!");
}
}
} else {
System.out.println("您輸入的電影名有誤請選擇是否重新輸入:y/n");
String command = SYS_SC.nextLine();
switch (command) {
case "y":
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("當前無片可下架!");
}
while (true) {
//2.讓用戶選擇要下架的電影
System.out.println("請輸入要下架的電影名");
String movieName = SYS_SC.nextLine();
//3.去查詢有沒有這個影片對象
Movie movie = getMovieByName(movieName);
if (movie != null) {
//下架它
movies.remove(movie);
System.out.println(movie.getName() + "下架成功!");
showBusinessInfos();
return;
} else {
System.out.println("無此片可下架!");
System.out.println("請選擇是否繼續查找y/n:");
String command = SYS_SC.nextLine();
switch (command) {
case "y":
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)) {
return movie;
}
}
return null;
}
/**
* 商家進行電影上架
* Map<Business,List<Movie>> ALL_MOVIES
* u1 = [p1,p2,p3]
* u2 = [p1,p2,p3]
*/
private static void addMovie() {
Business business = (Business) loginUser;
List<Movie> movies = ALL_MOVIES.get(business);
System.out.println("請輸入新片名:");
String name = SYS_SC.nextLine();
System.out.println("請輸入主演:");
String actor = SYS_SC.nextLine();
System.out.println("請輸入時長:");
String time = SYS_SC.nextLine();
System.out.println("請輸入票價:");
String price = SYS_SC.nextLine();
System.out.println("請輸入票數:");
String totalNumber = SYS_SC.nextLine();
while (true) {
try {
System.out.println("請輸入影片放映時間:");
String stime = SYS_SC.nextLine();
Movie movie = new Movie(name, actor, Double.valueOf(time), Double.valueOf(price)
, Integer.valueOf(totalNumber), sdf.parse(stime));
movies.add(movie);
System.out.println("《" + movie.getName() + "》" + "影片上架成功!");
return;
} catch (ParseException e) {
e.printStackTrace();
//LOGGER.error("時間解析錯誤!");
}
}
}
/**
* 展示商家的詳細:展示商家當前的信息
*/
private static void showBusinessInfos() {
System.out.println("===========商家===========");
//LOGGER.info(loginUser.getUserName() + "商家正在查看自己的詳情、、、");
//根據商家對象(就是登錄的用戶:loginUser),作為Map集合的鍵,提取對應的值就是其影片信息:Map<Business,List<Movie>> ALL_MOVIES
Business business = (Business) loginUser;
System.out.println(business.getShopName() + "\t\t電話:" + business.getPhone() + "\t\t地址:" +
business.getAddress()+"\t\t賬戶余額:"+loginUser.getMoney());
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\t\t放映時間");
for (Movie movie : movies) {
System.out.println(movie.getName() + "\t\t\t" + movie.getActor() + "\t\t" + movie.getTime() +
"\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t\t\t" + movie.getNumber() + "\t\t" + sdf.format(movie.getStartTime()));
}
} else {
System.out.println("當前店鋪無片在放映。。。");
}
}
/**
* 客戶的后台操作界面
*/
private static void showCustomerMain() {
while (true) {
System.out.println("===========客戶電影操作界面===========");
System.out.println(loginUser.getUserName() + (loginUser.getSex() == '男' ? "先生" : "女生")
+ "歡迎您登錄!" + "\t\t余額:" + loginUser.getMoney());
System.out.println("請選擇要操作的功能:");
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 = SYS_SC.nextLine();
switch (command) {
case "1":
//展示全部的影片信息
showAllMovies();
break;
case "2":
//根據電影名稱查詢影片信息
break;
case "3":
//評分功能
break;
case "4":
//購票功能
buyMovie();
break;
case "5":
//退出系統
return;
default:
System.out.println("指令有誤!");
}
}
}
/**
* 用戶購票功能
*/
private static void buyMovie() {
showAllMovies();
System.out.println("=============用戶購票功能==============");
while (true) {
System.out.println("請輸入要購票的門店:");
String shopName = SYS_SC.nextLine();
//查詢是否存在該商家
Business business = getBusinessByShopName(shopName);
if (business == null) {
System.out.println("對不起沒有該店鋪,請確認");
} else {
//2.此商家的全部排片
List<Movie> movies = ALL_MOVIES.get(business);
//3.判斷是否存在上映的電影
if (movies.size() > 0) {
//4.開始選片購買
while (true) {
System.out.println("請您輸入需要購買的電影名稱");
String movieName = SYS_SC.nextLine();
//去當前商家下,查詢該電影對象
Movie movie = getMovieByShopName(business, movieName);
if (movie != null) {
//開始購買
while (true) {
System.out.println("請輸入要購買電影票數:");
String number = SYS_SC.nextLine();
int buyNumber = Integer.valueOf(number);
//判斷電影票數量是否購買
if (movie.getNumber() >= buyNumber) {
//可以購買了
//當前需要支付的金額
double money = BigDecimal.valueOf(movie.getPrice()).multiply(BigDecimal.valueOf(buyNumber))
.doubleValue();
if (loginUser.getMoney() >= money) {
//終於可以買票了
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("余額不足是否繼續y/n");
String command = SYS_SC.nextLine();
switch (command) {
case "y":
break;
default:
System.out.println("好的!");
return;
}
}
} else {
//票數不夠
System.out.println("您當前最多可以購買:" + movie.getNumber() + "張");
System.out.println("是否繼續買票y/n");
String command = SYS_SC.nextLine();
switch (command) {
case "y":
break;
default:
System.out.println("好的!");
return;
}
}
}
} else {
System.out.println("電影名稱有毛病!");
}
}
//去當前商家下去查詢該電影對象
} else {
System.out.println("電影院關門了~~~");
System.out.println("是否繼續買票y/n");
String command = SYS_SC.nextLine();
switch (command) {
case "y":
break;
default:
System.out.println("好的!");
return;
}
}
}
}
}
/**
* 根據影院名稱查詢是否有要購買的電影
*/
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 Business getBusinessByShopName(String shopname) {
Set<Business> businesses = ALL_MOVIES.keySet();
for (Business business : businesses) {
if (business.getShopName().contains(shopname)) {
return business;
}
}
return null;
}
/**
* 用戶功能: 展示全部商家和其排片信息
*/
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\t\t放映時間");
for (Movie movie : movies) {
System.out.println("\t\t\t" + movie.getName() + "\t\t\t" + movie.getActor() + "\t\t" + movie.getTime() +
"\t\t" + movie.getScore() + "\t\t" + movie.getPrice() + "\t\t\t\t" + movie.getNumber() + "\t\t" + sdf.format(movie.getStartTime()));
}
});
}
/**
* 根據用戶名去查集合中是否有這個登錄名
*/
public static User getUserByLoginName(String loginName) {
for (User user : ALL_USERS) {
//判斷這個用戶的登錄名稱是否是我們想要的
if (user.getLoginName().equals(loginName)) {
return user;
}
}
return null;//查無此用戶名
}
}
output:
============歡迎光臨購票系統============
1.登錄
2.商家入駐
3.客戶注冊
請輸入相應的指令:
1
============登錄界面=============
請輸入登錄名稱:
zjm123
請輸入登錄密碼:
123123
===========商家電影操作界面===========
趙今麥女士
請選擇要操作的功能:
1.展示詳情:
2.上架電影:
3.下架電影:
4.修改電影:
5.退出:
請輸入你要操作的指令:
1
===========商家===========
同曦巨幕影院 電話:112112 地址:吾悅廣場 賬戶余額:0.0
當前店鋪無片在放映。。。
===========商家電影操作界面===========
趙今麥女士
請選擇要操作的功能:
1.展示詳情:
2.上架電影:
3.下架電影:
4.修改電影:
5.退出:
請輸入你要操作的指令:
2
請輸入新片名:
開端
請輸入主演:
趙今麥
請輸入時長:
120
請輸入票價:
50
請輸入票數:
100
請輸入影片放映時間:
2021/01/18
java.text.ParseException: Unparseable date: "2021/01/18"
at java.text.DateFormat.parse(DateFormat.java:366)
at com.csl.run.MovieSystem.addMovie(MovieSystem.java:340)
at com.csl.run.MovieSystem.showBusinessMain(MovieSystem.java:181)
at com.csl.run.MovieSystem.login(MovieSystem.java:144)
at com.csl.run.MovieSystem.showMain(MovieSystem.java:103)
at com.csl.run.MovieSystem.main(MovieSystem.java:86)
請輸入影片放映時間:
2021/01/20 12:12:12
《開端》影片上架成功!
===========商家電影操作界面===========
趙今麥女士
請選擇要操作的功能:
1.展示詳情:
2.上架電影:
3.下架電影:
4.修改電影:
5.退出:
請輸入你要操作的指令:
5
趙今麥歡迎下次再來!
============登錄界面=============
請輸入登錄名稱:
cs123
請輸入登錄密碼:
123456
===========客戶電影操作界面===========
陳太帥先生歡迎您登錄! 余額:1000.0
請選擇要操作的功能:
1.展示全部的影片信息
2.根據電影名稱查詢影片信息
3.評分功能:
4.購票功能:
5.退出系統:
請輸入你要操作的指令:
1
==========展示全部商家排片信息===========
同曦巨幕影院 電話:112112 地址:吾悅廣場
片名 主演 時長 評分 票價 余票數量 放映時間
開端 趙今麥 120.0 0.0 50.0 100 2021/01/20 12:12:12
江寧萬達影城 電話:110110 地址:萬達商場
片名 主演 時長 評分 票價 余票數量 放映時間
===========客戶電影操作界面===========
陳太帥先生歡迎您登錄! 余額:1000.0
請選擇要操作的功能:
1.展示全部的影片信息
2.根據電影名稱查詢影片信息
3.評分功能:
4.購票功能:
5.退出系統:
請輸入你要操作的指令:
4
==========展示全部商家排片信息===========
同曦巨幕影院 電話:112112 地址:吾悅廣場
片名 主演 時長 評分 票價 余票數量 放映時間
開端 趙今麥 120.0 0.0 50.0 100 2021/01/20 12:12:12
江寧萬達影城 電話:110110 地址:萬達商場
片名 主演 時長 評分 票價 余票數量 放映時間
=============用戶購票功能==============
請輸入要購票的門店:
江寧
電影院關門了~~~
是否繼續買票y/n
y
請輸入要購票的門店:
同曦
請您輸入需要購買的電影名稱
爸爸去哪了
電影名稱有毛病!
請您輸入需要購買的電影名稱
開
請輸入要購買電影票數:
100000
您當前最多可以購買:100張
是否繼續買票y/n
y
請輸入要購買電影票數:
100
余額不足是否繼續y/n
y
請輸入要購買電影票數:
10
您成功購買了開端10張票花費:500.0元
===========客戶電影操作界面===========
陳太帥先生歡迎您登錄! 余額:500.0
請選擇要操作的功能:
1.展示全部的影片信息
2.根據電影名稱查詢影片信息
3.評分功能:
4.購票功能:
5.退出系統:
請輸入你要操作的指令:
5
============登錄界面=============
請輸入登錄名稱:
zjm123
請輸入登錄密碼:
123123
===========商家電影操作界面===========
趙今麥女士
請選擇要操作的功能:
1.展示詳情:
2.上架電影:
3.下架電影:
4.修改電影:
5.退出:
請輸入你要操作的指令:
1
===========商家===========
同曦巨幕影院 電話:112112 地址:吾悅廣場 賬戶余額:500.0
片名 主演 時長 評分 票價 余票數量 放映時間
開端 趙今麥 120.0 0.0 50.0 90 2021/01/20 12:12:12
===========商家電影操作界面===========
趙今麥女士
請選擇要操作的功能:
1.展示詳情:
2.上架電影:
3.下架電影:
4.修改電影:
5.退出:
請輸入你要操作的指令: