重构项目配置,移除过时的项目API,替换为新的配置API,确保代码一致性和可维护性。

This commit is contained in:
神秘人
2025-07-04 12:25:57 +08:00
parent 645ace3119
commit ba3f43ba33
21 changed files with 61 additions and 62 deletions

11
src/api/config.ts Executable file
View File

@@ -0,0 +1,11 @@
import Request from "@/utils/request";
// 获取网站配置
export const getWebConfigDataAPI = <T>(type: string) => Request<T>("GET", `/web_config/list/${type}`)
// 修改网站配置
export const editWebConfigDataAPI = (type: string, data: object) => Request<{ [string: string]: string }>("PATCH", `/web_config/${type}`, { data })
// 获取高德地图配置
export const getGaodeMapConfigDataAPI = () => Request("GET", `/env_config/gaode_map`)

View File

@@ -1,12 +0,0 @@
import Request from "@/utils/request";
import { EnvConfig, EnvConfigName } from "@/types/app/project";
// 获取项目配置
export const getConfigDataAPI = <T>(type: string) => Request<T>("GET", `/config/list/${type}`)
// 修改项目配置
export const editConfigDataAPI = (type: string, data: object) => Request<{ [string: string]: string }>("PATCH", `/config/${type}`, { data })
// 获取环境配置
export const getEnvConfigDataAPI = () => Request("GET", `/env_config/gaode_map`)

View File

@@ -1,18 +1,18 @@
import { Feed } from 'feed';
import { NextResponse } from 'next/server';
import { Web } from '@/types/app/project';
import { Web } from '@/types/app/config';
import { User } from '@/types/app/user';
import { Article } from '@/types/app/article';
import { Record } from '@/types/app/record'
import { getArticlePagingAPI } from '@/api/article'
import { getConfigDataAPI } from '@/api/project'
import { getWebConfigDataAPI } from '@/api/config'
import { getUserDataAPI } from '@/api/user'
import { getRecordPagingAPI } from '@/api/record';
export async function GET() {
const { data: web } = await getConfigDataAPI<Web>("web") || { data: {} as Web }
const { data: web } = await getWebConfigDataAPI<Web>("web") || { data: {} as Web }
const { data: user } = await getUserDataAPI() || { data: {} as User }
const { data: article } = await getArticlePagingAPI({ pagination: { page: 1, size: 8 } }) || { data: {} as Paginate<Article[]> }
const { data: record } = await getRecordPagingAPI({ pagination: { page: 1, size: 8 } }) || { data: {} as Paginate<Record[]> }

View File

@@ -9,8 +9,8 @@ import 'react-photo-view/dist/react-photo-view.css';
import dayjs from 'dayjs'
import Masonry from "react-masonry-css";
import "./page.scss";
import { getEnvConfigDataAPI } from "@/api/project";
import { EnvConfig } from "@/types/app/project";
import { getGaodeMapConfigDataAPI } from "@/api/config";
import { EnvConfig } from "@/types/app/config";
const breakpointColumnsObj = {
default: 4,
@@ -40,7 +40,7 @@ export default function MapContainer() {
// 确保代码仅在客户端执行
import('@amap/amap-jsapi-loader').then(async AMapLoader => {
const { data } = await getEnvConfigDataAPI() || { data: {} }
const { data } = await getGaodeMapConfigDataAPI() || { data: {} }
const { key_code, security_code } = data as { key_code: string, security_code: string }
// @ts-ignore

View File

@@ -1,7 +1,7 @@
import Link from "next/link";
import { Metadata } from "next";
import { getConfigDataAPI } from "@/api/project";
import { getWebConfigDataAPI } from "@/api/config";
import { getWebListAPI, getWebTypeListAPI } from '@/api/web'
import { Web as WebLink, WebType } from "@/types/app/web";
@@ -13,7 +13,7 @@ import CopyableText from "./components/CopyableText";
import { ToastContainer } from "react-toastify";
import { getUserDataAPI } from "@/api/user";
import { User } from "@/types/app/user";
import { Web } from "@/types/app/project";
import { Web } from "@/types/app/config";
export const metadata: Metadata = {
title: "😇 朋友圈",
@@ -22,7 +22,7 @@ export const metadata: Metadata = {
export default async () => {
const { data: user } = await getUserDataAPI() || { data: {} as User }
const { data: web } = await getConfigDataAPI<Web>("web") || { data: {} as Web }
const { data: web } = await getWebConfigDataAPI<Web>("web") || { data: {} as Web }
const { data: linkList } = await getWebListAPI() || { data: [] as WebLink[] }
const { data: typeList } = await getWebTypeListAPI() || { data: [] as WebType[] }

View File

@@ -8,8 +8,8 @@ import Tools from '@/components/Tools';
import Confetti from '@/components/Confetti';
import RouteChangeHandler from '@/components/RouteChangeHandler'
import { getConfigDataAPI } from '@/api/project'
import { Web } from '@/types/app/project';
import { getWebConfigDataAPI } from '@/api/config'
import { Web } from '@/types/app/config';
// 加载样式文件
import "@/styles/index.scss";
@@ -25,7 +25,7 @@ const LXGWWenKai = localFont({
})
export default async function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
const { data } = (await getConfigDataAPI<Web>("web")) || { data: {} as Web };
const { data } = (await getWebConfigDataAPI<Web>("web")) || { data: {} as Web };
// 尊重开源,禁止删除此版权信息!!!
console.log("🚀 欢迎使用 ThriveX 现代化博客管理系统")

View File

@@ -5,7 +5,7 @@ import { useEffect } from "react";
import AOS from 'aos';
import 'aos/dist/aos.css';
import { getEnvConfigDataAPI } from "@/api/project";
import { getGaodeMapConfigDataAPI } from "@/api/config";
export default function MapContainer() {
let map: any;
@@ -15,7 +15,7 @@ export default function MapContainer() {
// 确保代码仅在客户端执行
import('@amap/amap-jsapi-loader').then(async AMapLoader => {
const { data } = await getEnvConfigDataAPI() || { data: {} }
const { data } = await getGaodeMapConfigDataAPI() || { data: {} }
const { key_code, security_code } = data as { key_code: string, security_code: string }
// @ts-ignore

View File

@@ -5,8 +5,8 @@ import Container from "@/components/Container";
import ArticleLayout from "@/components/ArticleLayout";
import Sidebar from "@/components/Sidebar";
import { getConfigDataAPI } from '@/api/project'
import { Theme } from "@/types/app/project";
import { getWebConfigDataAPI } from '@/api/config'
import { Theme } from "@/types/app/config";
interface Props {
searchParams: Promise<{ page: number }>;
@@ -15,7 +15,7 @@ interface Props {
export default async (props: Props) => {
const searchParams = await props.searchParams;
const page = searchParams.page || 1;
const { data } = (await getConfigDataAPI<Theme>("layout")) || { data: {} as Theme }
const { data } = (await getWebConfigDataAPI<Theme>("layout")) || { data: {} as Theme }
return (
<>

View File

@@ -7,8 +7,8 @@ import { dayFormat } from '@/utils'
import Pagination from "@/components/Pagination";
import Empty from "@/components/Empty";
import Show from "@/components/Show";
import { getConfigDataAPI } from "@/api/project";
import { Theme } from "@/types/app/project";
import { getWebConfigDataAPI } from "@/api/config";
import { Theme } from "@/types/app/config";
import Editor from "./components/Editor";
interface Props {
@@ -21,7 +21,7 @@ export default async (props: Props) => {
const { data: user } = (await getUserDataAPI()) || { data: {} as User }
const { data: record } = (await getRecordPagingAPI({ pagination: { page, size: 8 } })) || { data: {} as Paginate<Record[]> }
const { data: theme } = (await getConfigDataAPI<Theme>("layout")) || { data: {} as Theme }
const { data: theme } = (await getWebConfigDataAPI<Theme>("layout")) || { data: {} as Theme }
return (
<>

View File

@@ -9,15 +9,15 @@ import { GoTag } from "react-icons/go";
import Empty from '@/components/Empty';
import Show from '@/components/Show';
import { getConfigDataAPI } from '@/api/project'
import { Theme } from '@/types/app/project';
import { getWebConfigDataAPI } from '@/api/config'
import { Theme } from '@/types/app/config';
interface CardProps {
data: Paginate<Article[]>;
}
const Card = async ({ data }: CardProps) => {
const { data: theme } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: theme } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const covers = JSON.parse(theme.covers || '[]')

View File

@@ -9,15 +9,15 @@ import { GoTag } from "react-icons/go";
import Empty from '@/components/Empty';
import Show from '@/components/Show';
import { getConfigDataAPI } from '@/api/project'
import { Theme } from '@/types/app/project';
import { getWebConfigDataAPI } from '@/api/config'
import { Theme } from '@/types/app/config';
interface ClassicsProps {
data: Paginate<Article[]>;
}
const Classics = async ({ data }: ClassicsProps) => {
const { data: theme } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: theme } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const covers = JSON.parse(theme.covers || '[]')

View File

@@ -6,15 +6,15 @@ import Card from './Card'
import Pagination from "../Pagination"
import { getArticlePagingAPI } from '@/api/article'
import { getConfigDataAPI } from '@/api/project'
import { Theme } from '@/types/app/project'
import { getWebConfigDataAPI } from '@/api/config'
import { Theme } from '@/types/app/config'
import { Article } from '@/types/app/article'
import { Swiper as SwiperType } from '@/types/app/swiper'
import { getSwiperListAPI } from '@/api/swiper'
export default async ({ page }: { page: number }) => {
const { data: swiper } = await getSwiperListAPI() || { data: [] as SwiperType[] }
const { data: theme } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: theme } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const sidebar: string[] = JSON.parse(theme?.right_sidebar || '[]')
// 如果是瀑布流布局就显示28条数据否则显示8条

View File

@@ -1,9 +1,9 @@
import Link from 'next/link';
import Image from 'next/image';
import { getConfigDataAPI } from '@/api/project';
import { getWebConfigDataAPI } from '@/api/config';
import { getUserDataAPI } from '@/api/user';
import { User } from '@/types/app/user';
import { Web } from '@/types/app/project';
import { Web } from '@/types/app/config';
import Tooltip from './components/Tooltip';
import animals from './images/animals.webp';
@@ -11,7 +11,7 @@ import ICP from './images/ICP.png';
export default async () => {
const { data: user } = (await getUserDataAPI()) || { data: {} as User }
const { data: web } = (await getConfigDataAPI<Web>("web")) || { data: {} as Web }
const { data: web } = (await getWebConfigDataAPI<Web>("web")) || { data: {} as Web }
return (
<>

View File

@@ -14,10 +14,10 @@ import { BsFillMoonStarsFill, BsTextIndentLeft } from "react-icons/bs";
import { Cate } from '@/types/app/cate';
import { getCateListAPI } from '@/api/cate';
import { getConfigDataAPI } from '@/api/project';
import { getWebConfigDataAPI } from '@/api/config';
import { useConfigStore } from '@/stores';
import { Theme, Web } from '@/types/app/project';
import { Theme, Web } from '@/types/app/config';
const Header = () => {
// 是否暗黑模式
@@ -25,10 +25,10 @@ const Header = () => {
// 获取项目配置
const getConfigData = async () => {
const { data: web } = (await getConfigDataAPI<Web>("web")) || { data: {} as Web };
const { data: web } = (await getWebConfigDataAPI<Web>("web")) || { data: {} as Web };
setWeb(web)
const { data: theme } = (await getConfigDataAPI<Theme>("layout")) || { data: {} as Theme };
const { data: theme } = (await getWebConfigDataAPI<Theme>("layout")) || { data: {} as Theme };
setTheme(theme)
}

View File

@@ -10,13 +10,13 @@ import QQ from '@/assets/svg/socializing/QQ.svg'
import Weixin from '@/assets/svg/socializing/Weixin.svg'
import { getUserDataAPI } from '@/api/user';
import { getConfigDataAPI } from '@/api/project'
import { getWebConfigDataAPI } from '@/api/config'
import { User } from '@/types/app/user';
import { Social, Theme } from '@/types/app/project';
import { Social, Theme } from '@/types/app/config';
const Author = async () => {
const { data: user } = await getUserDataAPI() || { data: {} as User }
const { data: { social } } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: { social } } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const socialList = JSON.parse(social || '[]')?.map((item: string) => JSON.parse(item))

View File

@@ -1,15 +1,15 @@
import Link from 'next/link';
import Image from 'next/image';
import { getConfigDataAPI } from '@/api/project'
import { getWebConfigDataAPI } from '@/api/config'
import { getArticleListAPI } from '@/api/article';
import { IoIosArrowForward } from "react-icons/io";
import fire from '@/assets/svg/other/fire.svg';
import "./index.scss";
import { Theme } from '@/types/app/project';
import { Theme } from '@/types/app/config';
import { Article } from '@/types/app/article';
const RandomArticle = async () => {
const { data: theme } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: theme } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: article } = await getArticleListAPI() || { data: [] as Article[] }
const ids = JSON.parse(theme.reco_article ? theme.reco_article : '[]')

View File

@@ -3,11 +3,11 @@ import HotArticle from "./HotArticle"
import RandomArticle from "./RandomArticle"
import Comment from "./Comment"
import RunTime from "./RunTime"
import { getConfigDataAPI } from '@/api/project'
import { Theme } from "@/types/app/project"
import { getWebConfigDataAPI } from '@/api/config'
import { Theme } from "@/types/app/config"
export default async () => {
const { data: theme } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data: theme } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const sidebar: string[] = JSON.parse(theme?.right_sidebar || '[]')
return (

View File

@@ -1,8 +1,8 @@
import { ReactNode } from 'react'
import Ripple from '@/components/Ripple'
import { getRandom } from '@/utils'
import { getConfigDataAPI } from '@/api/project'
import { Theme } from '@/types/app/project'
import { getWebConfigDataAPI } from '@/api/config'
import { Theme } from '@/types/app/config'
interface Props {
src?: string, // 图片列表
@@ -11,7 +11,7 @@ interface Props {
}
export default async ({ src, isRipple = true, children }: Props) => {
const { data } = await getConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const { data } = await getWebConfigDataAPI<Theme>("layout") || { data: {} as Theme }
const covers = JSON.parse(data.covers || '[]')
const sty = {

View File

@@ -1,6 +1,6 @@
"use client"
import { Web } from "@/types/app/project";
import { Web } from "@/types/app/config";
import { Modal, ModalContent, ModalHeader, ModalBody, UseDisclosureProps, Snippet } from "@heroui/react"
interface Props {

View File

@@ -1,6 +1,6 @@
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
import { Theme, Web } from '@/types/app/project';
import { Theme, Web } from '@/types/app/config';
interface ConfigState {
// 是否暗黑模式