Files
90CNServer/launcher/index.html
T
hanfuit 0ced464168 启动器新增游戏设置页(频道开关+活动开关),窗口标题改名
- 服务端新增活动开关运行时配置与 GM 接口(GET/POST /dnf/gm/activity-switches),
  持久化到 Settings,接入月签到/周签到/PC房↔累计在线的实时下发
- 服务端新增频道开关 GM 接口(channel-switches),目录生成时过滤禁用频道
- channelcatalog/channelinfo 支持按禁用频道 ID 过滤目录与客户端脚本
- 启动器新增「游戏设置」页面:频道开关 Tab + 活动开关 Tab
- native.py/server.py 新增对应转发 API
- 窗口标题/页面 title/侧边栏「90轮回」统一改为「DNF90 灵狐小竹整合单机版」
2026-11-04 20:08:50 +08:00

189 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DNF90 灵狐小竹整合单机版</title>
<link rel="stylesheet" href="/style.css">
<link rel="stylesheet" href="/shell.css">
</head>
<body>
<!-- 兼容旧 app.js 的隐藏控件 -->
<div id="launcherView" class="hidden" aria-hidden="true">
<div id="logBody"></div>
<span id="statusBadge"><span id="statusText"></span></span>
<span id="footInfo"></span>
<button id="btnStart"></button><button id="btnGm"></button><button id="btnStop"></button>
<button id="btnSponsor"></button><button id="btnWinLoadout"></button><button id="btnWinSetting"></button>
<button id="btnClearLog"></button>
</div>
<div id="appShell">
<header class="shell-topnav">
<div class="shell-brand">
<div class="shell-logo">90</div>
<div><b>灵狐小竹</b><span>启动器 <em>v2.1.0</em></span></div>
</div>
<nav class="shell-nav">
<button class="shell-nav-item active" data-shell-page="start"><span class="nav-ico">▶</span>开始</button>
<button class="shell-nav-item" data-shell-page="gm"><span class="nav-ico">⚙</span>GM工具</button>
<button class="shell-nav-item" data-shell-page="loadout"><span class="nav-ico">🔄</span>一键换装</button>
<button class="shell-nav-item" data-shell-page="gamesettings"><span class="nav-ico">🎮</span>游戏设置</button>
<div class="shell-nav-gap"></div>
<button class="shell-nav-item" data-shell-page="settings"><span class="nav-ico">⚙</span>设置</button>
<button class="shell-nav-item" data-shell-page="changelog"><span class="nav-ico">📜</span>游戏更新</button>
</nav>
<div class="shell-win-controls">
<button class="tb-btn" id="shellWinMin" title="最小化">—</button>
<button class="tb-btn tb-close" id="shellWinClose" title="关闭">×</button>
</div>
</header>
<main class="shell-main">
<header class="shell-topbar">
<div class="shell-crumb" id="shellCrumb">开始 / 本地服务端</div>
</header>
<section class="shell-page active" id="page-start">
<div class="hero">
<div class="hero-bg"></div>
<div class="hero-content">
<div class="hero-kicker">DNF · 90级 · 本地服务端</div>
<h1 id="shellServerName">DNF90 灵狐小竹整合单机版</h1>
<div class="hero-status">
<span class="live-dot" id="shellStatusDot"></span>
<span id="shellStatusText">检测中…</span>
<span class="muted" id="shellPid">PID —</span>
</div>
<div class="hero-actions">
<button class="start-btn" id="shellStart"><span>▶</span> 开始游戏</button>
<button class="start-menu" id="shellStartMenu">▾</button>
<div class="start-menu-pop hidden" id="shellStartPop">
<button data-shell-action="start">启动服务端并登录</button>
<button data-shell-action="launch">仅启动客户端</button>
<button data-shell-action="stop">关闭服务端</button>
</div>
<button class="account-login" id="shellAccount" title="管理并选择游戏账号">
<span class="account-ico">👤</span>
<span><b>账号管理</b><small id="shellAccountName">加载中…</small></span>
</button>
<div class="account-picker">
<span class="account-picker-label">当前登录账号</span>
<select id="shellAccountSelect" title="选择登录账号"></select>
</div>
<button class="stop-server-btn" id="shellStop"><span>■</span> 关闭服务端</button>
</div>
<div class="hero-hint">服务端和客户端会一起启动,首次约 10 秒;切换账号后再点“开始游戏”可多开。</div>
</div>
<div class="hero-clock" id="shellClock">检查于 --:--:--</div>
</div>
<div class="stat-grid">
<div class="stat-card"><div class="stat-label">版本</div><div class="stat-row"><span>本地</span><b id="statVersion">v2026.11.03</b></div><div class="stat-row"><span>远程最新</span><b class="green" id="statRemote">检查中</b></div><div class="stat-row"><span>状态</span><b class="green" id="statState">—</b></div></div>
<div class="stat-card"><div class="stat-label">运行</div><div class="stat-row"><span>客户端</span><b id="statClient">—</b></div><div class="stat-row"><span>游戏端口</span><b id="statPorts">—</b></div><div class="stat-row"><span>资源</span><b id="statResource">—</b></div></div>
<div class="stat-card"><div class="stat-label">数据</div><div class="stat-row"><span>PVF 文件</span><b id="statPvf">—</b></div><div class="stat-row"><span>客户端目录</span><b class="small" id="statClientDir">—</b></div><div class="stat-row"><span>版本记录</span><b id="statDb">—</b></div></div>
<div class="stat-card"><div class="stat-label">工具</div><div class="stat-row"><span>内置 GM</span><b class="green">已开启</b></div><div class="stat-row"><span>GM 端口</span><b id="statGmPort">18111</b></div><div class="stat-row"><span>接口端口</span><b id="statApiPort">19527</b></div></div>
</div>
</section>
<section class="shell-page" id="page-loadout">
<div class="page-pad">
<div class="page-heading"><div><h2>一键换装</h2><p class="muted">方案保存在 LoadoutTool/config.json;全局热键由启动器后端注册。</p></div><button class="shell-btn primary" id="loSaveConfig">保存配置</button></div>
<div class="loadout-layout">
<div class="loadout-side">
<div class="lo-pages" id="loPages"></div>
<div class="lo-list" id="loList"></div>
<div class="lo-side-actions"><button class="shell-btn" id="loAddPage">新增换装页</button><button class="shell-btn" id="loAddScheme">新增方案</button><button class="shell-btn" id="loDeleteScheme">删除方案</button></div>
</div>
<div class="loadout-main">
<div class="lo-form">
<label>方案名称<input id="loName" class="shell-input"></label>
<label>绑定角色<input id="loCharacter" class="shell-input" placeholder="角色游戏内名称"></label>
<label>热键<input id="loHotkey" class="shell-input" placeholder="例如 Ctrl+F1"></label>
<button class="shell-btn" id="loCaptureHotkey">录制热键</button>
</div>
<div class="lo-toolbar"><button class="shell-btn" id="loRefreshChars">刷新角色</button><button class="shell-btn" id="loSaveCurrent">保存当前装备</button><button class="shell-btn primary" id="loApply">应用方案</button><span id="loStatus" class="muted"></span><span id="loCooldown" class="lo-cooldown"></span></div>
<div class="lo-slots" id="loSlots"><div class="empty-box">选择方案后显示装备快照</div></div>
</div>
</div>
</div>
</section>
<section class="shell-page" id="page-settings">
<div class="page-pad">
<div class="page-heading"><div><h2>设置</h2><p class="muted">当前启动器实际绑定的服务端、数据库和游戏端。</p></div><button class="shell-btn" id="setRefresh">刷新</button></div>
<div class="settings-grid">
<div class="settings-card"><div class="settings-label">服务端根目录</div><div class="settings-value" id="setServerRoot">—</div></div>
<div class="settings-card"><div class="settings-label">服务端控制</div><div class="settings-value" id="setControl">—</div></div>
<div class="settings-card"><div class="settings-label">数据库</div><div class="settings-value" id="setDb">—</div></div>
<div class="settings-card"><div class="settings-label">游戏客户端</div><div class="settings-value" id="setClient">—</div></div>
<div class="settings-card"><div class="settings-label">服务端状态</div><div class="settings-value" id="setRun">—</div></div>
<div class="settings-card"><div class="settings-label">Native API</div><div class="settings-value" id="setNative">—</div></div>
</div>
</div>
</section>
<section class="shell-page" id="page-gamesettings">
<div class="page-pad">
<div class="page-heading"><div><h2>游戏设置</h2><p class="muted">调整服务端频道与活动;改动实时生效,无需重启。</p></div><button class="shell-btn" id="gsRefresh">刷新</button></div>
<div class="st-tabs" id="gsTabs">
<button class="st-tab active" data-gs="channels">频道开关</button>
<button class="st-tab" data-gs="activities">活动开关</button>
</div>
<div id="gsChannelsPane">
<div class="gs-summary muted" id="gsChannelSummary">正在加载频道…</div>
<div class="gs-grid" id="gsChannelGrid"><div class="empty-box">加载中…</div></div>
</div>
<div id="gsActivitiesPane" style="display:none">
<div class="gs-summary muted" id="gsActivitySummary">正在加载活动…</div>
<div class="gs-list" id="gsActivityList"><div class="empty-box">加载中…</div></div>
</div>
</div>
</section>
<section class="shell-page" id="page-changelog">
<div class="page-pad"><h2>游戏更新</h2><p class="muted">从自托管仓库(Lingbao/90CNServer)的发布记录自动获取。</p><div id="changelogBody"></div></div>
</section>
<section class="shell-page" id="page-gm">
<div id="gmView" class="gm-app">
<aside class="gm-sidebar">
<div class="gm-logo"><div><div class="gm-logo-title">DNF90 GM</div><div class="gm-logo-sub">九零轮回 · 管理工具</div></div></div>
<div class="gm-nav-group">总览</div>
<div class="gm-nav-item active" data-page="dashboard"><span class="ico">📊</span>控制台</div>
<div class="gm-nav-item" data-page="characters"><span class="ico">👥</span>角色管理</div>
<div class="gm-nav-group">资源</div>
<div class="gm-nav-item" data-page="items"><span class="ico">🎁</span>道具发放</div>
<div class="gm-nav-item" data-page="mail"><span class="ico">✉️</span>邮件系统</div>
<div class="gm-nav-item" data-page="inventory"><span class="ico">🎒</span>背包装备</div>
<div class="gm-nav-item" data-page="auction"><span class="ico">🏷️</span>拍卖行</div>
<div class="gm-nav-group">进度</div>
<div class="gm-nav-item" data-page="quests"><span class="ico">📜</span>任务管理</div>
<div class="gm-nav-item" data-page="dungeons"><span class="ico">⚔️</span>魔改中心</div>
<div class="gm-nav-group">系统</div>
<div class="gm-nav-item" data-page="wallet"><span class="ico">💰</span>钱包点券</div>
<div class="gm-nav-item" data-page="wipe"><span class="ico">🗑️</span>删档管理</div>
<div class="gm-nav-item" data-page="settings"><span class="ico">⚙️</span>连接设置</div>
<div class="gm-sidebar-foot"><div><span class="conn-dot off" id="gmConnDot"></span><span class="conn-text" id="gmConnText">数据源:SQLite</span></div><button class="gm-back" id="btnBackLauncher">← 返回启动器</button></div>
</aside>
<div class="gm-main"><header class="gm-topbar"><h1 id="gmPageTitle">控制台</h1><span class="gm-crumb" id="gmPageCrumb">/ 服务端总览</span><div class="topbar-spacer"></div><button class="gm-btn gm-btn-sm gm-btn-ghost" id="gmBtnRefresh">↻ 刷新</button></header><div class="gm-content" id="gmContent"></div></div>
</div>
</section>
</main>
</div>
<div class="shell-statusbar"><span><i class="live-dot"></i> <b id="shellBottomStatus">运行中</b></span><span>端口 <b id="shellBottomPort">—</b></span><span>内存 <b id="shellBottomMem">—</b></span><span>CPU <b>0.0%</b></span><span class="grow"></span><span id="shellBottomLog">日志 就绪</span></div>
<div class="win-resize n" data-edge="top"></div><div class="win-resize s" data-edge="bottom"></div>
<div class="win-resize w" data-edge="left"></div><div class="win-resize e" data-edge="right"></div>
<div class="win-resize nw" data-edge="topleft"></div><div class="win-resize ne" data-edge="topright"></div>
<div class="win-resize sw" data-edge="bottomleft"></div><div class="win-resize se" data-edge="bottomright"></div>
<div class="modal-mask hidden" id="sponsorModal"><div class="modal"><div class="modal-head"><span>赞助我们</span><button class="modal-close" id="btnCloseSponsor">×</button></div><div class="modal-body"><p class="sponsor-tip">感谢支持 DNF90 灵狐小竹整合单机版!</p><div class="qrcode-box" id="qrcodeBox"></div></div></div></div>
<div class="modal-mask hidden" id="accountsModal"><div class="modal" style="width:520px"><div class="modal-head"><span>账号管理</span><button class="modal-close" id="btnCloseAccounts" onclick="document.getElementById('accountsModal').classList.add('hidden')">×</button></div><div class="modal-body" style="text-align:left"><div id="accountsList" style="margin-bottom:16px"></div><div class="accounts-add"><div class="accounts-add-title">添加新账号</div><div class="gm-form-row"><div class="gm-field"><label>用户名</label><input class="gm-input" id="newAccUser"></div><div class="gm-field"><label>密码</label><input class="gm-input" id="newAccPass" type="password"></div></div><button class="gm-btn gm-btn-primary" id="btnAddAccount">+ 添加账号</button></div></div></div></div>
<script src="/app.js"></script>
<script src="/shell.js"></script>
</body>
</html>