Compare commits

..

27 Commits

Author SHA1 Message Date
thinkgem
119ceae9fe update jdbc driver 2025-05-27 23:36:36 +08:00
thinkgem
f7381ab736 5.12.0 2025-05-26 10:19:07 +08:00
thinkgem
5a830b7307 新增用户界面的时区切换 2025-05-26 09:42:50 +08:00
thinkgem
b5bde1e58c JsonMapper日期类型转换代码优化 2025-05-24 18:42:19 +08:00
thinkgem
a35d4654f5 新增 LocaleUtils 本地化语言和时区对象管理工具类 2025-05-24 18:41:41 +08:00
thinkgem
4634055b43 DateUtils.parseDate 多格式字符串解析性能优化,并支持时区 2025-05-24 18:41:02 +08:00
thinkgem
b4629aa465 更新语言包 2025-05-24 18:36:24 +08:00
thinkgem
4b6cdce814 beetl 日期格式化,使用性能更好的 DataUtils 管理 2025-05-24 18:35:24 +08:00
thinkgem
c478f2a969 代码优化 2025-05-24 16:59:16 +08:00
thinkgem
c7d317c1da JsonMapper 使用 DateUtils 解析日期,以支持更多的格式;优化 JsonFormat 注解非日期类型的自定义 2025-05-19 10:44:20 +08:00
thinkgem
8f6fd6000f 移除 web.json.defaultDateFormat 参数,使用 DateUtils 解析,以支持更多的格式 2025-05-19 10:41:10 +08:00
thinkgem
8f1dbaf3bd DateUtils 增加 yyyy-MM-dd'T'HH:mm:ss'Z' 格式解析 2025-05-19 10:38:43 +08:00
thinkgem
a414489ea9 默认包含达梦和人大金仓驱动,减少咨询,由于个别jdbc驱动体积比较大,可按需移除依赖 2025-05-12 11:09:40 +08:00
thinkgem
dc23dbcd6d 当已知异常信息包含更多异常的时候,将异常信息打印到日志中 2025-05-09 17:49:23 +08:00
thinkgem
62294446bd fileAllowSuffixes add .ofd 2025-05-09 14:29:14 +08:00
thinkgem
d7433b3c45 顶部消息框优化 2025-05-08 09:51:58 +08:00
thinkgem
f88e432403 next 2025-05-08 09:50:49 +08:00
thinkgem
3d99759a06 表单界面优化 2025-05-07 14:55:06 +08:00
thinkgem
7601d4d530 增加参数 mybatis.orderBySqlFilter 仅对内部参数设置生效,UI传输的数据仍然必须经过过滤。 2025-05-07 12:19:23 +08:00
thinkgem
59996a2a5b 一级菜单美化,圆角展示选中背景色 2025-05-06 15:08:32 +08:00
thinkgem
a35b7fd143 切换主题时,刷新当前页,不跳转到首页 2025-05-06 15:06:05 +08:00
thinkgem
ad28115fb3 update DaoMapperTest.java 2025-04-29 15:43:04 +08:00
thinkgem
9a816b18c2 移动端代码生成模板增强 2025-04-27 22:16:12 +08:00
thinkgem
f3d283ae4e 移动端模板补充日期时间组件生成 2025-04-27 15:39:11 +08:00
thinkgem
3abf83ff63 修正移动端模板的一些问题,textarea v-model 重复问题;maxlength 为 0 问题;列表 query 参数不对问题 2025-04-27 14:23:47 +08:00
thinkgem
9fedbcaa64 增加 按多个角色查询用户接口 user.roleCodes 2025-04-25 18:47:42 +08:00
thinkgem
bd059ab63e 当选择控件未设置查询列的时候没有生成office接口问题 2025-04-25 18:46:39 +08:00
69 changed files with 558 additions and 229 deletions

View File

@@ -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>

View File

@@ -103,5 +103,9 @@ public class IOUtils extends org.apache.commons.io.IOUtils {
// ignore
}
}
@Deprecated
public IOUtils() {
// empty
}
}

View File

@@ -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
}
}

View File

@@ -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();

View File

@@ -119,5 +119,9 @@ public class NumberUtils extends org.apache.commons.lang3.math.NumberUtils {
}
return df.format(data);
}
@Deprecated
public NumberUtils() {
// empty
}
}

View File

@@ -363,5 +363,9 @@ public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils {
// inputPool.free(input);
// }
// }
@Deprecated
public ObjectUtils() {
// empty
}
}

View File

@@ -415,5 +415,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return name;
}
}
@Deprecated
public StringUtils() {
// empty
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;}

View File

@@ -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;}

View File

@@ -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}

View File

@@ -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));

View File

@@ -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);

View File

@@ -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>

View File

@@ -26,4 +26,5 @@
5.10.0
5.10.1
5.11.0
5.11.1
5.11.1
5.12.0

View File

@@ -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>

View File

@@ -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

View File

@@ -34,4 +34,5 @@
5.10.0
5.10.1
5.11.0
5.11.1
5.11.1
5.12.0

View File

@@ -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>

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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";
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -56,6 +56,7 @@
在线用户=オンラインユーザー
在线文档=オンラインドキュメント
数据管理=データかんり
研发工具=開発ツール
用户选择=ユーザー選択
@@ -460,6 +461,7 @@
主类全名=主類のフルネーム
模块描述=モジュール記述
当前版本=現行版
升级信息=アップグレードします情報
版本=バージョン
未知=未知
未安装=未実装

View File

@@ -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}

View File

@@ -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,
<% } %>
<%
}

View File

@@ -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}} &nbsp;|&nbsp; 时间:{{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) {

View File

@@ -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'){

View File

@@ -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[] = [
<%

View File

@@ -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'){

View File

@@ -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')}",

View File

@@ -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'){} %>

View File

@@ -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"/>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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);

View File

@@ -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);

View File

@@ -170,6 +170,7 @@ Vueconst 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 @@ Vueconst 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">

View File

@@ -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} &nbsp; ${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>

View File

@@ -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);

View File

@@ -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">

View File

@@ -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')

View File

@@ -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);

View File

@@ -4,7 +4,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.11
productVersion: V5.12
copyrightYear: 2025
# 数据库连接

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;}
/* 侧边栏用户头像 */

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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,

View File

@@ -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

View File

@@ -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>

View File

@@ -8,7 +8,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.11
productVersion: V5.12
copyrightYear: 2025
# 是否演示模式

View File

@@ -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

View File

@@ -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>

View File

@@ -8,7 +8,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.11
productVersion: V5.12
copyrightYear: 2025
# 是否演示模式

View File

@@ -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

View File

@@ -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>

View File

@@ -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,

View File

@@ -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