支持H5保存、分组保存等等

This commit is contained in:
lizhengwei 2025-11-12 18:32:22 +08:00
parent 213107dae0
commit 268c7dcdc8
23 changed files with 1315 additions and 0 deletions

View File

@ -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 '父级分组ID0表示一级分组',
`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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
/**
* <p>
* H5分组 前端控制器
* </p>
*
* @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<H5Group> listAllH5Groups() {
return h5GroupService.list();
}
/**
* 分页查询H5分组
*
* @param pageNum 页码
* @param pageSize 每页大小
* @return H5分组分页数据
*/
@Operation(summary = "分页查询H5分组")
@GetMapping("/page")
public IPage<H5Group> listH5GroupsByPage(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
IPage<H5Group> 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<H5Group> getChildrenByParentId(@PathVariable Long parentId) {
LambdaQueryWrapper<H5Group> 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);
}
}

View File

@ -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;
/**
* <p>
* H5项目 前端控制器
* </p>
*
* @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<H5Project> listAllH5Projects() {
return h5ProjectService.list();
}
/**
* 分页查询H5项目
*
* @param pageNum 页码
* @param pageSize 每页大小
* @return H5项目分页数据
*/
@Operation(summary = "分页查询H5项目")
@GetMapping("/page")
public IPage<H5Project> listH5ProjectsByPage(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
IPage<H5Project> 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<Long> 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<Long> groupIds;
}
}

View File

@ -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<H5ProjectVO> toVO(List<H5Project> entitys) {
List<H5ProjectVO> 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;
}
}

View File

@ -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;
/**
* <p>
* H5分组 Mapper 接口
* </p>
*
* @author your-name
*/
@Mapper
public interface H5GroupDao extends BaseMapper<H5Group> {
}

View File

@ -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;
/**
* <p>
* H5项目 Mapper 接口
* </p>
*
* @author your-name
*/
@Mapper
public interface H5ProjectDao extends BaseMapper<H5Project> {
}

View File

@ -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;
/**
* <p>
* H5项目与分组关联 Mapper 接口
* </p>
*
* @author your-name
*/
@Mapper
public interface H5ProjectGroupDao extends BaseMapper<H5ProjectGroup> {
}

View File

@ -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<H5ProjectContent, String> {
}

View File

@ -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;
}

View File

@ -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;
/**
* 父级分组ID0表示一级分组
*/
private Long parentId;
/**
* 分组类型1-物料 2-用途 3-行业
*/
private Integer type;
/**
* 排序
*/
private Integer sort;
/**
* 状态0-禁用 1-启用
*/
private Integer status;
/**
* 创建时间戳
*/
private Long createTime;
/**
* 更新时间戳
*/
private Long updateTime;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -0,0 +1,15 @@
package com.luban.api.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.luban.api.entity.H5Group;
/**
* <p>
* H5分组 服务类
* </p>
*
* @author your-name
*/
public interface H5GroupService extends IService<H5Group> {
}

View File

@ -0,0 +1,15 @@
package com.luban.api.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.luban.api.entity.H5ProjectGroup;
/**
* <p>
* H5项目与分组关联 服务类
* </p>
*
* @author your-name
*/
public interface H5ProjectGroupService extends IService<H5ProjectGroup> {
}

View File

@ -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;
/**
* <p>
* H5项目 服务类
* </p>
*
* @author your-name
*/
public interface H5ProjectService extends IService<H5Project> {
/**
* 保存H5项目及其内容
* @param h5Project H5项目信息
* @param content 项目内容
* @param groupIds 分组ID列表
* @return 是否保存成功
*/
boolean saveH5ProjectWithContent(H5Project h5Project, String content, List<Long> groupIds);
/**
* 更新H5项目及其内容
* @param h5Project H5项目信息
* @param content 项目内容
* @param groupIds 分组ID列表
* @return 是否更新成功
*/
boolean updateH5ProjectWithContent(H5Project h5Project, String content, List<Long> 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<Long> getProjectGroupIds(Long projectId);
/**
* 获取项目内容
* @param contentId 内容ID
* @return 项目内容
*/
String getProjectContent(String contentId);
}

View File

@ -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;
/**
* <p>
* H5分组 服务实现类
* </p>
*
* @author your-name
*/
@Service
public class H5GroupServiceImpl extends ServiceImpl<H5GroupDao, H5Group> implements H5GroupService {
}

View File

@ -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;
/**
* <p>
* H5项目与分组关联 服务实现类
* </p>
*
* @author your-name
*/
@Service
public class H5ProjectGroupServiceImpl extends ServiceImpl<H5ProjectGroupDao, H5ProjectGroup> implements H5ProjectGroupService {
}

View File

@ -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;
/**
* <p>
* H5项目 服务实现类
* </p>
*
* @author your-name
*/
@Service
public class H5ProjectServiceImpl extends ServiceImpl<H5ProjectDao, H5Project> implements H5ProjectService {
@Autowired
private H5ProjectContentRepository h5ProjectContentRepository;
@Autowired
private H5ProjectGroupDao h5ProjectGroupDao;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveH5ProjectWithContent(H5Project h5Project, String content, List<Long> 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<Long> 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<H5ProjectGroup>()
.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<H5ProjectGroup>()
.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<Long> 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<Long> getProjectGroupIds(Long projectId) {
return h5ProjectGroupDao.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<H5ProjectGroup>()
.eq(H5ProjectGroup::getProjectId, projectId))
.stream()
.map(H5ProjectGroup::getGroupId)
.collect(Collectors.toList());
}
}

View File

@ -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<Long> groupIds;
}

View File

@ -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;
}