diff --git a/backend/src/controllers/sponsors.ts b/backend/src/controllers/sponsors.ts new file mode 100644 index 0000000..9a7a807 --- /dev/null +++ b/backend/src/controllers/sponsors.ts @@ -0,0 +1,18 @@ +import { Request, Response } from "express"; +import { injectable, inject } from "inversify"; +import { TYPES } from "../core/types"; +import { SponsorsService } from "../services/SponsorsService"; +import { BaseController } from "./BaseController"; + +@injectable() +export class SponsorsController extends BaseController { + constructor(@inject(TYPES.SponsorsService) private sponsorsService: SponsorsService) { + super(); + } + + async get(req: Request, res: Response): Promise { + await this.handleRequest(req, res, async () => { + return await this.sponsorsService.getSponsors(); + }); + } +} diff --git a/backend/src/core/types.ts b/backend/src/core/types.ts index b33d413..9244212 100644 --- a/backend/src/core/types.ts +++ b/backend/src/core/types.ts @@ -7,6 +7,7 @@ export const TYPES = { ImageService: Symbol.for("ImageService"), SettingService: Symbol.for("SettingService"), UserService: Symbol.for("UserService"), + SponsorsService: Symbol.for("SponsorsService"), Cloud115Controller: Symbol.for("Cloud115Controller"), QuarkController: Symbol.for("QuarkController"), @@ -15,4 +16,5 @@ export const TYPES = { ImageController: Symbol.for("ImageController"), SettingController: Symbol.for("SettingController"), UserController: Symbol.for("UserController"), + SponsorsController: Symbol.for("SponsorsController"), }; diff --git a/backend/src/inversify.config.ts b/backend/src/inversify.config.ts index 57db955..e4e9dc5 100644 --- a/backend/src/inversify.config.ts +++ b/backend/src/inversify.config.ts @@ -10,7 +10,7 @@ import { DoubanService } from "./services/DoubanService"; import { UserService } from "./services/UserService"; import { ImageService } from "./services/ImageService"; import { SettingService } from "./services/SettingService"; - +import { SponsorsService } from "./services/SponsorsService"; // Controllers import { Cloud115Controller } from "./controllers/cloud115"; import { QuarkController } from "./controllers/quark"; @@ -19,7 +19,7 @@ import { DoubanController } from "./controllers/douban"; import { ImageController } from "./controllers/teleImages"; import { SettingController } from "./controllers/setting"; import { UserController } from "./controllers/user"; - +import { SponsorsController } from "./controllers/sponsors"; const container = new Container(); // Services @@ -31,7 +31,7 @@ container.bind(TYPES.ImageService).to(ImageService).inSingletonSco container.bind(TYPES.SettingService).to(SettingService).inSingletonScope(); container.bind(TYPES.DoubanService).to(DoubanService).inSingletonScope(); container.bind(TYPES.UserService).to(UserService).inSingletonScope(); - +container.bind(TYPES.SponsorsService).to(SponsorsService).inSingletonScope(); // Controllers container.bind(TYPES.Cloud115Controller).to(Cloud115Controller); container.bind(TYPES.QuarkController).to(QuarkController); @@ -40,5 +40,6 @@ container.bind(TYPES.DoubanController).to(DoubanController); container.bind(TYPES.ImageController).to(ImageController); container.bind(TYPES.SettingController).to(SettingController); container.bind(TYPES.UserController).to(UserController); +container.bind(TYPES.SponsorsController).to(SponsorsController); export { container }; diff --git a/backend/src/routes/api.ts b/backend/src/routes/api.ts index d39ab75..71652ed 100644 --- a/backend/src/routes/api.ts +++ b/backend/src/routes/api.ts @@ -8,6 +8,7 @@ import { DoubanController } from "../controllers/douban"; import { ImageController } from "../controllers/teleImages"; import { SettingController } from "../controllers/setting"; import { UserController } from "../controllers/user"; +import { SponsorsController } from "../controllers/sponsors"; const router = Router(); @@ -19,6 +20,7 @@ const doubanController = container.get(TYPES.DoubanController) const imageController = container.get(TYPES.ImageController); const settingController = container.get(TYPES.SettingController); const userController = container.get(TYPES.UserController); +const sponsorsController = container.get(TYPES.SponsorsController); // 用户相关路由 router.post("/user/login", (req, res) => userController.login(req, res)); @@ -34,6 +36,9 @@ router.post("/setting/save", (req, res) => settingController.save(req, res)); // 资源搜索 router.get("/search", (req, res) => resourceController.search(req, res)); +// 获取赞助者列表 +router.get("/sponsors", (req, res) => sponsorsController.get(req, res)); + // 115网盘相关 router.get("/cloud115/share-info", (req, res) => cloud115Controller.getShareInfo(req, res)); router.get("/cloud115/folders", (req, res) => cloud115Controller.getFolderList(req, res)); diff --git a/backend/src/services/SponsorsService.ts b/backend/src/services/SponsorsService.ts new file mode 100644 index 0000000..fc18874 --- /dev/null +++ b/backend/src/services/SponsorsService.ts @@ -0,0 +1,25 @@ +import { injectable } from "inversify"; +import { createAxiosInstance } from "../utils/axiosInstance"; +import { AxiosInstance } from "axios"; +import sponsors from "../sponsors/sponsors.json"; + +@injectable() +export class SponsorsService { + private axiosInstance: AxiosInstance; + + constructor() { + this.axiosInstance = createAxiosInstance("http://oss.jiangmuxin.cn/cloudsaver/"); + } + async getSponsors() { + try { + const response = await this.axiosInstance.get("sponsors.json"); + return { + data: response.data.sponsors, + }; + } catch (error) { + return { + data: sponsors.sponsors, + }; + } + } +} diff --git a/backend/src/sponsors/sponsors.json b/backend/src/sponsors/sponsors.json new file mode 100644 index 0000000..ca00fa1 --- /dev/null +++ b/backend/src/sponsors/sponsors.json @@ -0,0 +1,54 @@ +{ + "sponsors": [ + { + "name": "立本狗头", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks1.jpg", + "message": "怒搓楼上狗头! " + }, + { + "name": "帝国鼻屎", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks2.jpg", + "message": "芜湖起飞! " + }, + { + "name": "雷霆222", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks3.jpg", + "message": "把我弄帅点 " + }, + { + "name": "黑田奈奈子", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks4.jpg", + "message": "流年笑掷 未来可期 ", + "link": "https://github.com/htnanako" + }, + { + "name": "原野🐇", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks5.jpg" + }, + { + "name": "我摆烂!", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks6.jpg", + "message": "人生苦短,及时行乐,卷什么卷,随缘摆烂 " + }, + { + "name": "田培", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks7.jpg" + }, + { + "name": "River", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks8.jpg" + }, + { + "name": "午夜学徒", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks9.jpg" + }, + { + "name": "阿潘", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks10.jpg" + }, + { + "name": "闹闹黑", + "avatar": "http://oss.jiangmuxin.cn/cloudsaver/sponsors/thanks11.jpg" + } + ] +} diff --git a/backend/src/utils/axiosInstance.ts b/backend/src/utils/axiosInstance.ts index 09f7bba..90a6df5 100644 --- a/backend/src/utils/axiosInstance.ts +++ b/backend/src/utils/axiosInstance.ts @@ -8,7 +8,7 @@ interface ProxyConfig { export function createAxiosInstance( baseURL: string, - headers: AxiosRequestHeaders, + headers?: AxiosRequestHeaders, useProxy: boolean = false, proxyConfig?: ProxyConfig ): AxiosInstance { diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 326a461..d748cd6 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -9,6 +9,7 @@ declare module 'vue' { export interface GlobalComponents { AsideMenu: typeof import('./src/components/AsideMenu.vue')['default'] ElAside: typeof import('element-plus/es')['ElAside'] + ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElBacktop: typeof import('element-plus/es')['ElBacktop'] ElButton: typeof import('element-plus/es')['ElButton'] ElCard: typeof import('element-plus/es')['ElCard'] @@ -50,15 +51,12 @@ declare module 'vue' { VanCheckbox: typeof import('vant/es')['Checkbox'] VanCheckboxGroup: typeof import('vant/es')['CheckboxGroup'] VanEmpty: typeof import('vant/es')['Empty'] - VanField: typeof import('vant/es')['Field'] - VanForm: typeof import('vant/es')['Form'] VanIcon: typeof import('vant/es')['Icon'] VanImage: typeof import('vant/es')['Image'] VanLoading: typeof import('vant/es')['Loading'] VanOverlay: typeof import('vant/es')['Overlay'] VanPopup: typeof import('vant/es')['Popup'] VanSearch: typeof import('vant/es')['Search'] - VanSwitch: typeof import('vant/es')['Switch'] VanTab: typeof import('vant/es')['Tab'] VanTabbar: typeof import('vant/es')['Tabbar'] VanTabbarItem: typeof import('vant/es')['TabbarItem'] diff --git a/frontend/package.json b/frontend/package.json index 6744a07..d93765b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,8 +12,10 @@ "@element-plus/icons-vue": "^2.3.1", "axios": "^1.6.7", "element-plus": "^2.6.1", + "gsap": "^3.12.7", "pinia": "^2.1.7", "socket.io-client": "^4.8.1", + "typeit": "^8.8.7", "vant": "^4.9.17", "vue": "^3.4.21", "vue-router": "^4.3.0" diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index c9ee255..c6631d2 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -7,4 +7,7 @@ export const userApi = { register: (data: { username: string; password: string; registerCode: string }) => { return request.post<{ token: string }>("/api/user/register", data); }, + getSponsors: () => { + return request.get("/api/sponsors?timestamp=" + Date.now()); + }, }; diff --git a/frontend/src/components/AsideMenu.vue b/frontend/src/components/AsideMenu.vue index 2e2efff..983a6da 100644 --- a/frontend/src/components/AsideMenu.vue +++ b/frontend/src/components/AsideMenu.vue @@ -45,12 +45,7 @@