Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Springboot Plus
Commits
556cb3d8
"eladmin-common/src/main/vscode:/vscode.git/clone" did not exist on "cee42e3a67458a8b2002ff9bd3e47e57ad158d3c"
Commit
556cb3d8
authored
May 07, 2020
by
trumansdo
Browse files
vue最新版实现完全的异步加载组件
parent
fb33a03c
Changes
11
Hide whitespace changes
Inline
Side-by-side
plus-admin/admin-console/src/main/resources/application.properties
→
plus-admin/admin-console/src/main/resources/application.properties
.bak
View file @
556cb3d8
File moved
plus-admin/admin-console/src/main/resources/application.yml
0 → 100644
View file @
556cb3d8
# --------自定义应用属性
app
:
name
:
SpringBoot-Plus
#打开审计功能,开发模式应该关闭
audit
:
enable
:
false
# 1,1 是管理员密码,相当于启动后就登录,方便测试,系统需要取消这俩个配置
user
:
id
:
1
orgId
:
1
# 文件操作的根目录配置 请根据各自计算机配置
localFile
:
root
:
E:\code_workspace\temp_space\
# --------beetl配置
beetl
:
suffix
:
html
# -------beetlsql配置
beetlsql
:
ds
:
baseDataSource
:
basePackage
:
com.ibeetl.admin
daoSuffix
:
Dao
dbStyle
:
org.beetl.sql.core.db.MySqlStyle
mutiple
:
datasource
:
baseDataSource
# -------- 文件预览配置
#文档预览服务的调用地址,参考https://gitee.com/kekingcn/file-online-preview 安装,没有如下配置无法使用预览功能
file
:
previewURL
:
http://localhost:8012/onlinePreview
# ---------日志配置
logging
:
level
:
org
:
springframework
:
boot
:
autoconfigure
:
ERROR
web
:
servlet
:
mvc
:
method
:
annotation
:
warn
root
:
info
pattern
:
console
:
'
%-4relative
[%thread]
%-5level
%logger{256}
%M
%L
-
%msg%n'
# --------服务器undertow配置
server
:
port
:
8080
undertow
:
accesslog
:
enabled
:
true
buffer-size
:
4096
direct-buffers
:
true
io-threads
:
4
worker-threads
:
20
spring
:
cache
:
type
:
caffeine
# 数据源配置
datasource
:
baseDataSource
:
driver-class-name
:
com.mysql.cj.jdbc.Driver
password
:
123456
url
:
jdbc:mysql://127.0.0.1:3306/starter_vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=true
username
:
root
session
:
store-type
:
none
plus-admin/admin-core/src/main/java/com/ibeetl/admin/core/entity/CoreRoute.java
View file @
556cb3d8
...
...
@@ -5,11 +5,11 @@ import cn.hutool.core.collection.CollUtil;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
java.util.Comparator
;
import
lombok.Data
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
lombok.Data
;
/**
* 对应前端页面的routes路由表。具体格式如下: { "path": "/profile", "name": "router-name", "meta": { "title":
...
...
@@ -20,60 +20,77 @@ import lombok.Data;
@Data
public
class
CoreRoute
extends
BaseEntity
implements
Comparable
<
CoreRoute
>
{
private
Long
id
;
private
Long
id
;
private
Long
parentId
;
private
Long
parentId
;
/** 路由路径,完全参照vue router规范 */
private
String
path
;
/**
* 路由路径,完全参照vue router规范
*/
private
String
path
;
/** 路由名称,请确保唯一性 */
private
String
name
;
/**
* 路由名称,请确保唯一性
*/
private
String
name
;
/** 路由顺序 */
private
Long
seq
=
-
999L
;
/**
* 路由组件component
*/
private
String
component
;
/** 路由元数据信息 */
private
CoreRouteMeta
meta
;
/**
* 路由顺序
*/
private
Long
seq
=
-
999L
;
/** 子路由项 */
private
List
<
CoreRoute
>
children
=
CollUtil
.
newArrayList
();
/**
* 路由元数据信息
*/
private
CoreRouteMeta
meta
;
public
CoreRouteMeta
getMeta
()
{
if
(
ObjectUtil
.
isNotEmpty
(
this
.
meta
))
return
this
.
meta
;
Map
<
String
,
Object
>
metaMap
=
MapUtil
.
builder
(
getTails
()).
build
();
this
.
meta
=
BeanUtil
.
mapToBean
(
metaMap
,
CoreRouteMeta
.
class
,
true
);
return
this
.
meta
;
}
/**
* 子路由项
*/
private
List
<
CoreRoute
>
children
=
CollUtil
.
newArrayList
();
@Override
public
boolean
equals
(
Object
o
)
{
if
(
o
!=
null
&&
o
instanceof
CoreRoute
)
{
CoreRoute
othRoute
=
(
CoreRoute
)
o
;
if
(
this
.
getId
().
equals
(
othRoute
.
getId
()))
{
return
true
;
}
if
(
this
.
getParentId
().
equals
(
othRoute
.
getParentId
()))
{
return
StrUtil
.
equals
(
this
.
getPath
(),
othRoute
.
getPath
())
&&
StrUtil
.
equals
(
this
.
getName
(),
othRoute
.
getName
());
}
else
{
return
false
;
}
}
else
{
return
false
;
public
CoreRouteMeta
getMeta
()
{
if
(
ObjectUtil
.
isNotEmpty
(
this
.
meta
))
{
return
this
.
meta
;
}
Map
<
String
,
Object
>
metaMap
=
MapUtil
.
builder
(
getTails
()).
build
();
this
.
meta
=
BeanUtil
.
mapToBean
(
metaMap
,
CoreRouteMeta
.
class
,
true
);
return
this
.
meta
;
}
}
@Override
public
int
hashCode
()
{
return
Objects
.
hash
(
id
,
parentId
,
path
,
name
);
}
@Override
public
boolean
equals
(
Object
o
)
{
if
(
o
!=
null
&&
o
instanceof
CoreRoute
)
{
CoreRoute
othRoute
=
(
CoreRoute
)
o
;
if
(
this
.
getId
().
equals
(
othRoute
.
getId
()))
{
return
true
;
}
if
(
this
.
getParentId
().
equals
(
othRoute
.
getParentId
()))
{
return
StrUtil
.
equals
(
this
.
getPath
(),
othRoute
.
getPath
())
&&
StrUtil
.
equals
(
this
.
getName
(),
othRoute
.
getName
());
}
else
{
return
false
;
}
}
else
{
return
false
;
}
}
@Override
public
int
compareTo
(
CoreRoute
o
)
{
if
(
null
==
o
)
return
-
1
;
Long
seq1
=
this
.
getSeq
()
==
null
?
-
999L
:
this
.
getSeq
();
Long
seq2
=
o
.
getSeq
()
==
null
?
-
999L
:
o
.
getSeq
();
return
seq1
.
compareTo
(
seq2
);
}
@Override
public
int
hashCode
()
{
return
Objects
.
hash
(
id
,
parentId
,
path
,
name
);
}
@Override
public
int
compareTo
(
CoreRoute
o
)
{
if
(
null
==
o
)
return
-
1
;
Long
seq1
=
this
.
getSeq
()
==
null
?
-
999L
:
this
.
getSeq
();
Long
seq2
=
o
.
getSeq
()
==
null
?
-
999L
:
o
.
getSeq
();
return
seq1
.
compareTo
(
seq2
);
}
}
plus-admin/admin-core/src/main/java/com/ibeetl/admin/core/entity/CoreRouteMeta.java
View file @
556cb3d8
package
com.ibeetl.admin.core.entity
;
import
cn.hutool.core.collection.CollUtil
;
import
java.util.List
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
CoreRouteMeta
{
/** 路由展示在菜单中显示的标题 */
private
String
title
;
/**
* 路由展示在菜单中显示的标题
*/
private
String
title
;
/** 在菜单中显示的图标 */
private
String
icon
;
/**
* 在菜单中显示的图标
*/
private
String
icon
;
/** 当前路由可以访问的角色 */
private
List
<
Long
>
roles
=
CollUtil
.<
Long
>
newArrayList
();
/**
* 当前路由可以访问的角色
*/
private
List
<
Long
>
roles
=
CollUtil
.<
Long
>
newArrayList
();
}
plus-admin/admin-core/src/main/java/com/ibeetl/admin/core/service/RoleRoutesElService.java
View file @
556cb3d8
...
...
@@ -66,7 +66,7 @@ public class RoleRoutesElService {
* */
public
List
<
CoreRoute
>
getRoutes
()
{
List
<
CoreRoute
>
routesList
=
coreFunctionDao
.
getAllRoutes
();
Map
<
Long
,
List
<
Long
>>
roleIdList
=
/*
Map<Long, List<Long>> roleIdList =
routesList.stream()
.collect(
Collectors.groupingBy(
...
...
@@ -80,7 +80,7 @@ public class RoleRoutesElService {
.getMeta()
.getRoles()
.addAll(CollUtil.<Long>removeNull(roleIdList.get(coreRoute.getId())));
}
}
*/
CoreRoute
root
=
new
CoreRoute
();
root
.
setId
(
0L
);
buildRoutesTree
(
root
,
routesList
);
...
...
@@ -95,7 +95,9 @@ public class RoleRoutesElService {
* @return
*/
private
void
buildRoutesTree
(
CoreRoute
root
,
@NotNull
List
<
CoreRoute
>
allRoutes
)
{
if
(
CollUtil
.
isEmpty
(
allRoutes
))
return
;
if
(
CollUtil
.
isEmpty
(
allRoutes
))
{
return
;
}
List
<
CoreRoute
>
childRoutes
=
allRoutes
.
stream
()
.
filter
(
route
->
route
.
getParentId
().
equals
(
root
.
getId
()))
...
...
plus-admin/admin-core/src/main/resources/sql/core/coreFunction.md
View file @
556cb3d8
getAllRoutes
===
```
sql
select
menu
.
id
,
menu
.
PARENT_MENU_ID
PARENT_ID
,
menu
.
PARENT_MENU_ID
parent_id
,
menu
.
NAME
title
,
menu
.
CODE
name
,
menu
.
ICON
,
ifnull
(
menu
.
SEQ
,
999999
)
seq
,
func
.
ACCESS_URL
path
,
func
.
COMPONENT
component
,
role_menu
.
ROLE_ID
from
core_menu
menu
left
join
core_function
func
on
func
.
ID
=
menu
.
FUNCTION_ID
...
...
@@ -28,6 +28,7 @@ RouteMapping
"
resultType
"
:
"
com.ibeetl.admin.core.entity.CoreRoute
"
,
"
path
"
:
"
path
"
,
"
name
"
:
"
name
"
,
"
component
"
:
"
component
"
,
"
id
"
:
"
id
"
,
"
parentId
"
:
"
parent_id
"
,
"
seq
"
:
"
seq
"
,
...
...
ve-admin/admin-web/.eslintrc.js
View file @
556cb3d8
/*
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @LastEditTime: 20
19-10-29 23:17:5
3
* @LastEditTime: 20
20-05-07 14:39:4
3
* @LastEditors: 一日看尽长安花
* @Description:
*/
...
...
@@ -96,7 +96,18 @@ module.exports = {
// 关闭检测函数名称和调用它的左括号之间的空格
// 'func-call-spacing': 'off',
// 缩进为2个空格
indent
:
[
'
error
'
,
2
],
indent
:
[
'
error
'
,
2
,
{
ignoredNodes
:
[
'
TemplateLiteral
'
]
}
],
'
template-curly-spacing
'
:
[
'
off
'
],
// 关闭检测未使用的变量
'
no-unused-vars
'
:
'
off
'
,
// 对象展开时总是要添加逗号,一行时行末不需要逗号
...
...
ve-admin/admin-web/package.json
View file @
556cb3d8
...
...
@@ -81,6 +81,8 @@
"devDependencies"
:
{
"@babel/core"
:
"7.0.0"
,
"@babel/register"
:
"7.0.0"
,
"@babel/traverse"
:
"^7.9.6"
,
"@babel/types"
:
"^7.9.6"
,
"@vue/cli-plugin-babel"
:
"4.2.3"
,
"@vue/cli-plugin-eslint"
:
"^4.2.3"
,
"@vue/cli-plugin-unit-jest"
:
"4.2.3"
,
...
...
ve-admin/admin-web/src/components/ImageCropper/utils/effectRipple.js
View file @
556cb3d8
/*
* @Author: 一日看尽长安花
* @since: 2019-12-01 11:03:53
* @LastEditTime: 2020-05-07 14:46:53
* @LastEditors: 一日看尽长安花
* @Description:
*/
/**
* 点击波纹效果
*
...
...
@@ -6,34 +13,48 @@
* @return {[bollean]} [description]
*/
export
default
function
(
e
,
arg_opts
)
{
var
opts
=
Object
.
assign
({
ele
:
e
.
target
,
// 波纹作用元素
type
:
'
hit
'
,
// hit点击位置扩散center中心点扩展
bgc
:
'
rgba(0, 0, 0, 0.15)
'
// 波纹颜色
},
arg_opts
)
var
target
=
opts
.
ele
var
opts
=
Object
.
assign
(
{
ele
:
e
.
target
,
// 波纹作用元素
type
:
'
hit
'
,
// hit点击位置扩散center中心点扩展
bgc
:
'
rgba(0, 0, 0, 0.15)
'
// 波纹颜色
},
arg_opts
);
var
target
=
opts
.
ele
;
if
(
target
)
{
var
rect
=
target
.
getBoundingClientRect
()
var
ripple
=
target
.
querySelector
(
'
.e-ripple
'
)
var
rect
=
target
.
getBoundingClientRect
()
;
var
ripple
=
target
.
querySelector
(
'
.e-ripple
'
)
;
if
(
!
ripple
)
{
ripple
=
document
.
createElement
(
'
span
'
)
ripple
.
className
=
'
e-ripple
'
ripple
.
style
.
height
=
ripple
.
style
.
width
=
Math
.
max
(
rect
.
width
,
rect
.
height
)
+
'
px
'
target
.
appendChild
(
ripple
)
ripple
=
document
.
createElement
(
'
span
'
);
ripple
.
className
=
'
e-ripple
'
;
ripple
.
style
.
height
=
ripple
.
style
.
width
=
Math
.
max
(
rect
.
width
,
rect
.
height
)
+
'
px
'
;
target
.
appendChild
(
ripple
);
}
else
{
ripple
.
className
=
'
e-ripple
'
ripple
.
className
=
'
e-ripple
'
;
}
switch
(
opts
.
type
)
{
case
'
center
'
:
ripple
.
style
.
top
=
(
rect
.
height
/
2
-
ripple
.
offsetHeight
/
2
)
+
'
px
'
ripple
.
style
.
left
=
(
rect
.
width
/
2
-
ripple
.
offsetWidth
/
2
)
+
'
px
'
break
default
:
ripple
.
style
.
top
=
(
e
.
pageY
-
rect
.
top
-
ripple
.
offsetHeight
/
2
-
document
.
body
.
scrollTop
)
+
'
px
'
ripple
.
style
.
left
=
(
e
.
pageX
-
rect
.
left
-
ripple
.
offsetWidth
/
2
-
document
.
body
.
scrollLeft
)
+
'
px
'
case
'
center
'
:
ripple
.
style
.
top
=
rect
.
height
/
2
-
ripple
.
offsetHeight
/
2
+
'
px
'
;
ripple
.
style
.
left
=
rect
.
width
/
2
-
ripple
.
offsetWidth
/
2
+
'
px
'
;
break
;
default
:
ripple
.
style
.
top
=
e
.
pageY
-
rect
.
top
-
ripple
.
offsetHeight
/
2
-
document
.
body
.
scrollTop
+
'
px
'
;
ripple
.
style
.
left
=
e
.
pageX
-
rect
.
left
-
ripple
.
offsetWidth
/
2
-
document
.
body
.
scrollLeft
+
'
px
'
;
}
ripple
.
style
.
backgroundColor
=
opts
.
bgc
ripple
.
className
=
'
e-ripple z-active
'
return
false
ripple
.
style
.
backgroundColor
=
opts
.
bgc
;
ripple
.
className
=
'
e-ripple z-active
'
;
return
false
;
}
}
ve-admin/admin-web/src/store/modules/permission.js
View file @
556cb3d8
...
...
@@ -2,7 +2,7 @@
* @Description: In User Settings Edit
* @Author: your name
* @Date: 2019-09-09 12:16:28
* @LastEditTime: 20
19-10-30 20:32:19
* @LastEditTime: 20
20-05-07 15:03:38
* @LastEditors: 一日看尽长安花
*/
import
{
constantRoutes
}
from
'
@/router
'
;
...
...
@@ -11,6 +11,8 @@ import { default as asyncRoutesMap } from '@/router/maps/index';
import
{
deepClone
,
objectMerge
}
from
'
@/utils/index
'
;
import
{
isExists
,
isNotExists
}
from
'
@/utils/object-util
'
;
import
Layout
from
'
@/layout
'
;
/**
* Use meta.role to determine if the current user has permission
* @param roles
...
...
@@ -76,6 +78,29 @@ export function filterAsyncRoutes(routesMap, routes, roles) {
return
resRoutes
;
}
export
function
handleComponent
(
routes
)
{
for
(
let
i
in
routes
)
{
let
_route
=
routes
[
i
];
if
(
_route
.
component
&&
_route
.
component
.
trim
().
length
>
0
)
{
if
(
_route
.
component
===
'
layout
'
)
{
_route
.
component
=
Layout
;
}
else
{
/** 这里的异步不能直接在import里用template string写法,babel-eslint有bug*/
/** 两种异步写法:
* component = resolve => require([`@/views/modules/${URL}`], resolve);
* component = () => import(`@/${_route.component}`);这个也有问题
*/
//这一步多余的赋值遍历必须存在,import的bug
const
name
=
_route
.
component
;
_route
.
component
=
()
=>
import
(
`@/
${
name
}
`
);
}
}
if
(
_route
.
children
&&
_route
.
children
.
length
>
0
)
{
handleComponent
(
_route
.
children
);
}
}
}
const
state
=
{
routes
:
[],
addRoutes
:
[]
...
...
@@ -93,18 +118,11 @@ const actions = {
return
new
Promise
((
resolve
,
reject
)
=>
{
getRoutes
()
.
then
(
response
=>
{
let
accessedRoutes
,
asyncRoutes
=
response
.
data
;
accessedRoutes
=
filterAsyncRoutes
(
deepClone
(
asyncRoutesMap
),
asyncRoutes
,
roles
);
accessedRoutes
.
push
({
path
:
'
*
'
,
redirect
:
'
/404
'
,
hidden
:
true
});
commit
(
'
SET_ROUTES
'
,
accessedRoutes
);
resolve
(
accessedRoutes
);
let
asyncRoutes
=
response
.
data
;
handleComponent
(
asyncRoutes
);
asyncRoutes
.
push
({
path
:
'
*
'
,
redirect
:
'
/404
'
,
hidden
:
true
});
commit
(
'
SET_ROUTES
'
,
asyncRoutes
);
resolve
(
asyncRoutes
);
})
.
catch
(
error
=>
{
reject
(
error
);
...
...
ve-admin/admin-web/src/styles/sidebar.scss
View file @
556cb3d8
@import
'./variables.scss'
;
#app
{
.main-container
{
min-height
:
100%
;
transition
:
margin-left
.28s
;
transition
:
margin-left
0
.28s
;
margin-left
:
$sideBarWidth
;
position
:
relative
;
}
...
...
@@ -22,7 +22,8 @@
// reset element-ui css
.horizontal-collapse-transition
{
transition
:
0s
width
ease-in-out
,
0s
padding-left
ease-in-out
,
0s
padding-right
ease-in-out
;
transition
:
0s
width
ease-in-out
,
0s
padding-left
ease-in-out
,
0s
padding-right
ease-in-out
;
}
.scrollbar-wrapper
{
...
...
@@ -71,11 +72,11 @@
}
}
.is-active
>
.el-submenu__title
{
.is-active
>
.el-submenu__title
{
color
:
$subMenuActiveText
!
important
;
}
&
.nest-menu
.el-submenu
>
.el-submenu__title
,
&
.nest-menu
.el-submenu
>
.el-submenu__title
,
&
.el-submenu
.el-menu-item
{
min-width
:
$sideBarWidth
!
important
;
background-color
:
$subMenuBg
!
important
;
...
...
@@ -111,7 +112,7 @@
.el-submenu
{
overflow
:
hidden
;
&
>
.el-submenu__title
{
&
>
.el-submenu__title
{
padding
:
0
!
important
;
.svg-icon
{
...
...
@@ -126,8 +127,8 @@
.el-menu--collapse
{
.el-submenu
{
&
>
.el-submenu__title
{
&
>
span
{
&
>
.el-submenu__title
{
&
>
span
{
height
:
0
;
width
:
0
;
overflow
:
hidden
;
...
...
@@ -150,7 +151,7 @@
}
.sidebar-container
{
transition
:
transform
.28s
;
transition
:
transform
0
.28s
;
width
:
$sideBarWidth
!
important
;
}
...
...
@@ -164,7 +165,6 @@
}
.withoutAnimation
{
.main-container
,
.sidebar-container
{
transition
:
none
;
...
...
@@ -174,13 +174,13 @@
// when menu collapsed
.el-menu--vertical
{
&
>
.el-menu
{
&
>
.el-menu
{
.svg-icon
{
margin-right
:
16px
;
}
}
.nest-menu
.el-submenu
>
.el-submenu__title
,
.nest-menu
.el-submenu
>
.el-submenu__title
,
.el-menu-item
{
&
:hover
{
// you can use $subMenuHover
...
...
@@ -189,7 +189,7 @@
}
// the scroll bar appears when the subMenu is too long
>
.el-menu--popup
{
>
.el-menu--popup
{
max-height
:
100vh
;
overflow-y
:
auto
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment