diff --git a/PC.openapi.yaml b/PC.openapi.yaml
new file mode 100644
index 0000000..47117db
--- /dev/null
+++ b/PC.openapi.yaml
@@ -0,0 +1,883 @@
+# 已废弃:本文件保留仅用于追溯此前的账号闭环方案。
+# 正式接口源为 PC.openapi2.json;代码、测试和后续开发不得再以本文件为依据。
+openapi: 3.0.3
+info:
+ title: 代代相传 PC 用户端 API
+ version: 1.1.0
+ description: |
+ 本文档是当前 PC 用户端唯一接口契约。
+ 范围仅包含账号认证、个人资料、安全设置、头像上传、验证码与行政区划。
+ 家谱、社区、内容、会员、支付及平台运营能力不在本期范围内。
+servers:
+ - url: https://{host}
+ variables:
+ host:
+ default: api.example.com
+ description: 由部署环境配置的 HTTPS API 域名
+tags:
+ - name: 认证登录
+ - name: 验证中心
+ - name: 文件上传
+ - name: 行政区划
+paths:
+ /genealogy/pc/auth/register:
+ post:
+ tags: [认证登录]
+ summary: PC 用户注册
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RegisterRequest'
+ responses:
+ '200':
+ description: 注册结果;客户端不保存注册响应中的令牌
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LoginResponse'
+ /genealogy/pc/auth/login:
+ post:
+ tags: [认证登录]
+ summary: PC 密码登录
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PasswordLoginRequest'
+ responses:
+ '200':
+ description: 登录成功并返回令牌
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LoginResponse'
+ /genealogy/pc/auth/login/sms:
+ post:
+ tags: [认证登录]
+ summary: PC 短信登录
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SmsLoginRequest'
+ responses:
+ '200':
+ description: 登录成功并返回令牌
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LoginResponse'
+ /genealogy/pc/auth/sms/code:
+ post:
+ tags: [认证登录]
+ summary: 发送短信验证码
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SmsCodeRequest'
+ responses:
+ '200':
+ description: 短信已受理
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VoidResponse'
+ /genealogy/pc/auth/profile:
+ get:
+ tags: [认证登录]
+ summary: 获取当前用户资料
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ responses:
+ '200':
+ description: 当前登录用户资料
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProfileResponse'
+ put:
+ tags: [认证登录]
+ summary: 更新当前用户资料
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProfileUpdateRequest'
+ responses:
+ '200':
+ description: 更新后的用户资料
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProfileResponse'
+ /genealogy/pc/auth/password:
+ put:
+ tags: [认证登录]
+ summary: 修改当前用户密码
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PasswordChangeRequest'
+ responses:
+ '200':
+ description: 密码修改成功
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VoidResponse'
+ /genealogy/pc/auth/password/reset:
+ put:
+ tags: [认证登录]
+ summary: 找回密码
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PasswordResetRequest'
+ responses:
+ '200':
+ description: 密码重置成功
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VoidResponse'
+ /genealogy/pc/auth/phone:
+ put:
+ tags: [认证登录]
+ summary: 换绑手机号
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PhoneChangeRequest'
+ responses:
+ '200':
+ description: 换绑后的用户资料
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProfileResponse'
+ /genealogy/pc/auth/account/deactivate:
+ post:
+ tags: [认证登录]
+ summary: 注销当前账号
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccountDeactivateRequest'
+ responses:
+ '200':
+ description: 注销申请已受理
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VoidResponse'
+ /genealogy/pc/auth/logout:
+ delete:
+ tags: [认证登录]
+ summary: 退出登录
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ responses:
+ '200':
+ description: 服务端会话已退出
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VoidResponse'
+ /captcha/require:
+ get:
+ tags: [验证中心]
+ summary: 查询场景是否需要验证码
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ - name: tenantId
+ in: query
+ schema:
+ type: string
+ default: '000000'
+ - name: clientId
+ in: query
+ schema:
+ type: string
+ - $ref: '#/components/parameters/SceneCode'
+ - name: subject
+ in: query
+ description: 手机号或其他待验证主体
+ schema:
+ type: string
+ responses:
+ '200':
+ description: 当前场景验证码策略
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CaptchaRequirementResponse'
+ /captcha/challenge:
+ post:
+ tags: [验证中心]
+ summary: 创建验证码挑战
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CaptchaChallengeRequest'
+ responses:
+ '200':
+ description: 验证码挑战
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CaptchaChallengeResponse'
+ /captcha/verify:
+ post:
+ tags: [验证中心]
+ summary: 校验验证码并换取业务票据
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CaptchaVerifyRequest'
+ responses:
+ '200':
+ description: 返回可提交给后续业务接口的 validToken
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CaptchaVerifyResponse'
+ /genealogy/pc/files/upload:
+ post:
+ tags: [文件上传]
+ summary: 上传个人头像文件
+ security:
+ - BearerAuth: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ requestBody:
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ required: [file]
+ properties:
+ file:
+ type: string
+ format: binary
+ responses:
+ '200':
+ description: 上传结果
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FileUploadResponse'
+ /genealogy/region/children:
+ get:
+ tags: [行政区划]
+ summary: 查询下级行政区划
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ - name: parentCode
+ in: query
+ schema:
+ type: string
+ responses:
+ '200':
+ description: 下级地区列表
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RegionListResponse'
+ /genealogy/region/path/{regionCode}:
+ get:
+ tags: [行政区划]
+ summary: 查询地区完整路径
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ - $ref: '#/components/parameters/RegionCode'
+ responses:
+ '200':
+ description: 根节点到目标地区的路径
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RegionListResponse'
+ /genealogy/region/search:
+ get:
+ tags: [行政区划]
+ summary: 搜索行政区划
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ - name: keyword
+ in: query
+ required: true
+ schema:
+ type: string
+ - name: limit
+ in: query
+ schema:
+ type: integer
+ default: 20
+ maximum: 50
+ responses:
+ '200':
+ description: 匹配的地区列表
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RegionListResponse'
+ /genealogy/region/{regionCode}:
+ get:
+ tags: [行政区划]
+ summary: 查询行政区划详情
+ security: []
+ parameters:
+ - $ref: '#/components/parameters/ClientIdHeader'
+ - $ref: '#/components/parameters/RegionCode'
+ responses:
+ '200':
+ description: 地区详情
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RegionResponse'
+components:
+ parameters:
+ ClientIdHeader:
+ name: clientid
+ in: header
+ required: true
+ description: PC 客户端标识
+ schema:
+ type: string
+ example: ced7e5f0498645c6ec642dcf450b036f
+ RegionCode:
+ name: regionCode
+ in: path
+ required: true
+ schema:
+ type: string
+ example: '110101'
+ SceneCode:
+ name: sceneCode
+ in: query
+ required: true
+ schema:
+ $ref: '#/components/schemas/CaptchaSceneCode'
+ schemas:
+ CaptchaSceneCode:
+ type: string
+ enum:
+ - WEB_H5_LOGIN
+ - WEB_H5_REGISTER
+ - WEB_H5_FORGOT_PASSWORD
+ - WEB_H5_CHANGE_PASSWORD
+ - WEB_H5_CHANGE_PHONE
+ RegisterRequest:
+ type: object
+ required: [grantType, tenantId, phone, password]
+ properties:
+ grantType:
+ type: string
+ enum: [password]
+ tenantId:
+ type: string
+ example: '000000'
+ clientId:
+ type: string
+ phone:
+ type: string
+ pattern: '^1[3-9]\\d{9}$'
+ password:
+ type: string
+ description: 32 位 MD5 值;传输层必须使用 HTTPS
+ pattern: '^[a-fA-F0-9]{32}$'
+ nickName:
+ type: string
+ maxLength: 32
+ registerSource:
+ type: string
+ enum: [PC]
+ validToken:
+ type: string
+ PasswordLoginRequest:
+ type: object
+ required: [grantType, tenantId, phone, password]
+ properties:
+ grantType:
+ type: string
+ enum: [password]
+ tenantId:
+ type: string
+ clientId:
+ type: string
+ phone:
+ type: string
+ pattern: '^1[3-9]\\d{9}$'
+ password:
+ type: string
+ pattern: '^[a-fA-F0-9]{32}$'
+ validToken:
+ type: string
+ SmsLoginRequest:
+ type: object
+ required: [grantType, tenantId, phone, smsCode]
+ properties:
+ grantType:
+ type: string
+ enum: [sms]
+ tenantId:
+ type: string
+ clientId:
+ type: string
+ phone:
+ type: string
+ pattern: '^1[3-9]\\d{9}$'
+ smsCode:
+ type: string
+ pattern: '^\\d{4,8}$'
+ validToken:
+ type: string
+ SmsCodeRequest:
+ type: object
+ required: [tenantId, phone, sceneCode]
+ properties:
+ tenantId:
+ type: string
+ clientId:
+ type: string
+ phone:
+ type: string
+ pattern: '^1[3-9]\\d{9}$'
+ sceneCode:
+ $ref: '#/components/schemas/CaptchaSceneCode'
+ validToken:
+ type: string
+ PasswordChangeRequest:
+ type: object
+ required: [oldPassword, newPassword]
+ properties:
+ oldPassword:
+ type: string
+ pattern: '^[a-fA-F0-9]{32}$'
+ newPassword:
+ type: string
+ pattern: '^[a-fA-F0-9]{32}$'
+ validToken:
+ type: string
+ PasswordResetRequest:
+ type: object
+ required: [tenantId, phone, smsCode, newPassword]
+ properties:
+ tenantId:
+ type: string
+ phone:
+ type: string
+ pattern: '^1[3-9]\\d{9}$'
+ smsCode:
+ type: string
+ pattern: '^\\d{4,8}$'
+ newPassword:
+ type: string
+ pattern: '^[a-fA-F0-9]{32}$'
+ validToken:
+ type: string
+ PhoneChangeRequest:
+ type: object
+ required: [newPhone, smsCode]
+ properties:
+ newPhone:
+ type: string
+ pattern: '^1[3-9]\\d{9}$'
+ smsCode:
+ type: string
+ pattern: '^\\d{4,8}$'
+ validToken:
+ type: string
+ AccountDeactivateRequest:
+ type: object
+ required: [password]
+ properties:
+ password:
+ type: string
+ pattern: '^[a-fA-F0-9]{32}$'
+ reason:
+ type: string
+ maxLength: 200
+ ProfileUpdateRequest:
+ type: object
+ properties:
+ nickName:
+ type: string
+ maxLength: 32
+ avatarOssId:
+ type: integer
+ format: int64
+ sex:
+ type: string
+ enum: ['0', '1', '2']
+ birthday:
+ type: string
+ format: date
+ provinceCode:
+ type: string
+ cityCode:
+ type: string
+ districtCode:
+ type: string
+ addressDetail:
+ type: string
+ maxLength: 100
+ Profile:
+ type: object
+ required: [userId, phone]
+ properties:
+ userId:
+ type: integer
+ format: int64
+ phone:
+ type: string
+ nickName:
+ type: string
+ avatarOssId:
+ type: integer
+ format: int64
+ nullable: true
+ avatarUrl:
+ type: string
+ format: uri
+ nullable: true
+ sex:
+ type: string
+ nullable: true
+ birthday:
+ type: string
+ format: date
+ nullable: true
+ provinceCode:
+ type: string
+ nullable: true
+ cityCode:
+ type: string
+ nullable: true
+ districtCode:
+ type: string
+ nullable: true
+ addressDetail:
+ type: string
+ nullable: true
+ LoginData:
+ type: object
+ required: [accessToken, userId, tenantId, clientId]
+ properties:
+ accessToken:
+ type: string
+ userId:
+ type: integer
+ format: int64
+ tenantId:
+ type: string
+ clientId:
+ type: string
+ FileUpload:
+ type: object
+ required: [ossId, url, fileName, originalName]
+ properties:
+ ossId:
+ type: integer
+ format: int64
+ url:
+ type: string
+ format: uri
+ thumbnailUrl:
+ type: string
+ format: uri
+ nullable: true
+ fileName:
+ type: string
+ originalName:
+ type: string
+ Region:
+ type: object
+ required: [regionCode, regionName]
+ properties:
+ regionCode:
+ type: string
+ regionName:
+ type: string
+ parentCode:
+ type: string
+ nullable: true
+ level:
+ type: integer
+ minimum: 0
+ CaptchaRequirement:
+ type: object
+ required: [required, sceneCode]
+ properties:
+ required:
+ type: boolean
+ sceneCode:
+ $ref: '#/components/schemas/CaptchaSceneCode'
+ providerCode:
+ type: string
+ nullable: true
+ captchaType:
+ type: string
+ nullable: true
+ CaptchaChallengeRequest:
+ type: object
+ required: [tenantId, clientId, sceneCode]
+ properties:
+ tenantId:
+ type: string
+ clientId:
+ type: string
+ sceneCode:
+ $ref: '#/components/schemas/CaptchaSceneCode'
+ subject:
+ type: string
+ CaptchaChallenge:
+ type: object
+ required: [challengeId, providerCode, captchaType]
+ properties:
+ challengeId:
+ type: string
+ providerCode:
+ type: string
+ captchaType:
+ type: string
+ backgroundImage:
+ type: string
+ format: uri
+ nullable: true
+ templateImage:
+ type: string
+ format: uri
+ nullable: true
+ uuid:
+ type: string
+ nullable: true
+ image:
+ type: string
+ nullable: true
+ CaptchaVerifyRequest:
+ type: object
+ required: [tenantId, clientId, sceneCode, challengeId, providerCode, captchaType, payload]
+ properties:
+ tenantId:
+ type: string
+ clientId:
+ type: string
+ sceneCode:
+ $ref: '#/components/schemas/CaptchaSceneCode'
+ subject:
+ type: string
+ challengeId:
+ type: string
+ providerCode:
+ type: string
+ captchaType:
+ type: string
+ payload:
+ oneOf:
+ - $ref: '#/components/schemas/TianaiCaptchaPayload'
+ - $ref: '#/components/schemas/SystemImageCaptchaPayload'
+ TianaiCaptchaPayload:
+ type: object
+ required: [track]
+ properties:
+ track:
+ type: object
+ required: [trackList]
+ properties:
+ trackList:
+ type: array
+ items:
+ type: object
+ required: [x, y, t, type]
+ properties:
+ x:
+ type: integer
+ y:
+ type: integer
+ t:
+ type: integer
+ type:
+ type: string
+ SystemImageCaptchaPayload:
+ type: object
+ required: [uuid, code]
+ properties:
+ uuid:
+ type: string
+ code:
+ type: string
+ CaptchaVerify:
+ type: object
+ required: [validToken]
+ properties:
+ validToken:
+ type: string
+ expireAt:
+ type: string
+ format: date-time
+ nullable: true
+ VoidResponse:
+ type: object
+ required: [code, msg]
+ properties:
+ code:
+ type: integer
+ example: 200
+ msg:
+ type: string
+ data:
+ nullable: true
+ LoginResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/LoginData'
+ ProfileResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/Profile'
+ FileUploadResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/FileUpload'
+ RegionResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/Region'
+ RegionListResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Region'
+ CaptchaRequirementResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/CaptchaRequirement'
+ CaptchaChallengeResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/CaptchaChallenge'
+ CaptchaVerifyResponse:
+ type: object
+ required: [code, msg, data]
+ properties:
+ code:
+ type: integer
+ msg:
+ type: string
+ data:
+ $ref: '#/components/schemas/CaptchaVerify'
+ securitySchemes:
+ BearerAuth:
+ type: http
+ scheme: bearer
+ bearerFormat: JWT
diff --git a/PC.openapi2.json b/PC.openapi2.json
new file mode 100644
index 0000000..b6604c2
--- /dev/null
+++ b/PC.openapi2.json
@@ -0,0 +1,3580 @@
+{
+ "openapi": "3.0.1",
+ "info": {
+ "title": "PC",
+ "description": "家谱业务 APP/PC 用户侧接口文档,用于 Apifox 导入。\n\n导入方式:Apifox -> 导入 API 数据 -> OpenAPI/Swagger -> 选择本文件。\n\n约定:\n- APP 路径前缀为 `/genealogy/app`\n- PC/H5 路径前缀为 `/genealogy/pc`\n- 后台管理接口不包含在本文件内\n- 登录后接口需要携带 token,且请求 Header 需携带 `clientid`\n",
+ "version": "1.0.0"
+ },
+ "tags": [
+ {
+ "name": "认证登录"
+ },
+ {
+ "name": "验证中心"
+ },
+ {
+ "name": "文件上传"
+ },
+ {
+ "name": "行政区划"
+ },
+ {
+ "name": "家族圈"
+ }
+ ],
+ "paths": {
+ "/genealogy/pc/auth/register": {
+ "post": {
+ "summary": "PC 用户注册",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PasswordRegisterBody"
+ },
+ "example": {
+ "grantType": "password",
+ "tenantId": "000000",
+ "phone": "13800000000",
+ "password": "e10adc3949ba59abbe56e057f20f883e",
+ "nickName": "测试用户",
+ "registerSource": "app",
+ "validToken": "captcha-ticket-or-sms-token"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/LoginResult",
+ "description": "登录结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/login": {
+ "post": {
+ "summary": "PC 密码登录",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PasswordLoginBody"
+ },
+ "example": {
+ "grantType": "password",
+ "tenantId": "000000",
+ "phone": "13800000000",
+ "password": "e10adc3949ba59abbe56e057f20f883e",
+ "validToken": "captcha-ticket"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/LoginResult",
+ "description": "登录结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/login/sms": {
+ "post": {
+ "summary": "PC 短信登录",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SmsLoginBody"
+ },
+ "example": {
+ "grantType": "sms",
+ "tenantId": "000000",
+ "phone": "13800000000",
+ "smsCode": "123456",
+ "validToken": "captcha-ticket"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/LoginResult",
+ "description": "登录结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/sms/code": {
+ "post": {
+ "summary": "PC 发送短信验证码",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/SmsCodeBody"
+ },
+ "example": {
+ "tenantId": "000000",
+ "phone": "13800000000",
+ "sceneCode": "WEB_H5_LOGIN",
+ "validToken": "captcha-ticket"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/profile": {
+ "get": {
+ "summary": "PC 当前用户资料",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "put": {
+ "summary": "PC 修改用户资料",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ProfileUpdateBody"
+ },
+ "example": {
+ "nickName": "张三",
+ "avatarOssId": "2060000000000000000",
+ "sex": "0",
+ "birthday": "1990-01-01",
+ "regionCode": "110101",
+ "addressDetail": "北京市东城区"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/password": {
+ "put": {
+ "summary": "PC 修改密码",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PasswordChangeBody"
+ },
+ "example": {
+ "oldPassword": "e10adc3949ba59abbe56e057f20f883e",
+ "newPassword": "25d55ad283aa400af464c76d713c07ad",
+ "validToken": "captcha-ticket"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/password/reset": {
+ "put": {
+ "summary": "PC 找回密码",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PasswordResetBody"
+ },
+ "example": {
+ "tenantId": "000000",
+ "phone": "13800000000",
+ "smsCode": "123456",
+ "newPassword": "25d55ad283aa400af464c76d713c07ad",
+ "validToken": "captcha-ticket"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/phone": {
+ "put": {
+ "summary": "PC 换绑手机号",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PhoneChangeBody"
+ },
+ "example": {
+ "newPhone": "13900000000",
+ "smsCode": "123456",
+ "validToken": "captcha-ticket"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/account/deactivate": {
+ "post": {
+ "summary": "PC 注销账号",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AccountDeactivateBody"
+ },
+ "example": {
+ "password": "e10adc3949ba59abbe56e057f20f883e",
+ "reason": "user request"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/auth/logout": {
+ "delete": {
+ "summary": "PC 退出登录",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "认证登录"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/captcha/require": {
+ "get": {
+ "summary": "查询当前场景是否需要验证",
+ "deprecated": false,
+ "description": "用于登录、注册、换绑手机等场景。按租户、客户端和场景编码匹配后台验证策略。",
+ "tags": [
+ "验证中心"
+ ],
+ "parameters": [
+ {
+ "name": "tenantId",
+ "in": "query",
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "required": false,
+ "example": "000000",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "clientId",
+ "in": "query",
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "required": false,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "sceneCode",
+ "in": "query",
+ "description": "验证场景编码,例如APP_LOGIN、PC_LOGIN、APP_REGISTER",
+ "required": true,
+ "example": "WEB_H5_LOGIN",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "subject",
+ "in": "query",
+ "description": "验证主体,通常为手机号、用户ID或登录账号",
+ "required": false,
+ "example": "13800000000",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VerificationRequireResult",
+ "description": "验证需求查询结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/captcha/challenge": {
+ "post": {
+ "summary": "生成验证挑战",
+ "deprecated": false,
+ "description": "统一生成验证码。策略为天爱时返回行为验证数据;策略为系统图形时返回 uuid 和 img。",
+ "tags": [
+ "验证中心"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/VerificationChallengeBody"
+ },
+ "example": {
+ "tenantId": "000000",
+ "clientId": "ced7e5f0498645c6ec642dcf450b036f",
+ "sceneCode": "WEB_H5_LOGIN",
+ "subject": "13800000000"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VerificationChallengeResult",
+ "description": "验证挑战生成结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/captcha/verify": {
+ "post": {
+ "summary": "校验验证结果并换取 validToken",
+ "deprecated": false,
+ "description": "验证通过后返回 validToken,登录、注册、发短信等业务接口将 validToken 随请求体一起提交。",
+ "tags": [
+ "验证中心"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/VerificationCheckBody"
+ },
+ "examples": {
+ "tianai_behavior": {
+ "value": {
+ "tenantId": "000000",
+ "clientId": "ced7e5f0498645c6ec642dcf450b036f",
+ "sceneCode": "WEB_H5_LOGIN",
+ "subject": "13800000000",
+ "challengeId": "CAPTCHA_CHALLENGE_ID",
+ "providerCode": "tianai",
+ "captchaType": "SLIDER",
+ "payload": {
+ "track": {
+ "bgImageWidth": 340,
+ "bgImageHeight": 180,
+ "templateImageWidth": 50,
+ "templateImageHeight": 50,
+ "startTime": 1720000000000,
+ "stopTime": 1720000001500,
+ "left": 120,
+ "top": 0,
+ "trackList": [
+ {
+ "x": 0,
+ "y": 0,
+ "t": 0,
+ "type": "down"
+ },
+ {
+ "x": 120,
+ "y": 0,
+ "t": 650,
+ "type": "move"
+ },
+ {
+ "x": 120,
+ "y": 0,
+ "t": 700,
+ "type": "up"
+ }
+ ]
+ }
+ }
+ },
+ "summary": "天爱滑块/旋转/滑动还原/文字点选验证"
+ },
+ "system_image": {
+ "value": {
+ "tenantId": "000000",
+ "clientId": "ced7e5f0498645c6ec642dcf450b036f",
+ "sceneCode": "WEB_H5_LOGIN",
+ "subject": "13800000000",
+ "challengeId": "CAPTCHA_CHALLENGE_ID",
+ "providerCode": "ruoyi_image",
+ "captchaType": "math",
+ "payload": {
+ "uuid": "captcha-uuid",
+ "code": "6"
+ }
+ },
+ "summary": "系统图形验证码"
+ }
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VerificationCheckResult",
+ "description": "验证校验结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/auth/code": {
+ "get": {
+ "summary": "兼容旧系统图形验证码",
+ "deprecated": false,
+ "description": "老版后台登录图形验证码入口。新的 APP/PC 业务优先使用 /captcha/require + /captcha/challenge + /captcha/verify。",
+ "tags": [
+ "验证中心"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/LegacyCaptchaResult",
+ "description": "兼容旧图形验证码结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/files/upload": {
+ "post": {
+ "summary": "PC 单文件上传",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "文件上传"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "example": ""
+ }
+ },
+ "required": [
+ "file"
+ ]
+ },
+ "example": {
+ "file": ""
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/FileUploadResult",
+ "description": "文件上传结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/files/resumable/init": {
+ "post": {
+ "summary": "PC 分片上传初始化",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "文件上传"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResumableInitBody"
+ },
+ "example": {
+ "fileName": "cover.jpg",
+ "fileSize": 9532,
+ "fileMd5": "d41d8cd98f00b204e9800998ecf8427e",
+ "contentType": "image/jpeg",
+ "chunkSize": 4194304,
+ "totalChunks": 1,
+ "bizType": "genealogy",
+ "usageScene": "cover"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/files/resumable/chunk": {
+ "post": {
+ "summary": "PC 上传分片",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "文件上传"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "multipart/form-data": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "uploadId": {
+ "type": "string",
+ "example": ""
+ },
+ "chunkIndex": {
+ "type": "integer",
+ "example": 0
+ },
+ "chunkMd5": {
+ "type": "string",
+ "example": "d41d8cd98f00b204e9800998ecf8427e"
+ },
+ "file": {
+ "type": "string",
+ "format": "binary",
+ "example": ""
+ }
+ },
+ "required": [
+ "uploadId",
+ "chunkIndex",
+ "chunkMd5",
+ "file"
+ ]
+ },
+ "example": {
+ "uploadId": "",
+ "chunkIndex": 0,
+ "chunkMd5": "d41d8cd98f00b204e9800998ecf8427e",
+ "file": ""
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/files/resumable/complete": {
+ "post": {
+ "summary": "PC 完成分片上传",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "文件上传"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ResumableCompleteBody"
+ },
+ "example": {
+ "uploadId": "UPLOAD202607090001",
+ "fileMd5": "d41d8cd98f00b204e9800998ecf8427e",
+ "fileSize": 9532
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/FileUploadResult",
+ "description": "文件上传结果"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/files/reference": {
+ "post": {
+ "summary": "PC 绑定文件业务引用",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "文件上传"
+ ],
+ "parameters": [
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "428a8310cd442757ae699df5d894f051",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FileReferenceBody"
+ },
+ "example": {
+ "bizType": "family_feed",
+ "bizName": "family feed image",
+ "bizTable": "gen_family_feed",
+ "bizId": 900013001,
+ "bizField": "media_oss_ids",
+ "ossId": "2060000000000000000",
+ "usageScene": "feed_image"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "delete": {
+ "summary": "PC 释放文件业务引用",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "文件上传"
+ ],
+ "parameters": [
+ {
+ "name": "bizTable",
+ "in": "query",
+ "description": "业务表名,用于文件引用绑定",
+ "required": true,
+ "example": "gen_family_feed",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "bizId",
+ "in": "query",
+ "description": "业务数据ID,用于文件引用绑定",
+ "required": true,
+ "example": 900013001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "bizField",
+ "in": "query",
+ "description": "业务字段名,例如avatar_oss_id、cover_oss_id",
+ "required": true,
+ "example": "media_ids",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "428a8310cd442757ae699df5d894f051",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/region/children": {
+ "get": {
+ "summary": "查询下级行政区划",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "行政区划"
+ ],
+ "parameters": [
+ {
+ "name": "parentCode",
+ "in": "query",
+ "description": "父级行政区划编码,不传或传0查省级",
+ "required": false,
+ "example": "51",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ListResult",
+ "description": "通用列表响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/region/path/{regionCode}": {
+ "get": {
+ "summary": "查询行政区划路径",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "行政区划"
+ ],
+ "parameters": [
+ {
+ "name": "regionCode",
+ "in": "path",
+ "description": "行政区划编码",
+ "required": true,
+ "example": "510000",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ListResult",
+ "description": "通用列表响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/region/search": {
+ "get": {
+ "summary": "搜索行政区划",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "行政区划"
+ ],
+ "parameters": [
+ {
+ "name": "keyword",
+ "in": "query",
+ "description": "搜索关键词,支持地区名称或编码模糊查询",
+ "required": true,
+ "example": "北京",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "level",
+ "in": "query",
+ "description": "行政区划级别,1省、2市、3区县、4乡镇街道、5村社区",
+ "required": false,
+ "example": 3,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "返回数量上限",
+ "required": false,
+ "example": 20,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ListResult",
+ "description": "通用列表响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/region/{regionCode}": {
+ "get": {
+ "summary": "查询行政区划详情",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "行政区划"
+ ],
+ "parameters": [
+ {
+ "name": "regionCode",
+ "in": "path",
+ "description": "行政区划编码",
+ "required": true,
+ "example": "510000",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID",
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string",
+ "default": "ced7e5f0498645c6ec642dcf450b036f"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds": {
+ "get": {
+ "summary": "PC 家族圈动态列表",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ListResult",
+ "description": "通用列表响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "post": {
+ "summary": "PC 发布家族圈动态",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FamilyFeedBody"
+ },
+ "example": {
+ "feedType": "text",
+ "feedContent": "今天上传一张老照片。",
+ "mediaOssIds": "2060000000000000001,2060000000000000002",
+ "sortOrder": 0,
+ "status": "0"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds/page": {
+ "get": {
+ "summary": "PC 家族圈动态分页",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "pageNum",
+ "in": "query",
+ "description": "页码,从1开始",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 1
+ }
+ },
+ {
+ "name": "pageSize",
+ "in": "query",
+ "description": "每页条数",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 10
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/PageResult",
+ "description": "通用分页响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds/{feedId}": {
+ "get": {
+ "summary": "PC 家族圈动态详情",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "put": {
+ "summary": "PC 修改家族圈动态",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FamilyFeedBody"
+ },
+ "example": {
+ "feedType": "text",
+ "feedContent": "今天上传一张老照片。",
+ "mediaOssIds": "2060000000000000001,2060000000000000002",
+ "sortOrder": 0,
+ "status": "0"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "delete": {
+ "summary": "PC 删除家族圈动态",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds/{feedId}/likes": {
+ "post": {
+ "summary": "PC 点赞动态",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "delete": {
+ "summary": "PC 取消点赞动态",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds/{feedId}/comments": {
+ "get": {
+ "summary": "PC 动态评论列表",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ListResult",
+ "description": "通用列表响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ },
+ "post": {
+ "summary": "PC 评论动态",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FamilyFeedCommentBody"
+ },
+ "example": {
+ "parentCommentId": null,
+ "replyUserId": null,
+ "content": "这张照片很有年代感。"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/ObjectResult",
+ "description": "通用对象响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds/{feedId}/comments/page": {
+ "get": {
+ "summary": "PC 动态评论分页",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "pageNum",
+ "in": "query",
+ "description": "页码,从1开始",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 1
+ }
+ },
+ {
+ "name": "pageSize",
+ "in": "query",
+ "description": "每页条数",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "default": 10
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/PageResult",
+ "description": "通用分页响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ },
+ "/genealogy/pc/genealogies/{genealogyId}/feeds/{feedId}/comments/{commentId}": {
+ "delete": {
+ "summary": "PC 删除动态评论",
+ "deprecated": false,
+ "description": "",
+ "tags": [
+ "家族圈"
+ ],
+ "parameters": [
+ {
+ "name": "genealogyId",
+ "in": "path",
+ "description": "家谱ID",
+ "required": true,
+ "example": 900001001,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "feedId",
+ "in": "path",
+ "description": "家族动态ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "commentId",
+ "in": "path",
+ "description": "评论ID",
+ "required": true,
+ "example": "",
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "clientid",
+ "in": "header",
+ "description": "客户端ID,请求Header携带,用于区分APP/PC/小程序等终端",
+ "required": true,
+ "example": "ced7e5f0498645c6ec642dcf450b036f",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/components/responses/VoidResult",
+ "description": "通用成功响应"
+ }
+ },
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "PasswordRegisterBody": {
+ "type": "object",
+ "required": [
+ "grantType",
+ "tenantId",
+ "phone",
+ "password"
+ ],
+ "properties": {
+ "clientId": {
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "type": "string"
+ },
+ "grantType": {
+ "description": "授权类型,例如password、sms、wechat、apple",
+ "type": "string",
+ "example": "password"
+ },
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string",
+ "example": "000000"
+ },
+ "phone": {
+ "description": "手机号",
+ "type": "string",
+ "example": "13800000000"
+ },
+ "password": {
+ "type": "string",
+ "description": "32 位 MD5",
+ "example": "e10adc3949ba59abbe56e057f20f883e"
+ },
+ "nickName": {
+ "description": "用户昵称",
+ "type": "string"
+ },
+ "registerSource": {
+ "description": "注册来源,例如APP、PC、H5、MINI_PROGRAM",
+ "type": "string"
+ },
+ "validToken": {
+ "description": "验证中心通过后返回的票据,用于注册/登录/换绑等二次校验",
+ "type": "string"
+ }
+ }
+ },
+ "PasswordLoginBody": {
+ "type": "object",
+ "required": [
+ "grantType",
+ "tenantId",
+ "phone",
+ "password"
+ ],
+ "properties": {
+ "clientId": {
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "type": "string"
+ },
+ "grantType": {
+ "description": "授权类型,例如password、sms、wechat、apple",
+ "type": "string",
+ "example": "password"
+ },
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string",
+ "example": "000000"
+ },
+ "phone": {
+ "description": "手机号",
+ "type": "string",
+ "example": "13800000000"
+ },
+ "password": {
+ "type": "string",
+ "description": "32 位 MD5",
+ "example": "e10adc3949ba59abbe56e057f20f883e"
+ },
+ "validToken": {
+ "description": "验证中心通过后返回的票据,用于注册/登录/换绑等二次校验",
+ "type": "string"
+ }
+ }
+ },
+ "SmsLoginBody": {
+ "type": "object",
+ "required": [
+ "grantType",
+ "tenantId",
+ "phone",
+ "smsCode"
+ ],
+ "properties": {
+ "clientId": {
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "type": "string"
+ },
+ "grantType": {
+ "description": "授权类型,例如password、sms、wechat、apple",
+ "type": "string",
+ "example": "sms"
+ },
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string",
+ "example": "000000"
+ },
+ "phone": {
+ "description": "手机号",
+ "type": "string",
+ "example": "13800000000"
+ },
+ "smsCode": {
+ "description": "短信验证码",
+ "type": "string",
+ "example": "1234"
+ }
+ }
+ },
+ "SmsCodeBody": {
+ "type": "object",
+ "required": [
+ "grantType",
+ "tenantId",
+ "sceneCode",
+ "phone",
+ "validToken"
+ ],
+ "properties": {
+ "clientId": {
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "type": "string"
+ },
+ "grantType": {
+ "description": "授权类型,例如password、sms、wechat、apple",
+ "type": "string",
+ "example": "sms"
+ },
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string",
+ "example": "000000"
+ },
+ "sceneCode": {
+ "description": "验证场景编码,例如APP_LOGIN、PC_LOGIN、APP_REGISTER",
+ "type": "string",
+ "example": "WEB_H5_LOGIN"
+ },
+ "phone": {
+ "description": "手机号",
+ "type": "string",
+ "example": "13800000000"
+ },
+ "validToken": {
+ "description": "验证中心通过后返回的票据,用于注册/登录/换绑等二次校验",
+ "type": "string"
+ }
+ }
+ },
+ "ProfileUpdateBody": {
+ "type": "object",
+ "properties": {
+ "nickName": {
+ "description": "用户昵称",
+ "type": "string"
+ },
+ "avatarOssId": {
+ "description": "头像文件OSS ID",
+ "type": "integer",
+ "format": "int64"
+ },
+ "sex": {
+ "description": "性别,建议使用系统字典值",
+ "type": "string"
+ },
+ "birthday": {
+ "description": "生日,格式 yyyy-MM-dd",
+ "type": "string",
+ "format": "date"
+ },
+ "provinceCode": {
+ "type": "string"
+ },
+ "cityCode": {
+ "type": "string"
+ },
+ "districtCode": {
+ "type": "string"
+ }
+ }
+ },
+ "PasswordChangeBody": {
+ "type": "object",
+ "required": [
+ "oldPassword",
+ "newPassword"
+ ],
+ "properties": {
+ "oldPassword": {
+ "type": "string",
+ "description": "32 位 MD5"
+ },
+ "newPassword": {
+ "type": "string",
+ "description": "32 位 MD5"
+ }
+ }
+ },
+ "PasswordResetBody": {
+ "type": "object",
+ "required": [
+ "tenantId",
+ "phone",
+ "smsCode",
+ "newPassword"
+ ],
+ "properties": {
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string",
+ "example": "000000"
+ },
+ "phone": {
+ "description": "手机号",
+ "type": "string"
+ },
+ "smsCode": {
+ "description": "短信验证码",
+ "type": "string"
+ },
+ "newPassword": {
+ "type": "string",
+ "description": "32 位 MD5"
+ },
+ "validToken": {
+ "description": "验证中心通过后返回的票据,用于注册/登录/换绑等二次校验",
+ "type": "string"
+ }
+ }
+ },
+ "PhoneChangeBody": {
+ "type": "object",
+ "required": [
+ "newPhone",
+ "smsCode"
+ ],
+ "properties": {
+ "newPhone": {
+ "type": "string"
+ },
+ "smsCode": {
+ "description": "短信验证码",
+ "type": "string"
+ },
+ "validToken": {
+ "description": "验证中心通过后返回的票据,用于注册/登录/换绑等二次校验",
+ "type": "string"
+ }
+ }
+ },
+ "AccountDeactivateBody": {
+ "type": "object",
+ "required": [
+ "password"
+ ],
+ "properties": {
+ "password": {
+ "type": "string",
+ "description": "32 位 MD5"
+ },
+ "reason": {
+ "description": "操作原因或说明",
+ "type": "string"
+ }
+ }
+ },
+ "ResumableInitBody": {
+ "type": "object",
+ "required": [
+ "fileName",
+ "fileSize",
+ "fileMd5",
+ "chunkSize",
+ "totalChunks"
+ ],
+ "properties": {
+ "fileName": {
+ "description": "原始文件名",
+ "type": "string"
+ },
+ "fileSize": {
+ "description": "文件大小,单位字节",
+ "type": "integer",
+ "format": "int64"
+ },
+ "fileMd5": {
+ "description": "完整文件MD5,用于秒传和完整性校验",
+ "type": "string"
+ },
+ "contentType": {
+ "description": "文件MIME类型,例如 image/jpeg、video/mp4",
+ "type": "string"
+ },
+ "chunkSize": {
+ "description": "单个分片大小,单位字节",
+ "type": "integer",
+ "example": 4194304
+ },
+ "totalChunks": {
+ "description": "总分片数",
+ "type": "integer"
+ },
+ "bizType": {
+ "description": "业务类型,例如avatar、cover、feed_image",
+ "type": "string"
+ },
+ "usageScene": {
+ "description": "文件使用场景,便于后续引用统计和清理",
+ "type": "string"
+ }
+ }
+ },
+ "ResumableCompleteBody": {
+ "type": "object",
+ "required": [
+ "uploadId",
+ "fileMd5",
+ "fileSize"
+ ],
+ "properties": {
+ "uploadId": {
+ "description": "分片上传任务ID",
+ "type": "string"
+ },
+ "fileMd5": {
+ "description": "完整文件MD5,用于秒传和完整性校验",
+ "type": "string"
+ },
+ "fileSize": {
+ "description": "文件大小,单位字节",
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
+ "FileReferenceBody": {
+ "type": "object",
+ "required": [
+ "bizType",
+ "bizTable",
+ "bizId",
+ "bizField"
+ ],
+ "properties": {
+ "bizType": {
+ "description": "业务类型,例如avatar、cover、feed_image",
+ "type": "string",
+ "example": "family_feed"
+ },
+ "bizName": {
+ "description": "业务名称,用于后台展示文件引用来源",
+ "type": "string",
+ "example": "家族圈动态"
+ },
+ "bizTable": {
+ "description": "业务表名,用于文件引用绑定",
+ "type": "string",
+ "example": "gen_family_feed"
+ },
+ "bizId": {
+ "description": "业务数据ID,用于文件引用绑定",
+ "type": "integer",
+ "format": "int64"
+ },
+ "bizField": {
+ "description": "业务字段名,例如avatar_oss_id、cover_oss_id",
+ "type": "string",
+ "example": "media_ids"
+ },
+ "ossId": {
+ "description": "OSS文件ID,表单内部使用,用户侧应通过上传组件获取",
+ "type": "integer",
+ "format": "int64"
+ },
+ "ossIds": {
+ "type": "string",
+ "example": "2060001,2060002"
+ },
+ "usageScene": {
+ "description": "文件使用场景,便于后续引用统计和清理",
+ "type": "string"
+ },
+ "usageName": {
+ "type": "string"
+ }
+ }
+ },
+ "FamilyFeedBody": {
+ "type": "object",
+ "required": [
+ "feedContent"
+ ],
+ "properties": {
+ "feedType": {
+ "description": "动态类型,未传时默认为 text",
+ "type": "string",
+ "example": "text"
+ },
+ "feedContent": {
+ "description": "动态内容,不能为空",
+ "type": "string",
+ "example": "今天上传一张老照片。"
+ },
+ "mediaOssIds": {
+ "description": "媒体文件 OSS ID 列表,多个 ID 使用英文逗号分隔",
+ "type": "string",
+ "example": "2060000000000000001,2060000000000000002"
+ },
+ "sortOrder": {
+ "description": "排序值,未传时默认为 0",
+ "type": "integer",
+ "format": "int64",
+ "example": 0
+ },
+ "status": {
+ "description": "动态状态,未传时默认为正常状态",
+ "type": "string",
+ "example": "0"
+ }
+ }
+ },
+ "FamilyFeedCommentBody": {
+ "type": "object",
+ "required": [
+ "content"
+ ],
+ "properties": {
+ "parentCommentId": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true
+ },
+ "replyUserId": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true
+ },
+ "content": {
+ "type": "string"
+ }
+ }
+ },
+ "VerificationChallengeBody": {
+ "type": "object",
+ "required": [
+ "sceneCode"
+ ],
+ "properties": {
+ "tenantId": {
+ "type": "string",
+ "description": "租户 ID"
+ },
+ "clientId": {
+ "type": "string",
+ "description": "客户端 ID"
+ },
+ "sceneCode": {
+ "type": "string",
+ "description": "验证场景编码,如 ADMIN_LOGIN/APP_LOGIN/APP_REGISTER"
+ },
+ "subject": {
+ "type": "string",
+ "description": "验证主体,如手机号/用户名/IP"
+ }
+ },
+ "example": {
+ "tenantId": "000000",
+ "clientId": "ced7e5f0498645c6ec642dcf450b036f",
+ "sceneCode": "WEB_H5_LOGIN",
+ "subject": "13800000000"
+ }
+ },
+ "VerificationCheckBody": {
+ "type": "object",
+ "required": [
+ "sceneCode"
+ ],
+ "properties": {
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string"
+ },
+ "clientId": {
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "type": "string"
+ },
+ "sceneCode": {
+ "description": "验证场景编码,例如APP_LOGIN、PC_LOGIN、APP_REGISTER",
+ "type": "string"
+ },
+ "subject": {
+ "description": "验证主体,通常为手机号、用户ID或登录账号",
+ "type": "string"
+ },
+ "challengeId": {
+ "description": "验证挑战ID,由验证挑战接口返回",
+ "type": "string"
+ },
+ "providerCode": {
+ "type": "string",
+ "description": "验证服务,tianai 或 ruoyi_image"
+ },
+ "captchaType": {
+ "type": "string",
+ "description": "SLIDER/ROTATE/CONCAT/WORD_IMAGE_CLICK/math/char"
+ },
+ "payload": {
+ "description": "验证结果载荷。天爱行为验证码提交 payload.track;系统图形验证码提交 payload.uuid 和 payload.code",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TianaiVerificationPayload"
+ },
+ {
+ "$ref": "#/components/schemas/SystemImageVerificationPayload"
+ }
+ ]
+ }
+ }
+ },
+ "TianaiVerificationPayload": {
+ "type": "object",
+ "required": [
+ "track"
+ ],
+ "properties": {
+ "track": {
+ "$ref": "#/components/schemas/TianaiCaptchaTrack"
+ }
+ }
+ },
+ "TianaiCaptchaTrack": {
+ "type": "object",
+ "required": [
+ "bgImageWidth",
+ "bgImageHeight",
+ "startTime",
+ "stopTime",
+ "trackList"
+ ],
+ "properties": {
+ "bgImageWidth": {
+ "type": "integer",
+ "description": "验证码背景图片在前端实际显示的宽度,单位像素"
+ },
+ "bgImageHeight": {
+ "type": "integer",
+ "description": "验证码背景图片在前端实际显示的高度,单位像素"
+ },
+ "templateImageWidth": {
+ "type": "integer",
+ "description": "滑块或旋转模板图片在前端实际显示的宽度,单位像素"
+ },
+ "templateImageHeight": {
+ "type": "integer",
+ "description": "滑块或旋转模板图片在前端实际显示的高度,单位像素"
+ },
+ "startTime": {
+ "type": "integer",
+ "format": "int64",
+ "description": "用户开始操作的时间戳,单位毫秒"
+ },
+ "stopTime": {
+ "type": "integer",
+ "format": "int64",
+ "description": "用户结束操作的时间戳,单位毫秒"
+ },
+ "left": {
+ "type": "integer",
+ "description": "滑块最终水平偏移量,单位像素;由天爱前端控件生成"
+ },
+ "top": {
+ "type": "integer",
+ "description": "点选或模板最终垂直偏移量,单位像素;由天爱前端控件生成"
+ },
+ "trackList": {
+ "type": "array",
+ "minItems": 1,
+ "description": "用户操作轨迹,不能为空,必须直接使用天爱前端控件产生的数据",
+ "items": {
+ "$ref": "#/components/schemas/TianaiCaptchaTrackPoint"
+ }
+ },
+ "data": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "不同验证码类型附带的扩展数据,由天爱前端控件原样提交",
+ "properties": {},
+ "nullable": true
+ }
+ }
+ },
+ "TianaiCaptchaTrackPoint": {
+ "type": "object",
+ "required": [
+ "x",
+ "y",
+ "t",
+ "type"
+ ],
+ "properties": {
+ "x": {
+ "type": "number",
+ "format": "float",
+ "description": "当前轨迹点的水平坐标"
+ },
+ "y": {
+ "type": "number",
+ "format": "float",
+ "description": "当前轨迹点的垂直坐标"
+ },
+ "t": {
+ "type": "number",
+ "format": "float",
+ "description": "当前轨迹点相对操作开始时的时间,单位毫秒"
+ },
+ "type": {
+ "type": "string",
+ "description": "轨迹事件类型,例如 down、move、up"
+ }
+ }
+ },
+ "SystemImageVerificationPayload": {
+ "type": "object",
+ "required": [
+ "uuid",
+ "code"
+ ],
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "系统图形验证码接口返回的唯一标识"
+ },
+ "code": {
+ "type": "string",
+ "description": "用户填写的图形验证码答案"
+ }
+ }
+ },
+ "RVoid": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "type": "null"
+ }
+ }
+ },
+ "RObject": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "type": "object",
+ "additionalProperties": true,
+ "properties": {}
+ }
+ }
+ },
+ "RList": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": true,
+ "properties": {}
+ }
+ }
+ }
+ },
+ "PageResult": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "type": "string",
+ "example": "操作成功"
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": true,
+ "properties": {}
+ }
+ },
+ "total": {
+ "type": "integer",
+ "example": 0
+ }
+ }
+ },
+ "RLogin": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "$ref": "#/components/schemas/LoginVo"
+ }
+ }
+ },
+ "LoginVo": {
+ "type": "object",
+ "properties": {
+ "token": {
+ "type": "string"
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "tokenValue": {
+ "type": "string"
+ },
+ "userId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "tenantId": {
+ "type": "string"
+ },
+ "clientId": {
+ "type": "string"
+ },
+ "clientKey": {
+ "type": "string"
+ }
+ }
+ },
+ "RFileUpload": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "$ref": "#/components/schemas/FileUploadVo"
+ }
+ }
+ },
+ "FileUploadVo": {
+ "type": "object",
+ "properties": {
+ "ossId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "url": {
+ "type": "string"
+ },
+ "thumbnailUrl": {
+ "type": "string",
+ "nullable": true
+ },
+ "fileName": {
+ "type": "string"
+ },
+ "originalName": {
+ "type": "string"
+ }
+ }
+ },
+ "RVoid1": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "type": "null"
+ }
+ }
+ },
+ "RObject2": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "type": "object",
+ "additionalProperties": true,
+ "properties": {}
+ }
+ }
+ },
+ "RList3": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": true,
+ "properties": {}
+ }
+ }
+ }
+ },
+ "PageResult4": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "rows": {
+ "description": "分页数据列表",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": true,
+ "properties": {}
+ }
+ },
+ "total": {
+ "type": "integer",
+ "example": 0
+ }
+ }
+ },
+ "RLogin5": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/LoginVo6"
+ }
+ }
+ },
+ "LoginVo6": {
+ "type": "object",
+ "properties": {
+ "token": {
+ "type": "string"
+ },
+ "accessToken": {
+ "type": "string"
+ },
+ "tokenValue": {
+ "type": "string"
+ },
+ "userId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "tenantId": {
+ "description": "租户ID,用于区分不同租户的数据和验证策略",
+ "type": "string"
+ },
+ "clientId": {
+ "description": "客户端ID,对应后台客户端管理中的APP/PC/小程序等终端",
+ "type": "string"
+ },
+ "clientKey": {
+ "type": "string"
+ }
+ }
+ },
+ "RFileUpload7": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/FileUploadVo8"
+ }
+ }
+ },
+ "FileUploadVo8": {
+ "type": "object",
+ "properties": {
+ "ossId": {
+ "description": "OSS文件ID,表单内部使用,用户侧应通过上传组件获取",
+ "type": "integer",
+ "format": "int64"
+ },
+ "url": {
+ "type": "string"
+ },
+ "thumbnailUrl": {
+ "type": "string",
+ "nullable": true
+ },
+ "fileName": {
+ "description": "原始文件名",
+ "type": "string"
+ },
+ "originalName": {
+ "type": "string"
+ }
+ }
+ },
+ "RVerificationRequire": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/VerificationRequireVo"
+ }
+ }
+ },
+ "VerificationRequireVo": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "description": "当前场景是否需要验证",
+ "type": "boolean"
+ },
+ "providerCode": {
+ "description": "第三方服务商编码",
+ "type": "string"
+ },
+ "captchaType": {
+ "description": "验证码类型,例如SLIDER、ROTATE、CONCAT、WORD_IMAGE_CLICK",
+ "type": "string"
+ },
+ "sceneCode": {
+ "description": "验证场景编码,例如APP_LOGIN、PC_LOGIN、APP_REGISTER",
+ "type": "string"
+ },
+ "ttlSeconds": {
+ "description": "验证或票据有效秒数",
+ "type": "integer"
+ }
+ },
+ "example": {
+ "required": true,
+ "providerCode": "tianai",
+ "captchaType": "SLIDER",
+ "sceneCode": "APP_LOGIN",
+ "ttlSeconds": 300
+ }
+ },
+ "RVerificationChallenge": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/VerificationChallengeVo"
+ }
+ }
+ },
+ "VerificationChallengeVo": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "description": "当前场景是否需要验证",
+ "type": "boolean"
+ },
+ "providerCode": {
+ "description": "第三方服务商编码",
+ "type": "string"
+ },
+ "captchaType": {
+ "description": "验证码类型,例如SLIDER、ROTATE、CONCAT、WORD_IMAGE_CLICK",
+ "type": "string"
+ },
+ "challengeId": {
+ "description": "验证挑战ID,由验证挑战接口返回",
+ "type": "string"
+ },
+ "uuid": {
+ "type": "string",
+ "description": "系统图形验证码 uuid"
+ },
+ "img": {
+ "type": "string",
+ "description": "系统图形验证码 base64 图片"
+ },
+ "payload": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "天爱验证码数据,包括背景图、模板图、尺寸等",
+ "properties": {}
+ },
+ "expireSeconds": {
+ "description": "验证挑战过期秒数",
+ "type": "integer"
+ }
+ },
+ "example": {
+ "required": true,
+ "providerCode": "tianai",
+ "captchaType": "SLIDER",
+ "challengeId": "CAPTCHA_CHALLENGE_ID",
+ "payload": {
+ "backgroundImage": "data:image/png;base64,...",
+ "templateImage": "data:image/png;base64,...",
+ "backgroundImageWidth": 340,
+ "backgroundImageHeight": 180
+ },
+ "expireSeconds": 300
+ }
+ },
+ "RVerificationCheck": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/VerificationCheckVo"
+ }
+ }
+ },
+ "VerificationCheckVo": {
+ "type": "object",
+ "properties": {
+ "passed": {
+ "description": "验证是否通过",
+ "type": "boolean"
+ },
+ "validToken": {
+ "type": "string",
+ "description": "验证通过后交给业务接口的票据"
+ },
+ "expireSeconds": {
+ "description": "验证挑战过期秒数",
+ "type": "integer"
+ },
+ "message": {
+ "description": "返回消息",
+ "type": "string"
+ }
+ },
+ "example": {
+ "passed": true,
+ "validToken": "captcha-ticket",
+ "expireSeconds": 300,
+ "message": "验证通过"
+ }
+ },
+ "RLegacyCaptcha": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/LegacyCaptchaVo"
+ }
+ }
+ },
+ "LegacyCaptchaVo": {
+ "type": "object",
+ "properties": {
+ "captchaEnabled": {
+ "type": "boolean"
+ },
+ "uuid": {
+ "description": "系统图形验证码UUID",
+ "type": "string"
+ },
+ "img": {
+ "type": "string",
+ "description": "base64 图形验证码"
+ }
+ },
+ "example": {
+ "captchaEnabled": true,
+ "uuid": "captcha-uuid",
+ "img": "data:image/png;base64,..."
+ }
+ },
+ "RVerificationRequire9": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/VerificationRequireVo10"
+ }
+ }
+ },
+ "VerificationRequireVo10": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "description": "当前场景是否需要验证",
+ "type": "boolean"
+ },
+ "providerCode": {
+ "description": "第三方服务商编码",
+ "type": "string"
+ },
+ "captchaType": {
+ "description": "验证码类型,例如SLIDER、ROTATE、CONCAT、WORD_IMAGE_CLICK",
+ "type": "string"
+ },
+ "sceneCode": {
+ "description": "验证场景编码,例如APP_LOGIN、PC_LOGIN、APP_REGISTER",
+ "type": "string"
+ },
+ "ttlSeconds": {
+ "description": "验证或票据有效秒数",
+ "type": "integer"
+ }
+ },
+ "example": {
+ "required": true,
+ "providerCode": "tianai",
+ "captchaType": "SLIDER",
+ "sceneCode": "WEB_H5_LOGIN",
+ "ttlSeconds": 300
+ }
+ },
+ "RVerificationChallenge11": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/VerificationChallengeVo12"
+ }
+ }
+ },
+ "VerificationChallengeVo12": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "description": "当前场景是否需要验证",
+ "type": "boolean"
+ },
+ "providerCode": {
+ "description": "第三方服务商编码",
+ "type": "string"
+ },
+ "captchaType": {
+ "description": "验证码类型,例如SLIDER、ROTATE、CONCAT、WORD_IMAGE_CLICK",
+ "type": "string"
+ },
+ "challengeId": {
+ "description": "验证挑战ID,由验证挑战接口返回",
+ "type": "string"
+ },
+ "uuid": {
+ "type": "string",
+ "description": "系统图形验证码 uuid"
+ },
+ "img": {
+ "type": "string",
+ "description": "系统图形验证码 base64 图片"
+ },
+ "payload": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "天爱验证码数据,包括背景图、模板图、尺寸等",
+ "properties": {}
+ },
+ "expireSeconds": {
+ "description": "验证挑战过期秒数",
+ "type": "integer"
+ }
+ },
+ "example": {
+ "required": true,
+ "providerCode": "tianai",
+ "captchaType": "SLIDER",
+ "challengeId": "CAPTCHA_CHALLENGE_ID",
+ "payload": {
+ "backgroundImage": "data:image/png;base64,...",
+ "templateImage": "data:image/png;base64,...",
+ "backgroundImageWidth": 340,
+ "backgroundImageHeight": 180
+ },
+ "expireSeconds": 300
+ }
+ },
+ "RVerificationCheck13": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/VerificationCheckVo14"
+ }
+ }
+ },
+ "VerificationCheckVo14": {
+ "type": "object",
+ "properties": {
+ "passed": {
+ "description": "验证是否通过",
+ "type": "boolean"
+ },
+ "validToken": {
+ "type": "string",
+ "description": "验证通过后交给业务接口的票据"
+ },
+ "expireSeconds": {
+ "description": "验证挑战过期秒数",
+ "type": "integer"
+ },
+ "message": {
+ "description": "返回消息",
+ "type": "string"
+ }
+ },
+ "example": {
+ "passed": true,
+ "validToken": "captcha-ticket",
+ "expireSeconds": 300,
+ "message": "验证通过"
+ }
+ },
+ "RLegacyCaptcha15": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "系统图形验证码或响应状态码",
+ "type": "integer",
+ "example": 200
+ },
+ "msg": {
+ "description": "响应消息",
+ "type": "string",
+ "example": "操作成功"
+ },
+ "data": {
+ "description": "响应数据主体",
+ "$ref": "#/components/schemas/LegacyCaptchaVo16"
+ }
+ }
+ },
+ "LegacyCaptchaVo16": {
+ "type": "object",
+ "properties": {
+ "captchaEnabled": {
+ "type": "boolean"
+ },
+ "uuid": {
+ "description": "系统图形验证码UUID",
+ "type": "string"
+ },
+ "img": {
+ "type": "string",
+ "description": "base64 图形验证码"
+ }
+ },
+ "example": {
+ "captchaEnabled": true,
+ "uuid": "captcha-uuid",
+ "img": "data:image/png;base64,..."
+ }
+ }
+ },
+ "responses": {
+ "VoidResult": {
+ "description": "通用成功响应",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RVoid1"
+ }
+ }
+ }
+ },
+ "ObjectResult": {
+ "description": "通用对象响应",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RObject2"
+ }
+ }
+ }
+ },
+ "ListResult": {
+ "description": "通用列表响应",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RList3"
+ }
+ }
+ }
+ },
+ "PageResult": {
+ "description": "通用分页响应",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/PageResult4"
+ }
+ }
+ }
+ },
+ "LoginResult": {
+ "description": "登录结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RLogin5"
+ }
+ }
+ }
+ },
+ "FileUploadResult": {
+ "description": "文件上传结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RFileUpload7"
+ }
+ }
+ }
+ },
+ "VerificationRequireResult": {
+ "description": "验证需求查询结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RVerificationRequire9"
+ }
+ }
+ }
+ },
+ "VerificationChallengeResult": {
+ "description": "验证挑战生成结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RVerificationChallenge11"
+ }
+ }
+ }
+ },
+ "VerificationCheckResult": {
+ "description": "验证校验结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RVerificationCheck13"
+ }
+ }
+ }
+ },
+ "LegacyCaptchaResult": {
+ "description": "兼容旧图形验证码结果",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RLegacyCaptcha15"
+ }
+ }
+ }
+ }
+ },
+ "securitySchemes": {
+ "SaToken1": {
+ "type": "apiKey",
+ "in": "header",
+ "name": "Authorization",
+ "description": "登录后返回的 token。若本地配置使用 sa-token 名称,请按项目实际 token-name 调整。"
+ }
+ }
+ },
+ "servers": [],
+ "security": [
+ {
+ "SaToken1": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app.html b/app.html
index 2ae45f6..b448289 100644
--- a/app.html
+++ b/app.html
@@ -147,7 +147,6 @@
-