Browse Source

开发了绑定手机号和退出接口

jinshihui 2 weeks ago
parent
commit
684689a372

+ 127 - 26
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeChatController.java

@@ -12,26 +12,22 @@ import com.ylx.common.constant.Constants;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.AjaxResult;
 import com.ylx.common.core.domain.R;
+import com.ylx.common.core.domain.model.BindPhoneBody;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.core.redis.RedisCache;
 import com.ylx.common.enums.BusinessType;
 import com.ylx.common.utils.MessageUtils;
 import com.ylx.common.utils.StringUtils;
 import com.ylx.common.utils.file.FileUploadUtils;
-import com.ylx.common.utils.file.FileUtils;
-import com.ylx.framework.config.ServerConfig;
 import com.ylx.framework.manager.AsyncManager;
 import com.ylx.framework.manager.factory.AsyncFactory;
 import com.ylx.framework.web.service.WxTokenService;
-import com.ylx.massage.domain.CouponReceive;
 import com.ylx.massage.domain.TJs;
 import com.ylx.massage.domain.TWxUser;
-import com.ylx.massage.domain.TbFile;
 import com.ylx.massage.service.CouponReceiveService;
 import com.ylx.massage.service.TJsService;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.massage.service.TbFileService;
-import com.ylx.massage.utils.DateTimeUtils;
 import com.ylx.massage.utils.JsSignUtil;
 import com.ylx.massage.utils.StringUtilsMassage;
 import com.ylx.massage.utils.WeChatUtil;
@@ -40,8 +36,8 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -49,7 +45,6 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.nio.file.Files;
@@ -106,6 +101,18 @@ public class WeChatController extends BaseController {
     @Autowired
     private RedisCache redisCache;
 
+    /**
+     * 发送验证码开关(true:调用真实发送接口,false:验证码写死123456)
+     */
+    @Value("${ylx.sendSmsEnabled:false}")
+    private boolean sendSmsEnabled;
+
+    /**
+     * 写死的验证码(sendSmsEnabled为false时使用)
+     */
+    @Value("${ylx.fixedVerifyCode:123456}")
+    private String fixedVerifyCode;
+
     /**
      * 微信Token验证
      *
@@ -140,7 +147,7 @@ public class WeChatController extends BaseController {
     @GetMapping("/setMenu")
     @ApiOperation("设置菜单")
     @Log(title = "设置菜单", businessType = BusinessType.OTHER)
-    public Map<?,?> setMenu() {
+    public Map<?, ?> setMenu() {
 
         //获取access_token
         String token = weChatUtil.getToken();
@@ -151,20 +158,21 @@ public class WeChatController extends BaseController {
 
     /**
      * 前端获取jssdk签名
+     *
      * @param url
-     * @return Map<?,?>
+     * @return Map<?, ?>
      */
     @GetMapping("/getSignature")
     @ApiOperation("前端获取jssdk签名")
     @Log(title = "前端获取jssdk签名", businessType = BusinessType.OTHER)
-    public Map<?,?> getSignature(String url) {
+    public Map<?, ?> getSignature(String url) {
 
         //获取access_token
         String token = weChatUtil.getToken();
         //获取jsapi_ticket
         String jsapiTicket = weChatUtil.getJsapiTicket(token);
         //生成签名
-        return jsSignUtil.sign(url,jsapiTicket);
+        return jsSignUtil.sign(url, jsapiTicket);
     }
 
 
@@ -255,7 +263,7 @@ public class WeChatController extends BaseController {
     private String getString(Map<String, String> encryptMap) throws Exception {
         // 返回消息时ToUserName的值与FromUserName的互换
         Map<String, String> returnMap = new HashMap<>();
-        String content ="欢迎来到广誉源"+"\n" +
+        String content = "欢迎来到广誉源" + "\n" +
                 "\n" +
                 "广誉源是一家快速上门服务预约平台,提供正规 绿色 快捷上门服务,提供按摩、推拿、养生、SPA等服务,专业针对居家、差旅、酒店等顾客提供便捷健康养生服务";
         //添加新用户
@@ -318,13 +326,12 @@ public class WeChatController extends BaseController {
      * 获取token和userInfo
      *
      * @param code 微信授权码
-     * @return 访问令牌
+     * @return R<WxLoginUser> 访问令牌
      */
     @GetMapping("/getAccessToken")
     @ApiOperation("公众号网页登录")
     @Log(title = "公众号网页登录", businessType = BusinessType.OTHER)
     public R<WxLoginUser> getAccessToken(@RequestParam String code) {
-
         // 发送get请求获取 AccessToken
         Map<?, ?> result = weChatUtil.getAccessToken(code);
         String accessToken = result.get(ACCESS_TOKEN).toString();
@@ -336,24 +343,16 @@ public class WeChatController extends BaseController {
         String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid);
         // 解析JSON数据
         JSONObject jsonObject = new JSONObject(userInfoJsom);
-        log.info("公众号网页登录,{}",jsonObject);
+        log.info("公众号网页登录:{}", jsonObject);
         // 将用户信息保存到数据库中
         LambdaQueryWrapper<TWxUser> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
         objectLambdaQueryWrapper.eq(TWxUser::getcOpenid, openid);
         TWxUser user = wxUserService.getOne(objectLambdaQueryWrapper);
         if (user == null || StringUtils.isEmpty(user.getcNickName())) {
-            if(user == null){
-                user = new TWxUser();
-                user.setcOpenid(openid);
-                TWxUser finalUser = user;
-                //异步 添加新人优惠卷
-//                threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
-            }
             user.setcOpenid(openid);
             user.setcNickName(jsonObject.get("nickname").toString());
             user.setcIcon(jsonObject.get("headimgurl").toString());
             user.setcSessionKey(refreshToken);
-//            user.setcPhone(phoneNumber);
             wxUserService.saveOrUpdate(user);
             user.setId(user.getId());
         }
@@ -362,6 +361,7 @@ public class WeChatController extends BaseController {
         BeanUtils.copyProperties(user, wxUser);
         // 生成并返回令牌
         String token = wxTokenService.createToken(wxUser);
+        log.info("生成的token值:{}", token);
         if (token == null || token.isEmpty()) {
             return R.fail("生成令牌失败");
         }
@@ -436,10 +436,10 @@ public class WeChatController extends BaseController {
      */
     @ApiOperation("兑换技师公众号二维码")
     @RequestMapping(value = "getJSwxQrCodeDh", method = RequestMethod.GET)
-    public String getJSwxQrCode1(@RequestParam String ticket,@RequestParam String id) throws UnsupportedEncodingException {
+    public String getJSwxQrCode1(@RequestParam String ticket, @RequestParam String id) throws UnsupportedEncodingException {
 
         String qrCodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + URLEncoder.encode(ticket, "UTF-8");
-        String filePath = RuoYiConfig.getUploadEwmPath() + id +".png";
+        String filePath = RuoYiConfig.getUploadEwmPath() + id + ".png";
         log.info("二维码地址:{}", filePath);
 
         try (InputStream in = new URL(qrCodeUrl).openStream();
@@ -458,7 +458,6 @@ public class WeChatController extends BaseController {
     }
 
 
-
     @ApiOperation("获取公众号网页二维码")
     @GetMapping("/getweQrCode")
     public AjaxResult weiXinLogin1(String openId) {
@@ -474,4 +473,106 @@ public class WeChatController extends BaseController {
         MultipartFile multipartFile = FileUploadUtils.getMultipartFile(generate);
         return tbFileService.uploadFile(multipartFile);
     }
+
+    /**
+     * 发送验证码
+     *
+     * @param phone 手机号
+     * @return R<?> 发送结果
+     */
+    @ApiOperation("发送绑定手机号验证码")
+    @PostMapping("/sendBindPhoneCode")
+    public R<?> sendBindPhoneCode(@RequestParam String phone) {
+        if (StringUtils.isEmpty(phone)) {
+            return R.fail("手机号不能为空");
+        }
+        if (!phone.matches("^1[3-9]\\d{9}$")) {
+            return R.fail("手机号格式不正确");
+        }
+        // 根据开关判断是否调用真实发送接口
+        if (sendSmsEnabled) {
+            // TODO: 调用真实发送验证码接口
+            log.info("发送验证码到手机号: {}", phone);
+        } else {
+            // 使用写死的验证码
+            log.info("发送验证码开关关闭,使用写死验证码: {}, 手机号: {}", fixedVerifyCode, phone);
+        }
+        return R.ok("验证码发送成功");
+    }
+
+    /**
+     * 绑定手机号
+     *
+     * @param bindPhoneBody 绑定手机号请求参数
+     * @return R<?> 绑定结果
+     */
+    @ApiOperation("绑定手机号")
+    @PostMapping("/bindPhone")
+    public R<?> bindPhone(@RequestBody BindPhoneBody bindPhoneBody) {
+        String openId = bindPhoneBody.getOpenId();
+        String phone = bindPhoneBody.getPhone();
+        String code = bindPhoneBody.getCode();
+
+        if (StringUtils.isEmpty(openId)) {
+            return R.fail("openId不能为空");
+        }
+        if (StringUtils.isEmpty(phone)) {
+            return R.fail("手机号不能为空");
+        }
+        if (StringUtils.isEmpty(code)) {
+            return R.fail("验证码不能为空");
+        }
+        if (!phone.matches("^1[3-9]\\d{9}$")) {
+            return R.fail("手机号格式不正确");
+        }
+
+        // 校验验证码
+        if (!validateVerifyCode(phone, code)) {
+            return R.fail("验证码错误");
+        }
+
+        // 查询当前用户
+        TWxUser currentUser = wxUserService.getByOpenId(openId);
+        if (currentUser == null) {
+            return R.fail("用户不存在");
+        }
+
+        // 检查手机号是否已被其他用户绑定
+        TWxUser existUser = wxUserService.getByPhone(phone);
+        if (existUser != null && !existUser.getId().equals(currentUser.getId())) {
+            return R.fail("手机号已绑定");
+        }
+
+        // 如果该用户已经绑定过此手机号,直接返回成功(无变化)
+        if (StringUtils.isNotEmpty(currentUser.getcPhone()) && currentUser.getcPhone().equals(phone)) {
+            return R.ok("绑定成功");
+        }
+
+        // 绑定手机号
+        boolean success = wxUserService.bindPhone(openId, phone);
+        if (!success) {
+            return R.fail("绑定失败");
+        }
+        log.info("用户openId: {} 绑定手机号: {} 成功", openId, phone);
+        return R.ok("绑定成功");
+    }
+
+    /**
+     * 校验验证码
+     *
+     * @param phone 手机号
+     * @param code  用户输入的验证码
+     * @return boolean 校验是否通过
+     */
+    private boolean validateVerifyCode(String phone, String code) {
+        if (sendSmsEnabled) {
+            // TODO: 从Redis或其他存储中获取真实发送的验证码进行校验
+            // String realCode = redisCache.getCacheObject("sms:bindPhone:" + phone);
+            // return code.equals(realCode);
+            return true;
+        } else {
+            // 使用写死的验证码进行校验
+            return fixedVerifyCode.equals(code);
+        }
+    }
 }

+ 1 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeSqController.java

@@ -66,7 +66,7 @@ public class WeSqController extends BaseController {
 
 
     /**
-     * 获取token和userInfo
+     * 通过微信code获取token和userInfo
      *
      * @param code 微信授权码
      * @return R<WxLoginUser> 访问令牌

+ 4 - 0
nightFragrance-admin/src/main/resources/application-dev.yml

@@ -12,6 +12,10 @@ ylx:
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证
   captchaType: math
+  # 发送验证码开关(true:调用真实发送接口,false:验证码写死123456)
+  sendSmsEnabled: false
+  # 写死的验证码(sendSmsEnabled为false时使用)
+  fixedVerifyCode: "123456"
 
 # 开发环境配置
 server:

+ 5 - 1
nightFragrance-admin/src/main/resources/application-pro.yml

@@ -13,8 +13,12 @@ ylx:
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证
   captchaType: math
-
+  # 发送验证码开关(true:调用真实发送接口,false:验证码写死123456)
+  sendSmsEnabled: false
+  # 写死的验证码(sendSmsEnabled为false时使用)
+  fixedVerifyCode: "123456"
   ym: city.baoxianzhanggui.com
+
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080

+ 33 - 33
nightFragrance-admin/src/main/resources/i18n/messages.properties

@@ -1,38 +1,38 @@
-#错误消息
-not.null=* 必须填写
-user.jcaptcha.error=验证码错误
-user.jcaptcha.expire=验证码已失效
-user.not.exists=用户不存在/密码错误
-user.password.not.match=用户不存在/密码错误
-user.password.retry.limit.count=密码输入错误{0}次
-user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
-user.password.delete=对不起,您的账号已被删除
-user.blocked=用户已封禁,请联系管理员
-role.blocked=角色已封禁,请联系管理员
-login.blocked=很遗憾,访问IP已被列入系统黑名单
-user.logout.success=退出成功
+#\u9519\u8BEF\u6D88\u606F
+not.null=* \u5FC5\u987B\u586B\u5199
+user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF
+user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548
+user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF
+user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF
+user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21
+user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F
+user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664
+user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
+role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
+login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355
+user.logout.success=\u9000\u51FA\u6210\u529F
 
-length.not.valid=长度必须在{min}到{max}个字符之间
+length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4
 
-user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
-user.password.not.valid=* 5-50个字符
+user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934
+user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26
 
-user.email.not.valid=邮箱格式错误
-user.mobile.phone.number.not.valid=手机号格式错误
-user.login.success=登录成功
-user.register.success=注册成功
-user.notfound=请重新登录
-user.forcelogout=管理员强制退出,请重新登录
-user.unknown.error=未知错误,请重新登录
+user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF
+user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF
+user.login.success=\u767B\u5F55\u6210\u529F
+user.register.success=\u6CE8\u518C\u6210\u529F
+user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55
+user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55
+user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55
 
-##文件上传消息
-upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
-upload.filename.exceed.length=上传的文件名最长{0}个字符
+##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F
+upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01<br/>\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01
+upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26
 
-##权限
-no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
-no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
-no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
-no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
-no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
-no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
+##\u6743\u9650
+no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]

+ 29 - 0
nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/BindPhoneBody.java

@@ -0,0 +1,29 @@
+package com.ylx.common.core.domain.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 绑定手机号请求类
+ *
+ * @author ylx
+ */
+@ApiModel(description = "绑定手机号请求")
+@Data
+public class BindPhoneBody {
+
+    @NotBlank(message = "openId不能为空")
+    @ApiModelProperty(value = "用户的openId", required = true)
+    private String openId;
+
+    @NotBlank(message = "手机号不能为空")
+    @ApiModelProperty(value = "手机号", required = true)
+    private String phone;
+
+    @NotBlank(message = "验证码不能为空")
+    @ApiModelProperty(value = "验证码", required = true)
+    private String code;
+}

+ 3 - 2
nightFragrance-framework/src/main/java/com/ylx/framework/security/handle/LogoutSuccessHandlerImpl.java

@@ -47,18 +47,19 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
     @Override
     public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
             throws IOException, ServletException {
-
+        log.info("用户退出登录");
         LoginUser loginUser = tokenService.getLoginUser(request);
         if (StringUtils.isNotNull(loginUser)) {
+            log.info("PC用户退出登录");
             String userName = loginUser.getUsername();
             // 删除用户缓存记录
             tokenService.delLoginUser(loginUser.getToken());
             // 记录用户退出日志
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
         }else{
+            log.info("微信用户退出登录");
             WxLoginUser wxUser = wxTokenService.getWxUser(request);
             if (StringUtils.isNotNull(wxUser)) {
-                log.info("微信用户退出登录:{}", JSONUtil.toJsonStr(wxUser));
                 String userName = wxUser.getUsername();
                 // 删除用户缓存记录
                 wxTokenService.delWxUser(wxUser.getToken());

+ 2 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/web/service/TokenService.java

@@ -62,6 +62,7 @@ public class TokenService {
     public LoginUser getLoginUser(HttpServletRequest request) {
         // 获取请求携带的令牌
         String token = getToken(request);
+        log.info("token的值:{}", token);
         if (StringUtils.isNotEmpty(token)) {
             try {
                 Claims claims = parseToken(token);
@@ -199,7 +200,7 @@ public class TokenService {
      * 获取请求token
      *
      * @param request
-     * @return token
+     * @return String token
      */
     private String getToken(HttpServletRequest request) {
         String token = request.getHeader(header);

+ 2 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/web/service/WxTokenService.java

@@ -53,8 +53,9 @@ public class WxTokenService {
     private RedisCache redisCache;
 
     /**
-     * 获取用户身份信息
+     * 获取用户身份信息(H5端)
      *
+     * @param request 请求对象
      * @return WxLoginUser 用户信息
      */
     public WxLoginUser getWxUser(HttpServletRequest request) {

+ 15 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TWxUserService.java

@@ -18,5 +18,20 @@ public interface TWxUserService extends IService<TWxUser> {
      */
     public TWxUser getByOpenId(String openId);
 
+    /**
+     * 根据手机号查询用户
+     * @param phone 手机号
+     * @return TWxUser
+     */
+    TWxUser getByPhone(String phone);
+
     Page<TWxUserVo> getUserList(Page<TWxUserVo> page, TWxUserVo user);
+
+    /**
+     * 绑定手机号
+     * @param openId 用户的openId
+     * @param phone 手机号
+     * @return boolean
+     */
+    boolean bindPhone(String openId, String phone);
 }

+ 17 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TWxUserServiceImpl.java

@@ -29,6 +29,13 @@ public class TWxUserServiceImpl extends ServiceImpl<TWxUserMapper, TWxUser> impl
         return getOne(wrapper);
     }
 
+    @Override
+    public TWxUser getByPhone(String phone) {
+        LambdaQueryWrapper<TWxUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(TWxUser::getcPhone, phone);
+        return getOne(wrapper);
+    }
+
     @Override
     public Page<TWxUserVo> getUserList(Page<TWxUserVo> page, TWxUserVo user) {
 
@@ -44,4 +51,14 @@ public class TWxUserServiceImpl extends ServiceImpl<TWxUserMapper, TWxUser> impl
         }
         return tWxUserVoPage;
     }
+
+    @Override
+    public boolean bindPhone(String openId, String phone) {
+        TWxUser user = getByOpenId(openId);
+        if (user == null) {
+            return false;
+        }
+        user.setcPhone(phone);
+        return updateById(user);
+    }
 }

+ 47 - 47
nightFragrance-system/src/main/java/com/ylx/system/domain/SysLogininfor.java

@@ -1,6 +1,7 @@
 package com.ylx.system.domain;
 
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ylx.common.annotation.Excel;
 import com.ylx.common.annotation.Excel.ColumnType;
@@ -11,134 +12,133 @@ import com.ylx.common.core.domain.BaseEntity;
  *
  * @author ylx
  */
-public class SysLogininfor extends BaseEntity
-{
+public class SysLogininfor extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** ID */
+    /**
+     * ID
+     */
     @Excel(name = "序号", cellType = ColumnType.NUMERIC)
     private Long infoId;
 
-    /** 用户账号 */
+    /**
+     * 用户账号
+     */
     @Excel(name = "用户账号")
     private String userName;
 
-    /** 登录状态 0成功 1失败 */
+    /**
+     * 登录状态 0成功 1失败
+     */
     @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败")
     private String status;
 
-    /** 登录IP地址 */
+    /**
+     * 登录IP地址
+     */
     @Excel(name = "登录地址")
     private String ipaddr;
 
-    /** 登录地点 */
+    /**
+     * 登录地点
+     */
     @Excel(name = "登录地点")
     private String loginLocation;
 
-    /** 浏览器类型 */
+    /**
+     * 浏览器类型
+     */
     @Excel(name = "浏览器")
     private String browser;
 
-    /** 操作系统 */
+    /**
+     * 操作系统
+     */
     @Excel(name = "操作系统")
     private String os;
 
-    /** 提示消息 */
+    /**
+     * 提示消息
+     */
     @Excel(name = "提示消息")
     private String msg;
 
-    /** 访问时间 */
+    /**
+     * 访问时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date loginTime;
 
-    public Long getInfoId()
-    {
+    public Long getInfoId() {
         return infoId;
     }
 
-    public void setInfoId(Long infoId)
-    {
+    public void setInfoId(Long infoId) {
         this.infoId = infoId;
     }
 
-    public String getUserName()
-    {
+    public String getUserName() {
         return userName;
     }
 
-    public void setUserName(String userName)
-    {
+    public void setUserName(String userName) {
         this.userName = userName;
     }
 
-    public String getStatus()
-    {
+    public String getStatus() {
         return status;
     }
 
-    public void setStatus(String status)
-    {
+    public void setStatus(String status) {
         this.status = status;
     }
 
-    public String getIpaddr()
-    {
+    public String getIpaddr() {
         return ipaddr;
     }
 
-    public void setIpaddr(String ipaddr)
-    {
+    public void setIpaddr(String ipaddr) {
         this.ipaddr = ipaddr;
     }
 
-    public String getLoginLocation()
-    {
+    public String getLoginLocation() {
         return loginLocation;
     }
 
-    public void setLoginLocation(String loginLocation)
-    {
+    public void setLoginLocation(String loginLocation) {
         this.loginLocation = loginLocation;
     }
 
-    public String getBrowser()
-    {
+    public String getBrowser() {
         return browser;
     }
 
-    public void setBrowser(String browser)
-    {
+    public void setBrowser(String browser) {
         this.browser = browser;
     }
 
-    public String getOs()
-    {
+    public String getOs() {
         return os;
     }
 
-    public void setOs(String os)
-    {
+    public void setOs(String os) {
         this.os = os;
     }
 
-    public String getMsg()
-    {
+    public String getMsg() {
         return msg;
     }
 
-    public void setMsg(String msg)
-    {
+    public void setMsg(String msg) {
         this.msg = msg;
     }
 
-    public Date getLoginTime()
-    {
+    public Date getLoginTime() {
         return loginTime;
     }
 
-    public void setLoginTime(Date loginTime)
-    {
+    public void setLoginTime(Date loginTime) {
         this.loginTime = loginTime;
     }
 }