浏览代码

✨ feat(advertisement): 增加图片文件关联功能

- 添加image_file_id字段用于关联文件表
- 创建Advertisement与File实体的ManyToOne关系
- 在schema中添加imageFileId和imageFile相关字段定义
- 支持通过文件ID关联获取图片文件详细信息
yourname 4 月之前
父节点
当前提交
6b08e368e7

+ 21 - 4
src/server/modules/advertisements/advertisement.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';
+import { File } from '@/server/modules/files/file.entity';
 
 
 @Entity('ad')
 @Entity('ad')
 export class Advertisement {
 export class Advertisement {
@@ -40,15 +41,31 @@ export class Advertisement {
   })
   })
   url!: string | null;
   url!: string | null;
 
 
-  @Column({ 
-    name: 'img', 
-    type: 'varchar', 
+  @Column({
+    name: 'img',
+    type: 'varchar',
     length: 100,
     length: 100,
     nullable: true,
     nullable: true,
     comment: '图片'
     comment: '图片'
   })
   })
   img!: string | null;
   img!: string | null;
 
 
+  @Column({
+    name: 'image_file_id',
+    type: 'int',
+    unsigned: true,
+    nullable: true,
+    comment: '图片文件ID'
+  })
+  imageFileId!: number | null;
+
+  @ManyToOne(() => File, { nullable: true })
+  @JoinColumn({
+    name: 'image_file_id',
+    referencedColumnName: 'id'
+  })
+  imageFile!: File | null;
+
   @Column({ 
   @Column({ 
     name: 'sort', 
     name: 'sort', 
     type: 'int',
     type: 'int',

+ 21 - 0
src/server/modules/advertisements/advertisement.schema.ts

@@ -26,6 +26,19 @@ export const AdvertisementSchema = z.object({
     description: '图片地址',
     description: '图片地址',
     example: '/uploads/banner.jpg'
     example: '/uploads/banner.jpg'
   }),
   }),
+  imageFileId: z.number().int().positive().nullable().openapi({
+    description: '图片文件ID',
+    example: 1
+  }),
+  imageFile: z.object({
+    id: z.number().int().positive().openapi({ description: '文件ID' }),
+    name: z.string().max(255).openapi({ description: '文件名', example: 'banner.jpg' }),
+    fullUrl: z.string().openapi({ description: '文件完整URL', example: 'https://example.com/banner.jpg' }),
+    type: z.string().nullable().openapi({ description: '文件类型', example: 'image/jpeg' }),
+    size: z.number().nullable().openapi({ description: '文件大小(字节)', example: 102400 })
+  }).nullable().optional().openapi({
+    description: '图片文件信息'
+  }),
   sort: z.number().int().default(0).openapi({
   sort: z.number().int().default(0).openapi({
     description: '排序值',
     description: '排序值',
     example: 10
     example: 10
@@ -70,6 +83,14 @@ export const CreateAdvertisementDto = z.object({
     description: '图片地址',
     description: '图片地址',
     example: '/uploads/banner.jpg'
     example: '/uploads/banner.jpg'
   }),
   }),
+  imageFileId: z.coerce.number().int().positive().optional().openapi({
+    description: '图片文件ID',
+    example: 1
+  }),
+  imageFileId: z.coerce.number().int().positive().optional().openapi({
+    description: '图片文件ID',
+    example: 1
+  }),
   sort: z.coerce.number().int().default(0).optional().openapi({
   sort: z.coerce.number().int().default(0).optional().openapi({
     description: '排序值',
     description: '排序值',
     example: 10
     example: 10