From 85e98f1e1473cf759af959b4ad767c062490fc11 Mon Sep 17 00:00:00 2001 From: tanghc Date: Wed, 3 Apr 2019 10:47:46 +0800 Subject: [PATCH] =?UTF-8?q?admin=E5=90=8E=E5=8F=B0=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/files/10010_快速体验.md | 2 + .../sop-admin-front/assets/js/ApiUtil.js | 19 ++- sop-admin/sop-admin-front/assets/js/index.js | 9 +- .../module/treetable-lay/treetable.js | 16 ++- sop-admin/sop-admin-front/index.html | 110 +--------------- .../pages/dashboard/dashboard.html | 120 ++++++++++++++++++ .../pages/dashboard/dashboard.js | 38 ++++++ .../pages/{ => dashboard}/todo.html | 0 .../pages/{ => dashboard}/welcome.html | 13 +- .../sop-admin-front/pages/isv/isvAdd.html | 2 +- .../sop-admin-front/pages/isv/isvList.html | 2 +- .../sop-admin-front/pages/isv/isvList.js | 29 ++++- .../sop-admin-front/pages/isv/isvUpdate.html | 2 +- .../sop-admin-front/pages/login/login.html | 57 +++++++++ .../pages/service/routeManager.html | 2 +- .../pages/service/routeManager.js | 1 + .../pages/service/serviceList.html | 2 +- .../pages/service/serviceList.js | 9 +- .../sop/adminserver/api/system/SystemApi.java | 52 +++++++- .../api/system/param/LoginForm.java | 9 ++ .../api/system/result/AdminUserInfoVO.java | 20 +++ .../sop/adminserver/common/AdminErrors.java | 35 +++++ .../sop/adminserver/common/WebContext.java | 40 ++++++ .../sop/adminserver/config/WebConfig.java | 17 ++- .../sop/adminserver/entity/AdminUserInfo.java | 43 +++++++ .../interceptor/LoginInterceptor.java | 47 +++++++ .../mapper/AdminUserInfoMapper.java | 12 ++ .../src/main/resources/application-dev.yml | 5 + 28 files changed, 572 insertions(+), 141 deletions(-) create mode 100644 sop-admin/sop-admin-front/pages/dashboard/dashboard.html create mode 100644 sop-admin/sop-admin-front/pages/dashboard/dashboard.js rename sop-admin/sop-admin-front/pages/{ => dashboard}/todo.html (100%) rename sop-admin/sop-admin-front/pages/{ => dashboard}/welcome.html (68%) create mode 100644 sop-admin/sop-admin-front/pages/login/login.html create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/param/LoginForm.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/result/AdminUserInfoVO.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/AdminErrors.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/WebContext.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/AdminUserInfo.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/interceptor/LoginInterceptor.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/AdminUserInfoMapper.java diff --git a/doc/docs/files/10010_快速体验.md b/doc/docs/files/10010_快速体验.md index d2954f03..cafae7e3 100644 --- a/doc/docs/files/10010_快速体验.md +++ b/doc/docs/files/10010_快速体验.md @@ -19,4 +19,6 @@ - 找到`sop-admin/sop-admin-front/index.html`文件,在IDEA下直接右键--Run'index.html' - 如果没有用到IDEA,则需要把sop-admin-front放到静态服务器中然后访问index.html +登录账号:admin/123456 + diff --git a/sop-admin/sop-admin-front/assets/js/ApiUtil.js b/sop-admin/sop-admin-front/assets/js/ApiUtil.js index e1432516..f5f4694d 100644 --- a/sop-admin/sop-admin-front/assets/js/ApiUtil.js +++ b/sop-admin/sop-admin-front/assets/js/ApiUtil.js @@ -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; } diff --git a/sop-admin/sop-admin-front/assets/js/index.js b/sop-admin/sop-admin-front/assets/js/index.js index a4be6a41..ceb7ee20 100644 --- a/sop-admin/sop-admin-front/assets/js/index.js +++ b/sop-admin/sop-admin-front/assets/js/index.js @@ -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); + }); + }); \ No newline at end of file diff --git a/sop-admin/sop-admin-front/assets/lib/layuiext/module/treetable-lay/treetable.js b/sop-admin/sop-admin-front/assets/lib/layuiext/module/treetable-lay/treetable.js index e38a5e1c..c95dec07 100644 --- a/sop-admin/sop-admin-front/assets/lib/layuiext/module/treetable-lay/treetable.js +++ b/sop-admin/sop-admin-front/assets/lib/layuiext/module/treetable-lay/treetable.js @@ -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); + } + }) } }, // 渲染表格 diff --git a/sop-admin/sop-admin-front/index.html b/sop-admin/sop-admin-front/index.html index 98da75e1..35158e0b 100644 --- a/sop-admin/sop-admin-front/index.html +++ b/sop-admin/sop-admin-front/index.html @@ -3,118 +3,10 @@ SOP Admin - - - - - - - - - - -
- -
- -
- - -
- - - -
- -
- - - -
- -
-
- - - - - \ No newline at end of file diff --git a/sop-admin/sop-admin-front/pages/dashboard/dashboard.html b/sop-admin/sop-admin-front/pages/dashboard/dashboard.html new file mode 100644 index 00000000..b610e3c8 --- /dev/null +++ b/sop-admin/sop-admin-front/pages/dashboard/dashboard.html @@ -0,0 +1,120 @@ + + + + + SOP Admin + + + + + + + + + + + +
+ +
+ +
+ + +
+ + + +
+ +
+ + + +
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/sop-admin/sop-admin-front/pages/dashboard/dashboard.js b/sop-admin/sop-admin-front/pages/dashboard/dashboard.js new file mode 100644 index 00000000..642b91af --- /dev/null +++ b/sop-admin/sop-admin-front/pages/dashboard/dashboard.js @@ -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); + }); + +}); \ No newline at end of file diff --git a/sop-admin/sop-admin-front/pages/todo.html b/sop-admin/sop-admin-front/pages/dashboard/todo.html similarity index 100% rename from sop-admin/sop-admin-front/pages/todo.html rename to sop-admin/sop-admin-front/pages/dashboard/todo.html diff --git a/sop-admin/sop-admin-front/pages/welcome.html b/sop-admin/sop-admin-front/pages/dashboard/welcome.html similarity index 68% rename from sop-admin/sop-admin-front/pages/welcome.html rename to sop-admin/sop-admin-front/pages/dashboard/welcome.html index 21d26465..265a258e 100644 --- a/sop-admin/sop-admin-front/pages/welcome.html +++ b/sop-admin/sop-admin-front/pages/dashboard/welcome.html @@ -7,8 +7,8 @@ - - + + @@ -21,15 +21,14 @@
-
欢迎管理员: - admin! +
+ 欢迎使用SOP Admin
- + \ No newline at end of file diff --git a/sop-admin/sop-admin-front/pages/isv/isvAdd.html b/sop-admin/sop-admin-front/pages/isv/isvAdd.html index 7c852b11..12061264 100644 --- a/sop-admin/sop-admin-front/pages/isv/isvAdd.html +++ b/sop-admin/sop-admin-front/pages/isv/isvAdd.html @@ -16,7 +16,7 @@
- 首页 + 首页 ISV管理 ISV列表 添加ISV diff --git a/sop-admin/sop-admin-front/pages/isv/isvList.html b/sop-admin/sop-admin-front/pages/isv/isvList.html index 36d70c60..946dd1a8 100644 --- a/sop-admin/sop-admin-front/pages/isv/isvList.html +++ b/sop-admin/sop-admin-front/pages/isv/isvList.html @@ -13,7 +13,7 @@
- 首页 + 首页 ISV管理 ISV列表 diff --git a/sop-admin/sop-admin-front/pages/isv/isvList.js b/sop-admin/sop-admin-front/pages/isv/isvList.js index 60057629..4877c49a 100644 --- a/sop-admin/sop-admin-front/pages/isv/isvList.js +++ b/sop-admin/sop-admin-front/pages/isv/isvList.js @@ -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) { diff --git a/sop-admin/sop-admin-front/pages/isv/isvUpdate.html b/sop-admin/sop-admin-front/pages/isv/isvUpdate.html index 87232a78..976e4079 100644 --- a/sop-admin/sop-admin-front/pages/isv/isvUpdate.html +++ b/sop-admin/sop-admin-front/pages/isv/isvUpdate.html @@ -16,7 +16,7 @@
- 首页 + 首页 ISV管理 ISV列表 修改ISV diff --git a/sop-admin/sop-admin-front/pages/login/login.html b/sop-admin/sop-admin-front/pages/login/login.html new file mode 100644 index 00000000..3ad66801 --- /dev/null +++ b/sop-admin/sop-admin-front/pages/login/login.html @@ -0,0 +1,57 @@ + + + + + SOP-管理登录 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sop-admin/sop-admin-front/pages/service/routeManager.html b/sop-admin/sop-admin-front/pages/service/routeManager.html index 3263de68..eac883c0 100644 --- a/sop-admin/sop-admin-front/pages/service/routeManager.html +++ b/sop-admin/sop-admin-front/pages/service/routeManager.html @@ -13,7 +13,7 @@
- 首页 + 首页 服务管理 路由管理 diff --git a/sop-admin/sop-admin-front/pages/service/routeManager.js b/sop-admin/sop-admin-front/pages/service/routeManager.js index dfda8062..62022553 100644 --- a/sop-admin/sop-admin-front/pages/service/routeManager.js +++ b/sop-admin/sop-admin-front/pages/service/routeManager.js @@ -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(接口名+版本号)'} diff --git a/sop-admin/sop-admin-front/pages/service/serviceList.html b/sop-admin/sop-admin-front/pages/service/serviceList.html index 50c44e90..463a449b 100644 --- a/sop-admin/sop-admin-front/pages/service/serviceList.html +++ b/sop-admin/sop-admin-front/pages/service/serviceList.html @@ -13,7 +13,7 @@
- 首页 + 首页 服务管理 服务列表 diff --git a/sop-admin/sop-admin-front/pages/service/serviceList.js b/sop-admin/sop-admin-front/pages/service/serviceList.js index 223fbfc5..492563f4 100644 --- a/sop-admin/sop-admin-front/pages/service/serviceList.js +++ b/sop-admin/sop-admin-front/pages/service/serviceList.js @@ -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'}, diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/SystemApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/SystemApi.java index 7866d6b4..da92f48a 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/SystemApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/SystemApi.java @@ -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; + } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/param/LoginForm.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/param/LoginForm.java new file mode 100644 index 00000000..cfb7856b --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/param/LoginForm.java @@ -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; +} \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/result/AdminUserInfoVO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/result/AdminUserInfoVO.java new file mode 100644 index 00000000..50655267 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/system/result/AdminUserInfoVO.java @@ -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; + +} \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/AdminErrors.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/AdminErrors.java new file mode 100644 index 00000000..df6d36c8 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/AdminErrors.java @@ -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", "用户不存在"); + +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/WebContext.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/WebContext.java new file mode 100644 index 00000000..22e76c68 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/WebContext.java @@ -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); + } + } + + +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java index 66432830..d427edfa 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/config/WebConfig.java @@ -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) { //配置映射关系 diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/AdminUserInfo.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/AdminUserInfo.java new file mode 100644 index 00000000..22e1458a --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/AdminUserInfo.java @@ -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; +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/interceptor/LoginInterceptor.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/interceptor/LoginInterceptor.java new file mode 100644 index 00000000..aeb0938f --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/interceptor/LoginInterceptor.java @@ -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; + } + } + +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/AdminUserInfoMapper.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/AdminUserInfoMapper.java new file mode 100644 index 00000000..b117ebac --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/AdminUserInfoMapper.java @@ -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 { +} diff --git a/sop-admin/sop-admin-server/src/main/resources/application-dev.yml b/sop-admin/sop-admin-server/src/main/resources/application-dev.yml index d1b01de8..6d114c50 100644 --- a/sop-admin/sop-admin-server/src/main/resources/application-dev.yml +++ b/sop-admin/sop-admin-server/src/main/resources/application-dev.yml @@ -1,6 +1,11 @@ server: port: 8082 +# token过期时间,分钟 +admin: + access-token: + timeout-minutes: 30 + # 不用改 spring: application: