Commit 5d6c6bf8 authored by wuhao's avatar wuhao 🎯

asder

parent 58b8a593
"use client"; "use client";
import { getFetch } from "@/lib/doFetch"; import { getFetch } from "@/lib/doFetch";
import { useRequest } from "ahooks"; import { useRequest } from "ahooks";
import { Button } from "@nextui-org/react"; import { Button } from "@nextui-org/react";
import { ArrowLeftOutlined } from "@ant-design/icons"; import { ArrowLeftOutlined } from "@ant-design/icons";
import EditFolder from "@/components/EditFolder"; import EditCollection from "@/components/EditCollection";
import DeleteFolder from "@/components/DeleteFolder"; import DeleteCollection from "@/components/DeleteCollection";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import {message} from 'antd';
import { IoMdShareAlt } from "react-icons/io";
const columns = [ const columns = [
...@@ -39,36 +38,48 @@ export default function Detail({ params }) { ...@@ -39,36 +38,48 @@ export default function Detail({ params }) {
} }
); );
const handleCopy = () => {
const textToCopy = window.location.href;
navigator.clipboard.writeText(textToCopy)
.then(() => {
message.success('链接复制成功')
})
.catch(err => {
console.error('Failed to copy text to clipboard:', err);
});
};
return ( return (
<div className="flex w-full flex-col"> <div className="flex w-full flex-col">
<div className="flex gap-4"> <div className="flex gap-4">
<Button
<Button isIconOnly
isIconOnly color="primary"
color="primary" variant="faded"
variant="faded" aria-label="Take a add"
aria-label="Take a add" onPress={() => {
onPress={() => { router.back();
router.back(); }}
}} >
> <ArrowLeftOutlined></ArrowLeftOutlined>
<ArrowLeftOutlined></ArrowLeftOutlined> </Button>
</Button> <Button color="primary" variant="flat" onPress={handleCopy} endContent={<IoMdShareAlt style={{fontSize:24}}/>}>
<Button color="primary" variant="flat"> 分享
{data?.name} </Button>
</Button> <EditCollection data={data} refresh={refreshAsync} />
<EditFolder data={data} refresh={refreshAsync}/> <DeleteCollection data={data} refresh={refreshAsync} />
<DeleteFolder data={data} refresh={refreshAsync}/> </div>
<div className="w-full object-cover h-[180px] flex justify-center items-center bg-gradient-to-r from-cyan-500 to-blue-500 text-white text-xl rounded-2xl mt-6">
</div> {data?.name}
</div>
<ul class="divide-y divide-gray-200"> <ul className="divide-y divide-gray-200">
{columns?.map((it) => { {columns?.map((it) => {
return ( return (
<li class="flex items-center py-4" key={it?.name}> <li className="flex items-center py-4" key={it?.name}>
<div class="ml-4"> <div className="ml-4">
<div class="text-sm font-medium text-gray-900">{it?.label}</div> <div className="text-sm font-medium text-gray-900">{it?.label}</div>
<div class="text-sm text-gray-500">{data?.[it?.name]}</div> <div className="text-sm text-gray-500 mt-2">{data?.[it?.name]}</div>
</div> </div>
</li> </li>
); );
......
...@@ -77,15 +77,24 @@ export default function Detail({ folder, params }) { ...@@ -77,15 +77,24 @@ export default function Detail({ folder, params }) {
></AddFolder> ></AddFolder>
<Divider orientation="vertical" /> <Divider orientation="vertical" />
<AddCollection <AddCollection
refresh={refreshAsync} refresh={refreshAsync}
parentId={params.slug} parentId={params.slug}
type={"icon"} type={"icon"}
/> />
</div> </div>
<div className="mt-8 flex flex-wrap gap-2"> <div className="mt-8 flex flex-wrap gap-2">
<Cards list={data?.folders ?? []}></Cards> <Cards list={data?.folders ?? []}></Cards>
<Collections list={data?.collections ?? []}></Collections> <Collections list={data?.collections ?? []}></Collections>
{data?.folders?.length === 0 &&data?.collections?.length ===0 && (
<Image
alt="empty"
isZoomed
className="object-cover"
src="/empty.png"
width={240}
/>
)}
</div> </div>
</div> </div>
</div> </div>
......
...@@ -7,8 +7,8 @@ import { Providers } from "./providers"; ...@@ -7,8 +7,8 @@ import { Providers } from "./providers";
// const inter = Inter({ subsets: ["latin"] }); // const inter = Inter({ subsets: ["latin"] });
export const metadata = { export const metadata = {
title: "Create Next App", title: "语言模型训练数据库",
description: "Generated by create next app", description: "语言模型训练数据库",
}; };
export default function RootLayout({ children }) { export default function RootLayout({ children }) {
......
...@@ -5,10 +5,9 @@ import AddFolder from "@/components/AddFolder"; ...@@ -5,10 +5,9 @@ import AddFolder from "@/components/AddFolder";
import AddCollection from "@/components/AddCollection"; import AddCollection from "@/components/AddCollection";
import Cards from "@/components/Cards"; import Cards from "@/components/Cards";
import Collections from "@/components/Collections"; import Collections from "@/components/Collections";
import { useRequest } from "ahooks"; import { useRequest } from "ahooks";
import { getFetch } from "@/lib/doFetch"; import { getFetch } from "@/lib/doFetch";
import { Image } from "@nextui-org/react";
export default function Home(props) { export default function Home(props) {
const { data, refreshAsync, refresh } = useRequest(async () => { const { data, refreshAsync, refresh } = useRequest(async () => {
...@@ -29,6 +28,15 @@ export default function Home(props) { ...@@ -29,6 +28,15 @@ export default function Home(props) {
<div className="flex gap-4"> <div className="flex gap-4">
<Cards list={data ?? []} /> <Cards list={data ?? []} />
<Collections list={collection?.data ?? []} /> <Collections list={collection?.data ?? []} />
{data?.length === 0 &&collection?.data?.length ===0 && (
<Image
alt="empty"
isZoomed
className="object-cover"
src="/empty.png"
width={240}
/>
)}
</div> </div>
</div> </div>
); );
......
...@@ -23,15 +23,15 @@ export default function AddCollection({ refresh, parentId, type }) { ...@@ -23,15 +23,15 @@ export default function AddCollection({ refresh, parentId, type }) {
const handleButtonClick = async (close) => { const handleButtonClick = async (close) => {
// 手动触发表单提交 // 手动触发表单提交
handleSubmit(onSubmit)(); handleSubmit(onSubmit)();
await refresh();
close(); close();
}; };
const onSubmit = async (data) => { const onSubmit = async (data) => {
return await doFetch({ await doFetch({
url: "/api/collection", url: "/api/collection",
params: { ...data, parentId:parentId ?parseInt(parentId): null }, params: { ...data, parentId: parentId ? parseInt(parentId) : null },
}); });
await refresh();
}; };
return ( return (
...@@ -100,58 +100,46 @@ export default function AddCollection({ refresh, parentId, type }) { ...@@ -100,58 +100,46 @@ export default function AddCollection({ refresh, parentId, type }) {
type="text" type="text"
label="编码" label="编码"
name="code" name="code"
{...register("code", { required: true, maxLength: 20 })} {...register("code")}
/> />
<Input <Input
type="text" type="text"
label="故障类型" label="故障类型"
name="faultType" name="faultType"
{...register("faultType", { {...register("faultType")}
required: true,
maxLength: 20,
})}
/> />
<Input <Input
type="text" type="text"
label="故障" label="故障"
name="fault" name="fault"
{...register("fault", { required: true, maxLength: 20 })} {...register("fault")}
/> />
<Textarea <Textarea
type="text" type="text"
label="判断条件" label="判断条件"
name="faultJudge" name="faultJudge"
{...register("faultJudge", { {...register("faultJudge")}
required: true,
maxLength: 20,
})}
/> />
<Textarea <Textarea
type="text" type="text"
label="故障原因" label="故障原因"
name="faultReason" name="faultReason"
{...register("faultReason", { {...register("faultReason")}
required: true,
maxLength: 20,
})}
/> />
<Textarea <Textarea
type="text" type="text"
label="解决方案" label="解决方案"
name="faultFn" name="faultFn"
{...register("faultFn", { required: true, maxLength: 20 })} {...register("faultFn")}
/> />
<Textarea <Textarea
type="text" type="text"
label="故障描述" label="故障描述"
name="faultMessage" name="faultMessage"
{...register("faultMessage", { {...register("faultMessage")}
required: true,
maxLength: 20,
})}
/> />
</form> </form>
</ModalBody> </ModalBody>
......
...@@ -12,6 +12,7 @@ export default memo(({ list }) => { ...@@ -12,6 +12,7 @@ export default memo(({ list }) => {
const router = useRouter(); const router = useRouter();
return ( return (
list?.length>0&&
<div className="gap-2 flex flex-wrap"> <div className="gap-2 flex flex-wrap">
{list?.map?.((item, index) => ( {list?.map?.((item, index) => (
<Card <Card
...@@ -41,15 +42,6 @@ export default memo(({ list }) => { ...@@ -41,15 +42,6 @@ export default memo(({ list }) => {
</CardFooter> </CardFooter>
</Card> </Card>
))} ))}
{list?.length === 0 && (
<Image
alt="empty"
isZoomed
className="object-cover"
src="/empty.png"
width={240}
/>
)}
</div> </div>
); );
}); });
import React, { useEffect } from "react"; import React from "react";
import { import {
Modal, Modal,
ModalContent, ModalContent,
...@@ -7,24 +7,20 @@ import { ...@@ -7,24 +7,20 @@ import {
ModalFooter, ModalFooter,
Button, Button,
useDisclosure, useDisclosure,
Input,
} from "@nextui-org/react"; } from "@nextui-org/react";
import { useForm, Controller } from "react-hook-form"; import { delFetch } from "@/lib/doFetch";
import { delFetch, doFetch, putFetch } from "@/lib/doFetch";
import UploadImage from "./UploadImage";
import { BsTrash3Fill } from "react-icons/bs"; import { BsTrash3Fill } from "react-icons/bs";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
export default function DeleteFolder({ refresh, data }) { export default function DeleteCollection({ refresh, data }) {
const { isOpen, onOpen, onOpenChange } = useDisclosure(); const { isOpen, onOpen, onOpenChange } = useDisclosure();
const router = useRouter(); const router = useRouter();
const handleButtonClick = async (close) => { const handleButtonClick = async (close) => {
await delFetch({url:"/api/folder/"+data.id}) await delFetch({ url: "/api/collection/" + data.id });
router.back(); // 返回上一页 router.back(); // 返回上一页
}; };
return ( return (
<> <>
<Button isIconOnly color="danger" aria-label="Like" onPress={onOpen}> <Button isIconOnly color="danger" aria-label="Like" onPress={onOpen}>
...@@ -59,13 +55,10 @@ export default function DeleteFolder({ refresh, data }) { ...@@ -59,13 +55,10 @@ export default function DeleteFolder({ refresh, data }) {
{(onClose) => ( {(onClose) => (
<> <>
<ModalHeader className="flex flex-col gap-1"> <ModalHeader className="flex flex-col gap-1">
是否删除该文件夹 是否删除该知识库
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<p> <p>删除后无法恢复请谨慎操作</p>
仅可删除空文件夹
</p>
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="danger" variant="light" onPress={onClose}> <Button color="danger" variant="light" onPress={onClose}>
......
This diff is collapsed.
...@@ -20,7 +20,13 @@ export default function EditFolder({ refresh, data }) { ...@@ -20,7 +20,13 @@ export default function EditFolder({ refresh, data }) {
const { isOpen, onOpen, onOpenChange } = useDisclosure(); const { isOpen, onOpen, onOpenChange } = useDisclosure();
const router = useRouter(); const router = useRouter();
const { register, handleSubmit, control, setValue, formState: { errors }, } = useForm({ const {
register,
handleSubmit,
control,
setValue,
formState: { errors },
} = useForm({
defaultValues: { defaultValues: {
poster: data?.poster, poster: data?.poster,
name: data?.name, name: data?.name,
...@@ -28,7 +34,7 @@ export default function EditFolder({ refresh, data }) { ...@@ -28,7 +34,7 @@ export default function EditFolder({ refresh, data }) {
}); });
useEffect(() => { useEffect(() => {
if (data&&isOpen===true) { if (data && isOpen === true) {
setValue("poster", data.poster); setValue("poster", data.poster);
setValue("name", data.name); setValue("name", data.name);
console.log(data.name); console.log(data.name);
...@@ -42,7 +48,7 @@ export default function EditFolder({ refresh, data }) { ...@@ -42,7 +48,7 @@ export default function EditFolder({ refresh, data }) {
}; };
const onSubmit = async (params) => { const onSubmit = async (params) => {
await putFetch({ url: "/api/folder/"+ data?.id, params }); await putFetch({ url: "/api/folder/" + data?.id, params });
await refresh(); await refresh();
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment