pom.xml
@@ -42,6 +42,7 @@ <logback.version>1.2.13</logback.version> <spring-framework.version>5.3.39</spring-framework.version> <fastexcel.version>1.0.0</fastexcel.version> <aliyun-oss.version>3.17.4</aliyun-oss.version> </properties> <!-- 依赖声明 --> @@ -317,7 +318,12 @@ <artifactId>ocr_api20210707</artifactId> <version>3.1.2</version> </dependency> <!--aliyun-oss--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>${aliyun-oss.version}</version> </dependency> </dependencies> ruoyi-api/ruoyi-api-company/src/main/java/com/ruoyi/company/api/domain/query/MgtCompanyQuery.java
@@ -3,12 +3,14 @@ import com.ruoyi.common.core.page.BasePage; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; /** * @author mitao * @date 2025/1/20 */ @Data @EqualsAndHashCode(callSuper = true) @Schema(name = "管理端企业列表查询对象") public class MgtCompanyQuery extends BasePage { private static final long serialVersionUID = 5429160619805017277L; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java
@@ -51,4 +51,21 @@ */ @PutMapping("/user/recordlogin") public R<Boolean> recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** * 根据用户id查询用户信息 * @param userId * @param source * @return */ @GetMapping("/user/get-by-id/{userId}") R<SysUser> getUserById(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** * 更新用户信息 * @param sysUser * @param source */ @PostMapping("/user/update") R<?> updateUser(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java
@@ -42,6 +42,11 @@ { return R.fail("记录用户登录信息失败:" + throwable.getMessage()); } @Override public R<SysUser> getUserById(Long userId, String source) { return R.fail("获取用户信息失败:" + throwable.getMessage()); } }; } } ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -1,46 +1,42 @@ package com.ruoyi.auth.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import com.ruoyi.auth.form.LoginBody; import com.ruoyi.auth.form.MgtPasswordDTO; import com.ruoyi.auth.service.SysLoginService; import com.ruoyi.auth.utils.SmsUtils; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.CaptchaException; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.auth.AuthUtil; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.company.api.RemoteCompanyUserService; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; import com.ruoyi.system.api.model.AppUser; import com.ruoyi.system.api.model.LoginUser; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.auth.form.LoginBody; import com.ruoyi.auth.form.RegisterBody; import com.ruoyi.auth.service.SysLoginService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.auth.AuthUtil; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.model.LoginUser; import java.time.LocalDateTime; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import static com.alibaba.nacos.api.common.Constants.ACCESS_TOKEN; /** * token 控制 * @@ -62,7 +58,7 @@ @Resource private RemoteCompanyUserService remoteCompanyUserService; @Operation(summary = "管理端-登录") @PostMapping("login") public R<?> login(@RequestBody LoginBody form) { @@ -72,6 +68,16 @@ return R.ok(tokenService.createToken(userInfo)); } @Operation(summary = "管理端-修改密码") @GetMapping("/modify-pwd") public R<?> modifyPwd(@Valid @RequestBody MgtPasswordDTO dto) { try { sysLoginService.modifyPwd(dto); return R.ok(); } catch (ServiceException e) { return R.fail(e.getMessage()); } } @DeleteMapping("logout") public R<?> logout(HttpServletRequest request) { ruoyi-auth/src/main/java/com/ruoyi/auth/form/MgtPasswordDTO.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.auth.form; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import javax.validation.constraints.NotBlank; /** * @author mitao * @date 2025/1/21 */ @Data @Schema(name = "修改密码数据传输对象") public class MgtPasswordDTO { @NotBlank(message = "原密码不能为空") @Schema(description = "原密码", example = "1") private String oldPassword; @NotBlank(message = "新密码不能为空") @Schema(description = "新密码",example = "12345678") private String newPassword; } ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -1,23 +1,13 @@ package com.ruoyi.auth.service; import com.ruoyi.common.core.exception.CaptchaException; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.company.api.RemoteCompanyService; import com.ruoyi.company.api.RemoteCompanyUserService; import com.ruoyi.company.api.domain.Company; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; import lombok.RequiredArgsConstructor; import org.jacoco.agent.rt.internal_43f5073.core.internal.flow.IFrame; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import com.ruoyi.auth.form.MgtPasswordDTO; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.UserConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.enums.UserStatus; import com.ruoyi.common.core.exception.CaptchaException; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.utils.DateUtils; @@ -25,13 +15,21 @@ import com.ruoyi.common.core.utils.ip.IpUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.company.api.RemoteCompanyService; import com.ruoyi.company.api.RemoteCompanyUserService; import com.ruoyi.company.api.domain.Company; import com.ruoyi.company.api.domain.User; import com.ruoyi.company.api.model.RegisterUser; import com.ruoyi.system.api.RemoteUserService; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.model.LoginUser; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; /** * 登录校验方法 @@ -256,4 +254,20 @@ return false; } /** * 管理端-修改密码 * @param dto */ public void modifyPwd(MgtPasswordDTO dto) { Long userId = SecurityUtils.getUserId(); SysUser sysUser = remoteUserService.getUserById(userId, SecurityConstants.INNER).getData(); if (Objects.isNull(sysUser)){ throw new ServiceException("用户不存在"); } if (!SecurityUtils.matchesPassword(SecurityUtils.encryptPassword(dto.getOldPassword()), sysUser.getPassword())){ throw new ServiceException("原密码错误"); } sysUser.setPassword(SecurityUtils.encryptPassword(dto.getNewPassword())); remoteUserService.updateUser(sysUser,SecurityConstants.INNER); } } ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SpringDocConfig.java
@@ -52,7 +52,7 @@ @Autowired private DiscoveryClient discoveryClient; private final static String[] EXCLUDE_ROUTES = new String[] { "ruoyi-gateway", "ruoyi-auth", "ruoyi-file", "ruoyi-monitor" }; private final static String[] EXCLUDE_ROUTES = new String[] { "ruoyi-gateway", /*"ruoyi-auth",*/ "ruoyi-file", "ruoyi-monitor" }; public SwaggerDocRegister(SwaggerUiConfigProperties swaggerUiConfigProperties, DiscoveryClient discoveryClient) { ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/controller/management/MgtCompanyController.java
@@ -30,7 +30,7 @@ @Validated @RestController @RequestMapping("/mgt/company") @Tag(name = "管理端企业列表相关接口") @Tag(name = "管理端-企业列表相关接口") @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class MgtCompanyController { private final CompanyService companyService; ruoyi-modules/ruoyi-file/pom.xml
@@ -65,7 +65,11 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-system</artifactId> </dependency> <!--aliyun-oss--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> </dependency> </dependencies> <build> ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/OssConfig.java
New file @@ -0,0 +1,59 @@ package com.ruoyi.file.config; import com.alibaba.fastjson2.JSONObject; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; /** * 存储-配置 * * @author mitao */ @ConfigurationProperties(prefix = "oss") @Component @Slf4j @Data public class OssConfig { private String folder = "dev"; private String accessKeyId; private String accessKeySecret; private String uploadEndpoint; private String downloadEndpoint; private String bucketName; public static String FOLDER; public static String ACCESS_KEY_ID; public static String ACCESS_KEY_SECRET; public static String UPLOAD_ENDPOINT; public static String DOWNLOAD_ENDPOINT; public static String BUCKET_NAME; @PostConstruct public void init() { log.debug("OSS配置信息:" + JSONObject.toJSONString(this)); FOLDER = folder; ACCESS_KEY_ID = accessKeyId; ACCESS_KEY_SECRET = accessKeySecret; UPLOAD_ENDPOINT = uploadEndpoint; DOWNLOAD_ENDPOINT = downloadEndpoint; BUCKET_NAME = bucketName; } public String getStoreFolder() { return getFolder(); } } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java
@@ -1,15 +1,22 @@ package com.ruoyi.file.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.file.FileUtils; import com.ruoyi.file.service.ISysFileService; import com.ruoyi.file.service.OssService; import com.ruoyi.system.api.domain.SysFile; import io.swagger.v3.oas.annotations.Operation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.file.FileUtils; import com.ruoyi.file.service.ISysFileService; import com.ruoyi.system.api.domain.SysFile; import java.io.IOException; import java.util.Objects; /** * 文件请求处理 @@ -23,6 +30,29 @@ @Autowired private ISysFileService sysFileService; @Autowired private OssService ossService; /** * 上传文件 * * @param file * @return */ @Operation(summary = "上传文件") @PostMapping("/oss/upload") public R<String> uploadOss(@RequestPart("file") MultipartFile file) { if (Objects.isNull(file)) { throw new ServiceException("文件不能为空"); } String fileUrl; try { fileUrl = ossService.uploadFile(file); } catch (IOException e) { throw new RuntimeException(e); } return R.ok(fileUrl); } /** * 文件上传请求 ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/OssService.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.file.service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; /** * @author mitao * @date 2024/12/23 */ public interface OssService { /** * 文件上传 * * @param file * @return */ String uploadFile(MultipartFile file) throws IOException; /** * 文件上传,指定上传路径 * * @param storagePath * @param file * @return */ String upload(String storagePath, MultipartFile file) throws IOException; } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/OssServiceImpl.java
New file @@ -0,0 +1,103 @@ package com.ruoyi.file.service; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.file.config.OssConfig; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.Objects; import java.util.UUID; /** * @author mitao * @date 2024/12/23 */ @Service public class OssServiceImpl implements OssService { /** * 文件上传 * * @param file * @return */ @Override public String uploadFile(MultipartFile file) throws IOException { return upload(OssConfig.FOLDER, file); } /** * 文件上传,指定上传路径 * * @param storagePath * @param file * @return */ @Override public String upload(String storagePath, MultipartFile file) throws IOException { CredentialsProvider credentialsProvider = new DefaultCredentialProvider(OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET); String region = "cn-chengdu"; // 创建OSSClient实例。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(OssConfig.UPLOAD_ENDPOINT) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); InputStream inputStream = file.getInputStream(); String originFileName = file.getOriginalFilename(); String fileExt = Objects.requireNonNull(originFileName).substring(originFileName.lastIndexOf(".") + 1); String fileName = originFileName.substring(0, originFileName.lastIndexOf(".")); // 设置文件名 String filePathName = generateRelativeStoragePath(storagePath, fileExt, fileName); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(OssConfig.BUCKET_NAME, filePathName, inputStream); // 创建PutObject请求。 PutObjectResult result = ossClient.putObject(putObjectRequest); return OssConfig.DOWNLOAD_ENDPOINT + filePathName; } /** * <pre> * 获取存储的相对路径 * 规则path + / + yyyyMMddHH + uuid * </pre> * * @param storagePath * @return */ private static String generateRelativeStoragePath(String storagePath, String fileType, String fileName) { String time = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); String uuid = UUID.randomUUID().toString(); StringBuilder sb = new StringBuilder(); if (StringUtils.isNotBlank(storagePath)) { sb.append(storagePath).append("/"); } if (fileName == null) { sb.append(time).append(uuid); } else { sb.append(fileName).append(time); } if (StringUtils.isNotBlank(fileType)) { sb.append(".").append(fileType); } return sb.toString(); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -1,22 +1,5 @@ package com.ruoyi.system.controller; import java.io.IOException; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.poi.ExcelUtil; @@ -39,6 +22,24 @@ import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 用户信息 @@ -348,4 +349,24 @@ { return success(deptService.selectDeptTreeList(dept)); } /** * 根据用户id获取用户信息 * @param userId * @return */ @InnerAuth @GetMapping("/get-by-id/{userId}") R<SysUser> getUserById(@PathVariable("userId") Long userId){ return R.ok(userService.selectUserById(userId)); } /** * 更新用户信息 * @param sysUser */ @InnerAuth @PostMapping("/update") R<?> updateUser(@RequestBody SysUser sysUser){ return R.ok(userService.resetPwd(sysUser)); } }