员工管理、根据状态踢下线

This commit is contained in:
attiya 2025-09-09 09:19:10 +08:00
parent dfb13e28a8
commit eb6be970fe
9 changed files with 271 additions and 21 deletions

View File

@ -14,11 +14,9 @@ public class TenantInterceptor implements HandlerInterceptor {
public boolean preHandle(@NotNull HttpServletRequest request
, @NotNull HttpServletResponse response, @NotNull Object handler){
//通过 request 去获取租户 ID
boolean login = StpUtil.isLogin();
if (login) {
Long tenantId = getTenantIdByReuqest(request);
//设置租户ID到 request attribute
request.setAttribute("tenantId", tenantId);
return true;
}

View File

@ -1,14 +1,23 @@
package com.cdzy.staff.controller;
import com.cdzy.common.enums.Message;
import com.cdzy.common.model.request.PageParam;
import com.cdzy.common.model.response.JsonResult;
import com.cdzy.staff.model.dto.StaffInfo;
import com.cdzy.staff.model.entity.EbikeOperatorStaff;
import com.cdzy.staff.model.vo.LoginVo;
import com.cdzy.staff.model.vo.StaffVo;
import com.cdzy.staff.service.EbikeOperatorStaffService;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.util.StringUtil;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static com.cdzy.staff.model.entity.table.EbikeOperatorStaffTableDef.EBIKE_OPERATOR_STAFF;
/**
* 运营商员工账户表 控制层
*
@ -33,27 +42,95 @@ public class EbikeOperatorStaffController {
return JsonResult.success(info);
}
/**
* 根据账号详情
*
* @return 运营商员工账户表详情
*/
@GetMapping("getStaffInfoById")
public JsonResult<?> getStaffInfoById(@NotNull(message = "员工ID不能为空") Long staffId) {
StaffInfo info = ebikeOperatorStaffService.getStaffInfoById(staffId);
return JsonResult.success(info);
}
/**
* 运营商员工登录
*
* @param staffVo 登录信息
* @param loginVo 登录信息
* @return 结果
*/
@PostMapping("login")
public JsonResult<?> login(@Validated @RequestBody StaffVo staffVo) {
String token = ebikeOperatorStaffService.login(staffVo);
public JsonResult<?> login(@Validated @RequestBody LoginVo loginVo) {
String token = ebikeOperatorStaffService.login(loginVo);
return JsonResult.success(Message.LOGIN, token);
}
/**
* 运营商员工添加
* 添加运营商员工
* `
*
* @param staffVo 登录信息
* @return 结果
*/
@PostMapping("add")
public JsonResult<?> add(@Validated @RequestBody StaffVo staffVo) {
ebikeOperatorStaffService.add(staffVo);
@PostMapping("save")
public JsonResult<?> saveStaff(@Validated @RequestBody StaffVo staffVo) {
ebikeOperatorStaffService.saveStaff(staffVo);
return JsonResult.success(Message.ADD_SUCCESS);
}
/**
* 修改运营商员工
* `
*
* @param staffVo 登录信息
* @return 结果
*/
@PostMapping("update")
public JsonResult<?> update(@Validated @RequestBody StaffVo staffVo) {
ebikeOperatorStaffService.updateStaff(staffVo);
return JsonResult.success(Message.UPDATE_SUCCESS);
}
/**
* 删除运营商员工
* `
*
* @param staffId 员工id
* @return 结果
*/
@GetMapping("remove")
public JsonResult<?> remove(@NotNull(message = "员工ID不能为空") Long staffId) {
ebikeOperatorStaffService.removeStaff(staffId);
return JsonResult.success(Message.ADD_SUCCESS);
}
/**
* 分页查询运营商员工
*
* @param pageParam 分页参数
* @param username 用户名
* @param contactPhone 联系电话
* @return 结果
*/
@GetMapping("page")
public JsonResult<?> page(PageParam pageParam, String username, String contactPhone) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select(
EBIKE_OPERATOR_STAFF.STAFF_ID,
EBIKE_OPERATOR_STAFF.OPERATOR_ID,
EBIKE_OPERATOR_STAFF.STATUS,
EBIKE_OPERATOR_STAFF.LAST_LOGIN,
EBIKE_OPERATOR_STAFF.UPDATE_BY,
EBIKE_OPERATOR_STAFF.UPDATE_TIME,
EBIKE_OPERATOR_STAFF.CONTACT_PHONE,
EBIKE_OPERATOR_STAFF.CREATE_BY,
EBIKE_OPERATOR_STAFF.CREATE_TIME,
EBIKE_OPERATOR_STAFF.USERNAME,
EBIKE_OPERATOR_STAFF.IS_DELETED
)
.where(EBIKE_OPERATOR_STAFF.USERNAME.like(username, StringUtil.hasText(username)))
.where(EBIKE_OPERATOR_STAFF.CONTACT_PHONE.like(contactPhone, StringUtil.hasText(contactPhone)));
Page<EbikeOperatorStaff> page = ebikeOperatorStaffService.page(pageParam.getPage(), queryWrapper);
return JsonResult.success(page);
}
}

View File

@ -38,7 +38,7 @@ public class StaffInfo implements Serializable {
private Boolean isDeleted;
// private List<EbikeRole> roles;
private String contactPhone;
private List<String> roleCodes;

View File

@ -37,8 +37,10 @@ public class EbikeOperatorStaff implements Serializable {
private String salt;
@Column(tenantId = true)
private Long operatorId;
@Column(onInsertValue = "1")
private Integer status;
private LocalDateTime lastLogin;
@ -59,4 +61,6 @@ public class EbikeOperatorStaff implements Serializable {
@Column(isLogicDelete = true)
private Boolean isDeleted;
private String contactPhone;
}

View File

@ -44,6 +44,7 @@ public class EbikeRole implements Serializable {
/**
* 所属运营商
*/
@Column(tenantId = true)
private Long operatorId;
/**

View File

@ -0,0 +1,21 @@
package com.cdzy.staff.model.vo;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class LoginVo {
/**
* 用户名
*/
@NotBlank(message = "用户名不能为空")
private String username;
/**
* 密码
*/
@NotBlank(message = "密码不能为空")
private String password;
}

View File

@ -1,15 +1,48 @@
package com.cdzy.staff.model.vo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import java.util.List;
@Data
public class StaffVo {
/**
* 员工id
*/
private Long staffId;
private List<Long> roleIds;
@NotNull(message = "用户启用状态不能为空")
private Integer status;
/**
* 运营商ID
*/
@NotNull(message = "运营ID不能为空")
private Long operatorId;
/**
* 用户名
*/
@NotBlank(message = "用户名不能为空")
private String username;
/**
* 密码
*/
@NotBlank(message = "密码不能为空")
private String password;
/**
* 联系电话
*/
@NotBlank(message = "运营商联系手机号不能为空")
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系手机号格式错误")
private String contactPhone;
}

View File

@ -1,6 +1,7 @@
package com.cdzy.staff.service;
import com.cdzy.staff.model.dto.StaffInfo;
import com.cdzy.staff.model.vo.LoginVo;
import com.cdzy.staff.model.vo.StaffVo;
import com.mybatisflex.core.service.IService;
import com.cdzy.staff.model.entity.EbikeOperatorStaff;
@ -13,9 +14,15 @@ import com.cdzy.staff.model.entity.EbikeOperatorStaff;
*/
public interface EbikeOperatorStaffService extends IService<EbikeOperatorStaff> {
String login(StaffVo staffVo);
String login(LoginVo loginVo);
StaffInfo getStaffInfo();
void add(StaffVo staffVo);
void saveStaff(StaffVo staffVo);
void updateStaff(StaffVo staffVo);
void removeStaff(Long staffId);
StaffInfo getStaffInfoById(Long staffId);
}

View File

@ -3,10 +3,13 @@ package com.cdzy.staff.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.cdzy.common.ex.EbikeException;
import com.cdzy.common.utils.SHA256WithSaltUtil;
import com.cdzy.staff.mapper.EbikeStaffRoleMapper;
import com.cdzy.staff.model.dto.StaffInfo;
import com.cdzy.staff.model.entity.EbikeOperatorStaff;
import com.cdzy.staff.mapper.EbikeOperatorStaffMapper;
import com.cdzy.staff.model.entity.EbikeRole;
import com.cdzy.staff.model.entity.EbikeStaffRole;
import com.cdzy.staff.model.vo.LoginVo;
import com.cdzy.staff.service.EbikeOperatorStaffService;
import com.cdzy.staff.model.vo.StaffVo;
import com.cdzy.staff.service.EbikeRoleService;
@ -14,6 +17,7 @@ import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@ -37,16 +41,21 @@ public class EbikeOperatorStaffServiceImpl extends ServiceImpl<EbikeOperatorStaf
@Resource
private EbikeRoleService roleService;
@Resource
private EbikeStaffRoleMapper staffRoleMapper;
@Override
public String login(StaffVo staffVo) {
public String login(LoginVo loginVo) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_OPERATOR_STAFF.USERNAME.eq(staffVo.getUsername()));
.where(EBIKE_OPERATOR_STAFF.USERNAME.eq(loginVo.getUsername()));
EbikeOperatorStaff ebikeOperatorStaff = staffMapper.selectOneByQuery(queryWrapper);
if (ebikeOperatorStaff == null) {
throw new EbikeException("用户名错误");
} else if (ebikeOperatorStaff.getStatus() == 2) {
throw new EbikeException("该账户已被禁用");
} else {
String salt = ebikeOperatorStaff.getSalt();
String password = staffVo.getPassword();
String password = loginVo.getPassword();
password = SHA256WithSaltUtil.encrypt(password, salt);
boolean equals = ebikeOperatorStaff.getPassword().equals(password);
if (!equals) {
@ -67,7 +76,7 @@ public class EbikeOperatorStaffServiceImpl extends ServiceImpl<EbikeOperatorStaf
EBIKE_OPERATOR_STAFF.STAFF_ID, EBIKE_OPERATOR_STAFF.OPERATOR_ID,
EBIKE_OPERATOR_STAFF.USERNAME, EBIKE_OPERATOR_STAFF.CREATE_BY, EBIKE_OPERATOR_STAFF.CREATE_TIME,
EBIKE_OPERATOR_STAFF.UPDATE_BY, EBIKE_OPERATOR_STAFF.UPDATE_TIME,
EBIKE_OPERATOR_STAFF.LAST_LOGIN, EBIKE_OPERATOR_STAFF.STATUS
EBIKE_OPERATOR_STAFF.LAST_LOGIN, EBIKE_OPERATOR_STAFF.STATUS,EBIKE_OPERATOR_STAFF.CONTACT_PHONE
)
.where(EBIKE_OPERATOR_STAFF.STAFF_ID.eq(loginId));
StaffInfo info = staffMapper.selectOneByQueryAs(queryWrapper, StaffInfo.class);
@ -88,17 +97,117 @@ public class EbikeOperatorStaffServiceImpl extends ServiceImpl<EbikeOperatorStaf
}
@Override
public void add(StaffVo staffVo) {
@Transactional
public void saveStaff(StaffVo staffVo) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_OPERATOR_STAFF.USERNAME.eq(staffVo.getUsername()));
EbikeOperatorStaff ebikeOperatorStaff = staffMapper.selectOneByQuery(queryWrapper);
if (ebikeOperatorStaff == null) {
if (ebikeOperatorStaff != null) {
throw new EbikeException("用户名错误");
} else {
String salt = SHA256WithSaltUtil.generateSalt();
String password = staffVo.getPassword();
password = SHA256WithSaltUtil.encrypt(password, salt);
//TODO:添加用户账号密码与对应权限
EbikeOperatorStaff staff = EbikeOperatorStaff.builder()
.operatorId(staffVo.getOperatorId())
.username(staffVo.getUsername())
.password(password)
.salt(salt)
.createBy(StpUtil.getLoginIdAsLong())
.contactPhone(staffVo.getContactPhone())
.build();
staffMapper.insert(staff);
if (staffVo.getRoleIds() != null && !staffVo.getRoleIds().isEmpty()){
List<EbikeStaffRole> list = staffVo.getRoleIds().stream().map(roleId -> EbikeStaffRole.builder()
.roleId(roleId)
.staffId(staff.getStaffId())
.createBy(StpUtil.getLoginIdAsLong())
.build()).toList();
staffRoleMapper.insertBatch(list);
}
}
}
@Override
@Transactional
public void updateStaff(StaffVo staffVo) {
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_OPERATOR_STAFF.STAFF_ID.eq(staffVo.getStaffId()));
EbikeOperatorStaff ebikeOperatorStaff = staffMapper.selectOneByQuery(queryWrapper);
if (ebikeOperatorStaff == null) {
throw new EbikeException("员工ID错误");
} else {
String salt = SHA256WithSaltUtil.generateSalt();
String password = staffVo.getPassword();
password = SHA256WithSaltUtil.encrypt(password, salt);
ebikeOperatorStaff.setUsername(staffVo.getUsername());
ebikeOperatorStaff.setPassword(password);
ebikeOperatorStaff.setSalt(salt);
ebikeOperatorStaff.setStatus(staffVo.getStatus());
ebikeOperatorStaff.setUpdateBy(StpUtil.getLoginIdAsLong());
ebikeOperatorStaff.setContactPhone(staffVo.getContactPhone());
//禁用后踢下线
if (staffVo.getStatus() == 2){
StpUtil.logout(staffVo.getStaffId());
}
staffMapper.update(ebikeOperatorStaff);
queryWrapper.clear();
queryWrapper.where(EBIKE_STAFF_ROLE.STAFF_ID.eq(ebikeOperatorStaff.getStaffId()));
staffRoleMapper.deleteByQuery(queryWrapper);
if (staffVo.getRoleIds() != null && !staffVo.getRoleIds().isEmpty()) {
List<EbikeStaffRole> list = staffVo.getRoleIds().stream().distinct().map(roleId -> EbikeStaffRole.builder()
.roleId(roleId)
.staffId(ebikeOperatorStaff.getStaffId())
.createBy(StpUtil.getLoginIdAsLong())
.build()).toList();
staffRoleMapper.insertBatch(list);
}
}
}
@Override
@Transactional
public void removeStaff(Long staffId) {
checkAdmin(staffId);
QueryWrapper queryWrapper = QueryWrapper.create().from(EBIKE_ROLE)
.where(EBIKE_STAFF_ROLE.STAFF_ID.eq(staffId));
staffRoleMapper.deleteByQuery(queryWrapper);
//踢下线
StpUtil.logout(staffId);
staffMapper.deleteById(staffId);
}
@Override
public StaffInfo getStaffInfoById(Long staffId) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select(
EBIKE_OPERATOR_STAFF.STAFF_ID, EBIKE_OPERATOR_STAFF.OPERATOR_ID,
EBIKE_OPERATOR_STAFF.USERNAME, EBIKE_OPERATOR_STAFF.CREATE_BY, EBIKE_OPERATOR_STAFF.CREATE_TIME,
EBIKE_OPERATOR_STAFF.UPDATE_BY, EBIKE_OPERATOR_STAFF.UPDATE_TIME,
EBIKE_OPERATOR_STAFF.LAST_LOGIN, EBIKE_OPERATOR_STAFF.STATUS,EBIKE_OPERATOR_STAFF.CONTACT_PHONE
)
.where(EBIKE_OPERATOR_STAFF.STAFF_ID.eq(staffId));
StaffInfo info = staffMapper.selectOneByQueryAs(queryWrapper, StaffInfo.class);
queryWrapper.clear();
queryWrapper
.from(EBIKE_ROLE)
.leftJoin(EBIKE_STAFF_ROLE).on(EBIKE_STAFF_ROLE.ROLE_ID.eq(EBIKE_ROLE.ROLE_ID))
.where(EBIKE_STAFF_ROLE.STAFF_ID.eq(staffId));
List<EbikeRole> list = roleService.list(queryWrapper);
info.setRoles(list);
return info;
}
private void checkAdmin(Long staffId) {
QueryWrapper queryWrapper = QueryWrapper.create().from(EBIKE_ROLE)
.leftJoin(EBIKE_STAFF_ROLE).on(EBIKE_STAFF_ROLE.ROLE_ID.eq(EBIKE_ROLE.ROLE_ID))
.where(EBIKE_STAFF_ROLE.STAFF_ID.eq(staffId));
List<EbikeRole> roles = roleService.list(queryWrapper);
for (EbikeRole ebikeRole : roles) {
if (ebikeRole.getSysAdmin()) {
throw new EbikeException("超级管理员不可删除");
}
}
}
}