iijs 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
iijs 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
iijs 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 MIT
开发语言 JavaScript
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 爱主页
适用人群 未知
收录时间 2019-09-09

软件简介

iijs是一个基于nodejs+koa2构建的简单轻量级MVC框架,最低依赖仅仅koa和koa-router。

特点

本MVC框架极为轻量小巧,又自由灵活,使用简单,功能又足够强大,可开发简单的页面展示网站,可以开发pai接口应用,也可支撑复杂的多应用网站。

使用

  1. 安装 npm i iijs

应用结构

├── app             //应用目录 (非必需,可更改)
│  ├── Controller   //控制器目录 (非必需,可更改)
│  │  └── index.js  //控制器
│  ├── view         //模板目录 (非必需,可更改)
│  │  └── index     //index控制器模板目录 (非必需,可更改)
│  │     └── index.htm //模板
│  ├── model        //模型目录 (非必需,可更改)
│  ├── logic        //逻辑目录 (非必需,可更改)
│  └── ****         //其他目录 (非必需,可更改)
├── app2            //应用2目录 (非必需,可更改)
├── common          //公共应用目录 (非必需,可更改)
├── config          //配置目录 (非必需,不可更改)
│  ├── app.js       //APP配置 (非必需,不可更改)
│  ├── route.js     //路由配置 (非必需,不可更改)
│  └── ****         //其他配置 (非必需,可更改)
├── public          //静态访问目录 (非必需,可更改)
│  └── static       //css image文件目录 (非必需,可更改)
├── node_modules    //nodejs模块目录
├── server.js       //应用入口文件 (必需,可更改)
└── package.json    //npm package.json

应用入口

// server.js
const {app} = require('iijs');

app.listen(3000, '127.0.0.1', function(err){
    if(!err) console.log('http server is ready on 3000');
});

Hello world !

// app/controller/index.js
class Index {
    constructor(ctx, next) {
        this.ctx = ctx;
        this.next = next;
    }

    async hello() {
        this.ctx.body = `hello iijs, hello world !`;
    }
}

module.exports = Index;

访问URL:http://localhost/app/index/hello

输出结果:hello iijs, hello world !

如果关闭多应用模式,可以省去url中的app

// config/app.js
{
    app_multi: false, //是否开启多应用
}

URL地址变为:http://localhost/index/hello

配置路由文件,可以进一步简化url访问

// config/route.js
[
    {url: '/hello', path: 'index/hello', method: 'get'}
]

URL地址变为:http://localhost/hello

注意:多应用模式下,路由配置path参数需要加上应用名字,即app/index/hello

控制器

为了方便使用,可以继承系统控制器

// app/controller/index.js
const {Controller} = require('iijs');

class Index extends Controller {
    async index() {
        await this.fetch();
    }
}

module.exports = Index;

访问URL:http://localhost/

注意:系统会自动定位默认应用、默认控制器、默认方法

控制器fetch方法,会自动渲染当前应用、控制器、方法对应的模板文件:

app/view/index/index.htm

也可以指定模板文件

await this.fetch('list'); // app/view/index/list.htm
await this.fetch('article/index'); // app/view/article/index.htm
await this.fetch('app2/article/index'); // app2/view/article/index.htm

await this.fetch('list.html'); // /list.html
await this.fetch('app2/article/index/list'); // /app2/article/index/list.htm

注意:当fetch参数字符串包含后缀或者目录超过3级,将自动按照应用的根目录地址获取模板文件

当fetch,第二个参数为true时,会直接返回渲染后的内容

const html = await this.fetch(null, true);

除了fetch,还有三个方法

await this.display(content); //直接内容输出
await this.load(template); //直接文件输出
await this.render(content); //渲染内容输出

控制器模板数据赋值读取

使用assign方法赋值,data方法读取

//赋值模版数据
this.assign(name, value);

//获取模版数据,name为空时,获取所有数据
this.data(name);

在控制器中获取视图实例

this.view; //视图实例
this.view.art; //art-template模板引擎
this.view.ejs; //ejs模板引擎
this.view.md; //markdown-it实例

注意:系统控制器里的视图实例和模板引擎实例,都是按需懒加载的,可以放心使用,建议应用控制器都继承系统控制器。

应用配置文件

// config/app.js
const app = {
    app_debug: true, //调试模式
    app_multi: true, //是否开启多应用

    default_app: 'app', //默认应用
    default_controller: 'index', //默认控制器
    default_action: 'index', //默认方法

    deny_apps: ['common'], //禁止访问应用
    controller_folder: 'controller', //控制器目录名
    view_folder: 'view', //模板目录名
    
    view_engine: 'art', //默认模版引擎,内置(ejs, art)
    view_depr: '_', //模版文件名分割符,'/'代表二级目录
    view_ext: '.htm', //模版后缀

    static_dir: './public', //静态文件目录,相对于应用根目录,为空或false时,关闭静态访问

    koa_body: {} //koa-body配置参数,为false时,关闭koa-body
}

module.exports = app;

路由配置文件

// config/route.js
route = [
    {url: '/', path: 'app/index/index', method: 'get', type: 'controller'},
    {url: '/hello', path: 'app/index/hello', method: 'all'}
];

module.exports = route;

注意:单应用模式,可以去掉path参数中的app,例如path: 'index/index',其他可参考koa-router

method参数:'get', 'put', 'post', 'patch', 'delete', 'del'

type参数为任意自定义的目录名,controller和view名字可以在app.js配置文件中更改

案例:路由到应用2

// config/route.js
{url: '/hello', path: 'app2/index/hello', method: 'get'}

// 执行文件app2/controller/index.js hello方法

案例:路由到模板(到模板时,会直接读取输出)

// config/route.js
{url: '/hello', path: 'app2/index/hello', method: 'get', type: 'view'}

// 直接输出app2/view/index/hello.htm 模板内容

案例:路由到middleware

// config/route.js
{url: '/hello', path: 'app2/index/hello', method: 'get', type: 'middleware'}

// 执行文件app2/middleware/index.js hello方法

案例:路由到api

// config/route.js
{url: '/hello', path: 'app2/index/hello', method: 'post', type: 'api'}

// 执行文件app2/api/index.js hello方法

案例:路由输出hello world !

// config/route.js
{url: '/hello', path: async (ctx, next) => {
    ctx.body = 'hello iijs, hello world !';
}, method: 'get'}

// 输出hello iijs, hello world !

全局参数

除了koa ctx参数外,本框架,添加4个根参数

ctx.$app //当前请求应用名
ctx.$controller //当前请求控制器名
ctx.$action //当前请求方法名

ctx.$ii //应用根自动懒加载器,相对应用根目录,可以自动加载任意的nodejs模块,如果模块是个class类,可以自动实例化,并传入ctx next参数,具体可参考npm noader 模块

事实上应用的控制器方法执行用的就是ctx.$ii

//系统控制器方法执行
await ctx.$ii[ctx.$app][type][ctx.$controller][ctx.$action]();

//执行list控制器index方法
ctx.$ii.app.controller.list.index();
//或者
const list new ctx.$ii.app.controller.list(ctx, next);
await list.index();

//获取配置文件
const cfg_app = ctx.$ii.config.app;
const cfg_db = ctx.$ii.config.db;

系统helper模块

module.exports = {
    isFileSync,
    isDirSync,
    readFile,
    ii: require('noader')
};

helper.ii为自动加载模块,可以自己实例化使用,具体用法参考noader模块。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击引领话题📣
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
acorn 存在拒绝服务漏洞
拒绝服务
acorn 是一个用 JavaScript 编写的小巧、快速的 JavaScript 解析器。此软件包的受影响版本通过 /[x-\ud800]/u 形式的正则表达式容易受到正则表达式拒绝服务 (ReDoS) 的攻击,这会导致解析器进入无限循环。
MPS-2022-13525
2022-08-08 20:53
ejs 存在代码注入漏洞
代码注入
ejs 是一个流行的 JavaScript 模板引擎。此软件包的受影响版本容易受到通过渲染和渲染文件的任意代码注入的攻击。
MPS-2022-13642
2022-08-08 20:53
urijs 安全漏洞
通过用户控制密钥绕过授权机制
urijs是一个Javascript URL 变异库。 urijs 1.19.8之前存在安全漏洞,该漏洞源于用户控制密钥绕过授权。
CVE-2022-0613 MPS-2022-4192
2022-08-08 20:53
Medialize URI.js 安全漏洞
跨站重定向
Medialize URI.js是Medialize团队的一款基于Javascript的可用于高效拼接URL的代码库。 GitHub存储库 1.19.10之前版本的 medialize/uri.js 存在安全漏洞,该漏洞源于medialize/uri.js 中打开重定向。
CVE-2022-0868 MPS-2022-5797
2022-08-08 20:53
Medialize URI.js 安全漏洞
跨站重定向
Medialize URI.js是Medialize团队的一款基于Javascript的可用于高效拼接URL的代码库。 medialize/uri.js存在安全漏洞,目前暂无该漏洞信息,请随时关注CNNVD或厂商公告。
CVE-2022-1233 MPS-2022-7848
2022-08-08 20:53
Medialize URI.js 输入验证错误漏洞
输入验证不恰当
Medialize URI.js是Medialize团队的一款基于Javascript的可用于高效拼接URL的代码库。 URI.js 存在输入验证错误漏洞,该漏洞源于允许通过使用反斜杠(``)字符后跟一个at(`@`)字符来欺骗主机名。 如果在安全决策中使用了主机名,则该决策可能不正确。 根据库的使用情况和攻击者的意图,影响可能包括允许/阻止列表绕过,开放重定向或其他不良行为。
CVE-2020-26291 MPS-2020-18062
2022-08-08 20:53
Medialize URI.js 输入验证错误漏洞
跨站重定向
Medialize URI.js是Medialize团队的一款基于Javascript的可用于高效拼接URL的代码库。 Medialize URI.js 存在输入验证错误漏洞,该漏洞源于 new URI 未能正确解析 https:/// ,该漏洞导致系统用户被定位到别的站点。
CVE-2021-3647 MPS-2021-10674
2022-08-08 20:53
URI.js 安全漏洞
Medialize URI.js是Medialize团队的一款基于Javascript的可用于高效拼接URL的代码库。 URI.js before 1.19.6 存在安全漏洞,该漏洞源于对反斜杠的某些用法(例如http: /)进行了错误处理,并将URI解释为相对路径。
CVE-2021-27516 MPS-2021-2051
2022-08-08 20:53
uglify-js 存在ReDoS漏洞
ReDoS
uglify-js 是一个 JavaScript 解析器、压缩器、压缩器和美化工具包。此软件包的受影响版本容易通过 string_template 和 decode_template 函数受到正则表达式拒绝服务 (ReDoS) 的攻击。
MPS-2022-14112
2022-08-08 20:53
urijs 存在原型污染漏洞
原型污染
urijs 是一个用于处理 URL 的 Javascript 库。此软件包的受影响版本容易受到 parseQuery() 造成的原型污染。
MPS-2022-14117
2022-08-08 20:53
Medialize URI.js 输入验证错误漏洞
输入验证不恰当
Medialize URI.js是Medialize团队的一款基于Javascript的可用于高效拼接URL的代码库。 Medialize URI.js 1.19.11之前版本存在输入验证错误漏洞,该漏洞源于CRHTLF导致无效的协议提取。
CVE-2022-1243 MPS-2022-7851
2022-08-08 20:53
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
0 评论
1 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部