1. nodejs端

1.1 初始化项目

npm init -y
按最简单的默认init创建项目,当前命令会只生成一个package.json文件
git init, 新建.gitignore,忽略node_modules文件

1.2 启动server服务

新建src文件夹,src下新建app.js文件,我们的代码会写在这个文件内
下载web框架express:npm i express -S

const express = require('express')
const app = express()app.get('/', (req, res) => {res.json({message: '启动服务'})
})
app.listen(3001, () => {console.log('server启动成功')
})

以上代码会在localhost:3001页面上打印 {"message": "启动服务"},在控制台打印server启动成功,是不是很简单,没错,到这里,其实,服务已经成功启动了。接下来,我们就是要在里面加东西了。

1.3 使用nodemon自动重启

npm i nodemon -D
因为你每次更改文件,直接刷新是不生效的,一定要重启服务才能生效。而nodemon命令可以监听项目中文件内容的变化,自动重启项目,就可以不用每次都手动去停掉,手动去重启。

  • package.json文件中增加启动命令: dev: nodemon ./src/app.js
  • 根路径下新建nodemon.json,更改成只监听src文件夹下的变化,不然会全部监听,没必要
{"watch": ["./src/**/*.*"]
}

1.4 建立数据库连接(sequelize)

这里我们用到了sequelize框架,它最直接的作用就是可以让我们不用写sql语句!

框架解释就不在这里赘述了,这里主要是实现todolist

npm i sequelize -S
npm i sequelize-cli -S
npx sequelize-cli init ,建议新建一个db文件夹,在文件夹中init
初始化之后会生成的文件:

  • config 连接的数据库配置文件
  • migrations 数据库迁移文件
  • models 关联数据库表文件
  • seeders 初始化原始数据文件
  1. 根据自己的数据库修改config/config.json文件

我这边用的是pg数据库(HeidiSQL数据库可视化工具,跟后端童鞋要的安装包),所以要npm i pg pg-hstore

"development": {"username": "postgres", // 数据库账号"password": "123",  // 数据库密码"database": "todo_list", // 数据库名称"host": "127.0.0.1", // 数据库ip"dialect": "postgres", // 数据库类型"timezon": "+08:00",  // 时区"port": 5433      //  数据库端口号}
  1. 创建数据库模型,命令:
    npx sequelize-cli model:generate --name Todo --attributes firstName:string,lastName:string,email:string

npx sequelize-cli 模型:generate --表名称 Todo --属性 字段名:类型,字段名:类型
执行完命令之之后,会在models文件夹下生成一个todo.js文件,migrations文件夹下生成一个数据库迁移文件。timestamps: false是后期加的,主要用于去掉表中自带的创建时间和更新时间字段

  1. 数据库创建表
    npx sequelize-cli db:migrate --env=development
    使用刚才config/config.json文件中配置的development环境创建表,--env=development 可省略,默认使用development。新创建一个数据表,再次执行,不会清空原有数据表中的数据

1.5 需求分析

一个todolist无外乎就是增删改查

  • 通过pageNo,pageSize,status查询表格数据
  • 添加数据:名称,截止日期,具体内容,状态默认为待办
  • 修改数据:名称,截止日期,具体内容,状态
  • 修改状态:状态

1.6 编写接口

1.6.1 查询列表

const express = require('express')
const app = express()
const models = require('../models')app.get('/list', async (req, res, next) => {try {// 1 待办 2 完成 3 删除 -1 全部, get请求所以用query取值let { status, pageNo, pageSize } = req.querylet offset = (pageNo - 1) * pageSize  // 查询偏移量let where = {}  //查询条件if (status != -1) {  // 如果状态-1则查全部,不为-1则带上where.status = status}// models.Todo.findAndCountAll 查询Todo表中所有的数据// 当前操作是个异步操作,用async awaitlet list = await models.Todo.findAndCountAll({where,offset,limit: pageSize})res.json({list,code: 0,message: '查询列表成功'})} catch (error) {next(error) // 有报错抛出}
})

可用postman(安装下载直接用即可)来测试接口是否正常返回数据,当然也可直接地址栏上输入传参,建议还是用postman,毕竟地址栏只能测get请求

1.6.2 添加

const bodyParser = require('body-parser')  //中间件
app.use(express.json()) // 处理json数据
// for parsing application/xwww-form-urlencoded
app.use(express.urlencoded()) // url
// for parsing application/xwww-form-urlencoded
app.use(bodyParser.urlencoded({extend: true}))app.post('/create', async (req, res, next) => {try {// post 请求数据在body中,还需要用到以上引入的express自带的处理方式let { name, deadline, content } = req.bodylet todo = await models.Todo.create({name,deadline,content})res.json({code: 0,todo})} catch (error) {next(error)}
})

利用postman测试增加一条数据

刷新数据库会多一条数据

1.6.3 修改数据


app.post('/update', async (req, res, next) => {try {let { name, deadline, content, status, id } = req.body// 就比添加多了一条,查询特定id的操作,也可将添加和修改写一起let todo = await models.Todo.findOne({where: {id}})if (todo) {await todo.update({name, deadline, content, status, id})res.json({code: 0,todo})} else {res.json({message: '没有找到'})}} catch (error) {next(error)}
})

1.6.4 修改状态

修改状态同修改接口类似,只是修改了状态的字段,不赘述了

2. 前端vue+elementUI

2.1 初始化项目

vue create font
npm i element-ui
main.js中引入element-ui

import ElementUi from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUi)

2.2 路由

路径结构:

新建router文件夹,下新建index.js(路由配置)和router.config.js(路由路径)
router.config.js

export default [{'path': '/','redirect': '/todolist'
}, {'name': 'todolist','path': '/todolist','component': 'todolist/index'
}]

index.js

import Vue from 'vue'
import Router from 'vue-router'
import routes from './router.config'
Vue.use(Router)
const createRoute = (routes) => {return routes.reduce((total, currentRoute) => {total.push(processRouteObj(currentRoute))return total}, [])
}
const processRouteObj = ({name, component, children, keepAlive, ...args }) => {return {meta: { name,keepAlive },// 页面文件都放在page下component: () => import(`@/page/${component}`),children: children ? createRoute(children) : [],...args}
}
const router = new Router({mode: 'history',base: process.env.BASE_URL,  // '/'routes: createRoute(routes) // 路径处理后的集合
})
export default router

在main.js中引入,并使用就可以访问页面了

import router from './router'new Vue({router,render: h => h(App),
}).$mount('#app')

2.3 页面

页面代码就不放了,反正长这样

2.4 调取API

npm i axios -S

  1. 接口统一处理
import axios from 'axios'
const http = axios.create({timeout: 6000,headers: { 'X-Requested-width': 'XMLHttpRequest' },baseURL: process.env.BASE_URL
})
http.interceptors.response.use(res => {if (res.data.code === 0) {return Promise.resolve(res.data)} else {return Promise.reject({message: res.data.message || '后端返回code非0'})}
}, error => {return Promise.reject(error)
})
export default http
  1. 接口调取
import http from '@/api/httpInstance'
function getPageData (data) {return http({method: 'get',url: '/demo/list',params: data})
}
export {getPageData
}
  1. 代理地址(vue.config.js)
module.exports = {devServer: {proxy: {'/demo': {target: 'http://127.0.0.1:3001',changeOrigin: true,// 因为我们的接口是没有demo字符串的,所以要重写pathRewrite: {'/demo': ''}}}}
}

finally

以上就可以,自己本地起一个后端启一个前端,开始todolist

nodejs编写todolist代码实现相关推荐

  1. add-apt-repository:找不到命令_手把手教你使用nodejs编写cli(命令行)

    手把手教你使用nodejs编写cli(命令行) 前端日常开发中,会遇见各种各样的cli,比如一行命令帮你打包的webpack,一行命令帮你生成vue项目模板的vue-cli,还有创建react项目的c ...

  2. 手把手教你使用nodejs编写一个【使用远程仓库模板,快速创建项目模块】的cli(命令行)

    目录 实现步骤 初始化cli项目 项目目录 创建交互式命令 拉取远程仓库代码,读取仓库中的模板 拉取远程仓库代码 ora 终端 loading 读取仓库中的模板 将选择的模板复制写入目标项目 Comm ...

  3. 使用nodejs编写自动化脚本,真香!

    使用nodejs编写自动化脚本,真香! 说到写脚本,最为人熟知的语言必然是shell,再者python,当然现在也出现了很多界面友好,支持可视化拖动编写脚本的软件,如quiker等.但本文要介绍的是n ...

  4. 第1课第4.4节_Android硬件访问服务编写HAL代码

    android应用如何访问C库 - 落魄影子 - 博客频道 - CSDN.NET  http://blog.csdn.net/ab198604/article/details/51249303 And ...

  5. html5编写网页代码_freeCodeCamp.org的未来-从向世界传授语言到编写代码的5年经验...

    html5编写网页代码 freeCodeCamp went live in October 2014. In the five years since, we've done quite a bit. ...

  6. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  7. 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是

    多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...

  8. 编写优质代码的 6 大关键方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习实验室 [译者注]作为一名开发者,编写一手干净的 ...

  9. 如何优雅的编写 JavaScript 代码

    几乎每个大一点公司都有一个"运行时间长,维护的工程师换了一批又一批"的项目,如果参与到这样的项目中来,大部分人只有一个感觉--"climb the shit mounta ...

  10. 你解决的问题比你编写的代码更重要!

    软件的目的有时会被遗忘 程序员似乎忘记了软件的真正目的,那就是解决现实问题. 50年前,在1968年,由北约科学委员会主办的软件工程工作会议召开.那时,人们开始注意到软件正在成为社会的基本组成部分.然 ...

最新文章

  1. DATEIF实例说明3
  2. Hello World With JBoss Modules
  3. GDCM:使用Stream Image Writer伪造图像的测试程序
  4. C++对C的函数扩展
  5. rsatool使用步骤图解_工作中想要事半功倍?图解来助你
  6. 如何使用Native Messaging API 打开window程序
  7. Linux命令Man解释:PPPD(8):点对点daemon协议
  8. 关于Tokenizer与TokenFilter的区别
  9. ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
  10. java转换docx为doc文件_JAVA - 将doc文档转为docx文档
  11. Windows Server 2003 简体中文企业版
  12. Haskell语言学习笔记(73)Existentials
  13. 易语言HTTP读文件
  14. 守着“伪需求”闭门造车,还谈什么大数据价值变现
  15. css audio 碟片样式,关于 Audio 自定义样式
  16. vue项目使用腾讯地图获取定位
  17. 2019-2020年汽车电子行业深度报告-1
  18. 【web攻防】破壳漏洞【CVE-2014-6271】与心脏滴血漏洞 【CVE-2014-0160】 docker 复现 学习过程
  19. 自学编程和计算机科班出身的差别在哪里
  20. 使用sqlmap检测sql注入漏洞

热门文章

  1. 告诉你几个手机隐藏的实用功能
  2. 加begin-end匹配,高亮语言,
  3. C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量
  4. 用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(OP),那么模拟实现的队列最大容量是多少?
  5. 吊灯排行榜前十名有哪些品牌 吊灯哪个牌子质量好性价比高2023
  6. 液基薄层细胞 宫颈细胞学计算机诊断,液基薄层细胞制片技术与宫颈细胞学诊断.pdf...
  7. 外媒剖析东南亚移动游戏工业:印尼远景被看好
  8. [转]看完之后~请沉思10秒
  9. 如果你在子女不知情的情况下安装监控,会有什么后果呢?
  10. 行业首个,深度解读深圳超大城市安全标杆项目