商城项目利用Spring-Session做分布式session的解决方案-----商城项目

#如何看待IBM中国研发部裁员?#
package com.alatus.mall.auth.app;

import com.alatus.common.utils.HttpUtils;
import com.alatus.common.utils.R;
import com.alatus.common.vo.GiteeSocialUser;
import com.alatus.common.vo.MemberRespVo;
import com.alatus.common.vo.WeiboSocialUser;
import com.alatus.mall.auth.feign.MemberFeignService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;

@Controller
@Slf4j
public class OAuthController {
    @Value("${spring.oauth.properties.weibo.client_id}")
    private String weibo_client_id;
    @Value("${spring.oauth.properties.weibo.client_secret}")
    private String weibo_client_secret;
    @Value("${spring.oauth.properties.grant_type}")
    private String grant_type;
    @Value("${spring.oauth.properties.weibo.redirect_uri}")
    private String weibo_redirect_uri;
    @Value("${spring.oauth.properties.gitee.client_id}")
    private String gitee_client_id;
    @Value("${spring.oauth.properties.gitee.redirect_uri}")
    private String gitee_redirect_uri;
    @Value("${spring.oauth.properties.gitee.client_secret}")
    private String gitee_client_secret;
    @Autowired
    private MemberFeignService memberFeignService;
    @GetMapping("/oauth2.0/weibo/success")
    public String weiboLogin(@RequestParam("code") String code, HttpSession session) throws Exception {
//        根据这个code获取当前登录用户的第三方令牌
        HashMap<String, String> queryBody = new HashMap<>();
        queryBody.put("client_id",weibo_client_id);
        queryBody.put("client_secret",weibo_client_secret);
        queryBody.put("grant_type",grant_type);
        queryBody.put("redirect_uri",weibo_redirect_uri);
        queryBody.put("code",code);
        HttpResponse oauth = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), new HashMap<>(), queryBody);
        if(oauth.getStatusLine().getStatusCode()==200){
//            获取到了accessEntity
            String userJson = EntityUtils.toString(oauth.getEntity());
            WeiboSocialUser weiboSocialUser = JSON.parseObject(userJson, WeiboSocialUser.class);
            R r = memberFeignService.weiboOauthLogin(weiboSocialUser);
            if(r.getCode() == 0){
                MemberRespVo memberRespVo = r.getData(new TypeReference<MemberRespVo>() {});
                log.info("第三方用户登陆成功:,用户信息"+memberRespVo);
                session.setAttribute("loginUser",memberRespVo);
                return "redirect:http://alatusmall.com";
            }
            else {
                return "redirect:http://auth.alatusmall.com/login.html";
            }
        }
        else{
            return "redirect:http://auth.alatusmall.com/login.html";
        }
    }
    @GetMapping("/oauth2.0/gitee/success")
    public String gitLogin(@RequestParam("code") String code, HttpSession session, HttpServletResponse servletResponse) throws Exception {
//        根据这个code获取当前登录用户的第三方令牌
        HashMap<String, String> queryBody = new HashMap<>();
        queryBody.put("grant_type",grant_type);
        queryBody.put("code",code);
        queryBody.put("client_id",gitee_client_id);
        queryBody.put("redirect_uri",gitee_redirect_uri);
        queryBody.put("client_secret",gitee_client_secret);
        HttpResponse oauth = HttpUtils.doPost("https://gitee.com", "/oauth/token", "post", new HashMap<>(), new HashMap<>(), queryBody);
        if(oauth.getStatusLine().getStatusCode()==200){
//            获取到了accessEntity
            String userJson = EntityUtils.toString(oauth.getEntity());
            GiteeSocialUser giteeSocialUser = JSON.parseObject(userJson, GiteeSocialUser.class);
            R r = memberFeignService.giteeOauthLogin(giteeSocialUser);
            if(r.getCode() == 0){
                MemberRespVo memberRespVo = r.getData(new TypeReference<MemberRespVo>() {});
                log.info("第三方用户登陆成功:,用户信息"+memberRespVo);
//                第一次使用session,浏览器会保存我们的cookie,浏览器访问指定网站或域名就会带上这个cookie
//                让cookie在子域下也可以取出对应的cookie,需要我们指定域名
//                这样就是我们自己原生将cookie指定作用域和内容并回传,然后,session我们就存在redis里面
                session.setAttribute("loginUser",memberRespVo);
                return "redirect:http://alatusmall.com";
            }
            else {
                return "redirect:http://auth.alatusmall.com/login.html";
            }
        }
        else{
            return "redirect:http://auth.alatusmall.com/login.html";
        }
    }
}
package com.alatus.mall.auth.app;

import com.alatus.common.utils.HttpUtils;
import com.alatus.common.utils.R;
import com.alatus.common.vo.GiteeSocialUser;
import com.alatus.common.vo.MemberRespVo;
import com.alatus.common.vo.WeiboSocialUser;
import com.alatus.mall.auth.feign.MemberFeignService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;

@Controller
@Slf4j
public class OAuthController {
    @Value("${spring.oauth.properties.weibo.client_id}")
    private String weibo_client_id;
    @Value("${spring.oauth.properties.weibo.client_secret}")
    private String weibo_client_secret;
    @Value("${spring.oauth.properties.grant_type}")
    private String grant_type;
    @Value("${spring.oauth.properties.weibo.redirect_uri}")
    private String weibo_redirect_uri;
    @Value("${spring.oauth.properties.gitee.client_id}")
    private String gitee_client_id;
    @Value("${spring.oauth.properties.gitee.redirect_uri}")
    private String gitee_redirect_uri;
    @Value("${spring.oauth.properties.gitee.client_secret}")
    private String gitee_client_secret;
    @Autowired
    private MemberFeignService memberFeignService;
    @GetMapping("/oauth2.0/weibo/success")
    public String weiboLogin(@RequestParam("code") String code, HttpSession session) throws Exception {
//        根据这个code获取当前登录用户的第三方令牌
        HashMap<String, String> queryBody = new HashMap<>();
        queryBody.put("client_id",weibo_client_id);
        queryBody.put("client_secret",weibo_client_secret);
        queryBody.put("grant_type",grant_type);
        queryBody.put("redirect_uri",weibo_redirect_uri);
        queryBody.put("code",code);
        HttpResponse oauth = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), new HashMap<>(), queryBody);
        if(oauth.getStatusLine().getStatusCode()==200){
//            获取到了accessEntity
            String userJson = EntityUtils.toString(oauth.getEntity());
            WeiboSocialUser weiboSocialUser = JSON.parseObject(userJson, WeiboSocialUser.class);
            R r = memberFeignService.weiboOauthLogin(weiboSocialUser);
            if(r.getCode() == 0){
                MemberRespVo memberRespVo = r.getData(new TypeReference<MemberRespVo>() {});
                log.info("第三方用户登陆成功:,用户信息"+memberRespVo);
                session.setAttribute("loginUser",memberRespVo);
                return "redirect:http://alatusmall.com";
            }
            else {
                return "redirect:http://auth.alatusmall.com/login.html";
            }
        }
        else{
            return "redirect:http://auth.alatusmall.com/login.html";
        }
    }
    @GetMapping("/oauth2.0/gitee/success")
    public String gitLogin(@RequestParam("code") String code, HttpSession session, HttpServletResponse servletResponse) throws Exception {
//        根据这个code获取当前登录用户的第三方令牌
        HashMap<String, String> queryBody = new HashMap<>();
        queryBody.put("grant_type",grant_type);
        queryBody.put("code",code);
        queryBody.put("client_id",gitee_client_id);
        queryBody.put("redirect_uri",gitee_redirect_uri);
        queryBody.put("client_secret",gitee_client_secret);
        HttpResponse oauth = HttpUtils.doPost("https://gitee.com", "/oauth/token", "post", new HashMap<>(), new HashMap<>(), queryBody);
        if(oauth.getStatusLine().getStatusCode()==200){
//            获取到了accessEntity
            String userJson = EntityUtils.toString(oauth.getEntity());
            GiteeSocialUser giteeSocialUser = JSON.parseObject(userJson, GiteeSocialUser.class);
            R r = memberFeignService.giteeOauthLogin(giteeSocialUser);
            if(r.getCode() == 0){
                MemberRespVo memberRespVo = r.getData(new TypeReference<MemberRespVo>() {});
                log.info("第三方用户登陆成功:,用户信息"+memberRespVo);
//                第一次使用session,浏览器会保存我们的cookie,浏览器访问指定网站或域名就会带上这个cookie
//                让cookie在子域下也可以取出对应的cookie,需要我们指定域名
//                这样就是我们自己原生将cookie指定作用域和内容并回传,然后,session我们就存在redis里面
                session.setAttribute("loginUser",memberRespVo);
                return "redirect:http://alatusmall.com";
            }
            else {
                return "redirect:http://auth.alatusmall.com/login.html";
            }
        }
        else{
            return "redirect:http://auth.alatusmall.com/login.html";
        }
    }
}
package com.alatus.mall.member.service.impl;

import com.alatus.common.utils.HttpUtils;
import com.alatus.mall.member.entity.OauthInfoEntity;
import com.alatus.mall.member.exception.PhoneExistException;
import com.alatus.mall.member.exception.UsernameExistException;
import com.alatus.mall.member.service.MemberLevelService;
import com.alatus.mall.member.service.OauthInfoService;
import com.alatus.mall.member.vo.GiteeUserInfo;
import com.alatus.mall.member.vo.MemberLoginVo;
import com.alatus.mall.member.vo.MemberRegisterVo;
import com.alatus.common.vo.GiteeSocialUser;
import com.alatus.common.vo.WeiboSocialUser;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.alatus.common.utils.PageUtils;
import com.alatus.common.utils.Query;
import com.alatus.mall.member.dao.MemberDao;
import com.alatus.mall.member.entity.MemberEntity;
import com.alatus.mall.member.service.MemberService;

@Service("memberService")
public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> implements MemberService {
    @Autowired
    private MemberLevelService memberLevelService;
    @Autowired
    private OauthInfoService oauthInfoService;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<MemberEntity> page = this.page(
                new Query<MemberEntity>().getPage(params),
                new QueryWrapper<MemberEntity>()
        );
        return new PageUtils(page);
    }

    @Override
    public void register(MemberRegisterVo memberRegisterVo) {
//        检查用户名和手机号是否唯一(为了能让上层感知异常,我们这里抛出去)采用异常机制
        checkPhoneUnique(memberRegisterVo.getPhone());
        checkUsernameUnique(memberRegisterVo.getUsername());
        MemberEntity memberEntity = new MemberEntity();
//        设置默认等级
        memberEntity.setLevelId(memberLevelService.getDefaultLevel().getId());
//        密码绝对不能传递明文,一旦数据库泄露,就会导致所有数据曝光,我们应该存储MD5加密后的数据
//        MD5任何长度大小的数据,算出的值都是固定的,源数据哪怕任何改动,得到的MD5值都会不同
//        百度网盘的秒传功能本质上就是MD5值相同,在这个情况下,不同文件就不需要再次上传,达到了秒传效果
//        MD5的最大特点就说不可逆,无法通过MD5获取源数据的值
//        MD5抗修改性意味着MD5的数据可以通过暴力算或者字典查的穷举法获得,网上有一大堆对应的彩虹表
//        因此MD5不能直接用来加密,必须加盐存储
//        使用Spring原生的加密器实现
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        memberEntity.setPassword(passwordEncoder.encode(memberRegisterVo.getPassword()));
//        用户名
        memberEntity.setUsername(memberRegisterVo.getUsername());
//        手机号
        memberEntity.setMobile(memberRegisterVo.getPhone());
        memberEntity.setCreateTime(new Date());
        this.baseMapper.insert(memberEntity);
    }

    @Override
    public void checkPhoneUnique(String phone) throws PhoneExistException{
        Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("mobile", phone));
        if(count>0){
            throw new PhoneExistException();
        }
    }

    @Override
    public void checkUsernameUnique(String username) throws UsernameExistException{
        Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("username", username));
        if(count>0){
            throw new UsernameExistException();
        }
    }

    @Override
    public MemberEntity login(MemberLoginVo memberLoginVo) {
        String loginAccount = memberLoginVo.getLoginAccount();
        String password = memberLoginVo.getPassword();;
//        去数据库查询
        MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("username", loginAccount)
                .or().eq("mobile", loginAccount));
        if(memberEntity==null){
            // 登陆失败
            return null;
        }
        else{
            String memberEntityPassword = memberEntity.getPassword();
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//            进行密码匹配
            boolean matches = passwordEncoder.matches(password, memberEntityPassword);
            if(matches){
                return memberEntity;
            }
            else{
                return null;
            }
        }
    }

//    社交登录需要同时具有注册和登录的逻辑
    @Override
    public MemberEntity login(WeiboSocialUser weiboSocialUser){
        String uid = weiboSocialUser.getUid();
        OauthInfoEntity oauthInfoEntity = oauthInfoService.getOne(new QueryWrapper<OauthInfoEntity>().eq("source", "微博").eq("social_uid", uid));
        if(oauthInfoEntity != null){
            MemberEntity memberEntity = this.getById(oauthInfoEntity.getMemberId());
            redisTemplate.opsForValue().set("user_access_token:"+memberEntity.getId(),weiboSocialUser.getAccess_token());
            redisTemplate.opsForValue().set("user_expires_in:"+memberEntity.getId(), weiboSocialUser.getExpires_in().toString());
            return memberEntity;
        }
        else{
            MemberEntity register = new MemberEntity();
            try{
                HashMap<String, String> query = new HashMap<>();
                query.put("access_token", weiboSocialUser.getAccess_token());
                query.put("uid", weiboSocialUser.getUid());
                HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<>(),query);
                if(response.getStatusLine().getStatusCode()==200){
                    String json = EntityUtils.toString(response.getEntity());
                    JSONObject jsonObject = JSON.parseObject(json);
                    register.setLevelId(memberLevelService.getDefaultLevel().getId());
                    register.setNickname(jsonObject.getString("name"));
                    register.setGender("m".equals(jsonObject.getString("gender"))?1:0);
                    register.setCreateTime(new Date());
                    this.save(register);
                    OauthInfoEntity registerOauthInfo = new OauthInfoEntity();
                    registerOauthInfo.setMemberId(register.getId());
                    registerOauthInfo.setSocialUid(uid.toString());
                    registerOauthInfo.setSource("微博");
                    oauthInfoService.save(registerOauthInfo);
                    redisTemplate.opsForValue().set("user_access_token:"+register.getId(),weiboSocialUser.getAccess_token());
                    redisTemplate.opsForValue().set("user_expires_in:"+register.getId(), weiboSocialUser.getExpires_in().toString());
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
            return register;
        }
    }

    @Override
    public MemberEntity login(GiteeSocialUser giteeSocialUser) throws Exception {
        GiteeUserInfo giteeUserInfo = null;
        HttpResponse response = HttpUtils.doGet("https://gitee.com", "/api/v5/user?access_token=" + giteeSocialUser.getAccess_token(), "get", new HashMap<>(), new HashMap<>());
        if(response.getStatusLine().getStatusCode()==200){
            String giteeJSON = EntityUtils.toString(response.getEntity());
            giteeUserInfo = JSON.parseObject(giteeJSON, GiteeUserInfo.class);
        }
        Long uid = giteeUserInfo.getId();
        OauthInfoEntity oauthInfoEntity = oauthInfoService.getOne(new QueryWrapper<OauthInfoEntity>().eq("source", "gitee").eq("social_uid", uid));
        if(oauthInfoEntity != null){
            MemberEntity memberEntity = this.getById(oauthInfoEntity.getMemberId());
            redisTemplate.opsForValue().set("user_access_token:"+memberEntity.getId(),giteeSocialUser.getAccess_token());
            redisTemplate.opsForValue().set("user_expires_in:"+memberEntity.getId(), giteeSocialUser.getExpires_in().toString());
            return memberEntity;
        }
        else{
            MemberEntity register = new MemberEntity();
            register.setLevelId(memberLevelService.getDefaultLevel().getId());
            register.setEmail(giteeUserInfo.getEmail());
            register.setNickname(giteeUserInfo.getName());
            register.setCreateTime(new Date());
            this.save(register);
            OauthInfoEntity registerOauthInfo = new OauthInfoEntity();
            registerOauthInfo.setMemberId(register.getId());
            registerOauthInfo.setSocialUid(uid.toString());
            registerOauthInfo.setSource("gitee");
            oauthInfoService.save(registerOauthInfo);
            redisTemplate.opsForValue().set("user_access_token:"+register.getId(),giteeSocialUser.getAccess_token());
            redisTemplate.opsForValue().set("user_expires_in:"+register.getId(), giteeSocialUser.getExpires_in().toString());
            return register;
        }
    }

}
package com.alatus.mall.member.service.impl;

import com.alatus.common.utils.HttpUtils;
import com.alatus.mall.member.entity.OauthInfoEntity;
import com.alatus.mall.member.exception.PhoneExistException;
import com.alatus.mall.member.exception.UsernameExistException;
import com.alatus.mall.member.service.MemberLevelService;
import com.alatus.mall.member.service.OauthInfoService;
import com.alatus.mall.member.vo.GiteeUserInfo;
import com.alatus.mall.member.vo.MemberLoginVo;
import com.alatus.mall.member.vo.MemberRegisterVo;
import com.alatus.common.vo.GiteeSocialUser;
import com.alatus.common.vo.WeiboSocialUser;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.alatus.common.utils.PageUtils;
import com.alatus.common.utils.Query;
import com.alatus.mall.member.dao.MemberDao;
import com.alatus.mall.member.entity.MemberEntity;
import com.alatus.mall.member.service.MemberService;

@Service("memberService")
public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> implements MemberService {
    @Autowired
    private MemberLevelService memberLevelService;
    @Autowired
    private OauthInfoService oauthInfoService;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<MemberEntity> page = this.page(
                new Query<MemberEntity>().getPage(params),
                new QueryWrapper<MemberEntity>()
        );
        return new PageUtils(page);
    }

    @Override
    public void register(MemberRegisterVo memberRegisterVo) {
//        检查用户名和手机号是否唯一(为了能让上层感知异常,我们这里抛出去)采用异常机制
        checkPhoneUnique(memberRegisterVo.getPhone());
        checkUsernameUnique(memberRegisterVo.getUsername());
        MemberEntity memberEntity = new MemberEntity();
//        设置默认等级
        memberEntity.setLevelId(memberLevelService.getDefaultLevel().getId());
//        密码绝对不能传递明文,一旦数据库泄露,就会导致所有数据曝光,我们应该存储MD5加密后的数据
//        MD5任何长度大小的数据,算出的值都是固定的,源数据哪怕任何改动,得到的MD5值都会不同
//        百度网盘的秒传功能本质上就是MD5值相同,在这个情况下,不同文件就不需要再次上传,达到了秒传效果
//        MD5的最大特点就说不可逆,无法通过MD5获取源数据的值
//        MD5抗修改性意味着MD5的数据可以通过暴力算或者字典查的穷举法获得,网上有一大堆对应的彩虹表
//        因此MD5不能直接用来加密,必须加盐存储
//        使用Spring原生的加密器实现
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        memberEntity.setPassword(passwordEncoder.encode(memberRegisterVo.getPassword()));
//        用户名
        memberEntity.setUsername(memberRegisterVo.getUsername());
//        手机号
        memberEntity.setMobile(memberRegisterVo.getPhone());
        memberEntity.setCreateTime(new Date());
        this.baseMapper.insert(memberEntity);
    }

    @Override
    public void checkPhoneUnique(String phone) throws PhoneExistException{
        Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("mobile", phone));
        if(count>0){
            throw new PhoneExistException();
        }
    }

    @Override
    public void checkUsernameUnique(String username) throws UsernameExistException{
        Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("username", username));
        if(count>0){
            throw new UsernameExistException();
        }
    }

    @Override
    public MemberEntity login(MemberLoginVo memberLoginVo) {
        String loginAccount = memberLoginVo.getLoginAccount();
        String password = memberLoginVo.getPassword();;
//        去数据库查询
        MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("username", loginAccount)
                .or().eq("mobile", loginAccount));
        if(memberEntity==null){
            // 登陆失败
            return null;
        }
        else{
            String memberEntityPassword = memberEntity.getPassword();
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//            进行密码匹配
            boolean matches = passwordEncoder.matches(password, memberEntityPassword);
            if(matches){
                return memberEntity;
            }
            else{
                return null;
            }
        }
    }

//    社交登录需要同时具有注册和登录的逻辑
    @Override
    public MemberEntity login(WeiboSocialUser weiboSocialUser){
        String uid = weiboSocialUser.getUid();
        OauthInfoEntity oauthInfoEntity = oauthInfoService.getOne(new QueryWrapper<OauthInfoEntity>().eq("source", "微博").eq("social_uid", uid));
        if(oauthInfoEntity != null){
            MemberEntity memberEntity = this.getById(oauthInfoEntity.getMemberId());
            redisTemplate.opsForValue().set("user_access_token:"+memberEntity.getId(),weiboSocialUser.getAccess_token());
            redisTemplate.opsForValue().set("user_expires_in:"+memberEntity.getId(), weiboSocialUser.getExpires_in().toString());
            return memberEntity;
        }
        else{
            MemberEntity register = new MemberEntity();
            try{
                HashMap<String, String> query = new HashMap<>();
                query.put("access_token", weiboSocialUser.getAccess_token());
                query.put("uid", weiboSocialUser.getUid());
                HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<>(),query);
                if(response.getStatusLine().getStatusCode()==200){
                    String json = EntityUtils.toString(response.getEntity());
                    JSONObject jsonObject = JSON.parseObject(json);
                    register.setLevelId(memberLevelService.getDefaultLevel().getId());
                    register.setNickname(jsonObject.getString("name"));
                    register.setGender("m".equals(jsonObject.getString("gender"))?1:0);
                    register.setCreateTime(new Date());
                    this.save(register);
                    OauthInfoEntity registerOauthInfo = new OauthInfoEntity();
                    registerOauthInfo.setMemberId(register.getId());
                    registerOauthInfo.setSocialUid(uid.toString());
                    registerOauthInfo.setSource("微博");
                    oauthInfoService.save(registerOauthInfo);
                    redisTemplate.opsForValue().set("user_access_token:"+register.getId(),weiboSocialUser.getAccess_token());
                    redisTemplate.opsForValue().set("user_expires_in:"+register.getId(), weiboSocialUser.getExpires_in().toString());
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
            return register;
        }
    }

    @Override
    public MemberEntity login(GiteeSocialUser giteeSocialUser) throws Exception {
        GiteeUserInfo giteeUserInfo = null;
        HttpResponse response = HttpUtils.doGet("https://gitee.com", "/api/v5/user?access_token=" + giteeSocialUser.getAccess_token(), "get", new HashMap<>(), new HashMap<>());
        if(response.getStatusLine().getStatusCode()==200){
            String giteeJSON = EntityUtils.toString(response.getEntity());
            giteeUserInfo = JSON.parseObject(giteeJSON, GiteeUserInfo.class);
        }
        Long uid = giteeUserInfo.getId();
        OauthInfoEntity oauthInfoEntity = oauthInfoService.getOne(new QueryWrapper<OauthInfoEntity>().eq("source", "gitee").eq("social_uid", uid));
        if(oauthInfoEntity != null){
            MemberEntity memberEntity = this.getById(oauthInfoEntity.getMemberId());
            redisTemplate.opsForValue().set("user_access_token:"+memberEntity.getId(),giteeSocialUser.getAccess_token());
            redisTemplate.opsForValue().set("user_expires_in:"+memberEntity.getId(), giteeSocialUser.getExpires_in().toString());
            return memberEntity;
        }
        else{
            MemberEntity register = new MemberEntity();
            register.setLevelId(memberLevelService.getDefaultLevel().getId());
            register.setEmail(giteeUserInfo.getEmail());
            register.setNickname(giteeUserInfo.getName());
            register.setCreateTime(new Date());
            this.save(register);
            OauthInfoEntity registerOauthInfo = new OauthInfoEntity();
            registerOauthInfo.setMemberId(register.getId());
            registerOauthInfo.setSocialUid(uid.toString());
            registerOauthInfo.setSource("gitee");
            oauthInfoService.save(registerOauthInfo);
            redisTemplate.opsForValue().set("user_access_token:"+register.getId(),giteeSocialUser.getAccess_token());
            redisTemplate.opsForValue().set("user_expires_in:"+register.getId(), giteeSocialUser.getExpires_in().toString());
            return register;
        }
    }

}
package com.alatus.mall.member.service;

import com.alatus.mall.member.exception.PhoneExistException;
import com.alatus.mall.member.exception.UsernameExistException;
import com.alatus.mall.member.vo.MemberLoginVo;
import com.alatus.mall.member.vo.MemberRegisterVo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.alatus.common.utils.PageUtils;
import com.alatus.mall.member.entity.MemberEntity;
import com.alatus.common.vo.GiteeSocialUser;
import com.alatus.common.vo.WeiboSocialUser;
import java.util.Map;

/**
 * 会员
 *
 * @author alatus
 * @email 1571345941@qq.com
 * @date 2024-03-12 13:40:22
 */
public interface MemberService extends IService<MemberEntity> {
    PageUtils queryPage(Map<String, Object> params);

    void register(MemberRegisterVo memberRegisterVo);
    void checkPhoneUnique(String phone) throws PhoneExistException;
    void checkUsernameUnique(String username) throws UsernameExistException;
    MemberEntity login(MemberLoginVo memberLoginVo);
    MemberEntity login(WeiboSocialUser weiboSocialUser);
    MemberEntity login(GiteeSocialUser giteeSocialUser) throws Exception;
}
package com.alatus.mall.member.service;

import com.alatus.mall.member.exception.PhoneExistException;
import com.alatus.mall.member.exception.UsernameExistException;
import com.alatus.mall.member.vo.MemberLoginVo;
import com.alatus.mall.member.vo.MemberRegisterVo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.alatus.common.utils.PageUtils;
import com.alatus.mall.member.entity.MemberEntity;
import com.alatus.common.vo.GiteeSocialUser;
import com.alatus.common.vo.WeiboSocialUser;
import java.util.Map;

/**
 * 会员
 *
 * @author alatus
 * @email 1571345941@qq.com
 * @date 2024-03-12 13:40:22
 */
public interface MemberService extends IService<MemberEntity> {
    PageUtils queryPage(Map<String, Object> params);

    void register(MemberRegisterVo memberRegisterVo);
    void checkPhoneUnique(String phone) throws PhoneExistException;
    void checkUsernameUnique(String username) throws UsernameExistException;
    MemberEntity login(MemberLoginVo memberLoginVo);
    MemberEntity login(WeiboSocialUser weiboSocialUser);
    MemberEntity login(GiteeSocialUser giteeSocialUser) throws Exception;
}
/**
 * Copyright 2024
 */
package com.alatus.common.vo;

import lombok.Data;

/**
 * Auto-generated: 2024-09-10 15:47:33
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
@Data
public class WeiboSocialUser {
    private String access_token;
    private String remind_in;
    private Long expires_in;
    private String uid;
    private String isRealName;
}

 

/**
 * Copyright 2024
 */
package com.alatus.common.vo;

import lombok.Data;

/**
 * Auto-generated: 2024-09-10 15:47:33
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
@Data
public class WeiboSocialUser {
    private String access_token;
    private String remind_in;
    private Long expires_in;
    private String uid;
    private String isRealName;
}

/**
 * Copyright 2024 bejson.com
 */
package com.alatus.common.vo;

import lombok.Data;

/**
 * Auto-generated: 2024-09-10 15:50:12
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
@Data
public class GiteeSocialUser {

    private String access_token;
    private String token_type;
    private Long expires_in;
    private String refresh_token;
    private String scope;
    private Long created_at;
}
/**
 * Copyright 2024 bejson.com
 */
package com.alatus.common.vo;

import lombok.Data;

/**
 * Auto-generated: 2024-09-10 15:50:12
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
@Data
public class GiteeSocialUser {

    private String access_token;
    private String token_type;
    private Long expires_in;
    private String refresh_token;
    private String scope;
    private Long created_at;
}
package com.alatus.common.vo;

import lombok.Data;
import java.io.Serializable;
import java.util.Date;

@Data
public class MemberRespVo implements Serializable {
    private Long id;
    /**
     * 会员等级id
     */
    private Long levelId;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 昵称
     */
    private String nickname;
    /**
     * 手机号码
     */
    private String mobile;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 头像
     */
    private String header;
    /**
     * 性别
     */
    private Integer gender;
    /**
     * 生日
     */
    private Date birth;
    /**
     * 所在城市
     */
    private String city;
    /**
     * 职业
     */
    private String job;
    /**
     * 个性签名
     */
    private String sign;
    /**
     * 用户来源
     */
    private Integer sourceType;
    /**
     * 积分
     */
    private Integer integration;
    /**
     * 成长值
     */
    private Integer growth;
    /**
     * 启用状态
     */
    private Integer status;
    /**
     * 注册时间
     */
    private Date createTime;
}
package com.alatus.common.vo;

import lombok.Data;
import java.io.Serializable;
import java.util.Date;

@Data
public class MemberRespVo implements Serializable {
    private Long id;
    /**
     * 会员等级id
     */
    private Long levelId;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 昵称
     */
    private String nickname;
    /**
     * 手机号码
     */
    private String mobile;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 头像
     */
    private String header;
    /**
     * 性别
     */
    private Integer gender;
    /**
     * 生日
     */
    private Date birth;
    /**
     * 所在城市
     */
    private String city;
    /**
     * 职业
     */
    private String job;
    /**
     * 个性签名
     */
    private String sign;
    /**
     * 用户来源
     */
    private Integer sourceType;
    /**
     * 积分
     */
    private Integer integration;
    /**
     * 成长值
     */
    private Integer growth;
    /**
     * 启用状态
     */
    private Integer status;
    /**
     * 注册时间
     */
    private Date createTime;
}
spring.application.name=Mall-product
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=a9d97010-7073-4ccf-a3f4-ba6604b86a0a
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
alatusmall.thread.core-size=20
alatusmall.thread.max-size=200
spring.session.store-type=redis
server.servlet.session.timeout=30m
alatusmall.thread.keep-alive-time=10
alatusmall.thread.blocking-deque=100000
spring.application.name=Mall-product
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=a9d97010-7073-4ccf-a3f4-ba6604b86a0a
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
alatusmall.thread.core-size=20
alatusmall.thread.max-size=200
spring.session.store-type=redis
server.servlet.session.timeout=30m
alatusmall.thread.keep-alive-time=10
alatusmall.thread.blocking-deque=100000
package com.alatus.mall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableDiscoveryClient
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.alatus.mall.product.feign")
@MapperScan("com.alatus.mall.product.dao")
public class MallProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(MallProductApplication.class, args);
    }
}
package com.alatus.mall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableDiscoveryClient
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.alatus.mall.product.feign")
@MapperScan("com.alatus.mall.product.dao")
public class MallProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(MallProductApplication.class, args);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值