Jelajahi Sumber

test: userservice的测试

370774330@qq.com 5 tahun lalu
induk
melakukan
023e7905b3

+ 2 - 1
api/pom.xml

@@ -51,7 +51,8 @@
         <dependency>
             <groupId>org.gitlab4j</groupId>
             <artifactId>gitlab4j-api</artifactId>
-            <version>4.8.7</version>
+            <version>4.15.7</version>
+<!--            <version>4.8.7</version>-->
         </dependency>
         <dependency>
             <groupId>com.offbytwo.jenkins</groupId>

+ 1 - 1
api/src/main/java/seecoder/devcloud/api/ApplicationProperties.java

@@ -38,7 +38,7 @@ public class ApplicationProperties {
 	@Data
 	public static class Gitlab {
 
-		@URL
+		//@URL todo 测试环境没有真实host,先注释,生产环境需要还原
 		@NotEmpty
 		private String host;
 

+ 3 - 1
api/src/main/java/seecoder/devcloud/api/gitlab/impl/GitlabApiImpl.java

@@ -178,7 +178,9 @@ public class GitlabApiImpl implements GitlabApi {
     @Override
     public synchronized void changePassword(int userId, String password) throws GitLabApiException {
         User user = server.getUserApi().getUser(userId);
-        server.getUserApi().modifyUser(user, password, user.getProjectsLimit());
+        //server.getUserApi().modifyUser(user, password, user.getProjectsLimit());
+        server.getUserApi().updateUser(user, password);
+        server.getUserApi().changeCustomAttribute(user, password);
     }
 
     @Override

+ 1 - 3
core/src/main/java/seecoder/devcloud/core/CoreApplication.java

@@ -4,7 +4,6 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
-import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -20,8 +19,7 @@ import java.util.TimeZone;
 @ComponentScan({"seecoder.devcloud.api","seecoder.devcloud.common"})
 @SpringBootApplication(exclude = {
         DataSourceAutoConfiguration.class,
-        DataSourceTransactionManagerAutoConfiguration.class,
-        HibernateJpaAutoConfiguration.class})
+        DataSourceTransactionManagerAutoConfiguration.class})
 public class CoreApplication {
 
     public static void main(String[] args) {

+ 9 - 4
web/pom.xml

@@ -41,10 +41,6 @@
             <artifactId>api</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-jdbc</artifactId>
@@ -83,6 +79,14 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-security</artifactId>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>
@@ -115,6 +119,7 @@
                 <version>2.3.4.RELEASE</version>
                 <configuration>
                     <mainClass>seecoder.devcloud.web.devcloudWebApplication</mainClass>
+                    <!--  todo 打包时需排除一些无法回滚的测试类  -->
                 </configuration>
                 <executions>
                     <execution>

+ 5 - 2
web/src/main/java/seecoder/devcloud/web/DevcloudWebApplication.java

@@ -3,9 +3,11 @@ package seecoder.devcloud.web;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import java.time.ZoneId;
 import java.util.TimeZone;
@@ -13,9 +15,10 @@ import java.util.TimeZone;
 
 @EnableScheduling
 @EnableAsync
-@SpringBootApplication
+@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})
 @ComponentScan({"seecoder.devcloud.api","seecoder.devcloud.common","seecoder.devcloud.web"})
-@MapperScan("seecoder.devcloud.web.dao")
+@MapperScan(basePackages = {"seecoder.devcloud.web.dao"})
+@EnableTransactionManagement //开始事务
 public class DevcloudWebApplication {
 
     public static void main(String[] args) {

+ 5 - 1
web/src/main/java/seecoder/devcloud/web/dao/InsertUpdateSqlProvider.java

@@ -15,12 +15,15 @@ import java.util.Map;
 public class InsertUpdateSqlProvider {
     public static String insert(Object obj) {
         Map<String, String> map;
+
         try {
             map = getFieldsMap(obj, true);
+            // 创建 需要赋当前的时间的timestamp字段 在这里排除,否则无法正常赋值
+            map.remove("created_at");
         } catch (IllegalArgumentException | IllegalAccessException e) {
             throw new RuntimeException(e);
         }
-        return new SQL() {
+        String test = new SQL() {
             {
                 INSERT_INTO(getTableName(obj));
                 for (String col : map.keySet()) {
@@ -28,6 +31,7 @@ public class InsertUpdateSqlProvider {
                 }
             }
         }.toString();
+        return test;
     }
 
     private static String updateById(Object obj, boolean includeNullValueField) {

+ 3 - 5
web/src/main/java/seecoder/devcloud/web/dao/user/UserMapper.java

@@ -4,19 +4,17 @@ 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)
+	/**
+	 * 这里的id是取自gitlab的用户id,所以不需要自增和回填
+	 */
 	@InsertProvider(type = InsertUpdateSqlProvider.class, method = "insert")
 	int insert(User user);
 

+ 16 - 5
web/src/main/java/seecoder/devcloud/web/po/user/User.java

@@ -1,10 +1,12 @@
 package seecoder.devcloud.web.po.user;
 
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.type.Alias;
 import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 import org.springframework.data.annotation.CreatedDate;
@@ -12,6 +14,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 import seecoder.devcloud.web.enums.UserIdentity;
 
 import javax.persistence.*;
+import java.sql.Timestamp;
 import java.time.LocalDateTime;
 import java.util.HashSet;
 import java.util.Set;
@@ -19,6 +22,9 @@ import java.util.Set;
 @Data
 public class User {
 
+	/**
+	 * 注意用户id并非由此后端数据库生成,而是gitlab创建后填入,以确保两者的关联性的正确
+	 */
 	private Integer id;
 
 	private String username;
@@ -31,12 +37,17 @@ public class User {
 
 	private String email;
 
-	private Integer namespace;
-
-	private String token;
-
 	private UserIdentity role;
 
-	private LocalDateTime createdAt;
+	private Timestamp createdAt;
 
+	/**
+	 * 这个属性来自于gitlab
+	 */
+	private Integer namespace;
+
+	/**
+	 * 这个属性来自于gitlab
+	 */
+	private String token;
 }

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

@@ -5,7 +5,6 @@ import org.apache.commons.codec.digest.DigestUtils;
 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.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -21,13 +20,11 @@ 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.vo.user.UserDTO;
 import seecoder.devcloud.web.enums.UserIdentity;
 import seecoder.devcloud.web.po.user.User;
-import seecoder.devcloud.web.vo.user.UserSerializer;
+import seecoder.devcloud.web.vo.user.UserVO;
 import seecoder.devcloud.web.service.user.MailService;
 import seecoder.devcloud.web.service.user.UserService;
-import seecoder.devcloud.web.vo.user.UserVO;
 
 @Service
 public class UserServiceImpl implements UserService {
@@ -46,16 +43,19 @@ public class UserServiceImpl implements UserService {
 		this.jenkinsApi = jenkinsApi;
 	}
 
-
 	@Override
 	@Transactional
-	public UserVO create(UserDTO userDTO) throws ServiceException {
-		return register(userDTO.getUsername(), userDTO.getEmail(), null,userDTO.getNickname(), userDTO.getRole());
+	public UserVO register(RegisterVO form) throws ServiceException {
+		return register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.STUDENT);
 	}
 
 	@Override
 	@Transactional
-	public User register(String username, String name, String email, String password, String phone, UserIdentity role, Integer pid) throws ServiceException {
+	public UserVO registerTeacher(RegisterVO form) throws ServiceException {
+		return 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 = userMapper.findByUsername(username);
 		Asserts.isNull(user, "用户名已被使用!");
 		user = userMapper.findByEmail(email);
@@ -65,45 +65,26 @@ public class UserServiceImpl implements UserService {
 		try {
 			gitlabUser = gitlabApi.createUser(username, email, realPassword);
 		} catch (GitLabApiException e) {
+			e.printStackTrace();
 			throw new ServiceException("创建GitLab用户时发生异常[" + e.getMessage() + "]");
 		}
 		user = new User();
 		BeanUtils.copyProperties(gitlabUser, user);
-		if(name!=null){
-			user.setNickname(name);
+		if(nickname!=null){
+			user.setNickname(nickname);
 		}
 
 		user.setUsername(username);
 		user.setEmail(email);
+		//在gitlab注册后,直接加密
 		user.setPassword(DigestUtils.sha256Hex(realPassword));
-		user.setPhone(phone);
 		user.setRole(role);
 		userMapper.insert(user);
+		final UserVO userVO = new UserVO(user);
 		if (password == null) {
 			mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
 		}
-		return user;
-	}
-
-	@Override
-	public Page<UserVO> retrievePage(int page, int limit, String search) {
-		//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 = userMapper.findById(userId);
-		Asserts.notNull(user, "所选用户不存在");
-		return new UserVO(user);
+		return userVO;
 	}
 
 	@Override
@@ -122,106 +103,41 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	@Transactional
-	public UserSerializer register(RegisterVO form) throws ServiceException {
-		return new UserSerializer(register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.STUDENT));
-	}
-	@Override
-	@Transactional
-	public UserSerializer registerTeacher(RegisterVO form) throws ServiceException {
-		return new UserSerializer(register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.TEACHER));
+	public UserVO getUserById(Integer userid) {
+		return new UserVO(userMapper.findById(userid));
 	}
-	private UserVO register(String username, String email, String password, String nickname,UserIdentity role) throws ServiceException {
-		User user = userMapper.findByUsername(username);
-		Asserts.isNull(user, "用户名已被使用!");
-		user = userMapper.findByEmail(email);
-		Asserts.isNull(user, "邮箱已被使用!");
-		String realPassword = password == null ? ToolKit.randomPassword() : password;
-		GitlabUser gitlabUser;
-		try {
-			gitlabUser = gitlabApi.createUser(username, email, realPassword);
-		} catch (GitLabApiException e) {
-			throw new ServiceException("创建GitLab用户时发生异常[" + e.getMessage() + "]");
-		}
-		user = new User();
-		BeanUtils.copyProperties(gitlabUser, user);
-		if(nickname!=null){
-			user.setNickname(nickname);
-		}
-
-		user.setUsername(username);
-		user.setEmail(email);
-		user.setPassword(DigestUtils.sha256Hex(realPassword));
-		user.setRole(role);
-		userMapper.insert(user);
-		final UserVO userVO = new UserVO(user);
-		if (password == null) {
-			mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
-		}
-		return userVO;
-	}
-
 
 	@Override
-	public UserSerializer getUserById(Integer userid) {
-		return new UserSerializer(userMapper.findById(userid));
-	}
-
-	@Override
-	public UserSerializer changeUserInfo(Integer userid,String nickName, String bio) throws ServiceException {
+	public UserVO changeUserInfo(Integer userid, String nickName) throws ServiceException {
 		User one = userMapper.findById(userid);
 		if (one == null) {
 			throw new ServiceException("用户不存在");
 		}
-		if(nickName!=null){
-			one.setNickname(nickName);
-		}
+		one.setNickname(nickName);
 		userMapper.updateById(one);
-		return new UserSerializer(one);
-	}
-
-	@Override
-	public UserSerializer changeUserPassword(Integer userid,String oldPassword, String newPassword) throws ServiceException {
-		User one = userMapper.findById(userid);
-		if (one == null) {
-			throw new ServiceException("用户不存在");
-		}
-		if(!one.getPassword().equals(DigestUtils.sha256Hex(oldPassword))){
-			throw new ServiceException("原密码错误");
-		}else{
-			one.setPassword(DigestUtils.sha256Hex(newPassword));
-		}
-		try {
-			gitlabApi.changePassword(userid, newPassword);
-		} catch (GitLabApiException e) {
-			throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");
-		}
-		mailService.send( "您的新密码为"+newPassword,"密码变更提醒 | SEECODER",one.getEmail());
-		userMapper.updateById(one);
-		return new UserSerializer(one);
+		return new UserVO(one);
 	}
 
 	@Override
 	public void changePassword(int userId, ChangePasswordVO form) throws ServiceException {
 		User user = userMapper.findById(userId);
+
 		if (!user.getPassword().equals(DigestUtils.sha256Hex(form.getOrigin()))) {
 			throw new InvalidRequestException("原密码验证失败,如忘记密码请联系管理员重置");
 		}
 		changePassword(user, form.getPassword(), false);
 	}
 
-	@Override
-	public void resetPassword(int userId) throws ServiceException {
-		User user = userMapper.findById(userId);
-		Asserts.notNull(user, "所选用户不存在");
-		String password = ToolKit.randomPassword();
-		changePassword(user, password, true);
-	}
-
-
-
 	private void changePassword(User user, String password, boolean reset) throws ServiceException {
 		try {
+			/**
+			 * todo 修改密码容易导致gitlab与devcloud不一致
+			 * 管理员每次修改密码,会导致下次普通用户登陆gitlab的时候强制重新改密码
+			 * 如果这时候学生在gitlab那边改的密码与这里改的不一样,就产生了密码不一致的结果
+			 * 而且目前官方gitlab client api不支持普通用户通过api改密码
+			 * 见 https://docs.gitlab.com/ce/api/users.html
+			 * 所以这个bug暂时无解,最好是让学生建立用户完毕之后不要乱改密码
+			 */
 			gitlabApi.changePassword(user.getId(), password);
 		} catch (GitLabApiException e) {
 			throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");

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

@@ -15,7 +15,7 @@ import java.util.List;
  * @Author sheen
  * @Date 2019/1/9
  * @Version 1.0
- * @Description //TODO
+ * @Description
  **/
 public interface GroupService {
     GroupVO createGroup(String name, Integer courseId, CustomUserDetails userDetails) throws EntityNotFoundException;

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

@@ -1,39 +1,28 @@
 package seecoder.devcloud.web.service.user;
 
 
-import org.springframework.data.domain.Page;
 import seecoder.devcloud.common.exceptions.ServiceException;
 
 import seecoder.devcloud.web.vo.user.ChangePasswordVO;
 import seecoder.devcloud.web.vo.user.RegisterVO;
-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;
 import seecoder.devcloud.web.vo.user.UserVO;
 
 public interface UserService {
-	UserVO create(UserDTO userDTO) throws ServiceException;
 
-	User register(String username, String name, String email, String password, String phone, UserIdentity role, Integer pid) throws ServiceException;
+	UserVO register(RegisterVO form) throws ServiceException;
 
-	Page<UserVO> retrievePage(int page, int limit, String search) throws ServiceException;
-
-	UserVO retrieve(int userId) throws ServiceException;
+	/**
+	 * 暂时没这个需求,先保留
+	 */
+	@Deprecated
+	UserVO registerTeacher(RegisterVO form) throws ServiceException;
 
 	void delete(int userId) throws ServiceException;
 
-	UserSerializer register(RegisterVO form) throws ServiceException;
+	UserVO getUserById(Integer userid);
 
-	UserSerializer registerTeacher(RegisterVO form) throws ServiceException;
+	UserVO changeUserInfo(Integer userid, String nickName) throws ServiceException;
 
 	void changePassword(int userId, ChangePasswordVO form) throws ServiceException;
 
-	void resetPassword(int userId) throws ServiceException;
-
-	UserSerializer getUserById(Integer userid);
-
-	UserSerializer changeUserInfo(Integer userid,String nickName, String bio) throws ServiceException;
-
-	UserSerializer changeUserPassword(Integer userid,String oldPassword, String newPassword) throws ServiceException;
 }

+ 6 - 1
web/src/main/java/seecoder/devcloud/web/vo/user/ChangePasswordVO.java

@@ -1,5 +1,6 @@
 package seecoder.devcloud.web.vo.user;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import seecoder.devcloud.common.validate.FieldEquals;
 
@@ -7,12 +8,16 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
 @Data
-@FieldEquals(firstField = "password", secondField = "confirm", message = "两次输入的密码不一致!")
+@FieldEquals(firstField = "password", secondField = "confirm", message = "两次输入的新密码不一致!")
+@AllArgsConstructor
 public class ChangePasswordVO {
 	@NotNull(message = "请填写原密码!")
 	private String origin;
 	@Pattern(regexp = "[0-9a-zA-Z_]{8,16}", message = "密码只能包含大小写字母、数字和下划线,且必须为8-16位!")
 	@NotNull(message = "请填写新密码!")
 	private String password;
+	/**
+	 * 新密码要输入两遍,做确认
+	 */
 	private String confirm;
 }

+ 2 - 3
web/src/main/java/seecoder/devcloud/web/vo/user/GroupVO.java

@@ -5,7 +5,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @EnumName GroupVO
@@ -22,14 +21,14 @@ public class GroupVO {
     private Integer id;
     private String name;
     private String code;
-    private List<UserSerializer> members;
+    private List<UserVO> members;
 
 //    public GroupVO(Group group) {
 //        this.id=group.getId();
 //        this.name=group.getName();
 //        this.code=group.getShareLink();
 //        this.members=group.getMembers().stream()
-//                .map(UserSerializer::new)
+//                .map(UserVO::new)
 //                .collect(Collectors.toList());
 //    }
 

+ 4 - 0
web/src/main/java/seecoder/devcloud/web/vo/user/RegisterVO.java

@@ -1,6 +1,8 @@
 package seecoder.devcloud.web.vo.user;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -11,6 +13,8 @@ import javax.validation.constraints.Pattern;
 
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class RegisterVO {
 	//@Email(message = "用户名也要填邮箱名称!")
 	@NotNull(groups = {PostMapping.class},message = "请填写用户名!")

+ 0 - 36
web/src/main/java/seecoder/devcloud/web/vo/user/UserSerializer.java

@@ -1,36 +0,0 @@
-package seecoder.devcloud.web.vo.user;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.springframework.beans.BeanUtils;
-import seecoder.devcloud.web.enums.UserIdentity;
-import seecoder.devcloud.web.po.user.User;
-import seecoder.devcloud.web.vo.user.UserVO;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class UserSerializer {
-    private Integer id;
-    private UserIdentity role;
-    @JsonIgnore
-    private String username;
-    private String nickname;
-    private String bio;
-    @JsonProperty("username")
-    private String email;
-    public UserSerializer(User user) {
-        this.id=user.getId();
-        this.role=user.getRole();
-        this.username=user.getUsername();
-        this.nickname=user.getNickname();
-        this.email=user.getEmail();
-
-    }
-    public UserSerializer(UserVO user) {
-        BeanUtils.copyProperties(user,this);
-    }
-}

+ 17 - 25
web/src/main/java/seecoder/devcloud/web/vo/user/UserVO.java

@@ -2,39 +2,31 @@ package seecoder.devcloud.web.vo.user;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import seecoder.devcloud.common.serializer.TimestampLocalDateTimeSerializer;
 import seecoder.devcloud.web.enums.UserIdentity;
 import seecoder.devcloud.web.po.user.User;
 
+import java.sql.Timestamp;
 import java.time.LocalDateTime;
 
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class UserVO {
-	private Integer id;
-	private String username;
-	private String email;
-	private UserIdentity role;
-	//nickname : String - 昵称 | [a-zA-Z0-9]{4-16}
-	//bio : String - 用户自我描述 | {0-100}
-	private String nickname;
-	private String bio;
-	@JsonProperty("created_at")
-	@JsonSerialize(using = TimestampLocalDateTimeSerializer.class)
-	private LocalDateTime createdAt;
-
-	private UserVO() {
-		this.id = 0;
-		this.username = "管理员";
-		this.bio="bio : String - 用户自我描述 | {0-100}";
-	}
-
-	public UserVO(User user) {
-		BeanUtils.copyProperties(user, this);
-	}
-
-	public static final UserVO ADMIN = new UserVO();
+    private Integer id;
+    private UserIdentity role;
+    private String username;
+    private String nickname;
+    private String email;
+    private String phone;
+    @JsonProperty("created_at")
+    private Timestamp createdAt;
+
+    public UserVO(User user) {
+        BeanUtils.copyProperties(user,this);
+    }
 }

+ 6 - 4
web/src/main/resources/application-wph.yml

@@ -1,8 +1,8 @@
 spring:
   datasource:
-    url: jdbc:mysql://192.168.99.105:30006/seecoder?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
+    url: jdbc:mysql://192.168.99.105:30006/devcloud?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
     username: root
-    password: 123456
+    password: root
 
   mail:
     host: smtp.qq.com
@@ -11,7 +11,9 @@ spring:
 server:
   port: 8080
 
-
+mybatis:
+  configuration:
+    map-underscore-to-camel-case: true
 
 seecoder:
   k8s:
@@ -19,7 +21,7 @@ seecoder:
     token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjBmSXc4RlRjNUpBYVpGYWc4QzRDY1MzUWJad1JMdFhKcDI1cngzWGtiRlkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZXZjbG91ZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLXNicXY4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NmIxNzU1ZS0zZjE3LTQ1ZTctODFmYi01MTRhODA3NDRhMzQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGV2Y2xvdWQ6ZGVmYXVsdCJ9.W0Y1lR6LBi1ZjylBx35YeqYuq2u2AqH-ayK4FD-LDfC26E89DanOwSv9XLrRMnnDBZFS_ZCRBumbnDeMiS5vw2x7-QnrDqj1M5u9FB2fIJsz2LyUkOhATZZmTzj_Uhewvvg09aDKh16ttj6ZX27m-KVk_6MP-VfiuvZnCVxDbqRkRjK-zsor4ty1CEATPyKK-tvugAwS0RFNHUL94DamfZAq_t1PSnH5ZtEHq0uEMZxY2c7j6u9d_aD9lphm_ZpCy_C8OCHfanM21CQPDHlcJTW_aiOO6bAp8qdc1egPO5uIamHl6Zm0N3RkcsRp4DGOHrltTV9y_cGZHXSWmRHfxw
     debugging: true
   gitlab:
-    host: https://gitlab.192.168.99.105.nip.io
+    host: http://gitlab.192.168.99.105.nip.io
     webHookProxy: http://localhost:3000
     token: wXDeETv2Kmt-JhiApJ9H
   mail:

+ 129 - 0
web/src/test/java/seecoder/devcloud/web/service/user/UserServiceTest.java

@@ -0,0 +1,129 @@
+package seecoder.devcloud.web.service.user;
+
+import org.gitlab4j.api.GitLabApi;
+import org.gitlab4j.api.models.AbstractUser;
+import org.junit.Assert;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.junit4.SpringRunner;
+import seecoder.devcloud.api.ApplicationProperties;
+import seecoder.devcloud.common.exceptions.ServiceException;
+import seecoder.devcloud.web.vo.user.ChangePasswordVO;
+import seecoder.devcloud.web.vo.user.RegisterVO;
+import seecoder.devcloud.web.vo.user.UserVO;
+
+import java.util.stream.Collectors;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/2
+ * @description: 与gitlab交互,没有办法配事务,只能手动测试。mvn test的时候请排除这个类
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ComponentScan({"seecoder.devcloud.api","seecoder.devcloud.common","seecoder.devcloud.web"})
+@MapperScan(basePackages = {"seecoder.devcloud.web.dao"})
+class UserServiceTest {
+
+    @Autowired
+    UserService userService;
+
+    @Autowired
+    ApplicationProperties properties;
+
+    /**
+     * 注意 GitlabApi 和 GitLabApi 区别
+     * GitlabApi 是我们对 GitLabApi 的一个小封装
+     * 这里作辅助测试用
+     */
+    GitLabApi gitLabApi;
+
+    @BeforeEach
+    void setUp() {
+        gitLabApi = new GitLabApi(properties.getGitlab().getHost(), properties.getGitlab().getToken());
+    }
+
+    @Test
+    void create() {
+        RegisterVO registerVO = RegisterVO.builder()
+                .username("gfygfytest6")
+                .password("gfygfytest6")
+                .email("3082138856@qq.com")
+                .nickname("kennyday")
+                .build();
+        try {
+            userService.register(registerVO);
+        } catch (ServiceException e){
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    void register() {
+        RegisterVO registerVO = RegisterVO.builder()
+                .username("wphwphtest")
+                .password("wphwphtest")
+                .email("370774330@qq.com")
+                .nickname("kennyday")
+                .build();
+        try {
+            System.out.println(userService.register(registerVO));
+        } catch (ServiceException e){
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    void delete() {
+        try {
+            userService.delete(24);
+            //gitLabApi.getUserApi().deleteUser(20);
+            System.out.println(gitLabApi.getUserApi().getActiveUsers().stream().map(AbstractUser::getId).collect(Collectors.toList()));
+        } catch (Exception e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+
+    }
+
+    @Test
+    void getUserById() {
+        try {
+            UserVO u = userService.getUserById(25);
+            Assert.assertNotNull(u);
+            System.out.println(u);
+        } catch (Exception e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    void changeUserInfo() {
+        try {
+            userService.changeUserInfo(25,"gogoing");
+        } catch (ServiceException e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+
+    @Test
+    void changeUserPassword() {
+        try {
+
+            userService.changePassword(25, new ChangePasswordVO("1234qwer","1234qwer1","1234qwer1"));
+        } catch (ServiceException e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+}