liulin
2025-07-03 fb2f11d7d502ceacbe7fbed176bea4ab0f152f69
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
/**
#                                                    __----~~~~~~~~~~~------___
#                                   .  .   ~~//====......          __--~ ~~
#                   -.            \_|//     |||\\  ~~~~~~::::... /~
#                ___-==_       _-~o~  \/    |||  \\            _/~~-
#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
#          '         ~-|      /|    |-~\~~       __--~~
#                      |-~~-_/ |    |   ~\_   _-~            /\
#                           /  \     \__   \/~                \__
#                       _--~ _/ | .-~~____--~-/                  ~~==.
#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
#                                 -_     ~\      ~~---l__i__i__i--~~_/
#                                 _-~-__   ~)  \--______________--~~
#                               //.-~~~-~_--~- |-------~~~~~~~~
#                                      //.-~~~--\
#                  神兽保佑
#                  永无BUG!
*/
package com.lunhan.water.host.controller.user;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.lunhan.water.common.ConstantFactory;
import com.lunhan.water.common.ExecutedResult;
import com.lunhan.water.common.PagerResult;
import com.lunhan.water.common.config.SysConfig;
import com.lunhan.water.common.enums.EResultCode;
import com.lunhan.water.common.exceptions.BusinessException;
import com.lunhan.water.common.jwt.JWTUtil;
import com.lunhan.water.common.jwt.LoginUserDTO;
import com.lunhan.water.common.util.HttpUtil;
import com.lunhan.water.common.util.LocalDateTimeUtil;
import com.lunhan.water.common.util.ParameterUtil;
import com.lunhan.water.common.util.SerializeUtil;
import com.lunhan.water.common.validator.ParameterValidateResult;
import com.lunhan.water.common.validator.ParameterValidator;
import com.lunhan.water.entity.enums.EState;
import com.lunhan.water.entity.enums.EUserType;
import com.lunhan.water.entity.request.ReqChangePassword;
import com.lunhan.water.entity.request.ReqListId;
import com.lunhan.water.entity.request.ReqNeedCode;
import com.lunhan.water.entity.request.ReqUserLogin;
import com.lunhan.water.entity.search.SearchRechargeOrder;
import com.lunhan.water.entity.weixin.WeiXinUserDto;
import com.lunhan.water.host.BasicController;
import com.lunhan.water.host.api.NonLogin;
import com.lunhan.water.repository.impl.UserLoginMapperImpl;
import com.lunhan.water.repository.po.UserLoginPO;
import com.lunhan.water.repository.vo.RechargeOrderVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
 
import com.lunhan.water.service.UserLoginService;
import com.lunhan.water.entity.request.userlogin.ReqCreateUserLogin;
import com.lunhan.water.entity.request.userlogin.ReqModifyUserLogin;
import com.lunhan.water.entity.search.SearchUserLogin;
import com.lunhan.water.repository.vo.UserLoginVO;
 
/**
 * 9000.UserLogin
 * @author lin.liu
 * @order 9000
 */
@RestController
@RequestMapping(value = "user")
public class UserLoginController extends BasicController {
    @Autowired
    private UserLoginService userLoginService;
    @Autowired
    private UserLoginMapperImpl userLoginMapper;
    /**
     * 微信小程序授权
     * @param request 请求参数
     */
    @NonLogin
    @PostMapping(value = "wxAuthorize")
    public ExecutedResult<WeiXinUserDto> wxAuthorization(@RequestBody ReqNeedCode request) {
        return success(this.wxMiniAppAuth(request.getCode()));
    }
    /**
     * 微信登录
     * @param request 请求参数
     */
    @NonLogin
    @PostMapping(value = "wxLogin")
    public ExecutedResult<LoginUserDTO> wxLogin(@RequestBody ReqNeedCode request) {
        //微信授权
        WeiXinUserDto userInfo = this.wxMiniAppAuth(request.getCode());
        Long now = LocalDateTimeUtil.nowTimeStamp();
        String openId = userInfo.getOpenId();
 
        UserLoginPO user = userLoginService.get4Openid(openId);
        if (Objects.isNull(user)) {
            // 微信未绑定账号,新增用户
            ReqCreateUserLogin reqCreateUser = new ReqCreateUserLogin();
            reqCreateUser.setUserName(openId);
            reqCreateUser.setPassword("");
            reqCreateUser.setWxOpenId(openId);
            reqCreateUser.setNickName(userInfo.getNickName());
            reqCreateUser.setHeadImg(userInfo.getHeadImgUrl());
            reqCreateUser.setPhone("");
            reqCreateUser.setComment("");
            UserLoginPO userLoginPO = userLoginMapper.getOrderByDesc();
            if(Objects.nonNull(userLoginPO)){
                int userCode = Integer.parseInt(userLoginPO.getUserCode()) + 1;
                reqCreateUser.setUserCode(String.valueOf(userCode));
            }else {
                reqCreateUser.setUserCode("10001");
            }
            ExecutedResult<Long> createAdmin = userLoginService.create(reqCreateUser);
            if (createAdmin.isFailed()) {
                return ExecutedResult.failed(createAdmin.getMsg());
            }
 
            user = userLoginService.get4Openid(openId);
        }
        if (!Objects.equals(user.getStatus(), EState.NORMAL.getValue())) {
            return ExecutedResult.failed("账号异常, 请联系管理员!");
        }
        LoginUserDTO loginUser = new LoginUserDTO();
        loginUser.setUserType(EUserType.ADMIN_USER.getValue());
        loginUser.setUserId(openId);
        loginUser.setNickName(user.getNickName());
        loginUser.setHeadImg(user.getHeadImg());
        loginUser.setPhone("");
        loginUser.setToken(JWTUtil.getToken(loginUser));
        return ExecutedResult.success(loginUser);
    }
    /**
     * 微信小程序授权
     */
    private WeiXinUserDto wxMiniAppAuth(String code) {
        //微信接口服务,通过调用微信接口服务中jscode2session接口获取到openid和session_key
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + SysConfig.wx.getAppId() + "&secret=" + SysConfig.wx.getSecret() + "&js_code=" + code + "&grant_type=authorization_code";
        String response = HttpUtil.doGet(url);
        JsonObject jsonObject = new JsonParser().parse(response).getAsJsonObject();
        if (!jsonObject.has("errcode")) {
            String sessionKey = jsonObject.get("session_key").toString();
            String openId = jsonObject.get("openid").toString();
        }
        if (jsonObject.has("errcode")) {
            String errCode = jsonObject.get("errcode").getAsString();
            switch (errCode) {
                case "1":
                    throw new BusinessException(EResultCode.FAILED, "微信授权失败,请稍后再试.");
                case "40029":
                    throw new BusinessException(EResultCode.FAILED, "微信授权code无效");
                case "40163":
                    throw new BusinessException(EResultCode.FAILED, "微信授权code已被使用");
                case "45011":
                    throw new BusinessException(EResultCode.FAILED, "访问次数过于频繁,请稍后再试");
 
                default:
                    throw new BusinessException(EResultCode.FAILED, "微信返回错误:" + errCode);
            }
        }
        return SerializeUtil.toObject(response, WeiXinUserDto.class);
    }
    /**
     * 修改密码
     * @param request 请求参数
     * @author lin.liu
     */
    @PostMapping("/changePassword")
    public ExecutedResult<String> changePassword(@RequestBody ReqChangePassword request) {
        //#region 参数验证
        ParameterValidator validator = new ParameterValidator()
                .addNotNullOrEmpty(ParameterUtil.named("旧密码"), request.getOldPassword())
                .addNotNullOrEmpty(ParameterUtil.named("新密码"), request.getNewPassword())
                .addLengthMax(ParameterUtil.named("新密码"), request.getNewPassword(), ConstantFactory.LENGTH_MAX50);
        ParameterValidateResult result = validator.validate();
        if (result.getIsFiled()) {
            return ExecutedResult.failed(result.getErrorMsg());
        }
        //#endregion
        LoginUserDTO user = super.getTokenUser();
        return userLoginService.changePassword(user, request);
    }
 
    /**
     * 帐号密码登录
     * @param request 请求参数
     * @author lin.liu
     */
    @PostMapping("login")
    @NonLogin
    public ExecutedResult<LoginUserDTO> login(@RequestBody ReqUserLogin request) {
        //#region 参数验证
        ParameterValidator validator = new ParameterValidator()
                .addNotNullOrEmpty(ParameterUtil.named("用户名"), request.getUserName())
                .addNotNullOrEmpty(ParameterUtil.named("密码"), request.getPassword());
        ParameterValidateResult result = validator.validate();
        if (result.getIsFiled()) {
            return ExecutedResult.failed(result.getErrorMsg());
        }
        //#endregion
        return userLoginService.login(request);
    }
    /**
     * 查询[用户]
     * @author lin.liu
     */
    @PostMapping(value = "search")
    public ExecutedResult<PagerResult<UserLoginVO>> search(@RequestBody SearchUserLogin request) {
        return userLoginService.search(request);
    }
}