1、专业课程设计 II 报告( 2015 / 2016 学年 第 一 学期)题目: 模拟电信计费管理系统 专 业 计算机科学与技术 学 生 姓 名 章慧 班 级 学 号 B12040310 指 导 教 师 黄 睿 指 导 单 位 计算机科学与技术系 日 期 2016.1.4 - 2016.1.14 指导教师成绩评定表学生姓名 章慧 班级学号 B12040310 专业 计算机科学与技术评分内容 评分标准 优秀 良好 中等 差平时成绩 认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事设计的科学、合理性功能丰富、符合题目要求 界面友好、外观漂亮、大方程序功能执行的正确性设计成果程序算
2、法执行的效能设计报告正确合理、反映系统设计流程文档内容详实程度设计报告文档格式规范、排版美观验收答辩简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。评分等级指导教师简短评语该同学出勤率(满勤、较高、一般,较低 ),学习态度(端正、较端正、一般、较差),演示程序( 未) 达到了( 基本要求、提高要求 1 或/和 2),撰写报告格式(规范、一般) 、表述(清晰、一般、不清楚),圆满( 较好、基本) 完成了课题任务。( 可选:尚存在缺陷。)指导教师签名 日期 2016-1-14备注 评分等级有五种:优秀、良好、中等、及格、不及格模拟电信计费管理系统一、 课题内容和要求完成模拟电信计费
3、管理信息系统,基本功能包括:1、入库功能。从本地选取原始话单文件(text 格式) ,并将话单文件中数据输入话单数据库(表) 。2、计费功能。根据 1 功能存放在话单数据库中的通话记录和数据库中已建好的长途费率表对每一条通话记录计算其通话费用,并将结果保存在已完成话单划价的费用表中。3、话费查询。输入一个电话号码,从费用表中统计该电话号码的所有本地话费、长途话费,并从用户表中查找其用户名,最后在屏幕上显示。4、话单查询。输入一个电话号码,从费用表中查询所有的通话记录并在屏幕显示该用户的所有通话记录。5、数据管理功能。系统能对相关数据进行增、删、改功能。6、操作权限管理。用户必须通过登录和权限审
4、核才能操作上述相应功能。二、需求和思路分析1、建立数据库 telecom(借助于 HeidiSQL 工具),分别建立课题对应用到的数据库表通话记录表 callrecord,长途费率表 cost,费用表 fee,用户电话表 phone,登录操作表 operater。2、入库功能,通过 html 中标签让用户自行选择本地存放话单文件目录,后端通过对文件内容的解析组装成callrecord 对象,通过 sql 中 insert 语法插入到数据库 callrecord 表中。3、计费功能,为保证数据库中每条通话记录的通话费用不重复,故计费功能与入库功能是同步进行的,及将 2 功能中解析组装成的对象直接
5、与从 cost费率表中取得的费率根据 calltype 属性进行配对相乘放入 fee 费用表中。4、话费查询,后端获得前端输入的电话号码数据,通过 sql 中 select语句在 fee 表中根据 calltype 进行长途及本地话费统计,并通过 out.print()输出在屏幕上。同样,根据获得的电话号码数据通过 sql 中 select 语句在phone 表中查出用户名并显示。5、话单查询,与 4 功能相似,后端获得前端输入的电话号码数据后,通过 sql 中 select 语句在 callrecord 表查出其所有的通话记录并进行展示。6、数据管理功能,本课设中我以 phone 表中数据为
6、例进行了增删改操作,前端接收用户输入的电话及用户名(可为空),并设有四个按钮查询,增加,删除,修改,用户可根据电话或用户名查询已有数据,若无可增加,或对数据进行修改,或对数据进行删除。后端通过 sql 中 insert,delete,update 来对前端接收到的数据进行增删改。7、操作权限管理,本课设中,权限部分我是采用的 session 做的,数据库表 operater 中增加了一个属性为 priority,每个操作者默认都可以进行查询功能,模仿 linux 系统权限处理的方式,我为 priority 属性设置了 3 个字符,对应增删改三个字段,具备该功能则相应位置 1,不具备该权限则相应
7、位置0(例:111 代表该操作者同时具备查询增删改功能,000 代表该操作者只具备查询功能),在登录时便将该操作者对象放入 session 中,而在后台请求增删改时,则从 session 中取出该对象,并对该对象的权限属性进行字符串解析,并判断其所具备的权限,根据权限进行相应操作。三、概要设计 1、建立数据库a、通话记录表 callrecord名称 数据类型 注释 约束recordid int 通话记录号 主键phoneno varchar(11) 电话号码calltype int 0:本地 1:长途duration int 通话时长表 1、通话记录表 b、长途费率表 cost名称 数据类型
8、注释 约束calltype int 类型 主键price int 费率表 2、长途费率表 c、费用表 fee名称 数据类型 注释 约束phoneid int 费用号 主键phoneno varchar 电话号码phonetype int 通话类型price int 价格表 3、费用表 d、操作员工表 operater名称 数据类型 注释 约束operatername varchar 操作员工名 主键password varchar 密码priority varchar(3) 权限表 4、操作员工表 e、用户表 phone名称 数据类型 注释 约束phoneno varchar 电话号码 主键u
9、sername varchar 用户名表 5、用户表2、入库流程图开始选择本地存放话单文件目录获得文件流存入B u f f e r e d R e ad e r 中读取文件流的一行是否为空“ , ” 分割字符串并组装成 c a l l r e c o r d 对象 , 加入 c a l l L i s t 同时将对象插入到数据库表 c a l l l r e c o r d 中N o取出 c a l l L i s t 进行计费功能Y e s图 1、入库流程图3、计费流程图开始从数据库表 c o s t 中取出长途费率信息放入 c o s t L i s t 中取出 c a l l L i s
10、 tc a l l L i s t ( i n d e x ) 是否存在f o r 循环 c o s t L i s t 费率集合 , 直至匹配到相同的 c a l l T y p e , 将c a l l L i s t ( i n d e x ) 中的通话时长与 c o s t L i s t中对应的费率相乘 ,并组装成对象 f e e ,同时插入到数据库表 f e e 中Y e s结束N o图 2、计费流程图4、话费查询流程图开始用户输入电话号码根据电话号码从数据库表 f e e 中查出所有的费用信息并放入 f e e L i s t 中f e e L i s t ( i n d e x
11、 ) 是否存在判断f e e L i s t ( i n d e x ) 中c a l l t y p e 属性 , 为0 则叠加到l o c a l F e e N u m , 为 1则叠加到l o n g F e e N u m 。Y e s数据库存储时均以角为单位 , 故展示时需要进行元的换算后展示到页面N o图 3、话费查询流程图5、话单查询话单查询较话费查询更为简单,在此不做流程图说明,简要文字说明。用户在页面输入手机号码,后端接收数据后以此为条件在数据库表 callrecord中查询出信息,并用 for 循环进行展示即可。6、数据管理,操作权限流程图开始用户输入手机号和用户名根据条
12、件在数据库表 p h o n e 中联合查询出结果并进行展示将获得的手机号和用户名组装成p h o n e 对象并插入到数据库表 p h o n e中从 s e s s i o n 中取出o p e r a t e r 对象 , 并从对象中取出 p r i o r i t y属性 s t rS t r . c h a r A t ( 0 ) 是否等于 1从 s e s s i o n 中取出o p e r a t e r 对象 , 并从对象中取出 p r i o r i t y属性 s t rS t r . c h a r A t ( 1 ) 是否等于 1将获得的手机号和用户名组装成p h o
13、 n e 对象并从数据库表 p h o n e 中删除该行记录从 s e s s i o n 中取出o p e r a t e r 对象 , 并从对象中取出 p r i o r i t y属性 s t rS t r . c h a r A t ( 2 ) 是否等于 1将获得的手机号和用户名组装成p h o n e 对象并从数据库表 p h o n e 中更改该行记录查询增加删除修改Y e sY e s Y e s不具备该权限N oN oN o图 4、数据管理流程图四、详细设计 1、入库功能Service:public void importFile(String fileName) Syste
14、m.out.println(“开始入库“);List list = new ArrayList();File file = new File(fileName);try /读入文件流FileReader fileReader = new FileReader(file);BufferedReader br = new BufferedReader(fileReader);String str;/循环获取文件内容每一行while (str = br.readLine() != null) /对每行字符串进行分割组成对象String strArray = str.split(“,“);CallRe
15、cord callRecord = new CallRecord();callRecord.setPhoneno(strArray0);callRecord.setCalltype(Integer.parseInt(strArray1);callRecord.setDuration(Integer.parseInt(strArray2);list.add(callRecord);entityDao.save(callRecord);countFee(list);br.close(); catch (IOException e) / TODO Auto-generated catch block
16、e.printStackTrace();Controller:RequestMapping(value = “/enterDb“,method = RequestMethod.GET)public void uploadfile(RequestParam(“fileName“) String fileName)System.out.println(“文件名“+fileName);uploadService.importFile(fileName);uploadFile.jsp:请选择导入文件返回主页面function bin()var xmlhttp=new XMLHttpRequest();
17、var fileName=document.getElementById(“fileName“).value;xmlhttp.open(“GET“,“enterDb?fileName=“+fileName+“xmlhttp.send(); 2、计费功能Service:public void countFee(List callList)System.out.println(“开始计费“);List costList = entityDao.createQuery(“from com.dianxinfee.entity.Cost“);Fee fee = new Fee();for(CallRec
18、ord callRecord:callList)for(Object obj : costList)/通话类型匹配后进行计算并组装对象后入库Cost cost = (Cost)obj;if(callRecord.getCalltype() = cost.getCalltype()fee.setPhoneno(callRecord.getPhoneno();fee.setPrice(callRecord.getDuration()*cost.getPrice();fee.setPhoneType(callRecord.getCalltype();entityDao.save(fee);break
19、;Controller:RequestMapping(value=“/feequery“)public void feeQuery(RequestParam(“phoneNo“) String phoneNo,HttpServletResponse response) throws IOExceptionresponse.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型System.out.println(“电话号码为“+phoneNo);List objL
20、ist=feeService.phoneQuery(phoneNo);String userName = feeService.userQuery(phoneNo);PrintWriter out = response.getWriter();double localFee = objList.get(0)/10+objList.get(0)%10*0.1;double longFee = objList.get(1)/10+objList.get(1)%10*0.1;out.print(userName+“客户你好!“);out.print(“本地话费:“+localFee+“);out.p
21、rint(“长途话费:“+longFee);out.print(“合计话费:“+(localFee+longFee);3、话费查询Service:public List phoneQuery(String phoneNo)List objList=entityDao.createQuery(“from com.dianxinfee.entity.Fee where phoneNo=“+phoneNo+“);int localFeeNum = 0;int longFeeNum = 0;for(Object obj : objList)/对查询出的话费list对通话类型进行匹配并叠加Fee fee
22、=(Fee)obj;if(fee.getPhoneType()=0)localFeeNum+=fee.getPrice();if(fee.getPhoneType()=1)longFeeNum+=fee.getPrice();List feeList=new ArrayList();feeList.add(localFeeNum);feeList.add(longFeeNum);return feeList;Controller:RequestMapping(value=“/feequery“)public void feeQuery(RequestParam(“phoneNo“) Strin
23、g phoneNo,HttpServletResponse response) throws IOExceptionresponse.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型System.out.println(“电话号码为“+phoneNo);List objList=feeService.phoneQuery(phoneNo);String userName = feeService.userQuery(phoneNo);PrintWriter
24、out = response.getWriter();double localFee = objList.get(0)/10+objList.get(0)%10*0.1;double longFee = objList.get(1)/10+objList.get(1)%10*0.1;out.print(userName+“客户你好!“);out.print(“本地话费:“+localFee+“);out.print(“长途话费:“+longFee);out.print(“合计话费:“+(localFee+longFee);4、话单查询Service:public List recordQuer
25、y(String phoneNo)List recordList = entityDao.createQuery(“from com.dianxinfee.entity.CallRecord where phoneNo=“+phoneNo+“);return recordList;Controller:RequestMapping(value=“/recordquery“)public void recordQuery(RequestParam(“phoneNo“) String phoneNo,HttpServletResponse response) throws IOExceptionr
26、esponse.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型System.out.println(“电话号码为“+phoneNo);List objList=feeService.recordQuery(phoneNo);String userName = feeService.userQuery(phoneNo);PrintWriter out = response.getWriter();out.print(userName+“客户你好!“);for
27、(Object obj : objList)CallRecord callRecord = (CallRecord)obj;if(callRecord.getCalltype()=0)out.print(“本地:“+callRecord.getDuration()+“分钟“);if(callRecord.getCalltype()=1)out.print(“长途:“+callRecord.getDuration()+“分钟“);话费话单查询在同一个页面fee.jsp:Fee.jsp:返回主页面请输入手机号function fee()var xmlhttp=new XMLHttpRequest(
28、);var phoneNo=document.getElementById(“phoneNo“).value;xmlhttp.open(“GET“,“feequery?phoneNo=“+phoneNo+“xmlhttp.send();xmlhttp.onreadystatechange=function() if(xmlhttp.readyState=4 function record()var xmlhttp=new XMLHttpRequest();var phoneNo=document.getElementById(“phoneNo“).value;xmlhttp.open(“GET
29、“,“recordquery?phoneNo=“+phoneNo+“xmlhttp.send();xmlhttp.onreadystatechange=function() if(xmlhttp.readyState=4 5、数据管理操作权限登录时service:public Operater operaterQuery(Operater operater) List opeList = entityDao.createQuery(“from com.dianxinfee.entity.Operater where operaterName=“+ operater.getOperaterNam
30、e() + “ and password=“ + operater.getPassword() + “);if (opeList.size() = 0) return null; else return (Operater) opeList.get(0);Controller:RequestMapping(value = “/home“,method = RequestMethod.POST)public String userMainPage(Operater operater,HttpServletRequest request)HttpSession session=request.ge
31、tSession();System.out.println(operater.getOperaterName();Operater opera = loginService.operaterQuery(operater);if(opera = null)return “login“;session.setAttribute(“opera“, opera);return “home“;查询时service:public List queryPhone(String phoneNo,String userName)String sql = “from com.dianxinfee.entity.P
32、hone where 1=1“;if(phoneNo!=“)sql+=“and phoneNo=“+phoneNo+“;if(userName!=“)sql+=“and userName=“+userName+“;List objList=entityDao.createQuery(sql);return objList;Controller:RequestMapping(value=“userQuery“,method = RequestMethod.GET)public void queryUser(RequestParam(“phoneNo“) String phoneNo,Reques
33、tParam(“userName“) String userName,HttpServletResponse response) throws IOExceptionresponse.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型String name = URLDecoder.decode(userName,“utf-8“);System.out.println(“用户名“+ name);PrintWriter out = response.getWri
34、ter();List objList = userService.queryPhone(phoneNo, name);for(Object obj:objList)Phone phone = (Phone)obj;out.print(phone.getPhoneno()+“if(objList.size()=0)out.print(“无查询结果“);增加时service:public void addPhone(String phoneNo,String userName)Phone phone=new Phone();phone.setPhoneno(phoneNo);phone.setUs
35、ername(userName);entityDao.save(phone);Controller:RequestMapping(value=“userAdd“,method = RequestMethod.GET)public void addUser(RequestParam(“phoneNo“) String phoneNo,RequestParam(“userName“) String userName,HttpServletResponse response,HttpServletRequest request) throws IOExceptionHttpSession sessi
36、on=request.getSession();Operater opera = (Operater)session.getAttribute(“opera“);String name = URLDecoder.decode(userName,“utf-8“);System.out.println(“用户名“+ name);response.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型PrintWriter out = response.getWrite
37、r();if(opera.getPriority().charAt(0)=0)out.print(“您没有插入权限,请尝试其他操作“);elseuserService.addPhone(phoneNo, name);out.print(“增加一条信息“);删除时service:public void deletePhone(String phoneNo,String userName)Phone phone=new Phone();phone.setPhoneno(phoneNo);phone.setUsername(userName);entityDao.delete(phone);Cont
38、roller:RequestMapping(value=“userDelete“,method = RequestMethod.GET)public void deleteUser(RequestParam(“phoneNo“) String phoneNo,RequestParam(“userName“) String userName,HttpServletResponse response,HttpServletRequest request) throws IOExceptionHttpSession session=request.getSession();Operater oper
39、a = (Operater)session.getAttribute(“opera“);String name = URLDecoder.decode(userName,“utf-8“);System.out.println(“用户名“+ name);response.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型PrintWriter out = response.getWriter();if(opera.getPriority().charAt(1)=
40、0)out.print(“您没有删除权限,请尝试其他操作“);elseuserService.deletePhone(phoneNo, name);out.print(“删除一条信息“);修改时service:public void updatePhone(String phoneNo,String userName)Phone phone=new Phone();phone.setPhoneno(phoneNo);phone.setUsername(userName);entityDao.update(phone);Controller:RequestMapping(value=“userU
41、pdate“,method = RequestMethod.GET)public void updateUser(RequestParam(“phoneNo“) String phoneNo,RequestParam(“userName“) String userName,HttpServletResponse response,HttpServletRequest request) throws IOExceptionHttpSession session=request.getSession();Operater opera = (Operater)session.getAttribute
42、(“opera“);System.out.println(“用户“+opera);String name = URLDecoder.decode(userName,“utf-8“);System.out.println(“用户名“+ name);response.setCharacterEncoding(“UTF-8“);response.setContentType(“text/html;charset=UTF-8“);/ 标明消息体是什么类型PrintWriter out = response.getWriter();System.out.println(“用户权限“+opera.getP
43、riority();if(opera.getPriority().charAt(2)=0)out.print(“您没有更改权限,请尝试其他操作“);elseuserService.updatePhone(phoneNo, name);out.print(“更新一条信息“);数据管理页面User.jsp:请输入手机号请输入姓名function query()var xmlhttp=new XMLHttpRequest();var phoneNo=document.getElementById(“phoneNo“).value;var userName=document.getElementByI
44、d(“userName“).value;xmlhttp.open(“GET“,encodeURI(encodeURI(“userQuery?phoneNo=“+phoneNo+“xmlhttp.send();xmlhttp.onreadystatechange=function() if(xmlhttp.readyState=4 function add()var xmlhttp=new XMLHttpRequest();var phoneNo=document.getElementById(“phoneNo“).value;var userName=document.getElementBy
45、Id(“userName“).value;xmlhttp.open(“GET“,encodeURI(encodeURI(“userAdd?phoneNo=“+phoneNo+“xmlhttp.send();xmlhttp.onreadystatechange=function() if(xmlhttp.readyState=4 function remove()var xmlhttp=new XMLHttpRequest();var phoneNo=document.getElementById(“phoneNo“).value;var userName=document.getElement
46、ById(“userName“).value;xmlhttp.open(“GET“,encodeURI(encodeURI(“userDelete?phoneNo=“+phoneNo+“xmlhttp.send();xmlhttp.onreadystatechange=function() if(xmlhttp.readyState=4 function updat()var xmlhttp=new XMLHttpRequest();var phoneNo=document.getElementById(“phoneNo“).value;var userName=document.getEle
47、mentById(“userName“).value;xmlhttp.open(“GET“,encodeURI(encodeURI(“userUpdate?phoneNo=“+phoneNo+“xmlhttp.send();xmlhttp.onreadystatechange=function() if(xmlhttp.readyState=4 为乱码问题设置拦截器部分代码:WebFilter(“/*“)public class Encoding implements Filter /* Default constructor. */public Encoding() / TODO Auto-
48、generated constructor stub/* see Filter#destroy()*/public void destroy() / TODO Auto-generated method stub/* see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletExcepti
49、on / TODO Auto-generated method stub/ place your code hererequest.setCharacterEncoding(“UTF-8“);/ pass the request along the filter chainchain.doFilter(request, response);/* see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException / TODO Auto-generated method stub