电影订票系统主要是为了实现电影院的电影信息能够实时显示上映的电影信息和客户能够根据上映的电影在线购票支付的系统。经典的电影订票系统通常需要提供良好的交互界面页面,但交互仍在控制台中,因为它还没有学习前端知识。从功能上看,包括网民可以通过电影名称查询电影相关信息,选择购票支付,注册成功的商家可以定期维护自己的电影院,包括添加新电影、编辑修改电影、下架电影等功能。最后,用户可以根据自己的感受对电影进行评分。系统的整体功能模块图如下:
首先,有必要将系统中存在的东西抽象成特定的类别。例如,电影订票管理系统中的简单分析应该有用户(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集合的电影信息。但是,在删除之前,有必要判断当前商家商店的电影集中是否有电影,然后输入电影名称进行删除。修改功能,也得到相应的集合,但由于输入是字符串类型,需要根据需要转换数据类型,然后存储集合。
电影上架功能如图所示:
电影修改功能如图:
电影删除功能如图:
本系统基本功能的介绍和实现基本结束。如果您想了解更多细节,请查看参考源代码文件。