前言:
對于node能實(shí)現(xiàn)的后臺比較感興趣伦乔,大致看了下node和egg文檔厉亏,了解了下基本的sql語句開始學(xué)習(xí)node了,發(fā)現(xiàn)教程的確比較少烈和,記錄分享一個egg的入門demo爱只。
準(zhǔn)備工作
egg-init
安裝完node,npm斥杜,egg-init虱颗,egg-bin后使用egg-init egg-example --type=simple快速搭建項(xiàng)目,然后配置所需要的package.json的文件蔗喂。頁面渲染使用文檔中的 Nunjucks ,訪問數(shù)據(jù)庫采用 egg-mysql 高帖。
package.json:
在config/config/plugin.js下開啟插件缰儿,config/config.default.js下配置關(guān)聯(lián)和數(shù)據(jù)庫信息。
// config/config/plugin.js
'use strict';
exports.nunjucks = {
enable: true,
package: 'egg-view-nunjucks'
};
exports.mysql = {
enable: true,
package: 'egg-mysql',
};
config/config.default.js
'use strict';
module.exports = appInfo => {
const config = {
// 渲染模板
view:{
defaultViewEngine:'nunjucks',
mapping:{
'.tpl':'nunjucks',
}
},
mysql: {
client: {
// ip地址
host: 'localhost',
// 端口
port: '3306',
// 用戶名
user: 'root',
// 密碼
password: '123456',
// 數(shù)據(jù)庫名
database: 'test',
},
app: true,
agent: false,
}
};
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1521956862800_7591';
// add your config here
config.middleware = [];
return config;
};
創(chuàng)建mysql模擬數(shù)據(jù)表
安裝下載mysql散址,打開mysqlworkbench乖阵,初次打開設(shè)置密碼123456宣赔。
測試預(yù)覽
npm run dev測試查看瞪浸,默認(rèn)127.0.0.1:7001端口儒将。
app下新建view文件夾,新建.tpl文件模擬頁面綁定ajax事件
app/view/index.tpl
<html>
<head>
<title>Egg Demo</title>
<link rel="stylesheet">
</head>
<body class="container">
<input class="form-control" type="text"><br />
<button class="btn btn-success">上傳到數(shù)據(jù)庫</button>
<button class="btn btn-success">刪除</button>
<button class="btn btn-success">查詢對應(yīng)</button>
<button class="btn btn-success">更新對應(yīng)</button>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
$("button:eq(0)").click(function(){
var data= $("input").val();
if(data){
$.ajax({
type:'get',
url:'/add/'+data,
success:function(data){
if(data == 'success'){
alert('上傳成功对蒲!');
}
}
});
}
});
$('button:eq(1)').on('click',function(){
var data= $("input").val();
if(data){
$.ajax({
type:'get',
url:'/del/'+data,
success:function(data){
if(data == 'success'){
alert('刪除成功钩蚊!');
}
}
});
}
})
//reach
$('button:eq(2)').on('click',function(){
var data= $("input").val();
if(data){
$.ajax({
type:'get',
url:'/get/'+data,
success:function(data){
if(data == 'success'){
alert('查詢成功!');
}
}
});
}
})
$('button:eq(3)').on('click',function(){
var data= $("input").val();
if(data){
$.ajax({
type:'get',
url:'/update/'+data,
success:function(data){
if(data == 'success'){
alert('更新成功蹈矮!');
}
}
});
}
})
</script>
</body>
</html>
編寫controller和配置router
controller控制器函數(shù)
//* 同等async yeild同等于函數(shù)中的return
module.exports = app => {
class HomeController extends app.Controller {
* index() {
yield this.ctx.render('index.tpl');
}
// 新增 同理構(gòu)建基于router對應(yīng)的控制器
* add() {
const data = this.ctx.params.data;
const result = yield this.service.mysql.add(data);
this.ctx.body =result;
}
*del() {
const data=this.ctx.params.data;
const result = yield this.service.mysql.del(data);
this.ctx.body = result;
}
// 查詢
*reach() {
const data=this.ctx.params.data;
const result=yield this.service.mysql.reach(data);
this.ctx.body=result;
}
*update() {
const data=this.ctx.params.data;
const result=yield this.service.mysql.update(data);
this.ctx.body=result;
}
}
return HomeController;
};
router路由映射砰逻,其請求接口根據(jù)路徑判斷
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
app.get('/', 'home.index');
app.get('/add/:data','home.add');
app.get('/del/:data','home.del');
app.get('/get/:data','home.reach');
app.get('/update/:data','home.update');
};
app下新建service,中間層處理mysql.js
module.exports=app=>{
// 接受請求的參數(shù),查詢服務(wù)器,返回對應(yīng)信息
return class User extends app.Service{
*add() {}
*del() {}
// ...
}
新增數(shù)據(jù)
this.app.mysql.insert('test',{'name'})
*add() {
const data=this.ctx.params.data;
// 表格名稱test,數(shù)據(jù)庫名稱在config/config.default.js下已定義
const result=yield this.app.mysql.insert('test',{
// 時間優(yōu)化下
'data':new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'') ,
'name':data
});
if(result.serverStatus == 2){
return 'success';
}else{
return "fail";
}
}
刪除數(shù)據(jù)
this.app.mysql.delete('test',{name:data}
const data = this.ctx.params.data;
const result=yield this.app.mysql.delete('test',{
name:data
})
console.log('result.affectedRows '+result.affectedRows)
if(result.affectedRows==1) {
return result
}else{
return false
}
}
查詢數(shù)據(jù)
單條查詢
this.app.mysql.get('test',{ name:'a1'})
條件查詢
this.app.mysql.select('sea_data')
this.app.mysql.select('sea_data',{
where: {v_name:data }, // WHERE 條件
columns: ['v_name','v_pic','v_id'], // 要查詢的表字段
// orders: [], // 排序方式
limit:5,
offset: 0, // 數(shù)據(jù)偏移量
})
*reach() {
const data = this.ctx.params.data;
// get單條查詢,select多條查詢和全部 0這里表示查全部數(shù)據(jù)
const result=data==0?yield this.app.mysql.select('sea_data'):yield this.app.mysql.select('sea_data',{
where: {v_name:data }, // WHERE 條件
columns: ['v_name','v_pic','v_id'], // 要查詢的表字段
// orders: [], // 排序方式
limit:5,
offset: 0, // 數(shù)據(jù)偏移量
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
更新數(shù)據(jù)
this.app.mysql.update('test',{ id:'1', 'name':'ceshi'})
*update() {
const data = this.ctx.params.data;
console.log('更新數(shù)據(jù)'+data)
const result=yield this.app.mysql.update('test',{
id:'1',
'name':'ceshi'
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
service/service.js
module.exports=app=>{
// 接受請求的參數(shù),查詢服務(wù)器,返回對應(yīng)信息
return class User extends app.Service{
*add() {
const data=this.ctx.params.data;
// 表格名稱test,數(shù)據(jù)庫名稱在config/config.default.js下已定義
const result=yield this.app.mysql.insert('test',{
// 時間優(yōu)化下
'data':new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'') ,
'name':data
});
if(result.serverStatus == 2){
return 'success';
}else{
return "fail";
}
}
*del() {
const data = this.ctx.params.data;
const result=yield this.app.mysql.delete('test',{
name:data
})
console.log('result.affectedRows '+result.affectedRows)
if(result.affectedRows==1) {
return result
}else{
return false
}
}
*reach() {
const data = this.ctx.params.data;
// get單條查詢,select多條查詢和全部 0這里表示查全部數(shù)據(jù)
const result=data==0?yield this.app.mysql.select('sea_data'):yield this.app.mysql.select('sea_data',{
where: {v_name:data }, // WHERE 條件
columns: ['v_name','v_pic','v_id'], // 要查詢的表字段
// orders: [], // 排序方式
limit:5,
offset: 0, // 數(shù)據(jù)偏移量
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
*update() {
const data = this.ctx.params.data;
console.log('更新數(shù)據(jù)'+data)
const result=yield this.app.mysql.update('test',{
id:'1',
'name':'ceshi'
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
}
}