%
var sqlcount = 0, execStart = new Date();//SQL查询次数和程序开始执行时间,用于最后计算页面执行时间
// 页面输出转向方法
function Write(str) { Response.Write(str) }
function WriteLine(str) { Write(str + "\n") }
function WriteJs(str) { Write("") }
function WriteEnd(str) { Write(str); Response.End() }
function WriteErr(str, errcode)
{//向页面返回错误信息,需要输出错误代码及禁止缓存
Response.CacheControl = "no-cache";
Response.Expires = -1;
if (!isNaN(errcode)) Response.Status = errcode;
WriteEnd(str);
}
function Redirect(url, code) { if (!isNaN(code)) Response.Status = code; Response.Redirect(url) }
// // 过滤特殊符号
// function RemoveSpe(strHTML){
// return strHTML.replace(/[ \`\~\!\@\#\$\%\^\&\*\(\)\_\+\-\=\{\}\[\]\|\\\:\"\;\'\<\>\,\.\/\? \r\n]/g,"");
// }
//Request对象处理
function request(str, split)
{
var _object = new Enumerator(Request(str)), _ret = [];
for (; !_object.atEnd(); _object.moveNext()) _ret.push(_object.item());
return _ret.join(split || ",");
}
//获得cookies
function cookie(str) { return String(Request.Cookies(str)) }
function ServerVar(str, split)
{
var _object = new Enumerator(Request.ServerVariables(str)), _ret = [];
for (; !_object.atEnd(); _object.moveNext()) _ret.push(_object.item());
return _ret.join(split || ",");
}
// 获得请求的IP地址,ip中只可能有数字或.号,HTTP_X_FORWARDED_FOR中可能有多个ip
function GetIPAddr()
{
return (ServerVar("HTTP_CDN_SRC_IP") || ServerVar("HTTP_X_FORWARDED_FOR") || ServerVar("REMOTE_ADDR")).split(",")[0].replace(/(\:\d+)|[^\d\.]/g, "");
}
// 加密漫画分册地址
function pathencode(x, y)
{
return encodeURIComponent(x.toUpperCase()).replace(/./g, function (a) { return String.fromCharCode(a.charCodeAt(0) + y % 10) }).replace(/([\\"'])/g, "\\$1");
}
// 连接数据库
function ConnData()
{
if (pagename == "v1")
{
//当数据库挂掉后强制使用过期缓存,30秒内不再连数据库,以免网站卡死,超过30秒则需要解锁数据库
if (cache("mssqldown"))
{
if (new Date() - cache("mssqldown") > 30000) cache("mssqldown", null);
else return;
}
Conn = Server.CreateObject("ADODB.Connection");
try
{
ConnStr = "Provider = Sqloledb; User ID = " + __data.user + "; Password = " + __data.pass + "; Initial Catalog = " + __data.data + "; Data Source = " + __data.server + ";";
Conn.open(ConnStr);
} catch (e)
{
Conn = null;
cache("mssqldown", +new Date());//记录数据库出错的时间戳
WriteErr("数据库连接出错,请与管理员联系", 500);
}
} else
{
//当数据库挂掉后强制使用过期缓存,30秒内不再连数据库,以免网站卡死,超过30秒则需要解锁数据库
if (__data.use == "mainDB" && cache("mssqldown"))
{
if (new Date() - cache("mssqldown") > 30000) cache("mssqldown", null);
else return;
}
__conn[__data.use] = Server.CreateObject("ADODB.Connection");
try
{
if (__data[__data.use].hasOwnProperty('dsn') && __data[__data.use].dsn == '1')
{
ConnStr = "DRIVER={MySQL ODBC 5.2 ANSI Driver};SERVER=" + __data[__data.use].server + ";DATABASE=" + __data[__data.use].data + ";USER=" + __data[__data.use].user + ";PASSWORD=" + __data[__data.use].pass + ";";
} else
{
ConnStr = "Provider = Sqloledb; User ID = " + __data[__data.use].user + "; Password = " + __data[__data.use].pass + "; Initial Catalog = " + __data[__data.use].data + "; Data Source = " + __data[__data.use].server + ";";
}
__conn[__data.use].open(ConnStr);
//Write(ConnStr);
} catch (e)
{
__conn[__data.use] = null;
if (__data.use == "mainDB") cache("mssqldown", +new Date());//记录数据库出错的时间戳
WriteErr("数据库连接出错,请与管理员联系", 500);
}
}
}
// 执行查询(统一到这里方便调试时输出SQL语句)
function ExecSql(sql, isdebug)
{
if (pagename == "v1")
{
if (typeof isdebug == "undefined") isdebug = __config.debug;
if (typeof Conn == "undefined" || !Conn) ConnData();
if (isdebug) FsoWriteFile("debug.txt", sql);
sqlcount++;
return Conn.Execute(sql);
} else
{
if (typeof isdebug == "undefined") isdebug = __config.debug;
if (typeof __conn[__data.use] == "undefined" || !__conn[__data.use]) ConnData();
if (isdebug) FsoWriteFile("debug.txt", sql);
sqlcount++;
return __conn[__data.use].Execute(sql);
}
}
/*
功能:参数化执行查询(需要接收页面提交的字符串参数时使用)
用法:ExecSqlByParm("select * from news with(nolock) where id=? or id=?",[1,2])
注意:参数数组长度要和?号个数一致
*/
function ExecSqlByParm(sql, params, isdebug)
{
if (pagename == "v1")
{
if (typeof isdebug == "undefined") isdebug = __config.debug;
if (typeof Conn == "undefined" || !Conn) ConnData();
if (isdebug) FsoWriteFile("debug.txt", sql + " " + params);
sqlcount++;
var cmd = Server.CreateObject("ADODB.Command");
with (cmd)
{
ActiveConnection = Conn;//设置已打开的数据库连接
CommandType = 1;//文本类型
CommandText = sql;//查询字符串
Prepared = true;//可重用(第一次调用时自动编译)
foreach(params, function (i, v) { Parameters(i) = v });
/*也可以用for(i in params) Parameters(parseInt(i,10))=params[i];
但不能用for(i in params) Parameters(i)=params[i];
因为for in方式中i是字符串类型,需要转为整型才可以
*/
return Execute();
}
} else
{
if (typeof isdebug == "undefined") isdebug = __config.debug;
if (typeof __conn[__data.use] == "undefined" || !__conn[__data.use]) ConnData();
if (isdebug) FsoWriteFile("debug.txt", sql + " " + params);
sqlcount++;
var cmd = Server.CreateObject("ADODB.Command");
with (cmd)
{
ActiveConnection = __conn[__data.use];//设置已打开的数据库连接
CommandType = 1;//文本类型
CommandText = sql;//查询字符串
Prepared = true;//可重用(第一次调用时自动编译)
foreach(params, function (i, v) { Parameters(i) = v });
/*也可以用for(i in params) Parameters(parseInt(i,10))=params[i];
但不能用for(i in params) Parameters(i)=params[i];
因为for in方式中i是字符串类型,需要转为整型才可以
*/
return Execute();
}
}
}
// 强制关闭记录集与连接
function CloseRs()
{
try
{
Rs.Close();
Rs = null;
} catch (e) { }
}
// 强制关闭连接
function CloseConn()
{
try
{
if (pagename == "v1")
{
Conn.Close();
Conn = null;
} else
{
__conn[__data.use].Close();
__conn[__data.use] = null;
}
} catch (e) { }
}
// 将RecordSet记录集转换为JSON对象数组
function Rs2Json(rs)
{
if (rs.Eof && rs.Bof) return [];//返回一个空数组,不能返回null,否则外面执行循环时要报错
var data = rs.GetRows();//获得数据记录
var cols = data.ubound(1) + 1;//字段数,用rs.Fields.Count也可以
var rows = data.ubound(2) + 1;//记录数
data = data.toArray();//将VBArray转换为一维数组
var jsonArray = [];//定义一个空数组
for (var i = 0; i < rows; i++)
{
var json = {};//定义一个空的json对象
for (var j = 0; j < cols; j++)
{
if (typeof data[i * cols + j] == "date") json[rs(j).Name] = +new Date(data[i * cols + j]);//date类型特殊处理
else if (data[i * cols + j] == null) json[rs(j).Name] = "";//string类型null特殊处理
else json[rs(j).Name] = data[i * cols + j];//定义json的各字段及赋值
}
jsonArray[i] = json;//将json加入数组
}
return jsonArray;
}
// 缓存读写,如果不给参数value则为读取,如果value为null则为删除该key的缓存
function cache(key, value)
{
//get:
if (typeof value == "undefined") return Application(key);
//set:
Application.Lock;
Application(key) = value;
if (!Application("cachetime")) Application("cachetime") = +new Date();//第一次写缓存时记录缓存时间
Application.UnLock;
}
// 利用循环清空Application中的所有缓存//改用 Application.Contents.RemoveAll()
//function clearcache(){
// Application.Lock;
// foreach(Application.Contents,function(i,v){Application(v)=null});
// Application.UnLock;
//}
// asp通用发邮件函数
function sendmail(usermail, content, title)
{
try
{
var email = Server.CreateObject("JMail.Message");
email.Charset = "utf-8";
email.From = "service" + rndnum(10) + "@yyhao.com";
email.FromName = __config.sitename;
email.Subject = title;
email.AddRecipient(usermail);
email.HTMLBody = content;
// 验证身份
email.MailServerUserName = email.From;
email.MailServerPassword = "52tian123";
email.Send("yyhao.com");
email.Close();
email = null;
} catch (e)
{
WriteEnd("发送邮件失败,Jmail组件可能未注册!");
}
}
// 通用页码显示函数
function showpager(thisPage, pageCount, href, htmlpre)
{
thisPage = t_cint(thisPage);
pageCount = t_cint(pageCount);
href = href || rewriteurl.replace(/^.*\/([^\/\?]*).*$/gi, "$1");//截取最后一个/到?号之间的字符串
htmlpre = htmlpre || "";
//链接格式,首页链接
var hrefformat, firstpage = href.replace(/_p(\d+|all)\.html/gi, ".html").replace("index.html", "");
if (!firstpage) firstpage = "./";//首页url为/结尾的情况
if (/_p(\d+|all)\.html/gi.test(href)) hrefformat = href.replace(/_p(\d+|all)\.html/gi, "_p{0}.html");
else if (href.indexOf(".html") != -1) hrefformat = href.replace(".html", "_p{0}.html");
else hrefformat = "index_p{0}.html";
var getHref = function (page) { return page == 1 ? firstpage : hrefformat.format(page) };
Write(htmlpre + '上一页');
if (pageCount < 10)
{
for (var p = 1; p <= pageCount; p++) Write(htmlpre + '' + p + '');
} else
{
Write(htmlpre + '1');
if (thisPage <= 5)
{
for (var p = 2; p <= 7; p++) Write(htmlpre + '' + p + '');
Write(htmlpre + '.....');
} else
{
Write(htmlpre + '.....');
if (thisPage <= pageCount - 5)
{
for (var p = thisPage - 2; p <= thisPage + 2; p++) Write(htmlpre + '' + p + '');
Write(htmlpre + '.....');
} else
{
for (var p = pageCount - 6; p <= pageCount - 1; p++) Write(htmlpre + '' + p + '');
}
}
Write(htmlpre + '' + pageCount + '');
}
Write(htmlpre + '下一页');
}
//显示模板
function showTemplet(filepath)
{
var content = FsoReadFile(filepath);
// 后台代码替换为“##序号##” > 其他输出代码替换特殊字符 > 标记替换回后台代码
var script = [], i = 0, filefolder = "";
if (filepath.indexOf("/") != -1) filefolder = filepath.substr(0, filepath.lastIndexOf("/") + 1);
content = content.replace(//gi, "<%showTemplet(\"" + filefolder + "$1\");%\>");//引入包含文件
content = content.replace(/)[\d\D])*-->/gi, "");//过滤HTML注释但保留条件注释
content = content.replace(/<%((?:(?!%\>)[\d\D])*)%\>/gi, function ($0, $1)
{// 不能用.号,\d\D表示包括换行符在内的所有字符
script[++i] = $1;
return "##" + i + "##";
});
content = content.replace(/(["'\\])/gi, "\\$1").replace(/[\r\n\t]+/gi, "");//.replace(/\r\n/gi,"\\r\\n");//过滤单双引号、斜杠和换行符
content = content.replace(/##(\d+)##/gi, function ($0, $1)
{
var s = script[parseInt($1)];
if (s.charAt(0) == "=") return "'+" + s.substr(1) + "+'";
else return "');" + s + ";Response.Write('";
});
content = "Response.Write('" + content + "')";
eval(content);
//(new Function("tmpstr","storytypes",content))(tmpstr,storytypes);//匿名函数替代eval,局部变量只能通过参数传递进去
content = script = i = null;
}
//判断文件缓存是否存在或过期,如果不存在或过期则自动重建缓存
function CheckCacheFile(savefilepath)
{
/*
当前被访问的URL,可能是已重写过的非asp真实url
参数中包含nocache=1表示后端GetHTML,此参数仅后端程序使用
参数中包含cachetime=0表示前端强制重建缓存(有写入锁或数据库宕机时不会重建)
*/
//缓存总开关未开、页面未配缓存或缓存时间为0、GetHTML、访问地址包含.asp时跳出此方法
if (!__config.enablefilecache || !__config.cachetime[pagename] || rewriteurl.indexOf("nocache=1") != -1 || rewriteurl.indexOf(".asp") != -1) return;
var cachetime = __config.cachetime[pagename];
if (rewriteurl.indexOf("cachetime=0") != -1) cachetime = 0;//cachetime为0则立即更新缓存
//防止多并发同时写入文件,判断写入锁,写入保护超过30秒后将写入锁恢复,防止无限期等待
if (cache("iswriting") && new Date() - cache("iswriting") > 30000) cache("iswriting", null);
var filepath = "/cache" + savefilepath;
var truefile = Server.MapPath(filepath);
var fso = new ActiveXObject("Scripting.FileSystemObject");
var hasCache = fso.FileExists(truefile);
if (hasCache)
{
var gf = fso.GetFile(truefile);
//文件大于512B且修改时间在cachetime秒内则使用缓存文件,正写入缓存时或数据库宕机时暂时读已过期的缓存文件
if (gf.size > 0 && new Date() - t_cdate(gf.DateLastModified) < cachetime * 1000 || cache("iswriting") || cache("mssqldown"))
{
gf = null;
fso = null;
Server.Execute(filepath);//文件中含有<%要出错
Response.End();
}
gf = null;
}
fso = null;
if (cache("iswriting")) return;//前一个文件正在读写中,本页面又无过期缓存文件时则跳出,按正常访问输出
//请求的页面地址:服务器IP+端口+原始访问url及参数
var pageurl = "http://" + ServerVar("Local_Addr") + ":" + ServerVar("Server_Port") + rewriteurl;
pageurl += (pageurl.indexOf("?") == -1 ? "?" : "&") + "nocache=1";//nocache=1表示按未开启文件缓存时那样正常输出访问
cache("iswriting", +new Date());//开始读写文件前上写入锁,一次只能生成一个缓存文件
var html = GetHTML(pageurl, { "Host": ServerVar("HTTP_Host") });
if (html) AdoWriteFile(filepath, html);//用xmlhttp请求网页并写入到缓存文件中
cache("iswriting", null);//写入完成后取消写入锁
if (html)
{
WriteEnd(html);//直接将获得到的代码输出到客户端,无须二次判断
} else if (hasCache)
{
Server.Execute(filepath);//有缓存时强制使用缓存,以免出现500错误
Response.End();
}
}
//获取页面内容
function GetHTML(sUrl, header)
{
var objXML = Server.CreateObject("WinHttp.WinHttpRequest.5.1"), html = "";
with (objXML)
{
setTimeouts(3000, 3000, 3000, 10000);//设置超时时间
open("GET", sUrl, false);//必须用同步模式请求
for (i in header) setRequestHeader(i, header[i]);//设置主机头,否则80端口绑域名时无法走到本站点上
send();
if (Status == 200) html = responseText;
}
objXML = null;
return html;
}
// 获取Url当中的Path,不包含query之后的内容
function GetUrlPath(urlstr)
{
try
{
var obj = newChilkat950ByNotUnlock("Url");
//解析出错
if (obj.ParseUrl(urlstr) != 1) urlstr = "";
else urlstr = t_cstr(obj.Path).replace(/\.{2}/g, "").replace(/\/{2}/g, "/"); // 过滤掉父级
} catch (e)
{
urlstr = "";
}
return urlstr;
}
function GetHTMLByCharSet(sUrl, charset)
{
var objXML = Server.CreateObject("WinHttp.WinHttpRequest.5.1"), html = "";
with (objXML)
{
setTimeouts(3000, 3000, 3000, 10000);//设置超时时间
open("GET", sUrl, false);//必须用同步模式请求
send();
if (Status == 200)
{
if (charset)
{
var stm = Server.CreateObject("adodb.stream");
stm.Type = 1; //adTypeBinary,按二进制数据读入
stm.Mode = 3; //adModeReadWrite ,这里只能用3用其他会出错
stm.Open();
stm.Write(responseBody);
stm.Position = 0; //把指针移回起点
stm.Type = 2; //文本数据
stm.Charset = charset || "utf-8";
html = stm.ReadText();
stm.Close();
stm = null;
} else html = responseText;
}
}
objXML = null;
return html;
}
//post获取页面内容
function PostHtml(sUrl, header, postdata)
{
var objXML = Server.CreateObject("WinHttp.WinHttpRequest.5.1"), html = "";
with (objXML)
{
setTimeouts(3000, 3000, 3000, 10000);//设置超时时间
open("POST", sUrl, false);//必须用同步模式请求
for (i in header) setRequestHeader(i, header[i]);
if (typeof postdata == "undefined" || postdata.length == 0) send();
else
{
send(postdata);
}
if (Status == 200) html = responseText;
}
objXML = null;
return html;
}
//post获取页面内容(不支持提交内容)
function PostHtml_NotPostData(sUrl, header)
{
var objXML = Server.CreateObject("WinHttp.WinHttpRequest.5.1"), html = "";
with (objXML)
{
setTimeouts(3000, 3000, 3000, 10000);//设置超时时间
open("POST", sUrl, false);//必须用同步模式请求
for (i in header) setRequestHeader(i, header[i]);
send();
if (Status == 200) html = responseText;
}
objXML = null;
return html;
}
//AdoStream按指定编码读取文本文件
function AdoReadFile(filename, charset)
{
var stm = Server.CreateObject("adodb.stream");
stm.Type = 1; //adTypeBinary,按二进制数据读入
stm.Mode = 3; //adModeReadWrite ,这里只能用3用其他会出错
stm.Open();
stm.LoadFromFile(Server.mappath(filename));
stm.Position = 0; //把指针移回起点
stm.Type = 2; //文本数据
stm.Charset = charset || "utf-8";
var content = stm.ReadText();
stm.Close();
stm = null;
return content;
}
//AdoStream将文本按指定编码写入文件(如果是二进制需要将stm.Type改为1,WriteText改为Write)
function AdoWriteFile(filename, filecontent, charset)
{
filename = Server.mappath(filename);//转为物理路径
var folderpath = filename.left(filename.lastIndexOf("\\"));//文件保存目录
CreateDir(folderpath);//检查文件保存目录,不存在则自动创建
var stm = Server.CreateObject("adodb.stream");
stm.Type = 2;//1:二进制模式 2:文本模式 要转换编码必须用文本模式写文件
stm.Mode = 3;//adModeReadWrite ,这里只能用3用其他会出错
stm.Open();
stm.Charset = charset || "utf-8";
stm.WriteText(filecontent);
stm.SaveToFile(filename, 2)
stm.Close();
stm = null;
}
//FSO读文本文件
function FsoReadFile(filename)
{
var fso = new ActiveXObject("Scripting.FileSystemObject");//用FSO无法读写UTF8格式的文件?
var f = fso.OpenTextFile(Server.mappath(filename), 1, true);//第4个参数TristateTrue以UTF-8打开?
var content = f.ReadAll();
f.close();
f = null;
fso = null;
return content;
}
//FSO写文本文件
function FsoWriteFile(filename, filecontent)
{
filename = Server.mappath(filename);
var fso = new ActiveXObject("Scripting.FileSystemObject");//用FSO无法读写UTF8格式的文件
var folderpath = filename.left(filename.lastIndexOf("\\"));//文件保存目录
CreateDir(folderpath);//检查文件保存目录,不存在则自动创建
var f = fso.OpenTextFile(filename, 8, true);
f.WriteLine(filecontent);
f.Close();
f = null;
fso = null;
}
//FSO按层级创建目录
function CreateDir(LocalPath)
{
var fso = new ActiveXObject("Scripting.FileSystemObject")
if (fso.FolderExists(LocalPath)) return true;//已存在目录无须创建
var patharr = LocalPath.split("\\"), pathtmp = "";
for (i in patharr)
{
pathtmp += (i > 0 ? "\\" : "") + patharr[i];//i大于0时前面需要增加\号
if (!fso.FolderExists(pathtmp)) fso.CreateFolder(pathtmp);
}
fso = null;
}
//包含代码文件(读取文件再eval一下,效率没有后端include高)
function include(filename, charset)
{
try { eval(AdoReadFile(filename, charset)) }
catch (e) { }
}
/*
判断元素是否存在于某个数组中,返回元素在数组中的位置,-1表示不存在
elem:元素 arr:被查找的父数组
i:从数组的第几个元素开始查找,默认为0,如果是负数,则表示从数组倒数第几个元素开始查找
*/
function inArray(elem, arr, i)
{
if (!arr) return -1;
var len = arr.length;
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
for (; i < len; i++) if (i in arr && arr[i] === elem) return i;// 跳过空元素
}
/* 数组筛选,同jq前端方法一样 */
function grep(elems, callback, invert)
{
var callbackInverse,
matches = [],
i = 0,
length = elems.length,
callbackExpect = !invert;
// Go through the array, only saving the items
// that pass the validator function
for (; i < length; i++)
{
callbackInverse = !callback(elems[i], i);
if (callbackInverse !== callbackExpect)
{
matches.push(elems[i]);
}
}
return matches;
}
/* 遍历数组或JSON对象,同jq前端方法一样 */
function foreach(object, callback, args)
{
if (!object) return;
var length = object.length, isObj = length === undefined;
if (args)
{
if (isObj)
{
for (name in object) if (callback.apply(object[name], args) === false) break;
} else
{
for (var i = 0; i < length; i++) if (callback.apply(object[i], args) === false) break;
}
} else
{
if (isObj)
{
for (name in object) if (callback.call(object[name], name, object[name]) === false) break;
} else
{
for (var i = 0; i < length; i++) if (callback.call(object[i], i, object[i]) === false) break;
}
}
return object;
}
/**
* 去除重复数组
*/
function GetChapterDomain()
{
return { "jjmh.com": "看漫画", "xiaoshuomanhua.com": "日漫专用" };
}
// 去除重复数组
clearRepeatArr = function (a)
{
var hash = {},
len = a.length,
result = [];
for (var i = 0; i < len; i++)
{
if (!hash[a[i]])
{
hash[a[i]] = true;
result.push(a[i]);
}
}
return result;
}
/*Chilkat Dll通用注册类*/
function newChilkat950(objstr)
{
var obj = new ActiveXObject("Chilkat_9_5_0." + objstr);
var success = obj.UnlockComponent("qgbtFo.CB_1199nLtwT2LG");
if (success != 1) WriteErr("内置服务出错。", 500);
return obj;
}
function newChilkat950ByNotUnlock(objstr)
{
var obj = new ActiveXObject("Chilkat_9_5_0." + objstr);
return obj;
}
%>