JavaOOP项目 - 嗖嗖移动业务大厅
项目目录结构
服务接口
package ServicePackage;
//通讯服务
public interface CallService {
int call(int minCount);
}
package ServicePackage;
//短信服务
public interface SendService {
int sendMessage(int count);
}
package ServicePackage;
//上网服务
public interface NetService {
int netPlay(int flow);
}
套餐类
package ServicePackage;
//套餐类
public abstract class ServicePackage implements NetService,CallService,SendService{
private String type;//套餐类型
private double price;//资费
private int flow;//流量
private int talkTime;//通话时长
private int smsCount;//短信条数
int Sjs;//随机数
public ServicePackage() { }
public String getType() {
return type;
}
void setType(String type) {
this.type = type;
}
public double getPrice() {
return price;
}
void setPrice(double price) {
this.price = price;
}
public int getFlow() {
return flow;
}
public void setFlow(int flow) {
this.flow = flow;
}
public int getTalkTime() {
return talkTime;
}
public void setTalkTime(int talkTime) {
this.talkTime = talkTime;
}
public int getSmsCount() {
return smsCount;
}
public void setSmsCount(int smsCount) {
this.smsCount = smsCount;
}
public int getSjs() {
return Sjs;
}
public abstract void showInfo();//资费信息
//生成使用数据
public void showSjs(){
Sjs = (int)((Math.random()*9)+1);
}
@Override
public int call(int minCount) {
showSjs();
System.out.println("打了个电话,使用了"+Sjs+"分钟通话时长");
return minCount - Sjs;//返回使用后的剩余数据
}
@Override
public int netPlay(int flow) {
showSjs();
System.out.println("上了个网,使用了"+Sjs+"G流量");
return flow - Sjs;
}
@Override
public int sendMessage(int count) {
showSjs();
System.out.println("发了一手短信,使用了"+Sjs+"条短信");
return count - Sjs;
}
}
package ServicePackage;
//网虫套餐
public class NetPackage extends ServicePackage implements NetService{
public NetPackage(){
setType("网虫套餐");//套餐类型
setFlow(40);//流量
setPrice(19);//费用
}
@Override
public void showInfo() {
System.out.println("套餐类型:" + getType());
System.out.println("上网流量:" + getFlow() + "G/月");
System.out.println("月租:" + getPrice() + "元/月");
}
@Override
public int netPlay(int flow) {
showSjs();
System.out.println("网上冲浪看mm,使用了"+Sjs+"G流量");
return flow - Sjs;
}
}
package ServicePackage;
//话痨套餐
public class TalkPackage extends ServicePackage implements CallService,SendService{
public TalkPackage() {
setType("话痨套餐");//套餐类型
setTalkTime(300);//通话时长
setSmsCount(100);//短信条数
setPrice(66);//资费信息
}
@Override
public void showInfo() {
System.out.println("套餐类型:" + getType());
System.out.println("通话时长:" + getTalkTime() + "分钟/月");
System.out.println("短信条数:" + getSmsCount() + "条/月");
System.out.println("月租:" + getPrice() + "元/月");
}
@Override
public int call(int minCount) {
showSjs();
System.out.println("和好老表唠了会嗑,使用了"+Sjs+"分钟通话时间");
return minCount - Sjs;
}
@Override
public int sendMessage(int count) {
showSjs();
System.out.println("给MZ发短信,使用了"+Sjs+"条短信");
return count - Sjs;
}
}
package ServicePackage;
//超人套餐
public class SuperPackage extends ServicePackage implements CallService,NetService,SendService{
public SuperPackage() {
setType("超人套餐");//套餐类型
setTalkTime(500);//通话时长
setSmsCount(200);//短信条数
setFlow(80);//流量
setPrice(199);//资费信息
}
@Override
public void showInfo() {
System.out.println("套餐类型:" + getType());
System.out.println("通话时长:" + getTalkTime() + "分钟/月");
System.out.println("短信条数:" + getSmsCount() + "条/月");
System.out.println("上网流量:" + getFlow() + "G/月");
System.out.println("月租:" + getPrice() + "元/月");
}
@Override
public int call(int minCount) {
showSjs();
System.out.println("和好老表唠了会嗑,使用了"+Sjs+"分钟通话时间");
return minCount - Sjs;
}
@Override
public int netPlay(int flow) {
showSjs();
System.out.println("网上冲浪看抖音,使用了"+Sjs+"G流量");
return flow - Sjs;
}
@Override
public int sendMessage(int count) {
showSjs();
System.out.println("给MZ发短信,使用了"+Sjs+"条短信");
return count - Sjs;
}
}
手机卡类
package SosoMgr;
import ServicePackage.ServicePackage;
//手机卡,用户
public class MobileCard {
private String UserName;//用户名
private String Password;//用户密码
private String CardNum;//卡号
private ServicePackage SerPackage;//套餐
private double consumAmount;//累计消费金额
private double money;//余额(可用)
private int realTalkTime;//语言时长(可用)
private int realSMSCount;//短信条数(可用)
private int realFlow;//流量(可用)
public MobileCard() {}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getPassword() {
return Password;
}
public void setPassword(String password) {
Password = password;
}
public String getCardNum() {
return CardNum;
}
public void setCardNum(String cardNum) {
CardNum = cardNum;
}
public ServicePackage getSerPackage() {
return SerPackage;
}
public void setSerPackage(ServicePackage serPackage) {
SerPackage = serPackage;
}
public double getConsumAmount() {
return consumAmount;
}
public void setConsumAmount(double consumAmount) {
this.consumAmount = consumAmount;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public int getRealTalkTime() {
return realTalkTime;
}
public void setRealTalkTime(int realTalkTime) {
this.realTalkTime = realTalkTime;
}
public int getRealSMSCount() {
return realSMSCount;
}
public void setRealSMSCount(int realSMSCount) {
this.realSMSCount = realSMSCount;
}
public int getRealFlow() {
return realFlow;
}
public void setRealFlow(int realFlow) {
this.realFlow = realFlow;
}
}
消费信息
package SosoMgr;
//消费信息
public class ConsumInfo {
private String cardNumber;//卡号
private String type;//套餐类型
private String consumData;//消费数据
public ConsumInfo() {}
public ConsumInfo(String cardNumber, String type, String consumData) {
this.cardNumber = cardNumber;
this.type = type;
this.consumData = consumData;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getConsumData() {
return consumData;
}
public void setConsumData(String consumData) {
this.consumData = consumData;
}
}
注册系统
package SosoMgr;
import ServicePackage.ServicePackage;
import java.util.*;
//注册系统
public class RegistSystem {
private String CardNumber;//所选卡号
private ServicePackage tcSP;//所选套餐
private String UserName;//用户名
private String Password;//用户密码
private double money;//预存话费
private RegistSystem(){}
static MobileCard RegistSys(List<ServicePackage> SerPack){
Scanner SR = CardUtil.SR;
RegistSystem rs = new RegistSystem();
System.out.println("******************可选择卡号******************");
List<String> cards = new ArrayList<>(rs.cardSJ());//生成可用卡号
for(int i = 0;i < cards.size();i++){//遍历可用卡号集
System.out.print((i+1)+"、"+cards.get(i)+"\t");//输出可用卡号
if((i+1)%3==0){//每打印三次后换行
System.out.print("\n");
}
}
do{
String Z_card = "[1-9]";
System.out.print("请选择卡号(输入1-9的序号):");
String xzCard = SR.next();//选择卡号序号
if(xzCard.matches(Z_card)){
int xzCardI = Integer.parseInt(xzCard);
rs.CardNumber = cards.get(xzCardI-1);//获取对应序号的号码
break;
}else{
System.out.println("输入错误,无此选项!");
}
}while(true);
System.out.println("******************可选套餐******************");
for(int i = 0;i < SerPack.size();i++){//遍历套餐集
System.out.print((i+1)+"、"+SerPack.get(i).getType()+"\n");
}
do{
String Z_card = "[1-"+ SerPack.size() +"]";
System.out.print("请选择套餐:");
String xzTaoCan = SR.next();//选择套餐
if(xzTaoCan.matches(Z_card)){
int tcI = Integer.parseInt(xzTaoCan);
rs.tcSP = SerPack.get(tcI-1);//获取对应序号的套餐
break;
}else{
System.out.println("输入错误,无此选项!");
}
}while(true);
System.out.println("-----------------------------------------------");
do{
System.out.print("请设置姓名:");
String Z_Name = "[\\D&&\\S]{2,6}";
String userName = SR.next();//设置名字
if(userName.matches(Z_Name)){
rs.UserName = userName;//保存名字
break;
}else{
System.out.println("名字不符合规范!\n名字中不能含有数字,并大于2个不大于6个字符");
}
}while(true);
do{
System.out.print("请设置密码:");
String Z_password = "\\S{6,16}";
String password = SR.next();//设置密码
if(password.matches(Z_password)){
rs.Password = password;//保存密码
break;
}else{
System.out.println("密码不符合规范!\n密码要大于6位不大于16位");
}
}while(true);
do{
System.out.print("预存话费金额:");
String Z_money = "\\d*";
String S_money = SR.next();//输入存入话费
if(S_money.matches(Z_money)){
double mon = Double.parseDouble(S_money);
if(mon > rs.tcSP.getPrice()){//判断存入话费是否大于所选套餐资费
rs.money = mon;//保存存入话费
break;
}else{
System.out.println("存入的话费必须大于套餐月租!");
}
}else{
System.out.println("输入错误!请输入数字!");
}
}while(true);
MobileCard mCard = rs.caedSet();//制作手机卡,并接收制作好的手机卡
System.out.println("注册成功!\n卡号:"+mCard.getCardNum()
+" 、用户名:"+mCard.getUserName()
+" 、余额(已扣除月租):"+mCard.getMoney());//打印客户信息
rs.tcSP.showInfo();//打印套餐信息
return mCard;//返回制作完成的手机卡
}
//手机卡制作系统,将数据刻录入手机卡,并返回制作好的手机卡
private MobileCard caedSet(){
MobileCard mCard = new MobileCard();//获取初始(空白)手机卡
mCard.setCardNum(CardNumber);//给手机卡设置号码
mCard.setUserName(UserName);//给手机卡设置名字
mCard.setPassword(Password);//给手机卡设置密码
mCard.setSerPackage(tcSP);//给手机卡设置套餐
//设置手机卡初始余额,扣除套餐月租
double price = mCard.getSerPackage().getPrice();//获取手机卡套餐月租
mCard.setMoney(money-price);//将月租扣除,并设置余额
mCard.setConsumAmount(price);//记录已扣除费用
mCard.setRealTalkTime(mCard.getSerPackage().getTalkTime());//设置手机卡初始语音时长
mCard.setRealSMSCount(mCard.getSerPackage().getSmsCount());//设置手机卡初始短信条数
mCard.setRealFlow(mCard.getSerPackage().getFlow());//设置手机卡初始流量
//返回用户信息
return mCard;
}
//卡号生成系统
private Set cardSJ(){
CardUtil cu = CardUtil.cuObject();//工具类对象
Set<String> Cards = new HashSet<>();//可用卡号集
for(int a = 0;a<9;a++){//生成9个可用号码
String cardnum = "199";//初始卡号开头
for(int i = 0;i<8;i++){//随机生成8位整数
cardnum += (int)(Math.random()*10);
}
boolean ja = false;
if(!cu.cards.containsKey(cardnum)){//判断新生成的手机号是否已存在
ja = Cards.add(cardnum);//将手机号添加进集合
}
if(!ja){//若手机号添加失败,则重新进行添加
a--;
}
}
return Cards;
}
}
工具类
package SosoMgr;
import ServicePackage.*;
import java.io.*;
import java.util.*;
//工具类
public class CardUtil {
public static Scanner SR = new Scanner(System.in);
List<ServicePackage> SerPack = new ArrayList<>();//套餐集
Map<String,MobileCard> cards = new HashMap<>();//手机卡集、手机号 对应 手机卡
Map<String,List<ConsumInfo>> ConsumInfos = new HashMap<>();//消费信息集、手机号 对应 消费信息
{
//将套餐存入套餐集
SerPack.add(new NetPackage());
SerPack.add(new TalkPackage());
SerPack.add(new SuperPackage());
}
private CardUtil(){}
private static CardUtil cu = new CardUtil();//工具类对象
public static CardUtil cuObject(){
return cu;//返回工具类对象
}
//注册,将手机卡存入手机卡集
void registCard(){
MobileCard mCard = RegistSystem.RegistSys(SerPack);//启动注册系统,传入套餐集,并接收制作好的手机卡
cards.put(mCard.getCardNum(),mCard);//将手机号与对应的手机卡存入集合
//给手机号绑定消费记录集
List<ConsumInfo> consumInfos = new ArrayList<>();//消费信息集
ConsumInfos.put(mCard.getCardNum(),consumInfos);//将手机号与与消费信息集存入集合
}
//登录
MobileCard LoginMenu(String monbileNumber){//传入手机号
boolean Pcn = cards.containsKey(monbileNumber);//判断手机卡集中是否存在此手机号
if(Pcn){
MobileCard card = cards.get(monbileNumber);//获取指定手机号对应的手机卡
System.out.print("请输入密码:");
String passwd = SR.next();
if(card.getPassword().equals(passwd)){
return card;//密码输入正确后返回对应手机卡
}else{
System.out.println("密码错误!");
}
}else{
System.out.println("此号码不存在!");
}
return null;
}
//充值话费
public void InputMoney(String monbileNumber){
if(cards.containsKey(monbileNumber)){//判断手机卡集中是否存在此手机号
System.out.print("请输入充值金额:");
double inputMoney = 0;
try {
Scanner s = new Scanner(System.in);
inputMoney = s.nextDouble();
//s.close();
}catch(Exception e){}
if(inputMoney > 0){
MobileCard card = cards.get(monbileNumber);//获取指定手机号对应的手机卡
card.setMoney(card.getMoney() + inputMoney);//将充值金额加入余额
System.out.println("卡号:"+monbileNumber+"的用户,充值成功!\n余额:"+card.getMoney());
}else{
System.out.println("充值失败!");
}
}else{
System.out.println("此号码不存在!");
}
}
//使用嗖嗖
public void RunSoso(String monbileNumber){
//调用功能传入剩余用量,使用功能后扣除使用量,返回剩余用量
boolean Pcn = cards.containsKey(monbileNumber);//判断手机卡集中是否存在此手机号
if(Pcn){
MobileCard card = cards.get(monbileNumber);//获取传入手机号对应手机卡
ServicePackage SerPac = card.getSerPackage();//获取手机卡的套餐
if(card.getMoney() > 0){//判断是否还有余额
//记录消费信息
List<ConsumInfo> coninf = ConsumInfos.get(monbileNumber);//获取对应手机号的消费记录集
ConsumInfo Con = new ConsumInfo(monbileNumber,SerPac.getType(),"");
coninf.add(Con);
System.out.println("\t1.拨打电话");
System.out.println("\t2.发送短信");
System.out.println("\t3.网上冲浪");
System.out.println("**********************************");
System.out.print("请输入:");
String xzSo = SR.next();
switch(xzSo){
case "1":
int TalkTime = SerPac.call(card.getRealTalkTime());//调用通话方法,传入可用通话时长,返回使用后的时长
int T = SerPac.getSjs();//消耗的时长
if(TalkTime < 0){//判断是否还有剩余用量
double M = T * 0.2;//用超出的时长 乘以 每次超出1的费用 得出超出的费用
card.setConsumAmount(card.getConsumAmount() + M);//记录消费金额
card.setMoney(card.getMoney() - M);//用原有的钱扣除使用的钱,得出余额
}
card.setRealTalkTime(TalkTime);//更改使用后的时长
Con.setConsumData("号码:"+Con.getCardNumber()+" 套餐:"+Con.getType()+" 使用了电话功能 使用时长:"+T+"分钟");
break;
case "2":
int SMSCount = SerPac.sendMessage(card.getRealSMSCount());
int S = SerPac.getSjs();
if(SMSCount < 0){
double M = S * 0.1;
card.setConsumAmount(card.getConsumAmount() + M);//记录消费金额
card.setMoney(card.getMoney() - M);
}
card.setRealSMSCount(SMSCount);
Con.setConsumData("号码:"+Con.getCardNumber()+" 套餐:"+Con.getType()+" 使用了短信功能 使用条数:"+S+"条");
break;
case "3":
int Flow = SerPac.netPlay(card.getRealFlow());
int F = SerPac.getSjs();
if(Flow < 0){
double M = F * 3;
card.setConsumAmount(card.getConsumAmount() + M);//记录消费金额
card.setMoney(card.getMoney() - M);
}
card.setRealFlow(Flow);
Con.setConsumData("号码:"+Con.getCardNumber()+" 套餐:"+Con.getType()+" 使用了上网功能 使用流量:"+F+"G");
break;
default:
System.out.println("返回上一级...");
}
}else{
System.out.println("余额不足!请尽快缴费!");
}
}else{
System.out.println("此号码不存在!");
}
}
//打印消费详单
public void OutXF(String cardNum){
List<ConsumInfo> Conl = ConsumInfos.get(cardNum);//获取手机号对应的套餐集
if(!Conl.isEmpty()){
File fi = new File("消费记录");
fi.mkdirs();
File f = new File(fi , cardNum +"消费记录单.txt");
try {
Writer w = new FileWriter(f);
for(ConsumInfo i : Conl){
w.write(i.getConsumData()+"\n");
w.flush();//强制让输出流输出数据
}
System.out.println("打印成功,请在消费记录目录下查看详单");
w.close();
} catch (IOException e) {
System.out.println("出错,打印失败!");
}
}else{
System.out.println("暂无消费记录,无法打印!");
}
}
//资费说明
public void PriceInfo(){
System.out.println("\n*****************资费说明*****************");
for(ServicePackage ser : SerPack){
ser.showInfo();
System.out.println("-----------------------");
}
System.out.println("超出套餐计费:");
System.out.println("通话时长:0.2元/分钟");
System.out.println("短信条数:0.1元/条");
System.out.println("上网流量:3元/G");
}
//手机号判断
public Object[] cardNumIf(){
Object[] StrBoo = new Object[2];//Object类型数组,储存手机号与布尔值
String Z_cardNum = "[0-9]{11}";//11位并只能为0-9中的数字
System.out.print("请输入手机卡号:");
String cardNum = SR.next();
if(cardNum.matches(Z_cardNum)){
StrBoo[0] = cardNum;//存入手机号
StrBoo[1] = true;
}else{
StrBoo[0] = "手机号必须为11位整数";
StrBoo[1] = false;
}
return StrBoo;
}
}
业务大厅
package SosoMgr;
import ServicePackage.ServicePackage;
import java.util.Scanner;
//嗖嗖移动业务大厅
public class SosoMgr {
Scanner SR = CardUtil.SR;
CardUtil cu = CardUtil.cuObject();//工具类对象
public static void main(String[] args) {
SosoMgr sm = new SosoMgr();
boolean FH_SouYie = false;//用于判断是否返回大厅首页
do{
FH_SouYie = sm.mainMenu();//启动主菜单
}while(FH_SouYie);
sm.SR.close();
}
//主菜单
private boolean mainMenu() {
System.out.println("\n******************欢迎使用嗖嗖移动业务大厅******************");
System.out.println("\t1.用户登录");
System.out.println("\t2.用户注册");
System.out.println("\t3.使用嗖嗖");
System.out.println("\t4.话费充值");
System.out.println("\t5.资费说明");
System.out.println("\t6.退出系统");
System.out.println("*********************************************************");
System.out.print("请选择:");
String SY_XuanZe = SR.next();
//首页选择
switch (SY_XuanZe){
case "1"://用户登录
Object[] StrBoo = cu.cardNumIf();
String Card_Ts = (String)StrBoo[0];
boolean bool = (boolean)StrBoo[1];
if(bool){
MobileCard card = cu.LoginMenu(Card_Ts);
if(card != null){
cardMenu(card);
}
}else{
System.out.println(Card_Ts);
}
return true;
case "2"://用户注册
cu.registCard();//调用工具类中注册系统
return true;
case "3"://使用嗖嗖
System.out.println("\n*****************使用嗖嗖*****************");
Object[] StrBoo3 = cu.cardNumIf();
String Card_Ts3 = (String)StrBoo3[0];
boolean bool3 = (boolean)StrBoo3[1];
if(bool3){
cu.RunSoso(Card_Ts3);
}else{
System.out.println(Card_Ts3);
}
return true;
case "4"://话费充值
Object[] StrBoo4 = cu.cardNumIf();
String Card_Ts4 = (String)StrBoo4[0];
boolean bool4 = (boolean)StrBoo4[1];
if(bool4){
cu.InputMoney(Card_Ts4);
}else{
System.out.println(Card_Ts4);
}
return true;
case "5"://资费说明
cu.PriceInfo();
return true;
case "6"://退出系统
System.out.println("感谢您使用嗖嗖移动业务");
return false;
default:
System.out.println("无此选项!");
return true;
}
}
//登录菜单
private void cardMenu(MobileCard card){
boolean xzPD = false;
String cardNum = card.getCardNum();//手机号
String Uname = card.getUserName();//用户名
do{
System.out.println("*******嗖嗖移动用户菜单*******");
System.out.println("\t1.本月账单查询");
System.out.println("\t2.套餐余量查询");
System.out.println("\t3.打印消费详单");
System.out.println("\t4.套餐更变");
System.out.println("\t5.办理退网");
System.out.println("*****************************");
System.out.print("请选择:");
String loginXZ = SR.next();
switch(loginXZ){
case "1":
System.out.println("******本月账单查询******");
System.out.println("卡号:" + cardNum + "的用户:" + Uname + "你好!");
System.out.println("当月账单:");
System.out.println("\t套餐资费:" + card.getSerPackage().getPrice() + "元");
System.out.println("\t累计消费:" + Double.valueOf(String.format("%.1f" , card.getConsumAmount())) + "元");
System.out.println("\t账户余额:" + Double.valueOf(String.format("%.1f",card.getMoney())) + "元");
xzPD = true;
break;
case "2":
System.out.println("******套餐余量查询******");
System.out.println("卡号:" + cardNum + "的用户:" + Uname + "你好!");
System.out.println("套餐内剩余(负数代表超出):");
System.out.println("\t通话时长:" + card.getRealTalkTime() + "分钟");
System.out.println("\t短信条数:" + card.getRealSMSCount() + "条");
System.out.println("\t可用流量:" + card.getRealFlow() + "G");
xzPD = true;
break;
case "3":
System.out.println("******打印消费详单******");
cu.OutXF(cardNum);
xzPD = true;
break;
case "4":
System.out.println("******套餐更变******");
for(int i = 0;i<cu.SerPack.size();i++){//遍历套餐集
System.out.print((i+1)+"、"+cu.SerPack.get(i).getType()+" ");
}
System.out.println("\n********************");
System.out.print("请选择:");
String Z_card = "[1-"+ cu.SerPack.size() +"]";
String xzGBs = SR.next();
if(xzGBs.matches(Z_card)){
int xzGB = Integer.parseInt(xzGBs);
String YcardT = card.getSerPackage().getType();//获取现套餐类型
ServicePackage SerPac = cu.SerPack.get(xzGB-1);//获取所选套餐
if(card.getMoney() >= SerPac.getPrice()){//判断当前手机卡余额,是否可抵扣要更换套餐的月租
card.setSerPackage(SerPac);//更改套餐
card.setRealTalkTime((card.getRealTalkTime()<0?0:card.getRealTalkTime()) + card.getSerPackage().getTalkTime());//加入更改套餐的语音时长
card.setRealSMSCount((card.getRealSMSCount()<0?0:card.getRealSMSCount()) + card.getSerPackage().getSmsCount());//加入更改套餐的短信条数
card.setRealFlow((card.getRealFlow()<0?0:card.getRealFlow()) + card.getSerPackage().getFlow());//加入更改套餐的流量
card.setMoney(card.getMoney() - card.getSerPackage().getPrice());//扣除更改套餐的月租
System.out.println("更变套餐成功!" + YcardT + " --> " + card.getSerPackage().getType());
}else{
System.out.println("套餐更变失败!可用余额不足以抵扣月租");
}
}else{
System.out.println("无此套餐!");
}
xzPD = true;
break;
case "5":
System.out.println("******办理退网******");
cu.cards.remove(cardNum);//删除指定手机号与对应手机卡
System.out.println("卡号:"+cardNum+"的用户,办理退网成功!\n谢谢使用");
xzPD = false;
break;
default:
System.out.println("返回上级菜单...");
xzPD = false;
}
}while(xzPD);
}
}