@peng_kai/kit 0.3.0-beta.3 → 0.3.0-beta.31

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 (61) hide show
  1. package/.vscode/settings.json +2 -2
  2. package/admin/components/currency/src/CurrencyIcon.vue +37 -33
  3. package/admin/components/date/PeriodPicker.vue +122 -0
  4. package/admin/components/date/TimeFieldSelectForLabel.vue +24 -0
  5. package/admin/components/date/TtaTimeZone.vue +516 -0
  6. package/admin/components/date/TtaTimeZoneSimple.vue +104 -0
  7. package/admin/components/date/helpers.ts +250 -0
  8. package/admin/components/date/index.ts +6 -0
  9. package/admin/components/date/presetProps.ts +19 -0
  10. package/admin/components/filter/src/FilterReset.vue +52 -8
  11. package/admin/components/filter/src/more/TableSetting.vue +95 -0
  12. package/admin/components/provider/Admin.vue +17 -0
  13. package/admin/components/provider/admin-permission.ts +48 -0
  14. package/admin/components/provider/admin-router.ts +361 -0
  15. package/admin/components/provider/index.ts +3 -0
  16. package/admin/components/rich-text/src/RichText.new.vue +19 -6
  17. package/admin/components/rich-text/src/editorConfig.ts +76 -1
  18. package/admin/components/settings/src/SchemaForm.vue +5 -4
  19. package/admin/components/settings/src/Settings.vue +1 -1
  20. package/admin/components/text/index.ts +2 -0
  21. package/admin/components/text/src/Amount.v2.vue +131 -0
  22. package/admin/components/text/src/Datetime.vue +17 -12
  23. package/admin/components/text/src/IP.vue +17 -3
  24. package/admin/components/text/src/Num.vue +192 -0
  25. package/admin/layout/large/Breadcrumb.vue +10 -23
  26. package/admin/layout/large/Content.vue +9 -6
  27. package/admin/layout/large/Layout.vue +129 -0
  28. package/admin/layout/large/Menu.vue +24 -17
  29. package/admin/layout/large/Notice.vue +152 -0
  30. package/admin/layout/large/Tabs.vue +183 -0
  31. package/admin/layout/large/index.ts +61 -1
  32. package/admin/layout/large/y682.mp3 +0 -0
  33. package/admin/permission/routerGuard.ts +24 -11
  34. package/admin/permission/vuePlugin.ts +5 -10
  35. package/admin/route-guards/index.ts +0 -1
  36. package/admin/stores/index.ts +1 -0
  37. package/admin/styles/classCover.scss +1 -1
  38. package/admin/styles/index.scss +2 -2
  39. package/antd/hooks/useAntdModal.ts +27 -13
  40. package/antd/hooks/useAntdTable.ts +10 -7
  41. package/antd/hooks/useAntdTheme.ts +7 -0
  42. package/antd/hooks/useTableColumns.ts +83 -0
  43. package/antd/index.ts +1 -1
  44. package/libs/bignumber.ts +1 -1
  45. package/libs/dayjs.ts +16 -2
  46. package/libs/fingerprintjs.ts +1 -0
  47. package/package.json +64 -95
  48. package/request/interceptors/getDeviceInfo.ts +14 -0
  49. package/utils/LocaleManager.ts +1 -1
  50. package/utils/index.ts +1 -4
  51. package/utils/locale/LocaleManager.ts +2 -1
  52. package/utils/locale/helpers.ts +9 -0
  53. package/utils/number.ts +8 -10
  54. package/utils/storage.ts +31 -0
  55. package/utils/string.ts +1 -2
  56. package/utils/upload/AwsS3.ts +11 -4
  57. package/admin/layout/large/PageTab.vue +0 -70
  58. package/admin/route-guards/collapseMenu.ts +0 -11
  59. package/libs/a-calc.ts +0 -1
  60. package/vue/components/test/KitTest.vue +0 -9
  61. package/vue/components/test/testStore.ts +0 -11
@@ -0,0 +1,516 @@
1
+ <script lang="ts">
2
+ import dayjs from '../../../libs/dayjs';
3
+ import { ref, computed } from 'vue';
4
+ import { useNow } from '@vueuse/core';
5
+ import { Dropdown, Card, Input, Button, Empty } from 'ant-design-vue';
6
+ import { getTtaTimeZone } from './helpers';
7
+
8
+ const timeZonesZh: Record<string, string> = {
9
+ 'Africa/Abidjan': '非洲/阿比让',
10
+ 'Africa/Accra': '非洲/阿克拉',
11
+ 'Africa/Addis_Ababa': '非洲/亚的斯亚贝巴',
12
+ 'Africa/Algiers': '非洲/阿尔及尔',
13
+ 'Africa/Asmera': '非洲/阿斯马拉',
14
+ 'Africa/Bamako': '非洲/巴马科',
15
+ 'Africa/Bangui': '非洲/班吉',
16
+ 'Africa/Banjul': '非洲/班珠尔',
17
+ 'Africa/Bissau': '非洲/比绍',
18
+ 'Africa/Blantyre': '非洲/布兰太尔',
19
+ 'Africa/Brazzaville': '非洲/布拉柴维尔',
20
+ 'Africa/Bujumbura': '非洲/布琼布拉',
21
+ 'Africa/Cairo': '非洲/开罗',
22
+ 'Africa/Casablanca': '非洲/卡萨布兰卡',
23
+ 'Africa/Ceuta': '非洲/休达',
24
+ 'Africa/Conakry': '非洲/科纳克里',
25
+ 'Africa/Dakar': '非洲/达喀尔',
26
+ 'Africa/Dar_es_Salaam': '非洲/达累斯萨拉姆',
27
+ 'Africa/Djibouti': '非洲/吉布提',
28
+ 'Africa/Douala': '非洲/杜阿拉',
29
+ 'Africa/El_Aaiun': '非洲/阿尤恩',
30
+ 'Africa/Freetown': '非洲/弗里敦',
31
+ 'Africa/Gaborone': '非洲/哈博罗内',
32
+ 'Africa/Harare': '非洲/哈拉雷',
33
+ 'Africa/Johannesburg': '非洲/约翰内斯堡',
34
+ 'Africa/Juba': '非洲/朱巴',
35
+ 'Africa/Kampala': '非洲/坎帕拉',
36
+ 'Africa/Khartoum': '非洲/喀土穆',
37
+ 'Africa/Kigali': '非洲/基加利',
38
+ 'Africa/Kinshasa': '非洲/金沙萨',
39
+ 'Africa/Lagos': '非洲/拉各斯',
40
+ 'Africa/Libreville': '非洲/利伯维尔',
41
+ 'Africa/Lome': '非洲/洛美',
42
+ 'Africa/Luanda': '非洲/罗安达',
43
+ 'Africa/Lubumbashi': '非洲/卢本巴希',
44
+ 'Africa/Lusaka': '非洲/卢萨卡',
45
+ 'Africa/Malabo': '非洲/马拉博',
46
+ 'Africa/Maputo': '非洲/马普托',
47
+ 'Africa/Maseru': '非洲/马塞卢',
48
+ 'Africa/Mbabane': '非洲/姆巴巴内',
49
+ 'Africa/Mogadishu': '非洲/摩加迪沙',
50
+ 'Africa/Monrovia': '非洲/蒙罗维亚',
51
+ 'Africa/Nairobi': '非洲/内罗毕',
52
+ 'Africa/Ndjamena': '非洲/恩贾梅纳',
53
+ 'Africa/Niamey': '非洲/尼亚美',
54
+ 'Africa/Nouakchott': '非洲/努瓦克肖特',
55
+ 'Africa/Ouagadougou': '非洲/瓦加杜古',
56
+ 'Africa/Porto-Novo': '非洲/波多诺伏',
57
+ 'Africa/Sao_Tome': '非洲/圣多美',
58
+ 'Africa/Tripoli': '非洲/的黎波里',
59
+ 'Africa/Tunis': '非洲/突尼斯',
60
+ 'Africa/Windhoek': '非洲/温得和克',
61
+ 'America/Adak': '美洲/阿达克',
62
+ 'America/Anchorage': '美洲/安克雷奇',
63
+ 'America/Anguilla': '美洲/安圭拉',
64
+ 'America/Antigua': '美洲/安提瓜',
65
+ 'America/Araguaina': '美洲/阿拉瓜伊纳',
66
+ 'America/Argentina/La_Rioja': '美洲/阿根廷/拉里奥哈',
67
+ 'America/Argentina/Rio_Gallegos': '美洲/阿根廷/里奥加耶戈斯',
68
+ 'America/Argentina/Salta': '美洲/阿根廷/萨尔塔',
69
+ 'America/Argentina/San_Juan': '美洲/阿根廷/圣胡安',
70
+ 'America/Argentina/San_Luis': '美洲/阿根廷/圣路易斯',
71
+ 'America/Argentina/Tucuman': '美洲/阿根廷/图库曼',
72
+ 'America/Argentina/Ushuaia': '美洲/阿根廷/乌斯怀亚',
73
+ 'America/Aruba': '美洲/阿鲁巴',
74
+ 'America/Asuncion': '美洲/亚松森',
75
+ 'America/Bahia': '美洲/巴伊亚',
76
+ 'America/Bahia_Banderas': '美洲/巴伊亚班德拉斯',
77
+ 'America/Barbados': '美洲/巴巴多斯',
78
+ 'America/Belem': '美洲/贝伦',
79
+ 'America/Belize': '美洲/伯利兹',
80
+ 'America/Blanc-Sablon': '美洲/布朗萨布隆',
81
+ 'America/Boa_Vista': '美洲/博阿维斯塔',
82
+ 'America/Bogota': '美洲/波哥大',
83
+ 'America/Boise': '美洲/博伊西',
84
+ 'America/Buenos_Aires': '美洲/布宜诺斯艾利斯',
85
+ 'America/Cambridge_Bay': '美洲/剑桥湾',
86
+ 'America/Campo_Grande': '美洲/大坎普',
87
+ 'America/Cancun': '美洲/坎昆',
88
+ 'America/Caracas': '美洲/加拉加斯',
89
+ 'America/Catamarca': '美洲/卡塔马卡',
90
+ 'America/Cayenne': '美洲/卡宴',
91
+ 'America/Cayman': '美洲/开曼',
92
+ 'America/Chicago': '美洲/芝加哥',
93
+ 'America/Chihuahua': '美洲/奇瓦瓦',
94
+ 'America/Ciudad_Juarez': '美洲/华雷斯城',
95
+ 'America/Coral_Harbour': '美洲/珊瑚港',
96
+ 'America/Cordoba': '美洲/科尔多瓦',
97
+ 'America/Costa_Rica': '美洲/哥斯达黎加',
98
+ 'America/Creston': '美洲/克雷斯顿',
99
+ 'America/Cuiaba': '美洲/库亚巴',
100
+ 'America/Curacao': '美洲/库拉索',
101
+ 'America/Danmarkshavn': '美洲/丹马克沙文',
102
+ 'America/Dawson': '美洲/道森',
103
+ 'America/Dawson_Creek': '美洲/道森克里克',
104
+ 'America/Denver': '美洲/丹佛',
105
+ 'America/Detroit': '美洲/底特律',
106
+ 'America/Dominica': '美洲/多米尼加',
107
+ 'America/Edmonton': '美洲/埃德蒙顿',
108
+ 'America/Eirunepe': '美洲/埃鲁内佩',
109
+ 'America/El_Salvador': '美洲/萨尔瓦多',
110
+ 'America/Fort_Nelson': '美洲/纳尔逊堡',
111
+ 'America/Fortaleza': '美洲/福塔莱萨',
112
+ 'America/Glace_Bay': '美洲/格莱斯湾',
113
+ 'America/Godthab': '美洲/戈特霍布',
114
+ 'America/Goose_Bay': '美洲/古斯湾',
115
+ 'America/Grand_Turk': '美洲/大特克',
116
+ 'America/Grenada': '美洲/格林纳达',
117
+ 'America/Guadeloupe': '美洲/瓜德罗普',
118
+ 'America/Guatemala': '美洲/危地马拉',
119
+ 'America/Guayaquil': '美洲/瓜亚基尔',
120
+ 'America/Guyana': '美洲/圭亚那',
121
+ 'America/Halifax': '美洲/哈利法克斯',
122
+ 'America/Havana': '美洲/哈瓦那',
123
+ 'America/Hermosillo': '美洲/埃莫西约',
124
+ 'America/Indiana/Knox': '美洲/印第安纳/诺克斯',
125
+ 'America/Indiana/Marengo': '美洲/印第安纳/马伦戈',
126
+ 'America/Indiana/Petersburg': '美洲/印第安纳/彼得堡',
127
+ 'America/Indiana/Tell_City': '美洲/印第安纳/特尔城',
128
+ 'America/Indiana/Vevay': '美洲/印第安纳/维维',
129
+ 'America/Indiana/Vincennes': '美洲/印第安纳/文森斯',
130
+ 'America/Indiana/Winamac': '美洲/印第安纳/威纳马克',
131
+ 'America/Indianapolis': '美洲/印第安纳波利斯',
132
+ 'America/Inuvik': '美洲/伊努维克',
133
+ 'America/Iqaluit': '美洲/伊魁特',
134
+ 'America/Jamaica': '美洲/牙买加',
135
+ 'America/Jujuy': '美洲/胡胡伊',
136
+ 'America/Juneau': '美洲/朱诺',
137
+ 'America/Kentucky/Monticello': '美洲/肯塔基/蒙蒂塞洛',
138
+ 'America/Kralendijk': '美洲/克拉伦代克',
139
+ 'America/La_Paz': '美洲/拉巴斯',
140
+ 'America/Lima': '美洲/利马',
141
+ 'America/Los_Angeles': '美洲/洛杉矶',
142
+ 'America/Louisville': '美洲/路易斯维尔',
143
+ 'America/Lower_Princes': '美洲/下王子区',
144
+ 'America/Maceio': '美洲/马塞约',
145
+ 'America/Managua': '美洲/马那瓜',
146
+ 'America/Manaus': '美洲/马瑙斯',
147
+ 'America/Marigot': '美洲/马里戈特',
148
+ 'America/Martinique': '美洲/马提尼克',
149
+ 'America/Matamoros': '美洲/马塔莫罗斯',
150
+ 'America/Mazatlan': '美洲/马萨特兰',
151
+ 'America/Mendoza': '美洲/门多萨',
152
+ 'America/Menominee': '美洲/梅诺米尼',
153
+ 'America/Merida': '美洲/梅里达',
154
+ 'America/Metlakatla': '美洲/梅特拉卡特拉',
155
+ 'America/Mexico_City': '美洲/墨西哥城',
156
+ 'America/Miquelon': '美洲/密克隆',
157
+ 'America/Moncton': '美洲/蒙克顿',
158
+ 'America/Monterrey': '美洲/蒙特雷',
159
+ 'America/Montevideo': '美洲/蒙得维的亚',
160
+ 'America/Montserrat': '美洲/蒙特塞拉特',
161
+ 'America/Nassau': '美洲/拿骚',
162
+ 'America/New_York': '美洲/纽约',
163
+ 'America/Nome': '美洲/诺姆',
164
+ 'America/Noronha': '美洲/诺罗尼亚',
165
+ 'America/North_Dakota/Beulah': '美洲/北达科他/比尤拉',
166
+ 'America/North_Dakota/Center': '美洲/北达科他/中心',
167
+ 'America/North_Dakota/New_Salem': '美洲/北达科他/新塞勒姆',
168
+ 'America/Ojinaga': '美洲/奥希纳加',
169
+ 'America/Panama': '美洲/巴拿马',
170
+ 'America/Paramaribo': '美洲/帕拉马里博',
171
+ 'America/Phoenix': '美洲/凤凰城',
172
+ 'America/Port-au-Prince': '美洲/太子港',
173
+ 'America/Port_of_Spain': '美洲/西班牙港',
174
+ 'America/Porto_Velho': '美洲/波多韦柳',
175
+ 'America/Puerto_Rico': '美洲/波多黎各',
176
+ 'America/Punta_Arenas': '美洲/蓬塔阿雷纳斯',
177
+ 'America/Rankin_Inlet': '美洲/兰金湾',
178
+ 'America/Recife': '美洲/累西腓',
179
+ 'America/Regina': '美洲/里贾纳',
180
+ 'America/Resolute': '美洲/雷索卢特',
181
+ 'America/Rio_Branco': '美洲/里奥布朗库',
182
+ 'America/Santarem': '美洲/圣塔伦',
183
+ 'America/Santiago': '美洲/圣地亚哥',
184
+ 'America/Santo_Domingo': '美洲/圣多明各',
185
+ 'America/Sao_Paulo': '美洲/圣保罗',
186
+ 'America/Scoresbysund': '美洲/斯科斯比松',
187
+ 'America/Sitka': '美洲/锡特卡',
188
+ 'America/St_Barthelemy': '美洲/圣巴泰勒米',
189
+ 'America/St_Johns': '美洲/圣约翰斯',
190
+ 'America/St_Kitts': '美洲/圣基茨',
191
+ 'America/St_Lucia': '美洲/圣卢西亚',
192
+ 'America/St_Thomas': '美洲/圣托马斯',
193
+ 'America/St_Vincent': '美洲/圣文森特',
194
+ 'America/Swift_Current': '美洲/斯威夫特卡伦特',
195
+ 'America/Tegucigalpa': '美洲/特古西加尔巴',
196
+ 'America/Thule': '美洲/图勒',
197
+ 'America/Tijuana': '美洲/蒂华纳',
198
+ 'America/Toronto': '美洲/多伦多',
199
+ 'America/Tortola': '美洲/托尔托拉',
200
+ 'America/Vancouver': '美洲/温哥华',
201
+ 'America/Whitehorse': '美洲/怀特霍斯',
202
+ 'America/Winnipeg': '美洲/温尼伯',
203
+ 'America/Yakutat': '美洲/亚库塔特',
204
+ 'Antarctica/Casey': '南极洲/凯西',
205
+ 'Antarctica/Davis': '南极洲/戴维斯',
206
+ 'Antarctica/DumontDUrville': '南极洲/迪蒙迪维尔',
207
+ 'Antarctica/Macquarie': '南极洲/麦夸里',
208
+ 'Antarctica/Mawson': '南极洲/莫森',
209
+ 'Antarctica/McMurdo': '南极洲/麦克默多',
210
+ 'Antarctica/Palmer': '南极洲/帕尔默',
211
+ 'Antarctica/Rothera': '南极洲/罗瑟拉',
212
+ 'Antarctica/Syowa': '南极洲/昭和',
213
+ 'Antarctica/Troll': '南极洲/特罗尔',
214
+ 'Antarctica/Vostok': '南极洲/沃斯托克',
215
+ 'Arctic/Longyearbyen': '北极/朗伊尔城',
216
+ 'Asia/Aden': '亚洲/亚丁',
217
+ 'Asia/Almaty': '亚洲/阿拉木图',
218
+ 'Asia/Amman': '亚洲/安曼',
219
+ 'Asia/Anadyr': '亚洲/阿纳德尔',
220
+ 'Asia/Aqtau': '亚洲/阿克套',
221
+ 'Asia/Aqtobe': '亚洲/阿克托别',
222
+ 'Asia/Ashgabat': '亚洲/阿什哈巴德',
223
+ 'Asia/Atyrau': '亚洲/阿特劳',
224
+ 'Asia/Baghdad': '亚洲/巴格达',
225
+ 'Asia/Bahrain': '亚洲/巴林',
226
+ 'Asia/Baku': '亚洲/巴库',
227
+ 'Asia/Bangkok': '亚洲/曼谷',
228
+ 'Asia/Barnaul': '亚洲/巴尔瑙尔',
229
+ 'Asia/Beirut': '亚洲/贝鲁特',
230
+ 'Asia/Bishkek': '亚洲/比什凯克',
231
+ 'Asia/Brunei': '亚洲/文莱',
232
+ 'Asia/Calcutta': '亚洲/加尔各答',
233
+ 'Asia/Chita': '亚洲/赤塔',
234
+ 'Asia/Colombo': '亚洲/科伦坡',
235
+ 'Asia/Damascus': '亚洲/大马士革',
236
+ 'Asia/Dhaka': '亚洲/达卡',
237
+ 'Asia/Dili': '亚洲/帝力',
238
+ 'Asia/Dubai': '亚洲/迪拜',
239
+ 'Asia/Dushanbe': '亚洲/杜尚别',
240
+ 'Asia/Famagusta': '亚洲/法马古斯塔',
241
+ 'Asia/Gaza': '亚洲/加沙',
242
+ 'Asia/Hebron': '亚洲/希伯伦',
243
+ 'Asia/Hong_Kong': '亚洲/香港',
244
+ 'Asia/Hovd': '亚洲/科布多',
245
+ 'Asia/Irkutsk': '亚洲/伊尔库茨克',
246
+ 'Asia/Jakarta': '亚洲/雅加达',
247
+ 'Asia/Jayapura': '亚洲/查亚普拉',
248
+ 'Asia/Jerusalem': '亚洲/耶路撒冷',
249
+ 'Asia/Kabul': '亚洲/喀布尔',
250
+ 'Asia/Kamchatka': '亚洲/堪察加',
251
+ 'Asia/Karachi': '亚洲/卡拉奇',
252
+ 'Asia/Katmandu': '亚洲/加德满都',
253
+ 'Asia/Khandyga': '亚洲/汉德加',
254
+ 'Asia/Krasnoyarsk': '亚洲/克拉斯诺亚尔斯克',
255
+ 'Asia/Kuala_Lumpur': '亚洲/吉隆坡',
256
+ 'Asia/Kuching': '亚洲/古晋',
257
+ 'Asia/Kuwait': '亚洲/科威特',
258
+ 'Asia/Macau': '亚洲/澳门',
259
+ 'Asia/Magadan': '亚洲/马加丹',
260
+ 'Asia/Makassar': '亚洲/望加锡',
261
+ 'Asia/Manila': '亚洲/马尼拉',
262
+ 'Asia/Muscat': '亚洲/马斯喀特',
263
+ 'Asia/Nicosia': '亚洲/尼科西亚',
264
+ 'Asia/Novokuznetsk': '亚洲/新库兹涅茨克',
265
+ 'Asia/Novosibirsk': '亚洲/新西伯利亚',
266
+ 'Asia/Omsk': '亚洲/鄂木斯克',
267
+ 'Asia/Oral': '亚洲/乌拉尔',
268
+ 'Asia/Phnom_Penh': '亚洲/金边',
269
+ 'Asia/Pontianak': '亚洲/坤甸',
270
+ 'Asia/Pyongyang': '亚洲/平壤',
271
+ 'Asia/Qatar': '亚洲/卡塔尔',
272
+ 'Asia/Qostanay': '亚洲/科斯塔奈',
273
+ 'Asia/Qyzylorda': '亚洲/克孜勒奥尔达',
274
+ 'Asia/Rangoon': '亚洲/仰光',
275
+ 'Asia/Riyadh': '亚洲/利雅得',
276
+ 'Asia/Saigon': '亚洲/西贡',
277
+ 'Asia/Sakhalin': '亚洲/萨哈林',
278
+ 'Asia/Samarkand': '亚洲/撒马尔罕',
279
+ 'Asia/Seoul': '亚洲/首尔',
280
+ 'Asia/Shanghai': '亚洲/上海',
281
+ 'Asia/Singapore': '亚洲/新加坡',
282
+ 'Asia/Srednekolymsk': '亚洲/中科雷姆斯克',
283
+ 'Asia/Taipei': '亚洲/台北',
284
+ 'Asia/Tashkent': '亚洲/塔什干',
285
+ 'Asia/Tbilisi': '亚洲/第比利斯',
286
+ 'Asia/Tehran': '亚洲/德黑兰',
287
+ 'Asia/Thimphu': '亚洲/廷布',
288
+ 'Asia/Tokyo': '亚洲/东京',
289
+ 'Asia/Tomsk': '亚洲/托木斯克',
290
+ 'Asia/Ulaanbaatar': '亚洲/乌兰巴托',
291
+ 'Asia/Urumqi': '亚洲/乌鲁木齐',
292
+ 'Asia/Ust-Nera': '亚洲/乌斯季涅拉',
293
+ 'Asia/Vientiane': '亚洲/万象',
294
+ 'Asia/Vladivostok': '亚洲/符拉迪沃斯托克',
295
+ 'Asia/Yakutsk': '亚洲/雅库茨克',
296
+ 'Asia/Yekaterinburg': '亚洲/叶卡捷琳堡',
297
+ 'Asia/Yerevan': '亚洲/埃里温',
298
+ 'Atlantic/Azores': '大西洋/亚速尔',
299
+ 'Atlantic/Bermuda': '大西洋/百慕大',
300
+ 'Atlantic/Canary': '大西洋/加那利',
301
+ 'Atlantic/Cape_Verde': '大西洋/佛得角',
302
+ 'Atlantic/Faeroe': '大西洋/法罗',
303
+ 'Atlantic/Madeira': '大西洋/马德拉',
304
+ 'Atlantic/Reykjavik': '大西洋/雷克雅未克',
305
+ 'Atlantic/South_Georgia': '大西洋/南乔治亚',
306
+ 'Atlantic/St_Helena': '大西洋/圣赫勒拿',
307
+ 'Atlantic/Stanley': '大西洋/斯坦利',
308
+ 'Australia/Adelaide': '澳大利亚/阿德莱德',
309
+ 'Australia/Brisbane': '澳大利亚/布里斯班',
310
+ 'Australia/Broken_Hill': '澳大利亚/布罗肯希尔',
311
+ 'Australia/Darwin': '澳大利亚/达尔文',
312
+ 'Australia/Eucla': '澳大利亚/尤克拉',
313
+ 'Australia/Hobart': '澳大利亚/霍巴特',
314
+ 'Australia/Lindeman': '澳大利亚/林德曼',
315
+ 'Australia/Lord_Howe': '澳大利亚/豪勋爵岛',
316
+ 'Australia/Melbourne': '澳大利亚/墨尔本',
317
+ 'Australia/Perth': '澳大利亚/珀斯',
318
+ 'Australia/Sydney': '澳大利亚/悉尼',
319
+ 'Europe/Amsterdam': '欧洲/阿姆斯特丹',
320
+ 'Europe/Andorra': '欧洲/安道尔',
321
+ 'Europe/Astrakhan': '欧洲/阿斯特拉罕',
322
+ 'Europe/Athens': '欧洲/雅典',
323
+ 'Europe/Belgrade': '欧洲/贝尔格莱德',
324
+ 'Europe/Berlin': '欧洲/柏林',
325
+ 'Europe/Bratislava': '欧洲/布拉迪斯拉发',
326
+ 'Europe/Brussels': '欧洲/布鲁塞尔',
327
+ 'Europe/Bucharest': '欧洲/布加勒斯特',
328
+ 'Europe/Budapest': '欧洲/布达佩斯',
329
+ 'Europe/Busingen': '欧洲/布辛根',
330
+ 'Europe/Chisinau': '欧洲/基希讷乌',
331
+ 'Europe/Copenhagen': '欧洲/哥本哈根',
332
+ 'Europe/Dublin': '欧洲/都柏林',
333
+ 'Europe/Gibraltar': '欧洲/直布罗陀',
334
+ 'Europe/Guernsey': '欧洲/根西',
335
+ 'Europe/Helsinki': '欧洲/赫尔辛基',
336
+ 'Europe/Isle_of_Man': '欧洲/马恩岛',
337
+ 'Europe/Istanbul': '欧洲/伊斯坦布尔',
338
+ 'Europe/Jersey': '欧洲/泽西',
339
+ 'Europe/Kaliningrad': '欧洲/加里宁格勒',
340
+ 'Europe/Kiev': '欧洲/基辅',
341
+ 'Europe/Kirov': '欧洲/基洛夫',
342
+ 'Europe/Lisbon': '欧洲/里斯本',
343
+ 'Europe/Ljubljana': '欧洲/卢布尔雅那',
344
+ 'Europe/London': '欧洲/伦敦',
345
+ 'Europe/Luxembourg': '欧洲/卢森堡',
346
+ 'Europe/Madrid': '欧洲/马德里',
347
+ 'Europe/Malta': '欧洲/马耳他',
348
+ 'Europe/Mariehamn': '欧洲/玛丽港',
349
+ 'Europe/Minsk': '欧洲/明斯克',
350
+ 'Europe/Monaco': '欧洲/摩纳哥',
351
+ 'Europe/Moscow': '欧洲/莫斯科',
352
+ 'Europe/Oslo': '欧洲/奥斯陆',
353
+ 'Europe/Paris': '欧洲/巴黎',
354
+ 'Europe/Podgorica': '欧洲/波德戈里察',
355
+ 'Europe/Prague': '欧洲/布拉格',
356
+ 'Europe/Riga': '欧洲/里加',
357
+ 'Europe/Rome': '欧洲/罗马',
358
+ 'Europe/Samara': '欧洲/萨马拉',
359
+ 'Europe/San_Marino': '欧洲/圣马力诺',
360
+ 'Europe/Sarajevo': '欧洲/萨拉热窝',
361
+ 'Europe/Saratov': '欧洲/萨拉托夫',
362
+ 'Europe/Simferopol': '欧洲/辛菲罗波尔',
363
+ 'Europe/Skopje': '欧洲/斯科普里',
364
+ 'Europe/Sofia': '欧洲/索非亚',
365
+ 'Europe/Stockholm': '欧洲/斯德哥尔摩',
366
+ 'Europe/Tallinn': '欧洲/塔林',
367
+ 'Europe/Tirane': '欧洲/地拉那',
368
+ 'Europe/Ulyanovsk': '欧洲/乌里扬诺夫斯克',
369
+ 'Europe/Vaduz': '欧洲/瓦杜兹',
370
+ 'Europe/Vatican': '欧洲/梵蒂冈',
371
+ 'Europe/Vienna': '欧洲/维也纳',
372
+ 'Europe/Vilnius': '欧洲/维尔纽斯',
373
+ 'Europe/Volgograd': '欧洲/伏尔加格勒',
374
+ 'Europe/Warsaw': '欧洲/华沙',
375
+ 'Europe/Zagreb': '欧洲/萨格勒布',
376
+ 'Europe/Zurich': '欧洲/苏黎世',
377
+ 'Indian/Antananarivo': '印度洋/安塔那那利佛',
378
+ 'Indian/Chagos': '印度洋/查戈斯',
379
+ 'Indian/Christmas': '印度洋/圣诞岛',
380
+ 'Indian/Cocos': '印度洋/科科斯',
381
+ 'Indian/Comoro': '印度洋/科摩罗',
382
+ 'Indian/Kerguelen': '印度洋/凯尔盖朗',
383
+ 'Indian/Mahe': '印度洋/马埃',
384
+ 'Indian/Maldives': '印度洋/马尔代夫',
385
+ 'Indian/Mauritius': '印度洋/毛里求斯',
386
+ 'Indian/Mayotte': '印度洋/马约特',
387
+ 'Indian/Reunion': '印度洋/留尼汪',
388
+ 'Pacific/Apia': '太平洋/阿皮亚',
389
+ 'Pacific/Auckland': '太平洋/奥克兰',
390
+ 'Pacific/Bougainville': '太平洋/布干维尔',
391
+ 'Pacific/Chatham': '太平洋/查塔姆',
392
+ 'Pacific/Easter': '太平洋/复活节岛',
393
+ 'Pacific/Efate': '太平洋/埃法特',
394
+ 'Pacific/Enderbury': '太平洋/恩德伯里',
395
+ 'Pacific/Fakaofo': '太平洋/法考福',
396
+ 'Pacific/Fiji': '太平洋/斐济',
397
+ 'Pacific/Funafuti': '太平洋/富纳富提',
398
+ 'Pacific/Galapagos': '太平洋/加拉帕戈斯',
399
+ 'Pacific/Gambier': '太平洋/甘比尔',
400
+ 'Pacific/Guadalcanal': '太平洋/瓜达尔卡纳尔',
401
+ 'Pacific/Guam': '太平洋/关岛',
402
+ 'Pacific/Honolulu': '太平洋/檀香山',
403
+ 'Pacific/Kiritimati': '太平洋/基里蒂马蒂',
404
+ 'Pacific/Kosrae': '太平洋/科斯雷',
405
+ 'Pacific/Kwajalein': '太平洋/夸贾林',
406
+ 'Pacific/Majuro': '太平洋/马朱罗',
407
+ 'Pacific/Marquesas': '太平洋/马克萨斯',
408
+ 'Pacific/Midway': '太平洋/中途岛',
409
+ 'Pacific/Nauru': '太平洋/瑙鲁',
410
+ 'Pacific/Niue': '太平洋/纽埃',
411
+ 'Pacific/Norfolk': '太平洋/诺福克',
412
+ 'Pacific/Noumea': '太平洋/努美阿',
413
+ 'Pacific/Pago_Pago': '太平洋/帕果帕果',
414
+ 'Pacific/Palau': '太平洋/帕劳',
415
+ 'Pacific/Pitcairn': '太平洋/皮特凯恩',
416
+ 'Pacific/Ponape': '太平洋/波纳佩',
417
+ 'Pacific/Port_Moresby': '太平洋/莫尔兹比港',
418
+ 'Pacific/Rarotonga': '太平洋/拉罗汤加',
419
+ 'Pacific/Saipan': '太平洋/塞班',
420
+ 'Pacific/Tahiti': '太平洋/塔希提',
421
+ 'Pacific/Tarawa': '太平洋/塔拉瓦',
422
+ 'Pacific/Tongatapu': '太平洋/汤加塔布',
423
+ 'Pacific/Truk': '太平洋/楚克',
424
+ 'Pacific/Wake': '太平洋/威克岛',
425
+ 'Pacific/Wallis': '太平洋/瓦利斯',
426
+ };
427
+
428
+ export const timeZones = Intl.supportedValuesOf('timeZone').map(tz => ({
429
+ en: tz,
430
+ cn: timeZonesZh[tz],
431
+ offset: getTimeZoneOffset(tz),
432
+ }));
433
+
434
+ function getTimeZoneOffset(timeZone: string) {
435
+ const date = new Date();
436
+ const formatter = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'short' });
437
+ const tzString = formatter.formatToParts(date).find(part => part.type === 'timeZoneName')?.value;
438
+ return tzString?.split(' ')[0] || '';
439
+ }
440
+ </script>
441
+
442
+ <script setup lang="ts">
443
+ const visible = ref(false);
444
+ const ttaTimeZone = getTtaTimeZone();
445
+ const now = useNow({ interval: 100 });
446
+ const utcNow = computed(() => [dayjs().utc(), dayjs(now.value)][0]);
447
+ const tzInfo = computed(() => timeZones.find(x => x.en === (ttaTimeZone.value === 'UTC' ? dayjs.tz.guess() : ttaTimeZone.value))!);
448
+ const tzNow = computed(() => [ttaTimeZone.value === 'UTC' ? dayjs() : dayjs().tz(ttaTimeZone.value), dayjs(now.value)][0]);
449
+
450
+ const keyword = ref<string>();
451
+ const timeZonesSearched = computed(() => {
452
+ const kw = keyword.value;
453
+ return kw
454
+ ? timeZones.filter(x =>
455
+ String(x.cn).includes(kw)
456
+ || x.en.toLowerCase().includes(kw.toLowerCase())
457
+ || x.offset.includes(kw),
458
+ )
459
+ : timeZones;
460
+ });
461
+
462
+ function onSelect(tz: string) {
463
+ ttaTimeZone.value = tz;
464
+ visible.value = false;
465
+ }
466
+ </script>
467
+
468
+ <template>
469
+ <Dropdown v-model:open="visible" placement="topLeft" trigger="click" arrow>
470
+ <div class="cursor-pointer">
471
+ <div>
472
+ <div class="text-xs text-$antd-colorTextSecondary"
473
+ :class="{ '!text-$antd-colorPrimaryText': ttaTimeZone === 'UTC' }">
474
+ UTC 协调世界时
475
+ </div>
476
+ <div class="text-sm">
477
+ {{ utcNow.format('YYYY/MM/DD HH:mm:ss') }}
478
+ </div>
479
+ </div>
480
+ <div class="mt-1">
481
+ <div class="break-words text-xs text-$antd-colorTextSecondary"
482
+ :class="{ '!text-$antd-colorPrimaryText': ttaTimeZone !== 'UTC' }">
483
+ {{ tzInfo.cn }}
484
+ </div>
485
+ <div class="text-sm">
486
+ {{ tzNow.format('YYYY/MM/DD HH:mm:ss Z') }}
487
+ </div>
488
+ </div>
489
+ </div>
490
+ <template #overlay>
491
+ <Card class="w-80" title="切换时区" size="small" :bordered="false">
492
+ <Input v-model:value="keyword" placeholder="搜索时区名、UTC偏移量" allowClear />
493
+ <div class="mt-1 flex gap-1">
494
+ <Button block @click="onSelect('UTC')">
495
+ UTC
496
+ </Button>
497
+ <Button block @click="onSelect(dayjs.tz.guess())">
498
+ 本地
499
+ </Button>
500
+ </div>
501
+ <div class="mt-2 h-80 overflow-auto">
502
+ <template v-if="timeZonesSearched.length">
503
+ <div v-for="item of timeZonesSearched" :key="item.en"
504
+ class="cursor-pointer rounded-2 px-[5px] py-2 hover:bg-$antd-colorFillTertiary"
505
+ @click="onSelect(item.en)">
506
+ <span>{{ item.en }}</span>&nbsp;
507
+ <span>{{ item.cn }}</span>&nbsp;
508
+ <span>{{ item.offset }}</span>
509
+ </div>
510
+ </template>
511
+ <Empty v-else class="mt-15" description="没有找到相关时区" :image="Empty.PRESENTED_IMAGE_SIMPLE" />
512
+ </div>
513
+ </Card>
514
+ </template>
515
+ </Dropdown>
516
+ </template>
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ import { timeZones } from './TtaTimeZone.vue';
3
+ import { customRef } from 'vue';
4
+ import { Select } from 'ant-design-vue';
5
+ import { getTtaTimeZone } from './helpers';
6
+
7
+ const offsetOptions = [
8
+ { label: 'UTC', value: 'UTC' },
9
+ { label: "GMT+01:00", value: "GMT+1" },
10
+ { label: "GMT+02:00", value: "GMT+2" },
11
+ { label: "GMT+03:00", value: "GMT+3" },
12
+ { label: "GMT+03:30", value: "GMT+3:30" },
13
+ { label: "GMT+04:00", value: "GMT+4" },
14
+ { label: "GMT+04:30", value: "GMT+4:30" },
15
+ { label: "GMT+05:00", value: "GMT+5" },
16
+ { label: "GMT+05:30", value: "GMT+5:30" },
17
+ { label: "GMT+05:45", value: "GMT+5:45" },
18
+ { label: "GMT+06:00", value: "GMT+6" },
19
+ { label: "GMT+06:30", value: "GMT+6:30" },
20
+ { label: "GMT+07:00", value: "GMT+7" },
21
+ { label: "GMT+08:00", value: "GMT+8" },
22
+ { label: "GMT+08:45", value: "GMT+8:45" },
23
+ { label: "GMT+09:00", value: "GMT+9" },
24
+ { label: "GMT+09:30", value: "GMT+9:30" },
25
+ { label: "GMT+10:00", value: "GMT+10" },
26
+ { label: "GMT+10:30", value: "GMT+10:30" },
27
+ { label: "GMT+11:00", value: "GMT+11" },
28
+ { label: "GMT+12:00", value: "GMT+12" },
29
+ { label: "GMT+12:45", value: "GMT+12:45" },
30
+ { label: "GMT+13:00", value: "GMT+13" },
31
+ { label: "GMT+14:00", value: "GMT+14" },
32
+ { label: "GMT-01:00", value: "GMT-1" },
33
+ { label: "GMT-02:00", value: "GMT-2" },
34
+ { label: "GMT-02:30", value: "GMT-2:30" },
35
+ { label: "GMT-03:00", value: "GMT-3" },
36
+ { label: "GMT-04:00", value: "GMT-4" },
37
+ { label: "GMT-05:00", value: "GMT-5" },
38
+ { label: "GMT-06:00", value: "GMT-6" },
39
+ { label: "GMT-07:00", value: "GMT-7" },
40
+ { label: "GMT-08:00", value: "GMT-8" },
41
+ { label: "GMT-09:00", value: "GMT-9" },
42
+ { label: "GMT-09:30", value: "GMT-9:30" },
43
+ { label: "GMT-10:00", value: "GMT-10" },
44
+ { label: "GMT-11:00", value: "GMT-11" },
45
+ ]
46
+ </script>
47
+
48
+ <script lang="ts" setup>
49
+ const ttaTimeZone = getTtaTimeZone();
50
+ const current = customRef((track, trigger) => {
51
+ return {
52
+ get() {
53
+ let value = 'UTC';
54
+
55
+ if (ttaTimeZone.value !== value) {
56
+ const tz = timeZones.find(x => x.en === ttaTimeZone.value);
57
+ value = offsetOptions.find(x => x.value === tz?.offset)?.value || value;
58
+ }
59
+
60
+ track();
61
+ return value;
62
+ },
63
+ set(value: string) {
64
+ if (value === 'UTC') {
65
+ ttaTimeZone.value = 'UTC';
66
+ } else {
67
+ const tz = timeZones.find(x => x.offset === value);
68
+ tz && (ttaTimeZone.value = tz.en);
69
+ }
70
+
71
+ trigger();
72
+ }
73
+ }
74
+ })
75
+ </script>
76
+
77
+ <template>
78
+ <Select class="tta-tz-select" v-model:value="current" :bordered="false" :virtual="false"
79
+ :dropdownMatchSelectWidth="120" :options="offsetOptions">
80
+ <template #suffixIcon>
81
+ <i class="i-iconoir:time-zone text-5 text-$antd-colorTextBase" />
82
+ </template>
83
+ </Select>
84
+ </template>
85
+
86
+ <style lang="scss" scoped>
87
+ .tta-tz-select {
88
+ :deep(.ant-select-selector) {
89
+ border: none;
90
+ padding: 0;
91
+ padding-left: 24px;
92
+ font-variant-numeric: lining-nums;
93
+
94
+ .ant-select-selection-item {
95
+ padding: 0;
96
+ }
97
+ }
98
+
99
+ :deep(.ant-select-arrow) {
100
+ position: absolute;
101
+ left: 0;
102
+ }
103
+ }
104
+ </style>