本次学习是简单地实现电影院的注册、购票等一系列功能
首先需要准备好应有的类,电影类(Movie)、用户类(User)、消费者类(Customer)、商户类(Business),然后依据这些实现功能的运行类(Run)。
电影类(Movie)
package com.buka.po;
import java.util.Date;
public class Movie {
//电影名,演员,时长,价格,票数,上映时间
private String name;
private String actor;
private double time;
private double price;
private int number;
private Date startTime;
//get方法和set方法
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 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;
}
//有参构造
public Movie(String name, String actor, double time, double price, int number, Date startTime) {
this.name = name;
this.actor = actor;
this.time = time;
this.price = price;
this.number = number;
this.startTime = startTime;
}
//无参构造
public Movie() {
}
//重写toString
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", actor='" + actor + '\'' +
", time=" + time +
", price=" + price +
", number=" + number +
", startTime=" + startTime +
'}';
}
}
用户类(User)
package com.buka.po;
public class User {
//用户名,密码,真实姓名,性别,电话号,余额
private String loginName;
private String password;
private String userName;
private char sex;
private String phone;
private double money;
//get方法和set方法
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;
}
//有参构造
public User(String loginName, String password, String userName, char sex, String phone, double money) {
this.loginName = loginName;
this.password = password;
this.userName = userName;
this.sex = sex;
this.phone = phone;
this.money = money;
}
//无参构造
public User() {
}
//重写toString
public String toString() {
return "User{" +
"loginName='" + loginName + '\'' +
", password='" + password + '\'' +
", userName='" + userName + '\'' +
", sex=" + sex +
", phone='" + phone + '\'' +
", money=" + money +
'}';
}
}
消费者类(Customer)
package com.buka.po;
public class Customer extends User{
}
商户类(Business)
package com.buka.po;
public class Business extends User{
//商家名,商家地址
private String shopName;
private String address;
//get方法和set方法
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;
}
//有参构造
public Business(String loginName, String password, String userName, char sex, String phone, double money, String shopName,String address) {
super(loginName, password, userName, sex, phone, money);
this.shopName = shopName;
this.address = address;
}
public Business(String shopName,String address) {
this.shopName = shopName;
this.address = address;
}
//无参构造
public Business() {
}
//重写toString
public String toString() {
return "Business{" +
"shopName='" + shopName + '\'' +
", address='" + address + '\'' +
'}';
}
}
运行类(Run)
package com.buka.run;
import com.buka.po.Business;
import com.buka.po.Customer;
import com.buka.po.Movie;
import com.buka.po.User;
import java.sql.SQLOutput;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Run {
//存储用户
public static final List<User> ALL_USERS = new LinkedList<>();
//存储商家电影
public static final Map<Business,List<Movie>> ALL_MOVIES = new HashMap<>();
//控制台输入
public static final Scanner sc = new Scanner(System.in);
//声明一个变量,记录当前登录用户
public static User loginUser;
//定义时间格式
public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//字母不可以变,分割可以更改
//静态代码块添加数据
static {
//消费者
Customer customer = new Customer();
customer.setLoginName("");
customer.setPassword("");
customer.setUserName("");
customer.setSex('');
customer.setMoney();
customer.setPhone("");
ALL_USERS.add(customer);
//商家
Business business = new Business();
business.setLoginName("");
business.setPassword("");
business.setUserName("");
business.setMoney();
business.setSex('');
business.setPhone("");
business.setAddress("");
business.setShopName("");
ALL_USERS.add(business);
//电影
Movie movie = new Movie("扫毒2","刘德华、古天乐",222,60,100,new Date());
List<Movie> list = new ArrayList<>();
list.add(movie);
ALL_MOVIES.put(business,list);
}
//主方法
public static void main(String[] args) {
showMain();
}
//首页
public static void showMain() {
while(true) {
System.out.println("===============欢迎登录本购票系统===============");
System.out.println("请选择");
System.out.println("1.登录");
System.out.println("2.用户注册");
System.out.println("3.商家注册");
System.out.println("4.关闭");
//输入命令实现对应功能
String input = sc.nextLine();
switch(input) {
case "1":
//登录
loginUser();
break;
case "2":
//用户注册
rigisterCustomer();
break;
case "3":
//商家注册
rigisterBusiness();
break;
case "4":
//关闭
return;
default:
System.out.println("请输入正确命令");
}
}
}
//商家注册
public static void rigisterBusiness() {
System.out.println("===============商家注册===============");
//商家录入信息
System.out.println("请输入您的用户名:");
String name = sc.nextLine();
System.out.println("请输入您的密码:");
String pass1 = sc.nextLine();
System.out.println("请确认您的密码:");
String pass2 = sc.nextLine();
System.out.println("请输入您的真实姓名");
String realName = sc.nextLine();
System.out.println("请输入您的性别");
String sex1 = sc.nextLine();
char[] sex2 = sex1.toCharArray();
char sex3 = sex2[0];
System.out.println("请输入您的电话号");
String phone = sc.nextLine();
System.out.println("请输入您的充值额度");
String money1 = sc.nextLine();
double money = Double.valueOf(money1);
System.out.println("请输入您的地址");
String address = sc.nextLine();
System.out.println("请输入您的店铺名称");
String shopName = sc.nextLine();
//信息记录到库
Business business = new Business();
business.setLoginName(name);
business.setPassword(pass2);
business.setUserName(realName);
business.setMoney(money);
business.setSex(sex3);
business.setPhone(phone);
business.setAddress(address);
business.setShopName(shopName);
ALL_USERS.add(business);
//商家电影
System.out.println("请上架至少一部电影");
addMovies(business);
System.out.println("商家注册成功");
}
//商户创建时上架电影
public static void addMovies(Business business) {
System.out.println("===============上架电影===============");
//double等不能输入空格,所以用String然后强转
System.out.println("请输入电影名:");
String name = sc.nextLine();
System.out.println("请输入主演:");
String actor = sc.nextLine();
System.out.println("请输入时长:");
String time = sc.nextLine();
System.out.println("请输入票价:");
String price = sc.nextLine();
System.out.println("请输入票数:");
String totalNumber = sc.nextLine();
while(true) {
System.out.println("请输入上映时间:");
String stime = sc.nextLine();
try {
Movie movie = new Movie(name,actor,Double.valueOf(time),Double.valueOf(price),
Integer.valueOf(totalNumber),simpleDateFormat.parse(stime));
List<Movie> list = new ArrayList<>();
list.add(movie);
ALL_MOVIES.put(business,list);
System.out.println("您的电影已成功上线");
return;
}catch (Exception e) {
System.out.println("输入有误,请重新输入");
}
}
}
//用户注册
public static void rigisterCustomer() {
System.out.println("===============用户注册===============");
//用户录入信息
System.out.println("请输入您的用户名:");
String name = sc.nextLine();
System.out.println("请输入您的密码:");
String pass1 = sc.nextLine();
System.out.println("请确认您的密码:");
String pass2 = sc.nextLine();
System.out.println("请输入您的真实姓名");
String realName = sc.nextLine();
System.out.println("请输入您的性别");
String sex1 = sc.nextLine();
char[] sex2 = sex1.toCharArray();
char sex3 = sex2[0];
System.out.println("请输入您的电话号");
String phone = sc.nextLine();
System.out.println("请输入您的充值额度");
String money1 = sc.nextLine();
double money = Double.valueOf(money1);
//信息记录到库
Customer customer = new Customer();
customer.setLoginName(name);
customer.setPassword(pass2);
customer.setUserName(realName);
customer.setSex(sex3);
customer.setMoney(money);
customer.setPhone(phone);
ALL_USERS.add(customer);
System.out.println("用户注册成功");
}
//登录
public static void loginUser() {
while(true) {
System.out.println("===============登录===============");
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String pass = sc.nextLine();
//验证用户是否存在
User user = getUser(name);
if(user == null) {
System.out.println("用户名不存在,请重新登录");
}else {
//用户存在验证密码
if(user.getPassword().equals(pass)) {
//登录成功
//记录当前登录用户
loginUser = user;
//判断登录者类型
if(user instanceof Business) {
//商家
showBusiness();
}else {
//用户
showCustomer();
}
}else {
//密码错误
System.out.println("密码错误,请重新登录");
}
}
//询问
System.out.println("======是否继续登录===是y===否n======");
String s = sc.nextLine();
if("n".equalsIgnoreCase(s)) {
return;
}
}
}
//消费者首页
public static void showCustomer() {
while(true) {
System.out.println("===============用户首页===============");
System.out.println("欢迎" + loginUser.getUserName() + (loginUser.getSex() == '男'?"先生":"女士"));
System.out.println("1.显示所有影片");
System.out.println("2.购票");
System.out.println("3.退出");
String input = sc.next();
switch (input) {
case "1":
//显示所有影片
showMovies();
break;
case "2":
//购票
buyTicket();
break;
case "3":
//退出
return;
default:
System.out.println("输入有误");
}
}
}
//购票
public static void buyTicket() {
showMovies();
System.out.println("===============进入购票===============");
System.out.println("请输入你要购买的门店");
String input = sc.next();
//验证商家
Business business = selBus(input);
if(business == null) {
System.out.println("商家不存在");
}else {
while(true) {
//判断有没有电影
List<Movie> list = ALL_MOVIES.get(business);
if(list.size() == 0) {
System.out.println("该商家没有电影");
}else {
//展示所有电影
showMovie(business);
//有电影
System.out.println("请输入电影名:");
//查询电影
String s = sc.next();
Movie movie = selBusMovie(business,s);
//判断
if(movie == null) {
System.out.println("电影不存在,请重新输入");
}else {
while(true) {
//电影存在
System.out.println("请输入购票数目");
int i = sc.nextInt();
//判断票够不够
if(movie.getNumber() >= i) {
//判断余额够不够
double money = i * movie.getPrice();
if(money < loginUser.getMoney()) {
//钱够
movie.setNumber(movie.getNumber() - i);
loginUser.setMoney(loginUser.getMoney() - money);
System.out.println("购买成功");
System.out.println("余额还剩" + loginUser.getMoney());
return;
}else {
System.out.println("余额不足,请更改购票数目或充值");
}
}else {
System.out.println("票不够,请重新输入,只剩了" + movie.getNumber() + "张");
}
}
}
}
}
}
}
//查询当前商家有没有这个电影
public static Movie selBusMovie(Business business, String s) {
List<Movie> list = ALL_MOVIES.get(business);
for(Movie movie : list) {
if(movie.getName().contains(s)) {
return movie;
}
}
return null;
}
//展示电影
public static void showMovie(Business business) {
List<Movie> list = ALL_MOVIES.get(business);
System.out.println("片名\t\t主演\t\t时长\t\t票价\t\t余票\t\t上映时间");
for (Movie movie : list) {
System.out.println(movie.getName() + " " + movie.getActor() + " " +
movie.getTime() + " " + movie.getPrice() + " " +
movie.getNumber() + " " + simpleDateFormat.format(movie.getStartTime()));
}
}
//查询商家
public static Business selBus(String input) {
Set<Business> businesses = ALL_MOVIES.keySet();
for (Business business : businesses) {
if(business.getShopName().contains(input)) {
return business;
}
}
return null;
}
//显示所有电影
public static void showMovies() {
System.out.println("===============展示电影===============");
Set<Business> businesses = ALL_MOVIES.keySet();
for (Business business : businesses) {
List<Movie> list = ALL_MOVIES.get(business);
System.out.println("===============" + business.getShopName() + "===============");
System.out.println("片名\t\t主演\t\t时长\t\t票价\t\t余票\t\t上映时间");
for (Movie movie : list) {
System.out.println(movie.getName() + " " + movie.getActor() + " " +
movie.getTime() + " " + movie.getPrice() + " " +
movie.getNumber() + " " + simpleDateFormat.format(movie.getStartTime()));
}
}
}
//商家首页
public static void showBusiness() {
while(true) {
System.out.println("===============商家首页===============");
System.out.println("欢迎" + loginUser.getUserName() + (loginUser.getSex() == '男'?"先生":"女士"));
System.out.println("1.展示详情");
System.out.println("2.上架电影");
System.out.println("3.下架电影");
System.out.println("4.退出");
String input = sc.nextLine();
switch (input) {
case "1":
//展示详情
showMovie();
break;
case "2":
//上架电影
addMovie();
break;
case "3":
//下架电影
offMovie();
break;
case "4":
//退出
return;
default:
System.out.println("输入有误");
}
}
}
//下架电影
public static void offMovie() {
System.out.println("===============下架电影===============");
List<Movie> list = ALL_MOVIES.get(loginUser);
//判断有没有电影
if(list.size() == 0) {
System.out.println("没有电影可下架");
}else {
System.out.println("请输入想要下架的电影名:");
String input = sc.nextLine();
//查询电影
Movie movie = selMovie(input);
//判断电影是否存在
if(movie == null) {
System.out.println("电影不存在");
}else {
System.out.println("是否要下架" + movie.getName());
System.out.println("是y,否n");
String s = sc.nextLine();
if("y".equalsIgnoreCase(s)) {
//下架
list.remove(movie);
System.out.println(movie.getName() + " 下架成功");
}else {
return;
}
}
}
}
//查询电影
private static Movie selMovie(String input) {
List<Movie> list = ALL_MOVIES.get(loginUser);
for(Movie movie : list) {
if(movie.getName().contains(input)) {
return movie;
}
}
return null;
}
//上架电影
public static void addMovie() {
System.out.println("===============上架电影===============");
//double等不能输入空格,所以用String然后强转
System.out.println("请输入电影名:");
String name = sc.nextLine();
System.out.println("请输入主演:");
String actor = sc.nextLine();
System.out.println("请输入时长:");
String time = sc.nextLine();
System.out.println("请输入票价:");
String price = sc.nextLine();
System.out.println("请输入票数:");
String totalNumber = sc.nextLine();
while(true) {
System.out.println("请输入上映时间:");
String stime = sc.nextLine();
try {
Movie movie = new Movie(name,actor,Double.valueOf(time),Double.valueOf(price),
Integer.valueOf(totalNumber),simpleDateFormat.parse(stime));
List<Movie> list = ALL_MOVIES.get(loginUser);
list.add(movie);
System.out.println("您的电影已成功上线");
return;
}catch (Exception e) {
System.out.println("输入有误,请重新输入");
}
}
}
//展示电影
public static void showMovie() {
System.out.println("===============展示电影===============");
List<Movie> list = ALL_MOVIES.get(loginUser);
System.out.println("片名\t\t主演\t\t时长\t\t票价\t\t余票\t\t上映时间");
for (Movie movie : list) {
System.out.println(movie.getName() + " " + movie.getActor() + " " +
movie.getTime() + " " + movie.getPrice() + " " +
movie.getNumber() + " " + simpleDateFormat.format(movie.getStartTime()));
}
}
//验证用户名
public static User getUser(String name) {
for (User allUser : ALL_USERS) {
if(allUser.getLoginName().equals(name)) {
return allUser;
}
}
return null;
}
}
总结:
通过本次练习,我感受到了实现一种需求时可能产生的一些困难,同时发现实现该需求的某些功能时会延展出来为了完善该功能而应当实现的其他功能,这些功能又会产生新的需要实现的功能,一环接一环,加大了任务量的同时也使需求的功能愈发完善。
同时,本次练习使我温习了一些不常用的或是遗忘的知识,以前只知道next是遇到空格就会停止,nextLine会读入一整行,但本次练习让我更深刻地体会到了next和nextLine的区别,以及nextDouble和nextLine的区别,nextLine遇到空格不会停止,可以很好地保证代码的正确运行,需要char类型或double等类型可以使用强转来实现。
集合的灵活使用和方法的灵活调用十分重要,不熟练会感到无从下手或被绕的云里雾里,需要加强练习,锻炼或用集合和调用方法的思维。