Files
junhong_cmp_fiber/internal/model/dto/client_auth_dto.go
邹进 9ced14fa1b fix: 第1批 F1、M12 一资产一号与换货按手机号关联校验
- F1 一个资产同时只能有一个有效手机号关联,他号绑定返回 1192(不含号码),同号幂等
- 登录 need_bind_phone 改看资产是否已有有效关联,新增 asset_phone_bound、asset_phone_is_own;H5 绑定按客户/资产两侧状态分别写入
- 客户换号不再迁移资产关联
- M12 换货新资产有有效手机号关联即拒绝,号码只在 data.phone;换货完成清空旧资产客户绑定并失效旧资产关联(exchange_completed),均不迁移
- OpenSpec Change enforce-single-phone-per-asset:11/16,H5 短信与换货端到端验证待测试部署后完成
2026-10-12 00:10:41 +09:00

125 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dto
// ========================================
// A1 资产验证
// ========================================
// VerifyAssetRequest A1 资产验证请求
type VerifyAssetRequest struct {
Identifier string `json:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符(SN/IMEI/虚拟号/ICCID/MSISDN)"`
}
// VerifyAssetResponse A1 资产验证响应
type VerifyAssetResponse struct {
AssetToken string `json:"asset_token" description:"资产令牌(5分钟有效)"`
ExpiresIn int `json:"expires_in" description:"过期时间(秒)"`
OaAppID string `json:"oa_app_id" description:"当前生效的公众号 AppID"`
MiniappAppID string `json:"miniapp_app_id" description:"当前生效的小程序 AppID"`
}
// ========================================
// A2 公众号登录
// ========================================
// WechatLoginRequest A2 公众号登录请求
type WechatLoginRequest struct {
Code string `json:"code" validate:"required" required:"true" description:"微信OAuth授权码"`
AssetToken string `json:"asset_token" validate:"required" required:"true" description:"A1返回的资产令牌"`
}
// WechatLoginResponse A2/A3 登录统一响应
type WechatLoginResponse struct {
Token string `json:"token" description:"登录JWT令牌"`
NeedBindPhone bool `json:"need_bind_phone" description:"是否需要绑定手机号(仅前端提示):强制绑定开关开启时,客户无手机号或当前资产尚无有效手机号关联为 true;开关关闭恒为 false"`
AssetPhoneBound bool `json:"asset_phone_bound" description:"当前资产是否已绑定手机号(一资产一号);不返回号码"`
AssetPhoneIsOwn bool `json:"asset_phone_is_own" description:"当前资产绑定的手机号是否为当前客户自己的手机号;不返回号码"`
IsNewUser bool `json:"is_new_user" description:"是否新创建用户"`
}
// ========================================
// A3 小程序登录
// ========================================
// MiniappLoginRequest A3 小程序登录请求
type MiniappLoginRequest struct {
Code string `json:"code" validate:"required" required:"true" description:"小程序登录凭证"`
AssetToken string `json:"asset_token" validate:"required" required:"true" description:"A1返回的资产令牌"`
Nickname string `json:"nickname" description:"用户昵称(前端授权后传入)"`
AvatarURL string `json:"avatar_url" description:"用户头像URL(前端授权后传入)"`
}
// ========================================
// A4 发送验证码
// ========================================
// ClientSendCodeRequest A4 发送验证码请求
type ClientSendCodeRequest struct {
Phone string `json:"phone" validate:"required,len=11" required:"true" minLength:"11" maxLength:"11" description:"手机号"`
Scene string `json:"scene" validate:"required,oneof=bind_phone change_phone_old change_phone_new" required:"true" description:"业务场景 (bind_phone:绑定手机号, change_phone_old:换绑旧手机, change_phone_new:换绑新手机)"`
}
// ClientSendCodeResponse A4 发送验证码响应
type ClientSendCodeResponse struct {
CooldownSeconds int `json:"cooldown_seconds" description:"冷却秒数"`
}
// ========================================
// A5 绑定手机号
// ========================================
// BindPhoneRequest A5 绑定手机号请求
type BindPhoneRequest struct {
Phone string `json:"phone" validate:"required,len=11" required:"true" minLength:"11" maxLength:"11" description:"手机号"`
Code string `json:"code" validate:"required,len=6" required:"true" minLength:"6" maxLength:"6" description:"验证码"`
}
// BindPhoneResponse A5 绑定手机号响应
type BindPhoneResponse struct {
Phone string `json:"phone" description:"已绑定手机号"`
BoundAt string `json:"bound_at" description:"绑定时间"`
}
// ========================================
// A6 换绑手机号
// ========================================
// ChangePhoneRequest A6 换绑手机号请求
type ChangePhoneRequest struct {
OldPhone string `json:"old_phone" validate:"required,len=11" required:"true" minLength:"11" maxLength:"11" description:"旧手机号"`
OldCode string `json:"old_code" validate:"required,len=6" required:"true" minLength:"6" maxLength:"6" description:"旧手机号验证码"`
NewPhone string `json:"new_phone" validate:"required,len=11" required:"true" minLength:"11" maxLength:"11" description:"新手机号"`
NewCode string `json:"new_code" validate:"required,len=6" required:"true" minLength:"6" maxLength:"6" description:"新手机号验证码"`
}
// ChangePhoneResponse A6 换绑手机号响应
type ChangePhoneResponse struct {
Phone string `json:"phone" description:"换绑后手机号"`
ChangedAt string `json:"changed_at" description:"换绑时间"`
}
// ========================================
// A7 退出登录
// ========================================
// LogoutResponse A7 退出登录响应
type LogoutResponse struct {
Success bool `json:"success" description:"是否成功"`
}
// ========================================
// DevLogin 开发环境测试登录(仅开发模式可用)
// ========================================
// DevLoginRequest 开发环境测试登录请求
// ⚠️ 仅限 logging.development=true 时生效,严禁在生产环境暴露
type DevLoginRequest struct {
Identifier string `json:"identifier" validate:"required,min=1,max=50" required:"true" minLength:"1" maxLength:"50" description:"资产标识符(ICCID/虚拟号等)"`
}
// DevLoginResponse 开发环境测试登录响应
type DevLoginResponse struct {
Token string `json:"token" description:"JWT 令牌"`
CustomerID uint `json:"customer_id" description:"客户ID"`
IsNewUser bool `json:"is_new_user" description:"是否新创建的测试客户"`
}