树形菜单
概述在项目开发中我们经常会遇到各种树形菜单显示,尤其是菜单显示、机构部门等等。下面就简单介绍几步就能完成一个树形菜单的接口
首先构建树形结构,我们得知道什么是树形结构,如下图所示。
上图就是树形结构
而我们在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。废话不多说,直接上代码。
为了简化代码,可引入Lombok的Jar包,可省略实体类get()/set()方法。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version></dependency>
树节点实体类import lombok.Getter;import lombok.Setter; import java.util.List; @Datapublic class TreeNode { ...
JPA中的函数
sql中有各种各样的函数,JPQL中自然也会有很多函数。
JQPL中的函数算术函数
ABS:返回一个数的绝对值
SELECT ABS(-10) FROM Person p
SQRT:返回一个数的平方根
SELECT SQRT(25) FROM Person p
MOD:返回两个数相除的余数
SELECT MOD(10, 3) FROM Person p
SIZE:返回集合中元素的个数
SELECT SIZE(p.addresses) FROM Person p
字符串函数
CONCAT:将两个或多个字符串拼接成一个字符串
SELECT CONCAT(p.firstName, ' ', p.lastName) FROM Person p
LENGTH:返回一个字符串的长度
SELECT LENGTH(p.firstName) FROM Person p
LOWER:返回一个字符串的小写形式
SELECT LOWER(p.firstName) FROM Person p
UPPER:返回一个字符串的大写形式
SELECT UPPER(p.firstName ...
永久激活Typora
步骤
打开Typora本地目录,默认应在C盘,我这里在E盘。
在文件资源管理器中搜索“LicenseIndex”,找到LisenseIndex.chunk.js,用可视化工具打开。
在打开的文件中查找e.hasActivated=”true”,可以看到e.hasActivated=”true”== 后为e.hasActivated。我们直接将其也改为”true”,即:e.hasActivated=”true”==“true”这样就会将1赋值给e.hasActivated.
打开Typora,已经激活成功!
chatGPT
注册ChatGPT打开官网
这一步,推荐直接使用微软账号进行登录(毕竟大多数电脑都是Win系统),有谷歌账号的也可以使用谷歌账号。
下一步需要短信验证,注册chatGPT主要的难点是短信验证码。
可以找一些解码平台:
比较常用的有sms-activate、PVA Codes、SmsPva、Sms-Acktiw、SmsReg等。
下面以sms-activate为例,网址:https://sms-activate.org/getNumber
进去充值后(支持支付宝,一般2刀+手续费也就15块钱左右),搜索并点击OpenAI。挑选一个手机号,然后复制到上面,注意国家信息。
有效期是20分钟,需要快速操作,若两三分钟没有收到短信验证码,可点击旁边的删除按钮,然后再次选择别的手机号码,未收到验证不扣费。
然后就可以完成注册了。
(选择的IP一定要干净,最好是欧洲那边)
浏览器插件最近收集的一些比较好用的插件,可以结合浏览器+chatGPT使用。
AdGuard 广告拦截器可以帮你拦截广告(百度,懂得都懂)
ChatGPT for Google可以在谷歌/edge浏览器中直 ...
JPA的命名规范
JPA的命名规范Spring Data JPA是个非常强大的ORM持久化解决方案,免去了mybatis或spring jdbcTemplate的开发人员编写脚本的无趣工作。
通过简单明了地约定好接口方法的规则,来自动生成相应的JPQL语句,映射成PO对象,能大幅节省开发人员的编码量。
接口方法的命名规则也很简单,明白And、Or、Is、Equal、Greater、StartingWith等英文单词的含义,就可以写接口方法了。
以下是从Spring Data JPA官方网站上的docs整理而来,网上其他有些文章写的有的是错的。
关键词
SQL符号
样例
对应的JPQL语句片段
And
and
findByLastnameAndFirstname
… where x.lastname = ?1 and x.firstname = ?2
Or
or
findByLastnameOrFirstname
… where x.lastname = ?1 or x.firstname = ?2
Is,Equals
=
findBy ...
Stream流无法赋值给外部属性
在Java中,遍历集合的方式有多种,包括传统的for循环、增强的for循环、迭代器、以及Java 8中引入的Stream流。
原因Java 8中的Stream.forEach()方法被设计成用于迭代流中的每个元素,并执行给定的操作。它不返回任何值,因此无法直接将其结果赋值给外部变量。
常见的解决方式AtomicReferenceAtomicReference<String> result = new AtomicReference<>("初始值");list.stream() .forEach(element -> { // ... 操作步骤 result.set("对值操作"); });result = result.get(); // 获取最终结果
数组String[] result = new String[1];list.stream() .forEach(element -> { // ... 操作步骤 ...
Dubbo源码——消费者
源码解读本文基于dubbo2.7.8。
服务消费在配置文件中,有一个ref标签配置,找到我们的服务提供者。
还可以通过@DubboReference注解来获取服务提供者的信息。
生成远程服务的代理
获取目标服务的Url
建立与注册中心的动态感知
网络连接的建立
连接的建立有两种方式,启动时创建还是通信是创建?因为Dubbo采用长链接的方式,因此采用启动时创建的方式(Netty(nio))
而且dubbo是共享连接,不用使用时还去判断是否创建,都是在启动时就创建好的。
服务通信
filter过滤
负载均衡
容错
服务消费端的操作服务消费端的对象的注入
Xml
注解的方式:@Reference
都是在BeanPostProcessor中进行服务消费端的对象注入。
在ReferenceAnnotationBeanPostProcessor类中的构造方法:
由此可见:DubboReference.class可以做到Reference.class相同的功能。
同样在此类中,有一个真正执行bean的方法:doGetInjectedBean
其中的Referenc ...
阿里巴巴代码规范(二)
异常日志错误码
【强制】错误码的制定原则:快速溯源、简单易记、沟通标准化。
【强制】错误码不体现版本号和错误等级信息。
【强制】全部正常,但不得不填充错误码时返回五个零:00000。
【强制】错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。
【强制】编号不与公司业务架构,更不与组织架构挂钩,一切与平台先到先申请的原则进行,审批生效,编号即被永久固定。
【强制】错误码使用者避免随意定义新的错误码。
【强制】错误码不能直接输出给用户作为提示信息使用。
【推荐】错误码之外的业务独特信息由 error_message 来承载,而不是让错误码本身涵盖过多具体业务属性
【推荐】在获取第三方服务错误码时,向上抛出允许本系统转义,由 C 转为 B,并且在错误信息上带上原有的第三方错误码。
【参考】错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。
【参考】错误码的后三位编号与 HTTP 状态码没有任何关系
【参考】错误码尽量有利于不同文化背景的开发者进行交流与代码协作。
【参考】错误码即人性,感性认知+口口相传,使用纯数字来进行错误码编排不利于感性记忆和分类。
异常 ...
阿里巴巴代码规范(一)
编程规约命名风格
【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。
【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。
【强制】类型与中括号紧挨相连来表示数组。
``` javaint[] arr- 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。- 【强制】包名统一使用小写,点分隔符之间有且仅有一 ...
Mapstruct
日常开发中,我们经常会在PO,VO,DTO之间进行对象的转换,BeanUtils的copy方法很好,但是他不支持集合之间的转换,在网上查阅之后,发现了Mapstruct这个工具,使用之后,真香。
概述MapStruct是一个Java注释处理器,用于生成类型安全的bean映射类。
您要做的就是定义一个映射器接口,该接口声明任何必需的映射方法。在编译期间,MapStruct将生成此接口的实现。此实现使用简单的Java方法调用在源对象和目标对象之间进行映射,即没有反射或类似内容。
与手动编写映射代码相比,MapStruct通过生成繁琐且易于出错的代码来节省时间。遵循配置方法上的约定,MapStruct使用合理的默认值,但在配置或实现特殊行为时不加理会。
与动态映射框架相比,MapStruct具有以下优点:
通过使用普通方法调用(settter/getter)而不是反射来快速执行
编译时类型安全性:只能映射相互映射的对象和属性,不能将order实体意外映射到customer DTO等。
如果有如下问题,编译时会抛出异常
映射不完整(并非所有目标属性都被映射)
映射不正确(找不到正确 ...