主要变更: - 采用 go-zero 框架替代 Gin,提升开发效率 - 重构项目结构,API 文件模块化组织 - 将 model 移至 api/internal/model 目录 - 移除 common 包,改为标准 pkg 目录结构 - 实现统一的仓储模式,支持配置驱动数据库切换 - 简化测试策略,专注 API 集成测试 - 更新 CLAUDE.md 文档,提供详细的开发指导 技术栈更新: - 框架: Gin → go-zero v1.6.0+ - 代码生成: 引入 goctl 工具 - 架构模式: 四层架构 → go-zero 三层架构 (Handler→Logic→Model) - 项目布局: 遵循 Go 社区标准和 go-zero 最佳实践
90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package request
|
|
|
|
// PaginationRequest 分页请求
|
|
type PaginationRequest struct {
|
|
Page int `json:"page" form:"page" binding:"omitempty,min=1" validate:"omitempty,min=1"`
|
|
Limit int `json:"limit" form:"limit" binding:"omitempty,min=1,max=100" validate:"omitempty,min=1,max=100"`
|
|
}
|
|
|
|
// SortRequest 排序请求
|
|
type SortRequest struct {
|
|
Sort string `json:"sort" form:"sort" binding:"omitempty" validate:"omitempty"`
|
|
Order string `json:"order" form:"order" binding:"omitempty,oneof=asc desc" validate:"omitempty,oneof=asc desc"`
|
|
}
|
|
|
|
// SearchRequest 搜索请求
|
|
type SearchRequest struct {
|
|
Search string `json:"search" form:"search" binding:"omitempty,max=100" validate:"omitempty,max=100"`
|
|
}
|
|
|
|
// BaseListRequest 基础列表请求
|
|
type BaseListRequest struct {
|
|
PaginationRequest
|
|
SortRequest
|
|
SearchRequest
|
|
}
|
|
|
|
// IDRequest ID 请求
|
|
type IDRequest struct {
|
|
ID uint `json:"id" uri:"id" binding:"required,min=1" validate:"required,min=1"`
|
|
}
|
|
|
|
// SlugRequest Slug 请求
|
|
type SlugRequest struct {
|
|
Slug string `json:"slug" uri:"slug" binding:"required,min=1" validate:"required,min=1"`
|
|
}
|
|
|
|
// BulkIDsRequest 批量 ID 请求
|
|
type BulkIDsRequest struct {
|
|
IDs []uint `json:"ids" binding:"required,min=1" validate:"required,min=1"`
|
|
}
|
|
|
|
// StatusRequest 状态请求
|
|
type StatusRequest struct {
|
|
IsActive *bool `json:"is_active" form:"is_active" binding:"omitempty"`
|
|
}
|
|
|
|
// TimeRangeRequest 时间范围请求
|
|
type TimeRangeRequest struct {
|
|
StartDate string `json:"start_date" form:"start_date" binding:"omitempty" validate:"omitempty,datetime=2006-01-02"`
|
|
EndDate string `json:"end_date" form:"end_date" binding:"omitempty" validate:"omitempty,datetime=2006-01-02"`
|
|
}
|
|
|
|
// GetDefaultPagination 获取默认分页参数
|
|
func (p *PaginationRequest) GetDefaultPagination() (int, int) {
|
|
page := p.Page
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
|
|
limit := p.Limit
|
|
if limit <= 0 {
|
|
limit = 20
|
|
}
|
|
if limit > 100 {
|
|
limit = 100
|
|
}
|
|
|
|
return page, limit
|
|
}
|
|
|
|
// GetDefaultSort 获取默认排序参数
|
|
func (s *SortRequest) GetDefaultSort(defaultSort, defaultOrder string) (string, string) {
|
|
sort := s.Sort
|
|
if sort == "" {
|
|
sort = defaultSort
|
|
}
|
|
|
|
order := s.Order
|
|
if order == "" {
|
|
order = defaultOrder
|
|
}
|
|
|
|
return sort, order
|
|
}
|
|
|
|
// GetOffset 计算偏移量
|
|
func (p *PaginationRequest) GetOffset() int {
|
|
page, limit := p.GetDefaultPagination()
|
|
return (page - 1) * limit
|
|
} |