From 513c3a015c11954d46bc6dadb98b9b88f5b60268 Mon Sep 17 00:00:00 2001 From: shi Date: Tue, 25 Feb 2025 10:05:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(agent):=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E5=95=86=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AgentController 类,实现代理商业务功能 - 重构 AgentCreateTenantRequest 类,添加数据校验注解 - 新增 AgentTenantSecretKeyDTO 类,用于代理租户密钥展示 - 删除 ApiAgentController 类,将相关功能合并到 AgentController- 更新相关服务类和 Mapper 类,调整字段和方法以适应新的业务逻辑 --- ff-admin/pom.xml | 7 +- .../src/main/java/com/ff/FFApplication.java | 11 +- .../ff/agent/contoller/AgentController.java | 124 +++++++ .../ff/agent/dto/AgentTenantSecretKeyDTO.java | 89 +++++ .../request/AgentCreateTenantRequest.java | 58 +++ .../com/ff/annotation/HeaderCheckAspect.java | 4 +- .../ff/api/controller/ApiAgentController.java | 81 ----- .../ff/api/controller/ApiGameController.java | 5 +- .../api/controller/ApiMemberController.java | 31 +- .../api/controller/ApiTenantController.java | 2 +- .../com/ff/api/request/AgentCreateTenant.java | 46 --- .../controller/TenantSecretKeyController.java | 4 +- .../com/ff/common/domain/TenantGameQuota.java | 3 + .../service/impl/CurrencyServiceImpl.java | 3 + .../common/service/impl/LangServiceImpl.java | 3 + .../impl/TenantGameQuotaFlowServiceImpl.java | 2 + .../impl/TenantGameQuotaServiceImpl.java | 8 +- .../impl/TenantQuotaExchangeServiceImpl.java | 3 + .../impl/TenantSecretKeyServiceImpl.java | 126 ------- .../main/java/com/ff/config/KeyConfig.java | 2 +- .../service/impl/GamesJILIServiceImpl.java | 9 - .../xk/service/impl/GamesXKServiceImpl.java | 4 - .../ff/game/mapper/GameSecretKeyMapper.java | 2 +- .../game/service/IGameSecretKeyService.java | 1 - .../impl/GameBettingDetailsServiceImpl.java | 3 + .../impl/GameExchangeMoneyServiceImpl.java | 3 + .../impl/GameFreeRecordServiceImpl.java | 3 + .../service/impl/GamePlatformServiceImpl.java | 3 + .../impl/GameSecretKeyServiceImpl.java | 4 +- .../ff/game/service/impl/GameServiceImpl.java | 2 + .../service/impl/MemberServiceImpl.java | 3 + .../service/impl/SysJobLogServiceImpl.java | 2 + .../service/impl/SysJobServiceImpl.java | 2 + .../com/ff/quartz/task/TenantQuotaTask.java | 6 +- .../com/ff/system/SysLoginController.java | 46 ++- .../com/ff/system/SysProfileController.java | 57 +-- .../src/main/resources/application-druid.yml | 2 +- ff-admin/src/main/resources/application.yml | 21 +- .../main/resources/i18n/messages.properties | 3 + .../mapper/common/CurrencyMapper.xml | 257 +++++++++---- .../resources/mapper/common/LangMapper.xml | 4 +- .../mapper/common/TenantAgentMapper.xml | 4 +- .../common/TenantGameQuotaFlowMapper.xml | 4 +- .../mapper/common/TenantGameQuotaMapper.xml | 4 +- .../common/TenantQuotaExchangeMapper.xml | 4 +- .../mapper/common/TenantSecretKeyMapper.xml | 63 +++- .../mapper/game/GameBettingDetailsMapper.xml | 8 +- .../mapper/game/GameExchangeMoneyMapper.xml | 4 +- .../mapper/game/GameFreeRecordMapper.xml | 4 +- .../main/resources/mapper/game/GameMapper.xml | 4 +- .../mapper/game/GamePlatformMapper.xml | 4 +- .../mapper/game/GameSecretKeyMapper.xml | 4 +- .../resources/mapper/member/MemberMapper.xml | 4 +- ff-base/pom.xml | 6 + .../com/ff/base/config/IdGeneratorUtil.java | 34 -- .../com/ff/base/config/SecurityConfig.java | 21 +- .../java/com/ff/base/constant/Constants.java | 10 + .../ff/base/core/domain/model/LoginBody.java | 5 + .../ff/base/core/domain/model/LoginUser.java | 10 - .../java/com/ff/base/enums/LoginType.java | 35 ++ .../com/ff/base/system/domain/SysUser.java | 338 +++++------------- .../base/system}/domain/TenantSecretKey.java | 25 +- .../base/system/dto/TenantSecretKeyDTO.java | 27 ++ .../ff/base/system/mapper/SysMenuMapper.java | 6 +- .../ff/base/system/mapper/SysRoleMapper.java | 10 + .../ff/base/system/mapper/SysUserMapper.java | 7 +- .../system}/mapper/TenantSecretKeyMapper.java | 14 +- .../base/system/service/ISysMenuService.java | 5 +- .../base/system/service/ISysRoleService.java | 8 + .../base/system/service/ISysUserService.java | 9 +- .../service/ITenantSecretKeyService.java | 26 +- .../service/impl/SysConfigServiceImpl.java | 2 + .../impl/SysDatasourceServiceImpl.java | 2 + .../service/impl/SysDeptServiceImpl.java | 2 + .../service/impl/SysDictDataServiceImpl.java | 2 + .../service/impl/SysDictTypeServiceImpl.java | 2 + .../impl/SysLogininforServiceImpl.java | 2 + .../service/impl/SysMenuServiceImpl.java | 10 +- .../service/impl/SysOperLogServiceImpl.java | 2 + .../service/impl/SysPostServiceImpl.java | 2 + .../service/impl/SysRoleServiceImpl.java | 13 + .../service/impl/SysUserServiceImpl.java | 12 +- .../impl/TenantSecretKeyServiceImpl.java | 206 +++++++++++ .../java/com/ff/base/utils/SecurityUtils.java | 29 +- .../ff/base/utils/SnowflakeIdGenerator.java | 73 ---- .../ff/base/utils/file/FileUploadUtils.java | 4 +- .../web/service/MemberDetailsServiceImpl.java | 59 --- .../ff/base/web/service/SysLoginService.java | 11 +- .../base/web/service/SysPasswordService.java | 8 +- .../web/service/TenantDetailsServiceImpl.java | 97 +++++ .../web/service/UserDetailsServiceImpl.java | 4 +- .../mapper/system/SysConfigMapper.xml | 2 + .../mapper/system/SysDictDataMapper.xml | 2 + .../mapper/system/SysDictTypeMapper.xml | 2 + .../mapper/system/SysLogininforMapper.xml | 4 +- .../resources/mapper/system/SysMenuMapper.xml | 10 +- .../mapper/system/SysOperLogMapper.xml | 4 +- .../resources/mapper/system/SysRoleMapper.xml | 17 + .../resources/mapper/system/SysUserMapper.xml | 22 +- 99 files changed, 1348 insertions(+), 1013 deletions(-) create mode 100644 ff-admin/src/main/java/com/ff/agent/contoller/AgentController.java create mode 100644 ff-admin/src/main/java/com/ff/agent/dto/AgentTenantSecretKeyDTO.java create mode 100644 ff-admin/src/main/java/com/ff/agent/request/AgentCreateTenantRequest.java delete mode 100644 ff-admin/src/main/java/com/ff/api/controller/ApiAgentController.java delete mode 100644 ff-admin/src/main/java/com/ff/api/request/AgentCreateTenant.java delete mode 100644 ff-admin/src/main/java/com/ff/common/service/impl/TenantSecretKeyServiceImpl.java delete mode 100644 ff-base/src/main/java/com/ff/base/config/IdGeneratorUtil.java create mode 100644 ff-base/src/main/java/com/ff/base/enums/LoginType.java rename {ff-admin/src/main/java/com/ff/common => ff-base/src/main/java/com/ff/base/system}/domain/TenantSecretKey.java (75%) create mode 100644 ff-base/src/main/java/com/ff/base/system/dto/TenantSecretKeyDTO.java rename {ff-admin/src/main/java/com/ff/common => ff-base/src/main/java/com/ff/base/system}/mapper/TenantSecretKeyMapper.java (79%) rename {ff-admin/src/main/java/com/ff/common => ff-base/src/main/java/com/ff/base/system}/service/ITenantSecretKeyService.java (73%) create mode 100644 ff-base/src/main/java/com/ff/base/system/service/impl/TenantSecretKeyServiceImpl.java delete mode 100644 ff-base/src/main/java/com/ff/base/utils/SnowflakeIdGenerator.java delete mode 100644 ff-base/src/main/java/com/ff/base/web/service/MemberDetailsServiceImpl.java create mode 100644 ff-base/src/main/java/com/ff/base/web/service/TenantDetailsServiceImpl.java diff --git a/ff-admin/pom.xml b/ff-admin/pom.xml index 94f85f1..c742d67 100644 --- a/ff-admin/pom.xml +++ b/ff-admin/pom.xml @@ -87,11 +87,8 @@ socket.io-client 1.0.0 - - com.dtflys.forest - forest-spring-boot-starter - 1.6.3 - + + diff --git a/ff-admin/src/main/java/com/ff/FFApplication.java b/ff-admin/src/main/java/com/ff/FFApplication.java index 3a511ff..a4bc75d 100644 --- a/ff-admin/src/main/java/com/ff/FFApplication.java +++ b/ff-admin/src/main/java/com/ff/FFApplication.java @@ -1,6 +1,5 @@ package com.ff; -import com.ff.base.config.IdGeneratorUtil; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; @@ -22,10 +21,9 @@ import org.springframework.security.authentication.dao.DaoAuthenticationProvider @MapperScan({"com.ff.base.system.mapper","com.ff.quartz.mapper","com.ff.gen.mapper"}) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DaoAuthenticationProvider.class)}) @EnableAsync -public class FFApplication implements CommandLineRunner +public class FFApplication { - @Autowired - private IdGeneratorUtil idGeneratorUtil; + public static void main(String[] args) @@ -37,8 +35,5 @@ public class FFApplication implements CommandLineRunner } - @Override - public void run(String... args) throws Exception { - idGeneratorUtil.init(); - } + } diff --git a/ff-admin/src/main/java/com/ff/agent/contoller/AgentController.java b/ff-admin/src/main/java/com/ff/agent/contoller/AgentController.java new file mode 100644 index 0000000..2392825 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/agent/contoller/AgentController.java @@ -0,0 +1,124 @@ +package com.ff.agent.contoller; + + +import cn.hutool.core.util.IdUtil; +import com.ff.agent.dto.AgentTenantSecretKeyDTO; +import com.ff.agent.request.AgentCreateTenantRequest; +import com.ff.base.core.controller.BaseController; +import com.ff.base.core.domain.AjaxResult; +import com.ff.base.core.page.TableDataInfo; +import com.ff.base.system.dto.TenantSecretKeyDTO; +import com.ff.base.system.service.ISysDeptService; +import com.ff.base.system.service.ISysRoleService; +import com.ff.base.system.service.ISysUserService; +import com.ff.base.utils.MessageUtils; +import com.ff.base.utils.SecurityUtils; +import com.ff.base.utils.bean.BeanUtils; +import com.ff.base.utils.uuid.IdUtils; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.common.service.ITenantGameQuotaService; +import com.ff.base.system.service.ITenantSecretKeyService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * api控制器 + * + * @author shi + * @date 2025/02/10 + */ +@RestController +@RequestMapping("/agent/tenant") +@Slf4j +public class AgentController extends BaseController { + + + @Resource + private ITenantSecretKeyService tenantSecretKeyService; + + @Resource + private ITenantGameQuotaService tenantGameQuotaService; + + @Resource + private ISysRoleService roleService; + + @Resource + private ISysDeptService deptService; + + @Resource + private ISysUserService userService; + + + /** + * 列表 + * + * @param tenantSecretKeyDTO 租户密钥 + * @return {@link TableDataInfo } + */ + @GetMapping("/list") + @Transactional + @PreAuthorize("@ss.hasPermi('agent:tenant:list')") + public TableDataInfo list(TenantSecretKeyDTO tenantSecretKeyDTO) { + startPage(); + tenantSecretKeyDTO.setAgentId(getUserId()); + List tenantSecretKeys = tenantSecretKeyService.selectTenantSecretKeyDTOList(tenantSecretKeyDTO); + TableDataInfo dataTable = getDataTable(tenantSecretKeys); + List list=new ArrayList<>(); + for (TenantSecretKey row : (List) dataTable.getRows()) { + AgentTenantSecretKeyDTO agentTenantSecretKeyDTO=new AgentTenantSecretKeyDTO(); + BeanUtils.copyProperties(row, agentTenantSecretKeyDTO); + list.add(agentTenantSecretKeyDTO); + } + dataTable.setRows(list); + + return dataTable; + } + + + /** + * 信息 + * + * @return {@link AjaxResult } + */ + @PostMapping("/create") + @Transactional + @PreAuthorize("@ss.hasPermi('agent:tenant:create')") + public AjaxResult createTenant(@Validated @RequestBody AgentCreateTenantRequest agentCreateTenantRequest) { + + Assert.isTrue(CollectionUtils.isEmpty(tenantSecretKeyService.selectTenantSecretKeyList(TenantSecretKey.builder() + .tenantKey(agentCreateTenantRequest.getAccount()) + .build())), MessageUtils.message("operation.tenant.account.already.used")); + + Assert.isTrue(agentCreateTenantRequest.getPassword().equals(agentCreateTenantRequest.getConfirmPassword()),MessageUtils.message("operation.password.mismatch")); + //创建租户 + TenantSecretKey tenantSecretKey = new TenantSecretKey(); + tenantSecretKey.setAgentId(getUserId()); + tenantSecretKey.setTenantKey(agentCreateTenantRequest.getAccount()); + tenantSecretKey.setPassword(SecurityUtils.encryptPassword(agentCreateTenantRequest.getPassword())); + tenantSecretKey.setTenantSn(tenantSecretKeyService.generateTenantSn()); + tenantSecretKey.setTenantSecret(IdUtils.simpleUUID()); + tenantSecretKey.setDepositRatio(agentCreateTenantRequest.getDepositRatio()); + tenantSecretKey.setTenantType(agentCreateTenantRequest.getTenantType()); + tenantSecretKey.setCreateBy(getUsername()); + tenantSecretKey.setTenantStatus(Boolean.TRUE); + int insertedTenantSecretKey = tenantSecretKeyService.insertTenantSecretKey(tenantSecretKey); + + + return toAjax(insertedTenantSecretKey); + } + + + + + + +} diff --git a/ff-admin/src/main/java/com/ff/agent/dto/AgentTenantSecretKeyDTO.java b/ff-admin/src/main/java/com/ff/agent/dto/AgentTenantSecretKeyDTO.java new file mode 100644 index 0000000..277cfe5 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/agent/dto/AgentTenantSecretKeyDTO.java @@ -0,0 +1,89 @@ +package com.ff.agent.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ff.base.annotation.Excel; +import com.ff.base.core.domain.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 用户租户密钥对象 ff_tenant_secret_key + * + * @author shi + * @date 2025-02-20 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AgentTenantSecretKeyDTO extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键id */ + private Long id; + + + + + /** 密码 */ + @Excel(name = "密码") + @JsonIgnore + private String password; + + /** 最后登录ip */ + @Excel(name = "最后登录ip") + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间") + private Long loginData; + + + + /** 租户key */ + @Excel(name = "租户key") + private String tenantKey; + + /** 代理id */ + @Excel(name = "代理id") + private Long agentId; + + + + /** 商户后缀 */ + @Excel(name = "商户后缀") + @JsonIgnore + private String tenantSn; + + /** 租户密钥 */ + @Excel(name = "租户密钥") + @JsonIgnore + private String tenantSecret; + + /** 租户状态 1正常 0停用 */ + @Excel(name = "租户状态 1正常 0停用") + private Boolean tenantStatus; + + /** 额度类型 TenantQuotaType 枚举 */ + @Excel(name = "额度类型 TenantQuotaType 枚举") + private Integer quotaType; + + /** 买分比例 */ + @Excel(name = "买分比例") + private BigDecimal scoreRatio; + + /** 租户类型 TenantType 枚举 */ + @Excel(name = "租户类型 TenantType 枚举") + private Integer tenantType; + + /** 透支比例 */ + @Excel(name = "透支比例") + private BigDecimal depositRatio; + + +} diff --git a/ff-admin/src/main/java/com/ff/agent/request/AgentCreateTenantRequest.java b/ff-admin/src/main/java/com/ff/agent/request/AgentCreateTenantRequest.java new file mode 100644 index 0000000..bc5f6d7 --- /dev/null +++ b/ff-admin/src/main/java/com/ff/agent/request/AgentCreateTenantRequest.java @@ -0,0 +1,58 @@ +package com.ff.agent.request; + + +import com.ff.base.xss.Xss; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 代理创建租户 + * + * @author shi + * @date 2025/02/20 + */ +@Data +public class AgentCreateTenantRequest implements Serializable { + private static final long serialVersionUID = -5561068216486978354L; + + + /** + * 账户 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 2, max = 30, message = "用户账号长度不能超过30个字符") + private String account; + /** + * 密码 + */ + @NotBlank(message = "密码不能为空") + @Size(min = 5, max = 20, message = "密码长度不能超过25个字符") + private String password; + /** + * 确认密码 + */ + @NotBlank(message = "确认密码不能为空") + @Size(min = 5, max = 20, message = "密码长度不能超过25个字符") + private String confirmPassword; + + + /** 租户类型 TenantType 枚举 */ + @NotNull(message = "租户类型不能为空") + private Integer tenantType; + + /** 信誉额度*/ + private BigDecimal realBalance; + + /** 透支比例 */ + private BigDecimal depositRatio; + + + + +} diff --git a/ff-admin/src/main/java/com/ff/annotation/HeaderCheckAspect.java b/ff-admin/src/main/java/com/ff/annotation/HeaderCheckAspect.java index a1ce566..b6f05d6 100644 --- a/ff-admin/src/main/java/com/ff/annotation/HeaderCheckAspect.java +++ b/ff-admin/src/main/java/com/ff/annotation/HeaderCheckAspect.java @@ -3,8 +3,8 @@ package com.ff.annotation; import com.ff.base.constant.Constants; import com.ff.config.KeyConfig; import com.ff.base.utils.sign.Md5Utils; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.service.ITenantSecretKeyService; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.service.ITenantSecretKeyService; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; diff --git a/ff-admin/src/main/java/com/ff/api/controller/ApiAgentController.java b/ff-admin/src/main/java/com/ff/api/controller/ApiAgentController.java deleted file mode 100644 index 93abc61..0000000 --- a/ff-admin/src/main/java/com/ff/api/controller/ApiAgentController.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.ff.api.controller; - - -import com.ff.annotation.CheckHeader; -import com.ff.api.response.TenantInfoResponse; -import com.ff.base.constant.Constants; -import com.ff.base.core.controller.BaseController; -import com.ff.base.core.domain.AjaxResult; -import com.ff.base.enums.QuotaType; -import com.ff.base.system.service.ISysDeptService; -import com.ff.base.system.service.ISysRoleService; -import com.ff.base.utils.SecurityUtils; -import com.ff.base.utils.StringUtils; -import com.ff.base.utils.bean.BeanUtils; -import com.ff.common.domain.TenantGameQuota; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.service.ITenantGameQuotaService; -import com.ff.common.service.ITenantSecretKeyService; -import com.ff.config.KeyConfig; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * api控制器 - * - * @author shi - * @date 2025/02/10 - */ -@RestController -@CheckHeader -@RequestMapping("/api/agent") -@Slf4j -public class ApiAgentController extends BaseController { - - - @Resource - private ITenantSecretKeyService tenantSecretKeyService; - - - @Resource - private ISysRoleService roleService; - - @Resource - private ISysDeptService deptService; - -// -// /** -// * 信息 -// * -// * @return {@link AjaxResult } -// */ -// @PostMapping("/create/tenant") -// public AjaxResult createTenant(TenantSecretKey tenantSecretKey) { -// roleService.selectRoleList(tenantSecretKey) -// if (!userService.checkUserNameUnique(user)) -// { -// return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); -// } -// else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) -// { -// return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); -// } -// else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) -// { -// return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); -// } -// user.setCreateBy(getUsername()); -// user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); -// return toAjax(userService.insertUser(user)); -// -// tenantSecretKey.setAgentId(getUserId()); -// tenantSecretKeyService.insertTenantSecretKey(tenantSecretKey); -// return AjaxResult.success(tenantInfoResponse); -// } - -} diff --git a/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java index 1292148..fe5c4af 100644 --- a/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-admin/src/main/java/com/ff/api/controller/ApiGameController.java @@ -12,12 +12,9 @@ import com.ff.base.core.page.TableDataInfo; import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; -import com.ff.base.utils.QuotaUtils; import com.ff.base.utils.StringUtils; import com.ff.base.utils.bean.BeanUtils; -import com.ff.common.domain.TenantGameQuotaFlow; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.dto.BalanceChangesDTO; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.common.dto.GameBalanceExchange; import com.ff.common.service.ITenantGameQuotaFlowService; import com.ff.common.service.ITenantGameQuotaService; diff --git a/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java b/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java index ed5bd78..05d2925 100644 --- a/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java +++ b/ff-admin/src/main/java/com/ff/api/controller/ApiMemberController.java @@ -1,7 +1,6 @@ package com.ff.api.controller; -import cn.hutool.core.bean.BeanUtil; import com.ff.annotation.CheckHeader; import com.ff.api.request.MemberCreateApiRequest; import com.ff.api.request.MemberInfoAllApiRequest; @@ -14,9 +13,8 @@ import com.ff.base.core.domain.AjaxResult; import com.ff.base.enums.ErrorCode; import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; -import com.ff.base.manager.AsyncManager; import com.ff.base.utils.StringUtils; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.request.*; @@ -42,7 +40,6 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; @@ -99,14 +96,7 @@ public class ApiMemberController extends BaseController { ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); String gameAccount = StringUtils.addSuffix(memberCreateApiRequest.getAccount(), memberCreateApiRequest.getCurrencyCode() + tenantSecretKey.getTenantSn()); - //向第三方注册账号 - CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder() - .account(gameAccount) - .agentId(gameSecretKey.getCode()) - .agentKey(gameSecretKey.getKey()) - .build(); - Boolean result = iGamesService.createMember(gamesBaseRequestDTO); - Assert.isTrue(result, "建立游戏账号失败"); + List members = memberService.selectMemberList(Member.builder() .tenantKey(tenantSecretKey.getTenantKey()).gameAccount(gameAccount).build()); @@ -119,8 +109,17 @@ public class ApiMemberController extends BaseController { .platformCode(memberCreateApiRequest.getPlatformCode()) .currencyCode(memberCreateApiRequest.getCurrencyCode()) .build(); - return toAjax(memberService.insertMember(member)); + int insertMember = memberService.insertMember(member); + Assert.isTrue(insertMember>0, "建立游戏账号失败"); } + //向第三方注册账号 + CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder() + .account(gameAccount) + .agentId(gameSecretKey.getCode()) + .agentKey(gameSecretKey.getKey()) + .build(); + Boolean result = iGamesService.createMember(gamesBaseRequestDTO); + Assert.isTrue(result, "建立游戏账号失败"); return toAjax(Boolean.TRUE); } @@ -152,8 +151,8 @@ public class ApiMemberController extends BaseController { .agentKey(gameSecretKey.getKey()) .build(); MemberInfoResponseDTO memberInfo = iGamesService.getMemberInfo(gamesBaseRequestDTO); - MemberInfoResponse memberInfoResponse=new MemberInfoResponse(); - BeanUtils.copyProperties(memberInfo,memberInfoResponse); + MemberInfoResponse memberInfoResponse = new MemberInfoResponse(); + BeanUtils.copyProperties(memberInfo, memberInfoResponse); return AjaxResult.success(memberInfoResponse); } @@ -226,6 +225,4 @@ public class ApiMemberController extends BaseController { } - - } diff --git a/ff-admin/src/main/java/com/ff/api/controller/ApiTenantController.java b/ff-admin/src/main/java/com/ff/api/controller/ApiTenantController.java index e7f4cae..c9d245c 100644 --- a/ff-admin/src/main/java/com/ff/api/controller/ApiTenantController.java +++ b/ff-admin/src/main/java/com/ff/api/controller/ApiTenantController.java @@ -8,7 +8,7 @@ import com.ff.base.core.domain.AjaxResult; import com.ff.base.enums.QuotaType; import com.ff.base.utils.bean.BeanUtils; import com.ff.common.domain.TenantGameQuota; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; import lombok.extern.slf4j.Slf4j; diff --git a/ff-admin/src/main/java/com/ff/api/request/AgentCreateTenant.java b/ff-admin/src/main/java/com/ff/api/request/AgentCreateTenant.java deleted file mode 100644 index 8a8ffe6..0000000 --- a/ff-admin/src/main/java/com/ff/api/request/AgentCreateTenant.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ff.api.request; - - -import com.ff.base.annotation.Excel; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 代理创建租户 - * - * @author shi - * @date 2025/02/20 - */ -@Data -public class AgentCreateTenant implements Serializable { - private static final long serialVersionUID = -5561068216486978354L; - - - /** - * 账户 - */ - private String account; - /** - * 密码 - */ - private String password; - /** - * 确认密码 - */ - private String confirmPassword; - - /** 额度类型 TenantQuotaType 枚举 */ - private Integer quotaType; - - /** 买分比例 */ - @Excel(name = "买分比例") - private BigDecimal scoreRatio; - - /** 租户类型 TenantType 枚举 */ - private Integer tenantType; - - /** 透支比例 */ - private BigDecimal depositRatio; -} diff --git a/ff-admin/src/main/java/com/ff/common/controller/TenantSecretKeyController.java b/ff-admin/src/main/java/com/ff/common/controller/TenantSecretKeyController.java index 5d60d8a..5e5b7b8 100644 --- a/ff-admin/src/main/java/com/ff/common/controller/TenantSecretKeyController.java +++ b/ff-admin/src/main/java/com/ff/common/controller/TenantSecretKeyController.java @@ -16,8 +16,8 @@ import com.ff.base.annotation.Log; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; import com.ff.base.enums.BusinessType; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.service.ITenantSecretKeyService; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.base.utils.poi.ExcelUtil; import com.ff.base.core.page.TableDataInfo; diff --git a/ff-admin/src/main/java/com/ff/common/domain/TenantGameQuota.java b/ff-admin/src/main/java/com/ff/common/domain/TenantGameQuota.java index d1fcda1..764e1de 100644 --- a/ff-admin/src/main/java/com/ff/common/domain/TenantGameQuota.java +++ b/ff-admin/src/main/java/com/ff/common/domain/TenantGameQuota.java @@ -1,6 +1,8 @@ package com.ff.common.domain; import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableId; import com.ff.base.annotation.Excel; import com.ff.base.core.domain.BaseEntity; import lombok.AllArgsConstructor; @@ -23,6 +25,7 @@ public class TenantGameQuota extends BaseEntity private static final long serialVersionUID = 1L; /** 主键id */ + private Long id; /** 租户key */ diff --git a/ff-admin/src/main/java/com/ff/common/service/impl/CurrencyServiceImpl.java b/ff-admin/src/main/java/com/ff/common/service/impl/CurrencyServiceImpl.java index 45acbf0..545bf81 100644 --- a/ff-admin/src/main/java/com/ff/common/service/impl/CurrencyServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/common/service/impl/CurrencyServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.common.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,6 +55,7 @@ public class CurrencyServiceImpl implements ICurrencyService @Override public int insertCurrency(Currency currency) { + currency.setId(IdUtil.getSnowflakeNextId()); currency.setCreateTime(DateUtils.getNowDate()); return currencyMapper.insertCurrency(currency); } diff --git a/ff-admin/src/main/java/com/ff/common/service/impl/LangServiceImpl.java b/ff-admin/src/main/java/com/ff/common/service/impl/LangServiceImpl.java index 28b62b6..3e78305 100644 --- a/ff-admin/src/main/java/com/ff/common/service/impl/LangServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/common/service/impl/LangServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.common.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,6 +55,7 @@ public class LangServiceImpl implements ILangService @Override public int insertLang(Lang lang) { + lang.setId(IdUtil.getSnowflakeNextId()); lang.setCreateTime(DateUtils.getNowDate()); return langMapper.insertLang(lang); } diff --git a/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaFlowServiceImpl.java b/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaFlowServiceImpl.java index 884d714..4c4f790 100644 --- a/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaFlowServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaFlowServiceImpl.java @@ -3,6 +3,7 @@ package com.ff.common.service.impl; import java.math.BigDecimal; import java.util.List; +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -51,6 +52,7 @@ public class TenantGameQuotaFlowServiceImpl implements ITenantGameQuotaFlowServi */ @Override public int insertTenantGameQuotaFlow(TenantGameQuotaFlow tenantGameQuotaFlow) { + tenantGameQuotaFlow.setId(IdUtil.getSnowflakeNextId()); tenantGameQuotaFlow.setCreateTime(DateUtils.getNowDate()); return tenantGameQuotaFlowMapper.insertTenantGameQuotaFlow(tenantGameQuotaFlow); } diff --git a/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java b/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java index e731a55..1883275 100644 --- a/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java @@ -5,23 +5,23 @@ import java.math.RoundingMode; import java.util.List; import java.util.Map; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import com.ff.base.constant.Constants; import com.ff.base.enums.*; import com.ff.base.exception.base.ApiException; import com.ff.base.utils.DateUtils; -import com.ff.base.utils.NumberUtils; import com.ff.base.utils.QuotaUtils; import com.ff.base.utils.StringUtils; import com.ff.common.domain.TenantGameQuotaFlow; import com.ff.common.domain.TenantQuotaExchange; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.common.dto.BalanceChangesDTO; import com.ff.common.dto.BalanceRealChangesDTO; import com.ff.common.dto.GameBalanceExchange; import com.ff.common.service.ITenantGameQuotaFlowService; import com.ff.common.service.ITenantQuotaExchangeService; -import com.ff.common.service.ITenantSecretKeyService; +import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.game.api.IGamesService; import com.ff.game.api.request.MemberInfoRequestDTO; import com.ff.game.domain.GameSecretKey; @@ -34,7 +34,6 @@ import com.ff.common.mapper.TenantGameQuotaMapper; import com.ff.common.domain.TenantGameQuota; import com.ff.common.service.ITenantGameQuotaService; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import javax.annotation.Resource; @@ -105,6 +104,7 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService { */ @Override public int insertTenantGameQuota(TenantGameQuota tenantGameQuota) { + tenantGameQuota.setId(IdUtil.getSnowflakeNextId()); tenantGameQuota.setCreateTime(DateUtils.getNowDate()); return tenantGameQuotaMapper.insertTenantGameQuota(tenantGameQuota); } diff --git a/ff-admin/src/main/java/com/ff/common/service/impl/TenantQuotaExchangeServiceImpl.java b/ff-admin/src/main/java/com/ff/common/service/impl/TenantQuotaExchangeServiceImpl.java index ddc8126..9cf1743 100644 --- a/ff-admin/src/main/java/com/ff/common/service/impl/TenantQuotaExchangeServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/common/service/impl/TenantQuotaExchangeServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.common.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -65,6 +67,7 @@ public class TenantQuotaExchangeServiceImpl implements ITenantQuotaExchangeServi @Override public int insertTenantQuotaExchange(TenantQuotaExchange tenantQuotaExchange) { + tenantQuotaExchange.setId(IdUtil.getSnowflakeNextId()); tenantQuotaExchange.setCreateTime(DateUtils.getNowDate()); return tenantQuotaExchangeMapper.insertTenantQuotaExchange(tenantQuotaExchange); } diff --git a/ff-admin/src/main/java/com/ff/common/service/impl/TenantSecretKeyServiceImpl.java b/ff-admin/src/main/java/com/ff/common/service/impl/TenantSecretKeyServiceImpl.java deleted file mode 100644 index 657e581..0000000 --- a/ff-admin/src/main/java/com/ff/common/service/impl/TenantSecretKeyServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.ff.common.service.impl; - -import java.util.List; -import com.ff.base.utils.DateUtils; -import com.ff.base.utils.NumberUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ff.common.mapper.TenantSecretKeyMapper; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.service.ITenantSecretKeyService; -import org.springframework.util.CollectionUtils; - -/** - * 用户租户密钥Service业务层处理 - * - * @author shi - * @date 2025-02-11 - */ -@Service -public class TenantSecretKeyServiceImpl implements ITenantSecretKeyService -{ - @Autowired - private TenantSecretKeyMapper tenantSecretKeyMapper; - - /** - * 查询用户租户密钥 - * - * @param id 用户租户密钥主键 - * @return 用户租户密钥 - */ - @Override - public TenantSecretKey selectTenantSecretKeyById(Long id) - { - return tenantSecretKeyMapper.selectTenantSecretKeyById(id); - } - - - /** - * 生成租户sn - * - * @return {@link String } - */ - @Override - public synchronized String generateTenantSn() { - String sn = NumberUtils.generateRandomCode(); - while (!CollectionUtils.isEmpty(tenantSecretKeyMapper.selectTenantSecretKeyList(TenantSecretKey.builder() - .tenantSn(sn) - .build()))) { - sn = NumberUtils.generateRandomCode(); - } - return sn; - } - - /** - * 按租户密钥选择租户密钥 - * - * @param tenantKey 租户密钥 - * @return {@link TenantSecretKey } - */ - @Override - public TenantSecretKey selectTenantSecretKeyByTenantKey(String tenantKey) { - return tenantSecretKeyMapper.selectTenantSecretKeyByTenantKey(tenantKey); - } - - /** - * 查询用户租户密钥列表 - * - * @param tenantSecretKey 用户租户密钥 - * @return 用户租户密钥 - */ - @Override - public List selectTenantSecretKeyList(TenantSecretKey tenantSecretKey) - { - return tenantSecretKeyMapper.selectTenantSecretKeyList(tenantSecretKey); - } - - /** - * 新增用户租户密钥 - * - * @param tenantSecretKey 用户租户密钥 - * @return 结果 - */ - @Override - public int insertTenantSecretKey(TenantSecretKey tenantSecretKey) - { - tenantSecretKey.setCreateTime(DateUtils.getNowDate()); - return tenantSecretKeyMapper.insertTenantSecretKey(tenantSecretKey); - } - - /** - * 修改用户租户密钥 - * - * @param tenantSecretKey 用户租户密钥 - * @return 结果 - */ - @Override - public int updateTenantSecretKey(TenantSecretKey tenantSecretKey) - { - tenantSecretKey.setUpdateTime(DateUtils.getNowDate()); - return tenantSecretKeyMapper.updateTenantSecretKey(tenantSecretKey); - } - - /** - * 批量删除用户租户密钥 - * - * @param ids 需要删除的用户租户密钥主键 - * @return 结果 - */ - @Override - public int deleteTenantSecretKeyByIds(Long[] ids) - { - return tenantSecretKeyMapper.deleteTenantSecretKeyByIds(ids); - } - - /** - * 删除用户租户密钥信息 - * - * @param id 用户租户密钥主键 - * @return 结果 - */ - @Override - public int deleteTenantSecretKeyById(Long id) - { - return tenantSecretKeyMapper.deleteTenantSecretKeyById(id); - } -} diff --git a/ff-admin/src/main/java/com/ff/config/KeyConfig.java b/ff-admin/src/main/java/com/ff/config/KeyConfig.java index 287b8eb..bdf7724 100644 --- a/ff-admin/src/main/java/com/ff/config/KeyConfig.java +++ b/ff-admin/src/main/java/com/ff/config/KeyConfig.java @@ -1,6 +1,6 @@ package com.ff.config; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; import org.springframework.stereotype.Component; /** diff --git a/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java b/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java index e8368a6..94e3f85 100644 --- a/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java @@ -1,7 +1,6 @@ package com.ff.game.api.jili.service.impl; import cn.hutool.core.util.NumberUtil; -import com.alibaba.fastjson2.JSON; import com.ff.base.constant.CacheConstants; import com.ff.base.constant.Constants; import com.ff.base.core.redis.RedisCache; @@ -10,16 +9,9 @@ import com.ff.base.exception.base.ApiException; import com.ff.base.exception.base.BaseException; import com.ff.base.system.service.ISysConfigService; import com.ff.base.utils.DateUtils; -import com.ff.base.utils.JsonUtil; -import com.ff.base.utils.MessageUtils; import com.ff.base.utils.StringUtils; -import com.ff.base.utils.http.HttpClientSslUtils; -import com.ff.base.utils.http.HttpUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.dto.BalanceChangesDTO; -import com.ff.common.service.ITenantGameQuotaService; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.jili.client.JILIClient; @@ -30,7 +22,6 @@ import com.ff.game.service.*; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import lombok.extern.slf4j.Slf4j; -import org.apache.http.entity.ContentType; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; diff --git a/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java b/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java index e9a74f0..238ff5e 100644 --- a/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java @@ -1,7 +1,6 @@ package com.ff.game.api.xk.service.impl; import cn.hutool.core.util.NumberUtil; -import com.alibaba.fastjson2.JSON; import com.ff.base.constant.CacheConstants; import com.ff.base.constant.Constants; import com.ff.base.core.redis.RedisCache; @@ -15,11 +14,8 @@ import com.ff.base.system.service.ISysConfigService; import com.ff.base.utils.DateUtils; import com.ff.base.utils.JsonUtil; import com.ff.base.utils.MessageUtils; -import com.ff.base.utils.StringUtils; -import com.ff.base.utils.http.HttpClientSslUtils; import com.ff.base.utils.sign.Md5Utils; import com.ff.base.utils.uuid.IdUtils; -import com.ff.common.domain.TenantSecretKey; import com.ff.config.KeyConfig; import com.ff.game.api.IGamesService; import com.ff.game.api.request.*; diff --git a/ff-admin/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java b/ff-admin/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java index 1f88f31..e317992 100644 --- a/ff-admin/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java +++ b/ff-admin/src/main/java/com/ff/game/mapper/GameSecretKeyMapper.java @@ -2,7 +2,7 @@ package com.ff.game.mapper; import java.util.List; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; import com.ff.game.domain.GameSecretKey; import org.apache.ibatis.annotations.Param; diff --git a/ff-admin/src/main/java/com/ff/game/service/IGameSecretKeyService.java b/ff-admin/src/main/java/com/ff/game/service/IGameSecretKeyService.java index 2260294..0b9e1f9 100644 --- a/ff-admin/src/main/java/com/ff/game/service/IGameSecretKeyService.java +++ b/ff-admin/src/main/java/com/ff/game/service/IGameSecretKeyService.java @@ -2,7 +2,6 @@ package com.ff.game.service; import java.util.List; -import com.ff.common.domain.TenantSecretKey; import com.ff.game.domain.GameSecretKey; /** diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java index f84ab07..6d6fba7 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GameBettingDetailsServiceImpl.java @@ -2,6 +2,8 @@ package com.ff.game.service.impl; import java.util.Collections; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -65,6 +67,7 @@ public class GameBettingDetailsServiceImpl implements IGameBettingDetailsService @Override public int insertGameBettingDetails(GameBettingDetails gameBettingDetails) { + gameBettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.setCreateTime(DateUtils.getNowDate()); return gameBettingDetailsMapper.insertGameBettingDetails(gameBettingDetails); } diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java index dc6559f..dc6d391 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GameExchangeMoneyServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.game.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,6 +55,7 @@ public class GameExchangeMoneyServiceImpl implements IGameExchangeMoneyService @Override public int insertGameExchangeMoney(GameExchangeMoney gameExchangeMoney) { + gameExchangeMoney.setId(IdUtil.getSnowflakeNextId()); gameExchangeMoney.setCreateTime(DateUtils.getNowDate()); return gameExchangeMoneyMapper.insertGameExchangeMoney(gameExchangeMoney); } diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GameFreeRecordServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GameFreeRecordServiceImpl.java index 039bc1e..7a710cf 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GameFreeRecordServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GameFreeRecordServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.game.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,6 +55,7 @@ public class GameFreeRecordServiceImpl implements IGameFreeRecordService @Override public int insertGameFreeRecord(GameFreeRecord gameFreeRecord) { + gameFreeRecord.setId(IdUtil.getSnowflakeNextId()); gameFreeRecord.setCreateTime(DateUtils.getNowDate()); return gameFreeRecordMapper.insertGameFreeRecord(gameFreeRecord); } diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java index 00471e3..671e83a 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GamePlatformServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.game.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,6 +55,7 @@ public class GamePlatformServiceImpl implements IGamePlatformService @Override public int insertGamePlatform(GamePlatform gamePlatform) { + gamePlatform.setId(IdUtil.getSnowflakeNextId()); gamePlatform.setCreateTime(DateUtils.getNowDate()); return gamePlatformMapper.insertGamePlatform(gamePlatform); } diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java index da84490..396ca36 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GameSecretKeyServiceImpl.java @@ -1,8 +1,9 @@ package com.ff.game.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; -import com.ff.common.domain.TenantSecretKey; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ff.game.mapper.GameSecretKeyMapper; @@ -54,6 +55,7 @@ public class GameSecretKeyServiceImpl implements IGameSecretKeyService @Override public int insertGameSecretKey(GameSecretKey gameSecretKey) { + gameSecretKey.setId(IdUtil.getSnowflakeNextId()); gameSecretKey.setCreateTime(DateUtils.getNowDate()); return gameSecretKeyMapper.insertGameSecretKey(gameSecretKey); } diff --git a/ff-admin/src/main/java/com/ff/game/service/impl/GameServiceImpl.java b/ff-admin/src/main/java/com/ff/game/service/impl/GameServiceImpl.java index a76695c..6083629 100644 --- a/ff-admin/src/main/java/com/ff/game/service/impl/GameServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/game/service/impl/GameServiceImpl.java @@ -3,6 +3,7 @@ package com.ff.game.service.impl; import java.util.Collections; import java.util.List; +import cn.hutool.core.util.IdUtil; import com.ff.api.response.GameResponse; import com.ff.base.constant.ConfigConstants; import com.ff.base.utils.DateUtils; @@ -64,6 +65,7 @@ public class GameServiceImpl implements IGameService @Override public int insertGame(Game game) { + game.setId(IdUtil.getSnowflakeNextId()); game.setCreateTime(DateUtils.getNowDate()); return gameMapper.insertGame(game); } diff --git a/ff-admin/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java b/ff-admin/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java index 5fe8c4e..b6adac7 100644 --- a/ff-admin/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java @@ -1,6 +1,8 @@ package com.ff.member.service.impl; import java.util.List; + +import cn.hutool.core.util.IdUtil; import com.ff.base.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,6 +55,7 @@ public class MemberServiceImpl implements IMemberService @Override public int insertMember(Member member) { + member.setId(IdUtil.getSnowflakeNextId()); member.setCreateTime(DateUtils.getNowDate()); return memberMapper.insertMember(member); } diff --git a/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobLogServiceImpl.java b/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobLogServiceImpl.java index 0b951ec..6964375 100644 --- a/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobLogServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobLogServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.quartz.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.quartz.domain.SysJobLog; import com.ff.quartz.mapper.SysJobLogMapper; import com.ff.quartz.service.ISysJobLogService; @@ -51,6 +52,7 @@ public class SysJobLogServiceImpl implements ISysJobLogService @Override public void addJobLog(SysJobLog jobLog) { + jobLog.setJobLogId(IdUtil.getSnowflakeNextId()); jobLogMapper.insertJobLog(jobLog); } diff --git a/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobServiceImpl.java b/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobServiceImpl.java index 5e14476..d03c360 100644 --- a/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobServiceImpl.java +++ b/ff-admin/src/main/java/com/ff/quartz/service/impl/SysJobServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.quartz.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.constant.ScheduleConstants; import com.ff.base.exception.job.TaskException; import com.ff.quartz.domain.SysJob; @@ -202,6 +203,7 @@ public class SysJobServiceImpl implements ISysJobService @Transactional(rollbackFor = Exception.class) public int insertJob(SysJob job) throws SchedulerException, TaskException { + job.setJobId(IdUtil.getSnowflakeNextId()); job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.insertJob(job); if (rows > 0) diff --git a/ff-admin/src/main/java/com/ff/quartz/task/TenantQuotaTask.java b/ff-admin/src/main/java/com/ff/quartz/task/TenantQuotaTask.java index 5366bbd..7d363c7 100644 --- a/ff-admin/src/main/java/com/ff/quartz/task/TenantQuotaTask.java +++ b/ff-admin/src/main/java/com/ff/quartz/task/TenantQuotaTask.java @@ -5,18 +5,14 @@ import com.ff.base.constant.Constants; import com.ff.base.enums.OperationType; import com.ff.base.enums.QuotaType; import com.ff.base.utils.DateUtils; -import com.ff.common.domain.TenantGameQuota; import com.ff.common.domain.TenantGameQuotaFlow; import com.ff.common.domain.TenantQuotaExchange; -import com.ff.common.domain.TenantSecretKey; -import com.ff.common.dto.BalanceChangesDTO; import com.ff.common.dto.BalanceRealChangesDTO; import com.ff.common.service.ITenantGameQuotaFlowService; import com.ff.common.service.ITenantGameQuotaService; import com.ff.common.service.ITenantQuotaExchangeService; -import com.ff.common.service.ITenantSecretKeyService; +import com.ff.base.system.service.ITenantSecretKeyService; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.formula.functions.T; import org.springframework.stereotype.Component; import javax.annotation.Resource; diff --git a/ff-admin/src/main/java/com/ff/system/SysLoginController.java b/ff-admin/src/main/java/com/ff/system/SysLoginController.java index 5de7522..0786cb6 100644 --- a/ff-admin/src/main/java/com/ff/system/SysLoginController.java +++ b/ff-admin/src/main/java/com/ff/system/SysLoginController.java @@ -3,14 +3,18 @@ package com.ff.system; import com.ff.base.constant.Constants; import com.ff.base.core.domain.AjaxResult; import com.ff.base.core.domain.model.LoginBody; +import com.ff.base.enums.LoginType; import com.ff.base.system.domain.SysMenu; +import com.ff.base.system.domain.SysRole; import com.ff.base.system.domain.SysUser; import com.ff.base.system.service.ISysDatasourceService; import com.ff.base.system.service.ISysMenuService; import com.ff.base.utils.SecurityUtils; import com.ff.base.web.service.SysLoginService; import com.ff.base.web.service.SysPermissionService; +import com.ff.base.system.service.ITenantSecretKeyService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -18,8 +22,10 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * 登录验证 @@ -27,8 +33,7 @@ import java.util.Set; * @author ff */ @RestController -public class SysLoginController -{ +public class SysLoginController { @Autowired private SysLoginService loginService; @@ -39,7 +44,11 @@ public class SysLoginController private SysPermissionService permissionService; @Resource - private ISysDatasourceService datasourceService; + private ISysDatasourceService datasourceService; + + + @Resource + private ITenantSecretKeyService tenantSecretKeyService; /** * 登录方法 @@ -48,12 +57,21 @@ public class SysLoginController * @return 结果 */ @PostMapping("/login") - public AjaxResult login(@RequestBody LoginBody loginBody) - { + public AjaxResult login(@RequestBody LoginBody loginBody) { AjaxResult ajax = AjaxResult.success(); // 生成令牌 - String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), - loginBody.getUuid()); + String token = ""; + // 验证码校验 + // loginService.validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid()); + // 登录前置校验 + loginService.loginPreCheck(loginBody.getUsername(), loginBody.getPassword()); + if (LoginType.TENANT.getValue().equals(loginBody.getLoginType())) { + token = tenantSecretKeyService.login(loginBody.getUsername(), loginBody.getPassword()); + } else { + token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + } + ajax.put(Constants.TOKEN, token); return ajax; } @@ -64,8 +82,7 @@ public class SysLoginController * @return 用户信息 */ @GetMapping("getInfo") - public AjaxResult getInfo(HttpServletRequest request) - { + public AjaxResult getInfo(HttpServletRequest request) { SysUser user = SecurityUtils.getLoginUser().getUser(); // 角色集合 Set roles = permissionService.getRolePermission(user); @@ -90,10 +107,13 @@ public class SysLoginController * @return 路由信息 */ @GetMapping("getRouters") - public AjaxResult getRouters() - { - Long userId = SecurityUtils.getUserId(); - List menus = menuService.selectMenuTreeByUserId(userId); + public AjaxResult getRouters() { + List roleIds = SecurityUtils.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()); + List menus = new ArrayList<>(); + if (!CollectionUtils.isEmpty(roleIds)) { + menus = menuService.selectMenuTree(roleIds); + } + return AjaxResult.success(menuService.buildMenus(menus)); } } diff --git a/ff-admin/src/main/java/com/ff/system/SysProfileController.java b/ff-admin/src/main/java/com/ff/system/SysProfileController.java index 60fbc5d..13d87a3 100644 --- a/ff-admin/src/main/java/com/ff/system/SysProfileController.java +++ b/ff-admin/src/main/java/com/ff/system/SysProfileController.java @@ -4,9 +4,12 @@ import com.ff.base.annotation.Log; import com.ff.base.config.FFConfig; import com.ff.base.core.controller.BaseController; import com.ff.base.core.domain.AjaxResult; +import com.ff.base.enums.LoginType; import com.ff.base.system.domain.SysUser; import com.ff.base.core.domain.model.LoginUser; import com.ff.base.enums.BusinessType; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.service.ITenantSecretKeyService; import com.ff.base.utils.SecurityUtils; import com.ff.base.utils.StringUtils; import com.ff.base.utils.file.FileUploadUtils; @@ -17,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; + /** * 个人信息 业务处理 * @@ -24,20 +29,21 @@ import org.springframework.web.multipart.MultipartFile; */ @RestController @RequestMapping("/system/user/profile") -public class SysProfileController extends BaseController -{ +public class SysProfileController extends BaseController { @Autowired private ISysUserService userService; @Autowired private TokenService tokenService; + @Resource + private ITenantSecretKeyService tenantSecretKeyService; + /** * 个人信息 */ @GetMapping - public AjaxResult profile() - { + public AjaxResult profile() { LoginUser loginUser = getLoginUser(); SysUser user = loginUser.getUser(); AjaxResult ajax = AjaxResult.success(user); @@ -51,24 +57,20 @@ public class SysProfileController extends BaseController */ @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult updateProfile(@RequestBody SysUser user) - { + public AjaxResult updateProfile(@RequestBody SysUser user) { LoginUser loginUser = getLoginUser(); SysUser currentUser = loginUser.getUser(); currentUser.setNickName(user.getNickName()); currentUser.setEmail(user.getEmail()); currentUser.setPhonenumber(user.getPhonenumber()); currentUser.setSex(user.getSex()); - if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) - { + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) { return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在"); } - if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) - { + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) { return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在"); } - if (userService.updateUserProfile(currentUser) > 0) - { + if (userService.updateUserProfile(currentUser) > 0) { // 更新缓存用户信息 tokenService.setLoginUser(loginUser); return success(); @@ -81,22 +83,28 @@ public class SysProfileController extends BaseController */ @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") - public AjaxResult updatePwd(String oldPassword, String newPassword) - { + public AjaxResult updatePwd(String oldPassword, String newPassword) { LoginUser loginUser = getLoginUser(); String userName = loginUser.getUsername(); String password = loginUser.getPassword(); - if (!SecurityUtils.matchesPassword(oldPassword, password)) - { + if (!SecurityUtils.matchesPassword(oldPassword, password)) { return error("修改密码失败,旧密码错误"); } - if (SecurityUtils.matchesPassword(newPassword, password)) - { + if (SecurityUtils.matchesPassword(newPassword, password)) { return error("新密码不能与旧密码相同"); } newPassword = SecurityUtils.encryptPassword(newPassword); - if (userService.resetUserPwd(userName, newPassword) > 0) - { + + Integer loginType = loginUser.getUser().getLoginType(); + Boolean result = Boolean.FALSE; + if (LoginType.TENANT.getValue().equals(loginType)) { + TenantSecretKey tenantSecretKey = tenantSecretKeyService.selectTenantSecretKeyByTenantKey(userName); + tenantSecretKey.setPassword(newPassword); + result = tenantSecretKeyService.updateTenantSecretKey(tenantSecretKey) > 0; + } else if (LoginType.ADMIN.getValue().equals(loginType)) { + result = userService.resetUserPwd(userName, newPassword) > 0; + } + if (result) { // 更新缓存用户密码 loginUser.getUser().setPassword(newPassword); tokenService.setLoginUser(loginUser); @@ -110,14 +118,11 @@ public class SysProfileController extends BaseController */ @Log(title = "用户头像", businessType = BusinessType.UPDATE) @PostMapping("/avatar") - public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception - { - if (!file.isEmpty()) - { + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception { + if (!file.isEmpty()) { LoginUser loginUser = getLoginUser(); String avatar = FileUploadUtils.upload(FFConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); - if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) - { + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { AjaxResult ajax = AjaxResult.success(); ajax.put("imgUrl", avatar); // 更新缓存用户头像 diff --git a/ff-admin/src/main/resources/application-druid.yml b/ff-admin/src/main/resources/application-druid.yml index 34c7b32..89db033 100644 --- a/ff-admin/src/main/resources/application-druid.yml +++ b/ff-admin/src/main/resources/application-druid.yml @@ -7,7 +7,7 @@ spring: # 端口,默认为6379 port: 6379 # 数据库索引 - database: 2 + database: 1 # 密码 password: # 连接超时时间 diff --git a/ff-admin/src/main/resources/application.yml b/ff-admin/src/main/resources/application.yml index 73d1cb4..359be07 100644 --- a/ff-admin/src/main/resources/application.yml +++ b/ff-admin/src/main/resources/application.yml @@ -116,23 +116,8 @@ xss: # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* -#雪花算法id生成器配置 -snowflake: - worker: - id: 1 - datacenter: - id: 1 - -#aes密钥 -encrypt: - body: - aes-key: gktsdFKqo7lJi3Kc #AES加密秘钥 - -netty: - app: - port: 9820 - - web: - port: 9821 + + + diff --git a/ff-admin/src/main/resources/i18n/messages.properties b/ff-admin/src/main/resources/i18n/messages.properties index 094f953..c10300d 100644 --- a/ff-admin/src/main/resources/i18n/messages.properties +++ b/ff-admin/src/main/resources/i18n/messages.properties @@ -42,3 +42,6 @@ no.export.permission=您没有导出数据的权限,请联系管理员添加 no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +##租户 +operation.tenant.account.already.used=租户账号已被使用,请更换租户账号 +operation.password.mismatch=两次密码不一致 \ No newline at end of file diff --git a/ff-admin/src/main/resources/mapper/common/CurrencyMapper.xml b/ff-admin/src/main/resources/mapper/common/CurrencyMapper.xml index b5687d3..7903797 100644 --- a/ff-admin/src/main/resources/mapper/common/CurrencyMapper.xml +++ b/ff-admin/src/main/resources/mapper/common/CurrencyMapper.xml @@ -1,44 +1,73 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - select id, status, country, currency_code, currency_sign, game_rate, currency_display, currency_name, full_name, create_by, create_time, update_by, update_time, remark from ff_currency + select id, + status, + country, + currency_code, + currency_sign, + game_rate, + currency_display, + currency_name, + full_name, + create_by, + create_time, + update_by, + update_time, + remark + from ff_currency - + + and password = #{password} + and login_ip = #{loginIp} + and login_data = #{loginData} and tenant_key = #{tenantKey} and agent_id = #{agentId} and tenant_sn = #{tenantSn} @@ -39,20 +45,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and deposit_ratio = #{depositRatio} - + + + - - insert into ff_tenant_secret_key - + id, + id, + password, + login_ip, + login_data, tenant_key, agent_id, tenant_sn, @@ -66,8 +89,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time, update_by, update_time, - - + + #{id}, + #{id}, + #{password}, + #{loginIp}, + #{loginData}, #{tenantKey}, #{agentId}, #{tenantSn}, @@ -81,12 +108,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createTime}, #{updateBy}, #{updateTime}, - + update ff_tenant_secret_key + password = #{password}, + login_ip = #{loginIp}, + login_data = #{loginData}, tenant_key = #{tenantKey}, agent_id = #{agentId}, tenant_sn = #{tenantSn}, @@ -104,6 +134,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + + + delete from ff_tenant_secret_key where id = #{id} diff --git a/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml b/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml index 0d08319..82d2803 100644 --- a/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameBettingDetailsMapper.xml @@ -90,7 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ff_game_betting_details - + id, tenant_key, currency_code, member_id, @@ -117,7 +117,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, - + #{id}, #{tenantKey}, #{currencyCode}, #{memberId}, @@ -191,7 +191,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ff_game_betting_details - + id, tenant_key, game_id, currency_code, member_id, game_code, game_type, platform_code, game_name, game_status, game_status_type, game_currency_code, account, wagers_id, wagers_time, bet_amount, payoff_time, payoff_amount, @@ -199,7 +199,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" values - + id, #{item.tenantKey}, #{item.gameId}, #{item.currencyCode}, diff --git a/ff-admin/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml b/ff-admin/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml index c841553..121150a 100644 --- a/ff-admin/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml @@ -57,7 +57,7 @@ insert into ff_game_exchange_money - + id, tenant_key, currency_code, order_id, @@ -77,7 +77,7 @@ update_by, update_time, - + #{id}, #{tenantKey}, #{currencyCode}, #{orderId}, diff --git a/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml b/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml index 42f0ce4..104152f 100644 --- a/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameFreeRecordMapper.xml @@ -57,7 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ff_game_free_record - + id, currency_code, platform_code, reference_id, @@ -77,7 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, - + #{id}, #{currencyCode}, #{platformCode}, #{referenceId}, diff --git a/ff-admin/src/main/resources/mapper/game/GameMapper.xml b/ff-admin/src/main/resources/mapper/game/GameMapper.xml index f25d8b8..d9fcd50 100644 --- a/ff-admin/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameMapper.xml @@ -45,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ff_game - + id, sort_no, platform_id, game_code, @@ -59,7 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, - + #{id}, #{sortNo}, #{platformId}, #{gameCode}, diff --git a/ff-admin/src/main/resources/mapper/game/GamePlatformMapper.xml b/ff-admin/src/main/resources/mapper/game/GamePlatformMapper.xml index b682631..3838414 100644 --- a/ff-admin/src/main/resources/mapper/game/GamePlatformMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GamePlatformMapper.xml @@ -39,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ff_game_platform - + id, sort_no, platform_code, platform_type, @@ -50,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, - + #{id}, #{sortNo}, #{platformCode}, #{platformType}, diff --git a/ff-admin/src/main/resources/mapper/game/GameSecretKeyMapper.xml b/ff-admin/src/main/resources/mapper/game/GameSecretKeyMapper.xml index e5968a2..41c1082 100644 --- a/ff-admin/src/main/resources/mapper/game/GameSecretKeyMapper.xml +++ b/ff-admin/src/main/resources/mapper/game/GameSecretKeyMapper.xml @@ -43,7 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ff_game_secret_key - + id, platform, code, `key`, @@ -56,7 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, - + #{id}, #{platform}, #{code}, #{key}, diff --git a/ff-admin/src/main/resources/mapper/member/MemberMapper.xml b/ff-admin/src/main/resources/mapper/member/MemberMapper.xml index a80718c..a444537 100644 --- a/ff-admin/src/main/resources/mapper/member/MemberMapper.xml +++ b/ff-admin/src/main/resources/mapper/member/MemberMapper.xml @@ -39,7 +39,7 @@ insert into ff_member - + id, tenant_key, member_account, game_account, @@ -50,7 +50,7 @@ update_by, update_time, - + #{id}, #{tenantKey}, #{memberAccount}, #{gameAccount}, diff --git a/ff-base/pom.xml b/ff-base/pom.xml index 2033248..dbf57ac 100644 --- a/ff-base/pom.xml +++ b/ff-base/pom.xml @@ -23,6 +23,11 @@ + + com.dtflys.forest + forest-spring-boot-starter + 1.6.3 + org.springframework.boot @@ -184,6 +189,7 @@ javase + diff --git a/ff-base/src/main/java/com/ff/base/config/IdGeneratorUtil.java b/ff-base/src/main/java/com/ff/base/config/IdGeneratorUtil.java deleted file mode 100644 index 7e4257d..0000000 --- a/ff-base/src/main/java/com/ff/base/config/IdGeneratorUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ff.base.config; - -import com.ff.base.utils.SnowflakeIdGenerator; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -/** - * 雪花算法id - * - * @author liukang - * @date 2024-11-04 - */ -@Configuration -public class IdGeneratorUtil { - - private static SnowflakeIdGenerator snowflakeIdGenerator; - - @Value("${snowflake.worker.id}") - private long workerId; - - @Value("${snowflake.datacenter.id}") - private long dataCenterId; - - public void init() { - snowflakeIdGenerator = new SnowflakeIdGenerator(workerId, dataCenterId); - } - - public static long generateId() { - if (snowflakeIdGenerator == null) { - throw new IllegalStateException("SnowflakeIdGenerator is not initialized"); - } - return snowflakeIdGenerator.nextId(); - } -} diff --git a/ff-base/src/main/java/com/ff/base/config/SecurityConfig.java b/ff-base/src/main/java/com/ff/base/config/SecurityConfig.java index b061637..6a80785 100644 --- a/ff-base/src/main/java/com/ff/base/config/SecurityConfig.java +++ b/ff-base/src/main/java/com/ff/base/config/SecurityConfig.java @@ -6,7 +6,7 @@ import com.ff.base.security.filter.JwtAuthenticationTokenFilter; import com.ff.base.security.handle.AuthenticationEntryPointImpl; import com.ff.base.security.handle.LogoutSuccessHandlerImpl; import com.ff.base.security.provider.MyDaoAuthenticationProvider; -import com.ff.base.web.service.MemberDetailsServiceImpl; +import com.ff.base.web.service.TenantDetailsServiceImpl; import com.ff.base.web.service.UserDetailsServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -41,11 +41,8 @@ public class SecurityConfig { @Autowired private UserDetailsServiceImpl userDetailsService; - /** - * 会员自定义用户认证逻辑 - */ @Autowired - private MemberDetailsServiceImpl memberDetailsService; + private TenantDetailsServiceImpl tenantDetailsService; /** * 认证失败处理类 @@ -86,20 +83,20 @@ public class SecurityConfig { // 后台、会员两种验证方式实现类 List userDetailsServices = new ArrayList<>(); userDetailsServices.add(userDetailsService); - userDetailsServices.add(memberDetailsService); + userDetailsServices.add(tenantDetailsService); List providers = new ArrayList<>(); MyDaoAuthenticationProvider adminDaoAuthenticationProvider = new MyDaoAuthenticationProvider(); adminDaoAuthenticationProvider.setUserDetailsService(userDetailsService); // or userDetailsService adminDaoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder()); adminDaoAuthenticationProvider.setUserDetailsServices(userDetailsServices); - - MyDaoAuthenticationProvider memberDaoAuthenticationProvider = new MyDaoAuthenticationProvider(); - memberDaoAuthenticationProvider.setUserDetailsService(memberDetailsService); // or userDetailsService - memberDaoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder()); - memberDaoAuthenticationProvider.setUserDetailsServices(userDetailsServices); providers.add(adminDaoAuthenticationProvider); - providers.add(memberDaoAuthenticationProvider); + + MyDaoAuthenticationProvider adminDaoAuthenticationProvider1 = new MyDaoAuthenticationProvider(); + adminDaoAuthenticationProvider1.setUserDetailsService(tenantDetailsService); + adminDaoAuthenticationProvider1.setPasswordEncoder(bCryptPasswordEncoder()); + adminDaoAuthenticationProvider1.setUserDetailsServices(userDetailsServices); + return new ProviderManager(providers); diff --git a/ff-base/src/main/java/com/ff/base/constant/Constants.java b/ff-base/src/main/java/com/ff/base/constant/Constants.java index cad3cd2..d93fd78 100644 --- a/ff-base/src/main/java/com/ff/base/constant/Constants.java +++ b/ff-base/src/main/java/com/ff/base/constant/Constants.java @@ -251,4 +251,14 @@ public class Constants { */ public static final String USDT = "USDT"; + + /** + * 代理人角色 + */ + public static final String AGENT_ROLE = "agent"; + + /** + * 租户角色 + */ + public static final String TENANT_ROLE = "tenant"; } diff --git a/ff-base/src/main/java/com/ff/base/core/domain/model/LoginBody.java b/ff-base/src/main/java/com/ff/base/core/domain/model/LoginBody.java index ed52432..149060c 100644 --- a/ff-base/src/main/java/com/ff/base/core/domain/model/LoginBody.java +++ b/ff-base/src/main/java/com/ff/base/core/domain/model/LoginBody.java @@ -30,4 +30,9 @@ public class LoginBody */ private String uuid; + /** + * 登录类型 + */ + private Integer loginType; + } diff --git a/ff-base/src/main/java/com/ff/base/core/domain/model/LoginUser.java b/ff-base/src/main/java/com/ff/base/core/domain/model/LoginUser.java index e2fbb46..2d0ff08 100644 --- a/ff-base/src/main/java/com/ff/base/core/domain/model/LoginUser.java +++ b/ff-base/src/main/java/com/ff/base/core/domain/model/LoginUser.java @@ -74,10 +74,6 @@ public class LoginUser implements UserDetails */ private SysUser user; - /** - * 币种 - */ - private String currencyType; public LoginUser() { @@ -97,12 +93,6 @@ public class LoginUser implements UserDetails this.permissions = permissions; } - public LoginUser(Long userId,String currencyType, SysUser user) - { - this.userId = userId; - this.user = user; - this.currencyType = currencyType; - } public Long getUserId() { diff --git a/ff-base/src/main/java/com/ff/base/enums/LoginType.java b/ff-base/src/main/java/com/ff/base/enums/LoginType.java new file mode 100644 index 0000000..7c886fd --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/LoginType.java @@ -0,0 +1,35 @@ +package com.ff.base.enums; + +import lombok.Getter; + +/** + * 登录类型 + * + * @author shi + * @date 2025/02/24 + */ +@Getter +public enum LoginType { + ADMIN(0, "后台"), + TENANT(1, "租户"), + AGENT(2, "代理"), + ; + + private final Integer value; // 登录类型值 + private final String description; // 登录类型描述 + + LoginType(Integer value, String description) { + this.value = value; + this.description = description; + } + + // 根据 value 查找对应的 description + public static String getDescriptionByValue(Integer value) { + for (LoginType type : LoginType.values()) { + if (type.getValue().equals(value)) { + return type.getDescription(); + } + } + return null; // 未找到时返回 null + } +} \ No newline at end of file diff --git a/ff-base/src/main/java/com/ff/base/system/domain/SysUser.java b/ff-base/src/main/java/com/ff/base/system/domain/SysUser.java index 192826d..470d250 100644 --- a/ff-base/src/main/java/com/ff/base/system/domain/SysUser.java +++ b/ff-base/src/main/java/com/ff/base/system/domain/SysUser.java @@ -6,6 +6,7 @@ import com.ff.base.annotation.Excel.Type; import com.ff.base.annotation.Excels; import com.ff.base.core.domain.BaseEntity; import com.ff.base.xss.Xss; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -19,334 +20,157 @@ import java.util.List; * * @author ff */ -public class SysUser extends BaseEntity -{ +@Data +public class SysUser extends BaseEntity { private static final long serialVersionUID = 1L; - /** 用户ID */ + /** + * 用户ID + */ @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号") private Long userId; - /** 部门ID */ + /** + * 部门ID + */ @Excel(name = "部门编号", type = Type.IMPORT) private Long deptId; - /** 用户账号 */ + /** + * 用户账号 + */ @Excel(name = "登录名称") + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") private String userName; - /** 用户昵称 */ + /** + * 用户昵称 + */ @Excel(name = "用户名称") + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") private String nickName; - /** 用户邮箱 */ + /** + * 用户邮箱 + */ @Excel(name = "用户邮箱") + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") private String email; - /** 手机号码 */ + /** + * 手机号码 + */ @Excel(name = "手机号码", cellType = ColumnType.TEXT) + @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") private String phonenumber; - /** 用户性别 */ + /** + * 用户性别 + */ @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") private String sex; - /** 用户头像 */ + /** + * 用户头像 + */ private String avatar; - /** 密码 */ + /** + * 密码 + */ private String password; - /** 帐号状态(0正常 1停用) */ + /** + * 帐号状态(0正常 1停用) + */ @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") private String status; - /** 删除标志(0代表存在 2代表删除) */ + /** + * 删除标志(0代表存在 2代表删除) + */ private String delFlag; - /** 最后登录IP */ + /** + * 最后登录IP + */ @Excel(name = "最后登录IP", type = Type.EXPORT) private String loginIp; - /** 最后登录时间 */ + /** + * 最后登录时间 + */ @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) private Long loginDate; - /** 部门对象 */ + /** + * 部门对象 + */ @Excels({ - @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), - @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) + @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) }) private SysDept dept; - /** 角色对象 */ + /** + * 角色对象 + */ private List roles; - /** 角色组 */ + /** + * 角色组 + */ private Long[] roleIds; - /** 岗位组 */ + /** + * 岗位组 + */ private Long[] postIds; - /** 角色ID */ + /** + * 角色ID + */ private Long roleId; + /** - * 登录类型 0.后台登录 1.前端网页登录 + * 登录类型 0 后台 1 代理 2 租户 */ private Integer loginType; + + + /** * 真实姓名 */ private String realName; - public SysUser() - { + + + + + + public SysUser() { } - public SysUser(Long userId) - { + public SysUser(Long userId) { this.userId = userId; } - public String getRealName() { - return realName; - } - public void setRealName(String realName) { - this.realName = realName; - } - - public Integer getLoginType() { - return loginType; - } - - public void setLoginType(Integer loginType) { - this.loginType = loginType; - } - - public Long getUserId() - { - return userId; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } - - public boolean isAdmin() - { + public boolean isAdmin() { return isAdmin(this.userId); } - public static boolean isAdmin(Long userId) - { + public static boolean isAdmin(Long userId) { return userId != null && 1L == userId; } - public Long getDeptId() - { - return deptId; - } - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - @Xss(message = "用户昵称不能包含脚本字符") - @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") - public String getNickName() - { - return nickName; - } - - public void setNickName(String nickName) - { - this.nickName = nickName; - } - - @Xss(message = "用户账号不能包含脚本字符") - @NotBlank(message = "用户账号不能为空") - @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") - public String getUserName() - { - return userName; - } - - public void setUserName(String userName) - { - this.userName = userName; - } - - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") - public String getEmail() - { - return email; - } - - public void setEmail(String email) - { - this.email = email; - } - - @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") - public String getPhonenumber() - { - return phonenumber; - } - - public void setPhonenumber(String phonenumber) - { - this.phonenumber = phonenumber; - } - - public String getSex() - { - return sex; - } - - public void setSex(String sex) - { - this.sex = sex; - } - - public String getAvatar() - { - return avatar; - } - - public void setAvatar(String avatar) - { - this.avatar = avatar; - } - - public String getPassword() - { - return password; - } - - public void setPassword(String password) - { - this.password = password; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getDelFlag() - { - return delFlag; - } - - public void setDelFlag(String delFlag) - { - this.delFlag = delFlag; - } - - public String getLoginIp() - { - return loginIp; - } - - public void setLoginIp(String loginIp) - { - this.loginIp = loginIp; - } - - public Long getLoginDate() - { - return loginDate; - } - - public void setLoginDate(Long loginDate) - { - this.loginDate = loginDate; - } - - public SysDept getDept() - { - return dept; - } - - public void setDept(SysDept dept) - { - this.dept = dept; - } - - public List getRoles() - { - return roles; - } - - public void setRoles(List roles) - { - this.roles = roles; - } - - public Long[] getRoleIds() - { - return roleIds; - } - - public void setRoleIds(Long[] roleIds) - { - this.roleIds = roleIds; - } - - public Long[] getPostIds() - { - return postIds; - } - - public void setPostIds(Long[] postIds) - { - this.postIds = postIds; - } - - public Long getRoleId() - { - return roleId; - } - - public void setRoleId(Long roleId) - { - this.roleId = roleId; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("userId", getUserId()) - .append("deptId", getDeptId()) - .append("userName", getUserName()) - .append("nickName", getNickName()) - .append("email", getEmail()) - .append("phonenumber", getPhonenumber()) - .append("sex", getSex()) - .append("avatar", getAvatar()) - .append("password", getPassword()) - .append("status", getStatus()) - .append("delFlag", getDelFlag()) - .append("loginIp", getLoginIp()) - .append("loginDate", getLoginDate()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .append("dept", getDept()) - .toString(); - } } diff --git a/ff-admin/src/main/java/com/ff/common/domain/TenantSecretKey.java b/ff-base/src/main/java/com/ff/base/system/domain/TenantSecretKey.java similarity index 75% rename from ff-admin/src/main/java/com/ff/common/domain/TenantSecretKey.java rename to ff-base/src/main/java/com/ff/base/system/domain/TenantSecretKey.java index 4ca4fa1..3754b7d 100644 --- a/ff-admin/src/main/java/com/ff/common/domain/TenantSecretKey.java +++ b/ff-base/src/main/java/com/ff/base/system/domain/TenantSecretKey.java @@ -1,6 +1,9 @@ -package com.ff.common.domain; +package com.ff.base.system.domain; import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.ff.base.annotation.Excel; import com.ff.base.core.domain.BaseEntity; import lombok.AllArgsConstructor; @@ -27,6 +30,22 @@ public class TenantSecretKey extends BaseEntity + + /** 密码 */ + @Excel(name = "密码") + @JsonIgnore + private String password; + + /** 最后登录ip */ + @Excel(name = "最后登录ip") + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间") + private Long loginData; + + + /** 租户key */ @Excel(name = "租户key") private String tenantKey; @@ -35,12 +54,16 @@ public class TenantSecretKey extends BaseEntity @Excel(name = "代理id") private Long agentId; + + /** 商户后缀 */ @Excel(name = "商户后缀") + @JsonIgnore private String tenantSn; /** 租户密钥 */ @Excel(name = "租户密钥") + @JsonIgnore private String tenantSecret; /** 租户状态 1正常 0停用 */ diff --git a/ff-base/src/main/java/com/ff/base/system/dto/TenantSecretKeyDTO.java b/ff-base/src/main/java/com/ff/base/system/dto/TenantSecretKeyDTO.java new file mode 100644 index 0000000..9594eeb --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/system/dto/TenantSecretKeyDTO.java @@ -0,0 +1,27 @@ +package com.ff.base.system.dto; + +import com.ff.base.annotation.Excel; +import com.ff.base.core.domain.BaseEntity; +import com.ff.base.system.domain.TenantSecretKey; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 用户租户密钥对象 ff_tenant_secret_key + * + * @author shi + * @date 2025-02-20 + */ +@Data +public class TenantSecretKeyDTO extends TenantSecretKey +{ + + + + + +} diff --git a/ff-base/src/main/java/com/ff/base/system/mapper/SysMenuMapper.java b/ff-base/src/main/java/com/ff/base/system/mapper/SysMenuMapper.java index 37b24b5..07a3a45 100644 --- a/ff-base/src/main/java/com/ff/base/system/mapper/SysMenuMapper.java +++ b/ff-base/src/main/java/com/ff/base/system/mapper/SysMenuMapper.java @@ -1,9 +1,11 @@ package com.ff.base.system.mapper; import com.ff.base.system.domain.SysMenu; +import com.ff.base.system.domain.SysRole; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Set; /** * 菜单表 数据层 @@ -61,10 +63,10 @@ public interface SysMenuMapper /** * 根据用户ID查询菜单 * - * @param userId 用户ID + * @param roleIds 权限 * @return 菜单列表 */ - public List selectMenuTreeByUserId(Long userId); + public List selectMenuTreeByUserId(@Param("roleIds") List roleIds); /** * 根据角色ID查询菜单树信息 diff --git a/ff-base/src/main/java/com/ff/base/system/mapper/SysRoleMapper.java b/ff-base/src/main/java/com/ff/base/system/mapper/SysRoleMapper.java index d3f0838..939add2 100644 --- a/ff-base/src/main/java/com/ff/base/system/mapper/SysRoleMapper.java +++ b/ff-base/src/main/java/com/ff/base/system/mapper/SysRoleMapper.java @@ -2,6 +2,7 @@ package com.ff.base.system.mapper; import com.ff.base.system.domain.SysRole; +import javax.management.relation.Role; import java.util.List; /** @@ -66,6 +67,15 @@ public interface SysRoleMapper */ public SysRole checkRoleNameUnique(String roleName); + + /** + * 按角色键选择角色 + * + * @param roleKey 角色键 + * @return {@link SysRole } + */ + SysRole selectRoleByRoleKey(String roleKey); + /** * 校验角色权限是否唯一 * diff --git a/ff-base/src/main/java/com/ff/base/system/mapper/SysUserMapper.java b/ff-base/src/main/java/com/ff/base/system/mapper/SysUserMapper.java index c00d956..df0f5d7 100644 --- a/ff-base/src/main/java/com/ff/base/system/mapper/SysUserMapper.java +++ b/ff-base/src/main/java/com/ff/base/system/mapper/SysUserMapper.java @@ -126,10 +126,5 @@ public interface SysUserMapper */ public SysUser checkEmailUnique(String email); - /** - * 根据账号名/手机号查询会员用户 - * @param accountName 账号名/手机号 - * @return 会员用户 - */ - SysUser selectMemberUserByUserName(String accountName); + } diff --git a/ff-admin/src/main/java/com/ff/common/mapper/TenantSecretKeyMapper.java b/ff-base/src/main/java/com/ff/base/system/mapper/TenantSecretKeyMapper.java similarity index 79% rename from ff-admin/src/main/java/com/ff/common/mapper/TenantSecretKeyMapper.java rename to ff-base/src/main/java/com/ff/base/system/mapper/TenantSecretKeyMapper.java index 9a445f9..bb74dd5 100644 --- a/ff-admin/src/main/java/com/ff/common/mapper/TenantSecretKeyMapper.java +++ b/ff-base/src/main/java/com/ff/base/system/mapper/TenantSecretKeyMapper.java @@ -1,7 +1,8 @@ -package com.ff.common.mapper; +package com.ff.base.system.mapper; import java.util.List; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.dto.TenantSecretKeyDTO; /** * 用户租户密钥Mapper接口 @@ -35,6 +36,15 @@ public interface TenantSecretKeyMapper */ List selectTenantSecretKeyList(TenantSecretKey tenantSecretKey); + + /** + * 选择租户密钥数据列表 + * + * @param tenantSecretKeyDTO 租户密钥dto + * @return {@link List }<{@link TenantSecretKey }> + */ + List selectTenantSecretKeyDTOList(TenantSecretKeyDTO tenantSecretKeyDTO); + /** * 新增用户租户密钥 * diff --git a/ff-base/src/main/java/com/ff/base/system/service/ISysMenuService.java b/ff-base/src/main/java/com/ff/base/system/service/ISysMenuService.java index 55d9f89..5ade323 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/ISysMenuService.java +++ b/ff-base/src/main/java/com/ff/base/system/service/ISysMenuService.java @@ -2,6 +2,7 @@ package com.ff.base.system.service; import com.ff.base.core.domain.TreeSelect; import com.ff.base.system.domain.SysMenu; +import com.ff.base.system.domain.SysRole; import com.ff.base.system.domain.vo.RouterVo; import java.util.List; @@ -50,10 +51,10 @@ public interface ISysMenuService /** * 根据用户ID查询菜单树信息 * - * @param userId 用户ID + * @param roleIds 角色 * @return 菜单列表 */ - public List selectMenuTreeByUserId(Long userId); + public List selectMenuTree( List roleIds); /** * 根据角色ID查询菜单树信息 diff --git a/ff-base/src/main/java/com/ff/base/system/service/ISysRoleService.java b/ff-base/src/main/java/com/ff/base/system/service/ISysRoleService.java index b2dac0d..23b9212 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/ISysRoleService.java +++ b/ff-base/src/main/java/com/ff/base/system/service/ISysRoleService.java @@ -68,6 +68,14 @@ public interface ISysRoleService */ public boolean checkRoleNameUnique(SysRole role); + /** + * 按角色键选择角色 + * + * @param roleKey 角色键 + * @return {@link SysRole } + */ + SysRole selectRoleByRoleKey(String roleKey); + /** * 校验角色权限是否唯一 * diff --git a/ff-base/src/main/java/com/ff/base/system/service/ISysUserService.java b/ff-base/src/main/java/com/ff/base/system/service/ISysUserService.java index 883627d..7485b0d 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/ISysUserService.java +++ b/ff-base/src/main/java/com/ff/base/system/service/ISysUserService.java @@ -205,10 +205,7 @@ public interface ISysUserService */ public String importUser(List userList, Boolean isUpdateSupport, String operName); - /** - * 查看会员用户根据账号名/手机号 - * @param accountName 账号名/手机号 - * @return 用户 - */ - SysUser selectMemberUserByUserName(String accountName); + + + } diff --git a/ff-admin/src/main/java/com/ff/common/service/ITenantSecretKeyService.java b/ff-base/src/main/java/com/ff/base/system/service/ITenantSecretKeyService.java similarity index 73% rename from ff-admin/src/main/java/com/ff/common/service/ITenantSecretKeyService.java rename to ff-base/src/main/java/com/ff/base/system/service/ITenantSecretKeyService.java index 52d932b..8937157 100644 --- a/ff-admin/src/main/java/com/ff/common/service/ITenantSecretKeyService.java +++ b/ff-base/src/main/java/com/ff/base/system/service/ITenantSecretKeyService.java @@ -1,7 +1,8 @@ -package com.ff.common.service; +package com.ff.base.system.service; import java.util.List; -import com.ff.common.domain.TenantSecretKey; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.dto.TenantSecretKeyDTO; /** * 用户租户密钥Service接口 @@ -11,6 +12,16 @@ import com.ff.common.domain.TenantSecretKey; */ public interface ITenantSecretKeyService { + + + /** + * 登录 + * + * @param username 用户名 + * @param password 密码 + * @return {@link String } + */ + String login(String username, String password); /** * 查询用户租户密钥 * @@ -19,6 +30,15 @@ public interface ITenantSecretKeyService */ TenantSecretKey selectTenantSecretKeyById(Long id); + /** + * 选择租户密钥数据列表 + * + * @param tenantSecretKeyDTO 租户密钥dto + * @return {@link List }<{@link TenantSecretKey }> + */ + List selectTenantSecretKeyDTOList(TenantSecretKeyDTO tenantSecretKeyDTO); + + /** * 生成租户sn @@ -73,4 +93,6 @@ public interface ITenantSecretKeyService * @return 结果 */ int deleteTenantSecretKeyById(Long id); + + } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java index f8bca85..db717dc 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysConfigServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.constant.CacheConstants; import com.ff.base.constant.UserConstants; import com.ff.base.core.redis.RedisCache; @@ -100,6 +101,7 @@ public class SysConfigServiceImpl implements ISysConfigService { */ @Override public int insertConfig(SysConfig config) { + config.setConfigId(IdUtil.getSnowflakeNextId()); int row = configMapper.insertConfig(config); if (row > 0) { redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDatasourceServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDatasourceServiceImpl.java index 14a789c..b5a62db 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDatasourceServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDatasourceServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.system.domain.SysDatasource; import com.ff.base.system.mapper.SysDatasourceMapper; import com.ff.base.system.service.ISysDatasourceService; @@ -86,6 +87,7 @@ public class SysDatasourceServiceImpl implements ISysDatasourceService @Override public int insertSysDatasource(SysDatasource sysDatasource) { + sysDatasource.setId(IdUtil.getSnowflakeNextId()); sysDatasource.setCreateTime(DateUtils.getNowDate()); return sysDatasourceMapper.insertSysDatasource(sysDatasource); } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDeptServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDeptServiceImpl.java index 6d04a25..f477f55 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDeptServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDeptServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.annotation.DataScope; import com.ff.base.constant.UserConstants; import com.ff.base.core.domain.TreeSelect; @@ -212,6 +213,7 @@ public class SysDeptServiceImpl implements ISysDeptService @Override public int insertDept(SysDept dept) { + dept.setDeptId(IdUtil.getSnowflakeNextId()); SysDept info = deptMapper.selectDeptById(dept.getParentId()); // 如果父节点不为正常状态,则不允许新增子节点 if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictDataServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictDataServiceImpl.java index dafa9ce..4271437 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictDataServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictDataServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.system.domain.SysDictData; import com.ff.base.utils.DictUtils; import com.ff.base.system.mapper.SysDictDataMapper; @@ -83,6 +84,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService @Override public int insertDictData(SysDictData data) { + data.setDictCode(IdUtil.getSnowflakeNextId()); int row = dictDataMapper.insertDictData(data); if (row > 0) { diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictTypeServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictTypeServiceImpl.java index 0c673f0..f4b9c26 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictTypeServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysDictTypeServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.constant.UserConstants; import com.ff.base.datasource.DynamicDataSourceContextHolder; import com.ff.base.exception.ServiceException; @@ -160,6 +161,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { */ @Override public int insertDictType(SysDictType dict) { + dict.setDictId(IdUtil.getSnowflakeNextId()); int row = dictTypeMapper.insertDictType(dict); if (row > 0) { DictUtils.setDictCache(dict.getDictType(), null); diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysLogininforServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysLogininforServiceImpl.java index 22f85d7..f5ec7bb 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysLogininforServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysLogininforServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.system.domain.SysLogininfor; import com.ff.base.system.mapper.SysLogininforMapper; import com.ff.base.system.service.ISysLogininforService; @@ -28,6 +29,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService @Override public void insertLogininfor(SysLogininfor logininfor) { + logininfor.setInfoId(IdUtil.getSnowflakeNextId()); logininforMapper.insertLogininfor(logininfor); } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysMenuServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysMenuServiceImpl.java index 1f20b6e..6e65523 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysMenuServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysMenuServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.constant.Constants; import com.ff.base.constant.UserConstants; import com.ff.base.core.domain.TreeSelect; @@ -119,20 +120,20 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据用户ID查询菜单 * - * @param userId 用户名称 + * @param roleIds 角色 * @return 菜单列表 */ @Override - public List selectMenuTreeByUserId(Long userId) + public List selectMenuTree( List roleIds) { List menus = null; - if (SecurityUtils.isAdmin(userId)) + if (SecurityUtils.isAdmin(SecurityUtils.getUserId())) { menus = menuMapper.selectMenuTreeAll(); } else { - menus = menuMapper.selectMenuTreeByUserId(userId); + menus = menuMapper.selectMenuTreeByUserId(roleIds); } return getChildPerms(menus, 0); } @@ -296,6 +297,7 @@ public class SysMenuServiceImpl implements ISysMenuService @Override public int insertMenu(SysMenu menu) { + menu.setMenuId(IdUtil.getSnowflakeNextId()); return menuMapper.insertMenu(menu); } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysOperLogServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysOperLogServiceImpl.java index 08dfd59..a8b95fe 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysOperLogServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysOperLogServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.system.domain.SysOperLog; import com.ff.base.system.mapper.SysOperLogMapper; import com.ff.base.system.service.ISysOperLogService; @@ -27,6 +28,7 @@ public class SysOperLogServiceImpl implements ISysOperLogService @Override public void insertOperlog(SysOperLog operLog) { + operLog.setOperId(IdUtil.getSnowflakeNextId()); operLogMapper.insertOperlog(operLog); } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysPostServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysPostServiceImpl.java index d7fe293..dc4d830 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysPostServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysPostServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.constant.UserConstants; import com.ff.base.exception.ServiceException; import com.ff.base.utils.StringUtils; @@ -162,6 +163,7 @@ public class SysPostServiceImpl implements ISysPostService @Override public int insertPost(SysPost post) { + post.setPostId(IdUtil.getSnowflakeNextId()); return postMapper.insertPost(post); } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysRoleServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysRoleServiceImpl.java index 47ecadf..35074be 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysRoleServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysRoleServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.annotation.DataScope; import com.ff.base.constant.UserConstants; import com.ff.base.system.domain.SysRole; @@ -154,6 +155,17 @@ public class SysRoleServiceImpl implements ISysRoleService return UserConstants.UNIQUE; } + /** + * 按角色键选择角色 + * + * @param roleKey 角色键 + * @return {@link SysRole } + */ + @Override + public SysRole selectRoleByRoleKey(String roleKey) { + return roleMapper.selectRoleByRoleKey(roleKey); + } + /** * 校验角色权限是否唯一 * @@ -231,6 +243,7 @@ public class SysRoleServiceImpl implements ISysRoleService @Transactional public int insertRole(SysRole role) { + role.setRoleId(IdUtil.getSnowflakeNextId()); // 新增角色信息 roleMapper.insertRole(role); return insertRoleMenu(role); diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/SysUserServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/SysUserServiceImpl.java index 9f612fd..e2a745b 100644 --- a/ff-base/src/main/java/com/ff/base/system/service/impl/SysUserServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/SysUserServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.system.service.impl; +import cn.hutool.core.util.IdUtil; import com.ff.base.annotation.DataScope; import com.ff.base.constant.UserConstants; import com.ff.base.system.domain.SysRole; @@ -257,6 +258,7 @@ public class SysUserServiceImpl implements ISysUserService @Transactional public int insertUser(SysUser user) { + user.setUserId(IdUtil.getSnowflakeNextId()); // 新增用户信息 int rows = userMapper.insertUser(user); // 新增用户岗位关联 @@ -545,13 +547,5 @@ public class SysUserServiceImpl implements ISysUserService return successMsg.toString(); } - /** - * 根据账号名/手机号查询会员用户 - * @param accountName 账号名/手机号 - * @return 会员用户 - */ - @Override - public SysUser selectMemberUserByUserName(String accountName) { - return userMapper.selectMemberUserByUserName(accountName); - } + } diff --git a/ff-base/src/main/java/com/ff/base/system/service/impl/TenantSecretKeyServiceImpl.java b/ff-base/src/main/java/com/ff/base/system/service/impl/TenantSecretKeyServiceImpl.java new file mode 100644 index 0000000..6f12f2e --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/system/service/impl/TenantSecretKeyServiceImpl.java @@ -0,0 +1,206 @@ +package com.ff.base.system.service.impl; + +import java.util.Collections; +import java.util.List; + +import cn.hutool.core.util.IdUtil; +import com.ff.base.constant.Constants; +import com.ff.base.core.domain.model.LoginForm; +import com.ff.base.core.domain.model.LoginUser; +import com.ff.base.enums.LoginType; +import com.ff.base.exception.ServiceException; +import com.ff.base.exception.user.UserPasswordNotMatchException; +import com.ff.base.manager.AsyncManager; +import com.ff.base.manager.factory.AsyncFactory; +import com.ff.base.security.context.AuthenticationContextHolder; +import com.ff.base.system.dto.TenantSecretKeyDTO; +import com.ff.base.utils.DateUtils; +import com.ff.base.utils.MessageUtils; +import com.ff.base.utils.NumberUtils; +import com.ff.base.utils.ip.IpUtils; +import com.ff.base.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import com.ff.base.system.mapper.TenantSecretKeyMapper; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.service.ITenantSecretKeyService; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; + +/** + * 用户租户密钥Service业务层处理 + * + * @author shi + * @date 2025-02-11 + */ +@Service +public class TenantSecretKeyServiceImpl implements ITenantSecretKeyService { + @Autowired + private TenantSecretKeyMapper tenantSecretKeyMapper; + + @Resource + private TokenService tokenService; + + + @Resource + private AuthenticationManager authenticationManager; + + /** + * 登录 + * + * @param username 用户名 + * @param password 密码 + * @return {@link String } + */ + @Override + public String login(String username, String password) { + // 用户验证 + Authentication authentication = null; + try { + + + LoginForm loginForm = new LoginForm(); + loginForm.setAccountName(username); + loginForm.setPassword(password); + loginForm.setLoginType(LoginType.TENANT.getValue()); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, loginForm); + AuthenticationContextHolder.setContext(authenticationToken); + authentication = authenticationManager.authenticate(authenticationToken); + } catch (Exception e) { + if (e instanceof BadCredentialsException) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } else { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } finally { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + + //更新租户信息 + TenantSecretKey tenantSecretKey = new TenantSecretKey(); + tenantSecretKey.setId(loginUser.getUserId()); + tenantSecretKey.setLoginIp(IpUtils.getIpAddr()); + tenantSecretKey.setLoginData(DateUtils.getNowDate()); + tenantSecretKeyMapper.updateTenantSecretKey(tenantSecretKey); + // 生成token + return tokenService.createToken(loginUser); + + } + + /** + * 查询用户租户密钥 + * + * @param id 用户租户密钥主键 + * @return 用户租户密钥 + */ + @Override + public TenantSecretKey selectTenantSecretKeyById(Long id) { + return tenantSecretKeyMapper.selectTenantSecretKeyById(id); + } + + /** + * 选择租户密钥数据列表 + * + * @param tenantSecretKeyDTO 租户密钥dto + * @return {@link List }<{@link TenantSecretKey }> + */ + @Override + public List selectTenantSecretKeyDTOList(TenantSecretKeyDTO tenantSecretKeyDTO) { + return tenantSecretKeyMapper.selectTenantSecretKeyDTOList(tenantSecretKeyDTO); + } + + + /** + * 生成租户sn + * + * @return {@link String } + */ + @Override + public synchronized String generateTenantSn() { + String sn = NumberUtils.generateRandomCode(); + while (!CollectionUtils.isEmpty(tenantSecretKeyMapper.selectTenantSecretKeyList(TenantSecretKey.builder() + .tenantSn(sn) + .build()))) { + sn = NumberUtils.generateRandomCode(); + } + return sn; + } + + /** + * 按租户密钥选择租户密钥 + * + * @param tenantKey 租户密钥 + * @return {@link TenantSecretKey } + */ + @Override + public TenantSecretKey selectTenantSecretKeyByTenantKey(String tenantKey) { + return tenantSecretKeyMapper.selectTenantSecretKeyByTenantKey(tenantKey); + } + + /** + * 查询用户租户密钥列表 + * + * @param tenantSecretKey 用户租户密钥 + * @return 用户租户密钥 + */ + @Override + public List selectTenantSecretKeyList(TenantSecretKey tenantSecretKey) { + return tenantSecretKeyMapper.selectTenantSecretKeyList(tenantSecretKey); + } + + /** + * 新增用户租户密钥 + * + * @param tenantSecretKey 用户租户密钥 + * @return 结果 + */ + @Override + public int insertTenantSecretKey(TenantSecretKey tenantSecretKey) { + tenantSecretKey.setCreateTime(DateUtils.getNowDate()); + tenantSecretKey.setId(IdUtil.getSnowflakeNextId()); + return tenantSecretKeyMapper.insertTenantSecretKey(tenantSecretKey); + } + + /** + * 修改用户租户密钥 + * + * @param tenantSecretKey 用户租户密钥 + * @return 结果 + */ + @Override + public int updateTenantSecretKey(TenantSecretKey tenantSecretKey) { + tenantSecretKey.setUpdateTime(DateUtils.getNowDate()); + return tenantSecretKeyMapper.updateTenantSecretKey(tenantSecretKey); + } + + /** + * 批量删除用户租户密钥 + * + * @param ids 需要删除的用户租户密钥主键 + * @return 结果 + */ + @Override + public int deleteTenantSecretKeyByIds(Long[] ids) { + return tenantSecretKeyMapper.deleteTenantSecretKeyByIds(ids); + } + + /** + * 删除用户租户密钥信息 + * + * @param id 用户租户密钥主键 + * @return 结果 + */ + @Override + public int deleteTenantSecretKeyById(Long id) { + return tenantSecretKeyMapper.deleteTenantSecretKeyById(id); + } +} diff --git a/ff-base/src/main/java/com/ff/base/utils/SecurityUtils.java b/ff-base/src/main/java/com/ff/base/utils/SecurityUtils.java index 65cc993..1874748 100644 --- a/ff-base/src/main/java/com/ff/base/utils/SecurityUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/SecurityUtils.java @@ -14,8 +14,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.PatternMatchUtils; +import javax.management.relation.Role; import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** @@ -26,14 +28,6 @@ import java.util.stream.Collectors; public class SecurityUtils { - /** - * 获取当前登录用户币种 - * @return {@link String } - */ - public static String getUserCurrencyType(){ - return getLoginUser().getCurrencyType(); - } - /** * 获取用户id或null @@ -67,6 +61,24 @@ public class SecurityUtils } } + + /** + * 获取角色 + * + * @return {@link List }<{@link SysRole }> + */ + public static List getRoles() + { + try + { + return getLoginUser().getUser().getRoles(); + } + catch (Exception e) + { + throw new ServiceException("获取用户角色异常", HttpStatus.UNAUTHORIZED); + } + } + /** * 获取部门ID **/ @@ -227,6 +239,7 @@ public class SecurityUtils return hasRole(roles, role); } + /** * 判断是否包含角色 * diff --git a/ff-base/src/main/java/com/ff/base/utils/SnowflakeIdGenerator.java b/ff-base/src/main/java/com/ff/base/utils/SnowflakeIdGenerator.java deleted file mode 100644 index 38d1579..0000000 --- a/ff-base/src/main/java/com/ff/base/utils/SnowflakeIdGenerator.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ff.base.utils; -/** - * 雪花算法id - * - * @author liukang - * @date 2024-11-04 - */ -public class SnowflakeIdGenerator { - - private static final long EPOCH = 1609459200000L; // 自定义起始时间戳,例如2021-01-01 00:00:00 - private static final long WORKER_ID_BITS = 5L; - private static final long DATA_CENTER_ID_BITS = 5L; - private static final long SEQUENCE_BITS = 12L; - - private static final long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); - private static final long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS); - private static final long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS); - - private static final long WORKER_ID_SHIFT = SEQUENCE_BITS; - private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; - private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS; - - private long workerId; - private long dataCenterId; - private long sequence = 0L; - private long lastTimestamp = -1L; - - public SnowflakeIdGenerator(long workerId, long dataCenterId) { - if (workerId > MAX_WORKER_ID || workerId < 0) { - throw new IllegalArgumentException("worker Id can't be greater than " + MAX_WORKER_ID + " or less than 0"); - } - if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) { - throw new IllegalArgumentException("data center Id can't be greater than " + MAX_DATA_CENTER_ID + " or less than 0"); - } - this.workerId = workerId; - this.dataCenterId = dataCenterId; - } - - public synchronized long nextId() { - long timestamp = timeGen(); - if (timestamp < lastTimestamp) { - throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); - } - - if (lastTimestamp == timestamp) { - sequence = (sequence + 1) & SEQUENCE_MASK; - if (sequence == 0) { - timestamp = tilNextMillis(lastTimestamp); - } - } else { - sequence = 0L; - } - - lastTimestamp = timestamp; - - return ((timestamp - EPOCH) << TIMESTAMP_LEFT_SHIFT) | - (dataCenterId << DATA_CENTER_ID_SHIFT) | - (workerId << WORKER_ID_SHIFT) | - sequence; - } - - protected long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } - - protected long timeGen() { - return System.currentTimeMillis(); - } -} diff --git a/ff-base/src/main/java/com/ff/base/utils/file/FileUploadUtils.java b/ff-base/src/main/java/com/ff/base/utils/file/FileUploadUtils.java index ea0b0f0..6ddca23 100644 --- a/ff-base/src/main/java/com/ff/base/utils/file/FileUploadUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/file/FileUploadUtils.java @@ -1,7 +1,7 @@ package com.ff.base.utils.file; +import cn.hutool.core.util.IdUtil; import com.ff.base.config.FFConfig; -import com.ff.base.config.IdGeneratorUtil; import com.ff.base.constant.Constants; import com.ff.base.exception.file.FileNameLengthLimitExceededException; import com.ff.base.exception.file.FileSizeLimitExceededException; @@ -125,7 +125,7 @@ public class FileUploadUtils public static final String extractFilename(MultipartFile file) { return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), - IdGeneratorUtil.generateId(), Seq.getId(Seq.uploadSeqType), getExtension(file)); + IdUtil.getSnowflakeNextId(), Seq.getId(Seq.uploadSeqType), getExtension(file)); } public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException diff --git a/ff-base/src/main/java/com/ff/base/web/service/MemberDetailsServiceImpl.java b/ff-base/src/main/java/com/ff/base/web/service/MemberDetailsServiceImpl.java deleted file mode 100644 index 1eebc62..0000000 --- a/ff-base/src/main/java/com/ff/base/web/service/MemberDetailsServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ff.base.web.service; - -import com.ff.base.core.domain.model.LoginUser; -import com.ff.base.enums.MemberStatus; -import com.ff.base.exception.ServiceException; -import com.ff.base.system.domain.SysUser; -import com.ff.base.system.service.ISysConfigService; -import com.ff.base.system.service.ISysUserService; -import com.ff.base.utils.MessageUtils; -import com.ff.base.utils.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -/** - * 会员验证处理 - * - * @author ff - */ -@Service -public class MemberDetailsServiceImpl implements UserDetailsService { - - @Autowired - private ISysUserService userService; - - @Autowired - private SysPasswordService passwordService; - - @Autowired - private ISysConfigService sysConfigService; - - - private static final Logger log = LoggerFactory.getLogger(MemberDetailsServiceImpl.class); - - @Override - public UserDetails loadUserByUsername(String accountName) throws UsernameNotFoundException { - SysUser user = userService.selectMemberUserByUserName(accountName); - if (StringUtils.isNull(user)) { - log.info("登录用户:{} 不存在.", accountName); - throw new ServiceException(MessageUtils.message("user.not.exists")); - } else if (MemberStatus.MemberStatus_6.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", accountName); - throw new ServiceException(MessageUtils.message("user.blocked")); - } - - passwordService.validate(user); - String defaultCurrency = sysConfigService.selectConfigByKey("default.currency"); - return createLoginUser(user,defaultCurrency); - } - - - public UserDetails createLoginUser(SysUser user,String defaultCurrency) { - return new LoginUser(user.getUserId(),defaultCurrency, user); - } -} diff --git a/ff-base/src/main/java/com/ff/base/web/service/SysLoginService.java b/ff-base/src/main/java/com/ff/base/web/service/SysLoginService.java index 350cf1e..e6abc57 100644 --- a/ff-base/src/main/java/com/ff/base/web/service/SysLoginService.java +++ b/ff-base/src/main/java/com/ff/base/web/service/SysLoginService.java @@ -4,6 +4,7 @@ import com.ff.base.constant.CacheConstants; import com.ff.base.constant.Constants; import com.ff.base.constant.UserConstants; import com.ff.base.core.domain.model.LoginForm; +import com.ff.base.enums.LoginType; import com.ff.base.system.domain.SysUser; import com.ff.base.core.domain.model.LoginUser; import com.ff.base.core.redis.RedisCache; @@ -61,18 +62,18 @@ public class SysLoginService */ public String login(String username, String password, String code, String uuid) { - // 验证码校验 - validateCaptcha(username, code, uuid); - // 登录前置校验 - loginPreCheck(username, password); + // 用户验证 Authentication authentication = null; try { + + + LoginForm loginForm = new LoginForm(); loginForm.setAccountName(username); loginForm.setPassword(password); - loginForm.setLoginType(0); + loginForm.setLoginType(LoginType.ADMIN.getValue()); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, loginForm); AuthenticationContextHolder.setContext(authenticationToken); // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername diff --git a/ff-base/src/main/java/com/ff/base/web/service/SysPasswordService.java b/ff-base/src/main/java/com/ff/base/web/service/SysPasswordService.java index 17981d4..a39b934 100644 --- a/ff-base/src/main/java/com/ff/base/web/service/SysPasswordService.java +++ b/ff-base/src/main/java/com/ff/base/web/service/SysPasswordService.java @@ -43,7 +43,7 @@ public class SysPasswordService return CacheConstants.PWD_ERR_CNT_KEY + username; } - public void validate(SysUser user) + public void validate(String userPassword) { Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); String username = usernamePasswordAuthenticationToken.getName(); @@ -62,7 +62,7 @@ public class SysPasswordService throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); } - if (!matches(user, password)) + if (!matches(userPassword, password)) { retryCount = retryCount + 1; redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); @@ -74,9 +74,9 @@ public class SysPasswordService } } - public boolean matches(SysUser user, String rawPassword) + public boolean matches(String userPassword, String rawPassword) { - return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); + return SecurityUtils.matchesPassword(rawPassword, userPassword); } public void clearLoginRecordCache(String loginName) diff --git a/ff-base/src/main/java/com/ff/base/web/service/TenantDetailsServiceImpl.java b/ff-base/src/main/java/com/ff/base/web/service/TenantDetailsServiceImpl.java new file mode 100644 index 0000000..be58a7c --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/web/service/TenantDetailsServiceImpl.java @@ -0,0 +1,97 @@ +package com.ff.base.web.service; + +import com.ff.base.constant.Constants; +import com.ff.base.core.domain.model.LoginUser; +import com.ff.base.enums.LoginType; +import com.ff.base.enums.UserStatus; +import com.ff.base.exception.ServiceException; +import com.ff.base.system.domain.SysRole; +import com.ff.base.system.domain.SysUser; +import com.ff.base.system.domain.TenantSecretKey; +import com.ff.base.system.service.ISysMenuService; +import com.ff.base.system.service.ISysRoleService; +import com.ff.base.system.service.ISysUserService; +import com.ff.base.system.service.ITenantSecretKeyService; +import com.ff.base.utils.MessageUtils; +import com.ff.base.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Set; + +/** + * 用户验证处理 + * + * @author ff + */ +@Service +public class TenantDetailsServiceImpl implements UserDetailsService +{ + private static final Logger log = LoggerFactory.getLogger(TenantDetailsServiceImpl.class); + + @Resource + private ITenantSecretKeyService tenantSecretKeyService; + + @Resource + private SysPasswordService passwordService; + + + @Resource + private ISysMenuService menuService; + + + @Resource + private SysPermissionService permissionService; + + @Resource + private ISysRoleService roleService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException + { + + TenantSecretKey tenantSecretKey = tenantSecretKeyService.selectTenantSecretKeyByTenantKey(username); + if (StringUtils.isNull(tenantSecretKey)) + { + log.info("登录用户:{} 不存在.", username); + throw new ServiceException(MessageUtils.message("user.not.exists")); + } + else if (!tenantSecretKey.getTenantStatus()) + { + log.info("登录用户:{} 已被停用.", username); + throw new ServiceException(MessageUtils.message("user.blocked")); + } + + passwordService.validate(tenantSecretKey.getPassword()); + + return createLoginUser(tenantSecretKey); + } + + public UserDetails createLoginUser(TenantSecretKey tenantSecretKey) + { + SysRole sysRole = roleService.selectRoleByRoleKey(Constants.TENANT_ROLE); + SysUser sysUser=new SysUser(); + sysUser.setUserId(tenantSecretKey.getId()); + sysUser.setUserName(tenantSecretKey.getTenantKey()); + sysUser.setNickName(tenantSecretKey.getTenantKey()); + sysUser.setPassword(tenantSecretKey.getPassword()); + sysUser.setLoginType(LoginType.TENANT.getValue()); + sysUser.setLoginIp(tenantSecretKey.getLoginIp()); + sysUser.setLoginDate(tenantSecretKey.getLoginData()); + ArrayList sysRoles = new ArrayList<>(); + sysRoles.add(sysRole); + sysUser.setRoles(sysRoles); + sysUser.setRoleId(sysRole.getRoleId()); + sysUser.setRoleIds(new Long[]{sysRole.getRoleId()}); + + + return new LoginUser(tenantSecretKey.getId(),null, sysUser, menuService.selectMenuPermsByRoleId(sysRole.getRoleId())); + } +} diff --git a/ff-base/src/main/java/com/ff/base/web/service/UserDetailsServiceImpl.java b/ff-base/src/main/java/com/ff/base/web/service/UserDetailsServiceImpl.java index f4fdc28..8462600 100644 --- a/ff-base/src/main/java/com/ff/base/web/service/UserDetailsServiceImpl.java +++ b/ff-base/src/main/java/com/ff/base/web/service/UserDetailsServiceImpl.java @@ -1,5 +1,6 @@ package com.ff.base.web.service; +import com.ff.base.enums.LoginType; import com.ff.base.system.domain.SysUser; import com.ff.base.core.domain.model.LoginUser; import com.ff.base.enums.UserStatus; @@ -54,13 +55,14 @@ public class UserDetailsServiceImpl implements UserDetailsService throw new ServiceException(MessageUtils.message("user.blocked")); } - passwordService.validate(user); + passwordService.validate(user.getPassword()); return createLoginUser(user); } public UserDetails createLoginUser(SysUser user) { + user.setLoginType(LoginType.ADMIN.getValue()); return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); } } diff --git a/ff-base/src/main/resources/mapper/system/SysConfigMapper.xml b/ff-base/src/main/resources/mapper/system/SysConfigMapper.xml index 3f892d3..5befd53 100644 --- a/ff-base/src/main/resources/mapper/system/SysConfigMapper.xml +++ b/ff-base/src/main/resources/mapper/system/SysConfigMapper.xml @@ -73,6 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into sys_config ( + config_id, config_name, config_key, config_value, @@ -81,6 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" remark, create_time )values( + #{configId}, #{configName}, #{configKey}, #{configValue}, diff --git a/ff-base/src/main/resources/mapper/system/SysDictDataMapper.xml b/ff-base/src/main/resources/mapper/system/SysDictDataMapper.xml index ba236a1..5756669 100644 --- a/ff-base/src/main/resources/mapper/system/SysDictDataMapper.xml +++ b/ff-base/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -96,6 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into sys_dict_data( + dict_code, dict_sort, dict_label, dict_value, @@ -108,6 +109,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_by, create_time )values( + #{dictCode}, #{dictSort}, #{dictLabel}, #{dictValue}, diff --git a/ff-base/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ff-base/src/main/resources/mapper/system/SysDictTypeMapper.xml index 807f83d..9884573 100644 --- a/ff-base/src/main/resources/mapper/system/SysDictTypeMapper.xml +++ b/ff-base/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -88,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into sys_dict_type( + dict_id, dict_name, dict_type, status, @@ -95,6 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_by, create_time )values( + #{dictId}, #{dictName}, #{dictType}, #{status}, diff --git a/ff-base/src/main/resources/mapper/system/SysLogininforMapper.xml b/ff-base/src/main/resources/mapper/system/SysLogininforMapper.xml index 5033e33..5b36cee 100644 --- a/ff-base/src/main/resources/mapper/system/SysLogininforMapper.xml +++ b/ff-base/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -17,8 +17,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) - values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, UNIX_TIMESTAMP() * 1000) + insert into sys_logininfor (info_id, user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{infoId},#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, UNIX_TIMESTAMP() * 1000) - select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time from sys_menu m left join sys_role_menu rm on m.menu_id = rm.menu_id left join sys_user_role ur on rm.role_id = ur.role_id left join sys_role ro on ur.role_id = ro.role_id - left join sys_user u on ur.user_id = u.user_id - where u.user_id = #{userId} and m.menu_type in ('M', 'C') and m.status = 0 AND ro.status = 0 + where m.menu_type in ('M', 'C') and m.status = 0 AND ro.status = 0 + and ro.role_id in + + #{roleId} + + order by m.parent_id, m.order_num diff --git a/ff-base/src/main/resources/mapper/system/SysOperLogMapper.xml b/ff-base/src/main/resources/mapper/system/SysOperLogMapper.xml index 1316d3f..992dd6e 100644 --- a/ff-base/src/main/resources/mapper/system/SysOperLogMapper.xml +++ b/ff-base/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -30,8 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) - values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, UNIX_TIMESTAMP() * 1000) + insert into sys_oper_log(oper_Id,title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{operId},#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, UNIX_TIMESTAMP() * 1000) + + + - SELECT - u.id AS user_id, - u.member_account AS user_name, - u.member_account AS nick_name, - u.real_name, - u.email, - u.avatar, - u.phone_number AS phonenumber, - u.PASSWORD, - u.sex, - u.STATUS, - u.login_ip, - u.login_date, - 1 AS login_type - FROM - ff_member u - WHERE - u.member_account = #{accountName} - OR u.phone_number = #{accountName} - +