mirror of
https://github.com/thinkjs/thinkjs.git
synced 2026-01-25 14:42:47 +00:00
354 lines
412 KiB
HTML
354 lines
412 KiB
HTML
<!DOCTYPE html><html><head><title>Coverage</title><script>
|
||
|
||
headings = [];
|
||
|
||
onload = function(){
|
||
headings = document.querySelectorAll('h2');
|
||
};
|
||
|
||
onscroll = function(e){
|
||
var heading = find(window.scrollY);
|
||
if (!heading) return;
|
||
var links = document.querySelectorAll('#menu a')
|
||
, link;
|
||
|
||
for (var i = 0, len = links.length; i < len; ++i) {
|
||
link = links[i];
|
||
link.className = link.getAttribute('href') == '#' + heading.id
|
||
? 'active'
|
||
: '';
|
||
}
|
||
};
|
||
|
||
function find(y) {
|
||
var i = headings.length
|
||
, heading;
|
||
|
||
while (i--) {
|
||
heading = headings[i];
|
||
if (y >= heading.offsetTop) {
|
||
return heading;
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
<style>
|
||
|
||
body {
|
||
font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||
margin: 0;
|
||
color: #2C2C2C;
|
||
border-top: 2px solid #ddd;
|
||
}
|
||
|
||
#coverage {
|
||
padding: 60px;
|
||
}
|
||
|
||
h1 a {
|
||
color: inherit;
|
||
font-weight: inherit;
|
||
}
|
||
|
||
h1 a:hover {
|
||
text-decoration: none;
|
||
}
|
||
|
||
.onload h1 {
|
||
opacity: 1;
|
||
}
|
||
|
||
h2 {
|
||
width: 80%;
|
||
margin-top: 80px;
|
||
margin-bottom: 0;
|
||
font-weight: 100;
|
||
letter-spacing: 1px;
|
||
border-bottom: 1px solid #eee;
|
||
}
|
||
|
||
a {
|
||
color: #8A6343;
|
||
font-weight: bold;
|
||
text-decoration: none;
|
||
}
|
||
|
||
a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
ul {
|
||
margin-top: 20px;
|
||
padding: 0 15px;
|
||
width: 100%;
|
||
}
|
||
|
||
ul li {
|
||
float: left;
|
||
width: 40%;
|
||
margin-top: 5px;
|
||
margin-right: 60px;
|
||
list-style: none;
|
||
border-bottom: 1px solid #eee;
|
||
padding: 5px 0;
|
||
font-size: 12px;
|
||
}
|
||
|
||
ul::after {
|
||
content: '.';
|
||
height: 0;
|
||
display: block;
|
||
visibility: hidden;
|
||
clear: both;
|
||
}
|
||
|
||
code {
|
||
font: 12px monaco, monospace;
|
||
}
|
||
|
||
pre {
|
||
margin: 30px;
|
||
padding: 30px;
|
||
border: 1px solid #eee;
|
||
border-bottom-color: #ddd;
|
||
-webkit-border-radius: 2px;
|
||
-moz-border-radius: 2px;
|
||
border-radius: 2px;
|
||
-webkit-box-shadow: inset 0 0 10px #eee;
|
||
-moz-box-shadow: inset 0 0 10px #eee;
|
||
box-shadow: inset 0 0 10px #eee;
|
||
overflow-x: auto;
|
||
}
|
||
|
||
img {
|
||
margin: 30px;
|
||
padding: 1px;
|
||
-webkit-border-radius: 3px;
|
||
-moz-border-radius: 3px;
|
||
border-radius: 3px;
|
||
-webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
|
||
-moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
|
||
box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
|
||
max-width: 100%;
|
||
}
|
||
|
||
footer {
|
||
background: #eee;
|
||
width: 100%;
|
||
padding: 50px 0;
|
||
text-align: right;
|
||
border-top: 1px solid #ddd;
|
||
}
|
||
|
||
footer span {
|
||
display: block;
|
||
margin-right: 30px;
|
||
color: #888;
|
||
font-size: 12px;
|
||
}
|
||
|
||
#menu {
|
||
position: fixed;
|
||
font-size: 12px;
|
||
overflow-y: auto;
|
||
top: 0;
|
||
right: 0;
|
||
margin: 0;
|
||
height: 100%;
|
||
padding: 15px 0;
|
||
text-align: right;
|
||
border-left: 1px solid #eee;
|
||
-moz-box-shadow: 0 0 2px #888
|
||
, inset 5px 0 20px rgba(0,0,0,.5)
|
||
, inset 5px 0 3px rgba(0,0,0,.3);
|
||
-webkit-box-shadow: 0 0 2px #888
|
||
, inset 5px 0 20px rgba(0,0,0,.5)
|
||
, inset 5px 0 3px rgba(0,0,0,.3);
|
||
box-shadow: 0 0 2px #888
|
||
, inset 5px 0 20px rgba(0,0,0,.5)
|
||
, inset 5px 0 3px rgba(0,0,0,.3);
|
||
-webkit-font-smoothing: antialiased;
|
||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABmCAMAAAAOARRQAAABelBMVEUjJSU6OzshIyM5OjoqKy02NjgsLS01NTYjJCUzNTUgISMlJSc0NTUvMDA6PDwlJyg1NjYoKis2NjYrLS02ODkpKyw0NDYrLC04ODovLzA4Ojo0NDUtLy86OjwjIyU4OTosLS82ODgtLS8hIyQvMTEnKCooKSsrKy0qLCwkJSUnKCkrLCwpKiwwMjIxMzMqLC0tLS0pKissLC00NTYwMDIwMTQpKysoKSovMDEtLzA2OTkxMzUrKywvLy8qKyszNTY5OzsqKiw6OjswMDExNDUoKiozNDUvMDIyNDY1Njg2Njk5OTozMzU0NjY4ODkiIyUiIyQ4OTkuMDEmKCowMjQwMTErLS4qKywwMTMhIiMpKiopKy0tLjAkJScxNDQvLzExNDYyNDQmKCk5OTslJig5OjskJSYxMzQrLS8gISIwMTIoKCk1NTUlJSUnJygwMDA4ODgiIiMhISI8PDw6Ojo5OTkpKSojIyQ7OzsyMjIpKSssLCw6Ozw1NjlrfLakAAAg2UlEQVR42jR6i3ea6rYvPgANIAhVXh8WvkQlioUiFlFcBtAmoiRNdzxqu9p0J7vrdK29zuPeex77nnvO/35n1r1ndHRktI0jTOacv/l7lCBK5UqVpOha/YxmWK7BC4TQFKVXrbYsnimqxuuMVlOQ0XltWjUdCwRJ1M+tC1KudOs9q6+da2adUewG0SC0SwELfHtgDds93VEuydEbl3QMWeNoYkR7b/0x1ZRobGI3mLwzAhePqTAwhg6aogjNsGy7/jwQ4rkdqe7CWLxF8k9LfMVFyRS7VJqtkrW8Vt/bkR8FZJao16ipknbC3Yw2lM7laO6HBEOadEZ2tpf65c4v8e3u7FyU6qbiNNyCuzXZ6pawgnwgmrpTT/Q7w2EZmiIJ0dzWDI7mhQ80IfRnMu2kzA5r5r1pIFoia+/d93HRYp1GV8TbrkWoU/+jdI0Ff6yGwTjT1Hn8J+8m1rKpGiYPuNiHnMtNMIv+zpsk84MYTNW1/+DpwXLvckdOCMYowVNPREe0QlM8xRHXXFhcNDzupwsSmb5pH+0t0RP2Qk+QtI7F1Qm6JRC6ZPBtPq/dq/kH+jxtCljn9TIpW6rQIgmSVyj6lPICIw4N/taka41PFUInth0je9+jO6Kt1G4/a7V2LEgG02B0pHVuCZrgltSKMuIl5SyufUv9mYuQi+mFgzbBEtFo2g+Dh4sSTrLNu8JPh00sQydpb00tqXBvqRN7Q7kqzcnIxCGnvZt/WmJacoOEO6Dcn8Qre03pOCSQxbMOXUuDNx9SxuLz4W1I18gvjViQ67zV0rxdWL8Te/TQkuo8STS41DR48W7L6YP2uWIqiUV8rd6Gbf/rnegKZeG8TpAM6afhGze9JAOxbLjsnUXEbrZ9vLYd7MT32cPF5mKKxmjy7huaoD9n62GOxni3iIJwv0IzZAZjdZkUtolCNLVfYZNaquFjGszVVf+J0vrz4CawoKdHnOzb0NMH7CDBOybfYNJ4rfeMyFNjkFYVTzMFs87rnPGXLUOeNKRVc0LnU7/UIgelzsy3CMuth0YfvnY0wsD3vODUL3eJcKqHQpm8yM3XZQWJxO6Un9iYloyyLpOwN2obHy6W6gbpcb44XmyC+mg+itAcaprGcrwZCqMj/GmtKn0zPvpTz/Cv1dw21XwP3cRupg3H3MF/S71eTKj1YrdwKdc2Mw0fRmb2sFf8lW3aU6JbIZSEPqvXvjM7G/aApyXlXeqKfMq0g/Su3rUGJPSPrtGElgknrZM3xUXqsAP6zMCNVn5u8aJnSNpJv2uru7t2jfRziW2+GuhqfldUNbPk71olwo+46ePUo1U3WKk/e5YK07F/wGRgcpODmQnIlVeHCWBE4puBi2jq28UKpqiN1/4UOrGz59TNYrrQHtd+11sG40BGD+pXdelNqGOg4NXe8W4eacJV/NS9/2Umtym6WQqveqR9xdCMElpxnbkalM4Vf9uaEcWZaKdyibEIjWKxJZPN95niCL3GiaXyssIrHxoLkqkzLCXULN46/f2h3tQJgyip+Tk9EAjJ9aJshq7t8X45aowSKspMSvPf7r9R8yxNptIaHS5ozuEm6luPDApugyNP8OaqiQ4BjaequXA54SLC83eHIY2r+CZp4409Xqw8Aa2oI7XkCrQi+in0w5AqF/kLNrcUz+qkl/lAobY1jSnx5OJNhyXIz3qfNFlXc0TKaglNwdWkWYt9QQ1Kr6W8zue21iNrdJk+N5oCr2O9nEtWKC7IS5J/zdDEYrmnAYfg6agCy+qcgz7ZofeDc4PbUWSvkshWuAc7OjiUyLkj+RAtdlwXJcjxdpkTTHDhK8lBCi8+JtvDVL1W6elmOM++YS0LuSlaP1oUvAeiW3cFnvTr8EbTz1tsSMYdGeZe40sRWu5uAfj7q+ZoKv2FNQ0p5XY1lmlcigHZqTPpabufEVrNuNPi165w3uCVQJHyJqmSJ7ZHnguqwtCmwViIJijj04ba2JNYtB+yORf5gg1/9t9iw4vUpeqiunSAbf+IBdj/b+iG2qrHvuNP0Vd/+ThVZT/lrvHYjjgDbbyxaqgHNM2uhxa1GW3UedZYhMMwM4mQhltouK+IV4NdbIQNM+8Yv311RZk9kT4tiYR4LkyFcuPpdcjuhUuFqBAWRZa11lcZ3gEBlXywsNhrt+plISZP5DlsV9l4EgY6J3yZPTUcMrgaWAT3oI79eSbGEbcJpr6BD8kyDiVt+G0/hXosQN4NFXKlfWIfsIs0BHODVok1/IGnKFHJYIquh8Xo+2+bkQNTGgWmN/fZ0Y33LSj6lr1GyV7mWIKg7ZTRZPGuhF/zjRNcQ1UPtSYgnWQxSs0yrVhwNDcdGMNSNe2JT3WuzbAM3HykyAajS3Uphf6STKEqxLas9EnmnhA/lyj9Uj+JoY7SVgVmGLl46Rm2u98sbkap2lzAdKBG4r6LgulQOSSjQv1GWdQ0jtDUK/mAaqM1Uqjpu4k3Rvfvxv7YTxLSK+wN3E5jVIzmF23uZ7hiH/sVP49D7tvoKp4S8b1LuvRlivVB/algbhcFITYVXvDpLzpDfplR2uD5V4XJFxpjmIpLc9Y5sB2TpBRix7Bme6GZIq+06v3XzNeTcA4obQIKxrnT4C2JpOqD92dbmSX8MGazly5EsZVMvSU1f4RZwyu8iQXbVdeLlZrjuTT1jrY1uk5c7iZ7RsvhhluqAkq4JpVQAg7RJFtSu+xgJ8Pv6O1j5DkLxT8mkbfyRW5DrQmG7hiDIjCgBsADbjuof6YHLGeV6a5Q1Smx9joUXPpdaaDx97A/Wq00oJkdR7ZYuQRfS533JtxO1erduqWOYIt3wh0wpbLuCNIYkwxbswbikCUu2CDCS+Q+7rgVtfRcm+SOcdKPRlZ/rE7wNVUEE39KTS5uvUKN1PUnkloPkyzhyGQ8qkouEjJ3H/VXdqG6asSRiw3ecMlBvDDt8dDhBHXMwZ2Cajzjr7/76T+IavqPYvz6r7//E/3X3+N//h/0QozbjPgPiir69P/8X3/9F/yv8b/827/++98WItPu5/Hvwd8YPf5bp/2/lX/T/+Of/0MJ/lYTa+L/Ef+d9vN/3/2T6P/+jyTzu/evf6U7vxN7B6pJkRtAF6jUr8I+P8RsP/ptGhfqFk+pQ/DgAy6NJtRYJdXmp4gK7WLqLKJ+MaKhGjOojvL+SnIWrkpy0SLHDe4QuyNzaEA15mLMCcmE8Em+4HdOihW4/ZWuppJEmzeAwcDtv7MuLc9y2V5atvxXNe3S4DUMt5/Qy2LM9kSYKiVWBuKlfp4nxTntpuW03JbIlkiRvBXmT23g1I2OYe6IizUHPIq6zm6mbfsbteKmi/sg9J+ocQBMctGFO7iljo8TPN+z3jxw4do+ZwfqoR9dkNTKHyM305GpTkfhcHexVkPVGEbUOjuo9f0UMPHBFlGEx0SLvJvVRKTwW7PSew5oPme+E42+frJa9cGt2njS3dK5kIif2eYbhuSEQXEqMVfUjhGIuin0G0/W5ezJyJQy3SpMLai4M0JUWb5u1k9tny5bd1pPwYBpQuDCXZl62xg4CdVEAtflXHs6JKmP/pH6mOl796Lgopj0o8d5kKh00hxG3OSdEE/QBo9Hgr8JJqAeLDwJohG5j/DGh61Rc/+tf22/8kEnxHNCEjo0ElvvGfESZkqmz2BDcKV1H1buSkhkdg7p1IMGs2s17nYjpblrWuE2K9WEO/hcRp5e9oOF/QBmOaDtgil+oaU6szPrdwW65fOB0KUTsVUn7LFU7J8e6cxJIl9+FHw5MQMzuQJ+4oxMH3iW/5GK+hWuG0T+gTLs+fAjdtUd58TmIUq04EeyRCYCjkldow234aIgR5bqwrtZosZ+6YEqAmDqatJ9lWasz4IquKALPtd92hGI3Z2BdzzZue+REl1Om4DIWD+RrtUTOJLI+S0jHowXXdAxsGLSd40zYNuEUlOGhrwL6c7tcOtUOvpJCP7QBQS19H+GvZn05ewjlVLz+IGKoC9TyfQjLMBNmXCuqqtTdOSukZW48B0HqgSTCBrBnlFvF4CG2Su7yFzqmJFURK3UmTT3ru050r0ptUpMilYnBJWfl2Bv6kPlUuE1kxxpdzui9AubsR2N2boVSu81OulAwBqoSr1LZ0LLYOomyZHmjqnXlP72s8LnDouEJjtodBvdHaG1jMySYO7crWd90MpCRyCG14vb5IE7Arupw/y/RcCm/Tm3zK6zYj8PYNaGldiUfkB/LHWcmf2lVM+mwyU27a0qq2tscrQ/vzBjN26DnntIrOyGizzXK35yKQdYnUABkyN4saz3WD/viF+eCcsXnIajdWYJWaYHRstIis9CS+tqnFGmz2j5uzfr3Z4prqgK4XOT/PyftvjZqIm8lhkfxJ7Ol3CJF1piYBGAG8wtAk56Drw1YwmOpcz+NdfkSpSLplRXLXHL0Rquj6YW/gabqgK7Dgr6NwtH0B/AN7XrN+MVJ6AmXmUuqmQulrNNYPmH0RoDogydOKLo/QbfYNARSQQKISRCzRXU+q9WWJFL3LZW6u34CkeG97xC0NNGaJ0bvK6SnZS3zPskr5EtuCgjMWR5o2x5BqhKmDWJPRe7JMEOyRb5uUKlHaGVtq5ivSOaSliSXp9SQm2qk8MRJh10MAp9QQ2H5t59J8rjiwSZtoIfMGjlLPVNdYl/LBR0AO6WLGDmkLkIPRE45Y9MftdAK/yNu1Hn6tzOQTesgQ+8fSzB19wO91vCnO23vOWQdwJ63SJrYjdfKFW6W281PKs2k8iT9ai1cgJ4sa3xqdvmtxR8/+D1B8AKc2u+6JftryRhMWSQtoSBgIyyQGyxcnELuAasXN12oSriU4RMz1DD6RL0TSV+om7i1Yt+jEE/jnawM8cX/UhN4nkiv/w9eALrzNhXuQfOzFL0Fi6SjF7/4Qn8rLYBoa85cvgAnkCEBP+HPbEnquVXCZsMS/yzYw2Vru60P/+nJPYKkzZFjmbykzUoEqV836T5q3fP/L383dF82tx18/AZgZczMAgyeWYKmSZIqtHL+e+O4ZRcq9VI3g/qPeCoiK4pcgEqdbS0S/Be54sbVQOuJVPNBblIghzeasNu7h/g+Sz1IdhI5lCwq1nUb3Ji4OCIcqQZqtqJ5w7rXrg/DA9IgVmEGhDgGecEwnCTHffXcXs0V3OCEVzYDKS1vp/oX+ng+6XVU86UjA6FMO2RXOOOrqY1GgPvrAk9HV/BXtCu5RuwF8qgdGDLsBcui4E33ymdBip1X8uKyhIWT8qNRDsXz+gvO9UiEC0d8RG4Tf2x8H4slljgHtCBcxHLTWOYJm5H/fCPCzOgf9qgOUxTRZ0Pc6ha5yLuLVT9ntvIa6gacE99mCovdUumTQdRP4RPsS9129eEe2uSvvGh0bV4Y3QPPhPZMqhZWSMa5R0Hc1SGO4IVOQc0FrirlibTVfKRrYkD8kz3b+X65/QkUNaZdrdl3mCap0Hf3YcCw/LiouJYNbqz88UqeDYv93yO7vvXtgl4XCyAO4ODkY6W+83+LZU//p3/zXNGGrUKClCiOnL27iJZbNWDF02XXAOeFlB7IaADoMH1Yqr+UP9biyZDEa/iJt4MDeIz6GKTdLVBfWGVtRN4fdT2rgReX8UXwF2zOrradm4J0nyTgdPnai3RvzpZvCKDUqjOwD/QA6EDaMCLewX6QWYVnHY1sx1bd8ovYnPm1ZvPH+rE20lWjOCnZ66/xDt0QAl15FjfBcZp+i9OU0RNPQ0t3x2pSNWo8eiYudwsnuP1Hq6iH1LJCJynkYsfgJ0p3pF6SoQk2l+jqE8CPk+ziGJRSKjs+W5AO185umPdkYzlK4wl7TC9NxyyDP7ZoyYVoXiuS6SjnInlLWrwz1i8bGTKXX0AVQWkSfIlglW3zRJRJ8bg5VgE6ZEnqNu9B++0GNQvDQJvFize4ESNKBJP+8vA3LM4AX5SIBq08Mob+7QMTCZx4nwP/64+4BnlZC+8WtlP/CXw6t1PwMwkJ3jhP1FiXLhDF/3I6FGUzO2DSi9ABxKyyL9paZxSEz40ZCPQToDAJu1959k7QdbVxgB4icsu2s4zsTPJhcEDo+N1GX4zSk/wriRh8AqwL62972i9HJHd1ydaLXVzvKvOfGGw5RVcUVMiKXFH4APdkQU/dc5BX0YfKTNZYXCW9mb8bc8mufoQP6BbdQmT99ZjoYfr/go4TgQX9IDgztim7wyFeGMfbNaeqj8Dzs38pgcqwSv2hbqB3oSGKWKy+sesY7p57wAHldqE6NDudk/W7s/zjrK4rZFlFvaGxnSZdHbc1y47qDN6xkoK8O3bfr2j41dlJZ71rB4dlDqapPFa8N6xBrprUdtenUCHwxKNhw1uuTBh+9uU45k4REpQABN2bAO9DSLqoIL26gNroWgup5pUMxHUNSq4Gyz47vBPvilpo5f9OYI2ddAqTqmnxXERxQJ3UK8fHbVE9HagHi3+tqNRoNsArdmAxHA5LwtQo9ZAaNKUTljnokljo2x8scqVpEEIPc01fPCdHOCg0DeWBz8D5TVAAfx8aRH5X2ZYNI3ebKDZdeJ+oBDAxmRqJ30Eh2/DaeAy5diVNMpEDmXiPDsGTzBLXy8eVDdJoIafgx/gxMyQi454QrW56nCyeELgSuNNEmYkflF+t3CZQOVRWjKhIuCclmQSlAXT3+4JGG75B4t/5hQ+ldMP4LsAW6z3XmU6IJJwpnGVnsgUZhoY1fZlwTR8wSU7xRejf2uCx9Z5trVTRRJP9KnEb134dEieil6eCOGWgboI7xsqsqM99jfJLTePjygKlH2CVxxsse9QRzTBFjD/Kjqitr/CCTBt/SJ6nLxz7cKP9pFqBpp0lN5y+adKNsZjrPuroemZauH9aTTFD3EKHW8S55XBLFQAt1jgxTQCTwxmx/JyfsZDN1RroN3VaxpSenpIX7K+ZbL8VdlQDcI4Cbzg3QJLa9yVqNxUelu+EtxLVqeekaAvSJkO6sSVqbUajxqhKshNpvZqoeApF0k/0P0ikkwUcbdwc4A1ejN7Oo0O15kG7hTMoK3hZRBCX7YYeLW0wvcXx/18n/u37yLgzBYVBUvORGli+sfRcX/74uD6P4hq+7xu54TlWJLFzT63uwUDwuEDdOjJQqx7JV+ZjaEAPi7t0MMrR4Q8Rkf18uxD6RK0RKh0hL8YU+DeL97i4pa5ZSyAfXKwZRS/8gXcxdZXm62RBDj8U3sN8x95b5PpPs/mCBKYvpaA50pN5Ct/499AFTtwQ5vgeSh+NHrKIi4NVpwM/XzRaNfJD856lPE6M21zWPguFsH7jbLVyEDfRmt4VwrhCJ5VTYmcSPfGgO5clfN+vbaDZ7sakU5+2vZ2WCDY031NxJarVytfDDVtiafcTGO2rJ/taoL3zChN2qmjxofczTOYQPPVQPh0JVtYgdUQINcSiNEEy58UdYXX1MpWUCEBx7LbcGtAm8XWRQTVOaoV3ySri4RShhs/B/0m4jX6OAwXOvcA09bNSG4czEGv/Wey6V/jbTCNTW6awXdNTcA1GsPe1E9fZdGl7R0vyoVpIdJtfC6d32NNErrvq/R+d65VG+YOwRXppXxOCYyGNSf1K3x6VxAW/vtz4EC1SgCOSPdN62sLsoIzuDfg8GwZAbquVO8HIuFP/ToVoeUB7nnwMF35a1wK1tI6fkrqFKhQdeJpwyls0pIy8AZde3/6LUUbFaYJthyUJSU/kqDXTLQElnn0Jr4B2RVghNrmNmoEn7pXIeshPguXVsvwoTdmClq49JJU3LWhHyWTrJL9bRP6VKv3tZoA/th77p5Jw++OEENvyvWy/pNeExiDUVQaXIRGh8xySZTI36yueFaSXo1uJY0RnXYgEOoWWOJHeaVuX/bGNhHsh2yinznl/++NJcE9j6fBPRcBdq9hb8awNw8U7Bl6GM7x69EDOIIbX/npZ++amlHR9L/35mE/2Ss4gb0xCcY4VyTFLRE796vHysLAamqcyO+aFQyJIDBNslbH2/MrAvZiSEIedc/cqjmv4fbda2pXbv+F5a2szSsdkm9noiNURXt8edUhGUF6fSZWd1IJaXKFwD+49R6eCXD4Bkef7j9tRtNMVgW8BhRz/Qpy1TmeYk0doyjZoJSbePOReVHgkFsCFuQJ+Lgc4BxeAsK/cOiNDRmdNw0ctYhn/nQ498dYI5znzGLoJi1rav7Cn88rL3wLePVtDK5gl77Tki3gHEsIAQ2+IKgarj7Y8W1IQzV5V9N+0TjLqbg68WfKcOmBCOj3JkwJhVIkwDhc+JorXuZEPMEh0vvH3x7iqf+VAwXgd4diZiaJD1zHL9Snx6Wfg4IugreyhabQkcir+y5XgDtdx3Avs7lkeeCBwDvZoTUCXx5QrZkcEqWfYEiEYRs/EphmRALSNGR1Iclgdr5VFoELpzF4++f35w3/j0t5ucW3n2ch4PQCLuUXupsPRR7UA5FjSKrMtPcKAZJfagO4lGE7FH3YKMjorpK0ZxAv+i2JkJhtAMWWWFej4RhPR/cJ3DxwocCvXDi4SGZU4cu+K32XndiFWgopAl+0GApcwf1XvymJcFs39jExIBO4yUjU9MExBLQYc9H+W7+IgdESPRpciT+rKZPebVtaVq+1GYO/5xTAL3HASjNTGIgMvdjWbgc7JvdE1zIFpuC0U9ESiZyzBixzxWxj4Kwh8My34q+FK3KNLtmsA1qyrmKSNQOXCPUZd+ONelBTvFoUI/CYsqa/RhtKiyMf2CgSFqEPk59Y3uqnlZ8gFpswfSYyko23yVZYxzKGxGm49Zqxg1l8oz5Ra9XaRwHkuxepmgyhm0SoNy2KlbcEqK+9QqS9PNx9Ihm9U7gsR55SSJ1FBDNnkuWKxIZ0SDpXuOGwZdoUbOMDPHP4vBAgz2VlSEJAHZGJVbYIg7l/FO5KfIVvxC8pPPxMGcNMoevFDeStt2iqztE10n2TA4dgJH76YS9HDhKHD3iCx6ieFX84BAI3QQnngh76f5ruPQVbr5qZmck/5UjDc26lfrOvUBWy0Ogl8bCoOkMOns81TnC3cuUS9KW8+9A+fe3XYZOFUPG1u5epSSmDLw0s5s2F0W30ANeo+zJkJQz9SPZgzwYpEoktofhGVfmLOAB20boCbW1QWq/NpET/hnMecw/uSyAH4NJc3ECOU4nnkK1fj3S/i5dwb3R7k00AqQQUwt7Ie1qV0aY/VQX0J8hLPy7eBNXMHYZYDNxHZ2Qh6AuXJxq+AeRec/Q+JLhZV6hpXwQEzw7bf5v9uUf2vpq3qlhmy0IIGTkwYdCfSAFmqbdo+3XvDTDjFJde0mbeQLcn2n31xaAqJ0ixO/CLsT4I4G4DoncVTgRGNBtsCcjISWT+oeXZ4Iedw/8OsJI1aPnNKLX/60VvcZb94uasRxCkqlPQ11u1Sa2hHvB80WQENxVyzjns0/PiEByyil21Te6oisk3mNCEMrhouCFO3yEZTHHOCMy9eb/4Tmi8cVf3Lf7P53SY2hX3PSN033As3ETIMLHWumWEO9JXHA2y2SIBlIPpLGG2qvNsCIlIr+B1SWAqRKm2w6Blf7U+zCSBwJrfHG5i8J5Gax/cVonMlon7aHJX/gSvucIncRP93XCqkv7D8IFKFsLiBgHqUpXhE3pYjEcV1dk/JD9zFVCfEaQIVX8Jmfz7IIofcBKQ4OaG+C3xC2veX9CD+iAFXDNaGg9eTVxvkbJRJlW4Nk9Wk13kn696jWppRDe/8pDrYMO9ZyxZ98ReKSz9kWKLLyk2zCZgAniCkLJVX3n1M9DYbomyahWiv/KixRIV9hj/oFz87I+HLznbPTjpa+D+bZQnMuRsljTpv90vQUt/pK7jCFnA30B/jtroSF2/m/gpWn1aQs5WeA6ghzF8SdqWI20fghdSeDOCSCmLgTkfaGgGDmw7nHFkRzGtag57IHS2na06I+gzEphXo1w/Zx2BM/jKL2nZoFjHggtFQjYi8nSVRSXIE58RPbBObXk7uuIL9+rs/5Zo7suJInEUxgsiZZAWS25iBtpEiZeBgDtghEoAE0sjcayNq85M4tbu/LF5h51335PsGzQ09O875+vUS89lkWMyNOFoip2PuyWyMP/iU2XIZdfCCJNDjebDoBLQdpy7QQZC7s9c0wjHJervQNDu2jWzBW5MSAJMr7bP+Iv92BkS/GGgzjEn7MF1IRKFwwzbjbS4/slGOmhx9cZrFu7HSEefojNv3r0UaKfKOWzXsq1zEugbzlMDFsacRJJI/iJlK3vtkZ+PLZIVMFlKA32wbq2Kd5T0uCLZ1CPkAfCdzkz2EYscjDcZq2AWfziN2covN4kXE1lQXPPLTNM1xx3tbiepcO/t3SWm4w87qfh99SL0ZnY+LKFPLPeXVM2mIIoVWt+9Nk0I7nY4O79iGYqxZ8RVz289an6NVdJWnSKZvJQCAuHNiVaDxPAFoH392t9wot5t0/qmU95eEWNbU2udUW5sN9JVqcYlvAIfLeYC33oUzzxZgSktsv21mA7Uly1FA5VnoJFh6N244Wmv3YJGFv/TCPryaw+ZORlpZjQdq/2DYXr3EZskfed0G61P09ipTKmlTQ1067Rg5+PAk5FlQ9e0SWbGf2B/08kqymOTMVOznsALHHNFH4LFRKl2F/NOiYFl9khNHnSu9Ak5sq26Ynl/i2fdTle29Y1ugqmR5Yj4YT9pvslFyYCbw0mNFr5rVQm1LvkG27QMq9ph3t8fmn6r6SQ4oSbr5tz+J1kIawGzDxb6VYOvvWhobDTXfBeNv3b4aNm5XUinsCGqG2q/45m3+LoCOsddFceYhRx1Tsss9PLdPfJdErFMjYd3gddjiP0+XQjcRadZP6bwNLySvunFf20Czy6JqdEW2a96KxdYdOryBv1BjbuUq2yCHeh+6sk7fGmmPi50pe/1l5TyPe5oHW9oPnhPswLyf2TFDdCyYlhwBCstv5C1HwlW7xWoGT9XZt4qVj5WryLPLLD6h/5cMLEjWzgCeAIKNsLak92aBqBsHl4AJwl2N4jfvbSkBExGimv0nFvv09uDScQbjx+w4kPQjgjlW+g9ws9VEJvI2k8N6XxVu0uIwovgTFdunG24gBtaDi+y1YLQwZ8mwbip5fVlO3k0n0AEr/ETbtu8Vjkm+nNSiEb7X/3fMjBL5A8PdgG+/FnbexbFFExmEfetXAnisEKy5z44WVPpQZjSy/jzeGn4yDRsFGqhh87QPaDBWhlo37IFbe/C0xynS91d2tP/AJoJS0sVF6iwAAAAAElFTkSuQmCC");
|
||
}
|
||
|
||
#menu::after {
|
||
display: block;
|
||
content: '';
|
||
padding-top: 80px;
|
||
}
|
||
|
||
#logo {
|
||
position: fixed;
|
||
bottom: 10px;
|
||
right: 10px;
|
||
background: rgba(255,255,255,.1);
|
||
font-size: 11px;
|
||
display: block;
|
||
width: 20px;
|
||
height: 20px;
|
||
line-height: 20px;
|
||
text-align: center;
|
||
-webkit-border-radius: 20px;
|
||
-moz-border-radius: 20px;
|
||
border-radius: 20px;
|
||
-webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||
-moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||
box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||
color: inherit;
|
||
}
|
||
|
||
#menu li a {
|
||
display: block;
|
||
color: white;
|
||
padding: 0 35px 0 25px;
|
||
-webkit-transition: background 300ms;
|
||
-moz-transition: background 300ms;
|
||
}
|
||
|
||
#menu li {
|
||
position: relative;
|
||
list-style: none;
|
||
}
|
||
|
||
#menu a:hover,
|
||
#menu a.active {
|
||
text-decoration: none;
|
||
background: rgba(255,255,255,.1);
|
||
}
|
||
|
||
#menu li:hover .cov {
|
||
opacity: 1;
|
||
}
|
||
|
||
#menu li .dirname {
|
||
opacity: .60;
|
||
padding-right: 2px;
|
||
}
|
||
|
||
#menu li .basename {
|
||
opacity: 1;
|
||
}
|
||
|
||
#menu .cov {
|
||
background: rgba(0,0,0,.4);
|
||
position: absolute;
|
||
top: 0;
|
||
right: 8px;
|
||
font-size: 9px;
|
||
opacity: .6;
|
||
text-align: left;
|
||
width: 17px;
|
||
-webkit-border-radius: 10px;
|
||
-moz-border-radius: 10px;
|
||
border-radius: 10px;
|
||
padding: 2px 3px;
|
||
text-align: center;
|
||
}
|
||
|
||
#stats:nth-child(2n) {
|
||
display: inline-block;
|
||
margin-top: 15px;
|
||
border: 1px solid #eee;
|
||
padding: 10px;
|
||
-webkit-box-shadow: inset 0 0 2px #eee;
|
||
-moz-box-shadow: inset 0 0 2px #eee;
|
||
box-shadow: inset 0 0 2px #eee;
|
||
-webkit-border-radius: 5px;
|
||
-moz-border-radius: 5px;
|
||
border-radius: 5px;
|
||
}
|
||
|
||
#stats div {
|
||
float: left;
|
||
padding: 0 5px;
|
||
}
|
||
|
||
#stats::after {
|
||
display: block;
|
||
content: '';
|
||
clear: both;
|
||
}
|
||
|
||
#stats .sloc::after {
|
||
content: ' SLOC';
|
||
color: #b6b6b6;
|
||
}
|
||
|
||
#stats .percentage::after {
|
||
content: ' coverage';
|
||
color: #b6b6b6;
|
||
}
|
||
|
||
#stats .hits,
|
||
#stats .misses {
|
||
display: none;
|
||
}
|
||
|
||
.high {
|
||
color: #00d4b4;
|
||
}
|
||
.medium {
|
||
color: #e87d0d;
|
||
}
|
||
.low {
|
||
color: #d4081a;
|
||
}
|
||
.terrible {
|
||
color: #d4081a;
|
||
font-weight: bold;
|
||
}
|
||
|
||
table {
|
||
width: 80%;
|
||
margin-top: 10px;
|
||
border-collapse: collapse;
|
||
border: 1px solid #cbcbcb;
|
||
color: #363636;
|
||
-webkit-border-radius: 3px;
|
||
-moz-border-radius: 3px;
|
||
border-radius: 3px;
|
||
}
|
||
|
||
table thead {
|
||
display: none;
|
||
}
|
||
|
||
table td.line,
|
||
table td.hits {
|
||
width: 20px;
|
||
background: #eaeaea;
|
||
text-align: center;
|
||
font-size: 11px;
|
||
padding: 0 10px;
|
||
color: #949494;
|
||
}
|
||
|
||
table td.hits {
|
||
width: 10px;
|
||
padding: 2px 5px;
|
||
color: rgba(0,0,0,.2);
|
||
background: #f0f0f0;
|
||
}
|
||
|
||
tr.miss td.line,
|
||
tr.miss td.hits {
|
||
background: #e6c3c7;
|
||
}
|
||
|
||
tr.miss td {
|
||
background: #f8d5d8;
|
||
}
|
||
|
||
td.source {
|
||
padding-left: 15px;
|
||
line-height: 15px;
|
||
white-space: pre;
|
||
font: 12px monaco, monospace;
|
||
}
|
||
|
||
code .comment { color: #ddd }
|
||
code .init { color: #2F6FAD }
|
||
code .string { color: #5890AD }
|
||
code .keyword { color: #8A6343 }
|
||
code .number { color: #2F6FAD }
|
||
</style></head><body><div id="coverage"><h1 id="overview">Coverage</h1><div id="menu"><li><a href="#overview">overview</a></li><li><span class="cov medium">50</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Common/common.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Common/</span><span class="basename">common.js</span></a></li><li><span class="cov low">46</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Common/extend.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Common/</span><span class="basename">extend.js</span></a></li><li><span class="cov medium">53</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Common/function.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Common/</span><span class="basename">function.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Conf/alias.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Conf/</span><span class="basename">alias.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Conf/config.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Conf/</span><span class="basename">config.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Conf/mode.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Conf/</span><span class="basename">mode.js</span></a></li><li><span class="cov low">41</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Conf/tag.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Conf/</span><span class="basename">tag.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/CheckResourceBehavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/</span><span class="basename">CheckResourceBehavior.js</span></a></li><li><span class="cov terrible">9</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/CheckRouteBehavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/</span><span class="basename">CheckRouteBehavior.js</span></a></li><li><span class="cov low">40</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/LocationTemplateBehavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/</span><span class="basename">LocationTemplateBehavior.js</span></a></li><li><span class="cov high">90</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/ParseTemplateBehavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/</span><span class="basename">ParseTemplateBehavior.js</span></a></li><li><span class="cov terrible">10</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/ReadHtmlCacheBehavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/</span><span class="basename">ReadHtmlCacheBehavior.js</span></a></li><li><span class="cov low">45</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/WriteHtmlCacheBehavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/</span><span class="basename">WriteHtmlCacheBehavior.js</span></a></li><li><span class="cov medium">50</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/App.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/</span><span class="basename">App.js</span></a></li><li><span class="cov terrible">12</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Controller.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/</span><span class="basename">Controller.js</span></a></li><li><span class="cov high">84</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Dispatcher.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/</span><span class="basename">Dispatcher.js</span></a></li><li><span class="cov low">38</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Http.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/</span><span class="basename">Http.js</span></a></li><li><span class="cov medium">54</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Think.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/</span><span class="basename">Think.js</span></a></li><li><span class="cov high">81</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/View.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/</span><span class="basename">View.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Driver/Template/EjsTemplate.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Driver/Template/</span><span class="basename">EjsTemplate.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/Behavior.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/</span><span class="basename">Behavior.js</span></a></li><li><span class="cov terrible">22</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/Cookie.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/</span><span class="basename">Cookie.js</span></a></li><li><span class="cov high">85</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/think.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/</span><span class="basename">think.js</span></a></li><a id="logo" href="http://visionmedia.github.io/mocha/">m</a></div><div id="stats" class="low"><div class="percentage">44%</div><div class="sloc">1481</div><div class="hits">659</div><div class="misses">822</div></div><div id="files"><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Common/common.js">/Users/welefen/Develop/git/thinkjs/lib/Common/common.js</h2><div id="stats" class="medium"><div class="percentage">50%</div><div class="sloc">270</div><div class="hits">135</div><div class="misses">135</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var path = require('path');</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var util = require('util');</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var crypto = require('crypto');</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var net = require('net');</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * Promise,后续Node.js会默认支持Promise,所以这里加个判断</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * @type {[type]}</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">if (!global.Promise) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> global.Promise = require('es6-promise').Promise;</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * 动态创建一个类</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> * 提供了继承、扩展、调用父级别方法等方法</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source">global.Class = function (prop, superCls) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">12</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">22</td><td class="hits">12</td><td class="source"> var cls = function () {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">15</td><td class="source"> function T(args) {</td></tr><tr class="hit"><td class="line">24</td><td class="hits">15</td><td class="source"> for(var name in cls.__prop){</td></tr><tr class="hit"><td class="line">25</td><td class="hits">20</td><td class="source"> var val = cls.__prop[name];</td></tr><tr class="hit"><td class="line">26</td><td class="hits">20</td><td class="source"> this[name] = isObject(val) ? extend({}, val) : val;</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> //自动执行init方法</td></tr><tr class="hit"><td class="line">29</td><td class="hits">15</td><td class="source"> if(isFunction(this.init)){</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> //获取init返回值,如果返回一个promise,可以让后续执行在then之后</td></tr><tr class="hit"><td class="line">31</td><td class="hits">15</td><td class="source"> this.__initReturn = this.init.apply(this, args);</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">33</td><td class="hits">15</td><td class="source"> return this;</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">35</td><td class="hits">15</td><td class="source"> T.prototype = cls.prototype;</td></tr><tr class="hit"><td class="line">36</td><td class="hits">15</td><td class="source"> T.constructor = cls;</td></tr><tr class="hit"><td class="line">37</td><td class="hits">15</td><td class="source"> return new T(arguments);</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> //类的属性,不放在原型上,实例化的时候调用</td></tr><tr class="hit"><td class="line">40</td><td class="hits">12</td><td class="source"> cls.__prop = {};</td></tr><tr class="hit"><td class="line">41</td><td class="hits">12</td><td class="source"> cls.extend = function(prop){</td></tr><tr class="hit"><td class="line">42</td><td class="hits">12</td><td class="source"> if (isFunction(prop)) {</td></tr><tr class="hit"><td class="line">43</td><td class="hits">12</td><td class="source"> prop = prop();</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">45</td><td class="hits">12</td><td class="source"> if (isObject(prop)) {</td></tr><tr class="hit"><td class="line">46</td><td class="hits">12</td><td class="source"> for(var name in prop){</td></tr><tr class="hit"><td class="line">47</td><td class="hits">82</td><td class="source"> var val = prop[name];</td></tr><tr class="hit"><td class="line">48</td><td class="hits">82</td><td class="source"> if (isFunction(val)) {</td></tr><tr class="hit"><td class="line">49</td><td class="hits">76</td><td class="source"> this.prototype[name] = val;</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">51</td><td class="hits">6</td><td class="source"> cls.__prop[name] = isObject(val) ? extend({}, val) : val;</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">55</td><td class="hits">12</td><td class="source"> return this;</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">57</td><td class="hits">12</td><td class="source"> cls.inherits = function(superCls){</td></tr><tr class="hit"><td class="line">58</td><td class="hits">7</td><td class="source"> util.inherits(this, superCls);</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> //将父级的属性复制到当前类上</td></tr><tr class="hit"><td class="line">60</td><td class="hits">7</td><td class="source"> extend(cls.__prop, superCls.__prop);</td></tr><tr class="hit"><td class="line">61</td><td class="hits">7</td><td class="source"> return this;</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">63</td><td class="hits">12</td><td class="source"> if (superCls === true && isFunction(prop)) {</td></tr><tr class="miss"><td class="line">64</td><td class="hits">0</td><td class="source"> superCls = prop;</td></tr><tr class="miss"><td class="line">65</td><td class="hits">0</td><td class="source"> prop = undefined;</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">67</td><td class="hits">12</td><td class="source"> if (isFunction(superCls)) {</td></tr><tr class="hit"><td class="line">68</td><td class="hits">7</td><td class="source"> cls.inherits(superCls);</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> //调用父级方法</td></tr><tr class="hit"><td class="line">71</td><td class="hits">12</td><td class="source"> cls.prototype.super = cls.prototype.super_ = function(name, data){</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> //如果当前类没有这个方法,则直接返回。</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> //用于在a方法调用父级的b方法</td></tr><tr class="miss"><td class="line">74</td><td class="hits">0</td><td class="source"> if (!this[name]) {</td></tr><tr class="miss"><td class="line">75</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">77</td><td class="hits">0</td><td class="source"> var super_ = this.constructor.super_;</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> //如果父级没有这个方法,那么直接返回</td></tr><tr class="miss"><td class="line">79</td><td class="hits">0</td><td class="source"> if (!isFunction(super_.prototype[name])) {</td></tr><tr class="miss"><td class="line">80</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> //如果参数不是数组,自动转为数组</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> if (!isArray(data)) {</td></tr><tr class="miss"><td class="line">84</td><td class="hits">0</td><td class="source"> data = [data];</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">86</td><td class="hits">0</td><td class="source"> while(1){</td></tr><tr class="miss"><td class="line">87</td><td class="hits">0</td><td class="source"> if (this[name] === super_.prototype[name] && super_.super_) {</td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> super_ = super_.super_;</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">90</td><td class="hits">0</td><td class="source"> break;</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">93</td><td class="hits">0</td><td class="source"> var method = super_.prototype[name];</td></tr><tr class="miss"><td class="line">94</td><td class="hits">0</td><td class="source"> delete super_.prototype[name];</td></tr><tr class="miss"><td class="line">95</td><td class="hits">0</td><td class="source"> var ret = method.apply(this, data);</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> super_.prototype[name] = method;</td></tr><tr class="miss"><td class="line">97</td><td class="hits">0</td><td class="source"> return ret;</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">99</td><td class="hits">12</td><td class="source"> if (prop) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">12</td><td class="source"> cls.extend(prop);</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">102</td><td class="hits">12</td><td class="source"> return cls;</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> * extend, from jquery,具有深度复制功能</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">108</td><td class="hits">1</td><td class="source">global.extend = function(){</td></tr><tr class="hit"><td class="line">109</td><td class="hits">65</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">110</td><td class="hits">65</td><td class="source"> var args = [].slice.call(arguments);</td></tr><tr class="hit"><td class="line">111</td><td class="hits">65</td><td class="source"> var deep = true;</td></tr><tr class="hit"><td class="line">112</td><td class="hits">65</td><td class="source"> var target = args.shift();</td></tr><tr class="hit"><td class="line">113</td><td class="hits">65</td><td class="source"> if (isBoolean(target)) {</td></tr><tr class="hit"><td class="line">114</td><td class="hits">31</td><td class="source"> deep = target;</td></tr><tr class="hit"><td class="line">115</td><td class="hits">31</td><td class="source"> target = args.shift();</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">117</td><td class="hits">65</td><td class="source"> target = target || {};</td></tr><tr class="hit"><td class="line">118</td><td class="hits">65</td><td class="source"> var length = args.length;</td></tr><tr class="hit"><td class="line">119</td><td class="hits">65</td><td class="source"> var options, name, src, copy, copyAsArray, clone;</td></tr><tr class="hit"><td class="line">120</td><td class="hits">65</td><td class="source"> for(var i = 0; i < length; i++){</td></tr><tr class="hit"><td class="line">121</td><td class="hits">65</td><td class="source"> options = args[i] || {};</td></tr><tr class="hit"><td class="line">122</td><td class="hits">65</td><td class="source"> if (isFunction(options)) {</td></tr><tr class="miss"><td class="line">123</td><td class="hits">0</td><td class="source"> options = options();</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">125</td><td class="hits">65</td><td class="source"> for(name in options){</td></tr><tr class="hit"><td class="line">126</td><td class="hits">217</td><td class="source"> src = target[name];</td></tr><tr class="hit"><td class="line">127</td><td class="hits">217</td><td class="source"> copy = options[name];</td></tr><tr class="hit"><td class="line">128</td><td class="hits">217</td><td class="source"> if (src === copy) {</td></tr><tr class="hit"><td class="line">129</td><td class="hits">20</td><td class="source"> continue;</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">131</td><td class="hits">197</td><td class="source"> if (deep && copy && (isObject(copy) || (copyAsArray = isArray(copy) ))) {</td></tr><tr class="hit"><td class="line">132</td><td class="hits">31</td><td class="source"> if (copyAsArray) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">9</td><td class="source"> copyAsArray = false;</td></tr><tr class="hit"><td class="line">134</td><td class="hits">9</td><td class="source"> clone = src && isArray(src) ? src : [];</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">136</td><td class="hits">22</td><td class="source"> clone = src && isObject(src) ? src : {}; </td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">138</td><td class="hits">31</td><td class="source"> target[name] = extend(deep, clone, copy);</td></tr><tr class="hit"><td class="line">139</td><td class="hits">166</td><td class="source"> }else if (copy !== undefined) {</td></tr><tr class="hit"><td class="line">140</td><td class="hits">166</td><td class="source"> target[name] = copy;</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">144</td><td class="hits">65</td><td class="source"> return target;</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source">//Object上toString方法</td></tr><tr class="hit"><td class="line">149</td><td class="hits">1</td><td class="source">var toString = Object.prototype.toString;</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> * 是否是boolean</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> * @param {[type]} obj</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> * @return {Boolean}</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">156</td><td class="hits">1</td><td class="source">global.isBoolean = function(obj){</td></tr><tr class="hit"><td class="line">157</td><td class="hits">65</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">158</td><td class="hits">65</td><td class="source"> return toString.call(obj) === '[object Boolean]';</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> * 是否是数字</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">165</td><td class="hits">1</td><td class="source">global.isNumber = function(obj){</td></tr><tr class="miss"><td class="line">166</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">167</td><td class="hits">0</td><td class="source"> return toString.call(obj) === '[object Number]';</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> * 是否是个对象</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">174</td><td class="hits">1</td><td class="source">global.isObject = function(obj){</td></tr><tr class="hit"><td class="line">175</td><td class="hits">192</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">176</td><td class="hits">192</td><td class="source"> if (isBuffer(obj)) {</td></tr><tr class="miss"><td class="line">177</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">179</td><td class="hits">192</td><td class="source"> return toString.call(obj) === '[object Object]';</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> * 是否是字符串</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">186</td><td class="hits">1</td><td class="source">global.isString = function(obj){</td></tr><tr class="hit"><td class="line">187</td><td class="hits">123</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">188</td><td class="hits">123</td><td class="source"> return toString.call(obj) === '[object String]';</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> * 是否是个function</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">195</td><td class="hits">1</td><td class="source">global.isFunction = function(obj){</td></tr><tr class="hit"><td class="line">196</td><td class="hits">217</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">197</td><td class="hits">217</td><td class="source"> return typeof obj === 'function';</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> * 是否是日期</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">203</td><td class="hits">1</td><td class="source">global.isDate = function(obj){</td></tr><tr class="miss"><td class="line">204</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">205</td><td class="hits">0</td><td class="source"> return util.isDate(obj);</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">208</td><td class="hits"></td><td class="source"> * 是否是正则</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> * @param {[type]} reg [description]</td></tr><tr><td class="line">210</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">212</td><td class="hits">1</td><td class="source">global.isRegexp = function(obj){</td></tr><tr class="miss"><td class="line">213</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">214</td><td class="hits">0</td><td class="source"> return util.isRegExp(obj);</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">216</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> * 是否是个错误</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">221</td><td class="hits">1</td><td class="source">global.isError = function(obj){</td></tr><tr class="miss"><td class="line">222</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">223</td><td class="hits">0</td><td class="source"> return util.isError(obj);</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> * 判断对象是否为空</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> * @param {[type]} obj</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> * @return {Boolean}</td></tr><tr><td class="line">229</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">230</td><td class="hits">1</td><td class="source">global.isEmpty = function(obj){</td></tr><tr class="miss"><td class="line">231</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">232</td><td class="hits">0</td><td class="source"> if (isObject(obj)) {</td></tr><tr class="miss"><td class="line">233</td><td class="hits">0</td><td class="source"> var key;</td></tr><tr class="miss"><td class="line">234</td><td class="hits">0</td><td class="source"> for(key in obj){</td></tr><tr class="miss"><td class="line">235</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">237</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr class="miss"><td class="line">238</td><td class="hits">0</td><td class="source"> }else if (isArray(obj)) {</td></tr><tr class="miss"><td class="line">239</td><td class="hits">0</td><td class="source"> return obj.length === 0;</td></tr><tr class="miss"><td class="line">240</td><td class="hits">0</td><td class="source"> }else if (isString(obj)) {</td></tr><tr class="miss"><td class="line">241</td><td class="hits">0</td><td class="source"> return obj.length === 0;</td></tr><tr class="miss"><td class="line">242</td><td class="hits">0</td><td class="source"> }else if (isNumber(obj)) {</td></tr><tr class="miss"><td class="line">243</td><td class="hits">0</td><td class="source"> return obj === 0;</td></tr><tr class="miss"><td class="line">244</td><td class="hits">0</td><td class="source"> }else if (obj === null || obj === undefined) {</td></tr><tr class="miss"><td class="line">245</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr class="miss"><td class="line">246</td><td class="hits">0</td><td class="source"> }else if (isBoolean(obj)) {</td></tr><tr class="miss"><td class="line">247</td><td class="hits">0</td><td class="source"> return !obj;</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">249</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> * 是否是个标量</td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">254</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">255</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">256</td><td class="hits">1</td><td class="source">global.isScalar = function(obj){</td></tr><tr class="miss"><td class="line">257</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">258</td><td class="hits">0</td><td class="source"> return isBoolean(obj) || isNumber(obj) || isString(obj);</td></tr><tr><td class="line">259</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> * 是否是个数组</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> * @type {Boolean}</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">264</td><td class="hits">1</td><td class="source">global.isArray = Array.isArray;</td></tr><tr><td class="line">265</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">266</td><td class="hits"></td><td class="source"> * 是否是IP</td></tr><tr><td class="line">267</td><td class="hits"></td><td class="source"> * @type {Boolean}</td></tr><tr><td class="line">268</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">269</td><td class="hits">1</td><td class="source">global.isIP = net.isIP;</td></tr><tr class="hit"><td class="line">270</td><td class="hits">1</td><td class="source">global.isIP4 = net.isIP4;</td></tr><tr class="hit"><td class="line">271</td><td class="hits">1</td><td class="source">global.isIP6 = net.isIP6;</td></tr><tr><td class="line">272</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> * 是否是个文件</td></tr><tr><td class="line">274</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">275</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">276</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">277</td><td class="hits">1</td><td class="source">global.isFile = function(p){</td></tr><tr class="hit"><td class="line">278</td><td class="hits">23</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">279</td><td class="hits">23</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="hit"><td class="line">280</td><td class="hits">11</td><td class="source"> return false;</td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">282</td><td class="hits">12</td><td class="source"> var stats = fs.statSync(p);</td></tr><tr class="hit"><td class="line">283</td><td class="hits">12</td><td class="source"> return stats.isFile();</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">285</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">286</td><td class="hits"></td><td class="source"> * 是否是个目录</td></tr><tr><td class="line">287</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">288</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">289</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">290</td><td class="hits">1</td><td class="source">global.isDir = function(p){</td></tr><tr class="miss"><td class="line">291</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">292</td><td class="hits">0</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="miss"><td class="line">293</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">294</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">295</td><td class="hits">0</td><td class="source"> var stats = fs.statSync(p);</td></tr><tr class="miss"><td class="line">296</td><td class="hits">0</td><td class="source"> return stats.isDirectory();</td></tr><tr><td class="line">297</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">298</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">299</td><td class="hits"></td><td class="source"> * 是否是buffer</td></tr><tr><td class="line">300</td><td class="hits"></td><td class="source"> * @type {Boolean}</td></tr><tr><td class="line">301</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">302</td><td class="hits">1</td><td class="source">global.isBuffer = Buffer.isBuffer;</td></tr><tr><td class="line">303</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">304</td><td class="hits"></td><td class="source"> * 是否是个数字的字符串</td></tr><tr><td class="line">305</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">306</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">307</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">308</td><td class="hits">1</td><td class="source">var numberReg = /^((\-?\d*\.?\d*(?:e[+-]?\d*(?:\d?\.?|\.?\d?)\d*)?)|(0[0-7]+)|(0x[0-9a-f]+))$/i;</td></tr><tr class="hit"><td class="line">309</td><td class="hits">1</td><td class="source">global.isNumberString = function(obj){</td></tr><tr class="miss"><td class="line">310</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">311</td><td class="hits">0</td><td class="source"> return numberReg.test(obj);</td></tr><tr><td class="line">312</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">313</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source"> * 判断是否是个promise</td></tr><tr><td class="line">315</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">316</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">317</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">318</td><td class="hits">1</td><td class="source">global.isPromise = function(obj){</td></tr><tr class="hit"><td class="line">319</td><td class="hits">24</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">320</td><td class="hits">24</td><td class="source"> return !!(obj && typeof obj.then === 'function');</td></tr><tr><td class="line">321</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">322</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">323</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">324</td><td class="hits"></td><td class="source"> * 判断一个文件或者目录是否可写</td></tr><tr><td class="line">325</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">326</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">328</td><td class="hits">1</td><td class="source">global.isWritable = function(p){</td></tr><tr class="miss"><td class="line">329</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">330</td><td class="hits">0</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="miss"><td class="line">331</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">332</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">333</td><td class="hits">0</td><td class="source"> var stats = fs.statSync(p);</td></tr><tr class="miss"><td class="line">334</td><td class="hits">0</td><td class="source"> var mode = stats.mode;</td></tr><tr class="miss"><td class="line">335</td><td class="hits">0</td><td class="source"> var uid = process.getuid ? process.getuid() : 0;</td></tr><tr class="miss"><td class="line">336</td><td class="hits">0</td><td class="source"> var gid = process.getgid ? process.getgid() : 0;</td></tr><tr class="miss"><td class="line">337</td><td class="hits">0</td><td class="source"> var owner = uid === stats.uid;</td></tr><tr class="miss"><td class="line">338</td><td class="hits">0</td><td class="source"> var group = gid === stats.gid;</td></tr><tr class="miss"><td class="line">339</td><td class="hits">0</td><td class="source"> return !!(owner && (mode & parseInt('00200', 8)) || </td></tr><tr><td class="line">340</td><td class="hits"></td><td class="source"> group && (mode & parseInt('00020', 8)) || </td></tr><tr><td class="line">341</td><td class="hits"></td><td class="source"> (mode & parseInt('00002', 8)));</td></tr><tr><td class="line">342</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">343</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">344</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">345</td><td class="hits"></td><td class="source"> * 递归创建目录,同步模式</td></tr><tr><td class="line">346</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">347</td><td class="hits"></td><td class="source"> * @param {[type]} mode [description]</td></tr><tr><td class="line">348</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">349</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">350</td><td class="hits">1</td><td class="source">global.mkdir = function(p, mode){</td></tr><tr class="miss"><td class="line">351</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">352</td><td class="hits">0</td><td class="source"> mode = mode || '0777';</td></tr><tr class="miss"><td class="line">353</td><td class="hits">0</td><td class="source"> if (fs.existsSync(p)) {</td></tr><tr class="miss"><td class="line">354</td><td class="hits">0</td><td class="source"> chmod(p, mode);</td></tr><tr class="miss"><td class="line">355</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">356</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">357</td><td class="hits">0</td><td class="source"> var pp = path.dirname(p);</td></tr><tr class="miss"><td class="line">358</td><td class="hits">0</td><td class="source"> if (fs.existsSync(pp)) {</td></tr><tr class="miss"><td class="line">359</td><td class="hits">0</td><td class="source"> fs.mkdirSync(p, mode);</td></tr><tr><td class="line">360</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">361</td><td class="hits">0</td><td class="source"> mkdir(pp, mode);</td></tr><tr class="miss"><td class="line">362</td><td class="hits">0</td><td class="source"> mkdir(p, mode);</td></tr><tr><td class="line">363</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">364</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">365</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">366</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">367</td><td class="hits"></td><td class="source"> * 递归的删除目录,返回promise</td></tr><tr><td class="line">368</td><td class="hits"></td><td class="source"> * @param string p 要删除的目录</td></tr><tr><td class="line">369</td><td class="hits"></td><td class="source"> * @param boolean reserve 是否保留当前目录,只删除子目录</td></tr><tr><td class="line">370</td><td class="hits"></td><td class="source"> * @return Promise </td></tr><tr><td class="line">371</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">372</td><td class="hits">1</td><td class="source">global.rmdir = function(p, reserve){</td></tr><tr class="miss"><td class="line">373</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">374</td><td class="hits">0</td><td class="source"> if (!isDir(p)) {</td></tr><tr class="miss"><td class="line">375</td><td class="hits">0</td><td class="source"> return getPromise();</td></tr><tr><td class="line">376</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">377</td><td class="hits">0</td><td class="source"> var deferred = getDefer();</td></tr><tr class="miss"><td class="line">378</td><td class="hits">0</td><td class="source"> fs.readdir(p, function(err, files){</td></tr><tr class="miss"><td class="line">379</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">380</td><td class="hits">0</td><td class="source"> return deferred.reject(err);</td></tr><tr><td class="line">381</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">382</td><td class="hits">0</td><td class="source"> var promises = files.map(function(item){</td></tr><tr class="miss"><td class="line">383</td><td class="hits">0</td><td class="source"> var filepath = path.normalize(p + '/' + item);</td></tr><tr class="miss"><td class="line">384</td><td class="hits">0</td><td class="source"> if (isDir(filepath)) {</td></tr><tr class="miss"><td class="line">385</td><td class="hits">0</td><td class="source"> return rmdir(filepath, false);</td></tr><tr><td class="line">386</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">387</td><td class="hits">0</td><td class="source"> var deferred = getDefer();</td></tr><tr class="miss"><td class="line">388</td><td class="hits">0</td><td class="source"> fs.unlink(filepath, function(err){</td></tr><tr class="miss"><td class="line">389</td><td class="hits">0</td><td class="source"> return err ? deferred.reject(err) : deferred.resolve();</td></tr><tr><td class="line">390</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">391</td><td class="hits">0</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">392</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">393</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">394</td><td class="hits">0</td><td class="source"> var promise = files.length === 0 ? getPromise() : Promise.all(promises);</td></tr><tr class="miss"><td class="line">395</td><td class="hits">0</td><td class="source"> return promise.then(function(){</td></tr><tr class="miss"><td class="line">396</td><td class="hits">0</td><td class="source"> if (!reserve) {</td></tr><tr class="miss"><td class="line">397</td><td class="hits">0</td><td class="source"> var deferred = getDefer();</td></tr><tr class="miss"><td class="line">398</td><td class="hits">0</td><td class="source"> fs.rmdir(p, function(err){</td></tr><tr class="miss"><td class="line">399</td><td class="hits">0</td><td class="source"> return err ? deferred.reject(err) : deferred.resolve();</td></tr><tr><td class="line">400</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">401</td><td class="hits">0</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">402</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">403</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="miss"><td class="line">404</td><td class="hits">0</td><td class="source"> deferred.resolve();</td></tr><tr><td class="line">405</td><td class="hits"></td><td class="source"> }).catch(function(err){</td></tr><tr class="miss"><td class="line">406</td><td class="hits">0</td><td class="source"> deferred.reject(err);</td></tr><tr><td class="line">407</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">408</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">409</td><td class="hits">0</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">410</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">411</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">412</td><td class="hits"></td><td class="source"> * 修改目录或者文件权限</td></tr><tr><td class="line">413</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">414</td><td class="hits"></td><td class="source"> * @param {[type]} mode [description]</td></tr><tr><td class="line">415</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">416</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">417</td><td class="hits">1</td><td class="source">global.chmod = function(p, mode){</td></tr><tr class="miss"><td class="line">418</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">419</td><td class="hits">0</td><td class="source"> mode = mode || '0777';</td></tr><tr class="miss"><td class="line">420</td><td class="hits">0</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="miss"><td class="line">421</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">422</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">423</td><td class="hits">0</td><td class="source"> return fs.chmodSync(p, mode);</td></tr><tr><td class="line">424</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">425</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">426</td><td class="hits"></td><td class="source"> * 获取文件内容</td></tr><tr><td class="line">427</td><td class="hits"></td><td class="source"> * @param {[type]} file [description]</td></tr><tr><td class="line">428</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">429</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">430</td><td class="hits">1</td><td class="source">global.getFileContent = function(file, encoding){</td></tr><tr class="hit"><td class="line">431</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">432</td><td class="hits">1</td><td class="source"> if (!fs.existsSync(file)) {</td></tr><tr class="miss"><td class="line">433</td><td class="hits">0</td><td class="source"> return '';</td></tr><tr><td class="line">434</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">435</td><td class="hits">1</td><td class="source"> return fs.readFileSync(file, encoding || 'utf8');</td></tr><tr><td class="line">436</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">437</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">438</td><td class="hits"></td><td class="source"> * 设置文件内容</td></tr><tr><td class="line">439</td><td class="hits"></td><td class="source"> * @param {[type]} file [description]</td></tr><tr><td class="line">440</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">441</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">442</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">443</td><td class="hits">1</td><td class="source">global.setFileContent = function(file, data){</td></tr><tr class="miss"><td class="line">444</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">445</td><td class="hits">0</td><td class="source"> var filepath = path.dirname(file);</td></tr><tr class="miss"><td class="line">446</td><td class="hits">0</td><td class="source"> mkdir(filepath);</td></tr><tr class="miss"><td class="line">447</td><td class="hits">0</td><td class="source"> return fs.writeFileSync(file, data);</td></tr><tr><td class="line">448</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">449</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">450</td><td class="hits"></td><td class="source"> * 大写首字符</td></tr><tr><td class="line">451</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">452</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">453</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">454</td><td class="hits">1</td><td class="source">global.ucfirst = function(name){</td></tr><tr class="hit"><td class="line">455</td><td class="hits">5</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">456</td><td class="hits">5</td><td class="source"> name = (name || '') + '';</td></tr><tr class="hit"><td class="line">457</td><td class="hits">5</td><td class="source"> return name.substr(0,1).toUpperCase() + name.substr(1).toLowerCase();</td></tr><tr><td class="line">458</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">459</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">460</td><td class="hits"></td><td class="source"> * 获取字符串的md5</td></tr><tr><td class="line">461</td><td class="hits"></td><td class="source"> * @param {[type]} str [description]</td></tr><tr><td class="line">462</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">463</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">464</td><td class="hits">1</td><td class="source">global.md5 = function(str){</td></tr><tr class="miss"><td class="line">465</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">466</td><td class="hits">0</td><td class="source"> var instance = crypto.createHash('md5');</td></tr><tr class="miss"><td class="line">467</td><td class="hits">0</td><td class="source"> instance.update(str + '');</td></tr><tr class="miss"><td class="line">468</td><td class="hits">0</td><td class="source"> return instance.digest('hex');</td></tr><tr><td class="line">469</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">470</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">471</td><td class="hits"></td><td class="source"> * 生成一个promise,如果传入的参数是promise则直接返回</td></tr><tr><td class="line">472</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">473</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">474</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">475</td><td class="hits">1</td><td class="source">global.getPromise = function(obj, reject){</td></tr><tr class="hit"><td class="line">476</td><td class="hits">24</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">477</td><td class="hits">24</td><td class="source"> if (isPromise(obj)) {</td></tr><tr class="miss"><td class="line">478</td><td class="hits">0</td><td class="source"> return obj;</td></tr><tr><td class="line">479</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">480</td><td class="hits">24</td><td class="source"> if (reject) {</td></tr><tr class="miss"><td class="line">481</td><td class="hits">0</td><td class="source"> return Promise.reject(obj);</td></tr><tr><td class="line">482</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">483</td><td class="hits">24</td><td class="source"> return Promise.resolve(obj);</td></tr><tr><td class="line">484</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">485</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">486</td><td class="hits"></td><td class="source"> * 生成一个defer对象</td></tr><tr><td class="line">487</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">488</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">489</td><td class="hits">1</td><td class="source">global.getDefer = function(){</td></tr><tr class="hit"><td class="line">490</td><td class="hits">3</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">491</td><td class="hits">3</td><td class="source"> var deferred = {};</td></tr><tr class="hit"><td class="line">492</td><td class="hits">3</td><td class="source"> deferred.promise = new Promise(function(resolve, reject){</td></tr><tr class="hit"><td class="line">493</td><td class="hits">3</td><td class="source"> deferred.resolve = resolve;</td></tr><tr class="hit"><td class="line">494</td><td class="hits">3</td><td class="source"> deferred.reject = reject;</td></tr><tr><td class="line">495</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">496</td><td class="hits">3</td><td class="source"> return deferred;</td></tr><tr><td class="line">497</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">498</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">499</td><td class="hits"></td><td class="source"> * 快速生成一个object</td></tr><tr><td class="line">500</td><td class="hits"></td><td class="source"> * @param {[type]} key [description]</td></tr><tr><td class="line">501</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">502</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">503</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">504</td><td class="hits">1</td><td class="source">global.getObject = function(key, value){</td></tr><tr class="miss"><td class="line">505</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">506</td><td class="hits">0</td><td class="source"> var obj = {};</td></tr><tr class="miss"><td class="line">507</td><td class="hits">0</td><td class="source"> if (!isArray(key)) {</td></tr><tr class="miss"><td class="line">508</td><td class="hits">0</td><td class="source"> obj[key] = value;</td></tr><tr class="miss"><td class="line">509</td><td class="hits">0</td><td class="source"> return obj;</td></tr><tr><td class="line">510</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">511</td><td class="hits">0</td><td class="source"> key.forEach(function(item, i){</td></tr><tr class="miss"><td class="line">512</td><td class="hits">0</td><td class="source"> obj[item] = value[i];</td></tr><tr><td class="line">513</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">514</td><td class="hits">0</td><td class="source"> return obj;</td></tr><tr><td class="line">515</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">516</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">517</td><td class="hits"></td><td class="source"> * 将数组变成对象</td></tr><tr><td class="line">518</td><td class="hits"></td><td class="source"> * @param {[type]} arr [description]</td></tr><tr><td class="line">519</td><td class="hits"></td><td class="source"> * @param {[type]} key [description]</td></tr><tr><td class="line">520</td><td class="hits"></td><td class="source"> * @param {[type]} valueKeys [description]</td></tr><tr><td class="line">521</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">522</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">523</td><td class="hits">1</td><td class="source">global.arrToObj = function(arr, key, valueKey){</td></tr><tr class="miss"><td class="line">524</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">525</td><td class="hits">0</td><td class="source"> var result = {};</td></tr><tr class="miss"><td class="line">526</td><td class="hits">0</td><td class="source"> var arrResult = [];</td></tr><tr class="miss"><td class="line">527</td><td class="hits">0</td><td class="source"> arr.forEach(function(item){</td></tr><tr class="miss"><td class="line">528</td><td class="hits">0</td><td class="source"> var keyValue = item[key];</td></tr><tr class="miss"><td class="line">529</td><td class="hits">0</td><td class="source"> if (valueKey === null) {</td></tr><tr class="miss"><td class="line">530</td><td class="hits">0</td><td class="source"> arrResult.push(keyValue);</td></tr><tr class="miss"><td class="line">531</td><td class="hits">0</td><td class="source"> }else if (valueKey) {</td></tr><tr class="miss"><td class="line">532</td><td class="hits">0</td><td class="source"> result[keyValue] = item[valueKey];</td></tr><tr><td class="line">533</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">534</td><td class="hits">0</td><td class="source"> result[keyValue] = item;</td></tr><tr><td class="line">535</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">536</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">537</td><td class="hits">0</td><td class="source"> return valueKey === null ? arrResult : result;</td></tr><tr><td class="line">538</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Common/extend.js">/Users/welefen/Develop/git/thinkjs/lib/Common/extend.js</h2><div id="stats" class="low"><div class="percentage">46%</div><div class="sloc">13</div><div class="hits">6</div><div class="misses">7</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">//该文件内容为原生对象的扩展</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * 获取对象的值</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">Object.values = function(obj){</td></tr><tr class="hit"><td class="line">9</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">10</td><td class="hits">2</td><td class="source"> var values = [];</td></tr><tr class="hit"><td class="line">11</td><td class="hits">2</td><td class="source"> for(var key in obj){</td></tr><tr class="miss"><td class="line">12</td><td class="hits">0</td><td class="source"> if (obj.hasOwnProperty(key)) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> values.push(obj[key])</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">16</td><td class="hits">2</td><td class="source"> return values;</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> * 数组求和</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source">Array.prototype.sum = function(){</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">24</td><td class="hits">0</td><td class="source"> var count = 0;</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> this.forEach(function(item){</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> count += parseFloat(item) || 0;</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> return count;</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Common/function.js">/Users/welefen/Develop/git/thinkjs/lib/Common/function.js</h2><div id="stats" class="medium"><div class="percentage">53%</div><div class="sloc">163</div><div class="hits">87</div><div class="misses">76</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var path = require('path');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var _alias = {};</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var _autoload_callbacks = [];</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * thinkRequire获取到的路径</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source">global.getThinkRequirePath = function(name){</td></tr><tr class="hit"><td class="line">13</td><td class="hits">27</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">14</td><td class="hits">27</td><td class="source"> if (_alias[name]) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">19</td><td class="source"> return _alias[name];</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">17</td><td class="hits">8</td><td class="source"> var result = '';</td></tr><tr class="hit"><td class="line">18</td><td class="hits">8</td><td class="source"> _autoload_callbacks.some(function(callback){</td></tr><tr class="hit"><td class="line">19</td><td class="hits">8</td><td class="source"> result = callback && callback(name);</td></tr><tr class="hit"><td class="line">20</td><td class="hits">8</td><td class="source"> if (result) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">8</td><td class="source"> return true;</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">24</td><td class="hits">8</td><td class="source"> return result;</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> * 自定义的require, 加入别名功能</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> * @type {[type]}</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">30</td><td class="hits">1</td><td class="source">global.thinkRequire = function(name){</td></tr><tr class="hit"><td class="line">31</td><td class="hits">26</td><td class="source"> 'use strict';</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> //如果不是字符串则直接返回</td></tr><tr class="hit"><td class="line">33</td><td class="hits">26</td><td class="source"> if (!isString(name)) {</td></tr><tr class="miss"><td class="line">34</td><td class="hits">0</td><td class="source"> return name;</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">36</td><td class="hits">26</td><td class="source"> var path = name;</td></tr><tr class="hit"><td class="line">37</td><td class="hits">26</td><td class="source"> if (path[0] !== '/') {</td></tr><tr class="hit"><td class="line">38</td><td class="hits">26</td><td class="source"> path = getThinkRequirePath(name);</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">40</td><td class="hits">26</td><td class="source"> if (path) {</td></tr><tr class="hit"><td class="line">41</td><td class="hits">26</td><td class="source"> var obj = require(path);</td></tr><tr class="hit"><td class="line">42</td><td class="hits">26</td><td class="source"> if (isFunction(obj)) {</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> //修正子类继承的方法获取到正确的文件名</td></tr><tr class="hit"><td class="line">44</td><td class="hits">23</td><td class="source"> obj.prototype.__filename = path;</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">46</td><td class="hits">26</td><td class="source"> return obj;</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">48</td><td class="hits">0</td><td class="source"> return require(name);</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> * 注册require</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> * @param {Function} callback [description]</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">55</td><td class="hits">1</td><td class="source">global.registerAutoload = function(callback){</td></tr><tr class="hit"><td class="line">56</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">57</td><td class="hits">1</td><td class="source"> _autoload_callbacks.push(callback);</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> * 别名</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source">global.aliasImport = function(alias, classFile){</td></tr><tr class="hit"><td class="line">64</td><td class="hits">9</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">65</td><td class="hits">9</td><td class="source"> if (isString(alias)) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">8</td><td class="source"> _alias[alias] = classFile;</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">68</td><td class="hits">1</td><td class="source"> _alias = extend(_alias, alias);</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source">//常用类的基类</td></tr><tr class="hit"><td class="line">73</td><td class="hits">1</td><td class="source">['Cache', 'Behavior', 'Controller', 'Session', 'Model', 'Db'].forEach(function(item){</td></tr><tr class="hit"><td class="line">74</td><td class="hits">6</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">75</td><td class="hits">6</td><td class="source"> global[item] = function(super_, obj){</td></tr><tr class="hit"><td class="line">76</td><td class="hits">7</td><td class="source"> if (isString(super_)) {</td></tr><tr class="miss"><td class="line">77</td><td class="hits">0</td><td class="source"> return Class(obj, thinkRequire(super_));</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">79</td><td class="hits">7</td><td class="source"> return Class(super_, thinkRequire(item));</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source">});</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> * 调用一个指定的行为</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source">global.B = function(name, http, data){</td></tr><tr class="hit"><td class="line">89</td><td class="hits">11</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">90</td><td class="hits">11</td><td class="source"> if (!name) {</td></tr><tr class="miss"><td class="line">91</td><td class="hits">0</td><td class="source"> return data;</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">93</td><td class="hits">11</td><td class="source"> if (typeof name === 'function') {</td></tr><tr class="hit"><td class="line">94</td><td class="hits">1</td><td class="source"> return name(http, data);</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">96</td><td class="hits">10</td><td class="source"> return thinkRequire(name + 'Behavior')(http).run(data);</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> * 处理标签扩展</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">103</td><td class="hits">1</td><td class="source">global.tag = function(name, http, data){</td></tr><tr class="hit"><td class="line">104</td><td class="hits">12</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">105</td><td class="hits">12</td><td class="source"> var tags = (C('tag.' + name) || []).slice();</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> //tag处理的数据</td></tr><tr class="hit"><td class="line">107</td><td class="hits">12</td><td class="source"> http.tag_data = data;</td></tr><tr class="hit"><td class="line">108</td><td class="hits">12</td><td class="source"> if (!tags.length) {</td></tr><tr class="hit"><td class="line">109</td><td class="hits">5</td><td class="source"> return getPromise(http.tag_data);</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">111</td><td class="hits">7</td><td class="source"> var index = 0;</td></tr><tr class="hit"><td class="line">112</td><td class="hits">7</td><td class="source"> function runBehavior(){</td></tr><tr class="hit"><td class="line">113</td><td class="hits">14</td><td class="source"> var behavior = tags[index++];</td></tr><tr class="hit"><td class="line">114</td><td class="hits">14</td><td class="source"> if (!behavior) {</td></tr><tr class="hit"><td class="line">115</td><td class="hits">7</td><td class="source"> return getPromise(http.tag_data);</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">117</td><td class="hits">7</td><td class="source"> var result = B(behavior, http, http.tag_data);</td></tr><tr class="hit"><td class="line">118</td><td class="hits">7</td><td class="source"> return getPromise(result).then(function(data){</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> //如果返回值不是undefined,那么认为有返回值</td></tr><tr class="hit"><td class="line">120</td><td class="hits">7</td><td class="source"> if (data !== undefined) {</td></tr><tr class="hit"><td class="line">121</td><td class="hits">6</td><td class="source"> http.tag_data = data;</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">123</td><td class="hits">7</td><td class="source"> return runBehavior();</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">126</td><td class="hits">7</td><td class="source"> return runBehavior();</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> * 配置读取和写入</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">131</td><td class="hits">1</td><td class="source">var _config = {};</td></tr><tr class="hit"><td class="line">132</td><td class="hits">1</td><td class="source">global.C = function(name, value){</td></tr><tr class="hit"><td class="line">133</td><td class="hits">77</td><td class="source"> 'use strict';</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> //获取所有的配置</td></tr><tr class="hit"><td class="line">135</td><td class="hits">77</td><td class="source"> if (arguments.length === 0) {</td></tr><tr class="hit"><td class="line">136</td><td class="hits">1</td><td class="source"> return _config;</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> //清除所有的配置</td></tr><tr class="hit"><td class="line">139</td><td class="hits">76</td><td class="source"> if (name === null) {</td></tr><tr class="hit"><td class="line">140</td><td class="hits">1</td><td class="source"> _config = {};</td></tr><tr class="hit"><td class="line">141</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">143</td><td class="hits">75</td><td class="source"> if (isString(name)) {</td></tr><tr class="hit"><td class="line">144</td><td class="hits">72</td><td class="source"> name = name.toLowerCase();</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> //name里不含. 一级</td></tr><tr class="hit"><td class="line">146</td><td class="hits">72</td><td class="source"> if (name.indexOf('.') === -1) {</td></tr><tr class="hit"><td class="line">147</td><td class="hits">60</td><td class="source"> if (value === undefined) {</td></tr><tr class="hit"><td class="line">148</td><td class="hits">59</td><td class="source"> return _config[name];</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">150</td><td class="hits">1</td><td class="source"> _config[name] = value;</td></tr><tr class="hit"><td class="line">151</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> //name中含有. 二级</td></tr><tr class="hit"><td class="line">154</td><td class="hits">12</td><td class="source"> name = name.split('.');</td></tr><tr class="hit"><td class="line">155</td><td class="hits">12</td><td class="source"> if (value === undefined) {</td></tr><tr class="hit"><td class="line">156</td><td class="hits">12</td><td class="source"> value = _config[name[0]] || {};</td></tr><tr class="hit"><td class="line">157</td><td class="hits">12</td><td class="source"> return value[name[1]];</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">159</td><td class="hits">0</td><td class="source"> if (!_config[name[0]]) {</td></tr><tr class="miss"><td class="line">160</td><td class="hits">0</td><td class="source"> _config[name[0]] = {};</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">162</td><td class="hits">0</td><td class="source"> _config[name[0]][name[1]] = value;</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">164</td><td class="hits">3</td><td class="source"> _config = extend(_config, name);</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> * 实例化Controller类,可以调用一个具体的Action</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> * A('Home/Index'), A('Admin/Index/test')</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">172</td><td class="hits">1</td><td class="source">global.A = function(name, http, data){</td></tr><tr class="miss"><td class="line">173</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> //将/转为:,兼容之前的方式</td></tr><tr class="miss"><td class="line">175</td><td class="hits">0</td><td class="source"> name = name.replace(/\//g, ':').split(':');</td></tr><tr class="miss"><td class="line">176</td><td class="hits">0</td><td class="source"> http.group = name[0];</td></tr><tr class="miss"><td class="line">177</td><td class="hits">0</td><td class="source"> http.controller = name[1];</td></tr><tr class="miss"><td class="line">178</td><td class="hits">0</td><td class="source"> var App = thinkRequire('App');</td></tr><tr class="miss"><td class="line">179</td><td class="hits">0</td><td class="source"> var instance = App.getBaseController(http);</td></tr><tr class="miss"><td class="line">180</td><td class="hits">0</td><td class="source"> if (!instance) {</td></tr><tr class="miss"><td class="line">181</td><td class="hits">0</td><td class="source"> return instance;</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">183</td><td class="hits">0</td><td class="source"> var action = name[2];</td></tr><tr class="miss"><td class="line">184</td><td class="hits">0</td><td class="source"> if (!action) {</td></tr><tr class="miss"><td class="line">185</td><td class="hits">0</td><td class="source"> return instance;</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">187</td><td class="hits">0</td><td class="source"> http.action = action;</td></tr><tr class="miss"><td class="line">188</td><td class="hits">0</td><td class="source"> return getPromise(instance.__initReturn).then(function(){</td></tr><tr class="miss"><td class="line">189</td><td class="hits">0</td><td class="source"> if (data && !isArray(data)) {</td></tr><tr class="miss"><td class="line">190</td><td class="hits">0</td><td class="source"> data = [data];</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">192</td><td class="hits">0</td><td class="source"> return App.execAction(instance, action, data);</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> * 快速文件读取和写入</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> * 默认写入到App/Runtime/Data目录下</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">200</td><td class="hits">1</td><td class="source">global.F = function(name, value, rootPath){</td></tr><tr class="miss"><td class="line">201</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">202</td><td class="hits">0</td><td class="source"> rootPath = rootPath || DATA_PATH;</td></tr><tr class="miss"><td class="line">203</td><td class="hits">0</td><td class="source"> var filePath = rootPath + '/' + name + '.json';</td></tr><tr class="miss"><td class="line">204</td><td class="hits">0</td><td class="source"> if (value !== undefined) {</td></tr><tr class="miss"><td class="line">205</td><td class="hits">0</td><td class="source"> mkdir(path.dirname(filePath));</td></tr><tr class="miss"><td class="line">206</td><td class="hits">0</td><td class="source"> fs.writeFileSync(filePath, JSON.stringify(value));</td></tr><tr class="miss"><td class="line">207</td><td class="hits">0</td><td class="source"> chmod(filePath);</td></tr><tr class="miss"><td class="line">208</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">210</td><td class="hits">0</td><td class="source"> if (isFile(filePath)) {</td></tr><tr class="miss"><td class="line">211</td><td class="hits">0</td><td class="source"> var content = getFileContent(filePath);</td></tr><tr class="miss"><td class="line">212</td><td class="hits">0</td><td class="source"> if (content) {</td></tr><tr class="miss"><td class="line">213</td><td class="hits">0</td><td class="source"> return JSON.parse(content);</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">216</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> * 实例化模型</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">221</td><td class="hits">1</td><td class="source">global.D = function(name, config){</td></tr><tr class="miss"><td class="line">222</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">223</td><td class="hits">0</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">224</td><td class="hits">0</td><td class="source"> return thinkRequire('Model')(name, config);</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">226</td><td class="hits">0</td><td class="source"> name = name.split(':');</td></tr><tr class="miss"><td class="line">227</td><td class="hits">0</td><td class="source"> name[0] = name[0][0].toUpperCase() + name[0].slice(1);</td></tr><tr class="miss"><td class="line">228</td><td class="hits">0</td><td class="source"> var path = getThinkRequirePath(name[0] + 'Model');</td></tr><tr class="miss"><td class="line">229</td><td class="hits">0</td><td class="source"> if (path) {</td></tr><tr class="miss"><td class="line">230</td><td class="hits">0</td><td class="source"> return thinkRequire(name[0] + 'Model')(name[1], config);</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">232</td><td class="hits">0</td><td class="source"> return thinkRequire(name[1] === 'AdvModel' ? 'AdvModel' : 'Model')(name[0], config);</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">235</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> * 实例化模型基类</td></tr><tr><td class="line">237</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">238</td><td class="hits"></td><td class="source"> * @param {[type]} config [description]</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">240</td><td class="hits">1</td><td class="source">global.M = function(name, config){</td></tr><tr class="miss"><td class="line">241</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">242</td><td class="hits">0</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">243</td><td class="hits">0</td><td class="source"> return thinkRequire('Model')(name, config);</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">245</td><td class="hits">0</td><td class="source"> name = name.split(':');</td></tr><tr class="miss"><td class="line">246</td><td class="hits">0</td><td class="source"> var model = name[1] === 'AdvModel' ? 'AdvModel' : 'Model';</td></tr><tr class="miss"><td class="line">247</td><td class="hits">0</td><td class="source"> return thinkRequire(model)(name[0], config)</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> * 缓存的设置和读取</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> * 获取返回的是一个promise</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">253</td><td class="hits">1</td><td class="source">global.S = function(name, value, options){</td></tr><tr class="miss"><td class="line">254</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">255</td><td class="hits">0</td><td class="source"> if (isNumber(options)) {</td></tr><tr class="miss"><td class="line">256</td><td class="hits">0</td><td class="source"> options = {timeout: options};</td></tr><tr class="miss"><td class="line">257</td><td class="hits">0</td><td class="source"> }else if (options === true) {</td></tr><tr class="miss"><td class="line">258</td><td class="hits">0</td><td class="source"> options = {type: true}</td></tr><tr><td class="line">259</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">260</td><td class="hits">0</td><td class="source"> options = options || {};</td></tr><tr class="miss"><td class="line">261</td><td class="hits">0</td><td class="source"> var type = options.type === undefined ? C('cache_type') : options.type;</td></tr><tr class="miss"><td class="line">262</td><td class="hits">0</td><td class="source"> var cls = (type === true ? '' : ucfirst(type)) + 'Cache';</td></tr><tr class="miss"><td class="line">263</td><td class="hits">0</td><td class="source"> var instance = thinkRequire(cls)(options);</td></tr><tr class="miss"><td class="line">264</td><td class="hits">0</td><td class="source"> if (value === undefined) {//获取缓存</td></tr><tr class="miss"><td class="line">265</td><td class="hits">0</td><td class="source"> return instance.get(name);</td></tr><tr class="miss"><td class="line">266</td><td class="hits">0</td><td class="source"> }else if (value === null) {</td></tr><tr class="miss"><td class="line">267</td><td class="hits">0</td><td class="source"> return instance.rm(name); //删除缓存</td></tr><tr class="miss"><td class="line">268</td><td class="hits">0</td><td class="source"> }else if (isFunction(value)) { //获取缓存,如果不存在,则自动从回调里获取</td></tr><tr class="miss"><td class="line">269</td><td class="hits">0</td><td class="source"> var fromCache = false;</td></tr><tr class="miss"><td class="line">270</td><td class="hits">0</td><td class="source"> var cacheData = null;</td></tr><tr class="miss"><td class="line">271</td><td class="hits">0</td><td class="source"> return instance.get(name).then(function(data){</td></tr><tr class="miss"><td class="line">272</td><td class="hits">0</td><td class="source"> fromCache = !isEmpty(data);</td></tr><tr class="miss"><td class="line">273</td><td class="hits">0</td><td class="source"> return fromCache ? data : value();</td></tr><tr><td class="line">274</td><td class="hits"></td><td class="source"> }).then(function(data){</td></tr><tr class="miss"><td class="line">275</td><td class="hits">0</td><td class="source"> cacheData = data;</td></tr><tr class="miss"><td class="line">276</td><td class="hits">0</td><td class="source"> return fromCache ? data : S(name, data, options);</td></tr><tr><td class="line">277</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="miss"><td class="line">278</td><td class="hits">0</td><td class="source"> return cacheData;</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">281</td><td class="hits">0</td><td class="source"> return instance.set(name, value, options.timeout);</td></tr><tr><td class="line">282</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">285</td><td class="hits"></td><td class="source"> * 语言</td></tr><tr><td class="line">286</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">287</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">288</td><td class="hits">1</td><td class="source">global.L = function(name){</td></tr><tr class="miss"><td class="line">289</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">290</td><td class="hits">0</td><td class="source"> return name;</td></tr><tr><td class="line">291</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Conf/alias.js">/Users/welefen/Develop/git/thinkjs/lib/Conf/alias.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">1</div><div class="hits">1</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 模块别名,模块名到具体的路径,模块名不能有重复</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * 使用thinkRequire加载模块时有效</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> Controller: THINK_LIB_PATH + '/Core/Controller.js',</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> App: THINK_LIB_PATH + '/Core/App.js',</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> Behavior: THINK_LIB_PATH + '/Util/Behavior.js',</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> Cache: THINK_LIB_PATH + '/Util/Cache.js',</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> Db: THINK_LIB_PATH + '/Core/Db.js',</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> Dispatcher: THINK_LIB_PATH + '/Core/Dispatcher.js',</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> Filter: THINK_LIB_PATH + '/Util/Filter.js',</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> Http: THINK_LIB_PATH + '/Core/Http.js',</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> Log: THINK_LIB_PATH + '/Util/Log.js',</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> Model: THINK_LIB_PATH + '/Core/Model.js',</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> Session: THINK_LIB_PATH + '/Util/Session.js',</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> Think: THINK_LIB_PATH + '/Core/Think.js',</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> Valid: THINK_LIB_PATH + '/Util/Valid.js',</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> View: THINK_LIB_PATH + '/Core/View.js',</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> Cookie: THINK_LIB_PATH + '/Util/Cookie.js',</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> WebSocket: THINK_LIB_PATH + '/Util/WebSocket.js',</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> Auth: THINK_LIB_PATH + '/Util/Auth.js'</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Conf/config.js">/Users/welefen/Develop/git/thinkjs/lib/Conf/config.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">1</div><div class="hits">1</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 框架默认配置</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * 可以在App/Conf/config.js里修改下面的配置值</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> port: 8360, //监听端口</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> use_proxy: false, //是否使用代理访问,如:nginx。开启后不能通过ip+端口直接访问</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> encoding: 'utf8', //输出数据的编码</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> url_pathname_prefix: '', //不解析的pathname前缀</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> url_pathname_suffix: '.html', //不解析的pathname后缀,这样利于seo</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> app_tag_on: true, //是否支持标签功能</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> url_resource_on: true, //是否监听静态资源类请求</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> url_resource_reg: /^(resource\/|static\/|favicon\.ico)/, //判断是否是静态资源的正则</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> url_route_on: true, //是否开启自定义路由功能</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> post_json_content_type: ['application/json'], //post数据为json时的content-type</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> post_max_file_size: 1024 * 1024 * 1024, //上传文件大小限制,默认1G</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> post_max_fields: 100, //最大表单数,默认为100</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> post_max_fields_size: 2 * 1024 * 1024, //单个表单长度最大值,默认为2MB</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> app_group_list: ['Home', 'Admin', 'Restful'], //分组列表</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> default_group: 'Home', //默认分组</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> default_controller: 'Index', //默认模块</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> default_action: 'index', //默认Action</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> call_controller: 'Home:Index:_404', //controller不存在时执行方法,此配置表示调用Home分组下IndexController的_404Action方法</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> call_method: '__call', //当找不到方法时调用什么方法,这个方法存在时才有效</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> before_action: '__before', //调用一个action前调用的方法,会将action名传递进去</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> after_action: '__after', //调用一个action之后调用的方法,会将action名传递进去</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> url_params_bind: true, //方法参数绑定,将URL参数值绑定到action的参数上</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> action_suffix: 'Action', //action后缀</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> url_callback_name: 'callback', //jsonp格式的callback名字</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> json_content_type: 'application/json', //发送json时的content-type</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> auto_send_content_type: true, //是否自动发送Content-Type,默认值为`tpl_content_type`配置值</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> log_process_pid: true, //记录进程的id,方便其他脚本处理。</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> use_cluster: false, //是否使用cluster,默认不使用,0:为cpu的数量,可以自定义值</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> autoload_path: {}, //autoload查找的path,用于thinkRequire加载自定义库的时候查找</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> create_server_fn: '', //自定义create server全局函数名,可以在Common/common.js里实现</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> restful_group: 'Restful', //RESTFUL API默认分组</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> load_ext_config: [], //加载额外的配置文件 CONF_PATH</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> load_ext_file: [], //加载额外的文件 COMMON_PATH</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> use_websocket: false, //是否使用websocket</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> websocket_allow_origin: '', //允许从那里发送过来的websocket,可以是字符串、数组、回调函数,为空表示不检测</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> websocket_sub_protocal: '', //websocket子协议,可以是个字符串也可以是回调函数</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> websocket_message_handle: undefined, //websocket消息处理函数</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> error_tpl_path: THINK_PATH + '/View/error.html', //错误页模版</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> error_no_key: 'errno', //错误number的key</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> error_no_default_value: 1000, //错误号默认值</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> error_msg_key: 'errmsg', //错误消息的key</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> cookie_domain: '', //cookie有效域名</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> cookie_path: '/', //cookie路径</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> cookie_timeout: 0, //cookie失效时间,0为浏览器关闭,单位:秒</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> session_name: 'thinkjs', //session对应的cookie名称</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> session_type: 'File', //session存储类型, 空为内存,还可以为File</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> session_path: '', //File类型下文件存储位置,默认为系统的tmp目录</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> session_options: {}, //session对应的cookie选项</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> session_sign: '', //session对应的cookie使用签名</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> session_timeout: 24 * 3600, //服务器上session失效时间,单位:秒</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> db_type: 'mysql', // 数据库类型</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> db_host: '127.0.0.1', // 服务器地址</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> db_port: '', // 端口</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> db_name: '', // 数据库名</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> db_user: 'root', // 用户名</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> db_pwd: '', // 密码</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> db_prefix: 'think_', // 数据库表前缀</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> db_fieldtype_check: false, // 是否进行字段类型检查</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> db_fields_cache: true, // 启用字段缓存</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> db_charset: 'utf8', // 数据库编码默认采用utf8</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> db_nums_per_page: 20, //默认每页显示的条数</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> db_like_fields: [], //自动进行模糊查询,|连接,如: ['title', 'content']</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> db_cache_on: true, //是否启用查询缓存,如果关闭那么cache方法则无效</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> db_cache_type: '', //缓存类型,默认为内存缓存</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> db_cache_path: CACHE_PATH + '/db', //缓存路径,File类型下有效</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> db_cache_timeout: 3600, //缓存时间,默认为1个小时</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> db_log_sql: false, //是否打印sql语句</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> tpl_content_type: 'text/html', //模版输出类型</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> tpl_file_suffix: '.html', //模版文件名后缀</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> tpl_file_depr: '_', //controller和action之间的分隔符</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> tpl_engine_type: 'ejs', //模版引擎名称</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> tpl_engine_config: {}, </td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> log_record: false, //是否记录日志,开启后会重写console.log等系列方法</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> log_file_path: LOG_PATH, //日志文件存在路径</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> log_console_type: ['error'], //默认只接管console.error日志</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> cache_type: 'File', //数据缓存类型</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> cache_timeout: 6 * 3600, //数据缓存有效期,单位: 秒</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> cache_path: CACHE_PATH, //缓存路径设置 (File缓存方式有效)</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> cache_file_suffix: '.json', //File缓存方式下文件后缀名</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> cache_gc_hour: [4], //缓存清除的时间点,数据为小时</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> html_cache_on: false, //HTML静态缓存</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> html_cache_timeout: 3600, //缓存时间,单位为秒</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> html_cache_rules: {}, //缓存规则</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> html_cache_path: CACHE_PATH + '/html',</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> html_cache_file_callback: undefined, //生成缓存文件的回调函数</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> html_cache_file_suffix: '.html', //缓存文件后缀名</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> memcache_host: '127.0.0.1', //memcache host</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> memcache_port: 11211, //memecache端口</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Conf/mode.js">/Users/welefen/Develop/git/thinkjs/lib/Conf/mode.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">1</div><div class="hits">1</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 不同模式下的配置文件</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * 由于每个模式下的配置可能都比较少,所以放在一个文件里</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> cli: {</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> use_cluster: false, //使用cluster</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> html_cache_on: false,</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> log_process_pid: false,</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> clear_require_cache: false,</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> auto_close_db: false //自动关闭数据库连接</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> cli_debug: {</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> clear_require_cache: false</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Conf/tag.js">/Users/welefen/Develop/git/thinkjs/lib/Conf/tag.js</h2><div id="stats" class="low"><div class="percentage">41%</div><div class="sloc">12</div><div class="hits">5</div><div class="misses">7</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 系统标签配置</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * 可以在App/Conf/tag.js里进行修改</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * 命令行模式下执行后自动关闭数据库连接</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">var closeDbConnect = function(){</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source"> if(C('auto_close_db') && APP_MODE === 'cli'){</td></tr><tr class="miss"><td class="line">14</td><td class="hits">0</td><td class="source"> thinkRequire('Model').close();</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> * 解析提交的json数据</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source">var jsonParse = function(http){</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">24</td><td class="hits">0</td><td class="source"> var jsonConentType = C('post_json_content_type');</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> if (!isArray(jsonConentType)) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> jsonConentType = [jsonConentType];</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> if (jsonConentType.indexOf(http.contentType) > -1) {</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> http.post = JSON.parse(http.payload) || {};</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">33</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> //应用初始化</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> app_init: [],</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> //表单数据解析</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> form_parse: [jsonParse],</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> //pathinfo解析</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> path_info: [],</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> //静态资源请求检测</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> resource_check: ['CheckResource'],</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> //路由检测</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> route_check: ['CheckRoute'],</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> //应用开始</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> app_begin: ['ReadHtmlCache'],</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> //action执行初始化</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> action_init: [],</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> //模版解析初始化</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> view_init: [],</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> //定位模版文件</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> view_template: ['LocationTemplate'],</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> //模版解析</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> view_parse: ['ParseTemplate'],</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> //模版内容过滤</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> view_filter: [],</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> //模版解析结束</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> view_end: ['WriteHtmlCache'],</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> //action结束</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> action_end: [],</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> //应用结束</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> app_end: [closeDbConnect]</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/CheckResourceBehavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/CheckResourceBehavior.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">25</div><div class="hits">25</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var mime = require('mime');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * 静态资源请求</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">module.exports = Behavior(function(){</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> options: {</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> 'url_resource_on': false</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> run: function(){</td></tr><tr class="hit"><td class="line">14</td><td class="hits">5</td><td class="source"> if (!RESOURCE_PATH || !this.options.url_resource_on || !this.http.pathname) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">17</td><td class="hits">4</td><td class="source"> var pathname = this.http.pathname;</td></tr><tr class="hit"><td class="line">18</td><td class="hits">4</td><td class="source"> if (pathname.indexOf('/') === 0) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source"> pathname = pathname.substr(1);</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">21</td><td class="hits">4</td><td class="source"> var reg = C('url_resource_reg');</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> //通过正则判断是否是静态资源请求</td></tr><tr class="hit"><td class="line">23</td><td class="hits">4</td><td class="source"> if (!reg.test(pathname)) {</td></tr><tr class="hit"><td class="line">24</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">27</td><td class="hits">3</td><td class="source"> var file = RESOURCE_PATH + '/' + pathname;</td></tr><tr class="hit"><td class="line">28</td><td class="hits">3</td><td class="source"> var res = this.http.res;</td></tr><tr class="hit"><td class="line">29</td><td class="hits">3</td><td class="source"> if (fs.existsSync(file)) {</td></tr><tr class="hit"><td class="line">30</td><td class="hits">2</td><td class="source"> var contentType = mime.lookup(file);</td></tr><tr class="hit"><td class="line">31</td><td class="hits">2</td><td class="source"> var fileStream = fs.createReadStream(file);</td></tr><tr class="hit"><td class="line">32</td><td class="hits">2</td><td class="source"> res.setHeader('Content-Type', contentType + '; charset=' + C('encoding'));</td></tr><tr class="hit"><td class="line">33</td><td class="hits">2</td><td class="source"> fileStream.pipe(res);</td></tr><tr class="hit"><td class="line">34</td><td class="hits">2</td><td class="source"> fileStream.on('end', function(){</td></tr><tr class="hit"><td class="line">35</td><td class="hits">2</td><td class="source"> res.end();</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">38</td><td class="hits">1</td><td class="source"> res.statusCode = 404;</td></tr><tr class="hit"><td class="line">39</td><td class="hits">1</td><td class="source"> res.end();</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> //返回一个pendding promise, 不让后续执行</td></tr><tr class="hit"><td class="line">42</td><td class="hits">2</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/CheckRouteBehavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/CheckRouteBehavior.js</h2><div id="stats" class="terrible"><div class="percentage">9%</div><div class="sloc">108</div><div class="hits">10</div><div class="misses">98</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 检测路由行为</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * 通过自定义路由识别到对应的URL上</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var url = require('url');</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">var Dispatcher = thinkRequire('Dispatcher');</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source">module.exports = Behavior(function(){</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> options: {</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> 'url_route_on': false, //是否开启自定义URL路由</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> 'url_route_rules': [] //自定义URL路由规则</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> run: function(){</td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source"> if (!this.options.url_route_on) {</td></tr><tr class="miss"><td class="line">18</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source"> var routes = this.options.url_route_rules;</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> var length = routes.length;</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source"> if (length === 0) {</td></tr><tr class="hit"><td class="line">23</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> var pathname = this.http.pathname;</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> var match;</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> for(var i = 0; i < length; i++){</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> var route = routes[i];</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> var rule = route[0];</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> //正则路由</td></tr><tr class="miss"><td class="line">31</td><td class="hits">0</td><td class="source"> if (isRegexp(rule)) {</td></tr><tr class="miss"><td class="line">32</td><td class="hits">0</td><td class="source"> match = pathname.match(rule);</td></tr><tr class="miss"><td class="line">33</td><td class="hits">0</td><td class="source"> if (match) {</td></tr><tr class="miss"><td class="line">34</td><td class="hits">0</td><td class="source"> var result = this.parseRegExp(match, route[1], pathname);</td></tr><tr class="miss"><td class="line">35</td><td class="hits">0</td><td class="source"> if (result) {</td></tr><tr class="miss"><td class="line">36</td><td class="hits">0</td><td class="source"> return result;</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }else{</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> //字符串路由</td></tr><tr class="miss"><td class="line">41</td><td class="hits">0</td><td class="source"> match = this.checkUrlMatch(pathname, rule);</td></tr><tr class="miss"><td class="line">42</td><td class="hits">0</td><td class="source"> if (match) {</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> return this.parseRule(rule, route[1], pathname);</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">47</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> * 分割pathname</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> * @param {[type]} pathname [description]</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> split: function(pathname){</td></tr><tr class="miss"><td class="line">55</td><td class="hits">0</td><td class="source"> var ret = [];</td></tr><tr class="miss"><td class="line">56</td><td class="hits">0</td><td class="source"> var j = 0;</td></tr><tr class="miss"><td class="line">57</td><td class="hits">0</td><td class="source"> pathname = pathname.split('/');</td></tr><tr class="miss"><td class="line">58</td><td class="hits">0</td><td class="source"> for(var i = 0, length = pathname.length, item; i < length; i++){</td></tr><tr class="miss"><td class="line">59</td><td class="hits">0</td><td class="source"> item = pathname[i].trim();</td></tr><tr class="miss"><td class="line">60</td><td class="hits">0</td><td class="source"> if (item) {</td></tr><tr class="miss"><td class="line">61</td><td class="hits">0</td><td class="source"> ret[j++] = item;</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">64</td><td class="hits">0</td><td class="source"> return ret;</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> * 解析字符串路由</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> * @param {[type]} rule [description]</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> * @param {[type]} route [description]</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> * @param {[type]} pathname [description]</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> parseRule: function(rule, route, pathname){</td></tr><tr class="miss"><td class="line">74</td><td class="hits">0</td><td class="source"> route = this.getRoute(route);</td></tr><tr class="miss"><td class="line">75</td><td class="hits">0</td><td class="source"> if (!route) {</td></tr><tr class="miss"><td class="line">76</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">78</td><td class="hits">0</td><td class="source"> pathname = this.split(pathname);</td></tr><tr class="miss"><td class="line">79</td><td class="hits">0</td><td class="source"> rule = this.split(rule);</td></tr><tr class="miss"><td class="line">80</td><td class="hits">0</td><td class="source"> var matches = [];</td></tr><tr class="miss"><td class="line">81</td><td class="hits">0</td><td class="source"> var self = this;</td></tr><tr class="miss"><td class="line">82</td><td class="hits">0</td><td class="source"> rule.forEach(function(item){</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> var pathitem = pathname.shift();</td></tr><tr class="miss"><td class="line">84</td><td class="hits">0</td><td class="source"> if (item.indexOf(':') === 0) {</td></tr><tr class="miss"><td class="line">85</td><td class="hits">0</td><td class="source"> if (item.indexOf('\\') === -1) {</td></tr><tr class="miss"><td class="line">86</td><td class="hits">0</td><td class="source"> self.http.get[item.substr(1)] = pathitem;</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> matches.push(pathitem);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> //将剩余的pathname分割为querystring</td></tr><tr class="miss"><td class="line">93</td><td class="hits">0</td><td class="source"> if (pathname.length) {</td></tr><tr class="miss"><td class="line">94</td><td class="hits">0</td><td class="source"> for(var i = 0,length = Math.ceil(pathname.length)/2; i < length; i++){</td></tr><tr class="miss"><td class="line">95</td><td class="hits">0</td><td class="source"> this.http.get[pathname[i * 2]] = pathname[i * 2 + 1] || '';</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">98</td><td class="hits">0</td><td class="source"> route = route.replace(/:(\d+)/g, function(a, b){</td></tr><tr class="miss"><td class="line">99</td><td class="hits">0</td><td class="source"> return matches[b - 1] || '';</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">101</td><td class="hits">0</td><td class="source"> this.parseUrl(route);</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> * 检测URL是否匹配</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> * @param {[type]} pathname [description]</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> * @param {[type]} rule [description]</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> checkUrlMatch: function(pathname, rule){</td></tr><tr class="miss"><td class="line">111</td><td class="hits">0</td><td class="source"> pathname = this.split(pathname);</td></tr><tr class="miss"><td class="line">112</td><td class="hits">0</td><td class="source"> rule = this.split(rule);</td></tr><tr class="miss"><td class="line">113</td><td class="hits">0</td><td class="source"> return rule.every(function(item, i){</td></tr><tr class="miss"><td class="line">114</td><td class="hits">0</td><td class="source"> if (item.indexOf(':') === 0) {</td></tr><tr class="miss"><td class="line">115</td><td class="hits">0</td><td class="source"> if (item.indexOf('\\') > -1) {</td></tr><tr class="miss"><td class="line">116</td><td class="hits">0</td><td class="source"> var type = item.substr(-1);</td></tr><tr class="miss"><td class="line">117</td><td class="hits">0</td><td class="source"> var reg;</td></tr><tr class="miss"><td class="line">118</td><td class="hits">0</td><td class="source"> switch(type){</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> case 'd':</td></tr><tr class="miss"><td class="line">120</td><td class="hits">0</td><td class="source"> reg = /^\d+$/;</td></tr><tr class="miss"><td class="line">121</td><td class="hits">0</td><td class="source"> break;</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> case 'w':</td></tr><tr class="miss"><td class="line">123</td><td class="hits">0</td><td class="source"> reg = /^\w+$/</td></tr><tr class="miss"><td class="line">124</td><td class="hits">0</td><td class="source"> break;</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">126</td><td class="hits">0</td><td class="source"> if (reg && !reg.test(pathname[i])) {</td></tr><tr class="miss"><td class="line">127</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">131</td><td class="hits">0</td><td class="source"> var pitem = pathname[i] || '';</td></tr><tr class="miss"><td class="line">132</td><td class="hits">0</td><td class="source"> if (pitem.toLowerCase() !== item.toLowerCase()) {</td></tr><tr class="miss"><td class="line">133</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">136</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> * 解析转化后的url</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> * @param {[type]} urlInfo [description]</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> parseUrl: function(urlInfo){</td></tr><tr class="miss"><td class="line">145</td><td class="hits">0</td><td class="source"> urlInfo = url.parse(urlInfo, true);</td></tr><tr class="miss"><td class="line">146</td><td class="hits">0</td><td class="source"> if (urlInfo.query) {</td></tr><tr class="miss"><td class="line">147</td><td class="hits">0</td><td class="source"> for(var key in urlInfo.query){</td></tr><tr class="miss"><td class="line">148</td><td class="hits">0</td><td class="source"> if (urlInfo.query[key] || !(key in this.http.get)) {</td></tr><tr class="miss"><td class="line">149</td><td class="hits">0</td><td class="source"> this.http.get[key] = urlInfo.query[key];</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">153</td><td class="hits">0</td><td class="source"> var pathname = urlInfo.pathname || '';</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> // 过滤调用pathname最后有/的情况</td></tr><tr class="miss"><td class="line">155</td><td class="hits">0</td><td class="source"> pathname = this.split(pathname);</td></tr><tr class="miss"><td class="line">156</td><td class="hits">0</td><td class="source"> this.http.action = Dispatcher.getAction(pathname.pop());</td></tr><tr class="miss"><td class="line">157</td><td class="hits">0</td><td class="source"> this.http.controller = Dispatcher.getController(pathname.pop());</td></tr><tr class="miss"><td class="line">158</td><td class="hits">0</td><td class="source"> this.http.group = Dispatcher.getGroup(pathname.pop());</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> * 获取route</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> * @param {[type]} route [description]</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> getRoute: function(route, matches){</td></tr><tr class="miss"><td class="line">166</td><td class="hits">0</td><td class="source"> if (isObject(route)) {</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> //对应的请求类型</td></tr><tr class="miss"><td class="line">168</td><td class="hits">0</td><td class="source"> for(var method in route){</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> //由于请求类型没有包含关系,这里可以直接用indexOf判断</td></tr><tr class="miss"><td class="line">170</td><td class="hits">0</td><td class="source"> if (method.toUpperCase().indexOf(this.http.method) > -1) {</td></tr><tr class="miss"><td class="line">171</td><td class="hits">0</td><td class="source"> return route[method];</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">174</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">176</td><td class="hits">0</td><td class="source"> var routeUpper = route.toUpperCase();</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> //RESTFUL API</td></tr><tr class="miss"><td class="line">178</td><td class="hits">0</td><td class="source"> if (routeUpper === 'RESTFUL' || routeUpper.indexOf('RESTFUL:') === 0) {</td></tr><tr class="miss"><td class="line">179</td><td class="hits">0</td><td class="source"> var group = route.split(':')[1] || C('restful_group');</td></tr><tr class="miss"><td class="line">180</td><td class="hits">0</td><td class="source"> route = group + '/' + matches[1] + '/' + this.http.method.toLowerCase() + '?resource=' + matches[1];</td></tr><tr class="miss"><td class="line">181</td><td class="hits">0</td><td class="source"> if (matches[2]) {</td></tr><tr class="miss"><td class="line">182</td><td class="hits">0</td><td class="source"> route += '&id=' + matches[2];</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> //设置变量到http对象上,方便后续使用</td></tr><tr class="miss"><td class="line">185</td><td class="hits">0</td><td class="source"> this.http.isRestful = true;</td></tr><tr class="miss"><td class="line">186</td><td class="hits">0</td><td class="source"> return route;</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">188</td><td class="hits">0</td><td class="source"> return route;</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> * 正则匹配路由</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> * @param {[type]} matches [description]</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> * @param {[type]} route [description]</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> * @param {[type]} pathname [description]</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> parseRegExp: function(matches, route, pathname){</td></tr><tr class="miss"><td class="line">198</td><td class="hits">0</td><td class="source"> route = this.getRoute(route, matches);</td></tr><tr class="miss"><td class="line">199</td><td class="hits">0</td><td class="source"> if (!route) {</td></tr><tr class="miss"><td class="line">200</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> //替换路由字符串里的:1, :2 匹配都的值</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> //如:group/detail?date=:1&groupId=:2&page=:3</td></tr><tr class="miss"><td class="line">204</td><td class="hits">0</td><td class="source"> route = route.replace(/:(\d+)/g, function(a, b){</td></tr><tr class="miss"><td class="line">205</td><td class="hits">0</td><td class="source"> return matches[b] || '';</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">207</td><td class="hits">0</td><td class="source"> pathname = pathname.replace(matches[0], '');</td></tr><tr class="miss"><td class="line">208</td><td class="hits">0</td><td class="source"> pathname = this.split(pathname);</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> //将剩余的pathname分割为querystring</td></tr><tr class="miss"><td class="line">210</td><td class="hits">0</td><td class="source"> if (pathname.length) {</td></tr><tr class="miss"><td class="line">211</td><td class="hits">0</td><td class="source"> for(var i = 0,length = Math.ceil(pathname.length)/2; i < length; i++){</td></tr><tr class="miss"><td class="line">212</td><td class="hits">0</td><td class="source"> this.http.get[pathname[i * 2]] = pathname[i * 2 + 1] || '';</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">215</td><td class="hits">0</td><td class="source"> this.parseUrl(route);</td></tr><tr class="miss"><td class="line">216</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/LocationTemplateBehavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/LocationTemplateBehavior.js</h2><div id="stats" class="low"><div class="percentage">40%</div><div class="sloc">15</div><div class="hits">6</div><div class="misses">9</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 定位模版路径</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">module.exports = Behavior(function(){</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> run: function(templateFile){</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> //templateFile = templateFile || '';</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> if (!templateFile) {</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> //根据group, controller, action自动生成</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source"> templateFile = [</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> VIEW_PATH, '/', this.http.group, '/',</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> this.http.controller.toLowerCase(),</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> C('tpl_file_depr'),</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> this.http.action.toLowerCase(),</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> C('tpl_file_suffix')</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> ].join('');</td></tr><tr class="miss"><td class="line">20</td><td class="hits">0</td><td class="source"> }else if(templateFile.indexOf('/') > -1){</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> //自动追加VIEW_PATH</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> if (templateFile.indexOf('/') !== 0) {</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> templateFile = VIEW_PATH + '/' + templateFile;</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> }else if(templateFile.indexOf(C('tpl_file_suffix')) === -1){</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> var path = templateFile.split(':');</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> var action = path.pop();</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> var controller = path.pop() || this.http.controller.toLowerCase();</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> var group = ucfirst(path.pop()) || this.http.group;</td></tr><tr class="miss"><td class="line">30</td><td class="hits">0</td><td class="source"> templateFile = [</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> VIEW_PATH, '/', group, '/',</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> controller, </td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> C('tpl_file_depr'),</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> action,</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> C('tpl_file_suffix')</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> ].join('');</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">38</td><td class="hits">1</td><td class="source"> return templateFile;</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/ParseTemplateBehavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/ParseTemplateBehavior.js</h2><div id="stats" class="high"><div class="percentage">90%</div><div class="sloc">10</div><div class="hits">9</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 调用对应的模版引擎解析模版</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">module.exports = Behavior(function(){</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> run: function(data){</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> var file = data.file;</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> //将模版文件路径写入到http对象上,供writehtmlcache里使用</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> this.http.tpl_file = file;</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> var engine = C('tpl_engine_type');</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> //不使用模版引擎,直接返回文件内容</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> if (!engine) {</td></tr><tr class="miss"><td class="line">15</td><td class="hits">0</td><td class="source"> return getFileContent(file);</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source"> var engineClass = ucfirst(engine) + 'Template';</td></tr><tr class="hit"><td class="line">18</td><td class="hits">1</td><td class="source"> return thinkRequire(engineClass).fetch(file, data.var);</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/ReadHtmlCacheBehavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/ReadHtmlCacheBehavior.js</h2><div id="stats" class="terrible"><div class="percentage">10%</div><div class="sloc">64</div><div class="hits">7</div><div class="misses">57</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">//获取模版文件</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var getViewFile = thinkRequire('WriteHtmlCacheBehavior').getViewFile;</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * 读取HTML缓存</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">module.exports = Behavior(function(){</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> options:{</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> 'html_cache_on': false, //是否开启缓存</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> 'html_cache_timeout': 3600, //缓存时间</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> 'html_cache_rules': {}, //缓存规则</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> 'html_cache_path': '',</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> 'html_cache_file_callback': undefined, //生成缓存文件的回调函数</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> 'html_cache_file_suffix': '.html', //缓存文件扩展名</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> run: function(){</td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source"> if (!this.options.html_cache_on || isEmpty(this.options.html_cache_rules)) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> var cacheTime = this.getCacheTime();</td></tr><tr class="miss"><td class="line">24</td><td class="hits">0</td><td class="source"> if (cacheTime === false) {</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> if (this.checkCacheTime(cacheTime)) {</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> this.responseCacheContent();</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> //return a pending promise</td></tr><tr class="miss"><td class="line">30</td><td class="hits">0</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">32</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> * 返回缓存内容</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> responseCacheContent: function(){</td></tr><tr class="miss"><td class="line">39</td><td class="hits">0</td><td class="source"> var http = this.http;</td></tr><tr class="miss"><td class="line">40</td><td class="hits">0</td><td class="source"> var fileStream = fs.createReadStream(this.options.html_cache_path + '/' + http.html_filename);</td></tr><tr class="miss"><td class="line">41</td><td class="hits">0</td><td class="source"> http.setHeader('Content-Type', 'text/html');</td></tr><tr class="miss"><td class="line">42</td><td class="hits">0</td><td class="source"> http.sendTime('Exec-Time');</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> http.sendCookie();</td></tr><tr class="miss"><td class="line">44</td><td class="hits">0</td><td class="source"> fileStream.pipe(http.res);</td></tr><tr class="miss"><td class="line">45</td><td class="hits">0</td><td class="source"> fileStream.on('end', function(){</td></tr><tr class="miss"><td class="line">46</td><td class="hits">0</td><td class="source"> http.end();</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> * 获取缓存时间</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> getCacheTime: function(){</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> * rules数据格式</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> * {</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> * 'index:index': ['index_home', 1800, html_cache_callback]</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> * }</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> * @type {[type]}</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> */</td></tr><tr class="miss"><td class="line">61</td><td class="hits">0</td><td class="source"> var rules = this.options.html_cache_rules;</td></tr><tr class="miss"><td class="line">62</td><td class="hits">0</td><td class="source"> var group = this.http.group.toLowerCase();</td></tr><tr class="miss"><td class="line">63</td><td class="hits">0</td><td class="source"> var controller = this.http.controller.toLowerCase();</td></tr><tr class="miss"><td class="line">64</td><td class="hits">0</td><td class="source"> var action = this.http.action.toLowerCase();</td></tr><tr class="miss"><td class="line">65</td><td class="hits">0</td><td class="source"> var list = [</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> group + ':' + controller + ':' + action,</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> controller + ':' + action,</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> action,</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> '*'</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> ];</td></tr><tr class="miss"><td class="line">71</td><td class="hits">0</td><td class="source"> var html = [];</td></tr><tr class="miss"><td class="line">72</td><td class="hits">0</td><td class="source"> list.some(function(item){</td></tr><tr class="miss"><td class="line">73</td><td class="hits">0</td><td class="source"> if (item in rules) {</td></tr><tr class="miss"><td class="line">74</td><td class="hits">0</td><td class="source"> html = rules[item];</td></tr><tr class="miss"><td class="line">75</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">78</td><td class="hits">0</td><td class="source"> if (isEmpty(html)) {</td></tr><tr class="miss"><td class="line">79</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">81</td><td class="hits">0</td><td class="source"> if (!isArray(html)) {</td></tr><tr class="miss"><td class="line">82</td><td class="hits">0</td><td class="source"> html = [html];</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">84</td><td class="hits">0</td><td class="source"> var rule = html[0];</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> //将cookie变量传递进去</td></tr><tr class="miss"><td class="line">86</td><td class="hits">0</td><td class="source"> var cookiePars = {};</td></tr><tr class="miss"><td class="line">87</td><td class="hits">0</td><td class="source"> for(var name in this.http.cookie){</td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> cookiePars['cookie.' + name] = this.http.cookie[name];</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">90</td><td class="hits">0</td><td class="source"> var pars = extend({}, this.http.get, cookiePars, {</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> ':group': group,</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> ':controller': controller,</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> ':action': action</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">95</td><td class="hits">0</td><td class="source"> rule = rule.replace(/\{([\w\:]+)\}/g, function(a, name){</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> return pars[name] || '';</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">98</td><td class="hits">0</td><td class="source"> var callback = html[2] || C('html_cache_file_callback') || this.getCacheFilename;</td></tr><tr class="miss"><td class="line">99</td><td class="hits">0</td><td class="source"> var filename = callback(rule, this.http) + this.options.html_cache_file_suffix;</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> //静态缓存文件名</td></tr><tr class="miss"><td class="line">101</td><td class="hits">0</td><td class="source"> this.http.html_filename = filename;</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> var cacheTime = html[1] || this.options.html_cache_timeout;</td></tr><tr class="miss"><td class="line">103</td><td class="hits">0</td><td class="source"> return cacheTime;</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> * </td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> * @param {[type]} key [description]</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source"> getCacheFilename: function(key){</td></tr><tr class="miss"><td class="line">111</td><td class="hits">0</td><td class="source"> var value = md5(key);</td></tr><tr class="miss"><td class="line">112</td><td class="hits">0</td><td class="source"> return value.substr(0, 1) + '/' + value;</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> * [checkCacheTime description]</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> checkCacheTime: function(cacheTime){</td></tr><tr class="miss"><td class="line">119</td><td class="hits">0</td><td class="source"> var cacheFile = this.options.html_cache_path + '/' + this.http.html_filename;</td></tr><tr class="miss"><td class="line">120</td><td class="hits">0</td><td class="source"> if (!isFile(cacheFile)) {</td></tr><tr class="miss"><td class="line">121</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">123</td><td class="hits">0</td><td class="source"> var cacheFileMtime = fs.statSync(cacheFile).mtime.getTime();</td></tr><tr class="miss"><td class="line">124</td><td class="hits">0</td><td class="source"> var tplFile = getViewFile(this.http);</td></tr><tr class="miss"><td class="line">125</td><td class="hits">0</td><td class="source"> if (tplFile) {</td></tr><tr class="miss"><td class="line">126</td><td class="hits">0</td><td class="source"> if (!isFile(tplFile)) {</td></tr><tr class="miss"><td class="line">127</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">129</td><td class="hits">0</td><td class="source"> var tplFileMtime = fs.statSync(tplFile).mtime.getTime();</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> //模版文件有更新</td></tr><tr class="miss"><td class="line">131</td><td class="hits">0</td><td class="source"> if (tplFileMtime > cacheFileMtime) {</td></tr><tr class="miss"><td class="line">132</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">135</td><td class="hits">0</td><td class="source"> if (Date.now() > (cacheFileMtime + cacheTime * 1000)) {</td></tr><tr class="miss"><td class="line">136</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">138</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/WriteHtmlCacheBehavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Behavior/WriteHtmlCacheBehavior.js</h2><div id="stats" class="low"><div class="percentage">45%</div><div class="sloc">20</div><div class="hits">9</div><div class="misses">11</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 模版文件列表</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var path = require('path');</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">var tplFiles = {};</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * 写入html缓存</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source">module.exports = Behavior(function(){</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> options: {</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> 'html_cache_on': false, //是否开启缓存</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> 'html_cache_path': ''</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> run: function(content){</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> if (!this.options.html_cache_on || !this.http.html_filename) {</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source"> return content;</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">24</td><td class="hits">0</td><td class="source"> this.recordViewFile();</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> var file = this.options.html_cache_path + '/' + this.http.html_filename;</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> mkdir(path.dirname(file));</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> //异步方式写入缓存</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> fs.writeFile(file, content);</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> return content;</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> * 记录模版文件名</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> recordViewFile: function(){</td></tr><tr class="miss"><td class="line">36</td><td class="hits">0</td><td class="source"> var tplFile = this.http.tpl_file;</td></tr><tr class="miss"><td class="line">37</td><td class="hits">0</td><td class="source"> var key = this.http.group + ':' + this.http.controller + ':' + this.http.action;</td></tr><tr class="miss"><td class="line">38</td><td class="hits">0</td><td class="source"> tplFiles[key] = tplFile;</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source">});</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> * 获取模版文件</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">47</td><td class="hits">1</td><td class="source">module.exports.getViewFile = function(http){</td></tr><tr class="miss"><td class="line">48</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> var key = http.group + ':' + http.controller + ':' + http.action;</td></tr><tr class="miss"><td class="line">50</td><td class="hits">0</td><td class="source"> return tplFiles[key];</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/App.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/App.js</h2><div id="stats" class="medium"><div class="percentage">50%</div><div class="sloc">155</div><div class="hits">79</div><div class="misses">76</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var cluster = require('cluster');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var domain = require('domain');</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var thinkHttp = thinkRequire('Http');</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var Dispatcher = thinkRequire('Dispatcher');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source">var App = module.exports = {};</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * 根据http里的group和controller获取对应的controller实例</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source">App.getBaseController = function(http){</td></tr><tr class="hit"><td class="line">16</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source"> var gc = ucfirst(http.group) + '/' + ucfirst(http.controller) + 'Controller';</td></tr><tr class="hit"><td class="line">18</td><td class="hits">1</td><td class="source"> var path = getThinkRequirePath(gc);</td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source"> if (path) {</td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source"> return require(path)(http);</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> * controller不存在时调用的默认controller</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">27</td><td class="hits">1</td><td class="source">App.getCallController = function(http){</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> //如果是RESTFUL API,则调用RestController</td></tr><tr class="miss"><td class="line">30</td><td class="hits">0</td><td class="source"> if (http.isRestful) {</td></tr><tr class="miss"><td class="line">31</td><td class="hits">0</td><td class="source"> return thinkRequire('RestController')(http);</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">33</td><td class="hits">0</td><td class="source"> var config = C('call_controller');</td></tr><tr class="miss"><td class="line">34</td><td class="hits">0</td><td class="source"> if (!config) {</td></tr><tr class="miss"><td class="line">35</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">37</td><td class="hits">0</td><td class="source"> if (isString(config)) {</td></tr><tr class="miss"><td class="line">38</td><td class="hits">0</td><td class="source"> config = config.split(':');</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">40</td><td class="hits">0</td><td class="source"> var action = Dispatcher.getAction(config.pop());</td></tr><tr class="miss"><td class="line">41</td><td class="hits">0</td><td class="source"> var controller = Dispatcher.getController(config.pop());</td></tr><tr class="miss"><td class="line">42</td><td class="hits">0</td><td class="source"> var group = Dispatcher.getGroup(config.pop());</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> var instance = this.getBaseController({</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> group: group,</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> controller: controller</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> })</td></tr><tr class="miss"><td class="line">47</td><td class="hits">0</td><td class="source"> if (instance && isFunction(instance[action + C('action_suffix')])) {</td></tr><tr class="miss"><td class="line">48</td><td class="hits">0</td><td class="source"> http.group = group;</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> http.controller = controller;</td></tr><tr class="miss"><td class="line">50</td><td class="hits">0</td><td class="source"> http.action = action;</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">52</td><td class="hits">0</td><td class="source"> return instance;</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> * 执行具体的action,调用前置和后置操作</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">59</td><td class="hits">1</td><td class="source">App.execAction = function(controller, action, data, callMethod){</td></tr><tr class="hit"><td class="line">60</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> //action操作</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> var act = action + C('action_suffix');</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source"> var flag = false;</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> //action不存在时执行魔术方法</td></tr><tr class="hit"><td class="line">65</td><td class="hits">1</td><td class="source"> if (callMethod && !isFunction(controller[act])) {</td></tr><tr class="miss"><td class="line">66</td><td class="hits">0</td><td class="source"> var call = C('call_method');</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> if (call && isFunction(controller[call])) {</td></tr><tr class="miss"><td class="line">68</td><td class="hits">0</td><td class="source"> flag = true;</td></tr><tr class="miss"><td class="line">69</td><td class="hits">0</td><td class="source"> act = call;</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> //action不存在</td></tr><tr class="hit"><td class="line">73</td><td class="hits">1</td><td class="source"> if (!isFunction(controller[act])) {</td></tr><tr class="miss"><td class="line">74</td><td class="hits">0</td><td class="source"> return getPromise(new Error('action `' + action + '` not found. '), true);</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">76</td><td class="hits">1</td><td class="source"> var promise = getPromise();</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> //action前置操作</td></tr><tr class="hit"><td class="line">78</td><td class="hits">1</td><td class="source"> var before = C('before_action');</td></tr><tr class="hit"><td class="line">79</td><td class="hits">1</td><td class="source"> if (before && isFunction(controller[before])) {</td></tr><tr class="miss"><td class="line">80</td><td class="hits">0</td><td class="source"> promise = getPromise(controller[before](action));</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">82</td><td class="hits">1</td><td class="source"> promise = promise.then(function(){</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> //action魔术方法只传递action参数</td></tr><tr class="hit"><td class="line">84</td><td class="hits">1</td><td class="source"> if (flag) {</td></tr><tr class="miss"><td class="line">85</td><td class="hits">0</td><td class="source"> return controller[act](action);</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">87</td><td class="hits">1</td><td class="source"> if (data) {</td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source"> return controller[act].apply(controller, data);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">90</td><td class="hits">0</td><td class="source"> return controller[act]();</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> //action后置操作</td></tr><tr class="hit"><td class="line">94</td><td class="hits">1</td><td class="source"> var after = C('after_action');</td></tr><tr class="hit"><td class="line">95</td><td class="hits">1</td><td class="source"> if (after && isFunction(controller[after])) {</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> promise = promise.then(function(){</td></tr><tr class="miss"><td class="line">97</td><td class="hits">0</td><td class="source"> return controller[after](action);</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">100</td><td class="hits">1</td><td class="source"> return promise;</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> * 获取action的形参</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">107</td><td class="hits">1</td><td class="source">App.getActionParams = function(fn, http){</td></tr><tr class="hit"><td class="line">108</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> //注释的正则</td></tr><tr class="hit"><td class="line">110</td><td class="hits">1</td><td class="source"> var commentReg = /((\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s))/mg;</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> //获取形参的正则</td></tr><tr class="hit"><td class="line">112</td><td class="hits">1</td><td class="source"> var parsReg = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;</td></tr><tr class="hit"><td class="line">113</td><td class="hits">1</td><td class="source"> var toString = fn.toString().replace(commentReg, '');</td></tr><tr class="hit"><td class="line">114</td><td class="hits">1</td><td class="source"> var match = toString.match(parsReg)[1].split(/\s*,\s*/);</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> //匹配到形参</td></tr><tr class="hit"><td class="line">116</td><td class="hits">1</td><td class="source"> var params;</td></tr><tr class="hit"><td class="line">117</td><td class="hits">1</td><td class="source"> if (match && match.length) {</td></tr><tr class="hit"><td class="line">118</td><td class="hits">1</td><td class="source"> params = match.map(function(item){</td></tr><tr class="hit"><td class="line">119</td><td class="hits">1</td><td class="source"> return http.post[item] || http.get[item] || '';</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">122</td><td class="hits">1</td><td class="source"> return params;</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> * 执行</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">129</td><td class="hits">1</td><td class="source">App.exec = function(http){</td></tr><tr class="hit"><td class="line">130</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">131</td><td class="hits">1</td><td class="source"> var controller = this.getBaseController(http) || this.getCallController(http);</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> //controller不存在</td></tr><tr class="hit"><td class="line">133</td><td class="hits">1</td><td class="source"> if (!controller) {</td></tr><tr class="miss"><td class="line">134</td><td class="hits">0</td><td class="source"> var err = new Error('Controller `' + http.controller + '` not found. ' + http.pathname);</td></tr><tr class="miss"><td class="line">135</td><td class="hits">0</td><td class="source"> return getPromise(err, true);</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> //controller类实例</td></tr><tr class="hit"><td class="line">138</td><td class="hits">1</td><td class="source"> http.controllerInstance = controller;</td></tr><tr class="hit"><td class="line">139</td><td class="hits">1</td><td class="source"> var params;</td></tr><tr class="hit"><td class="line">140</td><td class="hits">1</td><td class="source"> var actionFn = controller[http.action + C('action_suffix')];</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> //参数绑定</td></tr><tr class="hit"><td class="line">142</td><td class="hits">1</td><td class="source"> if (C('url_params_bind') && isFunction(actionFn)) {</td></tr><tr class="hit"><td class="line">143</td><td class="hits">1</td><td class="source"> params = this.getActionParams(actionFn, http);</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">145</td><td class="hits">1</td><td class="source"> var promise = getPromise(controller.__initReturn);</td></tr><tr class="hit"><td class="line">146</td><td class="hits">1</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">147</td><td class="hits">1</td><td class="source"> return promise.then(function(){</td></tr><tr class="hit"><td class="line">148</td><td class="hits">1</td><td class="source"> return self.execAction(controller, http.action, params, true);</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> * 发送错误信息</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> * @param {[type]} error [description]</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">156</td><td class="hits">1</td><td class="source">App.sendError = function(http, error){</td></tr><tr class="miss"><td class="line">157</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">158</td><td class="hits">0</td><td class="source"> if (!error || !http.res) {</td></tr><tr class="miss"><td class="line">159</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> var message = isError(error) ? error.stack : error;</td></tr><tr class="miss"><td class="line">162</td><td class="hits">0</td><td class="source"> console.error(message);</td></tr><tr class="miss"><td class="line">163</td><td class="hits">0</td><td class="source"> http.res.statusCode = 500;</td></tr><tr class="miss"><td class="line">164</td><td class="hits">0</td><td class="source"> http.setHeader('Content-Type', 'text/html; charset=' + C('encoding'));</td></tr><tr class="miss"><td class="line">165</td><td class="hits">0</td><td class="source"> if (APP_DEBUG) {</td></tr><tr class="miss"><td class="line">166</td><td class="hits">0</td><td class="source"> http.res.end(message);</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">168</td><td class="hits">0</td><td class="source"> var readStream = fs.createReadStream(C('error_tpl_path'));</td></tr><tr class="miss"><td class="line">169</td><td class="hits">0</td><td class="source"> readStream.pipe(http.res);</td></tr><tr class="miss"><td class="line">170</td><td class="hits">0</td><td class="source"> readStream.on('end', function(){</td></tr><tr class="miss"><td class="line">171</td><td class="hits">0</td><td class="source"> http.res.end();</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> * run</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">180</td><td class="hits">1</td><td class="source">App.run = function(){</td></tr><tr class="hit"><td class="line">181</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">182</td><td class="hits">1</td><td class="source"> if (APP_MODE && App.mode[APP_MODE]) {</td></tr><tr class="hit"><td class="line">183</td><td class="hits">1</td><td class="source"> return App.mode[APP_MODE]();</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">185</td><td class="hits">0</td><td class="source"> return App.mode.http();</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> * 不同模式下的run</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">191</td><td class="hits">1</td><td class="source">App.mode = {</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> //命令行模式</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> cli: function(){</td></tr><tr class="hit"><td class="line">194</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">195</td><td class="hits">1</td><td class="source"> var defaultHttp = thinkHttp.getDefaultHttp(process.argv[2]);</td></tr><tr class="hit"><td class="line">196</td><td class="hits">1</td><td class="source"> thinkHttp(defaultHttp.req, defaultHttp.res).run().then(App.listener);</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> //HTTP模式</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> http: function(){</td></tr><tr class="miss"><td class="line">200</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">201</td><td class="hits">0</td><td class="source"> var clusterNums = C('use_cluster');</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> //不使用cluster</td></tr><tr class="miss"><td class="line">203</td><td class="hits">0</td><td class="source"> if (!clusterNums) {</td></tr><tr class="miss"><td class="line">204</td><td class="hits">0</td><td class="source"> return App.createServer();</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> //使用cpu的个数</td></tr><tr class="miss"><td class="line">207</td><td class="hits">0</td><td class="source"> if (clusterNums === true) {</td></tr><tr class="miss"><td class="line">208</td><td class="hits">0</td><td class="source"> clusterNums = require('os').cpus().length;</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">210</td><td class="hits">0</td><td class="source"> if (cluster.isMaster) {</td></tr><tr class="miss"><td class="line">211</td><td class="hits">0</td><td class="source"> for (var i = 0; i < clusterNums; i++) {</td></tr><tr class="miss"><td class="line">212</td><td class="hits">0</td><td class="source"> cluster.fork();</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">214</td><td class="hits">0</td><td class="source"> cluster.on('exit', function(worker) {</td></tr><tr class="miss"><td class="line">215</td><td class="hits">0</td><td class="source"> console.error('worker ' + worker.process.pid + ' died');</td></tr><tr class="miss"><td class="line">216</td><td class="hits">0</td><td class="source"> process.nextTick(function(){</td></tr><tr class="miss"><td class="line">217</td><td class="hits">0</td><td class="source"> cluster.fork();</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> }else {</td></tr><tr class="miss"><td class="line">221</td><td class="hits">0</td><td class="source"> App.createServer();</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> * 创建服务</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">229</td><td class="hits">1</td><td class="source">App.createServer = function(){</td></tr><tr class="miss"><td class="line">230</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> //自定义创建server</td></tr><tr class="miss"><td class="line">232</td><td class="hits">0</td><td class="source"> var createServerFn = C('create_server_fn');</td></tr><tr class="miss"><td class="line">233</td><td class="hits">0</td><td class="source"> if (createServerFn) {</td></tr><tr class="miss"><td class="line">234</td><td class="hits">0</td><td class="source"> if (isFunction(createServerFn)) {</td></tr><tr class="miss"><td class="line">235</td><td class="hits">0</td><td class="source"> return createServerFn(App);</td></tr><tr class="miss"><td class="line">236</td><td class="hits">0</td><td class="source"> }else if (isFunction(global[createServerFn])) {</td></tr><tr class="miss"><td class="line">237</td><td class="hits">0</td><td class="source"> return global[createServerFn](App);</td></tr><tr><td class="line">238</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">240</td><td class="hits">0</td><td class="source"> var server = require('http').createServer(function (req, res) {</td></tr><tr class="miss"><td class="line">241</td><td class="hits">0</td><td class="source"> thinkHttp(req, res).run().then(App.listener);</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">243</td><td class="hits">0</td><td class="source"> thinkRequire('WebSocket')(server, App).run();</td></tr><tr class="miss"><td class="line">244</td><td class="hits">0</td><td class="source"> server.listen(C('port'));</td></tr><tr class="miss"><td class="line">245</td><td class="hits">0</td><td class="source"> if (APP_DEBUG) {</td></tr><tr class="miss"><td class="line">246</td><td class="hits">0</td><td class="source"> console.log('Server running at http://127.0.0.1:' + C('port') + '/');</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> * 监听回调函数</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">254</td><td class="hits">1</td><td class="source">App.listener = function(http){</td></tr><tr class="hit"><td class="line">255</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> //自动发送thinkjs和版本的header</td></tr><tr class="hit"><td class="line">257</td><td class="hits">1</td><td class="source"> http.setHeader('X-Powered-By', 'thinkjs-' + THINK_VERSION);</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> //禁止远程直接用带端口的访问,websocket下允许</td></tr><tr class="hit"><td class="line">259</td><td class="hits">1</td><td class="source"> if (C('use_proxy') && http.host !== http.hostname && !http.websocket) {</td></tr><tr class="miss"><td class="line">260</td><td class="hits">0</td><td class="source"> http.res.statusCode = 403;</td></tr><tr class="miss"><td class="line">261</td><td class="hits">0</td><td class="source"> http.res.end();</td></tr><tr class="miss"><td class="line">262</td><td class="hits">0</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">264</td><td class="hits">1</td><td class="source"> var domainInstance = domain.create();</td></tr><tr class="hit"><td class="line">265</td><td class="hits">1</td><td class="source"> var deferred = getDefer();</td></tr><tr class="hit"><td class="line">266</td><td class="hits">1</td><td class="source"> domainInstance.on('error', function(err){</td></tr><tr class="miss"><td class="line">267</td><td class="hits">0</td><td class="source"> App.sendError(http, err);</td></tr><tr class="miss"><td class="line">268</td><td class="hits">0</td><td class="source"> deferred.reject(err);</td></tr><tr><td class="line">269</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">270</td><td class="hits">1</td><td class="source"> domainInstance.run(function(){</td></tr><tr class="hit"><td class="line">271</td><td class="hits">1</td><td class="source"> return tag('app_init', http).then(function(){</td></tr><tr class="hit"><td class="line">272</td><td class="hits">1</td><td class="source"> return Dispatcher(http).run();</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">274</td><td class="hits">1</td><td class="source"> return tag('app_begin', http);</td></tr><tr><td class="line">275</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">276</td><td class="hits">1</td><td class="source"> return tag('action_init', http);</td></tr><tr><td class="line">277</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">278</td><td class="hits">1</td><td class="source"> return App.exec(http);</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">280</td><td class="hits">1</td><td class="source"> return tag('app_end', http);</td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> }).catch(function(err){</td></tr><tr class="miss"><td class="line">282</td><td class="hits">0</td><td class="source"> App.sendError(http, err);</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">284</td><td class="hits">1</td><td class="source"> deferred.resolve();</td></tr><tr><td class="line">285</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">286</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">287</td><td class="hits">1</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">288</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Controller.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Controller.js</h2><div id="stats" class="terrible"><div class="percentage">12%</div><div class="sloc">152</div><div class="hits">19</div><div class="misses">133</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * Controller 基类</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var path = require('path');</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">var url = require('url');</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source">module.exports = Class(function() {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> * 初始化执行方法</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> init: function(http) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source"> this.http = http;</td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source"> this.view = null;</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> //将http数据打到模版里</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source"> this.assign('http', this.http);</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> //将配置信息打到模版里</td></tr><tr class="hit"><td class="line">24</td><td class="hits">1</td><td class="source"> this.assign('config', C());</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> //设置变量别名</td></tr><tr class="hit"><td class="line">26</td><td class="hits">1</td><td class="source"> this.set = this.assign;</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> //success别名</td></tr><tr class="hit"><td class="line">28</td><td class="hits">1</td><td class="source"> this.ok = this.success;</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> //error别名</td></tr><tr class="hit"><td class="line">30</td><td class="hits">1</td><td class="source"> this.fail = this.error;</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> * 获取客户端的ip</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> ip: function() {</td></tr><tr class="miss"><td class="line">37</td><td class="hits">0</td><td class="source"> return this.http.ip();</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> * 实例化View类</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> initView: function() {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">3</td><td class="source"> if (!this.view) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">1</td><td class="source"> this.view = thinkRequire('View')(this.http);</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">47</td><td class="hits">3</td><td class="source"> return this.view;</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> * 是否是GET请求</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> isGet: function() {</td></tr><tr class="miss"><td class="line">54</td><td class="hits">0</td><td class="source"> return this.http.method === 'GET';</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> * 是否是POST请求</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> isPost: function() {</td></tr><tr class="miss"><td class="line">61</td><td class="hits">0</td><td class="source"> return this.http.method === 'POST';</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> * 是否是特定METHOD请求</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> * @param {[type]} method [description]</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> isMethod: function(method) {</td></tr><tr class="miss"><td class="line">69</td><td class="hits">0</td><td class="source"> return this.http.method === method.toUpperCase();</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> * 是否是AJAX请求</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> isAjax: function(method) {</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> //请求类型判断</td></tr><tr class="miss"><td class="line">77</td><td class="hits">0</td><td class="source"> if (method && this.http.method !== method.toUpperCase()) {</td></tr><tr class="miss"><td class="line">78</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">80</td><td class="hits">0</td><td class="source"> return this.header('x-requested-with') === 'XMLHttpRequest';</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> * 是否是websocket请求</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> isWebSocket: function(){</td></tr><tr class="miss"><td class="line">87</td><td class="hits">0</td><td class="source"> return !!this.http.websocket;</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> * 是否是命令行模式</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> isCli: function(){</td></tr><tr class="miss"><td class="line">94</td><td class="hits">0</td><td class="source"> return APP_MODE === 'cli';</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> * 是否是jsonp接口</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> isJsonp: function(name){</td></tr><tr class="miss"><td class="line">101</td><td class="hits">0</td><td class="source"> name = name || C('url_callback_name');</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> return !!this.get(name);</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> * 获取QUERY参数</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> get: function(name) {</td></tr><tr class="miss"><td class="line">110</td><td class="hits">0</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">111</td><td class="hits">0</td><td class="source"> return this.http.get;</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">113</td><td class="hits">0</td><td class="source"> return this.http.get[name] || '';</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> * 获取POST参数</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> post: function(name) {</td></tr><tr class="miss"><td class="line">121</td><td class="hits">0</td><td class="source"> var http = this.http;</td></tr><tr class="miss"><td class="line">122</td><td class="hits">0</td><td class="source"> return name ? (http.post[name] || '') : http.post;</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> * 获取参数</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> param: function(name) {</td></tr><tr class="miss"><td class="line">130</td><td class="hits">0</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">131</td><td class="hits">0</td><td class="source"> var post = this.post();</td></tr><tr class="miss"><td class="line">132</td><td class="hits">0</td><td class="source"> return !isEmpty(post) ? post : this.get();</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">134</td><td class="hits">0</td><td class="source"> return this.post(name) || this.get(name);</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> * 获取上传的文件</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> file: function(name) {</td></tr><tr class="miss"><td class="line">142</td><td class="hits">0</td><td class="source"> var http = this.http;</td></tr><tr class="miss"><td class="line">143</td><td class="hits">0</td><td class="source"> return name ? (http.file[name] || {}) : http.file;</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> * header操作</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> header: function(name, value) {</td></tr><tr class="miss"><td class="line">152</td><td class="hits">0</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">153</td><td class="hits">0</td><td class="source"> return this.http.headers;</td></tr><tr class="miss"><td class="line">154</td><td class="hits">0</td><td class="source"> }else if (isObject(name)) {</td></tr><tr class="miss"><td class="line">155</td><td class="hits">0</td><td class="source"> for (var key in name) {</td></tr><tr class="miss"><td class="line">156</td><td class="hits">0</td><td class="source"> this.header(key, name[key]);</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">158</td><td class="hits">0</td><td class="source"> return this;</td></tr><tr class="miss"><td class="line">159</td><td class="hits">0</td><td class="source"> }else if (value !== undefined) {</td></tr><tr class="miss"><td class="line">160</td><td class="hits">0</td><td class="source"> this.http.setHeader(name, value);</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> return this;</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">163</td><td class="hits">0</td><td class="source"> return this.http.getHeader(name);</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> * 获取userAgent</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> userAgent: function(){</td></tr><tr class="miss"><td class="line">171</td><td class="hits">0</td><td class="source"> return this.http.headers['user-agent'] || '';</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> * 获取referrer</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> referer: function(host){</td></tr><tr class="miss"><td class="line">178</td><td class="hits">0</td><td class="source"> var referer = this.http.headers.referer || this.http.headers.referfer || '';</td></tr><tr class="miss"><td class="line">179</td><td class="hits">0</td><td class="source"> if (!referer || !host) {</td></tr><tr class="miss"><td class="line">180</td><td class="hits">0</td><td class="source"> return referer;</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">182</td><td class="hits">0</td><td class="source"> var info = url.parse(referer);</td></tr><tr class="miss"><td class="line">183</td><td class="hits">0</td><td class="source"> return info.hostname;</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> * cookie操作</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> * @param {[type]} options [description]</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> cookie: function(name, value, options) {</td></tr><tr class="miss"><td class="line">193</td><td class="hits">0</td><td class="source"> if (value !== undefined) {</td></tr><tr class="miss"><td class="line">194</td><td class="hits">0</td><td class="source"> this.http.setCookie(name, value, options);</td></tr><tr class="miss"><td class="line">195</td><td class="hits">0</td><td class="source"> return this;</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">197</td><td class="hits">0</td><td class="source"> return name === undefined ? this.http.cookie : (this.http.cookie[name] || '');</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> * session</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> * 如果是get操作,则返回一个promise</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> session: function(name, value) {</td></tr><tr class="miss"><td class="line">207</td><td class="hits">0</td><td class="source"> thinkRequire('Session').start(this.http);</td></tr><tr class="miss"><td class="line">208</td><td class="hits">0</td><td class="source"> var instance = this.http.session;</td></tr><tr class="miss"><td class="line">209</td><td class="hits">0</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">210</td><td class="hits">0</td><td class="source"> return instance.rm();</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">212</td><td class="hits">0</td><td class="source"> if (value !== undefined) {</td></tr><tr class="miss"><td class="line">213</td><td class="hits">0</td><td class="source"> return instance.set(name, value);</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">215</td><td class="hits">0</td><td class="source"> return instance.get(name);</td></tr><tr><td class="line">216</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> * 跳转,返回一个pendding promise阻止后面继续执行</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> * @param {[type]} url [description]</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> * @param {[type]} code [description]</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> redirect: function(url, code) {</td></tr><tr class="miss"><td class="line">224</td><td class="hits">0</td><td class="source"> this.http.redirect(url, code);</td></tr><tr class="miss"><td class="line">225</td><td class="hits">0</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> * 赋值变量到模版</td></tr><tr><td class="line">229</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> assign: function(name, value) {</td></tr><tr class="hit"><td class="line">234</td><td class="hits">2</td><td class="source"> if (arguments.length <= 1) {</td></tr><tr class="miss"><td class="line">235</td><td class="hits">0</td><td class="source"> return this.initView().assign(name);</td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">237</td><td class="hits">2</td><td class="source"> return this.initView().assign(name, value);</td></tr><tr><td class="line">238</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">240</td><td class="hits"></td><td class="source"> * 获取解析后的模版内容</td></tr><tr><td class="line">241</td><td class="hits"></td><td class="source"> * @param {[type]} templateFile [description]</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> * @param {[type]} content [description]</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> fetch: function(templateFile) {</td></tr><tr class="miss"><td class="line">246</td><td class="hits">0</td><td class="source"> return this.initView().fetch(templateFile);</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> * 输出模版内容</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> * @param {[type]} templateFile [description]</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> * @param {[type]} charset [description]</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> * @param {[type]} contentType [description]</td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> * @param {[type]} content [description]</td></tr><tr><td class="line">254</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">255</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> display: function(templateFile, charset, contentType) {</td></tr><tr class="hit"><td class="line">257</td><td class="hits">1</td><td class="source"> return this.initView().display(templateFile, charset, contentType);</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">259</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source"> * 调用另一个controll里的aciton</td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> * 可以跨分组</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> * A('Admin/Test/index')</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> * @param {[type]} action [description]</td></tr><tr><td class="line">264</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">265</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">266</td><td class="hits"></td><td class="source"> action: function(action, data) {</td></tr><tr><td class="line">267</td><td class="hits"></td><td class="source"> //自动补group</td></tr><tr class="miss"><td class="line">268</td><td class="hits">0</td><td class="source"> action = action.replace(/\//g, ':');</td></tr><tr class="miss"><td class="line">269</td><td class="hits">0</td><td class="source"> if (action.split(':').length === 2) {</td></tr><tr class="miss"><td class="line">270</td><td class="hits">0</td><td class="source"> action = this.http.group + ':' + action;</td></tr><tr><td class="line">271</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">272</td><td class="hits">0</td><td class="source"> return A(action, this.http, data);</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">274</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">275</td><td class="hits"></td><td class="source"> * jsonp格式输出</td></tr><tr><td class="line">276</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">277</td><td class="hits"></td><td class="source"> * @param {[type]} jsonp [description]</td></tr><tr><td class="line">278</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> jsonp: function(data) {</td></tr><tr class="miss"><td class="line">281</td><td class="hits">0</td><td class="source"> this.type(C('json_content_type'));</td></tr><tr class="miss"><td class="line">282</td><td class="hits">0</td><td class="source"> var callback = this.get(C('url_callback_name'));</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> //过滤callback值里的非法字符</td></tr><tr class="miss"><td class="line">284</td><td class="hits">0</td><td class="source"> callback = callback.replace(/[^\w\.]/g, '');</td></tr><tr class="miss"><td class="line">285</td><td class="hits">0</td><td class="source"> if (callback) {</td></tr><tr class="miss"><td class="line">286</td><td class="hits">0</td><td class="source"> data = callback + '(' + (data !== undefined ? JSON.stringify(data) : '') + ')';</td></tr><tr class="miss"><td class="line">287</td><td class="hits">0</td><td class="source"> this.end(data);</td></tr><tr><td class="line">288</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">289</td><td class="hits">0</td><td class="source"> this.end(data);</td></tr><tr><td class="line">290</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">291</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">292</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source"> * json格式输出</td></tr><tr><td class="line">294</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">295</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">296</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">297</td><td class="hits"></td><td class="source"> json: function(data){</td></tr><tr class="miss"><td class="line">298</td><td class="hits">0</td><td class="source"> this.type(C('json_content_type'));</td></tr><tr class="miss"><td class="line">299</td><td class="hits">0</td><td class="source"> return this.end(data);</td></tr><tr><td class="line">300</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">301</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">302</td><td class="hits"></td><td class="source"> * 设置http响应状态码</td></tr><tr><td class="line">303</td><td class="hits"></td><td class="source"> * @param {[type]} status [description]</td></tr><tr><td class="line">304</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">305</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">306</td><td class="hits"></td><td class="source"> status: function(status) {</td></tr><tr class="miss"><td class="line">307</td><td class="hits">0</td><td class="source"> var res = this.http.res;</td></tr><tr class="miss"><td class="line">308</td><td class="hits">0</td><td class="source"> if (!res.headersSent) {</td></tr><tr class="miss"><td class="line">309</td><td class="hits">0</td><td class="source"> res.statusCode = status || 404;</td></tr><tr><td class="line">310</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">311</td><td class="hits">0</td><td class="source"> return this;</td></tr><tr><td class="line">312</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">313</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source"> * 阻止访问</td></tr><tr><td class="line">315</td><td class="hits"></td><td class="source"> * @param {[type]} status [description]</td></tr><tr><td class="line">316</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">317</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">318</td><td class="hits"></td><td class="source"> deny: function(status){</td></tr><tr class="miss"><td class="line">319</td><td class="hits">0</td><td class="source"> var res = this.http.res;</td></tr><tr class="miss"><td class="line">320</td><td class="hits">0</td><td class="source"> if (!res.headersSent) {</td></tr><tr class="miss"><td class="line">321</td><td class="hits">0</td><td class="source"> res.statusCode = status || 403;</td></tr><tr class="miss"><td class="line">322</td><td class="hits">0</td><td class="source"> this.http.end();</td></tr><tr><td class="line">323</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">324</td><td class="hits">0</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">325</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">326</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source"> * 输出内容</td></tr><tr><td class="line">328</td><td class="hits"></td><td class="source"> * 自动JSON.stringify</td></tr><tr><td class="line">329</td><td class="hits"></td><td class="source"> * 自定将数字等转化为字符串</td></tr><tr><td class="line">330</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">331</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">332</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">333</td><td class="hits"></td><td class="source"> echo: function(obj, encoding) {</td></tr><tr><td class="line">334</td><td class="hits"></td><td class="source"> //自动发送Content-Type的header</td></tr><tr class="miss"><td class="line">335</td><td class="hits">0</td><td class="source"> if (C('auto_send_content_type')) {</td></tr><tr class="miss"><td class="line">336</td><td class="hits">0</td><td class="source"> this.type(C('tpl_content_type'));</td></tr><tr><td class="line">337</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">338</td><td class="hits">0</td><td class="source"> return this.http.echo(obj, encoding);</td></tr><tr><td class="line">339</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">340</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">341</td><td class="hits"></td><td class="source"> * 结束输出,输出完成时一定要调用这个方法</td></tr><tr><td class="line">342</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">343</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">344</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">345</td><td class="hits"></td><td class="source"> end: function(obj, encoding) {</td></tr><tr class="miss"><td class="line">346</td><td class="hits">0</td><td class="source"> if (obj !== undefined) {</td></tr><tr class="miss"><td class="line">347</td><td class="hits">0</td><td class="source"> this.echo(obj, encoding);</td></tr><tr><td class="line">348</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">349</td><td class="hits">0</td><td class="source"> this.http.end();</td></tr><tr><td class="line">350</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">351</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">352</td><td class="hits"></td><td class="source"> * 发送Content-Type</td></tr><tr><td class="line">353</td><td class="hits"></td><td class="source"> * @param {[type]} type [description]</td></tr><tr><td class="line">354</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">355</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">356</td><td class="hits"></td><td class="source"> type: function(ext){</td></tr><tr class="miss"><td class="line">357</td><td class="hits">0</td><td class="source"> if (this.http.cthIsSend || !ext) {</td></tr><tr class="miss"><td class="line">358</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">359</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">360</td><td class="hits">0</td><td class="source"> if (ext.indexOf('/') === -1) {</td></tr><tr class="miss"><td class="line">361</td><td class="hits">0</td><td class="source"> ext = require('mime').lookup(ext);</td></tr><tr><td class="line">362</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">363</td><td class="hits">0</td><td class="source"> if (ext.toLowerCase().indexOf('charset=') === -1) {</td></tr><tr class="miss"><td class="line">364</td><td class="hits">0</td><td class="source"> ext += '; charset=' + C('encoding');</td></tr><tr><td class="line">365</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">366</td><td class="hits"></td><td class="source"> //Content-Type Header has been Send</td></tr><tr class="miss"><td class="line">367</td><td class="hits">0</td><td class="source"> this.http.cthIsSend = true;</td></tr><tr class="miss"><td class="line">368</td><td class="hits">0</td><td class="source"> this.http.setHeader('Content-Type', ext);</td></tr><tr><td class="line">369</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">370</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">371</td><td class="hits"></td><td class="source"> * 下载文件</td></tr><tr><td class="line">372</td><td class="hits"></td><td class="source"> * @return Promise [description]</td></tr><tr><td class="line">373</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">374</td><td class="hits"></td><td class="source"> download: function(file, contentType, filename) {</td></tr><tr class="miss"><td class="line">375</td><td class="hits">0</td><td class="source"> if (isString(contentType) && contentType.indexOf('.') > -1) {</td></tr><tr class="miss"><td class="line">376</td><td class="hits">0</td><td class="source"> filename = contentType;</td></tr><tr class="miss"><td class="line">377</td><td class="hits">0</td><td class="source"> contentType = '';</td></tr><tr><td class="line">378</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">379</td><td class="hits">0</td><td class="source"> if (!contentType || contentType.indexOf('/') === -1) {</td></tr><tr class="miss"><td class="line">380</td><td class="hits">0</td><td class="source"> contentType = require('mime').lookup(contentType || file);</td></tr><tr><td class="line">381</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">382</td><td class="hits">0</td><td class="source"> var http = this.http;</td></tr><tr class="miss"><td class="line">383</td><td class="hits">0</td><td class="source"> var fileStream = fs.createReadStream(file);</td></tr><tr class="miss"><td class="line">384</td><td class="hits">0</td><td class="source"> var deferred = getDefer();</td></tr><tr class="miss"><td class="line">385</td><td class="hits">0</td><td class="source"> this.type(contentType);</td></tr><tr class="miss"><td class="line">386</td><td class="hits">0</td><td class="source"> http.setHeader('Content-Disposition', 'attachment; filename="' + (filename || path.basename(file)) + '"');</td></tr><tr class="miss"><td class="line">387</td><td class="hits">0</td><td class="source"> fileStream.pipe(http.res);</td></tr><tr class="miss"><td class="line">388</td><td class="hits">0</td><td class="source"> fileStream.on('end', function() {</td></tr><tr class="miss"><td class="line">389</td><td class="hits">0</td><td class="source"> http.end();</td></tr><tr class="miss"><td class="line">390</td><td class="hits">0</td><td class="source"> deferred.resolve();</td></tr><tr><td class="line">391</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">392</td><td class="hits">0</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">393</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">394</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">395</td><td class="hits"></td><td class="source"> * 正常json数据输出</td></tr><tr><td class="line">396</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">397</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">398</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">399</td><td class="hits"></td><td class="source"> success: function(data){</td></tr><tr class="miss"><td class="line">400</td><td class="hits">0</td><td class="source"> var obj = getObject([C('error_no_key'), C('error_msg_key')], [0, '']);</td></tr><tr class="miss"><td class="line">401</td><td class="hits">0</td><td class="source"> if (data !== undefined) {</td></tr><tr class="miss"><td class="line">402</td><td class="hits">0</td><td class="source"> obj.data = data;</td></tr><tr><td class="line">403</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">404</td><td class="hits">0</td><td class="source"> this.type(C('json_content_type'));</td></tr><tr class="miss"><td class="line">405</td><td class="hits">0</td><td class="source"> this.end(obj);</td></tr><tr class="miss"><td class="line">406</td><td class="hits">0</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">407</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">408</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">409</td><td class="hits"></td><td class="source"> * 异常json数据数据</td></tr><tr><td class="line">410</td><td class="hits"></td><td class="source"> * @param {[type]} errno [description]</td></tr><tr><td class="line">411</td><td class="hits"></td><td class="source"> * @param {[type]} errmsg [description]</td></tr><tr><td class="line">412</td><td class="hits"></td><td class="source"> * @param {[type]} extra [description]</td></tr><tr><td class="line">413</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">414</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">415</td><td class="hits"></td><td class="source"> error: function(errno, errmsg, data){</td></tr><tr class="miss"><td class="line">416</td><td class="hits">0</td><td class="source"> var obj;</td></tr><tr class="miss"><td class="line">417</td><td class="hits">0</td><td class="source"> if (isObject(errno)) {</td></tr><tr class="miss"><td class="line">418</td><td class="hits">0</td><td class="source"> data = errmsg;</td></tr><tr class="miss"><td class="line">419</td><td class="hits">0</td><td class="source"> obj = extend({}, errno);</td></tr><tr><td class="line">420</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">421</td><td class="hits">0</td><td class="source"> if (!isNumber(errno)) {</td></tr><tr class="miss"><td class="line">422</td><td class="hits">0</td><td class="source"> data = errmsg;</td></tr><tr class="miss"><td class="line">423</td><td class="hits">0</td><td class="source"> errmsg = errno;</td></tr><tr class="miss"><td class="line">424</td><td class="hits">0</td><td class="source"> errno = C('error_no_default_value');</td></tr><tr><td class="line">425</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">426</td><td class="hits">0</td><td class="source"> obj = getObject([C('error_no_key'), C('error_msg_key')], [errno, errmsg || 'error']);</td></tr><tr><td class="line">427</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">428</td><td class="hits">0</td><td class="source"> if (data !== undefined) {</td></tr><tr class="miss"><td class="line">429</td><td class="hits">0</td><td class="source"> obj.data = data;</td></tr><tr><td class="line">430</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">431</td><td class="hits">0</td><td class="source"> this.type(C('json_content_type'));</td></tr><tr class="miss"><td class="line">432</td><td class="hits">0</td><td class="source"> this.end(obj);</td></tr><tr class="miss"><td class="line">433</td><td class="hits">0</td><td class="source"> return getDefer().promise;</td></tr><tr><td class="line">434</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">435</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">436</td><td class="hits"></td><td class="source"> * 关闭数据库连接</td></tr><tr><td class="line">437</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">438</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">439</td><td class="hits"></td><td class="source"> closeDb: function(){</td></tr><tr class="miss"><td class="line">440</td><td class="hits">0</td><td class="source"> thinkRequire('Model').close();</td></tr><tr><td class="line">441</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">442</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">443</td><td class="hits"></td><td class="source"> * 发送执行时间</td></tr><tr><td class="line">444</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">445</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">446</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">447</td><td class="hits"></td><td class="source"> sendTime: function(name){</td></tr><tr class="miss"><td class="line">448</td><td class="hits">0</td><td class="source"> return this.http.sendTime(name);</td></tr><tr><td class="line">449</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">450</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">451</td><td class="hits"></td><td class="source"> * 对数据进行过滤</td></tr><tr><td class="line">452</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">453</td><td class="hits"></td><td class="source"> * @param {[type]} type [description]</td></tr><tr><td class="line">454</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">455</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">456</td><td class="hits"></td><td class="source"> filter: function() {</td></tr><tr class="miss"><td class="line">457</td><td class="hits">0</td><td class="source"> var filter = thinkRequire('Filter').filter;</td></tr><tr class="miss"><td class="line">458</td><td class="hits">0</td><td class="source"> return filter.apply(null, arguments);</td></tr><tr><td class="line">459</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">460</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">461</td><td class="hits"></td><td class="source"> * 校验一个值是否合法</td></tr><tr><td class="line">462</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">463</td><td class="hits"></td><td class="source"> * @param {[type]} validType [description]</td></tr><tr><td class="line">464</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">465</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">466</td><td class="hits"></td><td class="source"> valid: function(data, validType) {</td></tr><tr><td class="line">467</td><td class="hits"></td><td class="source"> //单个值检测,只返回是否正常</td></tr><tr class="miss"><td class="line">468</td><td class="hits">0</td><td class="source"> if (validType !== undefined) {</td></tr><tr class="miss"><td class="line">469</td><td class="hits">0</td><td class="source"> data = [{</td></tr><tr><td class="line">470</td><td class="hits"></td><td class="source"> value: data,</td></tr><tr><td class="line">471</td><td class="hits"></td><td class="source"> valid: validType</td></tr><tr><td class="line">472</td><td class="hits"></td><td class="source"> }];</td></tr><tr class="miss"><td class="line">473</td><td class="hits">0</td><td class="source"> var result = thinkRequire('Valid')(data);</td></tr><tr class="miss"><td class="line">474</td><td class="hits">0</td><td class="source"> return isEmpty(result);</td></tr><tr><td class="line">475</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">476</td><td class="hits">0</td><td class="source"> return thinkRequire('Valid')(data);</td></tr><tr><td class="line">477</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">478</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">479</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Dispatcher.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Dispatcher.js</h2><div id="stats" class="high"><div class="percentage">84%</div><div class="sloc">50</div><div class="hits">42</div><div class="misses">8</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 路由识别</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var Dispatcher = module.exports = Class(function(){</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * 初始化</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> * @param {[type]} http [description]</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> init: function(http){</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> this.http = http;</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> * 准备pathanem</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> preparePathName: function(){</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> var pathname = this.http.pathname.split('/').filter(function(item){</td></tr><tr class="hit"><td class="line">22</td><td class="hits">2</td><td class="source"> return item.trim();</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }).join('/');</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> //去除pathname前缀</td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source"> var prefix = C('url_pathname_prefix');</td></tr><tr class="hit"><td class="line">26</td><td class="hits">1</td><td class="source"> if (prefix && pathname.indexOf(prefix) === 0) {</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> pathname = pathname.substr(prefix.length);</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> //判断URL后缀</td></tr><tr class="hit"><td class="line">30</td><td class="hits">1</td><td class="source"> var suffix = C('url_pathname_suffix');</td></tr><tr class="hit"><td class="line">31</td><td class="hits">1</td><td class="source"> if (suffix && pathname.substr(0 - suffix.length) === suffix) {</td></tr><tr class="miss"><td class="line">32</td><td class="hits">0</td><td class="source"> pathname = pathname.substr(0, pathname.length - suffix.length);</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">34</td><td class="hits">1</td><td class="source"> this.http.pathname = pathname;</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> * 解析pathname</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> parsePathName: function(){</td></tr><tr class="hit"><td class="line">41</td><td class="hits">1</td><td class="source"> if (this.http.group) {</td></tr><tr class="miss"><td class="line">42</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">44</td><td class="hits">1</td><td class="source"> var paths = this.http.pathname.split('/');</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> //将group list变为小写</td></tr><tr class="hit"><td class="line">46</td><td class="hits">1</td><td class="source"> var groupList = C('app_group_list').map(function(item){</td></tr><tr class="hit"><td class="line">47</td><td class="hits">3</td><td class="source"> return item.toLowerCase();</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">49</td><td class="hits">1</td><td class="source"> var group = '';</td></tr><tr class="hit"><td class="line">50</td><td class="hits">1</td><td class="source"> if (groupList.length && paths[0] && groupList.indexOf(paths[0].toLowerCase()) > -1) {</td></tr><tr class="miss"><td class="line">51</td><td class="hits">0</td><td class="source"> group = paths.shift();</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">53</td><td class="hits">1</td><td class="source"> var controller = paths.shift();</td></tr><tr class="hit"><td class="line">54</td><td class="hits">1</td><td class="source"> var action = paths.shift();</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> //解析剩余path的参数</td></tr><tr class="hit"><td class="line">56</td><td class="hits">1</td><td class="source"> if (paths.length) {</td></tr><tr class="miss"><td class="line">57</td><td class="hits">0</td><td class="source"> for(var i = 0,length = Math.ceil(paths.length) / 2; i < length; i++){</td></tr><tr class="miss"><td class="line">58</td><td class="hits">0</td><td class="source"> this.http.get[paths[i * 2]] = paths[i * 2 + 1] || '';</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">61</td><td class="hits">1</td><td class="source"> this.http.group = Dispatcher.getGroup(group);</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> this.http.controller = Dispatcher.getController(controller);</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source"> this.http.action = Dispatcher.getAction(action);</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> * run</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> run: function(){</td></tr><tr class="hit"><td class="line">70</td><td class="hits">1</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">71</td><td class="hits">1</td><td class="source"> return tag('resource_check', this.http).then(function(){</td></tr><tr class="hit"><td class="line">72</td><td class="hits">1</td><td class="source"> return self.preparePathName();</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">74</td><td class="hits">1</td><td class="source"> return tag('path_info', self.http);</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">76</td><td class="hits">1</td><td class="source"> return tag('route_check', self.http);</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">78</td><td class="hits">1</td><td class="source"> return self.parsePathName();</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source">});</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> * 获取group</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> * @param {[type]} group [description]</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source">Dispatcher.getGroup = function(group){</td></tr><tr class="hit"><td class="line">89</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">90</td><td class="hits">1</td><td class="source"> group = group || C('default_group');</td></tr><tr class="hit"><td class="line">91</td><td class="hits">1</td><td class="source"> return ucfirst(group);</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> * 检测Controller和Action是否合法的正则</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> * @type {RegExp}</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">98</td><td class="hits">1</td><td class="source">var nameReg = /^[A-Za-z\_](\w)*$/;</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> * 获取controller</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> * @param {[type]} controller [description]</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">104</td><td class="hits">1</td><td class="source">Dispatcher.getController = function(controller){</td></tr><tr class="hit"><td class="line">105</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">106</td><td class="hits">1</td><td class="source"> if (!controller || !nameReg.test(controller)) {</td></tr><tr class="hit"><td class="line">107</td><td class="hits">1</td><td class="source"> return ucfirst(C('default_controller'));</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">109</td><td class="hits">0</td><td class="source"> return ucfirst(controller);</td></tr><tr><td class="line">110</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> * 获取action</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> * @param {[type]} action [description]</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">116</td><td class="hits">1</td><td class="source">Dispatcher.getAction = function(action){</td></tr><tr class="hit"><td class="line">117</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">118</td><td class="hits">1</td><td class="source"> if (!action || !nameReg.test(action)) {</td></tr><tr class="hit"><td class="line">119</td><td class="hits">1</td><td class="source"> return C('default_action');</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">121</td><td class="hits">0</td><td class="source"> return action;</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Http.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Http.js</h2><div id="stats" class="low"><div class="percentage">38%</div><div class="sloc">142</div><div class="hits">55</div><div class="misses">87</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 对HttpRequest和HttpResponse 2个对象重新包装</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var querystring = require('querystring');</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var url = require('url');</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">var cookie = thinkRequire('Cookie');</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">var EventEmitter = require('events').EventEmitter;</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source">var multiparty = require('multiparty');</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">var localIp = '127.0.0.1';</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source">module.exports = Class(function(){</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> init: function(req, res){</td></tr><tr class="hit"><td class="line">16</td><td class="hits">2</td><td class="source"> this.req = req;</td></tr><tr class="hit"><td class="line">17</td><td class="hits">2</td><td class="source"> this.res = res;</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> //http对象为EventEmitter的实例</td></tr><tr class="hit"><td class="line">19</td><td class="hits">2</td><td class="source"> this.http = new EventEmitter();</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> //记录当前请求的开始时间</td></tr><tr class="hit"><td class="line">21</td><td class="hits">2</td><td class="source"> this.http.startTime = Date.now();</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> * 执行</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> * @param {Function} callback [description]</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> * @return Promise [description]</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> run: function(){</td></tr><tr class="hit"><td class="line">29</td><td class="hits">2</td><td class="source"> this._request();</td></tr><tr class="hit"><td class="line">30</td><td class="hits">2</td><td class="source"> this._response();</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> //数组的indexOf要比字符串的indexOf略快</td></tr><tr class="hit"><td class="line">32</td><td class="hits">2</td><td class="source"> var methods = ['POST', 'PUT', 'PATCH'];</td></tr><tr class="hit"><td class="line">33</td><td class="hits">2</td><td class="source"> if (methods.indexOf(this.req.method) > -1) {</td></tr><tr class="miss"><td class="line">34</td><td class="hits">0</td><td class="source"> return this.getPostData();</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">36</td><td class="hits">2</td><td class="source"> return getPromise(this.http);</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> * 检测是否含有post数据</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> hasPostData: function(){</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> if ('transfer-encoding' in this.req.headers) {</td></tr><tr class="miss"><td class="line">44</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">46</td><td class="hits">0</td><td class="source"> var contentLength = this.req.headers['content-length'] | 0;</td></tr><tr class="miss"><td class="line">47</td><td class="hits">0</td><td class="source"> return contentLength > 0;</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> * 含有文件的表单上传</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> _filePost: function(){</td></tr><tr class="miss"><td class="line">54</td><td class="hits">0</td><td class="source"> var deferred = getDefer();</td></tr><tr class="miss"><td class="line">55</td><td class="hits">0</td><td class="source"> var self = this;</td></tr><tr class="miss"><td class="line">56</td><td class="hits">0</td><td class="source"> var form = new multiparty.Form({</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> maxFieldsSize: C('post_max_fields_size'),</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> maxFields: C('post_max_fields'),</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> maxFilesSize: C('post_max_file_size')</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">61</td><td class="hits">0</td><td class="source"> form.on('file', function(name, value){</td></tr><tr class="miss"><td class="line">62</td><td class="hits">0</td><td class="source"> self.http.file[name] = value;</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">64</td><td class="hits">0</td><td class="source"> form.on('field', function(name, value){</td></tr><tr class="miss"><td class="line">65</td><td class="hits">0</td><td class="source"> self.http.post[name] = value;</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">67</td><td class="hits">0</td><td class="source"> form.on('close', function(){</td></tr><tr class="miss"><td class="line">68</td><td class="hits">0</td><td class="source"> deferred.resolve(self.http);</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> //有错误后直接拒绝当前请求</td></tr><tr class="miss"><td class="line">71</td><td class="hits">0</td><td class="source"> form.on('error', function(){</td></tr><tr class="miss"><td class="line">72</td><td class="hits">0</td><td class="source"> self.res.statusCode = 413;</td></tr><tr class="miss"><td class="line">73</td><td class="hits">0</td><td class="source"> self.res.end();</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">75</td><td class="hits">0</td><td class="source"> form.parse(this.req);</td></tr><tr class="miss"><td class="line">76</td><td class="hits">0</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> * 普通的表单上传</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> _commonPost: function(){</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> var buffers = [];</td></tr><tr class="miss"><td class="line">84</td><td class="hits">0</td><td class="source"> var length = 0;</td></tr><tr class="miss"><td class="line">85</td><td class="hits">0</td><td class="source"> var self = this;</td></tr><tr class="miss"><td class="line">86</td><td class="hits">0</td><td class="source"> var deferred = getDefer();</td></tr><tr class="miss"><td class="line">87</td><td class="hits">0</td><td class="source"> this.req.on('data', function(chunk){</td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> buffers.push(chunk);</td></tr><tr class="miss"><td class="line">89</td><td class="hits">0</td><td class="source"> length += chunk.length;</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">91</td><td class="hits">0</td><td class="source"> this.req.on('end', function(){</td></tr><tr class="miss"><td class="line">92</td><td class="hits">0</td><td class="source"> self.http.payload = Buffer.concat(buffers).toString();</td></tr><tr class="miss"><td class="line">93</td><td class="hits">0</td><td class="source"> tag('form_parse', self.http).then(function(){</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> //默认使用querystring.parse解析</td></tr><tr class="miss"><td class="line">95</td><td class="hits">0</td><td class="source"> if (isEmpty(self.http.post) && self.http.payload) {</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> self.http.post = querystring.parse(self.http.payload) || {}</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">98</td><td class="hits">0</td><td class="source"> var post = self.http.post;</td></tr><tr class="miss"><td class="line">99</td><td class="hits">0</td><td class="source"> var length = Object.keys(post);</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> //最大表单数超过限制</td></tr><tr class="miss"><td class="line">101</td><td class="hits">0</td><td class="source"> if (length > C('post_max_fields')) {</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> self.res.statusCode = 413;</td></tr><tr class="miss"><td class="line">103</td><td class="hits">0</td><td class="source"> self.res.end();</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">106</td><td class="hits">0</td><td class="source"> for(var name in post){</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> //单个表单值长度超过限制</td></tr><tr class="miss"><td class="line">108</td><td class="hits">0</td><td class="source"> if (post[name].length > C('post_max_fields_size')) {</td></tr><tr class="miss"><td class="line">109</td><td class="hits">0</td><td class="source"> self.res.statusCode = 413;</td></tr><tr class="miss"><td class="line">110</td><td class="hits">0</td><td class="source"> self.res.end();</td></tr><tr class="miss"><td class="line">111</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">114</td><td class="hits">0</td><td class="source"> deferred.resolve(self.http);</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> })</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">117</td><td class="hits">0</td><td class="source"> return deferred.promise;</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> * 获取POST过来的数据,包含上传的文件</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> * 依赖multiparty库</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> getPostData: function(){</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> //没有post数据,直接返回</td></tr><tr class="miss"><td class="line">126</td><td class="hits">0</td><td class="source"> if (!this.hasPostData()) {</td></tr><tr class="miss"><td class="line">127</td><td class="hits">0</td><td class="source"> return getPromise(this.http);</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> //上传的数据中是否含有文件的检测正则</td></tr><tr class="miss"><td class="line">130</td><td class="hits">0</td><td class="source"> var multiReg = /^multipart\/(form-data|related);\s*boundary=(?:"([^"]+)"|([^;]+))$/i;</td></tr><tr class="miss"><td class="line">131</td><td class="hits">0</td><td class="source"> if (multiReg.test(this.req.headers['content-type'])) {</td></tr><tr class="miss"><td class="line">132</td><td class="hits">0</td><td class="source"> return this._filePost();</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">134</td><td class="hits">0</td><td class="source"> return this._commonPost();</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> * HttpRequest增强</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> _request: function(){</td></tr><tr class="hit"><td class="line">142</td><td class="hits">2</td><td class="source"> var req = {</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> //http版本号</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> version: this.req.httpVersion,</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> //请求方法</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> method: this.req.method,</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> //请求头</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> headers: this.req.headers,</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> getHeader: function(name){</td></tr><tr class="miss"><td class="line">150</td><td class="hits">0</td><td class="source"> return this.headers[name] || '';</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> //请求的Content-Type</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> contentType: (this.req.headers['content-type'] || '').split(';')[0].trim(),</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> //post信息</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> post: {},</td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> //上传的文件信息</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> file: {},</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> //请求用户的ip</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> ip: function(){</td></tr><tr class="miss"><td class="line">160</td><td class="hits">0</td><td class="source"> var connection = this.req.connection;</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> var socket = this.req.socket;</td></tr><tr class="miss"><td class="line">162</td><td class="hits">0</td><td class="source"> var ip = (connection && connection.remoteAddress) || (socket && socket.remoteAddress);</td></tr><tr class="miss"><td class="line">163</td><td class="hits">0</td><td class="source"> if (ip && ip !== localIp) {</td></tr><tr class="miss"><td class="line">164</td><td class="hits">0</td><td class="source"> return ip;</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">166</td><td class="hits">0</td><td class="source"> return this.headers['x-forwarded-for'] || this.headers['x-real-ip'] || localIp;</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> //请求的cookie</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> cookie: cookie.parse(this.req.headers.cookie || '')</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">171</td><td class="hits">2</td><td class="source"> extend(this.http, req);</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> //解析url中的参数</td></tr><tr class="hit"><td class="line">174</td><td class="hits">2</td><td class="source"> var urlInfo = url.parse('//' + req.headers.host + this.req.url, true, true);</td></tr><tr class="hit"><td class="line">175</td><td class="hits">2</td><td class="source"> this.http.pathname = urlInfo.pathname;</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> //query只记录?后面的参数</td></tr><tr class="hit"><td class="line">177</td><td class="hits">2</td><td class="source"> this.http.query = urlInfo.query;</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> //get包含路由解析追加的参数</td></tr><tr class="hit"><td class="line">179</td><td class="hits">2</td><td class="source"> this.http.get = extend({}, urlInfo.query);</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> //主机名,带端口</td></tr><tr class="hit"><td class="line">181</td><td class="hits">2</td><td class="source"> this.http.host = urlInfo.host;</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> //主机名,不带端口</td></tr><tr class="hit"><td class="line">183</td><td class="hits">2</td><td class="source"> this.http.hostname = urlInfo.hostname;</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> //将原生的request对象放在http上,方便后续在controller等地方使用</td></tr><tr class="hit"><td class="line">185</td><td class="hits">2</td><td class="source"> this.http.req = this.req;</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> * HttpResponse增强</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> _response: function(){</td></tr><tr class="hit"><td class="line">192</td><td class="hits">2</td><td class="source"> var res = {</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> * 一次请求下,可能会发送多个Cookie,所以这里不能立即发送</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> * 需要临时存起来,到输出内容前统一发送</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> _cookie: {}, </td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> * 发送header</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> setHeader: function(name, value){</td></tr><tr class="hit"><td class="line">205</td><td class="hits">2</td><td class="source"> if (!this.res.headersSent) {</td></tr><tr class="hit"><td class="line">206</td><td class="hits">2</td><td class="source"> this.res.setHeader(name, value);</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">208</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">210</td><td class="hits"></td><td class="source"> * 设置cookie</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> * @param {[type]} options [description]</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> setCookie: function(name, value, options){</td></tr><tr class="miss"><td class="line">216</td><td class="hits">0</td><td class="source"> options = options || {};</td></tr><tr class="miss"><td class="line">217</td><td class="hits">0</td><td class="source"> if (typeof options === 'number') {</td></tr><tr class="miss"><td class="line">218</td><td class="hits">0</td><td class="source"> options = {timeout: options};</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">220</td><td class="hits">0</td><td class="source"> var timeout = options.timeout;</td></tr><tr class="miss"><td class="line">221</td><td class="hits">0</td><td class="source"> if (timeout === undefined) {</td></tr><tr class="miss"><td class="line">222</td><td class="hits">0</td><td class="source"> timeout = C('cookie_timeout');</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">224</td><td class="hits">0</td><td class="source"> delete options.timeout;</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> //if value is null, remove cookie</td></tr><tr class="miss"><td class="line">226</td><td class="hits">0</td><td class="source"> if (value === null) {</td></tr><tr class="miss"><td class="line">227</td><td class="hits">0</td><td class="source"> timeout = -1000;</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">229</td><td class="hits">0</td><td class="source"> var defaultOptions = {</td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> path: C('cookie_path'),</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> domain: C('cookie_domain'),</td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> expires: new Date (Date.now() + timeout * 1000)</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> };</td></tr><tr class="miss"><td class="line">234</td><td class="hits">0</td><td class="source"> if (timeout === 0) {</td></tr><tr class="miss"><td class="line">235</td><td class="hits">0</td><td class="source"> delete defaultOptions.expires;</td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">237</td><td class="hits">0</td><td class="source"> for(var key in options){</td></tr><tr class="miss"><td class="line">238</td><td class="hits">0</td><td class="source"> defaultOptions[key.toLowerCase()] = options[key];</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">240</td><td class="hits">0</td><td class="source"> defaultOptions.name = name;</td></tr><tr class="miss"><td class="line">241</td><td class="hits">0</td><td class="source"> defaultOptions.value = encodeURIComponent(value + '');</td></tr><tr class="miss"><td class="line">242</td><td class="hits">0</td><td class="source"> this._cookie[name] = defaultOptions;</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> * 将队列中的cookie发送出去</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> sendCookie: function(){</td></tr><tr class="hit"><td class="line">249</td><td class="hits">2</td><td class="source"> var cookies = Object.values(this._cookie).map(function(item){</td></tr><tr class="miss"><td class="line">250</td><td class="hits">0</td><td class="source"> return cookie.stringify(item.name, item.value, item);</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">252</td><td class="hits">2</td><td class="source"> if (cookies.length) {</td></tr><tr class="miss"><td class="line">253</td><td class="hits">0</td><td class="source"> this.setHeader('Set-Cookie', cookies);</td></tr><tr><td class="line">254</td><td class="hits"></td><td class="source"> //发送Cookie后不清除_cookie内容,websocket里需要读取</td></tr><tr><td class="line">255</td><td class="hits"></td><td class="source"> //this._cookie = {};</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">257</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">259</td><td class="hits"></td><td class="source"> * url跳转</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source"> * @param {[type]} url [description]</td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> * @param {[type]} code [description]</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">264</td><td class="hits"></td><td class="source"> redirect: function(url, code){</td></tr><tr class="miss"><td class="line">265</td><td class="hits">0</td><td class="source"> this.res.statusCode = code || 302;</td></tr><tr class="miss"><td class="line">266</td><td class="hits">0</td><td class="source"> this.setHeader('Location', url || '/');</td></tr><tr class="miss"><td class="line">267</td><td class="hits">0</td><td class="source"> this.end();</td></tr><tr><td class="line">268</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">269</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">270</td><td class="hits"></td><td class="source"> * 发送执行时间</td></tr><tr><td class="line">271</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">272</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">273</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">274</td><td class="hits"></td><td class="source"> sendTime: function(name){</td></tr><tr class="miss"><td class="line">275</td><td class="hits">0</td><td class="source"> var time = Date.now() - this.startTime;</td></tr><tr class="miss"><td class="line">276</td><td class="hits">0</td><td class="source"> this.setHeader('X-' + (name || 'EXEC-TIME'), time + 'ms');</td></tr><tr><td class="line">277</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">278</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> * 输出内容</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> * @param {[type]} encoding [description]</td></tr><tr><td class="line">282</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> echo: function(obj, encoding){</td></tr><tr class="hit"><td class="line">285</td><td class="hits">1</td><td class="source"> this.sendCookie();</td></tr><tr class="hit"><td class="line">286</td><td class="hits">1</td><td class="source"> if (obj === undefined) {</td></tr><tr class="miss"><td class="line">287</td><td class="hits">0</td><td class="source"> return;</td></tr><tr><td class="line">288</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">289</td><td class="hits">1</td><td class="source"> if (isArray(obj) || isObject(obj)) {</td></tr><tr class="miss"><td class="line">290</td><td class="hits">0</td><td class="source"> obj = JSON.stringify(obj);</td></tr><tr><td class="line">291</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">292</td><td class="hits">1</td><td class="source"> if (!isString(obj) && !(obj instanceof Buffer)) {</td></tr><tr class="miss"><td class="line">293</td><td class="hits">0</td><td class="source"> obj += '';</td></tr><tr><td class="line">294</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">295</td><td class="hits">1</td><td class="source"> this.res.write(obj, encoding || C('encoding'));</td></tr><tr><td class="line">296</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">297</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">298</td><td class="hits"></td><td class="source"> * 结束URL</td></tr><tr><td class="line">299</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">300</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">301</td><td class="hits"></td><td class="source"> end: function(){</td></tr><tr class="hit"><td class="line">302</td><td class="hits">1</td><td class="source"> this.emit('beforeEnd', this);</td></tr><tr class="hit"><td class="line">303</td><td class="hits">1</td><td class="source"> this.sendCookie();</td></tr><tr class="hit"><td class="line">304</td><td class="hits">1</td><td class="source"> this.res.end();</td></tr><tr class="hit"><td class="line">305</td><td class="hits">1</td><td class="source"> this.emit('afterEnd', this);</td></tr><tr><td class="line">306</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">307</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">308</td><td class="hits">2</td><td class="source"> extend(this.http, res);</td></tr><tr><td class="line">309</td><td class="hits"></td><td class="source"> //将原生的response对象放在http上,方便后续controller等地方使用</td></tr><tr class="hit"><td class="line">310</td><td class="hits">2</td><td class="source"> this.http.res = this.res;</td></tr><tr><td class="line">311</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">312</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">313</td><td class="hits"></td><td class="source">});</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">315</td><td class="hits"></td><td class="source"> * 获取默认的http信息</td></tr><tr><td class="line">316</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">317</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">318</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">319</td><td class="hits">1</td><td class="source">module.exports.getDefaultHttp = function(data){</td></tr><tr class="hit"><td class="line">320</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">321</td><td class="hits">1</td><td class="source"> data = data || {};</td></tr><tr class="hit"><td class="line">322</td><td class="hits">1</td><td class="source"> if (isString(data)) {</td></tr><tr class="hit"><td class="line">323</td><td class="hits">1</td><td class="source"> if (data[0] === '{') {</td></tr><tr class="miss"><td class="line">324</td><td class="hits">0</td><td class="source"> data = JSON.parse(data);</td></tr><tr class="hit"><td class="line">325</td><td class="hits">1</td><td class="source"> }else if (/^[\w]+\=/.test(data)) {</td></tr><tr class="miss"><td class="line">326</td><td class="hits">0</td><td class="source"> data = querystring.parse(data);</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">328</td><td class="hits">1</td><td class="source"> data = {url: data};</td></tr><tr><td class="line">329</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">330</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">331</td><td class="hits">1</td><td class="source"> var fn = function(){ </td></tr><tr class="hit"><td class="line">332</td><td class="hits">4</td><td class="source"> return '';</td></tr><tr><td class="line">333</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">334</td><td class="hits">1</td><td class="source"> var url = data.url || '';</td></tr><tr class="hit"><td class="line">335</td><td class="hits">1</td><td class="source"> if (url.indexOf('/') !== 0) {</td></tr><tr class="miss"><td class="line">336</td><td class="hits">0</td><td class="source"> url = '/' + url;</td></tr><tr><td class="line">337</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">338</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">339</td><td class="hits"></td><td class="source"> req: {</td></tr><tr><td class="line">340</td><td class="hits"></td><td class="source"> httpVersion: '1.1',</td></tr><tr><td class="line">341</td><td class="hits"></td><td class="source"> method: data.method || 'GET',</td></tr><tr><td class="line">342</td><td class="hits"></td><td class="source"> url: url,</td></tr><tr><td class="line">343</td><td class="hits"></td><td class="source"> headers: extend({</td></tr><tr><td class="line">344</td><td class="hits"></td><td class="source"> host: data.host || localIp</td></tr><tr><td class="line">345</td><td class="hits"></td><td class="source"> }, data.headers || {}),</td></tr><tr><td class="line">346</td><td class="hits"></td><td class="source"> connection: {</td></tr><tr><td class="line">347</td><td class="hits"></td><td class="source"> remoteAddress: data.ip || localIp</td></tr><tr><td class="line">348</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">349</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">350</td><td class="hits"></td><td class="source"> res: {</td></tr><tr><td class="line">351</td><td class="hits"></td><td class="source"> end: data.end || data.close || fn,</td></tr><tr><td class="line">352</td><td class="hits"></td><td class="source"> write: data.write || data.send || fn,</td></tr><tr><td class="line">353</td><td class="hits"></td><td class="source"> setHeader: fn</td></tr><tr><td class="line">354</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">355</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">356</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Think.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/Think.js</h2><div id="stats" class="medium"><div class="percentage">54%</div><div class="sloc">174</div><div class="hits">94</div><div class="misses">80</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var cluster = require('cluster');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source">//自动加载进行识别的路径</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var autoloadPaths = {};</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * [exports description]</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> * [start description]</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> start: function(){</td></tr><tr class="hit"><td class="line">16</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source"> this.init();</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> //加载文件</td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source"> this.loadFiles();</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> //合并自动加载的路径</td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> this.mergeAutoloadPath();</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> //thinkRequire的autoload</td></tr><tr class="hit"><td class="line">23</td><td class="hits">1</td><td class="source"> registerAutoload(this.autoload);</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> //debug模式</td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source"> if (APP_DEBUG) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> this.debug();</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">28</td><td class="hits">1</td><td class="source"> this.processEvent();</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> //记录进程的id</td></tr><tr class="hit"><td class="line">31</td><td class="hits">1</td><td class="source"> this.logPid();</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> //记录日志</td></tr><tr class="hit"><td class="line">33</td><td class="hits">1</td><td class="source"> this.log();</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">35</td><td class="hits">1</td><td class="source"> thinkRequire('App').run();</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> * 定义一些目录,加载框架的基础文件</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> init: function(){</td></tr><tr class="hit"><td class="line">42</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> //系统路径设置</td></tr><tr class="hit"><td class="line">44</td><td class="hits">1</td><td class="source"> global.THINK_LIB_PATH = THINK_PATH + '/Lib';</td></tr><tr class="hit"><td class="line">45</td><td class="hits">1</td><td class="source"> global.THINK_EXTEND_PATH = THINK_LIB_PATH + '/Extend';</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> //应用路径设置</td></tr><tr class="hit"><td class="line">47</td><td class="hits">1</td><td class="source"> var config = {</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> COMMON_PATH: APP_PATH + '/Common',</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> LIB_PATH: APP_PATH + '/Lib',</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> CONF_PATH: APP_PATH + '/Conf',</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> LANG_PATH: APP_PATH + '/Lang',</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> VIEW_PATH: APP_PATH + '/View',</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> //HTML_PATH: RUNTIME_PATH + '/Html',</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> LOG_PATH: RUNTIME_PATH + '/Log',</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> TEMP_PATH: RUNTIME_PATH + '/Temp',</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> DATA_PATH: RUNTIME_PATH + '/Data',</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> CACHE_PATH: RUNTIME_PATH + '/Cache'</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">59</td><td class="hits">1</td><td class="source"> for (var name in config) {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">9</td><td class="source"> if (global[name] === undefined) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">9</td><td class="source"> global[name] = config[name];</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">64</td><td class="hits">1</td><td class="source"> require(THINK_PATH + '/Common/extend.js');</td></tr><tr class="hit"><td class="line">65</td><td class="hits">1</td><td class="source"> require(THINK_PATH + '/Common/common.js');</td></tr><tr class="hit"><td class="line">66</td><td class="hits">1</td><td class="source"> require(THINK_PATH + '/Common/function.js');</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> //别名导入</td></tr><tr class="hit"><td class="line">68</td><td class="hits">1</td><td class="source"> aliasImport(require(THINK_PATH + '/Conf/alias.js'));</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> * 记录日志</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> log: function(){</td></tr><tr class="hit"><td class="line">75</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">76</td><td class="hits">1</td><td class="source"> if (APP_DEBUG || APP_MODE === 'cli' || !C('log_record')) {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">79</td><td class="hits">0</td><td class="source"> thinkRequire('Log')().run();</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> * 安全方式加载文件</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> * @param {[type]} file [description]</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> safeRequire: function(file){</td></tr><tr class="hit"><td class="line">87</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">88</td><td class="hits">2</td><td class="source"> try{</td></tr><tr class="hit"><td class="line">89</td><td class="hits">2</td><td class="source"> return require(file);</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> }catch(e){</td></tr><tr class="miss"><td class="line">91</td><td class="hits">0</td><td class="source"> console.error(e.stack);</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">93</td><td class="hits">0</td><td class="source"> return {};</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> * 注册异常处理</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> processEvent: function(){</td></tr><tr class="hit"><td class="line">100</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">101</td><td class="hits">1</td><td class="source"> process.on('uncaughtException', function(err) {</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> console.error(isError(err) ? err.stack : err);</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> * 加载项目下对应的文件</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">109</td><td class="hits"></td><td class="source"> loadFiles: function(){</td></tr><tr class="hit"><td class="line">110</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">111</td><td class="hits">1</td><td class="source"> C(null); //移除之前的所有配置</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> //加载系统默认配置</td></tr><tr class="hit"><td class="line">113</td><td class="hits">1</td><td class="source"> C(require(THINK_PATH + '/Conf/config.js'));</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> //加载用户配置</td></tr><tr class="hit"><td class="line">115</td><td class="hits">1</td><td class="source"> var file = CONF_PATH + '/config.js';</td></tr><tr class="hit"><td class="line">116</td><td class="hits">1</td><td class="source"> if (isFile(file)) {</td></tr><tr class="hit"><td class="line">117</td><td class="hits">1</td><td class="source"> C(this.safeRequire(file));</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> //加载模式的配置文件</td></tr><tr class="hit"><td class="line">120</td><td class="hits">1</td><td class="source"> if (APP_MODE) {</td></tr><tr class="hit"><td class="line">121</td><td class="hits">1</td><td class="source"> var modeFiles = [</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> THINK_PATH + '/Conf/mode.js',</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> CONF_PATH + '/mode.js'</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> ];</td></tr><tr class="hit"><td class="line">125</td><td class="hits">1</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">126</td><td class="hits">1</td><td class="source"> modeFiles.forEach(function(file){</td></tr><tr class="hit"><td class="line">127</td><td class="hits">2</td><td class="source"> if (isFile(file)) {</td></tr><tr class="hit"><td class="line">128</td><td class="hits">1</td><td class="source"> var conf = self.safeRequire(file);</td></tr><tr class="hit"><td class="line">129</td><td class="hits">1</td><td class="source"> if (conf[APP_MODE]) {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">1</td><td class="source"> C(conf[APP_MODE]);</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> //自定义路由</td></tr><tr class="hit"><td class="line">136</td><td class="hits">1</td><td class="source"> if (C('url_route_on') && isFile(CONF_PATH + '/route.js')) {</td></tr><tr class="miss"><td class="line">137</td><td class="hits">0</td><td class="source"> C('url_route_rules', this.safeRequire(CONF_PATH + '/route.js'));</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> //别名文件</td></tr><tr class="hit"><td class="line">140</td><td class="hits">1</td><td class="source"> if (isFile(CONF_PATH + '/alias.js')) {</td></tr><tr class="miss"><td class="line">141</td><td class="hits">0</td><td class="source"> aliasImport(this.safeRequire(CONF_PATH + '/alias.js'));</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> //common文件</td></tr><tr class="hit"><td class="line">144</td><td class="hits">1</td><td class="source"> if (isFile(COMMON_PATH + '/common.js')) {</td></tr><tr class="hit"><td class="line">145</td><td class="hits">1</td><td class="source"> require(COMMON_PATH + '/common.js');</td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">147</td><td class="hits">1</td><td class="source"> this.loadTag();</td></tr><tr class="hit"><td class="line">148</td><td class="hits">1</td><td class="source"> this.loadExtConfig();</td></tr><tr class="hit"><td class="line">149</td><td class="hits">1</td><td class="source"> this.loadExtFiles();</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> //加载标签行为</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> loadTag: function(){</td></tr><tr class="hit"><td class="line">153</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> //系统标签</td></tr><tr class="hit"><td class="line">155</td><td class="hits">1</td><td class="source"> var tag = require(THINK_PATH + '/Conf/tag.js');</td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> //用户行为标签</td></tr><tr class="hit"><td class="line">157</td><td class="hits">1</td><td class="source"> var tagFile = CONF_PATH + '/tag.js';</td></tr><tr class="hit"><td class="line">158</td><td class="hits">1</td><td class="source"> if (!C('app_tag_on') || !isFile(tagFile)) {</td></tr><tr class="hit"><td class="line">159</td><td class="hits">1</td><td class="source"> C('tag', tag);</td></tr><tr class="hit"><td class="line">160</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">162</td><td class="hits">0</td><td class="source"> var mixTag = extend({}, tag);</td></tr><tr class="miss"><td class="line">163</td><td class="hits">0</td><td class="source"> var userTag = extend({}, require(tagFile));</td></tr><tr class="miss"><td class="line">164</td><td class="hits">0</td><td class="source"> for(var key in userTag){</td></tr><tr class="miss"><td class="line">165</td><td class="hits">0</td><td class="source"> var value = userTag[key];</td></tr><tr class="miss"><td class="line">166</td><td class="hits">0</td><td class="source"> if (!value.length) {</td></tr><tr class="miss"><td class="line">167</td><td class="hits">0</td><td class="source"> continue;</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">169</td><td class="hits">0</td><td class="source"> mixTag[key] = mixTag[key] || [];</td></tr><tr class="miss"><td class="line">170</td><td class="hits">0</td><td class="source"> if (isBoolean(value[0])) {</td></tr><tr class="miss"><td class="line">171</td><td class="hits">0</td><td class="source"> var flag = value.shift();</td></tr><tr class="miss"><td class="line">172</td><td class="hits">0</td><td class="source"> if (flag) { //true为替换系统标签</td></tr><tr class="miss"><td class="line">173</td><td class="hits">0</td><td class="source"> mixTag[key] = value;</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> }else{ //false为将自定义标签置为系统标签前面</td></tr><tr class="miss"><td class="line">175</td><td class="hits">0</td><td class="source"> mixTag[key] = value.concat(mixTag[key]);</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> }else{// 默认将用户标签置为系统标签后面</td></tr><tr class="miss"><td class="line">178</td><td class="hits">0</td><td class="source"> mixTag[key] = mixTag[key].concat(value);</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> //行为标签</td></tr><tr class="miss"><td class="line">182</td><td class="hits">0</td><td class="source"> C('tag', mixTag);</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> //加载自定义外部文件</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> loadExtFiles: function(){</td></tr><tr class="hit"><td class="line">186</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">187</td><td class="hits">1</td><td class="source"> var files = C('load_ext_file');</td></tr><tr class="hit"><td class="line">188</td><td class="hits">1</td><td class="source"> if (files) {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">1</td><td class="source"> if (isString(files)) {</td></tr><tr class="miss"><td class="line">190</td><td class="hits">0</td><td class="source"> files = files.split(',');</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">192</td><td class="hits">1</td><td class="source"> files.forEach(function(file){</td></tr><tr class="miss"><td class="line">193</td><td class="hits">0</td><td class="source"> file = COMMON_PATH + '/' + file + '.js';</td></tr><tr class="miss"><td class="line">194</td><td class="hits">0</td><td class="source"> if (isFile(file)) {</td></tr><tr class="miss"><td class="line">195</td><td class="hits">0</td><td class="source"> require(file);</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> //加载额外的配置</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> loadExtConfig: function(){</td></tr><tr class="hit"><td class="line">202</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">203</td><td class="hits">1</td><td class="source"> var files = C('load_ext_config');</td></tr><tr class="hit"><td class="line">204</td><td class="hits">1</td><td class="source"> if (files) {</td></tr><tr class="hit"><td class="line">205</td><td class="hits">1</td><td class="source"> if (isString(files)) {</td></tr><tr class="miss"><td class="line">206</td><td class="hits">0</td><td class="source"> files = files.split(',');</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">208</td><td class="hits">1</td><td class="source"> files.forEach(function(file){</td></tr><tr class="miss"><td class="line">209</td><td class="hits">0</td><td class="source"> file = CONF_PATH + '/' + file + '.js';</td></tr><tr class="miss"><td class="line">210</td><td class="hits">0</td><td class="source"> if (isFile(file)) {</td></tr><tr class="miss"><td class="line">211</td><td class="hits">0</td><td class="source"> C(require(file));</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">216</td><td class="hits"></td><td class="source"> //加载debug模式配置文件</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> loadDebugFiles: function(){</td></tr><tr class="miss"><td class="line">218</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> //加载debug模式下的配置</td></tr><tr class="miss"><td class="line">220</td><td class="hits">0</td><td class="source"> C(require(THINK_PATH + '/Conf/debug.js'));</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> //debug下自定义状态的配置</td></tr><tr class="miss"><td class="line">222</td><td class="hits">0</td><td class="source"> var status = C('app_status');</td></tr><tr class="miss"><td class="line">223</td><td class="hits">0</td><td class="source"> if (status) {</td></tr><tr class="miss"><td class="line">224</td><td class="hits">0</td><td class="source"> if (isFile(CONF_PATH + '/' + status + '.js')) {</td></tr><tr class="miss"><td class="line">225</td><td class="hits">0</td><td class="source"> C(require(CONF_PATH + '/' + status + '.js'));</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">228</td><td class="hits">0</td><td class="source"> if (isFile(CONF_PATH + '/debug.js')) {</td></tr><tr class="miss"><td class="line">229</td><td class="hits">0</td><td class="source"> C(require(CONF_PATH + '/debug.js'));</td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">232</td><td class="hits">0</td><td class="source"> if (APP_MODE) {</td></tr><tr class="miss"><td class="line">233</td><td class="hits">0</td><td class="source"> var modeFiles = [</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> THINK_PATH + '/Conf/mode.js',</td></tr><tr><td class="line">235</td><td class="hits"></td><td class="source"> CONF_PATH + '/mode.js'</td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> ];</td></tr><tr class="miss"><td class="line">237</td><td class="hits">0</td><td class="source"> modeFiles.forEach(function(file){</td></tr><tr class="miss"><td class="line">238</td><td class="hits">0</td><td class="source"> if (isFile(file)) {</td></tr><tr class="miss"><td class="line">239</td><td class="hits">0</td><td class="source"> var conf = require(file);</td></tr><tr class="miss"><td class="line">240</td><td class="hits">0</td><td class="source"> var key = APP_MODE + '_debug';</td></tr><tr class="miss"><td class="line">241</td><td class="hits">0</td><td class="source"> if (conf[key]) {</td></tr><tr class="miss"><td class="line">242</td><td class="hits">0</td><td class="source"> C(conf[key]);</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> * debug模式下一些特殊处理</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">252</td><td class="hits"></td><td class="source"> debug: function(){</td></tr><tr class="miss"><td class="line">253</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">254</td><td class="hits">0</td><td class="source"> this.loadDebugFiles();</td></tr><tr><td class="line">255</td><td class="hits"></td><td class="source"> //清除require的缓存</td></tr><tr class="miss"><td class="line">256</td><td class="hits">0</td><td class="source"> if (C('clear_require_cache')) {</td></tr><tr><td class="line">257</td><td class="hits"></td><td class="source"> //这些文件不清除缓存</td></tr><tr class="miss"><td class="line">258</td><td class="hits">0</td><td class="source"> var retainFiles = C('debug_retain_files');</td></tr><tr class="miss"><td class="line">259</td><td class="hits">0</td><td class="source"> var self = this;</td></tr><tr class="miss"><td class="line">260</td><td class="hits">0</td><td class="source"> setInterval(function(){</td></tr><tr class="miss"><td class="line">261</td><td class="hits">0</td><td class="source"> var fn = function(item){</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> //windows目录定界符为\</td></tr><tr class="miss"><td class="line">263</td><td class="hits">0</td><td class="source"> if (process.platform === 'win32') {</td></tr><tr class="miss"><td class="line">264</td><td class="hits">0</td><td class="source"> item = item.replace(/\//g, '\\');</td></tr><tr><td class="line">265</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">266</td><td class="hits">0</td><td class="source"> if (file.indexOf(item) > -1) {</td></tr><tr class="miss"><td class="line">267</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">268</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">269</td><td class="hits"></td><td class="source"> };</td></tr><tr class="miss"><td class="line">270</td><td class="hits">0</td><td class="source"> for(var file in require.cache){</td></tr><tr class="miss"><td class="line">271</td><td class="hits">0</td><td class="source"> var flag = retainFiles.some(fn);</td></tr><tr class="miss"><td class="line">272</td><td class="hits">0</td><td class="source"> if (!flag) {</td></tr><tr class="miss"><td class="line">273</td><td class="hits">0</td><td class="source"> delete require.cache[file];</td></tr><tr><td class="line">274</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">275</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">276</td><td class="hits">0</td><td class="source"> self.loadFiles();</td></tr><tr class="miss"><td class="line">277</td><td class="hits">0</td><td class="source"> self.loadDebugFiles();</td></tr><tr><td class="line">278</td><td class="hits"></td><td class="source"> }, 100);</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">282</td><td class="hits"></td><td class="source"> * 记录当前进程的id</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> * 记录在Runtime/Data/app.pid文件里</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">285</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">286</td><td class="hits"></td><td class="source"> logPid: function(){</td></tr><tr class="hit"><td class="line">287</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">288</td><td class="hits">1</td><td class="source"> if (C('log_process_pid') && cluster.isMaster) {</td></tr><tr class="miss"><td class="line">289</td><td class="hits">0</td><td class="source"> mkdir(DATA_PATH);</td></tr><tr class="miss"><td class="line">290</td><td class="hits">0</td><td class="source"> var pidFile = DATA_PATH + '/app.pid';</td></tr><tr class="miss"><td class="line">291</td><td class="hits">0</td><td class="source"> fs.writeFileSync(pidFile, process.pid);</td></tr><tr class="miss"><td class="line">292</td><td class="hits">0</td><td class="source"> chmod(pidFile);</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source"> //进程退出时删除该文件</td></tr><tr class="miss"><td class="line">294</td><td class="hits">0</td><td class="source"> process.on('SIGTERM', function () {</td></tr><tr class="miss"><td class="line">295</td><td class="hits">0</td><td class="source"> if (fs.existsSync(pidFile)) {</td></tr><tr class="miss"><td class="line">296</td><td class="hits">0</td><td class="source"> fs.unlinkSync(pidFile);</td></tr><tr><td class="line">297</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">298</td><td class="hits">0</td><td class="source"> process.exit(0);</td></tr><tr><td class="line">299</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">300</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">301</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">302</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">303</td><td class="hits"></td><td class="source"> * 合并autoload的path</td></tr><tr><td class="line">304</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">305</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">306</td><td class="hits"></td><td class="source"> mergeAutoloadPath: function(){</td></tr><tr class="hit"><td class="line">307</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">308</td><td class="hits">1</td><td class="source"> var file = '__CLASS__.js';</td></tr><tr class="hit"><td class="line">309</td><td class="hits">1</td><td class="source"> var sysAutoloadPath = {</td></tr><tr><td class="line">310</td><td class="hits"></td><td class="source"> 'Behavior': [</td></tr><tr><td class="line">311</td><td class="hits"></td><td class="source"> LIB_PATH + '/Behavior/' + file,</td></tr><tr><td class="line">312</td><td class="hits"></td><td class="source"> THINK_LIB_PATH + '/Behavior/' + file</td></tr><tr><td class="line">313</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source"> 'Model': [</td></tr><tr><td class="line">315</td><td class="hits"></td><td class="source"> LIB_PATH + '/Model/' + file,</td></tr><tr><td class="line">316</td><td class="hits"></td><td class="source"> THINK_EXTEND_PATH + '/Model/' + file</td></tr><tr><td class="line">317</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">318</td><td class="hits"></td><td class="source"> 'Logic': [</td></tr><tr><td class="line">319</td><td class="hits"></td><td class="source"> LIB_PATH + '/Logic/' + file</td></tr><tr><td class="line">320</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">321</td><td class="hits"></td><td class="source"> 'Service': [</td></tr><tr><td class="line">322</td><td class="hits"></td><td class="source"> LIB_PATH + '/Service/' + file</td></tr><tr><td class="line">323</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">324</td><td class="hits"></td><td class="source"> 'Controller': [</td></tr><tr><td class="line">325</td><td class="hits"></td><td class="source"> LIB_PATH + '/Controller/' + file,</td></tr><tr><td class="line">326</td><td class="hits"></td><td class="source"> THINK_EXTEND_PATH + '/Controller/' + file</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">328</td><td class="hits"></td><td class="source"> 'Cache': [</td></tr><tr><td class="line">329</td><td class="hits"></td><td class="source"> LIB_PATH + '/Driver/Cache/' + file,</td></tr><tr><td class="line">330</td><td class="hits"></td><td class="source"> THINK_LIB_PATH + '/Driver/Cache/' + file</td></tr><tr><td class="line">331</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">332</td><td class="hits"></td><td class="source"> 'Db': [</td></tr><tr><td class="line">333</td><td class="hits"></td><td class="source"> LIB_PATH + '/Driver/Db/' + file,</td></tr><tr><td class="line">334</td><td class="hits"></td><td class="source"> THINK_LIB_PATH + '/Driver/Db/' + file</td></tr><tr><td class="line">335</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">336</td><td class="hits"></td><td class="source"> 'Template': [</td></tr><tr><td class="line">337</td><td class="hits"></td><td class="source"> LIB_PATH + '/Driver/Template/' + file,</td></tr><tr><td class="line">338</td><td class="hits"></td><td class="source"> THINK_LIB_PATH + '/Driver/Template/' + file</td></tr><tr><td class="line">339</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">340</td><td class="hits"></td><td class="source"> 'Socket': [</td></tr><tr><td class="line">341</td><td class="hits"></td><td class="source"> LIB_PATH + '/Driver/Socket/' + file,</td></tr><tr><td class="line">342</td><td class="hits"></td><td class="source"> THINK_LIB_PATH + '/Driver/Socket/' + file</td></tr><tr><td class="line">343</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">344</td><td class="hits"></td><td class="source"> 'Session': [</td></tr><tr><td class="line">345</td><td class="hits"></td><td class="source"> LIB_PATH + '/Driver/Session/' + file,</td></tr><tr><td class="line">346</td><td class="hits"></td><td class="source"> THINK_LIB_PATH + '/Driver/Session/' + file</td></tr><tr><td class="line">347</td><td class="hits"></td><td class="source"> ]</td></tr><tr><td class="line">348</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">349</td><td class="hits">1</td><td class="source"> var autoloadPath = C('autoload_path');</td></tr><tr class="hit"><td class="line">350</td><td class="hits">1</td><td class="source"> for(var type in autoloadPath){</td></tr><tr class="miss"><td class="line">351</td><td class="hits">0</td><td class="source"> var paths = autoloadPath[type];</td></tr><tr class="miss"><td class="line">352</td><td class="hits">0</td><td class="source"> var override = false;</td></tr><tr class="miss"><td class="line">353</td><td class="hits">0</td><td class="source"> if (!isArray(paths)) {</td></tr><tr class="miss"><td class="line">354</td><td class="hits">0</td><td class="source"> paths = [paths];</td></tr><tr class="miss"><td class="line">355</td><td class="hits">0</td><td class="source"> }else if (isBoolean(paths[0])) {</td></tr><tr class="miss"><td class="line">356</td><td class="hits">0</td><td class="source"> override = paths.shift();</td></tr><tr><td class="line">357</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">358</td><td class="hits">0</td><td class="source"> if (override) {</td></tr><tr class="miss"><td class="line">359</td><td class="hits">0</td><td class="source"> sysAutoloadPath[type] = paths; </td></tr><tr><td class="line">360</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">361</td><td class="hits">0</td><td class="source"> paths.push.apply(paths, sysAutoloadPath[type]);</td></tr><tr class="miss"><td class="line">362</td><td class="hits">0</td><td class="source"> sysAutoloadPath[type] = paths;</td></tr><tr><td class="line">363</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">364</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">365</td><td class="hits">1</td><td class="source"> autoloadPaths = sysAutoloadPath;</td></tr><tr><td class="line">366</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">367</td><td class="hits"></td><td class="source"> //thinkRequire的自动加载</td></tr><tr><td class="line">368</td><td class="hits"></td><td class="source"> autoload: function(cls){</td></tr><tr class="hit"><td class="line">369</td><td class="hits">8</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">370</td><td class="hits">8</td><td class="source"> var filepath = '';</td></tr><tr class="hit"><td class="line">371</td><td class="hits">8</td><td class="source"> var fn = function(item){</td></tr><tr class="hit"><td class="line">372</td><td class="hits">15</td><td class="source"> item = item.replace(/__CLASS__/g, cls);</td></tr><tr class="hit"><td class="line">373</td><td class="hits">15</td><td class="source"> if (isFile(item)) {</td></tr><tr class="hit"><td class="line">374</td><td class="hits">8</td><td class="source"> filepath = item;</td></tr><tr class="hit"><td class="line">375</td><td class="hits">8</td><td class="source"> return true;</td></tr><tr><td class="line">376</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">377</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">378</td><td class="hits">8</td><td class="source"> for(var name in autoloadPaths){</td></tr><tr class="hit"><td class="line">379</td><td class="hits">19</td><td class="source"> var length = name.length;</td></tr><tr class="hit"><td class="line">380</td><td class="hits">19</td><td class="source"> if (cls.substr(0 - length) === name) {</td></tr><tr class="hit"><td class="line">381</td><td class="hits">8</td><td class="source"> var list = autoloadPaths[name];</td></tr><tr class="hit"><td class="line">382</td><td class="hits">8</td><td class="source"> list.some(fn);</td></tr><tr class="hit"><td class="line">383</td><td class="hits">8</td><td class="source"> if (filepath) {</td></tr><tr class="hit"><td class="line">384</td><td class="hits">8</td><td class="source"> if (!APP_DEBUG) {</td></tr><tr class="hit"><td class="line">385</td><td class="hits">8</td><td class="source"> aliasImport(cls, filepath);</td></tr><tr><td class="line">386</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">387</td><td class="hits">8</td><td class="source"> return filepath;</td></tr><tr><td class="line">388</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">389</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">390</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">391</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">392</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">393</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/View.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Core/View.js</h2><div id="stats" class="high"><div class="percentage">81%</div><div class="sloc">37</div><div class="hits">30</div><div class="misses">7</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * view</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">module.exports = Class(function(){</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> init: function(http){</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> this.http = http;</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> this.tVar = {};</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> * 给变量赋值</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> assign: function(name, value){</td></tr><tr class="hit"><td class="line">19</td><td class="hits">2</td><td class="source"> if (name === undefined) {</td></tr><tr class="miss"><td class="line">20</td><td class="hits">0</td><td class="source"> return this.tVar;</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">22</td><td class="hits">2</td><td class="source"> if (isString(name) && arguments.length === 1) {</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> return this.tVar[name];</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">25</td><td class="hits">2</td><td class="source"> if (isObject(name)) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> this.tVar = extend(this.tVar, name);</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">28</td><td class="hits">2</td><td class="source"> this.tVar[name] = value;</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> * 输出模版文件内容</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> * @param {[type]} templateFile [description]</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> * @param {[type]} charset [description]</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> * @param {[type]} contentType [description]</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> * @param {[type]} content [description]</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> display: function(templateFile, charset, contentType){</td></tr><tr class="hit"><td class="line">40</td><td class="hits">1</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">41</td><td class="hits">1</td><td class="source"> return tag('view_init', this.http).then(function(){</td></tr><tr class="hit"><td class="line">42</td><td class="hits">1</td><td class="source"> return self.fetch(templateFile);</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> }).then(function(content){</td></tr><tr class="hit"><td class="line">44</td><td class="hits">1</td><td class="source"> self.render(content, charset, contentType);</td></tr><tr class="hit"><td class="line">45</td><td class="hits">1</td><td class="source"> return tag('view_end', self.http, content);</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> }).then(function(){</td></tr><tr class="hit"><td class="line">47</td><td class="hits">1</td><td class="source"> return self.http.end();</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> }).catch(function(){</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> return self.http.end();</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> * 渲染模版</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> * @param {[type]} content [description]</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> * @param {[type]} charset [description]</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> * @param {[type]} contentType [description]</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> render: function(content, charset, contentType){</td></tr><tr class="hit"><td class="line">60</td><td class="hits">1</td><td class="source"> if (!this.http.cthIsSend) {</td></tr><tr class="hit"><td class="line">61</td><td class="hits">1</td><td class="source"> charset = charset || C('encoding');</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> contentType = contentType || C('tpl_content_type');</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source"> this.http.setHeader('Content-Type', contentType + '; charset=' + charset);</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">65</td><td class="hits">1</td><td class="source"> if (C('show_exec_time')) {</td></tr><tr class="miss"><td class="line">66</td><td class="hits">0</td><td class="source"> this.http.sendTime('Exec-Time');</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">68</td><td class="hits">1</td><td class="source"> this.http.echo(content || '', charset || C('encoding'));</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> * 获取模版文件内容</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> * @param {[type]} templateFile [description]</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> * @param {[type]} content [description]</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> fetch: function(templateFile){</td></tr><tr class="hit"><td class="line">77</td><td class="hits">1</td><td class="source"> var self = this;</td></tr><tr class="hit"><td class="line">78</td><td class="hits">1</td><td class="source"> var promise = getPromise(templateFile);</td></tr><tr class="hit"><td class="line">79</td><td class="hits">1</td><td class="source"> if (!templateFile || !isFile(templateFile)) {</td></tr><tr class="hit"><td class="line">80</td><td class="hits">1</td><td class="source"> promise = tag('view_template', this.http, templateFile).then(function(file){</td></tr><tr class="hit"><td class="line">81</td><td class="hits">1</td><td class="source"> if (isFile(file)) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">1</td><td class="source"> templateFile = file;</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">84</td><td class="hits">0</td><td class="source"> return getPromise(new Error("can't find template file"), true);</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">88</td><td class="hits">1</td><td class="source"> return promise.then(function(){</td></tr><tr class="hit"><td class="line">89</td><td class="hits">1</td><td class="source"> return tag('view_parse', self.http, {</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> 'var': self.tVar,</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> 'file': templateFile</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> }).then(function(content){</td></tr><tr class="hit"><td class="line">94</td><td class="hits">1</td><td class="source"> return tag('view_filter', self.http, content);</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }).catch(function(err){</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> //输出模版解析异常</td></tr><tr class="miss"><td class="line">97</td><td class="hits">0</td><td class="source"> console.log(isError(err) ? err.stack : err);</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Driver/Template/EjsTemplate.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Driver/Template/EjsTemplate.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">6</div><div class="hits">6</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * ejs</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * https://github.com/visionmedia/ejs</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * @type {[type]}</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source">var ejs = require('ejs');</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> fetch: function(templateFile, tVar){</td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> var content = getFileContent(templateFile);</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> var conf = extend({</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> filename: templateFile,</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> cache: true</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }, C('tpl_engine_config'));</td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source"> return ejs.compile(content, conf)(tVar); </td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/Behavior.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/Behavior.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">7</div><div class="hits">7</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * 行为类</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">module.exports = Class(function(){</td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> return {</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> options: {}, //行为选项</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> http: null,</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> init: function(http){</td></tr><tr class="hit"><td class="line">11</td><td class="hits">10</td><td class="source"> this.http = http;</td></tr><tr class="hit"><td class="line">12</td><td class="hits">10</td><td class="source"> for(var name in this.options){</td></tr><tr class="hit"><td class="line">13</td><td class="hits">14</td><td class="source"> if (C(name) !== undefined) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">13</td><td class="source"> this.options[name] = C(name);</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> run: function(){</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source">});</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/Cookie.js">/Users/welefen/Develop/git/thinkjs/lib/Lib/Util/Cookie.js</h2><div id="stats" class="terrible"><div class="percentage">22%</div><div class="sloc">35</div><div class="hits">8</div><div class="misses">27</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> * cookie操作</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> * @type {Object}</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> * 解析</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * @param {[type]} str [description]</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> parse: function(str){</td></tr><tr class="hit"><td class="line">12</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">13</td><td class="hits">2</td><td class="source"> var data = {};</td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> str.split(/; */).forEach(function(item) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">2</td><td class="source"> var pos = item.indexOf('=');</td></tr><tr class="hit"><td class="line">16</td><td class="hits">2</td><td class="source"> if (pos === -1) {</td></tr><tr class="hit"><td class="line">17</td><td class="hits">2</td><td class="source"> return;</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">19</td><td class="hits">0</td><td class="source"> var key = item.substr(0, pos).trim();</td></tr><tr class="miss"><td class="line">20</td><td class="hits">0</td><td class="source"> var val = item.substr(pos + 1).trim();</td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> if ('"' === val[0]) {</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> val = val.slice(1, -1);</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> // only assign once</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> if (undefined === data[key]) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> try {</td></tr><tr class="miss"><td class="line">27</td><td class="hits">0</td><td class="source"> data[key] = decodeURIComponent(val);</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> } catch (e) {</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> data[key] = val;</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">33</td><td class="hits">2</td><td class="source"> return data;</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> /**</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> * 格式化</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> * @param {[type]} val [description]</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> * @param {[type]} options [description]</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> stringify: function(name, value, options){</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">44</td><td class="hits">0</td><td class="source"> options = options || {};</td></tr><tr class="miss"><td class="line">45</td><td class="hits">0</td><td class="source"> var item = [name + '=' + encodeURIComponent(value)];</td></tr><tr class="miss"><td class="line">46</td><td class="hits">0</td><td class="source"> if (options.maxage) {</td></tr><tr class="miss"><td class="line">47</td><td class="hits">0</td><td class="source"> item.push('Max-Age=' + options.maxage);</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> if (options.domain) {</td></tr><tr class="miss"><td class="line">50</td><td class="hits">0</td><td class="source"> item.push('Domain=' + options.domain);</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">52</td><td class="hits">0</td><td class="source"> if (options.path) {</td></tr><tr class="miss"><td class="line">53</td><td class="hits">0</td><td class="source"> item.push('Path=' + options.path);</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">55</td><td class="hits">0</td><td class="source"> var expires = options.expires;</td></tr><tr class="miss"><td class="line">56</td><td class="hits">0</td><td class="source"> if (expires){</td></tr><tr class="miss"><td class="line">57</td><td class="hits">0</td><td class="source"> if (!isDate(expires)) {</td></tr><tr class="miss"><td class="line">58</td><td class="hits">0</td><td class="source"> expires = new Date(expires);</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">60</td><td class="hits">0</td><td class="source"> item.push('Expires=' + expires.toUTCString());</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> } </td></tr><tr class="miss"><td class="line">62</td><td class="hits">0</td><td class="source"> if (options.httponly) {</td></tr><tr class="miss"><td class="line">63</td><td class="hits">0</td><td class="source"> item.push('HttpOnly');</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">65</td><td class="hits">0</td><td class="source"> if (options.secure) {</td></tr><tr class="miss"><td class="line">66</td><td class="hits">0</td><td class="source"> item.push('Secure');</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">68</td><td class="hits">0</td><td class="source"> return item.join('; ');</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/think.js">/Users/welefen/Develop/git/thinkjs/lib/think.js</h2><div id="stats" class="high"><div class="percentage">85%</div><div class="sloc">20</div><div class="hits">17</div><div class="misses">3</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var path = require('path');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">if (!global.APP_PATH) {</td></tr><tr class="miss"><td class="line">5</td><td class="hits">0</td><td class="source"> throw new Error('APP_PATH must be defined');</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source">}</td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source">if (!global.RUNTIME_PATH) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> global.RUNTIME_PATH = APP_PATH + '/Runtime';</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">//DEBUG模式</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">if (global.APP_DEBUG === undefined) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> global.APP_DEBUG = false;</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source">//线上环境自动关闭debug模式</td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source">if (process.argv[2] === 'online' && APP_DEBUG === true) {</td></tr><tr class="miss"><td class="line">16</td><td class="hits">0</td><td class="source"> process.argv[2] = '';</td></tr><tr class="miss"><td class="line">17</td><td class="hits">0</td><td class="source"> APP_DEBUG = false;</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source">//静态资源文件的根目录</td></tr><tr class="hit"><td class="line">20</td><td class="hits">1</td><td class="source">global.RESOURCE_PATH = global.RESOURCE_PATH || '';</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source">//THINKJS的根目录</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source">global.THINK_PATH = __dirname;</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source">//默认为http模式</td></tr><tr class="hit"><td class="line">24</td><td class="hits">1</td><td class="source">global.APP_MODE = global.APP_MODE || '';</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source">//命令行模式</td></tr><tr class="hit"><td class="line">26</td><td class="hits">1</td><td class="source">if (process.argv[2]) {</td></tr><tr class="hit"><td class="line">27</td><td class="hits">1</td><td class="source"> APP_MODE = 'cli';</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source">//从package.json文件里获取版本号</td></tr><tr class="hit"><td class="line">30</td><td class="hits">1</td><td class="source">var pkgPath = path.dirname(THINK_PATH) + '/package.json';</td></tr><tr class="hit"><td class="line">31</td><td class="hits">1</td><td class="source">var pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));</td></tr><tr class="hit"><td class="line">32</td><td class="hits">1</td><td class="source">global.THINK_VERSION = pkg.version;</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source">//启动</td></tr><tr class="hit"><td class="line">34</td><td class="hits">1</td><td class="source">require(THINK_PATH + '/Lib/Core/Think.js').start();</td></tr></tbody></table></div></div></div></body></html> |