From e3ca7ac0276d0d92f0e8b58b998c3a35c7033aa9 Mon Sep 17 00:00:00 2001 From: tone <3341154833@qq.com> Date: Mon, 12 May 2025 21:31:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=B5=84=E6=BA=90CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/admin-web-resource.controller.ts | 7 +- .../src/resource/resource.service.ts | 4 + .../web/resource/components/ResourceEdit.tsx | 155 ++++++++++++++++++ .../web/resource/components/ResourceTable.tsx | 107 ++++++------ .../console/(with-menu)/web/resource/page.tsx | 1 + .../lib/api/admin/web/resource/get.ts | 6 + .../lib/api/admin/web/resource/index.ts | 3 +- .../lib/api/admin/web/resource/update.ts | 2 +- 8 files changed, 233 insertions(+), 52 deletions(-) create mode 100644 tone-page-web/app/console/(with-menu)/web/resource/components/ResourceEdit.tsx create mode 100644 tone-page-web/lib/api/admin/web/resource/get.ts diff --git a/tone-page-server/src/admin/controller/web/admin-web-resource.controller.ts b/tone-page-server/src/admin/controller/web/admin-web-resource.controller.ts index 521577a..8ae92ca 100644 --- a/tone-page-server/src/admin/controller/web/admin-web-resource.controller.ts +++ b/tone-page-server/src/admin/controller/web/admin-web-resource.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Post, Put } from "@nestjs/common"; +import { Body, Controller, Delete, Get, Param, ParseUUIDPipe, Post, Put } from "@nestjs/common"; import { CreateResourceDto } from "src/admin/dto/admin-web/create-resource.dto"; import { ResourceService } from "src/resource/resource.service"; @@ -14,6 +14,11 @@ export class AdminWebResourceController { return this.resourceService.findAll(); } + @Get(':id') + async get(@Param('id', new ParseUUIDPipe({ version: '4' })) id: string) { + return this.resourceService.findById(id); + } + @Post() async create(@Body() data: CreateResourceDto) { return this.resourceService.create(data); diff --git a/tone-page-server/src/resource/resource.service.ts b/tone-page-server/src/resource/resource.service.ts index 29b4694..e3f8fff 100644 --- a/tone-page-server/src/resource/resource.service.ts +++ b/tone-page-server/src/resource/resource.service.ts @@ -18,6 +18,10 @@ export class ResourceService { }); } + async findById(id: string): Promise { + return this.resourceRepository.findOne({ where: { id } }); + } + async create(data: Partial): Promise { const resource = this.resourceRepository.create(data); return this.resourceRepository.save(resource); diff --git a/tone-page-web/app/console/(with-menu)/web/resource/components/ResourceEdit.tsx b/tone-page-web/app/console/(with-menu)/web/resource/components/ResourceEdit.tsx new file mode 100644 index 0000000..1cf6227 --- /dev/null +++ b/tone-page-web/app/console/(with-menu)/web/resource/components/ResourceEdit.tsx @@ -0,0 +1,155 @@ +"use client" + +import React, { useState } from "react" +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Button } from "@/components/ui/button" +import { toast } from "sonner" +import { ResourceBadge } from "@/components/resource" +import AddResourceTag from "./AddResourceTag" +import { Textarea } from "@/components/ui/textarea" +import { Plus } from "lucide-react" +import { Resource } from "@/lib/types/resource" +import { AdminApi } from "@/lib/api" +import useSWR from "swr" +import { ApiError } from "next/dist/server/api-utils" +interface ResourceEditProps { + children: React.ReactNode + id: string; + onRefresh: () => void; +} + +export default function ResourceEdit({ children, id, onRefresh }: ResourceEditProps) { + const [open, setOpen] = useState(false); + + const { data: resource, error, isLoading, mutate } = useSWR( + open ? [`/api/admin/web/resource/${id}`] : null, + () => AdminApi.web.resource.get(id), + { + revalidateOnFocus: false, + revalidateOnReconnect: false, + revalidateIfStale: false, + dedupingInterval: 5000, + } + ) + + const handleSubmit = async () => { + if (!resource) return; + try { + await AdminApi.web.resource.update(id, { + title: resource.title, + description: resource.description, + imageUrl: resource.imageUrl, + link: resource.link, + tags: resource.tags, + }); + toast.success("资源更新成功"); + onRefresh(); + setOpen(false); + } catch (error) { + toast.error((error as ApiError).message || "资源更新失败"); + } + } + + return ( + + + {children} + + + + 编辑资源 + + {resource && ( + <> +
+
+ + mutate({ ...resource, title: e.target.value }, false)} + className="col-span-3" + /> +
+
+ +