Browse Source

添加手机登录

DESKTOP-USV654P\pc 1 year ago
parent
commit
67e860ef09

+ 22 - 1
src/main/java/com/xjrsoft/common/utils/WeChatUtil.java

@@ -24,7 +24,28 @@ public class WeChatUtil {
 
     @Value("${xjrsoft.enterpriseWeChat.agentid}")
     public Integer agentid;
-    
+
+    @Value("${xjrsoft.mpWeixin.appKey}")
+    public String mpAppKey;
+
+    @Value("${xjrsoft.mpWeixin.appSecret}")
+    public String mpAppSecret;
+
+    //获取Openid
+    public  String getOpenid(String code) {
+        HashMap<String, Object> paramMap = new HashMap<>();
+        paramMap.put("appid", mpAppKey);
+        paramMap.put("secret", mpAppSecret);
+        paramMap.put("code", code);
+        paramMap.put("grant_type", "authorization_code");
+        String result = HttpUtil.get("https://api.weixin.qq.com/sns/oauth2/access_token", paramMap);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        if (jsonObject.containsKey("errcode")) {
+            return null;
+        }
+        String openId = jsonObject.get("openid").toString();
+        return openId;
+    }
 
     //获取通讯录或发消息token
     public String getToken(Integer type) {

+ 25 - 0
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -331,4 +331,29 @@ public class UserController {
         });
         return R.ok(userService.updateById(user));
     }
+
+    @PutMapping("/bind-openid")
+    @ApiOperation(value = "绑定微信")
+    public  R bindOpenid(@RequestBody BindOpenidDto dto) {
+        User user = userService.getOne(Wrappers.<User>query().lambda().select(User::getId, User::getOpenId).eq(User::getId, dto.getId()), false);
+        if (user != null) {
+            if (StrUtil.isNotBlank(user.getOpenId())) {
+                return R.error("该用户已经绑定微信!");
+            }
+            User updateUser = new User();
+            updateUser.setId(dto.getId());
+            updateUser.setOpenId(dto.getOpenid());
+            return R.ok(userService.updateById(updateUser));
+        }
+        return R.error("该用户不存在!");
+    }
+
+    @PutMapping("/unbind-openid")
+    @ApiOperation(value = "取消绑定微信")
+    public  R unbindOpenid(@RequestBody Long id) {
+        User updateUser = new User();
+        updateUser.setId(id);
+        updateUser.setOpenId("");
+        return R.ok(userService.updateById(updateUser));
+    }
 }

+ 9 - 0
src/main/java/com/xjrsoft/module/organization/dto/BindOpenidDto.java

@@ -0,0 +1,9 @@
+package com.xjrsoft.module.organization.dto;
+
+import lombok.Data;
+
+@Data
+public class BindOpenidDto {
+    private Long id;
+    private String openid;
+}

+ 8 - 13
src/main/java/com/xjrsoft/module/system/controller/LoginController.java

@@ -7,24 +7,16 @@ import cn.hutool.jwt.JWT;
 import cn.hutool.jwt.JWTUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.wf.captcha.ArithmeticCaptcha;
-import com.wf.captcha.SpecCaptcha;
-import com.wf.captcha.base.Captcha;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.sms.SmsSender;
-import com.xjrsoft.common.utils.FixedArithmeticCaptcha;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.config.KeyCloakConfig;
-import com.xjrsoft.config.LicenseConfig;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
-import com.xjrsoft.module.system.dto.CreateTokenDto;
-import com.xjrsoft.module.system.dto.KeyCloakLoginInfoDto;
-import com.xjrsoft.module.system.dto.LoginCaptchaDto;
-import com.xjrsoft.module.system.dto.LoginDto;
+import com.xjrsoft.module.system.dto.*;
 import com.xjrsoft.module.system.service.ILoginService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -36,11 +28,7 @@ import org.keycloak.authorization.client.Configuration;
 import org.keycloak.representations.AccessTokenResponse;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.awt.*;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -74,6 +62,13 @@ public class LoginController {
         return R.ok(loginService.login(dto));
     }
 
+    @PostMapping("/loginByCode")
+    @ApiOperation(value = "登录", notes = "code")
+    @XjrLog(value = "Code登录成功")
+    public R loginByCode(@RequestBody @Valid LoginByCodeDto dto) throws Exception {
+        return R.ok(loginService.loginByCode(dto));
+    }
+
     @GetMapping("/imgcaptcha")
     @ApiOperation(value = "图形验证码",notes = "图形验证码")
     public R imgCaptcha(){

+ 13 - 0
src/main/java/com/xjrsoft/module/system/dto/LoginByCodeDto.java

@@ -0,0 +1,13 @@
+package com.xjrsoft.module.system.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class LoginByCodeDto {
+    @ApiModelProperty("Code")
+    @NotBlank(message = "Code不能为空!")
+    private String code;
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/system/service/ILoginService.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.system.service;
 
 import com.xjrsoft.module.system.dto.CreateTokenDto;
+import com.xjrsoft.module.system.dto.LoginByCodeDto;
 import com.xjrsoft.module.system.dto.LoginDto;
 import com.xjrsoft.module.system.vo.CreateTokenVo;
 import com.xjrsoft.module.system.vo.ImgCaptchaVo;
@@ -15,6 +16,8 @@ public interface ILoginService {
 
     LoginVo login(LoginDto dto) throws Exception;
 
+    LoginVo loginByCode(LoginByCodeDto dto) throws Exception;
+
     CreateTokenVo createToken(CreateTokenDto dto);
 
     ImgCaptchaVo imgCaptcha();

+ 63 - 37
src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java

@@ -17,16 +17,20 @@ import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.FixedArithmeticCaptcha;
 import com.xjrsoft.common.utils.RSAUtil;
 import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.common.utils.WeChatUtil;
 import com.xjrsoft.config.LicenseConfig;
 import com.xjrsoft.module.organization.entity.*;
 import com.xjrsoft.module.organization.service.*;
 import com.xjrsoft.module.system.dto.CreateTokenDto;
+import com.xjrsoft.module.system.dto.LoginByCodeDto;
 import com.xjrsoft.module.system.dto.LoginDto;
 import com.xjrsoft.module.system.service.ILoginService;
 import com.xjrsoft.module.system.vo.CreateTokenVo;
 import com.xjrsoft.module.system.vo.ImgCaptchaVo;
+import com.xjrsoft.module.system.vo.LoginByCodeVo;
 import com.xjrsoft.module.system.vo.LoginVo;
 import lombok.AllArgsConstructor;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -56,10 +60,10 @@ public class LoginServiceImpl implements ILoginService {
 
     private final LicenseConfig licenseConfig;
 
+    private final WeChatUtil weChatUtil;
+
     @Override
     public LoginVo login(LoginDto dto) throws Exception {
-        LoginVo result = new LoginVo();
-
         if (licenseConfig.getEnabled()) {
             //查出所有在线用户
             List<String> onlineUser = StpUtil.searchSessionId("", 0, Integer.MAX_VALUE);
@@ -93,12 +97,67 @@ public class LoginServiceImpl implements ILoginService {
             throw new MyException("账号或密码不正确");
         }
 
+        return getLoginInfo(loginUser, "PC");
+    }
+
+    @Override
+    public LoginByCodeVo loginByCode(LoginByCodeDto dto) throws Exception {
+        LoginByCodeVo result = new LoginByCodeVo();
+        String openId = weChatUtil.getOpenid(dto.getCode());
+        if (openId == null) throw new MyException("code无效");
+
+        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(User::getOpenId, openId);
+        User loginUser = userService.getOne(queryWrapper);
+
+        result.setOpenid(openId);
+        if (loginUser == null) {
+            return result;
+        }
+        LoginVo loginVo = getLoginInfo(loginUser, "WX-MP");
+        result.setToken(loginVo.getToken());
+        return result;
+    }
+
+    @Override
+    public CreateTokenVo createToken(CreateTokenDto dto) {
+        CreateTokenVo vo = new CreateTokenVo();
+
+        if (dto.getExpire() == -1) {
+            String token = SaTempUtil.createToken(IdUtil.fastSimpleUUID() + StringPool.UNDERSCORE + GlobalConstant.SECRET_KEY, Integer.MAX_VALUE);
+            vo.setToken(token);
+            return vo;
+        } else {
+            String token = SaTempUtil.createToken(IdUtil.fastSimpleUUID() + StringPool.UNDERSCORE + GlobalConstant.SECRET_KEY, dto.getExpire());
+            vo.setToken(token);
+            return vo;
+        }
+
+    }
+
+    /**
+     * 图形验证码
+     */
+    @Override
+    public ImgCaptchaVo imgCaptcha() {
+        // 算术类型
+        FixedArithmeticCaptcha captcha = new FixedArithmeticCaptcha(130, 48);
+
+        String rKey = GlobalConstant.LOGIN_IMG_CAPTCHA + UUID.randomUUID().toString();
+
+        // 存入redis并设置过期时间为30分钟
+        redisUtil.set(rKey, captcha.text(), 30 * 60);
+
+        return new ImgCaptchaVo(rKey, captcha.toBase64());
+    }
+
+    private LoginVo getLoginInfo(User loginUser, String loginType) throws Exception {
+        LoginVo result = new LoginVo();
         if (loginUser.getEnabledMark() == EnabledMark.DISABLED.getCode()) {
             throw new MyException("账户未启用");
         }
-
         //此登录接口登录web端
-        StpUtil.login(loginUser.getId(), "PC");
+        StpUtil.login(loginUser.getId(), loginType);
 
         SaSession tokenSession = StpUtil.getTokenSession();
 
@@ -159,37 +218,4 @@ public class LoginServiceImpl implements ILoginService {
         result.setToken(StpUtil.getTokenValue());
         return result;
     }
-
-    @Override
-    public CreateTokenVo createToken(CreateTokenDto dto) {
-        CreateTokenVo vo = new CreateTokenVo();
-
-        if (dto.getExpire() == -1) {
-            String token = SaTempUtil.createToken(IdUtil.fastSimpleUUID() + StringPool.UNDERSCORE + GlobalConstant.SECRET_KEY, Integer.MAX_VALUE);
-            vo.setToken(token);
-            return vo;
-        } else {
-            String token = SaTempUtil.createToken(IdUtil.fastSimpleUUID() + StringPool.UNDERSCORE + GlobalConstant.SECRET_KEY, dto.getExpire());
-            vo.setToken(token);
-            return vo;
-        }
-
-    }
-
-    /**
-     * 图形验证码
-     */
-    @Override
-    public ImgCaptchaVo imgCaptcha() {
-        // 算术类型
-        FixedArithmeticCaptcha captcha = new FixedArithmeticCaptcha(130, 48);
-
-        String rKey = GlobalConstant.LOGIN_IMG_CAPTCHA + UUID.randomUUID().toString();
-
-        // 存入redis并设置过期时间为30分钟
-        redisUtil.set(rKey, captcha.text(), 30 * 60);
-
-        return new ImgCaptchaVo(rKey, captcha.toBase64());
-    }
-
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/system/vo/LoginByCodeVo.java

@@ -0,0 +1,11 @@
+package com.xjrsoft.module.system.vo;
+
+import lombok.Data;
+
+@Data
+public class LoginByCodeVo extends LoginVo {
+    /**
+     * openid
+     */
+    private String openid;
+}

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

@@ -72,6 +72,7 @@ xjrsoft:
       - /${magic-api.web}/**    # magic-api web
       - /${magic-api.prefix}/** # magic-api 前缀
       - /bi/project/info # 桌面
+      - /system/loginByCode #编号登录
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25
@@ -84,6 +85,9 @@ xjrsoft:
     secret: 02YXuJw_vYYJiDQvG-eKlXCUTDAaAJ1z7m9t8_hqoa0
     secret1: z3R17Od4ROW1zPisguiQmTfx0NvcYKmoIu19-82vdtU
     agentid: 1000003
+  mpWeixin:
+    appKey: wx628ac080912b2a98
+    appSecret: c60d16835ae708bca8f0298243936850
   dingtalk:
     appKey: dingaex2gok1rllumlqs
     appSecret: Nv2pe-UoR0Z_Iw8d29laZfL3kH6ElmhZpRdPwI7SvmKJmaCI29qCrSlFEiMM88MB