vue2-client 1.12.54 → 1.12.56

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/.env CHANGED
@@ -13,6 +13,7 @@ VUE_APP_BADGE_KEY=admin.badge
13
13
  VUE_APP_SINGLEVALUE_KEY=admin.singlevalue
14
14
  VUE_APP_DIVISIONSOHCHINA=admin.divisionsohchina
15
15
  VUE_APP_WEB_CONFIG_KEY=admin.webconfig
16
+ VUE_APP_WEB_STYLES_KEY=admin.webstylesconfig
16
17
  VUE_APP_API_BASE_URL=http://123.60.214.109:8405
17
18
  VUE_APP_SYSTEM_NAME=af-system
18
19
  VUE_APP_LOGIN_VERSION=V4
package/package.json CHANGED
@@ -1,108 +1,108 @@
1
- {
2
- "name": "vue2-client",
3
- "version": "1.12.54",
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
- "@jest/globals": "^29.7.0",
81
- "babel-plugin-transform-remove-console": "^6.9.4",
82
- "compression-webpack-plugin": "^10.0.0",
83
- "css-minimizer-webpack-plugin": "^5.0.1",
84
- "deepmerge": "^4.3.1",
85
- "eslint": "^8.51.0",
86
- "eslint-plugin-vue": "^9.17.0",
87
- "fast-deep-equal": "^3.1.3",
88
- "ignore-loader": "^0.1.2",
89
- "jest": "^29.7.0",
90
- "jest-environment-jsdom": "^29.7.0",
91
- "jest-transform-stub": "^2.0.0",
92
- "less-loader": "^6.2.0",
93
- "script-loader": "^0.7.2",
94
- "style-resources-loader": "^1.5.0",
95
- "vue-cli-plugin-style-resources-loader": "^0.1.5",
96
- "vue-jest": "^4.0.1",
97
- "vue-template-compiler": "^2.7.14",
98
- "webpack": "^5.88.2",
99
- "webpack-theme-color-replacer": "^1.4.7",
100
- "whatwg-fetch": "^3.6.19"
101
- },
102
- "browserslist": [
103
- "> 1%",
104
- "last 2 versions",
105
- "not dead",
106
- "not ie 11"
107
- ]
108
- }
1
+ {
2
+ "name": "vue2-client",
3
+ "version": "1.12.56",
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
+ "@jest/globals": "^29.7.0",
81
+ "babel-plugin-transform-remove-console": "^6.9.4",
82
+ "compression-webpack-plugin": "^10.0.0",
83
+ "css-minimizer-webpack-plugin": "^5.0.1",
84
+ "deepmerge": "^4.3.1",
85
+ "eslint": "^8.51.0",
86
+ "eslint-plugin-vue": "^9.17.0",
87
+ "fast-deep-equal": "^3.1.3",
88
+ "ignore-loader": "^0.1.2",
89
+ "jest": "^29.7.0",
90
+ "jest-environment-jsdom": "^29.7.0",
91
+ "jest-transform-stub": "^2.0.0",
92
+ "less-loader": "^6.2.0",
93
+ "script-loader": "^0.7.2",
94
+ "style-resources-loader": "^1.5.0",
95
+ "vue-cli-plugin-style-resources-loader": "^0.1.5",
96
+ "vue-jest": "^4.0.1",
97
+ "vue-template-compiler": "^2.7.14",
98
+ "webpack": "^5.88.2",
99
+ "webpack-theme-color-replacer": "^1.4.7",
100
+ "whatwg-fetch": "^3.6.19"
101
+ },
102
+ "browserslist": [
103
+ "> 1%",
104
+ "last 2 versions",
105
+ "not dead",
106
+ "not ie 11"
107
+ ]
108
+ }
@@ -1,154 +1,154 @@
1
- <template>
2
- <div>
3
- <a-collapse
4
- :activeKey="activeKey"
5
- @change="handleChange"
6
- >
7
- <a-collapse-panel
8
- v-for="(panel, panelIndex) in config.showData"
9
- :key="panelIndex.toString()"
10
- :show-arrow="false"
11
- >
12
- <template #header>
13
- <div class="header-content">
14
- <span
15
- class="header-text"
16
- :style="config.titleStyle"
17
- >
18
- {{ panel.title }}
19
- </span>
20
- <span
21
- v-for="(item, headerIndex) in panel.title2 || []"
22
- :key="headerIndex"
23
- class="info-item"
24
- :style="config.title2Style"
25
- >
26
- <span>{{ item.key }}:</span>
27
- <span>{{ item.value }}</span>
28
- </span>
29
- <span
30
- class="time-item"
31
- :style="config.title3Style"
32
- >
33
- {{ panel.title3 }}
34
- </span>
35
- </div>
36
- </template>
37
- <!-- 根据类型显示不同内容 -->
38
- <template v-if="panel.type === 'picture'">
39
- <img :src="panel.configName" alt="图片" style="width: 100%; max-width: 500px;"/>
40
- </template>
41
- <template v-else-if="panel.type === 'cover'">
42
- <x-report
43
- :use-oss-for-img="false"
44
- :config-name="panel.configName"
45
- server-name="af-his"
46
- :show-img-in-cell="true"
47
- :display-only="true"
48
- :edit-mode="false"
49
- :show-save-button="false"
50
- :no-padding="true"
51
- :dont-format="true">
52
- </x-report>
53
- </template>
54
- </a-collapse-panel>
55
- </a-collapse>
56
- </div>
57
- </template>
58
-
59
- <script>
60
- import XReport from '@vue2-client/base-client/components/common/XReportGrid'
61
- import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
62
-
63
- export default {
64
- name: 'XCollapse',
65
- components: {
66
- XReport
67
- },
68
- inject: ['getConfigByName'],
69
- data () {
70
- return {
71
- activeKey: [],
72
- config: {}
73
- }
74
- },
75
- props: {
76
- // json名
77
- queryParamsName: {
78
- type: Object,
79
- default: 'openPrescriptionConfig'
80
- },
81
- },
82
- created () {
83
- this.getData(this.queryParamsName)
84
- },
85
- methods: {
86
- async getData (config) {
87
- getConfigByName(config, 'af-his', res => {
88
- this.config = res
89
- runLogic(res.mainLogic, {}, 'af-his').then(result => {
90
- console.log(result)
91
- this.config.showData = result
92
- this.activeKey = this.config.showData.map((_, panelIndex) => panelIndex.toString())
93
- })
94
- })
95
- },
96
- handleChange (keys) {
97
- this.activeKey = keys
98
- },
99
- },
100
- watch: {
101
- queryParamsName: {
102
- handler (newValue) {
103
- console.log(newValue)
104
- this.getData(newValue)
105
- },
106
- deep: true
107
- }
108
- }
109
- }
110
- </script>
111
-
112
- <style scoped>
113
- .header-content {
114
- display: flex;
115
- align-items: center;
116
- gap: 24px;
117
- }
118
-
119
- .header-text {
120
- margin-right: 16px;
121
- font-size: 16px;
122
- font-weight: 800; /* 默认加粗 */
123
- }
124
-
125
- .info-item {
126
- display: inline-flex;
127
- align-items: center;
128
- gap: 4px;
129
- font-size: 12px;
130
- color: #888888;
131
- }
132
-
133
- .time-item {
134
- margin-left: auto;
135
- text-align: right;
136
- }
137
-
138
- /* 覆盖 ant-design-vue 的默认样式 */
139
- :deep(.ant-collapse-header) {
140
- align-items: center !important;
141
- }
142
-
143
- :deep(.ant-collapse-header-text) {
144
- flex: 1;
145
- }
146
-
147
- :deep(.ant-collapse-content > .ant-collapse-content-box) {
148
- padding: 0;
149
- }
150
-
151
- :deep(.ant-card-body) {
152
- padding: 8px;
153
- }
154
- </style>
1
+ <template>
2
+ <div>
3
+ <a-collapse
4
+ :activeKey="activeKey"
5
+ @change="handleChange"
6
+ >
7
+ <a-collapse-panel
8
+ v-for="(panel, panelIndex) in config.showData"
9
+ :key="panelIndex.toString()"
10
+ :show-arrow="false"
11
+ >
12
+ <template #header>
13
+ <div class="header-content">
14
+ <span
15
+ class="header-text"
16
+ :style="config.titleStyle"
17
+ >
18
+ {{ panel.title }}
19
+ </span>
20
+ <span
21
+ v-for="(item, headerIndex) in panel.title2 || []"
22
+ :key="headerIndex"
23
+ class="info-item"
24
+ :style="config.title2Style"
25
+ >
26
+ <span>{{ item.key }}:</span>
27
+ <span>{{ item.value }}</span>
28
+ </span>
29
+ <span
30
+ class="time-item"
31
+ :style="config.title3Style"
32
+ >
33
+ {{ panel.title3 }}
34
+ </span>
35
+ </div>
36
+ </template>
37
+ <!-- 根据类型显示不同内容 -->
38
+ <template v-if="panel.type === 'picture'">
39
+ <img :src="panel.configName" alt="图片" style="width: 100%; max-width: 500px;"/>
40
+ </template>
41
+ <template v-else-if="panel.type === 'cover'">
42
+ <x-report
43
+ :use-oss-for-img="false"
44
+ :config-name="panel.configName"
45
+ server-name="af-his"
46
+ :show-img-in-cell="true"
47
+ :display-only="true"
48
+ :edit-mode="false"
49
+ :show-save-button="false"
50
+ :no-padding="true"
51
+ :dont-format="true">
52
+ </x-report>
53
+ </template>
54
+ </a-collapse-panel>
55
+ </a-collapse>
56
+ </div>
57
+ </template>
58
+
59
+ <script>
60
+ import XReport from '@vue2-client/base-client/components/common/XReportGrid'
61
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
62
+
63
+ export default {
64
+ name: 'XCollapse',
65
+ components: {
66
+ XReport
67
+ },
68
+ inject: ['getConfigByName'],
69
+ data () {
70
+ return {
71
+ activeKey: [],
72
+ config: {}
73
+ }
74
+ },
75
+ props: {
76
+ // json名
77
+ queryParamsName: {
78
+ type: Object,
79
+ default: 'openPrescriptionConfig'
80
+ },
81
+ },
82
+ created () {
83
+ this.init(this.queryParamsName)
84
+ },
85
+ methods: {
86
+ async init (config) {
87
+ getConfigByName(config, 'af-his', res => {
88
+ this.config = res
89
+ runLogic(res.mainLogic, localStorage.getItem(config.loc_id), 'af-his').then(result => {
90
+ console.log(result)
91
+ this.config.showData = result
92
+ this.activeKey = this.config.showData.map((_, panelIndex) => panelIndex.toString())
93
+ })
94
+ })
95
+ },
96
+ handleChange (keys) {
97
+ this.activeKey = keys
98
+ },
99
+ },
100
+ watch: {
101
+ queryParamsName: {
102
+ handler (newValue) {
103
+ console.log(newValue)
104
+ this.getData(newValue)
105
+ },
106
+ deep: true
107
+ }
108
+ }
109
+ }
110
+ </script>
111
+
112
+ <style scoped>
113
+ .header-content {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 24px;
117
+ }
118
+
119
+ .header-text {
120
+ margin-right: 16px;
121
+ font-size: 16px;
122
+ font-weight: 800; /* 默认加粗 */
123
+ }
124
+
125
+ .info-item {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ gap: 4px;
129
+ font-size: 12px;
130
+ color: #888888;
131
+ }
132
+
133
+ .time-item {
134
+ margin-left: auto;
135
+ text-align: right;
136
+ }
137
+
138
+ /* 覆盖 ant-design-vue 的默认样式 */
139
+ :deep(.ant-collapse-header) {
140
+ align-items: center !important;
141
+ }
142
+
143
+ :deep(.ant-collapse-header-text) {
144
+ flex: 1;
145
+ }
146
+
147
+ :deep(.ant-collapse-content > .ant-collapse-content-box) {
148
+ padding: 0;
149
+ }
150
+
151
+ :deep(.ant-card-body) {
152
+ padding: 8px;
153
+ }
154
+ </style>
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <x-collapse :query-params-name="openPrescriptionConfig" />
3
+ </template>
4
+
5
+ <script>
6
+ import XCollapse from '@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'
7
+ export default {
8
+ name: 'Demo',
9
+ components: { XCollapse }
10
+ }
11
+ </script>
12
+
13
+ <style scoped>
14
+
15
+ </style>
@@ -149,7 +149,7 @@ export default {
149
149
  },
150
150
  async sendMessage () {
151
151
  if (this.renderConfig.type === 'AI') {
152
- // 验证 chatId 和 aiModel
152
+ // 验证 chatId 和 aiModel
153
153
  if (!this.renderConfig.chatId || !this.renderConfig.aiModel) {
154
154
  this.$message.error('chatId 和 aiModel 不能为空,请检查调用逻辑')
155
155
  return
@@ -157,27 +157,27 @@ export default {
157
157
  }
158
158
  if (!this.inputMessage.trim()) return
159
159
 
160
- // 添加用户消息
161
- this.messages.push({ type: 'user', text: this.inputMessage })
160
+ // 添加用户消息
161
+ this.messages.push({ type: 'user', text: this.inputMessage })
162
162
 
163
- // 清空输入框
164
- const userMessage = this.inputMessage
165
- this.inputMessage = ''
166
- // 模拟机器人的回复
167
- // 通过logic获取消息
168
- if (this.renderConfig.logicName) {
169
- const response = await runLogic(this.renderConfig.logicName, {
170
- question: userMessage,
171
- additionalInfo: this.additionalInfo
172
- }, this.serviceName)
163
+ // 清空输入框
164
+ const userMessage = this.inputMessage
165
+ this.inputMessage = ''
166
+ // 模拟机器人的回复
167
+ // 通过logic获取消息
168
+ if (this.renderConfig.logicName) {
169
+ const response = await runLogic(this.renderConfig.logicName, {
170
+ question: userMessage,
171
+ additionalInfo: this.additionalInfo
172
+ }, this.serviceName)
173
173
 
174
- // 遍历并保存 additionalInfo
175
- console.log(response)
176
- if (response.additionalInfo) {
177
- Object.entries(response.additionalInfo).forEach(([key, value]) => {
178
- // 如果值是字符串类型,尝试转换为数字
179
- if (typeof value === 'string' && !isNaN(value)) {
180
- const numberValue = Number(value)
174
+ // 遍历并保存 additionalInfo
175
+ console.log(response)
176
+ if (response.additionalInfo) {
177
+ Object.entries(response.additionalInfo).forEach(([key, value]) => {
178
+ // 如果值是字符串类型,尝试转换为数字
179
+ if (typeof value === 'string' && !isNaN(value)) {
180
+ const numberValue = Number(value)
181
181
  // 检查转换后的值是否是有限数字
182
182
  if (isFinite(numberValue)) {
183
183
  this.additionalInfo[key] = numberValue
@@ -20,7 +20,7 @@
20
20
  </template>
21
21
  </div>
22
22
  </div>
23
- <div class="extra">
23
+ <div class="extra" v-if="extraShow">
24
24
  <slot name="addonAfter"/>
25
25
  </div>
26
26
  </div>
@@ -75,6 +75,11 @@ export default {
75
75
  getRealData: {
76
76
  type: Boolean,
77
77
  default: false
78
+ },
79
+ // 是否展示插槽
80
+ extraShow: {
81
+ type: Boolean,
82
+ default: true
78
83
  }
79
84
  },
80
85
  created () {
@@ -811,6 +811,7 @@ export default {
811
811
  },
812
812
  emitFunc (func, data, value) {
813
813
  this.$emit(func, data, value)
814
+ this.$emit('getEmitFuncData', func, data, value)
814
815
  },
815
816
  // 直接转发事件的函数
816
817
  emitEvent (event, ...args) {
@@ -5,7 +5,8 @@
5
5
  name="trGroup"
6
6
  v-if="Array.isArray(cell) || !cell.dontShowRow"
7
7
  :key="cellIndex"
8
- :style="isWidget ? {padding: '0px 2px'} : (Array.isArray(cell) ? {} : determineCellStyle(cell))"
8
+ :ref="`trGroup_${ cell.slotRef || cellIndex}`"
9
+ @hook:mounted="(h)=>applyAllStyles(cell,cellIndex)"
9
10
  :span="calculateColSpan(cell)">
10
11
  <div id="report_widget" v-if="isWidget">
11
12
  <!-- 插槽渲染 -->
@@ -41,7 +42,7 @@
41
42
  </template>
42
43
  </template>
43
44
  </div>
44
- <a-card v-else class="flexItem" :bordered="false" :body-style="flexItemBodyState">
45
+ <a-card v-else class="flexItem" :bordered="false">
45
46
  <!-- 插槽渲染 -->
46
47
  <template v-if="Array.isArray(cell)">
47
48
  <!-- 处理 cell 是数组的情况 -->
@@ -207,6 +208,14 @@ export default {
207
208
  ? cell[0][0]?.colSpan * 2
208
209
  : (cell?.colSpan ?? cell?.def?.colSpan ?? 1) * 2
209
210
  },
211
+ applyAllStyles (cell, cellIndex) {
212
+ // 应用组件样式
213
+ const component = this.$refs[`trGroup_${ cell.slotRef || cellIndex}`][0]
214
+ // 确保组件已经完全挂载
215
+ this.$nextTick(() => {
216
+ this.applyComponentStyles(component, cell, cellIndex)
217
+ })
218
+ },
210
219
  onComponentMounted (h, cell, cellIndex) {
211
220
  this.slotRendered += 1
212
221
  if (this.slotRendered >= this.allSlotSum) {
@@ -410,7 +419,215 @@ export default {
410
419
  }
411
420
  }
412
421
  })
413
- }
422
+ },
423
+ // 获取组件样式配置
424
+ async getComponentStyleConfig (componentType) {
425
+ try {
426
+ // 从配置中获取样式定义
427
+ const styleConfig = this.$appdata.getStylesByKey(componentType)
428
+ return styleConfig || {}
429
+ } catch (error) {
430
+ console.error('获取组件样式配置失败:', error)
431
+ return {}
432
+ }
433
+ },
434
+
435
+ // 解析组件样式配置
436
+ async parseComponentStyles (cell) {
437
+ if (!cell.class) return { rootStyles: {}, childStyles: {} }
438
+
439
+ const styleConfig = await this.getComponentStyleConfig(cell.slotType)
440
+ if (!styleConfig) return { rootStyles: {}, childStyles: {} }
441
+
442
+ const rootStyles = {}
443
+ const childStyles = new Map()
444
+
445
+ // 处理每个class配置
446
+ cell.class.split(' ').forEach(className => {
447
+ const classConfig = styleConfig[className]
448
+ if (!classConfig) return
449
+
450
+ // 处理根节点样式
451
+ Object.entries(classConfig).forEach(([key, value]) => {
452
+ if (!key.startsWith('*') && typeof key !== 'object') {
453
+ rootStyles[key] = value
454
+ }
455
+ })
456
+
457
+ // 处理子节点样式
458
+ this.parseNestedStyles(classConfig, childStyles)
459
+ })
460
+
461
+ console.warn('样式配置', rootStyles, childStyles)
462
+ return {
463
+ rootStyles,
464
+ childStyles
465
+ }
466
+ },
467
+
468
+ // 递归解析嵌套的样式配置
469
+ parseNestedStyles (config, styleMap, parentKey = '') {
470
+ Object.entries(config).forEach(([key, value]) => {
471
+ if (!key.startsWith('*')) return
472
+
473
+ const className = key.replace('*', '.')
474
+
475
+ // 如果值是对象,检查是否包含样式和子节点
476
+ if (typeof value === 'object') {
477
+ const { style = {}, children = {} } = this.separateStyleAndChildren(value)
478
+
479
+ // 创建或获取当前节点的样式配置
480
+ if (!styleMap.has(className)) {
481
+ styleMap.set(className, {
482
+ styles: {},
483
+ children: new Map()
484
+ })
485
+ }
486
+
487
+ const nodeData = styleMap.get(className)
488
+
489
+ // 合并样式
490
+ Object.assign(nodeData.styles, style)
491
+
492
+ // 递归处理子节点
493
+ this.parseNestedStyles(children, nodeData.children, className)
494
+ }
495
+ })
496
+ },
497
+
498
+ // 分离样式属性和子节点配置
499
+ separateStyleAndChildren (obj) {
500
+ const style = {}
501
+ const children = {}
502
+
503
+ Object.entries(obj).forEach(([key, value]) => {
504
+ if (key.startsWith('*')) {
505
+ // 子节点配置
506
+ children[key] = value
507
+ } else {
508
+ // 样式属性
509
+ style[key] = value
510
+ }
511
+ })
512
+
513
+ return { style, children }
514
+ },
515
+
516
+ // 应用组件样式
517
+ async applyComponentStyles (component, cell, cellIndex) {
518
+ if (!component || !component.$el) return
519
+
520
+ const { rootStyles, childStyles } = await this.parseComponentStyles(cell)
521
+
522
+ // 应用根节点样式
523
+ if (Object.keys(rootStyles).length > 0) {
524
+ Object.entries(rootStyles).forEach(([property, value]) => {
525
+ component.$el.style.setProperty(property, value, 'important')
526
+ })
527
+ }
528
+
529
+ // 如果没有子节点样式,直接返回
530
+ if (childStyles.size === 0) return
531
+
532
+ let retryCount = 0
533
+ const maxRetries = 5
534
+ const retryInterval = 100 // 100ms
535
+
536
+ const applyStyles = () => {
537
+ this.applyChildStylesOptimized(component.$el, childStyles)
538
+ }
539
+
540
+ // 首次应用样式
541
+ applyStyles()
542
+
543
+ // 创建重试机制
544
+ const retryApplyStyles = () => {
545
+ if (retryCount >= maxRetries) return
546
+
547
+ setTimeout(() => {
548
+ applyStyles()
549
+ retryCount++
550
+ retryApplyStyles()
551
+ }, retryInterval)
552
+ }
553
+
554
+ // 开始重试
555
+ retryApplyStyles()
556
+
557
+ // 创建 MutationObserver 用于动态内容
558
+ const observer = new MutationObserver((mutations) => {
559
+ // 检查是否有新增节点
560
+ const hasNewNodes = mutations.some(mutation =>
561
+ mutation.type === 'childList' && mutation.addedNodes.length > 0
562
+ )
563
+
564
+ if (hasNewNodes) {
565
+ applyStyles()
566
+ }
567
+ })
568
+
569
+ // 配置 observer
570
+ observer.observe(component.$el, {
571
+ childList: true,
572
+ subtree: true,
573
+ attributes: false
574
+ })
575
+
576
+ // 3秒后停止观察
577
+ setTimeout(() => {
578
+ observer.disconnect()
579
+ }, 3000)
580
+
581
+ // 组件销毁时清理
582
+ this.$once('hook:beforeDestroy', () => {
583
+ observer.disconnect()
584
+ })
585
+ },
586
+
587
+ // 优化后的子节点样式应用方法
588
+ applyChildStylesOptimized (rootElement, styleMap, parentSelector = '') {
589
+ if (!rootElement) return
590
+
591
+ // 处理样式映射
592
+ for (const [selector, data] of styleMap.entries()) {
593
+ const currentSelector = parentSelector ? `${parentSelector} ${selector}` : selector
594
+
595
+ try {
596
+ // 查找匹配的元素
597
+ const elements = Array.from(rootElement.querySelectorAll(currentSelector))
598
+
599
+ if (!elements.length) continue
600
+
601
+ // 应用当前层级样式
602
+ if (data.styles) {
603
+ elements.forEach(element => {
604
+ if (!element) return
605
+
606
+ // 应用每个样式属性
607
+ Object.entries(data.styles).forEach(([property, value]) => {
608
+ try {
609
+ element.style.setProperty(property, value, 'important')
610
+ } catch (err) {
611
+ console.warn(`设置样式失败: ${property}=${value}`, err)
612
+ }
613
+ })
614
+ })
615
+ }
616
+
617
+ // 处理子层级
618
+ if (data.children && data.children.size > 0) {
619
+ elements.forEach(element => {
620
+ if (element) {
621
+ this.applyChildStylesOptimized(element, data.children, currentSelector)
622
+ }
623
+ })
624
+ }
625
+ } catch (err) {
626
+ console.warn(`处理选择器失败: ${currentSelector}`, err)
627
+ continue
628
+ }
629
+ }
630
+ },
414
631
  },
415
632
  beforeMount () {
416
633
  if (this.useOssForImg) {
@@ -116,6 +116,11 @@ const GetAppDataService = {
116
116
  const str = localStorage.getItem(process.env.VUE_APP_WEB_CONFIG_KEY)
117
117
  const object = JSON.parse(str)
118
118
  return object[key]
119
- }
119
+ },
120
+ getStylesByKey (key) {
121
+ const str = localStorage.getItem(process.env.VUE_APP_STYLES_KEY)
122
+ const object = JSON.parse(str)
123
+ return object[key]
124
+ },
120
125
  }
121
126
  export default GetAppDataService
package/src/bootstrap.js CHANGED
@@ -24,6 +24,9 @@ async function bootstrap ({ router, store, i18n, message }) {
24
24
  Vue.$store.commit('setting/setSetting', res?.setting)
25
25
  }
26
26
  })
27
+ await getConfigByName('componentStyles', undefined, res => {
28
+ localStorage.setItem(process.env.VUE_APP_WEB_STYLES_KEY, JSON.stringify(res))
29
+ })
27
30
  }
28
31
  // 设置应用配置
29
32
  setAppOptions({ router, store, i18n })
@@ -4,7 +4,7 @@
4
4
  @updateImg="updateImg"
5
5
  ref="main"
6
6
  :use-oss-for-img="false"
7
- config-name="medicineMouldCover"
7
+ config-name="openPrescriptionCover"
8
8
  server-name="af-his"
9
9
  :show-img-in-cell="true"
10
10
  :display-only="displayOnly"
@@ -1,116 +1,118 @@
1
- const { homePage } = require('../../config')
2
- // 视图组件
3
- const view = {
4
- tabs: () => import('@vue2-client/layouts/tabs'),
5
- blank: () => import('@vue2-client/layouts/BlankView'),
6
- page: () => import('@vue2-client/layouts/PageView'),
7
- // his-web$ceshiGrid?type=GridView&configName=RxPreparedMed
8
- gridView: () => import('@vue2-client/layouts/GridView'),
9
- login: () => import('@vue2-client/pages/login/Login'),
10
- loginv3: () => import('@vue2-client/pages/login/LoginV3')
11
- }
12
- // 动态路由对象定义
13
- const routerResource = {}
14
- // --------------------------------------基本视图组件--------------------------------------
15
- // 空白视图
16
- routerResource.blank = view.blank
17
- // 单页面视图
18
- routerResource.singlePage = view.blank
19
- // 栅格配置视图
20
- routerResource.gridView = view.gridView
21
-
22
- // --------------------------------------仪表盘--------------------------------------
23
- routerResource.dashboard = view.blank
24
- // 工作台
25
- routerResource.workplace = () =>
26
- import('@vue2-client/pages/dashboard/workplace')
27
- // --------------------------------------系统配置--------------------------------------
28
- routerResource.system = view.blank
29
- // 字典管理
30
- routerResource.dictionaryManage = () => import('@vue2-client/pages/system/dictionary')
31
- // 文件管理
32
- routerResource.fileManager = () => import('@vue2-client/pages/system/file')
33
- // 登录日志
34
- routerResource.loginInfor = () => import('@vue2-client/pages/system/monitor/loginInfor')
35
- // 操作日志
36
- routerResource.operLog = () => import('@vue2-client/pages/system/monitor/operLog')
37
- // 系统问题反馈工单
38
- routerResource.submitTicket = () => import('@vue2-client/pages/system/ticket')
39
- // 通用服务评价
40
- routerResource.ServiceReview = () => import('@vue2-client/pages/ServiceReview')
41
- // 系统设置
42
- routerResource.settings = () => import('@vue2-client/pages/system/settings')
43
- // AMIS示例页面
44
- routerResource.amisDemo = () => import('@vue2-client/pages/AMisDemo/AMisDemo')
45
- // 页面编辑器
46
- routerResource.editablePage = () => import('@vue2-client/pages/lowCode/lowCodeEditor.vue')
47
- // 数据检索
48
- routerResource.dynamicStatistics = () => import('@vue2-client/pages/DynamicStatistics')
49
- // 数据检索(新)
50
- routerResource.newDynamicStatistics = () => import('@vue2-client/pages/NewDynamicStatistics')
51
- // 示例页面
52
- routerResource.example = {
53
- path: 'example',
54
- name: '示例主页面',
55
- // component: () => import('@vue2-client/base-client/components/common/XDescriptions/demo.vue'),
56
- // component: () => import('@vue2-client/base-client/components/common/XAddNativeForm/demo.vue'),
57
- // component: () => import('@vue2-client/base-client/components/common/XFormGroup/demo.vue'),
58
- // component: () => import('@vue2-client/base-client/components/common/XReport/XReportDemo.vue'),
59
- // component: () => import('@vue2-client/base-client/components/common/XFormTable/demo.vue'),
60
- // component: () => import('@vue2-client/base-client/components/common/XDatePicker/demo.vue'),
61
- // component: () => import('@vue2-client/base-client/components/common/XTab/XTabDemo.vue'),
62
- component: () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo.vue'),
63
- // component: () => import('@vue2-client/pages/WorkflowDetail/WorkFlowDemo.vue'),
64
- // component: () => import('@vue2-client/base-client/components/common/XConversation/XConversationDemo.vue'),
65
- // component: () => import('@vue2-client/base-client/components/common/XButtons/XButtonDemo.vue'),
66
- // component: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue'),
67
- // component: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
68
- // component: () => import('@vue2-client/base-client/components/common/XPrint/Demo.vue'),
69
- // component: () => import('@vue2-client/base-client/components/AI/demo.vue'),
70
- // component: () => import('@vue2-client/components/g2Charts/demo.vue'),
71
- // component: () => import('@vue2-client/pages/LogicCallExample/index.vue'),
72
- }
73
- // routerResource.example = () =>
74
- // import('@vue2-client/pages/Example')
75
- routerResource.XReportView = () => import('@vue2-client/pages/XReportView')
76
-
77
- routerResource.XReportGrid = () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo')
78
-
79
- routerResource.XTab = () => import('@vue2-client/base-client/components/common/XTab/XTabDemo')
80
-
81
- // 基础路由组件注册
82
- const routerMap = {
83
- login: {
84
- authority: '*',
85
- path: '/login',
86
- component: process.env.VUE_APP_LOGIN_VERSION === 'V3'
87
- ? view.loginv3 : view.login
88
- },
89
- root: {
90
- path: '/',
91
- name: '首页',
92
- redirect: homePage,
93
- component: process.env.VUE_APP_SINGLE_PAPER === 'TRUE' ? view.blank : view.tabs,
94
- },
95
- exp403: {
96
- authority: '*',
97
- name: 'exp403',
98
- path: '403',
99
- component: () =>
100
- import('@vue2-client/pages/exception/403')
101
- },
102
- exp404: {
103
- name: 'exp404',
104
- path: '404',
105
- component: () =>
106
- import('@vue2-client/pages/exception/404')
107
- },
108
- exp500: {
109
- name: 'exp500',
110
- path: '500',
111
- component: () =>
112
- import('@vue2-client/pages/exception/500')
113
- }
114
- }
115
- Object.assign(routerMap, routerResource)
116
- export default routerMap
1
+ const { homePage } = require('../../config')
2
+ // 视图组件
3
+ const view = {
4
+ tabs: () => import('@vue2-client/layouts/tabs'),
5
+ blank: () => import('@vue2-client/layouts/BlankView'),
6
+ page: () => import('@vue2-client/layouts/PageView'),
7
+ // his-web$ceshiGrid?type=GridView&configName=RxPreparedMed
8
+ gridView: () => import('@vue2-client/layouts/GridView'),
9
+ login: () => import('@vue2-client/pages/login/Login'),
10
+ loginv3: () => import('@vue2-client/pages/login/LoginV3')
11
+ }
12
+ // 动态路由对象定义
13
+ const routerResource = {}
14
+ // --------------------------------------基本视图组件--------------------------------------
15
+ // 空白视图
16
+ routerResource.blank = view.blank
17
+ // 单页面视图
18
+ routerResource.singlePage = view.blank
19
+ // 栅格配置视图
20
+ routerResource.gridView = view.gridView
21
+
22
+ // --------------------------------------仪表盘--------------------------------------
23
+ routerResource.dashboard = view.blank
24
+ // 工作台
25
+ routerResource.workplace = () =>
26
+ import('@vue2-client/pages/dashboard/workplace')
27
+ // --------------------------------------系统配置--------------------------------------
28
+ routerResource.system = view.blank
29
+ // 字典管理
30
+ routerResource.dictionaryManage = () => import('@vue2-client/pages/system/dictionary')
31
+ // 文件管理
32
+ routerResource.fileManager = () => import('@vue2-client/pages/system/file')
33
+ // 登录日志
34
+ routerResource.loginInfor = () => import('@vue2-client/pages/system/monitor/loginInfor')
35
+ // 操作日志
36
+ routerResource.operLog = () => import('@vue2-client/pages/system/monitor/operLog')
37
+ // 系统问题反馈工单
38
+ routerResource.submitTicket = () => import('@vue2-client/pages/system/ticket')
39
+ // 通用服务评价
40
+ routerResource.ServiceReview = () => import('@vue2-client/pages/ServiceReview')
41
+ // 系统设置
42
+ routerResource.settings = () => import('@vue2-client/pages/system/settings')
43
+ // AMIS示例页面
44
+ routerResource.amisDemo = () => import('@vue2-client/pages/AMisDemo/AMisDemo')
45
+ // 页面编辑器
46
+ routerResource.editablePage = () => import('@vue2-client/pages/lowCode/lowCodeEditor.vue')
47
+ // 数据检索
48
+ routerResource.dynamicStatistics = () => import('@vue2-client/pages/DynamicStatistics')
49
+ // 数据检索(新)
50
+ routerResource.newDynamicStatistics = () => import('@vue2-client/pages/NewDynamicStatistics')
51
+ // 示例页面
52
+ routerResource.example = {
53
+ path: 'example',
54
+ name: '示例主页面',
55
+ // component: () => import('@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'),
56
+ component: () => import('@vue2-client/base-client/components/common/XDataCard/XDataCard.vue'),
57
+ // component: () => import('@vue2-client/base-client/components/common/XDescriptions/demo.vue'),
58
+ // component: () => import('@vue2-client/base-client/components/common/XAddNativeForm/demo.vue'),
59
+ // component: () => import('@vue2-client/base-client/components/common/XFormGroup/demo.vue'),
60
+ // component: () => import('@vue2-client/base-client/components/common/XReport/XReportDemo.vue'),
61
+ // component: () => import('@vue2-client/base-client/components/common/XFormTable/demo.vue'),
62
+ // component: () => import('@vue2-client/base-client/components/common/XDatePicker/demo.vue'),
63
+ // component: () => import('@vue2-client/base-client/components/common/XTab/XTabDemo.vue'),
64
+ // component: () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo.vue'),
65
+ // component: () => import('@vue2-client/pages/WorkflowDetail/WorkFlowDemo.vue'),
66
+ // component: () => import('@vue2-client/base-client/components/common/XConversation/XConversationDemo.vue'),
67
+ // component: () => import('@vue2-client/base-client/components/common/XButtons/XButtonDemo.vue'),
68
+ // component: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue'),
69
+ // component: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
70
+ // component: () => import('@vue2-client/base-client/components/common/XPrint/Demo.vue'),
71
+ // component: () => import('@vue2-client/base-client/components/AI/demo.vue'),
72
+ // component: () => import('@vue2-client/components/g2Charts/demo.vue'),
73
+ // component: () => import('@vue2-client/pages/LogicCallExample/index.vue'),
74
+ }
75
+ // routerResource.example = () =>
76
+ // import('@vue2-client/pages/Example')
77
+ routerResource.XReportView = () => import('@vue2-client/pages/XReportView')
78
+
79
+ routerResource.XReportGrid = () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo')
80
+
81
+ routerResource.XTab = () => import('@vue2-client/base-client/components/common/XTab/XTabDemo')
82
+
83
+ // 基础路由组件注册
84
+ const routerMap = {
85
+ login: {
86
+ authority: '*',
87
+ path: '/login',
88
+ component: process.env.VUE_APP_LOGIN_VERSION === 'V3'
89
+ ? view.loginv3 : view.login
90
+ },
91
+ root: {
92
+ path: '/',
93
+ name: '首页',
94
+ redirect: homePage,
95
+ component: process.env.VUE_APP_SINGLE_PAPER === 'TRUE' ? view.blank : view.tabs,
96
+ },
97
+ exp403: {
98
+ authority: '*',
99
+ name: 'exp403',
100
+ path: '403',
101
+ component: () =>
102
+ import('@vue2-client/pages/exception/403')
103
+ },
104
+ exp404: {
105
+ name: 'exp404',
106
+ path: '404',
107
+ component: () =>
108
+ import('@vue2-client/pages/exception/404')
109
+ },
110
+ exp500: {
111
+ name: 'exp500',
112
+ path: '500',
113
+ component: () =>
114
+ import('@vue2-client/pages/exception/500')
115
+ }
116
+ }
117
+ Object.assign(routerMap, routerResource)
118
+ export default routerMap