From 5111319d21efdbe838dfdf4810650798a9ec7acf Mon Sep 17 00:00:00 2001 From: "wei.zhang2" Date: Fri, 13 Oct 2017 17:54:21 +0800 Subject: [PATCH] 1 --- .../server/config/AsycTaskExecutorConfig.java | 28 +++++ .../security/server/config/DruidConfig.java | 116 ++++++++++++++++++ .../server/config/SecurityConfig.java | 4 +- .../security/server/config/SwaggerConfig.java | 31 +++++ .../security/server/config/WebMvcConfig.java | 66 ++++++++++ .../page/table/PageTableArgumentResolver.java | 115 +++++++++++++++++ .../server/page/table/PageTableHandler.java | 43 +++++++ .../server/page/table/PageTableRequest.java | 24 ++++ .../server/page/table/PageTableResponse.java | 27 ++++ 9 files changed, 452 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/boot/security/server/config/AsycTaskExecutorConfig.java create mode 100644 src/main/java/com/boot/security/server/config/DruidConfig.java create mode 100644 src/main/java/com/boot/security/server/config/SwaggerConfig.java create mode 100644 src/main/java/com/boot/security/server/config/WebMvcConfig.java create mode 100644 src/main/java/com/boot/security/server/page/table/PageTableArgumentResolver.java create mode 100644 src/main/java/com/boot/security/server/page/table/PageTableHandler.java create mode 100644 src/main/java/com/boot/security/server/page/table/PageTableRequest.java create mode 100644 src/main/java/com/boot/security/server/page/table/PageTableResponse.java diff --git a/src/main/java/com/boot/security/server/config/AsycTaskExecutorConfig.java b/src/main/java/com/boot/security/server/config/AsycTaskExecutorConfig.java new file mode 100644 index 0000000..11c2fe9 --- /dev/null +++ b/src/main/java/com/boot/security/server/config/AsycTaskExecutorConfig.java @@ -0,0 +1,28 @@ +package com.boot.security.server.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * 线程池配置、启用异步 + * + * @author 小威老师 + * + * 2017年8月19日 + */ +@EnableAsync(proxyTargetClass = true) +@Configuration +public class AsycTaskExecutorConfig { + + @Bean + public TaskExecutor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(50); + taskExecutor.setMaxPoolSize(100); + + return taskExecutor; + } +} diff --git a/src/main/java/com/boot/security/server/config/DruidConfig.java b/src/main/java/com/boot/security/server/config/DruidConfig.java new file mode 100644 index 0000000..4a194d2 --- /dev/null +++ b/src/main/java/com/boot/security/server/config/DruidConfig.java @@ -0,0 +1,116 @@ +package com.boot.security.server.config; + +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +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.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +/** + * Druid数据源配置 + * + * @author 小威老师 + * + */ +@Slf4j(topic = "adminLogger") +@Configuration +public class DruidConfig { + + @Bean + public ServletRegistrationBean druidServlet() { + log.info("init Druid Servlet Configuration "); + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), + "/druid/*"); + // IP白名单 + servletRegistrationBean.addInitParameter("allow", "127.0.0.1"); + // IP黑名单(共同存在时,deny优先于allow) +// servletRegistrationBean.addInitParameter("deny", "192.168.27.26"); +// // 控制台管理用户 +// servletRegistrationBean.addInitParameter("loginUsername", "admin"); +// servletRegistrationBean.addInitParameter("loginPassword", "admin"); +// // 是否能够重置数据 禁用HTML页面上的“Reset All”功能 +// servletRegistrationBean.addInitParameter("resetEnable", "false"); + return servletRegistrationBean; + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } + + /** + * 数据源配置 + * + * @author 小威老师 + * + */ + @ConfigurationProperties(prefix = "spring.datasource") + @Getter + @Setter + class DataSourceProperties { + private String url; + private String username; + private String password; + private String driverClassName; + private int initialSize; + private int minIdle; + private int maxActive; + private int maxWait; + private int timeBetweenEvictionRunsMillis; + private int minEvictableIdleTimeMillis; + private String validationQuery; + private boolean testWhileIdle; + private boolean testOnBorrow; + private boolean testOnReturn; + private boolean poolPreparedStatements; + private int maxPoolPreparedStatementPerConnectionSize; + private String filters; + private String connectionProperties; + + @Bean + @Primary + public DataSource dataSource() { + DruidDataSource datasource = new DruidDataSource(); + datasource.setUrl(url); + datasource.setUsername(username); + datasource.setPassword(password); + datasource.setDriverClassName(driverClassName); + + datasource.setInitialSize(initialSize); + datasource.setMinIdle(minIdle); + datasource.setMaxActive(maxActive); + datasource.setMaxWait(maxWait); + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setValidationQuery(validationQuery); + datasource.setTestWhileIdle(testWhileIdle); + datasource.setTestOnBorrow(testOnBorrow); + datasource.setTestOnReturn(testOnReturn); + datasource.setPoolPreparedStatements(poolPreparedStatements); + datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); + try { + datasource.setFilters(filters); + } catch (SQLException e) { + log.error("异常", e); + } + datasource.setConnectionProperties(connectionProperties); + return datasource; + } + } +} diff --git a/src/main/java/com/boot/security/server/config/SecurityConfig.java b/src/main/java/com/boot/security/server/config/SecurityConfig.java index ad6f1b9..0cd87ec 100644 --- a/src/main/java/com/boot/security/server/config/SecurityConfig.java +++ b/src/main/java/com/boot/security/server/config/SecurityConfig.java @@ -20,8 +20,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().antMatchers("/css/**", "/fonts/**", "/img/**", "/js/**", "/layui/**").permitAll() - .anyRequest().authenticated().and().formLogin().loginProcessingUrl("/login") + http.authorizeRequests().antMatchers("/css/**", "/fonts/**", "/img/**", "/js/**", "/layui/**", "/files/*") + .permitAll().anyRequest().authenticated().and().formLogin().loginProcessingUrl("/login") .successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler).and() .logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); } diff --git a/src/main/java/com/boot/security/server/config/SwaggerConfig.java b/src/main/java/com/boot/security/server/config/SwaggerConfig.java new file mode 100644 index 0000000..110e172 --- /dev/null +++ b/src/main/java/com/boot/security/server/config/SwaggerConfig.java @@ -0,0 +1,31 @@ +package com.boot.security.server.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * swagger文档 + * + * @author 小威老师 + * + * 2017年7月21日 + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket docket() { + return new Docket(DocumentationType.SWAGGER_2).groupName("swagger接口文档") + .apiInfo(new ApiInfoBuilder().title("swagger接口文档") + .contact(new Contact("小威老师", "", "xiaoweijiagou@163.com")).version("1.0").build()) + .select().paths(PathSelectors.any()).build(); + } +} diff --git a/src/main/java/com/boot/security/server/config/WebMvcConfig.java b/src/main/java/com/boot/security/server/config/WebMvcConfig.java new file mode 100644 index 0000000..dfa8c80 --- /dev/null +++ b/src/main/java/com/boot/security/server/config/WebMvcConfig.java @@ -0,0 +1,66 @@ +package com.boot.security.server.config; + +import java.io.File; +import java.util.List; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.ResourceUtils; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import com.boot.security.server.page.table.PageTableArgumentResolver; + +@Configuration +public class WebMvcConfig extends WebMvcConfigurerAdapter { + + /** + * 跨域支持 + * + * @return + */ + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurerAdapter() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**").allowedMethods("*"); + } + }; + } + + /** + * datatable分页解析 + * + * @return + */ + @Bean + public PageTableArgumentResolver tableHandlerMethodArgumentResolver() { + return new PageTableArgumentResolver(); + } + + @Override + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(tableHandlerMethodArgumentResolver()); + } + + /** + * 上传文件根路径 + */ + @Value("${files.path}") + private String filesPath; + + /** + * 外部文件访问 + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/files/**") + .addResourceLocations(ResourceUtils.FILE_URL_PREFIX + filesPath + File.separator); + } + +} diff --git a/src/main/java/com/boot/security/server/page/table/PageTableArgumentResolver.java b/src/main/java/com/boot/security/server/page/table/PageTableArgumentResolver.java new file mode 100644 index 0000000..3a9eac0 --- /dev/null +++ b/src/main/java/com/boot/security/server/page/table/PageTableArgumentResolver.java @@ -0,0 +1,115 @@ +package com.boot.security.server.page.table; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.MethodParameter; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import com.google.common.collect.Maps; + +/** + * 分页、查询参数解析 + * + * @author 小威老师 + * + */ +public class PageTableArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + Class cla = parameter.getParameterType(); + + return cla.isAssignableFrom(PageTableRequest.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + + PageTableRequest tableRequest = new PageTableRequest(); + Map param = request.getParameterMap(); + if (param.containsKey("start")) { + tableRequest.setOffset(Integer.parseInt(request.getParameter("start"))); + } + + if (param.containsKey("length")) { + tableRequest.setLimit(Integer.parseInt(request.getParameter("length"))); + } + + Map map = Maps.newHashMap(); + tableRequest.setParams(map); + + param.forEach((k, v) -> { + if (v.length == 1) { + map.put(k, v[0]); + } else { + map.put(k, Arrays.asList(v)); + } + }); + + setOrderBy(tableRequest, map); + removeParam(tableRequest); + + return tableRequest; + } + + /** + * 去除datatables分页带的一些复杂参数 + * + * @param tableRequest + */ + private void removeParam(PageTableRequest tableRequest) { + Map map = tableRequest.getParams(); + + if (!CollectionUtils.isEmpty(map)) { + Map param = new HashMap<>(); + map.forEach((k, v) -> { + if (k.indexOf("[") < 0 && k.indexOf("]") < 0 && !"_".equals(k)) { + param.put(k, v); + } + }); + + tableRequest.setParams(param); + } + } + + /** + * 从datatables分页请求数据中解析排序 + * + * @param tableRequest + * @param map + */ + private void setOrderBy(PageTableRequest tableRequest, Map map) { + StringBuilder orderBy = new StringBuilder(); + int size = map.size(); + for (int i = 0; i < size; i++) { + String index = (String) map.get("order[" + i + "][column]"); + if (StringUtils.isEmpty(index)) { + break; + } + String column = (String) map.get("columns[" + index + "][data]"); + if (StringUtils.isBlank(column)) { + continue; + } + String sort = (String) map.get("order[" + i + "][dir]"); + + orderBy.append(column).append(" ").append(sort).append(", "); + } + + if (orderBy.length() > 0) { + tableRequest.getParams().put("orderBy", + " order by " + StringUtils.substringBeforeLast(orderBy.toString(), ",")); + } + } + +} diff --git a/src/main/java/com/boot/security/server/page/table/PageTableHandler.java b/src/main/java/com/boot/security/server/page/table/PageTableHandler.java new file mode 100644 index 0000000..59c52c6 --- /dev/null +++ b/src/main/java/com/boot/security/server/page/table/PageTableHandler.java @@ -0,0 +1,43 @@ +package com.boot.security.server.page.table; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Builder; + +/** + * 分页查询处理器 + * + * @author 小威老师 + * + */ +@Builder +public class PageTableHandler { + + private CountHandler countHandler; + private ListHandler listHandler; + + public PageTableResponse handle(PageTableRequest dtRequest) { + int count = 0; + List list = null; + + count = this.countHandler.count(dtRequest); + if (count > 0) { + list = this.listHandler.list(dtRequest); + } + + if (list == null) { + list = new ArrayList(); + } + + return PageTableResponse. builder().recordsTotal(count).recordsFiltered(count).data(list).build(); + } + + public interface ListHandler { + List list(PageTableRequest request); + } + + public interface CountHandler { + int count(PageTableRequest request); + } +} \ No newline at end of file diff --git a/src/main/java/com/boot/security/server/page/table/PageTableRequest.java b/src/main/java/com/boot/security/server/page/table/PageTableRequest.java new file mode 100644 index 0000000..968b8af --- /dev/null +++ b/src/main/java/com/boot/security/server/page/table/PageTableRequest.java @@ -0,0 +1,24 @@ +package com.boot.security.server.page.table; + +import java.io.Serializable; +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; + +/** + * 分页查询参数 + * + * @author 小威老师 + * + */ +@Getter +@Setter +public class PageTableRequest implements Serializable { + + private static final long serialVersionUID = 7328071045193618467L; + + private Integer offset; + private Integer limit; + private Map params; +} diff --git a/src/main/java/com/boot/security/server/page/table/PageTableResponse.java b/src/main/java/com/boot/security/server/page/table/PageTableResponse.java new file mode 100644 index 0000000..2e39be9 --- /dev/null +++ b/src/main/java/com/boot/security/server/page/table/PageTableResponse.java @@ -0,0 +1,27 @@ +package com.boot.security.server.page.table; + +import java.io.Serializable; +import java.util.List; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * 分页查询返回 + * + * @author 小威老师 + * + */ +@Getter +@Setter +@Builder +public class PageTableResponse implements Serializable { + + private static final long serialVersionUID = 620421858510718076L; + + private Integer recordsTotal; + private Integer recordsFiltered; + private List data; + +} \ No newline at end of file