better-staridc-MNBT
1<?php
2/** 反向代理管理 */
3$active = 'proxy';
4$proxy_max = $plan ? (int)$plan['proxy_max'] : 0;
5include __DIR__ . '/head.php';
6?>
7<?php if (empty($me['container_id']) && empty($me['service_name'])): ?>
8 <div class="dk-alert dk-alert-warn">您还没有容器,请先在应用商店创建容器后再配置反向代理。</div>
9<?php endif; ?>
10
11<div class="dk-card">
12 <div class="dk-card-head">
13 <h3>反向代理</h3>
14 <button class="dk-btn dk-btn-sm" onclick="dkProxyAdd()" id="dkProxyAddBtn">+ 添加规则</button>
15 </div>
16 <div class="dk-card-body">
17 <div class="dk-spinner-overlay" id="dkProxyLoading"><span class="dk-spin"></span> 加载中…</div>
18 <div id="dkProxyList" style="display:none"></div>
19 </div>
20</div>
21
22<script>
23(function(){
24 var PROXY_MAX = <?= json_encode($proxy_max) ?>;
25 var HAS_CONTAINER = <?php echo (!empty($me['container_id']) || !empty($me['service_name'])) ? 'true' : 'false'; ?>;
26 var CONTAINER_PORTS = [];
27
28 function esc(s){ return $('<div>').text(s == null ? '' : String(s)).html(); }
29
30 function loadPorts(){
31 return dkAjax('container_ports', {}, {silent:true}).then(function(r){
32 CONTAINER_PORTS = r.ports || [];
33 });
34 }
35
36 function loadList(){
37 $('#dkProxyLoading').show(); $('#dkProxyList').hide();
38 dkAjax('proxy_list', {}, {silent:true}).then(function(r){
39 $('#dkProxyLoading').hide(); $('#dkProxyList').show();
40 var list = r.data || [];
41 if (!list.length) {
42 $('#dkProxyList').html('<div class="dk-empty"><div class="dk-empty-ico">⇄</div><h4>暂无反向代理规则</h4><p>点击上方按钮添加,将域名指向容器端口。</p></div>');
43 return;
44 }
45 var html = '<table class="dk-table"><thead><tr><th>站点名</th><th>代理目标</th><th>路径</th><th>状态</th><th>备注</th><th>操作</th></tr></thead><tbody>';
46 list.forEach(function(p){
47 var statusTag = p.status === '1' ? '<span class="dk-tag dk-tag-running">运行中</span>' : '<span class="dk-tag dk-tag-stopped">已停止</span>';
48 html += '<tr>' +
49 '<td class="dk-mono">'+ esc(p.name) +'</td>' +
50 '<td class="dk-mono">'+ esc(p.proxy_pass || '') +'</td>' +
51 '<td>'+ esc(p.path || '/') +'</td>' +
52 '<td>'+ statusTag +'</td>' +
53 '<td>'+ esc(p.ps || '-') +'</td>' +
54 '<td><button class="dk-btn dk-btn-danger dk-btn-sm" onclick="dkProxyDel('+ p.id +', \''+ esc(p.name) +'\')">删除</button></td>' +
55 '</tr>';
56 });
57 html += '</tbody></table>';
58 $('#dkProxyList').html(html);
59 });
60 }
61
62 window.dkProxyAdd = function(){
63 if (!HAS_CONTAINER) { dkToast('请先创建容器', 'error'); return; }
64 loadPorts().then(function(){
65 if (PROXY_MAX > 0) {
66 dkAjax('proxy_list', {}, {silent:true}).then(function(r){
67 var count = (r.data || []).length;
68 if (count >= PROXY_MAX) { dkToast('反向代理数量已达上限('+PROXY_MAX+'个)', 'error'); return; }
69 showAddForm();
70 });
71 } else {
72 showAddForm();
73 }
74 });
75 };
76
77 function showAddForm(){
78 if (!CONTAINER_PORTS.length) { dkToast('未检测到容器端口,请确认容器已创建并运行', 'error'); return; }
79 var portOpts = CONTAINER_PORTS.map(function(p){ return '<option value="'+p+'">'+p+'</option>'; }).join('');
80 var body =
81 '<form id="dkProxyForm">' +
82 '<div class="dk-field"><label>域名 *</label><input class="dk-input" name="domains" placeholder="多个域名用换行分隔,如 example.com"></div>' +
83 '<div class="dk-field"><label>容器端口 *</label><div style="display:flex;gap:8px"><select class="dk-select" name="proto" style="flex:0 0 100px"><option value="http">http://</option><option value="https">https://</option></select><select class="dk-select" name="ip" style="flex:0 0 130px" disabled><option>127.0.0.1</option></select><select class="dk-select" name="port">'+ portOpts +'</select></div><div class="dk-muted" style="font-size:12px;margin-top:4px">代理目标:<协议>://<IP>:<端口>(容器与本机同机部署)</div></div>' +
84 '<div class="dk-field"><label>代理路径</label><input class="dk-input" name="proxy_path" value="/" placeholder="/"></div>' +
85 '<div class="dk-field"><label>备注</label><input class="dk-input" name="remark" placeholder="可选"></div>' +
86 '</form>';
87 dkModal(body, '添加反向代理');
88 $('#dkModalMask .dk-modal').append('<div class="dk-modal-foot"><button class="dk-btn dk-btn-ghost" onclick="dkCloseModal()">取消</button><button class="dk-btn" id="dkProxySubmit">确认添加</button></div>');
89 $('#dkProxySubmit').on('click', function(){
90 var btn = $(this);
91 var fd = new FormData($('#dkProxyForm')[0]);
92 var domains = (fd.get('domains') || '').trim();
93 var port = (fd.get('port') || '').trim();
94 if (!domains || !port) { dkToast('域名和端口不能为空', 'error'); return; }
95 btn.prop('disabled', true).html('<span class="dk-spin"></span> 提交中…');
96 dkAjax('proxy_create', fd, {timeout:30000}).then(function(r){
97 dkCloseModal();
98 dkToast('反向代理创建成功', 'success');
99 loadList();
100 }).fail(function(){
101 btn.prop('disabled', false).text('确认添加');
102 });
103 });
104 }
105
106 window.dkProxyDel = function(id, name){
107 if (!confirm('确定删除反向代理 ' + name + ' 吗?')) return;
108 dkAjax('proxy_delete', {id: id, site_name: name}).then(function(r){
109 dkToast('已删除', 'success');
110 loadList();
111 });
112 };
113
114 loadList();
115})();
116</script>
117<?php include __DIR__ . '/foot.php'; ?>