初学nodejs+express,打造cms系统(3)

野生程序猿-杂烧4年前案例分享655

上次聊到了我的base.js 插入式编程,接着聊编程正题

首先是数据库操作类

【db_mysql.js】

var mysql=require('mysql'); 
var deasync=require('deasync');

var db_mysql={
    connection:null
    ,config:{}
    ,init(config){
        this.config=config;
    }
    ,strtosql(value){
        
        try{
            if(typeof(value)=='undefined' )
            {
                var result='';
            }else{
                var result=value;
            }
        }catch(e){
            var result='';
        }

        result=result.replace(/\'/g,"''");
        result=result.replace(/\\/g,"\\\\");
        return result;
    }
    ,open(){
        this.connection = mysql.createConnection(this.config); 
        this.connection.connect();
    }

    ,close(){
        this.connection.end();
    }

    ,select_all(sql)
    {
        var me=this;
        var temp_select_all=deasync((sql,cb) => {
            me.open();
            me.connection.query(sql,function (err, result) {
                if(err){
                    var result=[];
                }
                me.close();
                //setTimeout(function(){
                    cb(null, result);
                //},500);
                
            });
    
        })

        return temp_select_all(sql);

    }


    ,select_one(sql)
    {
        var sql=sql+' limit 0,1';
        var this_result=this.select_all(sql);
        try{
            var result=this_result[0];
            if(!result)
            {
                var result={};
            }
        }catch(e){
            var result={};
        }
        return result;

    }


  
    ,select_onebyone(sql,key){
 
        var select_result=this.select_one(sql);
        try{
            var result=select_result[key];
            
            if(typeof(result)=='undefined' )
            {
                var result='';
            }
            
        }catch(e){
            var result='';
        }
      

        return result;
        

    }



    ,dosql(sql)
    {
        var me=this;
        var temp_dosql=deasync((sql,cb) => {
            me.open();
            me.connection.query(sql,[],function (err, result) {
                if(err){
                    var result=false;
                }else{
                    var result=true;
                }
                me.close();
                cb(null, result);
            });
    
        })

        return temp_dosql(sql);

    }

    ,havetab(tab_name)
	{

        var me=this;
        var sql=`select * from ${tab_name}`;
        var temp_havetab=deasync((sql,cb) => {
            me.open();
            me.connection.query(sql,function (err, result) {
                if(err){
                    var result=false;
                }else{
                    var result=true;
                }
                me.close();
                
                cb(null, result);
                
                
            });
    
        })

        return temp_havetab(sql);
							   
    }
    
    ,havefield(tab_name,fieldname){
        var sql=`Describe ${tab_name} ${fieldname}`;
        var this_list=this.select_all(sql);
        if(this_list.length>0)
        {
            return true;
        }else{
            return false;
        }
    }

    ,myinsertsql(req,str,notin,gettype)
    {
        console.log(notin);
        if(!notin)
        {
            var notin=[];
        }
        if(!gettype)
        {
            var gettype='get';
        }
        var arr = str.split('|');
        var obj={};
        var obj_notin={};
        var arr_length=arr.length;
		var sql1_arr=[];
        var sql2_arr=[];
        
        for(var i in arr)
        {
            obj[arr[i]]=1;
        }
        for(var i in notin)
        {
            obj_notin[notin[i]]=1;
        }
        console.log(obj_notin);
		for(var key in obj)
		{
            if(obj_notin[key]!=1)
            {
                try{
                    if(gettype=="get")
                    {
                        var this_value=this.strtosql(req.query[key]);
                    }else{
                        var this_value=this.strtosql(req.body[key]);
                    }
                }catch(e){
                    var this_value='';
                }
 
                sql1_arr.push(key);
                sql2_arr.push(`'${this_value}'`);
            }
			
			
		}
		var sql1=sql1_arr.join(',');	
        var sql2=sql2_arr.join(',');
        var result=[sql1,sql2];

		return result;
    }

    ,myupsql(req,str,notin,gettype)
    {
        if(!notin)
        {
            var notin=[];
        }
        //console.log(notin);
        if(!gettype)
        {
            var gettype='get';
        }
        var arr = str.split('|');
        var obj={};
        var obj_notin={};
        var arr_length=arr.length;
		var sql1_arr=[];
        var sql2_arr=[];
        
        for(var i in arr)
        {
            obj[arr[i]]=1;
        }
        for(var i in notin)
        {
            obj_notin[notin[i]]=1;
        }
		for(var key in obj)
		{
            if(obj_notin[key]!=1)
            {
                try{
                    if(gettype=="get")
                    {
                        var this_value=this.strtosql(req.query[key]);
                    }else{
                        var this_value=this.strtosql(req.body[key]);
                    }
                }catch(e){
                    var this_value='';
                }
                var this_html=`${key}='${this_value}'`;
                sql1_arr.push(this_html);
               
            }
			
			
		}
		var sql1=sql1_arr.join(',');	

        var result=[sql1];

		return result;
    }

    ,showpage(req,sql,pagename,perpage=20,pernumber)
    {
        if(!pagename)
        {
            var pagename='pagenum';
        }
        if(!perpage)
        {
            var perpage=20;
        }
        if(!pernumber)
        {
            var pernumber=5;
        }

        var pageurl='';

        if(!req.query)
        {
            req.query={};
        }
        try{
            var page=req.query[pagename];
            if(typeof(page)=='undefined')
            {
                var page='';
            }
        }catch(e){
            var page='';
        }
		
		if (page=="")
		{
		page=1;
		}else{
		page=page*1;
		}

		//$perpage
		var start=perpage*(page-1);
		var end=perpage*page;
	

		var newsql=`${sql} limit ${start} ,${perpage}`;
		
        var numsql=`select count(*) as num from (${sql}) TAB_GG_UU_YY`;
        //console.log(numsql);
        var allnum=this.select_onebyone(numsql,'num');
        allnum=allnum*1;
        var allpagenum=Math.ceil(allnum/perpage);


        var query_arr=[];
        for(var i in req.query)
        {
            console.log(` ********  i -> ${i}`)
            if(i!=pagename)
            {
                var this_query=`${i}=${req.query[i]}`;
                query_arr.push(this_query);
            }
        }

        var get_page_url=function(query_arr,page)
        {
            if(query_arr.length>0)
            {
                pageurl='?'+query_arr.join('&')+`&${pagename}=${page}`;
            }else{
                pageurl='?'+`&${pagename}=${page}`;
            }
            return pageurl;
        }

        pageurl=get_page_url(query_arr,page);

        

        var shang_url=pageurl=get_page_url(query_arr,page-1);
        var xia_url=pageurl=get_page_url(query_arr,page+1);

        //上一页
        if(page>1)
        {
            var shang_html_layui=`<a href="${shang_url}" class="layui-laypage-prev" ><i class="layui-icon"></i></a>`;	
        }else{
            var shang_html_layui=`<a href="javascript:;" class="layui-laypage-prev layui-disabled" ><i class="layui-icon"></i></a>`;
        }

        //下一页
        if(page<allpagenum)
        {
            var xia_html_layui=`<a href="${xia_url}" class="layui-laypage-next" ><i class="layui-icon"></i></a>`;

        }else{
           
            var xia_html_layui='<a href="javascript:;" class="layui-laypage-next layui-disabled" ><i class="layui-icon"></i></a>';
         
        }


        //当中分页	
        var chaju=Math.ceil(pernumber/2);
        var startpage=page-pernumber+chaju;
        if(startpage<=0)
        {
        startpage=1;
        }
        var endpage=startpage+pernumber-1;
        if(endpage>allpagenum)
        {
            endpage=allpagenum;
            startpage=endpage-pernumber+1;
            if (startpage<=0)
            {
                startpage=1;
            }
        }

        var all_html="";
        var all_html_easyweb="";

		for(var index=startpage;index<=endpage;index++)
		{
			if(page!=index)
			{
				var this_url=get_page_url(query_arr,index);
                var all_html_easyweb=all_html_easyweb+`<a href='${this_url}' data-page='${index}'>{index}</a>`;
                var all_html_layui=all_html_layui+`<a href="${this_url}" >${index}</a>`;	
            }else{
                var all_html_easyweb=all_html_easyweb+`<span class='layui-laypage-curr'><em class='layui-laypage-em'></em><em>${index}</em></span>`;
                var all_html_layui=all_html_layui+`<span class="layui-laypage-curr"><em class="layui-laypage-em"></em><em>${index}</em></span>`;	
			}
		}
	
		//跳转页

        var tiao_zhuanurl_easyweb="";
		for(var index=1;index<=allpagenum;index++)
		{
            var this_url=get_page_url(query_arr,index);
            var this_selected="";
            if(index==page)
            {
                var this_selected=" selected='selected' ";
            }
            tiao_zhuanurl_easyweb=tiao_zhuanurl_easyweb+`<option value='${this_url}' ${this_selected}>第${index}页</option>`;

		}

        var tiao_zhuanurl_easyweb=` <span class='layui-laypage-limits'>共 ${allnum} 条</span><span class='layui-laypage-skip'>转到</span> <span class='layui-laypage-limits my_page_select'><select onchange='window.location=this.value;'>${tiao_zhuanurl_easyweb}</select></span>`;

		if(allnum==0)
		{
            var easyweb_pagehtml='<span class="layui-laypage-count">暂无数据</span>';
            
		}else{
            var easyweb_pagehtml=`${shang_html_layui} ${all_html_layui} ${xia_html_layui} ${tiao_zhuanurl_easyweb}`;
        }

        var result={
            sql:newsql
            ,allnum:allnum
            ,page:page
            ,allpagenum:allpagenum
            ,easyweb_pagehtml:easyweb_pagehtml
        };
        return result;
    }

};


module.exports = db_mysql;

直接从php改过来的,主要的几个试过了没问题,有些没试可能有小问题。select_all,select_one 一看就明白用法。showpage是分页,myinsertsql、myupsql是表单批量提交,这个可能是有些问题的,因为与php表单post有本质区别,所以这部分代码改得很乱,php在方法里是可以直接使用$_POST取值的,nodejs里不行,只能后来硬加了个 req。作为学习练习代码,先这么用着,把后面的坑踩完了再优化调整吧。


【req_res.js】因为很多功能依赖于req、res两个变量。像req.session也跟php完全不同,没有全局变量。只能整个管理类。处理一下常用的req、res事情

var req_res={
    req:null

    ,res:null

    ,init(obj){
        this.res=obj.res;
        this.req=obj.req;
    }

    ,get_session(key)
    {
        try{
            var result=this.req.session[key];
            if(typeof(result)=='undefined')
            {
                var result='';
            }
        }catch(e){
            var result='';
        }
        return result;
    }

    ,set_session(key,value)
    {
        try{
            this.req.session[key]=value;
        }catch(e){
            
        }
        
    }

    ,admin_checklogin(){
        if(this.get_session('adminname')!='' && this.get_session('adminislogin')!='')
        {
            return true;
        }else{
            return false;
        }
    }

    ,admin_logingo(username){
        this.set_session('adminname',username);
        this.set_session('adminislogin',1);
    }

    ,admin_loginout(){
        this.set_session('adminname','');
        this.set_session('adminislogin',0);
    }

    ,admin_username()
    {
        if(this.admin_checklogin())
        {
            return this.get_session('adminname');
        }else{
            return '';
        }
    }

    ,gourl(url){
        var html=`
            <script>
                location.href='${url}';
            </script>
        `;
        this.res.send(url);
    }




    
};


上面代码也是通过base装载插入;base.use('req_res',{req:req,res:res}); 


一个框架基本改造好了,base也挂载了最最基础的处理功能,下面开始制作页面。




相关文章

nodejs裁剪图片

nodejs裁剪图片

这是个真实的案例,下面脚本是真实跑通的,走过了一些坑,这里来给大家分享一下 首先描述一下场景,我们是做教学软件的,这个是开发一个X光机安检教学场景,有...

初学nodejs+express,打造cms系统(4)

前面已经改造了基础模块,下面到了页面制作环节。先前的脚手架已经支持ejs了,在views文件夹里出现了测试ejs,下面基本上是锻炼自己仿写能力了。【routes/api.js】var exp...

js预加载loading的另类优化方案

各位做前端的朋友有没做过loading预加载素材的功能,一般游戏开发正常都会用到。其实加载多图的时候我们为了优化体验都是需要做loading效果的。哪些东西需要loading?最常见的就是图片,部分用...

初学nodejs+express,打造cms系统(5)

今天来尝试做上传功能,其实就是一个上传接口。已经跟php完全两样了,两眼一抹黑,直接百度搜索出来拿过来用,也不知道性能如何,反正可以跑通,需要找机会验证一下。【upload.js】//api库&nbs...