144 lines
6.1 KiB
HTML
144 lines
6.1 KiB
HTML
<%
|
|
-- Copyright (C) 2018-2020 Lienol <lawlienol@gmail.com>
|
|
%>
|
|
<script src="<%=resource%>/vue.min.js"></script>
|
|
<fieldset class="cbi-section cbi-tblsection" id="users_table">
|
|
<h3>{{title}}</h3>
|
|
<div class="cbi-section-descr"></div>
|
|
<table class="table cbi-section-table" style="">
|
|
<tr class="tr cbi-section-table-titles anonymous">
|
|
<th class="th cbi-section-table-cell" style="width:5%">启用</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">备注</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">端口</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">禁止端口</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">设备数限制</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">单线程限速</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">总限速</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">已用流量</th>
|
|
<th class="th cbi-section-table-cell" style="width:10%">可用流量</th>
|
|
<!-- <th class="th cbi-section-table-cell" style="width:10%">SSR链接</th> -->
|
|
<th class="th cbi-section-table-cell cbi-section-actions"></th>
|
|
</tr>
|
|
<template v-for="user in users">
|
|
<tr class="tr cbi-section-table-row cbi-rowstyle-1">
|
|
<td class="td cbi-value-field" data-name="enable" data-title="启用">
|
|
<input type="hidden" :id="'ssr_mudb_server_' + user.port + '.enable'" :name="'ssr_mudb_server_' + user.port + '.enable'" :value="user.enable">
|
|
<input type="checkbox" :value="user.enable" @click="check_enable(user, $event)" :checked="user.enable == 1">
|
|
</td>
|
|
|
|
<td class="td cbi-value-field" data-name="remarks" data-title="备注">{{user.user}}</td>
|
|
<td class="td cbi-value-field" data-name="port" data-title="端口">{{user.port}}</td>
|
|
<td class="td cbi-value-field" data-name="forbidden_port" data-title="禁止端口">{{user.forbidden_port == '' ? '无' : user.forbidden_port}}</td>
|
|
<td class="td cbi-value-field" data-name="device_limit" data-title="设备数限制">{{user.protocol_param}}</td>
|
|
<td class="td cbi-value-field" data-name="speed_limit_per_con" data-title="单线程限速">{{user.speed_limit_per_con == '0' ? '无' : user.speed_limit_per_con + ' Kb/s'}}</td>
|
|
<td class="td cbi-value-field" data-name="speed_limit_per_user" data-title="总限速">{{user.speed_limit_per_user == '0' ? '无' : user.speed_limit_per_user + ' Kb/s'}}</td>
|
|
<td class="td cbi-value-field" data-name="used_total_traffic" data-title="已用流量">{{byte_format(user.u + user.d)}}</td>
|
|
<td class="td cbi-value-field" data-name="transfer_enable" data-title="可用流量">{{byte_format(user.transfer_enable)}}</td>
|
|
<!-- <td class="td cbi-value-field" data-name="ssr_link" data-title="SSR链接"><a href="#" @click="get_link(user)">获取</a></td> -->
|
|
|
|
<td class="td cbi-section-table-cell nowrap cbi-section-actions">
|
|
<div>
|
|
<input class="cbi-button cbi-button-remove" type="button" @click="clear_transfer(user)" value="清空流量">
|
|
<input class="cbi-button cbi-button-edit" type="button" value="编辑" :onclick="'location.href=\'/cgi-bin/luci/admin/vpn/ssr_mudb_server/user/' + user.port + '\''">
|
|
<input class="cbi-button cbi-button-remove" type="button" @click="remove(user)" value="删除">
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</template>
|
|
</table>
|
|
<div class="cbi-section-create cbi-tblsection-create">
|
|
<input class="cbi-button cbi-button-add" type="button" value="添加" :onclick="'location.href=\'/cgi-bin/luci/admin/vpn/ssr_mudb_server/user\''">
|
|
</div>
|
|
<fieldset class="cbi-section" id="_log_fieldset">
|
|
<legend>日志</legend>
|
|
<input class="cbi-button cbi-input-remove" type="button" @click="clear_log()" value="清空日志">
|
|
<textarea id="log_textarea" class="cbi-input-textarea" style="width: 100%;margin-top: 10px;" rows="20" wrap="off" readonly="readonly"></textarea>
|
|
</fieldset>
|
|
</fieldset>
|
|
|
|
<script>
|
|
var api_url = '<%=luci.dispatcher.build_url("admin", "vpn", "ssr_mudb_server")%>'
|
|
var vue = new Vue({
|
|
el: '#users_table',
|
|
data: {
|
|
title: '用户管理',
|
|
users: []
|
|
},
|
|
methods: {
|
|
clear_log: function() {
|
|
XHR.get(api_url + "/clear_log", null,
|
|
function (x, result) {
|
|
if (x.status == 200) {
|
|
var log_textarea = document.getElementById('log_textarea');
|
|
log_textarea.innerHTML = "";
|
|
log_textarea.scrollTop = log_textarea.scrollHeight;
|
|
}
|
|
}
|
|
)
|
|
},
|
|
check_enable: function(user, e) {
|
|
if (e.currentTarget.checked == true) {
|
|
document.getElementById("ssr_mudb_server_" + user.port + ".enable").value = "1";
|
|
} else {
|
|
document.getElementById("ssr_mudb_server_" + user.port + ".enable").value = "0";
|
|
}
|
|
},
|
|
get_link: function(user) {
|
|
XHR.get(api_url + "/get_link", { port : user.port },
|
|
function(x, result) {
|
|
if(x && x.status == 200)
|
|
alert(result.link);
|
|
}
|
|
)
|
|
},
|
|
clear_transfer: function(user) {
|
|
if (confirm('确认清空“' + user.user + '”的使用流量吗?') == true) {
|
|
XHR.get(api_url + "/clear_traffic", { port: user.port },
|
|
function(x, result) {
|
|
if(x && x.status == 200)
|
|
window.location.replace(window.location.href);
|
|
}
|
|
)
|
|
}
|
|
},
|
|
remove: function(user) {
|
|
if (confirm('确认删除“' + user.user + '”吗?') == true) {
|
|
XHR.get(api_url + "/remove_user", { port: user.port },
|
|
function(x, result) {
|
|
if(x && x.status == 200)
|
|
window.location.replace(window.location.href);
|
|
}
|
|
)
|
|
}
|
|
},
|
|
byte_format: function(byte) {
|
|
var suff = [ "B", "KB", "MB", "GB", "TB" ];
|
|
for (var i = 0; i < suff.length; i++) {
|
|
if (byte > 1024 && i < suff.length) {
|
|
byte = (byte / 1024).toFixed(2);
|
|
} else {
|
|
return byte + " " + suff[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
XHR.get(api_url + "/user_list", null,
|
|
function (x, result) {
|
|
if (x.status == 200) {
|
|
vue.users = result;
|
|
}
|
|
}
|
|
)
|
|
|
|
XHR.poll(2, api_url + "/get_log", null,
|
|
function (x, result) {
|
|
if (x.status == 200) {
|
|
var log_textarea = document.getElementById('log_textarea');
|
|
log_textarea.innerHTML = x.responseText;
|
|
log_textarea.scrollTop = log_textarea.scrollHeight;
|
|
}
|
|
}
|
|
)
|
|
</script> |