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
MCMS
Commits
049098d8
"vscode:/vscode.git/clone" did not exist on "f9bec3df6e6191653e08e25020ece7eea9cccbf7"
Commit
049098d8
authored
Dec 28, 2021
by
mingsoft
Browse files
5.2.5版本更新
parent
6135f0ec
Changes
369
Hide whitespace changes
Inline
Side-by-side
src/main/java/net/mingsoft/cms/action/CategoryAction.java
View file @
049098d8
...
@@ -26,7 +26,6 @@ import io.swagger.annotations.Api;
...
@@ -26,7 +26,6 @@ import io.swagger.annotations.Api;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
net.mingsoft.base.entity.BaseEntity
;
import
net.mingsoft.base.entity.ResultData
;
import
net.mingsoft.base.entity.ResultData
;
import
net.mingsoft.basic.annotation.LogAnn
;
import
net.mingsoft.basic.annotation.LogAnn
;
import
net.mingsoft.basic.bean.EUListBean
;
import
net.mingsoft.basic.bean.EUListBean
;
...
...
src/main/java/net/mingsoft/cms/action/ContentAction.java
View file @
049098d8
...
@@ -34,10 +34,12 @@ import net.mingsoft.basic.util.StringUtil;
...
@@ -34,10 +34,12 @@ import net.mingsoft.basic.util.StringUtil;
import
net.mingsoft.cms.bean.ContentBean
;
import
net.mingsoft.cms.bean.ContentBean
;
import
net.mingsoft.cms.biz.ICategoryBiz
;
import
net.mingsoft.cms.biz.ICategoryBiz
;
import
net.mingsoft.cms.biz.IContentBiz
;
import
net.mingsoft.cms.biz.IContentBiz
;
import
net.mingsoft.cms.constant.e.CategoryTypeEnum
;
import
net.mingsoft.cms.entity.CategoryEntity
;
import
net.mingsoft.cms.entity.CategoryEntity
;
import
net.mingsoft.cms.entity.ContentEntity
;
import
net.mingsoft.cms.entity.ContentEntity
;
import
net.mingsoft.mdiy.biz.IModelBiz
;
import
net.mingsoft.mdiy.biz.IModelBiz
;
import
net.mingsoft.mdiy.entity.ModelEntity
;
import
net.mingsoft.mdiy.entity.ModelEntity
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.stereotype.Controller
;
...
@@ -316,7 +318,4 @@ public class ContentAction extends BaseAction {
...
@@ -316,7 +318,4 @@ public class ContentAction extends BaseAction {
contentBiz
.
saveOrUpdate
(
content
);
contentBiz
.
saveOrUpdate
(
content
);
return
ResultData
.
build
().
success
(
content
);
return
ResultData
.
build
().
success
(
content
);
}
}
}
}
src/main/java/net/mingsoft/cms/action/GeneraterAction.java
View file @
049098d8
...
@@ -25,8 +25,6 @@ package net.mingsoft.cms.action;
...
@@ -25,8 +25,6 @@ package net.mingsoft.cms.action;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.bean.copier.CopyOptions
;
import
cn.hutool.core.bean.copier.CopyOptions
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
net.mingsoft.base.entity.ResultData
;
import
net.mingsoft.base.entity.ResultData
;
import
net.mingsoft.basic.annotation.LogAnn
;
import
net.mingsoft.basic.annotation.LogAnn
;
import
net.mingsoft.basic.biz.IModelBiz
;
import
net.mingsoft.basic.biz.IModelBiz
;
...
@@ -40,7 +38,6 @@ import net.mingsoft.cms.biz.IContentBiz;
...
@@ -40,7 +38,6 @@ import net.mingsoft.cms.biz.IContentBiz;
import
net.mingsoft.cms.constant.e.CategoryTypeEnum
;
import
net.mingsoft.cms.constant.e.CategoryTypeEnum
;
import
net.mingsoft.cms.entity.CategoryEntity
;
import
net.mingsoft.cms.entity.CategoryEntity
;
import
net.mingsoft.cms.util.CmsParserUtil
;
import
net.mingsoft.cms.util.CmsParserUtil
;
import
net.mingsoft.mdiy.bean.PageBean
;
import
net.mingsoft.mdiy.util.ParserUtil
;
import
net.mingsoft.mdiy.util.ParserUtil
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
...
@@ -58,9 +55,7 @@ import javax.servlet.http.HttpServletResponse;
...
@@ -58,9 +55,7 @@ import javax.servlet.http.HttpServletResponse;
import
java.io.File
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
/**
/**
* @ClassName: GeneraterAction
* @ClassName: GeneraterAction
...
@@ -188,7 +183,7 @@ public class GeneraterAction extends BaseAction {
...
@@ -188,7 +183,7 @@ public class GeneraterAction extends BaseAction {
// 判断模板文件是否存在
// 判断模板文件是否存在
if
(
StringUtils
.
isEmpty
(
column
.
getCategoryListUrl
())
||
!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
column
.
getCategoryListUrl
())))
{
if
(
StringUtils
.
isEmpty
(
column
.
getCategoryListUrl
())
||
!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
column
.
getCategoryListUrl
())))
{
LOG
.
error
(
"模板不存在:{}"
,
column
.
getCategoryUrl
());
LOG
.
error
(
"
{}
模板不存在:{}"
,
column
.
getCategoryTitle
(),
column
.
getCategoryUrl
());
continue
;
continue
;
}
}
...
@@ -198,7 +193,7 @@ public class GeneraterAction extends BaseAction {
...
@@ -198,7 +193,7 @@ public class GeneraterAction extends BaseAction {
// 判断模板文件是否存在
// 判断模板文件是否存在
if
(
StringUtils
.
isEmpty
(
column
.
getCategoryUrl
())
||
!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
column
.
getCategoryUrl
())))
{
if
(
StringUtils
.
isEmpty
(
column
.
getCategoryUrl
())
||
!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
column
.
getCategoryUrl
())))
{
LOG
.
error
(
"模板不存在:{}"
,
column
.
getCategoryUrl
());
LOG
.
error
(
"
{}
模板不存在:{}"
,
column
.
getCategoryTitle
(),
column
.
getCategoryUrl
());
continue
;
continue
;
}
}
...
@@ -257,13 +252,13 @@ public class GeneraterAction extends BaseAction {
...
@@ -257,13 +252,13 @@ public class GeneraterAction extends BaseAction {
if
(
category
.
getCategoryType
().
equals
(
CategoryTypeEnum
.
LIST
.
toString
()))
{
if
(
category
.
getCategoryType
().
equals
(
CategoryTypeEnum
.
LIST
.
toString
()))
{
// 判断模板文件是否存在
// 判断模板文件是否存在
if
(!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
category
.
getCategoryListUrl
()))
||
StringUtils
.
isEmpty
(
category
.
getCategoryListUrl
()))
{
if
(!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
category
.
getCategoryListUrl
()))
||
StringUtils
.
isEmpty
(
category
.
getCategoryListUrl
()))
{
LOG
.
error
(
"模板不存在:{}"
,
category
.
getCategoryUrl
());
LOG
.
error
(
"
{}
模板不存在:{}"
,
category
.
getCategory
Title
(),
category
.
getCategoryList
Url
());
continue
;
continue
;
}
}
}
else
if
(
category
.
getCategoryType
().
equals
(
CategoryTypeEnum
.
COVER
.
toString
()))
{
}
else
if
(
category
.
getCategoryType
().
equals
(
CategoryTypeEnum
.
COVER
.
toString
()))
{
// 判断模板文件是否存在
// 判断模板文件是否存在
if
(!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
category
.
getCategoryListUrl
()))
||
StringUtils
.
isEmpty
(
category
.
getCategoryListUrl
()))
{
if
(!
FileUtil
.
exist
(
ParserUtil
.
buildTemplatePath
(
category
.
getCategoryListUrl
()))
||
StringUtils
.
isEmpty
(
category
.
getCategoryListUrl
()))
{
LOG
.
error
(
"模板不存在:{}"
,
category
.
getCategoryUrl
());
LOG
.
error
(
"
{}
模板不存在:{}"
,
category
.
getCategory
Title
(),
category
.
getCategoryList
Url
());
continue
;
continue
;
}
}
CategoryBean
columnArticleIdBean
=
new
CategoryBean
();
CategoryBean
columnArticleIdBean
=
new
CategoryBean
();
...
...
src/main/java/net/mingsoft/cms/biz/impl/CategoryBizImpl.java
View file @
049098d8
...
@@ -22,7 +22,6 @@
...
@@ -22,7 +22,6 @@
package
net.mingsoft.cms.biz.impl
;
package
net.mingsoft.cms.biz.impl
;
import
cn.hutool.core.lang.Assert
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
...
...
src/main/java/net/mingsoft/cms/entity/ContentEntity.java
View file @
049098d8
...
@@ -109,10 +109,6 @@ private static final long serialVersionUID = 1574925152617L;
...
@@ -109,10 +109,6 @@ private static final long serialVersionUID = 1574925152617L;
* 文章跳转链接地址
* 文章跳转链接地址
*/
*/
private
String
contentUrl
;
private
String
contentUrl
;
/**
* 文章管理的应用id
*/
/**
/**
* 点击次数
* 点击次数
*/
*/
...
@@ -291,5 +287,4 @@ private static final long serialVersionUID = 1574925152617L;
...
@@ -291,5 +287,4 @@ private static final long serialVersionUID = 1574925152617L;
public
String
getContentUrl
()
{
public
String
getContentUrl
()
{
return
this
.
contentUrl
;
return
this
.
contentUrl
;
}
}
}
}
src/main/java/net/mingsoft/cms/upgrade/Upgrade.java
deleted
100644 → 0
View file @
6135f0ec
package
net.mingsoft.cms.upgrade
;
import
net.mingsoft.basic.util.SpringUtil
;
import
net.mingsoft.cms.biz.ICategoryBiz
;
import
net.mingsoft.cms.entity.CategoryEntity
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author by 铭飞开源团队
* @Description
* @date 2020/6/19 15:58
*/
public
class
Upgrade
{
/**
* 更新栏目分类的顶级节点和叶子节点
*/
public
void
upgrade
(){
ICategoryBiz
categoryBiz
=
SpringUtil
.
getBean
(
ICategoryBiz
.
class
);
List
<
CategoryEntity
>
list
=
categoryBiz
.
queryAll
();
list
.
forEach
(
x
->{
//将parentId第一行设为顶级节点
String
topId
=
"0"
;
String
parentId
=
x
.
getParentids
();
if
(
parentId
!=
null
)
{
topId
=
parentId
.
split
(
","
)[
0
];
}
x
.
setTopId
(
topId
);
String
id
=
x
.
getId
();
boolean
leaf
=
true
;
//判断是否叶子,循环查找,如果有节点的父节点中包含该节点的id则判断为否跳出循环
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++)
{
String
pId
=
list
.
get
(
i
).
getParentids
();
if
(
pId
==
null
)
{
continue
;
}
leaf
=
!
pId
.
contains
(
id
);
//如果不是叶子就跳出循环,不需要再判断了
if
(!
leaf
)
{
break
;
}
}
x
.
setLeaf
(
leaf
);
//更新
Map
<
String
,
String
>
fields
=
new
HashMap
<>();
fields
.
put
(
"leaf"
,
x
.
getLeaf
()?
"1"
:
"0"
);
fields
.
put
(
"top_id"
,
x
.
getTopId
());
Map
<
String
,
String
>
where
=
new
HashMap
<>();
where
.
put
(
"id"
,
x
.
getId
());
categoryBiz
.
updateBySQL
(
"cms_category"
,
fields
,
where
);
});
}
}
src/main/java/net/mingsoft/config/DruidConfig.java
deleted
100644 → 0
View file @
6135f0ec
/**
* The MIT License (MIT)
* Copyright (c) 2020 铭软科技(mingsoft.net)
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package
net.mingsoft.config
;
import
com.alibaba.druid.support.http.WebStatFilter
;
import
com.alibaba.druid.support.spring.stat.DruidStatInterceptor
;
import
org.springframework.aop.Advisor
;
import
org.springframework.aop.support.DefaultPointcutAdvisor
;
import
org.springframework.aop.support.JdkRegexpMethodPointcut
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @author by 铭飞开源团队
* @Description TODO
* @date 2020/1/10 11:21
*/
@Configuration
@ConditionalOnProperty
(
prefix
=
"spring"
,
name
=
"datasource.druid.stat-view-servlet.enabled"
,
havingValue
=
"true"
)
public
class
DruidConfig
{
/**
* druid监控 配置URI拦截策略
*/
@Bean
public
FilterRegistrationBean
druidStatFilter
()
{
FilterRegistrationBean
filterRegistrationBean
=
new
FilterRegistrationBean
(
new
WebStatFilter
());
// 添加过滤规则.
filterRegistrationBean
.
addUrlPatterns
(
"/*"
);
// 添加不需要忽略的格式信息.
filterRegistrationBean
.
addInitParameter
(
"exclusions"
,
"/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*"
);
// 用于session监控页面的用户名显示 需要登录后主动将username注入到session里
filterRegistrationBean
.
addInitParameter
(
"principalSessionName"
,
"username"
);
return
filterRegistrationBean
;
}
/**
* druid数据库连接池监控
*/
@Bean
public
DruidStatInterceptor
druidStatInterceptor
()
{
return
new
DruidStatInterceptor
();
}
@Bean
public
JdkRegexpMethodPointcut
druidStatPointcut
()
{
JdkRegexpMethodPointcut
druidStatPointcut
=
new
JdkRegexpMethodPointcut
();
String
patterns
=
"net.mingsoft.*.biz.*"
;
// 可以set多个
druidStatPointcut
.
setPatterns
(
patterns
);
return
druidStatPointcut
;
}
/**
* druid 为druidStatPointcut添加拦截
*
* @return
*/
@Bean
public
Advisor
druidStatAdvisor
()
{
return
new
DefaultPointcutAdvisor
(
druidStatPointcut
(),
druidStatInterceptor
());
}
}
src/main/java/net/mingsoft/config/FreemarkerConfig.java
deleted
100644 → 0
View file @
6135f0ec
/**
* The MIT License (MIT)
* Copyright (c) 2020 铭软科技(mingsoft.net)
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package
net.mingsoft.config
;
import
java.io.IOException
;
import
java.util.Properties
;
import
javax.annotation.PostConstruct
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer
;
import
com.jagregory.shiro.freemarker.ShiroTags
;
import
freemarker.template.TemplateException
;
@Configuration
public
class
FreemarkerConfig
{
@Autowired
protected
freemarker
.
template
.
Configuration
configuration
;
@Autowired
protected
org
.
springframework
.
web
.
servlet
.
view
.
freemarker
.
FreeMarkerConfigurer
configurer
;
@Autowired
protected
org
.
springframework
.
web
.
servlet
.
view
.
freemarker
.
FreeMarkerViewResolver
resolver
;
@Autowired
protected
org
.
springframework
.
web
.
servlet
.
view
.
InternalResourceViewResolver
springResolver
;
@PostConstruct
public
void
init
()
throws
IOException
,
TemplateException
{
configuration
.
setSharedVariable
(
"shiro"
,
new
ShiroTags
());
}
}
src/main/java/net/mingsoft/config/ShiroConfig.java
deleted
100644 → 0
View file @
6135f0ec
/**
* The MIT License (MIT)
* Copyright (c) 2020 铭软科技(mingsoft.net)
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package
net.mingsoft.config
;
import
cn.hutool.core.codec.Base64
;
import
net.mingsoft.basic.realm.ManagerAuthRealm
;
import
org.apache.shiro.mgt.SecurityManager
;
import
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor
;
import
org.apache.shiro.spring.web.ShiroFilterFactoryBean
;
import
org.apache.shiro.web.mgt.CookieRememberMeManager
;
import
org.apache.shiro.web.mgt.DefaultWebSecurityManager
;
import
org.apache.shiro.web.servlet.SimpleCookie
;
import
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
@Configuration
public
class
ShiroConfig
{
@Value
(
"${ms.manager.path}"
)
private
String
managerPath
;
/**
* 开启Shiro的注解(如@RequiresRoles , @RequiresPermissions),需借助SspringAOP扫描使用Sshiro注解的类,并在必要时进行安全逻辑验证
* 配置以下两个bean(Defaul tAdvisorAutoProxyCreator和uthorizat ionAttributeSourceAdvisor)即可实现此功能
*/
@Bean
public
DefaultAdvisorAutoProxyCreator
advisorAutoProxyCreator
(){
DefaultAdvisorAutoProxyCreator
advisorAutoProxyCreator
=
new
DefaultAdvisorAutoProxyCreator
();
advisorAutoProxyCreator
.
setProxyTargetClass
(
true
);
return
advisorAutoProxyCreator
;
}
/**
* 开启shiro aop注解支持
* 使用代理方式;所以需要开启代码支持
* @param securityManager
*/
@Bean
public
AuthorizationAttributeSourceAdvisor
authorizationAttributeSourceAdvisor
(
SecurityManager
securityManager
){
AuthorizationAttributeSourceAdvisor
authorizationAttributeSourceAdvisor
=
new
AuthorizationAttributeSourceAdvisor
();
authorizationAttributeSourceAdvisor
.
setSecurityManager
(
securityManager
);
return
authorizationAttributeSourceAdvisor
;
}
@Bean
public
AuthorizationAttributeSourceAdvisor
getAuthorizationAttributeSourceAdvisor
(
DefaultWebSecurityManager
securityManager
)
{
AuthorizationAttributeSourceAdvisor
advisor
=
new
AuthorizationAttributeSourceAdvisor
();
advisor
.
setSecurityManager
(
securityManager
);
return
advisor
;
}
@Bean
public
DefaultAdvisorAutoProxyCreator
getDefaultAdvisorAutoProxyCreator
()
{
DefaultAdvisorAutoProxyCreator
autoProxyCreator
=
new
DefaultAdvisorAutoProxyCreator
();
autoProxyCreator
.
setProxyTargetClass
(
true
);
return
autoProxyCreator
;
}
@Bean
public
ShiroFilterFactoryBean
shirFilter
(
SecurityManager
securityManager
)
{
ShiroFilterFactoryBean
shiroFilterFactoryBean
=
new
ShiroFilterFactoryBean
();
// 必须设置 SecurityManager
shiroFilterFactoryBean
.
setSecurityManager
(
securityManager
);
// setLoginUrl 如果不设置值,默认会自动寻找Web工程根目录下的"/login.jsp"页面 或 "/login" 映射
shiroFilterFactoryBean
.
setLoginUrl
(
managerPath
+
"/login.do"
);
// 设置无权限时跳转的 url;
shiroFilterFactoryBean
.
setUnauthorizedUrl
(
managerPath
+
"/404.do"
);
// 设置拦截器
Map
<
String
,
String
>
filterChainDefinitionMap
=
new
LinkedHashMap
<>();
// 游客,开发权限
filterChainDefinitionMap
.
put
(
"/static/**"
,
"anon"
);
filterChainDefinitionMap
.
put
(
"/html/**"
,
"anon"
);
// 开放登陆接口
filterChainDefinitionMap
.
put
(
managerPath
+
"/login.do"
,
"anon"
);
filterChainDefinitionMap
.
put
(
managerPath
+
"/checkLogin.do"
,
"anon"
);
// 其余接口一律拦截
// 主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截
filterChainDefinitionMap
.
put
(
managerPath
+
"/**"
,
"user"
);
shiroFilterFactoryBean
.
setFilterChainDefinitionMap
(
filterChainDefinitionMap
);
return
shiroFilterFactoryBean
;
}
/**
* cookie对象
* @return
*/
public
SimpleCookie
rememberMeCookie
()
{
// 设置cookie名称,对应login.html页面的<input type="checkbox" name="rememberMe"/>
SimpleCookie
cookie
=
new
SimpleCookie
(
"rememberMe"
);
// 设置cookie的过期时间,单位为秒,这里为一天
cookie
.
setMaxAge
(
86400
);
return
cookie
;
}
/**
* cookie管理对象
* @return
*/
public
CookieRememberMeManager
rememberMeManager
()
{
CookieRememberMeManager
cookieRememberMeManager
=
new
CookieRememberMeManager
();
cookieRememberMeManager
.
setCookie
(
rememberMeCookie
());
// rememberMe cookie加密的密钥
cookieRememberMeManager
.
setCipherKey
(
Base64
.
decode
(
"4AvVhmFLUs0KTA3Kprsdag=="
));
return
cookieRememberMeManager
;
}
/**
* 注入 securityManager
*/
@Bean
public
SecurityManager
securityManager
()
{
DefaultWebSecurityManager
securityManager
=
new
DefaultWebSecurityManager
();
// 设置realm.
securityManager
.
setRealm
(
customRealm
());
//cookie管理配置对象
securityManager
.
setRememberMeManager
(
rememberMeManager
());
return
securityManager
;
}
/**
* 自定义身份认证 realm;
* <p>
* 必须写这个类,并加上 @Bean 注解,目的是注入 CustomRealm, 否则会影响 CustomRealm类 中其他类的依赖注入
*/
@Bean
public
ManagerAuthRealm
customRealm
()
{
return
new
ManagerAuthRealm
();
}
}
src/main/java/net/mingsoft/config/SwaggerConfig.java
deleted
100644 → 0
View file @
6135f0ec
/**
* The MIT License (MIT)
* Copyright (c) 2020 铭软科技(mingsoft.net)
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package
net.mingsoft.config
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.EnableWebMvc
;
import
springfox.documentation.builders.ApiInfoBuilder
;
import
springfox.documentation.builders.PathSelectors
;
import
springfox.documentation.builders.RequestHandlerSelectors
;
import
springfox.documentation.service.ApiInfo
;
import
springfox.documentation.spi.DocumentationType
;
import
springfox.documentation.spring.web.plugins.Docket
;
import
springfox.documentation.swagger2.annotations.EnableSwagger2
;
@Configuration
@EnableSwagger2
@ConditionalOnProperty
(
prefix
=
"ms"
,
name
=
"swagger-enable"
,
havingValue
=
"true"
)
public
class
SwaggerConfig
{
@Value
(
"${ms.manager.path}"
)
private
String
mangerPath
;
@Bean
public
Docket
api
()
{
return
new
Docket
(
DocumentationType
.
SWAGGER_2
).
apiInfo
(
apiInfo
()).
select
()
.
apis
(
RequestHandlerSelectors
.
basePackage
(
"net.mingsoft"
)).
paths
(
PathSelectors
.
regex
(
"^((?!("
+
mangerPath
+
"|static)).)+$"
))
.
build
();
}
private
ApiInfo
apiInfo
()
{
return
new
ApiInfoBuilder
().
title
(
"api文档"
).
description
(
"restful 风格接口"
)
// 服务条款网址
// .termsOfServiceUrl("")
.
version
(
"1.0"
)
// .contact(new Contact("hello", "url", "email"))
.
build
();
}
}
src/main/java/net/mingsoft/config/SwaggerSuffixAspect.java
deleted
100644 → 0
View file @
6135f0ec
/**
* The MIT License (MIT)
* Copyright (c) 2020 铭软科技(mingsoft.net)
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package
net.mingsoft.config
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.Map
;
import
org.aspectj.lang.annotation.AfterReturning
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.springframework.context.annotation.EnableAspectJAutoProxy
;
import
org.springframework.stereotype.Component
;
import
io.swagger.models.Path
;
import
io.swagger.models.Swagger
;
@Aspect
@EnableAspectJAutoProxy
@Component
public
class
SwaggerSuffixAspect
{
@AfterReturning
(
pointcut
=
"execution(public io.swagger.models.Swagger springfox.documentation.swagger2.mappers.ServiceModelToSwagger2MapperImpl.mapDocumentation(..))"
,
returning
=
"swagger"
)
public
void
doBeforeBussinessCheck
(
Swagger
swagger
)
{
Map
<
String
,
Path
>
paths
=
swagger
.
getPaths
();
if
(
null
!=
paths
)
{
Map
<
String
,
Path
>
newPaths
=
new
HashMap
<
String
,
Path
>(
paths
);
paths
.
clear
();
Iterator
<
String
>
it
=
newPaths
.
keySet
().
iterator
();
while
(
it
.
hasNext
())
{
String
oldKey
=
it
.
next
();
String
newKey
=
oldKey
+
".do"
;
paths
.
put
(
newKey
,
newPaths
.
get
(
oldKey
));
}
newPaths
=
null
;
}
}
}
src/main/java/net/mingsoft/config/WebConfig.java
deleted
100644 → 0
View file @
6135f0ec
/**
* The MIT License (MIT)
* Copyright (c) 2020 铭软科技(mingsoft.net)
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package
net.mingsoft.config
;
import
com.alibaba.druid.pool.DruidDataSource
;
import
com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator
;
import
com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer
;
import
com.fasterxml.jackson.databind.DeserializationFeature
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
net.mingsoft.basic.filter.XSSEscapeFilter
;
import
net.mingsoft.basic.interceptor.ActionInterceptor
;
import
net.mingsoft.basic.resolver.MSLocaleResolver
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.boot.web.servlet.ServletListenerRegistrationBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.core.Ordered
;
import
org.springframework.http.converter.HttpMessageConverter
;
import
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
;
import
org.springframework.web.context.request.RequestContextListener
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
;
import
org.springframework.web.servlet.config.annotation.ViewControllerRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
;
import
java.io.File
;
import
java.util.List
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
java.util.concurrent.ThreadPoolExecutor
;
import
java.util.concurrent.TimeUnit
;
@Configuration
public
class
WebConfig
implements
WebMvcConfigurer
{
/**
* 上传路径
*/
@Value
(
"${ms.upload.path}"
)
private
String
uploadFloderPath
;
@Value
(
"${ms.upload.template}"
)
private
String
template
;
/**
* 上传路径映射
*/
@Value
(
"${ms.upload.mapping}"
)
private
String
uploadMapping
;
/**
* 上传路径映射
*/
@Value
(
"${ms.html-dir:html}"
)
private
String
htmlDir
;
@Bean
public
ActionInterceptor
actionInterceptor
()
{
return
new
ActionInterceptor
();
}
@Bean
public
ConfigurationCustomizer
configurationCustomizer
()
{
return
configuration
->
configuration
.
setUseDeprecatedExecutor
(
false
);
}
/**zF
* 增加对rest api鉴权的spring mvc拦截器
*/
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
// 排除配置
registry
.
addInterceptor
(
actionInterceptor
()).
excludePathPatterns
(
"/static/**"
,
"/app/**"
,
"/webjars/**"
,
"/*.html"
,
"/*.htm"
);
}
@Override
public
void
addResourceHandlers
(
ResourceHandlerRegistry
registry
)
{
registry
.
addResourceHandler
(
uploadMapping
).
addResourceLocations
(
File
.
separator
+
uploadFloderPath
+
File
.
separator
,
"file:"
+
uploadFloderPath
+
File
.
separator
,
"classpath:/template/"
);
registry
.
addResourceHandler
(
"/template/**"
).
addResourceLocations
(
File
.
separator
+
template
+
File
.
separator
,
"file:"
+
template
+
File
.
separator
,
"classpath:/html/"
);
//注意这里的htmlDir资源不能使用File.separator替代"/",会导致Windows一键版访问失效
registry
.
addResourceHandler
(
"/"
.
concat
(
htmlDir
).
concat
(
"/**"
)).
addResourceLocations
(
"/"
.
concat
(
htmlDir
).
concat
(
"/"
),
"file:"
.
concat
(
htmlDir
).
concat
(
"/"
));
//三种映射方式 webapp下、当前目录下、jar内
registry
.
addResourceHandler
(
"/app/**"
).
addResourceLocations
(
"/app/"
,
"file:app/"
,
"classpath:/app/"
);
registry
.
addResourceHandler
(
"/static/**"
).
addResourceLocations
(
"/static/"
,
"file:static/"
,
"classpath:/static/"
,
"classpath:/META-INF/resources/"
);
registry
.
addResourceHandler
(
"/api/**"
).
addResourceLocations
(
"/api/"
,
"file:api/"
,
"classpath:/api/"
);
if
(
new
File
(
uploadFloderPath
).
isAbsolute
()){
//如果指定了绝对路径,上传的文件都映射到uploadMapping下
registry
.
addResourceHandler
(
uploadMapping
).
addResourceLocations
(
"file:"
+
uploadFloderPath
+
File
.
separator
//映射其他路径文件
//,file:F://images
);
}
}
/**
* druid数据库连接池监控
*/
@Bean
public
BeanTypeAutoProxyCreator
beanTypeAutoProxyCreator
()
{
BeanTypeAutoProxyCreator
beanTypeAutoProxyCreator
=
new
BeanTypeAutoProxyCreator
();
beanTypeAutoProxyCreator
.
setTargetBeanType
(
DruidDataSource
.
class
);
beanTypeAutoProxyCreator
.
setInterceptorNames
(
"druidStatInterceptor"
);
return
beanTypeAutoProxyCreator
;
}
//XSS过滤器
@Bean
public
FilterRegistrationBean
xssFilterRegistration
()
{
XSSEscapeFilter
xssFilter
=
new
XSSEscapeFilter
();
FilterRegistrationBean
registration
=
new
FilterRegistrationBean
(
xssFilter
);
xssFilter
.
includes
.
add
(
".*/search.do"
);
registration
.
setName
(
"XSSFilter"
);
registration
.
addUrlPatterns
(
"/*"
);
registration
.
setOrder
(
Ordered
.
HIGHEST_PRECEDENCE
);
return
registration
;
}
/**
* RequestContextListener注册
*/
@Bean
public
ServletListenerRegistrationBean
<
RequestContextListener
>
requestContextListenerRegistration
()
{
return
new
ServletListenerRegistrationBean
<>(
new
RequestContextListener
());
}
/**
* 设置默认首页
*/
@Override
public
void
addViewControllers
(
ViewControllerRegistry
registry
)
{
registry
.
addViewController
(
"/"
).
setViewName
(
"forward:/index.do"
);
registry
.
setOrder
(
Ordered
.
HIGHEST_PRECEDENCE
);
WebMvcConfigurer
.
super
.
addViewControllers
(
registry
);
}
/**
* 解决com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 问题,提交实体不存在的字段异常
*/
@Override
public
void
configureMessageConverters
(
List
<
HttpMessageConverter
<?>>
converters
)
{
// TODO Auto-generated method stub
converters
.
add
(
mappingJackson2HttpMessageConverter
());
WebMvcConfigurer
.
super
.
configureMessageConverters
(
converters
);
}
@Bean
public
MappingJackson2HttpMessageConverter
mappingJackson2HttpMessageConverter
(){
MappingJackson2HttpMessageConverter
converter
=
new
MappingJackson2HttpMessageConverter
();
ObjectMapper
objectMapper
=
new
ObjectMapper
();
//添加此配置
objectMapper
.
configure
(
DeserializationFeature
.
FAIL_ON_UNKNOWN_PROPERTIES
,
false
);
converter
.
setObjectMapper
(
objectMapper
);
return
converter
;
}
@Bean
public
ExecutorService
crawlExecutorPool
()
{
// 创建线程池
ExecutorService
pool
=
new
ThreadPoolExecutor
(
20
,
20
,
0L
,
TimeUnit
.
MILLISECONDS
,
new
LinkedBlockingQueue
<
Runnable
>());
return
pool
;
}
/**
* 国际化配置拦截
* @return
*/
@Bean
public
MSLocaleResolver
localeResolver
(){
return
new
MSLocaleResolver
();
}
}
src/main/webapp/WEB-INF/manager/cms/category/form.ftl
View file @
049098d8
...
@@ -208,7 +208,7 @@
...
@@ -208,7 +208,7 @@
<el-form-item label="缩略图" prop="categoryImg" >
<el-form-item label="缩略图" prop="categoryImg" >
<el-upload
<el-upload
:file-list="form.categoryImg"
:file-list="form.categoryImg"
:action="ms.
base
+'/file/upload.do'"
:action="ms.
manager
+'/file/upload.do'"
:on-remove="categoryImghandleRemove"
:on-remove="categoryImghandleRemove"
:style="
{
width
:
''
}
"
:style="
{
width
:
''
}
"
:limit="1"
:limit="1"
...
@@ -418,7 +418,11 @@
...
@@ -418,7 +418,11 @@
if (that.form.categoryType == '2') {
if (that.form.categoryType == '2') {
that.form.categoryListUrl = '';
that.form.categoryListUrl = '';
}
}
//栏目属性为链接则不需要列表和详情模板
if(that.form.categoryType == '3'){
that.form.categoryListUrl = '';
that.form.categoryUrl = '';
}
that.saveDisabled = true;
that.saveDisabled = true;
var data = JSON.parse(JSON.stringify(that.form));
var data = JSON.parse(JSON.stringify(that.form));
...
@@ -446,9 +450,12 @@
...
@@ -446,9 +450,12 @@
that.$notify({
that.$notify({
title: '成功',
title: '成功',
message: '保存成功',
message: '保存成功',
type: 'success'
type: 'success',
duration: 1000,
onClose:function (){
location.href = ms.manager + "
/
cms
/
category
/
index
.do
";
}
});
});
location.href = ms.manager + "
/
cms
/
category
/
index
.do
";
} else {
} else {
that.$notify({
that.$notify({
title: '失败',
title: '失败',
...
...
src/main/webapp/WEB-INF/manager/cms/content/form.ftl
View file @
049098d8
...
@@ -159,7 +159,7 @@
...
@@ -159,7 +159,7 @@
<el-form-item label="文章缩略图" prop="contentImg">
<el-form-item label="文章缩略图" prop="contentImg">
<el-upload
<el-upload
:file-list="form.contentImg"
:file-list="form.contentImg"
:action="ms.
base
+'/file/upload.do'"
:action="ms.
manager
+'/file/upload.do'"
:on-remove="contentImghandleRemove"
:on-remove="contentImghandleRemove"
:style="
{
width
:
''
}
"
:style="
{
width
:
''
}
"
:limit="1"
:limit="1"
...
...
src/main/webapp/WEB-INF/manager/cms/content/index.ftl
View file @
049098d8
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
</el-tree>
</el-tree>
</el-scrollbar>
</el-scrollbar>
</div>
</div>
<iframe :src="action" class="ms-iframe-style">
<iframe :src="action" class="ms-iframe-style"
style="background:url('$
{
base
}
/static/images/loading.gif') no-repeat center;"
>
</iframe>
</iframe>
</el-container>
</el-container>
</
div
>
</
div
>
...
@@ -56,7 +56,7 @@
...
@@ -56,7 +56,7 @@
this
.action
=
ms
.manager
+
"/cms/content/form.do?categoryId="
+
data
.id
+
"&type=2"
;
this
.action
=
ms
.manager
+
"/cms/content/form.do?categoryId="
+
data
.id
+
"&type=2"
;
//
id
=
0
时为最顶级节点全部节点
//
id
=
0
时为最顶级节点全部节点
}
else
if
(
data
.id
==
0
){
}
else
if
(
data
.id
==
0
){
this
.action
=
ms
.manager
+
"/cms/content/main.do?leaf=
tru
e"
;
this
.action
=
ms
.manager
+
"/cms/content/main.do?leaf=
fals
e"
;
}
}
},
},
treeList
:
function
()
{
treeList
:
function
()
{
...
@@ -135,6 +135,11 @@
...
@@ -135,6 +135,11 @@
height
:
40
px
!
important
;
height
:
40
px
!
important
;
line-height
:
46
px
!
important
;
line-height
:
46
px
!
important
;
}
}
#index .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content
{
background-color
:
rgb
(
137
140
145
)
;
color
:
#
fff
;
border-radius
:
2
px
;
}
body
{
body
{
overflow
:
hidden
;
overflow
:
hidden
;
}
}
...
...
src/main/webapp/WEB-INF/manager/cms/content/main.ftl
View file @
049098d8
...
@@ -154,6 +154,8 @@
...
@@ -154,6 +154,8 @@
el
:
'
eq
'
,
el
:
'
eq
'
,
model
:
'
contentDisplay
'
,
model
:
'
contentDisplay
'
,
name
:
'是否显示'
,
name
:
'是否显示'
,
key
:
'
value
'
,
title
:
'
label
'
,
type
:
'
radio
'
,
type
:
'
radio
'
,
label
:
true
,
label
:
true
,
multiple
:
false
multiple
:
false
...
@@ -173,7 +175,7 @@
...
@@ -173,7 +175,7 @@
type
:
'
input
'
type
:
'
input
'
},
{
},
{
action
:
'
and
'
,
action
:
'
and
'
,
field
:
'
content_datetime
'
,
field
:
'
ct
.
content_datetime
'
,
model
:
'
contentDatetime
'
,
model
:
'
contentDatetime
'
,
el
:
'
gt
'
,
el
:
'
gt
'
,
name
:
'发布时间'
,
name
:
'发布时间'
,
...
@@ -213,23 +215,16 @@
...
@@ -213,23 +215,16 @@
model
:
'
contentUrl
'
,
model
:
'
contentUrl
'
,
name
:
'文章跳转链接地址'
,
name
:
'文章跳转链接地址'
,
type
:
'
input
'
type
:
'
input
'
},
{
},{
action
:
'
and
'
,
field
:
'
appid
'
,
el
:
'
eq
'
,
model
:
'
appid
'
,
name
:
'文章管理的应用
id
'
,
type
:
'
number
'
},
{
action
:
'
and
'
,
action
:
'
and
'
,
field
:
'
create_date
'
,
field
:
'
ct
.
create_date
'
,
el
:
'
eq
'
,
el
:
'
eq
'
,
model
:
'
createDate
'
,
model
:
'
createDate
'
,
name
:
'创建时间'
,
name
:
'创建时间'
,
type
:
'
date
'
type
:
'
date
'
},
{
},
{
action
:
'
and
'
,
action
:
'
and
'
,
field
:
'
update_date
'
,
field
:
'
ct
.
update_date
'
,
el
:
'
eq
'
,
el
:
'
eq
'
,
model
:
'
updateDate
'
,
model
:
'
updateDate
'
,
name
:
'修改时间'
,
name
:
'修改时间'
,
...
...
src/main/webapp/WEB-INF/manager/main.ftl
View file @
049098d8
...
@@ -2,35 +2,7 @@
...
@@ -2,35 +2,7 @@
<
head
>
<
head
>
<meta charset="utf-8" />
<meta charset="utf-8" />
<title>后台主界面</title>
<title>后台主界面</title>
<meta http-equiv="content-type" content="text/html" />
<#include "../../include/head-file.ftl">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
<meta name="viewport"
content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no,width=device-width"/>
<meta name="format-detection" content="telephone=no"/>
<meta name="app-mobile-web-app-capable" content="yes"/>
<meta name="app-mobile-web-app-status-bar-style" content="black-translucent"/>
<script src="$
{
base
}
/static/plugins/vue/2.6.9/vue.min.js"></script>
<!--通用图标-->
<link rel="stylesheet" href="$
{
base
}
/static/plugins/iconfont/1.0.0/iconfont.css" />
<script src="$
{
base
}
/static/plugins/element-ui/2.12.0/index.js"></script>
<link rel="stylesheet" href="$
{
base
}
/static/plugins/element-ui/2.12.0/index.css" />
<!--网络请求框架-->
<script src="$
{
base
}
/static/plugins/axios/0.18.0/axios.min.js"></script>
<script src="$
{
base
}
/static/plugins/qs/6.6.0/qs.min.js"></script>
<!--铭飞-->
<script src="$
{
base
}
/static/plugins/ms/1.0.0/ms.js"></script>
<script src="$
{
base
}
/static/plugins/ms/1.0.0/ms.http.js"></script>
<script src="$
{
base
}
/static/plugins/ms/1.0.0/ms.util.js"></script>
<link rel="stylesheet" href="$
{
base
}
/static/plugins/minireset/0.0.2/minireset.min.css" />
<script>
ms.base = '$
{
base
}
';
ms.manager = '$
{
managerPath
}
';
</script>
<style>
[v-cloak]
{
display
:
none
;
}
</style>
</
head
>
</
head
>
<
body
class="custom-body">
<
body
class="custom-body">
<
div
id="app" v-cloak>
<
div
id="app" v-cloak>
...
@@ -43,12 +15,15 @@
...
@@ -43,12 +15,15 @@
</div>
</div>
<div class="class-6" >
<div class="class-6" >
</div>
</div>
<div class="panel" >
<div class="panel"
style="min-height:200px;"
>
<div
v-if="alwaysList.length>0" class="panel-title
">
<div
class="panel-title" style="display:inline;
">
常用功能
常用功能
<el-tooltip effect="dark" content="鼠标移至上方功能大全,点击菜单右侧五角星即可添加到常用功能。" placement="left">
<i class="el-icon-question"></i>
</el-tooltip>
</div>
</div>
<div class="v-space"></div>
<div class="v-space"></div>
<div class="panel-content" style="flex-direction: row;flex-wrap: wrap; flex: unset">
<div class="panel-content" style="flex-direction: row;flex-wrap: wrap; flex: unset
;margin-top:20px;
">
<div class="mitem"
<div class="mitem"
@click="window.parent.indexVue.openParentMenuInTitle(item.title)"
@click="window.parent.indexVue.openParentMenuInTitle(item.title)"
v-for="item in alwaysList">
v-for="item in alwaysList">
...
@@ -146,7 +121,7 @@
...
@@ -146,7 +121,7 @@
<div class="class-66" >
<div class="class-66" >
<!--图片开始-->
<!--图片开始-->
<img
<img
src="
$
{
base
}
/static/images/1577687056305
.png"
src="
https://cdn.mingsoft.net/images/icon-qq
.png"
class="class-67" />
class="class-67" />
<!--图片结束-->
<!--图片结束-->
</div>
</div>
...
@@ -163,7 +138,7 @@
...
@@ -163,7 +138,7 @@
<div class="class-72" >
<div class="class-72" >
<!--图片开始-->
<!--图片开始-->
<img
<img
src="
$
{
base
}
/static/images/1577687056305
.png"
src="
https://cdn.mingsoft.net/images/icon-qq
.png"
class="class-73" />
class="class-73" />
<!--图片结束-->
<!--图片结束-->
</div>
</div>
...
@@ -180,7 +155,7 @@
...
@@ -180,7 +155,7 @@
<div class="class-78" >
<div class="class-78" >
<!--图片开始-->
<!--图片开始-->
<img
<img
src="
$
{
base
}
/static/images/1577687056305
.png"
src="
https://cdn.mingsoft.net/images/icon-qq
.png"
class="class-79" />
class="class-79" />
<!--图片结束-->
<!--图片结束-->
</div>
</div>
...
@@ -197,7 +172,7 @@
...
@@ -197,7 +172,7 @@
<div class="class-84" >
<div class="class-84" >
<!--图片开始-->
<!--图片开始-->
<img
<img
src="
$
{
base
}
/static/images/1577687056305
.png"
src="
https://cdn.mingsoft.net/images/icon-qq
.png"
class="class-85" />
class="class-85" />
<!--图片结束-->
<!--图片结束-->
</div>
</div>
...
@@ -297,7 +272,7 @@
...
@@ -297,7 +272,7 @@
<div class="class-126" >
<div class="class-126" >
<!--图片开始-->
<!--图片开始-->
<img
<img
src="
$
{
base
}
/static/images/1577687023678
.png"
src="
https://cdn.mingsoft.net/images/icon-telephone
.png"
class="class-127" />
class="class-127" />
<!--图片结束-->
<!--图片结束-->
</div>
</div>
...
@@ -314,7 +289,7 @@
...
@@ -314,7 +289,7 @@
<div class="class-132" >
<div class="class-132" >
<!--图片开始-->
<!--图片开始-->
<img
<img
src="
$
{
base
}
/static/images/1577687056305
.png"
src="
https://cdn.mingsoft.net/images/icon-qq
.png"
class="class-133" />
class="class-133" />
<!--图片结束-->
<!--图片结束-->
</div>
</div>
...
@@ -1089,7 +1064,7 @@
...
@@ -1089,7 +1064,7 @@
.class-44
.class-44
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578104008987
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
mmall
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
cover
;
background-size
:
cover
;
...
@@ -1131,7 +1106,7 @@
...
@@ -1131,7 +1106,7 @@
.class-47
.class-47
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578367666376
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
weixin
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
cover
;
background-size
:
cover
;
...
@@ -1173,7 +1148,7 @@
...
@@ -1173,7 +1148,7 @@
.class-50
.class-50
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578366770290
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
mapp
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
cover
;
background-size
:
cover
;
...
@@ -1215,7 +1190,7 @@
...
@@ -1215,7 +1190,7 @@
.class-53
.class-53
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578368816112
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
secondaryDevelopment
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
cover
;
background-size
:
cover
;
...
@@ -1301,7 +1276,7 @@
...
@@ -1301,7 +1276,7 @@
.class-59
.class-59
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1577257489392
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-voice
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -1347,7 +1322,7 @@
...
@@ -1347,7 +1322,7 @@
.class-62
.class-62
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1577151868190
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-file
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
height
:
40
px
;
height
:
40
px
;
...
@@ -1763,7 +1738,7 @@
...
@@ -1763,7 +1738,7 @@
.class-96
.class-96
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031206821
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-menu
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -1807,7 +1782,7 @@
...
@@ -1807,7 +1782,7 @@
.class-99
.class-99
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031321635
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-approve
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -1851,7 +1826,7 @@
...
@@ -1851,7 +1826,7 @@
.class-102
.class-102
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031484700
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-office
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -1895,7 +1870,7 @@
...
@@ -1895,7 +1870,7 @@
.class-105
.class-105
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031264207
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-remote
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -1939,7 +1914,7 @@
...
@@ -1939,7 +1914,7 @@
.class-108
.class-108
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031682848
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-voiceAssistance
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -1983,7 +1958,7 @@
...
@@ -1983,7 +1958,7 @@
.class-111
.class-111
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031639173
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-vip
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -2027,7 +2002,7 @@
...
@@ -2027,7 +2002,7 @@
.class-114
.class-114
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031215338
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-invoice
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -2071,7 +2046,7 @@
...
@@ -2071,7 +2046,7 @@
.class-117
.class-117
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031228196
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-authorize
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -2115,7 +2090,7 @@
...
@@ -2115,7 +2090,7 @@
.class-120
.class-120
{
{
color
:
#
333333
;
color
:
#
333333
;
background-image
:
url
(
$
{
base
}
/
static
/
images
/
1578031234719
.png
)
;
background-image
:
url
(
https
:
//
cdn
.mingsoft.net
/
images
/
icon-letterOfAuthorization
.png
)
;
outline
:
none
;
outline
:
none
;
outline-offset
:
-1
px
;
outline-offset
:
-1
px
;
background-size
:
contain
;
background-size
:
contain
;
...
@@ -2855,4 +2830,4 @@
...
@@ -2855,4 +2830,4 @@
#app
{
#app
{
overflow-x
:
hidden
;
overflow-x
:
hidden
;
}
}
</
style
>
</
style
>
\ No newline at end of file
src/main/webapp/static/css/app.css
View file @
049098d8
html
,
html
,
body
{
body
{
min-height
:
100vh
;
min-height
:
100vh
;
width
:
100vw
;
width
:
100vw
;
background-color
:
#eee
;
background-color
:
#eee
;
...
@@ -10,12 +9,15 @@ body {
...
@@ -10,12 +9,15 @@ body {
color
:
#333
!important
;
color
:
#333
!important
;
overflow
:
hidden
;
overflow
:
hidden
;
}
}
html
*,
html
*,
body
*
{
body
*
{
text-decoration
:
none
!important
;
text-decoration
:
none
!important
;
font-family
:
Verdana
,
Arial
,
Helvetica
,
sans-serif
;
font-family
:
Verdana
,
Arial
,
Helvetica
,
sans-serif
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
}
}
/**
*框架样式
*/
.ms-ellipsis
{
.ms-ellipsis
{
overflow
:
hidden
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
text-overflow
:
ellipsis
;
...
@@ -26,14 +28,6 @@ body * {
...
@@ -26,14 +28,6 @@ body * {
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
}
}
input
::-webkit-input-placeholder
,
textarea
::-webkit-input-placeholder
{
font-weight
:
initial
;
font-size
:
12px
;
color
:
#999
;
resize
:
none
;
}
a
:link
,
a
:visited
,
a
:active
{
text-decoration
:
none
;
color
:
#409EFF
;}
.ms-index
{
.ms-index
{
display
:
flex
;
display
:
flex
;
...
@@ -48,7 +42,6 @@ a:link,a:visited,a:active{text-decoration: none; color:#409EFF;}
...
@@ -48,7 +42,6 @@ a:link,a:visited,a:active{text-decoration: none; color:#409EFF;}
padding
:
14px
;
padding
:
14px
;
background
:
#fff
;
background
:
#fff
;
}
}
.ms-header
{
.ms-header
{
padding
:
10px
;
padding
:
10px
;
margin
:
0
;
margin
:
0
;
...
@@ -69,10 +62,8 @@ a:link,a:visited,a:active{text-decoration: none; color:#409EFF;}
...
@@ -69,10 +62,8 @@ a:link,a:visited,a:active{text-decoration: none; color:#409EFF;}
.ms-tr
{
.ms-tr
{
text-align
:
right
;
text-align
:
right
;
}
}
.ms-loading
{
background
:
url('/static/images/loading.gif')
no-repeat
center
;}
.el-button
+
.el-button
{
/*表单提示*/
margin-left
:
0
}
.ms-form-tip
,
.ms-form-tip-err
{
.ms-form-tip
,
.ms-form-tip-err
{
color
:
#909399
;
color
:
#909399
;
font-size
:
12px
;
font-size
:
12px
;
...
@@ -80,18 +71,16 @@ a:link,a:visited,a:active{text-decoration: none; color:#409EFF;}
...
@@ -80,18 +71,16 @@ a:link,a:visited,a:active{text-decoration: none; color:#409EFF;}
padding
:
4px
0
;
padding
:
4px
0
;
}
}
.ms-form-tip-err
{
.ms-form-tip-err
{
color
:
#f56c6c
color
:
#f56c6c
}
}
.ms-alert-tip
{
.ms-alert-tip
{
margin-bottom
:
10px
;
margin-bottom
:
10px
;
}
}
.ms-select
{
.ms-select
{
display
:
block
;
display
:
block
;
}
}
/*搜索*/
.ms-datetimerange
{
width
:
100%
!important
;
}
.ms-search
{
.ms-search
{
background
:
#fff
;
background
:
#fff
;
padding
:
10px
14px
0
14px
;
padding
:
10px
14px
0
14px
;
...
@@ -101,23 +90,58 @@ color:#f56c6c
...
@@ -101,23 +90,58 @@ color:#f56c6c
line-height
:
60px
;
line-height
:
60px
;
text-align
:
center
;
text-align
:
center
;
}
}
.ms-datetimerange
{
width
:
100%
!important
;
}
.ms-table-pagination
{
.ms-table-pagination
{
height
:
calc
(
100%
-
75px
);
height
:
calc
(
100%
-
75px
);
}
}
#myPageTop
{
/*滚动条*/
width
:
252px
;
.ms-scrollbar
.el-scrollbar__bar.is-vertical
{
width
:
6px
!important
;
}
.ms-scrollbar
.el-scrollbar__view
{
padding-right
:
17px
;
}
/*后台管理界面的el-menu通用样式*/
.ms-index
.el-menu
{
border-right
:
none
;
background-color
:
unset
;
}
.ms-index
.el-menu-item
{
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
overflow
:
hidden
;
word-break
:
break-all
;
}
#form
.ms-container
{
height
:
calc
(
100vh
-
38px
);
}
a
:link
,
a
:visited
,
a
:active
{
text-decoration
:
none
;
color
:
#409EFF
;}
/*样式重写*/
input
::-webkit-input-placeholder
,
textarea
::-webkit-input-placeholder
{
font-weight
:
initial
;
font-size
:
12px
;
color
:
#999
;
resize
:
none
;
}
}
#myPageTop
input
{
width
:
242px
;
.el-button
+
.el-button
{
margin-left
:
0
}
}
.el-button
.iconfont
{
.el-button
.iconfont
{
font-size
:
12px
;
font-size
:
12px
;
margin-right
:
5px
;
margin-right
:
5px
;
line-height
:
1px
!important
;
line-height
:
1px
!important
;
}
}
#form
.ms-container
{
height
:
calc
(
100vh
-
38px
);
}
[
v-cloak
]
{
[
v-cloak
]
{
display
:
none
;
display
:
none
;
...
@@ -135,20 +159,4 @@ color:#f56c6c
...
@@ -135,20 +159,4 @@ color:#f56c6c
.el-scrollbar__wrap
{
.el-scrollbar__wrap
{
overflow-x
:
hidden
!important
;
overflow-x
:
hidden
!important
;
}
}
.ms-scrollbar
.el-scrollbar__bar.is-vertical
{
width
:
6px
!important
;
}
.ms-scrollbar
.el-scrollbar__view
{
padding-right
:
17px
;
}
/**后台管理界面的el-menu通用样式**/
.ms-index
.el-menu
{
border-right
:
none
;
background-color
:
unset
;
}
.ms-index
.el-menu-item
{
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
overflow
:
hidden
;
word-break
:
break-all
;
}
src/main/webapp/static/css/theme.css
View file @
049098d8
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
.ms-theme-light.ms-admin-menu-aside-submenu
.el-menu-item
:hover
{
.ms-theme-light.ms-admin-menu-aside-submenu
.el-menu-item
:hover
{
background-color
:
rgba
(
255
,
255
,
255
,
0.3
)
!important
;
background-color
:
rgba
(
255
,
255
,
255
,
0.3
)
!important
;
}
}
/*深色系*/
/*深色系*/
.ms-theme-dark
.ms-admin-logo
>
div
span
{
.ms-theme-dark
.ms-admin-logo
>
div
span
{
color
:
rgba
(
56
,
58
,
63
,
1
);
color
:
rgba
(
56
,
58
,
63
,
1
);
...
...
src/main/webapp/static/images/1577151868190.png
deleted
100644 → 0
View file @
6135f0ec
4.38 KB
Prev
1
2
3
4
5
…
19
Next
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