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

function handleStr(str,isHtml,callback)
{
if(!isHtml)
{
callback(str);
return;
}
str= str.replace(/<script(([\s\S])*?)<\/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');
});

  

nodejs 做的带管理后台的东东,主要学习到 ....我忘了学到什么了的更多相关文章

  1. Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码

    http://www.9miao.com/content-6-304.html Firefly卡牌手游<暗黑世界V1.5>服务器端源码+GM管理后台源码 关于<暗黑世界V1.5> ...

  2. 用php做管理后台

    最近因处理家庭之事,技术上没有提高,这段时间也陆续的恢复了正常的开发,由于要做一个管理后台,所以在选择语言和架构上搜了不少资料, php 和java 的选择上,后来选择用php作为管理后台开发的语言. ...

  3. Django基础-003 配置Django自带的后台管理,操作数据库

    插入测试数据,可以自己写页面来插入数据 也可以使用Django自带的后台管理,来操作数据表 1.创建用户 python manage.py createsuperuser 2.在浏览器输入地址,进入D ...

  4. Solr学习总结(三)Solr web 管理后台

    前面讲到了Solr的安装,按道理,这次应该讲讲.net与数据库的内容,C#如何操作Solr索引等.不过我还是想先讲一些基础的内容,比如solr查询参数如何使用,各个参数都代表什么意思? 还有solr ...

  5. Tomcat默认界面可导致版本信息泄露+管理后台爆破

    由于配置的Tomcat时,管理页面未进行删除或者权限角色配置,攻击者可以通过暴力猜解进入到管理后台,从而上传获取shell. Tomcat的默认工具manager配置,在很多的生产环境中由于基本用不到 ...

  6. Admin管理后台

    Django奉行Python的内置电池哲学.它自带了一系列在Web开发中用于解决常见问题或需求的额外的.可选工具.这些工具和插件,例如django.contrib.redirects都必须在setti ...

  7. django学习-22.admi管理后台页面的文案展示等相关配置

    目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...

  8. 管理后台Vue

    管理后台 遇到的问题 搭建 基于vue 3.0 Vue CLI 4.x Ant Design Vue 2.0 搭建后台管理系统 Ant Design Vue 2.0 npm i --save ant- ...

  9. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

随机推荐

  1. curl POST JSON

    1. 场景 Controller接收json格式数据 封装bean @RequestMapping(value = "/bb", method = RequestMethod.PO ...

  2. 原生JS的轮播图

    学习前端也有一小段时间了,当初在学习javascript的时候,练手的一个轮播图实例,轮播图也是挺常见的了. 着是通过获取图片偏移量实现的.也实现了无缝切换.还有一点问题就是没有加上图片切换的时候的延 ...

  3. js表单快速取值/赋值 快速生成下拉框

    1.表单取值/赋值公共方法 //表单序列化:文本框的name字段和数据源一致<form id="myForm" onsubmit="return false;&qu ...

  4. 使用Calendar加一天,减一天

    public class Test { public static void main(String[] args) { Calendar c=Calendar.getInstance(); Simp ...

  5. BNF巴科斯-诺尔范式

    概述 BNF是描述编程语言的文法.自然语言存在不同程度的二义性.这种模糊.不确定的方式无法精确定义一门程序设计语言.必须设计一种准确无误地描述程序设计语言的语法结构,这种严谨.简洁.易读的形式规则描述 ...

  6. Spring3实战第二章第二小节 IOC依赖注入 list和map集合

    Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式. 1.Set注入 2.构造器注入 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new ...

  7. MapReduce优化参数

    资源相关参数 //以下参数是在用户自己的 MapReduce 应用程序中配置就可以生效 (1) mapreduce.map.memory.mb: 一个 Map Task 可使用的内存上限(单位:MB) ...

  8. Elasticsearch 架构原理

    为什么要学习架构? Elasticsearch的一些架构设计,对我们做性能调优.故障处理,具有非常重要的影响.下面将从Elasticsearch的准实时索引的实现.自动发现.rounting和repl ...

  9. 设计模式:观察者(Observer)模式

    设计模式:观察者(Observer)模式 一.前言   观察者模式其实最好的名称应该是“发布订阅”模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计模式,我们学习的是仲 ...

  10. July 20th 2017 Week 29th Thursday

    The darkness is no darkness with you. 有了你,黑暗将不再是黑暗. The darkness will not be driven out if we failed ...