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。
通过 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