Files
90CNServer/launcher/index.html
T
hanfuit cc6beb0a71 启动器:关于页新增官方QQ群二维码,内容整体居中
- 关于页二维码面板改为三列:赞助我们(支付宝/微信)| 官方QQ群 | 团队公众号
- 新增 qr/qq.png 并加入 /qr/ 白名单与打包资源
- 各列二维码改为列内居中,QQ群列宽 184px,避免群号文字折行
- 关于页内容块 margin:0 auto 整体居中,并压缩上下间距使 1204x717 窗口内不出现滚动条
2026-11-05 16:11:26 +08:00

235 lines
15 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="changelog"><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>
<button class="shell-nav-item" data-shell-page="about"><span class="nav-ico">💝</span>关于我们</button>
<div class="shell-nav-gap"></div>
</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.05</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-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">
<div class="page-heading"><div><h2>游戏更新</h2><p class="muted">优先读取仓库(Lingbao/90CNServer)的发布记录,并用本地「更新日志.txt」补齐仓库还没发布的版本;断网时只显示本地记录。</p></div><button class="shell-btn" id="updRefresh">刷新</button></div>
<div class="st-tabs" id="updTabs">
<button class="st-tab active" data-upd="latest">当前更新</button>
<button class="st-tab" data-upd="history">历史更新 <span class="upd-count" id="updHistoryCount"></span></button>
</div>
<div id="updLatestPane"><div class="upd-body" id="updLatest"><div class="empty-box">正在获取更新日志…</div></div></div>
<div id="updHistoryPane" style="display:none"><div class="upd-body" id="updHistory"></div></div>
</div>
</section>
<section class="shell-page" id="page-about">
<div class="page-pad about-pad">
<div class="about-hero">
<h2>地下城与勇士 · 九零轮回单机</h2>
<p class="about-line">汉服电脑宅 · 灵宝小竹模拟器</p>
<p class="about-line">由灵宝仙尊联合淡竹茹开发,由汉服电脑宅团队开发维护</p>
<p class="about-line">本模拟器资源禁止倒卖,请到官方微信公众号或社群下载</p>
</div>
<div class="about-panel">
<div class="about-col about-col-l">
<div class="about-col-hd">赞助我们</div>
<div class="about-col-bd">
<figure class="about-qr" data-qr="支付宝">
<img src="/qr/alipay.png" alt="支付宝收款码">
<figcaption>支付宝</figcaption>
</figure>
<figure class="about-qr" data-qr="微信">
<img src="/qr/wechat.png" alt="微信收款码">
<figcaption>微信</figcaption>
</figure>
</div>
<div class="about-col-note">金额随意,感谢支持;扫码后备注游戏名,方便记录。</div>
</div>
<div class="about-col about-col-m">
<div class="about-col-hd">官方QQ群</div>
<div class="about-col-bd">
<figure class="about-qr" data-qr="官方QQ群">
<img src="/qr/qq.png" alt="官方QQ群二维码">
<figcaption>QQ群</figcaption>
</figure>
</div>
<div class="about-col-note">群号 1128511524</div>
</div>
<div class="about-col about-col-r">
<div class="about-col-hd">团队公众号</div>
<div class="about-col-bd">
<figure class="about-qr" data-qr="团队公众号">
<img src="/qr/gzh.jpg" alt="团队公众号二维码">
<figcaption>扫码关注</figcaption>
</figure>
</div>
<div class="about-col-note">更新公告 · 开服时间 · 玩法说明</div>
</div>
</div>
<p class="about-tip">点击任意二维码可放大查看;把同名图片放进启动器目录下的 qr 文件夹即可替换。</p>
</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="qr-lightbox hidden" id="qrLightbox"><img id="qrLightboxImg" src="" alt=""><div class="qr-lightbox-tip" id="qrLightboxTip"></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>