mirror of
https://github.com/hpware/news-analyze.git
synced 2025-06-23 07:41:02 +08:00
Compare commits
2 Commits
5392974261
...
3ebaff5218
Author | SHA1 | Date | |
---|---|---|---|
3ebaff5218 | |||
8eb19d7242 |
@ -34,6 +34,7 @@ const switchTabs = ref(false);
|
|||||||
const tabs = ref([]);
|
const tabs = ref([]);
|
||||||
const primary = ref<string>("top"); // Hard code value fn
|
const primary = ref<string>("top"); // Hard code value fn
|
||||||
const canNotLoadTabUI = ref(false);
|
const canNotLoadTabUI = ref(false);
|
||||||
|
const isDataCached = ref(false);
|
||||||
const pullTabsData = async () => {
|
const pullTabsData = async () => {
|
||||||
try {
|
try {
|
||||||
const req = await fetch("/api/tabs");
|
const req = await fetch("/api/tabs");
|
||||||
@ -60,6 +61,7 @@ const updateContent = async (url: string, tabAction: boolean) => {
|
|||||||
if (data) {
|
if (data) {
|
||||||
contentArray.value = [...data.uuidData, ...(data.nuuiddata?.items || [])];
|
contentArray.value = [...data.uuidData, ...(data.nuuiddata?.items || [])];
|
||||||
switchTabs.value = false;
|
switchTabs.value = false;
|
||||||
|
isDataCached.value = data.cached || false;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
@ -1,28 +1,81 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const user = ref();
|
import { BadgeCheckIcon, OctagonAlertIcon } from "lucide-vue-next";
|
||||||
const userToken = localStorage.getItem("token");
|
import { Input } from "~/components/ui/input";
|
||||||
const { t, locale } = useI18n();
|
const { t, locale } = useI18n();
|
||||||
|
const user = ref();
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const req = await fetch("/api/user/validateUserToken", {
|
const req = await fetch("/api/user/validateUserToken");
|
||||||
method: "POST",
|
const res = await req.json();
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
token: userToken,
|
|
||||||
lang: locale,
|
|
||||||
page: "settings",
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
const res = req.json();
|
|
||||||
user.value = res;
|
user.value = res;
|
||||||
});
|
});
|
||||||
|
|
||||||
const logoutAction = () => {};
|
const logoutAction = () => {};
|
||||||
|
const groqApiKeyRegex = /^gsk_[a-zA-Z0-9]{52}$/;
|
||||||
|
const customApiKey = ref();
|
||||||
|
const isCorrect = ref(false);
|
||||||
|
const submitCustomApiKey = async () => {
|
||||||
|
if (!isCorrect.value) {
|
||||||
|
checkValidApiKey();
|
||||||
|
if (!isCorrect.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const apiKey = customApiKey.value;
|
||||||
|
try {
|
||||||
|
const sendApi = await fetch("/api/ai/loadCustomGroqApi", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
apiKey: apiKey,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
const data = await sendApi.json();
|
||||||
|
if (data.error) {
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const checkValidApiKey = () => {
|
||||||
|
const apiKey = customApiKey.value;
|
||||||
|
if (!apiKey) {
|
||||||
|
isCorrect.value = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isCorrect.value = groqApiKeyRegex.test(apiKey);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div class="justify-center align-center text-center">
|
<div class="justify-center align-center text-center">
|
||||||
<div class="">Greetings, {{ user }}</div>
|
<div class="">Greetings, {{ user }}</div>
|
||||||
|
<div class="flex flex-row text-center align-center justify-center">
|
||||||
|
<span class="text-md p-1 text-nowrap">Your Groq API: </span>
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
class="h-6 m-1 py-3 rounded"
|
||||||
|
v-model="customApiKey"
|
||||||
|
placeholder="gsk_..."
|
||||||
|
v-on:mouseover="checkValidApiKey"
|
||||||
|
v-on:keypress="checkValidApiKey"
|
||||||
|
v-on:mouseleave="checkValidApiKey"
|
||||||
|
/>
|
||||||
|
<!--If it is a valid api key or not.-->
|
||||||
|
<BadgeCheckIcon
|
||||||
|
v-if="isCorrect"
|
||||||
|
class="w-8 h-8 p-1/2 mr-1 text-green-700"
|
||||||
|
/>
|
||||||
|
<OctagonAlertIcon
|
||||||
|
v-if="!isCorrect"
|
||||||
|
class="w-8 h-8 p-1/2 mr-1 text-red-700"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
class="p-1 text-sm bg-gray-400/60 rounded"
|
||||||
|
@click="submitCustomApiKey"
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<div class="bg-gray-200/70 p-2 m-2 w-full">
|
<div class="bg-gray-200/70 p-2 m-2 w-full">
|
||||||
<button @click="logoutAction">Logout</button>
|
<button @click="logoutAction">Logout</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,7 +29,6 @@ const submitUserPassword = async () => {
|
|||||||
|
|
||||||
if (!res.error) {
|
if (!res.error) {
|
||||||
error.value = false;
|
error.value = false;
|
||||||
localStorage.setItem("token", res.token);
|
|
||||||
success.value = true;
|
success.value = true;
|
||||||
console.log(res);
|
console.log(res);
|
||||||
userAccount.value = "";
|
userAccount.value = "";
|
||||||
|
@ -9,20 +9,8 @@ const emit = defineEmits(["windowopener", "error", "loadValue"]);
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// 喔 我沒有加 await :( 難怪有問題
|
// 喔 我沒有加 await :( 難怪有問題
|
||||||
const token = localStorage.getItem("token");
|
|
||||||
const { data, error: sendError } = await useFetch(
|
const { data, error: sendError } = await useFetch(
|
||||||
"/api/user/validateUserToken",
|
"/api/user/validateUserToken",
|
||||||
{
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
token: token,
|
|
||||||
lang: locale,
|
|
||||||
page: "a_window_application_using_blurPageBeforeLogin_component",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
if (sendError.value) {
|
if (sendError.value) {
|
||||||
error.value = true;
|
error.value = true;
|
||||||
|
@ -269,7 +269,6 @@ const navBarDisplayText = (text: string) => {
|
|||||||
}
|
}
|
||||||
const trimSpaces = text.trim();
|
const trimSpaces = text.trim();
|
||||||
const regex = /.{0,7}/;
|
const regex = /.{0,7}/;
|
||||||
console.log("asdasda");
|
|
||||||
if (trimSpaces.length <= 7) {
|
if (trimSpaces.length <= 7) {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
21
server/api/ai/loadCustomGroqApi.ts
Normal file
21
server/api/ai/loadCustomGroqApi.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import sql from "~/server/components/postgres";
|
||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
if (event.method !== "POST") {
|
||||||
|
return {
|
||||||
|
error: "ERR_METHOD_NOT_ALLOWED",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const body = readBody(event);
|
||||||
|
if (!body.apiKey) {
|
||||||
|
return {
|
||||||
|
error: "ERR_API_KEY_REQUIRED",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const readUserToken = getCookie(event, "token");
|
||||||
|
if (!readUserToken) {
|
||||||
|
return {
|
||||||
|
error: "ERR_NOT_USER_LOGIN",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const checkUser = await sql``;
|
||||||
|
});
|
@ -28,16 +28,30 @@ export default defineEventHandler(async (event) => {
|
|||||||
html("div.editor div figure img").attr("srcset") ||
|
html("div.editor div figure img").attr("srcset") ||
|
||||||
html("div.editor div figure img").attr("src") ||
|
html("div.editor div figure img").attr("src") ||
|
||||||
"";
|
"";
|
||||||
|
const bgImage = html("figure.keyVisual img").attr("srcset") || "";
|
||||||
const articles = [];
|
const articles = [];
|
||||||
const otherArticles = html("section.moduleContainer div");
|
const regexArticleLinks = /[a-zA-Z0-9]{7}/g
|
||||||
for (const item in otherArticles) {
|
const otherArticles = <any[]>[];
|
||||||
|
html("a.ltcp-link")
|
||||||
}
|
.each((i, element) => {
|
||||||
|
const articleLink = html(element).attr("href");
|
||||||
|
const articleTitle = html(element).find("h3.header").text();
|
||||||
|
const date = html(element).find("div._articleCard div.css-wqleh6 span").text();
|
||||||
|
if (articleLink && articleTitle) {
|
||||||
|
const articleSlug = articleLink.matchAll(regexArticleLinks);
|
||||||
|
otherArticles.push({
|
||||||
|
index: i,
|
||||||
|
title: articleTitle,
|
||||||
|
link: articleSlug,
|
||||||
|
date: date,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
name: newsOrgName,
|
name: newsOrgName,
|
||||||
description: description,
|
description: description,
|
||||||
logo: logo,
|
logo: logo,
|
||||||
articles: []
|
articles: otherArticles,
|
||||||
};
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
@ -68,9 +68,9 @@ export default defineEventHandler(async (event) => {
|
|||||||
INSERT INTO usertokens (user, token)
|
INSERT INTO usertokens (user, token)
|
||||||
VALUES ('${fetchUserInfo[0].username}', '${newToken}')
|
VALUES ('${fetchUserInfo[0].username}', '${newToken}')
|
||||||
`;
|
`;
|
||||||
|
setCookie(event, "token", newToken);
|
||||||
return {
|
return {
|
||||||
user: fetchUserInfoAgain,
|
user: fetchUserInfoAgain,
|
||||||
token: newToken,
|
|
||||||
};
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
@ -4,12 +4,7 @@ export default defineEventHandler(async (event) => {
|
|||||||
const nowDate = new Date().toLocaleString();
|
const nowDate = new Date().toLocaleString();
|
||||||
try {
|
try {
|
||||||
if (loginCookie) {
|
if (loginCookie) {
|
||||||
deleteCookie(event, "session");
|
deleteCookie(event, "token");
|
||||||
setCookie(event, "lastCheckCookie", nowDate, {
|
|
||||||
httpOnly: true,
|
|
||||||
secure: process.env.NODE_ENV === "production",
|
|
||||||
path: "/",
|
|
||||||
});
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
error: null,
|
error: null,
|
||||||
|
@ -2,11 +2,11 @@ import sql from "~/server/components/postgres";
|
|||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const body = await readBody(event);
|
const body = await readBody(event);
|
||||||
const token = body.token;
|
const token = getCookie(event, "token");
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return {
|
return {
|
||||||
error: "NO_TOKEN_GIVEN",
|
error: "INVALID_TOKEN",
|
||||||
requested_action: "SHOW_WARNING",
|
requested_action: "LOGOUT_USER",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const checkIsUUIDRegex =
|
const checkIsUUIDRegex =
|
||||||
|
Loading…
x
Reference in New Issue
Block a user