mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-12 09:18:14 +08:00
🌱 点赞
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
/**
|
/**
|
||||||
* @file utils/TGBbs.ts
|
* @file utils/TGBbs.ts
|
||||||
* @description 关于 BBS 的工具函数
|
* @description 关于 BBS 的工具函数
|
||||||
* @since Beta v0.6.10
|
* @since Beta v0.6.10/v0.7.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const BBS_VERSION: Readonly<string> = "2.81.1";
|
const BBS_VERSION: Readonly<string> = "2.82.0";
|
||||||
const BBS_UA_MOBILE: Readonly<string> = `Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBS/${BBS_VERSION}`;
|
const BBS_UA_MOBILE: Readonly<string> = `Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBS/${BBS_VERSION}`;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,12 +12,15 @@ import TSwitchTheme from "@comp/app/t-switchTheme.vue";
|
|||||||
import showLoading from "@comp/func/loading.js";
|
import showLoading from "@comp/func/loading.js";
|
||||||
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 { storeToRefs } from "pinia";
|
||||||
import { onMounted, ref, shallowRef } from "vue";
|
import { onMounted, ref, shallowRef } from "vue";
|
||||||
import JsonViewer from "vue-json-viewer";
|
import JsonViewer from "vue-json-viewer";
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
|
import { useUserStore } from "@/store/modules/user.js";
|
||||||
import TGLogger from "@/utils/TGLogger.js";
|
import TGLogger from "@/utils/TGLogger.js";
|
||||||
|
|
||||||
|
const { cookie } = storeToRefs(useUserStore());
|
||||||
const postId = Number(useRoute().params.post_id);
|
const postId = Number(useRoute().params.post_id);
|
||||||
const isEmpty = ref<boolean>(false);
|
const isEmpty = ref<boolean>(false);
|
||||||
const jsonData = shallowRef<TGApp.Plugins.Mys.Post.FullData>();
|
const jsonData = shallowRef<TGApp.Plugins.Mys.Post.FullData>();
|
||||||
@@ -29,7 +32,9 @@ onMounted(async () => {
|
|||||||
await showLoading.empty("未获取到PostID");
|
await showLoading.empty("未获取到PostID");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const resp = await Mys.Post.getPostFull(postId);
|
let ck: Record<string, string> | undefined = undefined;
|
||||||
|
if (cookie.value) ck = { ltoken: cookie.value.ltoken, ltuid: cookie.value.ltuid };
|
||||||
|
const resp = await Mys.Post.getPostFull(postId, ck);
|
||||||
if ("retcode" in resp) {
|
if ("retcode" in resp) {
|
||||||
await showLoading.empty("获取数据失败", `[${resp.retcode}]${resp.message}`);
|
await showLoading.empty("获取数据失败", `[${resp.retcode}]${resp.message}`);
|
||||||
showSnackbar.error(`[${resp.retcode}]${resp.message}`);
|
showSnackbar.error(`[${resp.retcode}]${resp.message}`);
|
||||||
|
|||||||
@@ -27,7 +27,12 @@
|
|||||||
<v-icon>mdi-comment</v-icon>
|
<v-icon>mdi-comment</v-icon>
|
||||||
<span>{{ postData?.stat?.reply_num }}</span>
|
<span>{{ postData?.stat?.reply_num }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="mpm-item" :title="`点赞数:${postData?.stat?.like_num}`">
|
<div
|
||||||
|
class="mpm-item"
|
||||||
|
:title="`点赞数:${postData?.stat?.like_num}`"
|
||||||
|
@click="tryLike()"
|
||||||
|
:class="{ like: isLike }"
|
||||||
|
>
|
||||||
<v-icon>mdi-thumb-up</v-icon>
|
<v-icon>mdi-thumb-up</v-icon>
|
||||||
<span>{{ postData?.stat?.like_num }}</span>
|
<span>{{ postData?.stat?.like_num }}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -97,17 +102,22 @@ import VpOverlayCollection from "@comp/viewPost/vp-overlay-collection.vue";
|
|||||||
import Mys from "@Mys/index.js";
|
import Mys from "@Mys/index.js";
|
||||||
import { app, webviewWindow } from "@tauri-apps/api";
|
import { app, webviewWindow } from "@tauri-apps/api";
|
||||||
import { emit } from "@tauri-apps/api/event";
|
import { emit } from "@tauri-apps/api/event";
|
||||||
|
import { storeToRefs } from "pinia";
|
||||||
import { onMounted, onUnmounted, ref, shallowRef } from "vue";
|
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 { useUserStore } from "@/store/modules/user.js";
|
||||||
import TGBbs from "@/utils/TGBbs.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 apiHubReq from "@/web/request/apiHubReq.js";
|
||||||
|
|
||||||
|
const { cookie } = storeToRefs(useUserStore());
|
||||||
const appVersion = ref<string>();
|
const appVersion = ref<string>();
|
||||||
const postId = Number(useRoute().params.post_id);
|
const postId = Number(useRoute().params.post_id);
|
||||||
const showCollection = ref<boolean>(false);
|
const showCollection = ref<boolean>(false);
|
||||||
|
const isLike = ref<boolean>(false);
|
||||||
const shareTime = ref<number>(Math.floor(Date.now() / 1000));
|
const shareTime = ref<number>(Math.floor(Date.now() / 1000));
|
||||||
const renderPost = shallowRef<Array<TGApp.Plugins.Mys.SctPost.Base>>([]);
|
const renderPost = shallowRef<Array<TGApp.Plugins.Mys.SctPost.Base>>([]);
|
||||||
const postData = shallowRef<TGApp.Plugins.Mys.Post.FullData>();
|
const postData = shallowRef<TGApp.Plugins.Mys.Post.FullData>();
|
||||||
@@ -131,7 +141,9 @@ onMounted(async () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await showLoading.update(`帖子ID: ${postId}`);
|
await showLoading.update(`帖子ID: ${postId}`);
|
||||||
const resp = await Mys.Post.getPostFull(postId);
|
let ck: undefined | Record<string, string>;
|
||||||
|
if (cookie.value) ck = { ltoken: cookie.value.ltoken, ltuid: cookie.value.ltuid };
|
||||||
|
const resp = await Mys.Post.getPostFull(postId, ck);
|
||||||
if ("retcode" in resp) {
|
if ("retcode" in resp) {
|
||||||
await showLoading.empty("数据加载失败", `[${resp.retcode}]${resp.message}`);
|
await showLoading.empty("数据加载失败", `[${resp.retcode}]${resp.message}`);
|
||||||
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
|
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
|
||||||
@@ -140,6 +152,7 @@ onMounted(async () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
postData.value = resp;
|
postData.value = resp;
|
||||||
|
isLike.value = postData.value.self_operation.upvote_type !== 0;
|
||||||
await showLoading.update("正在渲染数据");
|
await showLoading.update("正在渲染数据");
|
||||||
renderPost.value = await getRenderPost(postData.value);
|
renderPost.value = await getRenderPost(postData.value);
|
||||||
await webviewWindow
|
await webviewWindow
|
||||||
@@ -242,6 +255,26 @@ async function createPostJson(postId: number): Promise<void> {
|
|||||||
await createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false);
|
await createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function tryLike(): Promise<void> {
|
||||||
|
if (!cookie.value) {
|
||||||
|
showSnackbar.error("请先登录");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!postData.value) {
|
||||||
|
showSnackbar.error("数据未加载");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const ck = { ltoken: cookie.value.ltoken, ltuid: cookie.value.ltuid };
|
||||||
|
const resp = await apiHubReq.post.like(postData.value.post.post_id, ck, isLike.value);
|
||||||
|
if (resp.retcode !== 0) {
|
||||||
|
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isLike.value = !isLike.value;
|
||||||
|
postData.value.stat!.like_num += isLike.value ? 1 : -1;
|
||||||
|
showSnackbar.success(isLike.value ? "点赞成功" : "取消点赞成功");
|
||||||
|
}
|
||||||
|
|
||||||
function toPost(): void {
|
function toPost(): void {
|
||||||
const channel = TGBbs.channels.find((item) => item.gid === postData.value?.post.game_id);
|
const channel = TGBbs.channels.find((item) => item.gid === postData.value?.post.game_id);
|
||||||
if (channel) {
|
if (channel) {
|
||||||
@@ -380,6 +413,10 @@ onUnmounted(() => {
|
|||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
column-gap: 2px;
|
column-gap: 2px;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
|
|
||||||
|
&.like {
|
||||||
|
color: var(--tgc-pink-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* extra */
|
/* extra */
|
||||||
|
|||||||
@@ -103,12 +103,38 @@ async function homeNew(gid: number = 2): Promise<TGApp.BBS.Navigator.Navigator[]
|
|||||||
).data.navigator;
|
).data.navigator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 点赞
|
||||||
|
* @since Beta v0.6.10/v0.7.0
|
||||||
|
* @param {string} id 帖子 ID
|
||||||
|
* @param {Record<string,string>} cookie 用户 Cookie
|
||||||
|
* @param {boolean} cancel 是否取消点赞
|
||||||
|
* @return {Promise<TGApp.BBS.Response.Base>}
|
||||||
|
*/
|
||||||
|
async function upVotePost(
|
||||||
|
id: string,
|
||||||
|
cookie: Record<string, string>,
|
||||||
|
cancel: boolean = false,
|
||||||
|
): Promise<TGApp.BBS.Response.Base> {
|
||||||
|
const data = { is_cancel: cancel, post_id: id };
|
||||||
|
const header = {
|
||||||
|
...getRequestHeader(cookie, "POST", data, "K2", true),
|
||||||
|
"x-rpc-client_type": "2",
|
||||||
|
};
|
||||||
|
return await TGHttp<TGApp.BBS.Response.Base>(`${Mahbu}api/upvotePost`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: header,
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const apiHubReq = {
|
const apiHubReq = {
|
||||||
vote: { info: getVotes, result: getVoteResult },
|
vote: { info: getVotes, result: getVoteResult },
|
||||||
home: homeNew,
|
home: homeNew,
|
||||||
forum: getAllGamesForums,
|
forum: getAllGamesForums,
|
||||||
game: getGameList,
|
game: getGameList,
|
||||||
mission: getMissions,
|
mission: getMissions,
|
||||||
|
post: { like: upVotePost },
|
||||||
};
|
};
|
||||||
|
|
||||||
export default apiHubReq;
|
export default apiHubReq;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file web/utils/getRequestHeader.ts
|
* @file web/utils/getRequestHeader.ts
|
||||||
* @description 获取请求头
|
* @description 获取请求头
|
||||||
* @since Beta v0.6.8
|
* @since Beta v0.6.10/v0.7.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import Md5 from "js-md5";
|
import Md5 from "js-md5";
|
||||||
@@ -24,12 +24,12 @@ const enum SaltType {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @description salt 值
|
* @description salt 值
|
||||||
* @version 2.81.1
|
* @version 2.82.0
|
||||||
* @since Beta v0.6.10
|
* @since Beta v0.6.10/v0.7.0
|
||||||
*/
|
*/
|
||||||
const Salt: Readonly<Record<keyof typeof SaltType, string>> = {
|
const Salt: Readonly<Record<keyof typeof SaltType, string>> = {
|
||||||
K2: "QVu5OdwEWxkq9ygpYBgDprR5tI471HWQ",
|
K2: "RGcLwIWYOQwTQPJ8Qw41kioel738ch3Z",
|
||||||
LK2: "aquFmwOjyqev4CAL6GQ2v5mdkxpCVXCY",
|
LK2: "1M69A7AaPUhTFCdH0D2iMatZ0MTiLmPf",
|
||||||
X4: "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs",
|
X4: "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs",
|
||||||
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||||
PROD: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
PROD: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||||
|
|||||||
Reference in New Issue
Block a user