Node.js |(七)express案例实践:记账本 | 尚硅谷2023版Node.js零基础视频教程

文章目录

  • 📚基本结构搭建
  • 📚响应静态网页
  • 📚获取表单数据
  • 📚借助lowdb保存账单信息
  • 📚完善成功提醒
  • 📚账单列表
  • 📚删除账单
  • 📚final

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手

在这里插入图片描述

Node.js |(六)express框架 | 尚硅谷2023版Node.js零基础视频教程

📚基本结构搭建

  • npm -e mymoney
    在这里插入图片描述

  • npm i安装依赖
    在这里插入图片描述

  • 改一改package.jsonnode改成nodemon
    在这里插入图片描述

  • npm start查看
    在这里插入图片描述

  • 先搭建添加列表展示的两个路由规则。对应app.use('/', indexRouter);,修改index.js

    var express = require('express');
    var router = express.Router();// 记账本的列表
    router.get('/mymoney', function(req, res, next) {res.send('账本列表');
    });//添加记录
    router.get('/mymoney/create', function(req, res, next) {res.send('添加记录');
    });
    module.exports = router;
    

    在这里插入图片描述
    在这里插入图片描述

📚响应静态网页

  • 首先修改index.js(先以记账本列表为例)

    // 记账本的列表
    router.get('/mymoney', function(req, res, next) {res.render('list');
    });
    
  • 其次去views文件夹里创建list.ejs模板(render可以把ejs响应给浏览器)
    在这里插入图片描述

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>我的记账本</title><linkhref="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css"rel="stylesheet"/><style>label {font-weight: normal;}.panel-body .glyphicon-remove{display: none;}.panel-body:hover .glyphicon-remove{display: inline-block}</style></head><body><div class="container"><div class="row"><div class="col-xs-12 col-lg-8 col-lg-offset-2"><h2>记账本</h2><hr /><div class="accounts"><div class="panel panel-danger"><div class="panel-heading">2023-04-05</div><div class="panel-body"><div class="col-xs-6">抽烟只抽煊赫门,一生只爱一个人</div><div class="col-xs-2 text-center"><span class="label label-warning">支出</span></div><div class="col-xs-2 text-right">25 元</div><div class="col-xs-2 text-right"><spanclass="glyphicon glyphicon-remove"aria-hidden="true"></span></div></div></div><div class="panel panel-success"><div class="panel-heading">2023-04-15</div><div class="panel-body"><div class="col-xs-6">3 月份发工资</div><div class="col-xs-2 text-center"><span class="label label-success">收入</span></div><div class="col-xs-2 text-right">4396 元</div><div class="col-xs-2 text-right"><spanclass="glyphicon glyphicon-remove"aria-hidden="true"></span></div></div></div></div></div></div></div></body>
    </html>
    

    在这里插入图片描述

  • 然后针对列表添加,也是先在index.js里修改,并创建create.ejs重点关注

    • 相关的css和js文件都放在public下
      在这里插入图片描述
    • ejs里涉及到的路径都不要加.,也就是说写成href="/css/bootstrap.css",而不是href="./css/bootstrap.css"
    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>添加记录</title><linkhref="/css/bootstrap.css"rel="stylesheet"/><link href="/css/bootstrap-datepicker.css" rel="stylesheet"></head><body><div class="container"><div class="row"><div class="col-xs-12 col-lg-8 col-lg-offset-2"><h2>添加记录</h2><hr /><form><div class="form-group"><label for="item">事项</label><inputtype="text"class="form-control"id="item"/></div><div class="form-group"><label for="time">发生时间</label><inputtype="text"class="form-control"id="time"/></div><div class="form-group"><label for="type">类型</label><select class="form-control" id="type"><option value="">支出</option><option value="">收入</option></select></div><div class="form-group"><label for="account">金额</label><inputtype="text"class="form-control"id="account"/></div><div class="form-group"><label for="remarks">备注</label><textarea class="form-control" id="remarks"></textarea></div><hr><button type="submit" class="btn btn-primary btn-block">添加</button></form></div></div></div><script src="/js/jquery.min.js"></script><script src="/js/bootstrap.min.js"></script><script src="/js/bootstrap-datepicker.min.js"></script><script src="/js/bootstrap-datepicker.zh-CN.min.js"></script><script src="/js/main.js"></script></body>
    </html>
    

    在这里插入图片描述

📚获取表单数据

  • 表单要写传递数据,每个表单项必须有name值,因此这里先补充起名字。例如:
    <div class="form-group"><label for="item">事项</label><inputname="title"type="text"class="form-control"id="item"/>
    </div>
    
  • 新增表单提交路由规则
    //新增记录
    router.post('/mymoney', (req,res) => {console.log(req.body)res.send('添加记录')
    });
    
  • 表单修改结果
    <div class="container"><div class="row"><div class="col-xs-12 col-lg-8 col-lg-offset-2"><h2>添加记录</h2><hr /><form method="post" action="/mymoney"><div class="form-group"><label for="item">事项</label><inputname="title"type="text"class="form-control"id="item"/></div><div class="form-group"><label for="time">发生时间</label><inputname="time"type="text"class="form-control"id="time"/></div><div class="form-group"><label for="type">类型</label><select name="type" class="form-control" id="type"><option value="-1">支出</option><option value="+1">收入</option></select></div><div class="form-group"><label for="account">金额</label><inputname="account"type="text"class="form-control"id="account"/></div><div class="form-group"><label for="remarks">备注</label><textarea name="remarks" class="form-control" id="remarks"></textarea></div><hr><button type="submit" class="btn btn-primary btn-block">添加</button></form></div></div>
    </div>
    
    在这里插入图片描述 在这里插入图片描述
    在这里插入图片描述

📚借助lowdb保存账单信息

  • lowdb是借助JSON用数据库管理(但是之后基本也不咋用到了,简单数据可以用一下)

  • 不安装最新版本,就用1.0.0,npm i lowdb@1.0.0

  • lowdb基本应用

    //导入 lowdb
    const low = require('lowdb')
    const FileSync = require('lowdb/adapters/FileSync')
    const adapter = new FileSync('db.json');//db.json数据存放的地方
    //获取 db 对象
    const db = low(adapter);
    //初始化数据
    db.defaults({ posts: [], user: {} }).write()//写入数据
    db.get('posts').push({id: 2, title: '今天天气还不错~~'}).write();
    db.get('posts').unshift({id: 3, title: '今天天气还不错~~'}).write();//获取单条数据
    let res = db.get('posts').find({id: 1}).value();
    console.log(res);//获取数据
    console.log(db.get('posts').value());//删除数据
    let res = db.get('posts').remove({id: 2}).write();
    console.log(res);//更新数据
    db.get('posts').find({id: 1}).assign({title: '今天下雨啦!!!'}).write()
    

  • 首先新建一个data文件夹,并新建db.json

  • 这里手动初始化一下:

    {"accounts": []
    }
    
  • 在index.js中添加以下代码

    //导入 lowdb
    const low = require('lowdb')
    const FileSync = require('lowdb/adapters/FileSync')
    const adapter = new FileSync(__dirname + '/../data/db.json');
    //获取 db 对象
    const db = low(adapter);
    
  • 设置写入

    //新增记录
    router.post('/mymoney', (req,res) => {db.get('accounts').push(req.body).write();res.send('添加记录')
    });
    

    在这里插入图片描述

  • 给数据加上id,方便后续删除,借助shortidnpm i shortid

    //导入shortid
    const shortid = require('shortid');
    
    //新增记录
    router.post('/mymoney', (req,res) => {// 生成idlet id = shortid.generate();db.get('accounts').push({id:id, ...req.body}).write();res.send('添加记录')
    });
    

    在这里插入图片描述

  • 考虑到查看账单都是先从最近的看起,修改路由

    //新增记录
    router.post('/mymoney', (req,res) => {// 生成idlet id = shortid.generate();db.get('accounts').unshift({id:id, ...req.body}).write();res.send('添加记录')
    });
    

    在这里插入图片描述

📚完善成功提醒

  • 同样的套路,在views里新建success.ejs,在index.js对应路由修改

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>提醒</title><linkhref="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css"rel="stylesheet"/><style>.h-50{height: 50px;}</style>
    </head>
    <body><div class="container"><div class="h-50"></div><div class="alert alert-success" role="alert"><h1>:) 添加成功</h1><p>点击跳转</p></div></div>
    </body>
    </html>
    

    在这里插入图片描述

  • 优化一:让提示不死板

    //新增记录
    router.post('/mymoney', (req,res) => {// 生成idlet id = shortid.generate();db.get('accounts').unshift({id:id, ...req.body}).write();//成功提醒res.render('success', {msg:'添加成功~'})
    });
    
    <div class="container"><div class="h-50"></div><div class="alert alert-success" role="alert"><h1>:) <%= msg %></h1><p>点击跳转</p></div>
    </div>
    
  • 优化二:实现跳转

     res.render('success', {msg:'添加成功~', url:'/mymoney'})
    
    <div class="container"><div class="h-50"></div><div class="alert alert-success" role="alert"><h1>:) <%= msg %></h1><p><a href="<%= url %>">点击跳转</a></p></div>
    </div>
    

📚账单列表

  • 修改路由,获取数据

    // 记账本的列表
    router.get('/mymoney', function(req, res, next) {//获取所有的账单信息let accounts = db.get('accounts').value();res.render('list', {accounts: accounts});
    });
    
  • 进行列表渲染条件渲染(支出or收入)

    <div class="accounts"><% accounts.forEach(item => { %><div class="panel <%= item.type==='-1' ? 'panel-danger' : 'panel-success' %>"><div class="panel-heading"><%= item.time %></div><div class="panel-body"><div class="col-xs-6"><%= item.title %></div><div class="col-xs-2 text-center"><span class="label <%= item.type==='-1' ? 'label-warning' : 'label-success' %>"><%= item.type==='-1' ? '支出' : '收入' %></span></div><div class="col-xs-2 text-right"><%= item.account %>元</div><div class="col-xs-2 text-right"><spanclass="glyphicon glyphicon-remove"aria-hidden="true"></span></div></div></div><% }) %>
    </div>
    

    在这里插入图片描述

📚删除账单

  • 添加对应路由

    //删除记录
    router.get('/mymoney/:id', (req, res) => {//获取id参数let id = req.params.id;//删除db.get('accounts').remove({id:id}).write();//提醒res.render('success', {msg:'删除成功~', url:'/mymoney'})
    })
    
  • 页面叉叉那里的id获取

    <div class="col-xs-2 text-right"><a href="/mymoney/<%= item.id %>"><spanclass="glyphicon glyphicon-remove"aria-hidden="true"></span></a>
    </div>
    

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

  • 删除成功,想用红色
    //新增记录
    router.post('/mymoney', (req,res) => {// 生成idlet id = shortid.generate();db.get('accounts').unshift({id:id, ...req.body}).write();//成功提醒res.render('success', {msg:'添加成功~', url:'/mymoney', flag:'1'})
    });//删除记录
    router.get('/mymoney/:id', (req, res) => {//获取id参数let id = req.params.id;//删除db.get('accounts').remove({id:id}).write();//提醒res.render('success', {msg:'删除成功~', url:'/mymoney', flag:'-1'})
    })
    
    <body><div class="container"><div class="h-50"></div><div class="alert <%= flag==='-1' ? 'alert-danger' : 'alert-success' %>" role="alert"><h1>:) <%= msg %></h1><p><a href="<%= url %>">点击跳转</a></p></div></div>
    </body>
    

📚final

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/137374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL–第4关:查询用户日活数及支付金额

MySQL–第4关&#xff1a;查询用户日活数及支付金额 – WhiteNights Site 标签&#xff1a;MySQL 非常好的题&#xff0c;爱来自中国。 题目 没啥用 任务描述 现有3张业务表&#xff0c;详见如下: 需要输出结果如下&#xff0c;没有支付的日期不需要显示&#xff0c;请写出对…

前端缓存机制——强缓存、弱缓存、启发式缓存

强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存&#xff1a; 浏览器发起请求&#xff0c;查询浏览器的本地缓存&#xff0c;如果找到资源&#xff0c;则直接在浏览器中使用该资源。若是未找到&#xff0c;或者资源已过期&#xff0c;则浏览器缓存返回未…

Python最基础的五个部分代码,零基础也能轻松看懂。

文章目录 前言一、表达式二、赋值语句三、引用四、分支语句五、循环语句关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼…

K8S知识点(七)

&#xff08;1&#xff09;实战入门-Namespace kubernets&#xff1a;系统创建的资源在这个命名空间里 &#xff0c;集群组件资源 kubrnets组件也是以pod的形式运行的 命令行方式操作 查看namespace和详情&#xff1a; 创建和查看和删除&#xff1a; 使用过配置文件操作&am…

leetcode做题笔记226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

查找或替换excel换行符ctrl+j和word中的换行符^p,^l

一、excel中 直接上图。使用ctrlh调出替换&#xff0c;查找内容里按ctrlj&#xff08;会出现一个闪的小点&#xff09;&#xff0c;即为换行符。 二、word中 在word中&#xff0c;^p和^l分别代表换行符&#xff08;enter&#xff09;和手动换行符&#xff08;使用shiftenter&…

Python使用Numba装饰器进行加速

Python使用Numba装饰器进行加速 前言前提条件相关介绍实验环境Numba装饰器进行加速未加速的代码输出结果 numba.jit加速的代码输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、Ope…

效率提升75%!要做矩阵号,更要做好矩阵号管理

在如今的信息数字化时代&#xff0c;面对竞争日趋激烈的市场&#xff0c;数字化转型成为了企业提高效率和竞争力、实现可持续发展的重要手段。 这一两年来&#xff0c;我们也发现&#xff0c;越来越多的品牌企业开始探索数字化转型的实践&#xff0c;通过使用自建或者采买的数据…

node插件MongoDB(四)—— 库mongoose 的个性话读取(字段筛选、数据排序、数据截取)(四)

文章目录 一、字段筛选二、数据排序三、数据截取1. skip 跳过2. limit 限定![在这里插入图片描述](https://img-blog.csdnimg.cn/c7067b1984ee4c6686f8bbe07cae9176.png) 一、字段筛选 字段筛选&#xff1a;只读取指定的数据&#xff0c;比如集合&#xff08;表&#xff09;中有…

uniapp:打包ios配置隐私协议框

使用uniapp打包ios 上架商店需要配置隐私协议政策弹窗。当用户点击确定后才能继续操作。 首先manifest.json中配置使用原生隐私政策提示框是不支持ios的。不用勾选。 解决思路&#xff1a; 1、新建页面&#xff1a;iosLogin.vue&#xff0c;pages.json中 这个页面需要放在第一…

MacOS升级后命令行出现xcrun: error: invalid active developer path报错信息

在Mac上用g编译cpp文件时&#xff0c;出现以下&#xff08;类似于工具环境问题的&#xff09;报错&#xff1a; 解决方案&#xff1a;重新安装最新版的MacOS Command Line Tools xcode-select --install重新尝试编译&#xff1a; 编译成功&#xff08;忽略这个warning&…

GPT最佳实践:五分钟打造你自己的GPT

前几天OpenAI的My GPTs栏目还是灰色的&#xff0c;就在今天已经开放使用了。有幸第一时间体验了一把生成自己的GPT&#xff0c;效果着实惊艳&#xff01;&#xff01;&#xff01;我打造的GPT模型我会放到文章末尾&#xff0c;大家感兴趣也可以自己体验一下。 打造自己的GPT模型…

Linux学习之进程三

目录 进程控制 fork函数 什么是写时拷贝 进程终止 mian函数的返回值 退出码 错误码 exit() 进程等待 1.什么是进程等待&#xff1f; 2.为什么要进行进程等待&#xff1f; 3.如何进程进程等待&#xff1f; wait&#xff0c;waitpid&#xff1a; waitpid 进程替换 …

Kibana Dashboard饼图展示keyword子字符串去重统计

日志内容 log.info("请求开始 uri: {} header RequestId:{}", request.getRequestURI(), reqId, request.getHeader("request_id"));操作步骤 进入Dashboard菜单 点击Create Dashboard按钮 点击Create Panel按钮 选择Aggregation based 然后选择Pie饼图 …

开源论道 源聚一堂@COSCon

自2015年以来&#xff0c;开源高峰论坛一直是中国开源年会中的传统亮点项目。本次在COSCon23 大会期间的高峰圆桌会&#xff0c;于2023年10月29日在成都高新区的菁蓉汇召开。 本次高峰圆桌上&#xff0c;我们特别邀请了20 位来自企业&#xff0c;基金会和社区的专家和领袖参加讨…

京东数据分析:2023年10月京东洗衣机行业品牌销售排行榜

鲸参谋监测的京东平台10月份洗衣机市场销售数据已出炉&#xff01; 10月份&#xff0c;洗衣机市场整体销售呈上升走势。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台洗衣机市场的销量为143万&#xff0c;环比增长约23%&#xff0c;同比增长约1%&#xff1b;销售额约…

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

物联网AI MicroPython学习之语法 ustruct 打包和解压原始数据类型

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; ustruct 介绍 ustruct提供打包和解压原始数据类型的功能。 默认情况下&#xff0c;C类型以机器的本机格式和字节顺序表示&#xff0c;并在必要时通过跳过填充字节来正确对齐&#xff08;根据C编译器使用的规…

STL常用库函数复习

文章目录 pairvectorliststackqueuequeuepriority_queuequeue双端队列 set✨set集合✨multiset 多重集合了解&#xff1a;unordered_set 无序集合 map&#x1f31f;map几乎不用&#xff1a;multimap一般不用&#xff1a;undered_map pair utility示例 #include <iostream&…

【教3妹学编程-算法题】 在树上执行操作以后得到的最大分数

3妹&#xff1a;2哥&#xff0c;今日都立冬了&#xff0c; 可是天气一点都不冷。 2哥 : 立冬了&#xff0c;晚上要不要一起出去吃饺子&#xff1f;&#x1f95f; 3妹&#xff1a;好呀好呀&#xff0c;2哥请吃饺子喽 2哥 : 歪歪&#xff0c;我说的是一起出去吃&#xff0c;没说我…