Explorar o código

修复用户组bug

MaxKey hai 1 ano
pai
achega
32656d5aa5

+ 1 - 1
maxkey-core/src/main/java/org/dromara/maxkey/entity/GroupMember.java

@@ -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{
 
 	/**

+ 1 - 1
maxkey-persistence/src/main/java/org/dromara/maxkey/persistence/service/GroupMemberService.java

@@ -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);

+ 41 - 21
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/group-members/member-groups-editer/member-groups-editer.component.html

@@ -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>

+ 5 - 5
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/group-members/member-groups-editer/member-groups-editer.component.ts

@@ -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;

+ 55 - 32
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/users/users.component.html

@@ -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>

+ 2 - 2
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/idm/users/users.component.ts

@@ -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}`);
     }
   }
 

+ 1 - 1
maxkey-web-frontend/maxkey-web-mgt-app/src/app/service/group-members.service.ts

@@ -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);
   }
 }

+ 22 - 0
maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json

@@ -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",

+ 22 - 0
maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json

@@ -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": "资源名称",

+ 22 - 0
maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-TW.json

@@ -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": "資源名稱",

+ 24 - 20
maxkey-webs/maxkey-web-mgt/src/main/java/org/dromara/maxkey/web/idm/contorller/GroupMemberController.java

@@ -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();