Explorar el Código

✨ feat(advertisements): 完善广告管理功能

- 添加图片文件上传功能,使用imageFileId替代imageUrl
- 优化表单处理逻辑,支持图片文件选择与关联
- 建立广告与图片文件的关联关系

📝 docs(commands): 添加通用CRUD路由注册指令文档

- 创建generic-crud-reg.md文档
- 说明通用CRUD开发规范的路由注册方法
- 描述API路由注册和客户端调用方法创建步骤

♻️ refactor(components): 优化AvatarSelector组件导入方式

- 将AvatarSelector改为默认导入
- 调整图片选择器的value处理逻辑,支持数值类型ID

🐛 fix(advertisements): 修复表单默认值和更新逻辑

- 修复创建表单imageFileId默认值未定义的问题
- 优化更新表单imageFileId的赋值逻辑,处理空值情况
yourname hace 7 meses
padre
commit
33989b4492

+ 9 - 0
.roo/commands/generic-crud-reg.md

@@ -0,0 +1,9 @@
+---
+description: "通用curd路由注册指令"
+---
+
+按通用curd开发规范进行路由注册
+
+
+注册路由到API
+创建客户端API调用方法

+ 7 - 8
src/client/admin-shadcn/pages/Advertisements.tsx

@@ -13,7 +13,7 @@ import { Textarea } from '@/client/components/ui/textarea';
 import { Switch } from '@/client/components/ui/switch';
 import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/client/components/ui/card';
 import { Badge } from '@/client/components/ui/badge';
-import { AvatarSelector } from '@/client/admin-shadcn/components/AvatarSelector';
+import AvatarSelector from '@/client/admin-shadcn/components/AvatarSelector';
 
 import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
 import { advertisementClient } from '@/client/api';
@@ -110,7 +110,7 @@ const Advertisements: React.FC = () => {
     defaultValues: {
       title: '',
       linkUrl: '',
-      imageUrl: '',
+      imageFileId: undefined,
       positionId: 1,
       sortOrder: 0,
       isEnabled: 1,
@@ -140,7 +140,7 @@ const Advertisements: React.FC = () => {
     updateForm.reset({
       title: data.title,
       linkUrl: data.linkUrl,
-      imageUrl: data.imageUrl,
+      imageFileId: data.imageFileId || undefined,
       positionId: data.positionId,
       sortOrder: data.sortOrder,
       isEnabled: data.isEnabled,
@@ -322,17 +322,16 @@ const Advertisements: React.FC = () => {
 
               <FormField
                 control={(isCreateForm ? createForm : updateForm).control}
-                name="imageUrl"
+                name="imageFileId"
                 render={({ field }) => (
                   <FormItem>
-                    <FormLabel className="flex items-center">
-                      图片地址
-                      <span className="text-red-500 ml-1">*</span>
+                    <FormLabel>
+                      图片文件
                     </FormLabel>
                     <FormControl>
                       <AvatarSelector
                         value={field.value || undefined}
-                        onChange={(value) => field.onChange(value)}
+                        onChange={(value) => field.onChange(value ? Number(value) : undefined)}
                         maxSize={2}
                         uploadPath="/advertisements"
                         uploadButtonText="上传图片"

+ 2 - 0
src/server/api/advertisements/index.ts

@@ -1,6 +1,7 @@
 import { createCrudRoutes } from '@/server/utils/generic-crud.routes';
 import { Advertisement } from '@/server/modules/advertisements/advertisement.entity';
 import { AdvertisementSchema, CreateAdvertisementDto, UpdateAdvertisementDto } from '@/server/modules/advertisements/advertisement.schema';
+import { File } from '@/server/modules/files/file.entity';
 import { authMiddleware } from '@/server/middleware/auth.middleware';
 
 const advertisementRoutes = createCrudRoutes({
@@ -10,6 +11,7 @@ const advertisementRoutes = createCrudRoutes({
   getSchema: AdvertisementSchema,
   listSchema: AdvertisementSchema,
   searchFields: ['title', 'description'],
+  relations: ['imageFile'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',