Jelajahi Sumber

feat: "完善代码结构"

Leonezhurui 2 tahun lalu
induk
melakukan
2400370dc7

+ 1 - 2
src/main/java/com/njuzr/eaibackend/config/JWTAuthenticationFilter.java

@@ -1,7 +1,6 @@
 package com.njuzr.eaibackend.config;
 
 import com.njuzr.eaibackend.exception.MyException;
-import com.njuzr.eaibackend.po.MyUserDetails;
 import com.njuzr.eaibackend.service.MyUserDetailService;
 import com.njuzr.eaibackend.utils.JWTTokenUtil;
 import jakarta.servlet.FilterChain;
@@ -45,8 +44,8 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
             log.info("解析出username:" + username);
             UserDetails userDetails = userDetailService.loadUserByUsername(username);
             log.info("解析出UserDetails:" + userDetails);
-            log.info("解析出UserDetails权限:" + userDetails.getAuthorities());
 
+            // 设置principal和权限
             UsernamePasswordAuthenticationToken authentication =
                     new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
             SecurityContextHolder.getContext().setAuthentication(authentication);

+ 1 - 0
src/main/java/com/njuzr/eaibackend/config/MyAuthenticationFailureHandler.java

@@ -14,6 +14,7 @@ import java.io.IOException;
  * @author: Leonezhurui
  * @Date: 2024/2/19 - 23:24
  * @Package: EAI-Backend
+ * 认证失败处理器
  */
 
 public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {

+ 1 - 0
src/main/java/com/njuzr/eaibackend/config/MyAuthenticationSuccessHandler.java

@@ -15,6 +15,7 @@ import java.io.IOException;
  * @author: Leonezhurui
  * @Date: 2024/2/19 - 23:20
  * @Package: EAI-Backend
+ * 认证成功处理器
  */
 
 public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

+ 1 - 3
src/main/java/com/njuzr/eaibackend/config/SecurityConfig.java

@@ -50,9 +50,7 @@ public class SecurityConfig {
     public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
         http
                 .authorizeHttpRequests(authorize -> authorize
-//                                .anyRequest().permitAll() // 允许所有的请求访问
-                        .requestMatchers("/api/user/login").permitAll() // 允许公开访问的路径
-                                .requestMatchers("/api/user/register").permitAll()
+                        .requestMatchers("/api/user/login", "/api/user/register").permitAll() // 允许公开访问的路径
                         .anyRequest().authenticated() // 其他所有请求需要认证
                 )
                 .exceptionHandling(exception -> exception

+ 0 - 1
src/main/java/com/njuzr/eaibackend/exception/MyAuthenticationEntryPoint.java

@@ -30,7 +30,6 @@ public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {
         log.error("认证出错,用户未提供认证信息");
         response.setContentType("application/json;charset=UTF-8");
         response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-        // 以MyResponse的格式返回
         MyResponse myResponse = MyResponse.error(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: " + authException.getMessage());
         response.getWriter().write(mapper.writeValueAsString(myResponse));
     }

+ 1 - 1
src/main/java/com/njuzr/eaibackend/exception/MyException.java

@@ -10,7 +10,7 @@ import lombok.Getter;
 
 @Getter
 public class MyException extends RuntimeException{
-    private int errCode;
+    private final int errCode;
 
     public MyException(int errCode, String errMsg) {
         super(errMsg);

+ 15 - 0
src/main/java/com/njuzr/eaibackend/mapper/UserMapper.java

@@ -17,9 +17,24 @@ import java.util.List;
 @Mapper
 public interface UserMapper extends BaseMapper<User> {
 
+    /**
+     * 通过学号(OfficialNumber)读取用户
+     * @param officialNumber
+     * @return User
+     */
     User selectByOfficialNumber(String officialNumber);
 
+    /**
+     * 用户信息更新
+     * @param user
+     * @return 成功操作的数量,即1是成功,0是失败
+     */
     int updateUser(User user);
 
+    /**
+     * 批量导入用户
+     * @param users 用户列表
+     * @return 成功操作的数量
+     */
     int batchInsert(List<User> users);
 }

+ 2 - 0
src/main/java/com/njuzr/eaibackend/po/MyUserDetails.java

@@ -29,6 +29,7 @@ public class MyUserDetails extends BaseUser implements UserDetails {
 
     @Override
     public Collection<? extends GrantedAuthority> getAuthorities() {
+        // 用户权限
         List<GrantedAuthority> authorities = new ArrayList<>();
         Role role = getRole();
         authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getRole())); // 需要authorities列表之前加上ROLE_前缀
@@ -42,6 +43,7 @@ public class MyUserDetails extends BaseUser implements UserDetails {
 
     @Override
     public String getUsername() {
+        // 在User相关类中没有username字段,此处的username其实就是学号
         return getOfficialNumber();
     }
 

+ 1 - 0
src/main/java/com/njuzr/eaibackend/po/base/BaseUser.java

@@ -10,6 +10,7 @@ import java.util.Date;
  * @author: Leonezhurui
  * @Date: 2024/2/15 - 09:49
  * @Package: EAI-Backend
+ * 基础用户类,是所有User相关类的父类
  */
 
 @Data

+ 8 - 0
src/main/java/com/njuzr/eaibackend/service/EmailService.java

@@ -25,6 +25,14 @@ public class EmailService {
     @Value("${spring.mail.username}")
     private String sourceEmail;
 
+    /**
+     * FIXME 邮箱服务暂时不可用,需要Seecoder的公邮和stmp秘钥
+     * @param to
+     * @param username
+     * @param password
+     * @return
+     * @throws MessagingException
+     */
     public int sendPasswordEmail(String to, String username, String password) throws MessagingException {
         try {
             MimeMessage message = javaMailSender.createMimeMessage();

+ 26 - 1
src/main/java/com/njuzr/eaibackend/service/UserService.java

@@ -18,15 +18,40 @@ import java.util.List;
 
 public interface UserService {
 
+    /**
+     * 创建用户
+     * @param userDTO
+     * @return UserVO
+     */
     UserVO createUser(UserRegisterDTO userDTO);
 
-
+    /**
+     * 通过用户Id找到用户
+     * @param id
+     * @return UserVO
+     */
     UserVO findById(Long id);
 
+    /**
+     * 更新用户信息
+     * @param id
+     * @param userDTO
+     * @return UserVO
+     */
     UserVO updateUser(Long id, UserDTO userDTO);
 
+    /**
+     * 从Excel文件中读取数据,并批量创建用户
+     * @param file
+     * @throws Exception
+     */
     void batchCreateUsersFromExcel(MultipartFile file) throws Exception;
 
+    /**
+     * 从Csv文件中读取数据,并批量创建用户
+     * @param file
+     * @throws Exception
+     */
     void batchCreateUsersFromCsv(MultipartFile file) throws Exception;
 
 }

+ 20 - 2
src/main/java/com/njuzr/eaibackend/service/impl/UserServiceImpl.java

@@ -113,7 +113,6 @@ public class UserServiceImpl implements UserService {
 
     /**
      * 解析文件,批量创建用户。其中,文件必须包含姓名、邮箱、学号。
-     * TODO 完善邮箱服务(需要公邮和stmp秘钥)
      * @param file
      * @return
      */
@@ -146,6 +145,7 @@ public class UserServiceImpl implements UserService {
 
         int res = userMapper.batchInsert(users);
         if (res == 0) throw new MyException(500, "批量创建失败");
+
         processUsers(users);
     }
 
@@ -175,9 +175,16 @@ public class UserServiceImpl implements UserService {
 
         int res = userMapper.batchInsert(users);
         if (res == 0) throw new MyException(500, "批量创建失败");
+
         processUsers(users);
     }
 
+    /**
+     * 在指定Excel Cell中找到具体列名的索引值
+     * @param headerRow
+     * @param columnName
+     * @return
+     */
     private int findColumnIndex(Row headerRow, String columnName) {
         for (Cell cell : headerRow) {
             if (cell.getStringCellValue().trim().equalsIgnoreCase(columnName)) {
@@ -187,6 +194,12 @@ public class UserServiceImpl implements UserService {
         return -1;
     }
 
+    /**
+     * 在csv文件的header中找到具体列的索引值
+     * @param header
+     * @param columnName
+     * @return
+     */
     private int findColumnIndex(String[] header, String columnName) {
         for (int i = 0; i < header.length; i++) {
             if (header[i].trim().equalsIgnoreCase(columnName)) {
@@ -196,6 +209,11 @@ public class UserServiceImpl implements UserService {
         return -1;
     }
 
+    /**
+     * TODO 通过邮箱服务,将初始密码发送给指定邮箱
+     * @param users
+     * @throws MessagingException
+     */
     private void processUsers(List<User> users) throws MessagingException {
         List<String> passwordStage = new ArrayList<>();
         for(User user: users) {
@@ -207,7 +225,7 @@ public class UserServiceImpl implements UserService {
         }
         int res = userMapper.batchInsert(users);
         if (res == 0) throw new MyException(500, "批量创建失败");
-        // TODO 通过邮箱服务,将初始密码发送给指定邮箱
+
         for (int i = 0; i < users.size(); i++) {
             emailService.sendPasswordEmail(users.get(i).getOfficialEmail(), users.get(i).getName(), passwordStage.get(i));
         }

+ 8 - 8
src/main/java/com/njuzr/eaibackend/utils/JWTTokenUtil.java

@@ -15,20 +15,21 @@ import java.util.UUID;
 public class JWTTokenUtil {
 
     @Value("${jwt.secret}")
-    private String secret;
+    private String secret; // token生成秘钥
     @Value("${jwt.issuer}")
-    private String issuer;
+    private String issuer; // 发布人
     @Value("${jwt.expiration}")
-    private String expiration;
+    private String expiration; // 过期时间
 
 
     /**
-            * 根据用户信息生成token
+     * 根据用户信息生成token
+     * @param username
+     * @return token令牌
      */
     public String generateToken(String username) {
-        // 令牌id
-        String uuid = UUID.randomUUID().toString();
-        Date exprireDate = Date.from(Instant.now().plusSeconds(Long.parseLong(expiration)));
+        String uuid = UUID.randomUUID().toString(); // token id
+        Date exprireDate = Date.from(Instant.now().plusSeconds(Long.parseLong(expiration))); // 过期时间
         return Jwts.builder()
                 // 设置头部信息header
                 .header()
@@ -69,7 +70,6 @@ public class JWTTokenUtil {
     }
 
 
-
     /**
      * 判断token是否未失效
      * true表示未失效

+ 2 - 2
src/main/java/com/njuzr/eaibackend/utils/ModelMapperUtil.java

@@ -18,7 +18,7 @@ public class ModelMapperUtil {
         // 私有构造函数,防止实例化
     }
 
-    // 1 ModelMapperUtil.map(user, UserVO.class),将user转换成userVO
+    // 1 将entity转化成outClass类的实例对象
     public static <D, T> D map(final T entity, Class<D> outClass) {
         try {
             return modelMapper.map(entity, outClass);
@@ -28,7 +28,7 @@ public class ModelMapperUtil {
         }
     }
 
-    // 2 ModelMapperUtil.map(user, userVO),将userVO中的字段更新为user的
+    // 2 将source转化成destination对象
     public static <D, T> void map(final T source, D destination) {
         try {
             modelMapper.map(source, destination);

+ 0 - 1
src/main/resources/application.yaml

@@ -12,7 +12,6 @@ spring:
     default-encoding: UTF-8
 
 
-
 jwt:
   # jjwt密钥算法HS256,要求secret长度至少是256位
   secret: xTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguhxTv@UA7e2q$*n&92AHo5Wj$@KAnguh92AHo5Wj$@KAnguh92AHo5Wj$@KAnguh92AHo5Wj$@KAnguh