实现resource界面

This commit is contained in:
2025-05-12 21:50:53 +08:00
parent 30224774e6
commit 53665f8847
5 changed files with 38 additions and 27 deletions

View File

@@ -2,35 +2,38 @@ import { ResourceBadge } from "@/components/resource";
import { Card, CardContent } from "@/components/ui/card";
import { Resource } from "@/lib/types/resource";
import Image from "next/image";
import React from "react";
interface ResourceCardProps {
resource: Resource;
key: string;
interface ResourceCardProps extends React.HTMLProps<HTMLAnchorElement> {
r: Resource;
}
export function ResourceCard({ resource, key }: ResourceCardProps) {
export function ResourceCard({ r, ...props }: ResourceCardProps) {
const [imageError, setImageError] = React.useState(false);
return (
<a href={resource.link} target="_blank" key={key}>
<a href={r.link} target="_blank" {...props}>
<Card className="w-full md:w-92 lg:w-100 md:rounded-xl rounded-none duration-300">
<CardContent>
<div className="flex gap-6">
<div>
<Image
src={resource.imageUrl}
{!imageError && <Image
src={r.imageUrl}
alt="资源图片"
width={90}
height={90}
className="rounded-md shadow"
priority
quality={100}
/>
onError={() => setImageError(true)}
/>}
</div>
<div className="flex-1 overflow-x-hidden">
<div className="font-bold text-2xl">{resource.title}</div>
<div className="font-medium text-sm text-zinc-400 mt-1">{resource.description}</div>
<div className="font-bold text-2xl">{r.title}</div>
<div className="font-medium text-sm text-zinc-400 mt-1">{r.description}</div>
<div className="flex gap-2 flex-wrap mt-4">
{
resource.tags.map((tag) => (
r.tags.map((tag) => (
<ResourceBadge tag={tag} />
))
}

View File

@@ -1,6 +1,15 @@
"use client";
import useSWR from "swr";
import { ResourceCard } from "./components/ResourceCard";
import { ResourceApi } from "@/lib/api";
export default function Resources() {
const { data, isLoading, error } = useSWR(
'/api/resource',
() => ResourceApi.list(),
);
return (
<div className="flex-1 flex flex-col items-center">
<h1 className="mt-6 md:mt-20 text-2xl md:text-5xl font-medium text-zinc-600 text-center duration-300"></h1>
@@ -9,21 +18,12 @@ export default function Resources() {
使</p>
<div className="mt-6 sm:mt-10 md:mt-15 w-full flex flex-col md:w-auto md:mx-auto md:grid grid-cols-2 2xl:gap-x-35 lg:gap-x-20 gap-x-10 lg:gap-y-10 gap-y-5 sm:mb-10 duration-300">
{data && data.map((resource) => (
<ResourceCard
key="1"
resource={{
id: Math.random().toString(),
title: "Adobe全家桶",
description: "包含了macOS、Windows操作系统的Adobe全系列软件",
imageUrl: "",
link: "https://bing.com",
tags: [
{ id: "1", name: "第三方来源", color: "" },
{ id: "2", name: "macOS", color: "#dbedfd" },
{ id: "3", name: "Windows", color: "#dbedfd" },
],
}}
key={resource.id}
r={resource}
/>
))}
</div>
</div>
)

View File

@@ -1,3 +1,4 @@
export * as authApi from './auth/index';
export * as verificationApi from './verification/index';
export * as AdminApi from './admin/index';
export * as ResourceApi from './resource/index';

View File

@@ -0,0 +1 @@
export * from './list';

View File

@@ -0,0 +1,6 @@
import { Resource } from "@/lib/types/resource";
import fetcher from "../fetcher";
export async function list() {
return fetcher<Resource[]>('/api/resource');
}