菜单级别 | 功能 | 描述 |
---|---|---|
主菜单 | 用户登录 | 输入正确的手机号码和密码进入二级菜单列表 通过select语句,方法传入cardNumber和password,使用工具类的executeQuery(),如果返回的list集合==null 或 为空集合,则抛出异常“卡号或密码错误”;如果返回的list集合的第一个的状态为禁用状态,则抛出异常“该号码已被禁用”。自定义异常LoginException继承exception, 打印异常信息。 null和isEmpty()的区别? null用于判断有没有这个集合对象,判断list这个对象有没有被实例化; isEmpty()用于判断集合内容是否为空,判断list里是否有元素。 |
主菜单 | 用户注册 | 录入信息并开卡,用户输入的信息包括:选择卡号,选择套餐类型,输入用户名和密码,预存话费金额(预存话费金额必须满足以支付所选套餐的一个月的费用) 查出状态为正常(0)的可用卡号,三个一行打印。 使用常量 NORMAL_MOBOLECARD_STATUS 代替魔鬼数字 魔鬼数字:即难以被理解的且没有注释的常量(0、1这种)表示某个有意义的参数来使用。 三个一行:如果(i+1) % 3 ==0 打印换行符 选择卡号的序号与集合的下标不一样 序号-1 = 集合下标 套餐序号同理 充值:根据套餐id查询套餐价格,判断充值金额是否大于等于套餐价格, 如果大于,添加记录到mobileCard表、consumeInfo表,并且修改card表的状态为禁用。 如果小于,提示重新输入。 while (money<price) |
主菜单 | 使用嗖嗖 | 输入正确的手机号码和密码之后,随机进入本号码所属套餐可以支持的一个场景,消费套餐余量或者话费余额,并记录消费信息.当话费余额不足时,抛出异常提醒用户充值 随机使用情景模式:查询Scene表,使用随机数获取list下标 int index = new Random().nextInt(scenes.size()); Random()产生的随机数在 [0, 1) 通过输入的卡号查询卡的是否存在或是否被禁用,若为正常,通过该卡的套餐type查找Serpackage表,获取套餐信息。 根据卡号、当前的年和月查询查找MonthlyConsumptionRecords表,得到卡的月消费记录。如果为空,添加都为0的数据,获取当前月份的第一天给consumeDate属性赋值。
//得到当前月的第一天的日期
public static Date getFirstDayDate(){
//得到当前系统日期
Calendar c = Calendar.getInstance();
//设置天为1
c.set(Calendar.DATE,1);
//返回
return c.getTime();
}
添加后,重新通过时间和卡号查询数据库,给对象赋值得到id。因为数据库id为自增的,对象没有id。
根据场景类型计算对应卡的能使用的数据的最大值,通过场景类型判断区别。如:随机场景类型为“通话”, 计算卡的最大通话时间。
最大通话时间= 套餐余额(套餐总值-月已消费)+money/规则计费(每分钟0.2元) 设置月消费记录的通话总计
最后判断,如果最大通话时间大于场景使用数据,将最大通话时间和原本的已消费时间的和赋给月消费记录对象;如果小于,将场景使用数据和已消费时间的和赋值。
mcRecord.setRealTalkTime(data > max?(max+talkTime):(data+talkTime));//原本有的+新花的
目的是给月消费记录表累加数据。
判断是否超出可用的最大值,如果超出,打印提示“请充值后再使用。”
修改三个表
添加消费记录,更新ConsumInfo表,设置消费数据为本次消费实际数据
修改移动卡表
如果套餐剩余数量大于实际使用数量:
消费金额= (实际使用数量-套餐剩余数量)*计费;
修改卡的余额=(原来的余额-消费金额)
如果小于:消费金额= 0;卡的余额不变
修改月记录表,修改当月消费金额 = (这次花的+原本花过的)
最后打印消费场景 |
主菜单 | 话费充值 | 输入正确的用户名和密码之后,可为该卡号充值 查找mobile卡是否存在,输入充值金额,修改mobile卡的余额,添加充值记录到tb_recharge_record |
主菜单 | 资费说明 | 提供各品牌套餐所包含的通话时长,上网流量,短信条数,月费用等 select 资费套餐表 返回list集合 遍历打印 显示套餐名和资费情况(待开发 表连接查询返回的对象是?) |
主菜单 | 退出系统 | 退出本系统 System.exit(0); |
二级菜单 | 本月账单查询 | 可查询该卡号的套餐费用,实际消费金额,账户余额 实际消费金额 = 套餐资费+消费金额(月消费记录表) 账户余额:mobile表的money |
二级菜单 | 套餐余量查询 | 可查询该卡号的套餐余量 用套餐类-月消费记录类 (套餐通话时长-实际通话时长) 套餐通话时长=通过mobileCard的serPackage查找serpackage表中的数据 剩余通话时长=套餐类的talkTime- cardNumber为xxx的月消费记录的realTalkTime 如果剩余的数据小于0 设置剩余数据=0 |
二级菜单 | 打印消费详情 | 输入正确的卡号和密码后,可打印当前卡号用户的消费详单, 使用输出流把用户信息输出到文件 输入本年需要查询的月份 查找ConsumInfo表 格式指定月份 大于等于10 ”10月“ 小于10 补0 ”08月“ public static String formatMonth(int month){ return month >= 10 ? month +"" : "0"+month; } 得到今年某月 String timeStr = DateUtil.getCurrentYear()+"-"+DateUtil.formatMonth(month)+"%"; //返回当前系统的年 public static int getCurrentYear(){ Calendar c = Calendar.getInstance(); return c.get(Calendar.YEAR); } 如果返回值不为空,打印信息;如果为空,提示“不存在此号码此月的记录” 输出到文件 将打印的信息拼接到StringBuffer上,创建文件夹,创建文件名为“卡号 月份的消费记录”的文件,用字符输出流打印,每次调用方法,都是覆盖文件原有内容写入。 |
二级菜单 | 套餐变更 | 可变更为其他套餐类型,变更后话费余额需减去变更后的套餐费用,余额不足时需要给出信息提示,套餐变更后重新统计卡中实际消费数据以及当月消费金额 查找套餐类型表,显示所有套餐名称,用户进行选择,输入序号,通过序号-1得到套餐id,通过套餐id查找套餐表的资费,判断用户选择的套餐是否是目前的套餐。如果是,提示”无需更改“;如果不是,判断用户money是否大于等于套餐资费。如果不够,提示”请充值“;如果够,修改表: 修改mobileCard 的ser_package、修改money = money-资费 UPDATE tb_mobile_card set ser_package = ?, money = ? where card_number = ? |
二级菜单 | 办理退网 | 输入正确的卡号和密码后,可以从已注册的号码列表中删除本号码,并退出系统 修改card表中的status,在mobile卡中删除。或修改mobile卡的状态为禁用 DELETE FROM tb_mobile_card where card_number = ? 添加退网记录表 定时器(待开发) |
写代码的规范
命名规范:数据库列名:单词与单词直接 _ ; 数据库表名:tb_user ;对象属性名:小驼峰
分层 业务逻辑梳理 要有注释
pojo的对象的属性类型必须为包装类 如 Integer
写方法时注意空指针问题 用if或抛异常处理
sql语句避免出现*
相同的代码学会写工具类 使用工具类的增删改查方法 如何实现表连接
设置全局变量可减少代码重复参数 如mobileCard
Date源码:
public Date() {
this(System.currentTimeMillis());
}
如果仅仅是需要毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date()
自增
alter table question_info auto_increment = 1; # 自增从删除后的列的最大值后