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

feat(user): 完成了User和Project的基本增删改API

上级 ee4b3292
...@@ -21,7 +21,7 @@ import lombok.experimental.Accessors; ...@@ -21,7 +21,7 @@ import lombok.experimental.Accessors;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ApiModel(value = "UserProject对象", description = "用户项目关系") @ApiModel(value = "UserProject对象", description = "用户项目角色关系")
@TableName(value = "kt_user_project") @TableName(value = "kt_user_project")
public class UserProject { public class UserProject {
...@@ -36,4 +36,6 @@ public class UserProject { ...@@ -36,4 +36,6 @@ public class UserProject {
private Long projectId; private Long projectId;
private String role;
} }
package org.matrix.local.enums;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author C
* 权限枚举
*/
@AllArgsConstructor
@Getter
@ApiModel("角色权限")
public enum Authority {
READ("read","查看数据以及配置"),
EXECUTE("execute","执行测试"),
EDIT("edit","编辑数据以及配置"),
MANAGE("manage","管理用户项目角色");
private final String name;
private final String description;
}
package org.matrix.local.enums;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
import static org.matrix.local.enums.Authority.*;
/**
* @author C
* 角色枚举常量
*/
@AllArgsConstructor
@Getter
@ApiModel("用户角色")
public enum Role {
NORMAL("normal", "普通用户", Lists.newArrayList(READ, EXECUTE)),
SENIOR("senior", "高级用户", Lists.newArrayList(READ, EXECUTE, EDIT)),
ADMIN("admin", "管理员", Lists.newArrayList(READ, EXECUTE, EDIT, MANAGE));
private final String name;
private final String description;
private final List<Authority> authorities;
}
package org.matrix.local.service.impl; package org.matrix.local.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.matrix.local.entity.Project; import org.matrix.local.entity.Project;
import org.matrix.local.mapper.ProjectMapper; import org.matrix.local.mapper.ProjectMapper;
import org.matrix.local.mapper.UserMapper;
import org.matrix.local.service.IProjectService; import org.matrix.local.service.IProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Optional;
import static java.lang.String.format;
/** /**
* 项目相关Service * 项目相关Service
*/ */
@Slf4j
@Service @Service
public class ProjectService extends ServiceImpl<ProjectMapper, Project> implements IProjectService { public class ProjectService extends ServiceImpl<ProjectMapper, Project> implements IProjectService {
@Autowired
private UserMapper userMapper;
@Autowired
private ProjectMapper projectMapper;
/**
* 新增项目
* 新增数据不可附带id
* 项目名唯一 不可重复
*
* @param project 项目信息对象
*/
public void create(Project project) {
//检查是否附带了id
Optional.of(project).map(Project::getId)
.ifPresent(id -> {
throw new RuntimeException("新增数据不可附带id");
});
//检查同名项目是否已存在
Optional.of(projectMapper.selectOne(Wrappers.<Project>lambdaQuery().eq(Project::getName, project.getName())))
.ifPresent(id -> {
throw new RuntimeException(format("该项目名已存在 : %s", project.getName()));
});
//保存
projectMapper.insert(project);
log.info("[项目] 新增项目 : {}", project.getName());
}
/**
* 修改项目
* 根据id修改项目
* 修改数据必须附带id且指定id的原数据必须存在
* 项目名唯一 不可重复
*
* @param project 项目信息对象
*/
public void update(Project project) {
//检查id
Long id = Optional.of(project).map(Project::getId)
.orElseThrow(() -> new RuntimeException("修改数据必须指定id"));
//检查原数据是否存在
Project before = Optional.of(projectMapper.selectById(id))
.orElseThrow(() -> new RuntimeException(format("id为 %s 的项目数据不存在", id)));
//检查同名项目是否已存在
Optional.of(projectMapper.selectOne(Wrappers.<Project>lambdaQuery().eq(Project::getName, project.getName())))
.ifPresent(aId -> {
throw new RuntimeException(format("该项目名已存在 : %s", project.getName()));
});
//保存
projectMapper.updateById(project);
log.info("[项目] 更新项目 : {} ——> {}", before.getName(), project.getName());
}
/**
* 根据id删除项目
*
* @param id 指定id
*/
public void delete(Long id) {
//检查项目是否存在
Project project = Optional.of(projectMapper.selectById(id))
.orElseThrow(() -> new RuntimeException(format("id为 %s 的项目数据不存在", id)));
//保存
userMapper.deleteById(id);
log.info("[项目] 删除项目 : {}", project.getName());
}
} }
...@@ -27,12 +27,10 @@ import org.springframework.web.context.request.RequestContextHolder; ...@@ -27,12 +27,10 @@ import org.springframework.web.context.request.RequestContextHolder;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.lang.String.format;
import static java.util.Objects.nonNull; import static java.util.Objects.nonNull;
/** /**
...@@ -53,6 +51,65 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS ...@@ -53,6 +51,65 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS
private MongoTemplate mongoTemplate; private MongoTemplate mongoTemplate;
/**
* 新增用户
* 新增数据不可附带id
* 账号名为唯一值 不可出现重复
*
* @param user 用户信息对象
*/
public void create(User user) {
//检查是否附带了id
Optional.of(user).map(User::getId)
.ifPresent(id -> {
throw new RuntimeException("新增数据不可附带id");
});
//检查该账号是否已存在
Optional.of(userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getAccount, user.getAccount())))
.ifPresent(id -> {
throw new RuntimeException(format("该账号已存在 : %s", user.getAccount()));
});
//保存
userMapper.insert(user);
log.info("[用户] 新增用户 : {}", user.getAccount());
}
/**
* 修改用户
* 根据id修改用户
* 修改数据必须附带id且指定id的原数据必须存在
* 只能修改名称和密码
* 不可修改账号和id
*
* @param user 用户信息对象
*/
public void update(User user) {
//检查id
Long id = Optional.of(user).map(User::getId)
.orElseThrow(() -> new RuntimeException("修改数据必须指定id"));
//检查原数据是否存在
User before = Optional.of(userMapper.selectById(id))
.orElseThrow(() -> new RuntimeException(format("id为 %s 的用户数据不存在", id)));
//保存
String account = before.getAccount();
userMapper.updateById(user.setAccount(account));
log.info("[用户] 更新用户 : {}", account);
}
/**
* 根据id删除用户
*
* @param id 指定id
*/
public void delete(Long id) {
//检查账号是否存在
User user = Optional.of(userMapper.selectById(id))
.orElseThrow(() -> new RuntimeException(format("id为 %s 的用户数据不存在", id)));
//保存
userMapper.deleteById(id);
log.info("[用户] 删除用户 : {}", user.getAccount());
}
/** /**
* 如果是用户的第一次配置,即库里没有配置项,则全部保存 * 如果是用户的第一次配置,即库里没有配置项,则全部保存
* ● 如果已有配置项,分为部分更新和全部更新 * ● 如果已有配置项,分为部分更新和全部更新
...@@ -68,7 +125,7 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS ...@@ -68,7 +125,7 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS
// 首先查询该用户是否存在,不存在就抛出异常 // 首先查询该用户是否存在,不存在就抛出异常
User dbUser = userMapper.selectById(userId); User dbUser = userMapper.selectById(userId);
if (Objects.isNull(dbUser)) { if (Objects.isNull(dbUser)) {
throw new RuntimeException(String.format("保存用户配置 -- 数据库里没有用户id = %d 的用户!", userId)); throw new RuntimeException(format("保存用户配置 -- 数据库里没有用户id = %d 的用户!", userId));
} }
// 如果是用户的第一次配置,即配置库里没有配置项,则全部保存 // 如果是用户的第一次配置,即配置库里没有配置项,则全部保存
...@@ -109,6 +166,7 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS ...@@ -109,6 +166,7 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS
*/ */
private Map<String, Long> sessionMap = new HashMap<>(); private Map<String, Long> sessionMap = new HashMap<>();
/** /**
* 用户登录 * 用户登录
* 用户登录成功后 缓存其对应的sessionId到Map中 * 用户登录成功后 缓存其对应的sessionId到Map中
...@@ -133,15 +191,16 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS ...@@ -133,15 +191,16 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS
} }
/** /**
* 查询当前登录的用户 * 用户登录
* 根据sessionId查出其当前登录的user的信息 * 用户登录成功后 缓存其对应的sessionId到Map中
* sessionId从上下文中取 无输入 * sessionId从上下文中取 无输入
* *
* @return 当前登录的user的信息 * @param loginInfo 用户的账号、密码
* @return 登录是否成功
*/ */
public UserInfo findNow() { public boolean login(LoginInfo loginInfo) {
String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId(); String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
return findNow(sessionId); return login(loginInfo, sessionId);
} }
/** /**
...@@ -159,13 +218,25 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS ...@@ -159,13 +218,25 @@ public class UserService extends ServiceImpl<UserMapper, User> implements IUserS
if (nonNull(user)) { if (nonNull(user)) {
return userInfo(user); return userInfo(user);
} else { } else {
throw new RuntimeException(String.format("未找到id为%s的用户", userId)); throw new RuntimeException(format("未找到id为%s的用户", userId));
} }
} else { } else {
throw new RuntimeException("当前没有已登录的用户"); throw new RuntimeException("当前没有已登录的用户");
} }
} }
/**
* 查询当前登录的用户
* 根据sessionId查出其当前登录的user的信息
* sessionId从上下文中取 无需输入
*
* @return 当前登录的user的信息
*/
public UserInfo findNow() {
String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
return findNow(sessionId);
}
/** /**
* 登出用户 * 登出用户
* 输入sessionId 清除其在Map中的信息 * 输入sessionId 清除其在Map中的信息
......
...@@ -5,6 +5,7 @@ import org.matrix.actuators.datasource.IDataSourceService; ...@@ -5,6 +5,7 @@ import org.matrix.actuators.datasource.IDataSourceService;
import org.matrix.local.entity.Project; import org.matrix.local.entity.Project;
import org.matrix.local.entity.User; import org.matrix.local.entity.User;
import org.matrix.local.entity.relation.UserProject; import org.matrix.local.entity.relation.UserProject;
import org.matrix.local.enums.Role;
import org.matrix.local.mapper.UserMapper; import org.matrix.local.mapper.UserMapper;
import org.matrix.remote.entity.ZtProject; import org.matrix.remote.entity.ZtProject;
import org.matrix.remote.entity.ZtUser; import org.matrix.remote.entity.ZtUser;
...@@ -53,7 +54,7 @@ public class TransHelper { ...@@ -53,7 +54,7 @@ public class TransHelper {
.map(id -> ztProjectMapper.selectById(id)) .map(id -> ztProjectMapper.selectById(id))
.filter(ztProject -> Objects.equals("0", ztProject.getDeleted())) .filter(ztProject -> Objects.equals("0", ztProject.getDeleted()))
.map(this::findProjectId) .map(this::findProjectId)
.map(projectId -> new UserProject(null, userId, projectId)) .map(projectId -> new UserProject(null, userId, projectId, Role.SENIOR.getName()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} else { } else {
return new ArrayList<>(); return new ArrayList<>();
......
package org.matrix.autotest.controller; package org.matrix.autotest.controller;
import com.google.common.collect.ImmutableMap;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.matrix.local.entity.Project; import org.matrix.local.entity.Project;
import org.matrix.local.service.IProjectService; import org.matrix.local.service.impl.ProjectService;
import org.matrix.database.vo.CommonResult; import org.springframework.beans.factory.annotation.Autowired;
import org.matrix.database.vo.CommonResultObj;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.Map;
import java.util.List;
import java.util.Optional;
/** /**
* <p> * <p>
...@@ -27,61 +25,28 @@ import java.util.Optional; ...@@ -27,61 +25,28 @@ import java.util.Optional;
@Api(tags = "对项目project的基本操作") @Api(tags = "对项目project的基本操作")
public class ProjectController { public class ProjectController {
private final IProjectService projectService; @Autowired
private ProjectService projectService;
public ProjectController(IProjectService projectService) { @ApiOperation(value = "新增项目", notes = "新增数据不可附带id;账号名为唯一值不可出现重复;")
this.projectService = projectService;
}
/**
* 查询所有项目
*
* @return 查询到的所有项目, 以及是否查询成功的提示信息
*/
@ApiOperation(value = "查询所有项目")
@GetMapping
public ResponseEntity<CommonResultObj<List<Project>>> findAllProjects() {
List<Project> results = Optional.ofNullable(projectService.list()).orElse(new ArrayList<>());
return CommonResult.success(results, "查询成功");
}
/**
* 添加项目
*
* @param project 项目对象
* @return 添加的项目, 以及是否添加成功的提示信息
*/
@ApiOperation(value = "添加项目")
@PostMapping @PostMapping
public ResponseEntity<CommonResultObj<Project>> insertProject(@RequestBody Project project) { public ResponseEntity<Map<String, String>> create(@RequestBody Project project) {
return CommonResult.pred(projectService::save, project projectService.create(project);
, "添加成功", "添加失败或已存在同名项目"); return ResponseEntity.ok(ImmutableMap.of("message", "操作成功"));
} }
/** @ApiOperation(value = "修改项目", notes = "根据id修改项目;修改数据必须附带id且指定id的原数据必须存在;项目名为唯一值不可出现重复;")
* 修改项目
*
* @param project 项目对象
* @return 修改后的项目, 以及是否修改成功的提示信息
*/
@ApiOperation(value = "修改项目")
@PutMapping @PutMapping
public ResponseEntity<CommonResultObj<Project>> updateProject(@RequestBody Project project) { public ResponseEntity<Map<String, String>> update(@RequestBody Project project) {
return CommonResult.pred(projectService::updateById, project projectService.update(project);
, "修改成功", "修改失败"); return ResponseEntity.ok(ImmutableMap.of("message", "操作成功"));
} }
/** @ApiOperation(value = "删除项目", notes = "根据id删除项目")
* 删除项目
*
* @param id 项目id
* @return 删除的项目id, 以及是否删除成功的提示信息
*/
@ApiOperation(value = "根据主键id删除项目")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public ResponseEntity<CommonResultObj<Long>> deleteProject(@PathVariable Long id) { public ResponseEntity<Map<String, String>> delete(@PathVariable Long id) {
return CommonResult.pred(projectService::removeById, id projectService.delete(id);
, "删除成功", "删除失败或id不存在"); return ResponseEntity.ok(ImmutableMap.of("message", "操作成功"));
} }
} }
...@@ -9,11 +9,10 @@ import org.matrix.local.entity.config.BookmarkConfig; ...@@ -9,11 +9,10 @@ import org.matrix.local.entity.config.BookmarkConfig;
import org.matrix.local.entity.config.UserConfig; import org.matrix.local.entity.config.UserConfig;
import org.matrix.local.entity.vo.UserInfo; import org.matrix.local.entity.vo.UserInfo;
import org.matrix.local.enums.ConfigType; import org.matrix.local.enums.ConfigType;
import org.matrix.local.service.UserService; import org.matrix.local.service.impl.UserService;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import static org.matrix.database.vo.CommonResult.failed; import static org.matrix.database.vo.CommonResult.failed;
import static org.matrix.database.vo.CommonResult.success; import static org.matrix.database.vo.CommonResult.success;
......
...@@ -3,6 +3,7 @@ package org.matrix.autotest.controller; ...@@ -3,6 +3,7 @@ package org.matrix.autotest.controller;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.matrix.local.entity.User;
import org.matrix.local.entity.vo.LoginInfo; import org.matrix.local.entity.vo.LoginInfo;
import org.matrix.local.entity.vo.UserInfo; import org.matrix.local.entity.vo.UserInfo;
import org.matrix.local.service.impl.UserService; import org.matrix.local.service.impl.UserService;
...@@ -10,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -10,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map; import java.util.Map;
@Api(tags = "用户相关API") @Api(tags = "用户相关API")
...@@ -21,11 +21,31 @@ public class UserController { ...@@ -21,11 +21,31 @@ public class UserController {
@Autowired @Autowired
private UserService userService; private UserService userService;
@ApiOperation(value = "新增用户", notes = "新增数据不可附带id;账号名为唯一值不可出现重复;")
@PostMapping
public ResponseEntity<Map<String, String>> create(@RequestBody User user) {
userService.create(user);
return ResponseEntity.ok(ImmutableMap.of("message", "操作成功"));
}
@ApiOperation(value = "修改用户", notes = "根据id修改用户;修改数据必须附带id且指定id的原数据必须存在;账号名为唯一值不可出现重复;只能修改名称和密码而账号名不可修改;")
@PutMapping
public ResponseEntity<Map<String, String>> update(@RequestBody User user) {
userService.update(user);
return ResponseEntity.ok(ImmutableMap.of("message", "操作成功"));
}
@ApiOperation(value = "删除用户", notes = "根据id删除用户")
@DeleteMapping("/{id}")
public ResponseEntity<Map<String, String>> delete(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.ok(ImmutableMap.of("message", "操作成功"));
}
@ApiOperation("用户登录") @ApiOperation("用户登录")
@PostMapping("/login") @PostMapping("/login")
public ResponseEntity<Map<String, String>> login(HttpServletRequest request, @RequestBody LoginInfo loginInfo) { public ResponseEntity<Map<String, String>> login(@RequestBody LoginInfo loginInfo) {
String sessionId = request.getSession().getId(); boolean success = userService.login(loginInfo);
boolean success = userService.login(loginInfo, sessionId);
if (success) { if (success) {
return ResponseEntity.ok(ImmutableMap.of("message", "登录成功")); return ResponseEntity.ok(ImmutableMap.of("message", "登录成功"));
} else { } else {
...@@ -35,17 +55,15 @@ public class UserController { ...@@ -35,17 +55,15 @@ public class UserController {
@ApiOperation("查询当前登录用户") @ApiOperation("查询当前登录用户")
@GetMapping("/login/info") @GetMapping("/login/info")
public ResponseEntity<UserInfo> find(HttpServletRequest request) { public ResponseEntity<UserInfo> find() {
String sessionId = request.getSession().getId(); UserInfo userInfo = userService.findNow();
UserInfo userInfo = userService.findNow(sessionId);
return ResponseEntity.ok(userInfo); return ResponseEntity.ok(userInfo);
} }
@ApiOperation("用户登出") @ApiOperation("用户登出")
@GetMapping("/logout") @GetMapping("/logout")
public ResponseEntity<UserInfo> logout(HttpServletRequest request) { public ResponseEntity<UserInfo> logout() {
String sessionId = request.getSession().getId(); UserInfo userInfo = userService.findNow();
UserInfo userInfo = userService.findNow(sessionId);
return ResponseEntity.ok(userInfo); return ResponseEntity.ok(userInfo);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论