From 710d72aefed5bd457660293f97ff207aad598bcd Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 14 Nov 2025 20:10:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0cookie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/defConfig/errorCodes.json | 5 +- backend/models/def.go | 26 ++++++++ backend/routers/api.go | 2 +- backend/routers/apiUsers.go | 41 +++++++++++++ backend/routers/return.go | 8 +-- .../ops_vue_js/src/components/HeardMain.vue | 59 +++++++++++++++++-- frontent/ops_vue_js/src/i18n/en.json | 19 +++--- frontent/ops_vue_js/src/i18n/zh-CN.json | 23 +++++--- frontent/ops_vue_js/src/my_network_func.js | 16 ++++- frontent/ops_vue_js/src/router/index.js | 13 +++- frontent/ops_vue_js/src/stores/user.js | 39 +++++++++++- frontent/ops_vue_js/src/views/HomeView.vue | 1 + frontent/ops_vue_js/src/views/adminView.vue | 0 frontent/ops_vue_js/src/views/loginView.vue | 8 +-- 14 files changed, 221 insertions(+), 39 deletions(-) create mode 100644 frontent/ops_vue_js/src/views/adminView.vue diff --git a/backend/defConfig/errorCodes.json b/backend/defConfig/errorCodes.json index 55c10db..93bcb71 100644 --- a/backend/defConfig/errorCodes.json +++ b/backend/defConfig/errorCodes.json @@ -5,6 +5,9 @@ "jsonErr":-3, "userNameDup":-4, "userNameNoFund":-41, - "userPassIncorrect":-42 + "userPassIncorrect":-42, + "userCookieError":-44, + "userCookieNotFund":-45, + "userCookieExpired":-46 } \ No newline at end of file diff --git a/backend/models/def.go b/backend/models/def.go index 9e22137..7d8b2d1 100644 --- a/backend/models/def.go +++ b/backend/models/def.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "crypto/rand" "encoding/hex" + "time" ) @@ -55,3 +56,28 @@ func HashUserPass(user *TabUser_) { } } + +func IsExpired(expireTime time.Time) bool { + return expireTime.Before(time.Now()) +} + +func CheckCookiesAndUpdate(cookie *TabCookie_) bool { + if !IsExpired(cookie.ExpiresAt) { + if cookie.Remember { + cookiewhere := TabCookie_{ + ID: cookie.ID, + } + cookieupdata := TabCookie_{ + UpdatedAt: time.Now(), + ExpiresAt: time.Now().Add(time.Duration(ConfigsUser.CookieTimeout) * time.Second), + } + DB.Where(&cookiewhere).Updates(&cookieupdata) + + } + return true + } else { + //以过期 + return false + } + //return false +} diff --git a/backend/routers/api.go b/backend/routers/api.go index b5f62b2..a1278c3 100644 --- a/backend/routers/api.go +++ b/backend/routers/api.go @@ -31,7 +31,7 @@ func SeparateData(ctx *gin.Context) (map[string]interface{}, string) { if err := ctx.ShouldBindJSON(&jsonData); err == nil { //分离数据 - cookie, ok := jsonData["cookie"].(string) + cookie, ok := jsonData["userCookieValue"].(string) if !ok { cookie = "" } diff --git a/backend/routers/apiUsers.go b/backend/routers/apiUsers.go index 325d6bf..9e48e6a 100644 --- a/backend/routers/apiUsers.go +++ b/backend/routers/apiUsers.go @@ -73,6 +73,47 @@ func ApiUser(r *gin.RouterGroup) { r.POST("/test", func(ctx *gin.Context) { ReturnJson(ctx, "apiOK", nil) }) + //通过cookie获取用户info + r.POST("/getinfo", func(ctx *gin.Context) { + _, cookieval := SeparateData(ctx) + //fmt.Println("cookieis" + cookieval) + if cookieval != "" { + cookie := models.TabCookie_{ + Value: cookieval, + } + if models.DB.Where(&cookie).First(&cookie).Error == nil { + //找到cookie,验证cookie有效性,以及更新cookie + if models.CheckCookiesAndUpdate(&cookie) { + //cookie有效 + //返回最新cookie + redata := map[string]interface{}{ + "cookie": cookie, + } + //载入用户info + userInfo := models.TabFileInfo_{ + UserID: cookie.UserID, + } + if models.DB.Where(&userInfo).First(&userInfo).Error == nil { + redata["userInfo"] = userInfo + } else { + redata["userInfo"] = nil + } + + ReturnJson(ctx, "apiOK", redata) + + } else { + ReturnJson(ctx, "userCookieExpired", nil) + } + + } else { + ReturnJson(ctx, "userCookieNotFund", nil) + } + + } else { + ReturnJson(ctx, "userCookieError", nil) + } + + }) //用户登陆 r.POST("/login", func(ctx *gin.Context) { var loginuser From_user_login diff --git a/backend/routers/return.go b/backend/routers/return.go index 09091d3..11f5830 100644 --- a/backend/routers/return.go +++ b/backend/routers/return.go @@ -6,10 +6,10 @@ func ReturnJson(ctx *gin.Context, errMsg string, data map[string]interface{}) { var errCode = ErrorCode[errMsg] returnData := map[string]interface{}{} - cookie, have_cookie := ctx.Get("cookie") - if have_cookie { - returnData["cookie"] = cookie - } + // cookie, have_cookie := ctx.Get("cookie") + // if have_cookie { + // returnData["cookie"] = cookie + // } returnData["err_code"] = errCode returnData["err_msg"] = errMsg diff --git a/frontent/ops_vue_js/src/components/HeardMain.vue b/frontent/ops_vue_js/src/components/HeardMain.vue index 7d634c7..2c2c46e 100644 --- a/frontent/ops_vue_js/src/components/HeardMain.vue +++ b/frontent/ops_vue_js/src/components/HeardMain.vue @@ -178,7 +178,6 @@ onMounted(() => { diff --git a/frontent/ops_vue_js/src/i18n/en.json b/frontent/ops_vue_js/src/i18n/en.json index b83105c..81fb154 100644 --- a/frontent/ops_vue_js/src/i18n/en.json +++ b/frontent/ops_vue_js/src/i18n/en.json @@ -34,13 +34,18 @@ "this_not_email": "This is not an email address.", "create_new_account": "Create new account", "already_have_an_account": "Already have an account?", - "network_err":"Network error", - "username_dup":"Duplicate username", - "registration_successful":"Registration successful!", - "server_error":"Server Error", - "user_not_found":"User not found", - "username_or_password_incorrect":"Username or password incorrect.", - "login_successful":"Login successful" + "network_err": "Network error", + "username_dup": "Duplicate username", + "registration_successful": "Registration successful!", + "server_error": "Server Error", + "user_not_found": "User not found", + "username_or_password_incorrect": "Username or password incorrect.", + "login_successful": "Login successful", + "logout": "Logout", + "user_home": "Profile", + "user_settings": "Settings", + "preferences": "Preferences", + "administrator": "Administrator" }, "button": { "submit": "Submit", diff --git a/frontent/ops_vue_js/src/i18n/zh-CN.json b/frontent/ops_vue_js/src/i18n/zh-CN.json index e13c10c..ce80308 100644 --- a/frontent/ops_vue_js/src/i18n/zh-CN.json +++ b/frontent/ops_vue_js/src/i18n/zh-CN.json @@ -32,15 +32,20 @@ "please_enter_your_email": "请输入您的邮箱", "please_enter_your_username": "请输入您的用户名", "this_not_email": "这不是一个有效的邮箱地址。", - "create_new_account":"创建新账户", - "already_have_an_account":"已经有账户了?", - "network_err":"网络错误", - "username_dup":"用户名重复", - "registration_successful":"注册成功!", - "server_error":"服务端错误", - "user_not_found":"找不到用户", - "username_or_password_incorrect":"用户或密码错误", - "login_successful":"登录成功" + "create_new_account": "创建新账户", + "already_have_an_account": "已经有账户了?", + "network_err": "网络错误", + "username_dup": "用户名重复", + "registration_successful": "注册成功!", + "server_error": "服务端错误", + "user_not_found": "找不到用户", + "username_or_password_incorrect": "用户或密码错误", + "login_successful": "登录成功", + "logout": "登出", + "user_home": "个人主页", + "user_settings": "个人资料", + "preferences": "偏好设置", + "administrator": "管理员" }, "button": { "submit": "提交", diff --git a/frontent/ops_vue_js/src/my_network_func.js b/frontent/ops_vue_js/src/my_network_func.js index 4e4a8b2..72742fe 100644 --- a/frontent/ops_vue_js/src/my_network_func.js +++ b/frontent/ops_vue_js/src/my_network_func.js @@ -32,7 +32,7 @@ export const my_network_func = { //console.log(userstore.cookieValue) if (userstore.userCookie) { - data["userCookie"] = userstore.userCookie + data["userCookieValue"] = userstore.userCookie.Value } var re_data = {}; @@ -50,6 +50,20 @@ export const my_network_func = { if (response.data) { re_data["data"] = response.data; //自动保存服务器发送的cookie + if(response.status==200) + { + + if(response.data.err_code==0){ + if(response.data.return.cookie){ + + userstore.cookieUpdata(response.data.return.cookie) + } + + }else if(response.data.err_code==-46){ + //userCookieExpired + userstore.logout() + } + } // if (response.data.cookie) { // if (response.data.cookie.Value == "") { // myfuncs.dele("cookie"); diff --git a/frontent/ops_vue_js/src/router/index.js b/frontent/ops_vue_js/src/router/index.js index e03235a..a991e0c 100644 --- a/frontent/ops_vue_js/src/router/index.js +++ b/frontent/ops_vue_js/src/router/index.js @@ -1,8 +1,12 @@ -import { createRouter, createWebHistory } from "vue-router"; +import { + createRouter, + createWebHistory, + createWebHashHistory, +} from "vue-router"; import HomeView from "../views/HomeView.vue"; const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), + history: createWebHashHistory(import.meta.env.BASE_URL), routes: [ { path: "/", @@ -37,6 +41,11 @@ const router = createRouter({ name: "Register", component: () => import("../views/registerView.vue"), }, + { + path: "/admin", + name: "admin", + component: () => import("../views/adminView.vue"), + }, ], }); diff --git a/frontent/ops_vue_js/src/stores/user.js b/frontent/ops_vue_js/src/stores/user.js index 5d4ff81..968cf92 100644 --- a/frontent/ops_vue_js/src/stores/user.js +++ b/frontent/ops_vue_js/src/stores/user.js @@ -2,6 +2,7 @@ import { defineStore } from "pinia"; import { ref, computed } from "vue"; import { myfuncs } from "@/myfunc.js"; +import { my_network_func } from "@/my_network_func"; // 组合式 API 写法 (推荐) export const useUserStore = defineStore("user", () => { @@ -20,6 +21,30 @@ export const useUserStore = defineStore("user", () => { } return userCookie.value; }; + + const getUserInfoFromCookie = () => { + my_network_func.postJson("/users/getinfo", {}, (r) => { + //console.log(r); + switch (r.statusCode) { + case 200: + switch (r.data.err_code) { + case 0: + if(r.data.return.userInfo){ + userInfo.value=r.data.return.userInfo + }else{ + userInfo.value=null + } + break; + default: + break; + } + break; + default: + break; + } + }); + }; + const logout = () => { userCookie.value = null; isLoggedIn.value = false; @@ -31,6 +56,17 @@ export const useUserStore = defineStore("user", () => { isLoggedIn.value = true; //这里应该判读cookie的实效性 userCookie.value = cookiesQualified(); + //到这里cookie应该是有效的,尝试获取用户info,因为有的info可能是隐藏的 所以用post携带当前cookie去请求用户info + getUserInfoFromCookie(); + }; + + const cookieUpdata = (cookie) => { + userCookie.value = cookie; + myfuncs.saveJsonT("userCookie", cookie); + if (cookie.Remember) { + //长期保存cookie + myfuncs.saveJson("userCookie", cookie); + } }; const loginFromStoreCookie = () => { @@ -49,7 +85,6 @@ export const useUserStore = defineStore("user", () => { } }; - return { userInfo, userCookie, @@ -57,6 +92,6 @@ export const useUserStore = defineStore("user", () => { logout, login, loginFromStoreCookie, - + cookieUpdata, }; }); diff --git a/frontent/ops_vue_js/src/views/HomeView.vue b/frontent/ops_vue_js/src/views/HomeView.vue index 34b9da4..0f0884c 100644 --- a/frontent/ops_vue_js/src/views/HomeView.vue +++ b/frontent/ops_vue_js/src/views/HomeView.vue @@ -30,6 +30,7 @@ function tt(){ {{ user.userCookie }} + {{ user.userInfo }} diff --git a/frontent/ops_vue_js/src/views/adminView.vue b/frontent/ops_vue_js/src/views/adminView.vue new file mode 100644 index 0000000..e69de29 diff --git a/frontent/ops_vue_js/src/views/loginView.vue b/frontent/ops_vue_js/src/views/loginView.vue index f87161b..da8408a 100644 --- a/frontent/ops_vue_js/src/views/loginView.vue +++ b/frontent/ops_vue_js/src/views/loginView.vue @@ -60,7 +60,7 @@ function login() { remember: remember, }, (r) => { - console.log(r) + //console.log(r) switch (r.statusCode) { case 200: switch (r.data.err_code) { @@ -84,11 +84,7 @@ function login() { case 0: //登录成功,载入cookie //临时保存cookie - myfuncs.saveJsonT("userCookie",r.data.return.cookie) - if(remember){ - //长期保存cookie - myfuncs.saveJson("userCookie",r.data.return.cookie) - } + userStore.cookieUpdata(r.data.return.cookie) //更新用户信息 userStore.login(r.data.return.cookie)