Browse Source

角色 & 用户

main
kkerwin 2 years ago
parent
commit
c650b7bb8c
  1. 10
      projects/admin/src/app/components/role-permission/role-permission.component.ts
  2. 2
      projects/admin/src/app/components/user-list/user-list.component.html
  3. 12
      projects/admin/src/app/components/user-list/user-list.component.ts
  4. 3
      projects/admin/src/app/dtos/user.dto.ts
  5. 8
      projects/admin/src/app/pages/organization/organization-form/organization-form.component.html
  6. 10
      projects/admin/src/app/pages/organization/organization-form/organization-form.component.ts
  7. 5
      projects/admin/src/app/pages/system/user-manage/user-manage.component.html
  8. 23
      projects/admin/src/app/pages/system/user-manage/user-manage.component.ts
  9. 3
      projects/admin/src/app/services/api.service.ts
  10. 1
      projects/admin/src/app/services/http.interceptor.ts
  11. 4
      projects/cdk/src/utils/index.ts

10
projects/admin/src/app/components/role-permission/role-permission.component.ts

@ -1,6 +1,6 @@
import { PermItemDTO, UserRoleDTO } from "@admin/app/dtos/user.dto"; import { PermItemDTO, UserRoleDTO } from "@admin/app/dtos/user.dto";
import { ApiService } from "@admin/app/services"; import { ApiService } from "@admin/app/services";
import { Component, Input, OnChanges, SimpleChanges } from "@angular/core"; import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from "@angular/core";
import { ActivatedRoute } from "@angular/router"; import { ActivatedRoute } from "@angular/router";
import { AnyObject } from "@cdk/types"; import { AnyObject } from "@cdk/types";
import { NzMessageService } from "ng-zorro-antd/message"; import { NzMessageService } from "ng-zorro-antd/message";
@ -18,6 +18,8 @@ export class RolePermissionComponent implements OnChanges {
@Input() role!: UserRoleDTO; @Input() role!: UserRoleDTO;
@Output() onReload = new EventEmitter();
loading = false; loading = false;
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {
@ -36,10 +38,7 @@ export class RolePermissionComponent implements OnChanges {
} }
if (changes["role"]?.currentValue) { if (changes["role"]?.currentValue) {
const role: UserRoleDTO = changes["role"].currentValue; const role: UserRoleDTO = changes["role"].currentValue;
let perms: number[] = []; let perms: number[] = role.roleItems ?? [];
try {
perms = JSON.parse(role.roleItems);
} catch (error) {}
this.hasPermissions.clear(); this.hasPermissions.clear();
perms.forEach((p) => { perms.forEach((p) => {
this.hasPermissions.add(p); this.hasPermissions.add(p);
@ -77,6 +76,7 @@ export class RolePermissionComponent implements OnChanges {
) )
.subscribe((res) => { .subscribe((res) => {
this.msg.success(res.desc); this.msg.success(res.desc);
this.onReload.emit();
}); });
} }
} }

2
projects/admin/src/app/components/user-list/user-list.component.html

@ -40,7 +40,7 @@
<td>{{data.uid}}</td> <td>{{data.uid}}</td>
<td>{{data.name}}</td> <td>{{data.name}}</td>
<td>{{data.roleName}}</td> <td>{{data.roleName}}</td>
<td>{{data.roleName}}</td> <td>{{data.time | date:'yyyy-MM-dd HH:mm:ss'}}</td>
<td> <td>
<a>编辑</a> <a>编辑</a>
<nz-divider nzType="vertical"></nz-divider> <nz-divider nzType="vertical"></nz-divider>

12
projects/admin/src/app/components/user-list/user-list.component.ts

@ -46,12 +46,12 @@ export class UserListComponent {
if (Utils.validateFormGroup(this.userFrom)) { if (Utils.validateFormGroup(this.userFrom)) {
const user = { ...this.userFrom.value, roleId: this.role.id }; const user = { ...this.userFrom.value, roleId: this.role.id };
user["password"] = MD5(user.password!).toString().substring(16).toUpperCase(); user["password"] = MD5(user.password!).toString().substring(16).toUpperCase();
const check = await lastValueFrom(this.api.checkUid(user.uid!)); // const check = await lastValueFrom(this.api.checkUid(user.uid!));
if (check.success) { // if (check.body) {
const res = await lastValueFrom(this.api.saveUser(user)); const res = await lastValueFrom(this.api.saveUser(user));
this.msg.success(res.desc); this.msg.success(res.desc);
return true; return true;
} // }
} }
return false; return false;
}, },

3
projects/admin/src/app/dtos/user.dto.ts

@ -1,6 +1,6 @@
export type UserRoleDTO = { export type UserRoleDTO = {
id: string; id: string;
roleItems: string; roleItems: number[];
roleName: string; roleName: string;
roleType: string; roleType: string;
vender: number; vender: number;
@ -19,4 +19,5 @@ export type UserDTO = {
roleId: number; roleId: number;
roleName: string; roleName: string;
uid: string; uid: string;
time: string;
}; };

8
projects/admin/src/app/pages/organization/organization-form/organization-form.component.html

@ -15,10 +15,14 @@
单位Logo 单位Logo
</nz-form-label> </nz-form-label>
<nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12"> <nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12">
<button class="upload-btn " nz-button [nzLoading]="uploadLoading"> <div class="mb-2" *ngIf="icon">
<img [src]="icon" class="h-20 w-20" />
</div>
<button class="vlock upload-btn " nz-button [nzLoading]="uploadLoading">
<i nz-icon nzType="upload"></i> <i nz-icon nzType="upload"></i>
上传图片 上传图片
<input type="file" formControlName="icon" (change)="onFileChange($event)" /> <input type="file" (change)="onFileChange($event)" />
<input type="hidden" formControlName="icon" (change)="onFileChange($event)" />
</button> </button>
</nz-form-control> </nz-form-control>
</nz-form-item> </nz-form-item>

10
projects/admin/src/app/pages/organization/organization-form/organization-form.component.ts

@ -36,8 +36,13 @@ export class OrganizationFormComponent {
uploadLoading = false; uploadLoading = false;
get icon() {
return this.formGroup.get("icon")?.value;
}
ngOnInit(): void { ngOnInit(): void {
this.formGroup = this.fb.group({ this.formGroup = this.fb.group({
id: this.fb.control(""),
account: this.fb.control("", [FormValidators.required("账号不能为空")]), account: this.fb.control("", [FormValidators.required("账号不能为空")]),
password: this.fb.control("", [FormValidators.required("密码不能为空")]), password: this.fb.control("", [FormValidators.required("密码不能为空")]),
name: this.fb.control("", [FormValidators.required("单位名称不能为空")]), name: this.fb.control("", [FormValidators.required("单位名称不能为空")]),
@ -51,6 +56,7 @@ export class OrganizationFormComponent {
console.log("this.state", this.state); console.log("this.state", this.state);
this.formGroup.patchValue(this.state); this.formGroup.patchValue(this.state);
} }
async onSubmit() { async onSubmit() {
if (Utils.validateFormGroup(this.formGroup)) { if (Utils.validateFormGroup(this.formGroup)) {
const org = { ...this.formGroup.value }; const org = { ...this.formGroup.value };
@ -59,11 +65,11 @@ export class OrganizationFormComponent {
const account = await lastValueFrom(this.api.checkOrgAccount(org.account!)); const account = await lastValueFrom(this.api.checkOrgAccount(org.account!));
const name = await lastValueFrom(this.api.checkOrgName(org.name!)); const name = await lastValueFrom(this.api.checkOrgName(org.name!));
if (account.body) { if (!account.body) {
this.msg.error("账号重复"); this.msg.error("账号重复");
return; return;
} }
if (name.body) { if (!name.body) {
this.msg.error("单位名称重复"); this.msg.error("单位名称重复");
return; return;
} }

5
projects/admin/src/app/pages/system/user-manage/user-manage.component.html

@ -53,14 +53,15 @@
<div class="p-4"> <div class="p-4">
<app-user-list <app-user-list
*ngIf="role && tab.toString() === '0'" *ngIf="role && tab.toString() === '0'"
[users]="userList" [users]="currentUserList"
[role]="role"> [role]="role">
</app-user-list> </app-user-list>
<app-role-permission <app-role-permission
*ngIf="role && tab.toString() === '1'" *ngIf="role && tab.toString() === '1'"
[perms]="allPerms" [perms]="allPerms"
[role]="role"> [role]="role"
(onReload)="getRoleList()">
</app-role-permission> </app-role-permission>
</div> </div>
</nz-card> </nz-card>

23
projects/admin/src/app/pages/system/user-manage/user-manage.component.ts

@ -31,13 +31,15 @@ export class UserManageComponent {
public roleForm = new FormGroup({ public roleForm = new FormGroup({
roleId: new FormControl(""), roleId: new FormControl(""),
roleName: new FormControl("", [FormValidators.required("请输入角色名称")]), roleName: new FormControl("", [FormValidators.required("请输入角色名称")]),
items: new FormControl("1"), items: new FormControl([]),
}); });
public allPerms: PermItemDTO[] = []; public allPerms: PermItemDTO[] = [];
public userList: UserDTO[] = []; public userList: UserDTO[] = [];
public currentUserList: UserDTO[] = [];
roleList: UserRoleDTO[] = []; roleList: UserRoleDTO[] = [];
ngOnInit(): void { ngOnInit(): void {
@ -58,6 +60,7 @@ export class UserManageComponent {
const role = this.roleList.find((f) => f.id === roleId); const role = this.roleList.find((f) => f.id === roleId);
if (role) { if (role) {
this.role = role; this.role = role;
this.onRoleChange(role.id);
return; return;
} }
if (this.roleList.length > 0) { if (this.roleList.length > 0) {
@ -69,13 +72,17 @@ export class UserManageComponent {
onRoleChange(roleId: string) { onRoleChange(roleId: string) {
const role = this.roleList.find((f) => f.id === roleId); const role = this.roleList.find((f) => f.id === roleId);
if (role) { if (role) {
this.role = role; this.router
this.router.navigate(["/system/user"], { .navigate(["/system/user"], {
queryParams: { queryParams: {
roleId, roleId,
}, },
queryParamsHandling: "merge", queryParamsHandling: "merge",
}); })
.then(() => {
this.role = role;
this.currentUserList = this.userList.filter((f) => Number(f.roleId) === Number(role.id));
});
} }
} }

3
projects/admin/src/app/services/api.service.ts

@ -66,7 +66,7 @@ export class ApiService {
saveUser(user: AnyObject) { saveUser(user: AnyObject) {
const body = Utils.objectToFormData(user); const body = Utils.objectToFormData(user);
const method = user["uid"] ? "post" : "put"; const method = user["id"] ? "post" : "put";
return this.http[method]<ResponseType>("/api/user", body); return this.http[method]<ResponseType>("/api/user", body);
} }
@ -80,6 +80,7 @@ export class ApiService {
params, params,
}); });
} }
checkOrgName(name: string) { checkOrgName(name: string) {
const params = new HttpParams().set("name", name); const params = new HttpParams().set("name", name);
return this.http.get<ResponseType<boolean>>("/api/vender/check/name", { return this.http.get<ResponseType<boolean>>("/api/vender/check/name", {

1
projects/admin/src/app/services/http.interceptor.ts

@ -68,6 +68,7 @@ export class HTTPInterceptor implements HttpInterceptor {
this.msg.error(error.desc); this.msg.error(error.desc);
switch (error.code) { switch (error.code) {
case 401: case 401:
localStorage.removeItem("account");
this.router.navigate(["/", "login"]); this.router.navigate(["/", "login"]);
break; break;
default: default:

4
projects/cdk/src/utils/index.ts

@ -66,7 +66,9 @@ export class Utils {
for (const key in obj) { for (const key in obj) {
if (obj.hasOwnProperty(key)) { if (obj.hasOwnProperty(key)) {
const value = obj[key]; const value = obj[key];
params.append(key, value); if (![void 0, null, ""].includes(value)) {
params.append(key, value);
}
} }
} }

Loading…
Cancel
Save