Procházet zdrojové kódy

1.编写通用已读功能
2.编写站内信封装列表接口
3.将资源新增去除部分限制

honorfire před 6 měsíci
rodič
revize
952eed44fb
11 změnil soubory, kde provedl 789 přidání a 0 odebrání
  1. 168 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/UserReadController.java
  2. 75 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UserRead.java
  3. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UserReadEnum.java
  4. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/UserReadMapper.java
  5. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/UserReadMapper.xml
  6. 48 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadAddParam.java
  7. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadEditParam.java
  8. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadIdParam.java
  9. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadPageParam.java
  10. 113 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserReadService.java
  11. 144 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserReadServiceImpl.java

+ 168 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/UserReadController.java

@@ -0,0 +1,168 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+
+import vip.xiaonuo.disk.domain.CourseOpen;
+import vip.xiaonuo.disk.domain.UserRead;
+import vip.xiaonuo.disk.param.userread.UserReadAddParam;
+import vip.xiaonuo.disk.param.userread.UserReadEditParam;
+import vip.xiaonuo.disk.param.userread.UserReadIdParam;
+import vip.xiaonuo.disk.param.userread.UserReadPageParam;
+import vip.xiaonuo.disk.service.UserReadService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用已读表控制器
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ */
+@Api(tags = "通用已读表控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class UserReadController {
+
+    @Resource
+    private UserReadService userReadService;
+
+    /**
+     * 通用已读-获取分页列表
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("通用已读-获取分页列表")
+    @GetMapping("/disk/userread/page")
+    public CommonResult<Page<UserRead>> page(UserReadPageParam userReadPageParam) {
+        return CommonResult.data(userReadService.page(userReadPageParam));
+    }
+
+    /**
+     * 通用已读-添加
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("通用已读-添加")
+    @CommonLog("通用已读-添加")
+    @PostMapping("/disk/userread/add")
+    public CommonResult<String> add(@RequestBody @Valid UserReadAddParam userReadAddParam) {
+        Map param=new HashMap();
+        UserRead userRead = BeanUtil.toBean(userReadAddParam, UserRead.class);
+        userRead.setUserId(StpLoginUserUtil.getLoginUser().getId());
+        param.put("mainId",userRead.getMainId());
+        param.put("userId",StpLoginUserUtil.getLoginUser().getId());
+        param.put("funcType",userRead.getFuncType());
+        List<UserRead> alreadyReadList=userReadService.wrapperList(param);
+        if(!(alreadyReadList.size()>0))
+        {
+            userReadService.addOne(userRead);
+        }
+        return CommonResult.ok();
+    }
+
+    /**
+     * 通用已读-编辑
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("通用已读-编辑")
+    @CommonLog("通用已读-编辑")
+    @PostMapping("/disk/userread/edit")
+    public CommonResult<String> edit(@RequestBody @Valid UserReadEditParam userReadEditParam) {
+        UserRead userRead = BeanUtil.toBean(userReadEditParam, UserRead.class);
+        userReadService.editOne(userRead);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 通用已读-删除
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("通用已读-删除")
+    @CommonLog("通用已读-删除")
+    @PostMapping("/disk/userread/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<UserReadIdParam> userReadIdParamList) {
+        userReadService.delete(userReadIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 通用已读-详情
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("通用已读-详情")
+    @GetMapping("/disk/userread/detail")
+    public CommonResult<UserRead> detail(@Valid UserReadIdParam userReadIdParam) {
+        return CommonResult.data(userReadService.detail(userReadIdParam));
+    }
+
+    /**
+     * 通用阅读-获取数量
+     *
+     * @author xuyuxiang
+     * @date 2022/4/24 20:00
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("通用阅读-获取数量")
+    @GetMapping("/dev/userread/getCount")
+    public CommonResult<Map<String,Object>> getCount(HttpServletRequest req) {
+        Map param=new HashMap();
+        if(StringUtils.isEmpty(req.getParameter("funcType")))return CommonResult.error("功能类型不能为空");
+        //功能类型,1站内信2公告
+        String funcType=req.getParameter("funcType");
+        param.put("funcType", funcType);
+        param.put("userId", StpLoginUserUtil.getLoginUser().getId());
+        Map<String,Object> result=userReadService.getCount(param);
+
+        return CommonResult.data(result);
+    }
+
+}

+ 75 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UserRead.java

@@ -0,0 +1,75 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 通用已读表实体
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Getter
+@Setter
+@TableName("USER_READ")
+public class UserRead {
+
+    /** ID */
+    @TableId
+    @ApiModelProperty(value = "ID", position = 1)
+    private String id;
+
+    /** 业务id */
+    @ApiModelProperty(value = "业务id", position = 2)
+    private String mainId;
+
+    /** 用户id */
+    @ApiModelProperty(value = "用户id", position = 3)
+    private String userId;
+
+    /** 功能标识,1站内信2公告 */
+    @ApiModelProperty(value = "功能标识,1站内信2公告", position = 4)
+    private String funcType;
+
+    /** 删除标记(NOT_DELETE-未删除) */
+    @ApiModelProperty(value = "删除标记(NOT_DELETE-未删除)", position = 5)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 记录更新时间 */
+    @ApiModelProperty(value = "记录更新时间", position = 6)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 记录创建时间 */
+    @ApiModelProperty(value = "记录创建时间", position = 7)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 记录创建人 */
+    @ApiModelProperty(value = "记录创建人", position = 8)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 记录更新人 */
+    @ApiModelProperty(value = "记录更新人", position = 9)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UserReadEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.domain;
+
+import lombok.Getter;
+
+/**
+ * 通用已读表枚举
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Getter
+public enum UserReadEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    UserReadEnum(String value) {
+        this.value = value;
+    }
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/UserReadMapper.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.disk.domain.UserRead;
+
+import java.util.Map;
+
+/**
+ * 通用已读表Mapper接口
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+public interface UserReadMapper extends BaseMapper<UserRead> {
+
+    /**
+     * 通用阅读-获取数量
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    Map<String,Object> getCount(Map param);
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/UserReadMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.disk.mapper.UserReadMapper">
+
+    <select id="getCount" resultType="java.util.Map">
+        SELECT
+            collectCount.allCount -collectCount.alreadyCount AS unreadCount
+        from(
+                SELECT
+                    <if test="funcType == 1">
+                        (SELECT count(dme.ID) FROM DEV_MESSAGE dme WHERE dme.DELETE_FLAG='NOT_DELETE') AS allCount,
+                    </if>
+                    <if test="funcType == 2">
+                        (SELECT count(noe.NOTICE_ID) FROM "notice" noe WHERE noe.DELETE_FLAG='NOT_DELETE') AS allCount,
+                    </if>
+                    (SELECT count(ur.USER_ID)
+                     FROM USER_READ ur
+                        <if test="funcType == 1">
+                            LEFT JOIN DEV_MESSAGE dm ON dm.ID = ur.MAIN_ID
+                        </if>
+                        <if test="funcType == 2">
+                            LEFT JOIN "notice" n ON n.NOTICE_ID = ur.MAIN_ID
+                        </if>
+                     WHERE ur.DELETE_FLAG ='NOT_DELETE'
+                        <if test="userId !=null and userId != ''">
+                            AND ur.USER_ID=#{userId}
+                        </if>
+                        <if test="funcType !=null and funcType != ''">
+                            AND ur.FUNC_TYPE =#{funcType}
+                        </if>
+                        ) AS alreadyCount
+                FROM DUAL
+            )AS collectCount
+    </select>
+</mapper>

+ 48 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadAddParam.java

@@ -0,0 +1,48 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.userread;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 通用已读表添加参数
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Getter
+@Setter
+public class UserReadAddParam {
+
+    /** 业务id */
+    @ApiModelProperty(value = "业务id", position = 2)
+    @NotBlank(message = "业务id不能为空")
+    private String mainId;
+
+    /** 用户id */
+    @ApiModelProperty(value = "用户id", position = 3)
+    private String userId;
+
+    /** 功能标识,1站内信2公告 */
+    @ApiModelProperty(value = "功能标识,1站内信2公告", position = 4)
+    @NotBlank(message = "功能标识,1站内信2公告不能为空")
+    private String funcType;
+
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadEditParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.userread;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 通用已读表编辑参数
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Getter
+@Setter
+public class UserReadEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 业务id */
+    @ApiModelProperty(value = "业务id", position = 2)
+    private String mainId;
+
+    /** 用户id */
+    @ApiModelProperty(value = "用户id", position = 3)
+    private String userId;
+
+    /** 功能标识,1站内信2公告 */
+    @ApiModelProperty(value = "功能标识,1站内信2公告", position = 4)
+    private String funcType;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.userread;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 通用已读表Id参数
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Getter
+@Setter
+public class UserReadIdParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/userread/UserReadPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.userread;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 通用已读表查询参数
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Getter
+@Setter
+public class UserReadPageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @ApiModelProperty(value = "关键词")
+    private String searchKey;
+
+}

+ 113 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserReadService.java

@@ -0,0 +1,113 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.disk.domain.CourseAuditRecord;
+import vip.xiaonuo.disk.domain.Major;
+import vip.xiaonuo.disk.domain.UserRead;
+import vip.xiaonuo.disk.param.userread.UserReadAddParam;
+import vip.xiaonuo.disk.param.userread.UserReadEditParam;
+import vip.xiaonuo.disk.param.userread.UserReadIdParam;
+import vip.xiaonuo.disk.param.userread.UserReadPageParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用已读表Service接口
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+public interface UserReadService extends IService<UserRead> {
+
+    /**
+     * 获取通用已读表分页
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    Page<UserRead> page(UserReadPageParam userReadPageParam);
+
+    /**
+     * 获取通用已读-封装列表
+     */
+    List<UserRead> wrapperList(Map param);
+
+    /**
+     * 添加通用已读表
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    void add(UserReadAddParam userReadAddParam);
+
+    /**
+     * 通用已读-添加
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    UserRead addOne(UserRead userRead);
+
+    /**
+     * 编辑通用已读表
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    void edit(UserReadEditParam userReadEditParam);
+
+    /**
+     * 通用已读-编辑
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    UserRead editOne(UserRead userRead);
+
+    /**
+     * 删除通用已读表
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    void delete(List<UserReadIdParam> userReadIdParamList);
+
+    /**
+     * 获取通用已读表详情
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    UserRead detail(UserReadIdParam userReadIdParam);
+
+    /**
+     * 通用阅读-获取数量
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     */
+    Map<String,Object> getCount(Map param);
+
+    /**
+     * 获取通用已读表详情
+     *
+     * @author honorfire
+     * @date  2025/08/13 17:35
+     **/
+    UserRead queryEntity(String id);
+
+}

+ 144 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserReadServiceImpl.java

@@ -0,0 +1,144 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.disk.domain.CourseAuditRecord;
+import vip.xiaonuo.disk.domain.UserRead;
+import vip.xiaonuo.disk.mapper.UserReadMapper;
+import vip.xiaonuo.disk.param.userread.UserReadAddParam;
+import vip.xiaonuo.disk.param.userread.UserReadEditParam;
+import vip.xiaonuo.disk.param.userread.UserReadIdParam;
+import vip.xiaonuo.disk.param.userread.UserReadPageParam;
+import vip.xiaonuo.disk.service.UserReadService;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用已读表Service接口实现类
+ *
+ * @author honorfire
+ * @date  2025/08/13 17:35
+ **/
+@Service
+public class UserReadServiceImpl extends ServiceImpl<UserReadMapper, UserRead> implements UserReadService {
+
+    @Resource
+    private UserReadMapper userReadMapper;
+
+    @Override
+    public Page<UserRead> page(UserReadPageParam userReadPageParam) {
+        QueryWrapper<UserRead> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(userReadPageParam.getSortField(), userReadPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(userReadPageParam.getSortOrder());
+            queryWrapper.orderBy(true, userReadPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(userReadPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(UserRead::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    /**
+     * 获取通用已读-封装列表
+     */
+    @Override
+    public List<UserRead> wrapperList(Map param)
+    {
+        QueryWrapper<UserRead> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(param.get("mainId")))
+        {
+            queryWrapper.lambda().eq(UserRead::getMainId, param.get("mainId"));
+        }
+        if(ObjectUtil.isNotEmpty(param.get("userId")))
+        {
+            queryWrapper.lambda().eq(UserRead::getUserId, param.get("userId"));
+        }
+        if(ObjectUtil.isNotEmpty(param.get("funcType")))
+        {
+            queryWrapper.lambda().eq(UserRead::getFuncType, param.get("funcType"));
+        }
+
+        return this.list(queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(UserReadAddParam userReadAddParam) {
+        UserRead userRead = BeanUtil.toBean(userReadAddParam, UserRead.class);
+        this.save(userRead);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UserRead addOne(UserRead userRead) {
+        this.save(userRead);
+        return userRead;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(UserReadEditParam userReadEditParam) {
+        UserRead userRead = this.queryEntity(userReadEditParam.getId());
+        BeanUtil.copyProperties(userReadEditParam, userRead);
+        this.updateById(userRead);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UserRead editOne(UserRead userRead) {
+        this.updateById(userRead);
+        return userRead;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<UserReadIdParam> userReadIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(userReadIdParamList, UserReadIdParam::getId));
+    }
+
+    @Override
+    public UserRead detail(UserReadIdParam userReadIdParam) {
+        return this.queryEntity(userReadIdParam.getId());
+    }
+
+
+    @Override
+    public Map<String,Object> getCount(Map param){
+        return userReadMapper.getCount(param);
+    }
+
+    @Override
+    public UserRead queryEntity(String id) {
+        UserRead userRead = this.getById(id);
+        if(ObjectUtil.isEmpty(userRead)) {
+            throw new CommonException("通用已读表不存在,id值为:{}", id);
+        }
+        return userRead;
+    }
+
+}