这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
通过HTML的meta标签实现指定时间后的页面跳转
<meta http-equiv="refresh" content="3;url=http://www.baidu.com">
创建基类
为什么要创建基类?
之所以要创建基类,是因为我们希望复用一些通用的逻辑,比如登录成功如何操作,登录出现错误如何操作,这就是我们为什么要创建基类的根本原因。
实现方法
-
首先在控制器下创建一个base.js文件
-
在文件中定义需要被复用的异步函数。
'use strict';
const Controller = require('egg').Controller;
class BaseController extends Controller {
async success(msg,redirectUrl) {
await this.ctx.render("admin/public/success",{
msg,
redirectUrl
})
}
async error(msg,redirectUrl) {
await this.ctx.render("admin/public/error",{
msg,
redirectUrl
})
}
}
module.exports = BaseController;
- 需要用到基类的地方需要修改继承。
const BaseController = require('./base.js');
class LoginController extends BaseController{};
- 通过this异步调用this中的方法
await this.success("登录成功","/admin")
配置公共的成功失败的页面
- 在view下的指定文件夹内部定义成功的静态页面和错误的静态页面。
- 通过meta标签实现指定时间后跳转。
- 通过ejs模板接收传入的参数。
<%- include ../public/page_header.html %>
<meta http-equiv="refresh" content="1;url=<%=redirectUrl%>">
<div class="container" style="width: 480px;margin-top:100px;">
<div class="row">
<div class="alert alert-success">
<h2><%=msg%></h2>
<br />
<p>如果您不做出选择,将在 3秒后跳转到第一个链接地址。</p>
</div>
</div>
</div>
</body>
</html>
配置可以修改的后台地址
之所以要配置可以修改的后台地址是为了在修改路径的时候,只需修改配置文件中的地址即可,避免了一个一个修改的繁琐。
- 在config.default.js中指定后台路径。
- 指定中间件匹配上文提到的路径,并将这个指定的路径传入到中间件中。
config.adminPath = "aaa";
config.adminAuth = {
match: `/${config.adminPath}`,
adminPath: config.adminPath
}
- 路由中获取指定路径的方法
const {
router,
controller,
config
} = app
router.get(`/${config.adminPath}/manager`, controller.admin.manager.index);
- 中间件中通过配置全局变量的方式拿到adminPath
ctx.state.adminPath = options.adminPath;
- 控制器中通过this.config获取路径
await this.error('用户名或密码错误',`/${this.config.adminPath}/login`)
- 静态页面中直接通过模板引擎获取
<li class="list-group-item"> <a href="/<%=adminPath%>/role" target="rightMain"> 角色管理</a></li>
静态页面之所以能够获取到是因为我们第四步配置的中间件,把adminPath配置到了全局变量中了。
退出登录功能的实现
- 在控制器中定义退出的异步函数
在异步函数中首先要清空session,因为中间件判断登录与否是通过session实现的,退出登录后跳转到登录页面。
// 退出登录
async loginOut() {
this.ctx.session.userinfo = null;
await this.success("退出成功",`/${this.config.adminPath}/login`);
}
- 配置路由
router.get(`/${config.adminPath}/login/loginOut`,controller.admin.login.loginOut)
- 点击退出处的静态页面配置
<li><a href="/<%=adminPath%>/login/loginOut">安全退出</a>