diff --git a/midway.config.ts b/midway.config.ts index b54050e..bf3912c 100644 --- a/midway.config.ts +++ b/midway.config.ts @@ -4,6 +4,13 @@ import { defineConfig } from '@midwayjs/hooks-kit'; import { resolve } from "path"; export default defineConfig({ + source: "./src/server", + routes: [ + { + baseDir: "api", + basePath: "/api" + } + ], vite: { plugins: [react()], resolve: { diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2cdac30..586824e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -16,5 +16,6 @@ model ACGM { bangumi String? music_id Int @unique created_at DateTime @default(now()) + enabled Boolean @default(true) updated_at DateTime? } diff --git a/src/components/ArticleSnippet.tsx b/src/components/ArticleSnippet.tsx index 9865739..92f9b24 100644 --- a/src/components/ArticleSnippet.tsx +++ b/src/components/ArticleSnippet.tsx @@ -9,12 +9,12 @@ export const About = () => { <>

关于本项目

保罗 API 基本上作为一只辅助角色,默默无闻的服务着其他主要项目,这便是它存在的意义。像「随机动漫壁纸」接口就是为 Single 主题量身定做的,既符合主题外观特性,又能满足其他人的快捷使用。它诞生于 2018 年 4 月,是保罗入门后端和 PHP 语言的主要项目之一。

-

项目后端采用原生 PHP 编写,前端是原生 CSS 和 JS,也就是非前后端分离项目,不需要额外的前端 SSR 服务。它没有任何框架加持(自己写的),所以执行速度和并发还是个谜。尽管如此,它也较为稳定的跑了这么久,不是吗?

+

项目后端采用 MidwayJS 重构,前端是 React,相较于原先的 PHP 版本,性能确实略快了一些,就是没有 SSR。

) diff --git a/src/components/Layout/FrontWrapper.tsx b/src/components/Layout/FrontWrapper.tsx index 3676f60..66b6c6c 100644 --- a/src/components/Layout/FrontWrapper.tsx +++ b/src/components/Layout/FrontWrapper.tsx @@ -28,7 +28,7 @@ function FrontWrapper(props: FrontWrapperProps) { else if (name) { document.title = String(name); } - }, []); + }, [location.pathname]); useLayoutEffect(() => { window.scrollTo({ top: 0, left: 0 }); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 8831810..a3f782c 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -2,7 +2,7 @@ import React from "react"; import { useRequest } from "ahooks"; -import getStat from "../api/stat"; +import getStat from "../server/api/stat"; import { Link } from "react-router-dom"; import ArticleHead from "@/components/Layout/ArticleHead"; diff --git a/src/pages/netease.tsx b/src/pages/netease.tsx index e14fd10..1d26927 100644 --- a/src/pages/netease.tsx +++ b/src/pages/netease.tsx @@ -115,7 +115,7 @@ function Netease() {

示例:

通过 ID 获得一首歌的信息

-
{`https://api.paugram.com/netease/?id=448143347
+
{`https://api.paugram.com/api/netease/?id=448143347
 
 // 返回的是:
 
@@ -137,11 +137,11 @@ function Netease() {
 }
 `}

通过 ID 获得一首歌,并跳转到实际地址

-
https://api.paugram.com/netease/?id=517567145&play=true
+
https://api.paugram.com/api/netease/?id=517567145&play=true

结合 Kico Style 和 Kico Player 使用本 API

{`ks.ajax({
   method: "GET",
-  url: \`https://api.paugram.com/netease/?id=\${id}\`,
+  url: \`https://api.paugram.com/api/netease/?id=\${id}\`,
   success: (req) => {
     const item = JSON.parse(req.response);
     声明的播放器.add([item]);
diff --git a/src/server/api/acgm/add.ts b/src/server/api/acgm/add.ts
new file mode 100644
index 0000000..030dc5b
--- /dev/null
+++ b/src/server/api/acgm/add.ts
@@ -0,0 +1,115 @@
+import { Api, Post, Query, useContext, useInject } from "@midwayjs/hooks";
+import { RedisService } from "@midwayjs/redis";
+import { prisma } from "../../utils/prisma";
+
+import { getSong } from "../../utils/netease";
+
+export default Api(
+  Post(),
+  Query<{ id: string, bangumi: string }>(),
+  async () => {
+    const ctx = useContext();
+    const client = await useInject(RedisService);
+
+    const { id, bangumi } = ctx.query;
+
+    if (!id || !bangumi) {
+      return {
+        code: 0,
+        msg: "Required id or bangumi"
+      }
+    }
+
+    // 查重
+    const isExist = await prisma.aCGM.findUnique({
+      where: {
+        music_id: Number(id)
+      }
+    });
+
+    if (isExist) {
+      return {
+        code: 0,
+        msg: "this song are existed"
+      }
+    }
+
+    let result;
+
+    // 尝试使用缓存
+    const cached = await client.lrange(`api-next:163:${id}`, 0, 7);
+
+    if (cached.length) {
+      result = {
+        id: Number(id),
+        title: cached[0],
+        artist: cached[1],
+        album: cached[2],
+        alias: cached[3],
+        cover: cached[4],
+        lyric: cached[5],
+        sub_lyric: cached[6],
+        link: cached[7],
+        served: Boolean(cached[8]),
+        cached: true
+      };
+    }
+
+    // 全新获取
+    const song = await getSong(id);
+
+    if (song) {
+      await client.rpush(`api-next:163:${id}`,
+        song.title,
+        song.artist,
+        song.album,
+        song.alias,
+        song.cover,
+        song.lyric,
+        song.sub_lyric,
+        song.link,
+        song.served,
+        err => {
+          err && console.log(err);
+        }
+      );
+      await client.expire(`api-next:163:${id}`, 21600);
+
+      console.log(song);
+
+      result = {
+        ...song,
+        cached: false
+      }
+    }
+
+    console.log(result);
+
+    // 有数据支撑
+    if (result) {
+      // 创建数据
+      await prisma.aCGM.create({
+        data: {
+          title: result.title,
+          artist: result.artist,
+          album: result.album,
+          alias: result.alias,
+          bangumi,
+          music_id: Number(id),
+        }
+      });
+
+      return {
+        code: 1,
+        msg: "Success",
+        data: result
+      };
+    }
+
+    return {
+      code: 0,
+      msg: "Failed",
+      data: undefined
+    };
+  }
+);
diff --git a/src/api/acgm.ts b/src/server/api/acgm/index.ts
similarity index 95%
rename from src/api/acgm.ts
rename to src/server/api/acgm/index.ts
index 755f0e4..dc435da 100644
--- a/src/api/acgm.ts
+++ b/src/server/api/acgm/index.ts
@@ -1,8 +1,8 @@
 import { Api, Get, Query, useContext, useInject } from "@midwayjs/hooks";
 import { RedisService } from "@midwayjs/redis";
-import { prisma } from "./utils/prisma";
+import { prisma } from "../../utils/prisma";
 
-import { getSong } from "./utils/netease";
+import { getSong } from "../../utils/netease";
 
 export default Api(
   Get(),
diff --git a/src/api/bili.ts b/src/server/api/bili.ts
similarity index 98%
rename from src/api/bili.ts
rename to src/server/api/bili.ts
index 1807a98..0d39e09 100644
--- a/src/api/bili.ts
+++ b/src/server/api/bili.ts
@@ -1,7 +1,7 @@
 import { Api, Get, Query, useContext, useInject } from "@midwayjs/hooks";
 import { RedisService } from "@midwayjs/redis";
 
-import { getVideoInfo } from "./utils/bili";
+import { getVideoInfo } from "../utils/bili";
 
 const availableStyle = ["gray", "white", "black", "shadow"];
 
diff --git a/src/api/bing.ts b/src/server/api/bing.ts
similarity index 100%
rename from src/api/bing.ts
rename to src/server/api/bing.ts
diff --git a/src/api/dji.ts b/src/server/api/dji.ts
similarity index 100%
rename from src/api/dji.ts
rename to src/server/api/dji.ts
diff --git a/src/api/netease.ts b/src/server/api/netease.ts
similarity index 97%
rename from src/api/netease.ts
rename to src/server/api/netease.ts
index 871ec8d..a2ae86c 100644
--- a/src/api/netease.ts
+++ b/src/server/api/netease.ts
@@ -1,7 +1,7 @@
 import { Api, Get, Query, useContext, useInject } from "@midwayjs/hooks";
 import { RedisService } from "@midwayjs/redis";
 
-import { getSong } from "./utils/netease";
+import { getSong } from "../utils/netease";
 
 export default Api(
   Get(),
diff --git a/src/api/stat.ts b/src/server/api/stat.ts
similarity index 100%
rename from src/api/stat.ts
rename to src/server/api/stat.ts
diff --git a/src/api/wallpaper.ts b/src/server/api/wallpaper.ts
similarity index 93%
rename from src/api/wallpaper.ts
rename to src/server/api/wallpaper.ts
index 4e179b4..51fe6a9 100644
--- a/src/api/wallpaper.ts
+++ b/src/server/api/wallpaper.ts
@@ -1,7 +1,7 @@
 import { Api, Get, Query, useContext, useInject } from "@midwayjs/hooks";
 import { RedisService } from "@midwayjs/redis";
 
-import { source } from "./data/wallpaper";
+import { source } from "../data/wallpaper";
 import { random } from "lodash";
 
 export default Api(
diff --git a/src/api/configuration.ts b/src/server/configuration.ts
similarity index 95%
rename from src/api/configuration.ts
rename to src/server/configuration.ts
index 230f628..f18b651 100644
--- a/src/api/configuration.ts
+++ b/src/server/configuration.ts
@@ -12,6 +12,7 @@ export default createConfiguration({
   imports: [Koa, redis, hooks()],
   importConfigs: [{
     default: {
+      keys: "session_keys",
       redis: {
         client: {
           port: Number(env.parsed ?. CACHE_PORT) || 6379,
diff --git a/src/api/data/wallpaper.ts b/src/server/data/wallpaper.ts
similarity index 100%
rename from src/api/data/wallpaper.ts
rename to src/server/data/wallpaper.ts
diff --git a/src/api/types/wallpaper.ts b/src/server/types/wallpaper.ts
similarity index 100%
rename from src/api/types/wallpaper.ts
rename to src/server/types/wallpaper.ts
diff --git a/src/api/utils/bili.ts b/src/server/utils/bili.ts
similarity index 100%
rename from src/api/utils/bili.ts
rename to src/server/utils/bili.ts
diff --git a/src/api/utils/netease.ts b/src/server/utils/netease.ts
similarity index 94%
rename from src/api/utils/netease.ts
rename to src/server/utils/netease.ts
index d269c2e..74d85a9 100644
--- a/src/api/utils/netease.ts
+++ b/src/server/utils/netease.ts
@@ -46,7 +46,7 @@ export const parseSongData = async (item: any) => {
     id: item.id,
     title: item.name,
     artist: item.artists ?. [0].name || "",
-    alias: item.alias ?. [0] || "",
+    alias: item.transName || (Array.isArray(item.alias) ? (item.alias[0] || "") : ""),
     album: item.album.name || "",
     cover: `${item.album.picUrl.replace("http://", "https://")}?param=250y250"`,
     lyric,
diff --git a/src/api/utils/prisma.ts b/src/server/utils/prisma.ts
similarity index 100%
rename from src/api/utils/prisma.ts
rename to src/server/utils/prisma.ts