matrix_components 2.0.306 → 2.0.309

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.
@@ -0,0 +1,143 @@
1
+ <template>
2
+ <div class="image-demo">
3
+ <h2>NsImage 组件测试</h2>
4
+
5
+ <div class="demo-section">
6
+ <h3>1. 正常图片加载测试</h3>
7
+ <p>使用有效的图片URL</p>
8
+ <NsImage
9
+ :src="validImageUrl"
10
+ alt="有效图片"
11
+ width="300"
12
+ height="200"
13
+ style="border: 1px solid #ccc; border-radius: 8px;"
14
+ />
15
+ </div>
16
+
17
+ <div class="demo-section">
18
+ <h3>2. 图片加载失败测试</h3>
19
+ <p>使用不存在的图片URL,应该显示默认图片</p>
20
+ <NsImage
21
+ :src="invalidImageUrl"
22
+ alt="无效图片"
23
+ width="300"
24
+ height="200"
25
+ style="border: 1px solid #ccc; border-radius: 8px;"
26
+ />
27
+ </div>
28
+
29
+ <div class="demo-section">
30
+ <h3>3. 动态切换测试</h3>
31
+ <p>点击按钮切换图片URL</p>
32
+ <div style="margin-bottom: 10px;">
33
+ <button @click="toggleImage" style="padding: 8px 16px; margin-right: 10px;">
34
+ 切换图片 (当前: {{ currentImageType }})
35
+ </button>
36
+ <button @click="useRandomInvalidUrl" style="padding: 8px 16px;">
37
+ 使用随机无效URL
38
+ </button>
39
+ </div>
40
+ <NsImage
41
+ :src="dynamicImageUrl"
42
+ alt="动态图片"
43
+ width="300"
44
+ height="200"
45
+ style="border: 1px solid #ccc; border-radius: 8px;"
46
+ />
47
+ </div>
48
+
49
+ <div class="demo-section">
50
+ <h3>4. 多个实例测试</h3>
51
+ <p>测试多个NsImage组件同时使用</p>
52
+ <div style="display: flex; gap: 20px; flex-wrap: wrap;">
53
+ <NsImage
54
+ :src="validImageUrl"
55
+ alt="图片1"
56
+ width="150"
57
+ height="100"
58
+ style="border: 1px solid #ccc; border-radius: 4px;"
59
+ />
60
+ <NsImage
61
+ src="/nonexistent1.jpg"
62
+ error="data:image/png;base64,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"
63
+ alt="图片2"
64
+ width="150"
65
+ height="100"
66
+ style="border: 1px solid #ccc; border-radius: 4px;"
67
+ />
68
+ <NsImage
69
+ src="/nonexistent2.jpg"
70
+ error="http://199.10.9.178:8081/static/rapture/resources/icons/x32/nexus.png"
71
+ alt="图片3"
72
+ width="150"
73
+ height="100"
74
+ style="border: 1px solid #ccc; border-radius: 4px;"
75
+ />
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </template>
80
+
81
+ <script setup lang="ts">
82
+ import { ref } from 'vue'
83
+
84
+ const validImageUrl = ref('http://199.10.10.67:10000/juzhenManage/assets/bg-cTuRoWal.png')
85
+ const invalidImageUrl = ref('/nonexistent/image.jpg')
86
+
87
+ const dynamicImageUrl = ref(validImageUrl.value)
88
+ const currentImageType = ref('有效图片')
89
+
90
+ const toggleImage = () => {
91
+ if (dynamicImageUrl.value === validImageUrl.value) {
92
+ dynamicImageUrl.value = invalidImageUrl.value
93
+ currentImageType.value = '无效图片'
94
+ } else {
95
+ dynamicImageUrl.value = validImageUrl.value
96
+ currentImageType.value = '有效图片'
97
+ }
98
+ }
99
+
100
+ const useRandomInvalidUrl = () => {
101
+ dynamicImageUrl.value = `/random-invalid-${Date.now()}.jpg`
102
+ currentImageType.value = '随机无效图片'
103
+ }
104
+ </script>
105
+
106
+ <style scoped>
107
+ .image-demo {
108
+ padding: 20px;
109
+ max-width: 800px;
110
+ margin: 0 auto;
111
+ }
112
+
113
+ .demo-section {
114
+ margin-bottom: 40px;
115
+ padding: 20px;
116
+ border: 1px solid #e0e0e0;
117
+ border-radius: 8px;
118
+ background-color: #fafafa;
119
+ }
120
+
121
+ .demo-section h3 {
122
+ margin-top: 0;
123
+ color: #333;
124
+ }
125
+
126
+ .demo-section p {
127
+ color: #666;
128
+ margin-bottom: 15px;
129
+ }
130
+
131
+ button {
132
+ background-color: #409eff;
133
+ color: white;
134
+ border: none;
135
+ border-radius: 4px;
136
+ cursor: pointer;
137
+ transition: background-color 0.3s;
138
+ }
139
+
140
+ button:hover {
141
+ background-color: #337ecc;
142
+ }
143
+ </style>
@@ -0,0 +1,189 @@
1
+ <template>
2
+ <div class="office-demo">
3
+ <h2>NsOffice 组件演示</h2>
4
+
5
+ <div class="demo-controls">
6
+ <!-- 文件上传方式 -->
7
+ <div class="upload-section">
8
+ <h3>方式一:文件上传</h3>
9
+ <input
10
+ type="file"
11
+ @change="importFile(($event.target as any)?.files?.[0])"
12
+ accept=".docx,.xlsx,.xls,.pdf"
13
+ />
14
+ <el-button @click="clearFile" :disabled="!file">清除文件</el-button>
15
+ </div>
16
+
17
+ <!-- URL方式 -->
18
+ <el-form :model="form" label-width="120px" inline>
19
+ <el-form-item label="文件URL:">
20
+ <el-input v-model="form.url" placeholder="请输入文件URL" style="width: 400px" />
21
+ </el-form-item>
22
+
23
+ <el-form-item label="Excel编辑模式:">
24
+ <el-switch v-model="form.isEdit" />
25
+ </el-form-item>
26
+
27
+ <el-form-item>
28
+ <el-button type="primary" @click="loadFile">加载文件</el-button>
29
+ <el-button @click="clearUrl">清空</el-button>
30
+ </el-form-item>
31
+ </el-form>
32
+ </div>
33
+
34
+ <div class="demo-content">
35
+ <el-card v-if="currentUrl">
36
+ <template #header>
37
+ <div class="card-header">
38
+ <span>当前文件: {{ getFileName(currentUrl) }}</span>
39
+ <span class="file-type">类型: {{ getFileTypeDisplay() }}</span>
40
+ </div>
41
+ </template>
42
+
43
+ <div class="office-container">
44
+ <NsOffice v-bind="form" ref="officeRef" />
45
+ </div>
46
+ </el-card>
47
+
48
+ <el-empty v-else description="请输入文件URL或选择预设文件" />
49
+ </div>
50
+ </div>
51
+ </template>
52
+
53
+ <script setup lang="ts">
54
+ import { ref, reactive } from 'vue'
55
+ const form = reactive({
56
+ url: '',
57
+ isEdit: false,
58
+ isShowDialog: false,
59
+ dialogWidth: '1200px',
60
+ dialogHeight: '700px',
61
+ })
62
+
63
+ const currentUrl = ref('')
64
+ const officeRef = ref()
65
+ const file = ref()
66
+
67
+ // 文件上传处理
68
+ function importFile(f: any) {
69
+ // 清除URL,使用文件上传
70
+ form.url = ''
71
+ file.value = f
72
+
73
+ if (f && (f.name.endsWith('.docx') || f.name.endsWith('.xlsx') || f.name.endsWith('.xls') || f.name.endsWith('.pdf'))) {
74
+ // 创建文件URL
75
+ const fileUrl = URL.createObjectURL(f)
76
+ currentUrl.value = fileUrl
77
+ form.url = fileUrl
78
+ } else if (f) {
79
+ alert('请选择支持的文件格式(.docx, .xlsx, .xls, .pdf)')
80
+ clearFile()
81
+ }
82
+ }
83
+
84
+ const loadFile = () => {
85
+ if (form.url.trim()) {
86
+ currentUrl.value = form.url.trim()
87
+ }
88
+ }
89
+
90
+ const clearFile = () => {
91
+ file.value = null
92
+ if (currentUrl.value.startsWith('blob:')) {
93
+ URL.revokeObjectURL(currentUrl.value)
94
+ }
95
+ currentUrl.value = ''
96
+ form.url = ''
97
+ }
98
+
99
+ const clearUrl = () => {
100
+ form.url = ''
101
+ currentUrl.value = ''
102
+ }
103
+
104
+ const getFileName = (url: string) => {
105
+ if (!url) return ''
106
+ const parts = url.split('/')
107
+ return parts[parts.length - 1]
108
+ }
109
+
110
+ const getFileTypeDisplay = () => {
111
+ if (officeRef.value) {
112
+ const fileType = officeRef.value.getFileType()
113
+ switch (fileType) {
114
+ case 'excel':
115
+ return 'Excel文档'
116
+ case 'pdf':
117
+ return 'PDF文档'
118
+ case 'word':
119
+ return 'Word文档'
120
+ case 'unsupported':
121
+ return '不支持的格式'
122
+ default:
123
+ return '未知'
124
+ }
125
+ }
126
+ return '未知'
127
+ }
128
+ </script>
129
+
130
+ <style scoped>
131
+ .office-demo {
132
+ padding: 20px;
133
+ }
134
+
135
+ .demo-controls {
136
+ margin-bottom: 20px;
137
+ padding: 20px;
138
+ background: #f5f5f5;
139
+ border-radius: 8px;
140
+ }
141
+
142
+ .upload-section {
143
+ margin-bottom: 20px;
144
+ padding: 15px;
145
+ background: white;
146
+ border-radius: 6px;
147
+ border: 1px solid #e0e0e0;
148
+ }
149
+
150
+ .upload-section h3 {
151
+ margin: 0 0 10px 0;
152
+ color: #666;
153
+ font-size: 14px;
154
+ }
155
+
156
+ .upload-section input[type='file'] {
157
+ margin-right: 10px;
158
+ }
159
+
160
+ .preset-files {
161
+ margin-top: 20px;
162
+ }
163
+
164
+ .preset-files h3 {
165
+ margin-bottom: 10px;
166
+ color: #666;
167
+ }
168
+
169
+ .demo-content {
170
+ min-height: 700px;
171
+ }
172
+
173
+ .card-header {
174
+ display: flex;
175
+ justify-content: space-between;
176
+ align-items: center;
177
+ }
178
+
179
+ .file-type {
180
+ color: #409eff;
181
+ font-size: 14px;
182
+ }
183
+
184
+ .office-container {
185
+ height: 600px;
186
+ border: 1px solid #e4e7ed;
187
+ border-radius: 4px;
188
+ }
189
+ </style>
@@ -0,0 +1,207 @@
1
+ <template>
2
+ <div class="demo-container">
3
+ <div class="control-panel">
4
+ <h3>PDF 文档预览演示</h3>
5
+
6
+ <!-- 文件上传方式 -->
7
+ <div class="upload-section">
8
+ <h4>方式一:文件上传</h4>
9
+ <input
10
+ type="file"
11
+ @change="importPdf(($event.target as any)?.files?.[0])"
12
+ accept=".pdf"
13
+ />
14
+ <button @click="clearFile" :disabled="!file">清除文件</button>
15
+ </div>
16
+
17
+ <!-- URL方式 -->
18
+ <div class="url-section">
19
+ <h4>方式二:URL地址</h4>
20
+ <input
21
+ v-model="pdfUrl"
22
+ type="text"
23
+ placeholder="请输入PDF文档的URL地址"
24
+ class="url-input"
25
+ />
26
+ <button @click="loadFromUrl" :disabled="!pdfUrl.trim()">加载URL</button>
27
+ <button @click="clearUrl" :disabled="!pdfUrl">清除URL</button>
28
+ </div>
29
+
30
+ <!-- 搜索功能 -->
31
+ <div class="search-section">
32
+ <h4>文档搜索</h4>
33
+ <input
34
+ v-model="searchKeyword"
35
+ type="text"
36
+ placeholder="输入要搜索的关键字"
37
+ class="search-input"
38
+ />
39
+ <button @click="clickPdf" :disabled="!searchKeyword.trim()">搜索</button>
40
+ </div>
41
+ </div>
42
+
43
+ <!-- PDF组件 -->
44
+ <div class="pdf-container">
45
+ <NsPdf
46
+ v-if="counts"
47
+ ref="pdfRef"
48
+ :url="currentUrl"
49
+ :hasTool="true">
50
+ </NsPdf>
51
+ </div>
52
+ </div>
53
+ </template>
54
+
55
+ <script setup lang="ts">
56
+ import { ref, nextTick } from 'vue'
57
+
58
+ const counts = ref(true)
59
+ const file = ref()
60
+ const pdfRef = ref()
61
+ const pdfUrl = ref(
62
+ 'https://501351981.github.io/vue-office/examples/dist/static/test-files/test.pdf',
63
+ )
64
+ const currentUrl = ref(pdfUrl.value)
65
+ const searchKeyword = ref('')
66
+
67
+ function importPdf(f: any) {
68
+ // 清除URL,使用文件上传
69
+ pdfUrl.value = ''
70
+ file.value = f
71
+
72
+ if (f && f.name.endsWith('.pdf')) {
73
+ // 创建文件URL
74
+ const fileUrl = URL.createObjectURL(f)
75
+ currentUrl.value = fileUrl
76
+ } else if (f) {
77
+ alert('请选择PDF文件')
78
+ clearFile()
79
+ }
80
+ }
81
+
82
+ function loadFromUrl() {
83
+ if (pdfUrl.value.trim()) {
84
+ // 清除文件,使用URL
85
+ clearFile()
86
+ currentUrl.value = pdfUrl.value.trim()
87
+ }
88
+ }
89
+
90
+ function clearFile() {
91
+ file.value = null
92
+ if (currentUrl.value.startsWith('blob:')) {
93
+ URL.revokeObjectURL(currentUrl.value)
94
+ }
95
+ currentUrl.value = ''
96
+ }
97
+
98
+ function clearUrl() {
99
+ pdfUrl.value = ''
100
+ currentUrl.value = ''
101
+ }
102
+
103
+ function clickPdf() {
104
+ if (searchKeyword.value.trim() && pdfRef.value) {
105
+ pdfRef.value.search(searchKeyword.value.trim())
106
+ }
107
+ }
108
+
109
+ // 重新加载组件
110
+ function reloadComponent() {
111
+ counts.value = false
112
+ nextTick(() => {
113
+ counts.value = true
114
+ })
115
+ }
116
+ </script>
117
+
118
+ <style scoped lang="scss">
119
+ .demo-container {
120
+ padding: 20px;
121
+ max-width: 1400px;
122
+ margin: 0 auto;
123
+ }
124
+
125
+ .control-panel {
126
+ background: #f5f5f5;
127
+ padding: 20px;
128
+ border-radius: 8px;
129
+ margin-bottom: 20px;
130
+
131
+ h3 {
132
+ margin: 0 0 20px 0;
133
+ color: #333;
134
+ }
135
+
136
+ h4 {
137
+ margin: 15px 0 10px 0;
138
+ color: #666;
139
+ font-size: 14px;
140
+ }
141
+ }
142
+
143
+ .upload-section,
144
+ .url-section,
145
+ .search-section {
146
+ margin-bottom: 20px;
147
+ padding: 15px;
148
+ background: white;
149
+ border-radius: 6px;
150
+ border: 1px solid #e0e0e0;
151
+
152
+ input[type='file'] {
153
+ margin-right: 10px;
154
+ }
155
+
156
+ .url-input,
157
+ .search-input {
158
+ width: 300px;
159
+ padding: 8px 12px;
160
+ border: 1px solid #ddd;
161
+ border-radius: 4px;
162
+ margin-right: 10px;
163
+ font-size: 14px;
164
+
165
+ &:focus {
166
+ outline: none;
167
+ border-color: #409eff;
168
+ }
169
+ }
170
+
171
+ button {
172
+ padding: 8px 16px;
173
+ background: #409eff;
174
+ color: white;
175
+ border: none;
176
+ border-radius: 4px;
177
+ cursor: pointer;
178
+ margin-right: 10px;
179
+ font-size: 14px;
180
+
181
+ &:hover:not(:disabled) {
182
+ background: #337ecc;
183
+ }
184
+
185
+ &:disabled {
186
+ background: #c0c4cc;
187
+ cursor: not-allowed;
188
+ }
189
+ }
190
+ }
191
+
192
+ .pdf-container {
193
+ height: 600px;
194
+ border: 1px solid #e0e0e0;
195
+ border-radius: 8px;
196
+ overflow: hidden;
197
+ margin-bottom: 20px;
198
+ }
199
+
200
+ @media (max-width: 768px) {
201
+ .url-input,
202
+ .search-input {
203
+ width: 100% !important;
204
+ margin-bottom: 10px;
205
+ }
206
+ }
207
+ </style>
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <div class="saturation-line-view">
3
+ <span>浸润线</span>
4
+ <NsSaturationline ref="canvasRef" class="saturationline-canvas" :data="state.damData" :waterLevel="state.waterLevel"></NsSaturationline>
5
+ </div>
6
+ </template>
7
+ <script setup lang="ts" name="">
8
+ import { reactive } from 'vue';
9
+
10
+ const state = reactive({
11
+ damData: {
12
+ // 坝体
13
+ sectionTableList: [
14
+ {
15
+ xPoint: "-44",
16
+ yPoint: "17",
17
+ isTop: false,
18
+ },
19
+ {
20
+ xPoint: "-26",
21
+ yPoint: "24",
22
+ isTop: false,
23
+ },
24
+ {
25
+ xPoint: "-16",
26
+ yPoint: "24",
27
+ isTop: false,
28
+ },
29
+ {
30
+ xPoint: "-8",
31
+ yPoint: "29",
32
+ isTop: true,
33
+ },
34
+ {
35
+ xPoint: "8",
36
+ yPoint: "29",
37
+ isTop: true,
38
+ },
39
+ {
40
+ xPoint: "22",
41
+ yPoint: "25",
42
+ isTop: false,
43
+ },
44
+ {
45
+ xPoint: "40",
46
+ yPoint: "22",
47
+ isTop: false,
48
+ },
49
+ {
50
+ xPoint: "47",
51
+ yPoint: "22",
52
+ isTop: false,
53
+ },
54
+ {
55
+ xPoint: "62",
56
+ yPoint: "17",
57
+ isTop: false,
58
+ },
59
+ {
60
+ xPoint: "70",
61
+ yPoint: "17",
62
+ isTop: false,
63
+ },
64
+ ],
65
+ // 测压管
66
+ pipelineTableList: [
67
+ {
68
+ xPoint: "-8",
69
+ yPoint: "29",
70
+ height: "15",
71
+ pointCode: "UP1-1",
72
+ },
73
+ {
74
+ xPoint: "8",
75
+ yPoint: "29",
76
+ height: "17",
77
+ pointCode: "UP1-2",
78
+ },
79
+ {
80
+ xPoint: "17",
81
+ yPoint: "26.3",
82
+ height: "15",
83
+ pointCode: "UP1-3",
84
+ },
85
+ ],
86
+ // y/x偏移
87
+ isWall: "1",
88
+ yStart: "10",
89
+ wallXpoint: "-2",
90
+ },
91
+ waterLevel: {
92
+ map: [
93
+ {
94
+ id: null,
95
+ projectCode: null,
96
+ transectName: "0+155",
97
+ pointCode: "UP1-3",
98
+ waterLevel: 14.8,
99
+ date: "2025-05-20T05:00:00",
100
+ createBy: null,
101
+ createTime: null,
102
+ updateBy: null,
103
+ updateTime: null,
104
+ isDelete: null,
105
+ code: null,
106
+ },
107
+ {
108
+ id: null,
109
+ projectCode: null,
110
+ transectName: "0+155",
111
+ pointCode: "UP1-2",
112
+ waterLevel: 16.0,
113
+ date: "2025-05-20T05:00:00",
114
+ createBy: null,
115
+ createTime: null,
116
+ updateBy: null,
117
+ updateTime: null,
118
+ isDelete: null,
119
+ code: null,
120
+ },
121
+ {
122
+ id: null,
123
+ projectCode: null,
124
+ transectName: "0+155",
125
+ pointCode: "UP1-1",
126
+ waterLevel: 18.3,
127
+ date: "2025-05-20T00:00:00",
128
+ createBy: null,
129
+ createTime: null,
130
+ updateBy: null,
131
+ updateTime: null,
132
+ isDelete: null,
133
+ code: null,
134
+ },
135
+ ],
136
+ kssw: 22,
137
+ xxsw: 15,
138
+ sjsw: 24,
139
+ jhsw: 26,
140
+ },
141
+ });
142
+ </script>
143
+ <style lang="scss" scoped>
144
+ .saturation-line-view {
145
+ width: calc(100% - 40px);
146
+ height: calc(100% - 20px);
147
+ padding: 20px;
148
+ display: flex;
149
+ flex-direction: column;
150
+ .saturationline-canvas {
151
+ flex: 1;
152
+ height: 100%;
153
+ }
154
+ }
155
+ </style>