Java RuoYi 框架学习笔记

1. Java 目录结构

src
 | - main
 | - | - java
 | - | - | - com (包名)
 | - | - | - | - | - xx (包名)
 | - | - | - | - | - | - module (包名)
 | - | - | - | - | - | - | - controller (控制层, 接收和处理用户请求)
 | - | - | - | - | - | - | - domain (专门维护数据库字段的)
 | - | - | - | - | - | - | - dto (输入层, 只能接收已维护的字段)
 | - | - | - | - | - | - | - vo (输出层, 只能输出已维护的字段)
 | - | - | - | - | - | - | - mapper (写操作数据库方法接口用的, 关联resources.mapper 文件夹)
 | - | - | - | - | - | - | - service (接口类)
 | - | - | - | - | - | - | - | - impl (接口实现, 逻辑在这里写)
 | - | - resources
 | - | - | - mapper
 | - | - | - | - *.xml (写SQL语句操作数据库用的)
 | - | - | - application.yml (配置文件)
target (用于存放编译生成的类文件、资源文件和构建后的包文件等)


2. 数据分页用法

public TableDataInfo<HomestayVo> getData() {
    List<> list = new ArrayList<>();
    startPage();
    return getDataTable(list);
}
// 请求接口时必须带上 pageSize(分页条数) 和 PageNum(当前页数) 参数字段
// 注意:startPage 只对第一条 SQL 生效,若想其他SQL生效,则必须在调用SQL前手动调用startPage()


3. forEach 循环用法

dto.getImageSrc().forEach(e -> {
});

3.1 for 循环用法

for (Image e : dto.getImageSrc()) {
}


4. 接受参数

public AjaxResult getData(HttpServletRequest request) {
    String orderId = request.getParameter("orderId");
}


5. 自增 ID 配置代码

/**
 * 序号
 */
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;


6. 使用雪花算法生成 ID 时,注意将 Long 类型改为 String 类型。若不改会引起以下问题

后端传给前端后几位数字变为 0 问题

问题描述:

当后端为 Long 类型的数字传给前端,在 Postman 里面是正常的,但前端页面取到的后几位数字变为了0

问题分析:

Javascript 的 Number 类型最大长度是 17 位

Java 的 long 类型长度是 19 位


7. APP/小程序接口提示没有权限,请联系管理员授权

若不需要分配接口权限的话,去掉 “@PreAuthorize”注解即可


8. Java 项目启动后自动调用某个方法

通过使用 @Component 以及 @PostConstruct 注解来实现此功能

@Component
public class Example{
    @PostConstruct
    public void init() {
        // 在依赖注入完成后执行的初始化代码
    }
}


9.  Maven 依赖版本号不生效

<dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>
</dependencies>

结果发现以上依赖不生效,一直加载3.6.3的包,后来得知

dependencyManagement 标签的优先级要高于 dependencies 标签

所以改为以下代码即可生效

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>3.7.0</version>
            </dependency>
        </dependencies>
</dependencyManagement>


10. 异常处理之 try-catch-finally

try {
      … // 可能产生异常的代码
      Jedis resource = jedis.getResource();
      return;
}
catch (ExceptionName1 e) {
      … // 当产生ExceptionName1型异常时的处置措施
}
catch (ExceptionName2 e) {
      … // 当产生ExceptionName2型异常时的处置措施
}
finally {
      … // 无论是否发生异常都会执行
      if (jedis != null) {
            jedis.close();
      }
}


11. 异常处理之 try-with-resources

try (Jedis resource = jedis.getResource()) {
      return resource;
}
catch (ExceptionName1 e) {
      … // 当产生ExceptionName1型异常时的处置措施
}
catch (ExceptionName2 e) {
      … // 当产生ExceptionName2型异常时的处置措施
}

在Java 7及以上的版本中,可以使用 try-with-resources 语句来自动关闭资源。try-with-resources 语句会在代码块结束时自动关闭已声明的资源,无需显式调用关闭方法,从而简化资源管理的代码。


12. 同步锁 synchronized。在多用户同时请求接口(添加、修改、删除)一般需要用到。以下是同步锁代码

synchronized(lock) {
      // 这里是同步执行的代码
}


13. 运行项目命令

nohup /www/wwwroot/xxx/jdk1.8.0_151/bin/java -jar ruoyi-admin.jar --spring.profiles.active=prod &

查询运行日志

tail -f nohup.out


14. 开启事务

@Transactional


15. 获取当前用户ID

// 获取用户信息
LoginUser user = SecurityUtils.getLoginUser();
if(user == null || user.getUserId().isEmpty()) {
    throw new RuntimeException("请重新登录");
}
SysUser userInfo = sysUserServiceImpl.selectUserById(user.getUserId());