mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	完成 druid ad filter 组件
梳理 druid 的配置
This commit is contained in:
		@@ -1,28 +0,0 @@
 | 
			
		||||
package com.ruoyi.common.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.Documented;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Inherited;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
import com.ruoyi.common.enums.DataSourceType;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 自定义多数据源切换注解
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Target({ElementType.METHOD, ElementType.TYPE})
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
@Documented
 | 
			
		||||
@Inherited
 | 
			
		||||
public @interface DataSource {
 | 
			
		||||
    /**
 | 
			
		||||
     * 切换数据源名称
 | 
			
		||||
     */
 | 
			
		||||
    public DataSourceType value() default DataSourceType.MASTER;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,64 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.aspectj;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import org.aspectj.lang.ProceedingJoinPoint;
 | 
			
		||||
import org.aspectj.lang.annotation.Around;
 | 
			
		||||
import org.aspectj.lang.annotation.Aspect;
 | 
			
		||||
import org.aspectj.lang.annotation.Pointcut;
 | 
			
		||||
import org.aspectj.lang.reflect.MethodSignature;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.springframework.core.annotation.AnnotationUtils;
 | 
			
		||||
import org.springframework.core.annotation.Order;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import com.ruoyi.common.annotation.DataSource;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 多数据源处理
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Aspect
 | 
			
		||||
@Order(1)
 | 
			
		||||
@Component
 | 
			
		||||
public class DataSourceAspect {
 | 
			
		||||
    protected Logger logger = LoggerFactory.getLogger(getClass());
 | 
			
		||||
 | 
			
		||||
    @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)"
 | 
			
		||||
            + "|| @within(com.ruoyi.common.annotation.DataSource)")
 | 
			
		||||
    public void dsPointCut() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Around("dsPointCut()")
 | 
			
		||||
    public Object around(ProceedingJoinPoint point) throws Throwable {
 | 
			
		||||
        DataSource dataSource = getDataSource(point);
 | 
			
		||||
 | 
			
		||||
        if (StringUtils.isNotNull(dataSource)) {
 | 
			
		||||
            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            return point.proceed();
 | 
			
		||||
        } finally {
 | 
			
		||||
            // 销毁数据源 在执行方法之后
 | 
			
		||||
            DynamicDataSourceContextHolder.clearDataSourceType();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取需要切换的数据源
 | 
			
		||||
     */
 | 
			
		||||
    public DataSource getDataSource(ProceedingJoinPoint point) {
 | 
			
		||||
        MethodSignature signature = (MethodSignature) point.getSignature();
 | 
			
		||||
        DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
 | 
			
		||||
        if (Objects.nonNull(dataSource)) {
 | 
			
		||||
            return dataSource;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
package com.ruoyi.common.enums;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 数据源
 | 
			
		||||
 * 
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public enum DataSourceType
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * 主库
 | 
			
		||||
     */
 | 
			
		||||
    MASTER,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 从库
 | 
			
		||||
     */
 | 
			
		||||
    SLAVE
 | 
			
		||||
}
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.datasource;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
 | 
			
		||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 动态数据源
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class DynamicDataSource extends AbstractRoutingDataSource {
 | 
			
		||||
    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
 | 
			
		||||
        super.setDefaultTargetDataSource(defaultTargetDataSource);
 | 
			
		||||
        super.setTargetDataSources(targetDataSources);
 | 
			
		||||
        super.afterPropertiesSet();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected Object determineCurrentLookupKey() {
 | 
			
		||||
        return DynamicDataSourceContextHolder.getDataSourceType();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.datasource;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 数据源切换处理
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class DynamicDataSourceContextHolder {
 | 
			
		||||
    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
 | 
			
		||||
     * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
 | 
			
		||||
     */
 | 
			
		||||
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置数据源的变量
 | 
			
		||||
     */
 | 
			
		||||
    public static void setDataSourceType(String dsType) {
 | 
			
		||||
        log.info("切换到{}数据源", dsType);
 | 
			
		||||
        CONTEXT_HOLDER.set(dsType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得数据源的变量
 | 
			
		||||
     */
 | 
			
		||||
    public static String getDataSourceType() {
 | 
			
		||||
        return CONTEXT_HOLDER.get();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 清空数据源变量
 | 
			
		||||
     */
 | 
			
		||||
    public static void clearDataSourceType() {
 | 
			
		||||
        CONTEXT_HOLDER.remove();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,116 +0,0 @@
 | 
			
		||||
package com.ruoyi.framework.config;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import javax.servlet.Filter;
 | 
			
		||||
import javax.servlet.FilterChain;
 | 
			
		||||
import javax.servlet.ServletException;
 | 
			
		||||
import javax.servlet.ServletRequest;
 | 
			
		||||
import javax.servlet.ServletResponse;
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.context.annotation.Primary;
 | 
			
		||||
import com.alibaba.druid.pool.DruidDataSource;
 | 
			
		||||
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
 | 
			
		||||
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
 | 
			
		||||
import com.alibaba.druid.util.Utils;
 | 
			
		||||
import com.ruoyi.common.enums.DataSourceType;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
import com.ruoyi.framework.config.properties.DruidProperties;
 | 
			
		||||
import com.ruoyi.framework.datasource.DynamicDataSource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * druid 配置多数据源
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class DruidConfig {
 | 
			
		||||
    @Bean
 | 
			
		||||
    @ConfigurationProperties("spring.datasource.druid.master")
 | 
			
		||||
    public DataSource masterDataSource(DruidProperties druidProperties) {
 | 
			
		||||
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
 | 
			
		||||
        return druidProperties.dataSource(dataSource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Bean
 | 
			
		||||
    @ConfigurationProperties("spring.datasource.druid.slave")
 | 
			
		||||
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
 | 
			
		||||
    public DataSource slaveDataSource(DruidProperties druidProperties) {
 | 
			
		||||
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
 | 
			
		||||
        return druidProperties.dataSource(dataSource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Bean(name = "dynamicDataSource")
 | 
			
		||||
    @Primary
 | 
			
		||||
    public DynamicDataSource dataSource(DataSource masterDataSource) {
 | 
			
		||||
        Map<Object, Object> targetDataSources = new HashMap<>();
 | 
			
		||||
        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
 | 
			
		||||
        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
 | 
			
		||||
        return new DynamicDataSource(masterDataSource, targetDataSources);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置数据源
 | 
			
		||||
     *
 | 
			
		||||
     * @param targetDataSources 备选数据源集合
 | 
			
		||||
     * @param sourceName        数据源名称
 | 
			
		||||
     * @param beanName          bean名称
 | 
			
		||||
     */
 | 
			
		||||
    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName) {
 | 
			
		||||
        try {
 | 
			
		||||
            DataSource dataSource = SpringUtils.getBean(beanName);
 | 
			
		||||
            targetDataSources.put(sourceName, dataSource);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 去除监控页面底部的广告
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings({"rawtypes", "unchecked"})
 | 
			
		||||
    @Bean
 | 
			
		||||
    @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
 | 
			
		||||
    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) {
 | 
			
		||||
        // 获取web监控页面的参数
 | 
			
		||||
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
 | 
			
		||||
        // 提取common.js的配置路径
 | 
			
		||||
        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
 | 
			
		||||
        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
 | 
			
		||||
        final String filePath = "support/http/resources/js/common.js";
 | 
			
		||||
        // 创建filter进行过滤
 | 
			
		||||
        Filter filter = new Filter() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 | 
			
		||||
                    throws IOException, ServletException {
 | 
			
		||||
                chain.doFilter(request, response);
 | 
			
		||||
                // 重置缓冲区,响应头不会被重置
 | 
			
		||||
                response.resetBuffer();
 | 
			
		||||
                // 获取common.js
 | 
			
		||||
                String text = Utils.readFromResource(filePath);
 | 
			
		||||
                // 正则替换banner, 除去底部的广告信息
 | 
			
		||||
                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
 | 
			
		||||
                text = text.replaceAll("powered.*?shrek.wang</a>", "");
 | 
			
		||||
                response.getWriter().write(text);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void destroy() {
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
 | 
			
		||||
        registrationBean.setFilter(filter);
 | 
			
		||||
        registrationBean.addUrlPatterns(commonJsPattern);
 | 
			
		||||
        return registrationBean;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
# 数据源配置
 | 
			
		||||
spring:
 | 
			
		||||
    datasource:
 | 
			
		||||
        type: com.alibaba.druid.pool.DruidDataSource
 | 
			
		||||
        driverClassName: com.mysql.cj.jdbc.Driver
 | 
			
		||||
        druid:
 | 
			
		||||
            # 主库数据源
 | 
			
		||||
            master:
 | 
			
		||||
                url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
 | 
			
		||||
                username: root
 | 
			
		||||
                password: password
 | 
			
		||||
            # 从库数据源
 | 
			
		||||
            slave:
 | 
			
		||||
                # 从数据源开关/默认关闭
 | 
			
		||||
                enabled: false
 | 
			
		||||
                url:
 | 
			
		||||
                username:
 | 
			
		||||
                password:
 | 
			
		||||
            # 初始连接数
 | 
			
		||||
            initialSize: 5
 | 
			
		||||
            # 最小连接池数量
 | 
			
		||||
            minIdle: 10
 | 
			
		||||
            # 最大连接池数量
 | 
			
		||||
            maxActive: 20
 | 
			
		||||
            # 配置获取连接等待超时的时间
 | 
			
		||||
            maxWait: 60000
 | 
			
		||||
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
 | 
			
		||||
            timeBetweenEvictionRunsMillis: 60000
 | 
			
		||||
            # 配置一个连接在池中最小生存的时间,单位是毫秒
 | 
			
		||||
            minEvictableIdleTimeMillis: 300000
 | 
			
		||||
            # 配置一个连接在池中最大生存的时间,单位是毫秒
 | 
			
		||||
            maxEvictableIdleTimeMillis: 900000
 | 
			
		||||
            # 配置检测连接是否有效
 | 
			
		||||
            validationQuery: SELECT 1 FROM DUAL
 | 
			
		||||
            testWhileIdle: true
 | 
			
		||||
            testOnBorrow: false
 | 
			
		||||
            testOnReturn: false
 | 
			
		||||
@@ -1,12 +1,38 @@
 | 
			
		||||
package cn.iocoder.dashboard.framework.datasource.config;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.dashboard.framework.datasource.core.filter.DruidAdRemoveFilter;
 | 
			
		||||
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 数据库匹配类
 | 
			
		||||
 * 数据库配置类
 | 
			
		||||
 *
 | 
			
		||||
 * @author 芋道源码
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理
 | 
			
		||||
public class DataSourceConfiguration {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建 DruidAdRemoveFilter 过滤器,过滤 common.js 的广告
 | 
			
		||||
     */
 | 
			
		||||
    @Bean
 | 
			
		||||
    @ConditionalOnProperty(name = "spring.datasource.druid.web-stat-filter.enabled", havingValue = "true")
 | 
			
		||||
    public FilterRegistrationBean<DruidAdRemoveFilter> druidAdRemoveFilterFilter(DruidStatProperties properties) {
 | 
			
		||||
        // 获取 druid web 监控页面的参数
 | 
			
		||||
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
 | 
			
		||||
        // 提取 common.js 的配置路径
 | 
			
		||||
        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
 | 
			
		||||
        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
 | 
			
		||||
        // 创建 DruidAdRemoveFilter Bean
 | 
			
		||||
        FilterRegistrationBean<DruidAdRemoveFilter> registrationBean = new FilterRegistrationBean<>();
 | 
			
		||||
        registrationBean.setFilter(new DruidAdRemoveFilter());
 | 
			
		||||
        registrationBean.addUrlPatterns(commonJsPattern);
 | 
			
		||||
        return registrationBean;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package cn.iocoder.dashboard.framework.datasource.enums;
 | 
			
		||||
package cn.iocoder.dashboard.framework.datasource.core.enums;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 对应于多数据源中不同数据源配置
 | 
			
		||||
@@ -6,6 +6,9 @@ package cn.iocoder.dashboard.framework.datasource.enums;
 | 
			
		||||
 * 在方法上使用注解{@code  @DS(DatasourceMark.slave)}可以指定slave数据源,默认是master数据源
 | 
			
		||||
 */
 | 
			
		||||
public interface DatasourceMark {
 | 
			
		||||
    String master = "master";
 | 
			
		||||
    String slave = "slave";
 | 
			
		||||
 | 
			
		||||
    String MASTER = "master";
 | 
			
		||||
 | 
			
		||||
    String SLAVE = "slave";
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
package cn.iocoder.dashboard.framework.datasource.core.filter;
 | 
			
		||||
 | 
			
		||||
import com.alibaba.druid.util.Utils;
 | 
			
		||||
import org.springframework.web.filter.OncePerRequestFilter;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.FilterChain;
 | 
			
		||||
import javax.servlet.ServletException;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Druid 底部广告过滤器
 | 
			
		||||
 *
 | 
			
		||||
 * @author 芋道源码
 | 
			
		||||
 */
 | 
			
		||||
public class DruidAdRemoveFilter extends OncePerRequestFilter {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * common.js 的路径
 | 
			
		||||
     */
 | 
			
		||||
    private static final String COMMON_JS_ILE_PATH = "support/http/resources/js/common.js";
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
 | 
			
		||||
            throws ServletException, IOException {
 | 
			
		||||
        chain.doFilter(request, response);
 | 
			
		||||
        // 重置缓冲区,响应头不会被重置
 | 
			
		||||
        response.resetBuffer();
 | 
			
		||||
        // 获取 common.js
 | 
			
		||||
        String text = Utils.readFromResource(COMMON_JS_ILE_PATH);
 | 
			
		||||
        // 正则替换 banner, 除去底部的广告信息
 | 
			
		||||
        text = text.replaceAll("<a.*?banner\"></a><br/>", "");
 | 
			
		||||
        text = text.replaceAll("powered.*?shrek.wang</a>", "");
 | 
			
		||||
        response.getWriter().write(text);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -5,38 +5,41 @@ server:
 | 
			
		||||
 | 
			
		||||
spring:
 | 
			
		||||
  # 数据源配置项 TODO 监控配置
 | 
			
		||||
  # 排除默认的自动配置,使用dynamic-datasource-spring-boot-starter配置多数据源,整合druid
 | 
			
		||||
  autoconfigure:
 | 
			
		||||
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
 | 
			
		||||
    exclude:
 | 
			
		||||
      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
 | 
			
		||||
  datasource:
 | 
			
		||||
    druid:
 | 
			
		||||
    druid: # Druid 【监控】相关的全局配置
 | 
			
		||||
      web-stat-filter:
 | 
			
		||||
        enabled: true
 | 
			
		||||
      stat-view-servlet:
 | 
			
		||||
        enabled: true
 | 
			
		||||
        # 设置白名单,不填则允许所有访问
 | 
			
		||||
        allow:
 | 
			
		||||
        allow: # 设置白名单,不填则允许所有访问
 | 
			
		||||
        url-pattern: /druid/*
 | 
			
		||||
        # 控制台管理用户名和密码
 | 
			
		||||
        login-username:
 | 
			
		||||
        login-username: # 控制台管理用户名和密码
 | 
			
		||||
        login-password:
 | 
			
		||||
      filter:
 | 
			
		||||
        stat:
 | 
			
		||||
          enabled: true
 | 
			
		||||
          # 慢 SQL 记录
 | 
			
		||||
          log-slow-sql: true
 | 
			
		||||
          log-slow-sql: true # 慢 SQL 记录
 | 
			
		||||
          slow-sql-millis: 100
 | 
			
		||||
          merge-sql: true
 | 
			
		||||
        wall:
 | 
			
		||||
          config:
 | 
			
		||||
            multi-statement-allow: true
 | 
			
		||||
    dynamic:
 | 
			
		||||
      # druid全局配置 https://dynamic-datasource.com/en/guide/integration/Druid.html#configurate-parameters
 | 
			
		||||
#      druid: #The following are the supported global parameters
 | 
			
		||||
#        initial-size:
 | 
			
		||||
#        max-active:
 | 
			
		||||
#        min-idle:
 | 
			
		||||
#        max-wait:
 | 
			
		||||
    dynamic: # 多数据源配置
 | 
			
		||||
      druid: # Druid 【连接池】相关的全局配置
 | 
			
		||||
        initial-size: 5 # 初始连接数
 | 
			
		||||
        min-idle: 10 # 最小连接池数量
 | 
			
		||||
        max-active: 20 # 最大连接池数量
 | 
			
		||||
        max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
 | 
			
		||||
        time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
 | 
			
		||||
        min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
 | 
			
		||||
        max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
 | 
			
		||||
        validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
 | 
			
		||||
        test-while-idle: true
 | 
			
		||||
        test-on-borrow: false
 | 
			
		||||
        test-on-return: false
 | 
			
		||||
      primary: master
 | 
			
		||||
      datasource:
 | 
			
		||||
        master:
 | 
			
		||||
@@ -45,17 +48,12 @@ spring:
 | 
			
		||||
          driver-class-name: com.mysql.jdbc.Driver
 | 
			
		||||
          username: root
 | 
			
		||||
          password: 123456
 | 
			
		||||
          # druid 局部配置
 | 
			
		||||
#          druid: # The following are independent parameters that can be reset for each db
 | 
			
		||||
#            validation-query: select 1 FROM DUAL #such as oracle need this
 | 
			
		||||
#        slave:
 | 
			
		||||
#          name: ruoyi-vue-pro-slave
 | 
			
		||||
#          url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
 | 
			
		||||
#          driver-class-name: com.mysql.jdbc.Driver
 | 
			
		||||
#          username: root
 | 
			
		||||
#          password: 123456
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        slave:
 | 
			
		||||
          name: ruoyi-vue-slave
 | 
			
		||||
          url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
 | 
			
		||||
          driver-class-name: com.mysql.jdbc.Driver
 | 
			
		||||
          username: root
 | 
			
		||||
          password: 123456
 | 
			
		||||
 | 
			
		||||
  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
 | 
			
		||||
  redis:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user