提交 6bb4117f authored 作者: zhoushaopan's avatar zhoushaopan

Initial commit

上级
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
差异被折叠。
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tykj</groupId>
<artifactId>zsp-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zsp-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<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-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.shiro</groupId>-->
<!-- <artifactId>shiro-spring-boot-starter</artifactId>-->
<!-- <version>1.8.0</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.tykj.zspdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ZspDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZspDemoApplication.class, args);
}
}
package com.tykj.zspdemo.aop;
/**
* @author: zsp
* @create: 2023 02-10 17:43
**/
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface CountAop {
// 接口描述信息
String desc() default "";
}
package com.tykj.zspdemo.aop;
/**
* @author: zsp
* @create: 2023 02-10 17:43
**/
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class CountAspect {
@Pointcut("@within(com.tykj.zspdemo.aop.CountAop)")
public void operateTimerPointCut() {
}
@Around("operateTimerPointCut()")
public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
String methodName = joinPoint.getSignature().getName();
System.out.println("Begin monitor method: " + methodName);
long startTime = System.nanoTime();
Object result = joinPoint.proceed();
long elapsedTime = System.nanoTime() - startTime;
System.out.println("End monitor method: " + methodName + ", elapsed time: " + elapsedTime + " ns");
return result;
}
}
package com.tykj.zspdemo.base;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* @author: zsp
* @create: 2023-08-30 14:00
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class BaseMpEntity {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@TableLogic
private Integer deleteTag = 0;
@Version
private Integer version = 1;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
package com.tykj.zspdemo.base;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author zhoushaopan
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomOrder {
/**
* 排序字段
*/
private String column;
/**
* 是否正序排列,默认 true
*/
private String direction;
}
package com.tykj.zspdemo.base;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhoushaopan
*/
@Data
public class CustomPage {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer currentPage = 0;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer pageSize = 15;
private List<CustomOrder> orders = new ArrayList<>();
@JsonIgnore
public <T> Page<T> getPageable() {
Page<T> objectPage = new Page<>();
if (orders.size() != 0) {
List<OrderItem> orders = new ArrayList<>();
this.orders.forEach(item -> {
OrderItem orderItem = new OrderItem();
orderItem.setColumn(item.getColumn());
if ("ASC".equals(item.getDirection())) {
orderItem.setAsc(true);
} else if ("DESC".equals(item.getDirection())) {
orderItem.setAsc(false);
}
orders.add(orderItem);
}
);
if (orders.size() > 0) {
objectPage.setCurrent(currentPage);
objectPage.setSize(pageSize);
objectPage.setOrders(orders);
return objectPage;
}
}
return objectPage;
}
}
package com.tykj.zspdemo.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @author: zsp
* @create: 2023-08-30 14:05
**/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
// 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
// 起始版本 3.3.0(推荐)
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
package com.tykj.zspdemo.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author syk
*/
@Configuration
@MapperScan("com.tykj.zspdemo.subject.mapper")
public class MybatisPlusConfig {
/**
* 分页查询插件
*
* @return 分页查询插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
\ No newline at end of file
package com.tykj.zspdemo.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 全局错误处理类,用于处理一些不容易定义的错误
*
* @author HuangXiahao
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApiException extends RuntimeException {
private String message;
}
package com.tykj.zspdemo.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author zhoushaopan
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
*用户名用户密码错误
*
* @param e 报错信息
*/
@ResponseBody
@ExceptionHandler(BadCredentialsException.class)
public String errorMessage(BadCredentialsException e) {
log.warn("[用户或者密码错误]");
return e.getMessage();
}
@ResponseBody
@ExceptionHandler(UsernameNotFoundException.class)
public String errorMessage(UsernameNotFoundException e) {
log.warn("[用户名不存在]");
return e.getMessage();
}
@ResponseBody
@ExceptionHandler(AccessDeniedException.class)
public String errorMessage(AccessDeniedException e) {
log.warn("[用户名不存在]");
return e.getMessage();
}
@ResponseBody
@ExceptionHandler(ApiException.class)
public String errorMessage(ApiException e) {
log.warn("[用户名不存在]");
return e.getMessage();
}
}
package com.tykj.zspdemo.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author: zsp
* @create: 2023-08-15 13:34
**/
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("该路径被拦截");
String header = request.getHeader("redis-key");
if (header != "11"){
log.info("redis-key不合法");
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
package com.tykj.zspdemo.jwt;
import com.tykj.zspdemo.exception.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.spel.standard.SpelExpression;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collection;
/**
* @author: zsp
* @create: 2023-08-23 15:55
**/
@Component
@Slf4j
public class ApiAccessDecisionManager implements AccessDecisionManager {
@Override
public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
log.info("object:{}",object);
if (configAttributes == null) {
return;
}
for (ConfigAttribute attribute : configAttributes) {
if (!authentication.isAuthenticated()) {
throw new AccessDeniedException("Access Denied");
}
boolean hasPermission = checkPermission(authentication, attribute.getAttribute());
if (!hasPermission) {
throw new AccessDeniedException("Access Denied");
}
}
}
private boolean checkPermission(Authentication authentication, String requiredPermission) {
// 根据authentication和requiredPermission进行权限验证的逻辑
// 返回true表示有权限,返回false表示无权限
// 这里可以根据具体业务需求进行实现
return true;
}
@Override
public boolean supports(ConfigAttribute attribute) {
return true;
}
@Override
public boolean supports(Class<?> clazz) {
return true;
}
}
package com.tykj.zspdemo.jwt;
import org.springframework.security.core.AuthenticationException;
/**
* @author zhoushaopan
*/
public class InvalidJwtAuthenticationException extends AuthenticationException {
/**
*
*/
private static final long serialVersionUID = -761503632186596342L;
public InvalidJwtAuthenticationException(String e) {
super(e);
}
}
\ No newline at end of file
package com.tykj.zspdemo.jwt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zhoushaopan
*/
@Slf4j
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
log.info("JwtAuthenticationEntryPoint.commence:{}", authException.getMessage());
response.sendError(HttpServletResponse.SC_UNAUTHORIZED , "Jwt authentication failed");
}
}
\ No newline at end of file
package com.tykj.zspdemo.jwt;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
/**
* @author zhoushaopan
*/
public class JwtSecurityConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
private JwtTokenProvider jwtTokenProvider;
public JwtSecurityConfigurer(JwtTokenProvider jwtTokenProvider) {
this.jwtTokenProvider = jwtTokenProvider;
}
@Override
public void configure(HttpSecurity http) throws Exception {
JwtTokenAuthenticationFilter customFilter = new JwtTokenAuthenticationFilter(jwtTokenProvider);
http.exceptionHandling()
.authenticationEntryPoint(new JwtAuthenticationEntryPoint())
.and()
.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
}
}
package com.tykj.zspdemo.jwt;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zhoushaopan
*/
public class JwtTokenAuthenticationFilter extends GenericFilterBean {
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
private final JwtTokenProvider jwtTokenProvider;
public JwtTokenAuthenticationFilter(JwtTokenProvider jwtTokenProvider) {
this.jwtTokenProvider = jwtTokenProvider;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String requestUri = request.getRequestURI();
//放行的路径
// String[] urls = new String[]{
// "/user/login","/role/**","/user/insert"
// };
// Boolean check = check(urls, requestUri);
// if (check){
// //放行
// System.out.println("check = " + check);
// filterChain.doFilter(request,response);
// return;
// }
try {
String token = jwtTokenProvider.resolveToken(request);
if (token != null && jwtTokenProvider.validateToken(token)) {
Authentication auth = jwtTokenProvider.getAuthentication(token);
if (auth != null) {
SecurityContextHolder.getContext().setAuthentication(auth);
}
//刷新token
}
// else {
// response.setStatus(HttpStatus.UNAUTHORIZED.value());
// response.getWriter().write("Unauthorized");
// response.getWriter().flush();
// return;
//
// }
} catch (InvalidJwtAuthenticationException e) {
response.setStatus(HttpStatus.FORBIDDEN.value());
response.getWriter().write("Invalid token");
response.getWriter().flush();
return;
}
filterChain.doFilter(req, res);
}
/**
* 为路径做检验
* @param urls 需要放行的路径
* @param requestURI 请求的路径
* @return true false
*/
private Boolean check(String[] urls,String requestURI){
// "/user/login","/role/**","/user/insert"
for (String url : urls) {
return PATH_MATCHER.match(url, requestURI);
}
return false;
}
}
package com.tykj.zspdemo.jwt;
import com.tykj.zspdemo.security.MyUserDetailsServiceImpl;
import com.tykj.zspdemo.security.SecurityUser;
import io.jsonwebtoken.*;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Base64;
import java.util.Date;
@Component
public class JwtTokenProvider {
@Resource
private MyUserDetailsServiceImpl myUserDetailsService;
private String secretKey;
@PostConstruct
protected void init() {
secretKey = Base64.getEncoder().encodeToString("pkslow.key".getBytes());
}
/**
* 根据用户名生成token
* @param username
* @return
*/
public String createToken(String username) {
Claims claims = Jwts.claims().setSubject(username);
claims.put("username", username);
Date start = new Date();
//7小时有效时间
long currentTime = System.currentTimeMillis() + 60 * 60 * 1000*24;
Date end = new Date(currentTime);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(start)
.setExpiration(end)
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
public Authentication getAuthentication(String token) {
SecurityUser securityUser = (SecurityUser) myUserDetailsService.loadUserByUsername(getUsername(token));
return new UsernamePasswordAuthenticationToken(securityUser, "", securityUser.getAuthorities());
}
public String getUsername(String token) {
Claims body = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
return (String) body.get("username");
}
public Claims getClaims(String token) {
return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
}
/**
* 解析token
* @param req 请求流
* @return token字符串
*/
public String resolveToken(HttpServletRequest req) {
String bearerToken = req.getHeader("Authorization");
if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
/**
* 验证token
* @param token token
* @return 返回true或者false
*/
public boolean validateToken(String token) {
try {
Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
if (claims.getBody()==null) {
return false;
}
return true;
} catch (JwtException | IllegalArgumentException e) {
throw new InvalidJwtAuthenticationException("Expired or invalid JWT token");
}
}
}
//package com.tykj.zspdemo.jwt;
//
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.http.HttpStatus;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.core.Authentication;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.web.AuthenticationEntryPoint;
//import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
//import org.springframework.util.AntPathMatcher;
//
//import javax.annotation.Resource;
//import javax.servlet.FilterChain;
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//
///**
// * @author: zsp
// * @create: 2023-09-01 10:19
// **/
//@Slf4j
//public class SecurityFilter extends BasicAuthenticationFilter {
//
// private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
//
//
// private JwtTokenProvider jwtTokenProvider;
//
//
//// public SecurityFilter(AuthenticationManager authenticationManager) {
//// super(authenticationManager);
//// }
////
//// public SecurityFilter(AuthenticationManager authenticationManager, AuthenticationEntryPoint authenticationEntryPoint) {
//// super(authenticationManager, authenticationEntryPoint);
//// }
//
// public SecurityFilter(AuthenticationManager authenticationManager, AuthenticationEntryPoint authenticationEntryPoint,JwtTokenProvider jwtTokenProvider) {
// super(authenticationManager, authenticationEntryPoint);
// this.jwtTokenProvider = jwtTokenProvider;
// }
//
// @Override
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
// log.info("request:{}",request.getRequestURI());
// String requestURI = request.getRequestURI();
//// String[] urls = new String[]{
//// "/user/login","/role/**","/user/insert"
//// };
//// Boolean check = check(urls, requestURI);
//// if (check){
//// //放行
//// System.out.println("check = " + check);
//// chain.doFilter(request,response);
//// return;
//// }
// try {
// String token = jwtTokenProvider.resolveToken(request);
// if (token != null && jwtTokenProvider.validateToken(token)) {
// Authentication auth = jwtTokenProvider.getAuthentication(token);
// if (auth != null) {
// SecurityContextHolder.getContext().setAuthentication(auth);
// }
// //刷新token
// }
// } catch (InvalidJwtAuthenticationException e) {
// response.setStatus(HttpStatus.FORBIDDEN.value());
// response.getWriter().write("Invalid token");
// response.getWriter().flush();
// return;
// }
// super.doFilterInternal(request, response, chain);
// }
//
// @Override
// protected void onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException {
// super.onSuccessfulAuthentication(request, response, authResult);
// }
//
// /**
// * 为路径做检验
// * @param urls 需要放行的路径
// * @param requestURI 请求的路径
// * @return true false
// */
// private Boolean check(String[] urls,String requestURI){
//// "/user/login","/role/**","/user/insert"
// for (String url : urls) {
// return PATH_MATCHER.match(url, requestURI);
// }
// return false;
// }
//
//}
package com.tykj.zspdemo.security;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zhoushaopan
* @decription 未登录时返回json
*/
@Component
@Slf4j
public class MyEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
log.info("用户未登陆-----");
log.info("异常信息:{}",e.getMessage());
httpServletResponse.setStatus(403);
httpServletResponse.setContentType("application/json");
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.getWriter().println("{\"code\":403,\"msg\":\"用户未登陆\"}");
}
}
package com.tykj.zspdemo.security;
import com.tykj.zspdemo.subject.entity.Role;
import com.tykj.zspdemo.subject.entity.User;
import com.tykj.zspdemo.subject.entity.UserRole;
import com.tykj.zspdemo.subject.mapper.RoleMapper;
import com.tykj.zspdemo.subject.mapper.UserMapper;
import com.tykj.zspdemo.subject.mapper.UserRoleMapper;
import com.tykj.zspdemo.subject.service.RoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.lang.reflect.Array;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zhoushaopan
*/
@Service
@Slf4j
public class MyUserDetailsServiceImpl implements UserDetailsService {
@Resource
private UserMapper userMapper;
@Resource
private RoleService roleService;
@Resource
private UserRoleMapper userRoleMapper;
@Override
public UserDetails loadUserByUsername(String username){
SecurityUser securityUser = new SecurityUser();
User user = userMapper.findByUsername(username);
if (user == null){
throw new UsernameNotFoundException("该用户不存在");
}
Integer userId = user.getId();
List<UserRole> userRoleList = userRoleMapper.findAllByUserId(userId);
if (userRoleList.size() >0){
List<Integer> roleIdList = userRoleList
.stream()
.map(UserRole::getRoleId)
.distinct()
.collect(Collectors.toList());
List<Role> roles = roleService.findAllByIds(roleIdList);
securityUser.setRoleList(roles);
}
securityUser.setUser(user);
securityUser.setUsername(user.getUsername());
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(securityUser, user.getPassword(),
securityUser.getAuthorities()));
return securityUser;
}
}
package com.tykj.zspdemo.security;
import com.tykj.zspdemo.jwt.ApiAccessDecisionManager;
import com.tykj.zspdemo.jwt.JwtSecurityConfigurer;
import com.tykj.zspdemo.jwt.JwtTokenAuthenticationFilter;
import com.tykj.zspdemo.jwt.JwtTokenProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.annotation.Resource;
/**
* @author zsp
*/
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Resource
private JwtTokenProvider jwtTokenProvider;
@Resource
private MyEntryPoint myEntryPoint;
@Resource
private UrlAccessDeniedHandler urlAccessDeniedHandler;
@Resource
private ApiAccessDecisionManager apiAccessDecisionManager;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/user/login","/role/**","/user/insert").permitAll()
.accessDecisionManager(accessDecisionManager())
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(myEntryPoint)
.accessDeniedHandler(urlAccessDeniedHandler)
.and()
// .apply(new JwtSecurityConfigurer(jwtTokenProvider))
.addFilterBefore(new JwtTokenAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class);
// .and();
}
@Override
public void configure(WebSecurity web) {
//swagger静态资源访问
web.ignoring().antMatchers("/v2/api-docs", "/v2/api-docs-ext", "/configuration/ui",
"/swagger-resources/**", "/configuration/security", "/swagger-ui/", "/swagger-ui/**", "" +
"/swagger-ui.html", "/doc.html", "/webjars/**", "/swagger-resources/configuration/ui",
"**/swagger-ui.html", "**/**/index.html", "**/index.html", "/**/index.html", "/js/**",
"/css/**", "/fonts/**", "/img/**","/access/send","/user/s","/druid/*","/file/**","/fonts/**"
);
}
@Bean
public AccessDecisionManager accessDecisionManager() {
// 返回自定义的AccessDecisionManager
return apiAccessDecisionManager;
}
}
package com.tykj.zspdemo.security;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tykj.zspdemo.subject.entity.Role;
import com.tykj.zspdemo.subject.entity.User;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author zhoushaopan
*/
@Data
@Slf4j
public class SecurityUser implements UserDetails {
/**
* 当前登录用户
*/
private User user;
private String token;
private List<Role> roleList;
private String username;
public SecurityUser() {
}
/**
* 获取当前用户所具有的角色
*
* @return
*/
@Override
@JsonIgnore
public Collection<? extends GrantedAuthority> getAuthorities() {
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
roleList.forEach(role -> {
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(role.getRoleName());
authorities.add(simpleGrantedAuthority);
});
return authorities;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
@JsonIgnore
public boolean isAccountNonExpired() {
return true;
}
@Override
@JsonIgnore
public boolean isAccountNonLocked() {
return true;
}
@Override
@JsonIgnore
public boolean isCredentialsNonExpired() {
return true;
}
@Override
@JsonIgnore
public boolean isEnabled() {
return true;
}
@Override
public String toString() {
return this.username;
}
@Override
public int hashCode() {
return username.hashCode();
}
@Override
public boolean equals(Object obj) {
return this.toString().equals(obj.toString());
}
}
\ No newline at end of file
package com.tykj.zspdemo.security;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* <p> 认证url权限 - 登录后访问接口无权限 - 自定义403无权限响应内容 </p>
*
* @author zhoushaopan
* @date : 2019/10/14 18:52
*/
@Component
@Slf4j
public class UrlAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {
log.info("无权限请求该接口");
log.info("请求地址: {}",request.getRequestURI());
log.info("异常: {}",e.getMessage());
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,"无权限请求该接口");
}
}
package com.tykj.zspdemo.subject.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: zsp
* @create: 2023-08-15 13:39
**/
@RestController
@RequestMapping("/inter")
@Slf4j
public class InterceptorController {
@GetMapping("/a")
public void a(){
log.info("aaaa");
}
@GetMapping("/b")
public void b(){
log.info("bbbb");
}
@GetMapping("/c")
public void c(){
log.info("cccc");
}
}
package com.tykj.zspdemo.subject.controller;
import com.tykj.zspdemo.subject.entity.vo.PageWebVO;
import com.tykj.zspdemo.subject.entity.vo.SingVO;
import com.tykj.zspdemo.subject.service.KxBaseSingleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author: zsp
* @create: 2023-08-15 13:39
**/
@RestController
@RequestMapping("/kxBase")
@Slf4j
public class KxBaseSingleController {
@Resource
private KxBaseSingleService kxBaseSingleService;
@GetMapping("/getPage")
public PageWebVO<SingVO> getPage(){
return kxBaseSingleService.getPage();
}
}
package com.tykj.zspdemo.subject.controller;
import com.tykj.zspdemo.subject.entity.MpEntity;
import com.tykj.zspdemo.subject.entity.vo.PageWebVO;
import com.tykj.zspdemo.subject.entity.vo.SelectMpVO;
import com.tykj.zspdemo.subject.entity.vo.SingVO;
import com.tykj.zspdemo.subject.service.MpEntityService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author: zsp
* @create: 2023-08-30 14:20
**/
@RestController
@RequestMapping("/mpEntity")
@Slf4j
public class MpEntityController {
@Resource
private MpEntityService mpEntityService;
@PostMapping("/insert")
public void insert(@RequestBody MpEntity mpEntity){
mpEntityService.insert(mpEntity);
}
@PostMapping("/getPage")
public PageWebVO<MpEntity> getPage(@RequestBody SelectMpVO selectMpVO){
return mpEntityService.getPage(selectMpVO);
}
@PostMapping("/update")
public void update(@RequestBody MpEntity mpEntity){
mpEntityService.update(mpEntity);
}
@DeleteMapping("/remove")
public void remove(Integer id){
mpEntityService.remove(id);
}
}
package com.tykj.zspdemo.subject.controller;
import com.tykj.zspdemo.subject.entity.Role;
import com.tykj.zspdemo.subject.entity.User;
import com.tykj.zspdemo.subject.entity.UserRole;
import com.tykj.zspdemo.subject.service.RoleService;
import com.tykj.zspdemo.subject.service.UserRoleService;
import com.tykj.zspdemo.subject.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:10
**/
@RestController
@RequestMapping("/role")
@Slf4j
public class RoleController {
@Resource
private RoleService roleService;
@Resource
private UserRoleService userRoleService;
@PostMapping("/insert")
public String insert(@RequestBody Role role){
roleService.insertRole(role);
return "新增角色成功";
}
@PostMapping("/insertUserRole")
public String insertUserRole(@RequestBody UserRole userRole){
userRoleService.insert(userRole);
return "授权成功";
}
}
package com.tykj.zspdemo.subject.controller;
import com.tykj.zspdemo.aop.CountAop;
import com.tykj.zspdemo.security.SecurityUser;
import com.tykj.zspdemo.subject.entity.MpEntity;
import com.tykj.zspdemo.subject.entity.User;
import com.tykj.zspdemo.subject.entity.vo.user.UserVO;
import com.tykj.zspdemo.subject.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:10
**/
@RestController
@RequestMapping("/user")
@Slf4j
@CountAop(desc = "用户管理")
public class UserController {
@Resource
private UserService userService;
@PostMapping("/insert")
public String insert(@RequestBody User user){
userService.insertUser(user);
return "success";
}
@GetMapping("/selectUserList")
public List<User> selectUserList(){
return userService.selectUserList();
}
@GetMapping("/findUserById/{id}")
public User findUserById(@PathVariable("id") Integer id){
return userService.findUserById(id);
}
@PostMapping("/login")
public SecurityUser login(@RequestBody UserVO userVO){
return userService.login(userVO);
}
}
package com.tykj.zspdemo.subject.entity;
import lombok.Data;
/**
* @author: zsp
* @create: 2023-09-01 13:12
**/
@Data
public class CountApp {
}
package com.tykj.zspdemo.subject.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author zhoushaopan
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class KxBaseSingleRecord {
private Integer id;
private Integer educationBaseId;
private String userIdentity;
private String userName;
private String idCode;
private String telephone;
private Date startTime;
private Date endTime;
private Date appointmentTime;
private String accompanyUser;
private Integer timeSlot;
private Integer userNum;
private Integer recordType;
private Integer teamId;
private String teamName;
private String signInStatus;
private Integer signInNum;
private Date signInTime;
private String cancelDescribe;
private String rangeDescribe;
private String signInMode;
}
package com.tykj.zspdemo.subject.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tykj.zspdemo.base.BaseMpEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: zsp
* @create: 2023-08-30 14:00
**/
@TableName("mp_entity")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class MpEntity extends BaseMpEntity {
private String name;
private Integer age;
private String sex;
}
package com.tykj.zspdemo.subject.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: zsp
* @create: 2023-08-31 14:01
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "role")
public class Role {
@TableId(type = IdType.AUTO)
private Integer id;
private String roleName;
}
package com.tykj.zspdemo.subject.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: zsp
* @create: 2023-08-31 13:59
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
private String password;
private String phone;
}
package com.tykj.zspdemo.subject.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: zsp
* @create: 2023-08-31 14:02
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "user_role")
public class UserRole {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer userId;
private Integer roleId;
}
package com.tykj.zspdemo.subject.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-25 10:17
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageWebVO<T> {
private Long totalRecords;
private Long totalPages;
private List<T> data;
}
package com.tykj.zspdemo.subject.entity.vo;
import com.tykj.zspdemo.base.CustomPage;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: zsp
* @create: 2023-08-30 14:42
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SelectMpVO extends CustomPage {
private String mpName;
}
package com.tykj.zspdemo.subject.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @author: zsp
* @create: 2023-08-30 11:25
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SingVO {
private Integer educationBaseId;
private String userIdentity;
private String userName;
private String idCode;
private String telephone;
private Date startTime;
private Date endTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date appointmentTime;
private String accompanyUser;
private Integer timeSlot;
private Integer userNum;
private Integer recordType;
private Integer teamId;
private String teamName;
private String signInStatus;
private Integer signInNum;
private Date signInTime;
private String cancelDescribe;
private String rangeDescribe;
private String signInMode;
}
package com.tykj.zspdemo.subject.entity.vo.user;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: zsp
* @create: 2023-08-31 14:41
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVO {
private String username;
private String password;
}
package com.tykj.zspdemo.subject.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tykj.zspdemo.subject.entity.KxBaseSingleRecord;
/**
* @author: zsp
* @create: 2023-08-30 10:29
**/
public interface KxBaseSingleRecordMapper extends BaseMapper<KxBaseSingleRecord> {
}
package com.tykj.zspdemo.subject.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tykj.zspdemo.subject.entity.MpEntity;
/**
* @author: zsp
* @create: 2023-08-30 14:19
**/
public interface MpEntityMapper extends BaseMapper<MpEntity> {
}
package com.tykj.zspdemo.subject.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tykj.zspdemo.subject.entity.Role;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.lang.reflect.Array;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-30 14:19
**/
public interface RoleMapper extends BaseMapper<Role> {
/**
* 根据id集合查询角色
* @param ids
* @return
*/
@Select("select * from role where id in ${ids}")
List<Role> selectAllByIds(Integer[] ids);
}
package com.tykj.zspdemo.subject.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tykj.zspdemo.subject.entity.User;
import org.apache.ibatis.annotations.Select;
/**
* @author: zsp
* @create: 2023-08-30 14:19
**/
public interface UserMapper extends BaseMapper<User> {
/**
* 根据名称查询
* @param username
* @return
*/
@Select("select * from user where username = #{username}")
User findByUsername(String username);
}
package com.tykj.zspdemo.subject.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tykj.zspdemo.subject.entity.UserRole;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:03
**/
public interface UserRoleMapper extends BaseMapper<UserRole> {
/**
* 根据用户id查询用户角色
* @param userId
* @return
*/
@Select("select * from user_role where user_id = #{userId}")
List<UserRole> findAllByUserId(Integer userId);
}
package com.tykj.zspdemo.subject.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tykj.zspdemo.subject.entity.KxBaseSingleRecord;
import com.tykj.zspdemo.subject.entity.vo.PageWebVO;
import com.tykj.zspdemo.subject.entity.vo.SingVO;
/**
* @author: zsp
* @create: 2023-08-30 10:31
**/
public interface KxBaseSingleService extends IService<KxBaseSingleRecord> {
PageWebVO<SingVO> getPage();
}
package com.tykj.zspdemo.subject.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tykj.zspdemo.subject.entity.MpEntity;
import com.tykj.zspdemo.subject.entity.vo.PageWebVO;
import com.tykj.zspdemo.subject.entity.vo.SelectMpVO;
/**
* @author: zsp
* @create: 2023-08-30 14:16
**/
public interface MpEntityService extends IService<MpEntity> {
/**
* 新增一个对象
* @param p
*/
void insert(MpEntity p);
/**
* 分页查询
* @return
*/
PageWebVO<MpEntity> getPage(SelectMpVO selectMpVO);
/**
* 更新
* @param mpEntity
*/
void update(MpEntity mpEntity);
/**
* 删除单个
* @param id
*/
void remove(Integer id);
}
package com.tykj.zspdemo.subject.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tykj.zspdemo.subject.entity.Role;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:02
**/
public interface RoleService extends IService<Role> {
/**
* 新增角色
* @param role
*/
void insertRole(Role role);
/**
* 根据角色ID的集合查询
* @param roleIds
* @return
*/
List<Role> findAllByIds(List<Integer> roleIds);
}
package com.tykj.zspdemo.subject.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tykj.zspdemo.subject.entity.UserRole;
/**
* @author: zsp
* @create: 2023-08-31 14:04
**/
public interface UserRoleService extends IService<UserRole> {
/**
* 绑定人员和角色的关系
* @param userRole
*/
void insert(UserRole userRole);
}
package com.tykj.zspdemo.subject.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tykj.zspdemo.security.SecurityUser;
import com.tykj.zspdemo.subject.entity.User;
import com.tykj.zspdemo.subject.entity.vo.user.UserVO;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:01
**/
public interface UserService extends IService<User> {
/**
* 新增用户接口
* @param user
*/
void insertUser(User user);
/**
* 查询用户列表接口
* @return
*/
List<User> selectUserList();
/**
* 查询单个用户接口
* @param id
* @return
*/
User findUserById(Integer id);
/**
* 登录接口
* @param userVO
* @return
*/
SecurityUser login(UserVO userVO);
}
package com.tykj.zspdemo.subject.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tykj.zspdemo.subject.entity.KxBaseSingleRecord;
import com.tykj.zspdemo.subject.entity.vo.PageWebVO;
import com.tykj.zspdemo.subject.entity.vo.SingVO;
import com.tykj.zspdemo.subject.mapper.KxBaseSingleRecordMapper;
import com.tykj.zspdemo.subject.service.KxBaseSingleService;
import com.tykj.zspdemo.subject.util.MapToObjectConverter;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
* @author: zsp
* @create: 2023-08-30 10:31
**/
@Service
public class KxBaseSingleServiceImpl extends ServiceImpl<KxBaseSingleRecordMapper,KxBaseSingleRecord> implements KxBaseSingleService {
@Resource
private KxBaseSingleRecordMapper kxBaseSingleRecordMapper;
@Override
public PageWebVO<SingVO> getPage() {
Page<Map<String, Object>> page = new Page<>(1, 2);
QueryWrapper<KxBaseSingleRecord> query = new QueryWrapper<>();
List<String> columns = new ArrayList<>(Arrays.asList("education_base_id","appointment_time"));
query.groupBy(columns)
.select("education_base_id","appointment_time","count(appointment_time) as count","sum(sign_in_num) as sign_in_num");
Page<Map<String, Object>> mapPage = kxBaseSingleRecordMapper.selectMapsPage(page, query);
List<Map<String, Object>> records = mapPage.getRecords();
List<SingVO> singleRecords = new ArrayList<>();
if (records.size() > 0) {
for (Map<String, Object> map : records) {
try {
SingVO convert = MapToObjectConverter.convert(map, SingVO.class);
singleRecords.add(convert);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return new PageWebVO<>(mapPage.getTotal(), mapPage.getPages(), singleRecords);
}
}
package com.tykj.zspdemo.subject.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tykj.zspdemo.subject.entity.MpEntity;
import com.tykj.zspdemo.subject.entity.vo.PageWebVO;
import com.tykj.zspdemo.subject.entity.vo.SelectMpVO;
import com.tykj.zspdemo.subject.mapper.MpEntityMapper;
import com.tykj.zspdemo.subject.service.MpEntityService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* @author: zsp
* @create: 2023-08-30 14:16
**/
@Service
public class MpEntityServiceImpl extends ServiceImpl<MpEntityMapper,MpEntity>implements MpEntityService {
@Resource
private MpEntityMapper mpEntityMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void insert(MpEntity p) {
mpEntityMapper.insert(p);
}
@Override
public PageWebVO<MpEntity> getPage(SelectMpVO selectMpVO) {
String mpName = selectMpVO.getMpName();
QueryWrapper<MpEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(mpName != null, "name", mpName);
Page<MpEntity> selectPage = mpEntityMapper.selectPage(selectMpVO.getPageable(), queryWrapper);
return new PageWebVO<>(selectPage.getTotal(),selectPage.getPages(),selectPage.getRecords());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MpEntity mpEntity) {
mpEntityMapper.updateById(mpEntity);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void remove(Integer id) {
mpEntityMapper.deleteById(id);
}
}
package com.tykj.zspdemo.subject.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tykj.zspdemo.subject.entity.Role;
import com.tykj.zspdemo.subject.mapper.RoleMapper;
import com.tykj.zspdemo.subject.service.RoleService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:09
**/
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
@Resource
private RoleMapper roleMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void insertRole(Role role) {
roleMapper.insert(role);
}
@Override
public List<Role> findAllByIds(List<Integer> roleIds) {
QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
queryWrapper.in("id",roleIds);
return roleMapper.selectList(queryWrapper);
}
}
package com.tykj.zspdemo.subject.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tykj.zspdemo.subject.entity.UserRole;
import com.tykj.zspdemo.subject.mapper.UserRoleMapper;
import com.tykj.zspdemo.subject.service.UserRoleService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* @author: zsp
* @create: 2023-08-31 14:04
**/
@Service
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper,UserRole> implements UserRoleService {
@Resource
private UserRoleMapper userRoleMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void insert(UserRole userRole) {
userRoleMapper.insert(userRole);
}
}
package com.tykj.zspdemo.subject.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tykj.zspdemo.jwt.JwtTokenProvider;
import com.tykj.zspdemo.security.MyUserDetailsServiceImpl;
import com.tykj.zspdemo.security.SecurityUser;
import com.tykj.zspdemo.subject.entity.User;
import com.tykj.zspdemo.subject.entity.vo.user.UserVO;
import com.tykj.zspdemo.subject.mapper.UserMapper;
import com.tykj.zspdemo.subject.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: zsp
* @create: 2023-08-31 14:06
**/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
@Resource
private UserMapper userMapper;
@Resource
private PasswordEncoder passwordEncoder;
@Resource
private MyUserDetailsServiceImpl myUserDetailsService;
@Resource
private AuthenticationManager authenticationManager;
@Resource
private JwtTokenProvider jwtTokenProvider;
@Override
@Transactional(rollbackFor = Exception.class)
public void insertUser(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
userMapper.insert(user);
}
@Override
public List<User> selectUserList() {
return userMapper.selectList(null);
}
@Override
public User findUserById(Integer id) {
return userMapper.selectById(id);
}
@Override
public SecurityUser login(UserVO userVO) {
String username = userVO.getUsername();
String password = userVO.getPassword();
SecurityUser securityUser = (SecurityUser) myUserDetailsService.loadUserByUsername(username);
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(securityUser, password));
//生成token
String token = jwtTokenProvider.createToken(username);
securityUser.setToken(token);
return securityUser;
}
}
package com.tykj.zspdemo.subject.util;
/**
* @author: zsp
* @create: 2023-08-30 11:46
**/
import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
public class MapToObjectConverter {
public static <T> T convert(Map<String, Object> map, Class<T> clazz) throws Exception {
T obj = clazz.getDeclaredConstructor().newInstance();
for (Map.Entry<String, Object> entry : map.entrySet()) {
String propertyName = convertToCamelCase(entry.getKey());
BeanUtils.setProperty(obj, propertyName, entry.getValue());
}
return obj;
}
private static String convertToCamelCase(String input) {
StringBuilder sb = new StringBuilder();
boolean capitalizeNext = false;
for (char c : input.toCharArray()) {
if (c == '_') {
capitalizeNext = true;
} else {
if (capitalizeNext) {
sb.append(Character.toUpperCase(c));
capitalizeNext = false;
} else {
sb.append(Character.toLowerCase(c));
}
}
}
return sb.toString();
}
}
package com.tykj.zspdemo.webconf;
import com.tykj.zspdemo.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author: zsp
* @create: 2023-08-15 13:38
**/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 指定拦截器
HandlerInterceptor handlerInterceptor = new MyInterceptor();
// 指定拦截的url
String[] paths = {"/inter/a"};
registry.addInterceptor(handlerInterceptor).addPathPatterns(paths);
}
}
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#端口号
server.port=7999
#数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.aop.proxy-target-class= true
spring.main.allow-bean-definition-overriding=true
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
\ No newline at end of file
package com.tykj.zspdemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ZspDemoApplicationTests {
@Test
void contextLoads() {
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论