diff --git a/apps/designer/.vscode/extensions.json b/apps/designer/.vscode/extensions.json index 4881863..b338073 100644 --- a/apps/designer/.vscode/extensions.json +++ b/apps/designer/.vscode/extensions.json @@ -1,5 +1,3 @@ { - "recommendations": [ - "vue.volar" - ] -} \ No newline at end of file + "recommendations": ["vue.volar"] +} diff --git a/apps/designer/package.json b/apps/designer/package.json index 7a94069..b814ae7 100644 --- a/apps/designer/package.json +++ b/apps/designer/package.json @@ -13,17 +13,17 @@ "clean": "rimraf node_modules" }, "dependencies": { - "@vtj/core": "^0.10.10", - "@vtj/designer": "0.10.10", - "@vtj/icons": "0.10.10", - "@vtj/local": "^0.10.10", - "@vtj/materials": "^0.10.10", + "@vtj/core": "^0.10.12", + "@vtj/designer": "0.10.12", + "@vtj/icons": "0.10.12", + "@vtj/local": "^0.10.12", + "@vtj/materials": "^0.10.12", "@vtj/node": "0.10.2", - "@vtj/pro": "^0.10.10", - "@vtj/renderer": "^0.10.10", - "@vtj/ui": "^0.10.10", - "@vtj/utils": "0.10.10", - "@vtj/web": "^0.10.10", + "@vtj/pro": "^0.10.12", + "@vtj/renderer": "^0.10.12", + "@vtj/ui": "^0.10.12", + "@vtj/utils": "0.10.12", + "@vtj/web": "^0.10.12", "axios": "^1.8.1", "element-plus": "^2.9.4", "licia-es": "^1.46.0", diff --git a/apps/designer/scripts/clean.mjs b/apps/designer/scripts/clean.mjs index 69ab23c..778bc8d 100644 --- a/apps/designer/scripts/clean.mjs +++ b/apps/designer/scripts/clean.mjs @@ -1,7 +1,8 @@ -import { rm } from 'fs/promises'; +import { rm } from 'node:fs/promises'; + console.log('开始清理...'); await rm('node_modules', { recursive: true, force: true }); await rm('dist', { recursive: true, force: true }); await rm('package-lock.json', { recursive: true, force: true }); await rm('pnpm-lock.yaml', { recursive: true, force: true }); -console.log('开始完成!'); \ No newline at end of file +console.log('开始完成!'); diff --git a/apps/designer/src/auto-imports.d.ts b/apps/designer/src/auto-imports.d.ts index dc73995..f6e2bab 100644 --- a/apps/designer/src/auto-imports.d.ts +++ b/apps/designer/src/auto-imports.d.ts @@ -6,98 +6,83 @@ // biome-ignore lint: disable export {} declare global { - const EffectScope: (typeof import('vue'))['EffectScope']; - const acceptHMRUpdate: (typeof import('pinia'))['acceptHMRUpdate']; - const computed: (typeof import('vue'))['computed']; - const createApp: (typeof import('vue'))['createApp']; - const createPinia: (typeof import('pinia'))['createPinia']; - const customRef: (typeof import('vue'))['customRef']; - const defineAsyncComponent: (typeof import('vue'))['defineAsyncComponent']; - const defineComponent: (typeof import('vue'))['defineComponent']; - const defineStore: (typeof import('pinia'))['defineStore']; - const effectScope: (typeof import('vue'))['effectScope']; - const getActivePinia: (typeof import('pinia'))['getActivePinia']; - const getCurrentInstance: (typeof import('vue'))['getCurrentInstance']; - const getCurrentScope: (typeof import('vue'))['getCurrentScope']; - const h: (typeof import('vue'))['h']; - const inject: (typeof import('vue'))['inject']; - const isProxy: (typeof import('vue'))['isProxy']; - const isReactive: (typeof import('vue'))['isReactive']; - const isReadonly: (typeof import('vue'))['isReadonly']; - const isRef: (typeof import('vue'))['isRef']; - const mapActions: (typeof import('pinia'))['mapActions']; - const mapGetters: (typeof import('pinia'))['mapGetters']; - const mapState: (typeof import('pinia'))['mapState']; - const mapStores: (typeof import('pinia'))['mapStores']; - const mapWritableState: (typeof import('pinia'))['mapWritableState']; - const markRaw: (typeof import('vue'))['markRaw']; - const nextTick: (typeof import('vue'))['nextTick']; - const onActivated: (typeof import('vue'))['onActivated']; - const onBeforeMount: (typeof import('vue'))['onBeforeMount']; - const onBeforeRouteLeave: (typeof import('vue-router'))['onBeforeRouteLeave']; - const onBeforeRouteUpdate: (typeof import('vue-router'))['onBeforeRouteUpdate']; - const onBeforeUnmount: (typeof import('vue'))['onBeforeUnmount']; - const onBeforeUpdate: (typeof import('vue'))['onBeforeUpdate']; - const onDeactivated: (typeof import('vue'))['onDeactivated']; - const onErrorCaptured: (typeof import('vue'))['onErrorCaptured']; - const onMounted: (typeof import('vue'))['onMounted']; - const onRenderTracked: (typeof import('vue'))['onRenderTracked']; - const onRenderTriggered: (typeof import('vue'))['onRenderTriggered']; - const onScopeDispose: (typeof import('vue'))['onScopeDispose']; - const onServerPrefetch: (typeof import('vue'))['onServerPrefetch']; - const onUnmounted: (typeof import('vue'))['onUnmounted']; - const onUpdated: (typeof import('vue'))['onUpdated']; - const onWatcherCleanup: (typeof import('vue'))['onWatcherCleanup']; - const provide: (typeof import('vue'))['provide']; - const reactive: (typeof import('vue'))['reactive']; - const readonly: (typeof import('vue'))['readonly']; - const ref: (typeof import('vue'))['ref']; - const resolveComponent: (typeof import('vue'))['resolveComponent']; - const setActivePinia: (typeof import('pinia'))['setActivePinia']; - const setMapStoreSuffix: (typeof import('pinia'))['setMapStoreSuffix']; - const shallowReactive: (typeof import('vue'))['shallowReactive']; - const shallowReadonly: (typeof import('vue'))['shallowReadonly']; - const shallowRef: (typeof import('vue'))['shallowRef']; - const storeToRefs: (typeof import('pinia'))['storeToRefs']; - const toRaw: (typeof import('vue'))['toRaw']; - const toRef: (typeof import('vue'))['toRef']; - const toRefs: (typeof import('vue'))['toRefs']; - const toValue: (typeof import('vue'))['toValue']; - const triggerRef: (typeof import('vue'))['triggerRef']; - const unref: (typeof import('vue'))['unref']; - const useAttrs: (typeof import('vue'))['useAttrs']; - const useCssModule: (typeof import('vue'))['useCssModule']; - const useCssVars: (typeof import('vue'))['useCssVars']; - const useId: (typeof import('vue'))['useId']; - const useLink: (typeof import('vue-router'))['useLink']; - const useModel: (typeof import('vue'))['useModel']; - const useRoute: (typeof import('vue-router'))['useRoute']; - const useRouter: (typeof import('vue-router'))['useRouter']; - const useSlots: (typeof import('vue'))['useSlots']; - const useTemplateRef: (typeof import('vue'))['useTemplateRef']; - const watch: (typeof import('vue'))['watch']; - const watchEffect: (typeof import('vue'))['watchEffect']; - const watchPostEffect: (typeof import('vue'))['watchPostEffect']; - const watchSyncEffect: (typeof import('vue'))['watchSyncEffect']; + const EffectScope: typeof import('vue')['EffectScope'] + const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] + const computed: typeof import('vue')['computed'] + const createApp: typeof import('vue')['createApp'] + const createPinia: typeof import('pinia')['createPinia'] + const customRef: typeof import('vue')['customRef'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const defineStore: typeof import('pinia')['defineStore'] + const effectScope: typeof import('vue')['effectScope'] + const getActivePinia: typeof import('pinia')['getActivePinia'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const h: typeof import('vue')['h'] + const inject: typeof import('vue')['inject'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const mapActions: typeof import('pinia')['mapActions'] + const mapGetters: typeof import('pinia')['mapGetters'] + const mapState: typeof import('pinia')['mapState'] + const mapStores: typeof import('pinia')['mapStores'] + const mapWritableState: typeof import('pinia')['mapWritableState'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const provide: typeof import('vue')['provide'] + const reactive: typeof import('vue')['reactive'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const setActivePinia: typeof import('pinia')['setActivePinia'] + const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const storeToRefs: typeof import('pinia')['storeToRefs'] + const toRaw: typeof import('vue')['toRaw'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const unref: typeof import('vue')['unref'] + const useAttrs: typeof import('vue')['useAttrs'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVars: typeof import('vue')['useCssVars'] + const useId: typeof import('vue')['useId'] + const useLink: typeof import('vue-router')['useLink'] + const useModel: typeof import('vue')['useModel'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSlots: typeof import('vue')['useSlots'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] } // for type re-export declare global { // @ts-ignore - export type { - Component, - ComponentPublicInstance, - ComputedRef, - DirectiveBinding, - ExtractDefaultPropTypes, - ExtractPropTypes, - ExtractPublicPropTypes, - InjectionKey, - PropType, - Ref, - MaybeRef, - MaybeRefOrGetter, - VNode, - WritableComputedRef - } from 'vue'; - import('vue'); + export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') } diff --git a/apps/designer/src/constants/env.ts b/apps/designer/src/constants/env.ts index cf60819..797a091 100644 --- a/apps/designer/src/constants/env.ts +++ b/apps/designer/src/constants/env.ts @@ -1,2 +1 @@ -// @ts-ignore -export const currentEnv = __APP_ENV__; +export const currentEnv = import.meta.env; diff --git a/apps/designer/src/env.d.ts b/apps/designer/src/env.d.ts index 7c3dee3..ffc0389 100644 --- a/apps/designer/src/env.d.ts +++ b/apps/designer/src/env.d.ts @@ -3,11 +3,11 @@ declare module '*.vue' { import type { DefineComponent } from 'vue'; - const component: DefineComponent<{}, {}, any>; + const component: DefineComponent; export default component; } -declare namespace NodeJS { +declare namespace _NodeJS { interface ProcessEnv { [key: string]: any; } diff --git a/apps/designer/src/io/materials.ts b/apps/designer/src/io/materials.ts index cbdf9ee..be03b42 100644 --- a/apps/designer/src/io/materials.ts +++ b/apps/designer/src/io/materials.ts @@ -2,6 +2,16 @@ import type { MaterialDescription } from '@vtj/core'; import instance from './instance'; +type MaterialData = { + created_at?: string; + // 从原interface合并的字段 + id?: number; + name?: string; + project_id: number; + updated_at?: string; + value: Record; +}; + // 定义响应类型 interface MaterialResponse { code: number; @@ -51,16 +61,6 @@ export const getMaterials = async (id: number): Promise => { return response.data; }; -type MaterialData = { - created_at?: string; - // 从原interface合并的字段 - id?: number; - name?: string; - project_id: number; - updated_at?: string; - value: Record; -}; - function transformMaterialData(data: MaterialData) { return { ...data, diff --git a/apps/designer/src/service/index.ts b/apps/designer/src/service/index.ts index f6df930..c7e5676 100644 --- a/apps/designer/src/service/index.ts +++ b/apps/designer/src/service/index.ts @@ -1,3 +1,5 @@ +// @ts-nocheck 忽略所有类型检查 + import type { BlockFile, BlockSchema, @@ -6,8 +8,8 @@ import type { HistorySchema, MaterialDescription, NodeFromPlugin, - PageFile, - ProjectSchema + ProjectSchema as OriginalProjectSchema, + PageFile } from '@vtj/core'; import { @@ -47,17 +49,22 @@ const stringifyFields = new Set([ 'pages' ]); +// 扩展原始类型 +type ProjectSchema = Omit & { + projectId: number | string; +}; + let initProject: ProjectSchema; export class LowCodeService extends BaseService { - public api = (type: string, data: any): Promise => { + public api = (_type: string, _data: any): Promise => { // console.log('api', type, data); return Promise.resolve(true); }; public getExtension(): Promise { const extension = storage.get('extension'); - console.log('ExtensionConfig', extension); + // console.log('ExtensionConfig', extension); return Promise.resolve(extension as ExtensionConfig | undefined); } @@ -65,10 +72,9 @@ export class LowCodeService extends BaseService { return getLowCodeFile(id).then((lowCodeFile) => { return lowCodeFile.dsl ? Promise.resolve(lowCodeFile.dsl as BlockSchema) - : Promise.reject(null); + : Promise.reject(new Error('文件不存在')); }); } - public async getHistory(fileId: string): Promise { const histories = await getLowCodeHistories({ project_id: initProject.id, @@ -95,13 +101,12 @@ export class LowCodeService extends BaseService { } public getPluginMaterial( - from: NodeFromPlugin + _from: NodeFromPlugin ): Promise { return Promise.resolve(null); } public async init(project: ProjectSchema): Promise { - console.log('init', project); initProject = project; const remoteProject = await getProject(initProject.id); const arrayFields = ['pages', 'blocks', 'apis', 'meta', 'dependencies']; @@ -110,9 +115,7 @@ export class LowCodeService extends BaseService { remoteProject[field] = []; } }); - console.log('remoteProject', remoteProject); const model = new ProjectModel(remoteProject); - console.log('model', model || { id: initProject.id }); const dsl = model.toDsl(); return dsl; } @@ -147,7 +150,6 @@ export class LowCodeService extends BaseService { } public async saveFile(file: BlockSchema): Promise { - console.log('saveFile', file); if (file.id) { const existFile = await getLowCodeFile(file.id); return existFile.file_id @@ -178,7 +180,7 @@ export class LowCodeService extends BaseService { return false; } - public async saveHistory(history: HistorySchema): Promise { + public async saveHistory(_history: HistorySchema): Promise { return true; } @@ -201,25 +203,20 @@ export class LowCodeService extends BaseService { materials: Map ): Promise { const materialData = mapToObject(materials); - // storage.save(`materials_${project.id}`, materialData); - // console.log('saveMaterials', materialData); - // @ts-ignore const existMaterials = await getLowCodeMaterials(project?.id); - if (existMaterials) { - // 更新物料 - await updateLowCodeMaterials({ - project_id: project?.id, - value: materialData - }); - } else { - // 创建物料 - await postLowCodeMaterials({ - project_id: project?.id, - value: materialData - }); - } - // @ts-ignore + // 根据是否存在物料决定更新或创建 + existMaterials + ? await updateLowCodeMaterials({ + project_id: project?.id, + value: materialData + }) + : await postLowCodeMaterials({ + project_id: project?.id, + value: materialData + }); + + // @ts-ignore - 暂时禁用此行代码,保留以备后续可能需要删除物料的操作 // await deleteLowCodeMaterials(project.id); return true; } @@ -238,8 +235,7 @@ export class LowCodeService extends BaseService { return true; } - protected uploader = (file: File, projectId: string): Promise => { - // console.log('uploader', file, projectId); + protected uploader = (_file: File, _projectId: string): Promise => { return Promise.resolve(true); }; } diff --git a/apps/designer/src/views/index.vue b/apps/designer/src/views/index.vue index 63be00b..23a3a20 100644 --- a/apps/designer/src/views/index.vue +++ b/apps/designer/src/views/index.vue @@ -31,7 +31,7 @@ onMounted(async () => { req.headers.set('Authorization', `Bearer ${model.accessToken}`); return req; }); - const engine = new Engine({ + const _engine = new Engine({ container, service, project: { diff --git a/apps/designer/tsconfig.json b/apps/designer/tsconfig.json index b5e02d3..95750e4 100644 --- a/apps/designer/tsconfig.json +++ b/apps/designer/tsconfig.json @@ -1,27 +1,19 @@ { "extends": "./node_modules/@vtj/cli/config/tsconfig.web.json", "compilerOptions": { - "noUnusedLocals": false, - "noUnusedParameters": false, "baseUrl": "./", "paths": { - "@/*": [ - "src/*" - ], - "$vtj/*": [ - ".vtj/*" - ] - } + "@/*": ["src/*"], + "$vtj/*": [".vtj/*"] + }, + "noUnusedLocals": false, + "noUnusedParameters": false }, - "include": [ - "src" - ], - "exclude": [ - ".vtj", - ], "references": [ { "path": "./tsconfig.node.json" } - ] -} \ No newline at end of file + ], + "include": ["src"], + "exclude": [".vtj"] +} diff --git a/apps/designer/tsconfig.node.json b/apps/designer/tsconfig.node.json index d0adb28..881ba04 100644 --- a/apps/designer/tsconfig.node.json +++ b/apps/designer/tsconfig.node.json @@ -1,13 +1,10 @@ { "compilerOptions": { "composite": true, - "skipLibCheck": true, "module": "ESNext", "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "skipLibCheck": true }, - "include": [ - "vite.config.ts", - "proxy.config.ts" - ] -} \ No newline at end of file + "include": ["vite.config.ts", "proxy.config.ts"] +} diff --git a/apps/designer/vite.config.ts b/apps/designer/vite.config.ts index 2ab22e7..897670c 100644 --- a/apps/designer/vite.config.ts +++ b/apps/designer/vite.config.ts @@ -28,7 +28,6 @@ const config = createViteConfig({ ] }); -// @ts-ignore export default defineConfig(({ mode }) => { console.log('mode', mode); // 加载环境变量(支持 .env.development/.env.production) @@ -37,7 +36,7 @@ export default defineConfig(({ mode }) => { ...config, server: { https: true, - port: env.VITE_PORT, + port: Number(env.VITE_PORT), host: true }, define: { diff --git a/apps/platform/src/io/user.ts b/apps/platform/src/io/user.ts index 34dfaa5..9b6d633 100644 --- a/apps/platform/src/io/user.ts +++ b/apps/platform/src/io/user.ts @@ -1,6 +1,6 @@ import instance from './instance'; -export const login = async (data: { username: string; password: string }) => { +export const login = async (data: { password: string; username: string }) => { const response = await instance.post('/login', data); return response.data; }; diff --git a/apps/renderer/farm.config.ts b/apps/renderer/farm.config.ts index 8879a74..0408169 100644 --- a/apps/renderer/farm.config.ts +++ b/apps/renderer/farm.config.ts @@ -7,13 +7,16 @@ import mkcert from 'vite-plugin-mkcert'; // @ts-ignore export default defineConfig(({ mode }) => { console.log('mode', mode); - const env = loadEnv(mode, process.cwd(), ['VITE_', 'Y_CODE_']); + const env = loadEnv(mode, process.cwd(), ['VITE_']); + const isDev = env.VITE_NODE_ENV === 'development'; return { - server: { - port: Number(env.VITE_PORT), - cors: true, - }, + server: isDev + ? { + port: Number(env.VITE_PORT), + cors: true, + } + : undefined, // @ts-ignore coding vitePlugins: [vue(), mkcert({ source: 'coding' })], compilation: { diff --git a/apps/renderer/package.json b/apps/renderer/package.json index 9225d97..86f1fc0 100644 --- a/apps/renderer/package.json +++ b/apps/renderer/package.json @@ -3,11 +3,11 @@ "version": "1.0.0", "type": "module", "scripts": { - "dev": "farm dev --mode development", - "start": "farm start --mode production", - "build": "farm build --mode production", - "build:staging": "farm build --mode staging", - "preview": "farm preview", + "dev": "vite dev --mode development", + "start": "vite start --mode production", + "build": "vite build --mode production", + "build:staging": "vite build --mode staging", + "preview": "vite preview", "clean:lock": "rimraf pnpm-lock.yaml && rimraf package.lock.json", "clean:lib": "rimraf node_modules", "test": "echo 'test", @@ -17,14 +17,14 @@ "@iframe-resizer/child": "^5.3.3", "@sy/web-vitals": "workspace:*", "@tanstack/vue-query": "^5.66.9", - "@vtj/core": "^0.10.10", - "@vtj/icons": "0.10.10", - "@vtj/materials": "^0.10.10", - "@vtj/pro": "^0.10.10", - "@vtj/renderer": "^0.10.10", - "@vtj/ui": "^0.10.10", - "@vtj/utils": "^0.10.10", - "@vtj/web": "^0.10.10", + "@vtj/core": "^0.10.12", + "@vtj/icons": "0.10.12", + "@vtj/materials": "^0.10.12", + "@vtj/pro": "^0.10.12", + "@vtj/renderer": "^0.10.12", + "@vtj/ui": "^0.10.12", + "@vtj/utils": "^0.10.12", + "@vtj/web": "^0.10.12", "axios": "catalog:", "core-js": "^3.40.0", "element-plus": "catalog:", @@ -35,9 +35,10 @@ }, "devDependencies": { "@farmfe/cli": "^1.0.4", - "@farmfe/core": "^1.6.6", + "@farmfe/core": "^1.6.7", "@vitejs/plugin-vue": "^5.2.1", "@vtj/cli": "^0.10.2", + "vite": "catalog:", "vite-plugin-mkcert": "catalog:" } } diff --git a/apps/renderer/src/App.vue b/apps/renderer/src/App.vue index c4ffa15..79befc5 100644 --- a/apps/renderer/src/App.vue +++ b/apps/renderer/src/App.vue @@ -1,12 +1,14 @@ + + diff --git a/apps/y-code-v1/src/views/config-manage/view-cfg/index.vue b/apps/y-code-v1/src/views/config-manage/view-cfg/index.vue index 9362679..4f87df1 100644 --- a/apps/y-code-v1/src/views/config-manage/view-cfg/index.vue +++ b/apps/y-code-v1/src/views/config-manage/view-cfg/index.vue @@ -1,84 +1,16 @@ - - + +