案例
- 登录功能
- 用户名和密码的验证
- 验证码发送到邮箱(为了方便, 开发完毕最后实现)
- 首页
- 渲染一下昵称
- 个人中心页面
- 登录验证, 不登陆状态下直接跳转回登陆页面
- 用户信息的渲染
- 用户信息修改
- 修改密码页面
- 根据原始密码修改新密码
实现页面
- express 实现服务
- express-art-template 实现 res.render()
- 为了渲染页面, 自动读取, 自动组装, 自动返回
- 依赖一个 art-template
const express = require('express')
const app = express()
app.engine('html', require('express-art-template'))
app.set('views', __dirname + '/pages')
app.listen()
router.get('页面', (req, res) => {})
router.get('页面', (req, res) => {})
router.get('页面', (req, res) => {})
router.get('页面', (req, res) => {})
router.get('/getInfo', (req, res) => {})
router.post('/update', (req, res) => {})
router.post('/updatePwd', (req, res) => {})
router.post('/login', (req, res) => {})
处理静态资源
app.use('/public', express.static('路径'))
app.use('/node_modules', express.static('路径'))
实现登录
- 接收前端发来的用户名和密码
+ 进行数据库比对的验证
+ 需要用到 mongoose 数据库
+ 数据库操作单独封装
const mongoose = express('mongoose')
mongoose.connect('路径')
const user = new mongoose.Schema({
email: 字符串类型, 必填
password: 字符串类型, 必填, 6 ~ 12 位
age: 数值类型, 默认值, 0
gender: 字符串类型, 枚举类型, 默认值, 保密
phone: 字符串类型, 限定长度, 11
desc: 字符串类型, 限定长度, 200
avatar: 字符串类型, 默认值, 没有图片的时候使用默认路径
hobby: 数组类型
})
mongoose.model('users', user)
- 配置路由
+ 添加一个接收 login 请求的路由
+ 因为 login 需要 post 请求
+ 接收请求体
+ 配置接收
```javascript
// body-parser
// express 自己带的
app.use(express.urlencoded())
```
- 验证登录
- 一定要自己验证一遍数据
+ 保证有
+ 保证格式是对的
- 再去数据库查询
- 为了保持登录状态, 需要使用到 cookie + session 来保持登录状态
- 需要 express-session, connect-mongo
```javascript
const session = require('session')
const MongoStore = require('connect-mongo')(session)
// 挂载到 app 商
app.use(session({
screct: 'guoxiang',
name: 'sessid',
resave: true,
saveUnxxxx: true,
cookie: { maxAge: 1000 * 60 },
store: new MongoStore({
url: '地址'
})
}))
```
首页的业务逻辑
- 在页面的路由中进行判断
- 如果登录了, 需要渲染一种结果
- 如果没有登录, 需要渲染一种结果
if (req.session.userInfo) {}
个人中心的业务逻辑
- 登录验证
- 如果没有登录, 直接回到登陆页面
- 直接在路由里面就可以验证
if (!req.session.userInfo) return res.redirect('登录页面')
- 根据当前用户的信息把表单渲染好
- 接收前端传递来的数据
- 因为有文件, 需要 multer
const multer = require('multer')
const storage = multer.diskStorage({
destination () {},
filename () {}
})
const avatar = multer({ storage: storage })
findByIdAndUpdate()