6年老PHPer转学JAVA的心路历程

JAVA开发与PHP开发的区别,可能就和西班牙语翻译与英语翻译的区别差不多,抽象来看做的是一模一样的事情,但就因为语种不同待遇可以翻倍。
 
加上最近团队大量招JAVA,作为老开发也被迫要学习SpringBoot,不然作为“技术把关人”却完全把不了关也挺尴尬。
 
因项目原因最近的学习一直断断续续,这里的第几天仅仅是学习的第几天,每天实践时间大概在1-5小时不等,以练促学为主,遇到报错直接百度谷歌bing。
 
选取了一个小外包单项目练手(特意找甲方延长了2周时间),用于主仓库和各门店之间物流运输的小进销存,核心流程如下图所示:
0
 
 
 
第一天:
安装IDEA并破解,下载JDK,下载Maven,配置国内源,写一个最简单的基于springboot的hello word并编译后运行。这里要感谢年轻同事的协助,帮助省了很多事情,毕竟万事开头难嘛,很多事情听起来简单,但你亲自做会发现其实很繁琐,比如最简单的下载安装包,不得不说ORACLE太恶心人了。
 
今天以搭建环境,最基本的熟悉springboot项目创建过程为主,以及认识了主入口。
 
 
第二天:
新建springboot web项目,解决依赖问题,比如mybatis,jdbc,lombok,类似于composer。
熟悉pom文件,熟悉application.yml文件的构成。
使用RestController注解,包括对应的GetMapping,以及获取参数的RequestParam和PathParam,类似于使用PHP的系统变量$_REQUEST\$_POST\$_GET。
同时,开始习惯强类型,定义和返回均需定义类型。
配置mysql和mariadb,配置redis(这里仅限最基本的get和set,网上抄的代码),配置mqtt(这里仅限回调订阅某个topic,网上抄的代码)。
封装公共返回的类。
成果:能够正常连接并简单读取数据,运行后能够访问注解设定的接口地址。
 
 
第三天:
重新建立项目,重做第二天的事,解决依赖间的版本冲突问题,比如mysql-connector-java的6版本以下就有问题,网上很多资料还是比较老的,如果不幸拉取了老版本并报错,需要在maven面板Dependencies下和pom文件中删除掉对应项再重新配置拉取。
配置MapperScan,配置mysqlmybatis的实体类和mapper,配置分页,学习查询选择器QueryWrapper,包括select、like和allEq( map )的组合查询方式,做一个登陆接口。
引入jackson来格式化数据,包括使用Include.NON_NULL来不返回null值的字段。
设置函数参数的默认值,以及object转string再转int等等。
引入RuoYiUI的返回类和依赖类,包括lang3,StringUtils,该返回类的非空判断不全面,String.valueOf转换空对象会变为字符串“null”,值为null的也应该被判断为空;引入时因为版本问题导致java基础库标红,清理IDEA缓存并重启后解决。
成果:完成登录接口,完成子管理员账号的增删查改功能(不含token鉴权)。
 
 
第四天:
拦截器学习:
0
使用shiro,资料:
0
在微服务中我们一般采用的是无状态登录,因此如果我们需要在前后端分离项目中使用Shiro的话,会不恰巧的与我们的期望有所违背,原因:
Shiro默认的拦截跳转都是跳转url页面,而前后端分离后,后端并无权干涉页面跳转
Shiro默认使用的登录拦截校验机制恰恰就是使用的Session
因此如需使用shiro,我们就需要对其进行改造,那么要如何改造呢?我们可以在整合Shiro的基础上自定义登录校验,继续整合JWT,或者oauth2.0等,使其成为支持服务端无状态登录,即token登录。
但是我们又遇到了问题,Token颁发之后,由于只在客户端存储,所以在Token有效期内,我们无法实现Jwt的可控性,例如无法实现将用户强制下线的功能
因此我们如果想要实现这个功能的话,就又要进行改造了,使用内存型数据库Redis作为第三方存储,这样一来我们可以通过删除Redis中的Token信息让Token失效
但是这样做,就失去了Token最大的优点去中心化😢
 
 
第五天:
1、由于昨天在shiro整合jwt上面走了弯路,该整合较为麻烦,不太适合初学者,同事推荐了sa-token(https://sa-token.dev33.cn)这个轻量级框架,简单易上手。

假设我们有如下需求:

项目中所有接口均需要登录认证,只有'登录接口'本身对外开放

我们怎么实现呢?给每个接口加上鉴权注解?手写全局拦截器?似乎都不是非常方便。
在这个需求中我们真正需要的是一种基于路由拦截的鉴权模式, 那么在Sa-Token怎么实现路由拦截鉴权呢?

注册 Sa-Token 路由拦截器

SpringBoot2.0为例, 新建配置类SaTokenConfigure.java

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册Sa-Token的路由拦截器
        registry.addInterceptor(new SaRouteInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/user/doLogin"); 
    }
}
不过在excludePathPatterns加入我的api路径后,还是被sa-token给拦截了,仔细一看原来是大小写敏感,需要完全一致。
另外,这是基于前端 Cookie+后端Session的方式,对APP或者小程序就不实用了,需要参考官方的【前后台分离(无Cookie模式)】部分:
简单来说,就是在登录成功后:

  

 

 

 1 if ( count <=   0 ){
 2     //找不到用户,登录失败
 3     return AjaxResult.error(   "user_account or password error!" );
 4 }
 5 else
 6 {
 7     //登录成功
 8     StpUtil.login( user_account );
 9   
10     //获取token
11     SaTokenInfo token = StpUtil.getTokenInfo();
12   
13     //AjaxResult为封装的JSON统一返回类
14     return AjaxResult.success(   "success" , token );
15 }

 

然后前端每次在请求时,在header中带上token信息即可(此时后端还是Session控制,无需任何处理;也可改session为redis,功能上完全一致,仅仅是存储方式不同)
1  header: {
2        "content-type" :  "application/x-www-form-urlencoded" ,
3        "tokenName" : tokenValue         // 这里的两个值均为登录成功后,后端返回来的
4    }, 

 

 2、增加公共的异常拦截返回类。
 
 
 
 
第六天(计划):
 
完成仓库管理的增删查改。
完成在仓库下新建商品,对商品表的增删查改,分主库和各个子库。
完成账号和仓库的关系设置,完成仓库和商品的关系设置。
完成必须的基础数据列表接口,如权限列表、仓库列表等等。
完成发货主流程,主要是插入订单表和日志表。
 
 
第N天(计划):
完成收货流程,对主仓库和子仓库的数据进行事务迁移处理,这里是项目核心,考虑如何优化设计。
完成excel导出功能。
 
 
第N+1天(计划):
后端接口基本完成,开始前端开发,先PC管理后台,再小程序,功能和接口基本一致。
 
 
 
posted @ 2022-05-29 16:22  ty1921  阅读(201)  评论(0)    收藏  举报