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

import com.server.utils.ResultMapUtil;
import com.server.utils.SendSMSUtil;
import com.server.utils.VerifyCodeUtils;
import com.server.web.common.mapper.TKzyUserMapper;
import com.server.web.common.model.TKzyUser;
import com.server.web.common.model.TKzyUserExample;
import com.server.web.common.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
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 {
    @Autowired
    UserService userService;
    @Autowired
    private TKzyUserMapper tKzyUserMapper;


    @ResponseBody
    @RequestMapping(value = "/userData", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public Map userData(HttpServletRequest request) {
        TKzyUser loginUser = getLoginUser(request);
        if (loginUser != null && loginUser.getId() != null) {
            loginUser = tKzyUserMapper.selectByPrimaryKey(loginUser.getId());
        }
        return returnSuccess(loginUser);
    }

    @ResponseBody
    @RequestMapping(value = "/register", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public Map register(HttpServletRequest request) {
        TKzyUser user = getLoginUser(request);
        String phone = request.getParameter("phone");
        String verifyCode = request.getParameter("verifyCode");
        String wxOpenId = request.getParameter("wxOpenId");
        String fullName = request.getParameter("fullName");
        String userCategory = request.getParameter("userCategory");
        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);
            }
        }
        user.setWxOpenid(wxOpenId);
        user.setCreateDt(new Date());
        user.setUserCategory(userCategory == null ? null : Integer.valueOf(userCategory));
        user.setFullName(fullName);
        user.setPhone(phone);
        user.setStatus(1);
        user.setIntegral(0);
        user.setLastLoginDt(new Date());
        userMapper.insertSelective(user);
        request.getSession().setAttribute(WX_USER_SESSION_KEY, user);
        return returnSuccess(user);
    }

    @ResponseBody
    @RequestMapping(value = "/update", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public Map update(HttpServletRequest request) {
        TKzyUser loginUser = getLoginUser(request);
        if (loginUser == null) {
            return returnError("0", "用户未登录", null);
        }

        loginUser = tKzyUserMapper.selectByPrimaryKey(loginUser.getId());
        String wxOpenId = request.getParameter("wxOpenId");
        String fullName = request.getParameter("fullName");
        String userCategory = request.getParameter("userCategory");
        String duty = request.getParameter("duty");

        loginUser.setWxOpenid(wxOpenId);
        loginUser.setUserCategory(Integer.valueOf(userCategory));
        loginUser.setFullName(fullName);
        loginUser.setDuty(duty);

        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, "573404", 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);
        }
    }

    /**
     * 签到
     *
     * @param request
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/signIn", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public Map<String, Object> signIn(HttpServletRequest request) {
        TKzyUser loginUser = getLoginUser(request);
        if (loginUser == null || loginUser.getId() == null) {
            return ResultMapUtil.returnMap("0", "请先登录!", null);
        }
        if (loginUser != null && loginUser.getId() != null) {
            loginUser = tKzyUserMapper.selectByPrimaryKey(loginUser.getId());
        }
        //更新缓存用户信息(主要积分金额)
        request.getSession().setAttribute(WX_USER_SESSION_KEY, loginUser);
        return userService.signIn(loginUser);
    }

    /**
     * 签到日历
     *
     * @param request
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/signInList", method = {RequestMethod.POST, RequestMethod.GET}, produces = "application/json")
    public Map<String, Object> signInList(HttpServletRequest request) {
        TKzyUser loginUser = getLoginUser(request);
        if (loginUser == null || loginUser.getId() == null) {
            return ResultMapUtil.returnMap("0", "请先登录!", null);
        }
        return userService.signInList(loginUser);
    }

    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;
        }

    }

}