主頁 > 後端開發 > 嗖嗖移動大廳 源代碼 Java初級小專案

嗖嗖移動大廳 源代碼 Java初級小專案

2020-11-11 23:30:16 後端開發

  今天給大家一個比較綜合的專案:嗖嗖移動業務大廳,專案功能很多,概括的功能也很全面,吃透了這個專案,你的java基礎部分已經非常棒了!!!


一 、 專案概述

  技能要求

  ? 使用面向物件設計的思想
  ? 合理運用例外處理
  ? 使用集合框架存盤資料,不使用資料庫
  ? 使用 I/O 操作實作對檔案的讀寫


   開發工具

  JDK 7.0、MyEclipse,


   需求概述

  移動、聯通、電信是國內三大通信運營商,每個運營商提供了不同的品牌套餐來應對不同的用戶群,例如北京移動,主要有全球通、神州行、動感地帶三大品牌套餐,每種套餐的內容和資費不同,現嗖嗖移動是一擬定的通信運營商,提供了話嘮套餐網蟲套餐超人套餐,各種套餐所包含的服務內容及資費如表 1 所示,

 

   如實際使用中,超出套餐內包含的通話時長、短信條數或上網流量時,按以下規則計費:

  ? 超出的通話:0.2 元/分鐘
  ? 超出的短信:0.1 元/分鐘
  ? 超出的上網流量:0.1 元/MB
  本專案嗖嗖移動業務大廳提供了嗖嗖移動用戶的日常常用功能,包括新用戶注冊、本月賬單查詢、套餐余量查詢、列印消費詳單、套餐變更、辦理退網、話費充值、查看消費記錄、查看資費說明功能,另外,還可以模擬用戶通話、上網、發短信的場景進行相應的扣費并記錄消費資訊,各功能介紹如表 2 所示,

 

 

 二 、 專案業務流程描述

1.整體業務流程

 

嗖嗖移動專案的各個功能實際都是掛在功能選單上的,其中主選單包含 6 個功能,當用戶輸入 1~5 之間的功能編號后,驗證卡號,如果該卡號已注冊,執行相應功能后回傳主選單,否則,退出系統,如圖 1 所示,

 

                                         圖 1 主選單

  當使用已注冊用戶登錄并通過驗證后,即顯示二級選單,包含 5 個功能,如圖 2 所示,當輸入 1~5 之外的功能編號時,回傳主選單,

                                         圖 2 二級選單

2. 用戶注冊

 

該功能可以看作是去營業廳辦理新卡的程序,主要分成以下幾個步驟:
1) 選擇卡號(從隨機生成的 9 個以“139”開頭的卡號中選擇一個,輸入序號即可),
2) 選擇套餐(共 3 類套餐,選擇其中一個,輸入所對應的序號即可),
3) 輸入用戶名、密碼資訊(相當于現在各營業廳的實名登錄,輸入用戶名和密碼即可),
4) 輸入預存話費金額:這里需保存預存的金額足以支付一個月的套餐費用,否則給出資訊提示“您預存的話費金額不足以支付本月固定套餐資費,請重新充值!”,

5) 注冊新卡
實作效果如圖 3 所示,

 

                                        圖 3 用戶注冊

 

3. 本月賬單查詢

 

本月賬單可以顯示以下資訊:
? 卡號,
? 套餐月資費,
? 合計(是套餐固定資費和超出套餐使用費用總和),
? 賬戶余額,
運行效果如圖 4 所示,

 

                                      圖 4 本月賬單查詢

4. 套餐余量查詢

 

本功能用來顯示該卡所屬套餐內所剩余的免費通話時長、短信條數、上網流量,不同品牌套餐所支持的服務不同,因此顯示的內容不同,運行效果如圖 5 所示,

 

                                         圖 5 套餐余量查詢

5. 添加和列印消費清單

實作向消費記錄中添加一條該卡的消費記錄(該功能可在使用嗖嗖功能中呼叫),并實作列印該卡的消費記錄,列印前先從消費記錄中查找是否存在此卡的消費記錄,如存在則提示“已添加一條消費記錄,”,將消費記錄輸出到文本檔案中,格式如圖 5 所示,如不存在,提示用戶相應資訊,如圖 6 所示,

                                      圖 5 消費記錄

                                    圖 6 該卡不存在消費記錄

 

6.使用嗖嗖

(1)隨機進入某個場景

模擬嗖嗖用戶使用卡的程序,選擇該功能后,輸入當前卡號,通過驗證后,可隨機進入表 3 所示的 6 個場景(當然還可以再設計其他場景),要求所進入的場景的服務型別是該卡所屬套餐所支持的(例如網蟲套餐只能進入服務型別為“上網”的場景),

(2)模擬消費
進入該場景這之后,將按場景的描述要求消耗套餐余量,如套餐余量不足,需按套餐外的資費規則扣費,成功消費后,添加一條消費記錄,效果如圖 7 所示,

                                       圖 7 使用嗖嗖成功

余額不足時,提示資訊,如本場景通話時長為 30 分鐘,當通話至 10 分鐘時余額不足,拋出例外,并提示用戶“本次已通話 10 分鐘,您的余額不足,請充值后再使用!”如圖 8所示

                                        圖 8 余額不足的情況

(3)消費結束,添加消費記錄
消費完畢,在消費串列中添加一條消費記錄,并提示用戶“已添加一條消費記錄!”,按實際消費添加消費記錄,除非沒有消費,如圖 8 的情況,則此條消費記錄只需記錄實際通話時長 10 分鐘,

7. 辦理退網
本功能可實作將當前卡用戶從已注冊用戶串列中洗掉,洗掉后直接退出系統,運行效果如圖 9 所示,

                                      圖 9 辦理退網

8. 套餐變更
本功能類似我們去營業廳變數套餐,可以充分體會到使用面向物件后,代碼更加靈活,可維護性更強,
本專案中沒有引入對日期的記錄和處理,因此,這里默認套餐變更時間為本月的開始,選擇變數后的套餐為當前套餐之外的其他型別,否則顯示資訊提示,如圖 10 所示,

                                       圖 10 選擇套餐錯誤

選擇套餐正確之后,還需判斷當前余額是否足以支付一個月的套餐資費,如不足,提示錯誤資訊,如圖 11 所示,

                                      圖 11 變更套餐余額不足

如上述兩個條件都滿足時,套餐變數成功,顯示相應資訊,如圖 12 所示,當前卡實際使用資料清零,當前卡所屬套餐修改為變數后的套餐型別,當前卡余額減去新套餐月資費,本月消費金額修改為新套餐月資費,

                                         圖 12 套餐變更成功

9. 話費充值
可為指定卡號充值,要求充值金額最少 50 元,充值成功后提示資訊,運行效果如圖 13所示,

                                          圖 13 充值成功

通過最少充值金額驗證后,修改當前卡余額即可,


10. 查看資費說明
此功能需實作將文本檔案(套餐資費說明.txt)中的資訊顯示到控制臺,本功能需使用 I/O 操作實作文本檔案的寫入,


  以上是嗖嗖專案的整體需求概述,下面介紹如何搭建嗖嗖專案的框架結構:

一、 物體類(Entity)

 

 

 

 

 

 

 

 

 

 二、工具類 (utils)

 

 

 

 


 

   下面是專案的整體代碼結構:

 

 

 物體類中的其中一個手機卡類:

  1 package cn.soso.entity;
  2 /**
  3  * 手機卡
  4  *
  5  */
  6 public class MobileCard {
  7     private String cardNumber;  //卡號
  8     private String userName;  //用戶名
  9     private String passWord;  //密碼    
 10     private ServicePackage serPackage;  //所屬套餐
 11     private double consumAmount;  //當月消費金額
 12     private double money;  //賬戶余額
 13     private int realTalkTime;  //實際通話時長(分鐘)
 14     private int realSMSCount;  //實際發送短信條數(條)
 15     private int realFlow;  //實際上網流量
 16     
 17     public MobileCard(){}
 18 
 19     public MobileCard(String userName, String passWord, String cardNumber,
 20             ServicePackage serPackage, double consumAmount, double money) {
 21         super();
 22         this.userName = userName;
 23         this.passWord = passWord;
 24         this.cardNumber = cardNumber;
 25         this.serPackage = serPackage;
 26         this.consumAmount = consumAmount;
 27         this.money = money;
 28     }
 29 
 30     public String getUserName() {
 31         return userName;
 32     }
 33 
 34     public void setUserName(String userName) {
 35         this.userName = userName;
 36     }
 37 
 38     public String getPassWord() {
 39         return passWord;
 40     }
 41 
 42     public void setPassWord(String passWord) {
 43         this.passWord = passWord;
 44     }
 45 
 46     public String getCardNumber() {
 47         return cardNumber;
 48     }
 49 
 50     public void setCardNumber(String cardNumber) {
 51         this.cardNumber = cardNumber;
 52     }
 53 
 54     public ServicePackage getSerPackage() {
 55         return serPackage;
 56     }
 57 
 58     public void setSerPackage(ServicePackage serPackage) {
 59         this.serPackage = serPackage;
 60     }
 61 
 62     public double getConsumAmount() {
 63         return consumAmount;
 64     }
 65 
 66     public void setConsumAmount(double consumAmount) {
 67         this.consumAmount = consumAmount;
 68     }
 69 
 70     public double getMoney() {
 71         return money;
 72     }
 73 
 74     public void setMoney(double money) {
 75         this.money = money;
 76     }
 77 
 78     public int getRealTalkTime() {
 79         return realTalkTime;
 80     }
 81 
 82     public void setRealTalkTime(int realTalkTime) {
 83         this.realTalkTime = realTalkTime;
 84     }
 85 
 86     public int getRealSMSCount() {
 87         return realSMSCount;
 88     }
 89 
 90     public void setRealSMSCount(int realSMSCount) {
 91         this.realSMSCount = realSMSCount;
 92     }
 93 
 94     public int getRealFlow() {
 95         return realFlow;
 96     }
 97 
 98     public void setRealFlow(int realFlow) {
 99         this.realFlow = realFlow;
100     }
101     
102     /**
103      * 顯示卡資訊
104      */
105     public void showMeg(){
106         System.out.println("卡號:"+this.cardNumber+" 用戶名:"+this.userName+" 當前余額:"+this.money+"元,");
107         this.serPackage.showInfo();
108     }    
109 }

 


 

 

 

 整體業務流程類:

  1 package cn.soso.biz;
  2 
  3 import java.util.Scanner;
  4 
  5 import cn.soso.common.Common;
  6 import cn.soso.entity.MobileCard;
  7 import cn.soso.entity.ServicePackage;
  8 import cn.soso.utils.CardUtil;
  9 
 10 /**
 11  * 業務類
 12  * 
 13  * 
 14  */
 15 public class SosoMgr {
 16     Scanner input = new Scanner(System.in);
 17     CardUtil utils = new CardUtil();
 18     
 19     public static void main(String[] args) {
 20         SosoMgr soso = new SosoMgr();
 21         soso.mainMenu();
 22         System.out.println("謝謝使用!");
 23     }
 24 
 25     /**
 26      * 主流程
 27      */
 28     public void mainMenu() {
 29         int menuChoose = 0;
 30         String mobileNumber= "";
 31         String password = "";
 32         utils.init();
 33         utils.initScenes();
 34         //Common.typesInit();
 35         do {
 36             System.out.println("\n*************歡迎使用嗖嗖移動業務大廳***************");
 37             System.out.println("1.用戶登錄   2.用戶注冊   3.使用嗖嗖   4.話費充值  5.資費說明  6.退出系統");
 38             System.out.print("請選擇:");
 39             menuChoose = input.nextInt();
 40             // 分支陳述句:根據功能編號執行相應功能
 41             switch (menuChoose) {
 42             case 1:
 43                 //用戶登錄
 44                 System.out.print("請輸入手機卡號:");
 45                 mobileNumber = input.next();
 46                 System.out.print("請輸入密碼:");
 47                 password = input.next();
 48                 if (utils.isExistCard(mobileNumber, password)) {
 49                     cardMenu(mobileNumber);
 50                 }else{
 51                     System.out.println("對不起,您輸入的資訊有誤,無法登錄!");
 52                 }
 53                 continue;
 54             case 2:
 55                 //用戶注冊
 56                 registCard();
 57                 continue;
 58             case 3:
 59                 
 60                 //使用嗖嗖
 61                 System.out.print("請輸入手機卡號:");
 62                  mobileNumber = input.next();                
 63                 
 64                 if (utils.isExistCard(mobileNumber)) {
 65                     try {
 66 /*                        System.out.println("****使用之前****");
 67                         utils.showRemainDetail(mobileNumber);
 68                         utils.showAmountDetail(mobileNumber);*/
 69                         utils.userSoso(mobileNumber);
 70                     } catch (Exception e) {
 71                         System.err.println(e.getMessage());
 72                     }
 73                 }else{
 74                     System.out.println("對不起,該卡號未注冊,不能使用!");
 75                 }
 76                 
 77                 /*System.out.println("****使用之后****");
 78                 utils.showRemainDetail(mobileNumber);
 79                 utils.showAmountDetail(mobileNumber);*/
 80                 continue;
 81             case 4:
 82                 //話費充值
 83                 System.out.print("請輸入充值卡號:");
 84                 mobileNumber = input.next();
 85                 if (utils.isExistCard(mobileNumber)) {
 86                 System.out.print("請輸入充值金額:");
 87                 double money = input.nextDouble();                
 88                 utils.chargeMoney(mobileNumber, money);
 89                 }else{
 90                     System.out.println("對不起,要充值的卡號未注冊,無法充值!");
 91                 }
 92                 continue;                
 93             case 5:
 94                 System.out.println("\n*****資費說明******");
 95                 utils.showDescription();
 96                 continue;    
 97             case 6:
 98                 //退出系統
 99                 break;
100             default:
101                 //選擇其他數字退出系統
102                 break;
103             }
104             break;
105         } while (true);
106     }
107 
108     /**
109      * 手機卡功能選單
110      * 
111      * @param number
112      * @return
113      */
114     public int cardMenu(String mobileNumber) {
115            int menuChoose = 0;
116         do {
117             System.out.println("\n*****嗖嗖移動用戶選單*****");
118             System.out.println("1.本月賬單查詢");
119             System.out.println("2.套餐余量查詢");
120             System.out.println("3.列印消費詳單");
121             System.out.println("4.套餐變更");
122             System.out.println("5.辦理退網");
123             System.out.print("請選擇(輸入1~5選擇功能,其他鍵回傳上一級):");
124              menuChoose = input.nextInt();
125             switch (menuChoose) {
126             case 1:
127                 System.out.println("\n*****本月賬單查詢******");
128                 utils.showAmountDetail(mobileNumber);
129                 continue;
130             case 2:
131                 System.out.println("\n*****套餐余量查詢******");
132                 utils.showRemainDetail(mobileNumber);
133                 continue;
134             case 3:
135                 System.out.println("\n*****消費詳單查詢******");
136                 utils.printConsumInfo(mobileNumber);
137                 continue;
138             case 4:
139                 System.out.println("\n*****套餐變更******");
140                 System.out.print("1.話嘮套餐  2.網蟲套餐  3.超人套餐  請選擇(序號):");                
141                 utils.changingPack(mobileNumber, input.next());
142                 continue;
143             case 5:
144                 System.out.println("\n*****辦理退網******");
145                 utils.delCard(mobileNumber);
146                 System.out.println("謝謝使用!");
147                 System.exit(1);     //辦理退網后退出系統    
148                         
149             }
150             
151             break;
152         } while (true);
153         return menuChoose;
154     }
155     
156     /**
157      * 注冊新卡流程
158      */
159     public void registCard(){
160         String[] newNumbers = utils.getNewNumbers(9);
161         //顯示可供選擇的手機號串列
162         System.out.println("*****可選擇的卡號*****");
163         
164         for(int i=0;i<9;i++){
165             System.out.print((i+1)+"."+newNumbers[i]+"\t\t");
166             if((i+1)%3==0){
167                 System.out.println();
168             }
169         }
170         //選擇手機號
171         System.out.print("請選擇卡號(輸入1~9的序號):");        
172         String number = newNumbers[input.nextInt()-1];
173         
174         //選擇套餐型別
175         System.out.print("1.話嘮套餐  2.網蟲套餐  3.超人套餐,  ");
176         System.out.print("請選擇套餐(輸入序號):");
177         //utils.getPackList();
178         //獲取套餐物件 
179         ServicePackage pack = utils.createPack(input.nextInt());
180         
181         //輸入用戶名
182         System.out.print("請輸入姓名:");
183         String name = input.next();
184         
185         //輸入密碼
186         System.out.print("請輸入密碼:");
187         String password = input.next();
188         
189         //輸入預存話費金額
190         double money = 0;
191         System.out.print("請輸入預存話費金額:");
192          money = input.nextDouble();
193         while(money<pack.getPrice()){
194             System.out.print("您預存的話費金額不足以支付本月固定套餐資費,請重新充值:");
195             money = input.nextDouble();
196         }
197                 
198         //創建新卡物件并添加
199         MobileCard newCard = new MobileCard(name,password,number,pack,pack.getPrice(),money-pack.getPrice());
200         utils.addCard(newCard);        
201     }
202 }

 

 


 

 

 

 

 手機卡工具類:

  1 package cn.soso.utils;
  2 
  3 import java.io.FileReader;
  4 import java.io.FileWriter;
  5 import java.io.IOException;
  6 import java.io.Reader;
  7 import java.io.Writer;
  8 import java.text.DecimalFormat;
  9 import java.util.ArrayList;
 10 import java.util.HashMap;
 11 import java.util.Iterator;
 12 import java.util.List;
 13 import java.util.Map;
 14 import java.util.Random;
 15 import java.util.Set;
 16 
 17 import cn.soso.common.Common;
 18 import cn.soso.entity.ConsumInfo;
 19 import cn.soso.entity.MobileCard;
 20 import cn.soso.entity.NetPackage;
 21 import cn.soso.entity.Scene;
 22 import cn.soso.entity.ServicePackage;
 23 import cn.soso.entity.SuperPackage;
 24 import cn.soso.entity.TalkPackage;
 25 import cn.soso.service.CallService;
 26 import cn.soso.service.NetService;
 27 import cn.soso.service.SendService;
 28 
 29 /**
 30  * 手機卡工具類
 31  * 
 32  * 
 33  */
 34 public class CardUtil {
 35     Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 所有手機卡的串列
 36     Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有手機卡消費記錄的串列
 37     List<Scene> scenes = new ArrayList<Scene>();
 38 
 39     // 初始化用戶
 40     public void init() {
 41         MobileCard card1 = new MobileCard("何玲玲", "123", "13965756432",
 42                 new TalkPackage(), 58.0, 42.0);
 43         MobileCard card2 = new MobileCard("黃露露", "123", "13956712467",
 44                 new NetPackage(), 68.0, 32.0);
 45         MobileCard card3 = new MobileCard("朱蓉蓉", "123", "13911568956",
 46                 new SuperPackage(), 78.0, 22.0);
 47         MobileCard card4 = new MobileCard("桃跑跑", "123", "13924221868",
 48                 new TalkPackage(), 78.0, 2.0);
 49         card4.setConsumAmount(98.0);
 50         card4.setRealTalkTime(500);
 51         card4.setRealSMSCount(100);
 52         cards.put("13965756432", card1);
 53         cards.put("13956712467", card2);
 54         cards.put("13911568956", card3);
 55         cards.put("13924221868", card4);
 56     }
 57     
 58     /**
 59      * 使用場景初始化
 60      */
 61     public void initScenes(){    
 62         scenes.add(new Scene("通話",90,"問候客戶,誰知其如此難纏 通話90分鐘"));
 63         scenes.add(new Scene("通話",30,"詢問媽媽身體狀況 本地通話30分鐘"));
 64         scenes.add(new Scene("短信",5,"參與環境保護實施方案問卷調查 發送短信5條"));
 65         scenes.add(new Scene("短信",50,"通知朋友手機換號,發送短信50條"));
 66         scenes.add(new Scene("上網",1*1024,"和女友微信視頻聊天   使用流量1G"));
 67         scenes.add(new Scene("上網",2*1024,"晚上手機在線看韓劇,不留神睡著啦! 使用流量 2G"));        
 68     }
 69 
 70     /**
 71      * 是否存在此卡用戶
 72 
 73      * 
 74      * @param number
 75      * @param passWord
 76      * @return
 77      */
 78     public boolean isExistCard(String number, String passWord) {
 79         Set<String> numbers = cards.keySet();
 80         Iterator<String> it = numbers.iterator();
 81         while (it.hasNext()) {
 82             String searchNum = it.next();
 83             if (searchNum.equals(number)
 84                     && (cards.get(searchNum)).getPassWord().equals(passWord)) {
 85                 return true;
 86             }
 87         }
 88         return false;
 89     }
 90     
 91     /**
 92      * 查找指定卡號是否已注冊
 93      * 
 94      * @param searchNumber
 95      * @return 未注冊:false 已注冊:true
 96      */
 97     public boolean isExistCard(String searchNumber) {
 98         Set<String> numbers = cards.keySet();
 99         for (String number : numbers) {
100             if (number.equals(searchNumber)) {
101                 return true;
102             }
103         }
104         return false;
105     }
106 
107     /**
108      * 創建卡號(以139開頭 11位)
109      * 
110      * @return 生成的隨機手機卡號
111      */
112     public String createNumber() {
113         Random random = new Random();
114         boolean isExist = false; // 記錄現有用戶中是否存在此卡號用戶 是:true 否:false
115         String number = "";
116         int temp = 0;
117         do {
118             isExist = false; // 標志位重置為false,用于控制外重回圈,當生成了
119             // 生成的亂數是8位 不能小于10000000,否則重新生成
120             do {
121                 temp = random.nextInt(100000000);
122             } while (temp < 10000000);
123             // 生成之前,前面加“139”
124             number = "139" + temp;
125             // 和現有用戶的卡號比較,不能是重復
126             Set<String> cardNumbers = cards.keySet();
127             for (String cardNumber : cardNumbers) {
128                 if (number.equals(cardNumber)) {
129                     isExist = true;
130                     break;
131                 }
132             }
133         } while (isExist);
134         return number;
135     }
136 
137     /**
138      * 生成指定個數的新卡號串列
139      * 
140      * @param count
141      *            指定個數
142      * @return 卡號串列
143      */
144     public String[] getNewNumbers(int count) {
145 
146         String[] numbers = new String[count];
147         for (int i = 0; i < count; i++) {
148             numbers[i] = createNumber();
149         }
150         return numbers;
151     }
152 
153     /**
154      * 添加新卡
155      * 
156      * @param card
157      *            新卡
158      */
159     public void addCard(MobileCard card) {
160         cards.put(card.getCardNumber(), card);
161         System.out.print("注冊成功!");
162         card.showMeg();
163     }
164 
165     /**
166      * 指定卡號辦理退網
167      * 
168      * @param card
169      */
170     public void delCard(String delNumber) {
171         if (isExistCard(delNumber)) {
172             cards.remove(delNumber);
173             System.out.println("卡號" + delNumber + "辦理退網成功!");
174         } else {
175             System.out.println("對不起,該卡號未注冊,不能辦退退網!");
176         }
177     }
178 
179     /**
180      * 查詢指定卡套餐余量
181      * 
182      * @param number
183      */
184     public void showRemainDetail(String searchNumber) {
185         MobileCard card; // 要查詢的卡
186         int remainTalkTime;
187         int remainSmsCount;
188         int remainFlow;
189         StringBuffer meg = new StringBuffer();
190             card = cards.get(searchNumber);
191             meg.append("您的卡號是" + searchNumber + ",套餐內剩余:\n");
192             ServicePackage pack = card.getSerPackage();
193             if (pack instanceof TalkPackage) {
194                 //向下轉型為話嘮套餐物件
195                 TalkPackage cardPack = (TalkPackage) pack;
196                 // 話嘮套餐,查詢套餐內剩余的通話時長和短信條數
197                 remainTalkTime = cardPack.getTalkTime() > card
198                         .getRealTalkTime() ? cardPack.getTalkTime()
199                         - card.getRealTalkTime() : 0;
200                 meg.append("通話時長:" + remainTalkTime + "分鐘\n");
201                 remainSmsCount = cardPack.getSmsCount() > card
202                         .getRealSMSCount() ? cardPack.getSmsCount()
203                         - card.getRealSMSCount() : 0;
204                 meg.append("短信條數:" + remainSmsCount + "條");
205             } else if (pack instanceof NetPackage) {
206                 //向下轉型為網蟲套餐物件
207                 NetPackage cardPack = (NetPackage) pack;
208                 // 網蟲套餐:查詢套餐內剩余的上網流量
209                 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
210                         .getFlow() - card.getRealFlow() : 0;
211                 meg.append("上網流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
212                         + "GB");
213             } else if (pack instanceof SuperPackage) {
214                 //向下轉型為超人套餐物件
215                 SuperPackage cardPack = (SuperPackage) pack;
216                 // 超人套餐:查詢套餐內剩余的通話時長、短信條數、上網流量
217                 remainTalkTime = cardPack.getTalkTime() > card
218                         .getRealTalkTime() ? cardPack.getTalkTime()
219                         - card.getRealTalkTime() : 0;
220                 meg.append("通話時長:" + remainTalkTime + "分鐘\n");
221                 remainSmsCount = cardPack.getSmsCount() > card
222                         .getRealSMSCount() ? cardPack.getSmsCount()
223                         - card.getRealSMSCount() : 0;
224                 meg.append("短信條數:" + remainSmsCount + "條\n");
225                 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
226                         .getFlow() - card.getRealFlow() : 0;
227                 meg.append("上網流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
228                         + "GB");
229             }
230             System.out.println(meg);
231     }
232 
233     /**
234      * 查詢指定卡當月消費詳單
235      * 
236      * @param searchNumber
237      */
238     public void showAmountDetail(String searchNumber) {
239         MobileCard card; // 要查詢的卡
240         StringBuffer meg = new StringBuffer();
241         card = cards.get(searchNumber);
242         meg.append("您的卡號:" + card.getCardNumber() + ",當月賬單:\n");
243         meg.append("套餐資費:" + card.getSerPackage().getPrice() + "元\n");
244         meg.append("合計:" + Common.dataFormat(card.getConsumAmount()) + "元\n");
245         meg.append("賬戶余額:" + Common.dataFormat(card.getMoney()) + "元");
246         // 顯示本月消費詳細資訊
247         System.out.println(meg);
248     }
249 
250     
251     /**
252      * 指定卡號換套餐
253      * 
254      * @param number
255      * @param packType
256      */
257     public void changingPack(String number, String packNum) {
258         MobileCard card; // 指定的手機卡
259         ServicePackage pack; // 要換的套餐
260         if (isExistCard(number)) {
261             card = cards.get(number);
262             // 獲取要換的套餐物件
263             switch (packNum) {
264             case "1":
265                 pack = new TalkPackage();
266                 break;
267             case "2":
268                 pack = new NetPackage();
269                 break;
270             default:
271                 pack = new SuperPackage();
272                 break;
273             }        
274             if (!(card.getSerPackage().getClass().getName().equals(pack.getClass().getName()))) {
275                 // 該卡余額中減去當月套餐資費
276                 if (card.getMoney() >= pack.getPrice()) {
277                     card.setMoney(card.getMoney() - pack.getPrice());
278                     // 換套餐
279                     card.setSerPackage(pack);
280                     // 當月實際使用資料清零
281                     card.setRealTalkTime(0);
282                     card.setRealFlow(0);
283                     card.setRealSMSCount(0);
284                     // 當月消費金額設定為新套餐月資費
285                     card.setConsumAmount(pack.getPrice());
286                     System.out.print("更換套餐成功!");
287                     pack.showInfo();
288                 } else {
289                     System.out.println("對不起,您的余額不足以支付新套餐本月資費,請充值后再辦理更換套餐業務!");
290                     return;
291                 }
292             } else {
293                 System.out.println("對不起,您已經是該套餐用戶,無需換套餐!");
294             }
295 
296         } else {
297             System.out.println("對不起,該卡號未注冊,不能換套餐!");
298         }
299     }
300 
301     /**
302      * 為指定手機卡充值
303      * 
304      * @param number
305      *            指定充值的卡號
306      * @param money
307      *            充值金額
308      */
309     public void chargeMoney(String number, double money) {
310         MobileCard card; // 指定的手機卡
311         if (money < 50) {
312             System.out.println("對不起,最低充值金額為50元!");
313             return;
314         }
315             card = cards.get(number);
316             card.setMoney(card.getMoney() + money);
317             System.out.println("充值成功,當前話費余額為" + Common.dataFormat(card.getMoney()) + "元,");
318     }
319 
320     /**
321      * 添加一條指定卡的消費記錄
322      * 
323      * @param number
324      *            要添加消費記錄的卡
325      * @param info
326      *            要添加的消費記錄
327      */
328     public void addConsumInfo(String number, ConsumInfo info) {
329         Set<String> numbers = consumInfos.keySet();
330         Iterator<String> it = numbers.iterator();
331         List<ConsumInfo> infos = new ArrayList<ConsumInfo>();
332         boolean isExist = false; // 現有消費串列中是否存在此卡號消費記錄,是:true 否:false
333         while (it.hasNext()) {
334             if (it.next().equals(number)) {
335                 // 消費集合中已有該卡號消費記錄,則找到該卡號的消費記錄集合,添加一條即可
336                 infos = consumInfos.get(number);
337                 infos.add(info);
338                 isExist = true;
339                 System.out.println("已添加一條消費記錄,");
340                 break;
341             }
342         }
343         // 該集合中沒有此卡號消費記錄,則添加
344         if (!isExist) {
345             infos.add(info);
346             consumInfos.put(number, infos);
347             System.out.println("不存在此卡的消費記錄,已添加一條消費記錄,");
348         }
349     }
350     
351     //列印消費記錄
352     public void printConsumInfo(String number){
353         Writer fileWriter = null;
354         try {
355              fileWriter = new FileWriter(number+"消費記錄.txt");            
356             Set<String> numbers = consumInfos.keySet();
357             Iterator<String> it = numbers.iterator();
358             List<ConsumInfo> infos = new ArrayList<ConsumInfo>();//存盤指定卡所有消費記錄
359             boolean isExist = false; // 現有消費串列中是否存在此卡號消費記錄,是:true 否:false
360             while (it.hasNext()) {
361                 if (it.next().equals(number)) {
362                     infos = consumInfos.get(number);
363                     isExist = true;
364                     break;
365                 }
366             }
367             if(isExist){
368                 //存在 此卡消費記錄,寫入文本檔案
369                 StringBuffer content = new StringBuffer("******"+number+"消費記錄******\n");
370                 content.append("序號\t型別\t資料(通話(條)/上網(MB)/短信(條))\n");
371                 for(int i=0;i<infos.size();i++){
372                     ConsumInfo info = infos.get(i);
373                     content.append((i+1)+".\t"+info.getType()+"\t"+info.getConsumData()+"\n");
374                 }
375                 fileWriter.write(content.toString());
376                 fileWriter.flush();
377                 
378                 System.out.println("消費記錄列印完畢!");
379             }else{
380                 System.out.println("對不起,不存在此號碼的消費記錄,不能列印!");
381             }            
382         } catch (IOException e) {            
383             e.printStackTrace();
384         }finally{
385             if(fileWriter!=null){
386                 try {
387                     fileWriter.close();
388                 } catch (IOException e) {                    
389                     e.printStackTrace();
390                 }
391             }
392         }
393     }
394     
395     /**
396      * 使用嗖嗖
397      * @param number 當前卡號
398      * @throws Exception 
399      */
400     public void userSoso(String number)  {        
401         MobileCard card = cards.get(number); // 獲取此卡物件
402         ServicePackage pack = card.getSerPackage(); // 獲取此卡所屬套餐
403         Random random = new Random();
404         int ranNum = 0;
405         int temp = 0;  //記錄各場景中實際消費資料
406         do{
407             
408             ranNum = random.nextInt(6);// 生成一個0~5之前的亂數
409             Scene scene = scenes.get(ranNum); //獲取該序號所對應的場景
410             switch (ranNum) {
411             //序號為0或1為通話場景
412             case 0:
413             case 1:
414                 // 判斷該卡所屬套餐是否支持通話功能
415                 if (pack instanceof CallService) {
416                     // 執行通話方法
417                     System.out.println(scene.getDescription());
418                     CallService callService = (CallService) pack;
419                     try {
420                         temp = callService.call(scene.getData(), card);
421                     } catch (Exception e) {                            
422                         e.printStackTrace();
423                     }
424                     // 添加一條消費記錄
425                     addConsumInfo(number, new ConsumInfo(number,
426                             scene.getType(), temp));
427                     break;
428                 } else {
429                     // 如果該卡套餐不支持通話功能,則重新生成亂數選擇其他場景
430                     continue;
431                 }
432                 //序號為2或3為發短信場景
433             case 2:
434             case 3:
435                 // 判斷該卡所屬套餐是否支持短信功能
436                 if (pack instanceof SendService) {
437                     // 執行發短信方法
438                     System.out.println(scene.getDescription());
439                     SendService sendService = (SendService) pack;
440                     try {
441                         temp = sendService.sendMessage(scene.getData(), card);
442                     } catch (Exception e) {                                                    
443                         e.printStackTrace();
444                     }
445                     // 添加一條消費記錄
446                     addConsumInfo(number, new ConsumInfo(number,
447                             scene.getType(), temp));
448                     break;
449                 } else {
450                     // 如果該卡套餐不支持發短信功能,則重新生成亂數選擇其他場景
451                     continue;
452                 }
453                 //序號為4或5為發上網場景
454             case 4:
455             case 5:
456                 // 判斷該卡所屬套餐是否支持上網功能
457                 if (pack instanceof NetService) { 
458                     System.out.println(scene.getDescription());
459                     NetService netService = (NetService) pack;
460                     // 執行上網方法
461                     try {
462                         temp = netService.netPlay(scene.getData(), card);
463                     } catch (Exception e) {                        
464                         e.printStackTrace();
465                     }
466                     // 添加一條消費記錄
467                     addConsumInfo(number, new ConsumInfo(number,
468                             scene.getType(), temp));
469                     break;
470                 } else {
471                     // 如果該卡套餐不支持上網功能,則重新生成亂數選擇其他場景
472                     continue;
473                 }                
474             }    
475             break;
476         }while(true);
477     }
478 
479     /**
480      * 根據套餐序號回傳套餐物件
481      * 
482      * @param packNum
483      *            套餐序號
484      * @return 套餐物件
485      */
486     public ServicePackage createPack(int packId) {
487         ServicePackage pack = null;
488         switch (packId) {
489         case 1:
490             pack = new TalkPackage();
491             break;
492         case 2:
493             pack = new NetPackage();
494             break;
495         case 3:
496             pack = new SuperPackage();
497             break;
498         }
499         return pack;
500     }
501     
502     /**
503      * 顯示資費說明
504      */
505     public void showDescription(){
506         Reader rd = null;
507         try {
508             rd = new FileReader("套餐資費說明.txt");
509              char[] content = new char[1024];
510              int len = 0;
511              StringBuffer sb = new StringBuffer();
512                 while((len=rd.read(content))!=-1){
513                     sb.append(content,0,len);  //拼接字串
514                 }
515                 System.out.println(sb);
516         } catch (IOException e) {
517             // TODO Auto-generated catch block
518             e.printStackTrace();
519         }
520     }
521     
522 }

 


     各類各個介面的代碼就不一一列舉啦,有興趣的朋友可以來+Q qun:609565759,喜歡前端、后端java開發的可以加+,有詳細視頻、資料、教程,檔案!!!希望可以一起努力,加油ヾ(?°?°?)??!!!

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/211197.html

標籤:其他

上一篇:十個Pycharm使用小技巧——提升效率

下一篇:【老孟Flutter】6種極大提升Flutter開發效率的工具包

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more