Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
老丢丢
SpringBoot2Demo
提交
6f9949c4
S
SpringBoot2Demo
项目概览
老丢丢
/
SpringBoot2Demo
通知
3
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SpringBoot2Demo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
6f9949c4
编写于
11月 20, 2020
作者:
Q
qinxiaodong@pannk.com
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新项目代码
上级
e24a2288
变更
28
隐藏空白更改
内联
并排
Showing
28 changed file
with
404 addition
and
98 deletion
+404
-98
mms-font/config/index.js
mms-font/config/index.js
+3
-3
mms-font/src/router/index.js
mms-font/src/router/index.js
+5
-5
mms-font/src/store/modules/user.js
mms-font/src/store/modules/user.js
+5
-1
mms-font/src/utils/index.js
mms-font/src/utils/index.js
+1
-1
mms-font/src/views/common/login.vue
mms-font/src/views/common/login.vue
+1
-1
mms-font/src/views/main-navbar.vue
mms-font/src/views/main-navbar.vue
+3
-9
mms-font/src/views/main-sidebar-sub-menu.vue
mms-font/src/views/main-sidebar-sub-menu.vue
+4
-4
mms-font/src/views/main-sidebar.vue
mms-font/src/views/main-sidebar.vue
+2
-2
mms-font/src/views/main.vue
mms-font/src/views/main.vue
+25
-4
mms-font/src/views/modules/sys/menu.vue
mms-font/src/views/modules/sys/menu.vue
+4
-4
mms-font/src/views/modules/sys/user.vue
mms-font/src/views/modules/sys/user.vue
+2
-2
mms/src/main/java/com/pannk/mms/common/base/Constant.java
mms/src/main/java/com/pannk/mms/common/base/Constant.java
+8
-0
mms/src/main/java/com/pannk/mms/common/base/PageData.java
mms/src/main/java/com/pannk/mms/common/base/PageData.java
+55
-0
mms/src/main/java/com/pannk/mms/common/base/Query.java
mms/src/main/java/com/pannk/mms/common/base/Query.java
+63
-0
mms/src/main/java/com/pannk/mms/common/config/MyBatisPlusConfig.java
...n/java/com/pannk/mms/common/config/MyBatisPlusConfig.java
+25
-0
mms/src/main/java/com/pannk/mms/common/config/ShiroConfig.java
...rc/main/java/com/pannk/mms/common/config/ShiroConfig.java
+16
-15
mms/src/main/java/com/pannk/mms/common/oauth2/OAuth2Filter.java
...c/main/java/com/pannk/mms/common/oauth2/OAuth2Filter.java
+42
-2
mms/src/main/java/com/pannk/mms/common/oauth2/OAuth2Realm.java
...rc/main/java/com/pannk/mms/common/oauth2/OAuth2Realm.java
+14
-3
mms/src/main/java/com/pannk/mms/common/utils/SpringContextUtils.java
...n/java/com/pannk/mms/common/utils/SpringContextUtils.java
+28
-0
mms/src/main/java/com/pannk/mms/modules/sys/controller/SysLoginController.java
.../pannk/mms/modules/sys/controller/SysLoginController.java
+4
-1
mms/src/main/java/com/pannk/mms/modules/sys/controller/SysMenuController.java
...m/pannk/mms/modules/sys/controller/SysMenuController.java
+7
-1
mms/src/main/java/com/pannk/mms/modules/sys/controller/SysUserController.java
...m/pannk/mms/modules/sys/controller/SysUserController.java
+6
-2
mms/src/main/java/com/pannk/mms/modules/sys/dao/SysMenuMapper.java
...ain/java/com/pannk/mms/modules/sys/dao/SysMenuMapper.java
+10
-0
mms/src/main/java/com/pannk/mms/modules/sys/service/SysUserService.java
...ava/com/pannk/mms/modules/sys/service/SysUserService.java
+19
-0
mms/src/main/java/com/pannk/mms/modules/sys/service/impl/SysMenuServiceImpl.java
...annk/mms/modules/sys/service/impl/SysMenuServiceImpl.java
+11
-16
mms/src/main/java/com/pannk/mms/modules/sys/service/impl/SysUserServiceImpl.java
...annk/mms/modules/sys/service/impl/SysUserServiceImpl.java
+20
-4
mms/src/main/java/com/pannk/mms/modules/sys/vo/SysUserInfo.java
...c/main/java/com/pannk/mms/modules/sys/vo/SysUserInfo.java
+2
-15
mms/src/main/resources/mapper/sys/SysMenuMapper.xml
mms/src/main/resources/mapper/sys/SysMenuMapper.xml
+19
-3
未找到文件。
mms-font/config/index.js
浏览文件 @
6f9949c4
...
...
@@ -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
:
800
1
,
// 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
:
800
2
,
// can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser
:
true
,
errorOverlay
:
true
,
notifyOnErrors
:
true
,
...
...
mms-font/src/router/index.js
浏览文件 @
6f9949c4
...
...
@@ -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
].
menuI
d
,
menuId
:
menuList
[
i
].
i
d
,
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
].
menuI
d
}
`
route
[
'
name
'
]
=
`i-
${
menuList
[
i
].
menuI
d
}
`
route
[
'
path
'
]
=
`i-
${
menuList
[
i
].
i
d
}
`
route
[
'
name
'
]
=
`i-
${
menuList
[
i
].
i
d
}
`
route
[
'
meta
'
][
'
iframeUrl
'
]
=
menuList
[
i
].
url
}
else
{
try
{
...
...
mms-font/src/store/modules/user.js
浏览文件 @
6f9949c4
...
...
@@ -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
}
}
}
mms-font/src/utils/index.js
浏览文件 @
6f9949c4
...
...
@@ -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
}
/**
...
...
mms-font/src/views/common/login.vue
浏览文件 @
6f9949c4
...
...
@@ -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
)
...
...
mms-font/src/views/main-navbar.vue
浏览文件 @
6f9949c4
...
...
@@ -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 }}
...
...
mms-font/src/views/main-sidebar-sub-menu.vue
浏览文件 @
6f9949c4
<
template
>
<el-submenu
v-if=
"menu.list && menu.list.length >= 1"
:index=
"menu.
menuI
d + ''"
:index=
"menu.
i
d + ''"
: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.
menuI
d"
:key=
"item.
i
d"
:menu=
"item"
:dynamicMenuRoutes=
"dynamicMenuRoutes"
>
</sub-menu>
</el-submenu>
<el-menu-item
v-else
:index=
"menu.
menuI
d + ''"
@
click=
"gotoRouteHandle(menu)"
>
<el-menu-item
v-else
:index=
"menu.
i
d + ''"
@
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
.
menuI
d
)
var
route
=
this
.
dynamicMenuRoutes
.
filter
(
item
=>
item
.
meta
.
menuId
===
menu
.
i
d
)
if
(
route
.
length
>=
1
)
{
this
.
$router
.
push
({
name
:
route
[
0
].
name
})
}
...
...
mms-font/src/views/main-sidebar.vue
浏览文件 @
6f9949c4
...
...
@@ -26,7 +26,7 @@
</el-submenu>
<sub-menu
v-for=
"menu in menuList"
:key=
"menu.
menuI
d"
:key=
"menu.
i
d"
:menu=
"menu"
:dynamicMenuRoutes=
"dynamicMenuRoutes"
>
</sub-menu>
...
...
@@ -93,7 +93,7 @@
}
}
tab
=
{
menuId
:
route
.
meta
.
menuI
d
||
route
.
name
,
menuId
:
route
.
meta
.
i
d
||
route
.
name
,
name
:
route
.
name
,
title
:
route
.
meta
.
title
,
type
:
isURL
(
route
.
meta
.
iframeUrl
)
?
'
iframe
'
:
'
module
'
,
...
...
mms-font/src/views/main.vue
浏览文件 @
6f9949c4
...
...
@@ -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
.
documentClientHeight
entHeight
=
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
}
})
}
...
...
mms-font/src/views/modules/sys/menu.vue
浏览文件 @
6f9949c4
...
...
@@ -8,7 +8,7 @@
<el-table
:data=
"dataList"
row-key=
"
menuI
d"
row-key=
"
i
d"
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.
menuI
d)"
>
修改
</el-button>
<el-button
v-if=
"isAuth('sys:menu:delete')"
type=
"text"
size=
"small"
@
click=
"deleteHandle(scope.row.
menuI
d)"
>
删除
</el-button>
<el-button
v-if=
"isAuth('sys:menu:update')"
type=
"text"
size=
"small"
@
click=
"addOrUpdateHandle(scope.row.
i
d)"
>
修改
</el-button>
<el-button
v-if=
"isAuth('sys:menu:delete')"
type=
"text"
size=
"small"
@
click=
"deleteHandle(scope.row.
i
d)"
>
删除
</el-button>
</
template
>
</el-table-column>
</el-table>
...
...
@@ -109,7 +109,7 @@
method
:
'
get
'
,
params
:
this
.
$http
.
adornParams
()
}).
then
(({
data
})
=>
{
this
.
dataList
=
treeDataTranslate
(
data
,
'
menuI
d
'
)
this
.
dataList
=
treeDataTranslate
(
data
.
data
,
'
i
d
'
)
this
.
dataListLoading
=
false
})
},
...
...
mms-font/src/views/modules/sys/user.vue
浏览文件 @
6f9949c4
...
...
@@ -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
...
...
mms/src/main/java/com/pannk/mms/common/base/Constant.java
浏览文件 @
6f9949c4
...
...
@@ -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"
;
/**
* 菜单类型
...
...
mms/src/main/java/com/pannk/mms/common/base/PageData.java
0 → 100644
浏览文件 @
6f9949c4
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
();
}
}
mms/src/main/java/com/pannk/mms/common/base/Query.java
0 → 100644
浏览文件 @
6f9949c4
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
;
}
}
mms/src/main/java/com/pannk/mms/common/config/MyBatisPlusConfig.java
0 → 100644
浏览文件 @
6f9949c4
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
;
}
}
mms/src/main/java/com/pannk/mms/common/config/ShiroConfig.java
浏览文件 @
6f9949c4
...
...
@@ -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
(
"/d
urid/**"
,
"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
(
"/d
ruid/**"
,
"anon"
);
filterMap
.
put
(
"/sys/log
in"
,
"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
();
}
...
...
mms/src/main/java/com/pannk/mms/common/oauth2/OAuth2Filter.java
浏览文件 @
6f9949c4
...
...
@@ -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-T
oken"
);
return
((
HttpServletRequest
)
request
).
getHeader
(
"
t
oken"
);
}
}
mms/src/main/java/com/pannk/mms/common/oauth2/OAuth2Realm.java
浏览文件 @
6f9949c4
...
...
@@ -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
());
...
...
mms/src/main/java/com/pannk/mms/common/utils/SpringContextUtils.java
0 → 100644
浏览文件 @
6f9949c4
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
);
}
}
mms/src/main/java/com/pannk/mms/modules/sys/controller/SysLoginController.java
浏览文件 @
6f9949c4
...
...
@@ -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
();
}
}
mms/src/main/java/com/pannk/mms/modules/sys/controller/SysMenuController.java
浏览文件 @
6f9949c4
...
...
@@ -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
());
}
}
mms/src/main/java/com/pannk/mms/modules/sys/controller/SysUserController.java
浏览文件 @
6f9949c4
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"
)
...
...
mms/src/main/java/com/pannk/mms/modules/sys/dao/SysMenuMapper.java
浏览文件 @
6f9949c4
...
...
@@ -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
);
}
mms/src/main/java/com/pannk/mms/modules/sys/service/SysUserService.java
浏览文件 @
6f9949c4
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
);
}
mms/src/main/java/com/pannk/mms/modules/sys/service/impl/SysMenuServiceImpl.java
浏览文件 @
6f9949c4
...
...
@@ -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
);
}
...
...
mms/src/main/java/com/pannk/mms/modules/sys/service/impl/SysUserServiceImpl.java
浏览文件 @
6f9949c4
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
);
}
}
mms/src/main/java/com/pannk/mms/modules/sys/vo/SysUserInfo.java
浏览文件 @
6f9949c4
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
;
}
mms/src/main/resources/mapper/sys/SysMenuMapper.xml
浏览文件 @
6f9949c4
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录