分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019

资源列表

  • 基于JSP实现的在线投票系统

    一、设计方案1.1 投票系统的功能组成投票系统功能有:选择投票和个人操作及设置,投票设置,投票结果分析,投票操作保障。
    1.1.1 选择投票和个人操作及设置
    列出所有正在进行的投票活动的简略信息,供投票人选择:(也应可查看已有结果的投票活动情况)列出信息有:投票活动的名称、发起人、投票人数、投票时间等
    点击选择某投票活动后,列出该次投票活动的详细内容介绍,可选择进入投票
    进行投票操作:要先输入验证信息(如系统自动检测该机IP地址是否合法,检测投票人是否合法,检测验证码是否合法等),如无错误才可以进行投票,按投票规则填写投票提交表,提交完成投票
    设置及记录服务器地址:即让客户端机器能顺利连接到服务器端,并且该客户端IP地址合法等
    个人资料管理:是投票人的个人资料登记、密码设置等,可参考论坛式的注册、登陆、管理模式

    1.1.2 投票设置
    设置候选人资料:

    填写个人信息(包括姓名、性别、年龄、民族、出生年月日、政治面貌、家庭住址、联系方式等……)编码:由系统自动生成,投票前后需一致推荐意见:事迹介绍、或者是个人介绍等
    设置投票时间:设置该次投票的开始及结束时间,投票人只能在投票有效期间投票
    设置投票类型、投票规则:如该次投票是单选、还是多选、(选多少人)、还是评分制(最低分、最高分多少)、是否可投弃权票、是否可投反对票、多选最终选出多少人、评分制最终选出多少人等
    设置合法投票者:设置投票机器的IP、投票人的名单等

    1.1.3 投票结果分析
    排名结果:单选的结果、多选的结果(按得票数排列,胜出人显著显示)、评分制结果(按分数排列,胜出人显著显示)
    投票的统计信息:(需要做到实时变化以及最终结果显示)包括投票的剩余时间、投票的人数情况等

    1.1.4 投票操作保障
    IP验证:验证投票人的机器IP地址是否合法
    时间验证:投票时间的控制,时间到即结束该次投票活动(对局域网,可不用考虑延时问题; 但如果是基于internet的投票,要考虑: 即客户端投票时,还在有效投票时间内,但数据传到服务器端, 已经过了有效投票时间, 这时应该如何计算? 如果要使得系统设计得更合理, 希望能实现按投票当时的时间,而不是按数据到达时间, 又要防止客户端在时间上欺骗, 应该如何设计?)
    投票人验证:投票人是本系统用户,但要验证其是否享有对某次投票活动的投票权利,并且验证其帐号、密码的正确性,不可多次投票
    投票对象验证:所投的人是否存在于候选人列表中,或是否符合本次投票活动规则(因为某些投票活动可另填自己认为可以的候选人),如不符合是否当弃权处理
    验证码验证:防止利用软件连续投票,或自动投票

    1.2 投票系统的界面组成投票系统前台界面

    投票系统后台界面

    1.3 投票系统的算法、数据结构1.3.1 投票系统前端前端主要用到了盒子模型,使用到的数据结构主要是数组,集合来用于存储从数据库查询到的投票列表以及候选人信息。
    1.3.2 投票系统后台后台使用到的算法主要是查找算法,例如从数组或集合中查找到该用户,或者查找到用户点击的投票选项。数据结构使用了Map,ArrayList来存储提示信息和用户session。
    二、开发过程2.1 投票系统的设计2.1.1 数据库设计根据实验要求,抽取出四个数据库表,分别是用户表(user),投票活动表(item),候选人信息表(item_options),投票结果表(result)。其中投票活动表和候选人表是一对多关系,投票活动表和投票结果表也是一对多关系,用户表和投票活动表是一对一关系。四个表的ER图如下所示:

    2.1.2 系统架构设计本投票系统使用MVC架构,使用JSP+HTML+JQuery+CSS作为视图层,Servlet作为控制器,JDBC+MySQL作为数据模型层。架构图如下:

    2.1.3 页面设计使用盒子模型,分为上中下三个盒子,其中数据显示主要在中间区域。设计如下:

    2.2 投票系统的实现2.2.1 实现技术利用Java语言,使用JavaWeb技术体系中的:JSP+Servlet+JDBC+MySQL技术,来开发一个web端的投票系统。
    2.2.2 数据访问层实现(请看db包和dao包下的所有文件。这里只贴DB.java)public class DB { public static final String DB_DRIVER = "com.mysql.jdbc.Driver"; public static final String DB_URL = "jdbc:mysql://127.0.0.1:3306/db_vote?characterEncoding=utf-8"; public static final String USER = "root"; public static final String PWD = "123456"; private Connection con = null; private Statement stmt = null; private PreparedStatement pstmt = null; public DB() { createConnection(); try { stmt = con.createStatement(); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } } public DB(String preparedSql) { createConnection(); try { pstmt = con.prepareStatement(preparedSql,Statement.RETURN_GENERATED_KEYS); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } } private void createConnection() { try { Class.forName(DB_DRIVER); con = DriverManager.getConnection(DB_URL, USER, PWD); } catch (ClassNotFoundException ex) { System.err.println("Error: 类不存在!" + ex.getMessage()); } catch (SQLException ex) { System.err.println("Error: 连接数据库失败!" + ex.getMessage()); } } public ResultSet select(String sql) { ResultSet rs = null; try { rs = stmt.executeQuery(sql); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } return rs; } //preparedStatement的查询方法 public ResultSet select() { ResultSet rs = null; try { rs = pstmt.executeQuery(); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } return rs; } public int update(String sql) { int result = 0; try { result = stmt.executeUpdate(sql); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } return result; } //preparedStatement的更新 public int update() { int result = 0; try { result = pstmt.executeUpdate(); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } return result; } public int getInsertId(){ int autoInckey = -1; ResultSet rs = null; // 获取结果 try { rs = pstmt.getGeneratedKeys(); if (rs.next()){ autoInckey = rs.getInt(1); } } catch (SQLException e) { e.printStackTrace(); } return autoInckey; } //以下方法为使用动态SQL语句方式时,设置prestmt的参数的方法 //其他类型的参数对应的方法,请自行补充 public void setString(int index, String value) { try { pstmt.setString(index, value); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } } public void setInt(int index, int value) { try { pstmt.setInt(index, value); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } } public void setLong(int index, long value) { try { pstmt.setLong(index, value); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } } public void setDouble(int index, double value) { try { pstmt.setDouble(index, value); } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } } public void close() { try { if (stmt != null) { stmt.close(); } if (pstmt != null) { pstmt.close(); } if (con != null) { con.close(); } } catch (SQLException ex) { System.err.println("Error: " + ex.getMessage()); } }}
    2.2.3 业务逻辑层实现(请看service包下的所有(14个)文件。这里只贴首页的控制器代 码IndexServlet.java以及点击投票的代码IndexVoteIdServlet.java)IndexServlet.java
    @WebServlet({"/index","/index/vote/list","/index/vote/search"})public class IndexServlet extends HttpServlet { private static final long serialVersionUID = 7209195686057464382L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //由于get传递参数要乱码,所以弄成post,这个问题之后在解决 //System.out.println("搜索投票"); request.setCharacterEncoding("UTF-8"); ItemDao itemDao = new ItemDao(); String path = request.getRequestURI(); List itemList; if (path.indexOf("/search") > -1){ String content = request.getParameter("content").trim(); itemList = itemDao.getSearchItemList(content); request.setAttribute("itemList",itemList); request.setAttribute("active",2); request.getRequestDispatcher("/WEB-INF/view/vote.jsp").forward(request,response); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); request.setCharacterEncoding("UTF-8"); ItemDao itemDao = new ItemDao(); String path = request.getRequestURI(); List itemList; if (path.indexOf("vote/list") > -1){ session.setAttribute("active",2); itemList = itemDao.getAllItemList(); request.setAttribute("itemList",itemList); request.getRequestDispatcher("/WEB-INF/view/vote.jsp").forward(request,response); }else { session.setAttribute("active",1); itemList = itemDao.getLimitItemList(5);//获取最新五条 request.setAttribute("itemList",itemList); request.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(request,response); } }}
    IndexVoteIdServlet.java
    @WebServlet(name = "IndexVoteIdServlet",urlPatterns = "/index/vote")public class IndexVoteIdServlet extends HttpServlet { private static final long serialVersionUID = -6818273018879095397L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); int id = Integer.parseInt(request.getParameter("id")); String[] selectIds = request.getParameterValues("answer"); String ip = this.getRemortIP(request); ResultDao resultDao = new ResultDao(); User user = (User)session.getAttribute("user"); int success = resultDao.add(user.getId(),id,selectIds,ip); if (success > 0){ session.setAttribute("msg","投票成功"); response.sendRedirect(request.getContextPath() + "/index/vote/list"); }else{ session.setAttribute("msg","投票失败,请不要用同一ip投票"); response.sendRedirect(request.getContextPath() + "/index/vote?id=" + id); } } @SuppressWarnings("rawtypes") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("active",2); int id = Integer.parseInt(request.getParameter("id")); ItemDao itemDao = new ItemDao(); OptionDao optionDao = new OptionDao(); Item item = itemDao.getItemById(id); if (itemDao.getVoteStatus(item.getStartTime(),item.getStopTime()) != 2){ //判断是否可以投票,即投票是否结束,防攻击 response.sendRedirect(request.getContextPath() + "/index/vote/list"); return; } List optionList = optionDao.getOptionList(item.getId(),item.getAllVoteCount()); request.setAttribute("item",item); request.setAttribute("optionList",optionList); String isWaiver="不可以弃权"; String isOppose="不可以投反对票"; System.out.println(item.getIsWaiver()); System.out.println(item.getIsOppose()); if( "1".equals(item.getIsWaiver()) ){ isWaiver="可以弃权"; } if( "1".equals(item.getIsOppose()) ){ isOppose="可以投反对票"; } if( "1".equals(item.getType()) ) { request.setAttribute("type","(单选,"+isWaiver+","+isOppose+")"); }else if( "2".equals(item.getType()) ){ request.setAttribute("type","(多选,可选人数:"+item.getNumber()+","+isWaiver+","+isOppose+")"); }else { request.setAttribute("type","(评分制,可选人数:"+item.getNumber()+","+isWaiver+","+isOppose+")"); } request.getRequestDispatcher("/WEB-INF/view/info.jsp").forward(request,response); } /*获取用户的ip,防止多次投票*/ private String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); }}
    2.2.4 表现层实现(请查看../WebContent/WEB-INF/view下的所有(14个)文件,这里只贴添 加投票的页面代码:addvote.jsp)<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@include file="head.jsp"%><div class="container-wrap"> <footer> <div class="row copyright" > <div class="col-md-12 text-center"> <big>新增投票</big> </div> </div> </footer></div><!-- END container-wrap --><div class="container-wrap"> <div id="fh5co-contact"> <div class="row"> <div class="col-md-2 col-md-push-1 animate-box"> </div> <div class="col-md-6 col-md-push-1 animate-box"> <form action="${pageContext.request.contextPath}/admin/vote/add" method="post" id="vote_add_form"> <div class="row"> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">主题</label> <div class="col-sm-9"> <input type="text" name="theme" class="form-control" placeholder=""> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">发起人</label> <div class="col-sm-9"> <input type="text" class="form-control" value="${user.realName}" placeholder="" disabled> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">发起时间</label> <div class="col-sm-9"> <input type="text" name="start_time" class="form-control" placeholder="如2018-10-30 15:07:02"> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">结束时间</label> <div class="col-sm-9"> <input type="text" name="stop_time" class="form-control" placeholder="如2018-10-30 15:07:02"> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">投票类型</label> <div class="col-sm-9"> <select name="type" id="" class="form-control"> <option value="1">单选</option> <option value="2">多选</option> <option value="3">评分制</option> </select> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">投票规则</label> <div class="col-sm-9"> <select name="is_waiver" class="form-control"> <option value ="0" selected="selected">不能弃权</option> <option value ="1">可以弃权</option> </select> <select name="is_oppose" class="form-control"> <option value ="0" selected="selected">不能反对</option> <option value ="1">可以反对</option> </select> <input type="text" name="number" class="form-control" placeholder="多选或评分制的可选人数"> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-3 control-label">候选人名单</label> <div class="col-sm-9"> <textarea rows="5" cols="7" name="option_content" class="form-control" placeholder="候选人名之间用按回车键(换行)隔开,如:
陈铭海
李世民"></textarea> </div> </div> </div> <div class="col-md-12"> <div class="form-group"> <label for="" class="col-sm-4 control-label"></label> <input type="button" id="submit1" name="select" value="提 交" class="btn btn-primary btn-modify"> <a href="${pageContext.request.contextPath}/admin"><input type="button" value="返 回 " class="btn btn-primary btn-modify"></a> </div> </div> </div> </form> </div> </div> </div></div><!-- END container-wrap --><%@include file="foot.jsp"%><script type="text/javascript"> $('#submit1').click(function () { var date = /^(\d{4})-(\d{2})-(\d{2})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})$/; var theme = $('input[name=theme]').val(); var start_time = $('input[name=start_time]').val(); var stop_time = $('input[name=stop_time]').val(); var number = $('input[name=number]').val(); var option_content = $('textarea').val(); var type= $('select[name=type]').val(); if(!theme || (theme.length > 255)){ alert('主题不能为空且长度不能超过255个字符'); return; } if(!start_time){ alert('发起时间不能为空'); return; } if(!date.test(start_time)){ alert('发起时间要符合日期格式'); return; } if(!stop_time){ alert('结束时间不能为空'); return; } if(!date.test(stop_time)){ alert('结束时间要符合日期格式'); return; } if(type !="1" && !number){ alert('多选或评分制类型的投票的可选人数不能为空'); return; } if(!option_content){ alert('选项不能为空'); return; } var start_date = new Date(start_time); var stop_date = new Date(stop_time); if (stop_date.getTime() < start_date.getTime()){ alert('结束时间要比开始时间大'); return; } document.getElementById('vote_add_form').submit(); });</script>
    2.3 投票系统的测试2.3.1 黑盒测试(经过测试,发现功能基本完成)安全机制(防止同一ip重复投票,未登录不能投票,非管理员不能进入后台)

    用户登录成功后,查看所有投票活动

    管理员进入后台

    管理员进入后台后,可以添加投票活动

    给新添投票活动投票

    2.3.2 系统测试经过各个系统软件的集合,测试结果显示本软件暂时没有发现bug。
    三、技术讨论3.1 存在问题
    没有实现评分制的投票类型
    解决方案:由于在数据库设计阶段有预留该字段,因此可以一个输入评分框给用户输入来解决
    没有对用户登录次数进行限制
    解决方案:可以在后台对用户每次登录,在session里添加一次,再用ajax和在后台进行测试
    当访问人数多时,可能会卡
    解决方案:可以使用缓存来缓存所有投票活动,或者或者前几天的投票活动,来加快访问速度

    3.2 改进方向
    可以加上安全机制,例如使用 Spring Security框架来加入安全机制
    可以继续开发手机APP或微信小程序这些手机端应用
    可以使用Redis作为缓存加快访问速度
    4 评论 17 下载 2019-04-17 10:42:57 下载需要14点积分
  • 基于udp socket通信并生成温度曲线

    一、任务概述1.1 编写目的
    熟悉并学会使用C/S编程模式
    采用 Java 语言,了解 Socket 的原理,并熟悉使用 Socket 。并利用套接字 Socket 编写出指定题目的交互信息
    掌握对传输层协议TCP/UDP和客户/服务器数据通信的原理及方式
    进一步理解和领会计算机网络基本结构、计算机网络基础理论、计算机网络编程技术及Java 语言开发方法,把所学的知识运用到具体的程序设计当中去,编写一个接近实际的应用程序并掌握网络编程技术及应用程序分析、设计、编程和调试的整个过程。

    1.2 项目任务和要求采用UDP或者TCP编写一个网络程序,该程序的服务端每隔1秒向客户端发送一个温度值,客户端能够接收该温度值并显示一条动态温度曲线。
    1.3 参考资料1.3.1 DatagramSocket的构造器
    DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的某个端口
    DatagramSocket(int prot):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口
    DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口

    通过上面三个构造器中任意一个构造器即可创建一个DatagramSocket实例,通常在创建服务器时,我们创建指定端口的 DatagramSocket实例——这样保证其他客户端可以将数据发送到该服务器。
    一旦得到了DatagramSocket实例之后,就可以通过如下两个方法来接收和发送数据:

    receive(DatagramPacket p):从该DatagramSocket中接收数据报
    send(DatagramPacket p):以该DatagramSocket对象向外发送数据报

    1.3.2 DatagramPacket的构造器:
    DatagramPacket(byte buf[],int length):以一个空数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据
    DatagramPacket(byte buf[], int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket时还指定了IP地址和端口——这就决定了 该数据报的目的
    DatagramPacket(byte[] buf, int offset, int length):以一个空数组来创建DatagramPacket对象,并指定接收到的数据放入buf数组中时从offset开始,最多放length个字节
    DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):创建一个用于发送的DatagramPacket对象,也多指定了一个offset参数

    在接收数据前,应该采用上面的第一个或第三个构造器生成一个DatagramPacket对象,给出接收数据的字节数组及其长度。然后调用 DatagramSocket 的方法receive()等待数据报的到来,receive()将一直等待(也就是说会阻塞调用该方法的线程),直到收到一个数据报为止。
    二、开发环境
    操作系统:window 10
    开发环境:IDEA

    三、项目需求分析3.1 项目需求
    学会使用C/S模式编写一个网络程序,实现一个温度折线图
    了解并学会使用Java套接字,即DatagramSocket和DatagramPacket。并且还要了解DatagramSocket和DatagramPacket的应用场景
    温度折线图是动态的,实时的。即在服务器端产生的数据要不断地发送给客户端,而客户端也要不断的接收服务器端发送过来的数据
    利用JFreeChart是JAVA平台上的一个开放的图表绘制类库。可生成时序图(time series)

    四、项目设计4.1 总体思路
    采用C/S模式编写一个客户端,一个服务端。服务器端利用DatagramSocket创建套接字并把DatagramPacket创建的数据包利用send()方法发送到客户端
    客户端创建利用DatagramSocket创建套接字并用DatagramPacket创建一个数据包,在利用receive()方法接收数据包
    在客户端利用JFreeChart类提供的方法创建一个时序图。把从服务器端接收到的数据包里的数据转换成对应的温度,插入到时序图中去

    4.2 网络编程三要素4.2.1 IP地址:InetAddress
    获取任意主机:public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象
    端口号:用于标识进程的逻辑地址,不同进程的标识

    物理端口,网卡口逻辑端口,我们指的就是逻辑端口
    每个网络程序都会至少有一个逻辑端口用于标识进程的逻辑地址,不同进程的标识有效端口:0~65535,其中0~1024系统使用或保留端口

    传输协议:UDP

    UDP:将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快

    4.3 Socket
    Socket套接字:网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
    Socket原理机制:通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输

    4.4 UDP传输思路设计
    DatagramSocket与DatagramPacket
    建立发送端,接收端
    建立数据包
    调用Socket的发送接收方法
    关闭Socket
    发送端与接收端是两个独立的运行程序

    UDP传输-发送端思路

    建立udp的socket服务
    将要发送的数据封装成数据包
    通过udp的socket服务,将数据包发送出
    关闭资源

    UDP传输-接收端思路

    建立udp的socket服务
    通过receive方法接收数据
    将收到的数据存储到数据包对象中
    通过数据包对象的功能来完成对接收到数据进行解析.
    可以对资源进行关闭

    4.5 类图
    4.6 时序图的实现private static JFreeChart createChart(String chartContent, String title, String yAxisName) { ////创建时序图对象 timeSeries = new TimeSeries(chartContent); //创建一个绑定在默认时区数据集 TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(timeSeries); //生产时序图(标题,x轴名称,y轴名称,数据集,是否显示图例,是否生成工具,是否显示url链接) JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(title, "时间(秒)", yAxisName, timeseriescollection, true, true, false); ValueAxis valueaxis = jfreechart.getXYPlot().getDomainAxis(); //自动设置数据轴时间范围 valueaxis.setAutoRange(true); valueaxis.setFixedAutoRange(30000D); return jfreechart;}
    五、程序的运行和测试结果
    六、设计中的问题及心得在本次实如何验中,我学会了使用UDP协议的DatagramSocket与DatagramPacket的使用。在本次实验中我不知道如何产生连续的温度,所以我在网站上找到了一盒函数Math.random(),用它生成的各种随机数。我们使用这些数字来生成时间序列图表的温度。但是问题又来了,怎么显示温度折线图,我在网上找了好多人写的东西发现JFreeChart是一个免费的100%Java图表库,使开发人员可以轻松地在他们的应用程序中显示专业质量的图表。所以我用这个来做了折线图。虽然最后实现了温度折线图,但是生成的折线图上没有显示每个温度的度数。
    1 评论 1 下载 2019-09-11 09:28:58 下载需要9点积分
  • 基于php的校园二手信息网站的设计与开发

    摘 要二手信息网站,为二手物品交易提供了网上平台。如今,随着电子商务的不断发展完善,大学校园也需要一个能为学生提供二手物品交易的专用网站,以便发布各种商品信息。
    本设计具有一般电子商务的功能,且体现出校园风格。该系统提供的功能包括注册、查询信息、发布信息、找回密码等。本系统的特点在于应用了PHP技术。它是一种简单的动态脚本语言,具有开放源码、执行速度快的特点。该技术还支持广泛的数据库连接,具有大量的扩展库,安全性能高,易学易用。
    本文首先介绍了该系统的可行性和应用工具,并就系统的需求性和PHP的优势进行了阐述;接着进行系统分析,并设计了本系统所用到的基于MYSQL数据库的数据表结构;然后对该系统各功能模块进行了详细设计;最后,针对系统在代码优化和加密方面的不足做出总结。
    关键词:二手信息;PHP;MySQL;APACHE;MD5;SESSION
    AbstractSecond-hand informationwebsite provides a second-hand goods transactions online platform. Now, withthe continuous development of e-commerce perfect, University campus also needsan able to provide our students with the second-hand goods transactionsdedicated web site, in order to disseminate information of various commodities.
    E-commerce’s generalfunction can find in this design, and reflects the style of the campus.Functions include user registration, information inquiry, disseminateinformation and retrieve passwords in the system. The system has a majorcharacteristic of PHP applications which is a simple dynamic scripting languagethat is open source, faster implementation characteristics. And it supports awide range of database connections, with a lot of extensions, security is alsovery high performance, easy to learn and use.
    This paper introducesthe feasibility of the system and application tools, described the needs of thesystem and the advantages of PHP, then the systems analysis, design and MYSQL-based database system used in the data table structure, Then the functionof the system modules and the detailed design and code is a major achievement.Description and testing of the system encountered a character coding using thedatabase errors; by setting MYSQL and linking coding solve this error. Finally,summarize the system of encryption and code optimization for the shortage.
    Key words: Second-Hand Information;PHP; MySQL; APACHE; MD5; SESSION
    1 引 言1.1 课题的背景随着Internet 爆炸式的发展,中国自加入WTO以来,电子商务在国内也迅速的发展了起来,现在互联网上各种电子商务网站更是迅速的增长。还在校园的我也深受其中的影响,开发一个对在校学生适用的网站,希望能给大家提供方便的服务。
    作为一个大学生,深有体会,从身上的衣服到大家所用的书籍、文具以至各种生活常用品,用上一段时间就会被淘汰,有的同学干脆扔掉,很是浪费还污染了环境。也有的同学想到卖掉,苦于难寻买家,将其卖给收费品的。这样就造成了物不能尽其用。
    为了解决这种资源的浪费,所以开发了校园二手信息网站,借助于低交易成本的Internet。为大家提供一个低成本、快速迅捷的信息发布平台。新系统开发过程中严格按照系统开发步骤进行,在系统调研、分析、设计到系统的实施的全过程中,力求其科学性和合理性。
    1.2 可行性分析可行性分析的任务是从技术上、经济上、社会上、法律上分析需要解决的问题是否存在可行的解。
    1.2.1 技术可行性该系统采用BS模式设计,在高校的校园网上运行。学生可以通过接入校园网的计算机,访问二手信息网站。本系统是一个比较普通的BS模式的信息发布系统,在技术上具有可行性。
    1.2.2 经济可行性现在,计算机的价格已经十分低廉,性能却有了长足的进步。而本系统的开发,为大家节约了大量的资源,为此主要表现有以下几个方面:

    本系统的运行可以代替废物买卖贴示,避免一些不必要的麻烦
    本系统的运行可以节省许多资源
    本系统的运行可以大大的提高废物再利用
    本系统可以使敏感文档更加安全

    所以,本系统在经济上是可行的。
    1.2.3 运行可行性系统为一个小型的信息管理系统,所耗费的资源非常的小,一般的电脑无论是硬件还是软件都能够满足条件,因此,本系统在运行上是可行的。
    1.2.4 法律可行性系统纯为私人设计,在开发过程中没有涉及合同、责任等与法律相抵触的方面。因此,本系统在法律上是可行的。
    2 理论基础知识介绍2.1 PHP技术2.1.1 PHP简介PHP是一种简单的、面向对象的、解释型的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。PHP具有和Java类似的Class关键字。因为不需要虚拟机,以致速度比Java快5倍。PHP正迅速变成一种标准的、多用途的、面向对象的脚本语言。PHP不仅可用来开发Web应用程序,也可以开发普通应用程序。
    PHP是Hypertex tPre-Processor(超文本预处理器)的缩写,它是一种服务器端的HTML脚本编程语言。PHP语法上与C相似,可运行在Apache, Netscape/iPlanet,和Microsoft IIS Web服务器上。PHP作为一种工具,可以让你创建动态的Web页面。应用PHP的网页与常规的HTML页面并无二致,你可以用同样的方式来创建、编辑它们。PHP允许你直接在HTML文件里写入简单的脚本,这一点与JavaScript非常相似。而不同的是,PHP不依赖于浏览器,是服务器端的语言,而JavaScript却是一种客户端的嵌在HTML中的语言。概念上,PHP与Netscape的LiveWirePro产品,Microsoft的ASP以及Sun Microsystem的JSP相似。
    2.1.1.1 PHP的强劲之处在于:PHP是一项最优秀的技术。其它技术,如PERL,Python,VB Script,ASP相对来说,都是陈旧低劣的。即使是Java/JSP,也在PHP之下。其特点如下:

    兼容性:PHP5.0程序可与旧版本兼容
    易学易用:PHP的语法类似C及Per,所以有程序编写经验者很快即可上手
    开放的来源:PHP的原始码及编译后文件可免费下载
    可扩充:使用者可新增模块以扩充PHP引擎之功能
    跨平台:PHP程序可在数种主要作业平台及Web服务器上执行
    支持多种数据库:PHP支持十余钟数据库,且编写存取数据库资料的程序相当容易

    PHP是最好的,因为它面向对象,并且吸收了C/C++/Java/PERL的精华。PHP可以替代PERL,Python,Java,C,C++,AWK,Unix Shell脚本,Visual Basic和其它语言。PHP直接运行,而且是由C写成的。PHP可以运行在Apache,Microsoft IIS等多种Web服务器上。PHP太容易使用了,你可以用它在非常短的时间里,非常迅速的开发出非常复杂的Web。
    PHP最大的优势在于PHP自身完全是由C语言写成的,因此可广泛运行于各种平台之上,如BeOS,UNIX,MS Windows,Apple Macintosh,IBMOS/2以及其它更多的操作系统。而Windows下开发的PHP代码也可以不经过任何改变,就用于UNIX/Linux上。
    2.1.1.2 PHP网页执行流程PHP与传统网页不同,一般的HTML网页在加载时,会直接将网页全部传到使用者的计算机中,然而在使用者的计算机上执行程序,展示内容;PHP则是刚好相反,它主要的用途是在网站服务器端的网页开发,程序员可以通过程序的控制,让网站与访问者交互,进而设计出迷人的动态网页。例如:会员登录、资料认证网页等。如下图:

    2.1.2 PHP安装下载PHP安装程序 http://www.php.net/downloads.php最新版的为PHP5.1 ,Windows的PHP安装分为两种方式,一种是源代码安装方式,一种是EXE安装方式,双击即可安装。本文主要说一下源代码安装过程。
    下载“PHP-5.0.3-Win32.rar”。然后解压缩下载到的 RAR文件到c:\php
    复制 c:\php\php5ts.dll 到 c:\windows\system32。(有时候为了方便,在PHP文件夹中点击搜索*.dll把搜索到的所有文件夹都复制到system32中也可以)复制 c:\php\php.ini-recommended(或者是php.ini-dist)为 c:\windows\php.ini然后打开 c:\windows\php.ini修改如下几个地方:
    如果是在生产服务器上,可以不用修改下面这两行
    error_reporting=E_ALL & ~E_NOTICEdisplay_errors = On(这里是修改PHP的错误提示,OFF为不提示,有些数据库链接非错误信息也会被PHP当做错误信息输出,建议用作Web服务器的关闭!)
    指示 PHP 扩展库所在文件夹。
    extension_dir="c:\php\ext
    以下两个是超时时间:一般是60-120。
    max_execution_time=90 max_input_time=90post_max_size=8M(6-10M最佳)upload_max_filesize=8M(上传附件大小最大)default_socket_timeout=90(端口时间60-120)session.gc_maxlifetime=3600(session默认存活时间,秒)session.save_path="c:\php\sessiondata"(Session的存储目录)extension=php_mysql.dll(支持MySQL数据库)extension=php_gd2.dll(支持生成真彩图片)```php###2.1.3 验证安装用记事本写几行代码:```php<? phpinfo();?>保存为网站根目录下为phpinfo.php文件。然后启动浏览器,访问 http://localhost/phpinfo.php ,如果看到如下画面就证明PHP安装成功了!

    2.2 MySQL 简介MySQL是一个广受Linux社区人们喜爱的半商业的数据库。MySQL是可运行在大多数的Linux平台(i386,Sparc,etc),以及少许非Linux甚至非Unix平台。
    2.2.1 MySQL 简介2.2.1.1 安装可以在MySQL站点上获得大多数主要的软件包格式(RPM、DBE、TGZ、RAR)。RAR格式的安装没有多大麻烦,并且无需初始配置;直接解压缩运行安装文件即可进行安装。MySQL的守护进程(mysqld)消耗很少的内存并在只有在执行真正的查询时才装载到处理器上,这意味着对小型数据库来说,MySQL可以相当轻松地使用而不会对其他系统功能有太大的影响。
    2.2.1.2 数据类型字段支持大量数据类型是件好事。通常的整数、浮点数、字符串和数字均以多种长度表示,并支持变长的BLOB(Binary Large Object)类型。对整数字段由自动增量选项,日期时间字段也能很好的表示。
    2.2.1.3 SQL兼容性它也缺乏一些常用的SQL功能,没有子选择(在查询中的查询)。视图(View)也没了。当然大多数子查询可以用简单的连接子句重写,但有时用两个嵌套的查询思考问题比一个大连接容易。同样,视图仅仅为程序员隐蔽where子句,但这正是程序员们期望的另一种便利。
    2.2.1.4 存储过程和触发器MySQL没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的最大限制。多语句SQL命令必须通过客户方代码来协调,这种情形是借助于相当健全的查询语言和赋予客户端锁定和解锁表的能力,这样才允许的多语句运行。
    2.2.1.5 参考完整性MySQL的主要的缺陷之一是缺乏标准的RI机制;然而,MySQL的创造者也不是对其用户的愿望置若罔闻,并且提供了一些解决办法。其中之一是支持唯一索引。Rule限制的缺乏(在给定字段域上的一种固定的范围限制)通过大量的数据类型来补偿。不简单地提供检查约束(一个字段相对于同一行的另一个字段的之值的限制)、外部关键字和经常与RI相关的“级联删除”功能。有趣的是,当不支持这些功能时,SQL分析器容忍这些语句的句法。这样做目的是易于移植数据库到MySQL中。这是一个很好的尝试,并且它确实未来支持该功能留下方便之门;然而,那些没有仔细阅读文档的人可能误以为这些功能实际上是存在的。
    2.2.1.6 安全性自始至终我对MySQL最大的抱怨是其安全系统,它唯一的缺点是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变。通常的SQL GRANT/REVOKE语句到最近的版本才被支持,但是至少他们现在有了。 MySQL的编写者广泛地记载了其特定的安全性系统,但是它确实需要一条可能是别无它法的学习过程。
    2.2.1.7 备份和恢复、数据导入/导出强制参考一致性的缺乏显著地简化备份和恢复,单靠数据导入/导出就可完美复制这一功能。LOAD DATA INFILE命令给了数据导入很大的灵活性。Select INTO命令实现了数据导出的相等功能。另外,既然MySQL不使用原始的分区,所有的数据库数据能用一个文件系统备份保存。数据库活动能被记载。与通常的数据库日志不同(存储记录变化或在记录映像之前/之后),MySQL记载实际的SQL语句。这允许数据库被恢复到失败前的那一点,但是不允许提交(commit)和回卷(rollback)操作。
    2.2.1.8 连接性MySQL客户库是客户/服务器结构的C语言库,它意味着一个客户能查询驻留在另一台机器的一个数据库。然而MySQL真正的强项处于该库中的语言“包装器(wrapper)”,Perl、Pathon和PHP只是一部分。Apache的Web服务器也有许多模块例如目录存取文件等允许各种各样的Apache配置信息(例如目录存取文件)使用MySQL,应用程序接口简单、一致并且完整。
    2.2.2 数据库引擎MyISAM强调了快速读取操作,这是为什么MySQL受到了Web开发如此青睐的主要原因:在Web开发中所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和Internet平台提供商(InternetPresenceProvider,IPP)只允许使用MyISAM格式。MyISAM存储格式自版本3.23以来是MySQL中的缺省类型,它有下列特点:

    如果操作系统自身允许更大的文件,那么文件比ISAM存储方法的大
    数据以低字节优先的机器独立格式存储。这表示可将表从一种机器拷贝到另一种机器,即使它们的体系结构不同也可以拷贝
    数值索引值占的存储空间较少,因为它们是按高字节优先存储的。索引值在低位字节中变化很快,因此高位字节更容易比较
    AUTO_INCREMENT处理比ISAM的表更好
    减少了几个索引限制。例如,可对含NULL值的列进行索引,还可以对BLOB和TEXT类型的列进行索引

    为了改善表的完整性检查,每个表都具有一个标志,在myisamchk对表进行过检查后,设置该标志。可利用myisamchk-fast跳过对自前次检查以来尚未被修改过表的检查,这样使此管理任务更快。表中还有一个指示表是否正常关闭的标志。如果服务器关闭不正常,或机器崩溃,此标志可用来检测出服务器起动时需要检查的表。
    2.3 Apache简介Apache是世界使用排名第一的Web服务器,它可以运行在几乎所有广泛使用的计算机平台上。
    Apache源于NCSAhttpd服务器。经过多次修改,他成为了世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。
    本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
    Apache服务器拥有以下特性:

    支持最新的HTTP/1.1通信协议
    拥有简单而强有力的基于文件的配置过程
    支持通用网关接口
    支持基于IP和基于域名的虚拟主机
    支持多种方式的HTTP认证
    集成Perl处理模块
    集成代理服务器模块
    支持实时监视服务器状态和定制服务器日志
    支持服务器端包含指令(SSI)
    支持安全Socket层(SSL)
    提供用户会话过程的跟踪
    支持Fast CGI
    通过第三方模块可以支持Java Servlets

    3 系统分析与数据库设计3.1 系统功能需求分析根据一般电子商务系统功能分析,将系统分为管理员、用户两大模块。系统管理员模块包括:系统配置管理、会员信息管理、网站新闻管理、物品信息管理、管理员管理、登录日志管理。用户模块包括:安全登录、找回密码、查询信息、发布信息、会员注册、物品类别、物品信息管理、会员信息修改。刚进入网站的非会员能够在此网站浏览和搜索信息,不仅能浏览二手信息还能浏览到热门信息。经过注册成为会员便能发布信息。此系统还考虑到用户利用穷举法破解密码,专门设置了用户和管理员登录日志,以便及时了解和防范。
    3.2 系统模块关系图根据系统功能需求建立的模块关系图如下图:

    3.3 系统E-R图本实例根据上面的模块关系图规划出的实体有管理员、二手信息机及新闻、用户、会员实体、各实体的E-R图及其关系描述如下(带下划线的为主键):
    会员实体E-R图

    二手信息实体E-R图

    新闻实体E-R图

    管理员实体E-R图

    超级管理远实体E-R图同管理员实体E-R图类似,无权限属性(省略)。
    各实体的关系E-R图描述如下:

    3.4 数据库设计3.4.1 数据库表之间的关系数据库表



    序号
    数据库表
    数据库存储内容




    1
    ershou_adminstage
    存储管理员和会员的登录日志


    2
    ershou_class
    存储二手信息的类别信息


    3
    ershou_pinglun
    存储会员对物品信息的评论


    4
    ershou_news
    存储新闻


    5
    ershou_user
    存储会员的相关信息


    6
    ershou_wupin
    存储以发布的物品信息


    7
    ershou_manager
    存储管理员的信息



    数据表关系图如下:

    3.4.2 数据表结构的详细设计用户资料表(ershou_user)



    序号
    字段名
    字段类别
    说明
    备注




    1
    user_name
    varchar(20)
    用户的账号名称
    主键


    2
    user_pass
    varchar(20)
    用户的帐号密码



    3
    user_question
    varchar(50)
    找回密码提问



    4
    user_angser
    varchar(50)
    找回密码答案



    5
    user_mphone
    varchar(12)
    移动电话



    6
    user_phone
    varchar(12)
    座机



    7
    user_school
    varchar(60)
    所在学校



    8
    user_email
    Varchar(80)
    电子邮箱



    9
    user_date
    datetime
    注册时间



    10
    user_qq
    Int
    QQ号



    11
    user_kt
    Int
    标志
    默认为0



    类别信息表(ershou_class)



    序号
    字段名
    字段类别
    说明
    备注




    1
    class_name
    varchar(20)
    类别名称
    主键


    2
    class_order
    int
    大类顺序标记小类为默认的0
    默认值为0


    3
    class_cid
    int
    小类顺序标记大类为默认的0
    默认值为0



    用户与管理员登录日志信息表(ershou_adminstage)



    序号
    字段名
    字段类别
    说明
    备注




    1
    manager_name
    varchar(20)
    登录名
    主键


    2
    manager_action
    varchar(50)
    登录动作



    3
    manager_ip
    varchar(30)
    登录ip



    4
    manager_time
    datetime
    登录时间



    5
    manager_state
    int
    登录状态
    默认为0


    6
    manager_if
    Int
    判断为管理员还是用户
    默认为0



    评论表(ershou_pinglun)



    序号
    字段名
    字段类别
    说明
    备注




    1
    pid
    int
    Id
    主键


    2
    pinglun_wid
    int
    物品id
    默认值为0


    3
    user_name
    varchar(20)
    会员名



    4
    pinglun_nr
    varchar(200)
    内容



    5
    Pinglun_time
    datetime
    时间



    网站新闻表(ershou_news)



    序号
    字段名
    字段类别
    说明
    备注




    1
    nid
    tinyint(6)
    设置新闻编号



    2
    news_title
    varchar(100)
    设置新闻标题



    3
    news_class
    varchar(20)
    设置新闻类别



    4
    news_ly
    varchar(30)
    新闻来源



    5
    news_jishu
    int
    浏览次数
    默认值为0


    6
    news_nr
    text
    新闻内容



    7
    news_time
    datetime
    设置添加时间



    8
    news_guoqi
    Char(2)
    设置是否过期
    默认值为1


    9
    news_name
    varchar(20)
    发表新闻的管理员帐号
    主键



    物品信息表(ershou_wupin)



    序号
    字段名
    字段类别
    说明
    备注




    1
    wid
    int
    物品id
    主键


    2
    bclass_name
    varchar(20)
    所属大类别



    3
    class_name
    varchar(20)
    所属小类别



    4
    wuping_name
    varchar(40)
    物品名称



    5
    wuping_jishu
    int
    浏览次数
    默认设置为0


    6
    wuping_nr
    text
    物品介绍



    7
    user_name
    varchar(20)
    用户帐号



    8
    wuping_time
    datetime
    发表时间



    9
    wuping_guoqi
    int
    交易状态
    默认设置为1



    管理员信息表(ershou_manager)



    序号
    字段名
    字段类别
    说明
    备注




    2
    manager_name
    varchar(20)
    管理员名称
    主键


    3
    manager_pass
    varchar(20)
    管理员密码



    4
    manager_sup
    int
    标志为管理员权限
    默认值为0



    3.5 系统安全MD5是在Web应用程序中最常用的密码加密算法。由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文。所谓MD5,即”Message-Digest Algorithm 5(信息-摘要算法)”,它由MD2、MD3、MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest于上个世纪90年代初开发出来的。MD5的最大作用在于,将不同格式的大容量文件信息在用数字签名软件来签署私人密钥前”压缩”成一种保密的格式,关键之处在于——这种”压缩”是不可逆的。
    在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径。然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文—>MD5—>密文。因此,使用字符串次序干涉MD5算法,使现成的MD5密文数据库无所作为。此函数是把MD5运算后的密文字符串的顺序调转后,再进行一次MD5运算。函数代码如下:
    function md5_5($psw) { //得到数据的密文 $ psw = md5($psw); //再把密文字符串的字符顺序调转 $ psw = strrev($psw); //最后再进行一次MD5运算并返回 return md5($psw); }
    4 系统的实现4.1 系统的主要功能归纳起来,系统的功能大约有以下几点:用户注册,信息查询,发布信息,找回密码等。
    4.1.1 注册为了实现不同地域的学生通过网络、不择时间地自主填写并上传自己的基本档案(不合要求的档案可以由管理员及时清除),需要录入基本的个人信息。
    4.1.1.1 步骤
    开始注册
    填写个人信息
    提交(如失败返回填写页面重填写;如果重名错误,显示提示信息)
    进入登录界面
    登录成功,进入主界面

    4.1.1.2 主要验证代码://值存在则继续执行if(($_GET["ac"]=="in")and(isset($_POST["user_name"]))) { //判断验证码是否正确 if($_POST["ac_uthnum"]==$_SESSION["user_authnum"]) { $user_name=$_POST["user_name"]; $user_name=trim($user_name); $user_pass1=$_POST["user_pass"]; $user_pass1=trim($user_pass1); $user_pass=md5_5($user_pass1);//密码进行MD5加密 $user_question=$_POST["user_question"]; $user_angser1=$_POST["user_angser"]; $user_angser1=trim($user_angser1); $user_angser=md5_5($user_angser1);//密码进行MD5加密 $user_school=$_POST["user_school"]; $user_phone=$_POST["user_phone"]; $user_mphone=$_POST["user_mphone"]; $user_qq=$_POST["user_qq"]; $user_email=$_POST["user_email"]; $user_kt="1"; //查询是否存在当前注册用户名 $query="select count(*) count from ershou_user where user_name='$user_name'"; $result=mysql_query($query); while($info=mysql_fetch_array($result)) { $count=$info["count"]; } if($count==0){//不存在才执行注册 $sqladd = "INSERT INTO ershou_user SET user_name='$user_name', user_pass='$user_pass', user_question='$user_question', user_angser='$user_angser', user_school='$user_school', user_phone='$user_phone', user_mphone='$user_mphone', user_qq='$user_qq', user_email='$user_email', user_kt='$user_kt', user_date=NOW()"; else{//存在相同用户名则重新填写 echo '<table width="100%" border="0" cellPadding="0" cellSpacing="0"> <tr> <td height="300" align="center"><img src="images/warning.gif" border="0" /> 该会员已存在 <a href="javascript:history.back()">返回</a>重新填写 </td> </tr> </table>';} }
    4.1.1.3 主要窗口如下图:
    4.1.2 搜索信息为了实现快速浏览网站信息,各用户可以根据所须信息类别并填写查询关键字,很快的找出需要的信息。
    4.1.2.1 步骤:
    填写信息类别
    修改或删除信息类别
    浏览信息类别

    4.1.2.2 主要代码$sql ="select count(*) count from ershou_wupin where bclass_name='$bclass_name' and wupin_name like '%$searchcontent%'"; $result=mysql_query($sql) or die(mysql_errno().": ".mysql_error()."\n"); $rs=mysql_fetch_object($result); $recountCount=$rs->count; $show=20; $totalPage=ceil($recountCount/$show); $page = (isset($_GET['page']) && $_GET['page']>=0)? $_GET['page']: 0; $isLast = ($page==($totalPage-1))? true: false; $hasNoPre = ($page==0)? true: false; $hasNoNext = ($page==$totalPage-1)? true: false; $isFirst = ($page==0)? true:false; $start = $page*$show; if($recountCount==0){ //搜索结果不为0则显示未找到echo '<tr><td height="25" align="center">未找到!</td></tr>';} else{ $sqlwupin="select * from ershou_wupin where bclass_name='$bclass_name' and wupin_name like '%$searchcontent%' ORDER BY wupin_time desc limit $start,20"; $resultwupin = mysql_query($sqlwupin) or die(mysql_errno().": ".mysql_error()."\n"); while($rswupin=mysql_fetch_object($resultwupin)){ $wupin_name=$rswupin->wupin_name; $wupin_time=$rswupin->wupin_time; $date_format=date("m/d",strtotime($wupin_time)); $wid=$rswupin->wid; echo '<tr><td height="25">  <font color="#333333">['.$rswupin->class_name.']</font> <a href="wupin.php?wid='.$wid.'" target="_blank"><font color="#333333">'.TrimChinese($wupin_name,"80").'</font></a> <font color="#666666"> ('.$date_format.') </font></td></tr>';}}
    4.1.2.3 主要窗口如下图:
    4.1.3 发布信息实现用户发布二手信息,建立一个简单易操作的信息发布平台。
    4.1.3.1 步骤:
    输入标题
    选择类别
    输入内容
    选择有效标志

    4.1.3.2 主要代码<?//处理内容提交if(($_GET["ac"]=="in")&&(isset($_POST["wupin_name"]))){ $wupin_name=$_POST["wupin_name"]; $class_name=$_POST["class_name"]; $wupin_nr=$_POST["wupin_nr"]; $wupin_img=$_POST["wupin_img"]; $user_name=$_POST["user_name"]; $wupin_time=$_POST["wupin_time"]; $wupin_guoqi=$_POST["wupin_guoqi"];//查询所属大类的id号$sqlbclass="select * from ershou_class where class_name='$class_name'"; $resultbclass=mysql_query($sqlbclass); while($infobclass=mysql_fetch_array($resultbclass)) { $class_cid=$infobclass["class_cid"];} //根据大类的id号 查询出大类名称 $sqlbclass1="select * from ershou_class where cid='$class_cid'"; $resultbclass1=mysql_query($sqlbclass1); while($infobclass1=mysql_fetch_array($resultbclass1)) { $bclass_name=$infobclass1["class_name"];} $sqlup = "INSERT INTO ershou_wupin SET bclass_name='$bclass_name',wupin_name='$wupin_name',class_name='$class_name',wupin_nr='$wupin_nr',user_name='$user_name',wupin_guoqi='$wupin_guoqi',wupin_time=NOW()"; if(@mysql_query($sqlup)) { msg("增加成功!","#ff0000"); echo '<meta http-equiv ="Refresh" content = "1 ; URL=wupin_manager.php">'; } else { echo"<p>Error: ".mysql_error()."</p>"; }}?>
    4.1.3.3 窗口如下图:
    4.1.4 密码找回实现找回密码,大意丢失密码的拥护根据所须填写注册时的问题答案,就能更改密码。
    4.1.4.1 步骤:
    填写用户名
    填写答案跟新密码
    提交密码

    4.1.4.2 主要代码如下:<? $user_name1=$_POST["user_name"];//前页隐藏表单提交过来的的当前用户名 $user_angser2=$_POST["user_angser"]; $user_name1=trim($user_name1); $user_angser2=trim($user_angser2); $user_angser1=md5_5($user_angser2);//填写的答案进行加密 以去和数据库的值对比 $user_pass2=$_POST["user_pass1"];//读取新密码 $user_pass2=trim($user_pass2); $user_pass1=md5_5($user_pass2);//加密 $sql="select * from ershou_user WHERE user_name='$user_name1'"; $result = mysql_query($sql) or die(mysql_errno().": ".mysql_error()."\n"); $rs=mysql_fetch_object($result); $user_angser=$rs->user_angser; if($user_angser!=$user_angser1){//数据库答案与输入的不相同 就提示 echo '<tr bgcolor="#f3f3f3"> <td height="50" align="center">答案错误!请<a href="user_repw.php"><font color="#ff0000">返回</font></a></td></tr>';}//输入的答案正确和输入了新密码就提交修改的用户密码 elseif($user_angser1==$user_angser) { $sqlup="UPDATE ershou_user SET user_pass='$user_pass1' where user_name='$user_name1'"; if(@mysql_query($sqlup)) { echo '<img src="images/success.gif" border="0" />'; msg("修改成功,返回登录","#ff0000"); echo '<meta http-equiv ="Refresh" content = "1 ; URL=user_login.php">'; } else { echo"<p>Error: ".mysql_error()."</p>"; } } ?>
    4.1.4.3 主要窗口如下:
    4.1.5 数据库连接代码<?######MySQL数据库信息######$DBhost = "localhost"; //主机名$DBuser = "root"; //用户名$DBpass = ""; //密码$DBname = "ershou"; //数据库名mysql_connect($DBhost,$DBuser,$DBpass) or die("无法连接到数据库!");mysql_query("SET NAMES GBK");mysql_select_db ($DBname);?>
    4.2 创建界面4.2.1首页:网站首页是用户进入系统的第一个界面,因此,简洁、友好、清晰醒目是设计时要考虑的风格。样式如图所示:

    4.2.2 管理员管理主界面:管理员输入正确地用户名和口令后,就可进入管理主界面。管理主界面是管理员维护网站使用的界面,因此要求简单明了,容易操作。样式如下图:

    5 系统测试5.1 本地服务器测试本系统是基于Windows平台,在PHP、MYSQL、Apache的环境下运行的;启动Apache应用服务器,打开Internet Explorer,在URL地址中输入 http://localhost ,即可打开系统首页。经过测试,本系统已经能够顺利完成系统要求的基本功能,达到预期目标。
    5.2 远程服务器测试在Linux、PHP、MYSQL、Apache的环境下;用户远程访问此系统,页面会出现乱码。就此问题经过如下分析,并给出解决方案:系统显示信息时出现了中文文字显示的问题。系统文件乱码的出现是由于编码(charset)设置错误,导致浏览器以错误的编码来解析。
    此系统测试时遇到的主要是数据库连接编码,指的是进行数据库操作时以哪种编码与数据库传输数据,由于Linux操作系统上数据库采用UTF8编码,而网页的页面申明编码是GB2312。这时候在PHP脚本里面直接SELECT数据出来的就是乱码,需要在查询前先使用:
    Mysql_query ("SET NAMES GBK");
    来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。
    此问题解决后,继续测试系统。能够顺利完成系统要求的基本功能,系统在远程服务器上运行成功。
    1 评论 25 下载 2019-01-06 17:36:28 下载需要8点积分
  • 基于C#和Sql Server的图书管理系统

    1 课程设计意义与目标1.1 课程设计的意义《可视化编程技术课程设计》是在学生学习完《可视化编程技术》以后进行的设计性集中实践课程,通过课程集中实践,目的是使学生能加深对理论教学内容的理解,学会可视化编程技术的综合应用,培养学生分析问题的解决问题的能力。
    1.2 课程设计的目标通过课程集中实践,要求学生加深对讲授内容的理解,累积经验、学会独立上机调试程序;并且逐步达到综合运用封装、继承和多态等C#难点知识,更深地理解面向对象程序设计的基本概念与方法,从而学会利用C#语言解决一般应用问题,能设利用可视化编程技术开发复杂和综合性的计算机管理信息系统,并为后续专业课程的学习奠定程序设计基础。
    2 课程设计的题目2.1 设计题目概述
    图书管理系统
    2.2 开发环境搭建
    开发语言:C#
    开发工具:Visual Studio 2010
    数据库管理工具:SQL Server 2008

    3 系统的设计与实现3.1 物理数据模型设计




    3.2 主要界面设计
    界面中用了textbox,label,combobox,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件。在用户类别可以选择用户类型,管理员。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示。
    功能:可以增加,修改,删除图书。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示,用户借书,管理员可以查看用户的借书记录。

    密码修改:可以更改当前用户登录的密码,旧密码符合条件,新密码和旧密码不能相同,新密码和确认密码的相同的条件。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示,用户借书,管理员可以查看用户的借书记录。模糊查询在下面有具体介绍。

    管理员信息管理:可以对管理员进行增添改查。

    书库管理:对书库进行增删改查。

    书库查询:按地区分类和按书库编号分类,第二个combobox会自动加载所有记录的值供你选择。

    书库管理:用来增加书库,删除,修改。

    用户管理:对用户的增删改查。

    用户登录之后的界面。

    管理员登录之后的界面。
    4 调试过程中出现的问题及解决办法4.1 数组索引超出界限解决方法:利用断点调试,重新赋值。

    4.2 从试图获取数据时,应添加新的字段
    5 个人体会及建议在这次课设中,基本都是在学习新知识的过程,从powerdesigner到动软生成软件,让我知道了这个工具的强大之处,渐渐开始会用一点,在第一天晚上想重做一遍学生信息管理系统,不料,动软生成的路径没改,直接给覆盖了,所以只能重头再来,在这时就有想法想做个不一样的系统,上学期用C++做了个图书管理系统,有点印象,就选择做这个,一开始一直模范着你给的day1,day2,day3,看不懂BLL,DAL,MODEL之间的关系,经过思考,理解了他们之间的关系,BLL负责储存方法相当于API,DAL负责储存数据,MODEL负责各个对象的类,后面理解了就开始自己写,用户负责借书,用户的增删改,添加用户,管理员负责查询书库,书库的增删改查,查询图书,图书的增删改查,借书记录的增删改查,在这个过程中不仅了解了动软生成软件的机制,而且可熟练的利用这个工具,在这个工具的基础之上,我写出了更多好用的函数供自己使用。在windows应用开发上了解更多控件和控件属性的使用和结合,可以做出功能和界面相对完整的程序,总之,在这次课设中受益匪浅。
    3 评论 104 下载 2019-03-10 21:27:29 下载需要8点积分
  • 基于Java的可自定义评教系统设计与实现

    摘 要评教是当今提高教学质量非常重要的方法之一。在互联网时代,评教信息化也是当前发展的趋势,相比传统的评教形式,在线评教系统具有准确,及时,成本低等众多的优点。通过对当前一些评教系统的调研发现普遍存在着指标单一,权重平均,统计简单等不足。并在此基础上设计并实现了可自定义评教系统来提高教学评估的效果。
    本文主要研究如何来设计和实现使用灵活的可自定义的评教系统来完成学校的评教工作。通过将数据导入系统来生成评教元数据,以降低数据维护的成本。实现自定义的评教指标用于衡量教学效果,评教结果的数据统计直观明了,从多方面来反馈教学中出现的问题,使得评教系统能够在促进教学中发挥更重要的作用。
    本系统通过使用Spring框架和MySql数据库来提供开发环境,开发过程遵循MVC体系架构和软件工程的思想,通过需求分析,整体设计,详细设计,编码和测试来保障本系统高质量的完成。在安全方面,系统提供了更方便的权限管理和更细粒度的访问控制。同时对系统的可扩展性和并发访问进行了讨论。
    关键词:评教系统,Spring框架,数据统计
    AbstractEvaluation of teaching is one of the most important way to improve the quality of teaching. In the Internet age, informatization is the mainstreams of the teaching evaluation development, compared with the traditional evaluation form, online teaching evaluation system with accurate, timely, lower cost and many advantages. Through the investigation of the current teaching evaluation system, we can found that those systems has some deficiencies such as single index, weight average, lack of result statistics and so on. So a customized evaluation system is designed and implemented to improve the effect of the teaching evaluation .
    This paper mainly studies how to design and implement the use of flexible and customized evaluation system to complete the work of the school evaluation. To reduce the cost of data maintenance, the data import module is used to generate metadata. Implement custom evaluation indicators to measure the teaching effect. Data statistics of the evaluation result is detailed and clear, from many aspects to show the problems appeared in the teaching. Making the system play a more important role in promoting teaching effect.
    The system use the spring framework and MySQL database to provide development environment , the development process follow the principals of the MVC and the thought of software engineering , through the requirement analysis, overall design, detailed design, coding and testing to ensure the quality of the system. In the security aspect, the system provides convenient privilege management and fine - grained access control. And the system scalability and concurrent access is discussed in the paper.
    Keywords: Evaluation system, Spring Framework , Data statistics
    第1章 绪论1.1 课题背景如今,越来越多学生都受到了高等教育,学校和政府有关部门一直以来对如果提高教学质量问题都非常注重。如今教师有效教学和学生有效学习成为近年来高等教育一个很重要的问题。教学质量的提高不仅是科教兴国战略实施的必然要求,同时也是高校的不断发展和进步的客观要求,加强高校教学质量管理体系的建设是非常重要的一部分[1] 。但是,目前国内高校对教师教学质量评估的工作很多依然是依靠通过发放评测表,回收评测表并人工处理评教数据并分析的方式来进行。在互联网+时代,这种传统的评测无疑显露出了很多的弊端。评教指标不能科学化,系统化的建立,评教过程费时费力而且效率低下,对统计结果的分析也只能是单维度的简单的,不能利用信息技术对评估结果进行科学有效直观的分析和展示以促进教学质量的提高。虽然近来有的高校也构建了在线评教系统,但是通过对这些系统的分析,不难发现,这些评教系统存住着不能根据教师的分类制定不同的评教标准,评教指标形式化严重,学生评教的积极性不高,评教结果失真等问题。为了能够及时有效快速的反馈教学的成果,根据需求和规则科学的制定评教的标准和规则,来构建基于网络的可自定义评教系统[2] 。
    1.2 研究意义随着信息技术的高速发展,绝大多数的年轻人都已经习惯了信息化带来的便利和好处,足不出户就可以轻松完成许许多多的事情。尤其是近年来,网络教学的发展和普及,大学生可以通过网络视频就能完成课程的学习。评教的网络化无疑是发展的必然,以此来实现全体的教师和学生共同参与评教工作,使得评教能够更好的,更及时反馈教学成果。网上评教有很多的优点,大学生参与积极,评教覆盖面更广,学生可以随时随地的完成对教师的评教,保证了评教数据的可靠性和真实性,同时对评教结果的分析也可以采取更加直观的图表的形式来展现,通过对最近几年评教结果的分析,可以反映出教师的教学质量的变化趋势,这种机制无疑能够促进教师更好的教学,及时发现教学存在的问题。再者,通过教师对学生多方面的评价,能让学生从多角度的了解自己在学习上或者其他方面存在的问题和不足,而不是仅仅只是通过成绩来断定一个学生的真实能力[3] 。
    1.3 国内外研究现状分析通过对国内一些基于B/S的网上评教系统的研究,发现了这些系统或多或少存在的一些问题:
    1.3.1 评教指标的过于简单化不难发现,现有的评教系统大多都只采用选择题的形势来进行评估,形式过于单一,学生不能表现出对教师教学更多的看法,只能局限于对一些简单的形式化的反馈。而且评教表没有差异性。举例来说计算机专业的评教和艺术专业的评教内容就不应该是一致的,每个课程都有自己的教学特点,有的偏重于理论,有的偏重于实践。因此不能采用单一的评教标准和内容,因此可自定义的评教表就可以很好地解决这个问题[4] 。
    1.3.2 评教指标的权重过于平均从现有的评教表来看,每个评教指标的权重都是一样,大都分为 优良中差或者固定的分数段等。这种评教标准存在着一些问题,有的过于泛化的指标例如认真负责,生动自然等和一些课程特有的指标,例如计算机课程可以帮助学生深入理解计算机原理和动手实践,上机评测这样的指标权重不一该一视同仁,所以每个指标都应该都不同的权重,这样最终得到的评教结果才能更好地展示出教师的教学成果[5] 。
    1.3.3 评教结果的可信度和缺乏科学的数据分析评教的可信度就是说,现在的大学生因为担心评教结果被教师看到,所以隐瞒实情,打分或者评价都会刻意的选择较好的方向,这样就会严重的影响到评教结果的可信度。评教结果的分析大多都只是按照单次评价的结果,对得分进行简单的排序并展示。这样单一的数据分析显然不能得到很好的效果来促进教师的教学。更好的方法应该是对教师一次课程的前期中期后期多次进行评教,将评教结果按照权重得到教师的最终的成绩,并且通过图形的方式展示教师的得分和最近得分的趋势,并对学生的意见和建议进行了归纳,以帮助学校提高教学质量,协助老师提高教学效果。
    通过对国外高校评教工作的了解,下面这些优点和启发可能对评教系统的开发有更好的帮助。一个就是国外高校评教指标的体系不只是学校单方面的制定,学生对评教体系的看法也占有很重要的地位,学生如果能参与到评教指标的制定,更能表达出学生的看法。再就是国外高校利用学生的评教结果对外公开,并给与低年级学生以选课的参考,这样教师可能会更多的会去反思自己的教学方法,学生也更能了解自己想要学习什么或者提前做好准备[6] 。
    1.4 系统开发的主要目标和内容1.4.1 开发目标根据当前学校教务系统的设计,完成整个评教系统架构平台的搭建和数据库的设计,保证系统与学校教务系统能够良好的衔接和运行。
    设计与完善评教流程的体系,抽象出评教表格式,能够实现根据需求来自定义评教表格的内容。
    完成整个系统的设计,开发,实现和运行,包括测试和相关文档的完善。根据评教结果进行数据分析,并通过视图直观的展现出来,据此探索基于评价的教师奖惩机制,制定建议方案。
    1.4.2 开发内容1.4.2.1 数据的导入和教务系统数据的维护和衔接将教务系统导出的学生表,教师表,课程表,学院表,选课表以EXCEL的格式导入到新设计的数据库中,新系统的数据库表的设计需要与教务系统的字段和类型保持一致,并截取对评教有用的字段进行维护,作为元数据方便接下来评教工作的展开。
    1.4.2.2 评教批次和评教指标的可自定义的设计评教批次是指在每学期可能有不止一次的评测,评教批次需要设定开始和截止时间,评教需要在评教批次限制的时间内进行。
    可自定义的评教表包括表头,文本,打分表,反馈和建议等内容,每项的内容和数量是可以自定义设置和增减的,最后将自定义好的评教表动态的保存到数据库中。
    1.4.2.3 系统管理员的设置和角色系统权限控制的设计系统需要设置管理员来进行系统数据库的维护和数据导入的工作。系统涉及的角色包括 学生,教师,管理员,和领导,每种角色所拥有的权限都不相同,角色的权限可以动态的设定,对访问权限做细粒度的划分和控制,保证系统角色的灵活性。
    1.4.2.4 评教结果的查看和统计展示评教结果的展示对每个角色都不相同。学生的结果展示主要在于教师对自己课程表现的评价。教师的结果展示包括学生和领导对自己所教课程的评分和评价内容,并且可以查看相同课程各个学期的得分成绩和评价的趋势的展示。
    第2章 系统开发技术路线2.1 技术架构项目基于JavaEE技术开发和实现。使用Spring框架作为容器来搭建运行平台,同时可以提供良好的扩展性和对象生命周期的管理。通过MySql数据库来对数据进行持久化。Druid连接池是JDBC连接池的实现之一,可以用来缓存应用程序与数据库之间进行通信和传输的连接,这样可以大大减少创建数据库连接所消耗的时间[7] 。使用MyBatis作为ORM框架来完成JavaBean与数据库的映射,通过灵活的动态SQL技术来对数据库进行操作,大大减少了数据库操作的繁琐。使用BootStrap作为前端框架进行布局和提供控件的支持,使用JQuery来提高Web交互体验,使用ECharts来进行数据的可视化绘制。如图2-1所示,是系统整体的技术架构,包括展示层,服务器和数据库三个部分。

    实验工具和实现环境如表2-1所示:



    工具或环境
    使用




    分布式版本控制托管
    Github


    Java环境
    JDK-7


    javaIDE
    Itellij Idea


    WebServer
    Tomcat7


    服务器环境
    Linux Centos 6.5


    数据库
    Mysql5.6



    2.2 使用框架和技术介绍2.2.1 SpringSpring框架是基于Java语言的一个开源框架,不同于普通的J2EE框架,Spring有着对系统更少的侵入和众多特性的用于企业开发的框架,可以在各种平台上运行,而且基于配置模型来提供更好的扩展性。Spring的关键是提供应用级的底层支持,这样开发就可以只需要关心业务层,而不用关心程序部署的平台[8]。
    Spring具有以下特性和优点:
    依赖注入和控制反转:提供一种通过自动装配的技术,Spring将接管bean的生命周期的管理,并对所依赖的资源进行注入,程序自身不需去调用框架,而是Spring框架通过配置来控制程序依赖的注入,可以通过来指定构造器注入和,setter注入等方法来加载bean的值,大大降低了系统的耦合度。
    对众多Java开源框架的支持,例如MyBatis,Struts,JDBC,JMS等,通过Spring容器来统一的管理这些第三方框架可以使得项目更好的开发和维护。MVC框架:提供一种清晰,无侵略性的MVC实现方式。
    2.2.2 Spring MVCSpring框架使用可插拔的MVC架构提供了一个功能齐全的MVC框架的实现,可以用来轻松构建Web应用程序。通过Model,View,Controller三层结构来实现一个基于请求/响应的Web框架。控制器(Controller)用来实现页面的跳转和业务处理的入口,视图层(View)通过模型(Model)的数据来指定使用何种视图技术来渲染出HTML并最终返回给用户,进而结束整个HTTP请求的过程[9] 。
    如图2-2所示,展示的Spring MVC框架的请求处理流程图。

    当用户发送的HTTP请求到达WebServer后,DispatcherServlet是整个程序的入口点,所有的请求都会被DispatcherServlet说处理,它将会调用指定的处理器来映射请求URL和处理器,并将请求数据进行处理和转换,传递给Controller来进行页面逻辑的导航和业务逻辑的代理。控制器会使用用户请求的参数来调用Service接口,经过实际的业务逻辑处理后,将返回的数据封装到Model中并传送到Controller,每一个Controller都会有一个与之关联ModelAndView对象,封装了数据模型Model和视图View的逻辑名称,Controller会将ModelAndView对象传递给给VierResolver,根据设置生成指定的视图类型,并确认真实视图文件路径,之后通过Model数据来渲染生成视图结果,最终将结果通过Response返回到客户端。这样就完成了一个典型的基于MVC模型的HTTP请求过程[10] 。
    2.2.3 MySqlMySql不仅是在小型企业广泛使用的开源数据库管理系统,而且在当今许多互联网企业中,MySql也是备受青睐,得到越来越多用户的认可。它具有安装体积小,运行速度快,执行性能高,免费而且开放源代码,可以根据企业需求进行定制。MySql具有的特性之一就是具有可插拔的存储引擎架构,数据库的执行处理等上层操作和底层的存储引擎分离,使得众多适用于不同场景的存储引擎例如InnoDB,MyISAM,NDB等能够发挥很大的作用,可以根据业务需要和场景随时的改变数据库的存储引擎以满足要求[11] 。同时MySql具有Replicaion的主从架构,对当今互联网企业而言,一台主数据库服务器(Master)和多台从数据库服务器(Slave)的架构可以满足数据库不断增长的数据库读写请求,通过读取从数据库和写主数据库来缓解数据库的读写压力,增加数据库的吞吐量。同时,MySql具有Partition,分表,触发器,视图,函数和存储过程等大型数据库管理系统都具有的特性使得MySql成为当前最流行的开源数据库。
    2.2.4 MyBatisMyBatis是一个基于Java的持久层ORM框架。它是一个具有Sql语句查询,存储引擎,高级对象映射等特性的优秀的持久层框架。通过底层对JDBC连接的处理和自动结果集的检索和封装,使得程序可以从繁琐的数据库操作中解脱出来,把精力更多的放在业务逻辑的处理上。同时动态SQL的支持使得SQL语句的组装和功能更加灵活,大大降低了程序中拼接SQL语句从而导致的SQL注入的风险。MyBatis配置可以基于文件和注解两种形式,通过在映射文件中或者接口上直接编写SQL语句,这种方式虽然会降低开发速度,而且可能会有SQL语句拼写错误的困扰,并不像Hibernate这种可以使用HQL对象查询语言基于配置动态生成可执行SQL语句框架。但是当系统的数据库压力一定的程度时,修改SQL语句可以使得SQL优化变得异常的方便而不用修改程序代码。而自动生成SQL语句的特性就使得SQL优化变的异常的麻烦。同时,MyBatis可以和Spring良好整合在一起,通过Spring来管理MyBatis的SessionFactory使得数据库的连接操作更加的简单。
    2.3 本章小结本章主要说明了系统在整个开发过程中,会使用到的主要技术和框架及其原理的介绍,充分了解需要使用的技术可以大大降低开发过程中遇到的风险,对接下来的设计和开发工作能够顺利进行有很大的帮助。
    第3章 需求分析3.1 总体需求可自定义评教系统主要是为了满足学校对新的评教方法的实施而进行开发的,为的是教学过程中的连续评价和沟通。同时设计了学生对教师的评价表,教师课程质量评价表,学生状态评价表等,各种评教表的指标和格式各不相同,除了量化打分外,还有关于意见,建议等问题的填写。在一个课程的整个学期中,可能会设置开学,期中,期末多次评教,使用的评价表也可能是不相同的。所以如何设计出通用的可自定义的评教表是系统开发的关键。
    不同的评教结果表以不同权重进行组合,例如学生的三次评教权重分别为10%,30%,60%。教师的成绩受学生评教,教师互评,领导评教三方面的影响。
    同时对课程评价的展示不只是每个对象的评价表详情,还要有评教结果的统计,例如每个课程每个批次的评教进度,学生评分,教师评分等信息的展示。所以一个完整的直观的统计结果是必要的。
    除此之外,还需要将现有教务系统中的学生,教师,课程,选课信息通过使用Excel导入到系统中,保证整个系统的数据一致。
    3.2 系统功能需求分析3.2.1 角色和用例图评教系统有学生,教师,领导和管理员四个角色。各个角色的职责各不相同。系统主要功能围绕着针对角色和课程进行教学评价的工作来展开,相比传统的评教系统只是通过学生对教师所授课程的评价作为教师的教学考核标准显然不够准确和全面,通过增加教师和学校领导对课程的评价的方式可以使得课程的受评结果更能反映教师真正的教学情况,从而达到促进教学质量提高的效果。
    从系统角色的角度出发对系统的功能可分为:

    3.2.1.1 学生,用例图如图3-1所示,主要功能有:
    登陆:学生数据被导入系统后按照默认规则生成密码,学生通过验证学号和密码登陆到系统后可以进行教学评价
    评价已选课程:当学生登录系统之后,将会显示学生所选的课程,并提供评教的入口,进入后可以对课程进行评价。已经评价的课程将不允许再次受评
    查看课程信息:基于公正公开的原则,评教的所有信息的开放透明的,学生可以查看任何一个课程的受评情况,包含课程收到的所有评价结果表和数据统计等信息
    查看教师信息:学生可以检索所有的教师信息,查看教师所授课程的评教结果和得分统计等信息

    3.2.1.2 教师,用例图如图3-2所示,主要功能有:
    评价课程组:当老师登录系统之后,可以选择对同一个课程组其他教师所授课程进行评价。同一个课程组即是相同的课程名,不同教师所授课程
    评价学生:登陆系统后,也可以选择对学生进行评价。根据教师授课课程列出所有选课学生,然后可以对学生逐个评价,每个学生只能评价一次


    3.2.1.3 管理员,用例图如图3-3所示,主要功能有:
    评教指标管理:评教指标的作用是维护一组评教表,用来进行评教工作使用。评价表的类型分为:学生评价教师,教师互评,领导评价教师,教师评价学生。评教指标可以新建,包含表头,打分表和问题三个部分,打分表细分为问题和评价得分,等级,权重等信息,评教表的项目可以根据需要增加和减少,最后动态生成评教表。评教表也可以修改和删除
    评教批次管理:评教批次表示在一个批次的时间段内,系统各个角色可以相互进行评价,超过了评教批次的结束时间不允许进行评价,一个学期可以创建多个批次进行评教工作,保证了评教的效果和师生的持续沟通,更能准确的反映出教师教学的效果
    管理员管理:系统存在一个超级管理员,超级管理员可以对其他管理员进行添加删除和修改的操作。普通管理员可以修改自己的信息,不能修改其他管理员的信息
    权限管理:系统通过请求的URL和Session中用户的角色信息判断用户是否有权限请求当前页面或数据内容。URL和角色的权限映射表存放在数据库中,前台页面可以对各种角色的权限进行修改
    数据导入:数据导入即通过教务系统下载的Excel 2003格式的导出文件,通过导入页面上传到系统后后台自动解析并处理,然后将解析到的学生,教师,课程等信息导入到数据库当中。系统在使用前必须要将必要的数据导入到系统后才能开始正常的评教工作


    3.2.2 功能模块划分从上面的角色功能分析中,可以将系统的划分为4个模块。如图3-4所示,每个模块的功能如下:

    基本数据管理:包含教师,学生,课程,班级,专业,学院,管理员等基本信息的维护
    评教系统:包含学生评教,教师评教,领导评教,评教指标和评教批次等
    评教结果和图表的展示:包含课程受评结果,学生受评结果和教师受评结果的展示和相关数据的统计信息
    数据导入:包含课程信息导入,选课信息导入,学生信息导入和教师信息导入


    3.2.3 数据流向数据流图,简称DFD,主要是用来展示数据是如何生成和传递的,并在在哪里被存储和引用。使用图形的方式来描述系统中都有哪些功能和功能之间的联系以及和数据在其中是如何变化的。是分析系统数据流程的一种有效工具,是逻辑模型的重要组成部分。
    如图3-5的系统数据流图,表示系统内部数据的流向。系统管理员维护基本信息和创建评教指标,生成评教批次,使得系统的参加评教的角色可以进行评教表的填写。当评教表填写完成时,系统会自动将参加的评教人,和评教对象,课程,时间,评教批次和评教结果等内容封装到评教结果表中并保存到数据库,当一定的时机触发评教结果查询的时候将会自动进行数据的统计和分析,并生成统计记录存放到相应的表中。

    3.3 系统非功能性需求分析3.3.1 性能需求系统可以安全稳定的运行,并能够及时的响应用户的操作,是一个合格系统所必要的。使用基于Java技术的Spring框架搭建的Web应用完全可以符合本系统的性能需求。下面从3个方面来说明系统要求:
    3.3.1.1 可靠性要求可靠性要求几乎是所有应用所必须的,一个系统可以7*24小时的对外可用是系统高可用的表现,如何保证系统的可靠性就需要在设计阶段考虑到系统程序的稳定性和服务器的稳定性。当程序发生异常时可以正确的处理并记录错误而不会导致系统崩溃可以大大提高系统的可靠性。服务器如果发生宕机能够快速恢复,并及时排查故障,以免下次意外的发生。定时的进行数据库的备份操作以免发生意外导致严重的系统故障。
    3.3.1.2 高效性要求系统的高效主要体现在合理和UI设计和及时的后台响应两个方面。在前端交互设计尽量的友好和高效,使用Ajax异步加载来避免页面的跳转都可以使得评教工作顺序高效地完成。由于考虑到系统在大量并发的时候引起的网络阻塞和系统高负载时会导致响应时间剧增,所以采用延长评教批次时间,分散客户端请求的方法,使得后台运行的更加稳定和高效。
    3.3.1.3 安全性要求系统安全的重要性不言而喻,系统权限设计,防火墙使用,数据库的访问权限,Web项目部署环境的权限设置都会影响到系统的安全性。同时系统层面,前端的数据必须进行数据效验和防止SQL注入等常见Web攻击都必须要加以防范以保证系统的安全性。
    3.3.2 界面需求系统界面简洁大方,交互友好,页面布局合理,关键位置的提醒和醒目的错误提示都是需要考虑的。查询页面增加多项过滤条件可以更加准确的查找,下拉框的级联展示可以快速的定位要查到的内容,尽量使得页面符合用户的使用习惯。
    3.3.3 可行性分析技术可行性:技术可行性分析指的是使用现有的技术是否能够达到系统完全开发的要求。使用现有的技术架构已经被验证完全具备大型Web项目的开发的条件,成熟的开源框架和可扩展的MVC架构使得项目的开发在技术上不存在技术未知的风险,可以保证系统能够按计划顺利开发完成。
    经济可行性:系统是基于Java语言的Spring框架来进行开发。Java是一个开放源码的编程语言,Spring是基础Java的一个轻量级的企业开发的框架,使用现有的流行的开源免费的框架进行项目的开发不需要支付额外的费用。再者,使用开源免费的MySql数据库不仅能够满足性能需求,也可以节省数据库授权的大量的成本。服务器采用开源的Centos或者Ubuntu 等Linux操作系统,能充分保证系统的稳定性和安全性。这样的开源架构可以做到成本最小,所以经济上是可行的。
    研发一套网上评价系统,技术上不存在问题。学院教师、学生都有强烈的提升教学质量、提升课堂教学效果的愿望,能够积极参与和支持评价工作。教务处在全校范围内推动此事,能够为教师教学质量评价提供良好氛围。综上,本项目可以顺利开展和实施。
    3.4 本章小结本章主要讨论了系统的需求分析,为了全面而准确的描述系统的功能需求,使用用例图和模块图等工具详细的介绍系统每一个模块需要完成的功能。此外,还从非功能分析的角度对系统的性能,界面和可行性分析进行分析,为接下来的系统设计做充分的准备。
    第4章 系统设计4.1 整体设计为了保证系统的可扩展性,采用了经典的软件三层架构的设计。从上到下分别是表现层(UI),业务逻辑层(BLL),数据访问层(DAL)。三层架构可以充分的体现了“高内聚,低耦合”的思想,类似于网络的七层结构,在软件开发上根据功能需要分为三层可以保证每层都只负责相应的业务,各层之间通过接口来调用,使得实现和接口可以分离。这样的架构可以充分满足扩展性的要求,当有新的需求产生时,只需要添加相应的实现而不需要修改之前的代码,这同时也符合面向接口的实现,设计时只需要设计上层接口,底层实现可以根据需求而不同,JDBC就是基于这样的设计模式实现,所以当我们切换数据库时,可以做到不用修改太多的代码,而只需要修改加载的驱动就可以满足切换数据库需求的变化[12] 。
    在Spring MVC中,控制器Controller是用来进行页面逻辑导航和对服务层进行代理的,视图View对应于表现层,根据输出类型的不同而使用不同的视图技术来展示数据格式化形式,而Service层对应于业务逻辑层,系统所有重要的业务逻辑的都会在Service层完成。如果Service层需要与数据库通信,就通过调用数据访问层(DAL)来对数据库进行操作。这样就可以达到层次结构分明,可扩展的特点。

    图4-1所示为项目整体的目录结构,可分为配置(Config),源代码(Src),系统资源目录(WebRoot)三个部分。其中配置目录主要存放Spring的配置文件,数据库的连接信息,数据导入映射关系,系统日志的配置文件,MyBatis配置文件和系统的一些属性配置等文件。通过将系统的配置文件统一的存放管理是为了方便程序可以准确的定位配置文件的位置并能够顺利的加载执行,同时也更加方便的查看和修改配置文件。Src目录是系统源代码的存放目录,其中主要有对应于三层架构中的Controller,service和dao的三个目录,此外还有持久对象,工具,基本类,枚举,拦截器,控制器,转换器等目录结构。WebRoot目录是Web项目的资源根目录,含有用于Web页面展示和渲染的静态资源CSS,JS,Image等,还有非常主要的动态页面JSP文件,控制器需要返回的动态页面主要就存放在这里。
    系统的开发流程:通过详细的需求分析后,设计项目的整体架构,然后再根据功能划分模块,进行各个模块的详细设计和数据库表结构的设计。最后根据详细设计完成 整个项目的编码工作。在完成后还需要进行充分的测试,将错误和需要改进的地方整理下来,然后逐一完善直到项目最后上交验收。
    4.2 系统设计思路4.2.1 充分考虑系统的稳定性和扩展性在项目的最开始,就开始考虑项目的稳定性和扩展性可以给项目后期的维护带来更多的便利。使用成熟的,流行的开源框架的稳定版本就是为了保证系统的稳定性。虽然一些其他的框架可以提高开发周期,但是尤其使用的用户少,稳定性不能保证。同时在程序的代码层面,在系统的稳定性主要表现在以下方面:使用Log4j日志,在代码出错和异常处全部打印Log日志,完成的Log日志可以在项目出现问题时及时的确认问题出现的地方和原因,快速结果。通过使用全局的异常处理,将异常信息全部输出到一个页面,统一处理异常并记录,可以保障系统更加稳定的运行。在项目的可扩展性方面,使用Spring框架可以提供对众多第三方框架提供支持,同时项目的结构符合J2EE的规范,使用标准的Controller,Service,Dao三层架构,各层架构负责自己的逻辑处理,面向接口的编程也使得扩展变得更加的简单。
    4.2.2 合理的数据库设计和充分的性能优化在数据库的表设计时,对每个表的增加主键可以使得数据查询在MySql这种以主键索引的数据库中获取更高的查询速度。设置字段的长度可以节约磁盘空间的占用,尽量使用varchar而避免使用text来提高读写性能的。数据库设置完整的外键来保证数据的一致性,同时使用外键可以使得查询字段自动建立索引,这样在where子句中索引将会大大降低数据库读表的操作,提高性能。在代码层面,使用数据库连接池技术,可以大大降低数据库连接的打开和关闭,通过缓存连接可以更快和数据库进行通信。在数据统计展示的时候,每次访问时才会延迟去数据库查询并计算统计,而不是定时任务一次性的对所有数据进行统计,这样可以充分将计算任务分散开来,保证系统的流畅。
    4.3 登陆模块设计登陆模块是进入系统的入口,所有用户必须登陆后才能访问系统。登陆需要输入用户名和密码,如果多次尝试登陆需要输入验证码。登陆时需要选择用户的角色,是学生,教师还是管理员登陆等。登陆成功后,会通过数据库获取用户的权限,并跳转至用户的主页面。
    用户登陆流程如图4-2所示。在验证用户密码的过程中,由于数据库使用MD5算法来加密存储密码,所以将用户输入的密码先进行MD5加密,然后和数据库的加密字符串进行对比,如果字符串验证一致,说明密码输入正确。在用户登陆成功后,从数据库中加载用户拥有的权限并存储到Session中,在页面展示时,根据用户Session中的权限来显示或者隐藏部分功能。
    为了防止有人对管理员账号进行穷举破解攻击,登陆模块加入验证码来防止用户多次尝试登陆,如果登陆尝试间隔小于5分钟,需要输入验证码,如果用户是第一次登陆,默认不需要输入验证码,这样既不是影响用户体验,也使得登陆更加的安全。
    如果用户每次登陆都需要选择登陆的角色会给登陆带来麻烦,所以在用户第一次登陆成功后,默认会记住用户的登陆的角色,将登陆角色类型存储在浏览器的Cookie中,当用户下次登陆中,默认选择用户上次登陆的角色,这样将会使得登陆更加的便捷。

    4.4 基本信息管理模块设计基本信息是系统运行所必要的数据,系统的基本运行和评教的展开都依赖基本信息的完整。基本信息包含 管理员管理,权限管理,学生教师课程等教学信息等。
    4.4.1 管理员管理管理员是系统非常重要的一个角色,是系统权限是最大的,基本信息维护的执行角色。例如权限管理,数据导入,评教指标维护,评教批次的生成等工作都需管理员角色才可以操作。
    管理员默认拥有一个超级管理员,超级管理员不可以修改和删除,系统只能存在一个超级管理员,超级管理员可以执行任何操作,也是唯一一个账号可以进行管理员管理和权限管理的账号。
    管理员管理包括:管理员的添加,修改和删除操作。添加管理员时,先判断用户添加的管理员是否是admin(超级管理员),如果不是则添加成功。修改时候,如果是超级管理员,可以修改所有管理员的信息,如果是普通管理员,那么只能修改自己的信息。超级管理员可以删除自己以外的所有其他管理员,普通管理员不能执行删除管理员的操作。
    4.4.2 权限管理权限管理是系统很重要的一部分功能。由于系统的角色比较多,而角色之间可以进行的操作差别也比较大,那么如何设计权限管理就变成比较重要了。
    当一个用户发起一个请求的时候,首先需要验证的是用户是否已经登陆,如果没有登陆,那么需要将页面跳转到登陆页面。通过添加LoginFilter过滤器可以实现该功能。当所有请求被Spring MVC的DispatcherServlet拦截之前,会首先被LoginFilter截取到,所有可以保证所有的请求都会在执行前进行权限验证。
    当用户登陆成功后,并不是所有的请求都具有权限去执行。角色权限检查流程如图4-3所示。
    权限的具体判断方法:首先获取用户访问的URL,例如/foo/delete,然后去数据库获取用户拥有的所有权限,假设用户拥有/foo/query 和 /foo/ /add 而没有/foo/delete,那么用户就没有权限执行删除的操作,只能进行查询和添加的操作。
    在数据库中,权限表字段包含权限名,权限URL,各个角色的权限位。如表4-1所示,对应角色列为1表示有权限,没有为0。学生有添加权限,而没有删除权限。超级管理员修改每个角色的权限。
    权限记录表



    URL
    权限名
    学生
    教师
    管理员
    领导




    /foo/delete
    删除
    0
    1
    1
    0


    /foo/add
    添加
    1
    1
    1
    1




    4.4.3 评教相关信息管理在本系统的设计中,学生和教师,课程,学生选课信息四个部分的数据量很大,如果手动录入这些数据肯定是不现实的,而且还会严重影响系统的可用性。所以在这些信息的录入是通过Excel导入的方式来进行。而且只可以通过Excel导入的方式来添加,不能手动添加,不能修改,大部分数据一次导入即后只读数据,只有系统进行数据统计时候才会自动修改相应的字段。同时这些数据也不允许删除,删除数据将会导致数据不完整和不一致,而且如果数据被外键所引用,同样也是不允许被删除的。所以这些信息在系统界面中主要以列表和检索的形式体现,同时是作为评教结果查看的入口,只有查找到对应的课程或者教师,学生,才能查看对应角色的评教结果详情。查询页面会设置多个列来过滤检索这些数据,大大加快的数据查询的速度,大大方便了师生查阅评教结果等信息。
    4.5 评教模块设计评教模块是系统的核心模块,是本系统业务逻辑较复杂,使用频率最高的一部分模块,其他模块的实现也是为评教的展开而服务或者提供支持的。
    评教模块主要分为评教指标和批次的设计,评教流程设计,评教结果的展示三个部分。
    4.5.1 评教指标设计评教指标是主要是用来管理和维护打分表,同时可以随时的创建和修改评教表,使得评教指标的体系更加的科学和合理。一个合理的评教指标可以充分的反应出受评对象的真实情况,有利于后续的反馈和改进。评教指标设计的过程是对评教表进行抽象的过程,一个典型的评教表如图4-4所示。

    一个标准的评教表包含的内容有:评教表名,类型,评教须知,表项,打分表,问题列表,总分,评价级别。其中表项,打分表,问题列表可以有多个。
    评教指标可以创建,修改和删除,只有没有使用的评教表才可以删除,图4-5所示为删除评教表的流程:

    4.5.2 评教批次设计评教批次是一次评教完整的生命周期,从评教批次的创建,开始日期到结束日期这段时间,参与者可以对受评对象进行评价的过程。不在评教批次的时间段内是不允许进行评价的。不同于一般的评教系统,评教批次的加入可以的使得一个学期可以进行多次的评教工作,并且每个评教批次都可以使用不同的评价表,这样可以更加充分和反映受评对象整个学期的整体表现。一个评教批次包含批次名,开始日期和截止日期,学期,评教表Id等内容。
    评教批次在结构上并不复杂,但是有一个要求就是不允许任何时刻同时存在两个评教批次,也就是说评教批次的时间不能冲突。判断的步骤是,首先判断开始日期是否被其他批次日期包含,然后是截止日期是否被其他批次日期包含,最后判断开始日期和截止日期之间是否涵盖了其他批次的时间。
    4.5.3 评教流程设计评教有四种类型。学生评价教师,教师评价学生,教师评价教师和领导评价教师。其中对教师的评价体现在对教师所授课程的评价,最终反映在教师得分的影响上。

    一个基本的评教流程如图4-6所示。首先判断当前时间是否在评教批次时间内,如果不是,那么就只能进行数据查询的操作,不能评价。否则就展示角色可评价的所有对象,进入后展示出评教表进行打分和问题的填写。如果填写没有问题就保存到数据库中,结束评教流程。
    当角色登陆后,各自主页展示的可评价对象各有不同。各个角色展示的可评价对象如下所示:

    学生评教:展示学生本学期所选得所有课程,点击进入后可以对课程评价
    教师评价学生:展示教师本学期所授的所有课程,选择课程进入后展示课程的所有选课学生,点击学生进入后可以对学生评价
    教师评价教师:展示教师本学期所授课程的所有课程组,不能评价自己的课程,只显示评价课程名相同,不同教师所授课程
    领导评教:展示所有的课程,可以选择任意课程评价

    在可评列表中,已经评价的记录显示为已评价,相同的评价对象只能评一次,不允许重复评价。
    4.5.4 评教结果展示设计评教结果的展示主要分为三个方面:课程,教师和学生。通过系统的课程管理,教师管理,学生管理可以查找到想要查看的对象,点击进入对象详情可以查看评教结果相关信息。
    4.5.4.1 课程详情课程展示出受到学生,教师,领导打分的平均分,每个评教批次的平均分,评价等级所占比例。这些数据是通过对所有评价结果表的统计得到的。然后展示课程参与的所有的评教批次,每个批次分别显示来自每个评价结果表的得分,评价等级,评价人等信息,点击详情可以查看评价结果表的所有信息。每一个评教批次对应一个评教结果的统计页面,统计的数据有:当前评价的人数和总人数,评价进度,平均分,评教等级的统计,每个表项的平均得分和等级,收到的所有回答和建议等信息。
    4.5.4.2 教师详情显示教师的平均分。通过各学期查看所授课程的平均分和各评教批次的平均分。点击课程进入可以查看课程详情。教师的各个批次的得分趋势图。
    4.5.4.3 学生详情显示学生的平均分,每个学期的平均分,等级统计,每个表项的平均得分和等级,收到的所有回答和建议,以及来自每个教师的评价结果表详情的查看。学生每个批次的得分趋势图。
    评教结果的查看页面布局如图4-7所示:

    4.6 数据导入设计数据导入模块是为了免去手动录入学生,教师,课程等信息所设计的。通过上传的Excel文件,经过系统解析和处理后,存储到数据库当中,并进行密码的初始化等操作。
    数据导入包含教师,学生,课程和选课信息四部分内容的导入。导入需要考虑的问题有:导入的文件内容字段可能会发生变化,导入的文件格式,版本,大小要求,导入的数据可能会和数据中数据库冲突,导入结果的统计信息。
    系统使用POI来处理Excel文件进行数据的读取。一个文件的导入流程如图4-8所示。
    为了防止Excel字段的变化导致无法正常读取的情况,使用一个额外的配置文件来将Excel中的字段名与对象的属性设计映射关系。先读取Excel对应字段的数据,然后通过字段名映射到对象的属性名,之后根据属性名调用对应的setter方法,通过反射动态生成对象并存储到List中,所有数据都读取完成后,将List中的数据保存到数据库。在保存数据到数据库的过程中,为了方便查看导入结果,加入了导入过程的统计信息,包含解析到的数据记录数,成功导入数据库的记录数,数据库已经存在而舍弃的记录数和导入失败的记录,以及失败的原因。当数据导入完成后将显示导入结果的统计信息。

    4.7 系统数据库设计数据库设计是系统设计中非常重要的一个环节,一个好的数据库的设计可以使得数据库有更好的读写性能,扩展性,保证数据完整性和数据一致性,提高数据库系统的吞吐量等优点。下面分别介绍数据实体关系和数据库表结构的设计。
    4.7.1 数据实体关系数据实体的关系可以用ER图来表示,系统主要表结构如图4-9。

    4.7.2 数据表结构设计系统主要表结构的主要字段如表4-1 至 4-3 所示:
    学生表用于存放学生详细信息。



    字段名
    数据类型
    是否为空
    描述




    Sid
    Varchar(20)
    NO
    学号


    Name
    Varchar(20)
    NO
    学生姓名


    Password
    Varchar(50)
    NO
    密码


    IdNumber
    Varchar(30)
    NO
    身份证号


    AvgScore
    Float(5,2)
    YES
    平均成绩


    Departmentid
    INT
    NO
    学院Id


    Majored
    INT
    NO
    专业Id


    Classid
    INT
    NO
    班级Id



    评教指标表用于评教表的管理。



    字段名
    数据类型
    是否为空
    描述




    Id
    INT
    NO
    评价表Id


    Type
    Varchar(20)
    NO
    类型


    Title
    Varchar(100)
    NO
    表名


    Note
    TEXT
    NO
    评教说明


    CrateDate
    DATE
    NO
    创建日期


    JsonString
    TEXT
    NO
    序列化字符串



    评教批次表用于存放批次的详细信息。



    字段名
    数据类型
    是否为空
    描述




    Id
    INT
    NO
    批次Id


    Name
    Varchar(20)
    NO
    批次名


    Season
    Varchar(100)
    NO
    学期


    BeginDate
    Date
    NO
    开始日期


    EndDate
    Date
    NO
    截止日期


    mtime
    DateTime
    NO
    最后修改日期


    stuAvgScore
    Float(5,2)
    YES
    学生评教师平均分


    teaAvgScore
    Float(5,2)
    YES
    教师评教师平均分


    teaStuAvgScore
    Float(5,2)
    YES
    教师评学生平均分



    4.8 本章小结本章主要介绍了可自定义评教系统主要功能和模块的详细设计,使用流程图来展示每个流程执行的过程,以及实现思路。最后通过对系统数据结构的分析和数据实体之间的关系来确定表结构的设计,使得接下来的系统实现能够顺利的进行。
    第5章 系统实现5.1 系统功能模块实现由于系统模块部分存在相似性,下面将介绍主要模块的实现界面,实现思路和部分关键代码。
    5.1.1 系统登陆系统登陆的界面如图5-1所示:

    系统登陆输入账号密码,如果尝试多次登陆还需要输入验证码。选择用户类型后可以登陆到系统。
    其中验证登陆部分代码如下:
    session.setAttribute("lastLoginTime",new Date().getTime()); //设置最后一次登录时间 Boolean skipVerify = (Boolean) session.getAttribute("skipVerify"); //是否需要输入跳过验证码 if(skipVerify==null){ //如果sessio已经失效说明不需要验证码了 skipVerify = false; } if(!skipVerify) { //如果需要检查验证码 //如果输入的验证码不正确 if(StringUtils.isBlank(verificationCode) || !verificationCode.equals(session.getAttribute("verificationCode") )){ model.addAttribute("error","验证码错误"); session.setAttribute("skipVerify",false); //需要验证码 return "index"; }}String type = user.getType(); //获取用户角色类型 UserType userType = UserType.toUserType(type); boolean loginSuccess = false;Cookie cookie = new Cookie("loginType",type); //记住用户角色信息 cookie.setMaxAge(365 * 24 * 60 * 60);response.addCookie(cookie); String viewName = "index"; user.setPassWordConvertMD5(user.getPassword()); //MD5加密密码 switch (userType){ case ADMIN: Admin a =adminService.login(user); if(a!=null){ session.setAttribute("admin", a); viewName="redirect:/admin/admin"; loginSuccess = true; } break; //省略其他角色登陆信息 default: logger.error("未知的登录角色! " + type); model.addAttribute("error","未知的登录用户的角色!"); return "index"; } if(loginSuccess) { List<Privilege> pList = privilegeService.findAllByUserType(userType); addPrivilege(session, pList); //权限信息放入session removeOtherUser(session, userType); //移除当前session中其他已经登陆的用户 session.setAttribute("userType",userType); //设置当前用户的类型 return viewName; //返回到用户主页 }else { model.addAttribute("error","用户名或密码错误"); return "index"; }
    5.1.2 评教指标管理评教指标列表如图5-2所示,可以对指标进行修改,删除和创建。

    点击新建评教指标可以跳转到添加评教表的页面,如图5-3所示。

    填写一个评教表完整的信息后,可以随意的添加和删除任一项内容,实现评教表的灵活和可自定义。同时在指定的位置添加输入提示,防止输入错误。
    5.1.3 评教流程下面从教师评价学生的角度来介绍系统评教流程的实现。
    当教师登陆后,可以选择评价相同课程组的课程,也可以选择对自己所授课程的学生进行评价。当教师选择评价学生的界面如图5-4所示:

    点击任意课程,下方将会显示选择该课程的所有学生列表,点击“去评价”可以对学生进行评价。评价表如图5-5所示:

    评价表填写完成后提交,系统会将评价表和评教结果保存到数据库中。评教完成后可以查看该学生评教结果,如图5-6所示:

    学生详情页面将会展示出学生基本信息,平均得分,各个学期得分统计,学期得分趋势图,和各批次的评教结果表等信息。
    5.1.4 数据导入数据导入的实现界面如图5-7所示。分别有课程信息,学生选课信息,教师信息和学生信息导入4种选项。以课程信息导入为例,将包含所有的课程信息的Excel文件上传后,课程信息将会被解析被保存到数据库中。如果上传文件过大,文件不是以.xls后缀结尾的文件,不是标准Excel 2003文件,Excel内容检测到不是课程信息,选择的学期和Excel文件中解析到的学期不一致等错误都会终止数据导入流程,并在前台展示出对应的错误信息。

    如果文件解析成功并在导入过程中没有发生错误,页面会跳转到导入结果页,展示导入过程中的各项统计数据,如图所示:

    5.2 安全和稳定性实现5.2.1 数据效验数据校验是指通过一定的规则对前台传递参数的合法性进行检验的过程。不合法的数据将会导致数据不完整,也有可能导致系统出错。保存合不合法的数据到数据库中是没有意义的。一个合格的接口总应该假设输入的参数可能是非法的,而不是默认输入参数就一定是正确的。用户的输入也总是千奇百怪的,没有充分的数据效验将会使运行时产生许多问题。
    数据效验体现在前端的表单效验和后端程序的效验。本系统前端的表单效验使用的JQuery Validation,通过在页面编写JS代码或者在HTML标签内使用效验参数等方法实现表单效验[13] 。如图5-9 是修改密码页面数据效验的示例:

    页面使用Js效验代码的代码如下:
    $(function() { $("#form1").validate( rules:{ oldPwd: {required:true}, pwd: {required:true, minlength:3}, pwd2: {required:true, equalTo:"#pwd"} }, messages:{ oldPwd: {required:"请输入原密码"}, pwd: {required:"请输入新密码", minlength:"至少输入3个字符" }, pwd2: {required:"请输入确认密码", equalTo:"两次密码必须相同" } } }); });
    如果只进行前台数据效验而不进行后台数据效验,那么正常用户操作是不会引发错误的,但是如果用户伪造HTTP请求,传递不合法的参数,这样后台就需要进行数据效验。后台主要效验的内容有:参数是否为空,字符串是否空串,字符串长度是否超过数据库数据字段类型长度,整数是否小于等于0,时间格式是否合法等。完善的数据效验可以增加系统的安全性和稳定性,是必须要重视的。
    5.2.2 XSS漏洞攻击防范XSS(Cross Site Scripting),叫做跨站脚本攻击,是通过在请求参数中插入恶意可执行脚本,实现对用户游览器的劫持控制[14] 。例如表单数据插入类似“<input/>”的代码发送到数据库,如果后台服务器不做任何处理就存入数据库,那么当数据在前端加载的时候就会被当成JavaScript脚本执行,并显示出HTML的输入框。通过这样的方法植入恶意代码,就可以达到攻击的目的。
    通过对前端所有数据的参数就都进行HTML和JavaScirpt代码的转义处理,这样数据库就会以“<input\/&gt”的形式存储。再传送到前端展示的时候,就可以显示成文本<input/>的形式而不是一个输入框。这样就可以达到防止XSS漏洞攻击的目的。
    但是如果我们在控制器的每个方法中都加入这样转义代码,将会导致代码重复。通过Spring提供的Converter服务,可以实现一个从String到转义后String 的一个StringConverter类,如下所示:
    public String convert(String text){ text = StringEscapeUtils.escapeHtml4(text); text = StringEscapeUtils.escapeEcmaScript(text); return text;}
    然后将该转换器注册到Spring的数据转换服务中。
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.tqe.base.converter.StringConverter"/> </set> </property></bean>
    通过这种方法就可以完成了系统全局的转义工作,防止了XSS的攻击。
    5.2.3 并发访问对一个系统而言,并发访问会给系统带来极限压力,并且能出现未知的异常。随着使用人数的增加,同一时刻如果大量的涌入用户将会导致系统响应慢,系统不稳定,产生并发错误,严重时可能会导致服务不可用。下面给出一些并发性能问题的一些解决方法:
    使用CDN加速,将静态资源缓存在离用户最近的服务器节点上,减少服务器处理HTTP静态资源所消耗的CPU和网络资源,可以有效避免网络拥堵,降低系统响应时间。
    使用负载均衡和服务器集群。负载均衡负责将请求通过一定的路由算法将客户端请求分发到指定的服务器上来继续处理请求从而解决低单台服务器的单点问题和负载过大的问题。使用负载均衡理论上可以线性扩展系统服务的吞吐量,但是需要考虑数据库高负载时对数据库的优化策略,例如读写分离,分库分表,使用缓存服务器等手段。
    此外,在代码上进行性能优化可以大大的降低并发访问带来的性能问题,例如分散数据请求的时间,使用消息队列,缓存,充分利用多线程等[15] 。
    5.3 系统测试对任何系统而言,测试都是必不可少的环节,测试可以发现系统存在的很多问题,所有的软件上线之前,都应该进行充足的测试之后才能保证上线后不会Bug频发,或者是功能不满足需求等问题的发生。下面分别从单元测试,功能测试和用例测试来对系统进行测试以保证系统的稳定性和可靠性。
    5.3.1 单元测试一个合格的程序员都应该进行单元测试,单元测试是从开发者的角度对程序代码正确性的一种测试[16] 。传统的单元测试都是根据系统模块的划分,分别测试每个独立模块或方法的正确性,通过输入和输出来检测模块是否正常运行。通常,在每一个新的版本发布前,都需要进行一次完整的单元测试,以保证新添加的功能和特性是正确的,并且没有影响到已完成模块的正常运行。
    Junit是JavaWeb项目使用最广泛的单元测试工具。在Spring环境中,通过Spring Test和 Junit4的集成使用可以避免多次初始化Spring容器,对控制层代码无法测试等问题。一个测试基类的代码如下所示:
    @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:applicationContext-test.xml")public class BaseTest {}
    通过继承测试基类,就可以使用Spring提供的AutoWired注解来注入Controller,Service,Dao等组件进行单元测试。测试成功时代码如图5-10所示:

    5.3.2 功能测试功能测试是指使用黑盒测试的方法,在不考虑程序内部实现的情况下,根据功能需求来对程序的接口进行测试。通过设计完整的测试用例,例如对表单输入非法字符,过长字符,验证系统功能是否完整,边缘测试等手段对系统功能进行验证,保证系统的可用性。
    同时对于系统环境的测试,使用云虚拟机和本地服务器两套环境进行测试,发现在不需要修改程序代码的基础上,系统能够安全,稳定的运行在两套环境中,保证了系统的可移植性。
    5.3.3 性能测试使用阿里云PTS(Performance Testing Service)性能测试服务对线上系统进行压力测试。线上服务器环境为:1核心CPU,1G内存,1Mbps公网带宽,Centos7.0操作系统。
    下面介绍测试过程中常用的指标:

    TPS(Transaction Per Second):每秒事务数,表示系统每秒能够处理的交易或事务的数据
    响应时间:指的是从客户端发出请求到后端响应所用的时间,由请求发送时间、网络传输时间和服务器处理时间三部分组成
    并发用户数:是指实际在线,并一定会对系统产生压力的用户数,通常比在线用户数要少的多

    压测过程中使用了2台并发机器,每台机器20个用户并发,对系统主页,登陆,学生查询和课程查询等模块进行并发访问,得到的测试结果如图5-11所示:

    测试结果是有40个用户并发时,课程管理相关页面的响应时间甚至达到了7s,通过查看服务器出网流量发现已经达到1381kb/s,可以看出服务器的带宽已经达到峰值,如果系统使用5Mbps的带宽,系统的响应时间和TPS将会大大增加。在整个测试的过程中,CPU的使用率占用仅8%,也提现出带宽瓶颈对系统的影响非常严重。
    通过将带宽升级到5Mbps,在相同用户并发数下继续进行压力测试,得到的结果如图5-12,5-13所示。同样是40个用户并发,系统的TPS已经平均达到了12/s,即便是数据库查询较多的课程管理模块,平均响应时间也已经达到了1.5s,而这时系统的CPU占用率仅为20%,带宽为4984kb/s,已经达到了峰值,可以看出,继续提高带宽继续提高系统并发用户数。
    TPS压测结果图

    系统响应时间测试结果图

    通过压力测试,可以及时的预测系统可能会发生的异常情况,找到影响响应时间过高的瓶颈原因所在,及时的进行系统调优,可以提高系统性能和稳定性,提升用户体验。
    5.4 本章小结本章介绍了系统主要模块的实现方法和部分关键代码,充分展示了系统的完整性,基本符合了系统需求。除此之外,还讨论了系统的安全性和并发访问的实现可以使得系统更加健壮。最后,通过详细的测试,验证了系统的可用性,同时对测试过程中系统出现的问题,能够得到及时的解决,使得系统更加的完善。
    结 论为了能够提高教学质量,及时准确的反馈教师教学过程中存在的问题,设计和开发了可自定义评教系统。系统的具有安全,稳定,低成本,可扩展等特点,从测试和使用情况看,基本满足了需求设计的需要。
    本文主要从需求分析,系统设计和系统实现三个方面来讨论具体的设计和实现的细节,使用用例图,ER图,流程图等工具直观的说明了系统设计的思路和步骤。通过对稳定性,扩展性,数据库设计和系统优化多方面的讨论也使得系统架构设计的更加合理,不仅达到了的上线运行的要求外,还能够对以后可能改变或增加的需求得到及时的扩展和实现。
    当然,系统也存在着一些不足之处,还需要在以后工作中逐渐的改善,从而使系统发挥更重要的作用。能够提升和优化的地方还有:在系统结构上,应该还有更好的解决方法或是设计模式的应用可以充分的提高系统的性能和扩展性。用户体验的提升是一个循循渐进的过程,通过后续反馈的信息对系统的持续改可以使得系统更加简单,易用。同时数据统计的展示还是相对单一的,如何通过更加科学合理的设计数据统计方法,形象直观的展示数据统计结果,提高反馈教学效果等问题还需要进一步的探索和完善。
    评教系统的好坏在很大程度上影响了学校教学质量的改善,通过科学的,准确的,及时的对教学工作进行跟踪和评价,能充分的反映出教学过程中出现的问题,同时优秀的教学方法也能够快速的得到体现,这些信息为寻找和探索更好的教学管理方法提供了支持。所以说,科学的评教管理系统的普及是势在必行的。
    参考文献[1] 教育部. 关于全面提高高等职业教育教学质量的若干意见. 中国职业技术教育, 2007(1):14-15.
    [2] 罗漪. 大学生网上评教体系优化的研究. 江西师范大学, 2013.
    [3] 韩园园. 大学生利用网络评价教师课堂教学的研究. 南京师范大学,2006.
    [4] 解建立, 张倩. 大学生网上评教问题研究——基于S市部分高校调查 . 河北企业, 2015(6):130-131.
    [5] 黄建军, 黄继东, 尹加帮,等. 美国、加拿大和日本高校学生评教的特点与启示. 医学教育探索, 2010, 09(5):621-625.
    [6] 邢永富, 常瑾. 国外知名高校学生评教工作述评与启示——以四所名校为例. 宁波大学学报:教育科学版, 2011(1):59-63.
    [7] 孙朝云, 张羽. 基于B/S结构网上评教系统设计与实现. 计算机应用与软件, 2012, 29(3):183-186.
    [8] 李海海. 基于Spring框架的高校招生管理系统的设计与实现. 湖南大学, 2015.
    [9] 李刚. 轻量级Java EE企业应用实战. 电子工业出版社, 2011.
    [10] 计文柯. Spring技术内幕:深入解析Spring架构与设计原理(第2版). 机械工业出版社, 2012.
    [11] 姜承尧. MySQL技术内幕. 机械工业出版社, 2013.
    [12] 阙丽平. 福建经贸学院教师考评系统设计与实现. 电子科技大学, 2014.
    [13] 单东林 张晓菲 魏然. 锋利的JQUERY. 人民邮电出版社, 2009.
    [14] Martin M, Lam M S. Automatic Generation of XSS and SQLInjection Attacks with Goal-directed Model Checking Usenix SecuritySymposium, July 28-August 1, 2008, San Jose, Ca, Usa. 2008:31-44.
    [15] 闫新. 基于WEB的教学评价系统设计与实现. 电子科技大学, 2014.
    [16] Beck K, Gamma E. Test-infected: programmers love writing tests More Java gems. Cambridge University Press, 2010:357-376.
    [17] Gupta P, Govil M C. Spring Web MVC Framework for rapid open source J2EE application development: a case study. International Journal of Engineering Science & Technology, 2010, 2(6).
    0 评论 5 下载 2019-09-08 16:22:37 下载需要20点积分
  • 基于python的B站弹幕数据分析(爬虫+可视化)

    python—B站弹幕数据分析1 背景在视频网站上,一边看视频一边发弹幕已经是网友的习惯。B站就是其中一个比较出名的弹幕网站,许多年轻人都喜欢逛B站,看喜欢的动漫亦或某些UP主做的一些剪辑。本项目,就是对B站弹幕数据进行分析。选取分析的对象是B站上一部国漫《全职高手》。
    2 环境的安装本项目实在pycharm中实现,使用到的第三方库有requests,bs4,pandas,jieba.posseg,pyecharts。具体如何安装,百度都有详细的步骤,我在这里就不啰嗦了。
    3 相关代码代码实现3.1 爬虫部分在《全职高手》动漫的播放页查看网页源码,找到cid

    因为b站需要通过格式为:”https://api.bilibili.com/x/v2/dm/history?type=1&oid={}&date=2018-{}-{}“ 的链接获取弹幕历史文件,所以我们到时候可以通过url拼接,来爬取我们想要的具体哪一天的弹幕。
    存放B站弹幕的是网站是xml格式的,如下图所示

    其中每个字段都有对应的含义:

    第一个参数是弹幕出现的时间以秒数为单位
    第二个参数是弹幕的模式1..3 滚动弹幕 4底端弹幕 5顶端弹幕 6.逆向弹幕 7精准定位 8高级弹幕
    第三个参数是字号, 12非常小,16特小,18小,25中,36大,45很大,64特别大
    第四个参数是字体的颜色以HTML颜色的十进制为准
    第五个参数是Unix格式的时间戳。基准时间为 1970-1-1 08:00:00
    第六个参数是弹幕池 0普通池 1字幕池 2特殊池【目前特殊池为高级弹幕专用】
    第七个参数是发送者的ID,用于“屏蔽此弹幕的发送者”功能
    第八个参数是弹幕在弹幕数据库中rowID 用于“历史弹幕”功能

    遍历爬取弹幕历史文件,存入csv中,保存格式为:[‘弹幕出现时间’, ‘弹幕格式’, ‘弹幕字体’, ‘弹幕颜色’, ‘弹幕时间戳’,’弹幕池’,’用户ID’,’rowID’,’弹幕信息’]

    3.2 可视化部分保存了所有数据之后,先对数据进行处理:先读取csv文件,再进行可视化分析
    每一集弹幕总量变化—折线图:逐个读入弹幕历史文件:d1.csv,d2.csv,……经过去重后,统计出每集的弹幕总量:
    data = pd.read_csv(path.strip(),encoding='gbk',engine='python')
    统计每一集的弹幕总量,存放在字典中
    episode_comment_dic[i] = every_episode_comment(data)
    之后便进行可视化绘图了
    def every_episode_comment_change(episode_comment_dic):line = pyecharts.Line("每一集弹幕变化总量",'2018-12-27',width=1200,height=600) keys = [] values = [] for i in episode_comment_dic: keys.append("第%d集" % i) values.append(episode_comment_dic[i]) '''每一集弹幕总量的折线变化图''' line.add("每一集弹幕总量的折线变化图",keys,values) es = pyecharts.EffectScatter() es.add("",keys,values) overlap = pyecharts.Overlap() overlap.add(line) overlap.add(es) return overlap
    发送弹幕总量TOP5用户:1.统计每一集弹幕数量,把用户排序,每一集排序后的结果都是一个DataFrame, 结果的大致结构:user_sort_dic = {1: DataFrame1, 2:DataFrame2, ……,12: DataFrame12}。
    '''每一集用户发送弹幕数量排序''' def every_episode_usersort(data): df = data.drop_duplicates() dd = df.groupby("用户ID").count() user_sort = dd.sort_values(by = '弹幕信息',ascending=False).loc[:,['弹幕信息']] return user_sort
    用户发弹幕长度分布,统计发送弹幕的字符串长度:

    用户发弹幕数量分布,统计一集,用户发送弹幕数量的百分比分布图。
    user_sort_dic[i] = every_episode_usersort(data) '''统计用户发送弹幕数量的百分比分布图''' for i in user_sort_dic: d_tmp = user_sort_dic[i] pie = every_episode_barrage_pie(d_tmp,i) timeline1.add(pie,i) del d_tmp
    每集弹幕密度变化图:每个弹幕都有一个时间参数,代表了用户在视频的什么时间发了弹幕。所以我们可以统计出在相同时间参数发出的弹幕量,然后再画出“时间—弹幕数量”折线图,就可以看到弹幕量的变化了。
    词云图:对所有的弹幕文本进行分析。先用jieba词库进行分词,然后逐行对弹幕进行词频统计,最后用pyecharts的WordCloud画出词云图,wordcloud = pyecharts.WordCloud(“全职高手-词云图”)

    3.3 统计结果全职高手动漫12集用户发送弹幕条数饼图—轮播:

    每一集弹幕总量的变化:

    每一集用户发送弹幕的字数饼图—轮播:

    12集用户发送弹幕总量排名—直方图:

    一集视频中用户发送的弹幕密度图:

    12集动漫的词云图:

    3.4 结果分析通过以上的图表数据可以看出用户的弹幕的一些行为。
    12集剧里,第一集,第二季和最后一集,弹幕数量是最多的,说明这部动漫刚上线的时候关注度还是很高的,之后的弹幕数量不高可能是因为剧情发展比较平稳,最后一集弹幕数量又多了起来,说明动漫结束,用户们都纷纷发表感慨,从词云中的‘散场’也可看出。
    统计了12集的弹幕,用户ID为5ff19abd的用户共发送了480多条弹幕,算是超级粉丝了。
    通过弹幕数量和长度的分布,可以看出:绝大部分用户只会发送2条以内的弹幕。参与弹幕讨论的用户以10个字符以内的短语为主。
    统计每一集的弹幕密度,可以通过用户观看时的讨论,大致确定视频的精彩点。
    通过词云图,可以大致看出用户的分布。例如‘散场’作为热词显示里。说明许多用户都为动漫的结束发表感慨。
    4 总结因为绘制热词云图的代码运行太久了,所以本实验的词云图只截取了某些天的弹幕,或许可以引入多线程使程序效率更高。因为B站的网页是动态的,当时做爬虫的时候准备用webdriver,无奈环境搞不会,放弃了。本项目还是有许多缺陷的,当时做的时候借鉴了一篇博客,又把它给改进了一下,然后才实现出了该项目。(大三上python数据分析大作业,本人很菜,不完全原创,内有许多不足。)
    4 评论 89 下载 2018-12-31 15:39:20 下载需要3点积分
  • 基于JSP的车险模拟系统的设计与实现

    摘 要随着科技的发展和时代的进步,使用管理系统来提高工作效率成为各大企业的选择。一个保险企业在日常经营中,如果采用传统的人工管理方式去管理大量的客户和保单信息,往往会造成工作挤压和员工情绪不满的现象。车险管理系统的出现,解决了以往保单理赔审核复杂的问题,公正、客观、快捷地对客户的保单进行管理,实现以人为本的管理战略,提高保险管理工作的效率。
    本文提出的车险管理系统基于B/S模式开发,根据数据建模,结合车险保单理赔管理的实际需求,设计系统架构。后端采用Java技术,选择关系型数据库MYSQL进行信息存储。本系统经过严格的功能性测试,取得了良好的运行效果。系统实现了客户管理,保单管理,理赔,保单情况统计等功能。车险管理系统的实施,满足了用户需求,在实际工作中逐渐完善,对车险管理效果有了显著改善。
    关键词:车险管理;JSP;数据库;B/S模式;Java
    AbstractWith the development of technology, major enterprises have chosen management system to improve working efficiency. If we use traditional manual method to manage large quantities of client and policy information, it will cause work squeeze and dissatisfaction of employees in daily life. The use of vehicle insurance management system has solved the problems of complex claims in the past. It can help manage the policies more fairly, objectively and quickly. It will also realize the people-oriented management strategy and improve the efficiency of insurance management.
    The vehicle insurance management system proposed in this article is based on B/S mode. The system is designed according to data modeling and combined with the actual demand of policy claims in vehicle insurance. The back-end adopts Java technology and chooses MYSQL which is a relational database to store information. This system has passed the strict function test and obtained the good running effect. The system achieves the function of customer management, policy management, claims, policy statistics and so on. The implementation of the vehicle insurance management system has met the needs of users and gradually improved in the actual work. It has also significantly improved the effect of vehicle insurance management.
    Key words: Vehicle insurance management; JSP;Database;B / S structure;Java
    一、绪论1.1 选题背景近年来,随着我国汽车行业的快速发展,我国汽车生产和销售量已经连续三年位居世界第一。在汽车产业迅速发展的同时,我国的汽车保有量随之迅猛提升,截至2018年6月,中国已经成为仅次于美国的世界第二大汽车拥有国。随着中国汽车市场的日益火爆,与之密不可分的车险市场也快速发展起来。近年机动车辆保险已经逐步发展成我国财产保险市场需求量最大的险种。车险管理系统的出现可以帮助各大保险公司更有效地保存客户的数据,为公司的业务管理带来巨大的便利。
    1.2 国内外现状从上世纪末开始,汽车保险在全球范围内都是财产保险的第一大险种,并一直保持高增长率,同时,中国的汽车保险业务进入了高速发展的时期,各大保险公司纷纷推出了各种类型的车险。随着时代的进步,国外的保险公司率先开启电子保单的管理,渐渐国内的保险公司渐渐从开始的纸质化保单过渡到电子保单的管理。车险管理系统主要用来帮助保险公司进行专业的保单管理,公司可以通过无纸化操作来按照客户的需求对每份保单进行创建及一系列的修改,既方便了公司的业务管理工作,又方便客户线上提出理赔,能让顾客得到更高效的服务。
    1.3 目的及主要研究内容本文研究目的在于分析并设计一个模拟车险管理系统来帮助保险公司提高工作效率,更便捷地管理客户的保单数据。并且可以让客户也登录系统,查看自己的个人信息及保单信息,提出取消保单和理赔申请。本文计划首先进行需求分析,确定系统想要实现的功能,分析可行性,确定所需的技术架构,然后逐步完善系统。
    1.4 本论文主要工作与章节安排
    第一章:本章主要介绍了本篇论文的选题背景,国内外现状,主要研究内容以及章节的安排
    第二章:本章主要介绍了本系统所运用的相关技术,对所采用技术进行了简单的说明
    第三章:本章主要介绍了系统的分析及设计,叙述了系统拟实现的模块功能,简述了系统的技术架构及数据库的主要设计逻辑,并且进行了可行性分析。
    第四章:本章主要介绍了系统实现的过程,具体介绍了系统各个模块的功能,包括管理员登录和客户登录两大部分
    第五章:本章主要介绍了所进行的系统测试过程,保证了系统能够顺利运行并实现拟实现的功能
    第六章:本章是本文的总结与展望,总结了实现本系统及完成本论文的心得,并表达了对未来学习及工作的展望与期待

    二.相关技术概述2.1 B/S架构B/S架构的中文全称为浏览器和服务器架构模式。它是继Web兴起后的又一种网络体系结构模式,其中Web浏览器是客户端的主要应用软件。B/S架构是以服务器为核心的系统,将客户端统一,并简化了系统的开发、维护和使用。客户端上只安装了一个浏览器,如Google或Internet Explorer,服务器上安装了Oracle、MySQL或SQL Server。浏览器在此模式下通过Web服务器和数据库发生关联,这种操作模式简化了客户端的负载,大大降低系统维护和开发的成本以及工作人员的总体工作量。
    2.2 HTML语言及CSS样式表HTML是超文本标记语言,是一种在标准通用标记语言下的应用。它也是用来标记网页的是一种标准和规范。HTML语言类似于在一个文本文件中添加标记,然后浏览器识别到这些标记后就能在网页上显示其内容。
    CSS样式表,是可以与HTML语言组合使用的一种语言,其中文名为层叠样式表。CSS通常可以用来静态地修改网页,稍复杂些CSS还可以动态地格式化网页元素,这需要使用各种脚本语言来实现。CSS的优点在于可以近似于像素级别地精确控制网页中元素的位置,支持几乎所有字体大小的样式,并且能够编辑Web对象和模型样式。
    2.3 Java语言Java是面向对象的编程语言。Java语言在囊括C++优点的同时,也淘汰了C++语言中比较难以理解的多继承和指针的概念。因此,Java语言具有功能强大、使用方便的特点。Java语言将面向对象的编程语言以静态方式完美实现,让程序员在编程过程中能够条理清晰的写出解决问题的方法。
    2.4 JSPJSP全名为Java Server Pages,中文名称是Java服务器页面。它基本上是一个简化的Servlet设计。它将类似HTML的标记写在Java编程语言中,进行包装处理逻辑生成动态网页。用户也可以通过网页的标记和脚本来访问服务器的现有资源。JSP实现了页面逻辑和显示的分离,使基于Web的应用程序开发起来更加快捷方便。
    2.5 My EclipseMy Eclipse是加入插件开发的一个基于Eclipse的功能强大的集成开发环境,它主要是为Java,Java EE和移动应用的发展而出现。My Eclipse可以支持Java Servlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC数据库链接工具等多项功能。
    2.6 MySQLMySQL是Oracle旗下的一个关系型数据库管理系统,该系统将数据存储在不同的表中,提高速度和灵活性。MySQL具有开放源码的特点,因此一般是中小型系统开发中较常用的一种数据库技术。
    三.系统分析与设计3.1 需求分析及设计3.1.1 管理员登录

    客户信息模块:本模块可以添加新的客户,查看/编辑/删除已有客户的信息
    添加保单模块:本模块可以选择客户进行添加保单操作,输入车辆信息,选择险种,输入保金,生效期和失效期(保期为一年),并完成保单
    查询保单模块:本模块可以通过输入客户的身份证号码查询出客户的个人信息及保单信息
    取消保单模块:本模块可以看到客户提出的取消保单申请,输入需要退回的保费,成功完成取消保单操作
    理赔模块:本模块可以看到客户提交的理赔申请,进行受理,同时回复赔偿金额,完成理赔操作
    保单情况统计模块:本模块可以能统计出什么牌子的车投保次数最多,理赔次数最多,便于保险公司进行数据统计

    3.1.2 客户登录

    修改登录密码模块:在本模块客户可以进行修改登录密码操作
    客户信息模块:在本模块客户可以看到自己的个人信息,并且允许进行修改操作
    保单信息模块:在本模块客户可以查看自己的保单信息,也可以提出取消保单申请,如果管理员批准取消成功,客户可以看到退回保费的情况
    理赔页面模块:在本模块客户可以进行理赔操作,包括选择报案时间,理赔项目,添加附件(可以上传照片),而且同时也可以看见已提交理赔的受理情况及回复的赔偿金额
    理赔范围介绍模块:在本模块客户可以查看现有的7个险种(交强险,第三者责任险,车损险,盗抢险,不计免赔险,玻璃险,座位险)的理赔范围

    3.2 总体方案3.2.1 技术架构
    车险管理系统拟使用面向对象开发方法,运用Java技术和MYSQL数据库制作。本系统使用MVC结构开发,可以大大缩短开发进程,这种架构在运行方面也很优秀,速度也比较快,主要包括View、Controller、Model层。
    View层提供了用户接口,使用CSS/JSP等技术制作,通过HTTP发送请求给Controller层,并得到POST的响应后,通过JSP方法或者Java标签显示到界面列表。
    Controller层处理前端发送来的请求,使用过滤器处理拦截信息,通过XML配置文件进行路由转发,寻找到对应的业务层的具体处理事件,完成业务逻辑。注入搭配AOP中,进行事务控制,根据权限信息完成操作,并记录操作日志。
    通过Controller层注入方法,提供数据流处理,通过Hibernate实现持久化对象操作,完成数据存储,再返回数据流到业务逻辑层。
    3.2.2 数据库设计本系统共设计了5个表,分别为用户表(t_admin),客户表(t_kehu),保单表(t_baodan),保单细节表(t_baodandetail),理赔表(t_lipei)。
    用户表(t_admin)
    用户表共有3个字段,userId,username,userPw,如表1所示:



    序号
    字段名称
    说明
    数据类型
    是否主键
    长度
    可否为空




    1
    userId
    用户ID号
    int

    11



    2
    username
    用户姓名
    varchar

    50



    3
    userPw
    用户密码
    varchar

    50




    客户表(t_kehu)
    客户表共有11个字段,kehu_id,kehu_name,kehu_sex,kehu_age,kehu_xueli,kehu_zhiwei,kehu_address,kehu_tel,kehu_email,kehu_login_Pw,type如表2所示:



    序号
    字段名称
    说明
    数据类型
    是否主键
    长度
    可否为空




    1
    kehu_id
    客户ID
    int

    11



    2
    kehu_name
    客户姓名
    varchar

    50



    3
    kehu_sex
    客户性别
    varchar

    50



    4
    kehu_age
    客户年龄
    int

    11



    5
    kehu_xueli
    客户学历
    varchar

    50



    6
    kehu_zhiwei
    客户职位
    varchar

    50



    7
    kehu_address
    客户地址
    varchar

    50



    8
    kehu_tel
    客户电话
    varchar

    50



    9
    kehu_email
    客户邮箱
    varchar

    50



    10
    kehu_login_Pw
    客户密码
    varchar

    50



    11
    type
    客户身份证
    varchar

    50




    保单表(t_baodan)
    用户表共有9个字段,id,kehuID,kehuName,baodanName,kaishishijian,jieshushijian,chepai,qicheppai,qichexinghao,如表3所示:



    序号
    字段名称
    说明
    数据类型
    是否主键
    长度
    可否为空




    1
    id
    保单ID(按客户)
    int

    11



    2
    kehuID
    客户ID
    varchar

    255



    3
    kehuName
    客户姓名
    varchar

    255



    4
    baodanName
    保单名称
    varchar

    255



    5
    kaishishijian
    开始时间
    varchar

    255



    6
    jieshushijian
    结束时间
    varchar

    255



    7
    chepai
    车牌号码
    varchar

    255



    8
    qicheppai
    汽车品牌
    varchar

    255



    9
    qichexinghao
    汽车型号
    varchar

    255




    保单细节表(t_baodandetail)
    保单细节表共有5个字段,id,baodanID,baodanName,leixing,je,如表4所示:



    序号
    字段名称
    说明
    数据类型
    是否主键
    长度
    可否为空




    1
    id
    保单ID(唯一)
    int

    11



    2
    baodanID
    保单ID(按客户)
    varchar

    255



    3
    baodanName
    保单名称
    varchar

    255



    4
    leixing
    险种
    varchar

    255



    5
    je
    金额
    double

    255




    理赔表(t_lipei)
    用户表共有8个字段,id,kehuname,shenfenzheng,riqi,xiangmu,fujian,lipeiqingkuang,jine,如表5所示:



    序号
    字段名称
    说明
    数据类型
    是否主键
    长度
    可否为空




    1
    id
    理赔ID
    int

    11



    2
    kehuname
    客户姓名
    varchar

    255



    3
    shenfenzheng
    身份证号码
    varchar

    255



    4
    riqi
    日期
    varchar

    255



    5
    xiangmu
    理赔项目
    varchar

    255



    6
    fujian
    附件
    varchar

    255



    7
    lipeiqingkuang
    理赔情况
    varchar

    2550



    8
    jine
    金额
    varchar

    255




    3.3 可行性分析3.3.1 技术可行性此系统拟采用B/S结构,与C/S结构相比更加简化,开发、维护等核心工作集中在服务器端执行。Java语言较其他语言更加稳定可靠,可以避免许多编程错误。
    3.3.2 经济可行性开发过程使用现有的开发环境,只需一台PC机就可完成开发。使用时在浏览器打开网址就可使用系统。
    3.3.3 社会可行性此系统作为课题研究使用,不涉及任何盈利行为,且所有过程不涉及任何知识产权问题。
    四.系统实现4.1 登录页面设计设置Tomcat服务器后,运行系统。车险管理系统需要先登录后才能进行操作。登录界面是系统运行后的第一个界面。输入用户信息后点击确定后进行登录,这里会进行密码的校验,若输入密码不正确会给出警告,直到输入正确的密码才能成功登入系统。
    程序运行效果图如图4所示

    输入正确的用户名和密码后,点击登录,页面跳转到管理主界面。在主界面中,可以进行一系列的操作。
    登录界面使用div和html进行布局,用户名和密码等输入项为表单,输入信息后,后台可以获取表单value值,通过获取的界面信息进行数据库查询操作。
    管理员登录中,通过点击button按钮,调用check1方法,通过IF判断用户名和密码是否输入,后调用loginService.login的方法,进行数据库查询,返回是或者否。
    4.2 管理员登录后的页面4.2.1 管理员登录后的首页系统通过登录验证后,页面跳转到主界面,界面有导航菜单,包括密码修改,客户管理,保单管理,保单取消,理赔管理,保单情况统计这六大模块,点击每个菜单可以进入相应的界面。
    程序运行效果图如图6所示

    车险管理系统的用户角色不同,对应的菜单也不相同。菜单由两个div组成,用户登录后,把用户角色保存到session服务器对象中,菜单页面通过读取权限信息,判断对应的登录用户显示哪个div,即可控制用户权限。
    主界面的框架由frameset组成,frameset有多个属性,可以设置frameset的边框,是否可以滚动以及name。在点击菜单链接后,通过设置target=’main’来控制对象显示到什么位置中。管理系统的后台一般都是有这种frameset控制,方便制定整体的界面风格,减少开发工作量。
    4.2.2 修改登录密码管理员成功登录系统之后,点击左侧菜单“修改登录密码”,系统跳转到修改登录密码子界面,在这里需要输入正确的原密码和设置新密码,才能实现修改操作,若输入的原密码不正确,会给出警告“输入的密码不正确”。
    程序运行效果图如图7所示

    4.2.3 客户信息管理在此页面添加客户信息,其中用户名,密码,姓名,性别,年龄,身份证号码为必填项,如果不填写就提交会进行校验,提示必须输入。其他学历,职位,住址,tel,email为选填项,不填写也可以提交。
    程序效果图如图8所示

    管理员点击左侧的菜单“客户管理”,页面跳转到客户管理界面,这里显示了所添加客户的个人信息。在右侧有删除和编辑按钮,可以删除该客户,也可以对客户信息进行修改。在下方有添加客户的button,可以添加新的客户,还有导出Excel的功能,可以将现有客户的个人信息导出至Excel表格中。
    程序效果图如下图9所示

    点击客户查询,可以通过输入客户姓名查询到客户的个人信息,在查询页面也可以对客户信息进行编辑,删除,添加以及导出Excel文件。
    程序效果图如下图10所示

    4.2.4 保单信息管理在此页面添加保单信息,包括填写或选择客户名称,车牌,汽车品牌,汽车型号,总金额,开始生效日期等,其中在开始生效日期默认为当前日期,旁边有写明,有效期为一年。
    程序效果图如图11所示

    管理员点击客户信息列表的“保单管理”,页面跳转到保单信息管理界面,这里展示了客户的姓名,身份证号以及保单车辆的信息。上方有一个查询功能,可以通过客户的身份证号码查询到保单信息,右边有修改和删除button,管理员可以修改和删除保单。用红字标出的是添加明细功能,在这里可以选择需要添加的险种以及具体险种的金额,当添加的险种的总金额大于保单总金额时会发生校验提示错误。
    程序效果图如下图12所示

    4.2.5 取消保单管理员在这里可以看到客户的部分信息,保单信息,和客户提出的取消保单申请,上方有一个查询功能,可以通过客户的身份证号码查询到保单信息,红色字体标出的查看明细可以查看到保单的具体信息。右方的取消保单button可以对客户提出的取消申请进行同意,之后保单状态会变为取消成功。
    程序效果图如下图13所示

    4.2.6 理赔管理管理员点击左侧的菜单“理赔管理”,页面跳转到理赔信息管理界面,管理员可以看到客户提出的理赔申请,包括客户的部分信息和车辆的理赔信息,上方有一个查询功能,可以通过客户的身份证号码查询到保单的理赔信息,红色字体的预览可以看到客户上传的事故照片,右边的事故理赔button可以对理赔进行处理,回复赔偿金额。
    程序效果图如下图14,15所示


    4.2.7 保单情况统计在这里可以显示保单的情况统计以及理赔的情况统计,可以看到每种车型的添加保单和理赔的数量,可以方便保险公司分析数据。
    程序效果图如图16所示

    4.3 客户登陆后的页面4.3.1 客户登录后的首页系统通过登录验证后,页面跳转到主界面,界面有导航菜单,包括我的资料,我的密码,我的保单,理赔管理,理赔范围介绍这五大模块,点击每个菜单可以进入相应的界面。
    程序运行效果图如图17所示

    4.3.2 我的资料修改首先客户输入自己的姓名及密码登录,在此可以修改个人信息并保存。
    程序效果图如下图18所示

    4.3.3 我的密码修改客户可以修改自己的登录密码,在这里需要输入正确的原密码和设置新密码,才能实现修改操作,若输入的密码不正确,会给出提示“密码不正确”。
    程序效果图如下图19所示

    4.3.4 我的保单情况客户在这里可以看到自己的部分个人资料及保单信息,右方红字的保单明细查看里客户可以看到保单的具体所加险种和金额。
    程序效果图如下图20所示

    客户在这里可以看到自己的保单信息,红色字的保单明细查看里客户可以看到保单的具体所加险种和金额,右方的取消保单button可以对保单提出取消申请。
    程序效果图如下图21所示

    客户提出取消保单的申请后,在这里可以看到自己的保单是否成功取消以及具体的退款情况,红色字的保单明细查看里客户可以看到保单具体所加的险种和金额。
    程序效果图如下图22所示

    4.3.5 理赔管理当发生事故,需要进行理赔申请时客户在这里可以上传事故的具体原因,发生日期,还可以上传事故图片,当管理员登录系统时能看见客户上传的事故图片。
    程序效果图如下图23所示

    客户在这里可以看到自己已经上传过的理赔申请,点击预览查看上传的事故图片,也可以修改或删除本条申请。
    程序效果图如下图24所示

    客户提出理赔申请后,在这里可以看到自己的保单是否成功受理理赔,若没有受理,理赔情况和理赔金额显示的是null,若成功受理则会显示管理员回复的具体理赔情况和金额,红色字的预览还可以查看上传的事故图片。
    程序效果图如下图25所示

    4.3.6 理赔范围介绍在这里客户可以看到保险公司提供的险种,包括交强险,第三者责任险,车损险,盗抢险,不计免赔险,玻璃险,座位险在内的7个险种,点击查看可以了解每项险种的具体理赔范围。
    五.系统测试进行车险管理系统的测试前,需要编写具体的测试用例,根据测试用例进行逐条测试,并记录测试结果,修正问题,完善功能。其中车险管理系统的部分测试用例如下。
    系统登录测试过程和预期结果,如表6所示:
    输入正确信息:用户名:1;密码:123456;选择角色:管理员输入错误信息:用户名:1;密码:111111;选择角色:管理员输入错误信息:用户名:2;密码:123456;选择角色:管理员输入错误信息:用户名:1;密码:123456;选择角色:客户输入错误信息:用户名:1;密码:123456;不选择角色点击登录,查询数据库,返回结果。
    打开数据库,查看返回的结果是否和数据库数据一致。
    预期结果:输入正确信息可以成功登录,输入错误信息提示无权限。
    测试结果:与预期结果一致,功能正确实现。
    添加客户测试过程和预期结果,如表7所示:

    点击客户录入页面链接,跳转到客户录入界面。使用多个浏览器进行操作
    不输入所有必填项,进行保存
    输入所有必填项,比对客户需求,查看是否都进行了相关验证
    保存信息到数据库中,查看数据库数据是否和录入的信息一致,包括默认值是否输入
    在客户信息列表中,读取到刚添加的客户信息

    预期结果:当不输入所有必填项时,给出warning提示必须输入此项;当输入所有必填项时可以成功添加客户,并保存到数据库,显示到客户列表。
    测试结果:和预期结果一致,功能正确实现。
    删除客户测试过程和预期结果,如表8所示:

    打开客户管理界面,通过查询所有客户信息,点击某条客户记录,进行删除操作
    提示是否确定删除后,点击确定,客户列表中,删除选择的记录
    查询数据库中客户数据,确认真实删除了该客户

    预期结果:可以成功删除客户,客户列表和数据库中均删除成功。
    测试结果:和预期结果一致,功能正确实现。
    编辑客户测试过程和预期结果,如表9所示:

    打开客户管理界面,通过查询所有客户信息,点击某条客户记录,进行修改操作
    跳转到客户编辑界面。使用多个浏览器进行测试,查看页面是否正确显示
    完成修改录入,点击提交数据
    保存信息到数据库中,查看数据库数据是否和修改的信息一致。列表是否更新

    预期结果:可以成功编辑客户,并保存到数据库,显示到客户列表。
    测试结果:和预期结果一致,功能正确实现。
    添加保单测试过程和预期结果,如表10所示:

    打开保单录入界面,填入所有保单信息,点击提交
    跳转到保单管理界面,有此保单信息
    保存信息到数据库中,查看数据库数据是否和添加的信息一致。列表是否更新

    预期结果:可以成功添加保单,并保存到数据库,显示到保单管理列表中。
    测试结果:和预期结果一致,功能正确实现。

    打开上传事故界面,填入所有事故发生日期,理赔项目,添加事故图片,点击提交
    跳转到事故列表界面,有此理赔申请信息
    保存信息到数据库中,查看数据库数据是否和添加的信息一致。列表是否更新

    预期结果:可以成功提出理赔申请,并保存到数据库,显示到事故列表中。
    测试结果:和预期结果一致,功能正确实现。
    六.总结与展望首先,我从专业实习中得到了本次系统设计的灵感,我实习的项目是越南GIC保险公司的车险项目,于是我将选课定为研究中国车险市场的系统设计。在完成系统设计的这段日子里,我查阅了许多Java开发,数据库方面的资料,以及车险项目有关的资料, 我学习到了很多Java开发技术以及数据库的实现方法。除此以外,我也了解了车险有关的知识。
    通过几个月的分析和研究,我的研究课题车险管理系统已经完成并且能够实现基本的功能,通过了实践测试。现在我的系统能够实现添加用户,添加/取消保单,理赔申请/受理,统计理赔情况等功能。不过由于毕业设计的时间有限,我一边进行学习,一边设计系统,我目前掌握的技术还不能使我的系统非常完美。从数据库来看,我的表设计还不够精简,还存在一定的冗余;从系统功能来看,一些功能还不够细致,还有进一步完善的空间。希望在未来的空余时间,我还能继续加工我的作品。
    通过毕业设计,我感受了系统开发的整个过程。毕业设计不仅是对我在大学所学知识的一个综合运用,对我实践能力进行的检测,也是一次增长知识和经验的好机会,同时也使我学会了许多处理、解决问题的方法,我也大大提高了自己的动手能力,使自己得到提升。我希望我在未来的学习和工作遇到困难的时候,都能保持不骄不躁的态度,学会冷静地解决问题。
    参考文献[1]徐雷明.车险智能审核系统的设计与实现[D].硕士学位论文.大连理工大学,2016.
    [2]詹薇.国内互联网车险发展研究[D].硕士学位论文.江西财经大学,2018.
    [3]李政宵,孟生旺.相依风险条件下的汽车保险定价模型[J].保险研究, 2016(7):68-77.
    [4]程阳.互联网车险UBI产品的设计[J].南方农机,2018(2):139-139.
    [5]魏丽,杨斐滟.我国商业车险改革评析[J].保险研究,2018,No.361(5):18-34.
    [6]夏超群.MyEclipse与数据库连接的实现[J].武汉工程职业技术学院学报,2013, 25(2):48-50.
    [7]佚名.“翻转课堂”本科教育实践——以《汽车保险与理赔》课程为例[J].教育教学论坛,2018(17):206-207.
    [8]陈文书.大数据视角下共享汽车保险定价机制研究——与UBI车险对比论证[J].中国商论,2018,No.758(19):14-15.
    [9]秦杨.加强和改善车险理赔服务问题探析[J].纳税,2018,No.198(18):192.
    [10]何宝晶.基于智能化理赔流程的车险理赔风控和反欺诈研究[D].硕士学位论文.兰州交通大学,2018.
    [11]李俊杰.华安财产保险运营信息管理系统设计与实现[D].硕士学位论文.大连理工大学,2016.
    [12]陈宏钊.车辆保险业务系统的设计与实现[D].硕士学位论文.东北大学,2015.
    [13]王东.机动车辆保险出单与决策系统的设计与实现[J].科技经济导刊,2017(2).
    [14]张钟浩,魏金海,彭章友.基于SSM的车辆保险系统设计和实现[J].工业控制计算机, 2017,30(5):141-142.
    [15]佚名.论我国学生平安保险的功能定位与法制完善[J].金融理论与实践,2019(1).
    [16]张晓甜.浅谈我国互联网保险[J].山东纺织经济,2018(4):25-27.
    [17]佚名.保险理赔的新科技应用与展望[J].纳税,2018, 12(27):203.
    [18]郗宏伟,汪爱丽.对汽车保险理赔中查勘定损的模式分析[J].中国市场,2018(6):129-130.
    [19]刘冬.车险理赔难与消费者权益保护研究[J].现代营销(下旬刊),2018(04):249-250.
    [20]薛煜睿.中国机动车车辆理赔风险管控对策探究[J].北方经贸,2018(4):100-101.
    2 评论 7 下载 2019-07-02 21:54:40 下载需要12点积分
  • 基于JAVA和SQL SERVER数据库实现的酒店管理系统

    1 设计目标就数据库学习应用于生活,以简单数据库应用为例,本小组以制作“酒店管理系统”为目标。该管理系统已经能实现一些酒店住房管理的一些基本功能,适用于中小型宾馆使用及访问,旨在用计算机系统为操作人员提供更方便的操作,并保持很高的灵活性和易操作性,该软件具备以下特点:

    易学易用,操作简便,它是基于Java的应用程序,操作界面友好直观
    功能完善,本系统包括前台经营和后台管理,功能完善,能够实现酒店的数字化经营
    开放型好,采用标准的开发工具和技术,后台数据库采用微软SQL 2008中文版,可以提供开放的数据接口,可同其他软件交流数据
    较为完善的会员机制
    功能完善,分为 4 个主要模块,分别为:查询房间状态、加入会员、宾客入住、结账

    查询房间状态,该功能可以查询当前的房状态,查询已入住和未入住的信息,并且很好的保存了用户的隐私,实现了连接SQL Server 2008 R2数据库从所建的表中查询功能
    加入会员模块:该功能可以实现连接SQL Server 2008 R2数据库从所建的表中插入、修改功能。并且设计会员打折模块(未实现)
    来宾入住模块:该功能实现了和现实生活一样的模式,登记入住信息,连接SQL Server 2008 R2数据库从所建的表中更新功能,把来宾的个人信息插到用来存放数据看guess表中
    结账模块:该功能实现了从数据库中查询自己的入住信息,和点击结账之后的数据更新功能,结账之后更新数据库的guess表,把入住状态设为未入住等


    2 功能设计
    3 数据库设计关于数据库设计方面,我们做的不是很完善,比如设计的这个数据库,有很多的函数依赖都没有消除,主码外码等定义也不是特别完美。名为Hotel的数据库主要分为三个表,分别是:guess,vip,operater.

    其中,guess主要用来存储来访信息和用户住房登录信息的,它的构造如下图:

    数据库主要的实现查询更新插入等功能便是通过这张表。
    Vip表是用于存储用户加入会员的,而operaer则是用于登录的时候存储管理员的信息的。其中guess表是整个数据库乃至整个程序的核心部分,用的java语言只是用来进行流程控制。整个程序通过JDBC操作也主要是这个。虽然有很多不足的地方,但是我们相信,我们是可以慢慢完善的。
    4 系统实现4.1 模块一登录界面模块:通过使用Java swing组件编写的比较友好的登录界面,同时也包括了通过JDBC连接数据库查询管理员的信息,数据库中的管理员表,正确输入密码和用户名才能尽进行登录。

    4.2 模块二使用主界面,界面美观漂亮,可以通过底部的按钮实现相应的功能。

    4.3 模块三查询模块:这个模块可以查询到当前的入住信息,当前的房间状态,而且很好的保护了客户的隐私,是通过JDBC连接数据库的方式得到数据之后插入一张二维表来显示的。可以一目了然的查看当前的空房,并且在允许的情况下让用户自主选择要入住的房型和房间号.

    4.4 模块四会员模块:这个模块可以让使用者加入会员,实现优惠功能,虽然还未实现打折功能,但是相信,只要时间允许,这个打折功能是可以实现的。这个功能是通过数据库的插入操作实现的。是把所有的方法封装在一个数据访问层DAO中,它封装了所有程序中要通过JDBC操作数据库的方法,包括查询,更新,修改,删除。

    4.5 模块五来宾入住信心录入模块。该模块参照了现实生活中的宾馆入住实例,通过把宾客的信息录入到数据库的指定的表中,并且保存起来,之后还可以通过结账模块的查询功能来表现。也是通过JDBC连接数据库实用”UPDATE 表名 姓名 所选的房间等 ”,通过调用DAO(数据访问层)的更新方法来实现,既可以查询,又可以更新:

    4.6 模块六结账模块。该模块实现了查询和更新一体的操作,是通过注册按钮事件来执行数据访问层DAO里的数据查询和数据更新操作.并弹出对话框”您需要付款¥xxx”,并且在弹出的同时,通过JDBC调用DAO层的更新方法来实现重置房间状态。既是用户活动的结束,也是流程的结束。

    也可以更新:

    结账的时候更新数据,设置房间为空。
    5 分析与结论这一次的课程设计给了我们莫大的好处,让我们更熟悉了数据库和高级语言的关联性,又能做到学以致用。在这个课程设计之前,我们都很迷茫,不会学以致用,只是知道跟着老师的步伐学习。通过这次的课程设计,我们还学会了自主学习的方法,明白了怎么样才是正确的学习方法。而不是一味的乱撞,我们通过做这个项目,还参考了很多课外教科书,查找了很多的资料。通过对一个问题的实际分析,良好的综合的运用了所学的知识,既学到了知识,巩固了基础,让我们更深入的学会如何将课本上所学的知识运用到实际上。
    虽然我们做的这个小小的项目不是很完善,也不是很好,还有很多需要改进的地方,很多的bug需要去修复。在这之前,我们成天都是跟着课本上整天加加减减,没什么感觉。通过这个课程设计,有了一点成就感,也大大加深了我们努力钻研的精神,终于可以学以致用了。我们相信在以后我们会更加努力的去探讨知识,开发出更好的软件!
    参考文献【1】王珊 萨师煊第四版 数据库系统概论
    【2】王珊 萨师煊第五版 数据库系统概论
    【3】java语言程序设计
    【4】java编程思想
    【5】清华大学出版社 主编 徐琳等 java程序设计专家门诊
    【6】UML统一建模教程
    7 评论 292 下载 2018-11-06 14:36:13 下载需要8点积分
  • 基于C++求解立方数码问题

    一、算法思想1.1 A*算法
    首先,对输入的初始状态和目标状态进行一些检测,如判断障碍物位置是否相同、始末状态是否相同等,排除一些异常情况
    从初始状态 A 开始,将其作为一个待处理点加入一个开启列表中(OPEN)。并计算当前状态 A 的 f(n)=g(n)+h(n)的值。(g 为路径耗散值,h 为启发函数值)
    将开启列表中的初始状态取出,作为起点,并放入关闭列表(CLOSE)。寻找起点周围所有的可达状态结点,也将他们加入开启列表。这些可达状态点的父状态指向起点状态,并将到达该状态的行为记录下来,利用 hash 函数进行去重
    接着,从开启列表中寻找 f 值最小的状态结点,重复 c 步骤,直到找出的起点结点的 h 值为 0。此状态即为目标状态
    根据目标状态,沿父状态指针一路搜索到初始状态,并同时将到达当前状态的行为压栈。最后,依次出栈,既可以得到从初始状态到达目标状态的动作序列

    1.2 IDA*算法
    首先,对输入的初始状态和目标状态进行一些检测,如判断障碍物位置是否相同、始末状态是否相同等,排除一些异常情况
    从初始状态 A 开始,将其作为一个待处理点加入一个开启列表中(OPEN)。并计算当前状态 A 的 f(n)=g(n)+h(n)的值。(g 为路径耗散值,h 为启发函数值) 将该状态结点的 f 值设为阈值 f(max)
    将开启列表中的顶部状态取出,作为起点。寻找起点周围的可达状态结点中 f 值小于截断值的状态,对其中具有最小耗散值 f 的状态进行搜索
    判断当前状态是否为目标状态,如果是,就返回;否则,将到达当前状态的动作压入栈中,并继续 c 步骤,同时,利用 hash 函数进行状态去重
    依次弹出动作栈中的执行动作信息即可

    二、算法的空间复杂度哈希表大小固定为 10000。每个状态约 160B,优先队列空间具有灵活性,可扩展,空间复杂度为 O(4*5n-1+10000)。
    三、算法的时间复杂度
    A*:最坏情况下,算法的时间复杂度为 O(5nln(n)),n 为步数。平均大概有 1/5 左右的重复状态
    IDA*:最坏情况下,算法的时间复杂度为 O(m5nln(n)),n 为步数,m 为重来次数。n<=30时,m<=3,影响不大。平均大概有 1/5 左右重复状态

    四、实验结果说明下图是在给定的 5 步执行测试用例下跑出的结果。
    1 评论 1 下载 2019-09-06 09:17:33 下载需要6点积分
  • 基于C#实现的电影院售票管理系统

    一、引言1.1选题背景随着互联网和电子商务的快速发展,网上购物已经成了现代人生活中很重要的一种方式,如:数码产品、生活用品、化妆品护肤品等,只要是人们需要到的东西,基本都可以在网上购买。除了购买各种物品,现代人的生活也不再向过去一样单调,除了学习和工作之余,人们的娱乐生活也逐渐丰富,最普遍的娱乐休闲方式之一就是到电影院看电影,那么传统的电影订票窗口显然已经不能满足人们的需要了,所以开发一个电影院网上订票系统是非常必要和可行的。以前传统的电影票订票方法是去电影院的购票窗口查看电影的上映时间、场次、可选座位等信息再进行购票,人们往往需要排队才能买到电影票,这样不仅浪费了人们宝贵的时间,而且电影院工作人员的工作量也很大,对于这种低效率、浪费时间的事情,完全可以以网上购票的方式来改变。
    为了提高劳动的效率、节约成本、提高服务质量,我们小组开发了此款系统,用以方便影院的售票和客户的购买,通过这个系统,可以很快的实现会员注册、登录、购票,后台管理员可以新增影片、排片等基本操作。
    二、需求分析2.1 用户需求需要在网上购买电影票的用户可使用本系统,进行会员的注册登陆之后可以进行网上查询电影、购买电影票等操作,省去了去电影院实体窗口排队买票的繁 琐程序。
    2.2 系统功能分析
    新用户的注册、登录,用户数据能存在后台数据库中
    电影的录入、删除、查询、修改
    电影的排片
    管理员查询会员级别等信息
    会员查询影片信息
    会员购买电影票

    2.3 条件与限制系统可以实现一些基本的购票功能,但系统较简单,尚存在很多缺陷,不能实现完善和全面的功能。
    缺陷:

    首先要使用admin进行登录才能开始注册会员
    购票后无法查看购票信息
    不可以支持选座
    购票时不能通过搜索影片名字等来查找影片

    三、模块设计3.1 系统流程图系统流程图如图一所示:

    系统功能图如图二所示:

    3.2 系统使用指南对于用户
    首先,系统使用者先通过admin登录,进入到新用户注册页面,以管理员的身份为用户注册一个新的会员账号,已注册好的账号密码自动保存在后台数据库中,用户下次可以直接使用已注册的会员账号登录本系统进行电影的查询、购票等操作。
    对于管理员
    首先,管理员可以为新用户注册不同级别的会员账号、查看会员的信息。其次,管理员可在系统后台做电影的录入、删除、查询、修改等基本操作,除此之外,添加好影片后可以对电影进行的排片。
    四、数据库设计及实现4.1 系统E-R图E-R图如图三所示:

    4.2 逻辑结构设计(关系数据库设计)
    顾客(Cus、CusCard、CusType、CusTel(key))
    登陆(UserName、UsePwd、UserType)
    电影(Mname(key)、MBZ、MLanguage、MTYPE、MDirector、MACT、MTime)
    排片(MName(key)、MPrice、MRoom、Mcount、MTime、MBRQ、MERQ)
    上映(ID(key)、MName、MPrice、MRoom、MCount、MTime、MRQ)
    购票(PID(key)、Cname、GPCount、GPJE、MName、SYRQ、FYT、GPRQ、CZY)

    4.3 数据库主要代码及触发器会员信息
    CREATE TABLE [dbo].[Cus]( [CusTel] VARCHAR(50) NOT NULL PRIMARY KEY, [CusName] VARCHAR(50) NOT NULL, [CusCard] VARCHAR(50) NULL, [CusType] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[InsertULogin] on [dbo].[Cus]after insertasdeclare @username varchar(50)declare @userpwd varchar(50)select @username=CusTel from inserted select @userpwd= right(CusCard,6) from inserted insert into ULogin values(@username,@userpwd,'C')
    购票信息
    CREATE TABLE [dbo].[GP]( [PID] VARCHAR(50) NOT NULL PRIMARY KEY, [CName] VARCHAR(50) NOT NULL, [GPCount] INT NULL, [GPJE] FLOAT NULL, [MName] VARCHAR(50) NULL, [SYRQ] VARCHAR(50) NULL, [GPRQ] VARCHAR(50) NULL, [CZY] VARCHAR(50) NULL, [FYT] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[UpdatePP] on [dbo].[GP]after insertasdeclare @MName varchar(50)declare @SYRQ varchar(50)declare @count intselect @MName= MName,@SYRQ=SYRQ,@count=GPCount from inserted update MovieSY set mcount=mcount-@count where MName=@MName and MRQ=@SYRQ
    电影信息
    CREATE TABLE [dbo].[Movie]( [MName] VARCHAR(50) NOT NULL PRIMARY KEY, [MLanguage] VARCHAR(50) NOT NULL, [MDirector] VARCHAR(50) NULL, [MAct] VARCHAR(50) NULL, [MName] INT NULL, [MBZ] VARCHAR(255) NULL, [MType] VARCHAR(50) NULL)
    上映信息
    CREATE TABLE [dbo].[MovieSY]( [ID] INT NOT NULL PRIMARY KEY, [MName] VARCHAR(50) NOT NULL, [MRoom] INT NULL, [MCount] varchar(50) NULL, [MName] INT NULL, [MTime] VARCHAR(50) NULL, [MRQ] VARCHAR(50) NULL)
    排片信息
    CREATE TABLE [dbo].[PP]( [MName] VARCHAR(50) NOT NULL PRIMARY KEY, [MPrice] INT NOT NULL, [MRoom] VARCHAR(50) NULL, [MCount] INT NULL, [MTime] VARCHAR(50) NULL, [MBRQ] VARCHAR(50) NULL, [MERQ] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[InsertPP] on [dbo].[PP]after insertasdeclare @MName varchar(50)declare @BRQ varchar(50)declare @ERQ varchar(50)declare @MTime varchar(50)declare @MRoom varchar(50)declare @MPrice intdeclare @MCount intdeclare @MBRQ datetimedeclare @MERQ datetimedeclare @RQ varchar(50)select @MName= MName,@BRQ=MBRQ,@ERQ=MERQ,@MTime=MTime,@MRoom=MRoom,@MPrice=MPrice, @MCount=MCount from inserted set @MBRQ=CONVERT (datetime,@BRQ)set @MERQ=CONVERT (datetime,@ERQ)while @MBRQ<=@MERQbegin set @rq=CONVERT(varchar(50), @MBRQ, 112)insert into MovieSY values(@MName,@MPrice,@MRoom,@MCount,@MTime,@RQ) set @MBRQ=DATEADD(DAY,1,@MBRQ)endCREATE TABLE [dbo].[MovieSY]( [UserName] VARCHAR(50) NOT NULL PRIMARY KEY, [UserPwd] VARCHAR(50) NOT NULL, [UserType] VARCHAR(50) NULL)
    五、系统设计与实现5.1系统开发环境
    硬件环境

    Intel Pentium 166MHz或以上;内存:需要至少512MHZ;
    软件环境

    运行于Windows2010版的操作系统之上;SQL Server2008数据库;Visual Studio2013;

    5.2 功能模块
    输入功能模块
    查询显示功能模块
    查询、售票功能模块
    登录、注册功能模块

    5.3 系统主要页面展示登录、注册页面

    登陆后的页面

    会员注册页面

    会员信息查询页面

    添加影片页面

    查询修改影片页面

    排片页面

    “排片”页面通过连接数据库,可以搜索影片的名字、导演、主演来选择影片,再输入票价,放映大厅,座位数,放映时间等信息,最后确认排片。
    购票页面

    购票页面通过对获得的已经被排片的电影进行选择而进行购票这一操作。在购票前需填入购票数量、联系电话,系统会自动计算合计金额。之后点击购票按钮则能进行购票操作。但一旦购票成功则不能进行退票操作,也不能查看所购买的电影票。
    数据库页面

    六、主要特色6.1 系统实用性系统首先可以进行新用户的注册,用户数据能存在后台数据库中。管理员可以进行电影的录入、删除、查询、修改,添加好影片后进行电影的排片。退出登录后再使用之前注册的会员登录,可以购买电影票。
    6.2 突出优势和特色(创新点)
    购票时可以看到影片的导演、主演等信息
    用户分为钻石用户,白金用户和普通用户,对用户进行了分类

    7 小结数据库技术课程设计是一次对课堂所学知识的灵活应用,是理论知识与实践的相结合。经过了一周的课程设计,本系统基本达到了当初的设计要求,设计上也基本合理。我们不仅对数据库系统的认识更加深入,同时也掌握了面向实体的系统分析的基本方法,对VS也有了新的认识,也知道了要有坚持不懈,不惧困难的精神,才能取得成功。一个简单的系统,每一个细节都需要在实践中去挖掘并进行进一步的修改完善。本次课设让我们受益匪浅,在分析问题以及解决问题等方面的能力有所提高,也是一次很好的同学之间交流合作的机会。数据库技术的用途很广,还有很多值得我们学习,希望今后能有更多这样的机会。
    7 评论 77 下载 2019-01-01 18:20:12 下载需要18点积分
  • Qt实现的基于平衡二叉树和倒排的关键词搜索系统

    一、实验目标在完成对铁甲网论坛上发帖信息的提取和分词的基础上,通过建立词库的平衡二叉树和倒排文档实现对关键词的搜索。
    二、实验环境
    操作系统:windows 7 x64位
    IDE: Qt 5.6.1
    编程语⾔: C++

    三、抽象数据结构说明3.1 平衡二叉树(m_balanced_binary_tree.h)树的节点为:
    struct node{ m_charstring<wchar_t> value; //单词内容 int wordID; //单词ID int Occur; //单词总出现次数 int index; //平衡因⼦ m_file_list file; //⽂档链表 node *LChild, *RChild;};
    二叉树的每个节点记录了单词的相关信息。实现的功能有插入(Insert),搜索(Search)和调整二叉树使其平衡(Adjust)。
    3.2 平衡二叉树的优化最长匹配算法的分词特点是:由最长的待搜寻字符串开始,在词库中搜寻,若未找到,则减短待搜寻长度。根据此特点,我发现将同一长度的单词放置在同一平衡二叉树上,可以提高分词效率,避免重复浪费搜索。结构可以由下图表示:

    通过这样的方式,在分词判断不同长度的字符串时,我们可以直接查找相应“特定长度”的词库,而不用去遍历全部词库,从而可以大大提高运算效率。
    3.3 词库精简和速度的优化通过研究词库以及2000个文本对原始全部词库的分词结果。(下图示例)

    发现分词结果多为2个字,这也是比较好解释的,词典中3个字的词语多为“专有名词”,4个字的词语多为“成语”,5个字及5个字以上的词语多为专有名词。在挖掘机论坛这样的环境下,很少会有3个字及以上的词语出现,通过上面建立的根据词语长度排列的平衡二叉树可以发现,3个字及以上的词语占了很多存储空间和运算性能,但是并没有对分词结果起到明显效果。考虑到优化计算速度、精简程序体积,我在初始化词典及判断词时只考虑两个字长度的词语。
    3.4 ⽂档链表(m_file_list.h)struct list_node{ int webID; //⽹⻚ID m_charstring<wchar_t> website; //⽹⻚⽹址 m_charstring<wchar_t> content; //⽂档内容(gui程序中有,query程序中没有) m_charstring<wchar_t> keyword; //关键词 m_charstring<wchar_t> title; //标题 m_charstring<wchar_t> author; //作者 m_charstring<wchar_t> date; //发帖⽇期 int times; //单词在该⽂件出现次数 list_node *next,*pre;};
    ⽂档链表的每个节点记录了单词出现的次数、单词是什么、网页ID、文档内容等信息。
    实现了添加文档(add)、搜先文档(search)、编辑文档(edit)、删除文档(Remove)等功能。
    词典二叉树中的节点和文档链表类的关系如下图:

    搜索平衡二叉树的节点,节点中文件链表的节点就是包含这个词的网页,文档链表是双向链表,是为了方便插入和排序。文档链表的节点顺序按照词语出现的次数,出现次数多的在前面,出现次数少的在后面。因此在类函数中有函数sort(),它是用来调整插入节点顺序的,因为是双向链表,顺序调整十分高效。
    3.5 输出哈希表和排序链表(query_web_hash_table.h)用“链式哈希表”和排序链表来整合输出结果,哈希表每个单元表示一个网页,详细的说明在后面介绍输出算法时将详细介绍。
    四、算法说明4.1 输出整合对于一些词语的搜索,调用平衡二叉树的Search函数,将返回相应的树节点,每个树节点的文档链表即使包含该词语的全部网页。对于同一网页,可能含有不同的搜索词,因此搜索后会有不同的文档链表节点,这些节点需要整合起来(记录搜索词总出现次数),并且只输出一次。
    建立如下图结构的哈希图,最上层是数组,每个数组节点链接一个链表,哈希函数网页ID(webID)用来整合。

    当搜索某一词语后,遍历词语树节点的文档链表节点,文档链表中存储了WebID,可以根据哈希函数H(x) = webID找到最上层位置,然后将文档链表节点指针记录下来,构成链表,并记录搜索词语出现的总次数。同时,将出现的webID记录到一个排序链表中,该链表的所有元素不重复,在此使用了“插入降序排列”。
    4.2 输出顺序4.2.1 优先按照搜索词出现次数先按照搜索词出现总次数从高到低进行排列。如果出现总次数一样,则按照词语出现“离散程度”排列,搜索词语离散程度越低(即出现次数越相近),则排列位置越靠前,反之越靠后。如果“离散程度”也一样,则按照所搜索词语的先后次序排序(初始搜索排序)。
    现对“离散程度”进行说明:
    该思想源于“方差”,该值越大,则表明数据越分散,即相互之间差距很大,该值越小,则表明数据之间比较相近。本程序自定义了以下公式来反应“离散程度”:

    其中n是输⼊搜索词语的个数, 是各搜索词语在网页中出现的次数, 是各搜索词语出现的平均次数。这个公式相比于方差的平方计算比较简单,运算效率更高。对于输出顺序的改变,是通过改变前面所述的记录webID的链表的节点顺序实现的。
    这样的顺序其实也符合我们日常的逻辑,如果搜索多个词语,搜出的结果包含搜索词次数肯定越多越好,同时还应该尽可能包含不同的关键词,这对应于就是“离散程度⼩。
    4.2.2 优先按照发帖⽇期生活中存在这样一种情况:我们需要提取出“最新”帖子。因此在这种排序下,发帖日期越晚,排列越靠前。当不同帖子发帖日期一样时,再按照搜索词语出现的总次数和“离散程度”进⾏排列。
    五、流程概述
    六、输⼊输出及操作相关说明exe⽂件夹中含有两个子文件夹,分别为批量查询和gui查询文件,在两个子文件中,可以在input文件夹中改变url.csv⽂件,在dictionary文件夹中改变字典文件。对于批量查询,在query.exe同一层级放入query.txt文件即可对其中内容进⾏查询。
    子文件夹中含有的其它文件是程序运行所需要链接的库。
    对于批量查询,直接打开query.exe程序,等待进度条读完,会显示”处理完成”。读条过程如下图:

    对于gui查询,打开gui.exe,等待初始化完成后,会显示搜索窗口,在输入框中输⼊关键词(例如“二手挖机不想睡觉啦啦”),点击“搜索”即可。点击搜索结果中的网页链接,可以直接跳转至原网页。点击不同排序方式的按钮,可以改变搜索结果的排序方式,默认按“搜索词次数”排列。
    初始化及载⼊时间在Tsinghua 5G下约10分钟。
    七、实验结果经过调试和验证,发现实验结果符合预期。
    八、功能亮点说明
    Qt⽹络类的使用,大大提高了网页下载速度,其中还使用了异步操作;gui程序使用了多线程,确保了交互界面的及时刷新
    平衡二叉树按词长创建和词库的精简
    使用哈希表快速整合搜索结果,以及排序顺序的确立。不同的排序方式
    下载2000个网页加处理时间约10分钟左右,程序效率较高

    九、实验体会感觉整个实验很有趣也很有用,自学了很多东西,包括网页下载,Qt多线程程序,编码和解码等等。我感觉要实现⼀些实用的功能其实挺复杂的,还需要我不断学习努力。(吐槽:面向搜索引擎的大作业 + 网络、编码、多线程自学)
    1 评论 2 下载 2019-09-04 13:47:51 下载需要8点积分
  • 基于JAVA的实现学生卡管理系统

    一. 引言1.1 编写目的自出台“科教兴国”方针后,国家对教育领域的重视程度越来越大,资金投入也越来越多。人们已经意识到教育的重要性,各地高校如雨后春笋般涌现出来,导致在校学生这支队伍也日益壮大。这就意味着校园卡的使用越来越多,同时也加大了校园卡的管理难度。因此,设计一套行之有效的校园卡管理系统是十分有必要的。
    二. 详细设计2.1 领域模型图
    2.2 系统类图说明2.2.1 学生类
    类图说明
    // 更改密码public void modifyPassword(StringnewPwd);// 根据选择的商品消费,从余额中扣除对应金额public void consume();// 显示充值、消费记录public String[][] checkHistory();// 验证账号密码合法性然后登陆public void login();
    2.2.2 管理员类
    类图说明
    // 办理新卡,密码默认为1234,金额默认为0,状态默认为truepublic void createCard(String cardID,String userName);// 删除该学生卡public void destroyCard(String cardID);// 充值public void deposit(double money);// 显示充值、消费记录public String[][] checkHistory();// 设置是否停用该卡public void setState(Boolean b);// 验证账号密码合法性然后登陆public void login();
    2.2.3 学生卡类
    类图说明
    // 设置密码public void setPassword(String password);// 返回密码public StringgetPassword();// 返回卡号public** **String** getCardID();// 返回姓名public String getUserName();// 返回状态public** Boolean getState();
    2.2.4 学生卡信息类
    类图说明
    // 设置密码public void setPassword(String password);// 返回密码public StringgetPassword();// 返回卡号public String getCardID();// 返回姓名public String getUserName();// 返回余额public Double getBalance();// 返回状态public Boolean getState();// 余额增加public void addBalance(Double money);// 余额减少public void minusBalance(Doublemoney);
    2.2.5 数据库类
    类图说明
    // 得到学生卡信息public CardInfo[]getCardInfo();
    三. 模块功能详细设计3.1 办理新卡

    功能描述

    管理员为学生办理新卡,并把它存储到数据库中
    输入项

    学生的姓名、学号、密码默认1234、状态默认使用中

    3.2 销毁

    功能描述

    销毁学生卡,移除数据库中相应信息
    输入项

    学号

    3.3 修改密码

    功能描述

    修改密码
    输入项

    学号、新密码

    3.4 充值

    功能描述

    充值
    输入项

    金额

    3.5 消费

    功能描述

    消费
    输入项

    消费项目、数量

    3.6 查询余额

    功能描述

    查询余额
    输入项

    学号

    3.7 挂失

    功能描述

    挂失
    输入项

    学号、备注信息

    3.8 登录

    功能描述

    登录
    输入项

    账号、密码
    2 评论 79 下载 2018-12-06 15:36:49 下载需要5点积分
  • 基于C++的教室管理系统

    1 需求分析
    核心需求:实现教室管理系统,完成对学校教室的维护、查询、预约、统计功能。程序拥有权限控制,分为管理员和普通用户
    管理员需求:查看某栋楼教室的概要信息、每个教室的详细信息(包括教室基本信息、预约情况、上课情况)、修改某教室基本信息、增加教室、删除教室、增加某教室上课情况、统计某类教室的综合使用情况(周上课率、周预约率)
    普通用户需求:查询符合条件的空闲教室、预约空闲教室
    其他需求:程序具有良好的交互性

    2 概要设计程序运用面向对象编程思想进行设计。核心有教室类、预约信息类、上课信息类。

    教室类:

    成员:校区号、教学楼号、教室号、教室类型、座位数、预约状态、预约数、预约信息、上课数、上课信息
    函数:默认构造函数、成员获取函数、成员设置函数

    预约信息类:

    成员:课时时间、学号/教工号、姓名、电话
    函数:默认构造函数、构造函数、成员获取函数、重载流运算符

    上课信息类:

    成员:教师姓名、教工号、总上课次数、上课时间
    函数:默认构造函数、构造函数、成员获取函数、重载流运算符

    课时时间类:

    成员:课时周、周、节
    函数:重载相等、不等、流运算符


    程序结构图如下图所示:

    3 运行环境
    硬件环境

    处理器:Intel® Core™ i7-6500U CPU @ 2.50GHz 2.59GHz内存:8.00GB 系统类型:64位操作系统,基于x64的处理器
    软件环境:

    Windows 10

    4 开发工具和编程语言
    开发工具:

    Microsoft Visual Studio Community 2017
    编程语言:

    C++11

    5 详细设计5.1 教室信息类该类封装有教室的基本属性和方法,用于存储每个教室的信息集合及修改其中的信息,构成教室管理系统的核心。
    class Classroom{public: Classroom() = default; //默认构造函数 void setCampusType(uint); //设置函数 void setBuildID(uint); void setRoomID(uint); void setRoomType(uint); void setSeats(uint); void setOrderStatus(uint); void setOrderCnt(uint); void setClassCnt(uint); void addOrderInfo(OrderInfo); void addClassInfo(ClassInfo); uint getCampusType() const; //获取函数 uint getBuildID() const; uint getRoomID() const; uint getRoomType() const; uint getSeats() const; uint getOrderStatus() const; uint getOrderCnt() const; uint getClassCnt() const; vector <OrderInfo> getOrderInfo() const; vector <ClassInfo> getClassInfo() const;private: uint m_campusType = 0; //校区 uint m_buildID = 0; //楼号 uint m_roomID = 0; //教室号 uint m_roomType = 0; //教室类型 uint m_seats = 0; //座位数 uint m_orderStatus = 0; //预约状态 uint m_orderCnt = 0; //预约数 uint m_classCnt = 0; //课堂数 vector <OrderInfo> m_orderInfo; //预约信息数组 vector <ClassInfo> m_classInfo; //课堂信息数组};
    5.2 预约信息类主要用来存取每间教室的一条预约信息,含有预约时间、预约账号、预约者姓名及电话等基本信息,提供构造函数进行初始化,提供获取函数用于获取私有成员。
    class OrderInfo{ friend ostream& operator<< (ostream &, const OrderInfo&);public: OrderInfo() = default; OrderInfo(const classTime &time, const string &ID, const string &name, const string &phoneNum) : m_time(time), m_ID(ID), m_name(name), m_phoneNum(phoneNum) { } string getID() const; classTime getClassTime() const; string getName() const; string getPhoneNum() const;private: classTime m_time; string m_ID = ""; string m_name = ""; string m_phoneNum = "";};
    5.3上课信息类用来存取当前教室的一条上课信息,如上课时间、上课老师姓名、ID。
    class ClassInfo{ friend ostream& operator<< (ostream &, const ClassInfo &);public: ClassInfo() = default; ClassInfo(const string &teacherName, const string &teacherID, uint sumClassCnt, vector< classTime > &classTime) :m_teacherName(teacherName),m_teacherID(teacherID),m_sumClassCnt(sumClassCnt), m_classTime(classTime) {} string getName() const; string getID() const; uint getSumClassCnt() const; vector<classTime> getClassTime() const;private: string m_teacherName = ""; string m_teacherID = ""; uint m_sumClassCnt = 0; vector< classTime > m_classTime; //三元组 (课时周,周,节)};
    5.4 查看信息查看每座楼的所有教室基本信息,如教室号、教室类型、座位数、预约数、课程数。查看每个教室的详细信息,包括基本信息、预约信息、上课信息。

    修改信息:

    对某个教室的信息进行修改
    修改教室:

    可增加、删除一个教室
    增加管理员:

    增加一个管理员账号并存储
    增加上课信息:

    为某个教室增加上课信息
    统计使用情况:

    用于统计各类教室的使用率情况
    查询空闲教室:

    普通用户可通过输入课时时间来查询某号楼所有的空闲教室,同时可按照座位数、教室类型进行筛选
    预约空闲教室:

    普通用户可通过输入课时时间来预约教室、如果预约时间该教室有课或已有预约将预约失败

    6 调试分析
    问题1:程序所有功能都集中一起

    解决:增加用户权限,分为管理员和普通用户。管理员需要密码登陆,并对其进行校验,可对教室信息进行直接管理维护。对于普通用户仅开放预约及查询教室功能
    问题2:预约无校验功能

    解决:为系统添加时间属性、采用课时时间的方式对预约信息、上课信息进行时间管理。预约时可检测是否当前时间已被上课或预约占用
    问题3:交互逻辑使用不便

    解决:改进交互逻辑,提供跳转功能、选择错误处理

    程序改进

    改进管理员对教室进行维护的操作逻辑,使得操作更加方便
    增加真实时间、自动对已过期的预约进行删除
    采用更为合理的信息管理方式、使教室信息管理更加高效易行
    增加用户更多功能,如查询自己的预约、删除自己的预约
    增加程序鲁棒性
    改进交互

    7 测试结果管理员功能列表

    查询教室详细信息

    普通用户界面

    查询空闲教室

    预约空闲教室(预约成功)

    预约空闲教室(预约失败)

    参考文献[1] H.M.Deitel.C++大学基础教程(第五版)[M]. 北京: 电子工业出版社, 2011
    [2] 沈学东等. C++面向对象程序设计实用教程[M]. 上海: 上海交通大学出版社,2012
    [3] 谭浩强等. C++程序设计 [M]. 北京: 清华大学出版社, 2011
    [4] Stanley B.Lippman等. C++ Primer中文版[M]. 北京:电子工业出版,2017
    [5] Bjarne Stroustrup. C++程序设计语言[M]. 北京:机械工业出版社,2016
    2 评论 77 下载 2018-11-04 14:36:23 下载需要3点积分
  • 基于Android系统手机通讯录管理软件的设计与开发

    摘要谷歌在安卓领域投入了大量精力来开发,使得安卓技术得以广泛推广,现安卓移动平台设备在市场上已经得到大量推广及普及。在Android移动终端操作系统的快速发展,Android的各种手机软件也大量增长。当然,在手机终端中,手机通讯录是手机终端必不可少的基础功能,其质量直接影响着用户对手机使用的体验与感觉。手机通讯管理软件不仅仅只是能够简单添加联系人以及联系方式的功能,而今已发展成为多种形式,丰富了联系人的信息,存储了更多的内容。此课程设计研究的这个项目,主要实现添加联系人的多种联系方式的功能。
    本软件采用Android Studio+Android SDK集成环境,应用程序编程语言采用Java高级语言开发。通过对通讯录中的联系人的管理,来方便用户通讯更加便捷,联系人的数据保存更加安全。在对Android手机通讯管理软件进行详细的系统设计时,对功能进行详细的划分并对其功能做了详细的介绍,列出了一些主要功能流程图。
    关键词:通讯录 Android 数据库 SQLite
    第一章 绪论1.1 项目研究背景经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
    Android是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android最大特点在于它是一个开放的体系架构,具有非常好的开发和调试环境,而且还支持各种可扩展的用户体验,Android里面具有非常丰富的图形系统,对多媒体的支持功能和非常强大的浏览器。
    Android平台的开放性等特点既能促进技术的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定特色化的产品。
    1.2 项目研究的目的及意义随着4G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。在Google和Android手机联盟的共同推动下,Android在众多手机操作系统中脱颖而出,受到广大消费者的欢迎。
    手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,有9成以上的消费者使用手机通讯录功能。随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展。通讯录从无到有,大大丰富了内容,同时结构也发生了革命性变化,而且随着手机的发展,相信更优秀的通讯录会越来越受到社会各层人士的喜爱。
    1.3 系统主要实现内容通过对Android技术的相关研究,了解Android源码实现原理以及过程,从而设计出一款能够使用的手机通讯录。
    这款手机通讯录实现的相关内容如下:

    简洁、实用的操作界面
    联系人的增删改查
    分类的增删改查
    呼叫联系人
    登录、注册、修改密码
    群组的增删改查
    导入导出联系人
    支持模糊查询手机通讯录

    第二章 系统分析2.1 系统可行性分析2.1.1 技术可行性Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java 应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。
    本软件用的是Java开发语言,在Android Studio集成开发环境下,调试容易。当前的计算机硬件配置或则现有安卓手机的硬件配置也完全能满足开发的需求,因此技术上是绝独可行的。
    2.1.2 经济可行性开发该系统所需的相关资料可以通过已存在的相关系统进行调查采集,所需的软件系统、硬件平台等都易于获得,且不需要Android平台机器,用模拟器即可实现开发研究,开发成本低,容易实现,从经济角度来看,该系统可行。
    2.1.3 操作可行性不管是安卓平台的手机,还是计算机,其成本的下降,导致计算机,安卓手机购买成本的降低.这套系统是利用自己的计算机,且使用安卓模拟器,使开发出来的系统有友好的用户界面、操作简单,因此在操作上是可行的。
    2.2 Android通讯录的使用意义该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等功能。要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。
    第三章 系统概要设计3.1 系统总体设计Android手机通讯管理软件主要功能模块包括:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等。

    3.2 处理流程设计3.2.1 业务流程图用户首次进入手机通讯管理软件后,会进入用户注册界面,当用户注册成功之后,输入密码即可看到联系人列表界面。联系人列表界面右下方显示增加联系人按钮。上方可以进行联系人的多条件搜索。同时长按某个联系人可实现编辑删除功能。当然点击联系人也可以看到详细信息。界面中显示我的群组列表,打开之后即可进行群组的增删改查功能。点击菜单键,显示通讯录的导入导出功能以及修改密码功能。
    3.2.2 数据增加流程图添加联系人时,数据由用户输入,点击确定按钮,判断数据是否合法(及用户名是否为空),合法则插入到数据库;不合法,提示错误信息,让用户重新输入。流程如图所示:

    3.2.3 数据修改流程图编辑联系人时,点击编辑联系人菜单,输入修改后的数据,点击确定按钮,判断数据是否合法,合法,则更新数据库;不合法,则返回错误信息。 流程如图所示:

    3.2.4 数据删除流程当用户选定一个联系人时,单击删除联系人菜单,提示用户是否删除,点击确定按钮,则从数据库中删除此条记录。数据删除流程如图所示:

    3.3 数据库设计3.3.1 SQLite数据库简介SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低。
    本系统采用的是Android系统自带的SQLite轻型数据库数据库。因此占用资源非常小。
    3.3.3 数据库表结构首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、群组ID、地址等联系方式。创建群组表用来保存ID和群组名称等信息。两个表联合配合。表结构如图所示:

    第四章 系统详细设计4.1 联系人浏览模块进入手机通讯管理软件后,看到的第一个界面是联系人列表界面。该列表是由ListView控件生成的,打开数据库(如果数据库不存在则创建数据库,并创建数据表),查找数据库中所有的联系人,并把联系人姓名和移动电话号码以及职位这填充到ListView的adapter中。每一行显示一个联系人的姓名和手机号码,联系人的显示的顺序是根据插入数据库的顺序显示的。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话、导入导出通讯录等。

    点击[菜单]按钮时,就会显示主菜单项,其中包括:修改密码、导出数据、导入数据。
    点击添加按钮,会进入添加联系人界面,可以输入联系人相关信息,完成联系人添加功能。点击上方搜索栏目,会进入联系人查找界面,可以进行联系人查找,搜索想要找的联系人。
    点击菜单按钮,打开修改密码、导出通讯录、导出通讯录等功能。

    长按列表的某一行时,会弹出长按菜单,其中包括:拨号、编辑联系人、删除联系人。点击查看联系人菜单会进入查看联系人界面。点击编辑联系人菜单会进入编辑联系人编辑界面。点击删除联系人时,会弹出对话框,询问是否删除联系人,点击确定,则从数据库中删除该联系人。

    4.2 查看联系人模块在联系人浏览界面点击某个联系人,则会跳转到该界面。该界面使用TextView把从数据库中调出的联系人的详细信息显示出来,这里面包括联系人姓名、手机号、地址等详细信息。

    4.3 编辑联系人模块编辑联系人界面使用EditView控件显示并修改联系人的详细信息。联系人的所有信息,处于可编辑状态,手机号和座机号的EditView设定为只能输入数字。修改完信息后点击确定按钮,触发确定按钮点击监听事件,从而对数据库中该联系人的信息进行更新, 然后自动返回联系人浏览界面。点击取消按钮会返回联系人浏览界面。

    4.4 查找联系人模块这里采用的查找方法是SQL模糊查询,可以只输入联系人姓名中的一部分,即可查找到所有包含该部分的联系人,并在ListView中显示出来所有的联系人的姓名和手机号码。可实现查找职位、手机号码、名字等信息。

    4.5 修改密码点击菜单,可以查看该软件的修改密码、导入导出等情况。并可实现全部功能。

    4.6 分类管理点击我的群组界面,可以查看群组并且显示群组。在里面可以对群组进行增删改查操作。
    5 评论 75 下载 2019-01-30 17:26:14 下载需要12点积分
  • 基于C#的超市进存销管理系统

    第一章需求分析1.1 需求分析1.2 用例模型及分析类图的描述1.2.1 用例Use Case:账号密码登录
    参与者:用户
    主事件流:

    用户选择账号登录选项并输入账号密码
    将用户输入的EmpLoginName和EmpLoginPwd与数据库中相应的字段进行匹配
    若匹配成功,则跳转页面,转到主窗口。反之,则提示登陆失败

    1.2.2 用例图用例模型本系统以管理员对数据库的操作为主,实现用例图如下:

    根据对用例的分析,做出用例图如上,管理员主要利用本系统,实现对进货信息、库存信息、销售信息和职工信息、供应商信息的管理。系统采用VS环境开发,实现C/S结构,管理员对各个信息的修改都直接写入数据库。
    1.3 分析类1.3.1 用户登录模块用户登录用例图
    用户登录的用例图,如图1-3-1-1所示:

    用户登录时序图
    如图1-3-1-2所示,表示用户登录的时序图。

    用户登录分析类图(协作图)
    如图1-3-1-3所示,表示用户登录的协作图。

    1.3.2 进货模块进货用例图
    进货的用例图,如图1-3-2-1所示:

    用户登录时序图
    如图1-3-2-2所示,表示用户登录的时序图。

    用户登录分析类图(协作图)
    如图1-3-2-3所示,表示用户登录的协作图。

    1.3.3 销售模块进货用例图
    进货的用例图,如图1-3-3-1所示:

    用户登录时序图
    如图1-3-3-2所示,表示用户登录的时序图

    用户登录分析类图(协作图)
    如图1-3-3-3所示,表示用户登录的协作图

    1.3.4 库存模块进货用例图
    进货的用例图,如图1-3-4-1所示:

    用户登录时序图
    如图1-3-4-2所示,表示用户登录的时序图。

    用户登录分析类图(协作图)
    如图1-3-4-3所示,表示用户登录的协作图。

    1.3.5 职工管理模块进货用例图
    进货的用例图,如图1-3-5-1所示:

    用户登录时序图
    如图1-3-5-2所示,表示用户登录的时序图

    用户登录分析类图(协作图)
    如图1-3-5-3所示,表示用户登录的协作图

    1.3.6 供应商管理模块进货用例图
    进货的用例图,如图1-3-6-1所示:

    用户登录时序图
    如图1-3-6-2所示,表示用户登录的时序图

    用户登录分析类图(协作图)
    如图1-3-6-3所示,表示用户登录的协作图

    第二章 概要分析2.1 系统架构设计
    2.2 数据库设计2.2.1 数据库总体概念设计数据库总体E-R图如图2-2-1所示。

    2.2.2 数据库概念设计通过对于系统的需求分析,整套系统可以设计出六个实体,他们分别是职工实体、供应商实体、进货实体、销售实体、库存实体。
    系统的使用者涉及到多种用户,多以需要一个用户表来保存登陆账号和登陆密码。
    职工表E-R图

    职工数据库表

    供应商表E-R图

    供应商数据库表

    进货表E-R图

    进货数据库表

    销售表E-R图

    销售表

    库存数据库表E-R图

    库存数据库表

    2.3 系统类图设计分析系统,本系统主要包含数据库类和操作类。数据库类包括有进货信息数据库、销售信息数据库、库存信息数据库。操作类主要是对数据库的操作,包括有添加进货、销售、库存、职工、供应商详细信息两个操作。其中添加进货单可以对进货、销售、库存信息数据库执行添加,修改,删除、查找的操作,添加职工、供应商信息可以对物品信息数据库执行添加修改删除的操作。操作类还包含对数据的查询操作,可以根据关键字进行查询;分析以上各个类,作出类图如2-4所示。

    第三章 系统详细设计及实现3.1 系统功能描述本系统主要实现登陆注册模拟超市进货增删改查、销售增删改查、库存增删改查以及对超市内员工的增删和超市供应商的增删。
    3.2 用户登录界面用户登录界面如图3-2所示。

    3.3 职工管理功能职工管理如图3-3所示。

    3.4 供应商管理功能供应商管理如图3-4所示。

    3.5 进货管理功能进货增删改管理如图3-5-1所示。

    进货查询如图3-5-2所示。

    3.6 销售管理功能销售增删改管理如图3-6-1所示。

    销售查询如图3-6-2所示。

    3.7 库存管理功能库存增删改管理如图3-7-1所示。

    库存查询如图3-7-2所示。

    3.8 系统主页面系统主页面如图3-8所示。

    3.9 退出系统退出系统功能如图3-9所示。
    1 评论 7 下载 2019-09-02 12:26:43 下载需要9点积分
显示 30 到 45 ,共 15 条
eject