知识点:
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();
}
}
}