前言:
对于node能实现的后台比较感兴趣,大致看了下node和egg文档,了解了下基本的sql语句开始学习node了,发现教程的确比较少,记录分享一个egg的入门demo。
准备工作
egg-init
安装完node,npm,egg-init,egg-bin后使用egg-init egg-example --type=simple快速搭建项目,然后配置所需要的package.json的文件。页面渲染使用文档中的 Nunjucks ,访问数据库采用 egg-mysql 。
package.json:
在config/config/plugin.js下开启插件,config/config.default.js下配置关联和数据库信息。
// 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',
// 数据库名
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;
};
创建mysql模拟数据表
安装下载mysql,打开mysqlworkbench,初次打开设置密码123456。
新建数据库 新建表注意id自增长,int类型 上传成功
测试预览
npm run dev测试查看,默认127.0.0.1:7001端口。
app下新建view文件夹,新建.tpl文件模拟页面绑定ajax事件
app/view/index.tpl
<html>
<head>
<title>Egg Demo</title>
<link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.css" rel="stylesheet">
</head>
<body class="container">
<input class="form-control" type="text"><br />
<button class="btn btn-success">上传到数据库</button>
<button class="btn btn-success">删除</button>
<button class="btn btn-success">查询对应</button>
<button class="btn btn-success">更新对应</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控制器函数
//* 同等async yeild同等于函数中的return
module.exports = app => {
class HomeController extends app.Controller {
* index() {
yield this.ctx.render('index.tpl');
}
// 新增 同理构建基于router对应的控制器
* 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路由映射,其请求接口根据路径判断
/**
* @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');
};
router对应请求地址的参数名和控制器
app下新建service,中间层处理mysql.js
module.exports=app=>{
// 接受请求的参数,查询服务器,返回对应信息
return class User extends app.Service{
*add() {}
*del() {}
// ...
}
新增数据
this.app.mysql.insert('test',{'name'})
*add() {
const data=this.ctx.params.data;
// 表格名称test,数据库名称在config/config.default.js下已定义
const result=yield this.app.mysql.insert('test',{
// 时间优化下
'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";
}
}
上传a1到测试表
刷新查看
删除数据
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
}
}
查询数据
单条查询
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, // 数据偏移量
})
*reach() {
const data = this.ctx.params.data;
// get单条查询,select多条查询和全部 0这里表示查全部数据
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, // 数据偏移量
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
更新数据
this.app.mysql.update('test',{ id:'1', 'name':'ceshi'})
*update() {
const data = this.ctx.params.data;
console.log('更新数据'+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=>{
// 接受请求的参数,查询服务器,返回对应信息
return class User extends app.Service{
*add() {
const data=this.ctx.params.data;
// 表格名称test,数据库名称在config/config.default.js下已定义
const result=yield this.app.mysql.insert('test',{
// 时间优化下
'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这里表示查全部数据
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, // 数据偏移量
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
*update() {
const data = this.ctx.params.data;
console.log('更新数据'+data)
const result=yield this.app.mysql.update('test',{
id:'1',
'name':'ceshi'
})
if(result) {
return result;
}else{
return {
code:'1001',
data:'false'
}
}
}
}
}
网友评论