├── core ├── cachesystem │ ├── caches │ │ ├── MemoryCache.js │ │ └── RedisCache.js │ └── CacheFactory.js ├── errors │ └── error_404.ejs ├── Constant.js ├── Common.js ├── Cache.js ├── view-engine │ ├── engine.js │ └── engine │ │ └── ejsEngine.js ├── Record.js ├── dbdriver │ ├── Driver.js │ └── drivers │ │ └── MysqlDriver.js ├── Controller.js ├── Brown.js ├── View.js ├── Router.js ├── DB.js └── Exception.js ├── .babelrc ├── app ├── view │ ├── footer.ejs │ ├── head.ejs │ ├── index.ejs │ └── header.ejs ├── config │ └── config.js ├── model │ └── User.js └── controller │ ├── AdminController.js │ └── IndexController.js ├── index.js ├── package.json ├── test ├── dbTest.js └── npm-debug.log └── README.md /core/cachesystem/caches/MemoryCache.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/cachesystem/caches/RedisCache.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/errors/error_404.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= msg %> 4 | 5 | -------------------------------------------------------------------------------- /core/Constant.js: -------------------------------------------------------------------------------- 1 | var Constant = { 2 | "template-engine": "ejs" 3 | }; 4 | export default Constant; -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "es2015", 4 | "react", 5 | "stage-2" 6 | ], 7 | "plugins": [] 8 | } -------------------------------------------------------------------------------- /app/view/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |

© Copyright 2017 The Awesome People

-------------------------------------------------------------------------------- /core/Common.js: -------------------------------------------------------------------------------- 1 | exports.firstUpperCase = function (str) { 2 | return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase()); 3 | } -------------------------------------------------------------------------------- /core/Cache.js: -------------------------------------------------------------------------------- 1 | import CacheFactory from './cachesystem/CacheFactory.js' 2 | /** 3 | * DB 直接操作类 跟Record配合使用 4 | */ 5 | class Cache{ 6 | } 7 | 8 | export default Cache; -------------------------------------------------------------------------------- /app/config/config.js: -------------------------------------------------------------------------------- 1 | var config = { 2 | 'db':{ 3 | 'driver':'mysql', 4 | 'db_name':'testbrown', 5 | 'host':'127.0.0.1', 6 | 'user':'root', 7 | 'password':'112358', 8 | 'pool':true 9 | } 10 | } 11 | 12 | export default config; -------------------------------------------------------------------------------- /app/model/User.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * User表 4 | */ 5 | class User extends Model{ 6 | constructor(){ 7 | this.tableName = 'user'; //如不修改默认为类名 8 | } 9 | 10 | //验证 11 | verify(req){ 12 | 13 | } 14 | } 15 | 16 | export default User; -------------------------------------------------------------------------------- /app/view/head.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Super Awesome 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * BrownJs 3 | * 4 | * @author SevensChan 5 | * 6 | **/ 7 | import Brown from './core/Brown.js' 8 | 9 | /** 10 | * Server Config 11 | **/ 12 | const HTTP_IP = '127.0.0.1'; 13 | const HTTP_PORT = 8899; 14 | var brown = new Brown(); 15 | brown.listen(HTTP_PORT,HTTP_IP); 16 | brown.set("view engine","ejs"); -------------------------------------------------------------------------------- /core/view-engine/engine.js: -------------------------------------------------------------------------------- 1 | //引擎缓存 2 | let Engines = {}; 3 | 4 | class Engine{ 5 | static createEngine(engineType){ 6 | if (Engines[engineType]){ 7 | return Engines[engineType]; 8 | } 9 | var engineClass = require('./engine/'+engineType+'Engine.js'); 10 | Engines[engineType] = new engineClass['default'](); 11 | return Engines[engineType]; 12 | } 13 | } 14 | 15 | export default Engine; -------------------------------------------------------------------------------- /core/cachesystem/CacheFactory.js: -------------------------------------------------------------------------------- 1 | //缓存 2 | let caches = []; 3 | class CacheFactory{ 4 | static getCache(){ 5 | var cacheType = Brown.getInstance().get('db').driver; 6 | if (caches[cacheType]){ 7 | return caches[cacheType]; 8 | } 9 | var cacheTypeClass = require('./caches/'+firstUpperCase(cacheType)+'Cache.js'); 10 | caches[cacheType] = new cacheTypeClass['default'](); 11 | return caches[cacheType]; 12 | } 13 | } 14 | 15 | export default CacheFactory; -------------------------------------------------------------------------------- /core/Record.js: -------------------------------------------------------------------------------- 1 | class Record{ 2 | 3 | constructor(){ 4 | this.columns = {}; 5 | return this; 6 | } 7 | 8 | set(key,val){ 9 | //方面插入数据库 10 | this.columns[key] = val; 11 | return this; 12 | } 13 | 14 | get(key){ 15 | return this.columns[key]; 16 | } 17 | 18 | foreach(func){ 19 | for(var i in this.columns){ 20 | func(i,this.columns[i]); 21 | } 22 | } 23 | 24 | toString(){ 25 | console.log(this.columns); 26 | } 27 | 28 | } 29 | export default Record; -------------------------------------------------------------------------------- /core/view-engine/engine/ejsEngine.js: -------------------------------------------------------------------------------- 1 | import ejs from 'ejs' 2 | import fs from 'fs' 3 | class ejsEngine{ 4 | //render方法显示模板 5 | render(res,page,data){ 6 | var body = ejs.renderFile(__dirname +'/../../../app/view/'+page,data,function(err,result){ 7 | if (!err){ 8 | res.writeHead(200, { 9 | 'Content-Type': 'text/html' }); 10 | res.end(result); 11 | }else{ 12 | res.end(err.toString()); 13 | console.log(err); 14 | } 15 | }); 16 | } 17 | } 18 | export default ejsEngine; -------------------------------------------------------------------------------- /app/view/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <% include head %> 7 | 8 | 9 | 10 |
11 | <% include header %> 12 |
13 | 14 |
15 |
16 |

<%= title %>

17 |

Welcome to templating using EJS

18 |
19 |
20 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/controller/AdminController.js: -------------------------------------------------------------------------------- 1 | import Controller from '../../core/Controller.js' 2 | import DB from '../../core/DB.js' 3 | import Record from '../../core/Record.js' 4 | class AdminController extends Controller{ 5 | constructor() { 6 | super(); 7 | this.view = super.view(); 8 | } 9 | 10 | async index(){ 11 | console.log('idnex'); 12 | var result = await DB.findById("user",1,['id','name','age']); 13 | this.view.assign('title',result[0].name); 14 | this.view.display('index.ejs'); 15 | } 16 | } 17 | 18 | export default AdminController; -------------------------------------------------------------------------------- /core/dbdriver/Driver.js: -------------------------------------------------------------------------------- 1 | import {firstUpperCase} from '../Common.js' 2 | import Brown from '../Brown.js' 3 | //引擎缓存 4 | let drivers = {}; 5 | 6 | class Driver{ 7 | static getDB(){ 8 | var dbdriver = Brown.getInstance().get('db').driver; 9 | if (typeof drivers[dbdriver] !== "undefined"){ 10 | return drivers[dbdriver]; 11 | } 12 | var dbdriverClass = require('./drivers/'+firstUpperCase(dbdriver)+'Driver.js'); 13 | drivers[dbdriver] = new dbdriverClass['default'](); 14 | return drivers[dbdriver]; 15 | } 16 | } 17 | 18 | export default Driver; -------------------------------------------------------------------------------- /app/view/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/Controller.js: -------------------------------------------------------------------------------- 1 | import View from './View.js' 2 | class Controller{ 3 | constructor() { 4 | this.req = null; 5 | this.res = null; 6 | this.queryUrl = {}; 7 | //设置view 8 | this.view = new View(); 9 | } 10 | 11 | //设置request,response和请求参数 12 | setHttp(req,res,queryUrl){ 13 | this.req = req; 14 | this.res = res; 15 | this.queryUrl = queryUrl; 16 | this.view.setRes(res); 17 | } 18 | 19 | //获取get请求的参数 20 | get(query){ 21 | return this.queryUrl[query]; 22 | } 23 | 24 | //获取post请求的参数 25 | post(query){ 26 | //To Be Continue 27 | } 28 | 29 | //返回当前controller的view对象 30 | view(){ 31 | return this.view; 32 | } 33 | } 34 | 35 | export default Controller; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brownjs", 3 | "version": "0.0.1", 4 | "description": "A cutie web framework base on node.js", 5 | "main": "index.js", 6 | "scripts": { 7 | "babel-node": "babel-node ", 8 | "dev": "nodemon --exec npm run babel-node -- index.js", 9 | "test": "mocha --require babel-core/register ./test/*.js" 10 | }, 11 | "author": "SevensChan", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "babel-cli": "^6.24.1", 15 | "babel-polyfill": "^6.23.0", 16 | "babel-preset-es2015": "^6.24.1", 17 | "babel-preset-react": "^6.24.1", 18 | "babel-preset-stage-2": "^6.24.1", 19 | "chai": "^3.5.0", 20 | "fs": "0.0.1-security", 21 | "mocha": "^3.3.0", 22 | "path": "^0.12.7", 23 | "should": "^11.2.1", 24 | "url": "^0.11.0", 25 | "webpack": "^2.5.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /core/Brown.js: -------------------------------------------------------------------------------- 1 | import http from 'http' 2 | import router from './Router.js'; 3 | import fs from 'fs' 4 | 5 | let instance = null; 6 | 7 | class Brown{ 8 | 9 | constructor(){ 10 | if (!instance){ 11 | instance = this; 12 | } 13 | 14 | //读取配置 15 | var config = require(__dirname+'/../app/config/config.js'); 16 | this.config = config?config['default']:{}; 17 | 18 | return instance; 19 | } 20 | 21 | static getInstance(){ 22 | if (!instance){ 23 | instance = new Brown(); 24 | } 25 | 26 | return instance; 27 | } 28 | 29 | set(key,val){ 30 | this.config[key] = val; 31 | } 32 | 33 | get(key){ 34 | return this.config[key]; 35 | } 36 | 37 | listen(port,ip){ 38 | try{ 39 | var server = http.createServer(function(req,res){ 40 | router.handle(req,res); 41 | }); 42 | server.listen(port,ip); 43 | console.log('Server Start Successfully'); 44 | }catch(err){ 45 | console.log(err); 46 | } 47 | } 48 | } 49 | 50 | export default Brown; -------------------------------------------------------------------------------- /core/View.js: -------------------------------------------------------------------------------- 1 | import Brown from './Brown.js' 2 | import Engine from './view-engine/engine.js'; 3 | /** 4 | * View 处理 5 | * 6 | **/ 7 | class View{ 8 | constructor(){ 9 | this.res = null; 10 | this.engine = Engine.createEngine(Brown.getInstance().get('view engine')); 11 | } 12 | 13 | setRes(res){ 14 | this.res = res; 15 | } 16 | 17 | output(str){ 18 | const body = str.toString(); 19 | this.res.writeHead(200, { 20 | 'Content-Type': 'text/html' }); 21 | this.res.write(body); 22 | this.res.end(); 23 | } 24 | 25 | setHeader(code,data){ 26 | this.res.writeHead(code, data); 27 | } 28 | 29 | json(obj){ 30 | const body = JSON.stringify(obj); 31 | this.res.writeHead(200, { 32 | 'Content-Type': 'text/json' }); 33 | this.res.write(body); 34 | this.res.end(); 35 | } 36 | 37 | display(path){ 38 | this.engine.render(this.res,path,this.data); 39 | } 40 | 41 | assign(key,val){ 42 | if (typeof this.data === "undefined")this.data = {}; 43 | this.data[key] = val; 44 | } 45 | } 46 | 47 | export default View; -------------------------------------------------------------------------------- /app/controller/IndexController.js: -------------------------------------------------------------------------------- 1 | import Controller from '../../core/Controller.js' 2 | import DB from '../../core/DB.js' 3 | import Record from '../../core/Record.js' 4 | class IndexController extends Controller{ 5 | constructor() { 6 | super(); 7 | this.view = super.view(); 8 | } 9 | 10 | async index(){ 11 | // var cl = super.get('cl'); 12 | // super.view().output("Hello World! " + cl); 13 | // var user = new Record().set('name','Sevens').set('age',27); 14 | // user.toString(); 15 | // var result = DB.save("user",user); 16 | // var result = DB.findAll("user",['name','age']); 17 | // super.view().output(result); 18 | 19 | var result = await DB.findById("user",1,['id','name','age']); 20 | this.view.assign('title',result[0].age); 21 | this.view.display('index.ejs'); 22 | } 23 | 24 | show(){ 25 | this.view.assign('title','Hello World'); 26 | this.view.display('index.ejs'); 27 | } 28 | 29 | about(){ 30 | // this.view.assign('title','I am ABOUT'); 31 | // this.view.display('index.ejs'); 32 | var iamjson = { 33 | name: 'sevens', 34 | format: 'json' 35 | } 36 | this.view.json(iamjson); 37 | } 38 | 39 | async save(){ 40 | var name = super.get('name'); 41 | var age = super.get('age'); 42 | var user = new Record().set('name',name).set('age',age); 43 | var insertId = await DB.save("user",user); 44 | this.view.assign('title',insertId); 45 | this.view.display('index.ejs'); 46 | } 47 | } 48 | 49 | export default IndexController; -------------------------------------------------------------------------------- /test/dbTest.js: -------------------------------------------------------------------------------- 1 | var poly = require('babel-polyfill'); 2 | var expect = require('chai').expect; 3 | var should = require('chai').should(); 4 | // var DB = require('../core/DB.js'); 5 | import DB from '../core/DB.js'; 6 | import Record from '../core/Record.js'; 7 | 8 | describe('DB.js Testing', function() { 9 | //findById 10 | it('#findById()', function(done) { 11 | DB.findById("user",1,['id','name','age']).then(function(result){ 12 | expect(result.name).to.be.equal('sevens'); 13 | done(); 14 | }).catch(function(err){ 15 | console.log(err); 16 | }); 17 | }); 18 | 19 | it('#save()', function(done) { 20 | var name = Date.parse(new Date())+""; 21 | var age = 27; 22 | var user = new Record().set('name',name).set('age',age); 23 | DB.save("user",user).then(function(insertId){ 24 | if (typeof insertId !== 'undefined'){ 25 | DB.findById("user",insertId,['id','name','age']).then(function(result){ 26 | expect(result.name).to.be.equal(name); 27 | done(); 28 | }).catch(function(err){ 29 | console.log(err); 30 | }); 31 | } 32 | }).catch(function(err){ 33 | console.log(err); 34 | }); 35 | }); 36 | 37 | it('#deleteById()', function(done) { 38 | var name = Date.parse(new Date()); 39 | var age = 27; 40 | var user = new Record().set('name',name).set('age',age); 41 | DB.save("user",user).then(function(insertId){ 42 | DB.deleteById("user",insertId).then(function(result){ 43 | DB.findById("user",insertId,['id','name','age']).then(function(result){ 44 | should.not.exist(result); 45 | done(); 46 | }).catch(function(err){ 47 | console.log(err); 48 | }); 49 | }).catch(function(err){ 50 | console.log(err); 51 | }); 52 | }).catch(function(err){ 53 | console.log(err); 54 | }); 55 | }) 56 | }); -------------------------------------------------------------------------------- /core/Router.js: -------------------------------------------------------------------------------- 1 | import url from 'url' 2 | import fs from 'fs' 3 | import qs from 'querystring'; 4 | import {firstUpperCase} from './Common.js' 5 | import Exception from './Exception.js' 6 | 7 | //controller缓存 8 | let Controllers = []; 9 | 10 | exports.handle = function(req,res){ 11 | req.requrl = url.parse(req.url,true); 12 | //请求参数 13 | var queryUrl = qs.parse(url.parse(req.url).query); 14 | //请求路径 15 | var path = req.requrl.pathname; 16 | //是否是静态文件 17 | if (/.(css)$/.test(path)){ 18 | res.writeHead(200,{ 19 | 'Content-Type': 'text/css' 20 | }); 21 | fs.readFile(__dirname+path,'utf8',function(err,data){ 22 | if (err) throw err; 23 | //输出静态文件 24 | res.write(data,'utf8'); 25 | res.end(); 26 | }) 27 | }else if (/.(ico)$/.test(path)){ 28 | 29 | }else{ 30 | //读取请求的controller、action 31 | var controller = queryUrl['cl']; 32 | var action = queryUrl['ac']; 33 | 34 | var controllerClass; 35 | var controllerObj; 36 | 37 | //如果没有指定controller、action 默认为index 38 | if (typeof controller === "undefined"){ 39 | controller = 'index'; 40 | } 41 | 42 | if (typeof action === "undefined"){ 43 | action = 'index'; 44 | } 45 | 46 | try{ 47 | //是否有缓存 48 | // console.log("controller:" + controller + " action: " + action); 49 | if (Controllers[firstUpperCase(controller)]){ 50 | controllerObj = Controllers[firstUpperCase(controller)]; 51 | }else{ 52 | //没有缓存读取controller 53 | controllerClass = require('../app/controller/'+firstUpperCase(controller)+'Controller.js'); 54 | controllerObj = new controllerClass['default'](); 55 | Controllers[firstUpperCase(controller)] = controllerObj; 56 | } 57 | //设置request,response和请求参数 58 | controllerObj.setHttp(req,res,queryUrl); 59 | //判断action是否存在 60 | if (!controllerObj[action]){ 61 | // console.log('不存在'); 62 | new Exception(controllerObj.view).show_404(); 63 | return; 64 | } 65 | //执行action方法 66 | controllerObj[action](); 67 | }catch(err){ 68 | console.log(err); 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /core/DB.js: -------------------------------------------------------------------------------- 1 | import driver from './dbdriver/Driver.js' 2 | require("babel-polyfill"); 3 | /** 4 | * DB 直接操作类 跟Record配合使用 5 | */ 6 | class DB{ 7 | /** 8 | * 插入数据 9 | * @param {String} table 表名称 10 | * @param {Record} record 操作记录 11 | * @return {int} 插入状态 12 | */ 13 | static async save(table,record){ 14 | var db = driver.getDB(); 15 | try{ 16 | var result = await db.save(table,record); 17 | }catch(err){ 18 | console.log(err); 19 | } 20 | return new Promise(function(resolve,reject){ 21 | // console.log("DB.js : " + result); 22 | resolve(result); 23 | }); 24 | } 25 | 26 | /** 27 | * 根据ID删除指定记录 28 | * @param {String} table 表名称 29 | * @param {int} id 删除的ID 30 | * @return {int} 删除状态 31 | */ 32 | static async deleteById(table,id,id_name){ 33 | var db = driver.getDB(); 34 | var result = await db.deleteById(table,id,id_name); 35 | return new Promise(function(resolve,reject){ 36 | // console.log(resolve); 37 | resolve(result[0]); 38 | }); 39 | } 40 | 41 | /** 42 | * 根据ID查找记录 43 | * @param {String} table 操作表名称 44 | * @param {int} id 查找的id 45 | * @param {Array|String} fields 查找的列 46 | * @param {String} id_name id的列名,默认为'id' 47 | * @return {Object} 48 | */ 49 | static async findById(table,id,fields,id_name){ 50 | var db = driver.getDB(); 51 | var result = await db.findById(table,id,fields,id_name); 52 | return new Promise(function(resolve,reject){ 53 | resolve(result[0]); 54 | }); 55 | } 56 | 57 | static update(table,id,record){ 58 | 59 | } 60 | 61 | static findByCache(){ 62 | 63 | } 64 | 65 | /** 66 | * Sql 查找 67 | * @param {String} sql 68 | * @return {Array} record集 69 | */ 70 | static find(sql){ 71 | 72 | } 73 | 74 | /** 75 | * 查找表的所有数据 76 | * @param {String} table 表名 77 | * @param {Array} fields 列 78 | * @return {Array} record集 79 | */ 80 | static async findAll(table,fields){ 81 | var db = driver.getDB(); 82 | var result = await db.findAll(sql); 83 | return new Promise(function(resolve,reject){ 84 | resolve(result[0]); 85 | }); 86 | } 87 | } 88 | 89 | export default DB; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Brownjs 2 | Fast, interesting, stable web framework for [node](http://nodejs.org). 3 | 4 | [![NPM Version][npm-image]][npm-url] 5 | [![NPM Downloads][downloads-image]][downloads-url] 6 | [![Linux Build][travis-image]][travis-url] 7 | [![Windows Build][appveyor-image]][appveyor-url] 8 | [![Test Coverage][coveralls-image]][coveralls-url] 9 | 10 | ```js 11 | import Brown from './core/Brown.js' 12 | 13 | const HTTP_IP = '127.0.0.1'; 14 | const HTTP_PORT = 8899; 15 | var brown = new Brown(); 16 | brown.listen(HTTP_PORT,HTTP_IP); 17 | ``` 18 | 19 | ## Introduction 20 | 21 | Are you a PHP big fans and prefer the coding style like Codeigniter framework or ThinkPHP framework? Are you feel confuse while using express or koa? Too free to lost the norm. So this is why we need brownjs. Brownjs studies from Codeigniter and JFinal framework. And make development more comfortable. 22 | 23 | ## Installation 24 | 25 | #####Git or download project. 26 | 27 | ## Features 28 | 29 | * Auto setting routing 30 | * Easy way for processing db data 31 | 32 | 33 | ## Quick Start 34 | 35 | The quickest way to get started with brown is downloading the current project. 36 | 37 | ```bash 38 | $ npm install 39 | ``` 40 | 41 | ## Document 42 | 43 | Working for it. 44 | 45 | ## License 46 | 47 | [MIT](LICENSE) 48 | 49 | [npm-image]: https://img.shields.io/npm/v/brown.svg 50 | [npm-url]: https://npmjs.org/package/brown 51 | [downloads-image]: https://img.shields.io/npm/dm/brown.svg 52 | [downloads-url]: https://npmjs.org/package/brown 53 | [travis-image]: https://img.shields.io/travis/brownjs/brown/master.svg?label=linux 54 | [travis-url]: https://travis-ci.org/brownjs/brown 55 | [appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/brown/master.svg?label=windows 56 | [appveyor-url]: https://ci.appveyor.com/project/dougwilson/brown 57 | [coveralls-image]: https://img.shields.io/coveralls/brownjs/brown/master.svg 58 | [coveralls-url]: https://coveralls.io/r/brownjs/brown?branch=master 59 | [gratipay-image-visionmedia]: https://img.shields.io/gratipay/visionmedia.svg 60 | [gratipay-url-visionmedia]: https://gratipay.com/visionmedia/ 61 | [gratipay-image-dougwilson]: https://img.shields.io/gratipay/dougwilson.svg 62 | [gratipay-url-dougwilson]: https://gratipay.com/dougwilson/ -------------------------------------------------------------------------------- /core/Exception.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Exceptions Class 3 | * 4 | * @package CodeIgniter 5 | * @subpackage Libraries 6 | * @category Exceptions 7 | * @author EllisLab Dev Team 8 | * @link http://codeigniter.com/user_guide/libraries/exceptions.html 9 | */ 10 | class Exception { 11 | /** 12 | * Constructor 13 | */ 14 | constructor(view){ 15 | this.view = view; 16 | } 17 | 18 | // -------------------------------------------------------------------- 19 | 20 | /** 21 | * 404 Page Not Found Handler 22 | * 23 | * @access private 24 | * @param string the page 25 | * @param bool log error yes/no 26 | * @return string 27 | */ 28 | show_404(page = '', log_error = true) 29 | { 30 | var heading = "404 Page Not Found"; 31 | var message = "The page you requested was not found."; 32 | 33 | this.show_error(heading, message, 'error_404', 404); 34 | } 35 | 36 | // -------------------------------------------------------------------- 37 | 38 | /** 39 | * General Error Page 40 | * 41 | * This function takes an error message as input 42 | * (either as a string or an array) and displays 43 | * it using the specified template. 44 | * 45 | * @access private 46 | * @param string the heading 47 | * @param string the message 48 | * @param string the template name 49 | * @param int the status code 50 | * @return string 51 | */ 52 | show_error(heading, message, template = 'error_general', status_code = 500) 53 | { 54 | this.set_status_header(status_code); 55 | 56 | message = '

' + ((! Array.isArray(message)) ? message : message.join(',')) + '

'; 57 | 58 | this.view.assign('msg',message); 59 | this.view.display('../../core/errors/'+template + '.ejs'); 60 | } 61 | 62 | set_status_header(code = 200, text = '') 63 | { 64 | var stati = { 65 | 200 : 'OK', 66 | 201 : 'Created', 67 | 202 : 'Accepted', 68 | 203 : 'Non-Authoritative Information', 69 | 204 : 'No Content', 70 | 205 : 'Reset Content', 71 | 206 : 'Partial Content', 72 | 73 | 300 : 'Multiple Choices', 74 | 301 : 'Moved Permanently', 75 | 302 : 'Found', 76 | 304 : 'Not Modified', 77 | 305 : 'Use Proxy', 78 | 307 : 'Temporary Redirect', 79 | 80 | 400 : 'Bad Request', 81 | 401 : 'Unauthorized', 82 | 403 : 'Forbidden', 83 | 404 : 'Not Found', 84 | 405 : 'Method Not Allowed', 85 | 406 : 'Not Acceptable', 86 | 407 : 'Proxy Authentication Required', 87 | 408 : 'Request Timeout', 88 | 409 : 'Conflict', 89 | 410 : 'Gone', 90 | 411 : 'Length Required', 91 | 412 : 'Precondition Failed', 92 | 413 : 'Request Entity Too Large', 93 | 414 : 'Request-URI Too Long', 94 | 415 : 'Unsupported Media Type', 95 | 416 : 'Requested Range Not Satisfiable', 96 | 417 : 'Expectation Failed', 97 | 98 | 500 : 'Internal Server Error', 99 | 501 : 'Not Implemented', 100 | 502 : 'Bad Gateway', 101 | 503 : 'Service Unavailable', 102 | 504 : 'Gateway Timeout', 103 | 505 : 'HTTP Version Not Supported' 104 | }; 105 | 106 | this.view.setHeader(code, { 107 | 'Content-Type': 'text/plain' }); 108 | } 109 | 110 | } 111 | 112 | export default Exception; 113 | // END Exceptions Class 114 | 115 | /* End of file Exception.php */ -------------------------------------------------------------------------------- /core/dbdriver/drivers/MysqlDriver.js: -------------------------------------------------------------------------------- 1 | import mysql from 'mysql2/promise' 2 | import Brown from '../../Brown.js' 3 | import bluebird from 'bluebird' 4 | 5 | class MysqlDriver{ 6 | constructor(){ 7 | this.config = Brown.getInstance().get('db'); 8 | } 9 | 10 | async connect(){ 11 | try{ 12 | //pool 13 | if (this.config.pool == true){ 14 | this.connection = await mysql.createPool({ 15 | connectionLimit : this.config.connectionLimit?this.config.connectionLimit:10, 16 | host : this.config.host, 17 | user : this.config.user, 18 | password : this.config.password, 19 | database : this.config.db_name, 20 | Promise : bluebird 21 | }); 22 | }else{ 23 | this.connection = await mysql.createConnection({ 24 | host : this.config.host, 25 | user : this.config.user, 26 | password : this.config.password, 27 | database : this.config.db_name, 28 | Promise : bluebird 29 | }); 30 | } 31 | }catch(err){ 32 | console.log(err); 33 | } 34 | } 35 | 36 | async query(sql,callback){ 37 | if (this.connection == null) await this.connect(); 38 | var result = await this.connection.query(sql); 39 | return new Promise(function(resolve,reject){ 40 | resolve(result); 41 | }); 42 | } 43 | 44 | async findById(table,id,fields,id_name){ 45 | if (typeof fields === "undefined"){ 46 | fields = "*"; 47 | } 48 | if (typeof fields === "Array"){ 49 | fields = fields.join(','); 50 | } 51 | if (typeof id_name === "undefined"){ 52 | id_name = 'id'; 53 | } 54 | var sql = "SELECT {fields} FROM {table} WHERE {id_name} = {id}"; 55 | sql = sql.replace(/{id_name}/g,id_name).replace(/{id}/g,id).replace(/{table}/g,table).replace(/{fields}/g,fields); 56 | var result = await this.query(sql); 57 | return new Promise(function(resolve,reject){ 58 | resolve(result[0]); 59 | }); 60 | } 61 | 62 | async findAll(table,fields){ 63 | if (typeof fields === "undefined"){ 64 | fields = "*"; 65 | } 66 | if (typeof fields === "Array"){ 67 | fields = fields.join(','); 68 | } 69 | var sql = "SELECT {fields} FROM {table}"; 70 | sql = sql.replace(/{table}/g,table).replace(/{fields}/g,fields); 71 | var result = await this.query(sql); 72 | return new Promise(function(resolve,reject){ 73 | resolve(result[0]); 74 | }); 75 | } 76 | 77 | async deleteById(table,id,id_name){ 78 | if (typeof fields === "table"){ 79 | throw new Error('Table cannot be null'); 80 | } 81 | if (typeof fields === "id"){ 82 | throw new Error('id cannot be null'); 83 | } 84 | if (typeof id_name === "undefined"){ 85 | id_name = 'id'; 86 | } 87 | var sql = "DELETE FROM {table} WHERE {id_name} = {id}"; 88 | sql = sql.replace(/{id_name}/g,id_name).replace(/{id}/g,id).replace(/{table}/g,table); 89 | var result = await this.query(sql); 90 | return new Promise(function(resolve,reject){ 91 | resolve(result[0]); 92 | }); 93 | } 94 | 95 | async save(table,record){ 96 | var sql = "INSERT INTO {table} ("; 97 | sql = sql.replace(/{table}/g,table); 98 | var result = "("; 99 | record.foreach(function(i,v){ 100 | sql += i + ','; 101 | result += "'"+v+"',"; 102 | }); 103 | result = result.substring(0,result.length-1) + ')'; 104 | sql = sql.substring(0,sql.length-1) + ') VALUES ' + result + ';'; 105 | try{ 106 | var result = await this.query(sql); 107 | }catch(err){ 108 | console.log(err); 109 | } 110 | return new Promise(function(resolve,reject){ 111 | // console.log(result); 112 | resolve(result[0].insertId); 113 | }); 114 | } 115 | } 116 | 117 | export default MysqlDriver; -------------------------------------------------------------------------------- /test/npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe', 3 | 1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', 4 | 1 verbose cli 'run', 5 | 1 verbose cli 'test' ] 6 | 2 info using npm@3.10.3 7 | 3 info using node@v6.5.0 8 | 4 verbose run-script [ 'pretest', 'test', 'posttest' ] 9 | 5 info lifecycle brownjs@0.0.1~pretest: brownjs@0.0.1 10 | 6 silly lifecycle brownjs@0.0.1~pretest: no script for pretest, continuing 11 | 7 info lifecycle brownjs@0.0.1~test: brownjs@0.0.1 12 | 8 verbose lifecycle brownjs@0.0.1~test: unsafe-perm in lifecycle true 13 | 9 verbose lifecycle brownjs@0.0.1~test: PATH: C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin;C:\stevenworks\brownjs\node_modules\.bin;C:\Program Files\nodejs;C:\RailsInstaller\Ruby2.2.0\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft Dynamics AX\50\Client\Bin\;C:\Program Files\Symantec\pcAnywhere\;C:\Program Files\Subversion\bin;C:\Program Files\TortoiseSVN\bin;C:\wamp\bin\php\php5.6.15;C:\Program Files\Heroku\bin;C:\Users\steven\AppData\Local\Android\sdk\platform-tools;C:\ProgramData\chocolatey\bin;C:\Program Files\nodejs\;C:\ProgramData\ComposerSetup\bin;C:\Program Files\Java\jdk1.8.0_91\bin;C:\Program Files\Android\Android Studio\gradle\gradle-2.10\bin;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\bin; C:\Users\steven\AppData\Local\Android\sdk\tools;C:\Users\steven\.gradle\wrapper\dists\gradle-2.13-all\7hsc6vr6mi3i6i5m7q9hj4ci1q\gradle-2.13\bin;C:\Program Files\Java\jdk1.8.0_91/bin;C:\Program Files\GtkSharp\2.12\bin;C:\Python27\Scripts;C:\Users\steven\AppData\Local\Enthought\Canopy\User; C:\Users\steven\AppData\Local\Enthought\Canopy\User\Scripts;C:\Python27;C:\Program Files\Bandizip\7z;C:\Users\steven\AppData\Roaming\npm;C:\Users\steven\AppData\Roaming\Composer\vendor\bin;C:\Program Files\Egret\Egret Wing 3\bin 14 | 10 verbose lifecycle brownjs@0.0.1~test: CWD: C:\stevenworks\brownjs 15 | 11 silly lifecycle brownjs@0.0.1~test: Args: [ '/d /s /c', 'mocha --require babel-core/register' ] 16 | 12 silly lifecycle brownjs@0.0.1~test: Returned: code: 1 signal: null 17 | 13 info lifecycle brownjs@0.0.1~test: Failed to exec test script 18 | 14 verbose stack Error: brownjs@0.0.1 test: `mocha --require babel-core/register` 19 | 14 verbose stack Exit status 1 20 | 14 verbose stack at EventEmitter. (C:\Program Files\nodejs\node_modules\npm\lib\utils\lifecycle.js:242:16) 21 | 14 verbose stack at emitTwo (events.js:106:13) 22 | 14 verbose stack at EventEmitter.emit (events.js:191:7) 23 | 14 verbose stack at ChildProcess. (C:\Program Files\nodejs\node_modules\npm\lib\utils\spawn.js:40:14) 24 | 14 verbose stack at emitTwo (events.js:106:13) 25 | 14 verbose stack at ChildProcess.emit (events.js:191:7) 26 | 14 verbose stack at maybeClose (internal/child_process.js:877:16) 27 | 14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) 28 | 15 verbose pkgid brownjs@0.0.1 29 | 16 verbose cwd C:\stevenworks\brownjs\test 30 | 17 error Windows_NT 6.1.7601 31 | 18 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "test" 32 | 19 error node v6.5.0 33 | 20 error npm v3.10.3 34 | 21 error code ELIFECYCLE 35 | 22 error brownjs@0.0.1 test: `mocha --require babel-core/register` 36 | 22 error Exit status 1 37 | 23 error Failed at the brownjs@0.0.1 test script 'mocha --require babel-core/register'. 38 | 23 error Make sure you have the latest version of node.js and npm installed. 39 | 23 error If you do, this is most likely a problem with the brownjs package, 40 | 23 error not with npm itself. 41 | 23 error Tell the author that this fails on your system: 42 | 23 error mocha --require babel-core/register 43 | 23 error You can get information on how to open an issue for this project with: 44 | 23 error npm bugs brownjs 45 | 23 error Or if that isn't available, you can get their info via: 46 | 23 error npm owner ls brownjs 47 | 23 error There is likely additional logging output above. 48 | 24 verbose exit [ 1, true ] 49 | --------------------------------------------------------------------------------