摘要
首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项目软件架构选择B/S模式,总体功能模块运用自顶向下的分层思想。再然后就是实现系统并进行代码编写实现功能。论文的最后章节总结一下自己完成本论文和开发本项目的心得和总结。通过手机密码管理app将会使在手机密码管理管理各个方面的工作效率带来实质性的提升。
关键字:B/S模式 、 手机密码管理app、 软件架构
Abstract
First of all, at the beginning of the paper is a clear discussion of the system of research content. Secondly, analyze the system requirements analysis to understand “what to do”. The analysis includes business analysis, business process analysis and use case analysis to further clarify the requirements of the system. Then on the basis of understanding the requirements of the system need to further design the system, mainly including software architecture pattern, overall functional modules, database design. The software architecture of this project chooses B/S mode, and the overall functional module adopts the top-down hierarchical idea. And then is to implement the system and code to achieve the function. The last chapter of the paper summarizes the experience and summary of completing this paper and developing this project. Through the mobile password management app will make the mobile password management in all aspects of the work efficiency to bring substantial improvement.
Keywords: B/S mode, mobile password management app, software architecture
目录
1绪论 4
1.1项目研究的背景 4
1.2开发意义 4
1.3项目研究内容与结构 4
2开发技术介绍 5
2.1B/S架构 5
2.2 Android平台 5
2.3 Java语言简介 5
2.4 MySQL 介绍 6
2.5 MySQL环境配置 8
2.6 SSM框架 8
3系统分析 9
3.1可行性分析 9
3.1.1技术可行性 9
3.1.2经济可行性 9
3.1.3操作可行性 9
3.2 app性能需求分析 10
3.3 app设计规则与运行环境 10
3.4 app功能分析 10
3.5 app流程的分析 11
3.5.1 用户管理的流程 12
3.5.2 个人中心管理流程 13
3.5.3 登录流程 13
4系统设计 14
4.1 软件功能模块设计 14
4.2 数据库设计 14
4.2.1 概念模型设计 14
4.2.2 物理模型设计 15
5系统详细设计 18
5.1 APP端 18
5.2管理员功能模块 20
6系统测试 23
7总结与心得体会 24
7.1 总结 24
7.2 心得体会 24
参考文献 25
致谢 26
1绪论
1.1项目研究的背景
随着大量的便捷网站和 APP 的应用,需要不断地注册账户。每个人在不同平台的账户密码也越来越多,加上现在不同平台的密码设置要求也越来越复杂,人类的记忆能力也有限,所以随着某些软件长时间不用,就会忘记一些账户信息,尤其是用户名和密码。但是记录在本子或电脑上的一些平台上,又是十分不安全而且容易丢失的。人们迫切地需要一个安全靠谱的手机APP来记录和管理这些账户密码,所以,有个能保证用户账户信息安全的移动应用来帮用户随时随地管理这些个人账户是非常必须的。
1.2国内外研究现状
1.国外现状及水平
目前在密码管理器的研究领域,国际上己经有不少较为成熟的软件正在被人们所使用,这些软件有的应用在PC端,有的应用在MAC端,也有应用在移动设备上的。在众多的密码管理器中以1Password、LassPass、Dashlane、KeePass为代表。
对数据加密时,以上四种密码管理器均使用AES对称加密算法。身份认证方式中1Password以及KeePass均使用主密码作为身份认证的唯一方式,而Dashlane则是以设备唯一码与主密码共同作用的双重身份认证。LassPass虽然也是以主密码为主的验证方式,但它还可以通过配合谷歌的身份验证器进行双重身份认证。在信息同步方面1Password和KeePass均只在客户端本地保存数据,用户可使用类似Dropbox等第三方网络文件同步工具进行数据的同步。而LassPass和Dashlane则强制将用户的每条网络账户信息保存到服务器端。
2.国内现状及水平
徐孝成设计了一种对密码加密存储的密码管理器。系统采用Android智能手机操作系统、JSP,HTML5、MySQL数据库和MVC模式等幵发技术,最大化的实现数据存储、业务逻辑和数据展现的分离,使系统结构更加清晰,易于维护和升级。系统从数据存储、数据传输、数据访问和事件审汁等多个方面进彳设计与实现以保证系统的安全。在Android客户端釆取Native和Web相结合的混合开发模式,在具有出色的用户体验的基础上,提高了代码重用件和系统的跨平台移植能力。该软件本质上属于B/S结构,未设置本地存储,如果用户未连接网络则不能在该密码管理器中存取信息。并且在登录阶段,该密码管理器只对用户名和密码进行验证,未考虑到用户主密码丢失的情况。
兰坤设计的密码管家也是基于安卓平台的—款应用软件,该密码管家实现了对密码的加密存储。但是该应用软件只是应用在安卓客户端本地的密码管理器,无法同步用户存储的各项数据。
屈晓等人设计的密码网上存储读取网站,是一款基于B/S模式的密码管理器。用户身份认证只进行简单的用户名和密码的验证,并且只能在连接互联网的情况下才能实现数据的存取。
罗立峰设计的密码存储系统,实现了密码的明文和密文两种保存方式,登录模块设计了无密码登录、使用二维码登录和主密码登录三种方式。但该密码存储系统,是一款移动终端本地应用,只将用户的密码数据保存在安卓本地数据库中。
才华、肖普山针对已有的密码管理器实现方案中存在的单个主密码认证、传输存储涉及密码内容本身等问题,设计了用户密码和网站密码的映射转换关系,并采用与1Password、LassPass等商用产品类似的 AES256 与PBKDF「哈希算法」加密技术对映射关系表进行加密,使得被加密存储对象由用户密码改进为映射关系表。 同时,通过综合用户自定义和系统辅助生成的方式制定网站密码等级、映射关系、密码规则,优化密码自定义安全等级和便捷性,提出了一种聚合密码管理器,保留了现有加密模式安全性的同时,整体提高了密码管理器的抗风险能力,极大便利了用户的使用体验。
张亚娟、韩银雪、刘效洋设计的基于AES加密算法的账号密码管理 APP,主要的优点包括两方面:一是对账户进行了分组管理功能,方便用户管理和查找账户信息; 另一方面是对分组进行加密设置,对账户信息进行双重保护,提高了用户信息的安全性,用户可以更加方便和放心地使用它对重要的账户信息进行管理。不足的是,这个项目采用本地存储的方式,虽然增加了账号密码的安全性,但是一旦用户的移动设备丢失,账户信息也将丢失。
吴迪将区块链首次应用于密码管理领域,利用区块链去中心化、不可篡改以及点对点通信等特点,很好地解决了传统密码管理方案中安全性差、不易于隐秘的分享等问题。同时,利用SVM算法对分类问题解决的高效性,设计并实现基于SVM算法对恶意请求识别的检测模块,提高了方案的安全性。通过SVM分类算法实现对恶意请求的分类,构建系统安全模块,避免了Web密码管理系统遭受XSS、CSRF攻击,为系统安全提供保障。编写模拟登陆功能,提升了用户使用密码的便利性。
张文静、周游、薛长举综合现有认证系统存在的一些问题,设计了基于移动终端的动态密码安全认证系统。 该系统将密码认证和密码管理相结合,并结合密码应用业务,实现数据信息全程加密保护,并采用一次一密以及数据多重加密等密码应用技术,实现用户按权限访问、按资源访问密码业务的管控目标,保证持有智能终端设备的用户在对相应业务进行访问时的安全性和保密性。
吴晗针对密码的管理困难问题设计一种基于安卓平台的密码管理器,其主要作用是加密存储用户的网络账户信息。设计密码管理器客户端中的各个模块。在客户端的身 份认证模块中提出一种新的身份认证方式,即主密码、手机IMEI码和蓝牙MAC地址共同作用的身份认证机制。客户端的信息存储模块,使用了对称加密算法和单分组哈希函数对用户的网络账户信息进行加密存储与解密读取。他提出的密码管理器, 用户界面简单易操作,能够安全、快速地存取用户的各类网络账户信息。身份认证准确且耗时较短。服务端与本地客户端以密文形式传输数据,安全可靠。
吴福维为解决数据中心操作系统用户密码管理的困境,提高系统的安全性、系统运维效率和服务水平,研发了一套开放平台服务器群用户密码自动化管理系统,实现
对服务器群操作系统用户密码的集中存储、自动修改、统一授权以及通过自动提取密码实现系统单点登录等功能,使企业运维管理技术人员无需再记忆大量密码,降低人力成本,提高系统运维安全性和工作效率。对企业级数据中心的服务器群操作系统密码自动化管理和使用给出了兼顾效率与安全的技术解决方案。
施勇面对本地管理的复杂性、在线管理的安全性及运行环境的高要求现状,采取本地管理与在线管理相结合的方式,描述开发轻量级的密码使用管理系统,从用户当前管理多口令的现状出发,使得大众用户方便在普通计算机或移动端中进行管理,提升大数据时代个人信息的综合安全防护能力,防范个人信息风险。他的研究团队开发的密码管理系统,可以为用户提供友好的管理界面,快捷的管理功能,方便、准确的记录用户名与密码,以及各种有效的信息。对于大众而言,账户密码口令管理更加安全、方便、快捷。该系统采用MD5twithRSA双重保险,保证用户主密码安全,使用AES轻量级且安全度高的加密算法,极大减轻了服务器负载。
吴应广针对密码设备使用管理需求,主要研究密码管理常用功能的实现,着重对管理系统网络处理模块进行深入探讨,并在系统中引入IOCP模型,设计高效的管理机制,实现对大量密码设备的在线监控、在线管理和密钥文件在线安装更换,解决密码终端大量使用时统一在线管理的问题,这对促进单位密码管理的严格化、信息化有着非常重要的意义。他利用IOCP技术建立了一套高性能可伸缩应用服务器模型。他从对IOCP使用的研究开始,研究了该模型的基本原理、实现机制和使用方法。然后根据现实网络连接需求建立了一套服务器模型,该服务器模型的核心是IOCP技术,其特点就是连接高效、性能稳定。最后,利用建立的IOCP高效服务器模型,分析当 前密码管理任务是需求,设计一个基于IOCP的密码管理系统模型,研发了一套高效 的、功能齐全的密码管理系统,实现密钥和密码设备在线管理。同时,通过多对线程 的使用、内存池的管理、防止恶意连接和高效传输方法的研究,更进一步提高了服务器的效率,较好地实现了密钥管理、设备管理、在线监控等功能。
1.3开发意义
随着互联网的高速发展,信息网站数量也随之快速增加。网站数量的增多一方面给网络用户带来了便利,网络用户可以足不出户的在网络上办理事务、随时随地获取资讯、即时与他人取得联系;另一方面纷繁复杂的网站也意味着网络用户需要在不同的网站上注册网络账户,导致用户需要同时管理无数个网络账户。而管理这样庞大的账户体系,给用户的数据管理能力提出了难以应对的挑战。针对数据管理困难的问题,一些网络用户选择将自己的各类网络账户信息记录在文档或者笔记本中这样的记录方式确实方便了用户,解决了记忆困难的问题,但保存时未对账户信息进行加密,具有安全隐患;还有一些网络用户选择在每个网站统一使用相同的账户名和密码,这样用户只需要记忆一个密码便可登录所有的网站。但因为各网站对用户密码的存储方式有着很大的差异,有的网站会加密存储,有的则以明文存储。而且各个网站的服务器安全系数也存在着很大的差异,若安全系数较低的网站数据库被攻破,那么攻击者便可以使用获取到的用户名和密码进行大量的撞库攻击,这必将导致大规模的个人信息泄露问题。本文提出的安卓平台的密码管理器属于密码工具技术类,将对现有问题进行部分改进,通过对用户所储存的账户密码进行加密,再以人脸识别方式确认使用者身份,只有使用者本可以看密码的原码的方法增强密码管理APP的安全性。
并且本文提出的密码管理器可同时支持本地存储和服务器同步两大功能,为用户的密码管理提供便利。
1.4项目研究内容与结构
课题研究的主要内容:
本课题将主要研究以下内容,
1)手机密码管理APP的系统架构。
2)对现行的密码算法的理解,并进行实现。
3)人脸识别算法的应用。
4)小型数据库的构建与管理
研究方法:
该APP将通过人脸识别的方式登录,利用RSA是非对称加密算法对账号、密码、文字等信息进行加密。因为RSA加密和解密采用的是不同的密钥(公钥和私钥),用户查询需要依照所选质数大范围随机生成的私钥解密,这样对账户就多了一重保护。加密后的信息通过网络数据库的形式进行储存,可实现多设备随时添加、查询的功能。此外,这款APP还具有拍照识别银行卡信息、语音输入文字、便于记忆的图像密码等AI功能。
准备采取的措施:
1.构建一个小型数据库来存放用户名与密码等信息,密码以加密的方式存储。
2.通过APP输入用户的各种用户名和密码。
3.通过人脸识别方式确认使用者身份,只有使用者本可以看密码的原码。
4.利用掌握的知识设计密码管理APP并实现制作。
开发技术介绍
2.1B/S架构
B/S结构是目前使用最多的结构模式,它可以使得系统的开发更加的简单,好操作,而且还可以对其进行维护。使用该结构时只需要在计算机中安装数据库,和一些很常用的浏览器就可以了。浏览器就会与数据库进行信息的连接,可以实现很多的功能,B/S结构是可以直接进行使用的,而且B/S结构在使用中极大的减少了工作的维护。基于B/S的软件,所有的数据库之间都是相互独立的,因此是非常安全的。因为基于B/S结构可以清楚的看到系统正在处理的业务,并且能够及时的让管理人员做出决策,这样就可以避免企业的损失。B/S结构的基本特点是集中式的管理模式,用户使用系统生成数据后,这些数据就可以存储到系统的数据库中,方便日后能够用到,这样就可以满足人们的所有的需求。
图2-1 B/S模式三层结构图
针对现在的购物商城,选择系统结构为B/S(Browser /Service ),即浏览器和服务器结构。是目前国内最为常见,而且对于用户而言是最方便的一个常用结构,对以往的客户机/服务器结构(Client/Service)进行更深一层的优化。用户为了使用浏览器进行操作,浏览各个网站,进行实现和使用浏览器获取的资料和信息。获取的主要信息和逻辑都在服务器端保存的数据,这些数据,当用户通过浏览器请求服务器时,服务器进行对请求的响应作答,返回一系列数据,因此在服务器端进行业务逻辑的处理,在客户端的浏览器主要处理很少的简单的逻辑。所谓的传统的C/S结构模式发展演变成如今在web上的三层模式。现如今此结构模式非常广泛的运用在各个互联网上,其对系统维护所产生的升级成本和人力时间更低,用户使用成本低,以目前的技术发展情况看,其技术相对来讲易于把握。
此网站系统开发主要运用了java语言,和最新流行的三大框架,比如Spring,SpringMVC,MyBatis,这些技术主要运用在后端的开发实现上,数据库方面主要用轻巧简单的实用的Mysql数据库。前端用了HTML,JQuery和Bootstrap框架技术。在Web应用程序的开发实践中,Spring公司研制了基于MVC模式应用的轻量级的框架—Spring。Spring使用的思路在于JavaBean的生成和销毁的生命周期,为了完成以前的EJB完成的任务。Spring框架主要核心作用在于IOC和AOP容器,IOC控制反转,顾名思义,将以前创建对象的控制对象的权利交给Spring的IOC容器来完成,方便管理所有的对象,解决开发中生成的大量的对象,使开发变得简单容易。AOP面向切面,主要为了分离开发系统中的业务逻辑,当有大量重复的业务逻辑时,可以运用AOP技术,使重复做的工作量变得简单,最核心的为了完成业务逻辑。根据MVC模式的特点,构建了SpringMVC框架,使得Web应用开发更加方便操作。JQuery的插件为了和Bootstrap兼容的整合到一起,构建了Bootstrap的UI组件库。此UI库,含有大量的实用性的组件,给前端开发人员快速开发非常方便。以JavaScript为核心技术,开发封装了一套简单、方便使用的JQuery框架,此框架能特别快速上手。JavaScript中的很多的常用功能代码都进行封装,提供简单的操作,使得其能和HTML标签快速融合,进行前后端的人机交互。Bootstrap主要又在JQuery的基础上进行更多的的封装,使得开发人员操作起来更加的人性化,完善了JQuery的不足之处,形成了栅格式的网站风格,页面变得简洁大气美观。
2.2 Android平台
Android是谷歌旗下著名的移动开源操作系统。这个系统的内核是Linux。 该系统具有很高的兼容性,可以用在包括智能手机、电视、平板等诸多设备上。有着高度兼容的特性。最重要的是,Android开源的属性使开发者可以自由的通过Android系统进行开发。而本系统就是基于Android开发的一款医院挂号系统。Android的开源属性在07年已经推出,就受到了开发者的高度赞扬,而Android开发也成为一时间最热门的词语。开发者可以在Android系统上尽情挥舞画笔随心所欲地创作。Android作为以智能手机、平板、电视为主战场的可移动设备操作系统,使用度和适用性非常广泛,远远超过诸如塞班、IOS等系统。在Android平台上,APP的体系结构很大幅度的上简化了组件的工作。在这之中,Java成为了APP开发的唯一语言,Java通过跨平台功能,无需编译基于Android框架开发的软件应用程序,即任意一台搭载了Android的设备均可运行。
2.3 Java语言简介
Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势和广阔的前景,它是面向对象的,分布式的,动态的,具有平台无关性、安全性、健壮性。Java语言的基本语句语法和C++一样,但是它面向对象的技术更加彻底,因为Java要求将所有的内容都必须封装成类,把类作为程序的基本单位。由于不允许类外有变量、方法。 Java语言的分布式体现在数据分布和操作分布,它是面向网络的语言,可以处理TCP/IP协议,它也支持客户机/服务器的计算模式。Java语言的动态性是指类在运行时是动态安装的,使得Java可以动态的维护程序。Java不支持指针,对内存访问的所有操作都是通过对象实例化实现的,这样就避免了指针操作中易产生的错误,同时也预防了病毒对系统的破坏和威胁。
Java语言的编程风格与C语言非常接近,它继承了C++面向对象技术的核心,它面世之后发展迅速,非常流行,对高级C语言形成了很大的冲击。业内人士称之为“一次编译、到处执行”。当然java也有缺点,在每次执行编译后,字节码都需要消耗一定的时间,在某些程度上降低了性能。但是这并不影响java成为此次设计语言的选择。Java语言简单易学,使用它的编程时间短,功能性强,开发者学习起来更简便、更快。Java的主要特性有以下几个:
1.面向对象
面向对象有四个特点:封装、继承、多态、抽象。抽象是指忽略一个问题中的次要部分,关注主要部分。多态是指对同一种消息做出的不同反应。继承是指在原有的父类方法基础上增加自己独有的方法,而不改变原来父类。
2.平台无关性、
Java编译出来的是字节码,直接由虚拟机执行。在任何平台上,只要有Java虚拟机,Java代码都能运行。
3.可靠性和安全性
Java对内存的访问都必须通过对象的实例变量来实现,避免了指针中出现的错误。
4. 多线程
Java提供了多线程功能,利用编程实现同一时间同时工作的功能。
2.4 MySQL 介绍
数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。简单来讲,存储粮食的仓库叫粮仓存储数据的仓库就叫数据库。数据库在软件项目中扮演着操作管理数据的角色同时还能够保证数据的独立性、一致性和安全性,并为系统访问数据提供有效方式不仅如此数据库还能大大减少程序员开发程序时间。在日常能够接触实用的一般有两类数据库,一类是以(Oracle,DB2,SQL Server,MySQL )为代表的关系型数据库和以(NoSql、MongeDB)为代表的非关系型数据库,两类数据库各有各的优缺点。其中非关系型数据库又分为网络数据库和层级数据库。网络数据库网络数据库是指在计算机网络系统中应用数据库技术然后借助网络技术将存储于数据库中的大量信息及时发布出去;在成熟的数据库技术的帮助下,计算机网络实现了对网络中的各种数据的有效管理,用户与网络中的数据库数据交互也借此得以进行。作为最成功的典型层次模型数据库系统,IMS是最早研制成功的数据库系统。1970年由埃德加·科德于首先提出的关系模型融合了“科德十二定律”。现如今即使很多人仍旧不看好这个模型,但它依旧是数据存储的传统标准。关系数据结构、关系操作集合、关系完整性约束构成了关系模型。作为数据库另外一种区分方式的存储介质被大家分为磁盘和内存这 两种。例如:关系型数据库就存储在磁盘中,非关系型数据库则存储在内存中。典型的关系型数据库有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite。小型关系型数据库:Microsoft Access,SQLite;中型关系型数据库:SQL Server,Mysql;大型关系型数据库:Oracle,DB2。
大家常用的其他关系形数据库系统大多是MySQL AB公司开发的,其中MySQL也是由这家开发的,所应用的分布式数据库管理系统是客户机/服务器体系结构得益于此结构,而且用这个系统建造的数据库具有很强的适用性,用C和C++编写的系统让他拥有很强的适用性所以他可以在大部分操作系统上使用并能和php结合。不同的API函数针对不同的语言(C,C++,JAVA等)来处理不同数据;为了更好地支持多CPU多线程通过使用核心线程来实现;提供的存储机制分为事务和非事务存储机制;MySQL采用双重许可,不管是从MySQL AB公司获得正式的商业许可又或是许可条款下以免费软件或开放源码软件的方式使用MySQL软件都是被允许的。
MySQL作为数据库拥有很多优点,其中由于是开放源码,所以使用成本特别低,而它体积小的特点决定了速度快的特性。因此,My Sql具有开放性,多线程支持多种API,可跨数据库连接,国际化,数据库体积巨大等特点。简单的来说 ,MySql是一个开放的、快速的、多线程的、多用户的数据库服务器。
选用MySQL作为数据库的其中一个原因就是支持多线程,支持多线程的特点为利用系统资源提供了便捷并因此大大提高了系统运行速度和效率,而且连接数据库的方式多样包括但不局限于TCP/IP、ODBC和JDBC等途径;但是没有东西是完美无缺的,即便MySQL也如此,虽说它有着众多优点但其功能不够强大,规模也相对较小,无法应对大型数据哭的处理。但是对于本系统来说,选用MySQL作为数据库,其功能性能已绰绰有余,如果要进行二次开发的数据库表结构空间的扩展也是完全可行的。综上所述,MySQL是作为本系统数据库的最优选择。
图2-2 数据库管理系统和接口的原理
2.5 MySQL环境配置
本系统的数据使用的是MySQL,所以要将MySQL安装到指定目录,如果下载的是非安装的MySQL压缩包,直接解压到指定目录就可以了。然后点击C:\Program Files\MySQL\bin\winMySQLadmin.exe这个文件其中C:\Program Files\MySQL是MySQL安装目录。输入winMySQLadmin的初始用户、密码(注:这不是MySQL里的用户、密码)随便填不必在意,确定之后右下角任务的启动栏会出现一个红绿灯的图标,红灯亮代表服务停止,绿灯亮代表服务正常,左击这个图标->winnt->install the service 安装此服务,再左击这个图标->winnt->start the service 启动MySQL服务。
修改MySQL数据库的root密码。用cmd进入命令行模式输入如下命令:
cd C:\Program Files\MySQL\bin
MySQLadmin -u root -p password 123
回车出现Enter password: ,这是要输入原密码. 刚安装时密码为空,所以直接回车,此时MySQL 中账号 root 的密码被改为 123 安装完毕。
2.6 SSM框架
手机密码管理app的主流框架是SSM(Spring + Spring MVC + MyBatis),SSM框架web层使用Spring MVC框架,使传输前后端数据变得简单;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框架;对于相关SQL操作,采用Mybatis作为持久层框架,对JDBC进行封装,使得数据库的底层面向开发者操作处于一种透明状态。
2.5 JSP技术
本系统的开发主要用JSP(Hypertext Preprocessor,超文本预处理器)这一门开发语言。作为开发语言,这是一种通用的开源脚本语言。这种语法主要是将C语言、Java和Perl等语言的相关特点进行总结吸收形成自身特点,使得更加方便学习,当前广泛在Web领域进行使用。此语法的独特之处在于将C、Java、Perl这三种语言进行了归纳,并创新出JSP具有自己特点的语法。它在执行动态网页方面相对于CGI和Perl语言更加高效。用动态页面如果是使用JSP语言,那么相对于其它的编程语言,JSP的执行主要是体现在将程序嵌入到HTML文档中,相对于其它语言,其执行的效率一般都领先于其它的语言。此外,JSP编译后代码方面也是做得比较好的,一般其编译能够使代码的运行速度比一般语言都要快[7]。
其主要特性有以下几个方面:
1)免费性
和其它技术相比,JSP本身免费且是开源代码。
2)快捷性
使用JSP编程的程序一般开发比较快,而且系统运行也比较快,也易于学习[2]。嵌入于HTML的这种方式,使其相对于其它开发语言编辑起来相对简单,实用性也更加强,对初学者是比较适用的。
3)跨平台性强
由于JSP是运行在服务器的脚本,可以运行在UNIX、LINUX、WINDOWS、MacOS、Android等平台
4)效率高
JSP占用相当少的系统资源。
JSP是面向对象且独立于架构的动态脚本语言,使用JSP和HTML编写WEB页面,JSP服务器先对页面的JSP代码进行解析,然后把处理后的结果连同HTML内容一起传送到访问端的浏览器。JSP是一种源代码开放程序,拥有很好的跨平台兼容性。JSP代码可以在Window系统以及许多版本的linux系统上完美运行。
JSP语言是不需要任何特殊的开发环境的,所以用户可以直接在WEB页面中输入JSP命令代码。在WEB页面中,所有的JSP代码都被放置在“<?JSP”和“?>”中。
3系统分析
3.1可行性分析
在开发系统之前要进行系统可行性分析,目的是在用最简单的方法去解决最大的问题,程序一旦开发出来满足了用户的需要,所带来的利益也很多。下面我们将从技术、操作、经济等方面来选择这个系统最终是否开发。
可行性分析就是可行性研究,它对于这个项目起着十分重要的作用,利用系统确定题目的前期,需要就行走访、市场调差、亲身体验等各种方式去了解系统未来的存在价值、使用价值、长远利益等,为了避免项目出现瓶颈,减少项目不必要的损失,保障项目的成功投资,系统主要从经济可行性、技术可行性、管理可行性和开发环境可行性做评估,利用较短的时间,确定未来可能出现问题的解决方案。
技术本身来说是完全可以实现手机密码管理的所有功能,不存在技术的不完整性,和功能的不可实现性。就自己的技术水平来说,随着毕业设计的不断深入,自己也在不断的学习,通过互联网的查询、图书馆资料的查阅、导师热情的指点及同学朋友的帮助,自身技术会不断提高,相信通过自己的努力,自身的技术水平可以达到系统实现的要求。
3.1.1技术可行性
本系统开发选择java技术,java是一个完全面向对象的语言,java为开发者提供了丰富的类库,大大减少了使用windows编程的难度,减少开发人员在设计算法上的难度,作为java开发 Visual Studio更是一个必不可少的角色,它友好的界面,以及强大的功能,给程序开发人员带来了很多方便,加上环境简单,转移方便,无疑使此系统最佳的选择。所以后台设计选择使用MySQL数据库主要用来的建立和维护信息。对于前台开发要求应具备功能完善、易于操作等优点,后台数据库的要求则是能够建立和维护数据信息的统一性和完整性。
依据上述目标来分析本系统的硬件如下:
奔腾3的处理器;
内存是 2G;
硬盘是50G;
操作系统是Window 10;
在软件方面的话,安装了Visul Studio 0 和MySQL数据库开发工具。根据以上的软件与硬件要求,得到这个系统的技术是可行的。
3.1.2经济可行性
基于ssm的手机密码管理app,该app软件开发仅需要一台普通的计算机便可完成实现开发,其成本很低。另外,作为毕业设计作品来讲,开发成本基本上可以忽略不计,且该系统软件的投入使用,可以实现更加快速高效的手机密码管理,同时还能实现对人力资源和管理资源的有效节约,该手机密码管理在经济上完全可行。
3.1.3操作可行性
现在随着科技的飞速发展,计算机早已经进入了人们的日常生活中,人们的工作环境也不像以前有那么多的要求,需要员工一定要到公司办公,有的工作在家也可以完成。这使得人们的工作效益有了很大的提高。操作的多样性也变高了。因此,管理的计算机化,智能化是社会发展而带来的必然趋势,各种智能的软件层出不穷,不同的软件能完成用户不同的需求,这不仅提高了工作效率还能完成一些用户特定的一些需求。本系统不仅界面简洁明了还采用可视化界面,用户只要用鼠标和键盘就可以完成对相关信息的修改,删除,添加等操作。因为这个系统的操作十分简单,方便上手,对于第一次使用系统的人,只需要很少的时间就可以上手操作。由此可见,本系统在操作上是可行的。
2.3 系统性能分析
(1)系统响应效率:页面响应时问应该在3秒以内,最长不能超过4秒,并支持至少10000人同时在线所有系统。
(2)界面简洁清晰:系统界面要求简单明了,容易操作,符合用户操作习惯。
(3)储存性高:因为手机密码管理app站中有很多的信息需要存储,因此对于系统的存储量有很大的要求,需要有一个强大的数据库的支持才能确保所有的信息都能安全稳定的进行存储。
(4)易学性:该系统在操作上必须简单好上手,没有很多复杂的操作,只需要简单的进行学习就能操作该系统。
(5)稳定性需求:开发的手机密码管理app站要求运行稳定,运行过程中无界面不清楚、字体模糊等现象。
3.2 app性能需求分析
对网站性能进行分析,可对系统反应度、界面简洁清晰度、储存能性、易学性和稳定性进行分析;
系统反应度:同时上万人在线时反应时间应该在两三秒以内,。
界面简洁清晰:系统界面要求简单明了,操作简单,用户操作容易上手。
储存性能高:手机密码管理中需要存储的信息有很多,所以对系统的存储量要求很高,因此数据库就应该很强大,才能保证信息能安全稳定的进行存储;
易学性:该系统在操作上必须简单好上手,没有很多复杂的操作,只需要简单的进行学习就能操作该系统。
稳定性:要求手机密码管理运行要稳定,界面清楚、字体清晰等。
3.3 app设计规则与运行环境
软件系统的优劣很大程度上是由系统设计的完善与否决定的。世间万物都必须遵循生老病死的法则,这是大自然的规则不能违反,软件设计也一样需要遵循系统设计规则。因此,在设计过程中必须遵循系统设计规则。
规则如下:
简单性:为了扩大系统使用者的受众面,系统设计应该本着操作越简单约好的原则,这样不仅能提高系统的使用率更能够扩大系统使用面。。
针对性:一个系统针对性越强,所能提供的功能必然越完善,用户体验肯定更好,所以应该明确指定系统针对性。
实用性:实用永远是检验一个系统是否成功的唯一标准,使用的语言再高端,使用的结构再新颖但不能满足管理员和用户的要求那就是失败。
运行环境:
本系统是利用B/S结构来开发的,数据库在服务器上进行部署 Mysql即可,其他包括My Eclipse等常规开发程序。
3.4 app功能分析
考虑到实际生活中在手机密码管理方面的需要以及对该系统认真的分析,将app权限按管理员和用户这两类涉及用户划分。
(a) 管理员;管理员使用本系统涉到的功能主要有所有记录、回收站、文件夹等功能。管理员用例图如图3-1所示。
图3-1 管理员用例图
3.5 app流程的分析
由于不同的系统实际使用用户角色的不同,他们的业务分析也会变得有所不一样,为了论述方便接下来都将以用户功能权限下的系统业务流程来分析,如下图所展示:
3.5.1 用户管理的流程
图3-3 用户管理流程
3.5.2 个人中心管理流程
图3-4 个人中心管理流程
3.5.3 登录流程
图3-4 登录流程
4系统设计
4.1 软件功能模块设计
App整体功能如下图所示:
图 4-1 整体功能模块图
4.1.1 系统架构
系统架构图如图3.2所示。
图3.2 系统架构图
系统架构选用Spring3.0架构。作为在Java领域最为成功的开源软件之一,Spring在Java EE 开发中使用者众多。Spring抽象了我们在目前许多应用开发中所遇到的最共性的问题,同时作为一个轻量级的应用开发框架,Spring和传统的J2EE开发相比,有其自身特有的特点。Spring通过这些自身特有的特点充分体现了它的设计理念:在Java EE的应用开发中,支持POJO(JavaBean)的开发方式,使应用能够面向接口开发,充分支持OO(面向对象)的设计方法。在IOC容器和AOP面向切面编程的核心模块的支持下,使得程序员能够高度简化了Java EE的开发过程。为应用开发提供了极其丰富的系统组件,通过这些组件,为企业应用服务的实现提供驱动支持。
4.2 数据库设计
4.3.1数据库设计概述
数据库的设计在这一套开发系统中扮演者非常重要的角色,完善的数据库建立可以让其更快的完成项目。整个数据库的创建是库存管理系统开发和创立的核心技术,概括的说,就是根据用户的需求创立起满足用户的需要的数据库。数据库的整体设计是在软件开发是其最主要的问题。
再考虑到数据库设计的时候,我们首先应该想到把这个系统的数据设计和处理设计密切结合起来,从而使得把整个库存信息管理系统相结合起来。
4.3.1概念设计
一个完整的数据分析过程与这个数据库的逻辑结构和物理结构有十分密切的联系,我们需要一系列操作来完成对应用数据库所使用的信息进行确认、编纂、组织、挑选。我们可以采用特定的方法来获取有关用户的所有的有效信息,从而使这些有用信息可以直接成为数据库的重要数据。
概念模型是对现实中的问题出现的事物的进行描述,ER图是由实体及其关系构成的图,通过E-R图可以清楚地描述系统涉及到的实体之间的相互关系。
4.2.2 物理模型设计
根据上诉的逻辑模型设计,下面给出物理模型的设计,如下表:
config
表注释: 配置文件
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
name varchar(100) 否 配置参数名称
value varchar(100) 是 NULL 配置参数值
news
表注释: 美容产品
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
title varchar(200) 否 产品名称
introduction longtext 是 NULL 简介
picture varchar(200) 否 图片
content longtext 否 内容
tijianbaogao
表注释: 项目预约
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
baogaobianhao varchar(200) 是 NULL 报告编号
xiangmubianhao varchar(200) 是 NULL 项目编号
yiyuanmingcheng varchar(200) 是 NULL 医院名称
xiangmumingcheng varchar(200) 是 NULL 项目名称
xiangmufenlei varchar(200) 是 NULL 项目分类
xiangmufengmian varchar(200) 是 NULL 项目封面
yishengzhanghao varchar(200) 是 NULL 医生账号
yishengxingming varchar(200) 是 NULL 医生姓名
baogaoshijian date 是 NULL 报告时间
yonghuzhanghao varchar(200) 是 NULL 用户账号
yonghuxingming varchar(200) 是 NULL 用户姓名
baogaojieguo longtext 是 NULL 报告结果
yishengjianyi longtext 是 NULL 医生建议
userid bigint(20) 是 NULL 用户id
tijianxiangmu
表注释: 在线预约
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
xiangmubianhao varchar(200) 是 NULL 项目编号
yiyuanmingcheng varchar(200) 是 NULL 医院名称
xiangmumingcheng varchar(200) 是 NULL 项目名称
xiangmufenlei varchar(200) 是 NULL 项目分类
xiangmufengmian varchar(200) 是 NULL 项目封面
xiangmujiage float 是 NULL 项目价格
fabushijian date 是 NULL 发布时间
xiangmuxiangqing longtext 是 NULL 项目详情
yishengzhanghao varchar(200) 是 NULL 医生账号
yishengxingming varchar(200) 是 NULL 医生姓名
tijianyuyue
表注释: 体检预约
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
yuyuebianhao varchar(200) 是 NULL 预约编号
xiangmubianhao varchar(200) 是 NULL 项目编号
yiyuanmingcheng varchar(200) 是 NULL 医院名称
xiangmumingcheng varchar(200) 是 NULL 项目名称
xiangmufenlei varchar(200) 是 NULL 项目分类
xiangmufengmian varchar(200) 是 NULL 项目封面
xiangmujiage float 是 NULL 项目价格
yishengzhanghao varchar(200) 是 NULL 医生账号
yishengxingming varchar(200) 是 NULL 医生姓名
yuyueshijian date 是 NULL 预约时间
yonghuzhanghao varchar(200) 是 NULL 用户账号
yonghuxingming varchar(200) 是 NULL 用户姓名
beizhu longtext 是 NULL 备注
sfsh varchar(200) 是 否 是否审核
shhf longtext 是 NULL 审核回复
ispay varchar(200) 是 未支付 是否支付
userid bigint(20) 是 NULL 用户id
token
表注释: token表
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
userid bigint(20) 否 用户id
username varchar(100) 否 用户名
tablename varchar(100) 是 NULL 表名
role varchar(100) 是 NULL 角色
token varchar(200) 否 密码
addtime timestamp 否 CURRENT_TIMESTAMP 新增时间
expiratedtime timestamp 否 CURRENT_TIMESTAMP 过期时间
users
表注释: 用户表
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
username varchar(100) 否 用户名
password varchar(100) 否 密码
role varchar(100) 是 管理员 角色
addtime timestamp 否 CURRENT_TIMESTAMP 新增时间
xiangmufenlei
表注释: 项目分类
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
xiangmufenlei varchar(200) 是 NULL 项目分类
yisheng
表注释: 医生
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
yishengzhanghao varchar(200) 否 医生账号
mima varchar(200) 否 密码
yishengxingming varchar(200) 否 医生姓名
xingbie varchar(200) 是 NULL 性别
zhicheng varchar(200) 是 NULL 职称
lianxidianhua varchar(200) 是 NULL 联系电话
touxiang varchar(200) 是 NULL 头像
yiyuanxinxi
表注释: 美容视频
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
yiyuanmingcheng varchar(200) 是 NULL 医院名称
yiyuantupian varchar(200) 是 NULL 医院图片
yiyuandizhi varchar(200) 是 NULL 医院地址
fuzeren varchar(200) 是 NULL 负责人
lianxidianhua varchar(200) 是 NULL 联系电话
yingyeshijian varchar(200) 是 NULL 营业时间
yiyuandengji varchar(200) 是 NULL 医院等级
yiyuanjieshao longtext 是 NULL 医院介绍
yonghu
表注释: 用户
字段 类型 空 默认 注释
id (主键) bigint(20) 否 主键
addtime timestamp 否 CURRENT_TIMESTAMP 创建时间
yonghuzhanghao varchar(200) 否 用户账号
mima varchar(200) 否 密码
yonghuxingming varchar(200) 否 用户姓名
xingbie varchar(200) 是 NULL 性别
lianxifangshi varchar(200) 是 NULL 联系方式
touxiang varchar(200) 是 NULL 头像
5系统详细设计
(一)基本任务
系统实现阶段的根本目标在这个阶段的设计工作中精确地描述出目标系统,从而在编码阶段可以直接根据这个描述翻译成用程序语言编写的系统。
系统实现的基本任务有以下几个:
(1) 为每个模块进行详细的算法设计。用某种图形、表格、语言等工具将每个模块处理过程的详细算法描述出来。
(2) 为模块内的数据结构进行设计。对于需求分析、概要设计确定的概念性的数据类型进行确切的定义。
(3) 对数据结构进行物理设计,即确定数据库的物理结构。
(4) 其他设计:根据软件系统的类型,可能还需要进行代码设计、输入/输出格式设计、人机对话设计。
(5) 编写系统实现说明书。
(6) 评审。对处理过程的算法和数据库的物理结构都要评审。
系统结构可分为src的java源代码,database文件夹为系统的数据库文件,webroot为系统的界面代码文件。Src文件夹里面包含control包、dao包、util包,dao包为逻辑层,是系统方法的底层包,包括各种数据增删改查的方法,control包是控制层,用来连接逻辑层和视图层,在逻辑层调用逻辑层,完成视图层需要的功能,视图层为系统的界面代码,完成界面的设计和数据的显示。
5.1 APP端
用户登录,用户进入app,输入自己的账号和密码,并选择对应的角色进行系统登录操作,如图5-1所示。
图5-1登录界面图
用户登陆系统后,可以对所有记录、回收站、文件夹等内容进行详细操作,如图5-2所示。
图5-2 app首页界面图
5.2管理员功能模块
管理员登录,管理员通过输入用户名,密码,在角色中选择管理员,点击登录进入系统操作进行操作,如图5-7所示。
图5-7管理员登录界面图
该模块控制层主要代码:
/**
* 登录
*/
@IgnoreAuth
@RequestMapping(value = “/login”)
public R login(String username, String password, String captcha, HttpServletRequest request) {
YonghuEntity user = yonghuService.selectOne(new EntityWrapper().eq(“yonghuming”, username));
if(user==null || !user.getMima().equals(password)) {
return R.error(“账号或密码不正确”);
}
String token = tokenService.generateToken(user.getId(), username,“yonghu”, “用户” );
return R.ok().put(“token”, token);
}
/**
* 注册
*/
@IgnoreAuth
@RequestMapping("/register")
public R register(@RequestBody YonghuEntity yonghu){
//ValidatorUtils.validateEntity(yonghu);
YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
if(user!=null) {
return R.error("注册用户已存在");
}
Long uId = new Date().getTime();
yonghu.setId(uId);
yonghuService.insert(yonghu);
return R.ok();
}
/**
* 退出
*/
@RequestMapping("/logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
}
管理员登陆系统后,可以查看所有记录、回收站、文件夹等功能,还能对每个功能逐一进行相应操作,如图5-8所示。
图5-8管理员功能界面图
该模块控制层主要代码:
/**
* 列表
*/
@RequestMapping(“/page”)
public R page(@RequestParam Map<String, Object> params,ConfigEntity config){
EntityWrapper ew = new EntityWrapper();
PageUtils page = configService.queryPage(params);
return R.ok().put(“data”, page);
}
/**
* 列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,ConfigEntity config){
EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>();
PageUtils page = configService.queryPage(params);
return R.ok().put("data", page);
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
ConfigEntity config = configService.selectById(id);
return R.ok().put("data", config);
}
/**
* 详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") String id){
ConfigEntity config = configService.selectById(id);
return R.ok().put("data", config);
}
/**
* 根据name获取信息
*/
@RequestMapping("/info")
public R infoByName(@RequestParam String name){
ConfigEntity config = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
return R.ok().put("data", config);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody ConfigEntity config){
// ValidatorUtils.validateEntity(config);
configService.insert(config);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody ConfigEntity config){
// ValidatorUtils.validateEntity(config);
configService.updateById(config);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
configService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
}
文件夹,在文件夹页面可以对文件夹、名称、用户名、密码、地址等内容进行修改和删除操作,如图5-9所示。
图5-9文件夹界面图
该模块控制层主要代码:
* 后端列表
*/
@RequestMapping(“/page”)
public R page(@RequestParam Map<String, Object> params,YonghuEntity yonghu,
HttpServletRequest request){
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,YonghuEntity yonghu,
HttpServletRequest request){
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( YonghuEntity yonghu){
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
ew.allEq(MPUtil.allEQMapPre( yonghu, "yonghu"));
return R.ok().put("data", yonghuService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(YonghuEntity yonghu){
EntityWrapper< YonghuEntity> ew = new EntityWrapper< YonghuEntity>();
ew.allEq(MPUtil.allEQMapPre( yonghu, "yonghu"));
YonghuView yonghuView = yonghuService.selectView(ew);
return R.ok("查询用户成功").put("data", yonghuView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
YonghuEntity yonghu = yonghuService.selectById(id);
return R.ok().put("data", yonghu);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
YonghuEntity yonghu = yonghuService.selectById(id);
return R.ok().put("data", yonghu);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request){
yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(yonghu);
YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
if(user!=null) {
return R.error("用户已存在");
}
yonghu.setId(new Date().getTime());
yonghuService.insert(yonghu);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request){
yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(yonghu);
YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
if(user!=null) {
return R.error("用户已存在");
}
yonghu.setId(new Date().getTime());
yonghuService.insert(yonghu);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request){
//ValidatorUtils.validateEntity(yonghu);
yonghuService.updateById(yonghu);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
yonghuService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
该模块控制层主要代码:
/**
* 后端列表
*/
@RequestMapping(“/page”)
public R page(@RequestParam Map<String, Object> params,ForumEntity forum,
HttpServletRequest request){
if(!request.getSession().getAttribute(“role”).toString().equals(“管理员”)) {
forum.setUserid((Long)request.getSession().getAttribute(“userId”));
}
EntityWrapper<ForumEntity> ew = new EntityWrapper<ForumEntity>();
PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,ForumEntity forum,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
forum.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<ForumEntity> ew = new EntityWrapper<ForumEntity>();
PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@IgnoreAuth
@RequestMapping("/flist")
public R flist(@RequestParam Map<String, Object> params,ForumEntity forum, HttpServletRequest request){
EntityWrapper<ForumEntity> ew = new EntityWrapper<ForumEntity>();
PageUtils page = forumService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, forum), params), params));
return R.ok().put("data", page);
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(ForumEntity forum){
EntityWrapper< ForumEntity> ew = new EntityWrapper< ForumEntity>();
ew.allEq(MPUtil.allEQMapPre( forum, "forum"));
ForumView forumView = forumService.selectView(ew);
return R.ok("查询手机密码管理表成功").put("data", forumView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
ForumEntity forum = forumService.selectById(id);
return R.ok().put("data", forum);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
ForumEntity forum = forumService.selectById(id);
return R.ok().put("data", forum);
}
/**
* 手机密码管理详情
*/
@IgnoreAuth
@RequestMapping("/list/{id}")
public R list(@PathVariable("id") String id){
ForumEntity forum = forumService.selectById(id);
getChilds(forum);
return R.ok().put("data", forum);
}
private ForumEntity getChilds(ForumEntity forum) {
List<ForumEntity> childs = new ArrayList<ForumEntity>();
childs = forumService.selectList(new EntityWrapper<ForumEntity>().eq("parentid", forum.getId()));
if(childs == null || childs.size()==0) {
return null;
}
forum.setChilds(childs);
for(ForumEntity forumEntity : childs) {
getChilds(forumEntity);
}
return forum;
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ForumEntity forum, HttpServletRequest request){
forum.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(forum);
forum.setUserid((Long)request.getSession().getAttribute("userId"));
forumService.insert(forum);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody ForumEntity forum, HttpServletRequest request){
forum.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(forum);
forum.setUserid((Long)request.getSession().getAttribute("userId"));
forumService.insert(forum);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody ForumEntity forum, HttpServletRequest request){
//ValidatorUtils.validateEntity(forum);
forumService.updateById(forum);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
forumService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
该模块控制层主要代码:
/**
* 后端列表
*/
@RequestMapping(“/page”)
public R page(@RequestParam Map<String, Object> params,MessagesEntity messages,
HttpServletRequest request){
if(!request.getSession().getAttribute(“role”).toString().equals(“管理员”)) {
messages.setUserid((Long)request.getSession().getAttribute(“userId”));
}
EntityWrapper<MessagesEntity> ew = new EntityWrapper<MessagesEntity>();
PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,MessagesEntity messages,
HttpServletRequest request){
EntityWrapper<MessagesEntity> ew = new EntityWrapper<MessagesEntity>();
PageUtils page = messagesService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, messages), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( MessagesEntity messages){
EntityWrapper<MessagesEntity> ew = new EntityWrapper<MessagesEntity>();
ew.allEq(MPUtil.allEQMapPre( messages, "messages"));
return R.ok().put("data", messagesService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(MessagesEntity messages){
EntityWrapper< MessagesEntity> ew = new EntityWrapper< MessagesEntity>();
ew.allEq(MPUtil.allEQMapPre( messages, "messages"));
MessagesView messagesView = messagesService.selectView(ew);
return R.ok("查询项目预约成功").put("data", messagesView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
MessagesEntity messages = messagesService.selectById(id);
return R.ok().put("data", messages);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
MessagesEntity messages = messagesService.selectById(id);
return R.ok().put("data", messages);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody MessagesEntity messages, HttpServletRequest request){
messages.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(messages);
messagesService.insert(messages);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody MessagesEntity messages, HttpServletRequest request){
messages.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(messages);
messagesService.insert(messages);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody MessagesEntity messages, HttpServletRequest request){
//ValidatorUtils.validateEntity(messages);
messagesService.updateById(messages);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
messagesService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
该模块控制层主要代码:
/**
* 列表
*/
@IgnoreAuth
@RequestMapping(“/list”)
public R list(@RequestParam Map<String, Object> params,ConfigEntity config){
EntityWrapper ew = new EntityWrapper();
PageUtils page = configService.queryPage(params);
return R.ok().put(“data”, page);
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
ConfigEntity config = configService.selectById(id);
return R.ok().put("data", config);
}
/**
* 详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") String id){
ConfigEntity config = configService.selectById(id);
return R.ok().put("data", config);
}
/**
* 根据name获取信息
*/
@RequestMapping("/info")
public R infoByName(@RequestParam String name){
ConfigEntity config = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
return R.ok().put("data", config);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody ConfigEntity config){
// ValidatorUtils.validateEntity(config);
configService.insert(config);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody ConfigEntity config){
// ValidatorUtils.validateEntity(config);
configService.updateById(config);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
configService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
} }
6系统测试
系统测试不仅仅是发现系统潜在的BUG或错误,而更为重要的是为用户提供一个良好的体验和安全可使用的产品服务。而通过发现错误或潜在的问题,将有助于提升产品的竞争力,这也是软件测试的其中的重要目的之一。
软件测试的方法有好几种,但目前主要采用的是包括以功能为主要测试方向的黑盒测试以及以逻辑为主要测试方向的白盒测试,这是两种不同的测试方法,针对的测试侧重点不同,本课题根据实际需求情况,选择以功能为主要的黑盒测试方法,同时测试是要遵循一定的规则来执行的,一个测试要执行其执行的依据一般是由测试用例来规定的,而测试用例一般是依据需求或说明书来综合制定的,测试在硬件出厂前是十分重要的一个过程,本课题由于时间和精力的关系,选择以实现的功能作为测试要点来进行测试。具体测试过程如下:
测试用例1及测试过程:
登录:录入登录信息,账号,密码和选择权限,点击登录按钮,会出现两种情况:登录成功进入用户具有权限的功能界面和提示登录失败。
测试用例2及测试过程:
管理员登录:录入登录信息,管理员账号,密码和选择权限,点击登录按钮,会出现两种情况:登录成功进入管理员具有权限的功能界面和提示登录失败。
(一)测试目的
软件测试的目的主要是发现软件缺陷和漏洞,其次,软件测试能够识别项目风险。为开发人员和程序经理提供软件测试的反馈结果,为风险评估提供必要的信息。再者,软件测试确保在上线日前达到上线标准。包括持续追踪项目进度和严格把控各个开发阶段的产品质量。
基于ssm的手机密码管理app,主要测试客户端的使用和后台服务器的使用。客户端主要是测试用户注册、用户登录、用户完善信息、页面是否进行跳转等功能是否实现。管理员的使用主要是测试所有记录、回收站、文件夹功能是否实现。
(二)测试概述
1.测试的原则
(1)系统测试应该避免测试自己的程序,以免发现不了细小的问题。
(2)系统测试用例应有两部分组成,分别为输入测试和输出测试。
(3)系统测试数据应当引用不合理的数据进行测试,选取不同情况的进行逐一测试。
(4)不仅要检查程序是否达到预期的效果,还要检查程序是否执行了规定以外的操作。
(5)对出现错误多的模块进行集中测试。
(6)已发现错误的模块修改后,应及时进行重新测试。
2.测试的方法
测试方法主要有人工测试和机器测试。
(1)人工测试
人工测试又称代码复审,包括个人复查、走查、会审三种方法[7]。
(2)机器测试
机器测试主要是由黑盒测试和白盒测试两种方法。
在最后的测试阶段,系统采用后黑盒测试和白盒测试想结合的方法。黑盒测试主要用于对系统的输入和输出特性进行测试,检测功能方面存在的错误与可能存在的缺陷。白盒测试主要用于对软件的过程及逻辑路径进行测试,发现性能方面的错误。具体采用的测试方法为系统测试和单元测试。
(三)单元测试
(1)注册测试
用户得先注册账号才能登录系统,用户输入符合规则的用户名后,填写2次一样的密码,点击注册按钮,系统提示“注册成功“。当用户2次密码不一致时,系统提示两次密码不一致。
注册测试用例如下表所示。
表6-1注册测试用例
测试模块 用户注册模块测试
测试目的 测试当注册信息输入不符合要求时,系统是否能进行相应处理并给出提示。
测试方法 黑盒测试
测试数据 1不输入用户名和密码,直接点击注册。
2输入未注册过的用户名。例如:abcd
3输入正确用户名,两次密码不一样。例如:用户名abcdefg、密码 000,确认密码111
预期结果 1 界面不跳转,弹出对话框,提示用户输入必填项。
2界面跳转,弹出对话框,提示用户注册成功。
3界面不跳转,弹出对话框,提示两次密码不一致。
实际结果 与预想一致。
结论 注册模块实现了基本的异常输入应对。
(2)登录测试
登录模块需要测试的功能有:输入登录名和密码,点击“登录”按钮是否正常进入系统首页。
登录测试用例如下表所示。
表6-2登录测试用例
测试模块 用户登录模块测试
测试目的 测试当登陆信息输入不符合要求时,系统是否能进行相应处理并给出提示。
测试方法 黑盒测试
测试数据 1不输入用户名和密码,直接点击登陆。
2输入未注册过的用户名。例如:abcdefg
3输入正确用户名,错误密码。例如:用户名abcdefg、密码 000
4输入正确用户名,正确匹配密码。例如:用户名abcdefg、密码 111
预期结果 1 界面不跳转,弹出对话框,提示用户输入必填项。
2界面不跳转,弹出对话框,提示用户当前用户名尚未注册。
3界面不跳转,弹出对话框,提示用户密码错误。
4界面实现跳转,登陆功能正常进行。
实际结果 与预想一致。
结论 登陆模块实现了基本的异常输入应对。
(3)集成测试
集成测试的方案主要如下所述:
1.将系统移植到另一台计算机上,运行出错。修改配置信息后运行成功。
2.用户信息管理模块综合测试,添加新用户roess,为其分配一般管理员角色,查看一般管理员角色权限,保存设置,以roess身份登录,查看所拥有权限。
3.最后按照手机密码管理app的设计与实现,以不同角色的身份进入系统,对系统各模块功能进行测试,测试模块间逻辑功是否有误。
经过测试,发现此开发系统可以满足手机密码管理app流程的基本工作流程和基本要求。
7总结与心得体会
7.1 总结
通过完成该手机密码管理app和本论文的撰写让我更加明白了软件开发过程中软件工程思想的重要性。在项目的前期由于对需求分析做的不够谨慎和明确,导致了后面在设计甚至编码时候造成了许多不必要的麻烦。由此在今后的学习和工作开发之中必须要牢牢把握住软件工程的设计思想和方法,这样可以进一步保证项目开发的健壮性和准确性。
本app所实现的是一个手机密码管理,该系统严格按照需求分析制作相关模块,并利用所学知识尽力完成,但是本人由于学识浅薄,无法真正做到让该程序可以投入市场使用,仅仅简单实现部分功能,希望日后还能改善。
本app具有以下优点:
该app具有较高的适用性,选用B/S结构,可以在绝大部分个人平台上使用该系统。
系统将用户权限进行划分,管理员和用户能看到及操作的信息不一样,两者具备不同的操作权限。
该app操作界面简单明了,大部分人都可以正常使用。
但也存在以下问题需要改进:
运行时窗口不能被刷新,可以改进。
系统过于简单,显示的信息有限。
不能添加多个管理员账号,如果可以则将利于发展手机密码管理规模,便于在手机密码管理信息集中管理。
不能实时预约接待消息和手机密码管理反馈建议,容易被忽视,不利于管理员服务客户。
在毕业设计开发的这些时间中,付出努力和心血,终于将手机密码管理app完美的完成。这套系统具有很多优点,不仅能完成日常用户的管理,还可以对用户进行记事本业务进行扩展。不过在本项目完成的同时,由于时间短,项目紧促,造成了该系统也有很多不足的地方。整个项目仍有改进的空间。具体的改进如下:
优点
本项目的优点在于项目前后台分离,各自负责不同的部分。同时还应用了较为新颖的技术。项目运用了JQuery,使项目能有较高的易用性,其强大的UI库保证了界面的美观程度。
缺点
本项目的缺点在于由于只有一个人完成整个项目,以此来计算的情况下完成整套系统的时间显得非常仓促。在需求调研阶段就调研结果而言并不能高度满足于现有系统真正所需要的要求。另外在项目中,并没能很好的完全分离前后台,这一点还有待加强学习。
对于手机密码管理app系统的缺点的相对应改善计划是,理清前后台的业务逻辑,使之能够做到前后台分离。而JQuery中我们可以通过加强对JavaScript的使用对其进行补充。使得项目能够有更好的易用性。针对JQuery组件库过多的问题,可以对其进行库设计,从而达到快速引用的设计。
通过这几个月的不断努力和学习,最终独立的完成了整个项目。对此有很多的感触。项目中应用到了不少的新技术。有很多都不在学校的课堂中学习到而是通过不断的实践获得的。有很多的知识通过在公司的实习和在对技术的应用中获得,而这些知识将全部应用在手机密码管理app系统这个项目上来。随着技术的进步,我们还需要不断的学习与探索,会有更好的天地等着我们去实现。
7.2 心得体会
由于经验和能力不足,导致在开发、设计该app的时候,出现了比较多的问题,例如需要用到的技术不熟悉、程序报错等,后来我积极地向同学询问自己出现的问题同时也会找一些相关的书进行学习,慢慢的一点点将自己遇到的问题逐渐解决。所以不管以后在任何时候合作都会让自己事半功倍。通过本app的完整的开发,可以遇到自己平时写一些简单的小程序遇不到的问题,不仅仅局限与技术与业务方面的,同时也使得自己更加深入的了解软件过程的开发设计思想,对于即将踏入社会工作而言,这些心得都十分重要。在以后的研究生学习生涯也必须加深这方面的理解,将最好的开发技术和最新的科学原理运用到自己以后的开发工作和学习研究中去。
mc
[1] 李长江,安筱鹏.开放手机联盟:重塑移动互联网产业链.中国电子报,2018.
[2] 方银旺,赵向道,李欣.Symbian操作系统及其应用程序开发.计算机工程,2013(1):275-277.
[3] 余志龙,陈昱勋,郑名杰等著.Google Android SDK开发范例大全[M].北京:人民邮电出版社,2016:2.
[4] 马宁.嵌入式移动开发.程序员,2017,(12):14-15.
[5] Chris Haseman.Android Essentials.PEF Electronic Book,2018.
[6] 杨丰盛著.Android应用开发揭秘[M].北京:机械工业出版社,2019:96.
[7] W.Frank Ableson (美) Charlie Collins RobiSen(美)著.张波,高朝勤,杨越译.Google Android揭秘[M].北京:人民邮电出版社,2015:2-7.
[8] 朱桂英.Android开发应用从入门到精通[M].北京:中国铁道出版社,2011:21.
[9] 余志龙,陈昱勋,郑名杰等著.Google Android SDK开发范例大全[M].北京:人民邮电出版社,2017:2.
[10] 郭宏志著.Android应用开发详解[M].北京:电子工业出版社,2016:96.
[11] 姚旻旻,刘卫国著.计算机系统应用.计算机应用,2018:17(11).
[12]BruceEckel著.陈昊鹏等译.Thinking in Java 3th Edition[M] .机械工业出版社,2014:75.
[13] Comp-U-Learn Tech India Ltd(美)著,贾素玲译.Java编程基础[M].北京:高等教育出版社,2017:20.
[14] 王水著.软件工程[M].河南:河南科学技术出版社,2018:80.
[15]吴洁明著.软件工程实例教程[M].北京:清华大学出版社,2015:11.
[16] Ed Burnette(美)著.张波等译.Hello Android[M] .北京:人民邮电出版社,2019:34.
[17] Ron patton(美)著小松.王钰,曹跃译.软件测试[M].北京:机械工业出版社,2016:4.
致谢
在系统全部完成之际,我非常感谢在毕业设计时给予我帮助的人。没有他们的帮助,就没有我能够顺利的完成毕业设计。
首先,我要感谢我的指导老师,这几个月来,老师为我们付出了很多的努力,针对我们的系统和论文进行了非常细心的指导。根据毕业设计期间的要求和政策对我提出了不少的意见和建议。在她的建议下我能够圆满完成我的毕业设计任务。对此再次表示衷心的感谢。
其次我需要感谢的是我的父母,在整个毕业设计期间,是我的父母,作为在毕业设计期间最强有力的后盾,我可以全身心的去关注、去撰写我的毕业设计论文。在大学生活中我的每时每刻都离不开来自于我的父母的全力支持和关心。
过程永远比结果重要。毕业设计是大学生活中最为浓墨重彩的一笔,在这个过程中不仅学到更为全面的书本和实践知识,更让我感受到了浓浓的同窗之情及师生情。虽然大学四年间做过不少实验作业,但是独立完成这样一个操作系统还是第一次,遇到困难时理所当然,我也有所心理准备,但是超出自身能力的部分还是需要寻求教师及同学的帮助。在此,我衷心地感谢我的指导教师,可以说,没有教师我就不能顺利完成这次设计。他总是在一筹莫展的时候为我指引方向。比如在开题报告,我的指导教师就细致地指导我该怎么有逻辑地将自己的想法和做法表达清楚,在此由衷感谢他。在设计的过程中,教师百忙之中也乐于给予我指导,不管多晚给教师发消息,不管是不是上班时间去教师办公室寻求帮助,他总能在第一时间对我施以援手,由于我在设计期间需要离校实习,不能及时到教师办公室检查设计进度,当时已经是晚上6点多,我匆匆赶到办公室时,教师依然在伏案办公,桌上是同学们的中期检查报告,检查完毕业设计后,他又继续查看同学们的中期报告,并督促我及时上交报告。教师给的意见总是一针见血地指出我设计及论文中的不足,并举例详细说明我的改进方法,不得不佩服他的学术水平及教学水平。在我开始着手实现这个设计的时候,通过需求分析及可行性分析对该系统有了较为浅显的认识;但是在我真正开始实现时发现事情并没有这么简单。任何成功都不是一蹴而就的,就算是一个简单的毕业设计也需要日积月累的知识和经验。于是,我便去寻求老师和同学的帮助,这也使得我得以从不同的角度重新考虑我的设计。终于,这个系统在我内心有了雏形。在真正实现这个设计的过程中,学习新知识是必定的,同时那些由于时间关系或者本来就没有掌握牢固的知识也有了进一步巩固的机会。然而最重要的是了解到如何作为一个开发人员,以开发人员的思维来看待软件开发的步骤和方法策略。
本次毕业设计的完成预示着大学时代的句号,在这个设计过程中,我收获到的绝不仅仅是做项目过程中要到的知识,更多的是同窗情谊和师生情谊,最重要的是做任何事情都要具备的认真态度,以及真正职业的思考方式方法。
之后,我要感谢的是全体软件工程系的大力协助,在大学的四年间,您们严谨的教学态度和科学的工作方法对我们的成长有很重要的影响。没有您们为我们无私的传授知识和获取知识的方法,就没有我们能够在软件行业立足的基础。
最后我要感谢的,是我们的学校。不仅教育我们知识,对我们的思想道德的培养更多。使我们不仅能够做一名合格的大学生,更能在走出校园时,能够成为一名合格的社会人。