diff --git a/ebike-staff/src/main/java/com/cdzy/staff/component/TenantInterceptor.java b/ebike-staff/src/main/java/com/cdzy/staff/component/TenantInterceptor.java index dc713dc..185a838 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/component/TenantInterceptor.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/component/TenantInterceptor.java @@ -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; } diff --git a/ebike-staff/src/main/java/com/cdzy/staff/controller/EbikeOperatorStaffController.java b/ebike-staff/src/main/java/com/cdzy/staff/controller/EbikeOperatorStaffController.java index 5ae381c..0e05220 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/controller/EbikeOperatorStaffController.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/controller/EbikeOperatorStaffController.java @@ -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 loginVo 登录信息 + * @return 结果 + */ + @PostMapping("login") + public JsonResult login(@Validated @RequestBody LoginVo loginVo) { + String token = ebikeOperatorStaffService.login(loginVo); + return JsonResult.success(Message.LOGIN, token); + } + + /** + * 添加运营商员工。 + * ` + * * @param staffVo 登录信息 * @return 结果 */ - @PostMapping("login") - public JsonResult login(@Validated @RequestBody StaffVo staffVo) { - String token = ebikeOperatorStaffService.login(staffVo); - return JsonResult.success(Message.LOGIN,token); + @PostMapping("save") + public JsonResult saveStaff(@Validated @RequestBody StaffVo staffVo) { + ebikeOperatorStaffService.saveStaff(staffVo); + return JsonResult.success(Message.ADD_SUCCESS); } /** - * 运营商员工添加。 - *` + * 修改运营商员工。 + * ` + * * @param staffVo 登录信息 * @return 结果 */ - @PostMapping("add") - public JsonResult add(@Validated @RequestBody StaffVo staffVo) { - ebikeOperatorStaffService.add(staffVo); + @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 page = ebikeOperatorStaffService.page(pageParam.getPage(), queryWrapper); + return JsonResult.success(page); + } } diff --git a/ebike-staff/src/main/java/com/cdzy/staff/model/dto/StaffInfo.java b/ebike-staff/src/main/java/com/cdzy/staff/model/dto/StaffInfo.java index 64346c2..4a2ab96 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/model/dto/StaffInfo.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/model/dto/StaffInfo.java @@ -38,7 +38,7 @@ public class StaffInfo implements Serializable { private Boolean isDeleted; -// private List roles; + private String contactPhone; private List roleCodes; diff --git a/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeOperatorStaff.java b/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeOperatorStaff.java index 47f8854..b435472 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeOperatorStaff.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeOperatorStaff.java @@ -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; + } diff --git a/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeRole.java b/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeRole.java index c97678b..fcaab66 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeRole.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/model/entity/EbikeRole.java @@ -44,6 +44,7 @@ public class EbikeRole implements Serializable { /** * 所属运营商 */ + @Column(tenantId = true) private Long operatorId; /** diff --git a/ebike-staff/src/main/java/com/cdzy/staff/model/vo/LoginVo.java b/ebike-staff/src/main/java/com/cdzy/staff/model/vo/LoginVo.java new file mode 100644 index 0000000..3e7769d --- /dev/null +++ b/ebike-staff/src/main/java/com/cdzy/staff/model/vo/LoginVo.java @@ -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; + +} diff --git a/ebike-staff/src/main/java/com/cdzy/staff/model/vo/StaffVo.java b/ebike-staff/src/main/java/com/cdzy/staff/model/vo/StaffVo.java index fbf70f4..628647b 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/model/vo/StaffVo.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/model/vo/StaffVo.java @@ -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 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; + } diff --git a/ebike-staff/src/main/java/com/cdzy/staff/service/EbikeOperatorStaffService.java b/ebike-staff/src/main/java/com/cdzy/staff/service/EbikeOperatorStaffService.java index 65bb40c..6f90eff 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/service/EbikeOperatorStaffService.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/service/EbikeOperatorStaffService.java @@ -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 { - 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); } diff --git a/ebike-staff/src/main/java/com/cdzy/staff/service/impl/EbikeOperatorStaffServiceImpl.java b/ebike-staff/src/main/java/com/cdzy/staff/service/impl/EbikeOperatorStaffServiceImpl.java index bab308f..9747623 100644 --- a/ebike-staff/src/main/java/com/cdzy/staff/service/impl/EbikeOperatorStaffServiceImpl.java +++ b/ebike-staff/src/main/java/com/cdzy/staff/service/impl/EbikeOperatorStaffServiceImpl.java @@ -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 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 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 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 roles = roleService.list(queryWrapper); + for (EbikeRole ebikeRole : roles) { + if (ebikeRole.getSysAdmin()) { + throw new EbikeException("超级管理员不可删除"); + } } } }