@peng_kai/kit 0.3.0-beta.2 → 0.3.0-beta.20

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 (55) hide show
  1. package/.vscode/settings.json +2 -2
  2. package/admin/components/currency/src/CurrencyIcon.vue +35 -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/helpers.ts +250 -0
  7. package/admin/components/date/index.ts +5 -0
  8. package/admin/components/date/presetProps.ts +19 -0
  9. package/admin/components/filter/src/FilterReset.vue +45 -7
  10. package/admin/components/filter/src/more/TableSetting.vue +82 -0
  11. package/admin/components/provider/Admin.vue +17 -0
  12. package/admin/components/provider/admin-permission.ts +48 -0
  13. package/admin/components/provider/admin-router.ts +361 -0
  14. package/admin/components/provider/index.ts +3 -0
  15. package/admin/components/rich-text/src/RichText.new.vue +17 -4
  16. package/admin/components/rich-text/src/editorConfig.ts +10 -1
  17. package/admin/components/text/index.ts +2 -0
  18. package/admin/components/text/src/Amount.v2.vue +132 -0
  19. package/admin/components/text/src/Datetime.vue +17 -12
  20. package/admin/components/text/src/Num.vue +192 -0
  21. package/admin/layout/large/Breadcrumb.vue +10 -23
  22. package/admin/layout/large/Content.vue +14 -6
  23. package/admin/layout/large/Layout.vue +129 -0
  24. package/admin/layout/large/Menu.vue +24 -17
  25. package/admin/layout/large/Notice.vue +140 -0
  26. package/admin/layout/large/Tabs.vue +183 -0
  27. package/admin/layout/large/index.ts +61 -1
  28. package/admin/layout/large/y682.mp3 +0 -0
  29. package/admin/permission/routerGuard.ts +15 -8
  30. package/admin/permission/vuePlugin.ts +5 -10
  31. package/admin/route-guards/index.ts +0 -1
  32. package/admin/stores/index.ts +1 -0
  33. package/admin/styles/classCover.scss +1 -1
  34. package/admin/styles/index.scss +2 -2
  35. package/antd/hooks/useAntdModal.ts +29 -15
  36. package/antd/hooks/useAntdTable.ts +12 -7
  37. package/antd/hooks/useAntdTheme.ts +7 -0
  38. package/antd/hooks/useTableColumns.ts +124 -0
  39. package/antd/index.ts +1 -1
  40. package/libs/bignumber.ts +1 -1
  41. package/libs/dayjs.ts +11 -1
  42. package/libs/fingerprintjs.ts +1 -0
  43. package/package.json +59 -60
  44. package/request/interceptors/getDeviceInfo.ts +14 -0
  45. package/utils/LocaleManager.ts +1 -1
  46. package/utils/locale/LocaleManager.ts +2 -1
  47. package/utils/locale/helpers.ts +9 -0
  48. package/utils/number.ts +0 -1
  49. package/utils/storage.ts +31 -0
  50. package/utils/upload/AwsS3.ts +11 -4
  51. package/admin/layout/large/PageTab.vue +0 -70
  52. package/admin/route-guards/collapseMenu.ts +0 -11
  53. package/libs/a-calc.ts +0 -1
  54. package/vue/components/test/KitTest.vue +0 -9
  55. package/vue/components/test/testStore.ts +0 -11
@@ -8,8 +8,8 @@
8
8
 
9
9
  // Auto fix
10
10
  "editor.codeActionsOnSave": {
11
- "source.fixAll.eslint": "explicit",
12
- "source.organizeImports": "never"
11
+ // "source.fixAll.eslint": "explicit",
12
+ // "source.organizeImports": "never"
13
13
  },
14
14
 
15
15
  // Silent the stylistic rules in you IDE, but still auto fix them
@@ -1,26 +1,32 @@
1
1
  <script lang="ts">
2
- import { computed, reactive, ref, toValue } from 'vue';
3
- import { useInjectedAdminConfig } from '../../provider';
2
+ import { computed, ref } from 'vue';
4
3
 
5
4
  export interface CurrencyIconProps {
6
5
  symbol?: string
7
6
  size?: string
8
- cdn?: string
9
- useCdn?: boolean
7
+ base?: string
8
+ iconType?: 'img' | 'text'
10
9
  }
11
10
 
12
- const imgIcons = ref<Record<string, string>>({
13
- USDT: 'https://api.iconify.design/cryptocurrency-color:usdt.svg',
14
- TRX: 'https://api.iconify.design/cryptocurrency-color:trx.svg',
15
- USDC: 'https://api.iconify.design/cryptocurrency-color:usdc.svg',
16
- ETH: 'https://api.iconify.design/cryptocurrency-color:eth.svg',
17
- BNB: 'https://api.iconify.design/cryptocurrency-color:bnb.svg',
18
- BUSD: 'https://api.iconify.design/token-branded:busd.svg',
19
- MATIC: 'https://api.iconify.design/cryptocurrency-color:matic.svg',
20
- SOL: 'https://api.iconify.design/cryptocurrency-color:sol.svg',
11
+ // https://cdn.xxx.com/currency/{symbol}.svg
12
+ export const iconBase = ref('');
13
+ export const imgIcons = ref<Record<string, string>>({
14
+ CNY: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIj48cGF0aCBkPSJNMTIgMjRjNi42MjcgMCAxMi01LjM3MyAxMi0xMlMxOC42MjcgMCAxMiAwIDAgNS4zNzMgMCAxMnM1LjM3MyAxMiAxMiAxMnoiIGZpbGw9IiNEODAwMjciLz48cGF0aCBkPSJNNi41NjcgNy4zMDNsMS4wMzYgMy4xODhoMy4zNTJsLTIuNzEgMS45NzMgMS4wMzYgMy4xODctMi43MTQtMS45NjgtMi43MTQgMS45NjggMS4wNC0zLjE4N0wyLjE4IDEwLjQ5SDUuNTNsMS4wMzYtMy4xODh6TTE0LjIyNyAxOC41ODZsLS43OTMtLjk3NS0xLjE3MS40NTUuNjgtMS4wNTUtLjc5My0uOTggMS4yMTQuMzI0LjY4NS0xLjA1NS4wNjUgMS4yNTYgMS4yMTkuMzI0LTEuMTc3LjQ1LjA3IDEuMjU2ek0xNS44MDIgMTUuNzI2bC4zNzUtMS4yLTEuMDI3LS43MjYgMS4yNTYtLjAxOS4zNy0xLjIuNDA5IDEuMTkgMS4yNTYtLjAxMy0xLjAwOC43NS40MDMgMS4xOS0xLjAyNi0uNzI2LTEuMDA4Ljc1NXpNMTcuOTI1IDguODA4bC0uNTUzIDEuMTMuOS44NzYtMS4yNDItLjE3OC0uNTU0IDEuMTI1LS4yMTUtMS4yMzgtMS4yNDctLjE3OCAxLjExNi0uNTg2LS4yMTYtMS4yNDIuOS44NzcgMS4xMS0uNTg2ek0xNC4yNiA1LjM4NmwtLjA5NCAxLjI1MSAxLjE2Ny40NzQtMS4yMjMuMy0uMDkgMS4yNTYtLjY2LTEuMDY5LTEuMjI0LjMuODExLS45Ni0uNjY1LTEuMDY1IDEuMTY3LjQ3NC44MS0uOTYxeiIgZmlsbD0iI0ZGREE0NCIvPjxzY3JpcHQvPjxzY3JpcHQvPjwvc3ZnPg==',
15
+ EUR: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjMGY4ZmY4Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTggMTkuMDA0TDguODEgMTdoLjg1N2ExNi4yNzkgMTYuMjc5IDAgMCAxLS4wMzQtMS4wM2MwLS40NDguMDE5LS44NjQuMDU2LTEuMjVIOGwuODEtMi4wMDNoMS4yNzRDMTEuMjcgOC45MDYgMTMuOTQ0IDcgMTguMTAzIDdjMS4zNjcgMCAyLjY2Ni4xNzcgMy44OTcuNTMydjIuNTI0YTguOTIgOC45MiAwIDAgMC0zLjY4My0uNzc2Yy0yLjQ5MyAwLTQuMDk2IDEuMTQ2LTQuODEgMy40MzhoNy40MjNsLS44MSAyLjAwM2gtNy4wOTdhNi45MzggNi45MzggMCAwIDAtLjA1Ni45OTVjMCAuNDc5LjAxNS45MDcuMDQ1IDEuMjg1aDYuMTgzbC0uOCAyLjAwM0gxMy40NGMuNTMzIDEuMzg5IDEuMTgzIDIuMzU1IDEuOTQ5IDIuOS43NjUuNTQ0IDEuODU4LjgxNiAzLjI3Ny44MTYgMS4wMTQgMCAyLjEyNS0uMjQ3IDMuMzM0LS43NDF2Mi4zNzNjLTEuMTQ5LjQzMi0yLjUxNS42NDgtNC4xLjY0OC00LjE2NyAwLTYuODAzLTEuOTk5LTcuOTA2LTUuOTk2eiIvPjwvZz48c2NyaXB0Lz48c2NyaXB0Lz48L3N2Zz4=',
16
+ JPY: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDY0IDY0Ij48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2Y1ZjVmNSIvPjxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjEyIiBmaWxsPSIjZWQ0YzVjIi8+PC9zdmc+',
17
+ PHP: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIj48ZyBjbGlwLXBhdGg9InVybCgjY2xpcDApIj48cGF0aCBkPSJNMTIgMjRjNi42MjcgMCAxMi01LjM3MyAxMi0xMlMxOC42MjcgMCAxMiAwIDAgNS4zNzMgMCAxMnM1LjM3MyAxMiAxMiAxMnoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNMTIgMHYxMmwtOC40ODUgOC40ODVBMTEuOTYzIDExLjk2MyAwIDAgMCAxMiAyNGM2LjYyNyAwIDEyLTUuMzczIDEyLTEyUzEyIDAgMTIgMHoiIGZpbGw9IiNEODAwMjciLz48cGF0aCBkPSJNMTIgMGExMS45NjMgMTEuOTYzIDAgMCAwLTguNDg1IDMuNTE1TDEyIDEyaDEyYzAtNi42MjctNS4zNzMtMTItMTItMTJ6IiBmaWxsPSIjMDA1MkI0Ii8+PHBhdGggZD0iTTguMjE3IDEybC0xLjQ2Ni0uNjkuNzgtMS40MTktMS41OS4zMDUtLjIwMi0xLjYwOEw0LjYzIDkuNzcxIDMuNTIyIDguNTg4bC0uMjAyIDEuNjA4LTEuNTkxLS4zMDUuNzggMS40MkwxLjA0MyAxMmwxLjQ2Ni42OS0uNzggMS40MTkgMS41OTEtLjMwNS4yMDIgMS42MDggMS4xMDgtMS4xODMgMS4xMDkgMS4xODMuMjAxLTEuNjA4IDEuNTkyLjMwNS0uNzgtMS40Mkw4LjIxNiAxMnpNMy4yIDQuNjk2bC40ODguNjgxLjc5OS0uMjUzLS40OTguNjc1LjQ4OC42ODEtLjc5NS0uMjY0LS40OTguNjc0LjAwNi0uODM4LS43OTUtLjI2NS44LS4yNTMuMDA1LS44Mzh6TTMuMiAxNy4xMWwuNDg4LjY4Mi43OTktLjI1My0uNDk4LjY3NC40ODguNjgyLS43OTUtLjI2NS0uNDk4LjY3NC4wMDYtLjgzOC0uNzk1LS4yNjUuOC0uMjUzLjAwNS0uODM4ek0xMC4xNTYgMTAuOTAzbC0uNDg3LjY4Mi0uOC0uMjU0LjQ5OC42NzUtLjQ4Ny42ODIuNzk1LS4yNjUuNDk4LjY3NC0uMDA3LS44MzguNzk2LS4yNjUtLjgtLjI1My0uMDA2LS44Mzh6IiBmaWxsPSIjRkZEQTQ0Ii8+PC9nPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48c2NyaXB0Lz48c2NyaXB0Lz48L3N2Zz4=',
18
+ USD: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIj48cGF0aCBkPSJNMTIgMjRjNi42MjcgMCAxMi01LjM3MyAxMi0xMlMxOC42MjcgMCAxMiAwIDAgNS4zNzMgMCAxMnM1LjM3MyAxMiAxMiAxMnoiIGZpbGw9IiMxNkM3ODQiLz48cGF0aCBkPSJNMTEuNDc2IDE5aDEuMDc5bC4wMDUtMS4yNTJjMi4xODMtLjE3IDMuNDM1LTEuNDYgMy40NC0zLjI5My0uMDA1LTEuOTQtMS40OTYtMi44MjctMy4wNjQtMy4yMjZsLS4zMzUtLjA5My4wMi0zLjEyM2MuODE0LjE1MyAxLjMzOC42NzggMS40MiAxLjQ2NmgxLjgxNmMtLjAzLTEuNzQtMS4zMDItMy4wMDgtMy4yMjYtMy4yMDVMMTIuNjM2IDVoLTEuMDc5bC0uMDA1IDEuMjc0QzkuNjQ0IDYuNDgyIDguMjcgNy43NCA4LjI3NSA5LjU1YzAgMS42MDggMS4wNjMgMi41MzIgMi43NzggMy4wMDhsLjQ1OC4xMjYtLjAyIDMuMzA4Yy0uOTEtLjE1My0xLjU2Ny0uNzEtMS42MzMtMS43SDhjLjA3MSAyLjA1IDEuMzg0IDMuMjcgMy40OCAzLjQ1NkwxMS40NzcgMTl6bTEuMDk0LTMuMDA4bC4wMi0zLjAwMmMuOTI3LjI5IDEuNTE3LjY3MiAxLjUyMiAxLjQ1LS4wMDUuODA4LS42MSAxLjM4OC0xLjU0MiAxLjU1MnptLTEuMDQ4LTUuMTUxYy0uNzAzLS4yNDEtMS4zNDQtLjY0LTEuMzM0LTEuNDE3LjAwNS0uNzA1LjQ5OS0xLjI1MiAxLjM1NC0xLjQxbC0uMDIgMi44Mjd6IiBmaWxsPSIjZmZmIi8+PHNjcmlwdC8+PHNjcmlwdC8+PC9zdmc+',
19
+ // 数字货币
20
+ USDT: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjMjZBMTdCIi8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE3LjkyMiAxNy4zODN2LS4wMDJjLS4xMS4wMDgtLjY3Ny4wNDItMS45NDIuMDQyLTEuMDEgMC0xLjcyMS0uMDMtMS45NzEtLjA0MnYuMDAzYy0zLjg4OC0uMTcxLTYuNzktLjg0OC02Ljc5LTEuNjU4czIuOTAyLTEuNDg2IDYuNzktMS42NnYyLjY0NGMuMjU0LjAxOC45ODIuMDYxIDEuOTg4LjA2MSAxLjIwNyAwIDEuODEyLS4wNSAxLjkyNS0uMDZ2LTIuNjQzYzMuODguMTczIDYuNzc1Ljg1IDYuNzc1IDEuNjU4IDAgLjgxLTIuODk1IDEuNDg1LTYuNzc1IDEuNjU3bTAtMy41OXYtMi4zNjZoNS40MTRWNy44MTlIOC41OTV2My42MDhoNS40MTR2Mi4zNjVjLTQuNC4yMDItNy43MDkgMS4wNzQtNy43MDkgMi4xMThzMy4zMDkgMS45MTUgNy43MDkgMi4xMTh2Ny41ODJoMy45MTN2LTcuNTg0YzQuMzkzLS4yMDIgNy42OTQtMS4wNzMgNy42OTQtMi4xMTZzLTMuMzAxLTEuOTE0LTcuNjk0LTIuMTE3Ii8+PC9nPjwvc3ZnPg==',
21
+ ETH: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjNjI3RUVBIi8+PGcgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj48cGF0aCBmaWxsLW9wYWNpdHk9Ii42MDIiIGQ9Ik0xNi40OTggNHY4Ljg3bDcuNDk3IDMuMzV6Ii8+PHBhdGggZD0iTTE2LjQ5OCA0TDkgMTYuMjJsNy40OTgtMy4zNXoiLz48cGF0aCBmaWxsLW9wYWNpdHk9Ii42MDIiIGQ9Ik0xNi40OTggMjEuOTY4djYuMDI3TDI0IDE3LjYxNnoiLz48cGF0aCBkPSJNMTYuNDk4IDI3Ljk5NXYtNi4wMjhMOSAxNy42MTZ6Ii8+PHBhdGggZmlsbC1vcGFjaXR5PSIuMiIgZD0iTTE2LjQ5OCAyMC41NzNsNy40OTctNC4zNTMtNy40OTctMy4zNDh6Ii8+PHBhdGggZmlsbC1vcGFjaXR5PSIuNjAyIiBkPSJNOSAxNi4yMmw3LjQ5OCA0LjM1M3YtNy43MDF6Ii8+PC9nPjwvZz48L3N2Zz4=',
22
+ TRX: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iI0VGMDAyNyIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yMS45MzIgOS45MTNMNy41IDcuMjU3bDcuNTk1IDE5LjExMiAxMC41ODMtMTIuODk0em0tLjIzMiAxLjE3bDIuMjA4IDIuMDk5LTYuMDM4IDEuMDkzem0tNS4xNDIgMi45NzNsLTYuMzY0LTUuMjc4IDEwLjQwMiAxLjkxNHptLS40NTMuOTM0bC0xLjAzOCA4LjU4TDkuNDcyIDkuNDg3em0uOTYuNDU1bDYuNjg3LTEuMjEtNy42NyA5LjM0M3oiLz48L2c+PC9zdmc+',
23
+ BNB: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iI0YzQkEyRiIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xMi4xMTYgMTQuNDA0TDE2IDEwLjUybDMuODg2IDMuODg2IDIuMjYtMi4yNkwxNiA2bC02LjE0NCA2LjE0NHpNNiAxNmwyLjI2LTIuMjZMMTAuNTIgMTZsLTIuMjYgMi4yNnptNi4xMTYgMS41OTZMMTYgMjEuNDhsMy44ODYtMy44ODYgMi4yNiAyLjI1OUwxNiAyNmwtNi4xNDQtNi4xNDQtLjAwMy0uMDAzek0yMS40OCAxNmwyLjI2LTIuMjZMMjYgMTZsLTIuMjYgMi4yNnptLTMuMTg4LS4wMDJoLjAwMlYxNkwxNiAxOC4yOTRsLTIuMjkxLTIuMjktLjAwNC0uMDA0LjAwNC0uMDAzLjQwMS0uNDAyLjE5NS0uMTk1TDE2IDEzLjcwNnoiLz48L2c+PC9zdmc+',
24
+ MATIC: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIgZmlsbD0iIzZGNDFEOCIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yMS4wOTIgMTIuNjkzYy0uMzY5LS4yMTUtLjg0OC0uMjE1LTEuMjU0IDBsLTIuODc5IDEuNjU0LTEuOTU1IDEuMDc4LTIuODc5IDEuNjUzYy0uMzY5LjIxNi0uODQ4LjIxNi0xLjI1NCAwbC0yLjI4OC0xLjI5NGMtLjM2OS0uMjE1LS42MjctLjYxLS42MjctMS4wNDJWMTIuMTljMC0uNDMxLjIyMS0uODI2LjYyNy0xLjA0MmwyLjI1LTEuMjU4Yy4zNy0uMjE2Ljg1LS4yMTYgMS4yNTYgMGwyLjI1IDEuMjU4Yy4zNy4yMTYuNjI4LjYxMS42MjggMS4wNDJ2MS42NTRsMS45NTUtMS4xMTV2LTEuNjUzYTEuMTYgMS4xNiAwIDAgMC0uNjI3LTEuMDQybC00LjE3LTIuMzcyYy0uMzY5LS4yMTYtLjg0OC0uMjE2LTEuMjU0IDBsLTQuMjQ0IDIuMzcyQTEuMTYgMS4xNiAwIDAgMCA2IDExLjA3NnY0Ljc4YzAgLjQzMi4yMjEuODI3LjYyNyAxLjA0M2w0LjI0NCAyLjM3MmMuMzY5LjIxNS44NDkuMjE1IDEuMjU0IDBsMi44NzktMS42MTggMS45NTUtMS4xMTQgMi44NzktMS42MTdjLjM2OS0uMjE2Ljg0OC0uMjE2IDEuMjU0IDBsMi4yNTEgMS4yNThjLjM3LjIxNS42MjcuNjEuNjI3IDEuMDQydjIuNTUyYzAgLjQzMS0uMjIuODI2LS42MjcgMS4wNDJsLTIuMjUgMS4yOTRjLS4zNy4yMTYtLjg1LjIxNi0xLjI1NSAwbC0yLjI1MS0xLjI1OGMtLjM3LS4yMTYtLjYyOC0uNjExLS42MjgtMS4wNDJ2LTEuNjU0bC0xLjk1NSAxLjExNXYxLjY1M2MwIC40MzEuMjIxLjgyNy42MjcgMS4wNDJsNC4yNDQgMi4zNzJjLjM2OS4yMTYuODQ4LjIxNiAxLjI1NCAwbDQuMjQ0LTIuMzcyYy4zNjktLjIxNS42MjctLjYxLjYyNy0xLjA0MnYtNC43OGExLjE2IDEuMTYgMCAwIDAtLjYyNy0xLjA0MmwtNC4yOC0yLjQwOXoiLz48L2c+PC9zdmc+',
25
+ BTC: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSIjRjc5MzFBIi8+PHBhdGggZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMjMuMTg5IDE0LjAyYy4zMTQtMi4wOTYtMS4yODMtMy4yMjMtMy40NjUtMy45NzVsLjcwOC0yLjg0LTEuNzI4LS40My0uNjkgMi43NjVjLS40NTQtLjExNC0uOTItLjIyLTEuMzg1LS4zMjZsLjY5NS0yLjc4M0wxNS41OTYgNmwtLjcwOCAyLjgzOXEtLjU2NS0uMTI3LTEuMTA0LS4yNmwuMDAyLS4wMDktMi4zODQtLjU5NS0uNDYgMS44NDZzMS4yODMuMjk0IDEuMjU2LjMxMmMuNy4xNzUuODI2LjYzOC44MDUgMS4wMDZsLS44MDYgMy4yMzVxLjA3My4wMTcuMTguMDU3bC0uMTgzLS4wNDUtMS4xMyA0LjUzMmMtLjA4Ni4yMTItLjMwMy41MzEtLjc5My40MS4wMTguMDI1LTEuMjU2LS4zMTMtMS4yNTYtLjMxM2wtLjg1OCAxLjk3OCAyLjI1LjU2MWMuNDE4LjEwNS44MjguMjE1IDEuMjMxLjMxOGwtLjcxNSAyLjg3MiAxLjcyNy40My43MDgtMi44NHEuNzA3LjE5IDEuMzc4LjM1N2wtLjcwNiAyLjgyOCAxLjcyOC40My43MTUtMi44NjZjMi45NDguNTU4IDUuMTY0LjMzMyA2LjA5Ny0yLjMzMy43NTItMi4xNDYtLjAzNy0zLjM4NS0xLjU4OC00LjE5MiAxLjEzLS4yNiAxLjk4LTEuMDAzIDIuMjA3LTIuNTM4bS0zLjk1IDUuNTM4Yy0uNTMzIDIuMTQ3LTQuMTQ4Ljk4Ni01LjMyLjY5NWwuOTUtMy44MDVjMS4xNzIuMjkzIDQuOTI5Ljg3MiA0LjM3IDMuMTFtLjUzNS01LjU2OWMtLjQ4NyAxLjk1My0zLjQ5NS45Ni00LjQ3LjcxN2wuODYtMy40NWMuOTc1LjI0MyA0LjExOC42OTYgMy42MSAyLjczMyIvPjwvZz48L3N2Zz4=',
26
+ TON: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9IlRvbmNvaW5XaWRnZXRfX2xvZ28iPjxwYXRoIGQ9Ik0yOCA1NmMxNS40NjQgMCAyOC0xMi41MzYgMjgtMjhTNDMuNDY0IDAgMjggMCAwIDEyLjUzNiAwIDI4czEyLjUzNiAyOCAyOCAyOHoiIGZpbGw9IiMwMDk4RUEiLz48cGF0aCBkPSJNMzcuNTYgMTUuNjI4SDE4LjQ0Yy0zLjUxNiAwLTUuNzQ1IDMuNzkyLTMuOTc2IDYuODU4bDExLjgwMSAyMC40NTVjLjc3IDEuMzM1IDIuNyAxLjMzNSAzLjQ3IDBsMTEuODA0LTIwLjQ1NWMxLjc2Ny0zLjA2LS40NjItNi44NTgtMy45NzUtNi44NThoLS4wMDN6TTI2LjI1NSAzNi44MDdsLTIuNTctNC45NzQtNi4yMDItMTEuMDkyYy0uNDA5LS43MS4wOTYtMS42Mi45NTMtMS42Mmg3LjgxNlYzNi44MWwuMDAzLS4wMDJ6TTM4LjUxIDIwLjczOWwtNi4yIDExLjA5Ni0yLjU3IDQuOTcyVjE5LjExOWg3LjgxN2MuODU3IDAgMS4zNjIuOTEuOTUzIDEuNjJ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+'
21
27
  });
22
- const textIcons = ref(['¥', '€', '¥', '₱', '$', 'AED', 'ARS', '$', 'BDT', 'R$', '$', 'Fr', '$', 'Kč', 'KR', '£', 'Ft', 'Rp', '₪', '₹', '₩', '$', 'RM', 'NGN', 'KR', '$', 'Rs', 'zł', '₽', 'SAR', 'SEK', 'S$', '฿', '₺', 'NT$', 'UAH', '', 'R']);
23
- const fullback = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDIwIDIwIj48cGF0aCBmaWxsPSIjODQ4YTlkNTUiIGQ9Ik0xMCAyMGExMCAxMCAwIDEgMSAwLTIwIDEwIDEwIDAgMCAxIDAgMjBtMS01aDFhMyAzIDAgMCAwIDAtNkg3Ljk5YTEgMSAwIDAgMSAwLTJIMTRWNWgtM1YzSDl2Mkg4YTMgMyAwIDEgMCAwIDZoNGExIDEgMCAxIDEgMCAySDZ2MmgzdjJoMnoiLz48L3N2Zz4=';
28
+ export const textIcons = ref(['¥', '€', '₱', '$', '', '£', '₪', '₹', '₩', '₽', '฿', '₺', '', 'R', '']);
29
+ const fullbackIcon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDIwIDIwIj48cGF0aCBmaWxsPSIjODQ4YTlkNTUiIGQ9Ik0xMCAyMGExMCAxMCAwIDEgMSAwLTIwIDEwIDEwIDAgMCAxIDAgMjBtMS01aDFhMyAzIDAgMCAwIDAtNkg3Ljk5YTEgMSAwIDAgMSAwLTJIMTRWNWgtM1YzSDl2Mkg4YTMgMyAwIDEgMCAwIDZoNGExIDEgMCAxIDEgMCAySDZ2MmgzdjJoMnoiLz48L3N2Zz4=';
24
30
 
25
31
  const checkHttpUrl = (value: unknown) => String(value).startsWith('http');
26
32
  const checkBase64 = (value: unknown) => String(value).startsWith('data:image');
@@ -31,27 +37,27 @@ defineOptions({
31
37
  inheritAttrs: false,
32
38
  });
33
39
  const props = withDefaults(defineProps<CurrencyIconProps>(), {
34
- size: '1.1em',
40
+ size: '1.2em',
35
41
  symbol: '',
36
- useCdn: true,
42
+ iconType: 'img',
37
43
  });
38
44
 
39
- const { cdn: cdnCtx } = useInjectedAdminConfig() ?? {};
40
- const cdn = computed(() => props.useCdn ? (props.cdn || toValue(cdnCtx)) : '');
45
+ const base = computed(() => props.iconType === 'img' ? (props.base || iconBase.value) : '');
41
46
  const src = computed(() => {
42
47
  if (checkHttpUrl(props.symbol) || checkBase64(props.symbol))
43
48
  return props.symbol;
44
- else if (textIcons.value?.includes(props.symbol))
49
+ else if (props.iconType === 'text' || textIcons.value.includes(props.symbol))
45
50
  return props.symbol;
46
- else if (cdn.value)
47
- return `${cdn.value}/currency/${props.symbol}.svg`;
51
+ else if (imgIcons.value[props.symbol])
52
+ return imgIcons.value[props.symbol];
53
+ else if (base.value)
54
+ return base.value.replace('{symbol}', props.symbol);
48
55
  else
49
- return (imgIcons.value[props.symbol.toUpperCase()] ?? fullback);
56
+ return fullbackIcon;
50
57
  });
51
58
 
52
59
  function onError(ev: Event) {
53
- const $img = ev.target as HTMLImageElement;
54
- $img.src = fullback;
60
+ (ev.target as HTMLImageElement).src = fullbackIcon;
55
61
  }
56
62
  </script>
57
63
 
@@ -59,23 +65,19 @@ function onError(ev: Event) {
59
65
  <img
60
66
  v-if="checkHttpUrl(src) || checkBase64(src)"
61
67
  v-bind="$attrs"
62
- class="currency-icon"
68
+ class="symbol-icon"
63
69
  :src="src"
64
70
  :alt="props.symbol"
65
71
  :style="{ fontSize: $props.size }"
72
+ :title="props.iconType === 'img' ? props.symbol : ''"
66
73
  @error="onError"
67
74
  >
68
- <span v-else v-bind="$attrs">{{ src }}</span>
75
+ <span v-else v-bind="$attrs" class="symbol-text">{{ src }}</span>
69
76
  </template>
70
77
 
71
78
  <style lang="scss" scoped>
72
- img.currency-icon {
79
+ img.symbol-icon {
73
80
  width: 1em;
74
81
  height: 1em;
75
82
  }
76
83
  </style>
77
-
78
- <!--
79
- 透明图片
80
- data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
81
- -->
@@ -0,0 +1,122 @@
1
+ <script setup lang="ts">
2
+ import dayjs from '../../../libs/dayjs';
3
+ import { ref, watch, computed } from 'vue';
4
+ import { Button, ButtonGroup, RadioGroup, RangePicker } from 'ant-design-vue';
5
+
6
+ type RangeValue = [dayjs.Dayjs, dayjs.Dayjs] | undefined;
7
+
8
+ const props = defineProps<{
9
+ min?: dayjs.Dayjs;
10
+ max?: dayjs.Dayjs;
11
+ }>();
12
+ const value = defineModel<RangeValue>('value');
13
+ const pickerOptions = [
14
+ { value: 'date', label: '日' },
15
+ { value: 'week', label: '周' },
16
+ { value: 'month', label: '月' },
17
+ { value: 'year', label: '年' },
18
+ ];
19
+ const pickerType = ref(pickerOptions[0].value);
20
+ // 基于 pickerType 和 value 的值,周期跨度,例如开始月为1月份,结束月为4月份,span 为 3
21
+ const span = computed(() => {
22
+ if (value.value?.length !== 2) {
23
+ return 1;
24
+ }
25
+
26
+ const start = dayjs(value.value[0]);
27
+ const end = dayjs(value.value[1]);
28
+
29
+ if (pickerType.value === 'date') {
30
+ return end.diff(start, 'day') + 1;
31
+ } else if (pickerType.value === 'week') {
32
+ return end.diff(start, 'week') + 1;
33
+ } else if (pickerType.value === 'month') {
34
+ return end.diff(start, 'month') + 1;
35
+ } else if (pickerType.value === 'year') {
36
+ return end.diff(start, 'year') + 1;
37
+ }
38
+
39
+ return 1;
40
+ })
41
+
42
+ watch(pickerType, toCurrent, { immediate: true });
43
+
44
+ function toPrev() {
45
+ if (value.value?.length !== 2) {
46
+ return;
47
+ }
48
+
49
+ let newVal: RangeValue;
50
+ const s = span.value;
51
+
52
+ if (pickerType.value === 'date')
53
+ newVal = [dayjs(value.value[0]).subtract(s, 'day').startOf('day'), dayjs(value.value[1]).subtract(s, 'day').endOf('day')];
54
+ else if (pickerType.value === 'week')
55
+ newVal = [dayjs(value.value[0]).subtract(s, 'week').startOf('week'), dayjs(value.value[1]).subtract(s, 'week').endOf('week')];
56
+ else if (pickerType.value === 'month')
57
+ newVal = [dayjs(value.value[0]).subtract(s, 'month').startOf('month'), dayjs(value.value[1]).subtract(s, 'month').endOf('month')];
58
+ else if (pickerType.value === 'year')
59
+ newVal = [dayjs(value.value[0]).subtract(s, 'year').startOf('year'), dayjs(value.value[1]).subtract(s, 'year').endOf('year')];
60
+
61
+ value.value = newVal;
62
+ }
63
+
64
+ function toCurrent() {
65
+ let newVal: RangeValue;
66
+
67
+ if (pickerType.value === 'date')
68
+ newVal = [dayjs().startOf('day'), dayjs().endOf('day')];
69
+ else if (pickerType.value === 'week')
70
+ newVal = [dayjs().startOf('week'), dayjs().endOf('week')];
71
+ else if (pickerType.value === 'month')
72
+ newVal = [dayjs().startOf('month'), dayjs().endOf('month')];
73
+ else if (pickerType.value === 'year')
74
+ newVal = [dayjs().startOf('year'), dayjs().endOf('year')];
75
+
76
+ value.value = newVal;
77
+ }
78
+
79
+ function toNext() {
80
+ if (value.value?.length !== 2) {
81
+ return;
82
+ }
83
+
84
+ let newVal: RangeValue;
85
+ const s = span.value;
86
+
87
+ if (pickerType.value === 'date')
88
+ newVal = [dayjs(value.value[0]).add(s, 'day').startOf('day'), dayjs(value.value[1]).add(s, 'day').endOf('day')];
89
+ else if (pickerType.value === 'week')
90
+ newVal = [dayjs(value.value[0]).add(s, 'week').startOf('week'), dayjs(value.value[1]).add(s, 'week').endOf('week')];
91
+ else if (pickerType.value === 'month')
92
+ newVal = [dayjs(value.value[0]).add(s, 'month').startOf('month'), dayjs(value.value[1]).add(s, 'month').endOf('month')];
93
+ else if (pickerType.value === 'year')
94
+ newVal = [dayjs(value.value[0]).add(s, 'year').startOf('year'), dayjs(value.value[1]).add(s, 'year').endOf('year')];
95
+
96
+ value.value = newVal;
97
+ }
98
+ </script>
99
+
100
+ <template>
101
+ <div class="flex items-center gap-1">
102
+ <RadioGroup v-model:value="pickerType" :options="pickerOptions" buttonStyle="solid" optionType="button" />
103
+ <RangePicker class="w-60" v-model:value="value" :picker="(pickerType as any)" :allowClear="false" />
104
+ <ButtonGroup>
105
+ <Button @click="toPrev" title="上一周期">
106
+ <div class="flex items-center -mx-1">
107
+ <i class="i-ion:arrow-left-b text-[1.2em]" />
108
+ </div>
109
+ </Button>
110
+ <Button @click="toCurrent" title="当前周期">
111
+ <div class="flex items-center justify-center">
112
+ <div class="size-2 rounded-full bg-current" />
113
+ </div>
114
+ </Button>
115
+ <Button @click="toNext" title="下一周期">
116
+ <div class="flex items-center -mx-1">
117
+ <i class="i-ion:arrow-right-b text-[1.2em]" />
118
+ </div>
119
+ </Button>
120
+ </ButtonGroup>
121
+ </div>
122
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+ import { Dropdown, Menu, MenuItem } from 'ant-design-vue';
4
+
5
+ const props = defineProps<{
6
+ types: Array<string | number>[];
7
+ }>();
8
+
9
+ const value = defineModel<string | number>('value', { default: 'create_time' });
10
+ const current = computed(() => props.types.find(item => item[0] === value.value));
11
+ </script>
12
+
13
+ <template>
14
+ <Dropdown>
15
+ <span class="cursor-pointer underline underline-offset-3">{{ current?.[1] || '时间' }}</span>
16
+ <template #overlay>
17
+ <Menu>
18
+ <MenuItem v-for="item of props.types" :key="item[0]" @click="value = item[0]">
19
+ {{ item[1] }}
20
+ </MenuItem>
21
+ </Menu>
22
+ </template>
23
+ </Dropdown>
24
+ </template>