[企业权限管理项目]项目介绍

项目介绍

项目框架

这是一个旅游网站的后台权限管理项目,前端采用了AdminLTE制作,后台框架采用Spring+SpringMVC+Mybatis搭建的一个AllinOne架构的项目,,在IDEA下进行多模块项目开发,数据库选用Oracle

项目功能

功能方面主要分为产品操作,订单操作,权限管理,

产品操作

  • 作为旅游产品后台 开发,旅游产品是指一次旅游的出发城市,时间,价格等,在页面(上点击/基础数据/产品管理)就会进行展示所有产品(这是一个查询数据库findAll操作),展示页面上可以进行产品的添加(页面跳转,表单提交)(产品表insert操作),产品的删除操作(请求携带产品id,后台对产品表的delete操作),(产品添加删除完后再controller层会重定向到findAll.do请求)
  • 涉及数据表一张product表

订单操作

在/前台页面/基础数据/订单操作会显示所有订单(order的findAll.do请求)展示,展示页面显示页面上用国人开发的分页插件PageHelper分页显示,展示页面可以点击button进行订单详情显示(findbyId),订单详情查询涉及到查会员表,旅客表,产品表三表联查最后显示再页面上行

用户登录

后台权限管理采用了SpringSecurity安全框架(主要时认证授权操作),做后台系统的用户的登录和登出管理操作,并设置了只有具有Admin权限的用户才能登录

用户管理操作

在侧边栏,点击系统管理/用户管理/会显示所有用户信息(/user/finaAll.do),查询单个用户详情,还可以实现用户添加和删除操作(DeleteById),注意新添加的用户还还没有做权限关联的

角色管理操作

在侧边栏,点击系统管理/角色管理/会显示角色信息(/role/finaAll.do),添加角色

资源权限操作

在侧边栏,点击系统管理/资源权限管理/会显示所有资源权限信息(permission/findAll.do),资源权限的添加

权限关联与控制

用户关联角色

在user-list.jsp点击“添加角色”,勾选可以添加的角色进行提交

角色关联权限

在role-list.jsp页面上点击“添加权限”,勾选可以添加的资源权限进行提交

权限控制

在SS.xml中开启JSR-250注解然后再需要的方法上@RolesAllowed并给value赋值权限名即可(省略ROLE_前缀)即可,本系统设计了USER,GUEST,ADMIN三种角色权限

AOP日志操作

  • 在侧边栏,点击系统管理/日志管理会显示每一次操作的用户名,ip,操作的时间方法等日志信息()

( 利用Spring的AOP技术创建切面类做日志记录并把日志信息存入数据库,主要把访问者用户名ip,访问资源url,访问时长,访问方法保存放入数据库)

问题

为什么选用AdminLTE

AdminLTE是开源的模板主题工具,提供了许多响应式可重用组件和页面模板能够开发效率提高,这里是我在Github下载的汉化版的AdminLTE,当然集成进项目的时候需要注意样式,js,和插件的目录位置

能不能介绍一下SSM的整合步骤

applicationContext.xml

在Spirng的配置文件 applicationContext.xml中1.配置扫描dao和dervice
2.spring整合mybatis(本质上是spring进行sqlsessionFactorybean管理,指定dao接口扫描)2.事务配置(声明式事务管理),配置数据库连接池(数据库连接池采用了C3P0,同时还需要配置用户名密码,驱动,数据库ip+port)

springmvc.xml配置

  • 配置扫描controller
  • 配置视图解析器
  • 设置静态资源不过滤
  • 开启SpringMVC注解支持

web.xml

  • 配置contexConfig.location(完成spring配置文件加载工作)
  • 配置监听器(监听request域对象的创建和销毁的)
  • 配置dispatcherservelet前端控制器
  • 解决中文乱码过滤器

配置文件

注意配置文件一定要放到web工程下的/resources下,才会被自动扫描到

静态资源

静态资源要放在WEB工程模块的/webspp目录下

产品操作的出发时间处理

前端发送到后端的数据是String格式,从数据库查询的时间是时间戳格式,此时在.jsp页面上调试时显示是为空值的,又因为时间的转换在多个业务中都会使用所以抽取一个时间处理类放到了Utils模块中用来做时间的转换,用到了java中的SimpleDateForate这个类来将时间转换为yyyy-mm-dd这种格式的字符串返回给前端

介绍一个数据库表的设计

数据库表的设计严格遵守数据库三大范式的规定

  • 产品表product,
  • 订单表orders:uuid作为主键且给建表时通过Oracel的函数DefaultSYS_GUID返回随机值,订单相关,产品id作为外键(产品只有一个),会员id外键(一个< list>)
  • 会员表member:DefaultSYS_GUID作为主键uuid,个人信息相关,姓名电话,邮箱
  • 旅客表信息表traveller:DefaultSYS_GUID作为主键uuid,旅客详细信息(姓名,电话号码,证件号码等)
  • 订单-旅客中间表order_traveller

介绍一下项目里的多表操作

订单操作

  • 订单操作涉及到了订单表,产品表,会员表,traveller表四表联查,订单显示页面只查了订单表和产品id,订单详情时查了订单表显示信息,查了product表当前旅游产品详情,member表当前订单对应的单个会员信息,以及traveller表参与该旅游产品的所有旅游者的信息
  • 所以表的涉及在订单表中将productid和memberid作为外键同时由于订单与旅客之间多对多的关系用一张中间表做多对多关联查询

用户登录

由于登录时需要对根据用户id查询用户具有的角色,而用户与角色之间是多对多的关系,表设计了一张user_role中间表,先根据userid拿到对应的roleid,再根据roleid取role表中的角色返回一个list< Role>

用户管理

用户管理操作涉及到了users,roles,permission三张表,两两多对多,故设计了userid_roleid,roleid_permission两张中间表,做用户详情查询时,先根据userid查数据,根据userid查userid_roleid拿到所有roleid,再根据roleid查role表拿到list< role>,根据roleid_permissionid查到所有permissionid,再查permisson表拿到所有permission 返回list< permission>

关于用户关联角色,角色关联资源权限时

在用户关联角色时,是给用户添加角色,此时insert的是user_role这张表;在角色关联时,insert的是role_permission这张表

角色管理

用到哪些数据结构

timestamp
int
varchar

介绍一下分页插件的使用过程

如何进行项目调试

  • 在父工程pom.xml中引入Maven依赖
  • 在Mybatis applicationContext.xl中配置拦截器插件
  • 在service层调用Dao之前,调用PageHelper.startPage(获取第几页,默认查询总数) ,这个参数由前端携带而来,同时由于配置时添加了reasonable 这个分页合理化参数使得在.jsp页面上不会出现分页非法操作(比如到达第一页继续点上一页不会成功)

日志信息的查看

在heima_ssm_web/src/main/resources 加入日志log4j.properties重新启动日志,控制台日志信息的输出

思考

.jsp页面

  • 在进行.jsp页面的开发的时候,每个页面的样式都采用导航栏,侧边栏和主页面三部式布局,所以在后台每个.jsp制作时都要引入这header.jsp/aside.jso页面作为组件,而这个项目涉及到的.jsp页面有10多个,虽然前后端不分离的项目避免的跨域问题但是大量的,重复劳动开发效率低,代码调试也困难
  • 可重用组件,前后端分离Vue

页面添加操作

  • 在资源权限管理系统中经常由有例如添加某个用户,某个权限,添加角色的操作,实际上点击添加后是要跳转到一个add.jsp界面提交录入信息后的表单在后台做数据库插入操作,问题是这样又需要平白多开发许多.jsp页面,后台代码量大,代码冗余
  • 前后端分离,前端由Vue+ElemenUI开发

项目开发中遇到的困难(项目难点)

多表查询

  • 多表查询的逻辑,dao层的sql编写,注解的选用以及对结果集与实体类属性的对应封装
  • 捋清楚整个订单流程,通过画UML图的图解方式使得流程更加直观便于分析

关联操作的逻辑

在做用户关联角色操作时,业务逻辑的实现是比较复杂的,在user-list.jsp上点击添加角色,给controller发起请求 调用service,先根据userid在users表查询用户再根据查到的用户拿到

SS框架的使用

  • 当时配置好SS框架进行登录调试的时候,怎么都无法登录,在查阅多方面资料后,发现是在配置SS的时候先做了基于内存的ss调试,为了方便spring-security.xml中未配置密码加密方式,所以此时想要登陆时,必须要在输入密码时加上占位符才行
  • 使用了spring提供的security包下的加密类security.crypto.bcrypt.BCryptPasswordEncoder进行加密,配置进SS.xml,后续在添加用户的时候需要对录入的密码进行加密后再入库,且采用了盐值加密),由于使用的频繁将其配置成工具类放置到Utils模块中

securitysecurity框架的集成和调试

  • 继承SS需要先在pom.xml引入依赖
    • 配置spring-security.xml设置:配置不拦截的资源不需要认证的页面如登录页面登录失败页面,除此外所有请求路径都会拦截(可自定义),失败成功退出操作默认跳转的页面,密码加密方式,指定自定义的拿到用户名密码要进行认证访问的service
  • 做的是居于数据库的权限认证,所以自定义类实现UserDerailsService(作为Controller)并实现其中的loadUserByname()方法对根据前端jsp表单输入的用户名进行查询,不存在直接前端redirec到登录失败界面,存在则查询出用户实体类(且该实体类继承了UserDetails(要实现其中6个方法),查询到信息的同时还会调用getAuthority()方法(调用底层的SimpleGrantedAutohrity())对该用户具有的权限(进行一次查询)进行授权返回一个 List< SimpleGrantedAuthority> list )再自动交给SS框架验证
  • 在本项目中由于是权限管理,所以设置了只有具有Role_Admin的权限才能够登录成功
  • 一开始学习SS框架的时候一直很难理解整个认证的流程,一度让我很困惑,于是自己深入UserDetails,UserDetailsService的源码,查看其实现类或子接口,类继承结构图和底层的方法,结合开源社区开源认证代码才慢慢掌握,学习Java,源码是最好的工具,阅读源码能够一步步更好的掌握实现过程,从而明白如何做,为什么这么做,自己也能实现的跨越,对于业务逻辑的理解也会加深

AOP技术开发日志的实现

  • 因为一直以来对AOP的理解都比较抽象,通过AOP技术开发切面类做日志记录,在切面类的定义要加上除了@Component外的@Aspect注解声明一个切面类

前置通知中

  • 对于访问时间的获取通过前置同时拿到的一个时间与后置通知拿到的时间相减,在前置通知中拿到当前访问时间,调用nowdate()

  • 访问的类获取通过前置通知方法传入的JointPoint对象 jp.getTarget().getClass();获取

  • 获取访问方法的实现比较困难

    • 先要获取 jp.getSignature().getName()拿到访问方法名,
    • 调用jp.getArgs()方法拿到一个,Object[] args 为空(无参方法)则调用executionMethod = executionClass.getMethod(methodName)直接传入方法名即可,不为空则定义一个Class[]数组将args中的参数都放进去,然后调用 executionMethod = executionClass.getMethod(methodName, classArgs);

后置通知

  • 获取访问资源的url是由controller上的@RequestMapping注解值和方法上的@RequestMapping注解值组合而成,拿到当前类对象再通过其getAnnotation方法拿到注解对象,调用注解对象的getValue()方法拿到参数数组,取参数数组索引0的值即可,同理拿到方法上的值进行字符串拼接即可

  • ip的获取先要去web.xml中配置一个监听器拿到HttpRequest客户端请求对象,然后调用其getRemoteAddr()方法即可

  • 然后将这些信息封装进日志类的实体类对象中调用service层的save()方法即可

思考

  • 在AOP技术的日志实现中大量的使用了反射机制实现,加深了我对反射机制的理解,同时也更加意识到源码的重要性,也许不是这次开发我可能很少会ctrl+左键点击取查看一个注解的源码底层用一个string[]数组存储注解的value值,更别说理解切面类中如何获取注解值的操作了,对于Java还有一个全新的框架,源码是最好的学习方式

项目改进

SS框架业务的改进

  • 因为在本项目中主要对登录权限做了限制只允许具有Admin权限的用户登录,事实上只是这种程度的权限控制完全可以采用更易继承实现简单的Shiro实现,SS强大的地方是能够提供更加细粒度的控制(达到方法级别)
  • 本项目的改进方向我的思考是允许Admin和User角色的用户登录而具有Guest角色的用户无法进入,而User用户虽然能够进入,通过在后台系统Controller方法上加上@RolesAllowed注解阻止他对一些比如用户管理类的方法进行操作
  • 同时可以考虑直接用SS框架提供的权限标签在jsp页面中直接做权限的控制
RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。其主要功能有1.灵活可扩展性、2.海量消息堆积能力、3.支持顺序消息、4.多种消息过滤方式、5.支持事务消息、6.回溯消费等常用功能。 RocketMQ 核心的四大组件:Name Server、Broker、Producer、Consumer ,每个组件都可以部署成集群进行水平扩展。 2、适应人群 有一定的Java基础,并且有分布式项目开发经验。 3、课程价值 可以让初学者对分布式系统解耦有一定认识,并且能够通过快速使用RocketMQ实现分布式服务的异步通信,同时本课程还会通过项目案例实战让学员对RocketMQ的应用场景有所体会,最后再通过源码角度让学员对RocketMQ的原理有所理解,不仅做到“知其然”,亦“知其所以然”。 4、课程收获 1. 理解消息中间件MQ的优势和应用场景 2. 掌握RocketMQ的核心功能,以及各种消息发送案例 3. 通过电商项目深刻理解RocketMQ在使用项目中的落地应用 4. 通过RocketMQ高级功能和源码学习,对RocketMQ的技术细节和原理有更加透彻的理解 5、课程亮点 l  核心功能 n  MQ介绍 n  环境准备 n  RocketMQ高可用集群搭建 n  各种消息发送样例 l  综合练习 n  项目背景介绍 n  功能分析 n  项目环境搭建 n  下单功能,保证各服务的数据一致性 n  确认订单功能,通过消息进行数据分发 n  整体联调 l  高级功能 n  消息的存储和发送 n  消息存储结构 n  刷盘机制 n  消息的同步复制和异步复制 n  负载均衡 l  源码分析 n  路由中心NameServer n  消息生产者Producer n  消息存储 n  消息消费Consumer 6、主讲内容 章节一:核心功能 1.     快速入门 a)     MQ介绍 b)     作用 c)      注意事项 d)     各MQ产品比较 2.     RocketMQ环境搭建 a)     环境准备 b)     安装RocketMQ c)      启动RocketMQ d)     测试RocketMQ e)     关闭RocketMQ 3.     RocketMQ高可用集群搭建 a)     集群各角色介绍 b)     集群搭建方式 c)      双主双从集群搭建 d)     集群监控平台 4.     各种消息发送样例 a)     同步消息 b)     异步消息 c)      单向消息 d)     顺序消息 e)     批量消息 f)      过滤消息 g)     事务消息 章节二:项目实战 1.    项目背景介绍 (1)    电商高可用MQ实战 2.    功能分析 (1)    下单功能 (2)    支付功能 3.    项目环境搭建 (1)    SpringBoot (2)    Dubbo (3)    Zookeeper (4)    RocketMQ (5)    Mysql 4.下单功能,保证各服务的数据一致性 5.确认订单功能,通过消息进行数据分发 章节三:高级功能 1. 消息的存储和发送 2. 消息存储结构 3. 刷盘机制 (1)    同步刷盘 (2)    异步刷盘 4. 消息的同步复制和异步复制 5. 负载均衡 (1)    Producer负载均衡 (2)    Consumer负载均衡 章节四:源码分析 1.     路由中心NameServer a)     NameServer架构设计 b)     NameServer启动流程 c)      NameServer路由注册和故障剔除 2.     消息生产者Producer a)     生产者启动流程 b)     生产者发送消息流程 c)      批量发送 3.     消息存储 a)     消息存储流程 b)     存储文件与内存映射 c)      存储文件 d)     实时更新消息消费队列和存储文件 e)     消息队列与索引文件恢复 f)      刷盘机制 4.     过期文件删除机制 a)     消息消费Consumer b)     消费者启动流程 c)      消息拉取 d)     消息队列负载均衡和重新分布机制 e)     消息消费过程 f)      定时消息机制 g)     顺序消息
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页