电影购票系统
目录
电影购票系统
日志框架搭建,系统角色分析
系统角色类准备
- 集成日志框架、用于后期记录日志
- 定义一个电影类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.退出:
请输入你要操作的指令: