完成了网站的广告和详请展示
This commit is contained in:
parent
a5637efccb
commit
f532a992e1
|
@ -0,0 +1,5 @@
|
|||
MONGODB_URI=mongodb://expdsn:58662@expdsn.cloud:27017
|
||||
# MONGODB_URI=mongodb://expdsn:58662@localhost:27017
|
||||
SESSION_SECRET=lREDRcaFwZIzM7Rjw63XGj8trTyMqhVUsVwwhuTQnFs=
|
||||
ALIYUN_RAM_ACCESS_KEY_ID=LTAI5tNzopZHJFa2Q9vqr1u5
|
||||
ALIYUN_RAM_ACCESS_KEY_SECRET=qPu7fyft0KJ1l6SGqbS71IW0vDbRlr
|
|
@ -31,7 +31,7 @@ yarn-error.log*
|
|||
.pnpm-debug.log*
|
||||
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
.env
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
import { getArticle } from "@/app/_lib/data/article"
|
||||
import MarkdownView from "@/app/_ui/MarkdownView"
|
||||
import { faArrowRight } from "@fortawesome/free-solid-svg-icons"
|
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
|
||||
import { MdEditor } from "md-editor-rt"
|
||||
import Link from "next/link"
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
|
||||
const id = (await params).id
|
||||
const article = await getArticle(id)
|
||||
if (!article) return <></>
|
||||
return <div className="w-full h-full min-h-[100vh] flex justify-center">
|
||||
<div className="w-full max-w-[800px] px-4 h-full pb-[50px] pt-[100px] ">
|
||||
<div className="w-full h-full ">
|
||||
<div className="flex gap-x-5">
|
||||
<div className="p-4 rounded-lg">
|
||||
<img src={article?.cover} className=" rounded-lg shadow object-cover w-[200px] h-[200px]">
|
||||
</img>
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-3 py-5">
|
||||
<h1 className="text-2xl">{article.title}</h1>
|
||||
<article className=" line-clamp-3 overflow-hidden text-ellipsis">{article.description}</article>
|
||||
<Link href={article.link} className="px-3 py-2 duration-150 bg-red-500 hover:bg-red-500/80 flex items-center justify-center rounded-lg text-white">
|
||||
访问官网
|
||||
<FontAwesomeIcon icon={faArrowRight} className="ml-2" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
<div className="w-full">
|
||||
<MarkdownView value={article.content}></MarkdownView>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import SiderNav from "../_ui/SiderNav";
|
||||
import { getLinkTypeList } from "../_lib/data/linkType";
|
||||
|
||||
export default async function Layout({ children }: Readonly<{ children: React.ReactNode }>) {
|
||||
|
||||
const { list: linkTypeList } = await getLinkTypeList({})
|
||||
|
||||
|
||||
return (
|
||||
<div className="pl-[220px] flex min-h-full w-full font-[family-name:var(--font-geist-sans)] relative">
|
||||
<SiderNav linkList={linkTypeList} />
|
||||
<div className="w-0 flex-1 relative">
|
||||
<div className="absolute z-[-10] from-[#E6EEF4] h-[50vh] w-full bg-gradient-to-br via-[#F1ECF4] to-[#F5ECEA]">
|
||||
|
||||
<div className="absolute z-[-9] from-[#F9F9F9] left-0 to-transparent bg-gradient-to-t w-full h-[80px] bottom-[0px]">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{children}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
import SiderNav from "../_ui/SiderNav";
|
||||
import Search from "../_ui/Search";
|
||||
import LinkListBox from "../_ui/LinkListBox";
|
||||
import { getLinkTypeList } from "../_lib/data/linkType";
|
||||
import { getLinkListAll } from "../_lib/data/link";
|
||||
import Footer from "../_ui/footer";
|
||||
|
||||
export default async function Page() {
|
||||
|
||||
const { list: linkTypeList } = await getLinkTypeList({})
|
||||
|
||||
const linkList = await getLinkListAll()
|
||||
|
||||
return (
|
||||
<div className="flex min-h-full w-full font-[family-name:var(--font-geist-sans)] relative">
|
||||
<SiderNav linkList={linkTypeList} />
|
||||
<div className="w-full">
|
||||
|
||||
<main className="flex-1 relative flex flex-col p-5 gap-y-4">
|
||||
|
||||
{/* <HeaderNav></HeaderNav> */}
|
||||
<Search></Search>
|
||||
{/* <PosterBox posterList={[]} /> */}
|
||||
<LinkListBox linkList={linkList} linkTypeList={linkTypeList} showHot showRecent></LinkListBox>
|
||||
</main>
|
||||
<Footer></Footer>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -10,11 +10,66 @@ export type Link = {
|
|||
_id: string;
|
||||
type: string;
|
||||
priority: number;
|
||||
articleId?: string;
|
||||
logoLink: string;
|
||||
isHot?: boolean;
|
||||
addTime: number;
|
||||
|
||||
}
|
||||
|
||||
export async function getLinkListAll() {
|
||||
const linkCollection = await getCollection('link');
|
||||
|
||||
const list = await linkCollection.aggregate<Link>([
|
||||
{
|
||||
'$addFields': {
|
||||
'cleanedLink': {
|
||||
'$substrBytes': [
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
{
|
||||
'$split': [
|
||||
'$link', '?'
|
||||
]
|
||||
}, 0
|
||||
]
|
||||
}, 0, 1000
|
||||
]
|
||||
}
|
||||
}
|
||||
}, {
|
||||
'$lookup': {
|
||||
'from': 'article',
|
||||
'localField': 'link',
|
||||
'foreignField': 'link',
|
||||
'as': 'article'
|
||||
}
|
||||
}, {
|
||||
'$addFields': {
|
||||
'articleId': {
|
||||
'$toString':
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
'$article._id', 0
|
||||
]
|
||||
}
|
||||
},
|
||||
'_id': {
|
||||
'$toString': "$_id"
|
||||
}
|
||||
|
||||
}
|
||||
}, {
|
||||
'$project': {
|
||||
'article': 0
|
||||
}
|
||||
}
|
||||
]).toArray();
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
// Link 类型定义
|
||||
export async function getLinkList({ page = 1, pageSize = 9999, typeId }: {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
|
|
|
@ -3,6 +3,7 @@ import { MongoClient, Db } from 'mongodb';
|
|||
|
||||
|
||||
const uri = process.env.MONGODB_URI;
|
||||
const options = {};
|
||||
let client: MongoClient;
|
||||
let clientPromise: Promise<MongoClient>;
|
||||
|
||||
|
@ -11,33 +12,21 @@ if (!uri) {
|
|||
}
|
||||
|
||||
|
||||
// client = new MongoClient(uri,{
|
||||
// maxPoolSize: 5,
|
||||
// maxConnecting:5,
|
||||
// maxIdleTimeMS: 3000,
|
||||
// waitQueueTimeoutMS: 1000
|
||||
// });
|
||||
// clientPromise = client.connect();
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
if (!(global as any)._mongoClientPromise) {
|
||||
client = new MongoClient(uri, options);
|
||||
(global as any)._mongoClientPromise = client.connect();
|
||||
}
|
||||
clientPromise = (global as any)._mongoClientPromise;
|
||||
} else {
|
||||
client = new MongoClient(uri, options);
|
||||
clientPromise = client.connect();
|
||||
}
|
||||
|
||||
|
||||
// export const getDb = async () => {
|
||||
// const client = await clientPromise;
|
||||
// return client.db('ai-bot')
|
||||
// };
|
||||
// export const getCollection = async (collection: string) => {
|
||||
// const client = await clientPromise;
|
||||
// return client.db('ai-bot').collection(collection);
|
||||
// };
|
||||
|
||||
const ins = new MongoClient(uri,{
|
||||
maxPoolSize: 5,
|
||||
maxConnecting:5,
|
||||
maxIdleTimeMS: 3000,
|
||||
waitQueueTimeoutMS: 1000
|
||||
}).db('ai-bot')
|
||||
export const getDb = async () => {
|
||||
return ins
|
||||
return (await clientPromise).db('ai-bot');
|
||||
};
|
||||
export const getCollection = async (collection: string) => {
|
||||
const ins = await getDb();
|
||||
return ins.collection(collection);
|
||||
};
|
|
@ -3,11 +3,7 @@ import { v4 as uuid } from "uuid";
|
|||
import { mRequest } from "./request";
|
||||
|
||||
const ossBase = "https://aihlp.com.cn";
|
||||
const accessKeyId = process.env.ALIYUN_RAM_ACCESS_KEY_ID || ''
|
||||
const accessKeySecret = process.env.ALIYUN_RAM_ACCESS_KEY_SECRET || ''
|
||||
console.log('id');
|
||||
|
||||
console.log(accessKeyId);
|
||||
|
||||
export default async function uploadOss(file: File, root: string) {
|
||||
const path = `/admin/${root}/${uuid()}_${file.name}`;
|
||||
|
|
|
@ -9,6 +9,16 @@ import { useAtom } from "jotai";
|
|||
import { linkTypeAtom } from "../_lib/atom";
|
||||
import Image from "next/image";
|
||||
|
||||
const LinkBlock = ({ val }: { val: _Link }) => {
|
||||
return <Link className="flex gap-x-2 bg-white rounded-lg py-4 pl-2 cursor-pointer duration-150 hover:-translate-y-1 shadow-sm"
|
||||
href={val.articleId ? `/article/${val.articleId}` : val.link || ''} target="_blank">
|
||||
<img src={val.logoLink} className="w-[40px] h-[40px]"></img>
|
||||
<div className="flex-1 w-0 flex flex-col justify-between">
|
||||
<span className=" font-bold text-ellipsis overflow-hidden whitespace-nowrap">{val.name}</span>
|
||||
<span className=" text-ellipsis overflow-hidden whitespace-nowrap text-[#666] text-xs" title={val.description}>{val.description}</span>
|
||||
</div>
|
||||
</Link>
|
||||
}
|
||||
export default function LinkListBox({ linkTypeList, linkList, showHot, showRecent }: { linkTypeList: LinkType[]; linkList: _Link[]; showHot: boolean; showRecent: boolean }) {
|
||||
const hotList = useMemo(() => linkList.filter((val, index) => val.isHot && index < 12), [])
|
||||
const recentList = useMemo(() => linkList.map(val => val).sort((a, b) => b.addTime - a.addTime).filter((_, idx) => idx < 12), [])
|
||||
|
@ -35,14 +45,7 @@ export default function LinkListBox({ linkTypeList, linkList, showHot, showRecen
|
|||
<div className=" grid grid-cols-3 lg:grid-cols-6 gap-4 ">
|
||||
{
|
||||
hotList.map(val => (
|
||||
<Link key={val._id} className="flex gap-x-2 bg-white rounded-lg py-4 pl-2 cursor-pointer duration-150 hover:-translate-y-1 shadow-sm"
|
||||
href={val.link || ''} target="_blank">
|
||||
<img src={val.logoLink} className="w-[40px] h-[40px]"></img>
|
||||
<div className="flex-1 w-0 flex flex-col justify-between">
|
||||
<span className=" font-bold text-ellipsis overflow-hidden whitespace-nowrap">{val.name}</span>
|
||||
<span className=" text-ellipsis overflow-hidden whitespace-nowrap text-[#666] text-xs" title={val.description}>{val.description}</span>
|
||||
</div>
|
||||
</Link>
|
||||
<LinkBlock val={val} key={val._id} />
|
||||
))
|
||||
}
|
||||
</div>
|
||||
|
@ -58,14 +61,8 @@ export default function LinkListBox({ linkTypeList, linkList, showHot, showRecen
|
|||
<div className=" grid grid-cols-3 lg:grid-cols-6 gap-4 ">
|
||||
{
|
||||
recentList.map(val => (
|
||||
<Link key={val._id} className="flex gap-x-2 bg-white rounded-lg py-4 pl-2 cursor-pointer duration-150 hover:-translate-y-1 shadow-sm"
|
||||
href={val.link || ''} target="_blank">
|
||||
<img src={val.logoLink} className="w-[40px] h-[40px]"></img>
|
||||
<div className="flex-1 w-0 flex flex-col justify-between">
|
||||
<span className=" font-bold text-ellipsis overflow-hidden whitespace-nowrap">{val.name}</span>
|
||||
<span className=" text-ellipsis overflow-hidden whitespace-nowrap text-[#666] text-xs" title={val.description}>{val.description}</span>
|
||||
</div>
|
||||
</Link>
|
||||
<LinkBlock val={val} key={val._id} />
|
||||
|
||||
))
|
||||
}
|
||||
</div>
|
||||
|
@ -82,14 +79,8 @@ export default function LinkListBox({ linkTypeList, linkList, showHot, showRecen
|
|||
<div className=" grid grid-cols-3 lg:grid-cols-6 gap-4 ">
|
||||
{
|
||||
linkList.filter(val => val.type === item._id).map(val => (
|
||||
<Link key={val._id} className="flex gap-x-2 bg-white rounded-lg py-4 pl-2 cursor-pointer duration-150 hover:-translate-y-1 shadow-sm"
|
||||
href={val.link || ''} target="_blank">
|
||||
<img src={val.logoLink} className="w-[40px] h-[40px]"></img>
|
||||
<div className="flex-1 w-0 flex flex-col justify-between">
|
||||
<span className=" font-bold text-ellipsis overflow-hidden whitespace-nowrap">{val.name}</span>
|
||||
<span className=" text-ellipsis overflow-hidden whitespace-nowrap text-[#666] text-xs" title={val.description}>{val.description}</span>
|
||||
</div>
|
||||
</Link>
|
||||
<LinkBlock val={val} key={val._id} />
|
||||
|
||||
))
|
||||
}
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
"use client";
|
||||
import { MdPreview, MdCatalog } from 'md-editor-rt';
|
||||
|
||||
export default function MarkdownView({ value = '' }: { value?: string }) {
|
||||
return (
|
||||
<MdPreview id='markdown-view' value={value} />
|
||||
)
|
||||
}
|
|
@ -20,8 +20,8 @@ import {
|
|||
Table,
|
||||
} from "antd"
|
||||
import dayjs from "dayjs"
|
||||
import { useCallback, useEffect, useState } from "react"
|
||||
import useSWR from "swr"
|
||||
import { useState } from "react"
|
||||
|
||||
|
||||
|
||||
export default function LinkTable(props: { id: string }) {
|
||||
|
|
|
@ -4,7 +4,7 @@ import { ArticleType } from '@/app/_lib/data/article';
|
|||
import ImageUpload from '@/app/_ui/ImageUpload';
|
||||
import { faArrowLeft, faRibbon } from '@fortawesome/free-solid-svg-icons';
|
||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||
import { BackTop, Button, Card, Col, DatePicker, Form, Grid, Input, InputNumber, message, Row, Space, Upload } from 'antd';
|
||||
import { BackTop, Button, Card, Col, DatePicker, Form, Grid, Input, InputNumber, message, Row, Select, Space, Upload } from 'antd';
|
||||
import dynamic from 'next/dynamic';
|
||||
import { useParams, useRouter } from 'next/navigation'
|
||||
|
||||
|
@ -48,13 +48,16 @@ export default function AddOrEdit({ editData }: { editData?: ArticleType | null
|
|||
} else {
|
||||
await mRequest("POST", "/api/article", {
|
||||
...res,
|
||||
addTime: dayjs().unix()
|
||||
})
|
||||
}
|
||||
router?.push("/admin/dashboard/article")
|
||||
message.success("操作成功")
|
||||
|
||||
}}
|
||||
initialValues={editData ? {
|
||||
...editData,
|
||||
addTime: dayjs(editData.addTime)
|
||||
addTime: dayjs(editData.addTime * 1000)
|
||||
} : {
|
||||
priority: 0,
|
||||
addTime: dayjs()
|
||||
|
@ -66,7 +69,7 @@ export default function AddOrEdit({ editData }: { editData?: ArticleType | null
|
|||
<Form.Item label="标题" name={"title"} rules={[{ required: true, message: '请输入标题' }]}>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item label="副标题" name={"description"}
|
||||
<Form.Item label="介绍" name={"description"}
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
|
@ -108,6 +111,22 @@ export default function AddOrEdit({ editData }: { editData?: ArticleType | null
|
|||
</Col>
|
||||
|
||||
</Row>
|
||||
<Row>
|
||||
<Col span={12}>
|
||||
<Form.Item label="关联网址"
|
||||
name="linkId"
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
message: '请输入副标题'
|
||||
}
|
||||
]}>
|
||||
<Select showSearch>
|
||||
|
||||
</Select>
|
||||
</Form.Item>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row>
|
||||
<Col span={12}>
|
||||
|
||||
|
@ -134,9 +153,7 @@ export default function AddOrEdit({ editData }: { editData?: ArticleType | null
|
|||
|
||||
<Form.Item className="flex justify-end">
|
||||
<Space>
|
||||
<Button>
|
||||
重置
|
||||
</Button>
|
||||
|
||||
<Button type="primary" htmlType="submit">
|
||||
提交
|
||||
</Button>
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
export default function Loading() {
|
||||
return <>
|
||||
|
||||
loading
|
||||
</>
|
||||
}
|
|
@ -2,7 +2,7 @@ import LoginState from "@/app/_ui/LoginState";
|
|||
import SiderNav from "../../_ui/SiderNav";
|
||||
import { faAd, faMagnet, faPenClip, faSearch } from "@fortawesome/free-solid-svg-icons"
|
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
|
||||
|
||||
import { AntdRegistry } from '@ant-design/nextjs-registry';
|
||||
export default function Layout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
|
@ -11,7 +11,7 @@ export default function Layout({
|
|||
|
||||
|
||||
return (
|
||||
<div className="flex flex-col">
|
||||
<div className="flex flex-col pl-[220px]">
|
||||
<SiderNav
|
||||
linkList={[
|
||||
{
|
||||
|
@ -49,8 +49,9 @@ export default function Layout({
|
|||
<LoginState></LoginState>
|
||||
</div>
|
||||
<main className="p-2">
|
||||
|
||||
<AntdRegistry>
|
||||
{children}
|
||||
</AntdRegistry>
|
||||
</main>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -3,7 +3,6 @@ import { getCollection } from "@/app/_lib/mongodb";
|
|||
import { NextRequest } from "next/server";
|
||||
|
||||
export async function GET(request: NextRequest) {
|
||||
|
||||
const page = parseInt(request.nextUrl.searchParams.get('page') || '1') || 1;
|
||||
const pageSize = parseInt(request.nextUrl.searchParams.get('pageSize') || '10') || 10;
|
||||
// 计算起始索引和结束索引
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
@import "tailwindcss";
|
||||
|
||||
:root {
|
||||
--background: #ffffff;
|
||||
--background: #f9f9f9;
|
||||
--foreground: #171717;
|
||||
}
|
||||
|
||||
|
@ -11,6 +11,44 @@
|
|||
--foreground: #ededed;
|
||||
}
|
||||
}
|
||||
@theme {
|
||||
--prose-link-color: #1e90ff;
|
||||
}
|
||||
@layer components {
|
||||
#markdown-view-preview {
|
||||
p {
|
||||
font-size: var(--background);
|
||||
color: var(--color-gray-700);
|
||||
margin: 4px 0;
|
||||
letter-spacing: 1px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
blockquote {
|
||||
border-left: 4px solid #1e90ff;
|
||||
padding-left: 10px;
|
||||
color: #333;
|
||||
|
||||
font-size: 20px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
a {
|
||||
color: var(--color-gray-800);
|
||||
font-weight: 600;
|
||||
padding-bottom: 2px;
|
||||
border-bottom: 1px solid var(--prose-link-color);
|
||||
}
|
||||
a:hover {
|
||||
border-bottom: 2px solid var(--prose-link-color);
|
||||
}
|
||||
ul {
|
||||
margin-left: 30px;
|
||||
list-style: disc;
|
||||
}
|
||||
ul > li {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@layer base {
|
||||
ol {
|
||||
list-style-type: decimal;
|
||||
|
|
|
@ -2,7 +2,6 @@ import type { Metadata } from "next";
|
|||
import "./globals.css";
|
||||
import '@fortawesome/fontawesome-svg-core/styles.css'
|
||||
import '@ant-design/v5-patch-for-react-19';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Create Next App",
|
||||
description: "Generated by create next app",
|
||||
|
@ -14,9 +13,9 @@ export default function RootLayout({
|
|||
children: React.ReactNode;
|
||||
}>) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<html lang="zh-CN">
|
||||
<body
|
||||
className={`pl-[220px] antialiased bg-[#F9F9F9]`}
|
||||
className={`antialiased`}
|
||||
>
|
||||
{children}
|
||||
</body>
|
||||
|
|
36
app/page.tsx
36
app/page.tsx
|
@ -1,36 +0,0 @@
|
|||
import SiderNav from "./_ui/SiderNav";
|
||||
import Search from "./_ui/Search";
|
||||
import LinkListBox from "./_ui/LinkListBox";
|
||||
import { getLinkTypeList } from "./_lib/data/linkType";
|
||||
import { getLinkList } from "./_lib/data/link";
|
||||
import Footer from "./_ui/footer";
|
||||
|
||||
export default async function Home() {
|
||||
|
||||
const { list: linkTypeList } = await getLinkTypeList({})
|
||||
|
||||
const { list: linkList } = await getLinkList({})
|
||||
|
||||
return (
|
||||
<div className="flex min-h-full w-full font-[family-name:var(--font-geist-sans)] relative">
|
||||
<SiderNav linkList={linkTypeList} />
|
||||
<div className="w-full">
|
||||
<div className="absolute -z-10 from-[#E6EEF4] h-[50vh] w-full bg-gradient-to-br via-[#F1ECF4] to-[#F5ECEA]">
|
||||
|
||||
<div className="absolute z-10 from-[#F9F9F9] left-0 to-transparent bg-gradient-to-t w-full h-[100px] bottom-[0px]">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<main className="flex-1 relative flex flex-col p-5 gap-y-4">
|
||||
|
||||
{/* <HeaderNav></HeaderNav> */}
|
||||
<Search></Search>
|
||||
{/* <PosterBox posterList={[]} /> */}
|
||||
<LinkListBox linkList={linkList} linkTypeList={linkTypeList} showHot showRecent></LinkListBox>
|
||||
</main>
|
||||
<Footer></Footer>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -5,11 +5,13 @@
|
|||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"pro-build": "node --max-old-space-size=1024 node_modules/next/dist/bin/next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ant-design/icons": "^5.5.2",
|
||||
"@ant-design/nextjs-registry": "^1.0.2",
|
||||
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.7.2",
|
||||
"@fortawesome/react-fontawesome": "^0.2.2",
|
||||
|
|
1055
pnpm-lock.yaml
1055
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue