package io.loli.sc.server.action;
import io.loli.sc.server.entity.Gallery;
import io.loli.sc.server.entity.UploadedImage;
import io.loli.sc.server.entity.User;
import io.loli.sc.server.service.GalleryService;
import io.loli.sc.server.service.UploadedImageService;
import io.loli.sc.server.service.UserService;
import io.loli.sc.server.util.StatusBean;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Named
@RequestMapping(value = "/img")
public class ImageAction {
private static final Logger logger = Logger.getLogger(ImageAction.class);
@Inject
@Named("imageService")
private UploadedImageService imageService;
@Inject
private UserService userService;
@Inject
private GalleryService gs;
@RequestMapping(value = "/m/{redirectCode}", method = RequestMethod.GET)
public String show(@PathVariable(value = "redirectCode") String redirectCode, Model model) {
UploadedImage image = imageService.findByCode(redirectCode);
model.addAttribute("image", image);
return "image/show";
}
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String listByUId(Model model, HttpServletRequest request) {
return "redirect:/img/list/1";
}
@RequestMapping(value = "/list/{page}", method = RequestMethod.GET)
public String listByUId(@PathVariable(value = "page") int page, Model model, HttpServletRequest request) {
if (page == 0) {
page = 1;
}
int firstPosition = (page - 1) * imageService.getMaxResults();
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
return "redirect:/user/login";
}
int uid = ((User) request.getSession().getAttribute("user")).getId();
List<UploadedImage> list = imageService.listByUId(uid, firstPosition, null);
int totalCount = imageService.countByUId(uid);
int pageCount = (int) Math.ceil((float) totalCount / (float) imageService.getMaxResults());
boolean hasLast = page != 1;
boolean hasNext = page != pageCount;
int current = page;
request.setAttribute("totalCount", totalCount);
request.setAttribute("pageCount", pageCount);
request.setAttribute("hasLast", hasLast);
request.setAttribute("hasNext", hasNext);
request.setAttribute("currentPage", current);
request.setAttribute("count", totalCount);
model.addAttribute("imgList", list);
if (user != null) {
user = userService.findById(user.getId());
model.addAttribute("tagList", user.getTagList());
}
List<Gallery> galList = gs.listByUser(uid);
model.addAttribute("galleries", galList);
return "image/list";
}
@RequestMapping(value = "/search")
public String search(@RequestParam(value = "fileName") String fileName,
@RequestParam(value = "page", required = false) Integer page, HttpServletRequest request, Model model,
@RequestParam(required = false) Integer tag) {
if (page == null || page == 0) {
page = 1;
}
int firstPosition = (page - 1) * imageService.getMaxResults();
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
return "redirect:/user/login";
}
int u_id = ((User) request.getSession().getAttribute("user")).getId();
List<UploadedImage> list = imageService.listByUIdAndFileName(u_id, fileName, firstPosition, tag);
int totalCount = imageService.countByUIdAndFileName(u_id, fileName, tag);
int count = imageService.countByUId(u_id);
int pageCount = (int) Math.ceil((float) totalCount / (float) imageService.getMaxResults());
boolean hasLast = page != 1;
boolean hasNext = page != pageCount;
int current = page;
request.setAttribute("totalCount", totalCount);
request.setAttribute("count", count);
request.setAttribute("pageCount", pageCount);
request.setAttribute("hasLast", hasLast);
request.setAttribute("hasNext", hasNext);
request.setAttribute("currentPage", current);
request.setAttribute("fileName", fileName);
model.addAttribute("imgList", list);
if (user != null) {
user = userService.findById(user.getId());
model.addAttribute("tagList", user.getTagList());
}
return "image/list";
}
@RequestMapping(value = "/delete")
public String delete(@RequestParam(value = "id") int id, RedirectAttributes redirectAttributes,
HttpServletRequest request) {
User user = (User) request.getSession().getAttribute("user");
UploadedImage image = imageService.findById(id);
if (user == null || image == null || image.getUser().getId() != user.getId()) {
redirectAttributes.addFlashAttribute("message", "非法登录");
} else {
try {
imageService.delete(id);
redirectAttributes.addFlashAttribute("message", "删除成功");
} catch (Exception e) {
logger.error(e);
redirectAttributes.addFlashAttribute("message", "删除失败,原因是" + e.getMessage());
}
}
return "redirect:/img/list";
}
@RequestMapping(value = "/{filename:[a-zA-Z0-9]{1,}\\.png}")
public void showImg(@PathVariable("filename") String filename, HttpServletRequest request,
HttpServletResponse response) {
String imagePath = request.getServletContext().getRealPath("img");
File file = new File(imagePath + File.separator + filename);
if (file.exists()) {
response.setContentType("image/png");
BufferedOutputStream out = null;
BufferedInputStream in = null;
try {
out = new BufferedOutputStream(response.getOutputStream());
in = new BufferedInputStream(new FileInputStream(file));
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = in.read(buff, 0, buff.length))) {
out.write(buff, 0, bytesRead);
}
} catch (IOException e) {
logger.error(e);
} finally {
if (out != null)
try {
out.close();
} catch (IOException e) {
logger.error(e);
}
if (in != null)
try {
in.close();
} catch (IOException e) {
logger.error(e);
}
}
} else {
try {
response.getWriter().println("File does not exists");
} catch (IOException e) {
logger.error(e);
}
}
}
@RequestMapping(value = "jsonList")
@ResponseBody
public List<UploadedImage> list(HttpSession session, @RequestParam(value = "gid", required = false) Integer gid,
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "name", required = false) String name) {
if (page == null || page == 0) {
page = 1;
}
Object user = session.getAttribute("user");
List<UploadedImage> result = new ArrayList<>();
if (gid == null || gid == 0) {
result = imageService.listByUId(((User) user).getId(), imageService.getMaxResults() * (page - 1), name);
} else {
result = imageService.findByGalIdAndUId(((User) user).getId(), gid, page, name);
}
return result;
}
@RequestMapping(value = "pageCount")
@ResponseBody
public String pageCount(HttpSession session, @RequestParam(value = "gid", required = false) Integer gid,
@RequestParam(value = "name", required = false) String name) {
Object user = session.getAttribute("user");
int result = 0;
if (gid == null || gid == 0) {
result = imageService.countByUId(((User) user).getId(), name);
} else {
result = imageService.countByGalIdAndUId(((User) user).getId(), gid, name);
}
double d = (double) result / imageService.getMaxResults();
BigDecimal bd = new BigDecimal(d);
return String.valueOf(bd.setScale(0, BigDecimal.ROUND_UP).intValue());
}
@ResponseBody
@RequestMapping(value = "batchDelete")
public StatusBean batchDelete(@RequestParam(value = "ids", required = true) String ids, HttpSession session) {
try {
Object user = session.getAttribute("user");
imageService.batchDelete(ids, (User) user);
} catch (Exception e) {
new StatusBean(StatusBean.STATUS_ERROR, e.getMessage());
}
return new StatusBean(StatusBean.STATUS_SUCCESS, "删除成功");
}
@ResponseBody
@RequestMapping(value = "batchMove")
public StatusBean batchMove(@RequestParam(value = "ids", required = true) String ids,
@RequestParam(value = "gid", required = true) Integer gid, HttpSession session) {
try {
Object user = session.getAttribute("user");
imageService.batchMove(ids, (User) user, gid);
} catch (Exception e) {
new StatusBean(StatusBean.STATUS_ERROR, e.getMessage());
}
return new StatusBean(StatusBean.STATUS_SUCCESS, "移动成功");
}
@RequestMapping(value = "search", method = RequestMethod.GET)
public String searchGet(@RequestParam(value = "name") String name, HttpSession session) {
try {
Object user = session.getAttribute("user");
imageService.findByNameAndUser(name, (User) user);
} catch (Exception e) {
new StatusBean(StatusBean.STATUS_ERROR, e.getMessage());
}
return "image/searchForm";
}
}