af-mobile-client-vue3 1.1.23 → 1.1.25

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/package.json CHANGED
@@ -1,111 +1,100 @@
1
- {
2
- "name": "af-mobile-client-vue3",
3
- "type": "module",
4
- "version": "1.1.23",
5
- "description": "Vue + Vite component lib",
6
- "license": "MIT",
7
- "engines": {
8
- "node": ">=18.12.0",
9
- "pnpm": ">=8.15.0"
10
- },
11
- "scripts": {
12
- "dev": "cross-env MOCK_SERVER_PORT=8086 vite",
13
- "build": "vue-tsc --noEmit && vite build",
14
- "build:dev": "vue-tsc --noEmit && vite build --mode=development",
15
- "preview": "vite preview",
16
- "lint": "eslint . && vue-tsc --noEmit",
17
- "lint:fix": "eslint . --fix",
18
- "test": "vitest",
19
- "release": "bumpp --commit --push --tag"
20
- },
21
- "dependencies": {
22
- "@micro-zoe/micro-app": "1.0.0-rc.24",
23
- "@vant/area-data": "^2.0.0",
24
- "@unhead/vue": "^2.0.5",
25
- "@vant/touch-emulator": "^1.4.0",
26
- "@vant/use": "^1.6.0",
27
- "@vueuse/core": "^13.1.0",
28
- "@iconify/vue": "4.3.0",
29
- "animate.css": "^4.1.1",
30
- "axios": "^1.8.4",
31
- "crypto-js": "^4.2.0",
32
- "echarts": "^5.6.0",
33
- "lodash-es": "^4.17.21",
34
- "nprogress": "^0.2.0",
35
- "ol": "^10.5.0",
36
- "pinia": "^3.0.2",
37
- "pinia-plugin-persistedstate": "^4.2.0",
38
- "qs": "^6.14.0",
39
- "resize-detector": "^0.3.0",
40
- "store": "^2.0.12",
41
- "vant": "^4.9.18",
42
- "vconsole": "^3.15.1",
43
- "vue": "^3.5.13",
44
- "vue-router": "^4.5.0"
45
- },
46
- "devDependencies": {
47
- "@antfu/eslint-config": "^4.12.0",
48
- "@iconify/json": "2.2.318",
49
- "@types/crypto-js": "^4.2.2",
50
- "@types/lodash-es": "^4.17.12",
51
- "@types/node": "^22.14.1",
52
- "@types/nprogress": "^0.2.3",
53
- "@types/store": "^2.0.5",
54
- "@unocss/eslint-plugin": "^66.1.0-beta.11",
55
- "@unocss/preset-rem-to-px": "66.1.0-beta.11",
56
- "@vitejs/plugin-legacy": "^6.0.2",
57
- "@vitejs/plugin-vue": "^5.2.3",
58
- "autoprefixer": "^10.4.21",
59
- "bumpp": "^10.1.0",
60
- "commitizen": "^4.3.1",
61
- "consola": "^3.4.2",
62
- "cross-env": "^7.0.3",
63
- "cz-emoji-chinese": "^0.3.1",
64
- "eslint": "^9.24.0",
65
- "eslint-ts-patch": "^8.57.0-0",
66
- "husky": "^9.1.7",
67
- "less": "^4.3.0",
68
- "mockjs": "^1.1.0",
69
- "postcss-mobile-forever": "^5.0.0",
70
- "rollup": "^4.40.0",
71
- "terser": "^5.39.0",
72
- "typescript": "^5.8.3",
73
- "unocss": "^66.1.0-beta.11",
74
- "unplugin-auto-import": "^19.1.2",
75
- "unplugin-vue-components": "^28.4.1",
76
- "unplugin-vue-router": "^0.12.0",
77
- "vite": "^6.2.6",
78
- "vite-plugin-compression": "^0.5.1",
79
- "vite-plugin-mock-dev-server": "^1.8.5",
80
- "vite-plugin-pwa": "^1.0.0",
81
- "vite-plugin-sitemap": "^0.7.1",
82
- "vite-plugin-svg-icons": "^2.0.1",
83
- "vite-plugin-vconsole": "^2.1.1",
84
- "vite-plugin-vue-devtools": "^7.7.2",
85
- "vite-plugin-vue-layouts": "^0.11.0",
86
- "vitest": "^3.1.1",
87
- "vue-tsc": "^2.2.8"
88
- },
89
- "pnpm": {
90
- "peerDependencyRules": {
91
- "ignoreMissing": [
92
- "postcss",
93
- "esbuild"
94
- ],
95
- "allowedVersions": {
96
- "rollup": "^4.x"
97
- }
98
- }
99
- },
100
- "config": {
101
- "commitizen": {
102
- "path": "./node_modules/cz-emoji-chinese"
103
- },
104
- "cz-emoji-chinese": {
105
- "skipQuestions": [
106
- "body",
107
- "scope"
108
- ]
109
- }
110
- }
111
- }
1
+ {
2
+ "name": "af-mobile-client-vue3",
3
+ "type": "module",
4
+ "version": "1.1.25",
5
+ "description": "Vue + Vite component lib",
6
+ "license": "MIT",
7
+ "engines": {
8
+ "node": ">=18.12.0",
9
+ "pnpm": ">=8.15.0"
10
+ },
11
+ "dependencies": {
12
+ "@micro-zoe/micro-app": "1.0.0-rc.24",
13
+ "@vant/area-data": "^2.0.0",
14
+ "@unhead/vue": "^2.0.5",
15
+ "@vant/touch-emulator": "^1.4.0",
16
+ "@vant/use": "^1.6.0",
17
+ "@vueuse/core": "^13.1.0",
18
+ "@iconify/vue": "4.3.0",
19
+ "animate.css": "^4.1.1",
20
+ "axios": "^1.8.4",
21
+ "crypto-js": "^4.2.0",
22
+ "echarts": "^5.6.0",
23
+ "lodash-es": "^4.17.21",
24
+ "nprogress": "^0.2.0",
25
+ "ol": "^10.5.0",
26
+ "pinia": "^3.0.2",
27
+ "pinia-plugin-persistedstate": "^4.2.0",
28
+ "qs": "^6.14.0",
29
+ "resize-detector": "^0.3.0",
30
+ "store": "^2.0.12",
31
+ "vant": "^4.9.18",
32
+ "vconsole": "^3.15.1",
33
+ "vue": "^3.5.13",
34
+ "vue-router": "^4.5.0"
35
+ },
36
+ "devDependencies": {
37
+ "@antfu/eslint-config": "^4.12.0",
38
+ "@iconify/json": "2.2.318",
39
+ "@types/crypto-js": "^4.2.2",
40
+ "@types/lodash-es": "^4.17.12",
41
+ "@types/node": "^22.14.1",
42
+ "@types/nprogress": "^0.2.3",
43
+ "@types/store": "^2.0.5",
44
+ "@unocss/eslint-plugin": "^66.1.0-beta.11",
45
+ "@unocss/preset-rem-to-px": "66.1.0-beta.11",
46
+ "@vitejs/plugin-legacy": "^6.0.2",
47
+ "@vitejs/plugin-vue": "^5.2.3",
48
+ "autoprefixer": "^10.4.21",
49
+ "bumpp": "^10.1.0",
50
+ "commitizen": "^4.3.1",
51
+ "consola": "^3.4.2",
52
+ "cross-env": "^7.0.3",
53
+ "cz-emoji-chinese": "^0.3.1",
54
+ "eslint": "^9.24.0",
55
+ "eslint-ts-patch": "^8.57.0-0",
56
+ "husky": "^9.1.7",
57
+ "less": "^4.3.0",
58
+ "mockjs": "^1.1.0",
59
+ "postcss-mobile-forever": "^5.0.0",
60
+ "rollup": "^4.40.0",
61
+ "terser": "^5.39.0",
62
+ "typescript": "^5.8.3",
63
+ "unocss": "^66.1.0-beta.11",
64
+ "unplugin-auto-import": "^19.1.2",
65
+ "unplugin-vue-components": "^28.4.1",
66
+ "unplugin-vue-router": "^0.12.0",
67
+ "vite": "^6.2.6",
68
+ "vite-plugin-compression": "^0.5.1",
69
+ "vite-plugin-mock-dev-server": "^1.8.5",
70
+ "vite-plugin-pwa": "^1.0.0",
71
+ "vite-plugin-sitemap": "^0.7.1",
72
+ "vite-plugin-svg-icons": "^2.0.1",
73
+ "vite-plugin-vconsole": "^2.1.1",
74
+ "vite-plugin-vue-devtools": "^7.7.2",
75
+ "vite-plugin-vue-layouts": "^0.11.0",
76
+ "vitest": "^3.1.1",
77
+ "vue-tsc": "^2.2.8"
78
+ },
79
+ "config": {
80
+ "commitizen": {
81
+ "path": "./node_modules/cz-emoji-chinese"
82
+ },
83
+ "cz-emoji-chinese": {
84
+ "skipQuestions": [
85
+ "body",
86
+ "scope"
87
+ ]
88
+ }
89
+ },
90
+ "scripts": {
91
+ "dev": "cross-env MOCK_SERVER_PORT=8086 vite",
92
+ "build": "vue-tsc --noEmit && vite build",
93
+ "build:dev": "vue-tsc --noEmit && vite build --mode=development",
94
+ "preview": "vite preview",
95
+ "lint": "eslint . && vue-tsc --noEmit",
96
+ "lint:fix": "eslint . --fix",
97
+ "test": "vitest",
98
+ "release": "bumpp --commit --push --tag"
99
+ }
100
+ }
@@ -76,32 +76,28 @@ function valueChange(value: string | string[]) {
76
76
  <div id="XGridDropOption">
77
77
  <template v-if="props.multiple">
78
78
  <VanCheckboxGroup v-model="checked as string[]" direction="horizontal" @change="valueChange">
79
- <VanGrid :gutter="props.gutter" :border="false" :column-num="props.columnNum">
80
- <VanGridItem v-for="colRow in props.columns" :key="colRow[props.columnsFieldNames.text]">
81
- <template #default>
82
- <VanCheckbox :name="colRow[props.columnsFieldNames.value]">
83
- <VanButton type="default" size="small" :class="{ 'select-text-col': classSel(colRow) }">
84
- {{ colRow[props.columnsFieldNames.text] }}
85
- </VanButton>
86
- </VanCheckbox>
87
- </template>
88
- </VanGridItem>
89
- </VanGrid>
79
+ <div class="option-container">
80
+ <div v-for="colRow in props.columns" :key="colRow[props.columnsFieldNames.text]" class="option-item">
81
+ <VanCheckbox :name="colRow[props.columnsFieldNames.value]">
82
+ <VanButton type="default" size="small" :class="{ 'select-text-col': classSel(colRow) }">
83
+ {{ colRow[props.columnsFieldNames.text] }}
84
+ </VanButton>
85
+ </VanCheckbox>
86
+ </div>
87
+ </div>
90
88
  </VanCheckboxGroup>
91
89
  </template>
92
90
  <template v-else>
93
91
  <VanRadioGroup v-model="checked" direction="horizontal" @change="valueChange">
94
- <VanGrid :gutter="props.gutter" :border="false" :column-num="props.columnNum">
95
- <VanGridItem v-for="colRow in props.columns" :key="colRow[props.columnsFieldNames.text]">
96
- <template #default>
97
- <VanRadio :name="colRow[props.columnsFieldNames.value]">
98
- <VanButton type="default" size="small" :class="{ 'select-text-col': classSel(colRow) }">
99
- {{ colRow[props.columnsFieldNames.text] }}
100
- </VanButton>
101
- </VanRadio>
102
- </template>
103
- </VanGridItem>
104
- </VanGrid>
92
+ <div class="option-container">
93
+ <div v-for="colRow in props.columns" :key="colRow[props.columnsFieldNames.text]" class="option-item">
94
+ <VanRadio :name="colRow[props.columnsFieldNames.value]">
95
+ <VanButton type="default" size="small" :class="{ 'select-text-col': classSel(colRow) }">
96
+ {{ colRow[props.columnsFieldNames.text] }}
97
+ </VanButton>
98
+ </VanRadio>
99
+ </div>
100
+ </div>
105
101
  </VanRadioGroup>
106
102
  </template>
107
103
  </div>
@@ -116,10 +112,18 @@ function valueChange(value: string | string[]) {
116
112
  --van-radio-label-margin: 0px;
117
113
  --van-button-default-border-color: 'rgb(247,248,250)';
118
114
 
119
- .van-grid {
115
+ .option-container {
116
+ display: flex;
117
+ flex-wrap: wrap;
118
+ gap: 8px;
120
119
  width: 100%;
121
120
  }
122
121
 
122
+ .option-item {
123
+ flex: 0 1 auto;
124
+ min-width: fit-content;
125
+ }
126
+
123
127
  .select-text-col {
124
128
  color: blue;
125
129
  }
@@ -140,6 +144,7 @@ function valueChange(value: string | string[]) {
140
144
  :deep(.van-button) {
141
145
  width: 100%;
142
146
  background-color: rgb(247,248,250);
147
+ white-space: nowrap;
143
148
  }
144
149
  :deep(.van-checkbox__label) {
145
150
  width: 100%;
@@ -3,6 +3,7 @@ import XBadge from '@af-mobile-client-vue3/components/data/XBadge/index.vue'
3
3
  import XCellListFilter from '@af-mobile-client-vue3/components/data/XCellListFilter/index.vue'
4
4
  import { getConfigByName, query } from '@af-mobile-client-vue3/services/api/common'
5
5
  import { getRangeByType } from '@af-mobile-client-vue3/utils/queryFormDefaultRangePicker'
6
+ import { executeStrFunctionByContext } from '@af-mobile-client-vue3/utils/runEvalFunction'
6
7
  import LoadError from '@af-mobile-client-vue3/views/common/LoadError.vue'
7
8
  import {
8
9
  showConfirmDialog,
@@ -18,7 +19,7 @@ import {
18
19
  Space as VanSpace,
19
20
  Tag as VanTag,
20
21
  } from 'vant'
21
- import { computed, defineEmits, defineProps, onBeforeMount, ref, watch } from 'vue'
22
+ import { computed, defineEmits, defineProps, getCurrentInstance, onBeforeMount, ref, useSlots, watch } from 'vue'
22
23
  import { useRouter } from 'vue-router'
23
24
 
24
25
  const { configName, serviceName, fixQueryForm } = withDefaults(defineProps<{
@@ -39,7 +40,14 @@ const { configName, serviceName, fixQueryForm } = withDefaults(defineProps<{
39
40
  scanOptions: undefined,
40
41
  })
41
42
 
42
- const emit = defineEmits(['toDetail', 'update', 'deleteRow', 'add'])
43
+ const emit = defineEmits<{
44
+ (e: 'toDetail', item: any): void
45
+ (e: 'update', item: any, handledByParent: any): void
46
+ (e: 'deleteRow', item: any): void
47
+ (e: 'add'): void
48
+ (e: string, item: any): void
49
+ (e: 'updateCondition', params: any): void
50
+ }>()
43
51
 
44
52
  const router = useRouter()
45
53
 
@@ -122,6 +130,11 @@ const buttonState = ref(undefined)
122
130
  const groupFormItems = ref({})
123
131
  const title = ref('')
124
132
 
133
+ const slots = useSlots()
134
+
135
+ // 当前组件实例(不推荐使用,可能会在后续的版本更迭中调整,暂时用来绑定函数的上下文)
136
+ const currInst = getCurrentInstance()
137
+
125
138
  onBeforeMount(() => {
126
139
  initComponent()
127
140
  })
@@ -325,23 +338,24 @@ watch(() => searchValue.value, (newVal) => {
325
338
  onRefresh()
326
339
  })
327
340
 
328
- function handleFunctionStyle(funcString, param) {
329
- try {
330
- if (!funcString || funcString === '')
331
- return {}
332
-
333
- // 匹配参数名、函数体
334
- const innerFuncRegex = /function\s+\w*\((\w+)\)\s*\{([\s\S]*)\}/
335
- const matches = funcString.match(innerFuncRegex)
336
-
337
- const paramName = matches[1] // 提取参数名
338
-
339
- // eslint-disable-next-line no-new-func
340
- const func = new Function(paramName, matches[2])
341
+ // 配置中心->表单项展示函数
342
+ function handleFunctionStyle(funcString, record) {
343
+ if (!funcString) {
344
+ return {}
345
+ }
341
346
 
342
- return func(param)
347
+ try {
348
+ // 同步执行函数
349
+ const obj = executeStrFunctionByContext(currInst, funcString, [record])
350
+ // 如果返回的是对象,则直接返回
351
+ if (obj && typeof obj === 'object') {
352
+ return obj
353
+ }
354
+ // 其他情况返回空对象
355
+ return {}
343
356
  }
344
- catch {
357
+ catch (error) {
358
+ console.error('Error in handleFunctionStyle:', error)
345
359
  return {}
346
360
  }
347
361
  }
@@ -462,12 +476,39 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
462
476
  return true
463
477
  }
464
478
  }
479
+
480
+ // 更新查询条件并刷新
481
+ function updateConditionAndRefresh(params: any) {
482
+ // 更新 conditionParams
483
+ if (!conditionParams.value) {
484
+ conditionParams.value = {}
485
+ }
486
+ if (params) {
487
+ // 遍历参数,更新对应的表单值
488
+ Object.entries(params).forEach(([key, value]) => {
489
+ // 找到对应的表单项
490
+ const formItem = formQueryList.value.find(item => item.model === key)
491
+ if (formItem) {
492
+ // 更新表单项的值
493
+ conditionParams.value[key] = value
494
+ }
495
+ })
496
+ }
497
+
498
+ // 触发刷新
499
+ onRefresh()
500
+ }
501
+
502
+ // 暴露方法给父组件
503
+ defineExpose({
504
+ updateConditionAndRefresh,
505
+ })
465
506
  </script>
466
507
 
467
508
  <template>
468
509
  <div id="XCellList">
469
510
  <VanRow class="filter-condition">
470
- <VanCol>
511
+ <VanCol class="search-col">
471
512
  <VanSearch
472
513
  v-model="searchValue"
473
514
  class="title-search"
@@ -477,6 +518,14 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
477
518
  @search="onRefresh"
478
519
  />
479
520
  </VanCol>
521
+ <!-- 动态插槽区域 -->
522
+ <template v-for="(_, name) in slots" :key="name">
523
+ <template v-if="typeof name === 'string' && name.startsWith('search-right-')">
524
+ <div class="filter-icon-box">
525
+ <slot :name="name" />
526
+ </div>
527
+ </template>
528
+ </template>
480
529
  <VanCol class="search-icon">
481
530
  <XCellListFilter
482
531
  v-model:sortord-val="sortordVal"
@@ -511,7 +560,7 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
511
560
  <div v-for="(column) in mainColumns" :key="`main_${column.dataIndex}`" class="main-title">
512
561
  <p
513
562
  class="card_item_title"
514
- :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])"
563
+ :style="handleFunctionStyle(column.styleFunctionForValue, item)"
515
564
  >
516
565
  {{ item[column.dataIndex] ? item[column.dataIndex] : '--' }}
517
566
  </p>
@@ -519,10 +568,10 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
519
568
  <div v-for="(column) in subTitleColumns" :key="`subtitle_${column.dataIndex}`" class="sub-title">
520
569
  <p
521
570
  class="card_item_subtitle"
522
- :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])"
571
+ :style="handleFunctionStyle(column.styleFunctionForValue, item)"
523
572
  >
524
573
  <XBadge
525
- :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])"
574
+ :style="handleFunctionStyle(column.styleFunctionForValue, item)"
526
575
  :dict-name="column.dictName" :dict-value="item[column.dataIndex]"
527
576
  :service-name="serviceName"
528
577
  />
@@ -546,7 +595,7 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
546
595
  <p>
547
596
  {{ `${column.title}: ` }}
548
597
  <XBadge
549
- :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])"
598
+ :style="handleFunctionStyle(column.styleFunctionForValue, item)"
550
599
  :dict-name="column.dictName" :dict-value="item[column.dataIndex]"
551
600
  :service-name="serviceName"
552
601
  />
@@ -588,11 +637,11 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
588
637
  <VanRow gutter="20" class="card_item_footer" @click="emit('toDetail', item)">
589
638
  <VanCol v-for="column of footColumns" :key="`foot_${column.dataIndex}`" :span="12">
590
639
  <p>
591
- <span :style="handleFunctionStyle(column.styleFunctionForTitle, item[column.dataIndex])">
640
+ <span :style="handleFunctionStyle(column.styleFunctionForTitle, item)">
592
641
  {{ column.title }}:
593
642
  </span>
594
643
  <XBadge
595
- :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])"
644
+ :style="handleFunctionStyle(column.styleFunctionForValue, item)"
596
645
  :dict-name="column.dictName" :dict-value="item[column.dataIndex]"
597
646
  :service-name="serviceName"
598
647
  />
@@ -650,8 +699,8 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
650
699
  <style scoped lang="less">
651
700
  #XCellList {
652
701
  height: calc(94vh - var(--van-nav-bar-height) - 5px);
653
- --van-search-padding:5px;
654
- --van-dropdown-menu-title-padding: 5px;
702
+ --van-search-padding: 3px;
703
+ --van-dropdown-menu-title-padding: 3px;
655
704
  --van-cell-vertical-padding: 0px;
656
705
  .main {
657
706
  overflow-y: auto;
@@ -810,6 +859,7 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
810
859
  align-items: center;
811
860
  padding: 8px 12px;
812
861
  background-color: #fff;
862
+ gap: 5px;
813
863
  :deep(.van-search) {
814
864
  width: 100%;
815
865
  padding: var(--van-search-padding);
@@ -831,20 +881,31 @@ function evaluateCustomFunction(funcString: string | undefined, record: any, ind
831
881
  font-size: 14px;
832
882
  }
833
883
  .van-col {
834
- &:first-child {
884
+ display: flex;
885
+ align-items: center;
886
+ &.search-col {
835
887
  flex: 1;
836
888
  min-width: 0;
837
889
  }
838
- &:last-child {
890
+ &.search-icon {
839
891
  flex-shrink: 0;
892
+ padding: 0;
840
893
  }
841
894
  }
842
- .search-icon {
895
+ .filter-icon-box {
843
896
  display: flex;
844
897
  align-items: center;
845
- justify-content: flex-end;
846
- height: 100%;
847
- padding: 0;
898
+ justify-content: center;
899
+ width: 40px;
900
+ height: 40px;
901
+ border-radius: 10px;
902
+ background-color: rgba(245,245,245);
903
+ cursor: pointer;
904
+ position: relative;
905
+ z-index: 1;
906
+ &:active {
907
+ opacity: 0.7;
908
+ }
848
909
  }
849
910
  }
850
911
 
@@ -1,33 +1,33 @@
1
- <script setup lang="ts">
2
- import { onMounted, ref } from 'vue'
3
- import XReport from './XReport.vue'
4
-
5
- const mainRef = ref()
6
-
7
- onMounted(() => {
8
- // 初始化逻辑
9
- })
10
- </script>
11
-
12
- <template>
13
- <div id="test">
14
- <van-card :bordered="false">
15
- <XReport
16
- ref="mainRef"
17
- :use-oss-for-img="false"
18
- config-name="nurseWorkstationCover"
19
- server-name="af-his"
20
- :show-img-in-cell="true"
21
- :display-only="true"
22
- :edit-mode="false"
23
- :show-save-button="false"
24
- :no-padding="true"
25
- :dont-format="true"
26
- />
27
- </van-card>
28
- </div>
29
- </template>
30
-
31
- <style scoped>
32
-
33
- </style>
1
+ <script setup lang="ts">
2
+ import { onMounted, ref } from 'vue'
3
+ import XReport from './XReport.vue'
4
+
5
+ const mainRef = ref()
6
+
7
+ onMounted(() => {
8
+ // 初始化逻辑
9
+ })
10
+ </script>
11
+
12
+ <template>
13
+ <div id="test">
14
+ <van-card :bordered="false">
15
+ <XReport
16
+ ref="mainRef"
17
+ :use-oss-for-img="false"
18
+ config-name="nurseWorkstationCover"
19
+ server-name="af-his"
20
+ :show-img-in-cell="true"
21
+ :display-only="true"
22
+ :edit-mode="false"
23
+ :show-save-button="false"
24
+ :no-padding="true"
25
+ :dont-format="true"
26
+ />
27
+ </van-card>
28
+ </div>
29
+ </template>
30
+
31
+ <style scoped>
32
+
33
+ </style>