提交 6f9949c4 编写于 作者: Q qinxiaodong@pannk.com

更新项目代码

上级 e24a2288
......@@ -14,7 +14,7 @@ module.exports = {
// 代理列表, 是否开启代理通过[./dev.env.js]配置
proxyTable: devEnv.OPEN_PROXY === false ? {} : {
'/proxyApi': {
target: 'http://localhost:8080/',
target: 'http://127.0.0.1:8080/',
changeOrigin: true,
pathRewrite: {
'^/proxyApi': '/'
......@@ -23,8 +23,8 @@ module.exports = {
},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 8001, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
host: '127.0.0.1', // can be overwritten by process.env.HOST
port: 8002, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: true,
......
......@@ -68,8 +68,8 @@ router.beforeEach((to, from, next) => {
params: http.adornParams()
}).then(({data}) => {
if (data && data.code === 0) {
fnAddDynamicMenuRoutes(data.menuList)
router.options.isAddDynamicMenuRoutes = true
fnAddDynamicMenuRoutes(data.data.menuList)
router.options.isAddDynamicMenuRoutes = true
sessionStorage.setItem('menuList', JSON.stringify(data.data.menuList || '[]'))
sessionStorage.setItem('permissions', JSON.stringify(data.data.permissions || '[]'))
next({ ...to, replace: true })
......@@ -118,7 +118,7 @@ function fnAddDynamicMenuRoutes (menuList = [], routes = []) {
component: null,
name: menuList[i].url.replace('/', '-'),
meta: {
menuId: menuList[i].menuId,
menuId: menuList[i].id,
title: menuList[i].name,
isDynamic: true,
isTab: true,
......@@ -127,8 +127,8 @@ function fnAddDynamicMenuRoutes (menuList = [], routes = []) {
}
// url以http[s]://开头, 通过iframe展示
if (isURL(menuList[i].url)) {
route['path'] = `i-${menuList[i].menuId}`
route['name'] = `i-${menuList[i].menuId}`
route['path'] = `i-${menuList[i].id}`
route['name'] = `i-${menuList[i].id}`
route['meta']['iframeUrl'] = menuList[i].url
} else {
try {
......
......@@ -5,7 +5,8 @@ export default {
name: '',
code: '',
fullName: '',
gender: 0
gender: 0,
roles: []
},
mutations: {
updateId (state, id) {
......@@ -22,6 +23,9 @@ export default {
},
updateGender (state, gender) {
state.gender = gender
},
updateRoles (state, roles) {
state.roles = roles
}
}
}
......@@ -16,7 +16,7 @@ export function getUUID () {
* @param {*} key
*/
export function isAuth (key) {
return JSON.parse(sessionStorage.getItem('permissions') || '[]').indexOf(key) !== -1 || false
return JSON.parse(sessionStorage.getItem('permissions') || '[]').join('').indexOf(key) !== -1 || false
}
/**
......
......@@ -59,7 +59,7 @@
})
}).then(({data}) => {
if (data && data.code === 0) {
this.$cookie.set('token', data.token)
this.$cookie.set('token', data.data)
this.$router.replace({ name: 'home' })
} else {
this.$message.error(data.msg)
......
......@@ -23,19 +23,13 @@
<icon-svg name="shezhi" class="el-icon-setting"></icon-svg>
</el-badge>
</template>
</el-menu-item>
<el-menu-item index="2">
<el-badge value="hot">
<a href="https://www.renren.io/" target="_blank">官方社区</a>
</el-badge>
</el-menu-item>
</el-menu-item>
<el-submenu index="3">
<template slot="title">Git源码</template>
<el-menu-item index="2-1"><a href="https://github.com/renrenio/renren-fast-vue" target="_blank">前端</a></el-menu-item>
<el-menu-item index="2-2"><a href="https://gitee.com/renrenio/renren-fast" target="_blank">后台</a></el-menu-item>
<template slot="title">Git源码</template>
<el-menu-item index="2-3"><a href="https://gitee.com/renrenio/renren-generator" target="_blank">代码生成器</a></el-menu-item>
</el-submenu>
<el-menu-item class="site-navbar__avatar" index="3">
{{ userName }}
<el-dropdown :show-timeout="0" placement="bottom">
<span class="el-dropdown-link">
<img src="~@/assets/img/avatar.png" :alt="userName">{{ userName }}
......
<template>
<el-submenu
v-if="menu.list && menu.list.length >= 1"
:index="menu.menuId + ''"
:index="menu.id + ''"
:popper-class="'site-sidebar--' + sidebarLayoutSkin + '-popper'">
<template slot="title">
<icon-svg :name="menu.icon || ''" class="site-sidebar__menu-icon"></icon-svg>
......@@ -9,12 +9,12 @@
</template>
<sub-menu
v-for="item in menu.list"
:key="item.menuId"
:key="item.id"
:menu="item"
:dynamicMenuRoutes="dynamicMenuRoutes">
</sub-menu>
</el-submenu>
<el-menu-item v-else :index="menu.menuId + ''" @click="gotoRouteHandle(menu)">
<el-menu-item v-else :index="menu.id + ''" @click="gotoRouteHandle(menu)">
<icon-svg :name="menu.icon || ''" class="site-sidebar__menu-icon"></icon-svg>
<span>{{ menu.name }}</span>
</el-menu-item>
......@@ -45,7 +45,7 @@
methods: {
// 通过menuId与动态(菜单)路由进行匹配跳转至指定路由
gotoRouteHandle (menu) {
var route = this.dynamicMenuRoutes.filter(item => item.meta.menuId === menu.menuId)
var route = this.dynamicMenuRoutes.filter(item => item.meta.menuId === menu.id)
if (route.length >= 1) {
this.$router.push({ name: route[0].name })
}
......
......@@ -26,7 +26,7 @@
</el-submenu>
<sub-menu
v-for="menu in menuList"
:key="menu.menuId"
:key="menu.id"
:menu="menu"
:dynamicMenuRoutes="dynamicMenuRoutes">
</sub-menu>
......@@ -93,7 +93,7 @@
}
}
tab = {
menuId: route.meta.menuId || route.name,
menuId: route.meta.id || route.name,
name: route.name,
title: route.meta.title,
type: isURL(route.meta.iframeUrl) ? 'iframe' : 'module',
......
......@@ -53,8 +53,24 @@
set (val) { this.$store.commit('user/updateId', val) }
},
userName: {
get () { return this.$store.state.user.name },
get () { return this.$store.state.user },
set (val) { this.$store.commit('user/updateName', val) }
},
userCode: {
get () { return this.$store.state.user.code },
set (val) { this.$store.commit('user/updateCode', val) }
},
userFullName: {
get () { return this.$store.state.user.fullName },
set (val) { this.$store.commit('user/updateFullName', val) }
},
userGender: {
get () { return this.$store.state.user.gender },
set (val) { this.$store.commit('user/updateGender', val) }
},
userRoles: {
get () { return this.$store.state.user.roles },
set (val) { this.$store.commit('user/updateRoles', val) }
}
},
created () {
......@@ -68,7 +84,7 @@
resetDocumentClientHeight () {
this.documentClientHeight = document.documentElement['clientHeight']
window.onresize = () => {
this.documentClientHeight = document.documentElement['clientHeight']
this.documentClientHeightentHeight = document.documentElement['clientHeight']
}
},
// 获取当前管理员信息
......@@ -80,8 +96,13 @@
}).then(({data}) => {
if (data && data.code === 0) {
this.loading = false
this.userId = data.user.userId
this.userName = data.user.username
let _data = data.data
this.userId = _data.id
this.userName = _data.userName
this.userCode = _data.code
this.userFullName = _data.fullName
this.userGender = _data.gender
this.userRoles = _data.roles
}
})
}
......
......@@ -8,7 +8,7 @@
<el-table
:data="dataList"
row-key="menuId"
row-key="id"
border
style="width: 100%; ">
<el-table-column
......@@ -72,8 +72,8 @@
width="150"
label="操作">
<template slot-scope="scope">
<el-button v-if="isAuth('sys:menu:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.menuId)">修改</el-button>
<el-button v-if="isAuth('sys:menu:delete')" type="text" size="small" @click="deleteHandle(scope.row.menuId)">删除</el-button>
<el-button v-if="isAuth('sys:menu:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button v-if="isAuth('sys:menu:delete')" type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
......@@ -109,7 +109,7 @@
method: 'get',
params: this.$http.adornParams()
}).then(({data}) => {
this.dataList = treeDataTranslate(data, 'menuId')
this.dataList = treeDataTranslate(data.data, 'id')
this.dataListLoading = false
})
},
......
......@@ -127,8 +127,8 @@
})
}).then(({data}) => {
if (data && data.code === 0) {
this.dataList = data.page.list
this.totalPage = data.page.totalCount
this.dataList = data.data.list
this.totalPage = data.data.totalCount
} else {
this.dataList = []
this.totalPage = 0
......
......@@ -7,6 +7,7 @@ public class Constant {
public static final String NAME_SPACE = "mms";
public static final String KEY_JOIN_CHAR = ":";
public static final String USER_CACHE = NAME_SPACE + KEY_JOIN_CHAR + "user_cache" + KEY_JOIN_CHAR;
public static final String PERMS_CAHCE = NAME_SPACE + KEY_JOIN_CHAR + "perms_cache" + KEY_JOIN_CHAR;
public static final String CODE = "code";
public static final String MESSAGE = "msg";
public static final String SUCCESS = "success";
......@@ -14,6 +15,13 @@ public class Constant {
public static final String DATA = "data";
public static final Long SUPER_ADMIN = 1L;
public static final long EXPIRE = 30 * 24 * 60 * 60;
public static final long DEFAULT_CUR_PAGE = 1;
public static final long DEFAULT_PAGE_SIZE = 10;
public static final String PAGE = "page";
public static final String LIMIT = "limit";
public static final String ORDER_FIELD = "sidx";
public static final String ORDER ="order";
public static final String ASC = "ASC";
/**
* 菜单类型
......
package com.pannk.mms.common.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* Created by wolf on 20-11-20.
*/
@Data
public class PageData<T> implements Serializable {
private static final long serialVersionUID = -8171781651062157031L;
/**
* 总记录数
*/
private long total;
/**
* 分页大小
*/
private long pageSize;
/**
* 总页数
*/
private long totalPage;
/**
* 当前页
*/
private long curPage;
private List<T> list;
public PageData(long total, long pageSize, long curPage, List<T> list) {
this.total = total;
this.pageSize = pageSize;
this.curPage = curPage;
this.list = list;
this.totalPage = (long) Math.ceil((double)total/pageSize);
}
public PageData(IPage<T> page){
this.list = page.getRecords();
this.total = page.getTotal();
this.pageSize = page.getSize();
this.curPage = page.getCurrent();
this.totalPage = page.getPages();
}
}
package com.pannk.mms.common.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pannk.mms.common.filters.SQLFilter;
import org.apache.commons.lang.StringUtils;
import java.util.Map;
import static com.pannk.mms.common.base.Constant.*;
/**
* Created by wolf on 20-11-20.
*/
public class Query<T> {
/**
* 分页参数
*
* @param params 参数
* @return
*/
public IPage<T> getPage(Map<String, Object> params) {
return this.getPage(params, null, false);
}
/**
* 分页
*
* @param params 参数
* @param defaultOrderField 默认排序字段
* @param isAsc 是否升序
* @return
*/
public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
Object pageObj = params.get(PAGE);
Object limitObj = params.get(LIMIT);
long curPage = pageObj == null ? DEFAULT_CUR_PAGE : Long.parseLong(pageObj.toString());
long pageSize = limitObj == null ? DEFAULT_PAGE_SIZE : Long.parseLong(limitObj.toString());
Page<T> page = new Page<>(curPage, pageSize);
params.put(PAGE, page);
String orderField = SQLFilter.sqlInject((String) params.get(Constant.ORDER_FIELD));
String order = (String) params.get(Constant.ORDER);
if (StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)) {
return page.addOrder(ASC.equalsIgnoreCase(order) ? OrderItem.asc(orderField) : OrderItem.desc(orderField));
}
if (StringUtils.isBlank(defaultOrderField)) {
return page;
}
page.addOrder(isAsc ? OrderItem.asc(defaultOrderField) : OrderItem.desc(defaultOrderField));
return page;
}
}
package com.pannk.mms.common.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by wolf on 20-11-20.
*/
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
......@@ -22,7 +22,7 @@ import java.util.Map;
public class ShiroConfig {
@Bean
public SecurityManager securityManager(OAuth2Realm oAuth2Realm){
public SecurityManager securityManager(OAuth2Realm oAuth2Realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(oAuth2Realm);
securityManager.setRememberMeManager(null);
......@@ -30,36 +30,37 @@ public class ShiroConfig {
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor advisor= new AuthorizationAttributeSourceAdvisor();
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String,Filter> filters = new HashMap<>();
filters.put("oauth2",new OAuth2Filter());
Map<String, Filter> filters = new HashMap<>();
filters.put("oauth2", new OAuth2Filter());
shiroFilterFactoryBean.setFilters(filters);
Map<String,String> filterMap = new LinkedHashMap<>();
filterMap.put("/webjars/**","anon");
filterMap.put("/durid/**","anon");
filterMap.put("/sys/log","anon");
filterMap.put("/swagger/**","anon");
filterMap.put("v2/api-docs","anon");
filterMap.put("/swagger-ui.html","anon");
filterMap.put("/swagger-resources/**","anon");
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/webjars/**", "anon");
filterMap.put("/druid/**", "anon");
filterMap.put("/sys/login", "anon");
filterMap.put("/swagger/**", "anon");
filterMap.put("v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/**", "oauth2");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
@Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
......
......@@ -2,15 +2,20 @@ package com.pannk.mms.common.oauth2;
import com.alibaba.fastjson.JSON;
import com.pannk.mms.common.base.Result;
import com.pannk.mms.common.exception.BaseException;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
import org.junit.platform.commons.util.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by wolf on 20-11-6.
......@@ -25,6 +30,14 @@ public class OAuth2Filter extends AuthenticatingFilter {
return new OAuth2Token(token);
}
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if (((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())) {
return true;
}
return false;
}
@Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
String token = getToken(servletRequest);
......@@ -37,10 +50,37 @@ public class OAuth2Filter extends AuthenticatingFilter {
httpServletResponse.getWriter().print(responseJson);
return false;
}
return executeLogin(servletRequest,servletResponse);
return executeLogin(servletRequest, servletResponse);
}
@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
System.out.println("======================token " + token);
System.out.println("======================subject " + subject.getPrincipal());
return true;
}
@Override
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setContentType("application/json;charset=utf-8");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String origin = httpServletRequest.getHeader("Origin");
httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
try {
Throwable throwable = e.getCause() == null ? e : e.getCause();
Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), throwable.getMessage());
String json = JSON.toJSONString(result);
httpServletResponse.getWriter().print(json);
} catch (IOException ie) {
throw new BaseException(ie.getMessage());
}
return false;
}
private String getToken(ServletRequest request) {
return ((HttpServletRequest) request).getHeader("X-Token");
return ((HttpServletRequest) request).getHeader("token");
}
}
......@@ -6,11 +6,14 @@ import com.pannk.mms.common.utils.RedisUtil;
import com.pannk.mms.modules.sys.entity.SysUserEntity;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Set;
/**
* Created by wolf on 20-11-6.
*/
......@@ -20,6 +23,11 @@ public class OAuth2Realm extends AuthorizingRealm {
@Autowired
private RedisUtil redisUtil;
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof OAuth2Token;
}
/**
* 授权
*
......@@ -28,8 +36,11 @@ public class OAuth2Realm extends AuthorizingRealm {
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
SysUserEntity sysUserEntity = (SysUserEntity) principalCollection.getPrimaryPrincipal();
Set<String> perms = redisUtil.getEntity(Constant.PERMS_CAHCE + sysUserEntity.getId(), Set.class);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setStringPermissions(perms);
return info;
}
/**
......@@ -46,7 +57,7 @@ public class OAuth2Realm extends AuthorizingRealm {
if (sysUserEntity == null) {
throw new BaseException("token失效,请重新登录");
}
if (sysUserEntity.getStatus() == 0) {
if (sysUserEntity.getStatus() == 1) {
throw new LockedAccountException("账号被锁定,清联系管理员处理");
}
return new SimpleAuthenticationInfo(sysUserEntity, token, getName());
......
package com.pannk.mms.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Created by wolf on 20-11-20.
*/
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(String name, Class<T> requriedType) {
return applicationContext.getBean(name, requriedType);
}
}
......@@ -33,6 +33,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @author:wolf
* @date:2020/11/2 23:13
......@@ -50,7 +52,8 @@ public class SysLoginController extends BaseController {
}
@PostMapping("/logout")
public Result logout() {
public Result logout(HttpServletRequest request) {
sysUserService.logout(getUserId(),request.getHeader("token"));
return Result.success();
}
}
......@@ -44,10 +44,16 @@ public class SysMenuController extends BaseController {
/**
* 用户菜单列表和权限
*
* @return
*/
@GetMapping("/nav")
public Result nav(){
public Result nav() {
return Result.success(sysMenuService.getUserMenuList(getUserId()));
}
@GetMapping("/list")
public Result list() {
return Result.success(sysMenuService.list());
}
}
package com.pannk.mms.modules.sys.controller;
import com.pannk.mms.common.base.BaseController;
import com.pannk.mms.common.base.PageData;
import com.pannk.mms.common.base.Result;
import com.pannk.mms.modules.sys.entity.SysUserEntity;
import com.pannk.mms.modules.sys.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* Created by wolf on 20-11-2.
*/
......@@ -22,8 +26,8 @@ public class SysUserController extends BaseController {
@GetMapping("/list")
public Result list() {
return Result.success(sysUserService.list());
public Result list(@RequestParam Map<String,Object> params) {
return Result.success(sysUserService.queryPage(params));
}
@GetMapping("/info")
......
......@@ -28,6 +28,7 @@ import com.pannk.mms.modules.sys.entity.SysMenuEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Set;
/**
* @author:wolf
......@@ -38,9 +39,18 @@ public interface SysMenuMapper extends BaseMapper<SysMenuEntity> {
/**
* 查询用户菜单
*
* @param userId 用户id
* @return
*/
List<SysMenuEntity> queryMenuList(Long userId);
/**
* 查询用户权限标记
*
* @param userId 用户id
* @return
*/
Set<String> queryUserPerms(Long userId);
}
package com.pannk.mms.modules.sys.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pannk.mms.common.base.PageData;
import com.pannk.mms.common.base.Result;
import com.pannk.mms.modules.sys.entity.SysUserEntity;
import com.pannk.mms.modules.sys.vo.LoginForm;
import com.pannk.mms.modules.sys.vo.SysUserInfo;
import java.util.Map;
/**
* 系统用户
*
......@@ -36,4 +39,20 @@ public interface SysUserService extends IService<SysUserEntity> {
* @return
*/
SysUserInfo queryUserInfo(Long id);
/**
* 退出登录
*
* @param userId 用户id
* @param token token
*/
void logout(Long userId, String token);
/**
* 查询分页用户
*
* @param params 参数
* @return
*/
PageData<SysUserEntity> queryPage(Map<String, Object> params);
}
......@@ -26,12 +26,14 @@ package com.pannk.mms.modules.sys.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pannk.mms.common.base.Constant;
import com.pannk.mms.common.utils.ListUtil;
import com.pannk.mms.common.utils.RedisUtil;
import com.pannk.mms.modules.sys.dao.SysMenuMapper;
import com.pannk.mms.modules.sys.entity.SysMenuEntity;
import com.pannk.mms.modules.sys.service.SysMenuService;
import com.pannk.mms.modules.sys.vo.SysMenuInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
......@@ -48,29 +50,22 @@ import java.util.Set;
@Slf4j
@Service("sysMenuService")
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenuEntity> implements SysMenuService {
@Autowired
private RedisUtil redisUtil;
@Override
public SysMenuInfo getUserMenuList(Long userId) {
if (userId == Constant.SUPER_ADMIN) {
userId = null;
}
List<SysMenuEntity> userMenuList = getUserMenu(userId);
List<SysMenuEntity> userMenuList = userId == Constant.SUPER_ADMIN ? getUserMenu(null) : getUserMenu(userId);
List<SysMenuEntity> menuList = getMenuList(userMenuList);
Set<String> permissions = getPermissions(userMenuList);
Set<String> permissions = userId == Constant.SUPER_ADMIN ? baseMapper.queryUserPerms(null) : baseMapper.queryUserPerms(userId);
redisUtil.set(Constant.PERMS_CAHCE + userId, permissions);
return new SysMenuInfo(menuList, permissions);
}
private Set<String> getPermissions(List<SysMenuEntity> list) {
Set<String> permissions = new HashSet<>();
for (SysMenuEntity entity : list) {
String perms =entity.getPerms();
if (StringUtils.isNotEmpty(perms)) {
permissions.add(perms);
}
}
return permissions;
}
private List<SysMenuEntity> getUserMenu(Long userId){
private List<SysMenuEntity> getUserMenu(Long userId) {
return baseMapper.queryMenuList(userId);
}
......
package com.pannk.mms.modules.sys.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pannk.mms.common.base.Constant;
import com.pannk.mms.common.base.PageData;
import com.pannk.mms.common.base.Query;
import com.pannk.mms.common.base.Result;
import com.pannk.mms.common.utils.RedisUtil;
import com.pannk.mms.common.utils.TokenUtil;
......@@ -13,10 +17,12 @@ import com.pannk.mms.modules.sys.service.SysUserService;
import com.pannk.mms.modules.sys.vo.LoginForm;
import com.pannk.mms.modules.sys.vo.SysUserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 系统用户服务
......@@ -48,7 +54,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity
return Result.error("账号被锁定,请联系管理员处理");
}
String token = TokenUtil.generateToken();
redisUtil.set(Constant.USER_CACHE+token, sysUserEntity,Constant.EXPIRE);
redisUtil.set(Constant.USER_CACHE + token, sysUserEntity, Constant.EXPIRE);
return Result.success(token);
}
......@@ -60,10 +66,20 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity
return null;
}
List<SysRoleEntity> roles = sysRoleService.queryUserRole(sysUserEntity.getId());
BeanUtils.copyProperties(sysUserEntity, sysUserInfo);
sysUserInfo.setRoles(roles);
sysUserInfo.setAvatar("avatar");
sysUserInfo.setIntroduction("This is a user info");
sysUserInfo.setName(sysUserEntity.getFullName());
return sysUserInfo;
}
@Override
public void logout(Long userId, String token) {
redisUtil.del(Constant.USER_CACHE + token);
redisUtil.del(Constant.PERMS_CAHCE + userId);
}
@Override
public PageData<SysUserEntity> queryPage(Map<String, Object> params) {
IPage<SysUserEntity> page = this.page(new Query<SysUserEntity>().getPage(params), new QueryWrapper<>());
return new PageData<>(page);
}
}
package com.pannk.mms.modules.sys.vo;
import com.pannk.mms.modules.sys.entity.SysRoleEntity;
import com.pannk.mms.modules.sys.entity.SysUserEntity;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* Created by wolf on 20-11-18.
*/
@Data
public class SysUserInfo implements Serializable {
//roles, name, avatar, introduction
public class SysUserInfo extends SysUserEntity {
/**
* 用户角色
*/
List<SysRoleEntity> roles;
/**
* 用户名称
*/
String name;
/**
* 头像
*/
String avatar;
/**
* 介绍
*/
String introduction;
}
......@@ -2,13 +2,29 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pannk.mms.modules.sys.dao.SysMenuMapper">
<select id="queryMenuList" resultType="com.pannk.mms.modules.sys.entity.SysMenuEntity">
SELECT * FROM sys_menu
<sql id="chooseSql">
<choose>
<when test="userId!=null and userId!=''">
WHERE id in (SELECT DISTINCT srm.menu_id FROM sys_user_role sur LEFT JOIN sys_role_menu srm ON sur.role_id=srm.role_id
AND id in (SELECT DISTINCT srm.menu_id FROM sys_user_role sur LEFT JOIN sys_role_menu srm ON
sur.role_id=srm.role_id
WHERE user_id=#{userId})
</when>
</choose>
</sql>
<select id="queryMenuList" resultType="com.pannk.mms.modules.sys.entity.SysMenuEntity">
SELECT * FROM sys_menu
<where>
type!=2
<include refid="chooseSql"/>
</where>
</select>
<select id="queryUserPerms" resultType="java.lang.String">
SELECT perms FROM sys_menu
<where>
perms is not null and perms != ''
<include refid="chooseSql"/>
</where>
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册