分类

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

资源列表

  • 基于SSM和mySQL实现的机票预订管理系统

    1、项目简介近年来,我国发展迅速,对交通工具的需求量大幅度增加。飞机作为出行工具之一,花费时间短、用户体验度好,价格实惠、安全性高等优点自然成为人们的首选,这也导致等待时间长、购票效率低等一系列问题的出现,给用户和航空公司造成严重困扰。面对这些问题,在线机票预订系统显得格外重要。
    本系统使用Eclipse开发工具,使用Redis、MySQL数据库,采用MVC三层架构的方式,结合当前最流行的SSM框架以及支付宝沙箱支付环境来实现各个功能。系统分为用户端和管理员端。用户端实现了用户注册与登录、用户评论、机票查询,机票预订,订单查询、广告展示等功能。管理员端包括航班信息管理模块、订单信息管理模块、用户信息管理模块、留言评论管理模块、广告信息管理模块、个人信息管理模块等六大模块,具有开放体系结构的、易扩充的、易维护的、具有良好人机界面的优点。
    经过充分的测试,测试数据均正确无误,各个模块运行良好。机票预订系统的推出,为乘客出行提供方便,便于机场工作人员对机票信息进行管理,提高了机场工作人员对机票管理的工作效率。
    2、系统相关技术概述2.1 Java webJava Web,是用Java技术来解决相关web互联网领域的技术总和。随着Web互联网技术的出现和推广,基于Java技术的Java Web技术应运而生,并为解决互联网相关问题提出解决方案。我们知道,Web是由服务器和客户端两方面组成。基于Java语言的Web框架有很多种,用以适用不同的技术需求,但是都遵循最基本的原则和技术路线,即采用了MVC的架构设计思想,并通过Servlet或者Filter进行请求拦截,同时使用约定,XML或Annotation来实现必备的相关配置,充分利用其面向对象的特质,实现前台用户请求和后台程序响应的工作流程。
    2.2 三大框架SSMSSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。
    Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
    Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常简单规范。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
    MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
    2.3 前端框架AngularJSAngularJS是一个开发动态Web应用的框架。它让你可以使用HTML作为模板语言并且可以通过扩展的HTML语法来使应用组件更加清晰和简洁。它的创新之处在于,通过数据绑定和依赖注入减少了大量代码,而这些都在浏览器端通过JavaScript实现。
    2.4 数据库MySQLMySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
    3、需求分析3.1 系统实现目标如今,互联网遍布于生活的每个角落,不断改变着人们的生产生活,基于Web的机票预订系统就是借助互联网发展的热潮,方便大众,服务大众。具体实现以下两个目标:

    方便用户购票:用户可以访问前台系统浏览、查询航班信息,足不出户,预订机票,免去了以往寻找购票网点,排队购票的麻烦
    航空公司实现办公自动化:后台系统能使航空公司办事效率大幅度提高,它将所有的工作流程按照一系列流程进行规范化,从而减少工作时间,提高了人员的办事效率

    3.2 系统功能分析
    后台航班信息管理:主要是指添加航班信息,删除航班信息,查询航班信息和航班信息详细情况查看等
    后台订单信息管理:后台订单信息管理主要包括订单列表,查询订单信息,订单信息的删除等
    后台用户信息管理:主要指注册用户的展示与按条件查询注册用户
    后台留言评论管理:主要指展示用户的留言信息和按留言日期、留言用户查找留言信息等
    后台公告信息管理:主要指添加公告信息,删除公告信息,设置公告的有效性等
    后台个人信息管理:主要指查看个人信息,修改个人信息
    前台登录与注册管理:包括前台系统用户的注册于登录
    前台首页信息展示:主要是指航班信息展示、航班信息查询、航班信息详情、登录用户信息展示、留言板和个人信息详情与修改等
    前台订单页面:主要是订单内容的填写和订单详情。 前台订单支付:是指使用支付宝沙箱环境支付订单

    3.3 系统用列图系统前台功能用列图

    系统后台功能用列图

    4、系统总体设计4.1 软件架构设计此项目使用经典的三层架构模式[8],分别是表现层,业务逻辑层和数据持久层。如下图所示。


    表现层:表现层也称为表示层,位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面
    业务逻辑层:业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层
    数据持久层:数据持久层也称为是数据访问层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。简单的说法就是实现对数据表的select、insert、update以及delete的操作

    4.2 总体功能模块设计本系统主要分为前台子系统和后台子系统,两个子系统包含的具体功能如下:

    前台功能

    用户登录用户注册航班查询机票详情机票预订订单支付订单查看个人信息查看与修改
    后台功能

    航班信息管理订单信息管理用户信息管理留言评论管理公告管理个人信息管理

    前台子系统和后台子系统详细功能如下图所示。

    4.2.1 前台系统功能设计用户登录功能,详细功能说明如表4.1所示

    用户注册功能,详细功能说明如表4.2所示

    航班查询功能,详细功能说明如表4.3所示

    机票详情功能,详细功能说明如表4.4所示

    机票预订功能,详细功能说明如表4.5所示

    订单支付功能,详细功能说明如表4.6所示

    订单查看功能,详细功能说明如表4.7所示

    4.2.2 后台系统功能设计航班信息管理模块功能,详细功能说明如表4.10所示

    订单信息管理模块功能,详细功能说明如表4.11所示

    用户信息管理模块功能,详细功能说明如表4.12所示

    留言评论管理模块功能,详细功能说明如表4.13所示

    广告管理模块功能,详细功能说明如表4.14所示

    个人信息管理模块功能,详细功能说明如表4.15所示

    4.3 数据库设计4.3.1 数据库结构设计通过建立该系统的E-R图,使整个模块之间的功能变得更加清晰,模块间所具有的耦合性边的越低。

    4.3.2 数据库表设计为实现数据库的设计,对数据进行分表处理,每一个表格代表不同的信息和功能,分别如下图所示。
    管理员信息表(t_manager),用于存放管理员信息,表结构如表4.16所示

    购买记录信息表(t_aircraft),用于存放留言评论信息,表结构如表4.17所示

    航班信息表(t_flight),用于存放航班信息,表结构如表4.18所示

    订单信息表(t_ticketorder),用于存放订单信息,表结构如表4.19所示

    普通用户信息表(t_user),用于存放用户信息,表结构如表4.20所示

    4.4 项目代码实现4.4.1 业务代码 @Resource private AircraftDao aircraftDao; public int deleteByPrimaryKey(Integer id) { return aircraftDao.deleteByPrimaryKey(id); } public int insert(Aircraft record) { return aircraftDao.insert(record); } public int insertSelective(Aircraft record) { return aircraftDao.insertSelective(record); } public int updateByPrimaryKeySelective(Aircraft record) { return aircraftDao.updateByPrimaryKeySelective(record); } public int updateByPrimaryKey(Aircraft record) { return aircraftDao.updateByPrimaryKey(record); } public Integer getCount(Aircraft aircraft) { return aircraftDao.getCount(aircraft); } public Aircraft selectByPrimaryKey(Integer id) { return aircraftDao.selectByPrimaryKey(id); } public List<Aircraft> getAircraftList(Aircraft aircraft) { return aircraftDao.getAircraftList(aircraft); }}
    4.4.2 视图层代码@Controller@RequestMapping("/ticketOrder")public class TicketOrderController { @Resource private TicketOrderService ticketOrderService; private String format = "yyyy-MM-dd HH:mm:ss"; private JsonDateValueProcessor jsonDateValueProcessor = new JsonDateValueProcessor(format); @RequestMapping("/adminTicketOrderPage") public String aircraftList() { return "admin/ticketOrderManage"; } @RequestMapping("/myTicketOrderList") public ModelAndView myTicketOrderList(HttpServletRequest request) {ModelAndView mav = new ModelAndView(); String currentUser = request.getSession().getAttribute("currentUser").toString(); List<Ticketorder> ticketOrderList = ticketOrderService.getTicketOrderByUserName(currentUser); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class, jsonDateValueProcessor); JSONArray array = JSONArray.fromObject(ticketOrderList, jsonConfig); mav.addObject("ticketOrderList",array); mav.setViewName("main_userCenter"); request.setAttribute("mainPage","ticket/myTicketOrderList.jsp"); return mav; }}
    4.4.3 过滤器public class CookiesFilter implements Filter { public void destroy() {} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; System.out.println(request.getRequestURI()); String requestURI = request.getRequestURI(); if (!(requestURI.indexOf("/manager/") > -1)) { chain.doFilter(request, response); return; } else { if (requestURI.indexOf("/manager/managerLoginPage") > -1 || requestURI.indexOf("/manager/login") > -1) { chain.doFilter(request, response); return; } if (request.getCookies() != null) { Cookie[] cs = request.getCookies(); System.out.println(cs.length); if (cs != null && cs.length > 0) { for (Cookie c : cs) { String cName = c.getName(); System.out.println(cName); if (cName.equals("adminToken")) { chain.doFilter(request, response); return; } } } } } response.sendRedirect("/MavenDemo/manager/managerLoginPage"); } public void init(FilterConfig arg0) throws ServletException {}}
    5.项目展示5.1 普通用户登录

    主页

    个人中心


    个人订单

    退票

    改签

    搜索

    5.2 管理员主页

    用户管理

    客机管理

    航班管理

    订单管理

    修改密码
    2 评论 2 下载 2021-08-24 09:45:00 下载需要12点积分
  • 基于SSM架构的网络租车系统

    摘 要随着网络应用的兴起,人们的生活也因此发生了翻天覆地的变化。人们开始利用计算机来解决我们生活中的实际问题,由此诞生了许多互联网产业,同时也有不少传统服务业已经向互联网服务业进行改变,利用网络技术为人们的生活提供更优质的服务。
    本文首先介绍了开发项目使用的框架以及所用插件,对其的优势进行了介绍。然后是本项目的需求分析,主要讲述了本项目中各个角色以及其所拥有的功能和权限。其次是本项目的数据库设计,包括每个字段的类型和长度以及说明。然后是本系统的详细开发流程,展示了项目中的主要页面及主要代码。最后是将对系统进行一些测试,将测试结果进行展示。
    关键词:SSM框架;JAVA技术;租车系统
    AbstractWith the rise of web applications, people’s lives have undergone earth-shaking changes. People began to use computers to solve practical problems in our lives. Many Internet industries have been born. At the same time, many traditional service industries have changed the Internet service industry and used network technologies to provide people with better services.
    This article first introduced the framework used by the development project and the plug-ins used, and introduced its advantages. This is followed by an analysis of the needs of this project. It mainly describes the various roles in this project and their own functions and permissions. Followed by the database design of this project, including the type and length of each field and description. This is followed by a detailed development process for the system, showing the main pages and major codes in the project. Finally, some tests will be performed on the system and the test results will be displayed.
    Keywords: SSM Framework; JAVA Technology; Car Rental System
    1.绪论1.1 课题来源在学校期间,自己通过在老师的指导下完成了一个简易的租车网页,仅仅是将数据库中数据用表格展示,并输入车辆数和天数后完成租车。在公司实习期间,接触到了spring + srpingmvc + mybatis(以下简称SSM)的JavaWeb框架,发现其操作流程清晰,代码不冗杂。经过一段时间的工作积累,决定将以前做的租车系统进行优化,使用SSM框架,maven技术来做一个小型租车网站。
    1.2 课题背景在互联网产业迅速发展的今天,一些线下产业正在被侵蚀,所以需要向互联网企业转型,这样才能不被时代所淘汰。
    而作为租车行业,需要提高商家的知名度。这样用户才能更好的了解商家和车辆信息,以及对比价格。现在每个城市都还存在一些小型租车公司,他们没有一个统一的平台,传播度不高,普及的用户不广。对于不了解地方的外地游客来说,并不能获取租车的信息。所以说开发一个租车系统将各个城市中的线下租车公司进行资源整合。对用户来说,可以更清晰的了解租车公司的车辆信息,以及商家位置,方便了用户。对商家而言,将自己的信息放到网络上,用户可以更加了解自己的店铺,可以提高知名度,也可以更快捷的为用户服务。这正是本项目开发的目的和意义所在。
    1.3 系统设计的目标基于SSM框架的网络租车系统,其开发主要包括前台页面数据的展示,后台是基于MySQL数据库的restful api开发,利用ajax请求api将数据展示在前台页面。

    用户邮箱注册与验证码登陆:用户注册后需要通过邮箱所发邮件链接进行激活,激活成功后才能登陆,否则会提示未激活。当用户选中车辆需要租赁时会需要用户登陆
    查看用户基本信息:修改用户密码,上传用户头像等
    车辆信息展示:使用轮播图展示车辆图片,展示基本车辆信息,使用百度地图api展示商家位置
    商家信息展示:展示基本商家信息,展示商家下的车辆。使用百度地图api展示商家位置
    邮件提醒:用户成功租赁车辆后会向用户和商家发送邮件提醒商家和用户
    车辆管理:上传车辆,修改车辆
    商家管理:上传商家,修改商家
    管理员管理:设置管理员,删除管理员

    2.系统可行性分析2.1 经济可行性由于本次开发所运用技术都是免费开源的技术或者框架,不存在版权收费问题。而且这个项目是JavaWeb项目,开发完成后仅需将war包放到服务器上并且搭配一个域名就可完成一个网站的搭建。用户通过手机或电脑都可以进行访问,不需要很强的配置。而商家上传车辆也仅需要一个电脑和车辆图片,就可完成上传,对于电脑配置也没有很大的要求。所以本系统在经济上就有完全的可行性。
    2.2 技术可行性一个项目是否可以完成开发,还是要看技术是否能达到要求。
    由于在学校期间学习了Jsp,Oracle等技术,对于前台页面的开发还是可以完成的。然后又经过一段时间的实习,学到了更加优秀的技术,并且接触到ssm框架。使自己的眼界和技能都提升了一大步。Mysql和oracle在基本操作上的差异不是很大,而且在公司实习也是用的mysql,并且mysql体积小。经过比较最后决定使用mysql作为数据库。前台页面主要是利用jsp,并且利用bootstrap,jQuery,arttemplter,validform等js插件完成前台页面简洁,优美,功能强大的数据展现。后台部分由于采用了框架,所以对功能实现了分层,使得各个代码之间的逻辑清晰,代码简洁明了。所以掌握的技术还是可以完成整个系统的开发,在技术上也具有可行性。
    2.3 操作可行性操作可行性是指系统开发完成并上线后,用户和商家对于本系统的掌握程度。
    由于本系统整体页面简洁,不冗杂,操作按钮清晰,用户浏览清晰。操作简单。
    商家也仅需会基本的计算机操作,就可完成车辆上传等操作。所以操作上具有可行性。
    2.4 维护可行性一个系统是否能够长远运行,需要有人一直维护系统,对出现的简单错误进行修改,对一些复杂性的错误及时提醒。
    本系统在开发时运用了log4g进行了错误日记记录,维护人员可以根据错误日记信息快速找到错误点,进行判断修改。所以在维护上具有可行性。
    3.关键技术介绍3.1 软件环境软件环境是一个程序的运行土壤,开发程序时需要就要设定好的,如果环境错误或缺失很容易造成系统崩溃或运行错误。

    操作系统:Window10专业版
    Jdk:1.8.0
    服务器:apache-tomcat-9.0.6
    数据库:MySQL 5.7
    系统开发工具:IntelliJ IDEA 2017.2.6

    3.2 开发技术简介本软件系统开发所用到的技术:MySQL 、Java、JavaScrapt、jQuery、Sping、Spring MVC、MyBatis、Maven。
    3.2.1 Java简介Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性。
    由于是将源码编译成class字节码文件,最后由jvm虚拟机来解释执行字节码文件。所以具有“一次开发,到处运行”的跨平台特性。
    3.2.2 JavaScrapt简介JavaScirpt一种高级编程语言,是一种基于原型,函数先行的语言。
    JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
    基本特点:

    是一种解释性脚本语言(代码不进行预编译)
    主要用来向HTML页面添加交互行为
    可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离

    常用来完成以下任务:

    嵌入动态文本于HTML页面
    对浏览器事件作出响应
    读写HTML元素
    在数据被提交到服务器之前验证数据
    检测访客的浏览器信息
    控制,包括创建和修改等

    3.2.3 jQuery简介jQuery是一套跨浏览器的JavaScript库,简化了HTML与JavaScript直接的操作,是目前最受欢迎的JavaScript库。
    jQuery的语法设计使得很多基本操作变得容易,如选择DOM节点、操作文档对象,创建动画效果、处理事件、以及开发Ajax程序。并且有良好的扩展性,可以基于jQuery开发许多插件。
    3.2.4 MySQL简介MySQL拥有体积小、速度快、稳定性高等特点,对于一些数据量不是特别大的中小型网站而言MySQL是最佳的数据库。工作模式是基于客户机/服务器结构。并且有良好的跨平台特性,能够在大部分操作系统上运行。
    基本特点:

    为多种編程语言提供了API
    支持多线程,充分利用CPU资源,支持多用户
    优化的SQL查询算法,有效地提高查询速度
    可以处理拥有上千万条记录的大型数据库

    3.2.5 Spring简介主要解决业务逻辑层和其他各层的松耦合问题,所以整个系统都是面向接口的编程思想。并且采用控制反转(Inversion of Control,IoC)原则的配置管理。使组件应用程序更加方便快捷。
    3.2.6 Spring MVC简介MVC:(Model-view-controller)模式是软件工程中一种常见的软件架构模式,把软件系统总体分为三个大模块:模型(Model)、视图(View)和控制器(Controller)。

    视图层:只是负责页面的渲染,布局和数据的展示。只需通过向后台请求数据就可完成展现。不再考虑后台数据逻辑的处理
    控制层是将视图层发送的请求拦截,再根据不同场景及数据要求调用不同的处理方法
    模型层:主要是后台逻辑处理,针对不同业务场景或需求制定不同的算法,处理不同的数据进行拼装。实现不同的功能

    3.2.7 MyBatis 简介Mybatis是一个Java持久化的框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。与其他类似的对象关系映射框架不同的是,Mybatis并不是将Java对象与数据库表关联,而是将Java方法与Sql语句关联。
    3.2.8 Maven简介Maven:一个软件项目管理及自动构建。
    Maven是一个项目管理和整合的工具。Maven为开发者提供了一套完整的构建生命周期框架。开发团队基本不用花多少时间就能自动完成工程的基础构建配置,因为Maven使用了一个标准的目录结构和一个默认的构建生命周期。在创建报告、检查、构建和测试自动配置时,Maven可以让开发者的工作变得更简单。
    3.3 应用插件简介本软件系统开发所用到的插件:Validform验证表单插件、bootstrap框架、autoComplate自动补充插件,arttemplete模板插件、dialog弹出框插件、idcode插件。
    3.3.1 Validform表单验证用于前台表单页面的校验,并且可以自定义校验类型,以及已有的限定规则,使得表单校验变得很简单。
    3.3.2 bootStrap框架Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。
    3.3.3 autoComplete自动填充搜索关键字输入后,会将符合条件的结果以特定格式展现在输入框下方。
    3.3.4 arttemplate 模板插件art-template 是一个简约、超快的模板引擎。
    特性:

    拥有接近JavaScript渲染极限的性能
    调试友好:语法、运行时错误日志精确到模板所在行;支持在模板文件上打断点
    支持Experss、Koa、Webpack
    支持模板继承与子模板

    3.3.5 dialog 弹出框插件弹出框,相比于原生的alert()方法更美观,可自定义标题和按钮,也可设定回调事件。
    3.3.6 idcode 验证码插件验证码插件。相比于后台的验证码,前台验证码具有速度快,不受网络速度的限制的优势。
    4.系统概要设计4.1 需求分析用户总体分为三种:普通用户,管理员,超级管理员。

    超级管理员:是网站的负责人,可以新建商家,并可以对商家信息进行修改,也可以删除违法或不再继续运营的商家。也可以上传车辆,但是需要指定商家
    管理员:商家的负责人,可以上传车辆,商家指定为自己所在的商家。也可以修改车辆,通过条件筛选车辆。删除不再继续租赁的车辆
    用户:浏览车辆,根据条件筛选车辆,登录成功后租赁车辆。用户注册时没有头像,有一个默认头像,进入个人信息页面后可以修改自己的头像。并修改自己的用户名

    这三种身份都是用户,都需要注册,超级管理员是预先设定的。所以数据库中需要一个用户表,然后一个字段说明用户级别。一个表存储商家下的管理员。
    4.1.1 用户需求分析图
    4.1.2 管理员需求分析图
    4.1.3 超级管理员需求分析图
    4.2 数据库设计数据库名:car_project
    表名:car 车辆表



    序号
    列名
    数据类型
    长度
    小数位
    主键
    允许空
    默认值
    说明




    1
    car_id
    Varchar
    255




    Java的uuid随机生成


    2
    car_brand
    Varchar
    255




    车辆品牌


    3
    car_name
    Varchar
    255




    车辆名称


    4
    car_type
    Varchar
    255




    车辆类型


    5
    car_image
    Varchar
    255




    车辆图片,多张图片之间用“,”拼接


    6
    car_price
    Decimal
    10
    2



    价格


    7
    car_amount
    Int
    10




    数量


    8
    car_people
    Int
    10




    载人数


    9
    car_good
    Decimal
    10




    载货量


    10
    car_info
    Varchar
    255




    车辆描述信息


    11
    rent_count
    Int
    10




    租赁次数


    12
    shop_id
    Varchar
    255




    商家id


    13
    car_milage
    Decimal
    10




    里程数


    14
    car_time
    Date





    购买时间


    15
    user_id
    Varchar
    255




    上传者id



    表名:user 用户表



    序号
    列名
    数据类型
    长度
    小数位
    主键
    允许空
    默认值
    说明




    1
    user_id
    Varchar
    255




    用户的标识,注册时随机生成的字符串


    2
    user_count
    Varchar
    255




    登录账号


    3
    user_name
    Varchar
    255




    用户的名称


    4
    user_email
    Varchar
    255




    用户的邮箱地址


    5
    user_password
    Varchar
    255




    用户密码


    6
    user_registration
    Date
    10
    2



    注册时间


    7
    is_active
    int
    10



    0
    是否激活,用户注册后需通过邮件激活


    8
    rent_count
    int
    10



    0
    租赁次数


    9
    user_image
    varchar
    10



    Default.png
    用户头像


    10
    is_admin
    int
    255



    0
    0 用户,1管理员,2 超级管理员



    表名:shop 商家表



    序号
    列名
    数据类型
    长度
    小数位
    主键
    允许空
    默认值
    说明




    1
    shop_id
    varchar
    255




    商家id


    2
    shop_name
    varchar
    255




    商家名称


    3
    shop_phone
    int
    11




    商家联系方式


    4
    shop_email
    varchar
    255




    商家邮箱


    5
    shop_location
    varchar
    255




    商家位置


    6
    jingdu
    decimal
    10
    7



    位置的经度


    7
    weidu
    decimal
    10
    7



    位置的纬度



    表名:order订单表



    序号
    列名
    数据类型
    长度
    小数位
    主键
    允许空
    默认值
    说明




    1
    order_id
    varchar
    255




    订单id


    2
    user_id
    varchar
    255




    用户id


    3
    shop_id
    varchar
    255




    商家id


    4
    car_id
    varchar
    255




    车辆id


    5
    price
    decimal
    10
    2



    价格


    6
    order_time
    date





    订单时间



    表名:admin管理员表



    序号
    列名
    数据类型
    长度
    小数位
    主键
    允许空
    默认值
    说明




    1
    id
    varchar
    255




    id


    2
    user_id
    varchar
    255




    用户id


    3
    shop_id
    varchar
    255




    商家id



    5.系统详细设计5.1 用户注册与登陆5.1.1 用户注册用户注册页面

    用户登录代码

    用户登录后根据用户等级跳转到不同页面,同时将用户的头像地址,id,用户昵称,等级存放到cookies中。
    用户注册如图4所示需要邮箱地址,因为邮箱是联系商家或用户的一个主要方式。并且在失去焦点后会向后台发送校验请求。校验邮箱、用户名是否被注册。确定密码失去焦点后会自动校验与第一次输入密码是否一致。验证码失去焦点后会自动校验与图片内文字是否一致。校验全部通过后完成注册。
    完成注册后,系统会自动向注册邮箱发送一封激活账户的邮件,用户点击邮件内的链接可以将账户进行激活。
    5.1.2 用户激活用户通过邮件内的链接点击进行是如图6所示的页面。

    出现这样的页面,则标识该用户已经成功激活。并且在3秒后会自动跳转到登录页面。
    5.1.3 用户登陆
    用户在页面点击进入或激活成功后会进入登录页面。
    表单中也用到了Validform表单校验,用来检测用户名是否存在、密码是否与数据库中存储的密码是否一致、验证码是否与图片内文字是否一致。通过后会跳转到首页,并且在点击租赁车辆时如果未登录,也会跳转到登录页面。
    用户登录成功后会向cookies中存储信息,这样在不同页面也可以检查到用户是登录状态。
    5.2 头部栏与底部栏本软件系统中其他页面都通过:
    <jsp:include page=”public/header.jsp”></jsp:include><jsp:include page=”public/footer.jsp”></jsp:include>
    命令将头部栏和底部栏引入到其他页面。
    5.2.1 头部栏
    未登录时头部栏如图8所示,显示的是登录注册按钮,当登录后会变成图9所示,头部栏展示用户头像和用户昵称,以及注销按钮。

    输入框可对车辆和商家进行搜索,搜索结果如图11所示。关键字可以从车辆的品牌、类型、名称来搜索。也可通过商家名称进行搜索。

    如图10所示,对输入框设置键盘抬起事件。并设置一个0.8秒的延迟。设置延迟主要是为了减少搜索次数,如果不设置延迟,在一些输入法或系统下会将每次按键都发送一次请求,设置后会将0.8秒后的输入框内文字进行查询。这样会减少查询次数,减少等待时间。然后根据返回数据的不同对前台的内容设置不同的格式。最后将查询到的数据展示。

    5.2.2 底部栏底部栏主要展示的是开发者信息,以及版权信息。并且加入了邮件的超链接。
    <a href=mailto:ytulnj@163.com>
    点击超链接会自动调用电脑的邮件发送程序,来给指定的邮箱发送邮件。
    5.3 首页首页是一个网站的主页面,是一个网站的脸面,首页的好坏足够影响系统在用户心中的形象。所以要求首页简洁大方,逻辑清晰,可操作性良好。本网站的首页头部和底部嵌入了头部栏和底部栏。中间放入了一个轮播图,展示商家或网站的广告。再向下则是筛选条件,通过筛选条件确定下面的车辆展示。 筛选条件中有车辆品牌,车辆类型,车辆价格等条件。并且车辆价格也可用户自己输入。如果选择错误也可通过重置按钮取消选择。并且三个条件可以联合查询。如果在该查询条件下没有车辆会提示,该查询条件下没有车辆。 下面车辆框展示车辆的图片,车辆的名称、品牌、价格、剩余车辆、租赁次数,以及商家的名称。鼠标移入后会显示边框,提醒用户正在查看的车辆。点击商家名称也可进入商家信息页面。点击车辆框进入车辆信息页面。

    5.4 详细页面车辆详情页和商家详情页都是在detail.jsp展示。通过地址栏中的参数,如果是carId则是展示车辆详情页面,如果是shopId则是展示商家详情页面。
    在详情页会调用百度地图的api将商家位置展示在地图上,并且会定位到用户位置,然后在地图上展现用户到商家的驾车路线。

    传参为商家的经纬度,然后将商家经纬度进行标识在地图中,并设置为15级别的地图大小。并开启地图的鼠标滑轮滚动。然后定位用户位置,将用户位置与商家位置设置为起点和终点,最后驾车路线就会展示在地图中。
    5.4.1 车辆详情页面
    通过车辆id查询车辆信息,以表格形式展现在页面上,车辆图片以轮播图的形式进行播放展示,右侧为租赁车辆的输入框,可以输入租赁的天数以及辆数。如果输入车辆数大于剩余数量则校验不通过。并且如果用户未登录会弹出提示框,提示用户登录,然后跳转到登录页面。
    下方是展示该车辆所在的商家的一些基本信息。
    然后是相同车型的车辆展示,并且限制了数量在20辆以内。
    5.4.2 商家详情页面
    通过商家id进行查询,将基本信息以表格形式进行展现,右侧通过百度地图展示商家位置。下面展示该商家下的车辆进行展示。
    5.5 用户页面由与将不同身份的用户都放到一个页面下展示,并且根据身份不同需要展示的页面内容是不一样的。登录成功后,会在后台存储包括用户id、昵称、头像、身份级别等信息返回前台。前台接受到数据后会向cookies中存储用户信息。包括用户id,用户昵称,用户头像等。使得在不同标签中都可以检测到用户的状态。

    如图16所示,用户在进入用户页面时会根据用户的等级来决定模板,这样就可以让不同身份的用户看到不同的信息。
    5.5.1 普通用户
    用户头像开始是一个默认图片,用户可进入页面自行修改。并且可以进行修改昵称和密码。然后又显示的是一些不可编辑的信息,包括注册时间,邮箱,登录账号和租赁次数等。最后会将租赁的记录展示出来,并且做了限制,只显示最近的20条记录。在租赁记录中点击车辆名称和商家名称都可以进入到车辆或商家的详情页。
    5.5.2 普通管理员
    普通管理员是作为商家下的管理人员,可以进行上传车辆、编辑车辆和删除车辆的操作。点击上传车辆按钮会进入到上传车辆页面,并且上传车辆页面表单中的商家名称固定为所在商家的名称且不可编辑。删除车辆可以单个删除也可通过多选按钮进行批量删除。在删除时会弹出提示框,提醒此操作是危险操作。点击车辆名称可以进入编辑车辆页面。
    5.5.3 超级管理员
    超级管理员作为网站的负责人,可以设置新建商家、编辑商家和删除商家。点击新建商家可以进入新建商家页面。点击商家列表中的商家名称可以进入编辑商家页面。通过删除按钮可以删除单个或批量删除商家,删除时会弹出提示框,提醒此操作是危险操作。
    同时超级管理员也可以为商家设置管理员。由于管理员也是一个用户,所以管理员也需要进行注册并且进行激活。在输入框通过搜索用户账号进行搜索,并且会对输入的关键字进行查询。在搜索商家名称时也可通过关键字进行提示筛选。当用户账号和商家名称输入完成之后点击设置会将输入的用户设置为输入的商家下的管理员。同时超级管理员也有上传车辆的权限,但是点击上传车辆按钮进入上传车辆页面商家名称为空,需要手动输入。原则上超级管理员是不会对车辆进行操作。
    5.6 车辆页面上传车辆和编辑车辆都是在car.jsp页面完成,通过后面是否带参数判断是编辑车辆还是上传车辆。
    由于车辆需要图片来进行展示,所以会有车辆图片的编辑操作,但是不能确定管理员会上传几张图片,所以设定一个按钮,点击后会打开文件框来上传图片,并限制最大数量。在上传图片时可以会操作失误,图片错误,所以需要预览和删除功能。在编辑车辆页面还需要将之前的图片进行展示,如果数量等于最大数量则不允许继续上传,不然则可以继续上传图片,也可对之前的图片进行删除操作。

    5.6.1 上传车辆页面
    点击上传图片按钮会弹出上传文件窗口,并且可以将上传的图片在右侧进行预览。并且在图片下方有一个删除按钮,点击删除后可以将图片删除,这样可以避免点击失误,并且如果对图片不满意可以将其删除。并且限制了最多只能上传6张图片。
    上传成功后会显示如图22所示页面。点击继续上传后可以跳转到上传车辆页面,否则会在3秒后回到首页。

    5.6.2 编辑车辆页面
    可以将以前上传的图片进行删除,也可修改其他基本信息。但是租赁次数是没法修改的。
    修改完成后会出现提示页面并自动返回到首页。
    5.7 商家页面新建商家和编辑商家都是在shop.jsp页面完成,通过判断是否带参数来确定是新建商家还是编辑商家。
    5.7.1 新建商家页面
    商家需要的属性有商家名称,商家联系方式,商家邮箱,商家位置,商家经纬度。
    其中商家名称、商家联系方式、商家邮箱、商家位置都不能重复。商家联系方式作为用户联系商家的方式,商家邮箱作为用户成功租赁车后系统自动向商家发送邮件的地址,商家位置是作为一个商家具有线下实体店的主要信息。商家经纬度主要是作为百度地图标识商家位置的主要参数。
    5.7.2 编辑商家页面超级管理员点击商家名称后进入编辑商家页面,展示商家的基本信息,输入框不可编辑,并且改变了输入框的样式,让输入框只有下边框。点击编辑按钮后输入框可编辑,显示边框。

    5.8 错误页面错误页面主要是对系统可以出现的错误进行预测并设置其错误后显示的页面。本系统主要设置了404错误和500错误后显示的页面。
    5.8.1 404页面
    当地址栏输入的地址不存在时,会自动拦截到404页面,中间会有一个动画效果,并且右侧有个消息框,点击里面的回到首页可以回到系统的首页。
    5.8.2 500错误页面
    并不会将错误信息进行展示,只是拦截,并展示这个页面。
    5.9 后台代码说明
    后台逻辑层次分为controller、dao、data、service、util五个包。Controller层是作为前台与后台的链接,起到拦截调用分发的作用。Dao层是对数据库的操作,主要是对数据库操作的方法,其中一个java接口对于一个相同名称的xml文件,在xml中编写sql。Data层是对数据库中表的映射,一个数据库的表对应一个类文件。Service中是主要逻辑的编写,其中service文件夹中还有一个impl文件夹,在service中编写接口,在impl中具体对方法进行实现。这样暴露接口后其他人员查看不到具体逻辑的实现。Util文件夹中是一些其他操作类,比如邮件发送,图片存储等方法
    6.系统测试6.1 后台代码测试结构如图29所示:

    测试类主要是对后台程序是否能够正常连接数据库,逻辑操作是否正确,方法能否被正确调用进行测试。主要是对dao层和service层进行测试。Dao层主要是看数据库操作结果是否正确。Service层主要是看逻辑操作是否正确。
    6.2 程序运行测试6.2.1 注册注册页面测试图

    用户收到邮件页面

    用户激活页面

    用户信息校验成功。并且注册邮箱会收到一份邮件,点击链接后会将用户激活。
    6.2.2 登录用户未激活页面

    如果账号未激活,会出现提示信息。
    6.2.3 修改头像测试
    点击更好头像后会出现文件框,选择图片后可以实现图片预览,不点击保存是无法更换成功的,只能将图片展示。点击保存后,保存按钮消失,头部栏的头像也会发生改变。
    6.2.4 租赁车辆测试
    当租赁数量大于剩余车辆时会提示数量错误。

    当未登录时会弹出提示框提示用户需要登录。

    用户登录后再进行选择会提示所租车辆名称和天数,辆数以及价格。点击结算后系统会自动向用户和商家发送邮件进行提醒。
    总结毕业设计主要是对大学期间所学知识的检验,将所学知识转换成项目实战。这个项目也是将自己从学校学到的知识和从公司学到的知识进行融合,利用ssm框架完成一个小型网站的开发。从题目的选取、整个项目的需求分析、数据库设计、页面设计、具体代码实现、系统测试这些不管是整体架构还是琐碎细节都需要自己来进行实现。这整个过程让我受益匪浅。
    整体开发过程中遇到的错误还是很多的,但是经过自己的思考、网络资源的提示、同学老师的帮助,这些困难还是被一一克服了。
    这个系统还有很多可以改进的地方,比如手机号验证码等、通过浏览器或ip地址定位进行导航、用户登录使用第三方账号比如QQ或微信。这也是以后需要完善的地方。
    参考文献[1] 梁弼.SSH框架整合技术研究及应用[J].西安文理学院学报:自然科学版,2011,14(3):16-19.
    [2] 陈夫真.基于SSM的某高校教室管理信息系统的设计与实现[D].苏州:苏州大学,2012.
    [3] 张锦煌,吴丽娟,梁舒婷.基于SSM整合框架开发的项目管理系统[J].电脑知识与技术,2015,11(11):103-105.
    [4] 孙卫琴. Java面向对象编程[M]:北京:电子工业出版社, 2006.7 .168-172
    [5] 阎宏. Java与模式[M]:北京:电子工业出版社, 2002.10..88-96
    [6] 孙卫琴等著.基于MVC的Java Web设计与开发.北京:电子工业出版社,2012
    [7] 陈雄华,林开雄,文建国.精通Spring 4.x:企业应用开发实战[M].北京:电子工业出版社,2017.1
    [8] 张海藩.软件工程导论[M].北京:清华大学出版社,2013.
    [9] 徐国智.MySQL数据库系统开发实例精粹[M].北京:电子工业出版社,2006
    [10] 朱华方.基于SSM框架轻量级的分布式高考成绩管理系统设计与实现[D].济南:山东师范大学,2016.
    [11] 胡启敏,薛锦云,钟林辉.基于Spring框架的轻量级J2EE架构与应用[J].计算机工程与应用,2008(05):115-118
    [12] 徐雯,高建华.基于Spring MVC及MyBatis的Web应用框架研究[J].微型电脑应用,2012,28(07):1-4
    5 评论 39 下载 2021-03-27 09:20:15 下载需要11点积分
  • Python实现的基于Scrapy爬虫框架和Django框架的新闻采集和订阅系统

    摘要随着互联网的迅速发展,互联网大大提升了信息的产生和传播速度,网络上每天都会产生大量的内容,如何高效地从这些杂乱无章的内容中发现并采集所需的信息显得越来越重要。网络中的新闻内容也一样,新闻分布在不同的网站上,而且存在重复的内容,我们往往只关心其中的一部分新闻,网络中的新闻页面往往还充斥着大量许多与新闻不相关的信息,影响了我们的阅读效率和阅读体验,如何更加方便及时并高效地获取我们所关心的新闻内容,本系统能够帮我们做到这一点。本系统利用网络爬虫我们可以做到对网络上的新闻网站进行定时定向的分析和采集,然后把采集到的数据进行去重,分类等操作后存入数据库,最后提供个性化的新闻订阅服务。考虑了如何应对网站的反爬虫策略,避免被网站封锁爬虫。在具体实现上会使用Python配合scrapy等框架来编写爬虫,采用特定的内容抽取算法来提取目标数据,最后使用Django加上weui来提供新闻订阅后台和新闻内容展示页,使用微信向用户推送信息。用户可以通过本系统订阅指定关键字,当爬虫系统爬取到了含有指定关键字的内容时会把新闻推送给用户。
    [关键词]网络爬虫;新闻;个性化;订阅;Python
    AbstractWith the rapid development of the Internet, the Internet has greatly enhanced the production and dissemination of information, the networkwill produce a lot of content every day, how to find and collectthe information we needed from these disorganized contentefficiently is more and more important. The news content on the network is thesame, the news is distributed on different sites, and there are many duplicate content, we only care about part of thenews usually. The network news pages areoften filled with a lot of news and information is not related that impact ourreading efficiency and readingexperience. How to more convenient and efficient access to the news we are concerned about the content, thissystem can help us to do this. This system uses the web crawler to collect news on the network site. And then toclassify data and other operations like delete the duplication,store data byuse the database, and finally providepersonalized news subscription service. This system has considered how to deal with the sit&s anti-reptile strategy, toavoid being blocked by the site crawler. In the concrete implementation, I will use Python with Scrapy framework towrite the crawler, then use a specificcontent extraction algorithm to extract the target data, and finally use Django and WeUI to provide news subscription background and news contentdisplay page, use WeChat to push information to users. Users can subscribe tothe specified keywords through the system, system will push thenews to the user when the crawler system crawled the contents contains thespecified keyword.
    [Keywords] Web Crawler;News; Personalization; Subscription; Python
    第一章 引言1.1 项目的背景和意义如今我们所处的时代是一个信息时代,信息处处影响着人们的生活,无论是个人还是企业,都希望能够获取自己所关心的内容。人们获取信息的方式渐渐从传统的纸质阅读转移到了信息传播速度更快互联网的在线阅读上,而许多媒体和互联网企业都推出了各自的新闻门户来提供新闻内容阅读和检索等功能,但是这些新闻信息仍需要我们主动去访问这些网站才能获取到,而且我们还要在这些新闻中筛选出自己所关心的内容进行阅读,这样浪费了我们许多阅读之外的时间。网络中的新闻分布在不同的网站上,我们往往只关心其中的一部分新闻,网络中的新闻页面往往还充斥着大量许多与新闻不相关的信息,影响了我们的阅读效率和阅读体验,如何更加方便及时并高效地获取我们所关心的新闻内容,这是一个急需解决的问题,本系统就是为了解决这样的痛点而产生的。
    1.2 研究开发现状分析1.2.1 个性化新闻服务现状如今国内外存在众多提供个性化新闻服务的互联网公司,如著名的ZAKER和今日头条,这些公司的产品都能够根据你的兴趣爱好来展示和推荐你喜欢的内容,这种创新性已经颠覆了传统的新闻资讯平台的市场格局,大众纷纷表现出对这些个性化新闻平台的追捧。据最新的《中国互联网络发展状况统计报告》显示,截至2016年12月,中国网民规模达7.31亿,移动互联网用户规模达到6.95亿,其中新闻资讯领域行业用户规模达到6.14亿,年增长率为8.8%,在移动端渗透率达到82. 2%。 [1]新闻资讯信息的用户需求也更加细分,用户对内容的需求也更加精细,除了方便阅读、时效性高、趣味性强外,个性化推荐方式也越来越受到用户的关注。在猎豹全球智库发布的安卓2016年1月新闻类APP排行榜中,作为个性化新闻平台的今日头条、一点资讯皆排在移动资讯APP的前三位。而前三中采用传统编辑推荐方式的只有腾讯新闻,可见如今个性化新闻平台已经成为绝对的主流。
    1.2.2 网络爬虫研究现状网页抓取工具是一种根据特定规则来自动获取互联网信息的脚本或程序。[2] 网页或搜索引擎等网站通过爬虫软件来更新自己的网站内容或者是更新对其他网站的索引。一般来说,网络爬虫会保留被抓取的页面,然后用户可以通过搜索引擎后来生成的索引进行搜索。因为爬虫访问网页的方式与人类相似,而且一般比人类访问的速度要快,会消耗访问的网站的系统资源。因此爬虫在需要大量访问页面时,要考虑到规划和负载等情况,否则容易被网站禁封。网站站长可以使用robots.txt文件来告诉爬虫访问的规则。robots.txt文件是一个具有指定格式的文件,网站站长可以通过此文件来要求爬虫机器人不能访问某些目录或者只能访问某些目录。互联网上的页面极多,而且数量一直在增长,即使是像谷歌这样的爬虫系统也无法做出完整的索引,因此在某些地方会根据需求来做一些主题化的爬虫,这样的爬虫爬到的结果往往能够更加精确。
    1.2.3 项目的范围和预期结果本文描述了基于网络爬虫的新闻订阅系统的设计与实现的过程,主要工作如下:

    编写一个网络爬虫,使其能够对网络中指定站点的新闻进行自动收集并存入数据库;
    数据的去重和网络爬虫的反爬虫策略应对;
    提供一个新闻展示页面,把爬取到的新闻展示给用户;
    提供新闻订阅页面,用户可以在页面输入指定订阅的关键词;
    编写微信推送服务,把用户订阅的新闻通过微信推送给用户;
    1.3 论文结构简介本论文的结构安排如下:

    第一章,引言。主要介绍了论文选题项目的背景、意义和目的;以及对相关领域中已有的研究成果和国内外研究现状的简要评述;介绍本系统涉及的范围和预期结果等。
    第二章,技术与原理。主要介绍本系统中所用到的主要技术和理论。
    第三章,系统需求分析。使用用例析取和用例规约等系统分析方法对本系统进行了需求分析。
    第四章,新闻采集与订阅系统的设计。介绍了系统的架构与原理,讲述本系统的各大模块的设计以及数据库的设计详情。
    第五章,新闻采集与订阅系统的实现。介绍本系统具体的实现过程以及实现的效果。
    第六章,系统部署。介绍本系统的部署环境与部署方法。
    第七章,总结与展望。对本系统所做的工作进行总结,提出了需要讨论的问题和一些本系统中可以改进的地方。

    第二章 技术与原理2.1 技术选型2.1.1 Python语言介绍Python是一种面向对象、解释型的计算机程序编程语言。它包含了一个功能强大并且完备的标准库,能够轻松完成很多常见的任务。它的语法比较简单,与其它大多数程序设计语言使用大括号把函数体包起来不一样,它通过缩进来定义语句块。[4]使用P帅on能够高效灵活地实现开发的任务,内置库以及大量的第三方库能够在许多地方避免重复造轮子的现象,有时使用c++语言来实现的一个功能可能需要几十行,Python只需要几行就足够了。与传统的脚本语言相比,Python拥有更佳的可读性和可维护性。这门语言的强大吸引到了许多开发者,拥有比较热门的Python社区,许多开发者在维护着这种Python编写的库,影响力也在日益增强。在网络爬虫领域,Python这门语言的使用也比较广泛,留下了大量的前人的学习研究的资料。基于以上优点,我选择了使用Python来开发本系统的网络爬虫部分和展示部分的服务端。
    2.1.2 Scrapy框架介绍Scrapy是一个纯Python基于Twisted实现的爬虫框架,用户只需要定制开发几个模块就可以方便地实现一个爬虫,用来抓取网页内容、图片、视频等。它最初是为了网站页面抓取所设计的,也可以应用在获取网络应用API所返回的各类数据或者是编写通用的网络爬虫。Scrapy用途比较广泛,可以应用于数据挖掘、自动化测试和数据监控等场景。Scrapy提供了一些网络爬虫中比较通用的中间件和模块等,也可以方便地编写自己所需的中间件来对爬取结果进行处理,只要在配置里面引用这些中间件就可以了。使用Scrpay来编写爬虫可以降低很多需要重复编写的爬虫处理代码所带来的成本。
    2.1.3 Django框架介绍Django是最早由Python实现的最着名的Web框架之一,最初是由美国芝加哥的Python用户组来开发的,拥有新闻行业背景的Adrian Holovaty是Django 框架的主要开发人员之一。在Adrian的领导下,Django团队致力于为Web开发人员提供一个高效和完美的Python开发框架,并授权开发人员根据BSD开源协议许可证免费访问。Django是一个高效的Web框架,可以帮助我们减少重复的代码,并把更多重点放在Web应用程序上的关键之处。在架构上,Django 跟Scrapy类似,也提供了中间件等,配置的方式也是类似的,使用类似的技术架构可以减少学习成本。本系统中我选用Django作为新闻订阅的服务端来提供API。
    2.1.4 MongoDB数据库介绍MongoDB是一个由C++语言编写的高性能,无模型的开源文档型数据库,是当前NoSQL数据库产品中最具有代表性的一种。MongoDB是使用文档来作为对象存储的,一条记录对应一个文档,集合类似传统的关系型数据库中的表,集合中存放的是那些具有同一特征或者属性的文档。在一个集合中,不同文档拥有的属性可以是不同的,这就是与传统的关系型的数据库的重点了,传统的关系型数据库要求表里的数据所拥有的属性格式都是一致的,MongoDB这种灵活性更利于文档映射到一个对象或一个实体上。对于需要经常改动数据格式或者数据格式不定的一些需求来讲,这种数据格式更为合适。MongoDB在读写性能方面也远超传统的关系型数据库的代表之一的MySQL。在本系统中我使用MongoDB 来存储爬取到的数据以及用户数据等。像MongoDB这样的非关系型数据库更合适储存爬虫数据,因为爬虫数据量可能比较大,数据之间关系型也不强。 MongoDB的性能也比传统的关系型数据库代表MySQL之类要强。
    2.1.5 AJAX介绍AJAX(异步的JavaScript + XML)本身并不是一种技术,它是由Jesse James Garrett在2005年提出的一个术语,描述了一种需要结合使用大量已经存在的技术的方式,包括HTML, JavaScript, CSS, DOM, JSON, XML等,还有最重要 JavaScript中的的XMLHttpRequest对象。当这些技术以AJAX模型的方式聚合时,Web应用程序可以更迅速地,无需加载整个页面就能更新全部或者部分的用户界面。这使Web应用能够更快地响应用户行为,带来更友好的用户体验。尽管在AJAX中X代表XML,但现在JSON使用的更多,因为JSON具有许多XML不具备的优势,比如它更轻量并且是JavaScript的一部分,各个程序语言都能够轻松解析JSON格式的数据。在AJAX模型中,JSON和XML的作用都是承载信息。[6]本系统会在新闻订阅和展示部分的前端使用AJAX来跟服务端进行交互,以达到前后端分离的目的。
    2.2 相关原理介绍2.2.1 网络爬虫介绍网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种自动提取网页的程序,它为搜索引擎从万维网上下载网页。传统的爬虫的启动从一个或多个初始网页开始的,从这些初始网页上获得接下来要爬取的URL,在抓取网页内容的过程中,不断从当前页面的内容上抽取新的需要继续爬取URL放入队列,直到满足系统的一定停止条件。[7]网络爬虫的抓取策略大致可以分为以下三类:广度优先搜索策略、深度优先搜索策略、最佳优先搜索策略等。本系统的爬虫部分使用的爬虫策略是广度优先搜索策略,因为本系统的网络爬虫具有针对性,所以爬取的层数不会很多。
    2.2.2 关键词提取技术通过分析文本,利用关键词抽取技术可以抽取出文本的关键词,关键词能够简单地反映出文本的主要内容,使人们更加直观方便地了解到文本内容的主题。关键词提取的技术有许多种,最常用的应该是基于统计的方法的TF-IDF算法。 TF-IDF(term frequency-inverse document frequency)是一种常用的用于数据挖掘与信息检索的加权技术。[8]词语的重要性是在TF-IDF算法中主要是由它在文中出现频率决定的。
    Jieba是一个基于Python的中文分词库,支持三种分词模式:精确模式、全模式和搜索引擎模式,它能够基于Trie树结构来实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图,采用了动态规划查找最大概率
    路径,找出基于词频的最大切分组合。在本系统中,将考虑使用Jieba分词基于 TF-IDF算法的关键词抽取来抽取出爬取到的新闻内容的关键词。
    2.2.3 智能推送技术当我们使用如今的一些应用程序时,会经常收到来自这些应用的推送,过多的、不适当的推送会打扰到用户,互联网技术在最近几十年里已经得到了很大的发展,但是推送通知技术仍旧停留多年以前。为了实现智能化推送,我们需要搜集和分析能够帮助我们实现智能化推送通知的用户数据,这些数据的来源可以是用户的设置或者用户在应用中产生的数据等。在智能推送通知中,与时间相关的,个性化的,有帮助的,有联系性的是智能推送通知中四个基本的特征。
    在推送的时间上,我们可以做到时间智能化,时间智能化指的是推送的时间要恰当,推送发生在不恰当的时间比无用的垃圾推送消息造成的不良效果更验证。在不恰当的时候推送的通知不但打扰到用户,还很容易会被用户忽略。智能推送应该能够做到自动解决推送时间不恰当的问题。具体的实现可以通过一个对推送信息的重要性评估的引擎来决定消息推送的时间。
    在个性化上,我们可以把推送机器人设计成人类的形态,比起传统的系统消息,拟人化的方式能够让人更加容易接受,如苹果的Sin和微软的Cortana。当我们将来自机器智能的推送通知语言根据用户自己的特点进行调整后,用户在查看时看到的是更像交流式的风格,会感到更有亲切感,更加个人化。
    在推送的内容上也要慎重选择,根据不同用户来推送不同的内容。因为对于用户来说,只有用户关心的内容才是对用户有帮助的。拿新闻订阅应用来讲,就是用户只会对某些主题内容的新闻感兴趣,应用要做的就是把新闻的主题进行分析,打上不同的标签。然后找到用户兴趣中含有这些标签用户进行推送。如果不经处理对全部用户进行统一的推送,用户需要花费大量时间在这上面去过滤出自己感兴趣的内容。
    在推送内容的数量上也有讲究,如果一个服务高频次地的使用通知推送,用户可能会感觉到被冒犯然后会关掉它,后面的推送就都收不到了。因此,将推送的内容进行分组就很重要了。系统可以把一些相似的通知进行分组合并,可以减少对用户的打扰,在消息很多的时候这种优势就很明显了。在信息较少的时候可以选择把这些推送通知进行展开,因为此时用户可能会比较关心这些少见的内容,也是一个不错的选择。
    第三章 系统需求分析3. 1 新闻订阅系统用例析取基于网络爬虫的新闻采集与订阅系统要实现新闻数据抓取,数据过滤,数据筛选,数据展示,新闻订阅,推送等服务和功能,本系统用例图如图3.1所示:

    本系统主要用于以下几类人员:

    数据管理员,完成数据的抓取,过滤与筛选,新闻的推送,以及本系统管理维护等。
    用户,在网页上进行新闻订阅,通过微信接收订阅新闻的推送,点击进入对应新闻展示页面等。

    3.2 新闻订阅系统用例规约3.2.1 新闻订阅3.2.1.1 简要说明本用例允许用户增加或者删除自己订阅新闻的关键字,以及对已经订阅的关键字进行确认等操作。
    3.2.1.2 参与者用户。
    3.2.1.3 事件流基本事件流:用例开始于用户进入新闻订阅页面进行操作。

    订阅新闻关键字的状态共有两种,分别为“已订阅”、“未订阅”。顾客可以在相应的状态下进行操作,选择增加关键字或者删除关键字。
    如果关键字状态为“未订阅”,用户可以增加该关键字到自己的订阅列表中,本用例结束。
    如果关键字状态为“已订阅”,用户可以选择删除该关键字,本用例结束。
    无特殊要求。
    前置条件:本用例开始前用户必须是微信已登录状态。
    后置条件:如果用例成功,用户的订阅列表将被更新。
    活动图

    3.2.2 新闻推送3.2.2.1 简要说明本用例允许数据管理员根据新闻的关键字向已经订阅该关键字的用户进行推送等操作。
    3.2.2.2 参与者数据管理员。
    3.2.2.3 事件流基本事件流:用例开始于爬虫系统采集到新闻时。

    系统将新闻内容根据算法与用户订阅的新闻关键字作对比,对比结果分别为“匹配”、“不匹配”。如果匹配状态为“匹配”,系统将调用微信推送接口向用户推送该新闻,本用例结束。如果匹配状态为“不匹配”,用户将不会收到该新闻的推送,本用例结束。无特殊要求。前置条件:本用例开始前采集到的新闻必须有效。后置条件:如果用例成功,用户将收到一条新闻推送。活动图

    第四章 新闻采集与订阅系统的设计4.1 系统架构及原理本新闻采集与订阅系统分别由爬虫部分与新闻订阅和展示部分构成,在新闻订阅与展示部分采用基于C’s的架构,代码的组织方式为MVC三层结构,其中的三个层次分别为视图层(View)、控制器层(Controller)和模型层(Model)。代码整体采取前后端分离的方式,前端负责视图层,后端负责模型层和控制器层,客户端使用微信和网页实现,前后端通讯使用AJAX交换JSON的方式。系统的总体框架图如图4.1所示:

    爬虫部分使用了Python编写Scrapy框架,它的基本架构如图4.2所示,其中 Scrapy引擎的作用是控制数据的流向,是整个爬虫框架的核心。网络蜘蛛(spiders) 定义了如何爬取某个(或某些)网站,包括了爬取的动作以及如何从网页的内容中提取结构化数据。蜘蛛中间件(spider middleware)是在Scrapy引擎和网络蜘蛛间的一个钩子,它可以处理蜘蛛的输入与输出。调度器(scheduler)能够从Scrapy引擎接受请求并放入队列,在引擎请求调度器时返回对应的请求。下载器(downloader)负责下载网页,把爬取到的内容返回给Scrapy引擎和网络蜘蛛。下载器中间件(downloader middleware)是在Scrapy引擎和下载器间的一个钩子,它可以处理传入的请求跟传出的响应。Item Pipeline负责处理网络蜘蛛传过来的Item,可以在此做数据格式化,数据清理等操作。

    爬虫的整体上数据流向的开始是由Scrapy引擎让网络蜘蛛以一个初始的 URL来初始化一个请求,并设置回调函数,然后网络蜘蛛把该请求向调度器申请任务,把申请到的任务交给下载器,这里会经过一次下载器中间件,然后下载器把下载完后产生的响应再经过一次下载器中间件,然后传递给引擎,引擎接收到该响应后通过蜘蛛中间件传给网络蜘蛛处理,网络蜘蛛处理该响应,产生一个 item或者是新的请求给引擎,引擎会把传过来的item放入Item Pipeline,把传过来的新的请求传给调度器,Item Pipeline获取接收到的item对该item进行逐层处理,接着这个流程就重复直到爬取完成。
    4.2 系统模块设计4.2.1 爬虫采集模块设计使用Scrapy框架来编写爬虫首先要编写核心的蜘蛛(sPiders)的代码,Spider 类定义了如何爬取某个(或某些)网站,包括了爬取的动作以及如何从网页的内容中提取结构化数据。本系统主要针对网易新闻和腾讯新闻的科技频道进行主题式的爬虫,所以设计了两个网络蜘蛛,名字分别为Neteasespider和QQSpider,如果后续需要更多需要爬虫的站点,只要增加对应站点的网络蜘蛛就可以了,其余处理部分都是通用的。在这里选择主题式的爬虫的原因主要是一个通用爬虫对于新闻这样的每个站点的文章有固定格式的爬取解析的代价比较大,还不如手工去对需要爬取的站点进行分析,根据每个站点的特点来编写解析的代码。这样的主题式的爬虫能够提高爬虫的精确度,同时也提高了爬虫的效率,这样我们的爬虫就能够及时爬取到最新的新闻内容了。每个站点对应一个特定的网络蜘蛛还有一个好处就是如果后续需要完成分布式爬虫等需求时会很方便,因为这样的方式代码之间的祸合度较小,同时非常简洁。
    网络蜘蛛首先从一个Start url开始爬取,这里我选取了网易新闻和腾讯新闻的科技频道的首页,蜘蛛爬取这个起始URL上的页面后,对里面的内容进行解析。因为每篇新闻的URL都具有一定的格式,凡是该页面上有符合这种格式的 URL,蜘蛛都会对这些URL进行回调,继续爬取这些URL的页面,这些页面上就会包含所要获取的新闻的内容了。对于同一个新闻站点来说,一般页面上的内容的结构也是一样的,所以按照一定的规则来对这些页面上的内容进行解析,获得新闻内容原始数据,对这些数据进行格式化的处理,封装成一个item,传回给 Scrapy引擎处理。
    因为新闻具有一定时效性,一般来说我们只会关注那些新产生的新闻内容,所以本爬虫不需要考虑需要爬取过往产生的新闻的情况。本系统的爬虫部分只聚焦于每个站点的首页的新闻,因为新闻是滚动刷新的,所以我们需要定时对首页进行爬取,获取新的新闻内容。本系统设计了一个类似守护程序,来控制爬虫的启动与停止,在爬虫结束后等待一段时间再重新开始爬取。
    4.2.2 爬虫去重模块设计在爬虫过程中会遇到重复内容的情况,所以我们需要设计一个爬虫用到的去重的模块。考虑到每个URL对应的新闻内容是不变的,我们只要针对URL来进行去重即可,而不需要等到把内容取回来之后再判断内容是否已经爬取过,那样会消耗大量额外的资源,也对目标网站造成了额外的压力,显得不友好。我们选择去重的时机是Scrapy的调度器把请求分配给下载器之前,也就是说在下载器中间件中处理,在本系统中定义了一个下载器中间件RedisMiddleware,这个中间件的作用是在Redis的一个散列中判断是否存在该URL,如果不存在,把该请求传给下一个中间件处理。如果该URL存在于散列中,则忽视掉该请求,不进行后续操作。在本系统中定义了一个Item管道RedisPipeline,在爬取数据完成后,数据库处理完后Item会传到该管道,该管道的作用是把这个新闻所属URL 存入Redis的散列中,标记该URL已经爬取。
    4.2.3 防反爬虫模块设计防反爬虫是在大多数爬虫中需要考虑的情况,因为爬虫对网站服务器造成的压力比正常人要多,如果爬取频率足够高的话,会使网站访问变慢,甚至无法访问,所以网站可能会有一系列的反爬虫措施。首先我们的爬虫需要遵守网站的爬虫协议,然后把爬取速率控制好,例如间隔一秒才爬取一个页面。其次,我们需要伪装成一个浏览器,有些网站会通过HTTP请求头中的User-Agent中的信息来判断用户,我们不但需要在爬虫请求中的HTTP设置User-Agent请求头,还需要对该请求头进行更换,因此在本系统中定义了一个下载器中间件RotateUserAgentMiddleware,这个中间件的作用是在请求前在请求的HTTP请求头中设置一个轮换的随机的模拟用户浏览器的User-Agent请求头,这些 User-Agent与真实浏览器的User-Agent一致,数据来源是Python中一个叫 fake-useragent的库。后续如果对方服务器针对’P进行禁封了的话可以采用代理服务器的方式来应对,在做了以上措施的情况下本系统目前没有出现过被禁封的情况,因此该方法没有在本系统中实现。
    4.2.4 爬虫存储模块设计爬虫的数据存储是一个爬虫系统中很重要的一部分,因为爬虫的目的就是获得数据,在这里我们需要考虑数据的存储方式与储存时机。在本系统中储存部分使用了ORM(对象关系映射)的方式来实现,ORM的好处在于把数据访问的细节隐藏起来,在ORM上的操作出错的可能性会比手写数据库操作的可能性低。在ORM中,我们只需要关注数据的结构,这样一来,我们只需要编写数据储存对象的参数定义等属性跟方法就可以了,初始化、查询、更新等操作都可以由 ORM来实现。在本系统中,爬虫部分与订阅和展示部分都共用一个数据库,爬虫部分需要对数据库进行写操作,展示部分需要对数据库进行读操作。在蜘蛛解析完数据后,蜘蛛会把封装好的Item通过Scrapy引擎传给Item管道,本系统中定义了一个MongoDBPipeline,这个管道的作用是维持一个MongoDB的数据库链接,接收到传入的Item后先校验完数据的完整性,然后把合法的数据插入数据库对应的集合中,否则丢弃该Item。
    4.2.5 消息推送模块设计消息推送部分本系统使用微信来实现,需要用户关注指定公众号。本系统需要推送消息给用户时,先选择一个本系统预定义的模板,在模板中填入消息标题,内容和链接等数据后,通过微信提供的接口来进行推送。这里需要注意的是我们需要给推送的消息接口提供一个本系统所用的公众号的AccessToken,这个 AccessToken是向微信证明本系统的凭证,它有一定的有效期,需要定时刷新。
    4.2.6 消息订阅与展示模块设计消息订阅与展示模块是本系统中与用户交互的模块,这个模块负责用户订阅新闻的功能与向用户展示所需新闻内容的模块。在本系统蜘蛛解析完数据后,蜘蛛会把封装好的Item传给MongoDBPipeline储存后,会继续往下传递,传递到一个PushPipeline中,这个管道的作用是判断爬取到的数据是否包含用户所订阅的关键词,如果包含的话则调用消息推送模块把新闻消息推送给用户。在消息推送后,用户会在微信端本系统的公众号中接收到一条包含新闻消息简要内容的消息,点击该消息可以跳转到新闻展示页面。本系统提供了一个消息订阅页面,用户可以在该页面上管理自己的新闻关键词。
    4.3 数据库设计本系统存放数据用到的数据库分别是Redis和MongoDB,在本系统的数据库设计中,数据库的集合主要包括爬取到的新闻信息集合和用户订阅新闻关键词集合,系统的配置信息都写在配置文件中,就不需要使用数据库来存放了。这里选择MongoDB的原因是考虑到当爬虫的数据量和并发数很大时,关系型数据库的容量与读写能力会是瓶颈,另一方面,爬虫需要保存的内容之间一般不会存在关系。另外本系统会使用Redis中的散列类型来存放已经爬取过的URL和不合法的URL,因为判断URL是否合法或者是否已经爬取过是一个高频的操作,使用 Redis这样的高性能的内存键值对类型的数据库可以减少主数据库的压力,同时提高爬虫的性能。
    新闻信息集合



    属性名
    含义
    类型
    说明




    title
    新闻标题
    string



    content
    正文内容
    string
    纯文本


    source
    来源
    string
    新闻出处


    published
    发布时间
    timestamp
    精确到秒


    url
    原文链接
    string
    用于跳转



    用户订阅新闻关键词集合



    属性名
    含义
    类型
    说明




    open_id
    用户微信openid
    string
    唯一标识


    keywords
    订阅的关键词列表
    array
    字符串类型的数组


    tags
    订阅的标签列表
    array
    字符串类型的数组



    第五章 新闻采集与订阅系统的实现5.1 系统框架实现本新闻采集与订阅系统的爬虫部分框架是利用Scrapy自带的命令行工具来初始化,初始化后已经创建好了Scrapy引擎所需的几个重要的文件,如中间件,数据管道,配置文件等,这样做的好处是能够快速搭建起框架,并且能够达到官方定义的最佳实践。接下来我们可以在这个目录下定义自己的一些模块文件,再在这些文件中实现自己的处理函数就可以了,最终实现的爬虫部分的目录结构如图5.1所示,其中items.py是用于定义数据储存模型的文件,middlewares.py是用于定义中间件的文件,pipelines.py是用于定义数据管道的文件,settings.py是本系统爬虫部分的配置内容,spiders文件夹中存放了不同爬虫的网络蜘蛛代码, utils.py则是一些通用的函数存放的地方,wechat_config.py和wechatpush.py分别是微信推送部分的配置和推送代码。

    新闻订阅和展示部分的API服务器端则使用Django自带的命令行工具来初始化,使用django-admin startproject命令来新建一个项目,然后使用django-admin startapp命令来新建一个app,这样API服务器的基本框架就完成了,然后往创 建的目录中添加其余代码,最终实现的新闻订阅与展示部分的目录结构如图5.2 所示,其中frontend文件夹存放的是本系统的前端静态文件,分别是新闻订阅页面和新闻展示页面,init_db.py文件是一个用于初始化数据库用的脚本,lib文件夹中存放的是本系统中一些能够被公用的函数文件。manage.py是由Django生成的用于管理任务的命令行工具脚本,newsweb存放的是本项目的代码,run server.sh是一个用于启动服务器的脚本文件,web server中存放的是本系统新闻订阅与展示部分的服务端代码的主要文件,主要包括了用于配置路由 urls.py,存放新闻和订阅信息数据模型models.py和提供API的views.py。

    5.2 爬虫采集模块实现爬虫采集模块的核心的网络蜘蛛,下面以爬取网易科技频道新闻的蜘蛛为例讲解本系统爬虫采集模块的实现过程。图5.3为该蜘蛛的解析网页请求响应的代码,首选我通过分析网易科技频道新闻中的网页源码,分析得到网页中所需的新闻内容的数据所在的位置特征信息,例如通过分析发现标题位置是处于html标签下的head标签里的title标签里的文本。24-27行中的代码的作用是通过xpath 使用之前分析出来的格式来从抓取到的数据中提取出新闻相关的信息,包括新闻标题、新闻消息来源、新闻内容、新闻发布时间。29-32行的代码作用是把时间解析为时间戳,这样做的目的是为了方便把时间转换成不同的表现格式,时间表现会更为准确。34-40行的代码作用则是把数据封装成一个本系统中的新闻Item, 然后传给Item管道来处理。另外一个用于爬取腾讯新闻科技频道蜘蛛的分析方法和代码写法是类似的,在这就不详细介绍了。

    为了实现定时爬虫的功能,在本系统中实现了一个名为worker.py的守护进程脚本和一个start_crawl.py的用于调用爬虫的脚本,运行worker.py脚本后会每三十秒调用启动一次start_crawl.py,start_crawl.py每次启动会调用爬虫主程序,程序核心代码如下:

    5.3 防反爬虫模块实现为了防止反爬虫对本系统爬虫部分的影响,对于每次请求,本系统都会伪装成一个真实的用户,防止被爬取的网站通过User-Agent等信息来判断或者禁封 掉本系统的爬虫,导致后续爬虫无法正常进行。本系统在发送请求之前会在请求的头部加上User-Agent的请求头信息,这个请求头的信息会在本系统配置中的 User-Agent列表中随机选取一个,图5.5为部分User-Agent信息。除此之外,还可以利用代理服务器来代理请求,防止被爬取的网站通过IP信息来禁封本系统爬虫。

    5.4 爬虫存储模块实现爬虫储存模块的数据设计与格式等在上一章已经说明,在这介绍在数据库中的具体实现。爬虫爬取到的新闻数据会存放于MongoDB中,使用ORM来映射数据对象模型到数据库,使用的ORM框架是MongoEngine,下面通过讲解一个新闻内容的数据模型的定义来说明这种定义方式,在图5.6中的第9行,我们定义了一个父类为MongoEngine的Document类的类,这样定义就使这个类拥有了关系对象映射的能力,再在这个类中定义一个to_json的方法,作用是把本类的实例转化为一个Dict类型的数据,方便API调用时将对象转换成JSON格式的数据返回给前端。图5.7展示了部分爬取到的新闻数据的内容。

    5.5 消息推送模块实现消息推送模块使用了微信公众号的推送,在本系统中使用微信的接口测试号来代替公众号,微信的接口测试号是一种用于测试的,可以使用微信号扫一扫登录的账号,而且这种账号能够直接体验和测试公众平台所有高级接口。在申请完后登录系统,获得该系统的applD和appsecret,这两个字符串是使用该账号的凭据。需要注意的是,用户需要关注本账号后才能够收到本账号推送的消息。

    接下来我们在网页下方新增一个消息模板,填入推送新闻消息的模板内容,填写完成后记录对应的模板ID。

    获得以上信息后把信息写入消息推送模块的配置文件中,供消息推送模块调用。下面讲解消息推送模块核心部分的实现,核心部分如图5.10所示,是一个名为send_msg的函数,这个函数接收四个参数,分别为新闻标题、新闻内容、新闻的ID和订阅者的openid。订阅者的openid是用户微信的唯一标识,在测试号的页面可以查看已关注该账号的用户微信的openid。该函数的29-42行的作用是把数据封装成微信推送接口所需的格式,然后在45行使用requests模块来 POST一个请求到微信推送接口,微信推送接口收到请求后会在公众号中把该消息推送给用户。该函数使用了一个自定义的装饰器update_token来装饰,之前存放的applD和appsecret可以用来生成推送用的access token,而这个access token 有固定的存活期限的,这个装饰器的作用就是定时去获取这个access token并存放,直到过期之后再重新获取。
    爬虫模块爬取到含有用户订阅的关键词的新闻时会向该用户推送这则新闻,图5.11是用户在微信公众号上收到的该新闻的推送消息示例。

    5.6 消息订阅与展示模块实现消息订阅与展示模块主要由前端静态文件部分和后端API部分组成。在开发方式上本系统选择了使用前后端分离的方式,前端通过AJAX的方式来跟后端提供的API进行交互,后端API服务器收到请求后返回对应的JSON格式的数据给前端,前端根据数据来渲染出最终展示给用户的页面,这种前后端分离的方式有效地降低了代码之间的Wi合度。在前端实现方面,使用了jquery来对DOM元素进行操作以及进行异步请求等,另外使用了WeUI的样式库,WeUI是一套提供同微信原生一致的视觉体验的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。
    接下来以用户端的角度来展示消息订阅与展示模块的实现。
    用户想要收到新闻推送,需要先关注本系统的公众号,然后打开新闻订阅页面:

    这时可以输入要订阅的关键词,这里填IT,点击添加订阅关键词,系统提示添加关键词IT成功,刷新已订阅关键词列表:

    点击已订阅关键词列表中的项会弹出对话框询问是否删除该关键词:

    点击确定,提示操作成功,同时刷新已订阅关键词列表:

    在订阅关键词后,系统爬虫爬取到相关内容时会把内容通过微信推送给用户,用户点击后可以看到新闻内容,在此页面可以点击查看原文按钮打开原新闻页面,还有可以点击订阅更多前往订阅新闻关键词的页面:

    点击查看原文,会跳转到新闻的原页面:

    第六章 系统部署6.1 部署机器概述为了运行本新闻采集与订阅系统,至少需要一台拥有公网’P的Li~服务器,这是为了用户在外网能够访问到。至于配置方面则不需要太高,在测试时我选用了一台腾讯云上的服务器,这台服务器的配置如下:



    项目
    内容




    操作系统
    Ubuntu Server 14.04.1 LTS 64位


    CPU
    1核


    内存
    1GB


    系统盘
    20GB


    公网带宽
    1Mbps



    6.2 配置环境
    安装Nginx作为反向代理服务器,并编辑Nginx相关配置文件,这样做是为了把不同的请求分发到后端不同的地方,例如请求前端文件就返回静态文件,请求API就把请求转发给API服务器,Ningx的配置文件部分内容如图6.1所示。这样就实现前后端分离而又不受到跨域请求限制的影响了。编辑完Nginx配置文件后,重启Nginx服务器。
    安装PIP, PIP是Python用于管理第三方库的一个软件,这里用于安装本系统所需的第三方库。
    使用PIP安装本系统所依赖的第三方库,包括pymongo, scrapy, redis, fake-useragent, django,mongoengine, jieba, lxml, gevent, gunicorn等。


    6.3 系统运行由于本新闻采集与订阅系统是由爬虫部分与展示部分组成,所以需要分别运行行爬虫的守护进程和后端API服务器,静态页面是由Nginx指定的一个目录来提供的,不需要后台服务器。
    使用python worker.py命令来运行爬虫的守护进程,得出以下输出:

    使用sh run_server.sh命令来运行后端API服务器,这个脚本的实际作用是使用gevent作为gunicorn的worker来运行4个后端API服务器进程,成功运行会得到以下输出:

    第七章 总结与展望7.1 总结本系统是一个基于网络爬虫实现的新闻采集与订阅系统,实现了对网络上新闻内容的自动化采集、用户新闻关键词订阅、新闻内容展示以及新闻推送等功能。为实现本系统的功能,查阅了大量学习资料,在实现方面使用了一些比较前沿的技术以及较多的第三方库,从中能够学习到很多新知识和新技能。在本文中较为完整地从系统的需求分析、不同模块的设计与实现几个方面来展示了一个完整的爬虫系统以及对应的新闻订阅API服务器等的实现过程,最后在云服务器上部署本系统并测试,达到了预期的效果。
    7.2 展望本新闻采集与订阅系统在设计上考虑了许多来降低代码之间的祸合度,同时提高代码的健壮性与性能,使本系统能够达到容易扩展以及高可用的需求,即便后续需要爬取另外一个新的新闻网站上的新闻,只需要编写对应网站的解析部分就可以了,大部分代码已经被模块化,能够被重用。对比了已有的类似的成熟大型新闻服务系统,发现还有以下能够改进的地方:

    本系统只对新闻的基本文字信息等进行了采集与展示,后续可以考虑实现对新闻中图片与视频等多媒体信息的采集。
    本系统缺乏一个较为完善的用户模块,目前用户是在配置文件中配置的,用户模块对于这类的订阅系统是比较重要的。
    订阅机制不够智能,也没有智能推荐等功能,后期可以采用机器学习等人工智能方法来实现智能化推送与推荐功能。

    除了以上几点,本系统仍然存在许多能够改进的地方,但由于本文作者水平有限以及时间限制,未能够将这些一一实现,还希望各位专家学者能够给予批评与建议。
    参考文献[1] 中国互联网络信息中心. 中国互联网络发展状况统计报告[EB/OL]. http://www.cnnic.cn/gywm/xwzx/rdxw/20172017/201701/t20170122_66448.htm, 2017年
    [2] 胡博,基于网络爬虫的内容资源评价研究[D];北京理工大学;2015
    [3] 李建中、李金宝、石胜飞,传感器网络及其数据管理的概念、问题与进展,软件学报,14(10):17 17-1727, 2003
    [4] 邝洪胜;基于Python的电商导购APP设计与实现[D];华南理工大学;2015
    [5] 基于Django的自动化运维管理系统的设计与实现[D].姚娜.西安电子科技大学2015
    [6] 关系与非关系数据库应用对比研究——以SQL Server与Mongo DB为例[D].吴德宝.东华理工大学2015
    [7] 基于网络爬虫的网站信息采集技术研究[D]. 孙骏雄. 大连海事大学2014
    [8] 基于网络爬虫的内容资源评价研究[D].胡博.北京理工大学2015
    [9] Wang J, Guo Y. Scrapy-based crawling anduser-behavior characteristics analysis on Taobao[C1//Cyber-EnabledDistributed Computing and Knowledge Discovery (CyberC), 2012 International Conference on. IEEE, 2012:44-52.
    [10] Castillo C. Effective web crawling[C1//Acm sigir forum. Acm, 2005, 39(1):55-56.
    [11]刘金红,陆余良.主题网络爬虫研究综述 [J].计算机应用研究,2007, 24(10) :26-29.
    [12]徐远超,刘江华,刘丽珍,等.基于Web的网络爬虫的设计与实现[J].微计算机信息,2007 (21): 119-121. MLA
    [13] 王成军.“今日头条”的技术逻辑:网络爬虫+矩阵筛选[J].传媒评论,2015 (10) : 34-37.MLA
    [14] Jaiswal S, Kumar R. Learning Django Web Development [M]. PacktPublishing Ltd, 2015.
    [15] Taneja 5, Gupta P R. Python as a Toolfor Web Server Application Development [J]. 2014.
    [16] Web数据挖掘及其在网络新闻文本数据中的应用[D].胡峰.电子科技大学2010
    [17] 乔峰.基于模板化网络爬虫技术的Web网页信息抽取[D].电子科技大学2012
    致谢从本论文的选题、资料收集、资料阅读、到论文编写完成的这段时间中,我收获到许多宝贵的知识与经验。在这段时间里我查阅了许多相关资料,也使用了一些他人开发的第三方程序库,这些都减轻了我的压力。在此要感谢前人的付出,留下了那么多的学习研究材料。
    在这我要特别感谢我的论文导师卞静老师,卞老师在我完成该论文期间给予了我悉心指导与帮助,在繁忙之中抽出时间来对我的论文进行了指导并提出许多宝贵的建议。卞老师拥有渊博的专业知识、严谨的治学态度和平易近人的处事作风,是我终生学习的楷模。在此向我的导师表示最诚挚的谢意和最衷心的祝愿。
    其次,我要感谢我的家人,他们一直以来都能够理解,支持并关心我,从而使我能够专心投入到学习和工作中,让我在求学的过程中感受到温暖的力量,并能够顺利完成学业。
    在我大学学习和生活中,得到了许多老师和同学的关心与帮助。感谢我的舍友,在我学习上遇到疑惑的时候能够悉心教导我,在论文编写、技术路线和具体实现上也得到了他们宝贵的建议,谢谢你们!
    最后,在此对所有在我做毕业设计期间帮助,关心和支持过我的老师、同学和朋友们,以及百忙之中抽出时间来审阅、评议本论文的各位专家们表示衷心的感谢。
    8 评论 103 下载 2018-09-30 23:27:17 下载需要15点积分
  • 基于Python实现的手写数字识别

    一、准备
    测试准备:pycharm,windows自带画图功能,python3.5
    安装python3.5
    将解压的文件夹拖入pycharm中,设置解释器路径为:文件解压路径\ML_num\venv\Scripts\python.exe
    若要调用文件,只要点入文件并点击右上角绿色三角或鼠标右键点 run 相应文件

    二、手写数字识别调用UI.py 得如图界面:

    测试可用windows自带画图功能,刷子选用喷枪,粗细第3个,尽量喷清楚,图片后缀为.png图片大小为400*400像素(其他大小也行只要不小于32*32)如下:

    点击选择文件找到测试文件,选择是否使用备份(默认使用)再点击开始识别, 可选择自动识别或手动识别,手动识别截图时鼠标左键按住拖动即可(数字周围尽量有些许空,若识别错误,很大原因是由于截的图左右空格太小、太大),再输入真实值,结果为:文件名为输入的真实值_最大数字.txt。以下结果为文件名为:6_3.txt 如图:

    三、摄像头务必使用笔记本电脑,数字尽量写得大一些,尽量在光线明亮处拍摄,点击摄像头,如图:

    按q键退出,其他键拍摄,之后点击开始识别与第二部分相同。
    四、介绍
    使用的非标准库:opencv,numpy,pillow
    机器学习技术:KNN邻近
    引用:《机器学习实战》源码并对其中部分内容修改,增加部分操作;部分代码参考cnblog与CSDN

    文件介绍


    data_set:备份文件夹
    images:图片文件
    testDigits:测试数据
    testDigits(测试):正确率测试数据
    trainingDigits:训练数据
    vedio_cut.py:摄像头拍摄
    hand_number.py:截取图片并修改大小为32*32, 转为灰度图
    zero_one.py:将灰度图转为01矩阵并存入testDigits文件夹内
    kNN.py:k值邻近算法识别数字并统计结果, 可以选择使用备份数据训练识别或重新开始
    get_next_num.py:得到指定数据文件数量
    check:测试正确率
    UI.py:使用tkinter库构造界面
    新增im:样例图片
    4 评论 211 下载 2019-04-19 10:14:37 下载需要11点积分
  • 基于vue+nodejs+mysql的世界杯信息平台

    一、项目简介我们这次设计的是一个与2018世界杯比赛相关的数据库应用,涉及世界杯赛程、小组赛积分榜、射手榜、球队信息、球员信息等的功能。使用新浪体育提供的API作为数据源,使用JAVA的JDBC技术来实现数据库的构建,使用nodejs和koa框架实践web应用的后端编写,使用js和VUE框架实现web应用的前端构建。
    项目环境:

    mysql-5.7.22
    jdk, jre
    nodejs相关环境
    vue框架相关环境

    二、需求分析四年一度的世界杯比赛又开始了,这四年一度的盛事激起了全世界人民的热情,吸引了所有热爱足球的球迷的关注。整个世界杯总共32支队伍,64场比赛,735位球员,如此多的信息,自然催生出了世界杯相关的数据查询的需求。根据人们的需求和我们的分析,我们制定了以下功能:

    小组赛积分榜查询
    球队基础信息查询(随世界杯进程更新)
    球队间的赛事数据
    射手榜
    球员个人信息统计(随世界杯进程更新)
    球队赛程
    用户私人界面

    三、设计思路首先设计数据库,通过网页API获取所需的数据,使用JDBC创建数据库,前端向服务器发送请求(带参数),服务器使用Koa2框架,连接mysql数据库,根据请求查询数据或修改数据,将查询结果构造为json字符串返回给前端,前端通过Vue框架把获取的数据动态地呈现在网页上。
    四、实现步骤4.1 网页爬取新浪体育源的世界杯相关数据·网页访问新浪体育世界杯栏目网页,检查网页源代码,在Network,传输的JS信息中抓取对应的数据API:

    以抓取球队数据统计信息为例子,抓取到球队数据统计信息API为:
    /**************************************************** * 请求参数 * id是球队id: 与查询小组积分的的s1_id属性值一致) * season是当届/历史: 2017是当届,2013上一届***************************************************/http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamStatics&show_players=1&type=108&season=2017&id=939&dpc=1
    API访问的是网页GET请求返回的Json数据,包含着球队的数据统计信息和球员的数据信息,大致如下图所示:

    以下是抓取到本次项目所要用到的所有API:
    具体的API信息,例如请求参数,返回格式请查看 ./Resource/API信息.docx。



    order
    API信息
    API请求地址




    1
    查询分组积分情况
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&type=108&use_type=group


    2
    查询球队球员当届或历史整体统计数据情况
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamStatics&show_players=1&type=108&season=2017&id=939&dpc=1


    3
    查询射手榜
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=playerorder&type=108&item=13&limit=20&season=2017


    4
    查询球员基本信息
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=getPlayer&id=14937&type=108&dpc=1


    5.1
    查询球队赛程信息(按比赛时间查询)
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=livecast&_sport_a_=matchesbytype&type=108&fields=group%2Clivecast_id%2Cdate%2Cstatus%2CTeam1%2CTeam2%2Ctime%2CTeam1Id%2CTeam2Id%2CScore1%2CScore2%2CMatchCity%2CNewsUrl%2CVideoUrl%2CLi


    5.2
    查询球队赛程信息(按球队查询)
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=livecast&_sport_a_=groupMatchesByType&type=108&fields=group%2Clivecast_id%2Cdate%2Cstatus%2CTeam1%2CTeam2%2Ctime%2CTeam1Id%2CTeam2Id%2CScore1%2CScore2%2CMatchCity%2CNewsUrl%2CVideoUrl


    6
    查询球队基本信息
    http://events.sports.sina.com.cn/worldcup/api/team/data?&season=2017&tid=939&dpc=1


    7
    查询球员各场次数据信息
    http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=playerMatchesStatics&id=14937&type=108&season=2017&dpc=1



    4.2 worldcup数据库模型设计根据爬取的API,我们用所爬取得信息建立我们的worldcup数据库模型,包括games、playerdatas、players、scoreboard、teaminfo、teams、topscorer、users共8个实体集。
    E-R图

    具体的各实体集如下表所示:
    4.2.1 Scoreboardscoreboard实体集——小组积分信息,查询API1(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&type=108&use_type=group )



    属性
    类型
    属性含义
    样例信息




    sl_id
    char(10)
    球队ID(主码)
    939


    team_cn
    char(50)
    球队名称
    葡萄牙


    team_order
    char(5)
    球队排名
    2


    count
    char(5)
    场次
    3


    win
    char(5)

    1


    lose
    char(5)

    0


    draw
    char(5)

    2


    goal
    char(5)
    进球
    5


    losegoal
    char(5)
    失球
    4


    truegoal
    char(5)
    净胜球
    1


    score
    char(5)
    积分
    5


    groups
    char(5)
    小组
    B


    logo
    varchar(255)
    国家图片
    http://www.sinaimg.cn/lf/sports/logo85/939.png


    row_id
    int
    记录所在行数,用于排序
    6



    4.2.2 teamsteams实体集——球队数据统计信息,查询API2(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=teamStatics&show_players=1&type=108&season=2017&id=939&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    sl_team_id
    char(10)
    球队ID(主码)
    939


    team_name
    char(50)
    球队名称(主码)
    葡萄牙


    goals
    char(5)
    进球
    6


    total_scoring_att
    char(5)
    射门
    53


    total_pass
    char(10)
    传球
    1919


    total_tackle
    char(5)
    抢断
    67


    possession_percentage
    char(10)
    控球率
    54.78%


    pass_percentage
    char(10)
    传球成功率
    82.8%


    yellow
    char(5)
    黄牌
    7


    red
    char(5)
    红牌
    0


    fk_foul_won
    char(5)
    任意球
    59


    won_corners
    char(5)
    角球
    24


    total_cross
    char(5)
    传中
    84


    total_offside
    char(5)
    越位
    4


    total_throws
    char(5)
    界外球
    75


    post_door
    char(5)
    击中门框
    0



    4.2.3 topscorertopscorer实体集——射手榜统计信息,查询API3(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=playerorder&type=108&item=13&limit=20&season=2017)



    属性
    类型
    属性含义
    样例信息




    row_id
    int
    记录所在行数,用于排序(主码)



    num
    char(5)
    排名(主码)



    player_name
    char(50)
    球员名字



    player_id
    char(10)
    球员ID



    team_name
    char(50)
    球队名称



    goals
    char(5)
    进球数



    penalty
    char(5)
    点球数



    owngoal
    char(5)
    乌龙数



    assists
    char(5)
    助攻数



    minutes
    char(5)
    出场时间



    sl_team_id
    char(10)
    球队ID



    pic
    varchar(255)
    球员图片




    4.2.4 playersplayers实体集——球员基本信息,API4(http://api.sports.sina.com.cn/?p=sports&s=sport_client&a=index&_sport_t_=football&_sport_s_=opta&_sport_a_=getPlayer&id=14937&type=108&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    player_id
    char(10)
    球员id
    14937


    team_id
    char(10)
    国家队id
    939


    player_name
    char(50)
    球员中文名
    C罗


    team_name
    char(50)
    国家队中文名
    葡萄牙


    position_cn
    char(50)
    场上位置
    前锋


    club_cn
    char(50)
    俱乐部名
    皇家马德里


    age
    char(20)
    年龄
    33


    birth_date
    char(20)
    出生
    1985-02-05


    weight
    char(10)
    体重
    83


    height
    char(10)
    身高
    187


    jersey_num
    char(5)
    球衣号码
    7


    pic
    varchar(255)
    球员照片url
    http:\/\/www.sinaimg.cn\/ty\/opta\/players\/14937.jpg


    team_logo
    varchar(255)
    国家队Logo url
    http:\/\/www.sinaimg.cn\/lf\/sports\/logo85\/939.png



    4.2.5 games略查看代码。
    4.2.6 .users略查看代码。
    4.2.7 teaminfoteaminfo实体集——球队基本信息,API5(http://events.sports.sina.com.cn/worldcup/api/team/data?&season=2017&tid=939&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    tid
    char(10)
    球队id
    939


    team_name
    char(50)
    球队名称
    葡萄牙


    coach
    char(50)
    教练名
    桑托斯


    family
    char(50)
    球队合照
    http://n.sinaimg.cn/sports/83051191/20180606/PuTaoYa740.jpg


    king
    char(100)
    重要球星
    C罗、穆蒂尼奥、佩佩


    honor
    char(100)
    最好成绩
    第三名



    4.2.8 playerdatasplayerdatas实体集——球员具体各场次数据信息,API6(http://events.sports.sina.com.cn/worldcup/api/team/data?&season=2017&tid=939&dpc=1 )



    属性
    类型
    属性含义
    样例信息




    player_id
    char(10)
    球员id(主码)
    14937


    player_name_cn
    char(10)
    球员姓名
    C罗


    home_name_cn
    char(50)
    主队名称(主码)
    葡萄牙


    away_name_cn
    char(50)
    客队名称(主码)
    西班牙


    home_score
    char(5)
    主队得分
    3


    away_score
    char(5)
    客队得分
    3


    mins_played
    char(5)
    出场时间
    90


    goals
    char(5)
    进球数
    3


    goal_assist
    char(5)
    助攻
    0


    total_scoring_att
    char(5)
    射门数
    4


    total_pass
    char(5)
    传球
    36


    accurate_pass
    char(5)
    传准
    34


    total_att_assist
    char(5)
    传威胁球
    1


    fouls
    char(5)
    犯规
    1


    was_fouled
    char(5)
    被侵犯
    4


    won_tackle
    char(5)
    抢断
    0


    total_clearance
    char(5)
    解围
    1


    saves
    char(5)
    扑救
    0


    red
    char(5)
    红牌
    0


    yellow
    char(5)
    黄牌
    0


    status_cn
    char(5)
    比赛状态(主码)
    结束



    4.3 playerdatas、teaminfo Java-JDBC代码实现两者的实现原理是差不多的,都是根据设计的worldcup数据库模型和对应的API,在Java代码中先进行网页访问API,得到返回的Json文件,然后解析得到的Json文件,获得对应的各项数据。
    然后创建对应的实体集,用JDBC连接MySQL,实现对worldcup数据库中,创建playerdatas与teaminfo两个实体集,并且导入解析出来的各项数据。其中teaminfo共32项数据;playerdatas共2850条数据。
    关键代码:

    JDBC连接数据库,创建playerdatas实体,设置实体拥有的各属性,主码关系,约束码关系:


    网络API GET类型访问,获得返回JSON文件,进行Json解析,获得各项数据并插入数据库:


    将解析获得的数据,插入到worldcup数据库playerdatas实体中:

    4.4 koa2以及node.js连接数据库先学习koa2框架的具体原理和使用,了解了之后进行一些类似hello的小实验,之后。(截图为部分代码)


    使用koa2创建数据库连接池,将数据库加载都后端服务器。(截图为部分代码)

    根据不同的前端请求,对数据库执行增删查改操作,并将其打包成为json文件,发送回前端。(截图为部分查询和生成json代码)


    4.5 Java连接网络和数据库Java连接网络主要利用的是HttpURLConnection这个类,通过url来访问网站,返回的是一个json字符串,需要解析这个json字符串来得到我们需要用于更新数据库的各种数据,这需要用到专门用于处理json数据的jar包。
    连接网络:

    解析数据:

    JDBC连接数据库利用了Java的JDBC驱动,需要去网上下载相应的Jar包,利用驱动名和URL来连接数据库:


    要注意的是只能连接到已有的数据库,而不能在Java代码中创建,连接到之后就可以通过简单的SQL语句来对数据库进行修改了:

    4.6 使用vue.js创建项目·直接在命令行中输入npm install vue。再进到想要创建项目的目录下;
    //安装脚手架 npm install –global vue-cli //安装webpack相关依赖 vue init webpack my-project //进入到项目中 cd my-project npm install //运行vue项目 npm run dev
    4.7 用vue模板编写页面每个网页包括html代码、css代码、JavaScript代码三部分:
    页面数据绑定

    向服务器发送请求

    页面布局
    4.8 实现服务器的路由功能
    服务器根据路径来处理get请求,调用操作数据库的函数来查询数据或修改数据。
    对所有的查询,处理方式都相似。
    向服务器发送请求,将返回的json格式的数据赋值给前端的数据结构,与页面进行数据绑定,就能把查询结果动态地呈现在网页上。

    前端代码详见DataBase/project/src/components文件夹
    服务器代码详见DataBase/project/server/router.js

    五、遇到的问题5.1 Json解析问题一开始不知道如何处理返回得到的JSON文件,后来上博客查攻略:

    引用这些外部库,可以用库里面的函数来进行Json解析,更容易地获得数据。
    另外Json文件里面的信息内容过多过杂,在分解Json结构也浪费了很多时间。
    5.2 Eclipse版本兼容问题Eclipse Kepler Service Release 1的版本不兼容mysql-connector-java-8.0.11-bin.jar。
    一开始用的JDBC链接器是mysql-connector-java-8.0.11-bin.jar这个版本,但是最后导入数据运行的时候一直是报错的,一开始是自己代码的问题,连接错误。修改代码后发现还是报错,报错位置是mysql-connector-java-8.0.11-bin.jar内部的源代码。后来上网查询错误信息时发现是与自己这里的Eclipse版本不匹配。于是降低JDBC链接器的版本至mysql-connector-java-5.1.46-bin.jar问题得以解决。
    5.3 运行报错问题导入2850条playdatas数据时,网络不稳定+用时略长导致顶层代码运行会报错。
    解决方法是对顶层代码文件导入数据时进行异常处理,抛出异常处理,避免报错。另外为了更好的响应,新开线程进行输出提示。
    1 评论 3 下载 2021-04-12 08:54:36 下载需要10点积分
  • 基于Java实现的Hannoi汉诺塔自动演示程序

    1 设计要求设计GUI界面的Hannoi塔。汉诺塔中有三个座,名字分别为A,B,C。初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。
    程序要求用户在移动盘子的过程中,不允许吧大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。
    用户可以通过Hannoi塔界面提供的菜单来选择初级、中级和高级三个级别。初级级别A座上有3个大小不等盘子、中级级别A座上有4个大小不等盘子、高级级别A座上有5个大小不等盘子。
    用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。
    用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始当前的级别。
    2 总体设计在设计hannoi塔时,需编写6个java源文件:HannoiWindow.java、Tower.java、TowerPoint.java、Disc.java、HandleMouse.java和AutoMoveDisc.java。
    Hannoi塔除了要编写的6个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JMenuBar、JMenu、JMenuItem和JButton。Hannoi塔所用到的一些重要的类以及之间的组合关系如图1所示:

    2.1 HannoiWindow.java类设计HannoiWindow类负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从该类开始执行。HannoiWindow类的成员变量中有五种重要类型的对象、一个int基本型数据和一个char型数组。五种类型的对象分别是:Tower、JMenuBar、JMenu、JMenuItem和JButton对象。
    HannoiWindow类的主要成员的作用将在后面的详细设计中阐述。
    2.2 Tower类设计Tower类是javax.swing包中Jpanel容器的子类,创建的容器被添加到HannoiWindow窗口的中心。Tower类的成员变量中有四种重要类型的对象、一个int基本型数据和一个char型数组。四种类型的对象分别是:Disc、TowerPoint、HandleMouse、和AutoMoveDisc对象。Tower类的主要成员的作用将在后面的详细设计中阐述。
    2.3 Disc类设计Disc类是Jbutton的一个子类,创建的对象时Tower容器中的一个按钮,用来表示Tower中的“盘子”。
    2.4 TowerPoint类设计TowerPoint类负责在Tower中创建表示位置的塔点对象。
    2.5 HandleMouse类设计HandleMouse类创建的对象负责处理鼠标事件。
    2.6 AutoMoveDisc类设计AutoMoveDisc类创建的对象负责自动移动盘子从一个座到另一个座。
    3 详细设计3.1 HannoiWindow类HannoiWindow类是javax.swing包中JFrame的一个子类。
    3.2 Tower类Tower类是javax.swing包中Jpanel容器的一个子类,创建的对象tower是HannoiWindow窗口的成员之一,被添加到HannoiWindow窗口的中心位置。
    3.3 Disc类Disc类是javax.swing包中JButton类的子类,所创建的对象称作Hannoi塔中的“盘子”。Tower类有Disc类型的数组disc。disc数组的单元是用Disc创建的对象,被放置在Tower所创建的容器tower中,用来表示tower中的盘。
    3.4 TowerPoint类TowerPoint所创建的对象将作为Tower类中TowerPoint型数组pointA、pointB和pointC中的元素。
    3.5 HandleMouse类HandleMouse类实现了MouseListener和MouseMotionListener接口,创建的对象handleMouse是tower容器的成员之一,负责监视tower容器中Disc盘子对象上的鼠标事件。当用户用鼠标单击tower中的盘子,并拖动鼠标时,handleMouse对象负责给出移动盘子的有关算法。
    3.6 AutoMoveDisc类AutoMoveDisc类实现了ActionListener接口,创建的对象autoMoveDisc是Tower的成员之一。
    4 代码调试问题将前面6个Java源文件:HannoiWindow.java、Tower.java、TowerPoint.java、Disc.java、HandleMouse.java和AutoMoveDisc.java保存同一目录中。分别编译这6个Java源文件,或运行“javac *.java”命令,编译全部源文件,然后运行主类,即运行HannoiWindow类。
    5 软件发布可以使用jar.exe命令制作JAR文件夹来发布编写的软件。

    首先用文本编辑器,如Windows下的“记事本”,编写一个清单文件:
    mymoon.mfManifest-Version:1.0Main-Class:HannoiWindowCreated-By:1.2(Sun Microsoft Inc.)将mymoon.mf 保存到D:\ch3中,即和应用程序所用的字节码文件保存在相同的目录中。注意:清单文件中的“Manifest-Version:”和1.0之间、“Main-Class:”和主类HannoiWindow之间以及“Created-By:”和1.2之间必须有且只有一个空格。
    生成JAR文件
    D:\ch3\jar cfm Hannoi.jar mymoon.mf*.class其中,参数c表示要生成一个新的JAR文件,f表示要生成的JAR文件的名字,m表示清单文件的名字。

    现在就可以将Hannoi.jar复制到任何一个安装了Java运行环境(版本号需高于1.2d的计算机上)的计算机上,用户用鼠标双击该文件的图标就可以运行该软。
    6 程序运行效果选择Hannoi塔的级别

    Hannoi塔高级玩法

    中级Hannoi塔自动演示玩法

    7 设计心得通过这一周的实训,虽然实训的时间不长,但是总体上收获挺大的,当我们正式准备学习实训java编程技术时,让我感到非常高兴,因为java一直学的是课本知识,所以实训对于我来说是必须要学会熟练操作的。当然开始学习后也并非是想象中那样顺利,开始的学习让我异常感到学习任务的艰巨,因为学习中我遇到了很多以前未曾遇到的难点,有时后也难免会失去耐心,但是,通过老师的指导,自己的努力的练习,我顺利的化解了一道道的障碍。克服了Java学习上的一道道难关,现在自己已经基本掌握了java的基础知识。
    4 评论 101 下载 2019-06-14 09:13:56 下载需要12点积分
  • 基于Python和Django实现的虚拟网络银行

    1.背景与意义1.1 项目开发意义随着以信息网络技术为代表的科学技术的迅猛发展,21 世纪,我们已步入了一个以网络应用为核心的数字化革命时代,全球经济一体化程度进一步加强,金融企业的经营环境发生了巨大变化。传统产业的运作模式已经让位于知识经济 和信息经济。在未来的市场竞争中谁掌握和应用好网络银行这一现代化的营销方 式和手段,谁就能在激烈的竞争中取胜,反之则会被淘汰。大力发展网络银行对 银行业的发展具有重要的作用。
    网络银行的兴起与电子计算机信息技术和电子商务的发展有密切的关系。 电子商务是网络银行产生的商业基础,可以说没有电子商务的发展,就不会有网 络银行的兴起,电子商务是一种伴随因特网的普及而产生的新型贸易方式,它是当代信息技术和网络技术在商务领域广泛应用的结果。
    电子商务技术的发展催生了网络银行。通常说,电子商务对银行的要求有 两方面: 一是要求银行为之提供相互配套网上的支付系统; 另一面是要求银行 提供与之相适应的虚拟金融服务。电子商务是一种网上交易方式。所有的网上交易都由两个环节组成的,一是交易环节,二是支付环节,前者是在客户与销售之间完成,后者需要通过银行网络完成。
    1.2 国内外现状及技术综述我国的网上银行产生于上世纪九十年代后期,虽然起步较晚,但发展的势头却很迅猛。1997年招商银行率先在国内推出了网上银行业务,开了我国网上银行的先河,并通过网上银行推出信息咨询、个人银行、企业银行、网上证券等多项服务。2003年的“非典”在我国暴发,激起了网上银行业务的迅速发展。据中国人民银行统计,到 2008年底,我国境内已有70多家银行的分支机构开展了实质性的网上银行业务, 当年交易额已超过90万亿元人民币,较上年增长70.79%。据统计,2002-2008年间,中国网上银行交易额年均增长率高达115%。
    根据IRESEARCH艾瑞市场咨询研究成果显示:2008年,中国国内个人网上银行用户规模为4469万户;国内网上银行使用人数与2007年相比有了大幅度增长,抽查样本中,同比增长了1.7倍,网上银行使用企业数增长了近3倍。我国网上银行走了十多年历程,取得的成效是显而易见的,但也受多种困难的挑战和制约,还存在不少问题,突出有以下几点:
    1.2.1 网上银行发展的基础比较薄弱基础设施落后。主要是指硬件不硬,我国的网络建设除了省、市级以上的大中城市和东部沿海城市发展较快外,其他地方仍然存在着网络覆盖面窄、速度较慢、容量较小、频带不宽、网络吞吐能力有限的现象。目前我国电话、电脑和网络总体普及率不高, 远低于美国2000年的水平。同时软件过软,特别是在软件开发方面,重复开发过多,造成了巨大浪费。
    网上银行使用对象少。经济总量大,人均量很小的现实使我国Internet的社会普及程度较低,电子商务不活跃,导致网上银行缺乏人气基础。资料显示,目前美国使用互联网的成年人已经超过了 1亿,接近国民人口的一半,我国不足四分之一。并且,网民中有三分之一是学生,他们使用网上银行服务的机率很小,绝大多数网民上网的主要目的在于娱乐和获取信息。
    市场主体发展不健全。目前国内网上银行是在现有银行的基础上格局上发展起来的,通过网上银行延伸服务即所谓的传统业务挂靠的电子银行系统,大多数只满足于存款、汇款、汇兑、代收费等业务,只是一个简单化的传统业务外挂,严格说只能算柜面业务的 “上网银行”,总体服务层次低,缺乏内涵,缺乏特色。少数银行对网上银行发展方向认识模糊,仅把它当作扩大传统业务的手段,没有意识到这是一场金融界的革命。
    1.2.2 网上银行的发展环境待完善法律法规滞后。 网上银行在有关服务承担者的资格、交易规则、交易合同的有效成立、交易双方当事人权责等方面,比传统银行更复杂,难以界定,必须通过法制的手段来解决。发达国家和地区的金融监管,当局大都针对网上银行业务制定了系统的监管法规、风险监管指引和监管手册。例如,美国联邦储备委员会于1997年12月发布了《网络信息安全最佳实务指引》,美国货币监管署于1998年8月发布了《网上银行业务检查手册》。2001年中国人民银行虽然颁发了《网络银行业务管理暂行办法》,之后又出台了 《电子银行业务管理办法》等法规,但网上银行的发展十分迅速,有些规定难以适应新形势发展需要,必须与时俱进,制定出台适应网上银行发展的规章制度。
    安全保障令人担忧。网络安全事关网上银行的生死存亡, 是网上银行发展的核心问题。安全既是个技术问题,也是个管理问题。 只有保证了安全才能谈得上盈利,资金安全对银行客户、商家永远是至关重要的。从 2004年8月到2008年10月期间,全国感染各类网上银行木马病毒及其变种的用户数量增长了600倍,用户每月感染病毒及其变种的数量约为160种。中国金融认证中心2007年调查时就发现,超过50% 的人不打算使用或者不敢使用网上银行,2008 年不但未好转, 反而更加严重。
    2.需求分析2.1 总体需求本系统的用户可以分为两类,普通用户和管理员用户。消费者和商家都可以注册为普通用户,当以商家身份注册时,需要银行管理员的审核通过。管理员提供给商家支付链接。
    管理员可以审核用户的注册,开通账户、冻结账户以及审核账户的安全性。本系统给电商平台提供支付链接,认证支付信息并自动更改用户的账户余额等信息。
    所有用户都可以进入银行系统查看账户信息并转账。
    2.2 功能需求2.2.1 银行系统
    注册:用户上传实名身份信息,设置登陆密码和支付密码,审核通过后开通账户,并提供给用户唯一 ID,用于登陆
    登陆:用户输入 ID 和密码,验证成功后进入系统界面。
    修改个人信息:可修改手机号、邮箱等信息,但是身份证号和姓名信息一旦注册后不可修改
    修改密码:登陆密码和支付密码必须验证原密码后才可修改
    银行卡管理:用户验证支付密码之后可开通一张新的银行卡,并提供给用户唯一卡号,用于转账、存款和取款时识别银行卡。一个用户可申请多张银行卡,每张卡的金额独立。用户可随时登陆系统查看自己的余额和卡状态
    转账:用户选择自己的银行卡,输入对方银行卡号,再输入支付密码后确认转账。余额不足、支付密码错误、卡号错误时都不能转账
    存取款:此功能是为方便用户给银行卡添加一定的金额(银行卡新申请时余额为 0),在实际网上银行系统中并无此功能(实际的银行系统存取款需要到实体 ATM 机进行)
    查询转账记录:转账记录包括流水号、转账人、源卡号、目的卡号、转账金额、转账时间。用户只可查看和自己的银行卡号有关的转账记录
    查看存取款记录:存取款记录包括流水号、操作、银行卡号、金额、本次余额和存取款时间

    2.2.2 电子商城接口给电子商城提供支付接口(127.0.0.1:8001/pay?xxx=xxx&xxx=xxx)。消费者首先在银行系统注册并添加银行卡,获取用户 ID 和银行卡号。在电子商城产生订单后使用支付接口将支付信息和订单摘要发送给银行(SET 协议验证),用户界面将跳转到银行系统,输入支付密码后完成支付。
    2.3 安全需求2.3.1 账户安全只有上传个人资料管理员审核之后才能允许注册。所有账户必须保证身份信息真是可靠。
    用户的资料以及转账记录不能被其他人监视。只有本人登陆后才可查看。
    用户的密码信息,包括登陆密码和支付密码,不以明文方式存储。只存储摘要。
    2.3.2 订单安全银行系统不能查看商家和客户之间的订单信息,只能查看转账信息,但是系统可以验证订单信息是否被伪造。这里使用双签名技术,并使用 SET 协议保证订单全程的安全。

    2.3.3 通信安全银行系统的使用中,客户端和服务器之间所有的通信信息都经过加密,可对抗旁路攻击。
    电商平台和银行系统之间的通信必须保证机密性、完整性。
    电商平台的用户生成订单后会点击支付链接,这时电商平台和银行系统之间开始展开秘密通信。
    首先电商平台和银行系统互相查看各自的 CA 证书并获取公钥,银行用私钥加密一条随机消息串发送给电商,电商用银行的公钥解密,这样双方有了共同的秘密消息,之后双方利用此秘密消息作为私钥,加密双方的通信。
    共同私钥定时更换,比如十分钟更换一次。
    2.3.4 数据库安全银行数据库作为整个网上交易系统中最为重要的数据库,需要有加密技术来支持,并且及时备份。
    2.4 性能需求
    能够同时满足 1000 人的访问
    用户认证过程需要安全可靠,速度快,普通用户登录时间小于 3s
    系统可以 24 小时不间断工作
    可以和电商平台对接
    平台兼容性好,能够在各种浏览器上运行

    3.概要设计3.1 硬件环境云服务器:

    有独立 IP 和域名
    网络带宽不低于 10Mbps
    内存 8G
    硬盘 500G

    3.2 开发环境
    操作系统:Windows 10 Pro
    数据库:Mysql
    服务器:Django
    语言:Python3.6 + html + JavaScript + css

    3.3 用户环境Windows、Mac、Linux、Android、IOS,通过浏览器访问。支持的浏览器为 IE、火狐、谷歌浏览器。
    3.4 业务数据流
    3.5 功能模块划分
    3.6 功能模块定义3.6.1 管理员模块管理员模块需要经过银行管理员登陆并认证后操作。管理员可以审核用户注册、获取用户异常,并根据异常信息冻结账户,所有的操作记录数据库。
    3.6.2 用户操作用户包括电商用户和普通用户,都可以进行状态修改,比如修改个人信息、修改密码。有敏感操作时需要转到认证模块作安全认证。
    3.6.3 身份认证银行系统的敏感操作之前需要有安全认证。验证内容包括数字证书是否真实、是否过期,登陆状态是否正常。
    3.6.4 订单审核执行 SET 协议,判断订单信息是否真实,再执行支付操作,转账信息写入数据库,并更改账户余额。
    3.6.5 通信模块电商平台根据提供的支付链接转到银行系统,此后双方执行类似于 SSH 的协议互相认证身份并协商出临时对称密钥,用于加密之后的通信。
    3.7 功能模块划分3.7.1 用户基本信息表Users



    字段
    类型
    长度
    是否主键
    是否非空
    备注




    uID
    int
    32


    用户 ID


    uName
    Varchar
    32


    用户姓名


    Uphone
    Varchar
    32


    用户手机号


    Uemail
    Varchar
    32


    用户邮箱


    uPassword
    Varchar
    128


    登陆密码


    uPaypasswd
    Varchar
    128


    支付密码


    Time
    Date



    创建时间


    Status
    Varchar
    32


    用户状态



    3.7.2 管理员基本信息表Admins



    字段
    类型
    长度
    是否主键
    是否非空
    备注




    aID
    int
    32


    管理员 ID


    aName
    Varchar
    32


    用户姓名


    aPassword
    Varchar
    64


    用户密码



    3.7.3 转账信息Transfer



    字段
    类型
    长度
    是否主键
    是否非空
    外键
    备注




    Serial
    int
    32



    流水号


    Suser
    int
    32


    Users
    发起者 ID


    Duser
    int
    32


    Users
    接收者 ID


    Scard
    int
    32


    Crashcard



    dcard
    int
    32


    Crashcard



    mID
    Varchar
    32



    电商 ID


    Amount
    Float




    金额


    sBalance
    Float




    发起者本次余额


    dBalance
    Float




    接收者本次余额


    Time
    Date




    日期


    Remark
    Varchar
    128



    备注



    3.7.4 银行卡信息


    字段
    类型
    长度
    是否主键
    是否非空
    外键
    备注




    kID
    int




    银行卡号


    Balance
    Varchar
    32



    余额


    User
    int



    Users
    用户 id


    Time
    Date




    创建时间


    Status
    Varchar
    32



    卡状态



    3.7.5 存取款信息


    字段
    类型
    长度
    是否主键
    是否非空
    外键
    备注




    Serial
    int




    流水号


    User
    int



    Users
    用户 ID


    Amount
    Varchar
    32



    存取款金额


    Balance
    Float




    用户本次剩余金额


    Type
    Varchar
    8



    存/取


    Datafrom
    Varchar
    32



    存取款来源


    Time
    Date




    日期



    4.详细设计4.1 注册4.1.1 页面设计

    4.1.2 实现方法输入地址 127.0.0.1:8001,自动跳转到登陆页面,点击注册按钮进入注册页面。
    传输安全:将 CA 服务器提供的证书放到 html 页面,用户客户端提交表单时首先提取证书中的公钥字段,利用公钥加密表单,传输到服务器。服务器接收到信息后首先用私钥解密,再执行下一步操作。
    前端加密 Signup.html
    <script> function formAck() { alert("success"); var cert=document.getElementById("cert").value; #从 html 中获取证书 var certInfo=JSON.parse(cert).info.certInfo var pubKey=JSON.parse(certInfo).PublicKey #从证书中获取公钥 var encrypt = new JSEncrypt(); encrypt.setPublicKey(pubKey); var data={ name:$('#name').val(), idcard:encrypt.encrypt($('#idcard').val(), true), phone:encrypt.encrypt($('#phone').val(), true), email:encrypt.encrypt($('#email').val(), true), passwd:encrypt.encrypt($('#passwd').val(), true), paypasswd:encrypt.encrypt($('#paypasswd').val(), true) }; console.log(data) $.ajax({ url:"/signup/", type:"POST", data:data, success:function (data1) { alert(data1) window.location.href="/login/" } }) }</script>
    后端加密 Views.py
    def signup(request): if request.method=="GET": return render(request, "signup.html") if request.method=="POST": name = request.POST.get("name", None) idcard = tools.DecodeDecrypt(request.POST.get("idcard", None)).decode() phone = tools.DecodeDecrypt(request.POST.get("phone", None)).decode() email = tools.DecodeDecrypt(request.POST.get("email", None)).decode() passwd = tools.DecodeDecrypt(request.POST.get("passwd", None)).decode() paypasswd = tools.DecodeDecrypt(request.POST.get("paypasswd",None)).decode()
    数据库存储密码:登陆密码和支付密码不能直接存入数据库,而是存加 salt 的哈希值。

    4.2 登陆4.2.1 页面设计
    4.2.2 实现方法用户点击登陆后,客户端向服务器发送一个 post 请求,包含 公钥加密后的ID 和登陆密码。服务器接收后,用系统私钥解密,解密成功后:

    验证登陆密码的加 salt 哈希和数据库存储是否一致,一致的话执行下一步操作,不一致返回登陆界面
    服务器设置 session,添加用户 ID 和 name 字段,之后每次操作验证登陆信息时,检查这两个 session 值是否存在即可
    服务器返回“success“字段,客户端接收后执行 href=”/viewuserinf/“ ,执行信息查看操作
    传输安全:用户在登陆界面提交的表单,前端用公钥加密,服务器用私钥解密,具体操作同注册的传输安全

    4.3 信息查看4.3.1 页面设计
    4.3.2 实现方法请求查看页面的请求类型全部为 get 型,url 为 127.0.0.1:8001/viewuserinf/,服务器接收到该请求后,首先验证session 的 id 字段是否存在,存在才可继续查看,不存在则清楚所有 session 并返回登陆界面。
    Views.py
    def viewuserinf(request): if request.method=="GET": try: id_session = request.session["id"] tmp = Users.objects.get(id=int(id_session)) return render(request,"user_inf_show.html",{"inf":tmp}) except: return render(request, "login.html") return render(request, "login.html")
    4.4信息修改4.4.1 页面设计
    4.4.2 实现方法由于用户姓名、身份证号是认证信息,不可修改,登陆密码和支付密码不在此模块。所以这里只能修改手机号和电子邮箱。
    获取信息修改页面的请求方式是 get,用户点击“信息修改”按钮或者直接在浏 览 器 地 址 栏 中 输 入 url : http://127.0.0.1:8001/edituserinf/ ,就会返回信息修改页面。
    信息修改的表单提交使用 post 请求,用户输入的表单信息用公钥加密后传输,服务器接收后用私钥解密,然后检查 session 的 id 字段是否存在,存在则修改成功,返回信息查看界面,否则返回登陆界面。
    4.5 更改密码4.5.1 页面设计

    4.5.2 实现方法获取修改密码界面的请求方式是 get,用户在登陆状态下,点击“修改密码”或 者 在 浏 览 器 地 址 栏 输 入 url:127.0.0.1:8001/editpasswd/获得界面。用户可选择登陆密码和支付密码,更改密码必须输入原密码。
    表单提交的请求方式是 post 请求,客户端使用公钥加密表单,服务器接收请求后用私钥解密,之后:

    检查服务器 session 中是否存在 id 字段,存在继续下一步,不存在返回登陆界面
    MD5加盐计算密码哈希值,与数据库存储的哈希值对比,相等,执行下一步,否则返回信息修改界面重新提交
    计算新密码的加 salt 哈希值,存入数据库。修改完成后,如果是修改支付密码,返回信息查看界面,如果是修改登陆密码,删除 session 后返回登陆界面

    安全设计 :客户端公钥加密传输表单,客户端私钥解密,保证传输安全。修改密码必须验证原密码,并且密码只存储哈希值,保证密码数据库安全。
    4.6 银行卡管理4.6.1 页面设计查看所有个人银行卡:

    添加银行卡:

    4.6.2 实现方法用户获取银行卡管理界面的请求方式为 get,在登陆状态下点击“银行卡管理”或者 url 输入 127.0.0.1:8001/cardmanage/ 进入银行卡管理界面。服务器将银行卡信息返回给用户,每张银行卡信息包括卡号、建立时间、余额和状态。由于涉及到金额,银行卡一旦添加不可删除。
    在银行卡管理模块可以选择添加银行卡,获取页面的请求方式仍是 get。获取到界面后,用户必须输入支付密码,点击确认添加,向服务器发送 post 请求,表单内容为 公钥加密后的支付密码。
    服务器接收到请求后,首先检查 session 的 id 字段是否存在,存在执行下一步,否则删除全部 session 返回登陆界面。解密表单内容,获取明文支付密码,计算加 salt 哈希值,对比数据库支付密码哈希值,相同后即可分配银行卡。
    银行卡添加成功后,分配一个唯一卡号,状态默认为正常,余额默认为 0。随后返回银行卡管理界面。
    4.7 转账4.7.1 页面管理

    4.7.2 实现方法在登录状态下,用户通过点击“转账”或者输入 url: 127.0.0.1:8001/transfer/向服务器发送 get 请求,进入转账界面。
    用户选择本方卡号,输入对方卡号、转账金额、支付密码后确认转账,javascrpt使用公钥加密表单后传输给服务器。服务器接收并私钥解密后:

    检查登陆状态,即检查 session 的 id 字段是否存在,不存在返回登陆界面,存在则进入下一步
    计算用户输入的 paypasswd 的加 salt 哈希值,与数据库提取的密码哈希值对比,相同则进入下一步,不同则返回转账界面重新输入
    将此转账信息写入数据库,再将对应的银行卡做余额更改。执行成功后进入转账查询界面。

    安全:

    客户端公钥加密后传输,防止旁路攻击
    密码存哈希值,明文不出现数据库
    转账记录表和银行卡表中记录的更改在确认转账可以执行后,才一起更改防止数据不同步

    tmp1 = Transfer(time=time, scard=CrashCard.objects.get(id=scard), dcard=CrashCard.objects.get(id=dcard), suser=Users.objects.get(id=uid), duser=Users.objects.get(id=CrashCard.objects.get(id=dcard).user.id), amount=amount, scbalance=CrashCard.objects.get(id=scard).balance - amount, dcbalance=CrashCard.objects.get(id=dcard).balance + amount)CrashCard.objects.filter(id=scard).update(balance=scbalance - amount)CrashCard.objects.filter(id=dcard).update(balance=dcbalance + amount)tmp1.save()
    4.8 存款4.8.1 页面设计
    4.8.2 实现方法在登录状态下,用户点击“存款”或者输入 url: 127.0.0.1:8001/ userdeposit/向服务器发送 get 请求,进入存款界面。
    在存款界面,输入存款卡号和金额,用 RSA 公钥加密表单,传输给服务器。
    服务器解密后,获取卡号和金额,更改数据库银行卡表单,完成操作。返回存取款查询界面。
    4.9 取款4.9.1 页面设计
    4.9.2 实现方法取款操作和存款操作的实现方法类似。不同的内容为:

    取款的 url 为 127.0.0.1:8001/userdraw/
    取款需要验证支付密码,支付密码需要计算加 salt 哈希值与数据库存储哈希值对比

    4.10 转账查询4.10.1 页面设计
    4.10.2 实现方法在登录状态下,用户点击转账查询或者输入url: 127.0.0.1:8001/ viewtransfer/向服务器发送get请求,进入转账查询界面。
    服务器检查登陆状态,即验证 session 的 id 字段是否存在。存在则将该用户的转账记录返回客户端。
    4.11 存取款查询4.11.1 页面设计
    4.10.2 实现方法在登录状态下,用户点击转账查询或者输入url:127.0.0.1:8001/ viewdrawdeposit/向服务器发送get请求,进入转账查询界面。
    存取款查询的实现方法与转账查询方法基本相同。
    5.结束语
    常规网站的设计如果不考虑安全,那么网站能用但是风险极高
    加密传输可使用 RSA 公钥前端加密,后端解密
    本次项目的实现让我了解了很多信息安全的知识,增加了动手能力
    本门课程收获很大

    参考文献[1]翟健宏. 信息安全导论. 北京:科学出版社. 2011.7
    [2]William Stallings. 密码编码学与网络安全-原理与实践. 北京:电子工业出版社.2006.11
    3 评论 101 下载 2019-04-12 21:33:56 下载需要12点积分
  • 基于php的教材管理系统

    摘 要随着时代的进步,网络的应用已经相当普及,人们也认识到网络信息量大,传播方便快捷等特点,网上银行、网上商店、网上查分都应运而生。需求促进了技术的发展,而在这其中,PHP技术则因为可以进行复杂的数据库操作、很强的交互性以及方便用户控制管理且简便易学而备受青睐,成为当前相当热门的网络开发技术。MYSQL是一个真正的多用户,多线程的MYSQL数据库服务器。是一个客户机/服务器结构的实现,它由一个服务器守护程序MYSQL和不同的客户程序和库组成。由于其源码的开放性及稳定性,且与网站流行编程语言PHP的完美结合,很多站点都利用其作为后端数据库,获得了广泛应用。
    本文首先介绍了PHP技术的工作原理、工作过程及其运行环境和PHP文件的编程特点,以及如何较好地配置PHP的需求环境,既使大家对PHP有更好的了解,同时也有利于更好地使用PHP技术。其次,介绍了教材管理系统,MYSQL数据库,包括MYSQL数据库数据类型和数据表,对MYSQL数据库数据操作的核心概念,即数据的添加、删除、修改和查询进行了简单的介绍。
    关键词: PHP, MySql, Apache, 数据库,数据库实现,数据源 ,电子高校教材
    AbstractWith the development of the computer and technology of the network, it ispopularized day by day in the world that Internet/Intranet uses, in numerousnetwork services, web gives somebody the feeling of finding everything freshand new, and among them, ASP carry on complicated data base operate , verystrong interaction and help user control management and simple and convenientto learn and was favored while being easy to learn, become the quite hotnetwork technology at present.
    This article first introduced operationprinciple of the ASP technology, the workingprocess and its running environments and the programming characteristic of theASP document , as well as how doesdispose the ASP demand environment well, since everybody has a betterunderstanding to ASP, simultaneously is also advantageous to uses the ASPtechnology well. Secondly, having introduced the visit method based onWeb data-base of Access relatively in detail, including how to establish andjoin, carry out inquiring and disposal and so on, combining the data-basetechnology and ASP technology theoretically. Thereafter, on the basis of this,this text come out the design and exploitation of a currency-check-affairsystem based on web—webregistration sub-system, which based on network. Mainly recommend the foregoingpreparation (software and hardware) and the design considering of basic constitutesand the implement of functions of the system (including signing up on the net,submitting photograph, querying result, maintain systematically, etc), and thespecialties and security design of this system. Finally expound the matter andshortage of the system, in order to ameliorate better in the future .
    Keywords:PHP, Mysql, Apache, database, DB implement, datasource,E-GovermentAffair
    第一章 引言1.1 问题的提出在电子计算机技术发展日新月异的今天,计算机技术、网络技术和信息技术的发展和应用早已深入到了各行各业,并发挥着它们的巨大潜力,特别是网络的高速化、广泛化发展和运用。在我国,各类企业的改革,一切都在朝着社会化、高效化、智能化发展,管理体制的改革更是进行着大手笔。但是,国家高校职能的改革程度还远远不够。高校教材管理系统是计算机技术和网络迅速发展的一个高校办公应用解决方案。高校教材管理系统将Internet网络技术与现代管理观念相融合,针对信息技术的特点对办公系统进行规划和重构,对高校内部信息流进行优化及合理配置,生成动态的、安全的、专有的数字化信息源,将办公体系全面自动化,流程化,数字化。以此为桥梁,横向连接同事间的交流与协同工作,纵向实现上下级一体化的高效办公体系,从而更明确、更有效地支持高校的管理和决策。
    1.2 设计方案本系统采用B/S结构,所有的程序及数据都放在服务器上,终端在取得相应的权限后使用Web页面浏览,录入,修改等功能。在语言方面使用PHP语言,在数据库上我们为了节约成本,采用了免费的MySQL数据库(当然,也可以移植到Oracle上),服务器使用Apache Web服务器。
    处理流程如下图:


    1.2.1 功能要求
    登录:四种不同权限的人,管理员/系级人员/老师/学生,不同人登录后界面应有所不同,如果相同要做到不同功能并是是所有人都可用
    教材征订:教师通过每年的开课计划进行教材征订,征订的结果(订单号,教材编号,教材名,教材类型,作者,出版社及版本号,征订时间,征订人,所订班级,征订数量)由系级人员审批并保存,最后由管理员形成征订表单.之后是由采购员去买,与我们无关
    教材入库:和征订单比对后入库(可有可无),入库字段:教材编号,教材名,作者,出版社及版本号,市场价,实购价,数量,入库时间
    教材发放:在首页通知什么时间内领书,各班班长过来领.并记录领书人和所属班级.如果教师领书,只能领一本。每笔记录库存相应减少(在管理员界面实现)
    相关查询:四种权限人员都可以查看教材情况(教材编号,教材名,教材类型,作者,出版社,库存量)
    管理员还可查看:预定清单,发放清单,和财务清单并能开成报表(尽可能是可以查一段时间内的信息)

    1.2.2 实现形式采用页面对话交互方式进行,把页面形成工具(DREAMWAVER4)和动态编辑工具(PHP)以及强大的数据库支持(MYSQL)融为一体,达到完成功能块目的。要求该功能块具有整个系统的统一风格。
    1.2.3 具体内容标题栏部分
    采用“高校教材网”统一标题头,即:左为“网上办公,无纸办公”图片,右为“人民高校为人民”,下为其他功能模块的超链接。
    主体部分

    登录:四种不同权限的人,管理员/系级人员/老师/学生,不同人登录后界面应有所不同,如果相同要做到不同功能并是是所有人都可用
    教材征订:教师通过每年的开课计划进行教材征订,征订的结果(订单号,教材编号,教材名,教材类型,作者,出版社及版本号,征订时间,征订人,所订班级,征订数量)由系级人员审批并保存,最后由管理员形成征订表单.之后是由采购员去买,与我们无关
    教材入库:和征订单比对后入库(可有可无),入库字段:教材编号,教材名,作者,出版社及版本号,市场价,实购价,数量,入库时间
    教材发放:在首页通知什么时间内领书,各班班长过来领.并记录领书人和所属班级.如果教师领书,只能领一本.每笔记录库存相应减少(在管理员界面实现)
    相关查询:四种权限人员都可以查看教材情况(教材编号,教材名,教材类型,作者,出版社,库存量)
    管理员还可查看:预定清单,发放清单,和财务清单并能开成报表(尽可能是可以查一段时间内的信息)

    1.3 系统运行环境本子系统承接高校教材办公网系统,对运行环境的要求是:
    1.3.1 硬件需求下列的配置是本次实际操作中的配置:

    兼容Intel486等级以上的PC电脑
    64M以上的RAM
    15GB以上的硬盘空间
    48倍速以上的光驱
    1.44软驱

    实际操作中可以略低于此配置。
    1.3.2 软件需求本系统采用了目前最佳组合-LAMP,即:Linux + Apache + MySQL +PHP, 该组合具有更稳定、高效能、更经济的特点。

    操作系统-Linux,采用“飓风Linux”
    Web服务器软件-Apache
    数据库服务器与用户端软件-MySQL
    页面应用软件-PHP4

    除了上面这些动态网页开发环境的需求,还有一些时在安装时需要的软件,在Linuz系统中都可以找到或到网上下载:

    C语言编辑器-将C语言源文件编译成可执行软件的工具
    Apxs-制作Apache动态模块的工具
    SecureEdit-跨平台上传文件的工具

    本次开发过程是:先在Window下编写代码,然后上传到服务器进行调试。
    第二章 设计的理论依据2.1 Linux + Apache + MySQL + PHP 最优组合现在的“网络生态”已经不能只有展示的功能,凡是网上下单、网络购物、检索查找等都是在网上随处可见的服务。这些功能的运作都牵涉到用户的选择、输入数据以及服务端处理数据与回应等动作,所以这样的网页即为互动式网页。也正是本系统所要采用的网络形式。
    在HTML文件的结构下使用互动式网页就必须在服务器端另外增加这些处理信息的功能,通常是针对用途写一个网页应用程序来负责处理。而以互动式网页存取得数据当然必须能长时间储存,所以网页应用程序就要能存取数据库,在浏览器上显示互动式网页,如下图所示:

    通过以上的介绍您应该已经知道,如果是一个网站内容提供者(ICP),要提供互动式网页的服务,必须要有WWW服务器,网页应用程序和数据库这三个成员,当然它们都必须在操作系统下执行,所以把操作系统也算在内总共四项软件。本系统采用了当今最佳组合――LAMP。

    LAMP就是Linux、Apache、MySQL加上PHP。首先是Linux操作系统(免费!),这两年在PC地舞台上大放光明,尤其在server地使用上悄然威胁微软的地位。Web服务器Apache(免费!)在全球的website有极大的使用率。数据库MySQL (免费! ), 一个快速、稳定的SQL数据库服务器。PHP(免费! ), 扮演处理互动式信息的网页应用程序的角色。除了稳定、高效能之外,它们均免费,是最经济的选择,而且丰富的网络资源与众多的高手绝对不会让你求教无门。
    2.2、PHP, Apache, Mysql, Linux介绍2.2.1 PHP 简介PHP的全名即是Hypertext Processor,最早的名称由来则是来自PHP Tools(Personal HomePage Tools),PHP的程序引擎是一个公布源代码的Open Source 成员。PHP是一种“服务器端的HTML嵌入式的描速语言(HTML - embedded scripting language)”。其语法混合了C、Java、Perl以及PHP式的新式语法,它比CGI或者Perl可更快速地执行动态网页,同时PHP的数据库层操作功能强大,这使得PHP语言这几年飞速发展,风靡全球。
    以下是PHP的基本特点:

    开放源代码――所有的源代码都可以得到
    免费使用――PHP是一个免费软件,尽可放心使用
    基于服务器端――由于PHP是在Web服务器端运行的,所以它的程序可以很大、很复杂而不会降低客户端的运行速度
    跨平台――PHP程序可以在UNIX、Linux或者Windows操作系统下运行
    嵌入HTML――PHP语言可以嵌入到HTM内部,则易学
    还有语言简单、效率高、分析XML、数据库模块、文件存取、文本处理、复杂的变量,图象处理等特点

    最新PHP4.0的特点:

    别名――通过引用别名为变量赋值,给编程带来极大方便
    扩充了API模块――提供扩展接口模块
    个性化的Java支持――PHP4.0和Java的交互
    对象和数组嵌套――实现功能更加强大的对象以及数组嵌套
    面向对象的编程――为面向对象的编程、构造类以及对象提供扩展的功能和新特征。

    还包括如自动资源释放、布尔类型、进程生成、COM/DCOM支持、与PHP3.0的兼容性很好、配置、加密支持、类型检查、FTP支持、PHP4新增函数或功能增强函数、“Here”打印、HTTP Session fallback系统、ISAPI支持、内存、多维数组、其他类成员函数、对象重载支持、输出缓冲支持、支持引用等特点。编写好后,将其放在服务器的提供的Web的目录里,通过IE浏览器可看到结果“我的第一个PHP程序!”。具体语法参考PHP4.0相关书籍。
    2.2.2 Apache 简介本系统的操作所使用的web服务器软件为Apache。Apache是目前全世界的网站使用最多的服务器。在2000年2月十全世界有58.08%的使用率。同样地,Apache的优点也是稳定、快速与开放,同时也有众多的功能,并且可以在不同操作系统下执行。前面的内容已经介绍了web 服务器负责完成传送显示在浏览器的 HTML 文件内容,而数据处理就是 PHP 程序的工作了。所以在服务主机使用PHP时必须将解读PHP程序代码的功能加到Apache ,也就是按装Apache 的PHP 模块(module)。以往如果要加入PHP模块,就必须先将PHP的源代码编译成Apache 的模块,再将Apache加上PHP功能模块重新编译。从PHP3开始就支持了Apache 的动态共享对象(Dynamic Shared Object , DSO)模块的功能,也就是说PHP3可以编译DSO模块,Apache 只需在需要执行时调用PHP3模块就可以使用PHP3的功能。这样以来,即使修改PHP、换装新版本或是重新安装PHP都可以不必 动用Apache ,当然PHP4 也可以编译DSO模块。
    2.2.3 MySQL 简介MySQL数据库系统与PHP整合使用是一个高效率的组合。MySQL是一个多用户(Multi-user)、多线程(Multi-thread)的SQL数据库系统,使用目前最普遍地数据库标准语言:SQL(Structured Query Language)。MySQL包括了服务器端程序与多种 用户端程序及程序库,并且可以在不同平台执行。其特点还有稳定、快速与高灵活性等。
    MySQL有瑞典的T.c.X DataKonsultAB公司开发出来,开发的主要目的就是以快速、健全以及使用微目标,最初的开发即是因为该公司需要能在廉价的主机上执行,优于当时各种商用数据库,且快速管理庞大数据库的SQL服务器。MySQL是一个还在开发中的数据库系统,但是其效能已经非常优秀。在MySQL网站(http://www.mysql.org )上你可以看到它们的使用记录是以管理40个以上的数据库,超过10000个表,同时其中还有500个以上的表超过7百万记录,而这些数据总共超过了10Gbytes的容量。
    2.2.4 Linux简介操作系统最好的选择当然是使用面费又稳定的Linux系统。Linux是在1991年发展起来的与UNIX兼容的操作系统,可以免费使用,它的源代码可以自由传播且可任人修改、充实、发展。Linux本身是一个完整的32位的多用户、多任务操作系统。而本次开发过程使用的版本是飓风软件公司出品的国产Linux操作系统。它是经汉化后形成的Linux操作系统。凡是Linux操作系统均可到网上下载。
    2.3 安装及注意事项LAMP (Linux + Apache + MySQL + PHP/Perl/Python) 近几年来,已经成为Web 社区的事实标准。我们将介绍LAMP组合的安装,假定你的机器上已经安装了Linux ,如果你对Linux 的安装还有什么问题的话,可以去相关的一些开放源码站点论坛上发表贴子,向其他网友寻求帮助。也可以向相关的厂商寻求技术支持。本文的LAMP中的 P,暂时解释为PHP,A解释为Apache,M解释为MySQL,L当然解释为Linux。所有LAMP组合中的软件都是开放源代码产品,所以您不必担心产品的价格以及版权问题。相反,有广大的开放源码社区开发人员的不断努力,这些产品的版本更新速度反而比那些昂贵的专有软件更快。虽然Linux 因为界面问题,会让您望而却步,但是您不必担心,现在,这些软件都采用了浏览器管理界面,好多都提供phpMyAdmin(一个利用PHP 语言在浏览器上管理MySQL的程序)以及WebMin(通过浏览器来管理系统)来让您方便的管理系统。PHP现在的版本已经到了4.0.4pl1,是一门面向对象的交叉平台的服务器端脚本语言。可以嵌入HTML语言中,可以作为Apache 的模块来运行。下面我们以 tarball(.tar.gz)格式(和它相对的是RPM 格式)的版本为例子,来介绍安装过程。
    2.3.1 安装Mysql因为RPM包安装非常简单而且成功率高所以我选择这种安装方式。
    方法:在Xwindows下双击此文件就可以了。在提示符下输入:

    rpm -i MySQL-3.23.38-1.i386.rpm

    2.3.2 安装Apache和PHP注:Apache和PHP是在一起安装的,这一点一定要理解。
    步骤如下:    

    先确定Apache安装后的路径
    安装并编译PHP,把PHP作为Apache的模块安装到Apache的安装路径(即Apache的解压缩的路径)
    安装并编译Apache 因为只有先把PHP作为Apache的模块安装到Apache的安装路径(即Apache的解压缩的路径),再安装Apache才能使Apache执行PHP文件。

    2.3.3 开始安装解压缩文件
    tar zxvf Apache_1.3.9.tar.gz tar zxvf PHP-4.0.2.tar.gz配置Apache确定Apache安装后的路径:
    cd Apache_1.3.9 ./configure --prefix=/usr/local/apache进入PHP的解压目录,输入:
    ./configure --with-apache=../Apache_1.3.9 --with-mysql --disable-debug --enable-track-vars注:”../Apache_1.3.9”表示Apache的解压路径,这个路径一定要正确,我是把Apache和PHP放在同一路径下解压的。 这样做就是让PHP作为Apache的模块和Apache一起安装。
    下一步:编译、安装PHP到Apache的原始目录中
    在提示符下输入:make
    完成之后再输入:make install
    再将php.ini.dist拷贝到这个目录:/usr/local/lib,并重命名为php.ini
    cp php.ini.dist /usr/local/lib最后一步是安装Apache
    进入Apache的解压目录输入:
    ./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a接下来:make
    make install至此安装工作完成了。你还需要改动一些地方,才能让Apache执行PHP,如下:
    编辑Apache配置文件:
    /usr/local/apache/conf/httpd.conf找到这一行:AddType application/x-httpd-php4 .php4
    去掉前面的“#”号。再加上下面的几行:
    AddType application/x-httpd-php .phpAddType application/x-httpd-php .php4重新启动Apache: cd /usr/local/apache/bin ./apachectl restart
    用下面这个文件在浏览器下测试Apache和PHP:
    test.php<? phpinfo();?>如果出现了有关PHP的信息,说明你已经成功了!注意大小写!
    利用PhpMyAdmin来管理Mysql:将解压后的PhpMyAdmin目录放到你的Apache的htdocs目录下,修改这个文件使之成为中文的界面:config.inc.php
    找到有“english”单词的一行,将“english”改成“chinese_gb”存盘,这样就完成了。 这回再到浏览器下执行一下这个目录下的 index.php文件,这下应该出现Mysql的管理界面了而且还是中文,是不是很舒服!
    第三章 开发过程3.1 设置服务器这里主要是介绍Linux服务器中最重要的网络服务:
    Web服务器的配置
    安装好Apache 服务器后,还需要根据实际情况完成各项参数的配置,其设置文件位于/www/httpd/conf/目录下,通常使用3个配置文件httpd.conf, mysql.conf 和srm.conf来配置Apache。
    httpd.conf提供了最基本的服务器配置,是对守护进程httpd如何运行的技术描速;srm.conf是服务器的资源映射文件,告诉服务器各种文件的MIME类型,以及如何支持这些文件;mysql.conf用于配置服务器的访问权限,控制不同用户和计算机的访问权限。
    用命令:#/www/bin/apachectl restart启动来设置各项参数。
    a. ServerType standalone //可使httpd进行自我处理,占用较少CPU资源b. ServerRoot “/usr/local” //指定守护进程的运行目录其他参数可根据实际需要设置。
    3.2 设置数据库3.2.1创建数据库和数据表教材管理子系统所用的数据库名为:jc;
    教材管理子系统所用的数据表有5项,名分别为:users(用户简要信息表),aducat(学历信息表),emergen(意外事故情况表),family(家属信息表),resume(个人简历表)。

    用命令:

    /# cd /var/www/html 回车,进入mysql所在目录;/#mysql –p 回车,根据提示键入密码;
    用命令:create database jc;//完成创建数据库
    用命令:show databases; //显示数据库
    用命令:use jc; //指定使用的数据库

    以下将完成各表项的创建:
    教材管理系统数据库设计

    表[xuesheng] xuehao ingming banji xi user_name password
    表 [laoshi] jiaoshihao xinmin xi user_name password
    表[xi] xingming xi user_name password
    表 [admin] name user_name password
    表[zhengding] dingdan jcbianhao jcming jcleixin zuoze cbshe banben shijian zdren szbanjji zdshuliang
    表 [ruku] jcbianhao jcming zuoze cbshe banben scjia sgjia suliang rukushijian
    表 [fafang] shijian lsren ssbanji
    实体: xuesheng laoshi xi admin zhengding ruku fafang
    学生属性 学号,姓名,班级,系,账号,密码
    老师属性 教师号,姓名,系,账号,密码
    系级人员属性 姓名,系,账号,密码
    管理员属性 姓名,账号,密码
    征订属性 订单号,教材编号,教材名,教材类型,作者,出版社及版本号,征订时间,征订人,所订班级,征订数量
    入库属性 教材编号,教材名,作者,出版社及版本号,市场价,实购价,数量,入库时间.
    发放属性 时间 领书人 所属班级 数量

    3.2.2 数据库连接为了保证程序的安全,编写独立的数据库连接功能程序:
    <?php do{include("../config.php");} while($sql==""); //数据库所在的主机地址,localhost是本机地址 $MYSQL_HOSTNAME = "localhost"; //数据库登录的用户名称 $MYSQL_USERNAME = "root"; //数据库登录的密码 // $MYSQL_PASSWORD = "1111"; //要登录的数据库的名称 // $DATABASE = "jc"; //数据库的连接操作 $link_id=$sql;?>
    3.2.3 创建数据源用命令:
    insert into usersvalues(1003,’张三’,’男’,’汉’,’教材部’,’部长’,’工程师’,’1978-03-24’,’成都市人民南路3段3号’,12345,6,4,3);其他表数据源类似插入。
    用命令:
    select * from users order by ID;可以查看所录入的数据源。
    注:教材管理和职员教材信息管理两部分的功能实现,由薪资管理模块和公共信息管理模块提供。
    3.3 系统功能实现教材管理子系统作为高校教材办公网的一个模块,将完成对高校系统中公务员的教材管理,目前包括教材规章制度、重要通知、最新教材信息、信息查询、管理员登录以及相关功能链接。其中以信息查询和管理员登录为主,将实现个人信息的简要和详细查询,部门中人员信息的简要和详细查询;人员信息的录入、修改、删除、教材管理以及教材管理。采用页面交互式操作,用网页制作工具dreamwaver或其它工具实现,功能程序用php实现,将所有的程序放置在服务器上,通过apache提供;达到网上办公和无纸办公。可以参考以下功能模块图。
    3.3.1 系统登录用户登录高校教材办公网后,点击“登陆”链接进入本子系统。

    如下图示,进入教材管理子系统主页面:

    3.3.2 教材规章制度教材管理规章制度栏,将向所有公务员提供各种咨询信息,为初到机关的员工讲解具体要求。通过点击即可链接到所要查看项目,可以进入该项的详细内容页面。其具体内容由用户方提供,粘贴到页面即可。如上图左示。
    3.3.3 重要通知重要通知栏,将由教材部或科发布其最近最新的教材通知,由管理员在新闻发布管理项,可以添加,修改,删除新闻。如上图中上示。
    3.3.4 最新教材信息最新教材信息栏,将由教材部或科发布其最近最新的教材信息,包括与本单位一切相关信息,仍由管理员在新闻发布管理项,可以添加,修改,删除新闻;通过点击相关项,可浏览其详细信息。如上图中下示。
    3.3.5 信息查询//选择进入模块login1.php<? php switch($choose): case "c1": require("infomation1.php"); break; case "c2": require("infomation2.php"); break; case "c3": require("depart1.php"); break; case "c4": require("depart2.php"); break; default: require("m6_index.php");endswitch;?>

    职员信息查询:将向员工用户提供公务员信息查询,即:员工简要信息查询和其详细信息查询。简要信息查询时,当输入员工的帐号和姓名,点击“确定”后,由程序search1.php提交到数据库中,根据ID和NAME从表users中提取数据返回infomation1.php显示;详细信息查询时,输入员工的帐号、姓名和密码,点击“确定”后由程序modify11.php提交到数据库中,根据ID、NAME和PASSW从表users以及aducat、emergen、family、resume中提取数据返回infomation2.php显示。
    //个人简要信息search1.php<? if($ID AND $NAME){ //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==" "); $str="SELECT NAME,XB,MZ,BM,ZC,ZW,ID,CSNY,XZDZ FROM users WHERE ID='$ID';"; $result=mysql_query($str,$sql); mysql_close();//关闭数据库 $record=mysql_fetch_row($result); }?>//送出查询结果
    //个人信息详细查询mofify11.php<?php if($ID AND $NAME){ //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==""); $str="SELECT * FROM users WHERE ID='$ID';"; $result=mysql_query($str,$sql); $record1=mysql_fetch_array($result); $str2="SELECT * FROM aducat WHERE ID='$ID';"; $result2=mysql_query($str2,$sql); $record2=mysql_fetch_array($result2); $str3="SELECT * FROM resume WHERE ID='$ID';"; $result3=mysql_query($str3,$sql); $record3=mysql_fetch_array($result3); $str4="SELECT * FROM family WHERE ID='$ID';"; $result4=mysql_query($str4,$sql); $record4=mysql_fetch_array($result4); $str5="SELECT * FROM emergen WHERE ID='$ID';"; $result5=mysql_query($str5,$sql); $record5=mysql_fetch_array($result5); mysql_close(); }?>

    部门信息查询:部门简要信息查询和其详细信息查询。即:查询该部门员工的信息。部门简要信息查询时,只需输入部门名称,点击“确定”后,程序search2.php根据BM(部门名)提交到数据库中从表users,中查询到该部门所有员工的简要信息返回depart1.php显示。详细信息查询时,需输入你的姓名,帐号,密码,且必须是领导,职务编码为4。然后输入被查询者的姓名和帐号,点击“确定”,由程序depart12.php提交数据库从表users,aducat,emergen,resume,family中查询,返回到depart2.php显示。
    //部门信息简要查询search2.php<? //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==" "); if($BM){ $select="select * from users where BM='$BM';"; $result=mysql_query($select,$sql); //$record=mysql_fetch_row($result); $sn_index=mysql_num_rows($result); for($index=0;$index<$sn_index;$index++){ $arr[$index]=mysql_fetch_array($result); }; mysql_close(); }?>
    用list_display.php程序来实现逐条显示
    <? //逐条显示 <TR align=center><TD ALIGN=CENTER><?echo $arr[$index][ID]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][NAME]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][XB]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][MZ]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][BM]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][ZC]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][ZW]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][CSNY]?></TD> <TD ALIGN=CENTER><?echo $arr[$index][XZDZ]?></TD> </TR>?>
    //部门详细信息查询depart12.php<? //判断输入信息,若正确则连接数据库 if($ID AND $NAME AND $PASSW AND $OBJECTN AND $OBJECTID){ do{ require("../config.php"); }while($sql==""); $str=" SELECT ZWBM FROM users WHERE ID='$ID';"; $result=mysql_query($str,$sql); $record=mysql_fetch_array($result); if($record[0]==4){ if($OBJECTID AND $OBJECTN){ //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==""); $str="SELECT * FROM users WHERE ID='$OBJECTID';"; $result=mysql_query($str,$sql); $record1=mysql_fetch_array($result); $str2="SELECT * FROM aducat WHERE ID='$OBJECTID';"; $result2=mysql_query($str2,$sql); $record2=mysql_fetch_array($result2); $str3="SELECT * FROM resume WHERE ID='$OBJECTID';"; $result3=mysql_query($str3,$sql); $record3=mysql_fetch_array($result3); $str4="SELECT * FROM family WHERE ID='$OBJECTID';"; $result4=mysql_query($str4,$sql); $record4=mysql_fetch_array($result4); $str5="SELECT * FROM emergen WHERE ID='$OBJECTID';"; $result5=mysql_query($str5,$sql); $record5=mysql_fetch_array($result5); mysql_close(); } } }?>
    3.3.6 管理员模块登录时要求输入管理员的姓名、密码、帐号,此处设定为:姓名(SSSS)、密码(12345)、帐号(6666),点击“确定”后,由程序login2.php提交到数据库,根据输入的信息判断其是否为管理员,若是可进入。进入后,点击左边的各项即可链接到相应的功能项,继续操作。

    //管理员登录功能程序<?php //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==" "); if($ID=="6666" and $NAME=="ssss" and $PASSW==12345){ $select="select ID from users where ID='$ID' AND NAME='$NAME' AND PASSW='$PASSW';"; $result=mysql_query($select,$sql); if($result){ require("manager.php"); } else { echo"您填入的信息有误,<a href=m6_index.php>请回上一页重新登录!</a>"; } mysql_close(); }?>
    登录成功后,进入管理员页面(manager.php),如下:
    在页面的左侧选择操作项,右侧绿色区域为工作区。


    职员信息录入:公务员号(ID)项必须录入数据,直接在文本框中录入数据,要求日期类的格式必须为“1990-09-09”,身高“170cm”,体重“65kg”,在录入界面中输入数据后,按“提交”后,由程序insert.php提交数据库,对users, aducat, emergen, resume, family 五表插入数据;当提示数据录入成功后,点击返回,可继续录入。

    //职员信息录入insert.php<?phpif($ID){ //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==""); //向users表插入数据 $str="INSERT INTO users VALUES('$ID','$NAME','$XB','$MZ','$CSNY','$XZDZ','$ZC','$ZW','$BM','$BMBM','$ZWBM','$MJ','$PASSW','$HYZK','$ZZMM');"; //插入新数据 if(!$str){ echo "can not insert data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //向aducat表中插入数据 $str="INSERT INTO aducat VALUES ('$XL','$SCHOOL','$GRADATE','$MAJOR','$SPECI','$LANGU','$ID');"; //插入新数据 if(!$str){ echo "can not insert data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //向emergen表中插入数据 $str="INSERT INTO emergen VALUES ( '$YWLLR','$YWGX','$YWTX','$YWDH','$YWSYR','$YWSYGX','$YWSYTX','$YWSYDH','$ID');";//插入新数据 if(!$str){ echo "can not insert data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //向family表中插入数据 $str="INSERT INTO family VALUES ('$JSCH1','$JSXM1','$JSXB1','$JSCSRQ1','$JSZY1','$JSGZDW1','$JSZZ1', '$JSCH2','$JSXM2','$JSXB2','$JSCSRQ2','$JSZY2','$JSGZDW2','$JSZZ2', '$JSCH3','$JSXM3','$JSXB3','$JSCSRQ3','$JSZY3','$JSGZDW3','$JSZZ3','$ID');";//插入新数据 if(!$str){ echo "can not insert data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //向resume表中插入数据 $str="INSERT INTO resume VALUES ('$JG','$SG','$TZ','$XUX','$STZK','$HJ','$SFZH','$HOBBY','$YB','$EML','$HYZK','$ZZMM','$XZ','$ID');";//插入新数据 if(!$str){ echo "can not insert data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //向base表中插入数据 $str="INSERT INTO base(id,name,password,bmbm,zwbm) VALUES('$ID','$NAME','$PASSW','$BMBM','$ZWBM');";//插入新数据 if(!$str){ echo "can not insert data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } mysql_close();//关闭数据库 echo "添加数据成功!<a href=insert.php>返回</a>";}else{ echo "添加数据不成功!<a href=insert.php>返回,请检查数据类型的正确性!</a>";}?>

    职员信息修改:在修改界面中,首先输入被修改者的帐号(ID)和姓名(NAME),点击“确定”后由程序modify11.php提交到数据库,首先将其原始数据搜索出返回到modify.php中显示,在此基础上对数据进行修改,修改完毕再由程序modify12.php提交到数据库对数据进行更新users,aducat,emergen,resume,family五表操作,提示修改成功后,可返回,继续下一次修改。

    //职员信息修改<?if($ID){ //判断公务员号是否存在 do{ require("../config.php"); }while($sql==""); //update users table $str="UPDATE users SET NAME='$NAME',XB='$XB',MZ='$MZ',CSNY='$CSNY',XZDZ='$XZDZ', ZC='$ZC',ZW='$ZW',BM='$BM',BMBM='$BMBM',ZWBM='$ZWBM',MJ='$MJ',PASSW='$PASSW',HYZK='$HYZK',ZZMM='$ZZMM' WHERE ID='$ID';"; //更改数据 if(!$str){ echo "can not update data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //update aducat table $str="UPDATE aducat SET XL='$XL',SCHOOL='$SCHOOL',GRADATE='$GRADATE',MAJOR='$MAJOR',SPECI='$SPECI',LANGU='$LANGU' WHERE ID='$ID';"; //更改数据 if(!$str){ echo "can not update data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //update emergen table $str="UPDATE emergen SET YWLLR='$YWLLR',YWGX='$YWGX',YWTX='$YWTX',YWDH='$YWDH',YWSYR='$YWSYR',YWSYGX='$YWSYGX',YWSYTX='$YWSYTX',YWSYDH='$YWSYDH' WHERE ID='$ID';"; if(!$str){ echo "can not update data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //update family table $str="UPDATE family SET SCH1='$JSCH1',JSXM1='$JSXM1',JSXB1='$JSXB1',JSCSRQ1='$JSCSRQ1',JSGZDW1='$JSGZDW1',JSZZ1='$JSZZ1',JSCH2='$JSCH2',JSXM2='$JSXM2',JSXB2='$JSXB2',JSCSRQ2='$JSCSRQ2',JSGZDW2='$JSGZDW2',JSZZ2='$JSZZ2',JSCH3='$JSCH3',JSXM3='$JSXM3',JSXB3='$JSXB3',JSCSRQ3='$JSCSRQ3',JSGZDW3='$JSGZDW3',JSZZ3='$JSZZ3' WHERE ID='$ID';"; //更改数据 if(!$str){ echo "can not update data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //update resume table $str="UPDATE resume SET JG='$JG',SG='$SG',TZ='$TZ',XUX='$XUX',STZK='$STZK',HJ='$HJ',SFZH='$SFZH',HOBBY='$HOBBY',YB='$YB',EML='$EML',HYZK='$HYZK',ZZMM='$ZZMM',XZ='$XZ' WHERE ID='$ID';"; //更改数据 if(!$str){ echo "can not update data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } //update base table $str="UPDATE base SET name='$XM',bmbm='$BMBM',zwbm='$ZWBM',password='$MM' WHERE id='$GWYH';"; //更改数据 if(!$str){ echo "can not update data"; exit; } $result=mysql_query($str,$sql); //送出查询字符串 if($result==0){ echo "can not query "; exit; } mysql_close(); //关闭数据库 echo "数据修改成功!<a href=modify2.php>返回</a>"; }?>

    职员信息删除:在删除界面中,首先输入被删除者的帐号(ID)和姓名(NAME),点击“确定”后;程序delete.php根据ID提交到数据库查询是否有此人,然后将其删除,根据提示信息继续操作。
    //职员信息删除<!---Deleteuser php script begins here---><?phpif($ID and $NAME){ //判断输入信息,若正确则连接数据库 do{ require("../config.php"); }while($sql==" "); //删除users表中某一信息 $deleteresult="DELETE FROM users where NAME='$NAME' AND ID='$ID'"; $result=mysql_query($deleteresult, $sql); if(!result){ echo "can not query"; exit; } $affected_rows=mysql_affected_rows( $sql); //删除aducat表中某一信息 $deleteresult ="DELETE FROM aducat WHERE ID='$ID'"; $result=mysql_query($deleteresult, $sql); if(!result){ echo "can not query"; exit; } $affected_rows=mysql_affected_rows( $sql); //删除family表中某一信息 $deleteresult ="DELETE FROM family WHERE ID='$ID'"; $result=mysql_query($deleteresult, $sql); if(!result){ echo "can not query"; exit; } $affected_rows=mysql_affected_rows( $sql); //删除resume表中某一信息 $deleteresult ="DELETE FROM resume WHERE ID='$ID'"; $result=mysql_query($deleteresult, $sql); if(!result){ echo "can not query"; exit; } $affected_rows=mysql_affected_rows( $sql); //删除emergen表中某一信息 $deleteresult ="DELETE FROM emergen WHERE ID='$ID'"; $result=mysql_query($deleteresult, $sql); if(!result){ echo "can not query"; exit; } $affected_rows=mysql_affected_rows( $sql); //删除base表中某一信息 $deleteresult ="DELETE FROM base WHERE id = '$ID'"; $result=mysql_query($deleteresult, $sql); if(!result){ echo "can not query"; exit; } $affected_rows=mysql_affected_rows( $sql); mysql_close(); echo "<b>$NAME</b> 已经被成功的删除了.";}?>

    教材信息管理:具备录入,修改,删除;同上点击链接后,根据提示信息继续操作。该块由教材管理栏完成。


    教材管理:同上点击链接后,根据提示信息继续操作。
    新闻发布管理:目前由于时间原因暂未实现,若要实现可与系统主页中的新闻管理相似处理。
    职员相片管理:目前由于时间原因暂未实现,具备相片上传、相片修改、相片删除功能。暂时实现相片上传功能,后继实现。

    3.3.7 相关功能链接该部分用于提供客户的功能扩展,暂未连接功能项,留待客户具体需求提出后实现。
    6 评论 247 下载 2018-12-27 13:04:09 下载需要10点积分
  • 基于JSP和MySQL实现的图书管理系统

    一、采用的工具与技术总览
    前端页面设计涉及技术:html5+css3
    后端开发设计技术:jsp+servlet+javaBean+jdbc+dao
    模板引擎:jsp(el与jstl)
    服务器与java版本:Tomcat8.5、java12
    开发与调试工具:Eclipse IDE 2020-03、Chorme、MySQL、Navicat

    二、图书管理系统数据库的设计2.1 数据库管理工具
    数据库管理系统:mysql数据库管理系统
    数据库可视化工具:Navicat for MySQL

    2.2 数据库表关系为了减少表的数据冗余,达到数据库设计的三范式,就要避免表设计时候出现的非主键字段的部份依赖与传递依赖,实体性之间是多对多的联系我们就可以采取三张表的设计,关机表两个外键,如果是一对多,我们可以设计两张表,多方的那张表加外键。
    2.3 数据库以及数据库中表的创建在mysql中建立了一个名为homework的数据库用来存放与本系统相关的表的信息,所有的表都不采用业务主键,主键只是为了唯一标识表中的一条记录,这里采用的是id作为主键,并且设置为自动递增,以后再见到就不一一描述,所有表的信息如下图所示:

    接下来具体介绍该数据库中的每一张表的作用与表之间的关系:
    administrator表

    user表

    由于本系统主要是针对于学校的图书馆里系统,所以在该系统中外校人员以及无关人等不可以申请账户来借书等操作,只有在校学生可以申请账号,所以此表中Sno字段引用的student表中的Sno作为外键(具体看student表)。
    book表

    bookshelf表

    student表


    department表

    notice表

    此表是用来做消息通知的,是为了迎合后来的收发邮件。管理员发通知等功能。
    注:time是用varchar存的,在具体业务中是主要使用SimpleDateFormat类的 format方法与java.util.Date和java.sql.Date类来进行具体的业务操作
    book__appointment_relation表

    此表主要用于记录所有用户的预约图书的情况。
    student_book_realtion表

    此表主要用于记录每个用户的借书信息。
    student_borrow_relation表

    此表主要用于记录每个用户的借书状态。
    student_fine_relation表

    此表主要用于记录每个用户的罚款状态。
    三、成品项目的目录结构展示与说明项目遵循了软甲开发的三层架构的设计,表现层(servlet,jsp与web浏览器等)用于展示数据,业务层(service)用于处理业务需求,持久层(dao)用于完成与数据库的交互




    以上就是整个项目的目录结构的展示与说明。
    四、项目实现4.1 BeanFactory类的细节通过类加载器获取指定资源properties资源的输入流,加载解析配置文件中的内容,反射创建类的实例对象并且存入到容器中,这里的容器采用的Map,然后其它地方要用的时候。就可以调用BeanFactory类的静态方法getBean来通过key获取实例对象。
    注意service所有类的实例化的时机必须要在dao之后,因为service服务层要调用持久层,必须要掌控(依赖)持久层的对象,而持久层对象又是通过容器注入的,所以要先实例化service层再实例化dao层。
    下面是类的代码截图:


    4.2 ProxyFactory类该类实现了InvocationHanlder接口,自己实现invoke方法,在创建动态代理对象的时候将自己传入当作第三个参数,该类的属性proxyObject就是具体的要代理的对象,返回的经过Proxy.newProxyInstance方法创建的代理对象将会继承Proxy类实现与被代理对象实现的相同的接口,这样返回的对象的方法在执行时候就会经过InvocationHandler实例的invoke方法的拦截,即会加上了其中(在这里是事务控制)的功能。

    4.3 web.xml在不使用框架的情况下,一开始我们被该如何在同一个类中接收多个客户端发送的不同的请求,难道要写很多个servlet一个一个的来处理吗?这显然不是一个很好的办法,于是通过百度我了解了怎样让一个servlet处理多个请求,这里的多个请求是同一类请求,然后通过request.getRequserURI()方法来获取请求的url,然后再截取 / 获取请求方法名(请求的具体描述),最后根据if,else判断就可以实现一个servlet处理同一类请求。而这些都是配置在web.xml里面的,下面是web.xml的展示。

    首先是访问本项目的欢迎页,这个不用多说

    比如LoginController类就是专门处理项目下的以login开头的所有同类请求。

    很多,这里就不一一截图了,一个servlet控制器处理一类请求。
    4.4 dao层的实现细节持久层是与我们的数据库打交道的,所以避免不了要查数据库,查数据库的具体方法都是从request域或者session域中取得的,然后与数据库交互的话增删改比较好说,就是查询的DQL语句有时为了展示的数据丰富要进行多表联查,要进行分页sql的编写。sql语句就会比较长一些,而且后来加了通信等功能没有新写实现类,与借还信息dao类写在一起,导致这个类代码比较多,有点沉重。
    下面是几个dao的查询方法实现的示例:
    例如学生查询所有预约的图书与管理员查询某学生借书信息方法:


    有好多方法与日期交互有关,主要用以下两个Date类与SimpleDateFormat处理

    4.5 页面的jsp编写的思想(el与jstl的使用)jsp作为一种模板引擎,同freemarker,thymeleaf一样,作用就是我们来写一个页面的模板,比如有些值是动态的,我们写一些表达式,而这些值从哪里来呢??我们来组装一些数据把页面模板和数据交给我们的模板引擎,模板引擎 按照我们的数据帮我们把表达式解析,填充到我们指定的位置,最终生成一个我们想要的内容给我们写回相应体,浏览器渲染后生成页面。
    不同模板引擎的思想都是一样的,就是语法可能不太一样jsp的el即expression language 是jsp的表达式语言,jstl是el的扩充,前面都有提到过。
    下面给出两个具体el与jstl来解析数据动态生成页面的示例:


    篇幅原因不能演示太多,具体实现请观看演示视频,最后显示一下前端操作界面的截图,由于有过渡,阴影,动画等css功能,具体动态界面请看视频演示。
    4.6 前端界面展示登录界面(动态提示输入错误信息)
    注意:退出时要销毁session


    注册界面

    登录后管理员页面模板与相应操作页面





    登录后用户页面模板与相应操作页面
    注意会根据不同用户动态生成要显示的信息





    所有按钮都可以点击发送请求,进入相应的数据展示页面。
    系统反馈界面

    学生发邮件界面(qq发邮件需要知道对方准确邮箱号,这里需要知道学号,如果需要的话也可以考虑扩充加好友的功能)

    五、已有缺陷和不足的分析
    没有实现拦截器以及过滤器等功能并在web.xml中配置,这会导致用户可以直接输入资源的请求路径直接访问后台页面,虽然没有经过登录session域中不会保存用户的信息以致于他们不能进行操作,但这总归是不好的
    student表的学号在数据库中使用的int类型存储,上限是2的31次方-1即2147483647,当时考虑到本校的学生学号全是201xxxxxxx类型,所以就用的int类型存储,好像只能存储到47年,后来发现的时候以及改不太了了(需要重建),因为很多表都引用的外键,然后业务中也造成了一些转型麻烦
    修改密码,进行通信的界面信息略少
    管理员对一本书操作后如果不是第一页的书籍,操作完会跳回第一页,学生 也是,因为书籍比较多,所以用了分页SQL,一页显示固定本数的书。其他 的比如院系,专业,书架等数据还比较少,暂时也不用考虑分页
    BeanFactory借鉴了一下IOC的思想,用到了,但是ProxyFactory没有用上 因为在业务逻辑编写的时候没有用到类似于转账等需要事务控制的功能
    种种原因没有加上加好友的功能,因为29号视频已经录完了,再加的话要改 动很多东西,(加上的话在有充值功能就可以进行转账就可以用事务控制了) 后期也不会对这个课设进行维护,所以感觉也没有必要加

    六、课程设计收获本次课程设计,按照老师的要求,充分而又系统的统一了web应用开发的基础知识,加强了对基础知识的理解,也同时再次体会到了框架的设计思想以及为什么要出现框架,是因为如果只用这些来开发的时候,耗费在别的方面的精力就会太多,就比如mybatis,hibernate等持久层框架的出现,就封装了很多细节,让我们软件开发者可以使用极简的方式实现我们想要的功能,不用花费精力在注册数据库驱动,获取连接啊,释放资源等等的操作,spring的出现实现了控制反转,将对象的控制权权利转交给容器等。

    也体会到了软件设计的总的发展方向就是近一步的封装封装在封装,从原始的开发到ssm,ssh等框架的出现,再到springboot,微服务的兴起,无疑是:just run
    另一方面也加强了对前端技术即html5与css3的基础知识的了解与掌握,让自己更好以及更加熟练的了解了其实现的具体细节与过程
    进一步的提高了网上解决问题的能力与网上学习能力

    七、课程设计后的体会与建议通过这次的软件开发,我们巩固了本学期所学习的web开发知识,也大大提高了我们之间的默契与友好的关系,也体会到了从头到尾设计一个网站所带来的乐趣,进一步的熟悉了网站的整个的开发流程,更加深入的了解了web开发的BS架构,以及浏览器与服务器之间交互的细节等等,其它的体会基本与课程设计的收获相同。
    0 评论 1 下载 2021-09-16 18:07:46 下载需要11点积分
  • 基于JSP和MySQL实现的图书管理系统

    摘要本设计以图书管理业务为对象,系统实现用的前台开发工具是eclipse,后台数据库为MySQL。设计过程中的重点和难点是对整个系统的需求分析和数据库详细设计。
    该系统对数据进行保存、修改、删除等管理。为用户提供了一个友好、简单快捷的运行操作平台。该系统对数据进行保存、修改、删除等管理,为用户提供了一个友好、简单快捷的运行操作平台。本系统的各界面设计友好、流程正确、功能也较为完善,旨在为用户提供方便快捷的服务,使人们走近书籍,走进书籍,热爱读书。
    本次设计意在为图书管理行业提供一个简便、易操作、可靠的借还管理系统,实现图书借阅、书店人员的更新及管理。
    关键词:MySQL;图书管理系统;借书还书;排行榜;问题反馈
    1 前言随着社会经济的迅速发展和科学技术的全面进步以及计算机事业的飞速发展,以计算机科学与通信技术为基础的信息管理系统IE处于蓬勃发展的时期。随着经济文化水平的显著提高,人们对生活质量及工作环境的要求也越来越高,但伴随着人的劳动强度的增大,以及社交活动的广泛开展,如何来提高人民纸质书本阅读量,是一个很现实的问题。无疑,科技的蓬勃发展使更多人依赖电子书,逐渐失去了对阅读纸质书本重要性的理解。如今书籍的发展,也继承了信息化的发展道路,网络的兴起,给了人们各种各样不同的选择。与此同时,为了管理好一个书店的正常营运,管理问题也就提上了日程。随着图书借阅问题的白热化,管理难度也越来越大,如何优化书店的日常管理也就成为了一个大众化的课题。
    在计算机飞速发展的今天,将计算机这一信息处理利器应用于书店的日常管理已是势必所然,面且这也将为商店管理带来前所未有的改变,它可以带来意想不到的效益,同时也会为书店的飞速发展提供无限潜力。采用计算机管理信息系统已书店管理科学化和现代化的重要标志。要想在激烈的市场竞争中立于不败之地,没有现代化的管理是万万不行的。
    通过对书店管理日常工作的详细调查,搜集了大量的资料,从系统结构的组织,功能的实现,技术的要求以及可行性等多方面进行考虑,我认为本课题是一个适应现今书店信息管理需求的计算机信息管理系统,具有一定的实际开发价值和使用价值。
    2 概述2.1 系统主要功能
    读者:登录注册,借阅还书,查询书籍,查看当前借阅信息以及历史借阅信息,查看、查询读者借阅榜以及借阅书籍借阅榜,问题反馈以及查询反馈结果等功能
    管理员:对图书、图书分类、读者信息的增删改查,查看全部读者当前借阅信息以及借阅历史,查看、查询书籍借阅榜及读者借阅榜,查看、查询用户反馈信息并修改反馈状态(未解决或已解决)
    超级管理员:除管理员权限外,新增管理员权限。对管理员信息进行增删改功能。为书店员工定制个人账号,方便管理

    2.2 系统相关说明为图书管理行业提供一个简便、易操作、可靠的借还管理系统,实现图书借阅、书店人员的更新及管理。
    本设计以图书管理业务为对象,系统实现所用前台开发工具是eclipse,后台数据库为MySQL。设计过程中的重点及难点是对整个系统的需求分析和数据库详细设计。
    该系统对数据进行保存、修改、删除等管理,为用户提供了一个友好、简单快捷的运行操作平台。本系统的各界面设计友好、流程正确、功能也较为完善,旨在为用户提供方便快捷的服务,使人们走近书籍,走进书籍,热爱读书。
    3 运行环境3.1 系统的运行环境3.1.1 系统运行硬件环境
    CPU:PIV1.6G以上
    内存:256M以上
    硬盘:40G以上
    其他:光驱、3.5英寸软驱、鼠标

    3.1.2 系统运行软件环境
    操作系统配置:Windows 10
    开发软件:eclipse
    编译环境:JDK1.8
    服务器:Tomcat
    驱动:JDBC
    数据库:MySQL
    框架:bootstrap

    3.2 网络环境本系统需要运行在单位局域网,要求服务器、客户端计算机连接在此网络上。
    4 安装与配置4.1 安装
    eclipse的安装
    Tomcat服务器的安装
    MySQL数据库的安装

    4.2 配置
    Windows 10操作系统的配置
    JDK1.8环境的配置
    Tomcat服务器的配置
    JDBC驱动的配置
    MySQL数据库的配置

    5 操作说明该系统是基于eclipse的系统软件,在Tomcat服务器上运行主页面:http://localhost:8080/books/login.jsp(直接运行功能页面会报错)
    根据输入的学号/工号及密码进入不同的主页面,主页面附有本项目各页面的操作简介,方便用户进行操作。
    每个界面相应的功能再后续介绍中会一一指出,如有疑问或建议也可以进入反馈页面告知管理员,管理员会尽快联系您并解决问题。操作完毕后单机右上角的“退出”模糊框退出系统。
    5.1 进入登录界面输入账号(学号/工号)、密码及验证码进行登录,后台根据不同的账号密码识别到用户身份进入相应的主页面。尚未注册点击“注册即可快速注册”,也可以联系管理员添加账号。
    登陆界面

    注册页面

    登陆失败(密码、验证码错误)

    5.2 进入系统5.2.1 读者界面系统界面由图书查询、借阅信息、借阅历史、热门推荐、最佳读者、问题反馈构成。左上角“欢迎使用图书管理系统”字样在每一个功能页中都有,单击可以跳转到当前页面(主页面),右上角的模糊框(图5.5)内有以下三个功能:修改个人资料(图5.6),修改密码(图5.7),退出系统。
    读者界面

    模糊框

    修改个人资料

    修改密码

    5.2.2 管理员与超级管理员界面系统界面由图书管理、读者管理、图书分类管理、图书借阅信息、图书归还信息、管理员管理(需登录)(图5.9)、热门推荐、最佳读者、读者反馈构成。其中管理员管理功能为超级管理员管理权限(图5.10)。左上角“欢迎使用图书管理系统”字样在每一个功能页中都有,单击可以跳转到当前页面(主页面),右上角的模糊框内功能与读者页面功能相同。
    管理员界面

    超级管理员登录

    超级管理员权限

    5.3 图书查询列出馆内所有图书的信息,包括图书号、图书类型、图书名称、作者名称、出版社、总数量。可以根据书名、作者、图书分类查询图书(图5.12),点击借阅按钮弹窗确认借阅,完成借阅图书操作(图5.13)。
    图书查询功能页

    查询图书

    借阅图书弹窗

    5.4 借阅信息展示当前登录的读者正在借阅的图书信息。记录借阅日期与截至还书日期,延长期限需联系管理员,通过管理员权限进行延期操作。点击还书按钮弹窗确认还书,完成还书操作。
    借阅信息功能页

    确认还书弹窗

    5.5 借阅历史展示当前登录的读者历史借阅的图书信息。记录借阅日期与还书日期。
    借阅历史功能页

    5.6 热门推荐根据借阅次数由高到低实时排序,展示图书的所有信息,可以根据书名、作者、图书分类查询图书,点击借阅按钮弹窗确认借阅,完成借阅图书操作。

    5.7 最佳读者根据借阅量由高到低实时排序,展示读者的ID、姓名、账号,可以根据以上信息查询读者借阅量以及当前排名。

    5.8 问题反馈根据给出的提示信息填写反馈内容,提交后转到反馈结果页面(图5.20),3s后自动跳转到“我的反馈”(图5.21),查看当前登录账号的历史反馈记录以及反馈信息的状态(未解决或已解决)。也可以在反馈页面直接链接跳转到“我的反馈”进行查看。
    问题反馈功能页

    反馈结果页面

    我的反馈页面

    5.9 图书管理列出馆内所有图书的信息,包括图书号、图书类型、图书名称、作者名称、出版社、总数量。可以根据书名、作者、图书分类查询图书。添加图书弹出模糊框(图5.23)。点击修改按钮模糊框内修改图书信息(图5.24),点击删除按钮弹窗确认删除,完成删除图书操作(图5.25)。
    图书管理功能页

    添加图书模糊框

    修改图书信息模糊框

    删除图书弹窗

    5.10 图书管理列出记录的所有读者的信息,包括ID、账号、姓名、邮箱、手机号、可借阅天数、最大可借数。添加读者弹出模糊框(图5.27)。点击修改按钮模糊框内修改读者信息,点击删除按钮弹窗确认删除,完成删除读者操作。
    读者管理功能

    添加读者模糊框

    5.11 图书分类管理列出馆内所有图书分类信息,包括ID和图书分类名称。添加分类弹出模糊框(图5.29)。点击修改按钮模糊框内修改图书分类信息,点击删除按钮弹窗确认删除,完成删除图书分类操作。
    图书分类管理功能页

    添加分类模糊框

    5.12 图书借阅信息展示所有读者正在借阅的图书信息。记录图书、读者信息与借阅日期、截至还书日期,还书按钮帮助读者还书,点击还书按钮弹窗确认还书,完成还书操作。延期按钮修改截至还书日期(图5.31),一般以月为单位。
    图书借阅信息功能页

    延期模糊框

    5.13 图书归还信息展示所有读者已归还的图书信息。记录图书、读者信息与借阅日期、还书日期。

    5.14 管理员管理(需登录)图示已在5.2.2中给出,此选项仅供超级管理员使用,进入本页面需再次登录,且指定唯一账户密码(即为超级管理员账户密码),其中,添加管理员弹出模糊框(图5.33)。

    5.15 热门推荐根据借阅次数由高到低实时排序,展示图书的所有信息,可以根据书名、作者、图书分类查询图书。

    5.16 最佳读者根据借阅量由高到低实时排序,展示读者的ID、姓名、账号,可以根据以上信息查询读者借阅量以及当前排名。

    5.17 读者反馈列出记录的所有读者反馈信息,包括ID、读者ID、标题、问题页面、问题描述、联系电话及问题状态。可以根据读者ID、标题、问题页面、问题描述以及问题状态信息查询反馈信息。点击修改按钮模糊框内修改问题状态(图5.37),点击删除按钮弹窗确认删除,完成删除图书操作。
    图书借阅信息功能页

    修改问题状态模糊框

    6 数据库信息6.1 读者 admin表设置读者ID aid自10000起自动增长,账号 username非空(用于登录),借阅量 times默认为0,身份 status默认为1(读者),超级管理员添加管理员时将该项初始为2(管理员)。
    DROP TABLE IF EXISTS `admin`;CREATE TABLE `admin` ( `aid` int(0) NOT NULL AUTO_INCREMENT, `username` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `name` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `password` char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `email` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `phone` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `times` int(0) NULL DEFAULT 0, `status` int(0) NULL DEFAULT 1, `lend_num` int(0) NULL DEFAULT NULL, `max_num` int(0) NULL DEFAULT NULL, PRIMARY KEY (`aid`, `username`) USING BTREE, INDEX `username`(`username`) USING BTREE, INDEX `name`(`name`) USING BTREE, INDEX `status`(`status`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 10006 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    6.2 图书 book表设置图书ID bid自2000001起自动增长,书名 name、书号 card、图书数量 num非空,借阅量 times默认为0。
    DROP TABLE IF EXISTS `book`;CREATE TABLE `book` ( `bid` int(0) NOT NULL AUTO_INCREMENT, `name` char(205) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `card` char(205) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `autho` char(205) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `num` int(0) NOT NULL, `press` char(205) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `type` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `times` int(0) NULL DEFAULT 0, PRIMARY KEY (`bid`) USING BTREE, INDEX `card`(`card`) USING BTREE, INDEX `name`(`name`) USING BTREE, INDEX `type`(`type`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 2000007 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    6.3 图书分类 booktype表设置图书分类ID tid自3001起自动增长,分类名 name非空。
    DROP TABLE IF EXISTS `booktype`;CREATE TABLE `booktype` ( `tid` int(0) NOT NULL AUTO_INCREMENT, `name` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`tid`) USING BTREE, INDEX `name`(`name`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 3005 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    6.4 历史记录 history表设置记录ID hid自400001起自动增长,记录状态 status已归还为0,未归还为1。
    DROP TABLE IF EXISTS `history`;CREATE TABLE `history` ( `hid` int(0) NOT NULL AUTO_INCREMENT, `aid` int(0) NULL DEFAULT NULL, `bid` int(0) NULL DEFAULT NULL, `card` int(0) NULL DEFAULT NULL, `bookname` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `adminname` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `username` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `begintime` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `endtime` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `status` int(0) NULL DEFAULT NULL, PRIMARY KEY (`hid`) USING BTREE, INDEX `status`(`status`) USING BTREE, INDEX `aid`(`aid`) USING BTREE, INDEX `bid`(`bid`) USING BTREE, INDEX `bookname`(`bookname`) USING BTREE, INDEX `adminname`(`adminname`) USING BTREE, INDEX `username`(`username`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 400010 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    6.5 反馈信息 problem表设置信息ID pid自5000001起自动增长,问题状态 status默认为“未解决”。
    DROP TABLE IF EXISTS `problem`;CREATE TABLE `problem` ( `pid` int(0) NOT NULL AUTO_INCREMENT, `aid` int(0) NULL DEFAULT NULL, `name` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `page` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `body` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `phone` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `status` char(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '未解决', PRIMARY KEY (`pid`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 5000002 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    7 类图7.1 用户管理
    7.2 系统信息
    7.3 操作及反馈信息
    总结经过一个学期对《Javaweb开发技术》的学习,我学习到了更多的理论知识,学习了HTML表单、CSS技术、JS前台校验技术、JavaScript方法调用、JSP的基本语法、JSP内置对象的使用、servlet方法、页面的跳转等技术。这些技术都为我的课程实践和进一步的学习打下了坚实的基础。
    15 评论 100 下载 2020-11-11 14:31:50 下载需要12点积分
  • 基于JAVA实现的幼儿园信息管理系统

    第一章 系统概述1.1 开发环境
    Eclipse_1.08
    jdk 1.8

    1.2 实验内容要求实现某个幼儿园日常工作:

    入园、入班、离班、离园登记,要求登记准确的时间、接送人等信息,并实时发送通知消息
    安全教育:可以定期发布安全教育小贴士,记录儿童在园期的表现等
    健康:在入园死要登记体检情况:如体温、是否咳嗽等
    消息通知,可以将需要通知家长的信息通过短信,邮件发送
    用到的数据保存到文件或者数据库中

    1.3 实验要求
    学生学籍信息增删改除
    学生入园离园时间接送人信息
    短信邮件发送

    第二章 需求分析入园、入班、离班、离园要求登记准确的时间,这就需要设定的数域里包含calendar类型的这四个private的数据域,准确的登记时间可以用当前系统的时间。接送人:因为接送人不是固定的,考虑到实际情况接送人可以用一个链表实现,当学生入籍时,将这些可接送学生的接送人添加进去,然后再面板中做一个复选框,选择接送人。
    体检情况可另外设一个类,当学生入籍时填写这些内容,这些内容包括:性别、身高、体重、视力、听力、是否发烧、是否有心脏病等。
    在学生信息的中还包含家长的联系方式包括电话,邮件,以String的形式保存以便后续的使用。
    2.1 实验功能描述功能介绍如下所示:

    【学生信息】:此界面可以实现学生学籍的存档和删除等功能;存档时需存入的信息有:

    姓名、性别、身高、家长姓名,联系方式,家庭住址等体重健康状况(视力、听力、是否含有心脏病等)
    【登记信息】:登记每天幼儿接送情况,需记录准确的时间、接送人等信息,通过短信和邮件等方式实时通知学生监护人,教师需认真记录学生在校的表现也通过短信和邮件的方式实时通知家长
    【邮件短信通知】:选择点击学生列表或直接输入号码,可以对已选学生发送邮件和短信通知

    2.2 系统流程图
    第三章 分工合作3.1 系统模块化
    储存模块
    邮件短信发送模块
    读写模块

    第四章 功能展示4.1 类设计概要4.1.1 储存类设计ROLL类
    Name(学生姓名)stringoutschooltime(毕业时间)calendarInschooltime(入籍时间calendareMail(家长的邮件)stringPhonenumber(家长的电话)string方法包括个数据的set和get方法
    Medicialcondition类
    Bloodtype(血型)stringEyesight(视力)doubleHearring(听力)doubleHeight(身高)doubleWeight(体重)doubleIsfever(发烧症状)booleanHeartcondition(心脏病)boolean
    Registinformation类
    Expression(日常表现)stringInclasstime(进入学校登记时间)calendarOutclasstime(出学校登记时间)calendarPickupperson(接送人)string
    4.1.2 程序设计(关键代码)private ArrayList<dayInformation> dairyRecord = new ArrayList();
    因为学生的日常出离学校等情况需要保存和实时查看所以,我们需要对这些记录进行保存,在这里常见一个列表,方便及时添加。
    public Roll(){ this.Name=null; this.inSchoolTime=null; this.outSchoolTime=null; this.condition=null; this.eMail=null; this.phoneNumber=null; NUMBER++;}
    构造函数在创建时学生数量要+1,方便以后的添加和查询等功能的实现。
    public Date getDate() { return date;}public void setDate(Date date) { this.date = date;}
    这两个函数用来设置和返回时间,以便在登记学生日常信息是使用。
    public static void addRecord(Roll r,Date date,String inClassTime, String outClassTime, String expression, String pickUpPerson){ r.getDairyRecord().add(new dayInformation(date,inClassTime, outClassTime, expression, pickUpPerson));}
    用于日常信息的修改,增加一条记录。
    4.1.3 邮件发送类设计MyAuthenticator类

    MailSenderInfo类

    SimpleMailSender类

    Sender类(邮件)

    Sender类(短信)

    4.1.4 邮件发送类通过网上查找资料得知,JAVA邮件发送的大致过程是这样的:

    构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法。此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利
    构建一个properties文件,该文件中存放SMTP服务器地址等参数
    通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件
    构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等
    使用javax.mail.Transport工具类发送邮件

    具体实现中,我决定:

    新建一个类名为MyAuthenticator的类,该类继承于Authenticator。并且重写其中的getPasswordAuthentication()方法
    新建一个类名为MailSenderInfo的类,设置邮件发送者、接收者地址以及SMTP服务器地址等属性,这些都是private的,故还要写相关的set()和get()方法
    新建一个类名为SimpleMailSender的类,该类主要有一个sendTextMail()方法,发送邮件成功返回true,否则返回false
    新建一个类名为Sender的类,该类中的sendmail()静态方法作为可被面板调用的发送邮件功能的接口。

    4.1.5 短信发送类成功完成邮件模块后,我接着进行短信模块的开发。通过上网查资料得知,JAVA发送手机短信有几种方法:

    使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册
    使用短信mao的方式进行短信的发送,这种方式应该是比较的常用,前提是需要购买硬件设备
    使用中国网建提供的SMS短信平台。

    通过比较分析,我决定用第三种方式,即尝试通过中国网建提供的SMS短信平台来实现短信功能。
    通过深入的了解,我发现这个短信平台基于java提供专门的接口,其原理是:给用户发送短信主要是通过移动提供给的接口,而我们程序主要是将短信信息(手机号码、短信内容)发给这个接口,之后就是移动的事情了(根据信息发给相应的用户)。
    具体实现中,我决定:
    新建一个类名为Sender的类,其中包含中国网建给的用户名Uid、密码Key(新注册用户可免费发送5条短信和3条彩信)、接口地址、转码方式、以及发送内容和收件人号码。


    4.2 界面设计概要根据需求:学生学籍信息增删改除,学生入园离园时间接送人信息,短信邮件发送。
    设计一个主界面,三个分界面。主界面包含菜单和功能,分别来实现所需的功能。
    4.3 界面功能介绍根据需求将界面分为一个主界面,三个分界面。主界面中包含一个菜单,菜单中有导入文件,保存另存为,安全小贴士定期发送,帮助的子选项。
    分界面有学生界面,登记界面,邮件发送界面,分别实现各自功能。

    学生界面:输入学生姓名并按下添加按钮能够添加一个学生,再右侧面板中可以编辑其信息并保存
    登记界面:左侧选择学生,可以添加每日接送信息并保存,点击历史记录可以查看以往保存的记录
    邮件发送界面:通过点击左侧学生列表看多选并发送短信与邮件。由于短信发送功能由第三方平台提供,短信数量有限





    4 评论 154 下载 2018-11-06 15:37:17 下载需要12点积分
  • 基于PHP与MYSQL的公共课平时成绩查询系统

    摘 要众所周知,现代信息技术是现代教育技术的基础和核心,培养和创新型的人才必须依靠现代教育技术。从这一层意义上讲,我们说掌握一定的计算机应用技能已经成为国家未来的合格建设者的必备素质,所以现在在大学中对非计算机系的学生开设了计算机文化基础课,并且通过这门课的学习使同学们能顺利的通过计算机等级考试。由于学习这门课的人很多,平时查看成绩就非常的麻烦。本系统就是为了方便老师和同学查看平时成绩而编写的,它具有快速、准确、方便的特点。本系统是学校WEB站点的一个子系统,具有很好的外部接口,能够很好的配合站点的其它子系统服务于学校的成绩管理。
    关键字:LAMP;查询;平时成绩
    AbstractIt is well known that the modern information technology is foundation and the core of the modern educational technique, trained and the innovation talented person must depend on the modern educational technique.Says from this significance,it is extremely important to grasps the certain computer skill.so each school has all opened the compute culture basic class.with the help of the study the computer cultue basic class,all students can through computer rank test smoothly.Because there is so many students study this class,the result of usually search are very trouble.This system is compiles for teacher and the schoolmate,with the help of this system,searche the result of text is very easy.The characteristic of this system is fast accurate and convenient.This system is a school WEB stand sub- system, has the very good exterior connection, coordinate stand other subsystems serve the school result management.Key words:LAMP; Query; Usual result
    第一章 引言伴随着网络的出现,网页逐渐融入人们的生活。快速及时的新闻浏览,五彩缤纷的网上信息,使网络与人们的生活息息相关,于是世界上又出现了第三媒体——Internet。它打破了地域限制,真正使信息得以共享,改变了人们的工作和生活方式。制作网页是企业和个人的宣传自己的重要手段,同时也是学习者获取学习信息的重要手段。尤其是在教育领域,在素质教育与终身教育成为必然的今天,人们对信息的需求有了更新,更高的要求,而网页由于本身所具有的信息量大,传递快速,没有时空限制等特点恰好满足这种要求。所以网页也逐渐成为一种新兴的教育资源。也正是由于网络实现网站的数据信息能够进行实时交互,保证网站数据的实时性。
    随着Internet的进一步发展,静态Web站点的开发与维护变得越来越困难,一方面信息的不断增加和变化,使站点维护人员不得不经常修改他们的网页,特别是基于数据库驱动的Web站点更是如此,随着Internet上信息量的增多和交互性的加强使HTML显得越来越难以胜任。另一方面静态网页由于不能与浏览者进行有效交互,使人们感到越来越乏味,而不愿意再一次地进入同一站点。所以开发动态网页或动态内容成了越来越多的站点所追求目标。所谓动态内容是由每一个用户按照自己的需求发出请求而特殊制作的Web网页。
    网络发展前景无限,及早与网络结合,与信息时代同步,与高科技汇合,定会给社会各行各业的发展注入新鲜的活力。站在网络时代的前夜,我们清晰地听到了网络时代的宣言:谁掌握了网络,谁就掌握了未来。
    1.1 PHP简介:PHP是能让你生成动态网页的工具之一。PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP。
    PHP代表:超文本预处理器(PHP: HypertextPreprocessor)。PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.net)自由下载。PHP遵守GNU公共许可(GPL),在这一许可下诞生了许多流行的软件诸如Linux和Emacs。你可以不受限制的获得源码,甚至可以从中加进你自己需要的特色。PHP在大多数Unix平台,GUN/Linux和微软Windows平台上均可以运行。怎样在Windows环境的PC机器或Unix机器上安装PHP的资料可以在PHP官方站点上找到。安装过程很简单。
    1.2 PHP的先进之处应用PHP有许多好处。当然已知的不利之处在于PHP由于是开放源码项目,没有什么商业支持,并且由此而带来的执行速度缓慢(直到PHP4之前)。但是PHP的邮件列表很是有用而且除非你正在运行像Yahoo!或者Amazon.com这样的极受欢迎的站点,你不会感觉出PHP的速度与其他的有什么不同。最起码我就没有感觉出来!好了,让我们来看看PHP有那些优点:
    学习过程
    PHP的学习过程非常简单。与Java和Perl不同,你不必把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到了什么麻烦,还可以再去翻阅相关文档。
    PHP的语法与C,Perl,ASP或者JSP。对于那些对上述之一的语言较熟悉的人来说,PHP太简单了。相反的,如果你对PHP了解较多,那么你对于其他几种语言的学习都很简单了。
    你只需要30分钟就可以将PHP的核心语言特点全部掌握,你可能已经非常了解HTML,甚至你已经知道怎样用编辑设计软件或者手工来制作好看的WEB站点。由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。
    数据库连接
    PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的组合。你还可以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。
    可扩展性
    就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
    面向对象编程**
    PHP提供了类和对象。基于web的编程工作非常需要面向对象编程能力。PHP支持构造器、提取类等。
    可伸缩性
    传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
    更多特点
    PHP的开发者们为了更适合web编程,开发了许多外围的流行基库,这些库包含了更易用的层。你可以利用PHP连接包括Oracle,MS-Access,Mysql在内的大部分数据库。你可以在苍蝇上画图,编写程序下载或者显示e-mail。你甚至可以完成网络相关的功能。最好的是,你可以选择你的PHP安装版本需要哪些功能。引用Nissan的Xterra的话来说就是PHP可以做到你想让它做到的一切而且无所不能!
    1.3 MySQL数据库简介MySQL数据库可以称得上是目前运行速度最快的SQL语言数据库。除了具有许多其它数据库所不具备的功能和选择之外,MySQL数据库是一种完全免费的产品,用户可以直接从网上下载数据库,用于个人或商业用途,而不必支付任何费用.
    体来说,MySQL数据库具有以下主要特点:

    同时访问数据库的用户数量不受限制
    可以保存超过50,000,000条记录
    是目前市场上现有产品中运行速度最快的数据库系统
    用户权限设置简单、有效

    如今,包括Siemens和Silicon Graphics这样的国际知名公司也开始把MySQL作为其数据库管理系统,这就更加证明了MySQL数据库的优越性能和广阔的市场发展前景。
    1.4 PHP连接MySQL数据库 $dbh =mysql_connect(\' \',\'您的用户名\',\'您的密码\'); (如果用域名无法联结,可以用LOCALHOST) mysql_select_db(\'数据库名\'); query =\"insert into requests(date, request, email, priority,status) values (NOW(),\'description\',\'email\', \'priority\', \'NEW\')\"; res =mysql_query(query, $dbh); $query =\"select max(id) from requests\"; res =mysql_query(query, $dbh); $err =mysql_error(); if($err){ echo \ } row =mysql_fetch_row(res); echo \"未来您使用的号码为: \".$row[0]; ?>
    1.4 Apache简介Apache是根据NCSA的服务器发展而来的,NCSA是最早出现的Web服务器程序之一,由伊利诺斯大学Urbana-Champaign分校的美国国家超级计算应用中心开发。在发展初期,Apache主要是一个基于UNIX系统的服务器,它的宗旨就是建成一个基于UNIX系统的、功能更强、效率更高并且速度更快的WWW服务器,这就决定了它是从其他的服务器演变而来的,并且添加了大量补丁来增强它在某一方面的性能,所以它就被命名为“APAtCHy Server(一个补丁组成的服务器)”。**
    1.5 Linux简介简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
    第二章 需求分析需求分析大致可分为三步来完成,即需求信息的收集、分析整理和评审通过。
    2.1 需求信息的收集公共课平时成绩查询系统要涉及到平时成绩的信息、老师和学生的基本信息和租借过程中的具体操作。
    平时成绩的基本信息:平时成绩的组成(考勤成绩和网上作业成绩)、详细信息(出勤次数、缺勤次数、网上作业提交情况、作业成绩情况)
    老师和学生的基本信息:教师编号、所教专业、年级、学号、专业等。
    基本操作信息:查询
    2.2 分析整理2.2.1调查的目的首先,要了解平时成绩查询工作的工作流程。其次,要确定设计的目标,大致管理流程和任务范围划分。
    因此,平时成绩查询系统主要是通过对现在实际教学中成绩查询工作的调查、研究,并且通过和老师同学的交流来完善的。
    2.2.2调查的内容了解公共课平时成绩查询系统的作用、现状、存在的问题,及是否适应计算机管理。
    2.2.3 调查方式通过对老师和同学的访问、交谈可获得成绩查询的需求,以及成绩查询的管理目标。并且,还可通过具体的查询工作对查询有一个更深的了解。
    2.3评审通过2.3.1 任务概述目标将老师和同学共同操作的成绩查询工作转为老师和同学跟计算机系统共同完成操作,提高成绩查询效率,节省查询时间,降低人的工作强度。
    2.3.2 数据描述数据库描述
    数据库作为公共课平时成绩查询系统的基础之一,主要是完成对平时成绩数据的存储,并且通过计算机来快速的查询成绩,辅助教师和学生快速准确的完成成绩的查询工作。
    数据采集
    基础数据从网站的另外两个系统(考勤系统和网上作业系统)取得。
    2.3.3 功能需求公共课平时成绩查询系统主要实现对公共课平时成绩的查询功能,教师能察看所教专业的全体学生的成绩,一般学生能查看自己的平时成绩。并通过扩展功能是教师和同学都可以查看平时成绩的详细情况。例如考勤的详细情况和网上作业的详细情况。
    2.3.4 运行要求正常使用时不应出错,若运行时遇到不可恢复的系统错误,也必须保证数据完好无损,对数据的精确度、时间特性、适应性等都有一定要求,要求系统运行时能够保证正确性、可靠性、高效性、完整性、易使用性、可维护性、可测试性、复用性、安全保密性、可移植性、互联性。
    第三章 总体设计在确定了软件需求和进行可行性研究之后,就进入了开发阶段。系统的主要功能与性能指标有了明确的标准,下面详细介绍总体设计的内容。
    3.1 系统组成本系统的主要功能是实现查询功能,所以主要模块就一个,查询模块。下面是系统的模块图:教师查询

    学生查询

    查询模块的主要功能:实现教师和学生对公共课平时成绩的查询,并且实现查看平时成绩的详细情况。例如考勤情况、网上作业情况。
    3.2 系统数据库的设计系统数据库名称:成绩管理数据库
    此系统所需要的数据库表有2个,所有表的结构列举如下:
    学生考勤信息表



    字段名
    中文含意
    类型




    num
    学号
    Char(10)


    name
    姓名
    Varchar(20)


    pro
    专业代码
    Varchar(20)


    Pre_times
    出勤次数
    Varchar(2)


    Absent_times
    缺勤次数
    Varchar(2)


    scores
    分数
    Int


    主键
    学号



    教师发布作业成绩表



    字段名
    中文含意
    类型




    chengjiID
    成绩编号
    Char(20)


    teachID
    教师姓名
    Varchar(20)


    xuehao
    学号
    Char(10)


    proID
    专业代码
    Varchar(20)


    filetitle
    作业标题
    Varchar(100)


    fenshu
    网上作业分数
    Int(2)


    useID
    用户编号
    Char(10)


    主键
    成绩编号



    提交作业表



    字段名称
    中文含意
    数据类型




    xinxiID
    作业编号
    Smllint(5)


    xuehao
    学号
    Char(10)


    name
    姓名
    Varchar(20)


    nianji
    年级
    Varchar(20)


    proID
    专业代码
    Varchar(20)


    tijiaodate
    提交作业时间
    date


    zuoyeAddr
    作业地址
    Varchar(30)


    piyue
    批阅
    Varchar(100)


    filetitle
    作业标题
    Varchar(100)


    主键
    作业编号



    上传作业表



    字段名
    中文含意
    数据类型




    UseID
    用户编号
    Char(10)


    Filetitle
    作业标题
    Varchar(100)


    Filetyle
    作业类型
    varchar(10)


    Fabuduixiang
    发布对象
    varchar(20)


    fabudate
    发布日期
    date


    jiezhiDate
    作业截止日期
    date


    faburen
    发布人
    Char(10)


    beizhu
    备注
    vatchar(100)


    主键
    作业标题



    以上各表之间的关系如下:

    第四章 详细设计本系统的主要功能是实现公共课平时成绩的查询功能,它又分为教师对所教专业全体学生的查询和每个学生对自己个人平时成绩的查询。查询的结果除了要求能看到平时成绩总的分数外,还要求可以查看每个学生平时成绩的详细情况。因为每个人的平时成绩是由考勤成绩和网上作业成绩组成的,所以在详细情况中需要考勤情况和网上作业情况。
    4.1 教师查询
    本系统是计算机希网站中的一个子系统,所以它是和别的系统有联系的。比如用户登陆系统。当教师登陆后,点击成绩查询就会进入教师查询界面,如下:

    每个教师所教的所有专业会在下拉列表中出现,教师在下拉列表中选择想要查询的专业后,再点击查询按钮后就可以查看出全体学生的平时成绩。
    请选择专业:</p> <form name="form1" method="post" action="teacher_chaxun_answer.php"> <select name="select" size="1"> <option value="计算机系">计算机系</option> <option value="数学系">数学系</option> <option value="电子系">电子系</option> </select> <input type="submit" name="Submit" value="查询"> </form> <p> 
    在form中输入action=”teacher_chaxun_answer.php”实现查询按钮的功能。teacher_chaxun_answer.php是全体学生平时成绩页面的名称。这样在下拉列表中选择所要查询的专业后,然后点击查询按钮后就能进人全体学生平时成绩的界面。下面介绍全体学生的平时成绩界面:

    在全体学生平时成绩界面调用调用SQL语句从数据库中取出要显示的数据放入数据集,然后绑定数据集,这时我们就可以从数据集中取出我们想要的自断了。
    有时我们并不会将所有的数据都记录在同一个数据表中,而会依每种数据内容的特性,将它分别记录在不同的数据表中。但是有时我们在分析某些数据时,却必须同时使用到这两个不同的数据表来处理,有什么办法可以将它们结合在一起呢?在SQL语法中若是要结合一个以上的数据表,必须在这些数据表中拥有一个相同的字段,即可以使用这个字段的纪录将不同的数据表关联起来,语法如下:
    SELECT<数据表名称.字段>,<数据表名称.字段>,…….FROM<数据表名称1>INNER JOIN<数据表名称2 >ON<数据表名称1.字段名称>=<数据表名称2.字段>
    进入这个页面要显示学生的学号、姓名、专业、网上作业分数、考勤分数和总分。这些字段从两张表中取得,一个是考勤信息表,另一个是教师发布作业表。这两个表都有学号这个字段,所以通过学号字段将两个表连接起来,连接情况如下:

    所使用的MySQL语句如下:
    SELECT teacher_fbchengji.suozaiXi, teacher_fbchengji.xuehao, teacher_fbchengji.fenshu, statistic.name, statistic.scores FROM teacher_fbchengji, statistic WHERE teacher_fbchengji.suozaiXi = '%s' AND teacher_fbchengji.xuehao = statistic.num ORDER BY teacher_fbchengji.xuehao ASC"
    以目前的设定若是预览,只会读出数据库中的第一笔数据。如果要显示数据库中的所有数据,我加入了以下代码:
    <?php do { ?> <tr> <td height="30"><a href="teacher_chaxun_detail.php?recordID=<?php echo $row_Recordset1['xuehao']; ?>"><?php echo $row_Recordset1['xuehao']; ?></a></td> <td><?php echo $row_Recordset1['suozaiXi']; ?>   </a> </td> <td><?php echo $row_Recordset1['name']; ?></td> <td><?php echo $row_Recordset1['fenshu']; ?>  </td> <td><?php echo $row_Recordset1['scores']; ?></td> <td><?php echo $row_Recordset1['fenshu']+$row_Recordset1['scores']; ?>  </td> </tr> <?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
    mysql_fetch_assoc函数的功能是从结果集中取得一行作为关联数组。
    要看每个学生成绩的详细情况,我设计的是点击每个学生的学号进入详细界面,然后可以看到学生成绩的详细情况。实现这个功能的代码如下:
    recordID=<?php echo $row_Recordset1['xuehao'];
    点击学生的学号可以查看每个学生成绩的详细情况。详细界面如下:

    进入这个页面要显示学生的学号、姓名、专业、出勤次数、缺勤次数、作业明、作业分数。这些字段都不在一个表中,得从两个表中获得,这两个表的连接如下:

    所使用的SQL语句如下:
    SELECT * FROM statistic, teacher_fbchengji WHERE num = '%s' AND teacher_fbchengji.xuehao = '%s
    <td><?php echo $row_Recordset2['num']; ?></td> <td><?php echo $row_Recordset2['name']; ?></td> <td><?php echo $row_Recordset2['pro']; ?></td> <td><?php echo $row_Recordset2['pre_times']; ?></td> <td><?php echo $row_Recordset2['absen_times']; ?></td> <td><?php echo $row_Recordset2['scores']; ?></td> <td><?php echo $row_Recordset2['teacherName']; ?></td> <td><?php echo $row_Recordset2['fileTitle']; ?></td> <td><?php echo $row_Recordset2['fenshu']; ?></td>
    在这个界面调用SQL语句从数据库中取出要显示的数据放入数据集,然后绑定数据集,在HTML中加入以上代码,在表格中加入要显示的字段。
    4.2 学生查询
    当学生用自己的用户名和密码登陆后,点击成绩查询,就会进入成绩查询界面。

    在HTML中加入以上语句实现实现查询并跳转到平时成绩界面。

    在这个页面的表格中需要显示学生的学号、姓名、考勤分数、网上作业分数和平时总分数。
    与教师的全体学生成绩页面一样,只不过学生的页只显示自己的一个人的记录就可以了,所以不用设置重复选区。其他的和教师的一样,也需要将两个表连接起来,然后从两个表中获取所要的数据。

    所使用的SQL语句如下:
    SELECT teacher_fbchengji.suozaiXi, teacher_fbchengji.xuehao, teacher_fbchengji.fenshu, statistic.name, statistic.scores FROM teacher_fbchengji, statistic WHERE teacher_fbchengji.suozaiXi = '%s' AND teacher_fbchengji.xuehao = statistic.num ORDER BY teacher_fbchengji.xuehao ASC"
    然后点击学号进入详细界面:

    加入下面的代码使所有字段都显示出来。
    <td><?php echo $row_Recordset2['num']; ?></td> <td><?php echo $row_Recordset2['name']; ?></td> <td><?php echo $row_Recordset2['pro']; ?></td> <td><?php echo $row_Recordset2['pre_times']; ?></td> <td><?php echo $row_Recordset2['absen_times']; ?></td> <td><?php echo $row_Recordset2['scores']; ?></td> <td><?php echo $row_Recordset2['fileTitle']; ?></td> <td> </td> <td><?php echo $row_Recordset2['fenshu']; ?></td>
    第五章 测试报告软件测试在开发过程中是一个不可缺少的部分,因为在开发软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺。因此,在软件生命周期的各个阶段都不可避免地产生差错;但是,经验表明审查并不能发现所有差错,此外在编码过程中还不可避免地会引入新的错误。如果在软件投入生产性运行之前,没有发现并纠正软件中的大部分差错,则这些差错迟早会在生产过程中暴露出来,那时不仅改正这些错误的代价更高,而且往往会造成很恶劣的后果.测试的目的就是在软件投入生产运行之前,尽可能多地发现并纠正软件中的错误。基于上述的原因,我在编码过程中进行了模块测试,编码结束后又进行了系统测试和验收测试。下面一一讲述测试方案测试过程以及测试结果:

    测试方案:采用了白盒测试(又称结构测试),即按照程序内部的逻辑结构,检验程序中的每条通路是否都能按预定要求正常工作
    测试过程:主要检验各个模块之间的接口.每个被调用模块是否正确接收参数.每个调用模块是否能调用每个自己想要调用的模块
    测试结果:测试结果表明,每个模块之间的接口都吻和.既被调用模块都能正确接收参数,调用模块能调用自己想要调用的每个模块

    系统测试和验收

    测试方案:采用了黑盒测试(又称功能测试),即检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息的完整性
    测试过程:主要检验是否能正确实现每个功能.每个功能是否能按照规格说明书的要求正常使用。数据库的记录是否符合要求
    2 评论 55 下载 2018-12-22 13:46:34 下载需要15点积分
  • 基于Springboot和Vue实现的图书管理系统

    1.项目简介1.1 前言由于课设需要做这个,于是就抽了点闲余时间,写了下,基本全部都涉及到,包括书籍信息的更新,查看所有的书籍。这篇我讲一下我的思路以及中间遇到的问题和解决办法。
    1.2 需求分析MIS最重要的就是需求分析,只有分析清晰了,才能动手编程,所谓编程,不过是把一种思路用代码实现而已,这里就图书管理系统来说,这个系统至少要完成如下内容:

    图书信息的增加与删除
    图书信息的更新
    全部书籍的查看

    我说的以上只是最基础的东西,如果能实现的更多当然更全面,就看自己对这个图书管理系统功能的理解了。
    1.3 数据库表的建立当需求分析完成之后,我们要考虑的就是这些信息如何存储在表里,需要几张表,每张表存储什么信息,字段名是什么,什么类型;在这里,我认为只用一张表,用来存储书籍的有关信息。

    搭建数据库
    DROP TABLE IF EXISTS `book`;/*!40101 SET @saved_cs_client = @@character_set_client */; SET character_set_client = utf8mb4 ;CREATE TABLE `book` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `author` varchar(20) DEFAULT NULL, `publish` varchar(20) DEFAULT NULL, `pages` int(10) DEFAULT NULL, `price` float(10,2) DEFAULT NULL, `bookcaseid` int(10) DEFAULT NULL, `abled` int(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_ieh6qsxp6q7oydadktc9oc8t2` (`bookcaseid`), CONSTRAINT `FK_ieh6qsxp6q7oydadktc9oc8t2` FOREIGN KEY (`bookcaseid`) REFERENCES `bookcase` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `book`--LOCK TABLES `book` WRITE;/*!40000 ALTER TABLE `book` DISABLE KEYS */;INSERT INTO `book` VALUES (1,'解忧杂货店','东野圭吾','电子工业出版社',102,27.30,9,1),(2,'追风筝的人','卡勒德·胡赛尼','中信出版社',330,26.00,1,1),(3,'人间失格','太宰治','作家出版社',150,17.30,1,1),(4,'这就是二十四节气','高春香','电子工业出版社',220,59.00,3,1),(5,'白夜行','东野圭吾','南海出版公司',300,27.30,4,1),(6,'摆渡人','克莱儿·麦克福尔','百花洲文艺出版社',225,22.80,1,1),(7,'暖暖心绘本','米拦弗特毕','湖南少儿出版社',168,131.60,5,1),(8,'天才在左疯子在右','高铭','北京联合出版公司',330,27.50,6,1),(9,'我们仨','杨绛','生活.读书.新知三联书店',89,17.20,7,1),(10,'活着','余华','作家出版社',100,100.00,6,1),(11,'水浒传','施耐庵','三联出版社',300,50.00,1,1),(12,'三国演义','罗贯中','三联出版社',300,50.00,2,1),(13,'红楼梦','曹雪芹','三联出版社',300,50.00,5,1),(14,'西游记','吴承恩','三联出版社',300,60.00,3,1);/*!40000 ALTER TABLE `book` ENABLE KEYS */;UNLOCK TABLES;
    1.4 前后端分离前后端分离就是将⼀个应⽤的前端代码和后端代码分开写,为什么要这样做?如果不使⽤前后端分离的⽅式,会有哪些问题?
    传统的 Java Web 开发中,前端使⽤ JSP 开发,JSP 不是由后端开发者来独⽴完成的。
    前端 —> HTML 静态⻚⾯ —> 后端 —> JSP
    这种开发⽅式效率极低,可以使⽤前后端分离的⽅式进⾏开发,就可以完美地解决这⼀问题

    前端只需要独⽴编写客户端代码,后端也只需要独⽴编写服务端代码提供数据接⼝即可
    前端通过 Ajax 请求来访问后端的数据接⼝,将 Model 展示到 View 中即可

    前后端开发者只需要提前约定好接⼝⽂档(URL、参数、数据类型…),然后分别独⽴开发即可,前端 可以造假数据进⾏测试,完全不需要依赖于后端,最后完成前后端集成即可,真正实现了前后端应⽤的 解耦合,极⼤地提升了开发效率。
    单体 —> 前端应⽤ + 后端应⽤

    前端应⽤:负责数据展示和⽤户交互
    后端应⽤:负责提供数据处理接⼝

    前端 HTML —> Ajax —> RESTful 后端数据接⼝
    传统的单体应⽤

    前后端分离的结构

    前后端分离就是将⼀个单体应⽤拆分成两个独⽴的应⽤,前端应⽤和后端应⽤以 JSON 格式进⾏数据交互。
    1.5 实现技术使⽤ Spring Boot 进⾏后端应⽤开发,使⽤ Vue 进⾏前端应⽤开发。
    Vue + Element UI,Vue 集成 Element UI,Element UI 后台管理系统主要的标签

    el-container:构建整个⻚⾯框架
    el-aside:构建左侧菜单
    el-menu:左侧菜单内容,常⽤属性

    :default-openeds:默认展开的菜单,通过菜单的 index 值来关联:default-active:默认选中的菜单,通过菜单的 index 值来关联
    el-submenu:可展开的菜单,常⽤属性

    index:菜单的下标,⽂本类型,不能是数值类型template:对应 el-submenu 的菜单名
    i:设置菜单图标,通过 class 属性实则

    el-icon-messae el-icon-menu el-icon-setting
    el-menu-item:菜单的⼦节点,不可再展开,常⽤属性

    index:菜单的下标,⽂本类型,不能是数值类型

    Element UI 表单数据校验
    定义 rules 对象,在 rules 对象中设置表单各个选项的校验规则。
    rules: { name: [ { required: true, message: 'error', trigger: 'blur' }, { min: 3, max: 5, message: '⻓度在 3 到 5 个字符', trigger: 'blur' } ]}

    required: true, 是否为必填项
    message: ‘error’, 提示信息
    trigger: ‘blur’,触发事件

    2.项目开发2.1 业务代码@RestController@RequestMapping("/book")@CrossOriginpublic class BookHandler { @Autowired private BookRepository bookRepository; @GetMapping("/findAll/{page}/{size}") public Page<Book> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size){ Pageable pageable= PageRequest.of(page-1,size); return bookRepository.findAll(pageable); } @PostMapping("/save") public String save(@RequestBody Book book){ Book result = bookRepository.save(book); if(result != null){ return "success"; }else{ return "error"; } } @GetMapping("/findById/{id}") public Book findById(@PathVariable("id") Integer id){ return bookRepository.findById(id).get(); //返回的是optional,book上又包了一层,所以get才能取出来 } @PutMapping("/update") public String update(@RequestBody Book book){ Book result = bookRepository.save(book); if(result != null){ return "success"; }else{ return "error"; } } @DeleteMapping("/deleteById/{id}") public void deleteById(@PathVariable("id") Integer id){ bookRepository.deleteById(id); }}
    2.2 前端视图层<template> <el-form style="width: 60%" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="编号" > <el-input v-model="ruleForm.id" readonly></el-input> </el-form-item> <el-form-item label="图书名称" prop="name"> <el-input v-model="ruleForm.name"></el-input> </el-form-item> <el-form-item label="作者" prop="author"> <el-input v-model="ruleForm.author"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">修改</el-button> <el-button @click="resetForm('ruleForm')">重置</el-button> </el-form-item> </el-form></template><script> export default { data() { return { ruleForm: { id:'', name: '', author: '', }, rules: { name: [ { required: true, message: '图书名不能为空哦', trigger: 'blur' }, ], author: [ { required: true, message: '作者不能为空哦', trigger: 'blur' }, ] } }; }, methods: { submitForm(formName) { const _this=this; this.$refs[formName].validate((valid) => { if (valid) { axios.put('http://localhost:8181/book/update',this.ruleForm).then((res=>{ if(res.data=="success"){ _this.$alert('《'+_this.ruleForm.name+'》修改成功', '恭喜你',{ confirmButtonText: '确定', callback: action => { _this.$router.push('/BookManager'); } }); } })); } else { return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); }, }, created() { /*要拿参数的时候写route 跳转的时候写router*/ const _this=this; axios.get('http://localhost:8181/book/findById/' + this.$route.query.id).then((res) => { _this.ruleForm=res.data; }); } }</script>
    3.项目展示主页

    修改页面

    添加图书

    删除图书

    4.总结其实因为我们做的只是一个比较简单的,课设级别的MIS,所以我就没有做的更细致一点,其实完全可以再产生几个表,用来根据学生ID来找相对应需要的信息,但这里就不再赘述,有兴趣的自己尝试一下。
    0 评论 1 下载 2021-09-16 16:24:19 下载需要11点积分
  • 基于Spring+SpringMVC+hibernate+MySQL实现的体检中心管理系统

    摘 要随着人们生活水平的不断提高,人们的保健意识随之增强,体检已普遍成为人们保健的重要部分。特殊职业的体检、各种职业病的体检、单位职工的群体体检及个人体检使得医院体检人数急剧增加。然而传统的体检工作效率远远不能满足当下剧增的体检业务。所以,医院急需满足健康体检需要的信息管理系统来提高体检工作效率。
    本系统包括体检项目管理、预约体检管理、体检套餐管理和体检管理四个部分,可以用户登录注册、预约体检、添加体检项目、设置体检套餐、查看用户信息、查看体检记录等功能。但由于时间有限,系统部分功能不够完善,还有待于进一步修改和完善使之功能更强大,操作更简捷,以便更好的应用于实际中去。
    本次课程设计的主要任务是基于B/S模式,即Browser/Server(浏览器 /服务器 )结构。在这种结构下,用户界面完全通过浏览器实现。B/S结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。利用当前,JavaWeb开发技术繁多,但为开发团队选择一款优秀的框架非常重要,一个好的框架决定了开发团队的软件开发周期、开发成本、维护成本甚至于软件的生命周期。在选择一个可行的方案时,一般要从稳定成熟性、可扩展性及灵活等多方面综合考虑。本文将以一个商品出库模块为例,详细介绍由Spring、SpringMVC、hibernate几种技术构成的软件架构的搭建技术要点和以此为平台的功能模块实现过。Spring+SpringMVC+hibernate不同于之前流行的Spring+struts2+hibernate技术架构,该架构是将后者最重要的前端控制部分struts2替换成用SpringMVC,同时将Spring和hibernate多种开源技术有机结合在一起,从而构建出一个健壮可靠、高效成熟的JavaWeb应用程序技术架构。结合MySQL后台数据库开发“体检中心管理系统”,可应用于各大中小型医院。
    一、开发背景随着计算机性能不断提高,价格不断下降,计算机已在医院医疗、教学、科研、管理等方面等到越来越广泛的应用。计算机化的医院信息系统(HIS)已成为现代化医院运营过程中必不可少的基础设施与技术支撑环境。就好像一个现代化医院的成功运行离不开功能完整、美观舒适的建筑物、及时娴熟的医护人员、性能齐全、高精尖的医疗设备一样,它也离不开计算机化的医院信息系统。国际上医院信息化系统大致可以分为三个阶段:第一个十年,集中在开发医院行政管理的功能上,像住院病人和问诊病人管理等。但在1972 年Collen仍报告美国迄今为止连一个成功的已完成的全面医院管理计算机系统都没有。第二个十年,在继续完成和实现医院管理信息的计算机化同时,开发者的努力已进入医疗信息的处理领域,像病人医疗处理系统,实验室系统等。到1985年,美国全国医院数据处理工作调查表明,100张床位以上的医院80%实现了计算机财务收费管理、70%的医院可支持病人挂号登记和行政事务管理,25%的医院有了较完整的HIS。最后一个十年至今,研究者又把重点放在了病人床位系统、医学影像处理、统一的医学语言处理等方面。医院信息系统正在经历着小型化、智能化和集成化的改造过程。

    为了给病人提供更好、更快的服务,提高医院在医疗服务市场上的竞争力,以吸引更多病人到本院就诊
    人力工资的昂贵,迫使医院采用计算机以提高劳动效率
    国家和保险公司为施行预付款制度,而需求医院及时上交复杂的有关 DRGS 的报告,迫使医院采用计算机技术。我国医院信息系统的研究工作,从八十年代初期算起,至今也有二十多年的历史,其中经历了单机单任务的阶段,多机多任务的阶段以及微机网络一体化的阶段,应该承认这期间我们有很大进步。医院对信息的需求永远是 HIS 发展的原动力,刺激我国医院广泛采用计算机信息系统的因素主要有:

    医院要强化自身的管理,逐步实现医疗价格与按成本收费,实现医院内按成本核算与全面财务计划,并体现在建立和优化医院内合理的分配制度上,为此每个医院都迫切需要建立自己的以财务管理为中心的医院管理信息系统医院要加强医疗服务质量的自我监督、自我控制的能力,为病人提供更快更好的服务,必然要依赖与计算机信息系统医疗制度的改革正在把病人—医院的二元关系变为病人—医院—保险机构—政府监督的多元关系。大量的有病人的诊断、治疗、用药、资源消耗的信息不仅在医院内而且在许多部门之间流通、传递每个医院的信息系统是全国或地区性医疗信息网络的基础,医疗信息网络即所谓“金卫”工程,是我国国民经济信息化的重要组成部分建立以计算机化病人病历 CPR为核心 HIS 会成为已初步建立医院管理信息系统的那些医院的下一个努力目标

    二、需求分析2.1 用户基本需求描述
    体检套餐设置:组合基本体检项目成一个体检套餐,并设置套餐使用年龄段、使用人群、套餐价格、有效期和注意事项等数据
    体检预约功能:客户在提交个人信息进行注册之后,可以预约体检套餐,包括套餐类型、预约时间、套餐预约状态等
    体检记录管理:体检中心的工作人员会对客户实际进行的体检做相关记录,包括体检时间、体检选择的套餐、满意程度等
    查询功能:客户可以查询各类体检套餐包含的具体体检项目和价格,可以查询自己的预约信息和历史体检记录;体检中心的工作人员可以查询客户预约记录以及现行的客户体检记录

    2.2 数据流图分析体检中心管理系统-顶层图

    体检中心管理系统-0层图

    2.3 数据字典
    数据流名称:预约体检

    别名:无简述:用户预约体检是填写的项目来源:用户去向:输入到预约记录组成:编号+套餐编号+用户编号+预约时间
    数据流名称: 体检记录

    别名:无简述:用户体检后,用户向系统查询体检记录来源:体检记录去向:用户组成:编号+项目编号+用户编号+体检时间
    数据流名称: 客户预约信息

    别名:无简述:客户预约成功后,查询到该用户的预约记录来源:预约记录去向:体检中心工作人员组成:编号+套餐编号+用户编号+预约时间
    数据流名称: 体检相关记录

    别名:无简述:用户体检后,工作人员向系统录入改用户已体检来源:体检中心工作人员去向:体检记录组成:编号+项目编号+用户编号+体检时间
    数据流名称: 体检项目

    别名:无简述: 信息管理员录入体检项目来源: 信息管理员去向: 体检套餐组成: 项目编号+项目名称+合适年龄+项目详情
    数据存储名称:预约记录

    别名:无简述:记录用户预约体检成功后的相关信息组成:编号+套餐编号+用户编号+预约时间组织方式:索引文件,以火纹编号为关键字查询要求:要求能立即查询
    数据存储名称:体检记录

    别名:无简述:记录用户体检完成后的相关信息组成:编号+项目编号+用户编号+体检时间组织方式:索引文件,以火纹编号为关键字查询要求:要求能立即查询
    数据存储名称:体检套餐

    别名:无简述:由若干体检项目组合成的体检项目集合组成:套餐编号+套餐名称+合适年龄+合适性别+指标意义组织方式:索引文件,以火纹编号为关键字查询要求:要求能立即查询
    加工名:处理预约体检

    编号:1激发条件:接受到合格的预约体检信息时优先级:普通输入:合格预约体检信息输出:记录到预约信息
    加工名:查询体检记录

    编号:2优先级:普通输入:从体检记录存储中查询体检记录信息输出:体检记录信息

    三、详细设计3.1 概念模型设计
    3.2 关系模型设计
    用户(ID,姓名,性别,手机号,等级,密码,年龄,身份证号)
    预约记录(ID,套餐ID,用户ID,预约时间 ,处理状态)
    体检记录(ID,项目ID,用户ID,体检时间)
    套餐(ID,套餐名称,合适年龄,合适性别,指标意义)
    关联表(ID,项目编号,套餐编号)
    体检项(ID,项目名称,合适年龄,项目详情)

    3.3 物理模型设计体检中心管理系统-用户物理模型

    体检中心管理系统-项目与套餐物理模型

    体检中心管理系统-体检、预约记录物理模型

    四、系统功能模块说明4.1 用户注册模块
    功能描述:此模块的主要功能是实现用户注册。系统的用户必须在注册获得合法身份之后才能登录系统进行对应的操作
    输入:手机号、密码
    输出:系统合法用户

    4.2 用户登录模块
    功能描述:此模块的主要功能是实现用户登录。系统的用户在注册之后,登录系统进行对应的操作
    输入:手机号、密码
    输出:登录成功

    4.3 修改用户信息模块
    功能描述:此模块的主要功能是实现用户信息的修改。系统用户在登录成功后,可修改自己的个人信息
    输入:姓名、性别、手机号、身份证号
    输出:修改成功

    4.4 在线预约体检模块
    功能描述:此模块的主要功能是实现用户预约体检。系统用户在登录成功后,可进行预约体检
    输入:套餐类型、预约体检时间
    输出:预约成功

    4.5 查看预约记录模块
    功能描述:此模块的主要个功能是实现用户查看预约记录。系统用户在登录成功后,可查看自己的历史预约体检记录,默认是所有历史记录,可查询具体某一条记录
    输入:无
    输出:历史预约体检记录

    4.6 用户信息管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后进行查看、修改用户信息、禁用用户
    输入:姓名、性别、登录名、电话
    输出:修改成功

    4.7 用户角色权限管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后给系统用户进行角色分配和权限的管理
    4.8 登录日志模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录,查看所有用户登录的信息日志
    输入:无
    输出:用户登录日志信息

    4.9 体检项目管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行体检项目的增加与删除
    输入:项目名称、项目描述
    输出:添加体检项目成功

    4.10 体检套餐管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行体检套餐的生成
    输入:套餐名称、合适年龄、合适性别、指标意义
    输出:创建套餐成功

    4.11 查询预约记录模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行查询用户预约记录
    输入:无
    输出:用户预约记录信息

    4.12 体检记录管理模块
    功能描述:此模块的主要功能是系统管理员与体检中心工作人员登录后,进行查询用户体检记录
    输入:无
    输出:用户体检记录信息

    五、系统实现服务端项目结构图

    客户端项目结构图

    5.1 主界面
    主页,未登录用户可进行注册、登录、查看体检套餐操作,注册登录用户可进行体检在线预约、修改个人信息、查看体检套餐、查看预约记录操作。
    5.2 注册模块
    进入主页面,点击注册按钮,进入注册页面。输入合法的手机号、密码,点击注册按钮,注册完成。
    5.3 登录
    进入主页面, 点击登录按钮,输入存在的用户名和密码,点击登录。若密码错误,则弹出密码错误框,若密码正确,进入主页面。若用户未注册,可点击注册按钮,进入注册页面,进行注册。
    5.4 修改个人信息
    进入主页面, 用户注册登录后,可点击用户下拉框,选择修改信息按钮,进入修改信息页面。用户可修改合法的姓名、性别、手机号、身份证信息,点击确定按钮进行修改。
    5.5 在线预约
    进入主页面,用户点击在线预约下拉框,选择在线预约按钮,进入在线预约页面。用户选择套餐类型,体检时间点击确定按钮,进行在线预约。
    5.6 预约记录
    进入主页面,用户点击在线预约下拉框,选择预约记录按钮,进入预约记录页面。用户可查找并查看用户的历史体检预约记录。
    5.7 后台管理登录
    进入体检中心管理系统登录页面,系统管理员与体检中心工作人员输入合法的用户名和密码,点击登录按钮。
    5.8 用户信息
    进入体检中心管理系统,系统管理员与体检中心工作人员可查看、修改、禁用用户信息,可以进行登录名,姓名的模糊查询。
    5.9 角色分配与权限管理

    进入体检中心管理系统,系统管理员可进行用户的角色分配与权限管理。角色:工作人员、普通用户、系统管理员,默认为普通用户。权限管理,设置用户对每项功能的权限。可以进行登录名,姓名的模糊查询。
    5.10 登录日志
    进入体检中心管理系统,系统管理员与体检中心工作人员可查看所有用户的登录日志。日志包括用户名称、用户性别、联系电话、登录地址、登录时间。
    5.11 体检项目管理
    进入体检中心管理系统,系统管理员与体检中心工作人员可对体检项目进行添加、删除、批量删除操作,可以进行模糊查询。添加项目完善信息即可。
    5.12 体检套餐管理
    进入体检中心管理系统,系统管理员与体检中心工作人员可对体检套餐进行添加删除、修改、上传套餐图片操作,可以进行体检套餐名称、合适性别的模糊查询。点击编辑套餐,可添加已有的体检项目。
    5.13 预约记录
    进入体检中心管理系统,系统管理员与体检中心工作人员可查看预约记录、生成体检记录。可以进行体检套餐名称、用户名的模糊查询。
    5.14 体检记录
    进入体检中心管理系统,系统管理员与体检中心工作人员可对普通用户预约记录进行生成体检记录信息。可以进行体检套餐名称、用户名的模糊查询。
    总 结课程设计是我们小组的在本学期生涯中的最后一个环节,这不仅是对学习基础知识和专业知识的一种综合应用,更是对我们所学知识的一种检测与丰富,它是一次综合的再学习、再提高的过程,这一过程对我们的学习能力、独立思考及工作能力也是一个培养。
    参考文献[1] 明日科技.Java从入门到精通.第五版[M].清华大学出版社.2018
    [2] 罗如为. Java Web开发技术与项目实战[M].水利水电出版社.2018
    [3] 汪云飞.JavaEE开发的颠覆者[M].电子工业出版社.2016
    [4] 孙卫琴.Tomcat与Java Web开发技术详解[M].电子工业出版社.2009
    [5] 葛萌,黄素萍,欧阳宏基. 基于Spring MVC框架的Java Web应用
    [6] 孙卫琴 精通hibernate[M]电子工业出版社 2005年4月 100-120
    [7] 林信良 spring2.0技术手册[M]电子工业出版社 2006年6月 50-100
    [8] 傅鹏,殷旻昊.基于Springmvc+spring+hibernate+ajax技术的科研管理系统设计
    [9] 耿祥义编著.jsp基础编程[M].清华大学出版社,2004.55-162
    [10] 姜承尧.高性能网站MySQL数据库实践[M].维普中文科技期刊数据库.2013
    [11] 杨占胜.JSP WEB应用程序开发教程[M].电子工业出版社.2018
    [12] 王宜贵 软件工程[M] 北京:机械工业出版社,2002:20-79
    [13] 萨师煊,王珊.数据库系统概论(第三版)[M].北京:高等教育出版社,1998.
    4 评论 74 下载 2020-08-05 10:47:44 下载需要15点积分
  • 基于Jsp和MySQL的机票管理系统的设计

    1.项目简介近年来,我国发展迅速,对交通工具的需求量大幅度增加。飞机作为出行工具之一,花费时间短、用户体验度好,价格实惠、安全性高等优点自然成为人们的首选,这也导致等待时间长、购票效率低等一系列问题的出现,给用户和航空公司造成严重困扰。面对这些问题,在线机票预订系统显得格外重要。
    本系统使用Eclipse开发工具,使用Redis、MySQL数据库,采用MVC三层架构的方式,结合当前最流行的SSM框架以及支付宝沙箱支付环境来实现各个功能。系统分为用户端和管理员端。用户端实现了用户注册与登录、用户评论、机票查询,机票预订,订单查询、广告展示等功能。管理员端包括航班信息管理模块、订单信息管理模块、用户信息管理模块、留言评论管理模块、广告信息管理模块、个人信息管理模块等六大模块,具有开放体系结构的、易扩充的、易维护的、友好人机界面的优点。
    经过充分的测试,测试数据均正确无误,各个模块运行良好。机票预订系统的推出,为乘客出行提供方便,便于机场工作人员对机票信息进行管理,提高了机场工作人员对机票管理的工作效率。
    2.系统相关技术概述2.1 Java webJava Web是用Java技术来解决相关web互联网领域的技术总和。随着Web互联网技术的出现和推广,基于Java技术的Java Web技术应运而生,并为解决互联网相关问题提出解决方案。我们知道,Web是由服务器和客户端两方面组成。基于Java语言的Web框架有很多种,用以适用不同的技术需求,但是都遵循最基本的原则和技术路线,即采用了MVC的架构设计思想,并通过Servlet或者Filter进行请求拦截,同时使用约定,XML或Annotation来实现必备的相关配置,充分利用其面向对象的特质,实现前台用户请求和后台程序响应的工作流程。
    2.2 三大框架SSMSSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。
    Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。
    Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常简单规范。Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
    MyBatis本是apache的一个开源项目IBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。IBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的Pojo(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
    2.3 前端框架AngularJSAngularJS是一个开发动态Web应用的框架。它让你可以使用HTML作为模板语言并且可以通过扩展的HTML语法来使应用组件更加清晰和简洁。它的创新之处在于,通过数据绑定和依赖注入减少了大量代码,而这些都在浏览器端通过JavaScript实现。
    2.4 数据库MySQLMySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言—结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
    2.5 数据库RedisRedis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set —有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。另外,Redis为了保证效率,数据都是缓存在内存中,它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
    2.6 开发工具EclipseEclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
    3.需求分析3.1 系统实现目标如今,互联网遍布于生活的每个角落,不断改变着人们的生产生活,基于Web的机票预订系统就是借助互联网发展的热潮,方便大众,服务大众。具体实现以下两个目标:

    方便用户购票:用户可以访问前台系统浏览、查询航班信息,足不出户,预订机票,免去了以往寻找购票网点,排队购票的麻烦
    航空公司实现办公自动化:后台系统能使航空公司办事效率大幅度提高,它将所有的工作流程按照一系列流程进行规范化,从而减少工作时间,提高了人员的办事效率

    3.2 系统功能分析
    后台航班信息管理:主要是指添加航班信息,删除航班信息,查询航班信息和航班信息详细情况查看等
    后台订单信息管理:后台订单信息管理主要包括订单列表,查询订单信息,订单信息的删除等
    后台用户信息管理:主要指注册用户的展示与按条件查询注册用户
    后台留言评论管理:主要指展示用户的留言信息和按留言日期、留言用户查找留言信息等
    后台广告信息管理:主要指添加广告信息,删除广告信息,设置广告的有效性等
    后台个人信息管理:主要指查看个人信息,修改个人信息
    前台登录与注册管理:包括前台系统用户的注册与登录
    前台首页信息展示:主要是指航班信息展示、航班信息查询、航班信息详情、登录用户信息展示、留言板和个人信息详情与修改等
    前台订单页面:主要是订单内容的填写和订单详情。前台订单支付:是指使用支付宝沙箱环境支付订单

    3.3 系统用列图「系统前台功能用列图」

    「系统后台功能用列图」

    4.系统总体设计4.1 软件架构设计此项目使用经典的三层架构模式,分别是表现层,业务逻辑层和数据持久层。如下图所示。


    表现层:表现层也称为表示层,位于最外层(最上层),离用户最近。表现层用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面
    业务逻辑层:业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层
    数据持久层」:数据持久层也称为是数据访问层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。简单的说法就是实现对数据表的select、insert、update以及delete的操作

    4.2 总体功能模块设计本系统主要分为前台子系统和后台子系统,两个子系统包含的具体功能如下:

    前台功能

    用户登录用户注册航班查询机票详情机票预订订单支付订单查看用户留言个人信息查看与修改
    后台功能

    航班信息管理订单信息管理用户信息管理留言评论管理广告管理个人信息管理

    前台子系统和后台子系统详细功能如下图所示。

    4.2.1 前台系统功能设计用户登录功能,详细功能说明如表4.1所示

    用户注册功能,详细功能说明如表4.2所示

    航班查询功能,详细功能说明如表4.3所示

    机票详情功能,详细功能说明如表4.4所示

    机票预订功能,详细功能说明如表4.5所示

    订单支付功能,详细功能说明如表4.6所示

    订单查看功能,详细功能说明如表4.7所示

    用户留言功能,详细功能说明如表4.8所示

    个人信息查看与修改功能,详细功能说明如表4.9所示

    4.2.2 后台系统功能设计航班信息管理模块功能,详细功能说明如表4.10所示

    订单信息管理模块功能,详细功能说明如表4.11所示

    用户信息管理模块功能,详细功能说明如表4.12所示

    留言评论管理模块功能,详细功能说明如表4.13所示

    广告管理模块功能,详细功能说明如表4.14所示

    个人信息管理模块功能,详细功能说明如表4.15所示

    4.3 数据库设计4.3.1 数据库结构设计通过建立该系统各个模块的E-R图,使整个模块之间的功能变得更加清晰,模块间所具有的耦合性变的越低。管理员实体(Admin),留言评论实体(Discuss),航班实体(Flight),订单(Order)实体,普通用户实体(User)和广告信息实体(content)E-R图分别如下图所示。
    管理员实体(Admin)E-R图

    留言评论实体(Discuss)E-R图

    航班实体(Flight)E-R图

    订单实体(Order)E-R图

    普通用户实体(User)E-R图

    广告信息实体(Content)E-R图

    4.3.2 数据库表设计为实现数据库的设计,对数据进行分表处理,每一个表格代表不同的信息和功能,分别如下图所示。
    管理员信息表(admin),用于存放管理员信息,表结构如表4.16所示

    留言评论信息表(discuss),用于存放留言评论信息,表结构如表4.17所示

    航班信息表(flight),用于存放航班信息,表结构如表4.18所示

    订单信息表(order),用于存放订单信息,表结构如表4.19所示

    普通用户信息表(user),用于存放用户信息,表结构如表4.20所示

    5.系统详细设计及实现5.1 添加航班信息系统管理员登录后台系统后,点击侧边栏的航班信息管理按钮会出现下拉列表菜单,继续点击添加航班信息按钮可以进行添加航班信息操作。
    添加航班时输入航班号、起点、终点、始发机场、到达机场等信息,如下图所示。

    添加航班信息的过程:后台系统管理员进入添加航班信息页面后,填写航班号、起点、终点、始发机场、到达机场等相关信息后点击保存按钮,这是会随机生成flightId并与数据库中已经存在的flightId进行比较,保证航班Id唯一,之后继续判断输入的机票价格,航班座位数等数据是否有效,核对信息的有效性和完整性,最后存入数据库,具体流程如下图所示。

    主要代码
    @RequestMapping("addFlight") public Result addFlight(@RequestBody Flight flight ) { //设置日期格式 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); // new Date()为获取当前系统时间 flight.setFlightId("F"+df.format(new Date())); try { flightManageService.addFlight(flight); return new Result(true,"添加成功"); } catch (Exception e) { e.printStackTrace(); return new Result(false,"添加失败"); }}
    5.2 航班信息列表系统管理员登录系统后有查看航班列表的权限,航班列表界面有添加航班,删除航班,搜索航班信息,航班信息详情,航班信息修改等功能,具体见下图,各个功能详细说明如表5.1所示。


    主要代码这里以航班查询功能service层代码为例
    public PageResult search(int pageNum, int pageSize, String searchEntity) { PageHelper.startPage(pageNum,pageSize); List<Flight> flightsList=flightManageMapper.select(searchEntity); Page<Flight> page=(Page<Flight>) flightsList; return new PageResult(page.getTotal(), page.getResult()); }
    5.3 订单信息列表订单信息列表是订单信息管理模块的一个子功能,展示的是前台所有用户的机票订单信息,如下图所示。
    系统管理员可以对订单进行查询,删除操作,各个功能详细说明如表5.2所示。


    主要代码这里以订单删除功能dao层的mapper代码为例
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.cafuc.mapper.IOrderManageMapper"> <delete id="delete" parameterType="String"> delete from `order` where order_id in <foreach collection="selectIds" item="ids" open="(" close=")" separator=","> #{ids} </foreach> </delete></mapper>
    5.4 用户信息列表用户信息列表是用户信息管理模块的子功能,它是指把前台系统所有注册用户信息以列表的形式展示给后台系统管理员,方便系统管理员精确定位到每一个机票预订系统的使用者,对其进行管理,用户信息列表的界面如下图所示。
    系统管理员有查找系统使用用户和删除违反平台规定用户的权利,各个功能详细说明如表5.3所示。


    主要代码以用户搜索功能dao层的mapper代码为例
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.cafuc.mapper.IUserManageMapper"> <select id="select" resultType="com.cafuc.pojo.User"> select DISTINCT * from `user` as u where u.user_name like concat('%',#{searchEntity},'%') </select></mapper>
    5.5添加广告信息广告作为网站的必要元素,在机票系统的前台页面也有广告展示的功能,后台增加了相应的管理模块,界面如下图所示。

    添加航班信息的过程如下:后台系统管理员进入添加航班信息页面后,填写航班号、起点、终点、始发机场、到达机场等相关信息后点击保存按钮,这是会随机生成flightId并与数据库中已经存在的flightId进行比较,保证航班Id唯一,之后继续判断输入的机票价格,航班座位数等数据是否有效,核对信息的有效性和完整性,最后存入数据库,具体流程如下图所示。

    主要代码以后台系统controller层ContentManageController.java类例
    @RequestMapping("addContent") public void addContent(@RequestParam("file") MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws IOException { String describe=""; String url=""; String picture=""; if(request.getParameter("describe")!=null) { describe=request.getParameter("describe"); } if(request.getParameter("url")!=null) { url=request.getParameter("url"); } // 判断文件是否为空,空则返回失败页面 if (!file.isEmpty()) { try { // 获取文件存储路径(绝对路径) String path = request.getServletContext().getRealPath("/WEB-INF/file"); // 获取原文件名 String fileName = file.getOriginalFilename(); // 创建文件实例 File filePath = new File(path, fileName); // 如果文件目录不存在,创建目录 if (!filePath.getParentFile().exists()) { filePath.getParentFile().mkdirs(); System.out.println("创建目录" + filePath); } picture=filePath+""; // 写入文件 file.transferTo(filePath); Content content=new Content(); //设置日期格式 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); // new Date()为获取当前系统时间 content.setContentId("C"+df.format(new Date())); content.setDescribe(describe); content.setPicture(picture); content.setUrl(url); contentManageServiceImpl.addContent(content); response.sendRedirect(request.getContextPath()+"/admin/list_content.html"); } catch (Exception e) { e.printStackTrace(); response.sendRedirect(request.getContextPath()+"/admin/add_content.html"); } } else { response.sendRedirect(request.getContextPath()+"/admin/add_content.html"); } }
    5.6 用户登录用户在进行机票预定,留言评论等功能时需要登录前台系统后才能进行,在浏览器地址栏输入 http://localhost:8081/flyTicket-portal-web/default/login.html 回车进入如下图所示界面。

    用户进行到登录界面,输入正确的用户名和密码就可以登录到前台系统,登录顺序图如下图所示。

    主要代码以controller层代码为例
    app.controller('portalLoginManageController',function($scope,$controller,portalLoginManageService){ $controller('baseController',{$scope:$scope}); //初始化 $scope.userEntity={userName:null,userPwd:null}; $scope.login=function(){ if($scope.userEntity.userName==null || $scope.userEntity.userName.trim()==""){ alert("用户名为空"); } else{ if($scope.userEntity.userPwd==null || $scope.userEntity.userPwd.trim()==""){ alert("密码为空"); } else{ portalLoginManageService.login($scope.userEntity).success(function(res){ if(res.result==false){ alert(res.message) } else{ window.location.href="index.html#?key="+$scope.userEntity.userName; } }); } }; }});
    5.7 航班信息展示在浏览器地址栏输入 http://localhost:8081/flyTicket-portal-web/default/index.html 出现如下图所示界面,首页面展示所有航班信息。每一条信息包含出发城市、到达城市、出发机场、到达机场,出发时间、到达时间、机票价格等信息。

    5.8 航班信息查询用户可以通过航班查询功能精确查找到所需信息,节省时间简化操作。通过输入航班类型、出发时间、出发城市、到达城市等搜索条件实现航班查询。如下图以成都为到达城市为例,搜索结果如下图所示。

    代码以dao层PortalManageMapper.xml为例
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.cafuc.mapper.IPortalManageMapper"> <select id="select" resultType="com.cafuc.pojo.Flight"> select * from flight as f <where> <if test="flightStartTime1 !=null and flightStartTime1 !=''"> and f.flight_start_time like concat('%',#{flightStartTime1},'%') </if> <if test="flightStartPlace !=null and flightStartPlace !=''"> and f.flight_start_place like concat('%',#{flightStartPlace},'%') </if> <if test="flightEndPlace !=null and flightEndPlace !=''"> and f.flight_end_place like concat('%',#{flightEndPlace},'%') </if> </where> </select></mapper>
    5.9 留言板点击前台系统右上角“留言板”按钮进入都留言页面如下图所示。
    留言评论是前台系统使用者完成注册后具有的功能,用户可以通过留言评论功能对所购班次机票进行全方位的评价,也可以对其在使用过程中遇到的问题进行反馈。

    主要代码以前台系统controller层DiscussManageController.java类例
    @RestController@RequestMapping("discussManage")public class DiscussManageController { @Resource private IDiscussManageService discussManageService; @RequestMapping("addDiscuss") public Result addDiscuss(@RequestBody Discuss discuss){ try { System.out.println(discuss); discussManageService.addDiscuss(discuss); return new Result(true, "评论成功"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return new Result(false, "评论失败"); } } @RequestMapping("init") public List<Discuss> init(){ return discussManageService.init(); }}
    5.10 订单支付机票预订系统的订单支付功能使用的是支付宝沙箱环境支付,蚂蚁沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。
    登录支付宝沙箱平台依次完成生成买家和卖家账号信息、生成RSA秘钥、设置公钥信息、设置应用网关等应用环境配置,完成配置后下载官方测试代码。
    本系统选择的是电脑应用java版本,将下载的项目导入到eclipse工作空间,设置核心配置文件信息,打开flyTicket-portal-web项目下com.alipay.config包中的AlipayConfig.java文件配置如下信息:
    //沙箱APPIDpublic static final String app_id = "**这里需要自己申请**";//沙箱私钥public static final String merchant_private_key = "**这里需要自己申请**";//支付宝公钥public static final String alipay_public_key = "**这里需要自己申请**";//沙箱网关地址public static final String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";//服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://localhost:8081/flyTicket-portal-web/pay/notify_url.jsp";//页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = "http://localhost:8081/flyTicket-portal-web/orderManage/complete";
    完成以上配置后就可以实现订单支付功能了,点击确认付款后跳转到如下图所示界面。

    点击付款按钮后如下图所示,可以登录账户付款,也可以使用手机端沙箱支付宝完成付款。

    完成付款后如下图所示

    主要代码如下
    //支付完成后@RequestMapping("complete")public void complete(HttpServletRequest request,HttpServletResponse response) throws IOException { System.out.println(request.getSession().getAttribute("order")); Order order=(Order)request.getSession().getAttribute("order"); try { //将数据插入到订单表中 orderManageService.insertOrder(order); //更改库存 Flight flight=orderManageService.findOneByFlightNumber(order.getFlightNumber()); if(order.getGrade().equals("f")) { flight.setFlightHighNumber(flight.getFlightHighNumber()-1); } else if(order.getGrade().equals("b")) { flight.setFlightMiddleNumber(flight.getFlightMiddleNumber()-1); } else { flight.setFlightBaseNumber(flight.getFlightBaseNumber()-1); } orderManageService.updatesNum(flight); } catch (Exception e) { e.printStackTrace(); } response.sendRedirect(request.getContextPath()+"/default/index.html"); }
    1 评论 2 下载 2021-08-31 14:41:09 下载需要12点积分
显示 0 到 15 ,共 15 条
eject