Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-dml
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-dml
Commits
2a78f8d8
提交
2a78f8d8
authored
11月 18, 2024
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 修改菜单通过接口控制显示隐藏
上级
db1cfddf
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
162 行增加
和
84 行删除
+162
-84
base.ts
src/api/base.ts
+5
-0
index.ts
src/modules/live/test/index.ts
+5
-0
index.ts
src/router/index.ts
+4
-4
menu.ts
src/stores/menu.ts
+129
-74
user.ts
src/stores/user.ts
+17
-6
types.ts
src/types.ts
+2
-0
没有找到文件。
src/api/base.ts
浏览文件 @
2a78f8d8
...
...
@@ -151,3 +151,8 @@ export function getCategoryList(params?: { name?: string }) {
export
function
getProductList
(
params
?:
{
name
?:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/experiment/live-commodity/list'
,
{
params
})
}
// 获取当前实验下的所有权限 (实验营销配置)
export
function
getAuth
()
{
return
httpRequest
.
get
(
'/api/lab/v1/experiment/auth/all'
)
}
src/modules/live/test/index.ts
浏览文件 @
2a78f8d8
...
...
@@ -15,6 +15,11 @@ const routes: RouteRecordRaw[] = [
{
path
:
'view'
,
component
:
()
=>
import
(
'./views/Demo.vue'
),
props
:
{
isView
:
true
}
},
],
},
{
path
:
'/one/live/test/view'
,
component
:
()
=>
import
(
'./views/Demo.vue'
),
props
:
{
isView
:
true
},
},
]
export
{
routes
}
src/router/index.ts
浏览文件 @
2a78f8d8
...
...
@@ -3,11 +3,11 @@ import { useUserStore } from '@/stores/user'
const
router
=
createRouter
({
history
:
createWebHistory
(),
routes
:
[{
path
:
'/:pathMatch(.*)*'
,
redirect
:
'/'
}]
routes
:
[{
path
:
'/:pathMatch(.*)*'
,
redirect
:
'/'
}]
,
})
router
.
beforeEach
(
async
(
to
,
from
,
next
)
=>
{
const
whiteList
=
[
'/401'
]
const
whiteList
=
[
'/401'
,
'/one/live/test/view'
]
const
user
=
useUserStore
()
if
(
!
user
.
isLogin
&&
!
whiteList
.
includes
(
to
.
path
))
{
try
{
...
...
@@ -27,8 +27,8 @@ router.beforeEach(async (to, from, next) => {
...
to
.
query
,
experiment_id
:
from
.
query
.
experiment_id
||
'7028276368903241728'
,
student_id
:
from
.
query
.
student_id
,
force_tgc
:
from
.
query
.
force_tgc
}
force_tgc
:
from
.
query
.
force_tgc
,
}
,
})
}
else
{
next
()
...
...
src/stores/menu.ts
浏览文件 @
2a78f8d8
...
...
@@ -37,292 +37,347 @@ interface State {
// 学生菜单
const
studentMenus
:
IMenuItem
[]
=
[
{
id
:
1
,
name
:
'基础配置'
,
path
:
'/connect'
,
icon
:
markRaw
(
IconMetadata
),
children
:
[
{
id
:
2
,
name
:
'连接管理'
,
path
:
'/connect'
,
icon
:
markRaw
(
IconConnect
)
}
]
icon
:
markRaw
(
IconConnect
)
,
}
,
]
,
},
{
id
:
5
,
name
:
'营销策划'
,
path
:
'/market/my'
,
icon
:
markRaw
(
IconMarket
)
icon
:
markRaw
(
IconMarket
)
,
},
{
id
:
6
,
name
:
'用户画像'
,
path
:
'/user'
,
icon
:
markRaw
(
IconUser
)
icon
:
markRaw
(
IconUser
)
,
},
{
id
:
7
,
name
:
'用户识别'
,
path
:
'/label'
,
icon
:
markRaw
(
IconGroup2
),
children
:
[
{
id
:
8
,
name
:
'标签管理'
,
path
:
'/label'
,
icon
:
markRaw
(
IconLabel
)
icon
:
markRaw
(
IconLabel
)
,
},
{
id
:
9
,
name
:
'群组管理'
,
path
:
'/group'
,
icon
:
markRaw
(
IconGroup
)
}
]
icon
:
markRaw
(
IconGroup
)
,
}
,
]
,
},
{
id
:
10
,
name
:
'营销内容设计'
,
path
:
'/material'
,
icon
:
markRaw
(
IconMaterial
),
children
:
[
{
id
:
11
,
name
:
'文本资料管理'
,
path
:
'/material?type=1'
,
icon
:
markRaw
(
IconText
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
tag
:
''
,
},
{
id
:
12
,
name
:
'图片资料管理'
,
path
:
'/material?type=2'
,
icon
:
markRaw
(
IconImage
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
tag
:
''
,
},
{
id
:
13
,
name
:
'卡券资料管理'
,
path
:
'/material?type=8'
,
icon
:
markRaw
(
IconCard
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
tag
:
''
,
},
{
id
:
17
,
name
:
'语音资料管理'
,
path
:
'/material?type=3'
,
icon
:
markRaw
(
IconAudio
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
tag
:
''
,
},
{
id
:
14
,
name
:
'视频资料管理'
,
path
:
'/material?type=4'
,
icon
:
markRaw
(
IconVideo
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
tag
:
''
,
},
{
id
:
15
,
name
:
'H5资料管理'
,
path
:
'/material?type=5'
,
icon
:
markRaw
(
IconH5
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
16
,
name
:
'二维码资料管理'
,
path
:
'/material?type=6'
,
icon
:
markRaw
(
IconQrcode
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
tag
:
''
,
},
{
id
:
18
,
name
:
'小程序资料管理'
,
path
:
'/material?type=7'
,
icon
:
markRaw
(
IconMiniProgram
),
// tag: 'v1-experiment-marketing-material-list'
tag
:
''
}
]
tag
:
''
,
}
,
]
,
},
{
id
:
19
,
name
:
'自动化营销'
,
path
:
'/trip/my'
,
icon
:
markRaw
(
IconTrip
)
icon
:
markRaw
(
IconTrip
)
,
},
{
id
:
20
,
name
:
'直播带货'
,
path
:
'/live'
,
icon
:
markRaw
(
IconLive
),
children
:
[
{
name
:
'商品管理'
,
path
:
'/live/product/management'
,
icon
:
markRaw
(
IconLiveProductManagement
)
},
{
name
:
'直播话术管理'
,
path
:
'/live/talk'
,
icon
:
markRaw
(
IconLiveTalk
)
},
{
name
:
'直播练习'
,
path
:
'/live/test'
,
icon
:
markRaw
(
IconLiveTest
)
}
]
{
id
:
23
,
name
:
'商品管理'
,
path
:
'/live/product/management'
,
icon
:
markRaw
(
IconLiveProductManagement
),
},
{
id
:
24
,
name
:
'直播话术管理'
,
path
:
'/live/talk'
,
icon
:
markRaw
(
IconLiveTalk
)
},
{
id
:
25
,
name
:
'直播练习'
,
path
:
'/live/test'
,
icon
:
markRaw
(
IconLiveTest
)
},
],
},
{
id
:
26
,
name
:
'数据分析'
,
path
:
'/analyze'
,
icon
:
markRaw
(
IconAnalyze
),
children
:
[
{
name
:
'用户分析'
,
path
:
'/analyze/user'
},
{
name
:
'标签群组分析'
,
path
:
'/analyze/label'
},
{
name
:
'事件分析'
,
path
:
'/analyze/event'
},
{
name
:
'营销分析'
,
path
:
'/analyze/marketing'
}
]
}
{
id
:
27
,
name
:
'用户分析'
,
path
:
'/analyze/user'
},
{
id
:
28
,
name
:
'标签群组分析'
,
path
:
'/analyze/label'
},
{
id
:
29
,
name
:
'事件分析'
,
path
:
'/analyze/event'
},
{
id
:
30
,
name
:
'营销分析'
,
path
:
'/analyze/marketing'
},
]
,
}
,
]
const
adminMenus
:
IMenuItem
[]
=
[
{
id
:
1
,
name
:
'基础配置'
,
path
:
'/connect'
,
icon
:
markRaw
(
IconMetadata
),
children
:
[
{
id
:
2
,
name
:
'连接管理'
,
path
:
'/connect'
,
icon
:
markRaw
(
IconConnect
),
tag
:
'v1-experiment-connection'
// tag: 'v1-experiment-connection',
},
{
id
:
3
,
name
:
'用户属性管理'
,
path
:
'/metadata/user'
,
icon
:
markRaw
(
IconUser2
),
tag
:
'v1-experiment-meta-member'
// tag: 'v1-experiment-meta-member',
},
{
id
:
4
,
name
:
'事件属性管理'
,
path
:
'/metadata/event'
,
icon
:
markRaw
(
IconEvent
),
tag
:
'v1-experiment-meta-event'
}
]
// tag: 'v1-experiment-meta-event',
}
,
]
,
},
{
id
:
5
,
name
:
'营销策划'
,
path
:
'/market/review'
,
icon
:
markRaw
(
IconMarket
)
studentPath
:
'/market/my'
,
icon
:
markRaw
(
IconMarket
),
},
{
id
:
6
,
name
:
'用户画像'
,
path
:
'/user'
,
icon
:
markRaw
(
IconUser
),
tag
:
'v1-experiment-member'
// tag: 'v1-experiment-member',
},
{
id
:
7
,
name
:
'用户识别'
,
path
:
'/label'
,
icon
:
markRaw
(
IconGroup2
),
children
:
[
{
id
:
8
,
name
:
'标签管理'
,
path
:
'/label'
,
icon
:
markRaw
(
IconLabel
),
tag
:
'experiment_tags'
// tag: 'experiment_tags',
},
{
id
:
9
,
name
:
'群组管理'
,
path
:
'/group'
,
icon
:
markRaw
(
IconGroup
),
tag
:
'experiment_groups'
}
]
// tag: 'experiment_groups',
}
,
]
,
},
{
id
:
10
,
name
:
'营销内容设计'
,
path
:
'/material'
,
icon
:
markRaw
(
IconMaterial
),
tag
:
'v1-experiment-marketing-material'
,
//
tag: 'v1-experiment-marketing-material',
children
:
[
{
id
:
11
,
name
:
'文本资料管理'
,
path
:
'/material?type=1'
,
icon
:
markRaw
(
IconText
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
12
,
name
:
'图片资料管理'
,
path
:
'/material?type=2'
,
icon
:
markRaw
(
IconImage
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
13
,
name
:
'卡券资料管理'
,
path
:
'/material?type=8'
,
icon
:
markRaw
(
IconCard
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
17
,
name
:
'语音资料管理'
,
path
:
'/material?type=3'
,
icon
:
markRaw
(
IconAudio
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
14
,
name
:
'视频资料管理'
,
path
:
'/material?type=4'
,
icon
:
markRaw
(
IconVideo
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
15
,
name
:
'H5资料管理'
,
path
:
'/material?type=5'
,
icon
:
markRaw
(
IconH5
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
16
,
name
:
'二维码资料管理'
,
path
:
'/material?type=6'
,
icon
:
markRaw
(
IconQrcode
),
tag
:
'v1-experiment-marketing-material-list'
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
18
,
name
:
'小程序资料管理'
,
path
:
'/material?type=7'
,
icon
:
markRaw
(
IconMiniProgram
),
tag
:
'v1-experiment-marketing-material-list'
}
]
// tag: 'v1-experiment-marketing-material-list',
}
,
]
,
},
{
id
:
19
,
name
:
'自动化营销'
,
path
:
'/trip'
,
studentPath
:
'/trip/my'
,
icon
:
markRaw
(
IconTrip
),
tag
:
'experiment_itinerary'
// tag: 'experiment_itinerary',
// children: [{ name: '旅程模板管理', path: '/trip/template', tag: 'experiment_itinerary_list' }]
},
{
id
:
20
,
name
:
'直播带货'
,
path
:
'/live'
,
icon
:
markRaw
(
IconLive
),
children
:
[
{
name
:
'商品品类管理'
,
path
:
'/live/product/category'
,
icon
:
markRaw
(
IconLiveProductCategory
)
},
{
name
:
'商品属性管理'
,
path
:
'/live/product/attr'
,
icon
:
markRaw
(
IconLiveProductAttr
)
},
{
name
:
'商品管理'
,
path
:
'/live/product/management'
,
icon
:
markRaw
(
IconLiveProductManagement
)
},
{
name
:
'直播话术管理'
,
path
:
'/live/talk'
,
icon
:
markRaw
(
IconLiveTalk
)
},
{
name
:
'直播练习'
,
path
:
'/live/test'
,
icon
:
markRaw
(
IconLiveTest
)
}
]
{
id
:
21
,
name
:
'商品品类管理'
,
path
:
'/live/product/category'
,
icon
:
markRaw
(
IconLiveProductCategory
)
},
{
id
:
22
,
name
:
'商品属性管理'
,
path
:
'/live/product/attr'
,
icon
:
markRaw
(
IconLiveProductAttr
)
},
{
id
:
23
,
name
:
'商品管理'
,
path
:
'/live/product/management'
,
icon
:
markRaw
(
IconLiveProductManagement
)
},
{
id
:
24
,
name
:
'直播话术管理'
,
path
:
'/live/talk'
,
icon
:
markRaw
(
IconLiveTalk
)
},
{
id
:
25
,
name
:
'直播练习'
,
path
:
'/live/test'
,
icon
:
markRaw
(
IconLiveTest
)
},
]
,
},
{
id
:
26
,
name
:
'数据分析'
,
path
:
'/analyze'
,
icon
:
markRaw
(
IconAnalyze
),
children
:
[
{
name
:
'用户分析'
,
path
:
'/analyze/user'
},
{
name
:
'标签群组分析'
,
path
:
'/analyze/label'
},
{
name
:
'事件分析'
,
path
:
'/analyze/event'
},
{
name
:
'营销分析'
,
path
:
'/analyze/marketing'
}
]
}
{
id
:
27
,
name
:
'用户分析'
,
path
:
'/analyze/user'
},
{
id
:
28
,
name
:
'标签群组分析'
,
path
:
'/analyze/label'
},
{
id
:
29
,
name
:
'事件分析'
,
path
:
'/analyze/event'
},
{
id
:
30
,
name
:
'营销分析'
,
path
:
'/analyze/marketing'
},
]
,
}
,
]
export
const
useMenuStore
=
defineStore
({
id
:
'menu'
,
state
:
():
State
=>
({
studentMenus
,
adminMenus
adminMenus
,
}),
getters
:
{
menus
:
state
=>
{
menus
:
(
state
)
=>
{
const
userStore
=
useUserStore
()
if
(
userStore
.
role
?.
id
===
1
)
{
return
state
.
studentMenus
}
else
{
return
state
.
adminMenus
}
}
}
// const menus = userStore.role?.id === 1 ? state.studentMenus : state.adminMenus
return
state
.
adminMenus
.
filter
((
item
)
=>
{
// 过滤有权限的菜单
return
userStore
.
menus
.
find
((
menu
)
=>
menu
.
id
==
item
.
id
)
})
.
map
((
item
)
=>
{
// 如果当前角色是学生,则使用学生的路径
if
(
userStore
.
role
?.
id
===
1
&&
item
.
studentPath
)
{
item
.
path
=
item
.
studentPath
}
return
item
})
},
},
})
src/stores/user.ts
浏览文件 @
2a78f8d8
import
type
{
UserType
,
ProjectType
,
OrganizationType
,
RoleType
,
PermissionType
}
from
'@/types'
import
{
defineStore
}
from
'pinia'
import
{
getUser
,
logout
,
checkDataStatus
}
from
'@/api/base'
import
{
getUser
,
logout
,
checkDataStatus
,
getAuth
}
from
'@/api/base'
import
{
useMapStore
}
from
'@/stores/map'
// 角色信息(1学员;5教师; 6管理员)
...
...
@@ -16,6 +16,13 @@ interface State {
roles
:
RoleType
[]
permissions
:
PermissionType
[]
status
:
any
menus
:
Menu
[]
}
interface
Menu
{
id
:
number
name
:
string
pid
:
number
}
export
const
useUserStore
=
defineStore
({
...
...
@@ -27,10 +34,11 @@ export const useUserStore = defineStore({
project
:
null
,
roles
:
[],
permissions
:
[],
status
:
{}
status
:
{},
menus
:
[],
}),
getters
:
{
isLogin
:
state
=>
!!
state
.
user
isLogin
:
(
state
)
=>
!!
state
.
user
,
},
actions
:
{
async
getUser
()
{
...
...
@@ -44,13 +52,16 @@ export const useUserStore = defineStore({
this
.
roles
=
roles
this
.
permissions
=
permissions
await
useMapStore
().
getMapList
()
await
checkDataStatus
().
then
(
res
=>
{
await
checkDataStatus
().
then
(
(
res
)
=>
{
this
.
status
=
res
.
data
})
await
getAuth
().
then
((
res
)
=>
{
this
.
menus
=
res
.
data
.
items
||
[]
})
},
async
logout
()
{
await
logout
()
this
.
user
=
null
}
}
}
,
}
,
})
src/types.ts
浏览文件 @
2a78f8d8
import
type
{
Component
}
from
'vue'
export
interface
IMenuItem
{
id
?:
number
tag
?:
string
|
string
[]
name
:
string
path
:
string
studentPath
?:
string
icon
?:
Component
children
?:
IMenuItem
[]
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论