前端sdk封装(node)

前端sdk封装(node),第1张

场景:

    在实际开发中,需要将后端接口封装成sdk,可供前端直接调用,接口可实现页面跳转等

实际运用:

    实际开发中,前端项目时基于node的项目,需要重新封装一层后端接口,并实现页面的可配置化跳转。

    实际调试中,注意node版本,版本不同,差异很大。我本地试的v894版本

    1node中获取请求参数两种方式:

        reqbody获取post请求参数,reqquery获取get请求参数,reqparams获取get请求参数,url中直接拼接参数的那种,如 >

运行时环境

我们知道需要一个称为JRE的运行时环境来运行程序。JRE有一个称为VirtualMachine(JVM)的虚拟机。JVM有许多组件,如垃圾回收器(GC),即时(JIT)编译器,解释器,类装载器,线程管理器,异常处理器,用于在不同时间执行不同的任务。

除了JVM之外,JRE还有一系列的库(例如,rtjar)来帮助运行时的程序。我们有单独的JRE用于不同的平台,如Windows,Macintosh和Linux,以及还有JVM。

好吧,就试着记住如何编译和执行一个程序。我们有源代码(),它由编译器编译成一个名为Bytecode(class)的中间代码。此Bytecode被提供给JVM以便在给定的目标平台上执行。JVM在执行之前将Bytecode转换为特定于目标平台的机器码。

Web应用程序架构

典型的Web应用程序架构有四个层:客户层(Client),展示层(Presentation),服务/业务层(Service/Business)和数据层(Data)。

客户层(Clientlayer)可以使用像jQuery这样的库来支持AJAX功能并且具有一些客户端验证和DOM *** 作。

展示层(Presentationlayer)通常是与客户层交互的一个层。该层通常已经实现了用于请求和响应处理的MVC模式。在这一层可以使用如SpringMVC这样的框架。此外,还有一个模板引擎,如Velocity,可以根据预定义的布局动态地渲染视图。

服务或业务层(Service/Businesslayer)负责具备业务逻辑并与其他层通信。在AJAX请求的情况下,该层直接向客户层提供数据。此层执行业务逻辑并回应到展示层以更新模型。服务层是与数据层通信以获取或更新所需数据的一个层。服务层可以具有使用任何框架,例如Spring的SOAP或REST服务实现。

数据层(Datalayer)通常使用一些ORM框架,如Hiberate,或任何基于JDBC的库/模板(SpringJDBC模板)来与任意RDBMS(如Oracle)进行通信。

架构部署

Web应用程序架构部署包括Apache>

nodejs中有一个uuid的生成库uuid: >

#include <stdioh>

#include <memoryh>

#define clr(a) memset(a,0,sizeof(a))

#define N 5005

#define M 50000

typedef struct StrNode{

    int j;

    struct StrNode next;

}Node;

Node mem[M];

int memp;

void addEdge(Node e[],int i,int j){

    Node p = &mem[memp++];

    p->j=j;

    p->next = e[i];

    e[i]=p;

}

int g_DFS_First;

void DFS_conn(Node e[],int i,int mark[],int f[],int nf){

    int j; Node p;

    if(mark[i]) return;

    

    mark[i]=1;

    if(!g_DFS_First) f[i]=nf;  //反向搜索,获取连通分量编号

    for(p=e[i];p!=NULL;p=p->next){

        j=p->j;

        DFS_conn(e,j,mark,f,nf);

    }

    if(g_DFS_First) f[(nf)++]=i;   //正向搜索,获取时间戳

}

/

有向图极大强连通分量

参数:

    邻接表e[],节点数n。返回极大强连通分支的个数ncon。 

    返回con[i]表示节点i所属强连通分量的编号,0 ~ ncon-1。

/

int Connection(Node e[],int n,int con[]){

    int i,j,k,mark[N],ncon;

    int time[N],ntime;  //time[i]表示时间戳为i的节点 

    Node p,re[N]; //反向边

    

    //构造反向边邻接表

    clr(re);

    for(i=0;i<n;i++){

        for(p=e[i];p!=NULL;p=p->next)

            addEdge(re,p->j,i);

    }

    

    //正向DFS,获得时间戳 

    g_DFS_First = 1;

    clr(mark); clr(time); ntime=0;

    for(i=0;i<n;i++){

        if(!mark[i])

            DFS_conn(e,i,mark,time,&ntime);

    }

    

    //反向DFS,获得强连通分量 

    g_DFS_First = 0;

    clr(mark); clr(con); ncon=0;

    for(i=n-1;i>=0;i--){

        if(!mark[time[i]]){

            DFS_conn(re,time[i],mark,con,&ncon);

            ncon++;

        }

    }

}

//vars

Node e[N];

int con[N],ncon;

int n,m;

int d[N];

int main()

{

    int i,j,k,x,y;

    Node p;

    

    while(scanf("%d",&n)!=EOF && n){

        //init

        memp=0; clr(e);

        //input

        scanf("%d",&m);

        for(k=0;k<m;k++){

            scanf("%d%d",&i,&j); i--; j--;

            addEdge(e,i,j);

        }

        //Connection

        ncon=Connection(e,n,con);

        //work d[]

        clr(d);

        for(i=0;i<n;i++){

            x=con[i];

            for(p=e[i];p!=NULL;p=p->next){

                y=con[p->j];

                if(x!=y) d[x]++;

            }

        }

        //output

        j=0;

        for(i=0;i<n;i++){

            k=con[i];

            if(d[k]==0){

                if(j) printf(" "); j=1;

                printf("%d",i+1);

            }

        }

        puts("");

    }

    

    return 0;

}

function readLog(date,type,operation){//函数接受3个参数,日期、精度(天时分秒)和 *** 作(查找、刷新或者默认)        if(date){        //如果有时间参数则对时间参数进行处理(一般日志名称都是时间加类型)            var dataStr = arguments[0];            var date = dataStrslice(0,10);            var hour = dataStrslice(11,13);            var minute = dataStrslice(11,16);            var second =dataStrslice(11,19);            var type = arguments[1];            //获取精度

        }else{        //若无时间参数则获取当前时间,然后精度默认            var date = new Date(+new Date()+836001000)toISOString()replace(/T/g,' ')replace(/\[\d]{3}Z/,'')slice(0,10);            var type=null;

        }        var op = arguments[2];        var countResult = 0;        //对日志结果进行统计        var logPath = appDirNameslice(0,-3)+'log\\'+'ivsvr_'+date+'log';        //拼接日志文件名称        var logStr = '';

        fsstat(logPath, function (err, stats) {        //获取对应的日志文件状态        if(err){        //日志不存在或者异常处理信息

            $('#logTipInfo tr td')html('无日志信息可供查看');            consolelog(err);

        }else{            var lineCount = 0;            var readline = require('readline');            var fReadName = logPath;            var fRead = fscreateReadStream(fReadName);            var objReadline = readlinecreateInterface({                input: fRead,

            });            //按行读取日志

            objReadlineon('line', (line)=>{                var itemStr = $trim(line);                var time = itemStrslice(0,19);                var content = itemStrsubstr(20);                if(!time || !content){return;}

                ++ lineCount;                //计数行数                var matched = true;                var itemStr = $trim(line);                var itemArr = itemStrsplit(' ');                var logDate = itemArr[0];                var logTime = itemArr[1];                var time = logDate+' '+logTime;                switch(type){                //进度查找过滤                    case '0':                    case null:

                        matched = true;                        break;                    case '1':                        var timeSplit = logTimeslice(0,2);                        if(timeSplit == hour){

                            matched = true;                            break;

                        }

                        matched = false;                        break;                    case '2':                        var timeSplit = logTimeslice(0,5);                        if(timeSplit == minute){

                            matched = true;                            break;

                        }

                        matched = false;                        break;                    case '3':                        var timeSplit = logTimeslice(0,8);                        if(timeSplit == second){

                            matched = true;                            break;

                        }

                        matched = false;                        break;                    default:                        consolelog('unkonw type!');                        break;

                }                if(matched === true &&(lineCount>logReadFlag)){                //日志结果格式化输出呈现

                    countResult ++;                    var result = itemArr[2];                    if(result == 'err'){                        var operation = itemArr[4];

                        result = '失败:'+itemArr[5]+' '+(itemArr[6]itemArr[6]:'');

                    }else{                        var operation = itemArr[4]+' '+itemArr[5]+(itemArr[6]itemArr[6]:'');

                        result = '成功';

                    }

                    logStr += '<tr><td>'+time+'</td><td>'+operation+'</td><td>'+result+'</td></tr>'

                }

                logStr += '<tr><td>'+time+'</td><td>'+content+'</td></tr>'

            });            objReadlineon('close', ()=>{                if(logReadFlag == 0 && (logStr == '')){                    var info = '无日志信息可供查看';

                }                if(logReadFlag >0 && (logStr != '')){                    var newLogNum = lineCount - logReadFlag;                    var info = '刷新成功,更新'+newLogNum+'条日志!';

                    $('#logInfoTable')prepend(logStr);

                }else if(logReadFlag >0 && (logStr == '')){                    var info = '刷新成功,无日志更新!';

                }else{

                    $('#logInfoTable')html(logStr);

                }                if(op == 'search'){                    var info = '查找到'+countResult+'条日志';

                }

                $('#logTipInfo tr td')html(info);                if((op == 'search' || op == 'refresh') &&(logReadFlag != 0 || newLogNum >0 || countResult >0)){

                    setTimeout(function() {$('#logTipInfo')fadeOut(567);}, 2000);                    // *** 作结束后给出信息反馈,反馈自动淡出消失

                }                else{

                    $('#logTipInfo')hide();

                }

                logReadFlag = lineCount;                consolelog('closed');

            });

        }

    });

}

在Nodejs中,可以使用require函数来引入模块。Nodejs中的require函数是用来加载模块的函数,它会按照搜索规则,搜索模块的文件路径,并返回模块的导出对象。

要引入nodeglobal文件夹下的模块,首先需要使用fs模块来读取nodeglobal文件夹下的文件列表,以查找模块所在的路径。

然后,可以使用require函数来引入模块,例如:

const myModule = require('nodeglobal/myModulejs');

这样一来,就可以引入nodeglobal文件夹下的模块了。

另外,也可以使用Nodejs的path模块来构造模块文件的完整路径,然后再使用require函数来引入模块。例如:

const path = require('path');

const myModule = require(pathjoin(__dirname, 'nodeglobal', 'myModulejs'));

这样一来,就可以正确的引入nodeglobal文件夹下的模块了。

以上就是关于前端sdk封装(node)全部的内容,包括:前端sdk封装(node)、电脑培训分享Node.js对于Java开发者而言是什么、nodejs中生成uuid等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9325238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存