mitao
2024-04-30 ab4ea7b8f10c9b66aed9c2ea161a08b25c3851a7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
package com.sinata.rest.modular.mall.controller;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sinata.common.enums.EnumRedisKey;
import com.sinata.rest.common.ApiUtils;
import com.sinata.rest.core.util.ToolUtil;
import com.sinata.rest.modular.auth.util.JwtTokenUtil;
import com.sinata.rest.modular.auth.util.ThreadPoolUtil;
import com.sinata.rest.modular.mall.controller.body.BodyUserLogin;
import com.sinata.rest.modular.mall.controller.body.BodyUserRegister;
import com.sinata.rest.modular.mall.controller.vo.VoUserAccountState;
import com.sinata.rest.modular.mall.controller.vo.VoUserTripartiteState;
import com.sinata.rest.modular.mall.model.UserAppSet;
import com.sinata.rest.modular.mall.service.IUserAppSetService;
import com.sinata.rest.modular.member.controller.common.vo.LoginVo;
import com.sinata.rest.modular.member.controller.common.vo.RegisterVo;
import com.sinata.rest.modular.member.model.MemUser;
import com.sinata.rest.modular.member.service.IMemMemberGradeService;
import com.sinata.rest.modular.member.service.IMemUserService;
import com.sinata.rest.modular.system.controller.AuthController;
import com.sinata.rest.modular.system.service.ICityRegionService;
import com.sinata.rest.modular.system.service.RedisTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;
 
import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
 
@Slf4j
@RestController
@RequestMapping("/mall/user")
@Api(tags = "商城-用户", description = "三方登录")
public class MallUserController extends AuthController {
 
    @Autowired
    private IMemUserService userService;
    @Resource
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private RedisTemplateService redisTemplateService;
    @Autowired
    private ICityRegionService regionService;
    @Autowired
    private IMemMemberGradeService gradeService;
    @Autowired
    private IUserAppSetService userAppSetService;
 
    @GetMapping("/isExist")
    @ApiOperation(value = "账号是否存在", response = VoUserAccountState.class)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "wxOpenId", value = "微信open_id", dataType = "String", paramType = "query"),
    })
    public Object isExist(String phone, String wxOpenId) {
        VoUserAccountState vo = new VoUserAccountState();
        MemUser user = null;
        if (null != phone) {
            user =  userService.getOne(new QueryWrapper<MemUser>().eq("phone", phone));
        }
        if (null != wxOpenId) {
            user =  userService.getOne(new QueryWrapper<MemUser>().eq("wx_open_id", wxOpenId));
        }
        if (ToolUtil.isNotEmpty(user)) {
            vo.setState(1);
        }
        return ApiUtils.returnOK(vo);
    }
 
    @GetMapping("/isBindPhone")
    @ApiOperation(value = "手机号是否绑定", notes = "手机号是否绑定/注册", response = VoUserTripartiteState.class)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", required = true, paramType = "query"),
    })
    public Object isBindPhone(@NotBlank String phone) {
        VoUserTripartiteState vo = new VoUserTripartiteState();
        MemUser user = userService.getOne(new QueryWrapper<MemUser>().eq("phone", phone));
        if (null != user) {
            vo.setPhoneState(1);
            if (user.getWxOpenId() != null) {
                vo.setWeChatBindState(1);
            }
            if (user.getQqAccount() != null) {
                vo.setQqBindState(1);
            }
            if (user.getAppleOpenId() != null) {
                vo.setAppleBindState(1);
            }
        }
        return ApiUtils.returnOK(vo);
    }
 
    @PostMapping("/login")
    @ApiOperation(value = "三方登录", notes = "三方登录", response = LoginVo.class)
    public Object register(@Valid @RequestBody BodyUserLogin userLoginBo) {
        if(userLoginBo.getType() == 1 && !StringUtils.isEmpty(userLoginBo.getWxOpenId())) {
            //微信
            return weChatLogin(userLoginBo.getWxOpenId());
        } else {
            return ApiUtils.returnNG(null,"登录失败");
        }
    }
 
    @PostMapping(value = "/register")
    @ApiOperation(value = "三方注册(包含手机号)", notes = "三方注册(包含手机号验证码注册)", response = RegisterVo.class)
    public Object register(@RequestBody BodyUserRegister register) {
        String msg = userService.mallRegisterUser(register);
        if (!StringUtils.isEmpty(msg)) {
            return ApiUtils.returnNG(null, msg);
        } else {
            LambdaQueryWrapper<MemUser> wrapper = new LambdaQueryWrapper();
            wrapper.eq(MemUser::getPhone, register.getPhone());
            MemUser user = userService.getOne(wrapper);
            RegisterVo vo = wrapperUserInfo(user);
            vo.setLogin(setUserAuth(user.getId()));
            return ApiUtils.returnOK(vo);
        }
    }
 
    @PutMapping(value = "/updateBindWxOpenId")
    @ApiOperation(value = "绑定/解绑微信号", notes = "绑定/解绑微信号", response = ApiUtils.class)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "wxOpenId", dataType = "String", value = "微信OpenID(解除绑定为空)", paramType = "query"),
            @ApiImplicitParam(name = "wxName", dataType = "String", value = "微信姓名", paramType = "query")
    })
    public Object updateBindOpenId(String wxOpenId, String wxName) {
        // 获取用户ID
        Integer userId = ThreadPoolUtil.getUserId();
        if (StringUtils.isNotBlank(wxOpenId)) {
            QueryWrapper<MemUser> wrapper = new QueryWrapper<>();
            wrapper.eq("wx_open_id", wxOpenId);
            // 绑定微信号
            int count = userService.count(wrapper);
            if(count <= 0) {
                userService.bindWx(wxOpenId, wxName, userId);
            }else {
                return ApiUtils.returnNG(null,"微信已被绑定");
            }
        }
        return ApiUtils.returnOK();
    }
 
    @GetMapping(value = "/updateProtocol")
    @ApiOperation(value = "协议更新时间", httpMethod = "GET", notes = "返回协议更新时间", response = ApiUtils.class)
    public Object updateProtocol() {
        UserAppSet userAppSet = userAppSetService.getOne(null);
        LocalDateTime date = null;
        if (ToolUtil.isEmpty(userAppSet)) {
            date = LocalDateTime.now();
        }else {
            date = userAppSet.getUpdateTime();
        }
        return ApiUtils.returnOK(date);
    }
 
    /**
     * 微信登录
     * @param wxOpenId
     * @return
     */
    public Object weChatLogin(String wxOpenId) {
        // 获取用户信息
        MemUser user = userService.getOne(new QueryWrapper<MemUser>().eq("wx_open_id", wxOpenId));
        // 如果用户未微信注册
        Assert.notNull(user, "微信未注册认证");
        Assert.isTrue(user.getIsLock() == 0, "账号异常,请联系平台");
        if (StringUtils.isEmpty(user.getImAccount())) {
            //环信注册
            userService.RingLetterRegister(user.getId(), null);
        }
        return setUserAuth(user.getId());
    }
 
    /**
     * 封装用户信息
     */
    public RegisterVo wrapperUserInfo(MemUser user) {
        RegisterVo vo = new RegisterVo();
        vo.setId(user.getId());
        vo.setShowId(user.getShowId());
        vo.setPhone(user.getPhone());
        vo.setAvatar(user.getAvatar());
        vo.setNickname(user.getNickName());
        vo.setGender(user.getSex());
        vo.setBirthday(user.getBirthday());
        vo.setSignature(user.getSignature());
        vo.setCityCode(user.getCityCode());
        vo.setAddress(user.getAddress());
        vo.setIsLock(user.getIsLock() == 1);
        vo.setFullName(regionService.getFullName(user.getCityCode()));
        vo.setGradeName(gradeService.getById(user.getMemberGradeId()).getGradeName());
        vo.setWxOpenId(user.getWxOpenId());
        vo.setQqAccount(user.getQqAccount());
        vo.setAppleOpenId(user.getAppleOpenId());
        vo.setRealName(user.getRealName());
        vo.setIdCard(user.getIdCard());
        vo.setAuditState(user.getAuditState());
        vo.setImAccount(user.getImAccount());
        vo.setImPassword(user.getImPassword());
        return vo;
    }
 
    /**
     * 封装用户登录认证信息
     */
    public LoginVo setUserAuth(Integer id) {
        // 获取混淆MD5签名用的随机字符串
        final String randomKey = jwtTokenUtil.getRandomKey();
        // 获取Token
        final String token = jwtTokenUtil.generateToken(id.toString(), randomKey);
        // 封装用户登录认证信息
        LoginVo map = new LoginVo();
        map.setId(id);
        map.setRandomKey(randomKey);
        map.setToken(token);
        // 缓存中存token
        redisTemplateService.hashPushHashMap(EnumRedisKey.TOKEN.index, id.toString(), token);
        return map;
    }
 
}