saved_resource.html 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>开放平台总体设计文档</title>
  7. <style>
  8. body {
  9. font-family: Arial, sans-serif;
  10. line-height: 1.6;
  11. margin: 20px;
  12. }
  13. h1, h2, h3, h4, h5, h6 {
  14. color: #2c3e50;
  15. }
  16. table {
  17. width: 100%;
  18. border-collapse: collapse;
  19. margin-bottom: 20px;
  20. }
  21. table, th, td {
  22. border: 1px solid #ddd;
  23. }
  24. th, td {
  25. padding: 8px;
  26. text-align: left;
  27. }
  28. th {
  29. background-color: #f2f2f2;
  30. }
  31. code {
  32. background-color: #f4f4f4;
  33. padding: 2px 4px;
  34. border-radius: 4px;
  35. }
  36. pre {
  37. background-color: #f4f4f4;
  38. padding: 10px;
  39. border-radius: 4px;
  40. overflow-x: auto;
  41. }
  42. </style>
  43. </head>
  44. <body>
  45. <h1>开放平台总体设计文档</h1>
  46. <h2>概述</h2>
  47. <h3>背景</h3>
  48. <p>在富士行云V2平台中,将有很多的车场,人行项目接入。为了方便车场,人行项目运营方可以在他们自己已有的平台,或者其他第三方平台对接我们的数据,并提供数据服务。</p>
  49. <h3>目标</h3>
  50. <p>为了实现开放平台的功能,我们需要设计一个开放平台的总体设计文档,包括功能模块、系统架构、数据库设计、接口设计、安全设计、流量监控与分析等。</p>
  51. <h3>范围</h3>
  52. <p>本文档仅涉及开放平台的总体设计,不涉及具体的功能模块设计。</p>
  53. <h2>总体设计</h2>
  54. <h3>系统架构</h3>
  55. <p>系统依赖富士行云V2整体的spring cloud微服务架构。通过gateway在新的路径前缀下路由到开放平台,在通过openfeign、nacos、 load_balance 等组件实现服务间的调用。</p>
  56. <p>具体实现就利用我们现有的中台服务(transferService). 在中台服务上面去建立一个新的目录(openapi),在openapi目录下建立应用管理、接口管理、开发接口三个模块。</p>
  57. <h3>功能模块</h3>
  58. <h4>开放平台用户管理</h4>
  59. <h4>开放平台应用管理</h4>
  60. <p>开放平台应用管理模块负责对接车场、人行项目的应用,包括应用的注册、认证、授权、管理等。</p>
  61. <h5>新增应用</h5>
  62. <p>在系统添加一个应用,用于对接车场,人行项目的开放接口。</p>
  63. <p>需要输入应用名称、服务行业、应用描述、应用logo、用户名(负责人)、手机号码。</p>
  64. <p>具体参数表格如下:</p>
  65. <table>
  66. <thead>
  67. <tr>
  68. <th>字段名</th>
  69. <th>参数名称</th>
  70. <th>类型</th>
  71. <th>说明</th>
  72. <th>是否必填</th>
  73. </tr>
  74. </thead>
  75. <tbody>
  76. <tr>
  77. <td>name</td>
  78. <td>应用名称</td>
  79. <td>字符串</td>
  80. <td>应用名称</td>
  81. <td>是</td>
  82. </tr>
  83. <tr>
  84. <td>serviceType</td>
  85. <td>服务行业</td>
  86. <td>字符串</td>
  87. <td>服务行业</td>
  88. <td>是</td>
  89. </tr>
  90. <tr>
  91. <td>remark</td>
  92. <td>应用描述</td>
  93. <td>字符串</td>
  94. <td>应用描述</td>
  95. <td>否</td>
  96. </tr>
  97. <tr>
  98. <td>logo</td>
  99. <td>应用logo</td>
  100. <td>字符串</td>
  101. <td>应用logo 存oss key</td>
  102. <td>否</td>
  103. </tr>
  104. <tr>
  105. <td>userName</td>
  106. <td>用户名</td>
  107. <td>字符串</td>
  108. <td>负责人用户名</td>
  109. <td>是</td>
  110. </tr>
  111. <tr>
  112. <td>phoneNumber</td>
  113. <td>手机号码</td>
  114. <td>字符串</td>
  115. <td>负责人手机号码</td>
  116. <td>是</td>
  117. </tr>
  118. </tbody>
  119. </table>
  120. <p>接口地址:/openapi/app/add</p>
  121. <p>请求方式:POST</p>
  122. <p>请求参数:JSON格式</p>
  123. <pre><code>{
  124. "name": "车场应用",
  125. "serviceType": "车场",
  126. "remark": "车场应用",
  127. "logo": "osskey",
  128. "userName": "admin",
  129. "phoneNumber": "13800138000"
  130. }</code></pre>
  131. <p>响应参数:JSON格式</p>
  132. <p>响应示例:</p>
  133. <pre><code>{
  134. "code": 1000000,
  135. "msg": "操作成功",
  136. "data": {
  137. "id": 1,
  138. "name": "车场应用",
  139. "serviceType": "车场",
  140. "remark": "车场应用",
  141. "logo": "osskey",
  142. "userName": "admin",
  143. "phoneNumber": "13800138000",
  144. "createTime": "2021-01-01 00:00:00",
  145. "updateTime": "2021-01-01 00:00:00",
  146. "createUser": "admin",
  147. "updateUser": "admin",
  148. "expirationTime ": "2021-01-01 00:00:00",
  149. "status" : 1 // 0启用 1禁用
  150. }
  151. }</code></pre>
  152. <h5>绑定项目</h5>
  153. <p>新增的应用是没有绑定项目的,需要绑定项目才能使用接口。</p>
  154. <p>通过调用系统服务获取到项目列表,选择需要绑定的项目,点击绑定按钮。</p>
  155. <p>可以绑定多个项目</p>
  156. <p>接口地址:/openapi/app/bind/{1}</p>
  157. <p>请求方式:PUT</p>
  158. <p>请求参数:JSON格式</p>
  159. <p>body 体中参数</p>
  160. <pre><code>{
  161. "projectIds": [1,2,3]
  162. }</code></pre>
  163. <p>响应参数:JSON格式</p>
  164. <p>响应示例:</p>
  165. <pre><code>{
  166. "code": 1000000,
  167. "msg": "操作成功",
  168. "data": null
  169. }</code></pre>
  170. <h5>配置接口</h5>
  171. <p>新增的应用是没有配置接口的,需要配置授权了接口,才能访问到这些开放接口。</p>
  172. <p>通过接口关联查询得到接口列表,选择需要配置的接口,点击配置按钮。</p>
  173. <p>可以配置多个接口,可以选择全部配置、部分配置。</p>
  174. <p>接口地址:/openapi/app/config/{1}</p>
  175. <p>请求方式:PUT</p>
  176. <p>请求参数:JSON格式</p>
  177. <p>body 体中参数</p>
  178. <pre><code>{
  179. "interfaceIds": [1,2,3]
  180. }</code></pre>
  181. <p>响应参数:JSON格式</p>
  182. <p>响应示例:</p>
  183. <pre><code>{
  184. "code": 1000000,
  185. "msg": "操作成功",
  186. "data": null
  187. }</code></pre>
  188. <h5>修改有效期</h5>
  189. <p>应用的有效期是可以修改的,可以根据需要修改。</p>
  190. <p>应用有效期过了,则该应用不能通过开放接口访问</p>
  191. <p>接口有效期可以修改比当前有效期以前,也可以修改比当前有效期以后。</p>
  192. <p>如果有效期修改在当前时间以前,也是运行的,则等于直接失效了。</p>
  193. <p>接口地址:/openapi/app/expiration/{1}</p>
  194. <p>请求方式:PUT</p>
  195. <p>请求参数:JSON格式</p>
  196. <p>body 体中参数</p>
  197. <pre><code>{
  198. "expirationTime": "2021-01-01 00:00:00"
  199. }</code></pre>
  200. <p>响应参数:JSON格式</p>
  201. <p>响应示例:</p>
  202. <pre><code>{
  203. "code": 1000000,
  204. "msg": "操作成功",
  205. "data": null
  206. }</code></pre>
  207. <h5>禁用应用</h5>
  208. <p>平台新创建的应用一开始是禁用状态的。需要平台认为的开启才可以使用。</p>
  209. <p>平台也可以在之后禁用应用,禁用后该应用不能通过开放接口访问</p>
  210. <p>接口地址:/openapi/app/disable/{1}</p>
  211. <p>请求方式:PUT</p>
  212. <p>请求参数:路径参数</p>
  213. <p>响应参数:JSON格式</p>
  214. <p>响应示例:</p>
  215. <pre><code>{
  216. "code": 1000000,
  217. "msg": "操作成功",
  218. "data": null
  219. }</code></pre>
  220. <h5>启用应用</h5>
  221. <p>应用处于禁用状态时,需要平台认为的开启才可以使用。</p>
  222. <p>接口地址:/openapi/app/enable/{1}</p>
  223. <p>请求方式:PUT</p>
  224. <p>请求参数:路径参数</p>
  225. <p>响应参数:JSON格式</p>
  226. <p>响应示例:</p>
  227. <pre><code>{
  228. "code": 1000000,
  229. "msg": "操作成功",
  230. "data": null
  231. }</code></pre>
  232. <h5>删除应用</h5>
  233. <p>对于已经废弃的应用,平台可以通过接口删除</p>
  234. <p>接口地址:/openapi/app</p>
  235. <p>请求方式:DELETE</p>
  236. <p>请求参数:路径参数</p>
  237. <p>响应参数:JSON格式</p>
  238. <p>响应示例:</p>
  239. <pre><code>{
  240. "code": 1000000,
  241. "msg": "操作成功",
  242. "data": null
  243. }</code></pre>
  244. <h5>重置应用秘钥</h5>
  245. <p>新创建的应用的秘钥是随机生成的32位数字跟英文大写字母。</p>
  246. <p>如果用户签名秘钥存在泄露的情况,可以自己重置签名秘钥,平台也可以重置签名秘钥。</p>
  247. <p>重置的签名秘钥也是随机生成的。</p>
  248. <p>接口地址:/openapi/app/resetSignKey/{1}</p>
  249. <p>请求方式:PUT</p>
  250. <p>请求参数:路径参数</p>
  251. <p>响应参数:JSON格式</p>
  252. <p>响应示例:</p>
  253. <pre><code>{
  254. "code": 1000000,
  255. "msg": "操作成功",
  256. "data": null
  257. }</code></pre>
  258. <h5>重置签名密钥</h5>
  259. <p>应用的签名秘钥用户数据接口的参数加签用的。应用生成的时候,签名秘钥是随机生成的</p>
  260. <p>应用有效期过了,则该应用不能通过开放接口访问</p>
  261. <p>接口有效期可以修改比当前有效期以前,也可以修改比当前有效期以后。</p>
  262. <p>如果有效期修改在当前时间以前,也是运行的,则等于直接失效了。</p>
  263. <p>接口地址:/openapi/app/expiration/{1}</p>
  264. <p>请求方式:PUT</p>
  265. <p>请求参数:JSON格式</p>
  266. <p>body 体中参数</p>
  267. <pre><code>{
  268. "expirationTime": "2021-01-01 00:00:00"
  269. }</code></pre>
  270. <p>响应参数:JSON格式</p>
  271. <p>响应示例:</p>
  272. <pre><code>{
  273. "code": 1000000,
  274. "msg": "操作成功",
  275. "data": null
  276. }</code></pre>
  277. <h5>重置永久token</h5>
  278. <p>方便用户调试使用,设置了永久token。</p>
  279. <p>如果用户不需要永久token,可以重置永久token。</p>
  280. <p>接口地址:/openapi/app/resetToken/{1}</p>
  281. <p>请求方式:PUT</p>
  282. <p>请求参数:路径参数</p>
  283. <p>响应参数:JSON格式</p>
  284. <p>响应示例:</p>
  285. <pre><code>{
  286. "code": 1000000,
  287. "msg": "操作成功",
  288. "data": null
  289. }</code></pre>
  290. <h5>修改通知回调地址</h5>
  291. <p>对于一些下行的接口,或者推送的接口,需要应用配置下行的地址。</p>
  292. <p>回调的地址支持到端口后的特定前缀。例如:http://www.baidu.com/callback, 推送的消息会发送到http://www.baidu.com/callback/push/xxx</p>
  293. <p>新创建的应用的通知回调地址为空。没有配置的情况下,平台不会推送消息。</p>
  294. <p>平台对于每个应用只支持推送一个通知回调地址。</p>
  295. <p>接口地址:/openapi/app/callback/{1}</p>
  296. <p>请求方式:PUT</p>
  297. <p>请求参数:JSON格式</p>
  298. <p>body 体中参数</p>
  299. <pre><code>{
  300. "callbackAddress": "2021-01-01 00:00:00"
  301. }</code></pre>
  302. <p>响应参数:JSON格式</p>
  303. <p>响应示例:</p>
  304. <pre><code>{
  305. "code": 1000000,
  306. "msg": "操作成功",
  307. "data": null
  308. }</code></pre>
  309. <h5>查询详情</h5>
  310. <p>接口地址:/openapi/app/{1}</p>
  311. <p>请求方式:GET</p>
  312. <p>请求参数:路径参数</p>
  313. <p>响应参数:JSON格式</p>
  314. <p>响应示例:</p>
  315. <pre><code>{
  316. "code": 1000000,
  317. "msg": "操作成功",
  318. "data": {
  319. "id": 1,
  320. "name": "车场应用",
  321. "serviceType": "车场",
  322. "remark": "车场应用",
  323. "logo": "osskey",
  324. "userName": "admin",
  325. "phoneNumber": "13800138000",
  326. "createTime": "2021-01-01 00:00:00",
  327. "updateTime": "2021-01-01 00:00:00",
  328. "createUser": "admin",
  329. "updateUser": "admin",
  330. "expirationTime ": "2021-01-01 00:00:00",
  331. "status" : 1 // 0启用 1禁用
  332. }
  333. }</code></pre>
  334. <h5>查询应用列表(分页)</h5>
  335. <p>接口地址:/openapi/app/page</p>
  336. <p>请求方式:GET</p>
  337. <p>请求参数:分页参数</p>
  338. <table>
  339. <thead>
  340. <tr>
  341. <th>参数名</th>
  342. <th>类型</th>
  343. <th>说明</th>
  344. <th>是否必填</th>
  345. </tr>
  346. </thead>
  347. <tbody>
  348. <tr>
  349. <td>current</td>
  350. <td>int</td>
  351. <td>页码</td>
  352. <td>是</td>
  353. </tr>
  354. <tr>
  355. <td>size</td>
  356. <td>int</td>
  357. <td>每页条数</td>
  358. <td>是</td>
  359. </tr>
  360. <tr>
  361. <td>name</td>
  362. <td>string</td>
  363. <td>应用名称</td>
  364. <td>否</td>
  365. </tr>
  366. <tr>
  367. <td>serviceType</td>
  368. <td>string</td>
  369. <td>服务行业</td>
  370. <td>否</td>
  371. </tr>
  372. <tr>
  373. <td>status</td>
  374. <td>int</td>
  375. <td>状态</td>
  376. <td>否</td>
  377. </tr>
  378. <tr>
  379. <td>phoneNumber</td>
  380. <td>string</td>
  381. <td>手机号码</td>
  382. <td>否</td>
  383. </tr>
  384. </tbody>
  385. </table>
  386. <p>响应参数:JSON格式</p>
  387. <p>响应示例:</p>
  388. <pre><code>{
  389. "code": 1000000,
  390. "msg": "操作成功",
  391. "data": {
  392. "total": 10,
  393. "pages": 20,
  394. "current": 1,
  395. "size": 10,
  396. "records": [
  397. {
  398. "id": 1,
  399. "name": "车场应用",
  400. "serviceType": "车场",
  401. "remark": "车场应用",
  402. "logo": "osskey",
  403. "userName": "admin",
  404. "phoneNumber": "13800138000",
  405. "createTime": "2021-01-01 00:00:00",
  406. "updateTime": "2021-01-01 00:00:00",
  407. "createUser": "admin",
  408. "updateUser": "admin",
  409. "expirationTime ": "2021-01-01 00:00:00",
  410. "status" : 1 // 0启用 1禁用
  411. }
  412. ]
  413. }
  414. }</code></pre>
  415. <h4>开放平台接口管理</h4>
  416. <p>开放平台数据接口管理模块负责对接车场、人行项目的接口,包括接口的注册、认证、授权、管理等。我们将配置两类接口,一个是上行接口,一个是下行接口。</p>
  417. <h5>新增接口</h5>
  418. <p>开放平台对外提供的接口,包括车场、人行项目的接口。都是在这里添加。需要的参数有,接口名称,路径,请求方式,接口类型,版本,发布状态,接口展示文档,启用状态,访问限制次数。</p>
  419. <p>具体参数表格如下:</p>
  420. <table>
  421. <tr>
  422. <th>字段名</th>
  423. <th>参数名称</th>
  424. <th>类型</th>
  425. <th>说明</th>
  426. <th>是否必填</th>
  427. </tr>
  428. <tr>
  429. <td>name</td>
  430. <td>接口名称</td>
  431. <td>字符串</td>
  432. <td>接口名称</td>
  433. <td>是</td>
  434. </tr>
  435. <tr>
  436. <td>path</td>
  437. <td>路径</td>
  438. <td>字符串</td>
  439. <td>接口路径</td>
  440. <td>是</td>
  441. </tr>
  442. <tr>
  443. <td>method</td>
  444. <td>请求方式</td>
  445. <td>字符串</td>
  446. <td>请求方式 POST PUT GET DELETE</td>
  447. <td>是</td>
  448. </tr>
  449. <tr>
  450. <td>type</td>
  451. <td>接口类型</td>
  452. <td>int</td>
  453. <td>接口类型 0 上行 1 下行</td>
  454. <td>是</td>
  455. </tr>
  456. <tr>
  457. <td>serviceType</td>
  458. <td>业务类型</td>
  459. <td>int</td>
  460. <td>1 车位 2 支付 3 月卡 4 车场 5 优惠券</td>
  461. <td>是</td>
  462. </tr>
  463. <tr>
  464. <td>version</td>
  465. <td>版本</td>
  466. <td>字符串</td>
  467. <td>版本号 v1 v2 ...</td>
  468. <td>是</td>
  469. </tr>
  470. <tr>
  471. <td>status</td>
  472. <td>发布状态</td>
  473. <td>int</td>
  474. <td>发布状态 0 未发出 1 已发布</td>
  475. <td>是</td>
  476. </tr>
  477. <tr>
  478. <td>doc</td>
  479. <td>接口展示文档</td>
  480. <td>字符串</td>
  481. <td>接口展示文档 markdown格式</td>
  482. <td>否</td>
  483. </tr>
  484. <tr>
  485. <td>enable</td>
  486. <td>启用状态</td>
  487. <td>int</td>
  488. <td>启用状态 0 启用 1 禁用</td>
  489. <td>是</td>
  490. </tr>
  491. <tr>
  492. <td>limitCount</td>
  493. <td>访问限制次数</td>
  494. <td>int</td>
  495. <td>每秒访问限制次数</td>
  496. <td>否</td>
  497. </tr>
  498. </table>
  499. <p>接口地址:/openapi/interface/add</p>
  500. <p>请求方式:POST</p>
  501. <p>请求参数:JSON格式</p>
  502. <pre><code>{
  503. "name": "车场接口",
  504. "path": "/api/v1/car/parking",
  505. "method": "GET",
  506. "type": 0,
  507. "serviceType": 1,
  508. "version": "v1",
  509. "doc": "",
  510. "limitCount": 100
  511. }
  512. </code></pre>
  513. <p>响应参数:JSON格式</p>
  514. <pre><code>{
  515. "code": 1000000,
  516. "msg": "操作成功",
  517. "data": {
  518. "id": 1,
  519. "name": "车场接口",
  520. "path": "/api/v1/car/parking",
  521. "method": "GET",
  522. "type": 0,
  523. "serviceType": 1,
  524. "version": "v1",
  525. "status": 1,
  526. "doc": "",
  527. "enable": 1,
  528. "limitCount": 100,
  529. "createTime": "2021-01-01 00:00:00",
  530. "updateTime": "2021-01-01 00:00:00",
  531. "createUser": "admin",
  532. "updateUser": "admin"
  533. }
  534. }
  535. </code></pre>
  536. <h5>编辑接口</h5>
  537. <p>对于已经发布的接口,需要修改接口信息。可以修改的参数有接口名称、路径、请求方式、接口类型、版本、接口展示文档、访问限制次数。参考新增的表格。修改的时候传入参数如果没有修改,则不传。参数为空的时候等于不修改。</p>
  538. <p>接口地址:/openapi/interface/edit/{1}</p>
  539. <p>请求方式:PUT</p>
  540. <p>请求参数:JSON格式</p>
  541. <pre><code>{
  542. "name": "车场接口",
  543. "path": "/api/v1/car/parking",
  544. "method": "GET",
  545. "type": 0,
  546. "serviceType": 1,
  547. "version": "v1",
  548. "doc": "",
  549. "limitCount": 100
  550. }
  551. </code></pre>
  552. <p>响应参数:JSON格式</p>
  553. <pre><code>{
  554. "code": 1000000,
  555. "msg": "操作成功",
  556. "data": {
  557. "id": 1,
  558. "name": "车场接口",
  559. "path": "/api/v1/car/parking",
  560. "method": "GET",
  561. "type": 0,
  562. "serviceType": 1,
  563. "version": "v1",
  564. "status": 1,
  565. "doc": "",
  566. "enable": 1,
  567. "limitCount": 100,
  568. "createTime": "2021-01-01 00:00:00",
  569. "updateTime": "2021-01-01 00:00:00",
  570. "createUser": "admin",
  571. "updateUser": "admin"
  572. }
  573. }
  574. </code></pre>
  575. <h5>删除接口</h5>
  576. <p>对于已经废弃的接口,需要删除接口。或者批量删除接口。</p>
  577. <p>接口地址:/openapi/interface</p>
  578. <p>请求方式:DELETE</p>
  579. <p>请求参数:ids 多个用逗号隔开</p>
  580. <p>响应参数:JSON格式</p>
  581. <p>响应示例:</p>
  582. <pre><code>{
  583. "code": 1000000,
  584. "msg": "操作成功",
  585. "data": null
  586. }
  587. </code></pre>
  588. <h5>配置接口文档</h5>
  589. <p>接口中需要配置给开放平台展示的接口文档。需要markdown格式。管理员通过前端页面编辑接口文档。</p>
  590. <p>接口地址:/openapi/interface/doc/{1}</p>
  591. <p>请求方式:PUT</p>
  592. <p>请求参数:JSON格式</p>
  593. <pre><code>{
  594. "doc": "接口文档"
  595. }
  596. </code></pre>
  597. <p>响应参数:JSON格式</p>
  598. <pre><code>{
  599. "code": 1000000,
  600. "msg": "操作成功",
  601. "data": null
  602. }
  603. </code></pre>
  604. <h5>发布接口</h5>
  605. <p>对于已经配置的接口,需要发布接口。</p>
  606. <p>接口地址:/openapi/interface/publish/{1}</p>
  607. <p>请求方式:PUT</p>
  608. <p>请求参数:</p>
  609. <p>响应参数:JSON格式</p>
  610. <pre><code>{
  611. "code": 1000000,
  612. "msg": "操作成功",
  613. "data": null
  614. }
  615. </code></pre>
  616. <h5>禁用接口</h5>
  617. <p>对于已经发布的接口,可以通过页面禁用接口。</p>
  618. <p>接口地址:/openapi/interface/disable/{1}</p>
  619. <p>请求方式:PUT</p>
  620. <p>请求参数:</p>
  621. <p>响应参数:JSON格式</p>
  622. <pre><code>{
  623. "code": 1000000,
  624. "msg": "操作成功",
  625. "data": null
  626. }
  627. </code></pre>
  628. <h5>导入接口</h5>
  629. <p>可以通过excel导入其他环境已经配置好的接口。</p>
  630. <p>接口地址:/openapi/interface/import</p>
  631. <p>请求方式:POST</p>
  632. <p>请求参数:multipart_file //excel文件</p>
  633. <p>响应参数:JSON格式</p>
  634. <p>响应示例:</p>
  635. <pre><code>{
  636. "code": 1000000,
  637. "msg": "操作成功",
  638. "data": null
  639. }
  640. </code></pre>
  641. <h5>导出接口</h5>
  642. <p>可以导出当前环境的接口信息。</p>
  643. <p>接口地址:/openapi/interface/export</p>
  644. <p>请求方式:GET</p>
  645. <p>请求参数: json</p>
  646. <pre><code>{
  647. "ids" : "1,2,3" //多个接口id用逗号隔开。 不传则导出全部
  648. }
  649. </code></pre>
  650. <p>响应参数:JSON格式</p>
  651. <p>响应示例:</p>
  652. <pre><code>{
  653. "code": 1000000,
  654. "msg": "操作成功",
  655. "data": [
  656. {
  657. "id": 1,
  658. "name": "车场接口",
  659. "path": "/api/v1/car/parking",
  660. "method": "GET",
  661. "type": 0,
  662. "serviceType": 1,
  663. "version": "v1",
  664. "status": 1,
  665. "doc": "",
  666. "enable": 1,
  667. "limitCount": 100,
  668. "createTime": "2021-01-01 00:00:00",
  669. "updateTime": "2021-01-01 00:00:00",
  670. "createUser": "admin",
  671. "updateUser": "admin"
  672. }
  673. ]
  674. }
  675. </code></pre>
  676. <h5>查询详情</h5>
  677. <p>接口地址:/openapi/interface/{1}</p>
  678. <p>请求方式:GET</p>
  679. <p>请求参数:路径参数</p>
  680. <p>响应参数:JSON格式</p>
  681. <p>响应示例:</p>
  682. <pre><code>{
  683. "code": 1000000,
  684. "msg": "操作成功",
  685. "data": {
  686. "id": 1,
  687. "name": "车场接口",
  688. "path": "/api/v1/car/parking",
  689. "method": "GET",
  690. "type": 0,
  691. "serviceType": 1,
  692. "version": "v1",
  693. "status": 1,
  694. "doc": "",
  695. "enable": 1,
  696. "limitCount": 100,
  697. "createTime": "2021-01-01 00:00:00",
  698. "updateTime": "2021-01-01 00:00:00",
  699. "createUser": "admin",
  700. "updateUser": "admin"
  701. }
  702. }
  703. </code></pre>
  704. <h5>查询接口列表(分页)</h5>
  705. <p>接口地址:/openapi/interface/page</p>
  706. <p>请求方式:GET</p>
  707. <p>请求参数:分页参数</p>
  708. <table>
  709. <tr>
  710. <th>参数名</th>
  711. <th>类型</th>
  712. <th>说明</th>
  713. <th>是否必填</th>
  714. </tr>
  715. <tr>
  716. <td>current</td>
  717. <td>int</td>
  718. <td>页码</td>
  719. <td>是</td>
  720. </tr>
  721. <tr>
  722. <td>size</td>
  723. <td>int</td>
  724. <td>每页条数</td>
  725. <td>是</td>
  726. </tr>
  727. <tr>
  728. <td>name</td>
  729. <td>string</td>
  730. <td>应用名称</td>
  731. <td>否</td>
  732. </tr>
  733. <tr>
  734. <td>serviceType</td>
  735. <td>string</td>
  736. <td>服务行业</td>
  737. <td>否</td>
  738. </tr>
  739. <tr>
  740. <td>status</td>
  741. <td>int</td>
  742. <td>状态</td>
  743. <td>否</td>
  744. </tr>
  745. <tr>
  746. <td>path</td>
  747. <td>string</td>
  748. <td>访问路径</td>
  749. <td>否</td>
  750. </tr>
  751. </table>
  752. <p>响应参数:JSON格式</p>
  753. <p>响应示例:</p>
  754. <pre><code>{
  755. "code": 1000000,
  756. "msg": "操作成功",
  757. "data": {
  758. "total": 10,
  759. "pages": 20,
  760. "current": 1,
  761. "size": 10,
  762. "records": [
  763. {
  764. "id": 1,
  765. "name": "车场接口",
  766. "path": "/api/v1/car/parking",
  767. "method": "GET",
  768. "type": 0,
  769. "serviceType": 1,
  770. "version": "v1",
  771. "status": 1,
  772. "doc": "",
  773. "enable": 1,
  774. "limitCount": 100,
  775. "createTime": "2021-01-01 00:00:00",
  776. "updateTime": "2021-01-01 00:00:00",
  777. "createUser": "admin",
  778. "updateUser": "admin"
  779. }
  780. ]
  781. }
  782. }
  783. </code></pre>
  784. <h4>开放平台安全管理</h4>
  785. <p>开放平台安全校验模块负责对接车场、人行项目的安全校验,包括接口的安全校验、数据加密、数据权限校验、数据流量监控等。</p>
  786. <h5>token生成</h5>
  787. <ul>
  788. <li>开放平台对外提供的接口,都需要通过token进行访问。</li>
  789. <li>开放平台用户,需要通过appId, appSecret, timestamp, sign生成token。</li>
  790. <li>token具有有效期。有效期时长可以配置。默认为两天。</li>
  791. <li>token是采用jwt生成的。</li>
  792. <li>接口地址:/openapi/token/generate</li>
  793. <li>请求方式:POST</li>
  794. <li>请求参数:JSON格式</li>
  795. </ul>
  796. <pre><code>{
  797. "appId": "123456",
  798. "appSecret": "123456",
  799. "timestamp": 1610123456789,
  800. "sign": "123456"
  801. }
  802. </code></pre>
  803. <p>响应参数:JSON格式</p>
  804. <p>响应示例:</p>
  805. <pre><code>{
  806. "code": 1000000,
  807. "msg": "操作成功",
  808. "data": {
  809. "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
  810. }
  811. }
  812. </code></pre>
  813. <h5>token校验</h5>
  814. <ul>
  815. <li>开放平台对外提供的接口,都需要通过token进行访问。</li>
  816. <li>开放平台用户,需要通过token校验。</li>
  817. <li>通过jwt解析token。对比jwt中的body数据是否正确。并获取当前应用的一些权限。</li>
  818. </ul>
  819. <h5>签名方式</h5>
  820. <ul>
  821. <li>所有的接口按照接口都需要参数签名。</li>
  822. <li>对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。</li>
  823. <li>对于post, put请求,加密参数会在body中。</li>
  824. <li>对于get, delete请求,加密参数会在url中。</li>
  825. </ul>
  826. <h5>签名校验</h5>
  827. <ul>
  828. <li>所有的接口都需要校验签名。</li>
  829. <li>对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。</li>
  830. <li>对比签名是否正确。</li>
  831. </ul>
  832. <h5>接口权限校验</h5>
  833. <ul>
  834. <li>开放平台对外提供的接口,都需要进行权限校验。</li>
  835. <li>查看当前应用的接口绑定关系。</li>
  836. <li>根据当前应用的权限,判断当前接口是否有权限访问。</li>
  837. </ul>
  838. <h5>接口流量监控</h5>
  839. <ul>
  840. <li>开放平台对外提供的接口,都需要进行流量监控。</li>
  841. <li>每个接口都需要记录访问次数。按照秒,分,时,天,月,年进行统计。目前只统计当前值。就是当前秒,当前分,过时的就丢弃。</li>
  842. <li>对于接口都存在一个访问限制数。</li>
  843. <li>限制数目前设置的是当前秒的限制数。</li>
  844. <li>限制数达到后,接口会被禁用。</li>
  845. </ul>
  846. <h3>数据库设计</h3>
  847. <h4>应用管理表</h4>
  848. <table>
  849. <thead>
  850. <tr>
  851. <th>字段名</th>
  852. <th>参数名称</th>
  853. <th>类型</th>
  854. <th>能否为空</th>
  855. <th>说明</th>
  856. </tr>
  857. </thead>
  858. <tbody>
  859. <tr>
  860. <td>id</td>
  861. <td>主键</td>
  862. <td>int</td>
  863. <td>否</td>
  864. <td>应用id</td>
  865. </tr>
  866. <tr>
  867. <td>name</td>
  868. <td>应用名称</td>
  869. <td>varchar(16)</td>
  870. <td>否</td>
  871. <td>应用名称</td>
  872. </tr>
  873. <tr>
  874. <td>app_id</td>
  875. <td>应用id</td>
  876. <td>varchar(32)</td>
  877. <td>否</td>
  878. <td>应用id</td>
  879. </tr>
  880. <tr>
  881. <td>app_secret</td>
  882. <td>应用密钥</td>
  883. <td>varchar(32)</td>
  884. <td>否</td>
  885. <td>应用密钥</td>
  886. </tr>
  887. <tr>
  888. <td>status</td>
  889. <td>应用状态</td>
  890. <td>int</td>
  891. <td>否</td>
  892. <td>应用状态 0 禁用 1 启用</td>
  893. </tr>
  894. <tr>
  895. <td>create_time</td>
  896. <td>创建时间</td>
  897. <td>datetime</td>
  898. <td>否</td>
  899. <td>创建时间</td>
  900. </tr>
  901. <tr>
  902. <td>update_time</td>
  903. <td>更新时间</td>
  904. <td>datetime</td>
  905. <td>是</td>
  906. <td>更新时间</td>
  907. </tr>
  908. <tr>
  909. <td>create_user</td>
  910. <td>创建人</td>
  911. <td>varchar(16)</td>
  912. <td>否</td>
  913. <td>创建人</td>
  914. </tr>
  915. <tr>
  916. <td>update_user</td>
  917. <td>更新人</td>
  918. <td>varchar(16)</td>
  919. <td>是</td>
  920. <td>更新人</td>
  921. </tr>
  922. <tr>
  923. <td>expiration_time</td>
  924. <td>过期时间</td>
  925. <td>datetime</td>
  926. <td>否</td>
  927. <td>过期时间</td>
  928. </tr>
  929. <tr>
  930. <td>is_delete</td>
  931. <td>是否已删除</td>
  932. <td>int</td>
  933. <td>否</td>
  934. <td>0 正常 1 已删除</td>
  935. </tr>
  936. <tr>
  937. <td>remark</td>
  938. <td>备注</td>
  939. <td>varchar(255)</td>
  940. <td>是</td>
  941. <td>备注</td>
  942. </tr>
  943. </tbody>
  944. </table>
  945. <h4>应用项目关联表</h4>
  946. <table>
  947. <thead>
  948. <tr>
  949. <th>字段名</th>
  950. <th>参数名称</th>
  951. <th>类型</th>
  952. <th>能否为空</th>
  953. <th>说明</th>
  954. </tr>
  955. </thead>
  956. <tbody>
  957. <tr>
  958. <td>id</td>
  959. <td>主键</td>
  960. <td>int</td>
  961. <td>否</td>
  962. <td>主键</td>
  963. </tr>
  964. <tr>
  965. <td>app_id</td>
  966. <td>应用id</td>
  967. <td>varchar(32)</td>
  968. <td>否</td>
  969. <td>应用id 应用表的主键</td>
  970. </tr>
  971. <tr>
  972. <td>project_id</td>
  973. <td>项目id</td>
  974. <td>int</td>
  975. <td>否</td>
  976. <td>项目id 对应项目表的主键</td>
  977. </tr>
  978. </tbody>
  979. </table>
  980. <h4>接口管理表</h4>
  981. <table>
  982. <thead>
  983. <tr>
  984. <th>字段名</th>
  985. <th>参数名称</th>
  986. <th>类型</th>
  987. <th>能否为空</th>
  988. <th>说明</th>
  989. </tr>
  990. </thead>
  991. <tbody>
  992. <tr>
  993. <td>id</td>
  994. <td>主键</td>
  995. <td>int</td>
  996. <td>否</td>
  997. <td>接口id</td>
  998. </tr>
  999. <tr>
  1000. <td>name</td>
  1001. <td>接口名称</td>
  1002. <td>varchar(16)</td>
  1003. <td>否</td>
  1004. <td>接口名称</td>
  1005. </tr>
  1006. <tr>
  1007. <td>path</td>
  1008. <td>接口路径</td>
  1009. <td>varchar(128)</td>
  1010. <td>否</td>
  1011. <td>接口路径</td>
  1012. </tr>
  1013. <tr>
  1014. <td>method</td>
  1015. <td>请求方式</td>
  1016. <td>varchar(16)</td>
  1017. <td>否</td>
  1018. <td>请求方式</td>
  1019. </tr>
  1020. <tr>
  1021. <td>type</td>
  1022. <td>接口类型</td>
  1023. <td>int</td>
  1024. <td>否</td>
  1025. <td>接口类型 0 上行 1下行</td>
  1026. </tr>
  1027. <tr>
  1028. <td>service_type</td>
  1029. <td>服务类型</td>
  1030. <td>int</td>
  1031. <td>否</td>
  1032. <td>1 车位 2 支付 3 月卡 4 车场 5 优惠券</td>
  1033. </tr>
  1034. <tr>
  1035. <td>version</td>
  1036. <td>版本号</td>
  1037. <td>varchar(16)</td>
  1038. <td>否</td>
  1039. <td>版本号 v1 v2</td>
  1040. </tr>
  1041. <tr>
  1042. <td>doc</td>
  1043. <td>接口文档</td>
  1044. <td>text</td>
  1045. <td>是</td>
  1046. <td>接口文档</td>
  1047. </tr>
  1048. <tr>
  1049. <td>status</td>
  1050. <td>接口状态</td>
  1051. <td>int</td>
  1052. <td>否</td>
  1053. <td>接口状态 0 禁用 1 启用</td>
  1054. </tr>
  1055. <tr>
  1056. <td>enable</td>
  1057. <td>是否启用</td>
  1058. <td>int</td>
  1059. <td>否</td>
  1060. <td>是否启用 0 禁用 1 启用</td>
  1061. </tr>
  1062. <tr>
  1063. <td>limit_count</td>
  1064. <td>限制次数</td>
  1065. <td>int</td>
  1066. <td>否</td>
  1067. <td>限制次数</td>
  1068. </tr>
  1069. <tr>
  1070. <td>create_time</td>
  1071. <td>创建时间</td>
  1072. <td>datetime</td>
  1073. <td>否</td>
  1074. <td>创建时间</td>
  1075. </tr>
  1076. <tr>
  1077. <td>update_time</td>
  1078. <td>更新时间</td>
  1079. <td>datetime</td>
  1080. <td>是</td>
  1081. <td>更新时间</td>
  1082. </tr>
  1083. <tr>
  1084. <td>create_user</td>
  1085. <td>创建人</td>
  1086. <td>varchar(16)</td>
  1087. <td>否</td>
  1088. <td>创建人</td>
  1089. </tr>
  1090. <tr>
  1091. <td>update_user</td>
  1092. <td>更新人</td>
  1093. <td>varchar(16)</td>
  1094. <td>是</td>
  1095. <td>更新人</td>
  1096. </tr>
  1097. <tr>
  1098. <td>is_delete</td>
  1099. <td>是否已删除</td>
  1100. <td>int</td>
  1101. <td>否</td>
  1102. <td>0 正常 1 已删除</td>
  1103. </tr>
  1104. <tr>
  1105. <td>remark</td>
  1106. <td>备注</td>
  1107. <td>varchar(255)</td>
  1108. <td>是</td>
  1109. <td>备注</td>
  1110. </tr>
  1111. </tbody>
  1112. </table>
  1113. <h4>应用接口授权关联表</h4>
  1114. <table>
  1115. <thead>
  1116. <tr>
  1117. <th>字段名</th>
  1118. <th>参数名称</th>
  1119. <th>类型</th>
  1120. <th>能否为空</th>
  1121. <th>说明</th>
  1122. </tr>
  1123. </thead>
  1124. <tbody>
  1125. <tr>
  1126. <td>id</td>
  1127. <td>主键</td>
  1128. <td>int</td>
  1129. <td>否</td>
  1130. <td>主键</td>
  1131. </tr>
  1132. <tr>
  1133. <td>app_id</td>
  1134. <td>应用id</td>
  1135. <td>varchar(32)</td>
  1136. <td>否</td>
  1137. <td>应用id 应用表的主键</td>
  1138. </tr>
  1139. <tr>
  1140. <td>interface_id</td>
  1141. <td>接口id</td>
  1142. <td>int</td>
  1143. <td>否</td>
  1144. <td>接口id 接口表的主键</td>
  1145. </tr>
  1146. </tbody>
  1147. </table>
  1148. <h4>安全管理redis数据结构设计</h4>
  1149. </body>
  1150. </html>