From c951cb4fc418bc03f2eb1acc604d936716f38f84 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sun, 26 Apr 2026 11:03:31 +0800
Subject: [PATCH] 1

---
 src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java     |   17 +++
 src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java |   68 ++++++++-----
 src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java          |   21 ++++
 src/main/java/com/nq/service/ISiteAdminService.java         |    8 +
 src/main/java/com/nq/controller/AdminApiController.java     |  109 ++++++++++++++++++++-
 src/main/java/com/nq/pojo/GoogleAuthDto.java                |   14 ++
 src/main/java/com/nq/pojo/SiteAdmin.java                    |   11 ++
 7 files changed, 216 insertions(+), 32 deletions(-)

diff --git a/src/main/java/com/nq/controller/AdminApiController.java b/src/main/java/com/nq/controller/AdminApiController.java
index 3820b97..43eda01 100644
--- a/src/main/java/com/nq/controller/AdminApiController.java
+++ b/src/main/java/com/nq/controller/AdminApiController.java
@@ -1,9 +1,13 @@
 package com.nq.controller;
 
 import com.nq.common.ServerResponse;
+import com.nq.dao.SiteAdminMapper;
+import com.nq.pojo.GoogleAuthDto;
+import com.nq.pojo.SiteAdmin;
 import com.nq.pojo.SiteAdminIndex;
 import com.nq.pojo.SiteSpread;
 import com.nq.service.*;
+import com.nq.service.impl.GoogleAuthenticator;
 import com.nq.utils.PropertiesUtil;
 import com.nq.utils.redis.CookieUtils;
 import com.nq.utils.redis.JsonUtil;
@@ -14,13 +18,12 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 @Controller
 @RequestMapping({"/api/admin/"})
@@ -47,12 +50,19 @@
     @Autowired
     SiteAdminIndexService siteAdminIndexService;
 
+    @Autowired
+    SiteAdminMapper siteAdminMapper;
 
     //管理系统登录
     @RequestMapping({"login.do"})
     @ResponseBody
-    public ServerResponse login(@RequestParam("adminPhone") String adminPhone, @RequestParam("adminPwd") String adminPwd, @RequestParam("verifyCode") String verifyCode, HttpSession httpSession, HttpServletRequest request, HttpServletResponse response) {
-        ServerResponse serverResponse = this.iSiteAdminService.login(adminPhone, adminPwd, verifyCode, request);
+    public ServerResponse login(@RequestParam("adminPhone") String adminPhone,
+                                @RequestParam("adminPwd") String adminPwd,
+                                @RequestParam("verifyCode") String verifyCode,
+                                @RequestParam(value = "googleAuthCode", required = false) Integer googleAuthCode,
+                                HttpSession httpSession, HttpServletRequest request,
+                                HttpServletResponse response) {
+        ServerResponse serverResponse = this.iSiteAdminService.login(adminPhone, adminPwd, verifyCode, googleAuthCode,request);
 
         return serverResponse;
     }
@@ -127,6 +137,95 @@
 
 
 
+    /**
+     * 获取当前登录用户
+     * @return
+     */
+    @GetMapping("getAdmin")
+    @ResponseBody
+    public ServerResponse getAdmin(HttpServletRequest request) {
+        String cookie_name = PropertiesUtil.getProperty("admin.cookie.name");
+        SiteAdmin siteAdmin = null;
+        if(StringUtils.isNotEmpty(cookie_name)){
+            String logintoken = CookieUtils.readLoginToken(request, cookie_name);
+            String adminJson = RedisShardedPoolUtils.get(logintoken);
+            siteAdmin = (SiteAdmin) JsonUtil.string2Obj(adminJson, SiteAdmin.class);
+            siteAdmin = siteAdminMapper.selectById(siteAdmin.getId());
+        }
+        return ServerResponse.createBySuccess(siteAdmin);
+    }
+
+
+    /**
+     * 获取谷歌验证码密钥
+     * @return
+     */
+    @GetMapping("getLoginGoogleAuthSecret")
+    @ResponseBody
+    public ServerResponse getLoginGoogleAuthSecret(HttpServletRequest request) {
+        GoogleAuthDto dto = iSiteAdminService.getGoogleAuth(request);
+        return ServerResponse.createBySuccess(dto);
+    }
+
+    /**
+     * 绑定谷歌验证码
+     */
+    @PostMapping("bindGoogleAuth")
+    @ResponseBody
+    public ServerResponse updateGoogleAuth(@RequestParam("id") String id,
+                                           @RequestParam("googleAuthCode") String googleAuthCode,
+                                           @RequestParam("secret") String secret) {
+        SiteAdmin siteAdmin = siteAdminMapper.selectById(id);
+        if (siteAdmin == null) {
+            return ServerResponse.createByErrorMsg("当前用户未找到");
+        }
+        long t = System.currentTimeMillis();
+        GoogleAuthenticator ga = new GoogleAuthenticator();
+        ga.setWindowSize(5);
+        if (siteAdmin.getGoogleAuthBind()) {
+            return ServerResponse.createByErrorMsg("谷歌验证码已绑定");
+        }
+        boolean userFlag = ga.check_code(secret, Long.valueOf(googleAuthCode), t);
+        if (!userFlag) {
+            return ServerResponse.createByErrorMsg("谷歌验证码错误");
+        }
+        siteAdmin.setGoogleAuthBind(true);
+        siteAdmin.setGoogleAuthSecret(secret);
+        siteAdminMapper.updateById(siteAdmin);
+        return ServerResponse.createBySuccess();
+    }
+
+
+    /**
+     * 解绑谷歌验证码
+     * @param param
+     * @return
+     */
+    @PostMapping("/unbindingGoogleAuth")
+    @ResponseBody
+    public ServerResponse unbindingGoogleAuth(@RequestParam("id") String id,
+                                              @RequestParam("rootGoogleAuthCode") String rootGoogleAuthCode) {
+        SiteAdmin siteAdmin = siteAdminMapper.selectById(id);
+        if (siteAdmin == null) {
+            return ServerResponse.createByErrorMsg("当前用户未找到");
+        }
+        long t = System.currentTimeMillis();
+        GoogleAuthenticator ga = new GoogleAuthenticator();
+        ga.setWindowSize(5);
+        boolean flag = ga.check_code(siteAdmin.getGoogleAuthSecret(), Long.valueOf(rootGoogleAuthCode), t);
+        if (flag) {
+            if (!siteAdmin.getGoogleAuthBind()) {
+                return ServerResponse.createByErrorMsg("谷歌验证码未绑定,无需解绑!");
+
+            }
+            siteAdmin.setGoogleAuthBind(false);
+            siteAdmin.setGoogleAuthSecret("");
+            siteAdminMapper.updateById(siteAdmin);
+        } else {
+            return ServerResponse.createByErrorMsg("超级谷歌验证码错误");
+        }
+        return ServerResponse.createBySuccess();
+    }
 
 
 //    //页面样式设置
diff --git a/src/main/java/com/nq/pojo/GoogleAuthDto.java b/src/main/java/com/nq/pojo/GoogleAuthDto.java
new file mode 100644
index 0000000..caa37e7
--- /dev/null
+++ b/src/main/java/com/nq/pojo/GoogleAuthDto.java
@@ -0,0 +1,14 @@
+package com.nq.pojo;
+
+import lombok.Data;
+
+@Data
+public class GoogleAuthDto {
+
+
+    //密钥
+    private  String googleAuthSecret;
+
+    //密钥
+    private  String googleAuthImg;
+}
diff --git a/src/main/java/com/nq/pojo/SiteAdmin.java b/src/main/java/com/nq/pojo/SiteAdmin.java
index 3a5fa95..fea278a 100644
--- a/src/main/java/com/nq/pojo/SiteAdmin.java
+++ b/src/main/java/com/nq/pojo/SiteAdmin.java
@@ -1,6 +1,7 @@
 package com.nq.pojo;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.util.Date;
@@ -15,6 +16,14 @@
     private Date addTime;
     private String token;
 
-
+    /**
+     * 谷歌验证器
+     */
+    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
+    private String googleAuthSecret;
+    /**
+     * 谷歌验证器是否绑定
+     */
+    private Boolean googleAuthBind=false;
 }
 
diff --git a/src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java b/src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java
new file mode 100644
index 0000000..e808c12
--- /dev/null
+++ b/src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java
@@ -0,0 +1,17 @@
+package com.nq.pojo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UnbindingGoogleAuthModel {
+
+
+    private  long id;
+
+
+    //谷歌验证码
+    @NotBlank
+    private String rootGoogleAuthCode;
+}
diff --git a/src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java b/src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java
new file mode 100644
index 0000000..f8b369b
--- /dev/null
+++ b/src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java
@@ -0,0 +1,21 @@
+package com.nq.pojo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UpdateGoogleAuthDto {
+
+
+    private  long id;
+
+    //谷歌密钥
+    @NotBlank
+    private String secret;
+
+
+    //验证码
+    private String googleAuthCode;
+
+}
diff --git a/src/main/java/com/nq/service/ISiteAdminService.java b/src/main/java/com/nq/service/ISiteAdminService.java
index 07329f9..7a6b0a3 100644
--- a/src/main/java/com/nq/service/ISiteAdminService.java
+++ b/src/main/java/com/nq/service/ISiteAdminService.java
@@ -3,12 +3,15 @@
 
 import com.github.pagehelper.PageInfo;
 import com.nq.common.ServerResponse;
+import com.nq.pojo.GoogleAuthDto;
 import com.nq.pojo.SiteAdmin;
 
 import javax.servlet.http.HttpServletRequest;
 
 public interface ISiteAdminService {
-  ServerResponse login(String paramString1, String paramString2, String paramString3, HttpServletRequest paramHttpServletRequest);
+
+
+  ServerResponse login(String paramString1, String paramString2, String paramString3, Integer googleAuthCode,HttpServletRequest paramHttpServletRequest);
   
   ServerResponse<PageInfo> listByAdmin(String paramString1, String paramString2, HttpServletRequest paramHttpServletRequest, int paramInt1, int paramInt2);
   
@@ -29,4 +32,7 @@
   ServerResponse deleteAdmin(Integer adminId);
 
   ServerResponse moneyCount(String agentId, String startTime, String entTime);
+
+  GoogleAuthDto getGoogleAuth(HttpServletRequest request);
+
 }
diff --git a/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java b/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
index 863377c..958d9f4 100644
--- a/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
@@ -1,6 +1,9 @@
 package com.nq.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nq.dao.*;
@@ -30,6 +33,7 @@
 import com.nq.utils.PropertiesUtil;
 
 import com.nq.utils.SymmetricCryptoUtil;
+import com.nq.utils.redis.CookieUtils;
 import com.nq.utils.redis.JsonUtil;
 import com.nq.utils.redis.RedisConst;
 import com.nq.utils.redis.RedisShardedPoolUtils;
@@ -109,53 +113,43 @@
     @Autowired
     AgentUserMapper agentUserMapper;
 
-    public ServerResponse login(String adminPhone, String adminPwd, String verifyCode, HttpServletRequest request) {
+    public ServerResponse login(String adminPhone, String adminPwd, String verifyCode,Integer googleAuthCode, HttpServletRequest request) {
 
         if (StringUtils.isBlank(verifyCode)) {
-
             return ServerResponse.createByErrorMsg("验证码不能为空");
-
         }
-//
-        String original = (String) request.getSession().getAttribute("KAPTCHA_SESSION_KEY");
 
-        /*if (!verifyCode.equalsIgnoreCase(original)) {
-
-            return ServerResponse.createByErrorMsg("验证码错误");
-
-        }*/
-
-
-        if (StringUtils.isBlank(adminPhone) || StringUtils.isBlank(adminPwd)) {
+        if (StringUtils.isBlank(adminPhone) || StringUtils.isBlank(adminPwd) ) {
 
             return ServerResponse.createByErrorMsg("参数不能为空");
 
         }
-
-        SymmetricCryptoUtil.decryptPassword("8OTlTNZ9EwQ29Pf0R8a37Q==");
         adminPwd = SymmetricCryptoUtil.encryptPassword(adminPwd);
         SiteAdmin siteAdmin = this.siteAdminMapper.login(adminPhone, adminPwd);
-//        SiteAdmin siteAdmin = (SiteAdmin) siteAdminMapper.selectOne(new QueryWrapper<SiteAdmin>().eq("admin_phone", adminPhone).eq("admin_pwd", adminPwd));
-
         if (siteAdmin == null) {
-
             return ServerResponse.createByErrorMsg("账号密码错误");
-
         }
-
-
         if (siteAdmin.getIsLock().intValue() == 1) {
-
             return ServerResponse.createByErrorMsg("账号已被锁定");
-
         }
-
+        if(siteAdmin.getGoogleAuthBind() && ObjectUtil.isEmpty(googleAuthCode)){
+            return ServerResponse.createByErrorMsg("谷歌验证码不能为空");
+        }
+        if(siteAdmin.getGoogleAuthBind()){
+            long t = System.currentTimeMillis();
+            GoogleAuthenticator ga = new GoogleAuthenticator();
+            ga.setWindowSize(5);
+            boolean userFlag = ga.check_code(siteAdmin.getGoogleAuthSecret(), Long.valueOf(googleAuthCode), t);
+            if (!userFlag) {
+                return ServerResponse.createByErrorMsg("谷歌验证码错误!");
+            }
+        }
 
         siteAdmin.setAdminPwd(null);
         HttpSession httpSession = request.getSession();
         String token = RedisConst.getAdminRedisKey(httpSession.getId());
 
-        String str = RedisShardedPoolUtils.setEx(token,
+        RedisShardedPoolUtils.setEx(token,
                 JsonUtil.obj2String(siteAdmin), 999999);
 
 
@@ -164,6 +158,30 @@
 
     }
 
+    @Override
+    public GoogleAuthDto getGoogleAuth(HttpServletRequest request) {
+        String secretKey = GoogleAuthenticator.generateSecretKey();
+        QrConfig config = new QrConfig(345, 345);
+        config.setMargin(3);
+        String cookie_name = PropertiesUtil.getProperty("admin.cookie.name");
+        SiteAdmin siteAdmin = null;
+        if(StringUtils.isNotEmpty(cookie_name)){
+            siteAdmin = getAdmin(cookie_name,request);
+        }
+        String content = String.format("otpauth://totp/%s?secret=%s", siteAdmin.getAdminName(),secretKey);
+        String base64 = QrCodeUtil.generateAsBase64(content, config, "png");
+        GoogleAuthDto dto = new GoogleAuthDto();
+        dto.setGoogleAuthImg(base64);
+        dto.setGoogleAuthSecret(secretKey);
+        return dto;
+    }
+
+    public SiteAdmin getAdmin(String cookie_name,HttpServletRequest request){
+        String logintoken = CookieUtils.readLoginToken(request, cookie_name);
+        String adminJson = RedisShardedPoolUtils.get(logintoken);
+        return (SiteAdmin) JsonUtil.string2Obj(adminJson, SiteAdmin.class);
+    }
+
 
     public ServerResponse<PageInfo> listByAdmin(String adminName, String adminPhone, HttpServletRequest request, int pageNum, int pageSize) {
 

--
Gitblit v1.9.3