misp-ui-library-test 0.0.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 (373) hide show
  1. package/README.md +113 -0
  2. package/dist/theme-chalk/alert/index.scss +152 -0
  3. package/dist/theme-chalk/avatar/index.scss +51 -0
  4. package/dist/theme-chalk/backtop/index.scss +38 -0
  5. package/dist/theme-chalk/badge/index.scss +63 -0
  6. package/dist/theme-chalk/breadcrumb/index.scss +36 -0
  7. package/dist/theme-chalk/breadcrumb-item/index.scss +36 -0
  8. package/dist/theme-chalk/button/index.scss +157 -0
  9. package/dist/theme-chalk/card/index.scss +38 -0
  10. package/dist/theme-chalk/chart/index.scss +21 -0
  11. package/dist/theme-chalk/checkbox/index.scss +358 -0
  12. package/dist/theme-chalk/col/index.scss +131 -0
  13. package/dist/theme-chalk/container/index.scss +40 -0
  14. package/dist/theme-chalk/css/alert.css +484 -0
  15. package/dist/theme-chalk/css/avatar.css +409 -0
  16. package/dist/theme-chalk/css/backtop.css +401 -0
  17. package/dist/theme-chalk/css/badge.css +419 -0
  18. package/dist/theme-chalk/css/breadcrumb-item.css +395 -0
  19. package/dist/theme-chalk/css/breadcrumb.css +395 -0
  20. package/dist/theme-chalk/css/button.css +587 -0
  21. package/dist/theme-chalk/css/card.css +397 -0
  22. package/dist/theme-chalk/css/chart.css +386 -0
  23. package/dist/theme-chalk/css/checkbox.css +648 -0
  24. package/dist/theme-chalk/css/col.css +2111 -0
  25. package/dist/theme-chalk/css/container.css +404 -0
  26. package/dist/theme-chalk/css/dialog.css +505 -0
  27. package/dist/theme-chalk/css/divider.css +405 -0
  28. package/dist/theme-chalk/css/drawer.css +546 -0
  29. package/dist/theme-chalk/css/empty.css +394 -0
  30. package/dist/theme-chalk/css/form.css +561 -0
  31. package/dist/theme-chalk/css/icon.css +1534 -0
  32. package/dist/theme-chalk/css/image.css +400 -0
  33. package/dist/theme-chalk/css/input-number.css +424 -0
  34. package/dist/theme-chalk/css/input.css +721 -0
  35. package/dist/theme-chalk/css/link.css +424 -0
  36. package/dist/theme-chalk/css/loading.css +483 -0
  37. package/dist/theme-chalk/css/message-box.css +479 -0
  38. package/dist/theme-chalk/css/message.css +456 -0
  39. package/dist/theme-chalk/css/no-data.css +397 -0
  40. package/dist/theme-chalk/css/notification.css +431 -0
  41. package/dist/theme-chalk/css/page-header.css +396 -0
  42. package/dist/theme-chalk/css/pagination.css +565 -0
  43. package/dist/theme-chalk/css/popover.css +421 -0
  44. package/dist/theme-chalk/css/popper.css +454 -0
  45. package/dist/theme-chalk/css/progress.css +451 -0
  46. package/dist/theme-chalk/css/radio.css +626 -0
  47. package/dist/theme-chalk/css/rate.css +414 -0
  48. package/dist/theme-chalk/css/result.css +403 -0
  49. package/dist/theme-chalk/css/row.css +433 -0
  50. package/dist/theme-chalk/css/scrollbar.css +422 -0
  51. package/dist/theme-chalk/css/select.css +1897 -0
  52. package/dist/theme-chalk/css/skeleton-item.css +407 -0
  53. package/dist/theme-chalk/css/skeleton.css +390 -0
  54. package/dist/theme-chalk/css/slider.css +460 -0
  55. package/dist/theme-chalk/css/spinner.css +403 -0
  56. package/dist/theme-chalk/css/statistic.css +396 -0
  57. package/dist/theme-chalk/css/status-timeline-chart.css +388 -0
  58. package/dist/theme-chalk/css/step.css +496 -0
  59. package/dist/theme-chalk/css/steps.css +496 -0
  60. package/dist/theme-chalk/css/switch.css +507 -0
  61. package/dist/theme-chalk/css/tab-pane.css +457 -0
  62. package/dist/theme-chalk/css/table.css +461 -0
  63. package/dist/theme-chalk/css/tabs-navigation.css +925 -0
  64. package/dist/theme-chalk/css/tabs.css +457 -0
  65. package/dist/theme-chalk/css/tag.css +599 -0
  66. package/dist/theme-chalk/css/time-picker.css +683 -0
  67. package/dist/theme-chalk/css/timeline-item.css +459 -0
  68. package/dist/theme-chalk/css/timeline.css +459 -0
  69. package/dist/theme-chalk/css/tooltip.css +485 -0
  70. package/dist/theme-chalk/css/tree.css +473 -0
  71. package/dist/theme-chalk/css/upload.css +665 -0
  72. package/dist/theme-chalk/dialog/index.scss +168 -0
  73. package/dist/theme-chalk/divider/index.scss +46 -0
  74. package/dist/theme-chalk/drawer/index.scss +172 -0
  75. package/dist/theme-chalk/empty/index.scss +36 -0
  76. package/dist/theme-chalk/fonts/element-icons.ttf +0 -0
  77. package/dist/theme-chalk/fonts/element-icons.woff +0 -0
  78. package/dist/theme-chalk/form/index.scss +220 -0
  79. package/dist/theme-chalk/icon/index.scss +1171 -0
  80. package/dist/theme-chalk/image/index.scss +39 -0
  81. package/dist/theme-chalk/index.scss +127 -0
  82. package/dist/theme-chalk/input/index.scss +363 -0
  83. package/dist/theme-chalk/input-number/index.scss +71 -0
  84. package/dist/theme-chalk/link/index.scss +75 -0
  85. package/dist/theme-chalk/loading/index.scss +131 -0
  86. package/dist/theme-chalk/message/index.scss +100 -0
  87. package/dist/theme-chalk/message-box/index.scss +131 -0
  88. package/dist/theme-chalk/mixins.scss +203 -0
  89. package/dist/theme-chalk/no-data/index.scss +36 -0
  90. package/dist/theme-chalk/notification/index.scss +76 -0
  91. package/dist/theme-chalk/page-header/index.scss +36 -0
  92. package/dist/theme-chalk/pagination/index.scss +225 -0
  93. package/dist/theme-chalk/popover/index.scss +56 -0
  94. package/dist/theme-chalk/popper/index.scss +89 -0
  95. package/dist/theme-chalk/progress/index.scss +105 -0
  96. package/dist/theme-chalk/radio/index.scss +328 -0
  97. package/dist/theme-chalk/rate/index.scss +56 -0
  98. package/dist/theme-chalk/reset.scss +262 -0
  99. package/dist/theme-chalk/result/index.scss +46 -0
  100. package/dist/theme-chalk/row/index.scss +88 -0
  101. package/dist/theme-chalk/scrollbar/index.scss +67 -0
  102. package/dist/theme-chalk/select/index.scss +223 -0
  103. package/dist/theme-chalk/skeleton/index.scss +30 -0
  104. package/dist/theme-chalk/skeleton-item/index.scss +49 -0
  105. package/dist/theme-chalk/slider/index.scss +113 -0
  106. package/dist/theme-chalk/spinner/index.scss +40 -0
  107. package/dist/theme-chalk/statistic/index.scss +38 -0
  108. package/dist/theme-chalk/status-timeline-chart/index.scss +23 -0
  109. package/dist/theme-chalk/step/index.scss +160 -0
  110. package/dist/theme-chalk/steps/index.scss +160 -0
  111. package/dist/theme-chalk/switch/index.scss +153 -0
  112. package/dist/theme-chalk/tab-pane/index.scss +112 -0
  113. package/dist/theme-chalk/table/index.scss +110 -0
  114. package/dist/theme-chalk/tabs/index.scss +112 -0
  115. package/dist/theme-chalk/tabs-navigation/index.scss +631 -0
  116. package/dist/theme-chalk/tag/index.scss +138 -0
  117. package/dist/theme-chalk/themes/blue.scss +76 -0
  118. package/dist/theme-chalk/themes/dark.scss +99 -0
  119. package/dist/theme-chalk/themes/index.scss +260 -0
  120. package/dist/theme-chalk/themes/light.scss +99 -0
  121. package/dist/theme-chalk/time-picker/index.scss +332 -0
  122. package/dist/theme-chalk/timeline/index.scss +119 -0
  123. package/dist/theme-chalk/timeline-item/index.scss +119 -0
  124. package/dist/theme-chalk/tooltip/index.scss +122 -0
  125. package/dist/theme-chalk/tree/index.scss +125 -0
  126. package/dist/theme-chalk/upload/index.scss +348 -0
  127. package/dist/theme-chalk/variables.scss +93 -0
  128. package/dist/vue2-ui-library.cjs.temp.js.map +1 -0
  129. package/dist/vue2-ui-library.common.js +28 -0
  130. package/dist/vue2-ui-library.common.js.map +1 -0
  131. package/dist/vue2-ui-library.esm.js +29 -0
  132. package/dist/vue2-ui-library.umd.js +27 -0
  133. package/package.json +161 -0
  134. package/src/directives/clickoutside/index.js +111 -0
  135. package/src/directives/init/index.js +50 -0
  136. package/src/directives/resize/index.js +69 -0
  137. package/src/index.js +174 -0
  138. package/src/mixins/emitter.js +47 -0
  139. package/src/mixins/focus.js +42 -0
  140. package/src/mixins/locale.js +24 -0
  141. package/src/mixins/migrating.js +46 -0
  142. package/src/packages/alert/index.js +12 -0
  143. package/src/packages/alert/src/main.vue +98 -0
  144. package/src/packages/aside/index.js +12 -0
  145. package/src/packages/aside/src/main.vue +20 -0
  146. package/src/packages/auto-grid-layout/index.js +18 -0
  147. package/src/packages/auto-grid-layout/prop.js +92 -0
  148. package/src/packages/auto-grid-layout/src/components/GridItem.vue +759 -0
  149. package/src/packages/auto-grid-layout/src/components/GridLayout.vue +367 -0
  150. package/src/packages/auto-grid-layout/src/main.vue +287 -0
  151. package/src/packages/auto-grid-layout/src/utils/DOM.js +46 -0
  152. package/src/packages/auto-grid-layout/src/utils/interact.js +333 -0
  153. package/src/packages/auto-grid-layout/src/utils/responsiveUtils.js +75 -0
  154. package/src/packages/auto-grid-layout/src/utils/utils.js +339 -0
  155. package/src/packages/autocomplete/index.js +12 -0
  156. package/src/packages/autocomplete/src/main.vue +170 -0
  157. package/src/packages/avatar/index.js +12 -0
  158. package/src/packages/avatar/src/main.vue +87 -0
  159. package/src/packages/backtop/index.js +12 -0
  160. package/src/packages/backtop/src/main.vue +120 -0
  161. package/src/packages/badge/index.js +12 -0
  162. package/src/packages/badge/src/main.vue +53 -0
  163. package/src/packages/breadcrumb/index.js +12 -0
  164. package/src/packages/breadcrumb/src/main.vue +34 -0
  165. package/src/packages/breadcrumb-item/index.js +12 -0
  166. package/src/packages/breadcrumb-item/src/main.vue +41 -0
  167. package/src/packages/button/index.js +13 -0
  168. package/src/packages/button/src/main.vue +106 -0
  169. package/src/packages/calendar/index.js +12 -0
  170. package/src/packages/calendar/src/main.vue +173 -0
  171. package/src/packages/card/index.js +12 -0
  172. package/src/packages/card/src/main.vue +26 -0
  173. package/src/packages/carousel/index.js +12 -0
  174. package/src/packages/carousel/src/main.vue +186 -0
  175. package/src/packages/carousel-item/index.js +12 -0
  176. package/src/packages/carousel-item/src/main.vue +34 -0
  177. package/src/packages/cascader/index.js +12 -0
  178. package/src/packages/cascader/src/main.vue +232 -0
  179. package/src/packages/chart/index.js +7 -0
  180. package/src/packages/chart/src/axis-chart.js +700 -0
  181. package/src/packages/chart/src/main.vue +828 -0
  182. package/src/packages/chart/src/utils.js +21 -0
  183. package/src/packages/checkbox/index.js +44 -0
  184. package/src/packages/checkbox/src/main.vue +312 -0
  185. package/src/packages/col/index.js +12 -0
  186. package/src/packages/col/src/main.vue +85 -0
  187. package/src/packages/collapse/index.js +12 -0
  188. package/src/packages/collapse/src/main.vue +69 -0
  189. package/src/packages/collapse-item/index.js +12 -0
  190. package/src/packages/collapse-item/src/main.vue +75 -0
  191. package/src/packages/color-picker/index.js +12 -0
  192. package/src/packages/color-picker/src/main.vue +206 -0
  193. package/src/packages/container/index.js +12 -0
  194. package/src/packages/container/src/main.vue +33 -0
  195. package/src/packages/date-picker/index.js +12 -0
  196. package/src/packages/date-picker/src/main.vue +246 -0
  197. package/src/packages/descriptions/index.js +12 -0
  198. package/src/packages/descriptions/src/main.vue +89 -0
  199. package/src/packages/descriptions-item/index.js +12 -0
  200. package/src/packages/descriptions-item/src/main.vue +26 -0
  201. package/src/packages/dialog/index.js +12 -0
  202. package/src/packages/dialog/src/main.vue +336 -0
  203. package/src/packages/divider/index.js +12 -0
  204. package/src/packages/divider/src/main.vue +37 -0
  205. package/src/packages/drawer/index.js +7 -0
  206. package/src/packages/drawer/src/main.vue +310 -0
  207. package/src/packages/dropdown/index.js +12 -0
  208. package/src/packages/dropdown/src/main.vue +82 -0
  209. package/src/packages/dropdown-menu-item/index.js +12 -0
  210. package/src/packages/dropdown-menu-item/src/main.vue +29 -0
  211. package/src/packages/empty/index.js +12 -0
  212. package/src/packages/empty/src/img-empty.vue +12 -0
  213. package/src/packages/empty/src/main.vue +49 -0
  214. package/src/packages/footer/index.js +12 -0
  215. package/src/packages/footer/src/main.vue +20 -0
  216. package/src/packages/form/index.js +13 -0
  217. package/src/packages/form/src/form-field.vue +790 -0
  218. package/src/packages/form/src/form-item.vue +464 -0
  219. package/src/packages/form/src/label-wrap.vue +127 -0
  220. package/src/packages/form/src/main.vue +442 -0
  221. package/src/packages/form-item/index.js +11 -0
  222. package/src/packages/header/index.js +12 -0
  223. package/src/packages/header/src/main.vue +20 -0
  224. package/src/packages/icon/index.js +12 -0
  225. package/src/packages/icon/src/main.vue +48 -0
  226. package/src/packages/image/index.js +12 -0
  227. package/src/packages/image/src/main.vue +224 -0
  228. package/src/packages/input/index.js +13 -0
  229. package/src/packages/input/src/calcTextareaHeight.js +123 -0
  230. package/src/packages/input/src/main.vue +510 -0
  231. package/src/packages/input-number/index.js +12 -0
  232. package/src/packages/input-number/src/main.vue +121 -0
  233. package/src/packages/link/index.js +12 -0
  234. package/src/packages/link/src/main.vue +53 -0
  235. package/src/packages/loading/index.js +17 -0
  236. package/src/packages/loading/src/directive.js +54 -0
  237. package/src/packages/loading/src/main.vue +38 -0
  238. package/src/packages/loading/src/service.js +63 -0
  239. package/src/packages/main/index.js +12 -0
  240. package/src/packages/main/src/main.vue +12 -0
  241. package/src/packages/menu/index.js +12 -0
  242. package/src/packages/menu/src/main.vue +117 -0
  243. package/src/packages/menu-item/index.js +12 -0
  244. package/src/packages/menu-item/src/main.vue +61 -0
  245. package/src/packages/message/index.js +95 -0
  246. package/src/packages/message/src/main.vue +131 -0
  247. package/src/packages/message-box/index.js +75 -0
  248. package/src/packages/message-box/src/main.vue +207 -0
  249. package/src/packages/no-data/index.js +8 -0
  250. package/src/packages/no-data/src/main.vue +23 -0
  251. package/src/packages/notification/index.js +72 -0
  252. package/src/packages/notification/src/main.vue +139 -0
  253. package/src/packages/option/index.js +13 -0
  254. package/src/packages/page-header/index.js +12 -0
  255. package/src/packages/page-header/src/main.vue +27 -0
  256. package/src/packages/pagination/index.js +12 -0
  257. package/src/packages/pagination/src/main.vue +255 -0
  258. package/src/packages/popconfirm/index.js +12 -0
  259. package/src/packages/popconfirm/src/main.vue +89 -0
  260. package/src/packages/popover/index.js +12 -0
  261. package/src/packages/popover/src/main.vue +452 -0
  262. package/src/packages/progress/index.js +12 -0
  263. package/src/packages/progress/src/main.vue +236 -0
  264. package/src/packages/radio/index.js +44 -0
  265. package/src/packages/radio/src/main.vue +291 -0
  266. package/src/packages/rate/index.js +12 -0
  267. package/src/packages/rate/src/main.vue +129 -0
  268. package/src/packages/result/index.js +12 -0
  269. package/src/packages/result/src/main.vue +52 -0
  270. package/src/packages/row/index.js +12 -0
  271. package/src/packages/row/src/main.vue +57 -0
  272. package/src/packages/scrollbar/index.js +12 -0
  273. package/src/packages/scrollbar/src/bar.vue +116 -0
  274. package/src/packages/scrollbar/src/main.vue +124 -0
  275. package/src/packages/select/index.js +15 -0
  276. package/src/packages/select/src/clickoutside.js +20 -0
  277. package/src/packages/select/src/main.vue +1055 -0
  278. package/src/packages/select/src/navigation-mixin.js +49 -0
  279. package/src/packages/select/src/option.vue +249 -0
  280. package/src/packages/select/src/select-dropdown.vue +95 -0
  281. package/src/packages/select/src/utils.js +5 -0
  282. package/src/packages/skeleton/index.js +12 -0
  283. package/src/packages/skeleton/src/main.vue +76 -0
  284. package/src/packages/skeleton-item/index.js +12 -0
  285. package/src/packages/skeleton-item/src/img-placeholder.vue +13 -0
  286. package/src/packages/skeleton-item/src/main.vue +22 -0
  287. package/src/packages/slider/index.js +12 -0
  288. package/src/packages/slider/src/main.vue +176 -0
  289. package/src/packages/spinner/index.js +12 -0
  290. package/src/packages/spinner/src/main.vue +27 -0
  291. package/src/packages/statistic/index.js +12 -0
  292. package/src/packages/statistic/src/main.vue +100 -0
  293. package/src/packages/status-timeline-chart/index.js +7 -0
  294. package/src/packages/status-timeline-chart/src/constants.js +20 -0
  295. package/src/packages/status-timeline-chart/src/main.vue +499 -0
  296. package/src/packages/status-timeline-chart/src/option-builder.js +475 -0
  297. package/src/packages/step/index.js +12 -0
  298. package/src/packages/step/src/main.vue +183 -0
  299. package/src/packages/steps/index.js +12 -0
  300. package/src/packages/steps/src/main.vue +57 -0
  301. package/src/packages/submenu/index.js +12 -0
  302. package/src/packages/submenu/src/main.vue +68 -0
  303. package/src/packages/switch/index.js +12 -0
  304. package/src/packages/switch/src/main.vue +166 -0
  305. package/src/packages/tab-pane/index.js +12 -0
  306. package/src/packages/tab-pane/src/main.vue +74 -0
  307. package/src/packages/table/index.js +8 -0
  308. package/src/packages/table/src/components/PagePagination.vue +82 -0
  309. package/src/packages/table/src/main.vue +153 -0
  310. package/src/packages/tabs/index.js +12 -0
  311. package/src/packages/tabs/src/main.vue +167 -0
  312. package/src/packages/tabs-navigation/index.js +7 -0
  313. package/src/packages/tabs-navigation/src/main.vue +462 -0
  314. package/src/packages/tag/index.js +12 -0
  315. package/src/packages/tag/src/main.vue +194 -0
  316. package/src/packages/time-picker/index.js +17 -0
  317. package/src/packages/time-picker/src/date-utils.js +455 -0
  318. package/src/packages/time-picker/src/main.vue +321 -0
  319. package/src/packages/time-picker/src/pane/date-range.vue +193 -0
  320. package/src/packages/time-picker/src/pane/date-time-range.vue +362 -0
  321. package/src/packages/time-picker/src/pane/date-time.vue +362 -0
  322. package/src/packages/time-picker/src/pane/date.vue +441 -0
  323. package/src/packages/time-picker/src/pane/time.vue +260 -0
  324. package/src/packages/time-picker/src/time-input.vue +203 -0
  325. package/src/packages/time-picker/src/time-range-input.vue +170 -0
  326. package/src/packages/timeline/index.js +12 -0
  327. package/src/packages/timeline/src/main.vue +24 -0
  328. package/src/packages/timeline-item/index.js +12 -0
  329. package/src/packages/timeline-item/src/main.vue +78 -0
  330. package/src/packages/tooltip/index.js +12 -0
  331. package/src/packages/tooltip/src/main.js +367 -0
  332. package/src/packages/transfer/index.js +8 -0
  333. package/src/packages/transfer/src/main.vue +229 -0
  334. package/src/packages/transfer/src/transfer-panel.vue +245 -0
  335. package/src/packages/transitions/collapse-transition.js +75 -0
  336. package/src/packages/tree/index.js +12 -0
  337. package/src/packages/tree/src/main.vue +322 -0
  338. package/src/packages/tree/src/model/node.js +348 -0
  339. package/src/packages/tree/src/model/tree-store.js +354 -0
  340. package/src/packages/tree/src/model/util.js +10 -0
  341. package/src/packages/tree/src/tree-node.vue +262 -0
  342. package/src/packages/upload/index.js +9 -0
  343. package/src/packages/upload/src/main.vue +415 -0
  344. package/src/playground/mixins/element.js +98 -0
  345. package/src/playground/types/element.js +197 -0
  346. package/src/playground/types/layout.js +80 -0
  347. package/src/plugins/i18n.js +125 -0
  348. package/src/styles/fonts/element-icons.ttf +0 -0
  349. package/src/styles/fonts/element-icons.woff +0 -0
  350. package/src/styles/index.scss +138 -0
  351. package/src/styles/reset.scss +257 -0
  352. package/src/styles/themes/blue.scss +75 -0
  353. package/src/styles/themes/dark.scss +98 -0
  354. package/src/styles/themes/index.scss +34 -0
  355. package/src/styles/themes/light.scss +98 -0
  356. package/src/styles/themes/variables.scss +233 -0
  357. package/src/styles/variables.scss +146 -0
  358. package/src/utils/async-validator/index.js +659 -0
  359. package/src/utils/browser/index.js +39 -0
  360. package/src/utils/color.js +76 -0
  361. package/src/utils/dom/index.js +421 -0
  362. package/src/utils/dom/scrollbar-width.js +49 -0
  363. package/src/utils/draggable/core.js +379 -0
  364. package/src/utils/draggable/draggable.js +478 -0
  365. package/src/utils/draggable/index.js +61 -0
  366. package/src/utils/draggable/sortable.js +751 -0
  367. package/src/utils/lodash/index.js +2395 -0
  368. package/src/utils/moment/index.js +909 -0
  369. package/src/utils/playground/index.js +37 -0
  370. package/src/utils/popper/index.js +308 -0
  371. package/src/utils/popper/popper.js +1132 -0
  372. package/src/utils/popper/popup-manager.js +288 -0
  373. package/src/utils/popper/popup.js +344 -0
@@ -0,0 +1,194 @@
1
+ <script>
2
+ /**
3
+ * @fileoverview Vue2 UI Library - Tag 标签组件
4
+ * @description 用于标记和选择的小型标签组件,支持多种类型、尺寸和效果
5
+ */
6
+
7
+ import { colorOpacityTrans } from '../../../utils/color'
8
+
9
+ export default {
10
+ /**
11
+ * 组件名称
12
+ * @type {String}
13
+ */
14
+ name: 'UiTag',
15
+
16
+ /**
17
+ * 组件属性配置
18
+ * @namespace Props
19
+ */
20
+ props: {
21
+ /**
22
+ * 标签文本内容
23
+ * @type {String}
24
+ * @default ''
25
+ */
26
+ text: String,
27
+
28
+ /**
29
+ * 是否可关闭
30
+ * @type {Boolean}
31
+ * @default false
32
+ */
33
+ closable: Boolean,
34
+
35
+ /**
36
+ * 标签类型
37
+ * @type {String}
38
+ * @default ''
39
+ * @values info, success, warning, danger
40
+ */
41
+ type: String,
42
+
43
+ /**
44
+ * 标签边框是否与文字颜色相同
45
+ * @type {Boolean}
46
+ * @default false
47
+ */
48
+ hit: Boolean,
49
+
50
+ /**
51
+ * 是否禁用渐变动画
52
+ * @type {Boolean}
53
+ * @default false
54
+ */
55
+ disableTransitions: Boolean,
56
+
57
+ /**
58
+ * 背景颜色,覆盖默认类型颜色
59
+ * @type {String}
60
+ * @default ''
61
+ */
62
+ color: String,
63
+
64
+ /**
65
+ * 标签尺寸
66
+ * @type {String}
67
+ * @default ''
68
+ * @values medium, small, mini
69
+ */
70
+ size: String,
71
+
72
+ /**
73
+ * 标签显示效果
74
+ * @type {String}
75
+ * @default 'light'
76
+ * @values dark, light, plain
77
+ */
78
+ effect: {
79
+ type: String,
80
+ default: 'light',
81
+ /**
82
+ * 效果值验证器
83
+ * @param {String} val - 传入的效果值
84
+ * @returns {Boolean} 是否为有效值
85
+ */
86
+ validator(val) {
87
+ return ['dark', 'light', 'plain'].indexOf(val) !== -1
88
+ },
89
+ },
90
+ },
91
+
92
+ /**
93
+ * 组件方法集合
94
+ * @namespace Methods
95
+ */
96
+ methods: {
97
+ /**
98
+ * 处理关闭按钮点击
99
+ * @method handleClose
100
+ * @param {Event} event - 点击事件对象
101
+ * @description 阻止事件冒泡并触发 close 事件
102
+ * @emits close
103
+ * @returns {void}
104
+ */
105
+ handleClose(event) {
106
+ event.stopPropagation()
107
+ this.$emit('close', event)
108
+ },
109
+
110
+ /**
111
+ * 处理标签点击
112
+ * @method handleClick
113
+ * @param {Event} event - 点击事件对象
114
+ * @description 触发 click 事件
115
+ * @emits click
116
+ * @returns {void}
117
+ */
118
+ handleClick(event) {
119
+ this.$emit('click', event)
120
+ },
121
+ },
122
+
123
+ /**
124
+ * 计算属性集合
125
+ * @namespace Computed
126
+ */
127
+ computed: {
128
+ /**
129
+ * 标签尺寸
130
+ * @member tagSize
131
+ * @memberof UiTag
132
+ * @instance
133
+ * @type {String}
134
+ * @description 优先使用组件 size 属性,否则使用全局配置
135
+ * @returns {String} 标签尺寸值
136
+ */
137
+ tagSize() {
138
+ return this.size || (this.$ELEMENT || {}).size
139
+ },
140
+ },
141
+
142
+ /**
143
+ * 渲染函数
144
+ * @method render
145
+ * @param {Function} h - 创建虚拟节点的函数
146
+ * @returns {VNode} 标签虚拟 DOM 节点
147
+ * @description 根据配置渲染标签元素,支持关闭按钮和过渡动画
148
+ */
149
+ render(h) {
150
+ const { type, tagSize, hit, effect } = this
151
+ /**
152
+ * CSS 类名列表
153
+ * @type {Array}
154
+ */
155
+ const classes = [
156
+ 'ui-tag',
157
+ type ? `ui-tag--${type}` : '',
158
+ tagSize ? `ui-tag--${tagSize}` : '',
159
+ effect ? `ui-tag--${effect}` : '',
160
+ hit && 'is-hit',
161
+ ]
162
+
163
+ /**
164
+ * 如果自定义了颜色,生成 Tag 的字体、边框和背景颜色
165
+ * @type {Object}
166
+ */
167
+ let customColorProp = {}
168
+ if (this.color) {
169
+ customColorProp = {
170
+ color: this.color,
171
+ borderColor: this.color,
172
+ backgroundColor: colorOpacityTrans(this.color, 0.2),
173
+ }
174
+ }
175
+
176
+ /**
177
+ * 标签元素
178
+ * @type {VNode}
179
+ */
180
+ const tagEl = (
181
+ <span class={classes} style={customColorProp} on-click={this.handleClick}>
182
+ {this.$slots.default}
183
+ {this.closable && <i class="ui-tag__close ui-icon-close" on-click={this.handleClose}></i>}
184
+ </span>
185
+ )
186
+
187
+ /**
188
+ * 根据是否禁用过渡动画返回最终渲染结果
189
+ * @returns {VNode}
190
+ */
191
+ return this.disableTransitions ? tagEl : <transition name="ui-zoom-in-center">{tagEl}</transition>
192
+ },
193
+ }
194
+ </script>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * UiTimePicker 时间选择器组件
3
+ * 通过 type prop 支持多种时间选择模式:
4
+ * - 'HH:mm:ss' -> 单时间
5
+ * - 'YYYY-MM-DD HH:mm:ss' -> 单日期时间
6
+ * - 'HH:mm:ss ~ HH:mm:ss' -> 时间范围
7
+ * - 'YYYY-MM-DD HH:mm:ss ~ YYYY-MM-DD HH:mm:ss' -> 日期时间范围
8
+ */
9
+
10
+ import UiTimePicker from './src/main.vue'
11
+
12
+ // 自动安装
13
+ UiTimePicker.install = function(Vue) {
14
+ Vue.component(UiTimePicker.name, UiTimePicker)
15
+ }
16
+
17
+ export default UiTimePicker
@@ -0,0 +1,455 @@
1
+ const separators = [' to ', ' 到 ', ' 至 ', ' - ', ' ~ ', ' , '];
2
+
3
+ /**
4
+ * 解析单个时间格式片段,提取其包含的日期和时间成分字符串
5
+ *
6
+ * 该函数用于识别并规整单个时间格式单元(非范围类型)。它会根据预定义的规则
7
+ * 验证年、月、日、时、分、秒、毫秒的组合合法性,并返回标准化的格式字符串。
8
+ *
9
+ * **解析规则:**
10
+ * 1. **特殊值**:如果输入为 'timestamp' (不区分大小写),直接返回 'timestamp'。
11
+ * 2. **日期部分**:
12
+ * - 必须包含年份 (Y) 才能构成合法的日期部分起点。
13
+ * - 合法组合:'YYYY' | `YYYY-MM` | `YYYY-MM-DD`。
14
+ * - 非法组合:缺少年份、有年无月有日、有月无年等,均返回 null。
15
+ * 3. **时间部分**:
16
+ * - 必须包含小时 (H) 才能构成合法的时间部分起点。
17
+ * - 合法组合:'HH' | `HH:mm` | `HH:mm:ss` | `HH:mm:ss.SSS`。
18
+ * - 非法组合:缺少小时、有分无时、有秒无分等,均返回 null。
19
+ * 4. **组合逻辑**:
20
+ * - 若同时存在合法的日期和时间部分,返回 `${dateStr} ${timeStr}`。
21
+ * - 若仅存在日期部分,返回 dateStr。
22
+ * - 若仅存在时间部分,返回 `timeStr`。
23
+ * - 若既无日期也无时间成分,或组合非法,返回 null。
24
+ *
25
+ * @param {string} part - 待解析的时间格式片段,例如 'YYYY-MM-DD', 'HH:mm:ss', 'timestamp'
26
+ * @returns {string|null} 解析出的规整格式字符串。
27
+ * - 成功时返回标准格式,如 'YYYY-MM-DD', 'HH:mm:ss.SSS', 'timestamp' 等。
28
+ * - 失败时(格式非法或无法识别)返回 null。
29
+ *
30
+ * @example
31
+ * parsePartType('YYYY-MM-DD') // => 'YYYY-MM-DD'
32
+ * parsePartType('HH:mm:ss') // => 'HH:mm:ss'
33
+ * parsePartType('timestamp') // => 'timestamp'
34
+ * parsePartType('YYYY-MM-DD HH:mm:ss') // => 'YYYY-MM-DD HH:mm:ss'
35
+ * parsePartType('HH:mm:ss.SSS') // => 'HH:mm:ss.SSS'
36
+ * parsePartType('MM-DD') // => null (缺少年份)
37
+ * parsePartType('mm:ss') // => null (缺少小时)
38
+ * parsePartType('invalid') // => null
39
+ */
40
+ function parsePartType(part) {
41
+ if (part.toLowerCase() === 'timestamp') return 'timestamp';
42
+
43
+ // 提取各时间成分的具体字符串
44
+ // 注意:正则需按顺序匹配,确保捕获最长的连续字符(如 YYYY 而不是 Y)
45
+ const matchY = part.match(/Y+/);
46
+ const matchM = part.match(/M+/); // 大写 M 代表月份
47
+ const matchD = part.match(/D+/);
48
+ const matchH = part.match(/H+/);
49
+ const matchLowerM = part.match(/m+/); // 小写 m 代表分钟
50
+ const matchS = part.match(/s+/); // 小写 s 代表秒
51
+ const matchSSS = part.match(/S{3,}/); // SSS 或更多 S 代表毫秒
52
+
53
+ const strY = matchY ? matchY[0] : null;
54
+ const strM = matchM ? matchM[0] : null;
55
+ const strD = matchD ? matchD[0] : null;
56
+ const strH = matchH ? matchH[0] : null;
57
+ const strLowerM = matchLowerM ? matchLowerM[0] : null;
58
+ const strS = matchS ? matchS[0] : null;
59
+ const strSSS = matchSSS ? matchSSS[0] : null;
60
+
61
+ // --- 日期部分构建 ---
62
+ let dateStr = '';
63
+ // 逻辑:必须包含年,或者符合特定规范。这里沿用原逻辑:必须有Y才能算合法的日期部分起点,或者严格遵循 Y-M-D 组合
64
+ // 原逻辑中:只有M或只有D被视为非法。这里保持一致。
65
+ if (strY && !strM && !strD) {
66
+ dateStr = strY;
67
+ } else if (strY && strM && !strD) {
68
+ dateStr = `${strY}-${strM}`;
69
+ } else if (strY && strM && strD) {
70
+ dateStr = `${strY}-${strM}-${strD}`;
71
+ } else if (strY || strM || strD) {
72
+ // 存在日期字符但组合不符合规范(如只有月日没有年,或有年无月有日等),视为非法
73
+ return null;
74
+ }
75
+
76
+ // --- 时间部分构建 ---
77
+ let timeStr = '';
78
+ if (strH && !strLowerM && !strS && !strSSS) {
79
+ timeStr = strH;
80
+ } else if (strH && strLowerM && !strS && !strSSS) {
81
+ timeStr = `${strH}:${strLowerM}`;
82
+ } else if (strH && strLowerM && strS && !strSSS) {
83
+ timeStr = `${strH}:${strLowerM}:${strS}`;
84
+ } else if (strH && strLowerM && strS && strSSS) {
85
+ timeStr = `${strH}:${strLowerM}:${strS}.${strSSS}`;
86
+ } else if (strH || strLowerM || strS || strSSS) {
87
+ // 存在时间字符但组合不符合规范(如只有分没有时),视为非法
88
+ return null;
89
+ }
90
+
91
+ // --- 组合日期与时间字符串 ---
92
+ if (dateStr && timeStr) {
93
+ return `${dateStr} ${timeStr}`;
94
+ } else if (dateStr) {
95
+ return dateStr;
96
+ } else if (timeStr) {
97
+ return timeStr;
98
+ }
99
+
100
+ // 既无日期也无时间成分,视为非法
101
+ return null;
102
+ }
103
+
104
+ /**
105
+ * 解析时间格式字符串,输出对应的时间格式规整版本
106
+ *
107
+ * @param {string} format - 时间格式字符串,例如 'YYYY-MM-DD', 'HH:mm:ss', 'timestamp', 'YYYY-MM-DD HH:mm:ss to YYYY-MM-DD HH:mm:ss'
108
+ * @returns {string} 规整后的时间格式字符串,可能的返回值包括:
109
+ * - 'YYYY', 'YYYY-MM', 'YYYY-MM-DD'
110
+ * - 'HH', 'HH:mm', 'HH:mm:ss', 'HH:mm:ss.SSS'
111
+ * - 'timestamp'
112
+ * - [年月日][时分秒][-range]组合类型
113
+ * - 默认为 'HH:mm:ss' (当格式非法或无法识别时)
114
+ *
115
+ * @example
116
+ * formatterType('YYYY-MM-DD') // => 'YYYY-MM-DD'
117
+ * formatterType('HH:mm:ss') // => 'HH:mm:ss'
118
+ * formatterType('timestamp') // => 'timestamp'
119
+ * formatterType('YYYY-MM-DD HH:mm:ss') // => 'YYYY-MM-DD HH:mm:ss'
120
+ * formatterType('YYYY-MM-DD to YYYY-MM-DD') // => 'YYYY-MM-DD-range'
121
+ * formatterType('YY-M-D') // => 'YY-M-D' (保留原始格式)
122
+ * formatterType('invalid') // => 'HH:mm:ss'
123
+ */
124
+ export function formatterType(format) {
125
+ // 参数校验:非字符串或空值直接返回默认类型
126
+ if (!format || typeof format !== 'string') {
127
+ return 'HH:mm:ss';
128
+ }
129
+
130
+ // 特殊处理:直接识别 'timestamp'
131
+ if (format.trim().toLowerCase() === 'timestamp') {
132
+ return 'timestamp';
133
+ }
134
+
135
+ // 首先检测范围类型
136
+ // 常见范围分隔符列表,按优先级尝试分割
137
+
138
+ const tokens = format.split(' ').map(t => t.trim()).filter(t => t);
139
+ let isRange = false
140
+ const startPart = []
141
+ const separators = []
142
+ const endPart = []
143
+ for (const token of tokens) {
144
+ if (isRange && endPart.length && !parsePartType(token)) break
145
+ if (parsePartType(token)) {
146
+ isRange ? endPart.push(token) : startPart.push(token)
147
+ }
148
+ if (!parsePartType(token)) {
149
+ isRange = true
150
+ separators.push(token)
151
+ }
152
+ }
153
+ if (startPart.length && endPart.length && separators.length) return `${startPart.join(' ')}-range`
154
+
155
+ // 以单值解析
156
+ const singleType = parsePartType(format);
157
+ if (singleType) {
158
+ return singleType;
159
+ }
160
+ // 缺省返回
161
+ return 'HH:mm:ss';
162
+ }
163
+
164
+ /**
165
+ * 获取时间范围格式中的连接符
166
+ *
167
+ * @param {string} format - 时间格式字符串,例如 'YYYY-MM-DD to YYYY-MM-DD'
168
+ * @returns {string|null} 如果格式是范围类型,返回连接符;否则返回 null
169
+ *
170
+ * @example
171
+ * getRangeSeparator('YYYY-MM-DD to YYYY-MM-DD') // => ' to '
172
+ * getRangeSeparator('YYYY-MM-DD - YYYY-MM-DD') // => ' - '
173
+ * getRangeSeparator('YYYY-MM-DD') // => null
174
+ */
175
+ export function getRangeSeparator(format) {
176
+ if (!format || typeof format !== 'string') return null;
177
+
178
+ const tokens = format.split(' ').map(t => t.trim()).filter(t => t);
179
+ let isRange = false
180
+ const startPart = []
181
+ const separators = []
182
+ const endPart = []
183
+ for (const token of tokens) {
184
+ if (isRange && endPart.length && !parsePartType(token)) break
185
+ if (parsePartType(token)) {
186
+ isRange ? endPart.push(token) : startPart.push(token)
187
+ }
188
+ if (!parsePartType(token)) {
189
+ isRange = true
190
+ separators.push(token)
191
+ }
192
+ }
193
+ if (startPart.length && endPart.length && separators.length) return separators.join(' ')
194
+ else return null
195
+ }
196
+
197
+ /**
198
+ * 将 formatterType 的返回值映射为具体的业务分类
199
+ * @param {string} formatType - formatterType 函数的返回值
200
+ * @returns {'time' | 'date' | 'datetime' | 'date-range' | 'datetime-range' | 'timestamp' | 'timestamp-range' | 'year' | 'month' | 'unknown'}
201
+ */
202
+ export function classifyFormat(formatType) {
203
+ if (!formatType || typeof formatType !== 'string') {
204
+ return 'unknown';
205
+ }
206
+
207
+ // 1. 特殊处理:直接识别 timestamp
208
+ if (formatType === 'timestamp') {
209
+ return 'timestamp';
210
+ }
211
+
212
+ // 特殊处理:识别 timestamp-range
213
+ if (formatType === 'timestamp-range') {
214
+ return 'timestamp-range';
215
+ }
216
+
217
+ // 2. 判断是否为范围类型 (以 -range 结尾)
218
+ const isRange = formatType.endsWith('-range');
219
+
220
+ // 获取去除 -range 后的基础格式,用于判断是纯日期还是日期时间
221
+ // 如果是范围类型,去掉后缀;如果不是,保持原样
222
+ const baseFormat = isRange ? formatType.replace(/-range$/, '') : formatType;
223
+
224
+ // 3. 判断基础格式中是否包含时间成分 (H, m, s, S)
225
+ const hasTimeComponent = /[HmsS]/.test(baseFormat);
226
+
227
+ // 4. 判断基础格式中是否包含日期成分 (Y, M, D)
228
+ const hasDateComponent = /[YMD]/.test(baseFormat);
229
+
230
+ // --- 分类逻辑 ---
231
+
232
+ if (isRange) {
233
+ // 范围类型
234
+ if (hasTimeComponent) {
235
+ // 包含时间 -> 日期时间范围 (例如: YYYY-MM-DD HH:mm:ss-range)
236
+ return 'datetime-range';
237
+ } else if (hasDateComponent) {
238
+ // 仅包含日期 -> 日期范围 (例如: YYYY-MM-DD-range)
239
+ // 注意:通常范围选择器不区分 year-range 或 month-range,统一归为 date-range
240
+ // 如果有特殊需求,也可以在此处进一步细分,但通常 UI 组件中 date-range 涵盖所有日期粒度
241
+ return 'date-range';
242
+ } else {
243
+ return 'unknown';
244
+ }
245
+ } else {
246
+ // 非范围类型 (单值)
247
+ if (hasTimeComponent && hasDateComponent) {
248
+ // 既有日期又有时间 -> 日期时间 (例如: YYYY-MM-DD HH:mm:ss)
249
+ return 'datetime';
250
+ } else if (hasDateComponent) {
251
+ // 仅有日期部分,需要进一步细分
252
+
253
+ // 检查是否仅为年份 (例如: YYYY)
254
+ if (onlyYear(baseFormat)) {
255
+ return 'year';
256
+ }
257
+
258
+ // 检查是否仅为年月 (例如: YYYY-MM)
259
+ if (onlyMonth(baseFormat)) {
260
+ return 'month';
261
+ }
262
+
263
+ // 其他日期格式 (例如: YYYY-MM-DD)
264
+ return 'date';
265
+ } else if (hasTimeComponent) {
266
+ // 仅有时间 -> 时间 (例如: HH:mm:ss)
267
+ return 'time';
268
+ } else {
269
+ return 'unknown';
270
+ }
271
+ }
272
+ }
273
+
274
+ /**
275
+ * 判断输入的时间格式字符串是否为仅包含时间部分,如HH:mm:ss
276
+ * @param {string} format
277
+ * @returns {boolean}
278
+ */
279
+ export function onlyTime(format) {
280
+ // 参数校验:非字符串或空值返回 false
281
+ if (!format || typeof format !== 'string') {
282
+ return false;
283
+ }
284
+
285
+ // 定义日期和时间成分的正则表达式
286
+ // 日期成分:Y (年), M (月, 大写), D (日)
287
+ const datePattern = /[YMD]/;
288
+ // 时间成分:H (时), m (分, 小写), s (秒, 小写), S (毫秒, 大写)
289
+ const timePattern = /[HmsS]/;
290
+
291
+ // 如果包含任何日期成分,则不是纯时间格式
292
+ if (datePattern.test(format)) {
293
+ return false;
294
+ }
295
+
296
+ // 必须包含至少一种时间成分
297
+ if (!timePattern.test(format)) {
298
+ return false;
299
+ }
300
+
301
+ return true;
302
+ }
303
+
304
+ /**
305
+ * 判断输入的时间格式字符串是否为仅包含日期部分,如YYYY-MM-DD
306
+ * @param {string} format
307
+ * @returns {boolean}
308
+ */
309
+ export function onlyDate(format) {
310
+ // 参数校验:非字符串或空值返回 false
311
+ if (!format || typeof format !== 'string') {
312
+ return false;
313
+ }
314
+
315
+ // 定义日期和时间成分的正则表达式
316
+ // 时间成分:H (时), m (分, 小写), s (秒, 小写), S (毫秒, 大写)
317
+ const timePattern = /[HmsS]/;
318
+ // 日期成分:Y (年), M (月, 大写), D (日)
319
+ const datePattern = /[YMD]/;
320
+
321
+ // 如果包含任何时间成分,则不是纯日期格式
322
+ if (timePattern.test(format)) {
323
+ return false;
324
+ }
325
+
326
+ // 必须包含至少一种日期成分
327
+ if (!datePattern.test(format)) {
328
+ return false;
329
+ }
330
+
331
+ return true;
332
+ }
333
+
334
+ /**
335
+ * 判断输入的时间格式字符串是否仅包含年份部分,如YYYY
336
+ * @param {string} format
337
+ * @returns {boolean}
338
+ */
339
+ export function onlyYear(format) {
340
+ // 参数校验
341
+ if (!format || typeof format !== 'string') {
342
+ return false;
343
+ }
344
+
345
+ // 必须包含 Y
346
+ if (!/Y+/.test(format)) {
347
+ return false;
348
+ }
349
+
350
+ // 不能包含 M, D, H, m, s, S
351
+ // 注意:M 是大写月份,m 是小写分钟
352
+ if (/[MDHmsS]/.test(format)) {
353
+ return false;
354
+ }
355
+
356
+ return true;
357
+ }
358
+
359
+ /**
360
+ * 判断输入的时间格式字符串是否为年月格式,如YYYY-MM
361
+ * (即包含年和月,但不包含日、时、分、秒等更精细的单位)
362
+ * @param {string} format
363
+ * @returns {boolean}
364
+ */
365
+ export function onlyMonth(format) {
366
+ // 参数校验
367
+ if (!format || typeof format !== 'string') {
368
+ return false;
369
+ }
370
+
371
+ // 必须包含 Y 和 M (大写)
372
+ const hasY = /Y+/.test(format);
373
+ const hasM = /M+/.test(format);
374
+
375
+ if (!hasY || !hasM) {
376
+ return false;
377
+ }
378
+
379
+ // 不能包含 D, H, m, s, S
380
+ if (/[DHmsS]/.test(format)) {
381
+ return false;
382
+ }
383
+
384
+ return true;
385
+ }
386
+
387
+ /**
388
+ * 判断输入的时间格式字符串是否包含小时部分
389
+ *
390
+ * @param {string} format - 时间格式字符串,例如 'HH:mm:ss', 'YYYY-MM-DD HH:mm'
391
+ * @returns {boolean} 如果格式中包含小时标记 (H),则返回 true,否则返回 false
392
+ *
393
+ * @example
394
+ * hasHour('HH:mm:ss') // => true
395
+ * hasHour('YYYY-MM-DD') // => false
396
+ * hasHour('mm:ss') // => false
397
+ */
398
+ export function hasHour(format) {
399
+ // 参数校验:非字符串或空值返回 false
400
+ if (!format || typeof format !== 'string') {
401
+ return false;
402
+ }
403
+
404
+ // 检查是否包含 H (小时)
405
+ // 注意:通常小时用 H 或 hh 表示,这里主要检测大写 H,兼容常见格式
406
+ return /H+/.test(format);
407
+ }
408
+
409
+ /**
410
+ * 判断输入的时间格式字符串是否包含分钟部分
411
+ *
412
+ * @param {string} format - 时间格式字符串,例如 'HH:mm:ss', 'YYYY-MM-DD HH:mm'
413
+ * @returns {boolean} 如果格式中包含分钟标记 (m),则返回 true,否则返回 false
414
+ *
415
+ * @example
416
+ * hasMinute('HH:mm:ss') // => true
417
+ * hasMinute('HH:mm') // => true
418
+ * hasMinute('HH:ss') // => false
419
+ * hasMinute('YYYY-MM-DD') // => false
420
+ */
421
+ export function hasMinute(format) {
422
+ // 参数校验:非字符串或空值返回 false
423
+ if (!format || typeof format !== 'string') {
424
+ return false;
425
+ }
426
+
427
+ // 检查是否包含 m (分钟)
428
+ // 注意:必须区分大写 M (月份) 和小写 m (分钟)
429
+ // 使用正则 /[^M]m+|^m+/ 或者简单检测小写 m,但需确保不是 MM 的一部分
430
+ // 更严谨的方式:查找独立的小写 m 序列,且不被大写 M 混淆
431
+ // 由于格式字符串通常由分隔符连接,直接匹配小写 m 即可,因为大写 M 不会匹配小写 m
432
+ return /m+/.test(format);
433
+ }
434
+
435
+ /**
436
+ * 判断输入的时间格式字符串是否包含秒部分
437
+ *
438
+ * @param {string} format - 时间格式字符串,例如 'HH:mm:ss', 'YYYY-MM-DD HH:mm:ss'
439
+ * @returns {boolean} 如果格式中包含秒标记 (s),则返回 true,否则返回 false
440
+ *
441
+ * @example
442
+ * hasSecond('HH:mm:ss') // => true
443
+ * hasSecond('HH:mm') // => false
444
+ * hasSecond('YYYY-MM-DD') // => false
445
+ */
446
+ export function hasSecond(format) {
447
+ // 参数校验:非字符串或空值返回 false
448
+ if (!format || typeof format !== 'string') {
449
+ return false;
450
+ }
451
+
452
+ // 检查是否包含 s (秒)
453
+ // 注意:必须区分大写 S (毫秒) 和小写 s (秒)
454
+ return /s+/.test(format);
455
+ }