feat(前端): 登录页与各端布局展示版本号

统一从 package.json 注入 __APP_VERSION__,并在登录页、管理端、学校端、教师端和家长端菜单底部展示一致版本信息,提升发布可识别性。

Made-with: Cursor
This commit is contained in:
zhonghua 2026-03-27 17:36:20 +08:00
parent 3e2ccf40bc
commit 28e189e38f
7 changed files with 160 additions and 47 deletions

View File

@ -62,6 +62,9 @@
</a-menu-item>
</a-menu>
</div>
<div class="sider-version" :title="`版本 v${appVersion}`">
<span>v{{ appVersion }}</span>
</div>
</a-layout-sider>
<a-layout>
@ -133,6 +136,7 @@ import { useUserStore } from '@/stores/user';
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const appVersion = __APP_VERSION__;
const collapsed = ref(false);
const selectedKeys = ref<string[]>(['dashboard']);
@ -222,6 +226,8 @@ $bg-dark: #111827;
background: white !important;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);
border-right: 1px solid $border-color;
display: flex;
flex-direction: column;
.logo {
height: 72px;
@ -314,7 +320,8 @@ $bg-dark: #111827;
}
.sider-menu-wrapper {
height: calc(100vh - 72px);
flex: 1;
min-height: 0;
overflow: auto;
//
@ -332,6 +339,17 @@ $bg-dark: #111827;
}
}
.sider-version {
padding: 10px 12px 14px;
border-top: 1px solid $border-color;
font-size: 12px;
color: #9CA3AF;
text-align: center;
line-height: 1.2;
background: #fff;
flex-shrink: 0;
}
.admin-header {
background: white;
padding: 0 24px;

View File

@ -66,6 +66,7 @@
<!-- 底部版权 -->
<div class="footer">
<span>© 2026 少儿智慧阅读服务平台</span>
<span class="app-version">版本 v{{ appVersion }}</span>
</div>
</div>
</template>
@ -83,6 +84,7 @@ import {
import { useUserStore } from '@/stores/user';
const userStore = useUserStore();
const appVersion = __APP_VERSION__;
// /
const enableDefaultAccount = import.meta.env.VITE_ENABLE_DEFAULT_ACCOUNT === 'true';
@ -413,5 +415,14 @@ $bg-cream: #FEFEFE;
margin-top: 24px;
font-size: 12px;
color: $text-light;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.app-version {
font-size: 11px;
letter-spacing: 0.3px;
}
</style>

View File

@ -46,6 +46,9 @@
</a-menu-item>
</a-menu>
</div>
<div class="sider-version" :title="`版本 v${appVersion}`">
<span>v{{ appVersion }}</span>
</div>
</a-layout-sider>
<!-- 移动端抽屉菜单 -->
@ -60,6 +63,7 @@
</div>
</div>
</template>
<div class="drawer-menu-wrapper">
<a-menu v-model:selectedKeys="selectedKeys" mode="inline" theme="light" @click="handleMobileMenuClick"
class="drawer-menu">
<a-menu-item key="dashboard">
@ -99,8 +103,10 @@
<span>个人信息</span>
</a-menu-item>
</a-menu>
</div>
<div class="drawer-footer">
<div class="drawer-version">版本 v{{ appVersion }}</div>
<a-button block @click="handleLogout" class="logout-btn">
<LogoutOutlined /> 退出登录
</a-button>
@ -191,6 +197,7 @@ import { useUserStore } from '@/stores/user';
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const appVersion = __APP_VERSION__;
const collapsed = ref(false);
const selectedKeys = ref(['dashboard']);
@ -335,6 +342,8 @@ $bg-light: #FAFAFA;
background: white !important;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.06);
border-right: 1px solid $border-color;
display: flex;
flex-direction: column;
.logo {
height: 80px;
@ -407,7 +416,8 @@ $bg-light: #FAFAFA;
}
.sider-menu-wrapper {
height: calc(100vh - 80px);
flex: 1;
min-height: 0;
overflow: auto;
//
@ -425,6 +435,17 @@ $bg-light: #FAFAFA;
}
}
.sider-version {
padding: 10px 12px 14px;
border-top: 1px solid $border-color;
font-size: 12px;
color: #9CA3AF;
text-align: center;
line-height: 1.2;
background: #fff;
flex-shrink: 0;
}
//
.parent-header {
background: white;
@ -488,6 +509,13 @@ $bg-light: #FAFAFA;
//
.mobile-drawer {
:deep(.ant-drawer-body) {
display: flex;
flex-direction: column;
padding: 0 0 16px;
overflow: hidden;
}
.drawer-header {
display: flex;
align-items: center;
@ -539,12 +567,25 @@ $bg-light: #FAFAFA;
}
}
.drawer-menu-wrapper {
flex: 1;
min-height: 0;
overflow: auto;
padding: 0 12px;
}
.drawer-footer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 16px;
border-top: 1px solid $border-color;
background: #fff;
.drawer-version {
font-size: 12px;
color: #9CA3AF;
text-align: center;
margin-bottom: 10px;
line-height: 1.2;
}
.logout-btn {
height: 44px;

View File

@ -144,6 +144,9 @@
</a-sub-menu>
</a-menu>
</div>
<div class="sider-version" :title="`版本 v${appVersion}`">
<span>v{{ appVersion }}</span>
</div>
</a-layout-sider>
<a-layout>
@ -225,6 +228,7 @@ import { useUserStore } from '@/stores/user';
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const appVersion = __APP_VERSION__;
const collapsed = ref(false);
const selectedKeys = ref(['dashboard']);
@ -329,6 +333,8 @@ $bg-light: #FAFAFA;
background: white !important;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.06);
border-right: 1px solid $border-color;
display: flex;
flex-direction: column;
.logo {
height: 80px;
@ -457,7 +463,8 @@ $bg-light: #FAFAFA;
}
.sider-menu-wrapper {
height: calc(100vh - 80px);
flex: 1;
min-height: 0;
overflow: auto;
//
@ -475,6 +482,17 @@ $bg-light: #FAFAFA;
}
}
.sider-version {
padding: 10px 12px 14px;
border-top: 1px solid $border-color;
font-size: 12px;
color: #9CA3AF;
text-align: center;
line-height: 1.2;
background: #fff;
flex-shrink: 0;
}
.school-header {
background: white;
padding: 0 24px;

View File

@ -69,6 +69,9 @@
</a-menu-item>
</a-menu>
</div>
<div class="sider-version" :title="`版本 v${appVersion}`">
<span>v{{ appVersion }}</span>
</div>
</a-layout-sider>
<a-layout>
@ -140,6 +143,7 @@ import { useUserStore } from '@/stores/user';
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const appVersion = __APP_VERSION__;
const collapsed = ref(false);
const selectedKeys = ref(['dashboard']);
@ -225,6 +229,8 @@ $bg-light: #FAFAFA;
background: white !important;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.06);
border-right: 1px solid $border-color;
display: flex;
flex-direction: column;
.logo {
height: 80px;
@ -316,7 +322,8 @@ $bg-light: #FAFAFA;
}
.sider-menu-wrapper {
height: calc(100vh - 80px);
flex: 1;
min-height: 0;
overflow: auto;
//
@ -334,6 +341,17 @@ $bg-light: #FAFAFA;
}
}
.sider-version {
padding: 10px 12px 14px;
border-top: 1px solid $border-color;
font-size: 12px;
color: #9CA3AF;
text-align: center;
line-height: 1.2;
background: #fff;
flex-shrink: 0;
}
.teacher-header {
background: white;
padding: 0 24px;

View File

@ -9,3 +9,5 @@ interface ImportMetaEnv {
interface ImportMeta {
readonly env: ImportMetaEnv
}
declare const __APP_VERSION__: string

View File

@ -7,13 +7,18 @@ import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
import viteCompression from 'vite-plugin-compression';
import fileRouter from 'unplugin-vue-router/vite';
import UnoCSS from 'unocss/vite';
import packageJson from './package.json';
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), '');
const port = parseInt(env.VITE_APP_PORT) || 5173;
const backendPort = env.VITE_BACKEND_PORT || '8480';
const appVersion = packageJson.version;
return {
define: {
__APP_VERSION__: JSON.stringify(appVersion),
},
plugins: [
vue(),
UnoCSS(),