仰望星辰工作室

better-staridc-MNBT

Z zfhsh first commit 2 天前
1<?php mnbt_admin_include('head'); ?>
2
3<?php
4$set=isset($_GET['gn'])?$_GET["gn"]:NULL;
5if($set=='bt'){?>
6<div class="container-fluid p-t-15">
7
8 <div class="row">
9
10 <div class="col-lg-12">
11 <div class="card">
12 <header class="card-header"><div class="card-title">宝塔添加</div></header>
13 <div class="card-body">
14 <div class="form-group">
15 <label for="web_site_icp"><b>宝塔IP</b></label>
16 <input type="text" name="btip" id="btip" class="form-control" placeholder="请在这填写宝塔的IP" required/>
17 <small>您宝塔的IP(如果面板开启了域名访问则需要在此填写配置的域名)</small></div><br/>
18 <div class="form-group">
19 <label for="web_site_icp"><b>宝塔端口</b></label>
20 <input type="text" name="btdk" id="btdk" class="form-control" placeholder="请在这填写宝塔的对接端口" required/>
21 <small>默认为8888的那个数字,如果修改后就把修改后的填写在这</small></div><br/>
22 <div class="form-group">
23 <label for="web_site_icp"><b>宝塔密钥</b></label>
24 <input type="text" name="btkey" id="btkey" class="form-control" placeholder="请在这填写宝塔的密钥(key)" required/>
25 <small>填写:宝塔设置->APi接口->接口密钥</small></div><br/>
26 <div class="form-group">
27 <label for="web_site_icp"><b>FTP地址</b></label>
28 <input type="text" class="form-control" name="ftpdz" id="ftpdz" placeholder="请在这填写该宝塔的FTP地址"/>
29 <small>显示在控制面板,通常情况下和宝塔IP一样,如果没特殊需求则不用改!</small></div><br/>
30 <div class="form-group">
31 <label for="web_site_icp"><b>域名解析说明</b></label>
32 <textarea type="text" class="form-control" name="urljx" id="urljx" placeholder="请在这填写该宝塔的域名解析地址"></textarea>
33 <small>显示在控制面板,在用户绑定域名时查看的,如果不懂则请不要乱改!</small></div><br/>
34<div class="form-group">
35 <label for="web_site_logo"><b>宝塔编号(支持中文)</b></label>
36 <div class="input-group">
37 <input type="text" class="form-control" name="btbh" id="btbh" placeholder="每台宝塔的编号"/>
38 <div class="input-group-btn"><button class="btn btn-default" type="button" onclick="szsc()">随机生成</button></div>
39 </div>
40 </div>
41 </br>
42<div class="form-group">
43 <label for="web_site_icp"><b>操作系统</b></label>
44 <select class="form-control" id="btos" name="btos" size="1">
45 <option value="1">Linux</option>
46 <option value="2">Windows</option>
47 </select>
48 <small>Centos、Unbutu等都属于Linux操作系统</small>
49 </div>
50 </br>
51 <div class="form-group">
52 <label class="btn-block" for="web_site_status"><b>安全访问(HTTPS)</b></label>
53 <div class="col-xs-6">
54
55 <div class="custom-control custom-switch custom-info">
56 <input type="checkbox" class="custom-control-input" name="xieyi" id="xieyi">
57 <label class="custom-control-label" for="xieyi"></label>
58 </div>
59 <small>如果您的宝塔面板开启了[面板SSL](访问面板时为HTTPS请求协议)则需要把这个开关打开,如果您宝塔未开启[面板SSL]则请不要打开此开关!否则将无法与宝塔正常通信!</small>
60
61 </div>
62 </div>
63 <div class="form-group">
64 <label class="btn-block" for="web_site_status">宝塔接口开关</label>
65 <div class="col-xs-6">
66
67 <div class="custom-control custom-switch custom-info">
68 <input type="checkbox" class="custom-control-input" name="btkg" id="btkg" checked="true">
69 <label class="custom-control-label" for="btkg"></label>
70 </div>
71
72 </div>
73 </div>
74 <button class="btn btn-primary form-control" type="button" onclick="tjbt()"><label><i class="mdi mdi-checkbox-marked-circle-outline"></i></label>确认添加</button>
75
76<h6 class="mt-3">注意:</h6>
77<p>您所对接的宝塔必须安装至少一个 PHP 版本,系统会自动检测并使用最新版本!<br/>推荐添加的宝塔面板版本为7.9.0(包括7.9.0)以上!否则可能会出现错误!我们所使用的测试宝塔也是这个版本!
78</p>
79</div>
80
81</div>
82 <script type="text/javascript">
83
84$("#btip").on("input propertychange change",function(){
85 $("#urljx").val('请将域名A记录到 '+this.value);
86 $("#ftpdz").val(this.value);
87})
88
89 function szsc() {
90msloading('正在生成中,请稍后','text-info','text-info'); // 加载显示
91var date = new Date();
92var sj=Math.ceil(Math.random()*1000);
93var sjs='mn'+sj+'f';
94document.getElementById("btbh").value = sjs;
95msalert(1,'生成成功',100)
96msloadingde(); // 隐藏
97}
98 function tjbt() {
99var ipe=btip.value;
100var dke=btdk.value;
101var keye=btkey.value;
102var brs=btos.value;
103var bhe=btbh.value;
104var urlzdy=urljx.value;
105var ftploc=ftpdz.value;
106var xy=xieyi.checked;
107var kge=btkg.checked;
108if(ipe==false || dke==false || keye==false || bhe==false || urlzdy==false || ftploc==false){
109msalert(3,'表单不能为空!',2000);
110}else{
111msloading('正在添加中,请稍后...');
112let data = {};
113data["gn"]="addbt";
114data["ip"]=ipe;
115data["dk"]=dke;
116data["key"]=keye;
117data["bh"]=bhe;
118data["btos"]=brs;
119data["urlla"]=urlzdy;
120data["ftpdz"]=ftploc;
121data["xieyi"]=xy;
122data["kg"]=kge;
123$.post('./ajax.php', data, function (date) {
124var jsoe= JSON.parse(date);
125var qk= jsoe.code
126
127if(qk=='添加成功'){
128msalert(1,'添加成功!',2000);
129msloadingde();
130window.location.href="./list.php?gn=bt"
131}else{
132msalert(4,qk,2000);
133msloadingde();
134}
135})
136}}
137 </script>
138<?php }elseif($set=='zj'){?>
139<link href="<?=mnbt_asset_url('js/bootstrap-datepicker/bootstrap-datepicker3.min.css')?>" rel="stylesheet">
140<link href="<?=mnbt_asset_url('js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.css')?>" rel="stylesheet">
141<link href="<?=mnbt_asset_url('js/bootstrap-clockpicker/bootstrap-clockpicker.min.css')?>" rel="stylesheet">
142
143<div class="container-fluid p-t-15">
144
145 <div class="row">
146
147 <div class="col-lg-12">
148 <div class="card">
149 <header class="card-header"><div class="card-title">主机添加</div></header>
150 <div class="card-body">
151
152<div class="form-group">
153 <label for="web_site_icp">请选择宝塔</label>
154 <select class="form-control" id="btdh" name="btdh" size="1">
155 <option value="-00-">点我选择宝塔</option>
156 <?php
157$bt_list=$DB->get_all_prepare("SELECT * FROM MN_bt order by id desc limit 100");
158 foreach ($bt_list as $res) { ?>
159 <option value="<?=$res['btdh']?>"><?=$res['btdh']?></option>
160 <?php }?>
161 </select>
162 </div>
163 </br>
164<div class="form-group">
165 <label for="web_site_logo">账号</label>
166 <div class="input-group">
167 <input type="text" class="form-control" name="user" id="user" placeholder="FTP和SQL的账号"/>
168 <div class="input-group-btn"><button class="btn btn-default" type="button" onclick="szsce(bh='user')">随机生成</button></div>
169 </div>
170 </div>
171 </br>
172<div class="form-group">
173 <label for="web_site_logo">密码</label>
174 <div class="input-group">
175 <input type="text" class="form-control" name="pass" id="pass" placeholder="FTP和SQL的密码"/>
176 <div class="input-group-btn"><button class="btn btn-default" type="button" onclick="szsce(bh='pass')">随机生成</button></div>
177 </div>
178 </div>
179 </br>
180 <div id="irth">
181 <div class="form-group">
182 <label for="web_site_icp">网页空间大小(MB)</label>
183 <input type="number" name="webkj" id="webkj" class="form-control" placeholder="网站储存的总文件的最大大小" required/>
184 </div><br/>
185 <div class="form-group">
186 <label for="web_site_icp">数据库空间大小(MB)</label>
187 <input type="number" name="sqlkj" id="sqlkj" class="form-control" placeholder="数据库储存的总数据的最大大小" required/>
188 </div><br/>
189 </div>
190 <div class="form-group">
191 <label for="web_site_icp">最大流量(G/月)</label>
192 <input type="number" name="lls" id="lls" class="form-control" placeholder="请填写每月最大可用流量(数字)" required/>
193 </div><br/>
194 <div class="form-group">
195 <label for="web_site_icp">域名最大绑定数</label>
196 <input type="text" name="yms" id="yms" class="form-control" placeholder="最多能够绑定的域名数不限制请填0" required/>
197 </div><br/>
198 <div class="form-group">
199 <label class="btn-block" for="web_site_status">主机开关</label>
200 <div class="col-xs-6">
201 <div class="custom-control custom-switch custom-info">
202 <input type="checkbox" class="custom-control-input" name="kg" id="kg" checked="true" checked>
203 <label class="custom-control-label" for="kg"></label>
204 </div>
205 </div>
206 </div><br/>
207 <div class="form-group">
208 <label for="recipient-name" class="control-label">到期时间(点击即可选择):</label>
209 <input class="form-control js-datepicker m-b-10" type="text" name="datar" id="datar" placeholder="0000-00-00" value="" data-provide="datepicker" readonly="true" data-date-format="yyyy-mm-dd" style="background-color:#FFFFFF;"/>
210 </div>
211 <button class="btn btn-primary form-control" type="button" onclick="tjzj()"><label><i class="mdi mdi-checkbox-marked-circle-outline"></i></label>确认添加</button>
212
213<div class="panel-footer">
214<span class="glyphicon glyphicon-info-sign"></span> 注意:<b>系统会自动检测并使用该节点的最新 PHP 版本,请确保宝塔面板已安装 PHP!</b><br/>到期时间留空即为不启用到期时间(即该主机本系统不会对主机进行到期检测)<br/>最大流量:即该主机每个月最多可用多少流量!每月1日重置,<b>如果不开启流量监控则无法控制流量(开启方法:系统设置->使用教程->系统监控)</b>
215</div>
216</div>
217</div>
218
219
220</div>
221<!--日期选择插件-->
222<script src="<?=mnbt_asset_url('js/bootstrap-datepicker/bootstrap-datepicker.min.js')?>"></script>
223<script src="<?=mnbt_asset_url('js/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js')?>"></script>
224<script type="text/javascript" src="<?=mnbt_asset_url('js/main.min.js')?>"></script>
225 <script type="text/javascript">
226
227function szsce(bho) {
228msloading('正在生成中...');
229var date = new Date();
230var sj=Math.ceil(Math.random()*1000);
231var so=Math.ceil(Math.random()*1000);
232var sjs='f'+so+sj+'w';
233document.getElementById(bho).value = sjs;
234msalert(1,'生成成功!',2000);
235msloadingde();
236}
237 function tjzj() {
238var btbh=btdh.value;
239var usere=user.value;
240var passe=pass.value;
241var datae=datar.value;
242var lld=lls.value;
243var webdx=webkj.value;
244var sqldx=sqlkj.value;
245var ymbds=yms.value;
246var kge=kg.checked;
247if(user=="" || pass=="" || btbh=="" || ymbds=="" || lld=="" || btbh=='-00-'){
248msalert(3,'表单不能为空或您未选择宝塔!',2000);
249}else{
250msloading('正在添加中...');
251let data = {};
252data["gn"]="addzj";
253data["user"]=usere;
254data["pass"]=passe;
255data["btdh"]=btbh;
256data["datae"]=datae;
257data["webkj"]=webdx;
258data["sqlkj"]=sqldx;
259data["ll"]=lld;
260data["ymbds"]=ymbds;
261data["kg"]=kge;
262$.post('./ajax.php', data, function (date) {
263var jsoe= JSON.parse(date);
264var qk= jsoe.code
265
266if(qk=='添加成功'){
267msalert(1,'添加成功',2000);
268msloadingde();
269window.location.href="./list.php?gn=zj"
270}else{
271msalert(4,qk,2000);
272msloadingde();
273}
274})
275}}
276
277 </script>
278
279<?php }elseif($set=='cx'){
280?>
281<!--对话框-->
282<script type="text/javascript" src="<?=mnbt_asset_url('js/jquery-confirm/jquery-confirm.min.js')?>"></script>
283<script type="text/javascript" src="<?=mnbt_asset_url('js/bootstrap-table/bootstrap-table.min.js')?>"></script>
284<script type="text/javascript" src="<?=mnbt_asset_url('js/bootstrap-table/locale/bootstrap-table-zh-CN.min.js')?>"></script>
285<!--图片选择插件-->
286<script src="<?=mnbt_asset_url('js/dropzone/min/basic.min.css')?>"></script>
287<script src="<?=mnbt_asset_url('js/dropzone/min/dropzone.min.css')?>"></script>
288<script src="<?=mnbt_asset_url('js/dropzone/min/dropzone.min.js')?>"></script>
289
290<div class="container-fluid p-t-15">
291
292 <div class="row">
293
294 <div class="col-lg-12">
295 <div class="card">
296 <header class="card-header"><div class="card-title">程序添加</div></header>
297 <div class="card-body">
298
299 <form action="#!" method="post" id="example-from" onsubmit="return false;">
300
301 <div class="form-group">
302 <label for="web_site_icp">程序名称</label>
303 <input type="text" name="cxname" id="cxname" class="form-control" placeholder="显示的此程序的名称" required/>
304 </div><br/>
305 <div class="form-group">
306 <label for="web_site_icp">程序介绍</label>
307 <textarea rows="5" name="cxjs" id="cxjs" class="form-control" placeholder="此程序的介绍"></textarea>
308 </div><br/>
309 <div class="form-group">
310 <label for="web_site_icp">程序价格</label>
311 <input type="number" name="cxrmb" id="cxrmb" class="form-control" min="0.00" step="0.01" max="1000" placeholder="此程序的价格 免费请填0" required/>
312 </div><br/>
313 <div class="form-group">
314 <label for="web_site_icp">所需网页空间</label>
315 <input type="number" name="cxwebkj" id="cxwebkj" class="form-control" placeholder="搭建此程序最低所需的web容量(填写数字,单位MB)" required/>
316 </div><br/>
317 <div class="form-group">
318 <label for="web_site_icp">所需数据库空间</label>
319 <input type="number" name="cxsqlkj" id="cxsqlkj" class="form-control" placeholder="搭建此程序最低所需的web容量(填写数字,单位MB)" required/>
320 </div><br/>
321 <div class="form-group">
322 <label for="web_site_icp">部署完成后的提示</label>
323 <textarea type="text" name="alerts" id="alerts" rows="6" class="form-control" placeholder="部署此程序成功后的弹窗提示(支持使用替代)"></textarea>
324 <small>部署此程序成功后给用户的弹窗提示(支持使用替代)</small>
325 </div><br/>
326 <div class="form-group">
327 <label for="web_site_icp">程序源码上传</label>
328 <div class="custom-file">
329 <input type="file" name="filecx" id="filecx" class="custom-file-input" required>
330 <label class="custom-file-label" for="validatedCustomFile">选择文件...</label>
331 </div></div><br/>
332
333 <div class="form-group">
334
335 <label for="web_site_icp">程序展示图片上传</label>
336
337 <div id="example-uploads" class="m-b-10">
338 <span class="btn btn-success fileinput-button">
339 <i class="mdi mdi-plus"></i>
340 <span>添加文件...</span>
341 </span>
342 </div>
343
344 <!--重设上传主题-->
345 <ul class="list-inline row" id="previews">
346 <li id="template" class="file-row col-6 col-sm-3 col-md-2">
347 <!-- 它用作文件预览模板 -->
348 <div class="dropzone-preview">
349 <img data-dz-thumbnail />
350 <input type="hidden" class="pic_hidden_url" name="picurl[]" value="" />
351 </div>
352 <div class="dropzone-message">
353 <p class="dropzone-name" data-dz-name></p>
354 <strong class="error text-danger" data-dz-errormessage></strong>
355 </div>
356 <div class="dropzone-progress">
357 <p class="dropzone-size" data-dz-size></p>
358 <div class="progress m-b-10 active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
359 <div class="progress-barr progress-bar-striped bg-success" style="width:0%;" data-dz-uploadprogress></div>
360 </div>
361 </div>
362 <div class="dropzone-btns">
363 <button style="display:none;" class="btn btn-primary btn-sm start">
364 <i class="mdi mdi-upload"></i>
365 <span>上传</span>
366 </button>
367 <button data-dz-remove class="btn btn-danger btn-sm delete">
368 <i class="mdi mdi-delete"></i>
369 <span>删除</span>
370 </button>
371
372 </div>
373 </li>
374 </ul>
375 </div>
376 </form>
377
378 <div class="tjnr1">
379 <div class="a2">
380 <h6 class="a1"> <b>需用户填写的表单</b></h6>
381 </div>
382
383 <div class="btn-group a3 btn-round">
384
385 <button type="button" class="btn btn-primary btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
386 添加一个表单 <span class="caret"></span>
387 </button>
388
389 <ul class="dropdown-menu">
390 <li><a class="dropdown-item" href="#!" onclick="add_pt('input')">表单</a></li>
391 <li><a class="dropdown-item" href="#!" onclick="add_pt('dxk')">单选框</a></li>
392 <li><a class="dropdown-item" href="#!" onclick="add_pt('dxks')">多选框</a></li>
393 <li><a class="dropdown-item" href="#!" onclick="add_pt('urlxz')">域名选择</a></li>
394 </ul>
395
396 </div>
397 <hr color="#8f8c8c"/>
398 <form action="#!" method="post" id="siteinput">
399 <div id="inputs"><!--添加内容存放div-->
400
401 </div>
402 </form>
403 </div>
404 <br/>
405 <br/>
406
407
408 <div class="tjnr1">
409 <div class="a2">
410 <h4 class="a1"> <b>安装时的操作</b></h4>
411 </div>
412
413 <div class="btn-group a3 btn-round">
414
415 <button type="button" class="btn btn-primary btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
416 添加一个操作 <span class="caret"></span>
417 </button>
418
419 <ul class="dropdown-menu">
420 <li><a class="dropdown-item" href="#!" onclick="add_cz('xjwj')">新建文件</a></li>
421 <li><a class="dropdown-item" href="#!" onclick="add_cz('xjwjj')">新建文件夹</a></li>
422 <li><a class="dropdown-item" href="#!" onclick="add_cz('delwj')">删除文件</a></li>
423 <li><a class="dropdown-item" href="#!" onclick="add_cz('delwjj')">删除文件夹</a></li>
424 <li><a class="dropdown-item" href="#!" onclick="add_cz('setwj')">修改文件内容</a></li>
425 <li><a class="dropdown-item" href="#!" onclick="add_cz('drsql')">导入数据库文件</a></li>
426 <li><a class="dropdown-item" href="#!" onclick="add_cz('cxname')">重命名文件或文件夹</a></li>
427 <li><a class="dropdown-item" href="#!" onclick="add_cz('gettj')">GET提交</a></li>
428 <li><a class="dropdown-item" href="#!" onclick="add_cz('setyxml')">设置运行目录</a></li>
429 <li><a class="dropdown-item" href="#!" onclick="add_cz('setwjt')">配置伪静态</a></li>
430 <li><a class="dropdown-item" href="#!" onclick="add_cz('setphp')">设置PHP版本</a></li>
431 </ul>
432
433 </div>
434 <hr color="#8f8c8c"/>
435 <form action="#!" method="post" id="siteform">
436 <div id="tjdcznr"><!--添加内容存放div-->
437
438 </div>
439 </form>
440 </div>
441
442 <div class="form-group">
443 <label class="btn-block" for="web_site_status">是否上架</label>
444 <div class="custom-control custom-switch custom-info">
445 <input type="checkbox" class="custom-control-input" name="kg" id="kg" checked="true" checked>
446 <label class="custom-control-label" for="kg"></label>
447 </div>
448 <div id="example-uploads">
449 <button class="btn btn-primary start form-control" type="submit" onclick=""><label><i class="mdi mdi-checkbox-marked-circle-outline"></i></label>确认添加</button>
450 </div>
451
452<span class="glyphicon glyphicon-info-sign"></span>
453<b>程序名称:</b>程序显示给客户时的名字<br/>
454<b>程序介绍:</b>程序显示给客户的本程序介绍<br/>
455<b>程序价格:</b>部署本程序需要支付的费用(单位:元)<br/>
456<b>所需网页空间:</b>安装本程序最低所需要的网页空间(单位:MB)<br/>
457<b>所需数据库空间:</b>安装本程序最低所需要的数据库空间(单位:MB)<br/>
458<b>程序展示图片:</b>在程序列表中会以幻灯片的方式展示选择的图片<br/>
459<b>需用户填写的表单:</b>在用户确定部署本程序之后系统将弹出一个弹出让用户填写您配置的表单,填写完成后将开始部署程序,系统会将[sf_变量名]替换为用户填写的内容,您可以在安装时的操作中引用这些替换符<br/>
460<b>安装时的操作:</b>在用户确定部署本程序之后系统将会把程序源码上传到此用户的主机并解压然后根据您的填写的配置并根据步骤数字的从小到大依次进行操作(整个过程自动化!)<br/>
461<b>新建文件:</b>在指定目录下新建一个空白文件并命名为您填写的那个<br/>
462<b>新建文件夹:</b>在指定目录下新建一个空的文件夹并命名为您填写的那个<br/>
463<b>删除文件:</b>在指定目录下删除一个指定的文件<br/>
464<b>删除文件夹:</b>在指定目录下删除一个指定的文件夹(此操作将同时删除该文件内的文件及文件夹)<br/>
465<b>导入数据库文件:</b>将指定目录下的指定文件(该文件必须为数据库文件)导入进数据库(此操作完成后并不会删除该数据库文件)<br/>
466<b>修改文件内容:</b>修改指定目录下的一个指定文件的内容<br/>
467<b>GET提交:</b>也就是访问url;目前只支持访问http不支持https!比如我要访问http://baidu.com/?a=1&b=2&c=[cn_user]那么要访问的域名那一栏则填写 baidu.com 提交的内容的那一栏填写a=1&b=2&c=[cn_user]<br/>
468<b>设置PHP版本:</b>将站点的PHP版本切换为指定版本(如74/80/81/82,宝塔需已安装该版本;支持 [sf_变量名] 引用用户表单中的版本选择)<br/>
469
470
471部署完成后的弹窗提示、修改文件内容、GET提交的数据均可用以下代替法:<br/><span color="#000"><b>
472[cn_host]代表用户的数据库连接地址;<br/>
473[cn_port]代表用户的数据库端口;<br/>
474[cn_user]代表用户的数据库账号;<br/>
475[cn_pass]代表用户的数据库密码;<br/>
476[cn_name]代表用户的数据库名;<br/>
477[cn_date]代表安装时的时间;<br/>
478[sf_变量名]代表用户填写的表单;比如变量名为a1则可以用[sf_a1]来替换为用户填写表单的内容<br/>
479
480</b></span><br/>
481<hr color="#000"/>
482<span color="#FF0000"><b>注意:如果是根目录请填写 / ;<br/>文件名称和目录不得出现特殊字符比如 空格 {}:“|《》?【】;’、,。{}:"|<>?[];',.!@#$%^&*()_-+='"等;<br/>更多操作请期待后续更新</b></span>
483</div>
484
485
486</div>
487<!--日期选择插件-->
488<script src="<?=mnbt_asset_url('js/bootstrap-datepicker/bootstrap-datepicker.min.js')?>"></script>
489<script src="<?=mnbt_asset_url('js/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js')?>"></script>
490<script type="text/javascript" src="<?=mnbt_asset_url('js/main.min.js')?>"></script>
491<script type="text/javascript" src="<?=mnbt_asset_url('js/addbs.js')?>?<?=$date?>"></script>
492<script>
493tpnamesz='0';
494//文件选择监听
495$(".custom-file-input").on("change",function(){
496 if(this.files[0]==null){
497 $(".custom-file-label").html('选择文件...');
498 }else{
499 $(".custom-file-label").html(this.files[0].name);
500 }
501});
502
503$(function() {
504 // 表单提交
505 // 获取模板HTML并将其从文档中删除
506 var previewNode = document.querySelector("#template");
507 previewNode.id = "";
508 var previewTemplate = previewNode.parentNode.innerHTML;
509 previewNode.parentNode.removeChild(previewNode);
510
511 Dropzone.autoDiscover = false;
512 databeass=true;
513 var myDropzone = new Dropzone(document.body, {
514 url: "ajax.php", // 文件提交地址
515 method: "post", // 也可用put
516 acceptedFiles: ".png,.gif,.jpg,.jpeg", // 允许上传的文件格式
517 thumbnailWidth: 165, // 设置缩略图的缩略比
518 thumbnailHeight: 110, // 就像 thumbnailWidth一样。如果为空, 将不能重置尺寸。
519 parallelUploads: 24, // 要并行处理的文件上载数量
520 maxFilesize: 6, // 最大上传文件大小(MB)
521
522 autoQueue: false, // 确保在手动添加之前文件不会排队
523 previewTemplate: previewTemplate, // 主题模板
524 previewsContainer: "#previews", // 上传图片的预览窗口
525 clickable: ".fileinput-button", // 定义应该用作单击触发器以选择文件的元素
526
527 paramName: "imgfile", // 传到后台的参数名称
528 uploadMultiple: true, //开启多文件上传
529 maxFiles: null, //最大提交文件数量,为null时,则全部提交
530
531
532
533 dictResponseError: '文件上传失败!',
534 dictInvalidFileType: "文件类型只能是*.jpg,*.gif,*.png,*.jpeg",
535 dictFallbackMessage: "浏览器不受支持",
536 dictFileTooBig:"可添加的最大文件大小为{{maxFilesize}}Mb,当前文件大小为{{filesize}}Mb ",
537 init: function () {
538 var submitButton = $("#submit")
539 myDropzone = this; // closure
540 //为上传按钮添加点击事件
541 submitButton.on("click", function (e) {
542 e.preventDefault();
543 e.stopPropagation();
544 if (myDropzone.getAcceptedFiles().length !== 0) {
545 myDropzone.processQueue();
546 }
547 });
548 this.on("sending", function (data, xhr, formData) {
549 if(databeass){
550 var t = $('#siteform').serializeArray();
551 $.each(t, function() { //配置添加
552 formData.append(this.name,this.value);
553 });
554 var t = $('#siteinput').serializeArray();
555 $.each(t, function() { //表单添加
556 formData.append(this.name,this.value);
557 });
558
559 var files = $('#filecx')[0].files //获取源码
560 formData.append("gn", 'cxtj');
561 formData.append("cxname", $("#cxname").val());
562 formData.append("cxjs", $("#cxjs").val());
563 formData.append("cxrmb", $("#cxrmb").val());
564 formData.append("cxwebkj", $("#cxwebkj").val());
565 formData.append("cxsqlkj", $("#cxsqlkj").val());
566 formData.append("alerts", $("#alerts").val());
567 formData.append("filecx", files[0]);
568 formData.append("kg", $("#kg").val());
569 databeass=false;
570 }
571 });
572 }
573
574 });
575
576 myDropzone.on("addedfile", function(file) {
577 // 连接开始按钮
578 file.previewElement.querySelector(".start").onclick = function() { myDropzone.enqueueFile(file); };
579 });
580
581 myDropzone.on("sending", function(file) {
582 // 禁用“开始”按钮
583 file.previewElement.querySelector(".start").setAttribute("disabled", "disabled");
584 });
585
586 myDropzone.on("success", function(file, response) {
587 msloadingde();
588 if(datamsalerts){
589 var resData = JSON.parse(response);
590 if (resData.code == '200') {
591 msalert(1,'添加成功!',4000);
592 } else {
593 myDropzone.removeFile(file);
594 msalert(4,resData.msg,4000);
595 msloadingde();
596 }
597 datamsalerts=false;
598 }
599 });
600
601 myDropzone.on("error", function(file, errorMessage){
602 //不接受该文件(非定义的可接受类型)或上传失败
603 myDropzone.removeFile(file);
604 msalert(4,'添加失败!',4000);
605 msloadingde();
606 });
607
608 // 设置所有传输的按钮,"add files" 按钮不需要设置,因为 `clickable` 已指定。
609 $("#example-uploads .start").on('click', function() {
610 var count= myDropzone.getAcceptedFiles().length;
611
612 if( $("#cxname").val()=='' || $("#cxjs").val()=='' || $("#cxrmb").val()=='' || $("#cxwebkj").val()=='' || $("#cxsqlkj").val()=='' || $("#filecx").val()==null){
613 msalert(3,'表单及源码不能为空!');
614 }else{
615 if(count>0){
616 msloading('正在添加中,请稍后...');
617 databeass=true;
618 datamsalerts=true;
619 myDropzone.enqueueFiles(myDropzone.getFilesWithStatus(Dropzone.ADDED));
620 }else{
621 msalert(3,'请选择展示图片!',2000);
622 }
623 }
624 });
625
626});
627 </script>
628
629
630<?php }elseif($set=='dr'){ //导入程序
631?>
632<!--对话框-->
633<script type="text/javascript" src="<?=mnbt_asset_url('js/jquery-confirm/jquery-confirm.min.js')?>"></script>
634<script type="text/javascript" src="<?=mnbt_asset_url('js/bootstrap-table/bootstrap-table.min.js')?>"></script>
635<script type="text/javascript" src="<?=mnbt_asset_url('js/bootstrap-table/locale/bootstrap-table-zh-CN.min.js')?>"></script>
636
637<div class="container-fluid p-t-15">
638
639 <div class="row">
640
641 <div class="col-lg-12">
642 <div class="card">
643 <header class="card-header"><div class="card-title">导入程序</div></header>
644 <div class="card-body">
645
646 <form action="#!" method="post" id="example-from" onsubmit="return false;">
647
648
649 <div class="form-group">
650 <label for="web_site_icp">导入的程序包</label>
651 <div class="custom-file">
652 <input type="file" name="filecx" id="filecx" class="custom-file-input" required>
653 <label class="custom-file-label" for="validatedCustomFile">选择文件...</label>
654 <small>请选择打包导出后的程序包,这些程序包可以是其他同系统站点的,也可以是您自己站点的。它通常是一个zip压缩文件</small></div></div><br/>
655 </form>
656 <div class="form-group">
657 <label class="btn-block" for="web_site_status">是否上架这些程序</label>
658 <div class="custom-control custom-switch custom-info">
659 <input type="checkbox" class="custom-control-input" name="kg" id="kg" checked="true" checked>
660 <label class="custom-control-label" for="kg"></label>
661 </div>
662 <div id="example-uploads">
663 <button class="btn btn-primary start form-control" type="submit" onclick="zxwjsc();"><label><i class="mdi mdi-checkbox-marked-circle-outline"></i></label>确认导入</button>
664 </div>
665
666<span class="glyphicon glyphicon-info-sign">
667选择MNBT系统的一键部署程序导出文件点击[确认导入]即可!
668这个文件是一个zip压缩文件
669</span>
670</div>
671
672
673</div>
674
675<script>
676tpnamesz='0';
677//文件选择监听
678$(".custom-file-input").on("change",function(){
679 if(this.files[0]==null){
680 $(".custom-file-label").html('选择文件...');
681 }else{
682 $(".custom-file-label").html(this.files[0].name);
683 }
684});
685
686
687function pro(bolb,sizes){ //上传文件,此分片文件,上次返回的大小
688var formdata = new FormData();
689formdata.append("file",bolb); //分片文件
690formdata.append("gn","cxfiledru");
691formdata.append("fesw",sizes); //上次上传的大小
692formdata.append("zsize",file.size); //总大小
693formdata.append("sxj",$("#kg").prop('checked')); //是否上架
694let data;
695 $.ajax({
696 type:"post",
697 url:"./ajax.php",
698 data:formdata,
699 cache: false,
700 processData: false,
701 contentType: false,
702 async:true,
703 success:function(res){
704 uploadsfdyc++;
705 var json= JSON.parse(res);
706 if(json.error==1){
707 //上传完成结束
708 msalert(json.size,json.msg,4000);
709 msloadingde();
710 }else{
711 //开始下一片上传
712 if(json.size>=file.size){
713 $(".custom-file-label").html('选择文件...');
714 msalert(4,'出现意外的错误!请重新导入!', 6000);
715 msloadingde(); // 隐藏
716 }else{
717 var filebolb=filefp(json.size);
718 pro(filebolb,json.size);
719 }
720 }
721 }
722 });
723}
724
725function filefp(filesizey){ //文件分片(已上传大小)
726 fileupload(filesizey,lengths); //更新上传提示
727 if(uploadsfdyc<=2){
728 lengths=lengths; //下次分片上传的文件大小
729 }else{
730 lengths=(upxcsize.toFixed(0))*1.5; //下次分片上传的文件大小
731 }
732 var end=filesizey+lengths; //获取文件下次结尾大小
733 if(end>file.size){
734 end=file.size; //如果结尾大于文件大小那么下次结尾就是文件大小。
735 }
736 var bolb = file.slice(filesizey,end); //文件分片
737 return bolb;
738}
739
740function zxwjsc(){ //文件上传
741var myfile = document.getElementById("filecx");
742uploadsfdyc=0; //已完成上传几次分片
743file = myfile.files[0];
744if(file==null){msalert(3,'请选择要上传的文件!',4000,'#exampleModal');return;}
745//判断是否存在
746
747lengths = 1024 * 1024 * 1; //默认每片1MB大小
748msloading('文件上传中,共'+sizedwhs(file.size)+',已上传0.00MB,剩余'+sizedwhs(file.size)+'未上传,当前速度0.00MB/s,预计剩余时间获取中,文件上传进度0.00%');
749fileuploadname=file.name;
750ot = new Date().getTime(); //设置上传开始时间
751var bolb=filefp(0);
752pro(bolb,0);
753}
754
755function sizedwhs(size){ //文件单位换算
756 var units = 'B';
757 if(size/1024>1){
758 size = size/1024;
759 units = 'KB';
760 }
761 if(size/1024>1){
762 size = size/1024;
763 units = 'MB';
764 }
765 if(size/1024>1){
766 size = size/1024;
767 units = 'GB';
768 }
769 return size.toFixed(2)+units;
770}
771
772function fileupload(uploadsize,filesz){ //更新上传进度,uploadsize为已上传大小,filesz为当前分片上传大小,单位B
773var nt = new Date().getTime();//获取当前时间
774 var pertime = (nt-ot)/1000; //计算出上次调用该方法时到现在的时间差,单位为s
775 ot = new Date().getTime(); //重新赋值时间,用于下次计算
776 //上传速度计算
777 var speed = filesz/pertime;
778 var bspeed = speed;
779 var units = 'B/s';//单位名称
780 if(speed/1024>1){
781 speed = speed/1024;
782 units = 'KB/s';
783 }
784 if(speed/1024>1){
785 speed = speed/1024;
786 units = 'MB/s';
787 }
788 speed = speed.toFixed(2);
789 upxcsize=bspeed;
790 var resttime = ((file.size-uploadsize)/bspeed).toFixed(2);
791 var bfb=Math.round(uploadsize / file.size * 10000) / 100 + "%";
792 if(uploadsfdyc<1){
793 var msg='文件上传中,共'+sizedwhs(file.size)+',已上传'+sizedwhs(uploadsize)+',剩余'+sizedwhs(file.size-uploadsize)+'未上传,当前速度获取中,预计剩余时间获取中,文件上传进度'+bfb;
794 }else{
795 var msg='文件上传中,共'+sizedwhs(file.size)+',已上传'+sizedwhs(uploadsize)+',剩余'+sizedwhs(file.size-uploadsize)+'未上传,当前速度'+speed+units+',预计剩余时间'+resttime+'秒,文件上传进度'+bfb;
796 }
797 msloadingup(msg);
798}
799
800
801 </script>
802
803<?php }elseif($set=='dknode'){
804// 添加 Docker 节点(独立宝塔 Docker 面板实例,不依赖 MN_bt)
805?>
806<div class="container-fluid p-t-15">
807 <div class="row">
808 <div class="col-lg-12">
809 <div class="card">
810 <header class="card-header"><div class="card-title">添加 Docker 节点</div></header>
811 <div class="card-body">
812
813 <div class="form-group">
814 <label for="dk_name"><b>节点名称 *</b></label>
815 <input type="text" name="dk_name" id="dk_name" class="form-control" placeholder="如:北京节点A" required/>
816 <small>仅用于显示,便于区分多个 Docker 节点</small></div><br/>
817
818 <div class="form-group">
819 <label for="dk_btip"><b>宝塔面板地址 *</b></label>
820 <input type="text" name="dk_btip" id="dk_btip" class="form-control" placeholder="IP 或域名(如 1.2.3.4 或 bt.example.com)" required/>
821 <small>宝塔面板的访问地址,IP 或域名(如面板开启了域名访问则填域名)</small></div><br/>
822
823 <div class="form-group">
824 <label for="dk_btdk"><b>宝塔端口</b></label>
825 <input type="text" name="dk_btdk" id="dk_btdk" class="form-control" value="8888" placeholder="宝塔对接端口" required/>
826 <small>默认 8888,如修改过则填写修改后的端口</small></div><br/>
827
828 <div class="form-group">
829 <label class="btn-block"><b>安全访问 (HTTPS)</b></label>
830 <div class="col-xs-6">
831 <div class="custom-control custom-switch custom-info">
832 <input type="checkbox" class="custom-control-input" name="dk_ptl" id="dk_ptl">
833 <label class="custom-control-label" for="dk_ptl"></label>
834 </div>
835 <small>宝塔面板开启了「面板 SSL」(HTTPS 访问)时打开此开关;否则请保持关闭,否则无法与宝塔通信</small>
836 </div>
837 </div><br/>
838
839 <div class="form-group">
840 <label for="dk_btmy"><b>宝塔接口密钥 *</b></label>
841 <textarea name="dk_btmy" id="dk_btmy" rows="2" class="form-control" placeholder="宝塔面板 API 密钥" required></textarea>
842 <small>宝塔面板 → 设置 → API 接口 → 接口密钥</small></div><br/>
843
844 <div class="form-group">
845 <label for="dk_ktmy"><b>调用密钥(外部 API 鉴权)</b></label>
846 <input type="text" name="dk_ktmy" id="dk_ktmy" class="form-control" placeholder="留空则外部 API 不校验调用密钥"/>
847 <small>用于 api/docker.php 外部开通接口的鉴权(mn_keye 校验),留空则不校验</small></div><br/>
848
849 <div class="form-group">
850 <label for="dk_qmk"><b>二级验证密钥</b></label>
851 <input type="text" name="dk_qmk" id="dk_qmk" class="form-control" placeholder="与调用密钥组合 md5 校验"/>
852 <small>外部 API 鉴权时 mn_keye = md5(ktmy . qmk),需与调用方一致</small></div><br/>
853
854 <div class="form-group">
855 <label class="btn-block" for="dk_qk">节点开关</label>
856 <div class="col-xs-6">
857 <div class="custom-control custom-switch custom-info">
858 <input type="checkbox" class="custom-control-input" name="dk_qk" id="dk_qk" checked="true">
859 <label class="custom-control-label" for="dk_qk"></label>
860 </div>
861 </div>
862 </div>
863
864 <button class="btn btn-primary form-control" type="button" onclick="tjDkNode()"><label><i class="mdi mdi-checkbox-marked-circle-outline"></i></label>确认添加</button>
865
866 <h6 class="mt-3">说明:</h6>
867 <p>Docker 节点是<b>独立的宝塔 Docker 面板实例</b>,不依赖 MNBT 的「宝塔列表」(MN_bt 表)。<br/>
868 对接的宝塔面板需<b>已安装 Docker 管理器插件</b>(应用商店搜索「Docker管理器」安装)。<br/>
869 添加完成后可在「Docker 管理 → 节点管理」查看、编辑、检测 Docker 安装状态及容器列表。</p>
870</div>
871</div>
872</div>
873</div>
874
875<script type="text/javascript">
876function tjDkNode(){
877 var name = $('#dk_name').val().trim();
878 var btip = $('#dk_btip').val().trim();
879 var btdk = $('#dk_btdk').val().trim();
880 var btmy = $('#dk_btmy').val().trim();
881 var ktmy = $('#dk_ktmy').val().trim();
882 var qmk = $('#dk_qmk').val().trim();
883 var ptl = $('#dk_ptl').prop('checked') ? 'true' : 'false';
884 var qk = $('#dk_qk').prop('checked') ? 'true' : 'false';
885 if(!name || !btip || !btmy){
886 msalert(3,'节点名称、面板地址、接口密钥不能为空!',2000);
887 return;
888 }
889 msloading('正在添加中,请稍后...');
890 var data = {
891 gn: 'docker_node_add',
892 name: name, btip: btip, btdk: btdk, ptl: ptl,
893 btmy: btmy, ktmy: ktmy, qmk: qmk, qk: qk
894 };
895 $.post('./ajax.php', data, function(res){
896 msloadingde();
897 var j = JSON.parse(res);
898 var msg = j.msg || j.code;
899 if((j.msg||'').indexOf('成功') >= 0){
900 msalert(1, msg, 2000);
901 setTimeout(function(){ window.location.href = './docker.php?gn=node'; }, 800);
902 }else{
903 msalert(4, msg, 3000);
904 }
905 }).fail(function(){
906 msloadingde();
907 msalert(4,'请求失败,请重试',2000);
908 });
909}
910</script>
911<?php } ?>
912<!-- 域名添加已迁移至 domain_shop 插件,访问路径:plugin.php?p=domain_shop&page=product_add -->