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();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值