Просмотр исходного кода

feat: 用户功能迁移完毕

待测试
370774330@qq.com 5 лет назад
Родитель
Сommit
a7dd23efc2

+ 5 - 0
web/pom.xml

@@ -79,6 +79,11 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.4</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 94 - 0
web/src/main/java/seecoder/devcloud/web/dao/InsertUpdateSqlProvider.java

@@ -0,0 +1,94 @@
+package seecoder.devcloud.web.dao;
+
+import org.apache.ibatis.jdbc.SQL;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/1
+ * @description: 帮助快速写插入和更新的,注意 pojo类的字段要和数据库表对应
+ */
+public class InsertUpdateSqlProvider {
+    public static String insert(Object obj) {
+        Map<String, String> map;
+        try {
+            map = getFieldsMap(obj, true);
+        } catch (IllegalArgumentException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+        return new SQL() {
+            {
+                INSERT_INTO(getTableName(obj));
+                for (String col : map.keySet()) {
+                    VALUES(col, map.get(col));
+                }
+            }
+        }.toString();
+    }
+
+    private static String updateById(Object obj, boolean includeNullValueField) {
+        Map<String, String> map;
+        try {
+            map = getFieldsMap(obj, includeNullValueField);
+            map.remove("id");
+        } catch (IllegalArgumentException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+        return new SQL() {
+            {
+                UPDATE(getTableName(obj));
+                for (String col : map.keySet()) {
+                    SET(col + "=" + map.get(col));
+                }
+                WHERE("id = #{id}");
+            }
+        }.toString();
+    }
+
+    public static String updateById(Object obj) {
+        return updateById(obj, true);
+    }
+
+    public static String updateNonNullById(Object obj) {
+        return updateById(obj, false);
+    }
+
+    private static Map<String, String> getFieldsMap(Object obj, boolean includeNullValue)
+            throws IllegalArgumentException, IllegalAccessException {
+        HashMap<String, String> result = new HashMap<>();
+        Class<?> cls = obj.getClass();
+        Field[] fields = cls.getDeclaredFields(); // getDeclaredFields
+        for (Field f : fields) {
+            String col = f.getName();
+            String colName = col.substring(0, 1).toUpperCase() + col.substring(1);
+            f.setAccessible(true);
+            try {
+                cls.getMethod("get" + colName);
+                cls.getMethod("set" + colName, f.getType());
+            } catch (NoSuchMethodException | SecurityException e) {
+                continue;
+            }
+            if ((!"id".equals(col) && includeNullValue) || f.get(obj) != null) {
+                result.put(camelCase2Underscore(col), "#{" + col + "}");
+            }
+        }
+        return result;
+    }
+
+    public static String getTableName(Object obj) {
+        return camelCase2Underscore(obj.getClass().getSimpleName());
+    }
+
+    public static String camelCase2Underscore(String s) {
+        StringBuffer buf = new StringBuffer();
+        for (String w : s.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")) {
+            buf.append("_").append(w.toLowerCase());
+        }
+        return buf.substring(1);
+    }
+
+}

+ 0 - 33
web/src/main/java/seecoder/devcloud/web/dao/user/UserDAO.java

@@ -1,33 +0,0 @@
-package seecoder.devcloud.web.dao.user;
-
-
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import seecoder.devcloud.web.enums.UserIdentity;
-import seecoder.devcloud.web.po.user.User;
-
-import java.util.List;
-
-
-
-public interface UserDAO {
-	User findById(int id);
-
-	User findByUsername(String username);
-
-	User findByEmail(String email);
-
-	Page<User> findAllByUsernameLike(String search, Pageable pageable);
-
-	Integer countByRole(UserIdentity role);
-
-	User findUserByUsername(String username);
-
-	User findUserById(Integer id);
-
-	User findByPid(Integer pid);
-
-	User findByPhone(String phone);
-
-	List<User> findByRole(UserIdentity userIdentity);
-}

+ 42 - 0
web/src/main/java/seecoder/devcloud/web/dao/user/UserMapper.java

@@ -0,0 +1,42 @@
+package seecoder.devcloud.web.dao.user;
+
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.Query;
+import seecoder.devcloud.web.dao.InsertUpdateSqlProvider;
+import seecoder.devcloud.web.enums.UserIdentity;
+import seecoder.devcloud.web.po.user.User;
+
+import java.util.List;
+
+
+@Mapper
+public interface UserMapper {
+
+	@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
+	@SelectKey(statement = "select LAST_INSERT_KEY()", keyProperty = "id", before = false, resultType = Long.class)
+	@InsertProvider(type = InsertUpdateSqlProvider.class, method = "insert")
+	int insert(User user);
+
+	@UpdateProvider(type= InsertUpdateSqlProvider.class, method="updateById")
+	int updateById(Object bean);
+
+	@Delete("delete from user where id = #{id}")
+	int delete(User user);
+
+
+	@Select("select * from user where id = #{id}")
+	User findById(int id);
+
+	@Select("select * from user where username = #{username}")
+	User findByUsername(String username);
+
+	@Select("select * from user where email = #{email}")
+	User findByEmail(String email);
+
+	@Select("select * from user where email = #{email}")
+	Page<User> findAllByUsernameLike(String search, Pageable pageable);
+
+}

+ 1 - 4
web/src/main/java/seecoder/devcloud/web/po/user/User.java

@@ -4,6 +4,7 @@ package seecoder.devcloud.web.po.user;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
+import org.apache.ibatis.annotations.Select;
 import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 import org.springframework.data.annotation.CreatedDate;
@@ -24,10 +25,6 @@ public class User {
 
 	private String nickname="";
 
-	private String bio="";
-
-	private Integer pid;
-
 	private String password;
 
 	private String phone;

+ 36 - 36
web/src/main/java/seecoder/devcloud/web/service/impl/user/UserServiceImpl.java

@@ -6,8 +6,6 @@ import org.gitlab4j.api.GitLabApiException;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,11 +17,11 @@ import seecoder.devcloud.common.exceptions.Asserts;
 import seecoder.devcloud.common.exceptions.InvalidRequestException;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.common.util.ToolKit;
-import seecoder.devcloud.web.dao.user.UserDAO;
+import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.vo.user.ChangePasswordVO;
 import seecoder.devcloud.web.vo.user.RegisterVO;
 
-import seecoder.devcloud.web.dto.user.UserDTO;
+import seecoder.devcloud.web.vo.user.UserDTO;
 import seecoder.devcloud.web.enums.UserIdentity;
 import seecoder.devcloud.web.po.user.User;
 import seecoder.devcloud.web.vo.user.UserSerializer;
@@ -35,19 +33,20 @@ import seecoder.devcloud.web.vo.user.UserVO;
 public class UserServiceImpl implements UserService {
 	private static final Sort PAGE_SORT = Sort.by(Sort.Direction.ASC, "id");
 
-	private final UserDAO userDAO;
+	private final UserMapper userMapper;
 	private final MailService mailService;
 	private final GitlabApi gitlabApi;
 	private final JenkinsApi jenkinsApi;
 
 	@Autowired
-	public UserServiceImpl(UserDAO userDAO, MailService mailService, GitlabApi gitlabApi, JenkinsApi jenkinsApi) {
-		this.userDAO = userDAO;
+	public UserServiceImpl(UserMapper userMapper, MailService mailService, GitlabApi gitlabApi, JenkinsApi jenkinsApi) {
+		this.userMapper = userMapper;
 		this.mailService = mailService;
 		this.gitlabApi = gitlabApi;
 		this.jenkinsApi = jenkinsApi;
 	}
 
+
 	@Override
 	@Transactional
 	public UserVO create(UserDTO userDTO) throws ServiceException {
@@ -57,9 +56,9 @@ public class UserServiceImpl implements UserService {
 	@Override
 	@Transactional
 	public User register(String username, String name, String email, String password, String phone, UserIdentity role, Integer pid) throws ServiceException {
-		User user = userDAO.findByUsername(username);
+		User user = userMapper.findByUsername(username);
 		Asserts.isNull(user, "用户名已被使用!");
-		user = userDAO.findByEmail(email);
+		user = userMapper.findByEmail(email);
 		Asserts.isNull(user, "邮箱已被使用!");
 		String realPassword = password == null ? ToolKit.randomPassword() : password;
 		GitlabUser gitlabUser;
@@ -77,10 +76,9 @@ public class UserServiceImpl implements UserService {
 		user.setUsername(username);
 		user.setEmail(email);
 		user.setPassword(DigestUtils.sha256Hex(realPassword));
-		user.setPid(pid);
 		user.setPhone(phone);
 		user.setRole(role);
-		user = userDAO.save(user);
+		userMapper.insert(user);
 		if (password == null) {
 			mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
 		}
@@ -89,19 +87,21 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public Page<UserVO> retrievePage(int page, int limit, String search) {
-		Pageable pageable = PageRequest.of(page, limit, PAGE_SORT);
-		Page<User> pageResult;
-		if (search == null || search.isEmpty()) {
-			pageResult = userDAO.findAll(pageable);
-		} else {
-			pageResult = userDAO.findAllByUsernameLike("%" + search + "%", pageable);
-		}
-		return pageResult.map(UserVO::new);
+		//todo 看下分页怎么写
+//		Pageable pageable = PageRequest.of(page, limit, PAGE_SORT);
+//		Page<User> pageResult;
+//		if (search == null || search.isEmpty()) {
+//			pageResult = userMapper.findAll(pageable);
+//		} else {
+//			pageResult = userMapper.findAllByUsernameLike("%" + search + "%", pageable);
+//		}
+//		return pageResult.map(UserVO::new);
+		return null;
 	}
 
 	@Override
 	public UserVO retrieve(int userId) throws ServiceException {
-		User user = userDAO.findById(userId);
+		User user = userMapper.findById(userId);
 		Asserts.notNull(user, "所选用户不存在");
 		return new UserVO(user);
 	}
@@ -109,7 +109,7 @@ public class UserServiceImpl implements UserService {
 	@Override
 	@Transactional
 	public void delete(int userId) throws ServiceException {
-		User user = userDAO.findById(userId);
+		User user = userMapper.findById(userId);
 		Assert.notNull(user, "找不到要删除的用户");
 		Assert.isTrue(user.getRole() == UserIdentity.STUDENT, "目标用户只能是学生");
 		try {
@@ -118,7 +118,7 @@ public class UserServiceImpl implements UserService {
 			throw new ServiceException("删除GitLab用户时发生异常[" + e.getMessage() + "]");
 		}
 		//todo 删除用户需要连带删除什么
-		userDAO.delete(user);
+		userMapper.delete(user);
 	}
 
 	@Override
@@ -132,9 +132,9 @@ public class UserServiceImpl implements UserService {
 		return new UserSerializer(register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.TEACHER));
 	}
 	private UserVO register(String username, String email, String password, String nickname,UserIdentity role) throws ServiceException {
-		User user = userDAO.findByUsername(username);
+		User user = userMapper.findByUsername(username);
 		Asserts.isNull(user, "用户名已被使用!");
-		user = userDAO.findByEmail(email);
+		user = userMapper.findByEmail(email);
 		Asserts.isNull(user, "邮箱已被使用!");
 		String realPassword = password == null ? ToolKit.randomPassword() : password;
 		GitlabUser gitlabUser;
@@ -153,7 +153,8 @@ public class UserServiceImpl implements UserService {
 		user.setEmail(email);
 		user.setPassword(DigestUtils.sha256Hex(realPassword));
 		user.setRole(role);
-		final UserVO userVO = new UserVO(userDAO.save(user));
+		userMapper.insert(user);
+		final UserVO userVO = new UserVO(user);
 		if (password == null) {
 			mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
 		}
@@ -163,27 +164,25 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public UserSerializer getUserById(Integer userid) {
-		return new UserSerializer(userDAO.getOne(userid));
+		return new UserSerializer(userMapper.findById(userid));
 	}
 
 	@Override
 	public UserSerializer changeUserInfo(Integer userid,String nickName, String bio) throws ServiceException {
-		User one = userDAO.findById(userid).orElse(null);
+		User one = userMapper.findById(userid);
 		if (one == null) {
 			throw new ServiceException("用户不存在");
 		}
 		if(nickName!=null){
 			one.setNickname(nickName);
 		}
-		if(bio!=null){
-			one.setBio(bio);
-		}
-		return new UserSerializer(userDAO.save(one));
+		userMapper.updateById(one);
+		return new UserSerializer(one);
 	}
 
 	@Override
 	public UserSerializer changeUserPassword(Integer userid,String oldPassword, String newPassword) throws ServiceException {
-		User one = userDAO.findById(userid).orElse(null);
+		User one = userMapper.findById(userid);
 		if (one == null) {
 			throw new ServiceException("用户不存在");
 		}
@@ -198,12 +197,13 @@ public class UserServiceImpl implements UserService {
 			throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");
 		}
 		mailService.send( "您的新密码为"+newPassword,"密码变更提醒 | SEECODER",one.getEmail());
-		return new UserSerializer(userDAO.save(one));
+		userMapper.updateById(one);
+		return new UserSerializer(one);
 	}
 
 	@Override
 	public void changePassword(int userId, ChangePasswordVO form) throws ServiceException {
-		User user = userDAO.findById(userId);
+		User user = userMapper.findById(userId);
 		if (!user.getPassword().equals(DigestUtils.sha256Hex(form.getOrigin()))) {
 			throw new InvalidRequestException("原密码验证失败,如忘记密码请联系管理员重置");
 		}
@@ -212,7 +212,7 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public void resetPassword(int userId) throws ServiceException {
-		User user = userDAO.findById(userId);
+		User user = userMapper.findById(userId);
 		Asserts.notNull(user, "所选用户不存在");
 		String password = ToolKit.randomPassword();
 		changePassword(user, password, true);
@@ -227,7 +227,7 @@ public class UserServiceImpl implements UserService {
 			throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");
 		}
 		user.setPassword(DigestUtils.sha256Hex(password));
-		user = userDAO.save(user);
+		userMapper.updateById(user);
 		if (reset) {
 			mailService.send( "您的新密码为"+password,"密码变更提醒 | SEECODER",user.getEmail());
 		}

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/service/user/UserService.java

@@ -6,7 +6,7 @@ import seecoder.devcloud.common.exceptions.ServiceException;
 
 import seecoder.devcloud.web.vo.user.ChangePasswordVO;
 import seecoder.devcloud.web.vo.user.RegisterVO;
-import seecoder.devcloud.web.dto.user.UserDTO;
+import seecoder.devcloud.web.vo.user.UserDTO;
 import seecoder.devcloud.web.enums.UserIdentity;
 import seecoder.devcloud.web.po.user.User;
 import seecoder.devcloud.web.vo.user.UserSerializer;

+ 2 - 2
web/src/main/java/seecoder/devcloud/web/dto/user/UserDTO.java → web/src/main/java/seecoder/devcloud/web/vo/user/UserDTO.java

@@ -1,9 +1,9 @@
-package seecoder.devcloud.web.dto.user;
+package seecoder.devcloud.web.vo.user;
 
-import com.moekr.moocoder.util.enums.UserIdentity;
 import lombok.Data;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
+import seecoder.devcloud.web.enums.UserIdentity;
 
 import javax.validation.constraints.Email;
 import javax.validation.constraints.NotNull;

+ 3 - 3
web/src/main/resources/application-wph.yml

@@ -25,7 +25,8 @@ seecoder:
     host: gitlab.192.168.99.105.nip.io
     webHookProxy: http://localhost:3000
     token: wXDeETv2Kmt-JhiApJ9H
-
+  mail:
+    from: seecoder@163.com
 
 
   jenkins:
@@ -34,8 +35,7 @@ seecoder:
     token: 11d7b9e4c1acac481904c25813e2ec1f0a
   docker:
     registry: 192.168.68.79:18082
-  mail:
-    from: seecoder@163.com
+
 
 
   registry: