anyproxy/web/index.html
2014-08-27 17:42:42 +08:00

345 lines
7.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<title>Anyproxy</title>
<link rel="stylesheet" href="/css/uikit.gradient.min.css" />
</head>
<body>
<div class="topHead">
<h1>Anyproxy</h1>
</div>
<div class="mainTableWrapper J_mainTable">
<table class="uk-table uk-table-condensed uk-table-hover">
<thead>
<tr>
<th class="col_id">id</th>
<th class="col_method">method</th>
<th class="col_code">code</th>
<th class="col_host">host</th>
<th class="col_path">path</th>
<th class="col_mime">mime type</th>
</tr>
</thead>
<tbody class="J_tableBody"></tbody>
</table>
</div>
<div class="recordDetailOverlay J_recordDetailOverlay" style="display:none">
<span class="escBtn J_escBtn">Close (ESC)</span>
<div class="J_recordDetailOverlayContent"></div>
</div>
<script type="text/template" id="main_table_row">
<td class="data_id"><%= _id %></td>
<td><%= method %></td>
<td class="http_status http_status_<%= statusCode %>"><%= statusCode %></td>
<td title="<%= host %>"><%= host %></td>
<td title="<%= path %>"><%= path %></td>
<td><%= mime %></td>
</script>
<script type="text/template" id="detail_tpl">
<section class="req">
<h4 class="subTitle">request</h4>
<div class="detail">
<ul class="uk-list">
<li><%= method %> <%= host %></li>
<li><span title="<%= path %>"><%= path %></span></li>
<% _.each(reqHeader, function(v,k) { %> <li><strong><%= k %></strong> : <%= v %></li><% }); %>
</ul>
</div>
</section>
<% if(statusCode) { %>
<section class="resHeader">
<h4 class="subTitle">response header</h4>
<div class="detail">
<ul class="uk-list">
<li>HTTP/1.1 <span class="http_status http_status_<%= statusCode %>"><%= statusCode %></span></li>
<% _.each(resHeader, function(v,k) { %> <li><strong><%= k %></strong> : <%= v %></li><% }); %>
</ul>
</div>
</section>
<section class="resBody">
<h4 class="subTitle">response body</h4>
<div class="detail">
<form class="uk-form">
<textarea class="J_responseBody">loading...</textarea>
</form>
</div>
</section>
<% } %>
</script>
<script charset="utf-8" id="seajsnode"src="http://static.alipayobjects.com/seajs/??seajs/2.2.0/sea.js,seajs-combo/1.0.1/seajs-combo.js,seajs-style/1.0.2/seajs-style.js"></script>
<script>
seajs.config({
base: 'http://static.alipayobjects.com/',
alias: {
'$' : 'jquery/jquery/1.7.2/jquery',
'Backbone' : 'gallery/backbone/1.1.2/backbone.js',
'Underscore': 'gallery/underscore/1.6.0/underscore.js'
}
});
seajs.use(['$','Underscore' ,'Backbone'], function($, _, Backbone) {
Backbone.$ = $;
$(function(){
//record detail
//backbone太麻烦了这里手写拉倒..
var DetailView = function(){
var self = this,
$detailEl = $(".J_recordDetailOverlay");
$(document).on("keyup",function(e){
if(e.keyCode == 27){ //ESC
self.hideDetail();
}
});
$detailEl.on("click",function(e){
e.stopPropagation();
});
$(".J_escBtn",$detailEl).on("click",function(e){
self.hideDetail();
});
self.showDetail = function(data){
var tpl = _.template($("#detail_tpl").html() , data);
$(".J_recordDetailOverlayContent",$detailEl).html(tpl);
$detailEl.show();
if(data.statusCode){ //if finished
$.ajax({
url:"/body?id=" + data._id,
headers:{
anyproxy_web_req : true
},
type : "GET",
success:function(data){
$(".J_responseBody", $detailEl).html(data);
}
});
}
}
self.hideDetail = function(){
$detailEl.hide();
}
};
var detailPanel = new DetailView();
//record list
var RecordModel = Backbone.Model.extend({});
var RecordList = Backbone.Collection.extend({
initialize:function(){
var self = this;
self.on("add",function(data){
new RecordRowView({
model:data,
detailPanel : detailPanel
});
});
}
});
var RecordRowView = Backbone.View.extend({
tagName : "tr",
className:function(){
return this.model.toJSON().id % 2 ? "row_odd" : "row_even";
},
tpl : $("#main_table_row").html(),
initialize:function(data){
var self = this;
self.model.on("change",self.render,self);
self.addNewRecord();
self.detailPanel = data.detailPanel;
},
events: {
click: function(){
var self = this;
var detailData = self.model.toJSON();
self.detailPanel.showDetail(detailData);
}
},
render: function(){
var data = this.model.toJSON();
if(!data.statusCode){
data.statusCode = "-";
}
if(!data.mime){
data.mime = "-";
}
var html = _.template(this.tpl, data);
this.$el.attr("recordId",data.id).empty().html(html);
return this;
},
addNewRecord:function(){
$(".J_tableBody").prepend(this.render().$el);
}
});
var recList = new RecordList();
var dataSocket = new WebSocket("ws://127.0.0.1:8003");
dataSocket.onmessage = function(event){
var data = JSON.parse(event.data);
var previous;
if(previous = recList.get(data.id)){
previous.set(data);
}else{
recList.add(new RecordModel(data),{merge: true});
}
}
dataSocket.onerror = function(e){
alert("socket err, please refresh");
console.log(e);
}
});
});
</script>
<style type="text/css">
.topHead{
background: #000;
color: rgb(204,204,204);
height: 42px;
position: relative;
}
.mainTableWrapper{
margin-top: 0;
}
.mainTableWrapper table{
table-layout: fixed;
}
.mainTableWrapper td,
.mainTableWrapper th{
padding: 4px 12px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.mainTableWrapper .col_id{
width: 25px;
padding-right: 20px;
}
.mainTableWrapper .col_code{
width: 40px;
}
.mainTableWrapper .col_method{
width: 60px;
}
.mainTableWrapper .col_host{
width: 180px;
}
.mainTableWrapper tr.row_odd{
background: #f5f5f5;
}
.mainTableWrapper tr.row_even{
background: #FFFFFF;
}
.uk-table-hover tbody tr:hover{
cursor: pointer;
background: #CCC;
}
.resHeader{
width: 400px;
}
.resBody textarea{
width: 400px;
height: 280px;
}
.subTitle{
padding-left: 6px;
border-left: 3px solid #1FA2D6;
font-size: 16px;
line-height: 16px;
}
.detail{
padding-left: 12px;
}
.recordDetailOverlay{
width: 61.8%;
height: 100%;
position: fixed;
right: 0;
background: #FFF;
border-left: 1px solid #CCC;
top: 0;
padding: 10px 10px 20px 10px;
overflow-y:scroll;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.recordDetailOverlay .escBtn{
position: absolute;
right: 10px;
top: 8px;
color: #777;
cursor: pointer;
text-decoration: underline;
}
.recordDetailOverlay li{
white-space: nowrap;
word-wrap: break-word;
}
.data_id{
color: #777;
}
.http_status{
font-weight: 700;
}
.http_status_200{
color: #408E2F;
}
.http_status_404,
.http_status_500,
.http_status_501,
.http_status_502,
.http_status_503,
.http_status_504
{
color: #910A0A;
}
</style>
</body>
</html>