嗖嗖移动业务大厅
1. 项目需求
中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各种套餐所包含的服务内容及费用如下表:
品牌套餐 | 话痨套餐 | 网虫套餐 | 超人套餐 |
---|---|---|---|
通话时长(分钟) | 600 | 0 | 300 |
上网流量 | 0 | 20 | 10 |
短信条数(条) | 100 | 0 | 50 |
费用(元/月) | 58 | 68 | 78 |
如实际使用中超出套餐内包含的通话时长,短信条数和上网流量,则按一下规则计费:
-
超出的通话: 0.2元/分
-
超出的短信:0.1元/条
-
超出的上网流量:0.1元/MB
本任务实现的"嗖嗖移动业务大厅"提供了嗖嗖移动用户的常用功能,包括新用户注册,本月账单查询,套餐余量查询,打印消费详情,套餐变更,办理退网,话费充值,查看消费记录,查看话费说明等功能.另外,还可以模拟用户通话,上网,发送短信的场景进行相应的扣费并记录消费信息.各功能介绍如下表:
菜单级别 | 功能 | 描述 |
---|---|---|
主菜单 | 用户登录 | 输入正确的手机号码和密码进入二级菜单列表 |
主菜单 | 用户注册 | 录入信息并开卡,用户输入的信息包括:选择卡号,选择套餐类型,输入用户名和密码,预存话费金额(预存话费金额必须满足以支付所选套餐的一个月的费用) |
主菜单 | 使用嗖嗖 | 输入正确的手机号码和密码之后,随机进入本号码所属套餐可以支持的一个场景,消费套餐余量或者话费余额,并记录消费信息.当话费余额不足时,抛出异常提醒用户充值 |
主菜单 | 话费充值 | 输入正确的用户名和密码之后,可为该卡号充值 |
主菜单 | 资费说明 | 提供各品牌套餐所包含的通话时长,上网流量,短信条数,月费用等 |
主菜单 | 退出系统 | 提出本系统 |
二级菜单 | 本月账单查询 | 可查询该卡号的套餐费用,实际消费金额,账户余额 |
二级菜单 | 套餐余量查询 | 可查询该卡号的套餐余量 |
二级菜单 | 打印消费详情 | 输入正确的卡号和密码后,可打印当前卡号用户的消费详单, 使用输出流把用户信息输出到文件 |
二级菜单 | 套餐变更 | 可变更为其他套餐类型,变更后话费余额需减去变更后的套餐费用,余额不足时需要给出信息提示,套餐变更后重新统计卡中实际消费数据以及当月消费金额 |
二级菜单 | 办理退网 | 输入正确的卡号和密码后,可以从已注册的号码列表中删除本号码,并退出系统 |
2. 项目使用的技术
-
面向对象的思想
-
封装,继承,多态,接口的使用
-
异常处理的合理使用
-
集合框架的使用
-
I/O 操作实现对文件的写
-
MySQL数据
-
JDBC操作数据库
3.项目需求分析
3.1 实体类和接口
Card(电话号码类)
cardNumber 卡号
status 状态
MoboleCard(嗖嗖移动卡类)
cardNumber 卡号
username 用户名
password 密码
serPackage 所属套餐
money 账户余额
status 状态
monthlyConsumptionRecords(月消费记录类)
cardNumber 卡号
consumAmount 当月消费金额
realTalkTime 当月实际通话时长
realSMSCount 当月实际发送短信条数
realFlow 当月实际上网流量
consumeDate 消费日期
套餐类 SerPackage
talkTime 通话时长
smsCount 短信条数
price 套餐月资费
flow 上网流量
type 套餐类型
套餐类型类 SerPackageType
name 套餐名称
ConsumInfo(消费信息类)
cardNumber 卡号
type 消费类型
consumData 消费数据
consumeDate 消费日期
Scene(使用场景类)
type 场景类型
data 场景消费数据
description description
RechargeRecord(充值记录类)
amount 充值金额
rechargeDate 充值日期
cardNumber 卡号
使用嗖嗖
功能分析
1) 模拟嗖嗖用户使用卡的过程,选择该功能后,输入当前卡号,通过验证后,可随机进入如下表的6个场景,要求所进入的场景的服务类型是该卡所属套餐支持的(如网虫套餐只能进入服务类型为"上网"的场景)
序号 服务类型 描述 0 通话 问候客户,谁知其如此难缠,通话90分钟 1 通话 询问妈妈身体状况,本地通话30分钟 2 短信 参与环境保护实施方案问卷调查,发送短信5条 3 短信 同时朋友本人已换手机号码,发送短信50条 4 上网 和女朋友微信视频聊天,使用流量1GB 5 上网 晚上手机在线追剧,一不留神睡着了,使用流量2GB 2) 模拟消费,进入场景之后,将按场景的描述要求消费套餐余量,如果套餐余量不足,则需要按套餐外的费用规则扣费,成功消费后,添
嗖嗖移动部分代码
package com.dao; import com.entity.MobileCard; import com.service.NetSevice; /** * 网虫套餐(子类) */ public class NetPackage extends ServicePacKage implements NetSevice { /* *上网流量 * 费用68 */ public int talkTime = 0; public int smsCount = 0; public int flow = 3027; public NetPackage() { super(); super.price = 68; } public NetPackage(int talkTime, int smsCount, int flow) { super(); this.talkTime = talkTime; this.smsCount = smsCount; this.flow = flow; } public void showInfo() { System.out.println("网虫套餐:上网流量为3GB/月,费用为68/月。"); } @Override public int netPlay(int flow, MobileCard card) throws Exception { int temp = flow; for (int i = 0; i < flow; i++) { if (this.flow - card.realFlow >= 1) { card.realFlow++; } else if (card.money >= 0.1) { card.money -= 0.1; card.consumAmount+=0.1; }else { temp=i; throw new Exception("本次上网"+i+"分钟,余额不足,请充值"); } } //关闭 return temp; } }
加一条消费记录
数据库代码
/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.7.20 : Database - soso
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`soso` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */;
USE `soso`;
/*Table structure for table `tb_card` */
DROP TABLE IF EXISTS `tb_card`;
CREATE TABLE `tb_card` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`cardNumber` char(11) COLLATE utf8mb4_bin NOT NULL COMMENT '鎵嬫満鍙风爜',
`status` int(1) DEFAULT '0' COMMENT '鐘舵??: 0:鍙敤 1:绂佺敤',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_card` (`cardNumber`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_card` */
insert into `tb_card`(`id`,`cardNumber`,`status`) values (1,'13652363333',1),(2,'15812346677',1),(3,'18890985868',1),(4,'13677478866',1),(5,'13666557788',1),(6,'13612476521',0),(7,'13609087438',0),(8,'13689011047',0),(9,'13698674344',0),(10,'13678239812',0),(11,'13677411438',0);
/*Table structure for table `tb_consuminfo` */
DROP TABLE IF EXISTS `tb_consuminfo`;
CREATE TABLE `tb_consuminfo` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`card_number` char(11) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '鎵嬫満鍙风爜',
`type` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '娑堣垂绫诲瀷',
`consum_data` int(11) DEFAULT NULL COMMENT '娑堣垂鏁版嵁',
`consume_date` datetime DEFAULT NULL COMMENT ' 娑堣垂鏃ユ湡',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_consuminfo` */
insert into `tb_consuminfo`(`id`,`card_number`,`type`,`consum_data`,`consume_date`) values (6,'15812346677','閫氳瘽',90,'2022-09-13 22:10:44'),(7,'15812346677','鐭俊',5,'2022-09-13 22:12:04'),(12,'18890985868','鐭俊',5,'2022-09-14 11:06:54'),(13,'13652363333','鐭俊',50,'2022-09-14 11:15:18');
/*Table structure for table `tb_mobole_card` */
DROP TABLE IF EXISTS `tb_mobole_card`;
CREATE TABLE `tb_mobole_card` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`card_number` char(11) COLLATE utf8mb4_bin NOT NULL COMMENT '鎵嬫満鍙风爜',
`username` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT '鐢ㄦ埛鍚?',
`password` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT '瀵嗙爜',
`ser_package` int(11) NOT NULL COMMENT '鎵?灞炲椁?',
`money` double(7,2) DEFAULT NULL COMMENT '璐︽埛浣欓',
`status` int(1) DEFAULT '0' COMMENT '鐘舵??:0:姝e父 1:鍐荤粨',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_mobole_card` */
insert into `tb_mobole_card`(`id`,`card_number`,`username`,`password`,`ser_package`,`money`,`status`) values (1,'13677478866','zhangsan','123',1,10.00,0),(2,'13666557788','lisi','123456',3,10.00,1),(6,'13652363333','寮犱笁','123',2,21.00,0),(7,'15812346677','鏉庡洓','123456',1,10.00,0),(8,'18890985868','鐜嬩簲','123',2,31.50,0);
/*Table structure for table `tb_monthly_consumption_records` */
DROP TABLE IF EXISTS `tb_monthly_consumption_records`;
CREATE TABLE `tb_monthly_consumption_records` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`card_number` char(11) COLLATE utf8mb4_bin NOT NULL COMMENT '鎵嬫満鍙风爜',
`consum_amount` double(7,2) DEFAULT '0.00' COMMENT '褰撴湀娑堣垂閲戦',
`real_talk_time` int(11) DEFAULT '0' COMMENT '褰撴湀瀹為檯閫氳瘽鏃堕暱(鍗曚綅:鍒嗛挓)',
`real_SMS_count` int(11) DEFAULT '0' COMMENT '褰撴湀瀹為檯鍙戦?佺煭淇℃潯鏁?',
`real_flow` int(11) DEFAULT '0' COMMENT '褰撴湀瀹為檯涓婄綉娴侀噺',
`consume_date` date DEFAULT NULL COMMENT '鏃ユ湡',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_monthly_consumption_records` */
insert into `tb_monthly_consumption_records`(`id`,`card_number`,`consum_amount`,`real_talk_time`,`real_SMS_count`,`real_flow`,`consume_date`) values (1,'13677478866',0.00,590,80,0,'2022-09-01'),(12,'15812346677',0.00,90,5,0,'2022-09-01'),(13,'13677478866',10.00,650,50,0,'2022-08-01'),(17,'18890985868',0.00,0,0,0,'2022-09-01'),(18,'13652363333',5.00,0,50,0,'2022-09-01');
/*Table structure for table `tb_recharge_record` */
DROP TABLE IF EXISTS `tb_recharge_record`;
CREATE TABLE `tb_recharge_record` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`amount` double(7,2) NOT NULL COMMENT '鍏呭?奸噾棰?',
`recharge_date` datetime DEFAULT NULL COMMENT '鍏呭?兼椂闂?',
`card_number` char(11) COLLATE utf8mb4_bin NOT NULL COMMENT '鎵嬫満鍙?',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_recharge_record` */
insert into `tb_recharge_record`(`id`,`amount`,`recharge_date`,`card_number`) values (1,50.00,'2022-08-30 18:19:28','13666557788'),(5,100.00,'2022-09-09 17:04:05','13652363333'),(6,100.00,'2022-09-09 17:10:05','15812346677'),(7,100.00,'2022-09-13 15:51:50','18890985868');
/*Table structure for table `tb_scene` */
DROP TABLE IF EXISTS `tb_scene`;
CREATE TABLE `tb_scene` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`type` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '鍦烘櫙绫诲瀷',
`data` int(11) DEFAULT NULL COMMENT '鍦烘櫙娑堣垂鏁版嵁',
`description` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '鍦烘櫙鎻忚堪',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_scene` */
insert into `tb_scene`(`id`,`type`,`data`,`description`) values (1,'閫氳瘽',90,'闂?欏鎴?,璋佺煡鍏跺姝ら毦缂?,閫氳瘽90鍒嗛挓'),(2,'閫氳瘽',30,'璇㈤棶濡堝韬綋鐘跺喌,鏈湴閫氳瘽30鍒嗛挓'),(3,'鐭俊',5,'鍙備笌鐜淇濇姢瀹炴柦鏂规闂嵎璋冩煡,鍙戦?佺煭淇?5鏉?'),(4,'鐭俊',50,'鍛婅瘔鏈嬪弸鏈汉宸叉崲鎵嬫満鍙风爜,鍙戦?佺煭淇?50鏉?'),(5,'涓婄綉',1024,'鍜屽コ鏈嬪弸寰俊瑙嗛鑱婂ぉ,浣跨敤娴侀噺1GB'),(6,'涓婄綉',2048,'鏅氫笂鎵嬫満鍦ㄧ嚎杩藉墽,涓?涓嶇暀绁炵潯鐫?浜?,浣跨敤娴侀噺2GB');
/*Table structure for table `tb_serpackage` */
DROP TABLE IF EXISTS `tb_serpackage`;
CREATE TABLE `tb_serpackage` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`talk_time` int(11) DEFAULT NULL COMMENT '閫氳瘽鏃堕暱',
`sms_count` int(11) DEFAULT NULL COMMENT '鐭俊鏉℃暟',
`price` double(7,2) DEFAULT NULL COMMENT '濂楅鏈堣祫璐?',
`flow` int(11) DEFAULT NULL COMMENT '涓婄綉娴侀噺',
`type` int(11) DEFAULT NULL COMMENT '濂楅绫诲瀷',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_serpackage` */
insert into `tb_serpackage`(`id`,`talk_time`,`sms_count`,`price`,`flow`,`type`) values (1,600,100,58.00,0,1),(2,0,0,68.00,20480,2),(3,300,50,78.00,10240,3);
/*Table structure for table `tb_serpackage_type` */
DROP TABLE IF EXISTS `tb_serpackage_type`;
CREATE TABLE `tb_serpackage_type` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
`name` varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '濂楅绫诲瀷鍚嶇О',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/*Data for the table `tb_serpackage_type` */
insert into `tb_serpackage_type`(`id`,`name`) values (1,'璇濈棬濂楅'),(2,'缃戣櫕濂楅'),(3,'瓒呬汉濂楅');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;