小程序连接MySql数据库

前言:我用的是wafer二 node.解决方案
上边连接有遇到布置及搭建流程() ,连接是合法的能够点击

写在头里

关于 Nodejs,相信看那篇的篇章的同伙已经掌握了数不清,有1部分了 Nodejs
基础。但是 Nodejs 如何运用,如何用 Nodejs
搭建在服务器上,笔者想多数同伴想精晓,在此处享用自身的心体面会,希望对您的干活学习抱有协理。
服务器的搭建有为数不少种,举例 Java,PHP,而自己首选Node.js。为何?因为快。Node.js
入门快,比较别的语言更易于进入后台的社会风气;安装快,配置轻便;命令轻易易学。可是对于广大童鞋来讲,学习了
Node.js 的基础知识,却不晓得该怎么样使用 Node.js ,怎么样举行。

此番本身就帮助童鞋快捷入门,尽快选拔起 Node.js,在实战中学习
Node.js,对职业和读书都有更加好的佑助。

一、利用基于 Node.js 的 Express 飞快搭建项目。
2、介绍 Express 项目布局。
三、学习如何连接 MongoDB 数据库,利用 Node.js 操作 MongoDB 数据库。
4、Express 的门类是 .jade 页面,如何改为 .html 页面。
5、学习怎么着修改目录结构,使其能够在真实的种类中运用

壹.利用 Nodejs 快捷搭建项目

首先安装 Express

npm install express-generator -g    

用Express急迅转移项目

express demo
cd demo
npm install

运作项目,检查实验是还是不是搭建成功

npm run start

在浏览器张开http://localhost:3000
,这么些地址是Express连忙搭建项目暗中认可之地址,在bin目录下的www文件里,如图

厂家微信截图_ef9c5153-4d13-463c-94e7-be4170e11f7a.png

连串搭建完成,是否极快。那便是笔者喜爱Node的地点

创建 Zend 项目

要创制 Zend 项目,首先要下载并解压 Zend Framework。

原稿地址

 

二.Express目录结构介绍

  • bin:项目标起步文件,暗中认可www
  • node_modules:存放项目具有的借助库,暗许body-parser、cookie-parser、debug、jade、express、morgan、serve-favicon。
  • public:静态能源文件夹,暗中认可images、javascripts、stylesheets。
  • routes:路由文件
  • views:页面文件,jade模板,默许error.jade、index.jade、layout.jade。自己日常用的html模板,下边将讲下哪些修改
  • package.json:项目正视配置,做过java后台的,能够跟maven相比下,差不离。
  • app.js:应用大旨配置文件,项目入口,程序入口。

enter image description here

安装 Zend Framework

下载最新的 Zend Framework 1.12.20
源码包,(我们使用的是
Zend Framework 1,所以上面包车型地铁剧情都以依靠 Zend 一)

小程序连接MySql数据库。解压到非凡的地方(比方:/home/xxx/bin/).

注: /home/xxx/bin
是自身偏爱的目录,若是您设定了温馨的目录,就应有替换上面发号施令中相应的地方

$ tar -xzvf ZendFramework-1.12.20.tar.gz -C /home/xxx/bin

那般 Zend Framework 就设置在了 /home/xxx/bin/ZendFramework-一.1二.20

注1:Zend Framework
各类版本下载
注2:$ 符号表示目前境况是 Linux 命令行终端,在守候输入1个人命令。

mongoose是一款基于nodejs的优雅数据塑造mongodb模型工具。mongodb是壹款新式的json(键值对)数据类型的多少存款和储蓄格式的数据库。在目前以来,使用nodejs和mongodb是为中型小型型集团以及个人web开垦的绝配。

一、配置mysql 数据库连接参数

997755.com澳门葡京 ,3.连接MongDB数据库

开发终端,运营命令

 npm install mongolass -s

在bin目录下加多文件,mongo_base.js,里面包车型客车代码如下

const Mongolass = require('mongolass');
const mongolass = new Mongolass();

exports.db = { mongolass: mongolass };
const db = exports.db;

let connected = [];
exports.OnConnected = function (fn) {
    if (fn) {
        connected.push(fn);
    }
};

//'mongodb://localhost:27017/testdb'
exports.connectDB = function (conn) {
    return mongolass.connect(conn).then(function () {

        //================USER RELATED==================
        db.test = mongolass.model('test', {
            name:{type:'string'},

        });
        db.test.insert({name:'test'}).exec()

        connected.forEach(function (oneFn) {
            if (oneFn) {
                oneFn();
            }
        });

    });

};

在www文件里增多代码

require('./mongo_base').connectDB('mongodb://localhost:27017/testdb');

我们的MongDB连接成功。 运维电脑的MongDB,然后重启项目。
上面检查是或不是大家中标了。 张开终端,然后运营命令,进入到mongdb。

mongo

然后运营命令,查看是或不是增多上数据库testdb

show dbs

enter image description here

好了,我们的类型MongoDB数据库增添完成。

创办项目

在 Zend 安装目录下的 bin/ 目录下有 zf.sh
脚本文件,你要求在系统path目录下开创该文件的链接,然后就足以在指令行中任哪个地方方使用zf命令创造项目了。

$ sudo ln -s /home/xxx/bin/ZendFramework-1.12.20/bin/zf.sh /usr/local/bin/zf

张开命令行(Ctrl + Alt + T),切换来你想创造项目标岗位,倘令你想在 ~/demo/
目录下开创 Zend 项目:cd ~/demo/

实行上边包车型客车吩咐创造 quickstart 项目:

$ zf create project quickstart

如此就创办了 /home/xxx/demo/quickstart,并且在 quickstart
目录下自行创制了 Zend 项目标一些索引结构。其连串协会如下:

quickstart
|-- application
|   |-- Bootstrap.php
|   |-- configs
|   |   `-- application.ini
|   |-- controllers
|   |   |-- ErrorController.php
|   |   `-- IndexController.php
|   |-- models
|   `-- views
|       |-- helpers
|       `-- scripts
|           |-- error
|           |   `-- error.phtml
|           `-- index
|               `-- index.phtml
|-- library
|-- public
|   |-- .htaccess
|   `-- index.php
`-- tests
    |-- application
    |   `-- bootstrap.php
    |-- library
    |   `-- bootstrap.php
    `-- phpunit.xml

此时,只是创造了 Zend 项目结构,你还索要把 Zend Framework 增多到
quickstart 项目中,有三种艺术,一中是创制2个链接,把 zend 框架下的
library 目录链接到 quickstart/library ,另一种方法是直接复制 zend
框架下的 library 目录替换掉 quickstart/library。

# Symlink
$ cd library
$ ln -s /home/xxx/bin/ZendFramework-1.12.20/library/Zend .

# or copy
$ cd library
$ cp -r /home/xxx/bin/ZendFramework-1.12.20/library/Zend .

诸如此类就能够见到 quickstart/library/Zend 目录了。

一、安装MongoDB

  打开 server下面的config.js

四.Express的门类是.jade页面,怎么样修改为.html的页面。

进入根目录,输入指令

npm install ejs -s

找到根目录下的app.js,参预代码

var ejs = require('ejs');  //引入的ejs插件
app.engine('html', ejs.__express);//设置html引擎
app.set('view engine', 'html');//设置视图引擎

在app.js里,去掉代码

app.set('view engine', 'jade');

重启服务,在view里加多html页面,同时在routes里依旧在app.js里增加调控器,就能够访问html文件了。实例代码如下,在浏览器访问http://localhost:3000/b

enter image description here

项目运行文件

Bootstrap 类定义了 Zend 项目运转时要开首化的能源和零部件。默许地,Zend
Framework 初阶化了 Front Controller,然后它应用 application/controllers/
作为寻觅 action controller 的暗中同意路线。这么些类如下:

// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}

如你所见,那其间未有怎么内容。

1.1 Mac

  user  暗中认可都以 ‘root’

五.什么样修改目录,使其能够在真正的档期的顺序中动用

在那一个体系中大家想以mvc的格局开采。那么什么样修改目录呢,可以达到规定的标准大家的目标。上边注意自个儿说的,新建目录和新建文件,不要弄混。

一.首先新建目录,auth,把地点的建的mongo_base.js放在那几个目录里。然后新建文件index.js,代码如下

let MG = require('./mongo_base.js');

exports.db = MG.db;
exports.connectDB = MG.connectDB;
exports.OnConnected = MG.OnConnected;

2.修改bin目录下www文件里的关于mongo_base.js的引进调用。改后如下

enter image description here

3.在routes下新建八个目录controller,db。

  • controller:正是我们的mvc的c,用于调整大家整整程序,大家的逻辑代码在那边编写。
  • db:正是大家的mvc中的m,用于数据库表的开创。

把index.js、users.js放在controller的目录里。请小心修改app.js代码里有关那三个公文的不二诀窍引入。

4.在db目录下新建文件user.js。用于在数据仓库储存款和储蓄用户。修改后目录如下图。

enter image description here

五.在user.js里编写代码

const db = require('../../auth').db;
exports.OnConnected = require('../../auth').OnConnected;

const onConnect = function () {
    const mongolass = db.mongolass;

    //===============DEVICE RELATED==================

    // socket.io room. Connect it with `http://{server}/{roomId}`
    db.user = mongolass.model('user', {
        nickname:{type:'string'},
    });

};

exports.OnConnected(onConnect);
exports.db = db;

6.退换controller下的index.js,修改后如下

var express = require('express');
var router = express.Router();
const MG = require('../db/user');
let dbTable;
MG.OnConnected(function () {
    dbTable = MG.db.user;
});

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
router.get('/test', function(req, res, next) {
       return dbTable.insert({nickname:'abc'}).exec().then(function () {
           res.send('存储成功');
       })

});

module.exports = router;

7.再次起动项目,在浏览器中输入http://localhost:3000/test
,如下图!

enter image description here

体系布局文件

暗中认可配置文件放在:application/configs/application.ini,包含部分骨干的指令,举例设置php蒙受,设置运转类,设置
action controller 等。文件内容如下:

; application/configs/application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

关于那一个文件有多少个要点:

(1) 使用 ini 配置文件时,你能够一贯引用常量,APPLICATION_PATH
就是二个常量。

(二) 那个文件被分为多少个部分:production,staging,testing 和
development。前边两个包涵了 production
的设置。分裂的条件其配备分开,那样便于开采和调解。

1.1.1 安装

在顶峰根目录下输入

 brew install mongodb

997755.com澳门葡京 1

出现上边情形表达安装成功,安装的目录正是
/usr/local/Cellar/mongodb/3.2.10

  db     为三番五次是数额库名

写在末端

那篇小说每写一步,我都会自身运转,希望观望那篇作品的童鞋能够入门express的实战,并在实战中创制本人的架构。

Action Controller 控制器

应用程序的 action controller 定义了程序流程,把用户请求映射到至极的
model 和 view。

3个 action controller
应包蕴3个或八个以Action最后的点子,这个主意可以通过 web
请求访问到。暗中同意地,Zend Framework USportageLs 遵从 /controller/action
的格局,当中 controller 就映射 action controller
名字(以Controller作为后缀),而 action 就映射到 action
方法(以Action作为后缀)。

平凡,须求3个 IndexController,它意味着网址首页,和一个ErrorController,它表示诸如 HTTP40肆、HTTP500 等不当页面.

初始 IndexController 代码如下:

// application/controllers/IndexController.php

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
    }
}

伊始 ErrorController 代码如下:

// application/controllers/ErrorController.php

class ErrorController extends Zend_Controller_Action
{

    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

        $this->view->exception = $errors->exception;
        $this->view->request   = $errors->request;
    }
}

1.1.2 配置

第一遍运行服务端,这里供给做一些计划专门的工作.

  • 暗中认可mongodb 数据文件是放到根目录 data/db
    文件夹下,借使没有那个文件,请自行创设.

mkdir -p /data/db
  • 若是你目前的遭遇变量还从未投入 mongod ,手动增加的际遇变量中.

nano ~/.bash_profile

//添加mongodb安装目录到环境变量中
export PATH=/usr/local/Cellar/mongodb/3.2.10/bin:${PATH}
//然后覆盖保存
  • 倘诺让景况变量霎时见效? 实践上面包车型地铁shell

source ~/.bash_profile
  • 修改mongodb配置文件,配置文件私下认可在 /usr/local/etc 下的 mongod.conf

由于Mac私下认可不突显隐藏文件,所以平昔找文件夹是找不到的。要动用下边发号施令呈现隐藏文件

defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder//显示

defaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder//隐藏

布局文件修改后

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: data/db
net:
  bindIp: 127.0.0.1

修改dbPath为大家恰好创设的公文夹data/db,假若筹划连接非本地情状的mongodb数据库时,bind_ip
= 0.0.0.0 即可.

  • 给 /data/db 文件夹赋权限

sudo chown `id -u` /data/db
  • 启动mongoDB

mongod

997755.com澳门葡京 2

ok,mongodb 服务端终于运营起来了。

  pass  默感到小程序应用程式ID

Views 视图

Zend Framework 中的 Views 是用通常 PHP 代码写的。View scripts 在
application/views/scripts/
上边,它以调节器名字分文件夹协会起来。本例中,大家有一个 IndexController
和 ErrorController,由此相应地,也应在 View scripts 目录下有 index/ 和
error/ 子目录。在那么些子目录中,又有各样 view scripts 文件,对应
Controller 中的 Action。本例中,使用 index/index.phtml 和
error/error.phtml。

上边是暗中认可的 index/index.phtml view script:

<!-- application/views/scripts/index/index.phtml -->
<style>

    a:link,
    a:visited
    {
        color: #0398CA;
    }

    span#zf-name
    {
        color: #91BE3F;
    }

    div#welcome
    {
        color: #FFFFFF;
        background-image: url(http://framework.zend.comkg_header.jpg);
        width:  600px;
        height: 400px;
        border: 2px solid #444444;
        overflow: hidden;
        text-align: center;
    }

    div#more-information
    {
        background-image: url(http://framework.zend.comkg_body-bottom.gif);
        height: 100%;
    }

</style>
<div id="welcome">
    <h1>Welcome to the Zend Framework!<h1 />
    <h3>This is your project's main page<h3 />
    <div id="more-information">
        <p>
            <img src="http://framework.zend.comPoweredBy_ZF_4LightBG.png" />
        </p>

        <p>
            Helpful Links: <br />
            <a href="http://framework.zend.com/">Zend Framework Website</a> |
            <a href="http://framework.zend.com/manual/en/">Zend Framework
                Manual</a>
        </p>
    </div>
</div>

error/error.phtml 稍微复杂一点,当中使用了php条件语句:

<!-- application/views/scripts/error/error.phtml -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Default Application</title>
</head>
<body>
  <h1>An error occurred</h1>
  <h2><?php echo $this->message ?></h2>

  <?php if ('development' == $this->env): ?>

  <h3>Exception information:</h3>
  <p>
      <b>Message:</b> <?php echo $this->exception->getMessage() ?>
  </p>

  <h3>Stack trace:</h3>
  <pre><?php echo $this->exception->getTraceAsString() ?>
  </pre>

  <h3>Request Parameters:</h3>
  <pre><?php echo var_export($this->request->getParams(), 1) ?>
  </pre>
  <?php endif ?>

</body>
</html>

1.1.3 辅助

安装可视化学工业具Robomongo。

  997755.com澳门葡京 3

创建虚拟主机

对此 quickstart 项目,我们把它位于 apache 服务器上运行。

咱俩供给安装3个虚拟主机,那样就能够在浏览器中输入域名来访问大家的网址了。假如你早已配备好了
php+apache+mysql
运营条件,假使未有,请参考教程

若果大家的门类所映射的域名是:quickstart.local。

进入 apache 配置目录,创设布局文件:

cd /etc/apache2/sites-available/
sudo gedit quickstart.local.conf

下一场复制上边包车型大巴剧情到该配置文件,注意:项目路径需要替换到你和煦的门类路径:

<VirtualHost *:80>
    ServerName quickstart.local

    ServerAdmin webmaster@localhost
    DocumentRoot /home/xxx/demo/quickstart/public

    <Directory /home/xxx/demo/quickstart/public>
    AllowOverride all
    require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

保存该公文,并且启用该配置:sudo a2ensite quickstart.local

然后展开hosts文件:sudo gedit /etc/hosts 增添1行:
127.0.0.1 quickstart.local

终极重启一下 apache 服务器:
sudo service apache2 restart

到此结束,那个连串就创办成功还要可运营了。

1.2 Windows

mongodb和nodejs的模块包不平等,它是行使c++编写的跨平台数据库,能够在官方网址(见参考资料)下载安装,本次安装以window
3二bit为例:

  注意这里有个坑:host开拓条件下要填localhost,不要填分配给您的域名,小编就手贱的修改了此处,结果找了三个钟头才找到难点由来

查实成果

明天就足以访问你的品种网站了,张开浏览器输入http://quickstart.local,就可以见到接待页了。
997755.com澳门葡京 4

1.2.1 下载

下载之后解压该安装包到您想要的目录,重命名字为mongodb,如图:

997755.com澳门葡京 5

 

或是遇见的难题:

  1. 页面不显得:很有望时项目目录的权杖难点,使用
    chmod -R 777 /home/xxx/demo/quickstart 试试看。

1.2.2 新建Data

开辟mongodb文件夹,新建3个data文件夹用于存款和储蓄数据库,当然也能够钦定其余目录。

二、Hello World

创造两个 Layout

您也许注意到,上边的 view scripts 不是欧洲经济共同体的 html
页面,那是明知故问设计的。大家只想让 action 只回去 action
自身要出口的内容,而不是全部应用程序页面。

今天来组合一个完完全全的 HTML 页面。大家运用贰个大局的 layout
来作为网址联合的体制。

注: 下边包车型大巴命令若无表达,暗中认可是在时下项目根目录下推行的。

始于接纳 Zend_Layout,首先让 bootstrap 来加载 Layout
财富。通过下边包车型大巴命令可落成:

$zf enable layout
# Layouts have been enabled, and a default layout created at
# application/layouts/scripts/layout.phtml
# A layout entry has been added to the application config file.

此时,application/configs/application.ini 内容自动更新了:

; application/configs/application.ini

; Add to [production] section:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

以此命令告诉应用程序去 application/layouts/scripts 去寻找 layout。

小编们还要启用 XHTML DocType 注解,为此,在 bootstrap 中加载该能源。在
bootstrap中增加财富的最简易的章程便是创办3个以init初始的措施。此时,大家应用
_initDoctype() 方法来初阶化 doctype:

// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
    }
}

有了那几个主意,还亟需让 view 使用正确的 doctype,不过 view
从哪儿来?最简便的主意正是起首化 View 能源;有了它,就能够把 view
对象放入 bootstrap 并接纳它。

丰富下行到 aplication/configs/application.ini 来创建 view 能源:

; application/configs/application.ini

; Add to [production] section:
resources.view[] =

接下来再来充实一下 _initDoctype() 方法。

// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }
}

下一场,创造全局的 layout:

<!-- application/layouts/scripts/layout.phtml -->
<?php echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Quickstart Application</title>
  <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
</head>
<body>
<div id="header" style="background-color: #EEEEEE; height: 30px;">
    <div id="header-logo" style="float: left">
        <b>ZF Quickstart Application</b>
    </div>
    <div id="header-navigation" style="float: right">
        <a href="<?php echo $this->url(
            array('controller'=>'guestbook'),
            'default',
            true) ?>">Guestbook</a>
    </div>
</div>

<?php echo $this->layout()->content ?>

</body>
</html>

使用headLink()来生成<link>元素。

当今再张开浏览器并查看源代码,应该能来看
XHTML尾部,<head> <title> <body>等部分。

997755.com澳门葡京 6
997755.com澳门葡京 7

1.2.3 新建CMD文件

再打开mongodb\bin文件夹,新建二个cmd文件,内容为:

mongod --dbpath "d:\program files\mongodb\data"//自定义地址,内容为数据库文档存储文件夹。

  先说一下文本结构

创办二个 Model 和 Database Table

今日思考一下guestbook的咬合,它包涵部分记录,每个记录由注释,时间戳,email地址等构成。大家把它存在数据Curry,并有三个唯一id。大家意在能保留、获取具备记录。

所以,一个大约的 guestbook 模型 API 就像是下边那样:

// application/models/Guestbook.php

class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;

    public function __set($name, $value);
    public function __get($name);

    public function setComment($text);
    public function getComment();

    public function setEmail($email);
    public function getEmail();

    public function setCreated($ts);
    public function getCreated();

    public function setId($id);
    public function getId();
}

class Application_Model_GuestbookMapper
{
    public function save(Application_Model_Guestbook $guestbook);
    public function find($id);
    public function fetchAll();
}
}

下边,大家能够起先思量什么设置数据库了。

率先要起首化 Db 财富。使用 zf configure db-adapter 命令:

zf configure db-adapter "adapter=Pdo_MySql&host=localhost&username=root&password=&dbname=guestbook" production

zf configure db-adapter "adapter=Pdo_MySql&host=localhost&username=root&password=&dbname=guestbook-test" testing

zf configure db-adapter "adapter=Pdo_MySql&host=localhost&username=root&password=&dbname=guestbook-dev" development

万1/10功实行,那么在 application/configs/application.ini
中就会见到新扩张的几行安顿:

//application/configs/application.ini

resources.db.adapter = "Pdo_MySql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname ="guestbook" 

注:要把数据库密码设置成你自个儿的。

接下来成立数据库,张开 phpMyadmin,成立数量库
guestbook,输入下边SQL语句并执行:

CREATE TABLE IF NOT EXISTS `guestbook` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `email` varchar(32) NOT NULL DEFAULT 'noemail@test.com',
    `comment` varchar(200) NOT NULL,
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

接下去大家使用 Table Data
Gateway
机制来连接数据源。Zend_Db_Table 提供了这些效果。

第三创制贰个 Zend_Db_Table 类:

$ zf create db-table Guestbook guestbook

查阅项目布局,开采多了3个 application/models/DbTable/
目录,里面有一个 Guestbook.php 文件。其剧情如下:

// application/models/DbTable/Guestbook.php

/**
* This is the DbTable class for the guestbook table.
*/
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    /** Table name */
    protected $_name    = 'guestbook';
}

注意 Application_Model_DbTable 类前缀,它对应
application/models/DbTable 目录。

接下来创制3个 Data
Mapper。Data Mapper
映射对象到数据库。本例中,它将映射 model 到数据源。

$ zf create model GuestbookMapper

接下来展开 application/models/GuestbookMapper.php 并输入以下内容:

// application/models/GuestbookMapper.php

class Application_Model_GuestbookMapper
{
    protected $_dbTable;

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    public function getDbTable()
    {
        if (null === $this->_dbTable) {
            $this->setDbTable('Application_Model_DbTable_Guestbook');
        }
        return $this->_dbTable;
    }

    public function save(Application_Model_Guestbook $guestbook)
    {
        $data = array(
            'email'   => $guestbook->getEmail(),
            'comment' => $guestbook->getComment(),
            'created' => date('Y-m-d H:i:s'),
        );

        if (null === ($id = $guestbook->getId())) {
            unset($data['id']);
            $this->getDbTable()->insert($data);
        } else {
            $this->getDbTable()->update($data, array('id = ?' => $id));
        }
    }

    public function find($id, Application_Model_Guestbook $guestbook)
    {
        $result = $this->getDbTable()->find($id);
        if (0 == count($result)) {
            return;
        }
        $row = $result->current();
        $guestbook->setId($row->id)
                  ->setEmail($row->email)
                  ->setComment($row->comment)
                  ->setCreated($row->created);
    }

    public function fetchAll()
    {
        $resultSet = $this->getDbTable()->fetchAll();
        $entries   = array();
        foreach ($resultSet as $row) {
            $entry = new Application_Model_Guestbook();
            $entry->setId($row->id)
                  ->setEmail($row->email)
                  ->setComment($row->comment)
                  ->setCreated($row->created);
            $entries[] = $entry;
        }
        return $entries;
    }
}

以往,创设 model 类,依旧选择 zf 命令:

$ zf create model Guestbook

开拓刚刚创造的模子类: application/models/Guestbook.php 并增添以下代码:

// application/models/Guestbook.php

class Application_Model_Guestbook
{
    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;

    public function __construct(array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');
        }
        $this->$method($value);
    }

    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');
        }
        return $this->$method();
    }

    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }

    public function setComment($text)
    {
        $this->_comment = (string) $text;
        return $this;
    }

    public function getComment()
    {
        return $this->_comment;
    }

    public function setEmail($email)
    {
        $this->_email = (string) $email;
        return $this;
    }

    public function getEmail()
    {
        return $this->_email;
    }

    public function setCreated($ts)
    {
        $this->_created = $ts;
        return $this;
    }

    public function getCreated()
    {
        return $this->_created;
    }

    public function setId($id)
    {
        $this->_id = (int) $id;
        return $this;
    }

    public function getId()
    {
        return $this->_id;
    }
}

末尾,我们创制1个 guestbook controller 查询并出示数据库中的结果:

$ zf create controller Guestbook

这将创立 application/controllers/GuestbookController.php,它有2个
IndexAction 方法,同时,在 application/views/scripts/guestbook
目录中创设了二个 index.phtml 文件。

开荒 GuestbookController,在 IndexAction 中加多代码,展现全部的
guestbook 记录:

// application/controllers/GuestbookController.php

class GuestbookController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $guestbook = new Application_Model_GuestbookMapper();
        $this->view->entries = $guestbook->fetchAll();
    }
}

打开 application/views/scripts/guestbook/index.phtml 增加以下内容:

<!-- application/views/scripts/guestbook/index.phtml -->

<p><a href="<?php echo $this->url(
    array(
        'controller' => 'guestbook',
        'action'     => 'sign'
    ),
    'default',
    true) ?>">Sign Our Guestbook</a></p>

Guestbook Entries: <br />
<dl>
    <?php foreach ($this->entries as $entry): ?>
    <dt><?php echo $this->escape($entry->email) ?></dt>
    <dd><?php echo $this->escape($entry->comment) ?></dd>
    <?php endforeach ?>
</dl>

切换成浏览器,张开:
,你应有看到这一个剧情:
997755.com澳门葡京 8

意识并未有数量,那就开荒phpMyadmin,插入一些数量再看看,复制上面包车型地铁sql语句到phpmyadmin并执行:

INSERT INTO `guestbook`.`guestbook` (`id`, `email`, `comment`, `created`) VALUES (NULL, 'noemail@qq.com', 'good', CURRENT_TIMESTAMP),
(NULL, 'noemail2@qq.com', 'good book', CURRENT_TIMESTAMP),
(NULL, 'noemail3@qq.com', 'good book ok', CURRENT_TIMESTAMP);

刷新浏览器,结果如图所示,成功地从数据库读取数据并出示在页面上:
997755.com澳门葡京 9

一.2.肆 运维服务

新建达成之后,打开该CMD,保持该CMD窗口为开拓状态,后续就能够连接数据库、操作数据库了。

    server>controllers 文件夹上面放置的都以接口文件

创建 Form

为了让 guestbook 更管用一些,我们须要一个表单来交付新的评价项。

第三,创立一个 form 类:

$ zf create form Guestbook

开采刚创建的 form 类 application/forms/Guestbook.php ,加多下列代码:

// application/forms/Guestbook.php

class Application_Form_Guestbook extends Zend_Form
{
    public function init()
    {
        // Set the method for the display form to POST
        $this->setMethod('post');

        // Add an email element
        $this->addElement('text', 'email', array(
            'label'      => 'Your email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'EmailAddress',
            )
        ));

        // Add the comment element
        $this->addElement('textarea', 'comment', array(
            'label'      => 'Please Comment:',
            'required'   => true,
            'validators' => array(
                array('validator' => 'StringLength', 'options' => array(0, 20))
                )
        ));

        // Add a captcha
        $this->addElement('captcha', 'captcha', array(
            'label'      => 'Please enter the 5 letters displayed below:',
            'required'   => true,
            'captcha'    => array(
                'captcha' => 'Figlet',
                'wordLen' => 5,
                'timeout' => 300
            )
        ));

        // Add the submit button
        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Sign Guestbook',
        ));

        // And finally add some CSRF protection
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));
    }
}

地点代码定义了八个成分:email地址,商议输入框,验证码,提交开关和CS奇骏F爱护字段。

下一步,添加 signAction
GuestbookController,它用来拍卖表单提交页面。使用 zf 命令创造:

$ zf create action sign Guestbook

制造了 signAction 和呼应的 view script.

下一场增添一些代码到
signAction,首先检查是还是不是有POST或GET请求,然后若未有就大致地呈现表单,若有,则印证提交的数据,并保留到数据库中

// application/controllers/GuestbookController.php

class GuestbookController extends Zend_Controller_Action
{
    // snipping indexAction()...

    public function signAction()
    {
        $request = $this->getRequest();
        $form    = new Application_Form_Guestbook();

        if ($this->getRequest()->isPost()) {
            if ($form->isValid($request->getPost())) {
                $comment = new Application_Model_Guestbook($form->getValues());
                $mapper  = new Application_Model_GuestbookMapper();
                $mapper->save($comment);
                return $this->_helper->redirector('index');
            }
        }

        $this->view->form = $form;
    }
}

自然,还索要编写制定一下 view
application/views/scripts/guestbook/sign.phtml

<!-- application/views/scripts/guestbook/sign.phtml -->

Please use the form below to sign our guestbook!

<?php
$this->form->setAction($this->url());
echo $this->form;

二、安装Mongoose

命令行张开项目根目录,试行npm install mongoose --save安装Mongoose

997755.com澳门葡京 10

    server>routes 上面包车型地铁 index.js 为接口路由

反省效率

今后再展开浏览器:
看看,效果如下:
997755.com澳门葡京 11

填写好表单点击提交,就会看出列表已经更新了:
997755.com澳门葡京 12

注:
上边的验证码部分辨认很不方便,其实假使复制一下贴补到txt文书档案中就会看通晓了。

三、使用Mongoose

接下去本身将会以一个todo
list来作为实例,向咱们批注。有个别内容我上篇作品已经提起过,就不多说了,请参见:nodejs之Express入门

 

恭喜你!

你早就打响地选择 Zend Framework 的常用功能创立了一个简短的应用程序。Zend
Framework 内置了诸多零部件,你能够一贯用在您的品种中,那么些零件包涵 web
services,寻找,PDF读取和创设,身份验证等等。能够在
文书档案参考
中找到越多相关的本事细节。

转发请注解来源:
英文原稿链接:

3.1 连接MongoDB

在品种文件夹根目录上,新建db.js,内容:

var mongoose = require("mongoose"); //引入mongoose

var db = mongoose.connection;
db.on('error', function callback() { //监听是否有异常
    console.log("Connection error");
});
db.once('open', function callback() { //监听一次打开
    //在这里创建你的模式和模型
    console.log('connected!');
});

mongoose.connect('mongodb://localhost/todo'); //连接到mongoDB的todo数据库
//该地址格式:mongodb://[username:password@]host:port/database[?options]
//默认port为27017  
module.exports = mongoose;

在app.js最后边引进,

require('./db');

接下来就能够,npm start试跳,是不是连接成功,记住:那时候mongoDB的劳务一定要张开!!连接成功如下图:

997755.com澳门葡京 13

  壹.在controllers 下建构二个demo.js 的文本 输入上面包车型大巴代码

3.二 定义属性、模型、实体

  • Schema(属性)
    :壹种以文件形式累积的数据库模型骨架,不持有数据库的操作本领
  • Model(模型)
    :由Schema宣布生成的模型,具备抽象属性和作为的数据库操作对
  • Entity(实体) :由Model创设的实体,他的操作也会潜移默化数据库

大家要求1个Schema和二个Model来将数据保存在MongoDB数据库中。Schema定义了三个成团粤语档的布局,Model被用来创设将在存款和储蓄在文书档案中的数据Entity。Schema生成Model,Model创建Entity,Model和Entity都可对数据库操作导致影响,但Model比Entity更具操作性。

那正是说接下去我们来定义它们,在db.js中增添上面内容:

var TodoSchema = new mongoose.Schema({
    user_id: String, //定义一个属性user_id,类型为String
    content: String, //定义一个属性content,类型为String
    updated_at: Date //定义一个属性updated_at,类型为Date
});

mongoose.model('Todo', TodoSchema); //将该Schema发布为Model

模型定义好了,以后我们就要起来往数据库增多数据了。

 

叁.三 ejs模板引擎配置

我们用事先文章里的扭转的脚手架,开端搭建。这里大家用到的是ejs模板引擎,所以大家供给布署一下:

1 module.exports = ctx => {
2   ctx.state.data = {
3     msg: 'Hello World'
4   }
5 }

3.3.1 安装esj-mate

命令行输入:npm install ejs-mate --save

 

三.三.二 在app.js中引进模块,加多如下代码:

var engine = require('ejs-mate');
///======= view engine setup  模板 开始===========//
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.engine('ejs', engine);
///======= view engine setup  模板 结束===========//

  如图:

3.3.3 新建views/layout.ejs

<!DOCTYPE html>
<html>
<head>
    <title>
        <%= title %>
    </title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <link rel='stylesheet' href='/stylesheets/screen.css' />
</head>
<body>
    <div id="layout" class="container-fluid">
        <%- body -%>  <!--之后我们的内容就会填充再这个里面 -->
    </div>
    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
</body>
</html>

  997755.com澳门葡京 14

三.肆 新建、保存数据

 

3.4.1 修改views/index.ejs

   <% layout('layout')  -%>  <!-- 用于识别填充到模板中的内容 -->
    <div class="row">
        <div class="col-xs-12 text-center">
            <h1> <%= title %></h1>
        </div>
    </div>

    <div class="row">
        <div class="col-xs-12 text-center">
            <form action="/create" method="post" accept-charset="utf-8">
                <input class="input" type="text" name="content" />
            </form>
        </div>
    </div>

  2、打开 index.js

3.4.2 修改routes/index.js

router.post('/create', function(req, res) {
    console.log('req.body', req.body);
    new TodoModel({ //实例化对象,新建数据
        content: req.body.content,
        updated_at: Date.now()
    }).save(function(err, todo, count) { //保存数据
        console.log('内容', todo, '数量', count); //打印保存的数据
        res.redirect('/'); //返回首页
    });
});

接下来运行服务,npm start,在页面输入框输入任何内容,回车。

997755.com澳门葡京 15

  在module.exports = router 前边参与

三.四.3 难点化解

若出现req.bodyundefined,请检查app.js
是还是不是引进:
var bodyParser = require('body-parser'); //处理请求body的中间件
是或不是安插:

app.use(bodyParser.urlencoded({ extended: false })); //解析 application/x-www-form-urlencoded类型
app.use(bodyParser.json()); //解析 application/json类型

router定义:

app.use('/', routes); //在app中注册routes该接口 
app.use('/users', users); //在app中注册users接口

无法不写在布局的末尾。

1 router.get('/demo',controllers.demo)

三.5 查询、删除数据

 

3.5.1 添加到views/index.ejs

// 显示所有待办事项
<% todos.forEach( function( todo ){ %>
    <div class="row">      
        <div class="col-xs-2 text-center">
            <p>
                <%= todo.updated_at %>
            </p>
        </div>
        <div class="col-xs-6 text-center">
             <p><%= todo.content %></p>
        </div>
        <div class="col-xs-4 text-center">
              <a href="/destroy/<%= todo._id %>" title="Delete this todo item">Delete</a>
        </div>
    </div>
<% }); %>     

  三.革新腾讯云后

3.5.2 修改routes/index.js

router.get('/', function(req, res, next) {
    // 查询数据库获取所有待办事项.
    TodoModel.find(function(err, todos, count) {
        res.render('index', { //渲染页面
            title: 'Todo List',
            todos: todos
        });
    });
});
//需要传入参数id
router.get('/destroy/:id', function(req, res) {
    //根据待办事项的id 来删除它
    TodoModel.findById(req.params.id, function(err, todo) {
        todo.remove(function(err, todo) {
            res.redirect('/');
        });
    });
});

  打开浏览器输入 

三.陆 修改、更新数据

福寿康宁方式是当鼠标点击待办事项时,页面转向edit页面,将待办事项转化为input
text标签。

  997755.com澳门葡京 16

3.6.1 添加router/index.js
//跳转到编辑页面
router.get('/edit/:id', function(req, res) {
    TodoModel.find(function(err, todos, count) {
        res.render('edit', { //重新渲染页面
            title: 'Todo List',
            todos: todos,
            current: req.params.id
        });
    });
});
//根据传入的数据id,更改数据
router.post('/update/:id', function(req, res) {
    TodoModel.findById(req.params.id, function(err, todo) {
        todo.content = req.body.content;
        todo.updated_at = Date.now();
        todo.save(function(err, todo, count) {
            res.redirect('/');
        });
    });
});

  更新后浏览器展现

三.陆.二 增多新页面views/edit.ejs
//省略与index.ejs相同部分;主要修改以下内容
<% todos.forEach( function( todo ){ %>
 <div class="row">  
      <div class="col-xs-2 text-center">
         <p><%= todo.updated_at %></p>
    </div>
    <div class="col-xs-6 text-center">
      <% if( todo._id == current ){ %>
          <form action="/update/<%= todo._id %>" method="post" accept-charset="utf-8">
            <input type="text" name="content" value="<%= todo.content %>" />
          </form>
      <% }else{ %>
            <a href="/edit/<%= todo._id %>" title="Update this todo item"><%= todo.content %></a>
      <% } %>
    </div>
    <div class="col-xs-2 text-center">
          <a href="/edit/<%= todo._id %>" title="Edit this todo item">Edit</a>
    </div>
    <div class="col-xs-2 text-center">
          <a href="/destroy/<%= todo._id %>" title="Delete this todo item">Delete</a>
    </div>
 </div>
<% }); %>     

  997755.com澳门葡京 17

三.陆.三 修改页面 views/index.ejs
 <% todos.forEach( function( todo ){ %>
    <div class="row">
        <div class="col-xs-2 text-center">
            <p>
                <%= todo.updated_at %>
            </p>
        </div>
        <div class="col-xs-6 text-center">
            <p>
                <%= todo.content %>
            </p>
        </div>
        <div class="col-xs-2 text-center">
            <a href="/edit/<%= todo._id %>" title="Edit this todo item">Edit</a>
        </div>
        <div class="col-xs-2 text-center">
            <a href="/destroy/<%= todo._id %>" title="Delete this todo item">Delete</a>
        </div>
    </div>
<% }); %>

到此处Todo list基本作用已经到位了,下边大家再增多2个排序功效。

  三、链接MySql

3.7 排序

让待办事项创新时间顺序实行排序。

  在 demo.js增加如下代码

3.7.1 修改router/index.js
router.get('/', function(req, res, next) {
    // 查询数据库获取所有待办事项.
    TodoModel.
    find().
    sort('uadated_at').
        (function(err, todos, count) {
            res.render('index', { //渲染页面
                title: 'Todo List',
                todos: todos
            });
        });
});

//跳转到编辑页面
router.get('/edit/:id', function(req, res) {
    TodoModel.
    find().
    sort('uadated_at').
        (function(err, todos, count) {
            res.render('edit', { //重新渲染页面
                title: 'Todo List',
                todos: todos,
                current: req.params.id
            });
        });
});

源码已经上传来Github上了,为了美丽使用bootstrap简单的改变了弹指间,其余内容都未有退换。

(end)

1 const { mysql } = require('../qcloud')
2 
3 module.exports = async ctx => {
4   var result = await mysql('user')
5   ctx.state.data = {
6     msg: result
7   }
8 }

  更新腾讯云后访问浏览器就足以获取你想要的数目了

  如图

  997755.com澳门葡京 18

 

  越多多少操作,knex.js 领会一下

 

 

  附上自身的demo.js

 1 // 官网 Demo
 2 // module.exports = ctx => {
 3 //   ctx.state.data = {
 4 //     msg: 'Hello World'
 5 //   }
 6 // }
 7 
 8 const { mysql } = require('../qcloud')
 9 
10 module.exports = async ctx => {
11   var result = await mysql('user')
12   //sql:select * from `user`
13   ctx.state.data = {
14     msg: result
15   }
16 }
17 // =======================================================================================
18 // select 
19 // 显示指定字段:var result = await mysql.select('name', 'id').from('user')
20 // sql:selece 'name', 'id' from `user`;
21 
22 // 条件查询:var result = await mysql.select('id','name','openid' ).from('user').where('id',2)
23 // sql: select 'id','name','openid' form `user` where id=2;
24 
25 // =======================================================================================
26 // update
27 // var result = await mysql('user').update({ name: 'root', openid: 'xubde724xie=395' }).where('id', 2)
28 // sql:update `user` set name='root', openid='xubde724xie=395' where id=2;
29 
30 // =======================================================================================
31 // delete
32 // var result = await mysql('user').del().where('id', 3)
33 // sql:delete from `user` where id=3
34 
35 // =======================================================================================
36 // insect
37 // var result = await mysql.insert({ name: 'cain' }, { openid: 'Ux6892Drfixbx'}).into('user')
38 // var result = await mysql('user').insert({ name: 'cain', openid: 'Ux6892Drfixbx' })
39 // sql: insert into `user` (`name`, `openid`) values (`cain`, `Ux6892Drfixbx`)
40 // 两种均可
41 // 会返回插入条目id序号 注意传入的数据类型与表字段的数据类型不符不会报错

【版权注脚】转发请表明出处:

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website