提交 5a14683e authored 作者: gjx's avatar gjx

修改菜单权限

上级 b4be4b7a
<template>
<a-form ref="formRef" :model="form" :layout="layout" @submit="handleSubmit">
<a-form-item field="name" label="Username">
<a-input v-model="form.name" placeholder="please enter your username..." />
</a-form-item>
<a-form-item>
<a-button html-type="submit">Submit</a-button>
<slot></slot>
</a-form-item>
</a-form>
</template>
<script setup>
import { computed } from 'vue';
import { string } from 'vue-types';
const props = defineProps({
FormData: Object,
layout: {
type: String,
default:'inline'
}
})
const datas = computed(() => { return props.FormData })
const form = reactive({
name:"11"
})
// 点击提交
function handleSubmit({values, errors}) {
console.log('values:', values, '\nerrors:', errors)
}
</script>
<style></style>
\ No newline at end of file
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
import { useSplitMenu } from '/@/layouts/default/menu/useLayoutMenu'; import { useSplitMenu } from '/@/layouts/default/menu/useLayoutMenu';
import { Dropdown, Menu } from 'ant-design-vue'; import { Dropdown, Menu } from 'ant-design-vue';
import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
import { defineComponent, computed, ref, toRef,watch } from 'vue'; import { defineComponent, computed, ref, toRef,watch,watchEffect } from 'vue';
import { Icon } from '/@/components/Icon'; import { Icon } from '/@/components/Icon';
import { SITE_URL } from '/@/settings/siteSetting'; import { SITE_URL } from '/@/settings/siteSetting';
import { useUserStore } from '/@/store/modules/user'; import { useUserStore } from '/@/store/modules/user';
...@@ -105,13 +105,13 @@ export default defineComponent({ ...@@ -105,13 +105,13 @@ export default defineComponent({
const go = useGo(); const go = useGo();
const menus = menusStore() const menus = menusStore()
watch( watchEffect(() => {
() => menus.menus, menusRef.value.forEach((v: any, index) => {
(val) => {
if (val.title == '首页') if (menus.menus.title == v.title)
actives.value=0 actives.value=index
} })
); });
const getUserInfo = computed(() => { const getUserInfo = computed(() => {
const { realname = '', avatar, desc } = userStore.getUserInfo || {}; const { realname = '', avatar, desc } = userStore.getUserInfo || {};
...@@ -132,8 +132,14 @@ export default defineComponent({ ...@@ -132,8 +132,14 @@ export default defineComponent({
function select(v, index) { function select(v, index) {
// 存起来 // 存起来
actives.value = index actives.value = index
console.log(v,'v')
menus.setMenus(v) menus.setMenus(v)
go(v.path) if (v?.children) {
go(v?.children[0]?.path)
} else {
go(v.path)
}
} }
/** /**
......
<template> <template>
<Layout :class="prefixCls" v-bind="lockEvents"> <Layout :class="prefixCls" v-bind="lockEvents">
<!-- <LayoutFeatures /> --> <!-- <LayoutFeatures /> -->
<LayoutHeader /> <LayoutHeader />
<Layout :class="[layoutClass]"> <Layout :class="[layoutClass]">
<!-- 左边 --> <!-- 左边 -->
<LayoutSideBar v-if="menus?.menus?.title!='首页'&&menus?.menus?.title!='待办事项'" /> <LayoutSideBar v-if="menus?.menus?.title != '首页' && menus?.menus?.title != '待办事项'" />
<!-- 左边结束 --> <!-- 左边结束 -->
<Layout :class="`${prefixCls}-main`"> <Layout :class="`${prefixCls}-main`">
<LayoutMultipleHeader v-if="menus?.menus?.title!='首页'&&menus?.menus?.title!='待办事项'" /> <LayoutMultipleHeader v-if="menus?.menus?.title != '首页' && menus?.menus?.title != '待办事项'" />
<LayoutContent /> <LayoutContent />
<LayoutFooter /> <LayoutFooter />
</Layout> </Layout>
...@@ -16,80 +16,107 @@ ...@@ -16,80 +16,107 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, computed, unref, ref } from 'vue'; import { defineComponent, computed, unref, toRef, watch } from 'vue';
import { Layout } from 'ant-design-vue'; import { Layout } from 'ant-design-vue';
import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
import menusStore from '/@/store/menu' import menusStore from '/@/store/menu'
import LayoutHeader from './header/index.vue'; import { useSplitMenu } from '/@/layouts/default/menu/useLayoutMenu';
import LayoutContent from './content/index.vue'; import LayoutHeader from './header/index.vue';
import LayoutSideBar from './sider/index.vue'; import LayoutContent from './content/index.vue';
import LayoutMultipleHeader from './header/MultipleHeader.vue'; import LayoutSideBar from './sider/index.vue';
import LayoutMultipleHeader from './header/MultipleHeader.vue';
import { useRoute } from 'vue-router';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useDesign } from '/@/hooks/web/useDesign';
import { useLockPage } from '/@/hooks/web/useLockPage';
import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
import { useAppInject } from '/@/hooks/web/useAppInject';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; export default defineComponent({
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; name: 'DefaultLayout',
import { useDesign } from '/@/hooks/web/useDesign'; props: {
import { useLockPage } from '/@/hooks/web/useLockPage'; splitType: {
type: Number as PropType<MenuSplitTyeEnum>,
import { useAppInject } from '/@/hooks/web/useAppInject'; default: MenuSplitTyeEnum.NONE,
},
export default defineComponent({ // menu Mode
name: 'DefaultLayout', menuMode: {
components: { type: [String] as PropType<Nullable<MenuModeEnum>>,
LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')), default: '',
LayoutFooter: createAsyncComponent(() => import('/@/layouts/default/footer/index.vue')),
LayoutHeader,
LayoutContent,
LayoutSideBar,
LayoutMultipleHeader,
Layout,
}, },
setup() { },
const { prefixCls } = useDesign('default-layout'); components: {
const { getIsMobile } = useAppInject(); LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),
const { getShowFullHeaderRef } = useHeaderSetting(); LayoutFooter: createAsyncComponent(() => import('/@/layouts/default/footer/index.vue')),
const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting(); LayoutHeader,
const menus = menusStore() LayoutContent,
// Create a lock screen monitor LayoutSideBar,
const lockEvents = useLockPage(); LayoutMultipleHeader,
Layout,
},
setup(props) {
const { prefixCls } = useDesign('default-layout');
const { getIsMobile } = useAppInject();
const { getShowFullHeaderRef } = useHeaderSetting();
const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();
const menus = menusStore()
// Create a lock screen monitor
const lockEvents = useLockPage();
const router = useRoute();
const { menusRef } = useSplitMenu(toRef(props, 'splitType'));
const layoutClass = computed(() => { watch(
let cls: string[] = ['ant-layout']; () => menusRef.value,
if (unref(getIsMixSidebar) || unref(getShowMenu)) { () => {
cls.push('ant-layout-has-sider'); menusRef?.value.forEach((v: any) => {
} if (router.matched[0] && v.title == router.matched[0].meta.title) {
return cls; menus.setMenus(v)
});
return { }
getShowFullHeaderRef, });
getShowSidebar, }
prefixCls, );
getIsMobile,
getIsMixSidebar, const layoutClass = computed(() => {
layoutClass, let cls: string[] = ['ant-layout'];
lockEvents, if (unref(getIsMixSidebar) || unref(getShowMenu)) {
menus, cls.push('ant-layout-has-sider');
}; }
}, return cls;
}); });
return {
getShowFullHeaderRef,
getShowSidebar,
prefixCls,
getIsMobile,
getIsMixSidebar,
layoutClass,
lockEvents,
menus,
};
},
});
</script> </script>
<style lang="less"> <style lang="less">
@prefix-cls: ~'@{namespace}-default-layout'; @prefix-cls: ~'@{namespace}-default-layout';
.@{prefix-cls} { .@{prefix-cls} {
display: flex; display: flex;
width: 100%; width: 100%;
min-height: 100%; min-height: 100%;
background-color: @content-bg; background-color: @content-bg;
flex-direction: column; flex-direction: column;
> .ant-layout { >.ant-layout {
min-height: 100%; min-height: 100%;
} }
&-main { &-main {
width: 100%; width: 100%;
margin-left: 1px; margin-left: 1px;
}
} }
}
</style> </style>
...@@ -12,7 +12,6 @@ const getRouteNames = (array: any[]) => ...@@ -12,7 +12,6 @@ const getRouteNames = (array: any[]) =>
getRouteNames(item.children || []); getRouteNames(item.children || []);
}); });
getRouteNames(basicRoutes); getRouteNames(basicRoutes);
// app router // app router
export const router = createRouter({ export const router = createRouter({
history: createWebHistory(import.meta.env.VITE_PUBLIC_PATH), history: createWebHistory(import.meta.env.VITE_PUBLIC_PATH),
......
...@@ -38,7 +38,14 @@ export const LoginRoute: AppRouteRecordRaw = { ...@@ -38,7 +38,14 @@ export const LoginRoute: AppRouteRecordRaw = {
title: t('routes.basic.login'), title: t('routes.basic.login'),
}, },
}; };
export const DemosRoute: AppRouteRecordRaw = {
path: '/demos',
name: 'demos',
component: () => import('/@/views/demose.vue'),
meta: {
title: '测试',
},
};
//update-begin---author:wangshuai ---date:20220629 for:auth2登录页面路由------------ //update-begin---author:wangshuai ---date:20220629 for:auth2登录页面路由------------
export const Oauth2LoginRoute: AppRouteRecordRaw = { export const Oauth2LoginRoute: AppRouteRecordRaw = {
path: '/oauth2-app/login', path: '/oauth2-app/login',
...@@ -66,4 +73,4 @@ export const TokenLoginRoute: AppRouteRecordRaw = { ...@@ -66,4 +73,4 @@ export const TokenLoginRoute: AppRouteRecordRaw = {
}; };
// Basic routing without permission // Basic routing without permission
export const basicRoutes = [LoginRoute, RootRoute, ...mainOutRoutes, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE, TokenLoginRoute, Oauth2LoginRoute]; export const basicRoutes = [LoginRoute, RootRoute,DemosRoute, ...mainOutRoutes, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE, TokenLoginRoute, Oauth2LoginRoute];
import { usePermissionStore } from '/@/store/modules/permission';
const auth = usePermissionStore()
export function isAuth(key: String) {
for (let i = 0; i < auth.allAuthList.length; i++){
if ( auth.allAuthList[i].action === key) {
if (auth.allAuthList[i].type != 2) return true
else return false
}
}
}
\ No newline at end of file
<template>
<div>
<Form :FormData="FormData" />
</div>
</template>
<script setup>
import Form from '/@/components/FormModel.vue'
let FormData = ref(
[
{
name: 'name',
type: 'text',
label:'名称'
},
{
name: 'class',
type: 'text',
label:'班级'
},
]
)
</script>
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection"> <BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题--> <!--插槽:table标题-->
<template #tableTitle> <template #tableTitle>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button> <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate" v-show="isAuth('system:user:add')"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button> <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls" >导入</j-upload-button> <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls" >导入</j-upload-button>
<a-button type="primary" @click="handleSyncUser" preIcon="ant-design:sync-outlined"> 同步流程</a-button> <a-button type="primary" @click="handleSyncUser" preIcon="ant-design:sync-outlined"> 同步流程</a-button>
...@@ -56,7 +56,8 @@ ...@@ -56,7 +56,8 @@
<script lang="ts" name="system-user" setup> <script lang="ts" name="system-user" setup>
//ts语法 //ts语法
import { ref, computed, unref } from 'vue'; import { ref, computed, unref } from 'vue';
import { BasicTable, TableAction, ActionItem } from '/@/components/Table'; import { BasicTable, TableAction, ActionItem } from '/@/components/Table';
import {isAuth} from '/@/utils/auth/isAuth'
import UserDrawer from './UserDrawer.vue'; import UserDrawer from './UserDrawer.vue';
import UserRecycleBinModal from './UserRecycleBinModal.vue'; import UserRecycleBinModal from './UserRecycleBinModal.vue';
import PasswordModal from './PasswordModal.vue'; import PasswordModal from './PasswordModal.vue';
...@@ -241,7 +242,8 @@ ...@@ -241,7 +242,8 @@
/** /**
* 操作栏 * 操作栏
*/ */
function getTableAction(record): ActionItem[] { function getTableAction(record): ActionItem[] {
if (isAuth('system:user:edit')) {
return [ return [
{ {
label: '编辑', label: '编辑',
...@@ -249,11 +251,16 @@ ...@@ -249,11 +251,16 @@
// ifShow: () => hasPermission('system:user:edit'), // ifShow: () => hasPermission('system:user:edit'),
}, },
]; ];
} else {
return []
}
} }
/** /**
* 下拉操作栏 * 下拉操作栏
*/ */
function getDropDownAction(record): ActionItem[] { function getDropDownAction(record): ActionItem[] {
return [ return [
{ {
label: '详情', label: '详情',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论