v0.3.0: 单 sources 入口 + 路径后缀覆盖约定
破坏性重构。框架对外只暴露一个 `sources` glob 入口,消费侧任何 .vue 都按文件路径后缀匹配同后缀覆盖: - shrimp/components/<name>.vue 同后缀覆盖框架内置(login/layout/topbar/ShrimpTable/...) - shrimp/components/fields/Field<X>.vue 注册类型 <x>(首字母小写) - shrimp/module/<key>.vue 业务模块 变更: - 删除 customFields / moduleSources / overrideField / registerField 旧入口 - 删除 fieldOverrides Map,字段表纯靠 glob 扫描注册 - 框架内 .vue 对可覆盖 peer 改用 defineAsyncComponent(resolveVue(...)) (login → ShrimpLangSwitch / layout → sideM/navMenu/topbar/userbar/logo / ShrimpTable → ShrimpEditDrawer/ShrimpFilterDrawer/...) - views/ 全部并入 components/,App.vue 上提到 src/ 根 - LangSwitch → ShrimpLangSwitch,PowerTree → ShrimpPowerTree - module/FieldRelativeTime.vue → components/fields/FieldRelativeTime.vue - module/user.vue 改用 #column-updatedAt slot 替代旧的 overrideField 字段类型约定从 'field' + Name 改为 lowercase-first(FieldString → 'string'), 内置和消费侧统一。
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
<template>
|
||||
<div class="mobile-nav-button" @click="showMobileNav">
|
||||
<el-icon><el-icon-menu /></el-icon>
|
||||
</div>
|
||||
|
||||
<el-drawer
|
||||
:size="240"
|
||||
v-model="nav"
|
||||
direction="ltr"
|
||||
:with-header="false"
|
||||
destroy-on-close
|
||||
>
|
||||
<el-container class="mobile-nav">
|
||||
<el-header>
|
||||
<logo/>
|
||||
</el-header>
|
||||
<el-main>
|
||||
<el-scrollbar>
|
||||
<el-menu
|
||||
:default-active="$route.fullPath"
|
||||
@select="select"
|
||||
router
|
||||
background-color="#212d3d"
|
||||
text-color="#fff"
|
||||
active-text-color="#409EFF"
|
||||
>
|
||||
<navMenu :navMenus="vueAdmin.menuTree"></navMenu>
|
||||
</el-menu>
|
||||
</el-scrollbar>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { defineAsyncComponent, ref } from "vue";
|
||||
import { vueAdmin, resolveVue } from '../VueAdmin';
|
||||
|
||||
const navMenu = defineAsyncComponent(resolveVue('components/navMenu.vue'));
|
||||
const Logo = defineAsyncComponent(resolveVue('components/logo.vue'));
|
||||
|
||||
let nav = ref(false);
|
||||
function showMobileNav() { nav.value = true; }
|
||||
function select() {}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.mobile-nav-button {
|
||||
position: fixed;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
z-index: 10;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
background: #409eff;
|
||||
box-shadow: 0 2px 12px 0 rgba(64, 158, 255, 1);
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.mobile-nav-button i {
|
||||
color: #fff;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.mobile-nav {
|
||||
background: #212d3d;
|
||||
}
|
||||
.mobile-nav .el-header {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
}
|
||||
.mobile-nav .el-main {
|
||||
padding: 0;
|
||||
}
|
||||
.mobile-nav .logo-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-weight: bold;
|
||||
font-size: 20px;
|
||||
color: #fff;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user