openapi: 3.1.0 info: title: 蓝狐后端接口 version: 2026-06-01 description: | 基于 `web/routes.go`、当前 handler 和 service 实现整理。 约定说明: - 正式文档仅覆盖 `/api/*` 与 `/callback/*` 路由 - `/debug/*` 为开发调试接口,不纳入正式对外规范 - 除 `/api/auth/token` 外,错误响应默认由全局错误处理中间件以 `text/plain` 返回 - 分页请求统一使用 `page` / `size`,默认页码 `1`,默认大小 `10`,最大 `100` servers: - url: / description: relative server root tags: - name: public/auth description: 公开认证接口 - name: public/resource description: 公开套餐接口 - name: public/trade description: 公开交易接口 - name: public/inquiry description: 公开咨询接口 - name: public/product description: 公开产品接口 - name: client/verify description: 客户端验证接口 - name: client/proxy description: 客户端代理接口 - name: client/channel description: 客户端通道接口 - name: client/article description: 客户端文章接口 - name: user/user description: 用户资料接口 - name: user/whitelist description: 用户白名单接口 - name: user/resource description: 用户套餐接口 - name: user/batch description: 用户批次接口 - name: user/channel description: 用户通道接口 - name: user/trade description: 用户交易接口 - name: user/bill description: 用户账单接口 - name: user/balance description: 用户余额变动接口 - name: user/coupon-user description: 用户已发放优惠券接口 - name: user/announcement description: 用户公告接口 - name: user/verify description: 用户验证接口 - name: admin/admin description: 管理员管理接口 - name: admin/admin-role description: 管理员角色接口 - name: admin/permission description: 权限接口 - name: admin/user description: 后台用户接口 - name: admin/resource description: 后台套餐接口 - name: admin/batch description: 后台批次接口 - name: admin/channel description: 后台通道接口 - name: admin/proxy description: 后台代理接口 - name: admin/trade description: 后台交易接口 - name: admin/bill description: 后台账单接口 - name: admin/balance-activity description: 后台余额变动接口 - name: admin/product description: 后台产品接口 - name: admin/discount description: 后台折扣接口 - name: admin/coupon description: 后台优惠券接口 - name: admin/coupon-user description: 后台已发放优惠券接口 - name: admin/article description: 后台文章接口 - name: admin/article-group description: 后台文章分组接口 - name: callback/identify description: 实名认证回调接口 components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: UUID description: | 使用 `Authorization: Bearer `。 用户、管理员、客户端访问令牌均通过 `/api/auth/token` 获取。 basicAuth: type: http scheme: basic description: | 官方客户端可使用 `Authorization: Basic `。 responses: PlainTextError: description: 业务错误或系统错误 content: text/plain: schema: type: string OAuthError: description: OAuth2 错误响应 content: application/json: schema: $ref: "#/components/schemas/TokenErrorResponse" NoContent: description: 成功,无响应体 schemas: BaseModel: type: object properties: id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time required: - id - created_at - updated_at PageRequest: type: object properties: page: type: integer minimum: 1 default: 1 size: type: integer minimum: 1 maximum: 100 default: 10 PageMeta: type: object properties: total: type: integer page: type: integer size: type: integer required: - total - page - size IdRequest: type: object properties: id: type: integer required: - id AuthorizePostRequest: type: object properties: accept: type: boolean scope: type: string TokenRequest: type: object properties: grant_type: type: string enum: - authorization_code - client_credentials - refresh_token - password client_id: type: string client_secret: type: string scope: type: string code: type: string redirect_uri: type: string code_verifier: type: string refresh_token: type: string login_type: type: string enum: - password - phone_code - email_code login_pool: type: string enum: - user - admin username: type: string password: type: string remember: type: boolean required: - grant_type TokenResponse: type: object properties: access_token: type: string refresh_token: type: string expires_in: type: integer token_type: type: string example: Bearer scope: type: string required: - access_token - expires_in - token_type TokenErrorResponse: type: object properties: error: type: string error_description: type: string required: - error RevokeRequest: type: object properties: access_token: type: string refresh_token: type: string IntrospectUserResponse: type: object description: 当前实现返回用户资料,并额外包含 `has_password` properties: id: type: integer phone: type: string username: type: string email: type: string name: type: string avatar: type: string status: type: integer balance: type: string id_type: type: integer id_no: type: string contact_qq: type: string contact_wechat: type: string has_password: type: boolean additionalProperties: true IntrospectAdminResponse: type: object description: 当前实现返回管理员资料,并额外包含 `scopes` properties: id: type: integer username: type: string name: type: string avatar: type: string phone: type: string email: type: string status: type: integer lock: type: boolean scopes: type: array items: type: string additionalProperties: true VerifierRequest: type: object properties: purpose: type: integer description: 0=登录,1=修改密码 enum: [0, 1] phone: type: string required: - purpose - phone CreateInquiryRequest: type: object properties: company: type: string maxLength: 200 name: type: string maxLength: 100 phone: type: string maxLength: 20 email: type: string format: email maxLength: 100 content: type: string maxLength: 1000 required: - name - phone - content UpdateUserRequest: type: object properties: username: type: string email: type: string format: email contact_qq: type: string contact_wechat: type: string UpdateAccountRequest: type: object properties: username: type: string password: type: string UpdatePasswordRequest: type: object properties: code: type: string password: type: string required: - code - password IdentifyRequest: type: object properties: type: type: integer enum: [1, 2] description: 1=个人认证,2=企业认证 name: type: string iden_no: type: string required: - type - name - iden_no IdentifyResponse: type: object properties: identified: type: boolean target: type: string required: - identified ListWhitelistRequest: allOf: - $ref: "#/components/schemas/PageRequest" CreateWhitelistRequest: type: object properties: host: type: string remark: type: string required: - host UpdateWhitelistRequest: type: object properties: id: type: integer host: type: string remark: type: string required: - id RemoveWhitelistItem: type: object properties: id: type: integer required: - id CreateResourceData: type: object properties: type: type: integer enum: [1, 2] description: 1=短效动态,2=长效动态 short: $ref: "#/components/schemas/CreateShortResourceData" long: $ref: "#/components/schemas/CreateLongResourceData" coupon: type: integer description: 已发放优惠券 ID required: - type CreateShortResourceData: type: object properties: live: type: integer mode: type: integer enum: [1, 2] description: 1=包时,2=包量 quota: type: integer expire: type: integer description: 包时模式下的过期天数 required: - live - mode - quota CreateLongResourceData: type: object properties: live: type: integer mode: type: integer enum: [1, 2] quota: type: integer expire: type: integer required: - live - mode - quota PageResourceShortRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: resource_no: type: string active: type: boolean type: type: integer create_after: type: string format: date-time create_before: type: string format: date-time expire_after: type: string format: date-time expire_before: type: string format: date-time status: type: integer description: 0=全部,1=有效,2=过期 PageResourceLongRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: resource_no: type: string active: type: boolean type: type: integer create_after: type: string format: date-time create_before: type: string format: date-time expire_after: type: string format: date-time expire_before: type: string format: date-time status: type: integer description: 0=全部,1=有效,2=过期 UpdateResourceCheckIpRequest: type: object properties: id: type: integer checkip: type: boolean required: - id - checkip UpdateResourceByAdminRequest: type: object properties: id: type: integer active: type: boolean checkip: type: boolean required: - id ResourcePriceResponse: type: object properties: price: type: string discounted: type: string actual: type: string required: - price - discounted - actual StatisticPersonalResponse: type: object properties: short: type: object properties: resource_count: type: integer resource_quota_sum: type: integer resource_daily_free_sum: type: integer long: type: object properties: resource_count: type: integer resource_quota_sum: type: integer resource_daily_free_sum: type: integer StatisticResourceUsageRequest: type: object properties: time_start: type: string format: date-time time_end: type: string format: date-time StatisticResourceUsageItem: type: object properties: date: type: string format: date-time count: type: integer required: - date - count PageBatchRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: resource_no: type: string time_start: type: string format: date-time time_end: type: string format: date-time PageBatchByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string resource_no: type: string batch_no: type: string prov: type: string city: type: string isp: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time PageBatchOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer resource_no: type: string batch_no: type: string prov: type: string city: type: string isp: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time required: - user_id ListChannelsRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: auth_type: type: integer enum: [1, 2] description: 1=白名单鉴权,2=账号密码鉴权,0 或缺省=全部 expire_after: type: string format: date-time expire_before: type: string format: date-time CreateChannelRequest: type: object properties: resource_id: type: integer auth_type: type: integer enum: [1, 2] protocol: type: integer count: type: integer prov: type: string city: type: string isp: type: integer required: - resource_id - auth_type - protocol - count CreateChannelRequestV2: type: object properties: resource_no: type: string auth_type: type: integer enum: [1, 2] protocol: type: integer count: type: integer prov: type: string city: type: string isp: type: integer required: - resource_no - auth_type - protocol - count CreateChannelResponseItem: type: object properties: host: type: string ip: type: string port: type: integer username: type: string password: type: string required: - host - ip - port RemoveChannelsRequest: type: object properties: batch: type: string required: - batch PageChannelsByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string resource_no: type: string batch_no: type: string proxy_host: type: string proxy_port: type: integer node_ip: type: string expired_at_start: type: string format: date-time expired_at_end: type: string format: date-time expired: type: boolean PageChannelOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer resource_no: type: string batch_no: type: string proxy_host: type: string proxy_port: type: integer expired_at_start: type: string format: date-time expired_at_end: type: string format: date-time required: - user_id SyncChannelClearExpiredRequest: type: object properties: proxy_id: type: integer required: - proxy_id SyncChannelClearExpiredResponse: type: object properties: count: type: integer required: - count CreateTradeData: type: object properties: platform: type: integer enum: [1, 2] description: 1=电脑网站,2=手机网站 method: type: integer enum: [1, 2, 3, 4, 5] description: 1=支付宝,2=微信,3=商福通,4=商福通支付宝,5=商福通微信 required: - platform - method UpdateBalanceData: type: object properties: amount: type: integer description: 充值金额,单位分 required: - amount TradeCreateRequest: allOf: - $ref: "#/components/schemas/CreateTradeData" - type: object properties: type: type: integer enum: [1, 2] description: 1=购买产品,2=充值余额 resource: $ref: "#/components/schemas/CreateResourceData" recharge: $ref: "#/components/schemas/UpdateBalanceData" required: - type TradeRef: type: object properties: trade_no: type: string method: type: integer enum: [1, 2, 3, 4, 5] required: - trade_no - method TradeCompleteByAdminRequest: allOf: - $ref: "#/components/schemas/TradeRef" - type: object properties: user_id: type: integer required: - user_id CreateTradeResult: type: object properties: pay_url: type: string trade_no: type: string required: - pay_url - trade_no PageTradeByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string inner_no: type: string outer_no: type: string method: type: integer platform: type: integer status: type: integer created_at_start: type: string format: date-time created_at_end: type: string format: date-time PageTradeOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer inner_no: type: string outer_no: type: string method: type: integer platform: type: integer status: type: integer created_at_start: type: string format: date-time created_at_end: type: string format: date-time required: - user_id ListBillRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: bill_no: type: string type: type: integer description: 1=消费,2=退款,3=充值 create_after: type: string format: date-time create_before: type: string format: date-time PageBillByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string trade_inner_no: type: string resource_no: type: string bill_no: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time product_code: type: string sku_code: type: string PageBillOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer trade_inner_no: type: string resource_no: type: string bill_no: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time product_code: type: string sku_code: type: string required: - user_id PageBalanceActivityByUserRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: bill_no: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time PageBalanceActivityByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string bill_no: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time PageBalanceActivityOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer bill_no: type: string created_at_start: type: string format: date-time created_at_end: type: string format: date-time required: - user_id CouponUserPageFilter: type: object properties: coupon_id: type: integer coupon_name: type: string status: type: integer enum: [0, 1, 2] description: 0=未使用,1=已使用,2=已禁用 expired: type: boolean created_at_start: type: string format: date-time created_at_end: type: string format: date-time expire_at_start: type: string format: date-time expire_at_end: type: string format: date-time used_at_start: type: string format: date-time used_at_end: type: string format: date-time PageCouponUserRequest: allOf: - $ref: "#/components/schemas/PageRequest" - $ref: "#/components/schemas/CouponUserPageFilter" PageCouponUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - $ref: "#/components/schemas/CouponUserPageFilter" - type: object properties: user_id: type: integer user_phone: type: string PageCouponUserOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - $ref: "#/components/schemas/CouponUserPageFilter" - type: object properties: user_id: type: integer required: - user_id CreateCouponUserRequest: type: object properties: coupon_id: type: integer user_id: type: integer status: type: integer enum: [0, 1, 2] expire_at: type: string format: date-time used_at: type: string format: date-time required: - coupon_id - user_id UpdateCouponUserRequest: type: object properties: id: type: integer status: type: integer enum: [0, 1, 2] expire_at: type: string format: date-time expire_at_clear: type: boolean used_at: type: string format: date-time used_at_clear: type: boolean required: - id AssignCouponRequest: type: object properties: coupon_id: type: integer user_id: type: integer required: - coupon_id - user_id ListAnnouncementsRequest: allOf: - $ref: "#/components/schemas/PageRequest" PageUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: account: type: string name: type: string identified: type: boolean enabled: type: boolean assigned: type: boolean created_at_start: type: string format: date-time created_at_end: type: string format: date-time GetUserByAdminRequest: type: object properties: account: type: string name: type: string CreateUserByAdminRequest: type: object properties: phone: type: string admin_id: type: integer discount_id: type: integer username: type: string email: type: string format: email password: type: string avatar: type: string status: type: integer enum: [0, 1] contact_qq: type: string contact_wechat: type: string required: - phone UpdateUserByAdminRequest: type: object properties: id: type: integer phone: type: string admin_id: type: integer discount_id: type: integer username: type: string email: type: string format: email password: type: string name: type: string avatar: type: string status: type: integer enum: [0, 1] id_type: type: integer enum: [0, 1, 2] id_no: type: string id_token: type: string contact_qq: type: string contact_wechat: type: string required: - id UpdateUserBalanceRequest: type: object properties: user_id: type: integer balance: type: string required: - user_id - balance UpdateUserBalanceChangeRequest: type: object properties: user_id: type: integer amount: type: string required: - user_id - amount BindAdminRequest: type: object properties: user_id: type: integer required: - user_id PageUserNotBindByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: phone: type: string CreateAdminRequest: type: object properties: username: type: string password: type: string name: type: string avatar: type: string phone: type: string email: type: string format: email status: type: integer enum: [0, 1] roles: type: array items: type: integer required: - username - password UpdateAdminRequest: type: object properties: id: type: integer password: type: string name: type: string avatar: type: string phone: type: string email: type: string format: email status: type: integer enum: [0, 1] roles: type: array items: type: integer required: - id CreateAdminRoleRequest: type: object properties: name: type: string description: type: string active: type: boolean sort: type: integer permissions: type: array items: type: integer required: - name UpdateAdminRoleRequest: type: object properties: id: type: integer name: type: string description: type: string active: type: boolean sort: type: integer permissions: type: array items: type: integer required: - id PageResourceShortByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string resource_no: type: string active: type: boolean mode: type: integer created_at_start: type: string format: date-time created_at_end: type: string format: date-time expired: type: boolean PageResourceLongByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_phone: type: string resource_no: type: string active: type: boolean mode: type: integer created_at_start: type: string format: date-time created_at_end: type: string format: date-time expired: type: boolean PageResourceShortOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer resource_no: type: string active: type: boolean mode: type: integer created_at_start: type: string format: date-time created_at_end: type: string format: date-time required: - user_id PageResourceLongOfUserByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: user_id: type: integer resource_no: type: string active: type: boolean mode: type: integer created_at_start: type: string format: date-time created_at_end: type: string format: date-time required: - user_id CreateProxyRequest: type: object properties: mac: type: string ip: type: string host: type: string secret: type: string type: type: integer enum: [1, 2] status: type: integer enum: [0, 1] required: - mac - ip UpdateProxyRequest: type: object properties: id: type: integer mac: type: string ip: type: string host: type: string secret: type: string required: - id UpdateProxyStatusRequest: type: object properties: id: type: integer status: type: integer enum: [0, 1] required: - id - status ProxyEdge: type: object properties: id: type: integer host: type: string port: type: integer prov: type: string city: type: string isp: type: string status: type: integer loss: type: integer latency: type: integer ProxyPermit: type: object properties: id: type: integer expire: type: string format: date-time whitelists: type: array items: type: string username: type: string password: type: string ProxyReportOnlineRequest: type: object properties: name: type: string version: type: integer required: - name - version ProxyReportOfflineRequest: type: object properties: id: type: integer required: - id ProxyReportUpdateRequest: type: object properties: id: type: integer edges: type: array items: $ref: "#/components/schemas/ProxyEdge" required: - id - edges ProxyUnavailableResponse: type: object properties: error: type: string required: - error CreateProductRequest: type: object properties: code: type: string name: type: string description: type: string sort: type: integer status: type: integer UpdateProductRequest: type: object properties: id: type: integer code: type: string name: type: string description: type: string sort: type: integer status: type: integer required: - id AllProductSkuByAdminRequest: type: object properties: product_code: type: string PageProductSkuByAdminRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: product_id: type: integer CreateProductSkuRequest: type: object properties: product_id: type: integer discount_id: type: integer code: type: string name: type: string price: type: string price_min: type: string sort: type: integer count_min: type: integer required: - product_id - discount_id - code - name - price - price_min - sort UpdateProductSkuRequest: type: object properties: id: type: integer discount_id: type: integer code: type: string name: type: string price: type: string price_min: type: string status: type: integer sort: type: integer count_min: type: integer required: - id UpdateProductSkuStatusRequest: type: object properties: id: type: integer status: type: integer required: - id - status BatchUpdateSkuDiscountRequest: type: object properties: product_id: type: integer discount_id: type: integer required: - product_id - discount_id CreateDiscountRequest: type: object properties: name: type: string discount: type: integer required: - name - discount UpdateDiscountRequest: type: object properties: id: type: integer name: type: string discount: type: integer required: - id CreateCouponRequest: type: object properties: name: type: string amount: type: string min_amount: type: string count: type: integer status: type: integer enum: [0, 1] expire_type: type: integer enum: [0, 1, 2] expire_at: type: string format: date-time expire_in: type: integer required: - name - amount UpdateCouponRequest: type: object properties: id: type: integer name: type: string amount: type: string min_amount: type: string count: type: integer status: type: integer enum: [0, 1] expire_type: type: integer enum: [0, 1, 2] expire_at: type: string format: date-time expire_in: type: integer required: - id PageArticleRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: keyword: type: string group_id: type: integer status: type: integer enum: [0, 1] CreateArticleRequest: type: object properties: group_id: type: integer title: type: string content: type: string sort: type: integer status: type: integer enum: [0, 1] required: - group_id - title UpdateArticleRequest: type: object properties: id: type: integer group_id: type: integer title: type: string content: type: string sort: type: integer status: type: integer enum: [0, 1] required: - id ArticleUploadResponse: type: object properties: url: type: string path: type: string original_name: type: string size: type: integer format: int64 mime_type: type: string required: - url - path - original_name - size - mime_type PageArticleGroupRequest: allOf: - $ref: "#/components/schemas/PageRequest" - type: object properties: keyword: type: string status: type: integer enum: [0, 1] CreateArticleGroupRequest: type: object properties: name: type: string code: type: string sort: type: integer status: type: integer enum: [0, 1] required: - name - code UpdateArticleGroupRequest: type: object properties: id: type: integer name: type: string code: type: string sort: type: integer status: type: integer enum: [0, 1] required: - id ArticleNavArticle: type: object properties: id: type: integer title: type: string updated_at: type: string format: date-time required: - id - title - updated_at ArticleNavGroup: type: object properties: id: type: integer name: type: string code: type: string articles: type: array items: $ref: "#/components/schemas/ArticleNavArticle" required: - id - name - code - articles ArticlePublicGroup: type: object properties: id: type: integer name: type: string code: type: string required: - id - name - code ArticlePublicDetail: type: object properties: id: type: integer title: type: string content: type: string updated_at: type: string format: date-time group: $ref: "#/components/schemas/ArticlePublicGroup" required: - id - title - updated_at - group AdminNameOnly: type: object properties: name: type: string UserSummary: type: object properties: id: type: integer phone: type: string name: type: string required: - id - phone DiscountItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: name: type: string discount: type: integer required: - name - discount PermissionItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: parent_id: type: integer name: type: string description: type: string sort: type: integer required: - name - sort AdminRoleListItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: name: type: string description: type: string active: type: boolean sort: type: integer required: - name - active - sort AdminRolePageItem: allOf: - $ref: "#/components/schemas/AdminRoleListItem" - type: object properties: permissions: type: array items: $ref: "#/components/schemas/PermissionItem" AdminListItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: username: type: string name: type: string avatar: type: string phone: type: string email: type: string status: type: integer last_login: type: string format: date-time last_login_ip: type: string last_login_ua: type: string lock: type: boolean required: - username - status - lock AdminPageItem: allOf: - $ref: "#/components/schemas/AdminListItem" - type: object properties: roles: type: array items: $ref: "#/components/schemas/AdminRoleListItem" ProxyItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: mac: type: string ip: type: string host: type: string secret: type: string type: type: integer status: type: integer required: - mac - ip - type - status ProductAdminItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: code: type: string name: type: string description: type: string sort: type: integer status: type: integer required: - code - name - sort - status ProductSaleSkuItem: type: object properties: id: type: integer product_id: type: integer name: type: string code: type: string price: type: string count_min: type: integer required: - id - product_id - name - code - price - count_min ProductSaleItem: type: object properties: id: type: integer code: type: string name: type: string description: type: string sort: type: integer skus: type: array items: $ref: "#/components/schemas/ProductSaleSkuItem" required: - id - code - name - sort - skus ProductSkuListItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: product_id: type: integer discount_id: type: integer code: type: string name: type: string price: type: string price_min: type: string status: type: integer sort: type: integer count_min: type: integer required: - product_id - discount_id - code - name - price - price_min - status - sort - count_min ProductSkuPageItem: allOf: - $ref: "#/components/schemas/ProductSkuListItem" - type: object properties: product: $ref: "#/components/schemas/ProductAdminItem" discount: $ref: "#/components/schemas/DiscountItem" CouponItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: name: type: string amount: type: string min_amount: type: string count: type: integer status: type: integer expire_type: type: integer expire_at: type: string format: date-time expire_in: type: integer required: - name - amount - min_amount - count - status - expire_type Whitelist: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: user_id: type: integer ip: type: string remark: type: string required: - user_id - ip Announcement: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: title: type: string content: type: string type: type: integer pin: type: boolean status: type: integer sort: type: integer required: - title - type - pin - status - sort ArticleGroupItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: name: type: string code: type: string sort: type: integer status: type: integer required: - name - code - sort - status ArticlePageItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: group_id: type: integer title: type: string sort: type: integer status: type: integer group: $ref: "#/components/schemas/ArticleGroupItem" required: - group_id - title - sort - status ArticleDetail: allOf: - $ref: "#/components/schemas/ArticlePageItem" - type: object properties: content: type: string DiscountSummary: $ref: "#/components/schemas/DiscountItem" ResourceSummary: type: object properties: resource_no: type: string type: type: integer BillSummary: type: object properties: id: type: integer bill_no: type: string TradeSummary: type: object properties: inner_no: type: string acquirer: type: integer SkuNameOnly: type: object properties: name: type: string ResourceBase: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: user_id: type: integer resource_no: type: string active: type: boolean type: type: integer code: type: string checkip: type: boolean required: - user_id - active - type - code - checkip ResourceShortInfo: type: object properties: id: type: integer resource_id: type: integer code: type: string live: type: integer type: type: integer quota: type: integer expire_at: type: string format: date-time used: type: integer daily: type: integer last_at: type: string format: date-time required: - id - resource_id - code - live - type - quota - used - daily ResourceLongInfo: type: object properties: id: type: integer resource_id: type: integer code: type: string live: type: integer type: type: integer quota: type: integer expire_at: type: string format: date-time used: type: integer daily: type: integer last_at: type: string format: date-time required: - id - resource_id - code - live - type - quota - used - daily ResourceShortAdminInfo: allOf: - $ref: "#/components/schemas/ResourceShortInfo" - type: object properties: sku: $ref: "#/components/schemas/SkuNameOnly" ResourceLongAdminInfo: allOf: - $ref: "#/components/schemas/ResourceLongInfo" - type: object properties: sku: $ref: "#/components/schemas/SkuNameOnly" ResourceShortListItem: allOf: - $ref: "#/components/schemas/ResourceBase" - type: object properties: short: $ref: "#/components/schemas/ResourceShortInfo" ResourceLongListItem: allOf: - $ref: "#/components/schemas/ResourceBase" - type: object properties: long: $ref: "#/components/schemas/ResourceLongInfo" ResourceAllItem: oneOf: - $ref: "#/components/schemas/ResourceShortListItem" - $ref: "#/components/schemas/ResourceLongListItem" ResourceShortAdminItem: allOf: - $ref: "#/components/schemas/ResourceBase" - type: object properties: user: $ref: "#/components/schemas/UserSummary" short: $ref: "#/components/schemas/ResourceShortAdminInfo" ResourceLongAdminItem: allOf: - $ref: "#/components/schemas/ResourceBase" - type: object properties: user: $ref: "#/components/schemas/UserSummary" long: $ref: "#/components/schemas/ResourceLongAdminInfo" ChannelUserItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: user_id: type: integer resource_id: type: integer batch_no: type: string proxy_id: type: integer host: type: string port: type: integer edge_id: type: integer edge_ref: type: string filter_isp: type: string filter_prov: type: string filter_city: type: string ip: type: string whitelists: type: string username: type: string password: type: string expired_at: type: string format: date-time required: - user_id - resource_id - batch_no - proxy_id - host - port - expired_at ChannelAdminItem: allOf: - $ref: "#/components/schemas/ChannelUserItem" - type: object properties: user: $ref: "#/components/schemas/UserSummary" resource: $ref: "#/components/schemas/ResourceSummary" TradeAdminItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: user_id: type: integer inner_no: type: string outer_no: type: string type: type: integer subject: type: string remark: type: string amount: type: string payment: type: string method: type: integer platform: type: integer acquirer: type: integer status: type: integer refunded: type: boolean payment_url: type: string completed_at: type: string format: date-time canceled_at: type: string format: date-time user: $ref: "#/components/schemas/UserSummary" required: - user_id - inner_no - type - subject - amount - payment - method - platform - status - refunded BillUserItem: allOf: - $ref: "#/components/schemas/BaseModel" - type: object properties: user_id: type: integer trade_id: type: integer resource_id: type: integer refund_id: type: integer coupon_user_id: type: integer bill_no: type: string info: type: string type: type: integer amount: type: string actual: type: string trade: $ref: "#/components/schemas/TradeSummary" resource: $ref: "#/components/schemas/ResourceSummary" required: - user_id - bill_no - type - amount - actual BillAdminItem: allOf: - $ref: "#/components/schemas/BillUserItem" - type: object properties: user: $ref: "#/components/schemas/UserSummary" BalanceActivityUserItem: type: object properties: id: type: integer user_id: type: integer bill_id: type: integer admin_id: type: integer amount: type: string balance_prev: type: string balance_curr: type: string remark: type: string created_at: type: string format: date-time bill: $ref: "#/components/schemas/BillSummary" required: - id - user_id - amount - balance_prev - balance_curr - created_at BalanceActivityAdminItem: allOf: - $ref: "#/components/schemas/BalanceActivityUserItem" - type: object properties: user: $ref: "#/components/schemas/UserSummary" admin: $ref: "#/components/schemas/AdminNameOnly" BatchBaseItem: type: object properties: id: type: integer user_id: type: integer resource_id: type: integer batch_no: type: string count: type: integer prov: type: string city: type: string isp: type: string ip: type: string time: type: string format: date-time required: - id - user_id - resource_id - batch_no - count - ip - time BatchUserItem: allOf: - $ref: "#/components/schemas/BatchBaseItem" - type: object properties: resource: $ref: "#/components/schemas/ResourceSummary" BatchAdminItem: allOf: - $ref: "#/components/schemas/BatchBaseItem" - type: object properties: user: $ref: "#/components/schemas/UserSummary" resource: $ref: "#/components/schemas/ResourceSummary" CouponUserUserItem: type: object properties: id: type: integer coupon_id: type: integer user_id: type: integer status: type: integer expire_at: type: string format: date-time used_at: type: string format: date-time created_at: type: string format: date-time coupon: $ref: "#/components/schemas/CouponItem" required: - id - coupon_id - user_id - status - created_at CouponUserAdminItem: allOf: - $ref: "#/components/schemas/CouponUserUserItem" - type: object properties: user: $ref: "#/components/schemas/UserSummary" AdminUserPageItem: type: object properties: id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time admin_id: type: integer discount_id: type: integer phone: type: string username: type: string email: type: string source: type: integer name: type: string avatar: type: string status: type: integer balance: type: string id_type: type: integer id_no: type: string description: 脱敏后的证件号 id_token: type: string contact_qq: type: string contact_wechat: type: string last_login: type: string format: date-time last_login_ip: type: string last_login_ua: type: string admin: $ref: "#/components/schemas/AdminNameOnly" discount: $ref: "#/components/schemas/DiscountSummary" required: - id - created_at - updated_at - phone - status - balance - id_type AdminUserNotBindPageItem: type: object properties: id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time admin_id: type: integer discount_id: type: integer phone: type: string username: type: string email: type: string source: type: integer name: type: string avatar: type: string status: type: integer balance: type: string id_type: type: integer id_token: type: string contact_qq: type: string contact_wechat: type: string last_login: type: string format: date-time last_login_ip: type: string last_login_ua: type: string required: - id - created_at - updated_at - phone - status - balance - id_type AdminUserDetail: type: object properties: id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time admin_id: type: integer discount_id: type: integer phone: type: string username: type: string email: type: string source: type: integer name: type: string avatar: type: string status: type: integer balance: type: string id_type: type: integer id_no: type: string description: 原始证件号 id_token: type: string contact_qq: type: string contact_wechat: type: string last_login: type: string format: date-time last_login_ip: type: string last_login_ua: type: string admin: $ref: "#/components/schemas/AdminNameOnly" discount: $ref: "#/components/schemas/DiscountSummary" required: - id - created_at - updated_at - phone - status - balance - id_type PageWhitelistResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/Whitelist" required: - list PageResourceShortResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ResourceShortListItem" required: - list PageResourceLongResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ResourceLongListItem" required: - list PageBatchUserResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/BatchUserItem" required: - list PageChannelUserResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ChannelUserItem" required: - list PageBillUserResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/BillUserItem" required: - list PageBalanceActivityUserResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/BalanceActivityUserItem" required: - list PageCouponUserUserResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/CouponUserUserItem" required: - list PageAnnouncementResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/Announcement" required: - list PageAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/AdminPageItem" required: - list PageAdminRoleResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/AdminRolePageItem" required: - list PagePermissionResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/PermissionItem" required: - list PageAdminUserResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/AdminUserPageItem" required: - list PageAdminUserNotBindResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/AdminUserNotBindPageItem" required: - list PageResourceShortAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ResourceShortAdminItem" required: - list PageResourceLongAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ResourceLongAdminItem" required: - list PageBatchAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/BatchAdminItem" required: - list PageChannelAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ChannelAdminItem" required: - list PageProxyResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ProxyItem" required: - list PageTradeAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/TradeAdminItem" required: - list PageBillAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/BillAdminItem" required: - list PageBalanceActivityAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/BalanceActivityAdminItem" required: - list PageProductSkuAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ProductSkuPageItem" required: - list PageDiscountResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/DiscountItem" required: - list PageCouponResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/CouponItem" required: - list PageCouponUserAdminResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/CouponUserAdminItem" required: - list PageArticleResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ArticlePageItem" required: - list PageArticleGroupResponse: allOf: - $ref: "#/components/schemas/PageMeta" - type: object properties: list: type: array items: $ref: "#/components/schemas/ArticleGroupItem" required: - list paths: /api/auth/authorize: get: tags: [public/auth] summary: 授权确认页占位接口 description: 当前实现只校验参数与客户端,不返回确认页面内容。 parameters: - name: response_type in: query required: true schema: type: string enum: [code] - name: client_id in: query required: true schema: type: string - name: redirect_uri in: query required: true schema: type: string - name: scope in: query schema: type: string - name: state in: query schema: type: string responses: "200": description: 当前实现无响应体 default: $ref: "#/components/responses/PlainTextError" post: tags: [public/auth] summary: 提交授权确认占位接口 description: 当前实现为占位逻辑。 requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/AuthorizePostRequest" responses: "200": description: 当前实现无响应体 default: $ref: "#/components/responses/PlainTextError" /api/auth/token: post: tags: [public/auth] summary: 获取访问令牌 description: 支持 `authorization_code`、`client_credentials`、`refresh_token`、`password` 四种授权方式。 requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/TokenRequest" application/x-www-form-urlencoded: schema: $ref: "#/components/schemas/TokenRequest" responses: "200": description: 获取成功 content: application/json: schema: $ref: "#/components/schemas/TokenResponse" "400": $ref: "#/components/responses/OAuthError" "401": $ref: "#/components/responses/OAuthError" default: $ref: "#/components/responses/PlainTextError" /api/auth/revoke: post: tags: [public/auth] summary: 撤销令牌 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/RevokeRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/auth/introspect: post: tags: [public/auth] summary: 获取当前登录态信息 security: - bearerAuth: [] responses: "200": description: 返回当前用户或管理员资料 content: application/json: schema: oneOf: - $ref: "#/components/schemas/IntrospectUserResponse" - $ref: "#/components/schemas/IntrospectAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/resource/price: post: tags: [public/resource] summary: 计算套餐价格 description: 可匿名调用;如果携带用户 Bearer Token,则价格计算会带入用户折扣/优惠券上下文。 security: - {} - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateResourceData" responses: "200": description: 价格明细 content: application/json: schema: $ref: "#/components/schemas/ResourcePriceResponse" default: $ref: "#/components/responses/PlainTextError" /api/trade/check: get: tags: [public/trade] summary: SSE 检查订单状态 parameters: - name: trade_no in: query required: true schema: type: string - name: method in: query required: true schema: type: integer enum: [1, 2, 3, 4, 5] responses: "200": description: SSE 状态流 content: text/event-stream: schema: type: string example: | data: 0 default: $ref: "#/components/responses/PlainTextError" /api/inquiry/create: post: tags: [public/inquiry] summary: 提交咨询 requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateInquiryRequest" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/product/list: post: tags: [public/product] summary: 获取在售产品列表 responses: "200": description: 产品与在售 SKU 列表 content: application/json: schema: type: array items: $ref: "#/components/schemas/ProductSaleItem" default: $ref: "#/components/responses/PlainTextError" /api/verify/sms: post: tags: [client/verify] summary: 发送短信验证码 description: 仅官方客户端可调用,可使用客户端 Basic 鉴权或客户端 Bearer 鉴权。 security: - basicAuth: [] - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/VerifierRequest" responses: "200": description: 成功,无响应体 "429": $ref: "#/components/responses/PlainTextError" default: $ref: "#/components/responses/PlainTextError" /api/proxy/online: post: tags: [client/proxy] summary: 代理上线报告 description: 当前实现固定返回“接口暂不可用”。 security: - basicAuth: [] - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/ProxyReportOnlineRequest" responses: "200": description: 当前实现返回不可用提示 content: application/json: schema: $ref: "#/components/schemas/ProxyUnavailableResponse" /api/proxy/offline: post: tags: [client/proxy] summary: 代理下线报告 description: 当前实现固定返回“接口暂不可用”。 security: - basicAuth: [] - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/ProxyReportOfflineRequest" responses: "200": description: 当前实现返回不可用提示 content: application/json: schema: $ref: "#/components/schemas/ProxyUnavailableResponse" /api/proxy/update: post: tags: [client/proxy] summary: 代理状态更新 description: 当前实现固定返回“接口暂不可用”。 security: - basicAuth: [] - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/ProxyReportUpdateRequest" responses: "200": description: 当前实现返回不可用提示 content: application/json: schema: $ref: "#/components/schemas/ProxyUnavailableResponse" /api/channel/remove: post: tags: [client/channel] summary: 删除通道批次 description: 仅官方客户端可调用。 security: - basicAuth: [] - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/RemoveChannelsRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/article/nav: post: tags: [client/article] summary: 获取文档导航 description: 仅官方客户端可调用。 security: - basicAuth: [] - bearerAuth: [] responses: "200": description: 文档导航树 content: application/json: schema: type: array items: $ref: "#/components/schemas/ArticleNavGroup" default: $ref: "#/components/responses/PlainTextError" /api/article/get: post: tags: [client/article] summary: 获取文档详情 description: 仅官方客户端可调用。 security: - basicAuth: [] - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 文档详情 content: application/json: schema: $ref: "#/components/schemas/ArticlePublicDetail" default: $ref: "#/components/responses/PlainTextError" /api/user/update: post: tags: [user/user] summary: 更新用户资料 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateUserRequest" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/user/update/account: post: tags: [user/user] summary: 更新用户名或密码 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateAccountRequest" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/user/update/password: post: tags: [user/user] summary: 通过短信验证码修改密码 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdatePasswordRequest" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/user/identify: post: tags: [user/user] summary: 发起实名认证 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdentifyRequest" responses: "200": description: 返回认证跳转目标或已认证状态 content: application/json: schema: $ref: "#/components/schemas/IdentifyResponse" default: $ref: "#/components/responses/PlainTextError" /api/whitelist/list: post: tags: [user/whitelist] summary: 获取当前用户白名单 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/ListWhitelistRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageWhitelistResponse" default: $ref: "#/components/responses/PlainTextError" /api/whitelist/create: post: tags: [user/whitelist] summary: 新建白名单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateWhitelistRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/whitelist/update: post: tags: [user/whitelist] summary: 更新白名单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateWhitelistRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/whitelist/remove: post: tags: [user/whitelist] summary: 批量删除白名单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: array items: $ref: "#/components/schemas/RemoveWhitelistItem" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/resource/all: post: tags: [user/resource] summary: 获取当前用户全部可用套餐 security: - bearerAuth: [] responses: "200": description: 套餐列表 content: application/json: schema: type: array items: $ref: "#/components/schemas/ResourceAllItem" default: $ref: "#/components/responses/PlainTextError" /api/resource/list/short: post: tags: [user/resource] summary: 分页查询当前用户短效套餐 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageResourceShortRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageResourceShortResponse" default: $ref: "#/components/responses/PlainTextError" /api/resource/list/long: post: tags: [user/resource] summary: 分页查询当前用户长效套餐 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageResourceLongRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageResourceLongResponse" default: $ref: "#/components/responses/PlainTextError" /api/resource/create: post: tags: [user/resource] summary: 使用余额购买套餐 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateResourceData" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/resource/update/checkip: post: tags: [user/resource] summary: 修改套餐 IP 校验开关 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateResourceCheckIpRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/resource/statistics/free: post: tags: [user/resource] summary: 统计当前用户每日可用额度 security: - bearerAuth: [] responses: "200": description: 可用额度统计 content: application/json: schema: $ref: "#/components/schemas/StatisticPersonalResponse" default: $ref: "#/components/responses/PlainTextError" /api/resource/statistics/usage: post: tags: [user/resource] summary: 统计当前用户使用量 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/StatisticResourceUsageRequest" responses: "200": description: 按天聚合的用量 content: application/json: schema: type: array items: $ref: "#/components/schemas/StatisticResourceUsageItem" default: $ref: "#/components/responses/PlainTextError" /api/batch/page: post: tags: [user/batch] summary: 分页查询当前用户提取记录 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBatchRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBatchUserResponse" default: $ref: "#/components/responses/PlainTextError" /api/channel/list: post: tags: [user/channel] summary: 分页查询当前用户通道 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/ListChannelsRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageChannelUserResponse" default: $ref: "#/components/responses/PlainTextError" /api/channel/create: post: tags: [user/channel] summary: 创建通道 description: 当前实现不要求登录,但会校验套餐、实名认证和白名单条件。 requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateChannelRequest" responses: "200": description: 通道列表 content: application/json: schema: type: array items: $ref: "#/components/schemas/CreateChannelResponseItem" default: $ref: "#/components/responses/PlainTextError" /api/channel/create/v2: post: tags: [user/channel] summary: 创建通道 v2 description: 使用 `resource_no` 替代 `resource_id`。 requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateChannelRequestV2" responses: "200": description: 通道列表 content: application/json: schema: type: array items: $ref: "#/components/schemas/CreateChannelResponseItem" default: $ref: "#/components/responses/PlainTextError" /api/trade/create: post: tags: [user/trade] summary: 创建订单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/TradeCreateRequest" responses: "200": description: 支付跳转结果 content: application/json: schema: $ref: "#/components/schemas/CreateTradeResult" default: $ref: "#/components/responses/PlainTextError" /api/trade/complete: post: tags: [user/trade] summary: 完成订单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/TradeRef" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/trade/cancel: post: tags: [user/trade] summary: 取消订单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/TradeRef" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/bill/list: post: tags: [user/bill] summary: 分页查询当前用户账单 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/ListBillRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBillUserResponse" default: $ref: "#/components/responses/PlainTextError" /api/balance/page: post: tags: [user/balance] summary: 分页查询当前用户余额变动 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBalanceActivityByUserRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBalanceActivityUserResponse" default: $ref: "#/components/responses/PlainTextError" /api/coupon-user/page: post: tags: [user/coupon-user] summary: 分页查询当前用户已发放优惠券 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageCouponUserRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageCouponUserUserResponse" default: $ref: "#/components/responses/PlainTextError" /api/coupon-user/get: post: tags: [user/coupon-user] summary: 获取当前用户优惠券详情 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 优惠券详情 content: application/json: schema: $ref: "#/components/schemas/CouponUserUserItem" default: $ref: "#/components/responses/PlainTextError" /api/announcement/list: post: tags: [user/announcement] summary: 分页查询公告 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/ListAnnouncementsRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageAnnouncementResponse" default: $ref: "#/components/responses/PlainTextError" /api/verify/sms/password: post: tags: [user/verify] summary: 发送修改密码短信验证码 security: - bearerAuth: [] responses: "200": description: 成功,无响应体 "429": $ref: "#/components/responses/PlainTextError" default: $ref: "#/components/responses/PlainTextError" /api/admin/admin/all: post: tags: [admin/admin] summary: 获取管理员列表 security: - bearerAuth: [] responses: "200": description: 管理员数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/AdminListItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/admin/page: post: tags: [admin/admin] summary: 分页获取管理员 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/admin/create: post: tags: [admin/admin] summary: 创建管理员 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateAdminRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/admin/update: post: tags: [admin/admin] summary: 更新管理员 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateAdminRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/admin/remove: post: tags: [admin/admin] summary: 删除管理员 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/admin-role/list: post: tags: [admin/admin-role] summary: 获取管理员角色列表 security: - bearerAuth: [] responses: "200": description: 角色数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/AdminRoleListItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/admin-role/page: post: tags: [admin/admin-role] summary: 分页获取管理员角色 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageAdminRoleResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/admin-role/create: post: tags: [admin/admin-role] summary: 创建管理员角色 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateAdminRoleRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/admin-role/update: post: tags: [admin/admin-role] summary: 更新管理员角色 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateAdminRoleRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/admin-role/remove: post: tags: [admin/admin-role] summary: 删除管理员角色 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/permission/list: post: tags: [admin/permission] summary: 获取权限列表 security: - bearerAuth: [] responses: "200": description: 权限数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/PermissionItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/permission/page: post: tags: [admin/permission] summary: 分页获取权限 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PagePermissionResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/user/page: post: tags: [admin/user] summary: 分页获取用户 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageAdminUserResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/user/page/not-bind: post: tags: [admin/user] summary: 分页获取未绑定管理员的用户 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageUserNotBindByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageAdminUserNotBindResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/user/get: post: tags: [admin/user] summary: 获取单个用户 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/GetUserByAdminRequest" responses: "200": description: 用户详情 content: application/json: schema: $ref: "#/components/schemas/AdminUserDetail" default: $ref: "#/components/responses/PlainTextError" /api/admin/user/create: post: tags: [admin/user] summary: 创建用户 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateUserByAdminRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/user/update: post: tags: [admin/user] summary: 更新用户 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateUserByAdminRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/user/remove: post: tags: [admin/user] summary: 删除用户 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/user/update/bind: post: tags: [admin/user] summary: 认领用户 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/BindAdminRequest" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/admin/user/update/balance: post: tags: [admin/user] summary: 直接设置用户余额 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateUserBalanceRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/user/update/balance-inc: post: tags: [admin/user] summary: 增加用户余额 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateUserBalanceChangeRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/user/update/balance-dec: post: tags: [admin/user] summary: 减少用户余额 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateUserBalanceChangeRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/resource/short/page: post: tags: [admin/resource] summary: 分页查询全部短效套餐 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageResourceShortByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageResourceShortAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/resource/short/page/of-user: post: tags: [admin/resource] summary: 分页查询指定用户短效套餐 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageResourceShortOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageResourceShortAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/resource/long/page: post: tags: [admin/resource] summary: 分页查询全部长效套餐 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageResourceLongByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageResourceLongAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/resource/long/page/of-user: post: tags: [admin/resource] summary: 分页查询指定用户长效套餐 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageResourceLongOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageResourceLongAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/resource/update: post: tags: [admin/resource] summary: 更新套餐状态 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateResourceByAdminRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/batch/page: post: tags: [admin/batch] summary: 分页查询全部提取记录 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBatchByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBatchAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/batch/page/of-user: post: tags: [admin/batch] summary: 分页查询指定用户提取记录 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBatchOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBatchAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/channel/page: post: tags: [admin/channel] summary: 分页查询全部通道 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageChannelsByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageChannelAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/channel/page/of-user: post: tags: [admin/channel] summary: 分页查询指定用户通道 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageChannelOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageChannelAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/channel/sync/clear-expired: post: tags: [admin/channel] summary: 清理指定代理的过期通道 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/SyncChannelClearExpiredRequest" responses: "200": description: 清理结果 content: application/json: schema: $ref: "#/components/schemas/SyncChannelClearExpiredResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/proxy/all: post: tags: [admin/proxy] summary: 获取代理列表 security: - bearerAuth: [] responses: "200": description: 代理数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/ProxyItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/proxy/page: post: tags: [admin/proxy] summary: 分页获取代理 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageProxyResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/proxy/create: post: tags: [admin/proxy] summary: 创建代理 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateProxyRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/proxy/update: post: tags: [admin/proxy] summary: 更新代理 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateProxyRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/proxy/update/status: post: tags: [admin/proxy] summary: 更新代理在线状态 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateProxyStatusRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/proxy/remove: post: tags: [admin/proxy] summary: 删除代理 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/trade/page: post: tags: [admin/trade] summary: 分页查询全部订单 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageTradeByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageTradeAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/trade/page/of-user: post: tags: [admin/trade] summary: 分页查询指定用户订单 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageTradeOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageTradeAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/trade/complete: post: tags: [admin/trade] summary: 管理员完成订单 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/TradeCompleteByAdminRequest" responses: "204": $ref: "#/components/responses/NoContent" default: $ref: "#/components/responses/PlainTextError" /api/admin/bill/page: post: tags: [admin/bill] summary: 分页查询全部账单 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBillByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBillAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/bill/page/of-user: post: tags: [admin/bill] summary: 分页查询指定用户账单 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBillOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBillAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/balance-activity/page: post: tags: [admin/balance-activity] summary: 分页查询全部余额变动 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBalanceActivityByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBalanceActivityAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/balance-activity/page/of-user: post: tags: [admin/balance-activity] summary: 分页查询指定用户余额变动 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageBalanceActivityOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageBalanceActivityAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/product/all: post: tags: [admin/product] summary: 获取全部产品 security: - bearerAuth: [] responses: "200": description: 产品数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/ProductAdminItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/product/create: post: tags: [admin/product] summary: 创建产品 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateProductRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/update: post: tags: [admin/product] summary: 更新产品 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateProductRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/remove: post: tags: [admin/product] summary: 删除产品 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/all: post: tags: [admin/product] summary: 获取产品 SKU 列表 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/AllProductSkuByAdminRequest" responses: "200": description: SKU 数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/ProductSkuListItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/page: post: tags: [admin/product] summary: 分页获取产品 SKU security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageProductSkuByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageProductSkuAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/create: post: tags: [admin/product] summary: 创建产品 SKU security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateProductSkuRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/update: post: tags: [admin/product] summary: 更新产品 SKU security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateProductSkuRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/update/status: post: tags: [admin/product] summary: 更新产品 SKU 状态 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateProductSkuStatusRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/remove: post: tags: [admin/product] summary: 删除产品 SKU security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/product/sku/update/discount/batch: post: tags: [admin/product] summary: 批量更新产品 SKU 折扣 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/BatchUpdateSkuDiscountRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/discount/all: post: tags: [admin/discount] summary: 获取折扣列表 security: - bearerAuth: [] responses: "200": description: 折扣数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/DiscountItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/discount/page: post: tags: [admin/discount] summary: 分页获取折扣 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageDiscountResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/discount/create: post: tags: [admin/discount] summary: 创建折扣 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateDiscountRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/discount/update: post: tags: [admin/discount] summary: 更新折扣 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateDiscountRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/discount/remove: post: tags: [admin/discount] summary: 删除折扣 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon/all: post: tags: [admin/coupon] summary: 获取优惠券列表 security: - bearerAuth: [] responses: "200": description: 优惠券数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/CouponItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon/page: post: tags: [admin/coupon] summary: 分页获取优惠券 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageCouponResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon/create: post: tags: [admin/coupon] summary: 创建优惠券 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateCouponRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon/update: post: tags: [admin/coupon] summary: 更新优惠券 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateCouponRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon/remove: post: tags: [admin/coupon] summary: 删除优惠券 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon/update/assign: post: tags: [admin/coupon] summary: 发放优惠券给用户 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/AssignCouponRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon-user/page: post: tags: [admin/coupon-user] summary: 分页查询全部已发放优惠券 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageCouponUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageCouponUserAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon-user/page/of-user: post: tags: [admin/coupon-user] summary: 分页查询指定用户已发放优惠券 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageCouponUserOfUserByAdminRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageCouponUserAdminResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon-user/get: post: tags: [admin/coupon-user] summary: 获取已发放优惠券详情 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 详情对象 content: application/json: schema: $ref: "#/components/schemas/CouponUserAdminItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon-user/create: post: tags: [admin/coupon-user] summary: 手动创建已发放优惠券 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateCouponUserRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon-user/update: post: tags: [admin/coupon-user] summary: 更新已发放优惠券 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateCouponUserRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/coupon-user/remove: post: tags: [admin/coupon-user] summary: 删除已发放优惠券 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/article/page: post: tags: [admin/article] summary: 分页查询文章 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageArticleRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageArticleResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/article/get: post: tags: [admin/article] summary: 获取文章详情 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 文章详情 content: application/json: schema: $ref: "#/components/schemas/ArticleDetail" default: $ref: "#/components/responses/PlainTextError" /api/admin/article/create: post: tags: [admin/article] summary: 创建文章 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateArticleRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/article/update: post: tags: [admin/article] summary: 更新文章 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateArticleRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/article/remove: post: tags: [admin/article] summary: 删除文章 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/article/upload: post: tags: [admin/article] summary: 上传文章图片 security: - bearerAuth: [] requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary required: - file responses: "200": description: 上传结果 content: application/json: schema: $ref: "#/components/schemas/ArticleUploadResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/article-group/page: post: tags: [admin/article-group] summary: 分页查询文章分组 security: - bearerAuth: [] requestBody: content: application/json: schema: $ref: "#/components/schemas/PageArticleGroupRequest" responses: "200": description: 分页结果 content: application/json: schema: $ref: "#/components/schemas/PageArticleGroupResponse" default: $ref: "#/components/responses/PlainTextError" /api/admin/article-group/list: post: tags: [admin/article-group] summary: 获取文章分组列表 security: - bearerAuth: [] responses: "200": description: 分组数组 content: application/json: schema: type: array items: $ref: "#/components/schemas/ArticleGroupItem" default: $ref: "#/components/responses/PlainTextError" /api/admin/article-group/create: post: tags: [admin/article-group] summary: 创建文章分组 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/CreateArticleGroupRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/article-group/update: post: tags: [admin/article-group] summary: 更新文章分组 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/UpdateArticleGroupRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /api/admin/article-group/remove: post: tags: [admin/article-group] summary: 删除文章分组 security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: "#/components/schemas/IdRequest" responses: "200": description: 成功,无响应体 default: $ref: "#/components/responses/PlainTextError" /callback/identify: get: tags: [callback/identify] summary: 实名认证回调 parameters: - name: id in: query required: true schema: type: string - name: success in: query required: true schema: type: boolean responses: "200": description: 返回 HTML 结果页 content: text/html: schema: type: string