电影订票系统主要是为了实现电影院的电影信息能够实时的展现上映电影信息以及对顾客能够根据上映电影进行网上购票支付的系统。一个经典的电影订票系统一般都需要提供良好的交互界面页面,但由于还没有学习前端方面的知识,所以交互仍在控制台中。从功能上来看,需要包括网民可以通过电影名称、进行查询电影相关信息,选好好可以进行购票支付,注册成功的商家可以对自己的电影院进行定期维护,其中包括添加新的电影、编辑修改电影、下架电影等功能。最后用户可以根据自己的观感对电影进行评分。系统整体的功能模块图如下:
首先需要对系统中存在的事物进行抽象成具体的类,比如该电影订票管理系统中简单分析应该有用户(User),而用户又分为客户(Customer)和商家(Business),所以关系如下面类图:
其次电影系统中还该有电影抽象成一个单独的类,定义一些电影的属性,比如:片名(movieName),主演(actor),时长(time),票价(price),余票(number),放映时间(startTime)等。
把类分析定义好后,现在需要一步步完善系统逻辑,首先需要在控制台显示一个简易的登录页面,如下图:
这一点相信大家都会,不在赘述,其次就是考虑登录界面上的功能如何实现,登录逻辑是需要输入用户名和密码,与已有的用户信息进行匹配,因此这里会使用到ArrayList集合用于存放用户对象信息,包括(客户和商家),如果是新用户必须注册后才能登录,为了方便测试我在程序里使用静态代码块提前录入了一些用户信息,以便可以直接登录。静态代码块如下:
// 初始化客户和商家信息
static {
Customer c1 = new Customer();
c1.setLoginName("很菜的jason");
c1.setPassword("123456");
c1.setName("罗易寒");
c1.setSex('男');
c1.setTel("159082");
c1.setMoney(1000);
USERS.add(c1);
Customer c2 = new Customer();
c2.setLoginName("很暖的snow");
c2.setPassword("789100");
c2.setName("江雪儿");
c2.setSex('女');
c2.setTel("137803");
c2.setMoney(5000);
USERS.add(c2);
Business b1 = new Business();
b1.setLoginName("黑心包租婆");
b1.setPassword("567890");
b1.setName("赵敏");
b1.setSex('女');
b1.setTel("158848");
b1.setMoney(100000);
b1.setShopName("黑心环球影城");
b1.setShopAddress("建设路一段");
USERS.add(b1);
List<Movie> movies1 = new ArrayList<>(); // 每个商家都对应一个电影集合 用于存放电影信息
MAPS.put(b1,movies1);
Business b2 = new Business();
b2.setLoginName("热心包租公");
b2.setPassword("666666");
b2.setName("赵无极");
b2.setSex('男');
b2.setTel("134382");
b2.setMoney(10000);
b2.setShopName("暖心环球影城");
b2.setShopAddress("建设路二段");
USERS.add(b2);
List<Movie> movies2 = new ArrayList<>(); // 每个商家都对应一个电影集合 用于存放电影信息
MAPS.put(b2,movies2);
}
登录逻辑中最重要的就是遍历用户集合,判断输入的用户名和密码是否存在和匹配,如果存在还需要对该对象类型进行判定,因为Customer和Business实现的功能逻辑不同。到此登录逻辑就阐述完了,至于注册就大家照猫画虎自行理解(实在太简单)。该阶段运行图如下:
具体的展示全部影片信息功能封装成方法:showAllMovies(),根据电影名称查询影片信息封装成方法:queryMovie(),购票功能封装成方法:buyMovie(),这里选择比较重要的两个方法(queryMovie()和buyMovie())进行详细分析:首先查询电影需要根据用户输入的电影名称在已有的存放商家和电影信息的Map集合中进行匹配啊,在这里需要新建一个临时Map容器,用来存放查找到的商家和匹配的电影信息,然后返回该集合,判断该集合是否为空,如果不为空就打印临时容器其中的信息,若为空则提示用户‘‘查无此片!’’。
该方法核心逻辑代码: // 通过电影查询具有该电影的商家
private static Map<Business,Movie> getBusiness(String name) {
tempMap.clear();
for (Map.Entry<Business, List<Movie>> businessListEntry : MAPS.entrySet()) {
List<Movie> movies = businessListEntry.getValue();
for (Movie movie : movies) {
if(movie.getMovieName().equals(name)){
Business business = businessListEntry.getKey();
tempMap.put(business,movie);
}
}
}
return tempMap;
}
查询完想看的电影接下来就是买票去看电影了,用户选择购票,输入具体购买电影票的店铺,然后就进行查询该店铺中有哪些具体的电影,选择你要购买的电影,输入购买的张数,然后根据购买的单价和张数扣除客户相应的金额,同时对应商家的增加该客户扣除的金额。
该方法的核心逻辑代码:
System.out.println("请输入你要购买的电影票的名称:");
String movieName = Sc.nextLine();
// 遍历查找
for (Movie movie : movieList) {
if(movie.getMovieName().equals(movieName)) {
// 找到了,展示影片信息
System.out.println(movie.getMovieName() + "\t\t\t\t\t" + movie.getActor() + "\t\t\t" + movie.getPrice() +"\t\t\t" + movie.getNumber() + "\t\t" + slf.format(movie.getStartTime()) + "\t\t\t\t\t\t" + movie.getTime());
System.out.println("请输入你要购买电影票的张数:");
int number = Sc.nextInt();
// 判断余票是否足够
if(number > movie.getNumber()) {
// 票数不够
System.out.println("电影票数不足,你最多可买" + movie.getNumber());
} else{
// 电影票足够,再判断客户账户是否足够
if(USER.getMoney() >= number * movie.getPrice()) {
// 客户账户足够,进行转账操作,客户余额减少,商家余额增加,电影票数减少
movie.setNumber(movie.getNumber() - number);
USER.setMoney(USER.getMoney() - number * movie.getPrice());
business.setMoney(business.getMoney() + number * movie.getPrice());
System.out.println("购票成功,已支付" + number * movie.getPrice() + "元,余额为" + USER.getMoney());
return;//结束当前方法
} else{
// 客户账户余额不足
System.out.println("余额不足,无法购票!");
}
}
}
}
// 没有找到该电影
System.out.println("对不起,你选择的电影不存在!");
说完客户的功能界面现在来看商家界面如图:
展示详情封装成方法:showBusinessInfo()----用来显示当前商家的详细信息;上架电影封装成方法:addMovie();下架电影封装成方法deleteMovie(),修改电影封装成方法updateMovie()。重点讲解添加,删除,修改三个功能,其中的展示功能就和之前一样比遍历存放电影信息的Map集合取出即可。添加功能,需要通过当前的商家对象拿到对应Map集合中的电影信息,通过输入向电影集合中添加新的数据,唯一需要注意的是添加电影开始时间的时候会对输入的时间字符串进行转化,需要进行异常处理。删除功能,同理需要通过当前的商家对象拿到对应Map集合中的电影信息,不过在删除之前需要对当前电影集合进行判断当前商家店铺的电影集中是否有电影,才能通过输入电影名进行删除操作。修改功能,也是同上拿到对应集合,不过因为输入的都是字符串类型,需要根据需要对数据进行类型转换再存入集合。
电影上架功能如图:
电影修改功能如图:
电影删除功能如图:
本系统到此基本功能的介绍和实现就基本结束。如果想了解跟多细节请查看参考源代码文件。