xt-element-ui 1.2.8 → 1.3.1

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 (47) hide show
  1. package/docs/components/base/xt-map.md +331 -0
  2. package/docs/components/base/xt-step-price.md +103 -217
  3. package/lib/index.common.js +2218 -87
  4. package/lib/index.css +1 -1
  5. package/lib/index.umd.js +2218 -87
  6. package/lib/index.umd.min.js +5 -5
  7. package/package.json +4 -3
  8. package/src/components/ex-button/index.js +8 -2
  9. package/src/components/ex-chart/index.js +6 -0
  10. package/src/components/ex-date-picker/index.js +8 -2
  11. package/src/components/ex-icon/index.js +6 -0
  12. package/src/components/ex-page/index.js +8 -2
  13. package/src/components/ex-select-tree/index.js +8 -2
  14. package/src/components/ex-table/index.js +6 -0
  15. package/src/components/ex-upload/index.js +6 -0
  16. package/src/components/xt-button/index.js +8 -2
  17. package/src/components/xt-button/index.vue +53 -10
  18. package/src/components/xt-button/style/index.scss +147 -43
  19. package/src/components/xt-card/index.js +8 -2
  20. package/src/components/xt-card-item/index.js +8 -2
  21. package/src/components/xt-config-provider/index.js +6 -0
  22. package/src/components/xt-flex-box/index.js +8 -2
  23. package/src/components/xt-flex-box/style/index.scss +0 -9
  24. package/src/components/xt-grid-box/index.js +8 -2
  25. package/src/components/xt-grid-item/index.js +7 -1
  26. package/src/components/xt-input/index.js +8 -2
  27. package/src/components/xt-input/index.vue +66 -37
  28. package/src/components/xt-input/style/index.scss +70 -13
  29. package/src/components/xt-map/adapters/amap.js +235 -0
  30. package/src/components/xt-map/adapters/baidu.js +254 -0
  31. package/src/components/xt-map/adapters/base.js +267 -0
  32. package/src/components/xt-map/adapters/index.js +29 -0
  33. package/src/components/xt-map/adapters/tianditu.js +242 -0
  34. package/src/components/xt-map/config/xt-map-config.js +197 -0
  35. package/src/components/xt-map/index.js +22 -0
  36. package/src/components/xt-map/index.vue +351 -0
  37. package/src/components/xt-map/loaders/script-loader.js +114 -0
  38. package/src/components/xt-map/provider.vue +200 -0
  39. package/src/components/xt-map/style/index.scss +77 -0
  40. package/src/components/xt-step-price/index.js +9 -0
  41. package/src/components/xt-step-price/index.vue +12 -10
  42. package/src/components/xt-step-price/style/index.scss +32 -24
  43. package/src/components/xt-step-price-item/index.js +6 -0
  44. package/src/components/xt-step-price-item/index.vue +13 -9
  45. package/src/components/xt-text/index.js +8 -2
  46. package/src/components/xt-time/index.js +6 -0
  47. package/src/index.js +6 -0
@@ -0,0 +1,331 @@
1
+ ## XtMap 统一地图组件
2
+
3
+ 基于「高德 / 天地图 / 百度」三大地图服务商二次开发,对外暴露统一的 API,解决不同地图 SDK 的使用差异。支持暗黑主题、密钥/URL 灵活配置、地图类型动态切换。
4
+
5
+ ### 核心特性
6
+
7
+ - **统一 API**:无论使用高德、天地图还是百度,props、事件、方法完全一致
8
+ - **暗黑主题**:`theme="dark"` 一键切换,高德原生支持,其他引擎 CSS 滤镜模拟
9
+ - **灵活配置**:通过 `XtMapProvider` 全局注入,或组件 props 单独覆盖
10
+ - **地图类型**:`standard`(标准矢量) / `satellite`(卫星) / `hybrid`(混合) / `traffic`(实时路况)
11
+ - **动态切换**:provider、apiKey、地图类型、主题等均可运行时动态切换
12
+
13
+ ### 安装
14
+
15
+ ```vue
16
+ npm install xt-element-ui
17
+ ```
18
+
19
+ ### 快速开始
20
+
21
+ ```vue
22
+ <template>
23
+ <div style="width: 100%; height: 500px;">
24
+ <XtMap
25
+ provider="amap"
26
+ api-key="你的高德密钥"
27
+ :center="[116.397428, 39.90923]"
28
+ :zoom="11"
29
+ theme="light"
30
+ map-type="standard"
31
+ @ready="onMapReady"
32
+ @click="onMapClick"
33
+ />
34
+ </div>
35
+ </template>
36
+
37
+ <script>
38
+ export default {
39
+ methods: {
40
+ onMapReady({ map, provider }) {
41
+ console.log('地图已就绪,服务商:', provider)
42
+ // map 为各地图引擎的原生实例
43
+ },
44
+ onMapClick({ lnglat }) {
45
+ console.log('点击坐标:', lnglat) // [lng, lat]
46
+ }
47
+ }
48
+ }
49
+ </script>
50
+ ```
51
+
52
+ ### 全局配置(推荐)
53
+
54
+ 使用 `XtMapProvider` 统一配置项目中所有地图,无需在每个 `<XtMap>` 上重复写密钥:
55
+
56
+ ```vue
57
+ <template>
58
+ <XtMapProvider
59
+ provider="amap"
60
+ api-key="你的高德密钥"
61
+ security-js-code="你的安全密钥"
62
+ theme="light"
63
+ >
64
+ <div style="width: 100%; height: 500px;">
65
+ <XtMap :center="[116.397428, 39.90923]" :zoom="11" />
66
+ </div>
67
+ <div style="width: 100%; height: 300px; margin-top: 12px;">
68
+ <XtMap :center="[121.473701, 31.230416]" :zoom="12" map-type="satellite" />
69
+ </div>
70
+ </XtMapProvider>
71
+ </template>
72
+ ```
73
+
74
+ 或通过 `Vue.prototype.$xt` 方式配置(入口文件):
75
+
76
+ ```js
77
+ import XtElementUI from 'xt-element-ui'
78
+
79
+ Vue.use(XtElementUI, {
80
+ theme: 'light'
81
+ })
82
+
83
+ // 单独设置地图配置
84
+ import { setMapConfig, setMapProvider, setMapApiKey, setMapTheme } from 'xt-element-ui/src/components/xt-map/config/xt-map-config'
85
+
86
+ setMapProvider('amap')
87
+ setMapApiKey('你的高德密钥')
88
+ setMapTheme('dark')
89
+ ```
90
+
91
+ ### 切换三大地图服务商
92
+
93
+ #### 高德地图(推荐)
94
+
95
+ ```vue
96
+ <XtMap
97
+ provider="amap"
98
+ api-key="AMAP_KEY"
99
+ security-js-code="AMAP_SECURITY_CODE"
100
+ :center="[116.397428, 39.90923]"
101
+ :zoom="11"
102
+ />
103
+ ```
104
+
105
+ #### 天地图
106
+
107
+ ```vue
108
+ <XtMap
109
+ provider="tianditu"
110
+ api-key="TIANDITU_TK"
111
+ :center="[116.397428, 39.90923]"
112
+ :zoom="11"
113
+ />
114
+ ```
115
+
116
+ #### 百度地图
117
+
118
+ ```vue
119
+ <XtMap
120
+ provider="baidu"
121
+ api-key="BAIDU_AK"
122
+ :center="[116.397428, 39.90923]"
123
+ :zoom="11"
124
+ />
125
+ ```
126
+
127
+ ### 暗黑主题
128
+
129
+ ```vue
130
+ <template>
131
+ <div style="width: 100%; height: 500px;">
132
+ <XtMap
133
+ provider="amap"
134
+ api-key="AMAP_KEY"
135
+ theme="dark"
136
+ :center="[116.397428, 39.90923]"
137
+ :zoom="11"
138
+ />
139
+ </div>
140
+ </template>
141
+ ```
142
+
143
+ 高德地图原生支持 dark 主题样式;天地图、百度地图通过 CSS 滤镜实现近似效果。
144
+
145
+ ### 地图类型切换
146
+
147
+ ```vue
148
+ <template>
149
+ <div>
150
+ <div style="margin-bottom: 12px;">
151
+ <el-button @click="mapType = 'standard'">标准</el-button>
152
+ <el-button @click="mapType = 'satellite'">卫星</el-button>
153
+ <el-button @click="mapType = 'hybrid'">混合</el-button>
154
+ <el-button @click="mapType = 'traffic'">路况</el-button>
155
+ </div>
156
+ <div style="width: 100%; height: 500px;">
157
+ <XtMap
158
+ ref="mapRef"
159
+ provider="amap"
160
+ api-key="AMAP_KEY"
161
+ :map-type="mapType"
162
+ :center="[116.397428, 39.90923]"
163
+ :zoom="11"
164
+ />
165
+ </div>
166
+ </div>
167
+ </template>
168
+
169
+ <script>
170
+ export default {
171
+ data() {
172
+ return {
173
+ mapType: 'standard'
174
+ }
175
+ }
176
+ }
177
+ </script>
178
+ ```
179
+
180
+ ### 通过 ref 调用实例方法
181
+
182
+ ```vue
183
+ <template>
184
+ <div>
185
+ <el-button @click="zoomIn">放大</el-button>
186
+ <el-button @click="zoomOut">缩小</el-button>
187
+ <el-button @click="goToBeijing">定位北京</el-button>
188
+ <el-button @click="toggleTheme">切换主题</el-button>
189
+ <el-button @click="rebuild">重建地图</el-button>
190
+ <div style="width: 100%; height: 500px; margin-top: 12px;">
191
+ <XtMap
192
+ ref="mapRef"
193
+ provider="amap"
194
+ api-key="AMAP_KEY"
195
+ :center="[116.397428, 39.90923]"
196
+ :zoom="11"
197
+ />
198
+ </div>
199
+ </div>
200
+ </template>
201
+
202
+ <script>
203
+ export default {
204
+ data() {
205
+ return { isDark: false }
206
+ },
207
+ methods: {
208
+ zoomIn() {
209
+ const zoom = this.$refs.mapRef.getZoom()
210
+ this.$refs.mapRef.setZoom(zoom + 1)
211
+ },
212
+ zoomOut() {
213
+ const zoom = this.$refs.mapRef.getZoom()
214
+ this.$refs.mapRef.setZoom(zoom - 1)
215
+ },
216
+ goToBeijing() {
217
+ this.$refs.mapRef.setCenter([116.397428, 39.90923])
218
+ this.$refs.mapRef.setZoom(12)
219
+ },
220
+ toggleTheme() {
221
+ this.isDark = !this.isDark
222
+ this.$refs.mapRef.setTheme(this.isDark ? 'dark' : 'light')
223
+ },
224
+ rebuild() {
225
+ this.$refs.mapRef.rebuild() // 在切换 provider / apiKey 后需要调用
226
+ }
227
+ }
228
+ }
229
+ </script>
230
+ ```
231
+
232
+ ### 自定义 API URL
233
+
234
+ 如需使用自建代理或反向代理(例如解决密钥暴露问题),可通过 `api-url` 覆盖:
235
+
236
+ ```vue
237
+ <XtMap
238
+ provider="amap"
239
+ api-url="/api/map/amap?v=2.0&key=YOUR_KEY"
240
+ :center="[116.397428, 39.90923]"
241
+ :zoom="11"
242
+ />
243
+ ```
244
+
245
+ ---
246
+
247
+ ## 属性说明
248
+
249
+ ### XtMap
250
+
251
+ | 属性 | 类型 | 默认值 | 说明 |
252
+ |------|------|--------|------|
253
+ | `provider` | String | `'amap'` | 地图服务商:`amap` / `tianditu` / `baidu` |
254
+ | `api-key` | String | `''` | 地图 API 密钥 |
255
+ | `api-url` | String | `''` | 自定义 SDK 脚本 URL(为空使用官方默认 URL) |
256
+ | `map-type` | String | `'standard'` | 地图类型:`standard` / `satellite` / `hybrid` / `traffic` |
257
+ | `theme` | String | `'light'` | 主题:`light` / `dark` |
258
+ | `center` | Array | `[116.397428, 39.90923]` | 中心坐标 `[经度, 纬度]` |
259
+ | `zoom` | Number | `11` | 缩放级别 |
260
+ | `width` | String | `'100%'` | 容器宽度 |
261
+ | `height` | String | `'400px'` | 容器高度 |
262
+ | `plugins` | Array | `[]` | 插件列表 |
263
+ | `security-js-code` | String | `''` | 高德地图安全密钥(2.0 必需) |
264
+ | `tianditu-layer-type` | String | `'vec'` | 天地图图层类型 |
265
+ | `baidu-coord-type` | String | `'bd09ll'` | 百度坐标系类型 |
266
+
267
+ ### XtMapProvider
268
+
269
+ | 属性 | 类型 | 默认值 | 说明 |
270
+ |------|------|--------|------|
271
+ | `provider` | String | `'amap'` | 地图服务商 |
272
+ | `api-key` | String | `''` | 地图 API 密钥 |
273
+ | `api-url` | String | `''` | 自定义 SDK URL |
274
+ | `map-type` | String | `'standard'` | 地图类型 |
275
+ | `theme` | String | `'light'` | 主题 |
276
+ | `center` | Array | `null` | 中心坐标 |
277
+ | `zoom` | Number | `null` | 缩放级别 |
278
+ | `security-js-code` | String | `''` | 高德安全密钥 |
279
+
280
+ ---
281
+
282
+ ## 事件
283
+
284
+ | 事件 | 说明 | 参数 |
285
+ |------|------|------|
286
+ | `ready` | 地图加载完成 | `{ provider, map, adapter }` |
287
+ | `error` | 加载失败 | Error |
288
+ | `click` | 点击地图 | `{ originalEvent, lnglat }` |
289
+ | `moveend` | 地图移动结束 | `{ originalEvent }` |
290
+ | `zoomend` | 缩放结束 | `{ originalEvent }` |
291
+
292
+ ---
293
+
294
+ ## 实例方法(通过 ref 调用)
295
+
296
+ | 方法 | 说明 |
297
+ |------|------|
298
+ | `setCenter([lng, lat])` | 设置中心坐标 |
299
+ | `getCenter()` | 获取当前中心坐标 |
300
+ | `setZoom(zoom)` | 设置缩放级别 |
301
+ | `getZoom()` | 获取当前缩放级别 |
302
+ | `setMapType(type)` | 切换地图类型 |
303
+ | `setTheme(theme)` | 切换主题 |
304
+ | `getNativeMap()` | 获取地图引擎原生实例(不推荐跨 provider 使用) |
305
+ | `resize()` | 重新计算容器尺寸 |
306
+ | `rebuild()` | 销毁并重建地图(切换 provider / apiKey 后需要调用) |
307
+ | `on(eventName, handler)` | 绑定事件 |
308
+ | `off(eventName)` | 解绑事件 |
309
+
310
+ ---
311
+
312
+ ## 统一坐标说明
313
+
314
+ XtMap 对外统一使用 `WGS84` 坐标系表示为 `[经度, 纬度]`(如 `[116.397428, 39.90923]`)。
315
+
316
+ - **高德地图**:内部使用 GCJ-02,传入 WGS84 坐标正常工作(视觉差异极小)
317
+ - **百度地图**:内部使用 BD-09,传入经纬度坐标由引擎内部处理
318
+ - **天地图**:原生支持经纬度坐标
319
+
320
+ 如果需要精确的坐标转换,建议在外部完成转换后再传入 `center`。
321
+
322
+ ---
323
+
324
+ ## 注意事项
325
+
326
+ 1. **密钥获取**:高德(lbs.amap.com)、天地图(tianditu.gov.cn)、百度(lbsyun.baidu.com)
327
+ 2. **高德 2.0 需要安全密钥**:除 `api-key` 外,还需配置 `security-js-code`
328
+ 3. **百度地图 callback 机制**:SDK 通过 callback 参数触发 ready,组件内部已处理
329
+ 4. **暗黑主题差异**:高德原生支持 dark 样式,天地图/百度通过 CSS 滤镜实现,视觉效果与高德略有差异
330
+ 5. **provider / apiKey 运行时变更**:变更后地图会自动重建,无需手动调用 `rebuild()`
331
+ 6. **尺寸响应**:容器尺寸变化后可调用 `resize()` 方法重新计算,或由组件监听 window resize 自动处理