Commit 7ad6ae49 authored by maliang's avatar maliang

蓝湾博阅广告投放

parents
2020-04-17 16:33:24,084 [main] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:33:24,224 [main] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:33:24,240 [localhost-startStop-1] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:34:25,231 [http-nio-8089-exec-1] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:34:25,432 [http-nio-8089-exec-4] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:34:38,761 [http-nio-8089-exec-3] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:34:38,764 [http-nio-8089-exec-5] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:34:38,765 [http-nio-8089-exec-6] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:34:38,766 [http-nio-8089-exec-4] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:44:54,814 [main] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:44:54,939 [main] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:44:54,970 [localhost-startStop-1] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:45:57,486 [http-nio-8089-exec-1] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
2020-04-17 16:45:57,677 [http-nio-8089-exec-4] ERROR o.a.c.core.AprLifecycleListener -[DirectJDKLog.java:180]- An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
This diff is collapsed.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boot</groupId>
<artifactId>boot-security</artifactId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<swagger.version>2.8.0</swagger.version>
<google.guava>23.0</google.guava>
<fastjson.version>1.2.47</fastjson.version>
<druid.version>1.1.9</druid.version>
<poi.version>3.17</poi.version>
<jwt.version>0.9.0</jwt.version>
<mybatis.version>1.3.2</mybatis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${google.guava}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId>
</dependency> -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>-->
<!--改为stater的方式-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.boot.security.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class, args);
}
}
package com.boot.security.server.advice;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.UnsatisfiedServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import com.boot.security.server.dto.ResponseInfo;
/**
* springmvc异常处理
*
* @author 398005446@qq.com
*
*/
@RestControllerAdvice
public class ExceptionHandlerAdvice {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@ExceptionHandler({ IllegalArgumentException.class })
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseInfo badRequestException(IllegalArgumentException exception) {
return new ResponseInfo(HttpStatus.BAD_REQUEST.value() + "", exception.getMessage());
}
@ExceptionHandler({ AccessDeniedException.class })
@ResponseStatus(HttpStatus.FORBIDDEN)
public ResponseInfo badRequestException(AccessDeniedException exception) {
return new ResponseInfo(HttpStatus.FORBIDDEN.value() + "", exception.getMessage());
}
@ExceptionHandler({ MissingServletRequestParameterException.class, HttpMessageNotReadableException.class,
UnsatisfiedServletRequestParameterException.class, MethodArgumentTypeMismatchException.class })
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseInfo badRequestException(Exception exception) {
return new ResponseInfo(HttpStatus.BAD_REQUEST.value() + "", exception.getMessage());
}
@ExceptionHandler(Throwable.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseInfo exception(Throwable throwable) {
log.error("系统异常", throwable);
return new ResponseInfo(HttpStatus.INTERNAL_SERVER_ERROR.value() + "", throwable.getMessage());
}
}
package com.boot.security.server.advice;
import com.boot.security.server.utils.UserUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.model.SysLogs;
import com.boot.security.server.service.SysLogService;
import io.swagger.annotations.ApiOperation;
/**
* 统一日志处理
*
* @author 398005446@qq.com
*
* 2017年8月19日
*/
@Aspect
@Component
public class LogAdvice {
@Autowired
private SysLogService logService;
@Around(value = "@annotation(com.boot.security.server.annotation.LogAnnotation)")
public Object logSave(ProceedingJoinPoint joinPoint) throws Throwable {
SysLogs sysLogs = new SysLogs();
sysLogs.setUser(UserUtil.getLoginUser()); // 设置当前登录用户
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
String module = null;
LogAnnotation logAnnotation = methodSignature.getMethod().getDeclaredAnnotation(LogAnnotation.class);
module = logAnnotation.module();
if (StringUtils.isEmpty(module)) {
ApiOperation apiOperation = methodSignature.getMethod().getDeclaredAnnotation(ApiOperation.class);
if (apiOperation != null) {
module = apiOperation.value();
}
}
if (StringUtils.isEmpty(module)) {
throw new RuntimeException("没有指定日志module");
}
sysLogs.setModule(module);
try {
Object object = joinPoint.proceed();
sysLogs.setFlag(true);
return object;
} catch (Exception e) {
sysLogs.setFlag(false);
sysLogs.setRemark(e.getMessage());
throw e;
} finally {
if (sysLogs.getUser() != null) {
logService.save(sysLogs);
}
}
}
}
买源码就到 《非凡资源店》
淘宝:https://shop412339646.taobao.com
更多优质源码,请访问:www.qiquCode.com
加微信获取最新源码信息:kofcheng201
<!--***************************************************
买源码就到 《非凡资源店》
网址:https://shop412339646.taobao.com
更多优质源码,请访问:www.qiquCode.com
加微信获取最新源码信息:kofcheng201
***************************************************
-->
\ No newline at end of file
package com.boot.security.server.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 日志注解
*
* @author 398005446@qq.com
*
* 2017年8月19日
*/
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
String module() default "";
}
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 奇趣源码商城 www.qiqucode.com
*
* 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;
}
}
package com.boot.security.server.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Primary;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* Druid数据源配置
* 2018.05.24改为配置的方式,配置前缀spring.datasource.druid,看下application.yml
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@Deprecated
//@Configuration
public class DruidConfig {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@Bean
public ServletRegistrationBean<StatViewServlet> druidServlet() {
log.info("init Druid Servlet Configuration ");
ServletRegistrationBean<StatViewServlet> 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<WebStatFilter> filterRegistrationBean() {
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(
new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
/**
* 数据源配置
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@ConfigurationProperties(prefix = "spring.datasource")
public 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;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMaxWait() {
return maxWait;
}
public void setMaxWait(int maxWait) {
this.maxWait = maxWait;
}
public int getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public int getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public String getValidationQuery() {
return validationQuery;
}
public void setValidationQuery(String validationQuery) {
this.validationQuery = validationQuery;
}
public boolean isTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public boolean isTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public boolean isPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public int getMaxPoolPreparedStatementPerConnectionSize() {
return maxPoolPreparedStatementPerConnectionSize;
}
public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
public String getConnectionProperties() {
return connectionProperties;
}
public void setConnectionProperties(String connectionProperties) {
this.connectionProperties = 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;
}
}
}
package com.boot.security.server.config;
import java.io.IOException;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class JobConfig {
public static final String KEY = "applicationContextSchedulerContextKey";
@Bean("adminQuartzScheduler")
public SchedulerFactoryBean quartzScheduler(DataSource dataSource) {
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
try {
quartzScheduler.setQuartzProperties(
PropertiesLoaderUtils.loadProperties(new ClassPathResource("quartz.properties")));
} catch (IOException e) {
e.printStackTrace();
}
quartzScheduler.setDataSource(dataSource);
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setApplicationContextSchedulerContextKey(KEY);
quartzScheduler.setStartupDelay(10);
return quartzScheduler;
}
// @Autowired
// private JobService jobService;
// @Autowired
// private TaskExecutor taskExecutor;
//
// /**
// * 初始化一个定时删除日志的任务
// */
// @PostConstruct
// public void initDeleteLogsJob() {
// taskExecutor.execute(() -> {
// JobModel jobModel = new JobModel();
// jobModel.setJobName("delete-logs-job");
// jobModel.setCron("0 0 0 * * ?");
// jobModel.setDescription("定时删除三个月前日志");
// jobModel.setSpringBeanName("sysLogServiceImpl");
// jobModel.setMethodName("deleteLogs");
// jobModel.setIsSysJob(true);
// jobModel.setStatus(1);
//
// jobService.saveJob(jobModel);
// });
// }
}
package com.boot.security.server.config;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.view.RedirectView;
@Controller
public class LoginPageConfig {
@RequestMapping("/")
public RedirectView loginPage() {
return new RedirectView("/login.html");
}
}
package com.boot.security.server.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
/**
* redis配置<br>
* 集群下启动session共享,需打开@EnableRedisHttpSession<br>
* 单机下不需要
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年8月10日
*/
//@EnableRedisHttpSession
@Configuration
public class RedisConfig {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Bean("redisTemplate")
public RedisTemplate redisTemplate(@Lazy RedisConnectionFactory connectionFactory) {
RedisTemplate redis = new RedisTemplate();
GenericToStringSerializer<String> keySerializer = new GenericToStringSerializer<String>(String.class);
redis.setKeySerializer(keySerializer);
redis.setHashKeySerializer(keySerializer);
GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
redis.setValueSerializer(valueSerializer);
redis.setHashValueSerializer(valueSerializer);
redis.setConnectionFactory(connectionFactory);
return redis;
}
}
package com.boot.security.server.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import com.boot.security.server.filter.TokenFilter;
/**
* spring security配置
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年10月16日
*
*/
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthenticationSuccessHandler authenticationSuccessHandler;
@Autowired
private AuthenticationFailureHandler authenticationFailureHandler;
@Autowired
private LogoutSuccessHandler logoutSuccessHandler;
@Autowired
private AuthenticationEntryPoint authenticationEntryPoint;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private TokenFilter tokenFilter;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
// 基于token,所以不需要session
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.authorizeRequests()
.antMatchers("/", "/*.html", "/favicon.ico", "/css/**", "/js/**", "/fonts/**", "/layui/**", "/img/**",
"/v2/api-docs/**", "/swagger-resources/**", "/webjars/**", "/pages/**", "/druid/**",
"/statics/**")
.permitAll().anyRequest().authenticated();
http.formLogin().loginProcessingUrl("/login")
.successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler).and()
.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
http.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 解决不允许显示在iframe的问题
http.headers().frameOptions().disable();
http.headers().cacheControl();
http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
}
}
package com.boot.security.server.config;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import com.boot.security.server.dto.LoginUser;
import com.boot.security.server.dto.ResponseInfo;
import com.boot.security.server.dto.Token;
import com.boot.security.server.filter.TokenFilter;
import com.boot.security.server.service.TokenService;
import com.boot.security.server.utils.ResponseUtil;
/**
* spring security处理器
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年10月16日
*/
@Configuration
public class SecurityHandlerConfig {
@Autowired
private TokenService tokenService;
/**
* 登陆成功,返回Token
*
* @return
*/
@Bean
public AuthenticationSuccessHandler loginSuccessHandler() {
return new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
Token token = tokenService.saveToken(loginUser);
ResponseUtil.responseJson(response, HttpStatus.OK.value(), token);
}
};
}
/**
* 登陆失败
*
* @return
*/
@Bean
public AuthenticationFailureHandler loginFailureHandler() {
return new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
String msg = null;
if (exception instanceof BadCredentialsException) {
msg = "密码错误";
} else {
msg = exception.getMessage();
}
ResponseInfo info = new ResponseInfo(HttpStatus.UNAUTHORIZED.value() + "", msg);
ResponseUtil.responseJson(response, HttpStatus.UNAUTHORIZED.value(), info);
}
};
}
/**
* 未登录,返回401
*
* @return
*/
@Bean
public AuthenticationEntryPoint authenticationEntryPoint() {
return new AuthenticationEntryPoint() {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
ResponseInfo info = new ResponseInfo(HttpStatus.UNAUTHORIZED.value() + "", "请先登录");
ResponseUtil.responseJson(response, HttpStatus.UNAUTHORIZED.value(), info);
}
};
}
/**
* 退出处理
*
* @return
*/
@Bean
public LogoutSuccessHandler logoutSussHandler() {
return new LogoutSuccessHandler() {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
ResponseInfo info = new ResponseInfo(HttpStatus.OK.value() + "", "退出成功");
String token = TokenFilter.getToken(request);
tokenService.deleteToken(token);
ResponseUtil.responseJson(response, HttpStatus.OK.value(), info);
}
};
}
}
package com.boot.security.server.config;
import com.boot.security.server.filter.TokenFilter;
import com.google.common.collect.Lists;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.schema.ModelRef;
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 奇趣源码商城 www.qiqucode.com
*
* 2017年7月21日
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket docket() {
ParameterBuilder builder = new ParameterBuilder();
builder.parameterType("header").name(TokenFilter.TOKEN_KEY)
.description("header参数")
.required(false)
.modelRef(new ModelRef("string")); // 在swagger里显示header
return new Docket(DocumentationType.SWAGGER_2).groupName("swagger接口文档")
.apiInfo(new ApiInfoBuilder().title("swagger接口文档")
.contact(new Contact("奇趣源码商城", "", "chengzg1011@163.com")).version("1.0").build())
.globalOperationParameters(Lists.newArrayList(builder.build()))
.select().paths(PathSelectors.any()).build();
}
}
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 com.boot.security.server.page.table.PageTableArgumentResolver;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 跨域支持
*
* @return
*/
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("*");
}
};
}
/**
* datatable分页解析
*
* @return
*/
@Bean
public PageTableArgumentResolver tableHandlerMethodArgumentResolver() {
return new PageTableArgumentResolver();
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(tableHandlerMethodArgumentResolver());
}
/**
* 上传文件根路径
*/
@Value("${files.path}")
private String filesPath;
/**
* 外部文件访问
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/statics/**")
.addResourceLocations(ResourceUtils.FILE_URL_PREFIX + filesPath + File.separator);
}
}
package com.boot.security.server.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.dao.DictDao;
import com.boot.security.server.model.Dict;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import io.swagger.annotations.ApiOperation;
@RestController
@RequestMapping("/dicts")
public class DictController {
@Autowired
private DictDao dictDao;
@PreAuthorize("hasAuthority('dict:add')")
@PostMapping
@ApiOperation(value = "保存")
public Dict save(@RequestBody Dict dict) {
Dict d = dictDao.getByTypeAndK(dict.getType(), dict.getK());
if (d != null) {
throw new IllegalArgumentException("类型和key已存在");
}
dictDao.save(dict);
return dict;
}
@GetMapping("/{id}")
@ApiOperation(value = "根据id获取")
public Dict get(@PathVariable Long id) {
return dictDao.getById(id);
}
@PreAuthorize("hasAuthority('dict:add')")
@PutMapping
@ApiOperation(value = "修改")
public Dict update(@RequestBody Dict dict) {
dictDao.update(dict);
return dict;
}
@PreAuthorize("hasAuthority('dict:query')")
@GetMapping(params = { "start", "length" })
@ApiOperation(value = "列表")
public PageTableResponse list(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return dictDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<Dict> list(PageTableRequest request) {
return dictDao.list(request.getParams(), request.getOffset(), request.getLimit());
}
}).handle(request);
}
@PreAuthorize("hasAuthority('dict:del')")
@DeleteMapping("/{id}")
@ApiOperation(value = "删除")
public void delete(@PathVariable Long id) {
dictDao.delete(id);
}
@GetMapping(params = "type")
public List<Dict> listByType(String type) {
return dictDao.listByType(type);
}
}
package com.boot.security.server.controller;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.utils.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@Api(tags = "excel下载")
@RestController
@RequestMapping("/excels")
public class ExcelController {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@Autowired
private JdbcTemplate jdbcTemplate;
@ApiOperation("校验sql,并返回sql返回的数量")
@PostMapping("/sql-count")
public Integer checkSql(String sql) {
log.info(sql);
sql = getAndCheckSql(sql);
Integer count = 0;
try {
count = jdbcTemplate.queryForObject("select count(1) from (" + sql + ") t", Integer.class);
} catch (Exception e) {
throw new IllegalArgumentException(e.getMessage());
}
return count;
}
private String getAndCheckSql(String sql) {
sql = sql.trim().toLowerCase();
if (sql.endsWith(";") || sql.endsWith(";")) {
sql = sql.substring(0, sql.length() - 1);
}
if (!sql.startsWith("select")) {
throw new IllegalArgumentException("仅支持select语句");
}
return sql;
}
@LogAnnotation
@ApiOperation("根据sql导出excel")
@PostMapping
@PreAuthorize("hasAuthority('excel:down')")
public void downloadExcel(String sql, String fileName, HttpServletResponse response) {
sql = getAndCheckSql(sql);
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (!CollectionUtils.isEmpty(list)) {
Map<String, Object> map = list.get(0);
String[] headers = new String[map.size()];
int i = 0;
for (String key : map.keySet()) {
headers[i++] = key;
}
List<Object[]> datas = new ArrayList<>(list.size());
for (Map<String, Object> m : list) {
Object[] objects = new Object[headers.length];
for (int j = 0; j < headers.length; j++) {
objects[j] = m.get(headers[j]);
}
datas.add(objects);
}
ExcelUtil.excelExport(
fileName == null || fileName.trim().length() <= 0 ? DigestUtils.md5Hex(sql) : fileName, headers,
datas, response);
}
}
@LogAnnotation
@ApiOperation("根据sql在页面显示结果")
@PostMapping("/show-datas")
@PreAuthorize("hasAuthority('excel:show:datas')")
public List<Object[]> showData(String sql) {
sql = getAndCheckSql(sql);
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (!CollectionUtils.isEmpty(list)) {
Map<String, Object> map = list.get(0);
String[] headers = new String[map.size()];
int i = 0;
for (String key : map.keySet()) {
headers[i++] = key;
}
List<Object[]> datas = new ArrayList<>(list.size());
datas.add(headers);
for (Map<String, Object> m : list) {
Object[] objects = new Object[headers.length];
for (int j = 0; j < headers.length; j++) {
objects[j] = m.get(headers[j]);
}
datas.add(objects);
}
return datas;
}
return Collections.emptyList();
}
}
package com.boot.security.server.controller;
import java.io.IOException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.FileInfoDao;
import com.boot.security.server.dto.LayuiFile;
import com.boot.security.server.dto.LayuiFile.LayuiFileData;
import com.boot.security.server.model.FileInfo;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import com.boot.security.server.service.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@Api(tags = "文件")
@RestController
@RequestMapping("/files")
public class FileController {
@Autowired
private FileService fileService;
@Autowired
private FileInfoDao fileInfoDao;
@LogAnnotation
@PostMapping
@ApiOperation(value = "文件上传")
public FileInfo uploadFile(MultipartFile file) throws IOException {
return fileService.save(file);
}
/**
* layui富文本文件自定义上传
*
* @param file
* @param domain
* @return
* @throws IOException
*/
@LogAnnotation
@PostMapping("/layui")
@ApiOperation(value = "layui富文本文件自定义上传")
public LayuiFile uploadLayuiFile(MultipartFile file, String domain) throws IOException {
FileInfo fileInfo = fileService.save(file);
LayuiFile layuiFile = new LayuiFile();
layuiFile.setCode(0);
LayuiFileData data = new LayuiFileData();
layuiFile.setData(data);
data.setSrc(domain + "/statics" + fileInfo.getUrl());
data.setTitle(file.getOriginalFilename());
return layuiFile;
}
@GetMapping
@ApiOperation(value = "文件查询")
@PreAuthorize("hasAuthority('sys:file:query')")
public PageTableResponse listFiles(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return fileInfoDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<FileInfo> list(PageTableRequest request) {
List<FileInfo> list = fileInfoDao.list(request.getParams(), request.getOffset(), request.getLimit());
return list;
}
}).handle(request);
}
@LogAnnotation
@DeleteMapping("/{id}")
@ApiOperation(value = "文件删除")
@PreAuthorize("hasAuthority('sys:file:del')")
public void delete(@PathVariable String id) {
fileService.delete(id);
}
}
package com.boot.security.server.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dto.BeanField;
import com.boot.security.server.dto.GenerateDetail;
import com.boot.security.server.dto.GenerateInput;
import com.boot.security.server.service.GenerateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* 代码生成接口
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@Api(tags = "代码生成")
@RestController
@RequestMapping("/generate")
public class GenerateController {
@Autowired
private GenerateService generateService;
@ApiOperation("根据表名显示表信息")
@GetMapping(params = { "tableName" })
@PreAuthorize("hasAuthority('generate:edit')")
public GenerateDetail generateByTableName(String tableName) {
GenerateDetail detail = new GenerateDetail();
detail.setBeanName(generateService.upperFirstChar(tableName));
List<BeanField> fields = generateService.listBeanField(tableName);
detail.setFields(fields);
return detail;
}
@LogAnnotation
@ApiOperation("生成代码")
@PostMapping
@PreAuthorize("hasAuthority('generate:edit')")
public void save(@RequestBody GenerateInput input) {
generateService.saveCode(input);
}
}
package com.boot.security.server.controller;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.JobDao;
import com.boot.security.server.model.JobModel;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import com.boot.security.server.service.JobService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.quartz.CronExpression;
import org.quartz.SchedulerException;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
@Api(tags = "定时任务")
@RestController
@RequestMapping("/jobs")
public class JobController {
@Autowired
private JobService jobService;
@Autowired
private JobDao jobDao;
@LogAnnotation
@ApiOperation("添加定时任务")
@PostMapping
@PreAuthorize("hasAuthority('job:add')")
public void add(@RequestBody JobModel jobModel) {
JobModel model = jobDao.getByName(jobModel.getJobName());
if (model != null) {
throw new IllegalArgumentException(jobModel.getJobName() + "已存在");
}
jobModel.setIsSysJob(false);
jobService.saveJob(jobModel);
}
@LogAnnotation
@ApiOperation("修改定时任务")
@PutMapping
@PreAuthorize("hasAuthority('job:add')")
public void update(@RequestBody JobModel jobModel) {
jobModel.setStatus(1);
jobService.saveJob(jobModel);
}
@LogAnnotation
@ApiOperation("删除定时任务")
@DeleteMapping("/{id}")
@PreAuthorize("hasAuthority('job:del')")
public void delete(@PathVariable Long id) throws SchedulerException {
jobService.deleteJob(id);
}
@ApiOperation("根据id获取定时任务")
@GetMapping("/{id}")
@PreAuthorize("hasAuthority('job:query')")
public JobModel getById(@PathVariable Long id) {
return jobDao.getById(id);
}
@GetMapping
@ApiOperation(value = "定时任务列表")
@PreAuthorize("hasAuthority('job:query')")
public PageTableResponse list(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return jobDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<JobModel> list(PageTableRequest request) {
List<JobModel> list = jobDao.list(request.getParams(), request.getOffset(), request.getLimit());
return list;
}
}).handle(request);
}
@ApiOperation(value = "校验cron表达式")
@GetMapping(params = "cron")
public boolean checkCron(String cron) {
return CronExpression.isValidExpression(cron);
}
@Autowired
private ApplicationContext applicationContext;
@ApiOperation(value = "springBean名字")
@GetMapping("/beans")
public List<String> listAllBeanName() {
String[] strings = applicationContext.getBeanDefinitionNames();
List<String> list = new ArrayList<>();
for (String str : strings) {
if (str.contains(".")) {
continue;
}
Class<?> clazz = getClass(str);
// if (clazz.isAssignableFrom(Controller.class) || clazz.isAnnotationPresent(RestController.class)) {
// continue;
// }
//
// list.add(str);
// 2018.07.26修改 上面注释的add添加了太多不认识的bean,改为下面的判断我们只添加service,bean少了不少
if (clazz.isAnnotationPresent(Service.class) && str.toLowerCase().contains("service")) {
list.add(str);
}
}
// list.sort((l1, l2) -> l1.compareTo(l2));
Collections.sort(list);// 2018.07.26修改排序
return list;
}
@ApiOperation(value = "springBean的无参方法")
@GetMapping("/beans/{name}")
public Set<String> listMethodName(@PathVariable String name) {
Class<?> clazz = getClass(name);
Method[] methods = clazz.getDeclaredMethods();
Set<String> names = new HashSet<>();
Arrays.asList(methods).forEach(m -> {
int b = m.getModifiers();// public 1 static 8 final 16
// if (b == 1 || b == 9 || b == 17 || b == 25) {
if (Modifier.isPublic(b)) { // 2018.07.26修改public方法的判断
Class<?>[] classes = m.getParameterTypes();
if (classes.length == 0) {
names.add(m.getName());
}
}
});
return names;
}
private Class<?> getClass(String name) {
Object object = applicationContext.getBean(name);
Class<?> clazz = object.getClass();
if (AopUtils.isAopProxy(object)) {
clazz = clazz.getSuperclass();
}
return clazz;
}
}
package com.boot.security.server.controller;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.MailDao;
import com.boot.security.server.model.Mail;
import com.boot.security.server.model.MailTo;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import com.boot.security.server.service.MailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@Api(tags = "邮件")
@RestController
@RequestMapping("/mails")
public class MailController {
@Autowired
private MailDao mailDao;
@Autowired
private MailService mailService;
@LogAnnotation
@PostMapping
@ApiOperation(value = "保存邮件")
@PreAuthorize("hasAuthority('mail:send')")
public Mail save(@RequestBody Mail mail) {
String toUsers = mail.getToUsers().trim();
if (StringUtils.isBlank(toUsers)) {
throw new IllegalArgumentException("收件人不能为空");
}
toUsers = toUsers.replace(" ", "");
toUsers = toUsers.replace(";", ";");
String[] strings = toUsers.split(";");
List<String> toUser = Arrays.asList(strings);
toUser = toUser.stream().filter(u -> !StringUtils.isBlank(u)).map(u -> u.trim()).collect(Collectors.toList());
mailService.save(mail, toUser);
return mail;
}
@GetMapping("/{id}")
@ApiOperation(value = "根据id获取邮件")
@PreAuthorize("hasAuthority('mail:all:query')")
public Mail get(@PathVariable Long id) {
return mailDao.getById(id);
}
@GetMapping("/{id}/to")
@ApiOperation(value = "根据id获取邮件发送详情")
@PreAuthorize("hasAuthority('mail:all:query')")
public List<MailTo> getMailTo(@PathVariable Long id) {
return mailDao.getToUsers(id);
}
@GetMapping
@ApiOperation(value = "邮件列表")
@PreAuthorize("hasAuthority('mail:all:query')")
public PageTableResponse list(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return mailDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<Mail> list(PageTableRequest request) {
return mailDao.list(request.getParams(), request.getOffset(), request.getLimit());
}
}).handle(request);
}
}
package com.boot.security.server.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.NoticeDao;
import com.boot.security.server.dto.NoticeReadVO;
import com.boot.security.server.dto.NoticeVO;
import com.boot.security.server.model.Notice;
import com.boot.security.server.model.SysUser;
import com.boot.security.server.model.Notice.Status;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import com.boot.security.server.utils.UserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@Api(tags = "公告")
@RestController
@RequestMapping("/notices")
public class NoticeController {
@Autowired
private NoticeDao noticeDao;
@LogAnnotation
@PostMapping
@ApiOperation(value = "保存公告")
@PreAuthorize("hasAuthority('notice:add')")
public Notice saveNotice(@RequestBody Notice notice) {
noticeDao.save(notice);
return notice;
}
@GetMapping("/{id}")
@ApiOperation(value = "根据id获取公告")
@PreAuthorize("hasAuthority('notice:query')")
public Notice get(@PathVariable Long id) {
return noticeDao.getById(id);
}
@GetMapping(params = "id")
public NoticeVO readNotice(Long id) {
NoticeVO vo = new NoticeVO();
Notice notice = noticeDao.getById(id);
if (notice == null || notice.getStatus() == Status.DRAFT) {
return vo;
}
vo.setNotice(notice);
noticeDao.saveReadRecord(notice.getId(), UserUtil.getLoginUser().getId());
List<SysUser> users = noticeDao.listReadUsers(id);
vo.setUsers(users);
return vo;
}
@LogAnnotation
@PutMapping
@ApiOperation(value = "修改公告")
@PreAuthorize("hasAuthority('notice:add')")
public Notice updateNotice(@RequestBody Notice notice) {
Notice no = noticeDao.getById(notice.getId());
if (no.getStatus() == Status.PUBLISH) {
throw new IllegalArgumentException("发布状态的不能修改");
}
noticeDao.update(notice);
return notice;
}
@GetMapping
@ApiOperation(value = "公告管理列表")
@PreAuthorize("hasAuthority('notice:query')")
public PageTableResponse listNotice(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return noticeDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<Notice> list(PageTableRequest request) {
return noticeDao.list(request.getParams(), request.getOffset(), request.getLimit());
}
}).handle(request);
}
@LogAnnotation
@DeleteMapping("/{id}")
@ApiOperation(value = "删除公告")
@PreAuthorize("hasAuthority('notice:del')")
public void delete(@PathVariable Long id) {
noticeDao.delete(id);
}
@ApiOperation(value = "未读公告数")
@GetMapping("/count-unread")
public Integer countUnread() {
SysUser user = UserUtil.getLoginUser();
return noticeDao.countUnread(user.getId());
}
@GetMapping("/published")
@ApiOperation(value = "公告列表")
public PageTableResponse listNoticeReadVO(PageTableRequest request) {
request.getParams().put("userId", UserUtil.getLoginUser().getId());
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return noticeDao.countNotice(request.getParams());
}
}, new ListHandler() {
@Override
public List<NoticeReadVO> list(PageTableRequest request) {
return noticeDao.listNotice(request.getParams(), request.getOffset(), request.getLimit());
}
}).handle(request);
}
}
package com.boot.security.server.controller;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.PermissionDao;
import com.boot.security.server.dto.LoginUser;
import com.boot.security.server.model.Permission;
import com.boot.security.server.service.PermissionService;
import com.boot.security.server.utils.UserUtil;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* 权限相关接口
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@Api(tags = "权限")
@RestController
@RequestMapping("/permissions")
public class PermissionController {
@Autowired
private PermissionDao permissionDao;
@Autowired
private PermissionService permissionService;
@ApiOperation(value = "当前登录用户拥有的权限")
@GetMapping("/current")
public List<Permission> permissionsCurrent() {
LoginUser loginUser = UserUtil.getLoginUser();
List<Permission> list = loginUser.getPermissions();
final List<Permission> permissions = list.stream().filter(l -> l.getType().equals(1))
.collect(Collectors.toList());
// setChild(permissions);
//
// return permissions.stream().filter(p -> p.getParentId().equals(0L)).collect(Collectors.toList());
// 2018.06.09 支持多级菜单
List<Permission> firstLevel = permissions.stream().filter(p -> p.getParentId().equals(0L)).collect(Collectors.toList());
firstLevel.parallelStream().forEach(p -> {
setChild(p, permissions);
});
return firstLevel;
}
/**
* 设置子元素
* 2018.06.09
*
* @param p
* @param permissions
*/
private void setChild(Permission p, List<Permission> permissions) {
List<Permission> child = permissions.parallelStream().filter(a -> a.getParentId().equals(p.getId())).collect(Collectors.toList());
p.setChild(child);
if (!CollectionUtils.isEmpty(child)) {
child.parallelStream().forEach(c -> {
//递归设置子元素,多级菜单支持
setChild(c, permissions);
});
}
}
// private void setChild(List<Permission> permissions) {
// permissions.parallelStream().forEach(per -> {
// List<Permission> child = permissions.stream().filter(p -> p.getParentId().equals(per.getId()))
// .collect(Collectors.toList());
// per.setChild(child);
// });
// }
/**
* 菜单列表
*
* @param pId
* @param permissionsAll
* @param list
*/
private void setPermissionsList(Long pId, List<Permission> permissionsAll, List<Permission> list) {
for (Permission per : permissionsAll) {
if (per.getParentId().equals(pId)) {
list.add(per);
if (permissionsAll.stream().filter(p -> p.getParentId().equals(per.getId())).findAny() != null) {
setPermissionsList(per.getId(), permissionsAll, list);
}
}
}
}
@GetMapping
@ApiOperation(value = "菜单列表")
@PreAuthorize("hasAuthority('sys:menu:query')")
public List<Permission> permissionsList() {
List<Permission> permissionsAll = permissionDao.listAll();
List<Permission> list = Lists.newArrayList();
setPermissionsList(0L, permissionsAll, list);
return list;
}
@GetMapping("/all")
@ApiOperation(value = "所有菜单")
@PreAuthorize("hasAuthority('sys:menu:query')")
public JSONArray permissionsAll() {
List<Permission> permissionsAll = permissionDao.listAll();
JSONArray array = new JSONArray();
setPermissionsTree(0L, permissionsAll, array);
return array;
}
@GetMapping("/parents")
@ApiOperation(value = "一级菜单")
@PreAuthorize("hasAuthority('sys:menu:query')")
public List<Permission> parentMenu() {
List<Permission> parents = permissionDao.listParents();
return parents;
}
/**
* 菜单树
*
* @param pId
* @param permissionsAll
* @param array
*/
private void setPermissionsTree(Long pId, List<Permission> permissionsAll, JSONArray array) {
for (Permission per : permissionsAll) {
if (per.getParentId().equals(pId)) {
String string = JSONObject.toJSONString(per);
JSONObject parent = (JSONObject) JSONObject.parse(string);
array.add(parent);
if (permissionsAll.stream().filter(p -> p.getParentId().equals(per.getId())).findAny() != null) {
JSONArray child = new JSONArray();
parent.put("child", child);
setPermissionsTree(per.getId(), permissionsAll, child);
}
}
}
}
@GetMapping(params = "roleId")
@ApiOperation(value = "根据角色id获取权限")
@PreAuthorize("hasAnyAuthority('sys:menu:query','sys:role:query')")
public List<Permission> listByRoleId(Long roleId) {
return permissionDao.listByRoleId(roleId);
}
@LogAnnotation
@PostMapping
@ApiOperation(value = "保存菜单")
@PreAuthorize("hasAuthority('sys:menu:add')")
public void save(@RequestBody Permission permission) {
permissionDao.save(permission);
}
@GetMapping("/{id}")
@ApiOperation(value = "根据菜单id获取菜单")
@PreAuthorize("hasAuthority('sys:menu:query')")
public Permission get(@PathVariable Long id) {
return permissionDao.getById(id);
}
@LogAnnotation
@PutMapping
@ApiOperation(value = "修改菜单")
@PreAuthorize("hasAuthority('sys:menu:add')")
public void update(@RequestBody Permission permission) {
permissionService.update(permission);
}
/**
* 校验权限
*
* @return
*/
@GetMapping("/owns")
@ApiOperation(value = "校验当前用户的权限")
public Set<String> ownsPermission() {
List<Permission> permissions = UserUtil.getLoginUser().getPermissions();
if (CollectionUtils.isEmpty(permissions)) {
return Collections.emptySet();
}
return permissions.parallelStream().filter(p -> !StringUtils.isEmpty(p.getPermission()))
.map(Permission::getPermission).collect(Collectors.toSet());
}
@LogAnnotation
@DeleteMapping("/{id}")
@ApiOperation(value = "删除菜单")
@PreAuthorize("hasAuthority('sys:menu:del')")
public void delete(@PathVariable Long id) {
permissionService.delete(id);
}
}
package com.boot.security.server.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.RoleDao;
import com.boot.security.server.dto.RoleDto;
import com.boot.security.server.model.Role;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import com.boot.security.server.service.RoleService;
import com.google.common.collect.Maps;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* 角色相关接口
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@Api(tags = "角色")
@RestController
@RequestMapping("/roles")
public class RoleController {
@Autowired
private RoleService roleService;
@Autowired
private RoleDao roleDao;
@LogAnnotation
@PostMapping
@ApiOperation(value = "保存角色")
@PreAuthorize("hasAuthority('sys:role:add')")
public void saveRole(@RequestBody RoleDto roleDto) {
roleService.saveRole(roleDto);
}
@GetMapping
@ApiOperation(value = "角色列表")
@PreAuthorize("hasAuthority('sys:role:query')")
public PageTableResponse listRoles(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return roleDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<Role> list(PageTableRequest request) {
List<Role> list = roleDao.list(request.getParams(), request.getOffset(), request.getLimit());
return list;
}
}).handle(request);
}
@GetMapping("/{id}")
@ApiOperation(value = "根据id获取角色")
@PreAuthorize("hasAuthority('sys:role:query')")
public Role get(@PathVariable Long id) {
return roleDao.getById(id);
}
@GetMapping("/all")
@ApiOperation(value = "所有角色")
@PreAuthorize("hasAnyAuthority('sys:user:query','sys:role:query')")
public List<Role> roles() {
return roleDao.list(Maps.newHashMap(), null, null);
}
@GetMapping(params = "userId")
@ApiOperation(value = "根据用户id获取拥有的角色")
@PreAuthorize("hasAnyAuthority('sys:user:query','sys:role:query')")
public List<Role> roles(Long userId) {
return roleDao.listByUserId(userId);
}
@LogAnnotation
@DeleteMapping("/{id}")
@ApiOperation(value = "删除角色")
@PreAuthorize("hasAuthority('sys:role:del')")
public void delete(@PathVariable Long id) {
roleService.deleteRole(id);
}
}
package com.boot.security.server.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.dao.SysLogsDao;
import com.boot.security.server.model.SysLogs;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@Api(tags = "日志")
@RestController
@RequestMapping("/logs")
public class SysLogsController {
@Autowired
private SysLogsDao sysLogsDao;
@GetMapping
@PreAuthorize("hasAuthority('sys:log:query')")
@ApiOperation(value = "日志列表")
public PageTableResponse list(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return sysLogsDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<SysLogs> list(PageTableRequest request) {
return sysLogsDao.list(request.getParams(), request.getOffset(), request.getLimit());
}
}).handle(request);
}
}
package com.boot.security.server.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.security.server.annotation.LogAnnotation;
import com.boot.security.server.dao.UserDao;
import com.boot.security.server.dto.UserDto;
import com.boot.security.server.model.SysUser;
import com.boot.security.server.page.table.PageTableHandler;
import com.boot.security.server.page.table.PageTableHandler.CountHandler;
import com.boot.security.server.page.table.PageTableHandler.ListHandler;
import com.boot.security.server.page.table.PageTableRequest;
import com.boot.security.server.page.table.PageTableResponse;
import com.boot.security.server.service.UserService;
import com.boot.security.server.utils.UserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* 用户相关接口
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
@Api(tags = "用户")
@RestController
@RequestMapping("/users")
public class UserController {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@Autowired
private UserService userService;
@Autowired
private UserDao userDao;
@LogAnnotation
@PostMapping
@ApiOperation(value = "保存用户")
@PreAuthorize("hasAuthority('sys:user:add')")
public SysUser saveUser(@RequestBody UserDto userDto) {
SysUser u = userService.getUser(userDto.getUsername());
if (u != null) {
throw new IllegalArgumentException(userDto.getUsername() + "已存在");
}
return userService.saveUser(userDto);
}
@LogAnnotation
@PutMapping
@ApiOperation(value = "修改用户")
@PreAuthorize("hasAuthority('sys:user:add')")
public SysUser updateUser(@RequestBody UserDto userDto) {
return userService.updateUser(userDto);
}
@LogAnnotation
@PutMapping(params = "headImgUrl")
@ApiOperation(value = "修改头像")
public void updateHeadImgUrl(String headImgUrl) {
SysUser user = UserUtil.getLoginUser();
UserDto userDto = new UserDto();
BeanUtils.copyProperties(user, userDto);
userDto.setHeadImgUrl(headImgUrl);
userService.updateUser(userDto);
log.debug("{}修改了头像", user.getUsername());
}
@LogAnnotation
@PutMapping("/{username}")
@ApiOperation(value = "修改密码")
@PreAuthorize("hasAuthority('sys:user:password')")
public void changePassword(@PathVariable String username, String oldPassword, String newPassword) {
userService.changePassword(username, oldPassword, newPassword);
}
@GetMapping
@ApiOperation(value = "用户列表")
@PreAuthorize("hasAuthority('sys:user:query')")
public PageTableResponse listUsers(PageTableRequest request) {
return new PageTableHandler(new CountHandler() {
@Override
public int count(PageTableRequest request) {
return userDao.count(request.getParams());
}
}, new ListHandler() {
@Override
public List<SysUser> list(PageTableRequest request) {
List<SysUser> list = userDao.list(request.getParams(), request.getOffset(), request.getLimit());
return list;
}
}).handle(request);
}
@ApiOperation(value = "当前登录用户")
@GetMapping("/current")
public SysUser currentUser() {
return UserUtil.getLoginUser();
}
@ApiOperation(value = "根据用户id获取用户")
@GetMapping("/{id}")
@PreAuthorize("hasAuthority('sys:user:query')")
public SysUser user(@PathVariable Long id) {
return userDao.getById(id);
}
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.boot.security.server.model.Dict;
@Mapper
public interface DictDao {
@Select("select * from t_dict t where t.id = #{id}")
Dict getById(Long id);
@Delete("delete from t_dict where id = #{id}")
int delete(Long id);
int update(Dict dict);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into t_dict(type, k, val, createTime, updateTime) values(#{type}, #{k}, #{val}, now(), now())")
int save(Dict dict);
int count(@Param("params") Map<String, Object> params);
List<Dict> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
@Select("select * from t_dict t where t.type = #{type} and k = #{k}")
Dict getByTypeAndK(@Param("type") String type, @Param("k") String k);
@Select("select * from t_dict t where t.type = #{type}")
List<Dict> listByType(String type);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.boot.security.server.model.FileInfo;
@Mapper
public interface FileInfoDao {
@Select("select * from file_info t where t.id = #{id}")
FileInfo getById(String id);
@Insert("insert into file_info(id, contentType, size, path, url, type, createTime, updateTime) values(#{id}, #{contentType}, #{size}, #{path}, #{url}, #{type}, now(), now())")
int save(FileInfo fileInfo);
@Update("update file_info t set t.updateTime = now() where t.id = #{id}")
int update(FileInfo fileInfo);
@Delete("delete from file_info where id = #{id}")
int delete(String id);
int count(@Param("params") Map<String, Object> params);
List<FileInfo> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.boot.security.server.model.JobModel;
@Mapper
public interface JobDao {
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into t_job(jobName, description, cron, springBeanName, methodName, isSysJob, status, createTime, updateTime) values(#{jobName}, #{description}, #{cron}, #{springBeanName}, #{methodName}, #{isSysJob}, 1, now(), now())")
int save(JobModel jobModel);
@Select("select * from t_job t where t.id = #{id}")
JobModel getById(Long id);
@Select("select * from t_job t where t.jobName = #{jobName}")
JobModel getByName(String jobName);
int update(JobModel jobModel);
int count(@Param("params") Map<String, Object> params);
List<JobModel> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.boot.security.server.model.Mail;
import com.boot.security.server.model.MailTo;
@Mapper
public interface MailDao {
@Select("select * from t_mail t where t.id = #{id}")
Mail getById(Long id);
// @Delete("delete from t_mail where id = #{id}")
// int delete(Long id);
// @Update("update t_mail t set subject = #{subject}, content = #{content}, updateTime = now() where t.id = #{id}")
// int update(Mail mail);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into t_mail(userId, subject, content, createTime, updateTime) values(#{userId}, #{subject}, #{content}, now(), now())")
int save(Mail mail);
@Insert("insert into t_mail_to(mailId, toUser, status) values(#{mailId}, #{toUser}, #{status})")
int saveToUser(@Param("mailId") Long mailId, @Param("toUser") String toUser, @Param("status") int status);
@Select("select t.* from t_mail_to t where t.mailId = #{mailId}")
List<MailTo> getToUsers(Long mailId);
int count(@Param("params") Map<String, Object> params);
List<Mail> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.boot.security.server.dto.NoticeReadVO;
import com.boot.security.server.model.Notice;
import com.boot.security.server.model.SysUser;
@Mapper
public interface NoticeDao {
@Select("select * from t_notice t where t.id = #{id}")
Notice getById(Long id);
@Delete("delete from t_notice where id = #{id}")
int delete(Long id);
@Update("update t_notice t set title = #{title}, content = #{content}, status = #{status}, updateTime = #{updateTime} where t.id = #{id}")
int update(Notice notice);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into t_notice(title, content, status, createTime, updateTime) values(#{title}, #{content}, #{status}, #{createTime}, #{updateTime})")
int save(Notice notice);
int count(@Param("params") Map<String, Object> params);
List<Notice> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
@Insert("insert ignore into t_notice_read(noticeId, userId, createTime) values(#{noticeId}, #{userId}, now())")
int saveReadRecord(@Param("noticeId") Long noticeId, @Param("userId") Long userId);
List<SysUser> listReadUsers(Long noticeId);
@Select("select count(1) from t_notice t left join t_notice_read r on r.noticeId = t.id and r.userId = #{userId} where t.status = 1 and r.userId is null")
int countUnread(Long userId);
int countNotice(@Param("params") Map<String, Object> params);
List<NoticeReadVO> listNotice(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Set;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.boot.security.server.model.Permission;
@Mapper
public interface PermissionDao {
@Select("select * from sys_permission t order by t.sort")
List<Permission> listAll();
@Select("select * from sys_permission t where t.type = 1 order by t.sort")
List<Permission> listParents();
@Select("select distinct p.* from sys_permission p inner join sys_role_permission rp on p.id = rp.permissionId inner join sys_role_user ru on ru.roleId = rp.roleId where ru.userId = #{userId} order by p.sort")
List<Permission> listByUserId(Long userId);
@Select("select p.* from sys_permission p inner join sys_role_permission rp on p.id = rp.permissionId where rp.roleId = #{roleId} order by p.sort")
List<Permission> listByRoleId(Long roleId);
@Select("select * from sys_permission t where t.id = #{id}")
Permission getById(Long id);
@Insert("insert into sys_permission(parentId, name, css, href, type, permission, sort) values(#{parentId}, #{name}, #{css}, #{href}, #{type}, #{permission}, #{sort})")
int save(Permission permission);
@Update("update sys_permission t set parentId = #{parentId}, name = #{name}, css = #{css}, href = #{href}, type = #{type}, permission = #{permission}, sort = #{sort} where t.id = #{id}")
int update(Permission permission);
@Delete("delete from sys_permission where id = #{id}")
int delete(Long id);
@Delete("delete from sys_permission where parentId = #{id}")
int deleteByParentId(Long id);
@Delete("delete from sys_role_permission where permissionId = #{permissionId}")
int deleteRolePermission(Long permissionId);
@Select("select ru.userId from sys_role_permission rp inner join sys_role_user ru on ru.roleId = rp.roleId where rp.permissionId = #{permissionId}")
Set<Long> listUserIds(Long permissionId);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.boot.security.server.model.Role;
@Mapper
public interface RoleDao {
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into sys_role(name, description, createTime, updateTime) values(#{name}, #{description}, now(),now())")
int save(Role role);
int count(@Param("params") Map<String, Object> params);
List<Role> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
@Select("select * from sys_role t where t.id = #{id}")
Role getById(Long id);
@Select("select * from sys_role t where t.name = #{name}")
Role getRole(String name);
@Update("update sys_role t set t.name = #{name}, t.description = #{description}, updateTime = now() where t.id = #{id}")
int update(Role role);
@Select("select * from sys_role r inner join sys_role_user ru on r.id = ru.roleId where ru.userId = #{userId}")
List<Role> listByUserId(Long userId);
@Delete("delete from sys_role_permission where roleId = #{roleId}")
int deleteRolePermission(Long roleId);
int saveRolePermission(@Param("roleId") Long roleId, @Param("permissionIds") List<Long> permissionIds);
@Delete("delete from sys_role where id = #{id}")
int delete(Long id);
@Delete("delete from sys_role_user where roleId = #{roleId}")
int deleteRoleUser(Long roleId);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.boot.security.server.model.SysLogs;
@Mapper
public interface SysLogsDao {
@Insert("insert into sys_logs(userId, module, flag, remark, createTime) values(#{user.id}, #{module}, #{flag}, #{remark}, now())")
int save(SysLogs sysLogs);
int count(@Param("params") Map<String, Object> params);
List<SysLogs> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
@Delete("delete from sys_logs where createTime <= #{time}")
int deleteLogs(String time);
}
package com.boot.security.server.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.boot.security.server.model.TokenModel;
@Mapper
public interface TokenDao {
@Insert("insert into t_token(id, val, expireTime, createTime, updateTime) values (#{id}, #{val}, #{expireTime}, #{createTime}, #{updateTime})")
int save(TokenModel model);
@Select("select * from t_token t where t.id = #{id}")
TokenModel getById(String id);
@Update("update t_token t set t.val = #{val}, t.expireTime = #{expireTime}, t.updateTime = #{updateTime} where t.id = #{id}")
int update(TokenModel model);
@Delete("delete from t_token where id = #{id}")
int delete(String id);
}
package com.boot.security.server.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.boot.security.server.model.SysUser;
@Mapper
public interface UserDao {
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into sys_user(username, password, nickname, headImgUrl, phone, telephone, email, birthday, sex, status, createTime, updateTime) values(#{username}, #{password}, #{nickname}, #{headImgUrl}, #{phone}, #{telephone}, #{email}, #{birthday}, #{sex}, #{status}, now(), now())")
int save(SysUser user);
@Select("select * from sys_user t where t.id = #{id}")
SysUser getById(Long id);
@Select("select * from sys_user t where t.username = #{username}")
SysUser getUser(String username);
@Update("update sys_user t set t.password = #{password} where t.id = #{id}")
int changePassword(@Param("id") Long id, @Param("password") String password);
Integer count(@Param("params") Map<String, Object> params);
List<SysUser> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset,
@Param("limit") Integer limit);
@Delete("delete from sys_role_user where userId = #{userId}")
int deleteUserRole(Long userId);
int saveUserRoles(@Param("userId") Long userId, @Param("roleIds") List<Long> roleIds);
int update(SysUser user);
}
package com.boot.security.server.dto;
import java.io.Serializable;
public class BeanField implements Serializable {
private static final long serialVersionUID = 4279960350136806659L;
private String columnName;
private String columnType;
private String columnComment;
private String columnDefault;
private String name;
private String type;
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getColumnType() {
return columnType;
}
public void setColumnType(String columnType) {
this.columnType = columnType;
}
public String getColumnComment() {
return columnComment;
}
public void setColumnComment(String columnComment) {
this.columnComment = columnComment;
}
public String getColumnDefault() {
return columnDefault;
}
public void setColumnDefault(String columnDefault) {
this.columnDefault = columnDefault;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
package com.boot.security.server.dto;
import java.io.Serializable;
import java.util.List;
public class GenerateDetail implements Serializable {
private static final long serialVersionUID = -164567294469931676L;
private String beanName;
private List<BeanField> fields;
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public List<BeanField> getFields() {
return fields;
}
public void setFields(List<BeanField> fields) {
this.fields = fields;
}
}
package com.boot.security.server.dto;
import java.io.Serializable;
import java.util.List;
public class GenerateInput implements Serializable {
private static final long serialVersionUID = -2870071259702969061L;
/**
* 保存路径
*/
private String path;
private String tableName;
/**
* bean包名
*/
private String beanPackageName;
/**
* java类名
*/
private String beanName;
/**
* dao包名
*/
private String daoPackageName;
/**
* dao类名
*/
private String daoName;
/**
* controller包名
*/
private String controllerPkgName;
/**
* controller类名
*/
private String controllerName;
/**
* 字段名
*/
private List<String> columnNames;
/**
* 属性名
*/
private List<String> beanFieldName;
/**
* 成员变量类型
*/
private List<String> beanFieldType;
/**
* 默认值
*/
private List<String> beanFieldValue;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getBeanPackageName() {
return beanPackageName;
}
public void setBeanPackageName(String beanPackageName) {
this.beanPackageName = beanPackageName;
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public String getDaoPackageName() {
return daoPackageName;
}
public void setDaoPackageName(String daoPackageName) {
this.daoPackageName = daoPackageName;
}
public String getDaoName() {
return daoName;
}
public void setDaoName(String daoName) {
this.daoName = daoName;
}
public String getControllerPkgName() {
return controllerPkgName;
}
public void setControllerPkgName(String controllerPkgName) {
this.controllerPkgName = controllerPkgName;
}
public String getControllerName() {
return controllerName;
}
public void setControllerName(String controllerName) {
this.controllerName = controllerName;
}
public List<String> getColumnNames() {
return columnNames;
}
public void setColumnNames(List<String> columnNames) {
this.columnNames = columnNames;
}
public List<String> getBeanFieldName() {
return beanFieldName;
}
public void setBeanFieldName(List<String> beanFieldName) {
this.beanFieldName = beanFieldName;
}
public List<String> getBeanFieldType() {
return beanFieldType;
}
public void setBeanFieldType(List<String> beanFieldType) {
this.beanFieldType = beanFieldType;
}
public List<String> getBeanFieldValue() {
return beanFieldValue;
}
public void setBeanFieldValue(List<String> beanFieldValue) {
this.beanFieldValue = beanFieldValue;
}
}
package com.boot.security.server.dto;
import java.io.Serializable;
public class LayuiFile implements Serializable {
private static final long serialVersionUID = 35435494737590569L;
private Integer code;
private String msg;
private LayuiFileData data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public LayuiFileData getData() {
return data;
}
public void setData(LayuiFileData data) {
this.data = data;
}
public static class LayuiFileData implements Serializable {
private static final long serialVersionUID = 7907356434695924597L;
private String src;
private String title;
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
}
package com.boot.security.server.dto;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.util.StringUtils;
import com.boot.security.server.model.Permission;
import com.boot.security.server.model.SysUser;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class LoginUser extends SysUser implements UserDetails {
private static final long serialVersionUID = -1379274258881257107L;
private List<Permission> permissions;
private String token;
/** 登陆时间戳(毫秒) */
private Long loginTime;
/** 过期时间戳 */
private Long expireTime;
public List<Permission> getPermissions() {
return permissions;
}
public void setPermissions(List<Permission> permissions) {
this.permissions = permissions;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
@Override
@JsonIgnore
public Collection<? extends GrantedAuthority> getAuthorities() {
return permissions.parallelStream().filter(p -> !StringUtils.isEmpty(p.getPermission()))
.map(p -> new SimpleGrantedAuthority(p.getPermission())).collect(Collectors.toSet());
}
public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
// do nothing
}
// 账户是否未过期
@JsonIgnore
@Override
public boolean isAccountNonExpired() {
return true;
}
// 账户是否未锁定
@JsonIgnore
@Override
public boolean isAccountNonLocked() {
return getStatus() != Status.LOCKED;
}
// 密码是否未过期
@JsonIgnore
@Override
public boolean isCredentialsNonExpired() {
return true;
}
// 账户是否激活
@JsonIgnore
@Override
public boolean isEnabled() {
return true;
}
public Long getLoginTime() {
return loginTime;
}
public void setLoginTime(Long loginTime) {
this.loginTime = loginTime;
}
public Long getExpireTime() {
return expireTime;
}
public void setExpireTime(Long expireTime) {
this.expireTime = expireTime;
}
}
package com.boot.security.server.dto;
import java.util.Date;
import com.boot.security.server.model.Notice;
public class NoticeReadVO extends Notice {
private static final long serialVersionUID = -3842182350180882396L;
private Long userId;
private Date readTime;
private Boolean isRead;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Date getReadTime() {
return readTime;
}
public void setReadTime(Date readTime) {
this.readTime = readTime;
}
public Boolean getIsRead() {
return isRead;
}
public void setIsRead(Boolean isRead) {
this.isRead = isRead;
}
}
package com.boot.security.server.dto;
import java.io.Serializable;
import java.util.List;
import com.boot.security.server.model.Notice;
import com.boot.security.server.model.SysUser;
public class NoticeVO implements Serializable {
private static final long serialVersionUID = 7363353918096951799L;
private Notice notice;
private List<SysUser> users;
public Notice getNotice() {
return notice;
}
public void setNotice(Notice notice) {
this.notice = notice;
}
public List<SysUser> getUsers() {
return users;
}
public void setUsers(List<SysUser> users) {
this.users = users;
}
}
package com.boot.security.server.dto;
import java.io.Serializable;
public class ResponseInfo implements Serializable {
private static final long serialVersionUID = -4417715614021482064L;
private String code;
private String message;
public ResponseInfo(String code, String message) {
super();
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package com.boot.security.server.dto;
import java.util.List;
import com.boot.security.server.model.Role;
public class RoleDto extends Role {
private static final long serialVersionUID = 4218495592167610193L;
private List<Long> permissionIds;
public List<Long> getPermissionIds() {
return permissionIds;
}
public void setPermissionIds(List<Long> permissionIds) {
this.permissionIds = permissionIds;
}
}
package com.boot.security.server.dto;
import java.io.Serializable;
/**
* Restful方式登陆token
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年8月4日
*/
public class Token implements Serializable {
private static final long serialVersionUID = 6314027741784310221L;
private String token;
/** 登陆时间戳(毫秒) */
private Long loginTime;
public Token(String token, Long loginTime) {
super();
this.token = token;
this.loginTime = loginTime;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Long getLoginTime() {
return loginTime;
}
public void setLoginTime(Long loginTime) {
this.loginTime = loginTime;
}
}
package com.boot.security.server.dto;
import java.util.List;
import com.boot.security.server.model.SysUser;
public class UserDto extends SysUser {
private static final long serialVersionUID = -184009306207076712L;
private List<Long> roleIds;
public List<Long> getRoleIds() {
return roleIds;
}
public void setRoleIds(List<Long> roleIds) {
this.roleIds = roleIds;
}
}
package com.boot.security.server.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import com.boot.security.server.dto.LoginUser;
import com.boot.security.server.service.TokenService;
/**
* Token过滤器
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年10月14日
*/
@Component
public class TokenFilter extends OncePerRequestFilter {
public static final String TOKEN_KEY = "token";
@Autowired
private TokenService tokenService;
@Autowired
private UserDetailsService userDetailsService;
private static final Long MINUTES_10 = 10 * 60 * 1000L;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String token = getToken(request);
if (StringUtils.isNotBlank(token)) {
LoginUser loginUser = tokenService.getLoginUser(token);
if (loginUser != null) {
loginUser = checkLoginTime(loginUser);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(loginUser,
null, loginUser.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
filterChain.doFilter(request, response);
}
/**
* 校验时间<br>
* 过期时间与当前时间对比,临近过期10分钟内的话,自动刷新缓存
*
* @param loginUser
* @return
*/
private LoginUser checkLoginTime(LoginUser loginUser) {
long expireTime = loginUser.getExpireTime();
long currentTime = System.currentTimeMillis();
if (expireTime - currentTime <= MINUTES_10) {
String token = loginUser.getToken();
loginUser = (LoginUser) userDetailsService.loadUserByUsername(loginUser.getUsername());
loginUser.setToken(token);
tokenService.refresh(loginUser);
}
return loginUser;
}
/**
* 根据参数或者header获取token
*
* @param request
* @return
*/
public static String getToken(HttpServletRequest request) {
String token = request.getParameter(TOKEN_KEY);
if (StringUtils.isBlank(token)) {
token = request.getHeader(TOKEN_KEY);
}
return token;
}
}
package com.boot.security.server.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.boot.security.server.config.JobConfig;
import com.boot.security.server.service.JobService;
public class SpringBeanJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
try {
ApplicationContext applicationContext = (ApplicationContext) context.getScheduler().getContext()
.get(JobConfig.KEY);
JobService jobService = applicationContext.getBean(JobService.class);
jobService.doJob(context.getJobDetail().getJobDataMap());
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
package com.boot.security.server.model;
import java.io.Serializable;
import java.util.Date;
public abstract class BaseEntity<ID extends Serializable> implements Serializable {
private static final long serialVersionUID = 2054813493011812469L;
private ID id;
private Date createTime = new Date();
private Date updateTime = new Date();
public ID getId() {
return id;
}
public void setId(ID id) {
this.id = id;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
package com.boot.security.server.model;
public class Dict extends BaseEntity<Long> {
private static final long serialVersionUID = -2431140186410912787L;
private String type;
private String k;
private String val;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getK() {
return k;
}
public void setK(String k) {
this.k = k;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
}
package com.boot.security.server.model;
public class FileInfo extends BaseEntity<String> {
private static final long serialVersionUID = -5761547882766615438L;
private String contentType;
private long size;
private String path;
private String url;
private Integer type;
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
}
package com.boot.security.server.model;
public class JobModel extends BaseEntity<Long> {
private static final long serialVersionUID = -2458935535811207209L;
private String jobName;
private String description;
private String cron;
private String springBeanName;
private String methodName;
private Boolean isSysJob;
private int status;
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
public String getSpringBeanName() {
return springBeanName;
}
public void setSpringBeanName(String springBeanName) {
this.springBeanName = springBeanName;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Boolean getIsSysJob() {
return isSysJob;
}
public void setIsSysJob(Boolean isSysJob) {
this.isSysJob = isSysJob;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
package com.boot.security.server.model;
public class Mail extends BaseEntity<Long> {
private static final long serialVersionUID = 5613231124043303948L;
private Long userId;
private String toUsers;
private String subject;
private String content;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getToUsers() {
return toUsers;
}
public void setToUsers(String toUsers) {
this.toUsers = toUsers;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.boot.security.server.model;
public class MailTo extends BaseEntity<Long> {
private static final long serialVersionUID = -8238779033956731073L;
private Long mailId;
private String toUser;
private Boolean status;
public Long getMailId() {
return mailId;
}
public void setMailId(Long mailId) {
this.mailId = mailId;
}
public String getToUser() {
return toUser;
}
public void setToUser(String toUser) {
this.toUser = toUser;
}
public Boolean getStatus() {
return status;
}
public void setStatus(Boolean status) {
this.status = status;
}
}
package com.boot.security.server.model;
public class Notice extends BaseEntity<Long> {
private static final long serialVersionUID = -4401913568806243090L;
private String title;
private String content;
private Integer status;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public interface Status {
int DRAFT = 0;
int PUBLISH = 1;
}
}
package com.boot.security.server.model;
import java.util.List;
public class Permission extends BaseEntity<Long> {
private static final long serialVersionUID = 6180869216498363919L;
private Long parentId;
private String name;
private String css;
private String href;
private Integer type;
private String permission;
private Integer sort;
private List<Permission> child;
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCss() {
return css;
}
public void setCss(String css) {
this.css = css;
}
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public List<Permission> getChild() {
return child;
}
public void setChild(List<Permission> child) {
this.child = child;
}
}
package com.boot.security.server.model;
public class Role extends BaseEntity<Long> {
private static final long serialVersionUID = -3802292814767103648L;
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
package com.boot.security.server.model;
public class SysLogs extends BaseEntity<Long> {
private static final long serialVersionUID = -7809315432127036583L;
private SysUser user;
private String module;
private Boolean flag;
private String remark;
public SysUser getUser() {
return user;
}
public void setUser(SysUser user) {
this.user = user;
}
public String getModule() {
return module;
}
public void setModule(String module) {
this.module = module;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
package com.boot.security.server.model;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
public class SysUser extends BaseEntity<Long> {
private static final long serialVersionUID = -6525908145032868837L;
private String username;
private String password;
private String nickname;
private String headImgUrl;
private String phone;
private String telephone;
private String email;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private Integer sex;
private Integer status;
private String intro;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getHeadImgUrl() {
return headImgUrl;
}
public void setHeadImgUrl(String headImgUrl) {
this.headImgUrl = headImgUrl;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public interface Status {
int DISABLED = 0;
int VALID = 1;
int LOCKED = 2;
}
}
package com.boot.security.server.model;
import java.util.Date;
public class TokenModel extends BaseEntity<String> {
private static final long serialVersionUID = 4566334160572911795L;
/**
* 过期时间
*/
private Date expireTime;
/**
* LoginUser的json串
*/
private String val;
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
}
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 奇趣源码商城 www.qiqucode.com
*
*/
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<String, String[]> 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<String, Object> 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<String, Object> map = tableRequest.getParams();
if (!CollectionUtils.isEmpty(map)) {
Map<String, Object> 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<String, Object> 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(), ","));
}
}
}
package com.boot.security.server.page.table;
import java.util.ArrayList;
import java.util.List;
/**
* 分页查询处理器
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
public class PageTableHandler {
private CountHandler countHandler;
private ListHandler listHandler;
private OrderHandler orderHandler;
public PageTableHandler(CountHandler countHandler, ListHandler listHandler) {
super();
this.countHandler = countHandler;
this.listHandler = listHandler;
}
public PageTableHandler(CountHandler countHandler, ListHandler listHandler, OrderHandler orderHandler) {
this(countHandler, listHandler);
this.orderHandler = orderHandler;
}
public PageTableResponse handle(PageTableRequest dtRequest) {
int count = 0;
List<?> list = null;
count = this.countHandler.count(dtRequest);
if (count > 0) {
if (orderHandler != null) {
dtRequest = orderHandler.order(dtRequest);
}
list = this.listHandler.list(dtRequest);
}
if (list == null) {
list = new ArrayList<>();
}
return new PageTableResponse(count, count, list);
}
public interface ListHandler {
List<?> list(PageTableRequest request);
}
public interface CountHandler {
int count(PageTableRequest request);
}
public interface OrderHandler {
PageTableRequest order(PageTableRequest request);
}
}
\ No newline at end of file
package com.boot.security.server.page.table;
import java.io.Serializable;
import java.util.Map;
/**
* 分页查询参数
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
public class PageTableRequest implements Serializable {
private static final long serialVersionUID = 7328071045193618467L;
private Integer offset;
private Integer limit;
private Map<String, Object> params;
public Integer getOffset() {
return offset;
}
public void setOffset(Integer offset) {
this.offset = offset;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public Map<String, Object> getParams() {
return params;
}
public void setParams(Map<String, Object> params) {
this.params = params;
}
}
package com.boot.security.server.page.table;
import java.io.Serializable;
import java.util.List;
/**
* 分页查询返回
*
* @author 奇趣源码商城 www.qiqucode.com
*
*/
public class PageTableResponse implements Serializable {
private static final long serialVersionUID = 620421858510718076L;
private Integer recordsTotal;
private Integer recordsFiltered;
private List<?> data;
public PageTableResponse(Integer recordsTotal, Integer recordsFiltered, List<?> data) {
super();
this.recordsTotal = recordsTotal;
this.recordsFiltered = recordsFiltered;
this.data = data;
}
public Integer getRecordsTotal() {
return recordsTotal;
}
public void setRecordsTotal(Integer recordsTotal) {
this.recordsTotal = recordsTotal;
}
public Integer getRecordsFiltered() {
return recordsFiltered;
}
public void setRecordsFiltered(Integer recordsFiltered) {
this.recordsFiltered = recordsFiltered;
}
public List<?> getData() {
return data;
}
public void setData(List<?> data) {
this.data = data;
}
}
\ No newline at end of file
package com.boot.security.server.service;
import java.io.IOException;
import org.springframework.web.multipart.MultipartFile;
import com.boot.security.server.model.FileInfo;
public interface FileService {
FileInfo save(MultipartFile file) throws IOException;
void delete(String id);
}
package com.boot.security.server.service;
import java.util.List;
import com.boot.security.server.dto.BeanField;
import com.boot.security.server.dto.GenerateInput;
public interface GenerateService {
/**
* 获取数据库表信息
*
* @param tableName
* @return
*/
List<BeanField> listBeanField(String tableName);
/**
* 转成驼峰并大写第一个字母
*
* @param string
* @return
*/
String upperFirstChar(String string);
/**
* 生成代码
*
* @param input
*/
void saveCode(GenerateInput input);
}
package com.boot.security.server.service;
import org.quartz.JobDataMap;
import org.quartz.SchedulerException;
import com.boot.security.server.model.JobModel;
public interface JobService {
void saveJob(JobModel jobModel);
void doJob(JobDataMap jobDataMap);
void deleteJob(Long id) throws SchedulerException;
}
package com.boot.security.server.service;
import java.util.List;
import com.boot.security.server.model.Mail;
public interface MailService {
void save(Mail mail, List<String> toUser);
}
package com.boot.security.server.service;
import com.boot.security.server.model.Permission;
public interface PermissionService {
void save(Permission permission);
void update(Permission permission);
void delete(Long id);
}
package com.boot.security.server.service;
import com.boot.security.server.dto.RoleDto;
public interface RoleService {
void saveRole(RoleDto roleDto);
void deleteRole(Long id);
}
package com.boot.security.server.service;
import java.util.List;
import javax.mail.MessagingException;
public interface SendMailSevice {
/**
*
* @param toUser
* @param subject
* 标题
* @param text
* 内容(支持html格式)
*/
void sendMail(List<String> toUser, String subject, String text);
void sendMail(String toUser, String subject, String text) throws MessagingException;
}
package com.boot.security.server.service;
import com.boot.security.server.model.SysLogs;
/**
* 日志service
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年8月19日
*/
public interface SysLogService {
void save(SysLogs sysLogs);
void save(Long userId, String module, Boolean flag, String remark);
void deleteLogs();
}
package com.boot.security.server.service;
import com.boot.security.server.dto.LoginUser;
import com.boot.security.server.dto.Token;
/**
* Token管理器<br>
* 可存储到redis或者数据库<br>
* 具体可看实现类<br>
* 默认基于redis,实现类为 com.boot.security.server.service.impl.TokenServiceJWTImpl<br>
* 如要换成数据库存储,将TokenServiceImpl类上的注解@Primary挪到com.boot.security.server.service.impl.TokenServiceDbImpl
*
*
* @author 奇趣源码商城 www.qiqucode.com
*
* 2017年10月14日
*/
public interface TokenService {
Token saveToken(LoginUser loginUser);
void refresh(LoginUser loginUser);
LoginUser getLoginUser(String token);
boolean deleteToken(String token);
}
package com.boot.security.server.service;
import com.boot.security.server.dto.UserDto;
import com.boot.security.server.model.SysUser;
public interface UserService {
SysUser saveUser(UserDto userDto);
SysUser updateUser(UserDto userDto);
SysUser getUser(String username);
void changePassword(String username, String oldPassword, String newPassword);
}
package com.boot.security.server.service.impl;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.boot.security.server.dao.FileInfoDao;
import com.boot.security.server.model.FileInfo;
import com.boot.security.server.service.FileService;
import com.boot.security.server.utils.FileUtil;
@Service
public class FileServiceImpl implements FileService {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@Value("${files.path}")
private String filesPath;
@Autowired
private FileInfoDao fileInfoDao;
@Override
public FileInfo save(MultipartFile file) throws IOException {
String fileOrigName = file.getOriginalFilename();
if (!fileOrigName.contains(".")) {
throw new IllegalArgumentException("缺少后缀名");
}
String md5 = FileUtil.fileMd5(file.getInputStream());
FileInfo fileInfo = fileInfoDao.getById(md5);
if (fileInfo != null) {
fileInfoDao.update(fileInfo);
return fileInfo;
}
fileOrigName = fileOrigName.substring(fileOrigName.lastIndexOf("."));
String pathname = FileUtil.getPath() + md5 + fileOrigName;
String fullPath = filesPath + pathname;
FileUtil.saveFile(file, fullPath);
long size = file.getSize();
String contentType = file.getContentType();
fileInfo = new FileInfo();
fileInfo.setId(md5);
fileInfo.setContentType(contentType);
fileInfo.setSize(size);
fileInfo.setPath(fullPath);
fileInfo.setUrl(pathname);
fileInfo.setType(contentType.startsWith("image/") ? 1 : 0);
fileInfoDao.save(fileInfo);
log.debug("上传文件{}", fullPath);
return fileInfo;
}
@Override
public void delete(String id) {
FileInfo fileInfo = fileInfoDao.getById(id);
if (fileInfo != null) {
String fullPath = fileInfo.getPath();
FileUtil.deleteFile(fullPath);
fileInfoDao.delete(id);
log.debug("删除文件:{}", fileInfo.getPath());
}
}
}
package com.boot.security.server.service.impl;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.boot.security.server.dto.BeanField;
import com.boot.security.server.dto.GenerateInput;
import com.boot.security.server.service.GenerateService;
import com.boot.security.server.utils.StrUtil;
import com.boot.security.server.utils.TemplateUtil;
import com.google.common.collect.Maps;
@Service
public class GenerateServiceImpl implements GenerateService {
@Autowired
private JdbcTemplate jdbcTemplate;
private RowMapper<BeanField> beanFieldMapper = new RowMapper<BeanField>() {
@Override
public BeanField mapRow(ResultSet rs, int paramInt) throws SQLException {
BeanField beanField = new BeanField();
beanField.setColumnName(rs.getString("column_name"));
beanField.setColumnType(rs.getString("data_type"));
beanField.setColumnComment(rs.getString("column_comment"));
beanField.setColumnDefault(rs.getString("column_default"));
return beanField;
}
};
@Override
public List<BeanField> listBeanField(String tableName) {
List<BeanField> beanFields = jdbcTemplate.query(
"select column_name, data_type, column_comment, column_default FROM information_schema.columns WHERE table_name= ? and table_schema = (select database())",
new String[] { tableName }, beanFieldMapper);
if (CollectionUtils.isEmpty(beanFields)) {
throw new IllegalArgumentException("表" + tableName + "不存在");
}
beanFields.parallelStream().forEach(b -> {
b.setName(StrUtil.str2hump(b.getColumnName()));
String type = map.get(b.getColumnType());
if (type == null) {
type = String.class.getSimpleName();
}
b.setType(type);
if ("id".equals(b.getName())) {
b.setType(Long.class.getSimpleName());
}
b.setColumnDefault(b.getColumnDefault() == null ? "" : b.getColumnDefault());
});
return beanFields;
}
/**
* mysql类型与java类型部分对应关系
*/
private static Map<String, String> map = Maps.newHashMap();
static {
map.put("int", Integer.class.getSimpleName());
map.put("tinyint", Integer.class.getSimpleName());
map.put("double", Double.class.getSimpleName());
map.put("float", Float.class.getSimpleName());
map.put("decimal", BigDecimal.class.getSimpleName());
map.put("date", Date.class.getSimpleName());
map.put("timestamp", Date.class.getSimpleName());
map.put("datetime", Date.class.getSimpleName());
map.put("varchar", String.class.getSimpleName());
map.put("text", String.class.getSimpleName());
map.put("longtext", String.class.getSimpleName());
}
@Override
public String upperFirstChar(String string) {
String name = StrUtil.str2hump(string);
String firstChar = name.substring(0, 1);
name = name.replaceFirst(firstChar, firstChar.toUpperCase());
return name;
}
@Override
public void saveCode(GenerateInput input) {
TemplateUtil.saveJava(input);
TemplateUtil.saveJavaDao(input);
TemplateUtil.saveController(input);
TemplateUtil.saveHtmlList(input);
}
}
package com.boot.security.server.service.impl;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import com.boot.security.server.dao.JobDao;
import com.boot.security.server.job.SpringBeanJob;
import com.boot.security.server.model.JobModel;
import com.boot.security.server.service.JobService;
@Service
public class JobServiceImpl implements JobService {
private static final Logger log = LoggerFactory.getLogger("adminLogger");
@Autowired
private Scheduler scheduler;
@Autowired
private ApplicationContext applicationContext;
private static final String JOB_DATA_KEY = "JOB_DATA_KEY";
@Autowired
private JobDao jobDao;
@Override
public void saveJob(JobModel jobModel) {
checkJobModel(jobModel);
String name = jobModel.getJobName();
JobKey jobKey = JobKey.jobKey(name);
JobDetail jobDetail = JobBuilder.newJob(SpringBeanJob.class).storeDurably()
.withDescription(jobModel.getDescription()).withIdentity(jobKey).build();
jobDetail.getJobDataMap().put(JOB_DATA_KEY, jobModel);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobModel.getCron());
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name).withSchedule(cronScheduleBuilder)
.forJob(jobKey).build();
try {
boolean exists = scheduler.checkExists(jobKey);
if (exists) {
scheduler.rescheduleJob(new TriggerKey(name), cronTrigger);
scheduler.addJob(jobDetail, true);
} else {
scheduler.scheduleJob(jobDetail, cronTrigger);
}
JobModel model = jobDao.getByName(name);
if (model == null) {
jobDao.save(jobModel);
} else {
jobDao.update(jobModel);
}
} catch (SchedulerException e) {
log.error("新增或修改job异常", e);
}
}
private void checkJobModel(JobModel jobModel) {
String springBeanName = jobModel.getSpringBeanName();
boolean flag = applicationContext.containsBean(springBeanName);
if (!flag) {
throw new IllegalArgumentException("bean:" + springBeanName + "不存在,bean名如userServiceImpl,首字母小写");
}
Object object = applicationContext.getBean(springBeanName);
Class<?> clazz = object.getClass();
if (AopUtils.isAopProxy(object)) {
clazz = clazz.getSuperclass();
}
String methodName = jobModel.getMethodName();
Method[] methods = clazz.getDeclaredMethods();
Set<String> names = new HashSet<>();
Arrays.asList(methods).forEach(m -> {
Class<?>[] classes = m.getParameterTypes();
if (classes.length == 0) {
names.add(m.getName());
}
});
if (names.size() == 0) {
throw new IllegalArgumentException("该bean没有无参方法");
}
if (!names.contains(methodName)) {
throw new IllegalArgumentException("未找到无参方法" + methodName + ",该bean所有方法名为:" + names);
}
}
@Override
public void doJob(JobDataMap jobDataMap) {
JobModel jobModel = (JobModel) jobDataMap.get(JOB_DATA_KEY);
String beanName = jobModel.getSpringBeanName();
String methodName = jobModel.getMethodName();
Object object = applicationContext.getBean(beanName);
try {
log.info("job:bean:{},方法名:{}", beanName, methodName);
Method method = object.getClass().getDeclaredMethod(methodName);
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除job
*
* @throws SchedulerException
*/
@Override
public void deleteJob(Long id) throws SchedulerException {
JobModel jobModel = jobDao.getById(id);
if (jobModel.getIsSysJob() != null && jobModel.getIsSysJob()) {
throw new IllegalArgumentException("该job是系统任务,不能删除,因为此job是在代码里初始化的,删除该类job请先确保相关代码已经去除");
}
String jobName = jobModel.getJobName();
JobKey jobKey = JobKey.jobKey(jobName);
scheduler.pauseJob(jobKey);
scheduler.unscheduleJob(new TriggerKey(jobName));
scheduler.deleteJob(jobKey);
jobModel.setStatus(0);
jobDao.update(jobModel);
}
}
This diff is collapsed.
This diff is collapsed.
package com.boot.security.server.utils;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
public class ResponseUtil {
public static void responseJson(HttpServletResponse response, int status, Object data) {
try {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setContentType("application/json;charset=UTF-8");
response.setStatus(status);
response.getWriter().write(JSONObject.toJSONString(data));
} catch (IOException e) {
e.printStackTrace();
}
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment