@yukihong/schema-admin-x 1.0.0

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 (80) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc +55 -0
  3. package/README.md +208 -0
  4. package/app/controller/base.js +39 -0
  5. package/app/controller/project.js +80 -0
  6. package/app/controller/view.js +20 -0
  7. package/app/extend/logger.js +39 -0
  8. package/app/middleware/api-params-verify.js +79 -0
  9. package/app/middleware/api-sign-verify.js +34 -0
  10. package/app/middleware/error-handler.js +34 -0
  11. package/app/middleware/project-handler.js +27 -0
  12. package/app/middleware.js +40 -0
  13. package/app/pages/asserts/custom.css +13 -0
  14. package/app/pages/boot.js +53 -0
  15. package/app/pages/common/curl.js +91 -0
  16. package/app/pages/common/utils.js +3 -0
  17. package/app/pages/dashboard/complex-view/header-view/complex-view/sub-menu/sub-menu.vue +21 -0
  18. package/app/pages/dashboard/complex-view/header-view/header-view.vue +127 -0
  19. package/app/pages/dashboard/complex-view/iframe-view/iframe-view.vue +44 -0
  20. package/app/pages/dashboard/complex-view/schema-view/complex-view/search-panel/search-panel.vue +41 -0
  21. package/app/pages/dashboard/complex-view/schema-view/complex-view/table-panel/table-panel.vue +131 -0
  22. package/app/pages/dashboard/complex-view/schema-view/components/component-config.js +23 -0
  23. package/app/pages/dashboard/complex-view/schema-view/components/create-form/create-form.vue +100 -0
  24. package/app/pages/dashboard/complex-view/schema-view/components/detail-panel/detail-panel.vue +106 -0
  25. package/app/pages/dashboard/complex-view/schema-view/components/edit-form/edit-form.vue +131 -0
  26. package/app/pages/dashboard/complex-view/schema-view/hook/schema.js +126 -0
  27. package/app/pages/dashboard/complex-view/schema-view/schema-view.vue +102 -0
  28. package/app/pages/dashboard/complex-view/sider-view/complex-view/sub-menu/sub-menu.vue +26 -0
  29. package/app/pages/dashboard/complex-view/sider-view/sider-view.vue +128 -0
  30. package/app/pages/dashboard/dashboard.vue +99 -0
  31. package/app/pages/dashboard/entry.dashboard.js +44 -0
  32. package/app/pages/store/index.js +4 -0
  33. package/app/pages/store/menu.js +61 -0
  34. package/app/pages/store/project.js +17 -0
  35. package/app/pages/widgets/header-container/asserts/avatar.png +0 -0
  36. package/app/pages/widgets/header-container/asserts/logo.png +0 -0
  37. package/app/pages/widgets/header-container/header-container.vue +109 -0
  38. package/app/pages/widgets/schema-form/complex-view/input/input.vue +146 -0
  39. package/app/pages/widgets/schema-form/complex-view/input-number/input-number.vue +140 -0
  40. package/app/pages/widgets/schema-form/complex-view/select/select.vue +121 -0
  41. package/app/pages/widgets/schema-form/form-item-config.js +23 -0
  42. package/app/pages/widgets/schema-form/schema-form.vue +131 -0
  43. package/app/pages/widgets/schema-search-bar/complex-view/date-range/date-range.vue +50 -0
  44. package/app/pages/widgets/schema-search-bar/complex-view/dynamic-select/dynamic-select.vue +65 -0
  45. package/app/pages/widgets/schema-search-bar/complex-view/input/input.vue +44 -0
  46. package/app/pages/widgets/schema-search-bar/complex-view/select/select.vue +51 -0
  47. package/app/pages/widgets/schema-search-bar/schema-search-bar.vue +127 -0
  48. package/app/pages/widgets/schema-search-bar/search-item-config.js +27 -0
  49. package/app/pages/widgets/schema-table/schema-table.vue +248 -0
  50. package/app/pages/widgets/sider-container/sider-container.vue +28 -0
  51. package/app/public/static/logo.png +0 -0
  52. package/app/public/static/normalize.css +239 -0
  53. package/app/router/project.js +7 -0
  54. package/app/router/view.js +10 -0
  55. package/app/router-schema/project.js +30 -0
  56. package/app/service/base.js +13 -0
  57. package/app/service/project.js +50 -0
  58. package/app/view/entry.tpl +25 -0
  59. package/app/webpack/config/webpack.base.js +213 -0
  60. package/app/webpack/config/webpack.dev.js +61 -0
  61. package/app/webpack/config/webpack.prod.js +124 -0
  62. package/app/webpack/dev.js +63 -0
  63. package/app/webpack/libs/blank.js +1 -0
  64. package/app/webpack/prod.js +19 -0
  65. package/config/config.beta.js +3 -0
  66. package/config/config.default.js +3 -0
  67. package/config/config.prod.js +3 -0
  68. package/elpis-core/env.js +20 -0
  69. package/elpis-core/index.js +99 -0
  70. package/elpis-core/loader/config.js +52 -0
  71. package/elpis-core/loader/controller.js +75 -0
  72. package/elpis-core/loader/extend.js +55 -0
  73. package/elpis-core/loader/middleware.js +64 -0
  74. package/elpis-core/loader/router-schema.js +47 -0
  75. package/elpis-core/loader/router.js +59 -0
  76. package/elpis-core/loader/service.js +75 -0
  77. package/index.js +40 -0
  78. package/model/index.js +102 -0
  79. package/package.json +93 -0
  80. package/test/controller/project.test.js +217 -0
@@ -0,0 +1,217 @@
1
+ const assert = require('assert');
2
+ const supertest = require('supertest');
3
+ const md5 = require('md5');
4
+ const eplisCore = require('../../elpis-core');
5
+
6
+ const signKey = 'asd23fhakjs25dhaksdh5kjashcjk';
7
+ const st = Date.now();
8
+
9
+ describe('测试 project 相关接口', function() {
10
+ this.timeout(60000);
11
+
12
+ let modelList;
13
+ let projectList = [];
14
+ let request;
15
+
16
+ it('启动服务', async () => {
17
+ const app = await eplisCore.start();
18
+
19
+ modelList = require('../../model/index.js')(app);
20
+ modelList.forEach(modelItem => {
21
+ const { project } = modelItem;
22
+ for(const pKey in project) {
23
+ projectList.push(project[pKey]);
24
+ }
25
+ });
26
+ request = supertest(app.listen());
27
+ });
28
+
29
+
30
+ it('GET /api/project without proj_key', async() => {
31
+ let tmpRequest = request.get('/api/project');
32
+ tmpRequest = tmpRequest.set('s_t', st);
33
+ tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`));
34
+ const res = await tmpRequest;
35
+ assert(res.body.success === false);
36
+
37
+ const resData = res.body;
38
+ assert(resData.code === 442);
39
+ assert(resData.message.indexOf(`request validate fail:data should have required property '.proj_key'`) > -1);
40
+
41
+ });
42
+
43
+ it('GET /api/project fail', async() => {
44
+ let tmpRequest = request.get('/api/project');
45
+ tmpRequest = tmpRequest.set('s_t', st);
46
+ tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`));
47
+ tmpRequest = tmpRequest.query({
48
+ proj_key: 'xxxxxxxx'
49
+ })
50
+ const res = await tmpRequest;
51
+
52
+ assert(res.body.success === false);
53
+
54
+ const resData = res.body;
55
+ assert(resData.code === 50000);
56
+ assert(resData.message.indexOf(`获取项目异常`) > -1);
57
+
58
+ });
59
+
60
+ it('GET /api/project with proj_key', async() => {
61
+ for(let i = 0; i < projectList.length; ++i) {
62
+ const projItem = projectList[i];
63
+ const { key: projKey } = projItem;
64
+
65
+ console.log(`-------- GET /api/project with proj_key:${projKey}`);
66
+
67
+ let tmpRequest = request.get('/api/project');
68
+ tmpRequest = tmpRequest.set('s_t', st);
69
+ tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`));
70
+ tmpRequest = tmpRequest.query({
71
+ proj_key: projKey
72
+ })
73
+ const res = await tmpRequest;
74
+ assert(res.body.success === true);
75
+
76
+ const resData = res.body.data;
77
+ assert(resData.key === projKey);
78
+ assert(resData.modelKey);
79
+ assert(resData.name);
80
+ assert(resData.desc !== undefined );
81
+ assert(resData.homePage !== undefined );
82
+
83
+ const { menu } = resData;
84
+ menu.forEach(menuItem => {
85
+ checkMenuItem(menuItem);
86
+ })
87
+
88
+ }
89
+
90
+ // 校验 menu 菜单
91
+ function checkMenuItem(menuItem) {
92
+ console.log(`-------- GET /api/project with proj_key - menuKey:${menuItem.key}`);
93
+ assert(menuItem.key);
94
+ assert(menuItem.name);
95
+ assert(menuItem.menuType);
96
+
97
+ if( menuItem.menuType === 'group') {
98
+ assert(menuItem.subMenu !== undefined);
99
+ menu.subMenu.forEach(subMenuItem => {
100
+ checkMenuItem(subMenuItem);
101
+
102
+ })
103
+ }
104
+ if( menuItem.menuType === 'module') {
105
+ checkModule(menuItem)
106
+ }
107
+ }
108
+
109
+ // 检查 module 菜单配置
110
+ function checkModule(menuItem) {
111
+ const { moduleType } = menuItem;
112
+ assert(moduleType);
113
+
114
+ if(moduleType === 'sider') {
115
+ const { siderConfig } = menuItem;
116
+ assert(siderConfig);
117
+ assert(siderConfig.menu);
118
+
119
+ siderConfig.menu.forEach(siderMenuItem => {
120
+ checkMenuItem(siderMenuItem);
121
+ })
122
+ }
123
+ if(moduleType === 'iframe') {
124
+ const { iframeConfig } = menuItem;
125
+ assert(iframeConfig);
126
+ assert(iframeConfig.path !== undefined);
127
+ }
128
+ if(moduleType === 'custom') {
129
+ const { customConfig } = menuItem;
130
+ assert(customConfig);
131
+ assert(customConfig.path !== undefined);
132
+ }
133
+ if(moduleType === 'schema') {
134
+ const { schemaConfig } = menuItem;
135
+ assert(schemaConfig);
136
+ assert(schemaConfig.api !== undefined);
137
+ assert(schemaConfig.schema);
138
+ }
139
+
140
+ }
141
+
142
+ });
143
+
144
+ it('GET /api/project/list without proj_key', async() => {
145
+ let tmpRequest = request.get('/api/project/list');
146
+ tmpRequest = tmpRequest.set('s_t', st);
147
+ tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`));
148
+ const res = await tmpRequest;
149
+ assert(res.body.success === true);
150
+
151
+ const resData = res.body.data;
152
+ assert(resData.length === projectList.length);
153
+
154
+ for(let i = 0; i < resData.length; ++i) {
155
+ const item = resData[i];
156
+ assert(item.modelKey);
157
+ assert(item.key);
158
+ assert(item.name);
159
+ assert(item.desc !== undefined);
160
+ assert(item.homePage !== undefined);
161
+ }
162
+
163
+ });
164
+
165
+
166
+ it('GET /api/project/list with proj_key', async() => {
167
+ const { key: projKey } = projectList[Math.floor(Math.random() * projectList.length)];
168
+ const { modelKey } = projectList.find(item => item.key === projKey);
169
+
170
+ let tmpRequest = request.get('/api/project/list');
171
+ tmpRequest = tmpRequest.set('s_t', st);
172
+ tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`));
173
+ tmpRequest = tmpRequest.query({
174
+ proj_key: projKey
175
+ })
176
+ const res = await tmpRequest;
177
+ assert(res.body.success === true);
178
+
179
+ const resData = res.body.data;
180
+ assert(projectList.filter(item => item.modelKey === modelKey).length === resData.length);
181
+
182
+ for(let i = 0; i < resData.length; ++i) {
183
+ const item = resData[i];
184
+ assert(item.modelKey);
185
+ assert(item.key);
186
+ assert(item.name);
187
+ assert(item.desc !== undefined);
188
+ assert(item.homePage !== undefined);
189
+ }
190
+
191
+ });
192
+
193
+ it('GET /api/project/model_list', async() => {
194
+ let tmpRequest = request.get('/api/project/model_list');
195
+ tmpRequest = tmpRequest.set('s_t', st);
196
+ tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`));
197
+ const res = await tmpRequest;
198
+ assert(res.body.success === true);
199
+
200
+ const resData = res.body.data;
201
+ assert(resData.length > 0);
202
+
203
+ for(let i = 0; i < resData.length; ++i) {
204
+ const item = resData[i]
205
+ assert(item.model);
206
+ assert(item.model.key);
207
+ assert(item.model.name);
208
+
209
+ for(const projKey in item.project) {
210
+ assert(item.project[projKey].key);
211
+ assert(item.project[projKey].name);
212
+ }
213
+ }
214
+
215
+ });
216
+
217
+ })