3 Commits df32652b67 ... f09ecdd5d0

Tác giả SHA1 Thông báo Ngày
  Sakulin f09ecdd5d0 feat: 改进标签颜色处理并添加CORS支持 2 tháng trước cách đây
  Sakulin 855a1eb611 feat(Post): 添加分类和描述字段并支持删除方法 2 tháng trước cách đây
  Sakulin f53ef3005e fix(post): 修复分页查询参数类型并添加参数验证 2 tháng trước cách đây
4 tập tin đã thay đổi với 62 bổ sung18 xóa
  1. 13 11
      prisma/schema.prisma
  2. 8 0
      src/main.ts
  3. 31 7
      src/post/post.controller.ts
  4. 10 0
      src/utils/index.ts

+ 13 - 11
prisma/schema.prisma

@@ -4,22 +4,24 @@ datasource db {
 }
 
 generator client {
-  provider = "prisma-client-js"
+    provider = "prisma-client-js"
 }
 
 model Tag {
-    id        Int     @id @default(autoincrement())
-    name      String  @unique
-    color     String // 创建随机鲜艳颜色
+    id        Int      @id @default(autoincrement())
+    name      String   @unique
+    color     String   @default("#ffffff")
     createdAt DateTime @default(now())
     posts     Post[]
 }
 
 model Post {
-    id        Int     @id @default(autoincrement())
-    title     String
-    content   String
-    createdAt DateTime @default(now())
-    updatedAt DateTime @default(now())
-    tags      Tag[]
-}
+    id          Int      @id @default(autoincrement())
+    title       String
+    content     String
+    createdAt   DateTime @default(now())
+    updatedAt   DateTime @default(now())
+    cate        String
+    descirption String   @default("")
+    tags        Tag[]
+}

+ 8 - 0
src/main.ts

@@ -3,6 +3,14 @@ import { AppModule } from './app.module';
 
 async function bootstrap() {
   const app = await NestFactory.create(AppModule);
+
+  app.enableCors({
+    origin: '*',
+    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
+    preflightContinue: false,
+    optionsSuccessStatus: 204,
+  });
+
   await app.listen(process.env.PORT ?? 3000);
 }
 bootstrap();

+ 31 - 7
src/post/post.controller.ts

@@ -6,14 +6,18 @@ import {
   Post,
   Body,
   Headers,
+  Delete,
 } from '@nestjs/common';
 import { AuthService } from 'src/auth/auth.service';
 import { DatasourceService } from 'src/datasource/datasource.service';
+import { generateVibrantRandomColor } from 'src/utils';
 
 interface PostBody {
   title: string;
   content: string;
   tags: string[];
+  cate: string;
+  description?: string;
 }
 
 @Controller('post')
@@ -25,20 +29,34 @@ export class PostController {
 
   @Get('/list')
   async getAllPosts(
-    @Query('length') take: number = 10,
-    @Query('start') skip: number = 0,
+    @Query('length') take: number | string,
+    @Query('start') skip: number | string,
   ) {
+    take = Number(take);
+    skip = Number(skip);
+    if (isNaN(take) || isNaN(skip)) {
+      return {
+        code: 400,
+        msg: 'Invalid length or start',
+      };
+    }
+
     const prisma = this.datasource.getPrisma();
     return {
       code: 200,
       data: await prisma.post.findMany({
-        skip: Number(skip),
-        take: Number(take),
+        skip,
+        take,
+        orderBy: {
+          createdAt: 'desc',
+        },
         select: {
           id: true,
           title: true,
           createdAt: true,
           updatedAt: true,
+          cate: true,
+          descirption: true,
           tags: {
             select: {
               name: true,
@@ -62,6 +80,8 @@ export class PostController {
         content: true,
         createdAt: true,
         updatedAt: true,
+        cate: true,
+        descirption: true,
         tags: {
           select: {
             name: true,
@@ -99,10 +119,12 @@ export class PostController {
         data: {
           title: body.title,
           content: body.content,
+          cate: body.cate,
+          descirption: body.description ?? '',
           tags: {
             connectOrCreate: body.tags.map((tag) => ({
               where: { name: tag },
-              create: { name: tag, color: '#000000' },
+              create: { name: tag, color: generateVibrantRandomColor() },
             })),
           },
         },
@@ -139,11 +161,13 @@ export class PostController {
         data: {
           title: body.title,
           content: body.content,
+          cate: body.cate,
+          descirption: body.description ?? '',
           tags: {
             set: [],
             connectOrCreate: body.tags.map((tag) => ({
               where: { name: tag },
-              create: { name: tag, color: '#000000' },
+              create: { name: tag, color: generateVibrantRandomColor() },
             })),
           },
         },
@@ -158,7 +182,7 @@ export class PostController {
       }));
   }
 
-  @Post('delete/:id')
+  @Delete('delete/:id')
   async deletePost(
     @Param('id') id: string,
     @Headers('Authorization') token: string,

+ 10 - 0
src/utils/index.ts

@@ -0,0 +1,10 @@
+/**
+ * 生成鲜艳的随机颜色
+ * @returns 以十六进制字符串表示的颜色值,例如 "#FF0000"
+ */
+export function generateVibrantRandomColor() {
+  const r = Math.floor(Math.random() * 256);
+  const g = Math.floor(Math.random() * 256);
+  const b = Math.floor(Math.random() * 256);
+  return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
+}