Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Dr.Disrespect
vue-vben-admin
提交
26b6109c
V
vue-vben-admin
项目概览
Dr.Disrespect
/
vue-vben-admin
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vue-vben-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
26b6109c
编写于
11月 25, 2020
作者:
V
vben
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: add permissionCacheType setting
上级
6e03e050
变更
15
显示空白变更内容
内联
并排
Showing
15 changed file
with
123 addition
and
87 deletion
+123
-87
src/enums/cacheEnum.ts
src/enums/cacheEnum.ts
+5
-0
src/hooks/core/useTimeout.ts
src/hooks/core/useTimeout.ts
+1
-1
src/hooks/setting/useTransitionSetting.ts
src/hooks/setting/useTransitionSetting.ts
+1
-1
src/hooks/web/useLockPage.ts
src/hooks/web/useLockPage.ts
+1
-1
src/layouts/default/multitabs/index.less
src/layouts/default/multitabs/index.less
+0
-7
src/layouts/default/multitabs/index.tsx
src/layouts/default/multitabs/index.tsx
+11
-38
src/layouts/default/multitabs/useAffixTabs.ts
src/layouts/default/multitabs/useAffixTabs.ts
+35
-0
src/layouts/default/multitabs/useTabDropdown.ts
src/layouts/default/multitabs/useTabDropdown.ts
+1
-0
src/router/guard/index.ts
src/router/guard/index.ts
+1
-1
src/settings/projectSetting.ts
src/settings/projectSetting.ts
+5
-1
src/setup/App.ts
src/setup/App.ts
+9
-9
src/store/modules/app.ts
src/store/modules/app.ts
+1
-1
src/store/modules/user.ts
src/store/modules/user.ts
+25
-15
src/types/config.d.ts
src/types/config.d.ts
+3
-1
src/utils/helper/persistent.ts
src/utils/helper/persistent.ts
+24
-11
未找到文件。
src/enums/cacheEnum.ts
浏览文件 @
26b6109c
...
...
@@ -18,3 +18,8 @@ export const BASE_LOCAL_CACHE_KEY = 'LOCAL__CACHE__KEY__';
// base global session key
export
const
BASE_SESSION_CACHE_KEY
=
'
SESSION__CACHE__KEY__
'
;
export
enum
CacheTypeEnum
{
SESSION
,
LOCAL
,
}
src/hooks/core/useTimeout.ts
浏览文件 @
26b6109c
...
...
@@ -23,7 +23,7 @@ export function useTimeoutFn(handle: Fn<any>, wait: number) {
export
function
useTimeoutRef
(
wait
:
number
)
{
const
readyRef
=
ref
(
false
);
let
timer
:
ReturnType
<
typeof
setTimeout
>
|
undefined
;
let
timer
:
TimeoutHandle
;
function
stop
():
void
{
readyRef
.
value
=
false
;
timer
&&
window
.
clearTimeout
(
timer
);
...
...
src/hooks/setting/useTransitionSetting.ts
浏览文件 @
26b6109c
...
...
@@ -7,7 +7,7 @@ import { appStore } from '/@/store/modules/app';
export
function
useTransitionSetting
()
{
const
getTransitionSetting
=
computed
(()
=>
appStore
.
getProjectConfig
.
transitionSetting
);
const
getEnableTransition
=
computed
(()
=>
unref
(
getTransitionSetting
).
enable
);
const
getEnableTransition
=
computed
(()
=>
unref
(
getTransitionSetting
)
?
.
enable
);
const
getOpenNProgress
=
computed
(()
=>
unref
(
getTransitionSetting
)?.
openNProgress
);
...
...
src/hooks/web/useLockPage.ts
浏览文件 @
26b6109c
...
...
@@ -5,7 +5,7 @@ import { appStore } from '/@/store/modules/app';
import
{
userStore
}
from
'
/@/store/modules/user
'
;
export
function
useLockPage
()
{
let
timeId
:
ReturnType
<
typeof
setTimeout
>
;
let
timeId
:
TimeoutHandle
;
function
clear
():
void
{
window
.
clearTimeout
(
timeId
);
...
...
src/layouts/default/multitabs/index.less
浏览文件 @
26b6109c
...
...
@@ -40,12 +40,9 @@
height: 12px;
font-size: 12px;
color: inherit;
visibility: hidden;
transition: none;
&:hover {
visibility: visible;
svg {
width: 0.8em;
}
...
...
@@ -72,10 +69,6 @@
display: none;
}
.ant-tabs-close-x {
visibility: visible;
}
svg {
width: 0.7em;
fill: @white;
...
...
src/layouts/default/multitabs/index.tsx
浏览文件 @
26b6109c
import
'
./index.less
'
;
import
type
{
TabContentProps
}
from
'
./tab.data
'
;
import
type
{
TabItem
}
from
'
/@/store/modules/tab
'
;
import
type
{
AppRouteRecordRaw
}
from
'
/@/router/types
'
;
import
{
defineComponent
,
watch
,
computed
,
unref
,
toRaw
}
from
'
vue
'
;
import
{
defineComponent
,
watch
,
computed
,
unref
}
from
'
vue
'
;
import
{
useRouter
}
from
'
vue-router
'
;
import
router
from
'
/@/router
'
;
import
{
Tabs
}
from
'
ant-design-vue
'
;
import
TabContent
from
'
./TabContent
'
;
...
...
@@ -18,12 +19,12 @@ import { userStore } from '/@/store/modules/user';
import
{
closeTab
}
from
'
./useTabDropdown
'
;
import
{
useTabs
}
from
'
/@/hooks/web/useTabs
'
;
import
{
initAffixTabs
}
from
'
./useAffixTabs
'
;
import
'
./index.less
'
;
export
default
defineComponent
({
name
:
'
MultiTabs
'
,
name
:
'
Multi
ple
Tabs
'
,
setup
()
{
let
isAddAffix
=
false
;
initAffixTabs
()
;
const
go
=
useGo
();
...
...
@@ -36,11 +37,6 @@ export default defineComponent({
watch
(
()
=>
tabStore
.
getLastChangeRouteState
,
()
=>
{
if
(
!
isAddAffix
)
{
addAffixTabs
();
isAddAffix
=
true
;
}
const
lastChangeRoute
=
unref
(
tabStore
.
getLastChangeRouteState
);
if
(
!
lastChangeRoute
||
!
userStore
.
getTokenState
)
return
;
...
...
@@ -56,39 +52,15 @@ export default defineComponent({
}
);
/**
* @description: 过滤所有固定路由
*/
function
filterAffixTabs
(
routes
:
AppRouteRecordRaw
[])
{
const
tabs
:
TabItem
[]
=
[];
routes
&&
routes
.
forEach
((
route
)
=>
{
if
(
route
.
meta
&&
route
.
meta
.
affix
)
{
tabs
.
push
(
toRaw
(
route
)
as
TabItem
);
}
});
return
tabs
;
}
/**
* @description: 设置固定tabs
*/
function
addAffixTabs
():
void
{
const
affixTabs
=
filterAffixTabs
((
router
.
getRoutes
()
as
unknown
)
as
AppRouteRecordRaw
[]);
for
(
const
tab
of
affixTabs
)
{
tabStore
.
commitAddTab
(
tab
);
}
}
// tab切换
function
handleChange
(
activeKey
:
any
)
{
activeKeyRef
.
value
=
activeKey
;
go
(
activeKey
,
false
);
}
// 关闭当前ab
// 关闭当前
t
ab
function
handleEdit
(
targetKey
:
string
)
{
//
新增操作隐藏,目前只使用删除操作
//
Added operation to hide, currently only use delete operation
const
index
=
unref
(
getTabsState
).
findIndex
(
(
item
)
=>
(
item
.
fullPath
||
item
.
path
)
===
targetKey
);
...
...
@@ -107,12 +79,13 @@ export default defineComponent({
</
span
>
);
}
function
renderTabs
()
{
return
unref
(
getTabsState
).
map
((
item
:
TabItem
)
=>
{
const
key
=
item
.
query
?
item
.
fullPath
:
item
.
path
;
const
closable
=
!
(
item
&&
item
.
meta
&&
item
.
meta
.
affix
);
return
(
<
Tabs
.
TabPane
key
=
{
key
}
closable
=
{
!
(
item
&&
item
.
meta
&&
item
.
meta
.
affix
)
}
>
<
Tabs
.
TabPane
key
=
{
key
}
closable
=
{
closable
}
>
{
{
tab
:
()
=>
<
TabContent
tabItem
=
{
item
}
/>,
}
}
...
...
src/layouts/default/multitabs/useAffixTabs.ts
0 → 100644
浏览文件 @
26b6109c
import
{
toRaw
}
from
'
vue
'
;
import
router
from
'
/@/router
'
;
import
{
AppRouteRecordRaw
}
from
'
/@/router/types
'
;
import
{
TabItem
,
tabStore
}
from
'
/@/store/modules/tab
'
;
export
function
initAffixTabs
()
{
/**
* @description: Filter all fixed routes
*/
function
filterAffixTabs
(
routes
:
AppRouteRecordRaw
[])
{
const
tabs
:
TabItem
[]
=
[];
routes
&&
routes
.
forEach
((
route
)
=>
{
if
(
route
.
meta
&&
route
.
meta
.
affix
)
{
tabs
.
push
(
toRaw
(
route
)
as
TabItem
);
}
});
return
tabs
;
}
/**
* @description: Set fixed tabs
*/
function
addAffixTabs
():
void
{
const
affixTabs
=
filterAffixTabs
((
router
.
getRoutes
()
as
unknown
)
as
AppRouteRecordRaw
[]);
for
(
const
tab
of
affixTabs
)
{
tabStore
.
commitAddTab
(
tab
);
}
}
let
isAddAffix
=
false
;
if
(
!
isAddAffix
)
{
addAffixTabs
();
isAddAffix
=
true
;
}
}
src/layouts/default/multitabs/useTabDropdown.ts
浏览文件 @
26b6109c
...
...
@@ -203,6 +203,7 @@ export function closeTab(closedTab: TabItem | AppRouteRecordRaw) {
const
getTabsState
=
computed
(()
=>
{
return
tabStore
.
getTabsState
;
});
const
{
path
}
=
unref
(
currentRoute
);
if
(
path
!==
closedTab
.
path
)
{
// 关闭的不是激活tab
...
...
src/router/guard/index.ts
浏览文件 @
26b6109c
...
...
@@ -14,9 +14,9 @@ import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel';
import
{
tabStore
}
from
'
/@/store/modules/tab
'
;
const
{
closeMessageOnSwitch
,
removeAllHttpPending
}
=
useProjectSetting
();
const
globSetting
=
useGlobSetting
();
export
function
createGuard
(
router
:
Router
)
{
const
{
closeMessageOnSwitch
,
removeAllHttpPending
}
=
useProjectSetting
();
let
axiosCanceler
:
AxiosCanceler
|
null
;
if
(
removeAllHttpPending
)
{
axiosCanceler
=
new
AxiosCanceler
();
...
...
src/settings/projectSetting.ts
浏览文件 @
26b6109c
import
type
{
ProjectConfig
}
from
'
/@/types/config
'
;
import
{
MenuTypeEnum
,
MenuModeEnum
,
TriggerEnum
}
from
'
/@/enums/menuEnum
'
;
import
{
CacheTypeEnum
}
from
'
/@/enums/cacheEnum
'
;
import
{
ContentEnum
,
PermissionModeEnum
,
ThemeEnum
,
RouterTransitionEnum
}
from
'
/@/enums/appEnum
'
;
import
{
primaryColor
}
from
'
../../build/config/lessModifyVars
'
;
import
{
isProdMode
}
from
'
/@/utils/env
'
;
...
...
@@ -13,6 +14,9 @@ const setting: ProjectConfig = {
// Permission mode
permissionMode
:
PermissionModeEnum
.
ROLE
,
// Permission-related cache is stored in sessionStorage or localStorage
permissionCacheType
:
CacheTypeEnum
.
LOCAL
,
// color
// TODO Theme color
themeColor
:
primaryColor
,
...
...
@@ -130,7 +134,7 @@ const setting: ProjectConfig = {
openPageLoading
:
true
,
// Whether to open the top progress bar
openNProgress
:
tru
e
,
openNProgress
:
fals
e
,
},
// Whether to enable KeepAlive cache is best to close during development, otherwise the cache needs to be cleared every time
...
...
src/setup/App.ts
浏览文件 @
26b6109c
...
...
@@ -20,6 +20,7 @@ import {
}
from
'
/@/setup/theme
'
;
import
{
appStore
}
from
'
/@/store/modules/app
'
;
import
{
deepMerge
}
from
'
../utils/index
'
;
// Used to share global app instances
let
app
:
App
;
...
...
@@ -50,16 +51,15 @@ export function useThemeMode(mode: ThemeModeEnum) {
// Initial project configuration
export
function
initAppConfigStore
()
{
let
projCfg
:
ProjectConfig
=
getLocal
(
PROJ_CFG_KEY
)
as
ProjectConfig
;
if
(
!
projCfg
)
{
projCfg
=
projectSetting
;
}
projCfg
=
deepMerge
(
projectSetting
,
projCfg
||
{});
try
{
const
{
colorWeak
,
grayMode
,
headerSetting
:
{
bgColor
:
headerBgColor
},
menuSetting
:
{
bgColor
},
headerSetting
:
{
bgColor
:
headerBgColor
}
=
{
},
menuSetting
:
{
bgColor
}
=
{
},
}
=
projCfg
;
try
{
// if (
// themeColor !== primaryColor &&
// themeColor &&
...
...
src/store/modules/app.ts
浏览文件 @
26b6109c
...
...
@@ -26,7 +26,7 @@ export interface LockInfo {
isLock
:
boolean
;
}
let
timeId
:
ReturnType
<
typeof
setTimeout
>
;
let
timeId
:
TimeoutHandle
;
const
NAME
=
'
app
'
;
hotModuleUnregisterModule
(
NAME
);
@
Module
({
dynamic
:
true
,
namespaced
:
true
,
store
,
name
:
NAME
})
...
...
src/store/modules/user.ts
浏览文件 @
26b6109c
...
...
@@ -11,7 +11,7 @@ import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
import
{
PageEnum
}
from
'
/@/enums/pageEnum
'
;
import
{
RoleEnum
}
from
'
/@/enums/roleEnum
'
;
import
{
ROLES_KEY
,
TOKEN_KEY
,
USER_INFO_KEY
}
from
'
/@/enums/cacheEnum
'
;
import
{
CacheTypeEnum
,
ROLES_KEY
,
TOKEN_KEY
,
USER_INFO_KEY
}
from
'
/@/enums/cacheEnum
'
;
import
{
useMessage
}
from
'
/@/hooks/web/useMessage
'
;
...
...
@@ -19,13 +19,29 @@ import router from '/@/router';
import
{
loginApi
,
getUserInfoById
}
from
'
/@/api/sys/user
'
;
import
{
setLocal
,
getLocal
}
from
'
/@/utils/helper/persistent
'
;
// import { FULL_PAGE_NOT_FOUND_ROUTE } from '/@/router/constant
';
import
{
setLocal
,
getLocal
,
getSession
,
setSession
}
from
'
/@/utils/helper/persistent
'
;
import
{
useProjectSetting
}
from
'
/@/hooks/setting
'
;
export
type
UserInfo
=
Omit
<
GetUserInfoByUserIdModel
,
'
roles
'
>
;
const
NAME
=
'
user
'
;
hotModuleUnregisterModule
(
NAME
);
const
{
permissionCacheType
}
=
useProjectSetting
();
function
getCache
<
T
>
(
key
:
string
)
{
const
fn
=
permissionCacheType
===
CacheTypeEnum
.
LOCAL
?
getLocal
:
getSession
;
return
fn
(
key
)
as
T
;
}
function
setCache
(
USER_INFO_KEY
:
string
,
info
:
any
)
{
if
(
!
info
)
return
;
// const fn = permissionCacheType === CacheTypeEnum.LOCAL ? setLocal : setSession;
setLocal
(
USER_INFO_KEY
,
info
,
true
);
// TODO
setSession
(
USER_INFO_KEY
,
info
,
true
);
}
@
Module
({
namespaced
:
true
,
name
:
NAME
,
dynamic
:
true
,
store
})
class
User
extends
VuexModule
{
// user info
...
...
@@ -38,15 +54,15 @@ class User extends VuexModule {
private
roleListState
:
RoleEnum
[]
=
[];
get
getUserInfoState
():
UserInfo
{
return
this
.
userInfoState
||
(
getLocal
(
USER_INFO_KEY
)
as
UserInfo
)
||
{};
return
this
.
userInfoState
||
getCache
<
UserInfo
>
(
USER_INFO_KEY
)
||
{};
}
get
getTokenState
():
string
{
return
this
.
tokenState
||
(
getLocal
(
TOKEN_KEY
)
as
string
);
return
this
.
tokenState
||
getCache
<
string
>
(
TOKEN_KEY
);
}
get
getRoleListState
():
RoleEnum
[]
{
return
this
.
roleListState
.
length
>
0
?
this
.
roleListState
:
(
getLocal
(
ROLES_KEY
)
as
RoleEnum
[]
);
return
this
.
roleListState
.
length
>
0
?
this
.
roleListState
:
getCache
<
RoleEnum
[]
>
(
ROLES_KEY
);
}
@
Mutation
...
...
@@ -59,25 +75,19 @@ class User extends VuexModule {
@
Mutation
commitUserInfoState
(
info
:
UserInfo
):
void
{
this
.
userInfoState
=
info
;
if
(
info
)
{
setLocal
(
USER_INFO_KEY
,
info
,
true
);
}
setCache
(
USER_INFO_KEY
,
info
);
}
@
Mutation
commitRoleListState
(
roleList
:
RoleEnum
[]):
void
{
this
.
roleListState
=
roleList
;
if
(
roleList
)
{
setLocal
(
ROLES_KEY
,
roleList
,
true
);
}
setCache
(
ROLES_KEY
,
roleList
);
}
@
Mutation
commitTokenState
(
info
:
string
):
void
{
this
.
tokenState
=
info
;
if
(
info
)
{
setLocal
(
TOKEN_KEY
,
info
,
true
);
}
setCache
(
TOKEN_KEY
,
info
);
}
/**
...
...
src/types/config.d.ts
浏览文件 @
26b6109c
// 左侧菜单, 顶部菜单
import
{
MenuTypeEnum
,
MenuModeEnum
,
TriggerEnum
}
from
'
/@/enums/menuEnum
'
;
import
{
ContentEnum
,
PermissionModeEnum
,
ThemeEnum
,
RouterTransitionEnum
}
from
'
/@/enums/appEnum
'
;
import
{
CacheTypeEnum
}
from
'
/@/enums/cacheEnum
'
;
import
type
{
LocaleType
}
from
'
/@/locales/types
'
;
export
interface
MenuSetting
{
...
...
@@ -76,6 +76,8 @@ export interface TransitionSetting {
export
interface
ProjectConfig
{
locale
:
LocaleSetting
;
permissionCacheType
:
CacheTypeEnum
;
// 是否显示配置按钮
showSettingButton
:
boolean
;
// 权限模式
...
...
src/utils/helper/persistent.ts
浏览文件 @
26b6109c
...
...
@@ -29,8 +29,12 @@ function initCache() {
initCache
();
export
function
setLocal
(
key
:
string
,
value
:
any
,
immediate
=
false
)
{
cacheStore
.
local
[
BASE_LOCAL_CACHE_KEY
]
=
cacheStore
.
local
[
BASE_LOCAL_CACHE_KEY
]
||
{};
const
local
=
ls
.
get
(
BASE_LOCAL_CACHE_KEY
)?.[
BASE_LOCAL_CACHE_KEY
]
||
{};
cacheStore
.
local
[
BASE_LOCAL_CACHE_KEY
]
=
{
...
local
,
...
cacheStore
.
local
[
BASE_LOCAL_CACHE_KEY
]
}
||
{};
cacheStore
.
local
[
BASE_LOCAL_CACHE_KEY
][
key
]
=
value
;
if
(
immediate
)
{
ls
.
set
(
BASE_LOCAL_CACHE_KEY
,
cacheStore
.
local
);
}
...
...
@@ -50,16 +54,21 @@ export function removeLocal(key: string) {
}
}
export
function
clearLocal
()
{
export
function
clearLocal
(
immediate
=
false
)
{
cacheStore
.
local
=
{};
immediate
&&
ls
.
remove
(
BASE_LOCAL_CACHE_KEY
);
}
export
function
setSession
(
key
:
string
,
value
:
any
,
immediate
=
false
)
{
cacheStore
.
session
[
BASE_SESSION_CACHE_KEY
]
=
cacheStore
.
session
[
BASE_SESSION_CACHE_KEY
]
||
{};
const
session
=
ss
.
get
(
BASE_SESSION_CACHE_KEY
)?.[
BASE_SESSION_CACHE_KEY
]
||
{};
cacheStore
.
session
[
BASE_SESSION_CACHE_KEY
]
=
{
...
session
,
...
cacheStore
.
session
[
BASE_SESSION_CACHE_KEY
]
}
||
{};
cacheStore
.
session
[
BASE_SESSION_CACHE_KEY
][
key
]
=
value
;
if
(
immediate
)
{
const
cache
=
cacheStore
.
session
;
ss
.
set
(
BASE_SESSION_CACHE_KEY
,
cache
);
ss
.
set
(
BASE_SESSION_CACHE_KEY
,
cacheStore
.
session
);
}
}
...
...
@@ -77,8 +86,9 @@ export function getSession<T>(key: string): T | null {
}
}
export
function
clearSession
()
{
export
function
clearSession
(
immediate
=
false
)
{
cacheStore
.
session
=
{};
immediate
&&
ss
.
remove
(
BASE_SESSION_CACHE_KEY
);
}
export
function
clearAll
()
{
...
...
@@ -86,14 +96,17 @@ export function clearAll() {
clearSession
();
}
(()
=>
{
// /** Write to local before closing window */
window
.
addEventListener
(
'
beforeunload
'
,
()
=>
{
export
function
persistentCache
()
{
const
localCache
=
cacheStore
.
local
;
const
sessionCache
=
cacheStore
.
session
;
ls
.
set
(
BASE_LOCAL_CACHE_KEY
,
localCache
);
ss
.
set
(
BASE_SESSION_CACHE_KEY
,
sessionCache
);
}
(()
=>
{
// /** Write to local before closing window */
window
.
addEventListener
(
'
beforeunload
'
,
()
=>
{
persistentCache
();
});
function
storageChange
(
e
:
any
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录