mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-12 09:18:14 +08:00
♻️ 部分分区动态获取,重构部分调用
This commit is contained in:
@@ -7,10 +7,10 @@
|
|||||||
v-for="(item, index) in channelList"
|
v-for="(item, index) in channelList"
|
||||||
:key="index"
|
:key="index"
|
||||||
class="toc-list-item"
|
class="toc-list-item"
|
||||||
:class="{ active: props.gid === item.gid }"
|
:class="props.gid === item.gid.toString() ? 'active' : ''"
|
||||||
@click="toChannel(item)"
|
@click="toChannel(item)"
|
||||||
>
|
>
|
||||||
<img :src="item.icon" alt="icon" />
|
<TMiImg :src="item.icon" alt="icon" :ori="true" />
|
||||||
<span>{{ item.title }}</span>
|
<span>{{ item.title }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -18,25 +18,30 @@
|
|||||||
</TOverlay>
|
</TOverlay>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import TMiImg from "@comp/app/t-mi-img.vue";
|
||||||
import TOverlay from "@comp/app/t-overlay.vue";
|
import TOverlay from "@comp/app/t-overlay.vue";
|
||||||
import showSnackbar from "@comp/func/snackbar.js";
|
import showSnackbar from "@comp/func/snackbar.js";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { useRouter } from "vue-router";
|
import { onMounted, shallowRef } from "vue";
|
||||||
|
|
||||||
import { type NewsType, useAppStore } from "@/store/modules/app.js";
|
import { type NewsType, useAppStore } from "@/store/modules/app.js";
|
||||||
import type { ToChannelItem } from "@/web/constant/bbs.js";
|
import apiHubReq from "@/web/request/apiHubReq.js";
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
|
||||||
|
|
||||||
|
type ChannelItem = { icon: string; title: string; gid: number };
|
||||||
type ToChannelProps = { gid?: string; curType?: string };
|
type ToChannelProps = { gid?: string; curType?: string };
|
||||||
|
|
||||||
const router = useRouter();
|
|
||||||
const { recentNewsType } = storeToRefs(useAppStore());
|
const { recentNewsType } = storeToRefs(useAppStore());
|
||||||
const channelList = TGConstant.BBS.CHANNELS;
|
const channelList = shallowRef<Array<ChannelItem>>();
|
||||||
const props = defineProps<ToChannelProps>();
|
const props = defineProps<ToChannelProps>();
|
||||||
const visible = defineModel<boolean>({ default: false });
|
const visible = defineModel<boolean>({ default: false });
|
||||||
|
|
||||||
async function toChannel(item: ToChannelItem): Promise<void> {
|
onMounted(async () => {
|
||||||
if (props.gid === item.gid) {
|
const allGames = await apiHubReq.game();
|
||||||
|
channelList.value = allGames.map((i) => ({ icon: i.app_icon, title: i.name, gid: i.id }));
|
||||||
|
});
|
||||||
|
|
||||||
|
async function toChannel(item: ChannelItem): Promise<void> {
|
||||||
|
if (props.gid === item.gid.toString()) {
|
||||||
showSnackbar.warn("当前已经在该频道");
|
showSnackbar.warn("当前已经在该频道");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -48,7 +53,7 @@ async function toChannel(item: ToChannelItem): Promise<void> {
|
|||||||
link = link.replace("{type}", "notice");
|
link = link.replace("{type}", "notice");
|
||||||
recentNewsType.value = "notice";
|
recentNewsType.value = "notice";
|
||||||
}
|
}
|
||||||
await router.push(link);
|
window.location.href = link;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="css" scoped>
|
<style lang="css" scoped>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="tops-box">
|
<div class="tops-box">
|
||||||
<div class="tops-top">查找:{{ search }}</div>
|
<div class="tops-top">查找:{{ search }}</div>
|
||||||
<div class="tops-act">
|
<div class="tops-act">
|
||||||
<span>分区:{{ getGameName(Number(game)) }}</span>
|
<span>分区:{{ gameName }}</span>
|
||||||
<v-btn :loading="load" size="small" class="tops-btn" @click="searchPosts()" rounded>
|
<v-btn :loading="load" size="small" class="tops-btn" @click="searchPosts()" rounded>
|
||||||
加载更多({{ results.length }})
|
加载更多({{ results.length }})
|
||||||
</v-btn>
|
</v-btn>
|
||||||
@@ -21,9 +21,9 @@ import TOverlay from "@comp/app/t-overlay.vue";
|
|||||||
import TPostCard from "@comp/app/t-postcard.vue";
|
import TPostCard from "@comp/app/t-postcard.vue";
|
||||||
import showSnackbar from "@comp/func/snackbar.js";
|
import showSnackbar from "@comp/func/snackbar.js";
|
||||||
import Mys from "@Mys/index.js";
|
import Mys from "@Mys/index.js";
|
||||||
import { onMounted, ref, shallowRef, watch } from "vue";
|
import { computed, onMounted, ref, shallowRef, watch } from "vue";
|
||||||
|
|
||||||
import { getGameName } from "@/utils/toolFunc.js";
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
|
|
||||||
type ToPostSearchProps = { gid: string; keyword?: string };
|
type ToPostSearchProps = { gid: string; keyword?: string };
|
||||||
|
|
||||||
@@ -35,6 +35,9 @@ const game = ref<string>("2");
|
|||||||
const isLast = ref<boolean>(false);
|
const isLast = ref<boolean>(false);
|
||||||
const load = ref<boolean>(false);
|
const load = ref<boolean>(false);
|
||||||
const results = shallowRef<Array<TGApp.Plugins.Mys.Post.FullData>>([]);
|
const results = shallowRef<Array<TGApp.Plugins.Mys.Post.FullData>>([]);
|
||||||
|
const gameName = computed<string>(
|
||||||
|
() => TGBbs.channels.find((v) => v.gid.toString() === game.value)?.title || "未知分区",
|
||||||
|
);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
game.value = props.gid;
|
game.value = props.gid;
|
||||||
|
|||||||
@@ -5,10 +5,9 @@
|
|||||||
<v-select
|
<v-select
|
||||||
v-model="curGid"
|
v-model="curGid"
|
||||||
class="home-tool-select"
|
class="home-tool-select"
|
||||||
:items="gameSelectList"
|
:items="gameList"
|
||||||
item-title="title"
|
|
||||||
item-value="gid"
|
|
||||||
:hide-details="true"
|
:hide-details="true"
|
||||||
|
item-value="gid"
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
label="分区"
|
label="分区"
|
||||||
>
|
>
|
||||||
@@ -27,7 +26,7 @@
|
|||||||
<div
|
<div
|
||||||
v-bind="props"
|
v-bind="props"
|
||||||
class="select-item sub"
|
class="select-item sub"
|
||||||
:class="{ selected: item.raw.gid === curGid }"
|
:class="item.raw.gid === curGid ? 'selected' : ''"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="item.raw.icon"
|
:src="item.raw.icon"
|
||||||
@@ -39,7 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</v-select>
|
</v-select>
|
||||||
<TGameNav :model-value="Number(curGid)" />
|
<TGameNav :model-value="curGid" />
|
||||||
</div>
|
</div>
|
||||||
<div class="home-select">
|
<div class="home-select">
|
||||||
<v-select
|
<v-select
|
||||||
@@ -70,7 +69,7 @@ import { type Component, computed, onMounted, ref, shallowRef, watch } from "vue
|
|||||||
import { useAppStore } from "@/store/modules/app.js";
|
import { useAppStore } from "@/store/modules/app.js";
|
||||||
import { ShowItemEnum, useHomeStore } from "@/store/modules/home.js";
|
import { ShowItemEnum, useHomeStore } from "@/store/modules/home.js";
|
||||||
import TGLogger from "@/utils/TGLogger.js";
|
import TGLogger from "@/utils/TGLogger.js";
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
import apiHubReq from "@/web/request/apiHubReq.js";
|
||||||
|
|
||||||
type SFComp = Component & {
|
type SFComp = Component & {
|
||||||
__file?: string;
|
__file?: string;
|
||||||
@@ -78,6 +77,7 @@ type SFComp = Component & {
|
|||||||
__name?: string;
|
__name?: string;
|
||||||
__scopeId?: string;
|
__scopeId?: string;
|
||||||
};
|
};
|
||||||
|
type SelectItem = { icon: string; title: string; gid: number };
|
||||||
|
|
||||||
const { devMode, isLogin } = storeToRefs(useAppStore());
|
const { devMode, isLogin } = storeToRefs(useAppStore());
|
||||||
const homeStore = useHomeStore();
|
const homeStore = useHomeStore();
|
||||||
@@ -88,8 +88,8 @@ const showItemsAll: Array<ShowItemEnum> = [
|
|||||||
ShowItemEnum.position,
|
ShowItemEnum.position,
|
||||||
];
|
];
|
||||||
|
|
||||||
const gameSelectList = TGConstant.BBS.CHANNELS;
|
const curGid = ref<number>(2);
|
||||||
const curGid = ref<string>(gameSelectList[0].gid);
|
const gameList = shallowRef<Array<SelectItem>>();
|
||||||
|
|
||||||
const loadItems = shallowRef<Array<ShowItemEnum>>([]);
|
const loadItems = shallowRef<Array<ShowItemEnum>>([]);
|
||||||
const components = shallowRef<Array<SFComp>>([]);
|
const components = shallowRef<Array<SFComp>>([]);
|
||||||
@@ -102,6 +102,11 @@ onMounted(async () => {
|
|||||||
// @ts-expect-error-next-line The import.meta meta-property is not allowed in files which will build into CommonJS output.
|
// @ts-expect-error-next-line The import.meta meta-property is not allowed in files which will build into CommonJS output.
|
||||||
const isProdEnv = import.meta.env.MODE === "production";
|
const isProdEnv = import.meta.env.MODE === "production";
|
||||||
if (isProdEnv && devMode.value) devMode.value = false;
|
if (isProdEnv && devMode.value) devMode.value = false;
|
||||||
|
if (isLogin.value) {
|
||||||
|
await showLoading.start("正在加载首页小部件");
|
||||||
|
const allGames = await apiHubReq.game();
|
||||||
|
gameList.value = allGames.map((i) => ({ icon: i.app_icon, title: i.name, gid: i.id }));
|
||||||
|
}
|
||||||
await loadComp();
|
await loadComp();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -190,8 +195,8 @@ async function loadEnd(item: SFComp): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.home-tool-select {
|
.home-tool-select {
|
||||||
width: 200px;
|
width: 250px;
|
||||||
max-width: 200px;
|
max-width: 250px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-select {
|
.home-select {
|
||||||
|
|||||||
@@ -18,9 +18,10 @@
|
|||||||
>
|
>
|
||||||
<template #selection="{ item }">
|
<template #selection="{ item }">
|
||||||
<div class="select-item main">
|
<div class="select-item main">
|
||||||
<img
|
<TMiImg
|
||||||
v-if="item.raw.icon"
|
v-if="item.raw.icon"
|
||||||
:src="item.raw.icon"
|
:src="item.raw.icon"
|
||||||
|
:ori="true"
|
||||||
:alt="item.raw.text"
|
:alt="item.raw.text"
|
||||||
:title="item.raw.text"
|
:title="item.raw.text"
|
||||||
class="icon"
|
class="icon"
|
||||||
@@ -34,7 +35,13 @@
|
|||||||
class="select-item sub"
|
class="select-item sub"
|
||||||
:class="{ selected: item.raw.gid === curGid }"
|
:class="{ selected: item.raw.gid === curGid }"
|
||||||
>
|
>
|
||||||
<img v-if="item.raw.icon" :src="item.raw.icon" :alt="item.raw.text" class="icon" />
|
<TMiImg
|
||||||
|
v-if="item.raw.icon"
|
||||||
|
:src="item.raw.icon"
|
||||||
|
:alt="item.raw.text"
|
||||||
|
class="icon"
|
||||||
|
:ori="true"
|
||||||
|
/>
|
||||||
<span>{{ item.raw.text }}</span>
|
<span>{{ item.raw.text }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -126,7 +133,6 @@ import { useRoute, useRouter } from "vue-router";
|
|||||||
|
|
||||||
import TGLogger from "@/utils/TGLogger.js";
|
import TGLogger from "@/utils/TGLogger.js";
|
||||||
import { createPost } from "@/utils/TGWindow.js";
|
import { createPost } from "@/utils/TGWindow.js";
|
||||||
import { getGameIcon, getGameName } from "@/utils/toolFunc.js";
|
|
||||||
import ApiHubReq from "@/web/request/apiHubReq.js";
|
import ApiHubReq from "@/web/request/apiHubReq.js";
|
||||||
|
|
||||||
type SortSelect = { text: string; value: number; icon: string };
|
type SortSelect = { text: string; value: number; icon: string };
|
||||||
@@ -198,16 +204,19 @@ watch(
|
|||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
async function loadForums(): Promise<void> {
|
async function loadForums(): Promise<void> {
|
||||||
|
const allGames = await ApiHubReq.game();
|
||||||
const allForums = await ApiHubReq.forum();
|
const allForums = await ApiHubReq.forum();
|
||||||
const gameList: Array<SortSelectGame> = [];
|
const gameList: Array<SortSelectGame> = [];
|
||||||
for (const gameForum of allForums) {
|
for (const gameForum of allForums) {
|
||||||
|
const gameFind = allGames.find((i) => i.id === gameForum.game_id);
|
||||||
|
if (!gameFind) continue;
|
||||||
const gameItem: SortSelectGame = {
|
const gameItem: SortSelectGame = {
|
||||||
gid: gameForum.game_id,
|
gid: gameForum.game_id,
|
||||||
icon: getGameIcon(gameForum.game_id),
|
icon: gameFind.app_icon,
|
||||||
forum: gameForum.forums
|
forum: gameForum.forums
|
||||||
.sort((a, b) => a.order - b.order)
|
.sort((a, b) => a.order - b.order)
|
||||||
.map((i) => ({ text: i.name, value: i.id, icon: i.icon_pure })),
|
.map((i) => ({ text: i.name, value: i.id, icon: i.icon_pure })),
|
||||||
text: getGameName(gameForum.game_id),
|
text: gameFind.name,
|
||||||
};
|
};
|
||||||
gameList.push(gameItem);
|
gameList.push(gameItem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,9 +68,9 @@ import { computed, onMounted, reactive, ref, shallowRef } from "vue";
|
|||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
import { type NewsType, NewsTypeEnum, useAppStore } from "@/store/modules/app.js";
|
import { type NewsType, NewsTypeEnum, useAppStore } from "@/store/modules/app.js";
|
||||||
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
import TGLogger from "@/utils/TGLogger.js";
|
import TGLogger from "@/utils/TGLogger.js";
|
||||||
import { createPost } from "@/utils/TGWindow.js";
|
import { createPost } from "@/utils/TGWindow.js";
|
||||||
import { getGameName } from "@/utils/toolFunc.js";
|
|
||||||
|
|
||||||
type PostData = { [key in NewsType]: Ref<Array<TGApp.Plugins.Mys.Post.FullData>> };
|
type PostData = { [key in NewsType]: Ref<Array<TGApp.Plugins.Mys.Post.FullData>> };
|
||||||
type RawItem = { isLast: boolean; name: string; lastId: number };
|
type RawItem = { isLast: boolean; name: string; lastId: number };
|
||||||
@@ -78,9 +78,11 @@ type RawData = { [key in NewsType]: Ref<RawItem> };
|
|||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { recentNewsType } = storeToRefs(useAppStore());
|
const { recentNewsType } = storeToRefs(useAppStore());
|
||||||
const tabValues: Readonly<Array<NewsType>> = ["notice", "activity", "news"];
|
|
||||||
const { gid } = <{ gid: string }>useRoute().params;
|
const { gid } = <{ gid: string }>useRoute().params;
|
||||||
const gameName = getGameName(Number(gid));
|
|
||||||
|
const tabValues: Readonly<Array<NewsType>> = ["notice", "activity", "news"];
|
||||||
|
const gameName = TGBbs.channels.find((v) => v.gid.toString() === gid)?.title || "未知分区";
|
||||||
|
|
||||||
const loading = ref<boolean>(false);
|
const loading = ref<boolean>(false);
|
||||||
const showList = ref<boolean>(false);
|
const showList = ref<boolean>(false);
|
||||||
const showSearch = ref<boolean>(false);
|
const showSearch = ref<boolean>(false);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<v-select
|
<v-select
|
||||||
v-model="curGame"
|
v-model="curGame"
|
||||||
class="post-switch-item"
|
class="post-switch-item"
|
||||||
:items="topicInfo?.game_info_list"
|
:items="getGameList(topicInfo?.game_info_list)"
|
||||||
item-title="name"
|
item-title="name"
|
||||||
:item-value="(item) => item"
|
:item-value="(item) => item"
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
@@ -25,8 +25,8 @@
|
|||||||
<template #selection="{ item }">
|
<template #selection="{ item }">
|
||||||
<div class="select-item main">
|
<div class="select-item main">
|
||||||
<img
|
<img
|
||||||
v-if="getGameIcon(item.raw.id)"
|
v-if="item.raw.icon"
|
||||||
:src="getGameIcon(item.raw.id)"
|
:src="item.raw.icon"
|
||||||
:alt="item.raw.name"
|
:alt="item.raw.name"
|
||||||
:title="item.raw.name"
|
:title="item.raw.name"
|
||||||
class="icon"
|
class="icon"
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
<template #item="{ props, item }">
|
<template #item="{ props, item }">
|
||||||
<div v-bind="props" class="select-item sub" :class="{ selected: item.raw.id === curGid }">
|
<div v-bind="props" class="select-item sub" :class="{ selected: item.raw.id === curGid }">
|
||||||
<img
|
<img
|
||||||
v-if="getGameIcon(item.raw.id)"
|
v-if="item.raw.icon"
|
||||||
:src="getGameIcon(item.raw.id)"
|
:src="item.raw.icon"
|
||||||
:alt="item.raw.name"
|
:alt="item.raw.name"
|
||||||
:title="item.raw.name"
|
:title="item.raw.name"
|
||||||
class="icon"
|
class="icon"
|
||||||
@@ -95,10 +95,11 @@ import { computed, onMounted, ref, shallowRef, watch } from "vue";
|
|||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
import { createPost } from "@/utils/TGWindow.js";
|
import { createPost } from "@/utils/TGWindow.js";
|
||||||
import { getGameIcon } from "@/utils/toolFunc.js";
|
import apiHubReq from "@/web/request/apiHubReq.js";
|
||||||
|
|
||||||
type SortSelect = { text: string; value: number };
|
type SortSelect = { text: string; value: number };
|
||||||
type PostMiniData = { isLast: boolean; lastId: string; total: number };
|
type PostMiniData = { isLast: boolean; lastId: string; total: number };
|
||||||
|
type GameList = TGApp.Plugins.Mys.Topic.GameInfo & { icon?: string };
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -107,10 +108,11 @@ const curGid = ref<number>(0);
|
|||||||
const curSortType = ref<0 | 1 | 2>(0);
|
const curSortType = ref<0 | 1 | 2>(0);
|
||||||
const search = ref<string>("");
|
const search = ref<string>("");
|
||||||
const curTopic = ref<string>("");
|
const curTopic = ref<string>("");
|
||||||
|
const allGames = shallowRef<Array<TGApp.BBS.Game.Item>>([]);
|
||||||
const postRaw = shallowRef<PostMiniData>({ isLast: false, lastId: "", total: 0 });
|
const postRaw = shallowRef<PostMiniData>({ isLast: false, lastId: "", total: 0 });
|
||||||
const topicInfo = shallowRef<TGApp.Plugins.Mys.Topic.InfoData>();
|
const topicInfo = shallowRef<TGApp.Plugins.Mys.Topic.InfoData>();
|
||||||
const posts = shallowRef<Array<TGApp.Plugins.Mys.Post.FullData>>([]);
|
const posts = shallowRef<Array<TGApp.Plugins.Mys.Post.FullData>>([]);
|
||||||
const curGame = shallowRef<TGApp.Plugins.Mys.Topic.GameInfo>();
|
const curGame = shallowRef<GameList>();
|
||||||
const sortList = computed<Array<SortSelect>>(() => {
|
const sortList = computed<Array<SortSelect>>(() => {
|
||||||
if (!topicInfo.value) return [];
|
if (!topicInfo.value) return [];
|
||||||
if (!topicInfo.value.good_post_exist) {
|
if (!topicInfo.value.good_post_exist) {
|
||||||
@@ -135,6 +137,7 @@ onMounted(async () => {
|
|||||||
curGid.value = Number(gid);
|
curGid.value = Number(gid);
|
||||||
curTopic.value = topic;
|
curTopic.value = topic;
|
||||||
await showLoading.start(`正在加载话题${topic}信息`);
|
await showLoading.start(`正在加载话题${topic}信息`);
|
||||||
|
allGames.value = await apiHubReq.game();
|
||||||
const info = await Mys.Post.getTopicFullInfo(gid, topic);
|
const info = await Mys.Post.getTopicFullInfo(gid, topic);
|
||||||
if ("retcode" in info) {
|
if ("retcode" in info) {
|
||||||
await showLoading.end();
|
await showLoading.end();
|
||||||
@@ -142,10 +145,13 @@ onMounted(async () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
topicInfo.value = info;
|
topicInfo.value = info;
|
||||||
|
let tmpGame: GameList | undefined;
|
||||||
if (curGame.value === undefined) {
|
if (curGame.value === undefined) {
|
||||||
curGame.value = info.game_info_list.find((i) => i.id === curGid.value);
|
tmpGame = info.game_info_list.find((i) => i.id === curGid.value);
|
||||||
}
|
}
|
||||||
if (curGame.value === undefined) curGame.value = info.game_info_list[0];
|
if (tmpGame === undefined) tmpGame = info.game_info_list[0];
|
||||||
|
const gameFind = allGames.value.find((i) => i.id === tmpGame?.id);
|
||||||
|
curGame.value = { ...tmpGame, icon: gameFind?.app_icon };
|
||||||
await firstLoad();
|
await firstLoad();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -226,6 +232,14 @@ function searchPost(): void {
|
|||||||
if (isNaN(numCheck)) showSearch.value = true;
|
if (isNaN(numCheck)) showSearch.value = true;
|
||||||
else createPost(search.value);
|
else createPost(search.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getGameList(gameList: TGApp.Plugins.Mys.Topic.GameInfo[] | undefined): GameList[] {
|
||||||
|
if (!gameList) return [];
|
||||||
|
return gameList.map((item) => {
|
||||||
|
const game = allGames.value.find((i) => i.id === item.id);
|
||||||
|
return { ...item, icon: game?.app_icon };
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="css" scoped>
|
<style lang="css" scoped>
|
||||||
.post-topic-top {
|
.post-topic-top {
|
||||||
@@ -337,7 +351,6 @@ function searchPost(): void {
|
|||||||
.icon {
|
.icon {
|
||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
border-radius: 4px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
import showSnackbar from "@comp/func/snackbar.js";
|
import showSnackbar from "@comp/func/snackbar.js";
|
||||||
import { JSEncrypt } from "jsencrypt";
|
import { JSEncrypt } from "jsencrypt";
|
||||||
|
|
||||||
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
import TGHttp from "@/utils/TGHttp.js";
|
import TGHttp from "@/utils/TGHttp.js";
|
||||||
import { getDeviceInfo } from "@/utils/toolFunc.js";
|
import { getDeviceInfo } from "@/utils/toolFunc.js";
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
|
||||||
|
|
||||||
const PUB_KEY_STR: Readonly<string> = `-----BEGIN PUBLIC KEY-----
|
const PUB_KEY_STR: Readonly<string> = `-----BEGIN PUBLIC KEY-----
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDvekdPMHN3AYhm/vktJT+YJr7cI5DcsNKqdsx5DZX0gDuWFuIjzdwButrIYPNmRJ1G8ybDIF7oDW2eEpm5sMbL9zs
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDvekdPMHN3AYhm/vktJT+YJr7cI5DcsNKqdsx5DZX0gDuWFuIjzdwButrIYPNmRJ1G8ybDIF7oDW2eEpm5sMbL9zs
|
||||||
@@ -53,14 +53,14 @@ export async function getCaptcha(
|
|||||||
const body = { area_code: rsaEncrypt("+86"), mobile: rsaEncrypt(phone) };
|
const body = { area_code: rsaEncrypt("+86"), mobile: rsaEncrypt(phone) };
|
||||||
const header: Record<string, string> = {
|
const header: Record<string, string> = {
|
||||||
"x-rpc-aigis": aigis || "",
|
"x-rpc-aigis": aigis || "",
|
||||||
"x-rpc-app_version": TGConstant.BBS.VERSION,
|
"x-rpc-app_version": TGBbs.version,
|
||||||
"x-rpc-client_type": "2",
|
"x-rpc-client_type": "2",
|
||||||
"x-rpc-app_id": "bll8iq97cem8",
|
"x-rpc-app_id": "bll8iq97cem8",
|
||||||
"x-rpc-device_fp": device_fp,
|
"x-rpc-device_fp": device_fp,
|
||||||
"x-rpc-device_name": device_name,
|
"x-rpc-device_name": device_name,
|
||||||
"x-rpc-device_id": device_id,
|
"x-rpc-device_id": device_id,
|
||||||
"x-rpc-device_model": device_model,
|
"x-rpc-device_model": device_model,
|
||||||
"user-agent": TGConstant.BBS.UA_MOBILE,
|
"user-agent": TGBbs.ua,
|
||||||
"content-type": "application/json",
|
"content-type": "application/json",
|
||||||
referer: "https://user.miyoushe.com/",
|
referer: "https://user.miyoushe.com/",
|
||||||
"x-rpc-game_biz": "hk4e_cn",
|
"x-rpc-game_biz": "hk4e_cn",
|
||||||
@@ -115,14 +115,14 @@ export async function doCaptchaLogin(
|
|||||||
};
|
};
|
||||||
const header = {
|
const header = {
|
||||||
"x-rpc-aigis": aigis || "",
|
"x-rpc-aigis": aigis || "",
|
||||||
"x-rpc-app_version": TGConstant.BBS.VERSION,
|
"x-rpc-app_version": TGBbs.version,
|
||||||
"x-rpc-client_type": "2",
|
"x-rpc-client_type": "2",
|
||||||
"x-rpc-app_id": "bll8iq97cem8",
|
"x-rpc-app_id": "bll8iq97cem8",
|
||||||
"x-rpc-device_fp": device_fp,
|
"x-rpc-device_fp": device_fp,
|
||||||
"x-rpc-device_name": device_name,
|
"x-rpc-device_name": device_name,
|
||||||
"x-rpc-device_id": device_id,
|
"x-rpc-device_id": device_id,
|
||||||
"x-rpc-device_model": device_model,
|
"x-rpc-device_model": device_model,
|
||||||
"user-agent": TGConstant.BBS.UA_MOBILE,
|
"user-agent": TGBbs.ua,
|
||||||
};
|
};
|
||||||
const resp = await TGHttp<TGApp.Plugins.Mys.CaptchaLogin.LoginResponse | TGApp.BBS.Response.Base>(
|
const resp = await TGHttp<TGApp.Plugins.Mys.CaptchaLogin.LoginResponse | TGApp.BBS.Response.Base>(
|
||||||
url,
|
url,
|
||||||
|
|||||||
52
src/types/BBS/Game.d.ts
vendored
Normal file
52
src/types/BBS/Game.d.ts
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* @file types/BBS/Game.d.ts
|
||||||
|
* @description 游戏相关的类型定义
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare namespace TGApp.BBS.Game {
|
||||||
|
/**
|
||||||
|
* @description 游戏列表返回
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
* @interface ListResp
|
||||||
|
* @extends TGApp.BBS.Response.BaseWithData
|
||||||
|
* @property {Array<Item>} data.list 游戏列表
|
||||||
|
* @return ListResp
|
||||||
|
*/
|
||||||
|
type ListResp = TGApp.BBS.Response.BaseWithData & { data: { list: Array<Item> } };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 游戏列表项
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
* @interface Item
|
||||||
|
* @property {number} id 游戏 ID
|
||||||
|
* @property {string} name 游戏名称
|
||||||
|
* @property {string} en_name 游戏英文名称
|
||||||
|
* @property {string} app_icon 游戏图标
|
||||||
|
* @property {string} icon 游戏图标
|
||||||
|
* @property {string} search_trend_word 搜索热词
|
||||||
|
* @property {string} level_image 游戏等级图标
|
||||||
|
* @property {string} level_text_color 游戏等级文字颜色
|
||||||
|
* @property {number} topic_num 游戏话题数
|
||||||
|
* @property {string} op_name 运营名称
|
||||||
|
* @property {string} main_color 主色调 AB9756
|
||||||
|
* @property {boolean} has_wiki 是否有百科
|
||||||
|
* @property {Array<unknown>} game_sort_config 游戏分类配置
|
||||||
|
* @return Item
|
||||||
|
*/
|
||||||
|
type Item = {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
en_name: string;
|
||||||
|
app_icon: string;
|
||||||
|
icon: string;
|
||||||
|
search_trend_word: string;
|
||||||
|
level_image: string;
|
||||||
|
level_text_color: string;
|
||||||
|
topic_num: number;
|
||||||
|
op_name: string;
|
||||||
|
main_color: string;
|
||||||
|
has_wiki: boolean;
|
||||||
|
game_sort_config: Array<unknown>;
|
||||||
|
};
|
||||||
|
}
|
||||||
49
src/utils/TGBbs.ts
Normal file
49
src/utils/TGBbs.ts
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* @file utils/TGBbs.ts
|
||||||
|
* @description 关于 BBS 的工具函数
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
*/
|
||||||
|
|
||||||
|
const BBS_VERSION: Readonly<string> = "2.80.1";
|
||||||
|
const BBS_UA_MOBILE: Readonly<string> = `Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBS/${BBS_VERSION}`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 频道列表
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
* @interface ChannelItem
|
||||||
|
* @property {string} title - 频道名称
|
||||||
|
* @property {number} gid - 频道 gid
|
||||||
|
* @property {string} mini - 频道简称
|
||||||
|
* @return ToChannelItem
|
||||||
|
*/
|
||||||
|
type ChannelItem = { title: string; gid: number; mini: string };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 渠道列表
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
* @type {Array<ChannelItem>}
|
||||||
|
*/
|
||||||
|
const CHANNEL_LIST: Readonly<Array<ChannelItem>> = [
|
||||||
|
{ title: "原神", gid: 2, mini: "ys" },
|
||||||
|
{ title: "崩坏:星穹铁道", gid: 6, mini: "sr" },
|
||||||
|
{ title: "绝区零", gid: 8, mini: "zzz" },
|
||||||
|
{ title: "崩坏3", gid: 1, mini: "bh3" },
|
||||||
|
{ title: "崩坏2", gid: 3, mini: "bh2" },
|
||||||
|
{ title: "未定事件簿", gid: 4, mini: "wd" },
|
||||||
|
{ title: "大别野", gid: 5, mini: "dby" },
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 获取游戏id
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
* @param {string} mini
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export function getGameId(mini: string): number {
|
||||||
|
const game = CHANNEL_LIST.find((item) => item.mini === mini);
|
||||||
|
return game ? game.gid : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TGBbs = { version: BBS_VERSION, ua: BBS_UA_MOBILE, channels: CHANNEL_LIST };
|
||||||
|
|
||||||
|
export default TGBbs;
|
||||||
@@ -16,7 +16,7 @@ import { getDeviceInfo } from "./toolFunc.js";
|
|||||||
|
|
||||||
import { useAppStore } from "@/store/modules/app.js";
|
import { useAppStore } from "@/store/modules/app.js";
|
||||||
import { useUserStore } from "@/store/modules/user.js";
|
import { useUserStore } from "@/store/modules/user.js";
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
import BBSApi from "@/web/request/bbsReq.js";
|
import BBSApi from "@/web/request/bbsReq.js";
|
||||||
import OtherApi from "@/web/request/otherReq.js";
|
import OtherApi from "@/web/request/otherReq.js";
|
||||||
import PassportApi from "@/web/request/passportReq.js";
|
import PassportApi from "@/web/request/passportReq.js";
|
||||||
@@ -623,10 +623,10 @@ class Client {
|
|||||||
let deviceInfo = useAppStore().deviceInfo;
|
let deviceInfo = useAppStore().deviceInfo;
|
||||||
if (localFp === "0000000000000") deviceInfo = await OtherApi.fp(deviceInfo);
|
if (localFp === "0000000000000") deviceInfo = await OtherApi.fp(deviceInfo);
|
||||||
const data = {
|
const data = {
|
||||||
"user-agent": TGConstant.BBS.UA_MOBILE,
|
"user-agent": TGBbs.ua,
|
||||||
"x-rpc-client_type": "2",
|
"x-rpc-client_type": "2",
|
||||||
"x-rpc-device_id": deviceInfo.device_id,
|
"x-rpc-device_id": deviceInfo.device_id,
|
||||||
"x-rpc-app_version": TGConstant.BBS.VERSION,
|
"x-rpc-app_version": TGBbs.version,
|
||||||
"x-rpc-device_fp": deviceInfo.device_fp,
|
"x-rpc-device_fp": deviceInfo.device_fp,
|
||||||
};
|
};
|
||||||
await this.callback(arg.callback, data);
|
await this.callback(arg.callback, data);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { emit } from "@tauri-apps/api/event";
|
|||||||
import TGClient from "./TGClient.js";
|
import TGClient from "./TGClient.js";
|
||||||
import { createPost } from "./TGWindow.js";
|
import { createPost } from "./TGWindow.js";
|
||||||
|
|
||||||
import { getGameId } from "@/utils/toolFunc.js";
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @function parsePost
|
* @function parsePost
|
||||||
@@ -124,7 +124,7 @@ export async function parseLink(
|
|||||||
const result = url.pathname.match(regex);
|
const result = url.pathname.match(regex);
|
||||||
if (!result) return false;
|
if (!result) return false;
|
||||||
const [, game, topicId] = result;
|
const [, game, topicId] = result;
|
||||||
const id = getGameId(game);
|
const id = TGBbs.channels.find((item) => item.mini === game)?.gid;
|
||||||
await emit("active_deep_link", `router?path=/posts/topic/${id}/${topicId}`);
|
await emit("active_deep_link", `router?path=/posts/topic/${id}/${topicId}`);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import { v4 } from "uuid";
|
|||||||
import { score } from "wcag-color";
|
import { score } from "wcag-color";
|
||||||
|
|
||||||
import { AppCharacterData, AppWeaponData } from "@/data/index.js";
|
import { AppCharacterData, AppWeaponData } from "@/data/index.js";
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 时间戳转换为时间字符串
|
* @description 时间戳转换为时间字符串
|
||||||
@@ -273,39 +272,6 @@ export function decodeRegExp(data: string): string {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 根据 gid 获取游戏名称
|
|
||||||
* @since Beta v0.6.7
|
|
||||||
* @param {number} gid
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export function getGameName(gid: number): string {
|
|
||||||
const game = TGConstant.BBS.CHANNELS.find((item) => item.gid === gid.toString());
|
|
||||||
return game ? game.title : "未知游戏";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 获取游戏id
|
|
||||||
* @since Beta v0.6.7
|
|
||||||
* @param {string} mini
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export function getGameId(mini: string): string {
|
|
||||||
const game = TGConstant.BBS.CHANNELS.find((item) => item.mini === mini);
|
|
||||||
return game ? game.gid : "0";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 根据id获取游戏图标
|
|
||||||
* @since Beta v0.6.8
|
|
||||||
* @param {number|string} gid
|
|
||||||
* @returns {string|undefined}
|
|
||||||
*/
|
|
||||||
export function getGameIcon(gid: number | string): string | undefined {
|
|
||||||
const game = TGConstant.BBS.CHANNELS.find((item) => item.gid === gid.toString());
|
|
||||||
return game ? game.icon : undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 根据id获取对应角色/武器数据
|
* @description 根据id获取对应角色/武器数据
|
||||||
* @since Beta v0.6.8
|
* @since Beta v0.6.8
|
||||||
|
|||||||
@@ -101,10 +101,9 @@ import { onMounted, onUnmounted, ref, shallowRef } from "vue";
|
|||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
import { useAppStore } from "@/store/modules/app.js";
|
import { useAppStore } from "@/store/modules/app.js";
|
||||||
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
import TGLogger from "@/utils/TGLogger.js";
|
import TGLogger from "@/utils/TGLogger.js";
|
||||||
import { createTGWindow } from "@/utils/TGWindow.js";
|
import { createTGWindow } from "@/utils/TGWindow.js";
|
||||||
import { CHANNEL_LIST } from "@/web/constant/bbs.js";
|
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
|
||||||
|
|
||||||
const appVersion = ref<string>();
|
const appVersion = ref<string>();
|
||||||
const postId = Number(useRoute().params.post_id);
|
const postId = Number(useRoute().params.post_id);
|
||||||
@@ -117,8 +116,8 @@ const postData = shallowRef<TGApp.Plugins.Mys.Post.FullData>();
|
|||||||
let shareTimer: NodeJS.Timeout | null = null;
|
let shareTimer: NodeJS.Timeout | null = null;
|
||||||
|
|
||||||
function getGameIcon(gameId: number): string {
|
function getGameIcon(gameId: number): string {
|
||||||
const find = TGConstant.BBS.CHANNELS.find((item) => item.gid === gameId.toString());
|
const find = TGBbs.channels.find((item) => item.gid === gameId);
|
||||||
if (find) return find.icon;
|
if (find) return `/platforms/mhy/${find.mini}.webp`;
|
||||||
return "/platforms/mhy/mys.webp";
|
return "/platforms/mhy/mys.webp";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,6 +228,7 @@ async function parseContent(content: string): Promise<string> {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
await TGLogger.Warn(`[t-post][${postId}][parseContent] Unknown key: ${key}`);
|
await TGLogger.Warn(`[t-post][${postId}][parseContent] Unknown key: ${key}`);
|
||||||
|
// @ts-expect-error unknown key
|
||||||
result.push({ insert: data[key] });
|
result.push({ insert: data[key] });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -243,7 +243,7 @@ async function createPostJson(postId: number): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function toPost(): void {
|
function toPost(): void {
|
||||||
const channel = CHANNEL_LIST.find((item) => item.gid === postData.value?.post.game_id.toString());
|
const channel = TGBbs.channels.find((item) => item.gid === postData.value?.post.game_id);
|
||||||
if (channel) {
|
if (channel) {
|
||||||
window.open(`https://miyoushe.com/${channel.mini}/#/article/${postId}`);
|
window.open(`https://miyoushe.com/${channel.mini}/#/article/${postId}`);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file web/constant/TGConstant.ts
|
|
||||||
* @description 常量
|
|
||||||
* @since Beta v0.6.3
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { BBS_UA_MOBILE, BBS_VERSION, CHANNEL_LIST } from "./bbs.js";
|
|
||||||
|
|
||||||
const TGConstant = {
|
|
||||||
BBS: { VERSION: BBS_VERSION, UA_MOBILE: BBS_UA_MOBILE, CHANNELS: CHANNEL_LIST },
|
|
||||||
};
|
|
||||||
|
|
||||||
export default TGConstant;
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file web/constant/bbs.ts
|
|
||||||
* @description 常量-应用数据
|
|
||||||
* @since Beta v0.6.8
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const BBS_VERSION: Readonly<string> = "2.80.1";
|
|
||||||
export const BBS_UA_MOBILE: Readonly<string> = `Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBS/${BBS_VERSION}`;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 频道列表
|
|
||||||
* @since Beta v0.6.5
|
|
||||||
* @interface ToChannelItem
|
|
||||||
* @property {string} title - 频道名称
|
|
||||||
* @property {string} icon - 频道图标
|
|
||||||
* @property {string} gid - 频道 gid
|
|
||||||
* @property {string} mini - 频道简称
|
|
||||||
* @return ToChannelItem
|
|
||||||
*/
|
|
||||||
export interface ToChannelItem {
|
|
||||||
title: string;
|
|
||||||
icon: string;
|
|
||||||
gid: string;
|
|
||||||
mini: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description 渠道列表
|
|
||||||
* @since Beta v0.6.5
|
|
||||||
* @type {Array<ToChannelItem>}
|
|
||||||
*/
|
|
||||||
export const CHANNEL_LIST: Readonly<Array<ToChannelItem>> = [
|
|
||||||
{
|
|
||||||
title: "原神",
|
|
||||||
icon: "/platforms/mhy/ys.webp",
|
|
||||||
gid: "2",
|
|
||||||
mini: "ys",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "崩坏:星穹铁道",
|
|
||||||
icon: "/platforms/mhy/sr.webp",
|
|
||||||
gid: "6",
|
|
||||||
mini: "sr",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "绝区零",
|
|
||||||
icon: "/platforms/mhy/zzz.webp",
|
|
||||||
gid: "8",
|
|
||||||
mini: "zzz",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "崩坏3",
|
|
||||||
icon: "/platforms/mhy/bh3.webp",
|
|
||||||
gid: "1",
|
|
||||||
mini: "bh3",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "崩坏2",
|
|
||||||
icon: "/platforms/mhy/bh2.webp",
|
|
||||||
gid: "3",
|
|
||||||
mini: "bh2",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "未定事件簿",
|
|
||||||
icon: "/platforms/mhy/wd.webp",
|
|
||||||
gid: "4",
|
|
||||||
mini: "wd",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "大别野",
|
|
||||||
icon: "/platforms/mhy/dby.webp",
|
|
||||||
gid: "5",
|
|
||||||
mini: "dby",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
@@ -26,6 +26,20 @@ async function getAllGamesForums(): Promise<Array<TGApp.BBS.Forum.GameForum>> {
|
|||||||
).data.list;
|
).data.list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 获取所有分区
|
||||||
|
* @since Beta v0.6.8
|
||||||
|
* @return {Promise<Array<TGApp.BBS.Game.Item>>}
|
||||||
|
*/
|
||||||
|
async function getGameList(): Promise<Array<TGApp.BBS.Game.Item>> {
|
||||||
|
return (
|
||||||
|
await TGHttp<TGApp.BBS.Game.ListResp>(`${Mahwbu}getGameList`, {
|
||||||
|
method: "GET",
|
||||||
|
headers: { "Content-Type": "application/json", referer: Referer },
|
||||||
|
})
|
||||||
|
).data.list;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取投票信息
|
* @description 获取投票信息
|
||||||
* @since Beta v0.6.2
|
* @since Beta v0.6.2
|
||||||
@@ -80,6 +94,7 @@ const apiHubReq = {
|
|||||||
vote: { info: getVotes, result: getVoteResult },
|
vote: { info: getVotes, result: getVoteResult },
|
||||||
home: homeNew,
|
home: homeNew,
|
||||||
forum: getAllGamesForums,
|
forum: getAllGamesForums,
|
||||||
|
game: getGameList,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default apiHubReq;
|
export default apiHubReq;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* @file web/request/otherReq.ts
|
* @file web/request/otherReq.ts
|
||||||
* @description Other API
|
* @description Other API
|
||||||
* @since Beta v0.6.3
|
* @since Beta v0.6.8
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
import TGHttp from "@/utils/TGHttp.js";
|
import TGHttp from "@/utils/TGHttp.js";
|
||||||
import TGLogger from "@/utils/TGLogger.js";
|
import TGLogger from "@/utils/TGLogger.js";
|
||||||
import { getInitDeviceInfo } from "@/utils/toolFunc.js";
|
import { getInitDeviceInfo } from "@/utils/toolFunc.js";
|
||||||
import TGConstant from "@/web/constant/TGConstant.js";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取设备指纹
|
* @description 获取设备指纹
|
||||||
@@ -85,8 +85,8 @@ async function getDeviceFp(
|
|||||||
device_fp: info.device_fp,
|
device_fp: info.device_fp,
|
||||||
};
|
};
|
||||||
const header: Record<string, string> = {
|
const header: Record<string, string> = {
|
||||||
"user-agent": TGConstant.BBS.UA_MOBILE,
|
"user-agent": TGBbs.ua,
|
||||||
"x-rpc-app_version": TGConstant.BBS.VERSION,
|
"x-rpc-app_version": TGBbs.version,
|
||||||
"x-rpc-client_type": "5",
|
"x-rpc-client_type": "5",
|
||||||
"x-requested-with": "com.mihoyo.hyperion",
|
"x-requested-with": "com.mihoyo.hyperion",
|
||||||
Referer: "https://webstatic.mihoyo.com/",
|
Referer: "https://webstatic.mihoyo.com/",
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
import Md5 from "js-md5";
|
import Md5 from "js-md5";
|
||||||
|
|
||||||
|
import TGBbs from "@/utils/TGBbs.js";
|
||||||
import { getDeviceInfo, getRandomString } from "@/utils/toolFunc.js";
|
import { getDeviceInfo, getRandomString } from "@/utils/toolFunc.js";
|
||||||
import { BBS_VERSION } from "@/web/constant/bbs.js";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description salt 类型
|
* @description salt 类型
|
||||||
@@ -34,7 +34,7 @@ const Salt: Readonly<Record<keyof typeof SaltType, string>> = {
|
|||||||
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||||
PROD: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
PROD: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||||
};
|
};
|
||||||
const UserAgent: Readonly<string> = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) miHoYoBBS/${BBS_VERSION}`;
|
const UserAgent: Readonly<string> = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) miHoYoBBS/${TGBbs.version}`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取随机数
|
* @description 获取随机数
|
||||||
@@ -126,7 +126,7 @@ export function getRequestHeader(
|
|||||||
): Record<string, string> {
|
): Record<string, string> {
|
||||||
return {
|
return {
|
||||||
"user-agent": UserAgent,
|
"user-agent": UserAgent,
|
||||||
"x-rpc-app_version": BBS_VERSION,
|
"x-rpc-app_version": TGBbs.version,
|
||||||
"x-rpc-client_type": "5",
|
"x-rpc-client_type": "5",
|
||||||
"x-requested-with": "com.mihoyo.hyperion",
|
"x-requested-with": "com.mihoyo.hyperion",
|
||||||
referer: "https://webstatic.mihoyo.com",
|
referer: "https://webstatic.mihoyo.com",
|
||||||
|
|||||||
Reference in New Issue
Block a user