xiongzhu пре 4 година
родитељ
комит
38c30d8ff3

+ 2 - 0
src/main/java/com/izouma/nineth/domain/User.java

@@ -71,8 +71,10 @@ public class User extends BaseEntity implements Serializable {
 
     private String email;
 
+    @ApiModelProperty("关注数量")
     private int follows;
 
+    @ApiModelProperty("粉丝数量")
     private int followers;
 
     private int sales;

+ 13 - 0
src/main/java/com/izouma/nineth/dto/UserDTO.java

@@ -0,0 +1,13 @@
+package com.izouma.nineth.dto;
+
+import com.izouma.nineth.domain.User;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class UserDTO extends User {
+
+    @ApiModelProperty("是否关注")
+    private boolean follow;
+
+}

+ 2 - 0
src/main/java/com/izouma/nineth/repo/FollowRepo.java

@@ -16,4 +16,6 @@ public interface FollowRepo extends JpaRepository<Follow, Long>, JpaSpecificatio
     void softDelete(Long id);
 
     List<Follow> findByUserIdAndFollowUserId(Long userId, Long to);
+
+    List<Follow> findByUserId(Long userId);
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/LikeRepo.java

@@ -16,4 +16,6 @@ public interface LikeRepo extends JpaRepository<Like, Long>, JpaSpecificationExe
     void softDelete(Long id);
 
     List<Like> findByUserIdAndCollectionId(Long userId, Long collectionId);
+
+    List<Like> findByUserId(Long userId);
 }

+ 16 - 0
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -31,4 +31,20 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     @Modifying
     @Query("update User u set u.followers = u.followers + ?1 where u.id = ?1")
     void addFollow(Long userId, int num);
+
+    @Query("select distinct u from User u join Follow f on u.id = f.followUserId " +
+            "where f.userId = ?1 and u.del = false ")
+    List<User> userFollows(Long userId);
+
+    @Transactional
+    @Modifying
+    @Query(value = "update user set follows = (select count(*) from follow " +
+            "where follow.user_id = ?1) where user.id = ?1", nativeQuery = true)
+    void updateFollows(Long userId);
+
+    @Transactional
+    @Modifying
+    @Query(value = "update user set followers = (select count(*) from follow " +
+            "where follow.follow_user_id = ?1) where user.id = ?1", nativeQuery = true)
+    void updateFollowers(Long userId);
 }

+ 2 - 4
src/main/java/com/izouma/nineth/security/Authority.java

@@ -2,10 +2,7 @@ package com.izouma.nineth.security;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.izouma.nineth.enums.AuthorityName;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
 
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
@@ -19,6 +16,7 @@ import java.util.Objects;
 @AllArgsConstructor
 @Builder
 @JsonIgnoreProperties(ignoreUnknown = true)
+@EqualsAndHashCode
 public class Authority implements Serializable {
 
     public static Authority get(AuthorityName name) {

+ 46 - 0
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -1,20 +1,66 @@
 package com.izouma.nineth.service;
 
 import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.domain.Follow;
+import com.izouma.nineth.domain.Like;
+import com.izouma.nineth.domain.User;
+import com.izouma.nineth.dto.CollectionDTO;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.UserDTO;
 import com.izouma.nineth.repo.CollectionRepo;
+import com.izouma.nineth.repo.LikeRepo;
 import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Service
 @AllArgsConstructor
 public class CollectionService {
 
     private CollectionRepo collectionRepo;
+    private LikeRepo       likeRepo;
 
     public Page<Collection> all(PageQuery pageQuery) {
         return collectionRepo.findAll(JpaUtils.toSpecification(pageQuery, Collection.class), JpaUtils.toPageRequest(pageQuery));
     }
+
+    public CollectionDTO toDTO(Collection collection) {
+        return toDTO(collection, true);
+    }
+
+    public CollectionDTO toDTO(Collection collection, boolean join) {
+        CollectionDTO collectionDTO = new CollectionDTO();
+        BeanUtils.copyProperties(collection, collectionDTO);
+        if (join) {
+            if (SecurityUtils.getAuthenticatedUser() != null) {
+                List<Like> list = likeRepo.findByUserIdAndCollectionId(SecurityUtils.getAuthenticatedUser().getId(),
+                        collection.getId());
+                collectionDTO.setLiked(!list.isEmpty());
+            }
+        }
+        return collectionDTO;
+    }
+
+    public List<CollectionDTO> toDTO(List<Collection> collections) {
+        return collections.stream().parallel().map(collection -> {
+            CollectionDTO dto = toDTO(collection, false);
+            if (SecurityUtils.getAuthenticatedUser() != null) {
+                List<Like> likes = likeRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId());
+                dto.setLiked(likes.stream().anyMatch(l -> l.getCollectionId().equals(collection.getId())));
+            }
+            return dto;
+        }).collect(Collectors.toList());
+    }
+
+    public Page<CollectionDTO> toDTO(Page<Collection> collections) {
+        List<CollectionDTO> userDTOS = toDTO(collections.getContent());
+        return new PageImpl<>(userDTOS, collections.getPageable(), collections.getTotalElements());
+    }
 }

+ 8 - 2
src/main/java/com/izouma/nineth/service/FollowService.java

@@ -30,14 +30,20 @@ public class FollowService {
                 .userId(userId)
                 .followUserId(to)
                 .build());
-        userRepo.addFollow(to, 1);
+        userRepo.updateFollows(userId);
+        userRepo.updateFollowers(to);
     }
 
     public void unfollow(Long userId, Long to) {
         List<Follow> list = followRepo.findByUserIdAndFollowUserId(userId, to);
         if (!list.isEmpty()) {
             followRepo.deleteAll(list);
-            userRepo.addFollow(to, -list.size());
+            userRepo.updateFollows(userId);
+            userRepo.updateFollowers(to);
         }
     }
+
+    boolean isFollow(Long userId, Long to) {
+        return followRepo.findByUserIdAndFollowUserId(userId, to).size() > 0;
+    }
 }

+ 39 - 3
src/main/java/com/izouma/nineth/service/UserService.java

@@ -4,12 +4,15 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.Follow;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.UserDTO;
 import com.izouma.nineth.dto.UserRegister;
 import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.enums.AuthorityName;
 import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.FollowRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.security.JwtTokenUtil;
@@ -17,6 +20,7 @@ import com.izouma.nineth.security.JwtUserFactory;
 import com.izouma.nineth.service.sms.SmsService;
 import com.izouma.nineth.service.storage.StorageService;
 import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -27,14 +31,14 @@ import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.UUID;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -47,6 +51,8 @@ public class UserService {
     private StorageService storageService;
     private JwtTokenUtil   jwtTokenUtil;
     private CaptchaService captchaService;
+    private FollowService  followService;
+    private FollowRepo     followRepo;
 
     public Page<User> all(PageQuery pageQuery) {
         Specification<User> specification = JpaUtils.toSpecification(pageQuery, User.class);
@@ -253,4 +259,34 @@ public class UserService {
         userRepo.save(user);
     }
 
+    public UserDTO toDTO(User user) {
+        return toDTO(user, true);
+    }
+
+    public UserDTO toDTO(User user, boolean join) {
+        UserDTO userDTO = new UserDTO();
+        BeanUtils.copyProperties(user, userDTO);
+        if (join) {
+            if (SecurityUtils.getAuthenticatedUser() != null) {
+                userDTO.setFollow(followService.isFollow(SecurityUtils.getAuthenticatedUser().getId(), user.getId()));
+            }
+        }
+        return userDTO;
+    }
+
+    public List<UserDTO> toDTO(List<User> users) {
+        return users.stream().parallel().map(user -> {
+            UserDTO dto = toDTO(user, false);
+            if (SecurityUtils.getAuthenticatedUser() != null) {
+                List<Follow> follows = followRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId());
+                dto.setFollow(follows.stream().anyMatch(f -> f.getFollowUserId().equals(user.getId())));
+            }
+            return dto;
+        }).collect(Collectors.toList());
+    }
+
+    public Page<UserDTO> toDTO(Page<User> users) {
+        List<UserDTO> userDTOS = toDTO(users.getContent());
+        return new PageImpl<>(userDTOS, users.getPageable(), users.getTotalElements());
+    }
 }

+ 8 - 0
src/main/java/com/izouma/nineth/utils/SecurityUtils.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.utils;
 
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.enums.AuthorityName;
+import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.security.JwtUser;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -14,4 +16,10 @@ public class SecurityUtils {
         }
         return user;
     }
+
+    public static boolean hasRole(AuthorityName name){
+        User user = getAuthenticatedUser();
+        if (null==user) return false;
+        return user.getAuthorities().contains(Authority.get(name));
+    }
 }

+ 4 - 4
src/main/java/com/izouma/nineth/web/CollectionController.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.dto.CollectionDTO;
 import com.izouma.nineth.service.CollectionService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
@@ -38,11 +39,10 @@ public class CollectionController extends BaseController {
         return collectionRepo.save(record);
     }
 
-
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
-    public Page<Collection> all(@RequestBody PageQuery pageQuery) {
-        return collectionService.all(pageQuery);
+    public Page<CollectionDTO> all(@RequestBody PageQuery pageQuery) {
+        return collectionService.toDTO(collectionService.all(pageQuery));
     }
 
     @GetMapping("/get/{id}")
@@ -58,7 +58,7 @@ public class CollectionController extends BaseController {
     @GetMapping("/excel")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<Collection> data = all(pageQuery).getContent();
+        List<Collection> data = collectionService.all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
 

+ 16 - 7
src/main/java/com/izouma/nineth/web/UserController.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.UserDTO;
 import com.izouma.nineth.dto.UserRegister;
 import com.izouma.nineth.enums.AuthorityName;
 import com.izouma.nineth.exception.BusinessException;
@@ -30,9 +31,9 @@ import java.util.List;
 @RestController
 @RequestMapping("/user")
 public class UserController extends BaseController {
-    private UserRepo     userRepo;
-    private UserService  userService;
-    private JwtTokenUtil jwtTokenUtil;
+    private UserRepo      userRepo;
+    private UserService   userService;
+    private JwtTokenUtil  jwtTokenUtil;
     private FollowService followService;
 
     @PostMapping("/register")
@@ -77,10 +78,13 @@ public class UserController extends BaseController {
                 .orElseThrow(new BusinessException("用户不存在"));
     }
 
-    @PreAuthorize("hasRole('ADMIN')")
+    //    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
-    public Page<User> all(@RequestBody PageQuery pageQuery) {
-        return userService.all(pageQuery);
+    public Page<UserDTO> all(@RequestBody PageQuery pageQuery) {
+        if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
+            pageQuery.getQuery().put("hasRole", "ROLE_MINTER");
+        }
+        return userService.toDTO(userService.all(pageQuery));
     }
 
     @PreAuthorize("hasRole('ADMIN')")
@@ -98,7 +102,7 @@ public class UserController extends BaseController {
     @GetMapping("/excel")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<User> data = all(pageQuery).getContent();
+        List<User> data = userService.all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
 
@@ -145,6 +149,11 @@ public class UserController extends BaseController {
         followService.unfollow(SecurityUtils.getAuthenticatedUser().getId(), id);
     }
 
+    @GetMapping("/myFollows")
+    @ApiOperation("我的关注")
+    public List<UserDTO> myFollows() {
+        return userService.toDTO(userRepo.userFollows(SecurityUtils.getAuthenticatedUser().getId()));
+    }
 }
 
 

+ 10 - 1
src/main/vue/src/views/MinterEdit.vue

@@ -40,6 +40,15 @@
                     <el-form-item prop="phone" label="手机">
                         <el-input v-model="formData.phone" :disabled="formData.id"></el-input>
                     </el-form-item>
+                    <el-form-item prop="intro" label="简介">
+                        <el-input
+                            v-model="formData.intro"
+                            placeholder="200字以内"
+                            maxlength="200"
+                            type="textarea"
+                            autosize
+                        ></el-input>
+                    </el-form-item>
                     <!-- <el-form-item prop="authorities" label="角色">
                         <el-select
                             v-model="formData.authorities"
@@ -132,7 +141,7 @@ export default {
                     }
                 ],
                 authorities: [{ required: true, message: '请选择角色', trigger: 'blur' }],
-                saving: false
+                intro: [{ required: true, message: '请输入简介', trigger: 'blur' }]
             },
             authorities: [
                 { name: 'ROLE_MINTER', description: '铸造者' },

+ 0 - 1
src/main/vue/src/views/UserEdit.vue

@@ -116,7 +116,6 @@ export default {
                     }
                 ],
                 authorities: [{ required: true, message: '请选择角色', trigger: 'blur' }],
-                saving: false
             },
             authorities: []
         };

+ 3 - 3
src/test/java/com/izouma/nineth/CommonTest.java

@@ -2,6 +2,8 @@ package com.izouma.nineth;
 
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.enums.AuthorityName;
+import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.utils.UrlUtils;
 import com.izouma.nineth.web.BaseController;
 import lombok.SneakyThrows;
@@ -35,10 +37,8 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.ArrayList;
+import java.util.*;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.regex.Pattern;
 
 import static java.nio.file.StandardOpenOption.CREATE;