一、项目需求
本任务实现的"嗖嗖移动业务大厅"提供了嗖嗖移动用户的常用功能,包括:
新用户注册,本月账单查询,套餐余量查询,打印消费详情,套餐变更,办理退网,话费充值,查看消费记录,查看话费说明等功能.另外,还可以模拟用户通话,上网,发送短信的场景进行相应的扣费并记录消费信息。
二、项目实体类与接口
一张表对应一个实体类,一个实体类对应一个Dao层接口,一个Dao层接口对应一个Impl接口实现类
三、项目使用的工具jar包
commons 用于简化JDBC的CURD操作
mysql-connector-java 用于连接数据库 ,内部封装了JDBC
hamcrest 与 junit 用于单元测试
四、功能截图与部分代码
1、用户登陆
public boolean login(){
System.out.print("请输入手机卡号:");
loginCardNo = input.next();
System.out.print("请输入密码:");
String password = input.next();
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(loginCardNo);
if (moboleCard == null){ //手机号为空
System.out.println("【友情提示:】卡号或者密码错误!");
}else { //手机号不为空
if (!moboleCard.getPassword().equals(password)){ //判断密码是否正确
System.out.println("【友情提示:】卡号或者密码错误!");
}else if (moboleCard.getStatus() == SystemConstant.MOBOLE_STATUS_FREEZE){ //判断冻结状态
System.out.println("【友情提示:】该卡号已被禁用");
}else {
return true;
}
}
return false;
}
2、用户注册
public void regist(){
System.out.println("***********可选择卡号***********");
//卡号
CardDao cardDao = new CardDaoImpl();
List<Card> cards = cardDao.queryByStatus(SystemConstant.MOBOLE_STATUS_NORMAL);
for (int i = 0; i < cards.size(); i++) {
System.out.print((i + 1) + "." + cards.get(i).getCardNumber() + "\t");
if ((i + 1) % 3 == 0) {
System.out.println("\n");
}
}
System.out.println();
System.out.print("请选择您的卡号:");
int chooseCardNo = input.nextInt();
Card card = cards.get(chooseCardNo - 1);
// 显示所有的套餐
SerpackageTypeDao serpackageTypeDao = new SerpackageTypeDaoImpl();
List<SerpackageType> serpackageTypes = serpackageTypeDao.queryAll();
for (int i = 0; i < serpackageTypes.size(); i++) {
System.out.print((i + 1) + serpackageTypes.get(i).getName() + "\t");
}
//选择套餐
System.out.print("\n请选择套餐:");
int chooseType = input.nextInt();
//根据套餐类型查询套餐详情
SerpackageDao serpackageDao = new SerpackageDaoImpl();
Serpackage serpackage = serpackageDao.queryByType(chooseType);
System.out.print("请输入姓名:");
String name = input.next();
System.out.print("请输入密码:");
String pwd = input.next();
double money = 0;
do {
System.out.print("请输入预存话费金额:");
money = input.nextDouble();
if (money < serpackage.getPrice()) {
System.out.println("你预存话费不足以支付本月套餐资费,请查询输入!");
}
} while (money < serpackage.getPrice());
//修改卡的状态
card.setStatus(SystemConstant.CARD_STATUS_FREEZE);
cardDao.update(card);
//往用户卡中添加一条记录
MoboleCard moboleCard = new MoboleCard();
moboleCard.setCardNumber(card.getCardNumber());
moboleCard.setUserName(name);
moboleCard.setPassword(pwd);
moboleCard.setSerPackage(chooseType);
moboleCard.setMoney(money - serpackage.getPrice());
moboleCard.setStatus(SystemConstant.MOBOLE_STATUS_NORMAL);
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
moboleCardDao.insert(moboleCard);
//往充值记录表中添加一条充值记录
RechargeRecord rechargeRecord = new RechargeRecord();
rechargeRecord.setAmount(money);
rechargeRecord.setRechargeDate(new Date());
rechargeRecord.setCardNumber(card.getCardNumber());
RechargeRecordDao rechargeRecordDao = new RechargeRecordDaoImpl();
rechargeRecordDao.insert(rechargeRecord);
System.out.println("注册成功!");
System.out.print("卡号:" + card.getCardNumber() + ",用户名:" + name + ",当前余额:" + (money - serpackage.getPrice()) + "元\n");
System.out.println(serpackageTypes.get(chooseType - 1).getName() + "通话时长:" + serpackage.getTalkTime() + "分钟/月");
}
3、使用soso
数据库会记录使用情况
public void useSoso(){
System.out.print("请输入手机卡号:");
loginCardNo = input.next();
//验证卡号是否正确
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(loginCardNo);
if (moboleCard == null){
System.out.println("【友情提示】:输入的卡号不正确");
}else if (moboleCard.getStatus() == SystemConstant.MOBOLE_STATUS_FREEZE){ //验证卡是否被冻结
System.out.println("【友情提示】:该卡已经被冻结,请联系管理员!");
}else {
//查询所有使用场景
SceneDao sceneDao = new SceneDaoImpl();
List<Scene> scenes = sceneDao.queryAll();
//随机生成一个使用场景
Random random = new Random();
int scenceIndex = random.nextInt(scenes.size());
Scene scene = scenes.get(scenceIndex);
//查询该卡的套餐
SerpackageDao serpackageDao = new SerpackageDaoImpl();
Serpackage serpackage = serpackageDao.queryByType(moboleCard.getSerPackage());
//查询卡当月月消费情况 根据手机号码与日期
MonthlyConsumptionRecordsDao mcrDao = new MonthlyConsumptionRecordsDaoImpl();
Date firstDate = DateUtil.getFirstDayDate(new Date());
MonthlyConsumptionRecords mcr = mcrDao.queryByCurrentMonthRecprdCardNo(loginCardNo,firstDate);
//判断 mcr是否为空
if (mcr == null){
mcr = new MonthlyConsumptionRecords();
mcr.setCardNumber(loginCardNo);
mcr.setConsumAmount(0.0);
mcr.setConsumeDate(firstDate);
mcr.setRealFlow(0);
mcr.setRealSMSCount(0);
mcr.setRealTalkTime(0);
//往月消费记录表插入 没有消费的记录
mcrDao.insert(mcr);
//获取到mcr的id
mcr = mcrDao.queryByCurrentMonthRecprdCardNo(loginCardNo,firstDate);
}
//计算剩余免费余量
String type=""; //场景类型
int free = 0; //余量
if (scene.getType().equals("通话")){
type ="通话";
free = serpackage.getTalkTime() - mcr.getRealTalkTime();
mcr.setRealTalkTime(scene.getData() + mcr.getRealTalkTime());
}else if (scene.getType().equals("短信")){
type ="短信";
free = serpackage.getSmsCount() - mcr.getRealSMSCount();
mcr.setRealSMSCount(scene.getData() + mcr.getRealSMSCount());
}else if (scene.getType().equals("上网")){
type ="上网";
free = serpackage.getFlow() - mcr.getRealFlow();
mcr.setRealFlow(scene.getData() + mcr.getRealFlow());
}
//计算本次消费金额
double cost = 0.0;
if (free <= 0){ //没有余量
cost = calcCost(scene.getType(),scene.getData());
}else {
if (scene.getData()- free >0){
cost = calcCost(scene.getType(),(scene.getData()-free));
}
}
//更新用户金额
moboleCard.setMoney(moboleCard.getMoney() - cost);
moboleCardDao.update(moboleCard);
//更新月消费记录表
mcr.setConsumAmount(mcr.getConsumAmount()+cost);
mcrDao.update(mcr);
//添加消费信息记录
ConsumInfo consumInfo = new ConsumInfo();
consumInfo.setCardNumber(loginCardNo);
consumInfo.setConsumData(scene.getData());
consumInfo.setConsumeDate(new Date());
consumInfo.setType(scene.getType());
ConsumInfoDao consumInfoDao = new ConsumInfoDaoImpl();
consumInfoDao.insert(consumInfo);
System.out.println(scene.getDescription());
}
}
4、话费充值
充值记录也会记录在对应数据库的表中
public void recharge(){
System.out.println("***********话费充值***********");
System.out.print("请输入要充值卡号:");
String cardNumber = input.next();
System.out.print("\n请输入充值金额:");
double money = input.nextDouble();
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(cardNumber);
//如果查不到用户卡信息
if (moboleCard == null){
System.out.println("【友情提示】:输入的卡号不正确!");
return;
}else if (moboleCard.getStatus() == SystemConstant.MOBOLE_STATUS_FREEZE){
System.out.println("【友情提示】:该卡已被冻结,请联系工作人员!");
}else {
//往充值记录表中添加一条充值记录
RechargeRecord rechargeRecord = new RechargeRecord();
rechargeRecord.setCardNumber(cardNumber);
rechargeRecord.setAmount(money);
rechargeRecord.setRechargeDate(new Date());
RechargeRecordDao rechargeRecordDao = new RechargeRecordDaoImpl();
rechargeRecordDao.insert(rechargeRecord);
//更新用户卡中的余额;
moboleCard.setMoney(money + moboleCard.getMoney());
int row = moboleCardDao.update(moboleCard);
if (row != 0) {
System.out.println("【友情提示】:充值成功,卡上余额:" + moboleCard.getMoney() + "元");
} else {
System.out.println("充值失败");
}
}
}
5、资费说明
public void feeExplanation(){
System.out.println("***********************套餐说明**************************");
PackageDao packageDao = new PackageDaoImpl();
List<Package> packages = packageDao.queryAll();
System.out.println("序号\t套餐说明\t通话时长\t短信条数(条/月)\t上网流量(GB/月)");
for (Package pack : packages) {
System.out.print(pack.getSerPackage().getId()+"\t\t");
System.out.print(pack.getSerPackageType().getName()+"\t");
System.out.print(pack.getSerPackage().getTalkTime()+"\t\t\t");
System.out.print(pack.getSerPackage().getSmsCount()+"\t\t\t\t");
System.out.println(pack.getSerPackage().getFlow()/1024);
}
}
6、解除冻结
public void unfreeze(){
System.out.println("***************解除账户冻结***************");
System.out.print("请输入卡号:");
String cardNumber = input.next();
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(cardNumber);
if (moboleCard == null){
System.out.println("【友情提示】:输入卡号错误!");
}else if (moboleCard.getStatus() == SystemConstant.MOBOLE_STATUS_NORMAL){
System.out.println("该卡无需解除冻结");
} else {
moboleCard.setStatus(SystemConstant.MOBOLE_STATUS_NORMAL);
moboleCardDao.update(moboleCard);
System.out.println("【友情提示】:卡号"+cardNumber+"解除冻结成功");
}
}
7、本月账单查询
public void queryCurrentMonthConsum() {
System.out.println("********************本月账单查询********************");
System.out.println("你的卡号:"+loginCardNo+",当月账单:");
//查询使用soso 的额外消费
MonthlyConsumptionRecordsDao mcrDao = new MonthlyConsumptionRecordsDaoImpl();
MonthlyConsumptionRecords mcr = mcrDao.queryByCurrentMonthRecprdCardNo(loginCardNo, DateUtil.getFirstDayDate(new Date()));
if (mcr == null){
mcr = new MonthlyConsumptionRecords();
mcr.setConsumAmount(0.0);
}
//获取账户余额
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(loginCardNo);
Double accountBalance = moboleCard.getMoney();
//获取用户套餐外的套餐资费
SerpackageDao serpackageDao = new SerpackageDaoImpl();
Serpackage serpackage = serpackageDao.queryByType(moboleCard.getSerPackage());
double serpackagePrice = serpackage.getPrice();
//总消费
double totalCost = mcr.getConsumAmount() + serpackagePrice;
System.out.println("套餐资费:"+serpackagePrice+"元");
System.out.println("合计:"+ totalCost+"元");
System.out.println("账户余额:"+accountBalance+"元");
}
8、查询套餐余量
public void queryPackageBanalce() {
System.out.println("**************套餐余量查询**************");
System.out.println("你的卡号是:"+loginCardNo+",套餐余额:");
//查询月套餐使用量
MonthlyConsumptionRecordsDao mcrDao = new MonthlyConsumptionRecordsDaoImpl();
MonthlyConsumptionRecords mcr = mcrDao.queryByCurrentMonthRecprdCardNo(loginCardNo, DateUtil.getFirstDayDate(new Date()));
//如果没用户没有消费
if (mcr == null){
mcr = new MonthlyConsumptionRecords();
mcr.setRealFlow(0);
mcr.setRealTalkTime(0);
mcr.setRealSMSCount(0);
}
//查询套餐详情
//先查到该手机的套餐编号
// 再查询套餐详情
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(loginCardNo);
SerpackageDao serpackageDao = new SerpackageDaoImpl();
Serpackage serpackage = serpackageDao.queryByType(moboleCard.getSerPackage());
//计算套餐余量
int balanceTalkTime = serpackage.getTalkTime() - mcr.getRealTalkTime();
int balanceSMSCount = serpackage.getSmsCount() - mcr.getRealSMSCount();
int balanceFlow = serpackage.getFlow() - mcr.getRealFlow();
//剩余流量为负的置为0
if (balanceTalkTime <= 0){
balanceTalkTime = 0;
}
if (balanceSMSCount <= 0){
balanceSMSCount = 0;
}
if (balanceFlow <= 0){
balanceFlow = 0;
}else {
balanceFlow = balanceFlow / 1024; //换成GB
}
System.out.println("通话时长:"+balanceTalkTime+"分钟");
System.out.println("短信条数:"+balanceSMSCount+"条");
System.out.println("上网流量:"+balanceFlow + "GB");
}
9、打印月消费清单
public void printConsuminfo(){
System.out.println("***************消费详情查询***************");
System.out.print("请输入本年需要查询的月份(1-12):");
int monthIndex = input.nextInt();
ConsumInfoDao consumInfoDao = new ConsumInfoDaoImpl();
List<ConsumInfo> consumInfos = consumInfoDao.queryByCurrentMonthAndCardNo(loginCardNo, monthIndex);
if (consumInfos.size() == 0){
System.out.println("【友情提示】:对不起,不存在本卡号"+monthIndex+"月消费记录");
}else {
System.out.println("序号\t类型\t数据\t日期");
for (int i = 0; i < consumInfos.size(); i++) {
System.out.print((i+1)+"\t\t"+consumInfos.get(i).getType()+"\t");
System.out.print( consumInfos.get(i).getConsumData()+"\t");
System.out.println(consumInfos.get(i).getConsumeDate());
}
}
}
10、套餐变更
public void serPackageChange(){
System.out.println("*********套餐变更*********");
SerpackageTypeDao serpackageTypeDao = new SerpackageTypeDaoImpl();
List<SerpackageType> serpackageTypes = serpackageTypeDao.queryAll();
for (int i = 0; i < serpackageTypes.size(); i++) {
System.out.println((i+1)+"."+serpackageTypes.get(i).getName()+"\t");
}
//查询用户卡更改前的信息
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(loginCardNo);
SerpackageDao serpackageDao = new SerpackageDaoImpl();
Serpackage oldSerpackage = serpackageDao.queryById(moboleCard.getSerPackage());
System.out.println("你现在的套餐为:"+serpackageTypes.get(oldSerpackage.getType() - 1).getName());
System.out.print("请选择(序号):");
int chooseType = input.nextInt();
if (moboleCard.getSerPackage() == chooseType){
System.out.println("【友情提示】:你已经是该套餐的用户,无需更换!");
return;
}
//查询新套餐费用
Serpackage serpackage = serpackageDao.queryByType(chooseType);
//查询余额 并判断 是否足够支付新套餐资费
if (moboleCard.getMoney() < serpackage.getPrice()) {
System.out.println("【友情提示】:你的余额不足以支付新套餐本月资费,请充值后办理变更套餐业务!");
return;
} else {
//更新用户卡套餐
moboleCard.setSerPackage(chooseType);
moboleCard.setMoney(moboleCard.getMoney() - serpackage.getPrice());
moboleCardDao.update(moboleCard);
System.out.println("【友情提示】:更换套餐成功!");
System.out.print(serpackageTypes.get(chooseType - 1).getName() + ":");
System.out.println("通话时长:" + serpackage.getTalkTime() + ",短信条数:" + serpackage.getSmsCount() + "条/月," +
"上网流量:" + serpackage.getFlow() / 1024 + "GB/月,月租:" + serpackage.getPrice() + "元/月");
}
}
11、办理退网
public void withdrawFromNetwork(){
System.out.println("*****************办理退网*****************");
//对用户状态改为冻结
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
MoboleCard moboleCard = moboleCardDao.queryByCardNo(loginCardNo);
moboleCard.setStatus(SystemConstant.MOBOLE_STATUS_FREEZE);
moboleCardDao.update(moboleCard);
System.out.println("【友情提示】:卡号"+loginCardNo+"办理退网成功");
}
12、账户注销
public void unsubscribe(){
System.out.println("**************注销账户**************");
System.out.println("【友情提示】:是否对卡号:"+loginCardNo+"进行注销?");
System.out.println("输入(Y/y)确定,输入其他返回");
String boolDelete = input.next();
if (boolDelete.equals("Y") || boolDelete.equals("y")){
//删除该卡号的月消费记录
MonthlyConsumptionRecordsDao mcrDao = new MonthlyConsumptionRecordsDaoImpl();
mcrDao.deleteByCardNumber(loginCardNo);
//删除该卡号的消费信息
ConsumInfoDao consumInfoDao = new ConsumInfoDaoImpl();
consumInfoDao.deleteByCardNumber(loginCardNo);
//删除该卡的充值记录
RechargeRecordDao rechargeRecordDao = new RechargeRecordDaoImpl();
rechargeRecordDao.deleteByCardNumber(loginCardNo);
//删除该卡的用户记录
MoboleCardDao moboleCardDao = new MoboleCardDaoImpl();
moboleCardDao.deleteByCardNumber(loginCardNo);
//将该卡的状态改为可用
Card card = new Card();
card.setStatus(SystemConstant.CARD_STATUS_NORMAL);
card.setCardNumber(loginCardNo);
CardDao cardDao = new CardDaoImpl();
cardDao.update(card);
System.out.println("【友情提示】:卡号"+loginCardNo+"注销成功!");
}
}
五、项目总结
本项目是一个基于java和mysql的一个简单项目,通过对各个表的增删查改,去解决各种用户需求。重点还是考验开发者的业务能力,有没有考虑到各种可能出现的情况以及怎样去处理这些情况。对于java基础的继承、多态、封装也有很大的检验,实际动手这个项目,理解这三大特点是非常有帮助的。