egg之新闻系统

知识点:

        1.使用ejs  

        2.遵循MVC设计模式

        3.配置url到配置文件中

        4.使用中间件

        5.使用扩展helper.js

        

配置ejs 中间件 参数(即options) 以及url共享

config.default.js

/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = exports = {};

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + '_1629451927021_5494';

  // add your middleware config here
  config.middleware = ['printdate','forbidip'];
  //给printdate中间件传入的参数
  config.printdate={
    aaa:'aaaa'
  };
  config.forbidip={
    // 要屏蔽的ip
    forbidips:['192.168.0.114']
  }
  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
  };
  config.view = {
    mapping: {
      '.html': 'ejs',
    },
  };
  config.api='http://www.phonegap100.com/';
  return {
    ...config,
    ...userConfig,
  };
};

2.plugin.js

'use strict';
exports.ejs = {
  enable: true,
  package: 'egg-view-ejs',
};

获取新闻列表:

service news.js

   // 获取新闻列表
    async getNewsList(){
        let api=this.config.api+'appapi.php?a=getPortalList&catid=20&page=1';
        // curl自带的获取网络数据
        let response=await this.ctx.curl(api);
        // response.data.toString() 将buffer转换字符串
        // JSON.parse(response.data) 转换成json对象
        // console.log(JSON.parse(response.data));
        let data=JSON.parse(response.data);
        return data.result;
    }

处理数据 controller news.js

  async index() {
    let list=await this.service.news.getNewsList();
    console.log(list);
    console.log(list[0].dateline);
    await this.ctx.render('index',{list})
  }

index.html

  <div>
        <h3>新闻列表</h3>
        <ol>
            <%for(let x=0;x<list.length;x++){%>
                <!-- 在这通过自定义路由 通过aid获取对应的详情页 并且通过helper.js使用第三方对时间戳进行转换日期时间 -->
                <li><a href="/newscontent?aid=<%=list[x].aid%>"><%=list[x].title%></a><span>---<%=helper.formatTime(list[x].dateline)%></span></li>
                <%}%>
        </ol>
    </div>

 js中调用helper  

 // 调用help的方法  helper绑定到ctx中   扩展类的都是绑定到ctx中
        this.ctx.helper.getHelperData()

extend helper.js

const sd = require('silly-datetime');
module.exports={
    formatTime(params){
        // 时间戳位数
        // Unix, Python为10 JavaScript为13位
        return sd.format(new Date(params*1000),'YYYY-MM-DD HH:mm')
    },
    getHelperData(){
        console.log('你好  我是helper的数据');
    }
}

路由 router.js

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.get('/test',controller.test.extnd);
  router.get('/', controller.news.index);
  // /名称 也可以是指定HTML a标签中的query,然后跳转指定的方法
  router.get('/newscontent',controller.news.content)
};

获取新闻详情 

service

 // 获取新闻详情页面  根据aid
    async getNewsContent(aid){
        let api = this.config.api + 'appapi.php?a=getPortalArticle&aid=' + aid;
        let response=await this.ctx.curl(api);
        let data=JSON.parse(response.data);
        return data.result;
    }

controller

  async content(){
    // 获取aid传值
    let aid=this.ctx.query.aid;
    // console.log(aid);
    let list=await this.service.news.getNewsContent(aid);
    // console.log(list);
    await this.ctx.render('newscontent',{list:list[0]})
  }

html

 <div class="content">

  
        <h2><%=list.title%></h2>
        <div>
    
            <%-list.content%>
        </div>

中间件对指定ip进行拦截  思路   就是获取访问的ip和指定的ip进行判断有么有一样的,一样就改为403 

middleware forbidip.js

module.exports=(options,app)=>{
    return async(ctx,next)=>{
        // /要屏蔽的id : 1.从数据库获取     2、从参数传入
        let forbidips=options.forbidips;
        //获取客户端的ip
        let clientIp=ctx.request.ip; 
        // 若和屏蔽的ip一致则设置为404 若不是则向下执行
        let flag=forbidips.some(val=>{
            if(val===clientIp){
                return true;
            }
        });
        if(flag){
            ctx.status=403;
            ctx.body='您的ip已经被屏蔽';
        }else{
            await next();
        }
    }
}

自己封装的LocalStoreHelper.js,做页面存储的兄弟可以参考 var LocalStoreHelper = { CookieHelp: { //expire:分钟 SetCookie: function (cookiename, cookievalue, expire) { var today = new Date(); var expiredate = new Date(); expiredate.setTime(today + 60 * 1000 * expire); [removed] = cookiename + "=" + escape(cookievalue) + ";expires=" + expiredate.toGMTString(); }, GetCookie: function (cookiename) { if ([removed].length > 0) {  //先查询cookie是否为空,为空就return "" c_start = [removed].indexOf(cookiename + "=")  //通过String对象的indexOf()来检查这个cookie是否存在,不存在就为 -1   if (c_start != -1) { c_start = c_start + c_name.length + 1  //最后这个+1其实就是表示"="号啦,这样就获取到了cookie值的开始位置 c_end = [removed].indexOf(";", c_start)  //其实我刚看见indexOf()第二个参数的时候猛然有点晕,后来想起来表示指定的开始索引的位置...这句是为了得到值的结束位置。因为需要考虑是否是最后一项,所以通过";"号是否存在来判断 if (c_end == -1) c_end = [removed].length return unescape([removed].substring(c_start, c_end))  //通过substring()得到了值。想了解unescape()得先知道escape()是做什么的,都是很重要的基础,想了解的可以搜索下,在文章结尾处也会进行讲解cookie编码细节 } } return "" }, RemoveCookie: function (cookiename) { var exp = new Date(); exp.setTime(exp.getTime() - 1); var cval = getCookie(cookiename); if (cval != null) [removed] = cookiename + "=" + cval + ";expires=" + exp.toGMTString(); } }, LocalData: { SetItem: function (name, value) { if (window.localStorage) { localStorage.setItem(name, value); } else { LocalStoreHelper.CookieHelp.SetCookie(name, value, 30); } }, GetItem: function (name) { if (window.localStorage) { return localStorage.getItem(name); } else { return LocalStoreHelper.CookieHelp.GetCookie(name); } }, DelItem:function(name) { if (window.localStorage) { return localStorage.removeItem(name); } else { return LocalStoreHelper.CookieHelp.GetCookie(name); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值