Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
JeeSpringCloud
Commits
d3ad3768
Commit
d3ad3768
authored
Nov 12, 2018
by
Huang
Browse files
no commit message
parent
b6becbcd
Changes
393
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 393+
files are displayed.
Plain diff
Email patch
JeeSpringCloud/src/main/java/com/jeespring/common/utils/StringUtils.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.io.UnsupportedEncodingException
;
import
java.util.List
;
import
java.util.Locale
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.commons.lang3.BooleanUtils
;
import
org.apache.commons.lang3.StringEscapeUtils
;
import
org.apache.commons.lang3.text.StrBuilder
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
org.springframework.web.servlet.LocaleResolver
;
import
com.google.common.collect.Lists
;
/**
* 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
* @author 黄炳桂 516821420@qq.com
* @version 2013-05-22
*/
public
class
StringUtils
extends
org
.
apache
.
commons
.
lang3
.
StringUtils
{
private
static
final
char
SEPARATOR
=
'_'
;
private
static
final
String
CHARSET_NAME
=
"UTF-8"
;
/** 空字符串 */
private
static
final
String
NULLSTR
=
""
;
/**
* 转换为字节数组
* @param str
* @return
*/
public
static
byte
[]
getBytes
(
String
str
){
if
(
str
!=
null
){
try
{
return
str
.
getBytes
(
CHARSET_NAME
);
}
catch
(
UnsupportedEncodingException
e
)
{
return
null
;
}
}
else
{
return
null
;
}
}
/**
* 转换为Boolean类型
* 'true', 'on', 'y', 't', 'yes' or '1' (case insensitive) will return true. Otherwise, false is returned.
*/
public
static
Boolean
toBoolean
(
final
Object
val
){
if
(
val
==
null
){
return
false
;
}
return
BooleanUtils
.
toBoolean
(
val
.
toString
())
||
"1"
.
equals
(
val
.
toString
());
}
/**
* 转换为字节数组
* @param str
* @return
*/
public
static
String
toString
(
byte
[]
bytes
){
try
{
return
new
String
(
bytes
,
CHARSET_NAME
);
}
catch
(
UnsupportedEncodingException
e
)
{
return
EMPTY
;
}
}
/**
* 如果对象为空,则使用defaultVal值
* see: ObjectUtils.toString(obj, defaultVal)
* @param obj
* @param defaultVal
* @return
*/
public
static
String
toString
(
final
Object
obj
,
final
String
defaultVal
)
{
return
obj
==
null
?
defaultVal
:
obj
.
toString
();
}
/**
* 是否包含字符串
* @param str 验证字符串
* @param strs 字符串组
* @return 包含返回true
*/
public
static
boolean
inString
(
String
str
,
String
...
strs
){
if
(
str
!=
null
){
for
(
String
s
:
strs
){
if
(
str
.
equals
(
trim
(
s
))){
return
true
;
}
}
}
return
false
;
}
/**
* 替换掉HTML标签方法
*/
public
static
String
replaceHtml
(
String
html
)
{
if
(
isBlank
(
html
)){
return
""
;
}
String
regEx
=
"<.+?>"
;
Pattern
p
=
Pattern
.
compile
(
regEx
);
Matcher
m
=
p
.
matcher
(
html
);
String
s
=
m
.
replaceAll
(
""
);
return
s
;
}
/**
* 替换为手机识别的HTML,去掉样式及属性,保留回车。
* @param html
* @return
*/
public
static
String
replaceMobileHtml
(
String
html
){
if
(
html
==
null
){
return
""
;
}
return
html
.
replaceAll
(
"<([a-z]+?)\\s+?.*?>"
,
"<$1>"
);
}
/**
* 替换为手机识别的HTML,去掉样式及属性,保留回车。
* @param txt
* @return
*/
public
static
String
toHtml
(
String
txt
){
if
(
txt
==
null
){
return
""
;
}
return
replace
(
replace
(
Encodes
.
escapeHtml
(
txt
),
"\n"
,
"<br/>"
),
"\t"
,
" "
);
}
/**
* 缩略字符串(不区分中英文字符)
* @param str 目标字符串
* @param length 截取长度
* @return
*/
public
static
String
abbr
(
String
str
,
int
length
)
{
if
(
str
==
null
)
{
return
""
;
}
try
{
StringBuilder
sb
=
new
StringBuilder
();
int
currentLength
=
0
;
for
(
char
c
:
replaceHtml
(
StringEscapeUtils
.
unescapeHtml4
(
str
)).
toCharArray
())
{
currentLength
+=
String
.
valueOf
(
c
).
getBytes
(
"GBK"
).
length
;
if
(
currentLength
<=
length
-
3
)
{
sb
.
append
(
c
);
}
else
{
sb
.
append
(
"..."
);
break
;
}
}
return
sb
.
toString
();
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
public
static
String
abbr2
(
String
param
,
int
length
)
{
if
(
param
==
null
)
{
return
""
;
}
StringBuffer
result
=
new
StringBuffer
();
int
n
=
0
;
char
temp
;
boolean
isCode
=
false
;
// 是不是HTML代码
boolean
isHTML
=
false
;
// 是不是HTML特殊字符,如
for
(
int
i
=
0
;
i
<
param
.
length
();
i
++)
{
temp
=
param
.
charAt
(
i
);
if
(
temp
==
'<'
)
{
isCode
=
true
;
}
else
if
(
temp
==
'&'
)
{
isHTML
=
true
;
}
else
if
(
temp
==
'>'
&&
isCode
)
{
n
=
n
-
1
;
isCode
=
false
;
}
else
if
(
temp
==
';'
&&
isHTML
)
{
isHTML
=
false
;
}
try
{
if
(!
isCode
&&
!
isHTML
)
{
n
+=
String
.
valueOf
(
temp
).
getBytes
(
"GBK"
).
length
;
}
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
if
(
n
<=
length
-
3
)
{
result
.
append
(
temp
);
}
else
{
result
.
append
(
"..."
);
break
;
}
}
// 取出截取字符串中的HTML标记
String
temp_result
=
result
.
toString
().
replaceAll
(
"(>)[^<>]*(<?)"
,
"$1$2"
);
// 去掉不需要结素标记的HTML标记
temp_result
=
temp_result
.
replaceAll
(
"</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>"
,
""
);
// 去掉成对的HTML标记
temp_result
=
temp_result
.
replaceAll
(
"<([a-zA-Z]+)[^<>]*>(.*?)</\\1>"
,
"$2"
);
// 用正则表达式取出标记
Pattern
p
=
Pattern
.
compile
(
"<([a-zA-Z]+)[^<>]*>"
);
Matcher
m
=
p
.
matcher
(
temp_result
);
List
<
String
>
endHTML
=
Lists
.
newArrayList
();
while
(
m
.
find
())
{
endHTML
.
add
(
m
.
group
(
1
));
}
// 补全不成对的HTML标记
for
(
int
i
=
endHTML
.
size
()
-
1
;
i
>=
0
;
i
--)
{
result
.
append
(
"</"
);
result
.
append
(
endHTML
.
get
(
i
));
result
.
append
(
">"
);
}
return
result
.
toString
();
}
/**
* 转换为Double类型
*/
public
static
Double
toDouble
(
Object
val
){
if
(
val
==
null
){
return
0
D
;
}
try
{
return
Double
.
valueOf
(
trim
(
val
.
toString
()));
}
catch
(
Exception
e
)
{
return
0
D
;
}
}
/**
* 转换为Float类型
*/
public
static
Float
toFloat
(
Object
val
){
return
toDouble
(
val
).
floatValue
();
}
/**
* 转换为Long类型
*/
public
static
Long
toLong
(
Object
val
){
return
toDouble
(
val
).
longValue
();
}
/**
* 转换为Integer类型
*/
public
static
Integer
toInteger
(
Object
val
){
return
toLong
(
val
).
intValue
();
}
/**
* 获得i18n字符串
*/
public
static
String
getMessage
(
String
code
,
Object
[]
args
)
{
LocaleResolver
localLocaleResolver
=
(
LocaleResolver
)
SpringContextHolder
.
getBean
(
LocaleResolver
.
class
);
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
Locale
localLocale
=
localLocaleResolver
.
resolveLocale
(
request
);
return
SpringContextHolder
.
getApplicationContext
().
getMessage
(
code
,
args
,
localLocale
);
}
/**
* 获得用户远程地址
*/
public
static
String
getRemoteAddr
(
HttpServletRequest
request
){
String
remoteAddr
=
request
.
getHeader
(
"X-Real-IP"
);
if
(
isNotBlank
(
remoteAddr
))
{
remoteAddr
=
request
.
getHeader
(
"X-Forwarded-For"
);
}
else
if
(
isNotBlank
(
remoteAddr
))
{
remoteAddr
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
else
if
(
isNotBlank
(
remoteAddr
))
{
remoteAddr
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
return
remoteAddr
!=
null
?
remoteAddr
:
request
.
getRemoteAddr
();
}
/**
* 驼峰命名法工具
* @return
* toCamelCase("hello_world") == "helloWorld"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/
public
static
String
toCamelCase
(
String
s
)
{
if
(
s
==
null
)
{
return
null
;
}
s
=
s
.
toLowerCase
();
StringBuilder
sb
=
new
StringBuilder
(
s
.
length
());
boolean
upperCase
=
false
;
for
(
int
i
=
0
;
i
<
s
.
length
();
i
++)
{
char
c
=
s
.
charAt
(
i
);
if
(
c
==
SEPARATOR
)
{
upperCase
=
true
;
}
else
if
(
upperCase
)
{
sb
.
append
(
Character
.
toUpperCase
(
c
));
upperCase
=
false
;
}
else
{
sb
.
append
(
c
);
}
}
return
sb
.
toString
();
}
/**
* 驼峰命名法工具
* @return
* toCamelCase("hello_world") == "helloWorld"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/
public
static
String
toCapitalizeCamelCase
(
String
s
)
{
if
(
s
==
null
)
{
return
null
;
}
s
=
toCamelCase
(
s
);
return
s
.
substring
(
0
,
1
).
toUpperCase
()
+
s
.
substring
(
1
);
}
/**
* 转换为JS获取对象值,生成三目运算返回结果
* @param objectString 对象串
* 例如:row.user.id
* 返回:!row?'':!row.user?'':!row.user.id?'':row.user.id
*/
public
static
String
jsGetVal
(
String
objectString
){
StringBuilder
result
=
new
StringBuilder
();
StringBuilder
val
=
new
StringBuilder
();
String
[]
vals
=
split
(
objectString
,
"."
);
for
(
int
i
=
0
;
i
<
vals
.
length
;
i
++){
val
.
append
(
"."
+
vals
[
i
]);
result
.
append
(
"!"
+(
val
.
substring
(
1
))+
"?'':"
);
}
result
.
append
(
val
.
substring
(
1
));
return
result
.
toString
();
}
/**
* * 判断一个字符串是否为空串
*
* @param str String
* @return true:为空 false:非空
*/
public
static
boolean
isEmpty
(
String
str
)
{
return
isNull
(
str
)
||
NULLSTR
.
equals
(
str
.
trim
());
}
/**
* * 判断一个字符串是否为非空串
*
* @param str String
* @return true:非空串 false:空串
*/
public
static
boolean
isNotEmpty
(
String
str
)
{
return
!
isEmpty
(
str
);
}
/**
* * 判断一个对象是否为空
*
* @param object Object
* @return true:为空 false:非空
*/
public
static
boolean
isNull
(
Object
object
)
{
return
object
==
null
;
}
/**
* * 判断一个对象是否非空
*
* @param object Object
* @return true:非空 false:空
*/
public
static
boolean
isNotNull
(
Object
object
)
{
return
!
isNull
(
object
);
}
/**
* 去空格
*/
public
static
String
trim
(
String
str
)
{
return
(
str
==
null
?
""
:
str
.
trim
());
}
/**
* 截取字符串
*
* @param str 字符串
* @param start 开始
* @return 结果
*/
public
static
String
substring
(
final
String
str
,
int
start
)
{
if
(
str
==
null
)
{
return
NULLSTR
;
}
if
(
start
<
0
)
{
start
=
str
.
length
()
+
start
;
}
if
(
start
<
0
)
{
start
=
0
;
}
if
(
start
>
str
.
length
())
{
return
NULLSTR
;
}
return
str
.
substring
(
start
);
}
/**
* 截取字符串
*
* @param str 字符串
* @param start 开始
* @param end 结束
* @return 结果
*/
public
static
String
substring
(
final
String
str
,
int
start
,
int
end
)
{
if
(
str
==
null
)
{
return
NULLSTR
;
}
if
(
end
<
0
)
{
end
=
str
.
length
()
+
end
;
}
if
(
start
<
0
)
{
start
=
str
.
length
()
+
start
;
}
if
(
end
>
str
.
length
())
{
end
=
str
.
length
();
}
if
(
start
>
end
)
{
return
NULLSTR
;
}
if
(
start
<
0
)
{
start
=
0
;
}
if
(
end
<
0
)
{
end
=
0
;
}
return
str
.
substring
(
start
,
end
);
}
/**
* * 判断一个对象数组是否为空
*
* @param objects 要判断的对象数组
** @return true:为空 false:非空
*/
public
static
boolean
isEmpty
(
Object
[]
objects
)
{
return
isNull
(
objects
)
||
(
objects
.
length
==
0
);
}
/**
* 格式化文本, {} 表示占位符<br>
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
* 例:<br>
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param template 文本模板,被替换的部分用 {} 表示
* @param params 参数值
* @return 格式化后的文本
*/
public
static
String
format
(
String
template
,
Object
...
params
)
{
if
(
isEmpty
(
params
)
||
isEmpty
(
template
))
{
return
template
;
}
return
StrFormatter
.
format
(
template
,
params
);
}
/**
* 驼峰首字符小写
*/
public
static
String
uncapitalize
(
String
str
)
{
int
strLen
;
if
(
str
==
null
||
(
strLen
=
str
.
length
())
==
0
)
{
return
str
;
}
return
new
StrBuilder
(
strLen
).
append
(
Character
.
toLowerCase
(
str
.
charAt
(
0
))).
append
(
str
.
substring
(
1
)).
toString
();
}
/**
* 下划线转驼峰命名
*/
public
static
String
toUnderScoreCase
(
String
s
)
{
if
(
s
==
null
)
{
return
null
;
}
StringBuilder
sb
=
new
StringBuilder
();
boolean
upperCase
=
false
;
for
(
int
i
=
0
;
i
<
s
.
length
();
i
++)
{
char
c
=
s
.
charAt
(
i
);
boolean
nextUpperCase
=
true
;
if
(
i
<
(
s
.
length
()
-
1
))
{
nextUpperCase
=
Character
.
isUpperCase
(
s
.
charAt
(
i
+
1
));
}
if
((
i
>
0
)
&&
Character
.
isUpperCase
(
c
))
{
if
(!
upperCase
||
!
nextUpperCase
)
{
sb
.
append
(
SEPARATOR
);
}
upperCase
=
true
;
}
else
{
upperCase
=
false
;
}
sb
.
append
(
Character
.
toLowerCase
(
c
));
}
return
sb
.
toString
();
}
/**
* 是否包含字符串
*
* @param str 验证字符串
* @param strs 字符串组
* @return 包含返回true
*/
public
static
boolean
inStringIgnoreCase
(
String
str
,
String
...
strs
)
{
if
(
str
!=
null
&&
strs
!=
null
)
{
for
(
String
s
:
strs
)
{
if
(
str
.
equalsIgnoreCase
(
trim
(
s
)))
{
return
true
;
}
}
}
return
false
;
}
/**
* 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
*
* @param name 转换前的下划线大写方式命名的字符串
* @return 转换后的驼峰式命名的字符串
*/
public
static
String
convertToCamelCase
(
String
name
)
{
StringBuilder
result
=
new
StringBuilder
();
// 快速检查
if
(
name
==
null
||
name
.
isEmpty
())
{
// 没必要转换
return
""
;
}
else
if
(!
name
.
contains
(
"_"
))
{
// 不含下划线,仅将首字母大写
return
name
.
substring
(
0
,
1
).
toUpperCase
()
+
name
.
substring
(
1
);
}
// 用下划线将原始字符串分割
String
[]
camels
=
name
.
split
(
"_"
);
for
(
String
camel
:
camels
)
{
// 跳过原始字符串中开头、结尾的下换线或双重下划线
if
(
camel
.
isEmpty
())
{
continue
;
}
// 首字母大写
result
.
append
(
camel
.
substring
(
0
,
1
).
toUpperCase
());
result
.
append
(
camel
.
substring
(
1
).
toLowerCase
());
}
return
result
.
toString
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/SystemPath.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
/**
* @author wanye
* @date Dec 14, 2008
* @version v 1.0
* @description 得到当前应用的系统路径
*/
public
class
SystemPath
{
public
static
String
getSysPath
()
{
String
path
=
Thread
.
currentThread
().
getContextClassLoader
()
.
getResource
(
""
).
toString
();
String
temp
=
path
.
replaceFirst
(
"file:/"
,
""
).
replaceFirst
(
"WEB-INF/classes/"
,
""
);
String
separator
=
System
.
getProperty
(
"file.separator"
);
String
resultPath
=
temp
.
replaceAll
(
"/"
,
separator
+
separator
);
return
resultPath
;
}
public
static
String
getClassPath
()
{
String
path
=
Thread
.
currentThread
().
getContextClassLoader
()
.
getResource
(
""
).
toString
();
String
temp
=
path
.
replaceFirst
(
"file:/"
,
""
);
String
separator
=
System
.
getProperty
(
"file.separator"
);
String
resultPath
=
temp
.
replaceAll
(
"/"
,
separator
+
separator
);
return
resultPath
;
}
public
static
String
getSystempPath
()
{
return
System
.
getProperty
(
"java.io.tmpdir"
);
}
public
static
String
getSeparator
()
{
return
System
.
getProperty
(
"file.separator"
);
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
getSysPath
());
System
.
out
.
println
(
System
.
getProperty
(
"java.io.tmpdir"
));
System
.
out
.
println
(
getSeparator
());
System
.
out
.
println
(
getClassPath
());
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/Threads.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package
com.jeespring.common.utils
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.TimeUnit
;
/**
* 线程相关工具类.
* @author calvin
* @version 2013-01-15
*/
public
class
Threads
{
/**
* sleep等待,单位为毫秒,忽略InterruptedException.
*/
public
static
void
sleep
(
long
millis
)
{
try
{
Thread
.
sleep
(
millis
);
}
catch
(
InterruptedException
e
)
{
// Ignore.
return
;
}
}
/**
* sleep等待,忽略InterruptedException.
*/
public
static
void
sleep
(
long
duration
,
TimeUnit
unit
)
{
try
{
Thread
.
sleep
(
unit
.
toMillis
(
duration
));
}
catch
(
InterruptedException
e
)
{
// Ignore.
return
;
}
}
/**
* 按照ExecutorService JavaDoc示例代码编写的Graceful Shutdown方法.
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
* 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
* 如果仍人超時,則強制退出.
* 另对在shutdown时线程本身被调用中断做了处理.
*/
public
static
void
gracefulShutdown
(
ExecutorService
pool
,
int
shutdownTimeout
,
int
shutdownNowTimeout
,
TimeUnit
timeUnit
)
{
pool
.
shutdown
();
// Disable new tasks from being submitted
try
{
// Wait a while for existing tasks to terminate
if
(!
pool
.
awaitTermination
(
shutdownTimeout
,
timeUnit
))
{
pool
.
shutdownNow
();
// Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if
(!
pool
.
awaitTermination
(
shutdownNowTimeout
,
timeUnit
))
{
System
.
err
.
println
(
"Pool did not terminated"
);
}
}
}
catch
(
InterruptedException
ie
)
{
// (Re-)Cancel if current thread also interrupted
pool
.
shutdownNow
();
// Preserve interrupt status
Thread
.
currentThread
().
interrupt
();
}
}
/**
* 直接调用shutdownNow的方法, 有timeout控制.取消在workQueue中Pending的任务,并中断所有阻塞函数.
*/
public
static
void
normalShutdown
(
ExecutorService
pool
,
int
timeout
,
TimeUnit
timeUnit
)
{
try
{
pool
.
shutdownNow
();
if
(!
pool
.
awaitTermination
(
timeout
,
timeUnit
))
{
System
.
err
.
println
(
"Pool did not terminated"
);
}
}
catch
(
InterruptedException
ie
)
{
Thread
.
currentThread
().
interrupt
();
}
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/TimeUtils.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.util.Arrays
;
import
java.util.Date
;
import
org.apache.commons.lang3.time.DateFormatUtils
;
/**
* 时间计算工具类
* @author 黄炳桂 516821420@qq.com
* @version 2013-11-03
*/
public
class
TimeUtils
{
public
static
String
toTimeString
(
long
time
)
{
TimeUtils
t
=
new
TimeUtils
(
time
);
int
day
=
t
.
get
(
TimeUtils
.
DAY
);
int
hour
=
t
.
get
(
TimeUtils
.
HOUR
);
int
minute
=
t
.
get
(
TimeUtils
.
MINUTE
);
int
second
=
t
.
get
(
TimeUtils
.
SECOND
);
StringBuilder
sb
=
new
StringBuilder
();
if
(
day
>
0
){
sb
.
append
(
day
).
append
(
"天"
);
}
if
(
hour
>
0
){
sb
.
append
(
hour
).
append
(
"时"
);
}
if
(
minute
>
0
){
sb
.
append
(
minute
).
append
(
"分"
);
}
if
(
second
>
0
){
sb
.
append
(
second
).
append
(
"秒"
);
}
return
sb
.
toString
();
}
/**
* 时间字段常量,表示“秒”
*/
public
final
static
int
SECOND
=
0
;
/**
* 时间字段常量,表示“分”
*/
public
final
static
int
MINUTE
=
1
;
/**
* 时间字段常量,表示“时”
*/
public
final
static
int
HOUR
=
2
;
/**
* 时间字段常量,表示“天”
*/
public
final
static
int
DAY
=
3
;
/**
* 各常量允许的最大值
*/
private
final
int
[]
maxFields
=
{
59
,
59
,
23
,
Integer
.
MAX_VALUE
-
1
};
/**
* 各常量允许的最小值
*/
private
final
int
[]
minFields
=
{
0
,
0
,
0
,
Integer
.
MIN_VALUE
};
/**
* 默认的字符串格式时间分隔符
*/
private
String
timeSeparator
=
":"
;
/**
* 时间数据容器
*/
private
int
[]
fields
=
new
int
[
4
];
/**
* 无参构造,将各字段置为 0
*/
public
TimeUtils
()
{
this
(
0
,
0
,
0
,
0
);
}
/**
* 使用时、分构造一个时间
* @param hour 小时
* @param minute 分钟
*/
public
TimeUtils
(
int
hour
,
int
minute
)
{
this
(
0
,
hour
,
minute
,
0
);
}
/**
* 使用时、分、秒构造一个时间
* @param hour 小时
* @param minute 分钟
* @param second 秒
*/
public
TimeUtils
(
int
hour
,
int
minute
,
int
second
)
{
this
(
0
,
hour
,
minute
,
second
);
}
/**
* 使用一个字符串构造时间<br/>
* Time time = new Time("14:22:23");
* @param time 字符串格式的时间,默认采用“:”作为分隔符
*/
public
TimeUtils
(
String
time
)
{
this
(
time
,
null
);
// System.out.println(time);
}
/**
* 使用时间毫秒构建时间
* @param time
*/
public
TimeUtils
(
long
time
){
this
(
new
Date
(
time
));
}
/**
* 使用日期对象构造时间
* @param date
*/
public
TimeUtils
(
Date
date
){
this
(
DateFormatUtils
.
formatUTC
(
date
,
"HH:mm:ss"
));
}
/**
* 使用天、时、分、秒构造时间,进行全字符的构造
* @param day 天
* @param hour 时
* @param minute 分
* @param second 秒
*/
public
TimeUtils
(
int
day
,
int
hour
,
int
minute
,
int
second
)
{
initialize
(
day
,
hour
,
minute
,
second
);
}
/**
* 使用一个字符串构造时间,指定分隔符<br/>
* Time time = new Time("14-22-23", "-");
* @param time 字符串格式的时间
*/
public
TimeUtils
(
String
time
,
String
timeSeparator
)
{
if
(
timeSeparator
!=
null
)
{
setTimeSeparator
(
timeSeparator
);
}
parseTime
(
time
);
}
/**
* 设置时间字段的值
* @param field 时间字段常量
* @param value 时间字段的值
*/
public
void
set
(
int
field
,
int
value
)
{
if
(
value
<
minFields
[
field
])
{
throw
new
IllegalArgumentException
(
value
+
", time value must be positive."
);
}
fields
[
field
]
=
value
%
(
maxFields
[
field
]
+
1
);
// 进行进位计算
int
carry
=
value
/
(
maxFields
[
field
]
+
1
);
if
(
carry
>
0
)
{
int
upFieldValue
=
get
(
field
+
1
);
set
(
field
+
1
,
upFieldValue
+
carry
);
}
}
/**
* 获得时间字段的值
* @param field 时间字段常量
* @return 该时间字段的值
*/
public
int
get
(
int
field
)
{
if
(
field
<
0
||
field
>
fields
.
length
-
1
)
{
throw
new
IllegalArgumentException
(
field
+
", field value is error."
);
}
return
fields
[
field
];
}
/**
* 将时间进行“加”运算,即加上一个时间
* @param time 需要加的时间
* @return 运算后的时间
*/
public
TimeUtils
addTime
(
TimeUtils
time
)
{
TimeUtils
result
=
new
TimeUtils
();
int
up
=
0
;
// 进位标志
for
(
int
i
=
0
;
i
<
fields
.
length
;
i
++)
{
int
sum
=
fields
[
i
]
+
time
.
fields
[
i
]
+
up
;
up
=
sum
/
(
maxFields
[
i
]
+
1
);
result
.
fields
[
i
]
=
sum
%
(
maxFields
[
i
]
+
1
);
}
return
result
;
}
/**
* 将时间进行“减”运算,即减去一个时间
* @param time 需要减的时间
* @return 运算后的时间
*/
public
TimeUtils
subtractTime
(
TimeUtils
time
)
{
TimeUtils
result
=
new
TimeUtils
();
int
down
=
0
;
// 退位标志
for
(
int
i
=
0
,
k
=
fields
.
length
-
1
;
i
<
k
;
i
++)
{
int
difference
=
fields
[
i
]
+
down
;
if
(
difference
>=
time
.
fields
[
i
])
{
difference
-=
time
.
fields
[
i
];
down
=
0
;
}
else
{
difference
+=
maxFields
[
i
]
+
1
-
time
.
fields
[
i
];
down
=
-
1
;
}
result
.
fields
[
i
]
=
difference
;
}
result
.
fields
[
DAY
]
=
fields
[
DAY
]
-
time
.
fields
[
DAY
]
+
down
;
return
result
;
}
/**
* 获得时间字段的分隔符
* @return
*/
public
String
getTimeSeparator
()
{
return
timeSeparator
;
}
/**
* 设置时间字段的分隔符(用于字符串格式的时间)
* @param timeSeparator 分隔符字符串
*/
public
void
setTimeSeparator
(
String
timeSeparator
)
{
this
.
timeSeparator
=
timeSeparator
;
}
private
void
initialize
(
int
day
,
int
hour
,
int
minute
,
int
second
)
{
set
(
DAY
,
day
);
set
(
HOUR
,
hour
);
set
(
MINUTE
,
minute
);
set
(
SECOND
,
second
);
}
private
void
parseTime
(
String
time
)
{
if
(
time
==
null
)
{
initialize
(
0
,
0
,
0
,
0
);
return
;
}
String
t
=
time
;
int
field
=
DAY
;
set
(
field
--,
0
);
int
p
=
-
1
;
while
((
p
=
t
.
indexOf
(
timeSeparator
))
>
-
1
)
{
parseTimeField
(
time
,
t
.
substring
(
0
,
p
),
field
--);
t
=
t
.
substring
(
p
+
timeSeparator
.
length
());
}
parseTimeField
(
time
,
t
,
field
--);
}
private
void
parseTimeField
(
String
time
,
String
t
,
int
field
)
{
if
(
field
<
SECOND
||
t
.
length
()
<
1
)
{
parseTimeException
(
time
);
}
char
[]
chs
=
t
.
toCharArray
();
int
n
=
0
;
for
(
int
i
=
0
;
i
<
chs
.
length
;
i
++)
{
if
(
chs
[
i
]
<=
' '
)
{
continue
;
}
if
(
chs
[
i
]
>=
'0'
&&
chs
[
i
]
<=
'9'
)
{
n
=
n
*
10
+
chs
[
i
]
-
'0'
;
continue
;
}
parseTimeException
(
time
);
}
set
(
field
,
n
);
}
private
void
parseTimeException
(
String
time
)
{
throw
new
IllegalArgumentException
(
time
+
", time format error, HH"
+
this
.
timeSeparator
+
"mm"
+
this
.
timeSeparator
+
"ss"
);
}
@Override
public
String
toString
()
{
StringBuilder
sb
=
new
StringBuilder
(
16
);
sb
.
append
(
fields
[
DAY
]).
append
(
','
).
append
(
' '
);
buildString
(
sb
,
HOUR
).
append
(
timeSeparator
);
buildString
(
sb
,
MINUTE
).
append
(
timeSeparator
);
buildString
(
sb
,
SECOND
);
return
sb
.
toString
();
}
private
StringBuilder
buildString
(
StringBuilder
sb
,
int
field
)
{
if
(
fields
[
field
]
<
10
)
{
sb
.
append
(
'0'
);
}
return
sb
.
append
(
fields
[
field
]);
}
@Override
public
int
hashCode
()
{
final
int
PRIME
=
31
;
int
result
=
1
;
result
=
PRIME
*
result
+
Arrays
.
hashCode
(
fields
);
return
result
;
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
this
==
obj
)
{
return
true
;
}
if
(
obj
==
null
)
{
return
false
;
}
if
(
getClass
()
!=
obj
.
getClass
())
{
return
false
;
}
final
TimeUtils
other
=
(
TimeUtils
)
obj
;
if
(!
Arrays
.
equals
(
fields
,
other
.
fields
))
{
return
false
;
}
return
true
;
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/UploadUtils.java
deleted
100644 → 0
View file @
b6becbcd
package
com.jeespring.common.utils
;
import
java.io.File
;
import
java.io.IOException
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Random
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.commons.fileupload.FileItem
;
import
org.apache.commons.fileupload.FileUploadException
;
import
org.apache.commons.fileupload.disk.DiskFileItemFactory
;
import
org.apache.commons.fileupload.servlet.ServletFileUpload
;
/**
* 文件上传工具类
*
* @author yangdc
* @date Apr 18, 2012
*
* <pre>
* </pre>
*/
public
class
UploadUtils
{
/**
* 表单字段常量
*/
public
static
final
String
FORM_FIELDS
=
"form_fields"
;
/**
* 文件域常量
*/
public
static
final
String
FILE_FIELDS
=
"file_fields"
;
// 最大文件大小
private
long
maxSize
=
1000000
;
// 定义允许上传的文件扩展名
private
Map
<
String
,
String
>
extMap
=
new
HashMap
<
String
,
String
>();
// 文件保存目录相对路径
private
String
basePath
=
"upload"
;
// 文件的目录名
private
String
dirName
=
"images"
;
// 上传临时路径
private
static
final
String
TEMP_PATH
=
"/temp"
;
private
String
tempPath
=
basePath
+
TEMP_PATH
;
// 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
private
String
fileName
;
// 文件保存目录路径
private
String
savePath
;
// 文件保存目录url
private
String
saveUrl
;
// 文件最终的url包括文件名
private
String
fileUrl
;
public
UploadUtils
()
{
// 其中images,flashs,medias,files,对应文件夹名称,对应dirName
// key文件夹名称
// value该文件夹内可以上传文件的后缀名
extMap
.
put
(
"images"
,
"gif,jpg,jpeg,png,bmp"
);
extMap
.
put
(
"flashs"
,
"swf,flv"
);
extMap
.
put
(
"medias"
,
"swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb"
);
extMap
.
put
(
"files"
,
"doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"
);
}
/**
* 文件上传
*
* @param request
* @return infos info[0] 验证文件域返回错误信息 info[1] 上传文件错误信息 info[2] savePath info[3] saveUrl info[4] fileUrl
*/
@SuppressWarnings
(
"unchecked"
)
public
String
[]
uploadFile
(
HttpServletRequest
request
)
{
String
[]
infos
=
new
String
[
5
];
// 验证
infos
[
0
]
=
this
.
validateFields
(
request
);
// 初始化表单元素
Map
<
String
,
Object
>
fieldsMap
=
new
HashMap
<
String
,
Object
>();
if
(
"true"
.
equals
(
infos
[
0
]))
{
fieldsMap
=
this
.
initFields
(
request
);
}
// 上传
List
<
FileItem
>
fiList
=
(
List
<
FileItem
>)
fieldsMap
.
get
(
UploadUtils
.
FILE_FIELDS
);
if
(
fiList
!=
null
)
{
for
(
FileItem
item
:
fiList
)
{
infos
[
1
]
=
this
.
saveFile
(
item
);
}
infos
[
2
]
=
savePath
;
infos
[
3
]
=
saveUrl
;
infos
[
4
]
=
fileUrl
;
}
return
infos
;
}
/**
* 上传验证,并初始化文件目录
*
* @param request
*/
private
String
validateFields
(
HttpServletRequest
request
)
{
String
errorInfo
=
"true"
;
// boolean errorFlag = true;
// 获取内容类型
String
contentType
=
request
.
getContentType
();
int
contentLength
=
request
.
getContentLength
();
// 文件保存目录路径
savePath
=
request
.
getSession
().
getServletContext
().
getRealPath
(
"/"
)
+
basePath
+
"/"
;
// 文件保存目录URL
saveUrl
=
request
.
getContextPath
()
+
"/"
+
basePath
+
"/"
;
File
uploadDir
=
new
File
(
savePath
);
if
(
contentType
==
null
||
!
contentType
.
startsWith
(
"multipart"
))
{
// TODO
System
.
out
.
println
(
"请求不包含multipart/form-data流"
);
errorInfo
=
"请求不包含multipart/form-data流"
;
}
else
if
(
maxSize
<
contentLength
)
{
// TODO
System
.
out
.
println
(
"上传文件大小超出文件最大大小"
);
errorInfo
=
"上传文件大小超出文件最大大小["
+
maxSize
+
"]"
;
}
else
if
(!
ServletFileUpload
.
isMultipartContent
(
request
))
{
// TODO
errorInfo
=
"请选择文件"
;
}
else
if
(!
uploadDir
.
isDirectory
())
{
// 检查目录
// TODO
errorInfo
=
"上传目录["
+
savePath
+
"]不存在"
;
}
else
if
(!
uploadDir
.
canWrite
())
{
// TODO
errorInfo
=
"上传目录["
+
savePath
+
"]没有写权限"
;
}
else
if
(!
extMap
.
containsKey
(
dirName
))
{
// TODO
errorInfo
=
"目录名不正确"
;
}
else
{
// .../basePath/dirName/
// 创建文件夹
savePath
+=
dirName
+
"/"
;
saveUrl
+=
dirName
+
"/"
;
File
saveDirFile
=
new
File
(
savePath
);
if
(!
saveDirFile
.
exists
())
{
saveDirFile
.
mkdirs
();
}
// .../basePath/dirName/yyyyMMdd/
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyyMMdd"
);
String
ymd
=
sdf
.
format
(
new
Date
());
savePath
+=
ymd
+
"/"
;
saveUrl
+=
ymd
+
"/"
;
File
dirFile
=
new
File
(
savePath
);
if
(!
dirFile
.
exists
())
{
dirFile
.
mkdirs
();
}
// 获取上传临时路径
tempPath
=
request
.
getSession
().
getServletContext
().
getRealPath
(
"/"
)
+
tempPath
+
"/"
;
File
file
=
new
File
(
tempPath
);
if
(!
file
.
exists
())
{
file
.
mkdirs
();
}
}
return
errorInfo
;
}
/**
* 处理上传内容
*
* @param request
* @param maxSize
* @return
*/
// @SuppressWarnings("unchecked")
private
Map
<
String
,
Object
>
initFields
(
HttpServletRequest
request
)
{
// 存储表单字段和非表单字段
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
// 第一步:判断request
boolean
isMultipart
=
ServletFileUpload
.
isMultipartContent
(
request
);
// 第二步:解析request
if
(
isMultipart
)
{
// Create a factory for disk-based file items
DiskFileItemFactory
factory
=
new
DiskFileItemFactory
();
// 阀值,超过这个值才会写到临时目录,否则在内存中
factory
.
setSizeThreshold
(
1024
*
1024
*
10
);
factory
.
setRepository
(
new
File
(
tempPath
));
// Create a new file upload handler
ServletFileUpload
upload
=
new
ServletFileUpload
(
factory
);
upload
.
setHeaderEncoding
(
"UTF-8"
);
// 最大上传限制
upload
.
setSizeMax
(
maxSize
);
/* FileItem */
List
<
FileItem
>
items
=
null
;
// Parse the request
try
{
items
=
upload
.
parseRequest
(
request
);
}
catch
(
FileUploadException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
// 第3步:处理uploaded items
if
(
items
!=
null
&&
items
.
size
()
>
0
)
{
Iterator
<
FileItem
>
iter
=
items
.
iterator
();
// 文件域对象
List
<
FileItem
>
list
=
new
ArrayList
<
FileItem
>();
// 表单字段
Map
<
String
,
String
>
fields
=
new
HashMap
<
String
,
String
>();
while
(
iter
.
hasNext
())
{
FileItem
item
=
iter
.
next
();
// 处理所有表单元素和文件域表单元素
if
(
item
.
isFormField
())
{
// 表单元素
String
name
=
item
.
getFieldName
();
String
value
=
item
.
getString
();
fields
.
put
(
name
,
value
);
}
else
{
// 文件域表单元素
list
.
add
(
item
);
}
}
map
.
put
(
FORM_FIELDS
,
fields
);
map
.
put
(
FILE_FIELDS
,
list
);
}
}
return
map
;
}
/**
* 保存文件
*
* @param obj
* 要上传的文件域
* @param file
* @return
*/
private
String
saveFile
(
FileItem
item
)
{
String
error
=
"true"
;
String
fileName
=
item
.
getName
();
String
fileExt
=
fileName
.
substring
(
fileName
.
lastIndexOf
(
"."
)
+
1
).
toLowerCase
();
if
(
item
.
getSize
()
>
maxSize
)
{
// 检查文件大小
// TODO
error
=
"上传文件大小超过限制"
;
}
else
if
(!
Arrays
.<
String
>
asList
(
extMap
.
get
(
dirName
).
split
(
","
)).
contains
(
fileExt
))
{
// 检查扩展名
error
=
"上传文件扩展名是不允许的扩展名。\n只允许"
+
extMap
.
get
(
dirName
)
+
"格式。"
;
}
else
{
String
newFileName
;
if
(
""
.
equals
(
fileName
.
trim
()))
{
SimpleDateFormat
df
=
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
);
newFileName
=
df
.
format
(
new
Date
())
+
"_"
+
new
Random
().
nextInt
(
1000
)
+
"."
+
fileExt
;
}
else
{
newFileName
=
fileName
+
"."
+
fileExt
;
}
// .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx
fileUrl
=
saveUrl
+
newFileName
;
try
{
File
uploadedFile
=
new
File
(
savePath
,
newFileName
);
item
.
write
(
uploadedFile
);
/*
* FileOutputStream fos = new FileOutputStream(uploadFile); // 文件全在内存中 if (item.isInMemory()) { fos.write(item.get()); } else { InputStream is = item.getInputStream(); byte[] buffer =
* new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } is.close(); } fos.close(); item.delete();
*/
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
System
.
out
.
println
(
"上传失败了!!!"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
return
error
;
}
/** **********************get/set方法********************************* */
public
String
getSavePath
()
{
return
savePath
;
}
public
String
getSaveUrl
()
{
return
saveUrl
;
}
public
long
getMaxSize
()
{
return
maxSize
;
}
public
void
setMaxSize
(
long
maxSize
)
{
this
.
maxSize
=
maxSize
;
}
public
Map
<
String
,
String
>
getExtMap
()
{
return
extMap
;
}
public
void
setExtMap
(
Map
<
String
,
String
>
extMap
)
{
this
.
extMap
=
extMap
;
}
public
String
getBasePath
()
{
return
basePath
;
}
public
void
setBasePath
(
String
basePath
)
{
this
.
basePath
=
basePath
;
tempPath
=
basePath
+
TEMP_PATH
;
}
public
String
getDirName
()
{
return
dirName
;
}
public
void
setDirName
(
String
dirName
)
{
this
.
dirName
=
dirName
;
}
public
String
getTempPath
()
{
return
tempPath
;
}
public
void
setTempPath
(
String
tempPath
)
{
this
.
tempPath
=
tempPath
;
}
public
String
getFileUrl
()
{
return
fileUrl
;
}
public
String
getFileName
()
{
return
fileName
;
}
public
void
setFileName
(
String
fileName
)
{
this
.
fileName
=
fileName
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/UserAgentUtils.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
javax.servlet.http.HttpServletRequest
;
import
eu.bitwalker.useragentutils.Browser
;
import
eu.bitwalker.useragentutils.DeviceType
;
import
eu.bitwalker.useragentutils.UserAgent
;
/**
* 用户代理字符串识别工具
* @author 黄炳桂 516821420@qq.com
* @version 2014-6-13
*/
public
class
UserAgentUtils
{
/**
* 获取用户代理对象
* @param request
* @return
*/
public
static
UserAgent
getUserAgent
(
HttpServletRequest
request
){
return
UserAgent
.
parseUserAgentString
(
request
.
getHeader
(
"User-Agent"
));
}
/**
* 获取设备类型
* @param request
* @return
*/
public
static
DeviceType
getDeviceType
(
HttpServletRequest
request
){
return
getUserAgent
(
request
).
getOperatingSystem
().
getDeviceType
();
}
/**
* 是否是PC
* @param request
* @return
*/
public
static
boolean
isComputer
(
HttpServletRequest
request
){
return
DeviceType
.
COMPUTER
.
equals
(
getDeviceType
(
request
));
}
/**
* 是否是手机
* @param request
* @return
*/
public
static
boolean
isMobile
(
HttpServletRequest
request
){
return
DeviceType
.
MOBILE
.
equals
(
getDeviceType
(
request
));
}
/**
* 是否是平板
* @param request
* @return
*/
public
static
boolean
isTablet
(
HttpServletRequest
request
){
return
DeviceType
.
TABLET
.
equals
(
getDeviceType
(
request
));
}
/**
* 是否是手机和平板
* @param request
* @return
*/
public
static
boolean
isMobileOrTablet
(
HttpServletRequest
request
){
DeviceType
deviceType
=
getDeviceType
(
request
);
return
DeviceType
.
MOBILE
.
equals
(
deviceType
)
||
DeviceType
.
TABLET
.
equals
(
deviceType
);
}
/**
* 获取浏览类型
* @param request
* @return
*/
public
static
Browser
getBrowser
(
HttpServletRequest
request
){
return
getUserAgent
(
request
).
getBrowser
();
}
/**
* 是否IE版本是否小于等于IE8
* @param request
* @return
*/
public
static
boolean
isLteIE8
(
HttpServletRequest
request
){
Browser
browser
=
getBrowser
(
request
);
return
Browser
.
IE5
.
equals
(
browser
)
||
Browser
.
IE6
.
equals
(
browser
)
||
Browser
.
IE7
.
equals
(
browser
)
||
Browser
.
IE8
.
equals
(
browser
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/WorkDayUtils.java
deleted
100644 → 0
View file @
b6becbcd
package
com.jeespring.common.utils
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
public
class
WorkDayUtils
{
public
static
void
main
(
String
[]
args
)
{
try
{
String
strDateStart
=
"2013-08-01"
;
String
strDateEnd
=
"2014-08-31"
;
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
Date
date_start
=
sdf
.
parse
(
strDateStart
);
Date
date_end
=
sdf
.
parse
(
strDateEnd
);
WorkDayUtils
app
=
new
WorkDayUtils
();
Calendar
cal_start
=
Calendar
.
getInstance
();
Calendar
cal_end
=
Calendar
.
getInstance
();
cal_start
.
setTime
(
date_start
);
cal_end
.
setTime
(
date_end
);
System
.
out
.
println
(
"开始日:"
+
cal_start
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
cal_start
.
get
(
Calendar
.
MONTH
)
+
1
)
+
"-"
+
cal_start
.
get
(
Calendar
.
DAY_OF_MONTH
)
+
" "
+
app
.
getChineseWeek
(
cal_start
));
System
.
out
.
println
(
"结束日:"
+
cal_end
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
cal_end
.
get
(
Calendar
.
MONTH
)
+
1
)
+
"-"
+
cal_end
.
get
(
Calendar
.
DAY_OF_MONTH
)
+
" "
+
app
.
getChineseWeek
(
cal_end
));
System
.
out
.
println
(
"工作日:"
+
app
.
getWorkingDay
(
cal_start
,
cal_end
));
System
.
out
.
println
(
"休息日:"
+
app
.
getHolidays
(
cal_start
,
cal_end
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 获取日期之间的天数
* @param d1
* @param d2
* @return
*/
public
int
getDaysBetween
(
Calendar
d1
,
Calendar
d2
)
{
if
(
d1
.
after
(
d2
))
{
// swap dates so that d1 is start and d2 is end
Calendar
swap
=
d1
;
d1
=
d2
;
d2
=
swap
;
}
int
days
=
d2
.
get
(
Calendar
.
DAY_OF_YEAR
)
-
d1
.
get
(
Calendar
.
DAY_OF_YEAR
);
int
y2
=
d2
.
get
(
Calendar
.
YEAR
);
if
(
d1
.
get
(
Calendar
.
YEAR
)
!=
y2
)
{
d1
=
(
Calendar
)
d1
.
clone
();
do
{
days
+=
d1
.
getActualMaximum
(
Calendar
.
DAY_OF_YEAR
);
d1
.
add
(
Calendar
.
YEAR
,
1
);
}
while
(
d1
.
get
(
Calendar
.
YEAR
)
!=
y2
);
}
return
days
;
}
/**
* 获取工作日
* @param d1
* @param d2
* @return
*/
public
int
getWorkingDay
(
Calendar
d1
,
Calendar
d2
)
{
int
result
=
-
1
;
if
(
d1
.
after
(
d2
))
{
// swap dates so that d1 is start and d2 is end
Calendar
swap
=
d1
;
d1
=
d2
;
d2
=
swap
;
}
// int betweendays = getDaysBetween(d1, d2);
// int charge_date = 0;
int
charge_start_date
=
0
;
// 开始日期的日期偏移量
int
charge_end_date
=
0
;
// 结束日期的日期偏移量
// 日期不在同一个日期内
int
stmp
;
int
etmp
;
stmp
=
7
-
d1
.
get
(
Calendar
.
DAY_OF_WEEK
);
etmp
=
7
-
d2
.
get
(
Calendar
.
DAY_OF_WEEK
);
if
(
stmp
!=
0
&&
stmp
!=
6
)
{
// 开始日期为星期六和星期日时偏移量为0
charge_start_date
=
stmp
-
1
;
}
if
(
etmp
!=
0
&&
etmp
!=
6
)
{
// 结束日期为星期六和星期日时偏移量为0
charge_end_date
=
etmp
-
1
;
}
// }
result
=
(
getDaysBetween
(
this
.
getNextMonday
(
d1
),
this
.
getNextMonday
(
d2
))
/
7
)
*
5
+
charge_start_date
-
charge_end_date
;
// System.out.println("charge_start_date>" + charge_start_date);
// System.out.println("charge_end_date>" + charge_end_date);
// System.out.println("between day is-->" + betweendays);
return
result
;
}
/**
* 获取中文日期
* @param date
* @return
*/
public
String
getChineseWeek
(
Calendar
date
)
{
final
String
[]
dayNames
=
{
"星期日"
,
"星期一"
,
"星期二"
,
"星期三"
,
"星期四"
,
"星期五"
,
"星期六"
};
int
dayOfWeek
=
date
.
get
(
Calendar
.
DAY_OF_WEEK
);
// System.out.println(dayNames[dayOfWeek - 1]);
return
dayNames
[
dayOfWeek
-
1
];
}
/**
* 获得日期的下一个星期一的日期
* @param date
* @return
*/
public
Calendar
getNextMonday
(
Calendar
date
)
{
Calendar
result
=
null
;
result
=
date
;
do
{
result
=
(
Calendar
)
result
.
clone
();
result
.
add
(
Calendar
.
DATE
,
1
);
}
while
(
result
.
get
(
Calendar
.
DAY_OF_WEEK
)
!=
2
);
return
result
;
}
/**
* 获取休息日
* @param d1
* @param d2
* @return
*/
public
int
getHolidays
(
Calendar
d1
,
Calendar
d2
)
{
return
this
.
getDaysBetween
(
d1
,
d2
)
-
this
.
getWorkingDay
(
d1
,
d2
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ZxingHandler.java
deleted
100644 → 0
View file @
b6becbcd
package
com.jeespring.common.utils
;
import
java.awt.image.BufferedImage
;
import
java.io.File
;
import
java.util.Hashtable
;
import
javax.imageio.ImageIO
;
import
com.google.zxing.BarcodeFormat
;
import
com.google.zxing.BinaryBitmap
;
import
com.google.zxing.DecodeHintType
;
import
com.google.zxing.EncodeHintType
;
import
com.google.zxing.LuminanceSource
;
import
com.google.zxing.MultiFormatReader
;
import
com.google.zxing.MultiFormatWriter
;
import
com.google.zxing.Result
;
import
com.google.zxing.client.j2se.BufferedImageLuminanceSource
;
import
com.google.zxing.client.j2se.MatrixToImageWriter
;
import
com.google.zxing.common.BitMatrix
;
import
com.google.zxing.common.HybridBinarizer
;
import
com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
;
/**
* 条形码和二维码编码解码
*
* @author JeeSpring
* @version 2014-02-28
*/
public
class
ZxingHandler
{
/**
* 条形码编码
*
* @param contents
* @param width
* @param height
* @param imgPath
*/
public
static
void
encode
(
String
contents
,
int
width
,
int
height
,
String
imgPath
)
{
int
codeWidth
=
3
+
// start guard
(
7
*
6
)
+
// left bars
5
+
// middle guard
(
7
*
6
)
+
// right bars
3
;
// end guard
codeWidth
=
Math
.
max
(
codeWidth
,
width
);
try
{
BitMatrix
bitMatrix
=
new
MultiFormatWriter
().
encode
(
contents
,
BarcodeFormat
.
EAN_13
,
codeWidth
,
height
,
null
);
MatrixToImageWriter
.
writeToFile
(
bitMatrix
,
"png"
,
new
File
(
imgPath
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 条形码解码
*
* @param imgPath
* @return String
*/
public
static
String
decode
(
String
imgPath
)
{
BufferedImage
image
=
null
;
Result
result
=
null
;
try
{
image
=
ImageIO
.
read
(
new
File
(
imgPath
));
if
(
image
==
null
)
{
System
.
out
.
println
(
"the decode image may be not exit."
);
}
LuminanceSource
source
=
new
BufferedImageLuminanceSource
(
image
);
BinaryBitmap
bitmap
=
new
BinaryBitmap
(
new
HybridBinarizer
(
source
));
result
=
new
MultiFormatReader
().
decode
(
bitmap
,
null
);
return
result
.
getText
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* 二维码编码
*
* @param contents
* @param width
* @param height
* @param imgPath
*/
public
static
void
encode2
(
String
contents
,
int
width
,
int
height
,
String
imgPath
)
{
Hashtable
<
EncodeHintType
,
Object
>
hints
=
new
Hashtable
<
EncodeHintType
,
Object
>();
// 指定纠错等级
hints
.
put
(
EncodeHintType
.
ERROR_CORRECTION
,
ErrorCorrectionLevel
.
L
);
// 指定编码格式
hints
.
put
(
EncodeHintType
.
CHARACTER_SET
,
"GBK"
);
try
{
BitMatrix
bitMatrix
=
new
MultiFormatWriter
().
encode
(
contents
,
BarcodeFormat
.
QR_CODE
,
width
,
height
,
hints
);
MatrixToImageWriter
.
writeToFile
(
bitMatrix
,
"png"
,
new
File
(
imgPath
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 二维码解码
*
* @param imgPath
* @return String
*/
public
static
String
decode2
(
String
imgPath
)
{
BufferedImage
image
=
null
;
Result
result
=
null
;
try
{
image
=
ImageIO
.
read
(
new
File
(
imgPath
));
if
(
image
==
null
)
{
System
.
out
.
println
(
"the decode image may be not exit."
);
}
LuminanceSource
source
=
new
BufferedImageLuminanceSource
(
image
);
BinaryBitmap
bitmap
=
new
BinaryBitmap
(
new
HybridBinarizer
(
source
));
Hashtable
<
DecodeHintType
,
Object
>
hints
=
new
Hashtable
<
DecodeHintType
,
Object
>();
hints
.
put
(
DecodeHintType
.
CHARACTER_SET
,
"GBK"
);
result
=
new
MultiFormatReader
().
decode
(
bitmap
,
hints
);
return
result
.
getText
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* @param args
*/
public
static
void
main
(
String
[]
args
)
{
// 条形码
String
imgPath
=
"target\\zxing_EAN13.png"
;
String
contents
=
"6923450657713"
;
int
width
=
105
,
height
=
50
;
ZxingHandler
.
encode
(
contents
,
width
,
height
,
imgPath
);
System
.
out
.
println
(
"finished zxing EAN-13 encode."
);
String
decodeContent
=
ZxingHandler
.
decode
(
imgPath
);
System
.
out
.
println
(
"解码内容如下:"
+
decodeContent
);
System
.
out
.
println
(
"finished zxing EAN-13 decode."
);
// 二维码
String
imgPath2
=
"target\\zxing.png"
;
String
contents2
=
"Hello Gem, welcome to Zxing!"
+
"\nBlog [ http://thinkgem.iteye.com ]"
+
"\nEMail [ thinkgem@163.com ]"
;
int
width2
=
300
,
height2
=
300
;
ZxingHandler
.
encode2
(
contents2
,
width2
,
height2
,
imgPath2
);
System
.
out
.
println
(
"finished zxing encode."
);
String
decodeContent2
=
ZxingHandler
.
decode2
(
imgPath2
);
System
.
out
.
println
(
"解码内容如下:"
+
decodeContent2
);
System
.
out
.
println
(
"finished zxing decode."
);
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/bean/BeanUtils.java
deleted
100644 → 0
View file @
b6becbcd
package
com.jeespring.common.utils.bean
;
import
java.lang.reflect.Method
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* Bean 工具类
*
* @author JeeSpring
*/
public
class
BeanUtils
{
/** Bean方法名中属性名开始的下标 */
private
static
final
int
BEAN_METHOD_PROP_INDEX
=
3
;
/** * 匹配getter方法的正则表达式 */
private
static
final
Pattern
GET_PATTERN
=
Pattern
.
compile
(
"get(\\p{javaUpperCase}\\w*)"
);
/** * 匹配setter方法的正则表达式 */
private
static
final
Pattern
SET_PATTERN
=
Pattern
.
compile
(
"set(\\p{javaUpperCase}\\w*)"
);
/**
* Bean属性复制工具方法。
*
* @param dest 目标对象
* @param src 源对象
*/
public
static
void
copyBeanProp
(
Object
dest
,
Object
src
)
{
List
<
Method
>
destSetters
=
getSetterMethods
(
dest
);
List
<
Method
>
srcGetters
=
getGetterMethods
(
src
);
try
{
for
(
Method
setter
:
destSetters
)
{
for
(
Method
getter
:
srcGetters
)
{
if
(
isMethodPropEquals
(
setter
.
getName
(),
getter
.
getName
())
&&
setter
.
getParameterTypes
()[
0
].
equals
(
getter
.
getReturnType
()))
{
setter
.
invoke
(
dest
,
getter
.
invoke
(
src
));
}
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 获取对象的setter方法。
*
* @param obj 对象
* @return 对象的setter方法列表
*/
public
static
List
<
Method
>
getSetterMethods
(
Object
obj
)
{
// setter方法列表
List
<
Method
>
setterMethods
=
new
ArrayList
<
Method
>();
// 获取所有方法
Method
[]
methods
=
obj
.
getClass
().
getMethods
();
// 查找setter方法
for
(
Method
method
:
methods
)
{
Matcher
m
=
SET_PATTERN
.
matcher
(
method
.
getName
());
if
(
m
.
matches
()
&&
(
method
.
getParameterTypes
().
length
==
1
))
{
setterMethods
.
add
(
method
);
}
}
// 返回setter方法列表
return
setterMethods
;
}
/**
* 获取对象的getter方法。
*
* @param obj 对象
* @return 对象的getter方法列表
*/
public
static
List
<
Method
>
getGetterMethods
(
Object
obj
)
{
// getter方法列表
List
<
Method
>
getterMethods
=
new
ArrayList
<
Method
>();
// 获取所有方法
Method
[]
methods
=
obj
.
getClass
().
getMethods
();
// 查找getter方法
for
(
Method
method
:
methods
)
{
Matcher
m
=
GET_PATTERN
.
matcher
(
method
.
getName
());
if
(
m
.
matches
()
&&
(
method
.
getParameterTypes
().
length
==
0
))
{
getterMethods
.
add
(
method
);
}
}
// 返回getter方法列表
return
getterMethods
;
}
/**
* 检查Bean方法名中的属性名是否相等。<br>
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
*
* @param m1 方法名1
* @param m2 方法名2
* @return 属性名一样返回true,否则返回false
*/
public
static
boolean
isMethodPropEquals
(
String
m1
,
String
m2
)
{
return
m1
.
substring
(
BEAN_METHOD_PROP_INDEX
).
equals
(
m2
.
substring
(
BEAN_METHOD_PROP_INDEX
));
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/ExportExcel.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.Cell
;
import
org.apache.poi.ss.usermodel.CellStyle
;
import
org.apache.poi.ss.usermodel.Comment
;
import
org.apache.poi.ss.usermodel.Font
;
import
org.apache.poi.ss.usermodel.IndexedColors
;
import
org.apache.poi.ss.usermodel.Row
;
import
org.apache.poi.ss.usermodel.Sheet
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.apache.poi.ss.util.CellRangeAddress
;
import
org.apache.poi.xssf.streaming.SXSSFWorkbook
;
import
org.apache.poi.xssf.usermodel.XSSFClientAnchor
;
import
org.apache.poi.xssf.usermodel.XSSFRichTextString
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.collect.Lists
;
import
com.jeespring.common.utils.Encodes
;
import
com.jeespring.common.utils.Reflections
;
import
com.jeespring.common.utils.excel.annotation.ExcelField
;
import
com.jeespring.modules.sys.utils.DictUtils
;
/**
* 导出Excel文件(导出“XLSX”格式,支持大数据量导出 @see org.apache.poi.ss.SpreadsheetVersion)
* @author 黄炳桂 516821420@qq.com
* @version 2013-04-21
*/
public
class
ExportExcel
{
private
static
Logger
log
=
LoggerFactory
.
getLogger
(
ExportExcel
.
class
);
/**
* 工作薄对象
*/
private
SXSSFWorkbook
wb
;
/**
* 工作表对象
*/
private
Sheet
sheet
;
/**
* 样式列表
*/
private
Map
<
String
,
CellStyle
>
styles
;
/**
* 当前行号
*/
private
int
rownum
;
/**
* 注解列表(Object[]{ ExcelField, Field/Method })
*/
List
<
Object
[]>
annotationList
=
Lists
.
newArrayList
();
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param cls 实体对象,通过annotation.ExportField获取标题
*/
public
ExportExcel
(
String
title
,
Class
<?>
cls
){
this
(
title
,
cls
,
1
);
}
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param cls 实体对象,通过annotation.ExportField获取标题
* @param type 导出类型(1:导出数据;2:导出模板)
* @param groups 导入分组
*/
public
ExportExcel
(
String
title
,
Class
<?>
cls
,
int
type
,
int
...
groups
){
// Get annotation field
Field
[]
fs
=
cls
.
getDeclaredFields
();
for
(
Field
f
:
fs
){
ExcelField
ef
=
f
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
type
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
}
}
}
// Get annotation method
Method
[]
ms
=
cls
.
getDeclaredMethods
();
for
(
Method
m
:
ms
){
ExcelField
ef
=
m
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
type
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
}
}
}
// Field sorting
Collections
.
sort
(
annotationList
,
new
Comparator
<
Object
[]>()
{
@Override
public
int
compare
(
Object
[]
o1
,
Object
[]
o2
)
{
return
new
Integer
(((
ExcelField
)
o1
[
0
]).
sort
()).
compareTo
(
new
Integer
(((
ExcelField
)
o2
[
0
]).
sort
()));
};
});
// Initialize
List
<
String
>
headerList
=
Lists
.
newArrayList
();
for
(
Object
[]
os
:
annotationList
){
String
t
=
((
ExcelField
)
os
[
0
]).
title
();
// 如果是导出,则去掉注释
if
(
type
==
1
){
String
[]
ss
=
StringUtils
.
split
(
t
,
"**"
,
2
);
if
(
ss
.
length
==
2
){
t
=
ss
[
0
];
}
}
headerList
.
add
(
t
);
}
initialize
(
title
,
headerList
);
}
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param headers 表头数组
*/
public
ExportExcel
(
String
title
,
String
[]
headers
)
{
initialize
(
title
,
Lists
.
newArrayList
(
headers
));
}
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param headerList 表头列表
*/
public
ExportExcel
(
String
title
,
List
<
String
>
headerList
)
{
initialize
(
title
,
headerList
);
}
/**
* 初始化函数
* @param title 表格标题,传“空值”,表示无标题
* @param headerList 表头列表
*/
private
void
initialize
(
String
title
,
List
<
String
>
headerList
)
{
this
.
wb
=
new
SXSSFWorkbook
(
500
);
this
.
sheet
=
wb
.
createSheet
(
"Export"
);
this
.
styles
=
createStyles
(
wb
);
// Create title
if
(
StringUtils
.
isNotBlank
(
title
)){
Row
titleRow
=
sheet
.
createRow
(
rownum
++);
titleRow
.
setHeightInPoints
(
30
);
Cell
titleCell
=
titleRow
.
createCell
(
0
);
titleCell
.
setCellStyle
(
styles
.
get
(
"title"
));
titleCell
.
setCellValue
(
title
);
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
titleRow
.
getRowNum
(),
titleRow
.
getRowNum
(),
titleRow
.
getRowNum
(),
headerList
.
size
()-
1
));
}
// Create header
if
(
headerList
==
null
){
throw
new
RuntimeException
(
"headerList not null!"
);
}
Row
headerRow
=
sheet
.
createRow
(
rownum
++);
headerRow
.
setHeightInPoints
(
16
);
for
(
int
i
=
0
;
i
<
headerList
.
size
();
i
++)
{
Cell
cell
=
headerRow
.
createCell
(
i
);
cell
.
setCellStyle
(
styles
.
get
(
"header"
));
String
[]
ss
=
StringUtils
.
split
(
headerList
.
get
(
i
),
"**"
,
2
);
if
(
ss
.
length
==
2
){
cell
.
setCellValue
(
ss
[
0
]);
Comment
comment
=
this
.
sheet
.
createDrawingPatriarch
().
createCellComment
(
new
XSSFClientAnchor
(
0
,
0
,
0
,
0
,
(
short
)
3
,
3
,
(
short
)
5
,
6
));
comment
.
setString
(
new
XSSFRichTextString
(
ss
[
1
]));
cell
.
setCellComment
(
comment
);
}
else
{
cell
.
setCellValue
(
headerList
.
get
(
i
));
}
sheet
.
autoSizeColumn
(
i
);
}
for
(
int
i
=
0
;
i
<
headerList
.
size
();
i
++)
{
int
colWidth
=
sheet
.
getColumnWidth
(
i
)*
2
;
sheet
.
setColumnWidth
(
i
,
colWidth
<
3000
?
3000
:
colWidth
);
}
log
.
debug
(
"Initialize success."
);
}
/**
* 创建表格样式
* @param wb 工作薄对象
* @return 样式列表
*/
private
Map
<
String
,
CellStyle
>
createStyles
(
Workbook
wb
)
{
Map
<
String
,
CellStyle
>
styles
=
new
HashMap
<
String
,
CellStyle
>();
CellStyle
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
CellStyle
.
ALIGN_CENTER
);
style
.
setVerticalAlignment
(
CellStyle
.
VERTICAL_CENTER
);
Font
titleFont
=
wb
.
createFont
();
titleFont
.
setFontName
(
"Arial"
);
titleFont
.
setFontHeightInPoints
((
short
)
16
);
titleFont
.
setBoldweight
(
Font
.
BOLDWEIGHT_BOLD
);
style
.
setFont
(
titleFont
);
styles
.
put
(
"title"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
setVerticalAlignment
(
CellStyle
.
VERTICAL_CENTER
);
style
.
setBorderRight
(
CellStyle
.
BORDER_THIN
);
style
.
setRightBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderLeft
(
CellStyle
.
BORDER_THIN
);
style
.
setLeftBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderTop
(
CellStyle
.
BORDER_THIN
);
style
.
setTopBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderBottom
(
CellStyle
.
BORDER_THIN
);
style
.
setBottomBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
Font
dataFont
=
wb
.
createFont
();
dataFont
.
setFontName
(
"Arial"
);
dataFont
.
setFontHeightInPoints
((
short
)
10
);
style
.
setFont
(
dataFont
);
styles
.
put
(
"data"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
CellStyle
.
ALIGN_LEFT
);
styles
.
put
(
"data1"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
CellStyle
.
ALIGN_CENTER
);
styles
.
put
(
"data2"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
CellStyle
.
ALIGN_RIGHT
);
styles
.
put
(
"data3"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
// style.setWrapText(true);
style
.
setAlignment
(
CellStyle
.
ALIGN_CENTER
);
style
.
setFillForegroundColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setFillPattern
(
CellStyle
.
SOLID_FOREGROUND
);
Font
headerFont
=
wb
.
createFont
();
headerFont
.
setFontName
(
"Arial"
);
headerFont
.
setFontHeightInPoints
((
short
)
10
);
headerFont
.
setBoldweight
(
Font
.
BOLDWEIGHT_BOLD
);
headerFont
.
setColor
(
IndexedColors
.
WHITE
.
getIndex
());
style
.
setFont
(
headerFont
);
styles
.
put
(
"header"
,
style
);
return
styles
;
}
/**
* 添加一行
* @return 行对象
*/
public
Row
addRow
(){
return
sheet
.
createRow
(
rownum
++);
}
/**
* 添加一个单元格
* @param row 添加的行
* @param column 添加列号
* @param val 添加值
* @return 单元格对象
*/
public
Cell
addCell
(
Row
row
,
int
column
,
Object
val
){
return
this
.
addCell
(
row
,
column
,
val
,
0
,
Class
.
class
);
}
/**
* 添加一个单元格
* @param row 添加的行
* @param column 添加列号
* @param val 添加值
* @param align 对齐方式(1:靠左;2:居中;3:靠右)
* @return 单元格对象
*/
public
Cell
addCell
(
Row
row
,
int
column
,
Object
val
,
int
align
,
Class
<?>
fieldType
){
Cell
cell
=
row
.
createCell
(
column
);
String
cellFormatString
=
"@"
;
try
{
if
(
val
==
null
){
cell
.
setCellValue
(
""
);
}
else
if
(
fieldType
!=
Class
.
class
){
cell
.
setCellValue
((
String
)
fieldType
.
getMethod
(
"setValue"
,
Object
.
class
).
invoke
(
null
,
val
));
}
else
{
if
(
val
instanceof
String
)
{
cell
.
setCellValue
((
String
)
val
);
}
else
if
(
val
instanceof
Integer
)
{
cell
.
setCellValue
((
Integer
)
val
);
cellFormatString
=
"0"
;
}
else
if
(
val
instanceof
Long
)
{
cell
.
setCellValue
((
Long
)
val
);
cellFormatString
=
"0"
;
}
else
if
(
val
instanceof
Double
)
{
cell
.
setCellValue
((
Double
)
val
);
cellFormatString
=
"0.00"
;
}
else
if
(
val
instanceof
Float
)
{
cell
.
setCellValue
((
Float
)
val
);
cellFormatString
=
"0.00"
;
}
else
if
(
val
instanceof
Date
)
{
cell
.
setCellValue
((
Date
)
val
);
cellFormatString
=
"yyyy-MM-dd HH:mm"
;
}
else
{
cell
.
setCellValue
((
String
)
Class
.
forName
(
this
.
getClass
().
getName
().
replaceAll
(
this
.
getClass
().
getSimpleName
(),
"fieldtype."
+
val
.
getClass
().
getSimpleName
()+
"Type"
)).
getMethod
(
"setValue"
,
Object
.
class
).
invoke
(
null
,
val
));
}
}
if
(
val
!=
null
){
CellStyle
style
=
styles
.
get
(
"data_column_"
+
column
);
if
(
style
==
null
){
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
+(
align
>=
1
&&
align
<=
3
?
align:
""
)));
style
.
setDataFormat
(
wb
.
createDataFormat
().
getFormat
(
cellFormatString
));
styles
.
put
(
"data_column_"
+
column
,
style
);
}
cell
.
setCellStyle
(
style
);
}
}
catch
(
Exception
ex
)
{
log
.
info
(
"Set cell value ["
+
row
.
getRowNum
()+
","
+
column
+
"] error: "
+
ex
.
toString
());
cell
.
setCellValue
(
val
.
toString
());
}
return
cell
;
}
/**
* 添加数据(通过annotation.ExportField添加数据)
* @return list 数据列表
*/
public
<
E
>
ExportExcel
setDataList
(
List
<
E
>
list
){
for
(
E
e
:
list
){
int
colunm
=
0
;
Row
row
=
this
.
addRow
();
StringBuilder
sb
=
new
StringBuilder
();
for
(
Object
[]
os
:
annotationList
){
ExcelField
ef
=
(
ExcelField
)
os
[
0
];
Object
val
=
null
;
// Get entity value
try
{
if
(
StringUtils
.
isNotBlank
(
ef
.
value
())){
val
=
Reflections
.
invokeGetter
(
e
,
ef
.
value
());
}
else
{
if
(
os
[
1
]
instanceof
Field
){
val
=
Reflections
.
invokeGetter
(
e
,
((
Field
)
os
[
1
]).
getName
());
}
else
if
(
os
[
1
]
instanceof
Method
){
val
=
Reflections
.
invokeMethod
(
e
,
((
Method
)
os
[
1
]).
getName
(),
new
Class
[]
{},
new
Object
[]
{});
}
}
// If is dict, get dict label
if
(
StringUtils
.
isNotBlank
(
ef
.
dictType
())){
val
=
DictUtils
.
getDictLabel
(
val
==
null
?
""
:
val
.
toString
(),
ef
.
dictType
(),
""
);
}
}
catch
(
Exception
ex
)
{
// Failure to ignore
log
.
info
(
ex
.
toString
());
val
=
""
;
}
this
.
addCell
(
row
,
colunm
++,
val
,
ef
.
align
(),
ef
.
fieldType
());
sb
.
append
(
val
+
", "
);
}
log
.
debug
(
"Write success: ["
+
row
.
getRowNum
()+
"] "
+
sb
.
toString
());
}
return
this
;
}
/**
* 输出数据流
* @param os 输出数据流
*/
public
ExportExcel
write
(
OutputStream
os
)
throws
IOException
{
wb
.
write
(
os
);
return
this
;
}
/**
* 输出到客户端
* @param fileName 输出文件名
*/
public
ExportExcel
write
(
HttpServletResponse
response
,
String
fileName
)
throws
IOException
{
response
.
reset
();
response
.
setContentType
(
"application/octet-stream; charset=utf-8"
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment; filename="
+
Encodes
.
urlEncode
(
fileName
));
write
(
response
.
getOutputStream
());
return
this
;
}
/**
* 输出到文件
* @param fileName 输出文件名
*/
public
ExportExcel
writeFile
(
String
name
)
throws
FileNotFoundException
,
IOException
{
FileOutputStream
os
=
new
FileOutputStream
(
name
);
this
.
write
(
os
);
return
this
;
}
/**
* 清理临时文件
*/
public
ExportExcel
dispose
(){
wb
.
dispose
();
return
this
;
}
// /**
// * 导出测试
// */
// public static void main(String[] args) throws Throwable {
//
// List<String> headerList = Lists.newArrayList();
// for (int i = 1; i <= 10; i++) {
// headerList.add("表头"+i);
// }
//
// List<String> dataRowList = Lists.newArrayList();
// for (int i = 1; i <= headerList.size(); i++) {
// dataRowList.add("数据"+i);
// }
//
// List<List<String>> dataList = Lists.newArrayList();
// for (int i = 1; i <=1000000; i++) {
// dataList.add(dataRowList);
// }
//
// ExportExcel ee = new ExportExcel("表格标题", headerList);
//
// for (int i = 0; i < dataList.size(); i++) {
// Row row = ee.addRow();
// for (int j = 0; j < dataList.get(i).size(); j++) {
// ee.addCell(row, j, dataList.get(i).get(j));
// }
// }
//
// ee.writeFile("target/export.xlsx");
//
// ee.dispose();
//
// log.debug("Export success.");
//
// }
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/ImportExcel.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.List
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.hssf.usermodel.HSSFWorkbook
;
import
org.apache.poi.openxml4j.exceptions.InvalidFormatException
;
import
org.apache.poi.ss.usermodel.Cell
;
import
org.apache.poi.ss.usermodel.DateUtil
;
import
org.apache.poi.ss.usermodel.Row
;
import
org.apache.poi.ss.usermodel.Sheet
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.apache.poi.xssf.usermodel.XSSFWorkbook
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.web.multipart.MultipartFile
;
import
com.google.common.collect.Lists
;
import
com.jeespring.common.utils.Reflections
;
import
com.jeespring.common.utils.excel.annotation.ExcelField
;
import
com.jeespring.modules.sys.utils.DictUtils
;
/**
* 导入Excel文件(支持“XLS”和“XLSX”格式)
* @author 黄炳桂 516821420@qq.com
* @version 2013-03-10
*/
public
class
ImportExcel
{
private
static
Logger
log
=
LoggerFactory
.
getLogger
(
ImportExcel
.
class
);
/**
* 工作薄对象
*/
private
Workbook
wb
;
/**
* 工作表对象
*/
private
Sheet
sheet
;
/**
* 标题行号
*/
private
int
headerNum
;
/**
* 构造函数
* @param path 导入文件,读取第一个工作表
* @param headerNum 标题行号,数据行号=标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
String
fileName
,
int
headerNum
)
throws
InvalidFormatException
,
IOException
{
this
(
new
File
(
fileName
),
headerNum
);
}
/**
* 构造函数
* @param path 导入文件对象,读取第一个工作表
* @param headerNum 标题行号,数据行号=标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
File
file
,
int
headerNum
)
throws
InvalidFormatException
,
IOException
{
this
(
file
,
headerNum
,
0
);
}
/**
* 构造函数
* @param path 导入文件
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
String
fileName
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
this
(
new
File
(
fileName
),
headerNum
,
sheetIndex
);
}
/**
* 构造函数
* @param path 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
File
file
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
this
(
file
.
getName
(),
new
FileInputStream
(
file
),
headerNum
,
sheetIndex
);
}
/**
* 构造函数
* @param file 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
MultipartFile
multipartFile
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
this
(
multipartFile
.
getOriginalFilename
(),
multipartFile
.
getInputStream
(),
headerNum
,
sheetIndex
);
}
/**
* 构造函数
* @param path 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
String
fileName
,
InputStream
is
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
if
(
StringUtils
.
isBlank
(
fileName
)){
throw
new
RuntimeException
(
"导入文档为空!"
);
}
else
if
(
fileName
.
toLowerCase
().
endsWith
(
"xls"
)){
this
.
wb
=
new
HSSFWorkbook
(
is
);
}
else
if
(
fileName
.
toLowerCase
().
endsWith
(
"xlsx"
)){
this
.
wb
=
new
XSSFWorkbook
(
is
);
}
else
{
throw
new
RuntimeException
(
"文档格式不正确!"
);
}
if
(
this
.
wb
.
getNumberOfSheets
()<
sheetIndex
){
throw
new
RuntimeException
(
"文档中没有工作表!"
);
}
this
.
sheet
=
this
.
wb
.
getSheetAt
(
sheetIndex
);
this
.
headerNum
=
headerNum
;
log
.
debug
(
"Initialize success."
);
}
/**
* 获取行对象
* @param rownum
* @return
*/
public
Row
getRow
(
int
rownum
){
return
this
.
sheet
.
getRow
(
rownum
);
}
/**
* 获取数据行号
* @return
*/
public
int
getDataRowNum
(){
return
headerNum
+
1
;
}
/**
* 获取最后一个数据行号
* @return
*/
public
int
getLastDataRowNum
(){
return
this
.
sheet
.
getLastRowNum
()+
headerNum
;
}
/**
* 获取最后一个列号
* @return
*/
public
int
getLastCellNum
(){
return
this
.
getRow
(
headerNum
).
getLastCellNum
();
}
/**
* 获取单元格值
* @param row 获取的行
* @param column 获取单元格列号
* @return 单元格值
*/
public
Object
getCellValue
(
Row
row
,
int
column
){
Object
val
=
""
;
try
{
Cell
cell
=
row
.
getCell
(
column
);
if
(
cell
!=
null
){
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_NUMERIC
){
val
=
cell
.
getNumericCellValue
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_STRING
){
val
=
cell
.
getStringCellValue
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_FORMULA
){
val
=
cell
.
getCellFormula
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_BOOLEAN
){
val
=
cell
.
getBooleanCellValue
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_ERROR
){
val
=
cell
.
getErrorCellValue
();
}
}
}
catch
(
Exception
e
)
{
return
val
;
}
return
val
;
}
/**
* 获取导入数据列表
* @param cls 导入对象类型
* @param groups 导入分组
*/
public
<
E
>
List
<
E
>
getDataList
(
Class
<
E
>
cls
,
int
...
groups
)
throws
InstantiationException
,
IllegalAccessException
{
List
<
Object
[]>
annotationList
=
Lists
.
newArrayList
();
// Get annotation field
Field
[]
fs
=
cls
.
getDeclaredFields
();
for
(
Field
f
:
fs
){
ExcelField
ef
=
f
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
2
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
}
}
}
// Get annotation method
Method
[]
ms
=
cls
.
getDeclaredMethods
();
for
(
Method
m
:
ms
){
ExcelField
ef
=
m
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
2
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
}
}
}
// Field sorting
Collections
.
sort
(
annotationList
,
new
Comparator
<
Object
[]>()
{
@Override
public
int
compare
(
Object
[]
o1
,
Object
[]
o2
)
{
return
new
Integer
(((
ExcelField
)
o1
[
0
]).
sort
()).
compareTo
(
new
Integer
(((
ExcelField
)
o2
[
0
]).
sort
()));
};
});
//log.debug("Import column count:"+annotationList.size());
// Get excel data
List
<
E
>
dataList
=
Lists
.
newArrayList
();
for
(
int
i
=
this
.
getDataRowNum
();
i
<
this
.
getLastDataRowNum
();
i
++)
{
E
e
=
cls
.
newInstance
();
int
column
=
0
;
Row
row
=
this
.
getRow
(
i
);
StringBuilder
sb
=
new
StringBuilder
();
for
(
Object
[]
os
:
annotationList
){
Object
val
=
this
.
getCellValue
(
row
,
column
++);
if
(
val
!=
null
){
ExcelField
ef
=
(
ExcelField
)
os
[
0
];
// If is dict type, get dict value
if
(
StringUtils
.
isNotBlank
(
ef
.
dictType
())){
val
=
DictUtils
.
getDictValue
(
val
.
toString
(),
ef
.
dictType
(),
""
);
//log.debug("Dictionary type value: ["+i+","+colunm+"] " + val);
}
// Get param type and type cast
Class
<?>
valType
=
Class
.
class
;
if
(
os
[
1
]
instanceof
Field
){
valType
=
((
Field
)
os
[
1
]).
getType
();
}
else
if
(
os
[
1
]
instanceof
Method
){
Method
method
=
((
Method
)
os
[
1
]);
if
(
"get"
.
equals
(
method
.
getName
().
substring
(
0
,
3
))){
valType
=
method
.
getReturnType
();
}
else
if
(
"set"
.
equals
(
method
.
getName
().
substring
(
0
,
3
))){
valType
=
((
Method
)
os
[
1
]).
getParameterTypes
()[
0
];
}
}
//log.debug("Import value type: ["+i+","+column+"] " + valType);
try
{
if
(
valType
==
String
.
class
){
String
s
=
String
.
valueOf
(
val
.
toString
());
if
(
StringUtils
.
endsWith
(
s
,
".0"
)){
val
=
StringUtils
.
substringBefore
(
s
,
".0"
);
}
else
{
val
=
String
.
valueOf
(
val
.
toString
());
}
}
else
if
(
valType
==
Integer
.
class
){
val
=
Double
.
valueOf
(
val
.
toString
()).
intValue
();
}
else
if
(
valType
==
Long
.
class
){
val
=
Double
.
valueOf
(
val
.
toString
()).
longValue
();
}
else
if
(
valType
==
Double
.
class
){
val
=
Double
.
valueOf
(
val
.
toString
());
}
else
if
(
valType
==
Float
.
class
){
val
=
Float
.
valueOf
(
val
.
toString
());
}
else
if
(
valType
==
Date
.
class
){
val
=
DateUtil
.
getJavaDate
((
Double
)
val
);
}
else
{
if
(
ef
.
fieldType
()
!=
Class
.
class
){
val
=
ef
.
fieldType
().
getMethod
(
"getValue"
,
String
.
class
).
invoke
(
null
,
val
.
toString
());
}
else
{
val
=
Class
.
forName
(
this
.
getClass
().
getName
().
replaceAll
(
this
.
getClass
().
getSimpleName
(),
"fieldtype."
+
valType
.
getSimpleName
()+
"Type"
)).
getMethod
(
"getValue"
,
String
.
class
).
invoke
(
null
,
val
.
toString
());
}
}
}
catch
(
Exception
ex
)
{
log
.
info
(
"Get cell value ["
+
i
+
","
+
column
+
"] error: "
+
ex
.
toString
());
val
=
null
;
}
// set entity value
if
(
os
[
1
]
instanceof
Field
){
Reflections
.
invokeSetter
(
e
,
((
Field
)
os
[
1
]).
getName
(),
val
);
}
else
if
(
os
[
1
]
instanceof
Method
){
String
mthodName
=
((
Method
)
os
[
1
]).
getName
();
if
(
"get"
.
equals
(
mthodName
.
substring
(
0
,
3
))){
mthodName
=
"set"
+
StringUtils
.
substringAfter
(
mthodName
,
"get"
);
}
Reflections
.
invokeMethod
(
e
,
mthodName
,
new
Class
[]
{
valType
},
new
Object
[]
{
val
});
}
}
sb
.
append
(
val
+
", "
);
}
dataList
.
add
(
e
);
log
.
debug
(
"Read success: ["
+
i
+
"] "
+
sb
.
toString
());
}
return
dataList
;
}
// /**
// * 导入测试
// */
// public static void main(String[] args) throws Throwable {
//
// ImportExcel ei = new ImportExcel("target/export.xlsx", 1);
//
// for (int i = ei.getDataRowNum(); i < ei.getLastDataRowNum(); i++) {
// Row row = ei.getRow(i);
// for (int j = 0; j < ei.getLastCellNum(); j++) {
// Object val = ei.getCellValue(row, j);
// System.out.print(val+", ");
// }
// System.out.print("\n");
// }
//
// }
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/annotation/ExcelField.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel.annotation
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
/**
* Excel注解定义
* @author 黄炳桂 516821420@qq.com
* @version 2013-03-10
*/
@Target
({
ElementType
.
METHOD
,
ElementType
.
FIELD
,
ElementType
.
TYPE
})
@Retention
(
RetentionPolicy
.
RUNTIME
)
public
@interface
ExcelField
{
/**
* 导出字段名(默认调用当前字段的“get”方法,如指定导出字段为对象,请填写“对象名.对象属性”,例:“area.name”、“office.name”)
*/
String
value
()
default
""
;
/**
* 导出字段标题(需要添加批注请用“**”分隔,标题**批注,仅对导出模板有效)
*/
String
title
();
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
int
type
()
default
0
;
/**
* 导出字段对齐方式(0:自动;1:靠左;2:居中;3:靠右)
*/
int
align
()
default
0
;
/**
* 导出字段字段排序(升序)
*/
int
sort
()
default
0
;
/**
* 如果是字典类型,请设置字典的type值
*/
String
dictType
()
default
""
;
/**
* 反射类型
*/
Class
<?>
fieldType
()
default
Class
.
class
;
/**
* 字段归属组(根据分组导出导入)
*/
int
[]
groups
()
default
{};
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/fieldtype/AreaType.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel.fieldtype
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.modules.sys.entity.Area
;
import
com.jeespring.modules.sys.utils.UserUtils
;
/**
* 字段类型转换
* @author 黄炳桂 516821420@qq.com
* @version 2013-03-10
*/
public
class
AreaType
{
/**
* 获取对象值(导入)
*/
public
static
Object
getValue
(
String
val
)
{
for
(
Area
e
:
UserUtils
.
getAreaList
()){
if
(
StringUtils
.
trimToEmpty
(
val
).
equals
(
e
.
getName
())){
return
e
;
}
}
return
null
;
}
/**
* 获取对象值(导出)
*/
public
static
String
setValue
(
Object
val
)
{
if
(
val
!=
null
&&
((
Area
)
val
).
getName
()
!=
null
){
return
((
Area
)
val
).
getName
();
}
return
""
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/fieldtype/OfficeType.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel.fieldtype
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.modules.sys.entity.Office
;
import
com.jeespring.modules.sys.utils.UserUtils
;
/**
* 字段类型转换
* @author 黄炳桂 516821420@qq.com
* @version 2013-03-10
*/
public
class
OfficeType
{
/**
* 获取对象值(导入)
*/
public
static
Object
getValue
(
String
val
)
{
for
(
Office
e
:
UserUtils
.
getOfficeList
()){
if
(
StringUtils
.
trimToEmpty
(
val
).
equals
(
e
.
getName
())){
return
e
;
}
}
return
null
;
}
/**
* 设置对象值(导出)
*/
public
static
String
setValue
(
Object
val
)
{
if
(
val
!=
null
&&
((
Office
)
val
).
getName
()
!=
null
){
return
((
Office
)
val
).
getName
();
}
return
""
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/fieldtype/RoleListType.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel.fieldtype
;
import
java.util.List
;
import
com.google.common.collect.Lists
;
import
com.jeespring.common.utils.Collections3
;
import
com.jeespring.common.utils.SpringContextHolder
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.modules.sys.entity.Role
;
import
com.jeespring.modules.sys.service.SystemService
;
/**
* 字段类型转换
* @author 黄炳桂 516821420@qq.com
* @version 2013-5-29
*/
public
class
RoleListType
{
private
static
SystemService
systemService
=
SpringContextHolder
.
getBean
(
SystemService
.
class
);
/**
* 获取对象值(导入)
*/
public
static
Object
getValue
(
String
val
)
{
List
<
Role
>
roleList
=
Lists
.
newArrayList
();
List
<
Role
>
allRoleList
=
systemService
.
findAllRole
();
for
(
String
s
:
StringUtils
.
split
(
val
,
","
)){
for
(
Role
e
:
allRoleList
){
if
(
StringUtils
.
trimToEmpty
(
s
).
equals
(
e
.
getName
())){
roleList
.
add
(
e
);
}
}
}
return
roleList
.
size
()>
0
?
roleList:
null
;
}
/**
* 设置对象值(导出)
*/
public
static
String
setValue
(
Object
val
)
{
if
(
val
!=
null
){
@SuppressWarnings
(
"unchecked"
)
List
<
Role
>
roleList
=
(
List
<
Role
>)
val
;
return
Collections3
.
extractToString
(
roleList
,
"name"
,
", "
);
}
return
""
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/http/HttpUtils.java
deleted
100644 → 0
View file @
b6becbcd
package
com.jeespring.common.utils.http
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
javax.net.ssl.*
;
import
java.io.*
;
import
java.net.ConnectException
;
import
java.net.SocketTimeoutException
;
import
java.net.URL
;
import
java.net.URLConnection
;
import
java.security.cert.X509Certificate
;
/**
* 通用http发送方法
*
* @author JeeSpring
*/
public
class
HttpUtils
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
HttpUtils
.
class
);
/**
* 向指定 URL 发送GET方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public
static
String
sendGet
(
String
url
,
String
param
)
{
StringBuilder
result
=
new
StringBuilder
();
BufferedReader
in
=
null
;
try
{
String
urlNameString
=
url
+
"?"
+
param
;
log
.
info
(
"sendGet - {}"
,
urlNameString
);
URL
realUrl
=
new
URL
(
urlNameString
);
URLConnection
connection
=
realUrl
.
openConnection
();
connection
.
setRequestProperty
(
"accept"
,
"*/*"
);
connection
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
connection
.
setRequestProperty
(
"user-agent"
,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
);
connection
.
connect
();
in
=
new
BufferedReader
(
new
InputStreamReader
(
connection
.
getInputStream
()));
String
line
;
while
((
line
=
in
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
log
.
info
(
"recv - {}"
,
result
);
}
catch
(
ConnectException
e
)
{
log
.
error
(
"调用HttpUtils.sendGet ConnectException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
SocketTimeoutException
e
)
{
log
.
error
(
"调用HttpUtils.sendGet SocketTimeoutException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
IOException
e
)
{
log
.
error
(
"调用HttpUtils.sendGet IOException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
Exception
e
)
{
log
.
error
(
"调用HttpsUtil.sendGet Exception, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
finally
{
try
{
if
(
in
!=
null
)
{
in
.
close
();
}
}
catch
(
Exception
ex
)
{
log
.
error
(
"调用in.close Exception, url="
+
url
+
",param="
+
param
,
ex
.
getMessage
());
}
}
return
result
.
toString
();
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public
static
String
sendPost
(
String
url
,
String
param
)
{
PrintWriter
out
=
null
;
BufferedReader
in
=
null
;
StringBuilder
result
=
new
StringBuilder
();
try
{
String
urlNameString
=
url
+
"?"
+
param
;
log
.
info
(
"sendPost - {}"
,
urlNameString
);
URL
realUrl
=
new
URL
(
urlNameString
);
URLConnection
conn
=
realUrl
.
openConnection
();
conn
.
setRequestProperty
(
"accept"
,
"*/*"
);
conn
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
conn
.
setRequestProperty
(
"user-agent"
,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
);
conn
.
setRequestProperty
(
"Accept-Charset"
,
"utf-8"
);
conn
.
setRequestProperty
(
"contentType"
,
"utf-8"
);
conn
.
setDoOutput
(
true
);
conn
.
setDoInput
(
true
);
out
=
new
PrintWriter
(
conn
.
getOutputStream
());
out
.
print
(
param
);
out
.
flush
();
in
=
new
BufferedReader
(
new
InputStreamReader
(
conn
.
getInputStream
(),
"utf-8"
));
String
line
;
while
((
line
=
in
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
log
.
info
(
"recv - {}"
,
result
);
}
catch
(
ConnectException
e
)
{
log
.
error
(
"调用HttpUtils.sendPost ConnectException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
SocketTimeoutException
e
)
{
log
.
error
(
"调用HttpUtils.sendPost SocketTimeoutException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
IOException
e
)
{
log
.
error
(
"调用HttpUtils.sendPost IOException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
Exception
e
)
{
log
.
error
(
"调用HttpsUtil.sendPost Exception, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
finally
{
try
{
if
(
out
!=
null
)
{
out
.
close
();
}
if
(
in
!=
null
)
{
in
.
close
();
}
}
catch
(
IOException
ex
)
{
log
.
error
(
"调用in.close Exception, url="
+
url
+
",param="
+
param
,
ex
.
getMessage
());
}
}
return
result
.
toString
();
}
public
static
String
sendSSLPost
(
String
url
,
String
param
)
{
StringBuilder
result
=
new
StringBuilder
();
String
urlNameString
=
url
+
"?"
+
param
;
try
{
log
.
info
(
"sendSSLPost - {}"
,
urlNameString
);
SSLContext
sc
=
SSLContext
.
getInstance
(
"SSL"
);
sc
.
init
(
null
,
new
TrustManager
[]
{
new
TrustAnyTrustManager
()
},
new
java
.
security
.
SecureRandom
());
URL
console
=
new
URL
(
urlNameString
);
HttpsURLConnection
conn
=
(
HttpsURLConnection
)
console
.
openConnection
();
conn
.
setRequestProperty
(
"accept"
,
"*/*"
);
conn
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
conn
.
setRequestProperty
(
"user-agent"
,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
);
conn
.
setRequestProperty
(
"Accept-Charset"
,
"utf-8"
);
conn
.
setRequestProperty
(
"contentType"
,
"utf-8"
);
conn
.
setDoOutput
(
true
);
conn
.
setDoInput
(
true
);
conn
.
setSSLSocketFactory
(
sc
.
getSocketFactory
());
conn
.
setHostnameVerifier
(
new
TrustAnyHostnameVerifier
());
conn
.
connect
();
InputStream
is
=
conn
.
getInputStream
();
BufferedReader
br
=
new
BufferedReader
(
new
InputStreamReader
(
is
));
String
ret
=
""
;
while
((
ret
=
br
.
readLine
())
!=
null
)
{
if
(
ret
!=
null
&&
!
""
.
equals
(
ret
.
trim
()))
{
result
.
append
(
new
String
(
ret
.
getBytes
(
"ISO-8859-1"
),
"utf-8"
));
}
}
log
.
info
(
"recv - {}"
,
result
);
conn
.
disconnect
();
br
.
close
();
}
catch
(
ConnectException
e
)
{
log
.
error
(
"调用HttpUtils.sendSSLPost ConnectException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
SocketTimeoutException
e
)
{
log
.
error
(
"调用HttpUtils.sendSSLPost SocketTimeoutException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
IOException
e
)
{
log
.
error
(
"调用HttpUtils.sendSSLPost IOException, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
catch
(
Exception
e
)
{
log
.
error
(
"调用HttpsUtil.sendSSLPost Exception, url="
+
url
+
",param="
+
param
,
e
.
getMessage
());
}
return
result
.
toString
();
}
private
static
class
TrustAnyTrustManager
implements
X509TrustManager
{
@Override
public
void
checkClientTrusted
(
X509Certificate
[]
chain
,
String
authType
)
{
}
@Override
public
void
checkServerTrusted
(
X509Certificate
[]
chain
,
String
authType
)
{
}
@Override
public
X509Certificate
[]
getAcceptedIssuers
()
{
return
new
X509Certificate
[]
{};
}
}
private
static
class
TrustAnyHostnameVerifier
implements
HostnameVerifier
{
@Override
public
boolean
verify
(
String
hostname
,
SSLSession
session
)
{
return
true
;
}
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/validator/BeanValidators.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package
com.jeespring.common.validator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
javax.validation.ConstraintViolation
;
import
javax.validation.ConstraintViolationException
;
import
javax.validation.Validator
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
/**
* JSR303 Validator(Hibernate Validator)工具类.
*
* ConstraintViolation中包含propertyPath, message 和invalidValue等信息.
* 提供了各种convert方法,适合不同的i18n需求:
* 1. List<String>, String内容为message
* 2. List<String>, String内容为propertyPath + separator + message
* 3. Map<propertyPath, message>
*
* 详情见wiki: https://github.com/springside/springside4/wiki/HibernateValidator
* @author calvin
* @version 2013-01-15
*/
public
class
BeanValidators
{
/**
* 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException.
*/
@SuppressWarnings
({
"unchecked"
,
"rawtypes"
})
public
static
void
validateWithException
(
Validator
validator
,
Object
object
,
Class
<?>...
groups
)
throws
ConstraintViolationException
{
Set
constraintViolations
=
validator
.
validate
(
object
,
groups
);
if
(!
constraintViolations
.
isEmpty
())
{
throw
new
ConstraintViolationException
(
constraintViolations
);
}
}
/**
* 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>中为List<message>.
*/
public
static
List
<
String
>
extractMessage
(
ConstraintViolationException
e
)
{
return
extractMessage
(
e
.
getConstraintViolations
());
}
/**
* 辅助方法, 转换Set<ConstraintViolation>为List<message>
*/
@SuppressWarnings
(
"rawtypes"
)
public
static
List
<
String
>
extractMessage
(
Set
<?
extends
ConstraintViolation
>
constraintViolations
)
{
List
<
String
>
errorMessages
=
Lists
.
newArrayList
();
for
(
ConstraintViolation
violation
:
constraintViolations
)
{
errorMessages
.
add
(
violation
.
getMessage
());
}
return
errorMessages
;
}
/**
* 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为Map<property, message>.
*/
public
static
Map
<
String
,
String
>
extractPropertyAndMessage
(
ConstraintViolationException
e
)
{
return
extractPropertyAndMessage
(
e
.
getConstraintViolations
());
}
/**
* 辅助方法, 转换Set<ConstraintViolation>为Map<property, message>.
*/
@SuppressWarnings
(
"rawtypes"
)
public
static
Map
<
String
,
String
>
extractPropertyAndMessage
(
Set
<?
extends
ConstraintViolation
>
constraintViolations
)
{
Map
<
String
,
String
>
errorMessages
=
Maps
.
newHashMap
();
for
(
ConstraintViolation
violation
:
constraintViolations
)
{
errorMessages
.
put
(
violation
.
getPropertyPath
().
toString
(),
violation
.
getMessage
());
}
return
errorMessages
;
}
/**
* 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath message>.
*/
public
static
List
<
String
>
extractPropertyAndMessageAsList
(
ConstraintViolationException
e
)
{
return
extractPropertyAndMessageAsList
(
e
.
getConstraintViolations
(),
" "
);
}
/**
* 辅助方法, 转换Set<ConstraintViolations>为List<propertyPath message>.
*/
@SuppressWarnings
(
"rawtypes"
)
public
static
List
<
String
>
extractPropertyAndMessageAsList
(
Set
<?
extends
ConstraintViolation
>
constraintViolations
)
{
return
extractPropertyAndMessageAsList
(
constraintViolations
,
" "
);
}
/**
* 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath +separator+ message>.
*/
public
static
List
<
String
>
extractPropertyAndMessageAsList
(
ConstraintViolationException
e
,
String
separator
)
{
return
extractPropertyAndMessageAsList
(
e
.
getConstraintViolations
(),
separator
);
}
/**
* 辅助方法, 转换Set<ConstraintViolation>为List<propertyPath +separator+ message>.
*/
@SuppressWarnings
(
"rawtypes"
)
public
static
List
<
String
>
extractPropertyAndMessageAsList
(
Set
<?
extends
ConstraintViolation
>
constraintViolations
,
String
separator
)
{
List
<
String
>
errorMessages
=
Lists
.
newArrayList
();
for
(
ConstraintViolation
violation
:
constraintViolations
)
{
errorMessages
.
add
(
violation
.
getPropertyPath
()
+
separator
+
violation
.
getMessage
());
}
return
errorMessages
;
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/web/AbstractBaseController.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.web
;
import
com.jeespring.common.mapper.JsonMapper
;
import
com.jeespring.common.redis.RedisUtils
;
import
com.jeespring.common.utils.DateUtils
;
import
com.jeespring.common.validator.BeanValidators
;
import
com.jeespring.modules.oauth.service.OauthService
;
import
com.jeespring.modules.utils.service.EmailService
;
import
org.apache.commons.lang3.StringEscapeUtils
;
import
org.apache.shiro.authc.AuthenticationException
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.ui.Model
;
import
org.springframework.validation.BindException
;
import
org.springframework.web.bind.WebDataBinder
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.servlet.mvc.support.RedirectAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.validation.ConstraintViolationException
;
import
javax.validation.ValidationException
;
import
javax.validation.Validator
;
import
java.beans.PropertyEditorSupport
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.List
;
/**
* 控制器支持类
*
* @author 黄炳桂 516821420@qq.com
* @version 2013-3-23
*/
public
abstract
class
AbstractBaseController
{
/**
* 日志对象
*/
protected
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
/**
* 管理基础路径
*/
@Value
(
"${adminPath}"
)
protected
String
adminPath
;
/**
* 验证Bean实例对象
*/
@Autowired
protected
Validator
validator
;
@Autowired
private
EmailService
mailService
;
@Autowired
private
OauthService
oauthService
;
/**
* 服务端参数有效性验证
*
* @param object 验证的实体对象
* @param groups 验证组
* @return 验证成功:返回true;严重失败:将错误信息添加到 message 中
*/
protected
boolean
beanValidator
(
Model
model
,
Object
object
,
Class
<?>...
groups
)
{
try
{
BeanValidators
.
validateWithException
(
validator
,
object
,
groups
);
}
catch
(
ConstraintViolationException
ex
)
{
List
<
String
>
list
=
BeanValidators
.
extractPropertyAndMessageAsList
(
ex
,
": "
);
list
.
add
(
0
,
"数据验证失败:"
);
addMessage
(
model
,
list
.
toArray
(
new
String
[]{}));
return
false
;
}
return
true
;
}
/**
* 服务端参数有效性验证
*
* @param object 验证的实体对象
* @param groups 验证组
* @return 验证成功:返回true;严重失败:将错误信息添加到 flash message 中
*/
protected
boolean
beanValidator
(
RedirectAttributes
redirectAttributes
,
Object
object
,
Class
<?>...
groups
)
{
try
{
BeanValidators
.
validateWithException
(
validator
,
object
,
groups
);
}
catch
(
ConstraintViolationException
ex
)
{
List
<
String
>
list
=
BeanValidators
.
extractPropertyAndMessageAsList
(
ex
,
": "
);
list
.
add
(
0
,
"数据验证失败:"
);
addMessage
(
redirectAttributes
,
list
.
toArray
(
new
String
[]{}));
return
false
;
}
return
true
;
}
/**
* 服务端参数有效性验证
*
* @param object 验证的实体对象
* @param groups 验证组,不传入此参数时,同@Valid注解验证
* @return 验证成功:继续执行;验证失败:抛出异常跳转400页面。
*/
protected
void
beanValidator
(
Object
object
,
Class
<?>...
groups
)
{
BeanValidators
.
validateWithException
(
validator
,
object
,
groups
);
}
/**
* 添加Model消息
*
* @param model
* @param messages
*/
protected
void
addMessage
(
Model
model
,
String
...
messages
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
String
message
:
messages
)
{
sb
.
append
(
message
).
append
(
messages
.
length
>
1
?
"<br/>"
:
""
);
}
model
.
addAttribute
(
"message"
,
sb
.
toString
());
}
/**
* 添加Flash消息
*/
protected
void
addMessage
(
RedirectAttributes
redirectAttributes
,
String
...
messages
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
String
message
:
messages
)
{
sb
.
append
(
message
).
append
(
messages
.
length
>
1
?
"<br/>"
:
""
);
}
redirectAttributes
.
addFlashAttribute
(
"message"
,
sb
.
toString
());
}
/**
* 客户端返回JSON字符串
*
* @param response
* @param object
* @return
*/
protected
String
renderString
(
HttpServletResponse
response
,
Object
object
)
{
return
renderString
(
response
,
JsonMapper
.
toJsonString
(
object
),
"application/json"
);
}
/**
* 客户端返回字符串
*
* @param response
* @param string
* @return
*/
protected
String
renderString
(
HttpServletResponse
response
,
String
string
,
String
type
)
{
try
{
response
.
reset
();
response
.
setContentType
(
type
);
response
.
setCharacterEncoding
(
"utf-8"
);
response
.
getWriter
().
print
(
string
);
return
null
;
}
catch
(
IOException
e
)
{
return
null
;
}
}
/**
* 参数绑定异常
*/
@ExceptionHandler
({
Exception
.
class
,
BindException
.
class
,
ConstraintViolationException
.
class
,
ValidationException
.
class
})
public
String
bindException
(
Exception
ex
,
HttpServletRequest
request
)
{
//if(ex instanceof IOException){
// return "error/400";
//}
try
{
mailService
.
sendMailException
(
"Java后台异常"
,
"URL:"
+
request
.
getRequestURL
()
+
"<br>QueryString:"
+
request
.
getQueryString
()
+
"<br>Exception:"
+
ex
.
getMessage
()
+
"<br>"
);
}
catch
(
Exception
exception
){}
return
"error/400"
;
}
/**
* 授权登录异常
*/
@ExceptionHandler
({
AuthenticationException
.
class
})
public
String
authenticationException
()
{
return
"error/403"
;
}
/**
* 拦截API调用次数控制
*/
@ModelAttribute
protected
void
APIHandler
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
try
{
if
(!
RedisUtils
.
isShireRedis
()){
return
;}
if
(!
oauthService
.
isOauthOpen
()){
return
;}
//if(request.getRequestURI().indexOf("/rest/")<0) return;
if
(
request
.
getRequestURI
().
indexOf
(
"/rest/oauth/apiTimeLimiFaild"
)>=
0
)
{
return
;
}
if
(
request
.
getRequestURI
().
indexOf
(
"/admin?login"
)>=
0
)
{
return
;
}
if
(
request
.
getRequestURI
().
indexOf
(
"/admin/login"
)>=
0
)
{
return
;
}
if
(
"/admin"
.
equals
(
request
.
getRequestURI
())){
Result
result
=
oauthService
.
userOnlineAmount
();
if
(
"-1"
.
equals
(
result
.
getResultCode
()))
{
response
.
sendRedirect
(
"/rest/oauth/userOnlineAmountFaild"
);
}
return
;
}
oauthService
.
setApiTime
();
Result
result
=
oauthService
.
ApiTimeLimi
(
request
.
getRemoteAddr
());
if
(
result
.
getResultCoe
().
toString
()==
"-1"
){
//response.sendRedirect("../error/403");
if
(
request
.
getRequestURI
().
indexOf
(
"/rest/"
)>
0
)
{
response
.
sendRedirect
(
"/rest/oauth/apiTimeLimiFaild?apiTimeLimi="
+
result
.
getResultObject
());
}
else
{
response
.
sendRedirect
(
"/rest/oauth/apiTimeLimiFaild?apiTimeLimi="
+
result
.
getResultObject
());
}
//response.sendRedirect("/rest/oauth/apiTimeLimifaild");
}
}
catch
(
Exception
e
){
}
}
/**
* Rest云接口安全拦截
*/
@ModelAttribute
protected
void
RestHandler
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
try
{
if
(!
RedisUtils
.
isShireRedis
()){
return
;}
if
(!
oauthService
.
isOauthOpen
()){
return
;}
if
(
request
.
getRequestURI
().
indexOf
(
"/rest/"
)<
0
)
{
return
;
}
if
(
request
.
getRequestURI
().
indexOf
(
"/rest/oauth/token"
)>=
0
)
{
return
;
}
if
(
request
.
getRequestURI
().
indexOf
(
"/rest/oauth/faild"
)>=
0
)
{
return
;
}
if
(
request
.
getRequestURI
().
indexOf
(
"/rest/oauth/checkToken"
)>=
0
)
{
return
;
}
Result
result
=
oauthService
.
checkToken
(
request
.
getParameter
(
"token"
),
request
.
getRemoteAddr
());
if
(
result
.
getResultCoe
().
toString
()==
"-1"
){
//response.sendRedirect("../error/403");
response
.
sendRedirect
(
"/rest/oauth/faild"
);
}
}
catch
(
Exception
e
){
}
}
/**
* 初始化数据绑定
* 1. 将所有传递进来的String进行HTML编码,防止XSS攻击
* 2. 将字段中Date类型转换为String类型
*/
@InitBinder
protected
void
initBinder
(
WebDataBinder
binder
)
{
// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
binder
.
registerCustomEditor
(
String
.
class
,
new
PropertyEditorSupport
()
{
@Override
public
void
setAsText
(
String
text
)
{
//过滤,进行html转码
setValue
(
text
==
null
?
null
:
StringEscapeUtils
.
unescapeHtml4
(
StringEscapeUtils
.
escapeHtml4
(
text
.
trim
())));
//不过滤,不进行html转码
//setValue(text == null ? null : text.trim());
}
@Override
public
String
getAsText
()
{
Object
value
=
getValue
();
return
value
!=
null
?
StringEscapeUtils
.
unescapeHtml4
(
value
.
toString
())
:
""
;
//return value != null ? value.toString() : "";
}
});
// Date 类型转换
binder
.
registerCustomEditor
(
Date
.
class
,
new
PropertyEditorSupport
()
{
@Override
public
void
setAsText
(
String
text
)
{
setValue
(
DateUtils
.
parseDate
(
text
));
}
// @Override
// public String getAsText() {
// Object value = getValue();
// return value != null ? DateUtils.formatDateTime((Date)value) : "";
// }
});
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/web/CKFinderConfig.java
deleted
100644 → 0
View file @
b6becbcd
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.web
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
import
java.util.Scanner
;
import
javax.servlet.ServletConfig
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.xml.parsers.DocumentBuilder
;
import
javax.xml.parsers.DocumentBuilderFactory
;
import
org.springframework.core.io.DefaultResourceLoader
;
import
org.springframework.core.io.Resource
;
import
org.w3c.dom.Document
;
import
org.w3c.dom.Node
;
import
org.w3c.dom.NodeList
;
import
com.ckfinder.connector.configuration.Configuration
;
import
com.ckfinder.connector.configuration.Events
;
import
com.ckfinder.connector.data.AccessControlLevel
;
import
com.ckfinder.connector.utils.AccessControlUtil
;
import
com.ckfinder.connector.utils.PathUtils
;
import
com.jeespring.common.config.Global
;
import
com.jeespring.common.utils.FileUtils
;
import
com.jeespring.modules.sys.security.SystemAuthorizingRealm
;
import
com.jeespring.modules.sys.utils.UserUtils
;
/**
* CKFinder配置
*
* @author 黄炳桂 516821420@qq.com
* @version 2014-06-25
*/
public
class
CKFinderConfig
extends
Configuration
{
public
CKFinderConfig
(
ServletConfig
servletConfig
)
{
super
(
servletConfig
);
}
@Override
protected
Configuration
createConfigurationInstance
()
{
SystemAuthorizingRealm
.
Principal
principal
=
UserUtils
.
getPrincipal
();
if
(
principal
==
null
)
{
return
new
CKFinderConfig
(
this
.
servletConf
);
}
boolean
isView
=
true
;
boolean
isUpload
=
true
;
boolean
isEdit
=
true
;
AccessControlLevel
alc
=
this
.
getAccessConrolLevels
().
get
(
0
);
alc
.
setFolderView
(
isView
);
alc
.
setFolderCreate
(
isEdit
);
alc
.
setFolderRename
(
isEdit
);
alc
.
setFolderDelete
(
isEdit
);
alc
.
setFileView
(
isView
);
alc
.
setFileUpload
(
isUpload
);
alc
.
setFileRename
(
isEdit
);
alc
.
setFileDelete
(
isEdit
);
AccessControlUtil
.
getInstance
(
this
).
loadACLConfig
();
try
{
this
.
baseURL
=
FileUtils
.
path
(
Servlets
.
getRequest
().
getContextPath
()
+
Global
.
USERFILES_BASE_URL
+
principal
+
"/"
);
this
.
baseDir
=
FileUtils
.
path
(
Global
.
getUserfilesBaseDir
()
+
Global
.
USERFILES_BASE_URL
+
principal
+
"/"
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
return
new
CKFinderConfig
(
this
.
servletConf
);
}
@Override
public
boolean
checkAuthentication
(
final
HttpServletRequest
request
)
{
return
UserUtils
.
getPrincipal
()
!=
null
;
}
@Override
public
void
init
()
throws
Exception
{
DefaultResourceLoader
loader
=
new
DefaultResourceLoader
();
Resource
resource
=
loader
.
getResource
(
this
.
xmlFilePath
);
Class
<?>
clazz
=
getClass
().
getSuperclass
();
Field
field
=
clazz
.
getDeclaredField
(
"lastCfgModificationDate"
);
Method
method
=
clazz
.
getDeclaredMethod
(
"clearConfiguration"
);
method
.
setAccessible
(
true
);
method
.
invoke
(
this
);
field
.
setAccessible
(
true
);
field
.
set
(
this
,
System
.
currentTimeMillis
());
DocumentBuilderFactory
dbf
=
DocumentBuilderFactory
.
newInstance
();
DocumentBuilder
db
=
dbf
.
newDocumentBuilder
();
Document
doc
=
db
.
parse
(
resource
.
getInputStream
());
doc
.
normalize
();
Node
node
=
doc
.
getFirstChild
();
if
(
node
!=
null
)
{
NodeList
nodeList
=
node
.
getChildNodes
();
for
(
int
i
=
0
;
i
<
nodeList
.
getLength
();
++
i
)
{
Node
childNode
=
nodeList
.
item
(
i
);
if
(
"enabled"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
enabled
=
Boolean
.
valueOf
(
childNode
.
getTextContent
().
trim
()).
booleanValue
();
}
if
(
"baseDir"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
baseDir
=
childNode
.
getTextContent
().
trim
();
this
.
baseDir
=
PathUtils
.
escape
(
this
.
baseDir
);
this
.
baseDir
=
PathUtils
.
addSlashToEnd
(
this
.
baseDir
);
}
if
(
"baseURL"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
baseURL
=
childNode
.
getTextContent
().
trim
();
this
.
baseURL
=
PathUtils
.
escape
(
this
.
baseURL
);
this
.
baseURL
=
PathUtils
.
addSlashToEnd
(
this
.
baseURL
);
}
if
(
"licenseName"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
licenseName
=
childNode
.
getTextContent
().
trim
();
}
if
(
"licenseKey"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
licenseKey
=
childNode
.
getTextContent
().
trim
();
}
String
value
;
if
(
"imgWidth"
.
equals
(
childNode
.
getNodeName
()))
{
value
=
childNode
.
getTextContent
().
trim
();
value
=
value
.
replaceAll
(
"//D"
,
""
);
try
{
this
.
imgWidth
=
Integer
.
valueOf
(
value
);
}
catch
(
NumberFormatException
var13
)
{
this
.
imgWidth
=
null
;
}
}
if
(
"imgQuality"
.
equals
(
childNode
.
getNodeName
()))
{
value
=
childNode
.
getTextContent
().
trim
();
value
=
value
.
replaceAll
(
"//D"
,
""
);
method
=
clazz
.
getDeclaredMethod
(
"adjustQuality"
,
new
Class
[]{
String
.
class
});
method
.
setAccessible
(
true
);
this
.
imgQuality
=
Float
.
parseFloat
(
method
.
invoke
(
this
,
value
).
toString
());
}
if
(
"imgHeight"
.
equals
(
childNode
.
getNodeName
()))
{
value
=
childNode
.
getTextContent
().
trim
();
value
=
value
.
replaceAll
(
"//D"
,
""
);
try
{
this
.
imgHeight
=
Integer
.
valueOf
(
value
);
}
catch
(
NumberFormatException
var12
)
{
this
.
imgHeight
=
null
;
}
}
if
(
"thumbs"
.
equals
(
childNode
.
getNodeName
()))
{
method
=
clazz
.
getDeclaredMethod
(
"setThumbs"
,
new
Class
[]{
NodeList
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
childNode
.
getChildNodes
());
}
if
(
"accessControls"
.
equals
(
childNode
.
getNodeName
()))
{
method
=
clazz
.
getDeclaredMethod
(
"setACLs"
,
new
Class
[]{
NodeList
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
childNode
.
getChildNodes
());
}
if
(
"hideFolders"
.
equals
(
childNode
.
getNodeName
()))
{
method
=
clazz
.
getDeclaredMethod
(
"setHiddenFolders"
,
new
Class
[]{
NodeList
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
childNode
.
getChildNodes
());
}
if
(
"hideFiles"
.
equals
(
childNode
.
getNodeName
()))
{
method
=
clazz
.
getDeclaredMethod
(
"setHiddenFiles"
,
new
Class
[]{
NodeList
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
childNode
.
getChildNodes
());
}
if
(
"checkDoubleExtension"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
doubleExtensions
=
Boolean
.
valueOf
(
childNode
.
getTextContent
().
trim
()).
booleanValue
();
}
if
(
"disallowUnsafeCharacters"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
disallowUnsafeCharacters
=
Boolean
.
valueOf
(
childNode
.
getTextContent
().
trim
()).
booleanValue
();
}
if
(
"forceASCII"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
forceASCII
=
Boolean
.
valueOf
(
childNode
.
getTextContent
().
trim
()).
booleanValue
();
}
if
(
"checkSizeAfterScaling"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
checkSizeAfterScaling
=
Boolean
.
valueOf
(
childNode
.
getTextContent
().
trim
()).
booleanValue
();
}
Scanner
sc
;
if
(
"htmlExtensions"
.
equals
(
childNode
.
getNodeName
()))
{
value
=
childNode
.
getTextContent
();
sc
=
(
new
Scanner
(
value
)).
useDelimiter
(
","
);
while
(
sc
.
hasNext
())
{
String
val
=
sc
.
next
();
if
(
val
!=
null
&&
!
""
.
equals
(
val
))
{
this
.
htmlExtensions
.
add
(
val
.
trim
().
toLowerCase
());
}
}
}
if
(
"secureImageUploads"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
secureImageUploads
=
Boolean
.
valueOf
(
childNode
.
getTextContent
().
trim
()).
booleanValue
();
}
if
(
"uriEncoding"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
uriEncoding
=
childNode
.
getTextContent
().
trim
();
}
if
(
"userRoleSessionVar"
.
equals
(
childNode
.
getNodeName
()))
{
this
.
userRoleSessionVar
=
childNode
.
getTextContent
().
trim
();
}
if
(
"defaultResourceTypes"
.
equals
(
childNode
.
getNodeName
()))
{
value
=
childNode
.
getTextContent
().
trim
();
sc
=
(
new
Scanner
(
value
)).
useDelimiter
(
","
);
while
(
sc
.
hasNext
())
{
this
.
defaultResourceTypes
.
add
(
sc
.
next
());
}
}
if
(
"plugins"
.
equals
(
childNode
.
getNodeName
()))
{
method
=
clazz
.
getDeclaredMethod
(
"setPlugins"
,
new
Class
[]{
Node
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
childNode
);
}
if
(
"basePathBuilderImpl"
.
equals
(
childNode
.
getNodeName
()))
{
method
=
clazz
.
getDeclaredMethod
(
"setBasePathImpl"
,
new
Class
[]{
String
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
childNode
.
getTextContent
().
trim
());
}
}
}
method
=
clazz
.
getDeclaredMethod
(
"setTypes"
,
new
Class
[]{
Document
.
class
});
method
.
setAccessible
(
true
);
method
.
invoke
(
this
,
doc
);
field
=
clazz
.
getDeclaredField
(
"events"
);
field
.
setAccessible
(
true
);
field
.
set
(
this
,
new
Events
());
this
.
registerEventHandlers
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/web/Result.java
deleted
100644 → 0
View file @
b6becbcd
package
com.jeespring.common.web
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
public
class
Result
extends
HashMap
<
String
,
Object
>
implements
Map
<
String
,
Object
>{
/**
*
*/
private
static
final
long
serialVersionUID
=
1L
;
private
HashMap
<
String
,
Object
>
resultHashMap
=
new
HashMap
<
String
,
Object
>();
public
void
setResultObject
(
Object
obejct
)
{
put
(
"RESULT"
,
obejct
);
}
public
void
setResultExtend
(
String
key
,
Object
object
){
JSONObject
jsonObject
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
get
(
"RESULT"
)));
jsonObject
.
put
(
key
,
object
);
put
(
"RESULT"
,
jsonObject
);
}
public
void
setResultHashMap
(
String
item
,
Object
obejct
)
{
resultHashMap
.
put
(
item
,
obejct
);
put
(
"RESULT"
,
resultHashMap
);
}
public
void
setResultCode
(
Object
resultCode
)
{
put
(
"CODE"
,
resultCode
);
}
public
Object
getResultCoe
(){
return
get
(
"CODE"
);
}
public
Object
getResultCode
(){
return
get
(
"CODE"
);
}
public
<
T
>
List
<
T
>
getResutObjectList
()
{
return
(
List
<
T
>)
get
(
"RESULT"
);
}
public
<
V
,
K
>
Map
<
K
,
V
>
getResutObjectMap
()
{
return
(
Map
<
K
,
V
>)
get
(
"RESULT"
);
}
public
<
T
extends
Object
>
T
getResultObject
()
{
return
(
T
)
get
(
"RESULT"
);
}
}
Prev
1
…
5
6
7
8
9
10
11
12
13
…
20
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment