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

原创 springboot集成mahout实现简单基于协同过滤算法的文章推荐算法
我这里只是简单的跑了一下,仅供参考。。这边只是跑了个文章推荐的demo,不过什么电影,商品啥的都一样,没啥区别温馨提醒这个mahout包有毒。。。。很多依赖冲突。。。。这是我的pom文件,仅仅供参考。。
2023-03-12 21:26:05
7964
18

原创 ruoyi-vue-plus学习2(异步日志)(@EventListener)(@Async)(线程池)(监听器)
ruoyi-vue-plus的日志打印是通过监听器实现的,和原版若依稍稍不同。登录时记录日志的方法。
2023-03-09 13:40:18
2305

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

原创 若依框架解读(微服务版)——2.模块间的调用逻辑(ruoyi-api模块)(OpenFeign)(@innerAuth)
fallbackFactory = RemoteUserFallbackFactory.class调用失败时候的降级策略,一般会打印返回错误日志信息。我们以RemoteUserService接口为例子:其中contextId = "remoteUserService"名称,其中rouyi–api模块是远程调用也就是提取出来的openfeign的接口。通过自定义注解+AOP来拒绝外部请求。api模块当中有几个提取出来的OpenFeign的接口。我们可以了解到一共有这么多服务,我们先启动这三个服务。
2022-11-21 19:54:33
9776
4
原创 接口方法上的自定义注解失效
Spring 建议您仅使用 @Transactional 注释来注释具体类(以及具体类的方法),而不是注释接口。您当然可以将 @Transactional 注释放在接口(或接口方法)上,但这仅在您使用基于接口的代理时按照您期望的方式工作。Java 注释不是从接口继承的事实意味着,如果您使用基于类的代理 (proxy-target-class=“true”) 或基于编织的切面 (mode=“aspectj”),则事务设置为不被代理和编织基础设施识别,并且该对象不会被包装在事务代理中,这绝对是糟糕的。
2024-08-15 10:23:51
463
原创 Encountered unexpected token: “LIMIT“ “LIMIT“
mybatis写的sql结尾不能有分号,navicate上写的sql运行后贴过来要注意…
2023-08-28 15:46:19
504
原创 动态Feign
我们通常使用Feign接口时都是需要进行定义一个Feign接口啥的去调用某个服务的相关接口,但是如果现在你写的是一个基础服务,如支付服务。考虑到后面你可能要提供给各种项目服务使用,但是你也需要调用他们的相关接口方法获取相关信息。通常在这个时候我们可以去封装一个动态Feign,只需要定义一个Feign接口就好,然后定义相关方法。然后在调用是我们只需要指定服务名+我们定义的动态Feign接口里的方法就可以完成调用了。假如我们需要对接10个服务,难道我们每个服务都要定义一个Feign接口,然后定义相同的方法么。
2023-08-23 00:15:34
306
原创 Spi机制简单解释
但是呢,这些个项目早就有着自己的设计代码啥的,现在要接入我们写的这个支付服务。比如用户id,可能农业项目的用户id为自增ID如12314212414,但是金融项目的用户id为UUID如qfq123yug12b。然后把我们写的支付服务打个包被他们依赖进去就行,不同的项目自行去实现这个接口去进行相关详细处理。功能提供方定义好接口,调用方去实现这个这个接口,并且扩展自己特有的细节,然后提供方使用调用方扩展后的相关代码实现相关功能给调用方使用。然后后面你这个服务要应用于其他项目比如农业项目,工业项目,金融项目等。
2023-08-22 23:58:27
538
原创 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
1091
原创 Camunda_4:监听器相关
Camunda的监听器非常之多,常见的如任务监听与执行监听。我们可以实现相关监听器进行相关操作。首先明确的是,当执行到某一个节点时,会先进入执行监听,然后进入任务监听。
2023-08-22 23:13:47
1041
原创 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
323
原创 camund——2、cancelActivityInstance()与多实例下getActiveActivityIds()获取不到当前任务的节点。
在多实例(会签或者并行网关)时如果使用以下代码来进行驳回时,使用来获取当前活动的节点会出现获取不到情况。
2023-07-30 15:11:35
855
原创 Camunda——1、springboot集成camunda与相关软件的安装
2、由于camunda-modeler最新版本为5.12.0.界面不太一样。5、idea集成camunda快速打开camunda modeler。可以安装历史版本4.12.0。
2023-07-04 16:43:05
397
原创 若依——限流(rateLimiter)(lua脚本与令牌桶)
在若依结合了Redisson使用令牌桶进行限流。由于Redisson已经封装好了,使用起来比较简单,更多知识=》注意这里进行了bean的托管,因此我们才能使用limitScript。在原版若依当中使用了lua脚本进行限流。关于lua脚本的解释。
2023-06-26 23:28:46
1795
原创 若依-(@RepeatSubmit)(防止重复提交)
第一个框是生成了唯一的key,仔细看key的组成为url+token+参数,意味着每一个用户的每一个请求都在redis当中存了个key,值的化存了个空字符串(因为我们只需要key来保证唯一性,值不存东西也行)。首先,我们获取这个key的值,如果是空说明用户第一次请求,然后将key存进去。如果不为空,说明在限制时间里(key没过期)用户再次进行了提交,返回错误信息。原版若依的判定如下通过判断用户的url是否一致,在判断参数是否一致,在比较两次请求的时间是否小于限制时间来进行防止重复提交。
2023-06-26 22:32:55
1558
原创 若依——递归菜单解释
然后看看子菜单里面有没有子菜单的子菜单,如果有的化,递归调用recursionFn()方法就行了。递归出口在最后一个子菜单没有自己的子菜单的化,那么其childList的size=0,那么下面的增加for循环就无法进行。其中第一个方法getChildPerms(),寻找到最顶层(pid=0)的几个菜单,然后将每一个顶层菜单进行递归,看有没有子菜单,最后将这几个递归完成的顶层菜单(此时已经将子菜单递归出来了)add到returnList里面。原版若依使用到了迭代器进行递归等,由于迭代器比较早了。
2023-06-25 23:49:48
607
原创 枚举的几种写法
使用静态代码块替代流操作初始化缓存:虽然使用流操作和Collectors.toMap()方法可以方便地初始化缓存,但在这个特定的情况下,使用静态代码块可能更简洁和高效。静态代码块在类加载时执行,并且只会执行一次。因此,可以将初始化缓存的逻辑放入静态代码块中,而无需在每次调用of()方法时重新计算缓存。
2023-06-24 00:02:40
155
原创 MyBatis查询SQL报错(IndexOutOfBoundsException)原因及解决方案(@Builder的坑)
一般情况下@Builder 和@AllArgsConstructor,@NoArgsConstructor这三注解要一起使用。
2023-04-16 22:09:09
965
原创 设计模式——spring自动注入+枚举类+策略模式
*** 搜索文章* @param keywords 关键字* @return {@link List< ArticleSearchVO >} 文章列表es:注意加上注解@Service(“elasticsearchStrategyImpl”)System . out . println("使用elasticsearch搜索==========================》" + keywords);} }mysql:注意加上注解@Service(“mysqlStrategyImpl”)
2023-04-15 11:41:56
1050
原创 mybatis只查询部分字段,去除null,@MapKey
3.@Mapkey注解(注意这里感觉@Mapkey是无效的,貌似可以去除(自己实验没问题),读者可自行尝试)4,在实体类上使用@JsonInclude()注解。1,查询出来后copy转换到新的实体类。3,使用@MapKey注解。2.stream()流。2,使用流转为map。
2023-04-05 13:09:36
774
原创 若依项目学习23(前后端分离版)——前端登录整体数据流程分析(Vue2)
今天怒学了一波Vue,现在来试试分析一波若依前端的数据流程目录如下,这次分析的重点是框起来的部分其中(api为接口模块,所有的请求接口都在这里封装了,然后就是常见的路由和VueX和页面模块了。)详情介绍可以看若依官网。
2023-03-14 20:55:01
1343
原创 VueX快速入门(适合后端,无脑入门!!!)
作为一个没啥前端基础(就是那种跳过js直接学vue的那种。。。)的后端选手。按照自己的思路总结了一下对VueX的理解。大佬勿喷qAq。首先我们需要明确一个点,引入VueX的使用只是用来保存和操作全局变量的。类似于后端用ThreadLocal来保存当前线程的变量相关链接Vue官网首先我们先来了解VueX当中的五个属性:对于快速入门的选手而言,我们只需要了解前四个属性就好了,然后优先了解其中的Satae和Mutation就行这里先扔一张图,就是混个眼熟,后面会再提到。
2023-03-14 18:31:43
1509
原创 ruoyi-vue-plus学习3(对象存储AWS s3)(spring cache集成redis)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。
2023-03-13 23:40:17
819
原创 java四大函数式接口-2(Supplier函数)(若依)(多次登录失败锁定账号)
checkLogin()方法主要作用是使用redis来对用户多次输错密码,进行强制锁定10分钟,和原版若依的逻辑基本一致。首先,展开该lambda表达式,发现其重写了其中的get()方法返回密码匹配的结果取反。在checkLogin方法当中,调用了supplier的get方法返回的而结果。在若依plus当中我们可以看到这行代码,其中使用到了Supplier类型的参数。
2023-03-09 15:27:27
840
原创 ruoyi-vue-plus1(控制台相关的输出日志)(p6spy插件)(jackson全局配置)(StopWatch)
打开配置我们能发现,项目采用了mp的雪花id作为主键,而雪花id为19位,传到前端会导致精度的缺失,因此,超过该范围的全部转为字符串,其他默认原来的类型。在启动项目时,我们发现日志打印出这样几行字,初始化了jacdson配置,我们去查看一下来源找。发现了这里对于部分范围的数字进行了转为为字符串的操作。StopWatch()定时器的使用比较简单,可参考下面的连接。
2023-03-08 19:35:35
1670
原创 若依学习——异步日志(若依的两个线程池)(LoggerFactory.getLogger(“sys-user“))
若依在登录的时候会使用到线程池来进行日志记录如下所示。在若依项目中配置了两个线程池,当项目启动时,线程池会初始化被spring管理。不过若依项目中只是用到了第二个线程池,后面我会讲怎么使用第一个线程池。
2023-03-06 23:28:16
5720
原创 java四大函数式接口-1(Function函数)举例:computeIfAbsent() 方法的使用
那好办了,我们来展开这个lambda吧,emmm传入一个值,返回280。就是判断如果shirt不存在的话,就往map里面存个值,key为shirt,value为280?对了,还要注意返回值是个value。好麻烦,还得新建一个类实现这个接口咋来创建对象么。好的,现在你学会了1+1,我们来考微积分吧,如果你很闲的话,代码在后面,可以自己调试。我看看,哦这是一个接口,不能直接new是吧。好的,开始进入正题。然后我重写一下这个方法。仔细分析一下,这因该要新建一个对象吧。我记得之前学了匿名内部类来着,我试试。
2023-03-06 18:03:16
634
原创 若依学习(前后端分离版)——@DataScope(权限信息详解!!!)(RequestContextHolder)
提醒,笔者所学习的若依为当前最新的3.8.5版本,在权限的部分做了一点优化,详情可以看作者的提交记录。这个后面会提到
2023-03-05 00:31:27
3757
原创 若依学习(前后端分离版)——自定义注解@Log(如何自定义注解,实现aop)
定义了注解的相关信息。这里定义的属性可以在使用时加以定义注解@Target和@Retention的作用。
2023-03-04 19:36:02
4246
2
原创 若依学习——定时任务代码逻辑 详细梳理(springboot整合Quartz)
现在我们知道我们执行了传入的这个方法,那么这个方法的在哪呢?所以我们如果想在若依里面实现自己的定时任务,直接在这个包下面写要处理的逻辑就行啦,但是有一点要注意的是若依设置了个白名单,因此这些自定义的定时任务逻辑要卸载con.ruoyi包下。这是若依的定时任务模块,上面主要是有关这任务表sys_job和日志表sys_job_log一些crud,然后调用了untils包的关于定时任务的方法。主要的定时任务操作都是通过下面until包下的类实现的。不过若依当中为了实现一些自己的想要的功能写了非常多的逻辑。
2023-03-04 00:17:00
16491
2
原创 若依学习——BaseController类(PageHelper)
若依的许多controller都继承了BaseController类,学习一下里面的几个方法。
2023-03-03 21:32:13
3934
原创 若依学习(前后端分离版)——启动时发生了啥?(@PostConstruct)(mybatis log free)
我们可以安装一个插件mybatis log free 来更好的进行sql查看 ,安装后需要修改一下若依的日志配置如下。这里说初始化了缓存,我们打开redis,发现了这个,发现前两个方法都是初始化缓存到redis。查看日志,我们发现执行了三个方法(),分别查询了一些数据。那么,第三个方法呢?其实就是定时器的初始化。我们可以发现若依启动时执行了一些sql。以第二个方法为例子,我们发现了这个注解。除此之外,项目启动时还做了一件事:详情。
2023-03-02 20:13:04
1230
原创 Arrays.asList的坑
list《user》 转换为数组,直接转换获得得时object数组,不是user数组。由于本质还是数组,会带来很多坑。
2023-03-02 14:10:03
144
原创 删除集合当中的空元素(Collections.singleton(null)与stream())
【代码】删除集合当中的空元素(Collections.singleton(null)与stream())
2023-03-02 14:09:35
889
原创 @RequestBody和@RequestParam和@RequestPart使用场景
@RequestBody和@RequestParam和@RequestPart使用场景@RequestParam和@RequestPart的区别SpringBoot @RequestPart 同时接收文件和复杂json数据
2023-03-01 15:34:16
355
原创 若依项目学习(微服务版)——6熔断降级与分布式文件存储(Sentinel)(minio)
文件服务只提供了一个接口,三个实现类。三个远程服务的调用与降级打印日志。在nacos当中的配置。
2023-02-23 16:28:52
532
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人