ff-ui-plus 2.0.7

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 (319) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc.cjs +41 -0
  3. package/.stylelintignore +5 -0
  4. package/LICENSE +21 -0
  5. package/README.md +265 -0
  6. package/commitlint.config.cjs +162 -0
  7. package/global.d.ts +27 -0
  8. package/index.html +16 -0
  9. package/lib.sh +9 -0
  10. package/lint-staged.config.cjs +8 -0
  11. package/package.json +149 -0
  12. package/packages/components/adaptive-page/index.ts +5 -0
  13. package/packages/components/adaptive-page/src/index.vue +85 -0
  14. package/packages/components/adaptive-page/src/type.ts +9 -0
  15. package/packages/components/adaptive-page/style/css.ts +1 -0
  16. package/packages/components/adaptive-page/style/index.ts +1 -0
  17. package/packages/components/button/index.ts +5 -0
  18. package/packages/components/button/src/index.vue +41 -0
  19. package/packages/components/button/src/type.ts +11 -0
  20. package/packages/components/button/style/css.ts +1 -0
  21. package/packages/components/button/style/index.ts +1 -0
  22. package/packages/components/chart/index.ts +5 -0
  23. package/packages/components/chart/src/index.vue +121 -0
  24. package/packages/components/chart/src/type.ts +7 -0
  25. package/packages/components/chart/style/css.ts +1 -0
  26. package/packages/components/chart/style/index.ts +1 -0
  27. package/packages/components/checkbox/index.ts +3 -0
  28. package/packages/components/checkbox/src/checkbox.d.ts +5 -0
  29. package/packages/components/checkbox/src/index.vue +67 -0
  30. package/packages/components/checkbox/style/css.ts +1 -0
  31. package/packages/components/checkbox/style/index.ts +1 -0
  32. package/packages/components/date-picker/index.ts +5 -0
  33. package/packages/components/date-picker/src/index.vue +228 -0
  34. package/packages/components/date-picker/src/type.ts +22 -0
  35. package/packages/components/date-picker/style/css.ts +1 -0
  36. package/packages/components/date-picker/style/index.ts +1 -0
  37. package/packages/components/detail/index.ts +5 -0
  38. package/packages/components/detail/src/index.vue +102 -0
  39. package/packages/components/detail/src/renderLabel.vue +15 -0
  40. package/packages/components/detail/src/renderTooltip.vue +15 -0
  41. package/packages/components/detail/src/type.ts +28 -0
  42. package/packages/components/detail/style/css.ts +1 -0
  43. package/packages/components/detail/style/index.ts +1 -0
  44. package/packages/components/form/index.ts +5 -0
  45. package/packages/components/form/src/index.vue +407 -0
  46. package/packages/components/form/src/renderBtn.vue +15 -0
  47. package/packages/components/form/src/renderComp.vue +15 -0
  48. package/packages/components/form/src/type.ts +26 -0
  49. package/packages/components/form/style/css.ts +1 -0
  50. package/packages/components/form/style/index.ts +1 -0
  51. package/packages/components/index.ts +20 -0
  52. package/packages/components/input/index.ts +5 -0
  53. package/packages/components/input/src/index.vue +225 -0
  54. package/packages/components/input/src/type.ts +14 -0
  55. package/packages/components/input/style/css.ts +1 -0
  56. package/packages/components/input/style/index.ts +1 -0
  57. package/packages/components/layout-page/index.ts +4 -0
  58. package/packages/components/layout-page/src/index.vue +74 -0
  59. package/packages/components/layout-page/style/css.ts +1 -0
  60. package/packages/components/layout-page/style/index.ts +1 -0
  61. package/packages/components/layout-page-item/index.ts +3 -0
  62. package/packages/components/layout-page-item/src/index.vue +16 -0
  63. package/packages/components/layout-page-item/style/css.ts +1 -0
  64. package/packages/components/layout-page-item/style/index.ts +1 -0
  65. package/packages/components/module-form/index.ts +4 -0
  66. package/packages/components/module-form/src/index.vue +243 -0
  67. package/packages/components/module-form/src/moduleDetail.vue +61 -0
  68. package/packages/components/module-form/src/moduleForm.vue +88 -0
  69. package/packages/components/module-form/src/type.ts +16 -0
  70. package/packages/components/module-form/style/css.ts +1 -0
  71. package/packages/components/module-form/style/index.ts +1 -0
  72. package/packages/components/package.json +9 -0
  73. package/packages/components/query-condition/index.ts +4 -0
  74. package/packages/components/query-condition/src/index.vue +478 -0
  75. package/packages/components/query-condition/src/moreChoose.vue +159 -0
  76. package/packages/components/query-condition/src/renderComp.vue +15 -0
  77. package/packages/components/query-condition/src/type.ts +22 -0
  78. package/packages/components/query-condition/src/useComputed.ts +94 -0
  79. package/packages/components/query-condition/style/css.ts +1 -0
  80. package/packages/components/query-condition/style/index.ts +1 -0
  81. package/packages/components/radio/index.ts +3 -0
  82. package/packages/components/radio/src/index.vue +73 -0
  83. package/packages/components/radio/src/radio.d.ts +12 -0
  84. package/packages/components/radio/style/css.ts +1 -0
  85. package/packages/components/radio/style/index.ts +1 -0
  86. package/packages/components/select/index.ts +4 -0
  87. package/packages/components/select/src/index.vue +240 -0
  88. package/packages/components/select/src/type.ts +43 -0
  89. package/packages/components/select/style/css.ts +1 -0
  90. package/packages/components/select/style/index.ts +1 -0
  91. package/packages/components/select-icon/index.ts +4 -0
  92. package/packages/components/select-icon/src/index.vue +128 -0
  93. package/packages/components/select-icon/style/css.ts +1 -0
  94. package/packages/components/select-icon/style/index.ts +1 -0
  95. package/packages/components/select-table/index.ts +4 -0
  96. package/packages/components/select-table/src/ClickOutside.ts +106 -0
  97. package/packages/components/select-table/src/index.vue +851 -0
  98. package/packages/components/select-table/src/renderCol.vue +20 -0
  99. package/packages/components/select-table/src/type.ts +56 -0
  100. package/packages/components/select-table/src/useVirtualized.ts +86 -0
  101. package/packages/components/select-table/style/css.ts +1 -0
  102. package/packages/components/select-table/style/index.ts +1 -0
  103. package/packages/components/step-wizard/index.ts +4 -0
  104. package/packages/components/step-wizard/src/index.vue +99 -0
  105. package/packages/components/step-wizard/src/type.ts +17 -0
  106. package/packages/components/step-wizard/style/css.ts +1 -0
  107. package/packages/components/step-wizard/style/index.ts +1 -0
  108. package/packages/components/table/index.ts +5 -0
  109. package/packages/components/table/src/ColumnSet.vue +176 -0
  110. package/packages/components/table/src/TTableColumn.vue +100 -0
  111. package/packages/components/table/src/densitySet.vue +91 -0
  112. package/packages/components/table/src/firstColumn.vue +132 -0
  113. package/packages/components/table/src/index.vue +926 -0
  114. package/packages/components/table/src/operator.vue +246 -0
  115. package/packages/components/table/src/renderCol.vue +20 -0
  116. package/packages/components/table/src/renderHeader.vue +18 -0
  117. package/packages/components/table/src/singleEdit.vue +354 -0
  118. package/packages/components/table/src/singleEditCell.vue +303 -0
  119. package/packages/components/table/src/tableProps.ts +162 -0
  120. package/packages/components/table/src/useExpose.ts +74 -0
  121. package/packages/components/table/src/useVirtualized.ts +70 -0
  122. package/packages/components/table/style/css.ts +1 -0
  123. package/packages/components/table/style/index.ts +1 -0
  124. package/packages/components/tabs/index.ts +4 -0
  125. package/packages/components/tabs/src/index.vue +50 -0
  126. package/packages/components/tabs/style/css.ts +1 -0
  127. package/packages/components/tabs/style/index.ts +1 -0
  128. package/packages/components/timer-btn/index.ts +4 -0
  129. package/packages/components/timer-btn/src/index.vue +57 -0
  130. package/packages/components/timer-btn/style/css.ts +1 -0
  131. package/packages/components/timer-btn/style/index.ts +1 -0
  132. package/packages/components/utils/index.ts +142 -0
  133. package/packages/components/utils/install.ts +16 -0
  134. package/packages/eslint-config/build.config.ts +16 -0
  135. package/packages/eslint-config/dist/index.cjs +122 -0
  136. package/packages/eslint-config/dist/index.d.cts +92 -0
  137. package/packages/eslint-config/dist/index.d.mts +92 -0
  138. package/packages/eslint-config/dist/index.d.ts +92 -0
  139. package/packages/eslint-config/dist/index.mjs +120 -0
  140. package/packages/eslint-config/package.json +34 -0
  141. package/packages/eslint-config/src/index.ts +121 -0
  142. package/packages/ff-ui-plus/component.ts +55 -0
  143. package/packages/ff-ui-plus/defaults.ts +4 -0
  144. package/packages/ff-ui-plus/index.ts +9 -0
  145. package/packages/ff-ui-plus/make-installer.ts +10 -0
  146. package/packages/ff-ui-plus/package.json +117 -0
  147. package/packages/ff-ui-plus/version.ts +1 -0
  148. package/packages/hooks/index.ts +1 -0
  149. package/packages/hooks/package.json +9 -0
  150. package/packages/hooks/useLocale.ts +53 -0
  151. package/packages/locale/index.ts +11 -0
  152. package/packages/locale/lang/en.ts +157 -0
  153. package/packages/locale/lang/zh-cn.ts +155 -0
  154. package/packages/locale/package.json +12 -0
  155. package/packages/resolver/package.json +23 -0
  156. package/packages/resolver/src/index.ts +99 -0
  157. package/packages/theme-chalk/build.ts +76 -0
  158. package/packages/theme-chalk/dist/index.css +1 -0
  159. package/packages/theme-chalk/dist/src/adaptive-page.scss +48 -0
  160. package/packages/theme-chalk/dist/src/button.scss +23 -0
  161. package/packages/theme-chalk/dist/src/chart.scss +10 -0
  162. package/packages/theme-chalk/dist/src/checkbox.scss +0 -0
  163. package/packages/theme-chalk/dist/src/date-picker.scss +3 -0
  164. package/packages/theme-chalk/dist/src/detail.scss +7 -0
  165. package/packages/theme-chalk/dist/src/form.scss +104 -0
  166. package/packages/theme-chalk/dist/src/index.scss +19 -0
  167. package/packages/theme-chalk/dist/src/input.scss +0 -0
  168. package/packages/theme-chalk/dist/src/layout-page-item.scss +10 -0
  169. package/packages/theme-chalk/dist/src/layout-page.scss +37 -0
  170. package/packages/theme-chalk/dist/src/module-form.scss +335 -0
  171. package/packages/theme-chalk/dist/src/query-condition.scss +132 -0
  172. package/packages/theme-chalk/dist/src/radio.scss +0 -0
  173. package/packages/theme-chalk/dist/src/select-icon.scss +61 -0
  174. package/packages/theme-chalk/dist/src/select-table.scss +71 -0
  175. package/packages/theme-chalk/dist/src/select.scss +7 -0
  176. package/packages/theme-chalk/dist/src/step-wizard.scss +51 -0
  177. package/packages/theme-chalk/dist/src/table.scss +381 -0
  178. package/packages/theme-chalk/dist/src/tabs.scss +20 -0
  179. package/packages/theme-chalk/dist/src/timer-btn.scss +21 -0
  180. package/packages/theme-chalk/dist/t-adaptive-page.css +1 -0
  181. package/packages/theme-chalk/dist/t-button.css +1 -0
  182. package/packages/theme-chalk/dist/t-chart.css +1 -0
  183. package/packages/theme-chalk/dist/t-checkbox.css +0 -0
  184. package/packages/theme-chalk/dist/t-date-picker.css +1 -0
  185. package/packages/theme-chalk/dist/t-detail.css +1 -0
  186. package/packages/theme-chalk/dist/t-form.css +1 -0
  187. package/packages/theme-chalk/dist/t-input.css +0 -0
  188. package/packages/theme-chalk/dist/t-layout-page-item.css +1 -0
  189. package/packages/theme-chalk/dist/t-layout-page.css +1 -0
  190. package/packages/theme-chalk/dist/t-module-form.css +1 -0
  191. package/packages/theme-chalk/dist/t-query-condition.css +1 -0
  192. package/packages/theme-chalk/dist/t-radio.css +0 -0
  193. package/packages/theme-chalk/dist/t-select-icon.css +1 -0
  194. package/packages/theme-chalk/dist/t-select-table.css +1 -0
  195. package/packages/theme-chalk/dist/t-select.css +1 -0
  196. package/packages/theme-chalk/dist/t-step-wizard.css +1 -0
  197. package/packages/theme-chalk/dist/t-table.css +1 -0
  198. package/packages/theme-chalk/dist/t-tabs.css +1 -0
  199. package/packages/theme-chalk/dist/t-timer-btn.css +1 -0
  200. package/packages/theme-chalk/mixins/config.scss +8 -0
  201. package/packages/theme-chalk/mixins/function.scss +71 -0
  202. package/packages/theme-chalk/mixins/mixins.scss +79 -0
  203. package/packages/theme-chalk/package.json +21 -0
  204. package/packages/theme-chalk/src/adaptive-page.scss +48 -0
  205. package/packages/theme-chalk/src/button.scss +23 -0
  206. package/packages/theme-chalk/src/chart.scss +10 -0
  207. package/packages/theme-chalk/src/checkbox.scss +0 -0
  208. package/packages/theme-chalk/src/date-picker.scss +3 -0
  209. package/packages/theme-chalk/src/detail.scss +7 -0
  210. package/packages/theme-chalk/src/form.scss +104 -0
  211. package/packages/theme-chalk/src/index.scss +19 -0
  212. package/packages/theme-chalk/src/input.scss +0 -0
  213. package/packages/theme-chalk/src/layout-page-item.scss +10 -0
  214. package/packages/theme-chalk/src/layout-page.scss +37 -0
  215. package/packages/theme-chalk/src/module-form.scss +335 -0
  216. package/packages/theme-chalk/src/query-condition.scss +132 -0
  217. package/packages/theme-chalk/src/radio.scss +0 -0
  218. package/packages/theme-chalk/src/select-icon.scss +61 -0
  219. package/packages/theme-chalk/src/select-table.scss +71 -0
  220. package/packages/theme-chalk/src/select.scss +7 -0
  221. package/packages/theme-chalk/src/step-wizard.scss +51 -0
  222. package/packages/theme-chalk/src/table.scss +381 -0
  223. package/packages/theme-chalk/src/tabs.scss +20 -0
  224. package/packages/theme-chalk/src/timer-btn.scss +21 -0
  225. package/packages/types/global.ts +34 -0
  226. package/packages/types/index.ts +1 -0
  227. package/packages/types/package.json +10 -0
  228. package/packages/utils/build.config.ts +23 -0
  229. package/packages/utils/dist/cookie.cjs +1 -0
  230. package/packages/utils/dist/cookie.d.cts +16 -0
  231. package/packages/utils/dist/cookie.d.mts +16 -0
  232. package/packages/utils/dist/cookie.d.ts +16 -0
  233. package/packages/utils/dist/cookie.mjs +1 -0
  234. package/packages/utils/dist/day.cjs +1 -0
  235. package/packages/utils/dist/day.d.cts +37 -0
  236. package/packages/utils/dist/day.d.mts +37 -0
  237. package/packages/utils/dist/day.d.ts +37 -0
  238. package/packages/utils/dist/day.mjs +1 -0
  239. package/packages/utils/dist/file.cjs +1 -0
  240. package/packages/utils/dist/file.d.cts +61 -0
  241. package/packages/utils/dist/file.d.mts +61 -0
  242. package/packages/utils/dist/file.d.ts +61 -0
  243. package/packages/utils/dist/file.mjs +1 -0
  244. package/packages/utils/dist/index.cjs +1 -0
  245. package/packages/utils/dist/index.d.cts +13 -0
  246. package/packages/utils/dist/index.d.mts +13 -0
  247. package/packages/utils/dist/index.d.ts +13 -0
  248. package/packages/utils/dist/index.mjs +1 -0
  249. package/packages/utils/dist/is.cjs +1 -0
  250. package/packages/utils/dist/is.d.cts +117 -0
  251. package/packages/utils/dist/is.d.mts +117 -0
  252. package/packages/utils/dist/is.d.ts +117 -0
  253. package/packages/utils/dist/is.mjs +1 -0
  254. package/packages/utils/dist/letter.cjs +1 -0
  255. package/packages/utils/dist/letter.d.cts +12 -0
  256. package/packages/utils/dist/letter.d.mts +12 -0
  257. package/packages/utils/dist/letter.d.ts +12 -0
  258. package/packages/utils/dist/letter.mjs +1 -0
  259. package/packages/utils/dist/number.cjs +1 -0
  260. package/packages/utils/dist/number.d.cts +23 -0
  261. package/packages/utils/dist/number.d.mts +23 -0
  262. package/packages/utils/dist/number.d.ts +23 -0
  263. package/packages/utils/dist/number.mjs +1 -0
  264. package/packages/utils/dist/openExe.cjs +1 -0
  265. package/packages/utils/dist/openExe.d.cts +9 -0
  266. package/packages/utils/dist/openExe.d.mts +9 -0
  267. package/packages/utils/dist/openExe.d.ts +9 -0
  268. package/packages/utils/dist/openExe.mjs +1 -0
  269. package/packages/utils/dist/storage.cjs +1 -0
  270. package/packages/utils/dist/storage.d.cts +46 -0
  271. package/packages/utils/dist/storage.d.mts +46 -0
  272. package/packages/utils/dist/storage.d.ts +46 -0
  273. package/packages/utils/dist/storage.mjs +1 -0
  274. package/packages/utils/dist/validate.cjs +1 -0
  275. package/packages/utils/dist/validate.d.cts +32 -0
  276. package/packages/utils/dist/validate.d.mts +32 -0
  277. package/packages/utils/dist/validate.d.ts +32 -0
  278. package/packages/utils/dist/validate.mjs +1 -0
  279. package/packages/utils/dist/ws.cjs +1 -0
  280. package/packages/utils/dist/ws.d.cts +86 -0
  281. package/packages/utils/dist/ws.d.mts +86 -0
  282. package/packages/utils/dist/ws.d.ts +86 -0
  283. package/packages/utils/dist/ws.mjs +1 -0
  284. package/packages/utils/package.json +42 -0
  285. package/packages/utils/src/cookie.ts +24 -0
  286. package/packages/utils/src/day.ts +66 -0
  287. package/packages/utils/src/file.ts +173 -0
  288. package/packages/utils/src/index.ts +10 -0
  289. package/packages/utils/src/is.ts +159 -0
  290. package/packages/utils/src/letter.ts +15 -0
  291. package/packages/utils/src/number.ts +37 -0
  292. package/packages/utils/src/openExe.ts +45 -0
  293. package/packages/utils/src/storage.ts +77 -0
  294. package/packages/utils/src/validate.ts +55 -0
  295. package/packages/utils/src/ws.ts +191 -0
  296. package/pnpm-workspace.yaml +3 -0
  297. package/publish.sh +37 -0
  298. package/resolver.sh +9 -0
  299. package/scripts/build/all.ts +152 -0
  300. package/scripts/build/build.config.ts +10 -0
  301. package/scripts/build/dist/index.cjs +7 -0
  302. package/scripts/build/dist/index.d.ts +2 -0
  303. package/scripts/build/dist/index.mjs +12 -0
  304. package/scripts/build/index.ts +63 -0
  305. package/scripts/build/modules.ts +141 -0
  306. package/scripts/build/package.json +14 -0
  307. package/scripts/release/gen-version.ts +12 -0
  308. package/scripts/release/index.ts +209 -0
  309. package/scripts/utils/excludeFiles.ts +14 -0
  310. package/scripts/utils/index.ts +88 -0
  311. package/scripts/utils/main.ts +14 -0
  312. package/scripts/utils/paths.ts +40 -0
  313. package/scripts/utils/plugin.ts +61 -0
  314. package/tsconfig.base.json +23 -0
  315. package/tsconfig.vitest.json +11 -0
  316. package/tsconfig.web.json +18 -0
  317. package/typings/env.d.ts +22 -0
  318. package/typings/index.d.ts +161 -0
  319. package/vitest.config.ts +22 -0
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@ff-ui-plus/utils",
3
+ "version": "0.0.2",
4
+ "description": "utils of ff-ui-plus",
5
+ "license": "MIT",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "registry": "https://registry.npmjs.org"
15
+ },
16
+ "scripts": {
17
+ "build": "npx unbuild",
18
+ "stub": "npx unbuild --stub"
19
+ },
20
+ "dependencies": {
21
+ "accounting": "^0.4.1",
22
+ "axios": "^1.4.0",
23
+ "crypto-js": "^4.1.1",
24
+ "dayjs": "^1.11.7",
25
+ "file-saver": "^2.0.5",
26
+ "good-storage": "^1.1.1",
27
+ "js-cookie": "^3.0.5",
28
+ "lodash-es": "^4.17.21",
29
+ "numeral": "^2.0.6",
30
+ "qs": "^6.11.1"
31
+ },
32
+ "devDependencies": {
33
+ "@types/accounting": "^0.4.2",
34
+ "@types/crypto-js": "^4.1.1",
35
+ "@types/file-saver": "^2.0.5",
36
+ "@types/good-storage": "^1.1.0",
37
+ "@types/js-cookie": "^3.0.3",
38
+ "@types/lodash-es": "^4.17.7",
39
+ "@types/numeral": "^2.0.2",
40
+ "@types/qs": "^6.9.7"
41
+ }
42
+ }
@@ -0,0 +1,24 @@
1
+ import Cookies from "js-cookie"
2
+
3
+ /**
4
+ * 获取 cookie
5
+ * @returns
6
+ */
7
+ export function getCookie(key: string): string | undefined {
8
+ return Cookies.get(key)
9
+ }
10
+
11
+ /**
12
+ * 设置 cookie
13
+ * @returns
14
+ */
15
+ export function setCookie(key: string, data: any): string | undefined {
16
+ return Cookies.set(key, data)
17
+ }
18
+
19
+ /**
20
+ * 移除 cookie
21
+ */
22
+ export function removeCookie(key: string): void {
23
+ Cookies.remove(key)
24
+ }
@@ -0,0 +1,66 @@
1
+ import dayjs from "dayjs"
2
+ import type { QUnitType, OpUnitType, ConfigType } from "dayjs"
3
+
4
+ /**
5
+ *
6
+ * @param {string | number | Date | Dayjs | null | undefined} date
7
+ * @param format 默认 YYYY-MM-DD HH:mm:ss
8
+ * @returns YYYY-MM-DD HH:mm:ss
9
+ */
10
+ export function formatDate(date?: ConfigType, format = "YYYY-MM-DD HH:mm:ss"): string {
11
+ return dayjs(date || new Date()).format(format)
12
+ }
13
+
14
+ /**
15
+ * 格式化时间到天
16
+ * @param {string | number | Date | Dayjs | null | undefined} date
17
+ * @returns YYYY-MM-DD
18
+ */
19
+ export const formatDateToDay = (date: ConfigType): string => formatDate(date, "YYYY-MM-DD")
20
+
21
+ /**
22
+ * 格式化时间到分钟
23
+ * @param {string | number | Date | Dayjs | null | undefined} date
24
+ * @returns YYYY-MM-DD HH:mm
25
+ */
26
+ export const formatDateToMinute = (date: ConfigType): string => formatDate(date, "YYYY-MM-DD HH:mm")
27
+
28
+ /**
29
+ * 获取两个 Dayjs 对象的时间差,默认秒。
30
+ * @param date1
31
+ * @param date2
32
+ * @param format
33
+ * @returns {*}
34
+ */
35
+ export function diffDate(
36
+ date1: ConfigType,
37
+ date2: ConfigType = dayjs(),
38
+ format: QUnitType | OpUnitType = "second"
39
+ ): number | string | undefined {
40
+ if (!date1) return
41
+ return dayjs(date1).diff(dayjs(date2), format)
42
+ }
43
+
44
+ /**
45
+ * @desc 获取距离当前时间差,返回多少年(月/天/小时/分钟/秒)前
46
+ * @param date 秒数
47
+ * @returns
48
+ */
49
+ export function diffDateFromCurrent(date: number): string {
50
+ if (date >= 60 * 60 * 24 * 365) {
51
+ return `${parseInt(String(date / (60 * 60 * 24 * 365)))}年前`
52
+ }
53
+ if (date >= 60 * 60 * 24 * 30) {
54
+ return `${parseInt(String(date / (60 * 60 * 24 * 30)))}月前`
55
+ }
56
+ if (date >= 60 * 60 * 24) {
57
+ return `${parseInt(String(date / (60 * 60 * 24)))}天前`
58
+ }
59
+ if (date >= 60 * 60) {
60
+ return `${parseInt(String(date / (60 * 60)))}小时前`
61
+ }
62
+ if (date >= 60) {
63
+ return `${parseInt(String(date / 60))}分钟前`
64
+ }
65
+ return `${parseInt(String(date))}秒前`
66
+ }
@@ -0,0 +1,173 @@
1
+ import type { FileSaverOptions } from "file-saver"
2
+
3
+ const toLower = (str: string) => str.toLowerCase()
4
+
5
+ /**
6
+ * 获取文件类型
7
+ * @param path
8
+ * @returns
9
+ */
10
+ const getFileType = (path: string) => path && path.slice(path.lastIndexOf("."))
11
+
12
+ /**
13
+ *
14
+ * @desc 限制文件类型
15
+ * @param {file|Blob} file 源文件
16
+ * "默认限制图"片
17
+ * @return 合法文件返回true否则返回false
18
+ */
19
+ export const isLegalFile = (file: File | Blob, types: string[]): boolean => {
20
+ const filterTypes = types.filter(item => item && item !== "*").map(item => toLower(item))
21
+ if (!filterTypes.length) {
22
+ return true
23
+ }
24
+ const type = getFileType(file.name)
25
+
26
+ const isLegal = filterTypes.includes(toLower(type))
27
+ if (!isLegal) {
28
+ // 上传文件格式有误!
29
+ return false
30
+ }
31
+ return true
32
+ }
33
+
34
+ /**
35
+ * @desc 限制文件上传大小
36
+ * @param {file|Blob} file 源文件
37
+ * @param {number} fileMaxSize 图片限制大小单位(MB)
38
+ * @return 在限制内返回true否则返回false
39
+ */
40
+ export const isMaxFileSize = (file: File | Blob, fileMaxSize?: number): boolean => {
41
+ if (!fileMaxSize) {
42
+ return true
43
+ }
44
+ const isMaxSize = file.size / 1024 / 1024 < fileMaxSize
45
+ if (!isMaxSize) {
46
+ // 上传文件大小不能超过 {size} MB!
47
+ return false
48
+ }
49
+ return true
50
+ }
51
+
52
+ /**
53
+ *
54
+ * @desc 读取文件为DataURL文件格式 (base64)
55
+ * @param {file|Blob} file 源文件
56
+ * @return 返回DataURL文件 (base64)
57
+ */
58
+ export const fileToDataURL = (file: File | Blob): Promise<string> => {
59
+ return new Promise((resolve, reject) => {
60
+ const reader = new FileReader()
61
+ reader.onload = (e: ProgressEvent<FileReader>) => {
62
+ const data = (e.target as any).result
63
+ resolve(data)
64
+ }
65
+ reader.onerror = e => {
66
+ // 读取文件失败
67
+ reject(new Error(e as any))
68
+ }
69
+ reader.readAsDataURL(file)
70
+ })
71
+ }
72
+
73
+ /**
74
+ * @desc 读取文件为text文件格式
75
+ * @param {file} file 源文件
76
+ * @return 返回text文件
77
+ */
78
+ export const fileToText = (file: File | Blob): Promise<string> => {
79
+ return new Promise((resolve, reject) => {
80
+ const reader = new FileReader()
81
+ reader.onload = (e: ProgressEvent<FileReader>) => {
82
+ const data = (e.target as any).result
83
+ resolve(data)
84
+ }
85
+ reader.onerror = e => {
86
+ // 读取文件失败
87
+ // 读取文件失败
88
+ reject(new Error(e as any))
89
+ }
90
+ reader.readAsText(file, "utf-8")
91
+ })
92
+ }
93
+
94
+ /**
95
+ * @desc 加载真实图片,读取成功返回图片真实宽高和图片本身对象 ag: { width: 100,height: 100,image: '' }
96
+ * @param {string} src 图片地址
97
+ * @return `{ width: ,height: , image: }`
98
+ */
99
+ export const loadImage = (
100
+ src: string
101
+ ): Promise<{ width: number; height: number; image: HTMLImageElement }> => {
102
+ return new Promise((resolve, reject) => {
103
+ const image = new Image()
104
+ image.src = src
105
+ image.onload = () => {
106
+ const data = { width: image.width, height: image.height, image }
107
+ resolve(data)
108
+ }
109
+ image.onerror = () => {
110
+ // 加载文件失败
111
+ const err = new Error("load file error")
112
+ reject(err)
113
+ }
114
+ })
115
+ }
116
+
117
+ /**
118
+ * @desc 判断图片文件的分辨率是否在限定范围之内,分辨率不在限定范围之内则抛出异常
119
+ * @param {file} file 源文件
120
+ * @param {object} props 文件分辨率的宽和高 ag: props={width:100, height :100}
121
+ */
122
+ export const isLegalResolutionRatio = async (
123
+ file: File | Blob,
124
+ props: { width: number; height: number }
125
+ ): Promise<boolean> => {
126
+ try {
127
+ const { width, height } = props
128
+ const base64 = await fileToDataURL(file)
129
+ const image = await loadImage(base64)
130
+ if (image.width !== width || image.height !== height) {
131
+ // 上传图片的分辨率必须为
132
+ return Promise.reject(false)
133
+ }
134
+ return true
135
+ } catch (error) {
136
+ return Promise.reject(false)
137
+ }
138
+ }
139
+
140
+ interface Download<T = Blob | string> {
141
+ (data: T, filename: string, options?: FileSaverOptions): Promise<T>
142
+ }
143
+
144
+ /**
145
+ * @description 下载文件
146
+ * @param {Blob | string} data 文件 Blob
147
+ * @param {string} filename 文件名称
148
+ * @param {object} options 可选参数
149
+ */
150
+ export const download: Download = async (data, filename, options) => {
151
+ // 处理没有数据的情况
152
+ if (!data) {
153
+ return Promise.reject("download fail: data is empt!")
154
+ }
155
+
156
+ // 处理二进制数据接口异常
157
+ try {
158
+ const text = await (data as Blob).text()
159
+ const res = JSON.parse(text)
160
+ if (res) {
161
+ return Promise.reject("download fail: server error!")
162
+ }
163
+ } catch (error) {}
164
+
165
+ // 下载文件
166
+ try {
167
+ const { default: FileSaver } = await import("file-saver")
168
+ FileSaver.saveAs(data, filename, options)
169
+ return Promise.resolve(data)
170
+ } catch (error) {
171
+ return Promise.reject("download fail: server error!")
172
+ }
173
+ }
@@ -0,0 +1,10 @@
1
+ export * from "./cookie"
2
+ export * from "./day"
3
+ export * from "./file"
4
+ export * from "./is"
5
+ export * from "./letter"
6
+ export * from "./number"
7
+ export * from "./openExe"
8
+ export * from "./storage"
9
+ export * from "./validate"
10
+ export * from "./ws"
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Object.prototype.toString 别名
3
+ */
4
+ export const objectToString = Object.prototype.toString
5
+
6
+ /**
7
+ * 获取类型
8
+ * @param value
9
+ * @returns
10
+ */
11
+ export const toTypeString = (value: any) => objectToString.call(value)
12
+
13
+ /**
14
+ * 拿到类型字符串
15
+ * @param value
16
+ * @returns
17
+ */
18
+ export const toRawType = (value: any) => {
19
+ return toTypeString(value).slice(8, -1)
20
+ }
21
+
22
+ /**
23
+ * 判断是否是数组
24
+ */
25
+ export const isArray = Array.isArray
26
+
27
+ /**
28
+ * 判断是否是Map
29
+ * @param val
30
+ * @returns
31
+ */
32
+ export const isMap = (val: any): val is Map<any, any> => toTypeString(val) === "[object Map]"
33
+
34
+ /**
35
+ * 判断是否是Set
36
+ * @param val
37
+ * @returns
38
+ */
39
+ export const isSet = (val: any): val is Set<any> => toTypeString(val) === "[object Set]"
40
+
41
+ /**
42
+ * 判断是否是Date
43
+ * @param val
44
+ * @returns
45
+ */
46
+ export const isDate = (val: any): val is Date => toTypeString(val) === "[object Date]"
47
+
48
+ /**
49
+ * 判断是否是Reg
50
+ * @param val
51
+ * @returns
52
+ */
53
+ export const isRegExp = (val: any): val is RegExp => toTypeString(val) === "[object RegExp]"
54
+
55
+ /**
56
+ * 判断是否是函数
57
+ * @param val
58
+ * @returns
59
+ */
60
+ // eslint-disable-next-line @typescript-eslint/ban-types
61
+ export const isFunction = (val: any): val is Function => typeof val === "function"
62
+
63
+ /**
64
+ * 判断是否是字符串
65
+ * @param val
66
+ * @returns
67
+ */
68
+ export const isString = (val: any): val is string => typeof val === "string"
69
+
70
+ /**
71
+ * 判断是否是Symbol
72
+ * @param val
73
+ * @returns
74
+ */
75
+ export const isSymbol = (val: any): val is symbol => typeof val === "symbol"
76
+
77
+ /**
78
+ * 判断是否是boolean
79
+ * @param val
80
+ * @returns
81
+ */
82
+ export const isBoolean = (val: any): val is boolean => typeof val === "boolean"
83
+
84
+ /**
85
+ * 判断是否是object
86
+ * @param val
87
+ * @returns
88
+ */
89
+ export const isObject = (val: any): val is Record<keyof any, any> =>
90
+ val !== null && typeof val === "object"
91
+
92
+ /**
93
+ * 判断是否是Promise
94
+ * @param val
95
+ * @returns
96
+ */
97
+ export const isPromise = <T = any>(val: any): val is Promise<T> => {
98
+ return isObject(val) && isFunction(val.then) && isFunction(val.catch)
99
+ }
100
+
101
+ /**
102
+ * 判断是否是 纯对象 object
103
+ * @param val
104
+ * @returns
105
+ */
106
+ export const isPlainObject = (val: any): val is Record<keyof any, any> =>
107
+ toTypeString(val) === "[object Object]"
108
+
109
+ /**
110
+ * 是否是空对象
111
+ * @param val
112
+ * @returns
113
+ */
114
+ export const isEmptyObject = (val: any): val is Record<keyof any, any> =>
115
+ isPlainObject(val) && Object.keys(val).length === 0
116
+
117
+ /**
118
+ * 是否是链接
119
+ * @param url
120
+ * @returns
121
+ */
122
+ export function isUrl(url: string): url is string {
123
+ const regex = new RegExp(
124
+ "^(https?:\\/\\/)?" + // protocol
125
+ "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name
126
+ "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
127
+ "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
128
+ "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
129
+ "(\\#[-a-z\\d_]*)?$",
130
+ "i"
131
+ )
132
+ return regex.test(url)
133
+ }
134
+
135
+ /**
136
+ * 是否是SVGElement
137
+ * @param tag
138
+ * @returns
139
+ */
140
+ export const isSVGElement = (tag: any): tag is SVGElement =>
141
+ typeof SVGElement !== "undefined" && tag instanceof SVGElement
142
+
143
+ /**
144
+ * 是否是vue 组件
145
+ * @param val
146
+ * @returns
147
+ */
148
+ export const isComponent = (val: any) =>
149
+ isPlainObject(val) && (isFunction(val.render) || isFunction(val.setup))
150
+
151
+ /**
152
+ * 是否是ios
153
+ * @returns {boolean}
154
+ */
155
+ export function isIOS(): boolean {
156
+ const isIphone = navigator.userAgent.includes("iPhone")
157
+ const isIpad = navigator.userAgent.includes("iPad")
158
+ return isIphone || isIpad
159
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @desc 生成大写字母
3
+ * @returns
4
+ */
5
+ export const getBigLetter = () => {
6
+ return Array.from({ length: 26 }).map((_, index) => String.fromCharCode(65 + index))
7
+ }
8
+
9
+ /**
10
+ * @desc 生成小写字母
11
+ * @returns
12
+ */
13
+ export const getSmallLetter = () => {
14
+ return Array.from({ length: 26 }).map((_, index) => String.fromCharCode(97 + index))
15
+ }
@@ -0,0 +1,37 @@
1
+ import numeral from "numeral"
2
+ import accounting from "accounting"
3
+
4
+ /**
5
+ * 格式化金钱 $12,345,678.00
6
+ * @param val
7
+ * @param format 默认 '¥'
8
+ * @returns
9
+ */
10
+ export function formatMoney(val: string | number, format = "¥"): string {
11
+ return accounting.formatMoney(val, format)
12
+ }
13
+
14
+ /**
15
+ * 格式化数字
16
+ * @param number
17
+ * @param format 默认格式 '0.00'
18
+ * @returns
19
+ */
20
+ export function formatNumber(number: number | string, format = "0.00"): string {
21
+ return numeral(number).format(format)
22
+ }
23
+
24
+ /**
25
+ * 格式化数字
26
+ * @param value
27
+ * @param decimal 默认2位小数
28
+ * @returns x.xx
29
+ */
30
+ export function formatNumberFixed(value: string, decimal = 2): string {
31
+ let temp = String(value)
32
+ if (String(value).includes(".")) {
33
+ temp = value.slice(0, value.indexOf(".") + decimal + 1)
34
+ }
35
+ const format = "0." + "0".repeat(decimal)
36
+ return formatNumber(temp, format)
37
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @description 打开电脑本地软件
3
+ * @param protocol 本地软件协议, 如 vscode 的协议 `vscode://`
4
+ * @param event 点击按钮事件, `el-button` 或者原生 `button`
5
+ * @param timeout 默认`1000`ms,没响应则认为打开失败
6
+ */
7
+ export const openExe = (protocol: string, event: Event, timeout = 1000): Promise<FocusEvent> => {
8
+ event.stopPropagation()
9
+ event.preventDefault()
10
+ window.location.href = protocol
11
+ const target = event.target as EventTarget & {
12
+ localName: string
13
+ parentElement: HTMLButtonElement
14
+ onblur: (e: FocusEvent) => void
15
+ }
16
+ return new Promise((resolve, reject) => {
17
+ if (target) {
18
+ const element =
19
+ target.localName === "button"
20
+ ? target
21
+ : target.localName === "span"
22
+ ? target.parentElement
23
+ : document
24
+ // 防止重复注册
25
+ if (element.onblur === null) {
26
+ // 1秒没有响应 则认为软件打开失败
27
+ const timer = setTimeout(() => {
28
+ element.onblur = null
29
+ reject("error")
30
+ }, timeout)
31
+
32
+ element.onblur = (focusEvent: FocusEvent) => {
33
+ // 判断焦点失去是否是按钮 防止点击界面其他地方导致失去焦点
34
+ if (element === document.activeElement) {
35
+ clearTimeout(timer)
36
+ element.onblur = null
37
+ resolve(focusEvent)
38
+ }
39
+ }
40
+ }
41
+ } else {
42
+ reject("error")
43
+ }
44
+ })
45
+ }
@@ -0,0 +1,77 @@
1
+ import storage from "good-storage"
2
+ import CryptoJS from "crypto-js"
3
+
4
+ /**
5
+ * AES加密
6
+ * @param key 加密的key
7
+ * @param data 需要加密的字符串
8
+ * @returns encrypted 加密的字符串
9
+ */
10
+ export function encrypt(
11
+ key: string | CryptoJS.lib.WordArray,
12
+ data: string | CryptoJS.lib.WordArray
13
+ ): string {
14
+ const encrypted = CryptoJS.AES.encrypt(data, key).toString()
15
+ return encrypted
16
+ }
17
+
18
+ /**
19
+ * AES 解密
20
+ * @param key 解密的key 需要和加密的key 一致
21
+ * @param encrypted 加密后字符串
22
+ * @returns data 解密后的字符串
23
+ */
24
+ export function decrypt(
25
+ key: string | CryptoJS.lib.WordArray,
26
+ encrypted: string | CryptoJS.lib.CipherParams
27
+ ): string {
28
+ const decrypted = CryptoJS.AES.decrypt(encrypted, key)
29
+ const data = decrypted.toString(CryptoJS.enc.Utf8)
30
+ return data
31
+ }
32
+
33
+ /**
34
+ * 获取storage
35
+ * @returns storage
36
+ */
37
+ export function getStorage(key: string): string {
38
+ return storage.get(key)
39
+ }
40
+ /**
41
+ * 设置storage
42
+ * @returns storage
43
+ */
44
+ export function setStorage(key: string, data: any): string {
45
+ return storage.set(key, data)
46
+ }
47
+
48
+ /**
49
+ * 移除storage
50
+ */
51
+ export function removeStorage(key: string): void {
52
+ storage.remove(key)
53
+ }
54
+
55
+ /**
56
+ * 获取token 带AES解密
57
+ * @returns token
58
+ */
59
+ export function getToken(key: string): string {
60
+ const data = storage.get(key)
61
+ const res = data ? decrypt(key, data) : ""
62
+ return res
63
+ }
64
+ /**
65
+ * 设置token 带AES加密
66
+ * @returns token
67
+ */
68
+ export function setToken(key: string, token: string): string {
69
+ const data = encrypt(key, token)
70
+ return storage.set(key, data)
71
+ }
72
+ /**
73
+ * 移除token
74
+ */
75
+ export function removeToken(key: string): void {
76
+ storage.remove(key)
77
+ }