admin后台登录

1.x
tanghc 6 years ago
parent 0cdb9f9c65
commit 85e98f1e14
  1. 2
      doc/docs/files/10010_快速体验.md
  2. 19
      sop-admin/sop-admin-front/assets/js/ApiUtil.js
  3. 9
      sop-admin/sop-admin-front/assets/js/index.js
  4. 16
      sop-admin/sop-admin-front/assets/lib/layuiext/module/treetable-lay/treetable.js
  5. 110
      sop-admin/sop-admin-front/index.html
  6. 120
      sop-admin/sop-admin-front/pages/dashboard/dashboard.html
  7. 38
      sop-admin/sop-admin-front/pages/dashboard/dashboard.js
  8. 0
      sop-admin/sop-admin-front/pages/dashboard/todo.html
  9. 13
      sop-admin/sop-admin-front/pages/dashboard/welcome.html
  10. 2
      sop-admin/sop-admin-front/pages/isv/isvAdd.html
  11. 2
      sop-admin/sop-admin-front/pages/isv/isvList.html
  12. 29
      sop-admin/sop-admin-front/pages/isv/isvList.js
  13. 2
      sop-admin/sop-admin-front/pages/isv/isvUpdate.html
  14. 57
      sop-admin/sop-admin-front/pages/login/login.html
  15. 2
      sop-admin/sop-admin-front/pages/service/routeManager.html
  16. 1
      sop-admin/sop-admin-front/pages/service/routeManager.js
  17. 2
      sop-admin/sop-admin-front/pages/service/serviceList.html
  18. 9
      sop-admin/sop-admin-front/pages/service/serviceList.js
  19. 52
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/SystemApi.java
  20. 9
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/param/LoginForm.java
  21. 20
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/result/AdminUserInfoVO.java
  22. 35
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/AdminErrors.java
  23. 40
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/WebContext.java
  24. 17
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java
  25. 43
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/AdminUserInfo.java
  26. 47
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/interceptor/LoginInterceptor.java
  27. 12
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/AdminUserInfoMapper.java
  28. 5
      sop-admin/sop-admin-server/src/main/resources/application-dev.yml

@ -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) {
treetable.init(param, res.data);
});
// $.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">&#xe699;</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>

@ -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">&#xe699;</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>

@ -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>

@ -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:

Loading…
Cancel
Save