http
@@ -774,6 +774,11 @@ namespace Home.Controllers
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public async Task<IActionResult> Http()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[HttpGet, AllowAnonymous]
|
||||
public async Task<ApiResult> IsPay(string orderNo)
|
||||
|
||||
@@ -597,6 +597,42 @@ namespace Home.Controllers
|
||||
var userId =this.Request.GetUserInfo().UserId;
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
[UserAuth]
|
||||
public IActionResult HttpRecharge()
|
||||
{
|
||||
var userId =this.Request.GetUserInfo().UserId;
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
[UserAuth]
|
||||
public IActionResult HttpPackageList()
|
||||
{
|
||||
var userId =this.Request.GetUserInfo().UserId;
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
[UserAuth]
|
||||
public IActionResult HttpLongterm()
|
||||
{
|
||||
var userId =this.Request.GetUserInfo().UserId;
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
[UserAuth]
|
||||
public IActionResult HttpUseHistory()
|
||||
{
|
||||
var userId =this.Request.GetUserInfo().UserId;
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
[UserAuth]
|
||||
public IActionResult HttpWhiteIp()
|
||||
{
|
||||
var userId =this.Request.GetUserInfo().UserId;
|
||||
return View();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发送手机验证码
|
||||
|
||||
@@ -224,9 +224,9 @@
|
||||
<li>客服电话:400 800 9925</li>
|
||||
<li>客服QQ:800101003</li><br>
|
||||
<li>客户经理: </li><br>
|
||||
<li>萱萱-电话/微信:13523072998</li><br>
|
||||
<li>萱萱-电话/微信:15225139515</li><br>
|
||||
<li>琪琪-电话/微信:15713870747</li><br>
|
||||
<li>兔兔-电话/微信:19503890845</li><br>
|
||||
<li>兔兔-电话/微信:15111748058</li><br>
|
||||
<li>工作时间: 8:30-23:00</li>
|
||||
</div>
|
||||
<div class="item">
|
||||
|
||||
@@ -41,10 +41,13 @@
|
||||
<link rel="stylesheet" type="text/css" href="css/swiper.min.css" />
|
||||
<link rel="stylesheet" type="text/css" href="css/flash.css" />
|
||||
<link rel="stylesheet" type="text/css" href="css/animate.min.css" />
|
||||
|
||||
<link href="/http/css/style.css" rel="stylesheet">
|
||||
<link rel="Shortcut Icon" href="/img/favicon.ico" type="image/x-icon" />
|
||||
<script src="js/jquery.min.js?test=12312" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="js/swiper.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
|
||||
@@ -175,22 +178,6 @@
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.notice {
|
||||
position: fixed;
|
||||
width: 500px;
|
||||
height: auto;
|
||||
left: 50%;
|
||||
top: 39%;
|
||||
margin-left: -200px;
|
||||
margin-top: -160px;
|
||||
z-index: 3;
|
||||
background: #fff;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
padding: 30px;
|
||||
z-index: 10000000;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
@@ -374,27 +361,32 @@
|
||||
<a href="#"><img src="~/img/logo.png"></a>
|
||||
</div>
|
||||
<div class="col-lg-10 col-md-10">
|
||||
<ul class="navList pull-right">
|
||||
<ul class="navList pull-right sf-menu">
|
||||
<li><a href="/">首页</a></li>
|
||||
<li><a href="/product/index">产品购买 <span style="color: red;">活动</span></a></li>
|
||||
<li> <a href="#">产品购买</a>
|
||||
<ul>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/index">动静态IP</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/http">HTTP</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/routeros">软路由购买</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="http://vps.juip.com">动态vps</a> </li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/LineList/index">IP线路表</a></li>
|
||||
<li><a href="/product/soft">软件下载</a></li>
|
||||
<li><a href="/article/index">教程&帮助</a></li>
|
||||
<li><a href="/product/routeros">软路由购买</a></li>
|
||||
<li><a href="http://vps.juip.com" style="color: red;">动态VPS</a></li>
|
||||
<li>
|
||||
@if (user == null)
|
||||
{
|
||||
<button type="button" class="btn btn-primary reg">注册</button>
|
||||
<button type="button" class="btn btn-primary login">登录</button>
|
||||
<button type="button" class="btn btn-warning reg">注册</button>
|
||||
<button type="button" class="btn btn-danger login">登录</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="item" style="display: inline-block;margin-right:20px;">
|
||||
<a asp-action="index" style="border-radius:25px;background-color:#FF9900;padding:5px;" asp-controller="user">个人中心</a>
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="index" class="btn btn-warning margin-top-10" asp-controller="user">个人中心</a>
|
||||
</div>
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="LoginOut" asp-controller="user">退出登录</a>
|
||||
<a asp-action="LoginOut"class="btn btn-danger margin-top-10" asp-controller="user">退出登录</a>
|
||||
</div>
|
||||
|
||||
}
|
||||
@@ -501,9 +493,9 @@
|
||||
<li>客服电话:400 800 9925</li>
|
||||
<li>客服QQ:800101003</li><br>
|
||||
<li>客户经理: </li><br>
|
||||
<li>萱萱-电话/微信:13523072998</li><br>
|
||||
<li>萱萱-电话/微信:15225139515</li><br>
|
||||
<li>琪琪-电话/微信:15713870747</li><br>
|
||||
<li>兔兔-电话/微信:19503890845</li><br>
|
||||
<li>兔兔-电话/微信:15111748058</li><br>
|
||||
<li>工作时间: 8:30-23:00</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -536,35 +528,36 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="notice">
|
||||
|
||||
|
||||
|
||||
<div style="font-size: 15px;width:100%">
|
||||
@* <div><a style="cursor:pointer;float:right;" onclick="know()">关闭</a></div> *@
|
||||
<h3 style="margin-top: 0px;margin-left:10%;text-align:center;width:80%;margin-bottom: 10px;color:red;">公告</h3>
|
||||
<div style="color: red;text-align:center;">
|
||||
<div id="myModal" class="modal fade">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content padding15 bg_gray">
|
||||
<div class="modal-body clearfix text-center">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h1 class="text-success">公告</h1>
|
||||
<p>杜绝电信诈骗及任何违法行为</p>
|
||||
<p>所有IP产品已记录日志,均保留6个月以上</p>
|
||||
<p>发现违法行为直接提交网监部门处理</p>
|
||||
</div>
|
||||
<h4 style="margin-top: 10px;font-weight:bold;">聚IP最新动态:</h4>
|
||||
<div style="padding-left: 20px;">
|
||||
<p>蘑菇IP不限速网速贼快,新用户天卡1毛钱</p>
|
||||
<p>蘑菇安卓APP已上线,功能强大,欢迎下载使用</p>
|
||||
<div class="row text-center">
|
||||
<div class="col-md-4">
|
||||
<a style="cursor:pointer;" href="http://www.juip.com/product/index" type="button" class="btn btn-primary" >查看活动</a>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<a style="cursor:pointer" href="https://admin.qidian.qq.com/template/blue/mp/menu/qr-code-jump.html?linkType=0&env=ol&kfuin=2852138148&fid=299&key=f377ec024ca45115a03a7632c7bda230&cate=1&source=&isLBS=&isCustomEntry=&type=16&ftype=1&_type=wpa&qidian=true&_pid=l1gunh.657dox.kjy6xnny" type="button" class="btn btn-danger quxiao" >联系客服</a>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<a style="cursor:pointer;" data-dismiss="modal" aria-hidden="true" type="button" class="btn btn-primary" >我知道了</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p style="width: 100%;">
|
||||
<a style="cursor:pointer;margin-left:10%;display:inline;" href="http://www.juip.com/product/index" type="button" class="btn btn-primary" >查看活动</a>
|
||||
<a style="cursor:pointer;margin-left:10%;display:inline;" href="https://admin.qidian.qq.com/template/blue/mp/menu/qr-code-jump.html?linkType=0&env=ol&kfuin=2852138148&fid=299&key=f377ec024ca45115a03a7632c7bda230&cate=1&source=&isLBS=&isCustomEntry=&type=16&ftype=1&_type=wpa&qidian=true&_pid=l1gunh.657dox.kjy6xnny" type="button" class="btn btn-danger quxiao" >联系客服</a>
|
||||
<a style="cursor:pointer;margin-left:10%;display:inline;" onclick="know()" type="button" class="btn btn-primary" >我知道了</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
var swiper = new Swiper('.swiper-container', {
|
||||
slidesPerView: 6,
|
||||
@@ -583,13 +576,9 @@
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
$('.notice').hide();
|
||||
@* self.setTimeout(function(){ *@
|
||||
$('.notice').show();
|
||||
@* },3000) *@
|
||||
function know() {
|
||||
$('.notice').hide();
|
||||
}
|
||||
$(document).on("ready", function(e) {
|
||||
$("#myModal").modal('show');
|
||||
});
|
||||
function login() {
|
||||
var name = $("#rLogin_Name").val()
|
||||
var pwd = $("#rLogin_Pwd").val()
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
<div class="col-lg-3">
|
||||
|
||||
</div>
|
||||
<div class="col-lg-9" style="padding: 10px 0 0 0;">
|
||||
<div class="col-lg-12 text-center" style="padding: 10px 0 0 0;">
|
||||
|
||||
<p class="hot" style="padding: 3px;margin:0;">*线路表和账号必须为同一产品才能使用。</p>
|
||||
<p class="hot" style="padding: 3px;margin:0;">*请优先选择客户端连接 <a style="color:#0777ff;" href="/product/soft"><<<下载客户端>>></a> </p>
|
||||
@@ -201,12 +201,12 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-2 miyao">
|
||||
<p><img src="~/img/miyao.png"> L2TP密钥:<b style="color:red;">{{l2tp}}</b></p>
|
||||
<p><img src="~/img/dk.png"> SSTP端口:<b style="color:red;">{{sstp}}</b></p>
|
||||
<p style="font-size:13px;"><img src="~/img/miyao.png"> L2TP密钥:<b style="color:red;">{{l2tp}}</b></p>
|
||||
<p style="font-size:13px;"><img src="~/img/dk.png"> SSTP端口:<b style="color:red;">{{sstp}}</b></p>
|
||||
</div>
|
||||
<div class="col-lg-10">
|
||||
<p style="margin:0 0 0 10px;"><img src="~/img/shuju.png">实时总线路:{{count}}条<img src="~/img/shuju.png">实时可用线路:{{use_count}}条</p>
|
||||
<p class="col-lg-12" style=" color:#FF0033;margin-bottom:30px;">{{search_field}} ------线路表API接口(每5分钟更新一次,禁止频繁访问!):http://php-api.juip.com/script/linedata/display.php?product={{product_id}}</p>
|
||||
<p style="margin:0 0 0 10px;font-size:15px;"><img src="~/img/shuju.png">实时总线路:{{count}}条<img src="~/img/shuju.png">实时可用线路:{{use_count}}条</p>
|
||||
<p class="col-lg-12" style=" font-size:15px;color:#FF0033;margin-bottom:30px;">{{search_field}} ------线路表API接口(每5分钟更新一次,禁止频繁访问!):http://php-api.juip.com/script/linedata/display.php?product={{product_id}}</p>
|
||||
|
||||
|
||||
</div>
|
||||
@@ -250,6 +250,68 @@
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="visible-lg text-center text-new" style="position:fixed;left:9px;top:30%;color:#39516b;cursor:pointer;">
|
||||
|
||||
<table class="table table-striped " >
|
||||
<tr>
|
||||
<th>产品</th>
|
||||
<th>L2TP秘钥</th>
|
||||
<th>SSTP端口</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>蘑菇</td>
|
||||
<td onclick ='navigator.clipboard.writeText(8899);' >8899</td>
|
||||
<td>4430</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>老鹰</td>
|
||||
<td>123</td>
|
||||
<td>4430</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>云牛</td>
|
||||
<td>888888</td>
|
||||
<td>5908</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>西瓜</td>
|
||||
<td>123456</td>
|
||||
<td>4433</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>天天</td>
|
||||
<td>1234</td>
|
||||
<td>4430</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>强子</td>
|
||||
<td>888888</td>
|
||||
<td>1500</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>讯连</td>
|
||||
<td>123</td>
|
||||
<td>1500</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>极客</td>
|
||||
<td>123456</td>
|
||||
<td>4433</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>火狐</td>
|
||||
<td>888888</td>
|
||||
<td>5908</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>强子静态</td>
|
||||
<td>888888</td>
|
||||
<td>1500</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script src="~/js/vue.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
1225
Host/Views/Product/Http.cshtml
Normal file
@@ -230,7 +230,7 @@
|
||||
|
||||
<div class="row" style="color:white;width:calc(100vw-1px);">
|
||||
<div class="col-md-12 text-center" style="padding-top:1%;">
|
||||
<h4>需求五个以上、可联系右侧客服设置优惠价</h4>
|
||||
<h4 style="color:white;">需求五个以上、可联系右侧客服设置优惠价</h4>
|
||||
<p>动态IP销量排名NO.1
|
||||
十余种全网知名旗舰产品低价热销、
|
||||
节点多、稳定、靠谱、单人单线
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
<div class="container-fluid softBg" style="height: auto;background:#39516b;">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-3">
|
||||
<div class="col-lg-2">
|
||||
|
||||
</div>
|
||||
<div class="col-lg-6 text-center" style="color: white;">
|
||||
<h3>软件下载</h3>
|
||||
<div class="col-lg-8 text-center" style="color: white;">
|
||||
<h3 style="color:white">软件下载</h3>
|
||||
<p>*软件和账户必须为同一产品才能使用</p>
|
||||
<p>*下载和使用电脑客户端时请关闭杀毒,如360,电脑管家</p>
|
||||
<p>*无对应客户端时,可通过线路表直连支持所有设备<a style="color:#0777ff;" href="/LineList/index"><<< IP线路表 >>></a><a style="color:#0777ff;" href="/article/index"><<<教程&帮助>>></a></p>
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
<link rel="stylesheet" type="text/css" href="~/css/base.css" />
|
||||
<link rel="stylesheet" type="text/css" href="~/css/swiper.min.css" />
|
||||
<link rel="stylesheet" type="text/css" href="~/css/animate.min.css" />
|
||||
|
||||
<link href="/http/css/style.css" rel="stylesheet">
|
||||
<link rel="Shortcut Icon" href="/img/favicon.ico" type="image/x-icon" />
|
||||
<script src="~/js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="~/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
@@ -216,35 +218,41 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container-fluid nav nav_buy">
|
||||
<div class="container-fluid nav nav_buy main_menu">
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-md-2 logo">
|
||||
<a href="#"><img src="~/img/logo.png"></a>
|
||||
</div>
|
||||
<div class="col-lg-10 col-md-10">
|
||||
<ul class="navList navList_buy pull-right">
|
||||
<ul class="navList pull-right sf-menu">
|
||||
<li><a href="/">首页</a></li>
|
||||
<li><a href="/product/index">产品购买 <span style="color: red;">活动</span></a></li>
|
||||
<li><a href="/LineList/index">IP线路表</a></li>
|
||||
<li><a href="/product/soft">软件下载</a></li>
|
||||
<li><a href="/article/index">教程&帮助</a></li>
|
||||
<li><a href="/product/routeros">软路由购买</a></li>
|
||||
<li><a href="http://vps.juip.com" style="color: red;">动态VPS</a></li>
|
||||
<li>
|
||||
@if (user == null)
|
||||
{
|
||||
<button type="button" class="btn btn-primary reg">注册</button>
|
||||
<button type="button" class="btn btn-primary login">登录</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="item" style="display: inline-block;margin-right:20px;">
|
||||
<a asp-action="index" style="border-radius:25px;background-color:#FF9900;padding:5px;" asp-controller="user">个人中心</a>
|
||||
<li> <a href="#">产品购买</a>
|
||||
<ul>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/index">动静态IP</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/http">HTTP</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/routeros">软路由购买</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="http://vps.juip.com">动态vps</a> </li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/LineList/index">IP线路表</a></li>
|
||||
<li><a href="/product/soft">软件下载</a></li>
|
||||
<li><a href="/article/index">教程&帮助</a></li>
|
||||
<li>
|
||||
@if (user == null)
|
||||
{
|
||||
<button type="button" class="btn btn-warning reg">注册</button>
|
||||
<button type="button" class="btn btn-danger login">登录</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="index" class="btn btn-warning margin-top-10" asp-controller="user">个人中心</a>
|
||||
</div>
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="LoginOut" asp-controller="user">退出登录</a>
|
||||
<a asp-action="LoginOut"class="btn btn-danger margin-top-10" asp-controller="user">退出登录</a>
|
||||
</div>
|
||||
}
|
||||
|
||||
}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -271,9 +279,9 @@
|
||||
<li>客服电话:400 800 9925</li>
|
||||
<li>客服QQ:800101003</li><br>
|
||||
<li>客户经理: </li><br>
|
||||
<li>萱萱-电话/微信:13523072998</li><br>
|
||||
<li>萱萱-电话/微信:15225139515</li><br>
|
||||
<li>琪琪-电话/微信:15713870747</li><br>
|
||||
<li>兔兔-电话/微信:19503890845</li><br>
|
||||
<li>兔兔-电话/微信:15111748058</li><br>
|
||||
<li>工作时间: 8:30-23:00</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
<link rel="stylesheet" type="text/css" href="~/css/swiper.min.css" />
|
||||
<link rel="stylesheet" type="text/css" href="~/css/animate.min.css" />
|
||||
<link href="~/css/bootstrap-datetimepicker.min.css" rel="stylesheet">
|
||||
|
||||
<!--include plugin css-->
|
||||
<link type="text/css" rel="stylesheet" href="~/http/css/jquery-rvnm.css" />
|
||||
<link href="~/http/css/style.css" rel="stylesheet">
|
||||
|
||||
<script src="~/js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="~/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="~/js/swiper.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
@@ -28,6 +33,21 @@
|
||||
<script src="~/js/jquery.qrcode.min.js" type="text/javascript" charset="utf-8"></script>
|
||||
|
||||
|
||||
<script type="text/javascript" src="~/http/js/jquery-rvnm.js"></script>
|
||||
<!--js run code-->
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
var rvnMenu = $("#navbar").rvnm({
|
||||
// mode: 'mobile',
|
||||
// responsive: false,
|
||||
searchable: true,
|
||||
theme: 'dark-lesb'
|
||||
});
|
||||
console.log(rvnMenu);
|
||||
// rvnMenu.setMode('minimal');
|
||||
rvnMenu.setTheme('dark-ruby');
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
$(function () {
|
||||
// 侧边栏
|
||||
@@ -105,69 +125,122 @@
|
||||
<a href="#top"><img src="~/img/top.png"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container-fluid nav nav_buy">
|
||||
<div class="container-fluid nav nav_buy main_menu">
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-md-2 logo">
|
||||
<a href="#"><img src="~/img/logo.png"></a>
|
||||
</div>
|
||||
<div class="col-lg-10 col-md-10">
|
||||
<ul class="navList navList_buy pull-right">
|
||||
<ul class="navList pull-right sf-menu">
|
||||
<li><a href="/">首页</a></li>
|
||||
<li><a href="/product/index">产品购买 <span style="color: red;">活动</span></a></li>
|
||||
<li> <a href="#">产品购买</a>
|
||||
<ul>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/index">动静态IP</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/http">HTTP</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="/product/routeros">软路由购买</a> </li>
|
||||
<li style="width:100px;height:39px;padding-top:0;"> <a style="height:39px;padding-top:0;" href="http://vps.juip.com">动态vps</a> </li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="/LineList/index" ">IP线路表</a></li>
|
||||
<li><a href="/product/soft">软件下载</a></li>
|
||||
<li><a href="/article/index">教程&帮助</a></li>
|
||||
<li><a href="/product/routeros">软路由购买</a></li>
|
||||
<li><a href="http://vps.juip.com" style="color: red;">动态VPS</a></li>
|
||||
<li>
|
||||
<div class="item" style="display: inline-block;margin-right:20px;">
|
||||
<a asp-action="index" style="border-radius:25px;background-color:#FF9900;padding:5px;" asp-controller="user">个人中心</a>
|
||||
</div>
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="LoginOut" asp-controller="user">退出登录</a>
|
||||
</div>
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="index" class="btn btn-warning margin-top-10" asp-controller="user">个人中心</a>
|
||||
</div>
|
||||
<div class="item" style="display: inline-block;">
|
||||
<a asp-action="LoginOut"class="btn btn-danger margin-top-10" asp-controller="user">退出登录</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- main -->
|
||||
<div class="container-fluid clearMargin">
|
||||
<div class="col-lg-2 leftArea">
|
||||
<div class="leftBar">
|
||||
<div class="item @(currentPath=="/user/index"?"active_b":"")">
|
||||
<img src="~/img/p1.png"><a href="/user/index">个人中心</a>
|
||||
</div>
|
||||
|
||||
<div class="item @(currentPath=="/user/myaccounts"?"active_b":"")">
|
||||
<img src="~/img/p4.png"><a href="/user/myaccounts">IP账号管理</a>
|
||||
</div>
|
||||
|
||||
<div class="item @(currentPath=="/user/mymoney"?"active_b":"")">
|
||||
<img src="~/img/p3.png"><a href="/user/mymoney">资金明细</a>
|
||||
</div>
|
||||
<div class="item @(currentPath=="/user/rosorder"?"active_b":"")">
|
||||
<img src="~/img/p2.png"><a href="/user/rosorder">软路由订单</a>
|
||||
</div>
|
||||
<div class="item @(currentPath=="/user/myorders"?"active_b":"")">
|
||||
<img src="~/img/p2.png"><a href="/user/myorders">订单管理</a>
|
||||
</div>
|
||||
<div class="item @(currentPath=="/user/myrefundorders"?"active_b":"")">
|
||||
<img src="~/img/p3.png"><a href="/user/myrefundorders">退货订单管理</a>
|
||||
</div>
|
||||
<div class="item @(currentPath=="/user/mycoupons"?"active_b":"")">
|
||||
<img src="~/img/p5.png"><a href="/user/mycoupons">我的优惠券 <span style="background-color: red;" class="badge" id="coupon_num"></span></a>
|
||||
</div>
|
||||
<div class="item @(currentPath=="/user/cashout"?"active_b":"")">
|
||||
<span class="glyphicon glyphicon-jpy" style="padding: 10px;"></span><a href="/user/cashout">提现管理</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-10 rightCon">
|
||||
@RenderBody()
|
||||
</div>
|
||||
</div>
|
||||
<nav id="navbar" style="top:60px;height:calc(vh-60);color:white;">
|
||||
<ul>
|
||||
<li><a href="/user/index">个人中心</a></li>
|
||||
<li>
|
||||
<a href="#" >
|
||||
IP管理
|
||||
</a>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/user/myaccounts">
|
||||
IP账号管理
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/mymoney">
|
||||
资金明细
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/rosorder">
|
||||
软路由订单
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/myorders">
|
||||
订单管理
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/myrefundorders">
|
||||
退货订单管理
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/mycoupons">
|
||||
我的优惠券
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/cashout">
|
||||
提现管理
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" >
|
||||
HTTP管理
|
||||
</a>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="/user/httprecharge">
|
||||
充值记录
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/httppackageList">
|
||||
短效套餐
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/httplongterm">
|
||||
长效管理
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/httpusehistory">
|
||||
使用记录
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/user/httpwhiteip">
|
||||
白名单设置
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="rightCon" style="margin-left:220px;padding:20px;">
|
||||
@RenderBody()
|
||||
</div>
|
||||
@* <script id="qd28521381485d6faa97edf5ad07d7e159f6cb902af0" src="https://wp.qiye.qq.com/qidian/2852138148/5d6faa97edf5ad07d7e159f6cb902af0" charset="utf-8" async defer></script> *@
|
||||
|
||||
<div data-toggle="popovers" data-html="true" data-content="<p><a style='color: #0862fe;' href='https://admin.qidian.qq.com/template/blue/mp/menu/qr-code-jump.html?linkType=0&env=ol&kfuin=2852138148&fid=299&key=f377ec024ca45115a03a7632c7bda230&cate=1&source=&isLBS=&isCustomEntry=&type=16&ftype=1&_type=wpa&qidian=true' target='_blank'>
|
||||
|
||||
831
Host/Views/User/HttpLongterm.cshtml
Normal file
@@ -0,0 +1,831 @@
|
||||
|
||||
@{
|
||||
Layout = "_UserLayout";
|
||||
}
|
||||
<style>
|
||||
.col-sm-12 {
|
||||
padding:0;
|
||||
margin:0;
|
||||
}
|
||||
</style>
|
||||
<div id="app">
|
||||
<h3>长效套餐</h3>
|
||||
<ul id="myTab" class="nav nav-tabs" style="position:inherit;">
|
||||
<li v-on:click="get_ip_list()" class="active"><a href="#lang1" data-toggle="tab">已开通长效</a></li>
|
||||
<li v-on:click="get_package_list()"><a href="#lang2" data-toggle="tab">全部套餐</a></li>
|
||||
<li v-on:click="get_order_list()"><a href="#lang3" data-toggle="tab">购买记录</a></li>
|
||||
<li v-on:click="get_switch_ip_list()"><a href="#lang4" data-toggle="tab">IP切换记录</a></li>
|
||||
</ul>
|
||||
<br>
|
||||
<div id="myTabContent" class="tab-content">
|
||||
<div class="tab-pane fade in active" id="lang1">
|
||||
<button style="margin-bottom:5px;" class="btn btn-new" v-on:click="get_ip()" >批量提取IP</button>
|
||||
<span> 格式:IP|http端口|socks5端口|账号|密码</span>
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th v-on:click="allcheck()"><input type="checkbox" id="allchecked" name="idsss" value=''></th>
|
||||
<th>模式</th>
|
||||
<th>节点入口IP</th>
|
||||
<th>隧道出口IP</th>
|
||||
<th>HTTP/SK5端口</th>
|
||||
<th>归属地</th>
|
||||
<th>带宽</th>
|
||||
<th>线路</th>
|
||||
<th>状态</th>
|
||||
<th>账号/密码</th>
|
||||
<th>过期时间</th>
|
||||
<th>是否过期</th>
|
||||
<th>续费</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in ip_list">
|
||||
<td><input type="checkbox" v-model="idlist" checked="true" name="ids" :value="item.id"></td>
|
||||
<td>{{item.isRelayed?'中继':'直连'}}</td>
|
||||
<td>{{item.ip}}</td>
|
||||
<td>{{item.realIp}}</td>
|
||||
<td>{{item.httpPort}}/{{item.socks5Port}}</td>
|
||||
<td>{{item.area}}</td>
|
||||
<td>{{item.bandwidth}}M/{{item.lineType}}</td>
|
||||
<td>{{item.shareType}}</td>
|
||||
<td>{{item.state}}</td>
|
||||
<td>{{item.username}}/{{item.password}}</td>
|
||||
<td>{{item.expireTime}}</td>
|
||||
<td>{{item.isExpired?'已经过期':'未过期'}}</td>
|
||||
<td><a class="btn btn-new" v-on:click="rebuy_ip(item)" data-toggle="modal" data-target="#myModal">续费</a>
|
||||
<a v-if="item.isAbroad && item.isRelayed" v-on:click="change_in(item)" class="btn btn-info" data-toggle="modal" data-target="#change_in" >切换入口</a>
|
||||
<a class="btn btn-warning" v-on:click="change_ip(item)" data-toggle="modal" data-target="#change_ip">切换节点</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<nav>
|
||||
<ul class="pager">
|
||||
<li><a v-on:click="page_p()">上一页</a></li>
|
||||
<li>当前页 第{{page.currentPage}}页 </li>
|
||||
<li><a v-on:click="page_n()">下一页</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="lang2">
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>套餐类型</th>
|
||||
<th>模式</th>
|
||||
<th>可用ip数量(个)</th>
|
||||
<th>过期时间</th>
|
||||
<th>续费</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in pakage_list">
|
||||
<td>{{item.isAbroad}}</td>
|
||||
<td>{{item.shareType}}</td>
|
||||
<td>{{item.ipAmount}}</td>
|
||||
<td>{{item.expireTime}}</td>
|
||||
<td><a class="btn btn-block btn-new" v-on:click="rebuy(item)" data-toggle="modal" data-target="#myModal">续费</a> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="lang3">
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>订单号</th>
|
||||
<th>订单类型</th>
|
||||
<th>游戏类型</th>
|
||||
<th>IP数量</th>
|
||||
<th>实付金额</th>
|
||||
<th>支付时间</th>
|
||||
<th>续费</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in order_list">
|
||||
<td>{{item.order_no}}</td>
|
||||
<td>{{item.order_type}}</td>
|
||||
<td>{{item.game_type}}</td>
|
||||
<td>{{item.ip_count}}</td>
|
||||
<td>{{item.money}}</td>
|
||||
<td>{{item.create_time}}</td>
|
||||
<td><a class="btn btn-block btn-new" href="/product/http">再次购买</a> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="lang4">
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>原IP</th>
|
||||
<th>原属地</th>
|
||||
<th>切换后IP</th>
|
||||
<th>切换后属地</th>
|
||||
<th>切换方式</th>
|
||||
<th>切换时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in switch_list">
|
||||
<td>{{item.oldIp}}</td>
|
||||
<td>{{item.oldArea}}</td>
|
||||
<td>{{item.newIp}}</td>
|
||||
<td>{{item.newArea}}</td>
|
||||
<td>{{item.reason}}</td>
|
||||
<td>{{item.createTime}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<nav>
|
||||
<ul class="pager">
|
||||
<li><a v-on:click="page_p2()">上一页</a></li>
|
||||
<li>当前页 第{{page2.currentPage}}页 </li>
|
||||
<li><a v-on:click="page_n2()">下一页</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
|
||||
×
|
||||
</button>
|
||||
<h4 class="modal-title" id="myModalLabel">
|
||||
{{rebuy_data.title}}
|
||||
</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">套餐周期:</h5>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','2','天')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="1"> <span id="dxwxl_tczq_2" class="btn btn-new btn-lg">按天</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','3','周')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="7"> <span id="dxwxl_tczq_3" class="btn btn-default btn-lg">按周</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','4','月')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="30"> <span id="dxwxl_tczq_4" class="btn btn-default btn-lg">按月</span>
|
||||
</label>
|
||||
<label v-if="rebuy_data.packType!=21" class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','5','季')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="90"> <span id="dxwxl_tczq_5" class="btn btn-default btn-lg">按季</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">购买时长:</h5>
|
||||
<div class="btn-group" role="group" >
|
||||
<button type="button" v-on:click="gmsc_reduce()" class="btn btn-new">-</button>
|
||||
<button type="button" class="btn btn-default">{{rebuy_data.periodAmount}}{{order_time_type}}</button>
|
||||
<button type="button" v-on:click="gmsc_add()" class="btn btn-new">+</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class=" text-left">价格:¥{{order_info.money}} <span style="float:right;">
|
||||
<button class="btn btn-new" v-on:click="pay()" data-backdrop="static" >实付¥{{order_info.money}}</button>
|
||||
</span></h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div>
|
||||
</div><!-- /.modal -->
|
||||
|
||||
|
||||
<div class="modal fade" id="change_ip" tabindex="-1" role="dialog" aria-labelledby="myModalLabel1" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
|
||||
×
|
||||
</button>
|
||||
<h4 class="modal-title" id="myModalLabel1">
|
||||
{{change_ip_data.title}}
|
||||
</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div v-if="change_ip_data.isAbroad==0" class="col-sm-12 gameisp">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">运营商选择:</h5>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('game_isp_','1','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="gameisp" type="radio" value="0"> <span id="game_isp_1" class="btn btn-new btn-lg">普通线路</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('game_isp_','2','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="gameisp" type="radio" value="2"> <span id="game_isp_2" class="btn btn-default btn-lg">电信</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('game_isp_','3','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="gameisp" type="radio" value="3"> <span id="game_isp_3" class="btn btn-default btn-lg">移动</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('game_isp_','4','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="gameisp" type="radio" value="4"> <span id="game_isp_4" class="btn btn-default btn-lg">联通</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 panelback">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">地区选择:</h5>
|
||||
<div class="col-md-4" style="padding:5px 5px 0 0;">
|
||||
<label class="radio-inline" style="width:100%;padding:0;" v-on:click="set_btn_checked('game_cityCode_','99','')">
|
||||
<input class="hide" v-model="change_ip_data.cityCode" name="gamecity" type="radio" value="0"> <span style="width:100%;" id="game_cityCode_99" class="btn btn-new btn-lg">随机地区</span>
|
||||
</label>
|
||||
</div>
|
||||
<div v-for="(value,key) in cities" class="col-md-4" style="padding:5px 5px 0 0;">
|
||||
<label class="radio-inline" style="width:100%;padding:0;" v-on:click="set_btn_checked('game_cityCode_',key,'')">
|
||||
<input class="hide" v-model="change_ip_data.cityCode" name="gamecity" type="radio" :value="value.code"> <span style="width:100%;" :id="'game_cityCode_'+key" class="btn btn-default btn-lg">{{value.name}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class=" text-left">价格:¥{{order_info.money}} <span style="float:right;">
|
||||
<button class="btn btn-new" v-on:click="pay_change_ip()" data-backdrop="static" >实付¥{{order_info.money}}</button>
|
||||
</span></h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div>
|
||||
</div><!-- /.modal -->
|
||||
|
||||
|
||||
<div class="modal fade" id="change_in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel1" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
|
||||
×
|
||||
</button>
|
||||
<h4 class="modal-title" id="myModalLabel1">
|
||||
切换入口
|
||||
</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="col-sm-12 gameisp">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">运营商选择:</h5>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('change_in_isp_','1','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="change_inisp" type="radio" value="0"> <span id="change_in_isp_1" class="btn btn-new btn-lg">普通线路</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('change_in_isp_','2','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="change_inisp" type="radio" value="2"> <span id="change_in_isp_2" class="btn btn-default btn-lg">电信</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('change_in_isp_','3','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="change_inisp" type="radio" value="3"> <span id="change_in_isp_3" class="btn btn-default btn-lg">移动</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('change_in_isp_','4','')">
|
||||
<input class="hide" v-model="change_ip_data.isp" name="change_inisp" type="radio" value="4"> <span id="change_in_isp_4" class="btn btn-default btn-lg">联通</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 panelback">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">地区选择:</h5>
|
||||
<div class="col-md-4" style="padding:5px 5px 0 0;">
|
||||
<label class="radio-inline" style="width:100%;padding:0;" v-on:click="set_btn_checked('change_in_cityCode_','99','')">
|
||||
<input class="hide" v-model="change_ip_data.cityCode" name="change_incity" type="radio" value="0"> <span style="width:100%;" id="change_in_cityCode_99" class="btn btn-new btn-lg">随机地区</span>
|
||||
</label>
|
||||
</div>
|
||||
<div v-for="(value,key) in cities" class="col-md-4" style="padding:5px 5px 0 0;">
|
||||
<label class="radio-inline" style="width:100%;padding:0;" v-on:click="set_btn_checked('change_in_cityCode_',key,'')">
|
||||
<input class="hide" v-model="change_ip_data.cityCode" name="change_incity" type="radio" :value="value.code"> <span style="width:100%;" :id="'change_in_cityCode_'+key" class="btn btn-default btn-lg">{{value.name}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class=" text-left">价格:¥{{order_info.money}} <span style="float:right;">
|
||||
<button class="btn btn-new" v-on:click="pay_change_ip()" data-backdrop="static" >实付¥{{order_info.money}}</button>
|
||||
</span></h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div>
|
||||
</div><!-- /.modal -->
|
||||
|
||||
</div>
|
||||
<script>
|
||||
var vm = new Vue({
|
||||
el:'#app',
|
||||
data:{
|
||||
get_ip_list_require:{
|
||||
"page": 1, //必填,当前页数
|
||||
"limit": 50, //必填,每页显示条数,建议10~20,不可超过100
|
||||
"packId": '', //可选,套餐id
|
||||
"isAbroad": '', //可选,是否海外,0-国内,1-海外
|
||||
"isExpired": 0, //可选,过期状态,0-全部,1-已过期,2-未过期
|
||||
"state": -1, //可选,IP状态:-1-全部 1-正常 0-异常(掉线),9-封禁
|
||||
"ip": '', //可选,具体IP地址
|
||||
"groupId":'', //可选,分组id,可通过2681接口查询
|
||||
"gameId": '', //可选,具体游戏id,可通过2691接口查询
|
||||
"cityCode":'', //可选,城市编码,可通过2692接口查询
|
||||
"orderBy":0,//可选,排序,0-默认最近购买时间,1-最早购买时间,2-最近过期时间,3-最迟过期时间,4-最近切换时间,5-最迟切换时间
|
||||
},
|
||||
page:{},
|
||||
page2:{},
|
||||
get_ip_switch_require:{
|
||||
"page": 1, //必填,当前页数
|
||||
"limit": 50, //必填,每页显示条数,建议10~20,不可超过100
|
||||
},
|
||||
ip_list:[],
|
||||
pakage_list:[],
|
||||
order_list:[],
|
||||
switch_list:[],
|
||||
|
||||
rebuy_data:{
|
||||
title:'',
|
||||
packId:'',
|
||||
packType:'',
|
||||
periodType:1,
|
||||
isRelayed:0,
|
||||
periodAmount:1,
|
||||
isAbroad:0,
|
||||
ipAmount:1,
|
||||
ids:'',
|
||||
shareType:1,
|
||||
lineType:1,
|
||||
bandwidth:1,
|
||||
},
|
||||
order_time_type:'天',
|
||||
order_info:{
|
||||
order_type:5,//1:预储值、2:短效无限量、3:短效包天、4:短效包量、5:长效游戏 6:单个ip续费 7:切换ip
|
||||
money:1,
|
||||
data:{}
|
||||
},
|
||||
change_ip_data:{
|
||||
'title':'',
|
||||
"id": '', //必填,长效IP的id
|
||||
'isAbroad':0,
|
||||
"cityCode":0, //可选,城市编码,0表示随机,可通过2692接口查询
|
||||
"isp": 0, //可选,运营商,0表示随机不指定,仅限国内线路使用,2-电信,3-移动,4-联通,
|
||||
"switchPop": 0, //可选,切换标识,0-切换直连(出口IP),1-切换中继入口IP(仅限于中继线路)
|
||||
data:{}
|
||||
},
|
||||
cities:[],
|
||||
in_city_data:{
|
||||
'isAbroad':0,
|
||||
"isp": 0, //可选,运营商,0表示随机不指定,仅限国内线路使用,2-电信,3-移动,4-联通,
|
||||
},
|
||||
idlist:[],
|
||||
api_link:'',
|
||||
copy_url:'',
|
||||
|
||||
},
|
||||
created:function(){
|
||||
this.get_ip_list();
|
||||
},
|
||||
methods:{
|
||||
get_ip_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
data:this.get_ip_list_require
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/user/lang_ip_list',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.ip_list = res.data.d.items;
|
||||
that.page = res.data.d.pager;
|
||||
}
|
||||
});
|
||||
},
|
||||
page_p() {
|
||||
if (this.page.currentPage != 1) {
|
||||
this.get_ip_list_require.page--;
|
||||
this.get_ip_list();
|
||||
}
|
||||
},
|
||||
page_n() {
|
||||
this.get_ip_list_require.page++;
|
||||
this.get_ip_list();
|
||||
},
|
||||
page_p2() {
|
||||
if (this.page2.currentPage != 1) {
|
||||
this.get_ip_list_require.page--;
|
||||
this.get_switch_ip_list();
|
||||
}
|
||||
},
|
||||
page_n2() {
|
||||
this.get_ip_list_require.page++;
|
||||
this.get_switch_ip_list();
|
||||
},
|
||||
get_package_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/user/cx_package',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.pakage_list = res.data
|
||||
}
|
||||
});
|
||||
},
|
||||
get_order_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/user/cx_order',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.order_list = res.data
|
||||
}
|
||||
});
|
||||
},
|
||||
get_switch_ip_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
data:this.get_ip_list_require
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/user/cx_switch',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.switch_list = res.data.d.items;
|
||||
that.page2 = res.data.d.pager;
|
||||
}
|
||||
});
|
||||
},
|
||||
rebuy(r) {
|
||||
this.rebuy_data.title = '长效IP订单续费';
|
||||
this.rebuy_data.packId = r.id;
|
||||
this.rebuy_data.packType = 31;
|
||||
this.rebuy_data.isAbroad = r.isAbroad2;
|
||||
this.order_info.order_type = 5;
|
||||
this.rebuy_data.ipAmount = r.ipAmount;
|
||||
this.rebuy_data.isRelayed = r.isRelayed;
|
||||
let _this=this
|
||||
setTimeout(function() {
|
||||
|
||||
_this.calc_price()
|
||||
|
||||
}, 500);
|
||||
},
|
||||
rebuy_ip(r) {
|
||||
this.rebuy_data.title = '长效IP续费';
|
||||
this.rebuy_data.packId = r.packId;
|
||||
this.rebuy_data.packType = 31;
|
||||
this.rebuy_data.isAbroad = r.isAbroad;
|
||||
this.rebuy_data.ids = r.id;
|
||||
this.order_info.order_type = 6;
|
||||
this.rebuy_data.ipAmount = 1;
|
||||
this.rebuy_data.isRelayed = r.isRelayed;
|
||||
this.rebuy_data.shareType = r.shareType2;
|
||||
this.rebuy_data.lineType = r.lineType2;
|
||||
this.rebuy_data.bandwidth = r.bandwidth;
|
||||
|
||||
let _this=this
|
||||
setTimeout(function() {
|
||||
|
||||
_this.calc_price()
|
||||
|
||||
}, 500);
|
||||
},
|
||||
change_ip(r) {
|
||||
this.change_ip_data.title = '长效IP切换节点';
|
||||
this.change_ip_data.id = r.id;
|
||||
this.change_ip_data.isAbroad = r.isAbroad;
|
||||
this.change_ip_data.switchPop = 0;
|
||||
|
||||
var city_re_data = {
|
||||
"gameId": r.gameId,
|
||||
"isAbroad": r.isAbroad,
|
||||
"shareType": r.shareType2,
|
||||
"isp": r.isp,
|
||||
};
|
||||
|
||||
that = this;
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
data: city_re_data
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/product/out_city',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.cities = res.d.cities
|
||||
}
|
||||
});
|
||||
this.rebuy_data.isAbroad = r.isAbroad;
|
||||
this.rebuy_data.ids = r.id;
|
||||
this.order_info.order_type = 6;
|
||||
this.rebuy_data.ipAmount = 1;
|
||||
this.rebuy_data.isRelayed = r.isRelayed;
|
||||
this.rebuy_data.shareType = r.shareType2;
|
||||
this.rebuy_data.lineType = r.lineType2;
|
||||
this.rebuy_data.bandwidth = r.bandwidth;
|
||||
this.change_ip_data.data = this.rebuy_data;
|
||||
this.calc_price()
|
||||
|
||||
},
|
||||
change_in(r) {
|
||||
this.change_ip_data.id = r.id;
|
||||
this.change_ip_data.isAbroad = r.isAbroad;
|
||||
this.change_ip_data.switchPop = 1;
|
||||
this.rebuy_data.isAbroad = r.isAbroad;
|
||||
this.rebuy_data.ids = r.id;
|
||||
this.order_info.order_type = 6;
|
||||
this.rebuy_data.ipAmount = 1;
|
||||
this.rebuy_data.isRelayed = r.isRelayed;
|
||||
this.rebuy_data.shareType = r.shareType2;
|
||||
this.rebuy_data.lineType = r.lineType2;
|
||||
this.rebuy_data.bandwidth = r.bandwidth;
|
||||
this.change_ip_data.data = this.rebuy_data;
|
||||
var that = this
|
||||
|
||||
|
||||
var city_re_data = {
|
||||
"gameId": r.gameId,
|
||||
"isAbroad": r.isAbroad,
|
||||
"shareType": r.shareType2,
|
||||
"isp": r.isp,
|
||||
"switchPop":1,
|
||||
"packId":r.packId,
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/product/in_city',
|
||||
dataType: "json",
|
||||
async:false,
|
||||
data:this.city_re_data,
|
||||
success: function (res) {
|
||||
that.cities = res.d.cities
|
||||
}
|
||||
});
|
||||
this.calc_price()
|
||||
},
|
||||
set_btn_checked(id_f,id,text){
|
||||
var i = 0;
|
||||
if (text.length > 0) {
|
||||
this.order_time_type = text
|
||||
}
|
||||
for (i=0;i<100;i++) {
|
||||
$("#"+id_f+i).removeClass("btn-new");
|
||||
$("#"+id_f+i).addClass("btn-default");
|
||||
}
|
||||
$("#"+id_f+id).removeClass("btn-default");
|
||||
$("#"+id_f+id).addClass("btn-new");
|
||||
|
||||
let _this=this
|
||||
setTimeout(function() {
|
||||
|
||||
_this.calc_price()
|
||||
|
||||
}, 500);
|
||||
},
|
||||
gmsc_add(){
|
||||
this.rebuy_data.periodAmount++;
|
||||
this.calc_price()
|
||||
},
|
||||
//短效包天购买时长修改
|
||||
gmsc_reduce(){
|
||||
if (this.rebuy_data.periodAmount > 1) {
|
||||
this.rebuy_data.periodAmount--;
|
||||
this.calc_price()
|
||||
}
|
||||
},
|
||||
pay(){
|
||||
let that = this;
|
||||
this.order_info.data = this.rebuy_data;
|
||||
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
order_info: this.order_info
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/order/rebuy_order',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
$('#myModal').modal('hide');
|
||||
alert(res.msg);
|
||||
that.get_ip_list();
|
||||
this.get_package_list();
|
||||
} else {
|
||||
alert(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
pay_change_ip(){
|
||||
let that = this;
|
||||
this.order_info.data = this.change_ip_data;
|
||||
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
order_info: this.order_info
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/order/change_ip_order',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
$('#change_ip').modal('hide');
|
||||
alert(res.msg);
|
||||
that.get_ip_list();
|
||||
this.get_package_list();
|
||||
} else {
|
||||
alert('剩余线路不足,切换下单失败,请稍后再试');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
calc_price() {
|
||||
var that = this;
|
||||
this.order_info.data = this.rebuy_data;
|
||||
|
||||
var price_info = {
|
||||
'ipAmount':0,
|
||||
'price':0,
|
||||
};
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/product/calc_price',
|
||||
dataType: "json",
|
||||
async:false,
|
||||
data: this.order_info,
|
||||
success: function (res) {
|
||||
price_info = res
|
||||
}
|
||||
});
|
||||
this.order_info.money = this.order_info.data.periodAmount * this.order_info.data.ipAmount * price_info.price;
|
||||
|
||||
this.order_info.money = this.order_info.money.toFixed(2);
|
||||
},
|
||||
allcheck(){
|
||||
var checkboxes = document.querySelectorAll('input[type="checkbox"]'); // 获取所有复选框元素
|
||||
|
||||
if($("#allchecked").prop("checked")) {
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
checkboxes[i].checked=true; // 将每个复选框的 checked 属性设置为 true
|
||||
}
|
||||
}else {
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
checkboxes[i].checked=false; // 移除每个复选框的 checked 属性
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
get_ip(){
|
||||
var ids = '';
|
||||
var checkboxes = document.querySelectorAll('input[name="ids"]'); // 获取所有复选框元素
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
if (checkboxes[i].checked) {
|
||||
ids += checkboxes[i].value + ',';
|
||||
}
|
||||
}
|
||||
if(ids == '') {
|
||||
alert('请选择ip!');
|
||||
return;
|
||||
}
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
data: {"ids":ids}
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://juip.wyk/http/user/get_lang_ip',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
var val = '';
|
||||
var i = 0;
|
||||
for (i=0;i<res.d.ips.length;i++) {
|
||||
val += res.d.ips[i].ip + '|' +res.d.ips[i].httpPort + '|' +res.d.ips[i].socks5Port + '|' +res.d.ips[i].username + '|' +res.d.ips[i].password + "\n";
|
||||
}
|
||||
that.downTxt(val);
|
||||
}
|
||||
});
|
||||
},
|
||||
downTxt(val) {
|
||||
let filename = "ip.txt" //注意最好设置后缀.txt
|
||||
let value=val
|
||||
let elem = document.createElement('a'); //创建a标签
|
||||
elem.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(value)); //设置下载文件内容
|
||||
elem.setAttribute('download', filename); //设置下载文件名
|
||||
elem.style.display = 'none'; //设置a标签默认隐藏
|
||||
document.body.appendChild(elem); //添加至dom层
|
||||
elem.click(); //执行点击下载事件
|
||||
document.body.removeChild(elem); //使用下载后移除a标签
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
</script>
|
||||
718
Host/Views/User/HttpPackageList.cshtml
Normal file
@@ -0,0 +1,718 @@
|
||||
|
||||
@{
|
||||
Layout = "_UserLayout";
|
||||
}
|
||||
<style>
|
||||
.col-sm-12 {
|
||||
padding:0;
|
||||
margin:0;
|
||||
}
|
||||
#getapi>.row {
|
||||
padding:10px;
|
||||
border-bottom:1px dashed #ccc;
|
||||
}
|
||||
</style>
|
||||
<div id="app">
|
||||
<h3>短效套餐</h3>
|
||||
<ul id="myTab" class="nav nav-tabs" style="position:inherit;">
|
||||
<li class="active">
|
||||
<a href="#all" v-on:click="get_package_list()" data-toggle="tab">全部套餐</a>
|
||||
</li>
|
||||
<li><a href="#order" v-on:click="get_order_list()" data-toggle="tab">购买记录</a></li>
|
||||
<li><a href="#getapi" data-toggle="tab">提取短效</a></li>
|
||||
</ul>
|
||||
<br>
|
||||
<div id="myTabContent" class="tab-content">
|
||||
<div class="tab-pane fade in active" id="all">
|
||||
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>套餐类型</th>
|
||||
<th>当日可用ip数量(个)</th>
|
||||
<th>有效时长</th>
|
||||
<th>过期时间</th>
|
||||
<th>是否过期</th>
|
||||
<th>续费</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in pakage_list">
|
||||
<td>{{item.name}}</td>
|
||||
<td>{{item.remainingAmount}}</td>
|
||||
<td>{{item.durationType}}</td>
|
||||
<td>{{item.expireTime}}</td>
|
||||
<td>{{item.isExpired}}</td>
|
||||
<td v-if="item.planType != 22"><a class="btn btn-block btn-new" v-on:click="rebuy(item)" data-toggle="modal" data-target="#myModal">续费</a> </td>
|
||||
<td v-if="item.planType == 22"> 不支持续费 </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="order">
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>订单号</th>
|
||||
<th>订单类型</th>
|
||||
<th>套餐类型</th>
|
||||
<th>有效时长</th>
|
||||
<th>支付金额</th>
|
||||
<th>支付时间</th>
|
||||
<th>再次购买</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in order_list">
|
||||
<td>{{item.order_no}}</td>
|
||||
<td>{{item.order_type}}</td>
|
||||
<td>{{item.package_type}}</td>
|
||||
<td>{{item.durationType}}</td>
|
||||
<td>{{item.money}}</td>
|
||||
<td>{{item.create_time}}</td>
|
||||
<td><a class="btn btn-block btn-new" href="/product/http">再次购买</a> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade" id="getapi">
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
请选择提取类型
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<select v-model="api_link_item.pack" @@change="chaneg_type" class="form-control input-sm" style="height:auto;width:39%" >
|
||||
<option v-for="item in pakage_list" :value="item.id">({{item.id}}){{item.name}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
提取数量
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<input v-model="api_link_item.num" min=1 max=200 style="max-width:100px;color:black;" type="number" value="1">个IP <span style="color:#ccc;">单次可提取最大数量 200 个</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" id="gt">
|
||||
<div class="col-md-2 text-right;">
|
||||
提取时长
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.gt" type="radio" name="gt" value="0" checked>默认
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.gt" type="radio" name="gt" value="1"> 1分钟以上
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.gt" type="radio" name="gt" value="2"> 2分钟以上
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.gt" type="radio" name="gt" value="3"> 3分钟以上
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.gt" type="radio" name="gt" value="4"> 4分钟以上
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
IP协议
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.port" type="radio" name="port" value="1" checked>HTTP
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.port" type="radio" name="port" value="2"> SOCKS5
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
数据格式
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.type" type="radio" name="type" value="1" checked> TXT
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.type" type="radio" name="type" value="2"> JSPON
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.type" type="radio" name="type" value="3"> HTML
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
换行符
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.lb" type="radio" name="lb" value="1" checked> 回车换行(\r\n)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.lb" type="radio" name="lb" value="3"> 回车(\r)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.lb" type="radio" name="lb" value="4"> 换行(\n)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.lb" type="radio" name="lb" value="5"> Tab(\t)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.lb" type="radio" name="lb" value="6"> 其他符号:
|
||||
</label>
|
||||
<input v-model="api_link_item.clb" type="text" placeholder="请输入换行符">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
地区选择
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<p><a style="cursor: pointer; " v-on:click="selectAll()">全选</a> <a style="cursor: pointer; " v-on:click="deselectAll()">清除</a> </p>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" checked="true" name="regions" value="110000"> 北京市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="120000"> 天津市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="130000"> 河北市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="140000"> 山西市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="210000"> 辽宁市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="220000"> 吉林市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="310000"> 上海市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="320000"> 江苏省
|
||||
</label>
|
||||
<br>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="330000"> 浙江省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="340000"> 安徽省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="350000"> 福建省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="360000"> 江西省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="370000"> 山东省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="410000"> 河南省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="420000"> 湖北省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="430000"> 湖南省
|
||||
</label>
|
||||
<br>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="440000"> 广东省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="460000"> 海南省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="500000"> 重庆市
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="510000"> 四川省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="520000"> 贵州省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="530000"> 云南省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="610000"> 陕西省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="620000"> 甘肃省
|
||||
</label>
|
||||
<br>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="630000"> 青海省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="230000"> 黑龙江省
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="540000"> 西藏自治区
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="150000"> 内蒙古自治区
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="450000"> 广西壮族自治区
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="640000"> 宁夏回族自治区
|
||||
</label>
|
||||
<label class="checkbox-inline">
|
||||
<input type="checkbox" v-model="regions" name="regions" value="650000"> 新疆维吾尔自治区
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
IP去重
|
||||
</div>
|
||||
<div class="col-md-10" id="bqc">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.distinct" type="radio" name="distinct" value="2" checked>严格去重
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.distinct" type="radio" name="distinct" value="0"> 不去重
|
||||
</label>
|
||||
</div>
|
||||
<div style="display:none;" class="col-md-10" id="qc">
|
||||
不去重
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
运营商
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.isp" type="radio" name="isp" value="0" checked>不限
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.isp" type="radio" name="isp" value="4"> 联通
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.isp" type="radio" name="isp" value="2"> 电信
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
自动添加白名单
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.aw" type="radio" name="aw" value="0">不自动
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.aw" type="radio" name="aw" value="1"> 自动
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2 text-right;">
|
||||
签权模式
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline" v-on:click="qqms(1)">
|
||||
<input v-model="api_link_item.at" type="radio" name="at" value="1" checked>白名单
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="qqms(2)">
|
||||
<input v-model="api_link_item.at" type="radio" name="at" value="2"> 白名单+账密
|
||||
</label>
|
||||
<label class="radio-inline" id="at" v-on:click="qqms(3)">
|
||||
<input v-model="api_link_item.at" type="radio" name="at" value="3"> 仅账号密码
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" id="sp">
|
||||
<div class="col-md-2 text-right;">
|
||||
分隔符
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.sp" type="radio" name="sp" value="1" checked>竖线(|)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.sp" type="radio" name="sp" value="2"> 斜线(/)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.sp" type="radio" name="sp" value="3"> 冒号(:)
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input v-model="api_link_item.sp" type="radio" name="sp" value="6"> 自定义:
|
||||
</label>
|
||||
<input v-model="api_link_item.csp" type="text" placeholder="请输入分割符">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row text-center">
|
||||
<button v-on:click="create_api_link()" class="btn btn-new btn-lg">生成API链接</button>
|
||||
</div>
|
||||
<div class="row">
|
||||
<p style="white-space: nowrap;float:left;border:1px solid #ccc;padding:7px;width:70%;height:40px;overflow:hidden;">{{api_link}}</p>
|
||||
<button v-on:click="copy_url" class="btn btn-new">复制链接</button>
|
||||
<a target="_blank" :href="api_link" class="btn btn-new">打开链接</a>
|
||||
</div>
|
||||
<div class="row" style="border:1px dashed #ccc;">
|
||||
<table class="table table-bordered">
|
||||
<caption>请求参数注释</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>名称</th>
|
||||
<th>类型</th>
|
||||
<th>必选</th>
|
||||
<th>说明</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">pt</td><td class="center">int</td><td class="center">是</td><td>套餐类型,0或12-储值套餐,21-短效包天,22-短效包量,23-短效无限量,29-终身免费VIP套餐,31-长效套餐</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">num</td><td class="center">int</td><td class="center">是</td><td>提取IP数量</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">gt</td><td class="center">int</td><td class="center">否</td><td>提取时长 0-默认 1-1分钟以上 2-2分钟以上 3-3分钟以上 4-4分钟以上 </td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">regions</td><td class="center">string</td><td class="center">否</td><td>多个用英文逗号换行,不传表示随机</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">isp</td><td class="center">int</td><td class="center">是</td><td>0:不限 4:联通 2:电信</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">port</td><td class="center">int</td><td class="center">是</td><td>IP协议 1:HTTP 2:SOCK5</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">time</td><td class="center">int</td><td class="center">否</td><td>有效时长 1-0.1至1分钟 5-1至5分钟 25-5至25分钟 180-25至180分钟 360-3至6小时</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">type</td><td class="center">int</td><td class="center">否</td><td>数据格式:1:TXT 2:JSON 3:html</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">pack</td><td class="center">int</td><td class="center">否</td><td>用户套餐ID</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">ts</td><td class="center">int</td><td class="center">否</td><td>是否显示IP过期时间: 1显示 0不显示</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">lb</td><td class="center">int</td><td class="center">否</td><td>换行符(1:\r\n 2:/br 3:\r 4:\n 5:\t 6 :自定义)</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">clb</td><td class="center">string</td><td class="center">否</td><td>自定义换行符</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">sp</td><td class="center">int</td><td class="center">否</td><td>分隔符(1:竖线| 2:斜线/ 3:冒号 6 :自定义)</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">csp</td><td class="center">string</td><td class="center">否</td><td>自定义分隔符</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">distinct</td><td class="center">int</td><td class="center">否</td><td>去重选择(2:严格去重。0:不去重)</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}"><td class="center">aw</td><td class="center">int</td><td class="center">否</td><td>是否将调用者自动添加到IP白名单(0:不自动添加。1:自动添加)</td></tr><!--for6371000000238419--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">at</td><td class="center">int</td><td class="center">否</td><td>鉴权模式 1-白名单,2-白名单+账密严格鉴权,3-仅账密鉴权(无限量不可用)</td></tr><!--for6371000000238419--><!--ms-for-end:--></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div><div class="size-20 color-10 p-t-30">返回结果示例</div><pre class="layui-code layui-box layui-code-view"><h3 class="layui-code-h3">JSON<a href="javascript:;">code</a></h3><ol class="layui-code-ol"><li>{</li><li> "code":0,</li><li> "msg":"提示信息",</li><li> "success":true,</li><li> "data":[</li><li> {</li><li> "ip":"49.68.68.197", //隧道ip (代理ip)</li><li> "port":33220, // 代理端口</li><li> "expireTime":"2019-05-24 08:58:31"</li><li> },</li><li> {</li><li> "ip":"58.218.201.108", //隧道ip (代理ip)</li><li> "port":2690, // 代理端口</li><li> "expireTime":"2019-05-24 08:55:31"</li><li> }</li><li> ]</li><li>}</li><li> </li></ol></pre></div>
|
||||
<div class="row" style="border:1px dashed #ccc;">
|
||||
<table class="table table-bordered">
|
||||
<caption>请求参数注释</caption>
|
||||
<tbody><tr class="api-head"><td width="15%" class="center">名称</td><td width="40%" class="center">类型</td><td width="45%">说明</td></tr><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">success</td><td class="center">bool</td><td>是否成功</td></tr><!--for6375--><tr ms-class="{tr1:index%2==0}"><td class="center">code</td><td class="center">int</td><td>0表示成功,其他参见《错误代码》表</td></tr><!--for6375--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">ip</td><td class="center">string</td><td>IP</td></tr><!--for6375--><tr ms-class="{tr1:index%2==0}"><td class="center">port</td><td class="center">int</td><td>端口号</td></tr><!--for6375--><!--ms-for-end:--></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="row" style="border:1px dashed #ccc;">
|
||||
<table class="table table-bordered">
|
||||
<caption>请求参数注释</caption>
|
||||
<tbody><tr class="api-head"><td width="20%" class="center">错误编码</td><td width="50%" class="">错误提示</td><td width="30%">说明</td></tr><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">code:111</td><td class="">请在1秒后再次请求</td><td>提取链接请求太过频繁,超出限制</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}"><td class="center">code:113</td><td class="">请将192.168.0.0设置为白名单!</td><td>白名单未添加/白名单掉了</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">code:114</td><td class="">余额不足</td><td>账户金额消耗完毕</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}"><td class="center">code:115</td><td class="">请更换地区等条件重新生成api链接地址</td><td>没有资源或没有符合条件的数据</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">code:116</td><td class="">您的套餐今日已到达上限!</td><td>套餐内IP数量消耗完毕</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}"><td class="center">code:117</td><td class="">您的套餐pack传参有误!请检测您现在的ip是否在套餐所在账户!</td><td>检测本地白名单是不是在账户下</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">code:118</td><td class="">您的账户异常,请联系客服!</td><td>账户处于被禁用状态</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}"><td class="center">code:121</td><td class="">您的该套餐已经过期了!</td><td>套餐过期</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}" class="tr1" old-change-class="tr1"><td class="center">code:401</td><td class="">IP:1.1.1.1:2000 Authentication failed!</td><td>白名单错误/使用的IP已经过期</td></tr><!--for6377999999523163--><tr ms-class="{tr1:index%2==0}"><td class="center">code:403</td><td class="">Sorry!The site has been banned!</td><td>客户目标网站异常,联系客服处理</td></tr><!--for6377999999523163--><!--ms-for-end:--></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
|
||||
×
|
||||
</button>
|
||||
<h4 class="modal-title" id="myModalLabel">
|
||||
{{rebuy_data.title}}
|
||||
</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">套餐周期:</h5>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','2','天')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="1"> <span id="dxwxl_tczq_2" class="btn btn-new btn-lg">按天</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','3','周')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="7"> <span id="dxwxl_tczq_3" class="btn btn-default btn-lg">按周</span>
|
||||
</label>
|
||||
<label class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','4','月')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="30"> <span id="dxwxl_tczq_4" class="btn btn-default btn-lg">按月</span>
|
||||
</label>
|
||||
<label v-if="rebuy_data.packType!=21" class="radio-inline" v-on:click="set_btn_checked('dxwxl_tczq_','5','季')">
|
||||
<input type="radio" class="hide" v-model="rebuy_data.periodType" value="90"> <span id="dxwxl_tczq_5" class="btn btn-default btn-lg">按季</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class="margin-top-0">购买时长:</h5>
|
||||
<div class="btn-group" role="group" >
|
||||
<button type="button" v-on:click="gmsc_reduce()" class="btn btn-new">-</button>
|
||||
<button type="button" class="btn btn-default">{{rebuy_data.periodAmount}}{{order_time_type}}</button>
|
||||
<button type="button" v-on:click="gmsc_add()" class="btn btn-new">+</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 ">
|
||||
<div class="boxes boxes-border-top text-left margin-top-30 clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5 class=" text-left">价格:¥{{order_info.money}} <span style="float:right;">
|
||||
<button class="btn btn-new" v-on:click="pay()" data-backdrop="static" >实付¥{{order_info.money}}</button>
|
||||
</span></h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div><!-- /.modal -->
|
||||
</div>
|
||||
<script>
|
||||
var vm = new Vue({
|
||||
el:'#app',
|
||||
data:{
|
||||
pakage_list:[],
|
||||
order_list:[],
|
||||
rebuy_data:{
|
||||
title:'',
|
||||
packId:'',
|
||||
packType:'',
|
||||
periodType:1,
|
||||
periodAmount:1,
|
||||
durationType:5,
|
||||
},
|
||||
order_time_type:'天',
|
||||
order_info:{
|
||||
order_type:2,//1:预储值、2:短效无限量、3:短效包天、4:短效包量、5:长效游戏
|
||||
money:1,
|
||||
data:{}
|
||||
},
|
||||
|
||||
api_link:'',
|
||||
api_link_item:{
|
||||
num:1
|
||||
},
|
||||
regions:[],
|
||||
},
|
||||
created:function(){
|
||||
this.get_package_list();
|
||||
},
|
||||
methods:{
|
||||
get_package_list(){
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/dx_package',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.pakage_list = res.data
|
||||
}
|
||||
});
|
||||
},
|
||||
get_order_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/dx_order',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.order_list = res.data
|
||||
}
|
||||
});
|
||||
},
|
||||
rebuy(r) {
|
||||
this.rebuy_data.title = r.name;
|
||||
this.rebuy_data.packId = r.id;
|
||||
this.rebuy_data.packType = r.planType;
|
||||
this.rebuy_data.durationType = r.durationType2;
|
||||
this.rebuy_data.ipAmount = r.ipAmount;
|
||||
|
||||
if (r.planType == 21) {
|
||||
this.order_info.order_type = 3;
|
||||
}
|
||||
if (r.planType == 23) {
|
||||
this.order_info.order_type = 2;
|
||||
}
|
||||
this.calc_price();
|
||||
|
||||
},
|
||||
set_btn_checked(id_f,id,text){
|
||||
var i = 0;
|
||||
if (text.length > 0) {
|
||||
this.order_time_type = text
|
||||
}
|
||||
for (i=0;i<100;i++) {
|
||||
$("#"+id_f+i).removeClass("btn-new");
|
||||
$("#"+id_f+i).addClass("btn-default");
|
||||
}
|
||||
$("#"+id_f+id).removeClass("btn-default");
|
||||
$("#"+id_f+id).addClass("btn-new");
|
||||
|
||||
let _this=this
|
||||
setTimeout(function() {
|
||||
|
||||
_this.calc_price()
|
||||
|
||||
}, 500);
|
||||
},
|
||||
gmsc_add(){
|
||||
this.rebuy_data.periodAmount++;
|
||||
this.calc_price();
|
||||
},
|
||||
//短效包天购买时长修改
|
||||
gmsc_reduce(){
|
||||
if (this.rebuy_data.periodAmount > 1) {
|
||||
this.rebuy_data.periodAmount--;
|
||||
this.calc_price();
|
||||
}
|
||||
},
|
||||
pay(){
|
||||
let that = this;
|
||||
this.order_info.data = this.rebuy_data;
|
||||
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
order_info: this.order_info
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/order/rebuy_order',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
if (res.code == 1) {
|
||||
$('#myModal').modal('hide');
|
||||
alert(res.msg);
|
||||
that.get_package_list();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
chaneg_type(r){
|
||||
var that = this;
|
||||
this.pakage_list.forEach(function(item,index,arr){
|
||||
|
||||
if (that.api_link_item.pack == item.id) {
|
||||
that.api_link_item.pt = item.planType;
|
||||
that.api_link_item.time = item.durationType2;
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
if (that.api_link_item.pt != 23) {
|
||||
$("#gt").hide();
|
||||
$("#qc").hide();
|
||||
$("#bqc").show();
|
||||
$("#at").show();
|
||||
} else {
|
||||
$("#gt").show();
|
||||
$("#bqc").hide();
|
||||
$("#qc").show();
|
||||
$("#at").hide();
|
||||
that.api_link_item.distinct = 0;
|
||||
}
|
||||
if (that.api_link_item.pt == 21) {
|
||||
$("#gt").show();
|
||||
}
|
||||
},
|
||||
qqms(i){
|
||||
if (i == 1) {
|
||||
$("#sp").hide();
|
||||
} else {
|
||||
$("#sp").show();
|
||||
}
|
||||
},
|
||||
create_api_link(){
|
||||
this.api_link = 'https://get.ip.juip.com/get/ip?';
|
||||
var regions_list = this.regions.join(",");
|
||||
|
||||
for (let key in this.api_link_item) {
|
||||
if (this.api_link_item.hasOwnProperty(key)) {
|
||||
this.api_link += key + "=" + this.api_link_item[key]+'&';
|
||||
}
|
||||
}
|
||||
this.api_link += 'regions=' + regions_list;
|
||||
},
|
||||
// 全选按钮点击事件处理程序
|
||||
selectAll() {
|
||||
var checkboxes = document.querySelectorAll('input[name="regions"]'); // 获取所有复选框元素
|
||||
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
checkboxes[i].checked=true; // 将每个复选框的 checked 属性设置为 true
|
||||
this.regions[i] = checkboxes[i].value;
|
||||
}
|
||||
},
|
||||
// 取消全选按钮点击事件处理程序
|
||||
deselectAll() {
|
||||
var checkboxes = document.querySelectorAll('input[name="regions"]'); // 获取所有复选框元素
|
||||
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
checkboxes[i].checked=false; // 移除每个复选框的 checked 属性
|
||||
}
|
||||
this.regions = [];
|
||||
},
|
||||
copy_url() {
|
||||
this.create_api_link();
|
||||
var text = this.api_link;
|
||||
var textarea = document.createElement('textarea');
|
||||
textarea.style.position = 'fixed';
|
||||
textarea.style.opacity = 0;
|
||||
textarea.value = text;
|
||||
document.body.appendChild(textarea);
|
||||
textarea.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(textarea);
|
||||
},
|
||||
calc_price() {
|
||||
var that = this;
|
||||
this.order_info.data = this.rebuy_data;
|
||||
|
||||
var price_info = {
|
||||
'ipAmount':0,
|
||||
'price':0,
|
||||
};
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/product/calc_price',
|
||||
dataType: "json",
|
||||
async:false,
|
||||
data: this.order_info,
|
||||
success: function (res) {
|
||||
price_info = res
|
||||
}
|
||||
});
|
||||
switch(this.order_info.order_type) {
|
||||
case 2:
|
||||
this.order_info.money = this.order_info.data.periodAmount * price_info.price;
|
||||
break;
|
||||
case 3:
|
||||
this.order_info.money = this.order_info.data.periodAmount * price_info.price * this.order_info.data.ipAmount;
|
||||
break;
|
||||
}
|
||||
|
||||
this.order_info.money = this.order_info.money.toFixed(2);
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
58
Host/Views/User/HttpRecharge.cshtml
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
@{
|
||||
Layout = "_UserLayout";
|
||||
}
|
||||
<div id="app">
|
||||
<table class="table">
|
||||
<caption>HTTP 充值记录</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="min-width: 100px;">交易时间</th>
|
||||
<th style="min-width: 100px;">充值H币</th>
|
||||
<th style="min-width: 100px;">充值渠道</th>
|
||||
<th style="min-width: 50px;">支付金额</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="info in list">
|
||||
<td>{{info.create_time}}</td>
|
||||
<td>{{info.ju_money}}</td>
|
||||
<td>{{info.pay_type }}</td>
|
||||
<td>{{info. pay_money }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<script>
|
||||
var vm = new Vue({
|
||||
el:'#app',
|
||||
data:{
|
||||
list:[]
|
||||
},
|
||||
created:function(){
|
||||
this.get_list();
|
||||
},
|
||||
methods:{
|
||||
get_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/charge_list',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.list = res
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
149
Host/Views/User/HttpUseHistory.cshtml
Normal file
@@ -0,0 +1,149 @@
|
||||
|
||||
@{
|
||||
Layout = "_UserLayout";
|
||||
}
|
||||
<style>
|
||||
h5 {
|
||||
padding:0;
|
||||
margin:0;
|
||||
color:white;
|
||||
}
|
||||
.col-sm-12 {
|
||||
padding:0;
|
||||
margin:0;
|
||||
}
|
||||
</style>
|
||||
<div id="app">
|
||||
<h3>使用记录</h3>
|
||||
<div class="row">
|
||||
<div class="col-md-5 boxes border-dotted-3 clearfix">
|
||||
<h3>包天包量使用概况</h3>
|
||||
<div class="col-md-6">
|
||||
<div class="boxes bg-warning clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5>当日使用IP数量 {{used_data.todayShortPackIpUsed}} 个</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="boxes bg-info clearfix">
|
||||
<div class="col-sm-12">
|
||||
<h5>累计使用IP数量 {{used_data.shortPackIpUsed}} 个</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="margin-top-10">
|
||||
<p>明细 最多允许查看72小时内记录 (短效无限量套餐暂无记录)</p>
|
||||
<div class="col-md-2" style="margin-bottom:10px;;padding:0;">
|
||||
<select v-model="list_info.packType" class="form-control input-sm" style="height:auto;" @@change="get_used_list">
|
||||
<option value="21">短效包天套餐</option>
|
||||
<option value="22">短效包量套餐</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>使用类型</th>
|
||||
<th>客户端IP</th>
|
||||
<th>使用IP</th>
|
||||
<th>端口号</th>
|
||||
<th>使用时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in used_list">
|
||||
<td>{{item.packType}}</td>
|
||||
<td>{{item.userIp}}</td>
|
||||
<td>{{item.ip}}</td>
|
||||
<td>{{item.port}}</td>
|
||||
<td>{{item.createTime}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<nav>
|
||||
<ul class="pager">
|
||||
<li><a v-on:click="page_p()">上一页</a></li>
|
||||
<li>当前页 第{{page.currentPage}}页 </li>
|
||||
<li><a v-on:click="page_n()">下一页</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var vm = new Vue({
|
||||
el:'#app',
|
||||
data:{
|
||||
used_data:{},
|
||||
used_list:[],
|
||||
list_info:{
|
||||
"page": 1, //必填,当前页数
|
||||
"limit": 50, //必填,每页显示条数,建议10~20,不可超过100
|
||||
"packType": 12 //必填,套餐类型,12-储值套餐,21-短效包天套餐,22-短效包量套餐
|
||||
},
|
||||
page:{},
|
||||
},
|
||||
created:function(){
|
||||
this.get_used_info();
|
||||
this.get_used_list();
|
||||
},
|
||||
methods:{
|
||||
get_used_info() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/dx_used',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.used_data = res.data
|
||||
}
|
||||
});
|
||||
},
|
||||
get_used_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
data:this.list_info,
|
||||
}
|
||||
var that = this;
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/dx_used_log',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.used_list = res.data.d.items;
|
||||
that.page = res.data.d.pager;
|
||||
}
|
||||
});
|
||||
},
|
||||
page_p() {
|
||||
if (this.page.currentPage != 1) {
|
||||
this.list_info.page--;
|
||||
this.get_ip_list();
|
||||
}
|
||||
},
|
||||
page_n() {
|
||||
this.list_info.page++;
|
||||
this.get_used_list();
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
146
Host/Views/User/HttpWhiteIp.cshtml
Normal file
@@ -0,0 +1,146 @@
|
||||
|
||||
@{
|
||||
Layout = "_UserLayout";
|
||||
}
|
||||
<div id="app">
|
||||
<div class="boxes margin-top-5 clearfix">
|
||||
<div>
|
||||
<input v-model="ip" type="text" style="width:25%" placeholder="请输入ip地址并点击保存白名单" />
|
||||
<button v-on:click="set_ip()" type="button" class="btn btn-primary" ><span class="glyphicon glyphicon-plus"></span>保存</button>
|
||||
</div>
|
||||
<div class=" margin-top-30">
|
||||
<h5>当前白名单列表 <span class="text-warning">当前仅允许保留白名单数量:5个</span></h5>
|
||||
<div class="col-sm-12">
|
||||
<table class="products-table responsive tablesaw tablesaw-stack" data-tablesaw-mode="stack">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>IP地址</th>
|
||||
<th>设置时间</th>
|
||||
<th>锁定状态</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in ip_list">
|
||||
<td style="display:none;">{{item.id}}</td>
|
||||
<td>{{item.ip}}</td>
|
||||
<td>{{item.createTime}}</td>
|
||||
<td>{{item.isLocked}}</td>
|
||||
<td>
|
||||
<a v-if="item.isLocked=='未锁定'" v-on:click="lock_ip(item.id,1)" class="btn btn-new">锁定</a>
|
||||
<a v-if="item.isLocked=='已锁定'" v-on:click="lock_ip(item.id,0)" class="btn btn-new">解锁</a>
|
||||
<a class="btn btn-danger" v-on:click="delete_ip(item.id)">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var vm = new Vue({
|
||||
el:'#app',
|
||||
data:{
|
||||
ip_list:[],
|
||||
ip:'',
|
||||
},
|
||||
created:function(){
|
||||
this.get_list();
|
||||
},
|
||||
methods:{
|
||||
get_list() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/white_list',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.ip_list = res.data
|
||||
}
|
||||
});
|
||||
},
|
||||
set_ip() {
|
||||
let data = {
|
||||
cookie:document.cookie,
|
||||
data: {ip:this.ip}
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/create_white_ip',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.get_list()
|
||||
}
|
||||
});
|
||||
},
|
||||
lock_ip(id,status) {
|
||||
var lock_ip = {};
|
||||
lock_ip.id = id;
|
||||
lock_ip.lock = status;
|
||||
let dataa = {
|
||||
cookie:document.cookie,
|
||||
data: lock_ip
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/lock_ip',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(dataa),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.get_list()
|
||||
}
|
||||
});
|
||||
},
|
||||
delete_ip(id) {
|
||||
var dalete_ip = {};
|
||||
dalete_ip.id = id;
|
||||
let dataa = {
|
||||
cookie:document.cookie,
|
||||
data: dalete_ip
|
||||
}
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: 'http://php-api.juip.com/http/user/delete_ip',
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(dataa),
|
||||
beforeSend: function(xhr) {
|
||||
xhr.withCredentials = true;
|
||||
},
|
||||
crossDomain: true,
|
||||
success: function (res) {
|
||||
that.get_list()
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
BIN
Host/wwwroot/http/css/img/cb.png
Normal file
|
After Width: | Height: | Size: 842 B |
BIN
Host/wwwroot/http/css/img/cw.png
Normal file
|
After Width: | Height: | Size: 919 B |
BIN
Host/wwwroot/http/css/img/db.png
Normal file
|
After Width: | Height: | Size: 254 B |
BIN
Host/wwwroot/http/css/img/dw.png
Normal file
|
After Width: | Height: | Size: 260 B |
BIN
Host/wwwroot/http/css/img/lb.png
Normal file
|
After Width: | Height: | Size: 255 B |
BIN
Host/wwwroot/http/css/img/lw.png
Normal file
|
After Width: | Height: | Size: 245 B |
BIN
Host/wwwroot/http/css/img/mb.png
Normal file
|
After Width: | Height: | Size: 438 B |
BIN
Host/wwwroot/http/css/img/mw.png
Normal file
|
After Width: | Height: | Size: 465 B |
BIN
Host/wwwroot/http/css/img/rb.png
Normal file
|
After Width: | Height: | Size: 246 B |
BIN
Host/wwwroot/http/css/img/rw.png
Normal file
|
After Width: | Height: | Size: 261 B |
215
Host/wwwroot/http/css/jquery-rvnm-rtl.css
Normal file
@@ -0,0 +1,215 @@
|
||||
/**
|
||||
* rvnm Responsive vertical navigation menu
|
||||
*
|
||||
* Copyright (C) 2017 4xmen team <a1gard@4xmen.ir>
|
||||
*
|
||||
* LICENSE: This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 3 of the License, or (at your option) any
|
||||
* later version. This program is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details. You should have received a copy of the GNU
|
||||
* General Public License along with this program.
|
||||
* If not, see <http://opensource.org/licenses/gpl-license.php>.
|
||||
*
|
||||
* @package rvnm
|
||||
* @subpackage rvnm style sheet right to left
|
||||
* @author 4xmen team <www.4xmen.ir>
|
||||
* @author A1Gard <a1gard@4xmen.ir>
|
||||
* @link https://github.com/4xmen/rvnm
|
||||
*/
|
||||
.rvnm-navbar-box{
|
||||
direction: rtl;
|
||||
left: auto ;
|
||||
right:0 ;
|
||||
}
|
||||
|
||||
.rvnm-wrapper{
|
||||
margin-left: 0;
|
||||
margin-right: 220px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li ul{
|
||||
padding-left: 0;
|
||||
padding-right: 10px;
|
||||
}
|
||||
.rvnm-navbar-box li .fa{
|
||||
margin-right: 0px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li.rvnm-expandable{
|
||||
background-image: url(img/lb.png) ;
|
||||
background-position: 5% 10px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li.rvnm-collapseable{
|
||||
background-position: 5% 10px;
|
||||
}
|
||||
|
||||
|
||||
/* minmal mode */
|
||||
|
||||
.rvnm-wrapper.rvnm-minimal{
|
||||
margin-right: 40px;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .fa{
|
||||
margin-left: 20px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
left:auto;
|
||||
right:40px;
|
||||
padding-right: 0;
|
||||
border-right: 1px solid #e0e0e0;
|
||||
border-left: 0;
|
||||
}
|
||||
|
||||
/* mobile mode */
|
||||
.rvnm-navbar-box.rvnm-mobile{
|
||||
right: 0px;
|
||||
left: auto;
|
||||
}
|
||||
|
||||
.rvnm-wrapper.rvnm-mobile{
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand{
|
||||
background-position: 97% 5px;
|
||||
}
|
||||
|
||||
|
||||
/* dark theme */
|
||||
|
||||
.rvnm-navbar-box.dark ul li.rvnm-expandable{
|
||||
background-image: url(img/lw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
/* Dark theme minimal mode */
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Dark theme mobile mode */
|
||||
.rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand{
|
||||
background-position: 97% 5px;
|
||||
}
|
||||
|
||||
|
||||
/* dark ruby theme */
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li.rvnm-expandable{
|
||||
background-image: url(img/lw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
/* Dark theme minimal mode */
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Dark theme mobile mode */
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand{
|
||||
background-position: 97% 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* dark beryl theme */
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li.rvnm-expandable{
|
||||
background-image: url(img/lw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
/* Dark theme minimal mode */
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Dark theme mobile mode */
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand{
|
||||
background-position: 97% 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* dark doder theme */
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li.rvnm-expandable{
|
||||
background-image: url(img/lw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
/* Dark theme minimal mode */
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Dark theme mobile mode */
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand{
|
||||
background-position: 97% 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* dark lesb theme */
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li.rvnm-expandable{
|
||||
background-image: url(img/lw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-position: 10px 15px;
|
||||
}
|
||||
|
||||
/* Dark theme minimal mode */
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Dark theme mobile mode */
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand{
|
||||
background-position: 97% 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
728
Host/wwwroot/http/css/jquery-rvnm.css
Normal file
@@ -0,0 +1,728 @@
|
||||
/**
|
||||
* rvnm Responsive vertical navigation menu
|
||||
*
|
||||
* Copyright (C) 2017 4xmen team <a1gard@4xmen.ir>
|
||||
*
|
||||
* LICENSE: This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 3 of the License, or (at your option) any
|
||||
* later version. This program is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details. You should have received a copy of the GNU
|
||||
* General Public License along with this program.
|
||||
* If not, see <http://opensource.org/licenses/gpl-license.php>.
|
||||
*
|
||||
* @package rvnm
|
||||
* @subpackage rvnm style sheet
|
||||
* @author 4xmen team <www.4xmen.ir>
|
||||
* @author A1Gard <a1gard@4xmen.ir>
|
||||
* @link https://github.com/4xmen/rvnm
|
||||
*/
|
||||
|
||||
body,html{
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
|
||||
/* ripple */
|
||||
.rvnm-ripple {
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-radius: 50%;
|
||||
background: rgba(0, 0, 0, 0.4);
|
||||
transform: scale(0);
|
||||
position: absolute;
|
||||
opacity: 1;
|
||||
}
|
||||
.rvnm-rippleEffect {
|
||||
animation: rvnm-rippleDrop .6s linear;
|
||||
}
|
||||
|
||||
@keyframes rvnm-rippleDrop {
|
||||
100% {
|
||||
transform: scale(2);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.rvnm-navbar-box{
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
top:0;
|
||||
width: 220px;
|
||||
background: #A0AEC4 ;
|
||||
min-height: 50vh;
|
||||
overflow-y: hidden;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.rvnm-wrapper{
|
||||
margin-left: 220px;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li{
|
||||
background: #eee ;
|
||||
border-bottom:1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li:hover{
|
||||
background: #A0AEC4 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li.rvnm-collapseable{
|
||||
background: #e1e1e1;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li ul{
|
||||
overflow: hidden;
|
||||
display: none;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box .fa{
|
||||
font-size: 16px;
|
||||
}
|
||||
.rvnm-navbar-box a{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box .search{
|
||||
padding: 4px;
|
||||
height: 25px;
|
||||
max-height: 25px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box .search .fa{
|
||||
margin-left: 7px;
|
||||
margin-right: 3px !important;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box .search input{
|
||||
padding: 6px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
width: calc(100% - 40px);
|
||||
outline: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box ul li a,.rvnm-navbar-box ul li a:visited{
|
||||
display: block;
|
||||
padding: 10px;
|
||||
font-size: 14px;
|
||||
font-weight: 100;
|
||||
color: #333 ;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
height: 45px;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing:border-box;
|
||||
line-height: 1.75em;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li:hover a,.rvnm-navbar-box ul li:hover a:visited{
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li span.spliter{
|
||||
display: block;
|
||||
padding: 10px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
background: #eaeaea ;
|
||||
color: #1d4686;
|
||||
/*text-align: center;*/
|
||||
}
|
||||
|
||||
.rvnm-navbar-box li .fa{
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li.rvnm-expandable{
|
||||
background-image: url(img/rb.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 10px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box ul li.rvnm-collapseable{
|
||||
background-image: url(img/db.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 10px;
|
||||
}
|
||||
.rvnm-navbar-box ul li.rvnm-collapseable > ul{
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*minmal mode*/
|
||||
|
||||
.rvnm-minimal{
|
||||
|
||||
}
|
||||
|
||||
.rvnm-minimal .search input {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.rvnm-minimal .search:hover input{
|
||||
display: inline-block;
|
||||
width: calc(100% - 45px);
|
||||
}
|
||||
.rvnm-minimal .search input:focus {
|
||||
display: inline-block;
|
||||
width: calc(100% - 45px);
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal{
|
||||
width: 40px;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.rvnm-wrapper.rvnm-minimal{
|
||||
margin-left: 40px;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal > li{
|
||||
text-align: center;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal li > a,.rvnm-navbar-box.rvnm-minimal li > .spliter{
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal > ul > li.rvnm-expandable{
|
||||
background-image: none ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand{
|
||||
width: 240px;
|
||||
height: 36px;
|
||||
overflow: visible;
|
||||
position: relative;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand a,.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .spliter{
|
||||
font-size: 14px;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > a,.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > .spliter{
|
||||
background: rgba(0,0,0,0.2) ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .fa{
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{
|
||||
display: block;
|
||||
z-index: 9;
|
||||
position: absolute;
|
||||
left:40px;
|
||||
padding-left: 0;
|
||||
top:100%;
|
||||
width: 200px;
|
||||
padding-top: 1px;
|
||||
border-left: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
/*mobile mode*/
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile{
|
||||
min-height: 0;
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
top:0;
|
||||
width: 40px;
|
||||
height:35px;
|
||||
overflow: hidden;
|
||||
opacity: 0.6;
|
||||
-o-transition:.6s;
|
||||
-ms-transition:.6s;
|
||||
-moz-transition:.6s;
|
||||
-webkit-transition:.6s;
|
||||
transition:.6s;
|
||||
background: #fff url(img/mb.png) center no-repeat ;
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile:hover{
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile > ul{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.rvnm-wrapper.rvnm-mobile{
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand{
|
||||
overflow: visible;
|
||||
background: #fff url(img/cb.png) no-repeat ;
|
||||
background-position: 5px 5px;
|
||||
opacity: 1 ;
|
||||
padding-top: 40px;
|
||||
width: 100%;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand > ul{
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
/* Dark theme */
|
||||
.rvnm-navbar-box.dark{
|
||||
background: #353C48 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark ul li{
|
||||
background: #353C48 ;
|
||||
border-bottom: 0 ;
|
||||
}
|
||||
.rvnm-navbar-box.dark .fa, .rvnm-navbar-box.dark .search input {
|
||||
color: #eee;
|
||||
}
|
||||
/*.rvnm-navbar-box.dark ul li*/
|
||||
|
||||
.rvnm-navbar-box.dark ul li:hover,.rvnm-navbar-box.dark ul li.rvnm-collapseable{
|
||||
background-color: rgba(0, 0, 0, 0.07) ;
|
||||
}
|
||||
.rvnm-navbar-box.dark ul li a,.rvnm-navbar-box.dark ul li a:visited,.rvnm-navbar-box.dark ul li span.spliter{
|
||||
background: transparent ;
|
||||
color: white;
|
||||
padding-top: 15px ;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark ul li span.spliter{
|
||||
opacity: .60;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark ul li:hover a,.rvnm-navbar-box.dark ul li:hover a:visited{
|
||||
color: white;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark ul li.rvnm-expandable{
|
||||
background-image: url(img/rw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
/*Dark theme minimal*/
|
||||
.rvnm-navbar-box.rvnm-minimal.dark .rvnm-minimal-expand{
|
||||
height: 46px;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark .rvnm-minimal-expand > a,.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > .spliter{
|
||||
background: rgba(0,0,0,0.2) ;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark ul li:hover,.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable{
|
||||
background-color: #444859 ;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark > ul > li{
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark .rvnm-minimal-expand > ul{
|
||||
top:100%;
|
||||
background-color: #444859 ;
|
||||
border-left: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark ul li ul li{
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark ul li ul li:hover{
|
||||
background-color: rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/*Dark theme mobile mode*/
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark{
|
||||
background: #393a48 url(img/mw.png) center no-repeat ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand{
|
||||
background: #393a48 url(img/cw.png) no-repeat ;
|
||||
background-position: 5px 5px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand ul {
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/* Dark ruby theme */
|
||||
.rvnm-navbar-box.dark-ruby{
|
||||
background: #353C48 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li{
|
||||
background: #353C48 ;
|
||||
border-bottom: 0 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby .fa, .rvnm-navbar-box.dark-ruby .search input {
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li:hover,.rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable{
|
||||
background-color: #f0544c;
|
||||
}
|
||||
.rvnm-navbar-box.dark-ruby ul li a,.rvnm-navbar-box.dark-ruby ul li a:visited,.rvnm-navbar-box.dark-ruby ul li span.spliter{
|
||||
background: transparent ;
|
||||
color: white;
|
||||
padding-top: 15px ;
|
||||
padding-bottom: 15px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li span.spliter{
|
||||
opacity: .60;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li span.spliter:hover{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li:hover a,.rvnm-navbar-box.dark-ruby ul li:hover a:visited{
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li.rvnm-expandable{
|
||||
background-image: url(img/rw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
/*Dark ruby theme minimal*/
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-ruby .rvnm-minimal-expand{
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-ruby ul li:hover,.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable{
|
||||
background-color: #f0544c ;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-ruby > ul > li{
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-ruby .rvnm-minimal-expand > ul{
|
||||
top:100%;
|
||||
background-color: #f0544c ;
|
||||
border-left: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-ruby ul li ul li{
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/*Dark ruby theme mobile mode*/
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-ruby{
|
||||
background: #393a48 url(img/mw.png) center no-repeat ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand{
|
||||
background: #393a48 url(img/cw.png) no-repeat ;
|
||||
background-position: 5px 5px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand ul {
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/* Dark beryl theme */
|
||||
.rvnm-navbar-box.dark-beryl{
|
||||
background: #353C48 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li{
|
||||
background: #353C48 ;
|
||||
border-bottom: 0 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl .fa, .rvnm-navbar-box.dark-beryl .search input {
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li:hover,.rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable{
|
||||
background-color: #0fd1ab;
|
||||
}
|
||||
.rvnm-navbar-box.dark-beryl ul li a,.rvnm-navbar-box.dark-beryl ul li a:visited,.rvnm-navbar-box.dark-beryl ul li span.spliter{
|
||||
background: transparent ;
|
||||
color: #eee;
|
||||
padding-top: 15px ;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li span.spliter{
|
||||
opacity: .60;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li span.spliter:hover{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li:hover a,.rvnm-navbar-box.dark-beryl ul li:hover a:visited{
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li.rvnm-expandable{
|
||||
background-image: url(img/rw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
/*Dark beryl theme minimal*/
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-beryl .rvnm-minimal-expand{
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-beryl ul li:hover,.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable{
|
||||
background-color: #0fd1ab ;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-beryl > ul > li{
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-beryl .rvnm-minimal-expand > ul{
|
||||
top:100%;
|
||||
background-color: #0fd1ab ;
|
||||
border-left: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-beryl ul li ul li{
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/*Dark beryl theme mobile mode*/
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-beryl{
|
||||
background: #393a48 url(img/mw.png) center no-repeat ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand{
|
||||
background: #393a48 url(img/cw.png) no-repeat ;
|
||||
background-position: 5px 5px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand ul {
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/* Dark doder theme */
|
||||
.rvnm-navbar-box.dark-doder{
|
||||
background: #353C48 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li{
|
||||
background: #353C48 ;
|
||||
border-bottom: 0 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder .fa, .rvnm-navbar-box.dark-doder .search input {
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li:hover,.rvnm-navbar-box.dark-doder ul li.rvnm-collapseable{
|
||||
background-color: #4285f4;
|
||||
}
|
||||
.rvnm-navbar-box.dark-doder ul li a,.rvnm-navbar-box.dark-doder ul li a:visited,.rvnm-navbar-box.dark-doder ul li span.spliter{
|
||||
background: transparent ;
|
||||
color: #eee;
|
||||
padding-top: 15px ;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li span.spliter{
|
||||
opacity: .60;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li span.spliter:hover{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li:hover a,.rvnm-navbar-box.dark-doder ul li:hover a:visited{
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li.rvnm-expandable{
|
||||
background-image: url(img/rw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-doder ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
/*Dark doder theme minimal*/
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-doder .rvnm-minimal-expand{
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-doder ul li:hover,.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable{
|
||||
background-color: #4285f4 ;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-doder > ul > li{
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-doder .rvnm-minimal-expand > ul{
|
||||
top:100%;
|
||||
background-color: #4285f4 ;
|
||||
border-left: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-doder ul li ul li{
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/*Dark doder theme mobile mode*/
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-doder{
|
||||
background: #393a48 url(img/mw.png) center no-repeat ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand{
|
||||
background: #393a48 url(img/cw.png) no-repeat ;
|
||||
background-position: 5px 5px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand ul {
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/* Dark lesb theme */
|
||||
.rvnm-navbar-box.dark-lesb{
|
||||
background: #353C48 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li{
|
||||
background: #353C48 ;
|
||||
border-bottom: 0 ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb .fa, .rvnm-navbar-box.dark-lesb .search input {
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li:hover,.rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable{
|
||||
background-color: #f442b3;
|
||||
}
|
||||
.rvnm-navbar-box.dark-lesb ul li a,.rvnm-navbar-box.dark-lesb ul li a:visited,.rvnm-navbar-box.dark-lesb ul li span.spliter{
|
||||
background: transparent ;
|
||||
color: #eee;
|
||||
padding-top: 15px ;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li span.spliter{
|
||||
opacity: .60;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li span.spliter:hover{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li:hover a,.rvnm-navbar-box.dark-lesb ul li:hover a:visited{
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li.rvnm-expandable{
|
||||
background-image: url(img/rw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable{
|
||||
background-image: url(img/dw.png) ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 95% 15px;
|
||||
}
|
||||
/*Dark lesb theme minimal*/
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-lesb .rvnm-minimal-expand{
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-lesb ul li:hover,.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable{
|
||||
background-color: #f442b3 ;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-lesb > ul > li{
|
||||
background-image: none !important;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-lesb .rvnm-minimal-expand > ul{
|
||||
top:100%;
|
||||
background-color: #f442b3 ;
|
||||
border-left: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
.rvnm-navbar-box.rvnm-minimal.dark-lesb ul li ul li{
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
|
||||
|
||||
/*Dark lesb theme mobile mode*/
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-lesb{
|
||||
background: #393a48 url(img/mw.png) center no-repeat ;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand{
|
||||
background: #393a48 url(img/cw.png) no-repeat ;
|
||||
background-position: 5px 5px;
|
||||
}
|
||||
|
||||
.rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand ul {
|
||||
background-color: #393a48 ;
|
||||
}
|
||||
1042
Host/wwwroot/http/css/responsive.css
Normal file
5710
Host/wwwroot/http/css/style.css
Normal file
310
Host/wwwroot/http/js/jquery-rvnm.js
vendored
Normal file
@@ -0,0 +1,310 @@
|
||||
/**
|
||||
* rvnm Responsive vertical navigation menu
|
||||
*
|
||||
* Copyright (C) 2017 4xmen team <a1gard@4xmen.ir>
|
||||
*
|
||||
* LICENSE: This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 3 of the License, or (at your option) any
|
||||
* later version. This program is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
* Public License for more details. You should have received a copy of the GNU
|
||||
* General Public License along with this program.
|
||||
* If not, see <http://opensource.org/licenses/gpl-license.php>.
|
||||
*
|
||||
* @package rvnm
|
||||
* @author 4xmen team <www.4xmen.ir>
|
||||
* @author A1Gard <a1gard@4xmen.ir>
|
||||
* @link https://github.com/4xmen/rvnm
|
||||
*/
|
||||
|
||||
;
|
||||
(function ($) {
|
||||
|
||||
$.fn.rvnm = function (options) {
|
||||
|
||||
|
||||
/**
|
||||
* settings ofplgin
|
||||
* @type Object
|
||||
*/
|
||||
var settings = $.extend({
|
||||
wrapper: '#wrapper', // main page wrapper
|
||||
mode: 'default', // mode of menu (default = desktop| minimal = tablet | mobile)
|
||||
responsive: true, // repsonsve mode only work in default mode
|
||||
theme: '',
|
||||
searchable: false,
|
||||
}, options);
|
||||
|
||||
/**
|
||||
* sizetrigger is function to change nav box size
|
||||
* or control reponsive & mode of menu
|
||||
* @returns {undefined}
|
||||
*/
|
||||
this.sizetrigger = function () {
|
||||
// repsonvive mode controller
|
||||
if (settings.responsive && settings.mode === 'default') {
|
||||
// if window size between 450 and 768 active minimal
|
||||
if ($(window).width() > 450 && $(window).width() < 768) {
|
||||
if (!$(self).hasClass('rvnm-minimal')) {
|
||||
// fix extended after switch from defualt to minimal
|
||||
$(self).find('.rvnm-collapseable ul').attr('style', '');
|
||||
$(self).find('.rvnm-collapseable').addClass('rvnm-expandable').removeClass('rvnm-collapseable');
|
||||
}
|
||||
$(settings.wrapper).removeClass('rvnm-mobile');
|
||||
$(self).removeClass('rvnm-mobile');
|
||||
$(settings.wrapper).addClass('rvnm-minimal');
|
||||
$(self).addClass('rvnm-minimal');
|
||||
}
|
||||
// if window size less than 450 active mobile mode
|
||||
if ($(window).width() <= 450) {
|
||||
$(settings.wrapper).removeClass('rvnm-minimal');
|
||||
$(self).removeClass('rvnm-minimal');
|
||||
$(settings.wrapper).addClass('rvnm-mobile');
|
||||
$(self).addClass('rvnm-mobile');
|
||||
}
|
||||
// if window size greater than 768 active desktop mode by
|
||||
// remove minimal & mobile calss
|
||||
if ($(window).width() >= 768) {
|
||||
$(settings.wrapper).removeClass('rvnm-minimal');
|
||||
$(self).removeClass('rvnm-minimal');
|
||||
$(settings.wrapper).removeClass('rvnm-mobile');
|
||||
$(self).removeClass('rvnm-mobile');
|
||||
}
|
||||
}
|
||||
$(".rvnm-navbar-box").css('height', '');
|
||||
if (settings.mode !== 'mobile' && !$(self).hasClass('rvnm-mobile')) {
|
||||
if ($(".rvnm-navbar-box").height() < $("body").height() || $(".rvnm-navbar-box").height() < $(window).height() || $(".rvnm-navbar-box").height() < $("html").height()) {
|
||||
$(".rvnm-navbar-box").height(Math.max($('body').height(), $(window).height(), $("html").height()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
// set plugn selector to self for use in other place of plugin
|
||||
var self = this;
|
||||
|
||||
this.each(function () {
|
||||
// add rvnm-navbar-box to menu
|
||||
$(this).addClass('rvnm-navbar-box');
|
||||
|
||||
|
||||
// add theme if extis
|
||||
if (settings.theme !== '') {
|
||||
$(this).addClass(settings.theme);
|
||||
}
|
||||
|
||||
// add expandable class to li's has ul child
|
||||
$(this).find('li:has(> ul)').addClass('rvnm-expandable');
|
||||
// rvnm-wrapper class to main content element
|
||||
$(settings.wrapper).addClass('rvnm-wrapper');
|
||||
// check if minimal mode active change mode
|
||||
if ($(this).hasClass('rvnm-minimal') || settings.mode === 'minimal') {
|
||||
$(settings.wrapper).addClass('rvnm-minimal');
|
||||
$(this).addClass('rvnm-minimal');
|
||||
settings.mode = 'minimal';
|
||||
}
|
||||
// check if mobile mode active change mode
|
||||
if ($(this).hasClass('rvnm-minimal') || settings.mode === 'mobile') {
|
||||
$(settings.wrapper).addClass('rvnm-mobile');
|
||||
$(this).addClass('rvnm-mobile');
|
||||
settings.mode = 'mobile';
|
||||
}
|
||||
|
||||
// resize navbar box
|
||||
self.sizetrigger();
|
||||
|
||||
// add triger windows resize
|
||||
$(window).bind('resize.rvnm', function () {
|
||||
self.sizetrigger();
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* ripple effect for links
|
||||
*/
|
||||
$(document).on('click', '.rvnm-navbar-box ul li a', function (e) {
|
||||
// Remove any old one
|
||||
$(".rvnm-ripple").remove();
|
||||
|
||||
// Setup
|
||||
var posX = $(this).offset().left,
|
||||
posY = $(this).offset().top,
|
||||
buttonWidth = $(this).width(),
|
||||
buttonHeight = $(this).height();
|
||||
|
||||
// Add the element
|
||||
$(this).prepend("<span class='rvnm-ripple'></span>");
|
||||
|
||||
|
||||
// Make it round!
|
||||
if (buttonWidth >= buttonHeight) {
|
||||
buttonHeight = buttonWidth;
|
||||
} else {
|
||||
buttonWidth = buttonHeight;
|
||||
}
|
||||
|
||||
// Get the center of the element
|
||||
var x = e.pageX - posX - buttonWidth / 2;
|
||||
var y = e.pageY - posY - buttonHeight / 2;
|
||||
|
||||
|
||||
// Add the ripples CSS and start the animation
|
||||
$(".rvnm-ripple").css({
|
||||
width: buttonWidth,
|
||||
height: buttonHeight,
|
||||
top: y + 'px',
|
||||
left: x + 'px'
|
||||
}).addClass("rvnm-rippleEffect");
|
||||
|
||||
setTimeout(function () {
|
||||
$(".rvnm-ripple").remove();
|
||||
}, 600);
|
||||
|
||||
});
|
||||
|
||||
// add click event to expandable link
|
||||
$(document).on('click', '.rvnm-expandable > a', function (e) {
|
||||
// check click only this element
|
||||
if (e.target !== e.currentTarget)
|
||||
return false;
|
||||
|
||||
// check is first level of li child and minimal mode siable
|
||||
if ($(this).parent().hasClass('rvnm-minimal-expand')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check is first level of li child
|
||||
// try to close other expanded items
|
||||
if ($(this).parent().closest('.rvnm-collapseable').length === 0) {
|
||||
// slide up first level ul of this
|
||||
$(".rvnm-collapseable > a").parent().find('> ul').slideUp(300);
|
||||
// add expandable class to parent of link and remove collapseable
|
||||
$(".rvnm-collapseable > a").parent().addClass('rvnm-expandable').removeClass('rvnm-collapseable');
|
||||
}
|
||||
|
||||
|
||||
// add collapseable class to parent of link and remove expandable
|
||||
$(this).parent().addClass('rvnm-collapseable').removeClass('rvnm-expandable');
|
||||
// slide down first level ul
|
||||
$(this).parent().find('> ul').slideDown(300, function () {
|
||||
// then use size triger
|
||||
self.sizetrigger();
|
||||
});
|
||||
// if href is # link should not be work
|
||||
if ($(this).attr('href') === '#') {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on('keyup mouseup change', '.rvnm-search', function (e) {
|
||||
var word = $(this).val();
|
||||
if (word.length == 0) {
|
||||
$(this).closest('ul').find('> li').show();
|
||||
} else {
|
||||
$(this).closest('ul').find('> li').each(function () {
|
||||
if (!$(this).hasClass('search')) {
|
||||
$(this).show();
|
||||
var txt = $(this).text();
|
||||
if (txt.indexOf(word) == -1) {
|
||||
$(this).hide();
|
||||
}
|
||||
}
|
||||
});
|
||||
self.sizetrigger();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// add click event to collapseable link
|
||||
$(document).on('click', '.rvnm-collapseable > a', function (e) {
|
||||
// check click only this element
|
||||
if (e.target !== e.currentTarget)
|
||||
return false;
|
||||
// add expandable class to parent of link and remove collapseable
|
||||
$(this).parent().addClass('rvnm-expandable').removeClass('rvnm-collapseable');
|
||||
// slide up first level ul of this
|
||||
$(this).parent().find('> ul').slideUp(300, function () {
|
||||
self.sizetrigger();
|
||||
});
|
||||
|
||||
// if href is # link should not be work
|
||||
if ($(this).attr('href') === '#') {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// click an nav box when has rvnm-mobile class
|
||||
$(document).on('click', '.rvnm-mobile', function (e) {
|
||||
if (e.target !== e.currentTarget)
|
||||
return false;
|
||||
// try to expand menu
|
||||
$(this).toggleClass('rvnm-mobile-expand');
|
||||
});
|
||||
|
||||
// on mouseenter when menu is minimal
|
||||
$(document).on('mouseenter', '.rvnm-navbar-box.rvnm-minimal li', function (e) {
|
||||
// if menu is first level li
|
||||
if ($(this).closest('.rvnm-minimal-expand').length === 0) {
|
||||
// show menu
|
||||
$(this).addClass('rvnm-minimal-expand');
|
||||
}
|
||||
});
|
||||
// on mouseleave when menu is minimal
|
||||
$(document).on('mouseleave', '.rvnm-navbar-box.rvnm-minimal li.rvnm-minimal-expand', function (e) {
|
||||
$(".rvnm-minimal-expand .rvnm-collapseable ul").slideUp();
|
||||
$(".rvnm-minimal-expand .rvnm-collapseable").addClass('rvnm-expandable').removeClass('rvnm-collapseable');
|
||||
$(this).removeClass('rvnm-minimal-expand');
|
||||
});
|
||||
|
||||
$(window).load(function () {
|
||||
setTimeout(function () {
|
||||
self.sizetrigger();
|
||||
}, 100);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
return {
|
||||
settings: settings,
|
||||
setMode: function (mode) {
|
||||
$(settings.wrapper).removeClass('rvnm-mobile');
|
||||
$(self).removeClass('rvnm-mobile');
|
||||
$(settings.wrapper).removeClass('rvnm-minimal');
|
||||
$(self).removeClass('rvnm-minimal');
|
||||
settings.responsive = false;
|
||||
settings.mode = mode;
|
||||
|
||||
if (mode === 'default') {
|
||||
return true;
|
||||
}
|
||||
if (mode === 'minimal') {
|
||||
$(settings.wrapper).addClass('rvnm-minimal');
|
||||
$(self).addClass('rvnm-minimal');
|
||||
return true;
|
||||
}
|
||||
if (mode === 'mobile') {
|
||||
$(settings.wrapper).addClass('rvnm-mobile');
|
||||
$(self).addClass('rvnm-mobile');
|
||||
return true;
|
||||
}
|
||||
},
|
||||
setTheme: function (theme) {
|
||||
$(self).removeClass('dark');
|
||||
$(self).removeClass('dark-lesb');
|
||||
$(self).removeClass('dark-doder');
|
||||
$(self).removeClass('dark-beryl');
|
||||
$(self).removeClass('dark-ruby');
|
||||
$(self).addClass(theme);
|
||||
settings.theme = theme;
|
||||
},
|
||||
$this: this
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
|
||||
}(jQuery));
|
||||
16617
Host/wwwroot/http/js/jquery-ui.js
vendored
Normal file
69
Host/wwwroot/http/js/jquery.parallax-1.1.3.js
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
Plugin: jQuery Parallax
|
||||
Version 1.1.3
|
||||
Author: Ian Lunn
|
||||
Twitter: @IanLunn
|
||||
Author URL: http://www.ianlunn.co.uk/
|
||||
Plugin URL: http://www.ianlunn.co.uk/plugins/jquery-parallax/
|
||||
|
||||
Dual licensed under the MIT and GPL licenses:
|
||||
http://www.opensource.org/licenses/mit-license.php
|
||||
http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
(function( $ ){
|
||||
var $window = $(window);
|
||||
var windowHeight = $window.height();
|
||||
|
||||
$window.resize(function () {
|
||||
windowHeight = $window.height();
|
||||
});
|
||||
|
||||
$.fn.parallax = function(xpos, speedFactor, outerHeight) {
|
||||
var $this = $(this);
|
||||
var getHeight;
|
||||
var firstTop;
|
||||
var paddingTop = 0;
|
||||
|
||||
//get the starting position of each element to have parallax applied to it
|
||||
$this.each(function(){
|
||||
firstTop = $this.offset().top;
|
||||
});
|
||||
|
||||
if (outerHeight) {
|
||||
getHeight = function(jqo) {
|
||||
return jqo.outerHeight(true);
|
||||
};
|
||||
} else {
|
||||
getHeight = function(jqo) {
|
||||
return jqo.height();
|
||||
};
|
||||
}
|
||||
|
||||
// setup defaults if arguments aren't specified
|
||||
if (arguments.length < 1 || xpos === null) xpos = "50%";
|
||||
if (arguments.length < 2 || speedFactor === null) speedFactor = 0.1;
|
||||
if (arguments.length < 3 || outerHeight === null) outerHeight = true;
|
||||
|
||||
// function to be called whenever the window is scrolled or resized
|
||||
function update(){
|
||||
var pos = $window.scrollTop();
|
||||
|
||||
$this.each(function(){
|
||||
var $element = $(this);
|
||||
var top = $element.offset().top;
|
||||
var height = getHeight($element);
|
||||
|
||||
// Check if totally above or totally below viewport
|
||||
if (top + height < pos || top > pos + windowHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this.css('backgroundPosition', xpos + " " + Math.round((firstTop - pos) * speedFactor) + "px");
|
||||
});
|
||||
}
|
||||
|
||||
$window.bind('scroll', update).resize(update);
|
||||
update();
|
||||
};
|
||||
})(jQuery);
|
||||
669
Host/wwwroot/http/js/jquery.responsiveTabs.js
Normal file
@@ -0,0 +1,669 @@
|
||||
/*!
|
||||
* Project: jquery.responsiveTabs.js
|
||||
* Description: A plugin that creates responsive tabs, optimized for all devices
|
||||
* Author: Jelle Kralt (jelle@jellekralt.nl)
|
||||
* Version: 1.5.1
|
||||
* License: MIT
|
||||
*/
|
||||
|
||||
;(function ( $, window, undefined ) {
|
||||
|
||||
/** Default settings */
|
||||
var defaults = {
|
||||
active: null,
|
||||
event: 'click',
|
||||
disabled: [],
|
||||
collapsible: 'accordion',
|
||||
startCollapsed: false,
|
||||
rotate: false,
|
||||
setHash: false,
|
||||
animation: 'default',
|
||||
animationQueue: false,
|
||||
duration: 500,
|
||||
scrollToAccordion: false,
|
||||
scrollToAccordionOffset: 0,
|
||||
accordionTabElement: '<div></div>',
|
||||
activate: function(){},
|
||||
deactivate: function(){},
|
||||
load: function(){},
|
||||
activateState: function(){},
|
||||
classes: {
|
||||
stateDefault: 'r-tabs-state-default',
|
||||
stateActive: 'r-tabs-state-active',
|
||||
stateDisabled: 'r-tabs-state-disabled',
|
||||
stateExcluded: 'r-tabs-state-excluded',
|
||||
container: 'r-tabs',
|
||||
ul: 'r-tabs-nav',
|
||||
tab: 'r-tabs-tab',
|
||||
anchor: 'r-tabs-anchor',
|
||||
panel: 'r-tabs-panel',
|
||||
accordionTitle: 'r-tabs-accordion-title'
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Responsive Tabs
|
||||
* @constructor
|
||||
* @param {object} element - The HTML element the validator should be bound to
|
||||
* @param {object} options - An option map
|
||||
*/
|
||||
function ResponsiveTabs(element, options) {
|
||||
this.element = element; // Selected DOM element
|
||||
this.$element = $(element); // Selected jQuery element
|
||||
|
||||
this.tabs = []; // Create tabs array
|
||||
this.state = ''; // Define the plugin state (tabs/accordion)
|
||||
this.rotateInterval = 0; // Define rotate interval
|
||||
this.$queue = $({});
|
||||
|
||||
// Extend the defaults with the passed options
|
||||
this.options = $.extend( {}, defaults, options);
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This function initializes the tab plugin
|
||||
*/
|
||||
ResponsiveTabs.prototype.init = function () {
|
||||
var _this = this;
|
||||
|
||||
// Load all the elements
|
||||
this.tabs = this._loadElements();
|
||||
this._loadClasses();
|
||||
this._loadEvents();
|
||||
|
||||
// Window resize bind to check state
|
||||
$(window).on('resize', function(e) {
|
||||
_this._setState(e);
|
||||
});
|
||||
|
||||
// Hashchange event
|
||||
$(window).on('hashchange', function(e) {
|
||||
var tabRef = _this._getTabRefBySelector(window.location.hash);
|
||||
var oTab = _this._getTab(tabRef);
|
||||
|
||||
// Check if a tab is found that matches the hash
|
||||
if(tabRef >= 0 && !oTab._ignoreHashChange && !oTab.disabled) {
|
||||
// If so, open the tab and auto close the current one
|
||||
_this._openTab(e, _this._getTab(tabRef), true);
|
||||
}
|
||||
});
|
||||
|
||||
// Start rotate event if rotate option is defined
|
||||
if(this.options.rotate !== false) {
|
||||
this.startRotation();
|
||||
}
|
||||
|
||||
// --------------------
|
||||
// Define plugin events
|
||||
//
|
||||
|
||||
// Activate: this event is called when a tab is selected
|
||||
this.$element.bind('tabs-activate', function(e, oTab) {
|
||||
_this.options.activate.call(this, e, oTab);
|
||||
});
|
||||
// Deactivate: this event is called when a tab is closed
|
||||
this.$element.bind('tabs-deactivate', function(e, oTab) {
|
||||
_this.options.deactivate.call(this, e, oTab);
|
||||
});
|
||||
// Activate State: this event is called when the plugin switches states
|
||||
this.$element.bind('tabs-activate-state', function(e, state) {
|
||||
_this.options.activateState.call(this, e, state);
|
||||
});
|
||||
|
||||
// Load: this event is called when the plugin has been loaded
|
||||
this.$element.bind('tabs-load', function(e) {
|
||||
var startTab;
|
||||
|
||||
_this._setState(e); // Set state
|
||||
|
||||
// Check if the panel should be collaped on load
|
||||
if(_this.options.startCollapsed !== true && !(_this.options.startCollapsed === 'accordion' && _this.state === 'accordion')) {
|
||||
|
||||
startTab = _this._getStartTab();
|
||||
|
||||
// Open the initial tab
|
||||
_this._openTab(e, startTab); // Open first tab
|
||||
|
||||
// Call the callback function
|
||||
_this.options.load.call(this, e, startTab); // Call the load callback
|
||||
}
|
||||
});
|
||||
// Trigger loaded event
|
||||
this.$element.trigger('tabs-load');
|
||||
};
|
||||
|
||||
//
|
||||
// PRIVATE FUNCTIONS
|
||||
//
|
||||
|
||||
/**
|
||||
* This function loads the tab elements and stores them in an array
|
||||
* @returns {Array} Array of tab elements
|
||||
*/
|
||||
ResponsiveTabs.prototype._loadElements = function() {
|
||||
var _this = this;
|
||||
var $ul = this.$element.children('ul');
|
||||
var tabs = [];
|
||||
var id = 0;
|
||||
|
||||
// Add the classes to the basic html elements
|
||||
this.$element.addClass(_this.options.classes.container); // Tab container
|
||||
$ul.addClass(_this.options.classes.ul); // List container
|
||||
|
||||
// Get tab buttons and store their data in an array
|
||||
$('li', $ul).each(function() {
|
||||
var $tab = $(this);
|
||||
var isExcluded = $tab.hasClass(_this.options.classes.stateExcluded);
|
||||
var $anchor, $panel, $accordionTab, $accordionAnchor, panelSelector;
|
||||
|
||||
// Check if the tab should be excluded
|
||||
if(!isExcluded) {
|
||||
|
||||
$anchor = $('a', $tab);
|
||||
panelSelector = $anchor.attr('href');
|
||||
$panel = $(panelSelector);
|
||||
$accordionTab = $(_this.options.accordionTabElement).insertBefore($panel);
|
||||
$accordionAnchor = $('<a></a>').attr('href', panelSelector).html($anchor.html()).appendTo($accordionTab);
|
||||
|
||||
var oTab = {
|
||||
_ignoreHashChange: false,
|
||||
id: id,
|
||||
disabled: ($.inArray(id, _this.options.disabled) !== -1),
|
||||
tab: $(this),
|
||||
anchor: $('a', $tab),
|
||||
panel: $panel,
|
||||
selector: panelSelector,
|
||||
accordionTab: $accordionTab,
|
||||
accordionAnchor: $accordionAnchor,
|
||||
active: false
|
||||
};
|
||||
|
||||
// 1up the ID
|
||||
id++;
|
||||
// Add to tab array
|
||||
tabs.push(oTab);
|
||||
}
|
||||
});
|
||||
return tabs;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* This function adds classes to the tab elements based on the options
|
||||
*/
|
||||
ResponsiveTabs.prototype._loadClasses = function() {
|
||||
for (var i=0; i<this.tabs.length; i++) {
|
||||
this.tabs[i].tab.addClass(this.options.classes.stateDefault).addClass(this.options.classes.tab);
|
||||
this.tabs[i].anchor.addClass(this.options.classes.anchor);
|
||||
this.tabs[i].panel.addClass(this.options.classes.stateDefault).addClass(this.options.classes.panel);
|
||||
this.tabs[i].accordionTab.addClass(this.options.classes.accordionTitle);
|
||||
this.tabs[i].accordionAnchor.addClass(this.options.classes.anchor);
|
||||
if(this.tabs[i].disabled) {
|
||||
this.tabs[i].tab.removeClass(this.options.classes.stateDefault).addClass(this.options.classes.stateDisabled);
|
||||
this.tabs[i].accordionTab.removeClass(this.options.classes.stateDefault).addClass(this.options.classes.stateDisabled);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function adds events to the tab elements
|
||||
*/
|
||||
ResponsiveTabs.prototype._loadEvents = function() {
|
||||
var _this = this;
|
||||
|
||||
// Define activate event on a tab element
|
||||
var fActivate = function(e) {
|
||||
var current = _this._getCurrentTab(); // Fetch current tab
|
||||
var activatedTab = e.data.tab;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
// Make sure this tab isn't disabled
|
||||
if(!activatedTab.disabled) {
|
||||
|
||||
// Check if hash has to be set in the URL location
|
||||
if(_this.options.setHash) {
|
||||
// Set the hash using the history api if available to tackle Chromes repaint bug on hash change
|
||||
if(history.pushState) {
|
||||
history.pushState(null, null, activatedTab.selector);
|
||||
} else {
|
||||
// Otherwise fallback to the hash update for sites that don't support the history api
|
||||
window.location.hash = activatedTab.selector;
|
||||
}
|
||||
}
|
||||
|
||||
e.data.tab._ignoreHashChange = true;
|
||||
|
||||
// Check if the activated tab isnt the current one or if its collapsible. If not, do nothing
|
||||
if(current !== activatedTab || _this._isCollapisble()) {
|
||||
// The activated tab is either another tab of the current one. If it's the current tab it is collapsible
|
||||
// Either way, the current tab can be closed
|
||||
_this._closeTab(e, current);
|
||||
|
||||
// Check if the activated tab isnt the current one or if it isnt collapsible
|
||||
if(current !== activatedTab || !_this._isCollapisble()) {
|
||||
_this._openTab(e, activatedTab, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Loop tabs
|
||||
for (var i=0; i<this.tabs.length; i++) {
|
||||
// Add activate function to the tab and accordion selection element
|
||||
this.tabs[i].anchor.on(_this.options.event, {tab: _this.tabs[i]}, fActivate);
|
||||
this.tabs[i].accordionAnchor.on(_this.options.event, {tab: _this.tabs[i]}, fActivate);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function gets the tab that should be opened at start
|
||||
* @returns {Object} Tab object
|
||||
*/
|
||||
ResponsiveTabs.prototype._getStartTab = function() {
|
||||
var tabRef = this._getTabRefBySelector(window.location.hash);
|
||||
var startTab;
|
||||
|
||||
// Check if the page has a hash set that is linked to a tab
|
||||
if(tabRef >= 0 && !this._getTab(tabRef).disabled) {
|
||||
// If so, set the current tab to the linked tab
|
||||
startTab = this._getTab(tabRef);
|
||||
} else if(this.options.active > 0 && !this._getTab(this.options.active).disabled) {
|
||||
startTab = this._getTab(this.options.active);
|
||||
} else {
|
||||
// If not, just get the first one
|
||||
startTab = this._getTab(0);
|
||||
}
|
||||
|
||||
return startTab;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function sets the current state of the plugin
|
||||
* @param {Event} e - The event that triggers the state change
|
||||
*/
|
||||
ResponsiveTabs.prototype._setState = function(e) {
|
||||
var $ul = $('ul', this.$element);
|
||||
var oldState = this.state;
|
||||
var startCollapsedIsState = (typeof this.options.startCollapsed === 'string');
|
||||
var startTab;
|
||||
|
||||
// The state is based on the visibility of the tabs list
|
||||
if($ul.is(':visible')){
|
||||
// Tab list is visible, so the state is 'tabs'
|
||||
this.state = 'tabs';
|
||||
} else {
|
||||
// Tab list is invisible, so the state is 'accordion'
|
||||
this.state = 'accordion';
|
||||
}
|
||||
|
||||
// If the new state is different from the old state
|
||||
if(this.state !== oldState) {
|
||||
// If so, the state activate trigger must be called
|
||||
this.$element.trigger('tabs-activate-state', {oldState: oldState, newState: this.state});
|
||||
|
||||
// Check if the state switch should open a tab
|
||||
if(oldState && startCollapsedIsState && this.options.startCollapsed !== this.state && this._getCurrentTab() === undefined) {
|
||||
// Get initial tab
|
||||
startTab = this._getStartTab(e);
|
||||
// Open the initial tab
|
||||
this._openTab(e, startTab); // Open first tab
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function opens a tab
|
||||
* @param {Event} e - The event that triggers the tab opening
|
||||
* @param {Object} oTab - The tab object that should be opened
|
||||
* @param {Boolean} closeCurrent - Defines if the current tab should be closed
|
||||
* @param {Boolean} stopRotation - Defines if the tab rotation loop should be stopped
|
||||
*/
|
||||
ResponsiveTabs.prototype._openTab = function(e, oTab, closeCurrent, stopRotation) {
|
||||
var _this = this;
|
||||
var scrollOffset;
|
||||
|
||||
// Check if the current tab has to be closed
|
||||
if(closeCurrent) {
|
||||
this._closeTab(e, this._getCurrentTab());
|
||||
}
|
||||
|
||||
// Check if the rotation has to be stopped when activated
|
||||
if(stopRotation && this.rotateInterval > 0) {
|
||||
this.stopRotation();
|
||||
}
|
||||
|
||||
// Set this tab to active
|
||||
oTab.active = true;
|
||||
// Set active classes to the tab button and accordion tab button
|
||||
oTab.tab.removeClass(_this.options.classes.stateDefault).addClass(_this.options.classes.stateActive);
|
||||
oTab.accordionTab.removeClass(_this.options.classes.stateDefault).addClass(_this.options.classes.stateActive);
|
||||
|
||||
// Run panel transiton
|
||||
_this._doTransition(oTab.panel, _this.options.animation, 'open', function() {
|
||||
// When finished, set active class to the panel
|
||||
oTab.panel.removeClass(_this.options.classes.stateDefault).addClass(_this.options.classes.stateActive);
|
||||
|
||||
// And if enabled and state is accordion, scroll to the accordion tab
|
||||
if(_this.getState() === 'accordion' && _this.options.scrollToAccordion && (!_this._isInView(oTab.accordionTab) || _this.options.animation !== 'default')) {
|
||||
|
||||
// Add offset element's height to scroll position
|
||||
scrollOffset = oTab.accordionTab.offset().top - _this.options.scrollToAccordionOffset;
|
||||
|
||||
// Check if the animation option is enabled, and if the duration isn't 0
|
||||
if(_this.options.animation !== 'default' && _this.options.duration > 0) {
|
||||
// If so, set scrollTop with animate and use the 'animation' duration
|
||||
$('html, body').animate({
|
||||
scrollTop: scrollOffset
|
||||
}, _this.options.duration);
|
||||
} else {
|
||||
// If not, just set scrollTop
|
||||
$('html, body').scrollTop(scrollOffset);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.$element.trigger('tabs-activate', oTab);
|
||||
};
|
||||
|
||||
/**
|
||||
* This function closes a tab
|
||||
* @param {Event} e - The event that is triggered when a tab is closed
|
||||
* @param {Object} oTab - The tab object that should be closed
|
||||
*/
|
||||
ResponsiveTabs.prototype._closeTab = function(e, oTab) {
|
||||
var _this = this;
|
||||
var doQueueOnState = typeof _this.options.animationQueue === 'string';
|
||||
var doQueue;
|
||||
|
||||
if(oTab !== undefined) {
|
||||
if(doQueueOnState && _this.getState() === _this.options.animationQueue) {
|
||||
doQueue = true;
|
||||
} else if(doQueueOnState) {
|
||||
doQueue = false;
|
||||
} else {
|
||||
doQueue = _this.options.animationQueue;
|
||||
}
|
||||
|
||||
// Deactivate tab
|
||||
oTab.active = false;
|
||||
// Set default class to the tab button
|
||||
oTab.tab.removeClass(_this.options.classes.stateActive).addClass(_this.options.classes.stateDefault);
|
||||
|
||||
// Run panel transition
|
||||
_this._doTransition(oTab.panel, _this.options.animation, 'close', function() {
|
||||
// Set default class to the accordion tab button and tab panel
|
||||
oTab.accordionTab.removeClass(_this.options.classes.stateActive).addClass(_this.options.classes.stateDefault);
|
||||
oTab.panel.removeClass(_this.options.classes.stateActive).addClass(_this.options.classes.stateDefault);
|
||||
}, !doQueue);
|
||||
|
||||
this.$element.trigger('tabs-deactivate', oTab);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function runs an effect on a panel
|
||||
* @param {Element} panel - The HTML element of the tab panel
|
||||
* @param {String} method - The transition method reference
|
||||
* @param {String} state - The state (open/closed) that the panel should transition to
|
||||
* @param {Function} callback - The callback function that is called after the transition
|
||||
* @param {Boolean} dequeue - Defines if the event queue should be dequeued after the transition
|
||||
*/
|
||||
ResponsiveTabs.prototype._doTransition = function(panel, method, state, callback, dequeue) {
|
||||
var effect;
|
||||
var _this = this;
|
||||
|
||||
// Get effect based on method
|
||||
switch(method) {
|
||||
case 'slide':
|
||||
effect = (state === 'open') ? 'slideDown' : 'slideUp';
|
||||
break;
|
||||
case 'fade':
|
||||
effect = (state === 'open') ? 'fadeIn' : 'fadeOut';
|
||||
break;
|
||||
default:
|
||||
effect = (state === 'open') ? 'show' : 'hide';
|
||||
// When default is used, set the duration to 0
|
||||
_this.options.duration = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
// Add the transition to a custom queue
|
||||
this.$queue.queue('responsive-tabs',function(next){
|
||||
// Run the transition on the panel
|
||||
panel[effect]({
|
||||
duration: _this.options.duration,
|
||||
complete: function() {
|
||||
// Call the callback function
|
||||
callback.call(panel, method, state);
|
||||
// Run the next function in the queue
|
||||
next();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// When the panel is openend, dequeue everything so the animation starts
|
||||
if(state === 'open' || dequeue) {
|
||||
this.$queue.dequeue('responsive-tabs');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns the collapsibility of the tab in this state
|
||||
* @returns {Boolean} The collapsibility of the tab
|
||||
*/
|
||||
ResponsiveTabs.prototype._isCollapisble = function() {
|
||||
return (typeof this.options.collapsible === 'boolean' && this.options.collapsible) || (typeof this.options.collapsible === 'string' && this.options.collapsible === this.getState());
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns a tab by numeric reference
|
||||
* @param {Integer} numRef - Numeric tab reference
|
||||
* @returns {Object} Tab object
|
||||
*/
|
||||
ResponsiveTabs.prototype._getTab = function(numRef) {
|
||||
return this.tabs[numRef];
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns the numeric tab reference based on a hash selector
|
||||
* @param {String} selector - Hash selector
|
||||
* @returns {Integer} Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype._getTabRefBySelector = function(selector) {
|
||||
// Loop all tabs
|
||||
for (var i=0; i<this.tabs.length; i++) {
|
||||
// Check if the hash selector is equal to the tab selector
|
||||
if(this.tabs[i].selector === selector) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
// If none is found return a negative index
|
||||
return -1;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns the current tab element
|
||||
* @returns {Object} Current tab element
|
||||
*/
|
||||
ResponsiveTabs.prototype._getCurrentTab = function() {
|
||||
return this._getTab(this._getCurrentTabRef());
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns the next tab's numeric reference
|
||||
* @param {Integer} currentTabRef - Current numeric tab reference
|
||||
* @returns {Integer} Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype._getNextTabRef = function(currentTabRef) {
|
||||
var tabRef = (currentTabRef || this._getCurrentTabRef());
|
||||
var nextTabRef = (tabRef === this.tabs.length - 1) ? 0 : tabRef + 1;
|
||||
return (this._getTab(nextTabRef).disabled) ? this._getNextTabRef(nextTabRef) : nextTabRef;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns the previous tab's numeric reference
|
||||
* @returns {Integer} Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype._getPreviousTabRef = function() {
|
||||
return (this._getCurrentTabRef() === 0) ? this.tabs.length - 1 : this._getCurrentTabRef() - 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function returns the current tab's numeric reference
|
||||
* @returns {Integer} Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype._getCurrentTabRef = function() {
|
||||
// Loop all tabs
|
||||
for (var i=0; i<this.tabs.length; i++) {
|
||||
// If this tab is active, return it
|
||||
if(this.tabs[i].active) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
// No tabs have been found, return negative index
|
||||
return -1;
|
||||
};
|
||||
|
||||
//
|
||||
// HELPER FUNCTIONS
|
||||
//
|
||||
|
||||
ResponsiveTabs.prototype._isInView = function($element) {
|
||||
var docViewTop = $(window).scrollTop(),
|
||||
docViewBottom = docViewTop + $(window).height(),
|
||||
elemTop = $element.offset().top,
|
||||
elemBottom = elemTop + $element.height();
|
||||
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
|
||||
};
|
||||
|
||||
//
|
||||
// PUBLIC FUNCTIONS
|
||||
//
|
||||
|
||||
/**
|
||||
* This function activates a tab
|
||||
* @param {Integer} tabRef - Numeric tab reference
|
||||
* @param {Boolean} stopRotation - Defines if the tab rotation should stop after activation
|
||||
*/
|
||||
ResponsiveTabs.prototype.activate = function(tabRef, stopRotation) {
|
||||
var e = jQuery.Event('tabs-activate');
|
||||
var oTab = this._getTab(tabRef);
|
||||
if(!oTab.disabled) {
|
||||
this._openTab(e, oTab, true, stopRotation || true);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function deactivates a tab
|
||||
* @param {Integer} tabRef - Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype.deactivate = function(tabRef) {
|
||||
var e = jQuery.Event('tabs-dectivate');
|
||||
var oTab = this._getTab(tabRef);
|
||||
if(!oTab.disabled) {
|
||||
this._closeTab(e, oTab);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function enables a tab
|
||||
* @param {Integer} tabRef - Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype.enable = function(tabRef) {
|
||||
var oTab = this._getTab(tabRef);
|
||||
if(oTab){
|
||||
oTab.disabled = false;
|
||||
oTab.tab.addClass(this.options.classes.stateDefault).removeClass(this.options.classes.stateDisabled);
|
||||
oTab.accordionTab.addClass(this.options.classes.stateDefault).removeClass(this.options.classes.stateDisabled);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function disable a tab
|
||||
* @param {Integer} tabRef - Numeric tab reference
|
||||
*/
|
||||
ResponsiveTabs.prototype.disable = function(tabRef) {
|
||||
var oTab = this._getTab(tabRef);
|
||||
if(oTab){
|
||||
oTab.disabled = true;
|
||||
oTab.tab.removeClass(this.options.classes.stateDefault).addClass(this.options.classes.stateDisabled);
|
||||
oTab.accordionTab.removeClass(this.options.classes.stateDefault).addClass(this.options.classes.stateDisabled);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function gets the current state of the plugin
|
||||
* @returns {String} State of the plugin
|
||||
*/
|
||||
ResponsiveTabs.prototype.getState = function() {
|
||||
return this.state;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function starts the rotation of the tabs
|
||||
* @param {Integer} speed - The speed of the rotation
|
||||
*/
|
||||
ResponsiveTabs.prototype.startRotation = function(speed) {
|
||||
var _this = this;
|
||||
// Make sure not all tabs are disabled
|
||||
if(this.tabs.length > this.options.disabled.length) {
|
||||
this.rotateInterval = setInterval(function(){
|
||||
var e = jQuery.Event('rotate');
|
||||
_this._openTab(e, _this._getTab(_this._getNextTabRef()), true);
|
||||
}, speed || (($.isNumeric(_this.options.rotate)) ? _this.options.rotate : 4000) );
|
||||
} else {
|
||||
throw new Error("Rotation is not possible if all tabs are disabled");
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This function stops the rotation of the tabs
|
||||
*/
|
||||
ResponsiveTabs.prototype.stopRotation = function() {
|
||||
window.clearInterval(this.rotateInterval);
|
||||
this.rotateInterval = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function can be used to get/set options
|
||||
* @return {any} Option value
|
||||
*/
|
||||
ResponsiveTabs.prototype.option = function(key, value) {
|
||||
if(value) {
|
||||
this.options[key] = value;
|
||||
}
|
||||
return this.options[key];
|
||||
};
|
||||
|
||||
/** jQuery wrapper */
|
||||
$.fn.responsiveTabs = function ( options ) {
|
||||
var args = arguments;
|
||||
if (options === undefined || typeof options === 'object') {
|
||||
return this.each(function () {
|
||||
if (!$.data(this, 'responsivetabs')) {
|
||||
$.data(this, 'responsivetabs', new ResponsiveTabs( this, options ));
|
||||
}
|
||||
});
|
||||
} else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {
|
||||
return this.each(function () {
|
||||
var instance = $.data(this, 'responsivetabs');
|
||||
|
||||
if (instance instanceof ResponsiveTabs && typeof instance[options] === 'function') {
|
||||
instance[options].apply( instance, Array.prototype.slice.call( args, 1 ) );
|
||||
}
|
||||
|
||||
// Allow instances to be destroyed via the 'destroy' method
|
||||
if (options === 'destroy') {
|
||||
// TODO: destroy instance classes, etc
|
||||
$.data(this, 'responsivetabs', null);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
}(jQuery, window));
|
||||
6
Host/wwwroot/http/js/jquery.slicknav.min.js
vendored
Normal file
1512
Host/wwwroot/http/js/owl.carousel.js
Normal file
10
Host/wwwroot/http/js/superfish.min.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* jQuery Superfish Menu Plugin - v1.7.7
|
||||
* Copyright (c) 2015
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
;(function(e,s){"use strict";var o=function(){var o={bcClass:"sf-breadcrumb",menuClass:"sf-js-enabled",anchorClass:"sf-with-ul",menuArrowClass:"sf-arrows"},n=function(){var s=/^(?![\w\W]*Windows Phone)[\w\W]*(iPhone|iPad|iPod)/i.test(navigator.userAgent);return s&&e("html").css("cursor","pointer").on("click",e.noop),s}(),t=function(){var e=document.documentElement.style;return"behavior"in e&&"fill"in e&&/iemobile/i.test(navigator.userAgent)}(),i=function(){return!!s.PointerEvent}(),r=function(e,s){var n=o.menuClass;s.cssArrows&&(n+=" "+o.menuArrowClass),e.toggleClass(n)},a=function(s,n){return s.find("li."+n.pathClass).slice(0,n.pathLevels).addClass(n.hoverClass+" "+o.bcClass).filter(function(){return e(this).children(n.popUpSelector).hide().show().length}).removeClass(n.pathClass)},l=function(e){e.children("a").toggleClass(o.anchorClass)},h=function(e){var s=e.css("ms-touch-action"),o=e.css("touch-action");o=o||s,o="pan-y"===o?"auto":"pan-y",e.css({"ms-touch-action":o,"touch-action":o})},u=function(s,o){var r="li:has("+o.popUpSelector+")";e.fn.hoverIntent&&!o.disableHI?s.hoverIntent(c,f,r):s.on("mouseenter.superfish",r,c).on("mouseleave.superfish",r,f);var a="MSPointerDown.superfish";i&&(a="pointerdown.superfish"),n||(a+=" touchend.superfish"),t&&(a+=" mousedown.superfish"),s.on("focusin.superfish","li",c).on("focusout.superfish","li",f).on(a,"a",o,p)},p=function(s){var o=e(this),n=m(o),t=o.siblings(s.data.popUpSelector);return n.onHandleTouch.call(t)===!1?this:(t.length>0&&t.is(":hidden")&&(o.one("click.superfish",!1),"MSPointerDown"===s.type||"pointerdown"===s.type?o.trigger("focus"):e.proxy(c,o.parent("li"))()),void 0)},c=function(){var s=e(this),o=m(s);clearTimeout(o.sfTimer),s.siblings().superfish("hide").end().superfish("show")},f=function(){var s=e(this),o=m(s);n?e.proxy(d,s,o)():(clearTimeout(o.sfTimer),o.sfTimer=setTimeout(e.proxy(d,s,o),o.delay))},d=function(s){s.retainPath=e.inArray(this[0],s.$path)>-1,this.superfish("hide"),this.parents("."+s.hoverClass).length||(s.onIdle.call(v(this)),s.$path.length&&e.proxy(c,s.$path)())},v=function(e){return e.closest("."+o.menuClass)},m=function(e){return v(e).data("sf-options")};return{hide:function(s){if(this.length){var o=this,n=m(o);if(!n)return this;var t=n.retainPath===!0?n.$path:"",i=o.find("li."+n.hoverClass).add(this).not(t).removeClass(n.hoverClass).children(n.popUpSelector),r=n.speedOut;if(s&&(i.show(),r=0),n.retainPath=!1,n.onBeforeHide.call(i)===!1)return this;i.stop(!0,!0).animate(n.animationOut,r,function(){var s=e(this);n.onHide.call(s)})}return this},show:function(){var e=m(this);if(!e)return this;var s=this.addClass(e.hoverClass),o=s.children(e.popUpSelector);return e.onBeforeShow.call(o)===!1?this:(o.stop(!0,!0).animate(e.animation,e.speed,function(){e.onShow.call(o)}),this)},destroy:function(){return this.each(function(){var s,n=e(this),t=n.data("sf-options");return t?(s=n.find(t.popUpSelector).parent("li"),clearTimeout(t.sfTimer),r(n,t),l(s),h(n),n.off(".superfish").off(".hoverIntent"),s.children(t.popUpSelector).attr("style",function(e,s){return s.replace(/display[^;]+;?/g,"")}),t.$path.removeClass(t.hoverClass+" "+o.bcClass).addClass(t.pathClass),n.find("."+t.hoverClass).removeClass(t.hoverClass),t.onDestroy.call(n),n.removeData("sf-options"),void 0):!1})},init:function(s){return this.each(function(){var n=e(this);if(n.data("sf-options"))return!1;var t=e.extend({},e.fn.superfish.defaults,s),i=n.find(t.popUpSelector).parent("li");t.$path=a(n,t),n.data("sf-options",t),r(n,t),l(i),h(n),u(n,t),i.not("."+o.bcClass).superfish("hide",!0),t.onInit.call(this)})}}}();e.fn.superfish=function(s){return o[s]?o[s].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof s&&s?e.error("Method "+s+" does not exist on jQuery.fn.superfish"):o.init.apply(this,arguments)},e.fn.superfish.defaults={popUpSelector:"ul,.sf-mega",hoverClass:"sfHover",pathClass:"overrideThisToUse",pathLevels:1,delay:800,animation:{opacity:"show"},animationOut:{opacity:"hide"},speed:"normal",speedOut:"fast",cssArrows:!0,disableHI:!1,onInit:e.noop,onBeforeShow:e.noop,onShow:e.noop,onBeforeHide:e.noop,onHide:e.noop,onIdle:e.noop,onDestroy:e.noop,onHandleTouch:e.noop}})(jQuery,window);
|
||||