UserController.java 9.52 KB
package com.server.web.controller;

import com.server.utils.SendSMSUtil;
import com.server.utils.VerifyCodeUtils;
import com.server.web.common.model.TKzyUser;
import com.server.web.common.model.TKzyUserExample;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * Created by 豆腐干Sama on 2018/12/6.
 */
@RestController
@RequestMapping(value = BaseController.WX_NAMESPACE + "/user",produces = "application/json")
public class UserController extends BaseController {
    @GetMapping("/userData")
    public Map userData(HttpServletRequest request) {
        TKzyUser loginUser = getLoginUser(request);
        return returnSuccess(loginUser);
    }

    @PostMapping("/register")
    public Map register(HttpServletRequest request) {
        TKzyUser user= getLoginUser(request);
        String phone = request.getParameter("phone");
        String verifyCode = request.getParameter("verifyCode");
        String wxOpenId = request.getParameter("wxOpenId");
        if(phone==null||!phone.matches("^((1[3-9]))\\d{9}$")){
            return returnError("0","请输入有效的手机号码",null);
        }
        if(verifyCode==null){
            return returnError("0","请输入有效的验证码!",null);
        }

        if (user== null) {
            return returnError("0","未登录",null);
        }

        ValueOperations operations = redisTemplate.opsForValue();
        String cacheCode = (String)operations.get("Kzy_WX_LOGIN_SMS_PHONE_" + phone);
        if (StringUtils.isEmpty(cacheCode) || !cacheCode.equals(verifyCode)) {
            return returnError("0","短信验证码有误,或已失效!",null);
        } else {
            redisTemplate.delete("Kzy_WX_LOGIN_SMS_PHONE_" + phone);
        }

        TKzyUserExample example = new TKzyUserExample();
        example.createCriteria().andPhoneEqualTo(phone);
        List<TKzyUser> users = userMapper.selectByExample(example);
        if (!CollectionUtils.isEmpty(users)) {
            TKzyUser user1 = users.get(0);
            if (!StringUtils.isEmpty(user1.getWxOpenid()) && !wxOpenId.equals(user1.getWxOpenid())) {
                return returnError("0","该微信已绑定其他手机号",null);
            }
        }

        String fullName = request.getParameter("fullName");
        String duty = request.getParameter("duty");

        user.setWxOpenid(wxOpenId);
        user.setCreateDt(new Date());
        user.setDuty(duty);
        user.setFullName(fullName);
        user.setPhone(phone);
        user.setStatus(1);

        userMapper.insertSelective(user);
        request.getSession().setAttribute(WX_USER_SESSION_KEY,user);

        return returnSuccess(user);
    }

    @PostMapping("/update")
    public Map update(HttpServletRequest request) {
        TKzyUser loginUser = getLoginUser(request);
        if (loginUser == null) {
            return returnError("0","用户未登录",null);
        }

        String wxOpenId = request.getParameter("wxOpenId");
        String fullName = request.getParameter("fullName");
        String duty = request.getParameter("duty");

        loginUser.setWxOpenid(wxOpenId);
        loginUser.setDuty(duty);
        loginUser.setFullName(fullName);

        userMapper.updateByPrimaryKeySelective(loginUser);
        request.getSession().setAttribute(WX_USER_SESSION_KEY,loginUser);
        return returnSuccess(loginUser);
    }


    /**
     * 发送短信
     * @param request
     * @return
     */
    @ResponseBody
    @RequestMapping(path = "/sendMessageCode", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public Map<String, Object> sendMessageCode(HttpServletRequest request) {
        Map<String,Object> resultMap = new HashMap<String,Object>();
        resultMap.put("status","0");
        resultMap.put("message","");
        String imgVerifyCode = request.getParameter("imgVerifyCode");
        String phone = request.getParameter("phone");

        String failPhone = request.getSession().getAttribute("fail_"+phone)==null?null:request.getSession().getAttribute("fail_"+phone).toString();
        int count = 0;
        if(failPhone!=null && org.apache.commons.lang.math.NumberUtils.isNumber(failPhone)){
            count = Integer.valueOf(failPhone);
        }
        if(phone==null||!phone.matches("^((1[3-9]))\\d{9}$")){
            resultMap.put("message","请输入有效的手机号码!");
            request.getSession().setAttribute("fail_"+phone,count+1);
            if(count+1>=3){
                resultMap.put("imgFlag","1");
            }
            return resultMap;
        }
        ValueOperations vv = redisTemplate.opsForValue();
        if(imgVerifyCode!=null&&!"".equals(imgVerifyCode)){
            String redisImageCode = (String)vv.get("Kzy_IMAGE_CODE_" + phone);
            if(redisImageCode==null||!redisImageCode.toUpperCase().equals(imgVerifyCode.toUpperCase())){
                resultMap.put("message","请输入正确的图形验证码!");
                return resultMap;
            } else {
                redisTemplate.delete("Kzy_IMAGE_CODE_"+phone);
            }
        }
        if(vv.get("Kzy_WX_LOGIN_SMS_PHONE_FLAG_" + phone)!=null){//缓存标识,缓存里存在,表示还在有效期内,不重复发送
            resultMap.put("message","您发送的短信验证码尚在有效期,无需重复发送");
            request.getSession().setAttribute("fail_"+phone,count+1);
            if(count+1>=3){
                resultMap.put("imgFlag","1");
            }
            return resultMap;
        }
        String randomCode = getRandomStringByLength(4);
        try {
            boolean sendFlag = sendSmsCode(phone, "46886", randomCode);
            if (sendFlag) {
               logger.error("短信验证码发送成功");
                vv.set("Kzy_WX_LOGIN_SMS_PHONE_" + phone,randomCode,5, TimeUnit.MINUTES);//缓存验证码,验证成功之后再手动销毁

                //测试用,上线去掉
                System.out.println(phone+"999微信注册登录验证码为:"+randomCode);
                resultMap.put("data","");
                resultMap.put("status","1");
                resultMap.put("message","发送成功~");
            } else {
                resultMap.put("message","短信验证码发送失败");
            }
        } catch (Exception e) {
            resultMap.put("message","发送短信验证码服务异常");
        }

        return resultMap;

    }

    public static String getRandomStringByLength(int length) {
        String base = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }

    @RequestMapping(value = "/verifyImgCode", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public void verifyImgCode(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE");
        response.setHeader("Access-Control-Max-Age", "1728000");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        try {
            String verifyImgCode = generateVerifyCode(5);
            response.setContentType("image/jpeg");
            response.setDateHeader("expries", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            VerifyCodeUtils.outputImagePC(100, 40, response.getOutputStream(), verifyImgCode);
//            request.getSession().setAttribute("WEIXIN_USER_IMAGE_CODE_SESSION",verifyImgCode);
            ValueOperations vv = redisTemplate.opsForValue();
            String phone = request.getParameter("phone");
            if (!StringUtils.isEmpty(phone)) {
                logger.error("获取图形验证码手机号:" + phone);
                vv.set("Kzy_IMAGE_CODE_"+phone,verifyImgCode,1,TimeUnit.MINUTES);
            }
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("生成验证码失败", e);
        }
    }
    public static String generateVerifyCode(int verifySize) {
        String sources = "ABCDEFGHJKMNPQRSTUVWXYZ2345689";
        int codesLen = sources.length();
        Random rand = new Random(System.currentTimeMillis());
        StringBuilder verifyCode = new StringBuilder(verifySize);
        for (int i = 0; i < verifySize; i++) {
            verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
        }
        return verifyCode.toString();
    }

    public boolean sendSmsCode(String phone, String templateId, String code) throws Exception{
        if(StringUtils.hasText(phone)&&StringUtils.hasText(templateId)&&StringUtils.hasText(code)){
            HashMap<String, Object> smsResult = SendSMSUtil.sendTemplateSMS(phone,templateId,new String[]{code});
            logger.error("/sendSmsCode =============>sendSmsCode-smsResult=" + smsResult);
            if("000000".equals(smsResult.get("statusCode"))){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }

    }
}