vue2-client 1.12.103 → 1.13.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/package.json
CHANGED
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "vue2-client",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"private": false,
|
|
5
|
-
"scripts": {
|
|
6
|
-
"serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
|
|
7
|
-
"serve:gaslink": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode gaslink",
|
|
8
|
-
"serve:revenue": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode revenue",
|
|
9
|
-
"serve:liuli": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode liuli",
|
|
10
|
-
"serve:scada": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode scada",
|
|
11
|
-
"serve:iot": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode iot",
|
|
12
|
-
"serve:his": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode his",
|
|
13
|
-
"mac-serve": "vue-cli-service serve --no-eslint --mode his",
|
|
14
|
-
"build": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
|
|
15
|
-
"test:unit": "vue-cli-service test:unit",
|
|
16
|
-
"lint": "vue-cli-service lint",
|
|
17
|
-
"build:preview": "vue-cli-service build --mode preview",
|
|
18
|
-
"lint:nofix": "vue-cli-service lint --no-fix",
|
|
19
|
-
"test": "jest"
|
|
20
|
-
},
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"@afwenming123/vue-easy-tree": "^1.0.1",
|
|
23
|
-
"@afwenming123/vue-plugin-hiprint": "^0.0.70",
|
|
24
|
-
"@amap/amap-jsapi-loader": "^1.0.1",
|
|
25
|
-
"@antv/data-set": "^0.11.8",
|
|
26
|
-
"@antv/g2plot": "^2.4.31",
|
|
27
|
-
"@hufe921/canvas-editor": "^0.9.49",
|
|
28
|
-
"@microsoft/fetch-event-source": "^2.0.1",
|
|
29
|
-
"@vue/babel-preset-jsx": "^1.4.0",
|
|
30
|
-
"animate.css": "^4.1.1",
|
|
31
|
-
"ant-design-vue": "^1.7.8",
|
|
32
|
-
"axios": "^0.27.2",
|
|
33
|
-
"clipboard": "^2.0.11",
|
|
34
|
-
"core-js": "^3.33.0",
|
|
35
|
-
"crypto-js": "^4.1.1",
|
|
36
|
-
"date-fns": "^2.29.3",
|
|
37
|
-
"default-passive-events": "^2.0.0",
|
|
38
|
-
"dotenv": "^16.3.1",
|
|
39
|
-
"echarts": "^5.5.0",
|
|
40
|
-
"enquire.js": "^2.1.6",
|
|
41
|
-
"file-saver": "^2.0.5",
|
|
42
|
-
"highlight.js": "^11.7.0",
|
|
43
|
-
"html2canvas": "^1.4.1",
|
|
44
|
-
"js-base64": "^3.7.5",
|
|
45
|
-
"js-cookie": "^2.2.1",
|
|
46
|
-
"jsencrypt": "^3.3.2",
|
|
47
|
-
"jspdf": "^2.5.1",
|
|
48
|
-
"lodash.clonedeep": "^4.5.0",
|
|
49
|
-
"lodash.debounce": "^4",
|
|
50
|
-
"lodash.get": "^4.4.2",
|
|
51
|
-
"marked": "^4",
|
|
52
|
-
"mockjs": "^1.1.0",
|
|
53
|
-
"nprogress": "^0.2.0",
|
|
54
|
-
"qs": "^6.11.2",
|
|
55
|
-
"regenerator-runtime": "^0.14.0",
|
|
56
|
-
"videojs-contrib-hls": "^5.15.0",
|
|
57
|
-
"viser-vue": "^2.4.8",
|
|
58
|
-
"vue": "^2.7.14",
|
|
59
|
-
"vue-codemirror": "4.0.6",
|
|
60
|
-
"vue-draggable-resizable": "^2",
|
|
61
|
-
"vue-i18n": "^8.28.2",
|
|
62
|
-
"vue-json-viewer": "^2.2.22",
|
|
63
|
-
"vue-router": "^3.6.5",
|
|
64
|
-
"vue-video-player": "^5.0.2",
|
|
65
|
-
"vue-virtual-scroller": "^1.1.2",
|
|
66
|
-
"vuedraggable": "^2.24.3",
|
|
67
|
-
"vuex": "^3.6.2",
|
|
68
|
-
"xlsx": "0.18.5"
|
|
69
|
-
},
|
|
70
|
-
"devDependencies": {
|
|
71
|
-
"@ant-design/colors": "^7.0.0",
|
|
72
|
-
"@babel/core": "^7.22.20",
|
|
73
|
-
"@babel/eslint-parser": "^7.22.15",
|
|
74
|
-
"@babel/preset-env": "^7.22.20",
|
|
75
|
-
"@vue/cli-plugin-babel": "^5.0.8",
|
|
76
|
-
"@vue/cli-plugin-eslint": "^5.0.8",
|
|
77
|
-
"@vue/cli-service": "^5.0.8",
|
|
78
|
-
"@vue/eslint-config-standard": "^8.0.1",
|
|
79
|
-
"@vue/test-utils": "^1.3.6",
|
|
80
|
-
"babel-plugin-transform-remove-console": "^6.9.4",
|
|
81
|
-
"compression-webpack-plugin": "^10.0.0",
|
|
82
|
-
"css-minimizer-webpack-plugin": "^5.0.1",
|
|
83
|
-
"deepmerge": "^4.3.1",
|
|
84
|
-
"eslint": "^8.51.0",
|
|
85
|
-
"eslint-plugin-vue": "^9.17.0",
|
|
86
|
-
"fast-deep-equal": "^3.1.3",
|
|
87
|
-
"ignore-loader": "^0.1.2",
|
|
88
|
-
"jest": "^29.7.0",
|
|
89
|
-
"jest-environment-jsdom": "^29.7.0",
|
|
90
|
-
"jest-transform-stub": "^2.0.0",
|
|
91
|
-
"less-loader": "^6.2.0",
|
|
92
|
-
"script-loader": "^0.7.2",
|
|
93
|
-
"style-resources-loader": "^1.5.0",
|
|
94
|
-
"vue-cli-plugin-style-resources-loader": "^0.1.5",
|
|
95
|
-
"vue-jest": "^4.0.1",
|
|
96
|
-
"vue-template-compiler": "^2.7.14",
|
|
97
|
-
"webpack": "^5.88.2",
|
|
98
|
-
"webpack-theme-color-replacer": "^1.4.7",
|
|
99
|
-
"whatwg-fetch": "^3.6.19"
|
|
100
|
-
},
|
|
101
|
-
"browserslist": [
|
|
102
|
-
"> 1%",
|
|
103
|
-
"last 2 versions",
|
|
104
|
-
"not dead",
|
|
105
|
-
"not ie 11"
|
|
106
|
-
]
|
|
107
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "vue2-client",
|
|
3
|
+
"version": "1.13.2",
|
|
4
|
+
"private": false,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
|
|
7
|
+
"serve:gaslink": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode gaslink",
|
|
8
|
+
"serve:revenue": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode revenue",
|
|
9
|
+
"serve:liuli": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode liuli",
|
|
10
|
+
"serve:scada": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode scada",
|
|
11
|
+
"serve:iot": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode iot",
|
|
12
|
+
"serve:his": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint --mode his",
|
|
13
|
+
"mac-serve": "vue-cli-service serve --no-eslint --mode his",
|
|
14
|
+
"build": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
|
|
15
|
+
"test:unit": "vue-cli-service test:unit",
|
|
16
|
+
"lint": "vue-cli-service lint",
|
|
17
|
+
"build:preview": "vue-cli-service build --mode preview",
|
|
18
|
+
"lint:nofix": "vue-cli-service lint --no-fix",
|
|
19
|
+
"test": "jest"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@afwenming123/vue-easy-tree": "^1.0.1",
|
|
23
|
+
"@afwenming123/vue-plugin-hiprint": "^0.0.70",
|
|
24
|
+
"@amap/amap-jsapi-loader": "^1.0.1",
|
|
25
|
+
"@antv/data-set": "^0.11.8",
|
|
26
|
+
"@antv/g2plot": "^2.4.31",
|
|
27
|
+
"@hufe921/canvas-editor": "^0.9.49",
|
|
28
|
+
"@microsoft/fetch-event-source": "^2.0.1",
|
|
29
|
+
"@vue/babel-preset-jsx": "^1.4.0",
|
|
30
|
+
"animate.css": "^4.1.1",
|
|
31
|
+
"ant-design-vue": "^1.7.8",
|
|
32
|
+
"axios": "^0.27.2",
|
|
33
|
+
"clipboard": "^2.0.11",
|
|
34
|
+
"core-js": "^3.33.0",
|
|
35
|
+
"crypto-js": "^4.1.1",
|
|
36
|
+
"date-fns": "^2.29.3",
|
|
37
|
+
"default-passive-events": "^2.0.0",
|
|
38
|
+
"dotenv": "^16.3.1",
|
|
39
|
+
"echarts": "^5.5.0",
|
|
40
|
+
"enquire.js": "^2.1.6",
|
|
41
|
+
"file-saver": "^2.0.5",
|
|
42
|
+
"highlight.js": "^11.7.0",
|
|
43
|
+
"html2canvas": "^1.4.1",
|
|
44
|
+
"js-base64": "^3.7.5",
|
|
45
|
+
"js-cookie": "^2.2.1",
|
|
46
|
+
"jsencrypt": "^3.3.2",
|
|
47
|
+
"jspdf": "^2.5.1",
|
|
48
|
+
"lodash.clonedeep": "^4.5.0",
|
|
49
|
+
"lodash.debounce": "^4",
|
|
50
|
+
"lodash.get": "^4.4.2",
|
|
51
|
+
"marked": "^4",
|
|
52
|
+
"mockjs": "^1.1.0",
|
|
53
|
+
"nprogress": "^0.2.0",
|
|
54
|
+
"qs": "^6.11.2",
|
|
55
|
+
"regenerator-runtime": "^0.14.0",
|
|
56
|
+
"videojs-contrib-hls": "^5.15.0",
|
|
57
|
+
"viser-vue": "^2.4.8",
|
|
58
|
+
"vue": "^2.7.14",
|
|
59
|
+
"vue-codemirror": "4.0.6",
|
|
60
|
+
"vue-draggable-resizable": "^2",
|
|
61
|
+
"vue-i18n": "^8.28.2",
|
|
62
|
+
"vue-json-viewer": "^2.2.22",
|
|
63
|
+
"vue-router": "^3.6.5",
|
|
64
|
+
"vue-video-player": "^5.0.2",
|
|
65
|
+
"vue-virtual-scroller": "^1.1.2",
|
|
66
|
+
"vuedraggable": "^2.24.3",
|
|
67
|
+
"vuex": "^3.6.2",
|
|
68
|
+
"xlsx": "0.18.5"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@ant-design/colors": "^7.0.0",
|
|
72
|
+
"@babel/core": "^7.22.20",
|
|
73
|
+
"@babel/eslint-parser": "^7.22.15",
|
|
74
|
+
"@babel/preset-env": "^7.22.20",
|
|
75
|
+
"@vue/cli-plugin-babel": "^5.0.8",
|
|
76
|
+
"@vue/cli-plugin-eslint": "^5.0.8",
|
|
77
|
+
"@vue/cli-service": "^5.0.8",
|
|
78
|
+
"@vue/eslint-config-standard": "^8.0.1",
|
|
79
|
+
"@vue/test-utils": "^1.3.6",
|
|
80
|
+
"babel-plugin-transform-remove-console": "^6.9.4",
|
|
81
|
+
"compression-webpack-plugin": "^10.0.0",
|
|
82
|
+
"css-minimizer-webpack-plugin": "^5.0.1",
|
|
83
|
+
"deepmerge": "^4.3.1",
|
|
84
|
+
"eslint": "^8.51.0",
|
|
85
|
+
"eslint-plugin-vue": "^9.17.0",
|
|
86
|
+
"fast-deep-equal": "^3.1.3",
|
|
87
|
+
"ignore-loader": "^0.1.2",
|
|
88
|
+
"jest": "^29.7.0",
|
|
89
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
90
|
+
"jest-transform-stub": "^2.0.0",
|
|
91
|
+
"less-loader": "^6.2.0",
|
|
92
|
+
"script-loader": "^0.7.2",
|
|
93
|
+
"style-resources-loader": "^1.5.0",
|
|
94
|
+
"vue-cli-plugin-style-resources-loader": "^0.1.5",
|
|
95
|
+
"vue-jest": "^4.0.1",
|
|
96
|
+
"vue-template-compiler": "^2.7.14",
|
|
97
|
+
"webpack": "^5.88.2",
|
|
98
|
+
"webpack-theme-color-replacer": "^1.4.7",
|
|
99
|
+
"whatwg-fetch": "^3.6.19"
|
|
100
|
+
},
|
|
101
|
+
"browserslist": [
|
|
102
|
+
"> 1%",
|
|
103
|
+
"last 2 versions",
|
|
104
|
+
"not dead",
|
|
105
|
+
"not ie 11"
|
|
106
|
+
]
|
|
107
|
+
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="patient-info-descriptions">
|
|
3
3
|
<a-descriptions
|
|
4
|
-
:column="
|
|
5
|
-
:size="
|
|
6
|
-
:bordered="
|
|
4
|
+
:column="config?.layout"
|
|
5
|
+
:size="config?.style?.size"
|
|
6
|
+
:bordered="config?.style?.bordered"
|
|
7
7
|
layout="horizontal">
|
|
8
8
|
<template v-if="data">
|
|
9
|
+
<!-- 显示前N个标签 -->
|
|
9
10
|
<a-descriptions-item
|
|
10
|
-
v-for="item in
|
|
11
|
-
:key="item.field"
|
|
11
|
+
v-for="(item) in visibleItems"
|
|
12
|
+
:key="item.field"
|
|
13
|
+
:colon="item.colon !== false"
|
|
14
|
+
v-if="data[item.field] !== null && data[item.field] !== undefined">
|
|
12
15
|
<template #label>
|
|
13
16
|
<div :class="['label-wrapper', { 'with-avatar': item.showAvatar }]">
|
|
14
17
|
<a-avatar
|
|
@@ -24,6 +27,49 @@
|
|
|
24
27
|
{{ data[item.field] }}
|
|
25
28
|
</div>
|
|
26
29
|
</a-descriptions-item>
|
|
30
|
+
|
|
31
|
+
<!-- 详情按钮 -->
|
|
32
|
+
<a-descriptions-item v-if="hasMoreItems && !showAllItems">
|
|
33
|
+
<a-button
|
|
34
|
+
:type="config?.detailsConfig?.buttonType || 'link'"
|
|
35
|
+
@click="toggleDetails"
|
|
36
|
+
>
|
|
37
|
+
<a-icon type="down" />
|
|
38
|
+
{{ config?.detailsConfig?.buttonText || '详情' }}
|
|
39
|
+
</a-button>
|
|
40
|
+
</a-descriptions-item>
|
|
41
|
+
|
|
42
|
+
<!-- 展开后显示剩余标签 -->
|
|
43
|
+
<template v-if="showAllItems">
|
|
44
|
+
<a-descriptions-item
|
|
45
|
+
v-for="item in hiddenItems"
|
|
46
|
+
:key="item.field"
|
|
47
|
+
:colon="item.colon !== false"
|
|
48
|
+
v-if="data[item.field] !== null && data[item.field] !== undefined">
|
|
49
|
+
<template #label>
|
|
50
|
+
<div :class="['label-wrapper', { 'with-avatar': item.showAvatar }]">
|
|
51
|
+
<a-avatar
|
|
52
|
+
v-if="item.showAvatar"
|
|
53
|
+
:size="item.avatar.size"
|
|
54
|
+
:icon="item.avatar.icon"
|
|
55
|
+
:style="{ background: item.avatar.background }"
|
|
56
|
+
/>
|
|
57
|
+
<span class="label-text">{{ item.label }}</span>
|
|
58
|
+
</div>
|
|
59
|
+
</template>
|
|
60
|
+
<div class="content-wrapper">
|
|
61
|
+
{{ data[item.field] }}
|
|
62
|
+
</div>
|
|
63
|
+
</a-descriptions-item>
|
|
64
|
+
|
|
65
|
+
<!-- 收起按钮 -->
|
|
66
|
+
<a-descriptions-item>
|
|
67
|
+
<a-button type="link" @click="toggleDetails">
|
|
68
|
+
<a-icon type="up" />
|
|
69
|
+
收起
|
|
70
|
+
</a-button>
|
|
71
|
+
</a-descriptions-item>
|
|
72
|
+
</template>
|
|
27
73
|
</template>
|
|
28
74
|
</a-descriptions>
|
|
29
75
|
</div>
|
|
@@ -36,7 +82,8 @@ export default {
|
|
|
36
82
|
data () {
|
|
37
83
|
return {
|
|
38
84
|
data: null,
|
|
39
|
-
|
|
85
|
+
config: null,
|
|
86
|
+
showAllItems: false // 控制是否显示所有标签
|
|
40
87
|
}
|
|
41
88
|
},
|
|
42
89
|
props: {
|
|
@@ -51,20 +98,70 @@ export default {
|
|
|
51
98
|
}
|
|
52
99
|
}
|
|
53
100
|
},
|
|
101
|
+
computed: {
|
|
102
|
+
// 获取详情按钮应该显示在第几个标签后
|
|
103
|
+
detailsAfterIndex () {
|
|
104
|
+
// 只有明确配置了detailsConfig且设置了showAfterIndex时才使用配置值
|
|
105
|
+
// 否则返回一个很大的值,使所有字段都显示
|
|
106
|
+
return this.config?.detailsConfig?.showAfterIndex || 999
|
|
107
|
+
},
|
|
108
|
+
// 判断是否有更多标签需要显示
|
|
109
|
+
hasMoreItems () {
|
|
110
|
+
// 只有明确配置了detailsConfig时才显示详情按钮
|
|
111
|
+
if (!this.config?.detailsConfig) return false
|
|
112
|
+
// 如果没有数据或没有配置项,不显示详情按钮
|
|
113
|
+
if (!this.data || !this.config?.items || !Array.isArray(this.config.items)) return false
|
|
114
|
+
// 获取隐藏项索引
|
|
115
|
+
const hiddenStartIndex = this.detailsAfterIndex || 0
|
|
116
|
+
if (hiddenStartIndex >= this.config.items.length) return false
|
|
117
|
+
// 检查隐藏的项中是否有非空值
|
|
118
|
+
for (let i = hiddenStartIndex; i < this.config.items.length; i++) {
|
|
119
|
+
const item = this.config.items[i]
|
|
120
|
+
if (item && item.field && this.data[item.field] !== null && this.data[item.field] !== undefined) {
|
|
121
|
+
return true
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return false
|
|
125
|
+
},
|
|
126
|
+
// 获取应该显示的标签
|
|
127
|
+
visibleItems () {
|
|
128
|
+
if (!this.config?.items) return []
|
|
129
|
+
// 如果没有配置detailsConfig或者已经展开,则显示所有项
|
|
130
|
+
if (!this.config?.detailsConfig || this.showAllItems) return this.config.items
|
|
131
|
+
return this.config.items.slice(0, this.detailsAfterIndex)
|
|
132
|
+
},
|
|
133
|
+
// 获取隐藏的标签
|
|
134
|
+
hiddenItems () {
|
|
135
|
+
if (!this.config?.items) return []
|
|
136
|
+
if (!this.config?.detailsConfig) return [] // 如果没有配置detailsConfig,没有隐藏的项
|
|
137
|
+
return this.config.items.slice(this.detailsAfterIndex)
|
|
138
|
+
},
|
|
139
|
+
// 获取有效的visible项目数量(排除null值)
|
|
140
|
+
validVisibleItemsCount () {
|
|
141
|
+
if (!this.config?.items || !this.data) return 0
|
|
142
|
+
const items = this.visibleItems
|
|
143
|
+
return items.filter(item => this.data[item.field] !== null && this.data[item.field] !== undefined).length
|
|
144
|
+
}
|
|
145
|
+
},
|
|
54
146
|
created () {
|
|
55
147
|
this.getData(this.queryParamsName)
|
|
56
148
|
},
|
|
57
149
|
methods: {
|
|
58
150
|
async getData (data) {
|
|
59
151
|
this.data = null
|
|
152
|
+
this.showAllItems = false // 重置展开状态
|
|
60
153
|
getConfigByName(data, 'af-his', res => {
|
|
61
|
-
this.
|
|
62
|
-
console.log(this.
|
|
154
|
+
this.config = res
|
|
155
|
+
console.log(this.config)
|
|
63
156
|
const parameter = { ...res.parameter, ...this.parameter }
|
|
64
157
|
runLogic(res.logicName, parameter, 'af-his').then(result => {
|
|
65
158
|
this.data = result
|
|
66
159
|
})
|
|
67
160
|
})
|
|
161
|
+
},
|
|
162
|
+
// 切换详情显示状态
|
|
163
|
+
toggleDetails () {
|
|
164
|
+
this.showAllItems = !this.showAllItems
|
|
68
165
|
}
|
|
69
166
|
},
|
|
70
167
|
watch: {
|
|
@@ -138,14 +235,14 @@ export default {
|
|
|
138
235
|
color: rgba(0, 0, 0, 0.65);
|
|
139
236
|
padding: 0 !important;
|
|
140
237
|
margin: 0 !important;
|
|
141
|
-
font-size: v-bind('
|
|
238
|
+
font-size: v-bind('config?.style?.fontSize');
|
|
142
239
|
display: inline-flex !important;
|
|
143
240
|
align-items: center !important;
|
|
144
241
|
white-space: nowrap !important;
|
|
145
242
|
}
|
|
146
243
|
|
|
147
244
|
:deep(.ant-descriptions-item-content) {
|
|
148
|
-
font-size: v-bind('
|
|
245
|
+
font-size: v-bind('config?.style?.fontSize');
|
|
149
246
|
display: inline-flex !important;
|
|
150
247
|
align-items: center !important;
|
|
151
248
|
padding: 0 !important;
|
|
@@ -176,4 +273,16 @@ export default {
|
|
|
176
273
|
background-color: rgba(0, 0, 0, 0.02);
|
|
177
274
|
border-radius: 4px;
|
|
178
275
|
}
|
|
276
|
+
|
|
277
|
+
/* 添加详情按钮样式 */
|
|
278
|
+
:deep(.ant-btn-link) {
|
|
279
|
+
padding: 0;
|
|
280
|
+
height: auto;
|
|
281
|
+
line-height: 1;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
:deep(.ant-btn-link:hover) {
|
|
285
|
+
color: #1890ff;
|
|
286
|
+
background: transparent;
|
|
287
|
+
}
|
|
179
288
|
</style>
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# XHDescriptions 患者信息描述组件
|
|
2
|
+
|
|
3
|
+
## 组件介绍
|
|
4
|
+
|
|
5
|
+
`XHDescriptions` 是一个基于 Ant Design Vue 的描述列表组件封装,专用于显示患者基本信息。该组件具有以下特点:
|
|
6
|
+
|
|
7
|
+
- 支持响应式布局,在不同屏幕尺寸下自动调整列数
|
|
8
|
+
- 支持折叠/展开功能,控制信息的显示量
|
|
9
|
+
- 支持自定义样式和头像
|
|
10
|
+
- 自动隐藏值为 null 或 undefined 的字段
|
|
11
|
+
|
|
12
|
+
## 配置说明
|
|
13
|
+
|
|
14
|
+
组件通过 JSON 配置文件进行配置,主要包含以下部分:
|
|
15
|
+
|
|
16
|
+
### 1. 布局配置 (layout)
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
"layout": {
|
|
20
|
+
"xl": 8,
|
|
21
|
+
"md": 3,
|
|
22
|
+
"sm": 2,
|
|
23
|
+
"lg": 4,
|
|
24
|
+
"xs": 1,
|
|
25
|
+
"xxl": 8
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- 用于设置在不同屏幕尺寸下的列数
|
|
30
|
+
- 键名对应不同的屏幕尺寸(xs, sm, md, lg, xl, xxl)
|
|
31
|
+
- 值为每行显示的列数
|
|
32
|
+
|
|
33
|
+
### 2. 样式配置 (style)
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
"style": {
|
|
37
|
+
"size": "small",
|
|
38
|
+
"fontSize": "14px",
|
|
39
|
+
"bordered": false
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- `size`: 设置尺寸,可选值为 "default", "middle", "small"
|
|
44
|
+
- `fontSize`: 控制文字大小
|
|
45
|
+
- `bordered`: 是否显示边框
|
|
46
|
+
|
|
47
|
+
### 3. 字段配置 (items)
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
"items": [
|
|
51
|
+
{
|
|
52
|
+
"field": "patientName",
|
|
53
|
+
"style": {
|
|
54
|
+
"minHeight": "24px",
|
|
55
|
+
"width": "120px",
|
|
56
|
+
"minWidth": "100px",
|
|
57
|
+
"height": "24px"
|
|
58
|
+
},
|
|
59
|
+
"label": "患者",
|
|
60
|
+
"avatar": {
|
|
61
|
+
"size": 20,
|
|
62
|
+
"background": "#5D5C5C",
|
|
63
|
+
"icon": "user"
|
|
64
|
+
},
|
|
65
|
+
"showAvatar": true
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
每个字段可配置的属性:
|
|
71
|
+
|
|
72
|
+
- `field`: 字段名,用于从数据源获取值
|
|
73
|
+
- `label`: 显示的标签名
|
|
74
|
+
- `style`: 控制字段的样式(宽度、高度等)
|
|
75
|
+
- `showAvatar`: 是否显示头像
|
|
76
|
+
- `avatar`: 头像配置(仅当 showAvatar 为 true 时有效)
|
|
77
|
+
- `size`: 头像大小
|
|
78
|
+
- `background`: 头像背景色
|
|
79
|
+
- `icon`: 头像图标名称
|
|
80
|
+
|
|
81
|
+
### 4. 详情按钮配置 (detailsConfig)
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
"detailsConfig": {
|
|
85
|
+
"buttonText": "详细",
|
|
86
|
+
"buttonType": "link",
|
|
87
|
+
"showAfterIndex": 3
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- `buttonText`: 详情按钮显示的文本
|
|
92
|
+
- `buttonType`: 按钮类型,可选值为 "default", "primary", "dashed", "link" 等
|
|
93
|
+
- `showAfterIndex`: 控制在显示多少个字段后显示详情按钮
|
|
94
|
+
- **重要说明**:
|
|
95
|
+
- 只有明确配置了 `detailsConfig` 对象时,才会启用折叠功能
|
|
96
|
+
- 如果没有配置 `detailsConfig`,将直接显示所有字段,不会出现详情按钮
|
|
97
|
+
- 如果配置了 `detailsConfig` 但字段总数少于或等于 `showAfterIndex`,则不会显示详情按钮
|
|
98
|
+
|
|
99
|
+
### 5. 其他配置
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
"logicName": "patientBasicInfo",
|
|
103
|
+
"serverName": "af-his",
|
|
104
|
+
"parameter": {}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- `logicName`: 用于获取数据的逻辑名称
|
|
108
|
+
- `serverName`: 服务名称
|
|
109
|
+
- `parameter`: 可选的参数对象
|
|
110
|
+
|
|
111
|
+
## 使用示例
|
|
112
|
+
|
|
113
|
+
```vue
|
|
114
|
+
<template>
|
|
115
|
+
<XHDescriptions queryParamsName="DescriptionsExampleConfig" />
|
|
116
|
+
</template>
|
|
117
|
+
|
|
118
|
+
<script>
|
|
119
|
+
import XHDescriptions from '@/base-client/components/his/XHDescriptions/XHDescriptions.vue'
|
|
120
|
+
|
|
121
|
+
export default {
|
|
122
|
+
components: {
|
|
123
|
+
XHDescriptions
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
</script>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 特殊说明
|
|
130
|
+
|
|
131
|
+
1. **响应式布局**:
|
|
132
|
+
- 组件会根据屏幕尺寸自动调整列数
|
|
133
|
+
- 可在 `layout` 配置中自定义不同尺寸下的列数
|
|
134
|
+
|
|
135
|
+
2. **折叠/展开功能**:
|
|
136
|
+
- 折叠功能只在明确配置了 `detailsConfig` 对象时启用
|
|
137
|
+
- 没有配置 `detailsConfig` 时,会直接显示所有字段,不会出现详情按钮
|
|
138
|
+
- 配置了 `detailsConfig` 后,只显示 `showAfterIndex` 指定数量的字段,超出部分需点击详情按钮查看
|
|
139
|
+
- 点击详情按钮后会展开显示全部字段,可通过收起按钮恢复
|
|
140
|
+
|
|
141
|
+
3. **空值处理**:
|
|
142
|
+
- 当字段值为 `null` 或 `undefined` 时,该字段不会显示
|
|
143
|
+
- 折叠功能会忽略值为 `null` 的字段,只有有值的隐藏字段才会触发显示详情按钮
|
|
144
|
+
- 这个特性可以用于根据数据动态控制字段的显示,无需修改配置
|
|
145
|
+
|
|
146
|
+
## 配置示例
|
|
147
|
+
|
|
148
|
+
### 启用折叠功能示例
|
|
149
|
+
|
|
150
|
+
以下配置将启用折叠功能,只显示前3个字段,其余字段需点击"详细"按钮查看:
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"layout": {
|
|
155
|
+
"xl": 8,
|
|
156
|
+
"md": 3,
|
|
157
|
+
"sm": 2,
|
|
158
|
+
"lg": 4,
|
|
159
|
+
"xs": 1,
|
|
160
|
+
"xxl": 8
|
|
161
|
+
},
|
|
162
|
+
"style": {
|
|
163
|
+
"size": "small",
|
|
164
|
+
"fontSize": "14px",
|
|
165
|
+
"bordered": false
|
|
166
|
+
},
|
|
167
|
+
"items": [
|
|
168
|
+
{
|
|
169
|
+
"field": "patientName",
|
|
170
|
+
"label": "患者",
|
|
171
|
+
"showAvatar": true,
|
|
172
|
+
"avatar": {
|
|
173
|
+
"size": 20,
|
|
174
|
+
"background": "#5D5C5C",
|
|
175
|
+
"icon": "user"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"field": "patientType",
|
|
180
|
+
"label": "类别"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"field": "diagnosisNo",
|
|
184
|
+
"label": "诊号"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"field": "gender",
|
|
188
|
+
"label": "性别"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"field": "age",
|
|
192
|
+
"label": "年龄"
|
|
193
|
+
}
|
|
194
|
+
// ... 更多字段
|
|
195
|
+
],
|
|
196
|
+
"detailsConfig": {
|
|
197
|
+
"buttonText": "详细",
|
|
198
|
+
"buttonType": "link",
|
|
199
|
+
"showAfterIndex": 3 // 设置为3表示只显示前3个字段,其余字段点击"详细"后显示
|
|
200
|
+
},
|
|
201
|
+
"logicName": "patientBasicInfo",
|
|
202
|
+
"serverName": "af-his"
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 禁用折叠功能示例
|
|
207
|
+
|
|
208
|
+
如果不希望使用折叠功能,希望一次性显示所有字段,只需要移除 `detailsConfig` 对象:
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"layout": {
|
|
213
|
+
"xl": 8,
|
|
214
|
+
"md": 3,
|
|
215
|
+
"sm": 2,
|
|
216
|
+
"lg": 4,
|
|
217
|
+
"xs": 1,
|
|
218
|
+
"xxl": 8
|
|
219
|
+
},
|
|
220
|
+
"style": {
|
|
221
|
+
"size": "small",
|
|
222
|
+
"fontSize": "14px",
|
|
223
|
+
"bordered": false
|
|
224
|
+
},
|
|
225
|
+
"items": [
|
|
226
|
+
// 字段配置...
|
|
227
|
+
],
|
|
228
|
+
"logicName": "patientBasicInfo",
|
|
229
|
+
"serverName": "af-his"
|
|
230
|
+
// 没有 detailsConfig,将直接显示所有字段
|
|
231
|
+
}
|
|
232
|
+
```
|