@hupan56/wlkj 2.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 (87) hide show
  1. package/bin/cli.js +213 -0
  2. package/package.json +11 -0
  3. package/templates/cli.js +198 -0
  4. package/templates/qoder/commands/wl-code.md +43 -0
  5. package/templates/qoder/commands/wl-commit.md +30 -0
  6. package/templates/qoder/commands/wl-init.md +80 -0
  7. package/templates/qoder/commands/wl-insight.md +51 -0
  8. package/templates/qoder/commands/wl-prd.md +199 -0
  9. package/templates/qoder/commands/wl-report.md +166 -0
  10. package/templates/qoder/commands/wl-search.md +52 -0
  11. package/templates/qoder/commands/wl-spec.md +18 -0
  12. package/templates/qoder/commands/wl-status.md +51 -0
  13. package/templates/qoder/commands/wl-task.md +71 -0
  14. package/templates/qoder/commands/wl-test.md +42 -0
  15. package/templates/qoder/config.toml +5 -0
  16. package/templates/qoder/config.yaml +141 -0
  17. package/templates/qoder/hooks/inject-workflow-state.py +117 -0
  18. package/templates/qoder/hooks/session-start.py +204 -0
  19. package/templates/qoder/rules/wl-pipeline.md +105 -0
  20. package/templates/qoder/scripts/add_session.py +245 -0
  21. package/templates/qoder/scripts/benchmark.py +209 -0
  22. package/templates/qoder/scripts/build_style_index.py +268 -0
  23. package/templates/qoder/scripts/code_index.py +41 -0
  24. package/templates/qoder/scripts/collect_prds.py +31 -0
  25. package/templates/qoder/scripts/common/__init__.py +0 -0
  26. package/templates/qoder/scripts/common/active_task.py +230 -0
  27. package/templates/qoder/scripts/common/atomicio.py +172 -0
  28. package/templates/qoder/scripts/common/developer.py +161 -0
  29. package/templates/qoder/scripts/common/eval_api.py +144 -0
  30. package/templates/qoder/scripts/common/feishu.py +278 -0
  31. package/templates/qoder/scripts/common/filelock.py +211 -0
  32. package/templates/qoder/scripts/common/identity.py +285 -0
  33. package/templates/qoder/scripts/common/mentions.py +134 -0
  34. package/templates/qoder/scripts/common/paths.py +311 -0
  35. package/templates/qoder/scripts/common/reqid.py +218 -0
  36. package/templates/qoder/scripts/common/search_engine.py +205 -0
  37. package/templates/qoder/scripts/common/task_utils.py +342 -0
  38. package/templates/qoder/scripts/common/terms.py +234 -0
  39. package/templates/qoder/scripts/common/utf8.py +38 -0
  40. package/templates/qoder/scripts/context_pack.py +196 -0
  41. package/templates/qoder/scripts/eval_prd.py +225 -0
  42. package/templates/qoder/scripts/export.py +487 -0
  43. package/templates/qoder/scripts/git_sync.py +1087 -0
  44. package/templates/qoder/scripts/handoff.py +22 -0
  45. package/templates/qoder/scripts/init_developer.py +76 -0
  46. package/templates/qoder/scripts/init_doctor.py +527 -0
  47. package/templates/qoder/scripts/install_qoderwork.py +339 -0
  48. package/templates/qoder/scripts/learn.py +67 -0
  49. package/templates/qoder/scripts/notify.py +5 -0
  50. package/templates/qoder/scripts/parse_prds.py +33 -0
  51. package/templates/qoder/scripts/report.py +281 -0
  52. package/templates/qoder/scripts/role.py +39 -0
  53. package/templates/qoder/scripts/run_weekly_update.bat +17 -0
  54. package/templates/qoder/scripts/run_weekly_update.sh +20 -0
  55. package/templates/qoder/scripts/search_index.py +352 -0
  56. package/templates/qoder/scripts/setup.py +453 -0
  57. package/templates/qoder/scripts/setup_weekly_cron.bat +22 -0
  58. package/templates/qoder/scripts/setup_weekly_cron.sh +19 -0
  59. package/templates/qoder/scripts/status.py +389 -0
  60. package/templates/qoder/scripts/syncgate.py +330 -0
  61. package/templates/qoder/scripts/task.py +954 -0
  62. package/templates/qoder/scripts/team.py +29 -0
  63. package/templates/qoder/scripts/team_sync.py +419 -0
  64. package/templates/qoder/scripts/workspace_init.py +102 -0
  65. package/templates/qoder/settings.json +53 -0
  66. package/templates/qoder/skills/design-review/SKILL.md +25 -0
  67. package/templates/qoder/skills/prd-generator/SKILL.md +180 -0
  68. package/templates/qoder/skills/prd-review/SKILL.md +36 -0
  69. package/templates/qoder/skills/prototype-generator/SKILL.md +141 -0
  70. package/templates/qoder/skills/spec-coder/SKILL.md +69 -0
  71. package/templates/qoder/skills/spec-generator/SKILL.md +67 -0
  72. package/templates/qoder/skills/test-generator/SKILL.md +72 -0
  73. package/templates/qoder/skills/wl-commit/SKILL.md +76 -0
  74. package/templates/qoder/skills/wl-init/SKILL.md +67 -0
  75. package/templates/qoder/skills/wl-insight/SKILL.md +81 -0
  76. package/templates/qoder/skills/wl-report/SKILL.md +87 -0
  77. package/templates/qoder/skills/wl-search/SKILL.md +75 -0
  78. package/templates/qoder/skills/wl-status/SKILL.md +61 -0
  79. package/templates/qoder/skills/wl-task/SKILL.md +58 -0
  80. package/templates/qoder/templates/prd-full-template.md +103 -0
  81. package/templates/qoder/templates/prd-quick-template.md +69 -0
  82. package/templates/qoder/templates/prototype-app.html +344 -0
  83. package/templates/qoder/templates/prototype-web.html +310 -0
  84. package/templates/root/AGENTS.md +182 -0
  85. package/templates/root/README-pipeline.md +56 -0
  86. package/templates/root/ROLES.md +85 -0
  87. package/templates/root//346/226/260/346/211/213/346/214/207/345/215/227.md +186 -0
@@ -0,0 +1,344 @@
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, maximum-scale=1.0, user-scalable=no">
6
+ <title>{{TITLE}} - APP 移动端</title>
7
+ <style>
8
+ :root {
9
+ /* Vant Design Tokens */
10
+ --van-primary-color: #1989fa;
11
+ --van-success-color: #07c160;
12
+ --van-warning-color: #ff976a;
13
+ --van-danger-color: #ee0a24;
14
+ --van-text-color: #323233;
15
+ --van-text-color-2: #969799;
16
+ --van-text-color-3: #c8c9cc;
17
+ --van-border-color: #ebedf0;
18
+ --van-background: #f7f8fa;
19
+ --van-background-2: #fafafa;
20
+
21
+ /* 适配基准: 375px 设计稿 */
22
+ --app-max-width: 375px;
23
+ --app-padding: 16px;
24
+ }
25
+
26
+ * { margin: 0; padding: 0; box-sizing: border-box; }
27
+
28
+ body {
29
+ font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif;
30
+ background: var(--van-background);
31
+ color: var(--van-text-color);
32
+ max-width: var(--app-max-width);
33
+ margin: 0 auto;
34
+ min-height: 100vh;
35
+ position: relative;
36
+ }
37
+
38
+ /* Status Bar */
39
+ .status-bar {
40
+ height: 44px;
41
+ background: var(--van-primary-color);
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ color: white;
46
+ font-size: 17px;
47
+ font-weight: 500;
48
+ position: sticky;
49
+ top: 0;
50
+ z-index: 100;
51
+ }
52
+
53
+ .status-bar .back-btn {
54
+ position: absolute;
55
+ left: 16px;
56
+ font-size: 20px;
57
+ cursor: pointer;
58
+ }
59
+
60
+ /* Content Area */
61
+ .content {
62
+ padding: var(--app-padding);
63
+ padding-bottom: 70px; /* 留出底部导航空间 */
64
+ }
65
+
66
+ /* Vant Cell Group */
67
+ .van-cell-group {
68
+ background: white;
69
+ border-radius: 8px;
70
+ overflow: hidden;
71
+ margin-bottom: 12px;
72
+ }
73
+
74
+ .van-cell {
75
+ display: flex;
76
+ align-items: center;
77
+ padding: 12px 16px;
78
+ border-bottom: 1px solid var(--van-border-color);
79
+ font-size: 14px;
80
+ }
81
+
82
+ .van-cell:last-child {
83
+ border-bottom: none;
84
+ }
85
+
86
+ .van-cell-label {
87
+ color: var(--van-text-color-2);
88
+ font-size: 12px;
89
+ margin-top: 4px;
90
+ }
91
+
92
+ .van-cell-value {
93
+ flex: 1;
94
+ text-align: right;
95
+ color: var(--van-text-color-2);
96
+ }
97
+
98
+ .van-cell-arrow::after {
99
+ content: '>';
100
+ margin-left: 8px;
101
+ color: var(--van-text-color-3);
102
+ }
103
+
104
+ /* Vant Field */
105
+ .van-field {
106
+ display: flex;
107
+ align-items: center;
108
+ padding: 12px 16px;
109
+ background: white;
110
+ }
111
+
112
+ .van-field-label {
113
+ width: 90px;
114
+ font-size: 14px;
115
+ color: var(--van-text-color);
116
+ }
117
+
118
+ .van-field-control {
119
+ flex: 1;
120
+ height: 32px;
121
+ padding: 0 12px;
122
+ border: 1px solid var(--van-border-color);
123
+ border-radius: 4px;
124
+ font-size: 14px;
125
+ background: var(--van-background-2);
126
+ }
127
+
128
+ .van-field-control:focus {
129
+ border-color: var(--van-primary-color);
130
+ }
131
+
132
+ /* Vant Button */
133
+ .van-button {
134
+ display: inline-flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ height: 44px;
138
+ padding: 0 16px;
139
+ border-radius: 8px;
140
+ font-size: 16px;
141
+ font-weight: 500;
142
+ cursor: pointer;
143
+ border: none;
144
+ width: 100%;
145
+ }
146
+
147
+ .van-button-primary {
148
+ background: var(--van-primary-color);
149
+ color: white;
150
+ }
151
+
152
+ .van-button-default {
153
+ background: white;
154
+ color: var(--van-text-color);
155
+ border: 1px solid var(--van-border-color);
156
+ }
157
+
158
+ .van-button-danger {
159
+ background: var(--van-danger-color);
160
+ color: white;
161
+ }
162
+
163
+ /* Vant Tag */
164
+ .van-tag {
165
+ display: inline-block;
166
+ padding: 2px 8px;
167
+ border-radius: 4px;
168
+ font-size: 12px;
169
+ line-height: 1.5;
170
+ }
171
+
172
+ .van-tag-success {
173
+ background: #e8f5e9;
174
+ color: var(--van-success-color);
175
+ }
176
+
177
+ .van-tag-warning {
178
+ background: #fff3e0;
179
+ color: var(--van-warning-color);
180
+ }
181
+
182
+ .van-tag-danger {
183
+ background: #fbe9e7;
184
+ color: var(--van-danger-color);
185
+ }
186
+
187
+ /* List Item */
188
+ .list-item {
189
+ background: white;
190
+ padding: 12px 16px;
191
+ margin-bottom: 1px;
192
+ display: flex;
193
+ align-items: center;
194
+ }
195
+
196
+ .list-item:first-child {
197
+ border-radius: 8px 8px 0 0;
198
+ }
199
+
200
+ .list-item:last-child {
201
+ border-radius: 0 0 8px 8px;
202
+ margin-bottom: 0;
203
+ }
204
+
205
+ .list-item-content {
206
+ flex: 1;
207
+ }
208
+
209
+ .list-item-title {
210
+ font-size: 15px;
211
+ font-weight: 500;
212
+ margin-bottom: 4px;
213
+ }
214
+
215
+ .list-item-desc {
216
+ font-size: 12px;
217
+ color: var(--van-text-color-2);
218
+ }
219
+
220
+ .list-item-right {
221
+ color: var(--van-text-color-3);
222
+ }
223
+
224
+ /* Bottom Tab Bar */
225
+ .tab-bar {
226
+ position: fixed;
227
+ bottom: 0;
228
+ left: 50%;
229
+ transform: translateX(-50%);
230
+ width: 100%;
231
+ max-width: var(--app-max-width);
232
+ height: 50px;
233
+ background: white;
234
+ display: flex;
235
+ border-top: 1px solid var(--van-border-color);
236
+ z-index: 100;
237
+ }
238
+
239
+ .tab-item {
240
+ flex: 1;
241
+ display: flex;
242
+ flex-direction: column;
243
+ align-items: center;
244
+ justify-content: center;
245
+ font-size: 10px;
246
+ color: var(--van-text-color-2);
247
+ cursor: pointer;
248
+ }
249
+
250
+ .tab-item.active {
251
+ color: var(--van-primary-color);
252
+ }
253
+
254
+ .tab-icon {
255
+ font-size: 20px;
256
+ margin-bottom: 2px;
257
+ }
258
+
259
+ /* Highlight changed areas */
260
+ .highlight-new {
261
+ border: 2px dashed var(--van-primary-color);
262
+ background: rgba(25, 137, 250, 0.05);
263
+ border-radius: 8px;
264
+ }
265
+
266
+ /* Pull to refresh indicator */
267
+ .pull-refresh {
268
+ text-align: center;
269
+ padding: 10px;
270
+ color: var(--van-text-color-2);
271
+ font-size: 12px;
272
+ }
273
+
274
+ /* Floating Action Button */
275
+ .fab {
276
+ position: fixed;
277
+ bottom: 70px;
278
+ right: 20px;
279
+ width: 56px;
280
+ height: 56px;
281
+ border-radius: 50%;
282
+ background: var(--van-primary-color);
283
+ color: white;
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ font-size: 24px;
288
+ box-shadow: 0 4px 12px rgba(25, 137, 250, 0.4);
289
+ cursor: pointer;
290
+ z-index: 50;
291
+ }
292
+ </style>
293
+ </head>
294
+ <body>
295
+ <div class="status-bar">
296
+ <span class="back-btn">‹</span>
297
+ {{PAGE_TITLE}}
298
+ </div>
299
+
300
+ <div class="content">
301
+ <div class="pull-refresh">下拉刷新</div>
302
+
303
+ <div class="van-cell-group">
304
+ <div class="van-cell van-cell-arrow">
305
+ <span>筛选条件</span>
306
+ <span class="van-cell-value">全部</span>
307
+ </div>
308
+ </div>
309
+
310
+ <div class="list-item">
311
+ <div class="list-item-content">
312
+ <div class="list-item-title">{{ITEM_TITLE}}</div>
313
+ <div class="list-item-desc">{{ITEM_DESC}}</div>
314
+ </div>
315
+ <div class="list-item-right">
316
+ <span class="van-tag van-tag-success">正常</span>
317
+ </div>
318
+ </div>
319
+
320
+ {{LIST_ITEMS}}
321
+
322
+ <div style="padding: 16px;">
323
+ <button class="van-button van-button-primary">加载更多</button>
324
+ </div>
325
+ </div>
326
+
327
+ <div class="fab">+</div>
328
+
329
+ <div class="tab-bar">
330
+ <div class="tab-item active">
331
+ <span class="tab-icon">🏠</span>
332
+ <span>首页</span>
333
+ </div>
334
+ <div class="tab-item">
335
+ <span class="tab-icon">📋</span>
336
+ <span>任务</span>
337
+ </div>
338
+ <div class="tab-item">
339
+ <span class="tab-icon">👤</span>
340
+ <span>我的</span>
341
+ </div>
342
+ </div>
343
+ </body>
344
+ </html>
@@ -0,0 +1,310 @@
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}} - Web 管理端</title>
7
+ <style>
8
+ :root {
9
+ /* Vben Admin Design Tokens */
10
+ --primary: 212 100% 45%;
11
+ --primary-light: 212 100% 95%;
12
+ --destructive: 359.33 100% 65.1%;
13
+ --success: 144 57% 58%;
14
+ --warning: 42 84% 61%;
15
+
16
+ --background: 0 0% 100%;
17
+ --background-deep: 216 20.11% 95.47%;
18
+ --card: 0 0% 100%;
19
+
20
+ --foreground: 210 6% 21%;
21
+ --muted-foreground: 240 3.8% 46.1%;
22
+
23
+ --border: 240 5.9% 90%;
24
+ --input: 240deg 5.88% 90%;
25
+
26
+ --radius: 0.5rem;
27
+ --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
28
+ }
29
+
30
+ * { margin: 0; padding: 0; box-sizing: border-box; }
31
+
32
+ body {
33
+ font-family: var(--font-family);
34
+ background: hsl(var(--background-deep));
35
+ color: hsl(var(--foreground));
36
+ min-height: 100vh;
37
+ }
38
+
39
+ .layout {
40
+ display: flex;
41
+ min-height: 100vh;
42
+ }
43
+
44
+ .sidebar {
45
+ width: 200px;
46
+ background: hsl(var(--background));
47
+ border-right: 1px solid hsl(var(--border));
48
+ padding: 16px 0;
49
+ }
50
+
51
+ .sidebar-item {
52
+ padding: 12px 24px;
53
+ cursor: pointer;
54
+ color: hsl(var(--muted-foreground));
55
+ transition: all 0.2s;
56
+ }
57
+
58
+ .sidebar-item:hover,
59
+ .sidebar-item.active {
60
+ background: hsl(var(--primary-light));
61
+ color: hsl(var(--primary));
62
+ }
63
+
64
+ .main-content {
65
+ flex: 1;
66
+ padding: 24px;
67
+ }
68
+
69
+ .breadcrumb {
70
+ margin-bottom: 16px;
71
+ color: hsl(var(--muted-foreground));
72
+ font-size: 14px;
73
+ }
74
+
75
+ .breadcrumb span { color: hsl(var(--primary)); }
76
+
77
+ .page-header {
78
+ display: flex;
79
+ justify-content: space-between;
80
+ align-items: center;
81
+ margin-bottom: 16px;
82
+ }
83
+
84
+ .page-title {
85
+ font-size: 20px;
86
+ font-weight: 600;
87
+ }
88
+
89
+ .card {
90
+ background: hsl(var(--card));
91
+ border-radius: var(--radius);
92
+ border: 1px solid hsl(var(--border));
93
+ padding: 16px;
94
+ margin-bottom: 16px;
95
+ }
96
+
97
+ /* VxeGrid Table Style */
98
+ .vxe-table {
99
+ width: 100%;
100
+ border-collapse: collapse;
101
+ }
102
+
103
+ .vxe-table-header {
104
+ background: hsl(220deg 13% 95%);
105
+ }
106
+
107
+ .vxe-table-header th {
108
+ padding: 12px 16px;
109
+ text-align: left;
110
+ font-weight: 500;
111
+ color: hsl(0deg 0% 12%);
112
+ border-bottom: 1px solid hsl(0deg 0% 94%);
113
+ }
114
+
115
+ .vxe-table-body td {
116
+ padding: 12px 16px;
117
+ border-bottom: 1px solid hsl(var(--border));
118
+ }
119
+
120
+ .vxe-table-body tr:hover {
121
+ background: hsl(var(--primary) / 0.05);
122
+ }
123
+
124
+ /* Search Form */
125
+ .search-form {
126
+ display: flex;
127
+ flex-wrap: wrap;
128
+ gap: 12px;
129
+ margin-bottom: 16px;
130
+ padding: 16px;
131
+ background: hsl(var(--card));
132
+ border-radius: var(--radius);
133
+ border: 1px solid hsl(var(--border));
134
+ }
135
+
136
+ .form-item {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 8px;
140
+ }
141
+
142
+ .form-item label {
143
+ font-size: 14px;
144
+ color: hsl(var(--muted-foreground));
145
+ white-space: nowrap;
146
+ }
147
+
148
+ .form-item input,
149
+ .form-item select {
150
+ height: 32px;
151
+ padding: 0 12px;
152
+ border: 1px solid hsl(var(--input));
153
+ border-radius: var(--radius);
154
+ background: hsl(var(--background));
155
+ font-size: 14px;
156
+ min-width: 200px;
157
+ }
158
+
159
+ .form-item input:focus,
160
+ .form-item select:focus {
161
+ outline: none;
162
+ border-color: hsl(var(--primary));
163
+ box-shadow: 0 0 0 2px hsl(var(--primary) / 0.2);
164
+ }
165
+
166
+ /* Buttons */
167
+ .btn {
168
+ height: 32px;
169
+ padding: 0 16px;
170
+ border-radius: var(--radius);
171
+ font-size: 14px;
172
+ cursor: pointer;
173
+ border: 1px solid transparent;
174
+ transition: all 0.2s;
175
+ }
176
+
177
+ .btn-primary {
178
+ background: hsl(var(--primary));
179
+ color: white;
180
+ }
181
+
182
+ .btn-primary:hover {
183
+ background: hsl(var(--primary) / 0.9);
184
+ }
185
+
186
+ .btn-outline {
187
+ background: transparent;
188
+ border-color: hsl(var(--border));
189
+ color: hsl(var(--foreground));
190
+ }
191
+
192
+ .btn-outline:hover {
193
+ border-color: hsl(var(--primary));
194
+ color: hsl(var(--primary));
195
+ }
196
+
197
+ .btn-danger {
198
+ background: hsl(var(--destructive));
199
+ color: white;
200
+ }
201
+
202
+ .actions {
203
+ display: flex;
204
+ gap: 8px;
205
+ }
206
+
207
+ .tag {
208
+ display: inline-block;
209
+ padding: 2px 8px;
210
+ border-radius: 4px;
211
+ font-size: 12px;
212
+ }
213
+
214
+ .tag-success {
215
+ background: hsl(var(--success) / 0.1);
216
+ color: hsl(var(--success));
217
+ }
218
+
219
+ .tag-warning {
220
+ background: hsl(var(--warning) / 0.1);
221
+ color: hsl(var(--warning));
222
+ }
223
+
224
+ .tag-danger {
225
+ background: hsl(var(--destructive) / 0.1);
226
+ color: hsl(var(--destructive));
227
+ }
228
+
229
+ .pagination {
230
+ display: flex;
231
+ justify-content: flex-end;
232
+ align-items: center;
233
+ gap: 8px;
234
+ margin-top: 16px;
235
+ }
236
+
237
+ .page-btn {
238
+ width: 32px;
239
+ height: 32px;
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ border: 1px solid hsl(var(--border));
244
+ border-radius: var(--radius);
245
+ background: hsl(var(--background));
246
+ cursor: pointer;
247
+ }
248
+
249
+ .page-btn.active {
250
+ background: hsl(var(--primary));
251
+ color: white;
252
+ border-color: hsl(var(--primary));
253
+ }
254
+
255
+ /* Highlight changed areas */
256
+ .highlight-new {
257
+ border: 2px dashed hsl(var(--primary));
258
+ background: hsl(var(--primary) / 0.05);
259
+ }
260
+ </style>
261
+ </head>
262
+ <body>
263
+ <div class="layout">
264
+ <div class="sidebar">
265
+ <div class="sidebar-item active">{{MODULE_NAME}}</div>
266
+ <div class="sidebar-item">其他模块...</div>
267
+ </div>
268
+
269
+ <div class="main-content">
270
+ <div class="breadcrumb">
271
+ 首页 / {{MODULE_NAME}} / <span>{{PAGE_NAME}}</span>
272
+ </div>
273
+
274
+ <div class="page-header">
275
+ <h1 class="page-title">{{PAGE_NAME}}</h1>
276
+ <div class="actions">
277
+ <button class="btn btn-outline">导出</button>
278
+ <button class="btn btn-primary">新增</button>
279
+ </div>
280
+ </div>
281
+
282
+ <div class="card">
283
+ <div class="search-form">
284
+ {{SEARCH_FORM_FIELDS}}
285
+ </div>
286
+
287
+ <table class="vxe-table">
288
+ <thead class="vxe-table-header">
289
+ <tr>
290
+ {{TABLE_HEADERS}}
291
+ </tr>
292
+ </thead>
293
+ <tbody class="vxe-table-body">
294
+ {{TABLE_ROWS}}
295
+ </tbody>
296
+ </table>
297
+
298
+ <div class="pagination">
299
+ <span>共 100 条</span>
300
+ <div class="page-btn">1</div>
301
+ <div class="page-btn">2</div>
302
+ <div class="page-btn">3</div>
303
+ <div class="page-btn">...</div>
304
+ <div class="page-btn">10</div>
305
+ </div>
306
+ </div>
307
+ </div>
308
+ </div>
309
+ </body>
310
+ </html>