<% 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; } %>