瀏覽代碼

Merge remote-tracking branch 'origin/feature/0721-tenant' into feature/0721-tenant

yuanliang 1 年之前
父節點
當前提交
2c94dc4315
共有 13 個文件被更改,包括 250 次插入8 次删除
  1. 88 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/SmsCodeController.java
  2. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  3. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java
  4. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  5. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantApplyRecordServiceImpl.java
  6. 8 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  7. 42 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  8. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  9. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java
  10. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java
  11. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumPurchaseWrapper.java
  12. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumPurchaseMapper.xml
  13. 88 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SmsCodeController.java

+ 88 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/controller/SmsCodeController.java

@@ -0,0 +1,88 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.wf.captcha.SpecCaptcha;
+import com.wf.captcha.utils.CaptchaUtil;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.security.SecurityConstants;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("${app-config.url.tenant:}/code")
+@Api(tags = "验证码服务")
+public class SmsCodeController extends BaseController {
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+    @Autowired
+    private RedisTemplate<String,String> redisTemplate;
+
+    @ApiOperation(value = "发送短信验证码")
+    @ApiImplicitParams({  @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
+                          @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号,LOGOFF:用户注销)", required = true, dataType = "String") })
+    @PostMapping(value = "/sendSmsCode")
+    public Object sendLoginVerifyCode(String mobile,String type) throws Exception {
+        smsCodeService.sendValidCode(mobile, type, ClientEnum.TEACHER);
+        return succeed();
+    }
+
+    @ApiOperation(value = "校验短信验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+                         @ApiImplicitParam(name = "code", value = "短信验证码", required = true, dataType = "String"),
+                         @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required = true, dataType = "String") })
+    @PostMapping(value = "/verifySmsCode")
+    public Object verifySmsCode(String phone,String code,String type) {
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        if(smsCodeService.verifyValidCode(phone, code, type)){
+            return succeed();
+        }
+        return failed("验证码校验失败");
+    }
+
+    @PostMapping(value = "/verifyImageCode")
+    @ApiOperation("校验登录图形验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "code", value = "验证码", required = true, dataType = "String") })
+    public Object verifyImageCode(String phone,String code){
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        String redisKey = MessageTypeEnum.KAPTCHA_SESSION_KEY + phone;
+        if(redisTemplate.hasKey(redisKey)){
+            if(StringUtils.equalsIgnoreCase(redisTemplate.opsForValue().get(redisKey),code)){
+                return succeed();
+            }
+        }
+        return failed(SecurityConstants.VERIFY_FAILURE);
+    }
+
+    @RequestMapping("/getImageCode")
+    @ApiOperation("获取登录图片验证码")
+    @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String")
+    public void getLoginImage(HttpServletRequest request, HttpServletResponse response,String phone) throws Exception {
+        if(StringUtils.isEmpty(phone)){
+            throw new BizException("请输入手机号");
+        }
+        SpecCaptcha specCaptcha = new SpecCaptcha(125, 45, 4);
+        redisTemplate.opsForValue().set(MessageTypeEnum.KAPTCHA_SESSION_KEY + phone,specCaptcha.text(),3, TimeUnit.MINUTES);
+        CaptchaUtil.out(specCaptcha, request, response);
+    }
+}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java

@@ -246,7 +246,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
                     .parseObject(userPaymentOrder.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
 
-            tenantdivMap.put(-1L, tenantAlbumContent.getOriginalPrice());
+            tenantdivMap.put(-1L, tenantAlbumContent.getSalePrice());
 
             BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice());
 

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumMusicServiceImpl.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,6 +69,9 @@ public class TenantAlbumMusicServiceImpl extends ServiceImpl<TenantAlbumMusicMap
     @Override
     public IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> selectPage(IPage<TenantAlbumMusicWrapper.StudentTenantAlbumMusic> page, TenantAlbumMusicWrapper.StudentTenantAlbumMusicQuery query) {
         List<Long> albumIds = query.getAlbumIds();
+        if (CollectionUtils.isEmpty(albumIds)){
+            throw new BizException("该机构未绑定相关专辑");
+        }
         SubjectTypeEnum subjectType = query.getSubjectType();
         String s = subjectType.toString();
         String type = query.getType();

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java

@@ -393,7 +393,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
 
         TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
-                .parseObject(JSON.toJSONString(orderGoodsInfo.getBizContent()), TenantAlbumWrapper.TenantAlbumContent.class);
+                .parseObject(orderGoodsInfo.getUserOrderDetail().getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
         TenantAlbumPurchase tenantAlbumPurchase = new TenantAlbumPurchase();
         tenantAlbumPurchase.setTenantId(tenantAlbumContent.getTenantId());
         tenantAlbumPurchase.setTenantAlbumId(orderGoodsInfo.getBizId());

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantApplyRecordServiceImpl.java

@@ -287,6 +287,7 @@ public class TenantApplyRecordServiceImpl extends ServiceImpl<TenantApplyRecordM
         tenantApplyRecord.setPhone(applyRecord.getPhone());
         tenantApplyRecord.setVerifyUserId(verifyUserId);
         tenantApplyRecord.setReason(entry.getReason());
+        tenantApplyRecord.setBriefIntroduction(applyRecord.getBriefIntroduction());
         if (ifPass == true){
             tenantApplyRecord.setStatus(AuthStatusEnum.PASS);
             //更改当前记录的审核状态

+ 8 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java

@@ -212,9 +212,11 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         if (StringUtils.isNotEmpty(phone)){
             List<TenantInfo> list = tenantInfoService.lambdaQuery().eq(TenantInfo::getPhone, phone).list();
             if (CollectionUtils.isNotEmpty(list)){
-                 oldInfo = list.get(0);
+                throw new BizException("手机号已经注册机构账号");
             }
         }
+
+
         SysUser sysUser = getOrCreateAccount(tenantInfo, oldInfo);
         tenantInfo.setEnableFlag(true);
         if (StringUtils.isEmpty(tenantInfo.getLogo())) {
@@ -247,11 +249,15 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
             sysUser = sysUsers.get(0);
             TenantStaff tenantStaff = tenantStaffMapper.selectByUserId(sysUser.getId());
             if ( !ObjectUtil.isEmpty(tenantStaff) && !ObjectUtil.isEmpty(oldTenantInfo) &&
-                    tenantStaff.getUserId().equals(oldTenantInfo.getUserId())) {
+                    !tenantInfo.getPhone().equals(oldTenantInfo.getPhone())) {
                 throw new BizException("手机号已经注册机构账号");
             }
             //获取当前账户的用户类型
             String userType = sysUser.getUserType();
+
+            if (userType.contains(SysUserType.SYSTEM.getCode())){
+                throw new BizException("该手机号已注册机构");
+            }
             //设置默认机构类型
             String tenantUserType = SysUserType.ORGANIZATION.getCode();
             if (StringUtils.isEmpty(userType)) {

+ 42 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -3,8 +3,12 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
+import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -329,13 +333,48 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 || OrderStatusEnum.PAYING.equals(detail.getStatus())) {
 
             if (OrderStatusEnum.CLOSE.equals(orderStatus)) {
-                doOrderCancel(detail, orderStatus, "测试接口-订单关闭");
+                if (detail.getPaymentVersion().equals(EPaymentVersion.V1))
+                    doOrderCancel(detail, orderStatus, "测试接口-订单关闭");
+                else {
+                    // 用户取消支付
+                    userPaymentCoreService.cancelPayment(JwtUserInfo.builder().userId(detail.getUserId().toString())
+                            .clientType(detail.getPaymentClient()).build(), orderNo);
+                }
             }
             if (OrderStatusEnum.FAIL.equals(orderStatus)) {
-                doOrderCancel(detail, orderStatus, "测试接口-订单交易失败");
+                if (detail.getPaymentVersion().equals(EPaymentVersion.V1))
+                    doOrderCancel(detail, orderStatus, "测试接口-订单交易失败");
+                else {
+                    // 用户取消支付
+                    PaymentResp resp = new PaymentResp();
+                    resp.setMerOrderNo(orderNo);
+                    resp.setPaymentStatus(PaymentStatus.FAILED);
+                    resp.setTriggerTime(new Date());
+                    resp.setTransNo(detail.getTransNo());
+                    resp.setPaymentAmount(detail.getActualPrice());
+                    resp.setPaymentChannel(detail.getPaymentChannel());
+                    resp.setMsg("测试订单失败");
+                    // 执行支付回调流程
+                    userPaymentCoreService.executePaymentCallback(resp);
+                }
             }
             if (OrderStatusEnum.PAID.equals(orderStatus)) {
-                testOrderSuccess(detail.getOrderNo());
+                if (detail.getPaymentVersion().equals(EPaymentVersion.V1))
+                    testOrderSuccess(detail.getOrderNo());
+                else {
+                    // 用户取消支付
+                    PaymentResp resp = new PaymentResp();
+                    resp.setMerOrderNo(orderNo);
+                    resp.setPaymentStatus(PaymentStatus.SUCCESSED);
+                    resp.setTriggerTime(new Date());
+                    resp.setTransNo(detail.getTransNo());
+                    resp.setPaymentAmount(detail.getActualPrice());
+                    resp.setServiceCharge(BigDecimal.ZERO);
+                    resp.setPaymentChannel(detail.getPaymentChannel());
+                    resp.setMsg("测试订单成功");
+                    // 执行支付回调流程
+                    userPaymentCoreService.executePaymentCallback(resp);
+                }
             }
         }
         return true;

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -266,6 +266,9 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                         .updateTime(DateTime.now().toDate())
                         .build();
                     userPaymentOrderService.updateById(order);
+
+                    // 订单关闭后的数据处理流程
+                    userOrderService.payCancel(userOrderService.detail(order.getId()));
                 }
 
                 log.info("executePaymentCallback WAIT_PAY, status={}, paymentResp={}", paymentOrder.getStatus(),
@@ -778,6 +781,8 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                         .build();
                     userPaymentOrderService.updateById(update);
 
+                    // 订单关闭后的数据处理流程
+                    userOrderService.payCancel(userOrderService.detail(reqConfig.getMerOrderNo(),null));
                     throw BizException.from("支付超时");
                 }
 
@@ -881,6 +886,8 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                     .build();
                 userPaymentOrderService.updateById(order);
 
+                // 订单关闭后的数据处理流程
+                userOrderService.payCancel(userOrderService.detail(order.getId()));
 
             } else {
                 // 获取三方支付订单信息,根据订单状处理

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java

@@ -151,6 +151,9 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
         userOrder.setId(id);
         userOrder.setStatus(OrderStatusEnum.CLOSE);
         userOrderService.updateById(userOrder);
+
+        // 订单关闭后的数据处理流程
+        userOrderService.payCancel(userOrderService.detail(id));
     }
 
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumMusicWrapper.java

@@ -138,7 +138,7 @@ public class TenantAlbumMusicWrapper {
         @ApiModelProperty("关键字匹配")
         private String keyword;
 
-        @ApiModelProperty(value = "专辑", hidden = true)
+        @ApiModelProperty(value = "专辑id集合")
         private List<Long> albumIds;
 
         @ApiModelProperty("声部分类(ENSEMBLE, MUSIC, SUBJECT)")

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumPurchaseWrapper.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -69,6 +70,10 @@ public class TenantAlbumPurchaseWrapper {
         @ApiModelProperty("机构ID")
         private Long tenantId;
 
+
+        @ApiModelProperty("订单号")
+        private String orderNo;
+
         @ApiModelProperty("机构专辑ID")
         private Long tenantAlbumId;
 

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumPurchaseMapper.xml

@@ -10,6 +10,7 @@
         , t.tenant_id_ AS tenantId
         , t.tenant_album_id_ AS tenantAlbumId
         , t.purchase_time_ AS purchaseTime
+        , t.order_no_ AS orderNo
         , t.purchase_quantity_ AS purchaseQuantity
         , t.purchase_cycle_ AS purchaseCycle
         , t.active_quantity_ AS activeQuantity

+ 88 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SmsCodeController.java

@@ -0,0 +1,88 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.wf.captcha.SpecCaptcha;
+import com.wf.captcha.utils.CaptchaUtil;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.security.SecurityConstants;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("code")
+@Api(tags = "验证码服务")
+public class SmsCodeController extends BaseController {
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+    @Autowired
+    private RedisTemplate<String,String> redisTemplate;
+
+    @ApiOperation(value = "发送短信验证码")
+    @ApiImplicitParams({  @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
+                          @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号,LOGOFF:用户注销)", required = true, dataType = "String") })
+    @PostMapping(value = "/sendSmsCode")
+    public Object sendLoginVerifyCode(String mobile,String type) throws Exception {
+        smsCodeService.sendValidCode(mobile, type, ClientEnum.TEACHER);
+        return succeed();
+    }
+
+    @ApiOperation(value = "校验短信验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+                         @ApiImplicitParam(name = "code", value = "短信验证码", required = true, dataType = "String"),
+                         @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required = true, dataType = "String") })
+    @PostMapping(value = "/verifySmsCode")
+    public Object verifySmsCode(String phone,String code,String type) {
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        if(smsCodeService.verifyValidCode(phone, code, type)){
+            return succeed();
+        }
+        return failed("验证码校验失败");
+    }
+
+    @PostMapping(value = "/verifyImageCode")
+    @ApiOperation("校验登录图形验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "code", value = "验证码", required = true, dataType = "String") })
+    public Object verifyImageCode(String phone,String code){
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        String redisKey = MessageTypeEnum.KAPTCHA_SESSION_KEY + phone;
+        if(redisTemplate.hasKey(redisKey)){
+            if(StringUtils.equalsIgnoreCase(redisTemplate.opsForValue().get(redisKey),code)){
+                return succeed();
+            }
+        }
+        return failed(SecurityConstants.VERIFY_FAILURE);
+    }
+
+    @RequestMapping("/getImageCode")
+    @ApiOperation("获取登录图片验证码")
+    @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String")
+    public void getLoginImage(HttpServletRequest request, HttpServletResponse response,String phone) throws Exception {
+        if(StringUtils.isEmpty(phone)){
+            throw new BizException("请输入手机号");
+        }
+        SpecCaptcha specCaptcha = new SpecCaptcha(125, 45, 4);
+        redisTemplate.opsForValue().set(MessageTypeEnum.KAPTCHA_SESSION_KEY + phone,specCaptcha.text(),3, TimeUnit.MINUTES);
+        CaptchaUtil.out(specCaptcha, request, response);
+    }
+}