mirror of https://github.com/elunez/eladmin
去除免费图床,需要使用的请前往:https://sm.ms/
parent
554aa58c40
commit
467e04adca
|
@ -1,53 +0,0 @@
|
||||||
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 + '\'' +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
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);
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
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);
|
|
||||||
Map<String,Object> map = new HashMap<>(3);
|
|
||||||
map.put("errno",0);
|
|
||||||
map.put("id",picture.getId());
|
|
||||||
map.put("data",new String[]{picture.getUrl()});
|
|
||||||
return new ResponseEntity<>(map,HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Log("删除图片")
|
|
||||||
@ApiOperation("删除图片")
|
|
||||||
@PreAuthorize("@el.check('pictures:del')")
|
|
||||||
@DeleteMapping(value = "/{id}")
|
|
||||||
public ResponseEntity<Object> delete(@PathVariable Long id) {
|
|
||||||
pictureService.delete(pictureService.findById(id));
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
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 picture /
|
|
||||||
*/
|
|
||||||
void delete(Picture picture);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 多选删除
|
|
||||||
* @param ids /
|
|
||||||
*/
|
|
||||||
void deleteAll(Long[] ids);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导出
|
|
||||||
* @param queryAll 待导出的数据
|
|
||||||
* @param response /
|
|
||||||
* @throws IOException /
|
|
||||||
*/
|
|
||||||
void download(List<Picture> queryAll, HttpServletResponse response) throws IOException;
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
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;
|
|
||||||
}
|
|
|
@ -1,135 +0,0 @@
|
||||||
package me.zhengjie.service.impl;
|
|
||||||
|
|
||||||
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.cache.annotation.CacheConfig;
|
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
|
||||||
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 {
|
|
||||||
|
|
||||||
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
|
|
||||||
@Cacheable
|
|
||||||
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
|
|
||||||
@CacheEvict(allEntries = true)
|
|
||||||
@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= HttpUtil.post(ElAdminConstant.Url.SM_MS_URL, paramMap);
|
|
||||||
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
|
|
||||||
@Cacheable(key = "#p0")
|
|
||||||
public Picture findById(Long id) {
|
|
||||||
Picture picture = pictureRepository.findById(id).orElseGet(Picture::new);
|
|
||||||
ValidationUtil.isNull(picture.getId(),"Picture","id",id);
|
|
||||||
return picture;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CacheEvict(allEntries = true)
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public void delete(Picture picture) {
|
|
||||||
try {
|
|
||||||
HttpUtil.get(picture.getDelete());
|
|
||||||
pictureRepository.delete(picture);
|
|
||||||
} catch(Exception e){
|
|
||||||
pictureRepository.delete(picture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@CacheEvict(allEntries = true)
|
|
||||||
public void deleteAll(Long[] ids) {
|
|
||||||
for (Long id : ids) {
|
|
||||||
delete(findById(id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue