Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
41cb3e02
M
metersphere
项目概览
MeterSphere
/
metersphere
上一次同步 大约 3 年
通知
25
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
metersphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
41cb3e02
编写于
3月 04, 2021
作者:
S
song.tianyang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 设置模块,系统->用户、组织->成员 新增批量处理功能【添加工作空间】【添加角色】;工作空间->成员 新增批量处理功能【添加角色】
设置模块,系统->用户、组织->成员 新增批量处理功能【添加工作空间】【添加角色】;工作空间->成员 新增批量处理功能【添加角色】
上级
c8c96d89
变更
29
隐藏空白更改
内联
并排
Showing
29 changed file
with
972 addition
and
53 deletion
+972
-53
backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.java
...io/metersphere/base/mapper/ext/ExtOrganizationMapper.java
+1
-1
backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml
.../io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml
+6
-1
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.java
...in/java/io/metersphere/base/mapper/ext/ExtUserMapper.java
+4
-0
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml
...ain/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml
+26
-0
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserRoleMapper.java
...ava/io/metersphere/base/mapper/ext/ExtUserRoleMapper.java
+3
-0
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserRoleMapper.xml
...java/io/metersphere/base/mapper/ext/ExtUserRoleMapper.xml
+18
-0
backend/src/main/java/io/metersphere/base/mapper/ext/ExtWorkspaceMapper.java
...va/io/metersphere/base/mapper/ext/ExtWorkspaceMapper.java
+3
-1
backend/src/main/java/io/metersphere/base/mapper/ext/ExtWorkspaceMapper.xml
...ava/io/metersphere/base/mapper/ext/ExtWorkspaceMapper.xml
+12
-2
backend/src/main/java/io/metersphere/commons/constants/BatchProcessUserInfoType.java
...tersphere/commons/constants/BatchProcessUserInfoType.java
+5
-0
backend/src/main/java/io/metersphere/controller/UserController.java
...c/main/java/io/metersphere/controller/UserController.java
+58
-2
backend/src/main/java/io/metersphere/controller/request/UserRequest.java
...n/java/io/metersphere/controller/request/UserRequest.java
+5
-0
backend/src/main/java/io/metersphere/controller/request/resourcepool/UserBatchProcessRequest.java
...troller/request/resourcepool/UserBatchProcessRequest.java
+25
-0
backend/src/main/java/io/metersphere/dto/CascaderDTO.java
backend/src/main/java/io/metersphere/dto/CascaderDTO.java
+22
-0
backend/src/main/java/io/metersphere/dto/CascaderParse.java
backend/src/main/java/io/metersphere/dto/CascaderParse.java
+108
-0
backend/src/main/java/io/metersphere/excel/listener/UserDataListener.java
.../java/io/metersphere/excel/listener/UserDataListener.java
+7
-6
backend/src/main/java/io/metersphere/service/OrganizationService.java
...main/java/io/metersphere/service/OrganizationService.java
+2
-2
backend/src/main/java/io/metersphere/service/UserService.java
...end/src/main/java/io/metersphere/service/UserService.java
+143
-18
backend/src/main/java/io/metersphere/service/WorkspaceService.java
...rc/main/java/io/metersphere/service/WorkspaceService.java
+6
-2
backend/src/main/resources/i18n/messages.properties
backend/src/main/resources/i18n/messages.properties
+5
-0
backend/src/main/resources/i18n/messages_en_US.properties
backend/src/main/resources/i18n/messages_en_US.properties
+5
-0
backend/src/main/resources/i18n/messages_zh_CN.properties
backend/src/main/resources/i18n/messages_zh_CN.properties
+5
-0
backend/src/main/resources/i18n/messages_zh_TW.properties
backend/src/main/resources/i18n/messages_zh_TW.properties
+5
-0
frontend/src/business/components/settings/organization/OrganizationMember.vue
...s/components/settings/organization/OrganizationMember.vue
+120
-4
frontend/src/business/components/settings/system/User.vue
frontend/src/business/components/settings/system/User.vue
+130
-4
frontend/src/business/components/settings/system/components/UserCascader.vue
...ss/components/settings/system/components/UserCascader.vue
+124
-0
frontend/src/business/components/settings/workspace/WorkspaceMember.vue
...usiness/components/settings/workspace/WorkspaceMember.vue
+106
-7
frontend/src/i18n/en-US.js
frontend/src/i18n/en-US.js
+6
-1
frontend/src/i18n/zh-CN.js
frontend/src/i18n/zh-CN.js
+6
-1
frontend/src/i18n/zh-TW.js
frontend/src/i18n/zh-TW.js
+6
-1
未找到文件。
backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.java
浏览文件 @
41cb3e02
...
...
@@ -10,5 +10,5 @@ public interface ExtOrganizationMapper {
int
checkSourceRole
(
@Param
(
"sourceId"
)
String
sourceId
,
@Param
(
"userId"
)
String
userId
,
@Param
(
"roleId"
)
String
roleId
);
List
<
OrganizationMemberDTO
>
find
AllIdAndName
(
);
List
<
OrganizationMemberDTO
>
find
IdAndNameByOrganizationId
(
@Param
(
"organizationId"
)
String
organizationID
);
}
backend/src/main/java/io/metersphere/base/mapper/ext/ExtOrganizationMapper.xml
浏览文件 @
41cb3e02
...
...
@@ -11,7 +11,12 @@
</select>
<select
id=
"find
AllIdAndName
"
resultType=
"io.metersphere.dto.OrganizationMemberDTO"
>
<select
id=
"find
IdAndNameByOrganizationId
"
resultType=
"io.metersphere.dto.OrganizationMemberDTO"
>
select id,name from Organization
<where>
<if
test=
"organizationId != 'All'"
>
AND id = #{organizationId}
</if>
</where>
</select>
</mapper>
\ No newline at end of file
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.java
浏览文件 @
41cb3e02
package
io.metersphere.base.mapper.ext
;
import
io.metersphere.api.dto.automation.ApiScenarioRequest
;
import
io.metersphere.base.domain.User
;
import
io.metersphere.controller.request.UserRequest
;
import
io.metersphere.controller.request.resourcepool.UserBatchProcessRequest
;
import
io.metersphere.notice.domain.UserDetail
;
import
org.apache.ibatis.annotations.MapKey
;
import
org.apache.ibatis.annotations.Param
;
...
...
@@ -25,4 +27,6 @@ public interface ExtUserMapper {
Map
<
String
,
User
>
queryNameByIds
(
List
<
String
>
userIds
);
List
<
String
>
selectAllId
();
List
<
String
>
selectIdsByQuery
(
@Param
(
"request"
)
UserRequest
request
);
}
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserMapper.xml
浏览文件 @
41cb3e02
...
...
@@ -16,6 +16,27 @@
<result
column=
"phone"
jdbcType=
"VARCHAR"
property=
"phone"
/>
</resultMap>
<sql
id=
"queryWhereCondition"
>
<where>
<if
test=
"request.id != null"
>
AND user.id like CONCAT('%', #{request.id},'%')
</if>
<if
test=
"request.name != null"
>
AND user.name like CONCAT('%', #{request.name},'%')
</if>
<if
test=
"request.email != null"
>
AND user.email like CONCAT('%', #{request.email},'%')
</if>
<if
test=
"request.unSelectIds != null and request.unSelectIds.size() > 0"
>
AND user.id not in
<foreach
collection=
"request.unSelectIds"
item=
"itemId"
separator=
","
open=
"("
close=
")"
>
#{itemId}
</foreach>
</if>
</where>
</sql>
<select
id=
"getUserList"
resultMap=
"BaseResultMap"
>
select u.id, u.name, u.email, u.phone, u.language, u.status, u.source,
u.last_organization_id, u.last_workspace_id, u.language, u.create_time, u.update_time
...
...
@@ -76,4 +97,9 @@
select id from `user`
</select>
<select
id=
"selectIdsByQuery"
resultType=
"java.lang.String"
>
select user.id
from user
<include
refid=
"queryWhereCondition"
/>
</select>
</mapper>
\ No newline at end of file
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserRoleMapper.java
浏览文件 @
41cb3e02
...
...
@@ -2,6 +2,7 @@ package io.metersphere.base.mapper.ext;
import
io.metersphere.base.domain.Role
;
import
io.metersphere.base.domain.User
;
import
io.metersphere.controller.request.UserRequest
;
import
io.metersphere.controller.request.member.QueryMemberRequest
;
import
io.metersphere.controller.request.organization.QueryOrgMemberRequest
;
import
io.metersphere.dto.OrganizationMemberDTO
;
...
...
@@ -28,4 +29,6 @@ public interface ExtUserRoleMapper {
List
<
User
>
getTestManagerAndTestUserList
(
@Param
(
"request"
)
QueryMemberRequest
request
);
List
<
String
>
selectIdsByQuery
(
@Param
(
"organizationId"
)
String
organizationId
,
@Param
(
"orgMember"
)
UserRequest
condition
);
}
backend/src/main/java/io/metersphere/base/mapper/ext/ExtUserRoleMapper.xml
浏览文件 @
41cb3e02
...
...
@@ -108,4 +108,22 @@
</if>
order by user_role.update_time desc) temp
</select>
<select
id=
"selectIdsByQuery"
resultType=
"java.lang.String"
>
SELECT DISTINCT temp.id FROM (
SELECT `user`.* FROM user_role
JOIN `user` ON user_role.user_id = `user`.id
WHERE user_role.source_id in
(
SELECT id FROM workspace w
WHERE w.organization_id = #{organizationId}
UNION
SELECT #{organizationId} AS id FROM dual
)
<if
test=
"orgMember.name != null"
>
AND `user`.name like CONCAT('%', #{orgMember.name},'%')
</if>
order by user_role.update_time desc
) temp
</select>
</mapper>
\ No newline at end of file
backend/src/main/java/io/metersphere/base/mapper/ext/ExtWorkspaceMapper.java
浏览文件 @
41cb3e02
...
...
@@ -11,5 +11,7 @@ public interface ExtWorkspaceMapper {
List
<
WorkspaceDTO
>
getWorkspaceWithOrg
(
@Param
(
"request"
)
WorkspaceRequest
request
);
List
<
String
>
getWorkspaceIdsByOrgId
(
@Param
(
"orgId"
)
String
orgId
);
List
<
WorkspaceDTO
>
findAllIdAndName
();
String
getOrganizationIdById
(
String
resourceID
);
List
<
WorkspaceDTO
>
findIdAndNameByOrganizationId
(
@Param
(
"organizationId"
)
String
organizationId
);
}
backend/src/main/java/io/metersphere/base/mapper/ext/ExtWorkspaceMapper.xml
浏览文件 @
41cb3e02
...
...
@@ -18,8 +18,18 @@
where organization_id = #{orgId}
</select>
<select
id=
"findAllIdAndName"
resultType=
"io.metersphere.dto.WorkspaceDTO"
>
select id,name from workspace
<select
id=
"findIdAndNameByOrganizationId"
resultType=
"io.metersphere.dto.WorkspaceDTO"
>
select id,name,organization_id AS organizationId from workspace
<where>
<if
test=
"organizationId != 'All'"
>
AND organization_id = #{organizationId}
</if>
</where>
</select>
<select
id=
"getOrganizationIdById"
resultType=
"java.lang.String"
>
select organization_id from workspace
where id = #{orgId}
</select>
</mapper>
\ No newline at end of file
backend/src/main/java/io/metersphere/commons/constants/BatchProcessUserInfoType.java
0 → 100644
浏览文件 @
41cb3e02
package
io.metersphere.commons.constants
;
public
enum
BatchProcessUserInfoType
{
ADD_WORKSPACE
,
ADD_USER_ROLE
}
backend/src/main/java/io/metersphere/controller/UserController.java
浏览文件 @
41cb3e02
package
io.metersphere.controller
;
import
com.alibaba.fastjson.JSONObject
;
import
com.github.pagehelper.Page
;
import
com.github.pagehelper.PageHelper
;
import
io.metersphere.base.domain.Organization
;
import
io.metersphere.base.domain.User
;
import
io.metersphere.base.domain.Workspace
;
import
io.metersphere.commons.constants.RoleConstants
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.user.SessionUser
;
...
...
@@ -15,8 +18,8 @@ import io.metersphere.controller.request.member.QueryMemberRequest;
import
io.metersphere.controller.request.member.UserRequest
;
import
io.metersphere.controller.request.organization.AddOrgMemberRequest
;
import
io.metersphere.controller.request.organization.QueryOrgMemberRequest
;
import
io.metersphere.
dto.UserDTO
;
import
io.metersphere.dto.
UserRoleDTO
;
import
io.metersphere.
controller.request.resourcepool.UserBatchProcessRequest
;
import
io.metersphere.dto.
*
;
import
io.metersphere.excel.domain.ExcelResponse
;
import
io.metersphere.i18n.Translator
;
import
io.metersphere.service.CheckPermissionService
;
...
...
@@ -26,12 +29,16 @@ import io.metersphere.service.WorkspaceService;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.shiro.authz.annotation.Logical
;
import
org.apache.shiro.authz.annotation.RequiresRoles
;
import
org.checkerframework.checker.units.qual.C
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
@RequestMapping
(
"user"
)
@RestController
...
...
@@ -315,4 +322,53 @@ public class UserController {
public
ExcelResponse
testCaseImport
(
MultipartFile
file
,
@PathVariable
String
userId
)
{
return
userService
.
userImport
(
file
,
userId
);
}
@PostMapping
(
"/special/batchProcessUserInfo"
)
@RequiresRoles
(
value
=
{
RoleConstants
.
ADMIN
,
RoleConstants
.
ORG_ADMIN
,
RoleConstants
.
TEST_MANAGER
})
public
String
batchProcessUserInfo
(
@RequestBody
UserBatchProcessRequest
request
)
{
String
returnString
=
"success"
;
userService
.
batchProcessUserInfo
(
request
);
return
returnString
;
}
@GetMapping
(
"/getWorkspaceDataStruct/{organizationId}"
)
public
List
<
CascaderDTO
>
getWorkspaceDataStruct
(
@PathVariable
String
organizationId
)
{
List
<
OrganizationMemberDTO
>
organizationList
=
organizationService
.
findIdAndNameByOrganizationId
(
organizationId
);
List
<
WorkspaceDTO
>
workspaceDTOList
=
workspaceService
.
findIdAndNameByOrganizationId
(
organizationId
);
if
(!
workspaceDTOList
.
isEmpty
()){
Map
<
String
,
List
<
WorkspaceDTO
>>
orgIdWorkspaceMap
=
workspaceDTOList
.
stream
().
collect
(
Collectors
.
groupingBy
(
WorkspaceDTO:
:
getOrganizationId
));
List
<
CascaderDTO
>
returnList
=
CascaderParse
.
parseWorkspaceDataStruct
(
organizationList
,
orgIdWorkspaceMap
);
return
returnList
;
}
else
{
return
new
ArrayList
<>();
}
}
@GetMapping
(
"/getUserRoleDataStruct/{organizationId}"
)
public
List
<
CascaderDTO
>
getUserRoleDataStruct
(
@PathVariable
String
organizationId
)
{
List
<
OrganizationMemberDTO
>
organizationList
=
organizationService
.
findIdAndNameByOrganizationId
(
organizationId
);
List
<
WorkspaceDTO
>
workspaceDTOList
=
workspaceService
.
findIdAndNameByOrganizationId
(
organizationId
);
if
(!
workspaceDTOList
.
isEmpty
()){
Map
<
String
,
List
<
WorkspaceDTO
>>
orgIdWorkspaceMap
=
workspaceDTOList
.
stream
().
collect
(
Collectors
.
groupingBy
(
WorkspaceDTO:
:
getOrganizationId
));
List
<
CascaderDTO
>
returnList
=
CascaderParse
.
parseUserRoleDataStruct
(
organizationList
,
orgIdWorkspaceMap
,
false
);
return
returnList
;
}
else
{
return
new
ArrayList
<>();
}
}
@GetMapping
(
"/getWorkspaceUserRoleDataStruct/{organizationId}"
)
public
List
<
CascaderDTO
>
getWorkspaceUserRoleDataStruct
(
@PathVariable
String
organizationId
)
{
List
<
OrganizationMemberDTO
>
organizationList
=
organizationService
.
findIdAndNameByOrganizationId
(
organizationId
);
List
<
WorkspaceDTO
>
workspaceDTOList
=
workspaceService
.
findIdAndNameByOrganizationId
(
organizationId
);
if
(!
workspaceDTOList
.
isEmpty
()){
Map
<
String
,
List
<
WorkspaceDTO
>>
orgIdWorkspaceMap
=
workspaceDTOList
.
stream
().
collect
(
Collectors
.
groupingBy
(
WorkspaceDTO:
:
getOrganizationId
));
List
<
CascaderDTO
>
returnList
=
CascaderParse
.
parseUserRoleDataStruct
(
organizationList
,
orgIdWorkspaceMap
,
true
);
return
returnList
;
}
else
{
return
new
ArrayList
<>();
}
}
}
backend/src/main/java/io/metersphere/controller/request/UserRequest.java
浏览文件 @
41cb3e02
...
...
@@ -3,10 +3,15 @@ package io.metersphere.controller.request;
import
lombok.Getter
;
import
lombok.Setter
;
import
java.util.List
;
@Getter
@Setter
public
class
UserRequest
{
private
String
id
;
private
String
name
;
private
String
email
;
boolean
selectAll
;
List
<
String
>
unSelectIds
;
}
backend/src/main/java/io/metersphere/controller/request/resourcepool/UserBatchProcessRequest.java
0 → 100644
浏览文件 @
41cb3e02
package
io.metersphere.controller.request.resourcepool
;
import
io.metersphere.controller.request.UserRequest
;
import
lombok.Getter
;
import
lombok.Setter
;
import
java.util.List
;
import
java.util.concurrent.locks.Condition
;
/**
* @author song.tianyang
* @Date 2021/3/3 5:21 下午
* @Description
*/
@Getter
@Setter
public
class
UserBatchProcessRequest
{
List
<
String
>
ids
;
String
projectId
;
String
batchType
;
List
<
String
>
batchProcessValue
;
String
organizationId
;
UserRequest
condition
;
}
backend/src/main/java/io/metersphere/dto/CascaderDTO.java
0 → 100644
浏览文件 @
41cb3e02
package
io.metersphere.dto
;
import
lombok.Getter
;
import
lombok.Setter
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 级联选择器-数据格式
*
* @author song.tianyang
* @Date 2021/3/4 10:47 上午
* @Description
*/
@Getter
@Setter
public
class
CascaderDTO
{
private
String
value
;
private
String
label
;
private
List
<
CascaderDTO
>
children
;
}
backend/src/main/java/io/metersphere/dto/CascaderParse.java
0 → 100644
浏览文件 @
41cb3e02
package
io.metersphere.dto
;
import
bsh.StringUtil
;
import
io.metersphere.commons.constants.RoleConstants
;
import
io.metersphere.i18n.Translator
;
import
org.apache.commons.lang3.StringUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author song.tianyang
* @Date 2021/3/4 2:47 下午
* @Description
*/
public
class
CascaderParse
{
public
static
List
<
CascaderDTO
>
parseUserRoleDataStruct
(
List
<
OrganizationMemberDTO
>
organizationList
,
Map
<
String
,
List
<
WorkspaceDTO
>>
orgIdWorkspaceMap
,
boolean
hideOrgRole
)
{
List
<
CascaderDTO
>
returnList
=
new
ArrayList
<>();
for
(
OrganizationMemberDTO
orgDTO
:
organizationList
)
{
String
orgId
=
orgDTO
.
getId
();
List
<
WorkspaceDTO
>
workspaceDTOList
=
orgIdWorkspaceMap
.
get
(
orgId
);
CascaderDTO
orgCascader
=
generateCascaderDTO
(
orgDTO
.
getId
(),
orgDTO
.
getName
(),
null
);
if
(
workspaceDTOList
!=
null
)
{
List
<
CascaderDTO
>
children
=
new
ArrayList
<>();
for
(
WorkspaceDTO
workspace
:
workspaceDTOList
)
{
String
parentCascaderType
=
"workspace"
;
if
(
hideOrgRole
){
parentCascaderType
=
"hideOrg"
;
}
List
<
CascaderDTO
>
cascaderDTOList
=
getUserRoleCascaderDTO
(
parentCascaderType
,
workspace
.
getId
());
CascaderDTO
workspaceCascader
=
generateCascaderDTO
(
workspace
.
getId
(),
workspace
.
getName
(),
cascaderDTOList
);
children
.
add
(
workspaceCascader
);
}
orgCascader
.
setChildren
(
children
);
}
else
{
List
<
CascaderDTO
>
cascaderDTOList
=
getUserRoleCascaderDTO
(
"org"
,
orgDTO
.
getId
());
orgCascader
.
setChildren
(
cascaderDTOList
);
}
returnList
.
add
(
orgCascader
);
}
return
returnList
;
}
private
static
List
<
CascaderDTO
>
getUserRoleCascaderDTO
(
String
parentCascaderType
,
String
parentID
)
{
String
idPrefix
=
""
;
String
idSuffix
=
"<->"
+
parentCascaderType
;
if
(!
StringUtils
.
isEmpty
(
parentID
))
{
idPrefix
=
parentID
+
"<->"
;
}
CascaderDTO
orgAdminCascasder
=
generateCascaderDTO
(
idPrefix
+
RoleConstants
.
ORG_ADMIN
+
idSuffix
,
Translator
.
get
(
"org_admin"
),
null
);
CascaderDTO
orgMemberCascasder
=
generateCascaderDTO
(
idPrefix
+
RoleConstants
.
ORG_MEMBER
+
idSuffix
,
Translator
.
get
(
"org_member"
),
null
);
CascaderDTO
testManagerCascasder
=
generateCascaderDTO
(
idPrefix
+
RoleConstants
.
TEST_MANAGER
+
idSuffix
,
Translator
.
get
(
"test_manager"
),
null
);
CascaderDTO
testerCascasder
=
generateCascaderDTO
(
idPrefix
+
RoleConstants
.
TEST_USER
+
idSuffix
,
Translator
.
get
(
"tester"
),
null
);
CascaderDTO
readOnlyUserCascasder
=
generateCascaderDTO
(
idPrefix
+
RoleConstants
.
TEST_VIEWER
+
idSuffix
,
Translator
.
get
(
"read_only_user"
),
null
);
//默认都要添加这两种类型
List
<
CascaderDTO
>
returnList
=
new
ArrayList
<>();
switch
(
parentCascaderType
)
{
case
"workspace"
:
returnList
.
add
(
orgAdminCascasder
);
returnList
.
add
(
orgMemberCascasder
);
returnList
.
add
(
testManagerCascasder
);
returnList
.
add
(
testerCascasder
);
returnList
.
add
(
readOnlyUserCascasder
);
break
;
case
"org"
:
returnList
.
add
(
orgAdminCascasder
);
returnList
.
add
(
orgMemberCascasder
);
break
;
case
"hideOrg"
:
returnList
.
add
(
testManagerCascasder
);
returnList
.
add
(
testerCascasder
);
returnList
.
add
(
readOnlyUserCascasder
);
break
;
}
return
returnList
;
}
public
static
List
<
CascaderDTO
>
parseWorkspaceDataStruct
(
List
<
OrganizationMemberDTO
>
organizationList
,
Map
<
String
,
List
<
WorkspaceDTO
>>
orgIdWorkspaceMap
)
{
List
<
CascaderDTO
>
returnList
=
new
ArrayList
<>();
for
(
OrganizationMemberDTO
orgDTO
:
organizationList
)
{
String
orgId
=
orgDTO
.
getId
();
List
<
WorkspaceDTO
>
workspaceDTOList
=
orgIdWorkspaceMap
.
get
(
orgId
);
if
(
workspaceDTOList
!=
null
)
{
List
<
CascaderDTO
>
children
=
new
ArrayList
<>();
for
(
WorkspaceDTO
workspace
:
workspaceDTOList
)
{
CascaderDTO
workspaceCascader
=
generateCascaderDTO
(
workspace
.
getId
(),
workspace
.
getName
(),
null
);
children
.
add
(
workspaceCascader
);
}
CascaderDTO
orgCascader
=
generateCascaderDTO
(
orgDTO
.
getId
(),
orgDTO
.
getName
(),
children
);
returnList
.
add
(
orgCascader
);
}
}
return
returnList
;
}
private
static
CascaderDTO
generateCascaderDTO
(
String
value
,
String
lable
,
List
<
CascaderDTO
>
children
)
{
CascaderDTO
cascaderDTO
=
new
CascaderDTO
();
cascaderDTO
.
setLabel
(
lable
);
cascaderDTO
.
setValue
(
value
);
if
(
children
!=
null
&&
!
children
.
isEmpty
())
{
cascaderDTO
.
setChildren
(
children
);
}
return
cascaderDTO
;
}
}
backend/src/main/java/io/metersphere/excel/listener/UserDataListener.java
浏览文件 @
41cb3e02
package
io.metersphere.excel.listener
;
import
io.metersphere.commons.constants.RoleConstants
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.controller.request.member.UserRequest
;
...
...
@@ -176,37 +177,37 @@ public class UserDataListener extends EasyExcelListener<UserExcelData> {
if
(
StringUtils
.
equalsIgnoreCase
(
Translator
.
get
(
"options_yes"
),
data
.
getUserIsAdmin
()))
{
List
<
String
>
adminIdList
=
new
ArrayList
<>();
adminIdList
.
add
(
"adminSourceId"
);
Map
<
String
,
Object
>
adminRoleMap
=
this
.
genRoleMap
(
"admin"
,
adminIdList
);
Map
<
String
,
Object
>
adminRoleMap
=
this
.
genRoleMap
(
RoleConstants
.
ADMIN
,
adminIdList
);
roleMapList
.
add
(
adminRoleMap
);
}
//判断组织管理员
List
<
String
>
orgManagerOrdIdList
=
this
.
getIdByExcelInfoAndIdDic
(
data
.
getUserIsOrgAdmin
(),
data
.
getOrgAdminOrganization
(),
orgNameMap
);
if
(!
orgManagerOrdIdList
.
isEmpty
())
{
Map
<
String
,
Object
>
orgAdminRoleMap
=
this
.
genRoleMap
(
"org_admin"
,
orgManagerOrdIdList
);
Map
<
String
,
Object
>
orgAdminRoleMap
=
this
.
genRoleMap
(
RoleConstants
.
ORG_ADMIN
,
orgManagerOrdIdList
);
roleMapList
.
add
(
orgAdminRoleMap
);
}
//判断组织成员
List
<
String
>
orgMemberOrdIdList
=
this
.
getIdByExcelInfoAndIdDic
(
data
.
getUserIsOrgMember
(),
data
.
getOrgMemberOrganization
(),
orgNameMap
);
if
(!
orgMemberOrdIdList
.
isEmpty
())
{
Map
<
String
,
Object
>
orgMemberRoleMap
=
this
.
genRoleMap
(
"org_member"
,
orgMemberOrdIdList
);
Map
<
String
,
Object
>
orgMemberRoleMap
=
this
.
genRoleMap
(
RoleConstants
.
ORG_MEMBER
,
orgMemberOrdIdList
);
roleMapList
.
add
(
orgMemberRoleMap
);
}
//判断测试经理
List
<
String
>
testManagerWorkspaceIdList
=
this
.
getIdByExcelInfoAndIdDic
(
data
.
getUserIsTestManager
(),
data
.
getTestManagerWorkspace
(),
workspaceNameMap
);
if
(!
testManagerWorkspaceIdList
.
isEmpty
())
{
Map
<
String
,
Object
>
testManagerRoleMap
=
this
.
genRoleMap
(
"test_manager"
,
testManagerWorkspaceIdList
);
Map
<
String
,
Object
>
testManagerRoleMap
=
this
.
genRoleMap
(
RoleConstants
.
TEST_MANAGER
,
testManagerWorkspaceIdList
);
roleMapList
.
add
(
testManagerRoleMap
);
}
//判断测试人员
List
<
String
>
testgerWorkspaceIdList
=
this
.
getIdByExcelInfoAndIdDic
(
data
.
getUserIsTester
(),
data
.
getTesterWorkspace
(),
workspaceNameMap
);
if
(!
testgerWorkspaceIdList
.
isEmpty
())
{
Map
<
String
,
Object
>
testerRoleMap
=
this
.
genRoleMap
(
"test_user"
,
testgerWorkspaceIdList
);
Map
<
String
,
Object
>
testerRoleMap
=
this
.
genRoleMap
(
RoleConstants
.
TEST_USER
,
testgerWorkspaceIdList
);
roleMapList
.
add
(
testerRoleMap
);
}
//判断只读用户
List
<
String
>
viewerWorkspaceIdList
=
this
.
getIdByExcelInfoAndIdDic
(
data
.
getUserIsViewer
(),
data
.
getViewerWorkspace
(),
workspaceNameMap
);
if
(!
viewerWorkspaceIdList
.
isEmpty
())
{
Map
<
String
,
Object
>
testViewerRoleMap
=
this
.
genRoleMap
(
"test_viewer"
,
viewerWorkspaceIdList
);
Map
<
String
,
Object
>
testViewerRoleMap
=
this
.
genRoleMap
(
RoleConstants
.
TEST_VIEWER
,
viewerWorkspaceIdList
);
roleMapList
.
add
(
testViewerRoleMap
);
}
request
.
setRoles
(
roleMapList
);
...
...
backend/src/main/java/io/metersphere/service/OrganizationService.java
浏览文件 @
41cb3e02
...
...
@@ -179,7 +179,7 @@ public class OrganizationService {
}
}
public
List
<
OrganizationMemberDTO
>
find
AllIdAndName
(
){
return
extOrganizationMapper
.
find
AllIdAndName
(
);
public
List
<
OrganizationMemberDTO
>
find
IdAndNameByOrganizationId
(
String
OrganizationID
){
return
extOrganizationMapper
.
find
IdAndNameByOrganizationId
(
OrganizationID
);
}
}
backend/src/main/java/io/metersphere/service/UserService.java
浏览文件 @
41cb3e02
package
io.metersphere.service
;
import
com.alibaba.excel.EasyExcelFactory
;
import
io.metersphere.api.dto.automation.ApiScenarioRequest
;
import
io.metersphere.base.domain.*
;
import
io.metersphere.base.mapper.*
;
import
io.metersphere.base.mapper.ext.ExtOrganizationMapper
;
import
io.metersphere.base.mapper.ext.ExtUserMapper
;
import
io.metersphere.base.mapper.ext.ExtUserRoleMapper
;
import
io.metersphere.commons.constants.RoleConstants
;
import
io.metersphere.commons.constants.TestCaseConstants
;
import
io.metersphere.commons.constants.UserSource
;
import
io.metersphere.commons.constants.UserStatus
;
import
io.metersphere.commons.constants.*
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.user.SessionUser
;
import
io.metersphere.commons.utils.CodingUtil
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.commons.utils.SessionUtils
;
import
io.metersphere.commons.utils.*
;
import
io.metersphere.controller.ResultHolder
;
import
io.metersphere.controller.request.LoginRequest
;
import
io.metersphere.controller.request.member.AddMemberRequest
;
...
...
@@ -24,6 +19,7 @@ import io.metersphere.controller.request.member.QueryMemberRequest;
import
io.metersphere.controller.request.member.UserRequest
;
import
io.metersphere.controller.request.organization.AddOrgMemberRequest
;
import
io.metersphere.controller.request.organization.QueryOrgMemberRequest
;
import
io.metersphere.controller.request.resourcepool.UserBatchProcessRequest
;
import
io.metersphere.dto.OrganizationMemberDTO
;
import
io.metersphere.dto.UserDTO
;
import
io.metersphere.dto.UserRoleDTO
;
...
...
@@ -43,6 +39,7 @@ import org.apache.shiro.SecurityUtils;
import
org.apache.shiro.authc.*
;
import
org.apache.shiro.authz.UnauthorizedException
;
import
org.apache.shiro.subject.Subject
;
import
org.python.antlr.ast.Str
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.stereotype.Service
;
...
...
@@ -313,7 +310,6 @@ public class UserService {
userRoleExample
.
createCriteria
().
andUserIdEqualTo
(
userId
);
List
<
UserRole
>
userRoles
=
userRoleMapper
.
selectByExample
(
userRoleExample
);
List
<
String
>
list
=
userRoles
.
stream
().
map
(
UserRole:
:
getSourceId
).
collect
(
Collectors
.
toList
());
if
(!
CollectionUtils
.
isEmpty
(
list
))
{
if
(
list
.
contains
(
user
.
getLastWorkspaceId
())
||
list
.
contains
(
user
.
getLastOrganizationId
()))
{
user
.
setLastOrganizationId
(
""
);
...
...
@@ -335,7 +331,6 @@ public class UserService {
if
(
userMapper
.
countByExample
(
example
)
>
0
)
{
MSException
.
throwException
(
Translator
.
get
(
"user_email_already_exists"
));
}
user
.
setUpdateTime
(
System
.
currentTimeMillis
());
userMapper
.
updateByPrimaryKeySelective
(
user
);
}
...
...
@@ -651,7 +646,7 @@ public class UserService {
SessionUser
user
=
SessionUtils
.
getUser
();
for
(
int
i
=
1
;
i
<=
2
;
i
++)
{
UserExcelData
data
=
new
UserExcelData
();
data
.
setId
(
"user_id_"
+
i
);
data
.
setId
(
"user_id_"
+
i
);
data
.
setName
(
Translator
.
get
(
"user"
)
+
i
);
String
workspace
=
""
;
for
(
int
workspaceIndex
=
1
;
workspaceIndex
<=
i
;
workspaceIndex
++)
{
...
...
@@ -690,18 +685,18 @@ public class UserService {
try
{
Class
clazz
=
new
UserExcelDataFactory
().
getExcelDataByLocal
();
Map
<
String
,
String
>
orgNameMap
=
new
HashMap
<>();
Map
<
String
,
String
>
workspaceNameMap
=
new
HashMap
<>();
Map
<
String
,
String
>
orgNameMap
=
new
HashMap
<>();
Map
<
String
,
String
>
workspaceNameMap
=
new
HashMap
<>();
List
<
OrganizationMemberDTO
>
organizationList
=
extOrganizationMapper
.
find
AllIdAndName
(
);
List
<
OrganizationMemberDTO
>
organizationList
=
extOrganizationMapper
.
find
IdAndNameByOrganizationId
(
"All"
);
for
(
OrganizationMemberDTO
model
:
organizationList
)
{
orgNameMap
.
put
(
model
.
getName
(),
model
.
getId
());
orgNameMap
.
put
(
model
.
getName
(),
model
.
getId
());
}
List
<
WorkspaceDTO
>
workspaceList
=
workspaceService
.
find
AllIdAndName
(
);
List
<
WorkspaceDTO
>
workspaceList
=
workspaceService
.
find
IdAndNameByOrganizationId
(
"All"
);
for
(
WorkspaceDTO
model
:
workspaceList
)
{
workspaceNameMap
.
put
(
model
.
getName
(),
model
.
getId
());
workspaceNameMap
.
put
(
model
.
getName
(),
model
.
getId
());
}
EasyExcelListener
easyExcelListener
=
new
UserDataListener
(
clazz
,
workspaceNameMap
,
orgNameMap
);
EasyExcelListener
easyExcelListener
=
new
UserDataListener
(
clazz
,
workspaceNameMap
,
orgNameMap
);
EasyExcelFactory
.
read
(
multipartFile
.
getInputStream
(),
clazz
,
easyExcelListener
).
sheet
().
doRead
();
errList
=
easyExcelListener
.
getErrList
();
}
catch
(
Exception
e
)
{
...
...
@@ -722,4 +717,134 @@ public class UserService {
public
List
<
String
>
selectAllId
()
{
return
extUserMapper
.
selectAllId
();
}
/**
* 批量处理用户信息:
* 添加用户到工作空间;
* 添加用户权限
*
* @param request
*/
public
void
batchProcessUserInfo
(
UserBatchProcessRequest
request
)
{
List
<
String
>
userIdList
=
this
.
selectIdByUserRequest
(
request
);
String
batchType
=
request
.
getBatchType
();
for
(
String
userID
:
userIdList
)
{
Map
<
String
,
List
<
String
>>
roleResourceIdMap
=
new
HashMap
<>();
if
(
StringUtils
.
equals
(
BatchProcessUserInfoType
.
ADD_WORKSPACE
.
name
(),
batchType
))
{
//添加工作空间时,默认赋予只读用户权限
String
userRole
=
RoleConstants
.
TEST_VIEWER
;
List
<
String
>
workspaceID
=
request
.
getBatchProcessValue
();
if
(
workspaceID
!=
null
&&
!
workspaceID
.
isEmpty
())
{
roleResourceIdMap
.
put
(
userRole
,
workspaceID
);
}
}
else
if
(
StringUtils
.
equals
(
BatchProcessUserInfoType
.
ADD_USER_ROLE
.
name
(),
batchType
))
{
roleResourceIdMap
=
this
.
genRoleResourceMap
(
request
.
getBatchProcessValue
());
}
if
(!
roleResourceIdMap
.
isEmpty
())
{
UserRoleExample
userRoleExample
=
new
UserRoleExample
();
userRoleExample
.
createCriteria
().
andUserIdEqualTo
(
userID
);
List
<
UserRole
>
userRoles
=
userRoleMapper
.
selectByExample
(
userRoleExample
);
UserRequest
user
=
this
.
convert2UserRequest
(
userID
,
roleResourceIdMap
,
userRoles
);
this
.
addUserWorkspaceAndRole
(
user
,
userRoles
);
}
}
}
private
List
<
String
>
selectIdByUserRequest
(
UserBatchProcessRequest
request
)
{
if
(
request
.
getCondition
()
!=
null
&&
request
.
getCondition
().
isSelectAll
())
{
List
<
String
>
userIdList
=
new
ArrayList
<>();
if
(
StringUtils
.
isEmpty
(
request
.
getOrganizationId
())){
userIdList
=
extUserMapper
.
selectIdsByQuery
(
request
.
getCondition
());
}
else
{
//组织->成员 页面发起的请求
userIdList
=
extUserRoleMapper
.
selectIdsByQuery
(
request
.
getOrganizationId
(),
request
.
getCondition
());
}
return
userIdList
;
}
else
{
return
request
.
getIds
();
}
}
private
Map
<
String
,
List
<
String
>>
genRoleResourceMap
(
List
<
String
>
batchProcessValue
)
{
Map
<
String
,
List
<
String
>>
returnMap
=
new
HashMap
<>();
Map
<
String
,
String
>
workspaceToOrgMap
=
new
HashMap
<>();
for
(
String
string
:
batchProcessValue
)
{
String
[]
stringArr
=
string
.
split
(
"<->"
);
// string格式: 资源ID<->权限<->workspace/org
if
(
stringArr
.
length
==
3
)
{
String
resourceID
=
stringArr
[
0
];
String
role
=
stringArr
[
1
];
String
sourceType
=
stringArr
[
2
];
String
finalResourceId
=
resourceID
;
if
(
StringUtils
.
equalsIgnoreCase
(
sourceType
,
"workspace"
))
{
if
(
StringUtils
.
equalsAnyIgnoreCase
(
role
,
RoleConstants
.
ORG_ADMIN
,
RoleConstants
.
ORG_MEMBER
))
{
finalResourceId
=
workspaceToOrgMap
.
get
(
resourceID
);
if
(
finalResourceId
==
null
)
{
finalResourceId
=
workspaceService
.
getOrganizationIdById
(
resourceID
);
workspaceToOrgMap
.
put
(
resourceID
,
finalResourceId
);
}
}
}
if
(
StringUtils
.
isNotEmpty
(
finalResourceId
))
{
if
(
returnMap
.
containsKey
(
role
))
{
if
(!
returnMap
.
get
(
role
).
contains
(
finalResourceId
))
{
returnMap
.
get
(
role
).
add
(
finalResourceId
);
}
}
else
{
List
<
String
>
list
=
new
ArrayList
<>();
list
.
add
(
finalResourceId
);
returnMap
.
put
(
role
,
list
);
}
}
}
}
return
returnMap
;
}
private
UserRequest
convert2UserRequest
(
String
userID
,
Map
<
String
,
List
<
String
>>
roleIdMap
,
List
<
UserRole
>
userRoles
)
{
Map
<
String
,
List
<
String
>>
userRoleAndResourceMap
=
userRoles
.
stream
().
collect
(
Collectors
.
groupingBy
(
UserRole:
:
getRoleId
,
Collectors
.
mapping
(
UserRole:
:
getSourceId
,
Collectors
.
toList
())));
List
<
Map
<
String
,
Object
>>
roles
=
new
ArrayList
<>();
for
(
Map
.
Entry
<
String
,
List
<
String
>>
entry
:
roleIdMap
.
entrySet
())
{
String
role
=
entry
.
getKey
();
List
<
String
>
rawResourceIDList
=
entry
.
getValue
();
List
<
String
>
resourceIDList
=
new
ArrayList
<>();
for
(
String
resourceID
:
rawResourceIDList
)
{
if
(
userRoleAndResourceMap
.
containsKey
(
role
)
&&
userRoleAndResourceMap
.
get
(
role
).
contains
(
resourceID
))
{
continue
;
}
resourceIDList
.
add
(
resourceID
);
}
if
(
resourceIDList
.
isEmpty
())
{
continue
;
}
Map
<
String
,
Object
>
roleMap
=
new
HashMap
<>();
roleMap
.
put
(
"id"
,
role
);
roleMap
.
put
(
"ids"
,
resourceIDList
);
roles
.
add
(
roleMap
);
}
UserRequest
request
=
new
UserRequest
();
request
.
setId
(
userID
);
request
.
setRoles
(
roles
);
return
request
;
}
public
void
addUserWorkspaceAndRole
(
UserRequest
user
,
List
<
UserRole
>
userRoles
)
{
List
<
Map
<
String
,
Object
>>
roles
=
user
.
getRoles
();
if
(!
roles
.
isEmpty
())
{
insertUserRole
(
roles
,
user
.
getId
());
}
List
<
String
>
list
=
userRoles
.
stream
().
map
(
UserRole:
:
getSourceId
).
collect
(
Collectors
.
toList
());
if
(!
CollectionUtils
.
isEmpty
(
list
))
{
if
(
list
.
contains
(
user
.
getLastWorkspaceId
())
||
list
.
contains
(
user
.
getLastOrganizationId
()))
{
user
.
setLastOrganizationId
(
""
);
user
.
setLastWorkspaceId
(
""
);
userMapper
.
updateByPrimaryKeySelective
(
user
);
}
}
}
}
backend/src/main/java/io/metersphere/service/WorkspaceService.java
浏览文件 @
41cb3e02
...
...
@@ -286,7 +286,11 @@ public class WorkspaceService {
return
projectMapper
.
selectByExample
(
projectExample
);
}
public
List
<
WorkspaceDTO
>
findAllIdAndName
(){
return
extWorkspaceMapper
.
findAllIdAndName
();
public
String
getOrganizationIdById
(
String
resourceID
)
{
return
extWorkspaceMapper
.
getOrganizationIdById
(
resourceID
);
}
public
List
<
WorkspaceDTO
>
findIdAndNameByOrganizationId
(
String
organizationId
)
{
return
extWorkspaceMapper
.
findIdAndNameByOrganizationId
(
organizationId
);
}
}
backend/src/main/resources/i18n/messages.properties
浏览文件 @
41cb3e02
...
...
@@ -40,6 +40,11 @@ user_import_phone_format_wrong=
user_import_email_format_wrong
=
user_import_organization_not_fond
=
user_import_workspace_not_fond
=
org_admin
=
org_member
=
test_manager
=
tester
=
read_only_user
=
module
=
preconditions_optional
=
step_tip_separate
=
...
...
backend/src/main/resources/i18n/messages_en_US.properties
浏览文件 @
41cb3e02
...
...
@@ -116,6 +116,11 @@ user_import_phone_format_wrong=Wrong phone format
user_import_email_format_wrong
=
Wrong email format
user_import_organization_not_fond
=
Organization is not found
user_import_workspace_not_fond
=
Workspace is not found
org_admin
=
Organization manager
org_member
=
Organization member
test_manager
=
Test manager
tester
=
Tester
read_only_user
=
Read-only user
module
=
Module
preconditions_optional
=
Preconditions optional
step_tip_separate
=
Each step is separated by a new line
...
...
backend/src/main/resources/i18n/messages_zh_CN.properties
浏览文件 @
41cb3e02
...
...
@@ -116,6 +116,11 @@ user_import_phone_format_wrong=手机号码格式错误
user_import_email_format_wrong
=
电子邮箱格式错误
user_import_organization_not_fond
=
组织未找到
user_import_workspace_not_fond
=
工作空间未找到
org_admin
=
组织管理员
org_member
=
组织成员
test_manager
=
测试经理
tester
=
测试成员
read_only_user
=
只读用户
module
=
模块
preconditions_optional
=
前置条件选填
step_tip_separate
=
每个步骤以换行分隔
...
...
backend/src/main/resources/i18n/messages_zh_TW.properties
浏览文件 @
41cb3e02
...
...
@@ -116,6 +116,11 @@ user_import_phone_format_wrong=手機號碼格式錯誤
user_import_email_format_wrong
=
電子郵箱格式錯誤
user_import_organization_not_fond
=
組織未找到
user_import_workspace_not_fond
=
工作空間未找到
org_admin
=
組織管理員
org_member
=
組織成員
test_manager
=
測試經理
tester
=
測試成員
read_only_user
=
只讀用戶
module
=
模塊
preconditions_optional
=
前置條件選填
step_tip_separate
=
每個步驟以換行分隔
...
...
frontend/src/business/components/settings/organization/OrganizationMember.vue
浏览文件 @
41cb3e02
...
...
@@ -5,7 +5,22 @@
<ms-table-header
:condition.sync=
"condition"
@
search=
"initTableData"
@
create=
"create"
:create-tip=
"$t('member.create')"
:title=
"$t('commons.member')"
/>
</
template
>
<el-table
border
class=
"adjust-table"
:data=
"tableData"
style=
"width: 100%"
>
<el-table
border
class=
"adjust-table ms-select-all-fixed"
:data=
"tableData"
style=
"width: 100%"
@
select-all=
"handleSelectAll"
@
select=
"handleSelect"
ref=
"userTable"
>
<el-table-column
type=
"selection"
width=
"50"
/>
<ms-table-header-select-popover
v-show=
"total>0"
:page-size=
"pageSize>total?total:pageSize"
:total=
"total"
@
selectPageAll=
"isSelectDataAll(false)"
@
selectAll=
"isSelectDataAll(true)"
/>
<el-table-column
v-if=
"!referenced"
width=
"30"
min-width=
"30"
:resizable=
"false"
align=
"center"
>
<
template
v-slot:default=
"scope"
>
<show-more-btn
:is-show=
"scope.row.showMore"
:buttons=
"buttons"
:size=
"selectDataCounts"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"id"
label=
"ID"
/>
<el-table-column
prop=
"name"
:label=
"$t('commons.username')"
/>
<el-table-column
prop=
"email"
:label=
"$t('commons.email')"
/>
...
...
@@ -106,6 +121,7 @@
@
confirm=
"updateOrgMember('updateUserForm')"
/>
</
template
>
</el-dialog>
<user-cascader
:lable=
"batchAddLable"
:title=
"batchAddTitle"
@
confirm=
"cascaderConfirm"
ref=
"cascaderDialog"
></user-cascader>
</div>
</template>
...
...
@@ -116,11 +132,22 @@
import
MsRolesTag
from
"
../../common/components/MsRolesTag
"
;
import
MsTableOperator
from
"
../../common/components/MsTableOperator
"
;
import
MsDialogFooter
from
"
../../common/components/MsDialogFooter
"
;
import
{
getCurrentUser
,
listenGoBack
,
removeGoBackListener
}
from
"
../../../../common/js/utils
"
;
import
{
getCurrentProjectID
,
getCurrentOrganizationId
,
getCurrentUser
,
listenGoBack
,
removeGoBackListener
}
from
"
../../../../common/js/utils
"
;
import
MsTableHeaderSelectPopover
from
"
@/business/components/common/components/table/MsTableHeaderSelectPopover
"
;
import
{
_handleSelect
,
_handleSelectAll
,
getSelectDataCounts
,
setUnSelectIds
,
toggleAllSelection
}
from
"
@/common/js/tableUtils
"
;
import
UserCascader
from
"
@/business/components/settings/system/components/UserCascader
"
;
import
ShowMoreBtn
from
"
@/business/components/track/case/components/ShowMoreBtn
"
;
export
default
{
name
:
"
MsOrganizationMember
"
,
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
},
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
,
MsTableHeaderSelectPopover
,
UserCascader
,
ShowMoreBtn
},
activated
()
{
this
.
initTableData
();
},
...
...
@@ -147,6 +174,21 @@
total
:
0
,
options
:
[],
loading
:
false
,
selectDataCounts
:
0
,
batchAddLable
:
this
.
$t
(
'
project.please_choose_workspace
'
),
batchAddTitle
:
this
.
$t
(
'
project.batch_choose_workspace
'
),
selectRows
:
new
Set
(),
referenced
:
false
,
batchAddWorkspaceOptions
:[],
batchAddUserRoleOptions
:[],
buttons
:
[
{
name
:
this
.
$t
(
'
user.button.add_workspace_batch
'
),
handleClick
:
this
.
addWorkspaceBatch
},
{
name
:
this
.
$t
(
'
user.button.add_user_role_batch
'
),
handleClick
:
this
.
addUserRoleBatch
}
],
}
},
methods
:
{
...
...
@@ -275,7 +317,78 @@
}
else
{
this
.
options
=
[];
}
}
},
initWorkspaceBatchProcessDataStruct
(
isShow
){
let
organizationId
=
getCurrentOrganizationId
();
this
.
$get
(
"
/user/getWorkspaceDataStruct/
"
+
organizationId
,
response
=>
{
this
.
batchAddWorkspaceOptions
=
response
.
data
;
if
(
isShow
){
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_WORKSPACE
'
,
this
.
batchAddWorkspaceOptions
);
}
});
},
initRoleBatchProcessDataStruct
(
isShow
){
let
organizationId
=
getCurrentOrganizationId
();
this
.
$get
(
"
/user/getUserRoleDataStruct/
"
+
organizationId
,
response
=>
{
this
.
batchAddUserRoleOptions
=
response
.
data
;
if
(
isShow
){
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_USER_ROLE
'
,
this
.
batchAddUserRoleOptions
);
}
});
},
handleSelectAll
(
selection
)
{
_handleSelectAll
(
this
,
selection
,
this
.
tableData
,
this
.
selectRows
);
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
this
.
$emit
(
'
selection
'
,
selection
);
},
handleSelect
(
selection
,
row
)
{
_handleSelect
(
this
,
selection
,
row
,
this
.
selectRows
);
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
this
.
$emit
(
'
selection
'
,
selection
);
},
isSelectDataAll
(
data
)
{
this
.
condition
.
selectAll
=
data
;
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
toggleAllSelection
(
this
.
$refs
.
userTable
,
this
.
tableData
,
this
.
selectRows
);
},
addWorkspaceBatch
(){
if
(
this
.
batchAddWorkspaceOptions
.
length
==
0
){
this
.
initWorkspaceBatchProcessDataStruct
(
true
);
}
else
{
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_WORKSPACE
'
,
this
.
batchAddWorkspaceOptions
);
}
},
addUserRoleBatch
(){
if
(
this
.
batchAddUserRoleOptions
.
length
==
0
){
this
.
initRoleBatchProcessDataStruct
(
true
);
}
else
{
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_USER_ROLE
'
,
this
.
batchAddUserRoleOptions
);
}
},
cascaderConfirm
(
batchProcessTypeParam
,
selectValueArr
){
if
(
selectValueArr
.
length
==
0
){
this
.
$success
(
this
.
$t
(
'
commons.modify_success
'
));
}
let
params
=
{};
params
=
this
.
buildBatchParam
(
params
);
params
.
organizationId
=
getCurrentOrganizationId
();
params
.
batchType
=
batchProcessTypeParam
;
params
.
batchProcessValue
=
selectValueArr
;
this
.
$post
(
'
/user/special/batchProcessUserInfo
'
,
params
,
()
=>
{
this
.
$success
(
this
.
$t
(
'
commons.modify_success
'
));
this
.
initTableData
();
this
.
$refs
.
cascaderDialog
.
close
();
});
},
buildBatchParam
(
param
)
{
param
.
ids
=
Array
.
from
(
this
.
selectRows
).
map
(
row
=>
row
.
id
);
param
.
projectId
=
getCurrentProjectID
();
param
.
condition
=
this
.
condition
;
return
param
;
},
},
}
</
script
>
...
...
@@ -296,4 +409,7 @@
width
:
100%
;
}
/
deep
/
.ms-select-all-fixed
th
:nth-child
(
2
)
.el-icon-arrow-down
{
top
:
-5px
;
}
</
style
>
frontend/src/business/components/settings/system/User.vue
浏览文件 @
41cb3e02
...
...
@@ -8,9 +8,25 @@
</
template
>
<el-table
border
class=
"adjust-table"
:data=
"tableData"
style=
"width: 100%"
>
<el-table
border
class=
"adjust-table ms-select-all-fixed"
:data=
"tableData"
style=
"width: 100%"
@
select-all=
"handleSelectAll"
@
select=
"handleSelect"
ref=
"userTable"
>
<el-table-column
type=
"selection"
width=
"50"
/>
<ms-table-header-select-popover
v-show=
"total>0"
:page-size=
"pageSize>total?total:pageSize"
:total=
"total"
@
selectPageAll=
"isSelectDataAll(false)"
@
selectAll=
"isSelectDataAll(true)"
/>
<el-table-column
v-if=
"!referenced"
width=
"30"
min-width=
"30"
:resizable=
"false"
align=
"center"
>
<
template
v-slot:default=
"scope"
>
<show-more-btn
:is-show=
"scope.row.showMore"
:buttons=
"buttons"
:size=
"selectDataCounts"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"id"
label=
"ID"
/>
<el-table-column
prop=
"name"
:label=
"$t('commons.name')"
width=
"200"
/>
<el-table-column
:label=
"$t('commons.role')"
width=
"120"
>
<
template
v-slot:default=
"scope"
>
<ms-roles-tag
:roles=
"scope.row.roles"
/>
...
...
@@ -325,6 +341,7 @@
</span>
</el-dialog>
<user-import
ref=
"userImportDialog"
@
refreshAll=
"search"
></user-import>
<user-cascader
:lable=
"batchAddLable"
:title=
"batchAddTitle"
@
confirm=
"cascaderConfirm"
ref=
"cascaderDialog"
></user-cascader>
</div>
</template>
...
...
@@ -335,12 +352,22 @@ import MsTableHeader from "../../common/components/MsTableHeader";
import
MsTableOperator
from
"
../../common/components/MsTableOperator
"
;
import
MsDialogFooter
from
"
../../common/components/MsDialogFooter
"
;
import
MsTableOperatorButton
from
"
../../common/components/MsTableOperatorButton
"
;
import
{
hasRole
,
listenGoBack
,
removeGoBackListener
}
from
"
@/common/js/utils
"
;
import
{
getCurrentProjectID
,
getUUID
,
hasRole
,
listenGoBack
,
removeGoBackListener
}
from
"
@/common/js/utils
"
;
import
MsRolesTag
from
"
../../common/components/MsRolesTag
"
;
import
{
ROLE_ADMIN
}
from
"
@/common/js/constants
"
;
import
{
getCurrentUser
}
from
"
../../../../common/js/utils
"
;
import
{
PHONE_REGEX
}
from
"
@/common/js/regex
"
;
import
UserImport
from
"
@/business/components/settings/system/components/UserImport
"
;
import
MsTableHeaderSelectPopover
from
"
@/business/components/common/components/table/MsTableHeaderSelectPopover
"
;
import
{
_handleSelect
,
_handleSelectAll
,
getSelectDataCounts
,
setUnSelectIds
,
toggleAllSelection
}
from
"
@/common/js/tableUtils
"
;
import
UserCascader
from
"
@/business/components/settings/system/components/UserCascader
"
;
import
ShowMoreBtn
from
"
@/business/components/track/case/components/ShowMoreBtn
"
;
export
default
{
name
:
"
MsUser
"
,
...
...
@@ -352,19 +379,28 @@ export default {
MsDialogFooter
,
MsTableOperatorButton
,
MsRolesTag
,
UserImport
UserImport
,
MsTableHeaderSelectPopover
,
UserCascader
,
ShowMoreBtn
},
data
()
{
return
{
referenced
:
false
,
queryPath
:
'
/user/special/list
'
,
deletePath
:
'
/user/special/delete/
'
,
createPath
:
'
/user/special/add
'
,
updatePath
:
'
/user/special/update
'
,
editPasswordPath
:
'
/user/special/password
'
,
batchAddLable
:
this
.
$t
(
'
project.please_choose_workspace
'
),
batchAddTitle
:
this
.
$t
(
'
project.batch_choose_workspace
'
),
batchAddWorkspaceOptions
:[],
batchAddUserRoleOptions
:[],
result
:
{},
currentUserId
:
''
,
createVisible
:
false
,
updateVisible
:
false
,
selectDataCounts
:
0
,
editPasswordVisible
:
false
,
btnAddRole
:
false
,
multipleSelection
:
[],
...
...
@@ -373,6 +409,7 @@ export default {
pageSize
:
10
,
total
:
0
,
condition
:
{},
selectRows
:
new
Set
(),
tableData
:
[],
form
:
{
roles
:
[{
...
...
@@ -381,6 +418,14 @@ export default {
},
checkPasswordForm
:
{},
ruleForm
:
{},
buttons
:
[
{
name
:
this
.
$t
(
'
user.button.add_workspace_batch
'
),
handleClick
:
this
.
addWorkspaceBatch
},
{
name
:
this
.
$t
(
'
user.button.add_user_role_batch
'
),
handleClick
:
this
.
addUserRoleBatch
}
],
rule
:
{
id
:
[
{
required
:
true
,
message
:
this
.
$t
(
'
user.input_id
'
),
trigger
:
'
blur
'
},
...
...
@@ -530,6 +575,8 @@ export default {
if
(
!
hasRole
(
ROLE_ADMIN
))
{
return
;
}
this
.
selectRows
=
new
Set
();
this
.
condition
.
selectAll
=
false
;
this
.
result
=
this
.
$post
(
this
.
buildPagePath
(
this
.
queryPath
),
this
.
condition
,
response
=>
{
let
data
=
response
.
data
;
this
.
total
=
data
.
itemCount
;
...
...
@@ -629,10 +676,89 @@ export default {
}
return
value
;
})
}
},
initWorkspaceBatchProcessDataStruct
(
isShow
){
this
.
$get
(
"
/user/getWorkspaceDataStruct/All
"
,
response
=>
{
this
.
batchAddWorkspaceOptions
=
response
.
data
;
if
(
isShow
){
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_WORKSPACE
'
,
this
.
batchAddWorkspaceOptions
);
}
});
},
initRoleBatchProcessDataStruct
(
isShow
){
this
.
$get
(
"
/user/getUserRoleDataStruct/All
"
,
response
=>
{
this
.
batchAddUserRoleOptions
=
response
.
data
;
if
(
isShow
){
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_USER_ROLE
'
,
this
.
batchAddUserRoleOptions
);
}
});
},
handleSelectAll
(
selection
)
{
_handleSelectAll
(
this
,
selection
,
this
.
tableData
,
this
.
selectRows
);
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
this
.
$emit
(
'
selection
'
,
selection
);
},
handleSelect
(
selection
,
row
)
{
_handleSelect
(
this
,
selection
,
row
,
this
.
selectRows
);
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
this
.
$emit
(
'
selection
'
,
selection
);
},
isSelectDataAll
(
data
)
{
this
.
condition
.
selectAll
=
data
;
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
toggleAllSelection
(
this
.
$refs
.
userTable
,
this
.
tableData
,
this
.
selectRows
);
},
addWorkspaceBatch
(){
if
(
this
.
batchAddWorkspaceOptions
.
length
==
0
){
this
.
initWorkspaceBatchProcessDataStruct
(
true
);
}
else
{
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_WORKSPACE
'
,
this
.
batchAddWorkspaceOptions
);
}
},
addUserRoleBatch
(){
if
(
this
.
batchAddUserRoleOptions
.
length
==
0
){
this
.
initRoleBatchProcessDataStruct
(
true
);
}
else
{
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_USER_ROLE
'
,
this
.
batchAddUserRoleOptions
);
}
},
cascaderConfirm
(
batchProcessTypeParam
,
selectValueArr
){
if
(
selectValueArr
.
length
==
0
){
this
.
$success
(
this
.
$t
(
'
commons.modify_success
'
));
}
let
params
=
{};
params
=
this
.
buildBatchParam
(
params
);
params
.
batchType
=
batchProcessTypeParam
;
params
.
batchProcessValue
=
selectValueArr
;
this
.
$post
(
'
/user/special/batchProcessUserInfo
'
,
params
,
()
=>
{
this
.
$success
(
this
.
$t
(
'
commons.modify_success
'
));
this
.
search
();
this
.
$refs
.
cascaderDialog
.
close
();
});
},
buildBatchParam
(
param
)
{
param
.
ids
=
Array
.
from
(
this
.
selectRows
).
map
(
row
=>
row
.
id
);
param
.
projectId
=
getCurrentProjectID
();
param
.
condition
=
this
.
condition
;
return
param
;
},
}
}
</
script
>
<
style
scoped
>
/
deep
/
.el-table__fixed-right
{
height
:
100%
!important
;
}
/
deep
/
.el-table__fixed
{
height
:
110px
!important
;
}
/
deep
/
.ms-select-all-fixed
th
:nth-child
(
2
)
.el-icon-arrow-down
{
top
:
-5px
;
}
</
style
>
frontend/src/business/components/settings/system/components/UserCascader.vue
0 → 100644
浏览文件 @
41cb3e02
<
template
>
<el-dialog
class=
"user-casecader"
:title=
"title"
:visible.sync=
"dialogVisible"
@
close=
"close"
>
<div
class=
"block"
>
<!--
<el-row>
-->
<!--
<span
class=
"demonstration"
v-html=
"lable"
></span>
-->
<!--
</el-row>
-->
<el-form
:model=
"ruleForm"
:rules=
"rules"
ref=
"ruleForm"
label-width=
"100px"
class=
"demo-ruleForm"
>
<el-form-item
prop=
"workspace"
label-width=
"0px"
>
<el-cascader
:options=
"options"
:props=
"props"
v-model=
"selectedIds"
ref=
"cascaderSelector"
style=
"width:100%"
:key=
"isResouceShow"
clearable
></el-cascader>
</el-form-item>
</el-form>
</div>
<span
slot=
"footer"
class=
"dialog-footer"
>
<ms-dialog-footer
@
cancel=
"close()"
@
confirm=
"confirm()"
/>
</span>
</el-dialog>
</
template
>
<
script
>
import
ElUploadList
from
"
element-ui/packages/upload/src/upload-list
"
;
import
MsTableButton
from
'
../../../../components/common/components/MsTableButton
'
;
import
{
listenGoBack
,
removeGoBackListener
}
from
"
../../../../../common/js/utils
"
;
import
MsDialogFooter
from
"
@/business/components/common/components/MsDialogFooter
"
;
export
default
{
name
:
"
UserImport
"
,
components
:
{
ElUploadList
,
MsTableButton
,
MsDialogFooter
},
data
()
{
var
validateSelect
=
(
rule
,
value
,
callback
)
=>
{
let
checkNodes
=
this
.
$refs
.
cascaderSelector
.
checkedNodes
;
if
(
checkNodes
.
length
==
0
){
callback
(
new
Error
(
this
.
$t
(
'
workspace.select
'
)));
}
callback
();
};
return
{
ruleForm
:
{
workspace
:
''
,
},
rules
:
{
workspace
:
[
{
validator
:
validateSelect
,
message
:
this
.
$t
(
'
workspace.select
'
),
trigger
:
'
change
'
}
],
},
selectedIds
:[],
isResouceShow
:
0
,
props
:
{
multiple
:
true
},
dialogVisible
:
false
,
isLoading
:
false
,
batchProcessType
:
''
,
options
:[],
};
},
props
:
{
title
:
{
type
:
String
,
default
:
''
},
lable
:
{
type
:
String
,
default
:
''
},
},
methods
:
{
close
()
{
removeGoBackListener
(
this
.
close
);
this
.
dialogVisible
=
false
;
this
.
selectedIds
=
[];
++
this
.
isResouceShow
;
this
.
options
=
[];
this
.
$refs
[
'
ruleForm
'
].
resetFields
();
},
open
(
batchProcessType
,
optionsParam
)
{
listenGoBack
(
this
.
close
);
this
.
dialogVisible
=
true
;
this
.
batchProcessType
=
batchProcessType
;
this
.
options
=
optionsParam
;
if
(
this
.
batchProcessType
==
'
ADD_WORKSPACE
'
){
this
.
rules
.
workspace
[
0
].
message
=
this
.
$t
(
'
workspace.select
'
);
}
else
{
this
.
rules
.
workspace
[
0
].
message
=
this
.
$t
(
'
role.please_choose_role
'
);
}
},
confirm
(){
this
.
$refs
.
ruleForm
.
validate
((
valid
)
=>
{
if
(
valid
)
{
let
checkNodes
=
this
.
$refs
.
cascaderSelector
.
checkedNodes
;
let
selectValueArr
=
[];
for
(
let
i
=
0
;
i
<
checkNodes
.
length
;
i
++
)
{
selectValueArr
.
push
(
checkNodes
[
i
].
value
);
}
this
.
$emit
(
'
confirm
'
,
this
.
batchProcessType
,
selectValueArr
)
}
else
{
return
false
;
}
});
}
}
}
</
script
>
<
style
>
</
style
>
<
style
scoped
>
.user-casecader
>>>
.el-dialog
{
width
:
400px
;
}
/
deep
/
.el-form-item__content
{
margin-left
:
0px
;
}
</
style
>
frontend/src/business/components/settings/workspace/WorkspaceMember.vue
浏览文件 @
41cb3e02
...
...
@@ -5,7 +5,23 @@
<ms-table-header
:condition.sync=
"condition"
@
search=
"initTableData"
@
create=
"create"
:create-tip=
"$t('member.create')"
:title=
"$t('commons.member')"
/>
</
template
>
<el-table
border
class=
"adjust-table"
:data=
"tableData"
style=
"width: 100%"
>
<el-table
border
class=
"adjust-table ms-select-all-fixed"
:data=
"tableData"
style=
"width: 100%"
@
select-all=
"handleSelectAll"
@
select=
"handleSelect"
ref=
"userTable"
>
<el-table-column
type=
"selection"
width=
"50"
/>
<ms-table-header-select-popover
v-show=
"total>0"
:page-size=
"pageSize>total?total:pageSize"
:total=
"total"
@
selectPageAll=
"isSelectDataAll(false)"
@
selectAll=
"isSelectDataAll(true)"
/>
<el-table-column
v-if=
"!referenced"
width=
"30"
min-width=
"30"
:resizable=
"false"
align=
"center"
>
<
template
v-slot:default=
"scope"
>
<show-more-btn
:is-show=
"scope.row.showMore"
:buttons=
"buttons"
:size=
"selectDataCounts"
/>
</
template
>
</el-table-column>
<el-table-column
prop=
"id"
label=
"ID"
/>
<el-table-column
prop=
"name"
:label=
"$t('commons.username')"
/>
<el-table-column
prop=
"email"
:label=
"$t('commons.email')"
/>
...
...
@@ -97,7 +113,7 @@
@
confirm=
"updateWorkspaceMember('updateUserForm')"
/>
</
template
>
</el-dialog>
<user-cascader
:lable=
"batchAddLable"
:title=
"batchAddTitle"
@
confirm=
"cascaderConfirm"
ref=
"cascaderDialog"
></user-cascader>
</div>
</template>
...
...
@@ -108,11 +124,27 @@
import
MsRolesTag
from
"
../../common/components/MsRolesTag
"
;
import
MsTableOperator
from
"
../../common/components/MsTableOperator
"
;
import
MsDialogFooter
from
"
../../common/components/MsDialogFooter
"
;
import
{
getCurrentUser
,
listenGoBack
,
removeGoBackListener
}
from
"
../../../../common/js/utils
"
;
import
{
getCurrentOrganizationId
,
getCurrentProjectID
,
getCurrentUser
,
listenGoBack
,
removeGoBackListener
}
from
"
../../../../common/js/utils
"
;
import
MsTableHeaderSelectPopover
from
"
@/business/components/common/components/table/MsTableHeaderSelectPopover
"
;
import
{
_handleSelect
,
_handleSelectAll
,
getSelectDataCounts
,
setUnSelectIds
,
toggleAllSelection
}
from
"
@/common/js/tableUtils
"
;
import
UserCascader
from
"
@/business/components/settings/system/components/UserCascader
"
;
import
ShowMoreBtn
from
"
@/business/components/track/case/components/ShowMoreBtn
"
;
export
default
{
name
:
"
MsMember
"
,
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
},
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
,
MsTableHeaderSelectPopover
,
UserCascader
,
ShowMoreBtn
},
data
()
{
return
{
result
:
{},
...
...
@@ -135,6 +167,17 @@
currentPage
:
1
,
pageSize
:
10
,
total
:
0
,
selectDataCounts
:
0
,
batchAddLable
:
this
.
$t
(
'
project.please_choose_workspace
'
),
batchAddTitle
:
this
.
$t
(
'
project.batch_choose_workspace
'
),
selectRows
:
new
Set
(),
referenced
:
false
,
batchAddUserRoleOptions
:[],
buttons
:
[
{
name
:
this
.
$t
(
'
user.button.add_user_role_batch
'
),
handleClick
:
this
.
addUserRoleBatch
}
],
}
},
activated
:
function
()
{
...
...
@@ -283,9 +326,62 @@
return
(
user
.
email
.
indexOf
(
queryString
.
toLowerCase
())
===
0
||
user
.
id
.
indexOf
(
queryString
.
toLowerCase
())
===
0
);
};
},
handleSelect
(
item
)
{
this
.
$set
(
this
.
form
,
"
userId
"
,
item
.
id
);
}
initRoleBatchProcessDataStruct
(
isShow
){
let
organizationId
=
getCurrentOrganizationId
();
this
.
$get
(
"
/user/getWorkspaceUserRoleDataStruct/
"
+
organizationId
,
response
=>
{
this
.
batchAddUserRoleOptions
=
response
.
data
;
if
(
isShow
){
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_USER_ROLE
'
,
this
.
batchAddUserRoleOptions
);
}
});
},
handleSelectAll
(
selection
)
{
_handleSelectAll
(
this
,
selection
,
this
.
tableData
,
this
.
selectRows
);
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
this
.
$emit
(
'
selection
'
,
selection
);
},
handleSelect
(
selection
,
row
)
{
_handleSelect
(
this
,
selection
,
row
,
this
.
selectRows
);
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
this
.
$emit
(
'
selection
'
,
selection
);
this
.
$set
(
this
.
form
,
"
userId
"
,
selection
.
id
);
},
isSelectDataAll
(
data
)
{
this
.
condition
.
selectAll
=
data
;
setUnSelectIds
(
this
.
tableData
,
this
.
condition
,
this
.
selectRows
);
this
.
selectDataCounts
=
getSelectDataCounts
(
this
.
condition
,
this
.
total
,
this
.
selectRows
);
toggleAllSelection
(
this
.
$refs
.
userTable
,
this
.
tableData
,
this
.
selectRows
);
},
addUserRoleBatch
(){
if
(
this
.
batchAddUserRoleOptions
.
length
==
0
){
this
.
initRoleBatchProcessDataStruct
(
true
);
}
else
{
this
.
$refs
.
cascaderDialog
.
open
(
'
ADD_USER_ROLE
'
,
this
.
batchAddUserRoleOptions
);
}
},
cascaderConfirm
(
batchProcessTypeParam
,
selectValueArr
){
if
(
selectValueArr
.
length
==
0
){
this
.
$success
(
this
.
$t
(
'
commons.modify_success
'
));
}
let
params
=
{};
params
=
this
.
buildBatchParam
(
params
);
params
.
organizationId
=
getCurrentOrganizationId
();
params
.
batchType
=
batchProcessTypeParam
;
params
.
batchProcessValue
=
selectValueArr
;
this
.
$post
(
'
/user/special/batchProcessUserInfo
'
,
params
,
()
=>
{
this
.
$success
(
this
.
$t
(
'
commons.modify_success
'
));
this
.
initTableData
();
this
.
$refs
.
cascaderDialog
.
close
();
});
},
buildBatchParam
(
param
)
{
param
.
ids
=
Array
.
from
(
this
.
selectRows
).
map
(
row
=>
row
.
id
);
param
.
projectId
=
getCurrentProjectID
();
param
.
condition
=
this
.
condition
;
return
param
;
},
}
}
</
script
>
...
...
@@ -314,4 +410,7 @@
width
:
100%
;
}
/
deep
/
.ms-select-all-fixed
th
:nth-child
(
2
)
.el-icon-arrow-down
{
top
:
-5px
;
}
</
style
>
frontend/src/i18n/en-US.js
浏览文件 @
41cb3e02
...
...
@@ -237,6 +237,7 @@ export default {
search_by_name
:
'
Search by name
'
,
organization_name
:
'
Organization Name
'
,
please_choose_organization
:
'
Please Choose Organization
'
,
batch_choose_workspace
:
'
Please choose organizations
'
,
please_select_a_workspace_first
:
'
Please select a workspace first!
'
,
none
:
'
None Workspace
'
,
select
:
'
Select Workspace
'
,
...
...
@@ -372,7 +373,11 @@ export default {
delete_confirm
:
'
Are you sure you want to delete this User?
'
,
apikey_delete_confirm
:
'
Are you sure you want to delete this API Key?
'
,
input_id_placeholder
:
'
Please enter ID (Chinese characters are not supported)
'
,
source
:
'
Source
'
source
:
'
Source
'
,
button
:{
add_workspace_batch
:
'
Batch add user to workspace
'
,
add_user_role_batch
:
'
Batch add user role
'
,
}
},
role
:
{
please_choose_role
:
'
Please Choose Role
'
,
...
...
frontend/src/i18n/zh-CN.js
浏览文件 @
41cb3e02
...
...
@@ -326,6 +326,7 @@ export default {
input_name
:
'
请输入项目名称
'
,
owning_workspace
:
'
所属工作空间
'
,
please_choose_workspace
:
'
请选择工作空间
'
,
batch_choose_workspace
:
'
批量选择工作空间
'
,
special_characters_are_not_supported
:
'
格式错误(不支持特殊字符,且不能以
\'
-
\'
开头结尾)
'
,
tapd_id
:
'
TAPD项目ID
'
,
jira_key
:
'
JIRA项目key
'
,
...
...
@@ -373,7 +374,11 @@ export default {
delete_confirm
:
'
这个用户确定要删除吗?
'
,
apikey_delete_confirm
:
'
这个 API Key 确定要删除吗?
'
,
input_id_placeholder
:
'
请输入ID (不支持中文)
'
,
source
:
'
用户来源
'
source
:
'
用户来源
'
,
button
:{
add_workspace_batch
:
'
批量添加到工作空间
'
,
add_user_role_batch
:
'
批量添加角色
'
,
}
},
role
:
{
please_choose_role
:
'
请选择角色
'
,
...
...
frontend/src/i18n/zh-TW.js
浏览文件 @
41cb3e02
...
...
@@ -323,6 +323,7 @@ export default {
input_name
:
'
請輸入項目名稱
'
,
owning_workspace
:
'
所屬工作空間
'
,
please_choose_workspace
:
'
請選擇工作空間
'
,
batch_choose_workspace
:
'
批量選擇工作空間
'
,
special_characters_are_not_supported
:
'
格式錯誤(不支持特殊字符,且不能以
\'
-
\'
開頭結尾)
'
,
tapd_id
:
'
TAPD項目ID
'
,
jira_key
:
'
JIRA項目key
'
,
...
...
@@ -370,7 +371,11 @@ export default {
delete_confirm
:
'
這個用戶確定要刪除嗎?
'
,
apikey_delete_confirm
:
'
這個 API Key 確定要刪除嗎?
'
,
input_id_placeholder
:
'
請輸入ID (不支持中文)
'
,
source
:
'
用戶來源
'
source
:
'
用戶來源
'
,
button
:{
add_workspace_batch
:
'
批量添加到工作空間
'
,
add_user_role_batch
:
'
批量添加角色
'
,
}
},
role
:
{
please_choose_role
:
'
請選擇角色
'
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录