ruoyi的spring cloud项目详解(二)

ruoyi的spring cloud项目详解(一)-CSDN博客 ​​​​​​

上一篇内容我们讲述了spring cloud的权限认证,如何用一个注解和AOP代码带整合一个注解,将来用这个注解整合到方法上,进行权限认证,回忆一下

PreAuthorizeAspect` 这个类整体被称为切面。

@Around("@annotation(com.ruoyi.common.auth.annotation.HasPermissions)")` 标注的 `around` 方法是通知

被 `@annotation(com.ruoyi.common.auth.annotation.HasPermissions)` 匹配到的、被 `HasPermissions` 注解修饰的方法就是切点。

咱们接着看下面的代码

package com.ruoyi.common.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据权限过滤注解
 * 
 * @author ruoyi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
    /**
     * 部门表的别名
     */
    public String deptAlias() default "";

    /**
     * 用户表的别名
     */
    public String userAlias() default "";
}

这段 Java 代码定义了一个名为 `DataScope` 的注解。

这个注解可以被应用在方法(`ElementType.METHOD`)上,在运行时(`RetentionPolicy.RUNTIME`)是可获取的,并且有相关的文档说明(`@Documented`)。

被标注的方法可以通过设置 `deptAlias`(部门表的别名)和 `userAlias`(用户表的别名)这两个属性来自定义一些与数据权限过滤相关的信息。默认情况下,如果不设置这两个属性,它们的值为空字符串。

定义了 DataScope 注解的两个属性:deptAlias 和 userAlias 。

public String deptAlias() default ""; 定义了一个名为 deptAlias 的字符串类型属性,用于指定部门表的别名。如果在使用这个注解时没有为 deptAlias 赋值,那么它就会使用默认值 ""(空字符串)。

同理,public String userAlias() default ""; 定义了名为 userAlias 的字符串类型属性,用于指定用户表的别名,默认值也是空字符串。

当在代码中使用 @DataScope 注解标注某个方法时,可以为 deptAlias 和 userAlias 赋予具体的值,以满足特定的需求。

注解定义完了,那么我们猜一猜这个注解会怎么用?

以下是一个可能的使用示例:

import com.ruoyi.common.annotation.DataScope;

public class SomeService {

    @DataScope(deptAlias = "department", userAlias = "user")
    public void someMethod() {
        // 方法的具体实现
    }
}

在上述示例中,someMethod 方法被 @DataScope 注解标注,并为 deptAlias 和 userAlias 分别指定了具体的值 "department" 和 "user" 。

具体如何使用这个注解取决于项目中的业务逻辑和需求。可能在后续的代码中,会有相应的处理逻辑来根据注解中设置的这些属性值进行数据权限的过滤或其他相关操作。

这个 `@DataScope` 注解 一种可能的用途是,当这个方法被调用时,系统中的某些权限控制或数据过滤模块会获取到这个注解中设置的 `deptAlias`(部门别名)和 `userAlias`(用户别名)的值,并根据这些值来决定对数据进行何种范围的筛选和权限控制。

例如,可能会根据指定的部门别名和用户别名来从数据库中获取相应权限范围内的数据,或者限制对某些数据的操作权限。 总之,其作用是为相关的权限控制或数据处理逻辑提供必要的配置信息。但具体的功能实现需要看与这个注解配合使用的其他代码。

不扯了,咱们继续看代码

com/ruoyi/common/annotation/Excel.java

package com.ruoyi.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义导出Excel数据注解
 * 
 * @author ruoyi
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
    /**
     * 导出到Excel中的名字.
     */
    public String name();

    /**
     * 日期格式, 如: yyyy-MM-dd
     */
    public String dateFormat() default "";

    /**
     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
     */
    public String readConverterExp() default "";

    /**
     * 导出时在excel中每个列的高度 单位为字符
     */
    public double height() default 14;

    /**
     * 导出时在excel中每个列的宽 单位为字符
     */
    public double width() default 16;

    /**
     * 文字后缀,如% 90 变成90%
     */
    public String suffix() default "";

    /**
     * 当值为空时,字段的默认值
     */
    public String defaultValue() default "";

    /**
     * 提示信息
     */
    public String prompt() default "";

    /**
     * 设置只能选择不能输入的列内容.
     */
    public String[] combo() default {};

    /**
     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
     */
    public boolean isExport() default true;

    /**
     * 另一个类中的属性名称,支持多级获取,以小数点隔开
     */
    public String targetAttr() default "";

    /**
     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
     */
    Type type() default Type.ALL;

    public enum Type
    {
        ALL(0), EXPORT(1), IMPORT(2);
        private final int value;

        Type(int value)
        {
            this.value = value;
        }

        public int value()
        {
            return this.value;
        }
    }
}

这段 Java 代码定义了一个名为 `Excel` 的注解。 以下是对这个注解的详细解释:

- `@Retention(RetentionPolicy.RUNTIME)`:表示该注解在运行时可被反射机制读取。

- `@Target(ElementType.FIELD)`:指定该注解可应用于字段。 注解的属性:

- `name`:导出到 Excel 中的列名。

- `dateFormat`:日期格式字符串。

- `readConverterExp`:用于读取内容的转换表达式。

- `height`:列的高度(单位为字符)。

- `width`:列的宽度(单位为字符)。

- `suffix`:文字后缀。 - `defaultValue`:当值为空时的默认值。

- `prompt`:提示信息。 - `combo`:设置只能选择不能输入的列内容。

- `isExport`:是否导出数据。

- `targetAttr`:另一个类中的属性名称。

- `type`:字段的类型,包括导出导入、仅导出、仅导入。 这个注解可能用于在数据导出到 Excel 时,对字段的各种属性进行配置和控制。

这段 `Excel` 注解的代码可能会在以下场景中使用:

1. 数据导出功能:当需要将数据从某个系统或应用程序导出到 Excel 文件时,可以使用这个注解来指定每个字段在 Excel 中的各种属性,例如列名、日期格式、宽度、高度、默认值、提示信息、是否导出等。这有助于确保导出的数据在 Excel 中具有良好的格式和可读性。

2. 数据导入验证:虽然注解中包含了一些看起来更适用于导出的属性,但 `type` 属性(指定字段是用于全部操作、仅导出还是仅导入)可能会在数据导入时被用于验证和处理字段。

3. 生成 Excel 模板:通过注解中的属性,可以方便地为用户生成一个具有特定格式和提示的 Excel 模板,用户可以根据模板填写数据,然后再进行导入或其他操作。

4. 与数据处理框架或库集成:可能会被集成到特定的数据处理框架或库中,以实现自动化的数据与 Excel 文件的交互操作。

总之,这个注解主要是为了提供一种灵活且可配置的方式来处理与 Excel 相关的数据操作,以满足不同的业务需求和数据格式要求。

我们接着往下面看

com/ruoyi/common/annotation/LoginUser.java

package com.ruoyi.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 登录用户信息
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser
{
}

这段代码定义了一个名为 `LoginUser` 的注解。 这个注解被标注可以应用于方法的参数(`ElementType.PARAMETER`),并且在运行时可以通过反射获取到(`RetentionPolicy.RUNTIME`)。

它的用途可能是在方法中标识某个参数代表登录用户的相关信息。开发人员可以在自定义的框架或业务逻辑中,通过反射机制获取被标注为 `@LoginUser` 的参数,并进行相应的处理,比如权限验证、用户信息获取与处理等操作。

我们接着看带代码

com/ruoyi/common/config/thread/ThreadPoolConfig.java

package com.ruoyi.common.config.thread;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import com.ruoyi.common.utils.Threads;

/**
 * 线程池配置
 *
 * @author ruoyi
 **/
@Configuration
public class ThreadPoolConfig
{
    // 核心线程池大小
    private int corePoolSize = 50;

    // 最大可创建的线程数
    private int maxPoolSize = 200;

    // 队列最大长度
    private int queueCapacity = 1000;

    // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds = 300;

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor()
    {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 线程池对拒绝任务(无线程可用)的处理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

    /**
     * 执行周期性或定时任务
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService()
    {
        return new ScheduledThreadPoolExecutor(corePoolSize,
                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build())
        {
            @Override
            protected void afterExecute(Runnable r, Throwable t)
            {
                super.afterExecute(r, t);
                Threads.printException(r, t);
            }
        };
    }
}

这段 Java 代码是一个 Spring 框架的配置类 `ThreadPoolConfig` ,用于配置线程池和定时任务执行器。 以下是对代码的详细解释:

1. 定义了一些线程池相关的参数,如 `corePoolSize`(核心线程池大小)、`maxPoolSize`(最大线程数)、`queueCapacity`(队列容量)和 `keepAliveSeconds`(线程空闲时间)

2. `threadPoolTaskExecutor` 方法创建并配置了一个 `ThreadPoolTaskExecutor` 对象,设置了最大线程数、核心线程数、队列容量、线程空闲时间以及拒绝任务处理策略。

3. `scheduledExecutorService` 方法创建了一个 `ScheduledThreadPoolExecutor` 对象,用于执行周期性或定时任务。通过 `BasicThreadFactory` 来设置线程的命名模式,并定义了 `afterExecute` 方法来处理任务执行后的异常打印。

总的来说,这段代码为应用提供了可配置的线程池和定时任务执行器,以满足不同的并发任务处理需求,并对异常情况进行了一定的处理。

接着看代码

com/ruoyi/common/config/ServerConfig.java

package com.ruoyi.common.config;

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.ServletUtils;

/**
 * 服务相关配置
 * 
 * @author ruoyi
 *
 */
@Component
public class ServerConfig
{
    /**
     * 获取完整的请求路径,包括:域名,端口,上下文访问路径
     * 
     * @return 服务地址
     */
    public String getUrl()
    {
        HttpServletRequest request = ServletUtils.getRequest();
        return getDomain(request);
    }

    public static String getDomain(HttpServletRequest request)
    {
        StringBuffer url = request.getRequestURL();
        String contextPath = request.getServletContext().getContextPath();
        return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
    }
}

这段代码定义了一个 `ServerConfig` 类,它被标注为 `@Component` ,表示这是一个 Spring 管理的组件。

`getUrl` 方法用于获取完整的请求路径,它通过 `ServletUtils.getRequest` 获取当前的 `HttpServletRequest` 对象,然后调用 `getDomain` 方法来获取并返回最终的完整路径。 `getDomain` 方法是一个静态方法,它接受一个 `HttpServletRequest` 对象作为参数。通过获取请求的原始 `URL` ,然后计算并删除与请求的具体 `URI` 部分对应的子串,最后加上上下文路径,从而拼接出完整的服务地址。

总的来说,这个类的主要作用是提供了一种从 `HttpServletRequest` 中获取完整服务地址的功能。

睡觉了家人们,明天更新.....zZZ.....

你可能感兴趣的:(java,spring,cloud,java,spring)