feat: 完成B端认证系统和商户管理模块测试补全
主要变更: - 新增B端认证系统(后台+H5):登录、登出、Token刷新、密码修改 - 完善商户管理和商户账号管理功能 - 补全单元测试(ShopService: 72.5%, ShopAccountService: 79.8%) - 新增集成测试(商户管理+商户账号管理) - 归档OpenSpec提案(add-shop-account-management, implement-b-end-auth-system) - 完善文档(使用指南、API文档、认证架构说明) 测试统计: - 13个测试套件,37个测试用例,100%通过率 - 平均覆盖率76.2%,达标 OpenSpec验证:通过(strict模式)
This commit is contained in:
41
internal/model/auth_dto.go
Normal file
41
internal/model/auth_dto.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package model
|
||||
|
||||
type LoginRequest struct {
|
||||
Username string `json:"username" validate:"required"`
|
||||
Password string `json:"password" validate:"required"`
|
||||
Device string `json:"device" validate:"omitempty,oneof=web h5 mobile"`
|
||||
}
|
||||
|
||||
type LoginResponse struct {
|
||||
AccessToken string `json:"access_token"`
|
||||
RefreshToken string `json:"refresh_token"`
|
||||
ExpiresIn int64 `json:"expires_in"`
|
||||
User UserInfo `json:"user"`
|
||||
Permissions []string `json:"permissions"`
|
||||
}
|
||||
|
||||
type UserInfo struct {
|
||||
ID uint `json:"id"`
|
||||
Username string `json:"username"`
|
||||
Phone string `json:"phone"`
|
||||
UserType int `json:"user_type"`
|
||||
UserTypeName string `json:"user_type_name"`
|
||||
ShopID uint `json:"shop_id,omitempty"`
|
||||
ShopName string `json:"shop_name,omitempty"`
|
||||
EnterpriseID uint `json:"enterprise_id,omitempty"`
|
||||
EnterpriseName string `json:"enterprise_name,omitempty"`
|
||||
}
|
||||
|
||||
type RefreshTokenRequest struct {
|
||||
RefreshToken string `json:"refresh_token" validate:"required"`
|
||||
}
|
||||
|
||||
type RefreshTokenResponse struct {
|
||||
AccessToken string `json:"access_token"`
|
||||
ExpiresIn int64 `json:"expires_in"`
|
||||
}
|
||||
|
||||
type ChangePasswordRequest struct {
|
||||
OldPassword string `json:"old_password" validate:"required"`
|
||||
NewPassword string `json:"new_password" validate:"required,min=8,max=32"`
|
||||
}
|
||||
48
internal/model/shop_account_dto.go
Normal file
48
internal/model/shop_account_dto.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package model
|
||||
|
||||
// ShopAccountListRequest 代理商账号列表查询请求
|
||||
type ShopAccountListRequest struct {
|
||||
Page int `json:"page" query:"page" validate:"omitempty,min=1"` // 页码
|
||||
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100"` // 每页数量
|
||||
ShopID *uint `json:"shop_id" query:"shop_id" validate:"omitempty,min=1"` // 店铺ID过滤
|
||||
Username string `json:"username" query:"username" validate:"omitempty,max=50"` // 用户名(模糊查询)
|
||||
Phone string `json:"phone" query:"phone" validate:"omitempty,len=11"` // 手机号(精确查询)
|
||||
Status *int `json:"status" query:"status" validate:"omitempty,oneof=0 1"` // 状态
|
||||
}
|
||||
|
||||
// CreateShopAccountRequest 创建代理商账号请求
|
||||
type CreateShopAccountRequest struct {
|
||||
ShopID uint `json:"shop_id" validate:"required,min=1"` // 店铺ID
|
||||
Username string `json:"username" validate:"required,min=3,max=50"` // 用户名
|
||||
Phone string `json:"phone" validate:"required,len=11"` // 手机号
|
||||
Password string `json:"password" validate:"required,min=8,max=32"` // 密码
|
||||
}
|
||||
|
||||
// UpdateShopAccountRequest 更新代理商账号请求
|
||||
type UpdateShopAccountRequest struct {
|
||||
Username string `json:"username" validate:"required,min=3,max=50"` // 用户名
|
||||
// 注意:不包含 phone 和 password,按照业务规则不允许修改
|
||||
}
|
||||
|
||||
// UpdateShopAccountPasswordRequest 修改代理商账号密码请求(管理员重置)
|
||||
type UpdateShopAccountPasswordRequest struct {
|
||||
NewPassword string `json:"new_password" validate:"required,min=8,max=32"` // 新密码
|
||||
}
|
||||
|
||||
// UpdateShopAccountStatusRequest 修改代理商账号状态请求
|
||||
type UpdateShopAccountStatusRequest struct {
|
||||
Status int `json:"status" validate:"required,oneof=0 1"` // 状态(0=禁用 1=启用)
|
||||
}
|
||||
|
||||
// ShopAccountResponse 代理商账号响应
|
||||
type ShopAccountResponse struct {
|
||||
ID uint `json:"id"`
|
||||
ShopID uint `json:"shop_id"`
|
||||
ShopName string `json:"shop_name,omitempty"` // 关联查询时填充
|
||||
Username string `json:"username"`
|
||||
Phone string `json:"phone"`
|
||||
UserType int `json:"user_type"`
|
||||
Status int `json:"status"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
UpdatedAt string `json:"updated_at"`
|
||||
}
|
||||
@@ -1,28 +1,39 @@
|
||||
package model
|
||||
|
||||
// CreateShopRequest 创建店铺请求
|
||||
type CreateShopRequest struct {
|
||||
ShopName string `json:"shop_name" validate:"required"` // 店铺名称
|
||||
ShopCode string `json:"shop_code"` // 店铺编号
|
||||
ParentID *uint `json:"parent_id"` // 上级店铺ID
|
||||
ContactName string `json:"contact_name"` // 联系人姓名
|
||||
ContactPhone string `json:"contact_phone" validate:"omitempty"` // 联系人电话
|
||||
Province string `json:"province"` // 省份
|
||||
City string `json:"city"` // 城市
|
||||
District string `json:"district"` // 区县
|
||||
Address string `json:"address"` // 详细地址
|
||||
type ShopListRequest struct {
|
||||
Page int `json:"page" query:"page" validate:"omitempty,min=1"`
|
||||
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100"`
|
||||
ShopName string `json:"shop_name" query:"shop_name" validate:"omitempty,max=100"`
|
||||
ShopCode string `json:"shop_code" query:"shop_code" validate:"omitempty,max=50"`
|
||||
ParentID *uint `json:"parent_id" query:"parent_id" validate:"omitempty,min=1"`
|
||||
Level *int `json:"level" query:"level" validate:"omitempty,min=1,max=7"`
|
||||
Status *int `json:"status" query:"status" validate:"omitempty,oneof=0 1"`
|
||||
}
|
||||
|
||||
type CreateShopRequest struct {
|
||||
ShopName string `json:"shop_name" validate:"required,min=1,max=100"`
|
||||
ShopCode string `json:"shop_code" validate:"required,min=1,max=50"`
|
||||
ParentID *uint `json:"parent_id" validate:"omitempty,min=1"`
|
||||
ContactName string `json:"contact_name" validate:"omitempty,max=50"`
|
||||
ContactPhone string `json:"contact_phone" validate:"omitempty,len=11"`
|
||||
Province string `json:"province" validate:"omitempty,max=50"`
|
||||
City string `json:"city" validate:"omitempty,max=50"`
|
||||
District string `json:"district" validate:"omitempty,max=50"`
|
||||
Address string `json:"address" validate:"omitempty,max=255"`
|
||||
InitPassword string `json:"init_password" validate:"required,min=8,max=32"`
|
||||
InitUsername string `json:"init_username" validate:"required,min=3,max=50"`
|
||||
InitPhone string `json:"init_phone" validate:"required,len=11"`
|
||||
}
|
||||
|
||||
// UpdateShopRequest 更新店铺请求
|
||||
type UpdateShopRequest struct {
|
||||
ShopName *string `json:"shop_name"` // 店铺名称
|
||||
ShopCode *string `json:"shop_code"` // 店铺编号
|
||||
ContactName *string `json:"contact_name"` // 联系人姓名
|
||||
ContactPhone *string `json:"contact_phone"` // 联系人电话
|
||||
Province *string `json:"province"` // 省份
|
||||
City *string `json:"city"` // 城市
|
||||
District *string `json:"district"` // 区县
|
||||
Address *string `json:"address"` // 详细地址
|
||||
ShopName string `json:"shop_name" validate:"required,min=1,max=100"`
|
||||
ContactName string `json:"contact_name" validate:"omitempty,max=50"`
|
||||
ContactPhone string `json:"contact_phone" validate:"omitempty,len=11"`
|
||||
Province string `json:"province" validate:"omitempty,max=50"`
|
||||
City string `json:"city" validate:"omitempty,max=50"`
|
||||
District string `json:"district" validate:"omitempty,max=50"`
|
||||
Address string `json:"address" validate:"omitempty,max=255"`
|
||||
Status int `json:"status" validate:"required,oneof=0 1"`
|
||||
}
|
||||
|
||||
// ShopResponse 店铺响应
|
||||
|
||||
Reference in New Issue
Block a user