فهرست منبع

add user logic

Bay 5 سال پیش
والد
کامیت
071cea2029

+ 104 - 0
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/TeacherVO.java

@@ -0,0 +1,104 @@
+package cn.seecoder.seecoderportalcommon.vo;
+
+import org.springframework.data.annotation.CreatedDate;
+
+import java.time.OffsetDateTime;
+
+/**
+ * @author kunduin
+ */
+public class TeacherVO {
+    private Long id;
+
+    private String realName;
+
+    private String organization;
+
+    private String jobNumber;
+
+    private String certificate;
+
+    private UserVO userDetail;
+
+    private OffsetDateTime createdTime;
+
+    private TeacherState state;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getOrganization() {
+        return organization;
+    }
+
+    public void setOrganization(String organization) {
+        this.organization = organization;
+    }
+
+    public String getJobNumber() {
+        return jobNumber;
+    }
+
+    public void setJobNumber(String jobNumber) {
+        this.jobNumber = jobNumber;
+    }
+
+    public String getCertificate() {
+        return certificate;
+    }
+
+    public void setCertificate(String certificate) {
+        this.certificate = certificate;
+    }
+
+    public UserVO getUserDetail() {
+        return userDetail;
+    }
+
+    public void setUserDetail(UserVO userDetail) {
+        this.userDetail = userDetail;
+    }
+
+    public OffsetDateTime getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(OffsetDateTime createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public TeacherState getState() {
+        return state;
+    }
+
+    public void setState(TeacherState state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return "TeacherVO{" +
+                "id=" + id +
+                ", realName='" + realName + '\'' +
+                ", organization='" + organization + '\'' +
+                ", jobNumber='" + jobNumber + '\'' +
+                ", certificate='" + certificate + '\'' +
+                ", userDetail=" + userDetail +
+                ", createdTime=" + createdTime +
+                ", state=" + state +
+                '}';
+    }
+}

+ 3 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/SeecoderPortalServerApplication.java

@@ -1,14 +1,16 @@
 package cn.seecoder.seecoderportalserver;
 
+import cn.seecoder.seecoderportalserver.config.property.AliProperties;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 
 /**
  * @author Kunduin
  */
 @SpringBootApplication
-@EnableConfigurationProperties
+@EnableConfigurationProperties({AliProperties.class})
 public class SeecoderPortalServerApplication {
     public static void main(String[] args) {
         SpringApplication.run(SeecoderPortalServerApplication.class, args);

+ 15 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/PhoneVerification.java

@@ -1,8 +1,11 @@
 package cn.seecoder.seecoderportalserver.domain;
 
+import org.hibernate.annotations.UpdateTimestamp;
+
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+import java.time.OffsetDateTime;
 
 /**
  * @author Kunduin
@@ -27,6 +30,9 @@ public class PhoneVerification {
     @NotNull
     private String code;
 
+    @UpdateTimestamp
+    private OffsetDateTime codeTime;
+
     public Long getId() {
         return id;
     }
@@ -51,12 +57,21 @@ public class PhoneVerification {
         this.code = code;
     }
 
+    public OffsetDateTime getCodeTime() {
+        return codeTime;
+    }
+
+    public void setCodeTime(OffsetDateTime codeTime) {
+        this.codeTime = codeTime;
+    }
+
     @Override
     public String toString() {
         return "PhoneVerification{" +
                 "id=" + id +
                 ", phone='" + phone + '\'' +
                 ", code='" + code + '\'' +
+                ", codeTime=" + codeTime +
                 '}';
     }
 }

+ 10 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/mapper/UserMapper.java

@@ -1,6 +1,8 @@
 package cn.seecoder.seecoderportalserver.mapper;
 
+import cn.seecoder.seecoderportalcommon.vo.TeacherVO;
 import cn.seecoder.seecoderportalcommon.vo.UserVO;
+import cn.seecoder.seecoderportalserver.domain.Teacher;
 import cn.seecoder.seecoderportalserver.domain.User;
 import cn.seecoder.seecoderportalserver.security.DomainUserDetails;
 import org.mapstruct.Mapper;
@@ -11,9 +13,15 @@ import org.mapstruct.Mapper;
 @Mapper(componentModel = "spring")
 public interface UserMapper {
 
-    DomainUserDetails userToDomainUserDetails(User user);
-
     User userVOToUser(UserVO userVO);
 
+    UserVO userToUserVO(User user);
+
+    DomainUserDetails userToDomainUserDetails(User user);
+
     UserVO domainUserDetailToUserVO(DomainUserDetails userDetails);
+
+    TeacherVO teacherToTeacherVO(Teacher teacher);
+
+    Teacher teacherVOToTeacher(TeacherVO teacherVO);
 }

+ 0 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/PhoneVerificationRepository.java

@@ -2,7 +2,6 @@ package cn.seecoder.seecoderportalserver.repository;
 
 import cn.seecoder.seecoderportalserver.domain.PhoneVerification;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
 
 import java.time.OffsetDateTime;
 import java.util.Optional;
@@ -10,7 +9,6 @@ import java.util.Optional;
 /**
  * @author kunduin
  */
-@Repository
 public interface PhoneVerificationRepository extends JpaRepository<PhoneVerification, Long> {
 
     Optional<PhoneVerification> findByPhone(String phone);

+ 21 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/TeacherRepository.java

@@ -0,0 +1,21 @@
+package cn.seecoder.seecoderportalserver.repository;
+
+import cn.seecoder.seecoderportalcommon.vo.TeacherState;
+import cn.seecoder.seecoderportalserver.domain.Teacher;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author kunduin
+ */
+public interface TeacherRepository extends JpaRepository<Teacher, Long> {
+
+    /**
+     * 通过审核状态查找教师
+     *
+     * @param state 状态
+     * @return 教师列表
+     */
+    List<Teacher> findAllByState(TeacherState state);
+}

+ 10 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/UserRepository.java

@@ -1,16 +1,25 @@
 package cn.seecoder.seecoderportalserver.repository;
 
+import cn.seecoder.seecoderportalcommon.vo.UserRole;
 import cn.seecoder.seecoderportalserver.domain.User;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
 import java.util.Optional;
 
 /**
  * @author Kunduin
  */
-@Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 
+    /**
+     * 通过手机查找用户
+     * @param phone 手机
+     * @return 用户
+     */
     Optional<User> findByPhone(String phone);
+
+    List<User> findByRole(UserRole role);
+
 }

+ 17 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/TeacherService.java

@@ -1,7 +1,24 @@
 package cn.seecoder.seecoderportalserver.service;
 
+import cn.seecoder.seecoderportalcommon.vo.TeacherState;
+import cn.seecoder.seecoderportalserver.domain.Teacher;
+import cn.seecoder.seecoderportalserver.domain.User;
+import cn.seecoder.seecoderportalserver.repository.TeacherRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
 /**
  * @author kunduin
  */
+@Service
 public class TeacherService {
+
+    private final TeacherRepository teacherRepository;
+
+    public TeacherService(TeacherRepository teacherRepository) {this.teacherRepository = teacherRepository;}
+
+    public List<Teacher> findAllByState(TeacherState state) {
+        return teacherRepository.findAllByState(state);
+    }
 }

+ 15 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/UserService.java

@@ -1,5 +1,6 @@
 package cn.seecoder.seecoderportalserver.service;
 
+import cn.seecoder.seecoderportalcommon.vo.UserRole;
 import cn.seecoder.seecoderportalcommon.vo.UserVO;
 import cn.seecoder.seecoderportalserver.domain.User;
 import cn.seecoder.seecoderportalserver.mapper.UserMapper;
@@ -13,6 +14,8 @@ import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * @author Kunduin
  */
@@ -35,6 +38,18 @@ public class UserService {
         this.aliService = aliService;
     }
 
+    public List<User> findUserByRole(UserRole role) {
+        return userRepository.findByRole(role);
+    }
+
+    public User updateUserValid(Long userId, Boolean isValid) {
+        return userRepository.findById(userId)
+                .map(user -> {
+                    user.setValid(isValid);
+                    return userRepository.save(user);
+                }).orElseThrow(()->new UsernameNotFoundException("找不到用户"));
+    }
+
     @Transactional(rollbackFor = RuntimeException.class)
     public User registerUser(UserVO userDTO, String password, String phoneCode) {
         checkPhoneMessageOrThrowError(userDTO.getPhone(), phoneCode);

+ 65 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/AdminController.java

@@ -0,0 +1,65 @@
+package cn.seecoder.seecoderportalserver.web.rest;
+
+import cn.seecoder.seecoderportalcommon.vo.TeacherState;
+import cn.seecoder.seecoderportalcommon.vo.TeacherVO;
+import cn.seecoder.seecoderportalcommon.vo.UserRole;
+import cn.seecoder.seecoderportalcommon.vo.UserVO;
+import cn.seecoder.seecoderportalserver.mapper.UserMapper;
+import cn.seecoder.seecoderportalserver.service.TeacherService;
+import cn.seecoder.seecoderportalserver.service.UserService;
+import cn.seecoder.seecoderportalserver.web.rest.dto.UpdateUserValidDTO;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author kunduin
+ */
+@RestController
+@RequestMapping("/api/admin")
+public class AdminController {
+
+    private final TeacherService teacherService;
+    private final UserService userService;
+    private final UserMapper userMapper;
+
+    public AdminController(TeacherService teacherService, UserService userService, UserMapper userMapper) {
+        this.teacherService = teacherService;
+        this.userService = userService;
+        this.userMapper = userMapper;
+    }
+
+    /**
+     * TODO: RENAME !!!
+     * 获取待审批的用户列表
+     */
+    @GetMapping("/getApplication")
+    public List<TeacherVO> getApplication() {
+        return teacherService.findAllByState(TeacherState.IDENTIFYING).stream()
+                .map(userMapper::teacherToTeacherVO)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 获取所有 ADMIN 权限的用户
+     */
+    @GetMapping("/getUsers")
+    public List<UserVO> getUsers() {
+        return userService.findUserByRole(UserRole.ADMIN).stream()
+                .map(userMapper::userToUserVO)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 更新用户,改变其 valid 状态
+     */
+    @PostMapping("/updateUser")
+    public void updateUser(@RequestBody UpdateUserValidDTO updateUserValidDTO) {
+        userService.updateUserValid(updateUserValidDTO.getId(), updateUserValidDTO.getValid());
+    }
+
+    /**
+     *
+     */
+}

+ 0 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/UserJWTController.java

@@ -4,8 +4,6 @@ import cn.seecoder.seecoderportalcommon.vo.LoginVO;
 import cn.seecoder.seecoderportalserver.security.jwt.TokenProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.ResponseEntity;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.core.Authentication;

+ 35 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/dto/UpdateUserValidDTO.java

@@ -0,0 +1,35 @@
+package cn.seecoder.seecoderportalserver.web.rest.dto;
+
+/**
+ * @author kunduin
+ */
+public class UpdateUserValidDTO {
+
+    private Long id;
+
+    private Boolean isValid;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Boolean getValid() {
+        return isValid;
+    }
+
+    public void setValid(Boolean valid) {
+        isValid = valid;
+    }
+
+    @Override
+    public String toString() {
+        return "UpdateTeacherStateDTO{" +
+                "id=" + id +
+                ", isValid=" + isValid +
+                '}';
+    }
+}