Browse Source

业务端 基本信息

main
kkerwin 2 years ago
parent
commit
40cbbe3d71
  1. 4
      package.json
  2. 2
      projects/admin/src/app/components/role-permission/role-permission.component.ts
  3. 2
      projects/admin/src/app/components/user-list/user-list.component.ts
  4. 2
      projects/admin/src/app/pages/food/food.component.ts
  5. 2
      projects/admin/src/app/pages/login/login.component.ts
  6. 2
      projects/admin/src/app/pages/organization/organization-list/organization-list.component.ts
  7. 2
      projects/admin/src/app/pages/system/user-manage/user-manage.component.ts
  8. 3
      projects/admin/src/app/services/api.service.ts
  9. 0
      projects/cdk/src/dtos/enum.dto.ts
  10. 0
      projects/cdk/src/dtos/index.ts
  11. 0
      projects/cdk/src/dtos/org.dto.ts
  12. 0
      projects/cdk/src/dtos/user.dto.ts
  13. 2
      projects/cdk/src/public-api.ts
  14. 10
      projects/client/src/app/app-routing.module.ts
  15. 8
      projects/client/src/app/app.module.ts
  16. 5
      projects/client/src/app/components/app-layout/app-layout.component.html
  17. 18
      projects/client/src/app/components/app-layout/app-layout.component.ts
  18. 2
      projects/client/src/app/pages/index.ts
  19. 2
      projects/client/src/app/pages/login/login.component.html
  20. 6
      projects/client/src/app/pages/login/login.component.ts
  21. 158
      projects/client/src/app/pages/system/org-info/org-info.component.html
  22. 0
      projects/client/src/app/pages/system/org-info/org-info.component.less
  23. 68
      projects/client/src/app/pages/system/org-info/org-info.component.ts
  24. 61
      projects/client/src/app/services/client-api.service.ts
  25. 6
      projects/client/src/app/services/http.interceptor.ts
  26. 0
      proxy.conf.json

4
package.json

@ -3,8 +3,8 @@
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start:admin": "ng serve admin --proxy-config ./projects/admin/proxy.conf.json",
"start:client": "ng serve client",
"start:admin": "ng serve admin --proxy-config ./proxy.conf.json",
"start:client": "ng serve client --proxy-config ./proxy.conf.json",
"build:admin": "ng build admin",
"build:client": "ng build client",
"watch": "ng build --watch --configuration development",

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

@ -1,4 +1,4 @@
import { PermItemDTO, UserRoleDTO } from "@admin/app/dtos/user.dto";
import { PermItemDTO, UserRoleDTO } from "@cdk/dtos/user.dto";
import { ApiService } from "@admin/app/services";
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from "@angular/core";
import { ActivatedRoute } from "@angular/router";

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

@ -1,4 +1,4 @@
import { UserDTO, UserRoleDTO } from "@admin/app/dtos/user.dto";
import { UserDTO, UserRoleDTO } from "@cdk/dtos/user.dto";
import { ApiService } from "@admin/app/services";
import {
Component,

2
projects/admin/src/app/pages/food/food.component.ts

@ -1,5 +1,5 @@
import { FoodFormComponent } from "@admin/app/components";
import { GlobalEnum } from "@admin/app/dtos";
import { GlobalEnum } from "@cdk/dtos";
import { ApiService } from "@admin/app/services";
import { Component, OnDestroy, OnInit, TemplateRef, ViewChild } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";

2
projects/admin/src/app/pages/login/login.component.ts

@ -30,7 +30,7 @@ export class LoginComponent {
if (Utils.validateFormGroup(this.loginForm)) {
const { value } = this.loginForm;
const pwd = value.pwd as string;
value["pwd"] = MD5(pwd).toString().substring(16).toUpperCase();
value["pwd"] = MD5(pwd).toString().slice(-16).toUpperCase();
this.loading = true;
const res = await lastValueFrom(
this.api.login(value).pipe(

2
projects/admin/src/app/pages/organization/organization-list/organization-list.component.ts

@ -4,7 +4,7 @@ import { NzDrawerRef, NzDrawerService } from "ng-zorro-antd/drawer";
import { AnyObject, TableListOption } from "@cdk/public-api";
import { DishFormComponent } from "@admin/app/components";
import { ApiService } from "@admin/app/services";
import { OrgDTO } from "@admin/app/dtos";
import { OrgDTO } from "@cdk/dtos";
import { Router } from "@angular/router";
import { NzModalService } from "ng-zorro-antd/modal";
import { lastValueFrom } from "rxjs";

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

@ -1,5 +1,5 @@
import { FoodFormComponent } from "@admin/app/components";
import { PermItemDTO, UserDTO, UserRoleDTO } from "@admin/app/dtos/user.dto";
import { PermItemDTO, UserDTO, UserRoleDTO } from "@cdk/dtos/user.dto";
import { ApiService } from "@admin/app/services";
import { Component, OnChanges, OnInit, SimpleChanges, TemplateRef, ViewChild } from "@angular/core";
import { FormControl, FormGroup, FormGroupName } from "@angular/forms";

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

@ -3,8 +3,7 @@ import { Injectable } from "@angular/core";
import { AnyObject, ResponseType } from "@cdk/types";
import { Utils } from "@cdk/utils";
import { Observable, map, of, tap } from "rxjs";
import { PermItemDTO, UserDTO, UserRoleDTO } from "../dtos/user.dto";
import { GlobalEnum, OrgDTO } from "../dtos";
import { PermItemDTO, UserDTO, UserRoleDTO, GlobalEnum, OrgDTO } from "@cdk/public-api";
@Injectable({
providedIn: "root",

0
projects/admin/src/app/dtos/enum.dto.ts → projects/cdk/src/dtos/enum.dto.ts

0
projects/admin/src/app/dtos/index.ts → projects/cdk/src/dtos/index.ts

0
projects/admin/src/app/dtos/org.dto.ts → projects/cdk/src/dtos/org.dto.ts

0
projects/admin/src/app/dtos/user.dto.ts → projects/cdk/src/dtos/user.dto.ts

2
projects/cdk/src/public-api.ts

@ -14,3 +14,5 @@ export * from "./table-list";
export * from "./storage";
export * from "./icons/icons-provider.module";
export * from "./dtos";

10
projects/client/src/app/app-routing.module.ts

@ -7,6 +7,7 @@ import {
FoodComponent,
LoginComponent,
MealSettingComponent,
OrgInfoComponent,
} from "./pages";
import { AppLayoutComponent } from "./components";
@ -41,6 +42,15 @@ const routes: Routes = [
path: "dish",
component: DishComponent,
},
{
path: "system",
children: [
{
path: "org",
component: OrgInfoComponent,
},
],
},
],
},
];

8
projects/client/src/app/app.module.ts

@ -21,7 +21,9 @@ import {
DataVisComponent,
FoodComponent,
DishComponent,
OrgInfoComponent,
} from "./pages";
import { HTTPInterceptor } from "./services/http.interceptor";
registerLocaleData(zh);
@ -35,6 +37,7 @@ registerLocaleData(zh);
DataVisComponent,
FoodComponent,
DishComponent,
OrgInfoComponent,
],
imports: [
BrowserModule,
@ -46,7 +49,10 @@ registerLocaleData(zh);
SharedModule,
TableListModule,
],
providers: [{ provide: NZ_I18N, useValue: zh_CN }],
providers: [
{ provide: NZ_I18N, useValue: zh_CN },
{ provide: HTTP_INTERCEPTORS, useClass: HTTPInterceptor, multi: true },
],
bootstrap: [AppComponent],
})
export class AppModule {}

5
projects/client/src/app/components/app-layout/app-layout.component.html

@ -59,7 +59,10 @@
</ul>
</li>
<li nz-submenu nzTitle="系统设置" nzIcon="setting" [nzOpen]="currentUrl.includes('/system/')">
<li nz-submenu nzTitle="基础信息设置" nzIcon="setting" [nzOpen]="currentUrl.includes('/system/')">
<ul>
<li nz-menu-item nzMatchRouter [routerLink]="['/','system','org']">单位信息设置</li>
</ul>
<ul>
<li nz-menu-item nzMatchRouter [routerLink]="['/','system','user']">用户管理</li>
</ul>

18
projects/client/src/app/components/app-layout/app-layout.component.ts

@ -1,8 +1,10 @@
import { Component } from "@angular/core";
import { NavigationEnd, Router, RouterModule } from "@angular/router";
import { NzMessageService } from "ng-zorro-antd/message";
import { NzModalService } from "ng-zorro-antd/modal";
import { Subject, filter, takeUntil } from "rxjs";
import { Subject, filter, lastValueFrom, takeUntil } from "rxjs";
import { ClientApiService } from "../../services";
@Component({
selector: "app-layout",
@ -10,7 +12,12 @@ import { Subject, filter, takeUntil } from "rxjs";
styleUrls: ["./app-layout.component.less"],
})
export class AppLayoutComponent {
constructor(private router: Router, private modal: NzModalService) {
constructor(
private router: Router,
private modal: NzModalService,
private msg: NzMessageService,
private api: ClientApiService
) {
this.router.events
.pipe(
takeUntil(this.unSubscribe$),
@ -29,7 +36,12 @@ export class AppLayoutComponent {
this.modal.confirm({
nzTitle: "警告",
nzContent: "是否要退出登录?",
nzOnOk: () => {},
nzOnOk: async () => {
const res = await lastValueFrom(this.api.logout());
this.msg.success(res.desc);
localStorage.removeItem(this.api.accountKey);
this.router.navigate(["/login"]);
},
});
}
}

2
projects/client/src/app/pages/index.ts

@ -4,3 +4,5 @@ export * from "./meal-setting/meal-setting.component";
export * from "./data-vis/data-vis.component";
export * from "./food/food.component";
export * from "./dish/dish.component";
export * from "./system/org-info/org-info.component";

2
projects/client/src/app/pages/login/login.component.html

@ -30,7 +30,7 @@
<nz-form-item>
<nz-form-control [nzErrorTip]="formErrorTipsTpl">
<nz-input-group [nzPrefix]="prefixTemplatePassword" nzSize="large">
<input nz-input type="password" placeholder="密码" formControlName="password" />
<input nz-input type="password" placeholder="密码" formControlName="pwd" />
</nz-input-group>
<ng-template #prefixTemplatePassword>
<span nz-icon nzType="lock"></span>

6
projects/client/src/app/pages/login/login.component.ts

@ -5,6 +5,7 @@ import { NzMessageService } from "ng-zorro-antd/message";
import { FormValidators } from "projects/cdk/src/public-api";
import { Utils } from "projects/cdk/src/utils";
import { finalize, lastValueFrom } from "rxjs";
import { MD5 } from "crypto-js";
import { ClientApiService } from "../../services";
@Component({
@ -17,7 +18,7 @@ export class LoginComponent {
public loginForm = new FormGroup({
uid: new FormControl("", [FormValidators.required("请输入账户")]),
password: new FormControl("", [FormValidators.required("请输入密码")]),
pwd: new FormControl("", [FormValidators.required("请输入密码")]),
});
public loading: boolean = false;
@ -27,6 +28,8 @@ export class LoginComponent {
async onLogin() {
if (Utils.validateFormGroup(this.loginForm)) {
const { value } = this.loginForm;
const pwd = value.pwd as string;
value["pwd"] = MD5(pwd).toString().slice(-16).toUpperCase();
this.loading = true;
const res = await lastValueFrom(
this.api.login(value).pipe(
@ -35,6 +38,7 @@ export class LoginComponent {
})
)
);
localStorage.setItem(this.api.accountKey, JSON.stringify(res.body));
this.msg.success(res.desc);
this.router.navigate(["/"]);
}

158
projects/client/src/app/pages/system/org-info/org-info.component.html

@ -0,0 +1,158 @@
<app-page>
<nz-card [nzTitle]="orgInfoTpl" *ngIf="account?.vender as org">
<ng-template #orgInfoTpl>
<span>
单位基础信息
</span>
<small class="ml-2">
<a>
编辑
</a>
</small>
</ng-template>
<div nz-form>
<nz-form-item>
<nz-form-label>
单位名称
</nz-form-label>
<nz-form-control>
{{org.name}}
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
单位Logo
</nz-form-label>
<nz-form-control>
<div class="w-20 h-20" *ngIf="org.icon">
<img [src]="org.icon" class=" w-full h-full" />
</div>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
地址
</nz-form-label>
<nz-form-control>
{{org.address ?? '-'}}
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
联系人
</nz-form-label>
<nz-form-control>
{{org.contacts ?? '-'}}
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
联系电话
</nz-form-label>
<nz-form-control>
{{org.phone ?? '-'}}
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
邮箱
</nz-form-label>
<nz-form-control>
{{org.email ?? '-'}}
</nz-form-control>
</nz-form-item>
</div>
</nz-card>
<nz-card [nzTitle]="orgInfoTpl" *ngIf="account?.vender as org" class="mt-4">
<ng-template #orgInfoTpl>
<span>
账号信息
</span>
<small class="ml-2 text-slate-500">
仅支持主账号操作
</small>
</ng-template>
<div nz-form>
<nz-form-item>
<nz-form-label>
账号
</nz-form-label>
<nz-form-control>
{{account?.uid}}
<a class="ml-4" (click)="updateAccount('uid',updateAccountInfoTpl)">
修改账号
</a>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
密码
</nz-form-label>
<nz-form-control>
<a (click)="changePassword(changePasswordTpl)">
修改密码
</a>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label>
账号到期时间
</nz-form-label>
<nz-form-control>
{{org?.expire | date:'yyyy-MM-dd'}}
<a class="ml-4" (click)="updateAccount(org?.expire,updateAccountInfoTpl)">
续费
</a>
</nz-form-control>
</nz-form-item>
</div>
</nz-card>
</app-page>
<ng-template #updateAccountInfoTpl>
<div *ngIf="account?.vender as org" class=" text-base text-blue-500">
<span>
{{org.contacts ?? '-'}}
</span>
<span>
{{org.phone ?? '-'}}
</span>
</div>
</ng-template>
<ng-template #changePasswordTpl>
<form nz-form [formGroup]="pwdForm">
<nz-form-item>
<nz-form-label nzSpan="6" [nzRequired]="true">
原密码
</nz-form-label>
<nz-form-control [nzErrorTip]="errTipTpl" nzSpan="12">
<input nz-input type="password" placeholder="请输入原密码" formControlName="oldPwd" />
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label nzSpan="6" [nzRequired]="true">
新密码
</nz-form-label>
<nz-form-control [nzErrorTip]="errTipTpl" nzSpan="12">
<input nz-input type="password" placeholder="请输入新密码" formControlName="newPwd" />
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label nzSpan="6" [nzRequired]="true">
确认密码
</nz-form-label>
<nz-form-control [nzErrorTip]="errTipTpl" nzSpan="12">
<input nz-input type="password" placeholder="请再次输入新密码" formControlName="rePwd" />
</nz-form-control>
</nz-form-item>
</form>
</ng-template>
<ng-template #errTipTpl let-control>
<form-error-tips [control]="control"></form-error-tips>
</ng-template>

0
projects/client/src/app/pages/system/org-info/org-info.component.less

68
projects/client/src/app/pages/system/org-info/org-info.component.ts

@ -0,0 +1,68 @@
import { Component, OnInit, TemplateRef } from "@angular/core";
import { NzModalService } from "ng-zorro-antd/modal";
import { format } from "date-fns";
import { ClientApiService } from "../../../services";
import { FormControl, FormGroup } from "@angular/forms";
import { FormValidators } from "@cdk/validators";
import { Utils } from "@cdk/utils";
import { NzMessageService } from "ng-zorro-antd/message";
@Component({
selector: "app-org-info",
templateUrl: "./org-info.component.html",
styleUrls: ["./org-info.component.less"],
})
export class OrgInfoComponent implements OnInit {
constructor(private api: ClientApiService, private modal: NzModalService, private msg: NzMessageService) {}
account: any = null;
pwdForm = new FormGroup({
oldPwd: new FormControl("", [FormValidators.required("请输入原密码")]),
newPwd: new FormControl("", [FormValidators.required("请输入新密码")]),
rePwd: new FormControl("", [FormValidators.required("请再次输入新密码")]),
});
ngOnInit(): void {
try {
const strageAccount = localStorage.getItem(this.api.accountKey);
if (strageAccount) {
this.account = JSON.parse(strageAccount);
}
} catch (error) {}
}
updateAccount(type: string | number, nzContent: TemplateRef<{}>) {
const nzTitle =
type === "uid"
? "如需修改超级管理员账号,请联系:"
: `账号将于 ${format(type as number, "yyyy-MM-dd")} 到期,续费请联系`;
this.modal.info({
nzTitle,
nzContent,
nzOkText: "知道了",
});
}
cancelPwdForm() {
this.pwdForm.reset();
}
changePassword(nzContent: TemplateRef<{}>) {
this.modal.create({
nzTitle: "修改密码",
nzContent,
nzOnOk: async () => {
if (Utils.validateFormGroup(this.pwdForm)) {
const { value } = this.pwdForm;
if (value.newPwd !== value.rePwd) {
this.msg.error("两次密码输入不一致");
return false;
}
}
return false;
},
nzOnCancel: this.cancelPwdForm.bind(this),
});
}
}

61
projects/client/src/app/services/client-api.service.ts

@ -1,5 +1,6 @@
import { HttpClient } from "@angular/common/http";
import { HttpClient, HttpParams } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Utils, AnyObject, ResponseType, UserRoleDTO, PermItemDTO, UserDTO } from "@cdk/public-api";
import { map } from "rxjs";
@Injectable({
@ -8,9 +9,7 @@ import { map } from "rxjs";
export class ClientApiService {
constructor(private http: HttpClient) {}
login(v: {}) {
return this.http.post<any>("/", v);
}
public accountKey = "CATERING_CLIENT_ACCOUNT";
page(v: {}, q: {}) {
return this.http.get<any>("https://jsonplaceholder.typicode.com/users", v).pipe(
@ -22,4 +21,58 @@ export class ClientApiService {
})
);
}
login(v: {}) {
const params = Utils.objectToHttpParams(v);
return this.http.get<ResponseType>("/api/login", { params });
}
logout() {
return this.http.get<ResponseType>("/api/logout");
}
getRoleList() {
return this.http.get<ResponseType<UserRoleDTO[]>>("/api/role");
}
deleteRole(roleId: string) {
const params = new HttpParams().set("roleId", roleId);
return this.http.delete<ResponseType>("/api/role", {
params,
});
}
updateRole(rule: AnyObject) {
const body = Utils.objectToFormData(rule);
const method = rule["roleId"] ? "post" : "put";
return this.http[method]<ResponseType>("/api/role", body);
}
getRolePerms() {
return this.http.get<ResponseType<PermItemDTO[]>>("/api/role/item");
}
getUserList() {
return this.http.get<ResponseType<UserDTO[]>>("/api/user");
}
checkUid(uid: string) {
const params = new HttpParams().set("uid", uid);
return this.http.delete<ResponseType>("/api/user/check", {
params,
});
}
saveUser(user: AnyObject, edit: boolean) {
const body = Utils.objectToFormData(user);
const method = edit ? "post" : "put";
return this.http[method]<ResponseType>("/api/user", body);
}
deleteUser(uid: string) {
const params = new HttpParams().set("uid", uid);
return this.http.delete<ResponseType>("/api/user", {
params,
});
}
}

6
projects/client/src/app/services/http.interceptor.ts

@ -18,10 +18,10 @@ export class HTTPInterceptor implements HttpInterceptor {
private msgFlag = false;
private localStroageKey = "catering";
private tokenKey = "CATERING_CLIENT_TOKEN";
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.getItem(this.localStroageKey);
const token = localStorage.getItem(this.tokenKey);
if (token) {
req = req.clone({
@ -39,7 +39,7 @@ export class HTTPInterceptor implements HttpInterceptor {
if (res instanceof HttpResponse) {
const Authorization = res.headers.get("Authorization");
if (Authorization) {
localStorage.setItem(this.localStroageKey, Authorization);
localStorage.setItem(this.tokenKey, Authorization);
}
// if (this.decConfig.triggerError) {

0
projects/admin/proxy.conf.json → proxy.conf.json

Loading…
Cancel
Save