今天再給大家分享一個小項目:嗖嗖移動業務大廳。用的是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 }
小伙伴可以多多互動,一起多交流交流!!!O(∩_∩)O
喜歡前端、后端java開發的 可以到我的知乎主頁(更多詳細內容等你關注呦):https://www.zhihu.com/people/xing-chen-you-guang-pie-pie-pie,有詳細視頻、資料、教程,文檔,值得擁有!!!希望可以一起努力,加油ヾ(◍°∇°◍)ノ゙!!!
B站有上傳的更多項目視頻,從Java基礎到面向對象、Java高級API,以及SSM等框架的視頻,地址:https://www.bilibili.com/video/BV15a411w7Jh