diff --git a/lib/core/utils/ctx/ctx.go b/lib/core/utils/ctx/ctx.go index 0e30abb4..dfbbe924 100644 --- a/lib/core/utils/ctx/ctx.go +++ b/lib/core/utils/ctx/ctx.go @@ -14,6 +14,7 @@ import ( commonConstants "be.ems/src/framework/constants/common" tokenConst "be.ems/src/framework/constants/token" "github.com/gorilla/mux" + "golang.org/x/text/language" ) // Param 地址栏参数{id} @@ -31,6 +32,11 @@ func GetQuery(r *http.Request, key string) string { return r.URL.Query().Get(key) } +// GetHeader 请求头参数 +func GetHeader(r *http.Request, key string) string { + return r.Header.Get(key) +} + // QueryMap 查询参数转换Map func QueryMap(r *http.Request) map[string]any { queryValues := r.URL.Query() @@ -41,6 +47,16 @@ func QueryMap(r *http.Request) map[string]any { return queryParams } +// ShouldBindQuery 查询参数读取json请求结构团体 +func ShouldBindQuery(r *http.Request, args any) error { + queryParams := QueryMap(r) + body, err := json.Marshal(queryParams) + if err != nil { + return err + } + return json.Unmarshal(body, args) +} + // 读取json请求结构团体 func ShouldBindJSON(r *http.Request, args any) error { body, err := io.ReadAll(io.LimitReader(r.Body, 1<<20)) // 设置较大的长度,例如 1<<20 (1MB) @@ -118,7 +134,32 @@ func Authorization(r *http.Request) string { return arr[1] } -// 定义自定义类型作为键 +// AcceptLanguage 解析客户端接收语言 zh:中文 en: 英文 +func AcceptLanguage(r *http.Request) string { + preferredLanguage := language.English + + // Query请求查询 + if v := GetQuery(r, "language"); v != "" { + tags, _, _ := language.ParseAcceptLanguage(v) + if len(tags) > 0 { + preferredLanguage = tags[0] + } + } + // Header请求头 + if v := GetHeader(r, "Accept-Language"); v != "" { + tags, _, _ := language.ParseAcceptLanguage(v) + if len(tags) > 0 { + preferredLanguage = tags[0] + } + } + + // 只取前缀 + lang := preferredLanguage.String() + arr := strings.Split(lang, "-") + return arr[0] +} + +// ContextKey 定义自定义类型作为键 type ContextKey string // LoginUser 登录用户信息需要Authorize中间件