效果 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. PAT 1082. Read Number in Chinese

    #include <cstdio> #include <cstdlib> #include <string> #include <vector> #in ...

  2. cocos-creator 脚本逻辑-2

    1.预制体 1)节点操作 Cc.find(‘node-1’) 获取节点 全局事件 作用于 canvas this.node.destroy() 删除节点(从内存中删除) 添加删除获取节点或组件 let ...

  3. 实现绘制图形的ToolBar

    给地图添加绘制图形的ToolBar还是有必要的,比较人性化的功能.图形的样式可以自己定制,也提供了朴实的默认样式.对 dojo 不太懂,出现了许许多多问题,真是蛋疼的一天啊.令人惊喜的是 ArcGis ...

  4. RocketMQ读书笔记5——消息队列的核心机制

    [Broker简述] Broker是RocketMQ的核心,大部分“重量级”的工作都是由Broker完成的,包括: 1.接受Producer发过来的消息: 2.处理Consumer的消费信息请求: 3 ...

  5. 01_编程规约——OOP规约

    1.[强制]避免通过一个类的对象引用访问此类的静态变量或静态方法,避免增加编译器解析成本,直接用“类名.变量名”访问即可. 2.[强制]所有的覆盖方法,必须加@Override注解 说明:加@Over ...

  6. 寒假来了,阿里游戏云6000、20000元新春大礼,游戏开发的骚年们r u ready?

    寒假来了,游戏开发的骚年们,r u ready? 亿元云计算基金.游戏云计算解决方案.尊享VIP服务,为你“三羊开泰”! 现在参与游戏云认证,即享6000元.2万元… 最高100万云基金!走你> ...

  7. JAVA的静态方法,静态变量,静态类。

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                ...

  8. Android MediaPlayer播放音乐并实现进度条

    提前工作,往sd卡里放音乐文件 1.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> < ...

  9. Kafka配额讨论(流量限制)

    Kafka自0.9.0.0版本引入了配额管理(quota management),旨在broker端对clients发送请求进行限流(throttling).目前Kafka支持两大类配额管理: 网络带 ...

  10. 关于Flume以及Kafka理解