一段学习的结束

我也不知道我这是在写些什么,只是觉得学完了一些东西,就是想把它记录

一下,这样我就可以知道我是学过这一块的,要多激励自己,_O(∩_∩)O哈哈~

以下内容并不完全与标题匹配,不过以下内容综合了前面几篇的应用,并增加了

部分东西

js带码要和html代码一起看

import express from 'express'
import Advert from '../models/advert'
import formidable from 'formidable'
import config from '../config'
import { basename } from 'path' // 创建一个路由容器,将所有的路由中间件挂载给路由容器
const router = express.Router() router.get('/advert', (req, res, next) => {
const page = Number.parseInt(req.query.page, 10)
const pageSize = 5
Advert
.find()
.skip((page - 1) * pageSize)
.limit(pageSize)
.exec((err, adverts) => {
if (err) {
return next(err)
}
Advert.count((err, count) => {
if (err) {
return next(err)
}
const totalPage = Math.ceil(count / pageSize) // 总页码 = 总记录数 / 每页显示大小
res.render('advert_list.html', {
adverts,
totalPage,
page
})
})
})
}) router.get('/advert/add', (req, res, next) => {
res.render('advert_add.html')
}) /**
* POST /advert/add
* body: { title, image, link, start_time, end_time }
*/
router.post('/advert/add', (req, res, next) => {
const form = new formidable.IncomingForm()
form.uploadDir = config.uploadDir // 配置 formidable 文件上传接收路径
form.keepExtensions = true // 配置保持文件原始的扩展名
form.parse(req, (err, fields, files) => {
if (err) {
return next(err)
} const body = fields // 普通表单字段
body.image = basename(files.image.path) // 这里解析提取上传的文件名,保存到数据库 const advert = new Advert({
title: body.title,
image: body.image,
link: body.link,
start_time: body.start_time,
end_time: body.end_time,
}) advert.save((err, result) => {
if (err) {
return next(err)
}
res.json({
err_code: 0
})
})
})
}) router.get('/advert/list', (req, res, next) => {
Advert.find((err, docs) => {
if (err) {
return next(err)
}
res.json({
err_code: 0,
result: docs
})
})
}) // /advert/one/:advertId 是一个模糊匹配路径
// 可以匹配 /advert/one/* 的路径形式
// 例如:/advert/one/1 /advert/one/2 /advert/one/a /advert/one/abc 等路径
// 但是 /advert/one 或者 /advert/one/a/b 是不行的
// 至于 advertId 是自己起的一个名字,可以在处理函数中通过 req.params 来进行获取
router.get('/advert/one/:advertId', (req, res, next) => {
Advert.findById(req.params.advertId, (err, result) => {
if (err) {
return next(err)
}
res.json({
err_code: 0,
result: result
})
})
}) // /advert/edit
router.post('/advert/edit', (req, res, next) => {
Advert.findById(req.body.id, (err, advert) => {
if (err) {
return next(err)
}
const body = req.body
advert.title = body.title
advert.image = body.image
advert.link = body.link
advert.start_time = body.start_time
advert.end_time = body.end_time
advert.last_modified = Date.now() // 这里的 save 因为内部有一个 _id 所以这里是不会新增数据的,而是更新已有的数据
advert.save((err, result) => {
if (err) {
return next(err)
}
res.json({
err_code: 0
})
})
})
}) router.get('/advert/remove/:advertId', (req, res, next) => {
Advert.remove({ _id: req.params.advertId }, err => {
if (err) {
return next(err)
}
res.json({
err_code: 0
})
})
}) export default router
{% extends "layout.html" %} {% block body %}
<div class="container-fluid">
<div class="body advert">
<!-- 面包屑 -->
<ol class="breadcrumb">
<li><a href="javascript:;">广告管理</a></li>
<li class="active">添加广告</li>
</ol>
<div class="advert-add">
<form action="/advert/add" method="post" class="form-horizontal" enctype="multipart/form-data">
<div class="form-group">
<label for="" class="col-md-3 control-label">标题</label>
<div class="col-md-5">
<input type="text" required class="form-control input-sm" name="title" placeholder="填写广告标题">
</div>
</div>
<div class="form-group">
<label for="" class="col-md-3 control-label">图片</label>
<div class="col-md-5">
<input type="file" required id="file" class="form-control input-sm" name="image" placeholder="填写广告图片">
</div>
</div>
<div class="form-group">
<label for="" class="col-md-3 control-label">链接</label>
<div class="col-md-5">
<input type="text" required class="form-control input-sm" name="link" placeholder="填写广告链接">
</div>
</div>
<div class="form-group">
<label for="" class="col-md-3 control-label">开始时间</label>
<div class="col-md-5">
<input type="text" required class="form-control input-sm" name="start_time" placeholder="填写开始时间">
</div>
</div>
<div class="form-group">
<label for="" class="col-md-3 control-label">结束时间</label>
<div class="col-md-5">
<input type="text" required class="form-control input-sm" name="end_time" placeholder="填写结束时间">
</div>
</div>
<div class="form-group">
<div class="col-md-8">
<input type="submit" class="btn btn-success btn-sm pull-right" value="保存">
</div>
</div>
</form>
</div>
</div>
</div>
{% endblock %} {% block script %}
<script> // XMLHTTPRequest 1
// XMLHTTPRequest 2
$('form').on('submit', function (e) {
// var formData = new FormData()
// formData.append('name', 'Jack')
// formData.append('age', '18')
// formData.append('file', document.getElementById('file').files[0]) // var xhr = new XMLHttpRequest()
// xhr.open('post', '/advert/add')
// xhr.send(formData)
// return false
$.ajax({
url: $(this).attr('action'),
type: $(this).attr('method'),
data: new FormData($(this)[0]),
// 当你的 data 选项被提交为一个 FormData 对象的时候,一定要将 processData 配置为 false
// 否则 jQuery 的异步提交不生效
processData: false, // tell jQuery not to process the data
// 当提交一个 FormData 对象的时候,记得要将 contentType 设置为 false
// 否则 jQuery 会默认把 Content-Type 设置为 application/x-www-form-urlencoded; charset=UTF-8
contentType: false, // tell jQuery not to set contentType
success: function (data) {
if (data.err_code === 0) {
window.location.href = '/advert'
}
}
})
return false
})
</script>
{% endblock %}
{% extends "layout.html" %} 

{% block body %}
<div class="container-fluid">
<div class="body advert">
<!-- 面包屑 -->
<ol class="breadcrumb">
<li><a href="javascript:;">广告管理</a></li>
<li class="active">广告列表</li>
</ol>
<div class="page-title">
<a href="/advert/add" class="btn btn-success btn-sm pull-right">添加广告</a>
</div>
<div class="panel panel-default">
<div class="panel-body">
<form action="" class="form-inline">
<select name="" class="form-control input-sm">
<option value="">按年龄</option>
</select>
<select name="" class="form-control input-sm">
<option value="">按性别</option>
</select>
<select name="" class="form-control input-sm">
<option value="">按地区</option>
</select>
<select name="" class="form-control input-sm">
<option value="">按日期</option>
</select>
<button class="btn btn-success btn-sm">筛选</button>
</form>
</div>
<table class="table table-bordered">
<thead>
<tr>
<td>序号</td>
<th>标题</th>
<th>图片</th>
<th>链接</th>
<th>开始时间</th>
<th>结束时间</th>
<th>点击次数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for item in adverts %}
<tr>
<td>0</td>
<td>{{ item.title }}</td>
<td>
<img src="/public/uploads/{{ item.image }}" style="width: 100px;" alt="">
</td>
<td>{{ item.link }}</td>
<td>{{ item.start_time }}</td>
<td>{{ item.end_time }}</td>
<td>1</td>
<td>
<a href="javascript:;" class="btn btn-info btn-xs">编辑</a>
<a href="javascript:;" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- 分页 -->
<ul class="pagination pull-right">
<li><a href="/advert?page={{ page - 1 }}">上一页</a></li>
{% for i in range(0, totalPage) -%}
{% if (i + 1) === page %}
<li class="active"><a href="/advert?page={{ i + 1 }}">{{ i + 1 }}</a></li>
{% else %}
<li><a href="/advert?page={{ i + 1 }}">{{ i + 1 }}</a></li>
{% endif %}
{%- endfor %}
<li><a href="/advert?page={{ page + 1 }}">下一页</a></li>
</ul>
</div>
</div>
{% endblock %} {% block script %} {% endblock %}

node--处理一个增加上传操作和渲染页数条的更多相关文章

  1. 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】

    增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...

  2. 我需要在Web上完成一个图片上传的功能

    我需要在Web上完成一个图片上传的功能. 这个页面需要能从手机中选择图片上传. 首先,这个页面是从微信上面触发的,所以修改了微信的的入口地址,增加了身份识别号作为传参. 跳转到页面的时候,页面先检查身 ...

  3. 使用express+multer实现node中的图片上传

    使用express+multer实现node中的图片上传 在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中 在n ...

  4. node+express实现文件上传功能

    在进行node web开发时,我们可能经常遇到上传文件的问题,这一块如果我们没有经验,可能会遇到很多坑,下面我将跟大家分享一下,实现文件上传的一些方式. 一.node+express文件上传的常用方式 ...

  5. thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。

    最近弄一个图片 上传,可是用ueditor 自带的上传,如果不配置的话,上传的目录不在自己的项目中. 在网上找了好多,可是都是底版本的,新版本的还真是找到了一个,ueditor-thinkphp 这个 ...

  6. jsp 文件上传操作

    文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...

  7. NetCore文件上传校验返回未授权401,文件仍然执行上传操作,要如何解决呢

    这是代码:https://files.cnblogs.com/files/suterfo/NetCoreTestPro.rar 运行步骤: 一.使用Visual Studio2017打开项目,并F5运 ...

  8. 【python+selenium的web自动化】- 针对上传操作的实现方案

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 关于上传操作 ​ 上传有两 ...

  9. Node使用multiparty包上传文件

    var multiparty = require('multiparty'); var http = require('http'); var util = require('util'); var ...

随机推荐

  1. Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置

    面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...

  2. Codeforces_821

    A.直接判断每一个数. #include<bits/stdc++.h> using namespace std; ][]; int main() { ios::sync_with_stdi ...

  3. 分组密码CBC加密缺陷

    title: 分组密码CBC加密缺陷 date: 2017-05-15 10:04:47 tags: ["密码学"] --- 关于密码学的种种漏洞以及利用网上也有不少,但是比较零散 ...

  4. GitBook安装部署实操手册

    前言 GitBook是一个基于Node.js的命令行工具,可使用Git和Markdown来编写文档,赞誉太多,不再赘述. Node.js 下载安装包 cd /tmp wget https://node ...

  5. c#学习笔记之委托

    委托 最近自己在调试C#项目,发现经常可以看到委托和lambda表达式,各种花里胡哨的写法把我给整的云里雾里的,于是自己特意花了一点功夫来整理关于delegate的相关知识,方便自己日后查阅. 何为委 ...

  6. ISC BIND DNS

    win10,安装BIND9.15.5.x64 安装完成后,计算机服务里启动,总是报无法登陆,但服务属性登陆里设置了密码了啊,就是named,但就是一直报错.后来用下面方法避开了该问题. 安装完成后,服 ...

  7. PgSQL备份

    SQL转储. 这里我们用到的工具是pg_dump和pg_dumpall. 这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问.它会产生一个脚本文件,里面包含备份开始时 ...

  8. 4,ZooKeeper原理

    1,ZooKeeper概述 ··· 作用:     · ZooKeeper是为分布式应用程序提供的一个分布式开源协调框架,是Hadoop和Hbase的重要组件:     · 主要用于解决分布式集群中应 ...

  9. Jmeter 连接Redis获取数据集

    公司开展了新的业务活动,需要配合其他部门做压测,由于脚本中的手机号和用户的uid需要参数化而且每次均不能重复,最初的考虑使用csv的方式来获取数据,比较头疼的问题是集群节点需要维护测试数据,所以我将所 ...

  10. cesium1.63.1api版本贴地贴模型量算工具效果(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材.不少 ...