nodejs编写todolist代码实现
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
初始化原始数据文件
- 根据自己的数据库修改
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 // 数据库端口号}
- 创建数据库模型,命令:
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
是后期加的,主要用于去掉表中自带的创建时间和更新时间字段
- 数据库创建表
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
- 接口统一处理
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
- 接口调取
import http from '@/api/httpInstance'
function getPageData (data) {return http({method: 'get',url: '/demo/list',params: data})
}
export {getPageData
}
- 代理地址(vue.config.js)
module.exports = {devServer: {proxy: {'/demo': {target: 'http://127.0.0.1:3001',changeOrigin: true,// 因为我们的接口是没有demo字符串的,所以要重写pathRewrite: {'/demo': ''}}}}
}
finally
以上就可以,自己本地起一个后端启一个前端,开始todolist
nodejs编写todolist代码实现相关推荐
- add-apt-repository:找不到命令_手把手教你使用nodejs编写cli(命令行)
手把手教你使用nodejs编写cli(命令行) 前端日常开发中,会遇见各种各样的cli,比如一行命令帮你打包的webpack,一行命令帮你生成vue项目模板的vue-cli,还有创建react项目的c ...
- 手把手教你使用nodejs编写一个【使用远程仓库模板,快速创建项目模块】的cli(命令行)
目录 实现步骤 初始化cli项目 项目目录 创建交互式命令 拉取远程仓库代码,读取仓库中的模板 拉取远程仓库代码 ora 终端 loading 读取仓库中的模板 将选择的模板复制写入目标项目 Comm ...
- 使用nodejs编写自动化脚本,真香!
使用nodejs编写自动化脚本,真香! 说到写脚本,最为人熟知的语言必然是shell,再者python,当然现在也出现了很多界面友好,支持可视化拖动编写脚本的软件,如quiker等.但本文要介绍的是n ...
- 第1课第4.4节_Android硬件访问服务编写HAL代码
android应用如何访问C库 - 落魄影子 - 博客频道 - CSDN.NET http://blog.csdn.net/ab198604/article/details/51249303 And ...
- html5编写网页代码_freeCodeCamp.org的未来-从向世界传授语言到编写代码的5年经验...
html5编写网页代码 freeCodeCamp went live in October 2014. In the five years since, we've done quite a bit. ...
- java培训教程分享:Java编写软件代码自动提示功能
本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...
- 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是
多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...
- 编写优质代码的 6 大关键方法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习实验室 [译者注]作为一名开发者,编写一手干净的 ...
- 如何优雅的编写 JavaScript 代码
几乎每个大一点公司都有一个"运行时间长,维护的工程师换了一批又一批"的项目,如果参与到这样的项目中来,大部分人只有一个感觉--"climb the shit mounta ...
- 你解决的问题比你编写的代码更重要!
软件的目的有时会被遗忘 程序员似乎忘记了软件的真正目的,那就是解决现实问题. 50年前,在1968年,由北约科学委员会主办的软件工程工作会议召开.那时,人们开始注意到软件正在成为社会的基本组成部分.然 ...
最新文章
- DATEIF实例说明3
- Hello World With JBoss Modules
- GDCM:使用Stream Image Writer伪造图像的测试程序
- C++对C的函数扩展
- rsatool使用步骤图解_工作中想要事半功倍?图解来助你
- 如何使用Native Messaging API 打开window程序
- Linux命令Man解释:PPPD(8):点对点daemon协议
- 关于Tokenizer与TokenFilter的区别
- ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
- java转换docx为doc文件_JAVA - 将doc文档转为docx文档
- Windows Server 2003 简体中文企业版
- Haskell语言学习笔记(73)Existentials
- 易语言HTTP读文件
- 守着“伪需求”闭门造车,还谈什么大数据价值变现
- css audio 碟片样式,关于 Audio 自定义样式
- vue项目使用腾讯地图获取定位
- 2019-2020年汽车电子行业深度报告-1
- 【web攻防】破壳漏洞【CVE-2014-6271】与心脏滴血漏洞 【CVE-2014-0160】 docker 复现 学习过程
- 自学编程和计算机科班出身的差别在哪里
- 使用sqlmap检测sql注入漏洞
热门文章
- 告诉你几个手机隐藏的实用功能
- 加begin-end匹配,高亮语言,
- C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量
- 用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(OP),那么模拟实现的队列最大容量是多少?
- 吊灯排行榜前十名有哪些品牌 吊灯哪个牌子质量好性价比高2023
- 液基薄层细胞 宫颈细胞学计算机诊断,液基薄层细胞制片技术与宫颈细胞学诊断.pdf...
- 外媒剖析东南亚移动游戏工业:印尼远景被看好
- [转]看完之后~请沉思10秒
- 如果你在子女不知情的情况下安装监控,会有什么后果呢?
- 行业首个,深度解读深圳超大城市安全标杆项目