diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/GroupMemberMapper.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/GroupMemberMapper.java index 4b8c40ed7..e5efcccfd 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/GroupMemberMapper.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/GroupMemberMapper.java @@ -38,6 +38,8 @@ public interface GroupMemberMapper extends IJpaBaseMapper { public List memberNotInGroup(GroupMember entity); public List groupMemberInGroup(GroupMember entity); + public List groupsNoMember(GroupMember entity); + public int addDynamicGroupMember(Groups dynamicGroup); public int deleteDynamicGroupMember(Groups dynamicGroup); diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/RoleMemberMapper.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/RoleMemberMapper.java index 93eee32a9..6c264bd58 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/RoleMemberMapper.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/RoleMemberMapper.java @@ -37,6 +37,8 @@ public interface RoleMemberMapper extends IJpaBaseMapper { public List memberNotInRole(RoleMember entity); public List roleMemberInRole(RoleMember entity); + public List rolesNoMember(RoleMember entity); + public int addDynamicRoleMember(Roles dynamicRole); public int deleteDynamicRoleMember(Roles dynamicRole); diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/GroupMemberService.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/GroupMemberService.java index c7c64ca05..8d9ad2f1d 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/GroupMemberService.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/GroupMemberService.java @@ -20,14 +20,18 @@ package org.maxkey.persistence.service; import java.util.List; import org.apache.mybatis.jpa.persistence.JpaBaseService; +import org.apache.mybatis.jpa.persistence.JpaPageResults; import org.maxkey.entity.GroupMember; import org.maxkey.entity.Groups; import org.maxkey.entity.UserInfo; import org.maxkey.persistence.mapper.GroupMemberMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; @Repository public class GroupMemberService extends JpaBaseService{ + final static Logger _logger = LoggerFactory.getLogger(GroupMemberService.class); public GroupMemberService() { super(GroupMemberMapper.class); @@ -57,4 +61,29 @@ public class GroupMemberService extends JpaBaseService{ return getMapper().queryMemberByGroupId(groupId); } + + public JpaPageResults groupsNoMember(GroupMember entity) { + entity.setPageResultSelectUUID(entity.generateId()); + entity.setStartRow(calculateStartRow(entity.getPageNumber() ,entity.getPageSize())); + + entity.setPageable(true); + List resultslist = null; + try { + resultslist = getMapper().groupsNoMember(entity); + } catch (Exception e) { + _logger.error("queryPageResults Exception " , e); + } + entity.setPageable(false); + Integer totalPage = resultslist.size(); + + Integer totalCount = 0; + if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) { + totalCount = totalPage; + }else { + totalCount = parseCount(getMapper().queryPageResultsCount(entity)); + } + + return new JpaPageResults(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist); + } + } diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/RoleMemberService.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/RoleMemberService.java index 2181ae707..dc500d972 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/RoleMemberService.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/RoleMemberService.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,15 +17,22 @@ package org.maxkey.persistence.service; +import java.util.List; + import org.apache.mybatis.jpa.persistence.JpaBaseService; +import org.apache.mybatis.jpa.persistence.JpaPageResults; import org.maxkey.entity.RoleMember; import org.maxkey.entity.Roles; import org.maxkey.persistence.mapper.RoleMemberMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; @Repository public class RoleMemberService extends JpaBaseService{ + final static Logger _logger = LoggerFactory.getLogger(RoleMemberService.class); + public RoleMemberService() { super(RoleMemberMapper.class); } @@ -50,4 +57,28 @@ public class RoleMemberService extends JpaBaseService{ public int deleteByRoleId(String roleId) { return getMapper().deleteByRoleId(roleId); } + + public JpaPageResults rolesNoMember(RoleMember entity) { + entity.setPageResultSelectUUID(entity.generateId()); + entity.setStartRow(calculateStartRow(entity.getPageNumber() ,entity.getPageSize())); + + entity.setPageable(true); + List resultslist = null; + try { + resultslist = getMapper().rolesNoMember(entity); + } catch (Exception e) { + _logger.error("queryPageResults Exception " , e); + } + entity.setPageable(false); + Integer totalPage = resultslist.size(); + + Integer totalCount = 0; + if(entity.getPageNumber() == 1 && totalPage < entity.getPageSize()) { + totalCount = totalPage; + }else { + totalCount = parseCount(getMapper().queryPageResultsCount(entity)); + } + + return new JpaPageResults(entity.getPageNumber(),entity.getPageSize(),totalPage,totalCount,resultslist); + } } diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/GroupMemberMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/GroupMemberMapper.xml index e6f9813da..219931c84 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/GroupMemberMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/GroupMemberMapper.xml @@ -139,6 +139,28 @@ + + + + + + + +
+ + + + +
+ + + + + + + + Id + {{ 'mxk.groups.name' | i18n }} + {{ 'mxk.groups.dynamic' | i18n }} + + + + + + + {{ data.id }} + + {{ data.name }} + + + + + +
+ + +
\ No newline at end of file diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.less b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.less new file mode 100644 index 000000000..e69de29bb diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.spec.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.spec.ts new file mode 100644 index 000000000..9473fa60e --- /dev/null +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MemberGroupsEditerComponent } from './member-groups-editer.component'; + +describe('MemberGroupsEditerComponent', () => { + let component: MemberGroupsEditerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ MemberGroupsEditerComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(MemberGroupsEditerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.ts new file mode 100644 index 000000000..53db89a63 --- /dev/null +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/member-groups-editer/member-groups-editer.component.ts @@ -0,0 +1,170 @@ +import { ChangeDetectionStrategy, ViewContainerRef, ChangeDetectorRef, Component, OnInit, Input } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { _HttpClient } from '@delon/theme'; +import { format, addDays } from 'date-fns'; +import { NzSafeAny } from 'ng-zorro-antd/core/types'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { NzTableQueryParams } from 'ng-zorro-antd/table'; + +import { GroupMembersService } from '../../../../service/group-members.service'; + +@Component({ + selector: 'app-member-groups-editer', + templateUrl: './member-groups-editer.component.html', + styleUrls: ['./member-groups-editer.component.less'] +}) +export class MemberGroupsEditerComponent implements OnInit { + @Input() username?: String; + query: { + params: { + groupName: String; + username: String; + protocol: String; + startDate: String; + endDate: String; + startDatePicker: Date; + endDatePicker: Date; + pageSize: number; + pageNumber: number; + pageSizeOptions: number[]; + }; + results: { + records: number; + rows: NzSafeAny[]; + }; + expandForm: Boolean; + submitLoading: boolean; + tableLoading: boolean; + tableCheckedId: Set; + indeterminate: boolean; + checked: boolean; + } = { + params: { + groupName: '', + username: '', + protocol: '', + startDate: '', + endDate: '', + startDatePicker: addDays(new Date(), -30), + endDatePicker: new Date(), + pageSize: 5, + pageNumber: 1, + pageSizeOptions: [5, 15, 50] + }, + results: { + records: 0, + rows: [] + }, + expandForm: false, + submitLoading: false, + tableLoading: false, + tableCheckedId: new Set(), + indeterminate: false, + checked: false + }; + + constructor( + private modalRef: NzModalRef, + private groupMembersService: GroupMembersService, + private viewContainerRef: ViewContainerRef, + private fb: FormBuilder, + private msg: NzMessageService, + private cdr: ChangeDetectorRef + ) { } + + ngOnInit(): void { + if (this.username) { + this.query.params.username = this.username; + } + this.fetch(); + } + + onQueryParamsChange(tableQueryParams: NzTableQueryParams): void { + this.query.params.pageNumber = tableQueryParams.pageIndex; + this.query.params.pageSize = tableQueryParams.pageSize; + this.fetch(); + } + + onSearch(): void { + this.fetch(); + } + + onReset(): void { } + + fetch(): void { + this.query.submitLoading = true; + this.query.tableLoading = true; + this.query.indeterminate = false; + this.query.checked = true; + this.query.tableCheckedId.clear(); + if (this.query.expandForm) { + this.query.params.endDate = format(this.query.params.endDatePicker, 'yyyy-MM-dd HH:mm:ss'); + this.query.params.startDate = format(this.query.params.startDatePicker, 'yyyy-MM-dd HH:mm:ss'); + } else { + this.query.params.endDate = ''; + this.query.params.startDate = ''; + } + this.groupMembersService.groupsNoMember(this.query.params).subscribe(res => { + this.query.results = res.data; + this.query.submitLoading = false; + this.query.tableLoading = false; + this.cdr.detectChanges(); + }); + } + + updateTableCheckedSet(id: String, checked: boolean): void { + if (checked) { + this.query.tableCheckedId.add(id); + } else { + this.query.tableCheckedId.delete(id); + } + } + + refreshTableCheckedStatus(): void { + const listOfEnabledData = this.query.results.rows.filter(({ disabled }) => !disabled); + this.query.checked = listOfEnabledData.every(({ id }) => this.query.tableCheckedId.has(id)); + this.query.indeterminate = listOfEnabledData.some(({ id }) => this.query.tableCheckedId.has(id)) && !this.query.checked; + } + + onTableItemChecked(id: String, checked: boolean): void { + //this.onTableAllChecked(false); + this.updateTableCheckedSet(id, checked); + this.refreshTableCheckedStatus(); + } + + onTableAllChecked(checked: boolean): void { + this.query.results.rows.filter(({ disabled }) => !disabled).forEach(({ id }) => this.updateTableCheckedSet(id, checked)); + this.refreshTableCheckedStatus(); + } + + onSubmit(e: MouseEvent): void { + e.preventDefault(); + const listOfEnabledData = this.query.results.rows.filter(({ disabled }) => !disabled); + let selectedData = listOfEnabledData.filter(({ id, name }) => { + return this.query.tableCheckedId.has(id); + }); + let groupIds = ''; + let groupNames = ''; + for (let i = 0; i < selectedData.length; i++) { + groupIds = `${groupIds},${selectedData[i].id}`; + groupNames = `${groupNames},${selectedData[i].name}`; + } + 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; + if (res.code == 0) { + this.msg.success(`提交成功`); + this.fetch(); + } else { + this.msg.success(`提交失败`); + } + this.cdr.detectChanges(); + }); + } + + onClose(e: MouseEvent): void { + e.preventDefault(); + } +} diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.html index 886521b3a..3b9e5791f 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.html @@ -4,140 +4,119 @@ {{ 'mxk.text.id' | i18n }} - + - {{ 'mxk.users.id' | i18n }} + {{ 'mxk.users.id' | i18n }} + - + - - {{ 'mxk.users.displayName' | i18n }} + + {{ 'mxk.users.displayName' | i18n }} + - + - + + + {{ 'mxk.users.displayName' | i18n }} + + + + + + + - {{ 'mxk.users.username' | i18n }} + {{ 'mxk.users.username' | i18n }} + - + - {{ 'mxk.accountsstrategy.id' | i18n }} + {{ 'mxk.accountsstrategy.id' | i18n }} + - + - {{ 'mxk.accountsstrategy.name' | i18n }} - + {{ 'mxk.accountsstrategy.name' | i18n }} + + - + - + {{ 'mxk.apps.id' | i18n }} - + {{ 'mxk.apps.name' | i18n }} - + - {{ 'mxk.accounts.relatedUsername' | i18n }} - + {{ 'mxk.accounts.relatedUsername' | i18n + }} + - + - + - {{ 'mxk.accounts.relatedPassword' | i18n }} - + {{ 'mxk.accounts.relatedPassword' | i18n + }} + - + - + - + @@ -147,4 +126,4 @@
-
+ \ No newline at end of file diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.spec.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.spec.ts index 3b9a1ada8..ba99e61f0 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.spec.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.spec.ts @@ -1,19 +1,18 @@ /* * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import { ComponentFixture, TestBed } from '@angular/core/testing'; @@ -25,9 +24,8 @@ describe('AccountEditerComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ AccountEditerComponent ] - }) - .compileComponents(); + declarations: [AccountEditerComponent] + }).compileComponents(); }); beforeEach(() => { diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.ts index 972e8b475..890fd292a 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/account-editer/account-editer.component.ts @@ -1,19 +1,18 @@ /* * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import { Component, ChangeDetectorRef, ViewContainerRef, Input, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; @@ -42,6 +41,7 @@ import { SelectUserComponent } from '../../users/select-user/select-user.compone }) export class AccountEditerComponent implements OnInit { @Input() id?: String; + @Input() username?: String; @Input() isEdit?: boolean; passwordVisible = false; @@ -74,6 +74,15 @@ export class AccountEditerComponent implements OnInit { this.cdr.detectChanges(); }); } + + if (this.username) { + this.usersService.getByUsername(`${this.username}`).subscribe(res => { + this.form.model.userId = res.data.id; + this.form.model.username = res.data.username; + this.form.model.displayName = res.data.displayName; + this.cdr.detectChanges(); + }); + } } onSelectUser(e: MouseEvent): void { diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.ts index 806201298..cfd54af5f 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.ts @@ -16,6 +16,7 @@ import { ChangeDetectionStrategy, ViewContainerRef, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; import { _HttpClient } from '@delon/theme'; import { format, addDays } from 'date-fns'; import { NzSafeAny } from 'ng-zorro-antd/core/types'; @@ -34,6 +35,7 @@ import { AccountEditerComponent } from './account-editer/account-editer.componen styleUrls: ['./accounts.component.less'] }) export class AccountsComponent implements OnInit { + userId: String = ''; query: { params: { username: String; @@ -90,10 +92,18 @@ export class AccountsComponent implements OnInit { private accountsService: AccountsService, private fb: FormBuilder, private msg: NzMessageService, + private route: ActivatedRoute, private cdr: ChangeDetectorRef ) { } ngOnInit(): void { + if (this.route.snapshot.queryParams['username']) { + this.query.params.username = this.route.snapshot.queryParams['username']; + } + if (this.route.snapshot.queryParams['userId']) { + this.userId = this.route.snapshot.queryParams['userId']; + } + this.fetch(); } @@ -149,6 +159,7 @@ export class AccountsComponent implements OnInit { nzViewContainerRef: this.viewContainerRef, nzComponentParams: { isEdit: false, + username: this.query.params.username, id: '' }, nzOnOk: () => new Promise(resolve => setTimeout(resolve, 1000)) diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/permissions.module.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/permissions.module.ts index 3607639fc..f557e7985 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/permissions.module.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/permissions.module.ts @@ -29,6 +29,7 @@ import { RolesComponent } from './roles/roles.component'; import { ResourceEditerComponent } from './resources/resource-editer/resource-editer.component'; import { SelectRolesComponent } from './roles/select-roles/select-roles.component'; import { RoleMembersEditerComponent } from './role-members/role-members-editer/role-members-editer.component'; +import { MemberRolesEditerComponent } from './role-members/member-roles-editer/member-roles-editer.component'; const routes: Routes = [ { path: 'roles', @@ -51,7 +52,7 @@ const routes: Routes = [ const COMPONENTS = [RolesComponent]; @NgModule({ - declarations: [...COMPONENTS, RoleEditerComponent, RoleMembersComponent, ResourcesComponent, PrivilegesComponent, ResourceEditerComponent, SelectRolesComponent, RoleMembersEditerComponent], + declarations: [...COMPONENTS, RoleEditerComponent, RoleMembersComponent, ResourcesComponent, PrivilegesComponent, ResourceEditerComponent, SelectRolesComponent, RoleMembersEditerComponent, MemberRolesEditerComponent], imports: [NzIconModule, SharedModule, CommonModule, RouterModule.forChild(routes)], exports: [RouterModule] }) diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.html new file mode 100644 index 000000000..de7cadabf --- /dev/null +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.html @@ -0,0 +1,56 @@ +
{{ 'mxk.text.add' | i18n }}
+ +
+
+
+ + {{ 'mxk.roles.name' | i18n }} + + + + +
+ +
+ + + + +
+
+
+ + + + + + Id + {{ 'mxk.roles.name' | i18n }} + {{ 'mxk.roles.dynamic' | i18n }} + + + + + + + {{ data.id }} + + {{ data.name }} + + + + +
+
+ + +
\ No newline at end of file diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.less b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.less new file mode 100644 index 000000000..e69de29bb diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.spec.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.spec.ts new file mode 100644 index 000000000..c0b42b46c --- /dev/null +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MemberRolesEditerComponent } from './member-roles-editer.component'; + +describe('MemberRolesEditerComponent', () => { + let component: MemberRolesEditerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ MemberRolesEditerComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(MemberRolesEditerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.ts new file mode 100644 index 000000000..16969e31a --- /dev/null +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/member-roles-editer/member-roles-editer.component.ts @@ -0,0 +1,169 @@ +import { ChangeDetectionStrategy, ViewContainerRef, ChangeDetectorRef, Component, OnInit, Input } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { _HttpClient } from '@delon/theme'; +import { format, addDays } from 'date-fns'; +import { NzSafeAny } from 'ng-zorro-antd/core/types'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { NzTableQueryParams } from 'ng-zorro-antd/table'; + +import { RoleMembersService } from '../../../../service/role-members.service'; +@Component({ + selector: 'app-member-roles-editer', + templateUrl: './member-roles-editer.component.html', + styleUrls: ['./member-roles-editer.component.less'] +}) +export class MemberRolesEditerComponent implements OnInit { + @Input() username?: String; + query: { + params: { + roleName: String; + username: String; + protocol: String; + startDate: String; + endDate: String; + startDatePicker: Date; + endDatePicker: Date; + pageSize: number; + pageNumber: number; + pageSizeOptions: number[]; + }; + results: { + records: number; + rows: NzSafeAny[]; + }; + expandForm: Boolean; + submitLoading: boolean; + tableLoading: boolean; + tableCheckedId: Set; + indeterminate: boolean; + checked: boolean; + } = { + params: { + roleName: '', + username: '', + protocol: '', + startDate: '', + endDate: '', + startDatePicker: addDays(new Date(), -30), + endDatePicker: new Date(), + pageSize: 5, + pageNumber: 1, + pageSizeOptions: [5, 15, 50] + }, + results: { + records: 0, + rows: [] + }, + expandForm: false, + submitLoading: false, + tableLoading: false, + tableCheckedId: new Set(), + indeterminate: false, + checked: false + }; + + constructor( + private modalRef: NzModalRef, + private roleMembersService: RoleMembersService, + private viewContainerRef: ViewContainerRef, + private fb: FormBuilder, + private msg: NzMessageService, + private cdr: ChangeDetectorRef + ) { } + + ngOnInit(): void { + if (this.username) { + this.query.params.username = this.username; + } + this.fetch(); + } + + onQueryParamsChange(tableQueryParams: NzTableQueryParams): void { + this.query.params.pageNumber = tableQueryParams.pageIndex; + this.query.params.pageSize = tableQueryParams.pageSize; + this.fetch(); + } + + onSearch(): void { + this.fetch(); + } + + onReset(): void { } + + fetch(): void { + this.query.submitLoading = true; + this.query.tableLoading = true; + this.query.indeterminate = false; + this.query.checked = true; + this.query.tableCheckedId.clear(); + if (this.query.expandForm) { + this.query.params.endDate = format(this.query.params.endDatePicker, 'yyyy-MM-dd HH:mm:ss'); + this.query.params.startDate = format(this.query.params.startDatePicker, 'yyyy-MM-dd HH:mm:ss'); + } else { + this.query.params.endDate = ''; + this.query.params.startDate = ''; + } + this.roleMembersService.rolesNoMember(this.query.params).subscribe(res => { + this.query.results = res.data; + this.query.submitLoading = false; + this.query.tableLoading = false; + this.cdr.detectChanges(); + }); + } + + updateTableCheckedSet(id: String, checked: boolean): void { + if (checked) { + this.query.tableCheckedId.add(id); + } else { + this.query.tableCheckedId.delete(id); + } + } + + refreshTableCheckedStatus(): void { + const listOfEnabledData = this.query.results.rows.filter(({ disabled }) => !disabled); + this.query.checked = listOfEnabledData.every(({ id }) => this.query.tableCheckedId.has(id)); + this.query.indeterminate = listOfEnabledData.some(({ id }) => this.query.tableCheckedId.has(id)) && !this.query.checked; + } + + onTableItemChecked(id: String, checked: boolean): void { + //this.onTableAllChecked(false); + this.updateTableCheckedSet(id, checked); + this.refreshTableCheckedStatus(); + } + + onTableAllChecked(checked: boolean): void { + this.query.results.rows.filter(({ disabled }) => !disabled).forEach(({ id }) => this.updateTableCheckedSet(id, checked)); + this.refreshTableCheckedStatus(); + } + + onSubmit(e: MouseEvent): void { + e.preventDefault(); + const listOfEnabledData = this.query.results.rows.filter(({ disabled }) => !disabled); + let selectedData = listOfEnabledData.filter(({ id, name }) => { + return this.query.tableCheckedId.has(id); + }); + let roleIds = ''; + let roleNames = ''; + for (let i = 0; i < selectedData.length; i++) { + roleIds = `${roleIds},${selectedData[i].id}`; + roleNames = `${roleNames},${selectedData[i].name}`; + } + this.roleMembersService.addMember2Roles({ username: this.username, roleId: roleIds, roleName: roleNames }).subscribe(res => { + this.query.results = res.data; + this.query.submitLoading = false; + this.query.tableLoading = false; + if (res.code == 0) { + this.msg.success(`提交成功`); + this.fetch(); + } else { + this.msg.success(`提交失败`); + } + this.cdr.detectChanges(); + }); + } + + onClose(e: MouseEvent): void { + e.preventDefault(); + } +} diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.html index d379bec34..6f1900199 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.html @@ -3,7 +3,7 @@
-
+
{{ 'mxk.roles.name' | i18n }} @@ -18,7 +18,7 @@
-
+
{{ 'mxk.users.username' | i18n }} @@ -27,11 +27,10 @@
-
+
- +
diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.ts index 135bdf6bb..7e0eb313a 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.ts @@ -1,22 +1,22 @@ /* * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import { ChangeDetectionStrategy, ViewContainerRef, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; import { _HttpClient } from '@delon/theme'; import { format, addDays } from 'date-fns'; import { NzSafeAny } from 'ng-zorro-antd/core/types'; @@ -29,6 +29,7 @@ import { NzFormatEmitEvent, NzTreeNode, NzTreeNodeOptions } from 'ng-zorro-antd/ import { RoleMembersService } from '../../../service/role-members.service'; import { set2String } from '../../../shared/index'; import { SelectRolesComponent } from '../roles/select-roles/select-roles.component'; +import { MemberRolesEditerComponent } from './member-roles-editer/member-roles-editer.component'; import { RoleMembersEditerComponent } from './role-members-editer/role-members-editer.component'; @Component({ @@ -101,10 +102,14 @@ export class RoleMembersComponent implements OnInit { private viewContainerRef: ViewContainerRef, private fb: FormBuilder, private msg: NzMessageService, + private route: ActivatedRoute, private cdr: ChangeDetectorRef ) { } ngOnInit(): void { + if (this.route.snapshot.queryParams['username']) { + this.query.params.username = this.route.snapshot.queryParams['username']; + } this.query.tableInitialize = false; } @@ -120,7 +125,13 @@ export class RoleMembersComponent implements OnInit { this.fetch(); } - onReset(): void { } + onReset(): void { + this.query.params.username = ''; + this.query.params.name = ''; + this.query.params.roleId = ''; + this.query.params.roleName = ''; + this.fetch(); + } onBatchDelete(e: MouseEvent): void { e.preventDefault(); @@ -137,22 +148,40 @@ export class RoleMembersComponent implements OnInit { onAdd(e: MouseEvent): void { e.preventDefault(); - const modal = this.modalService.create({ - nzContent: RoleMembersEditerComponent, - nzViewContainerRef: this.viewContainerRef, - nzComponentParams: { - isEdit: false, - roleId: this.query.params.roleId - }, - nzWidth: 700, - nzOnOk: () => new Promise(resolve => setTimeout(resolve, 1000)) - }); - // Return a result when closed - modal.afterClose.subscribe(result => { - if (result.refresh) { - this.fetch(); - } - }); + if (this.query.params.username != '') { + const modal = this.modalService.create({ + nzContent: MemberRolesEditerComponent, + nzViewContainerRef: this.viewContainerRef, + nzComponentParams: { + username: this.query.params.username + }, + nzWidth: 700, + nzOnOk: () => new Promise(resolve => setTimeout(resolve, 1000)) + }); + // Return a result when closed + modal.afterClose.subscribe(result => { + if (result.refresh) { + this.fetch(); + } + }); + } else if (this.query.params.roleId != '') { + const modal = this.modalService.create({ + nzContent: RoleMembersEditerComponent, + nzViewContainerRef: this.viewContainerRef, + nzComponentParams: { + isEdit: false, + roleId: this.query.params.roleId + }, + nzWidth: 700, + nzOnOk: () => new Promise(resolve => setTimeout(resolve, 1000)) + }); + // Return a result when closed + modal.afterClose.subscribe(result => { + if (result.refresh) { + this.fetch(); + } + }); + } } onSelect(e: MouseEvent): void { diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.html b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.html index a49e6d2ac..9a1261b47 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.html +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.html @@ -110,6 +110,18 @@
    +
  • {{ + 'mxk.text.accounts' | i18n + }}
  • +
  • {{ + 'mxk.text.groups' | i18n + }}
  • +
  • {{ + 'mxk.text.roles' | i18n + }}
  • {{ 'mxk.text.changepassword' | i18n }}
  • diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.ts index 48589250a..8d27ba163 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.ts @@ -16,6 +16,7 @@ import { ChangeDetectionStrategy, ViewContainerRef, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; import { _HttpClient } from '@delon/theme'; import { format, addDays } from 'date-fns'; import { NzSafeAny } from 'ng-zorro-antd/core/types'; @@ -94,6 +95,7 @@ export class UsersComponent implements OnInit { private orgsService: OrganizationsService, private fb: FormBuilder, private msg: NzMessageService, + private router: Router, private cdr: ChangeDetectorRef ) { } @@ -213,6 +215,17 @@ export class UsersComponent implements OnInit { }); } + onNavToUrl(e: MouseEvent, userId: String, username: String, navType: String) { + e.preventDefault(); + if (navType === 'accounts') { + this.router.navigateByUrl(`/accounts?username=${username}&userId=${userId}`); + } else if (navType === 'groups') { + this.router.navigateByUrl(`/access/groupmembers?username=${username}&userId=${userId}`); + } else if (navType === 'roles') { + this.router.navigateByUrl(`/permissions/rolemembers?username=${username}&userId=${userId}`); + } + } + onUpdateStatus(e: MouseEvent, userId: String, status: number): void { e.preventDefault(); this.usersService.updateStatus({ id: userId, status: status }).subscribe(res => { diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/group-members.service.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/group-members.service.ts index 0db660548..6acce9310 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/group-members.service.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/group-members.service.ts @@ -1,19 +1,18 @@ /* * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; @@ -22,6 +21,7 @@ import { Observable } from 'rxjs'; import { GroupMembers } from '../entity/GroupMembers'; import { Message } from '../entity/Message'; +import { PageResults } from '../entity/PageResults'; import { BaseService } from './base.service'; @Injectable({ @@ -33,4 +33,14 @@ export class GroupMembersService extends BaseService { this.server.urls.member = '/memberInGroup'; this.server.urls.memberOut = '/memberNotInGroup'; } + + groupsNoMember(params: NzSafeAny): Observable> { + return this.http.get>(`${this.server.urls.base}/groupsNoMember`, { + params: this.parseParams(params) + }); + } + + addMember2Groups(body: any): Observable> { + return this.http.post>(`${`${this.server.urls.base}/addMember2Groups`}`, body); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/role-members.service.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/role-members.service.ts index 139143d7c..d4a4f64e5 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/role-members.service.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/role-members.service.ts @@ -1,19 +1,18 @@ /* * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; @@ -21,9 +20,9 @@ import { NzSafeAny } from 'ng-zorro-antd/core/types'; import { Observable } from 'rxjs'; import { Message } from '../entity/Message'; +import { PageResults } from '../entity/PageResults'; import { RoleMembers } from '../entity/RoleMembers'; import { BaseService } from './base.service'; - @Injectable({ providedIn: 'root' }) @@ -33,4 +32,14 @@ export class RoleMembersService extends BaseService { this.server.urls.member = '/memberInRole'; this.server.urls.memberOut = '/memberNotInRole'; } + + rolesNoMember(params: NzSafeAny): Observable> { + return this.http.get>(`${this.server.urls.base}/rolesNoMember`, { + params: this.parseParams(params) + }); + } + + addMember2Roles(body: any): Observable> { + return this.http.post>(`${`${this.server.urls.base}/addMember2Roles`}`, body); + } } diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/users.service.ts b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/users.service.ts index 922158a9d..1e7ee5d78 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/users.service.ts +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/users.service.ts @@ -37,6 +37,12 @@ export class UsersService extends BaseService { }); } + getByUsername(params: NzSafeAny): Observable> { + return this.http.get>(`${this.server.urls.base}/getByUsername/${params}`, { + params: this.parseParams(params) + }); + } + updateStatus(params: NzSafeAny): Observable> { return this.http.get>(`${this.server.urls.base}/updateStatus`, { params: this.parseParams(params) diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json index 7d35fb459..48d941132 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json @@ -652,6 +652,9 @@ "disable":"Disable", "lock":"Lock", "unlock":"UnLock", + "accounts":"Accounts", + "roles":"Roles", + "groups":"Groups", "moreaction":"More", "submit":"Submit", "generate":"Generate", diff --git a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json index 091e618b0..f50726a26 100644 --- a/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json +++ b/maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json @@ -551,7 +551,7 @@ "password":{ "id": "用户编码", "displayName": "姓名", - "username": "账号", + "username": "登录账号", "oldPassword": "当前密码", "password": "新密码", "confirmPassword": "确认密码", @@ -651,6 +651,9 @@ "disable":"禁用", "lock":"锁定", "unlock":"解锁", + "accounts":"账号", + "roles":"角色", + "groups":"用户组", "submit":"提交", "moreaction":"更多", "generate":"生成", diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/GroupMemberController.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/GroupMemberController.java index 0ccc67a28..a712097b6 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/GroupMemberController.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/GroupMemberController.java @@ -1,5 +1,5 @@ /* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * Copyright [2022] [MaxKey of copyright http://www.maxkey.top] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,15 +20,17 @@ package org.maxkey.web.access.contorller; import org.apache.mybatis.jpa.persistence.JpaPageResults; import org.maxkey.authn.annotation.CurrentUser; import org.maxkey.entity.GroupMember; +import org.maxkey.entity.Groups; import org.maxkey.entity.Message; import org.maxkey.entity.UserInfo; import org.maxkey.persistence.service.GroupMemberService; import org.maxkey.persistence.service.GroupsService; +import org.maxkey.persistence.service.UserInfoService; +import org.maxkey.util.StringUtils; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -45,13 +47,14 @@ public class GroupMemberController { final static Logger _logger = LoggerFactory.getLogger(GroupMemberController.class); @Autowired - @Qualifier("groupMemberService") GroupMemberService groupMemberService; @Autowired - @Qualifier("groupsService") GroupsService groupsService; + @Autowired + UserInfoService userInfoService; + @RequestMapping(value = { "/fetch" }, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody public ResponseEntity fetch( @@ -82,6 +85,13 @@ public class GroupMemberController { groupMemberService.queryPageResults("memberNotInGroup",groupMember)).buildResponse(); } + @RequestMapping(value = { "/groupsNoMember" }) + @ResponseBody + public ResponseEntity groupsNoMember(@ModelAttribute GroupMember groupMember,@CurrentUser UserInfo currentUser) { + groupMember.setInstId(currentUser.getInstId()); + return new Message>( + groupMemberService.groupsNoMember(groupMember)).buildResponse(); + } @RequestMapping(value = {"/add"}) @ResponseBody @@ -118,6 +128,41 @@ public class GroupMemberController { return new Message(Message.FAIL).buildResponse(); } + + @RequestMapping(value = {"/addMember2Groups"}) + @ResponseBody + public ResponseEntity addMember2Groups(@RequestBody GroupMember groupMember,@CurrentUser UserInfo currentUser) { + if (groupMember == null || StringUtils.isBlank(groupMember.getUsername())) { + return new Message(Message.FAIL).buildResponse(); + } + UserInfo userInfo = userInfoService.findByUsername(groupMember.getUsername()); + + boolean result = true; + String groupIds = groupMember.getGroupId(); + String groupNames = groupMember.getGroupName(); + if (groupIds != null && userInfo != null) { + String[] arrGroupIds = groupIds.split(","); + 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 = groupMemberService.insert(newGroupMember); + } + if(result) { + return new Message(Message.SUCCESS).buildResponse(); + } + } + return new Message(Message.FAIL).buildResponse(); + } + @ResponseBody @RequestMapping(value={"/delete"}, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity delete(@RequestParam("ids") String ids,@CurrentUser UserInfo currentUser) { diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/UserInfoController.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/UserInfoController.java index fd19ed84b..d9d108392 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/UserInfoController.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/contorller/UserInfoController.java @@ -107,6 +107,13 @@ public class UserInfoController { return new Message(userInfo).buildResponse(); } + @RequestMapping(value = { "/getByUsername/{username}" }, produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity getByUsername(@PathVariable("username") String username) { + UserInfo userInfo=userInfoService.findByUsername(username); + userInfo.trans(); + return new Message(userInfo).buildResponse(); + } + @ResponseBody @RequestMapping(value={"/add"}, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity insert(@RequestBody UserInfo userInfo,@CurrentUser UserInfo currentUser) { diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/permissions/contorller/RoleMemberController.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/permissions/contorller/RoleMemberController.java index c9032a599..987aa886d 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/permissions/contorller/RoleMemberController.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/permissions/contorller/RoleMemberController.java @@ -21,9 +21,12 @@ import org.apache.mybatis.jpa.persistence.JpaPageResults; import org.maxkey.authn.annotation.CurrentUser; import org.maxkey.entity.Message; import org.maxkey.entity.RoleMember; +import org.maxkey.entity.Roles; import org.maxkey.entity.UserInfo; import org.maxkey.persistence.service.RoleMemberService; import org.maxkey.persistence.service.RolesService; +import org.maxkey.persistence.service.UserInfoService; +import org.maxkey.util.StringUtils; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +52,9 @@ public class RoleMemberController { @Autowired RolesService rolesService; + @Autowired + UserInfoService userInfoService; + @RequestMapping(value = { "/fetch" }, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody public ResponseEntity fetch( @@ -85,7 +91,7 @@ public class RoleMemberController { if (roleMember == null || roleMember.getRoleId() == null) { return new Message(Message.FAIL).buildResponse(); } - String groupId = roleMember.getRoleId(); + String roleId = roleMember.getRoleId(); boolean result = true; String memberIds = roleMember.getMemberId(); @@ -97,7 +103,7 @@ public class RoleMemberController { for (int i = 0; i < arrMemberIds.length; i++) { RoleMember newRoleMember = new RoleMember( - groupId, + roleId, roleMember.getRoleName(), arrMemberIds[i], arrMemberNames[i], @@ -113,6 +119,48 @@ public class RoleMemberController { return new Message(Message.FAIL).buildResponse(); } + @RequestMapping(value = { "/rolesNoMember" }) + @ResponseBody + public ResponseEntity rolesNoMember(@ModelAttribute RoleMember roleMember,@CurrentUser UserInfo currentUser) { + roleMember.setInstId(currentUser.getInstId()); + return new Message>( + roleMemberService.rolesNoMember(roleMember)).buildResponse(); + } + + @RequestMapping(value = {"/addMember2Roles"}) + @ResponseBody + public ResponseEntity addMember2Roles(@RequestBody RoleMember roleMember,@CurrentUser UserInfo currentUser) { + if (roleMember == null || StringUtils.isBlank(roleMember.getUsername())) { + return new Message(Message.FAIL).buildResponse(); + } + UserInfo userInfo = userInfoService.findByUsername(roleMember.getUsername()); + + boolean result = true; + String roleIds = roleMember.getRoleId(); + String roleNames = roleMember.getRoleName(); + if (roleIds != null) { + String[] arrRoleIds = roleIds.split(","); + String[] arrRoleNames = roleNames.split(","); + + for (int i = 0; i < arrRoleIds.length; i++) { + RoleMember newRoleMember = + new RoleMember( + arrRoleIds[i], + arrRoleNames[i], + userInfo.getId(), + userInfo.getDisplayName(), + "USER", + currentUser.getInstId()); + newRoleMember.setId(WebContext.genId()); + result = roleMemberService.insert(newRoleMember); + } + if(result) { + return new Message(Message.SUCCESS).buildResponse(); + } + } + return new Message(Message.FAIL).buildResponse(); + } + @ResponseBody @RequestMapping(value={"/delete"}, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity delete(@RequestParam("ids") String ids,@CurrentUser UserInfo currentUser) {