成为一个架构师是我的理想,一路向菜鸟级架构师前进哈哈哈
有些东西记了忘,忘了又记.自少自己觉得记忆力极差,什么AOP IOC的.要是现在有人问AOP有几种通知,好像5种吧,什么before,after,around什么玩意呀哈哈哈。shiro#24#24#24安全验证????
cookie,session,token啊啊啊啊啊啊啊,忘了呀,session存在服务器的是吧?要反问面试官了.
JDK代理,CGLIB代理?????SqlSessionFactory??????一万个问号,只能说时曾相识,他可能还认识我,反正我快不认识了.51一星期时间,将系统的整理边。
前端:
通过Vue脚手架创建Vue项目(需要安装Nodejs)
命令创建项目
Vue项目已经创建好了.其中的一些命令解释:
用Vscode打开项目
接下来,我们开始对原始的Vue项目进行改造,这里使用的UI为Element-UI
查看EelementUI官网 Element - The world's most popular Vue UI framework
npm install element-ui
因为项目里用到了less
如果已经安装less和less-loader
这个是因为版本不兼容问题导致的,不断的报错中总结以下经验,首先去除掉之前的依赖
npm uninstall --save sass-loader
npm uninstall --save less-loader
npm uninstall --save less
然后严格控制版本下载依赖,
如果没有安装less直接用
npm install less-loader@4.1.0 --save-dev
npm install less@3.9.0 --save-dev
因为要向后端发送请求安装axios依赖:npm install axios
其实axios和ajax的区别可以简单理解成ajax的升级版
接下来,需要修改main.js和路由index.js,都做了解释,我需要将首页改为登录页面
完整的Login.vue
登录
重置
启动下,Vue首页登录页面做好了
现在开始搭建我们的后台SpringBoot
创建SpringBoot项目方式很多,常见的:
1.用Spring插件
2.直接创建Maven项目导入jar包和yml文件
这里用第二种方式:创建聚合工程,父子依赖
现在也是大部分公司里搭建的项目,基本都是父子依赖,主要是在pom.xml里引入依赖,然后可以将src删除
项目结构
父级工程引入的依赖项
4.0.0 com.test boottest1.0-SNAPSHOT test_common 8 8 pom org.springframework.boot spring-boot-starter-parent2.4.5 org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-aoporg.springframework.boot spring-boot-devtoolsruntime true org.projectlombok lomboktrue org.springframework.boot spring-boot-starter-testtest org.springframework.boot spring-boot-starter-jdbcmysql mysql-connector-javaruntime com.baomidou mybatis-plus-boot-starter3.4.2 redis.clients jedisorg.springframework.data spring-data-redisio.springfox springfox-swagger22.9.2 io.springfox springfox-swagger-ui2.9.2
创建自己工具API
子集会自动依赖父级
工具API可以写比较常用的比如POJO的基类,任何数据的插入相信创建时间,更新时间是少不了的,还有用户,角色,公用返回类等等可以放在工具API里
然后创建个具体业务系统 这里取名test_manage
在test_manage的pom.xml文件里我们需要添加依赖,依赖于工具API
然后创建个SpringBoot的启动文件,和yml文件配置端口和 数据库,注意SpringBoot启动文件要放在所有包文件之前,比如说com.test.XX.XX,那么启动文件要放在com或com.test下,不然无法扫描到某些类
大概就先这样配置完成,写个Controller测试下启动
OK的,写了半天以为自己写错了.还算顺利边写边发文,一下快4点了
我们先来设置一些配置,比如mybatis或者mybatis-plus,分页,swagger等等
这里统一用mybatis.前面依赖里的mybatis-plus可以注释掉
引入mybatis依赖,和分页依赖
org.mybatis.spring.boot mybatis-spring-boot-starter2.2.2 com.github.pagehelper pagehelper-spring-boot-starter1.2.10
整体的项目结构:
测试了一下分页,也是OK的
具体的一些代码,感觉写不下去了,累死......
这个,那个业务不写了.好累
看两张图,关于过滤器和拦截器
第二张自己画的好累
这里写个过滤器(Filter),拦截器(Interceptor),监听器我也不知道在SpringBoot中如何去写,算了吧,看开点.
这里介绍下过滤器,拦截器,监听器的概念
范围不同:过滤器是Servlet规范规定的,只能用于Web程序中,而拦截器既可以用于Web程序,也可以用于Application、Swing程序中
规范不同:过滤器是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的
深度不同:过滤器只能在Servlet前后起作用,而拦截器能够深入到方法前后、异常抛出前后等,因为拦截器的使用具有更大的弹性,在Spring框架中优先使用拦截器
机制不同:过滤器是基于函数回调的,而拦截器是基于Java的反射机制拦截器只能对controller请求起作用,而过滤器则可以对几乎所有的请求起作用
拦截器可以访问controller的上下文、值栈里的对象,而过滤器不能访问
在controller的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑
简单些讲,过滤器是属于servlet规范的,学习过servlet的应该指导DisPatcherServlet的由来,因为原先要写N多Servlet, 而过滤器拦截在DisPatcherServlet之前,SpringMVC的拦截器在去找具体Controller前进行拦截.,一般拦截器很多公司用来查看token,至少我看到的是这样
两步:1.自定义一个拦截器实现HandlerInterceptor ;2.注册拦截器实现WebMvcConfigurer
写个拦截器
注册拦截器
简单用的话,你也可以看下一个请求从Controller到返回所用的时间,而且一个系统允许有多个拦截器
先后顺序看你注册前后感觉象切面,但是看了下源码又像另开线程做的.不懂啊。
关于跨域:
前端启动端口设置了8080.而后端是8090端口,这样就产生了跨域问题
百度了下跨域的准确解释:
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。
在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问问题。在请求的过程中我们要想回去数据一般都是post/get请求,所以..跨域问题出现。
对于后端SpringBoot项目来说,很简单在控制器上加
@CrossOrigin注解
该注解可以指定具体某个方法
跨域问题:前端启动端口号为8080,
而后端是8090,这样就存在跨域问题
具体的可百度对跨域的解释
来个好玩的AOP,那个忘记了的5种通知哈哈哈哈
AOP(面向切面编程),比如说系统需要记录用户行为日志.
我们以登录来说,比如记录登录ip,时间,访问的接口传入参数等等
具体做法有很多.这只是其中一种方式
1.自定义注解
2.在需要记录的接口加该注解
3.写AOP
可以设计对应的表.那么存在的问题是,客户体验不好,毕竟耗时.如何在做好用户行为日志同时,又不影响用户体验.
那么我们可以将记录用户行为日志的方法另开一个线程
具体的做法比如说
一招搞定,加@Async
注意:
在Spring框架里除了Aop类需要写 @Aspect 还需要在启动类加@EnableAspectJAutoProxy SpringBoot里默认都已经配置好了 不需要在启动类加注解
而@Async注解需要在启动类加注解
这里另外给大家一个方法,我们不用spring初始化线程池,自己来
public class TaskExcutor {
private TaskExcutor(){}
private static class ExcutorHolder{
private static final ExecutorService EXCUTOR = new ThreadPoolExecutor(
5,30,60L, TimeUnit.SECONDS,
new SynchronousQueue(),
new ThreadPoolExecutor.CallerRunsPolicy());
}
private static class SchedulerHolder{
private static final ScheduledExecutorService SCHEDULER =
Executors.newScheduledThreadPool(5);
}
public static Future> submit(Runnable task){
return ExcutorHolder.EXCUTOR.submit(task);
}
public static ScheduledFuture> schedule(Runnable task,long delay, TimeUnit unit){
return SchedulerHolder.SCHEDULER.schedule(task,delay,unit);
}
}
具体使用方法,我们就不加@Async了能怎么地.很少写lamda表达式,以显风骚
关于SpringMvc的全局异常处理,其实用到的也是AOP,所以AOP用处还是很强大的.
改天继续
关于全局异常处理.
具体异常该怎么办
比如new 一个返回类
if(e instanceof UnknownAccountException){
result.setMessage("用户名不存在");
}else if(e instanceof LockedAccountException){
result.setMessage("账户已被锁定");
}else if(e instanceof IncorrectCredentialsException){
result.setMessage("密码不正确");
}else if(e instanceof AuthorizationException){
result.setMessage("没有权限");
}else{
result.setMessage("认证或授权失败");
}
return result;
等等随自己喜欢
关于SpringBoot的定时任务
超级简单
其实工作中常用到的基本就这些了.
另外说个
pro环境:生产环境
test环境:测试环境
dev环境:开发环境
开发中,各个环境的端口,数据库可能不同。
其实很简单.
那么我们就可以指定配置文件,还可以通过maven配置profiles打包,自己选择dev配置还是prod配置,以及打包完整指令



