Bladeren bron

1.文章去除关联圈子
2.发布文章去除关联圈子,改为直连板块
3.图上上传都带上水印

fangzhen 6 maanden geleden
bovenliggende
commit
2418560310

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java

@@ -9,6 +9,7 @@ import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.FileUploadUtils;
 import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.common.utils.file.ImageUtils;
 import com.ruoyi.framework.config.ServerConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -92,6 +93,24 @@ public class CommonController {
                 }
                 FileUtils.screenShots(fileName.replace("/profile", RuoYiConfig.getProfile()), thumbnailPath, "00:00:01");
             }
+
+            if ("image".equalsIgnoreCase(fileType)) {
+                //获取用户名
+                String username = SecurityUtils.getUsername();
+                // 原始文件
+                if (fileName.contains("/profile/upload")) {
+                    fileName = fileName.replace("/profile/upload", "");
+                }
+
+                File sourceFile = new File(filePath + fileName);
+                //图片添加水印
+                String watermarkFileName = "watermark_" + fileName;
+                File destFile = new File(filePath + fileName);
+                // 加水印
+                ImageUtils.addWatermark(sourceFile, destFile, "@" + username, "次元时代-ACG爱好者社区");
+                fileName = watermarkFileName;
+            }
+
             AjaxResult ajax = AjaxResult.success();
             ajax.put("url", url);
             ajax.put("fileName", fileName);

+ 77 - 44
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java

@@ -1,55 +1,46 @@
 package com.ruoyi.common.utils.file;
 
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Arrays;
-import org.apache.poi.util.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.utils.StringUtils;
+import org.apache.poi.util.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Arrays;
 
 /**
  * 图片处理工具类
  *
  * @author ruoyi
  */
-public class ImageUtils
-{
+public class ImageUtils {
     private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
 
-    public static byte[] getImage(String imagePath)
-    {
+    public static byte[] getImage(String imagePath) {
         InputStream is = getFile(imagePath);
-        try
-        {
+        try {
             return IOUtils.toByteArray(is);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("图片加载异常 {}", e);
             return null;
-        }
-        finally
-        {
+        } finally {
             IOUtils.closeQuietly(is);
         }
     }
 
-    public static InputStream getFile(String imagePath)
-    {
-        try
-        {
+    public static InputStream getFile(String imagePath) {
+        try {
             byte[] result = readFile(imagePath);
             result = Arrays.copyOf(result, result.length);
             return new ByteArrayInputStream(result);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("获取图片异常 {}", e);
         }
         return null;
@@ -57,17 +48,14 @@ public class ImageUtils
 
     /**
      * 读取文件为字节数据
-     * 
+     *
      * @param url 地址
      * @return 字节数据
      */
-    public static byte[] readFile(String url)
-    {
+    public static byte[] readFile(String url) {
         InputStream in = null;
-        try
-        {
-            if (url.startsWith("http"))
-            {
+        try {
+            if (url.startsWith("http")) {
                 // 网络地址
                 URL urlObj = new URL(url);
                 URLConnection urlConnection = urlObj.openConnection();
@@ -75,24 +63,69 @@ public class ImageUtils
                 urlConnection.setReadTimeout(60 * 1000);
                 urlConnection.setDoInput(true);
                 in = urlConnection.getInputStream();
-            }
-            else
-            {
+            } else {
                 // 本机地址
                 String localPath = RuoYiConfig.getProfile();
                 String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX);
                 in = new FileInputStream(downloadPath);
             }
             return IOUtils.toByteArray(in);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("获取文件路径异常 {}", e);
             return null;
-        }
-        finally
-        {
+        } finally {
             IOUtils.closeQuietly(in);
         }
     }
+
+
+    /**
+     * 添加图片水印
+     *
+     * @param sourceFile    文件源路径
+     * @param destFile      文件路径
+     * @param watermarkText 水印信息
+     * @throws Exception 异常
+     */
+    public static void addWatermark(File sourceFile, File destFile, String watermarkText1, String watermarkText2) throws Exception {
+        // 读取图片
+        BufferedImage image = ImageIO.read(sourceFile);
+
+        // 获取图片宽高
+        int width = image.getWidth();
+        int height = image.getHeight();
+
+        // 创建 Graphics2D 对象
+        Graphics2D g2d = (Graphics2D) image.getGraphics();
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+        // 根据图片大小调整字体大小
+        int fontSize = Math.max(width, height) / 40; // 字体大小为图片较大边长的 1/20
+        g2d.setFont(new Font("SimHei", Font.BOLD, fontSize));
+        g2d.setColor(new Color(255, 255, 255, 128)); // 白色半透明
+
+        // 计算水印文本宽高
+        FontMetrics fontMetrics = g2d.getFontMetrics();
+        // 第一行水印的宽高
+        int textWidth1 = fontMetrics.stringWidth(watermarkText1);
+        int textHeight = fontMetrics.getHeight(); // 每行的高度
+
+        // 第二行水印的宽度
+        int textWidth2 = fontMetrics.stringWidth(watermarkText2);
+
+        // 计算水印的位置(右下角,分两行)
+        int padding = width / 50; // 边距
+        int x1 = width - textWidth1 - padding; // 第一行水平位置
+        int x2 = width - textWidth2 - padding; // 第二行水平位置
+        int y1 = height - textHeight - padding; // 第一行垂直位置
+        int y2 = height - padding; // 第二行垂直位置
+
+        // 绘制两行水印
+        g2d.drawString(watermarkText1, x1, y1);
+        g2d.drawString(watermarkText2, x2, y2);
+        g2d.dispose();
+
+        // 保存处理后的图片
+        ImageIO.write(image, "jpg", destFile);
+    }
 }

+ 2 - 6
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/CommunityArticleController.java

@@ -110,12 +110,8 @@ public class CommunityArticleController extends BaseController {
     @Transactional
     //@Anonymous
     public AjaxResult article(@RequestBody CommunityArticle communityArticle) {
-        if (communityArticle.getCircleIds().isEmpty()) {
-            return AjaxResult.error("圈子不能为空");
-        }
-
-        if (communityArticle.getCircleIds().size() > 5) {
-            return AjaxResult.error("只能绑定5个圈子!");
+        if (communityArticle.getClassIds().isEmpty()) {
+            return AjaxResult.error("板块不能为空");
         }
 
         communityArticleService.insertCommunityArticle(communityArticle);

+ 3 - 11
ruoyi-generator/src/main/java/com/ruoyi/generator/domain/Community/CommunityArticle.java

@@ -51,14 +51,6 @@ public class CommunityArticle implements Serializable {
     @ApiModelProperty("文章标题")
     private String title;
 
-    /**
-     * 分类id
-     */
-    @ApiModelProperty("分类id")
-    @TableField(exist = false)
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long classId;
-
     /**
      * 圈子id
      */
@@ -74,11 +66,11 @@ public class CommunityArticle implements Serializable {
     private String content;
 
     /**
-     * 板块圈子
+     * 板块id
      */
-    @ApiModelProperty("板块圈子")
+    @ApiModelProperty("板块id")
     @TableField(exist = false)
-    private List<String> circleIds;
+    private List<Long> classIds;
 
     /**
      * 文章标签

+ 5 - 5
ruoyi-generator/src/main/java/com/ruoyi/generator/domain/Community/CommunityArticleCircle.java → ruoyi-generator/src/main/java/com/ruoyi/generator/domain/Community/CommunityArticleClass.java

@@ -14,11 +14,11 @@ import java.util.Date;
 
 /**
 * 文章关联圈子
-* @TableName community_article_circle
+* @TableName community_article_class
 */
-@TableName("community_article_circle")
+@TableName("community_article_class")
 @Data
-public class CommunityArticleCircle implements Serializable {
+public class CommunityArticleClass implements Serializable {
 
     /**
     * 唯一id
@@ -37,9 +37,9 @@ public class CommunityArticleCircle implements Serializable {
     /**
     * 圈子id
     */
-    @ApiModelProperty("圈子id")
+    @ApiModelProperty("板块id")
     @JsonSerialize(using = ToStringSerializer.class)
-    private Long circleId;
+    private Long classId;
     /**
     * 创建人
     */

+ 2 - 2
ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/community/CommunityArticleCircleMapper.java

@@ -1,9 +1,9 @@
 package com.ruoyi.generator.mapper.community;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.generator.domain.Community.CommunityArticleCircle;
+import com.ruoyi.generator.domain.Community.CommunityArticleClass;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
-public interface CommunityArticleCircleMapper extends BaseMapper<CommunityArticleCircle> {
+public interface CommunityArticleCircleMapper extends BaseMapper<CommunityArticleClass> {
 }

+ 2 - 2
ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/community/CommunityArticleMapper.java

@@ -20,7 +20,7 @@ import java.util.List;
 public interface CommunityArticleMapper extends BaseMapper<CommunityArticle> {
 
     int selectCommunityArticleCount(@Param("communityArticle") CommunityArticle communityArticle,
-                                    @Param("circleIds") List<Long> circleIds,
+                                    @Param("classIds") List<Long> classIds,
                                     @Param("searchType") int searchType);
 
     /**
@@ -30,7 +30,7 @@ public interface CommunityArticleMapper extends BaseMapper<CommunityArticle> {
      * @return 文章首页信息
      */
     List<CommunityArticleVo> selectCommunityArticleList(@Param("communityArticle") CommunityArticle communityArticle,
-                                                        @Param("circleIds") List<Long> circleIds,
+                                                        @Param("classIds") List<Long> classIds,
                                                         @Param("offset") int offset,
                                                         @Param("limit") int limit,
                                                         @Param("searchType") int searchType);

+ 2 - 2
ruoyi-generator/src/main/java/com/ruoyi/generator/service/CommunityArticleCircleImpl.java → ruoyi-generator/src/main/java/com/ruoyi/generator/service/CommunityArticleClassImpl.java

@@ -1,10 +1,10 @@
 package com.ruoyi.generator.service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.generator.domain.Community.CommunityArticleCircle;
+import com.ruoyi.generator.domain.Community.CommunityArticleClass;
 import com.ruoyi.generator.mapper.community.CommunityArticleCircleMapper;
 import org.springframework.stereotype.Service;
 
 @Service
-public class CommunityArticleCircleImpl extends ServiceImpl<CommunityArticleCircleMapper, CommunityArticleCircle> implements ICommunityArticleCircleService {
+public class CommunityArticleClassImpl extends ServiceImpl<CommunityArticleCircleMapper, CommunityArticleClass> implements ICommunityArticleClassService {
 }

+ 19 - 40
ruoyi-generator/src/main/java/com/ruoyi/generator/service/CommunityArticleServiceImpl.java

@@ -80,7 +80,7 @@ public class CommunityArticleServiceImpl extends ServiceImpl<CommunityArticleMap
     private CommunityUserInfoMapper communityUserInfoMapper;
 
     @Autowired
-    private ICommunityArticleCircleService communityArticleCircleService;
+    private ICommunityArticleClassService communityArticleClassService;
 
     @Autowired
     private CommunityCollectionArticleMapper communityCollectionArticleMapper;
@@ -111,9 +111,8 @@ public class CommunityArticleServiceImpl extends ServiceImpl<CommunityArticleMap
     @Override
     public List<CommunityArticleVo> selectCommunityArticleList(TableDataInfo rspData, CommunityArticle communityArticle, int pageNum, int pageSize, int searchType) {
         //找出板块下的分类
-        Long classId = communityArticle.getClassId();
+        List<Long> classIds = communityArticle.getClassIds();
         Long id = communityArticle.getId();
-        Long circleId = communityArticle.getCircleId();
         Long userId = SecurityUtils.getUserId();
         List<CommunityArticleVo> communityArticleVos = null;
         if (Objects.nonNull(id)) {
@@ -123,34 +122,14 @@ public class CommunityArticleServiceImpl extends ServiceImpl<CommunityArticleMap
             communityArticleMapper.updateById(article);
         }
 
-        List<Long> circleIds = null;
-        if (Objects.nonNull(classId)) {
-            List<CommunityClassCircle> classCircles = communityClassCircleMapper.selectList(new QueryWrapper<CommunityClassCircle>().eq("class_id", classId));
-            circleIds = new ArrayList<>();
-            for (CommunityClassCircle classCircle : classCircles) {
-                circleIds.add(classCircle.getCircleId());
-            }
-        }
-
-        //如果有圈子id,则按照传递的圈子id取文章数据
-        if (Objects.nonNull(circleId)) {
-            circleIds = new ArrayList<>();
-            circleIds.add(circleId);
-        }
-
-        //如果没有圈子,则返回null数据
-        if (Objects.isNull(circleIds) || circleIds.isEmpty()) {
-            communityArticleVos = new ArrayList<>();
-        }
-
         //根据分类查找文章
         int offset = (pageNum - 1) * pageSize;
-        communityArticleVos = communityArticleMapper.selectCommunityArticleList(communityArticle, circleIds, offset, pageSize, searchType);
-        rspData.setTotal(communityArticleMapper.selectCommunityArticleCount(communityArticle, circleIds, searchType));
+        communityArticleVos = communityArticleMapper.selectCommunityArticleList(communityArticle, classIds, offset, pageSize, searchType);
+        rspData.setTotal(communityArticleMapper.selectCommunityArticleCount(communityArticle, classIds, searchType));
         List<CommunityArticleVo> communityArticleVos_copy = new ArrayList<>(communityArticleVos);
         for (CommunityArticleVo articleVo : communityArticleVos_copy) {
             List<Map<String, Object>> imageList = articleVo.getImageList();
-            articleVo.setCircleIds(circleIds);
+            articleVo.setClassIds(classIds);
             List<CommunityArticleImages> videoList = new ArrayList<>();
             CommunityArticleImages videos = null;
             for (Map<String, Object> image : imageList) {
@@ -297,26 +276,26 @@ public class CommunityArticleServiceImpl extends ServiceImpl<CommunityArticleMap
             articleImages = new CommunityArticleImages();
             articleImages.setArticleId(communityArticle.getId());
             articleImages.setImageUrl(image);
-            articleImages.setUpdateBy(userId);
-            articleImages.setUpdateTime(DateUtils.parseDate(DateUtils.getTime()));
             articleImages.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
             articleImages.setCreateBy(userId);
             communityArticleImagesMapper.insert(articleImages);
         }
 
-        //插入圈子
-        List<String> circleIds = communityArticle.getCircleIds();
-        List<CommunityArticleCircle> articleCircles = new ArrayList<>();
-        CommunityArticleCircle articleCircle = null;
-        for (String circleId : circleIds) {
-            articleCircle = new CommunityArticleCircle();
-            articleCircle.setCircleId(Long.parseLong(circleId));
-            articleCircle.setArticleId(communityArticle.getId());
-            articleCircle.setCreateBy(userId);
-            articleCircle.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
-            articleCircles.add(articleCircle);
+        //插入板块
+        List<Long> classIds = communityArticle.getClassIds();
+        if (!classIds.isEmpty()) {
+            List<CommunityArticleClass> articleClasses = new ArrayList<>();
+            CommunityArticleClass articleClass = null;
+            for (Long classId : classIds) {
+                articleClass = new CommunityArticleClass();
+                articleClass.setClassId(classId);
+                articleClass.setArticleId(communityArticle.getId());
+                articleClass.setCreateBy(userId);
+                articleClass.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
+                articleClasses.add(articleClass);
+            }
+            communityArticleClassService.saveBatch(articleClasses);
         }
-        communityArticleCircleService.saveBatch(articleCircles);
 
         //插入合集
         List<String> collectionIds = communityArticle.getCollectionIds();

+ 0 - 7
ruoyi-generator/src/main/java/com/ruoyi/generator/service/ICommunityArticleCircleService.java

@@ -1,7 +0,0 @@
-package com.ruoyi.generator.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.generator.domain.Community.CommunityArticleCircle;
-
-public interface ICommunityArticleCircleService extends IService<CommunityArticleCircle> {
-}

+ 7 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/service/ICommunityArticleClassService.java

@@ -0,0 +1,7 @@
+package com.ruoyi.generator.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.generator.domain.Community.CommunityArticleClass;
+
+public interface ICommunityArticleClassService extends IService<CommunityArticleClass> {
+}

+ 3 - 3
ruoyi-generator/src/main/java/com/ruoyi/generator/vo/CommunityArticleVo.java

@@ -109,11 +109,11 @@ public class CommunityArticleVo extends BaseEntity implements Serializable {
     private List<Map<String, Object>> imageList;
 
     /**
-     * 圈子id
+     * 板块id
      */
-    @ApiModelProperty("圈子信息")
+    @ApiModelProperty("板块信息")
     @JsonSerialize(using = ToStringSerializer.class)
-    private List<Long> circleIds;
+    private List<Long> classIds;
 
     @ApiModelProperty("文章视频集合")
     @TableField(exist = false)

+ 10 - 10
ruoyi-generator/src/main/resources/mapper/community/ArticleMapper.xml

@@ -160,7 +160,7 @@
         from
         community_article a
         left join sys_user c on a.user_id = c.user_id
-        left join community_article_circle e on e.article_id = a.id
+        left join community_article_class e on e.article_id = a.id
         left join community_article_tag f on f.article_id = a.id
         <where>
             <if test="communityArticle.id != null and communityArticle.id != ''">
@@ -169,10 +169,10 @@
             <if test="communityArticle.title != null and communityArticle.title != ''">
                 AND a.title like concat('%', #{communityArticle.title}, '%')
             </if>
-            <if test="circleIds != null and circleIds.size() > 0">
-                and e.circle_id IN
-                <foreach collection="circleIds" item="circleId" index="index" open="(" close=")" separator=",">
-                    #{circleId}
+            <if test="classIds != null and classIds.size() > 0">
+                and e.class_id IN
+                <foreach collection="classIds" item="classId" index="index" open="(" close=")" separator=",">
+                    #{classId}
                 </foreach>
             </if>
             <if test="communityArticle.userId != null and communityArticle.userId != ''">
@@ -208,7 +208,7 @@
         SELECT COUNT(DISTINCT a.id)
         FROM community_article a
         LEFT JOIN sys_user c ON a.user_id = c.user_id
-        LEFT JOIN community_article_circle e ON e.article_id = a.id
+        LEFT JOIN community_article_class e ON e.article_id = a.id
         LEFT JOIN community_article_tag f ON f.article_id = a.id
         <where>
             <if test="communityArticle.id != null and communityArticle.id != ''">
@@ -217,10 +217,10 @@
             <if test="communityArticle.title != null and communityArticle.title != ''">
                 AND a.title LIKE CONCAT('%', #{communityArticle.title}, '%')
             </if>
-            <if test="circleIds != null and circleIds.size() > 0">
-                AND e.circle_id IN
-                <foreach collection="circleIds" item="circleId" open="(" close=")" separator=",">
-                    #{circleId}
+            <if test="classIds != null and classIds.size() > 0">
+                AND e.class_id IN
+                <foreach collection="classIds" item="classId" open="(" close=")" separator=",">
+                    #{classId}
                 </foreach>
             </if>
             <if test="communityArticle.userId != null and communityArticle.userId != ''">