Node项目-->后台管理

Node项目

后台管理

  • 在客户端保存数据的一种方式
    • 保存少量数据4k左右,客户端和服务器都可以读写cookie
    • 如果只是存储数据,可以使用localStorage替换,可以存储5M
    • 不可以跨域
  • 服务端写Cookie

    • 存储在内存

      res.setHeader("Set-Cookie","name=zhangsan1");
      
    • 存储在文件

      res.setHeader("Set-Cookie","name=zhangsan1; path=/; domain=.tt.com; max-age=180");
      
    • 参数

      • path 设置路径,哪个路径可以访问cookie
      • expires 设置过期时间,是日期,服务器的日期可能和客户端的日期不一样
      • max-age 设置过期时间,秒,第一次访问的时间开始
      • domain 设置可以跨子域访问cookie
  • 封装读取cookie

let cookie = module.exports;
cookie.getCookie = (req,key)=>{
    var Cookies = {};
    req.headers.cookie && req.headers.cookie.split(';').forEach(function( Cookie ) {
        var parts = Cookie.split('=');
        Cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
    });
    return Cookies[key];
}

Session

  • 保持会话状态
  • 服务端+客户端实现
  • 模拟Session的实现
const express = require("express");

const cookie = require("../tools/cookie");

let demo = module.exports = express.Router();
demo.prefix = "/session";
let session = {sids:[]};
//{sids:["1111","222"], "1111": {name:zhangsan},}
demo.get("/get", (req, res) => {
    res.send(req.headers.cookie);
});
demo.get("/login/:name",(req, res) => {
    let sid =cookie.getCookie(req, "sid");
    //第一次登录,判断是否有sid,如果没有sid生成一个,并跳转会当前页面
    if(!sid) {
        //唯一标示一个客户端
        sid = Math.random();
        //模拟登录
        res.setHeader("Set-Cookie","sid="+ sid + "; path=/session");

        session.sids.push(sid);

        res.redirect(req.originalUrl);

        //console.log(req.originalUrl);
    }else{

        //模拟登录
        res.setHeader("Set-Cookie","name="+req.params.name+"; path=/session");

        session[sid] = {name: req.params.name};

        res.send("<a href='/session'>到首页</a>");

    }

});

demo.get("/",(req, res) => {

    //req.headers.cookie

    //判断是否登录成功,先获取sid,根据sid获取当前的登录信息
    let sid =cookie.getCookie(req, "sid");

    //根据sid获取 登录信息
    let obj = session[sid];

    //模拟权限的判断
    if(obj && obj.name) {
        res.send("后台首页")
    }else{
        res.send("请先登录");
    }
});
  • 使用express-session简化session开发

    • 安装 npm install express-session --save
    • 使用,在设置路由之前

      app.use(session({
        secret: '12345',
        resave: true,
        saveUninitialized: true,
        //maxage 单位毫秒
        cookie: { maxAge: 3600000 }
      }))
      
      //然后就可以使用session
      req.session.userinfo = user;
      
    • 参数

      • secret:用来对session数据进行加密的字符串.这个属性值为必须指定的属性。
      • name:表示cookie的name,默认cookie的name是:connect.sid。
      • maxAge:cookie过期时间,毫秒。
      • resave:是指每次请求都重新设置session cookie,假设你的cookie是6000毫秒过期,每次请求都会再设置6000毫秒。
      • saveUninitialized: 是指无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid。

登录

  • 路由
  • 控制器
  • 登录成功转到首页
  • 添加session
  • md5加密

    • 安装md5的包

      • npm install blueimp-md5 --save
      • 服务端使用代码

          //4297f44b13955235245b2497399d7a93
          let md5 = require("blueimp-md5");
          console.log(md5("123123"));
        
      • 客户端使用

        <script src="/assets/vendor/md5.js"></script>
        console.log(md5("123123"));
        

管理首页

  • 管理首页获取数据
account.getindex = (req, res) => {
    if(req.session.userinfo) {

        //获取帖子
        req.models.post.find({},{limit:5},["id","A"],(err,blogs)=>{
            if(err) throw err;
            res.render("admin/index",{user:req.session.userinfo,blogs:blogs}, (err,html)=>{
                if(err) throw err;
                res.send(html);
            });
        })

    }else{
        res.send("<script>alert('请先登录!'); location.href='/admin/login'</script>");
    }
}
  • 修改首页模板

  • 帖子的列表

    • 删除帖子
    • 修改帖子

模板重构

  • 父亲模板 parent.html
<!doctype html>
<html>
    <head>
        <meta name="charset" content="utf-8" />
        <title>{{title}}</title>
        {{{block ("head")}}}
    </head>
    <body>
        {{{block ("body")}}}
    </body>
</html>
  • 子模板 index.html
{{extend ("./parent")}}

{{#block ("head")}}
    <link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
{{/block}}

{{#block ("body")}}
    <h2>{{title}}</h2>
{{/block}}
  • 渲染和以前一样

用户管理

UEditor

  • 获取ueditor
  • 引入js
<script type="text/javascript" charset="utf-8" src="ueditor.config.js"></script>
        <script type="text/javascript" charset="utf-8" src="ueditor.all.min.js"> </script>
        <!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败-->
        <!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文-->
        <script type="text/javascript" charset="utf-8" src="lang/zh-cn/zh-cn.js"></script>
  • 页面上添加
     <script type="text/plain" id="content" style="height:300px"></script>
  • 配置ueditor
    var ue = UE.getEditor('content',{
                //这里可以选择自己需要的工具按钮名称,此处仅选择如下五个
                toolbars:[['Source', 'Undo', 'Redo','bold']],
                //focus时自动清空初始化时的内容
                autoClearinitialContent:true,
                //关闭字数统计
                wordCount:false,
                //关闭elementPath
                elementPathEnabled:false,
                //更多其他参数,请参考ueditor.config.js中的配置项
            });
  • 获取内容

    var content = ue.getContent();

  • 设置内容

    ue.setContent('欢迎使用ueditor', isAppendTo);

分页

原文地址:https://www.cnblogs.com/bici/p/6126278.html