diff --git a/src/main/java/xyz/playedu/api/constant/BackendConstant.java b/src/main/java/xyz/playedu/api/constant/BackendConstant.java index 59cb1f8..130b36a 100644 --- a/src/main/java/xyz/playedu/api/constant/BackendConstant.java +++ b/src/main/java/xyz/playedu/api/constant/BackendConstant.java @@ -5,4 +5,6 @@ public class BackendConstant { public final static String[] RESOURCE_TYPE_WHITELIST = {"IMAGE", "PDF", "VIDEO", "WORD", "PPT"}; + public final static String[] RESOURCE_DISK_WHITELIST = {"MINIO"}; + } diff --git a/src/main/java/xyz/playedu/api/controller/backend/AdminUserController.java b/src/main/java/xyz/playedu/api/controller/backend/AdminUserController.java index c4d70c9..4dbc8ef 100644 --- a/src/main/java/xyz/playedu/api/controller/backend/AdminUserController.java +++ b/src/main/java/xyz/playedu/api/controller/backend/AdminUserController.java @@ -14,7 +14,7 @@ import xyz.playedu.api.request.backend.AdminUserRequest; import xyz.playedu.api.service.AdminRoleService; import xyz.playedu.api.service.AdminUserRoleService; import xyz.playedu.api.service.AdminUserService; -import xyz.playedu.api.types.PaginationResult; +import xyz.playedu.api.types.paginate.PaginationResult; import xyz.playedu.api.types.JsonResponse; import xyz.playedu.api.util.HelperUtil; diff --git a/src/main/java/xyz/playedu/api/controller/backend/ResourceController.java b/src/main/java/xyz/playedu/api/controller/backend/ResourceController.java new file mode 100644 index 0000000..70e886a --- /dev/null +++ b/src/main/java/xyz/playedu/api/controller/backend/ResourceController.java @@ -0,0 +1,88 @@ +package xyz.playedu.api.controller.backend; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import xyz.playedu.api.constant.BackendConstant; +import xyz.playedu.api.domain.AdminUser; +import xyz.playedu.api.domain.Resource; +import xyz.playedu.api.domain.ResourceCategory; +import xyz.playedu.api.request.backend.ResourceRequest; +import xyz.playedu.api.service.ResourceCategoryService; +import xyz.playedu.api.service.ResourceService; +import xyz.playedu.api.types.JsonResponse; +import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.ResourcePaginateFilter; + +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/23 10:50 + */ +@RestController +@RequestMapping("/backend/v1/resource") +public class ResourceController { + + @Autowired + private ResourceService resourceService; + + @Autowired + private ResourceCategoryService categoryService; + + @GetMapping("/index") + public JsonResponse index(@RequestParam(name = "page", defaultValue = "1") Integer page, @RequestParam(name = "size", defaultValue = "10") Integer size, @RequestParam(name = "name", defaultValue = "") String name) { + ResourcePaginateFilter filter = new ResourcePaginateFilter(); + if (name != null && name.length() > 0) { + filter.setName(name); + } + + PaginationResult result = resourceService.paginate(page, size, filter); + + return JsonResponse.data(result); + } + + @GetMapping("/create") + public JsonResponse create(@RequestParam(name = "type") String type) { + List categories = categoryService.getByType(type); + HashMap data = new HashMap<>(); + data.put("categories", categories); + return JsonResponse.data(data); + } + + @PostMapping("/create") + public JsonResponse store(@RequestBody @Validated ResourceRequest request) { + if (categoryService.getById(request.getCategoryId()) == null) { + return JsonResponse.error("资源分类不存在"); + } + if (!Arrays.asList(BackendConstant.RESOURCE_DISK_WHITELIST).contains(request.getDisk())) { + return JsonResponse.error("存储磁盘参数错误"); + } + + Resource resource = new Resource(); + + resource.setCategoryId(request.getCategoryId()); + resource.setName(request.getName()); + resource.setExtension(request.getExtension()); + resource.setSize(request.getSize()); + resource.setDisk(request.getDisk()); + resource.setFileId(request.getFileId()); + resource.setPath(request.getPath()); + resource.setUrl(request.getUrl()); + resource.setCreatedAt(new Date()); + + resourceService.save(resource); + + return JsonResponse.success(); + } + + @DeleteMapping("/{id}") + public JsonResponse destroy(@PathVariable(name = "id") Integer id) { + resourceService.removeById(id); + return JsonResponse.success(); + } + +} diff --git a/src/main/java/xyz/playedu/api/domain/Resource.java b/src/main/java/xyz/playedu/api/domain/Resource.java new file mode 100644 index 0000000..e0979d5 --- /dev/null +++ b/src/main/java/xyz/playedu/api/domain/Resource.java @@ -0,0 +1,133 @@ +package xyz.playedu.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * + * @TableName resources + */ +@TableName(value ="resources") +@Data +public class Resource implements Serializable { + /** + * + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 分类id + */ + private Integer categoryId; + + /** + * 资源名 + */ + private String name; + + /** + * 文件类型 + */ + private String extension; + + /** + * 大小[字节] + */ + private Long size; + + /** + * 存储磁盘 + */ + private String disk; + + /** + * 文件id + */ + private String fileId; + + /** + * 相对地址 + */ + private String path; + + /** + * URL地址 + */ + private String url; + + /** + * + */ + private Date createdAt; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + Resource other = (Resource) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getCategoryId() == null ? other.getCategoryId() == null : this.getCategoryId().equals(other.getCategoryId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getExtension() == null ? other.getExtension() == null : this.getExtension().equals(other.getExtension())) + && (this.getSize() == null ? other.getSize() == null : this.getSize().equals(other.getSize())) + && (this.getDisk() == null ? other.getDisk() == null : this.getDisk().equals(other.getDisk())) + && (this.getFileId() == null ? other.getFileId() == null : this.getFileId().equals(other.getFileId())) + && (this.getPath() == null ? other.getPath() == null : this.getPath().equals(other.getPath())) + && (this.getUrl() == null ? other.getUrl() == null : this.getUrl().equals(other.getUrl())) + && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getCategoryId() == null) ? 0 : getCategoryId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getExtension() == null) ? 0 : getExtension().hashCode()); + result = prime * result + ((getSize() == null) ? 0 : getSize().hashCode()); + result = prime * result + ((getDisk() == null) ? 0 : getDisk().hashCode()); + result = prime * result + ((getFileId() == null) ? 0 : getFileId().hashCode()); + result = prime * result + ((getPath() == null) ? 0 : getPath().hashCode()); + result = prime * result + ((getUrl() == null) ? 0 : getUrl().hashCode()); + result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", categoryId=").append(categoryId); + sb.append(", name=").append(name); + sb.append(", extension=").append(extension); + sb.append(", size=").append(size); + sb.append(", disk=").append(disk); + sb.append(", fileId=").append(fileId); + sb.append(", path=").append(path); + sb.append(", url=").append(url); + sb.append(", createdAt=").append(createdAt); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/xyz/playedu/api/mapper/ResourceMapper.java b/src/main/java/xyz/playedu/api/mapper/ResourceMapper.java new file mode 100644 index 0000000..1e9ee83 --- /dev/null +++ b/src/main/java/xyz/playedu/api/mapper/ResourceMapper.java @@ -0,0 +1,20 @@ +package xyz.playedu.api.mapper; + +import org.apache.ibatis.annotations.Mapper; +import xyz.playedu.api.domain.Resource; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author tengteng +* @description 针对表【resources】的数据库操作Mapper +* @createDate 2023-02-23 10:50:26 +* @Entity xyz.playedu.api.domain.Resource +*/ +@Mapper +public interface ResourceMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/xyz/playedu/api/request/backend/ResourceRequest.java b/src/main/java/xyz/playedu/api/request/backend/ResourceRequest.java new file mode 100644 index 0000000..2f8e458 --- /dev/null +++ b/src/main/java/xyz/playedu/api/request/backend/ResourceRequest.java @@ -0,0 +1,43 @@ +package xyz.playedu.api.request.backend; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/23 10:52 + */ +@Data +public class ResourceRequest { + + @NotNull(message = "请选择资源分类") + @JsonProperty("category_id") + private Integer categoryId; + + @NotNull(message = "资源名不能为空") + @Length(min = 1, max = 254, message = "资源名长度在1-254个字符之间") + private String name; + + @NotNull(message = "请输入资源扩展") + @Length(min = 1, max = 254, message = "资源扩展长度在1-20个字符之间") + private String extension; + + @NotNull(message = "请输入文件大小") + private Long size; + + @NotNull(message = "请输入文件存储磁盘") + private String disk; + + @NotNull(message = "请输入fileId") + @JsonProperty("file_id") + private String fileId; + + @NotNull(message = "请输入存储路径") + private String path; + + @NotNull(message = "请输入访问URL") + private String url; + +} diff --git a/src/main/java/xyz/playedu/api/service/AdminUserService.java b/src/main/java/xyz/playedu/api/service/AdminUserService.java index b9ff615..e549b65 100644 --- a/src/main/java/xyz/playedu/api/service/AdminUserService.java +++ b/src/main/java/xyz/playedu/api/service/AdminUserService.java @@ -3,9 +3,7 @@ package xyz.playedu.api.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import xyz.playedu.api.domain.AdminUser; import com.baomidou.mybatisplus.extension.service.IService; -import xyz.playedu.api.types.PaginationResult; - -import java.util.Date; +import xyz.playedu.api.types.paginate.PaginationResult; /** * @author tengteng diff --git a/src/main/java/xyz/playedu/api/service/ResourceService.java b/src/main/java/xyz/playedu/api/service/ResourceService.java new file mode 100644 index 0000000..5e2a846 --- /dev/null +++ b/src/main/java/xyz/playedu/api/service/ResourceService.java @@ -0,0 +1,17 @@ +package xyz.playedu.api.service; + +import xyz.playedu.api.domain.Resource; +import com.baomidou.mybatisplus.extension.service.IService; +import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.ResourcePaginateFilter; + +/** + * @author tengteng + * @description 针对表【resources】的数据库操作Service + * @createDate 2023-02-23 10:50:26 + */ +public interface ResourceService extends IService { + + PaginationResult paginate(int page, int size, ResourcePaginateFilter filter); + +} diff --git a/src/main/java/xyz/playedu/api/service/impl/AdminUserServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/AdminUserServiceImpl.java index 145dced..ce85ff3 100644 --- a/src/main/java/xyz/playedu/api/service/impl/AdminUserServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/AdminUserServiceImpl.java @@ -8,7 +8,7 @@ import xyz.playedu.api.domain.AdminUser; import xyz.playedu.api.service.AdminUserService; import xyz.playedu.api.mapper.AdminUserMapper; import org.springframework.stereotype.Service; -import xyz.playedu.api.types.PaginationResult; +import xyz.playedu.api.types.paginate.PaginationResult; @Service public class AdminUserServiceImpl extends ServiceImpl implements AdminUserService { diff --git a/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java new file mode 100644 index 0000000..f9c2370 --- /dev/null +++ b/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java @@ -0,0 +1,50 @@ +package xyz.playedu.api.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import xyz.playedu.api.domain.Resource; +import xyz.playedu.api.service.ResourceService; +import xyz.playedu.api.mapper.ResourceMapper; +import org.springframework.stereotype.Service; +import xyz.playedu.api.types.paginate.PaginationResult; +import xyz.playedu.api.types.paginate.ResourcePaginateFilter; + +/** + * @author tengteng + * @description 针对表【resources】的数据库操作Service实现 + * @createDate 2023-02-23 10:50:26 + */ +@Service +public class ResourceServiceImpl extends ServiceImpl implements ResourceService { + + @Override + public PaginationResult paginate(int page, int size, ResourcePaginateFilter filter) { + QueryWrapper wrapper = query().getWrapper().eq("1", "1"); + if (filter != null) { + if (filter.getName() != null) { + wrapper.like("name", "%" + filter.getName() + "%"); + } + if (filter.getDisk() != null) { + wrapper.eq("disk", filter.getDisk()); + } + if (filter.getExtension() != null) { + wrapper.eq("extension", filter.getExtension()); + } + } + + IPage adminPage = new Page<>(page, size); + adminPage = page(adminPage, wrapper); + + PaginationResult pageResult = new PaginationResult<>(); + pageResult.setData(adminPage.getRecords()); + pageResult.setTotal(adminPage.getTotal()); + + return pageResult; + } +} + + + + diff --git a/src/main/java/xyz/playedu/api/types/PaginationResult.java b/src/main/java/xyz/playedu/api/types/paginate/PaginationResult.java similarity index 90% rename from src/main/java/xyz/playedu/api/types/PaginationResult.java rename to src/main/java/xyz/playedu/api/types/paginate/PaginationResult.java index 1797bb0..950ebf3 100644 --- a/src/main/java/xyz/playedu/api/types/PaginationResult.java +++ b/src/main/java/xyz/playedu/api/types/paginate/PaginationResult.java @@ -1,4 +1,4 @@ -package xyz.playedu.api.types; +package xyz.playedu.api.types.paginate; import java.util.List; diff --git a/src/main/java/xyz/playedu/api/types/paginate/ResourcePaginateFilter.java b/src/main/java/xyz/playedu/api/types/paginate/ResourcePaginateFilter.java new file mode 100644 index 0000000..47a6543 --- /dev/null +++ b/src/main/java/xyz/playedu/api/types/paginate/ResourcePaginateFilter.java @@ -0,0 +1,18 @@ +package xyz.playedu.api.types.paginate; + +import lombok.Data; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/23 11:18 + */ +@Data +public class ResourcePaginateFilter { + + private String name; + + private String extension; + + private String disk; + +} diff --git a/src/main/resources/mapper/ResourceMapper.xml b/src/main/resources/mapper/ResourceMapper.xml new file mode 100644 index 0000000..8843751 --- /dev/null +++ b/src/main/resources/mapper/ResourceMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + id,category_id,name, + extension,size,disk, + file_id,path,url, + created_at + +