Compare commits
88 Commits
v5.10.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 | ||
|
|
053f1ee499 | ||
|
|
4fa4ade638 | ||
|
|
1ae24c82c0 | ||
|
|
4b16fcf58a | ||
|
|
5f18c9635d | ||
|
|
8b58259c97 | ||
|
|
ce47d7f341 | ||
|
|
6ad05b6037 | ||
|
|
645f6f68fc | ||
|
|
1a92a275cd | ||
|
|
33c1865bf1 | ||
|
|
5e67bd380b | ||
|
|
77f245cbd7 | ||
|
|
95f68ac197 | ||
|
|
dc348365ce | ||
|
|
8c7a50f679 | ||
|
|
a8fb860bc1 | ||
|
|
737219388c | ||
|
|
f01b6e7818 | ||
|
|
ec95efccbc | ||
|
|
5ffcba1c4e | ||
|
|
78c10ba2be | ||
|
|
e28f4c9d12 | ||
|
|
f4adf804a3 | ||
|
|
95b08d24cf | ||
|
|
198e76110b | ||
|
|
c5cbb22621 | ||
|
|
c2fc3e5c96 | ||
|
|
00b53ba722 | ||
|
|
17d6d9a822 | ||
|
|
0465f35d4c | ||
|
|
a2b19c4b17 | ||
|
|
99321f4943 | ||
|
|
a4c3476693 | ||
|
|
415dc88a79 | ||
|
|
eaad1b6e51 | ||
|
|
97e318725a | ||
|
|
48801a5596 | ||
|
|
d127c2dc32 | ||
|
|
4befea3e6f | ||
|
|
96a07e886d | ||
|
|
2f2b508225 | ||
|
|
fbac25ef38 | ||
|
|
3aff37f35a | ||
|
|
a1beed5b5e | ||
|
|
fee4848ae2 | ||
|
|
84d59dea96 | ||
|
|
688797ae40 | ||
|
|
0132eb2a9e | ||
|
|
7eeae69a63 | ||
|
|
6a83a0f8f2 | ||
|
|
9c5dd7d7bb | ||
|
|
14d772cf6d | ||
|
|
ee6715de0a | ||
|
|
52f3b0d2bf | ||
|
|
f27dc31fb8 | ||
|
|
74b806ca1b | ||
|
|
29f3c6894c | ||
|
|
f9bcba6994 | ||
|
|
ed40654d6a | ||
|
|
208ba4a86e |
@@ -37,7 +37,7 @@
|
||||
* QQ 群:`127515876`、`209330483`、`223507718`、`709534275`、`730390092`、`1373527`、`183903863(外包)`
|
||||
* 微信群:如果二维码过期,请尝试刷新图片,或者添加客服微信 jeesitex 邀请您进群
|
||||
|
||||
<p style="padding-left:40px"><a href="https://jeesite.com/assets/images/wxg_cur.png" target="_blank">
|
||||
<p style="padding-left:40px"><a href="https://jeesite.com/assets/images/wxg_cur.png" target="_blank">
|
||||
<img alt="JeeSite微信群" src="https://jeesite.com/assets/images/wxg_cur.png" width="200"/></a>
|
||||
</p>
|
||||
|
||||
@@ -246,6 +246,7 @@ docker run --name jeesite-web -p 8980:8980 -d --restart unless-stopped \
|
||||
|
||||
## 技术支持与服务
|
||||
|
||||
* 本软件免费,我们也提供了相应的收费服务,因为:
|
||||
* 没有资金的支撑就很难得到发展,特别是一个好的产品,如果 JeeSite 帮助了您,请为我们点赞。支持我们,您可以获得更多回馈,我们会把公益事业做的更好,开放更多资源,回报社区和社会。请给我们一些动力吧,在此非常感谢已支持我们的朋友!
|
||||
* **联系我们**:请访问技术支持与服务页面:<http://s.jeesite.com>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.10.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>
|
||||
|
||||
@@ -154,7 +154,7 @@ public class EncodeUtils {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return URLEncoder.encode(part, encoding);
|
||||
return URLEncoder.encode(part, StringUtils.isNotBlank(encoding) ? encoding : EncodeUtils.UTF_8);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw ExceptionUtils.unchecked(e);
|
||||
}
|
||||
@@ -175,7 +175,7 @@ public class EncodeUtils {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return URLDecoder.decode(part, encoding);
|
||||
return URLDecoder.decode(part, StringUtils.isNotBlank(encoding) ? encoding : EncodeUtils.UTF_8);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw ExceptionUtils.unchecked(e);
|
||||
}
|
||||
@@ -309,4 +309,27 @@ public class EncodeUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 对邮箱和手机号进行安全处理
|
||||
private static final Pattern emailPattern = Pattern.compile("([\\w\\W]?)([\\w\\W]+)([\\w\\W])(@[\\w\\W]+)");
|
||||
private static final Pattern mobilePattern = Pattern.compile("(\\d{3})(\\d+)(\\d{3})");
|
||||
|
||||
/**
|
||||
* 手机号码进行掩码处理
|
||||
*/
|
||||
public static String mobileMask(String mobile){
|
||||
if (StringUtils.isBlank(mobile)){
|
||||
return mobile;
|
||||
}
|
||||
return mobilePattern.matcher(mobile).replaceAll("$1****$3");
|
||||
}
|
||||
|
||||
/**
|
||||
* 对电子邮箱进行掩码处理
|
||||
*/
|
||||
public static String emailMask(String email){
|
||||
if (StringUtils.isBlank(email)){
|
||||
return email;
|
||||
}
|
||||
return emailPattern.matcher(email).replaceAll("$1****$3$4");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,5 +103,9 @@ public class IOUtils extends org.apache.commons.io.IOUtils {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public IOUtils() {
|
||||
// empty
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@
|
||||
*/
|
||||
package com.jeesite.common.io;
|
||||
|
||||
import com.jeesite.common.codec.EncodeUtils;
|
||||
import com.jeesite.common.collect.SetUtils;
|
||||
import com.jeesite.common.lang.ObjectUtils;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
@@ -17,6 +16,8 @@ import org.springframework.core.io.Resource;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
@@ -35,10 +36,10 @@ public class PropertiesUtils {
|
||||
|
||||
// 默认加载的文件,可通过继承覆盖(若有相同Key,优先加载后面的)
|
||||
public static final String[] DEFAULT_CONFIG_FILE = new String[]{
|
||||
"classpath:application.yml", "classpath:config/application.yml",
|
||||
"classpath:bootstrap.yml", "classpath:config/bootstrap.yml",
|
||||
"file:application.yml", "file:config/application.yml",
|
||||
"file:bootstrap.yml", "file:config/bootstrap.yml",
|
||||
"classpath:config/application.yml", "classpath:application.yml",
|
||||
"classpath:config/bootstrap.yml", "classpath:bootstrap.yml",
|
||||
"file:config/application.yml", "file:application.yml",
|
||||
"file:config/bootstrap.yml", "file:bootstrap.yml",
|
||||
};
|
||||
|
||||
private static final Logger logger = PropertiesUtils.initLogger();
|
||||
@@ -64,9 +65,7 @@ public class PropertiesUtils {
|
||||
//configSet.add("classpath:config/jeesite.yml");
|
||||
// 获取全局设置默认的配置文件(以下是支持环境配置的属性文件)
|
||||
Set<String> set = SetUtils.newLinkedHashSet();
|
||||
for (String configFile : DEFAULT_CONFIG_FILE){
|
||||
set.add(configFile);
|
||||
}
|
||||
set.addAll(Arrays.asList(DEFAULT_CONFIG_FILE));
|
||||
// 获取 spring.config.location 外部自定义的配置文件
|
||||
String customConfigs = System.getProperty("spring.config.location");
|
||||
if (StringUtils.isNotBlank(customConfigs)){
|
||||
@@ -81,7 +80,7 @@ public class PropertiesUtils {
|
||||
}
|
||||
}
|
||||
// 获取 spring.profiles.active 活动环境名称的配置文件
|
||||
String[] configFiles = set.toArray(new String[set.size()]);
|
||||
String[] configFiles = set.toArray(new String[0]);
|
||||
String profiles = System.getProperty("spring.profiles.active");
|
||||
if (StringUtils.isBlank(profiles)){
|
||||
PropertiesUtils propsTemp = new PropertiesUtils(configFiles);
|
||||
@@ -101,7 +100,7 @@ public class PropertiesUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
configFiles = configSet.toArray(new String[configSet.size()]);
|
||||
configFiles = configSet.toArray(new String[0]);
|
||||
logger.debug("Trying: {}", (Object)configFiles);
|
||||
INSTANCE = new PropertiesUtils(configFiles);
|
||||
}
|
||||
@@ -115,12 +114,11 @@ public class PropertiesUtils {
|
||||
Resource resource = ResourceUtils.getResource(location);
|
||||
if (resource.exists()){
|
||||
if (location.endsWith(".properties")){
|
||||
try (InputStreamReader is = new InputStreamReader(resource.getInputStream(), EncodeUtils.UTF_8)){
|
||||
try (InputStreamReader is = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)){
|
||||
properties.load(is);
|
||||
configSet.add(location);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Load " + location + " failure.");
|
||||
e.printStackTrace();
|
||||
logger.error("Load {} failure.", location, e);
|
||||
}
|
||||
}
|
||||
else if (location.endsWith(".yml")){
|
||||
@@ -133,8 +131,7 @@ public class PropertiesUtils {
|
||||
}
|
||||
configSet.add(location);
|
||||
} catch (Exception e) {
|
||||
System.err.println("Load " + location + " failure.");
|
||||
e.printStackTrace();
|
||||
logger.error("Load {} failure.", location, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -174,7 +171,7 @@ public class PropertiesUtils {
|
||||
private static final Pattern p1 = Pattern.compile("\\$\\{.*?\\}");
|
||||
|
||||
/**
|
||||
* 获取属性值,取不到从System.getProperty()获取,都取不到返回null
|
||||
* 获取属性值,取不到从System.getProperty和System.getenv获取,都取不到返回null
|
||||
*/
|
||||
public String getProperty(String key) {
|
||||
if (environment != null){
|
||||
@@ -196,9 +193,10 @@ public class PropertiesUtils {
|
||||
String systemProperty = System.getProperty(key);
|
||||
if (systemProperty != null) {
|
||||
return systemProperty;
|
||||
}else{
|
||||
return System.getenv(key);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -315,7 +313,6 @@ public class PropertiesUtils {
|
||||
|
||||
/**
|
||||
* 设置环境属性
|
||||
* @param environment
|
||||
*/
|
||||
public static void setEnvironment(Environment environment) {
|
||||
PropertiesUtils.environment = environment;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.core.JsonParser.Feature;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
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;
|
||||
@@ -20,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;
|
||||
@@ -27,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;
|
||||
@@ -50,63 +50,104 @@ public class JsonMapper extends ObjectMapper {
|
||||
private static final class JsonMapperHolder {
|
||||
private static final JsonMapper INSTANCE = new JsonMapper();
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -121,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;
|
||||
}
|
||||
|
||||
@@ -152,7 +193,7 @@ public class JsonMapper extends ObjectMapper {
|
||||
try {
|
||||
return this.writeValueAsString(object);
|
||||
} catch (IOException e) {
|
||||
logger.warn("write to json string error:" + object, e);
|
||||
logger.warn("write to json string error: {}", object, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -166,7 +207,7 @@ public class JsonMapper extends ObjectMapper {
|
||||
try {
|
||||
return this.writerWithView(jsonView).writeValueAsString(object);
|
||||
} catch (IOException e) {
|
||||
logger.warn("write to json string error:" + object, e);
|
||||
logger.warn("write to json string error: {}", object, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -182,8 +223,8 @@ public class JsonMapper extends ObjectMapper {
|
||||
* 反序列化POJO或简单Collection如List<String>.
|
||||
* 如果JSON字符串为Null或"null"字符串, 返回Null.
|
||||
* 如果JSON字符串为"[]", 返回空集合.
|
||||
* 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String,JavaType)
|
||||
* @see #fromJson(String, JavaType)
|
||||
* 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String, Class)
|
||||
* @see #fromJson(String, Class)
|
||||
*/
|
||||
public <T> T fromJsonString(String jsonString, Class<T> clazz) {
|
||||
if (StringUtils.isEmpty(jsonString) || "<CLOB>".equals(jsonString)) {
|
||||
@@ -192,7 +233,7 @@ public class JsonMapper extends ObjectMapper {
|
||||
try {
|
||||
return this.readValue(jsonString, clazz);
|
||||
} catch (IOException e) {
|
||||
logger.warn("parse json string error:" + jsonString, e);
|
||||
logger.warn("parse json string error: {}", jsonString, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -209,7 +250,7 @@ public class JsonMapper extends ObjectMapper {
|
||||
try {
|
||||
return (T) this.readValue(jsonString, javaType);
|
||||
} catch (IOException e) {
|
||||
logger.warn("parse json string error:" + jsonString, e);
|
||||
logger.warn("parse json string error: {}", jsonString, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -230,10 +271,8 @@ public class JsonMapper extends ObjectMapper {
|
||||
public <T> T update(String jsonString, T object) {
|
||||
try {
|
||||
return (T) this.readerForUpdating(object).readValue(jsonString);
|
||||
} catch (JsonProcessingException e) {
|
||||
logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
|
||||
} catch (Exception e) {
|
||||
logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
|
||||
logger.warn("update json string: {} to object: {} error.", jsonString, object, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -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;}
|
||||
@@ -199,7 +200,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.form-control:focus,.select2-container--default.select2-container--focus .select2-selection--multiple,
|
||||
.select2-container--default .select2-search--dropdown .select2-search__field,
|
||||
.select2-container--default.select2-container--focus .select2-selection--single,
|
||||
.select2-container--default.select2-container--focus .select2-selection--multiple {border-color:#557bfa!important;box-shadow:0 0 0 2px rgba(24,80,236,.2);}
|
||||
.select2-container--default.select2-container--focus .select2-selection--multiple {border-color:#557bfa!important;box-shadow:0 0 0 2px rgba(5, 88, 255, 0.06);}
|
||||
.table thead tr, .ui-jqgrid-htable thead tr, .ui-jqgrid-hdiv, .ui-jqgrid-hbox {background-color:#f6f6f6;}
|
||||
.ui-jqgrid .ui-jqgrid-labels th, .ui-jqgrid tr.ui-row-ltr td, .ui-jqgrid tr.ui-row-rtl td, .ui-jqgrid tr.ui-row-ltr td:last-child,
|
||||
.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column,
|
||||
|
||||
@@ -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;}
|
||||
@@ -221,7 +242,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
.form-control:focus,.select2-container--default.select2-container--focus .select2-selection--multiple,
|
||||
.select2-container--default .select2-search--dropdown .select2-search__field,
|
||||
.select2-container--default.select2-container--focus .select2-selection--single,
|
||||
.select2-container--default.select2-container--focus .select2-selection--multiple {border-color:#557bfa!important;box-shadow:0 0 0 2px rgba(24,80,236,.2);}
|
||||
.select2-container--default.select2-container--focus .select2-selection--multiple {border-color:#557bfa!important;box-shadow:0 0 0 2px rgba(5, 88, 255, 0.06);}
|
||||
.table thead tr, .ui-jqgrid-htable thead tr, .ui-jqgrid-hdiv, .ui-jqgrid-hbox {background-color:#fafafa;}
|
||||
.ui-jqgrid .ui-jqgrid-labels th, .ui-jqgrid tr.ui-row-ltr td, .ui-jqgrid tr.ui-row-rtl td, .ui-jqgrid tr.ui-row-ltr td:last-child,
|
||||
.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column,
|
||||
|
||||
@@ -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}
|
||||
@@ -203,7 +203,7 @@ a, a:hover, a:active, a:focus, .form-unit, th[aria-selected=true] .ui-jqgrid-sor
|
||||
::-webkit-scrollbar {background:#2a2a2a;}
|
||||
::-webkit-scrollbar-thumb {background:#6a6a6a;}
|
||||
|
||||
.btn-default {background-color:#323232;border-color:#323232;color:#b5b5b5;}
|
||||
.btn-default {background-color:#323232;border-color:#323232;color:#b5b5b5;} .btn-default i {color:#dfdfdf;}
|
||||
.btn-default.active, .btn-default:active {background-color:#3e3e3e;border-color:#3e3e3e;color:#dfdfdf;}
|
||||
.btn-default:hover, .btn-default:active, .btn-default.hover, .btn-default:focus,
|
||||
.btn-default.active.focus, .btn-default.active:focus, .btn-default.active:hover, .btn-default:active.focus,
|
||||
@@ -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}
|
||||
|
||||
@@ -1,170 +0,0 @@
|
||||
=ZTree v3.x (JQuery Tree插件) 更新日志=
|
||||
|
||||
<font color="red">为了更好的优化及扩展zTree, 因此决定升级为v3.x,并且对之前的v2.x不兼容,会有很多结构上的修改,对此深感无奈与抱歉,请大家谅解。</font>
|
||||
<font color="red">
|
||||
|
||||
具体修改内容可参考:
|
||||
|
||||
* [http://www.ztree.me/v3/api.php zTree v3.0 API 文档]
|
||||
|
||||
* [http://www.ztree.me/v3/demo.php#_101 zTree v3.0 Demo 演示]
|
||||
|
||||
* [http://www.ztree.me/v3/faq.php#_101 zTree v3.0 常见问题]
|
||||
|
||||
</font>
|
||||
|
||||
<font color=#041594>
|
||||
*2013.03.11* v3.5.12
|
||||
* 【修改】由于 jquery 1.9 中移除 event.srcElement 导致的 js 报错的bug。
|
||||
* 【修改】在异步加载模式下,使用 moveNode 方法,且 moveType != "inner" 时,也会导致 targetNode 自动加载子节点的 bug
|
||||
* 【修改】对已经显示的节点(nochecked=true)使用 showNodes 或 showNode 方法后,导致勾选框出现的bug。
|
||||
* 【修改】对已经隐藏的节点(nochecked=false)使用 hideNodes 或 hideNode 方法后,导致勾选框消失的bug。
|
||||
* 【修改】getNodesByParamFuzzy 支持 大小写模糊。
|
||||
* 【修改】className 结构,提取 _consts.className.BUTTON / LEVEL / ICO_LOADING / SWITCH,便于快速修改 css 冲突。
|
||||
例如:与 WordPress 产生冲突后,直接修改 core 中的 "button" 和 "level" 即可。 Issue: https://github.com/zTree/zTree_v3/issues/2
|
||||
|
||||
*2013.01.28* v3.5.02
|
||||
* 【增加】setting.check.chkDisabledInherit 属性,用于设置 chkDisabled 在初始化时子节点是否可以继承父节点的 chkDisabled 属性
|
||||
* 【删除】内部 noSel 方法,使用 selectstart事件 和 "-moz-user-select"样式 处理禁止 节点文字被选择的功能
|
||||
* 【修改】不兼容 jQuery 1.9 的bug
|
||||
* 【修改】onDrop 的触发规则,保证异步加载模式下,可以在延迟加载结束后触发,避免 onDrop 中被拖拽的节点是已经更新后的数据。
|
||||
* 【修改】setChkDisabled 方法,增加 inheritParent, inheritChildren 参数设置是否让父子节点继承 disabled
|
||||
* 【修改】异步加载时 拼接参数的方法,由 string 修改为 json 对象
|
||||
* 【修正】1-2-3 3级节点时,如果 2级节点 全部设置为 nocheck 或 chkDisabled后,勾选3级节点时,1级节点的半勾选状态错误的 bug
|
||||
* 【修改】Demo: checkbox_nocheck.html & checkbox_chkDisabled.html;
|
||||
* 【修改】Demo: edit_super.html,增加 showRenameBtn & showRemoveBtn 的演示
|
||||
* 【修改】Demo: asyncForAll, 将 post 修改为 get;为了避免由于 IE10 的 bug 造成的客户端 以及 服务端崩溃
|
||||
IE10 ajax Post 无法提交参数的bug (http://bugs.jquery.com/ticket/12790)
|
||||
|
||||
*2012.12.21* v3.5.01
|
||||
* 【优化】clone 方法
|
||||
* 【修正】对于初始化无 children 属性的父节点进行 reAsyncChildNodes 操作时出错的 bug
|
||||
* 【修正】beforeRename 回调中使用 cancelEditName 方法后,再 return false 导致无法重新进行编辑的 bug
|
||||
* 【修正】exedit 扩展包让 setting.data.key.url 失效的 bug
|
||||
* 【修正】setting.check.autoCheckTrigger 设置为 true 时,onCheck 回调缺少 event 参数的 bug
|
||||
* 【修正】singlepath.html Demo 中的 bug
|
||||
|
||||
*2012.11.20* v3.5
|
||||
* 【优化】原先的 clone 方法 (特别感谢:愚人码头)
|
||||
* 【修改】隐藏父节点后,使用 expandAll 方法导致 父节点展开的 bug
|
||||
* 【修改】使用 jQuery v1.7 以上时,设置 zTree 容器 ul 隐藏(visibility: hidden;)后, 调用 selectNode 导致 IE 浏览器报错 Can't move focus 的 bug
|
||||
* 【修改】正在异步加载时,执行 destory 或 init 方法后,异步加载的节点影响新树的 bug
|
||||
* 【修改】方法 reAsyncChildNodes 在 refresh 的时候未清空内部 cache 导致内存泄露 的 bug
|
||||
* 【修改】批量节点拖拽到其他父节点内(inner)时,导致顺序反转 的 bug
|
||||
* 【修改】对于 使用 html格式的 节点无法触发 双击事件 的 bug
|
||||
* 【修改】onCheck 回调中的 event ,保证与触发事件中的 event 一致
|
||||
* 【修改】异步加载时,在 onNodeCreated 中执行 selectNode 后,导致节点折叠的 bug
|
||||
* 【修改】API 中 dataFilter 的参数名称 childNodes -> responseData
|
||||
* 【修改】API 中 iconSkin 的 举例内容
|
||||
* 【修改】API 中 chkDisabled 的说明
|
||||
* 【修改】Demo 中 index.html 内的 loadReady 重复绑定问题
|
||||
|
||||
*2012.09.03* v3.4
|
||||
* 【增加】 Demo —— OutLook 样式的左侧菜单
|
||||
* 【增加】清空 zTree 的方法 $.fn.zTree.destory(treeId) & zTree.destory()
|
||||
|
||||
* 【修改】core核心文件内 _eventProxy 方法中获取 tId 的方法,提高 DOM 的灵活性
|
||||
* 【修改】初始化时 多层父节点的 checkbox 半选状态计算错误的 bug
|
||||
* 【修改】同时选中父、子节点后,利用 getSelectedNodes 获取选中节点并利用 removeNode 删除时报错的 bug
|
||||
* 【修改】treeNode.chkDisabled / nocheck 属性,支持字符串格式的 "false"/"true"
|
||||
* 【修改】异步加载模式下无法利用 server 返回 xml 并且 在 dataFilter 中继续处理的 bug
|
||||
* 【修改】title 只允许设置为 string 类型值的问题。 修正后允许设置为 number 类型的值
|
||||
* 【修改】zId 计数规则 & Cache 保存,减少 IE9 的 bug 造成的内存泄漏
|
||||
* 【修改】API 页面搜索功能导致 IE 崩溃的 bug
|
||||
|
||||
*2012.07.16* v3.3
|
||||
* 【增加】扩展库 exhide -- 节点隐藏功能
|
||||
|
||||
* 【修改】getNodesByFilter 方法,添加 invokeParam 自定义参数
|
||||
* 【修改】拖拽中测试代码未删除,导致出现黄颜色的 iframe 遮罩层的 bug
|
||||
* 【修改】延迟加载方法 对于使用 expandAll 进行全部展开时,导致 onNodeCreated 回调 和 addDiyDom 方法触发过早的 bug
|
||||
* 【修改】使用 moveNode 移动尚未生成 DOM 的节点时,视图会出现异常的 bug
|
||||
* 【修改】删除节点后,相关节点的 isFirstNode 属性未重置的 bug
|
||||
* 【修改】getPreNode(),getNextNode() 方法在对于特殊情况时计算错误的 bug
|
||||
* 【修改】设置 title 之后,如果重新将 title 内容设置为空后,会导致无法更新 title 的 bug
|
||||
* 【修改】针对 setting.check.chkStyle=="radio" && setting.check.radioType=="all" 的情况时,getTreeCheckedNodes方法优化,找到一个结果就 break
|
||||
* 【修改】zTreeObj.getCheckedNodes(false) 在 radioType = "all" 时计算错误的 bug
|
||||
* 【修改】完善 API 中 beforeDrop / onDrop 的关于 treeId 的说明
|
||||
|
||||
*2012.05.13* v3.2
|
||||
* 【增加】setting.data.key.url 允许修改 treeNode.url 属性
|
||||
* 【增加】getNodesByFilter(filter, isSingle) 方法
|
||||
* 【增加】"与其他 DOM 拖拽互动" 的 Demo (http://www.ztree.me/v3/demo.php#_511)
|
||||
* 【增加】"异步加载模式下全部展开" 的 Demo (http://www.ztree.me/v3/demo.php#_512)
|
||||
|
||||
* 【修改】代码结构,将 addNodes、removeNode、removeChildNodes 方法 和 beforeRemove、onRemove 回调 转移到 core 内
|
||||
* 【修改】IE7的环境下无子节点的父节点反复展开出现多余空行的 bug
|
||||
* 【修改】异步加载时,如果出现网络异常等,会导致 图标显示错误的 bug
|
||||
* 【修改】dataFilter中 return null 导致异常 的 bug
|
||||
* 【修改】removeChildNodes 方法清空子节点后,无法正常添加节点的 bug
|
||||
* 【修改】moveNode 后节点中的自定义元素的事件丢失的 bug
|
||||
* 【修改】moveNode 方法中设置 isSilent = true 时,如果移动到已展开的 父节点后,出现异常的 bug
|
||||
* 【修改】onClick/onDrag/onDrop 回调中 event 不是原始 event 的 bug
|
||||
* 【修改】onDrop 回调中 当拖拽无效时,无法获得 treeNodes 的 bug
|
||||
* 【修改】onDrop 无法判断拖拽是 移动还是复制的问题
|
||||
* 【修改】未开启异步加载模式时,拖拽节点到子节点为空的父节点内时 出现异常 的 bug
|
||||
* 【修改】拖拽过程中,反复在 父节点图标上划动时,会出现停顿的 bug
|
||||
(需要css 结构—— button -> span.button)
|
||||
|
||||
* 【修改】拖拽操作时箭头 与 targetNode 背景之间的细节现实问题,便于用户拖拽时更容易区分 prev、next 和 inner 操作
|
||||
* 【修改】拖拽操作时IE6/7 下 在 节点<a> 右侧 10px 内会导致 targetNode = root 的 bug
|
||||
* 【修改】编辑模式下 默认的编辑按钮、删除按钮点击后,如果相应的 before 回调 return false 时会触发 onClick 回调的 bug
|
||||
|
||||
*2012.02.14* v3.1
|
||||
* 【增加】ajax 的参数 setting.async.contentType ,让提交参数适用于 json 数据提交 (主要适用于 .Net 的开发)。
|
||||
* 【增加】setting.edit.editNameSelectAll, 用于设定编辑节点名称时初次显示 input 后 text 内容为全选
|
||||
* 【修改】异步加载 规则,不再仅仅依靠父节点的子节点数来判定,增加内部属性 zAsync,保证默认状态下父节点及时无子节点也只能异步加载一次,除非使用 reAsyncChildNodes 方法强行控制异步加载。
|
||||
* 【修改】放大浏览器后导致 界面出现多余连接线的bug (需要更新:icon 图标和 css )
|
||||
* 【修改】在编辑状态,如果节点名超过编辑框宽度,左右键在框内不起作用的bug(IE 6 7 8 出现)
|
||||
CSS 中 filter:alpha(opacity=80) 造成的,应该是 ie 的 bug,需要更新 css 文件
|
||||
* 【修改】title 设置后,如果属性不存在,则默认为 title 为空,便于数据容错和用户灵活使用
|
||||
* 【修改】editName 方法如果针对尚未展开的 父节点,会导致该父节点自动展开的 bug
|
||||
* 【修改】title 中存在标签时导致 title 显示异常的bug(例如:蓝色字22%"'`<input/>`)
|
||||
|
||||
*2012.01.10* v3.0
|
||||
* 【增加】setting.check.autoCheckTrigger 默认值 false,可以设置联动选中时是否触发事件回调函数
|
||||
* 【增加】setting.callback.beforeEditName 回调函数,以保证用户可以捕获点击编辑按钮的事件
|
||||
* 【增加】treeNode.chkDisabled 属性,显示 checkbox 但是用户无法修改 checkbox 状态,并且该 checkbox 会影响父节点的 checkbox 的半选状态
|
||||
* 【增加】setting.check.nocheckInherit 属性,用户设置子节点继承 nocheck 属性,用于批量初始化节点,不适用于已经显示的节点
|
||||
* 【增加】setting.edit.drag.autoExpandTrigger 默认值 false,可以设置自动展开、折叠操作时是否触发事件回调函数
|
||||
* 【增加】setting.view.nameIsHTML 默认值 false,允许用户对 name 设置 DOM 对象
|
||||
* 【增加】treeNode.click 属性的说明文档
|
||||
* 【增加】treeObj.setChkDisabled 方法用于设置 checkbox / radio disabled 状态
|
||||
* 【增加】treeNode.halfCheck 属性,用于强制设定节点的半选状态
|
||||
|
||||
* 【修改】异步加载 & 编辑功能 共存时,拖拽节点 或 增加节点 导致 ie 上报错的 bug (apply 方法引起)
|
||||
* 【修改】zTreeStyle 样式冲突
|
||||
* 【修改】setting.data.key.title 默认值设置为 "",初始化时自动赋值为 setting.data.key.name 这样可避免希望 title 与 name 一致的用户反复设置参数
|
||||
* 【修改】点击叶子节点的连接线会触发 expand 事件的 bug
|
||||
* 【修改】IE 下 点击叶子节点连线会出现虚线框的 bug
|
||||
* 【修改】updateNode 导致 checkbox 半选状态错误的 bug
|
||||
* 【修改】checkNode 方法实现 toggle 操作, 取消 expandAll 方法的 toggle 操作
|
||||
* 【修改】zTree 内鼠标移动会抢页面上 input 内的焦点的 bug
|
||||
* 【修改】beforeRename / onRename 的触发方式——即使名称内容未改变也会触发,便于用户配合 beforeEditName 捕获编辑状态的结束,赋予用户更多调整规则的权利
|
||||
* 【修改】与 easyUI 共存时无法拖拽的bug
|
||||
* 【修改】beforeRename 在 Firefox 下如果利用 alert,会触发两次的 bug
|
||||
* 【修改】checkNode/expandNode/removeNode 方法,默认不触发回调函数,恢复 v2.6 的默认状态,同时增加 callbackFlag 参数,设置为 true 时,可以触发回调函数
|
||||
* 【修改】IE9下“根据参数查找节点”的Demo 报错:行14 重新声明常量属性(Demo 自身的问题,定义了history变量)
|
||||
* 【修改】初始化 zTree 时 onNodeCreated 事件回调函数中无法 用 getZTreeObj 获取 zTree 对象的 bug
|
||||
* 【修改】setting.edit.drag.prev / next / inner 参数,增加被拖拽的节点集合
|
||||
* 【修改】异步加载模式下,otherParam 使用Array数组会出错的 bug。例如: ["id", "1", "name", "test"]
|
||||
* 【修改】FireFox 下多棵树拖拽异常的 bug
|
||||
* 【修改】exedit 中调用 excheck库的方法时没有进行容错处理,导致如果只加入 exedit 而没有 excheck的时候,会出现 js 错误
|
||||
* 【修改】显示 checkbox 的 zTree 在编辑模式下,移动节点不会更新父节点半选状态的 bug
|
||||
* 【修改】treeNode.childs --> children; treeObject.removeChilds --> removeChildNodes; setting.data.key.childs --> children(英文不好惹的祸!抱歉了!)
|
||||
* 【修改】onRemove 回调中得到的 treeNode 还可以查找 preNode、nextNode 的bug。 修正后,getPreNode 和 getNextNode 都返回 null; 为了便于查找父节点,getParentNode 仍保留
|
||||
* 【修改】简单数据模式下,如果 id 与 pId 的值相同会导致该节点无法正常加载的 bug
|
||||
* 【修改】移动或删除中间节点会导致最后一个节点连接线图标变小的 bug
|
||||
|
||||
*2011.09.05* v3.0 beta
|
||||
* 【修改】zTree 的 js 代码架构全面修改,并且拆分
|
||||
* 【修改】zTree 的 css 样式全面修改,对浏览器可以更好地兼容,同时解决了以前1个像素差的问题
|
||||
* 【优化】采用延迟加载技术,一次性加载大数据量的节点性能飞速提升
|
||||
* 【增加】支持多节点同时选中、拖拽
|
||||
* 【增加】checkNode、checkAllNodes 等多种方法
|
||||
* 【增加】IE6 自动取消动画展开、折叠的功能
|
||||
* 【修正】异步加载 & 编辑模式 能够更完美的共存
|
||||
* 【修正】setting 配置更加合理,并且增加了若干项配置参数
|
||||
* 【修正】treeNode 节点数据的属性更加合理,并且增加了一些方法
|
||||
* 【修正】拖拽操作更加灵活方便,更容易制定自己的规则
|
||||
* 【修正】其他若干修改,详细对比请参考 url:[http://www.ztree.me/v3/faq.php#_101 zTree v3.0 常见问题]
|
||||
@@ -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.10.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
|
||||
Binary file not shown.
@@ -24,13 +24,14 @@ import java.util.Date;
|
||||
@Column(name="category", attrName="category", label="问题分类"),
|
||||
@Column(name="content", attrName="content", label="问题和意见"),
|
||||
@Column(name="contact", attrName="contact", label="联系方式"),
|
||||
@Column(includeEntity=DataEntity.class),
|
||||
@Column(name="create_by_name", attrName="createByName", label="提问人员姓名", queryType=QueryType.LIKE),
|
||||
@Column(name="device_info", attrName="deviceInfo", label="设备信息"),
|
||||
@Column(name="reply_date", attrName="replyDate", label="回复时间"),
|
||||
@Column(name="reply_content", attrName="replyContent", label="回复意见"),
|
||||
@Column(name="reply_user_code", attrName="replyUserCode", label="回复人员"),
|
||||
@Column(name="reply_user_name", attrName="replyUserName", label="回复人员姓名", queryType=QueryType.LIKE),
|
||||
@Column(name="status", attrName="status", label="状态", isUpdate=true), // save时,允许更新status字段
|
||||
@Column(includeEntity=DataEntity.class),
|
||||
}, orderBy="a.create_date DESC"
|
||||
)
|
||||
public class AppComment extends DataEntity<AppComment> {
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
*/
|
||||
package com.jeesite.modules.app.web;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.jeesite.common.config.Global;
|
||||
import com.jeesite.common.entity.Page;
|
||||
import com.jeesite.common.web.BaseController;
|
||||
import com.jeesite.modules.app.entity.AppComment;
|
||||
import com.jeesite.modules.app.service.AppCommentService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -20,11 +20,9 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import com.jeesite.common.config.Global;
|
||||
import com.jeesite.common.entity.Page;
|
||||
import com.jeesite.common.web.BaseController;
|
||||
import com.jeesite.modules.app.entity.AppComment;
|
||||
import com.jeesite.modules.app.service.AppCommentService;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* APP意见反馈Controller
|
||||
@@ -97,7 +95,6 @@ public class AppCommentController extends BaseController {
|
||||
}
|
||||
}
|
||||
appCommentService.save(appComment);
|
||||
appCommentService.updateStatus(appComment);
|
||||
return renderResult(Global.TRUE, text("保存意见成功!"));
|
||||
}
|
||||
|
||||
|
||||
@@ -24,4 +24,7 @@
|
||||
5.9.1
|
||||
5.9.2
|
||||
5.10.0
|
||||
5.10.1
|
||||
5.10.1
|
||||
5.11.0
|
||||
5.11.1
|
||||
5.12.0
|
||||
@@ -8,9 +8,9 @@
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<% if(hasPermi('app:appComment:edit')){ %>
|
||||
<a href="${ctx}/app/appComment/form" class="btn btn-default btnTool" title="${text('新增意见')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/app/appComment/form" class="btn btn-primary btnTool" title="${text('新增意见')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
|
||||
<a href="#" class="btn-setting" id="btnSetting" title="${text('设置')}"><i class="fa icon-settings"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
@@ -82,11 +82,11 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('app:appComment:edit')){
|
||||
actions.push('<a href="${ctx}/app/appComment/form?id='+row.id+'" class="btnList" title="${text("编辑意见")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/app/appComment/form?id='+row.id+'" class="btnList" title="${text("编辑意见")}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/app/appComment/disable?id='+row.id+'" class="btnList" title="${text("停用意见")}" data-confirm="${text("确认要停用该意见吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/app/appComment/disable?id='+row.id+'" class="btnList" title="${text("停用意见")}" data-confirm="${text("确认要停用该意见吗?")}"><i class="fa icon-ban"></i></a> ');
|
||||
} else if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/app/appComment/enable?id='+row.id+'" class="btnList" title="${text("启用意见")}" data-confirm="${text("确认要启用该意见吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/app/appComment/enable?id='+row.id+'" class="btnList" title="${text("启用意见")}" data-confirm="${text("确认要启用该意见吗?")}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/app/appComment/delete?id='+row.id+'" class="btnList" title="${text("删除意见")}" data-confirm="${text("确认要删除该意见吗?")}"><i class="fa fa-trash-o"></i></a> ');
|
||||
//# }
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<% if(hasPermi('app:appUpgrade:edit')){ %>
|
||||
<a href="${ctx}/app/appUpgrade/form" class="btn btn-default btnTool" title="${text('新增版本')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/app/appUpgrade/form" class="btn btn-primary btnTool" title="${text('新增版本')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
|
||||
<a href="#" class="btn-setting" id="btnSetting" title="${text('设置')}"><i class="fa icon-settings"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
@@ -82,11 +82,11 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('app:appUpgrade:edit')){
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/form?id='+row.id+'" class="btnList" title="${text("编辑版本")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/form?id='+row.id+'" class="btnList" title="${text("编辑版本")}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/disable?id='+row.id+'" class="btnList" title="${text("停用版本")}" data-confirm="${text("确认要停用该版本吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/disable?id='+row.id+'" class="btnList" title="${text("停用版本")}" data-confirm="${text("确认要停用该版本吗?")}"><i class="fa icon-ban"></i></a> ');
|
||||
} else if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/enable?id='+row.id+'" class="btnList" title="${text("启用版本")}" data-confirm="${text("确认要启用该版本吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/enable?id='+row.id+'" class="btnList" title="${text("启用版本")}" data-confirm="${text("确认要启用该版本吗?")}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/app/appUpgrade/delete?id='+row.id+'" class="btnList" title="${text("删除版本")}" data-confirm="${text("确认要删除该版本吗?")}"><i class="fa fa-trash-o"></i></a> ');
|
||||
//# }
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.10.1-SNAPSHOT</version>
|
||||
<version>5.12.0-SNAPSHOT</version>
|
||||
<relativePath>../../parent/pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
<artifactId>jeesite-module-core</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
Binary file not shown.
@@ -61,7 +61,7 @@ import java.util.Date;
|
||||
@Column(name = "site_code"),
|
||||
@Column(name = "site_name"),
|
||||
})
|
||||
}, extWhereKeys = "dsfCategory", orderBy = "a.update_date DESC"
|
||||
}, orderBy = "a.weight DESC, a.update_date DESC"
|
||||
)
|
||||
public class Article extends DataEntity<Article> {
|
||||
|
||||
|
||||
@@ -28,23 +28,28 @@ import java.util.List;
|
||||
@Column(name = "category_code", attrName = "categoryCode", label = "栏目编码", isPK = true),
|
||||
@Column(name = "category_name", attrName = "categoryName", label = "栏目名称", queryType = QueryType.LIKE, isTreeName = true),
|
||||
@Column(name = "site_code", attrName = "site.siteCode", label = "站点编码", queryType = QueryType.EQ),
|
||||
@Column(name = "module_type", attrName = "moduleType", label = "模块类型"), @Column(name = "image", attrName = "image", label = "栏目图片"),
|
||||
@Column(name = "href", attrName = "href", label = "链接"), @Column(name = "target", attrName = "target", label = "目标"),
|
||||
@Column(name = "keywords", attrName = "keywords", label = "关键字"), @Column(name = "description", attrName = "description", label = "描述"),
|
||||
@Column(name = "in_menu", attrName = "inMenu", label = "是否在导航中显示"), @Column(name = "in_list", attrName = "inList", label = "是否在分类页中显示列表"),
|
||||
@Column(name = "module_type", attrName = "moduleType", label = "模块类型"),
|
||||
@Column(name = "image", attrName = "image", label = "栏目图片"),
|
||||
@Column(name = "href", attrName = "href", label = "链接"),
|
||||
@Column(name = "target", attrName = "target", label = "目标"),
|
||||
@Column(name = "keywords", attrName = "keywords", label = "关键字"),
|
||||
@Column(name = "description", attrName = "description", label = "描述"),
|
||||
@Column(name = "in_menu", attrName = "inMenu", label = "是否在导航中显示"),
|
||||
@Column(name = "in_list", attrName = "inList", label = "是否在分类页中显示列表"),
|
||||
@Column(name = "show_modes", attrName = "showModes", label = "展现模式"),
|
||||
@Column(name = "is_need_audit", attrName = "isNeedAudit", label = "是否需要审核"),
|
||||
@Column(name = "is_can_comment", attrName = "isCanComment", label = "是否允许评论"),
|
||||
@Column(name = "custom_list_view", attrName = "customListView", label = "自定义列表视图"),
|
||||
@Column(name = "custom_content_view", attrName = "customContentView", label = "自定义内容视图"),
|
||||
@Column(name = "view_config", attrName = "viewConfig", label = "视图配置"), @Column(includeEntity = DataEntity.class),
|
||||
@Column(name = "view_config", attrName = "viewConfig", label = "视图配置"),
|
||||
@Column(includeEntity = DataEntity.class),
|
||||
@Column(includeEntity = Extend.class, attrName = "extend"),
|
||||
}, joinTable = {
|
||||
@JoinTable(entity = Site.class, alias = "s",
|
||||
on = "s.site_code = a.site_code", columns = {
|
||||
@Column(name = "site_name"),
|
||||
})
|
||||
}, extWhereKeys = "dsfCategory", orderBy = "a.tree_sorts, a.category_code"
|
||||
}, orderBy = "a.tree_sorts, a.category_code"
|
||||
)
|
||||
public class Category extends TreeEntity<Category> {
|
||||
|
||||
@@ -109,6 +114,14 @@ public class Category extends TreeEntity<Category> {
|
||||
this.categoryCode = categoryCode;
|
||||
}
|
||||
|
||||
public String getCategoryCode_like() {
|
||||
return sqlMap().getWhere().getValue("category_code", QueryType.LIKE);
|
||||
}
|
||||
|
||||
public void setCategoryCode_like(String categoryCode) {
|
||||
sqlMap().getWhere().and("category_code", QueryType.LIKE, categoryCode);
|
||||
}
|
||||
|
||||
@NotBlank(message = "栏目名称不能为空")
|
||||
@Size(min = 0, max = 100, message = "栏目名称长度不能超过 100 个字符")
|
||||
public String getCategoryName() {
|
||||
|
||||
@@ -29,7 +29,7 @@ import java.util.List;
|
||||
@Column(name = "site_sort", attrName = "siteSort", label = "站点排序号"),
|
||||
@Column(name = "title", attrName = "title", label = "站点标题", queryType = QueryType.LIKE),
|
||||
@Column(name = "logo", attrName = "logo", label = "站点Logo"),
|
||||
@Column(name = "domain_name", attrName = "domain", label = "站点域名"),
|
||||
@Column(name = "domain_name", attrName = "domain", label = "站点域名", queryType = QueryType.LIKE),
|
||||
@Column(name = "keywords", attrName = "keywords", label = "关键字"),
|
||||
@Column(name = "description", attrName = "description", label = "描述"),
|
||||
@Column(name = "theme", attrName = "theme", label = "主题"),
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
* No deletion without permission, or be held responsible to law.
|
||||
*/
|
||||
package com.jeesite.modules.cms.properties.properties;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
/**
|
||||
* CmsProperties
|
||||
* @author ThinkGem
|
||||
* @version 2022-4-10
|
||||
*/
|
||||
@ConfigurationProperties(prefix = "cms")
|
||||
public class CmsProperties {
|
||||
|
||||
private PageCache pageCache = new PageCache();
|
||||
|
||||
public static class PageCache {
|
||||
|
||||
/**
|
||||
* 是否开启页面静态化缓存
|
||||
*/
|
||||
private Boolean enabled = false;
|
||||
|
||||
/**
|
||||
* 缓存名称标识
|
||||
*/
|
||||
private String cacheName = "cmsPageCache";
|
||||
|
||||
/**
|
||||
* 拦截的网页地址
|
||||
*/
|
||||
private String urlPatterns = "${frontPath}/*";
|
||||
|
||||
/**
|
||||
* 只静态化 .html 后缀的网页
|
||||
*/
|
||||
private String urlSuffixes = ".html";
|
||||
|
||||
public Boolean getEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public void setEnabled(Boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public String getCacheName() {
|
||||
return cacheName;
|
||||
}
|
||||
|
||||
public void setCacheName(String cacheName) {
|
||||
this.cacheName = cacheName;
|
||||
}
|
||||
|
||||
public String getUrlPatterns() {
|
||||
return urlPatterns;
|
||||
}
|
||||
|
||||
public void setUrlPatterns(String urlPatterns) {
|
||||
this.urlPatterns = urlPatterns;
|
||||
}
|
||||
|
||||
public String getUrlSuffixes() {
|
||||
return urlSuffixes;
|
||||
}
|
||||
|
||||
public void setUrlSuffixes(String urlSuffixes) {
|
||||
this.urlSuffixes = urlSuffixes;
|
||||
}
|
||||
}
|
||||
|
||||
public PageCache getPageCache() {
|
||||
return pageCache;
|
||||
}
|
||||
|
||||
public void setPageCache(PageCache pageCache) {
|
||||
this.pageCache = pageCache;
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import com.jeesite.modules.cms.entity.Site;
|
||||
import com.jeesite.modules.cms.service.CategoryService;
|
||||
import com.jeesite.modules.cms.service.FileTempleteService;
|
||||
import com.jeesite.modules.cms.utils.CmsUtils;
|
||||
import com.jeesite.modules.sys.entity.Office;
|
||||
import com.jeesite.modules.sys.utils.DictUtils;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
@@ -29,6 +28,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -52,10 +52,23 @@ public class CategoryController extends BaseController {
|
||||
* 获取数据
|
||||
*/
|
||||
@ModelAttribute
|
||||
public Category get(String categoryCode, boolean isNewRecord) {
|
||||
public Category get(String categoryCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new Category();
|
||||
}
|
||||
return categoryService.get(categoryCode, isNewRecord);
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理主页
|
||||
*/
|
||||
@RequiresPermissions("cms:category:view")
|
||||
@RequestMapping(value = "index")
|
||||
public String index(Category category, Model model) {
|
||||
model.addAttribute("category", category);
|
||||
return "modules/cms/categoryIndex";
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询列表
|
||||
*/
|
||||
@@ -78,17 +91,18 @@ public class CategoryController extends BaseController {
|
||||
@ResponseBody
|
||||
public List<Category> listData(Category category) {
|
||||
if (StringUtils.isBlank(category.getParentCode())) {
|
||||
category.setParentCode(Office.ROOT_CODE);
|
||||
category.setParentCode(Category.ROOT_CODE);
|
||||
}
|
||||
if (StringUtils.isBlank(category.getSite().getSiteCode())) {
|
||||
category.setSite(new Site(Site.getCurrentSiteCode()));
|
||||
}
|
||||
List<Category> list = null;
|
||||
if (StringUtils.isNotBlank(category.getCategoryCode())) {
|
||||
list = ListUtils.newArrayList(get(category.getCategoryCode(), false));
|
||||
} else {
|
||||
list = categoryService.findList(category);
|
||||
if (StringUtils.isNotBlank(category.getCategoryCode())
|
||||
|| StringUtils.isNotBlank(category.getCategoryCode_like())
|
||||
|| StringUtils.isNotBlank(category.getCategoryName())
|
||||
|| StringUtils.isNotBlank(category.getRemarks())) {
|
||||
category.setParentCode(null);
|
||||
}
|
||||
List<Category> list = categoryService.findList(category);
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -212,7 +226,7 @@ public class CategoryController extends BaseController {
|
||||
public String disable(Category category) {
|
||||
Category where = new Category();
|
||||
where.setStatus(Category.STATUS_NORMAL);
|
||||
where.setParentCodes("," + category.getId() + ",");
|
||||
where.setParentCodes_rightLike(category.getParentCodes() + category.getId() + ",");
|
||||
long count = categoryService.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该栏目表包含未停用的子栏目表!"));
|
||||
|
||||
12
modules/cms/src/main/resources/application-assistant.yml
Normal file
12
modules/cms/src/main/resources/application-assistant.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
## 重要提示(Tip):
|
||||
|
||||
## 请勿在该配置文件中添加其它任何配置(添加也不会生效)。
|
||||
## 该文件,仅仅是为了让 jeesite-cms.yml 文件,
|
||||
## 在 IDEA 中有一个自动完成及帮助提示,并无其它用意。
|
||||
## 参数配置请在 jeesite-cms.yml 文件中添加。
|
||||
|
||||
spring:
|
||||
config:
|
||||
import:
|
||||
- classpath:config/jeesite-cms.yml
|
||||
@@ -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
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
cms:
|
||||
pageCache:
|
||||
# 是否开启页面静态化缓存
|
||||
#enabled: true
|
||||
enabled: false
|
||||
# 缓存名称标识
|
||||
cacheName: cmsPageCache
|
||||
# 拦截的网页地址
|
||||
|
||||
@@ -32,4 +32,7 @@
|
||||
5.9.1
|
||||
5.9.2
|
||||
5.10.0
|
||||
5.10.1
|
||||
5.10.1
|
||||
5.11.0
|
||||
5.11.1
|
||||
5.12.0
|
||||
@@ -4,6 +4,10 @@ body>.navbar{-webkit-transition:background-color .3s ease-in;transition:backgrou
|
||||
body>.navbar-transparent{background-color:transparent}
|
||||
body>.navbar-transparent .navbar-nav>.open>a{background-color:transparent!important}
|
||||
}
|
||||
h1,.h1{font-size:26px}
|
||||
h2,.h2{font-size:24px}
|
||||
h3,.h3{font-size:22px}
|
||||
p{margin:5px 0 10px;line-height:1.75;}
|
||||
#home{padding-top:0}
|
||||
#home .navbar-brand{padding:13.5px 15px 12.5px}
|
||||
#home .navbar-brand>img{display:inline;margin:0 10px;height:100%}
|
||||
@@ -80,7 +84,7 @@ footer p{clear:left;margin-bottom:0}
|
||||
.article-title {color:#333;font-size:30px;text-align:center;border-bottom:1px solid #ddd;padding:15px 20px 20px 20px;margin-bottom:30px;}
|
||||
.article-info {border-top:1px solid #ddd;padding:10px;margin:30px 0 0;}
|
||||
.article-desc {padding:8px 10px 8px;margin:10px 20px 20px 35px;font-size:14px;}
|
||||
.article-content {padding-top:20px;}
|
||||
.article-content {padding-top:10px;}
|
||||
|
||||
.pagination {margin:8px 0;display:block;/* text-align:center; */font-size:13px;} /* .pagination .controls a{border:0;} */
|
||||
.pagination>li>a, .pagination>li>span {min-width:37px;text-align:center;padding:6px;border:1px solid #ddd;background:transparent;/* border-radius:3px; */}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
<i class="fa icon-note"></i> ${text('内容管理')}
|
||||
</div>
|
||||
<div class="box-tools pull-right">
|
||||
<a href="${ctxFront}/index" target="_blank" class="btn btn-default" title="${text('访问站点')}"><i class="fa fa-globe"></i> ${text('访问网站')}</a>
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<a href="${ctxFront}/index" target="_blank" class="btn btn-default" title="${text('访问站点')}"><i class="fa fa-globe"></i> ${text('访问网站')}</a>
|
||||
<% if(hasPermi('cms:article:edit')){ %>
|
||||
<a href="${ctx}/cms/article/form" onclick="$(this).data('href', this.href+'?category.categoryCode='+$('#categoryCode').val())" class="btn btn-default btnTool" title="${text('新增文章')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/cms/article/form" onclick="$(this).data('href', this.href+'?category.categoryCode='+$('#categoryCode').val())" class="btn btn-primary btnTool" title="${text('新增文章')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -71,12 +71,12 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('cms:article:edit')){
|
||||
actions.push('<a href="${ctx}/cms/article/form?id='+row.id+'" class="btnList" title="${text("编辑文章")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/article/form?id='+row.id+'" class="btnList" title="${text("编辑文章")}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/cms/article/disable?id='+row.id+'" class="btnList" title="${text("停用文章")}" data-confirm="${text("确认要停用该文章吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/article/disable?id='+row.id+'" class="btnList" title="${text("停用文章")}" data-confirm="${text("确认要停用该文章吗?")}"><i class="fa icon-ban"></i></a> ');
|
||||
}
|
||||
if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/cms/article/enable?id='+row.id+'" class="btnList" title="${text("启用文章")}" data-confirm="${text("确认要启用该文章吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/article/enable?id='+row.id+'" class="btnList" title="${text("启用文章")}" data-confirm="${text("确认要启用该文章吗?")}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/cms/article/delete?id='+row.id+'" class="btnList" title="${text("删除文章")}" data-confirm="${text("确认要删除该文章吗?")}"><i class="fa fa-trash-o"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
<% layout('/layouts/default.html', {title: '栏目管理', libs: ['layout','zTree']}){ %>
|
||||
<div class="ui-layout-west">
|
||||
<div class="main-content">
|
||||
<div class="box box-main">
|
||||
<div class="box-header">
|
||||
<div class="box-title">
|
||||
<i class="fa icon-grid"></i> ${text('栏目导航')}
|
||||
</div>
|
||||
<div class="box-tools pull-right">
|
||||
<% if(hasPermi('bpm:bpmCategory:edit')){ %>
|
||||
<button type="button" class="btn btn-box-tool addTabPage" data-href="${ctx}/cms/category/list" title="${text('栏目管理')}"><i class="fa fa-edit"></i></button>
|
||||
<% } %>
|
||||
<button type="button" class="btn btn-box-tool" id="btnExpand" title="${text('展开')}" style="display:none;"><i class="fa fa-chevron-up"></i></button>
|
||||
<button type="button" class="btn btn-box-tool" id="btnCollapse" title="${text('折叠')}"><i class="fa fa-chevron-down"></i></button>
|
||||
<button type="button" class="btn btn-box-tool" id="btnRefresh" title="${text('刷新')}"><i class="fa fa-refresh"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui-layout-content">
|
||||
<div id="tree" class="ztree"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ui-layout-center">
|
||||
<iframe id="mainFrame" name="mainFrame" class="ui-layout-content p0"
|
||||
src="${ctx}/cms/category/list"></iframe>
|
||||
</div>
|
||||
<% } %>
|
||||
<script>
|
||||
//# // 初始化布局
|
||||
$('body').layout({
|
||||
west__initClosed: $(window).width() <= 767, // 是否默认关闭
|
||||
west__size: 190
|
||||
});
|
||||
//# // 主页框架
|
||||
var win = $("#mainFrame")[0].contentWindow;
|
||||
//# // 树结构初始化加载
|
||||
var setting = {view:{selectedMulti:false},data:{key:{title:"title"},simpleData:{enable:true}},
|
||||
async:{enable:true,autoParam:["id=parentCode"],url:"${ctx}/cms/category/treeData"},
|
||||
callback:{onClick:function(event, treeId, treeNode){
|
||||
tree.expandNode(treeNode);
|
||||
//win.$('button[type=reset]').click();
|
||||
win.$('#categoryCode').val(treeNode.id);
|
||||
win.page();
|
||||
}}
|
||||
}, tree, loadTree = function(){
|
||||
js.ajaxSubmit(setting.async.url+"?___t="+new Date().getTime(), {
|
||||
parentCode:'${parameter.parentCode!}'}, function(data){
|
||||
tree = $.fn.zTree.init($("#tree"), setting, data);
|
||||
var level = -1, nodes;
|
||||
while (++level <= 1) {
|
||||
nodes = tree.getNodesByParam("level", level);
|
||||
if (nodes.length > 10) { break; }
|
||||
for(var i=0; i<nodes.length; i++) {
|
||||
tree.expandNode(nodes[i], true, false, false);
|
||||
}
|
||||
}
|
||||
}, null, null, js.text('loading.message'));
|
||||
};loadTree();
|
||||
//# // 工具栏按钮绑定
|
||||
$('#btnExpand').click(function(){
|
||||
tree.expandAll(true);
|
||||
$(this).hide();
|
||||
$('#btnCollapse').show();
|
||||
});
|
||||
$('#btnCollapse').click(function(){
|
||||
tree.expandAll(false);
|
||||
$(this).hide();
|
||||
$('#btnExpand').show();
|
||||
});
|
||||
$('#btnRefresh').click(function(){
|
||||
loadTree();
|
||||
});
|
||||
//调用子页分页函数
|
||||
function page(){
|
||||
win.page();
|
||||
}
|
||||
</script>
|
||||
@@ -24,7 +24,7 @@
|
||||
<a href="#" class="btn btn-default" id="btnExpandTreeNode" title="${text('展开一级')}"><i class="fa fa-angle-double-down"></i>${text('展开')}</a>
|
||||
<a href="#" class="btn btn-default" id="btnCollapseTreeNode" title="${text('折叠全部')}"><i class="fa fa-angle-double-up"></i> ${text('折叠')}</a> <%
|
||||
if(hasPermi('cms:category:edit')){ %>
|
||||
<a href="${ctx}/cms/category/form?site.siteCode=${category.site.siteCode}" class="btn btn-default btnTool" title="${text('栏目添加')}"><i class="fa fa-plus"></i>${text('新增')}</a>
|
||||
<a href="${ctx}/cms/category/form?site.siteCode=${category.site.siteCode}" class="btn btn-primary btnTool" title="${text('新增栏目')}"><i class="fa fa-plus"></i>${text('新增')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -32,28 +32,35 @@
|
||||
<#form:form id="searchForm" model="${category}" action="${ctx}/cms/category/listData" method="post" class="form-inline "
|
||||
data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
|
||||
<#form:hidden path="site.siteCode" maxlength="64" class="form-control width-120" />
|
||||
<#form:hidden path="categoryCode" />
|
||||
<div class="form-group">
|
||||
<label class="control-label">${text('栏目名称')}:</label>
|
||||
<label class="control-label">${text('编码')}:</label>
|
||||
<div class="control-inline">
|
||||
<#form:input path="categoryName" maxlength="100" class="form-control width-120" />
|
||||
<#form:input path="categoryCode_like" maxlength="100" class="form-control width-90" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label">${text('模块类型')}:</label>
|
||||
<label class="control-label">${text('名称')}:</label>
|
||||
<div class="control-inline">
|
||||
<#form:input path="moduleType" maxlength="50" class="form-control width-120" />
|
||||
<#form:input path="categoryName" maxlength="100" class="form-control width-90" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label">${text('模型')}:</label>
|
||||
<div class="control-inline width-90">
|
||||
<#form:select path="moduleType" dictType="cms_module_type" blankOption="true" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label">${text('状态')}:</label>
|
||||
<div class="control-inline width-120">
|
||||
<div class="control-inline width-90">
|
||||
<#form:select path="status" dictType="sys_search_status" blankOption="true" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label">${text('备注信息')}:</label>
|
||||
<label class="control-label">${text('备注')}:</label>
|
||||
<div class="control-inline">
|
||||
<#form:input path="remarks" maxlength="500" class="form-control width-120" />
|
||||
<#form:input path="remarks" maxlength="500" class="form-control width-90" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
@@ -74,31 +81,40 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text("名称")}', name:'categoryName', index:'a.category_name', width:250, align:"left", frozen:true, formatter: function(val, obj, row, act){
|
||||
return '( '+row.categoryCode+' ) '+'<a href="${ctx}/cms/category/form?categoryCode='+row.categoryCode+'" class="btnList" data-title="${text("编辑栏目表")}">'+(val||row.id)+'</a>';
|
||||
}},
|
||||
{header:'${text("模型")}', name:'moduleType', index:'a.module_type', width:100, align:"center"},
|
||||
{header:'${text("排序")}', name:'treeSort', index:'a.tree_sort', width:50, align:"center"},
|
||||
{header:'${text("模型")}', name:'moduleType', index:'a.module_type', width:100, align:"center", formatter: function(val, obj, row, act){
|
||||
return js.getDictLabel("#{@DictUtils.getDictListJson('cms_module_type')}", val, '未知', true);
|
||||
}},
|
||||
{header:'${text("排序")}', name:'treeSort', index:'a.tree_sort', width:60, align:"center"},
|
||||
{header:'${text("导航栏目")}', name:'inMenu', index:'a.in_menu', width:80, fixed:true, align:"center", formatter: function(val, obj, row, act){
|
||||
return js.getDictLabel("#{@DictUtils.getDictListJson('sys_show_hide')}", val, '未知', true);
|
||||
}},
|
||||
{header:'${text("栏目列表")}', name:'inList', index:'a.in_list', width:80, fixed:true, align:"center", formatter: function(val, obj, row, act){
|
||||
return js.getDictLabel("#{@DictUtils.getDictListJson('sys_show_hide')}", val, '未知', true);
|
||||
}},
|
||||
{header:'${text("展现方式")}', name:'showModes', index:'a.show_modes', width:150, fixed:true, align:"center", formatter: function(val, obj, row, act){
|
||||
{header:'${text("展现方式")}', name:'showModes', index:'a.show_modes', width:90, fixed:true, align:"center", formatter: function(val, obj, row, act){
|
||||
return js.getDictLabel("#{@DictUtils.getDictListJson('cms_show_modes')}", val, '未知', true);
|
||||
}},
|
||||
{header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){
|
||||
{header:'${text("状态")}', name:'status', index:'a.status', width:90, fixed:true, align:"center", formatter: function(val, obj, row, act){
|
||||
return js.getDictLabel("#{@DictUtils.getDictListJson('sys_status')}", val, '未知', true);
|
||||
}},
|
||||
{header:'${text("备注")}', name:'remarks', index:'a.remarks', width:100, align:"left"},
|
||||
{header:'${text("操作")}', name:'actions', width:210, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('cms:category:edit')){
|
||||
actions.push('<a href="${ctx}/cms/category/form?categoryCode='+row.categoryCode+'" class="btnList" title="${text("编辑栏目表")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/category/form?categoryCode='+row.categoryCode+'" class="btnList" title="${text("编辑栏目表")}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/cms/category/disable?categoryCode='+row.categoryCode+'" class="btnList" title="${text("停用栏目表")}" data-confirm="${text("确认要停用该栏目表吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/category/disable?categoryCode='+row.categoryCode+'" class="btnList" title="${text("停用栏目表")}" data-confirm="${text("确认要停用该栏目表吗?")}"><i class="fa icon-ban"></i></a> ');
|
||||
}
|
||||
if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/cms/category/enable?categoryCode='+row.categoryCode+'" class="btnList" title="${text("启用栏目表")}" data-confirm="${text("确认要启用该栏目表吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/category/enable?categoryCode='+row.categoryCode+'" class="btnList" title="${text("启用栏目表")}" data-confirm="${text("确认要启用该栏目表吗?")}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/cms/category/delete?categoryCode='+row.categoryCode+'" class="btnList" title="${text("删除栏目表")}" data-confirm="${text("确认要删除该栏目表及所有子栏目表吗?")}" data-deltreenode="'+row.id+'"><i class="fa fa-trash-o"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/category/form?parentCode='+row.id+'&site.siteCode=${category.site.siteCode}" class="btnList" title="${text("新增下级栏目表")}"><i class="fa fa-plus-square"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/category/form?parentCode='+row.id+'&site.siteCode=${category.site.siteCode}" class="btnList" title="${text("新增下级栏目表")}"><i class="fa icon-plus"></i></a> ');
|
||||
//# if(hasPermi('cms:category:rebuildIndex')){
|
||||
actions.push('<a href="${ctx}/cms/category/rebuildIndex?categoryCode='+row.categoryCode+'" class="btnList" title="${text("重建该栏目索引")}" data-confirm="${text("确认重建该栏目下文章索引吗")}?"><i class="fa fa-crosshairs"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/category/rebuildIndex?categoryCode='+row.categoryCode+'" class="btnList" title="${text("重建该栏目索引")}" data-confirm="${text("确认重建该栏目文章索引吗")}?"><i class="fa fa-crosshairs"></i></a> ');
|
||||
//# }
|
||||
//# if(hasPermi('cms:category:rebuildVectorStore')){
|
||||
actions.push('<a href="${ctx}/cms/category/rebuildVectorStore?categoryCode='+row.categoryCode+'" class="btnList" title="${text("重建该栏目向量数据库")}" data-confirm="${text("确认重建该栏目文章向量数据库吗")}?"><i class="fa fa-database"></i></a> ');
|
||||
//# }
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctxFront}/list-'+row.categoryCode+'" target="_blank" title="${text("访问栏目")}"><i class="fa fa-globe"></i></a> ');
|
||||
@@ -109,10 +125,13 @@ $('#dataGrid').dataGrid({
|
||||
],
|
||||
treeGrid: true, // 启用树结构表格
|
||||
defaultExpandLevel: 0, // 默认展开的层次
|
||||
expandNodeClearPostData: 'categoryName,siteCode,moduleType,image,href,target,keywords,description,inMenu,inList,showModes,isNeedAudit,isCanComment,customListView,customContentView,viewConfig,status,remarks,', // 展开节点清理请求参数数据(一般设置查询条件的字段属性,否则在查询后,不能展开子节点数据)
|
||||
expandNodeClearPostData: 'categoryCode,categoryName,siteCode,moduleType,image,href,target,keywords,description,inMenu,inList,showModes,isNeedAudit,isCanComment,customListView,customContentView,viewConfig,status,remarks,', // 展开节点清理请求参数数据(一般设置查询条件的字段属性,否则在查询后,不能展开子节点数据)
|
||||
//# // 加载成功后执行事件
|
||||
ajaxSuccess: function(data){
|
||||
|
||||
if ($('#categoryCode').val() != ''){
|
||||
$('#categoryCode').val('');
|
||||
$('#btnExpandTreeNode').click();
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -8,7 +8,7 @@
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<% if(hasPermi('cms:comment:edit')){ %>
|
||||
<a href="${ctx}/cms/comment/form" class="btn btn-default btnTool" title="${text('新增文章评论表')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/cms/comment/form" class="btn btn-primary btnTool" title="${text('新增文章评论表')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -130,12 +130,12 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text('操作')}', name:'actions', width:120, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('cms:comment:edit')){
|
||||
actions.push('<a href="${ctx}/cms/comment/form?id='+row.id+'" class="btnList" title="${text('编辑文章评论表')}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/comment/form?id='+row.id+'" class="btnList" title="${text('编辑文章评论表')}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/cms/comment/disable?id='+row.id+'" class="btnList" title="${text('停用文章评论表')}" data-confirm="${text('确认要停用该文章评论表吗?')}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/comment/disable?id='+row.id+'" class="btnList" title="${text('停用文章评论表')}" data-confirm="${text('确认要停用该文章评论表吗?')}"><i class="fa icon-ban"></i></a> ');
|
||||
}
|
||||
if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/cms/comment/enable?id='+row.id+'" class="btnList" title="${text('启用文章评论表')}" data-confirm="${text('确认要启用该文章评论表吗?')}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/comment/enable?id='+row.id+'" class="btnList" title="${text('启用文章评论表')}" data-confirm="${text('确认要启用该文章评论表吗?')}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/cms/comment/delete?id='+row.id+'" class="btnList" title="${text('删除文章评论表')}" data-confirm="${text('确认要删除该文章评论表吗?')}"><i class="fa fa-trash-o"></i></a> ');
|
||||
//# }
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<% if(hasPermi('cms:report:edit')){ %>
|
||||
<a href="${ctx}/cms/report/form" class="btn btn-default btnTool" title="${text('新增内容举报表')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/cms/report/form" class="btn btn-primary btnTool" title="${text('新增内容举报表')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -71,12 +71,12 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text('操作')}', name:'actions', width:120, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('cms:report:edit')){
|
||||
actions.push('<a href="${ctx}/cms/report/form?id='+row.id+'" class="btnList" title="${text('编辑内容举报表')}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/report/form?id='+row.id+'" class="btnList" title="${text('编辑内容举报表')}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/cms/report/disable?id='+row.id+'" class="btnList" title="${text('停用内容举报表')}" data-confirm="${text('确认要停用该内容举报表吗?')}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/report/disable?id='+row.id+'" class="btnList" title="${text('停用内容举报表')}" data-confirm="${text('确认要停用该内容举报表吗?')}"><i class="fa icon-ban"></i></a> ');
|
||||
}
|
||||
if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/cms/report/enable?id='+row.id+'" class="btnList" title="${text('启用内容举报表')}" data-confirm="${text('确认要启用该内容举报表吗?')}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/report/enable?id='+row.id+'" class="btnList" title="${text('启用内容举报表')}" data-confirm="${text('确认要启用该内容举报表吗?')}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/cms/report/delete?id='+row.id+'" class="btnList" title="${text('删除内容举报表')}" data-confirm="${text('确认要删除该内容举报表吗?')}"><i class="fa fa-trash-o"></i></a> ');
|
||||
//# }
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<% if(hasPermi('cms:site:edit')){ %>
|
||||
<a href="${ctx}/cms/site/form" class="btn btn-default btnTool" title="${text('新增站点')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/cms/site/form" class="btn btn-primary btnTool" title="${text('新增站点')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -67,20 +67,23 @@ $('#dataGrid').dataGrid({
|
||||
return js.getDictLabel("#{@DictUtils.getDictListJson('sys_search_status')}", val, '${text("未知")}', true);
|
||||
}},
|
||||
{header:'${text("创建时间")}', name:'createDate', index:'a.create_date', width:150, align:"center"},
|
||||
{header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){
|
||||
{header:'${text("操作")}', name:'actions', width:183, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('cms:site:edit')){
|
||||
actions.push('<a href="${ctx}/cms/site/form?siteCode='+row.siteCode+'" class="btnList" title="${text("编辑站点")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/site/form?siteCode='+row.siteCode+'" class="btnList" title="${text("编辑站点")}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/cms/site/disable?siteCode='+row.siteCode+'" class="btnList" title="${text("停用站点")}" data-confirm="${text("确认要停用该站点吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/site/disable?siteCode='+row.siteCode+'" class="btnList" title="${text("停用站点")}" data-confirm="${text("确认要停用该站点吗?")}"><i class="fa icon-ban"></i></a> ');
|
||||
}
|
||||
if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/cms/site/enable?siteCode='+row.siteCode+'" class="btnList" title="${text("启用站点")}" data-confirm="${text("确认要启用该站点吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/site/enable?siteCode='+row.siteCode+'" class="btnList" title="${text("启用站点")}" data-confirm="${text("确认要启用该站点吗?")}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/cms/site/delete?siteCode='+row.siteCode+'" class="btnList" title="${text("删除站点")}" data-confirm="${text("确认要删除该站点吗?")}"><i class="fa fa-trash-o"></i></a> ');
|
||||
//# if(hasPermi('cms:site:rebuildIndex')){
|
||||
actions.push('<a href="${ctx}/cms/site/rebuildIndex?siteCode='+row.siteCode+'" class="btnList" title="${text("重建该站点索引")}" data-confirm="${text("确认重建该站点文章索引吗")}?"><i class="fa fa-crosshairs"></i></a> ');
|
||||
//# }
|
||||
//# if(hasPermi('cms:site:rebuildVectorStore')){
|
||||
actions.push('<a href="${ctx}/cms/site/rebuildVectorStore?siteCode='+row.siteCode+'" class="btnList" title="${text("重建该站点向量数据库")}" data-confirm="${text("确认重建该站点文章向量数据库吗")}?"><i class="fa fa-database"></i></a> ');
|
||||
//# }
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctxFront}/index-'+row.siteCode+'" target="_blank" title="${text("访问站点")}"><i class="fa fa-globe"></i></a> ');
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<!-- <% if(hasPermi('cms:visitLog:edit')){ %>
|
||||
<a href="${ctx}/cms/visitLog/form" class="btn btn-default btnTool" title="${text('新增访问日志表')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<a href="${ctx}/cms/visitLog/form" class="btn btn-primary btnTool" title="${text('新增访问日志表')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %> -->
|
||||
</div>
|
||||
</div>
|
||||
@@ -92,12 +92,12 @@ $('#dataGrid').dataGrid({
|
||||
{header:'${text('操作')}', name:'actions', width:120, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
//# if(hasPermi('cms:visitLog:edit')){
|
||||
actions.push('<a href="${ctx}/cms/visitLog/form?id='+row.id+'" class="btnList" title="${text('编辑访问日志表')}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/visitLog/form?id='+row.id+'" class="btnList" title="${text('编辑访问日志表')}"><i class="fa icon-note"></i></a> ');
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="${ctx}/cms/visitLog/disable?id='+row.id+'" class="btnList" title="${text('停用访问日志表')}" data-confirm="${text('确认要停用该访问日志表吗?')}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/visitLog/disable?id='+row.id+'" class="btnList" title="${text('停用访问日志表')}" data-confirm="${text('确认要停用该访问日志表吗?')}"><i class="fa icon-ban"></i></a> ');
|
||||
}
|
||||
if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="${ctx}/cms/visitLog/enable?id='+row.id+'" class="btnList" title="${text('启用访问日志表')}" data-confirm="${text('确认要启用该访问日志表吗?')}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="${ctx}/cms/visitLog/enable?id='+row.id+'" class="btnList" title="${text('启用访问日志表')}" data-confirm="${text('确认要启用该访问日志表吗?')}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
actions.push('<a href="${ctx}/cms/visitLog/delete?id='+row.id+'" class="btnList" title="${text('删除访问日志表')}" data-confirm="${text('确认要删除该访问日志表吗?')}"><i class="fa fa-trash-o"></i></a> ');
|
||||
//# }
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.jeesite</groupId>
|
||||
<artifactId>jeesite-parent</artifactId>
|
||||
<version>5.10.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>
|
||||
|
||||
@@ -58,6 +58,7 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
|
||||
|
||||
public static final Boolean POST_ROLE_PERMI = Global.getConfigToBoolean("user.postRolePermi", "false");
|
||||
public static final Boolean SWITCH_OFFICE = Global.getConfigToBoolean("user.switchOffice", "false");
|
||||
public static final Boolean LOGIN_AFTER_ACTIVE_MAIN_OFFICE = Global.getConfigToBoolean("user.loginAfterActiveMainOffice", "false");
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(FormFilter.class);
|
||||
|
||||
@@ -430,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));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -457,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;
|
||||
@@ -497,7 +501,9 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
|
||||
}
|
||||
if (SWITCH_OFFICE && User.USER_TYPE_EMPLOYEE.equals(user.getUserType())) {
|
||||
data.put("switchOffice", "true");
|
||||
data.put("officeCode", session.getAttribute("officeCode"));
|
||||
// 登录后指定当前部门,即当前部门权限,否则为混合权限
|
||||
data.put("officeCode", LOGIN_AFTER_ACTIVE_MAIN_OFFICE ? EmpUtils.getCurrentOfficeCode()
|
||||
: session.getAttribute("officeCode"));
|
||||
data.put("officeName", EmpUtils.getCurrentOfficeName());
|
||||
}
|
||||
data.put("desktopUrl", desktopUrl != null ? desktopUrl : Global.getConfig("sys.index.desktopUrl"));
|
||||
|
||||
@@ -71,6 +71,14 @@ public class BizCategory extends TreeEntity<BizCategory> {
|
||||
this.viewCode = viewCode;
|
||||
}
|
||||
|
||||
public String getViewCode_like() {
|
||||
return sqlMap().getWhere().getValue("view_code", QueryType.LIKE);
|
||||
}
|
||||
|
||||
public void setViewCode_like(String viewCode) {
|
||||
sqlMap().getWhere().and("view_code", QueryType.LIKE, viewCode);
|
||||
}
|
||||
|
||||
@NotBlank(message="分类名称不能为空")
|
||||
@Size(min=0, max=64, message="分类名称长度不能超过 64 个字符")
|
||||
public String getCategoryName() {
|
||||
|
||||
@@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -43,7 +44,10 @@ public class BizCategoryController extends BaseController {
|
||||
* 获取数据
|
||||
*/
|
||||
@ModelAttribute
|
||||
public BizCategory get(String categoryCode, boolean isNewRecord) {
|
||||
public BizCategory get(String categoryCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new BizCategory();
|
||||
}
|
||||
return bizCategoryService.get(categoryCode, isNewRecord);
|
||||
}
|
||||
|
||||
@@ -77,13 +81,11 @@ public class BizCategoryController extends BaseController {
|
||||
if (StringUtils.isBlank(bizCategory.getParentCode())) {
|
||||
bizCategory.setParentCode(BizCategory.ROOT_CODE);
|
||||
}
|
||||
if (StringUtils.isNotBlank(bizCategory.getViewCode())) {
|
||||
bizCategory.setParentCode(null);
|
||||
}
|
||||
if (StringUtils.isNotBlank(bizCategory.getCategoryName())){
|
||||
bizCategory.setParentCode(null);
|
||||
}
|
||||
if (StringUtils.isNotBlank(bizCategory.getRemarks())){
|
||||
if (StringUtils.isNotBlank(bizCategory.getCategoryCode())
|
||||
|| StringUtils.isNotBlank(bizCategory.getViewCode())
|
||||
|| StringUtils.isNotBlank(bizCategory.getViewCode_like())
|
||||
|| StringUtils.isNotBlank(bizCategory.getCategoryName())
|
||||
|| StringUtils.isNotBlank(bizCategory.getRemarks())){
|
||||
bizCategory.setParentCode(null);
|
||||
}
|
||||
List<BizCategory> list = bizCategoryService.findList(bizCategory);
|
||||
@@ -151,7 +153,7 @@ public class BizCategoryController extends BaseController {
|
||||
public String disable(BizCategory bizCategory) {
|
||||
BizCategory where = new BizCategory();
|
||||
where.setStatus(BizCategory.STATUS_NORMAL);
|
||||
where.setParentCodes("," + bizCategory.getId() + ",");
|
||||
where.setParentCodes_rightLike(bizCategory.getParentCodes() + bizCategory.getId() + ",");
|
||||
long count = bizCategoryService.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该业务分类包含未停用的子业务分类!"));
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
* No deletion without permission, or be held responsible to law.
|
||||
*/
|
||||
package com.jeesite.modules.config.server;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.Ordered;
|
||||
|
||||
/**
|
||||
* 将请求协议转换为 https
|
||||
* @author ThinkGem
|
||||
* @version 2020年1月21日
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnProperty(name="server.schemeHttps", havingValue="true", matchIfMissing=false)
|
||||
public class SchemeHttpsConfig {
|
||||
|
||||
@Bean
|
||||
public FilterRegistrationBean<Filter> schemeHttpsFilter() {
|
||||
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
|
||||
bean.setName("schemeHttpsFilter");
|
||||
bean.setFilter((request, response, chain) -> {
|
||||
chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
|
||||
@Override
|
||||
public String getScheme() {
|
||||
return "https";
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuffer getRequestURL() {
|
||||
StringBuffer sb = super.getRequestURL();
|
||||
if ("http:".equals(sb.substring(0, 5))){
|
||||
return sb.replace(0, 5, "https:");
|
||||
}else{
|
||||
return sb;
|
||||
}
|
||||
}
|
||||
}, response);
|
||||
});
|
||||
bean.addUrlPatterns("/*");
|
||||
return bean;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
* No deletion without permission, or be held responsible to law.
|
||||
*/
|
||||
package com.jeesite.modules.file.web;
|
||||
|
||||
import com.jeesite.common.config.Global;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.web.BaseController;
|
||||
import com.jeesite.modules.file.entity.FileUpload;
|
||||
import com.jeesite.modules.file.entity.FileUploadParams;
|
||||
import com.jeesite.modules.file.utils.FileUploadUtils;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Vditor Controller
|
||||
* @author ThinkGem
|
||||
* @version 2025-04-09
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping(value = "${adminPath}/file/vditor")
|
||||
@ConditionalOnProperty(name={"file.enabled","web.core.enabled"}, havingValue="true", matchIfMissing=true)
|
||||
public class VditorController extends BaseController {
|
||||
|
||||
@RequestMapping(value = "upload")
|
||||
@ResponseBody
|
||||
public Map<String, Object> upload(MultipartFile[] files, String md5s, String bizKey, String bizType, String updateType) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
if (files == null || files.length == 0 || StringUtils.isAnyBlank(md5s, bizKey, bizType)) {
|
||||
result.put("msg", text("上传的文件不能为空"));
|
||||
return result;
|
||||
}
|
||||
String[] fileMd5s = StringUtils.splitComma(md5s);
|
||||
if (fileMd5s.length != files.length) {
|
||||
result.put("msg", text("文件校验码与文件的长度不等"));
|
||||
return result;
|
||||
}
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
Map<String, String> succMap = new HashMap<>();
|
||||
Map<String, String> errFiles = new HashMap<>();
|
||||
for (int i = 0; i < files.length; i++) {
|
||||
MultipartFile file = files[i];
|
||||
FileUploadParams params = new FileUploadParams();
|
||||
params.setFileMd5(fileMd5s[i]);
|
||||
params.setFileName(file.getOriginalFilename());
|
||||
params.setBizKey(bizKey);
|
||||
params.setBizType(bizType);
|
||||
params.setUploadType(updateType);
|
||||
params.setFile(file);
|
||||
Map<String, Object> res = FileUploadUtils.saveFileUpload(params);
|
||||
if (Global.FALSE.equals(res.get("result"))) {
|
||||
errFiles.put(params.getFileName(), (String)res.get("message"));
|
||||
} else {
|
||||
FileUpload fileUpload = (FileUpload)res.get("fileUpload");
|
||||
succMap.put(params.getFileName(), Global.getCtxPath() + fileUpload.getFileUrl());
|
||||
}
|
||||
}
|
||||
if (!errFiles.isEmpty()) {
|
||||
result.put("code", 1);
|
||||
if (errFiles.size() == files.length) {
|
||||
result.put("msg", StringUtils.join(errFiles.values(), "; "));
|
||||
} else {
|
||||
result.put("msg", text("部分上传失败:") + StringUtils.join(errFiles.values(), "; "));
|
||||
}
|
||||
data.put("errFiles", errFiles.keySet());
|
||||
} else {
|
||||
result.put("msg", text("上传的文件成功"));
|
||||
data.put("succMap", succMap);
|
||||
}
|
||||
result.put("data", data);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -37,6 +37,11 @@ public interface EmpUserDao extends CrudDao<EmpUser> {
|
||||
* 根据部门编码查询用户,仅返回基本信息
|
||||
*/
|
||||
List<EmpUser> findUserListByOfficeCodes(EmpUser empUser);
|
||||
|
||||
/**
|
||||
* 根据公司编码查询用户,仅返回基本信息
|
||||
*/
|
||||
List<EmpUser> findUserListByCompanyCodes(EmpUser empUser);
|
||||
|
||||
/**
|
||||
* 根据角色编码查询用户,仅返回基本信息
|
||||
|
||||
@@ -338,6 +338,7 @@ public class InitCoreData extends BaseInitDataTests {
|
||||
job.setConcurrent(Global.NO);
|
||||
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
|
||||
job.setStatus(JobEntity.STATUS_PAUSED);
|
||||
job.setRemarks("实时推送和设定计划推送时间的定时推送消息。");
|
||||
jobDao.insert(job);
|
||||
job = new JobEntity(MsgLocalMergePushTask.class.getSimpleName(), "SYSTEM");
|
||||
job.setDescription("消息推送服务 (合并推送)");
|
||||
@@ -346,6 +347,19 @@ public class InitCoreData extends BaseInitDataTests {
|
||||
job.setConcurrent(Global.NO);
|
||||
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
|
||||
job.setStatus(JobEntity.STATUS_PAUSED);
|
||||
job.setRemarks("不重要的通知进行汇总,30分钟或更长执行一次,将多条消息合并为一条消息延迟推送给用户。");
|
||||
jobDao.insert(job);
|
||||
job = new JobEntity("DeleteLogBefore", "SYSTEM");
|
||||
job.setDescription("清理访问日志 (3个月前)");
|
||||
job.setInvokeTarget("logService.deleteLogBefore(0, 3, 0)");
|
||||
job.setCronExpression("0 0 0 1 1/1 ? *");
|
||||
job.setConcurrent(Global.NO);
|
||||
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
|
||||
job.setStatus(JobEntity.STATUS_PAUSED);
|
||||
job.setRemarks("1、清理1年前的所有日志:logService.deleteLogBefore(1, 0, 0)\n" +
|
||||
"2、清理6个月前的所有日志:logService.deleteLogBefore(0, 6, 0)\n" +
|
||||
"3、清理7天前的所有日志:logService.deleteLogBefore(0, 0, 7)\n" +
|
||||
"4、清理1年6个月前的所有日志:logService.deleteLogBefore(1, 6, 0)");
|
||||
jobDao.insert(job);
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
@@ -4,15 +4,15 @@
|
||||
*/
|
||||
package com.jeesite.modules.sys.entity;
|
||||
|
||||
import javax.validation.constraints.Size;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
import com.jeesite.common.entity.DataEntity;
|
||||
import com.jeesite.common.entity.TreeEntity;
|
||||
import com.jeesite.common.mybatis.annotation.Column;
|
||||
import com.jeesite.common.mybatis.annotation.Table;
|
||||
import com.jeesite.common.mybatis.mapper.query.QueryType;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Size;
|
||||
|
||||
/**
|
||||
* 行政区划Entity
|
||||
* @author ThinkGem
|
||||
@@ -59,6 +59,14 @@ public class Area extends TreeEntity<Area> {
|
||||
this.areaCode = areaCode;
|
||||
}
|
||||
|
||||
public String getAreaCode_like() {
|
||||
return sqlMap().getWhere().getValue("area_code", QueryType.LIKE);
|
||||
}
|
||||
|
||||
public void setAreaCode_like(String areaCode) {
|
||||
sqlMap().getWhere().and("area_code", QueryType.LIKE, areaCode);
|
||||
}
|
||||
|
||||
@NotBlank(message="名称不能为空")
|
||||
@Size(min=0, max=100, message="名称长度不能超过 100 个字符")
|
||||
public String getAreaName() {
|
||||
|
||||
@@ -45,7 +45,7 @@ import java.util.List;
|
||||
@Column(name="area_type", label="区域类型"),
|
||||
@Column(name="tree_names", label="区域全称"),
|
||||
}),
|
||||
}, extWhereKeys="dsf", orderBy="a.tree_sorts, a.company_code"
|
||||
}, orderBy="a.tree_sorts, a.company_code"
|
||||
)
|
||||
public class Company extends TreeEntity<Company> {
|
||||
|
||||
|
||||
@@ -81,9 +81,6 @@ import javax.validation.Valid;
|
||||
// @Column(name="user_name", attrName="createByName", label="用户名称", isQuery=false),
|
||||
// }),
|
||||
},
|
||||
// extFromKeys="dsfOfficeFrom, dsfCompanyFrom",
|
||||
// extWhereKeys="dsfOfficeWhere, dsfCompanyWhere",
|
||||
extWhereKeys="dsfOffice, dsfCompany",
|
||||
orderBy="a.user_weight DESC, a.update_date DESC"
|
||||
)
|
||||
public class EmpUser extends User {
|
||||
|
||||
@@ -42,7 +42,7 @@ import javax.validation.constraints.Size;
|
||||
@Column(name="zip_code", attrName="zipCode", label="邮政编码", queryType=QueryType.LIKE),
|
||||
@Column(name="email", attrName="email", label="邮箱", queryType=QueryType.LIKE),
|
||||
@Column(includeEntity=Extend.class, attrName="extend"),
|
||||
}, extWhereKeys="dsf", orderBy="a.tree_sorts, a.office_code"
|
||||
}, orderBy="a.tree_sorts, a.office_code"
|
||||
)
|
||||
public class Office extends TreeEntity<Office> {
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Office extends TreeEntity<Office> {
|
||||
@ExcelFields({
|
||||
@ExcelField(title="上级编码", attrName="parentCode", align=Align.LEFT, sort=10),
|
||||
@ExcelField(title="机构编码", attrName="officeCode", align=Align.LEFT, sort=20),
|
||||
@ExcelField(title="显示编码", attrName="viewCode", align = Align.LEFT, sort=30),
|
||||
@ExcelField(title="机构代码", attrName="viewCode", align = Align.LEFT, sort=30),
|
||||
@ExcelField(title="机构名称", attrName="officeName", align=Align.LEFT, sort=40),
|
||||
@ExcelField(title="机构全称", attrName="fullName", align=Align.LEFT, sort=50),
|
||||
@ExcelField(title="机构类型", attrName="officeType", align=Align.CENTER, sort=60, dictType="sys_office_type"),
|
||||
|
||||
@@ -47,6 +47,11 @@ public interface EmpUserService extends CrudServiceApi<EmpUser> {
|
||||
* 根据部门编码查询用户,仅返回基本信息
|
||||
*/
|
||||
List<EmpUser> findUserListByOfficeCodes(EmpUser empUser);
|
||||
|
||||
/**
|
||||
* 根据公司编码查询用户,仅返回基本信息
|
||||
*/
|
||||
List<EmpUser> findUserListByCompanyCodes(EmpUser empUser);
|
||||
|
||||
/**
|
||||
* 根据角色编码查询用户,仅返回基本信息
|
||||
|
||||
@@ -5,15 +5,19 @@
|
||||
package com.jeesite.modules.sys.service.support;
|
||||
|
||||
import com.jeesite.common.collect.ListUtils;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.service.TreeService;
|
||||
import com.jeesite.common.utils.PageUtils;
|
||||
import com.jeesite.modules.sys.dao.CompanyDao;
|
||||
import com.jeesite.modules.sys.dao.CompanyOfficeDao;
|
||||
import com.jeesite.modules.sys.entity.Company;
|
||||
import com.jeesite.modules.sys.entity.CompanyOffice;
|
||||
import com.jeesite.modules.sys.entity.EmpUser;
|
||||
import com.jeesite.modules.sys.service.CompanyService;
|
||||
import com.jeesite.modules.sys.service.DataScopeService;
|
||||
import com.jeesite.modules.sys.service.EmpUserService;
|
||||
import com.jeesite.modules.sys.utils.EmpUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import com.jeesite.modules.sys.utils.UserUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -29,9 +33,10 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
|
||||
|
||||
@Autowired
|
||||
private CompanyOfficeDao companyOfficeDao;
|
||||
|
||||
@Autowired
|
||||
private DataScopeService dataScopeService;
|
||||
@Autowired
|
||||
private EmpUserService empUserService;
|
||||
|
||||
/**
|
||||
* 获取单条数据
|
||||
@@ -86,7 +91,7 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
|
||||
companyOfficeDao.insertBatch(list, null);
|
||||
}
|
||||
// 清理公司相关缓存
|
||||
clearCompanyCache();
|
||||
clearCompanyCache(company);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -95,9 +100,10 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
|
||||
@Override
|
||||
@Transactional
|
||||
public void delete(Company company) {
|
||||
company.sqlMap().markIdDelete();
|
||||
super.delete(company);
|
||||
// 清理公司相关缓存
|
||||
clearCompanyCache();
|
||||
clearCompanyCache(company);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,15 +114,37 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
|
||||
public void updateStatus(Company company) {
|
||||
dao.updateStatus(company);
|
||||
// 清理公司相关缓存
|
||||
clearCompanyCache();
|
||||
clearCompanyCache(company);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理公司相关缓存
|
||||
*/
|
||||
private void clearCompanyCache(){
|
||||
// EmpUtils.removeCache(EmpUtils.CACHE_COMPANY_LIST);
|
||||
private void clearCompanyCache(Company company){
|
||||
EmpUtils.removeCache(EmpUtils.CACHE_COMPANY_ALL_LIST);
|
||||
// 清理公司下的用户缓存,包含子公司
|
||||
if (company == null || StringUtils.isBlank(company.getCompanyCode())){
|
||||
return;
|
||||
}
|
||||
if (StringUtils.isBlank(company.getParentCode())){
|
||||
company = get(company);
|
||||
if (company == null){
|
||||
return;
|
||||
}
|
||||
}
|
||||
Company where = new Company();
|
||||
where.setStatus(Company.STATUS_NORMAL);
|
||||
where.setParentCodes(company.getParentCodes() + company.getCompanyCode() + ",%");
|
||||
EmpUser empUserWhere = new EmpUser();
|
||||
empUserWhere.setCodes(this.findByParentCodesLike(where).stream().map(Company::getCompanyCode).toArray(String[]::new));
|
||||
if (empUserWhere.getCodes().length == 0) {
|
||||
return;
|
||||
}
|
||||
PageUtils.findList(empUserWhere, null, e -> {
|
||||
List<EmpUser> empUserList = empUserService.findUserListByCompanyCodes((EmpUser)e);
|
||||
empUserList.forEach(UserUtils::clearCache);
|
||||
return !empUserList.isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -115,6 +115,13 @@ public class EmpUserServiceSupport extends CrudService<EmpUserDao, EmpUser>
|
||||
public List<EmpUser> findUserListByOfficeCodes(EmpUser empUser){
|
||||
return dao.findUserListByOfficeCodes(empUser);
|
||||
}
|
||||
/**
|
||||
* 根据公司编码查询用户,仅返回基本信息
|
||||
*/
|
||||
@Override
|
||||
public List<EmpUser> findUserListByCompanyCodes(EmpUser empUser){
|
||||
return dao.findUserListByCompanyCodes(empUser);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色编码查询用户,仅返回基本信息
|
||||
|
||||
@@ -5,15 +5,20 @@
|
||||
package com.jeesite.modules.sys.service.support;
|
||||
|
||||
import com.jeesite.common.config.Global;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.service.ServiceException;
|
||||
import com.jeesite.common.service.TreeService;
|
||||
import com.jeesite.common.utils.PageUtils;
|
||||
import com.jeesite.common.utils.excel.ExcelImport;
|
||||
import com.jeesite.common.validator.ValidatorUtils;
|
||||
import com.jeesite.modules.sys.dao.OfficeDao;
|
||||
import com.jeesite.modules.sys.entity.EmpUser;
|
||||
import com.jeesite.modules.sys.entity.Office;
|
||||
import com.jeesite.modules.sys.service.DataScopeService;
|
||||
import com.jeesite.modules.sys.service.EmpUserService;
|
||||
import com.jeesite.modules.sys.service.OfficeService;
|
||||
import com.jeesite.modules.sys.utils.EmpUtils;
|
||||
import com.jeesite.modules.sys.utils.UserUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@@ -32,6 +37,8 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
|
||||
|
||||
@Autowired
|
||||
private DataScopeService dataScopeService;
|
||||
@Autowired
|
||||
private EmpUserService empUserService;
|
||||
|
||||
/**
|
||||
* 获取单条数据
|
||||
@@ -74,7 +81,7 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
|
||||
}
|
||||
super.save(office);
|
||||
// 清理部门相关缓存
|
||||
clearOfficeCache();
|
||||
clearOfficeCache(office);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -149,7 +156,7 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
|
||||
public void updateStatus(Office office) {
|
||||
super.updateStatus(office);
|
||||
// 清理部门相关缓存
|
||||
clearOfficeCache();
|
||||
clearOfficeCache(office);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -161,15 +168,37 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
|
||||
office.sqlMap().markIdDelete();
|
||||
super.delete(office);
|
||||
// 清理部门相关缓存
|
||||
clearOfficeCache();
|
||||
clearOfficeCache(office);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理部门相关缓存
|
||||
*/
|
||||
private void clearOfficeCache(){
|
||||
// EmpUtils.removeCache(EmpUtils.CACHE_OFFICE_LIST);
|
||||
private void clearOfficeCache(Office office){
|
||||
EmpUtils.removeCache(EmpUtils.CACHE_OFFICE_ALL_LIST);
|
||||
// 清理组织下的用户缓存,包含子机构
|
||||
if (office == null || StringUtils.isBlank(office.getOfficeCode())){
|
||||
return;
|
||||
}
|
||||
if (StringUtils.isBlank(office.getParentCode())){
|
||||
office = get(office);
|
||||
if (office == null){
|
||||
return;
|
||||
}
|
||||
}
|
||||
Office where = new Office();
|
||||
where.setStatus(Office.STATUS_NORMAL);
|
||||
where.setParentCodes(office.getParentCodes() + office.getOfficeCode() + ",%");
|
||||
EmpUser empUserWhere = new EmpUser();
|
||||
empUserWhere.setCodes(this.findByParentCodesLike(where).stream().map(Office::getOfficeCode).toArray(String[]::new));
|
||||
if (empUserWhere.getCodes().length == 0) {
|
||||
return;
|
||||
}
|
||||
PageUtils.findList(empUserWhere, null, e -> {
|
||||
List<EmpUser> empUserList = empUserService.findUserListByOfficeCodes((EmpUser)e);
|
||||
empUserList.forEach(UserUtils::clearCache);
|
||||
return !empUserList.isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
package com.jeesite.modules.sys.web;
|
||||
|
||||
import com.jeesite.common.codec.DesUtils;
|
||||
import com.jeesite.common.codec.EncodeUtils;
|
||||
import com.jeesite.common.collect.ListUtils;
|
||||
import com.jeesite.common.collect.MapUtils;
|
||||
import com.jeesite.common.config.Global;
|
||||
@@ -20,10 +21,7 @@ import com.jeesite.modules.sys.service.UserService;
|
||||
import com.jeesite.modules.sys.utils.PwdUtils;
|
||||
import com.jeesite.modules.sys.utils.UserUtils;
|
||||
import com.jeesite.modules.sys.utils.ValidCodeUtils;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.*;
|
||||
import org.apache.shiro.authc.AuthenticationException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
@@ -69,9 +67,10 @@ public class AccountController extends BaseController{
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "mobile", value = "登录手机号", required = true, paramType="query", type="String"),
|
||||
@ApiImplicitParam(name = "validCode", value = "图片验证码,防止重复机器人", required = true),
|
||||
@ApiImplicitParam(name = "corpCode", value = "所属租户"),
|
||||
})
|
||||
public String getLoginValidCode(String mobile, String validCode, HttpServletRequest request) {
|
||||
return getValidCode("login", mobile, validCode, "mobile", request, "登录验证码");
|
||||
public String getLoginValidCode(String mobile, String validCode, String corpCode, HttpServletRequest request) {
|
||||
return getValidCode("login", mobile, validCode, "mobile", corpCode, request, "登录验证码");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -139,9 +138,10 @@ public class AccountController extends BaseController{
|
||||
@ApiImplicitParam(name = "loginCode", value = "登录账号", required = true, paramType="query", type="String"),
|
||||
@ApiImplicitParam(name = "validCode", value = "图片验证码,防止重复机器人", required = true),
|
||||
@ApiImplicitParam(name = "validType", value = "验证方式(mobile、email)", required = true),
|
||||
@ApiImplicitParam(name = "corpCode", value = "所属租户"),
|
||||
})
|
||||
public String getFpValidCode(User user, String validCode, String validType, HttpServletRequest request) {
|
||||
return getValidCode("fp", user.getLoginCode(), validCode, validType, request, "找回密码");
|
||||
public String getFpValidCode(User user, String validCode, String validType, String corpCode, HttpServletRequest request) {
|
||||
return getValidCode("fp", user.getLoginCode(), validCode, validType, corpCode, request, "找回密码");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,7 +180,7 @@ public class AccountController extends BaseController{
|
||||
* 获取验证码
|
||||
* @author ThinkGem
|
||||
*/
|
||||
private String getValidCode(String type, String loginCode, String validCode, String validType, HttpServletRequest request, String msgTitle) {
|
||||
private String getValidCode(String type, String loginCode, String validCode, String validType, String corpCode, HttpServletRequest request, String msgTitle) {
|
||||
// 校验图片验证码,防止重复机器人。
|
||||
if (!ValidCodeUtils.validate(request, validCode)){
|
||||
return renderResult(Global.FALSE, text("图片验证码不正确或已失效,请点击图片刷新!"));
|
||||
@@ -193,6 +193,7 @@ public class AccountController extends BaseController{
|
||||
if ("login".equals(type)){
|
||||
User where = new User();
|
||||
where.setMobile(loginCode);
|
||||
where.setCorpCode_(corpCode);
|
||||
where.setStatus(User.STATUS_NORMAL);
|
||||
List<User> userList = userService.findListByMobile(where);
|
||||
if (!userList.isEmpty()){
|
||||
@@ -212,7 +213,7 @@ public class AccountController extends BaseController{
|
||||
return renderResult(Global.FALSE, text("手机号不正确!"));
|
||||
}
|
||||
} else {
|
||||
u = UserUtils.getByLoginCode(loginCode);
|
||||
u = UserUtils.getByLoginCode(loginCode, corpCode);
|
||||
if(u == null){
|
||||
return renderResult(Global.FALSE, text("登录账号不正确!"));
|
||||
}
|
||||
@@ -287,14 +288,15 @@ public class AccountController extends BaseController{
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "loginCode", value = "登录账号", required = true, paramType="query", type="String"),
|
||||
@ApiImplicitParam(name = "validCode", value = "图片验证码,防止重复机器人", required = true),
|
||||
@ApiImplicitParam(name = "corpCode", value = "所属租户"),
|
||||
})
|
||||
public String getPwdQuestion(String loginCode, String validCode, HttpServletRequest request) {
|
||||
public String getPwdQuestion(String loginCode, String validCode, String corpCode, HttpServletRequest request) {
|
||||
// 校验图片验证码,防止重复机器人。
|
||||
if (!ValidCodeUtils.validate(request, validCode)){
|
||||
return renderResult(Global.FALSE, text("图片验证码不正确或已失效,请点击图片刷新!"));
|
||||
}
|
||||
// 账号是否存在验证
|
||||
User u = UserUtils.getByLoginCode(loginCode);
|
||||
User u = UserUtils.getByLoginCode(loginCode, corpCode);
|
||||
if (u == null){
|
||||
return renderResult(Global.FALSE, text("登录账号不正确!"));
|
||||
}
|
||||
@@ -340,7 +342,7 @@ public class AccountController extends BaseController{
|
||||
public String savePwdByPwdQuestion(User user, HttpServletRequest request) {
|
||||
String userCode = UserUtils.getCache("fpUserCode");
|
||||
String loginCode = UserUtils.getCache("fpLoginCode");
|
||||
|
||||
|
||||
// 一同验证保存的用户名和验证码是否正确(如果只校验验证码,不验证用户名,则会有获取验证码后修改用户名的漏洞)
|
||||
if (!(userCode != null && loginCode != null && loginCode.equals(user.getLoginCode()))){
|
||||
return renderResult(Global.FALSE, text("请重新获取保密问题!"));
|
||||
@@ -355,7 +357,7 @@ public class AccountController extends BaseController{
|
||||
}
|
||||
|
||||
// 验证三个密保问题是否正确。
|
||||
User u = UserUtils.getByLoginCode(user.getLoginCode());
|
||||
User u = UserUtils.get(userCode);
|
||||
if (!(u != null && loginCode.equals(user.getLoginCode())
|
||||
&& PwdUtils.validatePassword(user.getPwdQuestionAnswer(), u.getPwdQuestionAnswer())
|
||||
&& PwdUtils.validatePassword(user.getPwdQuestionAnswer2(), u.getPwdQuestionAnswer2())
|
||||
@@ -548,39 +550,39 @@ public class AccountController extends BaseController{
|
||||
* 发送邮件验证码
|
||||
*/
|
||||
private String sendEmailValidCode(User user, String code, String title, Map<String, Object> data){
|
||||
String account = user.getEmail();
|
||||
String email = user.getEmail();
|
||||
try {
|
||||
title = text("{0}({1}){2}验证码", user.getUserName(), user.getLoginCode(), title);
|
||||
String content = text("尊敬的用户,您好!\n\n您的验证码是:{0}(请勿透露给其他人)\n\n"
|
||||
+ "请复制后,填写在你的验证码窗口完成验证。\n\n本邮件由系统自动发出,请勿回复。\n\n感谢您的使用!", code);
|
||||
// String receiveUserCode = "[CODE]"+account;
|
||||
// String receiveUserCode = "[CODE]"+email;
|
||||
// MsgPushUtils.push(MsgPush.TYPE_EMAIL, title, content, null, null, receiveUserCode);
|
||||
EmailUtils.send(account, title, content);
|
||||
EmailUtils.send(email, title, content);
|
||||
} catch (Exception e) {
|
||||
logger.error(title + "发送邮件错误。", e);
|
||||
return renderResult(Global.FALSE, text("系统出现了点问题,错误信息:{0}", e.getMessage()));
|
||||
}
|
||||
account = account.replaceAll("([\\w\\W]?)([\\w\\W]+)([\\w\\W])(@[\\w\\W]+)", "$1****$3$4");
|
||||
return renderResult(Global.TRUE, text("验证码已发送到“{0}”邮箱账号,请尽快查收!", account), data);
|
||||
email = EncodeUtils.emailMask(email);
|
||||
return renderResult(Global.TRUE, text("验证码已发送到“{0}”邮箱账号,请尽快查收!", email), data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送短信验证码
|
||||
*/
|
||||
private String sendSmsValidCode(User user, String code, String title, Map<String, Object> data){
|
||||
String account = user.getMobile();
|
||||
String mobile = user.getMobile();
|
||||
try {
|
||||
title = text("{0}({1}){2}验证码", user.getUserName(), user.getLoginCode(), title);
|
||||
String content = text("您好,您的验证码是:{0}(请勿透露给其他人)感谢您的使用。", code);
|
||||
// String receiveUserCode = "[CODE]"+account;
|
||||
// String receiveUserCode = "[CODE]"+mobile;
|
||||
// MsgPushUtils.push(MsgPush.TYPE_SMS, title, content, null, null, receiveUserCode);
|
||||
SmsUtils.send(content, account);
|
||||
SmsUtils.send(content, mobile);
|
||||
} catch (Exception e) {
|
||||
logger.error(title + "发送短信错误。", e);
|
||||
return renderResult(Global.FALSE, text("系统出现了点问题,错误信息:{0}", e.getMessage()));
|
||||
}
|
||||
account = account.replaceAll("(\\d{3})(\\d+)(\\d{3})","$1****$3");
|
||||
return renderResult(Global.TRUE, text("验证码已发送到“{0}”的手机号码,请尽快查收!", account), data);
|
||||
mobile = EncodeUtils.mobileMask(mobile);
|
||||
return renderResult(Global.TRUE, text("验证码已发送到“{0}”的手机号码,请尽快查收!", mobile), data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -49,7 +49,10 @@ public class AreaController extends BaseController {
|
||||
* 获取区域
|
||||
*/
|
||||
@ModelAttribute
|
||||
public Area get(String areaCode, boolean isNewRecord) {
|
||||
public Area get(String areaCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWithAny(request.getRequestURI(), "listData", "listPageData")) {
|
||||
return new Area();
|
||||
}
|
||||
return areaService.get(areaCode, isNewRecord);
|
||||
}
|
||||
|
||||
@@ -173,7 +176,7 @@ public class AreaController extends BaseController {
|
||||
public String disable(Area area) {
|
||||
Area where = new Area();
|
||||
where.setStatus(Area.STATUS_NORMAL);
|
||||
where.setParentCodes("," + area.getId() + ",");
|
||||
where.setParentCodes_rightLike(area.getParentCodes() + area.getId() + ",");
|
||||
long count = areaService.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该区域包含未停用的子区域!"));
|
||||
|
||||
@@ -11,8 +11,10 @@ import com.jeesite.common.idgen.IdGen;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.web.BaseController;
|
||||
import com.jeesite.modules.sys.entity.Company;
|
||||
import com.jeesite.modules.sys.entity.EmpUser;
|
||||
import com.jeesite.modules.sys.entity.Office;
|
||||
import com.jeesite.modules.sys.service.CompanyService;
|
||||
import com.jeesite.modules.sys.service.EmpUserService;
|
||||
import com.jeesite.modules.sys.service.OfficeService;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
@@ -43,15 +45,19 @@ public class CompanyController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private CompanyService companyService;
|
||||
|
||||
@Autowired
|
||||
private OfficeService officeService;
|
||||
@Autowired
|
||||
private EmpUserService empUserService;
|
||||
|
||||
/**
|
||||
* 获取公司
|
||||
*/
|
||||
@ModelAttribute
|
||||
public Company get(String companyCode, boolean isNewRecord) {
|
||||
public Company get(String companyCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new Company();
|
||||
}
|
||||
return companyService.get(companyCode, isNewRecord);
|
||||
}
|
||||
|
||||
@@ -89,7 +95,9 @@ public class CompanyController extends BaseController {
|
||||
if (StringUtils.isBlank(company.getParentCode())) {
|
||||
company.setParentCode(Company.ROOT_CODE);
|
||||
}
|
||||
if (StringUtils.isNotBlank(company.getViewCode())
|
||||
if (StringUtils.isNotBlank(company.getCompanyCode())
|
||||
|| StringUtils.isNotBlank(company.getViewCode())
|
||||
|| StringUtils.isNotBlank(company.getViewCode_like())
|
||||
|| StringUtils.isNotBlank(company.getCompanyName())
|
||||
|| StringUtils.isNotBlank(company.getFullName())){
|
||||
company.setParentCode(null);
|
||||
@@ -177,7 +185,7 @@ public class CompanyController extends BaseController {
|
||||
public String disable(Company company) {
|
||||
Company where = new Company();
|
||||
where.setStatus(Company.STATUS_NORMAL);
|
||||
where.setParentCodes("," + company.getId() + ",");
|
||||
where.setParentCodes_rightLike(company.getParentCodes() + company.getId() + ",");
|
||||
long count = companyService.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该公司包含未停用的子公司!"));
|
||||
@@ -208,6 +216,14 @@ public class CompanyController extends BaseController {
|
||||
@RequestMapping(value = "delete")
|
||||
@ResponseBody
|
||||
public String delete(Company company) {
|
||||
if (Global.getConfigToBoolean("sys.company.notAllowDeleteIfUserExists", "false")) {
|
||||
EmpUser empUserWhere = new EmpUser();
|
||||
empUserWhere.getEmployee().getCompany().setIsQueryChildren(true);
|
||||
empUserWhere.getEmployee().getCompany().setCompanyCode(company.getCompanyCode());
|
||||
if (empUserService.findCount(empUserWhere) > 0) {
|
||||
return renderResult(Global.FALSE, text("不允许删除包含用户的公司"));
|
||||
}
|
||||
}
|
||||
companyService.delete(company);
|
||||
return renderResult(Global.TRUE, text("删除公司''{0}''成功", company.getCompanyName()));
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* 字典管理Controller
|
||||
* @author ThinkGem
|
||||
@@ -51,7 +52,10 @@ public class DictDataController extends BaseController {
|
||||
* 获取数据
|
||||
*/
|
||||
@ModelAttribute
|
||||
public DictData get(String dictCode, boolean isNewRecord) {
|
||||
public DictData get(String dictCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new DictData();
|
||||
}
|
||||
return dictDataService.get(dictCode, isNewRecord);
|
||||
}
|
||||
|
||||
@@ -185,7 +189,7 @@ public class DictDataController extends BaseController {
|
||||
}
|
||||
// DictData where = new DictData();
|
||||
// where.setStatus(DictData.STATUS_NORMAL);
|
||||
// where.setParentCodes("," + dictData.getId() + ",");
|
||||
// where.setParentCodes_rightLike(dictData.getParentCodes() + dictData.getId() + ",");
|
||||
// long count = dictDataService.findCount(where);
|
||||
// if (count > 0) {
|
||||
// return renderResult(Global.FALSE, text("该字典包含未停用的子字典!"));
|
||||
|
||||
@@ -48,7 +48,10 @@ public class MenuController extends BaseController {
|
||||
private ModuleService moduleService;
|
||||
|
||||
@ModelAttribute
|
||||
public Menu get(String menuCode, boolean isNewRecord) {
|
||||
public Menu get(String menuCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new Menu();
|
||||
}
|
||||
return menuService.get(menuCode, isNewRecord);
|
||||
}
|
||||
|
||||
@@ -79,13 +82,10 @@ public class MenuController extends BaseController {
|
||||
if (StringUtils.isBlank(menu.getParentCode())) {
|
||||
menu.setParentCode(Menu.ROOT_CODE);
|
||||
}
|
||||
if (StringUtils.isNotBlank(menu.getMenuNameRaw())){
|
||||
menu.setParentCode(null);
|
||||
}
|
||||
if (StringUtils.isNotBlank(menu.getMenuHref())){
|
||||
menu.setParentCode(null);
|
||||
}
|
||||
if (StringUtils.isNotBlank(menu.getPermission())){
|
||||
if (StringUtils.isNotBlank(menu.getMenuCode())
|
||||
|| StringUtils.isNotBlank(menu.getMenuNameRaw())
|
||||
|| StringUtils.isNotBlank(menu.getMenuHref())
|
||||
|| StringUtils.isNotBlank(menu.getPermission())){
|
||||
menu.setParentCode(null);
|
||||
}
|
||||
List<Menu> list = menuService.findList(menu);
|
||||
|
||||
@@ -13,7 +13,9 @@ import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.utils.excel.ExcelExport;
|
||||
import com.jeesite.common.utils.excel.annotation.ExcelField.Type;
|
||||
import com.jeesite.common.web.BaseController;
|
||||
import com.jeesite.modules.sys.entity.EmpUser;
|
||||
import com.jeesite.modules.sys.entity.Office;
|
||||
import com.jeesite.modules.sys.service.EmpUserService;
|
||||
import com.jeesite.modules.sys.service.OfficeService;
|
||||
import com.jeesite.modules.sys.web.user.EmpUserController;
|
||||
import io.swagger.annotations.Api;
|
||||
@@ -29,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -46,7 +49,8 @@ public class OfficeController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private OfficeService officeService;
|
||||
|
||||
@Autowired
|
||||
private EmpUserService empUserService;
|
||||
@Autowired
|
||||
private EmpUserController empUserController;
|
||||
|
||||
@@ -54,7 +58,10 @@ public class OfficeController extends BaseController {
|
||||
* 获取机构
|
||||
*/
|
||||
@ModelAttribute
|
||||
public Office get(String officeCode, boolean isNewRecord) {
|
||||
public Office get(String officeCode, boolean isNewRecord, HttpServletRequest request) {
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new Office();
|
||||
}
|
||||
return officeService.get(officeCode, isNewRecord);
|
||||
}
|
||||
|
||||
@@ -92,9 +99,13 @@ public class OfficeController extends BaseController {
|
||||
if (StringUtils.isBlank(office.getParentCode())){
|
||||
office.setParentCode(Office.ROOT_CODE);
|
||||
}
|
||||
if (StringUtils.isNotBlank(office.getViewCode())
|
||||
if (StringUtils.isNotBlank(office.getOfficeCode())
|
||||
|| StringUtils.isNotBlank(office.getViewCode())
|
||||
|| StringUtils.isNotBlank(office.getViewCode_like())
|
||||
|| StringUtils.isNotBlank(office.getOfficeName())
|
||||
|| StringUtils.isNotBlank(office.getFullName())){
|
||||
|| StringUtils.isNotBlank(office.getFullName())
|
||||
|| StringUtils.isNotBlank(office.getLeader())
|
||||
|| StringUtils.isNotBlank(office.getPhone())){
|
||||
office.setParentCode(null);
|
||||
}
|
||||
officeService.addDataScopeFilter(office, ctrlPermi);
|
||||
@@ -229,7 +240,7 @@ public class OfficeController extends BaseController {
|
||||
public String disable(Office office) {
|
||||
Office where = new Office();
|
||||
where.setStatus(Office.STATUS_NORMAL);
|
||||
where.setParentCodes("," + office.getId() + ",");
|
||||
where.setParentCodes_rightLike(office.getParentCodes() + office.getId() + ",");
|
||||
long count = officeService.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该机构包含未停用的子机构!"));
|
||||
@@ -260,6 +271,14 @@ public class OfficeController extends BaseController {
|
||||
@RequestMapping(value = "delete")
|
||||
@ResponseBody
|
||||
public String delete(Office office) {
|
||||
if (Global.getConfigToBoolean("sys.office.notAllowDeleteIfUserExists", "false")) {
|
||||
EmpUser empUserWhere = new EmpUser();
|
||||
empUserWhere.getEmployee().getOffice().setIsQueryChildren(true);
|
||||
empUserWhere.getEmployee().getOffice().setOfficeCode(office.getOfficeCode());
|
||||
if (empUserService.findCount(empUserWhere) > 0) {
|
||||
return renderResult(Global.FALSE, text("不允许删除包含用户的机构"));
|
||||
}
|
||||
}
|
||||
officeService.delete(office);
|
||||
return renderResult(Global.TRUE, text("删除机构''{0}''成功", office.getOfficeName()));
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -69,8 +69,15 @@ public class EmpUserController extends BaseController {
|
||||
private RoleService roleService;
|
||||
|
||||
@ModelAttribute
|
||||
public EmpUser get(String userCode, boolean isNewRecord) {
|
||||
return empUserService.get(userCode, isNewRecord);
|
||||
public EmpUser get(String userCode, boolean isNewRecord, Boolean isAll, String ctrlPermi) {
|
||||
EmpUser empUser = new EmpUser();
|
||||
empUser.setUserCode(userCode);
|
||||
empUser.setIsNewRecord(isNewRecord);
|
||||
// 更严格的权限控制,对单条数据进行数据权限过滤(isAll 是一个开关,正常不需要添加)
|
||||
if (StringUtils.isNotBlank(userCode) && !(isAll != null && isAll) || Global.isStrictMode()) {
|
||||
empUserService.addDataScopeFilter(empUser, ctrlPermi);
|
||||
}
|
||||
return empUserService.getAndValid(empUser);
|
||||
}
|
||||
|
||||
@RequiresPermissions("sys:empUser:view")
|
||||
@@ -107,6 +114,12 @@ public class EmpUserController extends BaseController {
|
||||
empUserService.addDataScopeFilter(empUser, ctrlPermi);
|
||||
}
|
||||
empUser.setPage(new Page<>(request, response));
|
||||
// // 定义字段权限属性名(可根据权限配置库查询出来)排除和包含同时存在时,排除优先级高于包含
|
||||
// Set<String> attrNames = SetUtils.newHashSet("userCode", "employee.office.officeCode");
|
||||
// // 查询 SQL 结果集中,不包含 userCode、employee.office.officeCode 值返回
|
||||
// empUser.sqlMap().getColumn().setExcludeAttrNames(attrNames);
|
||||
// // 查询 SQL 结果集中,仅包含 userCode、employee.office.officeCode 值返回
|
||||
// empUser.sqlMap().getColumn().setIncludeAttrNames(attrNames);
|
||||
Page<EmpUser> page = empUserService.findPage(empUser);
|
||||
return page;
|
||||
}
|
||||
@@ -152,8 +165,9 @@ public class EmpUserController extends BaseController {
|
||||
model.addAttribute("op", op);
|
||||
model.addAttribute("empUser", empUser);
|
||||
|
||||
// 获取控制权限类型
|
||||
// 获取控制权限类型、岗位角色权限参数
|
||||
model.addAttribute("ctrlPermi", Global.getConfig("user.adminCtrlPermi", "2"));
|
||||
model.addAttribute("postRolePermi", Global.getConfigToBoolean("user.postRolePermi", "false"));
|
||||
return "modules/sys/user/empUserForm";
|
||||
}
|
||||
|
||||
@@ -178,7 +192,11 @@ public class EmpUserController extends BaseController {
|
||||
if (StringUtils.inString(op, Global.OP_ADD, Global.OP_EDIT) && subject.isPermitted("sys:empUser:edit")){
|
||||
empUserService.save(empUser);
|
||||
}
|
||||
if (StringUtils.inString(op, Global.OP_ADD, Global.OP_AUTH) && subject.isPermitted("sys:empUser:authRole")){
|
||||
if (Global.getConfigToBoolean("user.postRolePermi", "false")) {
|
||||
if (StringUtils.inString(op, Global.OP_AUTH)) {
|
||||
return renderResult(Global.FALSE, text("启用岗位角色权限后,请在用户关联岗位中关联角色", empUser.getUserName()));
|
||||
}
|
||||
}else if (StringUtils.inString(op, Global.OP_ADD, Global.OP_AUTH) && subject.isPermitted("sys:empUser:authRole")){
|
||||
userService.saveAuth(empUser);
|
||||
}
|
||||
return renderResult(Global.TRUE, text("保存用户''{0}''成功", empUser.getUserName()));
|
||||
|
||||
@@ -4,18 +4,6 @@
|
||||
*/
|
||||
package com.jeesite.modules.sys.web.user;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import com.alibaba.fastjson.JSONValidator;
|
||||
import com.jeesite.common.codec.DesUtils;
|
||||
import com.jeesite.common.codec.EncodeUtils;
|
||||
@@ -28,9 +16,20 @@ import com.jeesite.modules.sys.entity.User;
|
||||
import com.jeesite.modules.sys.service.UserService;
|
||||
import com.jeesite.modules.sys.utils.PwdUtils;
|
||||
import com.jeesite.modules.sys.utils.UserUtils;
|
||||
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import springfox.documentation.annotations.ApiIgnore;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
|
||||
/**
|
||||
* 用户Controller
|
||||
* @author ThinkGem
|
||||
@@ -78,12 +77,18 @@ public class UserController extends BaseController {
|
||||
*/
|
||||
@RequiresPermissions("user")
|
||||
@RequestMapping(value = "info")
|
||||
public String info(User user, String op, Model model) {
|
||||
public String info(String op, Model model) {
|
||||
if (StringUtils.isBlank(op)){
|
||||
op = "base";
|
||||
}
|
||||
User u = UserUtils.getUser();
|
||||
model.addAttribute("op", op);
|
||||
model.addAttribute("user", UserUtils.getUser());
|
||||
model.addAttribute("user", u);
|
||||
if (StringUtils.equals(op, "pqa")){
|
||||
model.addAttribute("pwdQuestion", u.getPwdQuestion());
|
||||
model.addAttribute("pwdQuestion2", u.getPwdQuestion2());
|
||||
model.addAttribute("pwdQuestion3", u.getPwdQuestion3());
|
||||
}
|
||||
return "modules/sys/user/userInfo";
|
||||
}
|
||||
|
||||
@@ -93,7 +98,7 @@ public class UserController extends BaseController {
|
||||
@RequiresPermissions("user")
|
||||
@PostMapping(value = "infoSaveBase")
|
||||
@ResponseBody
|
||||
public String infoSaveBase(User user, HttpServletRequest request) {
|
||||
public String infoSaveBase(User user) {
|
||||
if (StringUtils.isBlank(user.getUserName())){
|
||||
return renderResult(Global.FALSE, text("sys.user.userNameNotBlank"));
|
||||
}
|
||||
@@ -116,8 +121,7 @@ public class UserController extends BaseController {
|
||||
@RequiresPermissions("user")
|
||||
@PostMapping(value = "infoSavePwd")
|
||||
@ResponseBody
|
||||
public String infoSavePwd(User user, String oldPassword, String newPassword,
|
||||
String confirmNewPassword) {
|
||||
public String infoSavePwd(String oldPassword, String newPassword, String confirmNewPassword) {
|
||||
User currentUser = UserUtils.getUser();
|
||||
// 登录密码解密(解决密码明文传输安全问题)
|
||||
String secretKey = Global.getProperty("shiro.loginSubmit.secretKey");
|
||||
|
||||
12
modules/core/src/main/resources/application-assistant.yml
Normal file
12
modules/core/src/main/resources/application-assistant.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
## 重要提示(Tip):
|
||||
|
||||
## 请勿在该配置文件中添加其它任何配置(添加也不会生效)。
|
||||
## 该文件,仅仅是为了让 jeesite-core.yml 文件,
|
||||
## 在 IDEA 中有一个自动完成及帮助提示,并无其它用意。
|
||||
## 参数配置请在 jeesite-core.yml 文件中添加。
|
||||
|
||||
spring:
|
||||
config:
|
||||
import:
|
||||
- classpath:config/jeesite-core.yml
|
||||
@@ -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:
|
||||
@@ -197,6 +203,9 @@ user:
|
||||
|
||||
# 是否启用切换部门功能,再开启启用岗位角色后可支持 用户->附属部门->岗位->关联角色,纳入菜单和权限管理 v5.10.1
|
||||
switchOffice: false
|
||||
|
||||
# 登录后激活当前用户所在的主部门,默认为不激活即混合权限
|
||||
loginAfterActiveMainOffice: false
|
||||
|
||||
# 多租户模式(SAAS模式)(专业版)
|
||||
useCorpModel: false
|
||||
@@ -626,6 +635,7 @@ j2cache:
|
||||
# active -> 主动清除,二级缓存过期主动通知各节点清除,优点在于所有节点可以同时收到缓存清除,存储模式需要设置为 generic
|
||||
# blend -> 两种模式一起运作,对于各个节点缓存准确以及及时性要求高的可以使用,正常用前两种模式中一个就可
|
||||
cache_clean_mode: passive
|
||||
|
||||
# Web 相关
|
||||
web:
|
||||
|
||||
@@ -712,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
|
||||
@@ -752,9 +758,9 @@ file:
|
||||
maxFileSize: '500*1024*1024'
|
||||
|
||||
# 设置允许上传的文件后缀(全局设置)
|
||||
imageAllowSuffixes: .gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,webp,
|
||||
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,
|
||||
@@ -802,10 +808,6 @@ video:
|
||||
# 将mp4视频的元数据信息转到视频第一帧
|
||||
qtFaststartFile: d:/tools/video/qt-faststart/qt-faststart.exe
|
||||
|
||||
# 文件管理是否启用租户模式
|
||||
filemanager:
|
||||
useCorpModel: false
|
||||
|
||||
#======================================#
|
||||
#========== Message settings ==========#
|
||||
#======================================#
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
<logger name="org.springframework.boot.web.embedded" level="INFO" />
|
||||
<logger name="org.apache.catalina.core.StandardEngine" level="INFO" />
|
||||
<logger name="net.oschina.j2cache.caffeine.CaffeineProvider" level="ERROR" />
|
||||
<logger name="ShardingSphere-SQL" level="DEBUG" />
|
||||
<!-- <logger name="org.apache.ibatis" level="DEBUG" /> -->
|
||||
<!-- <logger name="org.mybatis.spring" level="DEBUG" /> -->
|
||||
|
||||
@@ -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
|
||||
@@ -317,6 +318,8 @@
|
||||
|
||||
# =========== 公司管理 ===========
|
||||
|
||||
公司架构=Company
|
||||
|
||||
新增公司=New company
|
||||
编辑公司=Edit company
|
||||
|
||||
@@ -545,6 +548,7 @@
|
||||
主类全名=Main class name
|
||||
模块描述=Module description
|
||||
当前版本=Current version
|
||||
升级信息=Upgrade info
|
||||
版本=version
|
||||
未知=Unknown
|
||||
未安装=Uninstalled
|
||||
@@ -632,6 +636,8 @@ CSS类名=CSS class
|
||||
|
||||
# =========== 区域管理 ===========
|
||||
|
||||
区域导航=Area
|
||||
|
||||
新增区域=New area
|
||||
编辑区域=Edit area
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
在线用户=オンラインユーザー
|
||||
在线文档=オンラインドキュメント
|
||||
|
||||
数据管理=データかんり
|
||||
研发工具=開発ツール
|
||||
|
||||
用户选择=ユーザー選択
|
||||
@@ -460,6 +461,7 @@
|
||||
主类全名=主類のフルネーム
|
||||
模块描述=モジュール記述
|
||||
当前版本=現行版
|
||||
升级信息=アップグレードします情報
|
||||
版本=バージョン
|
||||
未知=未知
|
||||
未安装=未実装
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
typeHandler="com.jeesite.common.mybatis.type.AesTypeHandler"/>
|
||||
</resultMap> -->
|
||||
|
||||
<!-- 查询数据
|
||||
<!-- 查询数据
|
||||
<select id="findList" resultMap="empUserResult"> -->
|
||||
<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}
|
||||
@@ -54,50 +60,71 @@
|
||||
<!-- 查询全部用户,仅返回基本信息 -->
|
||||
<select id="findUserList" resultType="EmpUser">
|
||||
SELECT
|
||||
<include refid="userColumns"/>
|
||||
<include refid="userColumns"/>
|
||||
FROM ${_prefix}sys_user a
|
||||
WHERE a.status = #{STATUS_NORMAL}
|
||||
AND a.user_type = #{USER_TYPE_EMPLOYEE}
|
||||
<if test="global.useCorpModel">
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
ORDER BY a.user_code
|
||||
</select>
|
||||
|
||||
<!-- 根据部门编码查询用户,仅返回基本信息 -->
|
||||
<select id="findUserListByOfficeCodes" resultType="EmpUser">
|
||||
SELECT
|
||||
<include refid="userColumns"/>
|
||||
<include refid="userColumns"/>
|
||||
FROM ${_prefix}sys_user a
|
||||
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
|
||||
JOIN ${_prefix}sys_office o ON o.office_code = e.office_code
|
||||
WHERE a.status = #{STATUS_NORMAL}
|
||||
AND a.user_type = #{USER_TYPE_EMPLOYEE}
|
||||
<if test="global.useCorpModel">
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND e.status = #{STATUS_NORMAL}
|
||||
AND o.status = #{STATUS_NORMAL}
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND e.status = #{STATUS_NORMAL}
|
||||
AND o.status = #{STATUS_NORMAL}
|
||||
AND o.office_code IN
|
||||
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
|
||||
#{code}
|
||||
</foreach>
|
||||
ORDER BY a.user_code
|
||||
</select>
|
||||
|
||||
<!-- 根据公司编码查询用户,仅返回基本信息 -->
|
||||
<select id="findUserListByCompanyCodes" resultType="EmpUser">
|
||||
SELECT
|
||||
<include refid="userColumns"/>
|
||||
FROM ${_prefix}sys_user a
|
||||
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
|
||||
JOIN ${_prefix}sys_company o ON o.company_code = e.company_code
|
||||
WHERE a.status = #{STATUS_NORMAL}
|
||||
AND a.user_type = #{USER_TYPE_EMPLOYEE}
|
||||
<if test="global.useCorpModel">
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND e.status = #{STATUS_NORMAL}
|
||||
AND o.status = #{STATUS_NORMAL}
|
||||
AND o.company_code IN
|
||||
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
|
||||
#{code}
|
||||
</foreach>
|
||||
ORDER BY a.user_code
|
||||
</select>
|
||||
|
||||
<!-- 根据角色编码查询用户,仅返回基本信息 -->
|
||||
<select id="findUserListByRoleCodes" resultType="EmpUser">
|
||||
SELECT
|
||||
<include refid="userColumns"/>
|
||||
<include refid="userColumns"/>
|
||||
FROM ${_prefix}sys_user a
|
||||
JOIN ${_prefix}sys_user_role ur2 ON ur2.user_code = a.user_code
|
||||
JOIN ${_prefix}sys_role r ON r.role_code = ur2.role_code
|
||||
WHERE a.status = #{STATUS_NORMAL}
|
||||
AND a.user_type = #{USER_TYPE_EMPLOYEE}
|
||||
<if test="global.useCorpModel">
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND r.status = #{STATUS_NORMAL}
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND r.status = #{STATUS_NORMAL}
|
||||
AND r.role_code IN
|
||||
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
|
||||
#{code}
|
||||
@@ -108,7 +135,7 @@
|
||||
<!-- 根据岗位编码查询用户,仅返回基本信息 -->
|
||||
<select id="findUserListByPostCodes" resultType="EmpUser">
|
||||
SELECT
|
||||
<include refid="userColumns"/>
|
||||
<include refid="userColumns"/>
|
||||
FROM ${_prefix}sys_user a
|
||||
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
|
||||
JOIN ${_prefix}sys_employee_post ep ON ep.emp_code = e.emp_code
|
||||
@@ -116,10 +143,10 @@
|
||||
WHERE a.status = #{STATUS_NORMAL}
|
||||
AND a.user_type = #{USER_TYPE_EMPLOYEE}
|
||||
<if test="global.useCorpModel">
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND e.status = #{STATUS_NORMAL}
|
||||
AND p.status = #{STATUS_NORMAL}
|
||||
AND a.corp_code = #{corpCode}
|
||||
</if>
|
||||
AND e.status = #{STATUS_NORMAL}
|
||||
AND p.status = #{STATUS_NORMAL}
|
||||
AND p.post_code IN
|
||||
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
|
||||
#{code}
|
||||
|
||||
@@ -24,5 +24,25 @@
|
||||
</where>
|
||||
ORDER BY ${sqlMap.order.toSql()}
|
||||
</select>
|
||||
|
||||
<!-- 重写 Dao 中的 insert 查询方法 v5.11.1
|
||||
<insert id="insert">
|
||||
INSERT INTO ${sqlMap.insert.toTableSql()}
|
||||
(${sqlMap.insert.toColumnSql()})
|
||||
VALUES (${sqlMap.insert.toValuesSql()})
|
||||
</insert> -->
|
||||
|
||||
<!-- 重写 Dao 中的 update 查询方法 v5.11.1
|
||||
<update id="update">
|
||||
UPDATE ${sqlMap.update.toTableSql()}
|
||||
SET ${sqlMap.update.toColumnSql()}
|
||||
WHERE ${sqlMap.update.toWhereSql()}
|
||||
</update> -->
|
||||
|
||||
<!-- 重写 Dao 中的 phyDelete 查询方法 v5.11.1
|
||||
<delete id="phyDelete">
|
||||
DELETE FROM ${sqlMap.update.toTableSql()}
|
||||
WHERE ${sqlMap.update.toWhereSql()}
|
||||
</delete> -->
|
||||
|
||||
</mapper>
|
||||
@@ -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) {
|
||||
|
||||
@@ -11,9 +11,11 @@ package ${packageName}.${moduleName}.web${isNotEmpty(subModuleName)?'.'+subModul
|
||||
<% if (table.isTreeEntity){ %>
|
||||
import java.util.Map;
|
||||
<% } %>
|
||||
<% if (table.isTreeEntity || toBoolean(table.optionMap['isImportExport'])){ %>
|
||||
import java.util.List;
|
||||
<% if (!table.isTreeEntity || toBoolean(table.optionMap['isImportExport'])){ %>
|
||||
<% } %>
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
<% if (!table.isTreeEntity || toBoolean(table.optionMap['isImportExport'])){ %>
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
<% } %>
|
||||
|
||||
@@ -71,7 +73,12 @@ public class ${ClassName}Controller extends BaseController {
|
||||
* 获取数据
|
||||
*/
|
||||
@ModelAttribute
|
||||
public ${ClassName} get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrType} ${pk.simpleAttrName}<% } %>, boolean isNewRecord) {
|
||||
public ${ClassName} get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrType} ${pk.simpleAttrName}<% } %>, boolean isNewRecord<% if (table.isTreeEntity){ %>, HttpServletRequest request<% } %>) {
|
||||
<% if (table.isTreeEntity){ %>
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new ${ClassName}();
|
||||
}
|
||||
<% } %>
|
||||
<% if (table.pkList.~size == 1){ %>
|
||||
return ${className}Service.get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrName}<% } %>, isNewRecord);
|
||||
<% }else{ %>
|
||||
@@ -117,19 +124,23 @@ public class ${ClassName}Controller extends BaseController {
|
||||
if (StringUtils.isBlank(${className}.getParentCode())) {
|
||||
${className}.setParentCode(${ClassName}.ROOT_CODE);
|
||||
}
|
||||
<% for(c in table.columnList){ %>
|
||||
<% if(c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status'){ %>
|
||||
<% if(c.attrType == 'String'){ %>
|
||||
if (StringUtils.isNotBlank(${className}.${c.attrNameForGetMethod})){
|
||||
<% var where = {
|
||||
for(c in table.columnList){
|
||||
if(c.isPk == "1" || (c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status')){
|
||||
if(c.attrType == 'String'){ %>
|
||||
|| StringUtils.isNotBlank(${className}.${c.attrNameForGetMethod})
|
||||
<% }else{ %>
|
||||
|| ${className}.${c.attrNameForGetMethod} != null
|
||||
<% }
|
||||
}
|
||||
}
|
||||
};
|
||||
where = @StringUtils.trim(@ObjectUtils.toString(where));
|
||||
if (isNotBlank(where)){ %>
|
||||
if (${@StringUtils.substring(where, 3)}){
|
||||
${className}.setParentCode(null);
|
||||
}
|
||||
<% }else{ %>
|
||||
if (${className}.${c.attrNameForGetMethod} != null){
|
||||
${className}.setParentCode(null);
|
||||
}
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
List<${ClassName}> list = ${className}Service.findList(${className});
|
||||
return list;
|
||||
}
|
||||
@@ -268,7 +279,7 @@ public class ${ClassName}Controller extends BaseController {
|
||||
<% if(table.isTreeEntity){ %>
|
||||
${ClassName} where = new ${ClassName}();
|
||||
where.setStatus(${ClassName}.STATUS_NORMAL);
|
||||
where.setParentCodes("," + ${className}.getId() + ",");
|
||||
where.setParentCodes_rightLike(${className}.getParentCodes() + ${className}.getId() + ",");
|
||||
long count = ${className}Service.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该${functionNameSimple}包含未停用的子${functionNameSimple}!"));
|
||||
|
||||
@@ -131,6 +131,13 @@ public class ${ClassName}Service extends ${table.isTreeEntity?'Tree':'Crud'}Serv
|
||||
if (${ClassName}.STATUS_NORMAL.equals(${className}.getStatus())){
|
||||
throw new ServiceException(text("非法操作,前端数据被劫持!"));
|
||||
}
|
||||
|
||||
// 如果是重启流程操作,则恢复审核状态,并标记重启状态
|
||||
boolean isRestart = false;
|
||||
if (${ClassName}.STATUS_RESTART.equals(${className}.getStatus())) {
|
||||
${className}.setStatus(${ClassName}.STATUS_AUDIT);
|
||||
isRestart = true;
|
||||
}
|
||||
|
||||
// 如果状态为草稿或审核状态,才可以保存业务数据
|
||||
if (${ClassName}.STATUS_DRAFT.equals(${className}.getStatus())
|
||||
@@ -140,15 +147,28 @@ public class ${ClassName}Service extends ${table.isTreeEntity?'Tree':'Crud'}Serv
|
||||
|
||||
// 如果为审核状态,则进行审批流操作
|
||||
if (${ClassName}.STATUS_AUDIT.equals(${className}.getStatus())){
|
||||
|
||||
|
||||
// 流程定义中的表单Key,不是流程Key
|
||||
String formKey = "${table.optionMap['bpmFormKey']}";
|
||||
|
||||
// 指定流程变量,作为流程条件,决定流转方向
|
||||
Map<String, Object> variables = MapUtils.newHashMap();
|
||||
//variables.put("leaveDays", ${className}.getLeaveDays());
|
||||
|
||||
// 如果是流程重启,则先检查流程状态
|
||||
if (isRestart) {
|
||||
if (BpmUtils.getRunProcIns(${className}, formKey) != null) {
|
||||
throw new ServiceException(text("重启失败,流程已经启动!"));
|
||||
}
|
||||
if (StringUtils.isNotBlank(${className}.getBpm().getProcInsId())) {
|
||||
variables.put("parentProcInsId", ${className}.getBpm().getProcInsId());
|
||||
}
|
||||
}
|
||||
|
||||
// 如果流程实例为空,任务编号也为空,则:启动流程
|
||||
if (StringUtils.isBlank(${className}.getBpm().getProcInsId())
|
||||
&& StringUtils.isBlank(${className}.getBpm().getTaskId())){
|
||||
BpmUtils.start(${className}, "${table.optionMap['bpmFormKey']}", variables, null);
|
||||
if (isRestart || (StringUtils.isBlank(${className}.getBpm().getProcInsId())
|
||||
&& StringUtils.isBlank(${className}.getBpm().getTaskId()))){
|
||||
BpmUtils.start(${className}, formKey, variables, null);
|
||||
}
|
||||
// 如果有任务信息,则:提交任务
|
||||
else{
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!-- Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
No deletion without permission, or be held responsible to law. -->
|
||||
<template>
|
||||
<name>controller</name>
|
||||
<name>api</name>
|
||||
<filePath>${baseDir}/${moduleName}-client/src/main/java/${packagePath}/${moduleName}/api/${subModuleName}</filePath>
|
||||
<fileName>${ClassName}ServiceApi.java</fileName>
|
||||
<content><![CDATA[
|
||||
|
||||
@@ -11,9 +11,11 @@ package ${packageName}.${moduleName}.web${isNotEmpty(subModuleName)?'.'+subModul
|
||||
<% if (table.isTreeEntity){ %>
|
||||
import java.util.Map;
|
||||
<% } %>
|
||||
<% if (table.isTreeEntity || toBoolean(table.optionMap['isImportExport'])){ %>
|
||||
import java.util.List;
|
||||
<% if (!table.isTreeEntity || toBoolean(table.optionMap['isImportExport'])){ %>
|
||||
<% } %>
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
<% if (!table.isTreeEntity || toBoolean(table.optionMap['isImportExport'])){ %>
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
<% } %>
|
||||
|
||||
@@ -73,7 +75,12 @@ public class ${ClassName}Controller extends BaseController {
|
||||
* 获取数据
|
||||
*/
|
||||
@ModelAttribute
|
||||
public ${ClassName} get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrType} ${pk.simpleAttrName}<% } %>, boolean isNewRecord) {
|
||||
public ${ClassName} get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrType} ${pk.simpleAttrName}<% } %>, boolean isNewRecord<% if (table.isTreeEntity){ %>, HttpServletRequest request<% } %>) {
|
||||
<% if (table.isTreeEntity){ %>
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new ${ClassName}();
|
||||
}
|
||||
<% } %>
|
||||
<% if (table.pkList.~size == 1){ %>
|
||||
return ${className}Service.get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrName}<% } %>, isNewRecord);
|
||||
<% }else{ %>
|
||||
@@ -119,19 +126,23 @@ public class ${ClassName}Controller extends BaseController {
|
||||
if (StringUtils.isBlank(${className}.getParentCode())) {
|
||||
${className}.setParentCode(${ClassName}.ROOT_CODE);
|
||||
}
|
||||
<% for(c in table.columnList){ %>
|
||||
<% if(c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status'){ %>
|
||||
<% if(c.attrType == 'String'){ %>
|
||||
if (StringUtils.isNotBlank(${className}.${c.attrNameForGetMethod})){
|
||||
<% var where = {
|
||||
for(c in table.columnList){
|
||||
if(c.isPk == "1" || (c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status')){
|
||||
if(c.attrType == 'String'){ %>
|
||||
|| StringUtils.isNotBlank(${className}.${c.attrNameForGetMethod})
|
||||
<% }else{ %>
|
||||
|| ${className}.${c.attrNameForGetMethod} != null
|
||||
<% }
|
||||
}
|
||||
}
|
||||
};
|
||||
where = @StringUtils.trim(@ObjectUtils.toString(where));
|
||||
if (isNotBlank(where)){ %>
|
||||
if (${@StringUtils.substring(where, 3)}){
|
||||
${className}.setParentCode(null);
|
||||
}
|
||||
<% }else{ %>
|
||||
if (${className}.${c.attrNameForGetMethod} != null){
|
||||
${className}.setParentCode(null);
|
||||
}
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
List<${ClassName}> list = ${className}Service.findList(${className});
|
||||
return list;
|
||||
}
|
||||
@@ -273,7 +284,7 @@ public class ${ClassName}Controller extends BaseController {
|
||||
<% if(table.isTreeEntity){ %>
|
||||
${ClassName} where = new ${ClassName}();
|
||||
where.setStatus(${ClassName}.STATUS_NORMAL);
|
||||
where.setParentCodes("," + ${className}.getId() + ",");
|
||||
where.setParentCodes_rightLike(${className}.getParentCodes() + ${className}.getId() + ",");
|
||||
long count = ${className}Service.findCount(where);
|
||||
if (count > 0) {
|
||||
return renderResult(Global.FALSE, text("该${functionNameSimple}包含未停用的子${functionNameSimple}!"));
|
||||
@@ -307,6 +318,11 @@ public class ${ClassName}Controller extends BaseController {
|
||||
@ResponseBody
|
||||
@GlobalTransactional
|
||||
public String delete(${ClassName} ${className}) {
|
||||
<% if(toBoolean(table.optionMap['isBpmForm'])){ %>
|
||||
if (!${ClassName}.STATUS_DRAFT.equals(${className}.getStatus())){
|
||||
return renderResult(Global.FALSE, text("只能删除草稿状态的数据!"));
|
||||
}
|
||||
<% } %>
|
||||
${className}Service.delete(${className});
|
||||
return renderResult(Global.TRUE, text("删除${functionNameSimple}成功!"));
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<name>Dockerfile</name>
|
||||
<filePath>${baseDir}/${moduleCode}/${moduleCode}/bin/docker</filePath>
|
||||
<fileName>Dockerfile</fileName>
|
||||
<content><![CDATA[FROM openjdk:8-slim
|
||||
<content><![CDATA[FROM docker.m.daocloud.io/openjdk:8
|
||||
LABEL maintainer="ThinkGem@163.com"
|
||||
ENV TZ "Asia/Shanghai"
|
||||
ENV LANG C.UTF-8
|
||||
@@ -20,7 +20,8 @@ ADD ./maven/web.war ./app.war
|
||||
#ENV JAVA_OPTS "$JAVA_OPTS -Xms256m -Xmx1024m"
|
||||
ENV JAVA_OPTS "$JAVA_OPTS -Dspring.profiles.active=prod"
|
||||
|
||||
ENTRYPOINT jar -xvf app.war && rm app.war && cd WEB-INF && sh startup.sh
|
||||
ENTRYPOINT if [ -f "app.war" ]; then jar -xvf app.war && rm app.war; \
|
||||
fi && cd WEB-INF && sh startup.sh && cd WEB-INF && sh startup.sh
|
||||
|
||||
EXPOSE 8983
|
||||
|
||||
|
||||
@@ -11,8 +11,9 @@ package ${packageName}.${moduleName}.web${isNotEmpty(subModuleName)?'.'+subModul
|
||||
<% if (table.isTreeEntity){ %>
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
<% }else{ %>
|
||||
<% } %>
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
<% if (!table.isTreeEntity){ %>
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
<% } %>
|
||||
|
||||
@@ -57,7 +58,12 @@ public class ${ClassName}Controller extends BaseController {
|
||||
* 获取数据
|
||||
*/
|
||||
@ModelAttribute
|
||||
public ${ClassName} get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrType} ${pk.simpleAttrName}<% } %>, boolean isNewRecord) {
|
||||
public ${ClassName} get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrType} ${pk.simpleAttrName}<% } %>, boolean isNewRecord<% if (table.isTreeEntity){ %>, HttpServletRequest request<% } %>) {
|
||||
<% if (table.isTreeEntity){ %>
|
||||
if (StringUtils.endsWith(request.getRequestURI(), "listData")) {
|
||||
return new ${ClassName}();
|
||||
}
|
||||
<% } %>
|
||||
<% if (table.pkList.~size == 1){ %>
|
||||
return ${className}Service.get(<% for(pk in table.pkList){ %>${pkLP.index!=1?', ':''}${pk.simpleAttrName}<% } %>, isNewRecord);
|
||||
<% }else{ %>
|
||||
@@ -103,19 +109,23 @@ public class ${ClassName}Controller extends BaseController {
|
||||
if (StringUtils.isBlank(${className}.getParentCode())) {
|
||||
${className}.setParentCode(${ClassName}.ROOT_CODE);
|
||||
}
|
||||
<% for(c in table.columnList){ %>
|
||||
<% if(c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status'){ %>
|
||||
<% if(c.attrType == 'String'){ %>
|
||||
if (StringUtils.isNotBlank(${className}.${c.attrNameForGetMethod})){
|
||||
<% var where = {
|
||||
for(c in table.columnList){
|
||||
if(c.isPk == "1" || (c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status')){
|
||||
if(c.attrType == 'String'){ %>
|
||||
|| StringUtils.isNotBlank(${className}.${c.attrNameForGetMethod})
|
||||
<% }else{ %>
|
||||
|| ${className}.${c.attrNameForGetMethod} != null
|
||||
<% }
|
||||
}
|
||||
}
|
||||
};
|
||||
where = @StringUtils.trim(@ObjectUtils.toString(where));
|
||||
if (isNotBlank(where)){ %>
|
||||
if (${@StringUtils.substring(where, 3)}){
|
||||
${className}.setParentCode(null);
|
||||
}
|
||||
<% }else{ %>
|
||||
if (${className}.${c.attrNameForGetMethod} != null){
|
||||
${className}.setParentCode(null);
|
||||
}
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
List<${ClassName}> list = ${className}Service.findList(${className});
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -76,19 +76,19 @@ $('#dataGrid').dataGrid({
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/form?${idParam}" class="btnList" title="\${text("查看${functionNameSimple}")}"><i class="fa fa-file-text-o"></i></a> ');
|
||||
<% }else{ %>
|
||||
\//# if(hasPermi('${permissionPrefix}:edit')){
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/form?${idParam}" class="btnList" title="\${text("编辑${functionNameSimple}")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/form?${idParam}" class="btnList" title="\${text("编辑${functionNameSimple}")}"><i class="fa icon-note"></i></a> ');
|
||||
<% if(toBoolean(table.optionMap['isHaveDisableEnable'])){ %>
|
||||
if (row.status == Global.STATUS_NORMAL){
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/disable?${idParam}" class="btnList" title="\${text("停用${functionNameSimple}")}" data-confirm="\${text("确认要停用该${functionNameSimple}吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a> ');
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/disable?${idParam}" class="btnList" title="\${text("停用${functionNameSimple}")}" data-confirm="\${text("确认要停用该${functionNameSimple}吗?")}"><i class="fa icon-ban"></i></a> ');
|
||||
} else if (row.status == Global.STATUS_DISABLE){
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/enable?${idParam}" class="btnList" title="\${text("启用${functionNameSimple}")}" data-confirm="\${text("确认要启用该${functionNameSimple}吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a> ');
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/enable?${idParam}" class="btnList" title="\${text("启用${functionNameSimple}")}" data-confirm="\${text("确认要启用该${functionNameSimple}吗?")}"><i class="fa icon-check"></i></a> ');
|
||||
}
|
||||
<% } %>
|
||||
<% if(toBoolean(table.optionMap['isHaveDelete'])){ %>
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/delete?${idParam}" class="btnList" title="\${text("删除${functionNameSimple}")}" data-confirm="\${text("确认要删除该${functionNameSimple}<% if(table.isTreeEntity){ %>及所有子${functionNameSimple}<% } %>吗?")}"<% if(table.isTreeEntity){ %> data-deltreenode="'+row.id+'"<% } %>><i class="fa fa-trash-o"></i></a> ');
|
||||
<% } %>
|
||||
<% if(table.isTreeEntity){ %>
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/form?parentCode='+row.id+'" class="btnList" title="\${text("新增下级${functionNameSimple}")}"><i class="fa fa-plus-square"></i></a> ');
|
||||
actions.push('<a href="\${ctx}/${urlPrefix}/form?parentCode='+row.id+'" class="btnList" title="\${text("新增下级${functionNameSimple}")}"><i class="fa icon-plus"></i></a> ');
|
||||
<% } %>
|
||||
\//# }
|
||||
<% if(toBoolean(table.optionMap['isBpmForm'])){ %>
|
||||
@@ -104,6 +104,11 @@ $('#dataGrid').dataGrid({
|
||||
treeGrid: true, // 启用树结构表格
|
||||
defaultExpandLevel: 0, // 默认展开的层次
|
||||
expandNodeClearPostData: '<%
|
||||
if(table.isTreeEntity){
|
||||
for(pk in table.pkList){
|
||||
print(pk.attrName + ',');
|
||||
}
|
||||
}
|
||||
for(c in table.columnList){
|
||||
if(c.isQuery == "1" && !c.isTreeEntityColumn && c.attrName != 'status'){
|
||||
print(c.attrName + ',');
|
||||
@@ -112,7 +117,14 @@ $('#dataGrid').dataGrid({
|
||||
//# }
|
||||
\//# // 加载成功后执行事件
|
||||
ajaxSuccess: function(data){
|
||||
|
||||
<% if(table.isTreeEntity){
|
||||
for(pk in table.pkList){ %>
|
||||
if ($('#${pk.attrName}').val() != ''){
|
||||
$('#${pk.attrName}').val('');
|
||||
$('#btnExpandTreeNode').click();
|
||||
}
|
||||
<% }
|
||||
} %>
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -95,6 +95,12 @@ BpmButton.init = function(task){
|
||||
BpmButton.complete = function($this, task){
|
||||
$('#status').val(Global.STATUS_AUDIT);
|
||||
};
|
||||
BpmButton.restart = function($this, task){
|
||||
js.confirm('\${text("确认要重启流程吗?")}', function(){
|
||||
$('#status').val("6");
|
||||
$('#inputForm').submit();
|
||||
});
|
||||
};
|
||||
// 表单验证提交事件
|
||||
<% } %>
|
||||
$('#inputForm').validate({
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<div class="box box-main">
|
||||
<div class="box-header">
|
||||
<div class="box-title">
|
||||
<i class="fa icon-grid"></i> \${text('${functionNameSimple}')}
|
||||
<i class="fa icon-grid"></i> \${text('${functionNameSimple}导航')}
|
||||
</div>
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" id="btnExpand" title="\${text('展开')}" style="display:none;"><i class="fa fa-chevron-up"></i></button>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<% } %>
|
||||
<a href="\${ctx}/${urlPrefix}/form" class="btn btn-default btnTool" title="\${text('新增${functionNameSimple}')}"><i class="fa fa-plus"></i> \${text('新增')}</a>
|
||||
\<% } %>
|
||||
<a href="#" class="btn btn-default" id="btnSetting" title="\${text('设置')}"><i class="fa fa-navicon"></i></a>
|
||||
<a href="#" class="btn-setting" id="btnSetting" title="\${text('设置')}"><i class="fa icon-settings"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
|
||||
@@ -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'){
|
||||
|
||||
@@ -19,12 +19,13 @@
|
||||
:title="t('${functionNameSimple}')"
|
||||
:search="true"
|
||||
:toolbar="true"
|
||||
:showIcon="true"
|
||||
:api="${className}TreeData"
|
||||
:defaultExpandLevel="2"
|
||||
@select="handleSelect"
|
||||
v-model:selectedKeys="treeCodes"
|
||||
/>
|
||||
</template>
|
||||
<ListView :treeCode="treeCode" />
|
||||
<ListView v-model:treeCodes="treeCodes" />
|
||||
</PageWrapper>
|
||||
</template>
|
||||
<script lang="ts" setup name="${compNamePrefix}Index">
|
||||
@@ -36,11 +37,7 @@
|
||||
import ListView from './list.vue';
|
||||
|
||||
const { t } = useI18n('${moduleName}${isNotEmpty(subModuleName)?'.'+subModuleName:''}.${className}');
|
||||
const treeCode = ref<string>('');
|
||||
|
||||
function handleSelect(keys: string[]) {
|
||||
treeCode.value = keys[0];
|
||||
}
|
||||
const treeCodes = ref<string[]>([]);
|
||||
</script>
|
||||
<% } %>
|
||||
<% %>
|
||||
|
||||
@@ -56,7 +56,7 @@ if(table.isTreeEntity){
|
||||
( {{ record.${table.treeViewCodeAttrName} }} )
|
||||
</span>
|
||||
<% } %>
|
||||
<a @click="handleForm({ ${idParam} })">
|
||||
<a @click="handleForm({ ${idParam} })" :title="record.${table.treeViewNameAttrName}">
|
||||
{{ record.${table.treeViewNameAttrName} }}
|
||||
</a>
|
||||
<%
|
||||
@@ -71,7 +71,7 @@ if(table.isTreeEntity){
|
||||
continue;
|
||||
}
|
||||
%>
|
||||
<a @click="handleForm({ ${idParam} })">
|
||||
<a @click="handleForm({ ${idParam} })" :title="record.${c.attrName}">
|
||||
{{ record.${c.attrName} }}
|
||||
</a>
|
||||
<%
|
||||
@@ -154,6 +154,9 @@ if(table.isTreeEntity){
|
||||
import { BpmRuntimeTrace } from '/@/components/Bpm';
|
||||
<% } %>
|
||||
import { FormProps } from '/@/components/Form';
|
||||
<% if(table.isTreeEntity || isNotBlank(table.optionMap['leftTreeRightTableFk'])) { %>
|
||||
import { isEmpty } from '/@/utils/is';
|
||||
<% } %>
|
||||
<% if(!@StringUtils.contains(table.tplCategory, '_route')) { %>
|
||||
import InputForm from './form.vue';
|
||||
<% } %>
|
||||
@@ -163,8 +166,10 @@ if(table.isTreeEntity){
|
||||
<% if(table.isTreeEntity || isNotBlank(table.optionMap['leftTreeRightTableFk'])){ %>
|
||||
|
||||
const props = defineProps({
|
||||
treeCode: String,
|
||||
treeCodes: Array as PropType<String[]>,
|
||||
});
|
||||
|
||||
const emit = defineEmits(['update:treeCodes']);
|
||||
<% } %>
|
||||
<% if(@StringUtils.contains(table.tplCategory, '_route')) { %>
|
||||
|
||||
@@ -273,6 +278,11 @@ if(table.isTreeEntity){
|
||||
<% } %>
|
||||
<% } %>
|
||||
],
|
||||
<% if(table.isTreeEntity || isNotBlank(table.optionMap['leftTreeRightTableFk'])) { %>
|
||||
resetFunc: async () => {
|
||||
emit('update:treeCodes', []);
|
||||
},
|
||||
<% } %>
|
||||
};
|
||||
|
||||
const tableColumns: BasicColumn[] = [
|
||||
@@ -420,6 +430,11 @@ for(c in table.columnList){
|
||||
|| toBoolean(table.optionMap['isImportExport'])){ %>, getForm<% } %> }] = useTable({
|
||||
api: ${className}ListData,
|
||||
beforeFetch: (params) => {
|
||||
<% if(table.isTreeEntity){ %>
|
||||
<% for(pk in table.pkList){ %>
|
||||
params.${pk.attrName} = !isEmpty(props.treeCodes) ? props.treeCodes[0] : '';
|
||||
<% } %>
|
||||
<% } %>
|
||||
return params;
|
||||
},
|
||||
columns: tableColumns,
|
||||
@@ -440,25 +455,23 @@ for(c in table.columnList){
|
||||
<% if(table.isTreeEntity || isNotBlank(table.optionMap['leftTreeRightTableFk'])){ %>
|
||||
|
||||
watch(
|
||||
() => props.treeCode,
|
||||
() => props.treeCodes,
|
||||
async () => {
|
||||
await getForm().setFieldsValue({
|
||||
<% if (isNotBlank(table.optionMap['leftTreeRightTableFk'])) { %>
|
||||
'${table.optionMap['leftTreeRightTableFk']}': props.treeCode,
|
||||
<% }else if(table.isTreeEntity){ %>
|
||||
<% for(pk in table.pkList){ %>
|
||||
'${pk.attrName}': props.treeCode,
|
||||
<% } %>
|
||||
<% } %>
|
||||
});
|
||||
reload();
|
||||
if (!isEmpty(props.treeCodes)) {
|
||||
<% if (isNotBlank(table.optionMap['leftTreeRightTableFk'])) { %>
|
||||
await getForm().setFieldsValue({
|
||||
'${table.optionMap['leftTreeRightTableFk']}': props.treeCodes[0],
|
||||
});
|
||||
<% } %>
|
||||
reload();
|
||||
}
|
||||
},
|
||||
);
|
||||
<% } %>
|
||||
<% if(table.isTreeEntity){ %>
|
||||
|
||||
function fetchSuccess() {
|
||||
if (props.treeCode) {
|
||||
if (!isEmpty(props.treeCodes)) {
|
||||
nextTick(expandAll);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ var message = @ObjectUtils.toString(@request.getAttribute('message'));
|
||||
if (isBlank(message)){
|
||||
var ex = @ExceptionUtils.getThrowable(request);
|
||||
if (ex != null){
|
||||
if(@StringUtils.startsWith(@ex.getMessage(), 'msg:')){
|
||||
message = @StringUtils.replace(@ex.getMessage(), 'msg:', '');
|
||||
if(@StringUtils.startsWith(ex.message, 'msg:')){
|
||||
message = @StringUtils.replace(ex.message, 'msg:', '');
|
||||
}else if (type.fullName(ex) == 'org.springframework.validation.BindException'
|
||||
|| type.fullName(ex) == 'org.springframework.web.bind.MethodArgumentNotValidException'){
|
||||
for (var e in ex.globalErrors){
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user