expressa 2.0.21 → 2.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/.circleci/config.yml +21 -21
  2. package/.eslintrc.json +29 -29
  3. package/.vscode/launch.json +19 -0
  4. package/LICENSE +21 -21
  5. package/README.md +137 -137
  6. package/auth/index.js +76 -76
  7. package/auth/jwt.js +31 -31
  8. package/controllers/collections.js +260 -260
  9. package/controllers/install.js +105 -105
  10. package/controllers/status.js +43 -43
  11. package/controllers/users.js +52 -52
  12. package/cypress/fixtures/example.json +4 -4
  13. package/cypress/integration/0_install_spec.js +8 -8
  14. package/cypress/integration/custom_collections.js +30 -30
  15. package/cypress/integration/home.js +9 -9
  16. package/cypress/integration/settings.js +34 -34
  17. package/cypress/integration/users.js +61 -61
  18. package/cypress/plugins/index.js +17 -17
  19. package/cypress/support/commands.js +69 -69
  20. package/cypress/support/index.js +20 -20
  21. package/cypress/support/util.js +10 -10
  22. package/cypress.config.js +18 -18
  23. package/cypress.json +4 -4
  24. package/db/cached.js +44 -40
  25. package/db/file.js +131 -112
  26. package/db/memory.js +92 -79
  27. package/db/mongo.js +93 -86
  28. package/db/postgres.js +100 -93
  29. package/doc/authentication.md +38 -38
  30. package/doc/automatic-fields.md +12 -12
  31. package/doc/blogexample.md +16 -16
  32. package/doc/custom-endpoints.md +20 -20
  33. package/doc/database.md +23 -23
  34. package/doc/development.md +33 -33
  35. package/doc/listeners.md +103 -103
  36. package/doc/modules.md +8 -8
  37. package/doc/permissions.md +14 -14
  38. package/doc/relationships.md +65 -65
  39. package/doc/testing.md +47 -47
  40. package/doc/uploading-files.md +53 -53
  41. package/index.js +297 -297
  42. package/listeners.js +65 -65
  43. package/listeners_collection_permissions.js +29 -29
  44. package/listeners_users.js +96 -96
  45. package/listeners_validation.js +43 -43
  46. package/middleware/logging.js +30 -30
  47. package/middleware/permissions.js +41 -41
  48. package/modules/access_keys/access_keys.js +32 -32
  49. package/modules/admin/.babelrc +8 -19
  50. package/modules/admin/.editorconfig +14 -14
  51. package/modules/admin/.eslintignore +5 -5
  52. package/modules/admin/.eslintrc.js +197 -197
  53. package/modules/admin/.postcssrc.js +10 -10
  54. package/modules/admin/.travis.yml +5 -5
  55. package/modules/admin/LICENSE +21 -21
  56. package/modules/admin/README.md +88 -88
  57. package/modules/admin/build/build.js +46 -46
  58. package/modules/admin/build/check-versions.js +64 -64
  59. package/modules/admin/build/utils.js +109 -109
  60. package/modules/admin/build/vue-loader.conf.js +5 -5
  61. package/modules/admin/build/webpack.base.conf.js +112 -112
  62. package/modules/admin/build/webpack.dev.conf.js +95 -95
  63. package/modules/admin/build/webpack.prod.conf.js +112 -112
  64. package/modules/admin/config/dev.env.js +8 -8
  65. package/modules/admin/config/index.js +86 -86
  66. package/modules/admin/config/prod.env.js +5 -5
  67. package/modules/admin/dist/css/{197.7a90435e.css → 197.e66ce8d8.css} +4 -4
  68. package/modules/admin/dist/css/197.e66ce8d8.css.gz +0 -0
  69. package/modules/admin/dist/css/{430.8c9b0482.css → 430.e83d8cfe.css} +4 -4
  70. package/modules/admin/dist/css/430.e83d8cfe.css.gz +0 -0
  71. package/modules/admin/dist/css/451.c6646d20.css.gz +0 -0
  72. package/modules/admin/dist/css/{566.7a90435e.css → 566.e66ce8d8.css} +4 -4
  73. package/modules/admin/dist/css/566.e66ce8d8.css.gz +0 -0
  74. package/modules/admin/dist/css/569.db9a10c2.css +213 -0
  75. package/modules/admin/dist/css/569.db9a10c2.css.gz +0 -0
  76. package/modules/admin/dist/css/572.513a323e.css +210 -0
  77. package/modules/admin/dist/css/572.513a323e.css.gz +0 -0
  78. package/modules/admin/dist/css/651.e946bda7.css.gz +0 -0
  79. package/modules/admin/dist/css/750.4086915d.css.gz +0 -0
  80. package/modules/admin/dist/css/950.1fd9d57c.css.gz +0 -0
  81. package/modules/admin/dist/css/{app.eba5f5e2.css → app.1c3232a3.css} +25 -25
  82. package/modules/admin/dist/css/app.1c3232a3.css.gz +0 -0
  83. package/modules/admin/dist/index.html +1 -1
  84. package/modules/admin/dist/static/js/197.36982650.js +1 -0
  85. package/modules/admin/dist/static/js/197.36982650.js.gz +0 -0
  86. package/modules/admin/dist/static/js/311.25e842dc.js +1 -0
  87. package/modules/admin/dist/static/js/311.25e842dc.js.gz +0 -0
  88. package/modules/admin/dist/static/js/430.53aea612.js +1 -0
  89. package/modules/admin/dist/static/js/430.53aea612.js.gz +0 -0
  90. package/modules/admin/dist/static/js/451.9f6dcdb1.js +1 -0
  91. package/modules/admin/dist/static/js/451.9f6dcdb1.js.gz +0 -0
  92. package/modules/admin/dist/static/js/460.351dad91.js +1 -0
  93. package/modules/admin/dist/static/js/460.351dad91.js.gz +0 -0
  94. package/modules/admin/dist/static/js/550.87e54b29.js +1 -0
  95. package/modules/admin/dist/static/js/550.87e54b29.js.gz +0 -0
  96. package/modules/admin/dist/static/js/569.52dba3a7.js +1 -0
  97. package/modules/admin/dist/static/js/569.52dba3a7.js.gz +0 -0
  98. package/modules/admin/dist/static/js/572.296cfd3b.js +1 -0
  99. package/modules/admin/dist/static/js/572.296cfd3b.js.gz +0 -0
  100. package/modules/admin/dist/static/js/603.98d5f5d9.js +1 -0
  101. package/modules/admin/dist/static/js/603.98d5f5d9.js.gz +0 -0
  102. package/modules/admin/dist/static/js/651.6dca6fbe.js +1 -0
  103. package/modules/admin/dist/static/js/651.6dca6fbe.js.gz +0 -0
  104. package/modules/admin/dist/static/js/653.0dff78dc.js +1 -0
  105. package/modules/admin/dist/static/js/653.0dff78dc.js.gz +0 -0
  106. package/modules/admin/dist/static/js/750.6877a6b8.js +1 -0
  107. package/modules/admin/dist/static/js/750.6877a6b8.js.gz +0 -0
  108. package/modules/admin/dist/static/js/950.4f40455a.js +1 -0
  109. package/modules/admin/dist/static/js/950.4f40455a.js.gz +0 -0
  110. package/modules/admin/dist/static/js/app.2dd732d9.js +2 -0
  111. package/modules/admin/dist/static/js/{app.083328f8.js.LICENSE.txt → app.2dd732d9.js.LICENSE.txt} +0 -2
  112. package/modules/admin/dist/static/js/app.2dd732d9.js.LICENSE.txt.gz +0 -0
  113. package/modules/admin/dist/static/js/app.2dd732d9.js.gz +0 -0
  114. package/modules/admin/index.html +16 -16
  115. package/modules/admin/package.json +101 -101
  116. package/modules/admin/src/App.vue +11 -11
  117. package/modules/admin/src/api/login.js +26 -26
  118. package/modules/admin/src/api/table.js +9 -9
  119. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  120. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  121. package/modules/admin/src/components/JSONEditor.vue +206 -180
  122. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  123. package/modules/admin/src/icons/index.js +9 -9
  124. package/modules/admin/src/icons/svgo.yml +22 -22
  125. package/modules/admin/src/main.js +42 -42
  126. package/modules/admin/src/permission.js +49 -49
  127. package/modules/admin/src/router/index.js +200 -200
  128. package/modules/admin/src/store/getters.js +11 -11
  129. package/modules/admin/src/store/index.js +17 -17
  130. package/modules/admin/src/store/modules/app.js +43 -43
  131. package/modules/admin/src/store/modules/user.js +104 -104
  132. package/modules/admin/src/styles/element-ui.scss +29 -29
  133. package/modules/admin/src/styles/index.scss +78 -78
  134. package/modules/admin/src/styles/mixin.scss +27 -27
  135. package/modules/admin/src/styles/sidebar.scss +133 -133
  136. package/modules/admin/src/styles/transition.scss +46 -46
  137. package/modules/admin/src/styles/variables.scss +4 -4
  138. package/modules/admin/src/utils/auth.js +15 -15
  139. package/modules/admin/src/utils/index.js +74 -74
  140. package/modules/admin/src/utils/request.js +47 -47
  141. package/modules/admin/src/utils/validate.js +31 -31
  142. package/modules/admin/src/views/404.vue +235 -235
  143. package/modules/admin/src/views/Dev.vue +33 -33
  144. package/modules/admin/src/views/EditDocument.vue +121 -121
  145. package/modules/admin/src/views/Endpoints.vue +279 -279
  146. package/modules/admin/src/views/Home.vue +84 -84
  147. package/modules/admin/src/views/Install.vue +79 -79
  148. package/modules/admin/src/views/ListDocuments.vue +72 -72
  149. package/modules/admin/src/views/ListDocuments2.vue +467 -467
  150. package/modules/admin/src/views/ManageListeners.vue +67 -67
  151. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  152. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  153. package/modules/admin/src/views/ViewRequest.vue +77 -77
  154. package/modules/admin/src/views/form/index.vue +91 -91
  155. package/modules/admin/src/views/layout/Layout.vue +69 -69
  156. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  157. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  158. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  159. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  160. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  161. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  162. package/modules/admin/src/views/layout/components/index.js +3 -3
  163. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  164. package/modules/admin/src/views/login/index.vue +195 -195
  165. package/modules/admin/src/views/tree/index.vue +77 -77
  166. package/modules/collections/collections.js +39 -39
  167. package/modules/core/core.js +197 -197
  168. package/modules/logging/logging.js +88 -88
  169. package/modules/permissions/permissions.js +106 -106
  170. package/package.json +59 -59
  171. package/scripts/expressa +12 -12
  172. package/scripts/run_cypress_tests.sh +35 -35
  173. package/scripts/run_db_tests.sh +8 -8
  174. package/test/0-install.js +96 -96
  175. package/test/collections.js +431 -431
  176. package/test/collections.querying.js +288 -288
  177. package/test/db.js +258 -258
  178. package/test/db.strings.js +73 -73
  179. package/test/db.updating.js +186 -144
  180. package/test/logging.js +29 -29
  181. package/test/test.js +93 -93
  182. package/test/testserver.js +30 -30
  183. package/test/testutils.js +136 -136
  184. package/test/users.js +425 -425
  185. package/util.js +522 -522
  186. package/modules/admin/dist/css/197.7a90435e.css.gz +0 -0
  187. package/modules/admin/dist/css/430.8c9b0482.css.gz +0 -0
  188. package/modules/admin/dist/css/566.7a90435e.css.gz +0 -0
  189. package/modules/admin/dist/css/569.f7d5c7d5.css +0 -37
  190. package/modules/admin/dist/css/569.f7d5c7d5.css.gz +0 -0
  191. package/modules/admin/dist/css/572.74d8e965.css +0 -34
  192. package/modules/admin/dist/css/572.74d8e965.css.gz +0 -0
  193. package/modules/admin/dist/css/app.eba5f5e2.css.gz +0 -0
  194. package/modules/admin/dist/static/js/197.e511d91e.js +0 -1
  195. package/modules/admin/dist/static/js/197.e511d91e.js.gz +0 -0
  196. package/modules/admin/dist/static/js/430.b3941f30.js +0 -1
  197. package/modules/admin/dist/static/js/430.b3941f30.js.gz +0 -0
  198. package/modules/admin/dist/static/js/451.645974a8.js +0 -1
  199. package/modules/admin/dist/static/js/451.645974a8.js.gz +0 -0
  200. package/modules/admin/dist/static/js/460.962d5bc0.js +0 -1
  201. package/modules/admin/dist/static/js/460.962d5bc0.js.gz +0 -0
  202. package/modules/admin/dist/static/js/550.f27feb23.js +0 -1
  203. package/modules/admin/dist/static/js/550.f27feb23.js.gz +0 -0
  204. package/modules/admin/dist/static/js/556.1e08866a.js +0 -1
  205. package/modules/admin/dist/static/js/556.1e08866a.js.gz +0 -0
  206. package/modules/admin/dist/static/js/569.0fecfbee.js +0 -1
  207. package/modules/admin/dist/static/js/569.0fecfbee.js.gz +0 -0
  208. package/modules/admin/dist/static/js/572.13392e1d.js +0 -1
  209. package/modules/admin/dist/static/js/572.13392e1d.js.gz +0 -0
  210. package/modules/admin/dist/static/js/603.7b34a650.js +0 -1
  211. package/modules/admin/dist/static/js/603.7b34a650.js.gz +0 -0
  212. package/modules/admin/dist/static/js/651.564b24b6.js +0 -1
  213. package/modules/admin/dist/static/js/651.564b24b6.js.gz +0 -0
  214. package/modules/admin/dist/static/js/653.02ec1098.js +0 -1
  215. package/modules/admin/dist/static/js/653.02ec1098.js.gz +0 -0
  216. package/modules/admin/dist/static/js/750.50c950da.js +0 -1
  217. package/modules/admin/dist/static/js/750.50c950da.js.gz +0 -0
  218. package/modules/admin/dist/static/js/950.d4ff0a18.js +0 -1
  219. package/modules/admin/dist/static/js/950.d4ff0a18.js.gz +0 -0
  220. package/modules/admin/dist/static/js/app.083328f8.js +0 -2
  221. package/modules/admin/dist/static/js/app.083328f8.js.LICENSE.txt.gz +0 -0
  222. package/modules/admin/dist/static/js/app.083328f8.js.gz +0 -0
@@ -1,49 +1,49 @@
1
- import router from './router'
2
- import store from './store'
3
- import NProgress from 'nprogress'
4
- import 'nprogress/nprogress.css'
5
- import { Message } from 'element-ui'
6
- import { getToken } from '@/utils/auth'
7
- import request from '@/utils/request'
8
-
9
- const whiteList = ['/login', '/install']
10
- router.beforeEach((to, from, next) => {
11
- NProgress.start()
12
- if (getToken()) {
13
- if (to.path === '/login') {
14
- next({ path: '/' })
15
- NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it
16
- } else {
17
- if (store.getters.roles.length === 0) {
18
- store.dispatch('GetInfo').then(res => {
19
- next()
20
- }).catch((err) => {
21
- store.dispatch('FedLogOut').then(() => {
22
- Message.error(err || 'Verification failed, please login again')
23
- next({ path: '/' })
24
- })
25
- })
26
- } else {
27
- next()
28
- }
29
- }
30
- } else {
31
- request({ url: `/status` }).then((res) => {
32
- if (!res.data.installed && to.path !== '/install') {
33
- next(`/install`)
34
- NProgress.done()
35
- } else {
36
- if (whiteList.indexOf(to.path) !== -1) {
37
- next()
38
- } else {
39
- next(`/login?redirect=${to.path}`)
40
- NProgress.done()
41
- }
42
- }
43
- })
44
- }
45
- })
46
-
47
- router.afterEach(() => {
48
- NProgress.done()
49
- })
1
+ import router from './router'
2
+ import store from './store'
3
+ import NProgress from 'nprogress'
4
+ import 'nprogress/nprogress.css'
5
+ import { Message } from 'element-ui'
6
+ import { getToken } from '@/utils/auth'
7
+ import request from '@/utils/request'
8
+
9
+ const whiteList = ['/login', '/install']
10
+ router.beforeEach((to, from, next) => {
11
+ NProgress.start()
12
+ if (getToken()) {
13
+ if (to.path === '/login') {
14
+ next({ path: '/' })
15
+ NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it
16
+ } else {
17
+ if (store.getters.roles.length === 0) {
18
+ store.dispatch('GetInfo').then(res => {
19
+ next()
20
+ }).catch((err) => {
21
+ store.dispatch('FedLogOut').then(() => {
22
+ Message.error(err || 'Verification failed, please login again')
23
+ next({ path: '/' })
24
+ })
25
+ })
26
+ } else {
27
+ next()
28
+ }
29
+ }
30
+ } else {
31
+ request({ url: `/status` }).then((res) => {
32
+ if (!res.data.installed && to.path !== '/install') {
33
+ next(`/install`)
34
+ NProgress.done()
35
+ } else {
36
+ if (whiteList.indexOf(to.path) !== -1) {
37
+ next()
38
+ } else {
39
+ next(`/login?redirect=${to.path}`)
40
+ NProgress.done()
41
+ }
42
+ }
43
+ })
44
+ }
45
+ })
46
+
47
+ router.afterEach(() => {
48
+ NProgress.done()
49
+ })
@@ -1,200 +1,200 @@
1
- import Vue from 'vue'
2
- import Router from 'vue-router'
3
-
4
- // in development-env not use lazy-loading, because lazy-loading too many pages will cause webpack hot update too slow. so only in production use lazy-loading;
5
- // detail: https://panjiachen.github.io/vue-element-admin-site/#/lazy-loading
6
-
7
- Vue.use(Router)
8
-
9
- /* Layout */
10
- import Layout from '../views/layout/Layout'
11
-
12
- const capitalize = (s) => {
13
- if (typeof s !== 'string') return ''
14
- return s.charAt(0).toUpperCase() + s.slice(1)
15
- }
16
-
17
- /**
18
- * hidden: true if `hidden:true` will not show in the sidebar(default is false)
19
- * alwaysShow: true if set true, will always show the root menu, whatever its child routes length
20
- * if not set alwaysShow, only more than one route under the children
21
- * it will becomes nested mode, otherwise not show the root menu
22
- * redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb
23
- * name:'router-name' the name is used by <keep-alive> (must set!!!)
24
- * meta : {
25
- title: 'title' the name show in submenu and breadcrumb (recommend set)
26
- icon: 'svg-name' the icon show in the sidebar,
27
- }
28
- **/
29
-
30
- export const constantRouterMap = [
31
- { path: '/login', component: () => import('@/views/login/index'), hidden: true },
32
- { path: '/install', component: () => import('@/views/Install'), hidden: true },
33
- { path: '/404', component: () => import('@/views/404'), hidden: true },
34
-
35
- {
36
- path: '/',
37
- component: Layout,
38
- redirect: '/home',
39
- name: 'Home',
40
- meta: { title: 'Home', icon: 'home' },
41
- children: [{
42
- path: 'home',
43
- meta: { title: 'Home', icon: 'home' },
44
- component: () => import('@/views/Home')
45
- }, {
46
- path: '/edit/:collectionName/:id',
47
- component: () => import('@/views/EditDocument'),
48
- hidden: true
49
- }]
50
- },
51
-
52
- {
53
- path: '/users',
54
- redirect: '/users/list',
55
- component: Layout,
56
- name: 'Users',
57
- meta: { title: 'People', icon: 'users-alt' },
58
- children: [{
59
- path: 'list',
60
- meta: { title: 'Users', icon: 'users-alt' },
61
- name: 'users2',
62
- component: () => import('@/views/ListDocuments2'),
63
- props: { collectionName: 'users' },
64
- }, {
65
- path: 'add',
66
- meta: { title: 'Add User', icon: 'plus' },
67
- name: 'newuser',
68
- component: () => import('@/views/EditDocument'),
69
- props: { collectionName: 'users', id: 'create' },
70
- }, {
71
- path: 'role',
72
- meta: { title: 'Roles', icon: 'shield-check' },
73
- name: 'role',
74
- component: () => import('@/views/ListDocuments2'),
75
- props: { collectionName: 'role' },
76
- }, {
77
- path: 'addrole',
78
- meta: { title: 'Add Role', icon: 'plus' },
79
- name: 'newrole',
80
- component: () => import('@/views/EditDocument'),
81
- props: { collectionName: 'role', id: 'create' },
82
- }],
83
- },
84
-
85
- {
86
- path: '/list/:collectionName',
87
- component: Layout,
88
- hidden: true,
89
- name: 'Data',
90
- meta: { title: 'Data', icon: 'database' },
91
- children: [{
92
- path: '',
93
- name: ':collectionName',
94
- component: () => import('@/views/ListDocuments2'),
95
- props: route => ({ collectionName: route.params.collectionName }),
96
- meta: { title: capitalize(name) }
97
- }]
98
- },
99
-
100
- {
101
- path: '/manage/permissions',
102
- component: Layout,
103
- name: 'permissions',
104
- meta: { title: 'Manage', icon: 'shield-check' },
105
- children: [
106
- {
107
- path: '',
108
- name: 'permissions',
109
- component: () => import('@/views/ManagePermissions'),
110
- meta: { title: 'Permissions' }
111
- }
112
- ]
113
- },
114
-
115
- {
116
- path: '/endpoints',
117
- component: Layout,
118
- name: 'endpoints',
119
- meta: { title: 'Search', icon: 'link' },
120
- children: [
121
- {
122
- path: '',
123
- name: 'endpoints',
124
- component: () => import('@/views/Endpoints'),
125
- meta: { title: 'Endpoints' }
126
- }
127
- ]
128
- },
129
-
130
- {
131
- path: '/dev',
132
- component: Layout,
133
- meta: { title: 'Dev', icon: 'flask' },
134
- name: 'Dev',
135
- children: [
136
- {
137
- path: '',
138
- name: '',
139
- component: () => import('@/views/Dev'),
140
- meta: { title: '' },
141
- hidden: true,
142
- },
143
- {
144
- path: 'listeners',
145
- name: 'listeners',
146
- component: () => import('@/views/ManageListeners'),
147
- meta: { title: 'Listeners' }
148
- },
149
- {
150
- path: 'middleware',
151
- name: 'middleware',
152
- component: () => import('@/views/ManageMiddleware'),
153
- meta: { title: 'Middleware' }
154
- }, {
155
- path: 'requestlogs',
156
- meta: { title: 'Request Logs', icon: 'diary' },
157
- name: 'requestlogs',
158
- component: () => import('@/views/ListDocuments2'),
159
- props: { collectionName: 'requestlog', columns: ['method', 'url', 'req.ip', 'user', 'res.message', 'res.statusCode', 'res.headers.content-length'] },
160
- }, {
161
- path: 'viewrequest/:requestId',
162
- hidden: true,
163
- meta: { title: 'View Request', icon: 'diary' },
164
- name: 'viewrequest',
165
- component: () => import('@/views/ViewRequest'),
166
- }, {
167
- path: '/edit/collection',
168
- component: Layout,
169
- name: 'Schema',
170
- hidden: true,
171
- meta: { title: 'Schemas', icon: 'cog' },
172
- children: [{
173
- hidden: true,
174
- path: '/:collectionName',
175
- name: name,
176
- meta: { title: capitalize(name) }
177
- }]
178
- },
179
- ]
180
- },
181
-
182
- {
183
- path: 'external-link',
184
- component: Layout,
185
- children: [
186
- {
187
- path: 'https://github.com/thomas4019/expressa',
188
- meta: { title: 'Expressa Docs', icon: 'link' }
189
- }
190
- ]
191
- },
192
-
193
- { path: '*', redirect: '/404', hidden: true }
194
- ]
195
-
196
- export default new Router({
197
- // mode: 'history',
198
- scrollBehavior: () => ({ y: 0 }),
199
- routes: constantRouterMap
200
- })
1
+ import Vue from 'vue'
2
+ import Router from 'vue-router'
3
+
4
+ // in development-env not use lazy-loading, because lazy-loading too many pages will cause webpack hot update too slow. so only in production use lazy-loading;
5
+ // detail: https://panjiachen.github.io/vue-element-admin-site/#/lazy-loading
6
+
7
+ Vue.use(Router)
8
+
9
+ /* Layout */
10
+ import Layout from '../views/layout/Layout'
11
+
12
+ const capitalize = (s) => {
13
+ if (typeof s !== 'string') return ''
14
+ return s.charAt(0).toUpperCase() + s.slice(1)
15
+ }
16
+
17
+ /**
18
+ * hidden: true if `hidden:true` will not show in the sidebar(default is false)
19
+ * alwaysShow: true if set true, will always show the root menu, whatever its child routes length
20
+ * if not set alwaysShow, only more than one route under the children
21
+ * it will becomes nested mode, otherwise not show the root menu
22
+ * redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb
23
+ * name:'router-name' the name is used by <keep-alive> (must set!!!)
24
+ * meta : {
25
+ title: 'title' the name show in submenu and breadcrumb (recommend set)
26
+ icon: 'svg-name' the icon show in the sidebar,
27
+ }
28
+ **/
29
+
30
+ export const constantRouterMap = [
31
+ { path: '/login', component: () => import('@/views/login/index'), hidden: true },
32
+ { path: '/install', component: () => import('@/views/Install'), hidden: true },
33
+ { path: '/404', component: () => import('@/views/404'), hidden: true },
34
+
35
+ {
36
+ path: '/',
37
+ component: Layout,
38
+ redirect: '/home',
39
+ name: 'Home',
40
+ meta: { title: 'Home', icon: 'home' },
41
+ children: [{
42
+ path: 'home',
43
+ meta: { title: 'Home', icon: 'home' },
44
+ component: () => import('@/views/Home')
45
+ }, {
46
+ path: '/edit/:collectionName/:id',
47
+ component: () => import('@/views/EditDocument'),
48
+ hidden: true
49
+ }]
50
+ },
51
+
52
+ {
53
+ path: '/users',
54
+ redirect: '/users/list',
55
+ component: Layout,
56
+ name: 'Users',
57
+ meta: { title: 'People', icon: 'users-alt' },
58
+ children: [{
59
+ path: 'list',
60
+ meta: { title: 'Users', icon: 'users-alt' },
61
+ name: 'users2',
62
+ component: () => import('@/views/ListDocuments2'),
63
+ props: { collectionName: 'users' },
64
+ }, {
65
+ path: 'add',
66
+ meta: { title: 'Add User', icon: 'plus' },
67
+ name: 'newuser',
68
+ component: () => import('@/views/EditDocument'),
69
+ props: { collectionName: 'users', id: 'create' },
70
+ }, {
71
+ path: 'role',
72
+ meta: { title: 'Roles', icon: 'shield-check' },
73
+ name: 'role',
74
+ component: () => import('@/views/ListDocuments2'),
75
+ props: { collectionName: 'role' },
76
+ }, {
77
+ path: 'addrole',
78
+ meta: { title: 'Add Role', icon: 'plus' },
79
+ name: 'newrole',
80
+ component: () => import('@/views/EditDocument'),
81
+ props: { collectionName: 'role', id: 'create' },
82
+ }],
83
+ },
84
+
85
+ {
86
+ path: '/list/:collectionName',
87
+ component: Layout,
88
+ hidden: true,
89
+ name: 'Data',
90
+ meta: { title: 'Data', icon: 'database' },
91
+ children: [{
92
+ path: '',
93
+ name: ':collectionName',
94
+ component: () => import('@/views/ListDocuments2'),
95
+ props: route => ({ collectionName: route.params.collectionName }),
96
+ meta: { title: capitalize(name) }
97
+ }]
98
+ },
99
+
100
+ {
101
+ path: '/manage/permissions',
102
+ component: Layout,
103
+ name: 'permissions',
104
+ meta: { title: 'Manage', icon: 'shield-check' },
105
+ children: [
106
+ {
107
+ path: '',
108
+ name: 'permissions',
109
+ component: () => import('@/views/ManagePermissions'),
110
+ meta: { title: 'Permissions' }
111
+ }
112
+ ]
113
+ },
114
+
115
+ {
116
+ path: '/endpoints',
117
+ component: Layout,
118
+ name: 'endpoints',
119
+ meta: { title: 'Search', icon: 'link' },
120
+ children: [
121
+ {
122
+ path: '',
123
+ name: 'endpoints',
124
+ component: () => import('@/views/Endpoints'),
125
+ meta: { title: 'Endpoints' }
126
+ }
127
+ ]
128
+ },
129
+
130
+ {
131
+ path: '/dev',
132
+ component: Layout,
133
+ meta: { title: 'Dev', icon: 'flask' },
134
+ name: 'Dev',
135
+ children: [
136
+ {
137
+ path: '',
138
+ name: '',
139
+ component: () => import('@/views/Dev'),
140
+ meta: { title: '' },
141
+ hidden: true,
142
+ },
143
+ {
144
+ path: 'listeners',
145
+ name: 'listeners',
146
+ component: () => import('@/views/ManageListeners'),
147
+ meta: { title: 'Listeners' }
148
+ },
149
+ {
150
+ path: 'middleware',
151
+ name: 'middleware',
152
+ component: () => import('@/views/ManageMiddleware'),
153
+ meta: { title: 'Middleware' }
154
+ }, {
155
+ path: 'requestlogs',
156
+ meta: { title: 'Request Logs', icon: 'diary' },
157
+ name: 'requestlogs',
158
+ component: () => import('@/views/ListDocuments2'),
159
+ props: { collectionName: 'requestlog', columns: ['method', 'url', 'req.ip', 'user', 'res.message', 'res.statusCode', 'res.headers.content-length'] },
160
+ }, {
161
+ path: 'viewrequest/:requestId',
162
+ hidden: true,
163
+ meta: { title: 'View Request', icon: 'diary' },
164
+ name: 'viewrequest',
165
+ component: () => import('@/views/ViewRequest'),
166
+ }, {
167
+ path: '/edit/collection',
168
+ component: Layout,
169
+ name: 'Schema',
170
+ hidden: true,
171
+ meta: { title: 'Schemas', icon: 'cog' },
172
+ children: [{
173
+ hidden: true,
174
+ path: '/:collectionName',
175
+ name: name,
176
+ meta: { title: capitalize(name) }
177
+ }]
178
+ },
179
+ ]
180
+ },
181
+
182
+ {
183
+ path: 'external-link',
184
+ component: Layout,
185
+ children: [
186
+ {
187
+ path: 'https://github.com/thomas4019/expressa',
188
+ meta: { title: 'Expressa Docs', icon: 'link' }
189
+ }
190
+ ]
191
+ },
192
+
193
+ { path: '*', redirect: '/404', hidden: true }
194
+ ]
195
+
196
+ export default new Router({
197
+ // mode: 'history',
198
+ scrollBehavior: () => ({ y: 0 }),
199
+ routes: constantRouterMap
200
+ })
@@ -1,11 +1,11 @@
1
- const getters = {
2
- sidebar: state => state.app.sidebar,
3
- device: state => state.app.device,
4
- token: state => state.user.token,
5
- avatar: state => state.user.avatar,
6
- name: state => state.user.name,
7
- email: state => state.user.email,
8
- roles: state => state.user.roles,
9
- statusInfo: state => state.user.statusInfo
10
- }
11
- export default getters
1
+ const getters = {
2
+ sidebar: state => state.app.sidebar,
3
+ device: state => state.app.device,
4
+ token: state => state.user.token,
5
+ avatar: state => state.user.avatar,
6
+ name: state => state.user.name,
7
+ email: state => state.user.email,
8
+ roles: state => state.user.roles,
9
+ statusInfo: state => state.user.statusInfo
10
+ }
11
+ export default getters
@@ -1,17 +1,17 @@
1
- import Vue from 'vue'
2
- import Vuex from 'vuex'
3
- import app from './modules/app'
4
- import user from './modules/user'
5
- import getters from './getters'
6
-
7
- Vue.use(Vuex)
8
-
9
- const store = new Vuex.Store({
10
- modules: {
11
- app,
12
- user
13
- },
14
- getters
15
- })
16
-
17
- export default store
1
+ import Vue from 'vue'
2
+ import Vuex from 'vuex'
3
+ import app from './modules/app'
4
+ import user from './modules/user'
5
+ import getters from './getters'
6
+
7
+ Vue.use(Vuex)
8
+
9
+ const store = new Vuex.Store({
10
+ modules: {
11
+ app,
12
+ user
13
+ },
14
+ getters
15
+ })
16
+
17
+ export default store
@@ -1,43 +1,43 @@
1
- import Cookies from 'js-cookie'
2
-
3
- const app = {
4
- state: {
5
- sidebar: {
6
- opened: !+Cookies.get('sidebarStatus'),
7
- withoutAnimation: false
8
- },
9
- device: 'desktop'
10
- },
11
- mutations: {
12
- TOGGLE_SIDEBAR: state => {
13
- if (state.sidebar.opened) {
14
- Cookies.set('sidebarStatus', 1)
15
- } else {
16
- Cookies.set('sidebarStatus', 0)
17
- }
18
- state.sidebar.opened = !state.sidebar.opened
19
- state.sidebar.withoutAnimation = false
20
- },
21
- CLOSE_SIDEBAR: (state, withoutAnimation) => {
22
- Cookies.set('sidebarStatus', 1)
23
- state.sidebar.opened = false
24
- state.sidebar.withoutAnimation = withoutAnimation
25
- },
26
- TOGGLE_DEVICE: (state, device) => {
27
- state.device = device
28
- }
29
- },
30
- actions: {
31
- ToggleSideBar: ({ commit }) => {
32
- commit('TOGGLE_SIDEBAR')
33
- },
34
- CloseSideBar({ commit }, { withoutAnimation }) {
35
- commit('CLOSE_SIDEBAR', withoutAnimation)
36
- },
37
- ToggleDevice({ commit }, device) {
38
- commit('TOGGLE_DEVICE', device)
39
- }
40
- }
41
- }
42
-
43
- export default app
1
+ import Cookies from 'js-cookie'
2
+
3
+ const app = {
4
+ state: {
5
+ sidebar: {
6
+ opened: !+Cookies.get('sidebarStatus'),
7
+ withoutAnimation: false
8
+ },
9
+ device: 'desktop'
10
+ },
11
+ mutations: {
12
+ TOGGLE_SIDEBAR: state => {
13
+ if (state.sidebar.opened) {
14
+ Cookies.set('sidebarStatus', 1)
15
+ } else {
16
+ Cookies.set('sidebarStatus', 0)
17
+ }
18
+ state.sidebar.opened = !state.sidebar.opened
19
+ state.sidebar.withoutAnimation = false
20
+ },
21
+ CLOSE_SIDEBAR: (state, withoutAnimation) => {
22
+ Cookies.set('sidebarStatus', 1)
23
+ state.sidebar.opened = false
24
+ state.sidebar.withoutAnimation = withoutAnimation
25
+ },
26
+ TOGGLE_DEVICE: (state, device) => {
27
+ state.device = device
28
+ }
29
+ },
30
+ actions: {
31
+ ToggleSideBar: ({ commit }) => {
32
+ commit('TOGGLE_SIDEBAR')
33
+ },
34
+ CloseSideBar({ commit }, { withoutAnimation }) {
35
+ commit('CLOSE_SIDEBAR', withoutAnimation)
36
+ },
37
+ ToggleDevice({ commit }, device) {
38
+ commit('TOGGLE_DEVICE', device)
39
+ }
40
+ }
41
+ }
42
+
43
+ export default app