Browse Source

更新文档

main
kkerwin 2 years ago
parent
commit
a2939f9ce1
  1. 13
      README.md
  2. 15
      doc/change.md
  3. 184
      doc/dish.md
  4. 1
      doc/index.md
  5. 6
      doc/ingredient.md
  6. 7
      doc/user.md
  7. 57
      doc/vender.md
  8. 5
      projects/admin/src/app/pages/food/food.component.ts
  9. 2
      projects/admin/src/app/pages/login/login.component.less
  10. 16
      projects/admin/src/app/pages/standard/standard-form/standard-form.component.html
  11. 87
      projects/admin/src/app/pages/standard/standard-form/standard-form.component.ts
  12. 26
      projects/admin/src/app/pages/standard/standard-list/standard-list.component.html
  13. 57
      projects/admin/src/app/pages/standard/standard-list/standard-list.component.ts
  14. 11
      projects/admin/src/app/pages/standard/standard-setting/standard-setting.component.html
  15. 62
      projects/admin/src/app/pages/standard/standard-setting/standard-setting.component.ts
  16. 52
      projects/cdk/src/services/api.service.ts
  17. 15
      projects/cdk/src/utils/index.ts
  18. 3
      projects/client/src/app/pages/food/food.component.ts

13
README.md

@ -25,3 +25,16 @@ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To u
## Further help ## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
------
# 09/16 ~ 09/17
1. 业务端取消常用/忌用 系统异常
2. 修改食材 提示成功 但是数据没有变化。 食材编号 是否允许 修改,若修改 会报错 [参数错误]食材不存在!
3. 业务端 配餐设置 POST /api/vender/config 405 无权限执行该操作!
4. 管理端 用户列表、修改角色名称、删除角色 报错: 系统异常 好像大部分用户管理的接口 都在报错
5. 删除 食材 系统异常
6. 管理端 食材列表 没有返回 更新日期
7. 营养标准列表 列表 没有 更新时间
8. 营养标准添加成功 需要 返回他的 id

15
doc/change.md

@ -10,6 +10,15 @@
> 9.11 > 9.11
``` ```
食材 用户列表协议返回字段增加添加时间:time
菜品 添加角色协议请求中的权限项列表允许为空
食谱 角色列表协议返回的权限项由字符串给位数组
```
```
9.17
食材接口: mark接口的(PUT, DELETE) ingredient(DELETE)参数名字改了下,
单位接口: vender接口的(GET) 增加keyword参数,并改为分页查询;
增加/api/vender/select(GET), 用于管理端其他部分下来狂选择单位

184
doc/dish.md

File diff suppressed because one or more lines are too long

1
doc/index.md

@ -7,7 +7,6 @@
### 协议列表 ### 协议列表
``` ```
* [协议约定](protocol.md)
* [修改记录](change.md) * [修改记录](change.md)
* [基础协议](basic.md) * [基础协议](basic.md)
* [用户权限](user.md) * [用户权限](user.md)

6
doc/ingredient.md

@ -97,7 +97,7 @@ nutrient={"fat": 10, "energy": 10, "calcium": 12, "protein": 15, "vitamin-a": 23
### 输入: ### 输入:
``` ```
Content-Type:application/x-www-form-urlencoded Content-Type:application/x-www-form-urlencoded
ingredients=010101,0101012,0101013 // 必填 keys=010101,0101012,0101013 // 必填
``` ```
@ -117,7 +117,7 @@ ingredients=010101,0101012,0101013 // 必填
### 输入: ### 输入:
``` ```
Content-Type:application/x-www-form-urlencoded Content-Type:application/x-www-form-urlencoded
ingredient=010101 // 食材编号 key=010101 // 食材编号
mark=常用 // 必填, 取值: 常用/忌用 mark=常用 // 必填, 取值: 常用/忌用
``` ```
@ -138,7 +138,7 @@ mark=常用 // 必填, 取值: 常用/忌用
### 输入: ### 输入:
``` ```
Content-Type:application/x-www-form-urlencoded Content-Type:application/x-www-form-urlencoded
ingredient=010101 // 食材编号 key=010101 // 食材编号
``` ```

7
doc/user.md

@ -92,7 +92,8 @@ roleId=2 //修改角色, 0-标识回收角色,其他-标识分配角色
"phone": "13919103409", "phone": "13919103409",
"roleId": 2, "roleId": 2,
"roleName": "超级管理员", "roleName": "超级管理员",
"uid": "xxx" "uid": "xxx",
"time" 123412341234
} }
], ],
"code": 200, "code": 200,
@ -227,7 +228,7 @@ roleId=2 //修改角色, 0-标识回收角色,其他-标识分配角色
``` ```
Content-Type:application/x-www-form-urlencoded Content-Type:application/x-www-form-urlencoded
roleName=ccc // 必填, 角色名称 roleName=ccc // 必填, 角色名称
items=1,2,3 // 必填, 赋予的权限项 items=1,2,3 // 赋予的权限项
``` ```
### 输出: ### 输出:
@ -290,7 +291,7 @@ items=1,2,3 // 赋予的权限项
"body": [ "body": [
{ {
"id": 2, "id": 2,
"roleItems": "[18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]", "roleItems": [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34],
"roleName": "超级管理员", "roleName": "超级管理员",
"roleType": "系统", "roleType": "系统",
"vender": 1 "vender": 1

57
doc/vender.md

File diff suppressed because one or more lines are too long

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

@ -46,6 +46,8 @@ export class FoodComponent implements OnInit, OnDestroy {
submitLoading = false; submitLoading = false;
editItem = null;
ngOnInit(): void { ngOnInit(): void {
this.initTableList(); this.initTableList();
this.tableList.getState$.pipe(takeUntil(this.destroy$)).subscribe((res) => { this.tableList.getState$.pipe(takeUntil(this.destroy$)).subscribe((res) => {
@ -92,6 +94,7 @@ export class FoodComponent implements OnInit, OnDestroy {
} }
showFoodForm(food?: any) { showFoodForm(food?: any) {
this.editItem = food;
this.drawerRef = this.drawer.create({ this.drawerRef = this.drawer.create({
nzTitle: food ? "编辑食材" : "新增食材", nzTitle: food ? "编辑食材" : "新增食材",
nzWidth: 520, nzWidth: 520,
@ -110,7 +113,7 @@ export class FoodComponent implements OnInit, OnDestroy {
if (val) { if (val) {
this.submitLoading = true; this.submitLoading = true;
this.api this.api
.saveFood(val) .saveFood(val, !!this.editItem)
.pipe( .pipe(
finalize(() => { finalize(() => {
this.submitLoading = false; this.submitLoading = false;

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

@ -29,7 +29,7 @@
.card { .card {
width: 960px; width: 960px;
height: 60vh; height: 580px;
min-height: 410px; min-height: 410px;
display: flex; display: flex;
align-items: center; align-items: center;

16
projects/admin/src/app/pages/standard/standard-form/standard-form.component.html

@ -7,7 +7,7 @@
营养标准名称 营养标准名称
</nz-form-label> </nz-form-label>
<nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12"> <nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12">
<input nz-input placeholder="请输入营养标准名称" /> <input nz-input placeholder="请输入营养标准名称" formControlName="name" />
</nz-form-control> </nz-form-control>
</nz-form-item> </nz-form-item>
@ -17,7 +17,7 @@
</nz-form-label> </nz-form-label>
<nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12"> <nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12">
<nz-input-group nzAddOnBefore="±" nzAddOnAfter="%"> <nz-input-group nzAddOnBefore="±" nzAddOnAfter="%">
<input nz-input /> <input nz-input formControlName="overflow" />
</nz-input-group> </nz-input-group>
</nz-form-control> </nz-form-control>
</nz-form-item> </nz-form-item>
@ -27,19 +27,23 @@
适用单位 适用单位
</nz-form-label> </nz-form-label>
<nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12"> <nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12">
<nz-select [nzOptions]="[]" nzMode="multiple" nzPlaceHolder="请选择适用单位"></nz-select> <nz-select nzMode="multiple" nzPlaceHolder="请选择适用单位" formControlName="vendors">
<nz-option *ngFor="let org of orgList" [nzValue]="org.id" [nzLabel]="org.name"></nz-option>
</nz-select>
</nz-form-control> </nz-form-control>
</nz-form-item> </nz-form-item>
<nz-form-item> <nz-form-item>
<nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12"> <nz-form-control [nzErrorTip]="formControlErrorTpl" nzSpan="12">
<nz-space> <nz-space>
<button *nzSpaceItem nz-button nzType="primary" (click)="onSubmit()"> <button *nzSpaceItem nz-button nzType="primary" (click)="onSubmit(true)"
[nzLoading]="submitLoading">
保存并设置营养标准 保存并设置营养标准
</button> </button>
<button *nzSpaceItem nz-button nzType="primary" (click)="onSubmit()"> <button *nzSpaceItem nz-button nzType="primary" (click)="onSubmit()"
[nzLoading]="submitLoading">
确定 确定
</button> </button>
<button *nzSpaceItem nz-button> <button *nzSpaceItem nz-button type="button" [routerLink]="['/standard/list']">
取消 取消
</button> </button>
</nz-space> </nz-space>

87
projects/admin/src/app/pages/standard/standard-form/standard-form.component.ts

@ -1,7 +1,12 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { FormBuilder, FormGroup } from "@angular/forms"; import { FormBuilder, FormGroup } from "@angular/forms";
import { Router } from "@angular/router"; import { ActivatedRoute, Router } from "@angular/router";
import { OrgDTO } from "@cdk/dtos";
import { ApiService } from "@cdk/services";
import { Utils } from "@cdk/utils";
import { FormValidators } from "@cdk/validators"; import { FormValidators } from "@cdk/validators";
import { NzMessageService } from "ng-zorro-antd/message";
import { finalize } from "rxjs";
@Component({ @Component({
selector: "app-standard-form", selector: "app-standard-form",
@ -9,49 +14,59 @@ import { FormValidators } from "@cdk/validators";
styleUrls: ["./standard-form.component.less"], styleUrls: ["./standard-form.component.less"],
}) })
export class StandardFormComponent { export class StandardFormComponent {
constructor(private fb: FormBuilder, private router: Router) {} constructor(
private fb: FormBuilder,
private router: Router,
private route: ActivatedRoute,
private api: ApiService,
private msg: NzMessageService
) {
const id = this.route.snapshot.paramMap.get("id");
if (id !== "create") {
const data = this.router.getCurrentNavigation()?.extras;
if (data) {
this.state = data.state;
} else {
this.router.navigate(["/standard/list"]);
}
}
}
formGroup!: FormGroup; formGroup!: FormGroup;
uploadLoading = false; submitLoading = false;
orgList: OrgDTO[] = [];
state: any;
ngOnInit(): void { ngOnInit(): void {
this.api.getOrgList().subscribe((res) => {
this.orgList = res.body;
});
this.formGroup = this.fb.group({ this.formGroup = this.fb.group({
id: this.fb.control("", [FormValidators.required()]), id: this.fb.control("", []),
name: this.fb.control("", [FormValidators.required()]), name: this.fb.control("", [FormValidators.required()]),
unit: this.fb.control("", [FormValidators.required()]), vendors: this.fb.control([], [FormValidators.required()]),
day: this.fb.control("1", [FormValidators.required()]), overflow: this.fb.control("0", [FormValidators.required()]),
logo: this.fb.control("", []),
month: this.fb.control([], []),
}); });
this.formGroup.patchValue(this.state);
} }
onSubmit() { onSubmit(gotoSetting?: boolean) {
this.router.navigate(["/", "standard", "setting", "45"]); if (Utils.validateFormGroup(this.formGroup)) {
} this.submitLoading = true;
this.api
onFileChange(e: Event) { .saveStandard(this.formGroup.value)
const target = e.target as HTMLInputElement; .pipe(
const file = target.files![0]; finalize(() => {
target.value = ""; this.submitLoading = false;
const formData = new FormData(); })
const fileReader = new FileReader(); )
fileReader.onload = () => { .subscribe((res) => {
const base64 = fileReader.result as string; this.msg.success(res.desc);
const redirectTo = gotoSetting ? ["/", "standard", "setting", res.body] : ["/standard/list"];
const v = base64.split("base64,")[1]; this.router.navigate(redirectTo);
}; });
formData.append("file", file); }
this.uploadLoading = true;
// this.api
// .uploadLogo(formData)
// .pipe(
// finalize(() => {
// this.uploadLoading = false;
// })
// )
// .subscribe((r) => {
// this.msg.success(r.desc);
// fileReader.readAsDataURL(file);
// });
} }
} }

26
projects/admin/src/app/pages/standard/standard-list/standard-list.component.html

@ -17,15 +17,21 @@
<ng-template #searchTpl> <ng-template #searchTpl>
<nz-form-item class="w-60"> <nz-form-item class="w-60">
<nz-form-control> <nz-form-control>
<input nz-input placeholder="请输入营养标准名称" /> <input nz-input placeholder="请输入营养标准名称" formControlName="keyword" />
</nz-form-control> </nz-form-control>
</nz-form-item> </nz-form-item>
</ng-template> </ng-template>
<ng-template #renderColumnsTpl let-data let-key="key" let-row="row"> <ng-template #renderColumnsTpl let-data let-key="key" let-row="row">
<ng-container [ngSwitch]="key"> <ng-container [ngSwitch]="key">
<ng-container *ngSwitchCase="'img'"> <ng-container *ngSwitchCase="'time'">
{{ data|date:'yyyy-MM-dd HH:mm:ss'}}
</ng-container>
<ng-container *ngSwitchCase="'vendors'">
{{ data.length }}个单位
</ng-container>
<ng-container *ngSwitchCase="'people'">
{{ data.length }}个人群
</ng-container> </ng-container>
<ng-container *ngSwitchDefault> <ng-container *ngSwitchDefault>
@ -37,16 +43,4 @@
</table-list> </table-list>
</nz-card> </nz-card>
</div> </div>
</app-page> </app-page>
<ng-template #formFooterTpl>
<nz-space>
<button *nzSpaceItem nz-button (click)="cancelFoodForm()">
取消
</button>
<button *nzSpaceItem nz-button nzType="primary">
保存
</button>
</nz-space>
</ng-template>

57
projects/admin/src/app/pages/standard/standard-list/standard-list.component.ts

@ -4,6 +4,10 @@ import { NzDrawerRef, NzDrawerService } from "ng-zorro-antd/drawer";
import { AnyObject, TableListOption } from "@cdk/public-api"; import { AnyObject, TableListOption } from "@cdk/public-api";
import { DishFormComponent } from "@admin/app/components"; import { DishFormComponent } from "@admin/app/components";
import { ApiService } from "@cdk/services"; import { ApiService } from "@cdk/services";
import { NzModalService } from "ng-zorro-antd/modal";
import { lastValueFrom } from "rxjs";
import { NzMessageService } from "ng-zorro-antd/message";
import { Router } from "@angular/router";
@Component({ @Component({
selector: "app-standard-list", selector: "app-standard-list",
@ -11,16 +15,17 @@ import { ApiService } from "@cdk/services";
styleUrls: ["./standard-list.component.less"], styleUrls: ["./standard-list.component.less"],
}) })
export class StandardListComponent { export class StandardListComponent {
constructor(private drawer: NzDrawerService, private api: ApiService) {} constructor(
private api: ApiService,
@ViewChild("formFooterTpl") formFooterTpl!: TemplateRef<{}>; private modal: NzModalService,
private msg: NzMessageService,
private drawerRef?: NzDrawerRef; private router: Router
) {}
public tableList = new TableListOption(this.fetchData.bind(this)); public tableList = new TableListOption(this.fetchData.bind(this));
public queryForm = new FormGroup({ public queryForm = new FormGroup({
name: new FormControl(""), keyword: new FormControl(""),
}); });
ngOnInit(): void { ngOnInit(): void {
@ -31,21 +36,21 @@ export class StandardListComponent {
this.tableList.scroll = { x: null }; this.tableList.scroll = { x: null };
this.tableList = this.tableList.setColumns([ this.tableList = this.tableList.setColumns([
{ key: "name", title: "营养标准名称" }, { key: "name", title: "营养标准名称" },
{ key: "name", title: "人群细分" }, { key: "people", title: "人群细分" },
{ key: "name", title: "适用单位" }, { key: "vendors", title: "适用单位" },
{ key: "name", title: "更新时间" }, { key: "time", title: "更新时间" },
]); ]);
this.tableList = this.tableList.setOptions([ this.tableList = this.tableList.setOptions([
{ {
title: "标准设置", title: "标准设置",
premissions: [], premissions: [],
onClick: this.showFoodForm.bind(this), onClick: this.toSetting.bind(this),
}, },
{ {
title: "编辑", title: "编辑",
premissions: [], premissions: [],
onClick: this.showFoodForm.bind(this), onClick: this.toEdit.bind(this),
}, },
{ {
title: "删除", title: "删除",
@ -56,21 +61,31 @@ export class StandardListComponent {
} }
fetchData(query: AnyObject, pager: AnyObject) { fetchData(query: AnyObject, pager: AnyObject) {
return this.api.page(pager, query); return this.api.getStandardPage(pager, query);
} }
showFoodForm(food?: any) { toEdit(d: AnyObject) {
this.drawerRef = this.drawer.create({ this.router.navigate([`/standard/form/${d["id"]}`], {
nzTitle: food ? "编辑菜品" : "新增菜品", state: d,
nzWidth: 700,
nzContent: DishFormComponent,
nzFooter: this.formFooterTpl,
}); });
} }
cancelFoodForm() { toSetting(d: AnyObject) {
this.drawerRef?.close(); this.router.navigate([`/standard/setting/${d["id"]}`], {
state: d,
});
} }
deleteItem() {} deleteItem(v: any) {
this.modal.confirm({
nzTitle: "警告",
nzContent: `是否要删除该营养标准?`,
nzOkDanger: true,
nzOnOk: async () => {
const res = await lastValueFrom(this.api.deleteStandard(v.id));
this.msg.success(res.desc);
this.tableList.run();
},
});
}
} }

11
projects/admin/src/app/pages/standard/standard-setting/standard-setting.component.html

@ -39,4 +39,15 @@
<ng-template #formControlErrorTpl let-control> <ng-template #formControlErrorTpl let-control>
<form-error-tips [control]="control"></form-error-tips> <form-error-tips [control]="control"></form-error-tips>
</ng-template> </ng-template>
<div class="fixed-footter left-[218px] fixed bottom-0 right-0 bg-white z-10 pl-8 py-2">
<nz-space>
<button *nzSpaceItem nz-button nzType="primary" (click)="onSubmit()">
确定
</button>
<button *nzSpaceItem nz-button>
取消
</button>
</nz-space>
</div>
</app-page> </app-page>

62
projects/admin/src/app/pages/standard/standard-setting/standard-setting.component.ts

@ -1,7 +1,9 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { FormBuilder, FormGroup } from "@angular/forms"; import { FormBuilder, FormGroup } from "@angular/forms";
import { Router } from "@angular/router"; import { ActivatedRoute, Router } from "@angular/router";
import { ApiService } from "@cdk/services";
import { FormValidators } from "@cdk/validators"; import { FormValidators } from "@cdk/validators";
import { NzMessageService } from "ng-zorro-antd/message";
@Component({ @Component({
selector: "app-standard-setting", selector: "app-standard-setting",
@ -9,49 +11,33 @@ import { FormValidators } from "@cdk/validators";
styleUrls: ["./standard-setting.component.less"], styleUrls: ["./standard-setting.component.less"],
}) })
export class StandardSettingComponent { export class StandardSettingComponent {
constructor(private fb: FormBuilder, private router: Router) {} constructor(
private fb: FormBuilder,
private router: Router,
private route: ActivatedRoute,
private api: ApiService,
private msg: NzMessageService
) {
const id = this.route.snapshot.paramMap.get("id");
if (id !== "create") {
const data = this.router.getCurrentNavigation()?.extras;
if (data) {
this.state = data.state;
} else {
this.router.navigate(["/standard/list"]);
}
}
}
state: any;
formGroup!: FormGroup; formGroup!: FormGroup;
uploadLoading = false; uploadLoading = false;
ngOnInit(): void { ngOnInit(): void {}
this.formGroup = this.fb.group({
id: this.fb.control("", [FormValidators.required()]),
name: this.fb.control("", [FormValidators.required()]),
unit: this.fb.control("", [FormValidators.required()]),
day: this.fb.control("1", [FormValidators.required()]),
logo: this.fb.control("", []),
month: this.fb.control([], []),
});
}
onSubmit() { onSubmit() {
this.router.navigate(["/", "standard", "setting", "45"]); this.router.navigate(["/", "standard", "setting", "45"]);
} }
onFileChange(e: Event) {
const target = e.target as HTMLInputElement;
const file = target.files![0];
target.value = "";
const formData = new FormData();
const fileReader = new FileReader();
fileReader.onload = () => {
const base64 = fileReader.result as string;
const v = base64.split("base64,")[1];
};
formData.append("file", file);
this.uploadLoading = true;
// this.api
// .uploadLogo(formData)
// .pipe(
// finalize(() => {
// this.uploadLoading = false;
// })
// )
// .subscribe((r) => {
// this.msg.success(r.desc);
// fileReader.readAsDataURL(file);
// });
}
} }

52
projects/cdk/src/services/api.service.ts

@ -211,24 +211,60 @@ export class ApiService {
); );
} }
saveFood(food: AnyObject) { saveFood(food: AnyObject, isEdit?: boolean) {
const body = Utils.objectToFormData(food); const body = Utils.objectToFormData(food);
const method = food["id"] ? "post" : "put"; const method = isEdit ? "post" : "put";
return this.http[method]<ResponseType>("/api/ingredient", body); return this.http[method]<ResponseType>("/api/ingredient", body);
} }
deleteFoods(ids: number[]) { deleteFoods(ids: number[]) {
const params = Utils.objectStringify({ nutrients: ids }); const params = Utils.objectToFormData({ ingredients: ids.join(",") });
console.log("params", params, { nutrients: ids }); return this.http.delete<ResponseType>(`/api/ingredient`, { body: params });
return this.http.delete<ResponseType>(`/api/ingredient?${params}`);
} }
importFood(f: FormData) { importFood(f: FormData) {
return this.http.put<ResponseType>("/api/ingredient/mark", f); return this.http.put<ResponseType>("/api/ingredient/upload", f);
} }
markFood(mark: string, nutrient: string) {
const params = Utils.objectToFormData({ mark, nutrient }, false);
markFood(mark: string, ingredient: string) {
const params = Utils.objectToFormData({ mark, ingredient });
return this.http.put<ResponseType>("/api/ingredient/mark", params); return this.http.put<ResponseType>("/api/ingredient/mark", params);
} }
removeFoodMark(ingredient: string) {
const params = Utils.objectToFormData({ ingredient });
return this.http.delete<ResponseType>("/api/ingredient/mark", { body: params });
}
getStandardPage(p: {}, q: {}) {
const params = Utils.objectStringify({ ...p, ...q });
return this.http.get<ResponseType<PageResult>>(`/api/nutrition?${params}`).pipe(
map((r) => {
if (Array.isArray(r.body.content)) {
r.body.content = r.body.content.map((o) => {
return {
...o,
people: Object.entries(o.ingredient ?? {}).map(([k, v]) => {
return {
peopleGroupName: k,
...((v as any) ?? {}),
};
}),
};
});
}
return r;
})
);
}
saveStandard(v: AnyObject, isEdit?: boolean) {
const body = Utils.objectToFormData({ ...v, vendors: v["vendors"].join(",") });
const method = isEdit ? "post" : "put";
return this.http[method]<ResponseType>("/api/nutrition", body);
}
deleteStandard(id: string) {
const params = Utils.objectToFormData({ id });
return this.http.delete<ResponseType>(`/api/nutrition`, { body: params });
}
} }

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

@ -61,19 +61,18 @@ export class Utils {
return params; return params;
} }
static objectToFormData(obj: AnyObject, skipEmpty: boolean = true): FormData { static objectToFormData(obj: AnyObject): FormData {
let params = new FormData(); let params = new FormData();
for (const key in obj) { for (const key in obj) {
if (obj.hasOwnProperty(key)) { if (obj.hasOwnProperty(key)) {
let value = obj[key]; let value = obj[key];
if (skipEmpty && [void 0, null, ""].includes(value)) { if (![void 0, null, ""].includes(value)) {
break; if (typeof value === "object") {
} params.append(key, JSON.stringify(value));
if (typeof value === "object") { } else {
params.append(key, JSON.stringify(value)); params.append(key, value);
} else { }
params.append(key, value);
} }
} }
} }

3
projects/client/src/app/pages/food/food.component.ts

@ -119,7 +119,8 @@ export class FoodComponent implements OnInit, OnDestroy {
nzContent: `是否要将食材该食材${text}`, nzContent: `是否要将食材该食材${text}`,
nzOkDanger: true, nzOkDanger: true,
nzOnOk: async () => { nzOnOk: async () => {
const res = await lastValueFrom(this.api.markFood(mark, v.key)); const api = mark ? this.api.markFood(mark, v.key) : this.api.removeFoodMark(v.key);
const res = await lastValueFrom(api);
this.msg.success(res.desc); this.msg.success(res.desc);
this.tableList.run(); this.tableList.run();
}, },

Loading…
Cancel
Save