mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
admin后台登录
This commit is contained in:
@@ -19,4 +19,6 @@
|
||||
- 找到`sop-admin/sop-admin-front/index.html`文件,在IDEA下直接右键--Run'index.html'
|
||||
- 如果没有用到IDEA,则需要把sop-admin-front放到静态服务器中然后访问index.html
|
||||
|
||||
登录账号:admin/123456
|
||||
|
||||
|
||||
|
@@ -2,6 +2,8 @@
|
||||
* 请求工具
|
||||
*/
|
||||
var ApiUtil = (function () {
|
||||
var ACCESS_TOKEN_KEY = "sop_admin_access_token";
|
||||
|
||||
// 接口URL,更改此处即可
|
||||
var url = SopConfig.url;
|
||||
var URI_CHAR = '/';
|
||||
@@ -28,16 +30,21 @@ var ApiUtil = (function () {
|
||||
return uri;
|
||||
}
|
||||
|
||||
function getAccessToken() {
|
||||
return localStorage.getItem(ACCESS_TOKEN_KEY) || '';
|
||||
}
|
||||
|
||||
return {
|
||||
post: function (uri, params, callback) {
|
||||
uri = formatUri(uri);
|
||||
sdk.post({
|
||||
url: url + uri
|
||||
, data: params // 请求参数
|
||||
, access_token: getAccessToken()
|
||||
, callback: function (resp) { // 成功回调
|
||||
var code = resp.code
|
||||
if (!code || code === '-9') {
|
||||
layer.alert('系统错误');
|
||||
alert('系统错误');
|
||||
return
|
||||
}
|
||||
if (code === '-100' || code === '18' || code === '21') { // 未登录
|
||||
@@ -52,6 +59,16 @@ var ApiUtil = (function () {
|
||||
}
|
||||
});
|
||||
}
|
||||
, setAccessToken:function (accessToken) {
|
||||
localStorage.setItem(ACCESS_TOKEN_KEY,accessToken);
|
||||
}
|
||||
, getAccessToken: function () {
|
||||
return getAccessToken();
|
||||
}
|
||||
, logout: function () {
|
||||
localStorage.removeItem(ACCESS_TOKEN_KEY);
|
||||
top.location.href = '../login/login.html';
|
||||
}
|
||||
, getUrl: function () {
|
||||
return url;
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
layui.use('jquery', function () {
|
||||
var $ = layui.jquery;
|
||||
$(function () {
|
||||
var $pageFrame = $('#pageFrame');
|
||||
var $selectLi = null;
|
||||
$('.left-nav').on('click', 'li', function (event) {
|
||||
@@ -29,4 +28,10 @@ layui.use('jquery', function () {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
ApiUtil.post('admin.userinfo.get', {}, function (resp) {
|
||||
var userInfo = resp.data;
|
||||
$('#username').text(userInfo.username);
|
||||
});
|
||||
|
||||
});
|
@@ -14,9 +14,19 @@ layui.define(['layer', 'table'], function (exports) {
|
||||
if (param.data) {
|
||||
treetable.init(param, param.data);
|
||||
} else {
|
||||
$.getJSON(param.url, param.where, function (res) {
|
||||
// $.getJSON(param.url, param.where, function (res) {
|
||||
// treetable.init(param, res.data);
|
||||
// });
|
||||
$.ajax({
|
||||
url: param.url,
|
||||
type: param.method || 'get',
|
||||
data: param.where,
|
||||
headers: param.headers || {},
|
||||
dataType: "json",
|
||||
success: function (res) {
|
||||
treetable.init(param, res.data);
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
// 渲染表格
|
||||
|
@@ -3,118 +3,10 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>SOP Admin</title>
|
||||
<meta name="renderer" content="webkit|ie-comp|ie-stand">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport"
|
||||
content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8"/>
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp"/>
|
||||
<link rel="stylesheet" href="assets/css/font.css">
|
||||
<link rel="stylesheet" href="assets/css/xadmin.css">
|
||||
<script type="text/javascript" src="assets/lib/layui/layui.js" charset="utf-8"></script>
|
||||
<script type="text/javascript" src="assets/js/index.js"></script>
|
||||
<script>
|
||||
// 是否开启刷新记忆tab功能
|
||||
// var is_remember = false;
|
||||
location.href = 'pages/dashboard/dashboard.html'
|
||||
</script>
|
||||
<style>
|
||||
.sub-menu cite {
|
||||
margin-left: 0px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 顶部开始 -->
|
||||
<div class="container">
|
||||
<div class="logo"><a>SOP Admin</a></div>
|
||||
<div class="left_open">
|
||||
<i title="展开左侧栏" class="iconfont"></i>
|
||||
</div>
|
||||
<ul class="layui-nav right" lay-filter="">
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">admin</a>
|
||||
<dl class="layui-nav-child"> <!-- 二级菜单 -->
|
||||
<dd><a href="pages/login.html">退出</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- 顶部结束 -->
|
||||
<!-- 中部开始 -->
|
||||
<!-- 左侧菜单开始 -->
|
||||
<div class="left-nav">
|
||||
<div id="side-nav">
|
||||
<ul id="nav">
|
||||
<li date-refresh="1">
|
||||
<a href="pages/welcome.html">
|
||||
<i class="layui-icon layui-icon-home"></i>
|
||||
<cite>首页</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="open">
|
||||
<a>
|
||||
<i class="layui-icon layui-icon-template-1"></i>
|
||||
<cite>配置管理</cite>
|
||||
</a>
|
||||
<ul class="sub-menu">
|
||||
<li date-refresh="1">
|
||||
<a href="pages/todo.html">
|
||||
<i class="layui-icon layui-icon-table"></i>
|
||||
<cite>配置列表</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="open">
|
||||
<a>
|
||||
<i class="layui-icon layui-icon-app"></i>
|
||||
<cite>服务管理</cite>
|
||||
</a>
|
||||
<ul class="sub-menu">
|
||||
<li date-refresh="1">
|
||||
<a href="pages/service/serviceList.html">
|
||||
<i class="layui-icon layui-icon-table"></i>
|
||||
<cite>服务列表</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li date-refresh="1">
|
||||
<a href="pages/service/routeManager.html">
|
||||
<i class="layui-icon layui-icon-component"></i>
|
||||
<cite>路由管理</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="open">
|
||||
<a>
|
||||
<i class="layui-icon layui-icon-layer"></i>
|
||||
<cite>ISV管理</cite>
|
||||
</a>
|
||||
<ul class="sub-menu">
|
||||
<li date-refresh="1">
|
||||
<a href="pages/isv/isvList.html">
|
||||
<i class="layui-icon layui-icon-table"></i>
|
||||
<cite>ISV列表</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="x-slide_left"></div> -->
|
||||
<!-- 左侧菜单结束 -->
|
||||
<!-- 右侧主体开始 -->
|
||||
<div class="page-content">
|
||||
<iframe id="pageFrame" src='pages/welcome.html' frameborder="0" scrolling="yes" class="x-iframe" width="100%" height="100%"></iframe>
|
||||
</div>
|
||||
<div class="page-content-bg"></div>
|
||||
<!-- 右侧主体结束 -->
|
||||
<!-- 中部结束 -->
|
||||
<!-- 底部开始 -->
|
||||
<div class="footer">
|
||||
<div class="copyright">Copyright ©2019 SOP All Rights Reserved</div>
|
||||
</div>
|
||||
<!-- 底部结束 -->
|
||||
</body>
|
||||
</html>
|
120
sop-admin/sop-admin-front/pages/dashboard/dashboard.html
Normal file
120
sop-admin/sop-admin-front/pages/dashboard/dashboard.html
Normal file
@@ -0,0 +1,120 @@
|
||||
<!doctype html>
|
||||
<html class="x-admin-sm">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>SOP Admin</title>
|
||||
<meta name="renderer" content="webkit|ie-comp|ie-stand">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport"
|
||||
content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8"/>
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp"/>
|
||||
<link rel="stylesheet" href="../../assets/css/font.css">
|
||||
<link rel="stylesheet" href="../../assets/css/xadmin.css">
|
||||
<script>
|
||||
// 是否开启刷新记忆tab功能
|
||||
// var is_remember = false;
|
||||
</script>
|
||||
<style>
|
||||
.sub-menu cite {
|
||||
margin-left: 0px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 顶部开始 -->
|
||||
<div class="container">
|
||||
<div class="logo"><a>SOP Admin</a></div>
|
||||
<div class="left_open">
|
||||
<i title="展开左侧栏" class="iconfont"></i>
|
||||
</div>
|
||||
<ul class="layui-nav right" lay-filter="">
|
||||
<li class="layui-nav-item">
|
||||
<a id="username" href="javascript:;"></a>
|
||||
<dl class="layui-nav-child"> <!-- 二级菜单 -->
|
||||
<dd><a href="#" onclick="ApiUtil.logout(); return false;">退出</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- 顶部结束 -->
|
||||
<!-- 中部开始 -->
|
||||
<!-- 左侧菜单开始 -->
|
||||
<div class="left-nav">
|
||||
<div id="side-nav">
|
||||
<ul id="nav">
|
||||
<li date-refresh="1">
|
||||
<a href="welcome.html">
|
||||
<i class="layui-icon layui-icon-home"></i>
|
||||
<cite>首页</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li class="open">
|
||||
<a>
|
||||
<i class="layui-icon layui-icon-template-1"></i>
|
||||
<cite>配置管理</cite>
|
||||
</a>
|
||||
<ul class="sub-menu">
|
||||
<li date-refresh="1">
|
||||
<a href="todo.html">
|
||||
<i class="layui-icon layui-icon-table"></i>
|
||||
<cite>配置列表</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="open">
|
||||
<a>
|
||||
<i class="layui-icon layui-icon-app"></i>
|
||||
<cite>服务管理</cite>
|
||||
</a>
|
||||
<ul class="sub-menu">
|
||||
<li date-refresh="1">
|
||||
<a href="../service/serviceList.html">
|
||||
<i class="layui-icon layui-icon-table"></i>
|
||||
<cite>服务列表</cite>
|
||||
</a>
|
||||
</li>
|
||||
<li date-refresh="1">
|
||||
<a href="../service/routeManager.html">
|
||||
<i class="layui-icon layui-icon-component"></i>
|
||||
<cite>路由管理</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="open">
|
||||
<a>
|
||||
<i class="layui-icon layui-icon-layer"></i>
|
||||
<cite>ISV管理</cite>
|
||||
</a>
|
||||
<ul class="sub-menu">
|
||||
<li date-refresh="1">
|
||||
<a href="../isv/isvList.html">
|
||||
<i class="layui-icon layui-icon-table"></i>
|
||||
<cite>ISV列表</cite>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="x-slide_left"></div> -->
|
||||
<!-- 左侧菜单结束 -->
|
||||
<!-- 右侧主体开始 -->
|
||||
<div class="page-content">
|
||||
<iframe id="pageFrame" src='welcome.html' frameborder="0" scrolling="yes" class="x-iframe" width="100%" height="100%"></iframe>
|
||||
</div>
|
||||
<div class="page-content-bg"></div>
|
||||
<!-- 右侧主体结束 -->
|
||||
<!-- 中部结束 -->
|
||||
<!-- 底部开始 -->
|
||||
<div class="footer">
|
||||
<div class="copyright">Copyright ©2019 SOP All Rights Reserved</div>
|
||||
</div>
|
||||
<!-- 底部结束 -->
|
||||
<script type="text/javascript" src="../../assets/js/lib.js"></script>
|
||||
<script type="text/javascript" src="dashboard.js"></script>
|
||||
</body>
|
||||
</html>
|
38
sop-admin/sop-admin-front/pages/dashboard/dashboard.js
Normal file
38
sop-admin/sop-admin-front/pages/dashboard/dashboard.js
Normal file
@@ -0,0 +1,38 @@
|
||||
lib.use('element', function () {
|
||||
var $ = layui.jquery;
|
||||
var $pageFrame = $('#pageFrame');
|
||||
var $selectLi = null;
|
||||
$('.left-nav').on('click', 'li', function (event) {
|
||||
var $tagLi = $(this);
|
||||
var $tagA = $tagLi.find('a').eq(0);
|
||||
var href = $tagA.prop('href');
|
||||
if (href) {
|
||||
$pageFrame.prop('src', href + '?q=' + new Date().getTime());
|
||||
if ($selectLi) {
|
||||
$selectLi.removeClass('active')
|
||||
}
|
||||
$selectLi = $tagLi.addClass('active');
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.container .left_open i').click(function(event) {
|
||||
if($('.left-nav').css('left')=='0px'){
|
||||
$('.left-nav').animate({left: '-221px'}, 100);
|
||||
$('.page-content').animate({left: '0px'}, 100);
|
||||
$('.page-content-bg').hide();
|
||||
}else{
|
||||
$('.left-nav').animate({left: '0px'}, 100);
|
||||
$('.page-content').animate({left: '221px'}, 100);
|
||||
if($(window).width()<768){
|
||||
$('.page-content-bg').show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
ApiUtil.post('admin.userinfo.get', {}, function (resp) {
|
||||
var userInfo = resp.data;
|
||||
$('#username').text(userInfo.username);
|
||||
});
|
||||
|
||||
});
|
@@ -7,8 +7,8 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport"
|
||||
content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8"/>
|
||||
<link rel="stylesheet" href="../assets/css/font.css">
|
||||
<link rel="stylesheet" href="../assets/css/xadmin.css">
|
||||
<link rel="stylesheet" href="../../assets/css/font.css">
|
||||
<link rel="stylesheet" href="../../assets/css/xadmin.css">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
@@ -21,15 +21,14 @@
|
||||
<i class="layui-icon layui-icon-refresh" style="line-height:30px"></i></a>
|
||||
</div>
|
||||
<div class="x-body">
|
||||
<blockquote class="layui-elem-quote">欢迎管理员:
|
||||
<span class="x-red">admin</span>!
|
||||
<blockquote class="layui-elem-quote">
|
||||
欢迎使用SOP Admin
|
||||
</blockquote>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../assets/lib/layui/layui.js" charset="utf-8"></script>
|
||||
<script type="text/javascript" src="../../assets/lib/layui/layui.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use('element', function () {
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@@ -16,7 +16,7 @@
|
||||
<body>
|
||||
<div class="x-nav">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="../welcome.html">首页</a>
|
||||
<a href="../dashboard/welcome.html">首页</a>
|
||||
<a><cite>ISV管理</cite></a>
|
||||
<a href="isvList.html">ISV列表</a>
|
||||
<a><cite>添加ISV</cite></a>
|
||||
|
@@ -13,7 +13,7 @@
|
||||
<body>
|
||||
<div class="x-nav">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="../welcome.html">首页</a>
|
||||
<a href="../dashboard/welcome.html">首页</a>
|
||||
<a><cite>ISV管理</cite></a>
|
||||
<a><cite>ISV列表</cite></a>
|
||||
</span>
|
||||
|
@@ -11,9 +11,6 @@ lib.use(['element', 'table', 'form'], function () {
|
||||
|
||||
// 渲染表格
|
||||
var renderTable = function (postData) {
|
||||
var params = {
|
||||
data: JSON.stringify(postData || {})
|
||||
};
|
||||
layer.load(2);
|
||||
isvTable = table.render({
|
||||
elem: '#isvTable'
|
||||
@@ -25,7 +22,8 @@ lib.use(['element', 'table', 'form'], function () {
|
||||
,limitName: 'pageSize' //每页数据量的参数名,默认:limit
|
||||
}
|
||||
, page: true
|
||||
, where: params
|
||||
, headers: {access_token: ApiUtil.getAccessToken()}
|
||||
, where: postData
|
||||
, cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
|
||||
, cols: [[
|
||||
{field: 'id', title: 'id', width: 80}
|
||||
@@ -83,14 +81,31 @@ lib.use(['element', 'table', 'form'], function () {
|
||||
});
|
||||
};
|
||||
|
||||
renderTable();
|
||||
|
||||
form.on('submit(searchFilter)', function(data){
|
||||
var param = data.field;
|
||||
renderTable(param)
|
||||
searchTable(param)
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* 查询表格
|
||||
* @param params
|
||||
*/
|
||||
function searchTable(params) {
|
||||
var postData = {
|
||||
data: JSON.stringify(params || {})
|
||||
};
|
||||
if (!isvTable) {
|
||||
isvTable = renderTable(postData);
|
||||
} else {
|
||||
isvTable.reload({
|
||||
where: postData
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
searchTable();
|
||||
|
||||
|
||||
window.View = {
|
||||
secret: function (secret) {
|
||||
|
@@ -16,7 +16,7 @@
|
||||
<body>
|
||||
<div class="x-nav">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="../welcome.html">首页</a>
|
||||
<a href="../dashboard/welcome.html">首页</a>
|
||||
<a><cite>ISV管理</cite></a>
|
||||
<a href="isvList.html">ISV列表</a>
|
||||
<a><cite>修改ISV</cite></a>
|
||||
|
57
sop-admin/sop-admin-front/pages/login/login.html
Normal file
57
sop-admin/sop-admin-front/pages/login/login.html
Normal file
@@ -0,0 +1,57 @@
|
||||
<!doctype html>
|
||||
<html class="x-admin-sm">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>SOP-管理登录</title>
|
||||
<meta name="renderer" content="webkit|ie-comp|ie-stand">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport"
|
||||
content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp"/>
|
||||
<link rel="stylesheet" href="../../assets/css/font.css">
|
||||
<link rel="stylesheet" href="../../assets/css/xadmin.css">
|
||||
</head>
|
||||
<body class="login-bg">
|
||||
|
||||
<div class="login layui-anim layui-anim-up">
|
||||
<div class="message">SOP Admin登录</div>
|
||||
<div id="darkbannerwrap"></div>
|
||||
|
||||
<form method="post" class="layui-form">
|
||||
<input name="username" placeholder="用户名" type="text" lay-verify="required" class="layui-input">
|
||||
<hr class="hr15">
|
||||
<input name="password" lay-verify="required" placeholder="密码" type="password" class="layui-input">
|
||||
<hr class="hr15">
|
||||
<input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
|
||||
<hr class="hr20">
|
||||
</form>
|
||||
</div>
|
||||
<script type="text/javascript" src="../../assets/js/lib.js"></script>
|
||||
<script>
|
||||
lib.use('form', function () {
|
||||
var form = layui.form;
|
||||
//监听提交
|
||||
form.on('submit(login)', function (param) {
|
||||
var data = param.field;
|
||||
var pwd = data.password;
|
||||
if(!pwd) {
|
||||
alert('密码不能为空');
|
||||
return false;
|
||||
}
|
||||
pwd = hex_md5(pwd);
|
||||
ApiUtil.post('nologin.admin.login',{
|
||||
username:data.username,
|
||||
password:pwd
|
||||
},function(resp){
|
||||
ApiUtil.setAccessToken(resp.data);
|
||||
window.location = '../../index.html';
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
<!-- 底部结束 -->
|
||||
</body>
|
||||
</html>
|
@@ -13,7 +13,7 @@
|
||||
<body>
|
||||
<div class="x-nav">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="../welcome.html">首页</a>
|
||||
<a href="../dashboard/welcome.html">首页</a>
|
||||
<a><cite>服务管理</cite></a>
|
||||
<a><cite>路由管理</cite></a>
|
||||
</span>
|
||||
|
@@ -117,6 +117,7 @@ lib.importJs('../../assets/js/routerole.js')
|
||||
, toolbar: '#toolbar'
|
||||
, url: ApiUtil.createUrl('route.list')
|
||||
, where: postData
|
||||
, headers: {access_token: ApiUtil.getAccessToken()}
|
||||
, cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
|
||||
, cols: [[
|
||||
{field: 'id', title: 'id(接口名+版本号)'}
|
||||
|
@@ -13,7 +13,7 @@
|
||||
<body>
|
||||
<div class="x-nav">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="../welcome.html">首页</a>
|
||||
<a href="../dashboard/welcome.html">首页</a>
|
||||
<a><cite>服务管理</cite></a>
|
||||
<a><cite>服务列表</cite></a>
|
||||
</span>
|
||||
|
@@ -9,8 +9,11 @@ lib.config({
|
||||
var treetable = layui.treetable;
|
||||
|
||||
// 渲染表格
|
||||
var renderTable = function (params) {
|
||||
var renderTable = function (postData) {
|
||||
layer.load(2);
|
||||
var params = {
|
||||
data: JSON.stringify(postData || {})
|
||||
};
|
||||
treetable.render({
|
||||
elem: '#treeTable',
|
||||
treeColIndex: 1,
|
||||
@@ -19,7 +22,9 @@ lib.config({
|
||||
treePidName: 'parentId',
|
||||
treeDefaultClose: false,
|
||||
treeLinkage: false,
|
||||
url: ApiUtil.createUrl('service.instance.list', params),
|
||||
url: ApiUtil.createUrl('service.instance.list'),
|
||||
headers: {access_token: ApiUtil.getAccessToken()},
|
||||
where: params,
|
||||
page: false,
|
||||
cols: [[
|
||||
{type: 'numbers'},
|
||||
|
@@ -1,14 +1,23 @@
|
||||
package com.gitee.sop.adminserver.api.system;
|
||||
|
||||
import com.gitee.easyopen.ApiContext;
|
||||
import com.gitee.easyopen.annotation.Api;
|
||||
import com.gitee.easyopen.annotation.ApiService;
|
||||
import com.gitee.easyopen.doc.annotation.ApiDoc;
|
||||
import com.gitee.easyopen.doc.annotation.ApiDocMethod;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import com.gitee.easyopen.session.SessionManager;
|
||||
import com.gitee.fastmybatis.core.query.Query;
|
||||
import com.gitee.sop.adminserver.api.system.param.LoginForm;
|
||||
import com.gitee.sop.adminserver.api.system.result.AdminUserInfoVO;
|
||||
import com.gitee.sop.adminserver.common.AdminErrors;
|
||||
import com.gitee.sop.adminserver.common.WebContext;
|
||||
import com.gitee.sop.adminserver.entity.AdminUserInfo;
|
||||
import com.gitee.sop.adminserver.mapper.AdminUserInfoMapper;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
@@ -18,4 +27,39 @@ import java.util.stream.Stream;
|
||||
public class SystemApi {
|
||||
|
||||
|
||||
@Autowired
|
||||
AdminUserInfoMapper adminUserInfoMapper;
|
||||
|
||||
@Api(name = "nologin.admin.login")
|
||||
@ApiDocMethod(description = "用户登录")
|
||||
String adminLogin(LoginForm param) {
|
||||
String username = param.getUsername();
|
||||
String password = param.getPassword();
|
||||
password = DigestUtils.md5Hex(password);
|
||||
|
||||
Query query = new Query()
|
||||
.eq("username", username)
|
||||
.eq("password", password);
|
||||
AdminUserInfo user = adminUserInfoMapper.getByQuery(query);
|
||||
|
||||
if (user == null) {
|
||||
throw AdminErrors.ERROR_USERNAME_PWD.getException();
|
||||
} else {
|
||||
SessionManager sessionManager = ApiContext.getSessionManager();
|
||||
// 生成一个新session
|
||||
HttpSession session = sessionManager.getSession(null);
|
||||
WebContext.getInstance().setLoginUser(session, user);
|
||||
return session.getId();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Api(name = "admin.userinfo.get")
|
||||
@ApiDocMethod(description = "获取用户信息")
|
||||
AdminUserInfoVO getAdminUserInfo() {
|
||||
AdminUserInfo loginUser = WebContext.getInstance().getLoginUser();
|
||||
AdminUserInfoVO adminUserInfoVO = new AdminUserInfoVO();
|
||||
BeanUtils.copyProperties(loginUser, adminUserInfoVO);
|
||||
return adminUserInfoVO;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,9 @@
|
||||
package com.gitee.sop.adminserver.api.system.param;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LoginForm {
|
||||
private String username;
|
||||
private String password;
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.gitee.sop.adminserver.api.system.result;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
@Data
|
||||
public class AdminUserInfoVO {
|
||||
/**
|
||||
* 数据库字段:id
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 用户名, 数据库字段:username
|
||||
*/
|
||||
private String username;
|
||||
|
||||
}
|
@@ -0,0 +1,35 @@
|
||||
package com.gitee.sop.adminserver.common;
|
||||
|
||||
import com.gitee.easyopen.message.ErrorMeta;
|
||||
|
||||
/**
|
||||
* 定义错误的地方
|
||||
* @author tanghc
|
||||
*/
|
||||
public class AdminErrors {
|
||||
private AdminErrors(){}
|
||||
|
||||
static String isvModule = "isv.error_"; // error_zh_CN2.properties内容前缀
|
||||
|
||||
|
||||
public static final ErrorMeta NO_LOGIN = new ErrorMeta(isvModule, "-100", "用户未登录");
|
||||
|
||||
public static final ErrorMeta ERROR_USERNAME_PWD = new ErrorMeta(isvModule, "1", "用户名密码错误");
|
||||
public static final ErrorMeta DUPLICATE_USERNAME = new ErrorMeta(isvModule, "2", "该用户名已被注册");
|
||||
|
||||
public static final ErrorMeta NO_RECORD = new ErrorMeta(isvModule, "1000", "无操作记录");
|
||||
public static final ErrorMeta ERROR_VALIDATE = new ErrorMeta(isvModule, "1001", "验证失败");
|
||||
public static final ErrorMeta NULL_OBJECT = new ErrorMeta(isvModule, "1002", "null对象");
|
||||
public static final ErrorMeta ERROR_SERACH = new ErrorMeta(isvModule, "1004", "查询错误");
|
||||
public static final ErrorMeta ERROR_EXPORT = new ErrorMeta(isvModule, "1005", "导出错误");
|
||||
public static final ErrorMeta CLASS_NEW_ERROR = new ErrorMeta(isvModule, "1007", "系统错误");
|
||||
|
||||
public static final ErrorMeta ERROR_SAVE = new ErrorMeta(isvModule, "10010", "保存失败");
|
||||
public static final ErrorMeta ERROR_UPDATE = new ErrorMeta(isvModule, "10011", "修改失败");
|
||||
public static final ErrorMeta DELETE_UPDATE = new ErrorMeta(isvModule, "10012", "删除失败");
|
||||
public static final ErrorMeta RECORD_EXSIT = new ErrorMeta(isvModule, "10013", "记录已存在");
|
||||
public static final ErrorMeta ERROR_OPT = new ErrorMeta(isvModule, "10014", "非法操作");
|
||||
|
||||
public static final ErrorMeta NO_USER = new ErrorMeta(isvModule, "10015", "用户不存在");
|
||||
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
package com.gitee.sop.adminserver.common;
|
||||
|
||||
import com.gitee.easyopen.ApiContext;
|
||||
import com.gitee.sop.adminserver.entity.AdminUserInfo;
|
||||
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
public class WebContext {
|
||||
private static WebContext INSTANCE = new WebContext();
|
||||
|
||||
private static final String S_USER = "s_user";
|
||||
|
||||
private WebContext() {
|
||||
}
|
||||
|
||||
public static WebContext getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前登录用户
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public AdminUserInfo getLoginUser() {
|
||||
HttpSession session = ApiContext.getManagedSession();
|
||||
if (session == null) {
|
||||
return null;
|
||||
}
|
||||
return (AdminUserInfo) session.getAttribute(S_USER);
|
||||
}
|
||||
|
||||
public void setLoginUser(HttpSession session, AdminUserInfo user) {
|
||||
if (session != null) {
|
||||
session.setAttribute(S_USER, user);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -3,11 +3,16 @@ package com.gitee.sop.adminserver.config;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import com.gitee.easyopen.ApiConfig;
|
||||
import com.gitee.easyopen.ResultSerializer;
|
||||
import com.gitee.easyopen.interceptor.ApiInterceptor;
|
||||
import com.gitee.easyopen.session.ApiSessionManager;
|
||||
import com.gitee.sop.adminserver.interceptor.LoginInterceptor;
|
||||
import org.apache.commons.lang.math.NumberUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
|
||||
|
||||
@@ -18,6 +23,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp
|
||||
@Configuration
|
||||
public class WebConfig extends WebMvcConfigurationSupport {
|
||||
|
||||
@Value("${admin.access-token.timeout-minutes}")
|
||||
private String accessTokenTimeout;
|
||||
|
||||
@Bean
|
||||
ApiConfig apiConfig() {
|
||||
@@ -25,9 +32,17 @@ public class WebConfig extends WebMvcConfigurationSupport {
|
||||
apiConfig.setJsonResultSerializer(obj -> {
|
||||
return JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
|
||||
});
|
||||
ApiSessionManager apiSessionManager = new ApiSessionManager();
|
||||
// session有效期
|
||||
int timeout = NumberUtils.toInt(accessTokenTimeout, 30);
|
||||
apiSessionManager.setSessionTimeout(timeout);
|
||||
apiConfig.setSessionManager(apiSessionManager);
|
||||
// 登录拦截器
|
||||
apiConfig.setInterceptors(new ApiInterceptor[]{new LoginInterceptor()});
|
||||
return apiConfig;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
//配置映射关系
|
||||
|
@@ -0,0 +1,43 @@
|
||||
package com.gitee.sop.adminserver.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
|
||||
/**
|
||||
* 表名:admin_user_info
|
||||
* 备注:后台用户表
|
||||
*
|
||||
* @author tanghc
|
||||
*/
|
||||
@Table(name = "admin_user_info")
|
||||
@Data
|
||||
public class AdminUserInfo {
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
/** 数据库字段:id */
|
||||
private Long id;
|
||||
|
||||
/** 用户名, 数据库字段:username */
|
||||
private String username;
|
||||
|
||||
/** 密码, 数据库字段:password */
|
||||
private String password;
|
||||
|
||||
/** 状态,1:启用,2:禁用, 数据库字段:status */
|
||||
private Byte status;
|
||||
|
||||
/** 数据库字段:gmt_create */
|
||||
private Date gmtCreate;
|
||||
|
||||
/** 数据库字段:gmt_modified */
|
||||
private Date gmtModified;
|
||||
}
|
@@ -0,0 +1,47 @@
|
||||
package com.gitee.sop.adminserver.interceptor;
|
||||
|
||||
import com.gitee.easyopen.ApiContext;
|
||||
import com.gitee.easyopen.ApiMeta;
|
||||
import com.gitee.easyopen.ParamNames;
|
||||
import com.gitee.easyopen.interceptor.ApiInterceptorAdapter;
|
||||
import com.gitee.sop.adminserver.common.AdminErrors;
|
||||
import com.gitee.sop.adminserver.common.WebContext;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* 登录拦截器,验证用户是否登录
|
||||
*
|
||||
* @author tanghc
|
||||
*/
|
||||
public class LoginInterceptor extends ApiInterceptorAdapter {
|
||||
|
||||
public static final String HEADER_TOKEN_NAME = ParamNames.ACCESS_TOKEN_NAME;
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu)
|
||||
throws Exception {
|
||||
String accessToken = request.getHeader(HEADER_TOKEN_NAME);
|
||||
if (StringUtils.isNotBlank(accessToken)) {
|
||||
ApiContext.getApiParam().put(ParamNames.ACCESS_TOKEN_NAME, accessToken);
|
||||
}
|
||||
if (WebContext.getInstance().getLoginUser() != null) {
|
||||
return true;
|
||||
} else {
|
||||
throw AdminErrors.NO_LOGIN.getException();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean match(ApiMeta apiMeta) {
|
||||
String name = apiMeta.getName();
|
||||
if (name.startsWith("nologin.")) { // 以‘nologin.’开头的接口不拦截
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,12 @@
|
||||
package com.gitee.sop.adminserver.mapper;
|
||||
|
||||
import com.gitee.fastmybatis.core.mapper.CrudMapper;
|
||||
|
||||
import com.gitee.sop.adminserver.entity.AdminUserInfo;
|
||||
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
public interface AdminUserInfoMapper extends CrudMapper<AdminUserInfo, Long> {
|
||||
}
|
@@ -1,6 +1,11 @@
|
||||
server:
|
||||
port: 8082
|
||||
|
||||
# token过期时间,分钟
|
||||
admin:
|
||||
access-token:
|
||||
timeout-minutes: 30
|
||||
|
||||
# 不用改
|
||||
spring:
|
||||
application:
|
||||
|
Reference in New Issue
Block a user