提交 e4124636 authored 作者: 黄承天's avatar 黄承天

feat(user): 增加了用户相关的登录、查询当前登录用户、登出的RestAPI

上级 bb66acdf
......@@ -29,8 +29,7 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<scope>test</scope>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
......
......@@ -6,6 +6,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* Hello world!
......@@ -13,6 +14,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
* @author matrix
*/
@Slf4j
@EnableSwagger2
@EnableScheduling
@SpringBootApplication
@EntityScan(basePackages = {"org.matrix.remote.entity","org.matrix.local.entity"})
......
package org.matrix.local.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* MetaFieldHandler.
* 元数据处理器,用于处理自动填充的字段
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2021/11/22 at 7:52 下午
*/
@Component
public class MetaFieldHandler implements MetaObjectHandler {
/**
* 创建时设置创建时间
* @param metaObject 数据库原始对象
*/
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
/**
* 更新时设置更新时间
* @param metaObject 数据库原始对象
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
package org.matrix.local.controller;
import com.google.common.collect.ImmutableMap;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.matrix.local.entity.vo.LoginInfo;
import org.matrix.local.entity.vo.UserInfo;
import org.matrix.local.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Api(tags = "用户相关API")
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@ApiOperation("用户登录")
@PostMapping("/login")
public ResponseEntity<Map<String, String>> login(HttpServletRequest request, @RequestBody LoginInfo loginInfo) {
String sessionId = request.getSession().getId();
boolean success = userService.login(loginInfo, sessionId);
if (success) {
return ResponseEntity.ok(ImmutableMap.of("message", "登录成功"));
} else {
return ResponseEntity.ok(ImmutableMap.of("message", "用户名或密码错误"));
}
}
@ApiOperation("查询当前登录用户")
@GetMapping("/login/info")
public ResponseEntity<UserInfo> find(HttpServletRequest request) {
String sessionId = request.getSession().getId();
UserInfo userInfo = userService.findBySessionId(sessionId);
return ResponseEntity.ok(userInfo);
}
@ApiOperation("用户登出")
@GetMapping("/logout")
public ResponseEntity<UserInfo> logout(HttpServletRequest request) {
String sessionId = request.getSession().getId();
UserInfo userInfo = userService.findBySessionId(sessionId);
return ResponseEntity.ok(userInfo);
}
}
package org.matrix.local.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
......@@ -9,7 +8,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* <p>
......@@ -33,22 +31,6 @@ public class Project {
@ApiModelProperty("主键id")
private Long id;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty("数据创建时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty("数据更新时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime updateTime;
@ApiModelProperty("名称")
private String name;
......
package org.matrix.local.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
......@@ -9,7 +8,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* <p>
......@@ -33,22 +31,6 @@ public class User {
@ApiModelProperty("主键id")
private Long id;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty("数据创建时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty("数据更新时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private LocalDateTime updateTime;
@ApiModelProperty("名称")
private String name;
......
package org.matrix.local.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginInfo {
private String account;
private String password;
}
package org.matrix.local.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.matrix.local.entity.Project;
import java.util.List;
/**
* 用户信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
/**
* 主键id
*/
@ApiModelProperty("主键id")
private Long id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("账号")
private String account;
@ApiModelProperty("密码")
private String password;
@ApiModelProperty("与该用户相关的项目")
private List<Project> projects;
}
package org.matrix.local.exception;
import com.google.common.collect.ImmutableMap;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity handle(RuntimeException exception) {
return ResponseEntity.ok(ImmutableMap.of("message", exception.getMessage()));
}
}
package org.matrix.local.service;
public interface IProjectService {
}
package org.matrix.local.service;
public interface IUserService {
}
package org.matrix.local.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.matrix.local.entity.Project;
import org.matrix.local.entity.User;
import org.matrix.local.entity.UserProject;
import org.matrix.local.entity.vo.LoginInfo;
import org.matrix.local.entity.vo.UserInfo;
import org.matrix.local.mapper.ProjectMapper;
import org.matrix.local.mapper.UserMapper;
import org.matrix.local.mapper.UserProjectMapper;
import org.matrix.local.util.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static java.util.Objects.nonNull;
/**
* 用户相关接口
*/
@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private ProjectMapper projectMapper;
@Autowired
private UserProjectMapper userProjectMapper;
/**
* 登录信息缓存Map
* key为sessionId
* value为对应的当前登录的user的id
*/
private Map<String, Long> sessionMap = new HashMap<>();
/**
* 用户登录
* 用户登录成功后 缓存其对应的sessionId到Map中
*
* @param loginInfo 用户的账号、密码
* @param sessionId 对应的sessionId
* @return 登录是否成功
*/
public boolean login(LoginInfo loginInfo, String sessionId) {
String account = loginInfo.getAccount();
String password = MD5Util.encode(loginInfo.getPassword());
User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
.eq(User::getAccount, account)
.eq(User::getPassword, password));
if (nonNull(user)) {
Long userId = user.getId();
sessionMap.put(sessionId, userId);
return true;
} else {
return false;
}
}
/**
* 查询当前登录的用户
* 输入sessionId 查出其当前登录的user的信息
*
* @param sessionId sessionId
* @return 当前登录的user的信息
*/
public UserInfo findBySessionId(String sessionId) {
boolean hasLogin = sessionMap.containsKey(sessionId);
if (hasLogin) {
Long userId = sessionMap.get(sessionId);
User user = userMapper.selectById(userId);
if (nonNull(user)) {
return userInfo(user);
}
}
return new UserInfo();
}
/**
* 登出用户
* 输入sessionId 清除其在Map中的信息
*
* @param sessionId sessionId
*/
public void logout(String sessionId) {
sessionMap.remove(sessionId);
}
//-------------------------------private--------------------------------
private UserInfo userInfo(User user) {
List<Project> projects = userProjectMapper.selectList(Wrappers.<UserProject>lambdaQuery().eq(UserProject::getUserId, user.getId())).stream()
.map(UserProject::getProjectId)
.map(projectMapper::selectById)
.filter(Objects::nonNull)
.collect(Collectors.toList());
return new UserInfo(
user.getId(),
user.getName(),
user.getAccount(),
user.getPassword(),
projects
);
}
}
package org.matrix.local.service.impl;
import org.matrix.local.service.IProjectService;
import org.springframework.stereotype.Service;
@Service
public class ProjectServiceImpl implements IProjectService {
}
package org.matrix.local.service.impl;
import org.matrix.local.service.IUserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements IUserService {
}
package org.matrix.local.util;
import org.apache.logging.log4j.util.Strings;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
public static String encode(String str) {
byte[] digest = null;
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//16是表示转换为16进制数
if (digest != null) {
return new BigInteger(1, digest).toString(16);
} else {
return Strings.EMPTY;
}
}
}
package org.matrix.remote.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.*;
......@@ -19,6 +21,9 @@ import lombok.*;
@ApiModel(value = "ZtUserview对象", description = "")
public class ZtUserView {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String account;
private String programs;
......
package org.matrix.remote.service.impl;
package org.matrix.remote.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.matrix.local.entity.Project;
......@@ -13,7 +13,6 @@ import org.matrix.remote.entity.ZtUserView;
import org.matrix.remote.mapper.ZtProjectMapper;
import org.matrix.remote.mapper.ZtUserMapper;
import org.matrix.remote.mapper.ZtUserViewMapper;
import org.matrix.remote.service.IDataCollector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -25,8 +24,11 @@ import java.util.stream.Collectors;
import static java.util.Objects.nonNull;
/**
* 禅道数据收集工具
*/
@Service
public class DataCollectorImpl implements IDataCollector {
public class DataCollector {
@Autowired
private ZtUserMapper ztUserMapper;
......@@ -45,7 +47,9 @@ public class DataCollectorImpl implements IDataCollector {
private List<ZtUserView> ztUserViews = new ArrayList<>();
private List<ZtProject> ztProjects = new ArrayList<>();
@Override
/**
* 执行一次全量同步
*/
public void execute() {
//用户数据
collectUser();
......@@ -58,6 +62,8 @@ public class DataCollectorImpl implements IDataCollector {
saveUserProject();
}
//------------------------------------private-------------------------------------
/**
* 从禅道数据库读取用户数据
*/
......@@ -118,11 +124,11 @@ public class DataCollectorImpl implements IDataCollector {
//------------------------private------------------------------------//
private User user(ZtUser ztUser) {
return new User(Long.valueOf(ztUser.getId()), null, null, ztUser.getRealname(), ztUser.getAccount(), ztUser.getPassword());
return new User(Long.valueOf(ztUser.getId()), ztUser.getRealname(), ztUser.getAccount(), ztUser.getPassword());
}
private Project project(ZtProject ztProject) {
return new Project(Long.valueOf(ztProject.getId()), null, null, ztProject.getName());
return new Project(Long.valueOf(ztProject.getId()), ztProject.getName());
}
private List<UserProject> userProjects(ZtUserView ztUserView) {
......
package org.matrix.remote.service;
/**
* 禅道数据收集工具
*/
public interface IDataCollector {
void execute();
}
package org.matrix.remote.task;
import lombok.extern.slf4j.Slf4j;
import org.matrix.remote.service.IDataCollector;
import org.matrix.remote.service.DataCollector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......@@ -15,7 +15,7 @@ public class DataCollectorTask {
@Autowired
private IDataCollector dataCollector;
private DataCollector dataCollector;
/**
* 同步禅道取的用户和项目数据
......
......@@ -16,3 +16,5 @@ spring:
url: jdbc:mysql://192.168.100.247:3306/zentao?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
server:
port: 8180
\ No newline at end of file
......@@ -2,7 +2,7 @@ package org.matrix.ktzentao;
import org.junit.jupiter.api.Test;
import org.matrix.ZentaoApplication;
import org.matrix.remote.service.IDataCollector;
import org.matrix.remote.service.DataCollector;
import org.matrix.remote.task.DataCollectorTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
......@@ -11,7 +11,7 @@ import org.springframework.boot.test.context.SpringBootTest;
class KtZentaoApplicationTests {
@Autowired
IDataCollector dataCollector;
DataCollector dataCollector;
@Autowired
DataCollectorTask dataCollectorTask;
@Test
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论