nodejs 做的带管理后台的东东,主要学习到 ....我忘了学到什么了
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 做的带管理后台的东东,主要学习到 ....我忘了学到什么了的更多相关文章
- Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
http://www.9miao.com/content-6-304.html Firefly卡牌手游<暗黑世界V1.5>服务器端源码+GM管理后台源码 关于<暗黑世界V1.5> ...
- 用php做管理后台
最近因处理家庭之事,技术上没有提高,这段时间也陆续的恢复了正常的开发,由于要做一个管理后台,所以在选择语言和架构上搜了不少资料, php 和java 的选择上,后来选择用php作为管理后台开发的语言. ...
- Django基础-003 配置Django自带的后台管理,操作数据库
插入测试数据,可以自己写页面来插入数据 也可以使用Django自带的后台管理,来操作数据表 1.创建用户 python manage.py createsuperuser 2.在浏览器输入地址,进入D ...
- Solr学习总结(三)Solr web 管理后台
前面讲到了Solr的安装,按道理,这次应该讲讲.net与数据库的内容,C#如何操作Solr索引等.不过我还是想先讲一些基础的内容,比如solr查询参数如何使用,各个参数都代表什么意思? 还有solr ...
- Tomcat默认界面可导致版本信息泄露+管理后台爆破
由于配置的Tomcat时,管理页面未进行删除或者权限角色配置,攻击者可以通过暴力猜解进入到管理后台,从而上传获取shell. Tomcat的默认工具manager配置,在很多的生产环境中由于基本用不到 ...
- Admin管理后台
Django奉行Python的内置电池哲学.它自带了一系列在Web开发中用于解决常见问题或需求的额外的.可选工具.这些工具和插件,例如django.contrib.redirects都必须在setti ...
- django学习-22.admi管理后台页面的文案展示等相关配置
目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...
- 管理后台Vue
管理后台 遇到的问题 搭建 基于vue 3.0 Vue CLI 4.x Ant Design Vue 2.0 搭建后台管理系统 Ant Design Vue 2.0 npm i --save ant- ...
- 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)
背景 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...
随机推荐
- Git错误解决(windows版本下的Git Shell)
第一个问题:怎么也不能将自己本地仓库代码pull到GitHub网站上? git push origin master Warning: Permanently added 'github.com,19 ...
- IDEA 2017的插件mybatis plugin(绿色免安装)
https://blog.csdn.net/u014365133/article/details/78885189 插件下载 https://files.cnblogs.com/files/techl ...
- 09_dubbo服务发布原理
[ 启动服务的日志分析 ] 1.暴露本地服务 Export dubbo service com.alibaba.dubbo.demo.DemoService to local registry, du ...
- VS2010环境开发Teamcenter ITK
前言 这篇文章主要是用Teamcenter ITK开发的入门配置教程.几个月前学习ITK开发时,领导要求将配置过程整理成学习笔记.最近同事要做ITK开发,就发给他了.感觉这篇文章对别人还是有帮助的,决 ...
- Android 查看和管理sqlite数据库
在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databas ...
- Mac系统丢失管理员
今天把osx变成平行用户,提示说要重启,但是一进来,我靠,自己的管理员用户变成了普通用户.我靠,有这么搞的嘛? 不能安装软件,不能https,不能保存密码,什么也不能做了. 网上一查,找到了几个解决方 ...
- 如何为Android平台编译 opencv3 和 opencv_contrib (Linux)
编译出来的opencv库有问题,正在调试中 ...... 本文以编译opencv 3.3.0 和 opencv_contrib 3.3.0为例,系统为 Linux x64 (Fedora 21),具体 ...
- jquery mobile开发中常见的问题(转载)
1页面缩放显示问题 问题描述: 页面似乎被缩小了,屏幕太宽了. 处理方法: 在head标签内加入: <meta name="viewport" content="w ...
- C#中的多线程 - 高级多线程 z
原文:http://www.albahari.com/threading/part4.aspx 专题:C#中的多线程 1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也 ...
- Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本课主题 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 Spark Worke ...