Procházet zdrojové kódy

对外开放修改头像和修改密码

he.dujuan před 3 roky
rodič
revize
fb3367caa6

+ 3 - 0
eladmin-common/src/main/java/me/zhengjie/utils/FileUtil.java

@@ -176,8 +176,11 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
     public static File upload(MultipartFile file, String filePath) {
         Date date = new Date();
         SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
+        //获取不带扩展名的文件名
         String name = getFileNameNoEx(file.getOriginalFilename());
+        //获取文件后缀名
         String suffix = getExtensionName(file.getOriginalFilename());
+        //生成唯一名
         String nowStr = "-" + format.format(date);
         try {
             String fileName = name + nowStr + "." + suffix;

+ 6 - 6
eladmin-system/src/main/java/me/zhengjie/modules/dm/user/domain/DmUser.java

@@ -133,12 +133,12 @@ public class DmUser extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "根用户组名称", hidden = true)
     private String userRootGroupName;
 
-    @ManyToMany
-    @ApiModelProperty(value = "用户系统")
-    @JoinTable(name = "dm_user_system",
-            joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "id")},
-            inverseJoinColumns = {@JoinColumn(name = "system_id",referencedColumnName = "id")})
-    private List<DmSystem> dmSystems;
+//    @ManyToMany
+//    @ApiModelProperty(value = "用户系统")
+//    @JoinTable(name = "dm_user_system",
+//            joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "id")},
+//            inverseJoinColumns = {@JoinColumn(name = "system_id",referencedColumnName = "id")})
+//    private List<DmSystem> dmSystems;
 
     @ManyToMany
     @ApiModelProperty(value = "用户app菜单")

+ 2 - 2
eladmin-system/src/main/java/me/zhengjie/modules/dm/user/service/dto/DmUserDto.java

@@ -91,8 +91,8 @@ public class DmUserDto extends BaseDTO implements Serializable {
     /** 车牌信息 */
     private Set<DmPlateNumber> plateNumbers;
 
-    /** 用户系统 */
-    private List<DmSystem> dmSystems;
+//    /** 用户系统 */
+//    private List<DmSystem> dmSystems;
 
     /** 用户app菜单 */
     private List<DmAppMenu> dmAppMenus;

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/User.java

@@ -21,6 +21,7 @@ import lombok.Setter;
 import me.zhengjie.base.BaseEntity;
 import me.zhengjie.modules.dm.company.domain.DmCompany;
 import me.zhengjie.modules.dm.user.domain.DmUser;
+import me.zhengjie.modules.system.service.dto.UserDto;
 
 import javax.persistence.*;
 import javax.validation.constraints.Email;

+ 26 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/vo/UserMessage.java

@@ -0,0 +1,26 @@
+package me.zhengjie.modules.system.domain.vo;
+
+import lombok.Data;
+import me.zhengjie.modules.system.domain.User;
+
+@Data
+public class UserMessage {
+
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 用户旧密码
+     */
+    private String oldPass;
+    /**
+     * 用户新密码
+     */
+    private String newPass;
+    /**
+     * 用户头像
+     */
+    private String picture;
+}

+ 26 - 1
eladmin-system/src/main/java/me/zhengjie/modules/system/repository/UserRepository.java

@@ -25,6 +25,7 @@ import org.springframework.data.repository.query.Param;
 import javax.transaction.Transactional;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -38,7 +39,8 @@ public interface UserRepository extends JpaRepository<User, String>, JpaSpecific
      * @param username 用户名
      * @return /
      */
-    User findByUsername(String username);
+    @Query(value = "SELECT * FROM sys_user WHERE username = :username",nativeQuery = true)
+    User findByUsername(@Param("username") String username);
 
     /**
      * 根据用户名和密码查询
@@ -73,6 +75,16 @@ public interface UserRepository extends JpaRepository<User, String>, JpaSpecific
     @Query(value = "update sys_user set password = ?2 , pwd_reset_time = ?3 where username = ?1",nativeQuery = true)
     void updatePass(String username, String pass, Date lastPasswordResetTime);
 
+    /**
+     * 修改密码
+     * @param userId 用户id
+     * @param encryptPassword 密码
+     * @param date /
+     */
+    @Modifying
+    @Query(value = "update sys_user set password = ?2 , pwd_reset_time = ?3 where user_id = ?1",nativeQuery = true)
+   @Transactional
+    void updatePassById(String userId, String encryptPassword, Date date);
     /**
      * 修改邮箱
      * @param username 用户名
@@ -171,4 +183,17 @@ public interface UserRepository extends JpaRepository<User, String>, JpaSpecific
     @Query(value = "select username from sys_user",nativeQuery = true)
     List<String> getAllUsername();
 
+    /**
+     * 获取所有username
+     * @return /
+     */
+    @Query(value = "select u.* from sys_user u where  user_id = :user_id",nativeQuery = true)
+    Map<String,String> findUserById(@Param("user_id") String user_id);
+
+
+
+    @Modifying
+    @Query(value = "update sys_user set avatar_name = ?3 ,avatar_path = ?2 where user_id = ?1",nativeQuery = true)
+     int updateUser(String userId, String path, String realName);
+
 }

+ 7 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/service/UserService.java

@@ -83,6 +83,13 @@ public interface UserService {
      */
     void updatePass(String username, String encryptPassword);
 
+    /**
+     * 修改密码
+     * @param userId 用户名
+     * @param encryptPassword 密码
+     */
+    void updatePassById(String userId, String encryptPassword);
+
     /**
      * 修改头像
      * @param file 文件

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/UserDto.java

@@ -64,7 +64,7 @@ public class UserDto extends BaseDTO implements Serializable {
 
     private String avatarPath;
 
-    @JSONField(serialize = false)
+    //@JSONField(serialize = false)
     private String password;
 
     private Boolean enabled;

+ 22 - 2
eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java

@@ -17,6 +17,7 @@ package me.zhengjie.modules.system.service.impl;
 
 import lombok.RequiredArgsConstructor;
 import me.zhengjie.config.FileProperties;
+import me.zhengjie.domain.LocalStorage;
 import me.zhengjie.exception.BadRequestException;
 import me.zhengjie.modules.dm.card.domain.DmCard;
 import me.zhengjie.modules.dm.card.service.DmCardService;
@@ -41,6 +42,8 @@ import me.zhengjie.modules.system.service.dto.RoleSmallDto;
 import me.zhengjie.modules.system.service.dto.UserDto;
 import me.zhengjie.modules.system.service.dto.UserQueryCriteria;
 import me.zhengjie.modules.system.service.mapstruct.UserMapper;
+import me.zhengjie.repository.LocalStorageRepository;
+import me.zhengjie.service.LocalStorageService;
 import me.zhengjie.utils.*;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.Cacheable;
@@ -75,7 +78,6 @@ public class UserServiceImpl implements UserService {
     private final DmUserMapper dmUserMapper;
     private final DmUserRepository dmUserRepository;
     private final DmCardService dmCardService;
-
     @Override
     public Object queryAll(UserQueryCriteria criteria, Pageable pageable) {
         Page<User> page = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
@@ -276,19 +278,37 @@ public class UserServiceImpl implements UserService {
         flushCache(username);
     }
 
+    @Override
+    public void updatePassById(String userId, String encryptPassword) {
+        userRepository.updatePassById(userId, encryptPassword, new Date());
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map<String, String> updateAvatar(MultipartFile multipartFile) {
+        //根据用户名查询用户  一对一  精准查询
         User user = userRepository.findByUsername(SecurityUtils.getCurrentUsername());
+        //获取头像旧路径
         String oldPath = user.getAvatarPath();
+        //头像图片上传
         File file = FileUtil.upload(multipartFile, properties.getPath().getAvatar());
+        //设置头像路径
         user.setAvatarPath(Objects.requireNonNull(file).getPath());
+        //设置头像名称
         user.setAvatarName(file.getName());
+        //保存用户  会根据数据自动修改
         userRepository.save(user);
+        //判断旧文件地址是否是null的
         if (StringUtils.isNotBlank(oldPath)) {
-            FileUtil.del(oldPath);
+            //根据旧文件地址删除文件
+            if (FileUtil.del(oldPath)){
+                //删除成功需要删除对应文件表中的数据 tool_local_storage
+//                this.localStorageService.deleteByUrl(oldPath);
+            }
         }
+        //获取用户名称不能为NULL
         @NotBlank String username = user.getUsername();
+        //清理用户登录时的缓存
         flushCache(username);
         return new HashMap<String, String>(1) {{
             put("avatar", file.getName());

+ 70 - 9
eladmin-system/src/main/java/me/zhengjie/modules/thirdparty/v1/UserApiController.java

@@ -14,6 +14,8 @@ import me.zhengjie.annotation.rest.AnonymousGetMapping;
 import me.zhengjie.annotation.rest.AnonymousPostMapping;
 import me.zhengjie.base.BaseResponse;
 import me.zhengjie.base.QueryPageParams;
+import me.zhengjie.config.RsaProperties;
+import me.zhengjie.domain.LocalStorage;
 import me.zhengjie.exception.BadRequestException;
 import me.zhengjie.modules.dm.user.domain.DmUser;
 import me.zhengjie.modules.dm.user.service.DmUserService;
@@ -25,12 +27,14 @@ import me.zhengjie.modules.security.security.TokenProvider;
 import me.zhengjie.modules.security.service.OnlineUserService;
 import me.zhengjie.modules.security.service.dto.JwtUserDto;
 import me.zhengjie.modules.system.domain.User;
+import me.zhengjie.modules.system.domain.vo.UserMessage;
+import me.zhengjie.modules.system.domain.vo.UserPassVo;
 import me.zhengjie.modules.system.repository.UserRepository;
 import me.zhengjie.modules.system.service.*;
 import me.zhengjie.modules.system.service.dto.*;
-import me.zhengjie.utils.EncryptUtils;
-import me.zhengjie.utils.SecurityUtils;
-import me.zhengjie.utils.StringUtils;
+import me.zhengjie.modules.system.service.mapstruct.UserMapper;
+import me.zhengjie.service.LocalStorageService;
+import me.zhengjie.utils.*;
 import org.hibernate.Criteria;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
@@ -42,14 +46,14 @@ import org.springframework.security.config.annotation.authentication.builders.Au
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.web.bind.annotation.GetMapping;
-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.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotBlank;
+import java.io.File;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -71,9 +75,10 @@ public class UserApiController {
     private final SecurityProperties properties;
     @Resource
     private LoginProperties loginProperties;
-
+    private final LocalStorageService localStorageService;
     private final PasswordEncoder passwordEncoder;
     private final UserRepository userRepository;
+    private final UserMapper userMapper;
     private final String erpapiUrl = "https://portal.caih.com";
 
     private final String key = "DMERPYT!@#$QWER2021+{:>";
@@ -209,6 +214,9 @@ public class UserApiController {
     public BaseResponse<Object> login(String name,String pass) throws Exception {
 //        String dataStr = passwordEncoder.encode(pass);
         User user = userRepository.findByUsername(name);
+
+        Map<String,Object> path =  this.localStorageService.findByRealName(user.getAvatarName());
+        user.setAvatarName(path.get("url").toString());
         if (user != null){
             boolean bo = passwordEncoder.matches(pass,user.getPassword());
             if (bo){
@@ -239,10 +247,63 @@ public class UserApiController {
     public BaseResponse<Object> getzkusers(@RequestBody QueryPageParams<DmUserQueryCriteria> params, Pageable pageable) {
         SecurityUtils.CheckApiAuth(params);
         Map<String, Object> list = dmUserService.queryAll(params.getQuery(), pageable);
-
         return new BaseResponse<>(list);
     }
 
+
+
+    @Log("修改密码")
+    @ApiOperation("修改用户数据密码")
+    @AnonymousPostMapping(value = "/edit/zkuser/pass")
+    public BaseResponse<Object> editzkuser(@RequestBody QueryPageParams<UserMessage> params) throws Exception{
+        SecurityUtils.CheckApiAuth(params);
+        String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, RsaUtils.encryptByPublicKey(RsaProperties.publicKey,params.getQuery().getOldPass()));
+        String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,RsaUtils.encryptByPublicKey(RsaProperties.publicKey,params.getQuery().getNewPass()));
+        Map<String,String> map = userRepository.findUserById(params.getQuery().getUserId());
+        User user = JSONObject.parseObject(JSONObject.toJSONString(map), User.class);
+        if(!passwordEncoder.matches(oldPass, map.get("password"))){
+            throw new BadRequestException("修改失败,旧密码错误");
+        }
+        if(passwordEncoder.matches(newPass, user.getPassword())){
+            throw new BadRequestException("新密码不能与旧密码相同");
+        }
+        userService.updatePass(user.getUsername(),passwordEncoder.encode(newPass));
+        return new BaseResponse(null);
+    }
+
+
+    @Log("修改头像")
+    @ApiOperation("修改用户数据头像")
+    @AnonymousPostMapping(value = "/edit/zkuser/picture")
+    public BaseResponse<Object> editzkuserpicture(@RequestParam String params,@RequestParam(value = "multipartFile") MultipartFile multipartFile) throws Exception {
+         QueryPageParams queryPageParams = JSONObject.parseObject(params, QueryPageParams.class);
+
+        SecurityUtils.CheckApiAuth(queryPageParams);
+        UserMessage userMessage = JSONObject.parseObject(queryPageParams.getQuery().toString(), UserMessage.class);
+        //根据用户名查询用户  一对一  精准查询
+        UserDto user= userService.findById(userMessage.getUserId());
+        //获取头像旧文件名 唯一的
+        String oldName = user.getAvatarName();
+        //上传文件
+        LocalStorage file = this.localStorageService.create(null, multipartFile);
+        //设置头像路径
+        user.setAvatarPath(Objects.requireNonNull(file).getPath());
+        //设置头像名称
+        user.setAvatarName(file.getRealName());
+        //保存用户  会根据数据自动修改
+       userService.update(userMapper.toEntity(user));
+        //判断旧文件名是否是null的
+        if (StringUtils.isNotBlank(oldName)) {
+            //根据旧文件地址名删除文件
+            if (FileUtil.del(oldName)){
+//                删除成功需要删除对应文件表中的数据 toolf_local_storage
+                this.localStorageService.deleteByUrl(oldName);
+            }
+        }
+        return new BaseResponse(null);
+    }
+
+
     @Log("根据密文获取用户信息")
     @ApiOperation("根据密文获取用户信息")
     @AnonymousGetMapping(value = "/getZkUserByCipher")

+ 4 - 1
eladmin-tools/src/main/java/me/zhengjie/domain/LocalStorage.java

@@ -57,8 +57,11 @@ public class LocalStorage extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "大小")
     private String size;
+    @ApiModelProperty(value = "url")
+    private String url;
 
-    public LocalStorage(String realName,String name, String suffix, String path, String type, String size) {
+    public LocalStorage(String url,String realName,String name, String suffix, String path, String type, String size) {
+        this.url = url;
         this.realName = realName;
         this.name = name;
         this.suffix = suffix;

+ 24 - 0
eladmin-tools/src/main/java/me/zhengjie/repository/LocalStorageRepository.java

@@ -18,10 +18,34 @@ package me.zhengjie.repository;
 import me.zhengjie.domain.LocalStorage;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Map;
 
 /**
 * @author Zheng Jie
 * @date 2019-09-05
 */
 public interface LocalStorageRepository extends JpaRepository<LocalStorage, Long>, JpaSpecificationExecutor<LocalStorage> {
+
+    /**
+     * 根据文件名删除
+     * @param oldName
+     * @return
+     */
+    @Modifying
+    @Query(value = "DELETE FROM tool_local_storage WHERE real_name = :oldName",nativeQuery = true)
+    int deleteByUrl(@Param("oldName") String oldName);
+
+    /**
+     * 根据文件名查询
+     * @param avatarName 文件名称
+     * @return
+     */
+    @Transactional
+    @Query(value = "SELECT url FROM tool_local_storage WHERE ",nativeQuery = true)
+    Map<String, Object> findByRealName(String avatarName);
 }

+ 10 - 0
eladmin-tools/src/main/java/me/zhengjie/service/LocalStorageService.java

@@ -23,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
 * @author Zheng Jie
@@ -79,4 +80,13 @@ public interface LocalStorageService {
      * @throws IOException /
      */
     void download(List<LocalStorageDto> localStorageDtos, HttpServletResponse response) throws IOException;
+
+    /**
+     * 根据旧文件地址删除
+     * @param oldName
+     * @return
+     */
+    int deleteByUrl(String oldName);
+
+    Map<String, Object> findByRealName(String avatarName);
 }

+ 19 - 0
eladmin-tools/src/main/java/me/zhengjie/service/impl/LocalStorageServiceImpl.java

@@ -72,16 +72,22 @@ public class LocalStorageServiceImpl implements LocalStorageService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public LocalStorage create(String name, MultipartFile multipartFile) {
+        //计算文件大小
         FileUtil.checkSize(properties.getMaxSize(), multipartFile.getSize());
+        //获取文件后缀名
         String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename());
+        //获取文件类型
         String type = FileUtil.getFileType(suffix);
+        //开始上传
         File file = FileUtil.upload(multipartFile, properties.getPath().getPath() +  File.separator);
         if(ObjectUtil.isNull(file)){
             throw new BadRequestException("上传失败");
         }
+        String url = "https://smartpark.caih.com/static/zkxtres/"+file.getName();
         try {
             name = StringUtils.isBlank(name) ? FileUtil.getFileNameNoEx(multipartFile.getOriginalFilename()) : name;
             LocalStorage localStorage = new LocalStorage(
+                    url,
                     file.getName(),
                     name,
                     suffix,
@@ -130,4 +136,17 @@ public class LocalStorageServiceImpl implements LocalStorageService {
         }
         FileUtil.downloadExcel(list, response);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteByUrl(String oldName) {
+        return this.localStorageRepository.deleteByUrl(oldName);
+    }
+
+    @Override
+    public Map<String, Object> findByRealName(String avatarName) {
+        return this.localStorageRepository.findByRealName(avatarName);
+    }
+
+
 }