From a8cde16c173848a2f222b05f5657d644b5ce9128 Mon Sep 17 00:00:00 2001 From: dongzi Date: Wed, 3 Jun 2026 15:57:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CultureClockInController.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 ftb/src/main/java/ftb/test/controller/CultureClockInController.java diff --git a/ftb/src/main/java/ftb/test/controller/CultureClockInController.java b/ftb/src/main/java/ftb/test/controller/CultureClockInController.java new file mode 100644 index 0000000..153ee0d --- /dev/null +++ b/ftb/src/main/java/ftb/test/controller/CultureClockInController.java @@ -0,0 +1,130 @@ +package jnpf.culture.controller; + +import jnpf.base.ActionResult; +import jnpf.culture.service.CultureClockInService; +import jnpf.exception.HandleException; +import jnpf.model.culture.vo.Base64ImageVo; +import jnpf.model.culture.vo.CultureClockInVo; +import jnpf.model.culture.vo.RecordListVo; +import jnpf.model.culture.vo.YearDataVo; +import jnpf.util.UserProvider; +import org.apache.commons.lang3.tuple.MutablePair; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.util.Base64; + +/** + * 文化打卡 + * + * @author yanwenfu + * @create 2025-12-23 + */ +@RestController +@RequestMapping(value = "/culture/clock-in") +public class CultureClockInController { + + @Resource + private CultureClockInService cultureClockInService; + + @Value("${config.requestUrl}") + private String requestUrl; + + /** + * 打卡分享 - 获取随机图片 + * @param lastCombo 上次组合 + * @param response HttpServletResponse + */ + @GetMapping(value = "/random-preview") + public void getRandomPicPreview(@RequestParam(value = "lastCombo", required = false) String lastCombo, HttpServletRequest request, HttpServletResponse response) throws Exception { + + MutablePair pair = cultureClockInService.getRandomPicPreview(lastCombo, requestUrl); + if (pair == null || pair.getRight() == null) { + response.sendError(HttpServletResponse.SC_NO_CONTENT); + return; + } + response.setContentType("image/png"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0); + response.setHeader("X-ClockIn-Combo", pair.getLeft()); + try (OutputStream os = response.getOutputStream()) { + ImageIO.write(pair.getRight(), "png", os); + os.flush(); + } + } + + /** + * 打卡分享 - 获取随机图片[base64] + * @param lastCombo 上次组合 + * @param response HttpServletResponse + */ + @GetMapping(value = "/random-preview/base64") + public ActionResult getRandomPicPreviewBase64(@RequestParam(value = "lastCombo", required = false) String lastCombo, HttpServletRequest request, HttpServletResponse response) throws Exception { + + MutablePair pair = cultureClockInService.getRandomPicPreview(lastCombo, requestUrl); + if (pair == null || pair.getRight() == null) { + throw new Exception("获取图片失败,请重试"); + } + byte[] bytes; + try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { + ImageIO.write(pair.getRight(), "png", output); + bytes = output.toByteArray(); + } + String base64 = Base64.getEncoder().encodeToString(bytes); + String base64Img = "data:image/png;base64," + base64; + return ActionResult.success(new Base64ImageVo(pair.getLeft(), base64Img)); + } + + /** + * 打卡分享 - 打卡 + * @param currentCombo 当前组合 + * @return jnpf.base.ActionResult + */ + @GetMapping(value = "/pic") + public ActionResult getCultureClockInPic(@RequestParam(value = "currentCombo") String currentCombo) throws Exception { + + if (UserProvider.getUser().getUserAccount().equals("admin")) { + throw new HandleException("管理员账号无法进行打卡"); + } + CultureClockInVo cultureClockIn = cultureClockInService.getCultureClockInPic(currentCombo, requestUrl); + return ActionResult.success(cultureClockIn); + } + + /** + * 打卡动态 - 打卡记录列表 + * @param cursorDate 游标日期(yyyy-MM-dd)[首次不传] + * @param limitNum 返回有数据的天数 + * @return jnpf.base.ActionResult + */ + @GetMapping(value = "/dynamic") + public ActionResult getRecordList(@RequestParam(value = "cursorDate", required = false) String cursorDate, + @RequestParam(value = "limitNum", required = false, defaultValue = "10") Integer limitNum) { + + limitNum = Math.max(10, Math.min(limitNum, 30)); + RecordListVo recordList = cultureClockInService.getRecordList(cursorDate, limitNum); + return ActionResult.success(recordList); + } + + /** + * 打卡日历 + * @param year 年 + * @return jnpf.base.ActionResult + */ + @GetMapping(value = "/year-data") + public ActionResult getYearData(@RequestParam(value = "year") Integer year) { + + YearDataVo yearData = cultureClockInService.getYearData(year); + return ActionResult.success(yearData); + } +}