@bams-app/ui-dev-server 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.
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawn } = require('child_process');
4
+ const { getRootDir, getProjectPackageJson, parseCliArgs, resolveComponentInput, colorize } = require('../utils');
5
+
6
+ const rootDir = getRootDir();
7
+ const packageJson = getProjectPackageJson(rootDir);
8
+
9
+ async function main() {
10
+ const { componentName: rawComponentName, vueCliArgs } = parseCliArgs(process.argv);
11
+ const componentName = await resolveComponentInput(rawComponentName, rootDir, packageJson);
12
+
13
+ // 设置环境变量
14
+ const env = { ...process.env };
15
+ env.COMPONENT = componentName;
16
+ env.WORK_PROJECT_ROOT = rootDir;
17
+ env.NODE_ENV = 'production';
18
+
19
+ console.log(colorize(`[build-app] Building component: ${componentName}`, 'green'));
20
+ console.log(colorize(`[build-app] Vue CLI args: ${vueCliArgs.join(' ')}`, 'blue'));
21
+
22
+ // 启动vue-cli-service build
23
+ const vueCliService = require.resolve('@vue/cli-service/bin/vue-cli-service.js');
24
+
25
+ const child = spawn(process.execPath, [vueCliService, 'build', ...vueCliArgs], {
26
+ env,
27
+ cwd: require('path').resolve(__dirname, '../'),
28
+ stdio: 'inherit'
29
+ });
30
+
31
+ child.on('error', (err) => {
32
+ console.error(colorize('构建失败:', 'red'), err);
33
+ process.exit(1);
34
+ });
35
+
36
+ child.on('exit', (code) => {
37
+ process.exit(code);
38
+ });
39
+ }
40
+
41
+ main().catch((err) => {
42
+ console.error(colorize('构建失败:', 'red'), err);
43
+ process.exit(1);
44
+ });
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawn } = require('child_process');
4
+ const path = require('path');
5
+ const fs = require('fs');
6
+ const { getRootDir } = require('../utils');
7
+
8
+ // 解析命令行参数
9
+ const args = process.argv.slice(2);
10
+ let entryFile = '';
11
+ let outputDir = '';
12
+ let outputName = 'bams-components';
13
+
14
+ // 处理参数
15
+ for (let i = 0; i < args.length; i++) {
16
+ if (args[i] === '--entry' || args[i] === '-e') {
17
+ entryFile = args[i + 1];
18
+ i++;
19
+ } else if (args[i].startsWith('--entry=')) {
20
+ entryFile = args[i].split('=')[1];
21
+ } else if (args[i].startsWith('-e=')) {
22
+ entryFile = args[i].split('=')[1];
23
+ } else if (args[i] === '--output-dir' || args[i] === '-o') {
24
+ outputDir = args[i + 1];
25
+ i++;
26
+ } else if (args[i].startsWith('--output-dir=')) {
27
+ outputDir = args[i].split('=')[1];
28
+ } else if (args[i].startsWith('-o=')) {
29
+ outputDir = args[i].split('=')[1];
30
+ } else if (args[i] === '--name' || args[i] === '-n') {
31
+ outputName = args[i + 1];
32
+ i++;
33
+ } else if (args[i].startsWith('--name=')) {
34
+ outputName = args[i].split('=')[1];
35
+ } else if (args[i].startsWith('-n=')) {
36
+ outputName = args[i].split('=')[1];
37
+ }
38
+ }
39
+
40
+ // 设置默认入口文件
41
+ const rootDir = getRootDir();
42
+ if (!entryFile) {
43
+ entryFile = path.resolve(rootDir, 'build-components-entry.js');
44
+ } else if (!path.isAbsolute(entryFile)) {
45
+ // 如果是相对路径,转换为绝对路径(相对于当前工作目录)
46
+ entryFile = path.resolve(process.cwd(), entryFile);
47
+ }
48
+
49
+ // 检查入口文件是否存在
50
+ if (!fs.existsSync(entryFile)) {
51
+ console.error('❌ 入口文件不存在:', entryFile);
52
+ console.log('💡 请先运行 create-pages-entry 脚本生成入口文件');
53
+ process.exit(1);
54
+ }
55
+
56
+ // 处理输出目录路径
57
+ if (outputDir && !path.isAbsolute(outputDir)) {
58
+ outputDir = path.resolve(process.cwd(), outputDir);
59
+ }
60
+
61
+ // 设置环境变量
62
+ const env = { ...process.env };
63
+ env.WORK_PROJECT_ROOT = rootDir;
64
+ env.ENTRY_FILE = entryFile;
65
+ if (outputDir) env.OUTPUT_DIR = outputDir;
66
+ env.OUTPUT_NAME = outputName;
67
+ env.BUILD_TYPE = 'umd';
68
+
69
+ // 启动vue-cli-service build
70
+ const vueCliService = require.resolve('@vue/cli-service/bin/vue-cli-service.js');
71
+
72
+ const buildArgs = [
73
+ 'build',
74
+ '--target', 'lib',
75
+ '--name', outputName,
76
+ '--dest', outputDir || path.resolve(rootDir, 'dist/umd'),
77
+ entryFile
78
+ ];
79
+
80
+ const child = spawn(process.execPath, [vueCliService, ...buildArgs], {
81
+ env: env,
82
+ cwd: path.resolve(__dirname, '../'),
83
+ stdio: 'inherit'
84
+ });
85
+
86
+ child.on('error', (err) => {
87
+ console.error('❌ 打包失败:', err);
88
+ process.exit(1);
89
+ });
90
+
91
+ child.on('exit', (code) => {
92
+ if (code === 0) {
93
+ console.log('✅ 打包成功!');
94
+ }
95
+ process.exit(code);
96
+ });
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawn } = require('child_process');
4
+ const path = require('path');
5
+ const { getRootDir, getProjectPackageJson, parseCliArgs, resolveComponentInput, colorize } = require('../utils');
6
+
7
+ const rootDir = getRootDir();
8
+ const packageJson = getProjectPackageJson(rootDir);
9
+
10
+ async function main() {
11
+ const { componentName: rawComponentName, layout, vueCliArgs } = parseCliArgs(process.argv);
12
+ const componentName = await resolveComponentInput(rawComponentName, rootDir, packageJson);
13
+
14
+ // 设置环境变量
15
+ const env = { ...process.env };
16
+ env.COMPONENT = componentName;
17
+ env.LAYOUT = layout;
18
+ env.WORK_PROJECT_ROOT = rootDir;
19
+
20
+ console.log(colorize(`[ui-dev-server] Starting component: ${componentName}, layout: ${layout}`, 'green'));
21
+ console.log(colorize(`[ui-dev-server] Vue CLI args: ${vueCliArgs.join(' ')}`, 'blue'));
22
+
23
+ // 启动vue-cli-service serve
24
+ const vueCliService = require.resolve('@vue/cli-service/bin/vue-cli-service.js');
25
+
26
+ const child = spawn(process.execPath, [vueCliService, 'serve', ...vueCliArgs], {
27
+ env,
28
+ cwd: path.resolve(__dirname, '../'),
29
+ stdio: 'inherit'
30
+ });
31
+
32
+ child.on('error', (err) => {
33
+ console.error(colorize('启动开发服务器失败:', 'red'), err);
34
+ process.exit(1);
35
+ });
36
+
37
+ child.on('exit', (code) => {
38
+ process.exit(code);
39
+ });
40
+ }
41
+
42
+ main().catch((err) => {
43
+ console.error(colorize('启动开发服务器失败:', 'red'), err);
44
+ process.exit(1);
45
+ });
@@ -0,0 +1,105 @@
1
+ const { resolveComponent } = require("./utils");
2
+ const globalComponentDefaults = require("@bams-app/configs/component-defaults.js");
3
+
4
+ /**
5
+ * 简单的深度合并对象
6
+ * @param {Object} target 目标对象
7
+ * @param {...Object} sources 源对象
8
+ * @returns {Object} 合并后的对象
9
+ */
10
+ function merge(target, ...sources) {
11
+ if (!sources.length) return target;
12
+ const source = sources.shift();
13
+
14
+ if (source !== undefined && source !== null) {
15
+ Object.keys(source).forEach(key => {
16
+ const targetValue = target[key];
17
+ const sourceValue = source[key];
18
+
19
+ if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
20
+ target[key] = targetValue.concat(sourceValue);
21
+ } else if (typeof targetValue === 'object' && targetValue !== null &&
22
+ typeof sourceValue === 'object' && sourceValue !== null &&
23
+ !Array.isArray(sourceValue)) {
24
+ target[key] = merge({ ...targetValue }, sourceValue);
25
+ } else {
26
+ target[key] = sourceValue;
27
+ }
28
+ });
29
+ }
30
+
31
+ return merge(target, ...sources);
32
+ }
33
+
34
+ /**
35
+ * 将环境变量名转换为可配置插槽名
36
+ * @param {string} envKey 环境变量名
37
+ * @returns {string} 插槽名,如 login、home-card
38
+ */
39
+ function normalizeConfigurableSlotName(envKey) {
40
+ return envKey
41
+ .replace(/^(VUE_APP_COMPONENT_|COMPONENT_)/, "")
42
+ .toLowerCase()
43
+ .replace(/_/g, "-");
44
+ }
45
+
46
+ /**
47
+ * 根据环境变量和默认值生成可配置组件 alias
48
+ * @param {Object} options 配置项
49
+ * @param {Object} options.env 环境变量对象
50
+ * @param {string} options.rootDir 项目根目录
51
+ * @param {Object} options.packageJson 根 package.json
52
+ * @param {Object} [options.defaults] 额外默认插槽组件映射,会覆盖全局默认值
53
+ * @returns {Object} webpack alias 对象
54
+ */
55
+ function getConfigurableComponentAliases({ env, rootDir, packageJson, defaults = {} }) {
56
+ const slotToComponent = { ...globalComponentDefaults, ...defaults };
57
+
58
+ Object.entries(env).forEach(([key, value]) => {
59
+ if (!/^(VUE_APP_COMPONENT_|COMPONENT_).+$/.test(key) || !value) {
60
+ return;
61
+ }
62
+
63
+ slotToComponent[normalizeConfigurableSlotName(key)] = value;
64
+ });
65
+
66
+ return Object.entries(slotToComponent).reduce((aliases, [slotName, componentName]) => {
67
+ aliases[`@configurable/${slotName}`] = resolveComponent(componentName, rootDir, packageJson);
68
+ return aliases;
69
+ }, {});
70
+ }
71
+
72
+ /**
73
+ * 生成通用的 webpack alias 片段,包含所有可配置组件插槽
74
+ * @param {Object} [options]
75
+ * @param {string} options.rootDir 项目根目录
76
+ * @param {Object} [options.env=process.env] 环境变量对象
77
+ * @param {Object} options.packageJson 根 package.json
78
+ * @param {Object} [options.defaults] 额外默认插槽组件映射
79
+ * @returns {{rootDir: string, packageJson: object, aliases: Object}}
80
+ */
81
+ function applyCommonConfig(options = {}) {
82
+ const { rootDir, env = process.env, packageJson, defaults } = options;
83
+
84
+ if (!rootDir || !packageJson) {
85
+ throw new Error("applyCommonConfig requires rootDir and packageJson");
86
+ }
87
+
88
+ const configurableAliases = getConfigurableComponentAliases({
89
+ env,
90
+ rootDir,
91
+ packageJson,
92
+ defaults
93
+ });
94
+
95
+ return {
96
+ rootDir,
97
+ packageJson,
98
+ aliases: configurableAliases
99
+ };
100
+ }
101
+
102
+ module.exports = {
103
+ merge,
104
+ applyCommonConfig
105
+ };
package/empty-entry.js ADDED
@@ -0,0 +1 @@
1
+ export { };
package/package.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "@bams-app/ui-dev-server",
3
+ "version": "0.0.1",
4
+ "scripts": {
5
+ "serve": "node ./bin/ui-dev-server.js",
6
+ "build": "vue-cli-service build",
7
+ "build:umd": "node ./bin/build-umd.js",
8
+ "lint": "vue-cli-service lint"
9
+ },
10
+ "peerDependencies": {
11
+ "ant-design-vue": "^4.0.0",
12
+ "vue": "^3.2.0",
13
+ "vue-router": "^4.0.0"
14
+ },
15
+ "dependencies": {
16
+ "@babel/core": "^7.12.16",
17
+ "@babel/eslint-parser": "^7.12.16",
18
+ "@bams-app/api-model": "*",
19
+ "@bams-app/app-layout": "*",
20
+ "@bams-app/assets": "*",
21
+ "@bams-app/base": "*",
22
+ "@bams-app/components": "*",
23
+ "@bams-app/composition-api": "*",
24
+ "@bams-app/config": "*",
25
+ "@bams-app/configs": "*",
26
+ "@bams-app/data-dict": "*",
27
+ "@bams-app/global-data": "*",
28
+ "@bams-app/i18n": "*",
29
+ "@bams-app/login": "*",
30
+ "@bams-app/message": "*",
31
+ "@bams-app/message-voice": "*",
32
+ "@bams-app/permission": "*",
33
+ "@bams-app/router": "*",
34
+ "@bams-app/service": "*",
35
+ "@bams-app/store": "*",
36
+ "@bams-app/theme": "*",
37
+ "@bams-app/ui-business-table": "*",
38
+ "@bams-app/ui-db-table": "*",
39
+ "@bams-app/ui-header-component": "*",
40
+ "@bams-app/ui-login-bxjc-component": "*",
41
+ "@bams-app/ui-login-component": "*",
42
+ "@bams-app/ui-page-component-body": "*",
43
+ "@bams-app/ui-page-component-header": "*",
44
+ "@bams-app/ui-portal-component": "*",
45
+ "@bams-app/ui-startr-layout-component": "*",
46
+ "@bams-app/utils": "*",
47
+ "@bams-app/version-check": "*",
48
+ "@bams-app/websocket": "*",
49
+ "@vue/cli-plugin-babel": "~5.0.0",
50
+ "@vue/cli-service": "~5.0.0",
51
+ "core-js": "^3.8.3",
52
+ "inquirer": "9",
53
+ "less": "^4.5.1",
54
+ "less-loader": "^7.3.0",
55
+ "raw-loader": "^4.0.2",
56
+ "sass": "^1.97.3",
57
+ "sass-loader": "^10.1.1"
58
+ },
59
+ "devDependencies": {
60
+ "ant-design-vue": "4.2.6",
61
+ "vue": "^3.2.13",
62
+ "vue-router": "4"
63
+ },
64
+ "files": [
65
+ "bin/",
66
+ "src/",
67
+ "public/",
68
+ "utils.js",
69
+ "config-utils.js",
70
+ "empty-entry.js",
71
+ "vue.config.js",
72
+ "vue.config.base.js",
73
+ "vue.config.dev.js",
74
+ "vue.config.build.js",
75
+ "vue.config.umd.js"
76
+ ],
77
+ "bin": {
78
+ "ui-dev-server": "./bin/ui-dev-server.js",
79
+ "build-app": "./bin/build-app.js",
80
+ "build-umd": "./bin/build-umd.js"
81
+ },
82
+ "eslintConfig": {
83
+ "root": true,
84
+ "env": {
85
+ "node": true
86
+ },
87
+ "extends": [
88
+ "plugin:vue/vue3-essential",
89
+ "eslint:recommended"
90
+ ],
91
+ "parserOptions": {
92
+ "parser": "@babel/eslint-parser",
93
+ "requireConfigFile": false
94
+ },
95
+ "rules": {
96
+ "no-unused-vars": "off",
97
+ "no-undef": "off"
98
+ }
99
+ },
100
+ "browserslist": [
101
+ "> 1%",
102
+ "last 2 versions",
103
+ "not dead",
104
+ "not ie 11"
105
+ ]
106
+ }
Binary file
@@ -0,0 +1,41 @@
1
+ <!doctype html>
2
+ <html lang="">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
+ <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
8
+ <title><%= process.env.VUE_APP_TITLE %></title>
9
+ <link rel="dx-theme" data-theme="material.blue.light" href="/bams-assets/devextreme/css/dx.material.blue.light.css" data-active="true" />
10
+ <link rel="dx-theme" data-theme="material.blue.dark" href="/bams-assets/devextreme/css/dx.material.blue.dark.css" data-active="false" />
11
+ <link rel="dx-theme" data-theme="material.lime.light" href="/bams-assets/devextreme/css/dx.material.lime.light.css" data-active="false" />
12
+ <link rel="dx-theme" data-theme="material.lime.dark" href="/bams-assets/devextreme/css/dx.material.lime.dark.css" data-active="false" />
13
+ <link rel="dx-theme" data-theme="material.orange.light" href="/bams-assets/devextreme/css/dx.material.orange.light.css" data-active="false" />
14
+ <link rel="dx-theme" data-theme="material.orange.dark" href="/bams-assets/devextreme/css/dx.material.orange.dark.css" data-active="false" />
15
+ <link rel="dx-theme" data-theme="material.purple.light" href="/bams-assets/devextreme/css/dx.material.purple.light.css" data-active="false" />
16
+ <link rel="dx-theme" data-theme="material.purple.dark" href="/bams-assets/devextreme/css/dx.material.purple.dark.css" data-active="false" />
17
+ <link rel="dx-theme" data-theme="material.teal.light" href="/bams-assets/devextreme/css/dx.material.teal.light.css" data-active="false" />
18
+ <link rel="dx-theme" data-theme="material.teal.dark" href="/bams-assets/devextreme/css/dx.material.teal.dark.css" data-active="false" />
19
+ </head>
20
+ <body>
21
+ <noscript>
22
+ <strong
23
+ >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to
24
+ continue.</strong
25
+ >
26
+ </noscript>
27
+ <div id="app"></div>
28
+
29
+ <% if (process.env.NODE_ENV === 'production') { %>
30
+ <script src="/bams-assets/vue3/dist/vue.global.prod.js"></script>
31
+ <script src="/bams-assets/vue-router3/dist/vue-router.global.prod.js"></script>
32
+ <script src="/bams-assets/pinia/dist/pinia.iife.prod.js"></script>
33
+ <% } else { %>
34
+ <script src="/bams-assets/vue3/dist/vue.global.js"></script>
35
+ <script src="/bams-assets/vue-router3/dist/vue-router.global.js"></script>
36
+ <script src="/bams-assets/pinia/dist/pinia.iife.prod.js"></script>
37
+ <% } %>
38
+ <script src="/bams-assets/axios/dist-1.13.2/axios.min.js"></script>
39
+ <!-- built files will be auto injected -->
40
+ </body>
41
+ </html>
package/src/App.vue ADDED
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <a-config-provider :locale="antdLocale" :theme="antdThemeConfig">
3
+ <Layout class="app">
4
+ <Header
5
+ v-if="appStore.showHeader && route.path === '/'"
6
+ class="header-fixed"
7
+ style="padding: 0; height: 51px; box-shadow: 0px 2px 1px 0px rgba(0, 0, 0, 0.07); z-index: 1; margin-bottom: 0px"
8
+ >
9
+ <HeaderComponent :show-toggle-icon="false" />
10
+ </Header>
11
+ <Layout.Content class="content">
12
+ <router-view />
13
+ </Layout.Content>
14
+ </Layout>
15
+ </a-config-provider>
16
+ </template>
17
+
18
+ <script setup>
19
+ import { computed } from "vue";
20
+ import { useRoute } from "vue-router";
21
+ import { theme as antdTheme, Layout } from "ant-design-vue";
22
+ import { useI18nContext } from "@bams-app/i18n";
23
+ import { useAntdThemeConfig, useThemeStore } from "@bams-app/theme";
24
+ import { useAppStore } from "@bams-app/store";
25
+ // 编译阶段根据环境变量通过通用插槽别名选择组件
26
+ import HeaderComponent from "@configurable/header";
27
+ const { Header } = Layout;
28
+ const themeStore = useThemeStore();
29
+ const appStore = useAppStore();
30
+ const route = useRoute();
31
+ const i18n = useI18nContext();
32
+ const antdLocale = computed(() => i18n.antdLocale.value);
33
+
34
+ const antdThemeConfig = useAntdThemeConfig(themeStore, antdTheme);
35
+ </script>
36
+
37
+ <style scoped lang="scss">
38
+ .app {
39
+ min-height: 100vh;
40
+ height: 100vh;
41
+ background: var(--bams-page-bg);
42
+ display: flex;
43
+ flex-direction: column;
44
+ }
45
+
46
+ .header-fixed {
47
+ flex-shrink: 0;
48
+ position: sticky;
49
+ top: 0;
50
+ }
51
+
52
+ .content {
53
+ flex: 1;
54
+ overflow: auto;
55
+ }
56
+ </style>
package/src/main.js ADDED
@@ -0,0 +1,34 @@
1
+ import { createApp } from 'vue'
2
+ import App from './App.vue'
3
+ import router from './router'
4
+ import TargetComponent from "@target-component";
5
+
6
+ import bamsBase from "@bams-app/base";
7
+ import { setupExternalTheme } from './themeConfig';
8
+ import { useLayout } from './useLayout';
9
+
10
+ // 植入 window.ui 以支持动态路由加载
11
+ const componentName = process.env.VUE_APP_COMPONENT_NAME;
12
+ if (componentName) {
13
+ window.ui = window.ui || {};
14
+ window.ui[componentName] = () => Promise.resolve(TargetComponent);
15
+ }
16
+
17
+ async function initApp() {
18
+ // 外部主题注册示例(详见 themeConfig.js),必须在 base 初始化主题之前注册
19
+ setupExternalTheme();
20
+
21
+ const { WorkLayout } = await useLayout();
22
+
23
+ const app = createApp(App)
24
+
25
+ // 关闭Vue警告
26
+ app.config.warnHandler = () => { }
27
+ // 或者使用更严格的方式:
28
+ // app.config.silent = true
29
+ app.use(bamsBase, { router, WorkLayout })
30
+ // app.use(router)
31
+ app.$mount('#app')
32
+ }
33
+
34
+ initApp()
@@ -0,0 +1,30 @@
1
+ import { createRouter, createWebHistory } from 'vue-router'
2
+ import HomeView from '../views/HomeView.vue'
3
+ import ConfigView from '../views/ConfigView.vue'
4
+ import LoginView from '../views/LoginView.vue'
5
+
6
+ const routes = [
7
+ {
8
+ path: '/',
9
+ name: 'index1',
10
+ // redirect: '/bams/work/home',
11
+ component: HomeView
12
+ },
13
+ {
14
+ path: '/config',
15
+ name: 'config',
16
+ component: ConfigView
17
+ },
18
+ {
19
+ path: '/login',
20
+ name: 'login',
21
+ component: LoginView
22
+ },
23
+ ]
24
+
25
+ const router = createRouter({
26
+ history: createWebHistory(import.meta.env.BASE_URL),
27
+ routes
28
+ })
29
+
30
+ export default router
@@ -0,0 +1,32 @@
1
+ import { registerThemeConfig } from "@bams-app/theme";
2
+
3
+ /**
4
+ * 外部主题注册示例:注册自定义主题预设
5
+ * 必须在 base 初始化主题(themeStore.init / setupTheme)之前调用
6
+ */
7
+ export function setupExternalTheme() {
8
+ registerThemeConfig({
9
+ presets: {
10
+ "custom.cyan": {
11
+ label: "定制青",
12
+ primary: "#006d75",
13
+ },
14
+ "custom.red": {
15
+ label: "定制红",
16
+ primary: "#c62828",
17
+ },
18
+ "custom.purple": {
19
+ label: "定制紫",
20
+ primary: "#4527a0",
21
+ },
22
+ },
23
+ modes: {
24
+ light: {
25
+ vars: {
26
+ "--bams-page-bg": "#f3fafa",
27
+ },
28
+ },
29
+ },
30
+ defaultPreset: "custom.cyan",
31
+ });
32
+ }
@@ -0,0 +1,15 @@
1
+ export async function useLayout() {
2
+ const layout = process.env.VUE_APP_LAYOUT || 'pc';
3
+
4
+ const layoutModules = {
5
+ pc: () => import('@configurable/startr-layout'),
6
+ touch: () => import('@bams-app/app-layout/src/layout-touch/index')
7
+ };
8
+
9
+ const loadLayout = layoutModules[layout] || layoutModules.pc;
10
+ const module = await loadLayout();
11
+
12
+ return {
13
+ WorkLayout: module.default
14
+ };
15
+ }
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <div class="dev-server-container">
3
+ <div class="left-panel">
4
+ <h2>组件调试面板</h2>
5
+ <!-- 这里可以添加参数控制和Mock配置 -->
6
+ </div>
7
+ <div class="right-panel">
8
+ <h2>组件渲染区</h2>
9
+ <TargetComponent />
10
+ </div>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup>
15
+ import TargetComponent from "@target-component";
16
+ </script>
17
+
18
+ <style>
19
+ .dev-server-container {
20
+ display: flex;
21
+ height: 100vh;
22
+ }
23
+
24
+ .left-panel {
25
+ width: 300px;
26
+ padding: 20px;
27
+ background: #f5f5f5;
28
+ border-right: 1px solid #ddd;
29
+ }
30
+
31
+ .right-panel {
32
+ flex: 1;
33
+ padding: 20px;
34
+ overflow: auto;
35
+ }
36
+ </style>
@@ -0,0 +1,9 @@
1
+ <template>
2
+ <div class="bams-height-full" style="padding: 16px 19px">
3
+ <TargetComponent />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup>
8
+ import TargetComponent from "@target-component";
9
+ </script>