@templmf/temp-solf-lmf 0.0.1 → 0.0.2
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.
- package/1.md +37 -2
- package/README.md +1 -0
- package/jserror.txt +1 -0
- package/package.json +1 -1
- package/rollup.config.js +36 -0
- package/test.txt +73 -0
- package/vue2toxlsx.txt +399 -0
- package//344/276/235/350/265/226 +5 -0
package/1.md
CHANGED
|
@@ -1,2 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
1. **系统稳定性验证**
|
|
2
|
+
- 系统持续运行时长:__天(建议≥30天)
|
|
3
|
+
- 服务可用率:__%(要求≥99.9%)
|
|
4
|
+
- 核心业务故障次数:0次(或具体次数及解决时效)
|
|
5
|
+
- 系统自动恢复能力验证:通过模拟网络中断/服务重启测试(附测试报告)
|
|
6
|
+
|
|
7
|
+
2. **性能指标达成**
|
|
8
|
+
| 指标项 | 合同要求 | 实测值 | 达标情况 |
|
|
9
|
+
|----------------|---------|-------|---------|
|
|
10
|
+
| 并发用户支持量 | 1000 | 1200 | ✔️ |
|
|
11
|
+
| 核心事务响应时间 | ≤2s | 1.3s | ✔️ |
|
|
12
|
+
| 月结批处理时效 | ≤4小时 | 3.2小时| ✔️ |
|
|
13
|
+
|
|
14
|
+
3. **问题处理机制验证**
|
|
15
|
+
- 累计处理生产问题:__例(含紧急事件__例)
|
|
16
|
+
- 平均问题响应时间:≤1小时(合同要求)
|
|
17
|
+
- 重大问题解决时效:≤4小时(合同要求)
|
|
18
|
+
- 提交优化建议采纳率:__%(例:8/10)
|
|
19
|
+
|
|
20
|
+
4. **业务部门反馈**
|
|
21
|
+
- 用户满意度调查:平均分__/5分(覆盖__个部门)
|
|
22
|
+
- 关键用户评价摘录:
|
|
23
|
+
> "系统上线后订单处理效率提升40%,月末峰值期运行平稳"——销售部
|
|
24
|
+
> "数据报表生成时效从6小时缩短至1.5小时"——财务部
|
|
25
|
+
|
|
26
|
+
5. **运维支持文档移交**
|
|
27
|
+
- 已接收文档清单:
|
|
28
|
+
✅ 系统运维手册
|
|
29
|
+
✅ 故障应急处理预案
|
|
30
|
+
✅ 性能监控方案
|
|
31
|
+
✅ 备份恢复操作指南
|
|
32
|
+
|
|
33
|
+
**验收结论**:
|
|
34
|
+
☑️ 系统持续运行期间未发生重大故障
|
|
35
|
+
☑️ 性能指标全部达到合同约定标准
|
|
36
|
+
☑️ 供应商运维支持符合SLA要求
|
|
37
|
+
☑️ 业务部门确认满足日常运营需求
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
npm publish --access public
|
package/jserror.txt
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
muscStop. dkkj-ios 11.6.0, 11.5.6, 11.5.5, 11.5.0, 11.4.1, 11.4.0, 11.3.3
|
package/package.json
CHANGED
package/rollup.config.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import resolve from '@rollup/plugin-node-resolve';
|
|
2
|
+
import commonjs from '@rollup/plugin-commonjs';
|
|
3
|
+
import postcss from 'rollup-plugin-postcss';
|
|
4
|
+
import babel from '@rollup/plugin-babel';
|
|
5
|
+
import { terser } from 'rollup-plugin-terser';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
input: 'src/entry.js', // 入口文件:引入整个 ant-design-vue
|
|
9
|
+
output: {
|
|
10
|
+
file: 'dist/antdv.es.js',
|
|
11
|
+
format: 'es',
|
|
12
|
+
sourcemap: false,
|
|
13
|
+
},
|
|
14
|
+
plugins: [
|
|
15
|
+
resolve(),
|
|
16
|
+
commonjs(),
|
|
17
|
+
postcss({
|
|
18
|
+
extract: false, // 不独立提取,样式打进 js 文件
|
|
19
|
+
modules: false,
|
|
20
|
+
use: {
|
|
21
|
+
less: {
|
|
22
|
+
javascriptEnabled: true,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
}),
|
|
26
|
+
babel({
|
|
27
|
+
babelHelpers: 'bundled',
|
|
28
|
+
presets: ['@babel/preset-env'],
|
|
29
|
+
exclude: 'node_modules/**',
|
|
30
|
+
}),
|
|
31
|
+
terser(), // 可选,压缩输出
|
|
32
|
+
],
|
|
33
|
+
external: [
|
|
34
|
+
'vue'
|
|
35
|
+
], // 如果你想把 vue 一起打进去,可以不要 external
|
|
36
|
+
};
|
package/test.txt
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
自定义异常指标
|
|
2
|
+
一、通用类自定义异常
|
|
3
|
+
1. 网络请求异常 (NET_)
|
|
4
|
+
请求超时错误: NET_TIMEOUT 请求url
|
|
5
|
+
|
|
6
|
+
2. 兼容性异常 (CPT_)
|
|
7
|
+
不支持某方法:CPT_WEBAIP 方法名
|
|
8
|
+
|
|
9
|
+
3. 资源加载异常 (RES_)
|
|
10
|
+
资源加载失败: RES_SCRIPT 资源url 状态码
|
|
11
|
+
|
|
12
|
+
有其他通用类场景可告知架构,一起制定规范
|
|
13
|
+
|
|
14
|
+
二、业务类自定义异常
|
|
15
|
+
1. 数据处理异常 (S_DATA_)
|
|
16
|
+
JSON解析异常: S_DATA_JSON 数据
|
|
17
|
+
不存在对象或者方法:S_DATA_OBJ 对象或者方法
|
|
18
|
+
|
|
19
|
+
2. 业务逻辑异常 (S_BIZ_)
|
|
20
|
+
权限验证失败: S_BIZ_AUTH 权限
|
|
21
|
+
业务规则异常: S_BIZ_RULE 规则
|
|
22
|
+
业务状态异常: S_BIZ_STATE 业务内容
|
|
23
|
+
|
|
24
|
+
3. API使用异常 (S_API_)
|
|
25
|
+
API调用失败返回值不符合预期: S_API_DATA API,data值字符串
|
|
26
|
+
|
|
27
|
+
4. 用户交互异常 (S_UI_)
|
|
28
|
+
表单验证错误: S_UI_FORM 关键内容
|
|
29
|
+
用户输入错误: S_UI_INPUT 关键内容
|
|
30
|
+
|
|
31
|
+
5. 项目组其他自定义异常 (S_类型_子类)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
自定义事件(正向信息,非异常类)
|
|
35
|
+
1、业务流程类 (S_BIZ_事件名) 中文名命名规范: 业务类_子类_事件名
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
初创级(日活 < 1万)
|
|
39
|
+
* LCP (Largest Contentful Paint): < 3.0秒
|
|
40
|
+
* FP (First Paint): < 2.0秒
|
|
41
|
+
* FCP (First Contentful Paint): < 2.5秒
|
|
42
|
+
* JS异常率: < 1.0%
|
|
43
|
+
成长级(日活 1万-10万)
|
|
44
|
+
* LCP: < 2.5秒
|
|
45
|
+
* FP: < 1.5秒
|
|
46
|
+
* FCP: < 2.0秒
|
|
47
|
+
* JS异常率: < 0.8%
|
|
48
|
+
规模级(日活 10万-100万)
|
|
49
|
+
* LCP: < 2.0秒
|
|
50
|
+
* FP: < 1.2秒
|
|
51
|
+
* FCP: < 1.5秒
|
|
52
|
+
* JS异常率: < 0.5%
|
|
53
|
+
大型级(日活 100万-1000万)
|
|
54
|
+
* LCP: < 1.5秒
|
|
55
|
+
* FP: < 1.0秒
|
|
56
|
+
* FCP: < 1.2秒
|
|
57
|
+
* JS异常率: < 0.3%
|
|
58
|
+
超大型级(日活 > 1000万)
|
|
59
|
+
* LCP: < 1.2秒
|
|
60
|
+
* FP: < 0.8秒
|
|
61
|
+
* FCP: < 1.0秒
|
|
62
|
+
* JS异常率: < 0.1%
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
10. 性能异常 (PERF_)
|
|
71
|
+
内存泄漏: PERF_MEMORY_LEAK
|
|
72
|
+
长任务阻塞: PERF_LONG_TASK
|
|
73
|
+
渲染性能问题: PERF_RENDER
|
package/vue2toxlsx.txt
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
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>Vue2 JSON导出Excel</title>
|
|
7
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js"></script>
|
|
8
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
|
|
9
|
+
<style>
|
|
10
|
+
* {
|
|
11
|
+
margin: 0;
|
|
12
|
+
padding: 0;
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
body {
|
|
17
|
+
font-family: 'Arial', sans-serif;
|
|
18
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
19
|
+
min-height: 100vh;
|
|
20
|
+
padding: 20px;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.container {
|
|
24
|
+
max-width: 1200px;
|
|
25
|
+
margin: 0 auto;
|
|
26
|
+
background: white;
|
|
27
|
+
border-radius: 15px;
|
|
28
|
+
padding: 30px;
|
|
29
|
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
h1 {
|
|
33
|
+
text-align: center;
|
|
34
|
+
color: #333;
|
|
35
|
+
margin-bottom: 30px;
|
|
36
|
+
font-size: 2rem;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.data-section {
|
|
40
|
+
margin-bottom: 30px;
|
|
41
|
+
padding: 20px;
|
|
42
|
+
background: #f8f9fa;
|
|
43
|
+
border-radius: 10px;
|
|
44
|
+
border: 1px solid #e9ecef;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.data-section h3 {
|
|
48
|
+
color: #495057;
|
|
49
|
+
margin-bottom: 15px;
|
|
50
|
+
font-size: 1.2rem;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.data-preview {
|
|
54
|
+
background: white;
|
|
55
|
+
border-radius: 8px;
|
|
56
|
+
padding: 15px;
|
|
57
|
+
max-height: 300px;
|
|
58
|
+
overflow-y: auto;
|
|
59
|
+
border: 1px solid #dee2e6;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.data-table {
|
|
63
|
+
width: 100%;
|
|
64
|
+
border-collapse: collapse;
|
|
65
|
+
font-size: 14px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.data-table th,
|
|
69
|
+
.data-table td {
|
|
70
|
+
padding: 8px 12px;
|
|
71
|
+
text-align: left;
|
|
72
|
+
border-bottom: 1px solid #dee2e6;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.data-table th {
|
|
76
|
+
background: #f8f9fa;
|
|
77
|
+
font-weight: 600;
|
|
78
|
+
color: #495057;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.data-table tbody tr:hover {
|
|
82
|
+
background: #f8f9fa;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.export-btn {
|
|
86
|
+
display: block;
|
|
87
|
+
width: 200px;
|
|
88
|
+
margin: 30px auto;
|
|
89
|
+
padding: 15px 30px;
|
|
90
|
+
background: linear-gradient(135deg, #28a745, #20c997);
|
|
91
|
+
color: white;
|
|
92
|
+
border: none;
|
|
93
|
+
border-radius: 50px;
|
|
94
|
+
font-size: 16px;
|
|
95
|
+
font-weight: 600;
|
|
96
|
+
cursor: pointer;
|
|
97
|
+
transition: all 0.3s ease;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.export-btn:hover {
|
|
101
|
+
transform: translateY(-2px);
|
|
102
|
+
box-shadow: 0 8px 20px rgba(40, 167, 69, 0.3);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.export-btn:disabled {
|
|
106
|
+
background: #6c757d;
|
|
107
|
+
cursor: not-allowed;
|
|
108
|
+
transform: none;
|
|
109
|
+
box-shadow: none;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.stats {
|
|
113
|
+
display: flex;
|
|
114
|
+
justify-content: space-around;
|
|
115
|
+
background: #495057;
|
|
116
|
+
color: white;
|
|
117
|
+
padding: 15px;
|
|
118
|
+
border-radius: 10px;
|
|
119
|
+
margin-bottom: 20px;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.stat-item {
|
|
123
|
+
text-align: center;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.stat-number {
|
|
127
|
+
font-size: 1.5rem;
|
|
128
|
+
font-weight: bold;
|
|
129
|
+
display: block;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.stat-label {
|
|
133
|
+
font-size: 0.9rem;
|
|
134
|
+
opacity: 0.8;
|
|
135
|
+
}
|
|
136
|
+
</style>
|
|
137
|
+
</head>
|
|
138
|
+
<body>
|
|
139
|
+
<div id="app">
|
|
140
|
+
<div class="container">
|
|
141
|
+
<h1>📊 Vue2 JSON导出Excel</h1>
|
|
142
|
+
|
|
143
|
+
<div class="stats">
|
|
144
|
+
<div class="stat-item">
|
|
145
|
+
<span class="stat-number">{{ jsonData1.length }}</span>
|
|
146
|
+
<span class="stat-label">员工数据</span>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="stat-item">
|
|
149
|
+
<span class="stat-number">{{ jsonData2.length }}</span>
|
|
150
|
+
<span class="stat-label">产品数据</span>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="stat-item">
|
|
153
|
+
<span class="stat-number">{{ jsonData3.length }}</span>
|
|
154
|
+
<span class="stat-label">订单数据</span>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="stat-item">
|
|
157
|
+
<span class="stat-number">{{ totalCount }}</span>
|
|
158
|
+
<span class="stat-label">总计</span>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
|
|
162
|
+
<div class="data-section">
|
|
163
|
+
<h3>👥 员工数据 ({{ jsonData1.length }} 条)</h3>
|
|
164
|
+
<div class="data-preview">
|
|
165
|
+
<table class="data-table" v-if="jsonData1.length > 0">
|
|
166
|
+
<thead>
|
|
167
|
+
<tr>
|
|
168
|
+
<th v-for="key in getKeys(jsonData1)" :key="key">{{ key }}</th>
|
|
169
|
+
</tr>
|
|
170
|
+
</thead>
|
|
171
|
+
<tbody>
|
|
172
|
+
<tr v-for="(item, index) in jsonData1" :key="index">
|
|
173
|
+
<td v-for="key in getKeys(jsonData1)" :key="key">{{ item[key] || '-' }}</td>
|
|
174
|
+
</tr>
|
|
175
|
+
</tbody>
|
|
176
|
+
</table>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div class="data-section">
|
|
181
|
+
<h3>📦 产品数据 ({{ jsonData2.length }} 条)</h3>
|
|
182
|
+
<div class="data-preview">
|
|
183
|
+
<table class="data-table" v-if="jsonData2.length > 0">
|
|
184
|
+
<thead>
|
|
185
|
+
<tr>
|
|
186
|
+
<th v-for="key in getKeys(jsonData2)" :key="key">{{ key }}</th>
|
|
187
|
+
</tr>
|
|
188
|
+
</thead>
|
|
189
|
+
<tbody>
|
|
190
|
+
<tr v-for="(item, index) in jsonData2" :key="index">
|
|
191
|
+
<td v-for="key in getKeys(jsonData2)" :key="key">{{ item[key] || '-' }}</td>
|
|
192
|
+
</tr>
|
|
193
|
+
</tbody>
|
|
194
|
+
</table>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<div class="data-section">
|
|
199
|
+
<h3>📋 订单数据 ({{ jsonData3.length }} 条)</h3>
|
|
200
|
+
<div class="data-preview">
|
|
201
|
+
<table class="data-table" v-if="jsonData3.length > 0">
|
|
202
|
+
<thead>
|
|
203
|
+
<tr>
|
|
204
|
+
<th v-for="key in getKeys(jsonData3)" :key="key">{{ key }}</th>
|
|
205
|
+
</tr>
|
|
206
|
+
</thead>
|
|
207
|
+
<tbody>
|
|
208
|
+
<tr v-for="(item, index) in jsonData3" :key="index">
|
|
209
|
+
<td v-for="key in getKeys(jsonData3)" :key="key">{{ item[key] || '-' }}</td>
|
|
210
|
+
</tr>
|
|
211
|
+
</tbody>
|
|
212
|
+
</table>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<button class="export-btn" @click="exportToExcel" :disabled="totalCount === 0">
|
|
217
|
+
🚀 导出Excel ({{ totalCount }} 条数据)
|
|
218
|
+
</button>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<script>
|
|
223
|
+
new Vue({
|
|
224
|
+
el: '#app',
|
|
225
|
+
data: {
|
|
226
|
+
// 员工数据
|
|
227
|
+
jsonData1: [
|
|
228
|
+
{
|
|
229
|
+
"姓名": "张三",
|
|
230
|
+
"年龄": 25,
|
|
231
|
+
"部门": "技术部",
|
|
232
|
+
"薪资": 8000,
|
|
233
|
+
"入职日期": "2023-01-15"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"姓名": "李四",
|
|
237
|
+
"年龄": 28,
|
|
238
|
+
"部门": "销售部",
|
|
239
|
+
"薪资": 7500,
|
|
240
|
+
"入职日期": "2022-08-20"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"姓名": "王五",
|
|
244
|
+
"年龄": 32,
|
|
245
|
+
"部门": "市场部",
|
|
246
|
+
"薪资": 9000,
|
|
247
|
+
"入职日期": "2021-03-10"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"姓名": "赵六",
|
|
251
|
+
"年龄": 26,
|
|
252
|
+
"部门": "技术部",
|
|
253
|
+
"薪资": 8500,
|
|
254
|
+
"入职日期": "2023-05-20"
|
|
255
|
+
}
|
|
256
|
+
],
|
|
257
|
+
|
|
258
|
+
// 产品数据
|
|
259
|
+
jsonData2: [
|
|
260
|
+
{
|
|
261
|
+
"产品ID": "P001",
|
|
262
|
+
"产品名称": "iPhone 15",
|
|
263
|
+
"价格": 5999,
|
|
264
|
+
"库存": 100,
|
|
265
|
+
"分类": "手机"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"产品ID": "P002",
|
|
269
|
+
"产品名称": "MacBook Pro",
|
|
270
|
+
"价格": 12999,
|
|
271
|
+
"库存": 50,
|
|
272
|
+
"分类": "电脑"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"产品ID": "P003",
|
|
276
|
+
"产品名称": "iPad Air",
|
|
277
|
+
"价格": 4399,
|
|
278
|
+
"库存": 75,
|
|
279
|
+
"分类": "平板"
|
|
280
|
+
}
|
|
281
|
+
],
|
|
282
|
+
|
|
283
|
+
// 订单数据
|
|
284
|
+
jsonData3: [
|
|
285
|
+
{
|
|
286
|
+
"订单号": "ORD001",
|
|
287
|
+
"客户名称": "王先生",
|
|
288
|
+
"产品": "iPhone 15",
|
|
289
|
+
"数量": 2,
|
|
290
|
+
"金额": 11998,
|
|
291
|
+
"销售日期": "2023-11-01"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"订单号": "ORD002",
|
|
295
|
+
"客户名称": "李女士",
|
|
296
|
+
"产品": "MacBook Pro",
|
|
297
|
+
"数量": 1,
|
|
298
|
+
"金额": 12999,
|
|
299
|
+
"销售日期": "2023-11-02"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"订单号": "ORD003",
|
|
303
|
+
"客户名称": "张总",
|
|
304
|
+
"产品": "iPad Air",
|
|
305
|
+
"数量": 3,
|
|
306
|
+
"金额": 13197,
|
|
307
|
+
"销售日期": "2023-11-03"
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"订单号": "ORD004",
|
|
311
|
+
"客户名称": "陈经理",
|
|
312
|
+
"产品": "iPhone 15",
|
|
313
|
+
"数量": 1,
|
|
314
|
+
"金额": 5999,
|
|
315
|
+
"销售日期": "2023-11-04"
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"订单号": "ORD005",
|
|
319
|
+
"客户名称": "刘老师",
|
|
320
|
+
"产品": "MacBook Pro",
|
|
321
|
+
"数量": 2,
|
|
322
|
+
"金额": 25998,
|
|
323
|
+
"销售日期": "2023-11-05"
|
|
324
|
+
}
|
|
325
|
+
]
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
computed: {
|
|
329
|
+
totalCount() {
|
|
330
|
+
return this.jsonData1.length + this.jsonData2.length + this.jsonData3.length;
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
|
|
334
|
+
methods: {
|
|
335
|
+
// 获取对象数组的所有键名
|
|
336
|
+
getKeys(dataArray) {
|
|
337
|
+
if (!dataArray || dataArray.length === 0) return [];
|
|
338
|
+
return Object.keys(dataArray[0]);
|
|
339
|
+
},
|
|
340
|
+
|
|
341
|
+
// 导出到Excel
|
|
342
|
+
exportToExcel() {
|
|
343
|
+
try {
|
|
344
|
+
// 创建工作簿
|
|
345
|
+
const wb = XLSX.utils.book_new();
|
|
346
|
+
|
|
347
|
+
// 添加员工数据工作表
|
|
348
|
+
if (this.jsonData1.length > 0) {
|
|
349
|
+
const ws1 = XLSX.utils.json_to_sheet(this.jsonData1);
|
|
350
|
+
this.setColumnWidth(ws1);
|
|
351
|
+
XLSX.utils.book_append_sheet(wb, ws1, '员工信息');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// 添加产品数据工作表
|
|
355
|
+
if (this.jsonData2.length > 0) {
|
|
356
|
+
const ws2 = XLSX.utils.json_to_sheet(this.jsonData2);
|
|
357
|
+
this.setColumnWidth(ws2);
|
|
358
|
+
XLSX.utils.book_append_sheet(wb, ws2, '产品信息');
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// 添加订单数据工作表
|
|
362
|
+
if (this.jsonData3.length > 0) {
|
|
363
|
+
const ws3 = XLSX.utils.json_to_sheet(this.jsonData3);
|
|
364
|
+
this.setColumnWidth(ws3);
|
|
365
|
+
XLSX.utils.book_append_sheet(wb, ws3, '订单信息');
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// 生成文件名
|
|
369
|
+
const now = new Date();
|
|
370
|
+
const fileName = `数据导出_${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}_${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}.xlsx`;
|
|
371
|
+
|
|
372
|
+
// 导出文件
|
|
373
|
+
XLSX.writeFile(wb, fileName);
|
|
374
|
+
|
|
375
|
+
alert(`Excel文件导出成功!\n文件名:${fileName}\n包含 ${Object.keys(wb.Sheets).length} 个工作表,共 ${this.totalCount} 条数据`);
|
|
376
|
+
} catch (error) {
|
|
377
|
+
alert(`导出失败:${error.message}`);
|
|
378
|
+
console.error('导出错误:', error);
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
|
|
382
|
+
// 设置列宽
|
|
383
|
+
setColumnWidth(worksheet) {
|
|
384
|
+
if (!worksheet['!ref']) return;
|
|
385
|
+
|
|
386
|
+
const range = XLSX.utils.decode_range(worksheet['!ref']);
|
|
387
|
+
const cols = [];
|
|
388
|
+
|
|
389
|
+
for (let c = range.s.c; c <= range.e.c; c++) {
|
|
390
|
+
cols.push({ wch: 15 });
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
worksheet['!cols'] = cols;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
</script>
|
|
398
|
+
</body>
|
|
399
|
+
</html>
|