员工权限相关接口

This commit is contained in:
张松
2025-02-18 11:11:32 +08:00
parent f67b6cd714
commit 660ec88492
28 changed files with 644 additions and 15 deletions

View File

@@ -0,0 +1,29 @@
package com.czg.annotation;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 权限认证(User版):必须具有指定权限才能进入该方法
* <p> 可标注在函数、类上(效果等同于标注在此类的所有方法上)
* @author click33
*
*/
//@SaCheckPermission(type = "user")
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaStaffCheckPermission {
/**
* 需要校验的权限码
* @return 需要校验的权限码
*/
String value() default "";
}

View File

@@ -0,0 +1,31 @@
package com.czg.handler;
import cn.dev33.satoken.annotation.handler.SaAnnotationHandlerInterface;
import cn.hutool.core.util.StrUtil;
import com.czg.annotation.SaStaffCheckPermission;
import com.czg.sa.StpKit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 员工权限校验
* @author Administrator
*/
@Component
@Slf4j
public class SaStaffCheckPermissionHandler implements SaAnnotationHandlerInterface<SaStaffCheckPermission> {
@Override
public Class<SaStaffCheckPermission> getHandlerAnnotationClass() {
return SaStaffCheckPermission.class;
}
@Override
public void checkMethod(SaStaffCheckPermission at, Method method) {
if (at != null && StrUtil.isNotBlank(at.value()) && StpKit.USER.isStaff()) {
StpKit.USER.checkPermission(at.value());
}
}
}

View File

@@ -26,6 +26,10 @@ public class MyStpLogic {
public static final StpLogic CLIENT_LOGIC = new StpLogic("client");
public static final StpLogic ADMIN_LOGIC = new StpLogic("admin");
public enum LoginType {
MANAGER, USER, STAFF
}
private StpLogic getLogic() {
boolean hit = SaRouter.match("/admin/**").isHit();
if (hit) {
@@ -37,16 +41,16 @@ public class MyStpLogic {
/**
* @param id 登录账号id
* @param shopId 店铺id
* @param isManager true 管理端 false 用户端
* @param loginType 登录类型枚举
* @param isAdmin 是否为管理员账号
*/
public void login(Long id, Long shopId, boolean isManager, boolean isAdmin) {
public void login(Long id, Long shopId, LoginType loginType, boolean isAdmin) {
StpLogic logic = getLogic();
logic.login(id);
if (isManager && shopId == null) {
if (loginType.equals(LoginType.MANAGER) && shopId == null) {
throw new ApiNotPrintException("管理端登录必须传递店铺id");
}
SaSession session = logic.getSession().set("userId", id).set("isAdmin", isAdmin).set("isManager", isManager);
SaSession session = logic.getSession().set("userId", id).set("isAdmin", isAdmin).set("isManager", loginType.equals(LoginType.MANAGER)).set("loginType", loginType);
if (shopId != null) {
session.set("shopId", shopId);
}
@@ -104,6 +108,28 @@ public class MyStpLogic {
}
}
/**
* 是否为管理端登录
*
* @return 布尔值
*/
public boolean isStaff() {
StpLogic logic = getLogic();
Object object = logic.getSession().get("loginType");
return object instanceof LoginType t && t.equals(LoginType.STAFF);
}
/**
* 是否为管理端登录
*
* @return 布尔值
*/
public boolean isManager() {
StpLogic logic = getLogic();
Object object = logic.getSession().get("isManager");
return object instanceof Boolean t && t;
}
/**
* 是否为管理员
*

View File

@@ -0,0 +1,71 @@
package com.czg.account.dto;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.alibaba.fastjson2.annotation.JSONField;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 店铺权限 实体类。
*
* @author zs
* @since 2025-02-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ShopPermissionDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 权限类型staff 员工,
*/
private String type;
/**
* 权限名称
*/
private String label;
/**
* 权限code为了区分采用汉语拼音
*/
private String code;
/**
* 层级
*/
private Integer level;
/**
* 上级ID
*/
private Integer parentId;
/**
* 是否重要: 重要对应页面红色
*/
private Integer isImportant;
/**
* 排序
*/
private Integer sort;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,48 @@
package com.czg.account.dto;
import java.io.Serializable;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 店铺员工权限关联表 实体类。
*
* @author zs
* @since 2025-02-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ShopStaffPermissionDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 权限ID
*/
private Integer permissionId;
/**
* 员工ID
*/
private Integer staffId;
/**
* 店铺ID
*/
private Integer shopId;
/**
* 用户ID
*/
private Integer userId;
}

View File

@@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author Administrator
@@ -16,6 +17,10 @@ public class ShopStaffAddDTO {
*/
@NotNull(message = "角色id不为空")
private Long roleId;
/**
* 店铺权限id集合
*/
private List<Long> shopPermissionIds;
/**
* 员工姓名
*/

View File

@@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author Administrator
@@ -13,6 +14,10 @@ import java.math.BigDecimal;
public class ShopStaffEditDTO {
@NotNull(message = "id不为空")
private Long id;
/**
* 店铺权限id集合
*/
private List<Long> shopPermissionIds;
/**
* 角色id
*/

View File

@@ -0,0 +1,81 @@
package com.czg.account.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.io.Serial;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 店铺权限 实体类。
*
* @author zs
* @since 2025-02-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_shop_permission")
public class ShopPermission implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 权限类型staff 员工,
*/
private String type;
/**
* 权限名称
*/
private String label;
/**
* 权限code为了区分采用汉语拼音
*/
private String code;
/**
* 层级
*/
private Integer level;
/**
* 上级ID
*/
private Long parentId;
/**
* 是否重要: 重要对应页面红色
*/
private Integer isImportant;
/**
* 排序
*/
private Integer sort;
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
@Column(ignore = true)
private List<ShopPermission> children;
}

View File

@@ -0,0 +1,54 @@
package com.czg.account.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 店铺员工权限关联表 实体类。
*
* @author zs
* @since 2025-02-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("tb_shop_staff_permission")
public class ShopStaffPermission implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 权限ID
*/
private Long permissionId;
/**
* 员工ID
*/
private Long staffId;
/**
* 店铺ID
*/
private Long shopId;
/**
* 用户ID
*/
private Long userId;
}

View File

@@ -0,0 +1,17 @@
package com.czg.account.service;
import com.mybatisflex.core.service.IService;
import com.czg.account.entity.ShopPermission;
import java.util.List;
/**
* 店铺权限 服务层。
*
* @author zs
* @since 2025-02-18
*/
public interface ShopPermissionService extends IService<ShopPermission> {
List<ShopPermission> getPermission();
}

View File

@@ -0,0 +1,18 @@
package com.czg.account.service;
import com.czg.account.entity.ShopPermission;
import com.mybatisflex.core.service.IService;
import com.czg.account.entity.ShopStaffPermission;
import java.util.List;
/**
* 店铺员工权限关联表 服务层。
*
* @author zs
* @since 2025-02-18
*/
public interface ShopStaffPermissionService extends IService<ShopStaffPermission> {
List<ShopPermission> getPermissionByStaffId(Long shopId, Long staffId, Long userId);
}

View File

@@ -7,6 +7,8 @@ import com.czg.account.entity.ShopStaff;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import java.util.List;
/**
* 店铺员工 服务层。
*
@@ -22,4 +24,6 @@ public interface ShopStaffService extends IService<ShopStaff> {
Page<ShopStaff> get(String name, String code);
Boolean delete(ShopStaffRemoveDTO shopStaffRemoveDTO);
List<Long> permission(Long id);
}