add: some user api and all api desc

This commit is contained in:
wwweww
2026-02-27 19:17:01 +08:00
parent a0c720eb2f
commit 5930fb0dde
156 changed files with 9457 additions and 1086 deletions
+68
View File
@@ -0,0 +1,68 @@
syntax = "v1"
import "common.api"
type (
ChatSession {
Id string `json:"id"`
Type string `json:"type"` // order, consultation
OrderId string `json:"orderId,optional"`
Participants []SimpleUser `json:"participants"`
LastMessage string `json:"lastMessage"`
UnreadCount int `json:"unreadCount"`
}
ChatSessionListResp {
Items []ChatSession `json:"items"`
Meta PageMeta `json:"meta"`
}
ChatMessage {
Id string `json:"id"`
SessionId string `json:"sessionId"`
SenderId string `json:"senderId"`
Type string `json:"type"` // text, image, system
Content string `json:"content"`
CreatedAt string `json:"createdAt"`
}
ChatMessageListResp {
Items []ChatMessage `json:"items"`
Meta PageMeta `json:"meta"`
}
SendMessageReq {
Type string `json:"type"`
Content string `json:"content"`
}
)
@server(
prefix: api/v1/chat
group: chat
jwt: Auth
)
service juwan-api {
@doc "获取会话列表"
@handler ListSessions
get /sessions (PageReq) returns (ChatSessionListResp)
@doc "获取会话详情"
@handler GetSession
get /sessions/:id (EmptyResp) returns (ChatSession)
@doc "获取消息历史"
@handler ListMessages
get /sessions/:id/messages (PageReq) returns (ChatMessageListResp)
@doc "发送消息"
@handler SendMessage
post /sessions/:id/messages (SendMessageReq) returns (ChatMessage)
@doc "创建/获取订单会话"
@handler EnsureOrderSession
post /sessions/order (EmptyResp) returns (ChatSession)
@doc "创建咨询会话"
@handler CreateConsultation
post /sessions/consultation (EmptyResp) returns (ChatSession)
}
+47
View File
@@ -0,0 +1,47 @@
syntax = "v1"
info(
title: "公共定义"
desc: "Common structures"
author: "Juwan Team"
version: "1.0"
)
type (
// 分页请求基础
PageReq {
Offset int64 `form:"offset,default=0"`
Limit int64 `form:"limit,default=20"`
}
// 分页响应元数据
PageMeta {
Total int64 `json:"total"`
Offset int64 `json:"offset"`
Limit int64 `json:"limit"`
}
// 空响应
EmptyResp {}
// 核心用户画像 (被 Auth, Community, Shop 等多个服务引用)
UserProfile {
Id string `json:"id"`
Username string `json:"username"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
Role string `json:"role"` // consumer, player, owner, admin
VerifiedRoles []string `json:"verifiedRoles"`
VerificationStatus map[string]string `json:"verificationStatus"`
Phone string `json:"phone,optional"`
Bio string `json:"bio,optional"`
CreatedAt string `json:"createdAt"`
}
// 简略用户信息 (用于列表、聊天头像等)
SimpleUser {
Id string `json:"id"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
}
)
+115
View File
@@ -0,0 +1,115 @@
syntax = "v1"
import "common.api"
type (
Post {
Id string `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
Images []string `json:"images"`
Tags []string `json:"tags"`
LikeCount int64 `json:"likeCount"`
CommentCount int64 `json:"commentCount"`
Liked bool `json:"liked"`
Author UserProfile `json:"author"`
CreatedAt string `json:"createdAt"`
}
CreatePostReq {
Title string `json:"title"`
Content string `json:"content"`
Images []string `json:"images"`
Tags []string `json:"tags"`
LinkedOrderId string `json:"linkedOrderId,optional"`
}
PostListReq {
PageReq
Tags string `form:"tags,optional"`
SortBy string `form:"sortBy,optional"`
}
PostListResp {
Items []Post `json:"items"`
Meta PageMeta `json:"meta"`
}
Comment {
Id string `json:"id"`
Content string `json:"content"`
Author UserProfile `json:"author"`
LikeCount int64 `json:"likeCount"`
Liked bool `json:"liked"`
CreatedAt string `json:"createdAt"`
}
CommentListResp {
Items []Comment `json:"items"`
Meta PageMeta `json:"meta"`
}
CreateCommentReq {
Content string `json:"content"`
}
)
@server(
prefix: api/v1
group: community
)
service juwan-api {
@doc "获取帖子列表"
@handler ListPosts
get /posts (PostListReq) returns (PostListResp)
@doc "获取帖子详情"
@handler GetPost
get /posts/:id (EmptyResp) returns (Post)
@doc "获取帖子评论"
@handler ListComments
get /posts/:id/comments (PageReq) returns (CommentListResp)
@doc "获取用户帖子"
@handler ListUserPosts
get /users/:id/posts (PageReq) returns (PostListResp)
}
@server(
prefix: api/v1
group: community
jwt: Auth
)
service juwan-api {
@doc "发布帖子"
@handler CreatePost
post /posts (CreatePostReq) returns (Post)
@doc "点赞帖子"
@handler LikePost
post /posts/:id/like (EmptyResp) returns (EmptyResp)
@doc "取消点赞帖子"
@handler UnlikePost
delete /posts/:id/like (EmptyResp) returns (EmptyResp)
@doc "置顶帖子"
@handler PinPost
post /posts/:id/pin (EmptyResp) returns (EmptyResp)
@doc "取消置顶"
@handler UnpinPost
delete /posts/:id/pin (EmptyResp) returns (EmptyResp)
@doc "发表评论"
@handler CreateComment
post /posts/:id/comments (CreateCommentReq) returns (Comment)
@doc "点赞评论"
@handler LikeComment
post /comments/:id/like (EmptyResp) returns (EmptyResp)
@doc "取消点赞评论"
@handler UnlikeComment
delete /comments/:id/like (EmptyResp) returns (EmptyResp)
}
+60
View File
@@ -0,0 +1,60 @@
syntax = "v1"
import "common.api"
type (
Dispute {
Id string `json:"id"`
OrderId string `json:"orderId"`
Reason string `json:"reason"`
Status string `json:"status"`
Evidence []string `json:"evidence"`
Result string `json:"result,optional"`
CreatedAt string `json:"createdAt"`
}
DisputeListResp {
Items []Dispute `json:"items"`
Meta PageMeta `json:"meta"`
}
CreateDisputeReq {
Reason string `json:"reason"`
Evidence []string `json:"evidence"`
}
DisputeResponseReq {
Reason string `json:"reason"`
Evidence []string `json:"evidence"`
}
AppealReq {
Reason string `json:"reason"`
}
)
@server(
prefix: api/v1
group: dispute
jwt: Auth
)
service juwan-api {
@doc "获取争议列表"
@handler ListDisputes
get /disputes (PageReq) returns (DisputeListResp)
@doc "获取订单争议"
@handler GetOrderDispute
get /orders/:id/dispute (EmptyResp) returns (Dispute)
@doc "发起争议"
@handler CreateDispute
post /orders/:id/dispute (CreateDisputeReq) returns (EmptyResp)
@doc "回应争议"
@handler RespondDispute
post /disputes/:id/response (DisputeResponseReq) returns (EmptyResp)
@doc "申诉"
@handler AppealDispute
post /disputes/:id/appeal (AppealReq) returns (EmptyResp)
}
+3 -6
View File
@@ -7,7 +7,7 @@ info (
)
type (
EmptyResp {}
EmptyResp {}
ForgotPasswordReq {
Email string `json:"email"`
}
@@ -24,7 +24,7 @@ type (
@server (
group: email
prefix: /api/email
prefix: /api/v1/email
middleware: Logger
)
service email-api {
@@ -34,14 +34,11 @@ service email-api {
)
@handler SendVerificationCode
post /verification-code/send (SendVerificationCodeReq) returns (SendVerificationCodeResp)
}
@server (
group: user
group: email
prefix: /api/v1/auth
)
service email-api {
@doc "忘记密码-发送验证码"
+30
View File
@@ -0,0 +1,30 @@
syntax = "v1"
import "common.api"
type (
Game {
Id string `json:"id"`
Name string `json:"name"`
Icon string `json:"icon"`
Category string `json:"category"`
}
GameListResp {
Items []Game `json:"items"`
Meta PageMeta `json:"meta"`
}
)
@server(
prefix: api/v1/games
group: game
)
service juwan-api {
@doc "获取游戏列表"
@handler ListGames
get / (PageReq) returns (GameListResp)
@doc "获取游戏详情"
@handler GetGame
get /:id (EmptyResp) returns (Game)
}
+38
View File
@@ -0,0 +1,38 @@
syntax = "v1"
import "common.api"
type (
Notification {
Id string `json:"id"`
Type string `json:"type"`
Title string `json:"title"`
Content string `json:"content"`
Read bool `json:"read"`
Link string `json:"link,optional"`
CreatedAt string `json:"createdAt"`
}
NotificationListResp {
Items []Notification `json:"items"`
Meta PageMeta `json:"meta"`
}
)
@server(
prefix: api/v1
group: notification
jwt: Auth
)
service juwan-api {
@doc "获取通知列表"
@handler ListNotifications
get /notifications (PageReq) returns (NotificationListResp)
@doc "标记已读"
@handler ReadNotification
put /notifications/:id/read (EmptyResp) returns (EmptyResp)
@doc "全部已读"
@handler ReadAllNotifications
put /notifications/read-all (EmptyResp) returns (EmptyResp)
}
+40
View File
@@ -0,0 +1,40 @@
syntax = "v1"
info (
title: "文件服务"
desc: "处理文件上传与获取"
author: "Asadz"
version: "v1"
)
type (
// 上传请求参数(File文件流在Handler中通过 r.FormFile 获取)
UploadReq {
Type string `form:"type,options=avatar|chat|post|verification|dispute"` // 文件类型限制
}
// 上传响应
UploadResp {
Url string `json:"url"` // 返回 CDN 地址或访问地址
}
// 获取文件请求(用于私有文件或代理访问)
GetFileReq {
FileId string `path:"fileId"`
}
)
@server (
prefix: /api/v1
group: file
jwt: Logger
middleware: FileSizeLimit // 建议添加中间件限制文件大小
)
service file-api {
@doc "文件上传接口"
@handler Upload
post /upload (UploadReq) returns (UploadResp)
@doc "文件获取接口 (如果是私有文件,通过此接口获取或重定向)"
@handler GetFile
get /files/:fileId (GetFileReq)
}
+93
View File
@@ -0,0 +1,93 @@
syntax = "v1"
import "common.api"
import "player.api" // 为了使用 PlayerService 定义
type (
Order {
Id string `json:"id"`
ConsumerId string `json:"consumerId"`
ConsumerName string `json:"consumerName"`
PlayerId string `json:"playerId"`
PlayerName string `json:"playerName"`
ShopId string `json:"shopId,optional"`
ShopName string `json:"shopName,optional"`
Service PlayerService `json:"service"`
Status string `json:"status"`
TotalPrice float64 `json:"totalPrice"`
Note string `json:"note,optional"`
CreatedAt string `json:"createdAt"`
AcceptedAt string `json:"acceptedAt,optional"`
CompletedAt string `json:"completedAt,optional"`
}
OrderListReq {
PageReq
Role string `form:"role"` // consumer, player, owner
Status string `form:"status,optional"`
}
OrderListResp {
Items []Order `json:"items"`
Meta PageMeta `json:"meta"`
}
CreateOrderReq {
PlayerId string `json:"playerId"`
ShopId string `json:"shopId,optional"`
ServiceId string `json:"serviceId"`
Quantity int `json:"quantity"`
Note string `json:"note,optional"`
}
CreateOrderResp {
Ok bool `json:"ok"`
Order Order `json:"order"`
}
)
@server(
prefix: api/v1/orders
group: order
jwt: Auth
)
service juwan-api {
@doc "获取订单列表"
@handler ListOrders
get / (OrderListReq) returns (OrderListResp)
@doc "获取订单详情"
@handler GetOrder
get /:id (EmptyResp) returns (Order)
@doc "创建订单"
@handler CreateOrder
post / (CreateOrderReq) returns (CreateOrderResp)
@doc "创建并支付订单"
@handler CreateAndPayOrder
post /paid (CreateOrderReq) returns (CreateOrderResp)
@doc "支付订单"
@handler PayOrder
post /:id/pay (EmptyResp) returns (EmptyResp)
@doc "接单"
@handler AcceptOrder
post /:id/accept (EmptyResp) returns (EmptyResp)
@doc "申请结算"
@handler RequestCloseOrder
post /:id/request-close (EmptyResp) returns (EmptyResp)
@doc "确认结算"
@handler ConfirmCloseOrder
post /:id/confirm-close (EmptyResp) returns (EmptyResp)
@doc "取消订单"
@handler CancelOrder
post /:id/cancel (EmptyResp) returns (EmptyResp)
@doc "再来一单"
@handler Reorder
post /:id/reorder (EmptyResp) returns (CreateOrderResp)
}
+110
View File
@@ -0,0 +1,110 @@
syntax = "v1"
import "common.api"
type (
PlayerService {
Id string `json:"id"`
PlayerId string `json:"playerId"`
GameId string `json:"gameId"`
GameName string `json:"gameName"`
Title string `json:"title"`
Description string `json:"description"`
Price float64 `json:"price"`
Unit string `json:"unit"`
RankRange string `json:"rankRange,optional"`
Availability []string `json:"availability"`
}
PlayerServiceListResp {
Items []PlayerService `json:"items"`
Meta PageMeta `json:"meta"`
}
CreateServiceReq {
GameId string `json:"gameId"`
Title string `json:"title"`
Description string `json:"description,optional"`
Price float64 `json:"price"`
Unit string `json:"unit"`
RankRange string `json:"rankRange,optional"`
Availability []string `json:"availability,optional"`
}
PlayerProfile {
Id string `json:"id"`
User UserProfile `json:"user"`
Rating float64 `json:"rating"`
TotalOrders int64 `json:"totalOrders"`
CompletionRate float64 `json:"completionRate"`
Status string `json:"status"`
Games []string `json:"games"`
Services []PlayerService `json:"services"`
ShopId string `json:"shopId,optional"`
ShopName string `json:"shopName,optional"`
Tags []string `json:"tags"`
}
PlayerListReq {
PageReq
GameId string `form:"gameId,optional"`
Gender int `form:"gender,optional"`
}
PlayerListResp {
Items []PlayerProfile `json:"items"`
Meta PageMeta `json:"meta"`
}
UpdatePlayerStatusReq {
Status string `json:"status"`
}
)
@server(
prefix: api/v1
group: player
)
service juwan-api {
@doc "获取打手列表"
@handler ListPlayers
get /players (PlayerListReq) returns (PlayerListResp)
@doc "获取打手详情"
@handler GetPlayer
get /players/:id (EmptyResp) returns (PlayerProfile)
@doc "获取所有服务列表"
@handler ListServices
get /services (PageReq) returns (PlayerServiceListResp)
@doc "获取服务详情"
@handler GetService
get /services/:id (EmptyResp) returns (PlayerService)
@doc "获取指定打手的服务列表"
@handler ListPlayerServices
get /players/:id/services (PageReq) returns (PlayerServiceListResp)
}
@server(
prefix: api/v1
group: player
jwt: Auth
)
service juwan-api {
@doc "更新接单状态"
@handler UpdatePlayerStatus
put /players/me/status (UpdatePlayerStatusReq) returns (EmptyResp)
@doc "创建服务"
@handler CreateService
post /services (CreateServiceReq) returns (PlayerService)
@doc "更新服务"
@handler UpdateService
put /services/:id (CreateServiceReq) returns (PlayerService)
@doc "删除服务"
@handler DeleteService
delete /services/:id (EmptyResp) returns (EmptyResp)
}
+54
View File
@@ -0,0 +1,54 @@
syntax = "v1"
import "common.api"
type (
Review {
Id string `json:"id"`
OrderId string `json:"orderId"`
FromUserId string `json:"fromUserId"`
FromUserName string `json:"fromUserName"`
Rating int `json:"rating"`
Content string `json:"content"`
Sealed bool `json:"sealed"`
CreatedAt string `json:"createdAt"`
}
ReviewListResp {
Items []Review `json:"items"`
Meta PageMeta `json:"meta"`
}
SubmitReviewReq {
Rating int `json:"rating"`
Content string `json:"content,optional"`
}
)
@server(
prefix: api/v1
group: review
jwt: Auth
)
service juwan-api {
@doc "提交评价"
@handler SubmitReview
post /orders/:id/review (SubmitReviewReq) returns (EmptyResp)
@doc "获取订单评价"
@handler GetOrderReviews
get /orders/:id/reviews (EmptyResp) returns ([]Review)
}
@server(
prefix: api/v1
group: review
)
service juwan-api {
@doc "获取公开评价列表"
@handler ListReviews
get /reviews (PageReq) returns (ReviewListResp)
@doc "获取用户收到的评价"
@handler ListUserReviews
get /users/:id/reviews (PageReq) returns (ReviewListResp)
}
+69
View File
@@ -0,0 +1,69 @@
syntax = "v1"
import "common.api"
type (
SearchReq {
PageReq
Q string `form:"q"`
MinPrice float64 `form:"min,optional"`
MaxPrice float64 `form:"max,optional"`
OnlyOnline bool `form:"onlyOnline,optional"`
Sort string `form:"sort,optional"`
}
SearchResp {
Items []interface{} `json:"items"` // Mixed items
Meta PageMeta `json:"meta"`
}
FavoriteReq {
TargetType string `json:"targetType"` // player, shop
TargetId string `json:"targetId"`
}
FavoriteCheckReq {
TargetType string `form:"targetType"`
TargetId string `form:"targetId"`
}
FavoriteCheckResp {
Favorited bool `json:"favorited"`
}
)
@server(
prefix: api/v1
group: search
)
service juwan-api {
@doc "统一搜索"
@handler Search
get /search (SearchReq) returns (SearchResp)
@doc "首页推荐"
@handler Recommendations
get /recommendations/home (PageReq) returns (SearchResp)
}
@server(
prefix: api/v1
group: favorites
jwt: Auth
)
service juwan-api {
@doc "获取收藏列表"
@handler ListFavorites
get /favorites (PageReq) returns (SearchResp)
@doc "添加收藏"
@handler AddFavorite
post /favorites (FavoriteReq) returns (EmptyResp)
@doc "取消收藏"
@handler RemoveFavorite
delete /favorites/:id (EmptyResp) returns (EmptyResp)
@doc "检查收藏状态"
@handler CheckFavorite
get /users/:id/favorites/check (FavoriteCheckReq) returns (FavoriteCheckResp)
}
+130
View File
@@ -0,0 +1,130 @@
syntax = "v1"
import "common.api"
type (
ShopProfile {
Id string `json:"id"`
Owner UserProfile `json:"owner"`
Name string `json:"name"`
Banner string `json:"banner,optional"`
Description string `json:"description"`
Rating float64 `json:"rating"`
TotalOrders int64 `json:"totalOrders"`
PlayerCount int64 `json:"playerCount"`
CommissionType string `json:"commissionType"`
CommissionValue float64 `json:"commissionValue"`
Announcements []string `json:"announcements"`
TemplateConfig interface{} `json:"templateConfig"`
}
ShopListResp {
Items []ShopProfile `json:"items"`
Meta PageMeta `json:"meta"`
}
CreateShopReq {
Name string `json:"name"`
Description string `json:"description"`
CommissionType string `json:"commissionType"`
CommissionValue float64 `json:"commissionValue"`
}
UpdateShopReq {
Name string `json:"name,optional"`
Description string `json:"description,optional"`
CommissionType string `json:"commissionType,optional"`
CommissionValue float64 `json:"commissionValue,optional"`
AllowMultiShop bool `json:"allowMultiShop,optional"`
AllowIndependentOrders bool `json:"allowIndependentOrders,optional"`
DispatchMode string `json:"dispatchMode,optional"`
}
UpdateTemplateReq {
Sections interface{} `json:"sections"`
}
AnnouncementReq {
Content string `json:"content"`
}
IncomeStatsResp {
MonthlyIncome float64 `json:"monthlyIncome"`
PendingSettlement float64 `json:"pendingSettlement"`
TotalWithdrawn float64 `json:"totalWithdrawn"`
TotalOrders int64 `json:"totalOrders"`
CompletedOrders int64 `json:"completedOrders"`
}
InvitationReq {
PlayerId string `json:"playerId"`
}
)
@server(
prefix: api/v1
group: shop
)
service juwan-api {
@doc "获取店铺列表"
@handler ListShops
get /shops (PageReq) returns (ShopListResp)
@doc "获取店铺详情"
@handler GetShop
get /shops/:id (EmptyResp) returns (ShopProfile)
@doc "获取店长的店铺"
@handler GetUserShop
get /users/:id/shop (EmptyResp) returns (ShopProfile)
}
@server(
prefix: api/v1
group: shop
jwt: Auth
)
service juwan-api {
@doc "创建店铺"
@handler CreateShop
post /shops (CreateShopReq) returns (ShopProfile)
@doc "获取当前用户的店铺"
@handler GetMyShop
get /shops/mine (EmptyResp) returns (ShopProfile)
@doc "更新店铺信息"
@handler UpdateShop
put /shops/:id (UpdateShopReq) returns (ShopProfile)
@doc "更新店铺模板"
@handler UpdateShopTemplate
put /shops/:id/template (UpdateTemplateReq) returns (EmptyResp)
@doc "新增店铺公告"
@handler AddAnnouncement
post /shops/:id/announcements (AnnouncementReq) returns (EmptyResp)
@doc "删除店铺公告"
@handler DeleteAnnouncement
delete /shops/:id/announcements/:index (EmptyResp) returns (EmptyResp)
@doc "邀请打手"
@handler InvitePlayer
post /shops/:id/invitations (InvitationReq) returns (EmptyResp)
@doc "接受邀请"
@handler AcceptInvitation
post /shops/invitations/:id/accept (EmptyResp) returns (EmptyResp)
@doc "拒绝邀请"
@handler RejectInvitation
delete /shops/invitations/:id (EmptyResp) returns (EmptyResp)
@doc "移除打手"
@handler RemovePlayer
delete /shops/:id/players/:playerId (EmptyResp) returns (EmptyResp)
@doc "获取收入统计"
@handler GetShopIncomeStats
get /shops/:id/income-stats (EmptyResp) returns (IncomeStatsResp)
}
+55
View File
@@ -0,0 +1,55 @@
syntax = "v1"
info (
title: "聚玩认证审核服务"
desc: "处理用户角色认证申请(打手/店长)及管理员审核流程"
author: "Asadz"
version: "1.0"
)
// =================================================================================
// 数据结构定义 (Data Structures)
// =================================================================================
// =================================================================================
// 用户端接口 (User Side)
// 路径前缀: /api/v1/users
// =================================================================================
@server (
group: verification_user
prefix: /api/v1/users
jwt: Auth // 必须登录
)
service verification-api {
@doc "提交或修改角色认证申请 (支持幂等更新)"
@handler ApplyVerification
post /me/verification (ApplyVerificationReq) returns (VerificationEmptyResp)
@doc "获取我的所有认证状态"
@handler GetMyVerifications
get /me/verification returns (GetMyVerificationsResp)
}
// =================================================================================
// 管理端接口 (Admin Side)
// 路径前缀: /api/v1/admin
// =================================================================================
@server (
group: verification_admin
prefix: /api/v1/admin
jwt: Auth // 需要登录,且 Logic 层需校验 IsAdmin
)
service verification-api {
@doc "管理员获取认证申请列表 (分页)"
@handler GetVerifications
get /verifications (GetPendingListReq) returns (GetPendingListResp)
@doc "管理员通过申请"
@handler ApproveVerification
post /verifications/:id/approve (VerificationIdReq) returns (VerificationEmptyResp)
@doc "管理员驳回申请"
@handler RejectVerification
post /verifications/:id/reject (RejectVerificationReq) returns (VerificationEmptyResp)
}
+251 -146
View File
@@ -1,164 +1,269 @@
syntax = "v1"
info(
author: "Asadz"
date: "2024-06-19"
version: "1.0"
info (
title: "聚玩用户服务"
desc: "处理用户注册、登录、个人信息管理及关注系统"
author: "Asadz"
version: "1.0"
)
type (
EmptyResp {
}
SearchUserResp {
Username string `json:"username"`
UserId int64 `json:"userId"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
Bio string `json:"bio"`
Page int64 `json:"page"`
Limit int64 `json:"limit"`
}
ResetPasswordByVcode {
Email string `json:"email"`
Password string `json:"password"`
Vcode string `json:"vcode"`
}
RegisterReq {
Username string `json:"username" binding:"required,min=3,max=50"`
Password string `json:"password" binding:"required,min=6,max=128"`
Email string `json:"email,omitempty" binding:"omitempty,email"`
Phone string `json:"phone,omitempty" binding:"omitempty,len=11"`
Vcode int32 `json:"vcode"`
}
RegisterResp {
UserId int64 `json:"userId"`
Username string `json:"username"`
Email string `json:"email"`
Message string `json:"message"`
}
LoginReq {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
LoginResp {
UserId int64 `json:"userId"`
Username string `json:"username"`
Email string `json:"email"`
Token string `json:"token"`
Expires int64 `json:"expires"`
}
GetUserInfoReq {
UserId int64 `path:"userId" binding:"required,gt=0"`
}
UserInfo {
UserId int64 `json:"userId"`
Username string `json:"username"`
Email string `json:"email"`
Phone string `json:"phone"`
Avatar string `json:"avatar"`
Status int `json:"status"`
CreateAt int64 `json:"createAt"`
UpdateAt int64 `json:"updateAt"`
}
UpdateUserInfoReq {
Nickname *string `json:"nickname,omitempty"`
Avatar *string `json:"avatar,omitempty"`
Bio *string `json:"bio,omitempty"`
}
UpdateUserInfoResp {
UserId int64 `json:"userId"`
Message string `json:"message"`
}
UpdatePasswordReq {
UserId int64 `path:"userId" binding:"required,gt=0"`
OldPassword string `json:"oldPassword" binding:"required"`
NewPassword string `json:"newPassword" binding:"required,min=6,max=128"`
}
UpdatePasswordResp {
Message string `json:"message"`
}
LogoutReq {
UserId int64 `path:"userId" binding:"required,gt=0"`
Token string `header:"Authorization" binding:"required"`
}
LogoutResp {
Message string `json:"message"`
}
ErrorResp {
Code int `json:"code"`
Message string `json:"message"`
}
// 认证记录展示对象
// 对应数据库 user_verifications 表
VerificationItem {
Id int64 `json:"id"` // 认证记录ID (主键,用于管理员操作)
UserId int64 `json:"userId"` // 申请人ID (外键)
UserNickname string `json:"userNickname"` // 冗余显示,方便前端展示
Role string `json:"role"` // 申请角色: player, owner
Status string `json:"status"` // pending, approved, rejected
Materials map[string]string `json:"materials"` // 核心字段:对应 DB 的 JSONB
RejectReason string `json:"rejectReason"` // 驳回原因
CreatedAt string `json:"createdAt"` // 申请时间
ReviewedAt string `json:"reviewedAt"` // 审核时间
}
// 提交申请请求
ApplyVerificationReq {
Role string `json:"role"` // 申请什么角色
Materials map[string]string `json:"materials"` // 证明材料键值对 {"idCardFront": "http...", "license": "http..."}
}
// 获取我的申请记录响应
GetMyVerificationsResp {
List []VerificationItem `json:"list"`
}
// 管理员:获取待审核列表请求
GetPendingListReq {
Page int64 `form:"page,default=1"`
Size int64 `form:"size,default=20"`
Role string `form:"role,optional"` // 筛选角色
Status string `form:"status,optional"` // 筛选状态,默认 pending
}
// 管理员:列表响应
GetPendingListResp {
List []VerificationItem `json:"list"`
Total int64 `json:"total"`
}
// 管理员:审核操作请求 (只包含 ID 路径参数)
VerificationIdReq {
Id int64 `path:"id"` // 注意:这是 user_verifications.id
}
// 管理员:驳回请求
RejectVerificationReq {
Id int64 `path:"id"`
Reason string `json:"reason"` // 必填:驳回原因
}
// 通用空响应
VerificationEmptyResp {}
)
@server(
group: user
prefix: /api/v1/auth
middleware: Logger
// =================================================================================
// 基础数据模型 (Data Models)
// =================================================================================
type (
// 通用空响应
EmptyResp {}
// 用户信息核心模型 (User)
User {
Id int64 `json:"id"`
Username string `json:"username"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
Role string `json:"role"` // consumer, player, owner, admin
VerifiedRoles []string `json:"verifiedRoles"` // e.g. ["consumer", "player"]
VerificationStatus map[string]string `json:"verificationStatus"` // e.g. {"player": "approved"}
Phone string `json:"phone,omitempty"`
Bio string `json:"bio,omitempty"`
CreatedAt string `json:"createdAt"` // ISO 8601
}
)
// =================================================================================
// 认证相关 (Auth)
// =================================================================================
type (
RegisterReq {
Phone string `json:"phone,omitempty"`
Email string `json:"email,omitempty"`
Username string `json:"username"`
Password string `json:"password"`
Vcode string `json:"vcode,omitempty"` // 验证码
}
RegisterResp {
AccessToken string `json:"accessToken"`
RefreshToken string `json:"refreshToken"`
User User `json:"user"`
}
LoginReq {
Phone string `json:"phone,omitempty"` // 手机号登录
Username string `json:"username,omitempty"` // 或用户名登录
Password string `json:"password"`
Remember bool `json:"remember,optional"`
}
LoginResp {
AccessToken string `json:"accessToken"`
RefreshToken string `json:"refreshToken"`
User User `json:"user"`
}
LogoutReq {}
ForgotPasswordReq {
Phone string `json:"phone,omitempty"`
Email string `json:"email,omitempty"`
}
ResetPasswordReq {
Phone string `json:"phone,omitempty"`
Email string `json:"email,omitempty"`
Vcode string `json:"vcode"`
NewPassword string `json:"newPassword"`
}
)
// =================================================================================
// 用户个人中心 (User Me)
// =================================================================================
type (
UpdateUserProfileReq {
Nickname string `json:"nickname,optional"`
Avatar string `json:"avatar,optional"`
Bio string `json:"bio,optional"`
}
SwitchRoleReq {
Role string `json:"role"` // 目标角色
}
UpdateNotifySettingsReq {
Order bool `json:"order,optional"`
Community bool `json:"community,optional"`
System bool `json:"system,optional"`
}
UpdateThemeSettingsReq {
Theme string `json:"theme"` // dark, light
}
)
// =================================================================================
// 公开用户信息与社交 (Public User & Social)
// =================================================================================
type (
GetUserReq {
Id int64 `path:"id"`
}
FollowUserReq {
Id int64 `path:"id"`
}
UnfollowUserReq {
Id int64 `path:"id"`
}
)
// =================================================================================
// 服务定义
// =================================================================================
@server (
group: auth
prefix: /api/v1/auth
)
service user-api {
@doc(
summary: "用户注册接口"
description: "通过用户名、密码、邮箱、电话号码注册新用户账户"
)
@handler Register
post /register (RegisterReq) returns (RegisterResp)
@doc "用户注册"
@handler Register
post /register (RegisterReq) returns (RegisterResp)
@doc(
summary: "用户登录接口"
description: "使用用户名和密码进行登录,返回访问令牌和用户信息"
)
@handler Login
post /login (LoginReq) returns (LoginResp)
@doc "用户登录"
@handler Login
post /login (LoginReq) returns (LoginResp)
@doc(
summary: "修改用户密码"
description: "验证旧密码后修改为新密码,需要提供原密码"
)
@handler UpdatePassword
put /:userId/password (UpdatePasswordReq) returns (UpdatePasswordResp)
@doc "忘记密码-发送验证码"
@handler ForgotPassword
post /forgot-password (ForgotPasswordReq) returns (EmptyResp)
@doc(
summary: "用户登出"
description: "需要携带 Authorization 令牌,清除用户会话并使令牌失效"
)
@handler Logout
post /:userId/logout (LogoutReq) returns (LogoutResp)
@doc "修改密码-使用验证码"
@handler UpdatePasswordByVcode
put /forgot-password/reset (ResetPasswordByVcode) returns (EmptyResp)
@doc "重置密码"
@handler ResetPassword
post /reset-password (ResetPasswordReq) returns (EmptyResp)
}
@server(
group: user
prefix: /api/v1/user
middleware: Logger
@server (
group: auth
prefix: /api/v1/auth
)
service user-api {
@doc "获取当前登录用户信息"
@handler GetMe
get /me returns (UserInfo)
@doc "通过用户名搜索用户"
@handler SearchUsersByUsername
get /search () returns ([]UserInfo)
@doc "更改当前登录用户信息"
@handler UpdateMe
put /me (UpdateUserInfoReq) returns (UserInfo)
@doc(
summary: "获取用户信息"
description: "根据用户ID获取用户的详细信息,包含个人资料和账户状态"
)
@handler GetUserInfo
get /:userId (GetUserInfoReq) returns (UserInfo)
@doc(
summary: "修改用户信息"
description: "修改用户的邮箱、电话号码、头像等信息"
)
@handler UpdateUserInfo
put /:userId (UpdateUserInfoReq) returns (UpdateUserInfoResp)
@doc "退出登录"
@handler Logout
post /logout (LogoutReq) returns (EmptyResp)
}
@server (
group: user
prefix: /api/v1/users
middleware: Logger
)
service user-api {
@doc "获取当前登录用户信息"
@handler GetMe
get /me returns (User)
@doc "更新个人资料"
@handler UpdateMe
put /me (UpdateUserProfileReq) returns (User)
@doc "切换当前激活角色"
@handler SwitchRole
post /me/switch-role (SwitchRoleReq) returns (EmptyResp)
@doc "更新通知偏好"
@handler UpdateNotificationSettings
put /me/preferences/notifications (UpdateNotifySettingsReq) returns (EmptyResp)
@doc "更新主题偏好"
@handler UpdateThemeSettings
put /me/preferences/theme (UpdateThemeSettingsReq) returns (EmptyResp)
@doc "关注用户"
@handler FollowUser
post /:id/follow (FollowUserReq) returns (EmptyResp)
@doc "取消关注用户"
@handler UnfollowUser
delete /:id/follow (UnfollowUserReq) returns (EmptyResp)
}
// 公开接口,不需要 JWT
@server (
group: user
prefix: /api/v1/users
)
service user-api {
@doc "获取指定用户信息"
@handler GetUserInfo
get /:id (GetUserReq) returns (User)
}
@server (
group: verification_user
prefix: /api/v1/users
middleware: Logger // 必须登录
)
service user-api {
@doc "提交或修改角色认证申请 (支持幂等更新)"
@handler ApplyVerification
post /me/verification (ApplyVerificationReq) returns (VerificationEmptyResp)
@doc "获取我的所有认证状态"
@handler GetMyVerifications
get /me/verification returns (GetMyVerificationsResp)
}
@server (
group: verification_admin
prefix: /api/v1/admin
)
service user-api {
@doc "管理员获取认证申请列表 (分页)"
@handler GetVerifications
get /verifications (GetPendingListReq) returns (GetPendingListResp)
@doc "管理员通过申请"
@handler ApproveVerification
post /verifications/:id/approve (VerificationIdReq) returns (VerificationEmptyResp)
@doc "管理员驳回申请"
@handler RejectVerification
post /verifications/:id/reject (RejectVerificationReq) returns (VerificationEmptyResp)
}
+51
View File
@@ -0,0 +1,51 @@
syntax = "v1"
import "common.api"
type (
WalletBalance {
Balance float64 `json:"balance"`
FrozenBalance float64 `json:"frozenBalance"`
}
Transaction {
Id string `json:"id"`
Type string `json:"type"`
Amount float64 `json:"amount"`
Description string `json:"description"`
OrderId string `json:"orderId,optional"`
CreatedAt string `json:"createdAt"`
}
TransactionListResp {
Items []Transaction `json:"items"`
Meta PageMeta `json:"meta"`
}
TopupReq {
Amount float64 `json:"amount"`
Method string `json:"method"`
}
)
@server(
prefix: api/v1/wallet
group: wallet
jwt: Auth
)
service juwan-api {
@doc "获取余额"
@handler GetBalance
get /balance (EmptyResp) returns (WalletBalance)
@doc "获取流水"
@handler ListTransactions
get /transactions (PageReq) returns (TransactionListResp)
@doc "充值"
@handler Topup
post /topup (TopupReq) returns (EmptyResp)
@doc "提现"
@handler Withdraw
post /withdraw (TopupReq) returns (EmptyResp)
}