利用layuiAdmin和layui Table根据HTTP状态码判断授权
layuiAdmin前后端分离项目中所有请求都必须在header中携带token进行鉴权,鉴权不通过时返回http401状态码重新登录,而layui提供的方法不能判断http状态码,所以将其进行改写
layuiAdmin有两种请求,一种是admin.req发起的ajax,这种请求配置拦截器后会自动携带token
另一种是table.render方式,需要手动带上headers头
1.admin.req 发起的请求
修改配置文件config.js ,开启拦截器
layui.define(['laytpl', 'layer', 'element', 'util'], function(exports){
exports('setter', {
container: 'LAY_app' //容器ID
,base: layui.cache.base //记录layuiAdmin文件夹所在路径
,api: '##/' //api接口URL
,views: layui.cache.base + 'views/' //视图所在目录
,entry: 'index' //默认视图文件名
,engine: '.html' //视图文件后缀名
,pageTabs: false //是否开启页面选项卡功能。单页版不推荐开启
,name: 'layuiAdmin Pro'
,tableName: 'layuiAdmin' //本地存储表名
,MOD_NAME: 'admin' //模块事件名
,debug: true //是否开启调试模式。如开启,接口异常时会抛出异常 URL 等信息
,interceptor: true //是否开启未登入拦截
//自定义请求字段
,request: {
tokenName: 'AUTHORIZATION' //自动携带 token 的字段名。可设置 false 不携带。
}
//自定义响应字段
,response: {
statusName: 'code' //数据状态的字段名称
,statusCode: {
ok: 0 //数据状态一切正常的状态码
,logout: 401 //登录状态失效的状态码
}
,msgName: 'msg' //状态信息的字段名称
,dataName: 'data' //数据详情的字段名称
}
//独立页面路由,可随意添加(无需写参数)
,indPage: [
'/user/login' //登入页
,'/user/reg' //注册页
,'/user/forget' //找回密码
,'/template/tips/test' //独立页的一个测试 demo
]
//扩展的第三方模块
,extend: [
'echarts', //echarts 核心包
'echartsTheme' //echarts 主题
]
//主题配置
,theme: {
//内置主题配色方案
color: [{
main: '#20222A' //主题色
,selected: '#009688' //选中色
,alias: 'default' //默认别名
},{
main: '#03152A'
,selected: '#3B91FF'
,alias: 'dark-blue' //藏蓝
},{
main: '#2E241B'
,selected: '#A48566'
,alias: 'coffee' //咖啡
},{
main: '#50314F'
,selected: '#7A4D7B'
,alias: 'purple-red' //紫红
},{
main: '#344058'
,logo: '#1E9FFF'
,selected: '#1E9FFF'
,alias: 'ocean' //海洋
},{
main: '#3A3D49'
,logo: '#2F9688'
,selected: '#5FB878'
,alias: 'green' //墨绿
},{
main: '#20222A'
,logo: '#F78400'
,selected: '#F78400'
,alias: 'red' //橙色
},{
main: '#28333E'
,logo: '#AA3130'
,selected: '#AA3130'
,alias: 'fashion-red' //时尚红
},{
main: '#24262F'
,logo: '#3A3D49'
,selected: '#009688'
,alias: 'classic-black' //经典黑
},{
logo: '#226A62'
,header: '#2F9688'
,alias: 'green-header' //墨绿头
},{
main: '#344058'
,logo: '#0085E8'
,selected: '#1E9FFF'
,header: '#1E9FFF'
,alias: 'ocean-header' //海洋头
},{
header: '#393D49'
,alias: 'classic-black-header' //经典黑
},{
main: '#50314F'
,logo: '#50314F'
,selected: '#7A4D7B'
,header: '#50314F'
,alias: 'purple-red-header' //紫红头
},{
main: '#28333E'
,logo: '#28333E'
,selected: '#AA3130'
,header: '#AA3130'
,alias: 'fashion-red-header' //时尚红头
},{
main: '#28333E'
,logo: '#009688'
,selected: '#009688'
,header: '#009688'
,alias: 'green-header' //墨绿头
}]
//初始的颜色索引,对应上面的配色方案数组索引
//如果本地已经有主题色记录,则以本地记录为优先,除非请求本地数据(localStorage)
,initColorIndex: 0
}
});
});
修改view.js里的 view.req方法,判断http状态码等于401时跳转到登录页
return $.ajax($.extend({
type: 'get'
,dataType: 'json'
,success: function(res){
var statusCode = response.statusCode;
//只有 response 的 code 一切正常才执行 done
if(res[response.statusName] == statusCode.ok) {
typeof options.done === 'function' && options.done(res);
}
//登录状态失效,清除本地 access_token,并强制跳转到登入页
// else if(res[response.statusName] == statusCode.logout){
// view.exit();
// }
//其它异常
else {
var error = [
'<cite>Error:</cite> ' + (res[response.msgName] || '返回状态码异常')
,debug()
].join('');
view.error(error);
}
//只要 http 状态码正常,无论 response 的 code 是否正常都执行 success
typeof success === 'function' && success(res);
}
,error: function(e, code){
/**
* 判断http状态码
*/
//登录状态失效,清除本地 access_token,并强制跳转到登入页
if(e.status == response.statusCode.logout){
view.exit();
} else {
var error = [
'请求异常,请重试<br><cite>错误信息:</cite>'+ code
,debug()
].join('');
view.error(error);
typeof error === 'function' && error(res);
}
}
}, options));
};
请求示例
//软删除
function del(ids) {
admin.req({
url: layui.setter.api + 'm-slide'
, type: 'patch'
, data: {
ids: ids
}
, done: function (result) {
layer.msg(result.msg);
}
});
}
2.table.render
在表格前使用
layui.use(['admin', 'table', 'layer', 'form'], function () {
var $ = layui.$
, admin = layui.admin
, view = layui.view
, table = layui.table
, form = layui.form;
$.ajaxSetup({
//完成请求后触发。即在success或error触发后触发
complete: function (xhr, status) {
if (xhr.status == 401)
admin.exit();
}
})
table.render({
elem: '#LAY-app-content-list'
, url: layui.setter.api + 'm-slide-list'
,toolbar: '#zq_toolbar' //开启头工具栏,此处default:显示默认图标,可以自定义模板,详见文档
, title: '轮播图列表'
, headers: {
AUTHORIZATION: layui.data('layuiAdmin').AUTHORIZATION
}
, request: {
pageName: 'page' //页码的参数名称,默认:page
, limitName: 'size' //每页数据量的参数名,默认:limit
}
, parseData: function (res) { //res 即为原始返回的数据
return {
"code": res.code, //解析接口状态
"msg": res.msg, //解析提示文本
"data": res.data.data //解析数据列表
};
}
, page: true
, limit: 20
, cols: [[
{ type: 'checkbox', fixed: 'left' }
, { field: 'id', title: 'ID', width: 80, fixed: 'left', unresize: true, sort: true }
, { field: 'name', title: '标题' }
, { field: 'pic', title: '图形', width: 160, templet: '#pic', }
, { field: 'url', title: '图片网址' }
, { field: 'create_time', title: '创建时间', width: 200 }
, { fixed: 'right', title: '操作', toolbar: '#test-table-toolbar-barDemo', width: 150 }
]]
,done:function(res,curr,count){
hoverOpenImg();
}
});