美文网首页博客
基于阿里egg框架搭建博客(5)——置顶导航条

基于阿里egg框架搭建博客(5)——置顶导航条

作者: 妖云小离 | 来源:发表于2019-03-18 15:29 被阅读56次

    相关文章

    基于阿里egg框架搭建博客(1)——开发准备
    基于阿里egg框架搭建博客(2)——Hello World
    基于阿里egg框架搭建博客(3)——注册与登录
    基于阿里egg框架搭建博客(4)——权限控制
    基于阿里egg框架搭建博客(5)——置顶导航条
    基于阿里egg框架搭建博客(6)——浏览、发表文章
    基于阿里egg框架搭建博客(7)——编辑文章

    git

    https://github.com/ZzzSimon/egg-example
    喜欢就点个赞吧!

    正文

    模板继承

    导航条是博客不可或缺的一部分,几乎每一个页面都有置顶导航条。我们不可能在每个页面都复制一份相同的代码,因为这样代码变得冗余,而且当需要修改导航条时,改动量会非常之大。所幸的是,我们使用了nunjucks作为view模板,其提供的模板继承功能可以解决这个问题。

    官方文档:https://nunjucks.bootcss.com/templating.html#part-2cf2ea1f8614528d

    页面设计

    功能设计

    如页面设计图中所示,导航条共有6块功能:

    1. 站点名称,点击后可以回到首页
    2. 文章按钮,点击后可以查看文章列表
    3. 搜索框,可以按文章名称搜索文章
    4. 发表文章按钮,顾名思义,可以发表博文
    5. 用户头像下拉按钮,我的文章可以查看自己的文章或重新编辑
    6. 设置,可以修改个人信息
    7. 注销,注销用户,删除session,返回登录

    父模板parent.tpl代码(包含导航条)

    我们创建/app/view/parent.tpl文件:

    <!DOCTYPE html>
    <html>
    <head>
        <link rel="stylesheet" href="/public/bootstrap/css/bootstrap.css">
        <script type="text/javascript" src="/public/js/jquery.min.js"></script>
        <script type="text/javascript" src="/public/bootstrap/js/bootstrap.min.js"></script>
        {% block head %}{% endblock %}
    </head>
    
    <body>
    <div id="nav">
        <nav class="navbar navbar-default navbar-fixed-top">
            <div class="container-fluid">
                <div class="navbar-header">
                    <a class="navbar-brand" href="/">妖云小离</a>
                </div>
    
                <div class="collapse navbar-collapse">
                    <ul class="nav navbar-nav">
                        <li><a href="/articleList.htm">文章</a></li>
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                               aria-expanded="false">预留 <span class="caret"></span></a>
                            <ul class="dropdown-menu">
                                <li><a href="#">Action</a></li>
                                <li><a href="#">Another action</a></li>
                                <li><a href="#">Something else here</a></li>
                                <li role="separator" class="divider"></li>
                                <li><a href="#">Separated link</a></li>
                                <li role="separator" class="divider"></li>
                                <li><a href="#">One more separated link</a></li>
                            </ul>
                        </li>
                    </ul>
                    <form class="navbar-form navbar-left" action="/search?_csrf={{ ctx.csrf | safe }}">
                        <div class="input-group">
                            <input type="text" class="form-control" placeholder="搜索" name="keyword">
                            <span class="input-group-btn">
                                <button class="btn btn-default" type="submit">
                                    <span class="glyphicon glyphicon-search " aria-hidden="true"></span>
                                </button>
                            </span>
                        </div>
                    </form>
                    <ul class="nav navbar-nav navbar-right">
                        <li><a href="/edit.htm"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 发表文章</a>
                        </li>
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                               aria-expanded="false">
                                <img src="" id="avatarNav" class="img-circle" style="width: 26px; margin-top: -6px">
                                <span class="caret"></span></a>
                            <ul class="dropdown-menu">
                                <li><a href="/myarticle.htm">我的文章</a></li>
                                <li><a href="/myInfo.htm">设置</a></li>
                                <li role="separator" class="divider"></li>
                                <li><a href="/user/logout">注销</a></li>
                            </ul>
                        </li>
                    </ul>
                </div>
    
            </div>
        </nav>
    </div>
    <div id="top" class="row" style="margin-top: 10%"></div>
    <div class="container">
        {% block content %}{% endblock %}
    </div>
    
    <script type="text/javascript">
        function getCookie(c_name) {
            if (document.cookie.length > 0) {
                c_start = document.cookie.indexOf(c_name + "=")
                if (c_start != -1) {
                    c_start = c_start + c_name.length + 1
                    c_end = document.cookie.indexOf(";", c_start)
                    if (c_end == -1) c_end = document.cookie.length
                    return unescape(document.cookie.substring(c_start, c_end))
                }
            }
            return ""
        }
    
        $('#avatarNav').attr('src', getCookie('avatarUrl'));
    </script>
    {% block script %}{% endblock %}
    </body>
    </html>
    

    父模板中可以继承重写的地方有3处:

    1. <head>标签处,可以添加<title>和一些静态资源,此处需要注意的是,父模板中已经引入的静态资源,如bootstrap,不要再次在子模板中重复引用,否则有可能会不生效。
    2. <div class="container">标签处,此处可以理解为<body>中的内容,为页面的主要内容。
    3. <script>标签处,可以添加js代码。

    首页home.tpl继承parent.tpl

    我们创建/app/view/home/home.tpl文件:

    {% extends "parent.tpl" %}
    
    {% block head %}
    <title>首页</title>
    <link rel="stylesheet" href="/public/css/home.css" />
    {% endblock %}
    
    {% block content %}
    <div class="home">
        hello ! {{user.username}}
        {{helper.formatTime(time)}}
    </div>
    {% endblock %}
    

    HomeController

    我们在/app/controller/home.js中添加以下内容:

        async index() {
            const {ctx, service} = this;
                const userInfo = ctx.session.user;
                ctx.logger.info('session:: %j',userInfo);
                await ctx.render('home/home.tpl',
                    {
                        time: new Date(),
                        user:userInfo
                    });
        }
    

    router.js

    我们在/app/router.js中添加以下内容:

    router.get('/', controller.home.index);
    

    结果

    打开浏览器输入http://127.0.0.1:7001,即可看到如页面设计中的图。

    结尾

    如果看完觉得有用,请给作者一个喜欢吧!谢谢啦!

    相关文章

      网友评论

        本文标题:基于阿里egg框架搭建博客(5)——置顶导航条

        本文链接:https://www.haomeiwen.com/subject/zebvmqtx.html