caddydash/frontend/index.html
2025-06-20 17:04:14 +08:00

166 lines
No EOL
9.2 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CaddyDash</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="app-container">
<aside class="sidebar" id="sidebar">
<header class="sidebar-header">
<i class="fa-solid fa-rocket"></i>
<h1>CaddyDash</h1>
</header>
<nav class="sidebar-nav">
<ul>
<li><a href="#" class="active"><i class="fa-solid fa-sitemap"></i> <span>配置管理</span></a></li>
<li><a href="#"><i class="fa-solid fa-chart-line"></i> <span>仪表盘 (预留)</span></a></li>
<li><a href="#"><i class="fa-solid fa-puzzle-piece"></i> <span>模板管理 (预留)</span></a></li>
</ul>
</nav>
<div class="sidebar-bottom">
<div class="theme-switcher">
<i class="fa-solid fa-sun"></i>
<label class="switch"><input type="checkbox" id="theme-toggle-input"><span class="slider"></span></label>
<i class="fa-solid fa-moon"></i>
</div>
<div class="caddy-control-panel">
<div id="caddy-status-indicator" class="caddy-status">
<span class="status-dot checking"></span>
<span class="status-text">检查中...</span>
</div>
<div id="caddy-action-button-container"></div>
</div>
<div class="logout-section">
<button id="logout-btn" class="btn btn-secondary">
<i class="fa-solid fa-right-from-bracket"></i>
<span>退出登录</span>
</button>
</div>
</div>
</aside>
<main class="main-content">
<header class="main-header">
<button class="btn-icon" id="menu-toggle-btn"><i class="fa-solid fa-bars"></i></button>
<h2>配置管理</h2>
<button id="add-new-config-btn" class="btn btn-primary">
<i class="fa-solid fa-plus"></i> <span class="btn-text">创建新配置</span>
</button>
</header>
<div id="view-container">
<section id="config-list-panel" class="card-panel view">
<ul id="config-list" class="config-list-container"></ul>
</section>
<section id="config-form-panel" class="card-panel view hidden">
<div class="form-panel-header">
<button id="back-to-list-btn" class="btn-icon" title="返回列表">
<i class="fa-solid fa-arrow-left"></i>
</button>
<h3 id="form-title">创建新配置</h3>
</div>
<form id="config-form">
<input type="hidden" id="original-filename" value="">
<fieldset>
<legend>基础配置</legend>
<div class="form-group">
<label for="domain">主域名 (将用作文件名)</label>
<input type="text" id="domain" name="domain" required>
</div>
</fieldset>
<fieldset>
<legend>服务模式</legend>
<div id="service-mode-control" class="segmented-control">
<div id="segmented-control-slider"></div>
<button type="button" data-mode="none" class="active"></button>
<button type="button" data-mode="reverse_proxy">反向代理</button>
<button type="button" data-mode="file_server">文件服务</button>
</div>
</fieldset>
<fieldset id="upstream-fieldset" class="hidden">
<legend>反向代理配置</legend>
<!-- 单上游输入框, 在多上游模式下隐藏 -->
<div class="form-group" id="single-upstream-group">
<label for="upstream">上游服务地址</label>
<input type="text" id="upstream" name="upstream" placeholder="例如: 127.0.0.1:8080">
</div>
<!-- 多上游配置区域 -->
<div class="sub-fieldset">
<label class="custom-checkbox">
<input type="checkbox" id="muti_upstream" name="muti_upstream">
<span class="checkmark"></span> 启用多上游负载均衡
</label>
<div id="multi-upstream-group" class="hidden" style="margin-top: 16px;">
<p class="sub-legend">上游服务器列表</p>
<div id="multi-upstream-container"></div>
<button type="button" id="add-multi-upstream-btn" class="btn btn-secondary btn-small">
<i class="fa-solid fa-plus"></i> 添加上游服务器
</button>
</div>
</div>
<div class="sub-fieldset">
<p class="sub-legend">上游请求头 (Upstream Headers)</p>
<div id="upstream-headers-container"></div>
<button type="button" id="add-upstream-header-btn" class="btn btn-secondary btn-small"><i class="fa-solid fa-plus"></i> 添加上游请求头</button>
</div>
</fieldset>
<fieldset id="fileserver-fieldset" class="hidden">
<legend>文件服务配置</legend>
<div class="form-group">
<label for="file_dir_path">根目录路径</label>
<input type="text" id="file_dir_path" name="file_dir_path" placeholder="例如: /srv/www">
</div>
<label class="custom-checkbox">
<input type="checkbox" id="enable_browser" name="enable_browser">
<span class="checkmark"></span> 启用文件浏览器
</label>
</fieldset>
<fieldset id="headers-fieldset">
<legend>全局请求头 (Headers)</legend>
<div id="headers-container"></div>
<button type="button" id="add-header-btn" class="btn btn-secondary btn-small"><i class="fa-solid fa-plus"></i> 添加全局请求头</button>
</fieldset>
<fieldset>
<legend>附加功能</legend>
<div class="checkbox-grid">
<label class="custom-checkbox"><input type="checkbox" id="enable_log" name="enable_log"><span class="checkmark"></span> 启用日志</label>
<label class="custom-checkbox"><input type="checkbox" id="enable_error_page" name="enable_error_page"><span class="checkmark"></span> 启用错误页</label>
<label class="custom-checkbox"><input type="checkbox" id="enable_encode" name="enable_encode"><span class="checkmark"></span> 启用压缩</label>
</div>
</fieldset>
<div class="form-actions">
<button type="submit" class="btn btn-primary"><i class="fa-solid fa-save"></i> <span>保存配置</span></button>
<button type="button" id="cancel-edit-btn" class="btn btn-secondary">取消</button>
</div>
</form>
</section>
<section id="rendered-output-panel" class="card-panel view hidden">
<h3>渲染后的 Caddyfile</h3>
<pre><code id="rendered-content"></code></pre>
</section>
</div>
</main>
</div>
<div id="toast-container" class="toast-container"></div>
<div id="dialog-container"></div>
<script type="module" src="js/app.js"></script>
</body>
</html>