forwardList.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <div class="layui-tab layui-tab-card">
  2. <ul class="layui-tab-title">
  3. <li class="layui-this">端口转发列表</li>
  4. <li>帮助说明</li>
  5. </ul>
  6. <div class="layui-tab-content" style="height: auto;">
  7. <div class="layui-tab-item layui-show">
  8. <div class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="app-content-list">
  9. <div class="layui-form-item">
  10. <div class="layui-inline">
  11. <label class="layui-form-label">本地端口</label>
  12. <div class="layui-input-inline">
  13. <input type="text" id="port" name="port" placeholder="本地监听端口" autocomplete="off" class="layui-input">
  14. </div>
  15. </div>
  16. <div class="layui-inline">
  17. <label class="layui-form-label">目标端口</label>
  18. <div class="layui-input-inline">
  19. <input type="text" id="targetPort" name="targetPort" placeholder="转发到端口" autocomplete="off" class="layui-input">
  20. </div>
  21. </div>
  22. <div class="layui-inline">
  23. <button class="layui-btn layuiadmin-btn-list" onclick="query(1);">
  24. 查询
  25. </button>
  26. </div>
  27. </div>
  28. </div>
  29. <button class="layui-btn layui-btn-small" onclick="addForward();"><i class="layui-icon"></i> 添加转发</button>
  30. <button class="layui-btn layui-btn-small" onclick="delForward();"><i class="layui-icon"></i> 批量删除</button>
  31. <div class="layui-form">
  32. <table class="layui-table">
  33. <colgroup>
  34. <col width="20">
  35. <col width="50">
  36. <col width="300">
  37. <col width="150">
  38. <col width="120">
  39. <col width="150">
  40. <col width="50">
  41. <col width="150">
  42. <col width="100">
  43. <col width="70">
  44. <col width="200">
  45. </colgroup>
  46. <thead>
  47. <tr>
  48. <th>
  49. <input type="checkbox" name="" lay-skin="primary" lay-filter="allChoose">
  50. </th>
  51. <th>ID</th>
  52. <th>名称</th>
  53. <th>本地监听地址</th>
  54. <th>本地监听端口</th>
  55. <th>转发方式</th>
  56. <th>协议</th>
  57. <th>转发到地址</th>
  58. <th>转发到端口</th>
  59. <th>状态</th>
  60. <th>操作</th>
  61. </tr>
  62. </thead>
  63. <tbody id="gridBody">
  64. </tbody>
  65. </table>
  66. </div>
  67. <div id="pagination"></div>
  68. </div>
  69. <div class="layui-tab-item">
  70. <pre class="layui-code">
  71. 说明文档请访问:<a href="https://gitee.com/tavenli/port-forward" target="_blank">https://gitee.com/tavenli/port-forward</a>
  72. 使用问题或个性化需求可加QQ号:17020415 (申请时请备注:端口转发)
  73. </pre>
  74. </div>
  75. </div>
  76. </div>
  77. <script id="grid_tpl" type="text/html">
  78. {Start{# if(d.Data === null || d.Data.length === 0){ }End}
  79. <tr>
  80. <td colspan="10">
  81. 查询转发配置规则结果为空
  82. </td>
  83. </tr>
  84. {Start{# } else { }End} {Start{# layui.each(d.Data, function(index, item){ }End}
  85. <tr>
  86. <td>
  87. <input type="checkbox" name="id" lay-skin="primary" value="{Start{ item.Id }End}">
  88. </td>
  89. <td>{Start{ item.Id }End}</td>
  90. <td>{Start{ item.Name }End}</td>
  91. <td>{Start{ fmtAddr(item.Addr) }End}</td>
  92. <td>{Start{ item.Port }End}</td>
  93. <td>{Start{ fmtFType(item.FType) }End}</td>
  94. <td>{Start{ item.Protocol }End}</td>
  95. <td>{Start{ item.TargetAddr }End}</td>
  96. <td>{Start{ item.TargetPort }End}</td>
  97. <td>{Start{ fmtStatus(item.Status) }End}</td>
  98. <td>{Start{ oprFormatLink(item.Status,item) }End}</td>
  99. </tr>
  100. {Start{# }); }End} {Start{# } }End}
  101. </script>
  102. <script type="text/javascript">
  103. $(document).ready(function() {
  104. layui.use(["jquery", "layer", "form", "element", "laytpl", "laypage"], function() {
  105. var $ = layui.jquery,
  106. layer = layui.layer,
  107. form = layui.form(),
  108. laytpl = layui.laytpl,
  109. laypage = layui.laypage;
  110. //全选
  111. form.on('checkbox(allChoose)', function(data) {
  112. var child = $(data.elem).parents('table').find('tbody input[type="checkbox"]');
  113. child.each(function(index, item) {
  114. item.checked = data.elem.checked;
  115. });
  116. form.render('checkbox');
  117. });
  118. layui.laytpl.config({
  119. open: "{Start{",
  120. close: "}End}"
  121. });
  122. query(1);
  123. });
  124. });
  125. function query(pIndex) {
  126. // var columnFiled = $("#columnFiled").val();
  127. // var keyWord = $("#keyWord").val();
  128. var port = $("#port").val();
  129. var targetPort = $("#targetPort").val();
  130. $.post("ForwardList/json", {
  131. port: port,
  132. targetPort: targetPort,
  133. pIndex: pIndex,
  134. pSize: 10
  135. }, function(json) {
  136. if (json.Code == 0) { //成功
  137. renderGrid(json.Data);
  138. var totalPages = json.Data.Pages;
  139. var totalRows = json.Data.TotalRows;
  140. //显示分页
  141. layui.laypage({
  142. cont: 'pagination', //容器
  143. pages: totalPages, //通过后台拿到的总页数
  144. total: totalRows,
  145. groups: 5, //连续分页数
  146. skin: "#51b921", //控制分页皮肤。目前支持:molv、yahei、flow 除此之外,还支持16进制颜色值,如:skin:'#c00'
  147. curr: pIndex || 1, //当前页
  148. skip: true,
  149. jump: function(obj, first) { //触发分页后的回调
  150. if (!first) { //点击跳页触发函数自身,并传递当前页:obj.curr
  151. query(obj.curr);
  152. }
  153. }
  154. });
  155. layui.form().render('checkbox');
  156. } else { //失败
  157. layui.layer.alert("失败:" + json.Msg, {
  158. icon: 2
  159. });
  160. }
  161. }, 'json');
  162. }
  163. function renderGrid(data) {
  164. var grid_tpl = document.getElementById('grid_tpl').innerHTML;
  165. layui.laytpl(grid_tpl).render(data, function(html) {
  166. $("#gridBody").html(html);
  167. });
  168. }
  169. function oprFormatLink(val, row) {
  170. var html = "";
  171. if (row.Status == 1) {
  172. html += "<button class='layui-btn layui-btn-small layui-btn-danger' onclick='CloseForward(" + row.Id + ");'><i class='layui-icon'></i></button>";
  173. } else {
  174. html += "<button class='layui-btn layui-btn-small layui-btn-normal' onclick='OpenForward(" + row.Id + ");'><i class='layui-icon'></i></button>";
  175. }
  176. html += "<button class='layui-btn layui-btn-small' onclick='editForward(" + row.Id + ");'><i class='layui-icon'></i></button>";
  177. return html;
  178. }
  179. function fmtAddr(val) {
  180. if (val == "") {
  181. return "监听所有地址";
  182. } else {
  183. return val;
  184. }
  185. }
  186. function fmtFType(val) {
  187. var html = "";
  188. switch (val) {
  189. case 0:
  190. html = "<font color='blue'>端口到端口映射</font>";
  191. break;
  192. case 1:
  193. html = "<font color='orange'>内网映射 S->C</font>";
  194. break;
  195. case 2:
  196. html = "<font color='red'>内网反向映射 C->S</font>";
  197. break;
  198. default:
  199. html = "<font color='gray'>其它:" + val + "</font>";
  200. break;
  201. }
  202. return html;
  203. }
  204. function fmtStatus(val) {
  205. var html = "";
  206. switch (val) {
  207. case 0:
  208. html = "<font color='red'>停止</font>";
  209. break;
  210. case 1:
  211. html = "<font color='green'>转发中</font>";
  212. break;
  213. default:
  214. html = "<font color='gray'>其它:" + val + "</font>";
  215. break;
  216. }
  217. return html;
  218. }
  219. function addForward() {
  220. $.get('/u/AddForward', {
  221. rnd: Math.random()
  222. }, function(html) {
  223. layer.open({
  224. type: 1, //page层
  225. area: ['400px', '450px'],
  226. title: '添加网络转发端口',
  227. shade: 0.6, //遮罩透明度
  228. moveType: 1, //拖拽风格,0是默认,1是传统拖动
  229. shift: -1, //0-6的动画形式,-1不开启
  230. maxmin: false,
  231. content: html,
  232. btn: ['保存配置', '取消'],
  233. yes: function(index, layero) {
  234. submitForm(index);
  235. },
  236. btn2: function(index) {
  237. layer.close(index);
  238. },
  239. cancel: function(index) {
  240. layer.close(index);
  241. }
  242. });
  243. });
  244. }
  245. function editForward(id) {
  246. $.get('/u/EditForward', {
  247. rnd: Math.random(),
  248. id: id
  249. }, function(html) {
  250. layer.open({
  251. type: 1, //page层
  252. area: ['600px', '550px'],
  253. title: '编辑网络转发端口',
  254. shade: 0.6, //遮罩透明度
  255. moveType: 1, //拖拽风格,0是默认,1是传统拖动
  256. shift: -1, //0-6的动画形式,-1不开启
  257. maxmin: false,
  258. content: html,
  259. btn: ['保存配置', '取消'],
  260. yes: function(index, layero) {
  261. submitForm(index);
  262. },
  263. btn2: function(index) {
  264. layer.close(index);
  265. },
  266. cancel: function(index) {
  267. layer.close(index);
  268. }
  269. });
  270. });
  271. }
  272. function delForward() {
  273. var selectedItems = getChkValues("id");
  274. if (selectedItems.length == 0) {
  275. layer.alert("没有勾选要批量操作的数据.", {
  276. icon: 3,
  277. title: "警告信息"
  278. });
  279. return;
  280. }
  281. var ids = selectedItems.join(',');
  282. layer.confirm("确定批量删除勾选的数据吗?", {
  283. btn: ['确定', '取消'] //按钮
  284. }, function(index, layero) {
  285. $.post("/u/DelForward", {
  286. rnd: Math.random(),
  287. ids: ids
  288. }, function(json) {
  289. if (json.Code == 0) { //成功
  290. layer.msg("执行成功.");
  291. query(1);
  292. } else { //失败
  293. layer.alert(json.Msg, {
  294. icon: 2
  295. });
  296. query(1);
  297. }
  298. }, 'json');
  299. });
  300. }
  301. function refreshGrid() {
  302. query(1);
  303. }
  304. function OpenForward2(id) {
  305. layer.confirm("确定启动该转发吗?", {
  306. btn: ['确定', '取消'] //按钮
  307. }, function(index, layero) {
  308. $.post("/u/OpenForward", {
  309. rnd: Math.random(),
  310. id: id
  311. }, function(json) {
  312. if (json.Code == 0) { //成功
  313. layer.msg("执行成功.");
  314. query(1);
  315. } else { //失败
  316. layer.alert(json.Msg, {
  317. icon: 2
  318. });
  319. query(1);
  320. }
  321. }, 'json');
  322. });
  323. }
  324. function CloseForward2(id) {
  325. layer.confirm("确定停止该转发吗?", {
  326. btn: ['确定', '取消'] //按钮
  327. }, function(index, layero) {
  328. $.post("/u/CloseForward", {
  329. rnd: Math.random(),
  330. id: id
  331. }, function(json) {
  332. if (json.Code == 0) { //成功
  333. layer.msg("执行成功.");
  334. query(1);
  335. } else { //失败
  336. layer.alert(json.Msg, {
  337. icon: 2
  338. });
  339. query(1);
  340. }
  341. }, 'json');
  342. });
  343. }
  344. function OpenForward(id) {
  345. $.post("/u/OpenForward", {
  346. rnd: Math.random(),
  347. id: id
  348. }, function(json) {
  349. if (json.Code == 0) { //成功
  350. layer.msg("执行成功.");
  351. query(1);
  352. } else { //失败
  353. layer.alert(json.Msg, {
  354. icon: 2
  355. });
  356. query(1);
  357. }
  358. }, 'json');
  359. }
  360. function CloseForward(id) {
  361. $.post("/u/CloseForward", {
  362. rnd: Math.random(),
  363. id: id
  364. }, function(json) {
  365. if (json.Code == 0) { //成功
  366. layer.msg("执行成功.");
  367. query(1);
  368. } else { //失败
  369. layer.alert(json.Msg, {
  370. icon: 2
  371. });
  372. query(1);
  373. }
  374. }, 'json');
  375. }
  376. </script>
粤ICP备19079148号