嗖嗖移动业务大厅(Java版)
首先对此项目说明一下,我只完成了项目的基本需求,另外增加了一个用户反馈的功能,但是可能项目中间使用嗖嗖这个功能还有一些需要完善的地方,或者还有一些小bug,就当给大家参考一下了,希望谅解。代码我也上传到顶部了,大家可以直接下载参考一下,不需要VIP的。
目录
1. 项目需求
2. 项目使用的技术
3.项目需求分析
3.1 实体类和接口(注意:属性名和数据库字段名保持一致)
3.2 各功能效果图
1. 菜单显示页面,以及登录
2. 用户注册
3. 本月账单查询
4. 套餐余量查询
5. 打印消费清单
6. 使用嗖嗖
7. 办理退网
8.套餐变更
9. 话费充值
10.查看资费说明
11.用户反馈
4.项目模块搭建视图
5.功能实现(思路)
5.1 用户登录
5.2 用户注册
5.3 使用嗖嗖
5.4 本月账单查询
5.5 套餐余量查询
5.6 打印消费详单
5.7 套餐变更
5.8 办理退网
5.9 话费充值
5.10 资费说明
5.11 用户返回
sql文件:
6.总结
1. 项目需求
中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各种套餐所包含的服务内容及费用如下表:
品牌套餐 | 话痨套餐 | 网虫套餐 | 超人套餐 |
---|---|---|---|
通话时长(分钟) | 600 | 0 | 300 |
上网流量 | 0 | 20 | 10 |
短信条数(条) | 100 | 0 | 50 |
费用(元/月) | 58 | 68 | 78 |
如实际使用中超出套餐内包含的通话时长,短信条数和上网流量,则按一下规则计费:
-
超出的通话: 0.2元/分
-
超出的短信:0.1元/条
-
超出的上网流量:0.01元/MB
本任务实现的"嗖嗖移动业务大厅"提供了嗖嗖移动用户的常用功能,包括新用户注册,本月账单查询,套餐余量查询,打印消费详情,套餐变更,办理退网,话费充值,查看消费记录,查看话费说明等功能.另外,还可以模拟用户通话,上网,发送短信的场景进行相应的扣费并记录消费信息.各功能介绍如下表:
菜单级别 | 功能 | 描述 |
---|---|---|
主菜单 | 用户登录 | 输入正确的手机号码和密码进入二级菜单列表 |
主菜单 | 用户注册 | 录入信息并开卡,用户输入的信息包括:选择卡号,选择套餐类型,输入用户名和密码,预存话费金额(预存话费金额必须满足以支付所选套餐的一个月的费用) |
主菜单 | 使用嗖嗖 | 输入正确的手机号码和密码之后,随机进入本号码所属套餐可以支持的一个场景,消费套餐余量或者话费余额,并记录消费信息.当话费余额不足时,抛出异常提醒用户充值 |
主菜单 | 话费充值 | 输入正确的用户名和密码之后,可为该卡号充值 |
主菜单 | 资费说明 | 提供各品牌套餐所包含的通话时长,上网流量,短信条数,月费用等 |
主菜单 | 退出系统 | 提出本系统 |
二级菜单 | 本月账单查询 | 可查询该卡号的套餐费用,实际消费金额,账户余额 |
二级菜单 | 套餐余量查询 | 可查询该卡号的套餐余量 |
二级菜单 | 打印消费详情 | 输入正确的卡号和密码后,可打印当前卡号用户的消费详单, 使用输出流把用户信息输出到文件 |
二级菜单 | 套餐变更 | 可变更为其他套餐类型,变更后话费余额需减去变更后的套餐费用,余额不足时需要给出信息提示,套餐变更后重新统计卡中实际消费数据以及当月消费金额 |
二级菜单 | 办理退网 | 输入正确的卡号和密码后,可以从已注册的号码列表中删除本号码,并退出系统 |
使用嗖嗖
功能分析
1) 模拟嗖嗖用户使用卡的过程,选择该功能后,输入当前卡号,通过验证后,可随机进入如下表的6个场景,要求所进入的场景的服务类型是该卡所属套餐支持的(如网虫套餐只能进入服务类型为"上网"的场景)
序号 服务类型 描述 0 通话 问候客户,谁知其如此难缠,通话90分钟 1 通话 询问妈妈身体状况,本地通话30分钟 2 短信 参与环境保护实施方案问卷调查,发送短信5条 3 短信 同时朋友本人已换手机号码,发送短信50条 4 上网 和女朋友微信视频聊天,使用流量1GB 5 上网 晚上手机在线追剧,一不留神睡着了,使用流量2GB 模拟消费,进入场景之后,将按场景的描述要求消费套餐余量,如果套餐余量不足,则需要按套餐外的费用规则扣费,成功消费后,添加一条消费记录
2. 项目使用的技术
-
面向对象的思想
-
封装,继承,多态,接口的使用
-
异常处理的合理使用
-
集合框架的使用
-
I/O 操作实现对文件的写
-
MySQL数据
-
JDBC操作数据库
3.项目需求分析
3.1 实体类和接口(注意:属性名和数据库字段名保持一致)
Card(电话号码类)
cardNumber 卡号
status 状态
MoboleCard(嗖嗖移动卡类)
card_number 卡号
username 用户名
password 密码
ser_package 所属套餐
money 账户余额
status 状态
monthlyConsumptionRecords(月消费记录类)
card_number 卡号
consum_amount 当月消费金额
real_talk_time 当月实际通话时长
real_SMS_count 当月实际发送短信条数
real_flow 当月实际上网流量
consume_date 消费日期
套餐类 SerPackage
talk_time 通话时长
sms_count 短信条数
price 套餐月资费
flow 上网流量
type 套餐类型
套餐类型类 SerPackageType
name 套餐名称
ConsumInfo(消费信息类)
card_number 卡号
type 消费类型
consum_data 消费数据
consume_date 消费日期
Scene(使用场景类)
type 场景类型
data 场景消费数据
description 场景描述
RechargeRecord(充值记录类)
amount 充值金额
recharge_date 充值日期
card_number 卡号
SerPackageName(资费说明类)
id 编号
name 套餐名称
talk_time 通话时长
sms_count 短信条数
flow 流量剩余
3.2 各功能效果图
1. 菜单显示页面,以及登录
卡号或密码错误:
卡号被禁用:
登录成功:
2. 用户注册
3. 本月账单查询
4. 套餐余量查询
5. 打印消费清单
6. 使用嗖嗖
7. 办理退网
8.套餐变更
9. 话费充值
10.查看资费说明
11.用户反馈
4.项目模块搭建视图
这里使用的是三层架构的搭建模式,dao层,service层,view层。由于类,代码比较多,我会把源代码上传一下。
5.功能实现(思路)
5.1 用户登录
public static void userLogin() {System.out.print("请输入手机卡号:");String cardNumber = scanner.next();System.out.print("请输入密码:");String password = scanner.next();List<MoboleCard> moboleCards = moboleCardService.userLogin(cardNumber, password);if (moboleCards != null && !moboleCards.isEmpty()) {moboleCard = moboleCards.get(0);if (moboleCard.getStatus() == 1) {System.out.println("【友情提示】:该卡号已被禁用");} else {System.out.println("【友情提示】:登录成功");showSecondMenu();}} else {System.out.println("【友情提示】:卡号或者密码错误");}}
5.2 用户注册
public static void userRegister() {System.out.println("*****可选择的卡号*****");List<Card> cards = cardService.queryByCard();for (int i = 0; i < cards.size(); i++) {if (cards.get(i).getStatus() == 0) {System.out.print(index + "." + cards.get(i).getCardNumber() + "\t");availableCards.add(cards.get(i));if (index % 3 == 0) {System.out.println();}index++;}}if (index % 3 != 1) {System.out.println();}System.out.println();System.out.print("请选择你的卡号:");int cardIndex = scanner.nextInt();Card selectedCard = availableCards.get(cardIndex - 1);// 显示套餐类型SerPackageTypeService serPackageTypeService = new SerPackageTypeServiceImpl();List<SerPackageType> serPackageTypes = serPackageTypeService.querySerPackageType();for (int i = 0; i < serPackageTypes.size(); i++) {System.out.print((i + 1) + "." + serPackageTypes.get(i).getName() + "\t");}System.out.print("请选择套餐:");int serPackageTypeIndex = scanner.nextInt();// 根据选择的编号给id复制得到对应的套餐信息int id = 0;String serName = "";if (serPackageTypes.get(serPackageTypeIndex - 1).getName().equals("话痨套餐")) {id = 1;serName = "话痨套餐";} else if (serPackageTypes.get(serPackageTypeIndex - 1).getName().equals("网虫套餐")) {id = 2;serName = "网虫套餐";} else if (serPackageTypes.get(serPackageTypeIndex - 1).getName().equals("超人套餐")) {id = 3;serName = "超人套餐";}// 得到套餐的具体信息List<SerPackage> serPackages = serPackageService.queryByType(id);SerPackage serPackage = serPackages.get(0);System.out.print("请输入姓名:");String username = scanner.next();System.out.print("请输入密码:");String password = scanner.next();double amount = 0;boolean flag = true;// 判断预存金额是否大于套餐资费while (flag) {System.out.print("请输入预存话费金额:");amount = scanner.nextDouble();if (amount < serPackage.getPrice()) {System.out.print("您预存话费不足以支付本月套餐资费,请重新输入!\n");} else if (amount > serPackage.getPrice()) {flag = false;}}// 创建MoboleCard对象并设置属性MoboleCard moboleCard = new MoboleCard();moboleCard.setCard_number(selectedCard.getCardNumber());moboleCard.setUsername(username);moboleCard.setPassword(password);moboleCard.setSer_package(id);moboleCard.setMoney(amount - serPackage.getPrice());moboleCard.setStatus(0);// 将MoboleCard添加到用户信息数据库moboleCardService.executeUpdate(moboleCard);// 修改tb_card表的status状态selectedCard.setStatus(1);cardService.updateCardStatus(selectedCard.getStatus(), selectedCard.getCardNumber());// 往充值记录表里面添加一条充值记录RechargeRecord rechargeRecord = new RechargeRecord();rechargeRecord.setAmount(amount);rechargeRecord.setRecharge_date(new Date());rechargeRecord.setCard_number(selectedCard.getCardNumber());recordService.insertRecharge(rechargeRecord);System.out.print("【友情提示】:注册成功!");System.out.println("卡号:" + selectedCard.getCardNumber() + ",用户名:" + moboleCard.getUsername() + ",当前余额:" + moboleCard.getMoney());System.out.println(serName + "通话时长:" + serPackage.getTalk_time() + "分钟/月");}
5.3 使用嗖嗖
public static void userSoSo() {System.out.print("请输入手机卡号: ");String cardNumber = scanner.next();List<MoboleCard> moboleCards = moboleCardService.findByCardNumber(cardNumber);MoboleCard moboleCard = moboleCards.get(0);if (moboleCard == null || moboleCard.getStatus() == 1) {System.out.println("【友情提示】:卡号不存在或已被禁用");return;}// 获取用户套餐类型SerPackage serPackage = serPackageService.queryPackageById(moboleCard.getSer_package()).get(0);String serviceType = "";switch (serPackage.getType()) {case 1:serviceType = "通话";break;case 2:serviceType = "短信";break;case 3:serviceType = "上网";break;}// 根据套餐类型获取可用场景List<Scene> scenes = sceneService.queryScene();List<Scene> availableScenes = new ArrayList<>();for (Scene scene : scenes) {if (scene.getType().equals(serviceType)) {availableScenes.add(scene);}}// 判断是否有场景描述if (availableScenes.isEmpty()) {System.out.println("【友情提示】:没有可用的" + serviceType + "场景");return;}// 随机选择一个场景Scene selectedScene = availableScenes.get(new Random().nextInt(availableScenes.size()));// 查询或添加记录到tb_monthly_consumption_records表List<MonthlyConsumptionRecords> recordsList = mcRecordService.queryMonRecord(cardNumber);MonthlyConsumptionRecords records = null;double amount = 0;if (!recordsList.isEmpty()) {records = recordsList.get(0); // 根据id得到月消费记录} else {// 如果不存在记录,创建并添加新记录records = new MonthlyConsumptionRecords();records.setCard_number(cardNumber);records.setConsum_amount(0);records.setReal_talk_time(0);records.setReal_SMS_count(0);records.setReal_flow(0);records.setConsume_date(new Date());mcRecordService.insertMonRecord(records);}// 更新消费记录switch (selectedScene.getType()) {case "通话":double newTalkTime = records.getReal_talk_time() + selectedScene.getData();if (records.getReal_talk_time() > serPackage.getTalk_time()) {amount = selectedScene.getData() * 0.2;} else if (newTalkTime > serPackage.getTalk_time()) {amount = (newTalkTime - serPackage.getTalk_time()) * 0.2;}records.setReal_talk_time((int) newTalkTime);break;case "短信":int newSMSCount = records.getReal_SMS_count() + selectedScene.getData();if (records.getReal_SMS_count() > serPackage.getSms_count()) {amount = selectedScene.getData() * 0.2;} else if (newSMSCount > serPackage.getSms_count()) {amount = (newSMSCount - serPackage.getSms_count()) * 0.1;}records.setReal_SMS_count(newSMSCount);break;case "上网":double newFlow = records.getReal_flow() + selectedScene.getData();if (records.getReal_flow() > serPackage.getFlow()) {amount = selectedScene.getData() * 0.2;} else if (newFlow > serPackage.getFlow()) {amount = (newFlow - serPackage.getFlow()) * 0.01;}records.setReal_flow((int) newFlow);break;}// 更新月消费记录records.setConsum_amount((records.getConsum_amount() + amount));mcRecordService.updateMonRecord(records);// 添加数据到consuminfo表中ConsumInfo consumInfo = new ConsumInfo();consumInfo.setCard_number(cardNumber);consumInfo.setType(selectedScene.getType());consumInfo.setConsum_data(selectedScene.getData());consumInfo.setConsume_date(new Date());infoService.insertConsum(consumInfo);// 更新用户余额moboleCard.setMoney(moboleCard.getMoney() - amount);moboleCardService.updateMoney(moboleCard.getMoney(), cardNumber);System.out.println("【友情提示】:" + selectedScene.getDescription());}
5.4 本月账单查询
public static void monRecord() {System.out.println("********本月账单查询********");List<MonthlyConsumptionRecords> monRecord = mcRecordService.queryMonRecord(moboleCard.getCard_number());double price = 0;if (monRecord.isEmpty()) {System.out.println("【友情提示】:此卡号暂无月消费记录");} else {MonthlyConsumptionRecords records = monRecord.get(0);if (moboleCard.getSer_package() == 1) {price = 58;} else if (moboleCard.getSer_package() == 2) {price = 68;} else if (moboleCard.getSer_package() == 3) {price = 78;}System.out.println("您的卡号:" + moboleCard.getCard_number() + ",当月账单:");System.out.println("套餐资费:" + price + "元");System.out.println("合计:" + (price + records.getConsum_amount()) + "元");if (moboleCard.getMoney() <= 0) {System.out.println("账户余额:" + 0 + "元");} else {System.out.println("账户余额:" + moboleCard.getMoney() + "元");}}}
5.5 套餐余量查询
public static void packageMargin() {System.out.println("******套餐余量查询******");List<MonthlyConsumptionRecords> monRecord = mcRecordService.queryMonRecord(moboleCard.getCard_number());List<SerPackage> serPackages = serPackageService.queryPackageById(moboleCard.getSer_package());SerPackage serPackage = serPackages.get(0);if (monRecord.isEmpty()) {System.out.println("【友情提示】:此卡号暂无记录");} else {MonthlyConsumptionRecords records = monRecord.get(0);System.out.println("您的卡号是:" + moboleCard.getCard_number() + ",套餐内剩余:");System.out.println("通话时长:" + (serPackage.getTalk_time() - records.getReal_talk_time()) + "分钟");System.out.println("短信条数:" + (serPackage.getSms_count() - records.getReal_SMS_count()) + "条");System.out.println("上网流量:" + (serPackage.getFlow() - records.getReal_flow()) + "GB");}}
5.6 打印消费详单
public static void conDetails() {System.out.println("请输入本年需要查询的月份(1-12):");int month = scanner.nextInt();if (month < 1 || month > 12) {System.out.println("没有这个月份,请重新输入:");return;}List<ConsumInfo> consumInfos = infoService.queryConsumInfo(moboleCard.getCard_number(), month);if (consumInfos.isEmpty()) {System.out.println("【友情提示】:对不起,不存在本卡号" + month + "月消费记录");} else {System.out.println("序号\t类型\t消费数据\t日期");for (int i = 0; i < consumInfos.size(); i++) {ConsumInfo consumInfo = consumInfos.get(i);System.out.println((i + 1) + "\t" + consumInfo.getType() + "\t" + consumInfo.getConsum_data() + "\t" + consumInfo.getConsume_date());}}}
5.7 套餐变更
public static void packageCharge() {System.out.println("******套餐变更******");SerPackageTypeService serPackageTypeService = new SerPackageTypeServiceImpl();List<SerPackageType> serPackageTypes = serPackageTypeService.querySerPackageType();for (int i = 0; i < serPackageTypes.size(); i++) {System.out.print((i + 1) + "." + serPackageTypes.get(i).getName() + "\t");}System.out.print("请选择套餐:");int serPackageTypeIndex = scanner.nextInt();// 根据卡号得到具体的用户信息(ser_package)List<MoboleCard> moboleCards = moboleCardService.findByCardNumber(moboleCard.getCard_number());MoboleCard moblecards = moboleCards.get(0);// 根据(ser_package)得到具体的套餐信息List<SerPackage> serPackages = serPackageService.queryPackageById(serPackageTypeIndex);SerPackage serPackage = serPackages.get(0);String SerType = "";switch (serPackage.getType()) {case 1:SerType = "话痨套餐";break;case 2:SerType = "网虫套餐";break;case 3:SerType = "超人套餐";break;}if (serPackageTypeIndex < 1 || serPackageTypeIndex > 3) {System.out.println("【友情提示】:所选已超出套餐范围!");} else {if (moblecards.getSer_package() == serPackageTypeIndex) {System.out.println("【友情提示】:您已是该套餐的用户,无需更换!");} else {if (moblecards.getMoney() < serPackage.getPrice()) {System.out.println("【友情提示】:对不起,您的余额不足以支付新套餐本月资费,请充值后办理变更套餐业务!");} else {moboleCardService.chargeSerType(serPackageTypeIndex, moboleCard.getCard_number());List<SerPackage> packages = serPackageService.queryPackageById(serPackageTypeIndex);SerPackage aPackage = packages.get(0);int count = mcRecordService.deleteMonRecord(moboleCard.getCard_number());if (count > 0) {System.out.println("【友情提示】:更换套餐成功!" + SerType + ":通话时长:" + aPackage.getTalk_time() + "分钟/月,短信条数:" + aPackage.getSms_count() + "条/月,上网流量:" + aPackage.getFlow() + "GB/月,月租:" + aPackage.getPrice() + "元/月");}}}}}
5.8 办理退网
public static void handleNet() {System.out.println("******办理退网******");int handledNet = moboleCardService.handleNet(moboleCard.getCard_number());if (handledNet > 0) {recordService.deleteRecharge(moboleCard.getCard_number());mcRecordService.deleteMonRecord(moboleCard.getCard_number());infoService.deleteConsumInfo(moboleCard.getCard_number());cardService.updateCardStatus(0, moboleCard.getCard_number());System.out.println("【友情提示】:卡号" + moboleCard.getCard_number() + "办理退网成功!");} else {System.out.println("【友情提示】:退网失败,请检查卡号是否正确!");}}
5.9 话费充值
public static void recharge() {System.out.println("*******话费充值*******");System.out.print("请输入要充值卡号:");String cardNumber = scanner.next();System.out.print("请输入要充值的金额:");double amount = scanner.nextDouble();List<MoboleCard> byCardNumber = moboleCardService.findByCardNumber(cardNumber);MoboleCard moboleCard = byCardNumber.get(0);if (moboleCard != null) {moboleCard.setCard_number(cardNumber);moboleCard.setMoney(moboleCard.getMoney() + amount);moboleCardService.updateBalance(moboleCard);// 添加充值记录RechargeRecord rechargeRecord = new RechargeRecord();rechargeRecord.setAmount(amount);rechargeRecord.setRecharge_date(new Date());rechargeRecord.setCard_number(cardNumber);recordService.insertRecharge(rechargeRecord);System.out.println("【友情提示】:充值成功,卡上余额 :" + moboleCard.getMoney() + "元");} else {System.out.println("【友情提示】:充值失败,请检查卡号是否正确!");}}
5.10 资费说明
public static void tariffDes() {System.out.println("******套餐说明******");List<SerPackageName> serPackageNames = serPackageService.querySerPackages();System.out.println("序号\t套餐名称\t通话时长(分/月)\t短信条数(条/月)\t上网流量(GB/月)");for (SerPackageName serPackageName : serPackageNames) {System.out.println(serPackageName.getId() + "\t" + serPackageName.getName() + "\t\t" + serPackageName.getTalk_time() + "\t\t\t" + serPackageName.getSms_count() + "\t\t\t\t" + serPackageName.getFlow());}}
5.11 用户返回
public static void socket() throws Exception {Scanner scanner = new Scanner(System.in);// 1.创建socket对象Socket socket = new Socket("127.0.0.1", 12345);// 2.创建 BufferedReader 从服务器接收文本数据BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 3.创建 PrintWriter 向服务器发送文本数据,并设置为自动刷新PrintWriter out = new PrintWriter(socket.getOutputStream(), true);System.out.println("已连接到服务器");String inputLine;// 4.循环读取用户的输入直到用户输入 "END"while (scanner.hasNextLine()) {inputLine = scanner.nextLine();out.println(inputLine); // 发送数据if ("END".equalsIgnoreCase(inputLine)) {System.out.println("发送用户反馈结束请求");// 退出循环break;}// 5.接收服务器响应String response = in.readLine();if (response != null) {System.out.println("服务器响应:" + response);}}// 调用主菜单showMainMenu();if (in != null) {in.close();}if (out != null) {out.close();}if (socket != null) {socket.close();}}
}
public class Server {private static final String FILE_NAME = "feedback.txt";public static void main(String[] args) throws Exception {// 1.创建 ServerSocket 对象ServerSocket serverSocket = new ServerSocket(12345);System.out.println("服务器启动,端口:" + 12345);try (Socket clientSocket = serverSocket.accept()) { // 使用 try-with-resources 自动关闭资源System.out.println("接收到客户端连接");// 处理客户端请求handleClient(clientSocket);} catch (IOException e) {e.printStackTrace();}}private static void handleClient(Socket clientSocket) throws Exception {// 创建 BufferedReader 用于读取客户端发送的文本数据BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));// 创建 BufferedWriter 用于向客户端发送文本数据BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));String inputLine;while ((inputLine = in.readLine()) != null) {// 循环持续读取客户端发送的消息if ("END".equalsIgnoreCase(inputLine)) {System.out.println("客户端请求结束对话");out.write("对话结束,感谢您的反馈。");out.newLine();out.flush();break;} else {// 将数据保存到文件BufferedWriter fileOut = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FILE_NAME, true)));fileOut.write(inputLine);fileOut.newLine();fileOut.flush();System.out.println("接收到用户的反馈:" + inputLine);// 发送确认消息给客户端out.write("已收到您的反馈:" + inputLine);out.newLine();out.flush();}}}
}
sql文件:
/*
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:正常 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 */;
6.总结
以上就是嗖嗖移动大厅的主要功能的实现思路,可能还存在一些问题或者没完善的也没有充分考虑到的一些小逻辑,仅供大家参考一下思路,希望对大家有用,代码我也会打包放在这里,有需要的可以参考一下。
相关文章:
嗖嗖移动业务大厅(Java版)
首先对此项目说明一下,我只完成了项目的基本需求,另外增加了一个用户反馈的功能,但是可能项目中间使用嗖嗖这个功能还有一些需要完善的地方,或者还有一些小bug,就当给大家参考一下了,希望谅解。代码我也上传…...
hcia复习笔记
一、OSI 七层模型 应用层:为应用程序提供服务,如文件传输、电子邮件等。 表示层:数据格式转换、加密解密、压缩解压缩。 会话层:建立、维护和管理会话。 传输层:提供端到端的可靠或不可靠的数据传输服务࿰…...
pycharm中安装、使用扩展工具,以QT Designer为例
pycharm中安装、使用扩展工具,以QT Designer为例 第一步,下载QT Designer安装包。找到QT Designer.exe所在位置,复制路径 第二步,打开Pycharm,选择Setting,找到扩展工具(External Tools…...
【Rust光年纪】Rust语言实用库汇总:从机器翻译到全文搜索引擎
优秀的Rust语言库探索:机器翻译、音频编解码和全文搜索引擎 前言 Rust语言在近年来迅速崛起,成为了一种备受欢迎的系统级编程语言。随着其生态系统的不断丰富,涌现出了许多优秀的库和工具。本文将重点介绍几个用于Rust语言的重要库…...
学习笔记 - 二极管的参数与选型
二极管 普通二极管: 1N4148(高频开关二极管) 整流二极管: 1N4007 1A 1000V1N5408 3A 1000V 肖特基二极管 (白线边为阴极) SS14 SS34 SS54 常见肖特基二极管参数 快恢复二极管 FR107 FR207 FR307 UF4007 可以用快恢复二…...
PMP--冲刺--易混概念
文章目录 十大知识领域一、整合管理项目管理计划与项目文件的区分: 二、范围管理三、进度管理赶工与快速跟进的区分:赶工增加资源,以最小的成本代价来压缩进度工期;快速跟进,将正常情况下按顺序进行的活动或阶段改为至…...
Resolving Maven dependencies
Maven是一种项目管理和构建工具,通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件,并将它们添加到项目的构建路径中。具体来说,它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…...
【Spring】SSM框架整合Spring和SpringMVC
目录 1.项目结构 2.项目的pom.xml文件 3.spring.xml和springMVC配置文件 4.database.properties和mybatis.xml配置文件 5. 代码编写 6.测试整合结果 1.项目结构 首先创建一个名为ssm_pro的Mavew项目,然后再在主目录和资源目录下,创建如下所示的结…...
优维2024年中思考:大模型赋予新一代运维的“非产品性”启示
近年来,人工智能在各个行业的应用大幅增加,人工智能技术取得重大进步的领域之一是IT运维。 去年四季度,优维科技敏锐地提出“新一代运维核心系统提供商”的战略新定位,决定将“DevOps及运维”回归到“运维”本身,但我…...
【中药网络药理学】筛选细胞衰老和预后相关基因(附分类代码和画图代码)
1、衰老相关基因 从HAGR和msigdb数据获取细胞衰老相关基因,将两者取交集后构建基因蛋白互作网络 HAGR数据库 该库本身提供了下载链接,我在下载后对其进行了清洗 msigdb数据库 以"aging"作为关键词,Search Filters中collection…...
华为的流程体系
缘由 2010年,华为销售额为1850亿元,其中国际市场占65%,净利润238亿元。当时,公司员工达11万人,公司处理合同达5万多个,290万个订单,大量的工作是手工处理,没有统一的流程支持&#…...
算法——长度最小的子数组209 对比代码随想录题解中对于result取值为Integer.MAX_VALUE的思考
具体解题过程可看代码随想录,我主要是对于为什么result也就是子数组和初始化要为Integer.MAX_VALUE有一个疑惑,为什么不是其他值,经过思考后我发现: 情况一:如果result为负数的话是不符合数组长度取值的一个规范的。 情况二&…...
图像处理案例03
HOGSVM数字识别 1 . 步骤2 . 代码 1 . 步骤 读入数据,把数据划分为训练集和测试集用hog提取特征用SVM训练数据测试、评价模型保存模型加载模型,应用模型 2 . 代码 import os import cv2 import sklearn import numpy as np from skimage.feature impo…...
【Kubernetes】k8s集群中kubectl的陈述式资源管理
目录 一.k8s集群资源管理方式分类 1.陈述式资源管理方式 2.声明式资源管理方式 二.陈述式资源管理方法 三.kubectl命令 四.项目生命周期 1.创建 kubectl create命令 2.发布 kubectl expose命令 3.更新 kubectl set 4.回滚 kubectl rollout 5.删除 k…...
串---顺序串实现
顺序串详解 本文档将详细介绍顺序串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南,读者将了解如何使用顺序串进行各种字符串操作。 1. 什么是顺序串? 顺序串是一种用于存储字符串的数据结构,它使用一组连续的内存空间来保存…...
吴恩达机器学习WEEK2
COURSE1 WEEK2 多维特征 在线性回归中,往往特征不止一个,而是具有多维特征 例如,在预测房价的例子中,我们知道更多的信息: x 1 x_1 x1:房屋的面积 x 2 x_2 x2:卧室的数目 x 3 x_3 x3&a…...
yield and generator in python
首先,假设大家都对于pytyhon的List comprehension的使用有了一定经验(它可以用于list,set,和dict哦) 不熟悉的参考介绍: Comprehending Python’s Comprehensions – dbader.org generator generator是哦…...
spring原理(自学第六天)
Aware 接口及 InitializingBean 接口 今天将会学到Aware 接口及 InitializingBean 接口 我们可以先了解他们的作用: 1. Aware 接口用于注入一些与容器相关信息, 例如 a. BeanNameAware 注入 bean 的名字 b. BeanFactoryAware 注入…...
案例分享—国外优秀ui设计作品赏析
国外UI设计创意迭出,融合多元文化元素,以极简风搭配动态交互,打造沉浸式体验,色彩运用大胆前卫,引领界面设计新风尚 同时注重用户体验的深度挖掘,通过个性化定制与智能算法结合,让界面不仅美观且…...
【C++】简约与清晰的编程艺术
C编程的艺术:简约与清晰的实践之道 一、基础之美:基本类型与数据结构的力量二、函数与库类的艺术三、简约与清晰的实践之道 在C这一既古老又充满活力的编程语言世界里,程序员们常常面临着一个重要的选择:是追求代码的极致抽象与封…...
java之WIFI信号模块
开发步骤分为以下几点: 1.在 AndroidManifest 中声明相关权限(网络和文件读写权限) 声明权限: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name"android.…...
Mybatis面试
Mybatis 面试 1、Mybatis 的执行流程是什么? 1、读取MyBatis配置文件:mybatis-config.xml 加载运行环境 和 映射文件 2、构造会话工厂 SqlSessionFactory (全局只有一个) 3、会话工厂创建SqlSession对象(项目与数据…...
Centos 8系统xfs文件系统类型进行扩容缩容 (LVM)
Centos 8系统xfs文件系统类型进行扩容缩容 (LVM),xfs分区类型是不支持正常缩容,只能强制缩容 1.磁盘情况:2.缩容home分区1.备份home数据:2.查找使用 /home 的进程:3.终止这些进程:4.卸载 /home …...
C语言基础知识之函数指针和指针函数
函数指针和指针函数 函数指针和指针函数指向函数的指针返回指针值的函数指针函数和函数指针的区别 问题1_1代码1_1结果1_1 函数指针和指针函数 指向函数的指针 用函数指针变量调用函数 可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个…...
【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏
同时支持TextMeshInputFied,支持全屏。 使用github包【WebGLInput】:https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入,只需…...
vue3+vite全局引入less变量和函数
需要在vite配置 plugins: [css: {preprocessorOptions: {less: {additionalData: import "./src/styles/variables.module.less"; import "./src/views/Visualization/component/ViewportCom/px2viewport.less";,javascriptEnabled: true}}}, ]多个文件按…...
H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技
华强盛导读:在当今这个日新月异的汽车科技领域,每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统(BMS),其高效稳定的运行不仅关乎续航与安全,更是智能化驾驶体验的基石。而在这背后ÿ…...
C语言.回调函数
回调函数 回调函数也是一个函数。与一般函数直接调用区别在于,使用回调函数的过程,是一个函数将另一个函数作为参数调用。而被用来调用的那个函数,就是回调函数。 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地…...
《从零开始:使用Python构建简单Web爬虫》
前言 随着互联网信息的爆炸性增长,如何高效地获取和处理这些数据变得越来越重要。Web爬虫作为一种自动化工具,可以帮助我们快速抓取所需的网页内容。本文将介绍如何使用Python编写一个简单的Web爬虫,并通过实例演示其基本用法。 准备工作 …...
最新个人免签约支付系统源码|PHP源码 | 码支付系统 | ThinkPHP6框架 | 开源
源码介绍: 这个最新的个人专用免签约支付系统源码!是PHP源码写的哦,而且是用ThinkPHP6框架开发的,完全开源的码支付系统。 这个系统适合个人用户使用,作为收款的免签约解决方案。它还加入了监控端,可以拒…...
网站策划方案ppt/如何推广自己的微信号
字符串分割,将一个字符串分裂成多个字符串组成的列表,可以理解为字符串转列表,经常会用到语法:str.split(sep, [,max]),sep可以指定切割的符号,max可以指定切割的次数(次数不常用)不带参数时以空格进行分割带参数时&am…...
做响应式网站哪家好/最佳bt磁力狗
redis-benchmark是一个redis官方自带的压力测试工具 我们来简单测试下: 100个并发 每个并发100000个请求 redis-benchmark -h localhost -p 6379 -c 100 -n 100000开启redis服务器之后,执行: 性能测试分析:...
网站制作公司的宣传海报/有哪些实用的网络推广方法
经过长时间学习Python编辑器,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西,学习Python编辑器时,你可能会遇到Python编辑器问题,这里将介绍Python编辑器问题的解决方法࿰…...
wordpress怎么加统计代码/重庆网络推广
EDUSOHO踩坑笔记之二十四:缓存Redis Reids 即可当做数据库使用,也可当做缓存使用。启用 Redis 服务,需安装PHPRedis 扩展。框架集成了 Redis 服务,可通过以下方式启用: $biz->register(new Biz\Frameowrk\Provider…...
宜阳建站/百度网站排名规则
IT之家讯 微软在官方网站公布了Win10的开发路线图,其中描述了目前已经实现的功能、正在预览测试以及正在开发中的功能。根据描述,微软正在开发一种全新的Win10电脑解锁方式。首先,你可以使用自己的Windows Phone手机、安卓手机作为远程凭据存…...
网页视频下载安卓/谷歌seo靠谱吗
问题 : base64解密时间限制: 1 Sec 内存限制: 128 MB题目描述Base64编码要求把3个8位字节(3*824)转化为4个6位的字节(4*624),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节&…...