Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
pptist
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
viitto
pptist
Commits
d5f1810f
Commit
d5f1810f
authored
May 07, 2024
by
罗超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成成员管理
parent
369174a7
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
334 additions
and
11 deletions
+334
-11
common.css
src/assets/styles/common.css
+4
-1
icon.ts
src/plugins/icon.ts
+4
-2
UserService.ts
src/services/UserService.ts
+10
-0
menu.ts
src/store/menu.ts
+1
-1
user.ts
src/store/user.ts
+6
-0
common.ts
src/utils/common.ts
+38
-0
Index.vue
src/views/Index.vue
+2
-2
Member.vue
src/views/TeamCenter/Member.vue
+106
-5
InviteMember.vue
src/views/components/Team/InviteMember.vue
+163
-0
No files found.
src/assets/styles/common.css
View file @
d5f1810f
...
@@ -193,6 +193,9 @@ page {
...
@@ -193,6 +193,9 @@ page {
.primary-borders-thin
{
.primary-borders-thin
{
border
:
1px
solid
#d14424
!important
;
border
:
1px
solid
#d14424
!important
;
}
}
.borders-light
{
border
:
1px
solid
#F1f2f4
;
}
.transparent-borders
{
.transparent-borders
{
border
:
1px
solid
transparent
;
border
:
1px
solid
transparent
;
}
}
...
@@ -616,7 +619,7 @@ page {
...
@@ -616,7 +619,7 @@ page {
}
}
.ppt-button
{
.ppt-button
{
font-size
:
14px
!important
;
font-size
:
14px
!important
;
font-weight
:
bold
!important
;
font-weight
:
bold
;
font-family
:
'pingfangr'
;
font-family
:
'pingfangr'
;
}
}
.primary-link-button
{
.primary-link-button
{
...
...
src/plugins/icon.ts
View file @
d5f1810f
...
@@ -141,7 +141,8 @@ import {
...
@@ -141,7 +141,8 @@ import {
Dashboard
,
Dashboard
,
Tag
,
Tag
,
SettingOne
,
SettingOne
,
Pencil
Pencil
,
ToBottom
}
from
'@icon-park/vue-next'
}
from
'@icon-park/vue-next'
export
interface
Icons
{
export
interface
Icons
{
...
@@ -287,7 +288,8 @@ export const icons: Icons = {
...
@@ -287,7 +288,8 @@ export const icons: Icons = {
IconDashBoard
:
Dashboard
,
IconDashBoard
:
Dashboard
,
IconTag
:
Tag
,
IconTag
:
Tag
,
IconSettingOne
:
SettingOne
,
IconSettingOne
:
SettingOne
,
IconPencli
:
Pencil
IconPencli
:
Pencil
,
IconToBottom
:
ToBottom
}
}
export
default
{
export
default
{
...
...
src/services/UserService.ts
View file @
d5f1810f
...
@@ -33,5 +33,15 @@ class UserServices{
...
@@ -33,5 +33,15 @@ class UserServices{
let
msg
=
{
id
}
let
msg
=
{
id
}
return
Api
.
Post
(
"travel_remove_member"
,
msg
)
return
Api
.
Post
(
"travel_remove_member"
,
msg
)
}
}
static
async
SetTenantSAAsync
(
id
:
string
):
Promise
<
HttpResponse
>
{
let
msg
=
{
id
}
return
Api
.
Post
(
"travel_set_sa"
,
msg
)
}
static
async
SetTenantInviteCodeAsync
(
ia
:
0
|
1
):
Promise
<
HttpResponse
>
{
let
msg
=
{
ia
}
return
Api
.
Post
(
"travel_set_invite_code"
,
msg
)
}
}
}
export
default
UserServices
;
export
default
UserServices
;
\ No newline at end of file
src/store/menu.ts
View file @
d5f1810f
...
@@ -84,7 +84,7 @@ export const useMenuStore = defineStore('menu', {
...
@@ -84,7 +84,7 @@ export const useMenuStore = defineStore('menu', {
getTeamMenu
:(
state
)
=>
{
getTeamMenu
:(
state
)
=>
{
const
userStore
=
useUserStore
()
const
userStore
=
useUserStore
()
const
userInfo
=
userStore
.
getUser
const
userInfo
=
userStore
.
getUser
if
(
userInfo
.
it
&&
userInfo
.
ia
){
if
(
userInfo
.
it
&&
(
userInfo
.
ia
||
userInfo
.
ic
)
){
const
finds
=
menus
.
filter
(
x
=>
x
.
owner
==
'A'
)
const
finds
=
menus
.
filter
(
x
=>
x
.
owner
==
'A'
)
return
finds
.
map
(
x
=>
x
.
menu
)
return
finds
.
map
(
x
=>
x
.
menu
)
}
}
...
...
src/store/user.ts
View file @
d5f1810f
...
@@ -60,6 +60,8 @@ export const useUserStore = defineStore('user', {
...
@@ -60,6 +60,8 @@ export const useUserStore = defineStore('user', {
d
.
ia
=
0
d
.
ia
=
0
d
.
it
=
true
d
.
it
=
true
d
.
expire
=
d
.
Expire
d
.
expire
=
d
.
Expire
d
.
ic
=
d
.
IsGroupCreate
d
.
id
=
d
.
DisplayId
this
.
userInfo
=
d
this
.
userInfo
=
d
if
(
!
this
.
userInfo
.
photo
||
!
this
.
userInfo
.
photo
.
includes
(
'http://'
)
||
!
this
.
userInfo
.
photo
.
includes
(
'https://'
)){
if
(
!
this
.
userInfo
.
photo
||
!
this
.
userInfo
.
photo
.
includes
(
'http://'
)
||
!
this
.
userInfo
.
photo
.
includes
(
'https://'
)){
this
.
userInfo
.
photo
=
USER_DEFAULT_HEADER
this
.
userInfo
.
photo
=
USER_DEFAULT_HEADER
...
@@ -108,6 +110,10 @@ export const useUserStore = defineStore('user', {
...
@@ -108,6 +110,10 @@ export const useUserStore = defineStore('user', {
}
}
}
catch
(
error
)
{}
}
catch
(
error
)
{}
return
{
status
:
'ERROR'
}
as
UserLoginResult
return
{
status
:
'ERROR'
}
as
UserLoginResult
},
setOldSaPermission
(
ia
:
boolean
){
this
.
userInfo
.
ia
=
ia
this
.
userInfo
.
ic
=
false
}
}
},
},
persist
:
{
persist
:
{
...
...
src/utils/common.ts
View file @
d5f1810f
...
@@ -82,6 +82,44 @@ export const getDaysBetween = (date1:any, date2:any) => {
...
@@ -82,6 +82,44 @@ export const getDaysBetween = (date1:any, date2:any) => {
return
Math
.
round
(
difference
/
ONE_DAY
);
// 两个日期之间的天数
return
Math
.
round
(
difference
/
ONE_DAY
);
// 两个日期之间的天数
}
}
export
const
dateFormat
=
(
value
:
number
|
string
|
Date
=
Date
.
now
(),
format
=
'YYYY-MM-DD HH:mm:ss'
):
string
=>
{
if
(
typeof
value
===
'number'
||
typeof
value
===
'string'
)
{
var
date
=
new
Date
(
value
)
}
else
{
var
date
=
value
}
let
showTime
=
format
if
(
showTime
.
includes
(
'SSS'
))
{
const
S
=
String
(
date
.
getMilliseconds
())
showTime
=
showTime
.
replace
(
'SSS'
,
S
.
padStart
(
3
,
'0'
))
}
if
(
showTime
.
includes
(
'YY'
))
{
const
Y
=
String
(
date
.
getFullYear
())
showTime
=
showTime
.
includes
(
'YYYY'
)
?
showTime
.
replace
(
'YYYY'
,
Y
)
:
showTime
.
replace
(
'YY'
,
Y
.
slice
(
2
,
4
))
}
if
(
showTime
.
includes
(
'M'
))
{
const
M
=
String
(
date
.
getMonth
()
+
1
)
showTime
=
showTime
.
includes
(
'MM'
)
?
showTime
.
replace
(
'MM'
,
M
.
padStart
(
2
,
'0'
))
:
showTime
.
replace
(
'M'
,
M
)
}
if
(
showTime
.
includes
(
'D'
))
{
const
D
=
String
(
date
.
getDate
())
showTime
=
showTime
.
includes
(
'DD'
)
?
showTime
.
replace
(
'DD'
,
D
.
padStart
(
2
,
'0'
))
:
showTime
.
replace
(
'D'
,
D
)
}
if
(
showTime
.
includes
(
'H'
))
{
const
H
=
String
(
date
.
getHours
())
showTime
=
showTime
.
includes
(
'HH'
)
?
showTime
.
replace
(
'HH'
,
H
.
padStart
(
2
,
'0'
))
:
showTime
.
replace
(
'H'
,
H
)
}
if
(
showTime
.
includes
(
'm'
))
{
const
m
=
String
(
date
.
getMinutes
())
showTime
=
showTime
.
includes
(
'mm'
)
?
showTime
.
replace
(
'mm'
,
m
.
padStart
(
2
,
'0'
))
:
showTime
.
replace
(
'm'
,
m
)
}
if
(
showTime
.
includes
(
's'
))
{
const
s
=
String
(
date
.
getSeconds
())
showTime
=
showTime
.
includes
(
'ss'
)
?
showTime
.
replace
(
'ss'
,
s
.
padStart
(
2
,
'0'
))
:
showTime
.
replace
(
's'
,
s
)
}
return
showTime
}
export
const
formatDateTimeToRead
=
(
dateStr
:
string
,
prefix
:
string
=
''
)
=>
{
export
const
formatDateTimeToRead
=
(
dateStr
:
string
,
prefix
:
string
=
''
)
=>
{
let
minute
=
1000
*
60
;
let
minute
=
1000
*
60
;
let
hour
=
minute
*
60
;
let
hour
=
minute
*
60
;
...
...
src/views/Index.vue
View file @
d5f1810f
...
@@ -154,7 +154,7 @@
...
@@ -154,7 +154,7 @@
<el-icon><Plus
/></el-icon>
<el-icon><Plus
/></el-icon>
<span>
加入企业
</span>
<span>
加入企业
</span>
</el-menu-item>
</el-menu-item>
<el-menu-item
index=
"2"
class=
"rounded"
v-if=
"userInfo.it &&
userInfo.ia
"
@
click=
"redicetTo('/a')"
>
<el-menu-item
index=
"2"
class=
"rounded"
v-if=
"userInfo.it &&
(userInfo.ia || userInfo.ic)
"
@
click=
"redicetTo('/a')"
>
<el-icon><Setting
/></el-icon>
<el-icon><Setting
/></el-icon>
<span>
管理团队/企业
</span>
<span>
管理团队/企业
</span>
</el-menu-item>
</el-menu-item>
...
@@ -162,7 +162,7 @@
...
@@ -162,7 +162,7 @@
<IconLogout
size=
"18"
style=
"margin-right: 8px"
/>
<IconLogout
size=
"18"
style=
"margin-right: 8px"
/>
<span>
退出团队/企业
</span>
<span>
退出团队/企业
</span>
</el-menu-item>
</el-menu-item>
<el-menu-item
index=
"4"
class=
"rounded"
v-if=
"userInfo.it &&
userInfo.ia
"
>
<el-menu-item
index=
"4"
class=
"rounded"
v-if=
"userInfo.it &&
(userInfo.ia || userInfo.ic)
"
>
<IconShareOne
size=
"18"
style=
"margin-right: 8px"
/>
<IconShareOne
size=
"18"
style=
"margin-right: 8px"
/>
<span>
邀请成员
</span>
<span>
邀请成员
</span>
</el-menu-item>
</el-menu-item>
...
...
src/views/TeamCenter/Member.vue
View file @
d5f1810f
...
@@ -2,7 +2,20 @@
...
@@ -2,7 +2,20 @@
<div
class=
"full-height full-width column"
ref=
"memberListRef"
>
<div
class=
"full-height full-width column"
ref=
"memberListRef"
>
<div
class=
"row items-center"
>
<div
class=
"row items-center"
>
<div
class=
"text-dark text-weight-bolder col"
>
成员管理
</div>
<div
class=
"text-dark text-weight-bolder col"
>
成员管理
</div>
<el-button
class=
"ppt-button"
type=
"primary"
>
邀请成员
</el-button>
<el-popover
v-if=
"used[0]
<used
[
1
]"
:width=
"100"
popper-style=
"border-radius:10px; padding: 5px;"
>
<template
#
reference
>
<el-button
class=
"ppt-button text-normal"
type=
"primary"
>
邀请成员
</el-button>
</
template
>
<el-menu
class=
"no-border md-menu"
>
<!-- style="font-family: 'Microsoft JhengHei ui';" -->
<el-menu-item
@
click=
"inviteHandler(1)"
>
邀请成员
</el-menu-item>
<el-menu-item
@
click=
"inviteHandler(2)"
>
批量导入成员
</el-menu-item>
</el-menu>
</el-popover>
<
template
v-else
>
<div
class=
"text-small text-negative q-mr-md"
>
* 当前已无可用账号
</div>
<el-button
class=
"ppt-button text-normal"
type=
"primary"
>
购买席位
</el-button>
</
template
>
</div>
</div>
<div
class=
"q-mt-lg row flex-between"
>
<div
class=
"q-mt-lg row flex-between"
>
<el-select
v-model=
"parameters.t"
placeholder=
"用户角色"
style=
"width:150px"
size=
"default"
@
change=
"changeSearch"
>
<el-select
v-model=
"parameters.t"
placeholder=
"用户角色"
style=
"width:150px"
size=
"default"
@
change=
"changeSearch"
>
...
@@ -62,13 +75,15 @@
...
@@ -62,13 +75,15 @@
</el-table-column>
</el-table-column>
<el-table-column
prop=
""
label=
"操作"
width=
"150"
>
<el-table-column
prop=
""
label=
"操作"
width=
"150"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-button
v-if=
"scope.row.ic
"
link
type=
"primary"
class=
"ppt-button
"
>
转让
</el-button>
<el-button
v-if=
"scope.row.ic
&& userInfo.ic"
link
type=
"primary"
class=
"ppt-button"
@
click=
"setSaExchangeHandler
"
>
转让
</el-button>
<el-button
v-else
link
type=
"primary"
class=
"ppt-button"
@
click=
"removeMemeberHandler(scope.row)"
>
移除
</el-button>
<el-button
v-else
-if=
"!scope.row.ic"
link
type=
"primary"
class=
"ppt-button"
@
click=
"removeMemeberHandler(scope.row)"
>
移除
</el-button>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
</el-table>
</div>
</div>
</div>
</div>
<!-- 移除成员 -->
<el-dialog
v-model=
"removeVisible"
title=
"移除成员"
style=
"width:400px;"
>
<el-dialog
v-model=
"removeVisible"
title=
"移除成员"
style=
"width:400px;"
>
<main>
<main>
<el-alert
type=
"warning"
show-icon
:closable=
"false"
>
<el-alert
type=
"warning"
show-icon
:closable=
"false"
>
...
@@ -84,6 +99,25 @@
...
@@ -84,6 +99,25 @@
<el-button
:type=
"removeTokenStr!='移除并清空'?'info':'primary'"
size=
"large"
@
click=
"removeMember"
:disabled=
"removeTokenStr!='移除并清空' || loading"
class=
"ppt-button text-grey-8"
>
移除并清空
</el-button>
<el-button
:type=
"removeTokenStr!='移除并清空'?'info':'primary'"
size=
"large"
@
click=
"removeMember"
:disabled=
"removeTokenStr!='移除并清空' || loading"
class=
"ppt-button text-grey-8"
>
移除并清空
</el-button>
</
template
>
</
template
>
</el-dialog>
</el-dialog>
<!-- 转让管理员 -->
<el-dialog
v-model=
"exchangeVisible"
title=
"转让管理员"
style=
"width:400px;"
>
<main>
<el-alert
type=
"warning"
show-icon
:closable=
"false"
>
<
template
#
title
>
<span
class=
"text-normal text-dark"
>
你正在转让超级管理员,转让后你将失去团队/企业管理的最高权限,请谨慎操作
</span>
</
template
>
</el-alert>
<el-select
v-model=
"exchangeMember"
size=
"large"
class=
"full-width q-mt-md"
filterable
remote
reserve-keyword
placeholder=
"请输入成员姓名查找"
:remote-method=
"querySearchAsync"
:loading=
"exchangeLoading"
>
<el-option
v-for=
"item in exchangeMemberList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</main>
<
template
#
footer
>
<el-button
@
click=
"setSaExchangeHandler(false)"
size=
"large"
class=
"ppt-button"
:disabled=
"loading"
>
我再想想
</el-button>
<el-button
:type=
"exchangeMember==''?'info':'primary'"
size=
"large"
@
click=
"exchangeTenantSa"
:disabled=
"exchangeMember=='' || loading"
class=
"ppt-button text-grey-8"
>
确认转让
</el-button>
</
template
>
</el-dialog>
<invite-member
v-if=
"showAddMember"
:show-type=
"showAddMemberType"
@
close=
"()=>showAddMember=false"
@
imported=
"changeSearch"
></invite-member>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
...
@@ -91,14 +125,20 @@ import { ApiResult } from "@/configs/axios";
...
@@ -91,14 +125,20 @@ import { ApiResult } from "@/configs/axios";
import
{
USER_DEFAULT_HEADER
}
from
"@/configs/customer"
;
import
{
USER_DEFAULT_HEADER
}
from
"@/configs/customer"
;
import
OrgService
from
"@/services/OrgService"
;
import
OrgService
from
"@/services/OrgService"
;
import
UserServices
from
"@/services/UserService"
;
import
UserServices
from
"@/services/UserService"
;
import
{
useUserStore
}
from
"@/store"
;
import
{
ElLoading
,
ElMessage
}
from
"element-plus"
;
import
{
ElLoading
,
ElMessage
}
from
"element-plus"
;
import
{
storeToRefs
}
from
"pinia"
;
import
{
ref
}
from
"vue"
;
import
{
ref
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
InviteMember
from
'@/views/components/Team/InviteMember.vue'
const
userGroup
=
ref
<
{
id
:
number
,
name
:
string
}[]
>
([
const
userGroup
=
ref
<
{
id
:
number
,
name
:
string
}[]
>
([
{
id
:
0
,
name
:
'全部角色'
},
{
id
:
0
,
name
:
'全部角色'
},
{
id
:
1
,
name
:
'管理员'
},
{
id
:
1
,
name
:
'管理员'
},
{
id
:
2
,
name
:
'成员'
},
{
id
:
2
,
name
:
'成员'
},
])
])
const
userStore
=
useUserStore
()
const
{
userInfo
}
=
storeToRefs
(
userStore
)
const
data
=
ref
<
any
[]
>
([])
const
data
=
ref
<
any
[]
>
([])
const
loading
=
ref
(
false
)
const
loading
=
ref
(
false
)
const
pageCount
=
ref
(
0
)
const
pageCount
=
ref
(
0
)
...
@@ -109,6 +149,13 @@ const nickNameModel = ref('')
...
@@ -109,6 +149,13 @@ const nickNameModel = ref('')
const
removeVisible
=
ref
(
false
)
const
removeVisible
=
ref
(
false
)
const
removeTokenStr
=
ref
(
''
)
const
removeTokenStr
=
ref
(
''
)
const
removeMemberModel
=
ref
<
any
>
()
const
removeMemberModel
=
ref
<
any
>
()
const
exchangeVisible
=
ref
(
false
)
const
exchangeMember
=
ref
(
''
)
const
exchangeLoading
=
ref
(
false
)
const
exchangeMemberList
=
ref
<
any
[]
>
([])
const
router
=
useRouter
()
const
showAddMember
=
ref
(
false
)
const
showAddMemberType
=
ref
(
1
)
const
parameters
=
ref
<
any
>
({
const
parameters
=
ref
<
any
>
({
t
:
0
,
t
:
0
,
...
@@ -125,12 +172,19 @@ const setNickNameHandler = (target:any) =>{
...
@@ -125,12 +172,19 @@ const setNickNameHandler = (target:any) =>{
nickNameModel
.
value
=
''
nickNameModel
.
value
=
''
}
}
}
}
const
setSaExchangeHandler
=
(
status
:
boolean
)
=>
{
if
(
status
){
exchangeMember
.
value
=
''
exchangeVisible
.
value
=
true
exchangeMemberList
.
value
=
[]
}
else
{
exchangeVisible
.
value
=
false
}
}
const
getMembers
=
async
()
=>
{
const
getMembers
=
async
()
=>
{
if
(
loading
.
value
)
return
if
(
loading
.
value
)
return
loading
.
value
=
true
loading
.
value
=
true
//data.value = []
//pageCount.value = 0
const
response
=
await
OrgService
.
GetMembersAsync
(
parameters
.
value
)
const
response
=
await
OrgService
.
GetMembersAsync
(
parameters
.
value
)
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
&&
response
.
data
.
data
.
pageData
){
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
&&
response
.
data
.
data
.
pageData
){
...
@@ -139,6 +193,10 @@ const getMembers = async ()=>{
...
@@ -139,6 +193,10 @@ const getMembers = async ()=>{
}
}
loading
.
value
=
false
loading
.
value
=
false
}
}
const
inviteHandler
=
(
t
:
2
|
1
)
=>
{
showAddMemberType
.
value
=
t
showAddMember
.
value
=
true
}
const
removeMemeberHandler
=
(
target
:
any
)
=>
{
const
removeMemeberHandler
=
(
target
:
any
)
=>
{
removeMemberModel
.
value
=
target
removeMemberModel
.
value
=
target
removeVisible
.
value
=
true
removeVisible
.
value
=
true
...
@@ -167,6 +225,10 @@ const setMemberManagerStatus = async (target:any,value:0|1)=>{
...
@@ -167,6 +225,10 @@ const setMemberManagerStatus = async (target:any,value:0|1)=>{
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
ElMessage
.
success
({
message
:
'更新成功'
})
ElMessage
.
success
({
message
:
'更新成功'
})
target
.
isa
=
value
==
1
target
.
isa
=
value
==
1
if
(
userInfo
.
value
.
id
==
target
.
id
&&
value
!=
1
){
userInfo
.
value
.
ia
=
false
router
.
push
({
path
:
'/space'
})
}
}
else
{
}
else
{
ElMessage
.
error
({
message
:
'更新失败'
})
ElMessage
.
error
({
message
:
'更新失败'
})
}
}
...
@@ -181,6 +243,10 @@ const setMemberNickName = async (target:any)=>{
...
@@ -181,6 +243,10 @@ const setMemberNickName = async (target:any)=>{
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
ElMessage
.
success
({
message
:
'更新成功'
})
ElMessage
.
success
({
message
:
'更新成功'
})
target
.
name
=
nickNameModel
.
value
target
.
name
=
nickNameModel
.
value
if
(
userInfo
.
value
.
id
==
target
.
id
){
userInfo
.
value
.
nickname
=
nickNameModel
.
value
}
setNickNameHandler
(
null
)
setNickNameHandler
(
null
)
}
else
{
}
else
{
ElMessage
.
error
({
message
:
'更新失败'
})
ElMessage
.
error
({
message
:
'更新失败'
})
...
@@ -210,6 +276,41 @@ const removeMember = async ()=>{
...
@@ -210,6 +276,41 @@ const removeMember = async ()=>{
changeSearch
()
changeSearch
()
getMemberUsedStatus
()
getMemberUsedStatus
()
}
}
const
querySearchAsync
=
async
(
queryString
:
string
,
cb
:
(
arg
:
any
)
=>
void
)
=>
{
const
query
=
{
t
:
0
,
k
:
queryString
,
pageIndex
:
1
,
pageSize
:
2000
}
const
response
=
await
OrgService
.
GetMembersAsync
(
query
)
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
&&
response
.
data
.
data
.
pageData
){
exchangeMemberList
.
value
=
response
.
data
.
data
.
pageData
}
}
const
exchangeTenantSa
=
async
()
=>
{
if
(
exchangeMember
.
value
==
''
)
return
setSaExchangeHandler
(
false
)
const
loadingInstanct
=
ElLoading
.
service
({
text
:
'正在转移超级管理员权限'
})
const
response
=
await
UserServices
.
SetTenantSAAsync
(
exchangeMember
.
value
)
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
){
ElMessage
.
success
({
message
:
'权限转移成功'
})
const
isa
=
response
.
data
.
data
userStore
.
setOldSaPermission
(
isa
)
loadingInstanct
.
close
()
if
(
!
isa
)
router
.
push
({
path
:
'/space'
})
else
changeSearch
()
}
else
{
ElMessage
.
error
({
message
:
'移除失败'
})
loadingInstanct
.
close
()
}
}
getMembers
()
getMembers
()
getMemberUsedStatus
()
getMemberUsedStatus
()
</
script
>
</
script
>
...
...
src/views/components/Team/InviteMember.vue
0 → 100644
View file @
d5f1810f
<
template
>
<el-dialog
v-model=
"show"
title=
"邀请成员"
style=
"width:744px;"
@
close=
"closed"
class=
"bold-head q-pa-none"
>
<div
class=
"row"
style=
"height: 440px;"
>
<div
class=
"q-pa-md full-height"
style=
"width:164px; border-right: 1px solid #f1f2f4;"
>
<el-menu
class=
"no-border md-menu"
:default-active=
"currentMenu"
>
<el-menu-item
index=
"1"
@
click=
"currentMenu = '1'"
>
邀请成员
</el-menu-item>
<el-menu-item
index=
"2"
@
click=
"currentMenu = '2'"
>
批量导入成员
</el-menu-item>
</el-menu>
</div>
<div
class=
"col"
style=
"padding: 24px;"
v-if=
"currentMenu == '1'"
>
<div
class=
"text-dark"
>
发送链接邀请好友加入企业,一起创作吧~
</div>
<div
class=
"q-mt-xl"
>
<el-popover
trigger=
"click"
ref=
"popoverRef"
width=
"532px"
popper-style=
"border-radius:10px; padding: 5px;"
>
<template
#
reference
>
<div
class=
"row items-center borders-light group-share-buttom rounded"
style=
"padding:3px"
>
<div
class=
"col row items-center q-pl-lg cusor-pointer"
>
<span>
加入团队/企业后身份为
</span>
<span
class=
"q-mx-md"
>
{{
inviteIsAdmin
==
'0'
?
'成员'
:
'管理员'
}}
</span>
<IconDown
size=
"16px"
></IconDown>
</div>
<el-button
type=
"primary"
class=
"rounded"
@
click=
"(event) => copyInviteUrlHandler(event)"
:loading=
"copyLoading"
>
复制链接
</el-button>
</div>
</
template
>
<el-menu
class=
"no-border md-menu"
:default-active=
"inviteIsAdmin"
>
<el-menu-item
index=
"0"
@
click=
"setIsAdminHandler(0)"
>
邀请成员
</el-menu-item>
<el-menu-item
index=
"1"
@
click=
"setIsAdminHandler(1)"
>
邀请管理员
</el-menu-item>
</el-menu>
</el-popover>
</div>
<div
class=
"q-mt-md text-small text-info"
>
链接有效期14天
</div>
</div>
<div
class=
"col column"
style=
"padding: 24px;"
v-else
>
<div
class=
"row items-center"
>
<div
class=
"num-serial text-small q-mr-md"
>
1
</div>
<div
class=
"col text-dark"
style=
"font-size: 16px"
>
下载模板
</div>
</div>
<div
class=
"row items-center"
>
<div
style=
"border-left: 1px dashed #000; margin-left: 8px;margin-right: 9px; height:98px;"
></div>
<div
class=
"col q-ml-md"
>
<el-alert
type=
"info"
:closable=
"false"
>
<
template
#
title
>
<div
class=
"row items-center"
>
<div
class=
"col"
>
请按参考模板填写内容;字段不符合规则,则不予以导入
</div>
<div
class=
"text-primary row items-center cusor-pointer q-ml-md"
>
<IconToBottom
size=
"16"
class=
"q-mr-sm"
></IconToBottom>
<span>
下载导入模板
</span>
</div>
</div>
</
template
>
</el-alert>
</div>
</div>
<div
class=
"row items-center"
>
<div
class=
"num-serial text-small q-mr-md"
>
2
</div>
<div
class=
"col text-dark"
style=
"font-size: 16px"
>
上传文件
</div>
</div>
<div
class=
"q-mt-lg"
>
<el-upload
class=
"full-height full-width text-primary"
drag
action=
""
accept=
".xls,.xlsx"
>
<IconUpload
size=
"54"
class=
""
></IconUpload>
<div
class=
"el-upload__text"
>
<div
style=
"font-size: 16px;"
class=
"q-my-lg"
>
成员名单仅支持 .xls .xlsx
</div>
<div
class=
"text-center"
>
<el-button
class=
"ppt-button"
type=
"primary"
size=
"target"
>
导入成员名单
</el-button>
</div>
</div>
<
template
#
tip
></
template
>
</el-upload>
</div>
</div>
</div>
</el-dialog>
</template>
<
script
lang=
"ts"
setup
>
import
{
ApiResult
}
from
"@/configs/axios"
import
UserServices
from
"@/services/UserService"
import
{
useUserStore
}
from
"@/store"
import
{
copyText
}
from
"@/utils/clipboard"
import
{
dateFormat
}
from
"@/utils/common"
import
{
ElMessage
}
from
"element-plus"
import
{
storeToRefs
}
from
"pinia"
import
{
ref
,
unref
}
from
"vue"
const
props
=
defineProps
({
showType
:
{
type
:
Number
,
default
:
1
},
})
const
emit
=
defineEmits
<
{
(
event
:
'close'
):
void
,
(
event
:
'imported'
):
void
}
>
()
const
show
=
ref
(
true
)
const
currentMenu
=
ref
(
props
.
showType
.
toString
())
const
inviteIsAdmin
=
ref
(
'0'
)
const
popoverRef
=
ref
()
const
copyLoading
=
ref
(
false
)
const
useUser
=
useUserStore
()
const
{
userInfo
}
=
storeToRefs
(
useUser
)
const
closed
=
()
=>
{
emit
(
'close'
)
}
const
copyInviteUrlHandler
=
async
(
e
:
MouseEvent
)
=>
{
e
.
stopPropagation
()
if
(
copyLoading
.
value
)
return
copyLoading
.
value
=
true
const
ia
=
inviteIsAdmin
.
value
==
'0'
?
0
:
1
const
response
=
await
UserServices
.
SetTenantInviteCodeAsync
(
ia
)
if
(
response
.
data
.
resultCode
==
ApiResult
.
SUCCESS
)
{
let
currentDate
=
new
Date
();
currentDate
.
setDate
(
currentDate
.
getDate
()
+
14
);
const
url
=
`http://www.viitto.com/j/
${
response
.
data
.
data
}
\n我正在使用Travel Design,点击链接立即加入我的团队。\n邀请人:
${
userInfo
.
value
.
nickname
}
\n团队/企业名称:
${
userInfo
.
value
.
company
}
\n有效期至:
${
dateFormat
(
currentDate
,
"YYYYMMDD"
)}
`
copyText
(
url
)
ElMessage
.
success
({
message
:
'复制成功'
})
}
else
{
ElMessage
.
error
({
message
:
'当前无法生成邀请链接'
})
}
copyLoading
.
value
=
false
return
false
}
const
setIsAdminHandler
=
(
isa
:
number
)
=>
{
inviteIsAdmin
.
value
=
isa
.
toString
()
popoverRef
.
value
?.
hide
?.()
}
</
script
>
<
style
>
.bold-head
.el-dialog__header
{
font-weight
:
800
!important
;
}
.bold-head
.el-dialog__body
{
border-top
:
1px
solid
#F1f2f4
;
}
.q-pa-none
.el-dialog__body
{
padding
:
0
!important
;
}
.group-share-buttom
:hover
{
border-color
:
var
(
--el-color-primary
);
}
.num-serial
{
width
:
18px
;
height
:
18px
;
color
:
#000
;
border
:
1px
solid
#000
;
border-radius
:
18px
;
line-height
:
16px
;
text-align
:
center
;
background
:
#FFF
;
}
</
style
>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
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 comment