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