mirror of
https://github.com/jekip/naive-ui-admin.git
synced 2026-02-10 08:22:27 +08:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d9cac8064 | ||
|
|
b8f8334539 | ||
|
|
361a2a14c7 | ||
|
|
dd4e6c1670 | ||
|
|
85d39add87 | ||
|
|
20da92aeab | ||
|
|
57245d21ee | ||
|
|
f97a94e74c | ||
|
|
fd6fd723d7 | ||
|
|
da5231b384 | ||
|
|
97ae37efd0 | ||
|
|
b19430170f | ||
|
|
b642d28815 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "naive-ui-admin",
|
"name": "naive-ui-admin",
|
||||||
"version": "1.5",
|
"version": "1.5.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Ahjung",
|
"name": "Ahjung",
|
||||||
"email": "735878602@qq.com",
|
"email": "735878602@qq.com",
|
||||||
|
|||||||
@@ -41,6 +41,9 @@
|
|||||||
primaryColor: designStore.appTheme,
|
primaryColor: designStore.appTheme,
|
||||||
primaryColorHover: '#57a3f3',
|
primaryColorHover: '#57a3f3',
|
||||||
},
|
},
|
||||||
|
LoadingBar: {
|
||||||
|
colorLoading: designStore.appTheme,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-loading-bar-provider>
|
<n-loading-bar-provider>
|
||||||
<LoadingContent />
|
|
||||||
<n-dialog-provider>
|
<n-dialog-provider>
|
||||||
<DialogContent />
|
<DialogContent />
|
||||||
<n-notification-provider>
|
<n-notification-provider>
|
||||||
@@ -21,7 +20,6 @@
|
|||||||
NMessageProvider,
|
NMessageProvider,
|
||||||
NLoadingBarProvider,
|
NLoadingBarProvider,
|
||||||
} from 'naive-ui';
|
} from 'naive-ui';
|
||||||
import { LoadingContent } from '@/components/LoadingContent';
|
|
||||||
import { MessageContent } from '@/components/MessageContent';
|
import { MessageContent } from '@/components/MessageContent';
|
||||||
import { DialogContent } from '@/components/DialogContent';
|
import { DialogContent } from '@/components/DialogContent';
|
||||||
|
|
||||||
@@ -32,7 +30,6 @@
|
|||||||
NNotificationProvider,
|
NNotificationProvider,
|
||||||
NMessageProvider,
|
NMessageProvider,
|
||||||
NLoadingBarProvider,
|
NLoadingBarProvider,
|
||||||
LoadingContent,
|
|
||||||
MessageContent,
|
MessageContent,
|
||||||
DialogContent,
|
DialogContent,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -226,7 +226,7 @@
|
|||||||
|
|
||||||
function togNavTheme(theme) {
|
function togNavTheme(theme) {
|
||||||
settingStore.navTheme = theme;
|
settingStore.navTheme = theme;
|
||||||
if (settingStore.navMode === 'horizontal' && theme === 'light') {
|
if (settingStore.navMode === 'horizontal' && ['light'].includes(theme)) {
|
||||||
settingStore.navTheme = 'dark';
|
settingStore.navTheme = 'dark';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -237,11 +237,11 @@
|
|||||||
|
|
||||||
function togNavMode(mode) {
|
function togNavMode(mode) {
|
||||||
settingStore.navMode = mode;
|
settingStore.navMode = mode;
|
||||||
if (mode === 'horizontal') {
|
// if (mode === 'header-dark') {
|
||||||
settingStore.setNavTheme('light');
|
// settingStore.setNavTheme('dark');
|
||||||
} else {
|
// } else {
|
||||||
settingStore.setNavTheme('dark');
|
// settingStore.setNavTheme('light');
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-header" :class="{ 'layout-header-light': !(navTheme == 'header-dark') }">
|
<div class="layout-header">
|
||||||
<!--顶部菜单-->
|
<!--顶部菜单-->
|
||||||
<div class="layout-header-left" v-if="navMode === 'horizontal'">
|
<div class="layout-header-left" v-if="navMode === 'horizontal'">
|
||||||
<AsideMenu v-model:collapsed="collapsed" mode="horizontal" class="n-menu-horizontal-light" />
|
<AsideMenu v-model:collapsed="collapsed" :inverted="getInverted" mode="horizontal" />
|
||||||
</div>
|
</div>
|
||||||
<!--左侧菜单-->
|
<!--左侧菜单-->
|
||||||
<div class="layout-header-left" v-else>
|
<div class="layout-header-left" v-else>
|
||||||
@@ -131,6 +131,9 @@
|
|||||||
collapsed: {
|
collapsed: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
},
|
},
|
||||||
|
inverted: {
|
||||||
|
type: Boolean,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
@@ -153,6 +156,11 @@
|
|||||||
crumbsSetting: getCrumbsSetting,
|
crumbsSetting: getCrumbsSetting,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const getInverted = computed(() => {
|
||||||
|
const navTheme = unref(getNavTheme);
|
||||||
|
return ['light', 'header-dark'].includes(navTheme) ? props.inverted : !props.inverted;
|
||||||
|
});
|
||||||
|
|
||||||
const getChangeStyle = computed(() => {
|
const getChangeStyle = computed(() => {
|
||||||
const { collapsed } = props;
|
const { collapsed } = props;
|
||||||
const { minMenuWidth, menuWidth }: any = unref(getMenuSetting);
|
const { minMenuWidth, menuWidth }: any = unref(getMenuSetting);
|
||||||
@@ -305,6 +313,7 @@
|
|||||||
reloadPage,
|
reloadPage,
|
||||||
drawerSetting,
|
drawerSetting,
|
||||||
openSetting,
|
openSetting,
|
||||||
|
getInverted,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -342,6 +351,10 @@
|
|||||||
.n-breadcrumb {
|
.n-breadcrumb {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&-menu {
|
||||||
|
color: var(--text-color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&-right {
|
&-right {
|
||||||
|
|||||||
@@ -557,6 +557,7 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
|
||||||
span {
|
span {
|
||||||
float: left;
|
float: left;
|
||||||
|
|||||||
@@ -19,8 +19,8 @@
|
|||||||
</NLayoutSider>
|
</NLayoutSider>
|
||||||
|
|
||||||
<NLayout :inverted="inverted">
|
<NLayout :inverted="inverted">
|
||||||
<NLayoutHeader :inverted="inverted" :position="fixedHeader">
|
<NLayoutHeader :inverted="getHeaderInverted" :position="fixedHeader">
|
||||||
<PageHeader v-model:collapsed="collapsed" />
|
<PageHeader v-model:collapsed="collapsed" :inverted="inverted" />
|
||||||
</NLayoutHeader>
|
</NLayoutHeader>
|
||||||
|
|
||||||
<NLayoutContent
|
<NLayoutContent
|
||||||
@@ -62,9 +62,9 @@
|
|||||||
import { MainView } from './components/Main';
|
import { MainView } from './components/Main';
|
||||||
import { AsideMenu } from './components/Menu';
|
import { AsideMenu } from './components/Menu';
|
||||||
import { PageHeader } from './components/Header';
|
import { PageHeader } from './components/Header';
|
||||||
import { PageFooter } from './components/Footer';
|
|
||||||
import { useProjectSetting } from '@/hooks/setting/useProjectSetting';
|
import { useProjectSetting } from '@/hooks/setting/useProjectSetting';
|
||||||
import { useDesignSetting } from '@/hooks/setting/useDesignSetting';
|
import { useDesignSetting } from '@/hooks/setting/useDesignSetting';
|
||||||
|
import { useLoadingBar } from "naive-ui";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'Layout',
|
name: 'Layout',
|
||||||
@@ -74,7 +74,6 @@
|
|||||||
PageHeader,
|
PageHeader,
|
||||||
AsideMenu,
|
AsideMenu,
|
||||||
Logo,
|
Logo,
|
||||||
PageFooter,
|
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const { getDarkTheme } = useDesignSetting();
|
const { getDarkTheme } = useDesignSetting();
|
||||||
@@ -114,6 +113,11 @@
|
|||||||
return ['dark', 'header-dark'].includes(unref(getNavTheme));
|
return ['dark', 'header-dark'].includes(unref(getNavTheme));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const getHeaderInverted = computed(() => {
|
||||||
|
const navTheme = unref(getNavTheme);
|
||||||
|
return ['light', 'header-dark'].includes(navTheme) ? unref(inverted) : !unref(inverted);
|
||||||
|
});
|
||||||
|
|
||||||
const leftMenuWidth = computed(() => {
|
const leftMenuWidth = computed(() => {
|
||||||
const { minMenuWidth, menuWidth } = unref(getMenuSetting);
|
const { minMenuWidth, menuWidth } = unref(getMenuSetting);
|
||||||
return collapsed.value ? minMenuWidth : menuWidth;
|
return collapsed.value ? minMenuWidth : menuWidth;
|
||||||
@@ -135,6 +139,9 @@
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
window.addEventListener('resize', watchWidth);
|
window.addEventListener('resize', watchWidth);
|
||||||
|
//挂载在 window 方便与在js中使用
|
||||||
|
window['$loading'] = useLoadingBar();
|
||||||
|
window['$loading'].finish();
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -149,6 +156,7 @@
|
|||||||
navMode,
|
navMode,
|
||||||
getShowFooter,
|
getShowFooter,
|
||||||
getDarkTheme,
|
getDarkTheme,
|
||||||
|
getHeaderInverted,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
|
|||||||
import { ErrorPageRoute, RedirectRoute } from '@/router/base';
|
import { ErrorPageRoute, RedirectRoute } from '@/router/base';
|
||||||
import { PageEnum } from '@/enums/pageEnum';
|
import { PageEnum } from '@/enums/pageEnum';
|
||||||
import { createRouterGuards } from './router-guards';
|
import { createRouterGuards } from './router-guards';
|
||||||
import 'nprogress/css/nprogress.css'; // 进度条样式
|
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const modules = import.meta.globEager('./modules/**/*.ts');
|
const modules = import.meta.globEager('./modules/**/*.ts');
|
||||||
|
|||||||
19
src/router/modules/docs.ts
Normal file
19
src/router/modules/docs.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { RouteRecordRaw } from 'vue-router';
|
||||||
|
import { Layout } from '@/router/constant';
|
||||||
|
import { DocumentTextOutline } from '@vicons/ionicons5';
|
||||||
|
import { renderIcon } from '@/utils/index';
|
||||||
|
|
||||||
|
const routes: Array<RouteRecordRaw> = [
|
||||||
|
{
|
||||||
|
path: '/external',
|
||||||
|
name: 'https://jekip.github.io/docs/',
|
||||||
|
component: Layout,
|
||||||
|
meta: {
|
||||||
|
title: '项目文档',
|
||||||
|
icon: renderIcon(DocumentTextOutline),
|
||||||
|
sort: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default routes;
|
||||||
@@ -12,8 +12,8 @@ const whitePathList = [LOGIN_PATH]; // no redirect whitelist
|
|||||||
export function createRouterGuards(router: Router) {
|
export function createRouterGuards(router: Router) {
|
||||||
const userStore = useUserStoreWidthOut();
|
const userStore = useUserStoreWidthOut();
|
||||||
const asyncRouteStore = useAsyncRouteStoreWidthOut();
|
const asyncRouteStore = useAsyncRouteStoreWidthOut();
|
||||||
const Loading = window['$loading'] || null;
|
|
||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
|
const Loading = window['$loading'] || null;
|
||||||
Loading && Loading.start();
|
Loading && Loading.start();
|
||||||
if (from.path === LOGIN_PATH && to.name === 'errorPage') {
|
if (from.path === LOGIN_PATH && to.name === 'errorPage') {
|
||||||
next(PageEnum.BASE_HOME);
|
next(PageEnum.BASE_HOME);
|
||||||
@@ -91,6 +91,7 @@ export function createRouterGuards(router: Router) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
asyncRouteStore.setKeepAliveComponents(keepAliveComponents);
|
asyncRouteStore.setKeepAliveComponents(keepAliveComponents);
|
||||||
|
const Loading = window['$loading'] || null;
|
||||||
Loading && Loading.finish();
|
Loading && Loading.finish();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const DEFAULT_CONFIG: TreeHelperConfig = {
|
|||||||
|
|
||||||
const getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);
|
const getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);
|
||||||
|
|
||||||
interface AsyncRouteState {
|
export interface IAsyncRouteState {
|
||||||
menus: RouteRecordRaw[];
|
menus: RouteRecordRaw[];
|
||||||
routers: any[];
|
routers: any[];
|
||||||
addRouters: any[];
|
addRouters: any[];
|
||||||
@@ -50,7 +50,7 @@ function filter<T = any>(
|
|||||||
|
|
||||||
export const useAsyncRouteStore = defineStore({
|
export const useAsyncRouteStore = defineStore({
|
||||||
id: 'app-async-route',
|
id: 'app-async-route',
|
||||||
state: (): AsyncRouteState => ({
|
state: (): IAsyncRouteState => ({
|
||||||
menus: [],
|
menus: [],
|
||||||
routers: constantRouter,
|
routers: constantRouter,
|
||||||
addRouters: [],
|
addRouters: [],
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const Storage = createStorage({ storage: localStorage });
|
|||||||
import { getUserInfo, login } from '@/api/system/user';
|
import { getUserInfo, login } from '@/api/system/user';
|
||||||
import { storage } from '@/utils/Storage';
|
import { storage } from '@/utils/Storage';
|
||||||
|
|
||||||
interface UserState {
|
export interface IUserState {
|
||||||
token: string;
|
token: string;
|
||||||
username: string;
|
username: string;
|
||||||
welcome: string;
|
welcome: string;
|
||||||
@@ -19,7 +19,7 @@ interface UserState {
|
|||||||
|
|
||||||
export const useUserStore = defineStore({
|
export const useUserStore = defineStore({
|
||||||
id: 'app-user',
|
id: 'app-user',
|
||||||
state: (): UserState => ({
|
state: (): IUserState => ({
|
||||||
token: Storage.get(ACCESS_TOKEN, ''),
|
token: Storage.get(ACCESS_TOKEN, ''),
|
||||||
username: '',
|
username: '',
|
||||||
welcome: '',
|
welcome: '',
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { IAsyncRouteState } from '@/store/modules/async-route';
|
import { IAsyncRouteState } from '@/store/modules/asyncRoute';
|
||||||
import { IUserState } from '@/store/modules/user/state';
|
import { IUserState } from '@/store/modules/user';
|
||||||
import { ILockscreenState } from '@/store/modules/lockscreen';
|
import { ILockscreenState } from '@/store/modules/lockscreen';
|
||||||
import { ITabsViewState } from '@/store/modules/tabs-view';
|
import { ITabsViewState } from '@/store/modules/tabsView';
|
||||||
|
|
||||||
export interface IStore {
|
export interface IStore {
|
||||||
asyncRoute: IAsyncRouteState;
|
asyncRoute: IAsyncRouteState;
|
||||||
|
|||||||
4
src/styles/var.less
Normal file
4
src/styles/var.less
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
@primaryColor: #2d8cf0;
|
||||||
|
@primaryColorHover: #57a3f3;
|
||||||
|
@header-height: 64px;
|
||||||
|
@footer-height: 70px;
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
</n-card>
|
</n-card>
|
||||||
</div>
|
</div>
|
||||||
<n-card :bordered="false" class="mt-4 proCard">
|
<n-card :bordered="false" class="mt-4 proCard">
|
||||||
<n-grid cols="2 s:1 m:3 l:3 xl:3 2xl:3" responsive="screen">
|
<n-grid cols="1 s:1 m:3 l:3 xl:3 2xl:3" responsive="screen">
|
||||||
<n-grid-item offset="0 s:0 m:1 l:1 xl:1 2xl:1">
|
<n-grid-item offset="0 s:0 m:1 l:1 xl:1 2xl:1">
|
||||||
<n-form
|
<n-form
|
||||||
:label-width="80"
|
:label-width="80"
|
||||||
|
|||||||
@@ -5123,11 +5123,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
path-key "^3.0.0"
|
path-key "^3.0.0"
|
||||||
|
|
||||||
nprogress@^1.0.0-1:
|
|
||||||
version "1.0.0-1"
|
|
||||||
resolved "https://registry.npmjs.org/nprogress/-/nprogress-1.0.0-1.tgz#dd4cce2b951f9359028facd6c51cc9c49ecfa1a2"
|
|
||||||
integrity sha512-Gr/Km0nIMbR7hOB0fjGx7nR0oRjTy9M61dXiQL5bfTBq0cQ+hNgt6gxE062j7Bxm+L/IjNVOr41iu2hrDeuedw==
|
|
||||||
|
|
||||||
num2fraction@^1.2.2:
|
num2fraction@^1.2.2:
|
||||||
version "1.2.2"
|
version "1.2.2"
|
||||||
resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
|
resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
|
||||||
|
|||||||
Reference in New Issue
Block a user