完成任务2
This commit is contained in:
5
go.mod
5
go.mod
@@ -72,8 +72,11 @@ require (
|
|||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||||
|
github.com/labstack/echo/v4 v4.13.4 // indirect
|
||||||
|
github.com/labstack/gommon v0.4.2 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
github.com/mailru/easyjson v0.9.1 // indirect
|
github.com/mailru/easyjson v0.9.1 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
@@ -87,6 +90,8 @@ require (
|
|||||||
github.com/stretchr/objx v0.5.2 // indirect
|
github.com/stretchr/objx v0.5.2 // indirect
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
github.com/ugorji/go/codec v1.3.0 // indirect
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
|
github.com/valyala/fasttemplate v1.2.2 // indirect
|
||||||
go.mongodb.org/mongo-driver v1.14.0 // indirect
|
go.mongodb.org/mongo-driver v1.14.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.24.0 // indirect
|
go.opentelemetry.io/otel v1.24.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.24.0 // indirect
|
go.opentelemetry.io/otel/metric v1.24.0 // indirect
|
||||||
|
|||||||
10
go.sum
10
go.sum
@@ -116,10 +116,16 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
|||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcXEA=
|
||||||
|
github.com/labstack/echo/v4 v4.13.4/go.mod h1:g63b33BZ5vZzcIUF8AtRH40DrTlXnx4UMC8rBdndmjQ=
|
||||||
|
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
|
||||||
|
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
|
||||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||||
github.com/mailru/easyjson v0.9.1 h1:LbtsOm5WAswyWbvTEOqhypdPeZzHavpZx96/n553mR8=
|
github.com/mailru/easyjson v0.9.1 h1:LbtsOm5WAswyWbvTEOqhypdPeZzHavpZx96/n553mR8=
|
||||||
github.com/mailru/easyjson v0.9.1/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
|
github.com/mailru/easyjson v0.9.1/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
|
||||||
|
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||||
|
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||||
@@ -171,6 +177,10 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
|
|||||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||||
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
||||||
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
|
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
|
||||||
|
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
|
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
|
||||||
go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
|
go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
|
||||||
|
|||||||
@@ -4,21 +4,21 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrUserNotFoundInContext 表示在 gin.Context 中未找到用户信息。
|
// ErrUserNotFoundInContext 表示在 context 中未找到用户信息。
|
||||||
ErrUserNotFoundInContext = errors.New("context中未找到用户信息")
|
ErrUserNotFoundInContext = errors.New("context中未找到用户信息")
|
||||||
// ErrInvalidUserType 表示从 gin.Context 中获取的用户信息类型不正确。
|
// ErrInvalidUserType 表示从 context 中获取的用户信息类型不正确。
|
||||||
ErrInvalidUserType = errors.New("context中用户信息类型不正确")
|
ErrInvalidUserType = errors.New("context中用户信息类型不正确")
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetOperatorIDFromContext 从 gin.Context 中提取操作者ID。
|
// GetOperatorIDFromContext 从 echo.Context 中提取操作者ID。
|
||||||
// 假设操作者ID是由 AuthMiddleware 存储到 context 中的 *models.User 对象的 ID 字段。
|
// 假设操作者ID是由 AuthMiddleware 存储到 context 中的 *models.User 对象的 ID 字段。
|
||||||
func GetOperatorIDFromContext(c *gin.Context) (uint, error) {
|
func GetOperatorIDFromContext(c echo.Context) (uint, error) {
|
||||||
userVal, exists := c.Get(models.ContextUserKey.String())
|
userVal := c.Get(models.ContextUserKey.String())
|
||||||
if !exists {
|
if userVal == nil {
|
||||||
return 0, ErrUserNotFoundInContext
|
return 0, ErrUserNotFoundInContext
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,11 +30,11 @@ func GetOperatorIDFromContext(c *gin.Context) (uint, error) {
|
|||||||
return user.ID, nil
|
return user.ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetOperatorFromContext 从 gin.Context 中提取操作者。
|
// GetOperatorFromContext 从 echo.Context 中提取操作者。
|
||||||
// 假设操作者是由 AuthMiddleware 存储到 context 中的 *models.User 对象的 字段。
|
// 假设操作者是由 AuthMiddleware 存储到 context 中的 *models.User 对象的字段。
|
||||||
func GetOperatorFromContext(c *gin.Context) (*models.User, error) {
|
func GetOperatorFromContext(c echo.Context) (*models.User, error) {
|
||||||
userVal, exists := c.Get(models.ContextUserKey.String())
|
userVal := c.Get(models.ContextUserKey.String())
|
||||||
if !exists {
|
if userVal == nil {
|
||||||
return nil, ErrUserNotFoundInContext
|
return nil, ErrUserNotFoundInContext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
// --- 业务状态码 ---
|
// --- 业务状态码 ---
|
||||||
@@ -37,8 +37,8 @@ type Response struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendResponse 发送统一格式的JSON响应 (基础函数,不带审计)
|
// SendResponse 发送统一格式的JSON响应 (基础函数,不带审计)
|
||||||
func SendResponse(ctx *gin.Context, code ResponseCode, message string, data interface{}) {
|
func SendResponse(c echo.Context, code ResponseCode, message string, data interface{}) error {
|
||||||
ctx.JSON(http.StatusOK, Response{
|
return c.JSON(http.StatusOK, Response{
|
||||||
Code: code,
|
Code: code,
|
||||||
Message: message,
|
Message: message,
|
||||||
Data: data,
|
Data: data,
|
||||||
@@ -46,14 +46,14 @@ func SendResponse(ctx *gin.Context, code ResponseCode, message string, data inte
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendErrorResponse 发送统一格式的错误响应 (基础函数,不带审计)
|
// SendErrorResponse 发送统一格式的错误响应 (基础函数,不带审计)
|
||||||
func SendErrorResponse(ctx *gin.Context, code ResponseCode, message string) {
|
func SendErrorResponse(c echo.Context, code ResponseCode, message string) error {
|
||||||
SendResponse(ctx, code, message, nil)
|
return SendResponse(c, code, message, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- 带审计功能的响应函数 ---
|
// --- 带审计功能的响应函数 ---
|
||||||
|
|
||||||
// setAuditDetails 是一个内部辅助函数,用于在 gin.Context 中设置业务相关的审计信息。
|
// setAuditDetails 是一个内部辅助函数,用于在 echo.Context 中设置业务相关的审计信息。
|
||||||
func setAuditDetails(c *gin.Context, actionType, description string, targetResource interface{}) {
|
func setAuditDetails(c echo.Context, actionType, description string, targetResource interface{}) {
|
||||||
// 只有当 actionType 不为空时,才设置审计信息,这作为触发审计的标志
|
// 只有当 actionType 不为空时,才设置审计信息,这作为触发审计的标志
|
||||||
if actionType != "" {
|
if actionType != "" {
|
||||||
c.Set(models.ContextAuditActionType.String(), actionType)
|
c.Set(models.ContextAuditActionType.String(), actionType)
|
||||||
@@ -65,32 +65,32 @@ func setAuditDetails(c *gin.Context, actionType, description string, targetResou
|
|||||||
// SendSuccessWithAudit 发送成功的响应,并设置审计日志所需的信息。
|
// SendSuccessWithAudit 发送成功的响应,并设置审计日志所需的信息。
|
||||||
// 这是控制器中用于记录成功操作并返回响应的首选函数。
|
// 这是控制器中用于记录成功操作并返回响应的首选函数。
|
||||||
func SendSuccessWithAudit(
|
func SendSuccessWithAudit(
|
||||||
ctx *gin.Context, // Gin上下文,用于处理HTTP请求和响应
|
c echo.Context, // Echo上下文,用于处理HTTP请求和响应
|
||||||
code ResponseCode, // 业务状态码,表示操作结果
|
code ResponseCode, // 业务状态码,表示操作结果
|
||||||
message string, // 提示信息,向用户展示操作结果的文本描述
|
message string, // 提示信息,向用户展示操作结果的文本描述
|
||||||
data interface{}, // 业务数据,操作成功后返回的具体数据
|
data interface{}, // 业务数据,操作成功后返回的具体数据
|
||||||
actionType string, // 审计操作类型,例如"创建用户", "更新配置"
|
actionType string, // 审计操作类型,例如"创建用户", "更新配置"
|
||||||
description string, // 审计描述,对操作的详细说明
|
description string, // 审计描述,对操作的详细说明
|
||||||
targetResource interface{}, // 审计目标资源,被操作的资源对象或其标识
|
targetResource interface{}, // 审计目标资源,被操作的资源对象或其标识
|
||||||
) {
|
) error {
|
||||||
// 1. 设置审计信息
|
// 1. 设置审计信息
|
||||||
setAuditDetails(ctx, actionType, description, targetResource)
|
setAuditDetails(c, actionType, description, targetResource)
|
||||||
// 2. 发送响应
|
// 2. 发送响应
|
||||||
SendResponse(ctx, code, message, data)
|
return SendResponse(c, code, message, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendErrorWithAudit 发送失败的响应,并设置审计日志所需的信息。
|
// SendErrorWithAudit 发送失败的响应,并设置审计日志所需的信息。
|
||||||
// 这是控制器中用于记录失败操作并返回响应的首选函数。
|
// 这是控制器中用于记录失败操作并返回响应的首选函数。
|
||||||
func SendErrorWithAudit(
|
func SendErrorWithAudit(
|
||||||
ctx *gin.Context, // Gin上下文,用于处理HTTP请求和响应
|
c echo.Context, // Echo上下文,用于处理HTTP请求和响应
|
||||||
code ResponseCode, // 业务状态码,表示操作结果
|
code ResponseCode, // 业务状态码,表示操作结果
|
||||||
message string, // 提示信息,向用户展示操作结果的文本描述
|
message string, // 提示信息,向用户展示操作结果的文本描述
|
||||||
actionType string, // 审计操作类型,例如"登录失败", "删除失败"
|
actionType string, // 审计操作类型,例如"登录失败", "删除失败"
|
||||||
description string, // 审计描述,对操作的详细说明
|
description string, // 审计描述,对操作的详细说明
|
||||||
targetResource interface{}, // 审计目标资源,被操作的资源对象或其标识
|
targetResource interface{}, // 审计目标资源,被操作的资源对象或其标识
|
||||||
) {
|
) error {
|
||||||
// 1. 设置审计信息
|
// 1. 设置审计信息
|
||||||
setAuditDetails(ctx, actionType, description, targetResource)
|
setAuditDetails(c, actionType, description, targetResource)
|
||||||
// 2. 发送响应
|
// 2. 发送响应
|
||||||
SendErrorResponse(ctx, code, message)
|
return SendErrorResponse(c, code, message)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
- [x] 修改 `config.yml` 中 `mode` 配置项的注释,将 "Gin 运行模式" 改为 "服务运行模式"。
|
- [x] 修改 `config.yml` 中 `mode` 配置项的注释,将 "Gin 运行模式" 改为 "服务运行模式"。
|
||||||
- [x] 修改 `config.example.yml` 中 `mode` 配置项的注释,保持与 `config.yml` 一致。
|
- [x] 修改 `config.example.yml` 中 `mode` 配置项的注释,保持与 `config.yml` 一致。
|
||||||
|
|
||||||
- [ ] **2. 控制器辅助函数 (最基础的依赖)**
|
- [x] **2. 控制器辅助函数 (最基础的依赖)**
|
||||||
- [ ] **`internal/app/controller/response.go`**
|
- [x] **`internal/app/controller/response.go`**
|
||||||
- [ ] 将 `*gin.Context` 参数全部替换为 `echo.Context`。
|
- [x] 将 `*gin.Context` 参数全部替换为 `echo.Context`。
|
||||||
- [ ] 修改 `SendResponse` 和 `SendErrorResponse` 等函数,使其不再直接写入响应,而是返回 `error`,并在内部调用 `c.JSON(...)`。
|
- [x] 修改 `SendResponse` 和 `SendErrorResponse` 等函数,使其不再直接写入响应,而是返回 `error`,并在内部调用 `c.JSON(...)`。
|
||||||
- [ ] **`internal/app/controller/auth_utils.go`**
|
- [x] **`internal/app/controller/auth_utils.go`**
|
||||||
- [ ] 将 `*gin.Context` 参数全部替换为 `echo.Context`。
|
- [x] 将 `*gin.Context` 参数全部替换为 `echo.Context`。
|
||||||
- [ ] 适配 `Get...FromContext` 系列函数,使用 `c.Get("key")` 提取数据。
|
- [x] 适配 `Get...FromContext` 系列函数,使用 `c.Get("key")` 提取数据。
|
||||||
|
|
||||||
- [ ] **3. 中间件 (`internal/app/middleware`)**
|
- [ ] **3. 中间件 (`internal/app/middleware`)**
|
||||||
- [ ] **`auth.go`**
|
- [ ] **`auth.go`**
|
||||||
|
|||||||
Reference in New Issue
Block a user