1.后台登录接口
2.异常处理
This commit is contained in:
@@ -27,6 +27,11 @@
|
||||
<groupId>com.czg</groupId>
|
||||
<artifactId>cash-common-tools</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.czg</groupId>
|
||||
<artifactId>cash-common-exception</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
package com.czg.service.account.dto;
|
||||
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
public record SysLoginDTO(
|
||||
@NotEmpty(message = "用户名不为空")
|
||||
String username,
|
||||
String username, // 用户名
|
||||
@NotEmpty(message = "密码不为空")
|
||||
String password,
|
||||
String password, // 密码
|
||||
@NotEmpty(message = "验证码不为空")
|
||||
String code,
|
||||
String code, // 验证码
|
||||
@NotEmpty(message = "uid不为空")
|
||||
String uuid,
|
||||
String staffName
|
||||
String uuid, // 验证码uid
|
||||
@NotNull
|
||||
Integer loginType // 登录类型 0:商户登录 1:员工登录
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
package com.czg.service.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 lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 系统菜单 实体类。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Table("sys_menu")
|
||||
public class SysMenu implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* ID
|
||||
*/
|
||||
@Id(keyType = KeyType.Auto)
|
||||
private Long menuId;
|
||||
|
||||
/**
|
||||
* 上级菜单ID
|
||||
*/
|
||||
private Long pid;
|
||||
|
||||
/**
|
||||
* 子菜单数目
|
||||
*/
|
||||
private Integer subCount;
|
||||
|
||||
/**
|
||||
* 菜单类型 0 菜单 1按钮 3接口
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 菜单标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 组件名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 组件
|
||||
*/
|
||||
private String component;
|
||||
|
||||
/**
|
||||
* 排序
|
||||
*/
|
||||
private Integer menuSort;
|
||||
|
||||
/**
|
||||
* 图标
|
||||
*/
|
||||
private String icon;
|
||||
|
||||
/**
|
||||
* 链接地址
|
||||
*/
|
||||
private String path;
|
||||
|
||||
/**
|
||||
* 是否外链
|
||||
*/
|
||||
private Boolean iFrame;
|
||||
|
||||
/**
|
||||
* 缓存
|
||||
*/
|
||||
private Boolean cache;
|
||||
|
||||
/**
|
||||
* 隐藏
|
||||
*/
|
||||
private Boolean hidden;
|
||||
|
||||
/**
|
||||
* 权限
|
||||
*/
|
||||
private String permission;
|
||||
|
||||
/**
|
||||
* 创建者
|
||||
*/
|
||||
private String createBy;
|
||||
|
||||
/**
|
||||
* 更新者
|
||||
*/
|
||||
private String updateBy;
|
||||
|
||||
/**
|
||||
* 创建日期
|
||||
*/
|
||||
@Column(onInsertValue = "now()")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@Column(onInsertValue = "now()", onUpdateValue = "now()")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
/**
|
||||
* 是否选中父级菜单
|
||||
*/
|
||||
private String activeMenu;
|
||||
|
||||
/**
|
||||
* 商户使用 0:否;1:是;
|
||||
*/
|
||||
private Long isShop;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.czg.service.account.entity;
|
||||
|
||||
import com.mybatisflex.annotation.Id;
|
||||
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 Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Table("sys_users_roles")
|
||||
public class SysUsersRoles implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 用户ID
|
||||
*/
|
||||
@Id
|
||||
private Long userId;
|
||||
|
||||
/**
|
||||
* 角色ID
|
||||
*/
|
||||
@Id
|
||||
private Long roleId;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
package com.czg.service.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.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 店铺信息 实体类。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Table("tb_shop_info")
|
||||
public class TbShopInfo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 使用系统用户 sys_user id
|
||||
*/
|
||||
@Id(keyType = KeyType.Auto)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 主店id
|
||||
*/
|
||||
private Integer mainId;
|
||||
|
||||
/**
|
||||
* 店铺口号
|
||||
*/
|
||||
private String subTitle;
|
||||
|
||||
/**
|
||||
* 店铺名称
|
||||
*/
|
||||
private String shopName;
|
||||
|
||||
/**
|
||||
* 连锁店扩展店名
|
||||
*/
|
||||
private String chainName;
|
||||
|
||||
/**
|
||||
* 背景图
|
||||
*/
|
||||
private String backImg;
|
||||
|
||||
/**
|
||||
* 门头照
|
||||
*/
|
||||
private String frontImg;
|
||||
|
||||
/**
|
||||
* 联系人姓名
|
||||
*/
|
||||
private String contactName;
|
||||
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
private String phone;
|
||||
|
||||
/**
|
||||
* 店铺logo
|
||||
*/
|
||||
private String logo;
|
||||
|
||||
/**
|
||||
* 封面图
|
||||
*/
|
||||
private String coverImg;
|
||||
|
||||
/**
|
||||
* 店铺简介
|
||||
*/
|
||||
private String detail;
|
||||
|
||||
private String registerType;
|
||||
|
||||
/**
|
||||
* 店铺类型 单店--only 连锁店--chain--加盟店join (对应原来 type)
|
||||
*/
|
||||
private String shopType;
|
||||
|
||||
/**
|
||||
* 管理 0否 1是, 1 为直接管理 可切换店铺 0 不可以切换
|
||||
*/
|
||||
private Integer tubeType;
|
||||
|
||||
/**
|
||||
* 营业时间(周开始)
|
||||
*/
|
||||
private String businessStartDay;
|
||||
|
||||
/**
|
||||
* 营业时间(周结束)
|
||||
*/
|
||||
private String businessEndDay;
|
||||
|
||||
/**
|
||||
* 营业时间
|
||||
*/
|
||||
private String businessTime;
|
||||
|
||||
/**
|
||||
* trial试用版,release正式
|
||||
*/
|
||||
private String profiles;
|
||||
|
||||
/**
|
||||
* 0停业 1,正常营业 2,网上售卖
|
||||
*/
|
||||
private Integer onSale;
|
||||
|
||||
/**
|
||||
* -1 平台禁用 0-过期,1正式营业,
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 到期时间
|
||||
*/
|
||||
private LocalDateTime expireTime;
|
||||
|
||||
@Column(onInsertValue = "now()")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Column(onInsertValue = "now()", onUpdateValue = "now()")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
/**
|
||||
* 商家二维码
|
||||
*/
|
||||
private String shopQrcode;
|
||||
|
||||
/**
|
||||
* 商家标签
|
||||
*/
|
||||
private String tag;
|
||||
|
||||
/**
|
||||
* 经纬度
|
||||
*/
|
||||
private String lat;
|
||||
|
||||
/**
|
||||
* 经纬度
|
||||
*/
|
||||
private String lng;
|
||||
|
||||
/**
|
||||
* 省
|
||||
*/
|
||||
private String provinces;
|
||||
|
||||
/**
|
||||
* 市
|
||||
*/
|
||||
private String cities;
|
||||
|
||||
/**
|
||||
* 区/县
|
||||
*/
|
||||
private String districts;
|
||||
|
||||
/**
|
||||
* 详细地址
|
||||
*/
|
||||
private String address;
|
||||
|
||||
/**
|
||||
* 是否允许会员自定义金额 1 允许 0 不允许
|
||||
*/
|
||||
private Integer isCustomAmount;
|
||||
|
||||
/**
|
||||
* 是否开启退款密码 1 启用 0 禁用
|
||||
*/
|
||||
private Integer isReturnPwd;
|
||||
|
||||
/**
|
||||
* 是否开启会员充值密码 1 启用 0 禁用
|
||||
*/
|
||||
private Integer isMemberInPwd;
|
||||
|
||||
/**
|
||||
* 是否开启会员退款密码 1 启用 0 禁用
|
||||
*/
|
||||
private Integer isMemberReturnPwd;
|
||||
|
||||
/**
|
||||
* 是否免除桌位费 0否1是
|
||||
*/
|
||||
private Integer isTableFee;
|
||||
|
||||
/**
|
||||
* 桌位费
|
||||
*/
|
||||
private BigDecimal tableFee;
|
||||
|
||||
/**
|
||||
* 是否启用会员价 0否1是
|
||||
*/
|
||||
private Integer isMemberPrice;
|
||||
|
||||
/**
|
||||
* 积分群体 all-所有 vip-仅针对会员
|
||||
*/
|
||||
private String consumeColony;
|
||||
|
||||
/**
|
||||
* 就餐模式 堂食 dine-in 外带 take-out
|
||||
*/
|
||||
private String eatModel;
|
||||
|
||||
/**
|
||||
* 小程序码(零点八零首页)
|
||||
*/
|
||||
private String smallQrcode;
|
||||
|
||||
/**
|
||||
* 店铺收款码
|
||||
*/
|
||||
private String paymentQrcode;
|
||||
|
||||
/**
|
||||
* 台桌预订短信
|
||||
*/
|
||||
private String bookingSms;
|
||||
|
||||
/**
|
||||
* 操作密码
|
||||
*/
|
||||
private String operationPwd;
|
||||
|
||||
/**
|
||||
* 开票系统账号
|
||||
*/
|
||||
private String bindAccount;
|
||||
|
||||
/**
|
||||
* 项目分类
|
||||
*/
|
||||
private String article;
|
||||
|
||||
/**
|
||||
* 数电发票类型
|
||||
*/
|
||||
private String sdType;
|
||||
|
||||
/**
|
||||
* 税率
|
||||
*/
|
||||
private String taxAmount;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.czg.service.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.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 店铺员工 实体类。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Table("tb_shop_staff")
|
||||
public class TbShopStaff implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 使用系统用户 sys_user id
|
||||
*/
|
||||
@Id(keyType = KeyType.Auto)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 员工编号
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 员工名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 最大优惠金额
|
||||
*/
|
||||
private BigDecimal maxDiscountAmount;
|
||||
|
||||
/**
|
||||
* 优惠类型 1 折扣 0 金额
|
||||
*/
|
||||
private String discountType;
|
||||
|
||||
/**
|
||||
* 1启用0不启用
|
||||
*/
|
||||
private Boolean status;
|
||||
|
||||
/**
|
||||
* shopId
|
||||
*/
|
||||
private String shopId;
|
||||
|
||||
@Column(onInsertValue = "now()")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Column(onInsertValue = "now()", onUpdateValue = "now()")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
/**
|
||||
* master商户账号staff员工
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 是否允许管理端登录 0:不允许;1:允许
|
||||
*/
|
||||
private Integer isManage;
|
||||
|
||||
/**
|
||||
* 是否允许pc端登录 0:不允许;1:允许
|
||||
*/
|
||||
private Integer isPc;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.czg.service.account.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.service.account.entity.SysMenu;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 系统菜单 映射层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface SysMenuMapper extends BaseMapper<SysMenu> {
|
||||
|
||||
List<SysMenu> selectByUserId(@Param("userId") Long userId, @Param("type") Integer type);
|
||||
|
||||
}
|
||||
@@ -2,6 +2,9 @@ package com.czg.service.account.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.service.account.entity.SysRole;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 角色表 映射层。
|
||||
@@ -11,4 +14,5 @@ import com.czg.service.account.entity.SysRole;
|
||||
*/
|
||||
public interface SysRoleMapper extends BaseMapper<SysRole> {
|
||||
|
||||
List<SysRole> selectByUserId(@Param("userId") Long id);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.account.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.service.account.entity.SysUsersRoles;
|
||||
|
||||
/**
|
||||
* 用户角色关联 映射层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface SysUsersRolesMapper extends BaseMapper<SysUsersRoles> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.account.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.service.account.entity.TbShopInfo;
|
||||
|
||||
/**
|
||||
* 店铺信息 映射层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface TbShopInfoMapper extends BaseMapper<TbShopInfo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.account.mapper;
|
||||
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import com.czg.service.account.entity.TbShopStaff;
|
||||
|
||||
/**
|
||||
* 店铺员工 映射层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface TbShopStaffMapper extends BaseMapper<TbShopStaff> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.czg.service.account.service;
|
||||
|
||||
import com.mybatisflex.core.service.IService;
|
||||
import com.czg.service.account.entity.SysMenu;
|
||||
|
||||
/**
|
||||
* 系统菜单 服务层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface SysMenuService extends IService<SysMenu> {
|
||||
|
||||
Object getMenu();
|
||||
}
|
||||
@@ -3,6 +3,8 @@ package com.czg.service.account.service;
|
||||
import com.mybatisflex.core.service.IService;
|
||||
import com.czg.service.account.entity.SysRole;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 角色表 服务层。
|
||||
*
|
||||
@@ -11,4 +13,5 @@ import com.czg.service.account.entity.SysRole;
|
||||
*/
|
||||
public interface SysRoleService extends IService<SysRole> {
|
||||
|
||||
List<SysRole> getByUserId(Long id);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.account.service;
|
||||
|
||||
import com.mybatisflex.core.service.IService;
|
||||
import com.czg.service.account.entity.SysUsersRoles;
|
||||
|
||||
/**
|
||||
* 用户角色关联 服务层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface SysUsersRolesService extends IService<SysUsersRoles> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.account.service;
|
||||
|
||||
import com.mybatisflex.core.service.IService;
|
||||
import com.czg.service.account.entity.TbShopInfo;
|
||||
|
||||
/**
|
||||
* 店铺信息 服务层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface TbShopInfoService extends IService<TbShopInfo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.czg.service.account.service;
|
||||
|
||||
import com.mybatisflex.core.service.IService;
|
||||
import com.czg.service.account.entity.TbShopStaff;
|
||||
|
||||
/**
|
||||
* 店铺员工 服务层。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
public interface TbShopStaffService extends IService<TbShopStaff> {
|
||||
|
||||
}
|
||||
@@ -1,19 +1,48 @@
|
||||
package com.czg.service.account.service.impl;
|
||||
|
||||
import cn.hutool.core.comparator.CompareUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
import com.czg.config.RedisCst;
|
||||
import com.czg.service.RedisService;
|
||||
import com.czg.service.account.dto.SysLoginDTO;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.account.service.AuthorizationService;
|
||||
import com.czg.service.account.entity.*;
|
||||
import com.czg.service.account.mapper.SysMenuMapper;
|
||||
import com.czg.service.account.service.*;
|
||||
import com.mybatisflex.core.query.QueryChain;
|
||||
import com.wf.captcha.SpecCaptcha;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Administrator
|
||||
*/
|
||||
@Service
|
||||
public class AuthorizationServiceImpl implements AuthorizationService {
|
||||
@Resource
|
||||
private RedisService redisService;
|
||||
|
||||
@Resource
|
||||
private SysUserService sysUserService;
|
||||
@Resource
|
||||
private TbShopStaffService shopStaffService;
|
||||
@Resource
|
||||
private TbShopInfoService shopInfoService;
|
||||
@Resource
|
||||
private SysRoleService sysRoleService;
|
||||
@Resource
|
||||
private SysMenuMapper sysMenuMapper;
|
||||
|
||||
|
||||
@Override
|
||||
public Object getCaptcha() {
|
||||
// 生成验证码(130x48,4位字符)
|
||||
@@ -25,13 +54,64 @@ public class AuthorizationServiceImpl implements AuthorizationService {
|
||||
// 生成唯一的验证码 ID
|
||||
String captchaKey = IdUtil.randomUUID();
|
||||
|
||||
redisService.set(RedisCst.LOGIN_CODE + captchaKey, code, 300);
|
||||
|
||||
// 返回 Base64 格式验证码
|
||||
return Map.of("code", captcha.toBase64(), "uuid", captchaKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object login(SysLoginDTO loginDTO) {
|
||||
StpKit.ADMIN.login(1);
|
||||
return Map.of("token", StpKit.ADMIN.getTokenInfo());
|
||||
// Object code = redisService.get(RedisCst.LOGIN_CODE + loginDTO.uuid());
|
||||
// if (!"666666".equals(loginDTO.code()) && code == null || !code.equals(loginDTO.code())) {
|
||||
// throw new RuntimeException("验证码错误");
|
||||
// }
|
||||
|
||||
SysUser user = sysUserService.queryChain().eq(SysUser::getAccount,loginDTO.username()).one();
|
||||
if (user == null) {
|
||||
throw new RuntimeException("账户不存在");
|
||||
}
|
||||
|
||||
String md5 = SecureUtil.md5(user.getId() + loginDTO.password());
|
||||
if (StrUtil.isBlank(user.getPassword()) || !user.getPassword().equals(md5)) {
|
||||
throw new RuntimeException("账户或密码错误");
|
||||
}
|
||||
|
||||
TbShopInfo shopInfo;
|
||||
// 商户员工登录
|
||||
if (loginDTO.loginType() == 1) {
|
||||
TbShopStaff shopStaff = shopStaffService.queryChain().eq(TbShopStaff::getStatus, 1)
|
||||
.eq(TbShopStaff::getIsManage, 1)
|
||||
.eq(TbShopStaff::getId, user.getId()).one();
|
||||
if (shopStaff == null) {
|
||||
throw new RuntimeException("账户未启用");
|
||||
}
|
||||
|
||||
shopInfo = shopInfoService.getById(shopStaff.getShopId());
|
||||
}else {
|
||||
shopInfo = shopInfoService.getById(user.getId());
|
||||
}
|
||||
|
||||
if (shopInfo == null) {
|
||||
throw new RuntimeException("商户不存在");
|
||||
}
|
||||
// 过期时间校验
|
||||
if (shopInfo.getExpireTime() != null) {
|
||||
if ((DateUtil.date().toLocalDateTime().isBefore(shopInfo.getExpireTime()))) {
|
||||
throw new RuntimeException("店铺已到期,请联系区域经理续费");
|
||||
}
|
||||
}
|
||||
|
||||
StpKit.ADMIN.login(user.getId());
|
||||
// 查询角色
|
||||
List<SysRole> roleList = sysRoleService.getByUserId(user.getId());
|
||||
List<String> roleNames = roleList.stream().map(SysRole::getName).collect(Collectors.toList());
|
||||
StpKit.ADMIN.addRoleList(roleNames);
|
||||
// 权限赋予
|
||||
List<String> promissionList = sysMenuMapper.selectByUserId(user.getId(), null).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).collect(Collectors.toList());
|
||||
StpKit.ADMIN.addPermissionList(promissionList);
|
||||
return Map.of("tokenInfo", StpKit.ADMIN.getTokenInfo(),
|
||||
"loginType", loginDTO.loginType(),
|
||||
"shopInfo", shopInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.czg.service.account.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.account.vo.MenuVO;
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.service.account.entity.SysMenu;
|
||||
import com.czg.service.account.mapper.SysMenuMapper;
|
||||
import com.czg.service.account.service.SysMenuService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 系统菜单 服务层实现。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Service
|
||||
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
|
||||
|
||||
@Override
|
||||
public Object getMenu() {
|
||||
long sysUserId = StpKit.ADMIN.getLoginIdAsLong();
|
||||
List<SysMenu> allMenus = mapper.selectByUserId(sysUserId, null);
|
||||
List<MenuVO> rootMenus = new ArrayList<>();
|
||||
List<MenuVO> allMenuVos = new ArrayList<>();
|
||||
|
||||
// 分类菜单和按钮,并处理按钮的权限
|
||||
for (SysMenu menu : allMenus) {
|
||||
MenuVO menuVO = BeanUtil.copyProperties(menu, MenuVO.class);
|
||||
|
||||
// 如果是按钮类型,添加权限标识集合到 permissions
|
||||
if (menu.getType() == 2) {
|
||||
// 获取按钮的权限标识集合
|
||||
menuVO.setPermissions(getPermissionsForMenu(menu));
|
||||
}
|
||||
|
||||
// 分类根菜单与所有菜单
|
||||
if (menu.getPid() == null || menu.getPid() == 0) {
|
||||
rootMenus.add(menuVO);
|
||||
}
|
||||
allMenuVos.add(menuVO);
|
||||
}
|
||||
|
||||
// 给每个根菜单设置子菜单,同时把按钮权限标识加入到 permissions 中
|
||||
for (MenuVO rootMenu : rootMenus) {
|
||||
buildSubMenus(rootMenu, allMenuVos);
|
||||
}
|
||||
|
||||
return rootMenus;
|
||||
}
|
||||
|
||||
// 递归构建子菜单,按钮放在 permissions 中
|
||||
private void buildSubMenus(MenuVO parentMenu, List<MenuVO> allMenus) {
|
||||
List<MenuVO> children = new ArrayList<>();
|
||||
// 存储该菜单的按钮权限
|
||||
List<String> permissions = new ArrayList<>();
|
||||
|
||||
for (MenuVO menu : allMenus) {
|
||||
// 如果是菜单且父级菜单ID匹配,加入子菜单
|
||||
if (menu.getPid() != null && menu.getPid().equals(parentMenu.getMenuId()) && menu.getType() != 2) {
|
||||
children.add(menu);
|
||||
// 递归查找子菜单
|
||||
buildSubMenus(menu, allMenus);
|
||||
}
|
||||
// 如果是按钮类型,直接放到权限集合中
|
||||
if (menu.getPid() != null && menu.getPid().equals(parentMenu.getMenuId()) && menu.getType() == 2) {
|
||||
// 将按钮的权限标识加入权限列表
|
||||
permissions.addAll(getPermissionsForMenu(menu));
|
||||
}
|
||||
}
|
||||
|
||||
// 设置当前菜单的子菜单和权限
|
||||
parentMenu.setChildren(children);
|
||||
// 将按钮权限标识添加到菜单的权限中
|
||||
parentMenu.setPermissions(permissions);
|
||||
}
|
||||
|
||||
// 根据菜单获取权限标识(这里假设你有权限标识的获取逻辑)
|
||||
private List<String> getPermissionsForMenu(SysMenu menu) {
|
||||
List<String> permissions = new ArrayList<>();
|
||||
// 你可以根据需求从数据库或其他地方获取权限标识
|
||||
// 例如,假设菜单表中有权限字段
|
||||
if (menu.getPermission() != null) {
|
||||
String[] permissionArray = menu.getPermission().split(",");
|
||||
permissions.addAll(Arrays.asList(permissionArray));
|
||||
}
|
||||
return permissions;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ import com.czg.service.account.mapper.SysRoleMapper;
|
||||
import com.czg.service.account.service.SysRoleService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 角色表 服务层实现。
|
||||
*
|
||||
@@ -15,4 +17,8 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService{
|
||||
|
||||
@Override
|
||||
public List<SysRole> getByUserId(Long id) {
|
||||
return mapper.selectByUserId(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.czg.service.account.service.impl;
|
||||
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.service.account.entity.SysUsersRoles;
|
||||
import com.czg.service.account.mapper.SysUsersRolesMapper;
|
||||
import com.czg.service.account.service.SysUsersRolesService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 用户角色关联 服务层实现。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Service
|
||||
public class SysUsersRolesServiceImpl extends ServiceImpl<SysUsersRolesMapper, SysUsersRoles> implements SysUsersRolesService{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.czg.service.account.service.impl;
|
||||
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.service.account.entity.TbShopInfo;
|
||||
import com.czg.service.account.mapper.TbShopInfoMapper;
|
||||
import com.czg.service.account.service.TbShopInfoService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 店铺信息 服务层实现。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Service
|
||||
public class TbShopInfoServiceImpl extends ServiceImpl<TbShopInfoMapper, TbShopInfo> implements TbShopInfoService{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.czg.service.account.service.impl;
|
||||
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import com.czg.service.account.entity.TbShopStaff;
|
||||
import com.czg.service.account.mapper.TbShopStaffMapper;
|
||||
import com.czg.service.account.service.TbShopStaffService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 店铺员工 服务层实现。
|
||||
*
|
||||
* @author Administrator
|
||||
* @since 2025-02-10
|
||||
*/
|
||||
@Service
|
||||
public class TbShopStaffServiceImpl extends ServiceImpl<TbShopStaffMapper, TbShopStaff> implements TbShopStaffService{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.czg.service.account.vo;
|
||||
|
||||
import com.czg.service.account.entity.SysMenu;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* @author Administrator
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class MenuVO extends SysMenu {
|
||||
private List<MenuVO> children;
|
||||
private List<String> permissions;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.czg.service.account.mapper.SysMenuMapper">
|
||||
|
||||
<select id="selectByUserId" resultType="com.czg.service.account.entity.SysMenu">
|
||||
select c.*
|
||||
from sys_users_roles as a
|
||||
left join sys_roles_menus as b on a.role_id = b.role_id
|
||||
left join sys_menu as c on c.menu_id = b.menu_id
|
||||
where a.user_id = #{userId}
|
||||
<if test="type != null">
|
||||
and c.type=#{type}
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -4,4 +4,7 @@
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.czg.service.account.mapper.SysRoleMapper">
|
||||
|
||||
<select id="selectByUserId" resultType="com.czg.service.account.entity.SysRole">
|
||||
select a.* from sys_role as a left join sys_users_roles as b on b.role_id=a.id where b.user_id=#{userId}
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.czg.service.account.mapper.SysUsersRolesMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.czg.service.account.mapper.TbShopInfoMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.czg.service.account.mapper.TbShopStaffMapper">
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user