feat: Enhance Swagger documentation with new admin and user endpoints
Some checks failed
build quyun / Build (push) Failing after 2m1s
Some checks failed
build quyun / Build (push) Failing after 2m1s
- Added definitions for admin authentication, media, posts, orders, and user management. - Implemented new API paths for admin functionalities including authentication, media management, order processing, and user statistics. - Updated existing endpoints to improve clarity and structure in the Swagger documentation. - Introduced new response schemas for various operations to standardize API responses.
This commit is contained in:
@@ -22,8 +22,14 @@ type TokenResponse struct {
|
||||
|
||||
// Login
|
||||
//
|
||||
// @Router /admin/auth [post]
|
||||
// @Bind body body
|
||||
// @Summary 管理员登录
|
||||
// @Tags Admin Auth
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param body body AuthBody true "请求体"
|
||||
// @Success 200 {object} TokenResponse "成功"
|
||||
// @Router /admin/auth [post]
|
||||
// @Bind body body
|
||||
func (ctl *auth) Login(ctx fiber.Ctx, body *AuthBody) (*TokenResponse, error) {
|
||||
if body.Username == "pl.yang" && body.Password == "Xixi@0202" {
|
||||
claim := ctl.jwt.CreateClaims(jwt.BaseClaims{
|
||||
|
||||
@@ -17,17 +17,27 @@ type medias struct {
|
||||
|
||||
// List medias
|
||||
//
|
||||
// @Router /admin/medias [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
// @Summary 媒体列表
|
||||
// @Tags Admin Medias
|
||||
// @Produce json
|
||||
// @Param pagination query requests.Pagination false "分页参数"
|
||||
// @Param query query ListQuery false "筛选条件"
|
||||
// @Success 200 {object} requests.Pager{items=models.Media} "成功"
|
||||
// @Router /admin/medias [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
func (ctl *medias) List(ctx fiber.Ctx, pagination *requests.Pagination, query *ListQuery) (*requests.Pager, error) {
|
||||
return services.Medias.List(ctx, pagination, models.MediaQuery.Name.Like(database.WrapLike(*query.Keyword)))
|
||||
}
|
||||
|
||||
// Show media
|
||||
//
|
||||
// @Router /admin/medias/:id [get]
|
||||
// @Bind id path
|
||||
// @Summary 媒体预览(跳转到签名 URL)
|
||||
// @Tags Admin Medias
|
||||
// @Param id path int64 true "媒体 ID"
|
||||
// @Success 302 {string} string "跳转"
|
||||
// @Router /admin/medias/:id [get]
|
||||
// @Bind id path
|
||||
func (ctl *medias) Show(ctx fiber.Ctx, id int64) error {
|
||||
media, err := services.Medias.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
@@ -44,8 +54,13 @@ func (ctl *medias) Show(ctx fiber.Ctx, id int64) error {
|
||||
|
||||
// Delete
|
||||
//
|
||||
// @Router /admin/medias/:id [delete]
|
||||
// @Bind id path
|
||||
// @Summary 删除媒体
|
||||
// @Tags Admin Medias
|
||||
// @Produce json
|
||||
// @Param id path int64 true "媒体 ID"
|
||||
// @Success 204 {object} any "成功"
|
||||
// @Router /admin/medias/:id [delete]
|
||||
// @Bind id path
|
||||
func (ctl *medias) Delete(ctx fiber.Ctx, id int64) error {
|
||||
media, err := services.Medias.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
|
||||
@@ -26,9 +26,15 @@ type orders struct {
|
||||
|
||||
// List users
|
||||
//
|
||||
// @Router /admin/orders [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
// @Summary 订单列表
|
||||
// @Tags Admin Orders
|
||||
// @Produce json
|
||||
// @Param pagination query requests.Pagination false "分页参数"
|
||||
// @Param query query OrderListQuery false "筛选条件"
|
||||
// @Success 200 {object} requests.Pager{items=services.OrderListItem} "成功"
|
||||
// @Router /admin/orders [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
func (ctl *orders) List(
|
||||
ctx fiber.Ctx,
|
||||
pagination *requests.Pagination,
|
||||
@@ -47,8 +53,14 @@ func (ctl *orders) List(
|
||||
}
|
||||
|
||||
// Refund
|
||||
// @Router /admin/orders/:id/refund [post]
|
||||
// @Bind id path
|
||||
//
|
||||
// @Summary 订单退款
|
||||
// @Tags Admin Orders
|
||||
// @Produce json
|
||||
// @Param id path int64 true "订单 ID"
|
||||
// @Success 200 {object} any "成功"
|
||||
// @Router /admin/orders/:id/refund [post]
|
||||
// @Bind id path
|
||||
func (ctl *orders) Refund(ctx fiber.Ctx, id int64) error {
|
||||
order, err := services.Orders.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
|
||||
@@ -21,9 +21,15 @@ type posts struct{}
|
||||
|
||||
// List posts
|
||||
//
|
||||
// @Router /admin/posts [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
// @Summary 作品列表
|
||||
// @Tags Admin Posts
|
||||
// @Produce json
|
||||
// @Param pagination query requests.Pagination false "分页参数"
|
||||
// @Param query query ListQuery false "筛选条件"
|
||||
// @Success 200 {object} requests.Pager{items=PostItem} "成功"
|
||||
// @Router /admin/posts [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *ListQuery) (*requests.Pager, error) {
|
||||
conds := []gen.Condition{
|
||||
models.PostQuery.Title.Like(*query.Keyword),
|
||||
@@ -69,8 +75,14 @@ type PostForm struct {
|
||||
|
||||
// Create
|
||||
//
|
||||
// @Router /admin/posts [post]
|
||||
// @Bind form body
|
||||
// @Summary 创建作品
|
||||
// @Tags Admin Posts
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param form body PostForm true "请求体"
|
||||
// @Success 200 {object} any "成功"
|
||||
// @Router /admin/posts [post]
|
||||
// @Bind form body
|
||||
func (ctl *posts) Create(ctx fiber.Ctx, form *PostForm) error {
|
||||
post := models.Post{
|
||||
Title: form.Title,
|
||||
@@ -107,9 +119,16 @@ func (ctl *posts) Create(ctx fiber.Ctx, form *PostForm) error {
|
||||
|
||||
// Update posts
|
||||
//
|
||||
// @Router /admin/posts/:id [put]
|
||||
// @Bind id path
|
||||
// @Bind form body
|
||||
// @Summary 更新作品
|
||||
// @Tags Admin Posts
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path int64 true "作品 ID"
|
||||
// @Param form body PostForm true "请求体"
|
||||
// @Success 200 {object} any "成功"
|
||||
// @Router /admin/posts/:id [put]
|
||||
// @Bind id path
|
||||
// @Bind form body
|
||||
func (ctl *posts) Update(ctx fiber.Ctx, id int64, form *PostForm) error {
|
||||
post, err := services.Posts.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
@@ -147,8 +166,13 @@ func (ctl *posts) Update(ctx fiber.Ctx, id int64, form *PostForm) error {
|
||||
|
||||
// Delete posts
|
||||
//
|
||||
// @Router /admin/posts/:id [delete]
|
||||
// @Bind id path
|
||||
// @Summary 删除作品
|
||||
// @Tags Admin Posts
|
||||
// @Produce json
|
||||
// @Param id path int64 true "作品 ID"
|
||||
// @Success 204 {object} any "成功"
|
||||
// @Router /admin/posts/:id [delete]
|
||||
// @Bind id path
|
||||
func (ctl *posts) Delete(ctx fiber.Ctx, id int64) error {
|
||||
post, err := services.Posts.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
@@ -172,8 +196,13 @@ type PostItem struct {
|
||||
|
||||
// Show posts by id
|
||||
//
|
||||
// @Router /admin/posts/:id [get]
|
||||
// @Bind id path
|
||||
// @Summary 作品详情
|
||||
// @Tags Admin Posts
|
||||
// @Produce json
|
||||
// @Param id path int64 true "作品 ID"
|
||||
// @Success 200 {object} PostItem "成功"
|
||||
// @Router /admin/posts/:id [get]
|
||||
// @Bind id path
|
||||
func (ctl *posts) Show(ctx fiber.Ctx, id int64) (*PostItem, error) {
|
||||
post, err := services.Posts.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
@@ -194,9 +223,15 @@ func (ctl *posts) Show(ctx fiber.Ctx, id int64) (*PostItem, error) {
|
||||
|
||||
// SendTo
|
||||
//
|
||||
// @Router /admin/posts/:id/send-to/:userId [post]
|
||||
// @Bind id path
|
||||
// @Bind userId path
|
||||
// @Summary 赠送作品给用户
|
||||
// @Tags Admin Posts
|
||||
// @Produce json
|
||||
// @Param id path int64 true "作品 ID"
|
||||
// @Param userId path int64 true "用户 ID"
|
||||
// @Success 200 {object} any "成功"
|
||||
// @Router /admin/posts/:id/send-to/:userId [post]
|
||||
// @Bind id path
|
||||
// @Bind userId path
|
||||
func (ctl *posts) SendTo(ctx fiber.Ctx, id, userId int64) error {
|
||||
post, err := services.Posts.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
|
||||
@@ -22,7 +22,11 @@ type StatisticsResponse struct {
|
||||
|
||||
// dashboard statistics
|
||||
//
|
||||
// @Router /admin/statistics [get]
|
||||
// @Summary 仪表盘统计
|
||||
// @Tags Admin Statistics
|
||||
// @Produce json
|
||||
// @Success 200 {object} StatisticsResponse "成功"
|
||||
// @Router /admin/statistics [get]
|
||||
func (s *statistics) statistics(ctx fiber.Ctx) (*StatisticsResponse, error) {
|
||||
statistics := &StatisticsResponse{}
|
||||
|
||||
|
||||
@@ -34,10 +34,17 @@ type PreCheckResp struct {
|
||||
|
||||
// PreUploadCheck
|
||||
//
|
||||
// @Router /admin/uploads/pre-uploaded-check/:md5.:ext [get]
|
||||
// @Bind md5 path
|
||||
// @Bind ext path
|
||||
// @Bind mime query
|
||||
// @Summary 预上传检查
|
||||
// @Tags Admin Uploads
|
||||
// @Produce json
|
||||
// @Param md5 path string true "文件 MD5"
|
||||
// @Param ext path string true "文件扩展名(不含点)"
|
||||
// @Param mime query string true "文件 MIME 类型"
|
||||
// @Success 200 {object} PreCheckResp "成功"
|
||||
// @Router /admin/uploads/pre-uploaded-check/:md5.:ext [get]
|
||||
// @Bind md5 path
|
||||
// @Bind ext path
|
||||
// @Bind mime query
|
||||
func (up *uploads) PreUploadCheck(ctx fiber.Ctx, md5, ext, mime string) (*PreCheckResp, error) {
|
||||
_, err := services.Medias.GetByHash(ctx, md5)
|
||||
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
@@ -61,8 +68,14 @@ type PostUploadedForm struct {
|
||||
|
||||
// PostUploadedAction
|
||||
//
|
||||
// @Router /admin/uploads/post-uploaded-action [post]
|
||||
// @Bind body body
|
||||
// @Summary 上传完成回调处理
|
||||
// @Tags Admin Uploads
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param body body PostUploadedForm true "请求体"
|
||||
// @Success 200 {object} any "成功"
|
||||
// @Router /admin/uploads/post-uploaded-action [post]
|
||||
// @Bind body body
|
||||
func (up *uploads) PostUploadedAction(ctx fiber.Ctx, body *PostUploadedForm) error {
|
||||
m, err := services.Medias.GetByHash(ctx, body.Md5)
|
||||
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
|
||||
@@ -19,9 +19,15 @@ type users struct{}
|
||||
|
||||
// List users
|
||||
//
|
||||
// @Router /admin/users [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
// @Summary 用户列表
|
||||
// @Tags Admin Users
|
||||
// @Produce json
|
||||
// @Param pagination query requests.Pagination false "分页参数"
|
||||
// @Param query query UserListQuery false "筛选条件"
|
||||
// @Success 200 {object} requests.Pager{items=models.User} "成功"
|
||||
// @Router /admin/users [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
func (ctl *users) List(ctx fiber.Ctx, pagination *requests.Pagination, query *UserListQuery) (*requests.Pager, error) {
|
||||
conds := []gen.Condition{
|
||||
models.UserQuery.Username.Like(database.WrapLike(*query.Keyword)),
|
||||
@@ -31,17 +37,28 @@ func (ctl *users) List(ctx fiber.Ctx, pagination *requests.Pagination, query *Us
|
||||
|
||||
// Show user
|
||||
//
|
||||
// @Router /admin/users/:id [get]
|
||||
// @Bind id path
|
||||
// @Summary 用户详情
|
||||
// @Tags Admin Users
|
||||
// @Produce json
|
||||
// @Param id path int64 true "用户 ID"
|
||||
// @Success 200 {object} models.User "成功"
|
||||
// @Router /admin/users/:id [get]
|
||||
// @Bind id path
|
||||
func (ctl *users) Show(ctx fiber.Ctx, id int64) (*models.User, error) {
|
||||
return services.Users.FindByID(ctx, id)
|
||||
}
|
||||
|
||||
// Articles show user bought articles
|
||||
//
|
||||
// @Router /admin/users/:id/articles [get]
|
||||
// @Bind id path
|
||||
// @Bind pagination query
|
||||
// @Summary 用户已购作品
|
||||
// @Tags Admin Users
|
||||
// @Produce json
|
||||
// @Param id path int64 true "用户 ID"
|
||||
// @Param pagination query requests.Pagination false "分页参数"
|
||||
// @Success 200 {object} requests.Pager{items=models.Post} "成功"
|
||||
// @Router /admin/users/:id/articles [get]
|
||||
// @Bind id path
|
||||
// @Bind pagination query
|
||||
func (ctl *users) Articles(ctx fiber.Ctx, id int64, pagination *requests.Pagination) (*requests.Pager, error) {
|
||||
return services.Posts.Bought(ctx, id, pagination)
|
||||
}
|
||||
@@ -52,9 +69,16 @@ type UserBalance struct {
|
||||
|
||||
// Balance
|
||||
//
|
||||
// @Router /admin/users/:id/balance [post]
|
||||
// @Bind id path
|
||||
// @Bind balance body
|
||||
// @Summary 调整用户余额
|
||||
// @Tags Admin Users
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path int64 true "用户 ID"
|
||||
// @Param balance body UserBalance true "请求体"
|
||||
// @Success 200 {object} any "成功"
|
||||
// @Router /admin/users/:id/balance [post]
|
||||
// @Bind id path
|
||||
// @Bind balance body
|
||||
func (ctl *users) Balance(ctx fiber.Ctx, id int64, balance *UserBalance) error {
|
||||
user, err := services.Users.FindByID(ctx, id)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user