Browse Source

律师注册登录

jyc 4 weeks ago
parent
commit
b6b7233a1b

+ 136 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerUserDto.java

@@ -0,0 +1,136 @@
+package shop.alien.entity.store.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.LawyerLegalProblemScenario;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 律师用户视图对象
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "LawyerUserVo对象", description = "律师用户视图对象")
+public class LawyerUserDto implements Serializable {
+
+
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "律所id")
+    @TableField("firm_id")
+    private Integer firmId;
+
+    @ApiModelProperty(value = "手机号")
+    @TableField("phone")
+    private String phone;
+
+    @ApiModelProperty(value = "姓名")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty(value = "身份证")
+    @TableField("id_card")
+    private String idCard;
+
+    @ApiModelProperty(value = "用户状态, 0:禁用, 1:启用")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "昵称")
+    @TableField("nick_name")
+    private String nickName;
+
+    @ApiModelProperty(value = "头像")
+    @TableField("head_img")
+    private String headImg;
+
+    @ApiModelProperty(value = "律师执业证号")
+    @TableField("lawyer_certificate_no")
+    private String lawyerCertificateNo;
+
+    @ApiModelProperty(value = "所属律师事务所")
+    @TableField("law_firm")
+    private String lawFirm;
+
+    @ApiModelProperty(value = "执业年限")
+    @TableField("practice_years")
+    private Integer practiceYears;
+
+    @ApiModelProperty(value = "执业开始日期")
+    @TableField("practice_start_date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date practiceStartDate;
+
+    @ApiModelProperty(value = "专业领域,多个用逗号分隔")
+    @TableField("specialty_fields")
+    private String specialtyFields;
+
+    @ApiModelProperty(value = "执业证照片")
+    @TableField("certificate_image")
+    private String certificateImage;
+
+    @ApiModelProperty(value = "所属省份")
+    @TableField("province")
+    private String province;
+
+    @ApiModelProperty(value = "所属城市")
+    @TableField("city")
+    private String city;
+
+    @ApiModelProperty(value = "所属区县")
+    @TableField("district")
+    private String district;
+
+    @ApiModelProperty(value = "详细地址")
+    @TableField("address")
+    private String address;
+
+    @ApiModelProperty(value = "邮箱")
+    @TableField("email")
+    private String email;
+
+    @ApiModelProperty(value = "性别, 0:未知, 1:男, 2:女")
+    @TableField("gender")
+    private Integer gender;
+
+    @ApiModelProperty(value = "生日")
+    @TableField("birthday")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthday;
+
+    @ApiModelProperty(value = "个人简介(详细)")
+    @TableField("personal_introduction")
+    private String personalIntroduction;
+
+    @ApiModelProperty(value = "领域ID")
+    @TableField("lawyer_expertise_area_id")
+    private Integer lawyerExpertiseAreaId;
+
+    @ApiModelProperty(value = "法律问题场景")
+    @TableField(exist = false)
+    private List<Integer> problemScenarioIds;
+
+    @ApiModelProperty(value = "律师事务所收款账号")
+    @TableField("payment_num")
+    private String paymentNum;
+
+    @ApiModelProperty(value = "登录Token")
+    private String token;
+
+    @ApiModelProperty(value = "登录Token")
+    private String msgCode;
+}
+

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LawyerUserVo.java

@@ -297,5 +297,8 @@ public class LawyerUserVo implements Serializable {
 
     @TableField(exist = false)
     private String firmName;
+
+    @ApiModelProperty(value = "登录Token")
+    private String token;
 }
 

+ 47 - 0
alien-gateway/src/main/java/shop/alien/gateway/controller/LawyerUserLogInController.java

@@ -0,0 +1,47 @@
+package shop.alien.gateway.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import io.swagger.annotations.ApiSort;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.dto.LawyerUserDto;
+import shop.alien.entity.store.vo.LawyerUserVo;
+import shop.alien.gateway.service.LawyerUserService;
+
+/**
+ * 门店用户 前端控制器
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+@Slf4j
+@Api(tags = {"律师用户"})
+@ApiSort(8)
+@CrossOrigin
+@RestController
+@RequestMapping("/lawyer/user")
+@RequiredArgsConstructor
+public class LawyerUserLogInController {
+
+    private final LawyerUserService lawyerUserService;
+
+    @ApiOperation("律师用户登录")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/login")
+    public R<LawyerUserVo> login(@RequestBody LawyerUserDto lawyerUserDto) {
+        log.info("StoreUserController.login?lawyerUserDto={}", lawyerUserDto);
+        return lawyerUserService.logIn(lawyerUserDto);
+    }
+
+    @ApiOperation("律师用户验证码校验")
+    @ApiOperationSupport(order = 2)
+    @PostMapping("/checkMsgCode")
+    public R<LawyerUserVo> checkMsgCode(@RequestBody LawyerUserDto lawyerUserDto) {
+        log.info("StoreUserController.login?lawyerUserDto={}", lawyerUserDto);
+        return lawyerUserService.logIn(lawyerUserDto);
+    }
+}

+ 19 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/LawFirmMapper.java

@@ -0,0 +1,19 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.LawFirm;
+
+/**
+ * <p>
+ * 律所表 Mapper 接口
+ * </p>
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface LawFirmMapper extends BaseMapper<LawFirm> {
+
+}
+

+ 30 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/LawyerServiceAreaMapper.java

@@ -0,0 +1,30 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.LawyerServiceArea;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 律师服务领域关联 Mapper 接口
+ * </p>
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface LawyerServiceAreaMapper extends BaseMapper<LawyerServiceArea> {
+
+    @Select("select lsa.lawyer_user_id, llps.name from lawyer_service_area lsa \n" +
+            "left join lawyer_legal_problem_scenario llps on llps.id = lsa.problem_scenario_id \n" +
+            " ${ew.customSqlSegment}")
+    List<Map<String, Object>> getLawyerLegalProblemScenarioList(@Param(Constants.WRAPPER) QueryWrapper<LawyerServiceArea> queryWrapper);
+}
+

+ 89 - 0
alien-gateway/src/main/java/shop/alien/gateway/mapper/LawyerUserMapper.java

@@ -0,0 +1,89 @@
+package shop.alien.gateway.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
+import shop.alien.entity.store.LawyerUser;
+
+/**
+ * <p>
+ * 律师用户 Mapper 接口
+ * </p>
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface LawyerUserMapper extends BaseMapper<LawyerUser> {
+
+
+@Update("<script>" +
+        "UPDATE lawyer_user " +
+        "<set>" +
+        "<if test='firmId != null'>firm_id = #{firmId},</if>" +
+        "<if test='phone != null'>phone = #{phone},</if>" +
+        "<if test='name != null'>name = #{name},</if>" +
+        "<if test='idCard != null'>id_card = #{idCard},</if>" +
+        "<if test='password != null'>password = #{password},</if>" +
+        "<if test='payPassword != null'>pay_password = #{payPassword},</if>" +
+        "<if test='money != null'>money = #{money},</if>" +
+        "<if test='status != null'>status = #{status},</if>" +
+        "<if test='passType != null'>pass_type = #{passType},</if>" +
+        "<if test='deleteFlag != null'>delete_flag = #{deleteFlag},</if>" +
+        "<if test='createdTime != null'>created_time = #{createdTime},</if>" +
+        "<if test='createdUserId != null'>created_user_id = #{createdUserId},</if>" +
+        "<if test='updatedTime != null'>updated_time = #{updatedTime},</if>" +
+        "<if test='updatedUserId != null'>updated_user_id = #{updatedUserId},</if>" +
+        "<if test='logoutFlag != null'>logout_flag = #{logoutFlag},</if>" +
+        "<if test='logoutReason != null'>logout_reason = #{logoutReason},</if>" +
+        "<if test='logoutTime != null'>logout_time = #{logoutTime},</if>" +
+        "<if test='logoutCode != null'>logout_code = #{logoutCode},</if>" +
+        "<if test='nickName != null'>nick_name = #{nickName},</if>" +
+        "<if test='accountBlurb != null'>account_blurb = #{accountBlurb},</if>" +
+        "<if test='headImg != null'>head_img = #{headImg},</if>" +
+        "<if test='alipayAccount != null'>alipay_account = #{alipayAccount},</if>" +
+        "<if test='lawyerCertificateNo != null'>lawyer_certificate_no = #{lawyerCertificateNo},</if>" +
+        "<if test='lawFirm != null'>law_firm = #{lawFirm},</if>" +
+        "<if test='practiceYears != null'>practice_years = #{practiceYears},</if>" +
+        "<if test='practiceStartDate != null'>practice_start_date = #{practiceStartDate},</if>" +
+        "<if test='specialtyFields != null'>specialty_fields = #{specialtyFields},</if>" +
+        "<if test='certificationStatus != null'>certification_status = #{certificationStatus},</if>" +
+        "<if test='certificationFailReason != null'>certification_fail_reason = #{certificationFailReason},</if>" +
+        "<if test='certificationTime != null'>certification_time = #{certificationTime},</if>" +
+        "<if test='certificationReviewerId != null'>certification_reviewer_id = #{certificationReviewerId},</if>" +
+        "<if test='certificateImage != null'>certificate_image = #{certificateImage},</if>" +
+        "<if test='idCardFrontImage != null'>id_card_front_image = #{idCardFrontImage},</if>" +
+        "<if test='idCardBackImage != null'>id_card_back_image = #{idCardBackImage},</if>" +
+        "<if test='serviceScore != null'>service_score = #{serviceScore},</if>" +
+        "<if test='serviceCount != null'>service_count = #{serviceCount},</if>" +
+        "<if test='goodReviewCount != null'>good_review_count = #{goodReviewCount},</if>" +
+        "<if test='mediumReviewCount != null'>medium_review_count = #{mediumReviewCount},</if>" +
+        "<if test='badReviewCount != null'>bad_review_count = #{badReviewCount},</if>" +
+        "<if test='consultationFee != null'>consultation_fee = #{consultationFee},</if>" +
+        "<if test='agencyFee != null'>agency_fee = #{agencyFee},</if>" +
+        "<if test='province != null'>province = #{province},</if>" +
+        "<if test='city != null'>city = #{city},</if>" +
+        "<if test='district != null'>district = #{district},</if>" +
+        "<if test='address != null'>address = #{address},</if>" +
+        "<if test='email != null'>email = #{email},</if>" +
+        "<if test='gender != null'>gender = #{gender},</if>" +
+        "<if test='birthday != null'>birthday = #{birthday},</if>" +
+        "<if test='personalIntroduction != null'>personal_introduction = #{personalIntroduction},</if>" +
+        "<if test='educationBackground != null'>education_background = #{educationBackground},</if>" +
+        "<if test='workExperience != null'>work_experience = #{workExperience},</if>" +
+        "<if test='expertiseCases != null'>expertise_cases = #{expertiseCases},</if>" +
+        "<if test='isOnline != null'>is_online = #{isOnline},</if>" +
+        "<if test='lastOnlineTime != null'>last_online_time = #{lastOnlineTime},</if>" +
+        "<if test='isRecommended != null'>is_recommended = #{isRecommended},</if>" +
+        "<if test='recommendSort != null'>recommend_sort = #{recommendSort},</if>" +
+        "<if test='orderReceivingStatus != null'>order_receiving_status = #{orderReceivingStatus},</if>" +
+        "<if test='lawyerExpertiseAreaId != null'>lawyer_expertise_area_id = #{lawyerExpertiseAreaId},</if>" +
+        "<if test='commissionRate != null'>commission_rate = #{commissionRate},</if>" +
+        "<if test='paymentNum != null'>payment_num = #{paymentNum},</if>" +
+        "</set>" +
+        "WHERE id = #{id}" +
+        "</script>")
+Integer updateLawyerUser(LawyerUser user);
+
+}
+

+ 26 - 0
alien-gateway/src/main/java/shop/alien/gateway/service/LawyerUserService.java

@@ -0,0 +1,26 @@
+package shop.alien.gateway.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.dto.LawyerUserDto;
+import shop.alien.entity.store.vo.LawyerUserVo;
+import shop.alien.entity.store.vo.StoreUserVo;
+
+/**
+ * 二期-门店用户 服务类
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+public interface LawyerUserService extends IService<LawyerUser> {
+
+    /**
+     * 创建token
+     * @return
+     */
+    R<LawyerUserVo> createToKen(LawyerUser lawyerUser);
+    R<LawyerUserVo> logIn(LawyerUserDto lawyerUserDto);
+
+}

+ 136 - 0
alien-gateway/src/main/java/shop/alien/gateway/service/impl/LawyerUserServiceImpl.java

@@ -0,0 +1,136 @@
+package shop.alien.gateway.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LawFirm;
+import shop.alien.entity.store.LawyerServiceArea;
+import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.dto.LawyerUserDto;
+import shop.alien.entity.store.vo.LawyerUserVo;
+import shop.alien.gateway.config.BaseRedisService;
+import shop.alien.gateway.mapper.LawFirmMapper;
+import shop.alien.gateway.mapper.LawyerServiceAreaMapper;
+import shop.alien.gateway.mapper.LawyerUserMapper;
+import shop.alien.gateway.service.LawyerUserService;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 二期-门店用户 服务实现类
+ *
+ * @author ssk
+ * @since 2024-12-11
+ */
+@Transactional
+@Service
+@RequiredArgsConstructor
+public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerUser> implements LawyerUserService {
+
+    @Value("${jwt.expiration-time}")
+    private String effectiveTime;
+
+    /**
+     * 设定初始化默认密码
+     */
+
+    private final BaseRedisService baseRedisService;
+    private final LawyerUserMapper lawyerUserMapper;
+    private final LawyerServiceAreaMapper lawyerServiceAreaMapper;
+    private final LawFirmMapper lawFirmMapper;
+
+    /**
+     * token
+     *
+     * @param lawyerUser
+     * @return
+     */
+    @Override
+    public R<LawyerUserVo> createToKen(LawyerUser lawyerUser) {
+        int effectiveTimeInt = Integer.parseInt(effectiveTime.substring(0, effectiveTime.length() - 1));
+        String effectiveTimeUnit = effectiveTime.substring(effectiveTime.length() - 1);
+        long effectiveTimeIntLong = 0L;
+        switch (effectiveTimeUnit) {
+            case "s": {
+                effectiveTimeIntLong = effectiveTimeInt * 1000L;
+                break;
+            }
+            case "m": {
+                effectiveTimeIntLong = effectiveTimeInt * 60L * 1000L;
+                break;
+            }
+            case "h": {
+                effectiveTimeIntLong = effectiveTimeInt * 60L * 60L * 1000L;
+                break;
+            }
+            case "d": {
+                effectiveTimeIntLong = effectiveTimeInt * 24L * 60L * 60L * 1000L;
+                break;
+            }
+        }
+
+        LawyerUserVo lawyerUserVo = new LawyerUserVo();
+        BeanUtils.copyProperties(lawyerUser, lawyerUserVo);
+        Map<String, String> tokenMap = new HashMap<>();
+        tokenMap.put("phone", lawyerUser.getPhone());
+        tokenMap.put("userName", lawyerUser.getName());
+        tokenMap.put("userId", lawyerUser.getId().toString());
+        tokenMap.put("userType", "lawyer");
+        tokenMap.put("passType", lawyerUser.getPassType().toString());
+        lawyerUserVo.setToken(JwtUtil.createJWT("lawyer_" + lawyerUser.getPhone(), lawyerUser.getName(), JSONObject.toJSONString(tokenMap), effectiveTimeIntLong));
+        baseRedisService.setString("lawyer_" + lawyerUser.getPhone(), lawyerUserVo.getToken());
+        return R.data(lawyerUserVo);
+    }
+
+    @Override
+    public R<LawyerUserVo> logIn(LawyerUserDto lawyerUserDto) {
+        LawyerUser lawyerUser = lawyerUserMapper.selectOne(new LambdaQueryWrapper<LawyerUser>()
+                .eq(LawyerUser::getPhone, lawyerUserDto.getPhone()).last("limit 1"));
+        if (ObjectUtils.isNotEmpty(lawyerUser)) {
+            if (lawyerUser.getStatus() == 0) {
+                return R.fail("账号被禁用");
+            }
+            lawyerUser.setPassType(1);
+            return createToKen(lawyerUser);
+        }else {
+            LawyerUser user = new LawyerUser();
+            BeanUtils.copyProperties(lawyerUserDto, user);
+            user.setLogoutFlag(0);
+            user.setStatus(1);
+            user.setDeleteFlag(0);
+            user.setIsOnline(1);
+            user.setIsRecommended(0);
+            user.setOrderReceivingStatus(0);
+            lawyerUserMapper.insert(user);
+            lawyerUserDto.getProblemScenarioIds().forEach(item -> {
+                LawyerServiceArea lawyerServiceArea = new LawyerServiceArea();
+                lawyerServiceArea.setLawyerUserId(user.getId());
+                lawyerServiceArea.setProblemScenarioId(item);
+                lawyerServiceArea.setCreatedTime(new Date());
+                lawyerServiceAreaMapper.insert(lawyerServiceArea);
+            });
+            LambdaQueryWrapper<LawyerUser> lawFirmLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lawFirmLambdaQueryWrapper.eq(LawyerUser::getFirmId, lawyerUserDto.getFirmId());
+            List<LawyerUser> lawyerUsers = lawyerUserMapper.selectList(lawFirmLambdaQueryWrapper);
+            if (ObjectUtils.isNotEmpty(lawyerUsers)) {
+                String lawFirmIds = lawyerUsers.stream().map(u -> String.valueOf(u.getFirmId())).filter(Objects::nonNull).distinct().collect(Collectors.joining(","));
+                LawFirm lawFirm = new LawFirm();
+                lawFirm.setId(lawyerUserDto.getFirmId());
+                lawFirm.setPaymentAccount(lawFirmIds);
+                lawFirmMapper.updateById(lawFirm);
+            }
+            user.setPassType(0);
+            return createToKen(user);
+        }
+    }
+
+}

+ 41 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/AliController.java

@@ -0,0 +1,41 @@
+package shop.alien.lawyer.controller;
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import shop.alien.entity.result.R;
+import shop.alien.lawyer.util.AliSms;
+
+/**
+ * @author ssk
+ * @version 1.0
+ * @date 2024/12/11 17:34
+ */
+@Slf4j
+@Api(tags = {"二期-阿里接口"})
+@ApiSort(9)
+@CrossOrigin
+@RestController
+@RequestMapping("/ali")
+@RequiredArgsConstructor
+public class AliController {
+
+    private final AliSms aliSmsConfig;
+
+    @ApiOperation("发送短信")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/sendSms")
+    public R sendSms(String phone) {
+        Integer code = aliSmsConfig.sendSms(phone);
+        log.info("AliController.sendSms?phone={}&code={}", phone, code);
+        if (code != null) {
+            return R.data(code);
+        }
+        return R.fail("短信发送失败");
+    }
+}

+ 2 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerLegalProblemScenarioController.java

@@ -1,6 +1,7 @@
 package shop.alien.lawyer.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -94,7 +95,7 @@ public class LawyerLegalProblemScenarioController {
         for (LawyerLegalProblemScenario item : list) {
             Integer id = item.getId();
             LawyerImg a = lawyerImgMapper.getLawyerImgById(id);
-            item.setImgUrl(a.getImgUrl());
+            item.setImgUrl(ObjectUtils.isNotEmpty(a) ? a.getImgUrl() : "");
         }
 
         return R.data(list);

+ 98 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/util/AliSms.java

@@ -0,0 +1,98 @@
+package shop.alien.lawyer.util;
+
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import com.aliyun.teautil.models.RuntimeOptions;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import shop.alien.util.common.RandomCreateUtil;
+import shop.alien.lawyer.config.BaseRedisService;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 阿里云验证码配置
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2024/12/12 10:17
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class AliSms {
+    private final BaseRedisService baseRedisService;
+
+    @Value("${ali.sms.accessKeyId}")
+    private String accessKeyId;
+
+    @Value("${ali.sms.accessKeySecret}")
+    private String accessKeySecret;
+
+    @Value("${ali.sms.endPoint}")
+    private String endPoint;
+
+    @Value("${ali.sms.signName}")
+    private String signName;
+
+    @Value("${ali.sms.templateCode}")
+    private String templateCode;
+
+    /**
+     * 发送验证码
+     *
+     * @param phone 手机号
+     * @return 验证码
+     */
+    public Integer sendSms(String phone) {
+        log.info("AliSmsConfig.sendSms?phone={}", phone);
+        try {
+            // -----------------测试用手机号--------------------------------------------------------------------------------------------
+            List<String> phoneList = Arrays.asList("19999990001", "19999990002", "19999990003", "19999990004", "19999990005", "19999990006", "19999990007", "19999990008", "19999990009", "19999990010",
+                    "16666660001", "16666660002", "16666660003", "16666660004", "16666660005", "16666660006", "16666660007", "16666660008", "16666660009", "16666660010");
+            if (phoneList.contains(phone)) {
+                // 验证码发送成功,将验证码保存到redis中 设置60秒过期
+                baseRedisService.setString("verification_lawyer_"+phone,"123456",Long.valueOf(300));
+                return 123456;
+            }
+            // -----------------测试用手机号--------------------------------------------------------------------------------------------
+
+            Config config = new Config()
+                    .setEndpoint(endPoint)
+                    .setAccessKeyId(accessKeyId)
+                    .setAccessKeySecret(accessKeySecret);
+            Integer code = RandomCreateUtil.getRandomNum(100000, 999999);
+
+            // 构建发送请求
+            SendSmsRequest sendSmsRequest = new SendSmsRequest()
+                    // 设置签名
+                    .setSignName(signName)
+                    // 设置模板
+                    .setTemplateCode(templateCode)
+                    // 设置手机号为参数传入的值
+                    .setPhoneNumbers(phone)
+                    // 设置模板参数为传入的验证码
+                    .setTemplateParam("{\"code\":\"" + code + "\"}");
+            // 运行时选择,可以设置不同的属性来配置运行时环境的参数。
+            RuntimeOptions runtime = new RuntimeOptions();
+            Client client = new Client(config);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
+            if (!"OK".equals(sendSmsResponse.getBody().getCode())) {
+                return null;
+            }
+            // 验证码发送成功,将验证码保存到redis中 设置60秒过期
+            baseRedisService.setString("verification_lawyer_"+phone,code.toString(),Long.valueOf(60));
+            return code;
+        } catch (Exception e) {
+            log.error("AliSmsConfig.sendSms ERROR Msg={}", e.getMessage());
+            return null;
+        }
+    }
+
+}