Compare commits

...

12 Commits

99 changed files with 1420 additions and 935 deletions

View File

@@ -36,8 +36,8 @@ buildNumber.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar # https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar .mvn/wrapper/maven-wrapper.jar
### Example user template template ### Example userDetail template template
### Example user template ### Example userDetail template
# IntelliJ project files # IntelliJ project files
.idea .idea

View File

@@ -1,9 +1,6 @@
kind: pipeline kind: pipeline
type: docker type: docker
name: fateverse name: fateverse
platform:
os: linux
arch: arm64
steps: steps:
@@ -21,7 +18,7 @@ steps:
- bash maven.sh - bash maven.sh
- name: build-docker # 制作docker镜像 - name: build-docker # 制作docker镜像
image: docker # 使用官方docker镜像 image: registry.cn-chengdu.aliyuncs.com/claywang/docker:20.10.1 # 使用官方docker镜像
volumes: # 将容器内目录挂载到宿主机 volumes: # 将容器内目录挂载到宿主机
- name: maven-build - name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
@@ -55,7 +52,7 @@ steps:
- name: deploy # rancher运行 - name: deploy # rancher运行
image: bitnami/kubectl:1.26.13-debian-11-r1 #阿里云的kubectl镜像,里面包含kubectl命令行工具 image: registry.cn-chengdu.aliyuncs.com/claywang/kubectl #阿里云的kubectl镜像,里面包含kubectl命令行工具
volumes: # 将容器内目录挂载到宿主机 volumes: # 将容器内目录挂载到宿主机
- name: maven-build - name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 path: /app/build # 将应用打包好的Jar和执行脚本挂载出来

View File

@@ -1,6 +1,6 @@
package cn.fateverse.admin.dto; package cn.fateverse.admin.dto;
import cn.fateverse.admin.entity.Role; import cn.fateverse.common.core.entity.Role;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@@ -1,6 +1,6 @@
package cn.fateverse.admin.dto; package cn.fateverse.admin.dto;
import cn.fateverse.admin.entity.UserBase; import cn.fateverse.common.core.entity.User;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@@ -83,8 +83,8 @@ public class UserDto{
private List<Long> roleIds; private List<Long> roleIds;
public UserBase toUser() { public User toUser() {
return UserBase.builder() return User.builder()
.userId(userId) .userId(userId)
.deptId(deptId) .deptId(deptId)
.userName(userName) .userName(userName)

View File

@@ -1,7 +1,8 @@
package cn.fateverse.admin.dubbo; package cn.fateverse.admin.dubbo;
import cn.fateverse.admin.entity.User;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.UserDetail;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.List; import java.util.List;
@@ -17,7 +18,7 @@ public interface DubboUserService {
* @param username 用户名称 * @param username 用户名称
* @return 用户信息 * @return 用户信息
*/ */
User getUserByUsername(String username); UserVo getUserByUsername(String username);
/** /**
* 根据用户id查询用户信息 * 根据用户id查询用户信息
@@ -25,7 +26,7 @@ public interface DubboUserService {
* @param userId 用户id * @param userId 用户id
* @return 用户信息 * @return 用户信息
*/ */
User getUserByUserId(Long userId); UserVo getUserByUserId(Long userId);
/** /**
* 根据roleId查询用户列表 * 根据roleId查询用户列表
@@ -57,4 +58,12 @@ public interface DubboUserService {
* @return 所有用户的id * @return 所有用户的id
*/ */
List<Long> searchAllUserIds(); List<Long> searchAllUserIds();
/**
* 通过用户名获取用户详细信息
*
* @param userName 用户名
* @return {@link UserDetails }
*/
UserDetail getUserDetailsByUserName(String userName);
} }

View File

@@ -6,7 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**
@@ -66,7 +66,7 @@ public class DeptVo implements Serializable {
/** /**
* 创建时间 * 创建时间
*/ */
private Date createTime; private LocalDateTime createTime;
/** /**
* 子节点 * 子节点

View File

@@ -9,7 +9,7 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.Date; import java.time.LocalDateTime;
/** /**
* @author Clay * @author Clay
@@ -47,7 +47,7 @@ public class IpBackVo {
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
@Excel("创建时间") @Excel("创建时间")
private Date createTime; private LocalDateTime createTime;
public static IpBackVo toIpBackVo(IpBack ipBack) { public static IpBackVo toIpBackVo(IpBack ipBack) {
return IpBackVo.builder() return IpBackVo.builder()

View File

@@ -1,6 +1,6 @@
package cn.fateverse.admin.vo; package cn.fateverse.admin.vo;
import cn.fateverse.admin.entity.Role; import cn.fateverse.common.core.entity.Role;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@@ -1,7 +1,7 @@
package cn.fateverse.admin.vo; package cn.fateverse.admin.vo;
import cn.fateverse.admin.entity.Role; import cn.fateverse.common.core.entity.Dept;
import cn.fateverse.admin.entity.Dept; import cn.fateverse.common.core.entity.Role;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@@ -1,7 +1,7 @@
package cn.fateverse.admin.vo; package cn.fateverse.admin.vo;
import cn.fateverse.admin.entity.User;
import cn.fateverse.common.core.entity.Option; import cn.fateverse.common.core.entity.Option;
import cn.fateverse.common.core.entity.UserDetail;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Builder; import lombok.Builder;
@@ -14,11 +14,10 @@ import java.util.List;
* @date 2022/11/4 * @date 2022/11/4
*/ */
@Data @Data
@Builder
@ApiModel("用户详细信息") @ApiModel("用户详细信息")
public class UserDetailVo { public class UserDetailVo {
@ApiModelProperty("用户基本细腻系") @ApiModelProperty("用户基本细腻系")
private User user; private UserDetail user;
@ApiModelProperty("用户所在的岗位") @ApiModelProperty("用户所在的岗位")
private List<Long> postIds; private List<Long> postIds;

View File

@@ -1,13 +1,11 @@
package cn.fateverse.admin.vo; package cn.fateverse.admin.vo;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.regex.Pattern;
/** /**
* @author Clay * @author Clay
@@ -71,12 +69,4 @@ public class UserVo implements Serializable {
@ApiModelProperty("创建时间") @ApiModelProperty("创建时间")
private Date createTime; private Date createTime;
public boolean checkEmail(){
if (StrUtil.isEmpty(email)){
return false;
}
Pattern pattern =Pattern.compile("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
return pattern.matcher(email).matches();
}
} }

View File

@@ -24,7 +24,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.fateverse</groupId> <groupId>cn.fateverse</groupId>
<artifactId>common-mybatis</artifactId> <artifactId>common-mybatis-puls</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.fateverse</groupId> <groupId>cn.fateverse</groupId>
@@ -52,6 +52,10 @@
<groupId>cn.fateverse</groupId> <groupId>cn.fateverse</groupId>
<artifactId>common-decrypt</artifactId> <artifactId>common-decrypt</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.fateverse</groupId>
<artifactId>admin-api</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@@ -10,6 +10,7 @@ import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.excel.utils.ExcelUtil; import cn.fateverse.common.excel.utils.ExcelUtil;
import cn.fateverse.common.log.annotation.Log; import cn.fateverse.common.log.annotation.Log;
import cn.fateverse.common.log.enums.BusinessType; import cn.fateverse.common.log.enums.BusinessType;
import cn.fateverse.common.security.utils.SecurityUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;

View File

@@ -1,17 +1,16 @@
package cn.fateverse.admin.controller; package cn.fateverse.admin.controller;
import cn.fateverse.admin.dto.DeptDto; import cn.fateverse.admin.dto.DeptDto;
import cn.fateverse.admin.facade.DeptFacade;
import cn.fateverse.admin.vo.DeptVo; import cn.fateverse.admin.vo.DeptVo;
import cn.fateverse.admin.service.DeptService;
import cn.fateverse.common.core.constant.UserConstants;
import cn.fateverse.admin.entity.Dept;
import cn.fateverse.common.core.entity.OptionTree; import cn.fateverse.common.core.entity.OptionTree;
import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.result.Result; import cn.fateverse.common.core.result.Result;
import cn.fateverse.common.log.annotation.Log; import cn.fateverse.common.log.annotation.Log;
import cn.fateverse.common.log.enums.BusinessType; import cn.fateverse.common.log.enums.BusinessType;
import io.swagger.annotations.*; import io.swagger.annotations.Api;
import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -25,14 +24,10 @@ import java.util.List;
@Api(tags = "部门接口") @Api(tags = "部门接口")
@RestController @RestController
@RequestMapping("/dept") @RequestMapping("/dept")
@RequiredArgsConstructor
public class DeptController { public class DeptController {
private final DeptService deptService; private final DeptFacade deptFacade;
public DeptController(DeptService deptService) {
this.deptService = deptService;
}
@ApiOperation("获取列表信息") @ApiOperation("获取列表信息")
@@ -41,7 +36,7 @@ public class DeptController {
public Result<List<DeptVo>> list( public Result<List<DeptVo>> list(
@ApiParam(name="deptName",value="部门名称") String deptName, @ApiParam(name="deptName",value="部门名称") String deptName,
@ApiParam(name="state",value="状态(1: 正常 0 : 停用)") Integer state){ @ApiParam(name="state",value="状态(1: 正常 0 : 停用)") Integer state){
List<DeptVo> deptVoList = deptService.searchTree(deptName, state); List<DeptVo> deptVoList = deptFacade.searchTree(deptName, state);
return Result.ok(deptVoList); return Result.ok(deptVoList);
} }
@@ -51,23 +46,21 @@ public class DeptController {
public Result<DeptVo> info( public Result<DeptVo> info(
@ApiParam(name="deptId",value="部门id") @ApiParam(name="deptId",value="部门id")
@PathVariable Long deptId){ @PathVariable Long deptId){
checkDeptId(deptId); DeptVo deptVo = deptFacade.searchById(deptId);
DeptVo deptVo = deptService.searchById(deptId);
return Result.ok(deptVo); return Result.ok(deptVo);
} }
@ApiOperation("获取树形接口的option") @ApiOperation("获取树形接口的option")
@GetMapping("/option") @GetMapping("/option")
public Result<List<OptionTree>> option(){ public Result<List<OptionTree>> option(){
List<OptionTree> optionTreeList = deptService.searchTreeOption(); List<OptionTree> optionTreeList = deptFacade.searchTreeOption();
return Result.ok(optionTreeList); return Result.ok(optionTreeList);
} }
@ApiOperation("获取修改时的部门列表") @ApiOperation("获取修改时的部门列表")
@GetMapping("/option/exclude/{deptId}") @GetMapping("/option/exclude/{deptId}")
public Result<List<OptionTree>> exclude(@PathVariable Long deptId){ public Result<List<OptionTree>> exclude(@PathVariable Long deptId){
checkDeptId(deptId); List<OptionTree> deptVoList = deptFacade.searchExcludeTree(deptId);
List<OptionTree> deptVoList = deptService.searchExcludeTree(deptId);
return Result.ok(deptVoList); return Result.ok(deptVoList);
} }
@@ -76,12 +69,7 @@ public class DeptController {
@PreAuthorize("@ss.hasPermission('admin:dept:add')") @PreAuthorize("@ss.hasPermission('admin:dept:add')")
@Log(title = "新增部门",businessType = BusinessType.INSERT) @Log(title = "新增部门",businessType = BusinessType.INSERT)
public Result<Void> add(@RequestBody @Validated DeptDto deptDto){ public Result<Void> add(@RequestBody @Validated DeptDto deptDto){
Dept dept = new Dept(); deptFacade.save(deptDto);
BeanUtils.copyProperties(deptDto,dept);
if (UserConstants.DEPT_DISABLE.equals(deptService.checkNameUnique(dept))){
return Result.error("新增部门: "+ dept.getDeptName() +"'失败,部门名称以存在!");
}
deptService.save(dept);
return Result.ok(); return Result.ok();
} }
@@ -90,15 +78,7 @@ public class DeptController {
@PreAuthorize("@ss.hasPermission('admin:dept:edit')") @PreAuthorize("@ss.hasPermission('admin:dept:edit')")
@Log(title = "修改部门",businessType = BusinessType.UPDATE) @Log(title = "修改部门",businessType = BusinessType.UPDATE)
public Result<Void> edit(@RequestBody @Validated DeptDto deptDto){ public Result<Void> edit(@RequestBody @Validated DeptDto deptDto){
Dept dept = new Dept(); deptFacade.edit(deptDto);
BeanUtils.copyProperties(deptDto,dept);
if (UserConstants.DEPT_DISABLE.equals(deptService.checkNameUnique(dept))){
return Result.error("修改部门: "+ dept.getDeptName() +"'失败,部门名称以存在!");
}else if (dept.getDeptId().equals(dept.getParentId())){
return Result.error("修改部门: "+ dept.getDeptName() +"'失败,上级部门不能为自己!");
}
checkDeptId(dept.getDeptId());
deptService.edit(dept);
return Result.ok(); return Result.ok();
} }
@@ -108,26 +88,11 @@ public class DeptController {
@PreAuthorize("@ss.hasPermission('admin:dept:del')") @PreAuthorize("@ss.hasPermission('admin:dept:del')")
@Log(title = "删除部门",businessType = BusinessType.DELETE) @Log(title = "删除部门",businessType = BusinessType.DELETE)
public Result<Void> delete(@PathVariable Long deptId){ public Result<Void> delete(@PathVariable Long deptId){
checkDeptId(deptId); deptFacade.remove(deptId);
if (deptService.hasChildById(deptId)){
return Result.error("存在下级部门,不允许删除");
}else if (deptService.checkExistUser(deptId)){
return Result.error("该部门下存在用户,不允许删除");
}
deptService.remove(deptId);
return Result.ok(); return Result.ok();
} }
/**
* 检查部门id是都为空
*/
private void checkDeptId(Long deptId){
if (null == deptId){
throw new CustomException("部门id不能为空!");
}
}

View File

@@ -3,6 +3,7 @@ package cn.fateverse.admin.controller;
import cn.fateverse.admin.dto.RoleDto; import cn.fateverse.admin.dto.RoleDto;
import cn.fateverse.admin.entity.Role; import cn.fateverse.admin.entity.Role;
import cn.fateverse.admin.entity.User; import cn.fateverse.admin.entity.User;
import cn.fateverse.admin.facade.RoleFacade;
import cn.fateverse.admin.query.RoleQuery; import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.admin.vo.RoleVo; import cn.fateverse.admin.vo.RoleVo;
import cn.fateverse.common.core.entity.IdWrapper; import cn.fateverse.common.core.entity.IdWrapper;
@@ -16,13 +17,14 @@ import cn.fateverse.common.core.result.Result;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.LongUtils; import cn.fateverse.common.core.utils.LongUtils;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.security.service.TokenService; import cn.fateverse.common.security.service.TokenService;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import cn.fateverse.common.log.annotation.Log; import cn.fateverse.common.log.annotation.Log;
import cn.fateverse.common.log.enums.BusinessType; import cn.fateverse.common.log.enums.BusinessType;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -38,30 +40,21 @@ import java.util.Set;
@Api(tags = "角色管理") @Api(tags = "角色管理")
@RestController @RestController
@RequestMapping("/role") @RequestMapping("/role")
@RequiredArgsConstructor
public class RoleController { public class RoleController {
private final RoleService roleService; private final RoleFacade roleFacade;
private final UserService userService; private final UserService userService;
private final MenuService menuService; private final MenuService menuService;
private final TokenService tokenService; private final TokenService tokenService;
public RoleController(RoleService roleService, UserService userService, MenuService menuService, TokenService tokenService) {
this.roleService = roleService;
this.userService = userService;
this.menuService = menuService;
this.tokenService = tokenService;
}
@ApiOperation("获取角色列表") @ApiOperation("获取角色列表")
@GetMapping @GetMapping
@PreAuthorize("@ss.hasPermission('admin:role:list')") @PreAuthorize("@ss.hasPermission('admin:role:list')")
public Result<TableDataInfo<RoleVo>> list(RoleQuery query) { public Result<TableDataInfo<RoleVo>> list(RoleQuery query) {
TableDataInfo<RoleVo> dataInfo = roleService.searchList(query); TableDataInfo<RoleVo> dataInfo = roleFacade.searchList(query);
return Result.ok(dataInfo); return Result.ok(dataInfo);
} }
@@ -70,30 +63,30 @@ public class RoleController {
@GetMapping("/{roleId}") @GetMapping("/{roleId}")
@PreAuthorize("@ss.hasPermission('admin:role:info')") @PreAuthorize("@ss.hasPermission('admin:role:info')")
public Result<RoleVo> info(@PathVariable Long roleId) { public Result<RoleVo> info(@PathVariable Long roleId) {
checkRoleId(roleId); RoleVo vo = roleFacade.searchById(roleId);
RoleVo vo = roleService.searchById(roleId);
return Result.ok(vo); return Result.ok(vo);
} }
@ApiOperation("根据菜单id获取角色列表") @ApiOperation("根据菜单id获取角色列表")
@GetMapping("/menu/list") @GetMapping("/menu/list")
public Result<TableDataInfo<RoleVo>> roleExcludeMenuId(Long menuId, String roleName, String roleKey) { public Result<TableDataInfo<RoleVo>> roleExcludeMenuId(@RequestParam Long menuId,
if (ObjectUtils.isEmpty(menuId)) { @RequestParam String roleName,
return Result.error("菜单id不能为空!"); @RequestParam String roleKey) {
} TableDataInfo<RoleVo> dataInfo = roleFacade.searchListExcludeMenuId(menuId, roleName, roleKey);
TableDataInfo<RoleVo> dataInfo = roleService.searchListExcludeMenuId(menuId, roleName, roleKey);
return Result.ok(dataInfo); return Result.ok(dataInfo);
} }
@ApiOperation("根据菜单id获取分配的角色信息") @ApiOperation("根据菜单id获取分配的角色信息")
@GetMapping("/menu") @GetMapping("/menu")
public Result<TableDataInfo<RoleVo>> menuRole(Long menuId, String roleName, String roleKey) { public Result<TableDataInfo<RoleVo>> menuRole(@RequestParam Long menuId,
@RequestParam String roleName,
@RequestParam String roleKey) {
if (ObjectUtils.isEmpty(menuId)) { if (ObjectUtils.isEmpty(menuId)) {
return Result.error("菜单id不能为空!"); return Result.error("菜单id不能为空!");
} }
TableDataInfo<RoleVo> dataInfo = roleService.searchListByMenuId(menuId, roleName, roleKey); TableDataInfo<RoleVo> dataInfo = roleFacade.searchListByMenuId(menuId, roleName, roleKey);
return Result.ok(dataInfo); return Result.ok(dataInfo);
} }
@@ -105,7 +98,7 @@ public class RoleController {
public Result<Void> bindRole(@RequestBody IdWrapper wrapper) { public Result<Void> bindRole(@RequestBody IdWrapper wrapper) {
checkRoleIds(wrapper.getIds()); checkRoleIds(wrapper.getIds());
LongUtils.checkId(wrapper.getId(), "菜单id不能为空"); LongUtils.checkId(wrapper.getId(), "菜单id不能为空");
roleService.bindMenu(wrapper.getId(), wrapper.getIds()); roleFacade.bindMenu(wrapper.getId(), wrapper.getIds());
return Result.ok(); return Result.ok();
} }
@@ -117,7 +110,7 @@ public class RoleController {
public Result<Void> unBindMenu(@RequestBody IdWrapper wrapper) { public Result<Void> unBindMenu(@RequestBody IdWrapper wrapper) {
checkRoleIds(wrapper.getIds()); checkRoleIds(wrapper.getIds());
LongUtils.checkId(wrapper.getId(), "菜单id不能为空"); LongUtils.checkId(wrapper.getId(), "菜单id不能为空");
roleService.unBindMenu(wrapper.getId(), wrapper.getIds()); roleFacade.unBindMenu(wrapper.getId(), wrapper.getIds());
return Result.ok(); return Result.ok();
} }
@@ -127,7 +120,7 @@ public class RoleController {
@Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE) @Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE)
public Result<Void> unBindAllMenu(@RequestBody IdWrapper wrapper) { public Result<Void> unBindAllMenu(@RequestBody IdWrapper wrapper) {
LongUtils.checkId(wrapper.getId(), "菜单id不能为空"); LongUtils.checkId(wrapper.getId(), "菜单id不能为空");
roleService.unBindAllMenu(wrapper.getId()); roleFacade.unBindAllMenu(wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -135,7 +128,7 @@ public class RoleController {
@ApiOperation("查询角色信息") @ApiOperation("查询角色信息")
@GetMapping("/option") @GetMapping("/option")
public Result<List<Option>> option() { public Result<List<Option>> option() {
List<Option> option = roleService.searchOption(); List<Option> option = roleFacade.searchOption();
return Result.ok(option); return Result.ok(option);
} }
@@ -146,7 +139,7 @@ public class RoleController {
@PreAuthorize("@ss.hasPermission('admin:role:add')") @PreAuthorize("@ss.hasPermission('admin:role:add')")
public Result<Void> add(@RequestBody @Validated RoleDto role) { public Result<Void> add(@RequestBody @Validated RoleDto role) {
checkNameAndKey(role); checkNameAndKey(role);
roleService.save(role); roleFacade.save(role);
return Result.ok(); return Result.ok();
} }
@@ -157,7 +150,7 @@ public class RoleController {
public Result<Void> edit(@NotNull @RequestBody @Validated RoleDto role) { public Result<Void> edit(@NotNull @RequestBody @Validated RoleDto role) {
checkRoleId(role.getRoleId()); checkRoleId(role.getRoleId());
checkNameAndKey(role); checkNameAndKey(role);
roleService.edit(role); roleFacade.edit(role);
checkUserRoleUpdate(role); checkUserRoleUpdate(role);
return Result.ok(); return Result.ok();
} }
@@ -173,7 +166,7 @@ public class RoleController {
if (StrUtil.isEmpty(role.getState())) { if (StrUtil.isEmpty(role.getState())) {
return Result.error("状态不能为空!"); return Result.error("状态不能为空!");
} }
roleService.editState(role.getRoleId(), role.getState()); roleFacade.editState(role.getRoleId(), role.getState());
checkUserRoleUpdate(role); checkUserRoleUpdate(role);
return Result.ok(); return Result.ok();
} }
@@ -185,7 +178,7 @@ public class RoleController {
@PreAuthorize("@ss.hasPermission('admin:role:del')") @PreAuthorize("@ss.hasPermission('admin:role:del')")
public Result<Void> delete(@PathVariable Long roleId) { public Result<Void> delete(@PathVariable Long roleId) {
checkRoleId(roleId); checkRoleId(roleId);
roleService.remove(roleId); roleFacade.remove(roleId);
return Result.ok(); return Result.ok();
} }
@@ -213,10 +206,10 @@ public class RoleController {
* 检查角色名称和角色关键词 * 检查角色名称和角色关键词
*/ */
private void checkNameAndKey(RoleDto dto) { private void checkNameAndKey(RoleDto dto) {
if (roleService.checkNameUnique(dto)) { if (roleFacade.checkNameUnique(dto)) {
throw new CustomException("角色名称已存在!"); throw new CustomException("角色名称已存在!");
} }
if (roleService.checkRoleKeyUnique(dto)) { if (roleFacade.checkRoleKeyUnique(dto)) {
throw new CustomException("角色权限名称已存在!"); throw new CustomException("角色权限名称已存在!");
} }
} }

View File

@@ -1,26 +1,27 @@
package cn.fateverse.admin.controller; package cn.fateverse.admin.controller;
import cn.fateverse.admin.dto.UserDto; import cn.fateverse.admin.dto.UserDto;
import cn.fateverse.admin.facade.RoleFacade;
import cn.fateverse.admin.facade.UserFacade;
import cn.fateverse.admin.query.UserQuery; import cn.fateverse.admin.query.UserQuery;
import cn.fateverse.admin.service.PostService;
import cn.fateverse.admin.vo.UserChooseVo; import cn.fateverse.admin.vo.UserChooseVo;
import cn.fateverse.admin.vo.UserDetailVo; import cn.fateverse.admin.vo.UserDetailVo;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.IdWrapper; import cn.fateverse.common.core.entity.IdWrapper;
import cn.hutool.core.util.StrUtil;
import cn.fateverse.admin.service.PostService;
import cn.fateverse.admin.service.RoleService;
import cn.fateverse.admin.service.UserService;
import cn.fateverse.common.core.entity.Option; import cn.fateverse.common.core.entity.Option;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.result.Result; import cn.fateverse.common.core.result.Result;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.LongUtils; import cn.fateverse.common.core.utils.LongUtils;
import cn.fateverse.common.security.annotation.Anonymity;
import cn.fateverse.common.log.annotation.Log; import cn.fateverse.common.log.annotation.Log;
import cn.fateverse.common.log.enums.BusinessType; import cn.fateverse.common.log.enums.BusinessType;
import cn.fateverse.common.mybatis.utils.PageUtils; import cn.fateverse.common.mybatis.utils.PageUtils;
import cn.fateverse.common.security.annotation.Anonymity;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -37,31 +38,20 @@ import java.util.regex.Pattern;
@Api(tags = "用户管理") @Api(tags = "用户管理")
@Slf4j @Slf4j
@RestController @RestController
@RequiredArgsConstructor
@RequestMapping("/user") @RequestMapping("/user")
public class UserController { public class UserController {
private final UserService userService; private final UserFacade userFacade;
private final RoleFacade roleFacade;
private final RoleService roleService;
private final PostService postService; private final PostService postService;
public UserController(UserService userService,
RoleService roleService,
PostService postService) {
this.userService = userService;
this.roleService = roleService;
this.postService = postService;
}
@ApiOperation("获取用户列表") @ApiOperation("获取用户列表")
@GetMapping @GetMapping
@PreAuthorize("@ss.hasPermission('admin:user:list')") @PreAuthorize("@ss.hasPermission('admin:user:list')")
public Result<TableDataInfo<UserVo>> list(UserQuery userQuery) { public Result<TableDataInfo<UserVo>> list(UserQuery userQuery) {
PageUtils.startPage(); TableDataInfo<UserVo> dataTable = userFacade.searchList(userQuery);
List<UserVo> userVos = userService.searchList(userQuery);
TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userVos);
return Result.ok(dataTable); return Result.ok(dataTable);
} }
@@ -72,7 +62,7 @@ public class UserController {
if (null == type || null == chooseId || type > 1 || type < 0) { if (null == type || null == chooseId || type > 1 || type < 0) {
return Result.error("参数异常!"); return Result.error("参数异常!");
} }
List<UserChooseVo> userChooseList = userService.searchUserChooseRoleOrDept(type, chooseId); List<UserChooseVo> userChooseList = userFacade.searchUserChooseRoleOrDept(type, chooseId);
return Result.ok(userChooseList); return Result.ok(userChooseList);
} }
@@ -80,9 +70,8 @@ public class UserController {
@GetMapping("/info/{userId}") @GetMapping("/info/{userId}")
@PreAuthorize("@ss.hasPermission('admin:user:info')") @PreAuthorize("@ss.hasPermission('admin:user:info')")
public Result<UserDetailVo> info(@PathVariable Long userId) { public Result<UserDetailVo> info(@PathVariable Long userId) {
checkUserId(userId); UserDetailVo userDetail = userFacade.searchDetailByUserId(userId);
UserDetailVo userDetail = userService.searchByUserId(userId); List<Option> roleOption = roleFacade.searchOption();
List<Option> roleOption = roleService.searchOption();
List<Option> postOption = postService.searchOption(); List<Option> postOption = postService.searchOption();
userDetail.setRoleList(roleOption); userDetail.setRoleList(roleOption);
userDetail.setPostList(postOption); userDetail.setPostList(postOption);
@@ -94,7 +83,7 @@ public class UserController {
public Result<TableDataInfo<UserVo>> role(@PathVariable Long roleId, String userName, String phoneNumber) { public Result<TableDataInfo<UserVo>> role(@PathVariable Long roleId, String userName, String phoneNumber) {
LongUtils.checkId(roleId, "角色id不能为空!"); LongUtils.checkId(roleId, "角色id不能为空!");
PageUtils.startPage(); PageUtils.startPage();
List<UserVo> userList = userService.searchListByRoleId(roleId, userName, phoneNumber); List<UserVo> userList = userFacade.searchListByRoleId(roleId, userName, phoneNumber);
TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userList); TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userList);
return Result.ok(dataTable); return Result.ok(dataTable);
} }
@@ -103,7 +92,7 @@ public class UserController {
@GetMapping("/role/exclude/{roleId}") @GetMapping("/role/exclude/{roleId}")
public Result<TableDataInfo<UserVo>> excludeRole(@PathVariable Long roleId, String userName, String phoneNumber) { public Result<TableDataInfo<UserVo>> excludeRole(@PathVariable Long roleId, String userName, String phoneNumber) {
LongUtils.checkId(roleId, "角色id不能为空!"); LongUtils.checkId(roleId, "角色id不能为空!");
TableDataInfo<UserVo> table = userService.searchUserListByExcludeRoleId(roleId, userName, phoneNumber); TableDataInfo<UserVo> table = userFacade.searchUserListByExcludeRoleId(roleId, userName, phoneNumber);
return Result.ok(table); return Result.ok(table);
} }
@@ -114,7 +103,7 @@ public class UserController {
public Result<Void> bindRole(@RequestBody IdWrapper wrapper) { public Result<Void> bindRole(@RequestBody IdWrapper wrapper) {
checkUserId(wrapper.getIds()); checkUserId(wrapper.getIds());
LongUtils.checkId(wrapper.getId(), "角色id不能为空"); LongUtils.checkId(wrapper.getId(), "角色id不能为空");
userService.bindRole(wrapper.getIds(), wrapper.getId()); userFacade.bindRole(wrapper.getIds(), wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -125,7 +114,7 @@ public class UserController {
public Result<Void> unBindRole(@RequestBody IdWrapper wrapper) { public Result<Void> unBindRole(@RequestBody IdWrapper wrapper) {
checkUserId(wrapper.getIds()); checkUserId(wrapper.getIds());
LongUtils.checkId(wrapper.getId(), "角色id不能为空"); LongUtils.checkId(wrapper.getId(), "角色id不能为空");
userService.unBindRole(wrapper.getIds(), wrapper.getId()); userFacade.unBindRole(wrapper.getIds(), wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -135,7 +124,7 @@ public class UserController {
@Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE) @Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE)
public Result<Void> unBindAllRole(@RequestBody IdWrapper wrapper) { public Result<Void> unBindAllRole(@RequestBody IdWrapper wrapper) {
LongUtils.checkId(wrapper.getId(), "角色id不能为空"); LongUtils.checkId(wrapper.getId(), "角色id不能为空");
userService.unBindAllRole(wrapper.getId()); userFacade.unBindAllRole(wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -144,7 +133,7 @@ public class UserController {
public Result<TableDataInfo<UserVo>> dept(@PathVariable Long deptId, String userName, String phoneNumber) { public Result<TableDataInfo<UserVo>> dept(@PathVariable Long deptId, String userName, String phoneNumber) {
LongUtils.checkId(deptId, "角色id不能为空!"); LongUtils.checkId(deptId, "角色id不能为空!");
PageUtils.startPage(); PageUtils.startPage();
List<UserVo> userList = userService.searchListByDeptId(deptId, userName, phoneNumber); List<UserVo> userList = userFacade.searchListByDeptId(deptId, userName, phoneNumber);
TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userList); TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userList);
return Result.ok(dataTable); return Result.ok(dataTable);
} }
@@ -153,7 +142,7 @@ public class UserController {
// @GetMapping("/dept/exclude/{deptId}") // @GetMapping("/dept/exclude/{deptId}")
public Result<TableDataInfo<UserVo>> excludeDept(@PathVariable Long deptId, String userName, String phoneNumber) { public Result<TableDataInfo<UserVo>> excludeDept(@PathVariable Long deptId, String userName, String phoneNumber) {
LongUtils.checkId(deptId, "角色id不能为空!"); LongUtils.checkId(deptId, "角色id不能为空!");
TableDataInfo<UserVo> table = userService.searchUserListByExcludeDeptId(deptId, userName, phoneNumber); TableDataInfo<UserVo> table = userFacade.searchUserListByExcludeDeptId(deptId, userName, phoneNumber);
return Result.ok(table); return Result.ok(table);
} }
@@ -164,7 +153,7 @@ public class UserController {
public Result<Void> unBindDept(@PathVariable List<Long> userIds, @PathVariable Long deptId) { public Result<Void> unBindDept(@PathVariable List<Long> userIds, @PathVariable Long deptId) {
checkUserId(userIds); checkUserId(userIds);
LongUtils.checkId(deptId, "角色id不能为空"); LongUtils.checkId(deptId, "角色id不能为空");
userService.unBindDept(userIds, deptId); userFacade.unBindDept(userIds, deptId);
return Result.ok(); return Result.ok();
} }
@@ -174,7 +163,7 @@ public class UserController {
// @Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE) // @Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE)
public Result<Void> unBindAllDept(@PathVariable Long deptId) { public Result<Void> unBindAllDept(@PathVariable Long deptId) {
LongUtils.checkId(deptId, "角色id不能为空"); LongUtils.checkId(deptId, "角色id不能为空");
userService.unBindAllDept(deptId); userFacade.unBindAllDept(deptId);
return Result.ok(); return Result.ok();
} }
@@ -185,7 +174,7 @@ public class UserController {
return Result.error("岗位id不能为空!"); return Result.error("岗位id不能为空!");
} }
PageUtils.startPage(); PageUtils.startPage();
List<UserVo> userList = userService.searchListByPostId(postId, userName, phoneNumber); List<UserVo> userList = userFacade.searchListByPostId(postId, userName, phoneNumber);
TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userList); TableDataInfo<UserVo> dataTable = PageUtils.getDataTable(userList);
return Result.ok(dataTable); return Result.ok(dataTable);
} }
@@ -195,7 +184,7 @@ public class UserController {
@GetMapping("/post/exclude/{postId}") @GetMapping("/post/exclude/{postId}")
public Result<TableDataInfo<UserVo>> excludePost(@PathVariable Long postId, String userName, String phoneNumber) { public Result<TableDataInfo<UserVo>> excludePost(@PathVariable Long postId, String userName, String phoneNumber) {
LongUtils.checkId(postId, "角色id不能为空!"); LongUtils.checkId(postId, "角色id不能为空!");
TableDataInfo<UserVo> table = userService.searchUserListByExcludePostId(postId, userName, phoneNumber); TableDataInfo<UserVo> table = userFacade.searchUserListByExcludePostId(postId, userName, phoneNumber);
return Result.ok(table); return Result.ok(table);
} }
@@ -207,7 +196,7 @@ public class UserController {
public Result<Void> bindPost(@RequestBody IdWrapper wrapper) { public Result<Void> bindPost(@RequestBody IdWrapper wrapper) {
checkUserId(wrapper.getIds()); checkUserId(wrapper.getIds());
LongUtils.checkId(wrapper.getId(), "角色id不能为空"); LongUtils.checkId(wrapper.getId(), "角色id不能为空");
userService.bindPost(wrapper.getIds(), wrapper.getId()); userFacade.bindPost(wrapper.getIds(), wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -218,7 +207,7 @@ public class UserController {
public Result<Void> unBindPost(@RequestBody IdWrapper wrapper) { public Result<Void> unBindPost(@RequestBody IdWrapper wrapper) {
checkUserId(wrapper.getIds()); checkUserId(wrapper.getIds());
LongUtils.checkId(wrapper.getId(), "岗位id不能为空"); LongUtils.checkId(wrapper.getId(), "岗位id不能为空");
userService.unBindPost(wrapper.getIds(), wrapper.getId()); userFacade.unBindPost(wrapper.getIds(), wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -228,7 +217,7 @@ public class UserController {
@Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE) @Log(title = "解除当前角色对应的所有用户的绑定关系", businessType = BusinessType.UPDATE)
public Result<Void> unBindAllPost(@RequestBody IdWrapper wrapper) { public Result<Void> unBindAllPost(@RequestBody IdWrapper wrapper) {
LongUtils.checkId(wrapper.getId(), "岗位id不能为空"); LongUtils.checkId(wrapper.getId(), "岗位id不能为空");
userService.unBindAllPost(wrapper.getId()); userFacade.unBindAllPost(wrapper.getId());
return Result.ok(); return Result.ok();
} }
@@ -241,7 +230,7 @@ public class UserController {
return Result.error("初始密码不能为空"); return Result.error("初始密码不能为空");
} }
checkPhone(user.getPhoneNumber()); checkPhone(user.getPhoneNumber());
userService.save(user); userFacade.save(user);
return Result.ok(); return Result.ok();
} }
@@ -253,7 +242,7 @@ public class UserController {
public Result<Void> edit(@NotNull @RequestBody @Validated UserDto user) { public Result<Void> edit(@NotNull @RequestBody @Validated UserDto user) {
checkUserId(user.getUserId()); checkUserId(user.getUserId());
checkPhone(user.getPhoneNumber()); checkPhone(user.getPhoneNumber());
userService.edit(user); userFacade.edit(user);
return Result.ok(); return Result.ok();
} }
@@ -263,7 +252,7 @@ public class UserController {
@Log(title = "删除用户", businessType = BusinessType.DELETE) @Log(title = "删除用户", businessType = BusinessType.DELETE)
public Result<Void> del(@PathVariable Long userId) { public Result<Void> del(@PathVariable Long userId) {
checkUserId(userId); checkUserId(userId);
userService.remove(userId); userFacade.remove(userId);
return Result.ok(); return Result.ok();
} }

View File

@@ -0,0 +1,13 @@
package cn.fateverse.admin.convert;
import cn.fateverse.admin.dto.DeptDto;
import cn.fateverse.admin.vo.DeptVo;
import cn.fateverse.common.core.convert.BaseConvertDefine;
import cn.fateverse.common.core.entity.Dept;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface DeptConvert extends BaseConvertDefine<DeptDto, Dept, DeptVo> {
DeptConvert INSTANCE = Mappers.getMapper(DeptConvert.class);
}

View File

@@ -0,0 +1,14 @@
package cn.fateverse.admin.convert;
import cn.fateverse.admin.dto.RoleDto;
import cn.fateverse.admin.vo.RoleVo;
import cn.fateverse.common.core.convert.BaseConvertDefine;
import cn.fateverse.common.core.entity.Role;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface RoleConvert extends BaseConvertDefine<RoleDto, Role, RoleVo> {
RoleConvert INSTANCE = Mappers.getMapper(RoleConvert.class);
}

View File

@@ -0,0 +1,22 @@
package cn.fateverse.admin.convert;
import cn.fateverse.admin.dto.UserDto;
import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.convert.BaseConvertDefine;
import cn.fateverse.common.core.entity.User;
import cn.fateverse.common.core.entity.UserDetail;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface UserConvert extends BaseConvertDefine<UserDto, User, UserVo> {
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
/**
* 实体到细节
*
* @param user 用户
* @return {@link UserDetail }
*/
UserDetail entityToDetail(User user);
}

View File

@@ -1,7 +1,8 @@
package cn.fateverse.admin.dubbo; package cn.fateverse.admin.dubbo;
import cn.fateverse.admin.service.DeptService; import cn.fateverse.admin.facade.DeptFacade;
import cn.fateverse.admin.vo.DeptVo; import cn.fateverse.admin.vo.DeptVo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
import java.util.List; import java.util.List;
@@ -11,18 +12,15 @@ import java.util.List;
* @date 2023-02-20 * @date 2023-02-20
*/ */
@DubboService @DubboService
@RequiredArgsConstructor
public class DubboDeptServiceImpl implements DubboDeptService { public class DubboDeptServiceImpl implements DubboDeptService {
private final DeptService deptService; private final DeptFacade deptFacade;
public DubboDeptServiceImpl(DeptService deptService) {
this.deptService = deptService;
}
@Override @Override
public List<DeptVo> searchDeptByDeptId(List<Long> deptIds) { public List<DeptVo> searchDeptByDeptId(List<Long> deptIds) {
return deptService.searchByIds(deptIds); return deptFacade.searchByIds(deptIds);
} }
} }

View File

@@ -1,9 +1,10 @@
package cn.fateverse.admin.dubbo; package cn.fateverse.admin.dubbo;
import cn.fateverse.admin.entity.User; import cn.fateverse.admin.facade.UserFacade;
import cn.fateverse.admin.service.UserService;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.UserDetail;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
@@ -15,24 +16,21 @@ import java.util.List;
*/ */
@Slf4j @Slf4j
@DubboService @DubboService
@RequiredArgsConstructor
public class DubboUserServiceImpl implements DubboUserService { public class DubboUserServiceImpl implements DubboUserService {
private final UserService userService; private final UserFacade userFacade;
public DubboUserServiceImpl(UserService userService) {
this.userService = userService;
}
@Override @Override
public User getUserByUsername(String username) { public UserVo getUserByUsername(String username) {
log.info("用户登录:{}", username); log.info("用户登录:{}", username);
return userService.searchByUserName(username); return userFacade.searchByUserName(username);
} }
@Override @Override
public User getUserByUserId(Long userId) { public UserVo getUserByUserId(Long userId) {
return userService.searchUserInfoByUserId(userId); return userFacade.searchByUserId(userId);
} }
@Override @Override
@@ -40,7 +38,7 @@ public class DubboUserServiceImpl implements DubboUserService {
if (roleIds.isEmpty()) { if (roleIds.isEmpty()) {
throw new CustomException("角色id不能为空"); throw new CustomException("角色id不能为空");
} }
return userService.searchListByRoleIds(roleIds); return userFacade.searchListByRoleIds(roleIds);
} }
@Override @Override
@@ -48,7 +46,7 @@ public class DubboUserServiceImpl implements DubboUserService {
if (userIds.isEmpty()) { if (userIds.isEmpty()) {
throw new CustomException("用户id不能为空"); throw new CustomException("用户id不能为空");
} }
return userService.searchByUserIds(userIds); return userFacade.searchByUserIds(userIds);
} }
@Override @Override
@@ -56,11 +54,16 @@ public class DubboUserServiceImpl implements DubboUserService {
if (deptIds.isEmpty()) { if (deptIds.isEmpty()) {
throw new CustomException("部门id不能为空"); throw new CustomException("部门id不能为空");
} }
return userService.searchByDeptIds(deptIds); return userFacade.searchByDeptIds(deptIds);
} }
@Override @Override
public List<Long> searchAllUserIds() { public List<Long> searchAllUserIds() {
return userService.searchAllUserIds(); return userFacade.searchAllUserIds();
}
@Override
public UserDetail getUserDetailsByUserName(String userName) {
return userFacade.getUserDetailsByUserName(userName);
} }
} }

View File

@@ -0,0 +1,178 @@
package cn.fateverse.admin.facade;
import cn.fateverse.admin.convert.DeptConvert;
import cn.fateverse.admin.dto.DeptDto;
import cn.fateverse.admin.service.DeptService;
import cn.fateverse.admin.service.UserService;
import cn.fateverse.admin.vo.DeptVo;
import cn.fateverse.common.core.constant.BaseConstant;
import cn.fateverse.common.core.constant.UserConstants;
import cn.fateverse.common.core.entity.Dept;
import cn.fateverse.common.core.entity.OptionTree;
import cn.fateverse.common.core.utils.AssertUtil;
import cn.fateverse.common.core.utils.convert.TreeUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class DeptFacade {
private final DeptService deptService;
private final UserService userService;
/**
* 查询树形结构信息
*
* @param deptName 部门名称
* @param state 状态
* @return {@link List }<{@link DeptVo }>
*/
public List<DeptVo> searchTree(String deptName, Integer state) {
List<Dept> deptList = deptService.list(deptName, state);
return TreeUtil.build(deptList, DeptVo.class, (config) -> {
config.setIdField("deptId");
config.setExclude("phone");
});
}
/**
* 按id查询
*
* @param deptId 部门id
* @return {@link DeptVo }
*/
public DeptVo searchById(Long deptId) {
Dept dept = deptService.getById(deptId);
return DeptConvert.INSTANCE.entityToVo(dept);
}
/**
* 获取部门选择的树形结构
*
* @return {@link List }<{@link OptionTree }> 部门树形选择对象
*/
public List<OptionTree> searchTreeOption() {
List<Dept> deptList = deptService.list(null, null);
return TreeUtil.build(deptList, OptionTree.class, (config) -> {
config.setIdField("deptId");
config.setOption("deptId", "deptName");
});
}
/**
* 搜索排除树
*
* @param deptId 部门id
* @return {@link List }<{@link OptionTree }>
*/
public List<OptionTree> searchExcludeTree(Long deptId) {
Dept dept = deptService.getById(deptId);
if (BaseConstant.ZERO.equals(dept.getParentId())) {
return List.of();
}
List<Dept> deptList = deptService.searchExcludeTree(deptId);
return TreeUtil.build(deptList, OptionTree.class, (config) -> {
config.setIdField("deptId");
config.setOption("deptId", "deptName");
});
}
/**
* 保存
*
* @param deptDto 部门dto
*/
@Transactional(rollbackFor = Exception.class)
public void save(DeptDto deptDto) {
Dept dept = DeptConvert.INSTANCE.dtoToEntity(deptDto);
deptService.checkNameUnique(dept);
deptService.save(dept);
}
/**
* 编辑
*
* @param deptDto 部门dto
*/
@Transactional(rollbackFor = Exception.class)
public void edit(DeptDto deptDto) {
Dept dept = DeptConvert.INSTANCE.dtoToEntity(deptDto);
deptService.checkNameUnique(dept);
AssertUtil.isTrue(!dept.getDeptId().equals(dept.getParentId()), "修改部门: {} '失败,上级部门不能为自己!", dept.getDeptName());
Dept newParentDept = deptService.getById(dept.getParentId());
Dept oldDept = deptService.getById(dept.getDeptId());
if (null != newParentDept && null != oldDept) {
String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
String oldAncestors = oldDept.getAncestors();
dept.setAncestors(newAncestors);
updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
}
if (null != newParentDept && UserConstants.DEPT_DISABLE.equals(newParentDept.getState())) {
updateParentDept(dept);
}
deptService.save(dept);
}
/**
* 更新字元素的ancestors
*
* @param deptId
* @param newAncestors
* @param odlAncestors
*/
public void updateDeptChildren(Long deptId, String newAncestors, String odlAncestors) {
List<Dept> children = deptService.selectChildrenById(deptId);
List<Dept> newChildren = children.stream().peek(child -> {
child.setAncestors(child.getAncestors().replace(odlAncestors, newAncestors));
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(newChildren)) {
deptService.updateBatchById(newChildren);
}
}
/**
* 更新父级部门的状态
*
* @param dept
*/
public void updateParentDept(Dept dept) {
Dept parent = deptService.getById(dept.getParentId());
parent.setState(dept.getState());
deptService.updateById(parent);
}
/**
* 删除
*
* @param deptId 部门id
*/
@Transactional(rollbackFor = Exception.class)
public void remove(Long deptId) {
AssertUtil.isTrue(!deptService.hasChildById(deptId), "存在下级部门,不允许删除");
AssertUtil.isTrue(!userService.checkExistUser(deptId), "该部门下存在用户,不允许删除");
deptService.removeById(deptId);
}
/**
* 按id搜索
*
* @param deptIds 部门id
* @return {@link List }<{@link DeptVo }>
*/
public List<DeptVo> searchByIds(List<Long> deptIds) {
List<Dept> deptList = deptService.searchByIds(deptIds);
return DeptConvert.INSTANCE.entityToVOList(deptList);
}
}

View File

@@ -0,0 +1,70 @@
package cn.fateverse.admin.facade;
import cn.fateverse.admin.convert.RoleConvert;
import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.admin.service.RoleService;
import cn.fateverse.admin.service.UserRoleService;
import cn.fateverse.admin.vo.RoleVo;
import cn.fateverse.common.core.entity.Option;
import cn.fateverse.common.core.entity.Role;
import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.mybatisplus.utils.PageConditionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class RoleFacade {
private final RoleService roleService;
private final UserRoleService userRoleService;
/**
* 搜索选项
*
* @return {@link List }<{@link Option }>
*/
public List<Option> searchOption() {
List<Role> list = roleService.list();
return null;
}
/**
* 搜索列表
*
* @param query 查询
* @return {@link TableDataInfo }<{@link RoleVo }>
*/
public TableDataInfo<RoleVo> searchList(RoleQuery query) {
IPage<Role> page = roleService.searchList(query);
return PageConditionUtil.convertDataTable(page, RoleConvert.INSTANCE::entityToVo);
}
/**
* 按id查询
*
* @param roleId 角色id
* @return {@link RoleVo }
*/
public RoleVo searchById(Long roleId) {
Role role = roleService.getById(roleId);
return RoleConvert.INSTANCE.entityToVo(role);
}
/**
* 搜索列表排除菜单id
*
* @param menuId 菜单id
* @param roleName 角色名
* @param roleKey 关键角色
* @return {@link TableDataInfo }<{@link RoleVo }>
*/
public TableDataInfo<RoleVo> searchListExcludeMenuId(Long menuId, String roleName, String roleKey) {
return null;
}
}

View File

@@ -0,0 +1,166 @@
package cn.fateverse.admin.facade;
import cn.fateverse.admin.convert.UserConvert;
import cn.fateverse.admin.query.UserQuery;
import cn.fateverse.admin.service.*;
import cn.fateverse.admin.vo.UserChooseVo;
import cn.fateverse.admin.vo.UserDetailVo;
import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.Dept;
import cn.fateverse.common.core.entity.Role;
import cn.fateverse.common.core.entity.User;
import cn.fateverse.common.core.entity.UserDetail;
import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.mybatisplus.utils.PageConditionUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class UserFacade {
private final UserService userService;
private final UserRoleService userRoleService;
private final UserPostService userPostService;
private final DeptService deptService;
private final RoleService roleService;
/**
* 按用户名搜索
*
* @param username 用户名
* @return {@link UserVo }
*/
public UserVo searchByUserName(String username) {
User user = userService.searchByUserName(username);
return UserConvert.INSTANCE.entityToVo(user);
}
/**
* 按用户id搜索
*
* @param userId 用户id
* @return {@link UserVo }
*/
public UserVo searchByUserId(Long userId) {
User user = userService.getById(userId);
return UserConvert.INSTANCE.entityToVo(user);
}
public UserDetail getUserDetailsByUserName(String username) {
User user = userService.searchByUserName(username);
return buildUserDetail(user);
}
/**
* 构建用户细节
*
* @param user 用户
* @return {@link UserDetail }
*/
private UserDetail buildUserDetail(User user) {
if (ObjectUtil.isNull(user)) {
return null;
}
UserDetail userDetail = UserConvert.INSTANCE.entityToDetail(user);
Dept dept = deptService.getById(user.getDeptId());
if (ObjectUtil.isNotNull(dept)) {
userDetail.setDept(dept);
}
List<Role> roleList = userRoleService.selectRoleByUserId(user.getUserId());
if (CollUtil.isNotEmpty(roleList)) {
userDetail.setRoles(roleList);
}
return userDetail;
}
/**
* 搜索列表
*
* @param userQuery 用户查询
* @return {@link List }<{@link UserVo }>
*/
public TableDataInfo<UserVo> searchList(UserQuery userQuery) {
IPage<UserVo> page = userService.searchList(userQuery);
return PageConditionUtil.convertDataTable(page);
}
/**
* 搜索用户选择角色或部门
*
* @param type 类型
* @param chooseId 选择id
* @return {@link List }<{@link UserChooseVo }>
*/
public List<UserChooseVo> searchUserChooseRoleOrDept(Integer type, Long chooseId) {
switch (type) {
// 0代表角色
case 0:
return chooseRole(chooseId);
// 1代表部门
case 1:
return chooseDept(chooseId);
default:
throw new CustomException("参数异常");
}
}
/**
* 选择角色
*
* @param roleId 角色id
* @return 选择成功的用户信息
*/
private List<UserChooseVo> chooseRole(Long roleId) {
if (roleId.equals(0L)) {
List<Role> roleList = roleService.list();
return roleList.stream().map(UserChooseVo::toUserChooseByRole).collect(Collectors.toList());
} else {
List<UserVo> userList = userService.selectUserListByRoleId(roleId, null, null);
return userList.stream().map(user ->
UserChooseVo.toUserChooseByUser(user, roleId)
).collect(Collectors.toList());
}
}
/**
* 选择部门
*
* @param deptId
* @return
*/
private List<UserChooseVo> chooseDept(Long deptId) {
List<Dept> deptList = deptService.selectListByDeptParentId(deptId);
List<UserChooseVo> result = deptList.stream().map(dept -> UserChooseVo.toUserChooseByDept(dept, deptId)).collect(Collectors.toList());
List<UserVo> userList = userService.selectByDeptIds(Collections.singletonList(deptId));
userList.forEach(user -> result.add(UserChooseVo.toUserChooseByUser(user, deptId)));
return result;
}
/**
* 按用户id搜索详细信息
*
* @param userId 用户id
* @return {@link UserDetailVo }
*/
public UserDetailVo searchDetailByUserId(Long userId) {
User user = userService.getById(userId);
UserDetail userDetail = buildUserDetail(user);
UserDetailVo detailVo = new UserDetailVo();
detailVo.setUser(userDetail);
return detailVo;
}
}

View File

@@ -1,137 +1,25 @@
package cn.fateverse.admin.mapper; package cn.fateverse.admin.mapper;
import cn.fateverse.admin.entity.Dept; import cn.fateverse.common.core.entity.Dept;
import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author Clay * @author Clay
* @date 2022/11/2 * @date 2022/11/2
*/ */
public interface DeptMapper { public interface DeptMapper extends BaseMapper<Dept> {
/**
* 查询部门列表
*
* @param deptName 部门名称
* @param state 部门状态
* @return 部门集合
*/
List<Dept> selectList(@Param("deptName") String deptName, @Param("state") Integer state);
/**
* 通过id查询部门信息
*
* @param deptId 部门id
* @return 返回对象
*/
Dept selectById(Long deptId);
/**
* 获取排除自身的部门列表
*
* @param deptId 部门id
* @return 部门集合
*/
List<Dept> selectExclude(Long deptId);
/**
* 查询所有的子节点
*
* @param deptId 部门id
* @return 部门集合
*/
List<Dept> selectChildrenById(Long deptId);
/**
* 校验部门名称是否唯一
*
* @param deptName 部门名称
* @param parentId 父部门ID
* @return 结果
*/
Dept selectByDeptNameAndParentId(@Param("deptName") String deptName, @Param("parentId") Long parentId);
/** /**
* 根据父id查询部门信息 * 根据父id查询部门信息
*
* @param parentId 父级部门id * @param parentId 父级部门id
* @return 部门集合 * @return 部门集合
*/ */
List<Dept> selectListByDeptParentId(Long parentId); List<Dept> selectListByDeptParentId(Long parentId);
/**
* 通过parentId查询子列表
*
* @param parentId 父级id
* @return 部门名称集合
*/
Set<String> selectDeptNameListByParentId(Long parentId);
/**
* 查找是否存在子节点
*
* @param deptId 部门id
* @return 数量
*/
int selectChildCountByDeptId(Long deptId);
/**
* 查询部门是否存在用户
*
* @param deptId 部门id
* @return 数量
*/
int selectExistUserCount(Long deptId);
/**
* 根据ids获取到部门
*
* @param deptIds 部门id列表
* @return 部门集合对象
*/
List<Dept> selectByIds(List<Long> deptIds);
/**
* 新增部门
*
* @param dept 部门对象
* @return 影响条数
*/
int insert(Dept dept);
/**
* 更新部门信息
*
* @param dept 部门对象
* @return 影响条数
*/
int update(Dept dept);
/**
* 修改部门的状态;
*
* @param dept 部门对象
* @return 影响条数
*/
int updateState(Dept dept);
/**
* 批量修改子元素之前的关系
*
* @param depts 子元素
* @return 结果
*/
int updateChildren(@Param("depts") List<Dept> depts);
/**
* 删除部门
*
* @param deptId 部门id
* @return 运行结构
*/
int delete(Long deptId);
} }

View File

@@ -1,7 +1,8 @@
package cn.fateverse.admin.mapper; package cn.fateverse.admin.mapper;
import cn.fateverse.admin.entity.Role;
import cn.fateverse.admin.query.RoleQuery; import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.common.core.entity.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@@ -10,7 +11,7 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/11/4 * @date 2022/11/4
*/ */
public interface RoleMapper { public interface RoleMapper extends BaseMapper<Role> {
/** /**

View File

@@ -1,9 +1,11 @@
package cn.fateverse.admin.mapper; package cn.fateverse.admin.mapper;
import cn.fateverse.admin.entity.User;
import cn.fateverse.admin.entity.UserBase;
import cn.fateverse.admin.query.UserQuery; import cn.fateverse.admin.query.UserQuery;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.User;
import cn.fateverse.common.core.entity.UserDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@@ -12,7 +14,7 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/10/30 * @date 2022/10/30
*/ */
public interface UserMapper { public interface UserMapper extends BaseMapper<User> {
/** /**
* 通过用户名查询用户 * 通过用户名查询用户
@@ -32,10 +34,11 @@ public interface UserMapper {
/** /**
* 查询用户列表 * 查询用户列表
* *
* @param page 页面
* @param query 用户查询信息 * @param query 用户查询信息
* @return 用户信息 * @return 用户信息
*/ */
List<UserVo> selectList(UserQuery query); IPage<UserVo> selectPage(@Param("page") IPage<User> page, @Param("query") UserQuery query);
/** /**
* 排除角色id * 排除角色id
@@ -88,7 +91,7 @@ public interface UserMapper {
* @param deptIds 部门id列表 * @param deptIds 部门id列表
* @return 用户信息 * @return 用户信息
*/ */
List<UserVo> selectUserByDeptIds(List<Long> deptIds); List<UserVo> selectByDeptIds(List<Long> deptIds);
/** /**
* 根据岗位id查询用户信息 * 根据岗位id查询用户信息
@@ -104,7 +107,7 @@ public interface UserMapper {
* @param userId 用户id * @param userId 用户id
* @return 用户信息 * @return 用户信息
*/ */
User selectUserByUserId(Long userId); UserDetail selectUserByUserId(Long userId);
/** /**
* 校验用户是否唯一 * 校验用户是否唯一
@@ -136,7 +139,7 @@ public interface UserMapper {
* @param user 用户信息 * @param user 用户信息
* @return 结果 * @return 结果
*/ */
int insert(UserBase user); int insert(User user);
/** /**
* 更新用户 * 更新用户
@@ -144,7 +147,7 @@ public interface UserMapper {
* @param user 用户信息 * @param user 用户信息
* @return 结果 * @return 结果
*/ */
int update(UserBase user); int update(User user);
/** /**
* 删除用户 * 删除用户

View File

@@ -1,6 +1,7 @@
package cn.fateverse.admin.mapper; package cn.fateverse.admin.mapper;
import cn.fateverse.admin.entity.UserPost; import cn.fateverse.admin.entity.UserPost;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@@ -9,7 +10,7 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/11/26 * @date 2022/11/26
*/ */
public interface UserPostMapper { public interface UserPostMapper extends BaseMapper<UserPost> {
/** /**
* 批量新增用户角色映射关系 * 批量新增用户角色映射关系
* *

View File

@@ -2,6 +2,8 @@ package cn.fateverse.admin.mapper;
import cn.fateverse.admin.entity.UserRole; import cn.fateverse.admin.entity.UserRole;
import cn.fateverse.common.core.entity.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@@ -10,7 +12,7 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/11/6 * @date 2022/11/6
*/ */
public interface UserRoleMapper { public interface UserRoleMapper extends BaseMapper<UserRole> {
/** /**
* 批量新增用户角色映射关系 * 批量新增用户角色映射关系
@@ -54,4 +56,11 @@ public interface UserRoleMapper {
*/ */
int bind(@Param("userIds") List<Long> userIds, @Param("roleId") Long roleId); int bind(@Param("userIds") List<Long> userIds, @Param("roleId") Long roleId);
/**
* 根据用户id选择角色
*
* @param userId 用户id
* @return {@link List }<{@link Role }>
*/
List<Role> selectRoleByUserId(Long userId);
} }

View File

@@ -1,8 +1,7 @@
package cn.fateverse.admin.service; package cn.fateverse.admin.service;
import cn.fateverse.admin.vo.DeptVo; import cn.fateverse.common.core.entity.Dept;
import cn.fateverse.admin.entity.Dept; import com.baomidou.mybatisplus.extension.service.IService;
import cn.fateverse.common.core.entity.OptionTree;
import java.util.List; import java.util.List;
@@ -10,24 +9,16 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/11/2 * @date 2022/11/2
*/ */
public interface DeptService { public interface DeptService extends IService<Dept> {
/** /**
* 查询部门树形结构数据 * 查询部门树形结构数据
* *
* @param deptName 部门名称 * @param deptName 部门名称
* @param state 部门状态 * @param state 部门状态
* @return 部门集合 * @return 部门集合
*/ */
List<DeptVo> searchTree(String deptName, Integer state); List<Dept> list(String deptName, Integer state);
/**
* 部门id查询部门信息
*
* @param deptId 部门id
* @return 返回对象
*/
DeptVo searchById(Long deptId);
/** /**
* 获取排除自身的部门树形结构 * 获取排除自身的部门树形结构
@@ -35,14 +26,7 @@ public interface DeptService {
* @param deptId 部门id * @param deptId 部门id
* @return 部门树形选择对象 * @return 部门树形选择对象
*/ */
List<OptionTree> searchExcludeTree(Long deptId); List<Dept> searchExcludeTree(Long deptId);
/**
* 获取部门选择的树形结构
*
* @return 部门树形选择对象
*/
List<OptionTree> searchTreeOption();
/** /**
* 通过ids获取到部门数据 * 通过ids获取到部门数据
@@ -50,15 +34,14 @@ public interface DeptService {
* @param deptIds 部门id列表 * @param deptIds 部门id列表
* @return 部门集合对象 * @return 部门集合对象
*/ */
List<DeptVo> searchByIds(List<Long> deptIds); List<Dept> searchByIds(List<Long> deptIds);
/** /**
* 校验部门名称是否唯一 * 校验部门名称是否唯一
* *
* @param dept 部门对象 * @param dept 部门对象
* @return 结果
*/ */
String checkNameUnique(Dept dept); void checkNameUnique(Dept dept);
/** /**
* 是否存在部门子节点 * 是否存在部门子节点
@@ -69,34 +52,19 @@ public interface DeptService {
boolean hasChildById(Long deptId); boolean hasChildById(Long deptId);
/** /**
* 查询部门是否存在用户 * 按id选择子代
*
* @param deptId 部门ID
* @return 结果 true 存在 false 不存在
*/
boolean checkExistUser(Long deptId);
/**
* 新增部门
*
* @param dept 部门对象
* @return 影响条数
*/
int save(Dept dept);
/**
* 更新部门信息
*
* @param dept 部门对象
* @return 影响条数
*/
int edit(Dept dept);
/**
* 删除部门
* *
* @param deptId 部门id * @param deptId 部门id
* @return 影响条数 * @return {@link List }<{@link Dept }>
*/ */
int remove(Long deptId); List<Dept> selectChildrenById(Long deptId);
/**
* 按部门父级id选择列表
*
* @param deptId 部门id
* @return {@link List }<{@link Dept }>
*/
List<Dept> selectListByDeptParentId(Long deptId);
} }

View File

@@ -4,7 +4,10 @@ import cn.fateverse.admin.dto.RoleDto;
import cn.fateverse.admin.query.RoleQuery; import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.admin.vo.RoleVo; import cn.fateverse.admin.vo.RoleVo;
import cn.fateverse.common.core.entity.Option; import cn.fateverse.common.core.entity.Option;
import cn.fateverse.common.core.entity.Role;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@@ -12,7 +15,7 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/11/4 * @date 2022/11/4
*/ */
public interface RoleService { public interface RoleService extends IService<Role> {
/** /**
* 查询角色列表 * 查询角色列表
@@ -20,7 +23,7 @@ public interface RoleService {
* @param query * @param query
* @return * @return
*/ */
TableDataInfo<RoleVo> searchList(RoleQuery query); IPage<Role> searchList(RoleQuery query);
/** /**

View File

@@ -0,0 +1,8 @@
package cn.fateverse.admin.service;
import cn.fateverse.admin.entity.UserPost;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserPostService extends IService<UserPost> {
}

View File

@@ -0,0 +1,13 @@
package cn.fateverse.admin.service;
import cn.fateverse.admin.entity.UserRole;
import cn.fateverse.common.core.entity.Role;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface UserRoleService extends IService<UserRole> {
List<Role> selectRoleByUserId(Long userId);
}

View File

@@ -1,12 +1,15 @@
package cn.fateverse.admin.service; package cn.fateverse.admin.service;
import cn.fateverse.admin.dto.UserDto; import cn.fateverse.admin.dto.UserDto;
import cn.fateverse.admin.entity.User;
import cn.fateverse.admin.query.UserQuery; import cn.fateverse.admin.query.UserQuery;
import cn.fateverse.admin.vo.UserChooseVo; import cn.fateverse.admin.vo.UserChooseVo;
import cn.fateverse.admin.vo.UserDetailVo; import cn.fateverse.admin.vo.UserDetailVo;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.User;
import cn.fateverse.common.core.entity.UserDetail;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@@ -14,7 +17,7 @@ import java.util.List;
* @author Clay * @author Clay
* @date 2022/10/30 * @date 2022/10/30
*/ */
public interface UserService { public interface UserService extends IService<User> {
/** /**
* 通过用户名查询用户信息 * 通过用户名查询用户信息
@@ -31,7 +34,7 @@ public interface UserService {
* @param userId 用户ID * @param userId 用户ID
* @return 用户对象 * @return 用户对象
*/ */
User searchUserInfoByUserId(Long userId); UserDetail searchUserInfoByUserId(Long userId);
/** /**
@@ -40,7 +43,7 @@ public interface UserService {
* @param user * @param user
* @return * @return
*/ */
List<UserVo> searchList(UserQuery user); IPage<UserVo> searchList(UserQuery user);
/** /**
* 根据角色或者是部门获取到用户信息 * 根据角色或者是部门获取到用户信息
@@ -91,14 +94,14 @@ public interface UserService {
* *
* @param user@return * @param user@return
*/ */
boolean checkUserNameUnique(UserDto user); boolean checkUserNameUnique(User user);
/** /**
* 校验手机号是否唯一 * 校验手机号是否唯一
* *
* @param user@return * @param user@return
*/ */
boolean checkPhoneNumberUnique(UserDto user); boolean checkPhoneNumberUnique(User user);
/** /**
* 校验邮箱是否唯一 * 校验邮箱是否唯一
@@ -263,4 +266,30 @@ public interface UserService {
* @return * @return
*/ */
List<Long> searchAllUserIds(); List<Long> searchAllUserIds();
/**
* 检查现有用户
*
* @param deptId 部门id
* @return boolean
*/
boolean checkExistUser(Long deptId);
/**
* 根据角色id选择用户列表
*
* @param roleId
* @param userName 用户名
* @param phoneNumber 电话号码
* @return {@link List }<{@link UserVo }>
*/
List<UserVo> selectUserListByRoleId(Long roleId, String userName, String phoneNumber);
/**
* 按部门id选择
*
* @param deptIds 部门id
* @return {@link List }<{@link UserVo }>
*/
List<UserVo> selectByDeptIds(List<Long> deptIds);
} }

View File

@@ -1,20 +1,20 @@
package cn.fateverse.admin.service.impl; package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.dto.ConfigDto; import cn.fateverse.admin.dto.ConfigDto;
import cn.fateverse.admin.query.ConfigQuery;
import cn.fateverse.admin.vo.ConfigVo;
import cn.fateverse.admin.entity.Config; import cn.fateverse.admin.entity.Config;
import cn.fateverse.admin.mapper.ConfigMapper; import cn.fateverse.admin.mapper.ConfigMapper;
import cn.fateverse.admin.query.ConfigQuery;
import cn.fateverse.admin.service.ConfigService; import cn.fateverse.admin.service.ConfigService;
import cn.fateverse.admin.vo.ConfigVo;
import cn.fateverse.common.core.entity.PageInfo; import cn.fateverse.common.core.entity.PageInfo;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.core.utils.TableSupport; import cn.fateverse.common.core.utils.TableSupport;
import cn.fateverse.common.mybatis.utils.PageUtils; import cn.fateverse.common.mybatis.utils.PageUtils;
import cn.fateverse.common.mybatisplus.utils.PageConditionUtil;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@@ -48,7 +48,7 @@ public class ConfigServiceImpl implements ConfigService {
PageUtils.startPage(); PageUtils.startPage();
List<Config> list = configMapper.selectList(query); List<Config> list = configMapper.selectList(query);
log.info("query time :{}", (System.currentTimeMillis() - startTime)); log.info("query time :{}", (System.currentTimeMillis() - startTime));
return PageUtils.convertDataTable(list, ConfigVo::toConfigVo); return PageConditionUtil.convertDataTable(list, ConfigVo::toConfigVo);
} }

View File

@@ -1,23 +1,18 @@
package cn.fateverse.admin.service.impl; package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.vo.DeptVo;
import cn.fateverse.admin.mapper.DeptMapper; import cn.fateverse.admin.mapper.DeptMapper;
import cn.fateverse.admin.service.DeptService; import cn.fateverse.admin.service.DeptService;
import cn.fateverse.common.core.constant.UserConstants; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.admin.entity.Dept; import cn.fateverse.common.core.entity.Dept;
import cn.fateverse.common.core.entity.OptionTree; import cn.fateverse.common.core.utils.AssertUtil;
import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.utils.LongUtils; import cn.fateverse.common.core.utils.LongUtils;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.hutool.core.util.ObjectUtil;
import cn.fateverse.common.core.utils.convert.TreeUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.List;
import java.util.stream.Collectors;
/** /**
* @author Clay * @author Clay
@@ -25,157 +20,66 @@ import java.util.stream.Collectors;
*/ */
@Slf4j @Slf4j
@Service @Service
public class DeptServiceImpl implements DeptService { public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept>
implements DeptService {
private final DeptMapper deptMapper; @Override
public List<Dept> list(String deptName, Integer state) {
public DeptServiceImpl(DeptMapper deptMapper) { return this.lambdaQuery()
this.deptMapper = deptMapper; .like(StrUtil.isNotBlank(deptName), Dept::getDeptName, deptName)
.like(ObjectUtil.isNotNull(state), Dept::getState, state)
.list();
} }
@Override @Override
public List<DeptVo> searchTree(String deptName, Integer state) { public List<Dept> searchExcludeTree(Long deptId) {
List<Dept> deptList = deptMapper.selectList(deptName, state); return this.lambdaQuery()
return TreeUtil.build(deptList, DeptVo.class, (config) -> { .ne(Dept::getDeptId, deptId)
config.setIdField("deptId"); .ne(Dept::getParentId, deptId)
config.setExclude("phone"); .list();
}); }
@Override
public List<Dept> searchByIds(List<Long> deptIds) {
return this.lambdaQuery()
.in(Dept::getDeptId, deptIds)
.list();
} }
@Override @Override
public DeptVo searchById(Long deptId) { public void checkNameUnique(Dept dept) {
Dept dept = deptMapper.selectById(deptId);
DeptVo deptVo = new DeptVo();
BeanUtils.copyProperties(dept, deptVo);
return deptVo;
}
@Override
public List<OptionTree> searchExcludeTree(Long deptId) {
Dept dept = deptMapper.selectById(deptId);
if (0L == dept.getParentId()) {
return new ArrayList<>();
}
List<Dept> deptList = deptMapper.selectExclude(deptId);
return TreeUtil.build(deptList, OptionTree.class, (config) -> {
config.setIdField("deptId");
config.setOption("deptId", "deptName");
});
}
@Override
public List<OptionTree> searchTreeOption() {
List<Dept> deptList = deptMapper.selectList(null, null);
return TreeUtil.build(deptList, OptionTree.class, (config) -> {
config.setIdField("deptId");
config.setOption("deptId", "deptName");
});
}
@Override
public List<DeptVo> searchByIds(List<Long> deptIds) {
List<Dept> deptList = deptMapper.selectByIds(deptIds);
return deptList.stream().map(dept ->
DeptVo.builder()
.deptId(dept.getDeptId())
.parentId(dept.getParentId())
.deptName(dept.getDeptName())
.email(dept.getEmail())
.orderNum(dept.getOrderNum())
.leader(dept.getLeader())
.leaderId(dept.getLeaderId())
.phone(dept.getPhone())
.state(dept.getState())
.createTime(dept.getCreateTime())
.build()
).collect(Collectors.toList());
}
@Override
public String checkNameUnique(Dept dept) {
Long deptId = LongUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); Long deptId = LongUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
Dept info = deptMapper.selectByDeptNameAndParentId(dept.getDeptName(), deptId); Dept info = this.lambdaQuery()
if (!ObjectUtils.isEmpty(info) && !info.getDeptId().equals(deptId)) { .eq(Dept::getDeptName, dept.getDeptName())
return UserConstants.NOT_UNIQUE; .eq(Dept::getParentId, deptId)
} .last("limit 1")
return UserConstants.UNIQUE; .one();
AssertUtil.isTrue(ObjectUtil.isNotNull(info) && !dept.getDeptId().equals(info.getDeptId()), "新增部门: {}'失败,部门名称以存在!", dept.getDeptName());
} }
@Override @Override
public boolean hasChildById(Long deptId) { public boolean hasChildById(Long deptId) {
return deptMapper.selectChildCountByDeptId(deptId) > 0; return this.lambdaQuery()
} .eq(Dept::getParentId, deptId)
.eq(Dept::getDelFlag, 0)
@Override .exists();
public boolean checkExistUser(Long deptId) {
return deptMapper.selectExistUserCount(deptId) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int save(Dept dept) {
Set<String> deptNameSet = deptMapper.selectDeptNameListByParentId(dept.getParentId());
Dept info = deptMapper.selectById(dept.getParentId());
if (deptNameSet.contains(dept.getDeptName())) {
throw new CustomException(info.getDeptName() + "下已经存在" + dept.getDeptName() + "部门");
}
if (UserConstants.DEPT_DISABLE.equals(info.getState())) {
throw new CustomException("上级部门停用,不允许添加");
}
dept.setAncestors(info.getAncestors() + "," + info.getDeptId());
return deptMapper.insert(dept);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) public List<Dept> selectChildrenById(Long deptId) {
public int edit(Dept dept) { return this.lambdaQuery()
Dept newParentDept = deptMapper.selectById(dept.getParentId()); .eq(Dept::getParentId, deptId)
Dept oldDept = deptMapper.selectById(dept.getDeptId()); .list();
if (null != newParentDept && null != oldDept) {
String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
String oldAncestors = oldDept.getAncestors();
dept.setAncestors(newAncestors);
updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
}
if (null != newParentDept && UserConstants.DEPT_DISABLE.equals(newParentDept.getState())) {
updateParentDept(dept);
}
return deptMapper.update(dept);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) public List<Dept> selectListByDeptParentId(Long deptId) {
public int remove(Long deptId) { return this.lambdaQuery()
return deptMapper.delete(deptId); .eq(Dept::getParentId, deptId)
.list();
} }
/**
* 更新父级部门的状态
*
* @param dept
*/
public void updateParentDept(Dept dept) {
dept = deptMapper.selectById(dept.getDeptId());
deptMapper.updateState(dept);
}
/**
* 更新字元素的ancestors
*
* @param deptId
* @param newAncestors
* @param odlAncestors
*/
public void updateDeptChildren(Long deptId, String newAncestors, String odlAncestors) {
List<Dept> children = deptMapper.selectChildrenById(deptId);
List<Dept> newChildren = children.stream().peek(child -> {
child.setAncestors(child.getAncestors().replace(odlAncestors, newAncestors));
}).collect(Collectors.toList());
if (newChildren.size() > 0) {
deptMapper.updateChildren(newChildren);
}
}
} }

View File

@@ -67,7 +67,7 @@ public class MenuServiceImpl implements MenuService {
@Override @Override
public List<RouterVo> searchRouterByUserId(Long userId) { public List<RouterVo> searchRouterByUserId(Long userId) {
List<Menu> menuList = null; List<Menu> menuList = null;
if (User.isAdmin(userId)) { if (SecurityUtils.isAdmin(userId)) {
menuList = menuMapper.selectRouterMenuList(); menuList = menuMapper.selectRouterMenuList();
} else { } else {
menuList = menuMapper.selectRouterMenuListByUserId(userId); menuList = menuMapper.selectRouterMenuListByUserId(userId);
@@ -78,11 +78,11 @@ public class MenuServiceImpl implements MenuService {
@Override @Override
public List<MenuSimpVo> searchTree(String menuName, String state) { public List<MenuSimpVo> searchTree(String menuName, String state) {
List<Menu> menuList = null; List<Menu> menuList = null;
User user = Objects.requireNonNull(SecurityUtils.getLoginUser()).getUser(); Long userId = Objects.requireNonNull(SecurityUtils.getUserId());
if (User.isAdmin(user.getUserId())) { if (SecurityUtils.isAdmin(userId)) {
menuList = menuMapper.selectList(menuName, state, null, false); menuList = menuMapper.selectList(menuName, state, null, false);
} else { } else {
menuList = menuMapper.selectListByUserId(user.getUserId(), menuName, state, null, false); menuList = menuMapper.selectListByUserId(userId, menuName, state, null, false);
} }
return TreeUtil.build(menuList, MenuSimpVo.class, (config) -> { return TreeUtil.build(menuList, MenuSimpVo.class, (config) -> {
config.setIdField("menuId"); config.setIdField("menuId");
@@ -101,12 +101,12 @@ public class MenuServiceImpl implements MenuService {
@Override @Override
public List<OptionTree> searchTreeOption(Long excludeId) { public List<OptionTree> searchTreeOption(Long excludeId) {
User user = Objects.requireNonNull(SecurityUtils.getLoginUser()).getUser(); Long userId = Objects.requireNonNull(SecurityUtils.getUserId());
List<Menu> menuList = null; List<Menu> menuList = null;
if (User.isAdmin(user.getUserId())) { if (SecurityUtils.isAdmin(userId)) {
menuList = menuMapper.selectList(null, null, excludeId, true); menuList = menuMapper.selectList(null, null, excludeId, true);
} else { } else {
menuList = menuMapper.selectListByUserId(user.getUserId(), null, null, excludeId, true); menuList = menuMapper.selectListByUserId(userId, null, null, excludeId, true);
} }
return TreeUtil.build(menuList, OptionTree.class, (config) -> { return TreeUtil.build(menuList, OptionTree.class, (config) -> {
config.setIdField("menuId"); config.setIdField("menuId");
@@ -121,12 +121,12 @@ public class MenuServiceImpl implements MenuService {
if (null == roleId || roleId.equals(0L)) { if (null == roleId || roleId.equals(0L)) {
checkedSet = menuMapper.selectCheckedMenuIdByRoleId(roleId); checkedSet = menuMapper.selectCheckedMenuIdByRoleId(roleId);
} }
User user = Objects.requireNonNull(SecurityUtils.getLoginUser()).getUser(); Long userId = Objects.requireNonNull(SecurityUtils.getUserId());
List<Menu> menuList = null; List<Menu> menuList = null;
if (User.isAdmin(user.getUserId())) { if (SecurityUtils.isAdmin(userId)) {
menuList = menuMapper.selectList(null, null, null, true); menuList = menuMapper.selectList(null, null, null, true);
} else { } else {
menuList = menuMapper.selectListByUserId(user.getUserId(), null, null, null, true); menuList = menuMapper.selectListByUserId(userId, null, null, null, true);
} }
return OptionMenuVo.builder() return OptionMenuVo.builder()
.checked(checkedSet) .checked(checkedSet)

View File

@@ -8,7 +8,7 @@ import cn.hutool.core.util.StrUtil;
import cn.fateverse.admin.entity.OnlineUser; import cn.fateverse.admin.entity.OnlineUser;
import cn.fateverse.admin.service.OnlineUserService; import cn.fateverse.admin.service.OnlineUserService;
import cn.fateverse.common.core.constant.CacheConstants; import cn.fateverse.common.core.constant.CacheConstants;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;

View File

@@ -1,25 +1,27 @@
package cn.fateverse.admin.service.impl; package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.dto.RoleDto; import cn.fateverse.admin.dto.RoleDto;
import cn.fateverse.admin.entity.Role;
import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.admin.vo.RoleVo;
import cn.fateverse.admin.entity.RoleMenu; import cn.fateverse.admin.entity.RoleMenu;
import cn.fateverse.admin.mapper.MenuMapper;
import cn.fateverse.admin.mapper.RoleMapper; import cn.fateverse.admin.mapper.RoleMapper;
import cn.fateverse.admin.mapper.RoleMenuMapper; import cn.fateverse.admin.mapper.RoleMenuMapper;
import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.admin.service.RoleService; import cn.fateverse.admin.service.RoleService;
import cn.fateverse.admin.vo.RoleVo;
import cn.fateverse.common.core.entity.Option; import cn.fateverse.common.core.entity.Option;
import cn.fateverse.common.core.entity.Role;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.LongUtils; import cn.fateverse.common.core.utils.LongUtils;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.core.utils.StateUtils; import cn.fateverse.common.core.utils.StateUtils;
import cn.fateverse.common.mybatisplus.utils.PageConditionUtil;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import cn.fateverse.common.mybatis.utils.PageUtils; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@@ -32,7 +34,8 @@ import java.util.stream.Collectors;
*/ */
@Slf4j @Slf4j
@Service @Service
public class RoleServiceImpl implements RoleService { public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role>
implements RoleService {
private final RoleMapper roleMapper; private final RoleMapper roleMapper;
@@ -47,25 +50,31 @@ public class RoleServiceImpl implements RoleService {
@Override @Override
public TableDataInfo<RoleVo> searchList(RoleQuery query) { public IPage<Role> searchList(RoleQuery query) {
PageUtils.startPage(); IPage<Role> page = PageConditionUtil.getPage();
List<Role> list = roleMapper.selectList(query); return this.lambdaQuery()
return PageUtils.convertDataTable(list, RoleVo::toRoleVo); .like(StrUtil.isNotBlank(query.getRoleName()), Role::getRoleName, query.getRoleName())
.like(StrUtil.isNotBlank(query.getRoleKey()), Role::getRoleKey, query.getRoleKey())
.eq(ObjectUtil.isNotNull(query.getState()), Role::getState, query.getState())
.between(ObjectUtil.isNotNull(query.getStartTime()) && ObjectUtil.isNotNull(query.getEndTime()),
Role::getCreateTime, query.getStartTime(), query.getEndTime())
.page(page);
return PageConditionUtil.convertDataTable(list, RoleVo::toRoleVo);
} }
@Override @Override
public TableDataInfo<RoleVo> searchListByMenuId(Long menuId, String roleName, String roleKey) { public TableDataInfo<RoleVo> searchListByMenuId(Long menuId, String roleName, String roleKey) {
PageUtils.startPage(); PageConditionUtil.startPage();
List<Role> list = roleMapper.selectListByMenuId(menuId, roleName, roleKey); List<Role> list = roleMapper.selectListByMenuId(menuId, roleName, roleKey);
return PageUtils.convertDataTable(list, RoleVo::toRoleVo); return PageConditionUtil.convertDataTable(list, RoleVo::toRoleVo);
} }
@Override @Override
public TableDataInfo<RoleVo> searchListExcludeMenuId(Long menuId, String roleName, String roleKey) { public TableDataInfo<RoleVo> searchListExcludeMenuId(Long menuId, String roleName, String roleKey) {
PageUtils.startPage(); PageConditionUtil.startPage();
List<Role> list = roleMapper.searchListExcludeMenuId(menuId,roleName,roleKey); List<Role> list = roleMapper.searchListExcludeMenuId(menuId, roleName, roleKey);
return PageUtils.convertDataTable(list, RoleVo::toRoleVo); return PageConditionUtil.convertDataTable(list, RoleVo::toRoleVo);
} }
@Override @Override
@@ -156,7 +165,7 @@ public class RoleServiceImpl implements RoleService {
public int bindMenu(Long menuId, List<Long> roleIds) { public int bindMenu(Long menuId, List<Long> roleIds) {
List<RoleMenu> roleMenuList = roleIds.stream().filter(LongUtils::isNotNull).map(roleId -> RoleMenu.builder().roleId(roleId) List<RoleMenu> roleMenuList = roleIds.stream().filter(LongUtils::isNotNull).map(roleId -> RoleMenu.builder().roleId(roleId)
.menuId(menuId).build()).collect(Collectors.toList()); .menuId(menuId).build()).collect(Collectors.toList());
if (roleMenuList.isEmpty()){ if (roleMenuList.isEmpty()) {
throw new CustomException("角色id不能为空"); throw new CustomException("角色id不能为空");
} }
return roleMenuMapper.batch(roleMenuList); return roleMenuMapper.batch(roleMenuList);
@@ -175,7 +184,7 @@ public class RoleServiceImpl implements RoleService {
} }
public void checkRoleAllowed(Role role) { public void checkRoleAllowed(Role role) {
if (!ObjectUtils.isEmpty(role.getRoleId()) && role.isAdmin()) { if (!ObjectUtils.isEmpty(role.getRoleId()) && SecurityUtils.isAdmin(role.getRoleId())) {
throw new CustomException("不允许操作超级管理员角色"); throw new CustomException("不允许操作超级管理员角色");
} }
} }

View File

@@ -0,0 +1,14 @@
package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.entity.UserPost;
import cn.fateverse.admin.mapper.UserPostMapper;
import cn.fateverse.admin.service.UserPostService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class UserPostServiceImpl extends ServiceImpl<UserPostMapper, UserPost>
implements UserPostService {
}

View File

@@ -0,0 +1,23 @@
package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.entity.UserRole;
import cn.fateverse.admin.mapper.UserRoleMapper;
import cn.fateverse.admin.service.UserRoleService;
import cn.fateverse.common.core.entity.Role;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole>
implements UserRoleService {
@Override
public List<Role> selectRoleByUserId(Long userId) {
return baseMapper.selectRoleByUserId(userId);
}
}

View File

@@ -1,22 +1,28 @@
package cn.fateverse.admin.service.impl; package cn.fateverse.admin.service.impl;
import cn.fateverse.admin.dto.UserDto; import cn.fateverse.admin.dto.UserDto;
import cn.fateverse.admin.entity.*; import cn.fateverse.admin.entity.UserPost;
import cn.fateverse.admin.entity.UserRole;
import cn.fateverse.admin.mapper.*; import cn.fateverse.admin.mapper.*;
import cn.fateverse.admin.query.RoleQuery; import cn.fateverse.admin.query.RoleQuery;
import cn.fateverse.admin.query.UserQuery; import cn.fateverse.admin.query.UserQuery;
import cn.fateverse.admin.service.UserService;
import cn.fateverse.admin.vo.UserChooseVo; import cn.fateverse.admin.vo.UserChooseVo;
import cn.fateverse.admin.vo.UserDetailVo; import cn.fateverse.admin.vo.UserDetailVo;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.hutool.core.util.StrUtil; import cn.fateverse.common.core.entity.Dept;
import cn.fateverse.admin.entity.User; import cn.fateverse.common.core.entity.Role;
import cn.fateverse.admin.service.UserService; import cn.fateverse.common.core.entity.User;
import cn.fateverse.common.core.entity.UserDetail;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.LongUtils; import cn.fateverse.common.core.utils.LongUtils;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.mybatis.utils.PageUtils; import cn.fateverse.common.mybatisplus.utils.PageConditionUtil;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -33,7 +39,8 @@ import java.util.stream.Collectors;
*/ */
@Slf4j @Slf4j
@Service @Service
public class UserServiceImpl implements UserService { public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
private final UserMapper userMapper; private final UserMapper userMapper;
@@ -58,17 +65,21 @@ public class UserServiceImpl implements UserService {
@Override @Override
public User searchByUserName(String username) { public User searchByUserName(String username) {
return userMapper.selectByUserName(username); return this.lambdaQuery()
.eq(User::getUserName, username)
.last("limit 1")
.one();
} }
@Override @Override
public User searchUserInfoByUserId(Long userId) { public UserDetail searchUserInfoByUserId(Long userId) {
return userMapper.selectUserByUserId(userId); return userMapper.selectUserByUserId(userId);
} }
@Override @Override
public List<UserVo> searchList(UserQuery user) { public IPage<UserVo> searchList(UserQuery user) {
return userMapper.selectList(user); IPage<User> page = PageConditionUtil.getPage();
return userMapper.selectPage(page, user);
} }
@Override @Override
@@ -102,39 +113,45 @@ public class UserServiceImpl implements UserService {
@Override @Override
public List<UserVo> searchByDeptIds(List<Long> deptIds) { public List<UserVo> searchByDeptIds(List<Long> deptIds) {
return userMapper.selectUserByDeptIds(deptIds); return userMapper.selectByDeptIds(deptIds);
} }
@Override @Override
public UserDetailVo searchByUserId(Long userId) { public UserDetailVo searchByUserId(Long userId) {
User user = userMapper.selectUserByUserId(userId); UserDetail userDetail = userMapper.selectUserByUserId(userId);
List<Long> roleIds = user.getRoles().stream().map(Role::getRoleId).collect(Collectors.toList()); List<Long> roleIds = userDetail.getRoles().stream().map(Role::getRoleId).collect(Collectors.toList());
user.setDept(null); userDetail.setDept(null);
user.setRoles(null); userDetail.setRoles(null);
user.setPassword(null); userDetail.setPassword(null);
List<Long> postIds = userPostMapper.selectPostIdListByUserId(userId); List<Long> postIds = userPostMapper.selectPostIdListByUserId(userId);
return UserDetailVo.builder() return UserDetailVo.builder()
.user(user) .user(userDetail)
.postIds(postIds) .postIds(postIds)
.roleIds(roleIds) .roleIds(roleIds)
.build(); .build();
} }
@Override @Override
public boolean checkUserNameUnique(UserDto user) { public boolean checkUserNameUnique(User user) {
Long userId = getUserId(user); Long userId = getUserId(user);
User info = userMapper.selectUserInfoByUserName(user.getUserName()); User info = this.lambdaQuery()
.eq(User::getUserName, user.getUserName())
.last("limit 1")
.one();
return checkUser(info, userId); return checkUser(info, userId);
} }
@Override @Override
public boolean checkPhoneNumberUnique(UserDto user) { public boolean checkPhoneNumberUnique(User user) {
if (StrUtil.isEmpty(user.getPhoneNumber())) { if (StrUtil.isEmpty(user.getPhoneNumber())) {
return false; return false;
} }
Long userId = getUserId(user); Long userId = getUserId(user);
User info = userMapper.selectUserInfoByUserName(user.getPhoneNumber()); User info = this.lambdaQuery()
.eq(User::getPhoneNumber, user.getPhoneNumber())
.last("limit 1")
.one();
return checkUser(info, userId); return checkUser(info, userId);
} }
@@ -144,7 +161,7 @@ public class UserServiceImpl implements UserService {
return false; return false;
} }
Long userId = getUserId(user); Long userId = getUserId(user);
User info = userMapper.selectByEmail(user.getEmail()); UserDetail info = userMapper.selectByEmail(user.getEmail());
return checkUser(info, userId); return checkUser(info, userId);
} }
@@ -155,14 +172,13 @@ public class UserServiceImpl implements UserService {
@Override @Override
public TableDataInfo<UserVo> searchUserListByExcludeRoleId(Long roleId, String userName, String phoneNumber) { public TableDataInfo<UserVo> searchUserListByExcludeRoleId(Long roleId, String userName, String phoneNumber) {
PageUtils.startPage(); PageConditionUtil.startPage();
List<UserVo> list = userMapper.selectUserListByExcludeRoleId(roleId, userName, phoneNumber); List<UserVo> list = userMapper.selectUserListByExcludeRoleId(roleId, userName, phoneNumber);
Long total = PageUtils.getTotal(list); Long total = PageConditionUtil.getTotal(list);
return PageUtils.convertDataTable(list, total); return PageConditionUtil.convertDataTable(list, total);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void bindRole(List<Long> userIds, Long roleId) { public void bindRole(List<Long> userIds, Long roleId) {
@@ -193,10 +209,10 @@ public class UserServiceImpl implements UserService {
@Override @Override
public TableDataInfo<UserVo> searchUserListByExcludePostId(Long postId, String userName, String phoneNumber) { public TableDataInfo<UserVo> searchUserListByExcludePostId(Long postId, String userName, String phoneNumber) {
PageUtils.startPage(); PageConditionUtil.startPage();
List<UserVo> list = userMapper.selectUserListByExcludePostId(postId, userName, phoneNumber); List<UserVo> list = userMapper.selectUserListByExcludePostId(postId, userName, phoneNumber);
Long total = PageUtils.getTotal(list); Long total = PageConditionUtil.getTotal(list);
return PageUtils.convertDataTable(list, total); return PageConditionUtil.convertDataTable(list, total);
} }
@@ -232,7 +248,7 @@ public class UserServiceImpl implements UserService {
private List<UserChooseVo> chooseDept(Long deptId) { private List<UserChooseVo> chooseDept(Long deptId) {
List<Dept> deptList = deptMapper.selectListByDeptParentId(deptId); List<Dept> deptList = deptMapper.selectListByDeptParentId(deptId);
List<UserChooseVo> result = deptList.stream().map(dept -> UserChooseVo.toUserChooseByDept(dept, deptId)).collect(Collectors.toList()); List<UserChooseVo> result = deptList.stream().map(dept -> UserChooseVo.toUserChooseByDept(dept, deptId)).collect(Collectors.toList());
List<UserVo> userList = userMapper.selectUserByDeptIds(Collections.singletonList(deptId)); List<UserVo> userList = userMapper.selectByDeptIds(Collections.singletonList(deptId));
userList.forEach(user -> result.add(UserChooseVo.toUserChooseByUser(user, deptId))); userList.forEach(user -> result.add(UserChooseVo.toUserChooseByUser(user, deptId)));
return result; return result;
} }
@@ -262,15 +278,15 @@ public class UserServiceImpl implements UserService {
@Override @Override
public TableDataInfo<UserVo> searchUserListByExcludeDeptId(Long deptId, String userName, String phoneNumber) { public TableDataInfo<UserVo> searchUserListByExcludeDeptId(Long deptId, String userName, String phoneNumber) {
PageUtils.startPage(); PageConditionUtil.startPage();
Dept dept = deptMapper.selectById(deptId); Dept dept = deptMapper.selectById(deptId);
if (null == dept) { if (null == dept) {
throw new CustomException("当前部门不存在"); throw new CustomException("当前部门不存在");
} }
// dept.getAncestors() // dept.getAncestors()
List<UserVo> list = userMapper.searchUserListByExcludeDeptId(deptId, userName, phoneNumber); List<UserVo> list = userMapper.searchUserListByExcludeDeptId(deptId, userName, phoneNumber);
Long total = PageUtils.getTotal(list); Long total = PageConditionUtil.getTotal(list);
return PageUtils.convertDataTable(list, total); return PageConditionUtil.convertDataTable(list, total);
} }
@Override @Override
@@ -288,7 +304,7 @@ public class UserServiceImpl implements UserService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int save(UserDto dto) { public int save(UserDto dto) {
checkUser(dto); checkUser(dto);
UserBase user = insertInitUser(dto); User user = insertInitUser(dto);
int result = userMapper.insert(user); int result = userMapper.insert(user);
dto.setUserId(user.getUserId()); dto.setUserId(user.getUserId());
batchUserRole(dto, Boolean.FALSE); batchUserRole(dto, Boolean.FALSE);
@@ -306,7 +322,7 @@ public class UserServiceImpl implements UserService {
batchUserRole(dto, Boolean.TRUE); batchUserRole(dto, Boolean.TRUE);
batchUserPost(dto, Boolean.TRUE); batchUserPost(dto, Boolean.TRUE);
dto.setPassword(null); dto.setPassword(null);
UserBase user = dto.toUser(); User user = dto.toUser();
return userMapper.update(user); return userMapper.update(user);
} }
@@ -322,14 +338,28 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public List<Long> searchAllUserIds() { public List<Long> searchAllUserIds() {
return userMapper.selectAllUserIds(); return userMapper.selectAllUserIds();
} }
@Override
public boolean checkExistUser(Long deptId) {
return this.lambdaQuery()
.eq(User::getDeptId, deptId)
.exists();
}
@Override
public List<UserVo> selectUserListByRoleId(Long roleId, String userName, String phoneNumber) {
return baseMapper.selectUserListByRoleId(roleId, userName, phoneNumber);
}
@Override
public List<UserVo> selectByDeptIds(List<Long> deptIds) {
return baseMapper.selectByDeptIds(deptIds);
}
/** /**
* 批量处理用户与角色之间的对应关系 * 批量处理用户与角色之间的对应关系
@@ -374,8 +404,8 @@ public class UserServiceImpl implements UserService {
* *
* @param dto * @param dto
*/ */
private UserBase insertInitUser(UserDto dto) { private User insertInitUser(UserDto dto) {
UserBase user = dto.toUser(); User user = dto.toUser();
user.setPassword(SecurityUtils.encryptPassword(dto.getPassword())); user.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
return user; return user;
} }
@@ -386,7 +416,7 @@ public class UserServiceImpl implements UserService {
* @param user * @param user
* @return * @return
*/ */
private Long getUserId(UserDto user) { private Long getUserId(User user) {
return LongUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); return LongUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
} }

View File

@@ -23,161 +23,10 @@
from sys_dept from sys_dept
</sql> </sql>
<select id="selectList" resultType="cn.fateverse.admin.entity.Dept">
<include refid="selectSql"/>
<where>
<if test="deptName != null and deptName != ''"> and dept_name like concat('%',#{deptName},'%')</if>
<if test="state != null"> and `state` = #{state}</if>
</where>
order by parent_id, order_num
</select>
<select id="selectById" resultType="cn.fateverse.admin.entity.Dept"> <select id="selectListByDeptParentId" resultType="cn.fateverse.common.core.entity.Dept">
select d.dept_id,
d.parent_id,
d.ancestors,
d.dept_name,
d.order_num,
d.leader,
d.leader_id,
d.phone,
d.email,
d.state,
d.del_flag,
d.create_by,
d.create_time,
d.update_by,
d.update_time
from sys_dept d
left join sys_dept p on p.dept_id = d.parent_id
where d.dept_id = #{deptId}
</select>
<select id="selectExclude" resultType="cn.fateverse.admin.entity.Dept">
<include refid="selectSql"/>
where dept_id != #{deptId} and parent_id != #{deptId}
</select>
<select id="selectChildrenById" parameterType="Long" resultType="cn.fateverse.admin.entity.Dept">
<include refid="selectSql"/>
where find_in_set(#{deptId}, ancestors)
</select>
<select id="selectByDeptNameAndParentId" resultType="cn.fateverse.admin.entity.Dept">
<include refid="selectSql"/>
where dept_name = #{deptName} and parent_id = #{parentId} limit 1
</select>
<select id="selectListByDeptParentId" resultType="cn.fateverse.admin.entity.Dept">
<include refid="selectSql"/> <include refid="selectSql"/>
where parent_id = #{parentId} where parent_id = #{parentId}
</select> </select>
<select id="selectChildCountByDeptId" resultType="java.lang.Integer">
select count(1)
from sys_dept
where parent_id = #{deptId}
and del_flag = '0'
limit 1
</select>
<select id="selectExistUserCount" resultType="java.lang.Integer">
select count(1)
from sys_user
where dept_id = #{deptId}
and del_flag = '0'
limit 1
</select>
<select id="selectDeptNameListByParentId" resultType="java.lang.String">
select dept_name from sys_dept where parent_id = #{parentId}
</select>
<select id="selectByIds" resultType="cn.fateverse.admin.entity.Dept">
<include refid="selectSql"/>
where dept_id in
<foreach collection="list" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
</select>
<insert id="insert">
insert into sys_dept
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="deptId != null and deptId != 0">dept_id,</if>
<if test="parentId != null and parentId != 0">parent_id,</if>
<if test="deptName != null and deptName != ''">dept_name,</if>
<if test="ancestors != null and ancestors != ''">ancestors,</if>
<if test="orderNum != null and orderNum != ''">order_num,</if>
<if test="leader != null and leader != ''">leader,</if>
<if test="leaderId != null ">leader_id,</if>
<if test="phone != null and phone != ''">phone,</if>
<if test="email != null and email != ''">email,</if>
<if test="state != null">state,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="createTime != null">create_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="deptId != null and deptId != 0">#{deptId},</if>
<if test="parentId != null and parentId != 0">#{parentId},</if>
<if test="deptName != null and deptName != ''">#{deptName},</if>
<if test="ancestors != null and ancestors != ''">#{ancestors},</if>
<if test="orderNum != null and orderNum != ''">#{orderNum},</if>
<if test="leader != null and leader != ''">#{leader},</if>
<if test="leaderId != null ">#{leaderId},</if>
<if test="phone != null and phone != ''">#{phone},</if>
<if test="email != null and email != ''">#{email},</if>
<if test="state != null">#{state},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
</trim>
</insert>
<update id="update">
update sys_dept
<set>
<if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
<if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
<if test="ancestors != null">ancestors = #{ancestors},</if>
<if test="orderNum != null">order_num = #{orderNum},</if>
<if test="leader != null">leader = #{leader},</if>
<if test="leaderId != null">leader_id = #{leaderId},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="email != null">email = #{email},</if>
<if test="state != null">state = #{state},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</set>
where dept_id = #{deptId}
</update>
<update id="updateChildren" parameterType="java.util.List">
update sys_dept set ancestors =
<foreach collection="depts" item="item" index="index"
separator=" " open="case dept_id" close="end">
when #{item.deptId} then #{item.ancestors}
</foreach>
where dept_id in
<foreach collection="depts" item="item" index="index"
separator="," open="(" close=")">
#{item.deptId}
</foreach>
</update>
<update id="updateState">
update sys_dept
<set>
<if test="state != null and state != ''">state = #{state},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</set>
where dept_id in (${ancestors})
</update>
<delete id="delete">
delete
from sys_dept
where dept_id = #{deptId}
</delete>
</mapper> </mapper>

View File

@@ -21,7 +21,7 @@
from sys_role from sys_role
</sql> </sql>
<select id="selectList" resultType="cn.fateverse.admin.entity.Role"> <select id="selectList" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
<where> <where>
<if test="roleName != null and roleName != ''"> and role_name like concat('%',#{roleName} ,'%')</if> <if test="roleName != null and roleName != ''"> and role_name like concat('%',#{roleName} ,'%')</if>
@@ -35,7 +35,7 @@
</if> </if>
</where> </where>
</select> </select>
<select id="selectById" resultType="cn.fateverse.admin.entity.Role"> <select id="selectById" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
where role_id = #{roleId} where role_id = #{roleId}
</select> </select>
@@ -46,16 +46,16 @@
where r.role_id = #{roleId} where r.role_id = #{roleId}
limit 1 limit 1
</select> </select>
<select id="selectByRoleName" resultType="cn.fateverse.admin.entity.Role"> <select id="selectByRoleName" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
where role_name = #{roleName} limit 0,1 where role_name = #{roleName} limit 0,1
</select> </select>
<select id="selectByRoleKey" resultType="cn.fateverse.admin.entity.Role"> <select id="selectByRoleKey" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
where role_key = #{roleKey} limit 0,1 where role_key = #{roleKey} limit 0,1
</select> </select>
<select id="selectByIds" resultType="cn.fateverse.admin.entity.Role"> <select id="selectByIds" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
where role_id in where role_id in
<foreach collection="list" open="(" separator="," close=")" item="roleId"> <foreach collection="list" open="(" separator="," close=")" item="roleId">
@@ -63,7 +63,7 @@
</foreach> </foreach>
</select> </select>
<select id="selectListByMenuId" resultType="cn.fateverse.admin.entity.Role"> <select id="selectListByMenuId" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
<where> <where>
<if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName} ,'%')</if> <if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName} ,'%')</if>
@@ -72,7 +72,7 @@
</where> </where>
</select> </select>
<select id="searchListExcludeMenuId" resultType="cn.fateverse.admin.entity.Role"> <select id="searchListExcludeMenuId" resultType="cn.fateverse.common.core.entity.Role">
<include refid="selectSql"/> <include refid="selectSql"/>
<where> <where>
<if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName} ,'%')</if> <if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName} ,'%')</if>

View File

@@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.fateverse.admin.mapper.UserMapper"> <mapper namespace="cn.fateverse.admin.mapper.UserMapper">
<resultMap type="cn.fateverse.admin.entity.User" id="UserResult"> <resultMap type="cn.fateverse.common.core.entity.UserDetail" id="UserResult">
<id property="userId" column="user_id"/> <id property="userId" column="user_id"/>
<result property="deptId" column="dept_id"/> <result property="deptId" column="dept_id"/>
<result property="userName" column="user_name"/> <result property="userName" column="user_name"/>
@@ -26,11 +26,11 @@
<result property="userType" column="user_type"/> <result property="userType" column="user_type"/>
<result property="openId" column="open_id"/> <result property="openId" column="open_id"/>
<result property="unionId" column="union_id"/> <result property="unionId" column="union_id"/>
<association property="dept" column="dept_id" javaType="cn.fateverse.admin.entity.Dept" resultMap="deptResult"/> <association property="dept" column="dept_id" javaType="cn.fateverse.common.core.entity.Dept" resultMap="deptResult"/>
<collection property="roles" javaType="java.util.List" resultMap="RoleResult"/> <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
</resultMap> </resultMap>
<resultMap id="deptResult" type="cn.fateverse.admin.entity.Dept"> <resultMap id="deptResult" type="cn.fateverse.common.core.entity.Dept">
<id property="deptId" column="dept_id"/> <id property="deptId" column="dept_id"/>
<result property="parentId" column="parent_id"/> <result property="parentId" column="parent_id"/>
<result property="deptName" column="dept_name"/> <result property="deptName" column="dept_name"/>
@@ -41,7 +41,7 @@
<result property="state" column="dept_state"/> <result property="state" column="dept_state"/>
</resultMap> </resultMap>
<resultMap id="RoleResult" type="cn.fateverse.admin.entity.Role"> <resultMap id="RoleResult" type="cn.fateverse.common.core.entity.Role">
<id property="roleId" column="role_id"/> <id property="roleId" column="role_id"/>
<result property="roleName" column="role_name"/> <result property="roleName" column="role_name"/>
<result property="roleKey" column="role_key"/> <result property="roleKey" column="role_key"/>
@@ -135,21 +135,21 @@
where u.user_name = #{userName} limit 0,1 where u.user_name = #{userName} limit 0,1
</select> </select>
<select id="selectList" resultType="cn.fateverse.admin.vo.UserVo"> <select id="selectPage" resultType="cn.fateverse.admin.vo.UserVo">
<include refid="selectUserVo"/> <include refid="selectUserVo"/>
<where> <where>
u.del_flag = '0' u.del_flag = '0'
<if test="userName != null and userName != ''">and u.user_name like concat('%', #{userName}, '%')</if> <if test="query.userName != null and query.userName != ''">and u.user_name like concat('%', #{query.userName}, '%')</if>
<if test="phoneNumber != null and phoneNumber != ''">and u.phone_number like <if test="query.phoneNumber != null and query.phoneNumber != ''">and u.phone_number like
concat('%',#{phoneNumber},'%') concat('%',#{query.phoneNumber},'%')
</if> </if>
<if test="state != null and state != ''">and u.state = #{state}</if> <if test="query.state != null">and u.state = #{query.state}</if>
<if test="startTime != null and endTime != null"> <if test="query.startTime != null and query.endTime != null">
and u.create_time between #{startTime} and #{endTime} and u.create_time between #{query.startTime} and #{query.endTime}
</if> </if>
<if test="deptId != null"> <if test="query.deptId != null">
and (u.dept_id = #{deptId} or u.dept_id in ( select t.dept_id from sys_dept t where and (u.dept_id = #{query.deptId} or u.dept_id in ( select t.dept_id from sys_dept t where
find_in_set(#{deptId}, ancestors) )) find_in_set(#{query.deptId}, ancestors) ))
</if> </if>
</where> </where>
</select> </select>
@@ -218,17 +218,17 @@
</where> </where>
</select> </select>
<select id="selectUserInfoByUserName" resultType="cn.fateverse.admin.entity.User"> <select id="selectUserInfoByUserName" resultType="cn.fateverse.common.core.entity.UserDetail">
<include refid="selectUser"/> <include refid="selectUser"/>
where user_name = #{userName} where user_name = #{userName}
</select> </select>
<select id="selectByPhoneNum" resultType="cn.fateverse.admin.entity.User"> <select id="selectByPhoneNum" resultType="cn.fateverse.common.core.entity.UserDetail">
<include refid="selectUser"/> <include refid="selectUser"/>
where phone_number = #{phoneNumber} where phone_number = #{phoneNumber}
</select> </select>
<select id="selectByEmail" resultType="cn.fateverse.admin.entity.User"> <select id="selectByEmail" resultType="cn.fateverse.common.core.entity.UserDetail">
<include refid="selectUser"/> <include refid="selectUser"/>
where email = #{email} limit 0,1 where email = #{email} limit 0,1
</select> </select>
@@ -243,7 +243,7 @@
</foreach> </foreach>
</select> </select>
<select id="selectUserByDeptIds" resultType="cn.fateverse.admin.vo.UserVo"> <select id="selectByDeptIds" resultType="cn.fateverse.admin.vo.UserVo">
select distinct u.user_id,u.user_name,u.nick_name,u.phone_number,u.state,u.create_time, select distinct u.user_id,u.user_name,u.nick_name,u.phone_number,u.state,u.create_time,
d.dept_name,u.user_type,u.sex,u.avatar,d.dept_id as leaderDeptId d.dept_name,u.user_type,u.sex,u.avatar,d.dept_id as leaderDeptId
from sys_user u from sys_user u
@@ -260,7 +260,7 @@
</select> </select>
<insert id="insert" parameterType="cn.fateverse.admin.entity.UserBase" useGeneratedKeys="true" keyProperty="userId" <insert id="insert" parameterType="cn.fateverse.common.core.entity.User" useGeneratedKeys="true" keyProperty="userId"
keyColumn="user_id"> keyColumn="user_id">
insert into sys_user insert into sys_user
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">

View File

@@ -32,4 +32,22 @@
#{userId} #{userId}
</foreach> </foreach>
</delete> </delete>
<select id="selectRoleByUserId" resultType="cn.fateverse.common.core.entity.Role">
select r.role_id,
r.role_name,
r.role_key,
r.role_sort,
r.data_scope,
r.`state`,
r.del_flag,
r.create_by,
r.create_time,
r.update_by,
r.update_time,
r.remark,
r.role_type
from sys_role r
left join sys_user_role ur on r.role_id = ur.role_id
where ur.user_id = #{userId}
</select>
</mapper> </mapper>

View File

@@ -125,9 +125,9 @@ logging.resolver=${SW_LOGGING_RESOLVER:PATTERN}
# * %level means log level. # * %level means log level.
# * %timestamp means now of time with format yyyy-MM-dd HH:mm:ss:SSS. # * %timestamp means now of time with format yyyy-MM-dd HH:mm:ss:SSS.
# * %thread means name of current thread. # * %thread means name of current thread.
# * %msg means some message which user logged. # * %msg means some message which userDetail logged.
# * %class means SimpleName of TargetClass. # * %class means SimpleName of TargetClass.
# * %throwable means a throwable which user called. # * %throwable means a throwable which userDetail called.
# * %agent_name means agent.service_name. Only apply to the PatternLogger. # * %agent_name means agent.service_name. Only apply to the PatternLogger.
logging.pattern=${SW_LOGGING_PATTERN:%level %timestamp %thread %class : %msg %throwable} logging.pattern=${SW_LOGGING_PATTERN:%level %timestamp %thread %class : %msg %throwable}
# Logging max_file_size, default: 300 * 1024 * 1024 = 314572800 # Logging max_file_size, default: 300 * 1024 * 1024 = 314572800
@@ -155,7 +155,7 @@ jvm.buffer_size=${SW_JVM_BUFFER_SIZE:600}
buffer.channel_size=${SW_BUFFER_CHANNEL_SIZE:5} buffer.channel_size=${SW_BUFFER_CHANNEL_SIZE:5}
# The buffer size. # The buffer size.
buffer.buffer_size=${SW_BUFFER_BUFFER_SIZE:300} buffer.buffer_size=${SW_BUFFER_BUFFER_SIZE:300}
# If true, skywalking agent will enable profile when user create a new profile task. Otherwise disable profile. # If true, skywalking agent will enable profile when userDetail create a new profile task. Otherwise disable profile.
profile.active=${SW_AGENT_PROFILE_ACTIVE:true} profile.active=${SW_AGENT_PROFILE_ACTIVE:true}
# Parallel monitor segment count # Parallel monitor segment count
profile.max_parallel=${SW_AGENT_PROFILE_MAX_PARALLEL:5} profile.max_parallel=${SW_AGENT_PROFILE_MAX_PARALLEL:5}

View File

@@ -50,6 +50,10 @@
<groupId>cn.fateverse</groupId> <groupId>cn.fateverse</groupId>
<artifactId>common-file</artifactId> <artifactId>common-file</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.fateverse</groupId>
<artifactId>admin-api</artifactId>
</dependency>
</dependencies> </dependencies>

View File

@@ -1,35 +1,34 @@
package cn.fateverse.auth.service; package cn.fateverse.auth.service;
import cn.fateverse.admin.dubbo.DubboUserService; import cn.fateverse.admin.dubbo.DubboUserService;
import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.core.entity.UserDetail;
import cn.fateverse.common.core.enums.UserState; import cn.fateverse.common.core.enums.UserState;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.security.entity.LoginUser;
import cn.fateverse.admin.entity.User;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Service;
/** /**
* @author Clay * @author Clay
* @date 2022/10/27 * @date 2022/10/27
*/ */
@Slf4j @Slf4j
@Component @Service
public class UserDetailsServiceImpl implements UserDetailsService { public class UserDetailsServiceImpl implements UserDetailsService {
@DubboReference @DubboReference
private DubboUserService userService; private DubboUserService userService;
@Override @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//todo 编辑用户登录相关逻辑 //todo 编辑用户登录相关逻辑
log.info("有用户登录:{}",username); log.info("有用户登录:{}", username);
User user = userService.getUserByUsername(username); UserDetail user = userService.getUserDetailsByUserName(username);
if (ObjectUtils.isEmpty(user)) { if (ObjectUtils.isEmpty(user)) {
log.info("登录用户:{} 不存在.", username); log.info("登录用户:{} 不存在.", username);
throw new UsernameNotFoundException("登录用户:" + username + " 不存在"); throw new UsernameNotFoundException("登录用户:" + username + " 不存在");

View File

@@ -1,26 +1,26 @@
package cn.fateverse.auth.service.impl; package cn.fateverse.auth.service.impl;
import cn.fateverse.auth.entity.UserInfo;
import cn.hutool.core.date.DateUtil;
import cn.fateverse.admin.dubbo.DubboMenuService; import cn.fateverse.admin.dubbo.DubboMenuService;
import cn.fateverse.admin.dubbo.DubboUserService; import cn.fateverse.admin.dubbo.DubboUserService;
import cn.fateverse.admin.vo.RouterVo; import cn.fateverse.admin.vo.RouterVo;
import cn.fateverse.auth.entity.LoginBody; import cn.fateverse.auth.entity.LoginBody;
import cn.fateverse.auth.entity.UserInfo;
import cn.fateverse.auth.event.LoginInfoEvent;
import cn.fateverse.auth.service.LoginService; import cn.fateverse.auth.service.LoginService;
import cn.fateverse.admin.entity.Role; import cn.fateverse.auth.utils.LoginInfoUtil;
import cn.fateverse.admin.entity.User;
import cn.fateverse.common.core.constant.CacheConstants; import cn.fateverse.common.core.constant.CacheConstants;
import cn.fateverse.common.core.constant.DateConstants; import cn.fateverse.common.core.constant.DateConstants;
import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.core.entity.Role;
import cn.fateverse.common.core.entity.User;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.exception.UserPasswordNotMatchException; import cn.fateverse.common.core.exception.UserPasswordNotMatchException;
import cn.fateverse.common.core.utils.SpringContextHolder; import cn.fateverse.common.core.utils.SpringContextHolder;
import cn.fateverse.common.core.utils.uuid.IdUtils; import cn.fateverse.common.core.utils.uuid.IdUtils;
import cn.fateverse.common.security.entity.LoginUser;
import cn.fateverse.common.security.service.TokenService; import cn.fateverse.common.security.service.TokenService;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import cn.fateverse.auth.event.LoginInfoEvent;
import cn.fateverse.auth.utils.LoginInfoUtil;
import cn.fateverse.log.entity.LoginInfo; import cn.fateverse.log.entity.LoginInfo;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.redisson.api.RLock; import org.redisson.api.RLock;

View File

@@ -1,8 +1,9 @@
package cn.fateverse.auth.service.impl; package cn.fateverse.auth.service.impl;
import cn.fateverse.admin.dubbo.DubboMenuService; import cn.fateverse.admin.dubbo.DubboMenuService;
import cn.fateverse.admin.entity.User; import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.UserDetail;
import cn.fateverse.common.security.utils.SecurityUtils;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -27,9 +28,9 @@ public class PermissionService {
* @param loginUser 登录用户 * @param loginUser 登录用户
*/ */
public void getMenuPermission(LoginUser loginUser) { public void getMenuPermission(LoginUser loginUser) {
User user = loginUser.getUser(); UserDetail user = loginUser.getUser();
Set<String> perms = new HashSet<>(); Set<String> perms = new HashSet<>();
if (user.isAdmin()) { if (SecurityUtils.isAdmin(user.getUserId())) {
perms.add("*:*:*"); perms.add("*:*:*");
} else { } else {
Set<String> menuSet = menuService.selectMenuPermsByUserId(user.getUserId()); Set<String> menuSet = menuService.selectMenuPermsByUserId(user.getUserId());

View File

@@ -10,7 +10,7 @@ import ${packageName}.service.${ClassName}Service;
import cn.fateverse.common.core.entity.Option; import cn.fateverse.common.core.entity.Option;
#end #end
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.mybatisplus.utils.PageUtils; import cn.fateverse.common.mybatisplus.utils.PageConditionUtil;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

View File

@@ -44,7 +44,9 @@ public class ConsoleCapture {
public interface Task { public interface Task {
Object execute() throws Exception; Object execute() throws Exception;
} }

View File

@@ -100,7 +100,8 @@ public class JavaCodeEngine {
// 设置安全检查器 // 设置安全检查器
System.setSecurityManager(securityManager); System.setSecurityManager(securityManager);
// 执行方法并返回结果 // 执行方法并返回结果
return ConsoleCapture.capture(() -> method.invoke(null, args)); return new EngineResult(method.invoke(null, args), null);
// return ConsoleCapture.capture(() -> method.invoke(null, args));
} catch (CustomException e) { } catch (CustomException e) {
EngineResult result = new EngineResult(); EngineResult result = new EngineResult();
result.setSuccess(Boolean.FALSE); result.setSuccess(Boolean.FALSE);
@@ -279,7 +280,7 @@ public class JavaCodeEngine {
} }
public void remove(){ public void remove() {
clazz = null; clazz = null;
classLoader = null; classLoader = null;
} }

View File

@@ -4,7 +4,6 @@ import cn.fateverse.common.code.console.ConsoleCapture;
import cn.fateverse.common.code.lock.SegmentLock; import cn.fateverse.common.code.lock.SegmentLock;
import cn.fateverse.common.code.model.EngineResult; import cn.fateverse.common.code.model.EngineResult;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import com.alibaba.fastjson2.JSON;
import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value; import org.graalvm.polyglot.Value;

View File

@@ -60,12 +60,22 @@
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>${mybatis-plus.version}</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>${guava.version}</version> <version>${guava.version}</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -0,0 +1,67 @@
package cn.fateverse.common.core.bo;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import java.util.Optional;
@Data
public abstract class BaseQueryBO {
/**
* 创建时间
*/
private DateIntervalBO createTimeInterval;
/**
* 更新时间
*/
private DateIntervalBO updateTimeInterval;
/**
* 创建用户名称
*/
private String createUserName;
/**
* 更新用户名称
*/
private String updateUserName;
/**
* 获取创建时间间隔
*
* @return 基准日期间隔
*/
public DateIntervalBO getCreateTimeInterval() {
return Optional.ofNullable(createTimeInterval).orElse(new DateIntervalBO());
}
/**
* 获取更新时间间隔
*
* @return 基准日期间隔
*/
public DateIntervalBO getUpdateTimeInterval() {
return Optional.ofNullable(updateTimeInterval).orElse(new DateIntervalBO());
}
/**
* 创建时间 区间非空校验
*
* @return boolean true = 起止非空
*/
public boolean createTimeBetweenIsNotEmpty() {
return Optional.ofNullable(createTimeInterval).map(item -> ObjectUtil.isAllNotEmpty(item.getStartTime(), item.getEndTime())).orElse(false);
}
/**
* 更新时间 区间非空校验
*
* @return boolean true = 起止非空
*/
public boolean updateTimeBetweenIsNotEmpty() {
return Optional.ofNullable(updateTimeInterval).map(item -> ObjectUtil.isAllNotEmpty(item.getStartTime(), item.getEndTime())).orElse(false);
}
}

View File

@@ -0,0 +1,30 @@
package cn.fateverse.common.core.bo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 基准日期间隔
*
* @author ZhangQiang
* @date 2024/09/26
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DateIntervalBO {
/**
* 开始时间
*/
private LocalDateTime startTime;
/**
* 结束时间
*/
private LocalDateTime endTime;
}

View File

@@ -0,0 +1,6 @@
package cn.fateverse.common.core.constant;
public interface BaseConstant {
Long ZERO = 0L;
}

View File

@@ -5,24 +5,24 @@ package cn.fateverse.common.core.constant;
* @author Clay * @author Clay
* @date 2022/11/9 * @date 2022/11/9
*/ */
public class CacheConstants { public interface CacheConstants {
/** /**
* 验证码 redis key * 验证码 redis key
*/ */
public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; String CAPTCHA_CODE_KEY = "captcha_codes:";
/** /**
* 路由缓存地址 * 路由缓存地址
*/ */
public static final String ROUTE_CACHE_KEY = "router:key:"; String ROUTE_CACHE_KEY = "router:key:";
/** /**
* 登录用户 redis key * 登录用户 redis key
*/ */
public static final String LOGIN_TOKEN_KEY = "login_info:"; String LOGIN_TOKEN_KEY = "login_info:";
/** /**
* 字典类型 redis key * 字典类型 redis key
*/ */
public static final String DICT_KEY = "dict:"; String DICT_KEY = "dict:";

View File

@@ -5,34 +5,34 @@ package cn.fateverse.common.core.constant;
* *
* @author Clay * @author Clay
*/ */
public class Constants { public interface Constants {
/** /**
* 令牌前缀 * 令牌前缀
*/ */
public static final String TOKEN_PREFIX = "Bearer "; String TOKEN_PREFIX = "Bearer ";
/** /**
* http请求 * http请求
*/ */
public static final String HTTP = "http://"; String HTTP = "http://";
/** /**
* https请求 * https请求
*/ */
public static final String HTTPS = "https://"; String HTTPS = "https://";
/** /**
* 令牌前缀 * 令牌前缀
*/ */
public static final String LOGIN_USER_KEY = "login_user_key"; String LOGIN_USER_KEY = "login_user_key";
/** /**
* 验证码有效期(分钟) * 验证码有效期(分钟)
*/ */
public static final long CAPTCHA_EXPIRATION = 2; long CAPTCHA_EXPIRATION = 2;
public static final String UTF8 = "UTF-8"; String UTF8 = "UTF-8";
} }

View File

@@ -4,17 +4,17 @@ package cn.fateverse.common.core.constant;
* @author Clay * @author Clay
* @date 2023-05-25 * @date 2023-05-25
*/ */
public class DateConstants { public interface DateConstants {
public static String YYYY = "yyyy"; String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM"; String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd"; String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
} }

View File

@@ -5,44 +5,44 @@ package cn.fateverse.common.core.constant;
* *
* @author Clay * @author Clay
*/ */
public class UserConstants { public interface UserConstants {
/** /**
* 平台内系统用户的唯一标志 * 平台内系统用户的唯一标志
*/ */
public static final String SYS_USER = "SYS_USER"; String SYS_USER = "SYS_USER";
/** /**
* 匿名用户 * 匿名用户
*/ */
public static final String ANONYMOUS_USER = "anonymousUser"; String ANONYMOUS_USER = "anonymousUser";
/** /**
* 正常状态 * 正常状态
*/ */
public static final String NORMAL = "0"; String NORMAL = "0";
/** /**
* 异常状态 * 异常状态
*/ */
public static final String EXCEPTION = "1"; String EXCEPTION = "1";
/** /**
* 部门停用状态 * 部门停用状态
*/ */
public static final String DEPT_DISABLE = "1"; String DEPT_DISABLE = "1";
/** /**
* Layout组件标识 * Layout组件标识
*/ */
public final static String LAYOUT = "Layout"; String LAYOUT = "Layout";
/** /**
* 校验返回结果码 * 校验返回结果码
*/ */
public final static String UNIQUE = "0"; String UNIQUE = "0";
public final static String NOT_UNIQUE = "1"; String NOT_UNIQUE = "1";
} }

View File

@@ -0,0 +1,60 @@
package cn.fateverse.common.core.convert;
import cn.hutool.core.collection.CollUtil;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* 基本转换定义
*
* @author Clay
* @date 2024/09/29
*/
public interface BaseConvertDefine<DTO, Entity, VO> {
/**
* 实体到视图对象
*
* @param entity 实体
* @return {@link VO}
*/
VO entityToVo(Entity entity);
/**
* 业务对象到实体
*
* @param DTO 业务对象
* @return {@link Entity}
*/
Entity dtoToEntity(DTO DTO);
/**
* 从实体到视图对象
*
* @param list 列表
* @return {@link List}<{@link VO}>
*/
default List<VO> entityToVOList(List<Entity> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
return list.stream().map(this::entityToVo).collect(Collectors.toList());
}
/**
* 业务对象到实体列表
*
* @param list 列表
* @return {@link List}<{@link Entity}>
*/
default List<Entity> dtoToEntityList(List<DTO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
return list.stream().map(this::dtoToEntity).collect(Collectors.toList());
}
}

View File

@@ -4,15 +4,17 @@ import cn.fateverse.common.core.annotaion.AutoTime;
import cn.fateverse.common.core.annotaion.AutoUser; import cn.fateverse.common.core.annotaion.AutoUser;
import cn.fateverse.common.core.enums.MethodEnum; import cn.fateverse.common.core.enums.MethodEnum;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.time.LocalDateTime;
/** /**
* @author Clay * @author Clay
* @date 2022/10/30 * @date 2022/10/30
*/ */
public class BaseEntity implements Serializable { @Data
public abstract class BaseEntity implements Serializable {
/** /**
* 创建者 * 创建者
@@ -25,7 +27,7 @@ public class BaseEntity implements Serializable {
*/ */
@AutoTime(method = MethodEnum.INSERT) @AutoTime(method = MethodEnum.INSERT)
@JsonFormat(locale = "zh",timezone = "GMT+8",pattern = "yyyy-MM-dd") @JsonFormat(locale = "zh",timezone = "GMT+8",pattern = "yyyy-MM-dd")
private Date createTime; private LocalDateTime createTime;
/** /**
* 更新者 * 更新者
@@ -38,7 +40,7 @@ public class BaseEntity implements Serializable {
*/ */
@AutoTime(method = MethodEnum.UPDATE) @AutoTime(method = MethodEnum.UPDATE)
@JsonFormat(locale = "zh",timezone = "GMT+8",pattern = "yyyy-MM-dd") @JsonFormat(locale = "zh",timezone = "GMT+8",pattern = "yyyy-MM-dd")
private Date updateTime; private LocalDateTime updateTime;
/** /**
@@ -46,44 +48,4 @@ public class BaseEntity implements Serializable {
*/ */
private String remark; private String remark;
public Object getCreateBy() {
return createBy;
}
public void setCreateBy(Object createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Object getUpdateBy() {
return updateBy;
}
public void setUpdateBy(Object updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
} }

View File

@@ -1,8 +1,11 @@
package cn.fateverse.admin.entity; package cn.fateverse.common.core.entity;
import cn.fateverse.common.core.annotaion.EnableAutoField; import cn.fateverse.common.core.annotaion.EnableAutoField;
import cn.fateverse.common.core.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Email; import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@@ -16,13 +19,16 @@ import javax.validation.constraints.Pattern;
* @date 2022/10/30 * @date 2022/10/30
*/ */
@Data @Data
@TableName("sys_dept")
@EnableAutoField @EnableAutoField
@EqualsAndHashCode(callSuper = true)
public class Dept extends BaseEntity { public class Dept extends BaseEntity {
/** /**
* 部门ID * 部门ID
*/ */
@TableId(type = IdType.AUTO)
private Long deptId; private Long deptId;
/** /**
@@ -62,7 +68,7 @@ public class Dept extends BaseEntity {
/** /**
* 联系电话 * 联系电话
*/ */
@Pattern(message = "手机号格式错误!",regexp = "^1[0-9]{10}$") @Pattern(message = "手机号格式错误!", regexp = "^1[0-9]{10}$")
private String phone; private String phone;
/** /**
@@ -82,5 +88,4 @@ public class Dept extends BaseEntity {
private String delFlag; private String delFlag;
} }

View File

@@ -1,12 +1,10 @@
package cn.fateverse.common.security.entity; package cn.fateverse.common.core.entity;
import cn.fateverse.admin.entity.User;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -17,7 +15,7 @@ import java.util.stream.Collectors;
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class LoginUser implements UserDetails { public class LoginUser implements org.springframework.security.core.userdetails.UserDetails {
/** /**
* 用户唯一标识 * 用户唯一标识
@@ -29,7 +27,6 @@ public class LoginUser implements UserDetails {
*/ */
private Long loginTime; private Long loginTime;
/** /**
* 过期时间 * 过期时间
*/ */
@@ -38,7 +35,7 @@ public class LoginUser implements UserDetails {
/** /**
* 用户信息 * 用户信息
*/ */
private User user; private UserDetail user;
/** /**
* 登录ip * 登录ip
@@ -119,6 +116,7 @@ public class LoginUser implements UserDetails {
public boolean isCredentialsNonExpired() { public boolean isCredentialsNonExpired() {
return true; return true;
} }
/** /**
* 是否可用 ,禁用的用户不能身份验证 * 是否可用 ,禁用的用户不能身份验证
* *

View File

@@ -1,29 +1,27 @@
package cn.fateverse.admin.entity; package cn.fateverse.common.core.entity;
import cn.fateverse.common.core.annotaion.EnableAutoField; import cn.fateverse.common.core.annotaion.EnableAutoField;
import cn.fateverse.common.core.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor; import lombok.*;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
*
* @author Clay * @author Clay
* @date 2022/10/30 * @date 2022/10/30
*/ */
@Data @Data
@Builder
@EnableAutoField @EnableAutoField
@AllArgsConstructor @TableName("sys_role")
@NoArgsConstructor @EqualsAndHashCode(callSuper = true)
public class Role extends BaseEntity { public class Role extends BaseEntity {
/** /**
* 角色ID * 角色ID
*/ */
@TableId(type = IdType.AUTO)
private Long roleId; private Long roleId;
/** /**

View File

@@ -1,12 +1,11 @@
package cn.fateverse.admin.entity; package cn.fateverse.common.core.entity;
import cn.fateverse.common.core.annotaion.EnableAutoField; import cn.fateverse.common.core.annotaion.EnableAutoField;
import cn.fateverse.common.core.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor; import lombok.*;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date; import java.util.Date;
@@ -15,15 +14,15 @@ import java.util.Date;
* @date 2022/11/7 * @date 2022/11/7
*/ */
@Data @Data
@Builder
@EnableAutoField @EnableAutoField
@AllArgsConstructor @TableName("sys_user")
@NoArgsConstructor @EqualsAndHashCode(callSuper = true)
public class UserBase extends BaseEntity { public class User extends BaseEntity {
/** /**
* 用户ID * 用户ID
*/ */
@TableId(type = IdType.AUTO)
private Long userId; private Long userId;
/** /**

View File

@@ -1,7 +1,8 @@
package cn.fateverse.admin.entity; package cn.fateverse.common.core.entity;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List; import java.util.List;
@@ -10,7 +11,8 @@ import java.util.List;
* @date 2022/10/27 * @date 2022/10/27
*/ */
@Data @Data
public class User extends UserBase { @EqualsAndHashCode(callSuper = true)
public class UserDetail extends User {
/** /**

View File

@@ -0,0 +1,35 @@
package cn.fateverse.common.core.utils;
import cn.fateverse.common.core.exception.CustomException;
import cn.hutool.core.util.StrUtil;
public class AssertUtil {
/**
* 断定为 true. 非 true 时抛出异常.
*
* @param condition 条件
* @param message 异常枚举
* @param args 需要 format 的参数
*/
public static void isTrue(boolean condition, String message, Object... args) {
if (!condition) {
throw new CustomException(StrUtil.format(message, args));
}
}
/**
* 断定为 false. 非 false 时抛出异常.
*
* @param condition 条件
* @param message 异常枚举
* @param args arg游戏
*/
public static void isFalse(boolean condition, String message, Object... args) {
if (condition) {
throw new CustomException(StrUtil.format(message, args));
}
}
}

View File

@@ -12,7 +12,6 @@
<artifactId>common-mybatis-puls</artifactId> <artifactId>common-mybatis-puls</artifactId>
<properties> <properties>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>

View File

@@ -6,29 +6,36 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
/** /**
* @author Clay * @author Clay
* @date 2023-05-25 * @date 2023-05-25
*/ */
@MapperScan("${mybatis.mapperPackage}")
public class MybatisPlusAutoConfiguration { public class MybatisPlusAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean(MybatisPlusInterceptor.class)
public MybatisPlusInterceptor mybatisPlusInterceptor() { public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件 // 配置分页拦截器
interceptor.addInnerInterceptor(paginationInnerInterceptor()); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setOptimizeJoin(false);
paginationInnerInterceptor.setMaxLimit(500L);
paginationInnerInterceptor.setOverflow(false);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
// 乐观锁插件 // 乐观锁插件
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
// 添加防止全表更新与删除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor; return interceptor;
} }
/** /**
* 分页插件,自动识别数据库类型 * 分页插件,自动识别数据库类型
*/ */

View File

@@ -0,0 +1,59 @@
package cn.fateverse.common.mybatisplus.enums;
import com.baomidou.mybatisplus.annotation.IEnum;
import java.util.Arrays;
public interface BaseEnum<T extends Enum<T>> extends IEnum<Integer> {
/**
* 获取编码
*
* @return {@link Integer}
*/
Integer getCode();
/**
* 获取名称
*
* @return {@link String}
*/
String getName();
/**
* 获取value值
*
* @return {@link Integer}
*/
@Override
default Integer getValue() {
return getCode();
}
/**
* 解析通过编码
*
* @param enumClass 枚举班
* @param code 编码
* @return {@link E}
*/
static <E extends Enum<E> & BaseEnum<E>> E parseByCode(Class<E> enumClass, Integer code) {
return Arrays.stream(enumClass.getEnumConstants())
.filter(e -> e.getCode().equals(code))
.findFirst()
.orElse(null);
}
/**
* 按名称解析
*
* @param enumClass 枚举班
* @param name 名称
* @return {@link E}
*/
static <E extends Enum<E> & BaseEnum<E>> E parseByName(Class<E> enumClass, String name) {
return Arrays.stream(enumClass.getEnumConstants())
.filter(e -> e.getName().equals(name))
.findFirst()
.orElse(null);
}
}

View File

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.MetaObject;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -27,6 +28,9 @@ public class AutoSetMetaObjectHandler implements MetaObjectHandler {
@Override @Override
public void updateFill(MetaObject metaObject) { public void updateFill(MetaObject metaObject) {
autoSetValue(metaObject, MethodEnum.UPDATE); autoSetValue(metaObject, MethodEnum.UPDATE);
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateBy", Long.class, SecurityUtils.getUserId());
this.strictUpdateFill(metaObject, "updateUserName", String.class, SecurityUtils.getUsername());
} }
private void autoSetValue(MetaObject metaObject, MethodEnum method) { private void autoSetValue(MetaObject metaObject, MethodEnum method) {

View File

@@ -3,6 +3,7 @@ package cn.fateverse.common.mybatisplus.utils;
import cn.fateverse.common.core.entity.PageInfo; import cn.fateverse.common.core.entity.PageInfo;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.core.utils.TableSupport; import cn.fateverse.common.core.utils.TableSupport;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.ArrayList; import java.util.ArrayList;
@@ -14,7 +15,7 @@ import java.util.stream.Collectors;
* @author Clay * @author Clay
* @date 2023-05-25 * @date 2023-05-25
*/ */
public class PageUtils { public class PageConditionUtil {
/** /**
@@ -26,11 +27,21 @@ public class PageUtils {
* @param <R> 需要转换的对象类型 * @param <R> 需要转换的对象类型
* @return 转换后的对象 * @return 转换后的对象
*/ */
public static <T, R> TableDataInfo<T> convertDataTable(Page<R> page, Function<R, T> map) { public static <T, R> TableDataInfo<T> convertDataTable(IPage<R> page, Function<R, T> map) {
List<T> convertList = page.getRecords().stream().map(map).collect(Collectors.toList()); List<T> convertList = page.getRecords().stream().map(map).collect(Collectors.toList());
return convertDataTable(convertList, page.getTotal()); return convertDataTable(convertList, page.getTotal());
} }
/**
* 转换为TableDataInfo对象
*
* @param page 源对象
* @return 转换后的对象
*/
public static <T> TableDataInfo<T> convertDataTable(IPage<T> page) {
return convertDataTable(page.getRecords(), page.getTotal());
}
/** /**
* 转换为TableDataInfo对象 * 转换为TableDataInfo对象
@@ -50,7 +61,7 @@ public class PageUtils {
return tableDataInfo; return tableDataInfo;
} }
public static <T> Page<T> getPage(){ public static <T> IPage<T> getPage() {
PageInfo pageInfo = TableSupport.getPageInfo(); PageInfo pageInfo = TableSupport.getPageInfo();
return new Page<>(pageInfo.getPageNum(), pageInfo.getPageSize()); return new Page<>(pageInfo.getPageNum(), pageInfo.getPageSize());
} }

View File

@@ -48,9 +48,5 @@
<groupId>cn.fateverse</groupId> <groupId>cn.fateverse</groupId>
<artifactId>common-redis</artifactId> <artifactId>common-redis</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.fateverse</groupId>
<artifactId>admin-api</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -1,7 +1,7 @@
package cn.fateverse.common.security.filter; package cn.fateverse.common.security.filter;
import cn.fateverse.common.security.service.TokenService; import cn.fateverse.common.security.service.TokenService;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.security.utils.SecurityUtils; import cn.fateverse.common.security.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

View File

@@ -6,12 +6,11 @@ import cn.fateverse.common.core.constant.Constants;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.utils.HttpServletUtils; import cn.fateverse.common.core.utils.HttpServletUtils;
import cn.fateverse.common.core.utils.ObjectUtils; import cn.fateverse.common.core.utils.ObjectUtils;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;

View File

@@ -2,7 +2,7 @@ package cn.fateverse.common.security.utils;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.common.core.utils.HttpServletUtils; import cn.fateverse.common.core.utils.HttpServletUtils;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;

View File

@@ -42,6 +42,7 @@
<bitwalker.version>1.19</bitwalker.version> <bitwalker.version>1.19</bitwalker.version>
<spring-boot.mybatis>2.2.2</spring-boot.mybatis> <spring-boot.mybatis>2.2.2</spring-boot.mybatis>
<pagehelper.boot.version>1.4.5</pagehelper.boot.version> <pagehelper.boot.version>1.4.5</pagehelper.boot.version>
<mapstruct.version>1.6.2</mapstruct.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
@@ -81,6 +82,11 @@
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>${lombok.version}</version> <version>${lombok.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

View File

@@ -3,7 +3,6 @@ package cn.fateverse.query.entity;
import cn.fateverse.common.core.annotaion.EnableAutoField; import cn.fateverse.common.core.annotaion.EnableAutoField;
import cn.fateverse.common.core.entity.BaseEntity; import cn.fateverse.common.core.entity.BaseEntity;
import cn.fateverse.common.core.exception.CustomException; import cn.fateverse.common.core.exception.CustomException;
import cn.fateverse.query.enums.DataAdapterSource;
import cn.fateverse.query.enums.DataAdapterType; import cn.fateverse.query.enums.DataAdapterType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;

View File

@@ -61,8 +61,8 @@ public class JavaEngineExecuteHandler implements EngineExecuteHandler {
String modifiedCode = modifiedCode(dataAdapter.getCode()); String modifiedCode = modifiedCode(dataAdapter.getCode());
String replacedCode = replacedClass(modifiedCode, getClassName(dataAdapter)); String replacedCode = replacedClass(modifiedCode, getClassName(dataAdapter));
String IMPORT_CODE = "import java.util.*;\n" + String IMPORT_CODE = "import java.util.*;\n" +
"import java.util.stream.*;\n" + "import java.util.stream.*;\n" ;
"import com.alibaba.fastjson2.*;"; // "import com.alibaba.fastjson2.*;";
dataAdapter.setExecuteCode(IMPORT_CODE + replacedCode); dataAdapter.setExecuteCode(IMPORT_CODE + replacedCode);
return Boolean.TRUE; return Boolean.TRUE;
} }

View File

@@ -0,0 +1,26 @@
# Spring
spring:
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 162.14.111.170:8848
namespace: clay
dubbo:
registry:
parameters:
namespace: dubbo-clay
code:
java:
class-path: E:\home\clay\code\
seata:
service:
grouplist:
seata-server: 192.168.31.102:8091
registry:
nacos:
namespace: clay
config:
apollo:
namespace: clay

View File

@@ -9,7 +9,7 @@ import cn.fateverse.log.vo.LoginInfoVo;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.fateverse.common.core.result.page.TableDataInfo; import cn.fateverse.common.core.result.page.TableDataInfo;
import cn.fateverse.common.mybatis.utils.PageUtils; import cn.fateverse.common.mybatis.utils.PageUtils;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.security.service.TokenService; import cn.fateverse.common.security.service.TokenService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@@ -56,6 +56,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-reactor-netty</artifactId> <artifactId>spring-boot-starter-reactor-netty</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.fateverse</groupId>
<artifactId>admin-api</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@@ -8,14 +8,13 @@ import cn.fateverse.notice.entity.DelayedTask;
import cn.fateverse.notice.entity.SocketAuth; import cn.fateverse.notice.entity.SocketAuth;
import cn.fateverse.notice.entity.UserInfo; import cn.fateverse.notice.entity.UserInfo;
import cn.fateverse.notice.mq.RabbitConfig; import cn.fateverse.notice.mq.RabbitConfig;
import cn.fateverse.common.security.entity.LoginUser; import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.common.security.service.TokenService; import cn.fateverse.common.security.service.TokenService;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import io.netty.channel.*; import io.netty.channel.*;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

View File

@@ -45,6 +45,7 @@
<spring-cloud.version>2021.0.3</spring-cloud.version> <spring-cloud.version>2021.0.3</spring-cloud.version>
<swagger.annotations.version>1.6.8</swagger.annotations.version> <swagger.annotations.version>1.6.8</swagger.annotations.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties> </properties>

View File

@@ -279,7 +279,7 @@ CREATE TABLE `sys_menu` (
INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 'D', 1, 'system', NULL, ' ', '0', 0, 1, 1, '0', '1', '', 'setting', '1', '2018-03-16 11:33:00', 'admin', '2023-10-23 20:48:54', '系统管理目录'); INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 'D', 1, 'system', NULL, ' ', '0', 0, 1, 1, '0', '1', '', 'setting', '1', '2018-03-16 11:33:00', 'admin', '2023-10-23 20:48:54', '系统管理目录');
INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 'D', 2, 'monitor', NULL, NULL, '0', 0, 1, 1, '0', '1', '', 'data_board', '0', '2018-03-16 11:33:00', 'admin', '2023-10-23 21:00:29', '系统监控目录'); INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 'D', 2, 'monitor', NULL, NULL, '0', 0, 1, 1, '0', '1', '', 'data_board', '0', '2018-03-16 11:33:00', 'admin', '2023-10-23 21:00:29', '系统监控目录');
INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 'D', 3, 'tool', NULL, NULL, '0', 0, 1, 1, '0', '1', '', 'mokuaiguanli', '0', '2018-03-16 11:33:00', 'admin', '2023-10-23 21:00:54', '系统工具目录'); INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 'D', 3, 'tool', NULL, NULL, '0', 0, 1, 1, '0', '1', '', 'mokuaiguanli', '0', '2018-03-16 11:33:00', 'admin', '2023-10-23 21:00:54', '系统工具目录');
INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 'M', 1, 'user', '{\"userId\": \"123\"}', 'system/user/index', '0', 0, 0, 1, '0', '1', 'system:user:list', 'User', '0', '2018-03-16 11:33:00', 'admin', '2023-08-23 14:39:12', '用户管理菜单'); INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 'M', 1, 'userDetail', '{\"userId\": \"123\"}', 'system/userDetail/index', '0', 0, 0, 1, '0', '1', 'system:userDetail:list', 'User', '0', '2018-03-16 11:33:00', 'admin', '2023-08-23 14:39:12', '用户管理菜单');
INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 'M', 2, 'role', NULL, 'system/role/index', '0', 0, 0, 1, '0', '1', 'system:role:list', 'Avatar', '0', '2018-03-16 11:33:00', 'admin', '2023-06-02 15:30:09', '角色管理菜单'); INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 'M', 2, 'role', NULL, 'system/role/index', '0', 0, 0, 1, '0', '1', 'system:role:list', 'Avatar', '0', '2018-03-16 11:33:00', 'admin', '2023-06-02 15:30:09', '角色管理菜单');
INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 'M', 3, 'menu', NULL, 'system/menu/index', '0', 0, 0, 1, '0', '1', 'system:menu:list', 'Menu', '0', '2018-03-16 11:33:00', 'admin', '2023-05-21 20:21:57', '菜单管理菜单'); INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 'M', 3, 'menu', NULL, 'system/menu/index', '0', 0, 0, 1, '0', '1', 'system:menu:list', 'Menu', '0', '2018-03-16 11:33:00', 'admin', '2023-05-21 20:21:57', '菜单管理菜单');
INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 'M', 4, 'dept', NULL, 'system/dept/index', '0', 0, 0, 1, '0', '1', 'system:dept:list', 'bumenguanli', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:04:53', '部门管理菜单'); INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 'M', 4, 'dept', NULL, 'system/dept/index', '0', 0, 0, 1, '0', '1', 'system:dept:list', 'bumenguanli', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:04:53', '部门管理菜单');
@@ -292,13 +292,13 @@ INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 'M', 1, 'online', NULL, '
INSERT INTO `sys_menu` VALUES (114, '代码生成', 1151, 'M', 2, 'gen', NULL, 'rapid/gen/index', '0', 0, 0, 1, '0', '1', 'rapid:gen:list', 'daimashengcheng', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:23:31', '代码生成菜单'); INSERT INTO `sys_menu` VALUES (114, '代码生成', 1151, 'M', 2, 'gen', NULL, 'rapid/gen/index', '0', 0, 0, 1, '0', '1', 'rapid:gen:list', 'daimashengcheng', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:23:31', '代码生成菜单');
INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 'M', 1, 'operlog', NULL, 'monitor/operlog/index', '0', 0, 0, 1, '0', '1', 'monitor:operlog:list', 'caozuorizhi', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:13:51', '操作日志菜单'); INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 'M', 1, 'operlog', NULL, 'monitor/operlog/index', '0', 0, 0, 1, '0', '1', 'monitor:operlog:list', 'caozuorizhi', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:13:51', '操作日志菜单');
INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 'M', 2, 'logininfor', NULL, 'monitor/logininfor/index', '0', 0, 0, 1, '0', '1', 'monitor:logininfor:list', 'guanlidenglurizhi', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:14:26', '登录日志菜单'); INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 'M', 2, 'logininfor', NULL, 'monitor/logininfor/index', '0', 0, 0, 1, '0', '1', 'monitor:logininfor:list', 'guanlidenglurizhi', '0', '2018-03-16 11:33:00', 'admin', '2023-07-19 17:14:26', '登录日志菜单');
INSERT INTO `sys_menu` VALUES (1001, '用户查询', 100, 'B', 1, '', NULL, '', '0', 0, 1, 1, '0', '1', 'admin:user:list', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1001, '用户查询', 100, 'B', 1, '', NULL, '', '0', 0, 1, 1, '0', '1', 'admin:userDetail:list', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1002, '用户新增', 100, 'B', 2, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:user:add', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1002, '用户新增', 100, 'B', 2, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:userDetail:add', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1003, '用户修改', 100, 'B', 3, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:user:edit', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1003, '用户修改', 100, 'B', 3, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:userDetail:edit', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1004, '用户删除', 100, 'B', 4, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:user:remove', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1004, '用户删除', 100, 'B', 4, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:userDetail:remove', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1005, '用户导出', 100, 'B', 5, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:user:export', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1005, '用户导出', 100, 'B', 5, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:userDetail:export', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1006, '用户导入', 100, 'B', 6, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:user:import', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1006, '用户导入', 100, 'B', 6, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:userDetail:import', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1007, '重置密码', 100, 'B', 7, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:user:resetPwd', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1007, '重置密码', 100, 'B', 7, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:userDetail:resetPwd', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1008, '角色查询', 101, 'B', 1, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:role:query', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1008, '角色查询', 101, 'B', 1, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:role:query', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1009, '角色新增', 101, 'B', 2, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:role:add', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1009, '角色新增', 101, 'B', 2, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:role:add', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');
INSERT INTO `sys_menu` VALUES (1010, '角色修改', 101, 'B', 3, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:role:edit', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', ''); INSERT INTO `sys_menu` VALUES (1010, '角色修改', 101, 'B', 3, '', NULL, '', '0', 0, 1, 1, '0', '1', 'system:role:edit', '', '0', '2018-03-16 11:33:00', '0', '2018-03-16 11:33:00', '');

View File

@@ -256,7 +256,7 @@ jobconf_trigger_type_api=Api trigger
jobconf_trigger_type_retry=Fail retry trigger jobconf_trigger_type_retry=Fail retry trigger
jobconf_trigger_type_misfire=Misfire compensation trigger jobconf_trigger_type_misfire=Misfire compensation trigger
## user ## userDetail
user_manage=User Manage user_manage=User Manage
user_username=Username user_username=Username
user_password=Password user_password=Password

View File

@@ -256,7 +256,7 @@ jobconf_trigger_type_api=API触发
jobconf_trigger_type_retry=失败重试触发 jobconf_trigger_type_retry=失败重试触发
jobconf_trigger_type_misfire=调度过期补偿 jobconf_trigger_type_misfire=调度过期补偿
## user ## userDetail
user_manage=用户管理 user_manage=用户管理
user_username=账号 user_username=账号
user_password=密码 user_password=密码

View File

@@ -256,7 +256,7 @@ jobconf_trigger_type_api=API觸發
jobconf_trigger_type_retry=失敗重試觸發 jobconf_trigger_type_retry=失敗重試觸發
jobconf_trigger_type_misfire=調度過期補償 jobconf_trigger_type_misfire=調度過期補償
## user ## userDetail
user_manage=用户管理 user_manage=用户管理
user_username=帳號 user_username=帳號
user_password=密碼 user_password=密碼

View File

@@ -70,7 +70,7 @@ l502 -73q56 -9 56 -46z" />
<glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664" <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664"
d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
<glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" <glyph glyph-name="userDetail" unicode="&#xf007;" horiz-adv-x="1280"
d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5 d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
<glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920"

Before

Width:  |  Height:  |  Size: 434 KiB

After

Width:  |  Height:  |  Size: 434 KiB

View File

@@ -6,7 +6,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- Tell the browser to be responsive to screen width --> <!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <meta content="width=device-width, initial-scale=1, maximum-scale=1, userDetail-scalable=no" name="viewport">
<!-- Bootstrap --> <!-- Bootstrap -->
<link rel="stylesheet" href="${request.contextPath}/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="${request.contextPath}/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css">
<!-- Font Awesome --> <!-- Font Awesome -->
@@ -81,7 +81,7 @@
<div class="navbar-custom-menu"> <div class="navbar-custom-menu">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<#-- login user --> <#-- login userDetail -->
<li class="dropdown"> <li class="dropdown">
<a href="javascript:" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> <a href="javascript:" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
${I18n.system_welcome} ${Request["XXL_JOB_LOGIN_IDENTITY"].username} ${I18n.system_welcome} ${Request["XXL_JOB_LOGIN_IDENTITY"].username}
@@ -139,7 +139,7 @@
<li class="nav-click <#if pageName == "joblog">active</#if>" ><a href="${request.contextPath}/joblog"><i class="fa fa-circle-o text-green"></i><span>${I18n.joblog_name}</span></a></li> <li class="nav-click <#if pageName == "joblog">active</#if>" ><a href="${request.contextPath}/joblog"><i class="fa fa-circle-o text-green"></i><span>${I18n.joblog_name}</span></a></li>
<#if Request["XXL_JOB_LOGIN_IDENTITY"].role == 1> <#if Request["XXL_JOB_LOGIN_IDENTITY"].role == 1>
<li class="nav-click <#if pageName == "jobgroup">active</#if>" ><a href="${request.contextPath}/jobgroup"><i class="fa fa-circle-o text-red"></i><span>${I18n.jobgroup_name}</span></a></li> <li class="nav-click <#if pageName == "jobgroup">active</#if>" ><a href="${request.contextPath}/jobgroup"><i class="fa fa-circle-o text-red"></i><span>${I18n.jobgroup_name}</span></a></li>
<li class="nav-click <#if pageName == "user">active</#if>" ><a href="${request.contextPath}/user"><i class="fa fa-circle-o text-purple"></i><span>${I18n.user_manage}</span></a></li> <li class="nav-click <#if pageName == "userDetail">active</#if>" ><a href="${request.contextPath}/userDetail"><i class="fa fa-circle-o text-purple"></i><span>${I18n.user_manage}</span></a></li>
</#if> </#if>
<li class="nav-click <#if pageName == "help">active</#if>" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-gray"></i><span>${I18n.job_help}</span></a></li> <li class="nav-click <#if pageName == "help">active</#if>" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-gray"></i><span>${I18n.job_help}</span></a></li>
</ul> </ul>
@@ -173,7 +173,7 @@
</li> </li>
<li> <li>
<a href="javascript::;"> <a href="javascript::;">
<i class="menu-icon fa fa-user bg-yellow"></i> <i class="menu-icon fa fa-userDetail bg-yellow"></i>
<div class="menu-info"> <div class="menu-info">
<h4 class="control-sidebar-subheading">Frodo 更新了资料</h4> <h4 class="control-sidebar-subheading">Frodo 更新了资料</h4>
<p>更新手机号码 +1(800)555-1234</p> <p>更新手机号码 +1(800)555-1234</p>

View File

@@ -26,7 +26,7 @@
<br> <br>
<p> <p>
<a target="_blank" href="https://github.com/xuxueli/xxl-job">Github</a>&nbsp;&nbsp;&nbsp;&nbsp; <a target="_blank" href="https://github.com/xuxueli/xxl-job">Github</a>&nbsp;&nbsp;&nbsp;&nbsp;
<iframe src="https://ghbtns.com/github-btn.html?user=xuxueli&repo=xxl-job&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px" style="margin-bottom:-5px;"></iframe> <iframe src="https://ghbtns.com/github-btn.html?userDetail=xuxueli&repo=xxl-job&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px" style="margin-bottom:-5px;"></iframe>
<br><br> <br><br>
<a target="_blank" href="https://www.xuxueli.com/xxl-job/">${I18n.job_help_document}</a> <a target="_blank" href="https://www.xuxueli.com/xxl-job/">${I18n.job_help_document}</a>
<br><br> <br><br>

View File

@@ -12,7 +12,7 @@
<!-- header --> <!-- header -->
<@netCommon.commonHeader /> <@netCommon.commonHeader />
<!-- left --> <!-- left -->
<@netCommon.commonLeft "user" /> <@netCommon.commonLeft "userDetail" />
<!-- Content Wrapper. Contains page content --> <!-- Content Wrapper. Contains page content -->
<div class="content-wrapper"> <div class="content-wrapper">
@@ -183,6 +183,6 @@
<!-- DataTables --> <!-- DataTables -->
<script src="${request.contextPath}/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js"></script> <script src="${request.contextPath}/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script> <script src="${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
<script src="${request.contextPath}/static/js/user.index.1.js"></script> <script src="${request.contextPath}/static/js/userDetail.index.1.js"></script>
</body> </body>
</html> </html>

View File

@@ -120,6 +120,10 @@
<groupId>cn.fateverse</groupId> <groupId>cn.fateverse</groupId>
<artifactId>common-excel</artifactId> <artifactId>common-excel</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.fateverse</groupId>
<artifactId>admin-api</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@@ -2,6 +2,7 @@ package cn.fateverse.workflow.entity.bpmn;
import cn.fateverse.admin.entity.User; import cn.fateverse.admin.entity.User;
import cn.fateverse.admin.vo.UserVo; import cn.fateverse.admin.vo.UserVo;
import cn.fateverse.common.core.entity.LoginUser;
import cn.fateverse.workflow.enums.OperationStateEnums; import cn.fateverse.workflow.enums.OperationStateEnums;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
@@ -47,6 +48,7 @@ public class UserInfo {
public static UserInfo toUserInfo(User user){ public static UserInfo toUserInfo(User user){
return toUserInfo(user, OperationStateEnums.RUNNING); return toUserInfo(user, OperationStateEnums.RUNNING);
} }
public static UserInfo toUserInfo(User user, OperationStateEnums state){ public static UserInfo toUserInfo(User user, OperationStateEnums state){
return UserInfo.builder() return UserInfo.builder()
.id(user.getUserId().toString()) .id(user.getUserId().toString())
@@ -57,6 +59,16 @@ public class UserInfo {
.build(); .build();
} }
public static UserInfo toUserInfo(LoginUser user, OperationStateEnums state){
return UserInfo.builder()
.id(user.getUserId().toString())
.avatar(user.getAvatar())
.name(user.getNickName())
.state(state)
.sex(user.getSex())
.build();
}
public static UserInfo toUserInfo(UserVo user, OperationStateEnums state){ public static UserInfo toUserInfo(UserVo user, OperationStateEnums state){
return UserInfo.builder() return UserInfo.builder()
.id(user.getUserId().toString()) .id(user.getUserId().toString())

View File

@@ -91,7 +91,7 @@
<if test="state != null">state,</if> <if test="state != null">state,</if>
<if test="startTime != null ">start_time,</if> <if test="startTime != null ">start_time,</if>
<if test="finishTime != null ">finish_time,</if> <if test="finishTime != null ">finish_time,</if>
<if test="userInfo != null and userInfo != ''">user_info,</if> <if test="userDetail != null and userDetail != ''">user_info,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="taskId != null and taskId != ''">#{taskId},</if> <if test="taskId != null and taskId != ''">#{taskId},</if>
@@ -105,7 +105,7 @@
<if test="state != null">#{state},</if> <if test="state != null">#{state},</if>
<if test="startTime != null ">#{startTime},</if> <if test="startTime != null ">#{startTime},</if>
<if test="finishTime != null ">#{finishTime},</if> <if test="finishTime != null ">#{finishTime},</if>
<if test="userInfo != null and userInfo != ''">#{userInfo},</if> <if test="userDetail != null and userDetail != ''">#{userDetail},</if>
</trim> </trim>
</insert> </insert>
@@ -114,7 +114,7 @@
<set> <set>
<if test="finishTime != null ">finish_time = #{finishTime},</if> <if test="finishTime != null ">finish_time = #{finishTime},</if>
<if test="state != null">state = #{state},</if> <if test="state != null">state = #{state},</if>
<if test="userInfo != null and userInfo != ''">user_info = #{userInfo},</if> <if test="userDetail != null and userDetail != ''">user_info = #{userDetail},</if>
<if test="message != null and message != ''">message = #{message},</if> <if test="message != null and message != ''">message = #{message},</if>
</set> </set>
where process_instance_id = #{processInstanceId} and node_id = #{nodeId} where process_instance_id = #{processInstanceId} and node_id = #{nodeId}
@@ -145,9 +145,9 @@
</trim> </trim>
<trim prefix="user_info = case" suffix="end,"> <trim prefix="user_info = case" suffix="end,">
<foreach collection="list" separator=" " item="item"> <foreach collection="list" separator=" " item="item">
<if test="item.userInfo != null and item.userInfo != ''"> <if test="item.userDetail != null and item.userDetail != ''">
</if> </if>
when task_id = #{item.taskId} then #{item.userInfo} when task_id = #{item.taskId} then #{item.userDetail}
</foreach> </foreach>
</trim> </trim>
<trim prefix="message = case" suffix="end,"> <trim prefix="message = case" suffix="end,">