- 绪论
1.1 研究意义和背景
随着我国经济的持续发展,汽车已经逐步进入了家庭。汽车行业的发展,也带动了汽车配件行业的快速发展。 汽车配件行业的迅猛发展, 使得汽配行业的竞争越来越激烈。如何在激烈的竞争中取胜,是每家汽车零部件企业当前所面临的严峻挑战。 21世纪是知识经济的时代,管理者必须运用科学的管理手段进行企业经营,方能在激烈的竞争中获胜。先进的管理模式,在很大程度上必须借助计算机来完成。目前,汽车配件销售企业的计算机管理水平还很低,相比其它许多行业仅是处在刚开始使用的阶段,企业采用电脑管理业务、财务、生产流程等诸多环节已成为汽配企业的必然趋势。汽车配件厂仓库管理系统在现在的汽车行业中已经是一个广泛应用的系统, 无论是大型的汽车配件厂,还是中小型的汽车配件行都可见其踪影。其之所以这么受欢迎 , 是因为汽车配件厂仓库管理系统囊括了配件进、出、存管理的全过程, 管理种类繁多 , 出入数 据发生频繁。此管理系统也渐渐进入了各大小汽车配件厂,对于厂领导, 希望能对仓库内的汽车配件库存状态了如指掌,为决策管理提供科学依据,而对厂内的工作人员,期 望能够避免繁琐的手工操作 , 甩掉陈旧的手工计算账目方式 , 达到事半功倍的效果。 本文要设计开发的汽车配件厂仓库进销存计算机管理系统能从宏观和微观上调控配件的库存量,自动提供仓库配件的进销存信息,让以上的期望都变成了现实, 使决策者有效管理库内的汽车配件,提高了企业的经济效益,也为员工减少了工作量,并提高了工作效率。因此, 这个课题具有很大的潜在价值并存在很大的实用性, 设计时其功能模块简洁清晰, 为以后软件维护和系统升级打好扎实的基础。
1.2 国内外研究现状、水平和发展趋势
随着市场经济发展,尤其是我国加入WTO ,融入经济全球化潮流,汽车配件行业已进入市场经济发展新时期,各部门和市场联系越来越紧密,我国汽配产业也进入新历史发展阶段。各部门和市场对汽配产业信息化的认识逐步提高,积极探索汽配产业信息体系如何向广大企业提供更服务。为了更好地服务于企业和用户,推进现代化进程,汽车配件行业信息体系建设已迫在眉睫。随着电子商务在市场运用深化,一部分批发市场“蒸发”了,悄然退出市场、使有形市场和无形市场相结合从而产生一种新模式。可以充分利用有形市场的优势,创办网上汽配系统,搭建网上数据管理,使汽车配件管理平台的发展成为必然。
1.3项目的可行性研究设计
此系统需要java面向对象编程基础,数据库应用知识以及功能分析。根据目前阶段所掌握的知识,根据这学期以及之前学习掌握的java编程知识和数据库应用知识以及前端知识做出一个这样的基于、springboot轻量级框架网页版的汽车配件管理平台。
1.4相关技术简介
1.4.1 spring
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性容器。尽管Spring框架自身对编程模型没有限制,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期的容器化,利用面向切面编程进行声明式事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等。Spring框架具有控制反转(IOC)特性,它提供了一种通过Java的反射机制对Java对象进行统一的配置管理的方法。Spring框架利用容器管理对象生命周期,容器可以通过扫描XML文件配置对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的Web框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。
1.4.2 mybatis
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开。mybatis通过配置文件关联到各实体类Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互,通过sqlSessionFactory拿到一个sqlSession,再执行sql。页面发送请求给控制器,控制器调用业务层处理,逻辑层向持久层发送请求,持久层与数据库交互,将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
1.4.3 Shiro权限框架
shiro是一个安全框架,是Apache的一个项目。shiro提供了:认证、授权、加密、会话管理、与web集成、缓存等模块。
1.1、模块介绍
Authentication:用户身份识别,可以是登录;
Authorization:授权,权限验证,验证某个已认证的用户是否拥有某个权限功能;即判断用户是否能做事情,常见:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某资源是否具有某个权限。
Session Manager:会话管理,用户登录后就是一次会话,在没有退出之前,所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的。
Cryptography:加密,保护数据的安全性,密码加密存储到数据库,而不是明文存储。
Web Support:Web支持,可以非常容易的集成到 javaweb 环境。
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率。
Concurrency:shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。
Testing:提供测试支持。
2、核心概念
Subject:主体,代表了当前操作用户,这个用户不一定是具体的人,与当前应用交互的任何东西都是subject,即抽象概念。所有Subject都绑定到SecurityManager,与Subject交互都会委托给SercurityManager;
SecurityManager:安全管理器;即所有与subject安全有关的操作都会与SecurityManager交互;且它管理着所有的Subject;它负责与里面的各个组件交互,也可以把它理解成springmvc中DispatcherServlet前端控制器。
Realm:域,安全数据源。shiro从Realm获取安全数据(如用户、权限),就是说SecurityManager验证用户身份,那么它需要从Realm得到用户相应角色、权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;
2、SecurityManager要验证用户身份,那么它需要从Realm中获取相对应的用户、角色、权限进行比较以确定用户身份是否合法。
总结:shiro不提供维护用户、权限,而是通过Realm让开发人员自己注入。
3、shiro内部架构介绍
1) Subject:主体,看到主体可以是任何与应用交互“用户”。
2) SecurityManager:相当于 SpringMVC 中的 DispatcherServlet 或者 Struts2 中的FilterDispatcher。它是 Shiro 的核心,所有具体的交互都通过 SecurityManager 进行控制。它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理。
3) Authenticator:认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,我们可以自定义实现。其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了。
4) Authrizer:授权器,或者访问控制器。它用来决定主体是否有权限进行相应的操作,即控制着用户能访问应用中的哪些功能。
5) Realm:可以有1个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的。它可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等。
6) SessionManager:如果写过 Servlet 就应该知道 Session 的概念,Session 需要有人去管理它的生命周期,这个组件就是 SessionManager。而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境。
7) SessionDAO:DAO 大家都用过,数据访问对象,用于会话的 CRUD。我们可以自定义 SessionDAO 的实现,控制 session 存储的位置。如通过 JDBC 写到数据库或通过 jedis 写入 redis 中。另外 SessionDAO 中可以使用 Cache 进行缓存,以提高性能。
8) CacheManager:缓存管理器。它来管理如用户、角色、权限等的缓存的。因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能。
9) Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密/解密的。
4、过滤器
当 Shiro 被运用到 web 项目时,Shiro 会自动创建一些默认的过滤器对客户端请求进行过滤。以下是 Shiro 提供的过滤器:
过滤器简称 | 对应的 Java 类 |
anon | org.apache.shiro.web.filter.authc.AnonymousFilter |
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | org.apache.shiro.web.filter.authz.PortFilter |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl | org.apache.shiro.web.filter.authz.SslFilter |
user | org.apache.shiro.web.filter.authc.UserFilter |
logout | org.apache.shiro.web.filter.authc.LogoutFilter |
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter |
解释:
/admins/**=anon # 表示该 uri 可以匿名访问 /admins/**=auth # 表示该 uri 需要认证才能访问 /admins/**=authcBasic # 表示该 uri 需要 httpBasic 认证 /admins/**=perms[user:add:*] # 表示该 uri 需要认证用户拥有 user:add:* 权限才能访问 /admins/**=port[8081] # 表示该 uri 需要使用 8081 端口 /admins/**=rest[user] # 相当于 /admins/**=perms[user:method],其中,method 表示 get、post、delete 等 /admins/**=roles[admin] # 表示该 uri 需要认证用户拥有 admin 角色才能访问 /admins/**=ssl # 表示该 uri 需要使用 https 协议 /admins/**=user # 表示该 uri 需要认证或通过记住我认证才能访问 /logout=logout # 表示注销,可以当作固定配置 |
1.4.4 SpringBoot
SpringBoot是Pivotal团队在2013年开始研发、2014年4月发布第一个版本全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,引用的不稳定性等问题得到了很好的解决。
SpringBoot具备的特征有:
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。
SpringBoot应用系统开发模板的基本架构设计从前端到后台进行说明:前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它们都是用Java语言编写的,渲染模板并输出相应文本,使得界面的设计与应用的逻辑分离,同时前端开发还会使用到Bootstrap、AngularJS、JQuery等;在浏览器的数据传输格式上采用Json,非xml,同时提供RESTfulAPI;SpringMVC框架用于数据到达服务器后处理请求;到数据访问层主要有Hibernate、MyBatis、JPA等持久层框架;数据库常用MySQL;开发工具推荐IntelliJIDEA。
1.4.5 jQuery
jQuery是一个快速、简洁JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等
1.4.6 Mysql
MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Michael Monty Widenius 于 1995 年建立的。
MySQL 的象征符号是一只名为 Sakila 的海豚,代表着 MySQL 数据库的速度、能力、精确和优秀本质。
图:MySQL 图标
目前 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 应用提供便利。
数据库的应用
数据库是计算机应用系统中的一种专门管理数据资源的系统。数据有多种形式,如文字、数码、符号、图形、图像及声音等,数据是所有计算机系统所要处理的对象。我们所熟知的一种处理办法是制作文件,即将处理过程编成程序文件,将所涉及的数据按程序要求组成数据文件,再用程序来调用,数据文件与程序文件保持着一定的关系。在计算机应用迅速发展的情况下,这种文件式管理方法便显出它的不足。比如,它使得数据通用性差、不便于移植、在不同文件中存储大量重复信息、浪费存储空间、更新不便等。而数据库系统便能解决上述问题。数据库系统不从具体的应用程序出发,而是立足于数据本身的管理,它将所有数据保存在数据库中,进行科学的组织,并借助于数据库管理系统,以它为中介,与各种应用程序或应用系统接口,使之能方便地使用数据库中的数据。其实简单地说,数据库就是一组经过计算机整理后的数据,存储在一个或多个文件中,而管理这个数据库的软件就称为数据库管理系统。一般一个数据库系统(Database System)
可以分为数据库(Database)与数据管理系统(Database Management System,DBMS)两个部分。主流的数据库软件有 Oracle、Informix、Sybase、SQL Server、PostgreSQL、MySQL、Access、FoxPro 和 Teradata 等等。数据库在 Web 开发中的重要地位归根结底,动态网站都是对数据进行操作,我们平时浏览网页时,会发现网页的内容会经常变化,而页面的主体结构框架没变,新闻就是一个典型。这是因为我们将新闻存储在了数据库中,用户在浏览时,程序就会根据用户所请求的新闻编号,将对应的新闻从数据库中读取出来,然后再以特定的格式响应给用户。Web 系统的开发基本上是离不开数据库的,因为任何东西都要存放在数据库中。所谓的动态网站就是基于数据库开发的系统,最重要的就是数据管理,或者说我们在开发时都是在围绕数据库在写程序。所以作为一个 Web 程序员,只有先掌握一门数据库,才可能去进行软件开发。
- 系统需求分析
2.1系统功能分析
1.用户模块管理:用户登录、用户的查询、添加、删除操作、
2.菜单模块管理:页面菜单的展示、添加操作、修改操作、删除操作、
3.角色模块管理:用户角色列表的查看、删除等操作、
4.日志管理: 日志信息的查看、添加、删除、
5.汽车配件类型管理:汽车配件类型管理列表查看、添加、修改、删除
6.汽车配件模块管理:汽车配件查询、添加、删除、修改、
7.通知公告模块管理:通知公告查询、添加、修改、删除操作
8.注销退出登录管理:
2.2系统运行环境
1.JavaJDK1.8环境配置、
2.Java运行在idea软件上,
3.数据库用mysql5版本数据库、
4.数据库采用Nacicat Mysql可视化工具、
- 基于主流的谷歌浏览器运行展示以及F12控制台调试样式、
6.操作系统:windows 10系统
- 系统设计
3.1系统模板设计
系统主要设计采用Java语言开发、采用springboot为后台框架、数据库框架采用mybatis、前端采用jquery、layui框架等
主要模块设计如下:
1.用户模块管理:用户登录、用户的查询、添加、删除操作、
2.菜单模块管理:页面菜单的展示、添加操作、修改操作、删除操作、
3.角色模块管理:用户角色列表的查看、删除等操作、
4.日志管理:日志信息的查看、添加、删除、
5.汽车配件类型管理:汽车配件类型管理列表查看、添加、修改、删除
6.汽车配件模块管理:汽车配件查询、添加、删除、修改、
7.通知公告模块管理:通知公告查询、添加、修改、删除操作
8.注销退出登录管理
3.2系统流程描述
- 3项目源码架构设计
- 系统实现
4.1 程序主要对象类设计
4.1.1用户管理员实体类
public class SysUserEntity implements Serializable {
private static final long serialVersionUID = 1L;
public static final String USERTYPE_SYSTEM = "老师";
/**
* 用户ID
*/
@TableId
@ApiModelProperty("用户名")
private Long userId;
/**
* 用户名
*/
@ApiModelProperty(value="用户名", required = true, dataType = "String")
@NotBlank(message="用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})
private String username;
/**
* 密码
*/
@ApiModelProperty(value="用户密码", required = true, dataType = "String")
@NotBlank(message="密码不能为空", groups = AddGroup.class)
private String password;
/**
* 盐
*/
private String salt;
/**
* 邮箱
*/
@NotBlank(message="邮箱不能为空", groups = {AddGroup.class, UpdateGroup.class})
@Email(message="邮箱格式不正确", groups = {AddGroup.class, UpdateGroup.class})
private String email;
/**
* 手机号
*
*/
@ApiModelProperty(value="手机号")
private String mobile;
/**
* 状态 0:禁用 1:正常
*/
@ApiModelProperty(value="手机号",notes = "0:禁用 1:正常")
private Integer status;
/**
* 角色ID列表
*/
@ApiModelProperty("角色ID列表")
@TableField(exist=false)
private List<Long> roleIdList;
/**
* 创建者ID
*/
@ApiModelProperty("创建者ID")
private Long createUserId;
/**
* 创建时间
*/
@ApiModelProperty("创建时间")
private Date createTime;
/**
* 创建时间
*/
@ApiModelProperty("用户类型")
private String userType;
/**
* 创建时间
*/
@JsonIgnore
private String submitTime;
private String invitationCode;4.1.4公告Announcement 实体类
@Data
public class Announcement {
private Integer id; //公告ID
@ValidateEntity(required=true,requiredMaxLength=true,requiredMinLength=true,maxLength=256,minLength=1,errorRequiredMsg="公告内容不能为空!",errorMaxLengthMsg="公告内容长度不能大于256!",errorMinLengthMsg="公告内容长度不能小于1!")
private String content; //公告内容
@ValidateEntity(required=true,errorRequiredMsg="公告发布对应管理员角色不能为空!")
private Integer adminId; //公告发布所属管理员
private Date createTime; //公告创建时间
private Date updateTime; //公告更新时间
4.1.4菜单实体类
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;
/**
* ztree属性
*/
@TableField(exist=false)
private Boolean open;
@TableField(exist=false)
4.1.4用户角色实体类
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
@TableId
private Long roleId;
/**
* 角色名称
*/
@NotBlank(message="角色名称不能为空")
private String roleName;
/**
* 备注
*/
private String remark;
/**
* 创建者ID
*/
private Long createUserId;
@TableField(exist=false)
private List<Long> menuIdList;
/**
* 创建时间
*/
private Date createTime;
4.1.4新闻公告类
public class Inform {
@TableId
private long id;
private String title;
private String content;
private Date createTime;
private String type;
}
4.1.4汽车配件类型类
@Data
@TableName("pj_type")
public class PjType {
@TableId
private long id;
private String name;
private String bz;
private Date createTime;
private String createBy;
}
4.1.4汽车配件详情类
@Data
@TableName("pj_name")
public class PjName {
@TableId
private long id;
private String title;
private String price;
private String inventory;
private String pjType;
private String scTime;
private String manufacturers;
private String bz;
4.3系统功能主要实现模块截图
4.3.1登录页面
用户访问地址:
http://localhost:8080/renren-admin/login.html
进入登录页面、输入账号密码信息进行登录
4.3.2 主页面
登录完成后进行系统管理首页、左侧是菜单导航栏、分别有系统管理、汽车配件类型管理和汽车配件详情信息管理以及通知公告管理、右侧是个人中心和用户修改密码功能
4.3.2.1 用户管理
点击用户管理查看当前用户列表信息、搜索功能以及用户信息的添加、修改删除功能
用户添加:
修改:
4.3.2.2 菜单管理
点击菜单管理查看当前菜单列表信息、搜索功能以及菜单信息的添加、修改删除功能、用户根据角色权限可以修改菜单显示和隐藏
菜单按钮目录添加:
4.3.2.3 角色管理
点击角色管理查看当前角色列表信息、搜索功能以及角色信息的添加、修改删除功能、不同角色具有不同权限
添加角色权限:
4.3.2.5 配件类型管理
点击配件管理查看当前配件类型列表信息、修改、删除功能、
4.3.2.6 配件管理
配件管理下面有多种类型的配件、每种配件下面有多个配件名称和数据可以进行添加、修改和删除操作、主要配件有发动机配件、燃油系配件、电气仪表配件以及制动系配件等
发动机配件:
燃油系配件:
曲柄连杆配件: |
4.3.2.4 新闻公告管理
用户点击通知公告查看一些配件相关信息信息
4.3.4部分关键源码展示:
4.3.4.1登录模块:
methods: {
refreshCode: function(){
this.src = "captcha.jpg?t=" + $.now();
},
login: function (event) {
var data = "username="+vm.username+"&password="+vm.password+"&captcha="+vm.captcha;
$.ajax({
type: "POST",
url: "sys/login",
data: data,
dataType: "json",
success: function(result){
if(result.code == 0){//登录成功
parent.location.href ='index1.html';
}else{
vm.error = true;
vm.errorMsg = result.msg;
vm.refreshCode();
}
}
/**
* 登录
*/
@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();
}
4.3.4.2 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
4.3.4.3 数据库连接配置文件:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/renren_security?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
4.3.4.4代码主启动类:
程序入口
@SpringBootApplication
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
4.3.4.5 过滤器实现类:
后台对数据请求进行拦截。以下请求放行、其他请求必须通过验证登录后才可以访问。
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
shiroFilter.setLoginUrl("/login.html");
shiroFilter.setUnauthorizedUrl("/");
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/webjars/**", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/statics/**", "anon");
filterMap.put("/login.html", "anon");
filterMap.put("/sys/login", "anon");
filterMap.put("/favicon.ico", "anon");
filterMap.put("/captcha.jpg", "anon");
filterMap.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(filterMap);
4.4数据库表设计
4.4.0数据库三范式要求:
一、第一范式
1NF是对属性的原子性,要求属性具有原子性,不可再分解;
二、第二范式
2NF是对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖;
三、第三范式
3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;
数据库采用mysql5版本、满足数据库设计三范式。
编码采用utf8 -- UTF-8 Unicode
排序规则采用utf8_general_ci
4.4.1数据库表ER图
4.4.2用户表设计
主要字段有:用户名、密码、邮箱、地址、部门信息、创建时间、手机号等信息
4.4.3角色表设计
主要字段有:角色id、用户、备注信息、创建时间
4.4.4菜单表设计
主要字段有:菜单id、pid、菜单名称、菜单路径、类型、图标、状态标识等字段
4.4.5配件类型表设计
主要字段有:id、名称、创建时间、创建人、备注等字段
4.4.6配件表设计
主要字段有:id、标题、厂家、生产日期、价格、库存等信息
4.4.7数据库sql文件
五、测试实例
测试一:
方案
登陆时,用户名或密码有一项为空或填写错误,系统是否出现预先设定的操作提示
预期效果 输入错误无法登陆
具体操作 用户名、密码、任意一项为空或者填写有误
结果 出现登录失败
结论 要求必须填写正确的用户名和密码,才能进入管理页面,测试成功
当用户名或密码输入错误或为空时提交界面
如图 所示。