Переглянути джерело

Merge branch 'main' of http://43.137.10.199:81/hfln/hfln-portal-service

hxd 3 місяців тому
батько
коміт
c623d6b890
16 змінених файлів з 595 додано та 40 видалено
  1. 3 2
      portal-service-application/src/main/java/com/hfln/portal/application/controller/admin/AdminDataController.java
  2. 60 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/admin/AdminLoginController.java
  3. 2 0
      portal-service-common/src/main/java/com/hfln/portal/common/constant/redis/RedisCacheConstant.java
  4. 20 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/admin/AdminLoginParam.java
  5. 27 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/admin/AdminResetParam.java
  6. 209 0
      portal-service-common/src/main/java/com/hfln/portal/common/request/admin/DeviceAddParam.java
  7. 20 0
      portal-service-common/src/main/java/com/hfln/portal/common/response/admin/AdminLoginRes.java
  8. 12 3
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/AdminGateway.java
  9. 1 1
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/sms/SmsGateway.java
  10. 92 33
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/AdminGatewayImpl.java
  11. 25 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/sms/SmsGatewayImpl.java
  12. 9 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/AdminUserInfoMapper.java
  13. 57 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/AdminUserInfo.java
  14. 12 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/AdminUserService.java
  15. 41 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/AdminUserServiceImpl.java
  16. 5 1
      portal-service-server/src/main/resources/bootstrap-test.yml

+ 3 - 2
portal-service-application/src/main/java/com/hfln/portal/application/controller/admin/AdminDataController.java

@@ -3,6 +3,7 @@ package com.hfln.portal.application.controller.admin;
 import cn.hfln.framework.catchlog.CatchAndLog;
 import cn.hfln.framework.dto.ApiResult;
 import com.hfln.portal.common.dto.data.device.DeviceDTO;
+import com.hfln.portal.common.request.admin.DeviceAddParam;
 import com.hfln.portal.common.request.device.DeviceListQueryReq;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.common.vo.UploadRes;
@@ -41,8 +42,8 @@ public class AdminDataController {
 
     @PostMapping("/addOneDevice")
     @Operation(summary = "添加上传设备信息")
-    public ApiResult<Void> addOneDevice(@Valid @RequestBody DeviceDTO deviceDTO) {
-        adminGateway.addOneDevice(deviceDTO);
+    public ApiResult<Void> addOneDevice(@Valid @RequestBody DeviceAddParam addParam) {
+        adminGateway.addOneDevice(addParam);
         return ApiResult.success();
     }
 

+ 60 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/admin/AdminLoginController.java

@@ -0,0 +1,60 @@
+
+package com.hfln.portal.application.controller.admin;
+
+
+import cn.hfln.framework.catchlog.CatchAndLog;
+import cn.hfln.framework.dto.ApiResult;
+import com.hfln.portal.common.request.admin.AdminLoginParam;
+import com.hfln.portal.common.request.admin.AdminResetParam;
+import com.hfln.portal.common.response.admin.AdminLoginRes;
+import com.hfln.portal.domain.gateway.AdminGateway;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+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.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@RestController
+@CatchAndLog
+@Tag(name = "管理登录")
+@Slf4j
+@RequestMapping("/admin/manage")
+public class AdminLoginController {
+
+    @Autowired
+    private AdminGateway adminGateway;
+
+
+    /**
+     * 	port 项目加一个 网页登录接口  账号密码登录,要录入手机号,加上 忘记密码 功能
+     * 		网页给不给 c端用,只给b端用
+     */
+    @PostMapping("/login")
+    @Operation(summary = "账户密码登录")
+    public ApiResult<AdminLoginRes> login(@Valid @RequestBody AdminLoginParam param) {
+
+        return ApiResult.success(adminGateway.login(param));
+    }
+
+    @PostMapping("/sendCode")
+    @Operation(summary = "忘记密码,发送验证码")
+    public ApiResult<Void> sendCode() {
+
+        adminGateway.sendCode();
+        return ApiResult.success();
+    }
+
+
+    @PostMapping("/reset")
+    @Operation(summary = "重置密码")
+    public ApiResult<Void> resetPassword(@Valid @RequestBody AdminResetParam param) {
+
+        adminGateway.reset(param);
+        return ApiResult.success();
+    }
+}

+ 2 - 0
portal-service-common/src/main/java/com/hfln/portal/common/constant/redis/RedisCacheConstant.java

@@ -10,8 +10,10 @@ public interface RedisCacheConstant {
      */
     String SMS_LOGIN_CODE = "sms:login:";
     String SMS_SIGNUP_CODE = "sms:signup:";
+    String SMS_RESET_CODE = "sms:reset:";
     String SMS_SEND_LOGIN_TIME = "sms:login:frequency:";
     String SMS_SEND_SIGNUP_TIME = "sms:signup:frequency:";
+    String SMS_SEND_RESET_TIME = "sms:signup:frequency:";
 
 
 

+ 20 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/admin/AdminLoginParam.java

@@ -0,0 +1,20 @@
+package com.hfln.portal.common.request.admin;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+
+@Data
+public class AdminLoginParam {
+
+    @Schema(description = "账号")
+    @NotBlank(message = "账号不能为空")
+    private String account;
+
+    @Schema(description = "密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+}

+ 27 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/admin/AdminResetParam.java

@@ -0,0 +1,27 @@
+package com.hfln.portal.common.request.admin;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+
+@Data
+public class AdminResetParam {
+
+    @Schema(description = "账号")
+    @NotBlank(message = "账号不能为空")
+    private String account;
+
+    @Schema(description = "密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    @Schema(description = "手机号")
+    @NotBlank(message = "手机号不能为空")
+    private String phone;
+
+    @Schema(description = "验证码")
+    @NotBlank(message = "验证码不能为空")
+    private String code;
+}

+ 209 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/admin/DeviceAddParam.java

@@ -0,0 +1,209 @@
+package com.hfln.portal.common.request.admin;
+
+import com.hfln.portal.common.vo.BaseVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class DeviceAddParam extends BaseVO {
+    /**
+     * 主键ID
+     */
+    @Schema(description = "主键ID")
+    private Long devId;
+
+    /**
+     * 设备ID
+     */
+    @Schema(description = "设备ID")
+    private String clientId;
+
+    /**
+     * 用户openid
+     */
+    @Schema(description = "用户Id")
+    private Long userId;
+
+    /**
+     * 设备名称
+     */
+    @Schema(description = "设备名称")
+    private String devName;
+
+    /**
+     * 设备类型
+     */
+    @Schema(description = "设备类型")
+    private String devType;
+
+    /**
+     * 在线状态:0-离线,1-在线
+     */
+    @Schema(description = "在线状态:0-离线,1-在线")
+    private Integer online;
+
+    /**
+     * 设备报警:0-正常,1-报警
+     */
+    @Schema(description = "设备报警:0-正常,1-报警")
+    private Integer devWarn;
+
+    /**
+     * 软件版本号
+     */
+    @Schema(description = "软件版本号")
+    private String software;
+
+    /**
+     * 硬件版本号
+     */
+    @Schema(description = "硬件版本号")
+    private String hardware;
+
+    /**
+     * wifi名称
+     */
+    @Schema(description = "wifi名称")
+    private String wifiName;
+
+    /**
+     * wifi密码
+     */
+    @Schema(description = " wifi密码")
+    private String wifiPassword;
+
+    /**
+     * ip地址
+     */
+    @Schema(description = "ip地址")
+    private String ip;
+
+    /**
+     * 安装方式:Wall-墙装,Ceiling-顶装
+     */
+    @Schema(description = "安装方式:Wall-墙装,Ceiling-顶装")
+    private String mountPlain;
+
+    /**
+     * 跟踪区域起始X坐标
+     */
+    @Schema(description = "跟踪区域起始X坐标")
+    private BigDecimal startX;
+
+    /**
+     * 跟踪区域起始Y坐标
+     */
+    @Schema(description = "跟踪区域起始Y坐标")
+    private BigDecimal startY;
+
+    /**
+     * 跟踪区域起始Z坐标
+     */
+    @Schema(description = "跟踪区域起始Z坐标")
+    private BigDecimal startZ;
+
+    /**
+     * 跟踪区域结束X坐标
+     */
+    @Schema(description = "跟踪区域结束X坐标")
+    private BigDecimal stopX;
+
+    /**
+     * 跟踪区域结束Y坐标
+     */
+    @Schema(description = "跟踪区域结束Y坐标")
+    private BigDecimal stopY;
+
+    /**
+     * 跟踪区域结束Z坐标
+     */
+    @Schema(description = "跟踪区域结束Z坐标")
+    private BigDecimal stopZ;
+
+    /**
+     * 安装高度
+     */
+    @Schema(description = "安装高度")
+    private BigDecimal height;
+
+    /**
+     * 房间长度
+     */
+    @Schema(description = "房间长度")
+    private BigDecimal length;
+
+    /**
+     * 房间宽度
+     */
+    @Schema(description = "房间宽度")
+    private BigDecimal width;
+
+    /**
+     * target数组
+     */
+    @Schema(description = "target数组")
+    private Object targetPoints;
+
+    /**
+     * 接收target时间
+     */
+    @Schema(description = "接收target时间")
+    private LocalDateTime signalTime;
+
+    /**
+     * 北向夹角
+     */
+    @Schema(description = "北向夹角")
+    private BigDecimal northAngle;
+
+    /**
+     * 安装坐标x
+     */
+    @Schema(description = "安装坐标x")
+    private BigDecimal x;
+
+    /**
+     * 安装坐标y
+     */
+    @Schema(description = "安装坐标y")
+    private BigDecimal y;
+
+    /**
+     * 指示灯开关:0-关闭,1-开启
+     */
+    @Schema(description = "指示灯开关:0-关闭,1-开启")
+    private Integer statusLight;
+
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createId;
+
+
+    /**
+     * 修改人
+     */
+
+    @Schema(description = "修改人")
+    private String updateId;
+
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+}

+ 20 - 0
portal-service-common/src/main/java/com/hfln/portal/common/response/admin/AdminLoginRes.java

@@ -0,0 +1,20 @@
+package com.hfln.portal.common.response.admin;
+
+import com.hfln.portal.common.response.user.UserTokenInfo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+@Data
+public class AdminLoginRes extends UserTokenInfo {
+
+    @Schema(description = "userId")
+    private Long userId;
+
+    @Schema(description = "账户")
+    private String account;
+
+//    @Schema(description = "手机号")
+//    private String phone;
+
+}

+ 12 - 3
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/AdminGateway.java

@@ -1,19 +1,28 @@
 package com.hfln.portal.domain.gateway;
 
 import com.hfln.portal.common.dto.data.device.DeviceDTO;
+import com.hfln.portal.common.request.admin.AdminLoginParam;
+import com.hfln.portal.common.request.admin.AdminResetParam;
+import com.hfln.portal.common.request.admin.DeviceAddParam;
 import com.hfln.portal.common.request.device.DeviceListQueryReq;
+import com.hfln.portal.common.response.admin.AdminLoginRes;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.common.vo.UploadRes;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.validation.Valid;
 import java.io.IOException;
 
 public interface AdminGateway {
 
     UploadRes uploadDev(MultipartFile file) throws IOException;
 
-    PageRecord<DeviceDTO> queryDevList(@Valid DeviceListQueryReq queryReq);
+    PageRecord<DeviceDTO> queryDevList(DeviceListQueryReq queryReq);
 
-    void addOneDevice(@Valid DeviceDTO deviceDTO);
+    void addOneDevice(DeviceAddParam deviceAddParam);
+
+    AdminLoginRes login(AdminLoginParam param);
+
+    void sendCode();
+
+    void reset(AdminResetParam param);
 }

+ 1 - 1
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/sms/SmsGateway.java

@@ -10,6 +10,6 @@ public interface SmsGateway {
 
     Boolean sendSignupSmsCode(String phone);
 
-
+    Boolean sendResetSmsCode(String phone);
 
 }

+ 92 - 33
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/AdminGatewayImpl.java

@@ -1,30 +1,44 @@
 package com.hfln.portal.infrastructure.gateway.impl;
 
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hfln.framework.common.redis.service.RedisService;
 import cn.hfln.framework.extension.BizException;
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hfln.portal.common.constant.redis.RedisCacheConstant;
 import com.hfln.portal.common.dto.DevInfoImportDto;
 import com.hfln.portal.common.dto.data.device.DeviceDTO;
+import com.hfln.portal.common.request.admin.AdminLoginParam;
+import com.hfln.portal.common.request.admin.AdminResetParam;
+import com.hfln.portal.common.request.admin.DeviceAddParam;
 import com.hfln.portal.common.request.device.DeviceListQueryReq;
+import com.hfln.portal.common.response.admin.AdminLoginRes;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.common.vo.UploadRes;
+import com.hfln.portal.domain.customer.DeviceType;
 import com.hfln.portal.domain.customer.util.CopyUtils;
+import com.hfln.portal.domain.customer.util.PasswordUtil;
 import com.hfln.portal.domain.exception.ErrorEnum;
 import com.hfln.portal.domain.gateway.AdminGateway;
-import com.hfln.portal.infrastructure.mqtt.MqttClient;
-import com.hfln.portal.infrastructure.oss.OssClient;
+import com.hfln.portal.domain.gateway.sms.SmsGateway;
+import com.hfln.portal.infrastructure.po.AdminUserInfo;
 import com.hfln.portal.infrastructure.po.BasePO;
 import com.hfln.portal.infrastructure.po.DevInfo;
-import com.hfln.portal.infrastructure.service.*;
+import com.hfln.portal.infrastructure.service.AdminUserService;
+import com.hfln.portal.infrastructure.service.DevInfoService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -32,38 +46,16 @@ import java.util.stream.Collectors;
 public class AdminGatewayImpl implements AdminGateway {
 
     @Autowired
-    private DevShareService devShareService;
-
-    @Autowired
     private DevInfoService devInfoService;
 
     @Autowired
-    private GroupShareService groupShareService;
-
-    @Autowired
-    private DevGroupService devGroupService;
-
-    @Autowired
-    private EventService eventService;
-
-    @Autowired
-    private OssFileService ossFileService;
-
-    @Autowired
-    private DevRoomService devRoomService;
+    private RedisService redisService;
 
     @Autowired
-    private UserService userService;
+    private AdminUserService adminUserService;
 
     @Autowired
-    private MqttClient mqttClient;
-
-    @Autowired
-    private OssClient ossClient;
-
-    @Autowired
-    private AlarmEventService alarmEventService;
-
+    private SmsGateway smsGateway;
 
     @Override
     public UploadRes uploadDev(MultipartFile file) throws IOException {
@@ -120,17 +112,17 @@ public class AdminGatewayImpl implements AdminGateway {
     }
 
     @Override
-    public void addOneDevice(DeviceDTO deviceDTO) {
+    public void addOneDevice(DeviceAddParam deviceAddParam) {
 
-        DevInfo devInfo = devInfoService.queryOneByClientId(deviceDTO.getClientId());
+        DevInfo devInfo = devInfoService.queryOneByClientId(deviceAddParam.getClientId());
         if (devInfo != null) {
             throw new BizException(ErrorEnum.DEVICE_IS_EXIST.getErrorCode(), ErrorEnum.DEVICE_IS_EXIST.getErrorMessage());
         }
 
         DevInfo saveInfo = new DevInfo();
-        saveInfo.setClientId(deviceDTO.getClientId());
-        saveInfo.setDevType(deviceDTO.getDevType());
-        saveInfo.setSoftware(deviceDTO.getSoftware());
+        saveInfo.setClientId(deviceAddParam.getClientId());
+        saveInfo.setDevType(deviceAddParam.getDevType());
+        saveInfo.setSoftware(deviceAddParam.getSoftware());
         saveInfo.setStatusLight(1);
         saveInfo.setOnline(0);
         saveInfo.setIsDeleted(BasePO.DeleteFlag.NOT_DELETED);
@@ -140,4 +132,71 @@ public class AdminGatewayImpl implements AdminGateway {
         devInfoService.save(saveInfo);
 
     }
+
+    @Override
+    public AdminLoginRes login(AdminLoginParam param) {
+
+        AdminUserInfo adminUser = adminUserService.checkUserByPassword(param.getAccount(), param.getPassword());
+        if (Objects.isNull(adminUser)) {
+            throw new BizException(ErrorEnum.USERNAME_OR_PASSWORD_ERROR.getErrorCode(), ErrorEnum.USERNAME_OR_PASSWORD_ERROR.getErrorMessage());
+        }
+
+        //  这里如果使用 多账号体系,需要新建一个类似 SptUtil 的 SptAdminUtil , 且在 gateway 校验的逻辑中,需要加上 对 SptAdminUtil 的判断
+        // 1 需要保证 userId 和 adminUserId 不能一样
+        // 2 可以在 stputil.login 的 loginId 参数前加前缀 user_ or admin_
+        // 3 添加 SptAdminUtil,不过在不同地方,需要注意对 stputil sptadminutil 的不同引用
+        StpUtil.login(adminUser.getUserId(), DeviceType.WEB.getCode());
+        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
+        AdminLoginRes res = CopyUtils.copy(tokenInfo, AdminLoginRes.class);
+        BeanUtils.copyProperties(adminUser, res);
+        return res;
+    }
+
+    @Override
+    public void sendCode() {
+
+        Object loginIdObj = StpUtil.getLoginId();
+        AdminUserInfo adminUserInfo = adminUserService.getById(Long.parseLong(String.valueOf(loginIdObj)));
+        if (adminUserInfo == null || !StringUtils.hasText(adminUserInfo.getPhone())) {
+            throw new BizException(ErrorEnum.PHONE_IS_NULL.getErrorCode(), ErrorEnum.PHONE_IS_NULL.getErrorMessage());
+        }
+
+        smsGateway.sendResetSmsCode(adminUserInfo.getPhone());
+    }
+
+    @Override
+    public void reset(AdminResetParam request) {
+
+        //校验验证码
+        String redisKey = RedisCacheConstant.SMS_RESET_CODE + request.getPhone();
+        log.info("验证注册验证码:手机号={}, 输入验证码={}, Redis key={}", request.getPhone(), request.getCode(), redisKey);
+
+        Object cacheCodeObj = redisService.getCacheObject(redisKey);
+        log.info("从Redis获取验证码:key={}, value={}", redisKey, cacheCodeObj);
+
+        if (Objects.isNull(cacheCodeObj)) {
+            log.warn("验证码已过期或不存在:手机号={}, Redis key={}", request.getPhone(), redisKey);
+            throw new BizException(ErrorEnum.SMS_CODE_EXPIRED.getErrorCode(), ErrorEnum.SMS_CODE_EXPIRED.getErrorMessage());
+        }
+        String cacheCode = String.valueOf(cacheCodeObj);
+        log.info("验证码比较:输入={}, 缓存={}", request.getCode(), cacheCode);
+
+        if (!Objects.equals(cacheCode, request.getCode())) {
+            log.warn("验证码错误:手机号={}, 输入={}, 缓存={}", request.getPhone(), request.getCode(), cacheCode);
+            throw new BizException(ErrorEnum.SMS_CODE_ERROR.getErrorCode(), ErrorEnum.SMS_CODE_ERROR.getErrorMessage());
+
+        }
+
+        // 验证通过 清除验证码入库
+        redisService.deleteObject(redisKey);
+
+        AdminUserInfo adminUser = adminUserService.queryByPhone(request.getPhone());
+        if (adminUser == null) {
+            log.warn("手机号不存在错误:手机号={}", request.getPhone());
+            throw new BizException(ErrorEnum.USER_NOT_FOUND.getErrorCode(), ErrorEnum.USER_NOT_FOUND.getErrorMessage());
+         }
+
+        adminUser.setPassword(PasswordUtil.encrypt(request.getPassword()));
+        adminUserService.updateById(adminUser);
+    }
 }

+ 25 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/sms/SmsGatewayImpl.java

@@ -71,6 +71,31 @@ public class SmsGatewayImpl implements SmsGateway {
         return false;
     }
 
+    @Override
+    public Boolean sendResetSmsCode(String phone) {
+        // 限制短信发送不超过一分钟一次
+        String key = RedisCacheConstant.SMS_SEND_RESET_TIME + phone;
+        Boolean hasKey = redisService.hasKey(key);
+        if (hasKey) {
+            throw new BizException(ErrorEnum.FREQUENT_SMS_SENDING.getErrorCode(), ErrorEnum.FREQUENT_SMS_SENDING.getErrorMessage());
+        }
+        int captcha = (int) ((Math.random() * 9 + 1) * 1000);
+        log.info("生成注册验证码:手机号={}, 验证码={}", phone, captcha);
+
+        String sentLoginMsg = msgClient.sendRegisterMsg(phone, String.valueOf(captcha));
+        if (Objects.nonNull(sentLoginMsg)) {
+            // 存入redis  过期时间十分钟
+            String redisKey = RedisCacheConstant.SMS_RESET_CODE + phone;
+            redisService.setCacheObject(redisKey, captcha, 10L, TimeUnit.MINUTES);
+            log.info("验证码已存入Redis:key={}, value={}, 过期时间=10分钟", redisKey, captcha);
 
+            // 验证是否存储成功
+            Object storedValue = redisService.getCacheObject(redisKey);
+            log.info("验证存储结果:key={}, 存储的值={}", redisKey, storedValue);
+            return true;
+        }
+        log.warn("短信发送失败:手机号={}, 验证码={}", phone, captcha);
+        return false;
+    }
 
 }

+ 9 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/mapper/AdminUserInfoMapper.java

@@ -0,0 +1,9 @@
+package com.hfln.portal.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.portal.infrastructure.po.AdminUserInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AdminUserInfoMapper extends BaseMapper<AdminUserInfo> {
+}

+ 57 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/po/AdminUserInfo.java

@@ -0,0 +1,57 @@
+package com.hfln.portal.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("admin_user_info")
+public class AdminUserInfo extends BasePO {
+
+    /**
+     * 主键ID,数据库自增策略
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long userId;
+
+    /**
+     * 账户
+     */
+    private String account;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 12 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/AdminUserService.java

@@ -0,0 +1,12 @@
+package com.hfln.portal.infrastructure.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hfln.portal.infrastructure.po.AdminUserInfo;
+
+public interface AdminUserService extends IService<AdminUserInfo> {
+
+    AdminUserInfo checkUserByPassword(String account, String password);
+
+    AdminUserInfo queryByPhone(String phone);
+
+}

+ 41 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/AdminUserServiceImpl.java

@@ -0,0 +1,41 @@
+package com.hfln.portal.infrastructure.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hfln.portal.domain.customer.util.PasswordUtil;
+import com.hfln.portal.infrastructure.mapper.AdminUserInfoMapper;
+import com.hfln.portal.infrastructure.po.AdminUserInfo;
+import com.hfln.portal.infrastructure.po.BasePO;
+import com.hfln.portal.infrastructure.service.AdminUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+@Service
+@Slf4j
+public class AdminUserServiceImpl extends ServiceImpl<AdminUserInfoMapper, AdminUserInfo> implements AdminUserService {
+
+    @Override
+    public AdminUserInfo checkUserByPassword(String account, String password) {
+        LambdaQueryWrapper<AdminUserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AdminUserInfo::getAccount, account);
+        queryWrapper.eq(AdminUserInfo::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
+        AdminUserInfo userInfo = this.baseMapper.selectOne(queryWrapper);
+        if (Objects.nonNull(password)) {
+            if (PasswordUtil.matches(password, userInfo.getPassword())){
+                return userInfo;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public AdminUserInfo queryByPhone(String phone) {
+        LambdaQueryWrapper<AdminUserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AdminUserInfo::getPhone, phone);
+        queryWrapper.eq(AdminUserInfo::getIsDeleted, BasePO.DeleteFlag.NOT_DELETED);
+        AdminUserInfo userInfo = this.baseMapper.selectOne(queryWrapper);
+        return userInfo;
+    }
+}

+ 5 - 1
portal-service-server/src/main/resources/bootstrap-test.yml

@@ -90,11 +90,15 @@ sa-token:
 
 # mqtt相关
 mqtt:
+  enabled: true
   broker: tcp://8.130.28.21:1883
   client-id: ${spring.application.name}-${random.uuid}
   username: admin
   password: public
-
+  timeout: 30
+  keepalive: 60
+  clean-session: true
+  automatic-reconnect: true
 
 # oss 存储
 oss: