nodejs six day

path 模块

  • app.use(’/public/’,express.static(path.join(__dirname,’./public/’)))
    如果一整个网站移动,则它的绝对路径更改,配置文件的路径是静态的就会出现bug
  • path.ioin(__dirname) 是动态获取文件的绝对路径,join方法用来职能拼接字符串

    在这里插入图片描述

配置模板引擎

  • npm i atr-template express-atr-template
  • //1. app.engine('html',require('express-art-template')) //2.默认到views目录下查找index 默认路径 app.set('views',path.join(__dirname,'./views/'))

app.get('/',function(req,res){
		// res.send('hello')
		//3.  render 默认去找views
		res.render('index.html',{
			name : '张三'
		})
})


默认模板引擎种类和格式
在这里引用引擎模板和写入数据后,在需要应用的html页面{{ name}}包裹起来
默认的模板引擎格式

  • 模板引擎语法
    在这里插入图片描述
  • layout.html 布局模板
  • 模板继承
  • extend是用来引入的在这里插入图片描述
  • 留坑在这里插入图片描述
    留坑后给需要引用的网页diy内容
    在这里插入图片描述

路由设计

在这里插入图片描述

  • 把路由功能分离出到一个页面
    在基本功能页加载 : var route = require(’./router’)
    在route页面挂载: module.exports = router
    在基本功能页挂载: app.use(router)

  • 页面之间的链接
    router.get(’/login’, function (req, res) {
    res.render(‘login.html’)
    })

  • 获取表单提交数据

  • 操作数据库

  • 发送响应

  • mongoose 用户表功能设计
 var mongoose = require('mongoose')

// 连接数据库
mongoose.connect('mongodb://localhost/test', { useMongoClient: true })

var Schema = mongoose.Schema

var userSchema = new Schema({
  email: {
    type: String,
    required: true
  },
  nickname: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  created_time: {
    type: Date,
    // 注意:这里不要写 Date.now() 因为会即刻调用
    // 这里直接给了一个方法:Date.now
    // 当你去 new Model 的时候,如果你没有传递 create_time ,则 mongoose 就会调用 default 指定的Date.now 方法,使用其返回值作为默认值
    default: Date.now
  },
  last_modified_time: {
    type: Date,
    default: Date.now
  },
  avatar: {
    type: String,
    default: '/public/img/avatar-default.png'
  },
  bio: {
    type: String,
    default: ''
  },
  gender: {
    type: Number,
    enum: [-1, 0, 1],
    default: -1
  },
  birthday: {
    type: Date
  },
  status: {
    type: Number,
    // 0 没有权限限制
    // 1 不可以评论
    // 2 不可以登录
    enum: [0, 1, 2],
    default: 0
  }
})

module.exports = mongoose.model('User', userSchema)

  • 获取完表单数据以后,在router的post请求里开始判断是否满足条件
  • 服务端
router.post('/login', function (req, res) {
  // 1. 获取表单数据
  // 2. 查询数据库用户名密码是否正确
  // 3. 发送响应数据
  var body = req.body

  User.findOne({
    email: body.email,
    password: md5(md5(body.password))
  }, function (err, user) {
    if (err) {
      return res.status(500).json({
        err_code: 500,
        message: err.message
      })
    }
    
    // 如果邮箱和密码匹配,则 user 是查询到的用户对象,否则就是 null
    if (!user) {
      return res.status(200).json({
        err_code: 1,
        message: 'Email or password is invalid.'
      })
    }

    // 用户存在,登陆成功,通过 Session 记录登陆状态
    req.session.user = user

    res.status(200).json({
      err_code: 0,
      message: 'OK'
    })
  })
})

客户端的判断

 <script>
    $('#register_form').on('submit', function (e) {
      e.preventDefault() //阻止其他事件提交,这里是异步提交的方式
      var formData = $(this).serialize()
      console.log(formData)
      $.ajax({
        url: '/register',
        type: 'post',
        data: formData,
        dataType: 'json',
        success: function (data) {
          var err_code = data.err_code
          if (err_code === 0) {
            // window.alert('注册成功!')
            // 服务端重定向针对异步请求无效
            window.location.href = '/'
          } else if (err_code === 1) {
            window.alert('邮箱已存在!')
          } else if (err_code === 2) {
            window.alert('昵称已存在!')
          } else if (err_code === 500) {
            window.alert('服务器忙,请稍后重试!')
          }
        }
      })
    })
  </script>
  • 遇到的问题 : 在没有ajax时表单提交行为
  • 在这里插入图片描述
    在没有ajax之前,用的方法是让当前页面返回值,在当前页面渲染出来
    在这里插入图片描述
    渲染在当前页面
    在这里插入图片描述
    这是只能在服务端处理
    同步请求的重定向register才有用,异步请求服务端重定向不生效

session的使用方法: 在node中配置 express-session
配置完成以后,在客户端记录req.session.user = user记录,这样就拿到了数据对象,根据自己想要实现的功能去用

在这里插入图片描述

login 的去请求异步操作

客户端功能

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css">
  <link rel="stylesheet" href="/public/css/login.css">
</head>

<body>
  <div class="main">
    <div class="header">
      <a href="/">
        <img src="/public/img/logo3.png" alt="">
      </a>
      <h1>用户登录</h1>
    </div>
    <form id="login_form">
      <div class="form-group">
        <label for="">邮箱</label>
        <input type="email" class="form-control" id="" name="email" placeholder="Email" autofocus>
      </div>
      <div class="form-group">
        <label for="">密码</label>
        <a class="pull-right" href="">忘记密码?</a>
        <input type="password" class="form-control" id="" name="password" placeholder="Password">
      </div>
      <div class="checkbox">
        <label>
          <input type="checkbox">记住我
        </label>
      </div>
      <button type="submit" class="btn btn-success btn-block">登录</button>
    </form>
    <div class="message">
      <p>没有账号? <a href="/register">点击创建</a>.</p>
    </div>
  </div>
  <script src="/node_modules/jquery/dist/jquery.js"></script>
  <script>
    $('#login_form').on('submit', function (e) {
      e.preventDefault()
      var formData = $(this).serialize()
      console.log(formData)
      $.ajax({
        url: '/login',
        type: 'post',
        data: formData,
        dataType: 'json',
        success: function (data) {
          var err_code = data.err_code
          if (err_code === 0) {
            // window.alert('注册成功!')
            // 服务端重定向针对异步请求无效
            window.location.href = '/'
          } else if (err_code === 1) {
            window.alert('邮箱或者密码错误')
          } else if (err_code === 500) {
            window.alert('服务器忙,请稍后重试!')
          }
        }
      })
    })
  </script>
</body>

</html>

  • 服务端功能
router.get('/login', function (req, res) {
  res.render('login.html')
})

router.post('/login', function (req, res) {
  // 1. 获取表单数据
  // 2. 查询数据库用户名密码是否正确
  // 3. 发送响应数据
  var body = req.body

  User.findOne({
    email: body.email,
    password: md5(md5(body.password))
  }, function (err, user) {
    if (err) {
      return res.status(500).json({
        err_code: 500,
        message: err.message
      })
    }
    
    // 如果邮箱和密码匹配,则 user 是查询到的用户对象,否则就是 null
    if (!user) {
      return res.status(200).json({
        err_code: 1,
        message: 'Email or password is invalid.'
      })
    }

    // 用户存在,登陆成功,通过 Session 记录登陆状态
    req.session.user = user

    res.status(200).json({
      err_code: 0,
      message: 'OK'
    })
  })
})
  • 退出
router.get('/logout', function (req, res) {
  // 清除登陆状态
  req.session.user = null

  // 重定向到登录页
  res.redirect('/login')
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值