Browse Source

第三版本的控制台

master
453530270@qq.com 2 years ago
parent
commit
5972d34cab
  1. 3
      fss/go.mod
  2. 21
      fss/main.go
  3. 325
      fss/www/index.html
  4. 1
      fss/www/static/css/bootstrap.css
  5. 36
      fss/www/static/css/jquery.fileupload.css
  6. 97
      fss/www/static/css/upload.css
  7. 54
      fss/www/static/images/folder.svg
  8. 1
      fss/www/static/images/php.svg
  9. 63
      fss/www/static/images/txt.svg
  10. BIN
      fss/www/static/images/zip.png
  11. 7
      fss/www/static/js/bootstrap.min.js
  12. 4
      fss/www/static/js/jquery-2.1.3.min.js
  13. 4
      fss/www/static/js/jquery.min.js
  14. BIN
      fss/www/ups.db

3
fss/go.mod

@ -0,0 +1,3 @@
module fss
go 1.22.1

21
fss/main.go

@ -0,0 +1,21 @@
package main
import (
"fmt"
"log"
"net/http"
)
// 主函数
func main() {
//创建一个文件服务器,会去www目录下找index.html
fileServer := http.FileServer(http.Dir("./www"))
// 将 "/" 路径映射到文件服务器
http.Handle("/", fileServer)
fmt.Printf("Starting server at port 9090\n")
// 启动HTTP服务器并监听端口 80,如果出现错误,则打印错误信息并退出
if err := http.ListenAndServe(":9090", nil); err != nil {
log.Fatal(err)
}
}

325
fss/www/index.html

@ -0,0 +1,325 @@
<!DOCTYPE html>
<html>
<head>
<title>文件更新控制台</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="./static/css/bootstrap.css">
<link rel="icon" type="image/x-icon" href="/favicon.ico?v=2">
<script type="text/javascript" src="./static/js/jquery.min.js"></script>
<script type="text/javascript" src="./static/js/bootstrap.min.js"></script>
<style>
.list-group>.list-group-item {
padding: 20px;
}
.optzone {
height: 60px;
}
.stabox {
height: 260px;
overflow: scroll;
}
.flist {
height: 360px;
overflow: auto;
}
.icon {
display: inline-block;
width: 24px;
height: 24px;
}
.icon:hover {
cursor: pointer;
background-color: #da1616;
}
.folder-icon {
mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyAgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pZFlNaWQgbWVldCcgIHZpZXdCb3g9IjAgMCAyNCAyNCIgPjxwYXRoIGQ9Ik0xMCA0SDRDMi45IDQgMiA0LjkgMiA2VjE4QzIgMTkuMSAyLjkgMjAgNCAyMEgyMEMyMS4xIDIwIDIyIDE5LjEgMjIgMThWOEMyMiA2LjkgMjEuMSA2IDIwIDZIMTJMMTAgNFoiIC8+PC9zdmc+");
-webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyAgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pZFlNaWQgbWVldCcgIHZpZXdCb3g9IjAgMCAyNCAyNCIgPjxwYXRoIGQ9Ik0xMCA0SDRDMi45IDQgMiA0LjkgMiA2VjE4QzIgMTkuMSAyLjkgMjAgNCAyMEgyMEMyMS4xIDIwIDIyIDE5LjEgMjIgMThWOEMyMiA2LjkgMjEuMSA2IDIwIDZIMTJMMTAgNFoiIC8+PC9zdmc+");
background-color: #c1972e;
}
.file-icon {
mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyAgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pZFlNaWQgbWVldCcgIHZpZXdCb3g9IjAgMCAyNCAyNCIgPjxwYXRoIGQ9Ik0xNCAySDZDNC45IDIgNCAyLjkgNCA0VjIwQzQgMjEuMSA0LjkgMjIgNiAyMkgxOEMxOS4xIDIyIDIwIDIxLjEgMjAgMjBWOEwxNCAyTTEzIDlWMy41TDE4LjUgOUgxM1oiIC8+IDwvc3ZnPg==");
-webkit-mask-imagee: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyAgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pZFlNaWQgbWVldCcgIHZpZXdCb3g9IjAgMCAyNCAyNCIgPjxwYXRoIGQ9Ik0xNCAySDZDNC45IDIgNCAyLjkgNCA0VjIwQzQgMjEuMSA0LjkgMjIgNiAyMkgxOEMxOS4xIDIyIDIwIDIxLjEgMjAgMjBWOEwxNCAyTTEzIDlWMy41TDE4LjUgOUgxM1oiIC8+IDwvc3ZnPg==");
background-repeat: no-repeat;
background-color: #0e0b8b;
}
</style>
</head>
<body>
<div class="jumbotron">
<div class="container">
<p>文件更新控制台</p>
<p>ver:2.04</p>
</div>
</div>
<!-- 输入服务器ip -->
<div class="container">
<div class="form-group col-md-6">
<div class="input-group">
<div class="input-group-addon">服务器ip</div>
<input type="text" class="form-control" name="sip" id="scip" placeholder="eg:192.168.66.99">
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">监视目录</div>
<input type="text" class="form-control" name="sdir" id="" placeholder="eg :/www/wwwroot/aa_com/" />
</div>
</div>
<div class="form-group col-md-12">
<button type="button" id="entsip" class="btn btn-primary">查看信息</button>
</div>
</div>
<!-- 罗列文件的列表信息 -->
<div class="container">
<!-- 源服务器 -->
<div class="col-md-12">
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">源站(192.168.66.100)</div>
<div class="panel-body">
<p>监听目录:/www</p>
<p>相对目录: /app/common </p>
</div>
<!-- List group -->
<ul class="list-group">
<li class="list-group-item optzone">
<div class="col-md-10">
<input type="checkbox" name="sfiles" />
<span class="icon folder-icon"></span>
<a href="#">涨涨</a>
</div>
<div class="col-md-2">
<a href="#" class="btn btn-primary btn-sm">同步</a>
<a href="#" class="btn btn-success btn-sm">复制</a></a>
</div>
</li>
<li class="list-group-item optzone">
<div class="col-md-10">
<input type="checkbox" name="sfiles" />
<span class="icon file-icon"></span>
<a href="#">fa.php</a>
<span>HASh:98986</span>
</div>
<div class="col-md-2">
<a href="#" class="btn btn-primary btn-sm">同步</a>
<a href="#" class="btn btn-success btn-sm">复制</a></a>
</div>
</li>
</ul>
</div>
</div>
</div>
<!-- 目标服务器 -->
<div class="container">
<!-- 目标的服务器信息 -->
<div class="form-group col-md-6">
<div class="input-group">
<div class="input-group-addon">服务器ip</div>
<input type="text" class="form-control" name="tsip" id="tcip" placeholder="eg:192.168.66.99">
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">监视目录</div>
<input type="text" class="form-control" name="tsdir" id="" placeholder="eg :/www/wwwroot/aa_com/" />
</div>
</div>
<div class="form-group col-md-12">
<button type="button" id="entsip" class="btn btn-primary">查看信息</button>
</div>
<!-- 目标服务器 -->
<div class="col-md-12">
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading" id="mbip">目标服务器</div>
<div class="panel-body">
<p>监听目录:<span id="sc01"></span></p>
<p>相对目录: <span id="sc02"></span> </p>
</div>
<!-- List group -->
<ul class="list-group" id="tgsc">
</ul>
</div>
</div>
</div>
<!-- 状态信息 -->
<div class="container">
<div class="panel">
<div class="panel-heading">运行状态</div>
<div class="panel-body">
<ul class="list-group" id="rstatus">
<li class="list-group-item">1、获取远程服务器的文件信息</li>
<li class="list-group-item">2、校验hash值</li>
<li class="list-group-item">3、枚举出所有hash不同的文件</li>
<li class="list-group-item">4、勾选文件更新即可</li>
<li class="list-group-item">5、根据勾选的文件制作更新zip文件,发送到目标服务器</li>
<li class="list-group-item">文件的参考HASH值,如何同步到几个平台?</li>
</ul>
</div>
</div>
</div>
<script type="text/javascript">
var chkall = true;
var chknum = 0;
var scip = ""; //目标服务器ip
var urlpath = ".";// 当前的操作目录
$(function () {
// read sessionStorage
var oscip = sessionStorage.getItem("scip");
if (oscip != "") {
$("#scip").val(oscip);
scip = oscip;
$("input[name='serverip']").val(oscip);
}
// click function
$("#entsip").on("click", function () {
tgfs();
})
// 目标服务器的文件信息
var tgfs = function () {
//
scip = $("#scip").val();
// ip storage
sessionStorage.setItem("scip", scip);
var html = "<li class=\"list-group-item\">输入目标服务器" + scip + "</li>";
// 目标站
$("#mbip").text("目标站(" + scip + ")");
// 获取信息
gescinfo(scip);
//
$("#rstatus").append(html);
}
// 获取目标服务器的信息
var gescinfo = function (scip) {
// 客户端的状态地址
var url = "http://" + scip + ":9099/sc?p=" + urlpath.replace("/\\/g", "\/");
//
var html = "";
$.getJSON(url, function (res) {
// res.curdir
$.each(res.data.list, function (k, v) {
html += "<li class=\"list-group-item optzone\"><div class=\"col-md-10\">";
if (v.dirflag) {
html += "<span class=\"icon folder-icon\"></span>" + v.fname + "</div>";
} else {
html += "<span class=\"icon file-icon\"></span>" + v.fname + "</div>";
}
if (v.isbackup == 1) {
html += "<div class=\"col-md-2\"><a href=\"#\" class=\"btn btn-warning btn-sm\">恢复</a></div>";
} else {
html += "<div class=\"col-md-2\"></div>";
}
html += "</li>";
})
// append to html
$("#tgsc").html(html)
writelog(scip + "获取数据:" + res.data.list.length + "条数据")
// 客户端监控目录
$("#sc01").text(res.workdir);
$("#sc02").text(res.curdir);
});
}
// write log
var writelog = function (html) {
var hprex = "<li class=\"list-group-item\">" + html + "</li>";
$("#rstatus").append(hprex);
}
//同步文件
$(".gsbtn").on("click", function () {
var ff = $(this).attr("fid");
var fpa = $(this).attr("fpa");
// build post body
var param = { sip: scip, bfile: ff, bpath: fpa }
// do post
$.post("./sup", param, function (res) {
if (res.status == '200') {
alert("操作成功");
}
});
return false;
})
//全选按钮设置点击事件
$("#slall").click(function () {
//1、循环设置其它多选框选中状态,跟标识用的变量一样
$(".mfile").prop("checked", chkall);
// down button toggle
if (chkall || chknum > 2) {
$("#tropt").show()
chknum += 1
} else {
$("#tropt").hide()
chknum -= 1
}
//2、标识的变量取反
chkall = !chkall;
})
//同步操作
$("#sybtn").on("click", function () {
var ttsip = $("input[name='serverip']").val();
if (ttsip == "") {
alert("老天鹅,你还没填写目标服务器地址。");
} else {
$("#hscip").val(scip);
// 提交表单
$(".form-inline").submit();
}
});
// 勾选是否同步的选项
$("#sw_sybtn").on("click", function () {
let swval = $(this).has("checked").val();
// 设置相反的值
alert(swval);
});
});
</script>
</body>
</html>

1
fss/www/static/css/bootstrap.css

File diff suppressed because one or more lines are too long

36
fss/www/static/css/jquery.fileupload.css

@ -0,0 +1,36 @@
@charset "UTF-8";
/*
* jQuery File Upload Plugin CSS 1.3.0
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
.fileinput-button {
position: relative;
overflow: hidden;
}
.fileinput-button input {
position: absolute;
top: 0;
right: 0;
margin: 0;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
font-size: 200px;
direction: ltr;
cursor: pointer;
}
/* Fixes for IE < 8 */
@media screen\9 {
.fileinput-button input {
filter: alpha(opacity=0);
font-size: 100%;
height: 100%;
}
}

97
fss/www/static/css/upload.css

@ -0,0 +1,97 @@
.row-file {
height: 40px;
}
.column-icon {
width: 40px;
text-align: center;
}
.column-name {
}
.column-size {
width: 100px;
text-align: right;
}
.column-move {
width: 40px;
text-align: center;
}
.column-delete {
width: 40px;
text-align: center;
}
.column-path {
}
.column-progress {
width: 200px;
}
.footer {
color: #999;
text-align: center;
font-size: 0.9em;
}
#reload {
float: right;
}
#create-input {
width: 50%;
height: 20px;
}
#move-input {
width: 80%;
height: 20px;
}
/* Bootstrap overrides */
.btn:focus {
outline: none;
}
.btn-toolbar {
margin-top: 30px;
margin-bottom: 20px;
}
.table .progress {
margin-top: 0px;
margin-bottom: 0px;
height: 16px;
}
.panel-default > .panel-heading {
color: #555;
}
.breadcrumb {
background-color: transparent;
border-radius: 0px;
margin-bottom: 0px;
padding: 0px;
}
.breadcrumb > .active {
color: #555;
}
.breadcrumb > li + li:before {
color: #999;
}
.table > tbody > tr > td {
vertical-align: middle;
}
.table > tbody > tr > td > p {
margin: 0px;
}

54
fss/www/static/images/folder.svg

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="64px" height="60.001px" viewBox="0 0 64 60.001" style="enable-background:new 0 0 64 60.001;" xml:space="preserve">
<g id="Folder">
<g>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#CCA352;" d="M60,4.001H24C24,1.792,22.209,0,20,0H4
C1.791,0,0,1.792,0,4.001V8v6.001v2c0,2.209,1.791,4,4,4h56c2.209,0,4-1.791,4-4V8C64,5.791,62.209,4.001,60,4.001z"/>
</g>
</g>
<g id="File_1_">
<g>
<path style="fill:#FFFFFF;" d="M56,8H8c-2.209,0-4,1.791-4,4.001v4c0,2.209,1.791,4,4,4h48c2.209,0,4-1.791,4-4v-4
C60,9.791,58.209,8,56,8z"/>
</g>
</g>
<g id="Folder_1_">
<g>
<path style="fill:#FFCC66;" d="M60,12.001H4c-2.209,0-4,1.791-4,4v40c0,2.209,1.791,4,4,4h56c2.209,0,4-1.791,4-4v-40
C64,13.792,62.209,12.001,60,12.001z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
fss/www/static/images/php.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

63
fss/www/static/images/txt.svg

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 56 56" style="enable-background:new 0 0 56 56;" xml:space="preserve">
<g>
<path style="fill:#E9E9E0;" d="M36.985,0H7.963C7.155,0,6.5,0.655,6.5,1.926V55c0,0.345,0.655,1,1.463,1h40.074
c0.808,0,1.463-0.655,1.463-1V12.978c0-0.696-0.093-0.92-0.257-1.085L37.607,0.257C37.442,0.093,37.218,0,36.985,0z"/>
<polygon style="fill:#D9D7CA;" points="37.5,0.151 37.5,12 49.349,12 "/>
<path style="fill:#95A5A5;" d="M48.037,56H7.963C7.155,56,6.5,55.345,6.5,54.537V39h43v15.537C49.5,55.345,48.845,56,48.037,56z"/>
<g>
<path style="fill:#FFFFFF;" d="M21.867,42.924v1.121h-3.008V53h-1.654v-8.955h-3.008v-1.121H21.867z"/>
<path style="fill:#FFFFFF;" d="M28.443,48.105L31,53h-1.9l-1.6-3.801h-0.137L25.641,53h-1.9l2.557-4.895l-2.721-5.182h1.873
l1.777,4.102h0.137l1.928-4.102h1.873L28.443,48.105z"/>
<path style="fill:#FFFFFF;" d="M40.529,42.924v1.121h-3.008V53h-1.654v-8.955h-3.008v-1.121H40.529z"/>
</g>
<path style="fill:#C8BDB8;" d="M18.5,13h-6c-0.553,0-1-0.448-1-1s0.447-1,1-1h6c0.553,0,1,0.448,1,1S19.053,13,18.5,13z"/>
<path style="fill:#C8BDB8;" d="M21.5,18h-9c-0.553,0-1-0.448-1-1s0.447-1,1-1h9c0.553,0,1,0.448,1,1S22.053,18,21.5,18z"/>
<path style="fill:#C8BDB8;" d="M25.5,18c-0.26,0-0.521-0.11-0.71-0.29c-0.181-0.19-0.29-0.44-0.29-0.71s0.109-0.52,0.3-0.71
c0.36-0.37,1.04-0.37,1.41,0c0.18,0.19,0.29,0.45,0.29,0.71c0,0.26-0.11,0.52-0.29,0.71C26.02,17.89,25.76,18,25.5,18z"/>
<path style="fill:#C8BDB8;" d="M37.5,18h-8c-0.553,0-1-0.448-1-1s0.447-1,1-1h8c0.553,0,1,0.448,1,1S38.053,18,37.5,18z"/>
<path style="fill:#C8BDB8;" d="M12.5,33c-0.26,0-0.521-0.11-0.71-0.29c-0.181-0.19-0.29-0.45-0.29-0.71
c0-0.26,0.109-0.52,0.29-0.71c0.37-0.37,1.05-0.37,1.42,0.01c0.18,0.18,0.29,0.44,0.29,0.7c0,0.26-0.11,0.52-0.29,0.71
C13.02,32.89,12.76,33,12.5,33z"/>
<path style="fill:#C8BDB8;" d="M24.5,33h-8c-0.553,0-1-0.448-1-1s0.447-1,1-1h8c0.553,0,1,0.448,1,1S25.053,33,24.5,33z"/>
<path style="fill:#C8BDB8;" d="M43.5,18h-2c-0.553,0-1-0.448-1-1s0.447-1,1-1h2c0.553,0,1,0.448,1,1S44.053,18,43.5,18z"/>
<path style="fill:#C8BDB8;" d="M34.5,23h-22c-0.553,0-1-0.448-1-1s0.447-1,1-1h22c0.553,0,1,0.448,1,1S35.053,23,34.5,23z"/>
<path style="fill:#C8BDB8;" d="M43.5,23h-6c-0.553,0-1-0.448-1-1s0.447-1,1-1h6c0.553,0,1,0.448,1,1S44.053,23,43.5,23z"/>
<path style="fill:#C8BDB8;" d="M16.5,28h-4c-0.553,0-1-0.448-1-1s0.447-1,1-1h4c0.553,0,1,0.448,1,1S17.053,28,16.5,28z"/>
<path style="fill:#C8BDB8;" d="M30.5,28h-10c-0.553,0-1-0.448-1-1s0.447-1,1-1h10c0.553,0,1,0.448,1,1S31.053,28,30.5,28z"/>
<path style="fill:#C8BDB8;" d="M43.5,28h-9c-0.553,0-1-0.448-1-1s0.447-1,1-1h9c0.553,0,1,0.448,1,1S44.053,28,43.5,28z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
fss/www/static/images/zip.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

7
fss/www/static/js/bootstrap.min.js

File diff suppressed because one or more lines are too long

4
fss/www/static/js/jquery-2.1.3.min.js

File diff suppressed because one or more lines are too long

4
fss/www/static/js/jquery.min.js

File diff suppressed because one or more lines are too long

BIN
fss/www/ups.db

Binary file not shown.
Loading…
Cancel
Save