mirror of
https://gitee.com/dromara/MaxKey.git
synced 2025-12-08 01:48:33 +08:00
修复用户组bug
This commit is contained in:
parent
77182946e0
commit
32656d5aa5
@ -26,7 +26,7 @@ import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "MXK_ROLE_MEMBER")
|
||||
@Table(name = "mxk_group_member")
|
||||
public class GroupMember extends UserInfo implements Serializable{
|
||||
|
||||
/**
|
||||
|
||||
@ -80,7 +80,7 @@ public class GroupMemberService extends JpaService<GroupMember>{
|
||||
if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) {
|
||||
totalCount = totalPage;
|
||||
}else {
|
||||
totalCount = parseCount(getMapper().fetchPageResults(entity));
|
||||
totalCount = parseCount(getMapper().fetchCount(entity));
|
||||
}
|
||||
|
||||
return new JpaPageResults<Groups>(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist);
|
||||
|
||||
@ -3,52 +3,72 @@
|
||||
<div nz-row [nzGutter]="{ xs: 8, sm: 8, md: 8, lg: 24, xl: 48, xxl: 48 }">
|
||||
<div nz-col nzMd="14" nzSm="24">
|
||||
<nz-form-item>
|
||||
<nz-form-label nzFor="name">{{ 'mxk.roles.name' | i18n }}</nz-form-label>
|
||||
<nz-form-label nzFor="name">{{ 'mxk.groups.name' | i18n }}</nz-form-label>
|
||||
<nz-form-control>
|
||||
<input nz-input [(ngModel)]="query.params.groupName" [ngModelOptions]="{ standalone: true }" name="groupName"
|
||||
placeholder="" id="groupName" />
|
||||
<input
|
||||
nz-input
|
||||
[(ngModel)]="query.params.groupName"
|
||||
[ngModelOptions]="{ standalone: true }"
|
||||
name="groupName"
|
||||
placeholder=""
|
||||
id="groupName"
|
||||
/>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
</div>
|
||||
|
||||
<div nz-col [nzSpan]="query.expandForm ? 24 : 10" [class.text-right]="query.expandForm">
|
||||
<button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n
|
||||
}}</button>
|
||||
<button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n
|
||||
}}</button>
|
||||
<button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
|
||||
<button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
|
||||
<button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
|
||||
{{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
|
||||
{{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
|
||||
>
|
||||
<button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.confirm' | i18n }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
|
||||
[nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
|
||||
[nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
|
||||
(nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
|
||||
<nz-table
|
||||
#dynamicTable
|
||||
nzTableLayout="auto"
|
||||
nzSize="small"
|
||||
nzBordered
|
||||
nzShowSizeChanger
|
||||
[nzData]="query.results.rows"
|
||||
[nzFrontPagination]="false"
|
||||
[nzTotal]="query.results.records"
|
||||
[nzPageSizeOptions]="query.params.pageSizeOptions"
|
||||
[nzPageSize]="query.params.pageSize"
|
||||
[nzPageIndex]="query.params.pageNumber"
|
||||
[nzLoading]="this.query.tableLoading"
|
||||
(nzQueryParams)="onQueryParamsChange($event)"
|
||||
nzWidth="100%"
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th nzAlign="center" style="display: none">Id</th>
|
||||
<th nzAlign="center">{{ 'mxk.roles.name' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'mxk.roles.category' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'mxk.groups.name' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'mxk.groups.category' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let data of query.results.rows">
|
||||
<td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
|
||||
(nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
|
||||
<td
|
||||
[nzChecked]="query.tableCheckedId.has(data.id)"
|
||||
[nzDisabled]="data.disabled"
|
||||
(nzCheckedChange)="onTableItemChecked(data.id, $event)"
|
||||
></td>
|
||||
<td nzAlign="left" style="display: none">
|
||||
<span>{{ data.id }}</span>
|
||||
</td>
|
||||
<td nzAlign="left"> {{ data.roleName }}</td>
|
||||
<td nzAlign="center" *ngIf="data.category == 'dynamic'"> {{ 'mxk.roles.category.dynamic' | i18n }}</td>
|
||||
<td nzAlign="center" *ngIf="data.category == 'static'"> {{ 'mxk.roles.category.static' | i18n }}</td>
|
||||
<td nzAlign="center" *ngIf="data.category == 'app'"> {{ 'mxk.roles.category.app' | i18n }}</td>
|
||||
<td nzAlign="left"> {{ data.groupName }}</td>
|
||||
<td nzAlign="center" *ngIf="data.category == 'dynamic'"> {{ 'mxk.groups.category.dynamic' | i18n }}</td>
|
||||
<td nzAlign="center" *ngIf="data.category == 'static'"> {{ 'mxk.groups.category.static' | i18n }}</td>
|
||||
<td nzAlign="center" *ngIf="data.category == 'app'"> {{ 'mxk.groups.category.app' | i18n }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</nz-table>
|
||||
<div *nzModalFooter style="display: none">
|
||||
<button nz-button nzType="default" (click)="onClose($event)">{{ 'mxk.text.close' | i18n }}</button>
|
||||
<button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.submit' | i18n }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -162,13 +162,13 @@ export class MemberGroupsEditerComponent implements OnInit {
|
||||
let selectedData = listOfEnabledData.filter(({ id, name }) => {
|
||||
return this.query.tableCheckedId.has(id);
|
||||
});
|
||||
let roleIds = '';
|
||||
let roleNames = '';
|
||||
let groupIds = '';
|
||||
let groupNames = '';
|
||||
for (let i = 0; i < selectedData.length; i++) {
|
||||
roleIds = `${roleIds},${selectedData[i].id}`;
|
||||
roleNames = `${roleNames},${selectedData[i].name}`;
|
||||
groupIds = `${groupIds},${selectedData[i].id}`;
|
||||
groupNames = `${groupNames},${selectedData[i].name}`;
|
||||
}
|
||||
this.groupMembersService.addMember2Roles({ username: this.username, roleId: roleIds, roleName: roleNames }).subscribe(res => {
|
||||
this.groupMembersService.addMember2Groups({ username: this.username, groupId: groupIds, groupName: groupNames }).subscribe(res => {
|
||||
this.query.results = res.data;
|
||||
this.query.submitLoading = false;
|
||||
this.query.tableLoading = false;
|
||||
|
||||
@ -7,18 +7,23 @@
|
||||
<nz-form-item>
|
||||
<nz-form-label nzFor="name">{{ 'mxk.users.username' | i18n }}</nz-form-label>
|
||||
<nz-form-control>
|
||||
<input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
|
||||
placeholder="" id="username" />
|
||||
<input
|
||||
nz-input
|
||||
[(ngModel)]="query.params.username"
|
||||
[ngModelOptions]="{ standalone: true }"
|
||||
name="username"
|
||||
placeholder=""
|
||||
id="username"
|
||||
/>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
</div>
|
||||
<div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
|
||||
<button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
|
||||
i18n }}</button>
|
||||
<button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
|
||||
i18n }}</button>
|
||||
<button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
|
||||
<button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
|
||||
<button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
|
||||
{{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
|
||||
{{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -37,8 +42,15 @@
|
||||
</button>
|
||||
</div>
|
||||
<div nz-col [nzSpan]="6" class="grid-border">
|
||||
<nz-tree nzShowLine="false" [nzCheckable]="treeNodes.checkable" nzBlockNode [nzData]="treeNodes.nodes"
|
||||
(nzClick)="activeNode($event)" (nzDblClick)="openFolder($event)" [nzTreeTemplate]="nzTreeTemplate"></nz-tree>
|
||||
<nz-tree
|
||||
nzShowLine="false"
|
||||
[nzCheckable]="treeNodes.checkable"
|
||||
nzBlockNode
|
||||
[nzData]="treeNodes.nodes"
|
||||
(nzClick)="activeNode($event)"
|
||||
(nzDblClick)="openFolder($event)"
|
||||
[nzTreeTemplate]="nzTreeTemplate"
|
||||
></nz-tree>
|
||||
<ng-template #nzTreeTemplate let-node let-origin="origin">
|
||||
<span class="custom-node">
|
||||
<span *ngIf="!node.isLeaf" (contextmenu)="contextMenu($event, menu)">
|
||||
@ -59,15 +71,26 @@
|
||||
</nz-dropdown-menu>
|
||||
</div>
|
||||
<div nz-col nzMd="18" nzSm="24" class="grid-border">
|
||||
<nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered sizeChanger="true" nzShowSizeChanger
|
||||
[nzData]="query.results.rows" [nzFrontPagination]="false" [nzTotal]="query.results.records"
|
||||
[nzPageSizeOptions]="query.params.pageSizeOptions" [nzPageSize]="query.params.pageSize"
|
||||
[nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
|
||||
(nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
|
||||
<nz-table
|
||||
#dynamicTable
|
||||
nzTableLayout="auto"
|
||||
nzSize="small"
|
||||
nzBordered
|
||||
sizeChanger="true"
|
||||
nzShowSizeChanger
|
||||
[nzData]="query.results.rows"
|
||||
[nzFrontPagination]="false"
|
||||
[nzTotal]="query.results.records"
|
||||
[nzPageSizeOptions]="query.params.pageSizeOptions"
|
||||
[nzPageSize]="query.params.pageSize"
|
||||
[nzPageIndex]="query.params.pageNumber"
|
||||
[nzLoading]="this.query.tableLoading"
|
||||
(nzQueryParams)="onQueryParamsChange($event)"
|
||||
nzWidth="100%"
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
|
||||
(nzCheckedChange)="onTableAllChecked($event)"></th>
|
||||
<th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
|
||||
<th nzAlign="center" style="display: none">{{ 'mxk.text.id' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
|
||||
@ -81,8 +104,11 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let data of query.results.rows">
|
||||
<td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
|
||||
(nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
|
||||
<td
|
||||
[nzChecked]="query.tableCheckedId.has(data.id)"
|
||||
[nzDisabled]="data.disabled"
|
||||
(nzCheckedChange)="onTableItemChecked(data.id, $event)"
|
||||
></td>
|
||||
<td nzAlign="left" style="display: none">
|
||||
<span>{{ data.id }}</span>
|
||||
</td>
|
||||
@ -91,8 +117,7 @@
|
||||
<td nzAlign="left"> {{ data.employeeNumber }}</td>
|
||||
<td nzAlign="left"> {{ data.department }}</td>
|
||||
<td nzAlign="left"> {{ data.jobTitle }}</td>
|
||||
<td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
|
||||
i18n) }}</td>
|
||||
<td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
|
||||
<td nzAlign="center">
|
||||
<a title="{{ 'mxk.users.status.active' | i18n }}" *ngIf="data.status == 1">
|
||||
<i nz-icon nzType="check-circle" nzTheme="fill" style="color: green"> </i>
|
||||
@ -125,27 +150,25 @@
|
||||
</button>
|
||||
<nz-dropdown-menu #menuMoreAction="nzDropdownMenu">
|
||||
<ul nz-menu>
|
||||
<li nz-menu-item *ngIf="data.status == 1"
|
||||
(click)="onNavToUrl($event, data.id, data.username, 'roles')">{{
|
||||
'mxk.text.roles' | i18n
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 1" (click)="onNavToUrl($event, data.id, data.username, 'groups')">{{
|
||||
'mxk.text.groups' | i18n
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 1" (click)="changePasswordById($event, data.id)">{{
|
||||
'mxk.text.changepassword' | i18n
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 1" (click)="onUpdateStatus($event, data.id, 5)">{{
|
||||
'mxk.text.lock' | i18n }}</li>
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 1" (click)="onUpdateStatus($event, data.id, 5)">{{ 'mxk.text.lock' | i18n }}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 1" (click)="onUpdateStatus($event, data.id, 4)">{{
|
||||
'mxk.text.disable' | i18n
|
||||
}}</li>
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 2" (click)="onUpdateStatus($event, data.id, 1)">{{
|
||||
'mxk.text.enable' | i18n
|
||||
}}</li>
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 4" (click)="onUpdateStatus($event, data.id, 1)">{{
|
||||
'mxk.text.enable' | i18n
|
||||
}}</li>
|
||||
}}</li>
|
||||
<li nz-menu-item *ngIf="data.status == 5" (click)="onUpdateStatus($event, data.id, 1)">{{
|
||||
'mxk.text.unlock' | i18n
|
||||
}}</li>
|
||||
}}</li>
|
||||
<li nz-menu-item (click)="onDelete($event, data.id)" nzDanger>{{ 'mxk.text.delete' | i18n }}</li>
|
||||
</ul>
|
||||
</nz-dropdown-menu>
|
||||
@ -156,4 +179,4 @@
|
||||
</nz-table>
|
||||
</div>
|
||||
</div>
|
||||
</nz-card>
|
||||
</nz-card>
|
||||
|
||||
@ -221,8 +221,8 @@ export class UsersComponent implements OnInit {
|
||||
|
||||
onNavToUrl(e: MouseEvent, userId: String, username: String, navType: String) {
|
||||
e.preventDefault();
|
||||
if (navType === 'roles') {
|
||||
this.router.navigateByUrl(`/access/rolemembers?username=${username}&userId=${userId}`);
|
||||
if (navType === 'groups') {
|
||||
this.router.navigateByUrl(`/idm/groupmembers?username=${username}&userId=${userId}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ export class GroupMembersService extends BaseService<GroupMembers> {
|
||||
});
|
||||
}
|
||||
|
||||
addMember2Roles(body: any): Observable<Message<PageResults>> {
|
||||
addMember2Groups(body: any): Observable<Message<PageResults>> {
|
||||
return this.http.post<Message<PageResults>>(`${`${this.server.urls.base}/addMember2Groups`}`, body);
|
||||
}
|
||||
}
|
||||
|
||||
@ -505,6 +505,28 @@
|
||||
"suspendTime": "Suspend Time",
|
||||
"isdefault": "Is Default"
|
||||
},
|
||||
"groups": {
|
||||
"name": "Group Name",
|
||||
"type": {
|
||||
"":"Member Type",
|
||||
"user":"User",
|
||||
"user-dynamic":"User-Dynamic",
|
||||
"post":"Post"
|
||||
},
|
||||
"member": "Member",
|
||||
"permissions": "Permissions",
|
||||
"category": {
|
||||
"":"Category",
|
||||
"dynamic":"Dynamic",
|
||||
"static":"Static",
|
||||
"app":"App"
|
||||
},
|
||||
"filters": "Attributes Filter",
|
||||
"orgIdsList": "Dept List",
|
||||
"resumeTime": "Join Time",
|
||||
"suspendTime": "Suspend Time",
|
||||
"isdefault": "Is Default"
|
||||
},
|
||||
"resources": {
|
||||
"id": "ID",
|
||||
"name": "Resource",
|
||||
|
||||
@ -503,6 +503,28 @@
|
||||
"suspendTime": "挂起时间",
|
||||
"isdefault": "是否默认角色"
|
||||
},
|
||||
"groups": {
|
||||
"name": "用户组名称",
|
||||
"type": {
|
||||
"":"成员类型",
|
||||
"user":"用户",
|
||||
"user-dynamic":"用户-动态",
|
||||
"post":"岗位"
|
||||
},
|
||||
"member": "成员",
|
||||
"permissions": "访问权限",
|
||||
"category": {
|
||||
"":"类型",
|
||||
"dynamic":"动态",
|
||||
"static":"静态",
|
||||
"app":"应用"
|
||||
},
|
||||
"filters": "属性过滤器",
|
||||
"orgIdsList": "部门列表",
|
||||
"resumeTime": "加入时间",
|
||||
"suspendTime": "挂起时间",
|
||||
"isdefault": "是否默认角色"
|
||||
},
|
||||
"resources": {
|
||||
"id": "资源编码",
|
||||
"name": "资源名称",
|
||||
|
||||
@ -504,6 +504,28 @@
|
||||
"suspendTime": "掛起時間",
|
||||
"isdefault": "是否默認角色"
|
||||
},
|
||||
"groups": {
|
||||
"name": "用戶组名稱",
|
||||
"type": {
|
||||
"":"成員類型",
|
||||
"user":"用戶",
|
||||
"user-dynamic":"用戶-動態",
|
||||
"post":"崗位"
|
||||
},
|
||||
"member": "成員",
|
||||
"permissions": "存取控制",
|
||||
"category": {
|
||||
"":"類型",
|
||||
"dynamic":"動態",
|
||||
"static":"靜態",
|
||||
"app":"應用"
|
||||
},
|
||||
"filters": "屬性過濾器",
|
||||
"orgIdsList": "部門列表",
|
||||
"resumeTime": "加入時間",
|
||||
"suspendTime": "掛起時間",
|
||||
"isdefault": "是否默認角色"
|
||||
},
|
||||
"resources": {
|
||||
"id": "資源編碼",
|
||||
"name": "資源名稱",
|
||||
|
||||
@ -123,16 +123,18 @@ public class GroupMemberController {
|
||||
groupMember.setType("USER");
|
||||
}
|
||||
for (int i = 0; i < arrMemberIds.length; i++) {
|
||||
GroupMember newGroupMember =
|
||||
new GroupMember(
|
||||
groupId,
|
||||
groupMember.getGroupName(),
|
||||
arrMemberIds[i],
|
||||
arrMemberNames[i],
|
||||
groupMember.getType(),
|
||||
currentUser.getInstId());
|
||||
newGroupMember.setId(WebContext.genId());
|
||||
result = service.insert(newGroupMember);
|
||||
if(StringUtils.isNotBlank(arrMemberIds[i])) {
|
||||
GroupMember newGroupMember =
|
||||
new GroupMember(
|
||||
groupId,
|
||||
groupMember.getGroupName(),
|
||||
arrMemberIds[i],
|
||||
arrMemberNames[i],
|
||||
groupMember.getType(),
|
||||
currentUser.getInstId());
|
||||
newGroupMember.setId(WebContext.genId());
|
||||
result = service.insert(newGroupMember);
|
||||
}
|
||||
}
|
||||
if(result) {
|
||||
return new Message<GroupMember>(Message.SUCCESS).buildResponse();
|
||||
@ -164,16 +166,18 @@ public class GroupMemberController {
|
||||
String[] arrGroupNames = groupNames.split(",");
|
||||
|
||||
for (int i = 0; i < arrGroupIds.length; i++) {
|
||||
GroupMember newGroupMember =
|
||||
new GroupMember(
|
||||
arrGroupIds[i],
|
||||
arrGroupNames[i],
|
||||
userInfo.getId(),
|
||||
userInfo.getDisplayName(),
|
||||
"USER",
|
||||
currentUser.getInstId());
|
||||
newGroupMember.setId(WebContext.genId());
|
||||
result = service.insert(newGroupMember);
|
||||
if(StringUtils.isNotBlank(arrGroupIds[i])) {
|
||||
GroupMember newGroupMember =
|
||||
new GroupMember(
|
||||
arrGroupIds[i],
|
||||
arrGroupNames[i],
|
||||
userInfo.getId(),
|
||||
userInfo.getDisplayName(),
|
||||
"USER",
|
||||
currentUser.getInstId());
|
||||
newGroupMember.setId(WebContext.genId());
|
||||
result = service.insert(newGroupMember);
|
||||
}
|
||||
}
|
||||
if(result) {
|
||||
return new Message<GroupMember>(Message.SUCCESS).buildResponse();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user