soso移动大厅项目

一、项目需求

本任务实现的"嗖嗖移动业务大厅"提供了嗖嗖移动用户的常用功能,包括:

新用户注册,本月账单查询,套餐余量查询,打印消费详情,套餐变更,办理退网,话费充值,查看消费记录,查看话费说明等功能.另外,还可以模拟用户通话,上网,发送短信的场景进行相应的扣费并记录消费信息。

二、项目实体类与接口

一张表对应一个实体类,一个实体类对应一个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基础的继承、多态、封装也有很大的检验,实际动手这个项目,理解这三大特点是非常有帮助的。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值