diff --git a/ruoyi-site/ruoyi-h5/doc/h5_groups.sql b/ruoyi-site/ruoyi-h5/doc/h5_groups.sql
new file mode 100644
index 000000000..2dc5d2437
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/doc/h5_groups.sql
@@ -0,0 +1,63 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : localhost
+ Source Server Type : MySQL
+ Source Server Version : 80023
+ Source Host : localhost:3306
+ Source Schema : h5
+
+ Target Server Type : MySQL
+ Target Server Version : 80023
+ File Encoding : 65001
+
+ Date: 12/11/2025 15:00:00
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for h5_groups
+-- ----------------------------
+DROP TABLE IF EXISTS `h5_groups`;
+CREATE TABLE `h5_groups` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名称',
+ `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父级分组ID,0表示一级分组',
+ `type` int NOT NULL COMMENT '分组类型:1-物料 2-用途 3-行业',
+ `sort` int NOT NULL DEFAULT 0 COMMENT '排序',
+ `status` int NOT NULL DEFAULT 1 COMMENT '状态:0-禁用 1-启用',
+ `create_time` bigint NULL DEFAULT NULL COMMENT '创建时间戳',
+ `update_time` bigint NULL DEFAULT NULL COMMENT '更新时间戳',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_parent_id`(`parent_id`) USING BTREE,
+ INDEX `idx_type`(`type`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'H5分组表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- 插入默认分组数据
+-- ----------------------------
+INSERT INTO `h5_groups` VALUES (1, '物料', 0, 1, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+INSERT INTO `h5_groups` VALUES (2, '用途', 0, 2, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+INSERT INTO `h5_groups` VALUES (3, '行业', 0, 3, 3, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+
+-- ----------------------------
+-- 插入二级分组数据 - 物料
+-- ----------------------------
+INSERT INTO `h5_groups` VALUES (4, '长页', 1, 1, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+INSERT INTO `h5_groups` VALUES (5, '翻页', 1, 1, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+
+-- ----------------------------
+-- 插入二级分组数据 - 用途
+-- ----------------------------
+INSERT INTO `h5_groups` VALUES (6, '通用', 2, 2, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+INSERT INTO `h5_groups` VALUES (7, '祝福问候', 2, 2, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+
+-- ----------------------------
+-- 插入二级分组数据 - 行业
+-- ----------------------------
+INSERT INTO `h5_groups` VALUES (8, '金融', 3, 3, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+INSERT INTO `h5_groups` VALUES (9, '医疗', 3, 3, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+
+SET FOREIGN_KEY_CHECKS = 1;
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/doc/h5_project_groups.sql b/ruoyi-site/ruoyi-h5/doc/h5_project_groups.sql
new file mode 100644
index 000000000..fd59790b0
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/doc/h5_project_groups.sql
@@ -0,0 +1,34 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : localhost
+ Source Server Type : MySQL
+ Source Server Version : 80023
+ Source Host : localhost:3306
+ Source Schema : h5
+
+ Target Server Type : MySQL
+ Target Server Version : 80023
+ File Encoding : 65001
+
+ Date: 12/11/2025 15:00:00
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for h5_project_groups
+-- ----------------------------
+DROP TABLE IF EXISTS `h5_project_groups`;
+CREATE TABLE `h5_project_groups` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `project_id` bigint NOT NULL COMMENT '项目ID',
+ `group_id` bigint NOT NULL COMMENT '分组ID',
+ `create_time` bigint NULL DEFAULT NULL COMMENT '创建时间戳',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_project_id`(`project_id`) USING BTREE,
+ INDEX `idx_group_id`(`group_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'H5项目与分组关联表' ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/doc/h5_projects.sql b/ruoyi-site/ruoyi-h5/doc/h5_projects.sql
new file mode 100644
index 000000000..cb7a72579
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/doc/h5_projects.sql
@@ -0,0 +1,41 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : localhost
+ Source Server Type : MySQL
+ Source Server Version : 80023
+ Source Host : localhost:3306
+ Source Schema : h5
+
+ Target Server Type : MySQL
+ Target Server Version : 80023
+ File Encoding : 65001
+
+ Date: 12/11/2025 14:30:00
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for h5_projects
+-- ----------------------------
+DROP TABLE IF EXISTS `h5_projects`;
+CREATE TABLE `h5_projects` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `type` varchar(10) NULL DEFAULT NULL COMMENT '类型',
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题',
+ `content_id` varchar(255) not NULL DEFAULT NULL COMMENT '内容在MongoDB中的ID',
+ `content_updated_at` bigint NULL DEFAULT NULL COMMENT '内容更新时间戳',
+ `description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述',
+ `preview_url` varchar(500) NULL DEFAULT NULL COMMENT '预览图URL',
+ `preview_url_watermark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '水印预览图URL',
+ `preview_width` int NULL DEFAULT NULL COMMENT '预览图宽度',
+ `preview_height` int NULL DEFAULT NULL COMMENT '预览图高度',
+ `status` tinyint NULL DEFAULT NULL COMMENT '状态',
+ `create_time` bigint NULL DEFAULT NULL COMMENT '创建时间戳',
+ `update_time` bigint NULL DEFAULT NULL COMMENT '更新时间戳',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'H5项目表' ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5GroupController.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5GroupController.java
new file mode 100644
index 000000000..ddfe163eb
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5GroupController.java
@@ -0,0 +1,125 @@
+package com.luban.api.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.luban.api.entity.H5Group;
+import com.luban.api.service.H5GroupService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ *
+ * H5分组 前端控制器
+ *
+ *
+ * @author your-name
+ */
+@RestController
+@RequestMapping("/h5-groups")
+@Tag(name = "H5分组管理", description = "H5分组管理")
+@Slf4j
+public class H5GroupController {
+
+ @Autowired
+ private H5GroupService h5GroupService;
+
+ /**
+ * 查询所有H5分组
+ *
+ * @return H5分组列表
+ */
+ @Operation(summary = "查询所有H5分组")
+ @GetMapping
+ public List listAllH5Groups() {
+ return h5GroupService.list();
+ }
+
+ /**
+ * 分页查询H5分组
+ *
+ * @param pageNum 页码
+ * @param pageSize 每页大小
+ * @return H5分组分页数据
+ */
+ @Operation(summary = "分页查询H5分组")
+ @GetMapping("/page")
+ public IPage listH5GroupsByPage(@RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ IPage page = new Page<>(pageNum, pageSize);
+ return h5GroupService.page(page);
+ }
+
+ /**
+ * 根据ID查询H5分组
+ *
+ * @param id H5分组ID
+ * @return H5分组信息
+ */
+ @Operation(summary = "根据ID查询H5分组")
+ @GetMapping("/{id}")
+ public H5Group getH5GroupById(@PathVariable Long id) {
+ return h5GroupService.getById(id);
+ }
+
+ /**
+ * 根据父级ID查询子分组
+ *
+ * @param parentId 父级ID
+ * @return 子分组列表
+ */
+ @Operation(summary = "根据父级ID查询子分组")
+ @GetMapping("/children/{parentId}")
+ public List getChildrenByParentId(@PathVariable Long parentId) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(H5Group::getParentId, parentId);
+ return h5GroupService.list(queryWrapper);
+ }
+
+ /**
+ * 创建H5分组
+ *
+ * @param h5Group H5分组信息
+ * @return 创建结果
+ */
+ @Operation(summary = "创建H5分组")
+ @PostMapping
+ public boolean createH5Group(@RequestBody H5Group h5Group) {
+ long currentTime = System.currentTimeMillis() / 1000;
+ h5Group.setCreateTime(currentTime);
+ h5Group.setUpdateTime(currentTime);
+ return h5GroupService.save(h5Group);
+ }
+
+ /**
+ * 更新H5分组
+ *
+ * @param id H5分组ID
+ * @param h5Group H5分组信息
+ * @return 更新结果
+ */
+ @Operation(summary = "更新H5分组")
+ @PutMapping("/{id}")
+ public boolean updateH5Group(@PathVariable Long id, @RequestBody H5Group h5Group) {
+ h5Group.setId(id);
+ h5Group.setUpdateTime(System.currentTimeMillis() / 1000);
+ return h5GroupService.updateById(h5Group);
+ }
+
+ /**
+ * 删除H5分组
+ *
+ * @param id H5分组ID
+ * @return 删除结果
+ */
+ @Operation(summary = "删除H5分组")
+ @DeleteMapping("/{id}")
+ public boolean deleteH5Group(@PathVariable Long id) {
+ return h5GroupService.removeById(id);
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java
new file mode 100644
index 000000000..6b434bd13
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java
@@ -0,0 +1,173 @@
+package com.luban.api.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.luban.api.entity.H5Project;
+import com.luban.api.service.H5ProjectService;
+import com.luban.api.vo.H5ProjectDetailVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ *
+ * H5项目 前端控制器
+ *
+ *
+ * @author your-name
+ */
+@RestController
+@RequestMapping("/h5-projects")
+@Tag(name = "H5项目管理", description = "H5项目管理")
+@Slf4j
+public class H5ProjectController {
+
+ @Autowired
+ private H5ProjectService h5ProjectService;
+
+ /**
+ * 查询所有H5项目
+ *
+ * @return H5项目列表
+ */
+ @Operation(summary = "查询所有H5项目")
+ @GetMapping
+ public List listAllH5Projects() {
+ return h5ProjectService.list();
+ }
+
+ /**
+ * 分页查询H5项目
+ *
+ * @param pageNum 页码
+ * @param pageSize 每页大小
+ * @return H5项目分页数据
+ */
+ @Operation(summary = "分页查询H5项目")
+ @GetMapping("/page")
+ public IPage listH5ProjectsByPage(@RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ IPage page = new Page<>(pageNum, pageSize);
+ return h5ProjectService.page(page);
+ }
+
+ /**
+ * 根据ID查询H5项目
+ *
+ * @param id H5项目ID
+ * @return H5项目信息
+ */
+ @Operation(summary = "根据ID查询H5项目")
+ @GetMapping("/{id}")
+ public H5ProjectDetailVO getH5ProjectById(@PathVariable Long id) {
+ H5Project h5Project = h5ProjectService.getH5ProjectWithContent(id);
+
+ H5ProjectDetailVO detailVO = new H5ProjectDetailVO();
+ detailVO.setProject(h5Project);
+
+ // 获取项目内容
+ if (h5Project != null && h5Project.getContentId() != null) {
+ String content = h5ProjectService.getProjectContent(h5Project.getContentId());
+ detailVO.setContent(content);
+ }
+
+ // 获取项目关联的分组ID列表
+ List groupIds = h5ProjectService.getProjectGroupIds(id);
+ detailVO.setGroupIds(groupIds);
+
+ return detailVO;
+ }
+
+ /**
+ * 创建H5项目
+ *
+ * @param request 包含H5项目信息和内容的请求
+ * @return 项目ID
+ */
+ @Operation(summary = "创建H5项目")
+ @PostMapping
+ public Long createH5Project(@RequestBody CreateH5ProjectRequest request) {
+ H5Project h5Project = new H5Project();
+ h5Project.setType(request.getType());
+ h5Project.setTitle(request.getTitle());
+ h5Project.setContentUpdatedAt(request.getContentUpdatedAt());
+ h5Project.setDescription(request.getDescription());
+ h5Project.setPreviewUrl(request.getPreviewUrl());
+ h5Project.setPreviewUrlWatermark(request.getPreviewUrlWatermark());
+ h5Project.setPreviewWidth(request.getPreviewWidth());
+ h5Project.setPreviewHeight(request.getPreviewHeight());
+ h5Project.setStatus(request.getStatus());
+
+ boolean success = h5ProjectService.saveH5ProjectWithContent(h5Project, request.getContent(), request.getGroupIds());
+ if (success) {
+ return h5Project.getId();
+ } else {
+ throw new RuntimeException("创建项目失败");
+ }
+ }
+
+ /**
+ * 更新H5项目
+ *
+ * @param id H5项目ID
+ * @param request 包含H5项目信息和内容的请求
+ * @return 是否更新成功
+ */
+ @Operation(summary = "更新H5项目")
+ @PutMapping("/{id}")
+ public Boolean updateH5Project(@PathVariable Long id, @RequestBody CreateH5ProjectRequest request) {
+ H5Project h5Project = h5ProjectService.getById(id);
+ if (h5Project == null) {
+ throw new RuntimeException("项目不存在");
+ }
+
+ h5Project.setType(request.getType());
+ h5Project.setTitle(request.getTitle());
+ h5Project.setContentUpdatedAt(request.getContentUpdatedAt());
+ h5Project.setDescription(request.getDescription());
+ h5Project.setPreviewUrl(request.getPreviewUrl());
+ h5Project.setPreviewUrlWatermark(request.getPreviewUrlWatermark());
+ h5Project.setPreviewWidth(request.getPreviewWidth());
+ h5Project.setPreviewHeight(request.getPreviewHeight());
+ h5Project.setStatus(request.getStatus());
+
+ return h5ProjectService.updateH5ProjectWithContent(h5Project, request.getContent(), request.getGroupIds());
+ }
+
+ /**
+ * 删除H5项目
+ *
+ * @param id H5项目ID
+ * @return 是否删除成功
+ */
+ @Operation(summary = "删除H5项目")
+ @DeleteMapping("/{id}")
+ public Boolean deleteH5Project(@PathVariable Long id) {
+ return h5ProjectService.removeH5ProjectWithContent(id);
+ }
+
+ /**
+ * 创建H5项目请求类
+ */
+ @Getter
+ @Setter
+ public static class CreateH5ProjectRequest {
+ private String type;
+ private String title;
+ private String content;
+ private Long contentUpdatedAt;
+ private String description;
+ private String previewUrl;
+ private String previewUrlWatermark;
+ private Integer previewWidth;
+ private Integer previewHeight;
+ private Integer status;
+ private List groupIds;
+ }
+}
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/H5ProjectConvert.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/H5ProjectConvert.java
new file mode 100644
index 000000000..5b8ec8d1f
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/H5ProjectConvert.java
@@ -0,0 +1,54 @@
+package com.luban.api.convert;
+
+import com.luban.api.entity.H5Project;
+import com.luban.api.vo.H5ProjectVO;
+import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * H5项目转换器
+ *
+ * @author your-name
+ */
+public class H5ProjectConvert {
+
+ /**
+ * 将H5Project实体转换为H5ProjectVO视图对象
+ *
+ * @param entity H5Project实体
+ * @return H5ProjectVO视图对象
+ */
+ public static H5ProjectVO toVO(H5Project entity) {
+ H5ProjectVO vo = new H5ProjectVO();
+ BeanUtils.copyProperties(entity, vo);
+ return vo;
+ }
+
+ /**
+ * 将H5Project实体列表转换为H5ProjectVO视图对象列表
+ *
+ * @param entitys H5Project实体列表
+ * @return H5ProjectVO视图对象列表
+ */
+ public static List toVO(List entitys) {
+ List voList = new ArrayList<>();
+ for (H5Project entity : entitys) {
+ voList.add(toVO(entity));
+ }
+ return voList;
+ }
+
+ /**
+ * 将H5ProjectVO视图对象转换为H5Project实体
+ *
+ * @param vo H5ProjectVO视图对象
+ * @return H5Project实体
+ */
+ public static H5Project toEntity(H5ProjectVO vo) {
+ H5Project entity = new H5Project();
+ BeanUtils.copyProperties(vo, entity);
+ return entity;
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5GroupDao.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5GroupDao.java
new file mode 100644
index 000000000..fca886c74
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5GroupDao.java
@@ -0,0 +1,17 @@
+package com.luban.api.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.luban.api.entity.H5Group;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * H5分组 Mapper 接口
+ *
+ *
+ * @author your-name
+ */
+@Mapper
+public interface H5GroupDao extends BaseMapper {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5ProjectDao.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5ProjectDao.java
new file mode 100644
index 000000000..eaedec5a7
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5ProjectDao.java
@@ -0,0 +1,17 @@
+package com.luban.api.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.luban.api.entity.H5Project;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * H5项目 Mapper 接口
+ *
+ *
+ * @author your-name
+ */
+@Mapper
+public interface H5ProjectDao extends BaseMapper {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5ProjectGroupDao.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5ProjectGroupDao.java
new file mode 100644
index 000000000..8227f8c3f
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/H5ProjectGroupDao.java
@@ -0,0 +1,17 @@
+package com.luban.api.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.luban.api.entity.H5ProjectGroup;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * H5项目与分组关联 Mapper 接口
+ *
+ *
+ * @author your-name
+ */
+@Mapper
+public interface H5ProjectGroupDao extends BaseMapper {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/mongo/H5ProjectContentRepository.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/mongo/H5ProjectContentRepository.java
new file mode 100644
index 000000000..554e0ddd3
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dao/mongo/H5ProjectContentRepository.java
@@ -0,0 +1,14 @@
+package com.luban.api.dao.mongo;
+
+import com.luban.api.entity.mongo.H5ProjectContent;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * H5项目内容 Repository
+ *
+ * @author your-name
+ */
+@Repository
+public interface H5ProjectContentRepository extends MongoRepository {
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5ProjectDTO.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5ProjectDTO.java
new file mode 100644
index 000000000..dc7b4534d
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5ProjectDTO.java
@@ -0,0 +1,79 @@
+package com.luban.api.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * H5项目数据传输对象
+ *
+ * @author your-name
+ */
+@Data
+@EqualsAndHashCode
+@Accessors(chain = true)
+@Schema(title = "H5项目DTO")
+public class H5ProjectDTO {
+
+ /**
+ * 项目ID
+ */
+ private Long projectId;
+
+ /**
+ * 分组ID
+ */
+ private Long groupId;
+
+ /**
+ * 类型
+ */
+ private String type;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 内容
+ */
+ private String content;
+
+ /**
+ * 内容更新时间戳
+ */
+ private Long contentUpdatedAt;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 预览图URL
+ */
+ private String previewUrl;
+
+ /**
+ * 水印预览图URL
+ */
+ private String previewUrlWatermark;
+
+ /**
+ * 预览图宽度
+ */
+ private Integer previewWidth;
+
+ /**
+ * 预览图高度
+ */
+ private Integer previewHeight;
+
+ /**
+ * 状态
+ */
+ private Integer status;
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Group.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Group.java
new file mode 100644
index 000000000..8b1e4e310
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Group.java
@@ -0,0 +1,66 @@
+package com.luban.api.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * H5分组实体类
+ *
+ * @author your-name
+ */
+@Data
+@EqualsAndHashCode
+@Accessors(chain = true)
+@TableName("h5_groups")
+@Schema(title = "H5分组对象")
+public class H5Group implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 分组名称
+ */
+ private String name;
+
+ /**
+ * 父级分组ID,0表示一级分组
+ */
+ private Long parentId;
+
+ /**
+ * 分组类型:1-物料 2-用途 3-行业
+ */
+ private Integer type;
+
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ /**
+ * 状态:0-禁用 1-启用
+ */
+ private Integer status;
+
+ /**
+ * 创建时间戳
+ */
+ private Long createTime;
+
+ /**
+ * 更新时间戳
+ */
+ private Long updateTime;
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java
new file mode 100644
index 000000000..ea4907bee
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java
@@ -0,0 +1,91 @@
+package com.luban.api.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * H5项目实体类
+ *
+ * @author your-name
+ */
+@Data
+@EqualsAndHashCode
+@Accessors(chain = true)
+@TableName("h5_projects")
+@Schema(title = "H5项目对象")
+public class H5Project implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 类型
+ */
+ private String type;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 内容在MongoDB中的ID
+ */
+ private String contentId;
+
+ /**
+ * 内容更新时间戳
+ */
+ private Long contentUpdatedAt;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 预览图URL
+ */
+ private String previewUrl;
+
+ /**
+ * 水印预览图URL
+ */
+ private String previewUrlWatermark;
+
+ /**
+ * 预览图宽度
+ */
+ private Integer previewWidth;
+
+ /**
+ * 预览图高度
+ */
+ private Integer previewHeight;
+
+ /**
+ * 状态
+ */
+ private Integer status;
+
+ /**
+ * 创建时间戳
+ */
+ private Long createTime;
+
+ /**
+ * 更新时间戳
+ */
+ private Long updateTime;
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5ProjectGroup.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5ProjectGroup.java
new file mode 100644
index 000000000..1b78a6e6e
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5ProjectGroup.java
@@ -0,0 +1,46 @@
+package com.luban.api.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * H5项目与分组关联实体类
+ *
+ * @author your-name
+ */
+@Data
+@EqualsAndHashCode
+@Accessors(chain = true)
+@TableName("h5_project_groups")
+@Schema(title = "H5项目与分组关联对象")
+public class H5ProjectGroup implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 项目ID
+ */
+ private Long projectId;
+
+ /**
+ * 分组ID
+ */
+ private Long groupId;
+
+ /**
+ * 创建时间戳
+ */
+ private Long createTime;
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/mongo/H5ProjectContent.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/mongo/H5ProjectContent.java
new file mode 100644
index 000000000..f49155cda
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/mongo/H5ProjectContent.java
@@ -0,0 +1,37 @@
+package com.luban.api.entity.mongo;
+
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * H5项目内容实体类 (存储在MongoDB中)
+ *
+ * @author your-name
+ */
+@Data
+@Document(collection = "h5_project_content")
+public class H5ProjectContent {
+
+ /**
+ * 主键ID,与MySQL中H5Project的contentId对应
+ */
+ @Id
+ private String id;
+
+ /**
+ * 内容
+ */
+ private String content;
+
+ /**
+ * 创建时间戳
+ */
+ private Long createTime;
+
+ /**
+ * 更新时间戳
+ */
+ private Long updateTime;
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5GroupService.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5GroupService.java
new file mode 100644
index 000000000..3fc00be80
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5GroupService.java
@@ -0,0 +1,15 @@
+package com.luban.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.luban.api.entity.H5Group;
+
+/**
+ *
+ * H5分组 服务类
+ *
+ *
+ * @author your-name
+ */
+public interface H5GroupService extends IService {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5ProjectGroupService.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5ProjectGroupService.java
new file mode 100644
index 000000000..07665979f
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5ProjectGroupService.java
@@ -0,0 +1,15 @@
+package com.luban.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.luban.api.entity.H5ProjectGroup;
+
+/**
+ *
+ * H5项目与分组关联 服务类
+ *
+ *
+ * @author your-name
+ */
+public interface H5ProjectGroupService extends IService {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5ProjectService.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5ProjectService.java
new file mode 100644
index 000000000..6aa7a8a47
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5ProjectService.java
@@ -0,0 +1,62 @@
+package com.luban.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.luban.api.entity.H5Project;
+
+import java.util.List;
+
+/**
+ *
+ * H5项目 服务类
+ *
+ *
+ * @author your-name
+ */
+public interface H5ProjectService extends IService {
+
+ /**
+ * 保存H5项目及其内容
+ * @param h5Project H5项目信息
+ * @param content 项目内容
+ * @param groupIds 分组ID列表
+ * @return 是否保存成功
+ */
+ boolean saveH5ProjectWithContent(H5Project h5Project, String content, List groupIds);
+
+ /**
+ * 更新H5项目及其内容
+ * @param h5Project H5项目信息
+ * @param content 项目内容
+ * @param groupIds 分组ID列表
+ * @return 是否更新成功
+ */
+ boolean updateH5ProjectWithContent(H5Project h5Project, String content, List groupIds);
+
+ /**
+ * 根据ID获取H5项目及其内容
+ * @param id H5项目ID
+ * @return H5项目信息及内容
+ */
+ H5Project getH5ProjectWithContent(Long id);
+
+ /**
+ * 删除H5项目及其内容
+ * @param id H5项目ID
+ * @return 是否删除成功
+ */
+ boolean removeH5ProjectWithContent(Long id);
+
+ /**
+ * 获取项目关联的分组ID列表
+ * @param projectId 项目ID
+ * @return 分组ID列表
+ */
+ List getProjectGroupIds(Long projectId);
+
+ /**
+ * 获取项目内容
+ * @param contentId 内容ID
+ * @return 项目内容
+ */
+ String getProjectContent(String contentId);
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5GroupServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5GroupServiceImpl.java
new file mode 100644
index 000000000..78aa968f7
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5GroupServiceImpl.java
@@ -0,0 +1,19 @@
+package com.luban.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.luban.api.dao.H5GroupDao;
+import com.luban.api.entity.H5Group;
+import com.luban.api.service.H5GroupService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * H5分组 服务实现类
+ *
+ *
+ * @author your-name
+ */
+@Service
+public class H5GroupServiceImpl extends ServiceImpl implements H5GroupService {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectGroupServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectGroupServiceImpl.java
new file mode 100644
index 000000000..7b57a6b88
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectGroupServiceImpl.java
@@ -0,0 +1,19 @@
+package com.luban.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.luban.api.dao.H5ProjectGroupDao;
+import com.luban.api.entity.H5ProjectGroup;
+import com.luban.api.service.H5ProjectGroupService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * H5项目与分组关联 服务实现类
+ *
+ *
+ * @author your-name
+ */
+@Service
+public class H5ProjectGroupServiceImpl extends ServiceImpl implements H5ProjectGroupService {
+
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java
new file mode 100644
index 000000000..433100311
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java
@@ -0,0 +1,180 @@
+package com.luban.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.luban.api.dao.H5ProjectDao;
+import com.luban.api.dao.H5ProjectGroupDao;
+import com.luban.api.dao.mongo.H5ProjectContentRepository;
+import com.luban.api.entity.H5Project;
+import com.luban.api.entity.H5ProjectGroup;
+import com.luban.api.entity.mongo.H5ProjectContent;
+import com.luban.api.service.H5ProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * H5项目 服务实现类
+ *
+ *
+ * @author your-name
+ */
+@Service
+public class H5ProjectServiceImpl extends ServiceImpl implements H5ProjectService {
+
+ @Autowired
+ private H5ProjectContentRepository h5ProjectContentRepository;
+
+ @Autowired
+ private H5ProjectGroupDao h5ProjectGroupDao;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean saveH5ProjectWithContent(H5Project h5Project, String content, List groupIds) {
+ // 设置创建和更新时间戳
+ long currentTime = System.currentTimeMillis() / 1000;
+ h5Project.setCreateTime(currentTime);
+ h5Project.setUpdateTime(currentTime);
+
+ // 先保存H5Project基本信息到MySQL
+ boolean saved = this.save(h5Project);
+
+ if (saved && StringUtils.hasText(content)) {
+ // 生成contentId
+ String contentId = UUID.randomUUID().toString();
+ h5Project.setContentId(contentId);
+ h5Project.setUpdateTime(System.currentTimeMillis() / 1000);
+ this.updateById(h5Project);
+
+ // 创建H5ProjectContent并保存到MongoDB
+ H5ProjectContent h5ProjectContent = new H5ProjectContent();
+ h5ProjectContent.setId(contentId);
+ h5ProjectContent.setContent(content);
+ h5ProjectContent.setCreateTime(currentTime);
+ h5ProjectContent.setUpdateTime(currentTime);
+
+ h5ProjectContentRepository.save(h5ProjectContent);
+ }
+
+ // 保存项目与分组的关联关系
+ if (saved && groupIds != null && !groupIds.isEmpty()) {
+ saveProjectGroups(h5Project.getId(), groupIds, currentTime);
+ }
+
+ return saved;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean updateH5ProjectWithContent(H5Project h5Project, String content, List groupIds) {
+ // 设置更新时间戳
+ long currentTime = System.currentTimeMillis() / 1000;
+ h5Project.setUpdateTime(currentTime);
+
+ // 更新H5Project基本信息到MySQL
+ boolean updated = this.updateById(h5Project);
+
+ if (updated && StringUtils.hasText(content)) {
+ // 更新或创建H5ProjectContent到MongoDB
+ String contentId = h5Project.getContentId();
+ if (contentId == null) {
+ contentId = UUID.randomUUID().toString();
+ h5Project.setContentId(contentId);
+ h5Project.setUpdateTime(System.currentTimeMillis() / 1000);
+ this.updateById(h5Project);
+ }
+
+ H5ProjectContent h5ProjectContent = h5ProjectContentRepository.findById(contentId).orElse(new H5ProjectContent());
+ h5ProjectContent.setId(contentId);
+ h5ProjectContent.setContent(content);
+ h5ProjectContent.setUpdateTime(currentTime);
+
+ h5ProjectContentRepository.save(h5ProjectContent);
+ }
+
+ // 更新项目与分组的关联关系
+ if (updated && groupIds != null) {
+ h5ProjectGroupDao.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper()
+ .eq(H5ProjectGroup::getProjectId, h5Project.getId()));
+
+ if (!groupIds.isEmpty()) {
+ saveProjectGroups(h5Project.getId(), groupIds, currentTime);
+ }
+ }
+
+ return updated;
+ }
+
+ @Override
+ public H5Project getH5ProjectWithContent(Long id) {
+ // 获取MySQL中的H5Project基本信息
+ H5Project h5Project = this.getById(id);
+
+ if (h5Project != null && h5Project.getContentId() != null) {
+ // 获取MongoDB中的内容
+ H5ProjectContent h5ProjectContent = h5ProjectContentRepository.findById(h5Project.getContentId()).orElse(null);
+ // 可以在这里将content设置到h5Project的某个属性中,如果需要的话
+ }
+
+ return h5Project;
+ }
+
+ @Override
+ public String getProjectContent(String contentId) {
+ if (contentId != null) {
+ H5ProjectContent content = h5ProjectContentRepository.findById(contentId).orElse(null);
+ return content != null ? content.getContent() : null;
+ }
+ return null;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean removeH5ProjectWithContent(Long id) {
+ H5Project h5Project = this.getById(id);
+ if (h5Project != null) {
+ // 先删除MongoDB中的内容
+ if (h5Project.getContentId() != null) {
+ h5ProjectContentRepository.deleteById(h5Project.getContentId());
+ }
+
+ // 删除项目与分组的关联关系
+ h5ProjectGroupDao.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper()
+ .eq(H5ProjectGroup::getProjectId, id));
+
+ // 再删除MySQL中的记录
+ return this.removeById(id);
+ }
+ return false;
+ }
+
+ /**
+ * 保存项目与分组的关联关系
+ * @param projectId 项目ID
+ * @param groupIds 分组ID列表
+ * @param currentTime 当前时间戳
+ */
+ private void saveProjectGroups(Long projectId, List groupIds, long currentTime) {
+ for (Long groupId : groupIds) {
+ H5ProjectGroup projectGroup = new H5ProjectGroup();
+ projectGroup.setProjectId(projectId);
+ projectGroup.setGroupId(groupId);
+ projectGroup.setCreateTime(currentTime);
+ h5ProjectGroupDao.insert(projectGroup);
+ }
+ }
+
+ @Override
+ public List getProjectGroupIds(Long projectId) {
+ return h5ProjectGroupDao.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper()
+ .eq(H5ProjectGroup::getProjectId, projectId))
+ .stream()
+ .map(H5ProjectGroup::getGroupId)
+ .collect(Collectors.toList());
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/vo/H5ProjectDetailVO.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/vo/H5ProjectDetailVO.java
new file mode 100644
index 000000000..9f0c29fb5
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/vo/H5ProjectDetailVO.java
@@ -0,0 +1,37 @@
+package com.luban.api.vo;
+
+import com.luban.api.entity.H5Project;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * H5项目详情VO
+ */
+@Data
+@EqualsAndHashCode
+@Accessors(chain = true)
+@Schema(title = "H5项目详情")
+public class H5ProjectDetailVO {
+
+ /**
+ * 项目基本信息
+ */
+ @Schema(title = "项目基本信息")
+ private H5Project project;
+
+ /**
+ * 项目内容
+ */
+ @Schema(title = "项目内容")
+ private String content;
+
+ /**
+ * 项目关联的分组ID列表
+ */
+ @Schema(title = "项目关联的分组ID列表")
+ private List groupIds;
+}
\ No newline at end of file
diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/vo/H5ProjectVO.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/vo/H5ProjectVO.java
new file mode 100644
index 000000000..7ee3585af
--- /dev/null
+++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/vo/H5ProjectVO.java
@@ -0,0 +1,94 @@
+package com.luban.api.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * H5项目视图对象
+ *
+ * @author your-name
+ */
+@Data
+@EqualsAndHashCode
+@Accessors(chain = true)
+@Schema(title = "H5项目视图对象")
+public class H5ProjectVO {
+
+ /**
+ * 主键ID
+ */
+ private Long id;
+
+ /**
+ * 项目ID
+ */
+ private Long projectId;
+
+ /**
+ * 分组ID
+ */
+ private Long groupId;
+
+ /**
+ * 类型
+ */
+ private String type;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 内容
+ */
+ private String content;
+
+ /**
+ * 内容更新时间戳
+ */
+ private Long contentUpdatedAt;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 预览图URL
+ */
+ private String previewUrl;
+
+ /**
+ * 水印预览图URL
+ */
+ private String previewUrlWatermark;
+
+ /**
+ * 预览图宽度
+ */
+ private Integer previewWidth;
+
+ /**
+ * 预览图高度
+ */
+ private Integer previewHeight;
+
+ /**
+ * 状态
+ */
+ private Integer status;
+
+ /**
+ * 创建时间戳
+ */
+ private Long createTime;
+
+ /**
+ * 更新时间戳
+ */
+ private Long updateTime;
+
+}
\ No newline at end of file