st-comp 0.0.164 → 0.0.166

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.
Files changed (145) hide show
  1. package/components.d.ts +3 -0
  2. package/es/ChartLayout.cjs +1 -1
  3. package/es/ChartLayout.js +3 -3
  4. package/es/Dialog.cjs +1 -1
  5. package/es/Dialog.js +16 -14
  6. package/es/FactorWarning.cjs +1 -1
  7. package/es/FactorWarning.js +492 -614
  8. package/es/Kline.cjs +1 -1
  9. package/es/Kline.js +16 -16
  10. package/es/KlineBasic.cjs +1 -1
  11. package/es/KlineBasic.js +477 -766
  12. package/es/KlineConfig.cjs +1 -0
  13. package/es/KlineConfig.js +703 -0
  14. package/es/KlineNew.cjs +1 -1
  15. package/es/KlineNew.js +14 -14
  16. package/es/KlinePlus.cjs +6 -0
  17. package/es/KlinePlus.js +1212 -0
  18. package/es/Pagination.cjs +1 -1
  19. package/es/Pagination.js +21 -20
  20. package/es/PasswordPrompt.cjs +1 -1
  21. package/es/PasswordPrompt.js +3 -3
  22. package/es/Table.cjs +1 -1
  23. package/es/Table.js +100 -279
  24. package/es/User.cjs +1 -1
  25. package/es/User.js +41 -39
  26. package/es/VarSelectDialog.cjs +1 -1
  27. package/es/VarSelectDialog.js +23 -22
  28. package/es/VarietySearch.cjs +1 -1
  29. package/es/VarietySearch.js +34 -32
  30. package/es/VirtualTable.cjs +5 -5
  31. package/es/VirtualTable.js +1018 -1056
  32. package/es/{_initCloneObject-47814efa.cjs → _initCloneObject-9ccbb113.cjs} +1 -1
  33. package/es/{_initCloneObject-c939f3af.js → _initCloneObject-a9305c1e.js} +3 -3
  34. package/es/base-4bcd2756.js +304 -0
  35. package/es/base-bdc10baa.cjs +5 -0
  36. package/es/{castArray-a78ae889.cjs → castArray-37eb9980.cjs} +1 -1
  37. package/es/{castArray-2440268f.js → castArray-681d750b.js} +1 -1
  38. package/es/{config-provider-722dca36.js → config-provider-93846ae3.js} +9 -9
  39. package/es/config-provider-ec6b09df.cjs +1 -0
  40. package/es/dayjs.min-19fb125f.cjs +1 -0
  41. package/es/dayjs.min-54a4e095.js +296 -0
  42. package/es/{debounce-82e23c4b.js → debounce-51046b06.js} +1 -1
  43. package/es/{debounce-cf26af24.cjs → debounce-9e323221.cjs} +1 -1
  44. package/es/{dropdown-6f8379f0.js → dropdown-65e74de8.js} +6 -6
  45. package/es/{dropdown-790d31ea.cjs → dropdown-b2dab5bb.cjs} +1 -1
  46. package/es/{el-autocomplete-75762ef9.js → el-autocomplete-5064d466.js} +9 -9
  47. package/es/{el-autocomplete-84de99ba.cjs → el-autocomplete-814993af.cjs} +1 -1
  48. package/es/el-button-960edd49.cjs +1 -0
  49. package/es/{el-button-2e878325.js → el-button-d39472d3.js} +37 -36
  50. package/es/{el-checkbox-group-45247bbf.cjs → el-checkbox-group-020b49f5.cjs} +1 -1
  51. package/es/{el-checkbox-group-5e4f32f0.js → el-checkbox-group-779f353a.js} +2 -2
  52. package/es/el-dialog-cd484c1f.cjs +1 -0
  53. package/es/el-dialog-f45ec2a1.js +267 -0
  54. package/es/el-divider-40c50ce7.cjs +1 -0
  55. package/es/el-divider-7cf13678.js +45 -0
  56. package/es/{el-empty-2ece1134.cjs → el-empty-627ec09e.cjs} +1 -1
  57. package/es/{el-empty-7f8acbdc.js → el-empty-64b2ea8a.js} +2 -2
  58. package/es/{el-form-item-45ba08ff.js → el-form-item-b31e7a98.js} +8 -8
  59. package/es/{el-form-item-47e255d4.cjs → el-form-item-e1c3104b.cjs} +2 -2
  60. package/es/{el-input-1323afd2.js → el-input-42315ac4.js} +48 -48
  61. package/es/{el-input-cb340042.cjs → el-input-5163bda3.cjs} +1 -1
  62. package/es/{el-input-number-0f194f3f.cjs → el-input-number-eb54cde4.cjs} +1 -1
  63. package/es/{el-input-number-991f8bfc.js → el-input-number-ebd64e22.js} +19 -19
  64. package/es/el-loading-15a5501c.cjs +1 -0
  65. package/es/el-loading-5d29f26d.js +187 -0
  66. package/es/{el-menu-item-4c9eb7ad.cjs → el-menu-item-ac89e804.cjs} +1 -1
  67. package/es/{el-menu-item-dbbcd01a.js → el-menu-item-d62e0a3f.js} +32 -32
  68. package/es/el-message-ad87b9dd.cjs +1 -0
  69. package/es/{el-message-03e6f342.js → el-message-bd1d2c82.js} +17 -17
  70. package/es/el-overlay-690b50aa.js +269 -0
  71. package/es/el-overlay-e5d318c3.cjs +1 -0
  72. package/es/{el-popconfirm-8372cd13.js → el-popconfirm-88bbd066.js} +13 -13
  73. package/es/{el-popconfirm-86503f8a.cjs → el-popconfirm-a497b279.cjs} +1 -1
  74. package/es/{el-popper-7adbf1c6.cjs → el-popper-14a9d493.cjs} +1 -1
  75. package/es/{el-popper-b5315f5b.js → el-popper-85365d5b.js} +63 -63
  76. package/es/{el-scrollbar-ac525239.cjs → el-scrollbar-8bf765f2.cjs} +1 -1
  77. package/es/{el-scrollbar-4dc1493a.js → el-scrollbar-bcf29780.js} +21 -21
  78. package/es/el-segmented-84707138.js +136 -0
  79. package/es/el-segmented-bccd9f2a.cjs +1 -0
  80. package/es/{el-select-31f8ac8a.cjs → el-select-1d2309a1.cjs} +1 -1
  81. package/es/{el-select-a4ad7c8b.js → el-select-d3bce4d1.js} +13 -13
  82. package/es/{el-table-column-2e7132b3.js → el-table-column-9691b26d.js} +19 -18
  83. package/es/el-table-column-be9a76bb.cjs +14 -0
  84. package/es/{el-tag-a79385c6.js → el-tag-6036f51c.js} +39 -39
  85. package/es/{el-tag-9732314f.cjs → el-tag-8d49d4d2.cjs} +1 -1
  86. package/es/{index-375e8de4.cjs → index-02ca0096.cjs} +1 -1
  87. package/es/{index-afc88a4b.cjs → index-19fa1fcf.cjs} +1 -1
  88. package/es/{index-733cd68a.js → index-21fb27eb.js} +17 -17
  89. package/es/{index-e5fe37a4.js → index-3425f2f0.js} +10 -10
  90. package/es/{index-1d85ba4b.cjs → index-5b81f4da.cjs} +1 -1
  91. package/es/index-8d3c5e96.cjs +3 -0
  92. package/es/{index-97d24ab7.js → index-8ee89b40.js} +16 -16
  93. package/es/{index-9e6e8d03.cjs → index-a99a5307.cjs} +1 -1
  94. package/es/{index-58521b9e.cjs → index-b90c746b.cjs} +1 -1
  95. package/es/index-c45ac024.js +14 -0
  96. package/es/{index-f5b9b211.js → index-cb8157f2.js} +2 -2
  97. package/es/{index-e6a36e09.js → index-d3c37134.js} +7 -7
  98. package/es/{index-65b4113e.cjs → index-d94bae37.cjs} +1 -1
  99. package/es/{index-2d9c78d4.cjs → index-e348d5e8.cjs} +1 -1
  100. package/es/{index-57a7323a.js → index-ef7c4392.js} +11 -11
  101. package/es/{index-e3353eeb.js → index-fbe85773.js} +13 -13
  102. package/es/{raf-f46caea0.cjs → raf-07cb6953.cjs} +1 -1
  103. package/es/{raf-c817c3f7.js → raf-36faa519.js} +1 -1
  104. package/es/{scroll-4fe7a76f.js → scroll-0277d145.js} +1 -1
  105. package/es/{scroll-339681d4.cjs → scroll-4769a65d.cjs} +1 -1
  106. package/es/style.css +1 -1
  107. package/es/{use-form-common-props-04fb0752.js → use-form-common-props-54c31983.js} +40 -40
  108. package/es/{use-form-common-props-74a96df2.cjs → use-form-common-props-592797e2.cjs} +1 -1
  109. package/es/use-global-config-584b62f1.cjs +1 -0
  110. package/es/use-global-config-946f61a4.js +73 -0
  111. package/es/{vnode-b15eb11b.cjs → vnode-1b827c99.cjs} +1 -1
  112. package/es/{vnode-0fd3003d.js → vnode-dfc92f20.js} +1 -1
  113. package/es/{zh-cn-cac8283b.js → zh-cn-5066f5e9.js} +2 -2
  114. package/es/{zh-cn-36f34912.cjs → zh-cn-b24a7dc9.cjs} +1 -1
  115. package/lib/bundle.js +1 -1
  116. package/lib/bundle.umd.cjs +217 -212
  117. package/lib/{index-5f63dc2e.js → index-80531492.js} +39042 -37182
  118. package/lib/{python-5918f7d5.js → python-20a1a5fc.js} +1 -1
  119. package/lib/style.css +1 -1
  120. package/package.json +1 -1
  121. package/packages/KlineConfig/config.js +39 -0
  122. package/packages/KlineConfig/index.ts +8 -0
  123. package/packages/KlineConfig/index.vue +315 -0
  124. package/packages/KlinePlus/components/SliderChart.vue +218 -0
  125. package/packages/KlinePlus/components/Tips.vue +36 -0
  126. package/packages/KlinePlus/images/buy.svg +1 -0
  127. package/packages/KlinePlus/images/sell.svg +1 -0
  128. package/packages/KlinePlus/images/t.svg +1 -0
  129. package/packages/KlinePlus/index.ts +8 -0
  130. package/packages/KlinePlus/index.vue +880 -0
  131. package/packages/KlinePlus/utils.js +705 -0
  132. package/packages/index.ts +4 -0
  133. package/src/pages/KlineConfig/index.vue +20 -0
  134. package/src/pages/KlinePlus/index.vue +180 -0
  135. package/src/router/routes.ts +10 -0
  136. package/es/base-0ca7c43a.cjs +0 -5
  137. package/es/base-b56cf478.js +0 -303
  138. package/es/config-provider-cfbb9cd8.cjs +0 -1
  139. package/es/el-button-62966947.cjs +0 -1
  140. package/es/el-message-d5ed7a4f.cjs +0 -1
  141. package/es/el-overlay-41994f67.cjs +0 -1
  142. package/es/el-overlay-47b665a0.js +0 -521
  143. package/es/el-table-column-bdc46568.cjs +0 -14
  144. package/es/index-0baeaec7.js +0 -82
  145. package/es/index-2f958e56.cjs +0 -3
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "st-comp",
3
3
  "public": true,
4
- "version": "0.0.164",
4
+ "version": "0.0.166",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -0,0 +1,39 @@
1
+ export const sellBuyOptions = [
2
+ { label: "买卖", value: 0 },
3
+ { label: "开平", value: 1 },
4
+ ];
5
+
6
+ // 默认K线用户自定义配置
7
+ export const getDefaultUserKlineConfig = () => {
8
+ return {
9
+ /**
10
+ * @description: 偏好设置
11
+ */
12
+ // 主图指标默认展示
13
+ mainIndicator: "MA",
14
+ // 成交点默认展示
15
+ sellBuy: 1,
16
+ // 单周期默认展示
17
+ singelCycle: "6",
18
+ // 多周期布局 2 4 6
19
+ multiCycleNum: 6,
20
+ // 多周期N宫格周期
21
+ multiCycleList: ["1", "2", "3", "4", "5", "6"],
22
+ // 默认展示模块
23
+ pageType: 1, // 展示模块 1-单周期, 2-多周期
24
+
25
+ /**
26
+ * @description: 功能配置
27
+ */
28
+ enable_subChart: true, // 是否启用副图
29
+ enable_sliderChart: true, // 是否启用拖拽轴
30
+ enable_tradeLogBrush: true, // 是否开启交易范围高亮
31
+ enable_dbClickOpenSingel: true, // 是否开启双击打开单周期
32
+ enable_showScreenTimeRange: true, // 是否开启显示K线当屏时间范围
33
+ };
34
+ };
35
+
36
+ // 字典文案映射
37
+ export const formatLabel = (value, options) => {
38
+ return options.find((item) => item.value === value)?.label ?? "-";
39
+ };
@@ -0,0 +1,8 @@
1
+ import { App } from "vue";
2
+ import StKlineConfig from "./index.vue";
3
+
4
+ export default {
5
+ install(app: App) {
6
+ app.component("st-klineConfig", StKlineConfig);
7
+ },
8
+ }
@@ -0,0 +1,315 @@
1
+ <!-- 用户K线自定义配置 -->
2
+ <script setup>
3
+ import { ref, reactive, onMounted, inject } from "vue";
4
+ import { getDefaultUserKlineConfig, sellBuyOptions, formatLabel } from "./config";
5
+
6
+ const { request } = inject("stConfig"); // 组件库全局配置
7
+
8
+ const emit = defineEmits("callBack");
9
+ const props = defineProps({
10
+ indicatorStore: { type: Object, default: () => ({}) }, // 指标配置Store
11
+ });
12
+
13
+ const visible = ref(false);
14
+ const form = reactive({});
15
+
16
+ const cycleOptions = ref([]);
17
+ const mainIndicatorOptions = ref([]);
18
+
19
+ // 配置: 恢复默认
20
+ const handleReset = () => {
21
+ Object.assign(form, getDefaultUserKlineConfig());
22
+ };
23
+ // 配置: 保存配置
24
+ const handleSubmit = async () => {
25
+ const json = JSON.stringify(form);
26
+ await request.post("/common/qt/updateUserConfig", { appId: 1, json });
27
+ emit("callBack", json);
28
+ visible.value = false;
29
+ };
30
+
31
+ // 获取配置数据
32
+ const getKlineConfig = async () => {
33
+ const { body } = await request.post("/common/qt/getUserConfig", { appId: 1 });
34
+ Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
35
+ };
36
+ // 获取周期选项
37
+ const getCycleOptions = async () => {
38
+ const { body } = await request.post("/common/qt/getDict", { dictIds: [1002] });
39
+ cycleOptions.value = body[1002].map((item) => {
40
+ return {
41
+ label: item.dictName,
42
+ value: item.dictCode,
43
+ };
44
+ });
45
+ };
46
+
47
+ onMounted(() => {
48
+ getCycleOptions();
49
+ mainIndicatorOptions.value = props.indicatorStore.mainIndicatorList ?? [];
50
+ });
51
+ defineExpose({
52
+ // 打开
53
+ open: async () => {
54
+ await getKlineConfig();
55
+ visible.value = true;
56
+ },
57
+ // 获取默认配置
58
+ getDefaultUserKlineConfig,
59
+ });
60
+ </script>
61
+
62
+ <template>
63
+ <div class="kline-config element-dark">
64
+ <!-- 自定义配置 -->
65
+ <el-drawer
66
+ v-model="visible"
67
+ title="K线自定义配置"
68
+ :size="320"
69
+ >
70
+ <el-scrollbar class="setting-main">
71
+ <!-- 偏好设置 -->
72
+ <el-divider style="margin-top: 8px">偏好设置</el-divider>
73
+ <div class="setting-item">
74
+ <span class="label">默认主图指标: </span>
75
+ <el-select
76
+ v-model="form.mainIndicator"
77
+ popper-class="element-dark"
78
+ >
79
+ <el-option
80
+ v-for="(item, index) in mainIndicatorOptions"
81
+ :key="index"
82
+ :label="item.label"
83
+ :value="item.value"
84
+ />
85
+ </el-select>
86
+ </div>
87
+ <div class="setting-item">
88
+ <span class="label">成交点显示模式: </span>
89
+ <el-select
90
+ v-model="form.sellBuy"
91
+ popper-class="element-dark"
92
+ >
93
+ <el-option
94
+ v-for="(item, index) in sellBuyOptions"
95
+ :key="index"
96
+ :label="item.label"
97
+ :value="item.value"
98
+ />
99
+ </el-select>
100
+ </div>
101
+ <div class="setting-item">
102
+ <span class="label">单周期默认展示: </span>
103
+ <el-select
104
+ v-model="form.singelCycle"
105
+ popper-class="element-dark"
106
+ >
107
+ <el-option
108
+ v-for="(item, index) in cycleOptions"
109
+ :key="index"
110
+ :label="item.label"
111
+ :value="item.value"
112
+ />
113
+ </el-select>
114
+ </div>
115
+ <div class="setting-item">
116
+ <span class="label">多周期默认展示: </span>
117
+ <el-segmented
118
+ size="small"
119
+ v-model="form.multiCycleNum"
120
+ :options="[
121
+ { label: '二图', value: 2 },
122
+ { label: '四图', value: 4 },
123
+ { label: '六图', value: 6 },
124
+ ]"
125
+ style="height: 26px"
126
+ />
127
+ </div>
128
+ <div :class="`setting-multi-box grid-${form.multiCycleNum}`">
129
+ <template v-for="(item, index) in form.multiCycleList.slice(0, form.multiCycleNum)">
130
+ <div class="mode">
131
+ <div class="cycleName">
132
+ <span>{{ formatLabel(form.multiCycleList[index], cycleOptions) }}</span>
133
+ <el-select
134
+ v-model="form.multiCycleList[index]"
135
+ popper-class="element-dark"
136
+ >
137
+ <el-option
138
+ v-for="(item, index) in cycleOptions"
139
+ :key="index"
140
+ :label="item.label"
141
+ :value="item.value"
142
+ />
143
+ </el-select>
144
+ </div>
145
+ <span class="content">{{ index + 1 }}号位K线</span>
146
+ </div>
147
+ </template>
148
+ </div>
149
+ <div class="setting-item">
150
+ <span class="label">默认展示模块: </span>
151
+ <el-segmented
152
+ size="small"
153
+ v-model="form.pageType"
154
+ :options="[
155
+ { label: '单周期', value: 1 },
156
+ { label: '多周期', value: 2 },
157
+ ]"
158
+ style="height: 26px"
159
+ />
160
+ </div>
161
+ <!-- 功能配置 -->
162
+ <el-divider style="margin-top: 44px">功能配置</el-divider>
163
+ <div class="setting-item">
164
+ <span class="label">启用副图: </span>
165
+ <el-switch v-model="form.enable_subChart" />
166
+ </div>
167
+ <div class="setting-item">
168
+ <span class="label">启用拖拽轴: </span>
169
+ <el-switch v-model="form.enable_sliderChart" />
170
+ </div>
171
+ <div class="setting-item">
172
+ <span class="label">交易范围高亮: </span>
173
+ <el-switch v-model="form.enable_tradeLogBrush" />
174
+ </div>
175
+ <div class="setting-item">
176
+ <span class="label">双击跳转单周期: </span>
177
+ <el-switch v-model="form.enable_dbClickOpenSingel" />
178
+ </div>
179
+ <div class="setting-item">
180
+ <span class="label">显示K线当屏时间范围: </span>
181
+ <el-switch v-model="form.enable_showScreenTimeRange" />
182
+ </div>
183
+ </el-scrollbar>
184
+ <div class="setting-footer">
185
+ <!-- 恢复默认 -->
186
+ <el-button @click="handleReset"> 恢复默认 </el-button>
187
+ <el-button
188
+ type="primary"
189
+ @click="handleSubmit"
190
+ >
191
+ 保存配置
192
+ </el-button>
193
+ </div>
194
+ </el-drawer>
195
+ </div>
196
+ </template>
197
+
198
+ <style lang="scss" scoped>
199
+ .kline-config {
200
+ cursor: default;
201
+ height: 20px;
202
+ :deep(.el-drawer__header) {
203
+ margin-bottom: 0;
204
+ background-color: #141414;
205
+ }
206
+ :deep(.el-drawer__body) {
207
+ background-color: #141414;
208
+ }
209
+ // 配置入口
210
+ .setting-icon {
211
+ cursor: pointer;
212
+ &:hover {
213
+ color: var(--el-color-primary);
214
+ }
215
+ }
216
+ // 配置内容
217
+ .setting-main {
218
+ font-size: 14px;
219
+ color: var(--el-text-color-primary);
220
+ height: calc(100% - 80px);
221
+ box-sizing: border-box;
222
+ // 单行控制项
223
+ .setting-item {
224
+ width: 100%;
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: space-between;
228
+ margin-bottom: 8px;
229
+ .el-select {
230
+ width: 130px;
231
+ }
232
+ }
233
+ // 多周期布局
234
+ .setting-multi-box {
235
+ margin-top: 13px;
236
+ margin-bottom: 18px;
237
+ .cycleName {
238
+ color: white;
239
+ font-size: 10px;
240
+ padding: 1px 2px;
241
+ padding-left: 4px;
242
+ background-color: var(--el-color-primary);
243
+ display: flex;
244
+ align-items: center;
245
+ border-bottom-left-radius: 4px;
246
+ position: absolute;
247
+ z-index: 999;
248
+ right: 0px;
249
+ top: 0px;
250
+ :deep(.el-select) {
251
+ margin-left: 4px;
252
+ width: 12px;
253
+ .el-select__icon {
254
+ margin-left: 0;
255
+ color: black;
256
+ width: 12px;
257
+ height: 12px;
258
+ }
259
+ .el-select__wrapper {
260
+ border-radius: 50%;
261
+ background: #ccc;
262
+ padding: 0;
263
+ gap: 0;
264
+ min-height: 12px;
265
+ line-height: 12px;
266
+ box-shadow: none;
267
+ }
268
+ .el-select__input {
269
+ min-width: 0 !important;
270
+ width: 0 !important;
271
+ }
272
+ }
273
+ }
274
+ .mode {
275
+ width: 100%;
276
+ height: 100%;
277
+ box-sizing: border-box;
278
+ border: 1px solid var(--el-border-color);
279
+ position: relative;
280
+ display: flex;
281
+ align-items: center;
282
+ justify-content: center;
283
+ }
284
+ }
285
+ .grid-2 {
286
+ display: grid;
287
+ grid-template-columns: repeat(2, 1fr);
288
+ grid-template-rows: repeat(1, minmax(80px, 1fr));
289
+ grid-gap: 2px;
290
+ }
291
+ .grid-4 {
292
+ display: grid;
293
+ grid-template-columns: repeat(2, 1fr);
294
+ grid-template-rows: repeat(2, minmax(80px, 1fr));
295
+ grid-gap: 2px;
296
+ }
297
+ .grid-6 {
298
+ display: grid;
299
+ grid-template-columns: repeat(3, 1fr);
300
+ grid-template-rows: repeat(2, minmax(80px, 1fr));
301
+ grid-gap: 2px;
302
+ }
303
+ }
304
+ // 底部按钮
305
+ .setting-footer {
306
+ height: 80px;
307
+ display: flex;
308
+ flex-direction: column;
309
+ justify-content: space-between;
310
+ .el-button {
311
+ margin-left: 0;
312
+ }
313
+ }
314
+ }
315
+ </style>
@@ -0,0 +1,218 @@
1
+ <!-- 图表: 拖拽轴 -->
2
+ <script setup>
3
+ import dayjs from "dayjs";
4
+ import * as echarts from "echarts";
5
+ import { debounce } from "st-func";
6
+ import { ref, onMounted, onUnmounted, watch, nextTick, inject } from "vue";
7
+
8
+ const { request } = inject("stConfig"); // 组件库全局配置
9
+
10
+ let sliderChartIns = null;
11
+ const sliderChartRef = ref(null);
12
+
13
+ const emit = defineEmits(["change"]);
14
+ const props = defineProps({
15
+ // K线当屏时间范围
16
+ screenTimeRange: { type: Array, required: true },
17
+ // 品种代码
18
+ varietyCode: { type: String, required: true },
19
+ // 品种市场类型: 0-期货, 1-股票, 2-期权
20
+ varietyStock: { type: Number, required: true },
21
+ // 复权选项 [股票]
22
+ rightType: { type: Number, required: true },
23
+ // 常用选项 [期货]
24
+ klineType: { type: Number, required: true },
25
+ });
26
+ const klineData = ref({
27
+ data: [], // <[开 收 低 高 成交额 涨跌值 涨跌百分比]>
28
+ mainIndicator: [],
29
+ subIndicator: [],
30
+ time: [],
31
+ });
32
+
33
+ // 获取日线数据
34
+ const getData = async () => {
35
+ const params = {
36
+ varietyCode: props.varietyCode,
37
+ cycle: "6",
38
+ startTime: "1999-01-01 00:00:00",
39
+ endTime: dayjs().format("YYYY-MM-DD 23:59:59"),
40
+ deleteFirstNumber: 1, // 后端要求标识
41
+ };
42
+ // 参数加工
43
+ switch (props.varietyStock) {
44
+ // 期货
45
+ case 0: {
46
+ Object.assign(params, {
47
+ contractType: props.klineType,
48
+ });
49
+ break;
50
+ }
51
+ // 股票
52
+ case 1: {
53
+ Object.assign(params, {
54
+ right: props.rightType,
55
+ });
56
+ break;
57
+ }
58
+ }
59
+ const { body } = await request.post("/middleLayer/kline/getKline", params);
60
+ if (body) {
61
+ klineData.value = body;
62
+ } else {
63
+ klineData.value = { data: [], mainIndicator: [], subIndicator: [], time: [] };
64
+ }
65
+
66
+ draw("init");
67
+ };
68
+ // 拖动拖拽轴事件
69
+ const handleDataZoomChange = debounce((params) => {
70
+ if (!params.dataZoomId) return;
71
+ const option = sliderChartIns.getOption();
72
+ if (option?.dataZoom[0]) {
73
+ const { startValue, endValue } = sliderChartIns.getOption().dataZoom[0];
74
+ const { time } = klineData.value;
75
+ const startTime = `${time[startValue].split(" ")[0]} 00:00:00`;
76
+ const endTime = `${time[endValue].split(" ")[0]} 23:59:59`;
77
+ console.log(`检测到拖拽轴被拖动, 时间区间: ${startTime} - ${endTime}`);
78
+ emit("change", { startTime, endTime });
79
+ } else {
80
+ // 未检测到, 便不执行后续逻辑
81
+ }
82
+ }, 200);
83
+ // 重置拖拽轴位置
84
+ const reset = debounce(({ startTime, endTime }) => {
85
+ draw("reset", { startTime, endTime });
86
+ }, 100);
87
+
88
+ // 绘制
89
+ const draw = (type, params) => {
90
+ switch (type) {
91
+ // 重渲染
92
+ case "init": {
93
+ const { data, time } = klineData.value;
94
+ const { xAxisData, lineData } = data.reduce(
95
+ (result, item, index) => {
96
+ result.xAxisData.push(time[index].split(" ")[0]);
97
+ result.lineData.push(item[1]);
98
+ return result;
99
+ },
100
+ { xAxisData: [], lineData: [] }
101
+ );
102
+ const option = {
103
+ grid: {
104
+ height: 0,
105
+ left: "100px",
106
+ right: "80px",
107
+ },
108
+ xAxis: {
109
+ type: "category",
110
+ data: xAxisData,
111
+ show: false,
112
+ },
113
+ yAxis: {
114
+ type: "value",
115
+ },
116
+ dataZoom: [
117
+ {
118
+ show: true,
119
+ startValue: 0,
120
+ endValue: 0,
121
+ textStyle: {
122
+ color: "#ccc",
123
+ },
124
+ },
125
+ {
126
+ type: "inside",
127
+ startValue: 0,
128
+ endValue: 0,
129
+ },
130
+ ],
131
+ series: [
132
+ {
133
+ data: lineData,
134
+ type: "line",
135
+ },
136
+ ],
137
+ };
138
+ sliderChartIns.setOption(option, true);
139
+
140
+ // 避免K线主体数据加载快于拖拽轴, 在这里检测一下, 如果K线已加载了那么就重定位一下
141
+ if (props.screenTimeRange.length) {
142
+ const [startTime, endTime] = props.screenTimeRange;
143
+ reset({ startTime, endTime });
144
+ }
145
+ break;
146
+ }
147
+ // 根据时间, 更新拖拽轴定位
148
+ case "reset": {
149
+ const { time } = klineData.value;
150
+ const startTime = dayjs(params.startTime).format("YYYY-MM-DD");
151
+ const endTime = dayjs(params.endTime).format("YYYY-MM-DD");
152
+ let startValue = -1;
153
+ let endValue = -1;
154
+ for (let index = 0; index < time.length; index++) {
155
+ const day = dayjs(time[index]).format("YYYY-MM-DD");
156
+ // 跳出循环
157
+ if (startValue !== -1 && endValue !== -1) break;
158
+ // 找寻对应开始时间的索引
159
+ if (startValue === -1) {
160
+ if (new Date(day) === new Date(startTime)) startValue = index;
161
+ else if (new Date(day) > new Date(startTime)) startValue = index - 1;
162
+ }
163
+ // 找寻对应结束时间的索引
164
+ if (endValue === -1) {
165
+ if (new Date(day) === new Date(endTime)) endValue = index;
166
+ else if (new Date(day) > new Date(endTime)) endValue = index - 1;
167
+ }
168
+ }
169
+ // 如果没找到结束索引, 直接拉到最后
170
+ if (endValue === -1) endValue = time.length - 1;
171
+ sliderChartIns.dispatchAction({
172
+ type: "dataZoom",
173
+ startValue,
174
+ endValue,
175
+ });
176
+ break;
177
+ }
178
+ }
179
+ };
180
+
181
+ onMounted(() => {
182
+ nextTick(() => {
183
+ sliderChartIns = echarts.init(sliderChartRef.value);
184
+ sliderChartIns.on("datazoom", handleDataZoomChange);
185
+ getData();
186
+ });
187
+ });
188
+ // 监控: [当屏首末时间] => 拖拽轴重定位
189
+ watch(
190
+ () => props.screenTimeRange,
191
+ (newValue) => {
192
+ const [startTime, endTime] = newValue;
193
+ reset({ startTime, endTime });
194
+ },
195
+ { deep: true }
196
+ );
197
+ onUnmounted(() => {
198
+ sliderChartIns.off("datazoom");
199
+ sliderChartIns.dispose();
200
+ });
201
+ defineExpose({
202
+ resize: debounce(() => sliderChartIns.resize(), 100),
203
+ });
204
+ </script>
205
+
206
+ <template>
207
+ <div
208
+ class="chart"
209
+ ref="sliderChartRef"
210
+ />
211
+ </template>
212
+
213
+ <style lang="scss" scoped>
214
+ .chart {
215
+ width: 100%;
216
+ height: 100%;
217
+ }
218
+ </style>
@@ -0,0 +1,36 @@
1
+ <script setup>
2
+ const props = defineProps({
3
+ data: {
4
+ type: Array,
5
+ default: () => [],
6
+ },
7
+ });
8
+ </script>
9
+
10
+ <template>
11
+ <div class="tips">
12
+ <span
13
+ v-for="(item, index) in data"
14
+ :key="index"
15
+ class="item"
16
+ :style="{ color: item.color }"
17
+ >
18
+ {{ item.label }} {{ item.value }}
19
+ </span>
20
+ </div>
21
+ </template>
22
+
23
+ <style lang="scss" scoped>
24
+ .tips {
25
+ color: white;
26
+ font-size: 12px;
27
+ display: flex;
28
+ flex-wrap: wrap;
29
+ align-items: center;
30
+ .item {
31
+ display: flex;
32
+ align-items: center;
33
+ margin-right: 6px;
34
+ }
35
+ }
36
+ </style>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1683703238725" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2625" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M198.016 109.738667A77.866667 77.866667 0 0 0 170.666667 167.68l0.512 418.944c0 22.869333 6.4 48 19.029333 75.306667 12.672 27.221333 27.989333 48.938667 45.952 64.938666l211.157333 188.202667c17.066667 15.488 40.576 23.978667 64.938667 23.594667 25.685333-0.085333 47.36-7.936 64.981333-23.594667l211.2-188.202667c17.92-16 33.194667-37.632 45.866667-64.938666 12.672-27.306667 18.773333-52.224 18.517333-74.922667L853.333333 167.253333c0-22.272-8.96-41.472-26.837333-57.472-17.578667-15.616-39.338667-23.893333-64.938667-24.405333l-499.029333 0.469333a93.312 93.312 0 0 0-64.512 23.893334z" fill="#FF0000" p-id="2626"></path><path d="M170.709333 167.722667c0.128-21.76 9.984-42.666667 27.392-57.941334a93.312 93.312 0 0 1 64.469334-23.893333L761.6 85.333333c25.6 0.554667 47.36 8.789333 64.938667 24.405334 17.92 16 26.88 35.2 26.88 57.472l-0.554667 419.84c0.298667 22.698667-5.845333 47.616-18.517333 74.922666-12.629333 27.306667-27.946667 48.896-45.824 64.896l-211.242667 188.202667c-17.578667 15.701333-39.253333 23.509333-64.938667 23.594667a94.72 94.72 0 0 1-64.981333-23.594667l-211.157333-188.16c-17.92-16.042667-33.28-37.717333-45.909334-64.981333-12.672-27.306667-19.029333-52.394667-19.029333-75.306667L170.666667 167.722667z m42.666667 0.256l0.554667 418.688c0 16.213333 4.821333 35.328 15.018666 57.344 10.368 22.272 22.357333 39.210667 35.626667 51.072l211.413333 188.416c8.96 8.106667 21.888 12.8 36.224 12.544 15.530667-0.042667 27.093333-4.266667 36.693334-12.8l211.157333-188.117334c13.312-11.946667 25.301333-28.842667 35.584-51.072 10.112-21.845333 14.762667-40.576 14.506667-57.045333l0.554666-419.754667c0-9.898667-3.584-17.621333-12.458666-25.6a54.698667 54.698667 0 0 0-36.608-13.610666l-499.626667 0.469333a51.328 51.328 0 0 0-35.754667 13.312 36.565333 36.565333 0 0 0-12.501333 21.461333l-0.426667 4.693334z" fill="#AE0000" p-id="2627"></path><path d="M384 654.122667h153.514667c96.768 0 142.762667-48.981333 142.762666-117.077334 0-59.733333-33.450667-88.405333-84.821333-97.962666v-1.792c48.981333-15.530667 66.901333-46.592 66.901333-89.6 0-65.109333-40.618667-103.338667-134.997333-103.338667H384v409.770667z m72.874667-54.954667v-131.413333h66.304c51.968 0 80.042667 17.92 80.042666 65.109333 0 44.8-26.282667 66.304-75.861333 66.304h-70.485333z m0-180.394667V298.709333h60.330666c47.189333 0 72.277333 14.933333 72.277334 59.136 0 46.592-32.256 60.928-75.264 60.928h-57.344z" fill="#FFFFFF" p-id="2628"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1683703241664" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2777" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M198.016 109.738667A77.866667 77.866667 0 0 0 170.666667 167.68l0.512 418.944c0 22.869333 6.4 48 19.029333 75.306667 12.672 27.221333 27.989333 48.938667 45.952 64.938666l211.157333 188.202667c17.066667 15.488 40.576 23.978667 64.938667 23.594667 25.685333-0.085333 47.36-7.936 64.981333-23.594667l211.2-188.202667c17.92-16 33.194667-37.632 45.866667-64.938666 12.672-27.306667 18.773333-52.224 18.517333-74.922667L853.333333 167.253333c0-22.272-8.96-41.472-26.837333-57.472-17.578667-15.616-39.338667-23.893333-64.938667-24.405333l-499.029333 0.469333a93.312 93.312 0 0 0-64.512 23.893334z" fill="#54AB30" p-id="2778"></path><path d="M170.666667 167.68c0.128-21.76 9.941333-42.666667 27.349333-57.941333a93.312 93.312 0 0 1 64.512-23.893334L761.557333 85.333333c25.6 0.554667 47.36 8.789333 64.938667 24.405334 17.92 16 26.837333 35.2 26.837333 57.472l-0.512 419.84c0.298667 22.656-5.845333 47.616-18.517333 74.88-12.672 27.306667-27.946667 48.938667-45.866667 64.938666l-211.2 188.202667c-17.621333 15.658667-39.253333 23.509333-64.981333 23.594667a94.72 94.72 0 0 1-64.938667-23.594667l-211.2-188.202667c-17.92-16-33.237333-37.717333-45.909333-64.938666-12.629333-27.306667-19.029333-52.437333-19.029333-75.306667L170.666667 167.68z m42.624 0.256l0.554666 418.688c0 16.170667 4.864 35.328 15.061334 57.344 10.368 22.272 22.314667 39.168 35.626666 51.029333l211.413334 188.416c8.96 8.106667 21.888 12.8 36.224 12.586667 15.530667-0.042667 27.093333-4.266667 36.693333-12.8l211.114667-188.16c13.354667-11.946667 25.301333-28.842667 35.626666-51.072 10.112-21.76 14.762667-40.533333 14.506667-57.002667L810.666667 167.210667c0-9.898667-3.584-17.621333-12.501334-25.6A54.698667 54.698667 0 0 0 761.6 128l-499.626667 0.469333a51.328 51.328 0 0 0-35.754666 13.269334 36.565333 36.565333 0 0 0-12.501334 21.504l-0.426666 4.693333z" fill="#388D14" p-id="2779"></path><path d="M506.453333 674.730667c99.157333 0 146.346667-48.384 146.346667-126.037334 0-72.874667-38.826667-99.754667-103.338667-118.272l-38.229333-11.946666c-40.618667-11.349333-52.565333-25.088-52.565333-57.344 0-32.853333 23.893333-50.773333 66.901333-50.773334 45.397333 0 78.848 9.557333 104.533333 20.309334V273.322667c-22.698667-11.946667-51.968-22.101333-105.728-22.101334-92.586667 0-137.386667 47.189333-137.386666 116.48 0 69.290667 35.242667 100.352 93.184 116.48l38.826666 10.752c44.8 13.738667 59.733333 26.88 59.733334 60.928 0 37.034667-23.296 59.733333-78.250667 59.733334-44.8 0-83.626667-10.752-116.48-25.088v57.941333c28.074667 14.933333 68.693333 26.282667 122.453333 26.282667z" fill="#FFFFFF" p-id="2780"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1683703228202" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3078" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M198.016 109.738667A77.866667 77.866667 0 0 0 170.666667 167.68l0.512 418.944c0 22.869333 6.4 48 19.029333 75.306667 12.672 27.221333 27.989333 48.938667 45.952 64.938666l211.157333 188.202667c17.066667 15.488 40.576 23.978667 64.938667 23.594667 25.685333-0.085333 47.36-7.936 64.981333-23.594667l211.2-188.202667c17.92-16 33.194667-37.632 45.866667-64.938666 12.672-27.306667 18.773333-52.224 18.517333-74.922667L853.333333 167.253333c0-22.272-8.96-41.472-26.837333-57.472-17.578667-15.616-39.338667-23.893333-64.938667-24.405333l-499.029333 0.469333a93.312 93.312 0 0 0-64.512 23.893334z" fill="#C880FF" p-id="3079"></path><path d="M170.666667 167.68c0.128-21.76 9.941333-42.666667 27.349333-57.941333a93.312 93.312 0 0 1 64.512-23.893334L761.557333 85.333333c25.6 0.554667 47.36 8.789333 64.938667 24.405334 17.92 16 26.837333 35.2 26.837333 57.472l-0.512 419.84c0.298667 22.656-5.845333 47.616-18.517333 74.88-12.672 27.306667-27.946667 48.938667-45.866667 64.938666l-211.2 188.202667c-17.621333 15.658667-39.253333 23.509333-64.981333 23.594667a94.72 94.72 0 0 1-64.938667-23.594667l-211.2-188.202667c-17.92-16-33.237333-37.717333-45.909333-64.938666-12.629333-27.306667-19.029333-52.437333-19.029333-75.306667L170.666667 167.68z m42.624 0.256l0.554666 418.688c0 16.170667 4.864 35.328 15.061334 57.344 10.368 22.272 22.314667 39.168 35.626666 51.029333l211.413334 188.416c8.96 8.106667 21.888 12.8 36.224 12.586667 15.530667-0.042667 27.093333-4.266667 36.693333-12.8l211.114667-188.16c13.354667-11.946667 25.301333-28.842667 35.626666-51.072 10.112-21.76 14.762667-40.533333 14.506667-57.002667L810.666667 167.210667c0-9.898667-3.584-17.621333-12.501334-25.6A54.698667 54.698667 0 0 0 761.6 128l-499.626667 0.469333a51.328 51.328 0 0 0-35.754666 13.269334 36.565333 36.565333 0 0 0-12.501334 21.504l-0.426666 4.693333z" fill="#AE44FF" p-id="3080"></path><path d="M475.306667 658.218667h73.472V306.389333h116.48V248.448h-307.626667v57.941333h117.674667z" fill="#FFFFFF" p-id="3081"></path></svg>
@@ -0,0 +1,8 @@
1
+ import { App } from "vue";
2
+ import StKlinePlus from "./index.vue";
3
+
4
+ export default {
5
+ install(app: App) {
6
+ app.component("st-klinePlus", StKlinePlus);
7
+ },
8
+ }