feat(tokens): 完成 tokens 的获取

This commit is contained in:
BTMuli
2023-05-04 22:04:55 +08:00
parent bc118a11c0
commit 683500fe2a
6 changed files with 159 additions and 9 deletions

View File

@@ -2,16 +2,20 @@
* @file core request TGRequest.ts
* @description 应用用到的请求函数
* @author BTMuli<bt-muli@outlook.com>
* @since Alpha v0.1.2
* @since Alpha v0.2.0
*/
import { getAnnoList, getAnnoContent } from "./getAnno";
import { getTokens } from "./getTokens";
const TGRequest = {
Anno: {
getList: getAnnoList,
getContent: getAnnoContent,
},
User: {
getTokens,
},
};
export default TGRequest;

View File

@@ -2,21 +2,24 @@
* @file core request getTokens.ts
* @description 获取游戏 Token
* @author BTMuli<bt-muli@outlook.com>
* @since Alpha v0.1.3
* @since Alpha v0.2.0
*/
// tauri
import { http } from "@tauri-apps/api";
// api
import TGApi from "../api/TGApi";
// utils
import { getRequestHeader } from "../utils/getRequestHeader";
export async function getTokens (cookie: Record<string, string>): Promise<unknown> {
export async function getTokens (cookie: BTMuli.User.Base.Cookie): Promise<BTMuli.User.Base.TokenItem[] | BTMuli.Genshin.Base.Response> {
const url = `${TGApi.GameTokens}?login_ticket=${cookie.login_ticket}&token_types=3&uid=${cookie.login_uid}`;
const header = getRequestHeader(cookie);
return await http.fetch(url, {
return await http.fetch<BTMuli.User.Response.Token>(url, {
method: "GET",
headers: header,
}).then((res) => {
console.log(res.data);
return res.data;
if (res.data.retcode !== 0) return res.data;
return res.data.data.list;
});
}

View File

@@ -2,10 +2,10 @@
* @file core utils getRequestHeader.ts
* @description 获取请求头
* @author BTMuli<bt-muli@outlook.com>
* @since Alpha v0.1.3
* @since Alpha v0.2.0
*/
export function getRequestHeader (cookie: Record<string, string>): Record<string, string> {
export function getRequestHeader (cookie: BTMuli.User.Base.Cookie): Record<string, string> {
const header = {
"User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.34 Tauri.Genshin/0.1.2",
"x-rpc-app_version": "2.0.0",

View File

@@ -1,6 +1,65 @@
<template>
<h1>用户页</h1>
<div class="testDiv">
<v-btn @click="getTokens">
获取 Tokens
</v-btn>
<v-btn @click="saveToken">
保存 Token 到数据库
</v-btn>
</div>
</template>
<script setup lang="ts">
// vue
import { onMounted, ref } from "vue";
// tauri
import { dialog } from "@tauri-apps/api";
// utils
import TGRequest from "../core/request/TGRequest";
import TGSqlite from "../utils/TGSqlite";
const cookie = ref({} as BTMuli.User.Base.Cookie);
const tokens = ref([] as BTMuli.User.Base.TokenItem[]);
export interface tokenRes {
name: string;
token: string;
}
onMounted(async () => {
cookie.value = JSON.parse(await TGSqlite.getCookie()) as BTMuli.User.Base.Cookie;
});
async function getTokens () {
const tokenRes = await TGRequest.User.getTokens(cookie.value);
if (Array.isArray(tokenRes)) tokens.value = tokenRes;
else {
console.log(tokenRes);
tokens.value = [];
await dialog.message(
tokenRes.message,
{
type: "error",
title: `获取 Token 失败,retcode: ${tokenRes.retcode}`,
},
);
}
}
async function saveToken () {
console.log(tokens.value);
const lToken = tokens.value.find((item) => item.name === "ltoken");
const sToken = tokens.value.find((item) => item.name === "stoken");
if (lToken) await TGSqlite.saveAppData("ltoken", lToken.token);
if (sToken) await TGSqlite.saveAppData("stoken", sToken.token);
console.log("保存成功");
}
</script>
<style scoped></style>
<style scoped>
.testDiv {
display: flex;
flex-direction: row;
justify-content: space-around;
}
</style>

66
src/types/UserRequest.d.ts vendored Normal file
View File

@@ -0,0 +1,66 @@
/**
* @file types UserRequest.d.ts
* @description 用户请求相关类型定义文件
* @author BTMuli<bt-muli@outlook.com>
* @since Alpha v0.2.0
*/
declare namespace BTMuli.User.Base {
/**
* @description 用户 cookie 类型
* @since Alpha v0.2.0
* @description 这边只写了需要的,其他的可以自行添加
* @interface Cookie
* @property {string} login_ticket 登录凭证
* @property {string} login_uid 登录 UID
* @property {string} DEVICEFP 设备指纹
* @returns Cookie
*/
export interface Cookie {
login_ticket: string
login_uid: string
DEVICEFP: string
}
/**
* @description 游戏 Token
* @since Alpha v0.2.0
* @interface TokenItem
* @property {TokenType} name 游戏 Token 名称
* @property {string} token 游戏 Token
* @returns TokenItem
*/
export interface TokenItem {
name: TokenType
token: string
}
/**
* @description 游戏 Token 类型
* @since Alpha v0.2.0
* @enum {string}
* @property {string} ltoken longTime Token
* @property {string} stoken shortTime Token
* @returns string
*/
export enum TokenType {
LToken = "ltoken",
SToken = "stoken",
}
}
declare namespace BTMuli.User.Response {
/**
* @description 获取 ltoken 跟 stoken 的响应
* @since Alpha v0.2.0
* @interface Token
* @extends {BTMuli.Genshin.Base.Response}
* @property {TokenItem[]} data.list 游戏 Token
* @returns {Token}
*/
export interface Token extends BTMuli.Genshin.Base.Response {
data: {
list: TokenItem[]
}
}
}

View File

@@ -98,6 +98,24 @@ class TGSqlite {
return res[0].value;
}
/**
* @description 保存 appData
* @memberof TGSqlite
* @since Alpha v0.2.0
* @param {string} key
* @param {string} value
* @returns {Promise<void>}
*/
public async saveAppData (key: string, value: string): Promise<void> {
const db = await Database.load(this.dbPath);
const sql = `
INSERT INTO AppData (key, value, updated)
VALUES ('${key}', '${value}', datetime('now', 'localtime'))
ON CONFLICT(key) DO UPDATE SET value = '${value}', updated = datetime('now', 'localtime');`;
await db.execute(sql);
await db.close();
}
/**
* @description 已有数据表跟触发器不变的情况下,更新数据库数据
* @memberof TGSqlite