* 添加新群号:139845794 * 修复初始化多表格处理回调函数时获取的表格配置不一致的问题。 * 自定义ShiroFilterFactoryBean防止中文请求被拦截 * 优化导出数据LocalDateTime类型无数据问题 * 文件上传兼容Weblogic环境 * 修复导入Excel时字典字段类型为Long转义为空问题 * 修复表格打印组件不识别多层对象属性值问题(I4V7YV)
This commit is contained in:
parent
4073767193
commit
aa75b99cfc
|
|
@ -99,4 +99,4 @@
|
||||||
|
|
||||||
## 若依交流群
|
## 若依交流群
|
||||||
|
|
||||||
QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [](https://jq.qq.com/?_wv=1027&k=0ARRrO9V) [](https://jq.qq.com/?_wv=1027&k=up9k3ZXJ) [](https://jq.qq.com/?_wv=1027&k=540WfdEr)
|
QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [](https://jq.qq.com/?_wv=1027&k=0ARRrO9V) [](https://jq.qq.com/?_wv=1027&k=up9k3ZXJ) [](https://jq.qq.com/?_wv=1027&k=540WfdEr) [](https://jq.qq.com/?_wv=1027&k=ss91fC4t)
|
||||||
|
|
@ -136,7 +136,7 @@ $.BootstrapTable = class extends $.BootstrapTable {
|
||||||
const formatValue = (row, i, column) => {
|
const formatValue = (row, i, column) => {
|
||||||
const value = Utils.calculateObjectValue(column,
|
const value = Utils.calculateObjectValue(column,
|
||||||
column.printFormatter || column.formatter,
|
column.printFormatter || column.formatter,
|
||||||
[row[column.field], row, i], row[column.field])
|
[$.common.getItemField(row, column.field), row, i], $.common.getItemField(row, column.field))
|
||||||
|
|
||||||
return typeof value === 'undefined' || value === null ?
|
return typeof value === 'undefined' || value === null ?
|
||||||
this.options.undefinedText : value
|
this.options.undefinedText : value
|
||||||
|
|
|
||||||
|
|
@ -180,14 +180,15 @@ var table = {
|
||||||
if (typeof table.get(this.id).responseHandler == "function") {
|
if (typeof table.get(this.id).responseHandler == "function") {
|
||||||
table.get(this.id).responseHandler(res);
|
table.get(this.id).responseHandler(res);
|
||||||
}
|
}
|
||||||
|
var thisOptions = table.config[this.id];
|
||||||
if (res.code == web_status.SUCCESS) {
|
if (res.code == web_status.SUCCESS) {
|
||||||
if ($.common.isNotEmpty(table.options.sidePagination) && table.options.sidePagination == 'client') {
|
if ($.common.isNotEmpty(thisOptions.sidePagination) && thisOptions.sidePagination == 'client') {
|
||||||
return res.rows;
|
return res.rows;
|
||||||
} else {
|
} else {
|
||||||
if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) {
|
if ($.common.isNotEmpty(thisOptions.rememberSelected) && thisOptions.rememberSelected) {
|
||||||
var column = $.common.isEmpty(table.options.uniqueId) ? table.options.columns[1].field : table.options.uniqueId;
|
var column = $.common.isEmpty(thisOptions.uniqueId) ? thisOptions.columns[1].field : thisOptions.uniqueId;
|
||||||
$.each(res.rows, function(i, row) {
|
$.each(res.rows, function(i, row) {
|
||||||
row.state = $.inArray(row[column], table.rememberSelectedIds[table.options.id]) !== -1;
|
row.state = $.inArray(row[column], table.rememberSelectedIds[thisOptions.id]) !== -1;
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return { rows: res.rows, total: res.total };
|
return { rows: res.rows, total: res.total };
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
|
<p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
|
||||||
</p>
|
</p>
|
||||||
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <a href="https://jq.qq.com/?_wv=1027&k=540WfdEr" target="_blank">298522656</a>
|
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <a href="https://jq.qq.com/?_wv=1027&k=ss91fC4t" target="_blank">139845794</a>
|
||||||
</p>
|
</p>
|
||||||
<p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
|
<p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.ruoyi.common.utils.file;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
@ -111,8 +112,8 @@ public class FileUploadUtils
|
||||||
|
|
||||||
String fileName = extractFilename(file);
|
String fileName = extractFilename(file);
|
||||||
|
|
||||||
File desc = getAbsoluteFile(baseDir, fileName);
|
String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
|
||||||
file.transferTo(desc);
|
file.transferTo(Paths.get(absPath));
|
||||||
return getPathFileName(baseDir, fileName);
|
return getPathFileName(baseDir, fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -316,7 +316,7 @@ public class ExcelUtil<T>
|
||||||
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
|
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
|
||||||
if (StringUtils.isNotEmpty(dateFormat))
|
if (StringUtils.isNotEmpty(dateFormat))
|
||||||
{
|
{
|
||||||
val = parseDateToStr(dateFormat, (Date) val);
|
val = parseDateToStr(dateFormat, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -328,7 +328,7 @@ public class ExcelUtil<T>
|
||||||
{
|
{
|
||||||
val = Convert.toInt(val);
|
val = Convert.toInt(val);
|
||||||
}
|
}
|
||||||
else if (Long.TYPE == fieldType || Long.class == fieldType)
|
else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
|
||||||
{
|
{
|
||||||
val = Convert.toLong(val);
|
val = Convert.toLong(val);
|
||||||
}
|
}
|
||||||
|
|
@ -823,7 +823,7 @@ public class ExcelUtil<T>
|
||||||
String dictType = attr.dictType();
|
String dictType = attr.dictType();
|
||||||
if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
|
if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
|
||||||
{
|
{
|
||||||
cell.setCellValue(parseDateToStr(dateFormat, (Date) value));
|
cell.setCellValue(parseDateToStr(dateFormat, value));
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
|
else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ import com.ruoyi.common.utils.spring.SpringUtils;
|
||||||
import com.ruoyi.framework.shiro.realm.UserRealm;
|
import com.ruoyi.framework.shiro.realm.UserRealm;
|
||||||
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
|
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
|
||||||
import com.ruoyi.framework.shiro.session.OnlineSessionFactory;
|
import com.ruoyi.framework.shiro.session.OnlineSessionFactory;
|
||||||
|
import com.ruoyi.framework.shiro.web.CustomShiroFilterFactoryBean;
|
||||||
import com.ruoyi.framework.shiro.web.filter.LogoutFilter;
|
import com.ruoyi.framework.shiro.web.filter.LogoutFilter;
|
||||||
import com.ruoyi.framework.shiro.web.filter.captcha.CaptchaValidateFilter;
|
import com.ruoyi.framework.shiro.web.filter.captcha.CaptchaValidateFilter;
|
||||||
import com.ruoyi.framework.shiro.web.filter.kickout.KickoutSessionFilter;
|
import com.ruoyi.framework.shiro.web.filter.kickout.KickoutSessionFilter;
|
||||||
|
|
@ -266,7 +267,7 @@ public class ShiroConfig
|
||||||
@Bean
|
@Bean
|
||||||
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
|
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
|
||||||
{
|
{
|
||||||
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();
|
||||||
// Shiro的核心安全接口,这个属性是必须的
|
// Shiro的核心安全接口,这个属性是必须的
|
||||||
shiroFilterFactoryBean.setSecurityManager(securityManager);
|
shiroFilterFactoryBean.setSecurityManager(securityManager);
|
||||||
// 身份认证失败,则跳转到登录页面的配置
|
// 身份认证失败,则跳转到登录页面的配置
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
package com.ruoyi.framework.shiro.web;
|
||||||
|
|
||||||
|
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
||||||
|
import org.apache.shiro.web.filter.InvalidRequestFilter;
|
||||||
|
import org.apache.shiro.web.filter.mgt.DefaultFilter;
|
||||||
|
import org.apache.shiro.web.filter.mgt.FilterChainManager;
|
||||||
|
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
|
||||||
|
import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
|
||||||
|
import org.apache.shiro.web.mgt.WebSecurityManager;
|
||||||
|
import org.apache.shiro.web.servlet.AbstractShiroFilter;
|
||||||
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
|
import org.springframework.beans.factory.BeanInitializationException;
|
||||||
|
import javax.servlet.Filter;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义ShiroFilterFactoryBean解决资源中文路径问题
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Class<MySpringShiroFilter> getObjectType()
|
||||||
|
{
|
||||||
|
return MySpringShiroFilter.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AbstractShiroFilter createInstance() throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
SecurityManager securityManager = getSecurityManager();
|
||||||
|
if (securityManager == null)
|
||||||
|
{
|
||||||
|
String msg = "SecurityManager property must be set.";
|
||||||
|
throw new BeanInitializationException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(securityManager instanceof WebSecurityManager))
|
||||||
|
{
|
||||||
|
String msg = "The security manager does not implement the WebSecurityManager interface.";
|
||||||
|
throw new BeanInitializationException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
FilterChainManager manager = createFilterChainManager();
|
||||||
|
// Expose the constructed FilterChainManager by first wrapping it in a
|
||||||
|
// FilterChainResolver implementation. The AbstractShiroFilter implementations
|
||||||
|
// do not know about FilterChainManagers - only resolvers:
|
||||||
|
PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
|
||||||
|
chainResolver.setFilterChainManager(manager);
|
||||||
|
|
||||||
|
Map<String, Filter> filterMap = manager.getFilters();
|
||||||
|
Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());
|
||||||
|
if (invalidRequestFilter instanceof InvalidRequestFilter)
|
||||||
|
{
|
||||||
|
// 此处是关键,设置false跳过URL携带中文400,servletPath中文校验bug
|
||||||
|
((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);
|
||||||
|
}
|
||||||
|
// Now create a concrete ShiroFilter instance and apply the acquired SecurityManager and built
|
||||||
|
// FilterChainResolver. It doesn't matter that the instance is an anonymous inner class
|
||||||
|
// here - we're just using it because it is a concrete AbstractShiroFilter instance that accepts
|
||||||
|
// injection of the SecurityManager and FilterChainResolver:
|
||||||
|
return new MySpringShiroFilter((WebSecurityManager) securityManager, chainResolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class MySpringShiroFilter extends AbstractShiroFilter
|
||||||
|
{
|
||||||
|
protected MySpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver)
|
||||||
|
{
|
||||||
|
if (webSecurityManager == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("WebSecurityManager property cannot be null.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.setSecurityManager(webSecurityManager);
|
||||||
|
if (resolver != null)
|
||||||
|
{
|
||||||
|
this.setFilterChainResolver(resolver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue