diff --git a/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/RemoteFileService.java index 50c35ecc..2a9d037c 100644 --- a/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/RemoteFileService.java +++ b/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/RemoteFileService.java @@ -1,7 +1,6 @@ package com.ruoyi.file.api; import com.ruoyi.file.api.domain.SysFile; -import org.springframework.web.multipart.MultipartFile; /** * 文件服务 @@ -16,5 +15,5 @@ public interface RemoteFileService { * @param file 文件信息 * @return 结果 */ - SysFile upload(MultipartFile file); + SysFile upload(String name, String originalFilename, String contentType, byte[] file); } diff --git a/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/domain/SysFile.java b/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/domain/SysFile.java index ee5c8d6f..072aff6c 100644 --- a/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/domain/SysFile.java +++ b/ruoyi-api/ruoyi-api-file/src/main/java/com/ruoyi/file/api/domain/SysFile.java @@ -4,6 +4,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import java.io.Serializable; + /** * 文件信息 * @@ -12,7 +14,10 @@ import lombok.experimental.Accessors; @Data @NoArgsConstructor @Accessors(chain = true) -public class SysFile { +public class SysFile implements Serializable { + + private static final long serialVersionUID = 1L; + /** * 文件名称 */ diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/dubbo/RemoteFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/dubbo/RemoteFileServiceImpl.java index 1f733cd6..be4c940b 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/dubbo/RemoteFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/dubbo/RemoteFileServiceImpl.java @@ -11,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.*; + /** * 文件请求处理 * @@ -28,10 +30,11 @@ public class RemoteFileServiceImpl implements RemoteFileService { * 文件上传请求 */ @Override - public SysFile upload(MultipartFile file) { + public SysFile upload(String name, String originalFilename, String contentType, byte[] file) { + MultipartFile multipartFile = getMultipartFile(name, originalFilename, contentType, file); try { // 上传并返回访问地址 - String url = sysFileService.uploadFile(file); + String url = sysFileService.uploadFile(multipartFile); SysFile sysFile = new SysFile(); sysFile.setName(FileUtils.getName(url)); sysFile.setUrl(url); @@ -41,4 +44,56 @@ public class RemoteFileServiceImpl implements RemoteFileService { throw new ServiceException("上传文件失败"); } } -} \ No newline at end of file + + private MultipartFile getMultipartFile(String name, String originalFilename, String contentType, byte[] file) { + return new MultipartFile() { + @Override + public String getName() { + return name; + } + + @Override + public String getOriginalFilename() { + return originalFilename; + } + + @Override + public String getContentType() { + return contentType; + } + + @Override + public boolean isEmpty() { + return getSize() == 0; + } + + @Override + public long getSize() { + return file.length; + } + + @Override + public byte[] getBytes() throws IOException { + return file; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(file); + } + + @Override + public void transferTo(File dest) throws IOException, IllegalStateException { + OutputStream outputStream = null; + try { + outputStream = new FileOutputStream(dest); + outputStream.write(file); + } finally { + if (outputStream != null) { + outputStream.close(); + } + } + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java index 4f7a7c27..6179a6aa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java @@ -1,132 +1,132 @@ -package com.ruoyi.system.controller; - -import com.ruoyi.common.core.constant.UserConstants; -import com.ruoyi.common.core.utils.StringUtils; -import com.ruoyi.common.core.web.controller.BaseController; -import com.ruoyi.common.core.web.domain.AjaxResult; -import com.ruoyi.common.log.annotation.Log; -import com.ruoyi.common.log.enums.BusinessType; -import com.ruoyi.common.security.service.TokenService; -import com.ruoyi.common.security.utils.SecurityUtils; -import com.ruoyi.file.api.RemoteFileService; -import com.ruoyi.file.api.domain.SysFile; -import com.ruoyi.system.api.domain.SysUser; -import com.ruoyi.system.api.model.LoginUser; -import com.ruoyi.system.service.ISysUserService; -import lombok.RequiredArgsConstructor; -import org.apache.dubbo.config.annotation.DubboReference; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -/** - * 个人信息 业务处理 - * - * @author ruoyi - */ -@RequiredArgsConstructor(onConstructor_ = @Autowired) -@RestController -@RequestMapping("/user/profile") -public class SysProfileController extends BaseController { - - private final ISysUserService userService; - private final TokenService tokenService; - - @DubboReference - private RemoteFileService remoteFileService; - - /** - * 个人信息 - */ - @GetMapping - public AjaxResult profile() { - String username = SecurityUtils.getUsername(); - SysUser user = userService.selectUserByUserName(username); - AjaxResult ajax = AjaxResult.success(user); - ajax.put("roleGroup", userService.selectUserRoleGroup(username)); - ajax.put("postGroup", userService.selectUserPostGroup(username)); - return ajax; - } - - /** - * 修改用户 - */ - @Log(title = "个人信息", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult updateProfile(@RequestBody SysUser user) { - LoginUser loginUser = SecurityUtils.getLoginUser(); - SysUser sysUser = loginUser.getSysUser(); - user.setUserName(sysUser.getUserName()); - if (StringUtils.isNotEmpty(user.getPhonenumber()) - && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); - } else if (StringUtils.isNotEmpty(user.getEmail()) - && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); - } - user.setUserId(sysUser.getUserId()); - user.setPassword(null); - if (userService.updateUserProfile(user) > 0) { - // 更新缓存用户信息 - loginUser.getSysUser().setNickName(user.getNickName()); - loginUser.getSysUser().setPhonenumber(user.getPhonenumber()); - loginUser.getSysUser().setEmail(user.getEmail()); - loginUser.getSysUser().setSex(user.getSex()); - tokenService.setLoginUser(loginUser); - return AjaxResult.success(); - } - return AjaxResult.error("修改个人信息异常,请联系管理员"); - } - - /** - * 重置密码 - */ - @Log(title = "个人信息", businessType = BusinessType.UPDATE) - @PutMapping("/updatePwd") - public AjaxResult updatePwd(String oldPassword, String newPassword) { - String username = SecurityUtils.getUsername(); - SysUser user = userService.selectUserByUserName(username); - String password = user.getPassword(); - if (!SecurityUtils.matchesPassword(oldPassword, password)) { - return AjaxResult.error("修改密码失败,旧密码错误"); - } - if (SecurityUtils.matchesPassword(newPassword, password)) { - return AjaxResult.error("新密码不能与旧密码相同"); - } - if (userService.resetUserPwd(username, SecurityUtils.encryptPassword(newPassword)) > 0) { - // 更新缓存用户密码 - LoginUser loginUser = SecurityUtils.getLoginUser(); - loginUser.getSysUser().setPassword(SecurityUtils.encryptPassword(newPassword)); - tokenService.setLoginUser(loginUser); - return AjaxResult.success(); - } - return AjaxResult.error("修改密码异常,请联系管理员"); - } - - /** - * 头像上传 - */ - @Log(title = "用户头像", businessType = BusinessType.UPDATE) - @PostMapping("/avatar") - public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException { - if (!file.isEmpty()) { - LoginUser loginUser = SecurityUtils.getLoginUser(); - SysFile sysFile = remoteFileService.upload(file); - if (StringUtils.isNull(sysFile)) { - return AjaxResult.error("文件服务异常,请联系管理员"); - } - String url = sysFile.getUrl(); - if (userService.updateUserAvatar(loginUser.getUsername(), url)) { - AjaxResult ajax = AjaxResult.success(); - ajax.put("imgUrl", url); - // 更新缓存用户头像 - loginUser.getSysUser().setAvatar(url); - tokenService.setLoginUser(loginUser); - return ajax; - } - } - return AjaxResult.error("上传图片异常,请联系管理员"); - } -} +package com.ruoyi.system.controller; + +import com.ruoyi.common.core.constant.UserConstants; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.file.api.RemoteFileService; +import com.ruoyi.file.api.domain.SysFile; +import com.ruoyi.system.api.domain.SysUser; +import com.ruoyi.system.api.model.LoginUser; +import com.ruoyi.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * 个人信息 业务处理 + * + * @author ruoyi + */ +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RestController +@RequestMapping("/user/profile") +public class SysProfileController extends BaseController { + + private final ISysUserService userService; + private final TokenService tokenService; + + @DubboReference + private RemoteFileService remoteFileService; + + /** + * 个人信息 + */ + @GetMapping + public AjaxResult profile() { + String username = SecurityUtils.getUsername(); + SysUser user = userService.selectUserByUserName(username); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(username)); + ajax.put("postGroup", userService.selectUserPostGroup(username)); + return ajax; + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser sysUser = loginUser.getSysUser(); + user.setUserName(sysUser.getUserName()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUserId(sysUser.getUserId()); + user.setPassword(null); + if (userService.updateUserProfile(user) > 0) { + // 更新缓存用户信息 + loginUser.getSysUser().setNickName(user.getNickName()); + loginUser.getSysUser().setPhonenumber(user.getPhonenumber()); + loginUser.getSysUser().setEmail(user.getEmail()); + loginUser.getSysUser().setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) { + String username = SecurityUtils.getUsername(); + SysUser user = userService.selectUserByUserName(username); + String password = user.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) { + return AjaxResult.error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) { + return AjaxResult.error("新密码不能与旧密码相同"); + } + if (userService.resetUserPwd(username, SecurityUtils.encryptPassword(newPassword)) > 0) { + // 更新缓存用户密码 + LoginUser loginUser = SecurityUtils.getLoginUser(); + loginUser.getSysUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException { + if (!file.isEmpty()) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysFile sysFile = remoteFileService.upload(file.getName(), file.getOriginalFilename(), file.getContentType(), file.getBytes()); + if (StringUtils.isNull(sysFile)) { + return AjaxResult.error("文件服务异常,请联系管理员"); + } + String url = sysFile.getUrl(); + if (userService.updateUserAvatar(loginUser.getUsername(), url)) { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", url); + // 更新缓存用户头像 + loginUser.getSysUser().setAvatar(url); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return AjaxResult.error("上传图片异常,请联系管理员"); + } +}