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
Eladmin
Commits
a6e57e16
Commit
a6e57e16
authored
Dec 20, 2019
by
Elune
Browse files
@Query 加入NOT_NULL查询,优化图床上传,加入图床同步功能
parent
467e04ad
Changes
13
Hide whitespace changes
Inline
Side-by-side
eladmin-common/src/main/java/me/zhengjie/annotation/Query.java
View file @
a6e57e16
...
...
@@ -54,6 +54,8 @@ public @interface Query {
,
NOT_EQUAL
// between
,
BETWEEN
// 不为空
,
NOT_NULL
}
/**
...
...
eladmin-common/src/main/java/me/zhengjie/utils/ElAdminConstant.java
View file @
a6e57e16
...
...
@@ -20,6 +20,6 @@ public class ElAdminConstant {
* 常用接口
*/
public
static
class
Url
{
public
static
final
String
SM_MS_URL
=
"https://sm.ms/api
/upload
"
;
public
static
final
String
SM_MS_URL
=
"https://sm.ms/api"
;
}
}
eladmin-common/src/main/java/me/zhengjie/utils/QueryHelp.java
View file @
a6e57e16
...
...
@@ -110,6 +110,9 @@ public class QueryHelp {
case
NOT_EQUAL:
list
.
add
(
cb
.
notEqual
(
getExpression
(
attributeName
,
join
,
root
),
val
));
break
;
case
NOT_NULL:
list
.
add
(
cb
.
isNotNull
(
getExpression
(
attributeName
,
join
,
root
)));
break
;
case
BETWEEN:
List
<
Object
>
between
=
new
ArrayList
<>((
List
<
Object
>)
val
);
list
.
add
(
cb
.
between
(
getExpression
(
attributeName
,
join
,
root
).
as
((
Class
<?
extends
Comparable
>)
between
.
get
(
0
).
getClass
()),
...
...
eladmin-system/src/main/java/me/zhengjie/modules/quartz/rest/QuartzJobController.java
View file @
a6e57e16
...
...
@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.Set
;
/**
* @author Zheng Jie
...
...
@@ -107,10 +108,10 @@ public class QuartzJobController {
@Log
(
"删除定时任务"
)
@ApiOperation
(
"删除定时任务"
)
@DeleteMapping
(
value
=
"/{id}"
)
@DeleteMapping
@PreAuthorize
(
"@el.check('timing:del')"
)
public
ResponseEntity
<
Object
>
delete
(
@
PathVariable
Long
id
){
quartzJobService
.
delete
(
quartzJobService
.
findById
(
id
)
);
public
ResponseEntity
<
Object
>
delete
(
@
RequestBody
Set
<
Long
>
id
s
){
quartzJobService
.
delete
(
ids
);
return
new
ResponseEntity
<>(
HttpStatus
.
OK
);
}
}
eladmin-system/src/main/java/me/zhengjie/modules/quartz/service/QuartzJobService.java
View file @
a6e57e16
...
...
@@ -8,6 +8,7 @@ import org.springframework.data.domain.Pageable;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.List
;
import
java.util.Set
;
/**
* @author Zheng Jie
...
...
@@ -60,9 +61,9 @@ public interface QuartzJobService {
/**
* 删除任务
* @param
quartzJob
/
* @param
ids
/
*/
void
delete
(
QuartzJob
quartzJob
);
void
delete
(
Set
<
Long
>
ids
);
/**
* 根据ID查询
...
...
eladmin-system/src/main/java/me/zhengjie/modules/quartz/service/impl/QuartzJobServiceImpl.java
View file @
a6e57e16
...
...
@@ -23,10 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.*
;
/**
* @author Zheng Jie
...
...
@@ -131,12 +128,15 @@ public class QuartzJobServiceImpl implements QuartzJobService {
@Override
@CacheEvict
(
allEntries
=
true
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
delete
(
QuartzJob
quartzJob
)
{
if
(
quartzJob
.
getId
().
equals
(
1L
)){
throw
new
BadRequestException
(
"该任务不可操作"
);
public
void
delete
(
Set
<
Long
>
ids
)
{
for
(
Long
id
:
ids
)
{
if
(
id
.
equals
(
1L
)){
throw
new
BadRequestException
(
"更新访客记录不可删除,你可以在后台代码中取消该限制"
);
}
QuartzJob
quartzJob
=
findById
(
id
);
quartzManage
.
deleteJob
(
quartzJob
);
quartzJobRepository
.
delete
(
quartzJob
);
}
quartzManage
.
deleteJob
(
quartzJob
);
quartzJobRepository
.
delete
(
quartzJob
);
}
@Override
...
...
eladmin-system/src/main/resources/config/application.yml
View file @
a6e57e16
...
...
@@ -55,4 +55,7 @@ loginCode:
#密码加密传输,前端公钥加密,后端私钥解密
rsa
:
private_key
:
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
\ No newline at end of file
private_key
:
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
smms
:
token
:
1oOP3ykFDI0K6ifmtvU7c8Y1eTWZSlyl
\ No newline at end of file
eladmin-tools/src/main/java/me/zhengjie/domain/Picture.java
0 → 100644
View file @
a6e57e16
package
me.zhengjie.domain
;
import
lombok.Data
;
import
org.hibernate.annotations.CreationTimestamp
;
import
javax.persistence.*
;
import
java.io.Serializable
;
import
java.sql.Timestamp
;
/**
* sm.ms图床
*
* @author Zheng Jie
* @date 2018-12-27
*/
@Data
@Entity
@Table
(
name
=
"picture"
)
public
class
Picture
implements
Serializable
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Long
id
;
private
String
filename
;
private
String
url
;
private
String
size
;
private
String
height
;
private
String
width
;
@Column
(
name
=
"delete_url"
)
private
String
delete
;
private
String
username
;
@CreationTimestamp
@Column
(
name
=
"create_time"
)
private
Timestamp
createTime
;
/** 用于检测文件是否重复 */
private
String
md5Code
;
@Override
public
String
toString
()
{
return
"Picture{"
+
"filename='"
+
filename
+
'\''
+
'}'
;
}
}
eladmin-tools/src/main/java/me/zhengjie/repository/PictureRepository.java
0 → 100644
View file @
a6e57e16
package
me.zhengjie.repository
;
import
me.zhengjie.domain.Picture
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
/**
* @author Zheng Jie
* @date 2018-12-27
*/
public
interface
PictureRepository
extends
JpaRepository
<
Picture
,
Long
>,
JpaSpecificationExecutor
<
Picture
>
{
/**
* 根据 Mds 值查询文件
* @param code 值
* @return /
*/
Picture
findByMd5Code
(
String
code
);
/**
* 根据连接地址查询
* @param url /
* @return /
*/
boolean
existsByUrl
(
String
url
);
}
eladmin-tools/src/main/java/me/zhengjie/rest/PictureController.java
0 → 100644
View file @
a6e57e16
package
me.zhengjie.rest
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
me.zhengjie.aop.log.Log
;
import
me.zhengjie.domain.Picture
;
import
me.zhengjie.service.PictureService
;
import
me.zhengjie.service.dto.PictureQueryCriteria
;
import
me.zhengjie.utils.SecurityUtils
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* @author 郑杰
* @date 2018/09/20 14:13:32
*/
@RestController
@RequestMapping
(
"/api/pictures"
)
@Api
(
tags
=
"工具:免费图床管理"
)
public
class
PictureController
{
private
final
PictureService
pictureService
;
public
PictureController
(
PictureService
pictureService
)
{
this
.
pictureService
=
pictureService
;
}
@Log
(
"查询图片"
)
@PreAuthorize
(
"@el.check('pictures:list')"
)
@GetMapping
@ApiOperation
(
"查询图片"
)
public
ResponseEntity
<
Object
>
getRoles
(
PictureQueryCriteria
criteria
,
Pageable
pageable
){
return
new
ResponseEntity
<>(
pictureService
.
queryAll
(
criteria
,
pageable
),
HttpStatus
.
OK
);
}
@Log
(
"导出数据"
)
@ApiOperation
(
"导出数据"
)
@GetMapping
(
value
=
"/download"
)
@PreAuthorize
(
"@el.check('pictures:list')"
)
public
void
download
(
HttpServletResponse
response
,
PictureQueryCriteria
criteria
)
throws
IOException
{
pictureService
.
download
(
pictureService
.
queryAll
(
criteria
),
response
);
}
@Log
(
"上传图片"
)
@PreAuthorize
(
"@el.check('pictures:add')"
)
@PostMapping
@ApiOperation
(
"上传图片"
)
public
ResponseEntity
<
Object
>
upload
(
@RequestParam
MultipartFile
file
){
String
userName
=
SecurityUtils
.
getUsername
();
Picture
picture
=
pictureService
.
upload
(
file
,
userName
);
return
new
ResponseEntity
<>(
picture
,
HttpStatus
.
OK
);
}
@Log
(
"同步图床数据"
)
@ApiOperation
(
"同步图床数据"
)
@PostMapping
(
value
=
"/synchronize"
)
public
ResponseEntity
<
Object
>
synchronize
(){
pictureService
.
synchronize
();
return
new
ResponseEntity
<>(
HttpStatus
.
OK
);
}
@Log
(
"多选删除图片"
)
@ApiOperation
(
"多选删除图片"
)
@PreAuthorize
(
"@el.check('pictures:del')"
)
@DeleteMapping
public
ResponseEntity
<
Object
>
deleteAll
(
@RequestBody
Long
[]
ids
)
{
pictureService
.
deleteAll
(
ids
);
return
new
ResponseEntity
<>(
HttpStatus
.
OK
);
}
}
eladmin-tools/src/main/java/me/zhengjie/service/PictureService.java
0 → 100644
View file @
a6e57e16
package
me.zhengjie.service
;
import
me.zhengjie.domain.Picture
;
import
me.zhengjie.service.dto.PictureQueryCriteria
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.List
;
/**
* @author Zheng Jie
* @date 2018-12-27
*/
public
interface
PictureService
{
/**
* 分页查询
* @param criteria 条件
* @param pageable 分页参数
* @return /
*/
Object
queryAll
(
PictureQueryCriteria
criteria
,
Pageable
pageable
);
/**
* 查询全部数据
* @param criteria 条件
* @return /
*/
List
<
Picture
>
queryAll
(
PictureQueryCriteria
criteria
);
/**
* 上传文件
* @param file /
* @param username /
* @return /
*/
Picture
upload
(
MultipartFile
file
,
String
username
);
/**
* 根据ID查询
* @param id /
* @return /
*/
Picture
findById
(
Long
id
);
/**
* 多选删除
* @param ids /
*/
void
deleteAll
(
Long
[]
ids
);
/**
* 导出
* @param queryAll 待导出的数据
* @param response /
* @throws IOException /
*/
void
download
(
List
<
Picture
>
queryAll
,
HttpServletResponse
response
)
throws
IOException
;
/**
* 同步数据
*/
void
synchronize
();
}
eladmin-tools/src/main/java/me/zhengjie/service/dto/PictureQueryCriteria.java
0 → 100644
View file @
a6e57e16
package
me.zhengjie.service.dto
;
import
lombok.Data
;
import
me.zhengjie.annotation.Query
;
import
java.sql.Timestamp
;
import
java.util.List
;
/**
* sm.ms图床
*
* @author Zheng Jie
* @date 2019-6-4 09:52:09
*/
@Data
public
class
PictureQueryCriteria
{
@Query
(
type
=
Query
.
Type
.
INNER_LIKE
)
private
String
filename
;
@Query
(
type
=
Query
.
Type
.
INNER_LIKE
)
private
String
username
;
@Query
(
type
=
Query
.
Type
.
BETWEEN
)
private
List
<
Timestamp
>
createTime
;
}
eladmin-tools/src/main/java/me/zhengjie/service/impl/PictureServiceImpl.java
0 → 100644
View file @
a6e57e16
package
me.zhengjie.service.impl
;
import
cn.hutool.http.HttpRequest
;
import
cn.hutool.http.HttpUtil
;
import
cn.hutool.json.JSONObject
;
import
cn.hutool.json.JSONUtil
;
import
com.alibaba.fastjson.JSON
;
import
lombok.extern.slf4j.Slf4j
;
import
me.zhengjie.domain.Picture
;
import
me.zhengjie.repository.PictureRepository
;
import
me.zhengjie.service.PictureService
;
import
me.zhengjie.service.dto.PictureQueryCriteria
;
import
me.zhengjie.exception.BadRequestException
;
import
me.zhengjie.utils.*
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.File
;
import
java.io.IOException
;
import
java.util.*
;
/**
* @author Zheng Jie
* @date 2018-12-27
*/
@Slf4j
@Service
(
value
=
"pictureService"
)
@CacheConfig
(
cacheNames
=
"picture"
)
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
PictureServiceImpl
implements
PictureService
{
@Value
(
"${smms.token}"
)
private
String
token
;
private
final
PictureRepository
pictureRepository
;
private
static
final
String
SUCCESS
=
"success"
;
private
static
final
String
CODE
=
"code"
;
private
static
final
String
MSG
=
"message"
;
public
PictureServiceImpl
(
PictureRepository
pictureRepository
)
{
this
.
pictureRepository
=
pictureRepository
;
}
@Override
public
Object
queryAll
(
PictureQueryCriteria
criteria
,
Pageable
pageable
){
return
PageUtil
.
toPage
(
pictureRepository
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
QueryHelp
.
getPredicate
(
root
,
criteria
,
criteriaBuilder
),
pageable
));
}
@Override
public
List
<
Picture
>
queryAll
(
PictureQueryCriteria
criteria
)
{
return
pictureRepository
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
QueryHelp
.
getPredicate
(
root
,
criteria
,
criteriaBuilder
));
}
@Override
@Transactional
(
rollbackFor
=
Throwable
.
class
)
public
Picture
upload
(
MultipartFile
multipartFile
,
String
username
)
{
File
file
=
FileUtil
.
toFile
(
multipartFile
);
// 验证是否重复上传
Picture
picture
=
pictureRepository
.
findByMd5Code
(
FileUtil
.
getMd5
(
file
));
if
(
picture
!=
null
){
return
picture
;
}
HashMap
<
String
,
Object
>
paramMap
=
new
HashMap
<>(
1
);
paramMap
.
put
(
"smfile"
,
file
);
// 上传文件
String
result
=
HttpRequest
.
post
(
ElAdminConstant
.
Url
.
SM_MS_URL
+
"/v2/upload"
)
.
header
(
"Authorization"
,
token
)
.
form
(
paramMap
)
.
timeout
(
20000
)
.
execute
().
body
();
JSONObject
jsonObject
=
JSONUtil
.
parseObj
(
result
);
if
(!
jsonObject
.
get
(
CODE
).
toString
().
equals
(
SUCCESS
)){
throw
new
BadRequestException
(
TranslatorUtil
.
translate
(
jsonObject
.
get
(
MSG
).
toString
()));
}
picture
=
JSON
.
parseObject
(
jsonObject
.
get
(
"data"
).
toString
(),
Picture
.
class
);
picture
.
setSize
(
FileUtil
.
getSize
(
Integer
.
parseInt
(
picture
.
getSize
())));
picture
.
setUsername
(
username
);
picture
.
setMd5Code
(
FileUtil
.
getMd5
(
file
));
picture
.
setFilename
(
FileUtil
.
getFileNameNoEx
(
multipartFile
.
getOriginalFilename
())+
"."
+
FileUtil
.
getExtensionName
(
multipartFile
.
getOriginalFilename
()));
pictureRepository
.
save
(
picture
);
//删除临时文件
FileUtil
.
del
(
file
);
return
picture
;
}
@Override
public
Picture
findById
(
Long
id
)
{
Picture
picture
=
pictureRepository
.
findById
(
id
).
orElseGet
(
Picture:
:
new
);
ValidationUtil
.
isNull
(
picture
.
getId
(),
"Picture"
,
"id"
,
id
);
return
picture
;
}
@Override
public
void
deleteAll
(
Long
[]
ids
)
{
for
(
Long
id
:
ids
)
{
Picture
picture
=
findById
(
id
);
try
{
HttpUtil
.
get
(
picture
.
getDelete
());
pictureRepository
.
delete
(
picture
);
}
catch
(
Exception
e
){
pictureRepository
.
delete
(
picture
);
}
}
}
@Override
public
void
synchronize
()
{
//链式构建请求
String
result
=
HttpRequest
.
get
(
ElAdminConstant
.
Url
.
SM_MS_URL
+
"/v2/upload_history"
)
//头信息,多个头信息多次调用此方法即可
.
header
(
"Authorization"
,
token
)
.
timeout
(
20000
)
.
execute
().
body
();
JSONObject
jsonObject
=
JSONUtil
.
parseObj
(
result
);
List
<
Picture
>
pictures
=
JSON
.
parseArray
(
jsonObject
.
get
(
"data"
).
toString
(),
Picture
.
class
);
for
(
Picture
picture
:
pictures
)
{
if
(!
pictureRepository
.
existsByUrl
(
picture
.
getUrl
())){
picture
.
setSize
(
FileUtil
.
getSize
(
Integer
.
parseInt
(
picture
.
getSize
())));
picture
.
setUsername
(
"System Sync"
);
picture
.
setMd5Code
(
""
);
pictureRepository
.
save
(
picture
);
}
}
}
@Override
public
void
download
(
List
<
Picture
>
queryAll
,
HttpServletResponse
response
)
throws
IOException
{
List
<
Map
<
String
,
Object
>>
list
=
new
ArrayList
<>();
for
(
Picture
picture
:
queryAll
)
{
Map
<
String
,
Object
>
map
=
new
LinkedHashMap
<>();
map
.
put
(
"文件名"
,
picture
.
getFilename
());
map
.
put
(
"图片地址"
,
picture
.
getUrl
());
map
.
put
(
"文件大小"
,
picture
.
getSize
());
map
.
put
(
"操作人"
,
picture
.
getUsername
());
map
.
put
(
"高度"
,
picture
.
getHeight
());
map
.
put
(
"宽度"
,
picture
.
getWidth
());
map
.
put
(
"删除地址"
,
picture
.
getDelete
());
map
.
put
(
"创建日期"
,
picture
.
getCreateTime
());
list
.
add
(
map
);
}
FileUtil
.
downloadExcel
(
list
,
response
);
}
}
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