• nodejs 做的带管理后台的东东,主要学习到 ....我忘了学到什么了


    效果 http://www.steel-pot.com/     

    function handleStr(str,isHtml,callback)
    {   
    	if(!isHtml)
    	{
    		callback(str);
    		return;
    	}
    	str= str.replace(/<script(([sS])*?)</script>/g,"");
    	str= str.replace(new RegExp(dstHost,"gm"),srcHost);   
    	callback(str); 
    }  
    
    
    //html解析器
    var cheerio = require('cheerio');
    //文件操作模块
    var fs = require('fs'),path = require('path'); 
    //加密模块
    var cryptos=require("./cryptos"); 
    //引入http模块
    var http = require("http"); 
    //设置主机名
     var hostName = '127.0.0.1';
    //设置端口
    var port = 9000;  
    var iconv = require('iconv-lite');
    
    
    //创建目录
    var mkdirs = module.exports.mkdirs = function(dirpath, mode, callback) {
        fs.exists(dirpath, function(exists) {
            if(exists) {
                    callback(dirpath);
            } else {
                    //尝试创建父目录,然后再创建当前目录
                    mkdirs(path.dirname(dirpath), mode, function(){
                            fs.mkdir(dirpath, mode, callback);
                    });
            }
        });
    };
    
    
    
    
    //获取缓存
    function getCatch(host,url,callback)
    {
    	var file=__dirname+'/tmp/'+host.replace(':','');
    	mkdirs(file,777,function(){
    		file+='/'+cryptos.md5(url);
    		fs.exists(file,function(exists){
    			 if(exists)
    			 {
    				 fs.readFile(file,'utf-8',function(err,data){
    					 if(err){
    							 callback(false,file);
    						 }
    						 else{
    							 callback(true,file,data); 
    						}
    				  });  
    			 }else{
    				callback(false,file); 
    			 }
    		});
    	});  
    } 
    
    //获取远程内容 
    function getRemote(hostset,url,callback)
    { 
    	var body="";
    	var options = {    
    			hostname: hostset.host,    
    			port: 80,    
    			path:url,    
    			method: 'GET'    
    		};  
    	var req = http.request(options, function (remoteRes) {   
    			remoteRes.setEncoding(hostset.charset);    
    			remoteRes.on('data', function (chunk) { 
    				 body+=chunk;
    			}); 
    			remoteRes.on("end",function(){  
    						callback(true,body,remoteRes.headers['content-type'].indexOf("text/html") != -1); 
    					  }); 
    		});	 
    		req.on('error', function (e) {   
    			callback(false,e.message,false);		
    			console.log('problem with request: ' + e.message);    
    		});  
    		req.end();	
    }
    
    //获取域名
    function getDstHost(host,callback)
    { 
    	fs.readFile('./hostlist.txt', 'utf8', function(err, hostlist){
    		hostlist=JSON.parse(hostlist);
    		
    		if(host in hostlist)
    		{ 
    			callback(hostlist[host]);
    		}else{
    			var hostset={"title":"baidu","host":"www.baidu.com"};
    			callback(hostset);
    		}
    	});
    }
    
    //获得内容
    function getContent(hostset,url,callback)
    { 
    	if(!hostset.nocatch&&url!=""&&url!="/")
    	{
    		getCatch(hostset.host,url,function(rs,file,data){
    			if(rs)
    			{
    				callback(data);
    			}else{
    				//获取远程内容 
    				getRemote(hostset,url,function(rs,body,ishtml){
    					if(rs&&body!="")
    					{
    						handleStr(body,ishtml,function(rs){
    								  if(file!=''){
    									  fs.writeFile(file, rs, {flag: 'a'}, function (err) {
    											   if(err) {
    													console.error(err);
    												}
    											});
    								  }
    							 callback(rs);
    						  });  
    					}else{
    						callback(body);
    					}
    				});
    			}
    		});
    	}else{
    		//获取远程内容 
    		getRemote(hostset,url,function(rs,body){ 
    						handleStr(body,true,function(rs){ 
    							 callback(rs);
    						  }); 
    			});
    	}
    }
    
    
    //需要保证模板文件存在,这里不判断
    var tplview=function(tpl,varData,callback){
    				fs.readFile(tpl,'utf-8',function(err,data){
    						if(err)
    						{
    							callback("");
    							return ;
    						}
    						 
    						for(key in varData)
    						{
    							re = new RegExp('{'+key+'}','g');
    							data = data.replace(re,varData[key]);
    						}
    						callback(data.toString());
    				}); 
                };     
    			
    var mainObj={};
    mainObj.main=function(res,data){
    	var tpl=__dirname+"/index.tpl";
    	var varData={};
    	
    	fs.readFile(__dirname+"/hostlist.txt",'utf-8',function(err,data){
    		 
    		data=JSON.parse(data);
    		varData.list="";
    		for(var key in data)
    		{
    			varData.list+="<div class='col-md-2'><a href='http://"+key+"'>"+data[key].title+"</a></div>";
    		}
    		tplview(tpl,varData,function(str){
    			res.write(str);
    			res.end();
    		}); 
    	}); 
    };
    mainObj.edit=function(res,data){
    	var file=__dirname+"/edit.html";
    	backfile(res,file);
    };
    mainObj.editsave=function(res,data){
    	var file=__dirname+"/hostlist.txt";
    	 fs.writeFile(file, data, {}, function (err) {
    											   if(err) {
    													res.write("保存文件失败"); 
    												}else{
    													res.write("保存成功"); 
    												}
    												res.end();
    											}); 
    };
    mainObj.getlist=function(res,data){
    	//设置返回值类型
    	res.setHeader("Content-Type", "application/json;charset=utf-8");
    	var file=__dirname+"/hostlist.txt";
    	backfile(res,file);
    };
    function backfile(res,file)
    {
    	fs.exists(file,function(exists){ 
    			 if(exists)
    			 {
    				 fs.readFile(file,'utf-8',function(err,data){
    					 if(err){
    						res.statusCode=404;
    						res.end(err); 
    					}
    					else{
    						res.write(data);
    						res.end();		
    					}
    				  });  
    			 }else{
    				res.statusCode=404;
    				res.end();
    			 }
    		});
    }
    
    var httpHandler=function(req,res){
    	 var post="";
    	//接收post数据
    	req.on('data',  function(chunk){        //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中      
                post  +=  chunk;      
            });
    	req.on('end',  function(){ 
    		//只支持定义好的方法,不支持未定义的方法  
    		//处理请求
    		url=req.url;
    		//去掉第一个斜杠 
    		url=url.substr(1);
    		if(url==""||url=="/")url="main";
    		 
    		if(!mainObj.hasOwnProperty(url))
    		{
    			res.statusCode=404;
    			res.end();
    			return;
    		}
    		mainObj[url](res,post);
    	});	
    }
    //创建服务
    var server = http.createServer(function(req,res){   
    		 srcHost=req.headers.host; 
    		 //如果是指定域名,则特别处理
    		 if(srcHost=="www.steel-pot.com")
    		 {
    			 httpHandler(req,res);
    			return ;
    		 }
    		 //第一步获取域名
    		 getDstHost(srcHost,function(hostset){ 
    			dstHost=hostset.host;
    			 //第二步获取内容
    			 getContent(hostset,req.url,function(body){
    				 if(hostset.charset)body=iconv.encode(body, hostset.charset);
    				 res.end(body);
    			 });
    		 });
    });
    server.listen(port,hostName,function(){
        console.log('run');
    });
    

      

  • 相关阅读:
    Minecraft我的世界如何联机
    关于我的博客地址jvav的由来
    ThreadLocal使用
    使用免费tk域名
    MVC的request,response流程
    TiDB原理与集群架构
    net5 自定义 中间件
    net5 Autofac支持
    net5 Autofac 支持AOP (1)
    mysql 索引优化
  • 原文地址:https://www.cnblogs.com/meieiem/p/9259189.html
Copyright © 2020-2023  润新知