完成任务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