文章目录
嗖嗖移动业务大厅(源码已上传,免费下载)
1. 项目需求
中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各种套餐所包含的服务内容及费用如下表:
品牌套餐 | 话痨套餐 | 网虫套餐 | 超人套餐 |
---|---|---|---|
通话时长(分钟) | 600 | 0 | 300 |
上网流量 | 0 | 20 | 10 |
短信条数(条) | 100 | 0 | 50 |
费用(元/月) | 58 | 68 | 78 |
如实际使用中超出套餐内包含的通话时长,短信条数和上网流量,则按一下规则计费:
- 超出的通话: 0.2元/分
- 超出的短信:0.1元/条
- 超出的上网流量:0.1元/MB
本任务实现的"嗖嗖移动业务大厅"提供了嗖嗖移动用户的常用功能,包括新用户注册,本月账单查询,套餐余量查询,打印消费详情,套餐变更,办理退网,话费充值,查看消费记录,查看话费说明等功能.另外,还可以模拟用户通话,上网,发送短信的场景进行相应的扣费并记录消费信息.各功能介绍如下表:
菜单级别 | 功能 | 描述 |
---|---|---|
主菜单 | 用户登录 | 输入正确的手机号码和密码进入二级菜单列表 |
主菜单 | 用户注册 | 录入信息并开卡,用户输入的信息包括:选择卡号,选择套餐类型,输入用户名和密码,预存话费金额(预存话费金额必须满足以支付所选套餐的一个月的费用) |
主菜单 | 使用嗖嗖 | 输入正确的手机号码和密码之后,随机进入本号码所属套餐可以支持的一个场景,消费套餐余量或者话费余额,并记录消费信息.当话费余额不足时,抛出异常提醒用户充值 |
主菜单 | 话费充值 | 输入正确的用户名和密码之后,可为该卡号充值 |
主菜单 | 资费说明 | 提供各品牌套餐所包含的通话时长,上网流量,短信条数,月费用等 |
主菜单 | 退出系统 | 提出本系统 |
二级菜单 | 本月账单查询 | 可查询该卡号的套餐费用,实际消费金额,账户余额 |
二级菜单 | 套餐余量查询 | 可查询该卡号的套餐余量 |
二级菜单 | 打印消费详情 | 输入正确的卡号和密码后,可打印当前卡号用户的消费详单, 使用输出流把用户信息输出到文件 |
二级菜单 | 套餐变更 | 可变更为其他套餐类型,变更后话费余额需减去变更后的套餐费用,余额不足时需要给出信息提示,套餐变更后重新统计卡中实际消费数据以及当月消费金额 |
二级菜单 | 办理退网 | 输入正确的卡号和密码后,可以从已注册的号码列表中删除本号码,并退出系统 |
2. 项目使用的技术
- 面向对象的思想
- 封装,继承,多态,接口的使用
- 异常处理的合理使用
- 集合框架的使用
- I/O 操作实现对文件的写
- MySQL数据
- JDBC操作数据库
3.项目需求分析
3.1 实体类和接口
- Card(电话号码类)
- cardNumber 卡号
- status 状态
- MoboleCard(嗖嗖移动卡类)
- cardNumber 卡号
- username 用户名
- password 密码
- serPackage 所属套餐
- money 账户余额
- status 状态
- monthlyConsumptionRecords(月消费记录类)
- cardNumber 卡号
- consumAmount 当月消费金额
- realTalkTime 当月实际通话时长
- realSMSCount 当月实际发送短信条数
- realFlow 当月实际上网流量
- consumeDate 消费日期
- **套餐类 SerPackage **
- talkTime 通话时长
- smsCount 短信条数
- price 套餐月资费
- flow 上网流量
- type 套餐类型
- 套餐类型类 SerPackageType
- name 套餐名称
- ConsumInfo(消费信息类)
- cardNumber 卡号
- type 消费类型
- consumData 消费数据
- consumeDate 消费日期
- Scene(使用场景类)
- type 场景类型
- data 场景消费数据
- description description
- RechargeRecord(充值记录类)
- amount 充值金额
- rechargeDate 充值日期
- cardNumber 卡号
3.2 各功能效果图
1. 菜单显示页面,以及登录
卡号或密码错误:
卡号被禁用:
登录成功:
2. 用户注册
如果预存花费不足则提示
3. 本月账单查询
4. 套餐余量查询
-50条代表使用超出50条短信
5. 添加和打印消費清单
打印出来的消费详情通过I/O流输出到对应的用户文档中
如果没有消费记录:
6. 使用嗖嗖
功能分析
1) 模拟嗖嗖用户使用卡的过程,选择该功能后,输入当前卡号,通过验证后,可随机进入如下表的6个场景,要求所进入的场景的服务类型是该卡所属套餐支持的(如网虫套餐只能进入服务类型为"上网"的场景)
序号 服务类型 描述 0 通话 问候客户,谁知其如此难缠,通话90分钟 1 通话 询问妈妈身体状况,本地通话30分钟 2 短信 参与环境保护实施方案问卷调查,发送短信5条 3 短信 同时朋友本人已换手机号码,发送短信50条 4 上网 和女朋友微信视频聊天,使用流量1GB 5 上网 晚上手机在线追剧,一不留神睡着了,使用流量2GB
- 模拟消费,进入场景之后,将按场景的描述要求消费套餐余量,如果套餐余量不足,则需要按套餐外的费用规则扣费,成功消费后,添加一条消费记录
如果消费失败:
> 卡号被禁用后不能进行登录和使用嗖嗖操作
7. 办理退网
办理退网后,该卡号的相关记录都会被删除,卡号状态也将恢复成可选状态0
8 套餐变更
如果跟换套餐相同提示
如果余额不足以更换套餐提示
9. 话费充值
10.查看资费说明
查看嗖嗖移动大厅中所有的套餐的资费说明
4、代码实现思路
项目工程示图(采用三层架构的模式)
主要实现代码
1、一级菜单框架
/**
* 显示一级菜单
*/
public void showFirstMenu() {
System.out.println("******************欢迎使用嗖嗖移动业务大厅******************");
System.out.println("1.用户登录\t2.用户注册\t3.使用嗖嗖\t4.话费充值\t5.资费说明\t6.退出系统 ");
System.out.print("请选择:");
int choose = input.nextInt();
switch (choose) {
case 1:
//用户登录
doLogin();
break;
case 2:
//用户注册
doRegister();
showFirstMenu();
break;
case 3:
//使用嗖嗖
useSoSo();
// showFirstMenu();
break;
case 4:
//话费充值 作业
topUp();
showFirstMenu();
break;
case 5:
//资费说明
costInfo();
showFirstMenu();
break;
case 6:
//退出系统
exitSystem();
break;
default:
System.out.println("输入有误!请重新输入!");
showFirstMenu(); //方法递归,构建成一个循环
break;
}
}
2、二级菜单框架
/**
* 二级菜单
*/
private void showSecondMenu() {
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.print("请选择(输入1-5选择功能,其他键返回上一级):");
int choose = input.nextInt();
switch (choose) {
case 1:
//查询本月账单
queryCurrentMonthBill();
showSecondMenu();
break;
case 2:
querySerPackageFree();
showSecondMenu();
break;
case 3:
printConsumeInfo();
showSecondMenu();
break;
case 4:
changeSerPackage();
showSecondMenu();
break;
case 5:
quitNetWork();
break;
default:
//返回到上级菜单
showFirstMenu();
break;
}
}
3、用户登录
/**
* 处理登录
*/
private void doLogin() {
/**
* 1. 用户输入卡号以及密码
* 2. 使用jdbc发送select语句到数据库表根据卡号,密码查询
* 3. 如果记录存在, 判断是否是禁用状态, 如果禁用状态, 返回错误信息 "该卡号已被禁用!"
* 4. 如果记录不存在, 返回错误信息 "卡号或者密码错误"
* 5. 如果记录存在,可用状态, 登录成功, 进入到二级菜单
*/
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
System.out.println("请输入手机卡号:");
String cardNumber = input.next();
System.out.println("请输入密码:");
String password = input.next();
List<MoboleCard> login = moboleCardService.login(cardNumber, password);
//通过卡号查询卡号状态
List<MoboleCard> moboleCard = moboleCardService.queryStatusByCardNumber(cardNumber);
if (login.isEmpty()) {
System.out.println("【友情提示】:卡号或密码错误!");
showFirstMenu();
} else if (moboleCard.get(0).getStatus() == 1) {
System.out.println("【友情提示】:该卡号已被禁用,请充值!");
showFirstMenu();
} else
currentLoginCard = cardNumber;//把登录的卡号存储起来
showSecondMenu();
}
4、用户注册
/**
* 处理注册
*/
private void doRegister() {
/**
* 1. 查询所有可选的卡号, 并显示
* 2. 用户选择卡号
* 3. 查询所有的套餐类型,并展示,用户选择套餐
* 4. 用户输入姓名,密码, 以及预存的金额
* 5. 根据套餐类型查询对应用户选择的套餐, 并判断用户预存金额是否满足支付
* 6. 如果不满足, 请重新输入预存金额
* 7. 如果满足, 可以办理
* 8. 往tb_mobole_card表添加一条记录
* 9. 往tb_recharge_record表添加一条充值记录
* 10. 修改tb_card对应cardNumber的卡的状态
* 11. 办理成功,打印卡信息以及套餐信息
*/
//1. 查询所有可选的卡号, 并显示
System.out.println("**************可选择的卡号**************:");
CardServiceImpl cardService = new CardServiceImpl();
List<Card> cards = cardService.queryAll();
int i = 0;
for (Card card : cards) {
System.out.print(card.getId() + "." + card.getCardNumber() + "\t");
i++;
if (i % 3 == 0) {
System.out.println();
}
}
System.out.println("请选择您的卡号:");
int cardId = input.nextInt();
Card card = cardService.queryById(cardId);
Serpackage serpackage = null;
int num = 0;
out:
while (true) {
System.out.print("1、话痨套餐\t2、网虫套餐\t3、超人套餐");
System.out.print("\t请选择服务套餐:");
num = input.nextInt();
SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
if (num >= 1 && num <= 3) {
serpackage = serpackageService.queryById(num);
break out;
} else
System.out.println("输入有误,请重新输入!");
break;
}
System.out.println("请输入用户名:");
String registerName = input.next();
System.out.println("请输入密码:");
String registerPass = input.next();
System.out.println("请输入预存话费金额:");
Double money = input.nextDouble();
Double balance = money - serpackage.getPrice();//余额
if (balance < 0) {
System.out.println("您预存话费不足以支付本月套餐费用,请重新输入!");
return;
} else {
//插入用户数据
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
MoboleCard moboleCard = new MoboleCard(0, card.getCardNumber(), registerName, registerPass, num, balance, 0);
moboleCardService.insert(moboleCard);
//修改卡号状态为1
int status = cardService.cardStatus(1, card.getCardNumber());
//找到套餐name
SerpackageTypeServiceImpl serpackageTypeService = new SerpackageTypeServiceImpl();
SerpackageType serpackageType = serpackageTypeService.queryById(num);
//将充值记录存入tb_recharge_record表
RechargeRecordServiceImpl recordService = new RechargeRecordServiceImpl();
/**
* 获取注册日期
*/
// LocalDate localDate = LocalDate.now();
// java.sql.Date sqlDate = new java.sql.Date(new Date());
int insert = recordService.insert(new RechargeRecord(0, money, null, card.getCardNumber()));
if (insert > 0) {
System.out.println("注册成功!卡号:" + card.getCardNumber() + ",用户名:" + registerName + ",当前余额:" + balance + "元\n" +
serpackageType.getName() + "通话时长:" + serpackage.getTalkTime() + "分钟/月\n" +
serpackageType.getName() + "短信条数:" + serpackage.getSmsCount() + "条/月\n" +
serpackageType.getName() + "月资费:" + serpackage.getPrice() + "元/月\n" +
serpackageType.getName() + "上网流量:" + serpackage.getFlow() + "兆/月\n");
} else
System.out.println("注册失败!");
}
}
5、使用嗖嗖
/**
* 使用soso, 模拟某张卡的使用.
*/
private void useSoSo() {
// 使用嗖嗖, 1. 套餐余量 >= 消费的数量 只需要把套餐余量 - 消费数量
// 2. 套餐余量 < 消费的数量 超出部分使用额外扣费
// 2.1 卡的余额支付额外扣费: 正常消费
// 2.2 卡的余额无法满足额外扣费: 只能消费余额最大可消费的数量
/*
1. 输入卡号,查询卡,做验证,卡号存在(在moboleCard表存在),状态可用
2. 查询所有的场景, 随机选择一个场景
3. 根据卡的套餐类型 查询办理的套餐,得到套餐的免费使用数量
4. 根据卡号,当月日期 查询这张表的当月消费记录,
第一种情况: 有记录, 表示这张卡当月已经开始消费
第二种情况: 无记录: 表示该卡当月未消费, 需要添加该卡当月消费记录: 0 0 0
5. 计算套餐余量 = 套餐免费使用量 - 当月消费数量 第一种情况: >0: 有剩余量 套餐余量 = 差 第二种情况: <=0: 套餐余量 = 0
计算最大消费数量 : 第一种情况: 等于场景消费数量 第二种情况: 卡最大消费数量
卡最大消费数量 = 套餐余量 + 余额消费数量
6. 往消费记录表添加一条消费记录, 修改月消费记录表: 修改卡的余额
7.打印
*/
// 1. 输入卡号,查询卡,做验证,卡号存在(在moboleCard表存在),状态可用
System.out.println("请输入手机卡号:");
String cardNumber = input.next();
//判断卡号是否存在
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
List<MoboleCard> moboleCards = moboleCardService.queryByCardNumber(cardNumber);
if (!moboleCards.isEmpty()){
//判断卡号状态是否为0
if (moboleCards.get(0).getStatus()==0){
Random random = new Random();//定义随机数
SenceServiceImpl senceService = new SenceServiceImpl();
//获取卡号套餐类型
Integer serPackage = moboleCards.get(0).getSerPackage();
//如果类型为1,随机1~4功能
if (serPackage==1){
Sence sence = senceService.queryById(random.nextInt(4) + 1);
System.out.println(sence.getDescription());
//插入消费信息记录
ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
int insert = consuminfoService.insert(new Consuminfo(0, cardNumber, sence.getType(), sence.getData(), null));
if (insert>0){
//判断该卡号是否有月消费记录,有就修改,没有就添加
MonthlyConsumptionRecordsServiceImpl monthlyConsumptionRecordsService = new MonthlyConsumptionRecordsServiceImpl();
List<MonthlyConsumptionRecords> monthlyConsumptionRecords = monthlyConsumptionRecordsService.queryByCardNumber(cardNumber);
if (!monthlyConsumptionRecords.isEmpty()){//有月消费记录
switch (sence.getType()){
case "通话":
//修改通话时间
int talkTimeByCardNumber = monthlyConsumptionRecordsService.talkTimeByCardNumber(sence.getData(), cardNumber);
//判断套餐通话时长是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
//找到本次消费金额
Double money1=sence.getData()*0.2;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()-600)*0.2;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
case "短信":
//修改短信条数
int smsCountByCardNumber = monthlyConsumptionRecordsService.smsCountByCardNumber(sence.getData(), cardNumber);
//判断套餐短信是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
//找到本次消费金额
Double money1=sence.getData()*0.1;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()-100)*0.1;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
case "上网":
//修改流量
int flowByCardNumber = monthlyConsumptionRecordsService.flowByCardNumber(sence.getData(), cardNumber);
//判断套餐流量是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_Flow()>0){
//找到本次消费金额
Double money1=sence.getData()*0.01;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()>0){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()-0)*0.01;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
}
}else if (monthlyConsumptionRecords.isEmpty()){//没有月消费记录
//添加月消费记录
switch (sence.getType()){
case "通话":
int insert1 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0, sence.getData(), 0, 0, null));
break;
case "短信":
int insert2 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0, sence.getData(), 0, null));
break;
case "上网":
int insert3 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,0, sence.getData(), null));
break;
}
}
}
//如果类型为2,随机5~6功能
}else if (serPackage==2){
Sence sence = senceService.queryById(random.nextInt(2) + 5);
System.out.println(sence.getDescription());
//插入消费信息记录
ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
int insert = consuminfoService.insert(new Consuminfo(0, cardNumber, sence.getType(), sence.getData(), null));
if (insert>0){
//判断该卡号是否有月消费记录,有就修改,没有就添加
MonthlyConsumptionRecordsServiceImpl monthlyConsumptionRecordsService = new MonthlyConsumptionRecordsServiceImpl();
List<MonthlyConsumptionRecords> monthlyConsumptionRecords = monthlyConsumptionRecordsService.queryByCardNumber(cardNumber);
if (!monthlyConsumptionRecords.isEmpty()){//有月消费记录
switch (sence.getType()){
case "通话":
//修改通话时间
int talkTimeByCardNumber = monthlyConsumptionRecordsService.talkTimeByCardNumber(sence.getData(), cardNumber);
//判断套餐通话时长是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
//找到本次消费金额
Double money1=sence.getData()*0.2;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()-600)*0.2;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
case "短信":
//修改短信条数
int smsCountByCardNumber = monthlyConsumptionRecordsService.smsCountByCardNumber(sence.getData(), cardNumber);
//判断套餐短信是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
//找到本次消费金额
Double money1=sence.getData()*0.1;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()-100)*0.1;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
case "上网":
//修改流量
int flowByCardNumber = monthlyConsumptionRecordsService.flowByCardNumber(sence.getData(), cardNumber);
//判断套餐流量是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_Flow()>0){
//找到本次消费金额
Double money1=sence.getData()*0.01;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()>0){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()-0)*0.01;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
}
}else if (monthlyConsumptionRecords.isEmpty()){//没有月消费记录
//添加月消费记录
switch (sence.getType()){
case "通话":
int insert1 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0, sence.getData(), 0, 0, null));
break;
case "短信":
int insert2 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0, sence.getData(), 0, null));
break;
case "上网":
int insert3 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,0, sence.getData(), null));
break;
}
}
}
//如果类型为3,随机1~6功能
}else if (serPackage==3){
Sence sence = senceService.queryById(random.nextInt(6) + 1);
System.out.println(sence.getDescription());
//插入消费信息记录
ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
int insert = consuminfoService.insert(new Consuminfo(0, cardNumber, sence.getType(), sence.getData(), null));
if (insert>0){
//判断该卡号是否有月消费记录,有就修改,没有就添加
MonthlyConsumptionRecordsServiceImpl monthlyConsumptionRecordsService = new MonthlyConsumptionRecordsServiceImpl();
List<MonthlyConsumptionRecords> monthlyConsumptionRecords = monthlyConsumptionRecordsService.queryByCardNumber(cardNumber);
if (!monthlyConsumptionRecords.isEmpty()){//有月消费记录
switch (sence.getType()){
case "通话":
//修改通话时间
int talkTimeByCardNumber = monthlyConsumptionRecordsService.talkTimeByCardNumber(sence.getData(), cardNumber);
//判断套餐通话时长是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
//找到本次消费金额
Double money1=sence.getData()*0.2;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()-600)*0.2;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
case "短信":
//修改短信条数
int smsCountByCardNumber = monthlyConsumptionRecordsService.smsCountByCardNumber(sence.getData(), cardNumber);
//判断套餐短信是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
//找到本次消费金额
Double money1=sence.getData()*0.1;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()-100)*0.1;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
case "上网":
//修改流量
int flowByCardNumber = monthlyConsumptionRecordsService.flowByCardNumber(sence.getData(), cardNumber);
//判断套餐流量是否超额
//第一种情况:月消费记录表已经超额
if (monthlyConsumptionRecords.get(0).getReal_Flow()>0){
//找到本次消费金额
Double money1=sence.getData()*0.01;
//扣除话费
int i = moboleCardService.updateMoney(money1, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
//第二种情况:本次消费加上月消费记录表中的金额才超额
else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()>0){
Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()-0)*0.01;
//扣除话费
int i = moboleCardService.updateMoney(money, cardNumber);
//增加本月消费金额
int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
//判断余额是否小于0,小于则禁用卡号
DisableCardNumber(cardNumber);
}
break;
}
}else if (monthlyConsumptionRecords.isEmpty()){//没有月消费记录
//添加月消费记录
switch (sence.getType()){
case "通话":
int insert1 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0, sence.getData(), 0, 0, null));
break;
case "短信":
int insert2 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0, sence.getData(), 0, null));
break;
case "上网":
int insert3 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,0, sence.getData(), null));
break;
}
}
}
}
}else {
System.out.println("该卡号已被禁用,请充值!");
}
}else {
System.out.println("该手机卡号不存在!");
}
showFirstMenu();
}
6、查询本月账单
//查询本月账单
private void queryCurrentMonthBill() {
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
List<MoboleCard> moboleCard = moboleCardService.queryByCardNumber(currentLoginCard);
SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
Serpackage serpackage = serpackageService.queryById(moboleCard.get(0).getSerPackage());
//找出已经消费的套餐信息
MonthlyConsumptionRecordsServiceImpl service = new MonthlyConsumptionRecordsServiceImpl();
List<MonthlyConsumptionRecords> records = service.queryByCardNumber(currentLoginCard);
//判断是否有消费记录,有就修改,没有就不修改
if (!records.isEmpty()){
System.out.println("*****本月账单查询*****");
System.out.println("您的卡号:" + currentLoginCard + ",当月账单:\n" +
"套餐资费:" + serpackage.getPrice() +
"\n合计:" + (serpackage.getPrice()+records.get(0).getConsum_Amount()) +
"\n账户余额:" + (moboleCard.get(0).getMoney()-records.get(0).getConsum_Amount()));
}else {
System.out.println("*****本月账单查询*****");
System.out.println("您的卡号:" + currentLoginCard + ",当月账单:\n" +
"套餐资费:" + serpackage.getPrice() +
"\n合计:" + (serpackage.getPrice()) +
"\n账户余额:" + (moboleCard.get(0).getMoney()));
}
}
7、查询套餐余量
//查询套餐余量
private void querySerPackageFree() {
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
List<MoboleCard> moboleCard = moboleCardService.queryByCardNumber(currentLoginCard);
//找出初始套餐信息
SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
Serpackage serpackage = serpackageService.queryById(moboleCard.get(0).getSerPackage());
//找出已经消费的套餐信息
MonthlyConsumptionRecordsServiceImpl service = new MonthlyConsumptionRecordsServiceImpl();
List<MonthlyConsumptionRecords> records = service.queryByCardNumber(currentLoginCard);
//判断是否有消费记录,有就修改,没有就不修改
if (!records.isEmpty()){
System.out.println("*****套餐余量查询*****");
System.out.println("您的卡号:" + currentLoginCard + ",套餐内剩余:\n" +
"通话时间:" + (serpackage.getTalkTime()-records.get(0).getReal_Talk_Time())+ "分钟" +
"\n短信条数:" + (serpackage.getSmsCount()-records.get(0).getReal_SMS_Count() + "条" +
"\n上网流量:" + (serpackage.getFlow()-records.get(0).getReal_Flow()) + "MB"));
}else {
System.out.println("*****套餐余量查询*****");
System.out.println("您的卡号:" + currentLoginCard + ",套餐内剩余:\n" +
"通话时间:" + serpackage.getTalkTime()+ "分钟" +
"\n短信条数:" + serpackage.getSmsCount() + "条" +
"\n上网流量:" + serpackage.getFlow() + "MB");
}
}
8、打印消费详单
//打印消费详单
private void printConsumeInfo() {
System.out.println("*****消费详单查询*****");
//只能查询本年度的月消费详细
//1.用户输入查询的月份, 判断用户输入月份<=当前月
System.out.println("请输入本年需要查询的月份(1-12):");
int month = input.nextInt();
if (1<=month&&month<=12){
ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
List<Consuminfo> consuminfos = consuminfoService.queryByMonth(currentLoginCard, month);
if (!consuminfos.isEmpty()){
System.out.println("序号\t类型\t数据\t日期");
int i=1;
for (Consuminfo consuminfo : consuminfos) {
System.out.println(i+"\t"+consuminfo.getType()+"\t"+consuminfo.getConsumData()+"\t"+consuminfo.getConsumeDate());
String info=i+"\t"+consuminfo.getType()+"\t"+consuminfo.getConsumData()+"\t"+consuminfo.getConsumeDate();
i++;
//IO流把消费数据存入消费单
BufferedWriter bufferedWriter =null;
Date date = new Date();
// 创建一个SimpleDateFormat对象,指定目标格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
// 使用formatter格式化Date对象
String formattedDate = formatter.format(date);
try {
bufferedWriter = new BufferedWriter(new FileWriter("D:\\飞思Java培训班\\项目\\嗖嗖移动大厅\\用户消费详情单\\"+currentLoginCard+"用户消费详情单"+formattedDate+".txt",true));
bufferedWriter.write(info);
bufferedWriter.newLine();
bufferedWriter.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bufferedWriter==null){
bufferedWriter.close();//关闭资源
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}else
System.out.println("【友情提示】:对不起,不存在该卡号"+month+"月消费记录");
}else
System.out.println("输入有误,请重新输入!");
}
9、变更套餐
//变更套餐
private void changeSerPackage() {
/*
1.查询所有套餐名, 并输出,用户选择更改的套餐序号
2. 用户选择套餐, 判断用户所选的套餐是否是当前套餐,如果是, 提示
3. 如果不是, 获取用户选择的套餐, 判断卡号的余额是否满足支付套餐月租
4.如果不满足, 友情提示
5.如果满足:办理套餐变更 修改卡号所属套餐,以及扣余额
6. 返回到二级菜单
*/
System.out.println("*****套餐变更*****");
System.out.print("1、话痨套餐\t2、网虫套餐\t3、超人套餐\t");
System.out.println("请选择(序号):");
int num = input.nextInt();
if (num>=1&&num<=3){
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
List<MoboleCard> moboleCard = moboleCardService.queryByCardNumber(currentLoginCard);
//如果套餐相同提示
if(moboleCard.get(0).getSerPackage()==num){
System.out.println("【友情提示】:您已经是该套餐的用户,无需更换!");
showSecondMenu();
}
SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
Serpackage serpackage = serpackageService.queryById(num);
//如果跟换套餐余额不足提示
if(moboleCard.get(0).getMoney()<serpackage.getPrice()){
System.out.println("【友情提示】:对不起,您的余额不足以支付新套餐本月资费,请充值后办理变更套餐业务!");
showSecondMenu();
}
//修改用户套餐编号
int count = moboleCardService.serPackageByNumber(num, currentLoginCard);
if (count>0){
//扣除余额,更新余额
// Double newMoney=moboleCard.get(0).getMoney()-serpackage.getPrice();
int updateMoney = moboleCardService.updateMoney(serpackage.getPrice(), currentLoginCard);
if (updateMoney>0){
//删除该用户之前的月消费表
MonthlyConsumptionRecordsServiceImpl recordsService = new MonthlyConsumptionRecordsServiceImpl();
int deleteByCardNumber = recordsService.deleteByCardNumber(currentLoginCard);
SerpackageTypeServiceImpl typeService = new SerpackageTypeServiceImpl();
System.out.println("【友情提示】:更换套餐成功!"+typeService.queryById(num).getName()+":通话时长:"
+serpackageService.queryById(num).getTalkTime()+"分钟/月,短信条数:"
+serpackageService.queryById(num).getSmsCount()+"条/月,上网流量:"
+serpackageService.queryById(num).getFlow()+"GB/月,月租:"
+serpackageService.queryById(num).getPrice()+"元/月");
}
}
}else
System.out.println("输入有误,请重新输入!");
// showSecondMenu();
}
10、办理退网
//办理退网
private void quitNetWork() {
//直接修改卡的状态
System.out.println("*****办理退网*****");
//删除用户表中的记录
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
int deleteById = moboleCardService.deleteById(moboleCardService.queryByCardNumber(currentLoginCard).get(0).getId());
//修改卡号状态为0
CardServiceImpl cardService = new CardServiceImpl();
int cardStatus = cardService.cardStatus(0, currentLoginCard);
//删除交易记录
RechargeRecordServiceImpl recordService = new RechargeRecordServiceImpl();
int delete = recordService.deleteByCardNumber(currentLoginCard);
//删除月消费记录
MonthlyConsumptionRecordsServiceImpl recordsService = new MonthlyConsumptionRecordsServiceImpl();
int deleteByCardNumber = recordsService.deleteByCardNumber(currentLoginCard);
//删除消费信息
ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
int byCardNumber = consuminfoService.deleteByCardNumber(currentLoginCard);
if (deleteById>0&&cardStatus>0&&delete>0&&deleteByCardNumber>0&&byCardNumber>0){
System.out.println("【友情提示】:卡号"+currentLoginCard+"办理退网成功!");
showFirstMenu();//返回一级菜单
}else{
System.out.println("退网失败,请重试!");
showSecondMenu();//返回二级菜单
}
}
11、话费充值
/**
* 话费充值
*/
private void topUp() {
//todo 话费充值
System.out.println("*****话费充值*****");
MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
System.out.println("请输入要充值的卡号:");
String cardNumber = input.next();
System.out.println("请输入充值金额:");
double money = input.nextDouble();
//添加金额
int addMoney = moboleCardService.addMoney(money, cardNumber);
if (addMoney>0){
//添加消费记录
RechargeRecordServiceImpl rechargeRecordService = new RechargeRecordServiceImpl();
int insert = rechargeRecordService.insert(new RechargeRecord(0, money, null, cardNumber));
if (insert>0){
System.out.println("【充值成功】:充值成功,卡上金额:"+moboleCardService.queryByCardNumber(cardNumber).get(0).getMoney());
//判断充值后余额是否小于0,不小于则解除禁用
if (moboleCardService.queryByCardNumber(cardNumber).get(0).getMoney()>0){
UnblockCardNumber(cardNumber);//解除禁用
}else {
System.out.println("余额小于0,请继续充值!");
}
}
}else {
System.out.println("输入有误,请输入正确的卡号!");
}
}
12、资费说明
/**
* 费用说明
*/
private void costInfo() {
//todo 费用说明
System.out.println("*****费用说明*****");
System.out.println("序号\t套餐名称\t通话时长(分/月)\t短信条数(条/月)\t上网流量(GB/月)");
//查询所有信息
SerpackageTypeServiceImpl serpackageTypeService = new SerpackageTypeServiceImpl();
List<SerpackageType> serpackageTypes = serpackageTypeService.queryAll();
SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
List<Serpackage> serpackages = serpackageService.queryAll();
for (int i = 0; i < serpackageTypes.size(); i++) {
System.out.println(serpackageTypes.get(i).getId()+"\t"+serpackageTypes.get(i).getName()
+"\t"+serpackages.get(i).getTalkTime()+"\t\t\t\t"+serpackages.get(i).getSmsCount()
+"\t\t\t\t"+serpackages.get(i).getFlow()/1024);
}
}
13、退出系统
/**
* 退出系统
*/
private void exitSystem() {
System.out.println("欢迎使用本系统,系统正在退出...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(0);
}
5、总结
“嗖嗖移动业务大厅”项目主要使用了以下技术和方法:
-
面向对象编程:整个项目采用了面向对象的设计思想,定义了多个类来模拟现实世界中的各种实体和行为。
-
类和对象:定义了多个类(如
Card
,MoboleCard
,SerPackage
等)及其属性和方法来表示系统中的实体和业务逻辑。 -
封装:将数据(属性)和操作数据的方法封装在类中,确保了数据的安全性和操作的便捷性。
-
继承:通过继承机制,子类可以扩展或修改父类的行为,例如,
MoboleCard
类可能继承自一个更通用的Card
类。 -
多态:允许使用统一的接口来处理不同类型的对象,这在定义多种套餐类型和处理不同用户行为时非常有用。
-
接口的使用:通过定义接口,可以规定一组方法,由不同的类来实现这些接口,以支持不同的行为。
-
异常处理:在代码中合理使用异常处理来管理程序运行中可能出现的错误情况。
-
集合框架:使用Java集合框架(如List、Map等)来存储和管理数据集合。
-
I/O 操作:使用输入输出流来实现对文件的读写操作,例如将用户的消费详情写入文件。
-
数据库使用:使用MySQL数据库来存储用户数据、套餐信息、消费记录等,通过JDBC与数据库进行交互。
-
JDBC操作:通过JDBC连接和操作数据库,执行SQL语句进行数据的增删改查。
-
模拟用户交互:通过控制台输入输出与用户进行交互,模拟用户的各种操作,如登录、注册、查询等。
-
随机数生成:使用
Random
类来模拟用户使用场景的随机选择。 -
日期时间处理:使用
Date
和SimpleDateFormat
类来处理日期和时间,例如记录消费日期。 -
三层架构模式:项目采用了典型的三层架构模式,包括表示层、业务逻辑层和数据访问层,以实现功能的清晰分离和高内聚低耦合。
这些技术和方法共同构成了项目的基础,使得“嗖嗖移动业务大厅”能够提供用户注册、登录、查询、变更套餐、退网等一系列功能。