Pu Zhibing
4 天以前 70211b41954df4ac1232f48420b89c13fb5fb451
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
@@ -16,6 +16,12 @@
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.qianyuntong.SMSUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.UserUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.LoginWeChatXiao;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.QYTUserInfo;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.RegisterViaMobile;
import com.stylefeng.guns.modular.system.util.qianyuntong.model.RegisterViaMobileRequest;
import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
@@ -28,8 +34,8 @@
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.crypto.Cipher;
@@ -44,31 +50,32 @@
import java.security.spec.AlgorithmParameterSpec;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
    @Resource
    private UserInfoMapper userInfoMapper;
    @Resource
    private UserActivityInviteMapper userActivityInviteMapper;
    @Autowired
    private RedisUtil redisUtil;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private ALiSendSms aLiSendSms;
    @Autowired
    private WeChatUtil weChatUtil;
    @Autowired
    private IPaymentRecordService paymentRecordService;
    @Autowired
    private ICompanyCityService companyCityService;
@@ -154,16 +161,17 @@
                templateCode = "SMS_154775431";//修改密码
                break;
        }
        String sData = aLiSendSms.sendSms(phone, "SMS_229715276", "{\"code\":\"" + authCode + "\"}");
        JSONObject jsonObject = JSON.parseObject(sData);
        String message = jsonObject.getString("Message");
        if(!"OK".equals(message)){
            System.err.println(message);
            return ResultUtil.error(message);
        }
//        String sData = aLiSendSms.sendSms(phone, "SMS_229715276", "{\"code\":\"" + authCode + "\"}");
//        JSONObject jsonObject = JSON.parseObject(sData);
//        String message = jsonObject.getString("Message");
//        if(!"OK".equals(message)){
//            System.err.println(message);
//            return ResultUtil.error(message);
//        }
        SMSUtil.sendVerifyCode(phone);
        String sms = "短信验证码【" + authCode + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!";
        //发送验证码短信
        redisUtil.setStrValue(phone, authCode, 5 * 60);//设置五分钟过期
        redisTemplate.opsForValue().set(phone, authCode, 5, TimeUnit.MINUTES);//设置五分钟过期
        System.out.println("【" + phone + "】" + sms);
        return ResultUtil.success();
    }
@@ -178,16 +186,16 @@
     */
    @Override
    public boolean checkCaptcha(String phone, String code) throws Exception {
        Object value = redisUtil.getValue(phone);
        if("1234".equals(code)){
        if ("1234".equals(code)) {
            return true;
        }
        System.out.println("phone:"+phone);
        System.out.println("code:"+code);
        System.out.println("code---"+String.valueOf(value));
        if(null != value && code.equals(String.valueOf(value))){
        Object value = redisTemplate.opsForValue().get(phone);
        System.out.println("phone:" + phone);
        System.out.println("code:" + code);
        System.out.println("code---" + String.valueOf(value));
        if (null != value && code.equals(String.valueOf(value))) {
            return true;
        }else{
        } else {
            return false;
        }
    }
@@ -201,14 +209,14 @@
    @Override
    public synchronized ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception {
        boolean b = this.checkCaptcha(phone, code);
        if(!b){
        if (!b) {
            return ResultUtil.error("验证码无效");
        }
        UserInfo userInfo = userInfoMapper.queryByPhone(phone);
        if(null == userInfo){
        if (null == userInfo) {
            ArrayList<UserBankAccount> userBankAccounts = new ArrayList<>();
            userInfo = new UserInfo();
            userInfo.setPhone(phone);
            userInfo.setPassWord(ShiroKit.md5("", salt));
@@ -230,27 +238,41 @@
            this.insert(userInfo);
            this.addCoupon(userInfo);//添加优惠券
            UserInfo finalUserInfo = userInfo;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if(pushMinistryOfTransport){
                    if (pushMinistryOfTransport) {
                        //上传数据
                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
                    }
                }
            }).start();
        }
        if(userInfo.getState() == 2){
        //调中台接口查询用户
        List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone);
        if (null == infoByPhone || infoByPhone.isEmpty()) {
            RegisterViaMobileRequest request = new RegisterViaMobileRequest();
            request.setMobile(phone);
            request.setPassword("123456");
            request.setNickname(userInfo.getNickName());
            request.setVerify_code(code);
            request.setVerify_code_type("1");
            RegisterViaMobile register = UserUtil.registerViaMobile(request);
            if (!"0".equals(register.getStatus())) {
                return ResultUtil.error(register.getDesc());
            }
        }
        if (userInfo.getState() == 2) {
            return ResultUtil.error("账号被冻结");
        }
        //调用单点登录的逻辑
        this.singlePointLogin(userInfo.getId(),loginType);
        String token = this.getToken(userInfo, "",loginType);
        this.singlePointLogin(userInfo.getId(), loginType);
        String token = this.getToken(userInfo, "", loginType);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(userInfo.getId());
        loginWarpper.setToken(token);
@@ -258,7 +280,7 @@
        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
        loginWarpper.setPhone(2);
        smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success(loginWarpper);
    }
@@ -269,19 +291,20 @@
     */
    @Override
    public ResultUtil<LoginWarpper> oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos) throws Exception {
        String response = GetMobile.getPhone(accessToken,androidOrIos);
        if(response==null){
        String response = GetMobile.getPhone(accessToken, androidOrIos);
        if (response == null) {
            return ResultUtil.error("登录失败");
        }
        System.out.println( response);
        System.out.println(response);
        JSONObject json = JSONObject.parseObject(response);
        if(!json.getBoolean("success")){
        if (!json.getBoolean("success")) {
            return ResultUtil.error("登录失败");
        }
        String phone = json.getJSONObject("data").getString("mobile");
        UserInfo userInfo = userInfoMapper.queryByPhone(phone);
        if(null == userInfo){
        if (null == userInfo) {
            userInfo = new UserInfo();
            userInfo.setPhone(phone);
            userInfo.setPassWord(ShiroKit.md5("", salt));
@@ -291,7 +314,7 @@
            userInfo.setConsumption(0D);
            userInfo.setBalance(0D);
            userInfo.setState(1);
            //用户所属企业
            if(null != registAreaCode){
                Company query = companyCityService.query(registAreaCode);
@@ -308,22 +331,21 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if(pushMinistryOfTransport){
                    if (pushMinistryOfTransport) {
                        //上传数据
                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
                    }
                }
            }).start();
        }
        if(userInfo.getState() == 2){
        if (userInfo.getState() == 2) {
            return ResultUtil.error("账号被冻结");
        }
        //调用单点登录的逻辑
        this.singlePointLogin(userInfo.getId(),loginType);
        String token = this.getToken(userInfo, "",loginType);
        this.singlePointLogin(userInfo.getId(), loginType);
        String token = this.getToken(userInfo, "", loginType);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(userInfo.getId());
        loginWarpper.setToken(token);
@@ -331,7 +353,7 @@
        loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
        loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
        loginWarpper.setPhone(2);
        //smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success(loginWarpper);
    }
@@ -425,14 +447,20 @@
     */
    @Override
    public ResultUtil<LoginWarpper> userLogin(String phone, String password,String loginType) throws Exception {
        UserInfo userInfo = this.queryByPhone(phone);
        if(null == userInfo){
        //调中台接口查询用户
        List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone);
        if (null == infoByPhone || infoByPhone.isEmpty()) {
            return ResultUtil.error("账号无效");
        }
        if(userInfo.getState() == 2){
        UserInfo userInfo = this.queryByPhone(phone);
        if (null == userInfo) {
            return ResultUtil.error("账号无效");
        }
        if (userInfo.getState() == 2) {
            return ResultUtil.error("账号被冻结");
        }
        if(!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())){
        if (!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())) {
            return ResultUtil.error("密码错误");
        }
@@ -452,9 +480,9 @@
    public ResultUtil<LoginWarpper> wxLogin(Integer type, String openid, String unionid, String jscode, String registIp,
                                            String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception {
        UserInfo userInfo = null;
        String sessionKey=null;
        if(type == 2){//小程序
            if(ToolUtil.isEmpty(jscode)){
        String sessionKey = null;
        if (type == 2) {//小程序
            if (ToolUtil.isEmpty(jscode)) {
                return ResultUtil.error("微信登录请求失败,请重试");
            }
            Map<String, String> map = weChatUtil.code2Session(jscode);
@@ -462,22 +490,19 @@
            unionid = map.get("unionid");
            sessionKey = map.get("sessionKey");
            userInfo = userInfoMapper.queryByOpenid2(openid);
        }else{//APP
        } else {//APP
            userInfo = userInfoMapper.queryByOpenid(openid);
        }
        if(null == userInfo){
        if (null == userInfo) {
            userInfo = new UserInfo();
            userInfo.setPassWord(ShiroKit.md5("", salt));
            userInfo.setRegistIp(registIp);
            userInfo.setSex(sex);
            userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName());
            userInfo.setAvatar(avatar);
            if(type == 2){
            if (type == 2) {
                userInfo.setAppletsOpenId(openid);
            }else{
            } else {
                userInfo.setOpenId(openid);
            }
            userInfo.setUnionid(unionid);
@@ -501,32 +526,54 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if(pushMinistryOfTransport){
                    if (pushMinistryOfTransport) {
                        //上传数据
                        pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
                    }
                }
            }).start();
        }
        if(userInfo.getState() == 2){
        if (userInfo.getState() == 2) {
            return ResultUtil.error("账号被冻结");
        }
        if(type == 2){//小程序登录
            String value = redisUtil.getValue("appletOpenId");
        if (type == 2) {//小程序登录
            String value = (String) redisTemplate.opsForValue().get("appletOpenId");
            JSONObject jsonObject = null;
            if(ToolUtil.isNotEmpty(value)){
            if (ToolUtil.isNotEmpty(value)) {
                jsonObject = JSON.parseObject(value);
            }else{
            } else {
                jsonObject = new JSONObject();
            }
            jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId());
            redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
            redisTemplate.opsForValue().set("appletOpenId", jsonObject.toJSONString());
            //调中台微信登录接口
            LoginWeChatXiao loginWeChatXiao = UserUtil.loginWeChatXiao(jscode);
            if (null == loginWeChatXiao) {
                return ResultUtil.error("微信登录请求失败,请重试");
            }
            //调用单点登录的逻辑
            this.singlePointLogin(userInfo.getId(), loginType);
            String token = loginWeChatXiao.getToken();
            redisTemplate.opsForValue().set(token.substring(token.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS);
            redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), token.substring(token.length() - 32));
            redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), token);
            LoginWarpper loginWarpper = new LoginWarpper();
            loginWarpper.setId(userInfo.getId());
            loginWarpper.setToken(token);
            loginWarpper.setAppid(UUIDUtil.getRandomCode());
            loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1);
            loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
            loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
            return ResultUtil.success(loginWarpper);
        }
        //调用单点登录的逻辑
        this.singlePointLogin(userInfo.getId(),loginType);
        String token = this.getToken(userInfo, "",loginType);
        this.singlePointLogin(userInfo.getId(), loginType);
        String token = this.getToken(userInfo, "", loginType);
        LoginWarpper loginWarpper = new LoginWarpper();
        loginWarpper.setId(userInfo.getId());
        loginWarpper.setToken(token);
@@ -577,9 +624,6 @@
                userInfo.setPhone(phone1);
                userInfoMapper.updateById(userInfo);
            }
        }else{//APP
            userInfo = userInfoMapper.queryByOpenid(openid);
        }
@@ -634,7 +678,7 @@
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if(pushMinistryOfTransport){
                        if (pushMinistryOfTransport) {
                            //上传数据
                            pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId());
                        }
@@ -642,23 +686,36 @@
                }).start();
            }
        }
        if(userInfo.getState() == 2){
        if (userInfo.getState() == 2) {
            return ResultUtil.error("账号被冻结");
        }
        if(type == 2){//小程序登录
            String value = redisUtil.getValue("appletOpenId");
        if (type == 2) {//小程序登录
            String value = (String) redisTemplate.opsForValue().get("appletOpenId");
            JSONObject jsonObject = null;
            if(ToolUtil.isNotEmpty(value)){
            if (ToolUtil.isNotEmpty(value)) {
                jsonObject = JSON.parseObject(value);
            }else{
            } else {
                jsonObject = new JSONObject();
            }
            jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId());
            redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
            redisTemplate.opsForValue().set("appletOpenId", jsonObject.toJSONString());
            //调用单点登录的逻辑
            this.singlePointLogin(userInfo.getId(), loginType);
            String token = this.getToken(userInfo, "", loginType);
            redisTemplate.opsForValue().set(token.substring(token.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS);
            redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), token.substring(token.length() - 32));
            redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), token);
            LoginWarpper loginWarpper = new LoginWarpper();
            loginWarpper.setId(userInfo.getId());
            loginWarpper.setToken(token);
            loginWarpper.setAppid(UUIDUtil.getRandomCode());
            loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1);
            loginWarpper.setEmergencyContact(userInfo.getEmergencyContact());
            loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber());
            return ResultUtil.success(loginWarpper);
        }
        //调用单点登录的逻辑
@@ -781,12 +838,29 @@
    @Override
    public ResultUtil bindingPhone(Integer uid, String phone, String code,String loginType) throws Exception {
        boolean b = this.checkCaptcha(phone, code);
        if(!b){
        if (!b) {
            return ResultUtil.error("验证码无效");
        }
        UserInfo userInfo = this.selectById(uid);
        UserInfo userInfo1 = userInfoMapper.queryByPhone(phone);
        if(null != userInfo1){
        if (null != userInfo1) {
            //调中台接口查询用户
            List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone);
            if (null == infoByPhone || infoByPhone.isEmpty()) {
                RegisterViaMobileRequest request = new RegisterViaMobileRequest();
                request.setMobile(phone);
                request.setPassword("123456");
                request.setNickname(userInfo.getNickName());
                request.setVerify_code(code);
                request.setVerify_code_type("1");
                RegisterViaMobile register = UserUtil.registerViaMobile(request);
                if (!"0".equals(register.getStatus())) {
                    return ResultUtil.error(register.getDesc());
                }
            }
            userInfo1.setOpenId(userInfo.getOpenId());
            userInfo1.setUnionid(userInfo.getUnionid());
            userInfo1.setAppletsOpenId(userInfo.getAppletsOpenId());
@@ -794,18 +868,18 @@
            userInfo1.setSex(userInfo.getSex());
            userInfo1.setNickName(userInfo.getNickName());
            this.updateById(userInfo1);
            if(ToolUtil.isNotEmpty(loginType) && loginType.equals("Applets")){//小程序登录后绑定手机号码
                String value = redisUtil.getValue("appletOpenId");
            if (ToolUtil.isNotEmpty(loginType) && loginType.equals("Applets")) {//小程序登录后绑定手机号码
                String value = (String) redisTemplate.opsForValue().get("appletOpenId");
                JSONObject jsonObject = null;
                if(ToolUtil.isNotEmpty(value)){
                if (ToolUtil.isNotEmpty(value)) {
                    jsonObject = JSON.parseObject(value);
                    jsonObject.remove(userInfo.getId().toString());//删除原有账号缓存的数据
                }else{
                } else {
                    jsonObject = new JSONObject();
                }
                jsonObject.put(userInfo1.getId().toString(), userInfo.getAppletsOpenId());
                redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
                redisTemplate.opsForValue().set("appletOpenId", jsonObject.toJSONString());
            }
@@ -831,10 +905,10 @@
                }
                userCouponRecordService.deleteById(ucr.getId());
            }
            //获取新的token等数据
            String token = this.getToken(userInfo1, "",loginType);
            String token = this.getToken(userInfo1, "", loginType);
            LoginWarpper loginWarpper = new LoginWarpper();
            loginWarpper.setId(userInfo1.getId());
            loginWarpper.setToken(token);
@@ -842,12 +916,27 @@
            loginWarpper.setPhone(2);
            return ResultUtil.success(loginWarpper);
        }
        //调中台接口查询用户
        List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone);
        if (null == infoByPhone || infoByPhone.isEmpty()) {
            RegisterViaMobileRequest request = new RegisterViaMobileRequest();
            request.setMobile(phone);
            request.setPassword("123456");
            request.setNickname(userInfo.getNickName());
            request.setVerify_code(code);
            request.setVerify_code_type("1");
            RegisterViaMobile register = UserUtil.registerViaMobile(request);
            if (!"0".equals(register.getStatus())) {
                return ResultUtil.error(register.getDesc());
            }
        }
        userInfo.setPhone(phone);
        userInfo.setUpdateTime(new Date());
        userInfo.setUpdateUser(userInfo.getId());
        this.updateById(userInfo);
        smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success(new LoginWarpper());
    }
@@ -871,7 +960,7 @@
            }else{
                key = requestHeader;
            }
            String value = redisUtil.getValue(key);
            String value = (String) redisTemplate.opsForValue().get(key);
            return null != value ? Integer.valueOf(value) : null;
        }else{
            return null;
@@ -931,7 +1020,7 @@
            return ResultUtil.error("支付金额必须大于0元");
        }
        if(payType == 1){//微信支付
            String value = redisUtil.getValue("appletOpenId");
            String value = (String) redisTemplate.opsForValue().get("appletOpenId");
            String appletsOpenId = null;
            if(ToolUtil.isNotEmpty(value)){
                JSONObject jsonObject = JSON.parseObject(value);
@@ -993,6 +1082,8 @@
        if(!b){
            return ResultUtil.error("验证码无效");
        }
        UserInfo userInfo = this.selectById(uid);
        UserInfo userInfo1 = userInfoMapper.queryByPhone(phone);
        if(null != userInfo1){
@@ -1001,7 +1092,6 @@
        userInfo.setPhone(phone);
        this.updateById(userInfo);
//        smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success();
    }
@@ -1150,7 +1240,7 @@
        String openid = map.get("openid");
        String unionid = map.get("unionid");
        //将当前小程序openid存储到缓存中用后面的支付时使用
        String value = redisUtil.getValue("appletOpenId");
        String value = (String) redisTemplate.opsForValue().get("appletOpenId");
        JSONObject jsonObject = null;
        if(ToolUtil.isNotEmpty(value)){
            jsonObject = JSON.parseObject(value);
@@ -1158,7 +1248,7 @@
            jsonObject = new JSONObject();
        }
        jsonObject.put(userId.toString(), openid);
        redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
        redisTemplate.opsForValue().set("appletOpenId", jsonObject.toJSONString());
        return ResultUtil.success();
    }
@@ -1348,33 +1438,22 @@
        return "JYX" + String.valueOf(num).substring(1);
    }
    /**
     * 获取token
     * @param userInfo
     * @param password
     * @return
     * 单点登录
     * @param id
     */
    private String getToken(UserInfo userInfo, String password,String type) throws Exception{
    private void singlePointLogin(Integer id,String type) throws Exception{
        if(ToolUtil.isEmpty(type))type="APP";
        //封装请求账号密码为shiro可验证的token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userInfo.getPhone(), password.toCharArray());
        String credentials = userInfo.getPassWord();
        ByteSource credentialsSalt = new Md5Hash(salt);
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                new ShiroUser(), credentials, credentialsSalt, "");
        //校验用户账号密码
        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
                usernamePasswordToken, simpleAuthenticationInfo);
        String s = JwtTokenUtil.generateToken(String.valueOf(userInfo.getId()));
        redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(userInfo.getId()), 180 * 24 * 60 * 60);
        redisUtil.setStrValue("USER_"+type+"_" + userInfo.getPhone(), s.substring(s.length() - 32));
        redisUtil.setStrValue("USER_"+type +"_"+ userInfo.getId(), s);
        return s;
        //开始验证当前账号是否在别处登录
        String value = (String) redisTemplate.opsForValue().get("USER_" + type + "_" + id);
        if(ToolUtil.isNotEmpty(value)) {//将另外设备上的强迫下线
            //开始清除redis中无效的数据
            UserInfo userInfo = userInfoMapper.selectById(id);
            String key = (String) redisTemplate.opsForValue().get("USER_" + type + "_" + userInfo.getPhone());
            redisTemplate.delete(key);//删除个人信息数据
            redisTemplate.delete("USER_" + type + "_" + userInfo.getPhone());//删除后台冻结相关缓存
            redisTemplate.delete("USER_" + type + "_" + id);//清除存储的token
        }
    }
@@ -1438,23 +1517,32 @@
        }
    }
    /**
     * 单点登录
     * @param id
     * 获取token
     * @param userInfo
     * @param password
     * @return
     */
    private void singlePointLogin(Integer id,String type) throws Exception{
    private String getToken(UserInfo userInfo, String password,String type) throws Exception{
        if(ToolUtil.isEmpty(type))type="APP";
        //开始验证当前账号是否在别处登录
        String value = redisUtil.getValue("USER_"+type+"_" + id);
        if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线
            //开始清除redis中无效的数据
            UserInfo userInfo = userInfoMapper.selectById(id);
            String key = redisUtil.getValue("USER_"+type+"_" + userInfo.getPhone());
            redisUtil.remove(key);//删除个人信息数据
            redisUtil.remove("USER_"+type+"_" + userInfo.getPhone());//删除后台冻结相关缓存
            redisUtil.remove("USER_"+type+"_" + id);//清除存储的token
        }
        //封装请求账号密码为shiro可验证的token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userInfo.getPhone(), password.toCharArray());
        String credentials = userInfo.getPassWord();
        ByteSource credentialsSalt = new Md5Hash(salt);
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                new ShiroUser(), credentials, credentialsSalt, "");
        //校验用户账号密码
        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
                usernamePasswordToken, simpleAuthenticationInfo);
        String s = JwtTokenUtil.generateToken(String.valueOf(userInfo.getId()));
        redisTemplate.opsForValue().set(s.substring(s.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS);
        redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), s.substring(s.length() - 32));
        redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), s);
        return s;
    }
    @Override