自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 收藏
  • 关注

原创 springboot集成mahout实现简单基于协同过滤算法的文章推荐算法

我这里只是简单的跑了一下,仅供参考。。这边只是跑了个文章推荐的demo,不过什么电影,商品啥的都一样,没啥区别温馨提醒这个mahout包有毒。。。。很多依赖冲突。。。。这是我的pom文件,仅仅供参考。。

2023-03-12 21:26:05 6668 18

原创 ruoyi-vue-plus学习2(异步日志)(@EventListener)(@Async)(线程池)(监听器)

ruoyi-vue-plus的日志打印是通过监听器实现的,和原版若依稍稍不同。登录时记录日志的方法。

2023-03-09 13:40:18 1915

原创 若依框架解读(微服务版)—— 4.认证,登出(Gateway网关)

我们进入授权中心,这里其他的解析解析token的步骤与上一篇文章中的生成token是逆操作,也比较简单。此处的两个注解是获取nacos当中的白名单,我们打开nacos,进入网关配置可查看相关的值。前端的css啥的前后端分离情况都是放在nginx当中的,不会经过网关。我们在请求刚到第一个断点时,打第二个断点,在点击左下角的三角形,会直接进入鉴权服务工程。登出比较简单,获取前端传来的token,删除了redis当中的用户信息。因为白名单当中配置了logou接口,因此请求会从网关服务进入鉴权服务。

2022-11-21 23:54:31 2311

原创 若依框架解读(微服务版)——2.模块间的调用逻辑(ruoyi-api模块)(OpenFeign)(@innerAuth)

fallbackFactory = RemoteUserFallbackFactory.class调用失败时候的降级策略,一般会打印返回错误日志信息。我们以RemoteUserService接口为例子:其中contextId = "remoteUserService"名称,其中rouyi–api模块是远程调用也就是提取出来的openfeign的接口。通过自定义注解+AOP来拒绝外部请求。api模块当中有几个提取出来的OpenFeign的接口。我们可以了解到一共有这么多服务,我们先启动这三个服务。

2022-11-21 19:54:33 8391 4

原创 设计模式——使用spring自动注入实现工厂模式

【代码】设计模式——使用spring自动注入实现工厂模式。

2022-10-05 21:04:11 1532

原创 Encountered unexpected token: “LIMIT“ “LIMIT“

mybatis写的sql结尾不能有分号,navicate上写的sql运行后贴过来要注意…

2023-08-28 15:46:19 356

原创 动态Feign

我们通常使用Feign接口时都是需要进行定义一个Feign接口啥的去调用某个服务的相关接口,但是如果现在你写的是一个基础服务,如支付服务。考虑到后面你可能要提供给各种项目服务使用,但是你也需要调用他们的相关接口方法获取相关信息。通常在这个时候我们可以去封装一个动态Feign,只需要定义一个Feign接口就好,然后定义相关方法。然后在调用是我们只需要指定服务名+我们定义的动态Feign接口里的方法就可以完成调用了。假如我们需要对接10个服务,难道我们每个服务都要定义一个Feign接口,然后定义相同的方法么。

2023-08-23 00:15:34 251

原创 Spi机制简单解释

但是呢,这些个项目早就有着自己的设计代码啥的,现在要接入我们写的这个支付服务。比如用户id,可能农业项目的用户id为自增ID如12314212414,但是金融项目的用户id为UUID如qfq123yug12b。然后把我们写的支付服务打个包被他们依赖进去就行,不同的项目自行去实现这个接口去进行相关详细处理。功能提供方定义好接口,调用方去实现这个这个接口,并且扩展自己特有的细节,然后提供方使用调用方扩展后的相关代码实现相关功能给调用方使用。然后后面你这个服务要应用于其他项目比如农业项目,工业项目,金融项目等。

2023-08-22 23:58:27 502

原创 Ribbon:listOfServers ,${variableName:defaultValue}

会走后面的XXX.feign.default-server地址,这个地址通常可以配一个网关地址,然后网关会跳到对应服务,如果对应的服务有注册在nacos当中。Ribbon会在naocs上轮询这个user-server,这个通常用来自己测试,总不能一直叫别的后端给你开着服务吧。配置了address的地址,请求会走address,也就是http://127.0.0.1:8081,通常用户与别的后端服务进行联调设置为其本地服务的ip。如果将address:注释掉。

2023-08-22 23:31:34 958

原创 Camunda_4:监听器相关

Camunda的监听器非常之多,常见的如任务监听与执行监听。我们可以实现相关监听器进行相关操作。首先明确的是,当执行到某一个节点时,会先进入执行监听,然后进入任务监听。

2023-08-22 23:13:47 841

原创 Camunda_3:主动撤回

但是这里对于复杂点的撤回是远远不够的。因为撤回的逻辑是需要判断下一个节点的任务是否执行完成的。而下一节点的可能性非常的多,处理用户节点这种简单的情况,还包括网关,子流程等复杂情况。除此之外,如果当前节点是会签节点,上面通过重启节点的方式来撤回是有问题的。通常的撤回/驳回逻辑如下。3、下一个节点的情况很多,除了用户任务,还包括服务任务,网关,子流程等。(注意获取后一节点所有已经完成的任务需要获取最新的,因为用户之前可能撤回过)这里提供简单的思路,等后面对camunda的学习更加深入后在进行修改调整。

2023-08-22 14:03:08 1383

原创 ENGINE-03070Cannot resolve a unique process definition for keybecause it exists for multiple tenants

删除之前那些数据就行,也就是表中act_re_procdef表中tenant_id为空的数据就好了。记得使用api删除(processDeploymentApi.deleteDeployment(id)),直接删数据库全是外键。原因大概是之前部署定义时没有设置租户导致之前流程定义被全体共享。原因->同一个流程定义key被多个租户给定义,在启动流程时指定租户就行。camunda官网有提及。

2023-08-03 09:49:27 200

原创 camund——2、cancelActivityInstance()与多实例下getActiveActivityIds()获取不到当前任务的节点。

在多实例(会签或者并行网关)时如果使用以下代码来进行驳回时,使用来获取当前活动的节点会出现获取不到情况。

2023-07-30 15:11:35 590

原创 Camunda——1、springboot集成camunda与相关软件的安装

2、由于camunda-modeler最新版本为5.12.0.界面不太一样。5、idea集成camunda快速打开camunda modeler。可以安装历史版本4.12.0。

2023-07-04 16:43:05 323

原创 若依——限流(rateLimiter)(lua脚本与令牌桶)

在若依结合了Redisson使用令牌桶进行限流。由于Redisson已经封装好了,使用起来比较简单,更多知识=》注意这里进行了bean的托管,因此我们才能使用limitScript。在原版若依当中使用了lua脚本进行限流。关于lua脚本的解释。

2023-06-26 23:28:46 1399

原创 若依-(@RepeatSubmit)(防止重复提交)

第一个框是生成了唯一的key,仔细看key的组成为url+token+参数,意味着每一个用户的每一个请求都在redis当中存了个key,值的化存了个空字符串(因为我们只需要key来保证唯一性,值不存东西也行)。首先,我们获取这个key的值,如果是空说明用户第一次请求,然后将key存进去。如果不为空,说明在限制时间里(key没过期)用户再次进行了提交,返回错误信息。原版若依的判定如下通过判断用户的url是否一致,在判断参数是否一致,在比较两次请求的时间是否小于限制时间来进行防止重复提交。

2023-06-26 22:32:55 1261

原创 若依——递归菜单解释

然后看看子菜单里面有没有子菜单的子菜单,如果有的化,递归调用recursionFn()方法就行了。递归出口在最后一个子菜单没有自己的子菜单的化,那么其childList的size=0,那么下面的增加for循环就无法进行。其中第一个方法getChildPerms(),寻找到最顶层(pid=0)的几个菜单,然后将每一个顶层菜单进行递归,看有没有子菜单,最后将这几个递归完成的顶层菜单(此时已经将子菜单递归出来了)add到returnList里面。原版若依使用到了迭代器进行递归等,由于迭代器比较早了。

2023-06-25 23:49:48 458

原创 枚举的几种写法

使用静态代码块替代流操作初始化缓存:虽然使用流操作和Collectors.toMap()方法可以方便地初始化缓存,但在这个特定的情况下,使用静态代码块可能更简洁和高效。静态代码块在类加载时执行,并且只会执行一次。因此,可以将初始化缓存的逻辑放入静态代码块中,而无需在每次调用of()方法时重新计算缓存。

2023-06-24 00:02:40 126

原创 函数式接口作为参数

今天看到这样两段代码。现在其中l传入了lambda表达式wrapper -> {},作为参数 ,在调用的方法里进行了接受。

2023-06-23 20:00:37 107

原创 MyBatis查询SQL报错(IndexOutOfBoundsException)原因及解决方案(@Builder的坑)

一般情况下@Builder 和@AllArgsConstructor,@NoArgsConstructor这三注解要一起使用。

2023-04-16 22:09:09 756 1

原创 设计模式——spring自动注入+枚举类+策略模式

*** 搜索文章* @param keywords 关键字* @return {@link List< ArticleSearchVO >} 文章列表es:注意加上注解@Service(“elasticsearchStrategyImpl”)System . out . println("使用elasticsearch搜索==========================》" + keywords);} }mysql:注意加上注解@Service(“mysqlStrategyImpl”)

2023-04-15 11:41:56 724

原创 mybatis只查询部分字段,去除null,@MapKey

3.@Mapkey注解(注意这里感觉@Mapkey是无效的,貌似可以去除(自己实验没问题),读者可自行尝试)4,在实体类上使用@JsonInclude()注解。1,查询出来后copy转换到新的实体类。3,使用@MapKey注解。2.stream()流。2,使用流转为map。

2023-04-05 13:09:36 681

原创 若依项目学习23(前后端分离版)——前端登录整体数据流程分析(Vue2)

今天怒学了一波Vue,现在来试试分析一波若依前端的数据流程目录如下,这次分析的重点是框起来的部分其中(api为接口模块,所有的请求接口都在这里封装了,然后就是常见的路由和VueX和页面模块了。)详情介绍可以看若依官网。

2023-03-14 20:55:01 1210

原创 VueX快速入门(适合后端,无脑入门!!!)

作为一个没啥前端基础(就是那种跳过js直接学vue的那种。。。)的后端选手。按照自己的思路总结了一下对VueX的理解。大佬勿喷qAq。首先我们需要明确一个点,引入VueX的使用只是用来保存和操作全局变量的。类似于后端用ThreadLocal来保存当前线程的变量相关链接Vue官网首先我们先来了解VueX当中的五个属性:对于快速入门的选手而言,我们只需要了解前四个属性就好了,然后优先了解其中的Satae和Mutation就行这里先扔一张图,就是混个眼熟,后面会再提到。

2023-03-14 18:31:43 1428

原创 ruoyi-vue-plus学习3(对象存储AWS s3)(spring cache集成redis)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2023-03-13 23:40:17 627

原创 java四大函数式接口-2(Supplier函数)(若依)(多次登录失败锁定账号)

checkLogin()方法主要作用是使用redis来对用户多次输错密码,进行强制锁定10分钟,和原版若依的逻辑基本一致。首先,展开该lambda表达式,发现其重写了其中的get()方法返回密码匹配的结果取反。在checkLogin方法当中,调用了supplier的get方法返回的而结果。在若依plus当中我们可以看到这行代码,其中使用到了Supplier类型的参数。

2023-03-09 15:27:27 592

原创 ruoyi-vue-plus1(控制台相关的输出日志)(p6spy插件)(jackson全局配置)(StopWatch)

打开配置我们能发现,项目采用了mp的雪花id作为主键,而雪花id为19位,传到前端会导致精度的缺失,因此,超过该范围的全部转为字符串,其他默认原来的类型。在启动项目时,我们发现日志打印出这样几行字,初始化了jacdson配置,我们去查看一下来源找。发现了这里对于部分范围的数字进行了转为为字符串的操作。StopWatch()定时器的使用比较简单,可参考下面的连接。

2023-03-08 19:35:35 1394

原创 若依学习——异步日志(若依的两个线程池)(LoggerFactory.getLogger(“sys-user“))

若依在登录的时候会使用到线程池来进行日志记录如下所示。在若依项目中配置了两个线程池,当项目启动时,线程池会初始化被spring管理。不过若依项目中只是用到了第二个线程池,后面我会讲怎么使用第一个线程池。

2023-03-06 23:28:16 4389

原创 java四大函数式接口-1(Function函数)举例:computeIfAbsent() 方法的使用

那好办了,我们来展开这个lambda吧,emmm传入一个值,返回280。就是判断如果shirt不存在的话,就往map里面存个值,key为shirt,value为280?对了,还要注意返回值是个value。好麻烦,还得新建一个类实现这个接口咋来创建对象么。好的,现在你学会了1+1,我们来考微积分吧,如果你很闲的话,代码在后面,可以自己调试。我看看,哦这是一个接口,不能直接new是吧。好的,开始进入正题。然后我重写一下这个方法。仔细分析一下,这因该要新建一个对象吧。我记得之前学了匿名内部类来着,我试试。

2023-03-06 18:03:16 583

原创 若依学习(前后端分离版)——@DataScope(权限信息详解!!!)(RequestContextHolder)

提醒,笔者所学习的若依为当前最新的3.8.5版本,在权限的部分做了一点优化,详情可以看作者的提交记录。这个后面会提到

2023-03-05 00:31:27 3310

原创 若依学习(前后端分离版)——自定义注解@Log(如何自定义注解,实现aop)

定义了注解的相关信息。这里定义的属性可以在使用时加以定义注解@Target和@Retention的作用。

2023-03-04 19:36:02 3423 2

原创 若依学习——定时任务代码逻辑 详细梳理(springboot整合Quartz)

现在我们知道我们执行了传入的这个方法,那么这个方法的在哪呢?所以我们如果想在若依里面实现自己的定时任务,直接在这个包下面写要处理的逻辑就行啦,但是有一点要注意的是若依设置了个白名单,因此这些自定义的定时任务逻辑要卸载con.ruoyi包下。这是若依的定时任务模块,上面主要是有关这任务表sys_job和日志表sys_job_log一些crud,然后调用了untils包的关于定时任务的方法。主要的定时任务操作都是通过下面until包下的类实现的。不过若依当中为了实现一些自己的想要的功能写了非常多的逻辑。

2023-03-04 00:17:00 11365 2

原创 若依学习——BaseController类(PageHelper)

若依的许多controller都继承了BaseController类,学习一下里面的几个方法。

2023-03-03 21:32:13 3560

原创 @JsonFormat 和 @DateTimeFormat 的区别与使用?

我们来问问ChatGPT吧。详细分析可以查看一下链接。

2023-03-02 23:11:21 137

原创 若依学习(前后端分离版)——启动时发生了啥?(@PostConstruct)(mybatis log free)

我们可以安装一个插件mybatis log free 来更好的进行sql查看 ,安装后需要修改一下若依的日志配置如下。这里说初始化了缓存,我们打开redis,发现了这个,发现前两个方法都是初始化缓存到redis。查看日志,我们发现执行了三个方法(),分别查询了一些数据。那么,第三个方法呢?其实就是定时器的初始化。我们可以发现若依启动时执行了一些sql。以第二个方法为例子,我们发现了这个注解。除此之外,项目启动时还做了一件事:详情。

2023-03-02 20:13:04 1160

原创 .sort()与stream()实现排序

注意这里进行了逆序排序。

2023-03-02 19:12:12 234

原创 Arrays.asList的坑

list《user》 转换为数组,直接转换获得得时object数组,不是user数组。由于本质还是数组,会带来很多坑。

2023-03-02 14:10:03 113

原创 删除集合当中的空元素(Collections.singleton(null)与stream())

【代码】删除集合当中的空元素(Collections.singleton(null)与stream())

2023-03-02 14:09:35 773

原创 @RequestBody和@RequestParam和@RequestPart使用场景

@RequestBody和@RequestParam和@RequestPart使用场景@RequestParam和@RequestPart的区别SpringBoot @RequestPart 同时接收文件和复杂json数据

2023-03-01 15:34:16 308

原创 若依项目学习(微服务版)——6熔断降级与分布式文件存储(Sentinel)(minio)

文件服务只提供了一个接口,三个实现类。三个远程服务的调用与降级打印日志。在nacos当中的配置。

2023-02-23 16:28:52 434

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除