gemercheung 7 månader sedan
förälder
incheckning
0d37b8cf78

+ 1 - 1
packages/backend/src/modules/article/article.module.ts

@@ -8,4 +8,4 @@ import { TypeOrmModule } from '@nestjs/typeorm';
   providers: [ArticleService],
   controllers: [ArticleController],
 })
-export class ArticleModule { }
+export class ArticleModule {}

+ 1 - 1
packages/backend/src/modules/article/dto.ts

@@ -80,7 +80,7 @@ export class GetArticleDto {
   enable?: boolean;
 }
 
-export class QueryArticleDto extends GetArticleDto { }
+export class QueryArticleDto extends GetArticleDto {}
 
 export class UpdateArticleDto {
   @ApiProperty()

+ 14 - 12
packages/backend/src/modules/menu/dto.ts

@@ -20,17 +20,19 @@ export class CreateMenuDto {
   })
   title: string;
 
-  @ApiProperty({ required: true })
+  @ApiProperty({ required: false })
   @IsString()
-  content: string;
+  @IsOptional()
+  cover?: string;
 
   @ApiProperty({ required: true })
   @IsNumber()
   userId: number;
 
-  @ApiProperty({ required: true })
+  @ApiProperty({ nullable: true, required: false, default: null })
   @IsNumber()
-  categoryId: number;
+  @IsOptional()
+  categoryId?: number;
 
   @ApiProperty({ required: false, default: true })
   @IsBoolean()
@@ -41,9 +43,14 @@ export class CreateMenuDto {
   @IsBoolean()
   @IsOptional()
   enable?: boolean;
+
+  @ApiProperty({ nullable: true, required: false, default: null })
+  @IsNumber()
+  @IsOptional()
+  parentId?: number;
 }
 
-export class GetArticleDto {
+export class GetMenuDto {
   @ApiProperty({ required: false })
   @Allow()
   pageSize?: number;
@@ -61,9 +68,9 @@ export class GetArticleDto {
   enable?: boolean;
 }
 
-export class QueryArticleDto extends GetArticleDto {}
+export class QueryMenuDto extends GetMenuDto {}
 
-export class UpdateArticleDto {
+export class UpdateMenuDto {
   @ApiProperty()
   @IsString()
   @IsOptional()
@@ -73,11 +80,6 @@ export class UpdateArticleDto {
   title?: string;
 
   @ApiProperty({ required: false })
-  @IsOptional()
-  @IsString()
-  content?: string;
-
-  @ApiProperty({ required: false })
   @IsBoolean()
   @IsOptional()
   enable?: boolean;

+ 50 - 2
packages/backend/src/modules/menu/menu.controller.ts

@@ -1,4 +1,52 @@
-import { Controller } from '@nestjs/common';
+import {
+  Body,
+  Controller,
+  Delete,
+  Get,
+  Param,
+  Patch,
+  Post,
+  Query,
+  UseGuards,
+} from '@nestjs/common';
+import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
+import { MenuService } from './menu.service';
+import { CreateMenuDto, GetMenuDto, QueryMenuDto, UpdateMenuDto } from './dto';
+import { JwtGuard } from '@/common/guards';
 
 @Controller('menu')
-export class MenuController {}
+@ApiTags('menu')
+// @ApiBearerAuth('JWT')
+// @UseGuards(JwtGuard)
+export class MenuController {
+  constructor(private readonly menuService: MenuService) {}
+
+  @Post()
+  create(@Body() createMenuDto: CreateMenuDto) {
+    return this.menuService.create(createMenuDto);
+  }
+
+  @Get()
+  getAll(@Param() getMenuDto: GetMenuDto) {
+    return this.menuService.findAll(getMenuDto);
+  }
+
+  @Get('page')
+  findPagination(@Query() queryDto: QueryMenuDto) {
+    return this.menuService.findPagination(queryDto);
+  }
+
+  @Delete(':id')
+  remove(@Param('id') id: string) {
+    return this.menuService.remove(+id);
+  }
+  @Patch(':id')
+  update(@Param('id') id: string, @Body() updateMenuDto: UpdateMenuDto) {
+    return this.menuService.update(+id, updateMenuDto);
+  }
+
+  @Get('level/:id')
+  getLevelMenu(@Param('id') id: string) {
+    return this.menuService.findLevel(+id);
+  }
+}

+ 1 - 7
packages/backend/src/modules/menu/menu.entity.ts

@@ -34,14 +34,11 @@ export class Menu {
   @Column({ default: false })
   isPublish: boolean;
 
-  @Column({ type: 'longtext', nullable: true })
-  content: string;
-
   @Column({ default: '' })
   remark: string;
 
   @OneToOne(() => Category, {
-    cascade: true,
+    cascade: false,
     onDelete: 'CASCADE',
     createForeignKeyConstraints: false,
   })
@@ -57,9 +54,6 @@ export class Menu {
   @JoinColumn()
   user: User;
 
-  @Column({ nullable: true })
-  userId: number;
-
   @CreateDateColumn()
   createTime: Date;
 

+ 53 - 4
packages/backend/src/modules/menu/menu.service.ts

@@ -1,18 +1,67 @@
-import { Injectable } from '@nestjs/common';
+import { BadRequestException, Injectable } from '@nestjs/common';
 import { InjectRepository } from '@nestjs/typeorm';
 import { Menu } from './menu.entity';
-import { Repository } from 'typeorm';
-import { CreateMenuDto } from './dto';
+import { Like, Repository } from 'typeorm';
+import { CreateMenuDto, GetMenuDto, QueryMenuDto, UpdateMenuDto } from './dto';
 
 @Injectable()
 export class MenuService {
   constructor(
     @InjectRepository(Menu)
     private menuRepo: Repository<Menu>,
-  ) {}
+  ) { }
 
   async create(createMenuDto: CreateMenuDto) {
     const menu = this.menuRepo.create(createMenuDto);
     return this.menuRepo.save(menu);
   }
+
+  async findPagination(query: QueryMenuDto) {
+    const pageSize = query.pageSize || 10;
+    const pageNo = query.pageNo || 1;
+    const [data, total] = await this.menuRepo.findAndCount({
+      where: {
+        title: Like(`%${query.title || ''}%`),
+        enable: query.enable || undefined,
+      },
+      relations: { user: true, category: true },
+      order: {
+        // title: 'ASC',
+        createTime: 'DESC',
+      },
+      take: pageSize,
+      skip: (pageNo - 1) * pageSize,
+    });
+    const pageData = data.map((item) => {
+      return { ...item };
+    });
+    return { pageData, total };
+  }
+
+  async remove(id: number) {
+    await this.menuRepo.delete(id);
+    return true;
+  }
+  async find(id: number) {
+    return await this.menuRepo.findOne({ where: { id } });
+  }
+
+  async findAll(query: GetMenuDto) {
+    return this.menuRepo.find({ where: query });
+  }
+
+  async findLevel(level: number) {
+    return await this.menuRepo.find({
+      where: { level },
+      relations: { user: true, category: true },
+    });
+  }
+
+  async update(id: number, updateMenuDto: UpdateMenuDto) {
+    const menu = await this.menuRepo.findOne({ where: { id } });
+    if (!menu) throw new BadRequestException('权限不存在或者已删除');
+    const updateMenu = this.menuRepo.merge(menu, updateMenuDto);
+    await this.menuRepo.save(updateMenu);
+    return true;
+  }
 }