目录
1.项目难点
1.1用户注册
思路分析:
首先查询数据库卡号表,将没有注册过的卡号在idea显示出来。其次查询数据库套餐表和套餐费用表,将可供选择的套餐和费用展示出来,接着填写用户个人信息以及预存话费,如果预存话费不够则不能注册。
public void regist() throws CardNmberAndPasswordException {
System.out.println("*****可选择的卡号*****");
String sql1 = "SELECT id,cardNumber,STATUS FROM tb_card WHERE STATUS=0";
List<Card> list1 = JDBCUtil.executeQuery(sql1, Card.class);
for (int i = 0; i < list1.size(); i++) {
System.out.print((i + 1) + "." + list1.get(i).getCardNumber() + "\t");
if ((i + 1) % 3 == 0)
System.out.println();
}
System.out.println("请选择你的卡号: ");
int index = sc.nextInt();
while (index < 1 || index > list1.size()) {
System.out.println("卡号不存在");
}
cardNum = list1.get(index - 1).getCardNumber();
String sql2 = "SELECT id,NAME FROM tb_serpackage_type";
List<SerpackageType> list2 = JDBCUtil.executeQuery(sql2, SerpackageType.class);
for (int i = 0; i < list2.size(); i++) {
System.out.print((i + 1) + "." + list2.get(i).getName() + "\t");
}
System.out.println("请选择你的套餐:");
int type = sc.nextInt();
while (type < 1 || type > list2.size()) {
System.out.println("没有该套餐");
type = sc.nextInt();
}
System.out.println("请输入你的姓名:");
username = sc.next();
System.out.println("请输入你的密码:");
password = sc.next();
System.out.println("请输入你预存的话费:");
double amount = sc.nextDouble();
String sql3 = "SELECT id,talk_time talkTime,sms_count smsCount,price,flow," +
"TYPE FROM tb_serpackage";
List<Serpackage> list3 = JDBCUtil.executeQuery(sql3, Serpackage.class);
//获取套餐月资费 price
price = list3.get(type - 1).getPrice();
while (amount <= 0 || amount< price) {
System.out.println("您预存话费不足以支付本月套餐费用,请重新输入");
amount = sc.nextDouble();
}
money = amount - price;
System.out.println("注册成功!" + "卡号:" + cardNum + "," + "用户名:" + username + "," + "当前余额:" + money);
serPackage = list3.get(type - 1).getType();
String sql4 = "UPDATE tb_card SET STATUS =1 WHERE cardNumber=?";
String sql5 = "insert into tb_mobole_card values (?,?,?,?,?,?,?)";
String sql6 = "insert into tb_monthly_consumption_records values (?,?,?,?,?,?,?)";
status = JDBCUtil.executeUpdate(sql4, cardNum);
JDBCUtil.executeUpdate(sql5, id, cardNum, username, password, serPackage, money, status);
JDBCUtil.executeUpdate(sql6, id, cardNum, 0, 0, 0, 0, DateUtil.getCurrentMonthFirstDay());
System.out.println(list2.get(type-1).getName() + "通话时长" + list3.get(type - 1).getTalkTime() + "分钟/月");
}
1.2.使用嗖嗖
思路分析:使用嗖嗖一共有6个具体场景,分为3大类(上网,通话,短信),每个卡号套餐都有各自对应的功能。首先我们查询电话的套餐类型,对应使用场景,在使用之前我们先判断卡里的余额是否为正,卡里有钱时我们才能使用,当我们使用超出套餐余量时,就会扣除相应的费用,当卡里余额不足时就会禁止使用。
String sqlmc1 = "SELECT card_number cardnumber,username,PASSWORD,ser_package serPackage,money,STATUS" +
" FROM tb_mobole_card WHERE card_number=?";
List<MoboleCard> listmc1 = JDBCUtil.executeQuery(sqlmc1, MoboleCard.class, mlist.get(0).getCardNumber());
money = listmc1.get(0).getMoney();
if(money<=0){
System.out.println("【友情提示】:您的余额不足,请充值后使用!");
MoboleCardDaoImpl mcdi=new MoboleCardDaoImpl();
mcdi.dorecharge();
scene(mlist);
}else {
String sqlmcr1 = "SELECT card_number cardNumber,consum_amount consumAmount,real_talk_time realTalkTime,\n" +
"real_SMS_count realSMSCount,real_flow realFlow,consume_date consumeDate\n" +
"FROM tb_monthly_consumption_records WHERE card_number=?";
List<MonthlyConsumptionRecords> listmcr1 = JDBCUtil.executeQuery(sqlmcr1, MonthlyConsumptionRecords.class,
mlist.get(0).getCardNumber());
realTalkTime = listmcr1.get(0).getRealTalkTime();
realSMSCount = listmcr1.get(0).getRealSMSCount();
realFlow = listmcr1.get(0).getRealFlow();
consumAmount = listmcr1.get(0).getConsumAmount();
套餐3代码
String sqlsc3 = "select type,data,description from tb_scene where type = ? or type = ? or type = ?";
List<Scene> listsc3 = JDBCUtil.executeQuery(sqlsc3, Scene.class, "通话", "短信", "上网");
int index3 = r.nextInt(listsc3.size());
type = listsc3.get(index3).getType();
data = listsc3.get(index3).getData();
String sqlci5 = "INSERT INTO tb_consuminfo VALUES (?,?,?,?,?)";
JDBCUtil.executeUpdate(sqlci5, id, mlist.get(0).getCardNumber(), type, data, consumeDate);
String sqlci6 = "SELECT card_number cardNumber,type,consum_data consumData,consume_date consumeDate" +
" FROM tb_consuminfo WHERE card_number=? and type=?";
List<Consuminfo> listci6 = JDBCUtil.executeQuery(sqlci6, Consuminfo.class, mlist.get(0).getCardNumber(), type);
consumData = listci6.get(listci6.size() - 1).getConsumData();
switch (type) {
case "上网":
realFlow = realFlow + consumData;
if(realFlow>10240){
consumAmount = (realFlow - 10240) * 0.1;
System.out.println("您的流量不够,已扣除相应费用");
}else {
consumAmount=0;
}
break;
case "短信":
realSMSCount = realSMSCount + consumData;
if (realSMSCount > 50) {
consumAmount = (realSMSCount - 50) * 0.1;
System.out.println("您的短信条数不够,已扣除相应费用");
} else {
consumAmount = 0;
}
break;
case "通话":
realTalkTime = realTalkTime + consumData;
if (realTalkTime > 300) {
consumAmount = (realTalkTime - 300) * 0.2;
System.out.println("您的通话时长不足,已扣除相应费用");
} else {
consumAmount = 0;
}
break;
}
money=money-consumAmount;
String sqlmcr6 = "UPDATE tb_monthly_consumption_records SET consum_amount=?,real_talk_time=?,real_SMS_count=?,real_flow=?," +
"consume_date=? WHERE card_number=?";
JDBCUtil.executeUpdate(sqlmcr6,consumAmount,realTalkTime, realSMSCount, realFlow, DateUtil.getCurrentMonthFirstDay(), mlist.get(0).getCardNumber());
String sqlmc4=" UPDATE tb_mobole_card SET money=? WHERE card_number=?";
JDBCUtil.executeUpdate(sqlmc4,money,mlist.get(0).getCardNumber());
System.out.println(listsc3.get(index3).getDescription());
break;
2.项目出现的问题
2.1.缺少参数造成程序运行错误
错误代码
String sql = "select id,card_number cardNumber,username,password,ser_package serPackage,money,\n" +
"status from tb_mobole_card where card_number=? " + "and password=?";
List<MoboleCard> mlist = JDBCUtil.executeQuery(sql, MoboleCard.class);
正确代码
String sql = "select id,card_number cardNumber,username,password,ser_package serPackage,money,\n" +
"status from tb_mobole_card where card_number=? " + "and password=?";
List<MoboleCard> mlist = JDBCUtil.executeQuery(sql, MoboleCard.class, cardNumber, password);
2.2.在调用数据库时使用别名造成程序运行错误
错误代码
String sql = "select id,card_number cardNumber,username,password,ser_package serPackage,money,\n" +
"status from tb_mobole_card where cardNumber=? " + "and password=?";
List<MoboleCard> mlist = JDBCUtil.executeQuery(sql, MoboleCard.class, cardNumber, password);
正确代码
String sql = "select id,card_number cardNumber,username,password,ser_package serPackage,money,\n" +
"status from tb_mobole_card where card_number=? " + "and password=?";
List<MoboleCard> mlist = JDBCUtil.executeQuery(sql, MoboleCard.class, cardNumber, password);
以上两种错误在编译时都不会报错,但是在运行时会报错,这也就导致了在找bug时很难发现问题,需要特别注意。
2.3.功能缺失
在实现注册功能时没有充分理解项目功能的需求,从而注册成功后没有显示全套餐的具体信息给用户。
改正后的代码
System.out.println(list2.get(type-1).getName() + "通话时长" + list3.get(type - 1).getTalkTime() + "分钟/月");
System.out.println(list2.get(type-1).getName() + "短信条数" + list3.get(type - 1).getSmsCount() + "条/月");
System.out.println(list2.get(type-1).getName() + "上网流量" + list3.get(type - 1).getFlow() + "MB/月");
这样就能将套餐详情完全展示出来
3.完成项目的收获
在经历了一周时间的代码编写,我收获到了很多。这是通过自己的努力实现的第一个项目,同时也将是我程序生涯的开头。这个项目作为我们java部分的总结训练,内容覆盖全面,涉及广泛,其中涉及到了数据库的知识,包括增删查改。还有JDBC操作数据库。还用到了java中的属性,方法,集合,接口,随机数,if语句,switch语句,while循环等,涉及到的知识面相当广泛。在我一开始写的时候根本不知道这些如何去使用,知识的理解程度不够,进度相对于其他人也慢了一些。在编写的过程中也出现了一些结构上的问题,并且重新去组织思路,还有一些标点符号的错误,最难写的就是命名,命名不规范对于自己查看代码也非常困难。在完成了这个项目之后,我对于命名的感悟也得到了提升。总的来说,这次项目经历让我收获颇丰。