mock平台

plugin.js 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. let hooks, pluginModule;
  2. /**
  3. * type component 组件
  4. * listener 监听函数
  5. * mulit 是否绑定多个监听函数
  6. */
  7. hooks = {
  8. /**
  9. * 第三方登录 //可参考 yapi-plugin-qsso 插件
  10. */
  11. third_login: {
  12. type: 'component',
  13. mulit: false,
  14. listener: null
  15. },
  16. /**
  17. * 导入数据
  18. * @param Object importDataModule
  19. *
  20. * @info
  21. * 可参考 vendors/exts/yapi-plugin-import-swagger插件
  22. * importDataModule = {};
  23. */
  24. import_data: {
  25. type: 'listener',
  26. mulit: true,
  27. listener: []
  28. },
  29. /**
  30. * 导出数据
  31. * @param Object exportDataModule
  32. * @param projectId
  33. * @info
  34. * exportDataModule = {};
  35. * exportDataModule.pdf = {
  36. * name: 'Pdf',
  37. * route: '/api/plugin/export/pdf',
  38. * desc: '导出项目接口文档为 pdf 文件'
  39. * }
  40. */
  41. export_data: {
  42. type: 'listener',
  43. mulit: true,
  44. listener: []
  45. },
  46. /**
  47. * 接口页面 tab 钩子
  48. * @param InterfaceTabs
  49. *
  50. * @info
  51. * 可参考 vendors/exts/yapi-plugin-advanced-mock
  52. * let InterfaceTabs = {
  53. view: {
  54. component: View,
  55. name: '预览'
  56. },
  57. edit: {
  58. component: Edit,
  59. name: '编辑'
  60. },
  61. run: {
  62. component: Run,
  63. name: '运行'
  64. }
  65. }
  66. */
  67. interface_tab: {
  68. type: 'listener',
  69. mulit: true,
  70. listener: []
  71. },
  72. /**
  73. * header下拉菜单 menu 钩子
  74. * @param HeaderMenu
  75. *
  76. * @info
  77. * 可参考 vendors/exts/yapi-plugin-statistics
  78. * let HeaderMenu = {
  79. user: {
  80. path: '/user/profile',
  81. name: '个人中心',
  82. icon: 'user',
  83. adminFlag: false
  84. },
  85. star: {
  86. path: '/follow',
  87. name: '我的关注',
  88. icon: 'star-o',
  89. adminFlag: false
  90. },
  91. solution: {
  92. path: '/user/list',
  93. name: '用户管理',
  94. icon: 'solution',
  95. adminFlag: true
  96. },
  97. logout: {
  98. path: '',
  99. name: '退出',
  100. icon: 'logout',
  101. adminFlag: false
  102. }
  103. };
  104. */
  105. header_menu: {
  106. type: 'listener',
  107. mulit: true,
  108. listener: []
  109. },
  110. /**
  111. * Route路由列表钩子
  112. * @param AppRoute
  113. *
  114. * @info
  115. * 可参考 vendors/exts/yapi-plugin-statistics
  116. * 添加位置在Application.js 中
  117. * let AppRoute = {
  118. home: {
  119. path: '/',
  120. component: Home
  121. },
  122. group: {
  123. path: '/group',
  124. component: Group
  125. },
  126. project: {
  127. path: '/project/:id',
  128. component: Project
  129. },
  130. user: {
  131. path: '/user',
  132. component: User
  133. },
  134. follow: {
  135. path: '/follow',
  136. component: Follows
  137. },
  138. addProject: {
  139. path: '/add-project',
  140. component: AddProject
  141. },
  142. login: {
  143. path: '/login',
  144. component: Login
  145. }
  146. };
  147. };
  148. */
  149. app_route: {
  150. type: 'listener',
  151. mulit: true,
  152. listener: []
  153. },
  154. /*
  155. * 添加 reducer
  156. * @param Object reducerModules
  157. *
  158. * @info
  159. * importDataModule = {};
  160. */
  161. add_reducer: {
  162. type: 'listener',
  163. mulit: true,
  164. listener: []
  165. },
  166. /*
  167. * 添加 subnav 钩子
  168. * @param Object reducerModules
  169. *
  170. * let routers = {
  171. interface: { name: '接口', path: "/project/:id/interface/:action", component:Interface },
  172. activity: { name: '动态', path: "/project/:id/activity", component: Activity},
  173. data: { name: '数据管理', path: "/project/:id/data", component: ProjectData},
  174. members: { name: '成员管理', path: "/project/:id/members" , component: ProjectMember},
  175. setting: { name: '设置', path: "/project/:id/setting" , component: Setting}
  176. }
  177. */
  178. sub_nav: {
  179. type: 'listener',
  180. mulit: true,
  181. listener: []
  182. },
  183. /*
  184. * 添加项目设置 nav
  185. * @param Object routers
  186. *
  187. * let routers = {
  188. interface: { name: 'xxx', component: Xxx },
  189. }
  190. */
  191. sub_setting_nav:{
  192. type: 'listener',
  193. mulit: true,
  194. listener: []
  195. }
  196. };
  197. function bindHook(name, listener) {
  198. if (!name) {
  199. throw new Error('缺少hookname');
  200. }
  201. if (name in hooks === false) {
  202. throw new Error('不存在的hookname');
  203. }
  204. if (hooks[name].mulit === true) {
  205. hooks[name].listener.push(listener);
  206. } else {
  207. hooks[name].listener = listener;
  208. }
  209. }
  210. function emitHook(name, ...args) {
  211. if (!hooks[name]) {
  212. throw new Error('不存在的hook name');
  213. }
  214. let hook = hooks[name];
  215. if (hook.mulit === true && hook.type === 'listener') {
  216. if (Array.isArray(hook.listener)) {
  217. let promiseAll = [];
  218. hook.listener.forEach(item => {
  219. if (typeof item === 'function') {
  220. promiseAll.push(Promise.resolve(item.call(pluginModule, ...args)));
  221. }
  222. });
  223. return Promise.all(promiseAll);
  224. }
  225. } else if (hook.mulit === false && hook.type === 'listener') {
  226. if (typeof hook.listener === 'function') {
  227. return Promise.resolve(hook.listener.call(pluginModule, ...args));
  228. }
  229. } else if (hook.type === 'component') {
  230. return hook.listener;
  231. }
  232. }
  233. pluginModule = {
  234. hooks: hooks,
  235. bindHook: bindHook,
  236. emitHook: emitHook
  237. };
  238. let pluginModuleList;
  239. try {
  240. pluginModuleList = require('./plugin-module.js');
  241. } catch (err) {
  242. pluginModuleList = {};
  243. }
  244. Object.keys(pluginModuleList).forEach(plugin => {
  245. if (!pluginModuleList[plugin]) return null;
  246. if (pluginModuleList[plugin] && typeof pluginModuleList[plugin].module === 'function') {
  247. pluginModuleList[plugin].module.call(pluginModule, pluginModuleList[plugin].options);
  248. }
  249. });
  250. module.exports = pluginModule;