pandax 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.
- package/README.md +83 -0
- package/bin/pandax.js +592 -0
- package/package.json +33 -0
- package/skills/pandax-frontend-api-mock/SKILL.md +62 -0
- package/skills/pandax-frontend-architecture/SKILL.md +1239 -0
- package/skills/pandax-frontend-component-review/SKILL.md +114 -0
- package/skills/pandax-frontend-requirement/SKILL.md +142 -0
- package/skills/pandax-frontend-standards/SKILL.md +468 -0
- package/skills/pandax-frontend-use-modal/SKILL.md +621 -0
- package/templates/pandax-monorepo/.editorconfig +16 -0
- package/templates/pandax-monorepo/.husky/commit-msg +2 -0
- package/templates/pandax-monorepo/.husky/pre-commit +2 -0
- package/templates/pandax-monorepo/.prettierrc.json +28 -0
- package/templates/pandax-monorepo/apps/base/env.d.ts +1 -0
- package/templates/pandax-monorepo/apps/base/index.html +13 -0
- package/templates/pandax-monorepo/apps/base/package.json +30 -0
- package/templates/pandax-monorepo/apps/base/src/App.vue +15 -0
- package/templates/pandax-monorepo/apps/base/src/layouts/default-layout/index.vue +23 -0
- package/templates/pandax-monorepo/apps/base/src/main.ts +31 -0
- package/templates/pandax-monorepo/apps/base/src/router/index.ts +22 -0
- package/templates/pandax-monorepo/apps/base/src/stores/index.ts +15 -0
- package/templates/pandax-monorepo/apps/base/src/styles/global.scss +19 -0
- package/templates/pandax-monorepo/apps/base/src/styles/variables.scss +4 -0
- package/templates/pandax-monorepo/apps/base/src/types/wujie.d.ts +16 -0
- package/templates/pandax-monorepo/apps/base/src/views/home/index.vue +21 -0
- package/templates/pandax-monorepo/apps/base/tsconfig.json +25 -0
- package/templates/pandax-monorepo/apps/base/tsconfig.node.json +11 -0
- package/templates/pandax-monorepo/apps/base/vite.config.ts +26 -0
- package/templates/pandax-monorepo/apps/main/env.d.ts +1 -0
- package/templates/pandax-monorepo/apps/main/index.html +13 -0
- package/templates/pandax-monorepo/apps/main/package.json +32 -0
- package/templates/pandax-monorepo/apps/main/src/App.vue +15 -0
- package/templates/pandax-monorepo/apps/main/src/layouts/MicroApp.vue +29 -0
- package/templates/pandax-monorepo/apps/main/src/layouts/default-layout/index.vue +48 -0
- package/templates/pandax-monorepo/apps/main/src/main.ts +27 -0
- package/templates/pandax-monorepo/apps/main/src/router/index.ts +22 -0
- package/templates/pandax-monorepo/apps/main/src/stores/index.ts +23 -0
- package/templates/pandax-monorepo/apps/main/src/styles/global.scss +23 -0
- package/templates/pandax-monorepo/apps/main/src/styles/variables.scss +8 -0
- package/templates/pandax-monorepo/apps/main/src/views/home/index.vue +25 -0
- package/templates/pandax-monorepo/apps/main/tsconfig.json +25 -0
- package/templates/pandax-monorepo/apps/main/tsconfig.node.json +11 -0
- package/templates/pandax-monorepo/apps/main/vite.config.ts +24 -0
- package/templates/pandax-monorepo/commitlint.config.js +38 -0
- package/templates/pandax-monorepo/eslint.config.js +61 -0
- package/templates/pandax-monorepo/package.json +50 -0
- package/templates/pandax-monorepo/packages/components/package.json +20 -0
- package/templates/pandax-monorepo/packages/components/src/PandaButton.vue +15 -0
- package/templates/pandax-monorepo/packages/components/src/PandaCard.vue +16 -0
- package/templates/pandax-monorepo/packages/components/src/index.ts +2 -0
- package/templates/pandax-monorepo/packages/core/package.json +20 -0
- package/templates/pandax-monorepo/packages/core/src/index.ts +2 -0
- package/templates/pandax-monorepo/packages/core/src/request.ts +24 -0
- package/templates/pandax-monorepo/packages/core/src/utils.ts +7 -0
- package/templates/pandax-monorepo/packages/hooks/package.json +19 -0
- package/templates/pandax-monorepo/packages/hooks/src/index.ts +2 -0
- package/templates/pandax-monorepo/packages/hooks/src/useCounter.ts +27 -0
- package/templates/pandax-monorepo/packages/hooks/src/useToggle.ts +19 -0
- package/templates/pandax-monorepo/packages/styles/package.json +19 -0
- package/templates/pandax-monorepo/packages/styles/src/index.ts +1 -0
- package/templates/pandax-monorepo/packages/styles/src/uno.ts +19 -0
- package/templates/pandax-monorepo/packages/styles/src/variables.scss +14 -0
- package/templates/pandax-monorepo/pnpm-workspace.yaml +32 -0
- package/templates/pandax-monorepo/turbo.json +23 -0
- package/templates/vue3/.eslintrc.cjs +16 -0
- package/templates/vue3/.prettierrc +7 -0
- package/templates/vue3/env.d.ts +1 -0
- package/templates/vue3/index.html +13 -0
- package/templates/vue3/package.json +34 -0
- package/templates/vue3/src/App.vue +14 -0
- package/templates/vue3/src/api/index.ts +27 -0
- package/templates/vue3/src/assets/.gitkeep +1 -0
- package/templates/vue3/src/components/.gitkeep +1 -0
- package/templates/vue3/src/composables/.gitkeep +1 -0
- package/templates/vue3/src/constants/.gitkeep +1 -0
- package/templates/vue3/src/directives/.gitkeep +1 -0
- package/templates/vue3/src/layouts/default-layout/index.vue +33 -0
- package/templates/vue3/src/locales/.gitkeep +1 -0
- package/templates/vue3/src/main.ts +17 -0
- package/templates/vue3/src/router/index.ts +17 -0
- package/templates/vue3/src/services/.gitkeep +1 -0
- package/templates/vue3/src/stores/index.ts +12 -0
- package/templates/vue3/src/styles/global.scss +18 -0
- package/templates/vue3/src/styles/variables.scss +17 -0
- package/templates/vue3/src/types/global.d.ts +9 -0
- package/templates/vue3/src/utils/format.ts +11 -0
- package/templates/vue3/src/views/home/index.vue +19 -0
- package/templates/vue3/tsconfig.json +25 -0
- package/templates/vue3/tsconfig.node.json +10 -0
- package/templates/vue3/vite.config.ts +20 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pandax-base",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "vite --port 7101",
|
|
7
|
+
"build": "vue-tsc --noEmit && vite build",
|
|
8
|
+
"preview": "vite preview --port 7101",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"lint:fix": "eslint . --fix",
|
|
11
|
+
"typecheck": "vue-tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"vue": "catalog:",
|
|
15
|
+
"vue-router": "catalog:",
|
|
16
|
+
"pinia": "catalog:",
|
|
17
|
+
"axios": "catalog:",
|
|
18
|
+
"element-plus": "catalog:",
|
|
19
|
+
"@element-plus/icons-vue": "catalog:"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@vitejs/plugin-vue": "^5.2.0",
|
|
23
|
+
"vite": "catalog:",
|
|
24
|
+
"vue-tsc": "catalog:",
|
|
25
|
+
"typescript": "catalog:",
|
|
26
|
+
"sass": "^1.86.0",
|
|
27
|
+
"unocss": "^66.0.0",
|
|
28
|
+
"@unocss/preset-uno": "^66.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import DefaultLayout from '@/layouts/default-layout/index.vue';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<DefaultLayout>
|
|
7
|
+
<RouterView />
|
|
8
|
+
</DefaultLayout>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<style scoped lang="scss">
|
|
12
|
+
.app-root {
|
|
13
|
+
height: 100%;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useRoute } from 'vue-router';
|
|
3
|
+
|
|
4
|
+
const route = useRoute();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<el-container class="default-layout h-screen">
|
|
9
|
+
<el-header class="bg-white shadow-sm flex items-center justify-between">
|
|
10
|
+
<span class="text-lg font-bold text-primary">Base 子应用</span>
|
|
11
|
+
<span class="text-sm text-gray-500">{{ route.path }}</span>
|
|
12
|
+
</el-header>
|
|
13
|
+
<el-main class="bg-gray-50">
|
|
14
|
+
<slot />
|
|
15
|
+
</el-main>
|
|
16
|
+
</el-container>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<style scoped lang="scss">
|
|
20
|
+
.text-primary {
|
|
21
|
+
color: var(--el-color-primary);
|
|
22
|
+
}
|
|
23
|
+
</style>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createApp } from 'vue';
|
|
2
|
+
import { createPinia } from 'pinia';
|
|
3
|
+
import ElementPlus from 'element-plus';
|
|
4
|
+
import 'element-plus/dist/index.css';
|
|
5
|
+
import 'virtual:uno.css';
|
|
6
|
+
import './styles/global.scss';
|
|
7
|
+
|
|
8
|
+
import App from './App.vue';
|
|
9
|
+
import router from './router';
|
|
10
|
+
|
|
11
|
+
let app: ReturnType<typeof createApp> | null = null;
|
|
12
|
+
|
|
13
|
+
function mount() {
|
|
14
|
+
app = createApp(App);
|
|
15
|
+
app.use(createPinia());
|
|
16
|
+
app.use(router);
|
|
17
|
+
app.use(ElementPlus);
|
|
18
|
+
app.mount('#app');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function unmount() {
|
|
22
|
+
app?.unmount();
|
|
23
|
+
app = null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (window.__POWERED_BY_WUJIE__) {
|
|
27
|
+
window.__WUJIE_MOUNT = mount;
|
|
28
|
+
window.__WUJIE_UNMOUNT = unmount;
|
|
29
|
+
} else {
|
|
30
|
+
mount();
|
|
31
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createRouter, createWebHistory } from 'vue-router';
|
|
2
|
+
|
|
3
|
+
const routes = [
|
|
4
|
+
{
|
|
5
|
+
path: '/',
|
|
6
|
+
redirect: '/home',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
path: '/home',
|
|
10
|
+
name: 'BaseHome',
|
|
11
|
+
component: () => import('@/views/home/index.vue'),
|
|
12
|
+
},
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
const router = createRouter({
|
|
16
|
+
history: createWebHistory(
|
|
17
|
+
window.__POWERED_BY_WUJIE__ ? '/base' : import.meta.env.BASE_URL
|
|
18
|
+
),
|
|
19
|
+
routes,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export default router;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { defineStore } from 'pinia';
|
|
2
|
+
import { ref } from 'vue';
|
|
3
|
+
|
|
4
|
+
export const useBaseStore = defineStore('base', () => {
|
|
5
|
+
const count = ref(0);
|
|
6
|
+
|
|
7
|
+
function increment() {
|
|
8
|
+
count.value += 1;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
count,
|
|
13
|
+
increment,
|
|
14
|
+
};
|
|
15
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
* {
|
|
2
|
+
margin: 0;
|
|
3
|
+
padding: 0;
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
html,
|
|
8
|
+
body,
|
|
9
|
+
#app {
|
|
10
|
+
height: 100%;
|
|
11
|
+
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
|
|
12
|
+
'Microsoft YaHei', Arial, sans-serif;
|
|
13
|
+
-webkit-font-smoothing: antialiased;
|
|
14
|
+
-moz-osx-font-smoothing: grayscale;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.h-screen {
|
|
18
|
+
height: 100vh;
|
|
19
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
__POWERED_BY_WUJIE__?: boolean;
|
|
4
|
+
__WUJIE_MOUNT?: () => void;
|
|
5
|
+
__WUJIE_UNMOUNT?: () => void;
|
|
6
|
+
$wujie?: {
|
|
7
|
+
props?: Record<string, any>;
|
|
8
|
+
bus: {
|
|
9
|
+
$emit: (event: string, ...args: any[]) => void;
|
|
10
|
+
$on: (event: string, callback: (...args: any[]) => void) => void;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
|
|
4
|
+
const isWujie = computed(() => !!window.__POWERED_BY_WUJIE__);
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<div class="base-home p-6">
|
|
9
|
+
<el-card shadow="never">
|
|
10
|
+
<template #header>
|
|
11
|
+
<div class="text-lg font-bold">Base 子应用</div>
|
|
12
|
+
</template>
|
|
13
|
+
<p class="text-gray-600 mb-4">
|
|
14
|
+
这是一个独立的 Vue 3 + Vite 8 子应用,支持 wujie 微前端嵌入和独立运行两种模式。
|
|
15
|
+
</p>
|
|
16
|
+
<el-tag :type="isWujie ? 'success' : 'info'">
|
|
17
|
+
当前运行模式:{{ isWujie ? 'wujie 微前端' : '独立运行' }}
|
|
18
|
+
</el-tag>
|
|
19
|
+
</el-card>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"moduleResolution": "bundler",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"isolatedModules": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"jsx": "preserve",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"paths": {
|
|
19
|
+
"@/*": ["./src/*"]
|
|
20
|
+
},
|
|
21
|
+
"types": ["vite/client"]
|
|
22
|
+
},
|
|
23
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "env.d.ts"],
|
|
24
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
25
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import vue from '@vitejs/plugin-vue';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
import UnoCSS from 'unocss/vite';
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
base: '/',
|
|
8
|
+
plugins: [vue(), UnoCSS()],
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: {
|
|
11
|
+
'@': resolve(__dirname, 'src'),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
css: {
|
|
15
|
+
preprocessorOptions: {
|
|
16
|
+
scss: {
|
|
17
|
+
additionalData: `@use "@/styles/variables.scss" as *;`,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
server: {
|
|
22
|
+
port: 7101,
|
|
23
|
+
strictPort: true,
|
|
24
|
+
cors: true,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
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>Pandax Micro Frontend Main</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,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pandax-main",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "vite --port 7000",
|
|
7
|
+
"build": "vue-tsc --noEmit && vite build",
|
|
8
|
+
"preview": "vite preview",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"lint:fix": "eslint . --fix",
|
|
11
|
+
"typecheck": "vue-tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"vue": "catalog:",
|
|
15
|
+
"vue-router": "catalog:",
|
|
16
|
+
"pinia": "catalog:",
|
|
17
|
+
"wujie": "^1.0.25",
|
|
18
|
+
"wujie-vue3": "^1.0.25",
|
|
19
|
+
"axios": "catalog:",
|
|
20
|
+
"element-plus": "catalog:",
|
|
21
|
+
"@element-plus/icons-vue": "catalog:"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@vitejs/plugin-vue": "^5.2.0",
|
|
25
|
+
"vite": "catalog:",
|
|
26
|
+
"vue-tsc": "catalog:",
|
|
27
|
+
"typescript": "catalog:",
|
|
28
|
+
"sass": "^1.86.0",
|
|
29
|
+
"unocss": "^66.0.0",
|
|
30
|
+
"@unocss/preset-uno": "^66.0.0"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import DefaultLayout from '@/layouts/default-layout/index.vue';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<template>
|
|
6
|
+
<DefaultLayout>
|
|
7
|
+
<RouterView />
|
|
8
|
+
</DefaultLayout>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<style scoped lang="scss">
|
|
12
|
+
.app-root {
|
|
13
|
+
height: 100%;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import WujieVue from 'wujie-vue3';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
name: string;
|
|
6
|
+
url: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const props = defineProps<Props>();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<div class="micro-app-container h-full w-full">
|
|
14
|
+
<WujieVue
|
|
15
|
+
:name="props.name"
|
|
16
|
+
:url="props.url"
|
|
17
|
+
:sync="true"
|
|
18
|
+
width="100%"
|
|
19
|
+
height="100%"
|
|
20
|
+
/>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<style scoped lang="scss">
|
|
25
|
+
.micro-app-container {
|
|
26
|
+
position: relative;
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
}
|
|
29
|
+
</style>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useRouter, useRoute } from 'vue-router';
|
|
3
|
+
|
|
4
|
+
const router = useRouter();
|
|
5
|
+
const route = useRoute();
|
|
6
|
+
|
|
7
|
+
function navigateToBase() {
|
|
8
|
+
router.push('/base/home');
|
|
9
|
+
}
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<el-container class="default-layout h-screen">
|
|
14
|
+
<el-aside width="220px" class="bg-gray-1">
|
|
15
|
+
<div class="logo h-16 flex items-center justify-center text-lg font-bold">
|
|
16
|
+
Pandax
|
|
17
|
+
</div>
|
|
18
|
+
<el-menu
|
|
19
|
+
:default-active="route.path"
|
|
20
|
+
router
|
|
21
|
+
class="border-r-0"
|
|
22
|
+
>
|
|
23
|
+
<el-menu-item index="/">
|
|
24
|
+
<el-icon><HomeFilled /></el-icon>
|
|
25
|
+
<span>首页</span>
|
|
26
|
+
</el-menu-item>
|
|
27
|
+
<el-menu-item index="/base/home" @click="navigateToBase">
|
|
28
|
+
<el-icon><Menu /></el-icon>
|
|
29
|
+
<span>Base 子应用</span>
|
|
30
|
+
</el-menu-item>
|
|
31
|
+
</el-menu>
|
|
32
|
+
</el-aside>
|
|
33
|
+
<el-container>
|
|
34
|
+
<el-header class="bg-white shadow-sm flex items-center">
|
|
35
|
+
<span class="text-sm text-gray-500">微前端基座应用</span>
|
|
36
|
+
</el-header>
|
|
37
|
+
<el-main class="bg-gray-50">
|
|
38
|
+
<slot />
|
|
39
|
+
</el-main>
|
|
40
|
+
</el-container>
|
|
41
|
+
</el-container>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<style scoped lang="scss">
|
|
45
|
+
.logo {
|
|
46
|
+
color: var(--el-color-primary);
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createApp } from 'vue';
|
|
2
|
+
import { createPinia } from 'pinia';
|
|
3
|
+
import { setupApp } from 'wujie';
|
|
4
|
+
import ElementPlus from 'element-plus';
|
|
5
|
+
import 'element-plus/dist/index.css';
|
|
6
|
+
import 'virtual:uno.css';
|
|
7
|
+
import './styles/global.scss';
|
|
8
|
+
|
|
9
|
+
import App from './App.vue';
|
|
10
|
+
import router from './router';
|
|
11
|
+
|
|
12
|
+
setupApp({
|
|
13
|
+
name: 'base',
|
|
14
|
+
url: '//localhost:7101',
|
|
15
|
+
exec: true,
|
|
16
|
+
props: {
|
|
17
|
+
token: localStorage.getItem('token') || '',
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const app = createApp(App);
|
|
22
|
+
|
|
23
|
+
app.use(createPinia());
|
|
24
|
+
app.use(router);
|
|
25
|
+
app.use(ElementPlus);
|
|
26
|
+
|
|
27
|
+
app.mount('#app');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createRouter, createWebHistory } from 'vue-router';
|
|
2
|
+
|
|
3
|
+
const routes = [
|
|
4
|
+
{
|
|
5
|
+
path: '/',
|
|
6
|
+
name: 'Home',
|
|
7
|
+
component: () => import('@/views/home/index.vue'),
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
path: '/base/:path(.*)',
|
|
11
|
+
name: 'BaseMicroApp',
|
|
12
|
+
component: () => import('@/layouts/MicroApp.vue'),
|
|
13
|
+
props: { name: 'base', url: '//localhost:7101' },
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const router = createRouter({
|
|
18
|
+
history: createWebHistory(),
|
|
19
|
+
routes,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export default router;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineStore } from 'pinia';
|
|
2
|
+
import { ref } from 'vue';
|
|
3
|
+
|
|
4
|
+
export const useMainStore = defineStore('main', () => {
|
|
5
|
+
const collapsed = ref(false);
|
|
6
|
+
const token = ref(localStorage.getItem('token') || '');
|
|
7
|
+
|
|
8
|
+
function setCollapsed(value: boolean) {
|
|
9
|
+
collapsed.value = value;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function setToken(value: string) {
|
|
13
|
+
token.value = value;
|
|
14
|
+
localStorage.setItem('token', value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
collapsed,
|
|
19
|
+
token,
|
|
20
|
+
setCollapsed,
|
|
21
|
+
setToken,
|
|
22
|
+
};
|
|
23
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
* {
|
|
2
|
+
margin: 0;
|
|
3
|
+
padding: 0;
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
html,
|
|
8
|
+
body,
|
|
9
|
+
#app {
|
|
10
|
+
height: 100%;
|
|
11
|
+
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
|
|
12
|
+
'Microsoft YaHei', Arial, sans-serif;
|
|
13
|
+
-webkit-font-smoothing: antialiased;
|
|
14
|
+
-moz-osx-font-smoothing: grayscale;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.h-screen {
|
|
18
|
+
height: 100vh;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.bg-gray-1 {
|
|
22
|
+
background-color: #f5f7fa;
|
|
23
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useRouter } from 'vue-router';
|
|
3
|
+
|
|
4
|
+
const router = useRouter();
|
|
5
|
+
|
|
6
|
+
function goToBase() {
|
|
7
|
+
router.push('/base/home');
|
|
8
|
+
}
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<div class="home-page p-6">
|
|
13
|
+
<el-card shadow="never">
|
|
14
|
+
<template #header>
|
|
15
|
+
<div class="text-lg font-bold">Pandax 微前端平台</div>
|
|
16
|
+
</template>
|
|
17
|
+
<p class="text-gray-600 mb-4">
|
|
18
|
+
这是基于 Vue 3 + Vite 8 + wujie 的微前端基座应用。
|
|
19
|
+
</p>
|
|
20
|
+
<el-button type="primary" @click="goToBase">
|
|
21
|
+
进入 Base 子应用
|
|
22
|
+
</el-button>
|
|
23
|
+
</el-card>
|
|
24
|
+
</div>
|
|
25
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"moduleResolution": "bundler",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"isolatedModules": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"jsx": "preserve",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"paths": {
|
|
19
|
+
"@/*": ["./src/*"]
|
|
20
|
+
},
|
|
21
|
+
"types": ["vite/client"]
|
|
22
|
+
},
|
|
23
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "env.d.ts"],
|
|
24
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
25
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import vue from '@vitejs/plugin-vue';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
import UnoCSS from 'unocss/vite';
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [vue(), UnoCSS()],
|
|
8
|
+
resolve: {
|
|
9
|
+
alias: {
|
|
10
|
+
'@': resolve(__dirname, 'src'),
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
css: {
|
|
14
|
+
preprocessorOptions: {
|
|
15
|
+
scss: {
|
|
16
|
+
additionalData: `@use "@/styles/variables.scss" as *;`,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
server: {
|
|
21
|
+
port: 7000,
|
|
22
|
+
strictPort: true,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Conventional Commits 配置:https://commitlint.js.org/
|
|
2
|
+
// 中文 commit 参考:https://www.conventionalcommits.org/zh-hans/v1.0.0/
|
|
3
|
+
export default {
|
|
4
|
+
extends: ['@commitlint/config-conventional'],
|
|
5
|
+
rules: {
|
|
6
|
+
// header(提交信息首行)最大长度 100,超过警告
|
|
7
|
+
'header-max-length': [2, 'always', 100],
|
|
8
|
+
// body 单行最大长度 120,超过警告
|
|
9
|
+
'body-max-line-length': [1, 'always', 120],
|
|
10
|
+
// type 必须是以下之一(小写)
|
|
11
|
+
'type-enum': [
|
|
12
|
+
2,
|
|
13
|
+
'always',
|
|
14
|
+
[
|
|
15
|
+
'feat', // 新功能
|
|
16
|
+
'fix', // 修复 bug
|
|
17
|
+
'docs', // 文档变更
|
|
18
|
+
'style', // 代码格式调整(不影响功能)
|
|
19
|
+
'refactor', // 重构
|
|
20
|
+
'perf', // 性能优化
|
|
21
|
+
'test', // 测试
|
|
22
|
+
'build', // 构建系统或外部依赖变更
|
|
23
|
+
'ci', // CI 配置
|
|
24
|
+
'chore', // 杂项(不修改 src 或 test)
|
|
25
|
+
'revert', // 回滚
|
|
26
|
+
'wip', // 开发中
|
|
27
|
+
],
|
|
28
|
+
],
|
|
29
|
+
// type 不能为空
|
|
30
|
+
'type-empty': [2, 'never'],
|
|
31
|
+
// subject 不能为空
|
|
32
|
+
'subject-empty': [2, 'never'],
|
|
33
|
+
// subject 不能以句号结尾
|
|
34
|
+
'subject-full-stop': [2, 'never', '.'],
|
|
35
|
+
// subject 大小写:不强制(中文 subject 不适用)
|
|
36
|
+
'subject-case': [0],
|
|
37
|
+
},
|
|
38
|
+
};
|