```
feat(user): 添加QQ绑定功能并重构用户登录逻辑 - 在BaseSysUser模型中添加QQ字段,移除密码字段(暂时注释) - 移除base.bbs.go中的GetUserInfo函数,将其迁移至base_sys_user.go - 将登录服务中的外部API调用逻辑整合到BaseSysUserService - 新增BindQQ方法实现QQ号绑定功能,包含重复绑定检查 - 更新GetUserInfo方法,完善用户信息获取和同步逻辑 - 优化导入包,移除未使用的依赖项 ```
This commit is contained in:
@@ -1,15 +1,5 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/cookiejar"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// TokenResponse 用来解析第一次请求返回的 JSON
|
||||
type TokenResponse struct {
|
||||
Token string `json:"token"`
|
||||
@@ -101,73 +91,3 @@ type GroupAttributes struct {
|
||||
var bbsurl = "http://43.248.3.21:45632"
|
||||
|
||||
// GetUserInfo 输入用户名和密码,返回用户信息结构体
|
||||
func GetUserInfo(username, password string) (*UserResponse, error) {
|
||||
// 创建带 Cookie 存储的 HTTP 客户端
|
||||
jar, err := cookiejar.New(nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建 CookieJar 失败: %w", err)
|
||||
}
|
||||
client := &http.Client{Jar: jar}
|
||||
|
||||
// 1. POST 获取 token
|
||||
tokenURL := bbsurl + "/api/token"
|
||||
formData := url.Values{}
|
||||
formData.Set("identification", username)
|
||||
formData.Set("password", password)
|
||||
|
||||
req, err := http.NewRequest("POST", tokenURL, strings.NewReader(formData.Encode()))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建请求失败: %w", err)
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("发送请求失败: %w", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取响应失败: %w", err)
|
||||
}
|
||||
|
||||
// 解析 token
|
||||
var tokenResp TokenResponse
|
||||
err = json.Unmarshal(body, &tokenResp)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析 token 失败: %w", err)
|
||||
}
|
||||
|
||||
// 提取 CSRF Token
|
||||
csrfToken := resp.Header.Get("X-CSRF-Token")
|
||||
|
||||
// 2. GET 获取该用户的详细信息
|
||||
usersURL := bbsurl + fmt.Sprintf("/api/users/%d", tokenResp.UserID)
|
||||
req2, err := http.NewRequest("GET", usersURL, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建请求失败: %w", err)
|
||||
}
|
||||
req2.Header.Set("Authentication", tokenResp.Token)
|
||||
req2.Header.Set("X-CSRF-Token", csrfToken)
|
||||
|
||||
resp2, err := client.Do(req2)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("发送请求失败: %w", err)
|
||||
}
|
||||
defer resp2.Body.Close()
|
||||
|
||||
body2, err := io.ReadAll(resp2.Body)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取响应失败: %w", err)
|
||||
}
|
||||
|
||||
// 解析用户信息
|
||||
var userResp UserResponse
|
||||
err = json.Unmarshal(body2, &userResp)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析用户信息失败: %w", err)
|
||||
}
|
||||
|
||||
return &userResp, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user