Skip to content

Commit

Permalink
refactor: 重构表关系,优化业务逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
besscroft committed Apr 30, 2024
1 parent 5daef15 commit 3c6b6f9
Show file tree
Hide file tree
Showing 25 changed files with 548 additions and 359 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 数据库 url
DATABASE_URL="db.picimpact.supabase.co"
DATABASE_URL="postgres://postgres:666666@localhost:5432/postgres"
# AUTH_SECRET npx auth secret
AUTH_SECRET=your-secret-key
59 changes: 8 additions & 51 deletions app/admin/settings/backup/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { toast } from 'sonner'
import dayjs from 'dayjs'

export default function Backup() {
const [restoreKameraLoading, setRestoreKameraLoading] = useState(false)
const [restorePicImpactLoading, setRestorePicImpactLoading] = useState(false)
const [backupLoading, setBackupLoading] = useState(false)

Expand Down Expand Up @@ -51,36 +50,16 @@ export default function Backup() {
},
body: JSON.stringify(data),
}).then(res => res.json())
toast.success(`还原 ${res.count} 条数据!`)
if (res?.code === 200) {
toast.success(res.message)
} else {
toast.error(res.message)
}
} catch (e) {
toast.error('还原失败!')
}
}

function readKameraJSONFile(file: File) {
try {
let reader = new FileReader();
reader.readAsText(file);

reader.onload = async () => {
if (typeof reader.result === 'string') {
const data = JSON.parse(reader.result)
.map((obj: any) => {
obj.tag = `/${obj.type}`
obj.show = 1
return obj;
})
.map(({ id, del, ...obj }: any) => obj)
.map(({ type, ...obj }: any) => obj)
toast.success('备份文件解析成功,开始还原至数据库!')
await restore(data)
}
};
} catch (error) {
toast.error('备份文件解析失败!')
}
}

async function readPicImpactJSONFile(file: File) {
try {
let reader = new FileReader();
Expand All @@ -103,24 +82,6 @@ export default function Backup() {
}
}

async function onKameraRequestUpload(option: any) {
setRestoreKameraLoading(true)
try {
readKameraJSONFile(option.file)
} finally {
setRestoreKameraLoading(false)
}
option.onSuccess(option.file)
}

const kameraProps: UploadProps = {
name: 'file',
maxCount: 1,
multiple: false,
showUploadList: false,
customRequest: async (file) => await onKameraRequestUpload(file),
};

async function onPicImpactRequestUpload(option: any) {
setRestorePicImpactLoading(true)
try {
Expand All @@ -132,6 +93,7 @@ export default function Backup() {
}

const picimpactProps: UploadProps = {
className: '!w-full sm:!w-64',
name: 'file',
maxCount: 1,
multiple: false,
Expand All @@ -142,20 +104,15 @@ export default function Backup() {
return (
<Card className="flex-1" shadow="sm">
<CardBody className="space-y-2">
<Upload {...kameraProps}>
<Button
icon={<CloudUploadOutlined />}
loading={restoreKameraLoading}
>选择备份文件(从 Kamera 迁移)</Button>
</Upload>
<Button
className="w-64"
className="!w-full sm:!w-64"
icon={<CloudDownloadOutlined />}
loading={backupLoading}
onClick={() => backup()}
>备份</Button>
<Upload {...picimpactProps}>
<Button
className="!w-full sm:!w-64 !block"
icon={<CloudUploadOutlined />}
loading={restorePicImpactLoading}
>选择备份文件(本机迁移)</Button>
Expand Down
4 changes: 2 additions & 2 deletions app/api/v1/get-tags/route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'server-only'
import { fetchTags } from '~/server/lib/query'
import { fetchTagsList } from '~/server/lib/query'

export async function GET() {
const data = await fetchTags();
const data = await fetchTagsList();
return Response.json(data)
}
8 changes: 6 additions & 2 deletions app/api/v1/image-add/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { NextRequest } from 'next/server'

export async function POST(req: NextRequest) {
const image = await req.json()
const data = await insertImage(image);
return Response.json(data)
try {
await insertImage(image);
return Response.json({ code: 200, msg: '保存成功!' })
} catch (e) {
return Response.json({ code: 500, msg: '保存失败!' })
}
}
8 changes: 6 additions & 2 deletions app/api/v1/image-delete/[id]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ export async function DELETE(
req: NextRequest,
{ params }: { params: { id: number } },
) {
const data = await deleteImage(params.id);
return Response.json(data)
try {
const data = await deleteImage(params.id);
return Response.json({ code: 200, msg: '删除成功!' })
} catch (e) {
return Response.json({ code: 500, msg: '删除失败!' })
}
}
8 changes: 6 additions & 2 deletions app/api/v1/restore-images-json/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { NextRequest } from 'next/server'

export async function POST(req: NextRequest) {
const json = await req.json()
const data = await insertImages(json);
return Response.json(data)
try {
await insertImages(json);
return Response.json({ code: 200, message: '还原成功!' })
} catch (e) {
return Response.json({ code: 500, message: '还原失败!' })
}
}
8 changes: 6 additions & 2 deletions app/api/v1/tag-update/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { NextRequest } from 'next/server'

export async function PUT(req: NextRequest) {
const tag = await req.json()
const data = await updateTag(tag);
return Response.json(data)
try {
const data = await updateTag(tag);
return Response.json({ code: 200, message: '更新成功!' })
} catch (e) {
return Response.json({ code: 500, message: '更新失败!' })
}
}
8 changes: 5 additions & 3 deletions components/admin/dashboard/TagTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ export default function TagTable(props: Readonly<HandleProps>) {

const { data } = useSWRHydrated(props)

console.log(data)

return (
<>
<Card isBlurred shadow="sm" className="h-48">
Expand All @@ -25,9 +27,9 @@ export default function TagTable(props: Readonly<HandleProps>) {
</TableHeader>
<TableBody emptyContent={"No rows to display."}>
{data?.result && data?.result.map((item: any) => (
<TableRow key={item?.tag}>
<TableCell>{item?.tag}</TableCell>
<TableCell>{item?._count.tag}</TableCell>
<TableRow key={item?.tag_value}>
<TableCell>{item?.name}</TableCell>
<TableCell>{Number(item?.total)}</TableCell>
</TableRow>
))
}
Expand Down
1 change: 1 addition & 0 deletions components/admin/list/ImageEditSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export default function ImageEditSheet(props : Readonly<ImageServerHandleProps &
setImageEditData({} as ImageType)
}
}}
modal={false}
>
<SheetContent side="left">
<SheetHeader>
Expand Down
50 changes: 34 additions & 16 deletions components/admin/list/ListProps.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import {
Select,
SelectItem,
Image,
Switch
Switch,
Badge
} from '@nextui-org/react'
import { ArrowDown10, Pencil, Trash, Eye, EyeOff, ScanSearch } from 'lucide-react'
import { toast } from 'sonner'
Expand All @@ -38,7 +39,7 @@ export default function ListProps(props : Readonly<ImageServerHandleProps>) {
const [pageNum, setPageNum] = useState(1)
const [tagArray, setTagArray] = useState(new Set([] as string[]))
const [tag, setTag] = useState('')
const { data, isLoading, error, mutate } = useSWRInfiniteServerHook(props, pageNum, tag)
const { data, isLoading, mutate } = useSWRInfiniteServerHook(props, pageNum, tag)
const { data: total, mutate: totalMutate } = useSWRPageTotalServerHook(props, tag)
const [isOpen, setIsOpen] = useState(false)
const [image, setImage] = useState({} as ImageType)
Expand All @@ -55,8 +56,8 @@ export default function ListProps(props : Readonly<ImageServerHandleProps>) {
try {
const res = await fetch(`/api/v1/image-delete/${image.id}`, {
method: 'DELETE',
})
if (res.status === 200) {
}).then(res => res.json())
if (res?.code === 200) {
toast.success('删除成功!')
setIsOpen(false)
await mutate()
Expand Down Expand Up @@ -148,7 +149,7 @@ export default function ListProps(props : Readonly<ImageServerHandleProps>) {
</CardHeader>
</Card>
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
{data && data.map((image: ImageType) => (
{Array.isArray(data) && data?.map((image: ImageType) => (
<motion.div
key={image.id}
initial={{ opacity: 0, scale: 0.5 }}
Expand All @@ -161,17 +162,34 @@ export default function ListProps(props : Readonly<ImageServerHandleProps>) {
>
<Card shadow="sm" className="h-72">
<CardHeader className="justify-between space-x-1 select-none">
<Popover placement="top" shadow="sm">
<PopoverTrigger className="cursor-pointer">
<Chip variant="shadow" className="flex-1">{image.tag}</Chip>
</PopoverTrigger>
<PopoverContent>
<div className="px-1 py-2 select-none">
<div className="text-small font-bold">标签</div>
<div className="text-tiny">图片标签,在对应的路由上显示</div>
</div>
</PopoverContent>
</Popover>
{
image.tag_values.includes(',') ?
<Badge content={image.tag_values.split(",").length} color="primary">
<Popover placement="top" shadow="sm">
<PopoverTrigger className="cursor-pointer">
<Chip variant="shadow" className="flex-1">{image.tag_names.length > 8 ? image.tag_names.substring(0, 8) + '...' : image.tag_names}</Chip>
</PopoverTrigger>
<PopoverContent>
<div className="px-1 py-2 select-none">
<div className="text-small font-bold">标签</div>
<div className="text-tiny">图片标签,在对应的路由上显示</div>
</div>
</PopoverContent>
</Popover>
</Badge>
:
<Popover placement="top" shadow="sm">
<PopoverTrigger className="cursor-pointer">
<Chip variant="shadow" className="flex-1">{image.tag_names}</Chip>
</PopoverTrigger>
<PopoverContent>
<div className="px-1 py-2 select-none">
<div className="text-small font-bold">标签</div>
<div className="text-tiny">图片标签,在对应的路由上显示</div>
</div>
</PopoverContent>
</Popover>
}
<div className="flex items-center">
<Button
isIconOnly
Expand Down
1 change: 1 addition & 0 deletions components/admin/settings/storages/AListEditSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export default function AListEditSheet() {
setAListEditData([] as Config[])
}
}}
modal={false}
>
<SheetContent side="left">
<SheetHeader>
Expand Down
1 change: 1 addition & 0 deletions components/admin/settings/storages/S3EditSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export default function S3EditSheet() {
setS3EditData([] as Config[])
}
}}
modal={false}
>
<SheetContent side="left">
<SheetHeader>
Expand Down
1 change: 1 addition & 0 deletions components/admin/tag/TagAddSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export default function TagAddSheet(props : Readonly<HandleProps>) {
defaultOpen={false}
open={tagAdd}
onOpenChange={() => setTagAdd(!tagAdd)}
modal={false}
>
<SheetContent side="left">
<SheetHeader>
Expand Down
13 changes: 9 additions & 4 deletions components/admin/tag/TagEditSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,14 @@ export default function TagEditSheet(props : Readonly<HandleProps>) {
body: JSON.stringify(tag),
method: 'PUT',
}).then(response => response.json())
toast.success('更新成功!')
setTagEditData({} as TagType)
setTagEdit(false)
await mutate()
if (res.code === 200) {
toast.success('更新成功!')
setTagEditData({} as TagType)
setTagEdit(false)
await mutate()
} else {
toast.error('更新失败!')
}
} catch (e) {
toast.error('更新失败!')
} finally {
Expand All @@ -50,6 +54,7 @@ export default function TagEditSheet(props : Readonly<HandleProps>) {
setTagEditData({} as TagType)
}
}}
modal={false}
>
<SheetContent side="left">
<SheetHeader>
Expand Down
6 changes: 3 additions & 3 deletions components/admin/upload/FileUpload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default function FileUpload() {
const [height, setHeight] = useState(0)
const [detail, setDetail] = useState('')

const { data, error, isLoading } = useSWR('/api/v1/get-tags', fetcher)
const { data, isLoading } = useSWR('/api/v1/get-tags', fetcher)

async function loadExif(file: any) {
try {
Expand Down Expand Up @@ -109,8 +109,8 @@ export default function FileUpload() {
method: 'post',
// @ts-ignore
body: JSON.stringify(data),
})
if (res.status === 200) {
}).then(res => res.json())
if (res?.code === 200) {
toast.success('保存成功!')
} else {
toast.error('保存失败!')
Expand Down
Loading

0 comments on commit 3c6b6f9

Please sign in to comment.