Node写博客--添加博客分类功能(修改和删除)

2023-11-08

1.在layout.html中加入一个【分类管理】

<ul class="nav navbar-nav">
                <li><a href="/admin/user">用户管理</a></li>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">分类管理 <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="/admin/category">分类首页</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="/admin/category/add">添加分类</a></li>
                    </ul>
                </li>
            </ul>

2.在admin.js中添加分类路由

/*
* 分类路由首页
* */
router.get('/category',function (req,res) {
    res.render('admin/category_index',{
        userInfo:req.userInfo
    });
});

3.在admin.js中添加增加分类路由

/*
* 分类的添加
* */
router.get('/category/add',function (req,res) {
    res.render('admin/category_add',{
        userInfo:req.userInfo
    });
});

4.增加category_add.html页面

{%extends 'layout.html' %}
{% block main%}
<ol class="breadcrumb">
    <li><a href="/">管理首页</a></li>
    <li><span>分类添加</span></a></li>
</ol>
<h3>分类添加</h3>

<form role="form" method="post"> <!--以post方式提交,则需要在admin.js中真假一个post路由-->
    <div class="form-group">
        <label for="name">分类名称</label>
        <input type="text" class="form-control" id="name" placeholder="请输入分类名称" name="name">
    </div>
    <button type="submit" class="btn btn-default">提交</button>
</form>

{% endblock %}

5.在admin.js中获得分类的保存

/*
* 分类的保存
* */
router.post('/category/add',function (req,res) {
    
});

6.在获得分类的保存时,需要在models中增加模型

(1)在schemas文件夹中增加categories.js

//连接数据库
var mongoose=require('mongoose');

//分类的表结构
module.exports = new mongoose.Schema({
    //分类名称
    name:String
});

(2)在models文件夹中增加Category.js

var mongoose=require('mongoose');//记载模块
//将刚刚定义好的表结构加载进来
var categoriesSchema = require('../schemas/categories');

module.exports = mongoose.model('Category',categoriesSchema);//创建模型类,将模型暴露出去

(3)在admin.js中引入模型

var Category=require('../models/Category');

//一定要加return ,不然返回会出现js和CSS加载不了的格式错误

/*
* 分类的保存
* */
router.post('/category/add',function (req,res) {
    //最好做一些相关的验证,是否为空,当提交数据不满足要求的时候,出现错误页面
    var name=req.body.name || '';
    if(name==''){
        res.render('admin/error',{
            userInfo:req.userInfo,
            message:'名称不能为空'
        });
        return;
    }
    //数据库中是否已经存在同名分类名称
    Category.findOne({
        name:name
    }).then(function (rs) {
        if(rs){
            //数据库中已经存在该分类了
            res.render('admin/error',{
                userInfo:req.userInfo,
                message:'分类已经存在了'
            });
            return;
        }else{
            //数据库中不存在该分类,可以保存
            return new Category({
                name:name
            }).save();
        }
    }).then(function (newCategory) {
        res.render('admin/success',{
            userInfo:req.userInfo,
            message:'分类保存成功',
            url:'/admin/category'
        });
    });
});

(4)增加error.html页面

{%extends 'layout.html' %}
{% block main%}
<ol class="breadcrumb">
    <li><a href="/">管理首页</a></li>
    <li><span>错误提示</span></li>
</ol>
<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title">错误提示</h3>
    </div>
    <div class="panel-body">{{message}}</div>
    <div class="panel-footer">
        {% if url %}
        <a href="{{url}}">点击这里跳转</a>
        {% else %}
        <a href="javascript:window.history.back()">返回上一步</a>
        {% endif %}
    </div>
</div>
{% endblock %}

(5)增加成功页面success.html

{%extends 'layout.html' %}
{% block main%}
<ol class="breadcrumb">
    <li><a href="/">管理首页</a></li>
    <li><span>成功提示</span></li>
</ol>
<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title">成功提示</h3>
    </div>
    <div class="panel-body">{{message}}</div>
    <div class="panel-footer">
        <a href="{{url}}">点击这里跳转</a>
    </div>
</div>
{% endblock %}

7.为博客增加修改功能,将admin.js中的分类首页,数据条数修改

/*
* 分类首页
* */
router.get('/category',function (req,res) {
    var page = Number(req.query.page || 1);//实际过程中需要判定page是否为数值
    //对page的取值进行一个限制
    var limit =10;
    var pages=0;
    //获取数据库中的数据记录的总条数
    Category.count().then(function (count) {
        //计算总页数
        pages=Math.ceil(count/limit);//向上取整
        //取值不能超过pages
        page=Math.min(page,pages);
        //取值不能小于1
        page=Math.max(page,1);

        var skip = (page-1)*limit;

        Category.find().limit(limit).skip(skip).then(function (categories) {
            res.render('admin/category_index',{
                userInfo:req.userInfo,
                categories:categories,

                count:count,
                page:page,
                pages:pages,
                limit:limit
            })
        });
    });
});

8.修改category_index.html网页

{%extends 'layout.html' %}
{% block main%}
<ol class="breadcrumb">
    <li><a href="/">管理首页</a></li>
    <li><span>分类列表</span></a></li>
</ol>
<h3>分类列表</h3>
<table class="table table-hover table-striped">

    <tr>
        <th>ID</th>
        <th>分类名称</th>
        <th>操作</th>
    </tr>
    {% for category in categories%}
    <tr>
        <td>{{category._id.toString()}}</td>
        <td>{{category.name}}</td>
        <td>
            <a href="/admin/category/edit?id={{category._id.toString()}}">修改</a> |
            <a href="/admin/category/delete?id={{category._id.toString()}}">删除</a>
        </td>
    </tr>
    {% endfor %}
</table>

<!--把另外一个页面通过引用的形式,包含子集的方式包含进来-->
{%include 'page.html'%}

{% endblock %}

9.在admin.js中增加【修改】和【删除】两个功能

(1)分类的修改,在admin.js中增加,分类修改页面

/*
* 分类修改
* */
router.get('/category/edit',function (req,res) {
    //获取要修改的分类信息,并且用表单的形式展现出来
    var id=req.query.id || '';
    //获取要修改的分类信息
    Category.findOne({
         _id:id //一定要写全
    }).then(function (category) {
        if(!category){
            res.render('admin/error',{
                userInfo:req.userInfo,
                message:'分类信息不存在'
            });
        }else{
            res.render('admin/category_edit',{
                userInfo:req.userInfo,
                category:category
            });
        }
    });
});

(2)分类修改增加以后,再对分类的修改进行保存

/*
* 分类修改的保存
* */
router.post('/category/edit',function (req,res) {
    //获取要修改的分类信息,并且用表单的形式展现出来
    var id=req.query.id || '';
    //获取post提交过来的名称
    var name=req.body.name||'';
    //获取要修改的分类信息
    Category.findOne({
        _id:id //一定要写全
    }).then(function (category) {
        if(!category){
            res.render('admin/error',{
                userInfo:req.userInfo,
                message:'分类信息不存在'
            });
            return Promise.reject();
        }else{
            //当用户没有做任何修改提交的时候
            if(name==category.name){
                res.render('admin/success',{
                    userInfo:req.userInfo,
                    message:'修改成功',
                    url:'/admin/category'
                });
                return Promise.reject();//阻止默认行为
            }else{
                //要修改的分类名称是否已经在数据库中存在
                return Category.findOne({
                    _id:{$ne:id},
                    name:name
                });
            }

        }
    }).then(function (sameCategory) {
        if(sameCategory){
            res.render('admin/error',{
                userInfo:req.userInfo,
                message:'数据库中已经存在同名分类'
            });
            return Promise.reject();
        }else{
           return Category.update({
                _id:id
            },{
                name:name
            });
        }
    }).then(function () {
        res.render('admin/success',{
            userInfo:req.userInfo,
            message:'修改成功',
            url:'/admin/category'
        });
    });
});

(3)增加分类的删除

/*
* 分类删除
* */
router.get('/category/delete',function (req,res) {
    //获取要删除的分类的id
    var id=req.query.id||'';
    Category.remove({
        _id:id
    }).then(function () {
        res.render('admin/success',{
            userInfo:req.userInfo,
            message:'删除成功',
            url:'/admin/category'
        })
    })
});

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node写博客--添加博客分类功能(修改和删除) 的相关文章

  • 基于stm32单片机汽车胎压温度检测Proteus仿真程序

    采用stm32单片机作为主控CPU 采用BMP180传感器来测量气压和温度 采用LCD1602显示气压和温度 并且通过串口打印框也可以显示当前的气压和温度 完美的模拟出汽车胎压和温度检测相关功能 程序采用keil5编写 并且有中文注释 新手
  • [XAMPP的安装及使用教程] BUG解决

    说明 XAMPP的安装及使用教程 https blog csdn net qq 36595013 article details 80373597 转载 本文是针对原博客连接如上 安装过程中出现的bug进行解决 BUG1 前提 mysql端
  • 基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

    摘要 基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标 利用深度学习算法可实现图片 视频 摄像头等方式的课堂人脸目标检测识别 另外支持结果可视化与图片或视频检测结果的导出 本系统采用YOLOv5目标检测模型
  • 1084. 销售分析III(SQL)

    题目 https leetcode cn com problems sales analysis iii Table Product Column Name Type product id int product name varchar
  • demo演示是什么意思_路演(融资演示)时要注意些什么?

    路演 融资演示 究竟重不重要 如果你的企业足够优秀 那可能路演对你来说就没那么重要 甚至都不需要路演 可能就有很多投资人抢着来投你 但能达到这个水平的毕竟是少数 更多的是默默无闻的创业者 如果你的企业还没有那么优秀 或者你的产品还不够成熟
  • Python_捕获未知错误代码

    try num int input 请输入一个整数 result 8 num print result except Exception as result print 未知错误 s result
  • VScode编译调试C++环境

    首先去官网下载vscodehttps code visualstudio com 为了编译C C 要使用gcc Windows本身不支持gcc 所以有了MinGW 我用的是dev带的MinGW 也可以自己安装MinGW 或者用VS的编译器
  • VTM7.0配置并运行(windows系统)

    文章目录 一 下载安装VTM 下载方式一 下载方式二 1 解压VTM软件压缩包 2 在解压好的目录里新建 build 文件夹 二 下载安装Cmake 1 下载Cmake并解压 2 配置Cmake环境变量 三 编译 方法一 界面 1 打开 c
  • Netty案例(二)之耗时任务的处理

    文章目录 netty版本 Netty耗时任务的处理 代码案例 Handler 自定义业务线程池 Context中添加线程池 netty版本 使用的netty版本是io netty netty all 4 1 33 Final Netty耗时
  • 全网最好的免费开源ERP:Odoo库存路线规则设置应用详解

    引言 在库存管理中 供应链战略确定了产品何时应该采购或制造 交付到分销中心 并最终提供给零售渠道 在开源智造 Odoo免费开源ERP解决方案中 可以使用WMS应用中的仓库路线来配置产品的供应链策略 其中包括库内作业的拉取和推送规则 一旦一切
  • Java架构直通车——深入理解B+树

    文章目录 引入 AVL树和B树 AVL树 红黑树 B树 B 树 数据库为什么不使用二叉树 为什么使用B 树 与B树的区别 引入 AVL树和B树 AVL树 平衡二叉搜索树是基于二分法的策略提高数据的查找速度的二叉树的数据结构 平衡二叉搜索树的
  • 删除双系统中的一个linux,双系统删除linux

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 双系统删除linux系统2008 10 12 00 27方法一 我们知道在xp里一个很好的分区工具 PQ partition magic 但在双系统下 由于linux改变了xp里C盘的一个启动项
  • LVGL-obj对象

    对象创建 1 lv中所有的对象都以obj为基础进行扩展的 创建对象时父对象是空 则在显示器屏链表增加一个节点 父对象非空则在其子链表增加一个节点 创建完成会通过parent gt signal cb parent LV SIGNAL CHI
  • MySQL数据库之索引

    目录 前言 一 索引的概念 二 索引的作用和副作用 1 索引的作用 2 索引的副作用 3 创建索引的原则依据 总结 三 索引的分类和创建 1 普通索引 1 直接创建索引 2 修改表方式创建 3 创建表的时候指定索引 不建议 2 唯一索引 1
  • 国标GB28181安防视频平台EasyGBS显示状态正常,却无法播放该如何解决?

    国标GB28181视频平台EasyGBS是基于国标GB T28181协议的行业内安防视频流媒体能力平台 可实现的视频功能包括 实时监控直播 录像 检索与回看 语音对讲 云存储 告警 平台级联等功能 国标GB28181视频监控平台部署简单 可
  • C/C++函数参数读取顺序

    说到C C 函数参数读取顺序 很多人都知道在入栈时是从右至左的 可是真的有那么简单吗 先看一个例子 include
  • 允许chatgpt上传文件的插件

    https chrome google com webstore detail chatgpt file uploader ext becfinhbfclcgokjlobojlnldbfillpf related 事实上在其它浏览器 例如e
  • Solidity编程开发实例

    Solidity 编程开发实例 Voting 投票 接下来的智能合约教程非常复杂 但展示了很多Solidity的特性 它实现了一个入门的投票合约 当然 电子选举的主要问题是如何赋予投票权给准确的人 并防止操纵 我们不能解决所有的问题 但至少

随机推荐

  • java-编程输出一个随机字母

    编程输出一个随机字母 public class s public static void main String args TODO Auto generated method stub int i int Math random 2 1
  • Sqlite学习笔记(四)&&SQLite-WAL原理 Write ahead logging

    Sqlite学习笔记 四 SQLite WAL原理 转 2015 08 24 21 55 by 沧海一滴 90 阅读 0 评论 收藏 编辑 Sqlite学习笔记 三 WAL性能测试中列出了几种典型场景下WAL的性能数据 了解到WAL确实有性
  • linux下QT源码安装简书,QT Creator 5在linux下的安装及问题(libCore.so无法加载)的解决...

    Qt 以其开源 免费 完全面向对象 很容易扩展 允许真正的组件编程以及可移植跨平台等诸多优势得到越来越多的开发人员的青睐 Qt Creator 是 Nokia 官方推出的专门针对 Qt 开发的 IDE 本文详细介绍了 Linux 下 Qt
  • QT 多线程信号与槽(一)

    QT 中 QObject 作QT中类的最终父类 具有自定义信号与槽的能力 只要继承自这个类的类 也一样拥有自定义信号和槽的能力 QT 中定义信号与槽是十分有用的 那我们的线程类是不是也有这个能力呢 查一下 QThread 的源码 我们发现
  • 利用Xming X Server使用服务器上使用kettle

    Xming X Server安装部署 1 下载 http sourceforge net project showfiles php group id 156984 Xming 6 9 0 31 用OpenGL展示界面 Xming font
  • 电源抑制比(PSRR )

    如果运算放大器的电源发生变化 输出不应变化 但实际上通常会发生变化 如果X V的电源电压变化产生Y V的输出电压变化 则该电源的PSRR 折合到输出端 为X Y 无量纲比通常称为电源电压抑制比 PSRR 以dB表示时则称为电源电压抑制 PS
  • This system is not registered with RHN问题解决

    1 问题 公司有一台服务器 因为一直用的是centos的系统 但是那个分中心没有现成centos的系统 问我红帽5 3的能行吗 我说试一试 然后在配置yum源的时候就遇到了问题 提示如下错误 这是因为这个系统没有在红帽注册 所以不能用yum
  • 谷歌云

    Cloud Ace 是谷歌云全球战略合作伙伴 拥有 300 多名工程师 也是谷歌最高级别合作伙伴 多次获得 Google Cloud 合作伙伴奖 作为谷歌托管服务商 我们提供谷歌云 谷歌地图 谷歌办公套件 谷歌云认证培训服务 开放表格式依赖
  • R语言的微博数据处理

    用R语言处理微博数据 用到TM包 rJava包 slam包 自己还对李舰老师的Rwordseg进行了反编译 将最新的ansj弄了进去 首先来进行下微博的处理 我将每一个用户的微博放在一个文档中 文档名为用户id txt 首先导入需要用的包
  • C# Bitmap 与 Bytes数组,Bitmap与Image 控件的转换

    没事总结一下平时用到的几种图像相互转换方法 供大家参考 1 Bitmap 转byte 数组
  • Pandas ExcelWrite 简单的增改表格

    writer sheets 表格名字 writer pd ExcelWriter error report path engine xlsxwriter df pd DataFrame error info1 columns col df
  • rk3399调试ov2659(camera模块@dvp接口)--移植过程

    版权声明 本文为博主原创文章 转载请注明出处 https blog csdn net huang 165 article details 86130288 参考博客 RGB 与YUY格式简介 https blog csdn net u010
  • 远控博主远控博主

    Wh04m1001 SysmonEoP github com 关于这个博客 idiotc4t s blog
  • python 常用代码块

    1 计时 import time starttime time time print 计时 round time time starttime 0 秒 end r n 2 读文件 with open pi digits txt as f r
  • Unity事件触发

    一 EventSystem物体 当创建一个Canvas时会生成一个EventSystem物体 它包括以下3个组件 1 组件 Event System 被动触发事件系统 负责调度处理事件的输入 射线 发送 变量 First selected
  • 三分钟了解阿里云和腾讯云的DDoS防御策略

    三分钟了解阿里云和腾讯云的DDoS防御策略 DDoS攻击 即分布式拒绝服务 DDoS Distributed Denial of Service 攻击 是一种通过恶意流量导致受害者服务瘫痪的网络攻击行为 中小型网站站长在其父伍奇遭到DDoS
  • 华为发布HarmonyOS 3.0,向“万物互联”再迈一步

    整理 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews HarmonyOS承载无数人操作系统的梦想再次向前迈进了一大步 7月27日晚 HarmonyOS 3 0系统正式发布 HarmonyOS是史上发展最快 也是覆盖升级机型最多的
  • Linux如何在屏幕上显示ASCII/中文字符

    能调API完成的事情非要自己折腾 这会严重影响效率 但这只是玩玩 下一篇文章我会介绍 setfont 命令的玩法 问题 如何在屏幕上显示一个字符 很简单 调用 printf 执行 echo 然而 我们知道 任何显示的操作 最终都是在显示器上
  • C++中fstream读写文件

    C 中fstream读写文件 fstream介绍 1 fstream是C 标准库中面向对象库的一个 用于操作流式文件 2 fstream本质上是一个class 提供file操作的一众方法 3 有核心课程中应用编程里文件操作的基础 fstre
  • Node写博客--添加博客分类功能(修改和删除)

    1 在layout html中加入一个 分类管理 ul class nav navbar nav li a href admin user 用户管理 a li li class dropdown a href class dropdown