diff --git a/README.md b/README.md index 2c67d23f..26a795e4 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,6 @@ **账号密码:** `admin / 123456` -#### 活动福利 - -- 七牛云 2021 ECUG Con 全球技术大会内部票:给大家一共搞来五张小一千块钱的内部票。想要的加群【947578238】联系群主 -- 七牛云 2021 ECUG Con 全球技术大会早鸟特惠票:[点我抢购](http://www.huodongxing.com/event/1573487912300?coupon=EL666) - #### 项目源码 | | 后端源码 | 前端源码 | diff --git a/eladmin-common/src/main/java/me/zhengjie/base/BaseEntity.java b/eladmin-common/src/main/java/me/zhengjie/base/BaseEntity.java index 5f6fbfbd..618e100c 100644 --- a/eladmin-common/src/main/java/me/zhengjie/base/BaseEntity.java +++ b/eladmin-common/src/main/java/me/zhengjie/base/BaseEntity.java @@ -50,7 +50,7 @@ public class BaseEntity implements Serializable { @LastModifiedBy @Column(name = "update_by") @ApiModelProperty(value = "更新人", hidden = true) - private String updatedBy; + private String updateBy; @CreationTimestamp @Column(name = "create_time", updatable = false) diff --git a/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java b/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java index e5e16216..50343bcb 100644 --- a/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java +++ b/eladmin-common/src/main/java/me/zhengjie/config/SwaggerConfig.java @@ -26,14 +26,12 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.data.domain.Pageable; import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.schema.AlternateTypeRule; import springfox.documentation.schema.AlternateTypeRuleConvention; -import springfox.documentation.schema.ModelRef; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Parameter; +import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; @@ -53,41 +51,65 @@ public class SwaggerConfig { @Value("${jwt.header}") private String tokenHeader; - @Value("${jwt.token-start-with}") - private String tokenStartWith; - @Value("${swagger.enabled}") private Boolean enabled; @Bean @SuppressWarnings("all") public Docket createRestApi() { - ParameterBuilder ticketPar = new ParameterBuilder(); - List pars = new ArrayList<>(); - ticketPar.name(tokenHeader).description("token") - .modelRef(new ModelRef("string")) - .parameterType("header") - .defaultValue(tokenStartWith + " ") - .required(true) - .build(); - pars.add(ticketPar.build()); return new Docket(DocumentationType.SWAGGER_2) .enable(enabled) + .pathMapping("/") .apiInfo(apiInfo()) .select() .paths(Predicates.not(PathSelectors.regex("/error.*"))) + .paths(PathSelectors.any()) .build() - .globalOperationParameters(pars); + //添加登陆认证 + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .description("一个简单且易上手的 Spring boot 后台管理框架") .title("EL-ADMIN 接口文档") - .version("2.4") + .version("2.6") .build(); } + private List securitySchemes() { + //设置请求头信息 + List securitySchemes = new ArrayList<>(); + ApiKey apiKey = new ApiKey(tokenHeader, tokenHeader, "header"); + securitySchemes.add(apiKey); + return securitySchemes; + } + + private List securityContexts() { + //设置需要登录认证的路径 + List securityContexts = new ArrayList<>(); + // ^(?!auth).*$ 表示所有包含auth的接口不需要使用securitySchemes即不需要带token + // ^标识开始 ()里是一子表达式 ?!/auth表示匹配不是/auth的位置,匹配上则添加请求头,注意路径已/开头 .表示任意字符 *表示前面的字符匹配多次 $标识结束 + securityContexts.add(getContextByPath()); + return securityContexts; + } + + private SecurityContext getContextByPath() { + return SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("^(?!/auth).*$")) + .build(); + } + + private List defaultAuth() { + List securityReferences = new ArrayList<>(); + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + securityReferences.add(new SecurityReference(tokenHeader, authorizationScopes)); + return securityReferences; + } } /** diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/FileUtil.java b/eladmin-common/src/main/java/me/zhengjie/utils/FileUtil.java index 10ccd712..bf23eff9 100644 --- a/eladmin-common/src/main/java/me/zhengjie/utils/FileUtil.java +++ b/eladmin-common/src/main/java/me/zhengjie/utils/FileUtil.java @@ -95,7 +95,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { File file = null; try { // 用uuid作为文件名,防止生成的临时文件重复 - file = File.createTempFile(IdUtil.simpleUUID(), prefix); + file = new File(SYS_TEM_DIR + IdUtil.simpleUUID() + prefix); // MultipartFile to File multipartFile.transferTo(file); } catch (IOException e) { diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/RsaUtils.java b/eladmin-common/src/main/java/me/zhengjie/utils/RsaUtils.java index 58089211..7c1f6d15 100644 --- a/eladmin-common/src/main/java/me/zhengjie/utils/RsaUtils.java +++ b/eladmin-common/src/main/java/me/zhengjie/utils/RsaUtils.java @@ -2,6 +2,7 @@ package me.zhengjie.utils; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; @@ -80,7 +81,7 @@ public class RsaUtils { PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, publicKey); - byte[] result = cipher.doFinal(Base64.decodeBase64(text)); + byte[] result = doLongerCipherFinal(cipher, Base64.decodeBase64(text)); return new String(result); } @@ -98,7 +99,7 @@ public class RsaUtils { PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, privateKey); - byte[] result = cipher.doFinal(text.getBytes()); + byte[] result = doLongerCipherFinal(cipher, text.getBytes()); return Base64.encodeBase64String(result); } @@ -116,7 +117,7 @@ public class RsaUtils { PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] result = cipher.doFinal(Base64.decodeBase64(text)); + byte[] result = doLongerCipherFinal(cipher, Base64.decodeBase64(text)); return new String(result); } @@ -133,10 +134,23 @@ public class RsaUtils { PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] result = cipher.doFinal(text.getBytes()); + byte[] result = doLongerCipherFinal(cipher, text.getBytes()); return Base64.encodeBase64String(result); } + private static byte[] doLongerCipherFinal(Cipher cipher, byte[] source) throws Exception { + int offset = 0; + int totalSize = source.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + while (totalSize - offset > 0) { + int size = Math.min(1024 / 8 - 11, totalSize - offset); + out.write(cipher.doFinal(source, offset, size)); + offset += size; + } + out.close(); + return out.toByteArray(); + } + /** * 构建RSA密钥对 * diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java b/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java index 798f9c35..8e261850 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java @@ -42,7 +42,6 @@ import java.util.concurrent.*; * @date 2019-01-07 */ @Async -@SuppressWarnings({"unchecked","all"}) public class ExecutionJob extends QuartzJobBean { /** 该处仅供参考 */ @@ -108,8 +107,10 @@ public class ExecutionJob extends QuartzJobBean { if(quartzJob.getEmail() != null){ EmailService emailService = SpringContextHolder.getBean(EmailService.class); // 邮箱报警 - EmailVo emailVo = taskAlarm(quartzJob, ThrowableUtil.getStackTrace(e)); - emailService.send(emailVo, emailService.find()); + if(StringUtils.isNoneBlank(quartzJob.getEmail())){ + EmailVo emailVo = taskAlarm(quartzJob, ThrowableUtil.getStackTrace(e)); + emailService.send(emailVo, emailService.find()); + } } } finally { quartzLogRepository.save(log); diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCode.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCode.java index 99660787..fefd252b 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCode.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginCode.java @@ -20,8 +20,8 @@ import lombok.Data; /** * 登录验证码配置信息 * - * @author: liaojinlong - * @date: 2020/6/10 18:53 + * @author liaojinlong + * @date 2020/6/10 18:53 */ @Data public class LoginCode { diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java index a609f5c9..ca57213a 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java @@ -39,6 +39,7 @@ public class LoginProperties { private boolean singleLogin = false; private LoginCode loginCode; + /** * 用户登录信息缓存 */ diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java index d7ff9b4a..9646d73b 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/rest/AuthorizationController.java @@ -89,7 +89,10 @@ public class AuthorizationController { new UsernamePasswordAuthenticationToken(authUser.getUsername(), password); Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 + // 生成令牌与第三方系统获取令牌方式 + // UserDetails userDetails = userDetailsService.loadUserByUsername(userInfo.getUsername()); + // Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + // SecurityContextHolder.getContext().setAuthentication(authentication); String token = tokenProvider.createToken(authentication); final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal(); // 保存在线信息 diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/UserRepository.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/UserRepository.java index 99ea5afc..c5c88a8d 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/UserRepository.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/UserRepository.java @@ -81,12 +81,12 @@ public interface UserRepository extends JpaRepository, JpaSpecificat /** * 根据角色中的部门查询 - * @param id / + * @param deptId / * @return / */ @Query(value = "SELECT u.* FROM sys_user u, sys_users_roles r, sys_roles_depts d WHERE " + - "u.user_id = r.user_id AND r.role_id = d.role_id AND r.role_id = ?1 group by u.user_id", nativeQuery = true) - List findByDeptRoleId(Long id); + "u.user_id = r.user_id AND r.role_id = d.role_id AND d.dept_id = ?1 group by u.user_id", nativeQuery = true) + List findByRoleDeptId(Long deptId); /** * 根据菜单查询 diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/UserController.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/UserController.java index 2e885a71..dfff4ecc 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/UserController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/UserController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import me.zhengjie.annotation.Log; import me.zhengjie.config.RsaProperties; +import me.zhengjie.modules.system.domain.Dept; import me.zhengjie.modules.system.service.DataService; import me.zhengjie.modules.system.domain.User; import me.zhengjie.exception.BadRequestException; @@ -79,7 +80,10 @@ public class UserController { public ResponseEntity query(UserQueryCriteria criteria, Pageable pageable){ if (!ObjectUtils.isEmpty(criteria.getDeptId())) { criteria.getDeptIds().add(criteria.getDeptId()); - criteria.getDeptIds().addAll(deptService.getDeptChildren(deptService.findByPid(criteria.getDeptId()))); + // 先查找是否存在子节点 + List data = deptService.findByPid(criteria.getDeptId()); + // 然后把子节点的ID都加入到集合中 + criteria.getDeptIds().addAll(deptService.getDeptChildren(data)); } // 数据权限 List dataScopes = dataService.getDeptIds(userService.findByName(SecurityUtils.getCurrentUsername())); diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DeptServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DeptServiceImpl.java index 12c13fed..657a6074 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DeptServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/DeptServiceImpl.java @@ -58,7 +58,7 @@ public class DeptServiceImpl implements DeptService { @Override public List queryAll(DeptQueryCriteria criteria, Boolean isQuery) throws Exception { - Sort sort = new Sort(Sort.Direction.ASC, "deptSort"); + Sort sort = Sort.by(Sort.Direction.ASC, "deptSort"); String dataScopeType = SecurityUtils.getDataScopeType(); if (isQuery) { if(dataScopeType.equals(DataScopeEnum.ALL.getValue())){ @@ -273,9 +273,9 @@ public class DeptServiceImpl implements DeptService { * @param id / */ public void delCaches(Long id){ - List users = userRepository.findByDeptRoleId(id); + List users = userRepository.findByRoleDeptId(id); // 删除数据权限 redisUtils.delByKeys(CacheKey.DATA_USER, users.stream().map(User::getId).collect(Collectors.toSet())); redisUtils.del(CacheKey.DEPT_ID + id); } -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java index c7e45499..0e54fc92 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java @@ -61,7 +61,7 @@ public class MenuServiceImpl implements MenuService { @Override public List queryAll(MenuQueryCriteria criteria, Boolean isQuery) throws Exception { - Sort sort = new Sort(Sort.Direction.ASC, "menuSort"); + Sort sort = Sort.by(Sort.Direction.ASC, "menuSort"); if(isQuery){ criteria.setPidIsNull(true); List fields = QueryHelp.getAllFields(criteria.getClass(), new ArrayList<>()); diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java index f8690229..e8b41438 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java @@ -66,7 +66,7 @@ public class RoleServiceImpl implements RoleService { @Override public List queryAll() { - Sort sort = new Sort(Sort.Direction.ASC, "level"); + Sort sort = Sort.by(Sort.Direction.ASC, "level"); return roleMapper.toDto(roleRepository.findAll(sort)); } diff --git a/eladmin-system/src/main/resources/config/application-dev.yml b/eladmin-system/src/main/resources/config/application-dev.yml index 174fab24..1dfb1d93 100644 --- a/eladmin-system/src/main/resources/config/application-dev.yml +++ b/eladmin-system/src/main/resources/config/application-dev.yml @@ -12,6 +12,7 @@ redis: port: 6379 password: Chushang831 + # 登录相关配置 login: # 登录缓存 @@ -27,7 +28,7 @@ login: # 验证码高度 width: 111 # 验证码宽度 - heigth: 36 + height: 36 # 内容长度 length: 2 # 字体名称,为空则使用默认字体 diff --git a/eladmin-system/src/main/resources/config/application-prod.yml b/eladmin-system/src/main/resources/config/application-prod.yml index ec25654a..db718d8e 100644 --- a/eladmin-system/src/main/resources/config/application-prod.yml +++ b/eladmin-system/src/main/resources/config/application-prod.yml @@ -21,7 +21,7 @@ login: # 验证码高度 width: 111 # 验证码宽度 - heigth: 36 + height: 36 # 内容长度 length: 2 # 字体名称,为空则使用默认字体,如遇到线上乱码,设置其他字体即可 diff --git a/eladmin-system/src/main/resources/logback.xml b/eladmin-system/src/main/resources/logback.xml index dd9fb5a6..815dffc1 100644 --- a/eladmin-system/src/main/resources/logback.xml +++ b/eladmin-system/src/main/resources/logback.xml @@ -2,7 +2,7 @@ elAdmin - + diff --git a/eladmin-tools/pom.xml b/eladmin-tools/pom.xml index 61b1f6d0..4bbf9f4c 100644 --- a/eladmin-tools/pom.xml +++ b/eladmin-tools/pom.xml @@ -13,7 +13,7 @@ 工具模块 - 1.5.0-b01 + 1.4.7 [7.2.0, 7.2.99] 4.9.153.ALL diff --git a/eladmin-tools/src/main/java/me/zhengjie/service/impl/EmailServiceImpl.java b/eladmin-tools/src/main/java/me/zhengjie/service/impl/EmailServiceImpl.java index a71628e3..c98c76ec 100644 --- a/eladmin-tools/src/main/java/me/zhengjie/service/impl/EmailServiceImpl.java +++ b/eladmin-tools/src/main/java/me/zhengjie/service/impl/EmailServiceImpl.java @@ -69,7 +69,9 @@ public class EmailServiceImpl implements EmailService { } // 封装 MailAccount account = new MailAccount(); - account.setUser(emailConfig.getUser()); + // 设置用户 + String user = emailConfig.getFromUser().split("@")[0]; + account.setUser(user); account.setHost(emailConfig.getHost()); account.setPort(Integer.parseInt(emailConfig.getPort())); account.setAuth(true); diff --git a/pom.xml b/pom.xml index b8fe4a46..0b8a4062 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.0.RELEASE + 2.2.10.RELEASE @@ -33,7 +33,7 @@ 1.16 2.9.2 1.2.70 - 1.1.22 + 1.1.24 2.5.0 1.3.1.Final diff --git a/sql/eladmin.sql b/sql/eladmin.sql index 1cc6ff7e..00234d29 100644 --- a/sql/eladmin.sql +++ b/sql/eladmin.sql @@ -660,7 +660,7 @@ CREATE TABLE `sys_user` ( `is_admin` bit(1) DEFAULT b'0' COMMENT '是否为admin账号', `enabled` bigint(20) DEFAULT NULL COMMENT '状态:1启用、0禁用', `create_by` varchar(255) DEFAULT NULL COMMENT '创建者', - `update_by` varchar(255) DEFAULT NULL COMMENT '更新着', + `update_by` varchar(255) DEFAULT NULL COMMENT '更新者', `pwd_reset_time` datetime DEFAULT NULL COMMENT '修改密码的时间', `create_time` datetime DEFAULT NULL COMMENT '创建日期', `update_time` datetime DEFAULT NULL COMMENT '更新时间', @@ -822,4 +822,4 @@ CREATE TABLE `tool_qiniu_content` ( BEGIN; COMMIT; -SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file +SET FOREIGN_KEY_CHECKS = 1;