springboot景区寄存管理系统(源码+sql+论文报告)

 针对传统人工行李寄存效率低和安全性不足等问题,设计并实现了一种由网页控制器组成的智能行李寄存系统。首先能够实现行李的寄存管理和行李柜管理以及记录查询和通知公告以及管理员等灵活控制菜单显示权限经过研究和测试结果显示,该行李寄存系统实现了行李的安全、高效、方便、快捷的存取,具有较好的应用前景

关键词:springboot;spring、Javabean、景区行李寄存系统

Aiming at the problems of low efficiency and insufficient security of traditional manual luggage storage, an intelligent luggage storage system composed of web controller is designed and implemented.First of all, it can realize the luggage storage management and luggage locker management as well as record inquiry, notice and announcement as well as the administrator and other flexible control menu display authority.The research and test results show that the baggage storage system has realized the safe, efficient, convenient and fast deposit and deposit of luggage, and has a good application prospect.

一、绪论

1.1引言

行李寄存是外出旅行经常需要的服务,在宾馆、汽车站、火车站、机场甚至景区,一般都有行李寄存处。传统的行李寄存是在行李箱包上挂一张卡片,卡片上写有行李编号、客户信息、寄存时间等内容,同时客户也持有一张具有相关信息的卡片。取行李时,客户持卡片由管理人员核对并从储物间寻找和取出行李。传统的寄存方式简单易行,但只适合小规模行李寄存。当寄存行李数量较大时,要在众多的行李中寻找所需物件,光靠人工方式,难度增加,效率低下,还存在出错的风险。效率低下耽误客户时间,一旦出错后,将给客户产生难以估量的损失。客户寄存物品后,还需要妥善保管寄存卡片,凭卡片领取行李,其他人无法代为领取,这都不符合现代人的生活方式。随着人们生活工作节奏的加快,传统的行李寄存方式已经显示出严重的不足。近年来,随着物联网技术的应用普及,出现了智能化管理的寄存系统。但大多是通过物联网技术实现对寄存柜的管理,或者实现无人自助存取。这类寄存系统对寄存柜的智能化程度要求很高,成本高昂,短期内难以普及。 

1.2系统设计概述

现代化的计算机高速发展和技术日渐成熟以及行李寄存是外出旅行经常需要的服务,需要建立一个基于互联网智能化的景区行李寄存系统、大家已经深刻认识到它的功能如此强大,对人类社会的方方面面发挥着很重要的作用。计算机应用得到广泛的推行,选用计算机技术建立一个景区行李寄存系统景区的信息进行管理与普通的人工管理相比具备许多优点。

1.3研究的内容

  该景区行李寄存系统能够实现用户的管理、菜单的管理、角色管理、部门信息管理、景区行李柜管理、行李入柜管理、行李出柜管理、行李寄存记录信息查询和景区通知公告信息管理以及修改个人信息密码等具体功能。

  

二、相关技术介绍

2.spring

  Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。

2.2SpringMVC

  SpringMVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,SpringMVC和Struts、Struts2非常类似。SpringMVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handlermappings、viewresolution、locale以及themeresolution来处理请求并且转到对应的视图。SpringMVC请求处理的整体流程如图:

 

2.3mybatis

mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据

2.4JSP技术

JSP(全称JavaServerPages)是由SunMicrosystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTMLXML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。

JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

2.5jQuery

jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“writeLess,DoMore”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE6.0+、FF1.5+、Safari2.0+、Opera9.0+等

2.6Mysql

MySQL是一款安全、跨平台、高效的,并与PHP、Java等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的MySQLAB公司开发、发布并支持,由MySQL的初始开发人员DavidAxmark和MichaelMontyWidenius于1995年建立的。

目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多公司都采用MySQL数据库以降低成本。

MySQL数据库可以称得上是目前运行速度最快的SQL语言数据库之一。除了具有许多其他数据库所不具备的功能外,MySQL数据库还是一种完全免费的产品,用户可以直接通过网络下载MySQL数据库,而不必支付任何费用。

MySQL特点

下面总结了一下MySQL具备的特点。

1)功能强大

MySQL中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能,可以处理每天访问量超过数亿的高强度的搜索Web站点。MySQL5支持事务、视图、存储过程、触发器等。

2)支持跨平台

MySQL支持至少20种以上的开发平台,包括Linux、Windows、FreeBSD、IBMAIX、AIX、FreeBSD等。这使得在任何平台下编写的程序都可以进行移植,而不需要对程序做任何的修改。

3)运行速度快

高速是MySQL的显著特性。在MySQL中,使用了极快的B树磁盘表(MyISAM)和索引压缩;通过使用优化的单扫描多连接,能够极快地实现连接;SQL函数使用高度优化的类库实现,运行速度极快。

4)支持面向对象

PHP支持混合编程方式。编程方式可分为纯粹面向对象、纯粹面向过程、面句对象与面向过程混合3种方式。

5)安全性高

灵活和安全的权限与密码系统,允许基本主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码的安全。

6)成本低

MySQL数据库是一种完全免费的产品,用户可以直接通过网络下载。

7)支持各种开发语言

MySQL为各种流行的程序设计语言提供支持,为它们提供了很多的API函数,包括PHP、ASP.NET、Java、Eiffel、Python、Ruby、Tcl、C、C++、Perl语言等。

8)数据库存储容量大

MySQL数据库的最大有效表尺寸通常是由操作系统对文件大小的限制决定的,而不是由MySQL内部限制决定的。InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建,表空间的最大容量为64TB,可以轻松处理拥有上千万条记录的大型数据库。

9)支持强大的内置函数

PHP中提供了大量内置函数,几乎涵盖了Web应用开发中的所有功能。它内置了数据库连接、文件上传等功能,MySQL支持大量的扩展库,如MySQLi等,可以为快速开发Web应用提供便利。

数据库的应用

数据库是计算机应用系统中的一种专门管理数据资源的系统。数据有多种形式,如文字、数码、符号、图形、图像及声音等,数据是所有计算机系统所要处理的对象。我们所熟知的一种处理办法是制作文件,即将处理过程编成程序文件,将所涉及的数据按程序要求组成数据文件,再用程序来调用,数据文件与程序文件保持着一定的关系。

在计算机应用迅速发展的情况下,这种文件式管理方法便显出它的不足。比如,它使得数据通用性差、不便于移植、在不同文件中存储大量重复信息、浪费存储空间、更新不便等。

而数据库系统便能解决上述问题。数据库系统不从具体的应用程序出发,而是立足于数据本身的管理,它将所有数据保存在数据库中,进行科学的组织,并借助于数据库管理系统,以它为中介,与各种应用程序或应用系统接口,使之能方便地使用数据库中的数据。

其实简单地说,数据库就是一组经过计算机整理后的数据,存储在一个或多个文件中,而管理这个数据库的软件就称为数据库管理系统。一般一个数据库系统(DatabaseSystem)
可以分为数据库(Database)与数据管理系统(DatabaseManagementSystem,DBMS)两个部分。主流的数据库软件有Oracle、Informix、Sybase、SQLServer、PostgreSQL、MySQL、Access、FoxPro和Teradata等等。

数据库在Web开发中的重要地位

归根结底,动态网站都是对数据进行操作,我们平时浏览网页时,会发现网页的内容会经常变化,而页面的主体结构框架没变,新闻就是一个典型。这是因为我们将新闻存储在了数据库中,用户在浏览时,程序就会根据用户所请求的新闻编号,将对应的新闻从数据库中读取出来,然后再以特定的格式响应给用户。
Web系统的开发基本上是离不开数据库的,因为任何东西都要存放在数据库中。所谓的动态网站就是基于数据库开发的系统,最重要的就是数据管理,或者说我们在开发时都是在围绕数据库在写程序。所以作为一个Web程序员,只有先掌握一门数据库,才可能去进行软件开发。

 

三、相关工具使用介绍

3.1 eclipse开发工具

Eclipse概述:
在实际项目开发过程中,由于使用记事本编写代码速度慢,且不容易排错,所以程序员很少用它来编写代码。为了提高程序的开发效率,大部分软件开发人员都是使用集成开发工具(IDE,IntegratedDevelopmentEnvironment)来进行Java程序开发的。正所谓“工欲善其事,必先利其器”,接下来就为读者介绍一种Java常用的开发工具——Eclipse。
Eclipse是由蓝色巨人IBM花费巨资开发的一款功能完整且成熟的IDE集成开发环境,它是一个开源的、基于Java的可扩展开发平台,是目前最流行的Java语言开发工具。Eclipse具有强大的代码编排功能,可以帮助程序开发人员完成语法修正、代码修正、补全文字、信息提示等编码工作,大大提高了程序开发的效率。

Eclipse的设计思想是“一切皆插件”。就其本身而言,它只是一个框架和一组服务,所有功能都是将插件组件加入到Eclipse框架中来实现的。Eclipse作为一款优秀的开发工具,其自身附带了一个标准的插件集,其中包括了Java开发工具(JDK),因此,使用Eclipse工具进行Java程序开发不需要再安装JDK以及配置Java运行环境。下面将为读者具体的讲解Eclipse工具的使用。

Eclipse的安装非常简单,仅需要对下载后的压缩文件进行解压即可完成安装操作,接下来分别从安装、启动、工作台以及透视图等方面进行详细的讲解。

1、安装Eclipse开发工具
Eclipse是针对Java编程的集成开发环境(IDE),读者可以登录Eclipse官网http://www.eclipse.org免费下载。Eclipse安装时只需将下载好的ZIP包解压保存到指定目录下(例如D:\eclipse)就可以使用了。本使用的Eclipse版本是Mars2。

2、启动Eclipse开发工具
Eclipse的启动非常简单,直接在Eclipse安装文件中运行eclipse.exe文件即可,接下来会出现如下图所示的启动界面。


Eclipse启动完成后会弹出一个对话框,提示选择工作空间(Workspace),如下图所示:

注意:Eclipse每次启动都会出现选择工作空间的对话框,如果不想每次都选择工作空间,可以将此图【Usethisasthedefaultanddonotaskagain】复选框选中,这就相当于为Eclipse工具选择了默认的工作空间,再次启动时将不再出现提示对话框。

工作空间用于保存Eclipse中创建的项目和相关设置。此处使用Eclipse提供的默认路径为工作空间,当然,也可以单击【Browse】按钮来更改,工作空间设置完成后,单击【OK】按钮即可。

工作空间设置完成后,由于是第一次打开,会进入Eclipse的欢迎界面,如下图所示:


上图所示的欢迎界面中有四个功能图标,鼠标悬浮在图标上面即会显示这些信息。

3、Eclipse工作台
在Eclipse欢迎界面单击关闭欢迎界面窗口,就进入Eclipse工作台界面,Eclipse工作台主要由标题栏、菜单栏、工具栏、透视图四部分组成,如下图所示:


从上图可以看到,工作台界面上有包资源管理视图、文本编辑器视图、大纲视图等多个模块,这些视图大多都是用来显示信息的层次结构和实现代码编辑,下面是Eclipse工作台上的几种主要视图的作用:

PackageExplorer(包资源管理器视图):用来显示项目文件的组成结构。

Editor(文本编辑器):用来编写代码的区域。

Problems(问题视图):显示项目中的一些警告和错误。

Console(控制台视图):显示程序运行时的输出信息、异常和错误。

Outline(大纲视图):显示代码中类的结构。

视图可以有自己独立的菜单和工具栏,它们可以单独出现,也可以和其他视图叠放在一起,并且可以通过拖动随意改变布局的位置。
Eclipse工作台界面处于中间位置的是文本编辑器(editor),代码编写要在该区域中完成,文本编辑器具有代码提示、自动补全、撤销(undo)等功能,关于如何使用这些功能将在后面进行详细讲解。

4、Eclipse透视图

透视图(Perspective)是比视图更大的一种概念,用于定义工作台窗口中视图的初始设置和布局,目的在于完成特定类型的任务或使用特定类型的资源。在Eclipse的开发环境中提供了几种常用的透视图,如Java透视图、资源透视图、调试透视图、小组同步透视图等。用户可以通过界面右上方的透视图按钮在不同的透视图之间切换。选择要进入的透视图,也可以在菜单栏中选择【Window】→【OpenPerspective】→【Other】打开其他透视图,如下图所示:


在弹出的“OpenPerspective”对话框中选择用户要打开的透视图,如下图所示。同一时刻只能有一个透视图是活动的,该活动的透视图可以控制哪些视图显示在工作台界面上,并控制这些视图的大小和位置,在透视图中的设置更改不会影响编辑器的设置。


如果一不小心错误的操作了透视图(Perspective),比如关闭了透视图中的包资源管理视图,这时可以通过【Window】→【ShowView】来选择想要打开的视图,也可以重置透视图,步骤如下:在菜单栏选择【Window】→【ResetPerspective】,如下图所示,这样就可以恢复到原始状态。

3.2 tomcat服务器

3.2.1概念

    Tomcat服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP程序的首选。

3.2.2原理

  Tomcat结构图:

           

  Tomcat主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。

    一个Container容器和一个或多个Connector组合在一起,加上其他一些支持的组件共同组成一个Service服务,有了Service服务便可以对外提供能力了,但是Service服务的生存需要一个环境,这个环境便是Server,Server组件为Service服务的正常使用提供了生存环境,Server组件可以同时管理一个或多个Service服务。

3.2.3Connector

    一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的tcp连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。 

Tomcat中有两个经典的Connector,一个直接侦听来自Browser的HTTP请求,另外一个来自其他的WebServer请求。HTTP/1.1Connector在端口8080处侦听来自客户Browser的HTTP请求,AJP/1.3Connector在端口8009处侦听其他WebServer(其他的HTTP服务器)的Servlet/JSP请求。 

Connector最重要的功能就是接收连接请求然后分配线程让Container来处理这个请求,所以这必然是多线程的,多线程的处理是Connector设计的核心。

2、Container

                

    Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servletclass对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。 

Context还可以定义在父容器Host中,Host不是必须的,但是要运行war程序,就必须要Host,因为war中必有web.xml文件,这个文件的解析就需要Host了,如果要有多个Host就要定义一个top容器Engine了。而Engine没有父容器了,一个Engine代表一个完整的Servlet引擎。

Engine容器 

Engine容器比较简单,它只定义了一些基本的关联关系

Host容器 

Host是Engine的子容器,一个Host在Engine中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。

Context容器 

Context代表Servlet的Context,它具备了Servlet运行的基本环境,理论上只要有Context就能运行Servlet了。简单的Tomcat可以没有Engine和Host。Context最重要的功能就是管理它里面的Servlet实例,Servlet实例在Context中是以Wrapper出现的,还有一点就是Context如何才能找到正确的Servlet来执行它呢?Tomcat5以前是通过一个Mapper类来管理的,Tomcat5以后这个功能被移到了request中,在前面的时序图中就可以发现获取子容器都是通过request来分配的。

Wrapper容器 

Wrapper代表一个Servlet,它负责管理一个Servlet,包括的Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器,它没有子容器了,所以调用它的addChild将会报错。 

Wrapper的实现类是StandardWrapper,StandardWrapper还实现了拥有一个Servlet初始化信息的ServletConfig,由此看出StandardWrapper将直接和Servlet的各种信息打交道。

3、其他组件

    Tomcat还有其它重要的组件,如安全组件security、logger日志组件、session、mbeans、naming等其它组件。这些组件共同为Connector和Container提供必要的服务。

3.2.4HTTP请求过程

    

TomcatServer处理一个HTTP请求的过程

1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的CoyoteHTTP/1.1Connector获得。 

2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。 

3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。 

4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“”的Context去处理)。 

5、path=“/test”的Context获得请求/index.jsp,在它的mappingtable中寻找出对应的Servlet。Context匹配到URLPATTERN为*.jsp的Servlet,对应于JspServlet类。 

6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。 

7、Context把执行完之后的HttpServletResponse对象返回给Host。 

8、Host把HttpServletResponse对象返回给Engine。 

9、Engine把HttpServletResponse对象返回Connector。 

10、Connector把HttpServletResponse对象返回给客户Browser。

3.3javajdk环境配置

下载好jdk,并按照提示一步步安装,最后记下jdk所在的安装位置,这里假设在C:\ProgramFiles(x86)\Java\jdk1.8.0_20现在开始配置环境变量。鼠标右键点击“计算机”,选择属性,点击“高级系统设置”,在点击“高级”,最后点击“环境变量”,进入界面开始配置

提示:若选择“用户变量”,则本次配置的变量只对该用户有效

 若选择“系统变量”,则对所有用户有效。这里我们选择“系统变量”。我们在“系统变量”里点击“新建”。变量名为:JAVA_HOME

变量值为:C:\ProgramFiles(x86)\Java\jdk1.8.0_20记得确定啊。

ps:变量值就是你jdk安装的路径我这里为C:\ProgramFiles(x86)\Java\jdk1.8.0_20

我们在“系统变量”里点击“新建”。

变量名为:CLASSPATH

变量值为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;     (记得最前面有一个"."和一个“;”)。

ps:变量值如果为“.;"貌似也行(我有一本书上是这样的)

我们在“系统变量”里找到“path”(原来就有的,我们只需要添加一项)。

在配置该变量之前注意做好path的备份啊,以防误删!!!!!

需要添加的是:  jdk的安装路径加上“\bin”,

像我这里就是:“;C:\ProgramFiles(x86)\Java\jdk1.8.0_20\bin”我是把他加在原有的最后面,如果要加在最前面就要这样:“C:\ProgramFiles(x86)\Java\jdk1.8.0_20\bin;”

看到没,其实就是分号的位置有变化。。。。。。。。。。。。。。。。。。。。。。。。。

ps:这一处要添加的,我在网上试了好多办法都不行,我就自己试了一下自己的想法,把网上所要添加的改为了 "jdk的安装路径+\bin",结果就ok了。

以下是我的配置仅供参考:

C:\ProgramFiles(x86)\NVIDIACorporation\PhysX\Common;C:\ProgramFiles(x86)\MicrosoftDirectXSDK(August2007)\Utilities\Bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0;C:\ProgramFiles(x86)\Java\jdk1.8.0_20\bin

配置好后,来到cmd界面输入“java”和“javac”查看是否配置成功!

其实只要“JAVA_HOME”和“CLASSPATH”配置正确,java命令就会成功,如果“path”配置有问题,javac命令就会失败。

、需求分析和可行性

4.1系统功能概述

主要模块设计如下:

使用安全权限管理框架,实现登录验证和登录信息的储存,根据不同的登录账户,分发权限角色,对不同页面url进行角色设置。

主要功能模块设计

用户登录模块

用户信息管理模块

角色信息管理模块

部门信息管理模块

行李寄存柜管理模块

用户行李寄存管理模块

寄存记录查询模块

通知公告模块

修改密码和退出注销模块。

  

4.2系统运行环境

开发系统:Windows10

JDK版本:JavaJD K1.8

开发工具:idea开发工具

数据库版本:mysql5

数据库可视化工具:navicat for mysql

服务器:apache tomcat 

其他工具:谷歌浏览器控制台调整网页布局

    Postman接口工具进行接口测试

4.3技术设计

此系统需要java面向对象编程基础,数据库知识和功能分析。根据目前阶段所掌握的相关专业知识,以及这学期和之前学习掌握的java编程知识和数据库应用知识以及前端知识做出一个这样的基于、springmvcspringboot轻量级框架网页版的景区行李寄存系统平台。

4.4社会可行性

在互联网技术高速发展的今天,通过互联网的传播会让企业更容易的创造更多的经济效益,通过网页版景区行李寄存系统平台的实现,有了更大的市场和学生以及校园用户,在这样一个大环境下把资源统筹规化起来,就会获得高效的信息和效益。

4.5安全性可行性

人们在使用网络的时候越来越重视信息的安全性,这也促进了加密技术的发展,同时应用加密技术能够有效提升网络信息的安全性。本景区行李寄存系统平台系统采用了加密保护、页面发送请求获取数据采用关键部分采用post请求对数据传输的保护机制、避免请求数据暴露在浏览器上面、以及不同用户具有不同权限操作通过这些安全性操作,保证系统的稳定性以及可靠性。

4.6经济可行性

 服务器端的安装简洁明了,客户机无需再装任何软件,通过浏览器就可以直接访问,可以直接接入Internet,无论您身在何处只要您可以访问Internet都可以使用本系统。本系统对计算机配置的要求不高,企业机房更换下来的低配置电脑都可以完全满足需要、所以在经济上具有完全的可行性。

4.7法律可行性

本系统是自行开发的景区行李寄存系统平台系统,是很有实际意义的系统,开发环境软件和使用的数据库都是开源代码,开发这个系统不同于开发普通的系统软件,不存在侵权等问题,即法律上是可行的。

、系统设计

5.1系统模式架构

 本系统次采用B/S架构、即浏览器和服务器架构模式进行设计,随着Internet技术的崛起起,对C/S架构的一种变化或改进的架构模式。在目前这种架构下,用户工作是通过WWW.xxx.com浏览器来实现数据访问,极少部分事务逻辑在前端页面(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层结构。B/S架构是WEB兴起后的一种网络架构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护。客户机上只要安装一个浏览器(Browser),服务器安装OracleSybaseInformix等数据库。浏览器通过WebServer同数据库进行数据交互。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。

5.2系统层次架构

 系统根据以上的逻辑结构,分为3层结构。

 系统按照处理层次从上至下依次划分为

 (1)展现层:

 它处理与用户的交互界面、数据传输,信息收集等。

 (2)应用层:

 它是系统功能逻辑处理层,主要处理展现层发出的请求,并将处理结果返回展现层。

 (3)核心层:

 它是系统运行核心及应用层的基础,提供应用层权限控制、数据读取等。

5.3用户需求分析

对用例进行定义最基本的就是明确与系统日常运行有关联的角色,包括但不限于各类人员以及软硬件等等。以调研得到的结果为基础,本项目抽象出下面的角色,同时得到景区相关部门的许可以及认定。

管理员:系统管理员能够对景区行李寄存系统进行全部的管理和拥有最高权限操作。

其他角色:其他角色管理员可以进行灵活分配、通过管理员新建角色、给角色对应的权限管理信息、然后给用户分配角色进行管理、灵活控制。

5.4系统功能详情设计

系统主要设计采用Java语言开发、采用springmvcspringboot为后台框架、数据库框架采用mybatis、前端采用layui、jquery、js等技术来实现功能。

主要模块设计如下:

用户登录管理模块

用户输入账号和密码选择角色点击登录按钮进行登录、根据输入的账号和密码以及角色来判断是否登录成功以及给出对应提示信息。

用户信息管理模块

   用户信息模块主要是景区所有用户信息的管理、可以录入用户相关信息进行添加用户、修改用户信息、删除用户和查看用户等操作。

角色信息管理模块

  角色信息模块主要是景区所有角色信息的管理、可以录入角色相关信息进行添加角色、修改角色信息、删除角色和查看角色等操作。同时在添加的时候可以给角色分配对应权限管理来控制菜单显示。超级管理员admin账户不受角色管理控制。拥有最高权限。

菜单信息管理模块

  菜单信息模块主要是景区寄存系统所有菜单信息的管理、可以录入菜单相关信息进行添加菜单、修改菜单信息、删除菜单和查看菜单色等操作。同时在添加菜单的时候可以选择菜单的类型为目录级别还是菜单级别以及按钮级别。通过角色来控制菜单的显示。

景区行李柜管理模块

   景区行李柜信息模块主要是景区寄存系统所有行李柜信息的管理、可以录入行李柜相关信息进行添加行李柜单、修改行李柜信息、删除行李柜和查看行李柜等操作。

用户行李寄存管理模块

   用户行李寄存信息模块主要是景区寄存系统所有用户行李寄存信息的管理、可以录入用户行李寄存相关信息进行添加用户行李寄存、修改用户行李寄存信息、删除用户行李寄存和查看用户行李寄存等操作。普通人员只能查看和添加自己的行李寄存信息、管理员可以对用户行李柜寄存进行修改和删除操作。

用户行李寄存记录管理模块

   用户行李寄存记录信息模块主要是景区寄存系统所有用户行李寄存记录信息的管理、可以录入用户行李寄存记录相关信息查看用户行李寄存记录等操作。查看具体的操作日期和人员以及柜子使用情况。

通知公告管理模块

   通知公告信息模块主要是景区寄存系统所有通知公告信息的管理、管理员可以录入通知公告相关信息和添加以及修改、查看通知公告模块操作。普通人员只能查看搜索通知公告信息。

5.4源码架构

、系统实现

6.1程序主要类设计

6.1.1用户类设计

/**

 * 系统用户

 *

 * @author Mark s.com

 */

@Data

@TableName("sys_user")

public class SysUserEntity implements Serializable {

private static final long serialVersionUID = 1L;

/** * 用户ID */

@TableId

private Long userId;

/** * 用户名 */

@NotBlank(message="用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})

private String username

/*** 密码*/

@NotBlank(message="密码不能为空", groups = AddGroup.class)

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)

private String password;

/*** 盐*/

private String salt

@NotBlank(message="邮箱不能为空", groups = {AddGroup.class, UpdateGroup.class})

@Email(message="邮箱格式不正确", groups = {AddGroup.class, UpdateGroup.class})

private String email

/** * 手机号*/

private String mobile/*** 状态  0:禁用   1:正常 */

private Integer status

/** * 角色ID列表 */

@TableField(exist=false)

private List<Long> roleIdList;

/*** 创建时间*/

private Date createTime

6.1.2菜单设计

@Data

@TableName("sys_menu")

public class SysMenuEntity implements Serializable {

private static final long serialVersionUID = 1L;

/*** 菜单ID*/

@TableId

private Long menuId;

/*** 父菜单ID,一级菜单为0*/

private Long parentId;

/*** 父菜单名称*/

@TableField(exist=false)

private String parentName;

/*** 菜单名称*/

private String name;

/*** 菜单URL*/

private String url;

/*** 授权(多个用逗号分隔,如:user:list,user:create)*/

private String perms;

/*** 类型     0:目录   1:菜单   2:按钮*/

private Integer type;

/*** 菜单图标*/

private String icon;

/*** 排序*/

private Integer orderNum;

6.1.3角色权限类设计

private static final long serialVersionUID = 1L;

/** * 角色ID*/

@TableId

private Long roleId;

/*** 角色名称*/

@NotBlank(message="角色名称不能为空")

private String roleName;

/** * 备注 */

private String remark;

/** * 部门ID */

@NotNull(message="部门不能为空")

private Long deptId;

/** * 部门名称*/

@TableField(exist=false)

private String deptName;

@TableField(exist=false)

private List<Long> menuIdList;

@TableField(exist=false)

private List<Long> deptIdList;

/** * 创建时间*/

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

private Date createTime;

6.1.4寄存行李柜设计

@Data

public class JcLuggage {

    private static final long serialVersionUID = 1L;

    @TableId

    private Integer id;

    private String title;

    private String num;

    private String bz;

    private Date createTime;

    private String createBy;

    private String ty;

    private String stu;

6.1.5用户行李寄存设计

@Data

public class JcUserDeposit {

    private static final long serialVersionUID = 1L;

    @TableId

    private Integer id;

    private Integer userId;

    private String username;

    private String phone;

    private String luggageNum;

    private String luggageTitle;

    private String luggageStu;

    private String bz;

    private String adminUser;

    private String ssjq;

    private Date createTime;

    private Date takesTime;

;

6.1.6寄存记录设计

@Data

@TableName("jc_record")

public class JcRecord {

    @TableId

    private Long id;

    private String username;

    private String info;

    private Date jcTime;

    private String luggaeTitle;

    private String bz;

6.1.7通知公告设计

@Data

@TableName("inform")

public class Inform {

    @TableId

    private long id;

    private String title;

    private String content;

    private Date createTime;

    private String createBy;

    private String type;

6.2系统功能模块设计

6.2.1关键代码设计实现

6.2.1.1登录模块设计

用户输入账号密码和验证码进行登录、发送请求到后台SysLoginController处理器登录方法进行数据请求验证、将处理结果返回给前端、前端根据返回的数据和结果完成对应的显示和页面跳转。

前端主要样式代码:

 <div class="login-logo"> <b>景区行李寄存管理系统</b></div>

  <!-- /.login-logo --><div class="login-box-body"><p class="login-box-msg">管理员登录</p> <div v-if="error" class="alert alert-danger alert-dismissible"><h4 style="margin-bottom: 0px;"><i class="fa fa-exclamation-triangle"></i> {{errorMsg}}</h4></div><div class="form-group has-feedback"> <input type="text" class="form-control" v-model="username" placeholder="账号"><span class="glyphicon glyphicon-user form-control-feedback"></span> </div><div class="form-group has-feedback">

 <input type="password" class="form-control" v-model="password" placeholder="密码"><span class="glyphicon glyphicon-lock form-control-feedback"></span></div> <div class="form-group has-feedback"> <input type="text" class="form-control" v-model="captcha" @keyup.enter="login" placeholder="验证码"><span class="glyphicon glyphicon-warning-sign form-control-feedback"></span>

      </div> <div class="form-group has-feedback"> <img alt="如果看不清楚,请单击图片刷新!" class="pointer" :src="src" @click="refreshCode">

            <a href="javascript:;" @click="refreshCode">点击刷新</a></div>

前端页面布局以及输入框填写用户id和密码选择角色提交请求登录请求login到后台处理。后台接受用户发送的请求和传递的参数进行访问数据库并查询数据表中有无当前用户对象、将结果返回给前端、前端根据不同信息进行提示登录成功或失败。

  /**

 * 登录

 */

@ResponseBody

@RequestMapping(value = "/sys/login", method = RequestMethod.POST)

public R login(String username, String password, String captcha) {

String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);

if(!captcha.equalsIgnoreCase(kaptcha)){

return R.error("验证码不正确");

}

try{

Subject subject = ShiroUtils.getSubject();

UsernamePasswordToken token = new UsernamePasswordToken(username, password);//md5+Jiayan

subject.login(token);

}catch (UnknownAccountException e) {

return R.error(e.getMessage());

}catch (IncorrectCredentialsException e) {

return R.error("账号或密码不正确");

}catch (LockedAccountException e) {

return R.error("账号已被锁定,请联系管理员");

}catch (AuthenticationException e) {

return R.error("账户验证失败");

}

return R.ok();

}

  }

登录成功显示后台主要页面。

6.2.1.2全局异常处理设计

/**

 * 处理自定义异常

 */

@ExceptionHandler(RRException.class)

public R handleRRException(RRException e){

R r = new R();

r.put("code", e.getCode());

r.put("msg", e.getMessage());

return r;

}

@ExceptionHandler(DuplicateKeyException.class)

public R handleDuplicateKeyException(DuplicateKeyException e){

logger.error(e.getMessage(), e);

return R.error("数据库中已存在该记录");

}

@ExceptionHandler(AuthorizationException.class)

public R handleAuthorizationException(AuthorizationException e){

logger.error(e.getMessage(), e);

return R.error("没有权限,请联系管理员授权");

}

@ExceptionHandler(Exception.class)

public R handleException(Exception e){

logger.error(e.getMessage(), e);

return R.error();

}    

6.2.1.3:数据库连接配置

spring:

  datasource:

    type: com.alibaba.druid.pool.DruidDataSource

    druid:

      driver-class-name: com.mysql.jdbc.Driver

      url: jdbc:mysql://localhost:3306/renren-jqjc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

      username: root

      password: 123456

      initial-size: 10

      max-active: 100

      min-idle: 10

      max-wait: 60000

      pool-prepared-statements: true

      max-pool-prepared-statement-per-connection-size: 20

      time-between-eviction-runs-millis: 60000

      min-evictable-idle-time-millis: 300000

      #Oracle需要打开注释

      #validation-query: SELECT 1 FROM DUAL

      test-while-idle: true

      test-on-borrow: false

      test-on-return: false

      stat-view-servlet:

        enabled: true

        url-pattern: /druid/*

        #login-username: admin

        #login-password: admin

      filter:

        stat:

          log-slow-sql: true

          slow-sql-millis: 1000

          merge-sql: false

        wall:

          config:

            multi-statement-allow: true

6.2.1.4:springboot全局配置文件

# Tomcat

server:

  tomcat:

    uri-encoding: UTF-8

    max-threads: 1000

    min-spare-threads: 30

  port: 8080

  servlet:

    context-path: /renren-admin

spring:

  profiles:

    active: dev

  jackson:

    date-format: yyyy-MM-dd HH:mm:ss

    time-zone: GMT+8

  servlet:

    multipart:

      max-file-size: 100MB

      max-request-size: 100MB

      enabled: true

  redis:

    database: 0

    host: localhost

    port: 6379

    password:      # 密码(默认为空)

    timeout: 6000ms  # 连接超时时长(毫秒)

    jedis:

      pool:

        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)

        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)

        max-idle: 10      # 连接池中的最大空闲连接

        min-idle: 5       # 连接池中的最小空闲连接

  freemarker:

    suffix: .html

    request-context-attribute: request

renren:

  cluster: false  #集群配置  true集群环境   false单机环境,还需打开pom.xml里的spring-session-data-redis注释

  globalSessionTimeout: 3600   #单机环境,session过期时间为60分钟

  redis:

    open: false  #是否开启redis缓存  true开启   false关闭

#mybatis

mybatis-plus:

  mapper-locations: classpath*:/mapper/**/*.xml

  #实体扫描,多个package用逗号或者分号分隔

  typeAliasesPackage: io.renren.modules.*.entity

  global-config:

    #数据库相关配置

    db-config:

      #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";

      id-type: AUTO

      #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"

      field-strategy: NOT_NULL

      #驼峰下划线转换

      column-underline: true

      logic-delete-value: -1

      logic-not-delete-value: 0

    banner: false

  #原生配置

  configuration:

    map-underscore-to-camel-case: true

    cache-enabled: false

    call-setters-on-nulls: true

    jdbc-type-for-null: 'null'

6.2.1.5用户寄存物品列表设计

前端代码主要实现:通过jqGrid表格填写行和列名称以及调用后台list方法获取数据并进行数据渲染和分页显示数据查询以及通过关键字搜索数据。

$(function () {

    $("#jqGrid").jqGrid({

        url: baseURL + 'sys/JcUserDeposit/list',

        datatype: "json", colModel: [

{ label: 'id', name: 'id', index: 'id', width: 60 },

{ label: '用户名称', name: 'username', index: 'username', width: 80 }, { label: '用户手机号', name: 'phone', index: 'phone', width: 80 },

{ label: '柜子编号', name: 'luggageNum', index: 'luggageNum', width: 80 }, { label: '柜子名称', name: 'luggageTitle', index: 'luggageTitle', width: 80 }, { label: '备注信息', name: 'bz', index: 'bz', width: 80 }, { label: '入柜时间', name: 'createTime', index: 'createTime', width: 80 }, { label: '管理员联系方式', name: 'adminUser', index: 'adminUser', width: 80 },

    ],

        viewrecords: true,height: 385, rowNum: 10,rowList : [10,30,50], rownumbers: true, rownumWidth: 25,autowidth:true,multiselecttrue,

后台主要代码实现:

@RequestMapping("/list")

    public R list(@RequestParam Map<String, Object> params){

        PageUtils page = JcUserDepositService.queryPage(params);

        return R.ok().put("page", page);

}

后台业务实现层执行操作、获取前端传递的参数信息、判断关键字搜索是否存在、通过用户名和id进行搜索返回分页好的列表数据给前端进行展示。

@Override

    public PageUtils queryPage(Map<String, Object> params) {

        String username = (String)params.get("username");

        String userId = (String)params.get("userId");

        IPage<JcUserDeposit> page = this.page(

            new Query<JcUserDeposit>().getPage(params),

            new QueryWrapper<JcUserDeposit>()

                .like(StringUtils.isNotBlank(username),"username", username)

                    .eq(StringUtils.isNotBlank(userId),"user_id", userId)

        );

        return new PageUtils(page);

    }

6.2.1.6用户添加寄存物品设计

用户选择未使用的寄存柜、输入备注信息和联系方式完成入柜操作。

前端主要样式和代码实现:

<div class="form-group"><div class="col-sm-2 control-label">请选择柜子名称</div> <div class="col-sm-10"> <select class="form-control"  name ="pname"  id="pname"> <option>请选择</option></select> </div>

</div>  <div class="form-group"><div class="col-sm-2 control-label">备注信息</div> <div class="col-sm-10"><input type="text" class="form-control" v-model="JcUserDeposit.bz" placeholder="备注信息"/>

 </div></div><div class="form-group"><div class="col-sm-2 control-label">联系方式</div><div class="col-sm-10"><input type="text" class="form-control" v-model="JcUserDeposit.phone" placeholder="联系方式"/> </div> </div><div class="form-group"><div class="col-sm-2 control-label"></div> <input type="button" class="btn btn-primary" @click="saveOrUpdate" value="确定"/>   <input type="button" class="btn btn-warning" @click="reload" value="返回"/> </div>

后台代码实现:

接受前端发过来的用户行李寄存入柜请求、获取JcUserDeposit对象信息进行数据保存、在保存的时候获取jcLuggage 行李柜信息、将当前行李柜的信息状态改为已使用。当前用户行李柜的信息设置为正在使用中。将当前信息记录保存在jcRecord行李寄存记录对象表中、在后台管理员可以查看。

 @RequestMapping("/save")

    public R save(@RequestBody JcUserDeposit JcUserDeposit){

        //修改柜子使用状态

        JcLuggage jcLuggage = jcLuggageServiceImpl.getJcLuggageByNum(JcUserDeposit.getLuggageNum());

        jcLuggage.setStu("已使用");

        jcLuggageService.saveOrUpdate(jcLuggage);

        JcUserDeposit.setCreateTime(new Date());

        JcUserDeposit.setUsername(getUser().getUsername());

        JcUserDeposit.setUserId(getUserId().intValue());

        JcUserDeposit.setAdminUser(jcLuggage.getCreateBy());

        JcUserDeposit.setLuggageStu("使用中");

        JcUserDepositService.save(JcUserDeposit);

//        保存操作记录

        JcRecord jcRecord=new JcRecord();

        jcRecord.setUsername(getUser().getUsername());

        jcRecord.setJcTime(new Date());

        jcRecord.setLuggaeTitle(JcUserDeposit.getLuggageTitle());

        DateFormat df2 = DateFormat.getDateTimeInstance();

         String date=df2.format(new Date());

        jcRecord.setInfo("用户【"+getUser().getUsername()+"】于【"+date+"】在"

                +"【"+JcUserDeposit.getLuggageTitle()+"】"

                +"存放了"+"【"+JcUserDeposit.getBz()+"】");

        jcRecordService.save(jcRecord);

        return R.ok();

    }

}

6.2.2主要效果功能截图

6.2.2.1登录页面:

6.2.2.2主页显示

6.2.2.3系统管理

6.2.2.4寄存行李柜管理和添加

6.2.2.5用户行李寄存入柜管理:

6.2.2.6用户行李寄存出柜物品信息:

6.2.2.7用户寄存存取记录查看

6.2.2.8通知公告信息管理

学生选课后台代码实现逻辑步骤:

//选课操作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

@RequestMapping(value="/stuSelectedCourse")

publicStringstuSelectedCourse(intid)throwsException{

//获取当前用户名。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Subjectsubject=SecurityUtils.getSubject();

Stringusername=(String)subject.getPrincipal();

SelectedCourseCustomselectedCourseCustom=newSelectedCourseCustom();

selectedCourseCustom.setCourseid(id);

selectedCourseCustom.setStudentid(Integer.parseInt(username));

SelectedCourseCustoms=selectedCourseService.findOne(selectedCourseCustom);

if(s==null){selectedCourseService.save(selectedCourseCustom);

}else{

return"redirect:/student/selectedCourse";

//退课操作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

@RequestMapping(value="/outCourse")

publicStringoutCourse(intid)throwsException{

Subjectsubject=SecurityUtils.getSubject();

Stringusername=(String)subject.getPrincipal();

SelectedCourseCustomselectedCourseCustom=newSelectedCourseCustom();

selectedCourseCustom.setCourseid(id);

selectedCourseCustom.setStudentid(Integer.parseInt(username));

selectedCourseService.remove(selectedCourseCustom);

return"redirect:/student/selectedCourse";

//已选课程。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

@RequestMapping(value="/selectedCourse")

publicStringselectedCourse(Modelmodel)throwsException{

//获取当前用户名。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Subjectsubject=SecurityUtils.getSubject();

StudentCustomstudentCustom=studentService.findStudentAndSelectCourseListByName((String)subject.getPrincipal())

List<SelectedCourseCustom>list=studentCustom.getSelectedCourseList();

model.addAttribute("selectedCourseList",list);

return"student/selectCourse";

6.2.2.9我的行李存取管理

、数据库设计

7.1表基本设计

数据库采用mysql5版本、满足数据库设计三范式。

编码采用utf8--UTF-8Unicode

排序规则采用utf8_general_ci

7.2数据库三范式要求:

通过在大学期间学习的相关课程——《数据库基础与应用》,并查阅相关文献,我了解到数据库目前是六大设计方式,分别是1NF、2NF3NFBCNF、4NF和5NF。它们之间的关系是:5NFÌ4NFÌBCNFÌ3NFÌ2NFÌ1NF。即通过第二范式设计需要满足第一范式的要求,以此类推。但是就我的设计需求而言,只需做到最基本的要求即可(满足1NF2NF、3NF三大范式)。

一、第一范式

1NF是对属性的原子性,要求属性具有原子性,就是不可再分解;

二、第二范式

2NF是对记录的唯一性,要求记录有唯一标识,即就是实体的唯一性,即不存在部分依赖;

三、第三范式

3NF是对字段的冗余性,也就是要求任何字段不能由其他字段派生出来,它要求字段都不能有冗余,就是不存在传递依赖[11]

6.3数据库表ER图

6.4用户表设计

;

6.5角色表设计 

6.6菜单表设计 

6.7寄存行李柜表设计

6.8用户存放行李表设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/713579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网页右键不能审查元素解决办法

网页右键不能审查元素解决办法 1.问题复现2.解决方法 1.问题复现 有的网站右键不能审查元素 这时是javascript 中的onselectstart"return false" 被禁止右键了。 2.解决方法 隐私和安全--->网络设置 网络设置--->javascript 然后回到不能审查元素的网页 …

数据结构01 栈及其相关问题讲解【C++实现】

栈是一种线性数据结构&#xff0c;栈的特征是数据的插入和删除只能通过一端来实现&#xff0c;这一端称为“栈顶”&#xff0c;相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说&#xff0c;栈就像一个放乒乓球的圆筒&#xff0c;底部是封住的&#xff0c;如果你想…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

exfat文件系统无法NFS导出的问题

最近项目中移植了exfat-linux驱动&#xff0c;但发现exfat格式的U盘无法用exportfs命令在NFS上导出。这篇文章记录了分析、解决方法。 一、问题现象 问题描述&#xff1a;exfat驱动更新后&#xff0c;exfat格式的U盘用exportfs命令NFS导出会报错 $ exportfs -o ro,fsid0,no_ro…

快消品经销商如何进行有效的团队激励?

很多经销商会面临员工工作不积极、吃大锅饭的现象&#xff0c;导致企业人力成本浪费严重&#xff0c;工作效率也得不到提升&#xff0c;因此经销商老板们必须进行一些绩效考核&#xff0c;然后开展一些有效的激励政策&#xff0c;这样通过提成激励来提高员工的积极性。 1、梳理…

SQL深度解析:掌握这些技巧,让你的数据库查询如虎添翼!

前言 随着大数据时代的来临&#xff0c;数据库的角色愈发重要。SQL作为使用最为广泛的数据查询语言&#xff0c;其深度解析与优化对于数据密集型应用来说至关重要。掌握高级SQL技巧不仅可以提升开发效率&#xff0c;还能显著提高数据查询的性能和灵活性。本文将探讨一些关键的S…

QT信号与槽/窗口组件优化/使用QT制作QQ登录界面

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;…

表面声波滤波器——SAW 基本介绍(1)

声表面波特点与应用 声表面波&#xff0c;也称为表面声波&#xff08;surface acoustic wave&#xff09;&#xff0c;是指在弹性体的自由表面上产生并沿着表面或界面传播的各种模式的波&#xff0c;包括瑞利波(Rayleighwave)&#xff0c;勒夫波(Lovewave)等。 具有以下特点:…

mediamtx流媒体服务器测试

MediaMTX简介 在web页面中直接播放rtsp视频流&#xff0c;重点推荐&#xff1a;mediamtx&#xff0c;不仅仅是rtsp-CSDN博客 mediamtx github MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理&#xff0c;允许发布&#xff0c;读取&…

MySQL JDBC驱动包引入有版本要求吗

提示&#xff1a;有关数据库的任何操作&#xff0c;请事先都做好备份&#xff0c;一定不会错的&#xff1b; 文章目录 前言一、com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver如何选择&#xff1f;1、概念2、引入驱动3、总结 前言 新老项目的交替中&#xff0c;如果你使用的…

天阳科技集团北京卡洛其项目管理专家李先林受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 天阳科技集团北京卡洛其项目管理专家李先林先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“应用软件项目管理标准化实践探讨”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1…

基于ChatGPT的大型语言模型试用心得

近年来&#xff0c;ChatGPT这样的大型语言模型&#xff0c;它如同一颗冉冉升起的新星&#xff0c;迅速在商业、教育、娱乐等多个领域照亮了创新的天空&#xff0c;极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…

Zabbix Centos8 安装笔记

Zabbix 安装笔记 安装环境 Centos 8 正常发行版 安装版本 Zabbix 7 (LTS) 安装步骤 1、关闭防火墙 systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/c…

【笔记】复制Edge的网址粘贴后自动变成中文标题超链接

问题 1、从edge复制的网址粘贴直接显示网页内容名称而不是网址url。 2、复制任何网址粘贴到CSDN里面粘贴时直接转换成标题超链接&#xff08;很讨厌的功能习惯&#xff09;。 而如上两种问题不是互相影响的&#xff0c;就算设置了Edge的粘贴方式&#xff0c;复制到CSDN的文章…

【Kubernetes】Helm--包管理工具

​​​​​​​ 微服务是什么&#xff1f; 微服务把大包解耦成小包&#xff0c;使用的时候使用java -jar包启动服务 Helm 什么是Helm&#xff1f; 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁…

机器,学习没有捷径

1 捷径学习 1.1 你捷径学习了么 深度学习因为其优异的学习能力&#xff0c;已经成为推动人工智能发展当之无愧的主力军。深度学习在NLP和CV等不同的场景下都展现了优异的能力。但深度学习也存在一个与生俱来的问题&#xff1a;捷径学习。 捷径学习中的捷径表示的是一种有缺陷…

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读&#xff1a; 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff09;于 2024 年 4 月 25 日- 27 日在南京圆满召开&#xff0c;主题为“ AGI 时代下的空间数据智能”&#xff0c;旨在深入推动空间数据智能研究的理论进步与应…

mysql:简单理解mysql mvcc的可重复读

# 原理 假设有这样的sql begin select&#xff08;或update、insert、delete&#xff09; ... commit当执行【begin】的时候&#xff0c;标记有一个新事务要开始&#xff0c;但是事务还没有真正开始&#xff0c;事务id还没有产生当执行事务里面的第一个sql语句时&#xff08;…

【JS重点15】原型对象概述

目录 一&#xff1a;构造函数缺陷 二&#xff1a;原型 1 原型是是什么 2 原型对象的作用 3 原型对象this指向问题 4 利用原型对象添加方法 给JS内置构造函数Array添加最大值方法 给JS内置构造函数Array添加求和方法 三&#xff1a;Constructor属性 四&#xff1a;如何…

「茶桁 AI 秘籍-CV 篇」预告

Hi, 大家好。 我是茶桁。 咱们的《茶桁的 AI 秘籍》系列距离上一个系列课程《人工智能 BI 核心》已经有一段时间了&#xff0c;终于有时间可以写 CV 部分的课程&#xff0c;主要也是最近一段时间我确实有点忙不过来。 那么咱们 CV 的课程会有一些变化&#xff0c;就是会改为收…