zoukankan      html  css  js  c++  java
  • 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);

    分页

  • 相关阅读:
    Python replace()方法
    QQ传输协议分析
    子网与子网掩码的介绍
    每天撸点Linux
    对一次ARP欺骗分析
    中转注入
    第五篇学习笔记
    第四篇学习笔记
    第三篇学习笔记
    第二篇学习笔记
  • 原文地址:https://www.cnblogs.com/bici/p/6126278.html
Copyright © 2011-2022 走看看