Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation
This project
Loading...
Sign in
李宁
/
Activity
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 640f1611
authored
Nov 21, 2025
by
李宁
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
1
1 parent
d3641432
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
440 additions
and
149 deletions
channelBusiManage/.claude/settings.local.json
channelBusiManage/src/App.vue
channelBusiManage/src/assets/js/api/interface/role/index.js
channelBusiManage/src/assets/js/api/request.js
channelBusiManage/src/components/DesktopMain.vue
channelBusiManage/src/components/LoginPage.vue
channelBusiManage/src/components/OrganizationTree.vue
channelBusiManage/src/components/PermissionTreeNode.vue
channelBusiManage/src/components/RoleManagement.vue
channelBusiManage/src/components/UserManagement.vue
channelBusiManage/src/main.ts
channelBusiManage/src/views/RoleTestView.vue
channelBusiManage/vite.config.ts
channelBusiManage/.claude/settings.local.json
View file @
640f161
...
@@ -2,7 +2,10 @@
...
@@ -2,7 +2,10 @@
"permissions"
:
{
"permissions"
:
{
"allow"
:
[
"allow"
:
[
"Bash(grep -E
\"\\
.(js|vue|html)$
\"
)"
,
"Bash(grep -E
\"\\
.(js|vue|html)$
\"
)"
,
"Bash(npm install axios)"
"Bash(npm install axios)"
,
"Bash(tree src/)"
,
"Bash(npm run build)"
,
"Bash(npm run build-only)"
],
],
"deny"
:
[],
"deny"
:
[],
"ask"
:
[]
"ask"
:
[]
...
...
channelBusiManage/src/App.vue
View file @
640f161
...
@@ -13,6 +13,11 @@ const handleLogin = (username: string, role: 'admin' | 'viewer') => {
...
@@ -13,6 +13,11 @@ const handleLogin = (username: string, role: 'admin' | 'viewer') => {
isLoggedIn
.
value
=
true
isLoggedIn
.
value
=
true
}
}
if
(
isLoggedIn
){
let
name
=
JSON
.
parse
(
localStorage
.
getItem
(
'pcUserInfo'
)).
nickname
||
''
handleLogin
(
name
,
'admin'
)
}
// 登出处理
// 登出处理
const
handleLogout
=
()
=>
{
const
handleLogout
=
()
=>
{
localStorage
.
removeItem
(
'pcUserInfo'
)
localStorage
.
removeItem
(
'pcUserInfo'
)
...
...
channelBusiManage/src/assets/js/api/interface/role/index.js
View file @
640f161
import
request
from
'../../request'
import
request
from
'../../request'
/**
* 查询人员列表
*/
export
function
queryAllPerson
(
data
)
{
return
request
({
url
:
'/compass/api/personnel/list'
,
data
,
})
}
/**
/**
*
添加人员
*
查询角色列表
*/
*/
export
function
addNewPerson
(
data
)
{
export
function
queryRoleList
(
data
)
{
let
url
=
'/compass/api/personnel/create'
if
(
data
.
id
){
url
=
'/compass/api/personnel/update'
}
return
request
({
return
request
({
url
:
url
,
url
:
'/crm/getRoleList'
,
method
:
'GET'
,
data
,
data
,
})
})
}
}
/**
* 删除人员
*/
export
function
deletePerson
(
data
)
{
return
request
({
url
:
'/compass/api/personnel/delete'
,
data
,
})
}
/**
/**
*
批量导入工维人员
*
创建和修改角色
*/
*/
export
function
importGwPerson
(
data
)
{
export
function
createOrUpdateRole
(
data
)
{
return
request
({
let
url
=
'/crm/createRole'
url
:
'/compass/api/personnel/import-maintenance-preview'
,
if
(
data
.
roleId
){
data
,
url
=
'/crm/updateRole'
})
}
}
/**
* 批量导入营销人员
*/
export
function
importYxPerson
(
data
)
{
return
request
({
return
request
({
url
:
'/compass/api/marketing/import-preview'
,
url
,
data
,
data
,
})
})
}
}
channelBusiManage/src/assets/js/api/request.js
View file @
640f161
...
@@ -18,7 +18,7 @@ service.interceptors.request.use(
...
@@ -18,7 +18,7 @@ service.interceptors.request.use(
if
(
localStorage
.
pcUserInfo
)
{
if
(
localStorage
.
pcUserInfo
)
{
let
userInfo
=
JSON
.
parse
(
localStorage
.
pcUserInfo
);
let
userInfo
=
JSON
.
parse
(
localStorage
.
pcUserInfo
);
config
.
headers
[
"
x-access-
token"
]
=
userInfo
.
token
config
.
headers
[
"token"
]
=
userInfo
.
token
}
}
return
config
;
return
config
;
...
...
channelBusiManage/src/components/DesktopMain.vue
View file @
640f161
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
<nav
class=
"flex-1 py-6 px-3 overflow-hidden"
>
<nav
class=
"flex-1 py-6 px-3 overflow-hidden"
>
<div
class=
"space-y-6"
>
<div
class=
"space-y-6"
>
<!-- 业务管理菜单 -->
<!-- 业务管理菜单 -->
<div
class=
"space-y-1"
>
<div
class=
"space-y-1"
v-if=
"businessMenuItems.length>0"
>
<div
v-if=
"!isSidebarCollapsed"
class=
"px-4 mb-2"
>
<div
v-if=
"!isSidebarCollapsed"
class=
"px-4 mb-2"
>
<p
class=
"text-xs text-neutral-500 uppercase tracking-wide"
>
业务管理
</p>
<p
class=
"text-xs text-neutral-500 uppercase tracking-wide"
>
业务管理
</p>
</div>
</div>
...
@@ -64,7 +64,7 @@
...
@@ -64,7 +64,7 @@
</div>
</div>
<!-- 系统管理菜单 -->
<!-- 系统管理菜单 -->
<div
class=
"space-y-1"
>
<div
class=
"space-y-1"
v-if=
"systemMenuItems.length>0"
>
<div
v-if=
"!isSidebarCollapsed"
class=
"px-4 mb-2"
>
<div
v-if=
"!isSidebarCollapsed"
class=
"px-4 mb-2"
>
<p
class=
"text-xs text-neutral-500 uppercase tracking-wide"
>
系统管理
</p>
<p
class=
"text-xs text-neutral-500 uppercase tracking-wide"
>
系统管理
</p>
</div>
</div>
...
@@ -298,12 +298,23 @@ import platformLogoImg from '@/assets/8a3322d5ba8c2ae3592af24d73566a63828a3a27.p
...
@@ -298,12 +298,23 @@ import platformLogoImg from '@/assets/8a3322d5ba8c2ae3592af24d73566a63828a3a27.p
import
OrderMonitoring
from
'./OrderMonitoring.vue'
import
OrderMonitoring
from
'./OrderMonitoring.vue'
import
OrderDetail
from
'./OrderDetail.vue'
import
OrderDetail
from
'./OrderDetail.vue'
import
BusinessRulesManagement
from
'./BusinessRulesManagement.vue'
import
BusinessRulesManagement
from
'./BusinessRulesManagement.vue'
import
RoleManagement
from
'./RoleManagement.vue'
import
RoleManagement
,
{
type
Permission
}
from
'./RoleManagement.vue'
import
UserManagement
from
'./UserManagement.vue'
import
UserManagement
,
{
type
User
as
UserType
}
from
'./UserManagement.vue'
import
RoleIcon
from
'./icons/RoleIcon.vue'
import
RoleIcon
from
'./icons/RoleIcon.vue'
const
platformLogo
=
ref
(
platformLogoImg
)
const
platformLogo
=
ref
(
platformLogoImg
)
// 本地Role类型定义,确保permissions字段是必需的
interface
Role
{
id
:
string
name
:
string
description
?:
string
level
:
'地市级'
|
'区县级'
|
'一线人员'
permissions
:
string
[]
status
:
'启用'
|
'禁用'
createTime
?:
string
}
interface
DesktopMainProps
{
interface
DesktopMainProps
{
currentUser
:
{
username
:
string
;
role
:
'admin'
|
'viewer'
}
|
null
;
currentUser
:
{
username
:
string
;
role
:
'admin'
|
'viewer'
}
|
null
;
}
}
...
@@ -317,16 +328,60 @@ const activeMenu = ref<string>('orders') // 当前激活的菜单
...
@@ -317,16 +328,60 @@ const activeMenu = ref<string>('orders') // 当前激活的菜单
const
activeView
=
ref
<
string
>
(
'orders'
)
// 当前显示的视图
const
activeView
=
ref
<
string
>
(
'orders'
)
// 当前显示的视图
const
selectedOrderId
=
ref
<
string
|
null
>
(
null
)
// 当前查看的订单ID
const
selectedOrderId
=
ref
<
string
|
null
>
(
null
)
// 当前查看的订单ID
const
userInfo
=
ref
(
localStorage
.
getItem
(
'pcUserInfo'
)?
JSON
.
parse
(
localStorage
.
getItem
(
'pcUserInfo'
)):{})
// 菜单配置
// 菜单配置
const
businessMenuItems
=
[
// const businessMenuItems = [
{
id
:
'orders'
,
label
:
'登记订单管理'
,
icon
:
LayoutDashboard
},
// { id: 'orders', label: '登记订单管理', icon: LayoutDashboard },
{
id
:
'business'
,
label
:
'业务酬金管理'
,
icon
:
DollarSign
}
// { id: 'business', label: '业务酬金管理', icon: DollarSign }
]
// ]
const
businessMenuItems
=
computed
(()
=>
{
let
va
=
userInfo
.
value
if
(
va
.
functions
){
let
arr
=
va
.
functions
.
filter
(
item
=>
{
return
item
.
id
==
1
})
if
(
arr
.
length
>
0
&&
arr
[
0
].
children
){
let
barr
=
[]
arr
[
0
].
children
.
forEach
(
item
=>
{
if
(
item
.
id
==
2
){
barr
.
push
({
id
:
'orders'
,
label
:
'登记订单管理'
,
icon
:
LayoutDashboard
})
}
if
(
item
.
id
==
8
){
barr
.
push
({
id
:
'business'
,
label
:
'业务酬金管理'
,
icon
:
DollarSign
})
}
})
return
barr
}
}
return
[]
})
const
systemMenuItems
=
[
// const systemMenuItems = [
{
id
:
'roles'
,
label
:
'角色管理'
,
icon
:
RoleIcon
},
// { id: 'roles', label: '角色管理', icon: RoleIcon },
{
id
:
'users'
,
label
:
'账号管理'
,
icon
:
Users
}
// { id: 'users', label: '账号管理', icon: Users }
]
// ]
const
systemMenuItems
=
computed
(()
=>
{
let
va
=
userInfo
.
value
if
(
va
.
functions
){
let
arr
=
va
.
functions
.
filter
(
item
=>
{
return
item
.
id
==
14
})
if
(
arr
.
length
>
0
&&
arr
[
0
].
children
){
let
barr
=
[]
arr
[
0
].
children
.
forEach
(
item
=>
{
if
(
item
.
id
==
15
){
barr
.
push
({
id
:
'roles'
,
label
:
'角色管理'
,
icon
:
RoleIcon
})
}
if
(
item
.
id
==
19
){
barr
.
push
({
id
:
'users'
,
label
:
'账号管理'
,
icon
:
Users
})
}
})
return
barr
}
}
return
[]
})
const
menuMap
:
Record
<
string
,
string
>
=
{
const
menuMap
:
Record
<
string
,
string
>
=
{
orders
:
'登记订单管理'
,
orders
:
'登记订单管理'
,
...
@@ -343,7 +398,7 @@ const currentMenuTitle = computed(() => {
...
@@ -343,7 +398,7 @@ const currentMenuTitle = computed(() => {
})
})
// 业务规则数据
// 业务规则数据
const
businessRules
=
ref
([
const
businessRules
=
ref
<
BusinessRule
[]
>
([
{
{
id
:
'BIZ001'
,
id
:
'BIZ001'
,
businessCode
:
'B5G001'
,
businessCode
:
'B5G001'
,
...
@@ -383,28 +438,28 @@ const businessRules = ref([
...
@@ -383,28 +438,28 @@ const businessRules = ref([
const
orders
=
ref
([])
const
orders
=
ref
([])
// 存储从 OrderMonitoring 组件获取的订单数据
// 存储从 OrderMonitoring 组件获取的订单数据
const
allOrders
=
ref
([])
const
allOrders
=
ref
([]
as
any
[]
)
// 类型定义
// 类型定义
interface
Ro
le
{
interface
BusinessRu
le
{
id
:
string
id
:
string
name
:
string
businessCode
:
string
description
?:
string
businessName
:
string
level
:
'地市级'
|
'区县级'
|
'一线人员'
estimatedReward
:
number
permissionIds
:
string
[]
status
:
"生效中"
|
"已停用"
status
:
'启用'
|
'禁用'
createTime
:
string
createTime
?:
string
}
}
interface
Permission
{
interface
Organization
{
id
:
string
id
:
string
name
:
string
name
:
string
code
:
string
type
:
"地市"
|
"区县"
|
"客户经理团队"
description
?:
string
parentId
?:
string
parentId
?:
string
children
?:
Permiss
ion
[]
children
?:
Organizat
ion
[]
}
}
// 角色管理数据
// 角色管理数据
const
roles
=
ref
<
Role
[]
>
([
const
roles
=
ref
<
Role
[]
>
([
{
{
...
@@ -412,7 +467,7 @@ const roles = ref<Role[]>([
...
@@ -412,7 +467,7 @@ const roles = ref<Role[]>([
name
:
'区县全权管理员'
,
name
:
'区县全权管理员'
,
description
:
'拥有区县级别的所有管理权限,可以管理订单、用户和业务规则'
,
description
:
'拥有区县级别的所有管理权限,可以管理订单、用户和业务规则'
,
level
:
'区县级'
,
level
:
'区县级'
,
permission
Id
s
:
[
permissions
:
[
'order'
,
'order'
,
'order:view'
,
'order:view'
,
'order:complete'
,
'order:complete'
,
...
@@ -431,7 +486,7 @@ const roles = ref<Role[]>([
...
@@ -431,7 +486,7 @@ const roles = ref<Role[]>([
'system:account:view'
,
'system:account:view'
,
'system:account:create'
,
'system:account:create'
,
'system:account:edit'
'system:account:edit'
],
]
as
string
[]
,
status
:
'启用'
,
status
:
'启用'
,
createTime
:
'2025-10-20 09:00:00'
createTime
:
'2025-10-20 09:00:00'
},
},
...
@@ -440,7 +495,7 @@ const roles = ref<Role[]>([
...
@@ -440,7 +495,7 @@ const roles = ref<Role[]>([
name
:
'订单管理员'
,
name
:
'订单管理员'
,
description
:
'负责订单的日常管理和处理'
,
description
:
'负责订单的日常管理和处理'
,
level
:
'一线人员'
,
level
:
'一线人员'
,
permission
Ids
:
[
'order'
,
'order:view'
,
'order:complete'
,
'order:reward'
,
'order:approve'
],
permission
s
:
[
'order'
,
'order:view'
,
'order:complete'
,
'order:reward'
,
'order:approve'
]
as
string
[
],
status
:
'启用'
,
status
:
'启用'
,
createTime
:
'2025-10-20 09:30:00'
createTime
:
'2025-10-20 09:30:00'
},
},
...
@@ -449,18 +504,18 @@ const roles = ref<Role[]>([
...
@@ -449,18 +504,18 @@ const roles = ref<Role[]>([
name
:
'业务酬金管理员'
,
name
:
'业务酬金管理员'
,
description
:
'负责业务酬金的配置和维护'
,
description
:
'负责业务酬金的配置和维护'
,
level
:
'区县级'
,
level
:
'区县级'
,
permission
Ids
:
[
'business'
,
'business:view'
,
'business:create'
,
'business:edit'
],
permission
s
:
[
'business'
,
'business:view'
,
'business:create'
,
'business:edit'
]
as
string
[
],
status
:
'启用'
,
status
:
'启用'
,
createTime
:
'2025-10-20 10:00:00'
createTime
:
'2025-10-20 10:00:00'
}
}
])
])
// 权限数据
// 权限数据
const
permissions
=
ref
<
Permission
[]
>
(
JSON
.
parse
(
localStorage
.
getItem
(
'pcUserInfo'
)
).
functions
)
const
permissions
=
ref
<
Permission
[]
>
(
JSON
.
parse
(
localStorage
.
getItem
(
'pcUserInfo'
)
||
'{}'
).
functions
||
[]
)
// 根据订单ID获取订单详情
// 根据订单ID获取订单详情
const
getOrderById
=
(
orderId
:
string
)
=>
{
const
getOrderById
=
(
orderId
:
string
)
=>
{
return
allOrders
.
value
.
find
(
order
=>
order
.
id
===
orderId
)
return
allOrders
.
value
.
find
(
(
order
:
any
)
=>
order
.
id
===
orderId
)
}
}
// 方法
// 方法
...
@@ -526,7 +581,7 @@ const handleBreadcrumbClick = (level: string) => {
...
@@ -526,7 +581,7 @@ const handleBreadcrumbClick = (level: string) => {
}
}
// 业务规则管理方法
// 业务规则管理方法
const
handleAddBusinessRule
=
(
ruleData
:
Omit
<
any
,
'id'
|
'createTime'
>
)
=>
{
const
handleAddBusinessRule
=
(
ruleData
:
Omit
<
BusinessRule
,
'id'
|
'createTime'
>
)
=>
{
const
newRule
=
{
const
newRule
=
{
id
:
`BIZ
${
String
(
businessRules
.
value
.
length
+
1
).
padStart
(
3
,
'0'
)}
`
,
id
:
`BIZ
${
String
(
businessRules
.
value
.
length
+
1
).
padStart
(
3
,
'0'
)}
`
,
...
ruleData
,
...
ruleData
,
...
@@ -543,20 +598,14 @@ const handleAddBusinessRule = (ruleData: Omit<any, 'id' | 'createTime'>) => {
...
@@ -543,20 +598,14 @@ const handleAddBusinessRule = (ruleData: Omit<any, 'id' | 'createTime'>) => {
console
.
log
(
'新增业务规则:'
,
newRule
)
console
.
log
(
'新增业务规则:'
,
newRule
)
}
}
const
handleUpdateBusinessRule
=
(
ruleId
:
string
,
updates
:
any
)
=>
{
const
handleUpdateBusinessRule
=
(
ruleId
:
string
,
updates
:
Partial
<
BusinessRule
>
)
=>
{
const
ruleIndex
=
businessRules
.
value
.
findIndex
(
rule
=>
rule
.
id
===
ruleId
)
const
ruleIndex
=
businessRules
.
value
.
findIndex
(
rule
=>
rule
.
id
===
ruleId
)
if
(
ruleIndex
!==
-
1
)
{
if
(
ruleIndex
!==
-
1
)
{
businessRules
.
value
[
ruleIndex
]
=
{
const
existingRule
=
businessRules
.
value
[
ruleIndex
]
...
businessRules
.
value
[
ruleIndex
],
businessRules
.
value
[
ruleIndex
]
=
{
...
updates
,
...
existingRule
,
updateTime
:
new
Date
().
toLocaleString
(
'zh-CN'
,
{
...
updates
year
:
'numeric'
,
}
as
BusinessRule
month
:
'2-digit'
,
day
:
'2-digit'
,
hour
:
'2-digit'
,
minute
:
'2-digit'
})
}
ElMessage
.
success
(
'业务规则更新成功'
)
ElMessage
.
success
(
'业务规则更新成功'
)
console
.
log
(
'更新业务规则:'
,
ruleId
,
updates
)
console
.
log
(
'更新业务规则:'
,
ruleId
,
updates
)
}
}
...
@@ -565,18 +614,14 @@ const handleUpdateBusinessRule = (ruleId: string, updates: any) => {
...
@@ -565,18 +614,14 @@ const handleUpdateBusinessRule = (ruleId: string, updates: any) => {
const
handleToggleBusinessRuleStatus
=
(
ruleId
:
string
)
=>
{
const
handleToggleBusinessRuleStatus
=
(
ruleId
:
string
)
=>
{
const
ruleIndex
=
businessRules
.
value
.
findIndex
(
rule
=>
rule
.
id
===
ruleId
)
const
ruleIndex
=
businessRules
.
value
.
findIndex
(
rule
=>
rule
.
id
===
ruleId
)
if
(
ruleIndex
!==
-
1
)
{
if
(
ruleIndex
!==
-
1
)
{
const
currentStatus
=
businessRules
.
value
[
ruleIndex
].
status
const
rule
=
businessRules
.
value
[
ruleIndex
]
const
newStatus
=
currentStatus
===
'生效中'
?
'已停用'
:
'生效中'
if
(
rule
)
{
businessRules
.
value
[
ruleIndex
].
status
=
newStatus
const
currentStatus
=
rule
.
status
businessRules
.
value
[
ruleIndex
].
updateTime
=
new
Date
().
toLocaleString
(
'zh-CN'
,
{
const
newStatus
=
currentStatus
===
'生效中'
?
'已停用'
:
'生效中'
year
:
'numeric'
,
rule
.
status
=
newStatus
month
:
'2-digit'
,
ElMessage
.
success
(
`业务规则已
${
newStatus
===
'生效中'
?
'启用'
:
'停用'
}
`
)
day
:
'2-digit'
,
console
.
log
(
'切换业务规则状态:'
,
ruleId
,
newStatus
)
hour
:
'2-digit'
,
}
minute
:
'2-digit'
})
ElMessage
.
success
(
`业务规则已
${
newStatus
===
'生效中'
?
'启用'
:
'停用'
}
`
)
console
.
log
(
'切换业务规则状态:'
,
ruleId
,
newStatus
)
}
}
}
}
...
@@ -590,10 +635,11 @@ const handleDeleteBusinessRule = (ruleId: string) => {
...
@@ -590,10 +635,11 @@ const handleDeleteBusinessRule = (ruleId: string) => {
}
}
// 角色管理方法
// 角色管理方法
const
handleAddRole
=
(
roleData
:
Omit
<
Role
,
'id'
|
'createTime'
>
)
=>
{
const
handleAddRole
=
(
roleData
:
any
)
=>
{
const
newRole
=
{
const
newRole
:
Role
=
{
id
:
`role-
${
Date
.
now
()}
`
,
id
:
`role-
${
Date
.
now
()}
`
,
...
roleData
,
...
roleData
,
permissions
:
roleData
.
permissions
||
roleData
.
permissionIds
||
[],
createTime
:
new
Date
().
toLocaleString
(
'zh-CN'
,
{
createTime
:
new
Date
().
toLocaleString
(
'zh-CN'
,
{
year
:
'numeric'
,
year
:
'numeric'
,
month
:
'2-digit'
,
month
:
'2-digit'
,
...
@@ -607,16 +653,23 @@ const handleAddRole = (roleData: Omit<Role, 'id' | 'createTime'>) => {
...
@@ -607,16 +653,23 @@ const handleAddRole = (roleData: Omit<Role, 'id' | 'createTime'>) => {
console
.
log
(
'新增角色:'
,
newRole
)
console
.
log
(
'新增角色:'
,
newRole
)
}
}
const
handleUpdateRole
=
(
roleId
:
string
,
updates
:
Partial
<
Role
>
)
=>
{
const
handleUpdateRole
=
(
roleId
:
string
,
updates
:
any
)
=>
{
const
roleIndex
=
roles
.
value
.
findIndex
(
role
=>
role
.
id
===
roleId
)
const
roleIndex
=
roles
.
value
.
findIndex
(
role
=>
role
.
id
===
roleId
)
if
(
roleIndex
!==
-
1
)
{
if
(
roleIndex
!==
-
1
)
{
roles
.
value
[
roleIndex
]
=
{
...
roles
.
value
[
roleIndex
],
...
updates
}
const
existingRole
=
roles
.
value
[
roleIndex
]
console
.
log
(
'更新角色:'
,
roleId
,
updates
)
if
(
existingRole
)
{
roles
.
value
[
roleIndex
]
=
{
...
existingRole
,
...
updates
,
permissions
:
updates
.
permissions
||
updates
.
permissionIds
||
existingRole
.
permissions
}
as
Role
console
.
log
(
'更新角色:'
,
roleId
,
updates
)
}
}
}
}
}
// 组织架构数据
// 组织架构数据
const
organizations
=
ref
([
const
organizations
=
ref
<
Organization
[]
>
([
{
{
id
:
'org-001'
,
id
:
'org-001'
,
name
:
'杭州市移动'
,
name
:
'杭州市移动'
,
...
@@ -672,7 +725,7 @@ const organizations = ref([
...
@@ -672,7 +725,7 @@ const organizations = ref([
const
currentUserId
=
ref
(
'user-001'
)
const
currentUserId
=
ref
(
'user-001'
)
// 用户数据
// 用户数据
const
users
=
ref
([
const
users
=
ref
<
UserType
[]
>
([
{
{
id
:
'user-001'
,
id
:
'user-001'
,
username
:
'admin'
,
username
:
'admin'
,
...
@@ -724,9 +777,10 @@ const users = ref([
...
@@ -724,9 +777,10 @@ const users = ref([
])
])
// 用户管理方法
// 用户管理方法
const
handleAddUser
=
(
userData
:
any
)
=>
{
const
handleAddUser
=
(
userData
:
Omit
<
UserType
,
'id'
|
'createTime'
|
'creatorId'
>
)
=>
{
const
newUser
=
{
const
newUser
=
{
id
:
`user-
${
Date
.
now
()}
`
,
id
:
`user-
${
Date
.
now
()}
`
,
creatorId
:
props
.
currentUser
?.
username
||
'system'
,
...
userData
,
...
userData
,
createTime
:
new
Date
().
toLocaleString
(
'zh-CN'
,
{
createTime
:
new
Date
().
toLocaleString
(
'zh-CN'
,
{
year
:
'numeric'
,
year
:
'numeric'
,
...
@@ -736,15 +790,19 @@ const handleAddUser = (userData: any) => {
...
@@ -736,15 +790,19 @@ const handleAddUser = (userData: any) => {
minute
:
'2-digit'
,
minute
:
'2-digit'
,
second
:
'2-digit'
second
:
'2-digit'
})
})
}
}
as
UserType
users
.
value
.
push
(
newUser
)
users
.
value
.
push
(
newUser
)
console
.
log
(
'新增用户:'
,
newUser
)
console
.
log
(
'新增用户:'
,
newUser
)
}
}
const
handleUpdateUser
=
(
userId
:
string
,
updates
:
any
)
=>
{
const
handleUpdateUser
=
(
userId
:
string
,
updates
:
Partial
<
UserType
>
)
=>
{
const
userIndex
=
users
.
value
.
findIndex
(
user
=>
user
.
id
===
userId
)
const
userIndex
=
users
.
value
.
findIndex
(
user
=>
user
.
id
===
userId
)
if
(
userIndex
!==
-
1
)
{
if
(
userIndex
!==
-
1
)
{
users
.
value
[
userIndex
]
=
{
...
users
.
value
[
userIndex
],
...
updates
}
const
existingUser
=
users
.
value
[
userIndex
]
users
.
value
[
userIndex
]
=
{
...
existingUser
,
...
updates
}
as
UserType
console
.
log
(
'更新用户:'
,
userId
,
updates
)
console
.
log
(
'更新用户:'
,
userId
,
updates
)
}
}
}
}
...
...
channelBusiManage/src/components/LoginPage.vue
View file @
640f161
...
@@ -222,7 +222,7 @@ const generateCaptcha = async () => {
...
@@ -222,7 +222,7 @@ const generateCaptcha = async () => {
}
}
// 倒计时逻辑
// 倒计时逻辑
let
countdownTimer
:
NodeJS
.
Timeout
|
null
=
null
let
countdownTimer
:
number
|
null
=
null
const
startCountdown
=
()
=>
{
const
startCountdown
=
()
=>
{
countdown
.
value
=
60
countdown
.
value
=
60
...
...
channelBusiManage/src/components/OrganizationTree.vue
View file @
640f161
...
@@ -143,7 +143,7 @@ const props = withDefaults(defineProps<Props>(), {
...
@@ -143,7 +143,7 @@ const props = withDefaults(defineProps<Props>(), {
roleId
:
''
,
roleId
:
''
,
roles
:
()
=>
[],
roles
:
()
=>
[],
expandedIds
:
()
=>
new
Set
(),
expandedIds
:
()
=>
new
Set
(),
accountType
:
''
accountType
:
undefined
})
})
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
...
...
channelBusiManage/src/components/PermissionTreeNode.vue
View file @
640f161
<
template
>
<
template
>
<div
class=
"space-y-1"
>
<div
class=
"space-y-1"
>
<div
<div
:class=
"`permission-tree-node flex items-center gap-2 p-2 rounded $
{level > 0 ? 'ml-6' : ''}`"
:class=
"`permission-tree-node flex items-center gap-2 p-2 rounded $
{level > 0 ? 'ml-6' : ''}`">
>
<!-- 展开/收起按钮 -->
<!-- 展开/收起按钮 -->
<button
<button
v-if=
"hasChildren"
v-if=
"hasChildren"
...
@@ -27,18 +26,18 @@
...
@@ -27,18 +26,18 @@
<div
class=
"flex-1"
>
<div
class=
"flex-1"
>
<div
class=
"flex items-center gap-2"
>
<div
class=
"flex items-center gap-2"
>
<span
class=
"text-neutral-900"
>
{{
permission
.
name
}}
</span>
<span
class=
"text-neutral-900"
>
{{
permission
.
name
}}
</span>
<el-tag
<
!--
<
el-tag
type=
"info"
type=
"info"
effect=
"plain"
effect=
"plain"
size=
"small"
size=
"small"
class=
"text-xs"
class=
"text-xs"
>
>
{{
permission
.
code
}}
{{
permission
.
code
}}
</el-tag>
</el-tag>
-->
</div>
</div>
<p
v-if=
"permission.description"
class=
"text-xs text-neutral-500 mt-1"
>
<
!--
<
p
v-if=
"permission.description"
class=
"text-xs text-neutral-500 mt-1"
>
{{
permission
.
description
}}
{{
permission
.
description
}}
</p>
</p>
-->
</div>
</div>
</div>
</div>
...
...
channelBusiManage/src/components/RoleManagement.vue
View file @
640f161
...
@@ -23,44 +23,28 @@
...
@@ -23,44 +23,28 @@
:data=
"filteredRoles"
:data=
"filteredRoles"
style=
"width: 100%"
style=
"width: 100%"
:header-cell-style=
"
{ backgroundColor: '#f3f4f6', color: '#374151', fontWeight: '500', borderBottom: '1px solid #e5e7eb' }"
:header-cell-style=
"
{ backgroundColor: '#f3f4f6', color: '#374151', fontWeight: '500', borderBottom: '1px solid #e5e7eb' }"
:row-style="{ borderBottom: '1px solid rgb(243 244 246)' }"
:row-style="{ borderBottom: '1px solid rgb(243 244 246)' }">
>
<el-table-column
prop=
"roleName"
label=
"角色名称"
min-width=
"120"
>
<el-table-column
prop=
"name"
label=
"角色名称"
min-width=
"120"
>
<template
#
default=
"
{ row }">
<template
#
default=
"
{ row }">
<span
class=
"text-neutral-900"
>
{{
row
.
name
}}
</span>
<span
class=
"text-neutral-900"
>
{{
row
.
roleName
}}
</span>
</
template
>
</el-table-column>
<el-table-column
prop=
"permissionIds"
label=
"权限数量"
min-width=
"100"
>
<
template
#
default=
"{ row }"
>
<el-tag
type=
"info"
effect=
"plain"
size=
"small"
class=
"bg-neutral-50"
>
{{
row
.
permissionIds
.
length
}}
个权限
</el-tag>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
prop=
"status"
label=
"状态"
min-width=
"80"
>
<el-table-column
prop=
"status"
label=
"状态"
min-width=
"80"
>
<
template
#
default=
"{ row }"
>
<
template
#
default=
"{ row }"
>
<el-tag
<el-tag
:type=
"row.status ==
= '启用'
? 'success' : 'info'"
:type=
"row.status ==
1
? 'success' : 'info'"
effect=
"plain"
effect=
"plain"
size=
"small"
size=
"small"
>
>
{{
row
.
status
}}
{{
row
.
status
==
1
?
'启用'
:
'停用'
}}
</el-tag>
</el-tag>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
prop=
"createTime"
label=
"创建时间"
min-width=
"150"
>
<el-table-column
prop=
"createTime"
label=
"创建时间"
min-width=
"150"
>
<
template
#
default=
"{ row }"
>
<
template
#
default=
"{ row }"
>
<span
class=
"text-neutral-600"
>
{{
row
.
createTime
||
'-'
}}
</span>
<span
class=
"text-neutral-600"
>
{{
$utils
.
detailTime
(
row
.
createTime
)
}}
</span>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
...
@@ -191,11 +175,32 @@
...
@@ -191,11 +175,32 @@
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
ref
,
computed
,
watch
}
from
'vue'
import
{
ref
,
onMounted
,
computed
,
watch
,
getCurrentInstance
}
from
'vue'
import
{
ElMessage
}
from
'element-plus'
import
{
ElMessage
}
from
'element-plus'
import
{
Plus
}
from
'@element-plus/icons-vue'
import
{
Plus
}
from
'@element-plus/icons-vue'
import
PermissionTreeNode
from
'./PermissionTreeNode.vue'
import
PermissionTreeNode
from
'./PermissionTreeNode.vue'
const
{
$api
,
$utils
}
=
getCurrentInstance
()
!
.
appContext
.
config
.
globalProperties
onMounted
(()
=>
{
// 初始化数据
handleFilter
()
})
const
handleFilter
=
async
()
=>
{
try
{
const
response
=
await
$api
.
queryRoleList
({});
if
(
response
.
c
===
0
)
{
filteredRoles
.
value
=
response
.
d
ElMessage
.
success
(
'查询成功'
);
}
else
{
ElMessage
.
error
(
response
.
msg
||
'查询失败'
);
}
}
catch
(
error
)
{
ElMessage
.
error
(
'查询失败: '
+
error
.
message
);
}
}
// 类型定义
// 类型定义
export
interface
Permission
{
export
interface
Permission
{
id
:
string
id
:
string
...
@@ -211,7 +216,8 @@ export interface Role {
...
@@ -211,7 +216,8 @@ export interface Role {
name
:
string
name
:
string
description
?:
string
description
?:
string
level
:
RoleLevel
level
:
RoleLevel
permissionIds
:
string
[]
permissionIds
?:
string
[]
permissions
?:
string
[]
status
:
RoleStatus
status
:
RoleStatus
createTime
?:
string
createTime
?:
string
}
}
...
@@ -242,6 +248,7 @@ const roleName = ref('')
...
@@ -242,6 +248,7 @@ const roleName = ref('')
const
roleDescription
=
ref
(
''
)
const
roleDescription
=
ref
(
''
)
const
selectedPermissions
=
ref
<
string
[]
>
([])
const
selectedPermissions
=
ref
<
string
[]
>
([])
const
roleLevel
=
ref
<
'地市级'
|
'区县级'
|
'一线人员'
>
(
'区县级'
)
const
roleStatusEnabled
=
ref
(
true
)
const
roleStatusEnabled
=
ref
(
true
)
// 权限树展开状态
// 权限树展开状态
...
@@ -254,9 +261,12 @@ const topLevelPermissions = computed(() =>
...
@@ -254,9 +261,12 @@ const topLevelPermissions = computed(() =>
props
.
permissions
.
filter
(
p
=>
!
p
.
parentId
)
props
.
permissions
.
filter
(
p
=>
!
p
.
parentId
)
)
)
const
filteredRoles
=
computed
(()
=>
const
filteredRoles
=
ref
([])
props
.
roles
.
filter
(
role
=>
role
.
name
!==
'地市主管理员'
)
)
// 获取角色的权限ID列表,兼容不同的字段名
const
getRolePermissionIds
=
(
role
:
Role
):
string
[]
=>
{
return
role
.
permissionIds
||
role
.
permissions
||
[]
}
...
@@ -278,7 +288,7 @@ const handleOpenEditDialog = (role: Role) => {
...
@@ -278,7 +288,7 @@ const handleOpenEditDialog = (role: Role) => {
roleName
.
value
=
role
.
name
roleName
.
value
=
role
.
name
roleDescription
.
value
=
role
.
description
||
''
roleDescription
.
value
=
role
.
description
||
''
selectedPermissions
.
value
=
[...
role
.
permissionIds
]
selectedPermissions
.
value
=
[...
getRolePermissionIds
(
role
)
]
roleStatusEnabled
.
value
=
role
.
status
===
'启用'
roleStatusEnabled
.
value
=
role
.
status
===
'启用'
expandedPermissions
.
value
=
new
Set
(
props
.
permissions
.
filter
(
p
=>
!
p
.
parentId
).
map
(
p
=>
p
.
id
))
expandedPermissions
.
value
=
new
Set
(
props
.
permissions
.
filter
(
p
=>
!
p
.
parentId
).
map
(
p
=>
p
.
id
))
isDialogOpen
.
value
=
true
isDialogOpen
.
value
=
true
...
@@ -299,7 +309,7 @@ const handleSave = () => {
...
@@ -299,7 +309,7 @@ const handleSave = () => {
const
roleData
=
{
const
roleData
=
{
name
:
roleName
.
value
.
trim
(),
name
:
roleName
.
value
.
trim
(),
description
:
roleDescription
.
value
.
trim
(),
description
:
roleDescription
.
value
.
trim
(),
level
:
roleLevel
.
value
,
permissionIds
:
selectedPermissions
.
value
,
permissionIds
:
selectedPermissions
.
value
,
status
:
roleStatus
.
value
status
:
roleStatus
.
value
}
}
...
...
channelBusiManage/src/components/UserManagement.vue
View file @
640f161
...
@@ -336,7 +336,7 @@ import { Plus, Building2, Search } from 'lucide-vue-next'
...
@@ -336,7 +336,7 @@ import { Plus, Building2, Search } from 'lucide-vue-next'
import
OrganizationTree
from
'./OrganizationTree.vue'
import
OrganizationTree
from
'./OrganizationTree.vue'
// 类型定义
// 类型定义
interface
User
{
export
interface
User
{
id
:
string
id
:
string
username
:
string
username
:
string
realName
:
string
realName
:
string
...
@@ -378,7 +378,7 @@ interface UserManagementProps {
...
@@ -378,7 +378,7 @@ interface UserManagementProps {
const
props
=
defineProps
<
UserManagementProps
>
()
const
props
=
defineProps
<
UserManagementProps
>
()
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
addUser
:
[
user
:
Omit
<
User
,
'id'
|
'createTime'
>
]
addUser
:
[
user
:
Omit
<
User
,
'id'
|
'createTime'
|
'creatorId'
>
]
updateUser
:
[
id
:
string
,
updates
:
Partial
<
User
>
]
updateUser
:
[
id
:
string
,
updates
:
Partial
<
User
>
]
}
>
()
}
>
()
...
@@ -398,7 +398,7 @@ const formData = ref({
...
@@ -398,7 +398,7 @@ const formData = ref({
realName
:
''
,
realName
:
''
,
phone
:
''
,
phone
:
''
,
accountType
:
''
,
accountType
:
'
一线人员'
as
'地市级'
|
'区县级'
|
'一线人员
'
,
organizationId
:
''
,
organizationId
:
''
,
roleId
:
''
,
roleId
:
''
,
isActive
:
true
isActive
:
true
...
@@ -502,7 +502,7 @@ const handleOpenAddDialog = () => {
...
@@ -502,7 +502,7 @@ const handleOpenAddDialog = () => {
realName
:
''
,
realName
:
''
,
phone
:
''
,
phone
:
''
,
accountType
:
''
,
accountType
:
'
一线人员'
as
'地市级'
|
'区县级'
|
'一线人员
'
,
organizationId
:
''
,
organizationId
:
''
,
roleId
:
''
,
roleId
:
''
,
isActive
:
true
isActive
:
true
...
@@ -517,7 +517,7 @@ const handleOpenEditDialog = (user: User) => {
...
@@ -517,7 +517,7 @@ const handleOpenEditDialog = (user: User) => {
realName
:
user
.
realName
,
realName
:
user
.
realName
,
phone
:
user
.
phone
||
''
,
phone
:
user
.
phone
||
''
,
accountType
:
user
.
accountType
||
''
,
accountType
:
user
.
accountType
||
'
一线人员
'
,
organizationId
:
user
.
organizationId
,
organizationId
:
user
.
organizationId
,
roleId
:
user
.
roleId
,
roleId
:
user
.
roleId
,
isActive
:
user
.
status
===
'正常'
isActive
:
user
.
status
===
'正常'
...
...
channelBusiManage/src/main.ts
View file @
640f161
...
@@ -13,8 +13,11 @@ import App from './App.vue'
...
@@ -13,8 +13,11 @@ import App from './App.vue'
import
router
from
'./router'
import
router
from
'./router'
// 引入 API 接口和工具方法
// 引入 API 接口和工具方法
// @ts-ignore
import
api
from
'./assets/js/api/interface/index.js'
import
api
from
'./assets/js/api/interface/index.js'
// @ts-ignore
import
stores
from
'./assets/js/stores/index.js'
import
stores
from
'./assets/js/stores/index.js'
// @ts-ignore
import
commonUtils
from
'./assets/js/const/common.js'
import
commonUtils
from
'./assets/js/const/common.js'
const
app
=
createApp
(
App
)
const
app
=
createApp
(
App
)
...
...
channelBusiManage/src/views/RoleTestView.vue
0 → 100644
View file @
640f161
<
template
>
<div
class=
"min-h-screen bg-gray-50 p-6"
>
<div
class=
"max-w-7xl mx-auto"
>
<h1
class=
"text-2xl font-bold text-gray-900 mb-6"
>
角色管理测试页面
</h1>
<RoleManagement
:roles=
"roles"
:permissions=
"permissions"
@
add-role=
"handleAddRole"
@
update-role=
"handleUpdateRole"
/>
</div>
</div>
</
template
>
<
script
setup
lang=
"ts"
>
import
{
ref
}
from
'vue'
import
RoleManagement
,
{
type
Role
,
type
Permission
}
from
'@/components/RoleManagement.vue'
import
{
ElMessage
}
from
'element-plus'
// 测试数据
const
roles
=
ref
<
Role
[]
>
([
{
id
:
'role-001'
,
name
:
'区县全权管理员'
,
description
:
'拥有区县级别的所有管理权限,可以管理订单、用户和业务规则'
,
level
:
'区县级'
,
permissions
:
[
'order'
,
'order:view'
,
'order:complete'
,
'order:reward'
,
'order:approve'
,
'business'
,
'business:view'
,
'business:create'
,
'business:edit'
,
'system'
,
'system:role'
,
'system:role:view'
,
'system:role:create'
,
'system:role:edit'
,
'system:account'
,
'system:account:view'
,
'system:account:create'
,
'system:account:edit'
],
status
:
'启用'
,
createTime
:
'2025-10-20 09:00:00'
},
{
id
:
'role-002'
,
name
:
'订单管理员'
,
description
:
'负责订单的日常管理和处理'
,
level
:
'一线人员'
,
permissions
:
[
'order'
,
'order:view'
,
'order:complete'
,
'order:reward'
,
'order:approve'
],
status
:
'启用'
,
createTime
:
'2025-10-20 09:30:00'
},
{
id
:
'role-003'
,
name
:
'业务规则管理员'
,
description
:
'负责业务规则的配置和维护'
,
level
:
'区县级'
,
permissions
:
[
'business'
,
'business:view'
,
'business:create'
,
'business:edit'
],
status
:
'启用'
,
createTime
:
'2025-10-20 10:00:00'
}
])
const
permissions
=
ref
<
Permission
[]
>
([
{
id
:
'order'
,
name
:
'订单管理'
,
code
:
'order'
,
description
:
'订单相关的所有权限'
,
children
:
[
{
id
:
'order:view'
,
name
:
'查看订单'
,
code
:
'order:view'
,
description
:
'查看订单列表和详情'
,
parentId
:
'order'
},
{
id
:
'order:complete'
,
name
:
'填写办结信息'
,
code
:
'order:complete'
,
description
:
'填写CRM订单编号和办理备注'
,
parentId
:
'order'
},
{
id
:
'order:reward'
,
name
:
'填写酬金金额'
,
code
:
'order:reward'
,
description
:
'填写和修改实际发放酬金'
,
parentId
:
'order'
},
{
id
:
'order:approve'
,
name
:
'审核'
,
code
:
'order:approve'
,
description
:
'审核通过或驳回订单'
,
parentId
:
'order'
}
]
},
{
id
:
'business'
,
name
:
'业务规则管理'
,
code
:
'business'
,
description
:
'业务规则相关权限'
,
children
:
[
{
id
:
'business:view'
,
name
:
'查看业务规则'
,
code
:
'business:view'
,
description
:
'查看业务规则列表'
,
parentId
:
'business'
},
{
id
:
'business:create'
,
name
:
'创建业务规则'
,
code
:
'business:create'
,
description
:
'创建新的业务规则'
,
parentId
:
'business'
},
{
id
:
'business:edit'
,
name
:
'编辑业务规则'
,
code
:
'business:edit'
,
description
:
'修改和停用业务规则'
,
parentId
:
'business'
}
]
},
{
id
:
'system'
,
name
:
'系统管理'
,
code
:
'system'
,
description
:
'系统管理相关权限'
,
children
:
[
{
id
:
'system:role'
,
name
:
'角色管理'
,
code
:
'system:role'
,
description
:
'角色管理相关权限'
,
parentId
:
'system'
,
children
:
[
{
id
:
'system:role:view'
,
name
:
'查看角色'
,
code
:
'system:role:view'
,
description
:
'查看角色列表'
,
parentId
:
'system:role'
},
{
id
:
'system:role:create'
,
name
:
'创建角色'
,
code
:
'system:role:create'
,
description
:
'创建新角色'
,
parentId
:
'system:role'
},
{
id
:
'system:role:edit'
,
name
:
'编辑角色'
,
code
:
'system:role:edit'
,
description
:
'编辑角色信息和权限'
,
parentId
:
'system:role'
}
]
},
{
id
:
'system:account'
,
name
:
'账号管理'
,
code
:
'system:account'
,
description
:
'账号管理相关权限'
,
parentId
:
'system'
,
children
:
[
{
id
:
'system:account:view'
,
name
:
'查看账号'
,
code
:
'system:account:view'
,
description
:
'查看账号列表'
,
parentId
:
'system:account'
},
{
id
:
'system:account:create'
,
name
:
'创建账号'
,
code
:
'system:account:create'
,
description
:
'创建新账号'
,
parentId
:
'system:account'
},
{
id
:
'system:account:edit'
,
name
:
'编辑账号'
,
code
:
'system:account:edit'
,
description
:
'编辑账号信息'
,
parentId
:
'system:account'
}
]
}
]
}
])
// 事件处理
const
handleAddRole
=
(
roleData
:
Omit
<
Role
,
'id'
|
'createTime'
>
)
=>
{
const
newRole
:
Role
=
{
id
:
`role-
${
Date
.
now
()}
`
,
...
roleData
,
permissions
:
roleData
.
permissionIds
||
roleData
.
permissions
||
[],
createTime
:
new
Date
().
toLocaleString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
hour
:
'2-digit'
,
minute
:
'2-digit'
,
second
:
'2-digit'
})
}
roles
.
value
.
push
(
newRole
)
ElMessage
.
success
(
'角色创建成功'
)
console
.
log
(
'新增角色:'
,
newRole
)
}
const
handleUpdateRole
=
(
roleId
:
string
,
updates
:
Partial
<
Role
>
)
=>
{
const
roleIndex
=
roles
.
value
.
findIndex
(
role
=>
role
.
id
===
roleId
)
if
(
roleIndex
!==
-
1
)
{
roles
.
value
[
roleIndex
]
=
{
...
roles
.
value
[
roleIndex
],
...
updates
}
as
Role
ElMessage
.
success
(
'角色更新成功'
)
console
.
log
(
'更新角色:'
,
roleId
,
updates
)
}
}
</
script
>
<
style
scoped
>
/* 测试页面样式 */
</
style
>
channelBusiManage/vite.config.ts
View file @
640f161
...
@@ -10,6 +10,7 @@ export default defineConfig({
...
@@ -10,6 +10,7 @@ export default defineConfig({
vue
(),
vue
(),
// vueDevTools(),
// vueDevTools(),
],
],
base
:
'./'
,
resolve
:
{
resolve
:
{
alias
:
{
alias
:
{
'@'
:
fileURLToPath
(
new
URL
(
'./src'
,
import
.
meta
.
url
))
'@'
:
fileURLToPath
(
new
URL
(
'./src'
,
import
.
meta
.
url
))
...
...
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment