Express应用之记账本项目总结

news2024/11/25 6:54:31

前言

在学完nodejs相关知识后第一个实践就是这个记账本项目,本篇文章是对项目遇到的问题的总结。

先聊聊技术栈:
前端技术:h5结合bootstrap框架;
后端技术:nodejs+Express框架+lowdb数据库。

gitee地址:https://gitee.com/chocolate-roll/cashbook-express.git

直接克隆即可。

准备工作

在做准备工作的时候,首先是创建一个express项目。可以使用express-generator这个工具。

一般用这个指令创建项目:

express -h '文件名‘

如果模板语法用的是ejs,指令是:

express -e ejs '文件名'

具体可以参考我这篇文章:Express框架从入门到如土

数据和数据库

数据库用的是一个本地轻量级的数据库,作为轻量级的本地存储方式,对于构建不依赖服务器的小型项目,用LowDB存储和管理数据是十分理想的选择。

本节不打算对lowdb详细介绍,主要来说一下数据的获取和数据的操控。

前后台交互的理解

这里来说一下我对前后端交互的一个理解吧。客户端通过ajax(或者封装好的ajax)发送请求给服务器,服务器返回请求给客户端。服务器发送的请求是和后端规定好的请求,也就是路由规则。

但是服务器这边实际上是后端在操控,操控前台发送的请求。前端如果发送请求,后台接收到请求后进行处理,根据前台的需求与后台的逻辑进行对应,去执行相关操作。

前台的请求无非就是数据,在我看来后台的逻辑实际上也是为数据服务的,它是数据链接前台的桥梁。后台对数据进行处理后会返回给前台,这样就实现了一次请求。

这里我想说一下自己的想法,在上面这个逻辑里,后台是比较关键的,也是无可替代的,因为里面涉及到了设计,逻辑。但是实际应用中,前台也很重要,但是前台可以是公开的,由ui设计后再编写出来的,所以可替代性很强。

掺杂一句个人的想法(不看也罢),前台方面如果一只做一个技术栈,想吃很久是不可能滴,后面谋求发展要慢慢转后台(全栈),然后再转设计。眼前看,nodejs就是一条不错的路子。

前台对数据的渲染

这里我要说的是,这个记账本项目用的不是前后台分离,所以前台和后台是连接上的,也没有用到ajax。

前台用到的是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>Document</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
        integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
        integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
        crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-7ymO4nGrkm372HoSbq1OY2DP4pEZnMiA+E0F3zPr+JQQtQ82gQ1HPY3QIVtztVua"
        crossorigin="anonymous"></script>
</head>

<body>
    <div class="container">
        <h2>记账本</h2>
        <hr />
        <% accounts.forEach(item=> { %>
            <div class="card">
                <div class="card-header <%= item.type === '-1' ? 'header1' : 'header2' %>">
                    <%= item.time %>
                </div>
                <div class="card-body">
                    <div>
                        <%= item.title %>
                    </div>
                    <div>
                        <% if(item.type==='-1' ) {%>
                            <span class="bage">支出</span>
                            <% } else { %>
                            <span class="bage1">收入</span>
                        <% } %>
                    </div>
                    <div>
                        <%= item.account %>
                    </div>
                    <div><a href="/account/<%= item.id %>" class="x">x</a></div>
                </div>
            </div>
            <% }) %>
    </div>
</body>
<style>
    .container {
        margin: 30px auto;
        width: 60%;
    }

    .container h2 {
        margin-bottom: 50px;
    }

    .card-body {
        display: flex;
    }

    .header1 {
        background-color: rgb(241, 220, 222);
    }
    .header2 {
        background-color: rgb(222, 240, 214);
    }
    .card-body div {
        flex: 1;
        justify-content: space-between;
    }

    .card {
        margin-top: 20px;
    }

    .bage,
    .bage1 {
        display: block;
        width: 30px;
        background-color: rgb(240, 117, 81);
        height: 25px;
        color: rgb(255, 255, 255);
        border-radius: 2px;
        font: 400 13px/25px '微软雅黑';
        text-align: center;
    }

    .bage1 {
        background-color: rgb(108, 178, 106);
    }
    .x {
        margin-left: 300px;
        font-weight: 550;
    }
</style>

</html>

可以看到,前后台没有分离的项目,数据用的是ejs模板语法。(模板语法有很多但是道理都相同),把数据传给这个ejs文件后再渲染上去。

后台对数据的处理

后台如果相对数据处理,要先链接数据库。接着写接口,不同接口对应不同的操作,这里的操作是对数据库的操作(增删改查)。不同数据库语句也有些不一样。

我觉得比较重要的点是id,在这个demo中用到的就是个生成id的方法。

  let id = shortid.generate()

另外对请求报文的相关获取也很重要,可以参考我上面放的那篇博客,里面有详细讲解。

后记

demo的意义在于,浓缩了开发的过程,立刻看到成效。但是demo由于浓缩,展示的也是比较精华的成分,而且不涉及到设计,其实还是比较局限。

真正的掌握,一定是从项目开始。

最后,感谢阅读,欢迎关注!

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

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

相关文章

FinalShell界面左侧为什么能够监测系统指标动态变化的原理并用python实现

前言&#xff1a; 我们可以看出FinalShell是用Java写的&#xff0c;具体怎么看出来的&#xff0c;不能光看界面logo是Java的logo&#xff0c;还要进它的安装目录下进行查看是否真是用Java编写的&#xff01;&#xff01;&#xff01; 具体查看如下&#xff1a; 查看finalshe…

软件外包开发在线监测工具

软件系统上线后需要在线网络工具监测系统的运行&#xff0c;这样在系统出现故障时第一时间通知到系统维护人员&#xff0c;对于软件系统的稳定运行是必不可少的监测工具。今天和大家分享一些常用的在线监测工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#…

Vue.js 中的 TypeScript 支持是什么?如何使用 TypeScript?

Vue.js 中的 TypeScript 支持 Vue.js 是一款流行的前端框架&#xff0c;它提供了一种简单、灵活的方式来构建用户界面。随着 TypeScript 的普及&#xff0c;Vue.js 也开始支持 TypeScript&#xff0c;使得开发者可以使用类型检查等 TypeScript 特性来提高代码质量和可维护性。…

看完这篇卡尔曼滤波原理,我被惊到了!

在网上看了不少与卡尔曼滤波相关的博客、论文&#xff0c;要么是只谈理论、缺乏感性&#xff0c;或者有感性认识&#xff0c;缺乏理论推导。能兼顾二者的少之又少&#xff0c;直到我看到了国外的一篇博文&#xff0c;真的惊艳到我了&#xff0c;不得不佩服作者这种细致入微的精…

Vue-- 锚点实现左右两栏联动--scrollIntoView方法

官网&#xff1a;scrollintoView 通过滚动浏览器窗口或某个容器元素&#xff0c;调用元素就可以出现在视窗中。 利用scrollIntoView() 函数 默认是true document.getElementById(需要滚动的div的id).scrollIntoView() 如果给该方法传入true作为参数&#xff0c;或者不传入任何参…

什么是 Vue.js 中的 computed 属性?

什么是 Vue.js 中的 computed 属性&#xff1f; 在 Vue.js 中&#xff0c;computed 属性是一个非常重要的概念。它提供了一种方便的方式来计算和监听 Vue.js 实例中的属性&#xff0c;从而使得代码更加简洁、易于维护。在本文中&#xff0c;我们将详细介绍 computed 属性的原理…

【SVN】设置ubuntu下SVN服务开机自启

目录 0.背景环境 1.开机自启步骤 0.背景环境 1&#xff09;ubuntu下&#xff0c;已搭建好svn版本库&#xff0c;具体搭建方法参考文末的其他博客链接 2&#xff09;在搭svn服务器的过程中&#xff0c;发现ubuntu重启后&#xff0c;svn服务就关闭了 svn正常开启时见下图 所以…

ps技术的革命创新-photoshop beta版

Photoshop 2023 Beta功能介绍 全新的Generative Fill功能现已加入Photoshop Beta桌面应用程序&#xff0c;可以让用户在非破坏性的基础上轻松地添加、扩展或删除图像内容&#xff0c;实现令人惊喜、高兴和震撼的真实效果&#xff0c;仅需数秒。使用此功能&#xff0c;只需要选…

Java编程中必须掌握的抽象类和接口

抽象类与接口是J--a中两个重要的概念&#xff0c;都用于实现多态性和代码重用。在本文中&#xff0c;将会介绍这两个概念的特点以及如何使用它们来实现继承父类同时实现接口&#xff0c;还有接口的多继承。 老规矩&#xff0c;思维导图我已经整理好放在文末&#xff0c;需要自…

【ARM AMBA AXI 入门 1 - AXI 握手协议】

文章目录 1.1 AXI 双向握手机制简介1.1.1 信号列表1.1.2 双向握手目的1.1.3 握手过程 1.2 数据通路的握手要求1.2.1 读数据通路1.2.2 读地址通路1.2.3 写数据通路1.2.4 写地址通路1.2.5 写回复通路1.2.6 全信号 1.3 不同数据通路间的约束关系1.3.1 读操作约束关系1.3.2 写操作约…

怎么将pdf文件免费转为扫描件

推荐两个工具&#xff0c;也算是给自己记一下 1、手机&#xff1a;扫描全能王APP 太好使了&#xff0c;可以直接拍照并转换为扫描件 不开会员的话会出现水印&#xff0c;因为我都是自己用或者交作业就没开 支持读取相册&#xff0c;一次一张、多张都可以 如果不想要水印也…

Grafana 如何监控容器指标(五)

Grafana 如何监控容器指标(五) 1、添加cadvisor CAdvisor 是用于收集有关我们容器信息的常用工具。它是普罗米修斯和格拉法纳用来抓取信息和可视化图表、图表、时间序列和其他各种形式的信息的代理人。CAdvisor从我们的容器中收集各种指标&#xff0c;这些信息被普罗米修斯刮擦…

SQL了解之复制(二)

&#xff08;续&#xff09;从另一个master初始化slave 前面讨论的假设你是新安装的master和slave&#xff0c;所以&#xff0c;slave与master有相同的数据。但是&#xff0c;大多数情况却不是这样的&#xff0c;例如&#xff0c;你的master可能已经运行很久了&#xf…

Pads和AD画图哪个更好?

Mentor Pads和Altium Designer&#xff08;简称&#xff1a;AD&#xff09;是两种常用的电子设计软件&#xff0c;用于PCB设计&#xff0c;它们拥有各自的优势及适用场景&#xff0c;但如何根据项目来选择工具&#xff1f;下面将比对Pads和AD在不同方面的比较&#xff0c;希望对…

chatgpt赋能python:Python安装包制作入门教程

Python 安装包制作入门教程 Python 作为一门简单易学且适用范围广的编程语言&#xff0c;不仅可以运行在各种操作系统上&#xff0c;还能够通过制作安装包方便地分享给其他人使用。本文将介绍如何使用 Python 的一些工具来制作安装包&#xff0c;以帮助 Python 开发者更加便捷…

VFP下载公众号消息图片,小白入门DAY2

封面张终于放正了。 VFP接收到的消息如下 <xml><ToUserName><![CDATA[gh_63145a34e897]]></ToUserName> <FromUserName><![CDATA[oljsK6OgHA9ftJxuCUWg7cFylj6Y]]></FromUserName> <CreateTime>1685926602</CreateTime>…

设置float后,按钮遇上position: relative点击失效

1 问题&#xff1a;设置button浮动到右边之后&#xff0c;button上的onClick事件无法触发 "点击"按钮点不了 2 原因&#xff1a;button浮动到右边之后&#xff0c;下面的div填补上来&#xff0c;但是下面的div设置了position: relative&#xff0c;结果下面的div直接…

“AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[3]:TCNN+RNN模型、SA-ConvLSTM模型

【机器学习入门与实践】入门必看系列,含数据挖掘项目实战:模型融合、特征优化、特征降维、探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:【机器学习入门与实践】合集入门必看系列,含数据挖掘项目实战:数据融合、特征优化、特征降维、探索性分析等,实战带你掌…

ChatGPT 创业:如何用人工智能 AI 开一家赚钱的公司

这是一篇演示如何使用 ChatGPT prompt &#xff08;提示词&#xff09;的文章。 在了解 ChatGPT 的文案写作能力后&#xff0c;我产生了一个念头&#xff0c;如果让它来写一篇命题作文&#xff0c;会是怎样&#xff1f; Prompt 提示词&#xff0c;和人工智能 AI 对话中一个重要…

产品经理基础能力篇丨认识 ER 模型

最近我在跟其他产品经理交流的时候&#xff0c;总能听到类似这样的话&#xff1a;“其实产品经理的基础能力都差不多&#xff0c;区别主要还是行业经验、对业务的理解能力、规划能力以及项目管理能力等等”&#xff0c;对此我是比较认可的。那么&#xff0c;产品经理的基础能力…