create-bubbles 0.1.2 → 0.1.4

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 (116) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/template-react-rsbuild-biome/biome.json +19 -4
  4. package/template-vue-rolldown-oxc/.gitlab-ci.yml +10 -2
  5. package/template-vue-rolldown-oxc/.oxlintrc.json +1 -14
  6. package/template-vue-rolldown-oxc/.vscode/settings.json +11 -0
  7. package/template-vue-rolldown-oxc/README.md +2 -30
  8. package/template-vue-rolldown-oxc/package.json +18 -16
  9. package/template-vue-rolldown-oxc/src/App.vue +12 -2
  10. package/template-vue-rolldown-oxc/src/utils/request/index.ts +1 -3
  11. package/template-vue-rolldown-oxc/src/views/home/index.vue +3 -2
  12. package/template-vue-rolldown-oxc/tsconfig.json +34 -2
  13. package/template-vue-rolldown-oxc/uno.config.ts +2 -5
  14. package/template-vue-rolldown-oxc/vite.config.ts +4 -3
  15. package/template-vue-rsbuild-biome/biome.json +33 -5
  16. package/template-vue-vite-biome/.env +4 -0
  17. package/template-vue-vite-biome/.env.development +1 -0
  18. package/template-vue-vite-biome/.env.production +1 -0
  19. package/template-vue-vite-biome/.gitlab-ci.yml +84 -0
  20. package/template-vue-vite-biome/.vscode/settings.json +10 -0
  21. package/template-vue-vite-biome/README.md +3 -0
  22. package/template-vue-vite-biome/biome.json +109 -0
  23. package/template-vue-vite-biome/commitlint.config.js +1 -0
  24. package/template-vue-vite-biome/index.html +13 -0
  25. package/template-vue-vite-biome/lefthook.yml +11 -0
  26. package/template-vue-vite-biome/package.json +50 -0
  27. package/template-vue-vite-biome/public/vite.svg +1 -0
  28. package/template-vue-vite-biome/src/App.vue +19 -0
  29. package/template-vue-vite-biome/src/assets/icon/vue.svg +1 -0
  30. package/template-vue-vite-biome/src/components/Icon/svg-icon.vue +29 -0
  31. package/template-vue-vite-biome/src/layout/default/index.vue +3 -0
  32. package/template-vue-vite-biome/src/main.ts +15 -0
  33. package/template-vue-vite-biome/src/router/guard/index.ts +7 -0
  34. package/template-vue-vite-biome/src/router/guard/permissionGuard.ts +13 -0
  35. package/template-vue-vite-biome/src/router/index.ts +17 -0
  36. package/template-vue-vite-biome/src/router/modules/index.ts +31 -0
  37. package/template-vue-vite-biome/src/store/index.ts +10 -0
  38. package/template-vue-vite-biome/src/store/modules/user.ts +17 -0
  39. package/template-vue-vite-biome/src/styles/element-plus-variables.css +4 -0
  40. package/template-vue-vite-biome/src/styles/font.scss +0 -0
  41. package/template-vue-vite-biome/src/styles/index.scss +31 -0
  42. package/template-vue-vite-biome/src/styles/variables.scss +3 -0
  43. package/template-vue-vite-biome/src/types/vite-env.d.ts +13 -0
  44. package/template-vue-vite-biome/src/utils/env.ts +10 -0
  45. package/template-vue-vite-biome/src/utils/request/core/index.ts +166 -0
  46. package/template-vue-vite-biome/src/utils/request/core/utils.ts +38 -0
  47. package/template-vue-vite-biome/src/utils/request/index.ts +39 -0
  48. package/template-vue-vite-biome/src/views/home/index.vue +16 -0
  49. package/template-vue-vite-biome/src/views/login/index.vue +11 -0
  50. package/template-vue-vite-biome/src/views/model/index.vue +7 -0
  51. package/{template-vue-rolldown-oxc/tsconfig.app.json → template-vue-vite-biome/tsconfig.json} +15 -4
  52. package/template-vue-vite-biome/uno.config.ts +10 -0
  53. package/template-vue-vite-biome/vite.config.ts +51 -0
  54. package/template-vue-vite-eslint/.env +6 -0
  55. package/template-vue-vite-eslint/.env.development +2 -0
  56. package/template-vue-vite-eslint/.env.production +1 -0
  57. package/template-vue-vite-eslint/.vscode/settings.json +62 -0
  58. package/template-vue-vite-eslint/README.md +3 -0
  59. package/template-vue-vite-eslint/commitlint.config.js +1 -0
  60. package/template-vue-vite-eslint/eslint.config.js +69 -0
  61. package/template-vue-vite-eslint/index.html +13 -0
  62. package/template-vue-vite-eslint/lefthook.yml +11 -0
  63. package/template-vue-vite-eslint/package.json +62 -0
  64. package/template-vue-vite-eslint/public/vite.svg +1 -0
  65. package/template-vue-vite-eslint/src/App.vue +19 -0
  66. package/template-vue-vite-eslint/src/api/index.ts +12 -0
  67. package/template-vue-vite-eslint/src/assets/icon/computer-data.svg +3 -0
  68. package/template-vue-vite-eslint/src/assets/icon/cpu.svg +3 -0
  69. package/template-vue-vite-eslint/src/assets/icon/data-search.svg +3 -0
  70. package/template-vue-vite-eslint/src/assets/icon/home.svg +3 -0
  71. package/template-vue-vite-eslint/src/assets/icon/knowledge-graph.svg +3 -0
  72. package/template-vue-vite-eslint/src/assets/icon/robot.svg +3 -0
  73. package/template-vue-vite-eslint/src/assets/icon/vue.svg +1 -0
  74. package/template-vue-vite-eslint/src/assets/image/.gitkeep +0 -0
  75. package/template-vue-vite-eslint/src/components/Icon/svg-icon.vue +29 -0
  76. package/template-vue-vite-eslint/src/hooks/chart/lib.ts +57 -0
  77. package/template-vue-vite-eslint/src/hooks/chart/useEcharts.ts +65 -0
  78. package/template-vue-vite-eslint/src/layout/default/header/index.vue +12 -0
  79. package/template-vue-vite-eslint/src/layout/default/index.vue +55 -0
  80. package/template-vue-vite-eslint/src/main.ts +17 -0
  81. package/template-vue-vite-eslint/src/router/guard/index.ts +7 -0
  82. package/template-vue-vite-eslint/src/router/guard/permissionGuard.ts +13 -0
  83. package/template-vue-vite-eslint/src/router/index.ts +18 -0
  84. package/template-vue-vite-eslint/src/router/interface.ts +9 -0
  85. package/template-vue-vite-eslint/src/router/modules/example.ts +21 -0
  86. package/template-vue-vite-eslint/src/router/modules/index.ts +79 -0
  87. package/template-vue-vite-eslint/src/store/index.ts +11 -0
  88. package/template-vue-vite-eslint/src/store/modules/user.ts +20 -0
  89. package/template-vue-vite-eslint/src/styles/element-plus-variables.css +3 -0
  90. package/template-vue-vite-eslint/src/styles/font.scss +0 -0
  91. package/template-vue-vite-eslint/src/styles/index.scss +32 -0
  92. package/template-vue-vite-eslint/src/styles/plus-pro-components-variables.css +3 -0
  93. package/template-vue-vite-eslint/src/styles/variables.scss +3 -0
  94. package/template-vue-vite-eslint/src/types/index.d.ts +1 -0
  95. package/template-vue-vite-eslint/src/types/vite-env.d.ts +15 -0
  96. package/template-vue-vite-eslint/src/utils/env.ts +11 -0
  97. package/template-vue-vite-eslint/src/utils/request/core/index.ts +186 -0
  98. package/template-vue-vite-eslint/src/utils/request/core/utils.ts +41 -0
  99. package/template-vue-vite-eslint/src/utils/request/index.ts +42 -0
  100. package/template-vue-vite-eslint/src/views/data-statistics/config.ts +11 -0
  101. package/template-vue-vite-eslint/src/views/data-statistics/index.vue +23 -0
  102. package/template-vue-vite-eslint/src/views/data-statistics/right/abc.vue +11 -0
  103. package/template-vue-vite-eslint/src/views/example/echart/config.ts +1794 -0
  104. package/template-vue-vite-eslint/src/views/example/echart/index.vue +22 -0
  105. package/template-vue-vite-eslint/src/views/example/h-full.vue +24 -0
  106. package/template-vue-vite-eslint/src/views/example/tree-chart.vue +94 -0
  107. package/template-vue-vite-eslint/src/views/home/index.vue +25 -0
  108. package/template-vue-vite-eslint/src/views/knowledge-graph/index.vue +11 -0
  109. package/template-vue-vite-eslint/src/views/login/index.vue +9 -0
  110. package/template-vue-vite-eslint/src/views/model/index.vue +7 -0
  111. package/{template-vue-rolldown-oxc/tsconfig.node.json → template-vue-vite-eslint/tsconfig.json} +20 -9
  112. package/template-vue-vite-eslint/uno.config.ts +21 -0
  113. package/template-vue-vite-eslint/vite.config.ts +62 -0
  114. package/template-vue-rolldown-oxc/components.d.ts +0 -18
  115. package/template-vue-rolldown-oxc/src/types/auto-import.d.ts +0 -78
  116. package/template-vue-rolldown-oxc/src/types/components.d.ts +0 -16
@@ -0,0 +1,109 @@
1
+ {
2
+ "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
3
+ "files": {
4
+ "ignoreUnknown": true,
5
+ "includes": ["**", "!public/**/*", "!node_modules/**/*", "!dist/**/*"]
6
+ },
7
+ "formatter": {
8
+ "enabled": true,
9
+ "indentStyle": "space",
10
+ "lineWidth": 100,
11
+ "indentWidth": 2
12
+ },
13
+ "linter": {
14
+ "rules": {
15
+ "style": {
16
+ "useImportType": "off",
17
+ "useNumberNamespace": "off",
18
+ "useNodejsImportProtocol": "off",
19
+ "noNonNullAssertion": "off",
20
+ "noUnusedTemplateLiteral": "off",
21
+ "useConst": {
22
+ "level": "warn",
23
+ "fix": "unsafe"
24
+ }
25
+ },
26
+ "complexity": {
27
+ "noUselessTypeConstraint": "off",
28
+ "noForEach": "off",
29
+ "useDateNow": "off"
30
+ },
31
+ "correctness": {
32
+ "useExhaustiveDependencies": "off",
33
+ "useHookAtTopLevel": "off",
34
+ "noUnusedFunctionParameters": "off",
35
+ "noUnusedVariables": "off",
36
+ "useUniqueElementIds": "off",
37
+ "useParseIntRadix": "off"
38
+ },
39
+ "security": {
40
+ "noDangerouslySetInnerHtml": "off"
41
+ },
42
+ "suspicious": {
43
+ "noGlobalIsNan": "off",
44
+ "noGlobalIsFinite": "off",
45
+ "noExplicitAny": "off",
46
+ "noArrayIndexKey": "off",
47
+ "noConfusingVoidType": "off",
48
+ "noThenProperty": "off",
49
+ "noTemplateCurlyInString": "off"
50
+ },
51
+ "performance": {
52
+ "noDelete": "off",
53
+ "noAccumulatingSpread": "off",
54
+ "noDynamicNamespaceImportAccess": "off"
55
+ },
56
+ "a11y": {
57
+ "noAriaHiddenOnFocusable": "off",
58
+ "noLabelWithoutControl": "off",
59
+ "useFocusableInteractive": "off",
60
+ "useKeyWithClickEvents": "off",
61
+ "useSemanticElements": "off",
62
+ "noStaticElementInteractions": "off",
63
+ "useAriaPropsSupportedByRole": "off",
64
+ "useAriaPropsForRole": "off",
65
+ "useValidAnchor": "off",
66
+ "useMediaCaption": "off"
67
+ },
68
+ "nursery": {
69
+ "useSortedClasses": {
70
+ "level": "warn",
71
+ "fix": "safe"
72
+ }
73
+ }
74
+ }
75
+ },
76
+ "css": {
77
+ "formatter": {
78
+ "quoteStyle": "single"
79
+ }
80
+ },
81
+ "javascript": {
82
+ "jsxRuntime": "reactClassic",
83
+ "formatter": {
84
+ "quoteStyle": "single",
85
+ "semicolons": "asNeeded"
86
+ }
87
+ },
88
+ "assist": {
89
+ "enabled": true,
90
+ "actions": {
91
+ "source": {
92
+ "organizeImports": {
93
+ "level": "on",
94
+ "options": {
95
+ "identifierOrder": "natural",
96
+ "groups": [
97
+ [":NODE:", ":BUN:"],
98
+ ":BLANK_LINE:",
99
+ ["react", "react-dom/**", "react-dom", "react-router", "react-router-dom"],
100
+ ["vue", "vue-router"],
101
+ ":BLANK_LINE:",
102
+ ["@/**", "**"]
103
+ ]
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
@@ -0,0 +1 @@
1
+ export default { extends: ['@commitlint/config-conventional'] }
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Vite + Vue + TS</title>
8
+ </head>
9
+ <body>
10
+ <div id="app"></div>
11
+ <script type="module" src="/src/main.ts"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,11 @@
1
+ pre-commit:
2
+ commands:
3
+ check:
4
+ glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc,vue}"
5
+ run: npx @biomejs/biome check --write --no-errors-on-unmatched --files-ignore-unknown=true --colors=off --diagnostic-level=warn {staged_files}
6
+ stage_fixed: true
7
+
8
+ commit-msg:
9
+ commands:
10
+ "lint commit message":
11
+ run: npx commitlint --edit {1}
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "template-vue-rolldown-oxlint",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vue-tsc -b && vite build",
9
+ "preview": "vite preview",
10
+ "format": "biome format --write",
11
+ "check": "biome check --write"
12
+ },
13
+ "dependencies": {
14
+ "@alova/adapter-axios": "^2.0.16",
15
+ "@element-plus/icons-vue": "^2.3.2",
16
+ "@vueuse/core": "^13.9.0",
17
+ "alova": "^3.3.4",
18
+ "axios": "^1.12.2",
19
+ "dayjs": "^1.11.18",
20
+ "echarts": "^6.0.0",
21
+ "element-plus": "^2.11.5",
22
+ "nprogress": "^0.2.0",
23
+ "pinia": "^3.0.3",
24
+ "pinia-plugin-persistedstate": "^4.5.0",
25
+ "plus-pro-components": "^0.1.30",
26
+ "radashi": "^12.7.0",
27
+ "vue": "^3.5.22",
28
+ "vue-router": "^4.6.3"
29
+ },
30
+ "devDependencies": {
31
+ "@biomejs/biome": "^2.2.6",
32
+ "@commitlint/cli": "^20.1.0",
33
+ "@commitlint/config-conventional": "^20.0.0",
34
+ "@plus-pro-components/resolver": "^0.0.3",
35
+ "@types/nprogress": "^0.2.3",
36
+ "@vitejs/plugin-vue": "^6.0.1",
37
+ "@vue/tsconfig": "^0.8.1",
38
+ "fast-glob": "^3.3.3",
39
+ "lefthook": "^1.13.6",
40
+ "sass": "^1.93.2",
41
+ "typescript": "~5.9.3",
42
+ "unocss": "^66.5.4",
43
+ "unplugin-auto-import": "^20.2.0",
44
+ "unplugin-vue-components": "^30.0.0",
45
+ "vite": "npm:rolldown-vite@7.1.17",
46
+ "vite-plugin-inspect": "^11.3.3",
47
+ "vite-plugin-svg-icons": "^2.0.1",
48
+ "vue-tsc": "^3.1.1"
49
+ }
50
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import zhCn from 'element-plus/es/locale/lang/zh-cn'
3
+ import plusZhCn from 'plus-pro-components/es/locale/lang/zh-cn'
4
+
5
+ const locale = {
6
+ ...zhCn,
7
+ ...plusZhCn,
8
+ }
9
+ </script>
10
+
11
+ <template>
12
+ <el-config-provider
13
+ :locale="locale"
14
+ >
15
+ <RouterView />
16
+ </el-config-provider>
17
+ </template>
18
+
19
+ <style scoped></style>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="currentColor" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="currentColor" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <svg class="svg-icon" aria-hidden="true" v-bind="attrs">
3
+ <use :href="`#icon-${name}`" />
4
+ </svg>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ const attrs = useAttrs()
9
+ defineProps<{
10
+ name: string
11
+ }>()
12
+ </script>
13
+
14
+ <style lang="scss" scoped>
15
+ .svg-icon {
16
+ display: flex;
17
+ justify-content: center;
18
+ align-items: center;
19
+ width: 1em;
20
+ height: 1em;
21
+ fill: currentColor;
22
+ overflow: hidden;
23
+ }
24
+
25
+ .svg-external-icon {
26
+ background-color: currentColor;
27
+ mask-size: cover !important;
28
+ }
29
+ </style>
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <router-view />
3
+ </template>
@@ -0,0 +1,15 @@
1
+ import '@/styles/element-plus-variables.css'
2
+ import '@/styles/index.scss'
3
+ import 'virtual:svg-icons-register'
4
+ import 'virtual:uno.css'
5
+
6
+ import { createApp } from 'vue'
7
+
8
+ import App from './App.vue'
9
+ import { setupRouter } from './router'
10
+ import { setupStore } from './store'
11
+
12
+ const app = createApp(App)
13
+ setupRouter(app)
14
+ setupStore(app)
15
+ app.mount('#app')
@@ -0,0 +1,7 @@
1
+ import type { Router } from 'vue-router'
2
+
3
+ import { createPermissionGuard } from './permissionGuard'
4
+
5
+ export const setupGuard = (router: Router) => {
6
+ createPermissionGuard(router)
7
+ }
@@ -0,0 +1,13 @@
1
+ import type { Router } from 'vue-router'
2
+
3
+ import NProgress from 'nprogress'
4
+
5
+ export const createPermissionGuard = (router: Router) => {
6
+ router.beforeEach((to, from, next) => {
7
+ NProgress.start()
8
+ next()
9
+ })
10
+ router.afterEach((to, from) => {
11
+ NProgress.done()
12
+ })
13
+ }
@@ -0,0 +1,17 @@
1
+ import type { App } from 'vue'
2
+ import { createRouter, createWebHistory } from 'vue-router'
3
+
4
+ import { setupGuard } from './guard'
5
+ import { routes } from './modules'
6
+
7
+ export const router = createRouter({
8
+ history: createWebHistory(import.meta.env.PUBLIC_PATH),
9
+ routes: routes,
10
+ strict: true,
11
+ scrollBehavior: () => ({ left: 0, top: 0 }),
12
+ })
13
+
14
+ export const setupRouter = (app: App) => {
15
+ setupGuard(router)
16
+ app.use(router)
17
+ }
@@ -0,0 +1,31 @@
1
+ import type { RouteRecordRaw } from 'vue-router'
2
+
3
+ /**
4
+ * IsMaskAll 代表 是不是要和模型交互 为true 全部遮罩
5
+ */
6
+
7
+ export const routes: RouteRecordRaw[] = [
8
+ {
9
+ path: '/',
10
+ name: 'layout',
11
+ component: () => import('@/layout/default/index.vue'),
12
+ children: [
13
+ {
14
+ path: '/',
15
+ redirect: '/home',
16
+ },
17
+ {
18
+ path: '/home',
19
+ name: 'Home',
20
+ meta: { title: '研发A区数字孪生可视化大屏' },
21
+ component: () => import('@/views/home/index.vue'),
22
+ },
23
+ ],
24
+ },
25
+ {
26
+ path: '/login',
27
+ name: 'login',
28
+ meta: { title: '登录' },
29
+ component: () => import('@/views/login/index.vue'),
30
+ },
31
+ ]
@@ -0,0 +1,10 @@
1
+ import type { App } from 'vue'
2
+ import { createPinia } from 'pinia'
3
+ import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
4
+
5
+ export const store = createPinia()
6
+ store.use(piniaPluginPersistedstate)
7
+
8
+ export const setupStore = (app: App) => {
9
+ app.use(store)
10
+ }
@@ -0,0 +1,17 @@
1
+ import { defineStore } from "pinia";
2
+ import { store } from "..";
3
+
4
+ export const useUserStore = defineStore(
5
+ 'user',{
6
+ state: () => {
7
+ return {
8
+ name: 'admin',
9
+ token: 'admin',
10
+ avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'
11
+ }
12
+ },
13
+ })
14
+
15
+ export function useUserStoreWithOut() {
16
+ return useUserStore(store);
17
+ }
@@ -0,0 +1,4 @@
1
+ :root:has(#app) {
2
+ --el-color-primary: #284471;
3
+ --el-color-primary-light-3: rgb(40, 68, 113, 0.8);
4
+ }
File without changes
@@ -0,0 +1,31 @@
1
+ @use './font.scss';
2
+ @use './variables.scss';
3
+ @use './element-plus-variables.css';
4
+ @unocss;
5
+
6
+ html,
7
+ body,
8
+ #root {
9
+ width: 100%;
10
+ height: 100%;
11
+ font-family: 'SourceHanSansCN';
12
+ }
13
+
14
+ *,
15
+ *::before,
16
+ *::after {
17
+ margin: 0;
18
+ padding: 0;
19
+ box-sizing: border-box;
20
+ }
21
+
22
+ //弹窗的标题样式
23
+ .dialog-title {
24
+ border-left: 3px solid #22b5ffff;
25
+ padding-left: 10px;
26
+ height: 16px;
27
+ color: #ffffffb8;
28
+ font: 700;
29
+ font-size: 16px;
30
+ line-height: 16px;
31
+ }
@@ -0,0 +1,3 @@
1
+ :root {
2
+ --header-height: 80px;
3
+ }
@@ -0,0 +1,13 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module '*.vue' {
4
+ import type { DefineComponent } from 'vue'
5
+ const component: DefineComponent<{}, {}, any>
6
+ export default component
7
+ }
8
+
9
+ // vite-plugin-svg-icons 类型声明
10
+ declare module 'virtual:svg-icons-register' {
11
+ const register: () => void
12
+ export default register
13
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 通过一个文件导出所有的环境变量这样方便统一修改
3
+ * @returns
4
+ */
5
+ export const envVariables = {
6
+ PUBLIC_PORT: import.meta.env.PUBLIC_PORT,
7
+ PUBLIC_PATH: import.meta.env.PUBLIC_PATH,
8
+ PUBLIC_APP_NAME: import.meta.env.PUBLIC_APP_NAME,
9
+ PUBLIC_API_AFFIX: import.meta.env.PUBLIC_API_AFFIX,
10
+ }
@@ -0,0 +1,166 @@
1
+ import { type AlovaGenerics, type AlovaOptions, createAlova } from 'alova'
2
+ import { deepMergeObject, isReadableStream } from './utils'
3
+ import adapterFetch from 'alova/fetch'
4
+
5
+ interface statusMap {
6
+ success?: number
7
+ unAuthorized?: number
8
+ }
9
+
10
+ interface codeMap {
11
+ success?: number[]
12
+ unAuthorized?: number[]
13
+ }
14
+
15
+ export interface baseRequestOption<AG extends AlovaGenerics> {
16
+ baseUrl?: string
17
+ timeout?: number
18
+ commonHeaders?: Record<string, string | (() => string)>
19
+ statusMap?: statusMap
20
+ codeMap?: codeMap
21
+ responseDataKey?: string
22
+ responseMessageKey?: string
23
+ isTransformResponse?: boolean
24
+ isShowSuccessMessage?: boolean
25
+ successDefaultMessage?: string
26
+ isShowErrorMessage?: boolean
27
+ errorDefaultMessage?: string
28
+ statesHook?: AlovaOptions<AG>['statesHook']
29
+ successMessageFunc?: (message: string) => void
30
+ errorMessageFunc?: (message: string) => void
31
+ unAuthorizedResponseFunc?: () => void
32
+ requestAdapter?: AlovaOptions<AG>['requestAdapter']
33
+ }
34
+
35
+ export interface CustomConfig {
36
+ isTransformResponse?: boolean
37
+ isShowSuccessMessage?: boolean
38
+ isShowErrorMessage?: boolean
39
+ }
40
+
41
+ type requestOption = baseRequestOption<AlovaGenerics> & CustomConfig
42
+
43
+ export const createInstance = (option: requestOption) => {
44
+ const defaultOption: requestOption = {
45
+ baseUrl: '/',
46
+ timeout: 0,
47
+ statusMap: {
48
+ success: 200,
49
+ unAuthorized: 401,
50
+ },
51
+ codeMap: {
52
+ success: [200],
53
+ unAuthorized: [401],
54
+ },
55
+ responseDataKey: 'data',
56
+ responseMessageKey: 'message',
57
+ isTransformResponse: true,
58
+ isShowSuccessMessage: false,
59
+ successDefaultMessage: '操作成功',
60
+ isShowErrorMessage: true,
61
+ errorDefaultMessage: '服务异常',
62
+ requestAdapter: adapterFetch(),
63
+ }
64
+
65
+ const mergeOption: baseRequestOption<AlovaGenerics> & CustomConfig = deepMergeObject(
66
+ defaultOption,
67
+ option,
68
+ )
69
+
70
+ const instance = createAlova({
71
+ baseURL: mergeOption.baseUrl,
72
+ timeout: mergeOption.timeout,
73
+ statesHook: mergeOption?.statesHook,
74
+ requestAdapter: mergeOption.requestAdapter as AlovaOptions<AlovaGenerics>['requestAdapter'],
75
+ beforeRequest: async (method) => {
76
+ for (const [key, value] of Object.entries(option?.commonHeaders ?? {})) {
77
+ method.config.headers[key] = typeof value === 'function' ? value() : value
78
+ }
79
+ },
80
+ responded: {
81
+ onSuccess: async (response) => {
82
+ if (!mergeOption?.isTransformResponse) return response
83
+ const { status } = response
84
+
85
+ // 判断响应类型:如果使用 adapterFetch,response.data 是可读流,则调用 json();否则直接使用 response.data
86
+ const data =
87
+ response?.body && isReadableStream(response.body)
88
+ ? await response.json() // adapterFetch 的响应,使用 json() 解析可读流
89
+ : response.data // 其他适配器的响应
90
+ // 不成功的情况
91
+ if (status !== mergeOption.statusMap?.success) {
92
+ // 如果后端使用status 字段来表示未授权,则返回401
93
+ if (mergeOption?.statusMap?.unAuthorized === status) {
94
+ mergeOption?.unAuthorizedResponseFunc?.()
95
+ }
96
+ return Promise.reject(response)
97
+ }
98
+
99
+ const {
100
+ responseDataKey,
101
+ codeMap,
102
+ isShowSuccessMessage,
103
+ responseMessageKey,
104
+ isShowErrorMessage,
105
+ } = mergeOption
106
+ const {
107
+ code,
108
+ [responseDataKey as string]: responseData,
109
+ [responseMessageKey as string]: responseMessage,
110
+ } = data
111
+ if (!codeMap?.success?.includes(+code)) {
112
+ // code unAuthorized 处理
113
+ if (codeMap?.unAuthorized?.includes(+code)) {
114
+ mergeOption?.unAuthorizedResponseFunc?.()
115
+ return Promise.reject(response)
116
+ }
117
+ // 其他错误直接打印msg
118
+
119
+ const errorMessage = data[responseMessageKey as string] ?? mergeOption.errorDefaultMessage
120
+ if (isShowErrorMessage) mergeOption?.errorMessageFunc?.(errorMessage)
121
+ return Promise.reject(response)
122
+ }
123
+ if (isShowSuccessMessage)
124
+ mergeOption?.successMessageFunc?.(responseMessage ?? mergeOption.successDefaultMessage)
125
+ return responseData
126
+ },
127
+ onError: (error) => {
128
+ if (mergeOption?.isShowErrorMessage)
129
+ mergeOption.errorMessageFunc?.(
130
+ error.response?.data?.message ?? mergeOption?.errorDefaultMessage,
131
+ )
132
+ },
133
+ // onComplete: (_method) => {},
134
+ },
135
+ })
136
+
137
+ return instance
138
+ }
139
+
140
+ // 🚀 创建双重调用实例的工厂函数
141
+ export const createDualCallInstance = (baseConfig: baseRequestOption<AlovaGenerics>) => {
142
+ // 创建默认实例
143
+ const defaultInstance = createInstance(baseConfig)
144
+
145
+ // 双重调用函数
146
+ const dualInstance = (option?: CustomConfig) => {
147
+ if (option) {
148
+ // 合并配置并创建新实例
149
+ const mergedConfig = { ...baseConfig, ...option }
150
+ return createInstance(mergedConfig)
151
+ }
152
+ return defaultInstance
153
+ }
154
+
155
+ // 🎯 直接绑定 HTTP 方法,无需复杂类型注释
156
+ dualInstance.Get = defaultInstance.Get.bind(defaultInstance)
157
+ dualInstance.Post = defaultInstance.Post.bind(defaultInstance)
158
+ dualInstance.Put = defaultInstance.Put.bind(defaultInstance)
159
+ dualInstance.Delete = defaultInstance.Delete.bind(defaultInstance)
160
+ dualInstance.Patch = defaultInstance.Patch.bind(defaultInstance)
161
+ dualInstance.Head = defaultInstance.Head.bind(defaultInstance)
162
+ dualInstance.Options = defaultInstance.Options.bind(defaultInstance)
163
+ dualInstance.Request = defaultInstance.Request.bind(defaultInstance)
164
+
165
+ return dualInstance
166
+ }
@@ -0,0 +1,38 @@
1
+ export const deepMergeObject = <T = any>(source: T, target: Partial<T>): T => {
2
+ const isObject = (obj: any): obj is Record<string, any> =>
3
+ obj && typeof obj === 'object' && !Array.isArray(obj)
4
+
5
+ const merge = (src: any, tgt: any): any => {
6
+ if (isObject(src) && isObject(tgt)) {
7
+ Object.keys(tgt).forEach((key) => {
8
+ if (isObject(tgt[key])) {
9
+ src[key] = merge(src[key] || {}, tgt[key])
10
+ } else {
11
+ src[key] = tgt[key]
12
+ }
13
+ })
14
+ }
15
+ return src
16
+ }
17
+
18
+ return merge({ ...source }, target)
19
+ }
20
+
21
+ /**
22
+ * 判断一个变量是不是可读流
23
+ * @param data
24
+ */
25
+ export const isReadableStream = (data: unknown): boolean => {
26
+ if (!(data instanceof ReadableStream)) {
27
+ return false
28
+ }
29
+ if (typeof data.locked !== 'boolean') return false
30
+
31
+ const instanceFunc = ['cancel', 'getReader', 'pipeThrough', 'pipeTo', 'tee'] as const
32
+
33
+ for (const func of instanceFunc) {
34
+ if (typeof data[func] !== 'function') return false
35
+ }
36
+
37
+ return true
38
+ }