From c06d6e53f60f1ff0719d3ef80adab4a36adf8981 Mon Sep 17 00:00:00 2001 From: 宋天 <2982176321@qq.com> Date: Tue, 19 Oct 2021 22:16:42 +0800 Subject: [PATCH] [update] 新增修改昵称,修改头像,查询昵称与头像接口 --- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java | 8 ++++---- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java | 35 ----------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java | 2 +- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java | 25 ------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java | 3 --- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java | 12 ------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java | 22 ---------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java | 16 ---------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java | 46 ---------------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java | 72 ------------------------------------------------------------------------ yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java | 4 ++-- yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java | 16 ++++++++-------- yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java | 4 ++-- yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java | 14 ++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFilePageReqVO.java | 35 +++++++++++++++++++++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFileRespVO.java | 22 ++++++++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java | 12 ++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java | 22 ++++++++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java | 16 ++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/controller/user/vo/SysUserCoreProfileRespVo.java | 20 ++++++++++++++++++++ yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java | 3 +++ yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http | 8 ++++++++ yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java | 42 +++++++++++++++++++++++++++++++++++++++--- yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java | 5 +++++ yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java | 25 +++++++++++++++++++++++++ yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 29 files changed, 419 insertions(+), 273 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFilePageReqVO.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFileRespVO.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java create mode 100644 yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/controller/user/vo/SysUserCoreProfileRespVo.java diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java index 6b2c743..2fcbbd0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java @@ -2,12 +2,12 @@ package cn.iocoder.yudao.adminserver.modules.infra.controller.file; import cn.hutool.core.io.IoUtil; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFileRespVO; import cn.iocoder.yudao.adminserver.modules.infra.convert.file.InfFileConvert; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -35,7 +35,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; public class InfFileController { @Resource - private InfFileService fileService; + private InfFileCoreService fileService; @PostMapping("/upload") @ApiOperation("上传文件") diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java deleted file mode 100644 index 152466a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFilePageReqVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel("文件分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class InfFilePageReqVO extends PageParam { - - @ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配") - private String id; - - @ApiModelProperty(value = "文件类型", example = "jpg", notes = "模糊匹配") - private String type; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "开始创建时间") - private Date beginCreateTime; - - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - @ApiModelProperty(value = "结束创建时间") - private Date endCreateTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java deleted file mode 100644 index 2388d7f..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/vo/InfFileRespVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大") -@Data -public class InfFileRespVO { - - @ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg") - private String id; - - @ApiModelProperty(value = "文件类型", required = true, example = "jpg") - private String type; - - @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java index d39452f..78b6652 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.infra.convert.file; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFileRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java deleted file mode 100644 index 022f90a..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file; - -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface InfFileMapper extends BaseMapperX { - - default Integer selectCountById(String id) { - return selectCount("id", id); - } - - default PageResult selectPage(InfFilePageReqVO reqVO) { - return selectPage(reqVO, new QueryWrapperX() - .likeIfPresent("id", reqVO.getId()) - .likeIfPresent("type", reqVO.getType()) - .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) - .orderByDesc("create_time")); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java index b53ff8c..98155e7 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/enums/InfErrorCodeConstants.java @@ -27,7 +27,4 @@ public interface InfErrorCodeConstants { ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在"); ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理"); - // ========== 文件 1001003000 ========== - ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003000, "文件不存在"); - } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java deleted file mode 100644 index e71377e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.framework.file.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * 文件 配置类 - */ -@Configuration -@EnableConfigurationProperties(FileProperties.class) -public class FileConfiguration { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java deleted file mode 100644 index db1a6b7..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/config/FileProperties.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.framework.file.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotNull; - -@ConfigurationProperties(prefix = "yudao.file") -@Validated -@Data -public class FileProperties { - - /** - * 对应 InfFileController 的 getFile 方法 - */ - @NotNull(message = "基础文件路径不能为空") - private String basePath; - - // TODO 七牛、等等 - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java deleted file mode 100644 index a69b53e..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/framework/file/package-info.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * 文件的存储,推荐使用七牛、阿里云、华为云、腾讯云等文件服务 - * - * 在不采用云服务的情况下,我们有几种技术选型: - * 方案 1. 使用自建的文件服务,例如说 minIO、FastDFS 等等 - * 方案 2. 使用服务器的文件系统存储 - * 方案 3. 使用数据库进行存储 - * - * 如果考虑额外在搭建服务,推荐方案 1。 - * 对于方案 2 来说,如果要实现文件存储的高可用,需要多台服务器之间做实时同步,可以基于 rsync + inotify 来做 - * 对于方案 3 的话,实现起来最简单,但是数据库本身不适合存储海量的文件 - * - * 综合考虑,暂时使用方案 3 的方式,比较适合这样一个 all in one 的项目。 - * 随着文件的量级大了之后,还是推荐采用云服务。 - */ -package cn.iocoder.yudao.adminserver.modules.infra.framework.file; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java deleted file mode 100644 index e19e3ec..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.file; - -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; - -/** - * 文件 Service 接口 - * - * @author 芋道源码 - */ -public interface InfFileService { - - /** - * 保存文件,并返回文件的访问路径 - * - * @param path 文件路径 - * @param content 文件内容 - * @return 文件路径 - */ - String createFile(String path, byte[] content); - - /** - * 删除文件 - * - * @param id 编号 - */ - void deleteFile(String id); - - /** - * 获得文件 - * - * @param path 文件路径 - * @return 文件 - */ - InfFileDO getFile(String path); - - /** - * 获得文件分页 - * - * @param pageReqVO 分页查询 - * @return 文件分页 - */ - PageResult getFilePage(InfFilePageReqVO pageReqVO); - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java deleted file mode 100644 index 0436b80..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.iocoder.yudao.adminserver.modules.infra.service.file.impl; - -import cn.hutool.core.io.FileTypeUtil; -import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.io.ByteArrayInputStream; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; - -/** - * 文件 Service 实现类 - * - * @author 芋道源码 - */ -@Service -public class InfFileServiceImpl implements InfFileService { - - @Resource - private InfFileMapper fileMapper; - - @Resource - private FileProperties fileProperties; - - @Override - public String createFile(String path, byte[] content) { - if (fileMapper.selectCountById(path) > 0) { - throw exception(FILE_PATH_EXISTS); - } - // 保存到数据库 - InfFileDO file = new InfFileDO(); - file.setId(path); - file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content))); - file.setContent(content); - fileMapper.insert(file); - // 拼接路径返回 - return fileProperties.getBasePath() + path; - } - - @Override - public void deleteFile(String id) { - // 校验存在 - this.validateFileExists(id); - // 更新 - fileMapper.deleteById(id); - } - - private void validateFileExists(String id) { - if (fileMapper.selectById(id) == null) { - throw exception(FILE_NOT_EXISTS); - } - } - - @Override - public InfFileDO getFile(String path) { - return fileMapper.selectById(path); - } - - @Override - public PageResult getFilePage(InfFilePageReqVO pageReqVO) { - return fileMapper.selectPage(pageReqVO); - } - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java index af7705b..8901ca0 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; @@ -16,6 +15,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; +import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; @@ -59,7 +59,7 @@ public class SysUserServiceImpl implements SysUserService { @Resource private PasswordEncoder passwordEncoder; @Resource - private InfFileService fileService; + private InfFileCoreService fileService; @Override public Long createUser(SysUserCreateReqVO reqVO) { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java index 4849d49..7c9cafc 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java @@ -3,11 +3,11 @@ package cn.iocoder.yudao.adminserver.modules.infra.service.file; import cn.hutool.core.io.resource.ResourceUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file.InfFileCoreMapper; +import cn.iocoder.yudao.coreservice.modules.infra.service.file.impl.InfFileCoreServiceImpl; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties; -import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO; -import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.impl.InfFileServiceImpl; +import cn.iocoder.yudao.coreservice.modules.infra.framework.file.config.FileProperties; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFilePageReqVO; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -15,8 +15,8 @@ import org.springframework.context.annotation.Import; import javax.annotation.Resource; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.FILE_NOT_EXISTS; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; -import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS; import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; @@ -24,17 +24,17 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; import static org.junit.jupiter.api.Assertions.*; -@Import({InfFileServiceImpl.class, FileProperties.class}) +@Import({InfFileCoreServiceImpl.class, FileProperties.class}) public class InfFileServiceTest extends BaseDbUnitTest { @Resource - private InfFileServiceImpl fileService; + private InfFileCoreServiceImpl fileService; @MockBean private FileProperties fileProperties; @Resource - private InfFileMapper fileMapper; + private InfFileCoreMapper fileMapper; @Test public void testCreateFile_success() { diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java index e20e727..70751ee 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.adminserver.modules.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.iocoder.yudao.adminserver.BaseDbUnitTest; -import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO; import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*; @@ -14,6 +13,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService; import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl; +import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -69,7 +69,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest { @MockBean private PasswordEncoder passwordEncoder; @MockBean - private InfFileService fileService; + private InfFileCoreService fileService; @Test public void testCreatUser_success() { diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java index 180dc2d..43703c5 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java @@ -1,10 +1,24 @@ package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import org.apache.ibatis.annotations.Mapper; @Mapper public interface InfFileCoreMapper extends BaseMapperX { + default Integer selectCountById(String id) { + return selectCount("id", id); + } + + default PageResult selectPage(InfFilePageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("id", reqVO.getId()) + .likeIfPresent("type", reqVO.getType()) + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) + .orderByDesc("create_time")); + } } diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFilePageReqVO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFilePageReqVO.java new file mode 100644 index 0000000..a6124f7 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFilePageReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.coreservice.modules.infra.file.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("文件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InfFilePageReqVO extends PageParam { + + @ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配") + private String id; + + @ApiModelProperty(value = "文件类型", example = "jpg", notes = "模糊匹配") + private String type; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始创建时间") + private Date beginCreateTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束创建时间") + private Date endCreateTime; + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFileRespVO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFileRespVO.java new file mode 100644 index 0000000..57dd5b1 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/file/vo/InfFileRespVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.coreservice.modules.infra.file.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大") +@Data +public class InfFileRespVO { + + @ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg") + private String id; + + @ApiModelProperty(value = "文件类型", required = true, example = "jpg") + private String type; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java new file mode 100644 index 0000000..a10c7a7 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileConfiguration.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.coreservice.modules.infra.framework.file.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 文件 配置类 + */ +@Configuration +@EnableConfigurationProperties(FileProperties.class) +public class FileConfiguration { +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java new file mode 100644 index 0000000..0d8ed7c --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/config/FileProperties.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.coreservice.modules.infra.framework.file.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; + +@ConfigurationProperties(prefix = "yudao.file") +@Validated +@Data +public class FileProperties { + + /** + * 对应 InfFileController 的 getFile 方法 + */ + @NotNull(message = "基础文件路径不能为空") + private String basePath; + + // TODO 七牛、等等 + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java new file mode 100644 index 0000000..2c2798e --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/framework/file/package-info.java @@ -0,0 +1,16 @@ +/** + * 文件的存储,推荐使用七牛、阿里云、华为云、腾讯云等文件服务 + * + * 在不采用云服务的情况下,我们有几种技术选型: + * 方案 1. 使用自建的文件服务,例如说 minIO、FastDFS 等等 + * 方案 2. 使用服务器的文件系统存储 + * 方案 3. 使用数据库进行存储 + * + * 如果考虑额外在搭建服务,推荐方案 1。 + * 对于方案 2 来说,如果要实现文件存储的高可用,需要多台服务器之间做实时同步,可以基于 rsync + inotify 来做 + * 对于方案 3 的话,实现起来最简单,但是数据库本身不适合存储海量的文件 + * + * 综合考虑,暂时使用方案 3 的方式,比较适合这样一个 all in one 的项目。 + * 随着文件的量级大了之后,还是推荐采用云服务。 + */ +package cn.iocoder.yudao.coreservice.modules.infra.framework.file; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java new file mode 100644 index 0000000..f6f251a --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/InfFileCoreService.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.coreservice.modules.infra.service.file; + +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +/** + * @Class:ruoyi-vue-pro.cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService + * @Descript: 文件 core Service 接口 + * @Author:宋天 + * @Date:2021/10/19 + */ +public interface InfFileCoreService { + + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String path, byte[] content); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(String id); + + /** + * 获得文件 + * + * @param path 文件路径 + * @return 文件 + */ + InfFileDO getFile(String path); + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(InfFilePageReqVO pageReqVO); +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java new file mode 100644 index 0000000..850701f --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/file/impl/InfFileCoreServiceImpl.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.coreservice.modules.infra.service.file.impl; + +import cn.hutool.core.io.FileTypeUtil; +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO; +import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file.InfFileCoreMapper; +import cn.iocoder.yudao.coreservice.modules.infra.file.vo.InfFilePageReqVO; +import cn.iocoder.yudao.coreservice.modules.infra.framework.file.config.FileProperties; +import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; + +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.FILE_NOT_EXISTS; +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * @Class:ruoyi-vue-pro.cn.iocoder.yudao.coreservice.modules.infra.service.file.impl.InfFileCoreServiceImpl + * @Descript: core service 文件实现类 + * @Author:宋天 + * @Date:2021/10/19 + */ +@Service +public class InfFileCoreServiceImpl implements InfFileCoreService { + + @Resource + private InfFileCoreMapper fileMapper; + + @Resource + private FileProperties fileProperties; + + @Override + public String createFile(String path, byte[] content) { + if (fileMapper.selectCountById(path) > 0) { + throw exception(FILE_PATH_EXISTS); + } + // 保存到数据库 + InfFileDO file = new InfFileDO(); + file.setId(path); + file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content))); + file.setContent(content); + fileMapper.insert(file); + // 拼接路径返回 + return fileProperties.getBasePath() + path; + } + + @Override + public void deleteFile(String id) { + // 校验存在 + this.validateFileExists(id); + // 更新 + fileMapper.deleteById(id); + } + + private void validateFileExists(String id) { + if (fileMapper.selectById(id) == null) { + throw exception(FILE_NOT_EXISTS); + } + } + + @Override + public InfFileDO getFile(String path) { + return fileMapper.selectById(path); + } + + @Override + public PageResult getFilePage(InfFilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/controller/user/vo/SysUserCoreProfileRespVo.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/controller/user/vo/SysUserCoreProfileRespVo.java new file mode 100644 index 0000000..50c9a68 --- /dev/null +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/controller/user/vo/SysUserCoreProfileRespVo.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.coreservice.modules.system.controller.user.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("用户个人中心信息 Response VO") +public class SysUserCoreProfileRespVo { + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + private String nickName; + + @ApiModelProperty(value = "用户头像", required = true, example = "/infra/file/get/35a12e57-4297-4faa-bf7d-7ed2f211c952") + private String avatar; +} diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java index 3c1fc87..6024939 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java @@ -14,4 +14,7 @@ public interface SysErrorCodeConstants { ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1006000001, "模板参数({})缺失"); ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1006000000, "短信模板不存在"); + // 文件相关 + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1006001000, "文件路径已存在"); + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1006001002, "文件不存在"); } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http index 72cf861..eb3d8fe 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http +++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http @@ -1,3 +1,11 @@ ### 请求 /system/user/profile/get 接口 => 没有权限 GET {{userServerUrl}}/system/user/profile/get Authorization: Bearer test245 + +### 请求 /system/user/profile/revise-nickname 接口 成功 +PUT http://localhost:28080/api/system/user/profile/revise-nickname?nickName=yunai111 +Authorization: Bearer test245 + +### 请求 /system/user/profile/get-user-info 接口 成功 +GET http://localhost:28080/api/system/user/profile/get-user-info?id=245 +Authorization: Bearer test245 \ No newline at end of file diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java index 4b66b4e..a1e0f5a 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java +++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java @@ -1,14 +1,24 @@ package cn.iocoder.yudao.userserver.modules.member.controller.user; +import cn.iocoder.yudao.coreservice.modules.system.controller.user.vo.SysUserCoreProfileRespVo; +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; +import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +import java.io.IOException; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.FILE_IS_EMPTY; @Api(tags = "用户个人中心") @RestController @@ -17,6 +27,9 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j public class SysUserProfileController { + @Resource + private MbrUserService userService; + @GetMapping("/get") @ApiOperation("获得登录用户信息") @PreAuthenticated @@ -24,4 +37,27 @@ public class SysUserProfileController { return null; } + @PutMapping("/revise-nickname") + @ApiOperation("修改用户昵称") + public CommonResult reviseNickname(@RequestParam("nickName") String nickName) { + userService.reviseNickname(getLoginUserId(), nickName); + return success(true); + } + + @PutMapping("/revise-avatar") + @ApiOperation("修改用户头像") + public CommonResult reviseAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { + if (file.isEmpty()) { + throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); + } + String avatar = userService.reviseAvatar(getLoginUserId(), file.getInputStream()); + return success(avatar); + } + + @GetMapping("/get-user-info") + @ApiOperation("获取用户头像与昵称") + public CommonResult getUserInfo(@RequestParam("id") Long id) { + return success(userService.getUserInfo(id)); + } } + diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java index 265d1d4..5d8507d 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java +++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java @@ -9,4 +9,9 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; */ public interface MbrErrorCodeConstants { + // 用户相关 + ErrorCode USER_NOT_EXISTS = new ErrorCode(1004000000, "用户不存在"); + + // 文件相关 + ErrorCode FILE_IS_EMPTY = new ErrorCode(1004000000, "用户不存在"); } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java index 2d54668..bb81d37 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java +++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java @@ -1,8 +1,11 @@ package cn.iocoder.yudao.userserver.modules.member.service.user; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; +import cn.iocoder.yudao.coreservice.modules.system.controller.user.vo.SysUserCoreProfileRespVo; import cn.iocoder.yudao.framework.common.validation.Mobile; +import java.io.InputStream; + /** * 前台用户 Service 接口 * @@ -44,4 +47,26 @@ public interface MbrUserService { */ MbrUserDO getUser(Long id); + /** + * 修改用户昵称 + * @param loginUserId 登录用户id + * @param nickName 用户新昵称 + */ + void reviseNickname(Long loginUserId, String nickName); + + /** + * 修改用户头像 + * @param loginUserId 登录用户id + * @param inputStream 头像文件 + * @return 头像url + */ + String reviseAvatar(Long loginUserId, InputStream inputStream); + + /** + * 根据用户id,获取用户头像与昵称 + * @param loginUserId 登录用户id + * @return 用户响应实体类 + */ + SysUserCoreProfileRespVo getUserInfo(Long loginUserId); + } diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java index 71fb9dd..f10c03e 100644 --- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java +++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java @@ -1,18 +1,27 @@ package cn.iocoder.yudao.userserver.modules.member.service.user.impl; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; +import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO; +import cn.iocoder.yudao.coreservice.modules.system.controller.user.vo.SysUserCoreProfileRespVo; +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper; import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; +import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.validation.Valid; +import java.io.InputStream; import java.util.Date; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.USER_NOT_EXISTS; + /** * User Service 实现类 * @@ -27,6 +36,9 @@ public class MbrUserServiceImpl implements MbrUserService { private MbrUserMapper userMapper; @Resource + private InfFileCoreService fileCoreService; + + @Resource private PasswordEncoder passwordEncoder; @Override @@ -68,4 +80,53 @@ public class MbrUserServiceImpl implements MbrUserService { return userMapper.selectById(id); } + @Override + public void reviseNickname(Long loginUserId, String nickName) { + MbrUserDO mbrUserDO = userMapper.selectById(loginUserId); + // 仅当新昵称不等于旧昵称时进行修改 + if (!nickName.equals(mbrUserDO.getNickname())){ + MbrUserDO user = new MbrUserDO(); + user.setId(mbrUserDO.getId()); + user.setNickname(nickName); + userMapper.updateById(user); + } + } + + @Override + public String reviseAvatar(Long loginUserId, InputStream avatarFile) { + this.checkUserExists(loginUserId); + // 创建文件 + String avatar = fileCoreService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile)); + // 更新头像路径 + MbrUserDO userDO = new MbrUserDO(); + userDO.setId(loginUserId); + userDO.setAvatar(avatar); + userMapper.updateById(userDO); + return avatar; + } + + @Override + public SysUserCoreProfileRespVo getUserInfo(Long loginUserId) { + MbrUserDO mbrUserDO = userMapper.selectById(loginUserId); + if (mbrUserDO == null){ + log.error("用户不存在:{}",loginUserId); + throw exception(USER_NOT_EXISTS); + } + + SysUserCoreProfileRespVo userRes = new SysUserCoreProfileRespVo(); + userRes.setNickName(mbrUserDO.getNickname()); + userRes.setAvatar(mbrUserDO.getAvatar()); + return userRes; + } + + @VisibleForTesting + public void checkUserExists(Long id) { + if (id == null) { + return; + } + MbrUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + } } -- libgit2 0.21.4