Compare commits
27 Commits
v5.11.1.sp
...
v5.12.0.sp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
119ceae9fe | ||
|
|
f7381ab736 | ||
|
|
5a830b7307 | ||
|
|
b5bde1e58c | ||
|
|
a35d4654f5 | ||
|
|
4634055b43 | ||
|
|
b4629aa465 | ||
|
|
4b6cdce814 | ||
|
|
c478f2a969 | ||
|
|
c7d317c1da | ||
|
|
8f6fd6000f | ||
|
|
8f1dbaf3bd | ||
|
|
a414489ea9 | ||
|
|
dc23dbcd6d | ||
|
|
62294446bd | ||
|
|
d7433b3c45 | ||
|
|
f88e432403 | ||
|
|
3d99759a06 | ||
|
|
7601d4d530 | ||
|
|
59996a2a5b | ||
|
|
a35b7fd143 | ||
|
|
ad28115fb3 | ||
|
|
9a816b18c2 | ||
|
|
f3d283ae4e | ||
|
|
3abf83ff63 | ||
|
|
9fedbcaa64 | ||
|
|
bd059ab63e |
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -249,6 +249,11 @@
|
||||
<artifactId>spring-web</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot</artifactId>
|
||||
|
||||
@@ -103,5 +103,9 @@ public class IOUtils extends org.apache.commons.io.IOUtils {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public IOUtils() {
|
||||
// empty
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,11 @@
|
||||
*/
|
||||
package com.jeesite.common.lang;
|
||||
|
||||
import com.jeesite.common.utils.LocaleUtils;
|
||||
import org.apache.commons.lang3.time.FastDateFormat;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.text.ParseException;
|
||||
import java.text.ParsePosition;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
@@ -17,14 +18,14 @@ import java.util.Date;
|
||||
* @version 2017-1-4
|
||||
*/
|
||||
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
|
||||
|
||||
private static final String[] parsePatterns = {
|
||||
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH", "yyyy-MM",
|
||||
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH", "yyyy/MM",
|
||||
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH", "yyyy.MM",
|
||||
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH", "yyyy.MM",
|
||||
"yyyy年MM月dd日", "yyyy年MM月dd日 HH时mm分ss秒", "yyyy年MM月dd日 HH时mm分", "yyyy年MM月dd日 HH时", "yyyy年MM月",
|
||||
"yyyyMMdd", "yyyyMM", "yyyy"};
|
||||
|
||||
"yyyyMMdd", "yyyyMM", "yyyy", "yyyy-MM-dd'T'HH:mm:ss'Z'"};
|
||||
|
||||
/**
|
||||
* 得到日期字符串 ,转换格式(yyyy-MM-dd)
|
||||
*/
|
||||
@@ -45,15 +46,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
public static String formatDate(Date date, String pattern) {
|
||||
String formatDate = null;
|
||||
if (date != null){
|
||||
// if (StringUtils.isNotBlank(pattern)) {
|
||||
// formatDate = DateFormatUtils.format(date, pattern);
|
||||
// } else {
|
||||
// formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
|
||||
// }
|
||||
if (StringUtils.isBlank(pattern)) {
|
||||
pattern = "yyyy-MM-dd";
|
||||
}
|
||||
formatDate = FastDateFormat.getInstance(pattern).format(date);
|
||||
// formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
|
||||
formatDate = FastDateFormat.getInstance(pattern,
|
||||
LocaleUtils.getTimeZone(), LocaleUtils.getLocale()).format(date);
|
||||
}
|
||||
return formatDate;
|
||||
}
|
||||
@@ -77,7 +75,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
*/
|
||||
public static String getDate(String pattern) {
|
||||
// return DateFormatUtils.format(new Date(), pattern);
|
||||
return FastDateFormat.getInstance(pattern).format(new Date());
|
||||
return FastDateFormat.getInstance(pattern,
|
||||
LocaleUtils.getTimeZone(), LocaleUtils.getLocale()).format(new Date());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,11 +87,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
* @return
|
||||
*/
|
||||
public static String getDate(String pattern, int amont, int type) {
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
Calendar calendar = Calendar.getInstance(LocaleUtils.getTimeZone(), LocaleUtils.getLocale());
|
||||
calendar.setTime(new Date());
|
||||
calendar.add(type, amont);
|
||||
// return DateFormatUtils.format(calendar.getTime(), pattern);
|
||||
return FastDateFormat.getInstance(pattern).format(calendar.getTime());
|
||||
return FastDateFormat.getInstance(pattern,
|
||||
LocaleUtils.getTimeZone(), LocaleUtils.getLocale()).format(calendar.getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -138,17 +138,43 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期型字符串转化为日期 格式 see to DateUtils#parsePatterns
|
||||
* 日期型字符串转化为日期对象,使用默认格式集
|
||||
*/
|
||||
public static Date parseDate(Object str) {
|
||||
if (str == null){
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return parseDate(str.toString(), parsePatterns);
|
||||
} catch (ParseException e) {
|
||||
String dateStr = str.toString();
|
||||
if (StringUtils.isBlank(dateStr)){
|
||||
return null;
|
||||
}
|
||||
return parseDate(dateStr, parsePatterns);
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期型字符串转化为日期对象,指定日期解析格式
|
||||
*/
|
||||
public static Date parseDate(final String str, final String... parsePatterns) {
|
||||
// try {
|
||||
// return DateUtils.parseDate(str, Locale.getDefault(), parsePatterns);
|
||||
// } catch (ParseException e) {
|
||||
// return null;
|
||||
// }
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
Calendar calendar = Calendar.getInstance(LocaleUtils.getTimeZone(), LocaleUtils.getLocale());
|
||||
for (final String parsePattern : parsePatterns) {
|
||||
FastDateFormat format = FastDateFormat.getInstance(parsePattern);
|
||||
calendar.clear();
|
||||
try {
|
||||
if (format.parse(str, pos, calendar) && pos.getIndex() == str.length()) {
|
||||
return calendar.getTime();
|
||||
}
|
||||
} catch (final IllegalArgumentException ignored) {
|
||||
// leniency is preventing calendar from being set
|
||||
}
|
||||
pos.setIndex(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -228,7 +254,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
* @return
|
||||
*/
|
||||
public static int getWeekOfYear(Date date){
|
||||
Calendar cal = Calendar.getInstance();
|
||||
Calendar cal = Calendar.getInstance(LocaleUtils.getTimeZone(), LocaleUtils.getLocale());
|
||||
cal.setTime(date);
|
||||
return cal.get(Calendar.WEEK_OF_YEAR);
|
||||
}
|
||||
@@ -242,7 +268,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
if (date == null){
|
||||
return null;
|
||||
}
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
Calendar calendar = Calendar.getInstance(LocaleUtils.getTimeZone(), LocaleUtils.getLocale());
|
||||
calendar.setTime(date);
|
||||
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||
calendar.set(Calendar.MINUTE, 0);
|
||||
@@ -260,7 +286,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
if (date == null){
|
||||
return null;
|
||||
}
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
Calendar calendar = Calendar.getInstance(LocaleUtils.getTimeZone(), LocaleUtils.getLocale());
|
||||
calendar.setTime(date);
|
||||
calendar.set(Calendar.HOUR_OF_DAY, 23);
|
||||
calendar.set(Calendar.MINUTE, 59);
|
||||
@@ -315,5 +341,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||||
}
|
||||
return new Date[]{beginDate, endDate};
|
||||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public DateUtils() {
|
||||
// empty
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,16 +37,19 @@ public class ExceptionUtils {
|
||||
public static String getExceptionMessage(Throwable ex){
|
||||
String message = null;
|
||||
Throwable e = ex;
|
||||
while (true){
|
||||
if (e == null){
|
||||
while (true) {
|
||||
if (e == null) {
|
||||
break;
|
||||
}
|
||||
if (StringUtils.startsWith(e.getMessage(), "msg:")){
|
||||
if (StringUtils.startsWith(e.getMessage(), "msg:")) {
|
||||
message = StringUtils.replace(e.getMessage(), "msg:", "");
|
||||
break;
|
||||
}else if ("com.jeesite.common.service.ServiceException"
|
||||
.equals(e.getClass().getName())){
|
||||
} else if ("com.jeesite.common.service.ServiceException".equals(e.getClass().getName())){
|
||||
message = e.getMessage();
|
||||
}
|
||||
if (StringUtils.isNotBlank(message)){
|
||||
if (e.getSuppressed() != null && e.getCause() != null){
|
||||
ex.addSuppressed(e.getCause());
|
||||
}
|
||||
break;
|
||||
}
|
||||
e = e.getCause();
|
||||
|
||||
@@ -119,5 +119,9 @@ public class NumberUtils extends org.apache.commons.lang3.math.NumberUtils {
|
||||
}
|
||||
return df.format(data);
|
||||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public NumberUtils() {
|
||||
// empty
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,5 +363,9 @@ public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils {
|
||||
// inputPool.free(input);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
@Deprecated
|
||||
public ObjectUtils() {
|
||||
// empty
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,5 +415,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public StringUtils() {
|
||||
// empty
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.core.JsonParser.Feature;
|
||||
import com.fasterxml.jackson.databind.*;
|
||||
import com.fasterxml.jackson.databind.introspect.Annotated;
|
||||
import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
|
||||
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
|
||||
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||
@@ -19,6 +20,7 @@ import com.jeesite.common.codec.EncodeUtils;
|
||||
import com.jeesite.common.collect.ListUtils;
|
||||
import com.jeesite.common.io.PropertiesUtils;
|
||||
import com.jeesite.common.lang.DateUtils;
|
||||
import org.apache.commons.lang3.LocaleUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -26,7 +28,6 @@ import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -51,61 +52,102 @@ public class JsonMapper extends ObjectMapper {
|
||||
}
|
||||
|
||||
public JsonMapper() {
|
||||
// Spring ObjectMapper 初始化配置,支持 @JsonView
|
||||
new Jackson2ObjectMapperBuilder().configure(this);
|
||||
// 日志类型格式化处理
|
||||
this.setLocaleTimeZoneDateFormat();
|
||||
// 为Null时不序列化
|
||||
this.setSerializationInclusion(Include.NON_NULL);
|
||||
// 允许单引号
|
||||
this.configure(Feature.ALLOW_SINGLE_QUOTES, true);
|
||||
// 允许不带引号的字段名称
|
||||
this.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
|
||||
// 设置默认时区
|
||||
this.setDefaultTimeZone();
|
||||
// 设置默认日期格式
|
||||
this.setDefaultDateFormat();
|
||||
// 遇到空值处理为空串
|
||||
// 遇到空值处理为空串
|
||||
this.enabledNullValueToEmpty();
|
||||
// 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
|
||||
this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
// Spring ObjectMapper 初始化配置,支持 @JsonView
|
||||
new Jackson2ObjectMapperBuilder().configure(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启日期类型默认格式化
|
||||
* 日志类型格式化处理
|
||||
* @author ThinkGem
|
||||
*/
|
||||
public JsonMapper setDefaultTimeZone(){
|
||||
public JsonMapper setLocaleTimeZoneDateFormat(){
|
||||
this.setLocale(LocaleUtils.toLocale(PropertiesUtils.getInstance()
|
||||
.getProperty("lang.defaultLocale", "zh_CN")));
|
||||
this.setTimeZone(TimeZone.getTimeZone(PropertiesUtils.getInstance()
|
||||
.getProperty("lang.defaultTimeZone", "GMT+08:00")));
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启日期类型默认格式化
|
||||
* @author ThinkGem
|
||||
*/
|
||||
public JsonMapper setDefaultDateFormat(){
|
||||
this.setDateFormat(new SimpleDateFormat(PropertiesUtils.getInstance()
|
||||
.getProperty("web.json.defaultDateFormat", "yyyy-MM-dd HH:mm:ss")));
|
||||
this.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final String[] pattern = new String[] {"yyyy", "MM", "dd", "HH", "mm", "ss", "SSS"};
|
||||
class JeeSiteJsonSerializer extends JsonSerializer<Date> {
|
||||
private final String pattern;
|
||||
private JeeSiteJsonSerializer(String pattern) {
|
||||
this.pattern = pattern;
|
||||
}
|
||||
@Override
|
||||
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
|
||||
if (value != null){
|
||||
if (StringUtils.isNotBlank(pattern)) {
|
||||
gen.writeString(DateUtils.formatDate(value, pattern));
|
||||
} else {
|
||||
gen.writeString(DateUtils.formatDateTime(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
class JeeSiteJsonDeserializer extends JsonDeserializer<Date> {
|
||||
private final String pattern;
|
||||
private JeeSiteJsonDeserializer(String pattern) {
|
||||
this.pattern = pattern;
|
||||
}
|
||||
@Override
|
||||
public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {
|
||||
if (StringUtils.isNotBlank(pattern)) {
|
||||
return DateUtils.parseDate(parser.getText(), pattern);
|
||||
} else {
|
||||
return DateUtils.parseDate(parser.getText());
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Object findSerializer(Annotated a) {
|
||||
if (a instanceof AnnotatedMethod) {
|
||||
AnnotatedElement m = a.getAnnotated();
|
||||
JsonFormat jf = m.getAnnotation(JsonFormat.class);
|
||||
if (jf != null) {
|
||||
return new JsonSerializer<Date>(){
|
||||
@Override
|
||||
public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
|
||||
if (value != null){
|
||||
jgen.writeString(DateUtils.formatDate(value, jf.pattern()));
|
||||
}
|
||||
}
|
||||
};
|
||||
if (jf != null && StringUtils.containsAnyIgnoreCase(jf.pattern(), pattern)) {
|
||||
return new JeeSiteJsonSerializer(jf.pattern());
|
||||
}
|
||||
AnnotatedMethod am = (AnnotatedMethod) a;
|
||||
if (am.getRawReturnType() == Date.class) {
|
||||
return new JeeSiteJsonSerializer(null);
|
||||
}
|
||||
} else if (a instanceof AnnotatedClass) {
|
||||
if (a.getRawType() == Date.class) {
|
||||
return new JeeSiteJsonSerializer(null);
|
||||
}
|
||||
}
|
||||
return super.findSerializer(a);
|
||||
}
|
||||
@Override
|
||||
public Object findDeserializer(Annotated a) {
|
||||
if (a instanceof AnnotatedMethod) {
|
||||
AnnotatedElement m = a.getAnnotated();
|
||||
JsonFormat jf = m.getAnnotation(JsonFormat.class);
|
||||
if (jf != null && StringUtils.containsAnyIgnoreCase(jf.pattern(), pattern)) {
|
||||
return new JeeSiteJsonDeserializer(jf.pattern());
|
||||
}
|
||||
AnnotatedMethod am = (AnnotatedMethod) a;
|
||||
if (am.getParameterCount() > 0 && am.getParameterType(0).getRawClass() == Date.class) {
|
||||
return new JeeSiteJsonDeserializer(null);
|
||||
}
|
||||
} else if (a instanceof AnnotatedClass) {
|
||||
if (a.getRawType() == Date.class) {
|
||||
return new JeeSiteJsonDeserializer(null);
|
||||
}
|
||||
}
|
||||
return super.findDeserializer(a);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
@@ -120,7 +162,7 @@ public class JsonMapper extends ObjectMapper {
|
||||
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
|
||||
jgen.writeString(StringUtils.EMPTY);
|
||||
}
|
||||
});
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.jeesite.common.utils;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
@@ -11,11 +9,10 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* 身份证工具类
|
||||
*
|
||||
* @author June
|
||||
* @version 1.0, 2010-06-17
|
||||
* @version 2010-06-17
|
||||
*/
|
||||
public class IdcardUtils extends StringUtils {
|
||||
public class IdcardUtils {
|
||||
|
||||
/** 中国公民身份证号码最小长度。 */
|
||||
public static final int CHINA_ID_MIN_LENGTH = 15;
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
* No deletion without permission, or be held responsible to law.
|
||||
*/
|
||||
package com.jeesite.common.utils;
|
||||
|
||||
import com.jeesite.common.io.PropertiesUtils;
|
||||
import com.jeesite.common.web.http.ServletUtils;
|
||||
import org.springframework.context.i18n.TimeZoneAwareLocaleContext;
|
||||
import org.springframework.core.NamedThreadLocal;
|
||||
import org.springframework.web.servlet.LocaleContextResolver;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* 本地化工具
|
||||
* @author ThinkGem
|
||||
* @version 2025-05-21
|
||||
*/
|
||||
public class LocaleUtils {
|
||||
|
||||
private static final Boolean LANG_ENABLED = PropertiesUtils.getInstance().getPropertyToBoolean("lang.enabled", "false");
|
||||
private static final ThreadLocal<TimeZoneAwareLocaleContext> timeZoneAwareLocaleContext = new NamedThreadLocal<>("TimeZoneAwareLocaleContext");
|
||||
private static LocaleContextResolver localeResolver;
|
||||
|
||||
/**
|
||||
* 获取当前 Locale 对象,获取顺序:请求 -> 会话 -> Cookie -> lang.defaultLocale
|
||||
*/
|
||||
public static Locale getLocale() {
|
||||
return getTimeZoneAwareLocaleContext().getLocale();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前 TimeZone 对象,获取顺序:请求 -> 会话 -> Cookie -> lang.defaultTimeZone
|
||||
*/
|
||||
public static TimeZone getTimeZone() {
|
||||
return getTimeZoneAwareLocaleContext().getTimeZone();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 TimeZoneAwareLocaleContext
|
||||
*/
|
||||
public static TimeZoneAwareLocaleContext getTimeZoneAwareLocaleContext() {
|
||||
TimeZoneAwareLocaleContext context = timeZoneAwareLocaleContext.get();
|
||||
if (context != null){
|
||||
return context;
|
||||
}
|
||||
if (LANG_ENABLED && localeResolver != null){
|
||||
HttpServletRequest request = ServletUtils.getRequest();
|
||||
if (request != null){
|
||||
context = (TimeZoneAwareLocaleContext)localeResolver.resolveLocaleContext(request);
|
||||
}
|
||||
}
|
||||
if (context == null){
|
||||
context = new TimeZoneAwareLocaleContext() {
|
||||
@Override
|
||||
public Locale getLocale() {
|
||||
return Locale.getDefault();
|
||||
}
|
||||
@Override
|
||||
public TimeZone getTimeZone() {
|
||||
return TimeZone.getDefault();
|
||||
}
|
||||
};
|
||||
}
|
||||
setTimeZoneAwareLocaleContext(context);
|
||||
return context;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置 TimeZoneAwareLocaleContext
|
||||
*/
|
||||
public static void setTimeZoneAwareLocaleContext(TimeZoneAwareLocaleContext context) {
|
||||
timeZoneAwareLocaleContext.set(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理本地线程对象(请求结束时调用)
|
||||
*/
|
||||
public static void removeTimeZoneAwareLocaleContext() {
|
||||
timeZoneAwareLocaleContext.remove();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置 LocaleContextResolver
|
||||
*/
|
||||
public static void setLocaleResolver(LocaleContextResolver localeResolver) {
|
||||
LocaleUtils.localeResolver = localeResolver;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,14 +2,14 @@
|
||||
* http://jeesite.com
|
||||
*/
|
||||
a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sortable {
|
||||
color:#1890ff;
|
||||
color:#1677ff;
|
||||
}
|
||||
.main-header .navbar {
|
||||
background: #1890ff;
|
||||
background: -webkit-gradient(linear, left bottom, right top, color-stop(0, #2684f5), color-stop(1, #1890ff));
|
||||
background: -ms-linear-gradient(left, #2684f5, #1890ff);
|
||||
background: -moz-linear-gradient(left top, #2684f5 0%, #1890ff 100%);
|
||||
background: -o-linear-gradient(#1890ff, #2684f5);
|
||||
background: #1677ff;
|
||||
background: -webkit-gradient(linear, left bottom, right top, color-stop(0, #2684f5), color-stop(1, #1677ff));
|
||||
background: -ms-linear-gradient(left, #2684f5, #1677ff);
|
||||
background: -moz-linear-gradient(left top, #2684f5 0%, #1677ff 100%);
|
||||
background: -o-linear-gradient(#1677ff, #2684f5);
|
||||
}
|
||||
.main-header .navbar .nav > li > a {
|
||||
color: #ffffff;
|
||||
@@ -54,10 +54,10 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
border-bottom: 0 solid transparent;
|
||||
}
|
||||
.main-header .logo:hover {
|
||||
background-color: #1890ff;
|
||||
background-color: #1677ff;
|
||||
}
|
||||
.main-header li.user-header {
|
||||
background-color: #1890ff;
|
||||
background-color: #1677ff;
|
||||
}
|
||||
.content-header {
|
||||
background: transparent;
|
||||
@@ -93,7 +93,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
background: #ffffff;
|
||||
}
|
||||
.sidebar-menu > li.active {
|
||||
border-left-color: #1890ff;
|
||||
border-left-color: #1677ff;
|
||||
}
|
||||
.sidebar-menu > li.active > a {
|
||||
font-weight: 600;
|
||||
@@ -154,7 +154,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
border-radius: 4px;
|
||||
}
|
||||
.skin-blue.layout-top-nav .main-header > .logo {
|
||||
background-color: #1890ff;
|
||||
background-color: #1677ff;
|
||||
color: #ffffff;
|
||||
border-bottom: 0 solid transparent;
|
||||
}
|
||||
@@ -164,7 +164,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
|
||||
.sidebar-menu {padding:0 8px 0 7px;}
|
||||
.sidebar-menu li>a>.pull-right-container {left:0;}
|
||||
.sidebar-menu .treeview-item.active>a {color:#1890ff;background-color:#e7f4ff;border-right:0;border-radius:6px;}
|
||||
.sidebar-menu .treeview-item.active>a {color:#1677ff;background-color:#e7f4ff;border-right:0;border-radius:6px;}
|
||||
|
||||
.content-wrapper, .right-side, body {background-color:#f0f2f5;}
|
||||
|
||||
@@ -189,12 +189,13 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.select2-container--default .select2-results__option--highlighted[aria-selected],
|
||||
.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover,
|
||||
.pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover,
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#1890ff!important;border-color:#1890ff;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#1890ff;}
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#1677ff!important;border-color:#1677ff;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#1677ff;}
|
||||
.form-unit {border-bottom:1px solid #eee;}
|
||||
.form-unit:before {background-color:#1677ff;}
|
||||
|
||||
.box-main>.box-header {border-bottom-color:#eeeeee;}
|
||||
.box-main>.box-header .box-title .fa {color:#1890ff;}
|
||||
.box-main>.box-header .box-title .fa {color:#1677ff;}
|
||||
.nav-tabs-custom>.nav-tabs>li.active {border-top-color:#3aa0ff;}
|
||||
.form-control:focus,.select2-container--default.select2-container--focus .select2-selection--multiple,
|
||||
.select2-container--default .select2-search--dropdown .select2-search__field,
|
||||
|
||||
@@ -2,17 +2,37 @@
|
||||
* http://jeesite.com
|
||||
*/
|
||||
a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sortable {
|
||||
color:#1890ff;
|
||||
color:#1677ff;
|
||||
}
|
||||
.main-header .navbar {
|
||||
background: #1890ff;
|
||||
background: -webkit-gradient(linear, left bottom, right top, color-stop(0, #2684f5), color-stop(1, #1890ff));
|
||||
background: -ms-linear-gradient(left, #2684f5, #1890ff);
|
||||
background: -moz-linear-gradient(left top, #2684f5 0%, #1890ff 100%);
|
||||
background: -o-linear-gradient(#1890ff, #2684f5);
|
||||
background: #1677ff;
|
||||
background: -webkit-gradient(linear, left bottom, right top, color-stop(0, #2684f5), color-stop(1, #1677ff));
|
||||
background: -ms-linear-gradient(left, #2684f5, #1677ff);
|
||||
background: -moz-linear-gradient(left top, #2684f5 0%, #1677ff 100%);
|
||||
background: -o-linear-gradient(#1677ff, #2684f5);
|
||||
}
|
||||
.main-header .navbar .nav > li > a {
|
||||
color: #ffffff;
|
||||
margin: 4.5px 2px 0;
|
||||
padding: 10px 13px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.main-header .navbar .nav > li > a > i {
|
||||
font-size: 16px;
|
||||
vertical-align: bottom;
|
||||
line-height: 20px;
|
||||
}
|
||||
.navbar-nav>.user-menu>.dropdown-menu {
|
||||
margin-top: 7px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.navbar-nav .treeview-menu,
|
||||
.navbar-custom-menu>.navbar-nav>li>.dropdown-menu {
|
||||
margin-top: 5px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.navbar-nav .treeview-menu a {
|
||||
border-radius: 6px;
|
||||
}
|
||||
.main-header .navbar .nav > li > a:hover,
|
||||
.main-header .navbar .nav > li > a:active,
|
||||
@@ -54,10 +74,10 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
border-bottom: 0 solid transparent;
|
||||
}
|
||||
.main-header .logo:hover {
|
||||
background-color: #1890ff;
|
||||
background-color: #1677ff;
|
||||
}
|
||||
.main-header li.user-header {
|
||||
background-color: #1890ff;
|
||||
background-color: #1677ff;
|
||||
}
|
||||
.content-header {
|
||||
background: transparent;
|
||||
@@ -93,7 +113,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
background: #ffffff;
|
||||
}
|
||||
.sidebar-menu > li.active {
|
||||
border-left-color: #1890ff;
|
||||
border-left-color: #1677ff;
|
||||
}
|
||||
.sidebar-menu > li.active > a {
|
||||
font-weight: 600;
|
||||
@@ -154,7 +174,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
border-radius: 4px;
|
||||
}
|
||||
.skin-blue.layout-top-nav .main-header > .logo {
|
||||
background-color: #1890ff;
|
||||
background-color: #1677ff;
|
||||
color: #ffffff;
|
||||
border-bottom: 0 solid transparent;
|
||||
}
|
||||
@@ -164,12 +184,12 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
|
||||
.sidebar-menu {padding:0 8px 0 7px;}
|
||||
.sidebar-menu li>a>.pull-right-container {left:0;}
|
||||
.sidebar-menu .treeview-item.active>a {color:#1890ff;background-color:#e7f4ff;border-right:0;border-radius:6px;}
|
||||
.sidebar-menu .treeview-item.active>a {color:#1677ff;background-color:#e7f4ff;border-right:0;border-radius:6px;}
|
||||
|
||||
/* 页签添加内边距 */
|
||||
.content-wrapper, .tabpanel_content, .tabpanel_content .html_content, body {background-color:#f0f2f5;}
|
||||
.box-main, .nav-main, .ui-layout-pane, iframe {border-radius:5px;}
|
||||
.tabpanel_content .html_content {padding:13px 14px 13px 15px;}
|
||||
.tabpanel_content .html_content {padding:12px 14px 12px 15px;}
|
||||
.tabpanel_tab_content {border-bottom:0;}
|
||||
.ui-layout-resizer {background:none;}
|
||||
.content {padding:0!important}
|
||||
@@ -211,12 +231,13 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.select2-container--default .select2-results__option--highlighted[aria-selected],
|
||||
.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover,
|
||||
.pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover,
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#1890ff!important;border-color:#1890ff!important;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#1890ff;}
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#1677ff!important;border-color:#1677ff!important;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#1677ff;}
|
||||
.form-unit {border-bottom:1px solid #eee;}
|
||||
.form-unit:before {background-color:#1677ff;}
|
||||
|
||||
.box-main>.box-header {border-bottom-color:#eeeeee;}
|
||||
.box-main>.box-header .box-title .fa {color:#1890ff;}
|
||||
.box-main>.box-header .box-title .fa {color:#1677ff;}
|
||||
.nav-tabs-custom>.nav-tabs>li.active {border-top-color:#3aa0ff;}
|
||||
.form-control:focus,.select2-container--default.select2-container--focus .select2-selection--multiple,
|
||||
.select2-container--default .select2-search--dropdown .select2-search__field,
|
||||
|
||||
@@ -192,6 +192,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#1e5edb!important;border-color:#1e5edb!important;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#1e5edb;}
|
||||
.form-unit {border-bottom:1px solid #eee;}
|
||||
.form-unit:before {background-color:#1e5edb;}
|
||||
|
||||
.box-main>.box-header {border-bottom-color:#eeeeee;}
|
||||
.box-main>.box-header .box-title .fa {color:#1e5edb;}
|
||||
|
||||
@@ -13,6 +13,26 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
}
|
||||
.main-header .navbar .nav > li > a {
|
||||
color: #ffffff;
|
||||
margin: 4.5px 2px 0;
|
||||
padding: 10px 13px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.main-header .navbar .nav > li > a > i {
|
||||
font-size: 16px;
|
||||
vertical-align: bottom;
|
||||
line-height: 20px;
|
||||
}
|
||||
.navbar-nav .treeview-menu,
|
||||
.navbar-nav>.user-menu>.dropdown-menu {
|
||||
margin-top: 7px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.navbar-custom-menu>.navbar-nav>li>.dropdown-menu {
|
||||
margin-top: 5px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.navbar-nav .treeview-menu a {
|
||||
border-radius: 6px;
|
||||
}
|
||||
.main-header .navbar .nav > li > a:hover,
|
||||
.main-header .navbar .nav > li > a:active,
|
||||
@@ -169,7 +189,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
/* 页签添加内边距 */
|
||||
.content-wrapper, .tabpanel_content, .tabpanel_content .html_content, body {background-color:#f0f2f5;}
|
||||
.box-main, .nav-main, .ui-layout-pane, iframe {border-radius:5px;}
|
||||
.tabpanel_content .html_content {padding:13px 14px 13px 15px;}
|
||||
.tabpanel_content .html_content {padding:12px 14px 12px 15px;}
|
||||
.tabpanel_tab_content {border-bottom:0;}
|
||||
.ui-layout-resizer {background:none;}
|
||||
.content {padding:0!important}
|
||||
@@ -214,6 +234,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#1e5edb!important;border-color:#1e5edb!important;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#1e5edb;}
|
||||
.form-unit {border-bottom:1px solid #eee;}
|
||||
.form-unit:before {background-color:#1e5edb;}
|
||||
|
||||
.box-main>.box-header {border-bottom-color:#eeeeee;}
|
||||
.box-main>.box-header .box-title .fa {color:#1e5edb;}
|
||||
|
||||
@@ -167,7 +167,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
/* 页签添加内边距 */
|
||||
.content-wrapper, .tabpanel_content, .tabpanel_content .html_content, body {background-color:#000;}
|
||||
.box-main, .nav-main, .ui-layout-pane, iframe {border-radius:5px;}
|
||||
.tabpanel_content .html_content {padding:13px 14px 13px 15px;}
|
||||
.tabpanel_content .html_content {padding:12px 14px 12px 15px;}
|
||||
.tabpanel_tab_content {border-bottom:0;}
|
||||
.ui-layout-resizer {background:none;}
|
||||
.content {padding:0!important}
|
||||
@@ -227,6 +227,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.wup_container .placeholder .webuploader-pick {background-color:#3aa0ff!important;border-color:#3aa0ff!important;}
|
||||
.form-unit, th[aria-selected=true] .ui-jqgrid-sortable {color:#2975bc;}
|
||||
.form-unit {border-bottom:1px solid #4e4e4e;}
|
||||
.form-unit:before {background-color:#2975bc;}
|
||||
|
||||
.form-inline .form-more {background-color:#1a1a1a;border-bottom-color:#393939;}
|
||||
.form-control, .input-group .input-group-addon, input, select, textarea, pre {background-color:#1a1a1a;border-color:#414141!important;color:#ddd}
|
||||
|
||||
@@ -18,6 +18,7 @@ public class DateUtilsTest {
|
||||
|
||||
public static void main(String[] args) throws ParseException {
|
||||
System.out.println(DateUtils.formatDate(DateUtils.parseDate("2023/3/6")));
|
||||
System.out.println(DateUtils.formatDateTime(DateUtils.parseDate("2023-3-6 12:30:15")));
|
||||
System.out.println(DateUtils.getDate("yyyy年MM月dd日 E"));
|
||||
long time = new Date().getTime()-DateUtils.parseDate("2023-11-19").getTime();
|
||||
System.out.println(time/(24*60*60*1000));
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.jeesite.common.collect.ListUtils;
|
||||
import com.jeesite.common.collect.MapUtils;
|
||||
import com.jeesite.common.mapper.JsonMapper;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -30,6 +31,7 @@ public class JsonMapperTest {
|
||||
map.put("pId", 1);
|
||||
map.put("name", "你好");
|
||||
map.put("open", true);
|
||||
map.put("date", new Date());
|
||||
list.add(map);
|
||||
String json = JsonMapper.toJson(list);
|
||||
System.out.println(json);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -26,4 +26,5 @@
|
||||
5.10.0
|
||||
5.10.1
|
||||
5.11.0
|
||||
5.11.1
|
||||
5.11.1
|
||||
5.12.0
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -12,10 +12,10 @@ IMPORT_PACKAGE_cms=\
|
||||
#FNP.strutil = org.beetl.ext.fn.StringUtil
|
||||
|
||||
##内置的格式化函数
|
||||
#FT.dateFormat = org.beetl.ext.format.DateFormat
|
||||
#FT.dateFormat = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
##内置的默认格式化函数
|
||||
#FTC.java.util.Date = org.beetl.ext.format.DateFormat
|
||||
#FTC.java.util.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
## 标签类
|
||||
#TAG.include= org.beetl.ext.tag.IncludeTag
|
||||
|
||||
@@ -34,4 +34,5 @@
|
||||
5.10.0
|
||||
5.10.1
|
||||
5.11.0
|
||||
5.11.1
|
||||
5.11.1
|
||||
5.12.0
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -71,19 +71,21 @@
|
||||
<scope>runtime</scope>
|
||||
</dependency> -->
|
||||
|
||||
<!-- 达梦数据库
|
||||
<!-- 达梦数据库 -->
|
||||
<dependency>
|
||||
<groupId>com.dameng</groupId>
|
||||
<artifactId>Dm8JdbcDriver18</artifactId>
|
||||
<version>8.1.1.49</version>
|
||||
</dependency> -->
|
||||
<artifactId>DmJdbcDriver18</artifactId>
|
||||
<version>8.1.3.62</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- 人大金仓数据库
|
||||
<!-- 人大金仓数据库 -->
|
||||
<dependency>
|
||||
<groupId>com.kingbase</groupId>
|
||||
<artifactId>kingbasejdbc8</artifactId>
|
||||
<version>8.6.0</version>
|
||||
</dependency> -->
|
||||
<groupId>cn.com.kingbase</groupId>
|
||||
<artifactId>kingbase8</artifactId>
|
||||
<version>8.6.1</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- Web Server -->
|
||||
<dependency>
|
||||
|
||||
@@ -431,6 +431,8 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
|
||||
data.put("company", Global.getProperty("companyName"));
|
||||
data.put("version", Global.getProperty("productVersion"));
|
||||
data.put("year", Global.getProperty("copyrightYear"));
|
||||
data.put("lang", Global.getLang(request));
|
||||
data.put("timeZone", Global.getTimeZone(request));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -458,7 +460,8 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
|
||||
data.put("company", Global.getProperty("companyName"));
|
||||
data.put("version", Global.getProperty("productVersion"));
|
||||
data.put("year", Global.getProperty("copyrightYear"));
|
||||
data.put("lang", Global.getLang());
|
||||
data.put("lang", Global.getLang(request));
|
||||
data.put("timeZone", Global.getTimeZone(request));
|
||||
List<Map<String, Object>> roleList = ListUtils.newArrayList();
|
||||
String desktopUrl = null; String roleCode = (String)session.getAttribute("roleCode");
|
||||
Set<String> roleCodes = roleCode != null ? SetUtils.newHashSet(StringUtils.splitComma(roleCode)) : null;
|
||||
|
||||
@@ -6,11 +6,13 @@ package com.jeesite.modules.config.web;
|
||||
|
||||
import com.jeesite.common.config.Global;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.utils.LocaleUtils;
|
||||
import com.jeesite.common.web.http.ServletUtils;
|
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.web.servlet.LocaleContextResolver;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.ServletRequest;
|
||||
@@ -28,7 +30,7 @@ public class IpAddrFilterConfig {
|
||||
private static String[] denyPrefixes;
|
||||
|
||||
@Bean
|
||||
public FilterRegistrationBean<Filter> ipAddrFilter() {
|
||||
public FilterRegistrationBean<Filter> ipAddrFilter(LocaleContextResolver localeResolver) {
|
||||
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
|
||||
bean.setName("ipAddrFilter");
|
||||
bean.setOrder(Ordered.HIGHEST_PRECEDENCE + 10);
|
||||
@@ -40,7 +42,9 @@ public class IpAddrFilterConfig {
|
||||
response.setStatus(403);
|
||||
ServletUtils.renderString(response, Global.getText("访问拒绝"));
|
||||
}
|
||||
LocaleUtils.removeTimeZoneAwareLocaleContext();
|
||||
});
|
||||
LocaleUtils.setLocaleResolver(localeResolver);
|
||||
bean.addUrlPatterns("/*");
|
||||
return bean;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
@@ -136,13 +137,14 @@ public class SwitchController extends BaseController{
|
||||
*/
|
||||
//@RequiresPermissions("user")
|
||||
@RequestMapping(value = "switchSkin/{skinName}")
|
||||
public String switchSkin(@PathVariable String skinName, HttpServletRequest request, HttpServletResponse response) {
|
||||
public String switchSkin(@PathVariable String skinName, @RequestParam(defaultValue="${adminPath}/index") String url,
|
||||
HttpServletRequest request, HttpServletResponse response) {
|
||||
if (StringUtils.isNotBlank(skinName) && !"select".equals(skinName)){
|
||||
CookieUtils.setCookie(response, "skinName", EncodeUtils.encodeUrl(EncodeUtils.xssFilter(skinName, request)));
|
||||
if (ServletUtils.isAjaxRequest(request)) {
|
||||
return renderResult(response, Global.TRUE, text("主题切换成功"));
|
||||
}
|
||||
return REDIRECT + adminPath + "/index";
|
||||
return REDIRECT + EncodeUtils.decodeUrl2(url);
|
||||
}
|
||||
return "modules/sys/switchSkin";
|
||||
}
|
||||
|
||||
@@ -117,15 +117,15 @@ FNP.array = org.beetl.ext.fn.ArrayUtil
|
||||
FNP.dict = com.jeesite.common.beetl.ext.fn.DictUtil
|
||||
|
||||
##内置的格式化函数
|
||||
FT.dateFormat = org.beetl.ext.format.DateFormat
|
||||
FT.dateFormat = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FT.numberFormat = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
FT.xss = com.jeesite.common.beetl.ext.format.XssFormat
|
||||
|
||||
##内置的默认格式化函数
|
||||
FTC.java.util.Date = org.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Date = org.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Time = org.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Timestamp = org.beetl.ext.format.DateFormat
|
||||
FTC.java.util.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Time = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Timestamp = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.lang.Short = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
FTC.java.lang.Long = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
FTC.java.lang.Integer = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
|
||||
@@ -133,13 +133,19 @@ mybatis:
|
||||
# 批量插入和更新的分批默认大小(防止库一次性接受不了太大的sql语句)
|
||||
defaultBatchSize: 500
|
||||
|
||||
# 执行逻辑删除的时候,同时修改主键字段值,方便再次使用这个主键值 v5.4.0+
|
||||
# 执行逻辑删除的时候,同时修改主键字段值,方便再次使用这个主键值(调用 entity.sqlMap().markIdDelete() 时生效) v5.4.0+
|
||||
# 案例分析(角色管理场景):
|
||||
# 1.如果是逻辑删除数据,并非物理删除,所以删除了角色 abc 再次新增时,会提示 abc 编号已存在
|
||||
# 2.使用方法为:在 super.delete(entity); 前调用:entity.sqlMap().markIdDelete();
|
||||
# 3.一般在手动填写主键业务中使用,启用后将会在删除后,修改 ID 值数据,例如:abc__del_随机串
|
||||
markIdDeleteFlag: __del_
|
||||
|
||||
# 允许 @Table orderBy 排序 设置为空,否则默认使用 主键 排序 v4.5.0 v5.1.0
|
||||
allowOrderEmpty: true
|
||||
|
||||
# 排序字段 SQL 过滤,该参数仅对 sqlMap.getOrder().setOrderBy 内部调用方法有效 page.setOrderBy 和 entity.setOrderBy 必须经过过滤 v5.12.0
|
||||
orderBySqlFilter: false
|
||||
|
||||
# Mapper文件刷新线程
|
||||
mapper:
|
||||
refresh:
|
||||
@@ -716,10 +722,6 @@ web:
|
||||
id: '[a-zA-Z0-9_\-/#\u4e00-\u9fa5]{0,64}'
|
||||
user.loginCode: '[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}'
|
||||
|
||||
# 默认的日期格式(JsonMapper)
|
||||
json:
|
||||
defaultDateFormat: yyyy-MM-dd HH:mm:ss
|
||||
|
||||
# 默认不启用(为兼用旧版保留,建议使用 CORS)
|
||||
jsonp:
|
||||
enabled: false
|
||||
@@ -758,7 +760,7 @@ file:
|
||||
# 设置允许上传的文件后缀(全局设置)
|
||||
imageAllowSuffixes: .gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,.webp,
|
||||
mediaAllowSuffixes: .flv,.swf,.mkv,webm,.mid,.mov,.mp3,.mp4,.m4v,.mpc,.mpeg,.mpg,.swf,.wav,.wma,.wmv,.avi,.rm,.rmi,.rmvb,.aiff,.asf,.ogg,.ogv,
|
||||
fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
|
||||
fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.ofd,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
|
||||
|
||||
# 允许上传的文件内容类型(图片、word、excel、ppt)防止修改后缀恶意上传文件(默认不启用验证)
|
||||
# allowContentTypes: image/jpeg,image/gif,image/bmp,image/png,image/x-png,
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
公司管理=Company manage
|
||||
岗位管理=Position manage
|
||||
|
||||
权限管理=Rights Manage
|
||||
权限管理=Rights manage
|
||||
角色管理=Role manage
|
||||
二级管理员=Secondary admin
|
||||
系统管理员=System admin
|
||||
@@ -56,6 +56,7 @@
|
||||
在线用户=Online user
|
||||
在线文档=Online doc
|
||||
|
||||
数据管理=Data manage
|
||||
研发工具=Develop Tools
|
||||
|
||||
用户选择=User select
|
||||
@@ -547,6 +548,7 @@
|
||||
主类全名=Main class name
|
||||
模块描述=Module description
|
||||
当前版本=Current version
|
||||
升级信息=Upgrade info
|
||||
版本=version
|
||||
未知=Unknown
|
||||
未安装=Uninstalled
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
在线用户=オンラインユーザー
|
||||
在线文档=オンラインドキュメント
|
||||
|
||||
数据管理=データかんり
|
||||
研发工具=開発ツール
|
||||
|
||||
用户选择=ユーザー選択
|
||||
@@ -460,6 +461,7 @@
|
||||
主类全名=主類のフルネーム
|
||||
模块描述=モジュール記述
|
||||
当前版本=現行版
|
||||
升级信息=アップグレードします情報
|
||||
版本=バージョン
|
||||
未知=未知
|
||||
未安装=未実装
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<select id="findList" resultType="EmpUser">
|
||||
SELECT ${sqlMap.column.toSql()}
|
||||
FROM ${sqlMap.table.toSql()}
|
||||
<if test="roleCode != null and roleCode != ''">
|
||||
<if test="(roleCode != null and roleCode != '') or (roleCodes != null and roleCodes.length gt 0)">
|
||||
JOIN ${_prefix}sys_user_role ur2 ON ur2.user_code = a.user_code
|
||||
</if>
|
||||
<if test="employee.postCode != null and employee.postCode != ''">
|
||||
@@ -24,6 +24,12 @@
|
||||
<if test="roleCode != null and roleCode != ''">
|
||||
AND ur2.role_code = #{roleCode}
|
||||
</if>
|
||||
<if test="roleCodes != null and roleCodes.length gt 0">
|
||||
AND ur2.role_code IN
|
||||
<foreach collection="roleCodes" item="roleCode" open="(" separator="," close=")">
|
||||
#{roleCode}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="employee.postCode != null and employee.postCode != ''">
|
||||
AND (
|
||||
ep.post_code = #{employee.postCode}
|
||||
|
||||
@@ -40,54 +40,59 @@
|
||||
}
|
||||
%>
|
||||
<% if(c.showType == 'input'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text" maxlength="${c.dataLength}"></u-input>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text"${c.dataLength != "0" ? ' maxlength="'+c.dataLength+'"' : ''}></u-input>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'textarea'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180" label-position="top">
|
||||
<u-input type="textarea" placeholder="请输入${c.columnLabel}" v-model="model.testTextarea" height="100" maxlength="${c.dataLength}" />
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180" label-position="top">
|
||||
<u-input type="textarea" placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" height="100"${c.dataLength != "0" ? ' maxlength="'+c.dataLength+'"' : ''} />
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'select' || c.showType == 'select_multiple'){
|
||||
var isMultiple = (c.showType == 'select_multiple'); %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"<% if(isMultiple){ %> multiple="true"<% } %> placeholder="请选择${c.columnLabel}"></js-select>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"<% if(isMultiple){ %> :multiple="true"<% } %> placeholder="请选择${c.columnLabel}"></js-select>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'radio'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-radio v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"></js-radio>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'checkbox'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-checkbox v-model="model.${c.attrName}" dict-type="${c.optionMap['dictType']}"></js-checkbox>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'date' || c.showType == 'datetime'){
|
||||
var isTime = (c.showType == 'datetime'); %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" format="yyyy-MM-dd${isTime?' HH:mm':''}" type="text" maxlength="${c.dataLength}"></u-input>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text"
|
||||
@click="${c.attrName}Open = true;" :disabled="true"></u-input>
|
||||
<u-picker v-model="${c.attrName}Open" mode="time" :default-time="model.${c.attrName}"
|
||||
:params="{year: true, month: true, day: true<% if(isTime){ %>, hour: true, minute: true, second: false<% } %>}"
|
||||
@confirm="model.${c.attrName} = $event.year + '-' + $event.month + '-' + $event.day<% if(isTime){ %> + ' ' + $event.hour + ':' + $event.minute<% } %>"
|
||||
></u-picker>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'userselect'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.simpleAttrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'officeselect'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.simpleAttrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'companyselect'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.simpleAttrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
|
||||
</u-form-item>
|
||||
<% }else if(c.showType == 'areaselect'){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.attrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<js-select v-model="model.${c.attrName}" :items="${c.simpleAttrName}List" placeholder="请选择${c.columnLabel}" :tree="true"<% if (isNotBlank(c.attrName2)){ %>
|
||||
:label-value="model.${c.attrName2}" @label-input="model.${c.attrName2} = $event"<% } %>></js-select>
|
||||
</u-form-item>
|
||||
<% }else{ %>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.attrName}" label-width="180">
|
||||
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text" maxlength="${c.dataLength}"></u-input>
|
||||
<u-form-item label="${c.columnLabel}" prop="${c.simpleAttrName}" label-width="180">
|
||||
<u-input placeholder="请输入${c.columnLabel}" v-model="model.${c.attrName}" type="text"${c.dataLength != "0" ? ' maxlength="'+c.dataLength+'"' : ''}></u-input>
|
||||
</u-form-item>
|
||||
<% } %>
|
||||
<%
|
||||
@@ -126,28 +131,31 @@ export default {
|
||||
continue;
|
||||
}
|
||||
%>
|
||||
<% if(c.showType == 'userselect'){ %>
|
||||
<% if(c.showType == 'userselect' && c.attrType != 'String'){ %>
|
||||
${c.simpleAttrName}: {
|
||||
userCode: '',
|
||||
userName: ''
|
||||
},
|
||||
<% }else if(c.showType == 'officeselect'){ %>
|
||||
<% }else if(c.showType == 'officeselect' && c.attrType != 'String'){ %>
|
||||
${c.simpleAttrName}: {
|
||||
officeCode: '',
|
||||
officeName: ''
|
||||
},
|
||||
<% }else if(c.showType == 'companyselect'){ %>
|
||||
<% }else if(c.showType == 'companyselect' && c.attrType != 'String'){ %>
|
||||
${c.simpleAttrName}: {
|
||||
companyCode: '',
|
||||
companyName: ''
|
||||
},
|
||||
<% }else if(c.showType == 'areaselect'){ %>
|
||||
<% }else if(c.showType == 'areaselect' && c.attrType != 'String'){ %>
|
||||
${c.simpleAttrName}: {
|
||||
areaCode: '',
|
||||
areaName: ''
|
||||
},
|
||||
<% }else{ %>
|
||||
${c.attrName}: '',
|
||||
<% if (!isBlank(c.attrName2)){ %>
|
||||
${c.attrName2}: '',
|
||||
<% } %>
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
@@ -167,7 +175,7 @@ export default {
|
||||
}
|
||||
%>
|
||||
<% if(c.isRequired == '1'){ %>
|
||||
'${c.attrName}': [
|
||||
'${c.simpleAttrName}': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入${c.columnLabel}',
|
||||
@@ -199,6 +207,8 @@ export default {
|
||||
${c.simpleAttrName}List: [],
|
||||
<% }else if(c.showType == 'areaselect'){ %>
|
||||
${c.simpleAttrName}List: [],
|
||||
<% }else if(c.showType == 'date' || c.showType == 'datetime'){ %>
|
||||
${c.attrName}Open: false,
|
||||
<% } %>
|
||||
<%
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<u-cell-group class="list" :border="false">
|
||||
<u-swipe-action :options="options" v-for="(item, index) in list" :key="item.id" :index="index" @click="optionsClick">
|
||||
<%
|
||||
var idParam = '', idParam2 = '';
|
||||
var idParam = '', idParam2 = '', queryField = '';
|
||||
for(pk in table.pkList){
|
||||
idParam = idParam + (pk.attrName + '=\'+item.' + pk.attrName);
|
||||
idParam2 = idParam2 + ('item.' + pk.attrName);
|
||||
@@ -39,6 +39,7 @@
|
||||
<text slot="label">创建者:{{item.createBy}} | 时间:{{item.createDate}}</text>
|
||||
</u-cell-item>
|
||||
<%
|
||||
queryField = c.attrName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -130,7 +131,7 @@ export default {
|
||||
search(value) {
|
||||
this.list = [];
|
||||
this.query.pageNo = 0;
|
||||
this.query.testInput = value;
|
||||
this.query.${queryField} = value;
|
||||
this.loadList();
|
||||
},
|
||||
navTo(url) {
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
:okAuth="'${permissionPrefix}:edit'"
|
||||
@register="register${modalOrDrawer}"
|
||||
@ok="handleSubmit"
|
||||
width="60%"
|
||||
width="70%"
|
||||
>
|
||||
<template #title>
|
||||
<Icon :icon="getTitle.icon" class="m-1 pr-1" />
|
||||
@@ -70,7 +70,7 @@
|
||||
var companyselectExists = false;
|
||||
var areaselectExists = false;
|
||||
for(c in table.columnList){
|
||||
if(c.isQuery == "1" && !c.isTreeEntityColumn){
|
||||
if(c.isEdit == "1" && !c.isTreeEntityColumn){
|
||||
if(c.showType == 'userselect'){
|
||||
userselectExists = true;
|
||||
}else if(c.showType == 'officeselect'){
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
var companyselectExists = false;
|
||||
var areaselectExists = false;
|
||||
for(c in table.columnList){
|
||||
if(c.isQuery == "1" && !c.isTreeEntityColumn){
|
||||
if(c.isEdit == "1" && !c.isTreeEntityColumn){
|
||||
if(c.showType == 'userselect'){
|
||||
userselectExists = true;
|
||||
}else if(c.showType == 'officeselect'){
|
||||
@@ -57,7 +57,7 @@
|
||||
<% } %>
|
||||
|
||||
const { t } = useI18n('${moduleName}${isNotEmpty(subModuleName)?'.'+subModuleName:''}.${className}');
|
||||
const record = ref<TestData>({} as ${ParentClassName});
|
||||
const record = ref<${ParentClassName}>({} as ${ParentClassName});
|
||||
|
||||
const tableColumns: BasicColumn[] = [
|
||||
<%
|
||||
|
||||
@@ -79,7 +79,7 @@ var officeselectExists = false;
|
||||
var companyselectExists = false;
|
||||
var areaselectExists = false;
|
||||
for(c in table.columnList){
|
||||
if(c.isQuery == "1" && !c.isTreeEntityColumn){
|
||||
if(c.isEdit == "1" && !c.isTreeEntityColumn){
|
||||
if(c.showType == 'userselect'){
|
||||
userselectExists = true;
|
||||
}else if(c.showType == 'officeselect'){
|
||||
|
||||
@@ -163,7 +163,7 @@ $(function() {
|
||||
maxFileSize: "#{isNotBlank(p.maxFileSize)?p.maxFileSize:@Global.getConfig('file.maxFileSize', '500*1024*1024')}",
|
||||
imageAllowSuffixes: '${isNotBlank(p.allowSuffixes)?p.allowSuffixes:@Global.getConfig("file.imageAllowSuffixes", ".gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,.webp,")}',
|
||||
mediaAllowSuffixes: '${isNotBlank(p.allowSuffixes)?p.allowSuffixes:@Global.getConfig("file.mediaAllowSuffixes", ".flv,.swf,.mkv,webm,.mid,.mov,.mp3,.mp4,.m4v,.mpc,.mpeg,.mpg,.swf,.wav,.wma,.wmv,.avi,.rm,.rmi,.rmvb,.aiff,.asf,.ogg,.ogv,")}',
|
||||
fileAllowSuffixes: '${isNotBlank(p.allowSuffixes)?p.allowSuffixes:@Global.getConfig("file.fileAllowSuffixes", ".doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,")}',
|
||||
fileAllowSuffixes: '${isNotBlank(p.allowSuffixes)?p.allowSuffixes:@Global.getConfig("file.fileAllowSuffixes", ".doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.ofd,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,")}',
|
||||
chunked: "#{__info_type=='0'?false:@Global.getConfig('file.chunked', 'true')}",
|
||||
chunkSize: "#{@Global.getConfigToInteger('file.chunkSize', '10*1024*1024')}",
|
||||
threads: "#{@Global.getConfigToInteger('file.threads', '3')}",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<% include('/include/sysIndex/topMenuCorp.html'){} %>
|
||||
<% include('/include/sysIndex/topMenuOffice.html'){} %>
|
||||
<li><a href="javascript:" id="fullScreen" title="${text('全屏')}" data-placement="bottom" data-container="body"><i class="fa fa-arrows-alt"></i></a></li>
|
||||
<li><a href="javascript:" id="switchSkin" title="${text('切换主题')}" style="margin-top:-1px;" data-placement="bottom" data-container="body" data-layer-width="600" data-layer-height="350"><i class="fa fa-dashboard"></i></a></li>
|
||||
<li><a href="javascript:" id="switchSkin" title="${text('切换主题')}" data-placement="bottom" data-container="body" data-layer-width="600" data-layer-height="350"><i class="fa fa-dashboard"></i></a></li>
|
||||
<% include('/include/sysIndex/topMenuLang.html'){} %>
|
||||
<% include('/include/sysIndex/topMenuOnline.html'){} %>
|
||||
<% include('/include/sysIndex/topMenuMsg.html'){} %>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<% if(@Global.getConfigToBoolean('user.useCorpModel', 'false') && hasPermi('sys:corpAdmin:edit')){ %>
|
||||
<li>
|
||||
<a href="javascript:" id="switchCorp">
|
||||
<i class="fa icon-home"></i> ${text('当前租户')}:${currentCorpName}
|
||||
<i class="fa icon-home" style="font-size:14px;"></i> ${currentCorpName}
|
||||
</a>
|
||||
<div class="hide"><#form:treeselect id="switchCorpSelect" title="${text('租户切换')}" allowClear="false"
|
||||
url="${ctx}/sys/corpAdmin/treeData?isShowCode=true" callbackFuncName="switchCorpSelectCallback"/>
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
<% for(var dict in @DictUtils.getDictList('sys_lang_type')){ %>
|
||||
<li><a href="${ctxPath}/lang/${dict.dictValue}" onclick="location=this.href+'?url='+location.href;return false;">${dict.dictLabel}</a></li>
|
||||
<% } %>
|
||||
<li><a href="javascript:$('#timeZoneSelectName').click()">${@Global.getTimeZone()}</a></li>
|
||||
<div class="hide">
|
||||
<#form:treeselect id="timeZoneSelect" title="${text('时区选择')}" allowClear="false"
|
||||
url="${ctxPath}/timeZone/treeData" callbackFuncName="timeZoneSelectCallback" boxWidth="350"/>
|
||||
<script>
|
||||
function timeZoneSelectCallback(id, act){
|
||||
if (id == 'timeZoneSelect' && (act == 'ok')){
|
||||
var timeZoneId = $('#timeZoneSelectCode').val();
|
||||
location = '${ctxPath}/timeZone?id=' + js.encodeUrl(timeZoneId) + '&url=' + location.href;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
<li class="mt10"></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<% if(toBoolean(switchOffice!)){ %>
|
||||
<li>
|
||||
<a href="javascript:" id="switchOffice">
|
||||
<i class="fa icon-grid" style="font-size:12px;"></i> ${officeName!}
|
||||
<i class="fa icon-grid" style="font-size:13px;"></i> ${officeName!}
|
||||
</a>
|
||||
<div class="hide"><#form:treeselect id="switchOfficeSelect" title="${text('部门切换')}" allowClear="true"
|
||||
url="${ctx}/sys/empUser/officeListData?isShowCode=true" callbackFuncName="switchOfficeSelectCallback"
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('其它信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
@@ -89,7 +90,7 @@
|
||||
</div>
|
||||
<% } %>
|
||||
<script>
|
||||
$("#inputForm").validate({
|
||||
$('#inputForm').validate({
|
||||
submitHandler: function(form){
|
||||
js.ajaxSubmitForm($(form), function(data){
|
||||
js.showMessage(data.message);
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('其它信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
@@ -88,7 +89,7 @@
|
||||
</div>
|
||||
<% } %>
|
||||
<script>
|
||||
$("#inputForm").validate({
|
||||
$('#inputForm').validate({
|
||||
submitHandler: function(form){
|
||||
js.ajaxSubmitForm($(form), function(data){
|
||||
js.showMessage(data.message);
|
||||
|
||||
@@ -170,6 +170,7 @@ Vue:const props = defineProps({ aa: String, bb: String })">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('其它信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6 isMenu">
|
||||
<div class="form-group">
|
||||
@@ -224,7 +225,6 @@ Vue:const props = defineProps({ aa: String, bb: String })">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('其它信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
|
||||
@@ -62,22 +62,28 @@ Class.forName(“com.jeesite.modules.sys.web.LoginController”);在微服务
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('版本信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="col-xs-6">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" title="">
|
||||
<label class="control-label col-sm-4" title="">
|
||||
<span class="required hide">*</span> ${text('当前版本')}:<i class="fa icon-question hide"></i></label>
|
||||
<% if(isNotBlank(module.upgradeInfo)){ %>
|
||||
<div class="col-sm-6 control-text">
|
||||
${module.currentVersion} ${module.upgradeInfo}
|
||||
</div>
|
||||
<% }else{ %>
|
||||
<div class="col-sm-4">
|
||||
<#form:input path="currentVersion" maxlength="50" class="form-control"/>
|
||||
</div>
|
||||
<% } %>
|
||||
<div class="col-sm-8">
|
||||
<#form:input path="currentVersion" maxlength="50" class="form-control" readonly="${!module.isNewRecord}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% if(!module.isNewRecord){ %>
|
||||
<div class="col-xs-6">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-4" title="">
|
||||
<span class="required hide">*</span> ${text('升级信息')}:<i class="fa icon-question hide"></i></label>
|
||||
<div class="col-sm-8">
|
||||
<#form:input path="upgradeInfo" maxlength="300" class="form-control" readonly="true"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
<% if (hasPermi('sys:module:edit') && isCustomModule){ %>
|
||||
<div class="form-unit">${text('生成工程代码')}</div>
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('其它信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
@@ -99,7 +100,7 @@
|
||||
</div>
|
||||
<% } %>
|
||||
<script>
|
||||
$("#inputForm").validate({
|
||||
$('#inputForm').validate({
|
||||
submitHandler: function(form){
|
||||
js.ajaxSubmitForm($(form), function(data){
|
||||
js.showMessage(data.message);
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-unit">${text('其它信息')}</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<div class="form-group">
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
<li style="float:left;width:16.66666%;padding:5px;">
|
||||
<a href="javascript:" data-skin="skin-blue-light2" style="display:block;box-shadow:0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">
|
||||
<span style="display:block;width:20%;float:left;height:13px;background:#1681e5"></span>
|
||||
<span style="display:block;width:80%;float:left;height:13px;background:#1890ff"></span>
|
||||
<span style="display:block;width:80%;float:left;height:13px;background:#1677ff"></span>
|
||||
<span style="display:block;width:20%;float:left;height:30px;background:#f9fafc"></span>
|
||||
<span style="display:block;width:80%;float:left;height:30px;background:#f4f5f7"></span>
|
||||
</a>
|
||||
@@ -163,7 +163,7 @@
|
||||
<li style="float:left;width:16.66666%;padding:5px;">
|
||||
<a href="javascript:" data-skin="skin-blue-light3" style="display:block;box-shadow:0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">
|
||||
<span style="display:block;width:20%;float:left;height:13px;background:#1681e5"></span>
|
||||
<span style="display:block;width:80%;float:left;height:13px;background:#1890ff"></span>
|
||||
<span style="display:block;width:80%;float:left;height:13px;background:#1677ff"></span>
|
||||
<span style="display:block;width:20%;float:left;height:30px;background:#f9fafc"></span>
|
||||
<span style="display:block;width:80%;float:left;height:30px;background:#f4f5f7"></span>
|
||||
</a>
|
||||
@@ -186,7 +186,7 @@
|
||||
<% } %>
|
||||
<script>
|
||||
$('.full-opacity-hover').click(function(){
|
||||
js.window.location = '${ctx}/switchSkin/' + $(this).data('skin');
|
||||
js.window.location = '${ctx}/switchSkin/' + $(this).data('skin') + "?url=" + js.window.location;
|
||||
});
|
||||
|
||||
$('#formLayerModel')
|
||||
|
||||
@@ -466,18 +466,26 @@ public class DaoMapperTest extends BaseSpringContextTests {
|
||||
queryPost.setPostType("ceo");
|
||||
queryPost.sqlMap().getColumn().setExcludeAttrNames(SetUtils.newHashSet("postType"));
|
||||
queryPost.sqlMap().getColumn().setIncludeAttrNames(SetUtils.newHashSet("postName"));
|
||||
queryPost.sqlMap().getColumn().addExtSql("c1", "column1 AS \"column1\"");
|
||||
queryPost.sqlMap().getTable().addExtSql("t1", "JOIN test1 b.post_code = a.post_code");
|
||||
queryPost.sqlMap().getWhere().addExtSql("w1", "AND a.name1 = '123'");
|
||||
queryPost.sqlMap().getColumn().addExtSql("c1", "b.column1 AS \"column1\"");
|
||||
queryPost.sqlMap().getColumn().addExtSql("c2", "c.column2 AS \"column2\"");
|
||||
queryPost.sqlMap().getTable().addExtSql("t1", "JOIN test1 b ON b.post_code = a.post_code");
|
||||
queryPost.sqlMap().getTable().addExtSql("t2", "JOIN test2 c ON b.test_code = a.test_code");
|
||||
queryPost.sqlMap().getWhere().addExtSql("w1", "AND b.name1 = '123'");
|
||||
queryPost.sqlMap().getWhere().addExtSql("w2", "AND c.name2 = '123'");
|
||||
a = "SELECT " + queryPost.sqlMap().getColumn().toSql();
|
||||
a += " FROM " + queryPost.sqlMap().getTable().toSql();
|
||||
a += " WHERE " + queryPost.sqlMap().getWhere().toSql();
|
||||
b = "SELECT a.`corp_code` AS \"corpCode\", a.`corp_name` AS \"corpName\", a.`status` AS \"status\", " +
|
||||
"a.`create_by` AS \"createBy\", a.`create_date` AS \"createDate\", a.`update_by` AS \"updateBy\", " +
|
||||
"a.`update_date` AS \"updateDate\", a.`post_name` AS \"postName\", column1 AS \"column1\" " +
|
||||
"FROM `js_sys_post` aJOIN test1 b.post_code = a.post_code " +
|
||||
"WHERE a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1} " +
|
||||
"AND a.`post_type` = #{sqlMap.where#post_type#EQ1} AND a.name1 = '123'";
|
||||
b = "SELECT a.`corp_code` AS \"corpCode\", a.`corp_name` AS \"corpName\", a.`status` AS \"status\"," +
|
||||
" a.`create_by` AS \"createBy\", a.`create_date` AS \"createDate\", a.`update_by` AS \"updateBy\"," +
|
||||
" a.`update_date` AS \"updateDate\", a.`post_name` AS \"postName\"," +
|
||||
" b.column1 AS \"column1\", c.column2 AS \"column2\"" +
|
||||
" FROM `js_sys_post` a" +
|
||||
" JOIN test1 b ON b.post_code = a.post_code" +
|
||||
" JOIN test2 c ON b.test_code = a.test_code" +
|
||||
" WHERE a.`status` != #{STATUS_DELETE}" +
|
||||
" AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
|
||||
" AND a.`post_type` = #{sqlMap.where#post_type#EQ1}" +
|
||||
" AND b.name1 = '123' AND c.name2 = '123'";
|
||||
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(b, a);
|
||||
|
||||
System.exit(0);
|
||||
|
||||
@@ -4,7 +4,7 @@ productName: JeeSite Demo
|
||||
companyName: ThinkGem
|
||||
|
||||
# 产品版本、版权年份
|
||||
productVersion: V5.11
|
||||
productVersion: V5.12
|
||||
copyrightYear: 2025
|
||||
|
||||
# 数据库连接
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-modules</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>JeeSite Modules</name>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -27,12 +27,14 @@
|
||||
.navbar-nav > .treeview > a > .pull-right-container > .fa-angle-left{display:none;}
|
||||
.navbar-nav li > a > .pull-right-container > .fa-angle-left {margin-top:3px;transition:transform 0.5s ease;}
|
||||
.navbar-nav .menu-open > a > .pull-right-container > .fa-angle-left {transform: rotate(-90deg);}
|
||||
.navbar-nav .treeview.active>a {color:#1890ff;background-color:#e1e3e9;}
|
||||
.navbar-nav .treeview.active>a {color:#1677ff;background-color:#e1e3e9;}
|
||||
.navbar-nav .treeview small.label {float:right;}
|
||||
|
||||
/* 头部消息列表 */
|
||||
.navbar-nav>.messages-menu i.img-circle{margin:auto 10px auto auto;display:block;width:33px;height:33px;padding:9px;font-weight: bold;}
|
||||
.navbar-nav>.messages-menu>.dropdown-menu>li.header{border-radius:0;background-color:#f9f9f9;}
|
||||
.navbar-nav>.messages-menu>.dropdown-menu>li .menu {max-height:300px}
|
||||
.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4 {font-size:14px;font-weight:normal;margin-bottom:3px;}
|
||||
.navbar-nav>.messages-menu>.dropdown-menu>li a {white-space:normal!important;}
|
||||
|
||||
/* 侧边栏用户头像 */
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>JeeSite Parent</name>
|
||||
|
||||
2
pom.xml
2
pom.xml
@@ -5,7 +5,7 @@
|
||||
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>JeeSite</name>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-root</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>JeeSite Root</name>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ productName: JeeSite Demo
|
||||
companyName: ThinkGem
|
||||
|
||||
# 产品版本、版权年份
|
||||
productVersion: V5.11
|
||||
productVersion: V5.12
|
||||
copyrightYear: 2025
|
||||
|
||||
# 是否演示模式
|
||||
@@ -326,6 +326,19 @@ mybatis:
|
||||
#
|
||||
# # 批量插入和更新的分批默认大小(防止库一次性接受不了太大的sql语句)
|
||||
# defaultBatchSize: 500
|
||||
#
|
||||
# # 执行逻辑删除的时候,同时修改主键字段值,方便再次使用这个主键值(调用 entity.sqlMap().markIdDelete() 时生效) v5.4.0+
|
||||
# # 案例分析(角色管理场景):
|
||||
# # 1.如果是逻辑删除数据,并非物理删除,所以删除了角色 abc 再次新增时,会提示 abc 编号已存在
|
||||
# # 2.使用方法为:在 super.delete(entity); 前调用:entity.sqlMap().markIdDelete();
|
||||
# # 3.一般在手动填写主键业务中使用,启用后将会在删除后,修改 ID 值数据,例如:abc__del_随机串
|
||||
# markIdDeleteFlag: __del_
|
||||
#
|
||||
# # 允许 @Table orderBy 排序 设置为空,否则默认使用 主键 排序 v4.5.0 v5.1.0
|
||||
# allowOrderEmpty: true
|
||||
#
|
||||
# # 排序字段 SQL 过滤,该参数仅对 sqlMap.getOrder().setOrderBy 内部调用方法有效 page.setOrderBy 和 entity.setOrderBy 必须经过过滤 v5.12.0
|
||||
# orderBySqlFilter: false
|
||||
|
||||
# Mapper文件刷新线程
|
||||
mapper:
|
||||
@@ -844,10 +857,6 @@ web:
|
||||
# id: '[a-zA-Z0-9_\-/#\u4e00-\u9fa5]{0,64}'
|
||||
# user.loginCode: '[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}'
|
||||
#
|
||||
# # 默认的日期格式(JsonMapper)
|
||||
# json:
|
||||
# defaultDateFormat: yyyy-MM-dd HH:mm:ss
|
||||
#
|
||||
# # 默认不启用(为兼用旧版保留,建议使用 CORS)
|
||||
# jsonp:
|
||||
# enabled: false
|
||||
@@ -886,7 +895,7 @@ file:
|
||||
# # 设置允许上传的文件后缀(全局设置)
|
||||
# imageAllowSuffixes: .gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,.webp,
|
||||
# mediaAllowSuffixes: .flv,.swf,.mkv,webm,.mid,.mov,.mp3,.mp4,.m4v,.mpc,.mpeg,.mpg,.swf,.wav,.wma,.wmv,.avi,.rm,.rmi,.rmvb,.aiff,.asf,.ogg,.ogv,
|
||||
# fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
|
||||
# fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.ofd,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
|
||||
#
|
||||
# # 允许上传的文件内容类型(图片、word、excel、ppt)防止修改后缀恶意上传文件(默认不启用验证)
|
||||
# #allowContentTypes: image/jpeg,image/gif,image/bmp,image/png,image/x-png,
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
#FNP.strutil = org.beetl.ext.fn.StringUtil
|
||||
|
||||
##内置的格式化函数
|
||||
#FT.dateFormat = org.beetl.ext.format.DateFormat
|
||||
#FT.dateFormat = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
##内置的默认格式化函数
|
||||
#FTC.java.util.Date = org.beetl.ext.format.DateFormat
|
||||
#FTC.java.util.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
## 标签类
|
||||
#TAG.include= org.beetl.ext.tag.IncludeTag
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
<dependency>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-vue-dist</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@@ -8,7 +8,7 @@ productName: JeeSite Demo
|
||||
companyName: ThinkGem
|
||||
|
||||
# 产品版本、版权年份
|
||||
productVersion: V5.11
|
||||
productVersion: V5.12
|
||||
copyrightYear: 2025
|
||||
|
||||
# 是否演示模式
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
#FNP.strutil = org.beetl.ext.fn.StringUtil
|
||||
|
||||
##内置的格式化函数
|
||||
#FT.dateFormat = org.beetl.ext.format.DateFormat
|
||||
#FT.dateFormat = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
##内置的默认格式化函数
|
||||
#FTC.java.util.Date = org.beetl.ext.format.DateFormat
|
||||
#FTC.java.util.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
## 标签类
|
||||
#TAG.include= org.beetl.ext.tag.IncludeTag
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../jeesite/parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ productName: JeeSite Demo
|
||||
companyName: ThinkGem
|
||||
|
||||
# 产品版本、版权年份
|
||||
productVersion: V5.11
|
||||
productVersion: V5.12
|
||||
copyrightYear: 2025
|
||||
|
||||
# 是否演示模式
|
||||
|
||||
@@ -2,8 +2,12 @@
|
||||
ENGINE=org.beetl.core.engine.FastRuntimeEngine
|
||||
DELIMITER_PLACEHOLDER_START=${
|
||||
DELIMITER_PLACEHOLDER_END=}
|
||||
DELIMITER_PLACEHOLDER_START2="#{
|
||||
DELIMITER_PLACEHOLDER_END2=}"
|
||||
DELIMITER_STATEMENT_START=<%
|
||||
DELIMITER_STATEMENT_END=%>
|
||||
DELIMITER_STATEMENT_START2=//#
|
||||
DELIMITER_STATEMENT_END2=
|
||||
DIRECT_BYTE_OUTPUT = FALSE
|
||||
HTML_TAG_SUPPORT = true
|
||||
HTML_TAG_FLAG = #
|
||||
@@ -113,15 +117,15 @@ FNP.array = org.beetl.ext.fn.ArrayUtil
|
||||
FNP.dict = com.jeesite.common.beetl.ext.fn.DictUtil
|
||||
|
||||
##内置的格式化函数
|
||||
FT.dateFormat = org.beetl.ext.format.DateFormat
|
||||
FT.dateFormat = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FT.numberFormat = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
FT.xss = com.jeesite.common.beetl.ext.format.XssFormat
|
||||
|
||||
##内置的默认格式化函数
|
||||
FTC.java.util.Date = org.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Date = org.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Time = org.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Timestamp = org.beetl.ext.format.DateFormat
|
||||
FTC.java.util.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Time = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.sql.Timestamp = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
FTC.java.lang.Short = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
FTC.java.lang.Long = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
FTC.java.lang.Integer = com.jeesite.common.beetl.ext.format.NumberFormat
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.11.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ productName: JeeSite Demo
|
||||
companyName: ThinkGem
|
||||
|
||||
# 产品版本、版权年份
|
||||
productVersion: V5.11
|
||||
productVersion: V5.12
|
||||
copyrightYear: 2025
|
||||
|
||||
# 是否演示模式
|
||||
@@ -326,6 +326,19 @@ mybatis:
|
||||
#
|
||||
# # 批量插入和更新的分批默认大小(防止库一次性接受不了太大的sql语句)
|
||||
# defaultBatchSize: 500
|
||||
#
|
||||
# # 执行逻辑删除的时候,同时修改主键字段值,方便再次使用这个主键值(调用 entity.sqlMap().markIdDelete() 时生效) v5.4.0+
|
||||
# # 案例分析(角色管理场景):
|
||||
# # 1.如果是逻辑删除数据,并非物理删除,所以删除了角色 abc 再次新增时,会提示 abc 编号已存在
|
||||
# # 2.使用方法为:在 super.delete(entity); 前调用:entity.sqlMap().markIdDelete();
|
||||
# # 3.一般在手动填写主键业务中使用,启用后将会在删除后,修改 ID 值数据,例如:abc__del_随机串
|
||||
# markIdDeleteFlag: __del_
|
||||
#
|
||||
# # 允许 @Table orderBy 排序 设置为空,否则默认使用 主键 排序 v4.5.0 v5.1.0
|
||||
# allowOrderEmpty: true
|
||||
#
|
||||
# # 排序字段 SQL 过滤,该参数仅对 sqlMap.getOrder().setOrderBy 内部调用方法有效 page.setOrderBy 和 entity.setOrderBy 必须经过过滤 v5.12.0
|
||||
# orderBySqlFilter: false
|
||||
|
||||
# Mapper文件刷新线程
|
||||
mapper:
|
||||
@@ -886,7 +899,7 @@ file:
|
||||
# # 设置允许上传的文件后缀(全局设置)
|
||||
# imageAllowSuffixes: .gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,.webp,
|
||||
# mediaAllowSuffixes: .flv,.swf,.mkv,webm,.mid,.mov,.mp3,.mp4,.m4v,.mpc,.mpeg,.mpg,.swf,.wav,.wma,.wmv,.avi,.rm,.rmi,.rmvb,.aiff,.asf,.ogg,.ogv,
|
||||
# fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
|
||||
# fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.ofd,.vsd,.txt,.md,.xml,.rar,.zip,.7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
|
||||
#
|
||||
# # 允许上传的文件内容类型(图片、word、excel、ppt)防止修改后缀恶意上传文件(默认不启用验证)
|
||||
# #allowContentTypes: image/jpeg,image/gif,image/bmp,image/png,image/x-png,
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
#FNP.strutil = org.beetl.ext.fn.StringUtil
|
||||
|
||||
##内置的格式化函数
|
||||
#FT.dateFormat = org.beetl.ext.format.DateFormat
|
||||
#FT.dateFormat = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
##内置的默认格式化函数
|
||||
#FTC.java.util.Date = org.beetl.ext.format.DateFormat
|
||||
#FTC.java.util.Date = com.jeesite.common.beetl.ext.format.DateFormat
|
||||
|
||||
## 标签类
|
||||
#TAG.include= org.beetl.ext.tag.IncludeTag
|
||||
|
||||
Reference in New Issue
Block a user