feat: add HTTP entry link and fix frontend build
这个提交包含在:
2
.env
2
.env
@@ -15,6 +15,8 @@ NEXT_PUBLIC_API_BASE=/admin139
|
|||||||
|
|
||||||
# Next.js 服务端反代用(可选)
|
# Next.js 服务端反代用(可选)
|
||||||
BACKEND_INTERNAL_URL=http://backend:8080
|
BACKEND_INTERNAL_URL=http://backend:8080
|
||||||
|
# 页面右上角“IP+端口访问”按钮地址
|
||||||
|
NEXT_PUBLIC_HTTP_ENTRY_URL=http://8.211.173.24:7888/
|
||||||
|
|
||||||
# ===== OI 题库导入(LLM 识别)=====
|
# ===== OI 题库导入(LLM 识别)=====
|
||||||
# 对应 scripts/import_winterant_oi.py 的可选识别配置
|
# 对应 scripts/import_winterant_oi.py 的可选识别配置
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
|
|
||||||
import { PixelAvatar } from "@/components/pixel-avatar";
|
import { PixelAvatar } from "@/components/pixel-avatar";
|
||||||
import { apiFetch } from "@/lib/api";
|
import { apiFetch, listRatingHistory, type RatingHistoryItem } from "@/lib/api";
|
||||||
import { readToken } from "@/lib/auth";
|
import { readToken } from "@/lib/auth";
|
||||||
import { useI18nText } from "@/lib/i18n";
|
import { useI18nText } from "@/lib/i18n";
|
||||||
|
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ export function AppNav() {
|
|||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { theme, setTheme, language, setLanguage, themes, t } = useUiPreferences();
|
const { theme, setTheme, language, setLanguage, themes, t } = useUiPreferences();
|
||||||
|
const directHttpAccessUrl =
|
||||||
|
process.env.NEXT_PUBLIC_HTTP_ENTRY_URL?.trim() || "http://8.211.173.24:7888/";
|
||||||
|
|
||||||
const [hasToken, setHasToken] = useState<boolean>(() => Boolean(readToken()));
|
const [hasToken, setHasToken] = useState<boolean>(() => Boolean(readToken()));
|
||||||
const [isAdmin, setIsAdmin] = useState(false);
|
const [isAdmin, setIsAdmin] = useState(false);
|
||||||
@@ -384,6 +386,15 @@ export function AppNav() {
|
|||||||
<option value="zh">{t("prefs.lang.zh")}</option>
|
<option value="zh">{t("prefs.lang.zh")}</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
<a
|
||||||
|
href={directHttpAccessUrl}
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
className="rounded-md border px-2 py-1 text-xs hover:bg-zinc-100 sm:text-sm"
|
||||||
|
title={directHttpAccessUrl}
|
||||||
|
>
|
||||||
|
{t("nav.link.http_ip_port")}
|
||||||
|
</a>
|
||||||
<span className={hasToken ? "text-emerald-700" : "text-zinc-500"}>
|
<span className={hasToken ? "text-emerald-700" : "text-zinc-500"}>
|
||||||
{hasToken ? t("nav.logged_in") : t("nav.logged_out")}
|
{hasToken ? t("nav.logged_in") : t("nav.logged_out")}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export const enMessages: ThemeMessages = {
|
|||||||
"nav.link.api_docs": "API Docs",
|
"nav.link.api_docs": "API Docs",
|
||||||
"nav.link.auth": "Sign In",
|
"nav.link.auth": "Sign In",
|
||||||
"nav.link.me": "My Account",
|
"nav.link.me": "My Account",
|
||||||
|
"nav.link.http_ip_port": "HTTP (IP:Port)",
|
||||||
|
|
||||||
"mobile.tab.problems": "Problems",
|
"mobile.tab.problems": "Problems",
|
||||||
"mobile.tab.submissions": "Submits",
|
"mobile.tab.submissions": "Submits",
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export const zhMessages: ThemeMessages = {
|
|||||||
"nav.link.api_docs": "API文档",
|
"nav.link.api_docs": "API文档",
|
||||||
"nav.link.auth": "登录",
|
"nav.link.auth": "登录",
|
||||||
"nav.link.me": "我的",
|
"nav.link.me": "我的",
|
||||||
|
"nav.link.http_ip_port": "IP+端口访问",
|
||||||
|
|
||||||
"mobile.tab.problems": "题库",
|
"mobile.tab.problems": "题库",
|
||||||
"mobile.tab.submissions": "提交",
|
"mobile.tab.submissions": "提交",
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export const enMessages: ThemeMessages = {
|
|||||||
"nav.link.api_docs": "Redstone Logic",
|
"nav.link.api_docs": "Redstone Logic",
|
||||||
"nav.link.auth": "Login to Server",
|
"nav.link.auth": "Login to Server",
|
||||||
"nav.link.me": "Character Sheet",
|
"nav.link.me": "Character Sheet",
|
||||||
|
"nav.link.http_ip_port": "HTTP (IP:Port)",
|
||||||
|
|
||||||
"mobile.tab.problems": "Quests",
|
"mobile.tab.problems": "Quests",
|
||||||
"mobile.tab.submissions": "History",
|
"mobile.tab.submissions": "History",
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export const zhMessages: ThemeMessages = {
|
|||||||
"nav.link.api_docs": "红石电路图",
|
"nav.link.api_docs": "红石电路图",
|
||||||
"nav.link.auth": "登录服务器",
|
"nav.link.auth": "登录服务器",
|
||||||
"nav.link.me": "角色面板",
|
"nav.link.me": "角色面板",
|
||||||
|
"nav.link.http_ip_port": "IP+端口访问",
|
||||||
|
|
||||||
"mobile.tab.problems": "任务",
|
"mobile.tab.problems": "任务",
|
||||||
"mobile.tab.submissions": "日志",
|
"mobile.tab.submissions": "日志",
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户