Commit a9adc66d authored by peihaiyang's avatar peihaiyang

init:初始化项目

parents
Pipeline #5851 canceled with stages
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianyan</groupId>
<artifactId>authentication-center</artifactId>
<version>1.0</version>
<!-- SpringBoot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
</parent>
<!-- 指定一些属性 -->
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.29.0</version>
</dependency>
<!-- Sa-Token 整合 jwt -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>1.29.0</version>
</dependency>
<!--mybatis-plus 持久层-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.tianyan.auc;
import cn.dev33.satoken.SaManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AUCSaTokenApplication {
public static void main(String[] args){
SpringApplication.run(AUCSaTokenApplication.class, args);
System.out.println("启动成功:Sa-Token配置如下:" + SaManager.getConfig());
}
}
\ No newline at end of file
package com.tianyan.auc.common;
import java.util.List;
/**
* @author PHY
* 统一返回数据格式
* @date 2022/5/12$-9:35
*/
public class AjaxJson {
// 序列化版本号
private static final long serialVersionUID = 1L;
// 成功状态码
public static final int CODE_SUCCESS = 200;
// 错误状态码
public static final int CODE_ERROR = 500;
// 警告状态码
public static final int CODE_NOT_JUR = 403;
// 无权限状态码
public static final int CODE_NOT_LOGIN = 401;
// 未登录状态码
public static final int CODE_INVALID_REQUEST = 400;
// 无效请求状态码
public static final int CODE_WARNING = 501;
// 状态码
public String msg;
// 描述信息
public Object data;
// 携带对象
public Long dataCount;
// 数据总数,用于分页
public int code;
/**
* 返回code
* @return
*/
public int getCode() {
return this.code;
}
/**
* 给msg赋值,连缀风格
*/
public AjaxJson setMsg(String msg) {
this.msg = msg;
return this;
}
public String getMsg() {
return this.msg;
}
/**
* 给data赋值,连缀风格
*/
public AjaxJson setData(Object data) {
this.data = data;
return this;
}
/**
* 将data还原为指定类型并返回
*/
@SuppressWarnings("unchecked")
public <T> T getData(Class<T> cs) {
return (T) data;
}
// ============================ 构建 ==================================
public AjaxJson(int code, String msg, Object data, Long dataCount) {
this.code = code;
this.msg = msg;
this.data = data;
this.dataCount = dataCount;
}
// 返回成功
public static AjaxJson getSuccess() {
return new AjaxJson(CODE_SUCCESS, "ok", null, null);
}
public static AjaxJson getSuccess(String msg) {
return new AjaxJson(CODE_SUCCESS, msg, null, null);
}
public static AjaxJson getSuccess(String msg, Object data) {
return new AjaxJson(CODE_SUCCESS, msg, data, null);
}
public static AjaxJson getSuccessData(Object data) {
return new AjaxJson(CODE_SUCCESS, "ok", data, null);
}
public static AjaxJson getSuccessArray(Object... data) {
return new AjaxJson(CODE_SUCCESS, "ok", data, null);
}
// 返回失败
public static AjaxJson getError() {
return new AjaxJson(CODE_ERROR, "error", null, null);
}
public static AjaxJson getError(String msg) {
return new AjaxJson(CODE_ERROR, msg, null, null);
}
// 返回警告
public static AjaxJson getWarning() {
return new AjaxJson(CODE_ERROR, "warning", null, null);
}
public static AjaxJson getWarning(String msg) {
return new AjaxJson(CODE_WARNING, msg, null, null);
}
// 返回未登录
public static AjaxJson getNotLogin() {
return new AjaxJson(CODE_NOT_LOGIN, "未登录,请登录后再次访问", null, null);
}
// 返回没有权限的
public static AjaxJson getNotJur(String msg) {
return new AjaxJson(CODE_NOT_JUR, msg, null, null);
}
// 返回一个自定义状态码的
public static AjaxJson get(int code, String msg){
return new AjaxJson(code, msg, null, null);
}
// 返回分页和数据的
public static AjaxJson getPageData(Long dataCount, Object data){
return new AjaxJson(CODE_SUCCESS, "ok", data, dataCount);
}
// 返回,根据受影响行数的(大于0=ok,小于0=error)
public static AjaxJson getByLine(int line){
if(line > 0){
return getSuccess("ok", line);
}
return getError("error").setData(line);
}
// 返回,根据布尔值来确定最终结果的 (true=ok,false=error)
public static AjaxJson getByBoolean(boolean b){
return b ? getSuccess("ok") : getError("error");
}
@SuppressWarnings("rawtypes")
@Override
public String toString() {
String data_string = null;
if(data == null){
} else if(data instanceof List){
data_string = "List(length=" + ((List)data).size() + ")";
} else {
data_string = data.toString();
}
return "{"
+ "\"code\": " + this.getCode()
+ ", \"msg\": \"" + this.getMsg() + "\""
+ ", \"data\": " + data_string
+ ", \"dataCount\": " + dataCount
+ "}";
}
}
package com.tianyan.auc.common;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**
* spring工具类 方便在非spring管理环境中获取bean
*
* @author sun.zy
*/
@Component
public final class SpringUtils implements BeanFactoryPostProcessor
{
/** Spring应用上下文环境 */
private static ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
{
SpringUtils.beanFactory = beanFactory;
}
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException
{
return (T) beanFactory.getBean(name);
}
/**
* 获取类型为requiredType的对象
*
* @param clz
* @return
* @throws BeansException
*
*/
public static <T> T getBean(Class<T> clz) throws BeansException
{
T result = (T) beanFactory.getBean(clz);
return result;
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name)
{
return beanFactory.containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
*
* @param name
* @return boolean
* @throws NoSuchBeanDefinitionException
*
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
{
return beanFactory.isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
* @throws NoSuchBeanDefinitionException
*
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
{
return beanFactory.getType(name);
}
/**
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
*
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
{
return beanFactory.getAliases(name);
}
/**
* 获取aop代理对象
*
* @param invoker
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getAopProxy(T invoker)
{
return (T) AopContext.currentProxy();
}
}
package com.tianyan.auc.common;
/**
* @author PHY
* @date 2022/4/29$-10:48
* 返回对应的处理类
*/
public enum TypeServiceEnum {
ID_CARD("cardService","(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"),//身份证号
PHONE("phoneService","^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$"),//手机号
EMAIL("emailService","^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"),//邮箱
COUNT("countService","^[a-zA-Z][a-zA-Z0-9_]{4,15}$"); //账号
private String name;
private String type;
TypeServiceEnum(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
/**
* 根据传入的value 进行匹配对应的实现类名,进行实现
* @param val 13000000000或者123@qq.com,23456742,110119010001999019X
* @return
*/
public static String getTypeService(String val){
TypeServiceEnum[] values = TypeServiceEnum.values();
for (TypeServiceEnum value : values) {
if (val.matches(value.getType())) {
return value.getName();
}
}
return PHONE.getName();
}
}
package com.tianyan.auc.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList;
import java.util.List;
@ConfigurationProperties(prefix = "ignore")
public class IgnoreWhiteProperties
{
/**
* 放行白名单配置,网关不校验此处的白名单
*/
private List<String> whites = new ArrayList<>();
public List<String> getWhites()
{
return whites;
}
public void setWhites(List<String> whites)
{
this.whites = whites;
}
}
\ No newline at end of file
package com.tianyan.auc.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author PHY
* @date 2022/5/12$-10:39
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.lingyan.auc.*.mapper")
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// paginationInterceptor.setLimit(你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制);
return paginationInterceptor;
}
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
/**
* SQL执行效率插件
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(2000);
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}// sql time too large
}
package com.tianyan.auc.config;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.jwt.StpLogicJwtForStyle;
import cn.dev33.satoken.stp.StpLogic;
import com.tianyan.auc.exception.SaTokenFilterExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(IgnoreWhiteProperties.class)
public class SaTokenConfigure {
// Sa-Token 整合 jwt (Style模式)
@Bean
public StpLogic getStpLogicJwt() {
return new StpLogicJwtForStyle();
}
@Autowired
private IgnoreWhiteProperties ignoreWhiteProperties;
@Autowired
private UserAuthFilter userAuthFilter;
@Autowired
private SaTokenFilterExceptionHandler saTokenFilterExceptionHandler;
/**
* 注册 [Sa-Token全局过滤器]
*/
// @Bean
public SaServletFilter getSaServletFilter() {
return new SaServletFilter()
// 指定 拦截路由 与 放行路由
.addInclude("/**").setExcludeList(ignoreWhiteProperties.getWhites())
// 认证函数: 每次请求执行
.setAuth(userAuthFilter)
// 异常处理函数:每次认证函数发生异常时执行此函数
.setError(saTokenFilterExceptionHandler)
// 前置函数:在每次认证函数之前执行
.setBeforeAuth(r -> {
// ---------- 设置一些安全响应头 ----------
SaHolder.getResponse()
// 服务器名称
.setServer("sa-server")
// 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以
.setHeader("X-Frame-Options", "SAMEORIGIN")
// 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面
.setHeader("X-XSS-Protection", "1; mode=block")
// 禁用浏览器内容嗅探
.setHeader("X-Content-Type-Options", "nosniff");
});
}
}
\ No newline at end of file
package com.tianyan.auc.config;
import cn.dev33.satoken.filter.SaFilterAuthStrategy;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.stereotype.Component;
/**
* @author PHY
* @date 2022/5/12$-10:47
*/
@Component
public class UserAuthFilter implements SaFilterAuthStrategy {
@Override
public void run(Object o) {
System.out.println("---------- 进入Sa-Token全局认证 -----------");
// 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
SaRouter.match("/**", "/user/doLogin", () -> StpUtil.checkLogin());
// 更多拦截处理方式,请参考“路由拦截式鉴权”章节
}
}
package com.tianyan.auc.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author PHY
* @date 2022/5/12$-9:30
*
*/
@RestController
@RequestMapping("/user/")
public class LoginController {
// 测试登录 ---- http://localhost:8081/user/doLogin?name=zhang&pwd=123456
@RequestMapping("doLogin")
public SaResult doLogin(String name, String pwd) {
// 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
if("zhang".equals(name) && "123456".equals(pwd)) {
StpUtil.login(10001);
return SaResult.ok("登录成功");
}
return SaResult.error("登录失败");
}
// 查询登录状态 ---- http://localhost:8081/user/isLogin
@RequestMapping("isLogin")
public SaResult isLogin() {
return SaResult.ok("是否登录:" + StpUtil.isLogin());
}
/**
* 查询 Token 信息 ---- http://localhost:8081/user/tokenInfo
* @return
*/
@RequestMapping("tokenInfo")
public SaResult tokenInfo() {
return SaResult.data(StpUtil.getTokenInfo());
}
/**
注销 ---- http://localhost:8081/user/logout
*/
@RequestMapping("logout")
public SaResult logout() {
StpUtil.logout();
return SaResult.ok();
}
}
package com.tianyan.auc.exception;
import cn.dev33.satoken.exception.DisableLoginException;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import com.tianyan.auc.common.AjaxJson;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 全局异常处理
*/
@ControllerAdvice
public class GlobalException {
// 全局异常拦截(拦截项目中的所有异常)
@ResponseBody
@ExceptionHandler
public AjaxJson handlerException(Exception e, HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 打印堆栈,以供调试
System.out.println("全局异常---------------");
e.printStackTrace();
// 不同异常返回不同状态码
AjaxJson aj = null;
if (e instanceof NotLoginException) { // 如果是未登录异常
NotLoginException ee = (NotLoginException) e;
aj = AjaxJson.getNotLogin().setMsg(ee.getMessage());
}
else if(e instanceof NotRoleException) { // 如果是角色异常
NotRoleException ee = (NotRoleException) e;
aj = AjaxJson.getNotJur("无此角色:" + ee.getRole());
}
else if(e instanceof NotPermissionException) { // 如果是权限异常
NotPermissionException ee = (NotPermissionException) e;
aj = AjaxJson.getNotJur("无此权限:" + ee.getCode());
}
else if(e instanceof DisableLoginException) { // 如果是被封禁异常
DisableLoginException ee = (DisableLoginException) e;
aj = AjaxJson.getNotJur("账号被封禁:" + ee.getDisableTime() + "秒后解封");
}
else { // 普通异常, 输出:500 + 异常信息
aj = AjaxJson.getError(e.getMessage());
}
// 返回给前端
return aj;
}
}
\ No newline at end of file
package com.tianyan.auc.exception;
import cn.dev33.satoken.filter.SaFilterErrorStrategy;
import com.tianyan.auc.common.AjaxJson;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
/**
* 网关统一异常处理
*
* @author sun.zy
*/
@Order(-1)
@Configuration
public class SaTokenFilterExceptionHandler implements SaFilterErrorStrategy
{
@Override
public Object run(Throwable e) {
System.out.println("---------- 进入Sa-Token异常处理 -----------");
return AjaxJson.getError(e.getMessage());
}
}
\ No newline at end of file
package com.tianyan.auc.service;
/**
* @author PHY
* @date 2022/5/6$-19:01
*/
public interface CardService {
}
package com.tianyan.auc.service;
/**
* @author PHY
* @date 2022/5/6$-18:59
*/
public interface CountService {
}
package com.tianyan.auc.service;
/**
* @author PHY
* @date 2022/5/6$-14:12
*/
public interface EmailService {
void saveUser(String type);
}
package com.tianyan.auc.service;
/**
* @author PHY
* @date 2022/5/6$-14:01
* 各个service定制操作
*/
public interface PhoneService {
String selectUserByPhone(String phone);
}
package com.tianyan.auc.service;
/**
* @author PHY
* @date 2022/5/6$-16:15
*/
public interface UserHandle {
/**
* 登录使用,前端为我们提供两个参数 需要后台自己解析,是什么,后台预设了
*/
UserHandle getServiceType(String type);
/**
* 无论哪种登录方式都是要查询user用户的,几种预设登陆的通用方法
* P--- phone 手机号登陆
* E--- Email
* C--- Id_card 身份证号
* C--- count 账号登录
*/
String selectUserByPECC(String code);
}
package com.tianyan.auc.service.impl;
import com.tianyan.auc.service.CardService;
import com.tianyan.auc.service.UserHandle;
import org.springframework.stereotype.Service;
/**
* @author PHY
* @date 2022/5/6$-19:01
*/
@Service("cardService")
public class CardServiceImpl implements CardService, UserHandle {
@Override
public UserHandle getServiceType(String type) {
return null;
}
@Override
public String selectUserByPECC(String code) {
return null;
}
}
package com.tianyan.auc.service.impl;
import com.tianyan.auc.common.SpringUtils;
import com.tianyan.auc.common.TypeServiceEnum;
import com.tianyan.auc.service.CountService;
import com.tianyan.auc.service.UserHandle;
import org.springframework.stereotype.Service;
/**
* @author PHY
* @date 2022/5/6$-19:00
*/
@Service("countService")
public class CountServiceImpl implements CountService, UserHandle {
@Override
public UserHandle getServiceType(String type) {
return SpringUtils.getBean(TypeServiceEnum.getTypeService(type));
}
@Override
public String selectUserByPECC(String code) {
return null;
}
}
package com.tianyan.auc.service.impl;
import com.tianyan.auc.common.SpringUtils;
import com.tianyan.auc.common.TypeServiceEnum;
import com.tianyan.auc.service.EmailService;
import com.tianyan.auc.service.UserHandle;
import org.springframework.stereotype.Service;
/**
* @author PHY
* @date 2022/5/6$-14:13
*/
@Service(value = "emailService")
public class EmailServiceImpl implements EmailService, UserHandle {
@Override
public String selectUserByPECC(String code) {
return null;
}
@Override
public void saveUser(String type) {
}
@Override
public UserHandle getServiceType(String type) {
return SpringUtils.getBean(TypeServiceEnum.getTypeService(type));
}
}
package com.tianyan.auc.service.impl;
import com.tianyan.auc.common.SpringUtils;
import com.tianyan.auc.common.TypeServiceEnum;
import com.tianyan.auc.service.PhoneService;
import com.tianyan.auc.service.UserHandle;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
/**
* @author PHY
* @date 2022/5/6$-14:02
*/
@Service(value = "phoneService")
@Primary
public class PhoneServiceImpl implements PhoneService, UserHandle {
@Override
public UserHandle getServiceType(String type) {
return SpringUtils.getBean(TypeServiceEnum.getTypeService(type));
}
@Override
public String selectUserByPhone(String phone) {
return null;
}
@Override
public String selectUserByPECC(String code) {
return null;
}
}
server:
# 端口
port: 8081
# Sa-Token配置
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
# token有效期,单位s 默认30天, -1代表永不过期
timeout: 10000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# 是否输出操作日志
is-log: false
# 是否在初始化配置时打印版本字符画
isPrint: false
# jwt秘钥
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
# token前缀 需要放在header中不能放在cookie中
# token-prefix: Bearer
spring:
application:
name: lingyan
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/lingyan?characterEncoding=utf-8&useSSL=false
username: root
password: root
hikari:
connection-test-query: SELECT 1
connection-timeout: 60000
idle-timeout: 500000
max-lifetime: 540000
maximum-pool-size: 12
minimum-idle: 10
pool-name: GuliHikariPool
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
# mybatis-plus
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.tianyan.auc.domain.*
global-config:
#数据库相关配置
db-config:
#主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
id-type: UUID
logic-delete-field: del_tag
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
banner: false
#原生配置
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
# 不校验白名单
ignore:
whites:
- /tianyan/business/registerApp
- /auth/login
- /auth/app_login
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