成果展示

启动mysql,用knex连接数据

接口功能拆分

建表:创建任务列表

查询任务列表

添加任务

删除任务

修改任务内容

把任务设为已完成/恢复任务为未完成

前端展示:vue+bootstrap

All Done:一点想法

成果展示

项目源代码地址见git,在routes下找todolist

启动mysql,用knex连接数据

终端运行

mysql.server start

看到“starting mysql SUCCESS!”,把服务启动起来后,再新开一个终端窗口,用root登录

mysql -u root // 显示welcome to the MySQL monitor

show databases

use example //例子中用到了example这个database

knex是一个npm包,用于node.js下连接mysql。

连接mysql

var knex = require('knex')({

client:'mysql',

connection:{

host:'localhost',

user: 'root',

password: '',

database: 'example'

}

})

接口功能拆分

建表:创建任务列表

function createToDoList() {

return

knex.schema

.hasTable('todolist')

.then( ifExist=> {

if(!ifExist){

return knex.schema.createTable('todolist', (table) =>{

table.increments('task_id').primary()

table.string('task_name').notNullable()

table.integer('task_status').notNullable().defaultTo(0)

table.dateTime('task_start_date')

table.dateTime('task_end_date')

})

}

})

.catch( err => {

console.log('error !!!', err.message, err.stack)

return

})

}

查询任务列表

状态分为0(未完成)和1(已经完成),分别保存在两个数组里。

async function getTasks(){

var toDoTasks = await knex('todolist').select().where('task_status', 0)

var finishedTasks = await knex('todolist').select().where('task_status', 1)

return {toDoTasks, finishedTasks}

}

添加任务

function addTask(content){

return knex('todolist').insert({

task_name: content,

task_start_date: new Date(),

}).then( (task_id) => {

return knex('todolist').select().where('task_id', task_id)

}).then( newtask =>{

return newtask

})

.catch(err => {

throw err

})

}

// 测试一下

//addTask('learn knex api ')

//addTask('finish eg.js').then( (task_id) => {console.log('from addTask', task_id)})

删除任务

function deleteTask(task_id){

return knex('todolist').where('task_id', task_id).del()

.then( deleteRowNum => {

return deleteRowNum

})

.catch(err => {

throw err

})

}

//deleteTask(1)

修改任务内容

function editTask(taskobj){

return knex('todolist').where('task_id', taskobj.task_id)

.update('task_name', taskobj.task_name)

.then( editRowNum => {

return editRowNum

})

.catch(err => {

throw err

})

}

// editTask({

// task_id: 1,

// task_name: 'wanna eat dinner'

// })

把任务设为已完成/恢复任务为未完成

function checkTask(taskobj){

var dateobj = +taskobj.task_status? {} : {task_end_date: new Date()}

var updateobj = Object.assign({}, {task_status :taskobj.task_status? 0 : 1}, dateobj)

return knex('todolist')

.where('task_id', taskobj.task_id)

.update(updateobj)

.then( editRowNum => {

return editRowNum

})

.catch(err => {

throw err

})

}

然后配一下controller,让路由去到正确的操作。我是整体配在/taskapi下面的,再分到每一个具体的api。以getTasks和addTask为例:

const {createToDoList, getTasks, addTask, deleteTask, editTask, checkTask } = require('../models/tasks')

const express = require('express');

const router = express.Router();

router.get('/getTasks', (req, res, next) => {

getTasks().then( tasks => {

res.send(tasks)

}).catch(err => {

throw err

})

})

router.post('/addTask', (req, res) => {

addTask(req.body['task_name'])

.then( newtasks =>{

res.send(newtasks[0])

})

.catch(err => {

throw err

})

})

前端展示:vue+bootstrap

express的view engine 设的是ejs,对应views下的 todolist.ejs 引入vue和bootstrap等文件

- Demo

要使src顺利引入,还需要配一下static的路径。

app.use('/lib', express.static('whereYourNodeModulesFolderAre/orResourcesInOtherPlace')) //

以下是todolist.ejs 的 主体部分,直接写vue 就可以了,就该怎么写怎么写呗~~

to do list

点击要做的事项,即可编辑

  • :task=task

    @remove='toDoTasks.splice(taskIndex, 1)'

    >

finished tasks

  1. {{task.task_name}}

十方魔 2018

发送ajax就跟正常一样就行了

addNewToDo(){

const _task_name = this.newTaskName.trim()

if(!_task_name){

alert('任务不能为空')

return

}

$.post('/taskapi/addTask', {task_name: _task_name}, (newtask) => {

this.toDoTasks.push(newtask)

this.newTaskName = ''

})

}

All Done:一点想法

羞愧地说,这都是一个多月前做的了,不管当时有什么想法,现在都不记得了。

knex mysql 操作_手把手教你用express + mysql + knex 做个 todoList相关推荐

  1. jsp mysql视频_手把手教你做jsp servlet mysql实现的图书管理系统附带视频开发教程和完整源码...

    上一个教程我们做的是对数据库框架底层原理的讲解,然后教大家做了一个自己的数据库框架,这次我们做的这个图书管理系统就是用我们上个教程自己写的数据库框架,整个项目做完框架运行的很稳定,没有出现任何问题.如 ...

  2. mysql中括号_手把手教你看MySQL官方文档

    前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...

  3. flutter如何访问mysql数据库_手把手教你在Flutter项目优雅的使用ORM数据库

    Flutter ORM数据库介绍 Flutter现在开发上最大的槽点可能就是数据库使用了,Flutter现在只提供了sqflite插件,这表明开发者手动写sql代码,建表.建索引.transation ...

  4. docker mysql 操作_[Docker] Docker 快速搭建本地MySQL开发环境

    [Docker] Docker 快速搭建本地MySQL开发环境 关于 Docker 的安装使用本文不再赘述,有兴趣的可以通过官网或是浏览我的专栏文章了解.今天着重给大家介绍下如何利用Docker快速搭 ...

  5. sinaapp mysql连接_手把手教你在新浪云上免费部署自己的网站--连接数据库

    看完之后,默认你知道怎么将代码上传到新浪云SAE,并且能够成功运行,连接数据库之前,你必须先创建有一个应用. 现在我创建一个名称为sampleone的应用,如下图 点击左侧的代码管理,选在右侧创建一个 ...

  6. zblog mysql修改_手把手教修正zblog默认阅读量

    最后提示两点,在修改之前对数据库进行备份,修改当前文件重建,详细的效果须要在你修改以后发表的文章中才干够看到. 良多个人博客的流量较低,导致博客文章的拜访量跟浏览量有限.那么有不措施可以像织梦那样手动 ...

  7. python预测实例教程_手把手教你用Python库Keras做预测(附代码)-阿里云开发者社区...

    当你在Keras中选择好最合适的深度学习模型,就可以用它在新的数据实例上做预测了.但是很多初学者不知道该怎样做好这一点,我经常能看到下面这样的问题: "我应该如何用Keras对我的模型作出预 ...

  8. python量化策略代码_手把手教你用三行python 代码做一个动量策略「量化投资系列」...

    动量策略是右侧交易里最常见的,背后的逻辑是就现在涨的,后市还会涨,动量具有惯性的意思. 首先加载原始数据,我们用天的收盘价即可,按统一转为收益率.因为点位本身不重要,我们最后只关心变化率. 以沪深30 ...

  9. python量化投资代码_手把手教你用三行python 代码做一个动量策略「量化投资系列」...

    动量策略是右侧交易里最常见的,背后的逻辑是就现在涨的,后市还会涨,动量具有惯性的意思. 首先加载原始数据,我们用天的收盘价即可,按统一转为收益率.因为点位本身不重要,我们最后只关心变化率. 以沪深30 ...

最新文章

  1. 利用Nginx实现简易负载均衡
  2. python 离线下载和安装第三方库 .whl wheel 文件
  3. pack unpakc
  4. 蓝桥杯-2的次幂表示(java)
  5. linux 内存越界判断_LINUX 共享内存越界
  6. div旋转 vue_详细解析:uniapp项目|vue组件形式实现的水珠晃动loading纯CSS动效
  7. windows-oracle下载安装,简单的启动使用。
  8. Codeforces Round #719 (Div. 3)/ Codeforces Round #720 (Div. 2)
  9. UVA 10410——Tree Reconstruction
  10. Bootstrap模态框显示时有阴影遮罩层
  11. 深入理解Redis分布式锁
  12. yum配置(源配置-光驱,ftp服务器;基本用法)
  13. 5年了...Capstone 终于升级到4.0!
  14. MMF与WAV格式的铃声制作全过程
  15. 【第37期】游戏策划:简历那点事
  16. 微信免费检测僵尸粉方法,微信免费检测僵尸粉工具
  17. [c51单片机]利用Protues 仿真C51单片机8位数码管
  18. Angel 实现FFM 一、对于Angel 和分布式机器学习的简单了解
  19. MATLAB绘画双纵坐标图改纵坐标颜色都为黑色
  20. 计算机视觉注意力网络(三)——CBAM [ECCV 2018]

热门文章

  1. 秃顶程序员跑马拉松历程
  2. 升级JDK8的坎坷之路
  3. 如何搭建符合企业数字化电商解决方案之理解建议
  4. 常用的人脸检测识别等数据集百度云下载
  5. 8.微信小程序-Mobx数据共享(类似vuex)
  6. c语言社团管理系统实验报告,C语言课程设计大学社团管理系统
  7. 再见,戴威!再见,小黄车!
  8. Android 调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for
  9. python 导入excel 分词_如何对excel表格里的词结巴分词python
  10. 设计模式汇总,对应Android系统源码举例,保你一次看个够