yjp 9 ماه پیش
والد
کامیت
11b0f17d36

+ 3 - 3
convenient/gwtools/entity_crud/entity_crud.go

@@ -79,7 +79,7 @@ func (simple *Simple) bind(builder *gateway.Builder) {
 	if !createOptions.disable {
 		createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
 
-		builder.PostRouteWithTenantIDAndCreateUserID("/"+simple.ServiceShortName+domainPath+"/create",
+		builder.PostRouteWithTenantIDAndCreateUserInfo("/"+simple.ServiceShortName+domainPath+"/create",
 			func(requestBuilder *gateway.RequestBuilder) {
 				requestBuilder.Post(
 					&gateway.PostRequest{
@@ -115,7 +115,7 @@ func (simple *Simple) bind(builder *gateway.Builder) {
 	if !deleteOptions.disable {
 		deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
 
-		builder.DeleteRoute("/"+simple.ServiceShortName+domainPath+"/delete",
+		builder.DeleteRouteWithDeleteUserInfo("/"+simple.ServiceShortName+domainPath+"/delete",
 			func(requestBuilder *gateway.RequestBuilder) {
 				requestBuilder.
 					Delete(
@@ -152,7 +152,7 @@ func (simple *Simple) bind(builder *gateway.Builder) {
 	if !updateOptions.disable {
 		updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
 
-		builder.PutRouteWithUpdateUserID("/"+simple.ServiceShortName+domainPath+"/update",
+		builder.PutRouteWithUpdateUserInfo("/"+simple.ServiceShortName+domainPath+"/update",
 			func(requestBuilder *gateway.RequestBuilder) {
 				requestBuilder.
 					Put(

+ 162 - 2
convenient/gwtools/pass_through/pass_through.go

@@ -119,6 +119,84 @@ func PutRouteWithTenantIDAndUpdateUserID(builder *gateway.Builder, params *Simpl
 		WithUserIDParamsName("updateUserId"))...)
 }
 
+// PostRouteWithTenantIDAndUserInfo POST直传API,请求Body是JsonBody,且会添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PostRouteWithTenantIDAndUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPost, append(opts,
+		WithTenantIDParamsName("tenantId"),
+		WithUserIDParamsName("userId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// PostRouteWithTenantIDAndCreateUserInfo POST直传API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为为tenantId,userId和operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PostRouteWithTenantIDAndCreateUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPost, append(opts,
+		WithTenantIDParamsName("tenantId"),
+		WithUserIDParamsName("createUserId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// DeleteRouteWithTenantIDAndUserInfo DELETE直传API,会在查询参数添加租户ID和用户ID字段,字段名分别为为tenantId,userId和operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func DeleteRouteWithTenantIDAndUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodDelete, append(opts,
+		WithTenantIDParamsName("tenantId"),
+		WithUserIDParamsName("userId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// DeleteRouteWithTenantIDAndDeleteUserInfo DELETE直传API,会在查询参数添加租户ID和用户ID字段,字段名分别为为tenantId,userId和operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func DeleteRouteWithTenantIDAndDeleteUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodDelete, append(opts,
+		WithTenantIDParamsName("tenantId"),
+		WithUserIDParamsName("deleteUserId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// PutRouteWithTenantIDAndUserInfo PUT直传API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为为tenantId,userId和operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PutRouteWithTenantIDAndUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPut, append(opts,
+		WithTenantIDParamsName("tenantId"),
+		WithUserIDParamsName("userId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// PutRouteWithTenantIDAndUpdateUserInfo PUT直传API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为为tenantId,userId和operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PutRouteWithTenantIDAndUpdateUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPut, append(opts,
+		WithTenantIDParamsName("tenantId"),
+		WithUserIDParamsName("updateUserId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
 // GetRouteWithTenantIDAndUserID GET直传API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和userId
 // 参数:
 // - builder: 该网关API构建器
@@ -277,6 +355,78 @@ func PutRouteWithUpdateUserID(builder *gateway.Builder, params *Simple, opts ...
 		WithUserIDParamsName("updateUserId"))...)
 }
 
+// PostRouteWithUserInfo POST直传API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PostRouteWithUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPost, append(opts,
+		WithUserIDParamsName("userId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// PostRouteWithCreateUserInfo POST直传API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为createUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PostRouteWithCreateUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPost, append(opts,
+		WithUserIDParamsName("createUserId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// DeleteRouteWithUserInfo DELETE直传API,会在查询参数添加用户ID字段,字段名分别为userId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func DeleteRouteWithUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodDelete, append(opts,
+		WithUserIDParamsName("userId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// DeleteRouteWithDeleteUserInfo DELETE直传API,会在查询参数添加用户ID字段,字段名分别为deleteUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func DeleteRouteWithDeleteUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodDelete, append(opts,
+		WithUserIDParamsName("deleteUserId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// PutRouteWithUserInfo PUT直传API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为createUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PutRouteWithUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPut, append(opts,
+		WithUserIDParamsName("userId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
+// PutRouteWithUpdateUserInfo PUT直传API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为updateUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - builder: 该网关API构建器
+// - params: 网关直通参数
+// - opts: 网关直通选项
+// 返回值: 无
+func PutRouteWithUpdateUserInfo(builder *gateway.Builder, params *Simple, opts ...Option) {
+	params.passThrough(builder, http.MethodPut, append(opts,
+		WithUserIDParamsName("updateUserId"),
+		WithUserNameParamsName("operatorUserName"))...)
+}
+
 // GetRouteWithUserID GET直传API,会在查询参数添加用户ID字段,字段名分别为userId
 // 参数:
 // - builder: 该网关API构建器
@@ -349,7 +499,7 @@ func (params *Simple) passThrough(builder *gateway.Builder, httpMethod string, o
 			if strutils.IsStringNotEmpty(options.tenantIDParamsName) ||
 				strutils.IsStringNotEmpty(options.userIDParamsName) {
 				if httpMethod == http.MethodPost || httpMethod == http.MethodPut {
-					err := gateway.AddJsonBodyTenantIDAndUserID(requestBuilder, options.tenantIDParamsName, options.userIDParamsName)
+					err := gateway.AddJsonBodyTenantIDAndUserInfo(requestBuilder, options.tenantIDParamsName, options.userIDParamsName, options.userNameParamsName)
 					if err != nil {
 						requestBuilder.ResponseError(err)
 						return
@@ -357,7 +507,7 @@ func (params *Simple) passThrough(builder *gateway.Builder, httpMethod string, o
 				}
 
 				if httpMethod == http.MethodDelete || httpMethod == http.MethodGet {
-					err := gateway.AddQueryParamsTenantIDAndUserID(requestBuilder, options.tenantIDParamsName, options.userIDParamsName)
+					err := gateway.AddQueryParamsTenantIDAndUserInfo(requestBuilder, options.tenantIDParamsName, options.userIDParamsName, options.userNameParamsName)
 					if err != nil {
 						requestBuilder.ResponseError(err)
 						return
@@ -422,6 +572,9 @@ type Options struct {
 	// userIDParamsName 用户ID请求参数名称
 	userIDParamsName string
 
+	// userNameParamsName 用户名请求参数名称
+	userNameParamsName string
+
 	// beforeRequestCallback 请求前回调
 	beforeRequestCallback RequestBuilderCallback
 
@@ -452,6 +605,13 @@ func WithUserIDParamsName(userIDParamsName string) Option {
 	}
 }
 
+// WithUserNameParamsName 设置请求参数中的用户名参数的名称
+func WithUserNameParamsName(userNameParamsName string) Option {
+	return func(options *Options) {
+		options.userNameParamsName = userNameParamsName
+	}
+}
+
 // WithBeforeRequestCallback 设置请求前回调
 func WithBeforeRequestCallback(callback RequestBuilderCallback) Option {
 	return func(options *Options) {

+ 11 - 1
framework/core/api/request/common.go

@@ -109,7 +109,17 @@ type UpdateUserIDJsonBody struct {
 	UpdateUserID string `json:"updateUserId" binding:"required" assign:"toField:LastUpdateUserID"`
 }
 
-// DeleteUserIDQueryParams JsonBody中包含删除用户ID字段的定义结构
+// DeleteUserIDQueryParams 查询参数中包含删除用户ID字段的定义结构
 type DeleteUserIDQueryParams struct {
 	DeleteUserID string `form:"deleteUserId" binding:"required" assign:"toField:LastUpdateUserID"`
 }
+
+// OperatorUserNameJsonBody JsonBody中包含操作者用户名的定义结构
+type OperatorUserNameJsonBody struct {
+	OperatorUserName string `json:"operatorUserName" binding:"required" assign:"toField:OperatorUserName"`
+}
+
+// OperatorUserNameQueryParams 查询参数中包含操作者用户名的定义结构
+type OperatorUserNameQueryParams struct {
+	OperatorUserName string `form:"operatorUserName" binding:"required" assign:"toField:OperatorUserName"`
+}

+ 11 - 0
framework/core/domain/entity/field.go

@@ -20,6 +20,9 @@ const (
 	// FieldLastUpdateUserID 最近更新用户ID字段名
 	FieldLastUpdateUserID = "LastUpdateUserID"
 
+	// FieldOperatorUserName 操作者用户名
+	FieldOperatorUserName = "OperatorUserName"
+
 	// FieldCreatedTime 创建时间字段名
 	FieldCreatedTime = "CreatedTime"
 
@@ -40,6 +43,9 @@ const (
 	// ColumnLastUpdateUserID 最新更新用户ID列名
 	ColumnLastUpdateUserID = "last_update_user_id"
 
+	// ColumnOperatorUserName 操作者用户名列名
+	ColumnOperatorUserName = "operator_user_name"
+
 	// ColumnCreatedTime 创建时间列名
 	ColumnCreatedTime = "created_time"
 
@@ -62,6 +68,11 @@ type UserIDFields struct {
 	LastUpdateUserID string `sqlmapping:"column:last_update_user_id;" sqlresult:"column:last_update_user_id;" check:"required,len=32"`
 }
 
+// OperatorUserName 操作者用户名
+type OperatorUserName struct {
+	OperatorUserName string `sqlmapping:"-" sqlresult:"-"`
+}
+
 // TimeFields 时间相关字段
 type TimeFields struct {
 	CreatedTime     time.Time `sqlmapping:"column:created_time;" sqlresult:"column:created_time;"`

+ 237 - 47
framework/gateway/builder.go

@@ -81,7 +81,7 @@ func (builder *Builder) GetRoute(relativePath string, handler Handler, middlewar
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "tenantId", "userId", "", handler, middlewares...)
 }
 
 // PostRouteWithTenantIDAndCreateUserID 创建POST网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和createUserId
@@ -91,7 +91,7 @@ func (builder *Builder) PostRouteWithTenantIDAndUserID(relativePath string, hand
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithTenantIDAndCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "createUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "tenantId", "createUserId", "", handler, middlewares...)
 }
 
 // DeleteRouteWithTenantIDAndUserID 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和userId
@@ -101,7 +101,7 @@ func (builder *Builder) PostRouteWithTenantIDAndCreateUserID(relativePath string
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "tenantId", "userId", "", handler, middlewares...)
 }
 
 // DeleteRouteWithTenantIDAndDeleteUserID 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和deleteUserId
@@ -111,7 +111,7 @@ func (builder *Builder) DeleteRouteWithTenantIDAndUserID(relativePath string, ha
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithTenantIDAndDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "deleteUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "tenantId", "deleteUserId", "", handler, middlewares...)
 }
 
 // PutRouteWithTenantIDAndUserID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和userId
@@ -121,7 +121,7 @@ func (builder *Builder) DeleteRouteWithTenantIDAndDeleteUserID(relativePath stri
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "tenantId", "userId", "", handler, middlewares...)
 }
 
 // PutRouteWithTenantIDAndUpdateUserID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和updateUserId
@@ -131,7 +131,67 @@ func (builder *Builder) PutRouteWithTenantIDAndUserID(relativePath string, handl
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithTenantIDAndUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "updateUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "tenantId", "updateUserId", "", handler, middlewares...)
+}
+
+// PostRouteWithTenantIDAndUserInfo 创建POST网关API,请求Body是JsonBody,且会添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PostRouteWithTenantIDAndUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "tenantId", "userId", "operatorUserName", handler, middlewares...)
+}
+
+// PostRouteWithTenantIDAndCreateUserInfo 创建POST网关API,请求Body是JsonBody,且会添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PostRouteWithTenantIDAndCreateUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "tenantId", "createUserId", "operatorUserName", handler, middlewares...)
+}
+
+// DeleteRouteWithTenantIDAndUserInfo 创建DELETE网关API,会在查询参数添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) DeleteRouteWithTenantIDAndUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "tenantId", "userId", "operatorUserName", handler, middlewares...)
+}
+
+// DeleteRouteWithTenantIDAndDeleteUserInfo 创建DELETE网关API,会在查询参数添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) DeleteRouteWithTenantIDAndDeleteUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "tenantId", "deleteUserId", "operatorUserName", handler, middlewares...)
+}
+
+// PutRouteWithTenantIDAndUserInfo 创建PUT网关API,请求Body是JsonBody,且会添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PutRouteWithTenantIDAndUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "tenantId", "userId", "operatorUserName", handler, middlewares...)
+}
+
+// PutRouteWithTenantIDAndUpdateUserInfo 创建PUT网关API,请求Body是JsonBody,且会添加租户ID,用户ID以及操作者用户名字段,字段名分别为tenantId,userId和operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PutRouteWithTenantIDAndUpdateUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "tenantId", "updateUserId", "operatorUserName", handler, middlewares...)
 }
 
 // GetRouteWithTenantIDAndUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和userId
@@ -141,7 +201,7 @@ func (builder *Builder) PutRouteWithTenantIDAndUpdateUserID(relativePath string,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "tenantId", "userId", "", handler, middlewares...)
 }
 
 // GetRouteWithTenantIDAndCreateUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和createUserId
@@ -151,7 +211,7 @@ func (builder *Builder) GetRouteWithTenantIDAndUserID(relativePath string, handl
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantIDAndCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "createUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "tenantId", "createUserId", "", handler, middlewares...)
 }
 
 // GetRouteWithTenantIDAndDeleteUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和deleteUserId
@@ -161,7 +221,7 @@ func (builder *Builder) GetRouteWithTenantIDAndCreateUserID(relativePath string,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantIDAndDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "deleteUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "tenantId", "deleteUserId", "", handler, middlewares...)
 }
 
 // GetRouteWithTenantIDAndUpdateUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和updateUserId
@@ -171,7 +231,7 @@ func (builder *Builder) GetRouteWithTenantIDAndDeleteUserID(relativePath string,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantIDAndUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "updateUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "tenantId", "updateUserId", "", handler, middlewares...)
 }
 
 // PostRouteWithTenantID 创建POST网关API,请求Body是JsonBody,且会添加租户ID字段,字段名分别为tenantId
@@ -181,7 +241,7 @@ func (builder *Builder) GetRouteWithTenantIDAndUpdateUserID(relativePath string,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "tenantId", "", "", handler, middlewares...)
 }
 
 // DeleteRouteWithTenantID 创建DELETE网关API,会在查询参数添加租户ID字段,字段名分别为tenantId
@@ -191,7 +251,7 @@ func (builder *Builder) PostRouteWithTenantID(relativePath string, handler Handl
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "tenantId", "", "", handler, middlewares...)
 }
 
 // PutRouteWithTenantID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID字段,字段名分别为tenantId
@@ -201,7 +261,7 @@ func (builder *Builder) DeleteRouteWithTenantID(relativePath string, handler Han
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "tenantId", "", "", handler, middlewares...)
 }
 
 // GetRouteWithTenantID 创建GET网关API,会在查询参数添加租户ID字段,字段名分别为tenantId
@@ -211,17 +271,17 @@ func (builder *Builder) PutRouteWithTenantID(relativePath string, handler Handle
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "tenantId", "", "", handler, middlewares...)
 }
 
-// PostRouteWithUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId
+// PostRouteWithUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名为userId
 // 参数:
 // - relativePath: 该网关API的相对URL
 // - handler: 该网关API处理函数
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "", "userId", "", handler, middlewares...)
 }
 
 // PostRouteWithCreateUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为createUserId
@@ -231,17 +291,17 @@ func (builder *Builder) PostRouteWithUserID(relativePath string, handler Handler
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "createUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "", "createUserId", "", handler, middlewares...)
 }
 
-// DeleteRouteWithUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为userId
+// DeleteRouteWithUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名为userId
 // 参数:
 // - relativePath: 该网关API的相对URL
 // - handler: 该网关API处理函数
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "", "userId", "", handler, middlewares...)
 }
 
 // DeleteRouteWithDeleteUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为deleteUserId
@@ -251,17 +311,17 @@ func (builder *Builder) DeleteRouteWithUserID(relativePath string, handler Handl
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "deleteUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "", "deleteUserId", "", handler, middlewares...)
 }
 
-// PutRouteWithUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId
+// PutRouteWithUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名为userId
 // 参数:
 // - relativePath: 该网关API的相对URL
 // - handler: 该网关API处理函数
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "", "userId", "", handler, middlewares...)
 }
 
 // PutRouteWithUpdateUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为updateUserId
@@ -271,17 +331,77 @@ func (builder *Builder) PutRouteWithUserID(relativePath string, handler Handler,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "updateUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "", "updateUserId", "", handler, middlewares...)
+}
+
+// PostRouteWithUserInfo 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名为userId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PostRouteWithUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "", "userId", "operatorUserName", handler, middlewares...)
+}
+
+// PostRouteWithCreateUserInfo 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为createUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PostRouteWithCreateUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "", "createUserId", "operatorUserName", handler, middlewares...)
 }
 
-// GetRouteWithUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为userId
+// DeleteRouteWithUserInfo 创建DELETE网关API,会在查询参数添加用户ID字段,字段名为userId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) DeleteRouteWithUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "", "userId", "operatorUserName", handler, middlewares...)
+}
+
+// DeleteRouteWithDeleteUserInfo 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为deleteUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) DeleteRouteWithDeleteUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "", "deleteUserId", "operatorUserName", handler, middlewares...)
+}
+
+// PutRouteWithUserInfo 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名为userId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PutRouteWithUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "", "userId", "operatorUserName", handler, middlewares...)
+}
+
+// PutRouteWithUpdateUserInfo 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为updateUserId,还会添加操作者用户名,字段名为operatorUserName
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PutRouteWithUpdateUserInfo(relativePath string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "", "updateUserId", "operatorUserName", handler, middlewares...)
+}
+
+// GetRouteWithUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名为userId
 // 参数:
 // - relativePath: 该网关API的相对URL
 // - handler: 该网关API处理函数
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "userId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "", "userId", "", handler, middlewares...)
 }
 
 // GetRouteWithCreateUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为createUserId
@@ -291,7 +411,7 @@ func (builder *Builder) GetRouteWithUserID(relativePath string, handler Handler,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "createUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "", "createUserId", "", handler, middlewares...)
 }
 
 // GetRouteWithDeleteUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为deleteUserId
@@ -301,7 +421,7 @@ func (builder *Builder) GetRouteWithCreateUserID(relativePath string, handler Ha
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "deleteUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "", "deleteUserId", "", handler, middlewares...)
 }
 
 // GetRouteWithUpdateUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为updateUserId
@@ -311,7 +431,7 @@ func (builder *Builder) GetRouteWithDeleteUserID(relativePath string, handler Ha
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "updateUserId", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "", "updateUserId", "", handler, middlewares...)
 }
 
 // PostRouteWithTenantIDAndUserIDCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
@@ -323,7 +443,7 @@ func (builder *Builder) GetRouteWithUpdateUserID(relativePath string, handler Ha
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, tenantIDField, userIDField, "", handler, middlewares...)
 }
 
 // DeleteRouteWithTenantIDAndUserIDCommon 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
@@ -335,7 +455,7 @@ func (builder *Builder) PostRouteWithTenantIDAndUserIDCommon(relativePath string
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, tenantIDField, userIDField, "", handler, middlewares...)
 }
 
 // PutRouteWithTenantIDAndUserIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
@@ -347,7 +467,43 @@ func (builder *Builder) DeleteRouteWithTenantIDAndUserIDCommon(relativePath stri
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, tenantIDField, userIDField, "", handler, middlewares...)
+}
+
+// PostRouteWithTenantIDAndUserInfoCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID,用户ID以及用户名字段,字段名由调用者指定
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - tenantIDField: 租户ID字段名
+// - userIDField: 用户ID字段名
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PostRouteWithTenantIDAndUserInfoCommon(relativePath string, tenantIDField string, userIDField string, userNameField string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, tenantIDField, userIDField, userNameField, handler, middlewares...)
+}
+
+// DeleteRouteWithTenantIDAndUserInfoCommon 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - tenantIDField: 租户ID字段名
+// - userIDField: 用户ID字段名
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) DeleteRouteWithTenantIDAndUserInfoCommon(relativePath string, tenantIDField string, userIDField string, userNameField string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, tenantIDField, userIDField, userNameField, handler, middlewares...)
+}
+
+// PutRouteWithTenantIDAndUserInfoCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - tenantIDField: 租户ID字段名
+// - userIDField: 用户ID字段名
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PutRouteWithTenantIDAndUserInfoCommon(relativePath string, tenantIDField string, userIDField string, userNameField string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, tenantIDField, userIDField, userNameField, handler, middlewares...)
 }
 
 // GetRouteWithTenantIDAndUserIDCommon 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
@@ -359,7 +515,7 @@ func (builder *Builder) PutRouteWithTenantIDAndUserIDCommon(relativePath string,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, tenantIDField, userIDField, "", handler, middlewares...)
 }
 
 // PostRouteWithTenantIDCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID字段,字段名由调用者指定
@@ -370,7 +526,7 @@ func (builder *Builder) GetRouteWithTenantIDAndUserIDCommon(relativePath string,
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, tenantIDField, "", "", handler, middlewares...)
 }
 
 // DeleteRouteWithTenantIDCommon 创建DELETE网关API,会在查询参数添加租户ID字段,字段名由调用者指定
@@ -381,7 +537,7 @@ func (builder *Builder) PostRouteWithTenantIDCommon(relativePath string, tenantI
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, tenantIDField, "", "", handler, middlewares...)
 }
 
 // PutRouteWithTenantIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID字段,字段名由调用者指定
@@ -392,7 +548,7 @@ func (builder *Builder) DeleteRouteWithTenantIDCommon(relativePath string, tenan
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, tenantIDField, "", "", handler, middlewares...)
 }
 
 // GetRouteWithTenantIDCommon 创建GET网关API,会在查询参数添加租户ID字段,字段名由调用者指定
@@ -403,7 +559,7 @@ func (builder *Builder) PutRouteWithTenantIDCommon(relativePath string, tenantID
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, "", handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, tenantIDField, "", "", handler, middlewares...)
 }
 
 // PostRouteWithUserIDCommon 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名由调用者指定
@@ -414,7 +570,7 @@ func (builder *Builder) GetRouteWithTenantIDCommon(relativePath string, tenantID
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PostRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, "", userIDField, "", handler, middlewares...)
 }
 
 // DeleteRouteWithUserIDCommon 创建DELETE网关API,会在查询参数添加用户ID字段,字段名由调用者指定
@@ -425,7 +581,7 @@ func (builder *Builder) PostRouteWithUserIDCommon(relativePath string, userIDFie
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) DeleteRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "", userIDField, "", handler, middlewares...)
 }
 
 // PutRouteWithUserIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名由调用者指定
@@ -436,7 +592,40 @@ func (builder *Builder) DeleteRouteWithUserIDCommon(relativePath string, userIDF
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) PutRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "", userIDField, "", handler, middlewares...)
+}
+
+// PostRouteWithUserInfoCommon 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段和用户名,字段名由调用者指定
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - userIDField: 用户ID字段名
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PostRouteWithUserInfoCommon(relativePath string, userIDField string, userNameField string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPost, relativePath, userNameField, userIDField, "", handler, middlewares...)
+}
+
+// DeleteRouteWithUserInfoCommon 创建DELETE网关API,会在查询参数添加用户ID字段和用户名,字段名由调用者指定
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - userIDField: 用户ID字段名
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) DeleteRouteWithUserInfoCommon(relativePath string, userIDField string, userNameField string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodDelete, relativePath, "", userIDField, userNameField, handler, middlewares...)
+}
+
+// PutRouteWithUserInfoCommon 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段和用户名,字段名由调用者指定
+// 参数:
+// - relativePath: 该网关API的相对URL
+// - userIDField: 用户ID字段名
+// - handler: 该网关API处理函数
+// - middlewares: 该网关API的中间件
+// 返回值: 无
+func (builder *Builder) PutRouteWithUserInfoCommon(relativePath string, userIDField string, userNameField string, handler Handler, middlewares ...Handler) {
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodPut, relativePath, "", userIDField, userNameField, handler, middlewares...)
 }
 
 // GetRouteWithUserIDCommon 创建GET网关API,会在查询参数添加用户ID字段,字段名由调用者指定
@@ -447,7 +636,7 @@ func (builder *Builder) PutRouteWithUserIDCommon(relativePath string, userIDFiel
 // - middlewares: 该网关API的中间件
 // 返回值: 无
 func (builder *Builder) GetRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
-	builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", userIDField, handler, middlewares...)
+	builder.AddRouteWithTenantIDAndUserInfo(http.MethodGet, relativePath, "", userIDField, "", handler, middlewares...)
 }
 
 // AddRoute 通用添加API函数
@@ -469,23 +658,24 @@ func (builder *Builder) AddRoute(httpMethod string, relativePath string, handler
 	builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
 }
 
-// AddRouteWithTenantIDAndUserID 通用添加API函数,会在请求参数(POST和PUT是JsonBody,GET和DELETE是查询参数)添加租户ID和用户ID字段,字段名由调用者指定
+// AddRouteWithTenantIDAndUserInfo 通用添加API函数,会在请求参数(POST和PUT是JsonBody,GET和DELETE是查询参数)添加租户ID,用户ID以及操作者用户名字段,字段名由调用者指定
 // 参数:
 // - httpMethod: HTTP方法
 // - relativePath: 该网关API的相对URL
 // - tenantIDField: 租户ID字段名
 // - userIDField: 用户ID字段名
+// - operatorUserName: 操作者用户名字段名
 // - handler: 该网关API处理函数
 // - middlewares: 该网关API的中间件
 // 返回值: 无
-func (builder *Builder) AddRouteWithTenantIDAndUserID(httpMethod string, relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
+func (builder *Builder) AddRouteWithTenantIDAndUserInfo(httpMethod string, relativePath string, tenantIDField string, userIDField string, operatorUserNameField string, handler Handler, middlewares ...Handler) {
 	apiHandlers := make([]api.Handler, len(middlewares)+1)
 
 	for i, middleware := range middlewares {
-		apiHandlers[i] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, middleware)
+		apiHandlers[i] = builder.formApiHandlerWithTenantIDAndUserInfo(httpMethod, tenantIDField, userIDField, operatorUserNameField, middleware)
 	}
 
-	apiHandlers[len(middlewares)] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, handler)
+	apiHandlers[len(middlewares)] = builder.formApiHandlerWithTenantIDAndUserInfo(httpMethod, tenantIDField, userIDField, operatorUserNameField, handler)
 
 	builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
 }
@@ -498,19 +688,19 @@ func (builder *Builder) formApiHandler(handler Handler) api.Handler {
 	}
 }
 
-func (builder *Builder) formApiHandlerWithTenantIDAndUserID(httpMethod string, tenantIDParamsName string, userIDParamsName string, handler Handler) api.Handler {
+func (builder *Builder) formApiHandlerWithTenantIDAndUserInfo(httpMethod string, tenantIDParamsName string, userIDParamsName string, operatorUserNamePramsName string, handler Handler) api.Handler {
 	return func(c *api.Context) {
 		httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
 		requestBuilder := newRequestBuilder(c, httpRequest)
 
 		switch httpMethod {
 		case http.MethodPost, http.MethodPut:
-			err := AddJsonBodyTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
+			err := AddJsonBodyTenantIDAndUserInfo(requestBuilder, tenantIDParamsName, userIDParamsName, operatorUserNamePramsName)
 			if err != nil {
 				panic(err)
 			}
 		case http.MethodDelete, http.MethodGet:
-			err := AddQueryParamsTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
+			err := AddQueryParamsTenantIDAndUserInfo(requestBuilder, tenantIDParamsName, userIDParamsName, operatorUserNamePramsName)
 			if err != nil {
 				panic(err)
 			}

+ 36 - 16
framework/gateway/common.go

@@ -4,34 +4,47 @@ import (
 	"git.sxidc.com/go-tools/utils/strutils"
 )
 
-func AddJsonBodyTenantIDAndUserID(requestBuilder *RequestBuilder, tenantIDField string, userIDField string) error {
+func AddJsonBodyTenantIDAndUserInfo(requestBuilder *RequestBuilder, tenantIDParamsName string, userIDParamsName string, operatorUserNameParamsName string) error {
 	jsonBody, err := requestBuilder.c.GetJsonBody()
 	if err != nil {
 		return err
 	}
 
-	if strutils.IsStringNotEmpty(tenantIDField) {
-		tenantID := jsonBody.Get(tenantIDField)
+	if strutils.IsStringNotEmpty(tenantIDParamsName) {
+		tenantID := jsonBody.Get(tenantIDParamsName)
 		if tenantID == nil {
 			tenantInfo := requestBuilder.c.GetTenantInfo()
 
 			if tenantInfo != nil {
-				jsonBody.Set(tenantIDField, tenantInfo.GetID())
+				jsonBody.Set(tenantIDParamsName, tenantInfo.GetID())
 			} else {
-				jsonBody.Set(tenantIDField, "guest-"+strutils.SimpleUUID()[:26])
+				jsonBody.Set(tenantIDParamsName, "guest-"+strutils.SimpleUUID()[:26])
 			}
 		}
 	}
 
-	if strutils.IsStringNotEmpty(userIDField) {
-		userID := jsonBody.Get(userIDField)
+	if strutils.IsStringNotEmpty(userIDParamsName) {
+		userID := jsonBody.Get(userIDParamsName)
 		if userID == nil {
 			userInfo := requestBuilder.c.GetUserInfo()
 
 			if userInfo != nil {
-				jsonBody.Set(userIDField, userInfo.GetID())
+				jsonBody.Set(userIDParamsName, userInfo.GetID())
 			} else {
-				jsonBody.Set(userIDField, "guest-"+strutils.SimpleUUID()[:26])
+				jsonBody.Set(userIDParamsName, "guest-"+strutils.SimpleUUID()[:26])
+			}
+		}
+	}
+
+	if strutils.IsStringNotEmpty(operatorUserNameParamsName) {
+		operatorUserName := jsonBody.Get(operatorUserNameParamsName)
+		if operatorUserName == nil {
+			userInfo := requestBuilder.c.GetUserInfo()
+
+			if userInfo != nil {
+				jsonBody.Set(operatorUserNameParamsName, userInfo.GetUserName())
+			} else {
+				jsonBody.Set(operatorUserNameParamsName, "guest-"+strutils.SimpleUUID()[:26])
 			}
 		}
 	}
@@ -39,20 +52,27 @@ func AddJsonBodyTenantIDAndUserID(requestBuilder *RequestBuilder, tenantIDField
 	return nil
 }
 
-func AddQueryParamsTenantIDAndUserID(requestBuilder *RequestBuilder, tenantIDField string, userIDField string) error {
+func AddQueryParamsTenantIDAndUserInfo(requestBuilder *RequestBuilder, tenantIDParamsName string, userIDParamsName string, operatorUserNameParamsName string) error {
 	queryParams := requestBuilder.c.GetQueryParams()
 
-	if requestBuilder.c.GetTenantInfo() != nil && strutils.IsStringNotEmpty(tenantIDField) {
-		tenantID := queryParams.Get(tenantIDField)
+	if requestBuilder.c.GetTenantInfo() != nil && strutils.IsStringNotEmpty(tenantIDParamsName) {
+		tenantID := queryParams.Get(tenantIDParamsName)
 		if strutils.IsStringEmpty(tenantID) {
-			queryParams.Set(tenantIDField, requestBuilder.c.GetTenantInfo().GetID())
+			queryParams.Set(tenantIDParamsName, requestBuilder.c.GetTenantInfo().GetID())
 		}
 	}
 
-	if requestBuilder.c.GetUserInfo() != nil && strutils.IsStringNotEmpty(userIDField) {
-		userID := queryParams.Get(userIDField)
+	if requestBuilder.c.GetUserInfo() != nil && strutils.IsStringNotEmpty(userIDParamsName) {
+		userID := queryParams.Get(userIDParamsName)
 		if strutils.IsStringEmpty(userID) {
-			queryParams.Set(userIDField, requestBuilder.c.GetUserInfo().GetID())
+			queryParams.Set(userIDParamsName, requestBuilder.c.GetUserInfo().GetID())
+		}
+	}
+
+	if requestBuilder.c.GetUserInfo() != nil && strutils.IsStringNotEmpty(operatorUserNameParamsName) {
+		operatorUserName := queryParams.Get(operatorUserNameParamsName)
+		if strutils.IsStringEmpty(operatorUserName) {
+			queryParams.Set(operatorUserNameParamsName, requestBuilder.c.GetUserInfo().GetUserName())
 		}
 	}