api-docs.json 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  1. {
  2. "openapi": "3.0.0",
  3. "info": {
  4. "title": "飞鸟农业API文档",
  5. "version": "1.0.0",
  6. "description": "飞鸟农业平台后端API接口文档"
  7. },
  8. "servers": [
  9. {
  10. "url": "http://localhost:3000",
  11. "description": "开发环境"
  12. }
  13. ],
  14. "paths": {
  15. "/admin/articles": {
  16. "get": {
  17. "tags": [
  18. "Articles"
  19. ],
  20. "summary": "GetArticles",
  21. "description": "获取文章列表,支持分页和多条件筛选",
  22. "parameters": [
  23. {
  24. "name": "currentPage=1",
  25. "in": "query",
  26. "required": false,
  27. "schema": {
  28. "type": "number"
  29. },
  30. "description": "当前页码,默认为1"
  31. },
  32. {
  33. "name": "pageSize=10",
  34. "in": "query",
  35. "required": false,
  36. "schema": {
  37. "type": "number"
  38. },
  39. "description": "每页显示数量,默认为10"
  40. },
  41. {
  42. "name": "title",
  43. "in": "query",
  44. "required": false,
  45. "schema": {
  46. "type": "string"
  47. },
  48. "description": "标题搜索关键词(模糊匹配)"
  49. },
  50. {
  51. "name": "cropIds",
  52. "in": "query",
  53. "required": false,
  54. "schema": {
  55. "type": "string|array"
  56. },
  57. "description": "作物筛选ID,支持逗号分隔的多个ID或数组形式"
  58. },
  59. {
  60. "name": "categoryId",
  61. "in": "query",
  62. "required": false,
  63. "schema": {
  64. "type": "number"
  65. },
  66. "description": "用户分类ID,根据用户传递的category参数值进行精确匹配"
  67. },
  68. {
  69. "name": "isRecommended",
  70. "in": "query",
  71. "required": false,
  72. "schema": {
  73. "type": "number"
  74. },
  75. "description": "推荐筛选,0-非推荐文章,1-推荐文章"
  76. }
  77. ],
  78. "responses": {
  79. "200": {
  80. "description": "成功响应",
  81. "content": {
  82. "application/json": {
  83. "schema": {
  84. "$ref": "#/components/schemas/ApiResponse"
  85. }
  86. }
  87. }
  88. },
  89. "400": {
  90. "description": "请求参数错误",
  91. "content": {
  92. "application/json": {
  93. "schema": {
  94. "$ref": "#/components/schemas/ApiResponse"
  95. }
  96. }
  97. }
  98. },
  99. "404": {
  100. "description": "资源未找到",
  101. "content": {
  102. "application/json": {
  103. "schema": {
  104. "$ref": "#/components/schemas/ApiResponse"
  105. }
  106. }
  107. }
  108. },
  109. "500": {
  110. "description": "服务器内部错误",
  111. "content": {
  112. "application/json": {
  113. "schema": {
  114. "$ref": "#/components/schemas/ApiResponse"
  115. }
  116. }
  117. }
  118. }
  119. }
  120. },
  121. "post": {
  122. "tags": [
  123. "Articles"
  124. ],
  125. "summary": "CreateArticle",
  126. "description": "创建新的文章,支持富文本内容和图片",
  127. "parameters": [
  128. {
  129. "name": "title",
  130. "in": "query",
  131. "required": true,
  132. "schema": {
  133. "type": "string"
  134. },
  135. "description": "文章标题(必填,1-500字符)"
  136. },
  137. {
  138. "name": "content",
  139. "in": "query",
  140. "required": true,
  141. "schema": {
  142. "type": "string"
  143. },
  144. "description": "文章内容(必填,富文本格式,最大5MB)"
  145. },
  146. {
  147. "name": "type",
  148. "in": "query",
  149. "required": false,
  150. "schema": {
  151. "type": "number"
  152. },
  153. "description": "文章类型"
  154. },
  155. {
  156. "name": "img",
  157. "in": "query",
  158. "required": false,
  159. "schema": {
  160. "type": "string"
  161. },
  162. "description": "文章图片URL"
  163. },
  164. {
  165. "name": "date",
  166. "in": "query",
  167. "required": false,
  168. "schema": {
  169. "type": "date"
  170. },
  171. "description": "文章发布日期"
  172. },
  173. {
  174. "name": "author",
  175. "in": "query",
  176. "required": false,
  177. "schema": {
  178. "type": "string"
  179. },
  180. "description": "作者"
  181. },
  182. {
  183. "name": "category",
  184. "in": "query",
  185. "required": false,
  186. "schema": {
  187. "type": "number"
  188. },
  189. "description": "用户分类ID(用户传递的参数)"
  190. },
  191. {
  192. "name": "crop",
  193. "in": "query",
  194. "required": false,
  195. "schema": {
  196. "type": "number"
  197. },
  198. "description": "作物分类ID"
  199. },
  200. {
  201. "name": "isRecommended=0",
  202. "in": "query",
  203. "required": false,
  204. "schema": {
  205. "type": "number"
  206. },
  207. "description": "是否推荐,0-不推荐,1-推荐"
  208. },
  209. {
  210. "name": "subtitle",
  211. "in": "query",
  212. "required": false,
  213. "schema": {
  214. "type": "string"
  215. },
  216. "description": "副标题(最大200字符)"
  217. },
  218. {
  219. "name": "seoKeyword",
  220. "in": "query",
  221. "required": false,
  222. "schema": {
  223. "type": "string"
  224. },
  225. "description": "SEO关键词"
  226. },
  227. {
  228. "name": "seoDescription",
  229. "in": "query",
  230. "required": false,
  231. "schema": {
  232. "type": "string"
  233. },
  234. "description": "SEO描述"
  235. }
  236. ],
  237. "responses": {
  238. "200": {
  239. "description": "成功响应",
  240. "content": {
  241. "application/json": {
  242. "schema": {
  243. "$ref": "#/components/schemas/ApiResponse"
  244. }
  245. }
  246. }
  247. },
  248. "400": {
  249. "description": "请求参数错误",
  250. "content": {
  251. "application/json": {
  252. "schema": {
  253. "$ref": "#/components/schemas/ApiResponse"
  254. }
  255. }
  256. }
  257. },
  258. "404": {
  259. "description": "资源未找到",
  260. "content": {
  261. "application/json": {
  262. "schema": {
  263. "$ref": "#/components/schemas/ApiResponse"
  264. }
  265. }
  266. }
  267. },
  268. "500": {
  269. "description": "服务器内部错误",
  270. "content": {
  271. "application/json": {
  272. "schema": {
  273. "$ref": "#/components/schemas/ApiResponse"
  274. }
  275. }
  276. }
  277. }
  278. },
  279. "requestBody": {
  280. "required": true,
  281. "content": {
  282. "application/json": {
  283. "schema": {
  284. "$ref": "#/components/schemas/Article"
  285. }
  286. }
  287. }
  288. }
  289. }
  290. },
  291. "/admin/articles/:id": {
  292. "get": {
  293. "tags": [
  294. "Articles"
  295. ],
  296. "summary": "GetArticleById",
  297. "description": "根据文章ID获取文章详细信息",
  298. "parameters": [
  299. {
  300. "name": "id",
  301. "in": "query",
  302. "required": true,
  303. "schema": {
  304. "type": "number"
  305. },
  306. "description": "文章ID(路径参数)"
  307. }
  308. ],
  309. "responses": {
  310. "200": {
  311. "description": "成功响应",
  312. "content": {
  313. "application/json": {
  314. "schema": {
  315. "$ref": "#/components/schemas/ApiResponse"
  316. }
  317. }
  318. }
  319. },
  320. "400": {
  321. "description": "请求参数错误",
  322. "content": {
  323. "application/json": {
  324. "schema": {
  325. "$ref": "#/components/schemas/ApiResponse"
  326. }
  327. }
  328. }
  329. },
  330. "404": {
  331. "description": "资源未找到",
  332. "content": {
  333. "application/json": {
  334. "schema": {
  335. "$ref": "#/components/schemas/ApiResponse"
  336. }
  337. }
  338. }
  339. },
  340. "500": {
  341. "description": "服务器内部错误",
  342. "content": {
  343. "application/json": {
  344. "schema": {
  345. "$ref": "#/components/schemas/ApiResponse"
  346. }
  347. }
  348. }
  349. }
  350. }
  351. },
  352. "delete": {
  353. "tags": [
  354. "Articles"
  355. ],
  356. "summary": "DeleteArticle",
  357. "description": "根据文章ID删除文章",
  358. "parameters": [
  359. {
  360. "name": "id",
  361. "in": "query",
  362. "required": true,
  363. "schema": {
  364. "type": "number"
  365. },
  366. "description": "文章ID(路径参数)"
  367. }
  368. ],
  369. "responses": {
  370. "200": {
  371. "description": "成功响应",
  372. "content": {
  373. "application/json": {
  374. "schema": {
  375. "$ref": "#/components/schemas/ApiResponse"
  376. }
  377. }
  378. }
  379. },
  380. "400": {
  381. "description": "请求参数错误",
  382. "content": {
  383. "application/json": {
  384. "schema": {
  385. "$ref": "#/components/schemas/ApiResponse"
  386. }
  387. }
  388. }
  389. },
  390. "404": {
  391. "description": "资源未找到",
  392. "content": {
  393. "application/json": {
  394. "schema": {
  395. "$ref": "#/components/schemas/ApiResponse"
  396. }
  397. }
  398. }
  399. },
  400. "500": {
  401. "description": "服务器内部错误",
  402. "content": {
  403. "application/json": {
  404. "schema": {
  405. "$ref": "#/components/schemas/ApiResponse"
  406. }
  407. }
  408. }
  409. }
  410. }
  411. },
  412. "put": {
  413. "tags": [
  414. "Articles"
  415. ],
  416. "summary": "UpdateArticle",
  417. "description": "根据文章ID更新文章信息",
  418. "parameters": [
  419. {
  420. "name": "id",
  421. "in": "query",
  422. "required": true,
  423. "schema": {
  424. "type": "number"
  425. },
  426. "description": "文章ID(路径参数)"
  427. },
  428. {
  429. "name": "title",
  430. "in": "query",
  431. "required": false,
  432. "schema": {
  433. "type": "string"
  434. },
  435. "description": "文章标题(1-500字符)"
  436. },
  437. {
  438. "name": "content",
  439. "in": "query",
  440. "required": false,
  441. "schema": {
  442. "type": "string"
  443. },
  444. "description": "文章内容(富文本格式,最大5MB)"
  445. },
  446. {
  447. "name": "type",
  448. "in": "query",
  449. "required": false,
  450. "schema": {
  451. "type": "number"
  452. },
  453. "description": "文章类型"
  454. },
  455. {
  456. "name": "img",
  457. "in": "query",
  458. "required": false,
  459. "schema": {
  460. "type": "string"
  461. },
  462. "description": "文章图片URL"
  463. },
  464. {
  465. "name": "date",
  466. "in": "query",
  467. "required": false,
  468. "schema": {
  469. "type": "date"
  470. },
  471. "description": "文章发布日期"
  472. },
  473. {
  474. "name": "author",
  475. "in": "query",
  476. "required": false,
  477. "schema": {
  478. "type": "string"
  479. },
  480. "description": "作者"
  481. },
  482. {
  483. "name": "category",
  484. "in": "query",
  485. "required": false,
  486. "schema": {
  487. "type": "number"
  488. },
  489. "description": "用户分类ID"
  490. },
  491. {
  492. "name": "crop",
  493. "in": "query",
  494. "required": false,
  495. "schema": {
  496. "type": "number"
  497. },
  498. "description": "作物分类ID"
  499. },
  500. {
  501. "name": "isRecommended",
  502. "in": "query",
  503. "required": false,
  504. "schema": {
  505. "type": "number"
  506. },
  507. "description": "是否推荐,0-不推荐,1-推荐"
  508. },
  509. {
  510. "name": "subtitle",
  511. "in": "query",
  512. "required": false,
  513. "schema": {
  514. "type": "string"
  515. },
  516. "description": "副标题(最大200字符)"
  517. },
  518. {
  519. "name": "seoKeyword",
  520. "in": "query",
  521. "required": false,
  522. "schema": {
  523. "type": "string"
  524. },
  525. "description": "SEO关键词"
  526. },
  527. {
  528. "name": "seoDescription",
  529. "in": "query",
  530. "required": false,
  531. "schema": {
  532. "type": "string"
  533. },
  534. "description": "SEO描述"
  535. }
  536. ],
  537. "responses": {
  538. "200": {
  539. "description": "成功响应",
  540. "content": {
  541. "application/json": {
  542. "schema": {
  543. "$ref": "#/components/schemas/ApiResponse"
  544. }
  545. }
  546. }
  547. },
  548. "400": {
  549. "description": "请求参数错误",
  550. "content": {
  551. "application/json": {
  552. "schema": {
  553. "$ref": "#/components/schemas/ApiResponse"
  554. }
  555. }
  556. }
  557. },
  558. "404": {
  559. "description": "资源未找到",
  560. "content": {
  561. "application/json": {
  562. "schema": {
  563. "$ref": "#/components/schemas/ApiResponse"
  564. }
  565. }
  566. }
  567. },
  568. "500": {
  569. "description": "服务器内部错误",
  570. "content": {
  571. "application/json": {
  572. "schema": {
  573. "$ref": "#/components/schemas/ApiResponse"
  574. }
  575. }
  576. }
  577. }
  578. },
  579. "requestBody": {
  580. "required": true,
  581. "content": {
  582. "application/json": {
  583. "schema": {
  584. "$ref": "#/components/schemas/Article"
  585. }
  586. }
  587. }
  588. }
  589. }
  590. }
  591. },
  592. "components": {
  593. "schemas": {
  594. "Article": {
  595. "type": "object",
  596. "properties": {
  597. "id": {
  598. "type": "integer",
  599. "description": "文章ID"
  600. },
  601. "title": {
  602. "type": "string",
  603. "description": "文章标题"
  604. },
  605. "subtitle": {
  606. "type": "string",
  607. "description": "文章副标题"
  608. },
  609. "content": {
  610. "type": "string",
  611. "description": "文章内容"
  612. },
  613. "type": {
  614. "type": "integer",
  615. "description": "文章类型"
  616. },
  617. "img": {
  618. "type": "string",
  619. "description": "文章图片URL"
  620. },
  621. "date": {
  622. "type": "string",
  623. "format": "date-time",
  624. "description": "文章日期"
  625. },
  626. "author": {
  627. "type": "string",
  628. "description": "作者"
  629. },
  630. "category": {
  631. "type": "integer",
  632. "description": "用户分类ID"
  633. },
  634. "crop": {
  635. "type": "integer",
  636. "description": "作物分类ID"
  637. },
  638. "isRecommended": {
  639. "type": "integer",
  640. "enum": [
  641. 0,
  642. 1
  643. ],
  644. "description": "是否推荐"
  645. },
  646. "seoKeyword": {
  647. "type": "string",
  648. "description": "SEO关键词"
  649. },
  650. "seoDescription": {
  651. "type": "string",
  652. "description": "SEO描述"
  653. },
  654. "createdAt": {
  655. "type": "string",
  656. "format": "date-time",
  657. "description": "创建时间"
  658. },
  659. "updatedAt": {
  660. "type": "string",
  661. "format": "date-time",
  662. "description": "更新时间"
  663. },
  664. "cropInfo": {
  665. "type": "object",
  666. "properties": {
  667. "id": {
  668. "type": "integer",
  669. "description": "作物ID"
  670. },
  671. "name": {
  672. "type": "string",
  673. "description": "作物名称"
  674. },
  675. "level": {
  676. "type": "integer",
  677. "description": "作物层级"
  678. },
  679. "parentId": {
  680. "type": "integer",
  681. "description": "父级作物ID"
  682. }
  683. }
  684. }
  685. }
  686. },
  687. "ApiResponse": {
  688. "type": "object",
  689. "properties": {
  690. "status": {
  691. "type": "boolean",
  692. "description": "请求状态"
  693. },
  694. "message": {
  695. "type": "string",
  696. "description": "响应消息"
  697. },
  698. "data": {
  699. "type": "object",
  700. "description": "响应数据"
  701. },
  702. "errors": {
  703. "type": "array",
  704. "items": {
  705. "type": "string"
  706. },
  707. "description": "错误信息"
  708. }
  709. }
  710. }
  711. }
  712. }
  713. }