From abb042ff1a80a907bdfa593a4b7a263dd63dc02c Mon Sep 17 00:00:00 2001 From: buliping Date: Thu, 8 Oct 2026 11:14:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=BE=E7=A8=8B=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E7=AE=A1=E7=90=86=EF=BC=8C=E5=AF=B9=E5=BA=94=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A1=A8train=5Fresource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../train/TrainResourceController.java | 93 +++++ .../com/ruoyi/train/domain/TrainResource.java | 149 +++++++ .../train/mapper/TrainResourceMapper.java | 60 +++ .../train/service/ITrainResourceService.java | 60 +++ .../impl/TrainResourceServiceImpl.java | 159 ++++++++ .../mapper/train/TrainResourceMapper.xml | 103 +++++ build_ui/src/api/train/resource.js | 44 ++ build_ui/src/views/train/resource/index.vue | 383 ++++++++++++++++++ 8 files changed, 1051 insertions(+) create mode 100644 RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainResourceController.java create mode 100644 RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainResource.java create mode 100644 RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainResourceMapper.java create mode 100644 RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainResourceService.java create mode 100644 RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainResourceServiceImpl.java create mode 100644 RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainResourceMapper.xml create mode 100644 build_ui/src/api/train/resource.js create mode 100644 build_ui/src/views/train/resource/index.vue diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainResourceController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainResourceController.java new file mode 100644 index 000000000..9ae9ee110 --- /dev/null +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainResourceController.java @@ -0,0 +1,93 @@ +package com.ruoyi.web.controller.train; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.train.domain.TrainResource; +import com.ruoyi.train.service.ITrainResourceService; + +/** + * 教学资源Controller + * + * @author ruoyi + */ +@RestController +@RequestMapping("/train/resource") +public class TrainResourceController extends BaseController +{ + @Autowired + private ITrainResourceService trainResourceService; + + /** + * 查询教学资源列表 + */ + @PreAuthorize("@ss.hasPermi('train:resource:list')") + @GetMapping("/list") + public TableDataInfo list(TrainResource trainResource) + { + startPage(); + List list = trainResourceService.selectTrainResourceList(trainResource); + return getDataTable(list); + } + + /** + * 获取教学资源详细信息 + */ + @PreAuthorize("@ss.hasPermi('train:resource:list')") + @GetMapping(value = "/{resourceId}") + public AjaxResult getInfo(@PathVariable("resourceId") String resourceId) + { + return success(trainResourceService.selectTrainResourceByResourceId(resourceId)); + } + + /** + * 新增教学资源 + */ + @PreAuthorize("@ss.hasPermi('train:resource:edit')") + @Log(title = "教学资源", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody TrainResource trainResource) + { + trainResource.setCreateBy(SecurityUtils.getUsername()); + return toAjax(trainResourceService.insertTrainResource(trainResource)); + } + + /** + * 删除教学资源 (RESTful DELETE /train/resource/{resourceIds}) + */ + @PreAuthorize("@ss.hasPermi('train:resource:edit')") + @Log(title = "教学资源", businessType = BusinessType.DELETE) + @DeleteMapping("/{resourceIds}") + public AjaxResult remove(@PathVariable String[] resourceIds) + { + return toAjax(trainResourceService.deleteTrainResourceByResourceIds(resourceIds)); + } + + /** + * 修改教学资源 (RESTful PUT /train/resource/{resourceId}) + */ + @PreAuthorize("@ss.hasPermi('train:resource:edit')") + @Log(title = "教学资源", businessType = BusinessType.UPDATE) + @PutMapping("/{resourceId}") + public AjaxResult edit(@PathVariable("resourceId") String resourceId, @Validated @RequestBody TrainResource trainResource) + { + trainResource.setResourceId(resourceId); + trainResource.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(trainResourceService.updateTrainResource(trainResource)); + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainResource.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainResource.java new file mode 100644 index 000000000..31b6104a8 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainResource.java @@ -0,0 +1,149 @@ +package com.ruoyi.train.domain; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 教学资源对象 train_resource + * + *

统一教学资源:文档、视频、3D模型、VR资源、外部教学链接、其他。 + * 该表被 train_course_resource、train_study_duration 外键引用,删除一律走逻辑删除。

+ * + * @author ruoyi + */ +public class TrainResource extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 资源唯一ID */ + private String resourceId; + + /** 资源名称 */ + @NotBlank(message = "资源名称不能为空") + @Size(max = 150, message = "资源名称长度不能超过150个字符") + @Excel(name = "资源名称") + private String resourceName; + + /** 资源类型 (1:文档, 2:视频, 3:3D模型, 4:VR资源, 5:外部教学链接, 6:其他) */ + @NotNull(message = "资源类型不能为空") + @Min(value = 1, message = "资源类型取值必须为1-6") + @Max(value = 6, message = "资源类型取值必须为1-6") + @Excel(name = "资源类型", readConverterExp = "1=文档,2=视频,3=3D模型,4=VR资源,5=外部教学链接,6=其他") + private Integer resourceType; + + /** 资源存储地址/在线链接 */ + @NotBlank(message = "资源地址不能为空") + @Size(max = 500, message = "资源地址长度不能超过500个字符") + @Excel(name = "资源地址") + private String resourceUrl; + + /** 资源描述/使用说明 */ + @Size(max = 500, message = "资源描述长度不能超过500个字符") + @Excel(name = "资源描述") + private String description; + + /** 状态 (1:正常, 0:停用) */ + @Min(value = 0, message = "状态取值必须为0或1") + @Max(value = 1, message = "状态取值必须为0或1") + @Excel(name = "状态", readConverterExp = "0=停用,1=正常") + private Integer status; + + /** 删除标志 (0代表存在 2代表删除) */ + private String delFlag; + + public void setResourceId(String resourceId) + { + this.resourceId = resourceId; + } + + public String getResourceId() + { + return resourceId; + } + + public void setResourceName(String resourceName) + { + this.resourceName = resourceName; + } + + public String getResourceName() + { + return resourceName; + } + + public void setResourceType(Integer resourceType) + { + this.resourceType = resourceType; + } + + public Integer getResourceType() + { + return resourceType; + } + + public void setResourceUrl(String resourceUrl) + { + this.resourceUrl = resourceUrl; + } + + public String getResourceUrl() + { + return resourceUrl; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getDescription() + { + return description; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public Integer getStatus() + { + return status; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + @Override + public String toString() + { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("resourceId", getResourceId()) + .append("resourceName", getResourceName()) + .append("resourceType", getResourceType()) + .append("resourceUrl", getResourceUrl()) + .append("description", getDescription()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainResourceMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainResourceMapper.java new file mode 100644 index 000000000..ba97c2ab8 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainResourceMapper.java @@ -0,0 +1,60 @@ +package com.ruoyi.train.mapper; + +import java.util.List; +import com.ruoyi.train.domain.TrainResource; + +/** + * 教学资源Mapper接口 + * + * @author ruoyi + */ +public interface TrainResourceMapper +{ + /** + * 查询教学资源 + * + * @param resourceId 教学资源主键 + * @return 教学资源 + */ + public TrainResource selectTrainResourceByResourceId(String resourceId); + + /** + * 查询教学资源列表 + * + * @param trainResource 教学资源查询条件 + * @return 教学资源集合 + */ + public List selectTrainResourceList(TrainResource trainResource); + + /** + * 新增教学资源 + * + * @param trainResource 教学资源 + * @return 结果 + */ + public int insertTrainResource(TrainResource trainResource); + + /** + * 修改教学资源 + * + * @param trainResource 教学资源 + * @return 结果 + */ + public int updateTrainResource(TrainResource trainResource); + + /** + * 删除教学资源(逻辑删除) + * + * @param resourceId 教学资源主键 + * @return 结果 + */ + public int deleteTrainResourceByResourceId(String resourceId); + + /** + * 批量删除教学资源(逻辑删除) + * + * @param resourceIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteTrainResourceByResourceIds(String[] resourceIds); +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainResourceService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainResourceService.java new file mode 100644 index 000000000..b7f0e43e5 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainResourceService.java @@ -0,0 +1,60 @@ +package com.ruoyi.train.service; + +import java.util.List; +import com.ruoyi.train.domain.TrainResource; + +/** + * 教学资源Service接口 + * + * @author ruoyi + */ +public interface ITrainResourceService +{ + /** + * 查询教学资源 + * + * @param resourceId 教学资源主键 + * @return 教学资源 + */ + public TrainResource selectTrainResourceByResourceId(String resourceId); + + /** + * 查询教学资源列表 + * + * @param trainResource 教学资源查询条件 + * @return 教学资源集合 + */ + public List selectTrainResourceList(TrainResource trainResource); + + /** + * 新增教学资源 + * + * @param trainResource 教学资源 + * @return 结果 + */ + public int insertTrainResource(TrainResource trainResource); + + /** + * 修改教学资源 + * + * @param trainResource 教学资源 + * @return 结果 + */ + public int updateTrainResource(TrainResource trainResource); + + /** + * 批量删除教学资源 + * + * @param resourceIds 需要删除的教学资源主键集合 + * @return 结果 + */ + public int deleteTrainResourceByResourceIds(String[] resourceIds); + + /** + * 删除教学资源信息 + * + * @param resourceId 教学资源主键 + * @return 结果 + */ + public int deleteTrainResourceByResourceId(String resourceId); +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainResourceServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainResourceServiceImpl.java new file mode 100644 index 000000000..7d4a2816d --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainResourceServiceImpl.java @@ -0,0 +1,159 @@ +package com.ruoyi.train.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; +import com.ruoyi.train.domain.TrainResource; +import com.ruoyi.train.mapper.TrainResourceMapper; +import com.ruoyi.train.service.ITrainResourceService; + +/** + * 教学资源Service业务层处理 + * + *

资源表被 train_course_resource、train_study_duration 外键引用, + * 因此删除统一使用逻辑删除(del_flag = '2'),禁止物理删除。

+ * + * @author ruoyi + */ +@Service +public class TrainResourceServiceImpl implements ITrainResourceService +{ + @Autowired + private TrainResourceMapper trainResourceMapper; + + /** + * 查询教学资源 + * + * @param resourceId 教学资源主键 + * @return 教学资源 + */ + @Override + public TrainResource selectTrainResourceByResourceId(String resourceId) + { + return trainResourceMapper.selectTrainResourceByResourceId(resourceId); + } + + /** + * 查询教学资源列表 + * + * @param trainResource 教学资源查询条件 + * @return 教学资源集合 + */ + @Override + public List selectTrainResourceList(TrainResource trainResource) + { + return trainResourceMapper.selectTrainResourceList(trainResource); + } + + /** + * 新增教学资源 + * + * @param trainResource 教学资源 + * @return 结果 + */ + @Override + public int insertTrainResource(TrainResource trainResource) + { + validateResourceType(trainResource.getResourceType()); + validateStatus(trainResource.getStatus()); + // 未指定主键时自动生成32位UUID,与 resource_id VARCHAR(32) 对齐 + if (StringUtils.isEmpty(trainResource.getResourceId())) + { + trainResource.setResourceId(IdUtils.fastSimpleUUID()); + } + if (trainResource.getStatus() == null) + { + trainResource.setStatus(1); // 默认正常 + } + trainResource.setDelFlag("0"); + trainResource.setCreateTime(DateUtils.getNowDate()); + return trainResourceMapper.insertTrainResource(trainResource); + } + + /** + * 修改教学资源 + * + * @param trainResource 教学资源(必须携带 resourceId) + * @return 结果 + */ + @Override + public int updateTrainResource(TrainResource trainResource) + { + if (StringUtils.isEmpty(trainResource.getResourceId())) + { + throw new ServiceException("资源ID不能为空"); + } + if (trainResource.getResourceType() != null) + { + validateResourceType(trainResource.getResourceType()); + } + if (trainResource.getStatus() != null) + { + validateStatus(trainResource.getStatus()); + } + trainResource.setUpdateTime(DateUtils.getNowDate()); + return trainResourceMapper.updateTrainResource(trainResource); + } + + /** + * 批量删除教学资源 + * + * @param resourceIds 需要删除的教学资源主键集合 + * @return 结果 + */ + @Override + public int deleteTrainResourceByResourceIds(String[] resourceIds) + { + if (resourceIds == null || resourceIds.length == 0) + { + throw new ServiceException("请选择要删除的资源"); + } + return trainResourceMapper.deleteTrainResourceByResourceIds(resourceIds); + } + + /** + * 删除教学资源信息 + * + * @param resourceId 教学资源主键 + * @return 结果 + */ + @Override + public int deleteTrainResourceByResourceId(String resourceId) + { + if (StringUtils.isEmpty(resourceId)) + { + throw new ServiceException("资源ID不能为空"); + } + return trainResourceMapper.deleteTrainResourceByResourceId(resourceId); + } + + /** + * 校验资源类型取值:1文档 2视频 33D模型 4VR资源 5外部教学链接 6其他 + */ + private void validateResourceType(Integer resourceType) + { + if (resourceType == null) + { + throw new ServiceException("资源类型不能为空"); + } + if (resourceType < 1 || resourceType > 6) + { + throw new ServiceException("资源类型取值必须为1-6"); + } + } + + /** + * 校验状态取值:0停用 1正常 + */ + private void validateStatus(Integer status) + { + if (status != null && status != 0 && status != 1) + { + throw new ServiceException("资源状态取值必须为0或1"); + } + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainResourceMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainResourceMapper.xml new file mode 100644 index 000000000..396fc5f26 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainResourceMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + select resource_id, resource_name, resource_type, resource_url, description, status, del_flag, create_by, create_time, update_by, update_time, remark from train_resource + + + + + + + + insert into train_resource + + resource_id, + resource_name, + resource_type, + resource_url, + description, + status, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{resourceId}, + #{resourceName}, + #{resourceType}, + #{resourceUrl}, + #{description}, + #{status}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update train_resource + + resource_name = #{resourceName}, + resource_type = #{resourceType}, + resource_url = #{resourceUrl}, + description = #{description}, + status = #{status}, + del_flag = #{delFlag}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where resource_id = #{resourceId} and del_flag = '0' + + + + update train_resource set del_flag = '2' where resource_id = #{resourceId} + + + + update train_resource set del_flag = '2' where resource_id in + + #{resourceId} + + + diff --git a/build_ui/src/api/train/resource.js b/build_ui/src/api/train/resource.js new file mode 100644 index 000000000..7bc49879d --- /dev/null +++ b/build_ui/src/api/train/resource.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询教学资源列表 +export function listResource(query) { + return request({ + url: '/train/resource/list', + method: 'get', + params: query + }) +} + +// 查询教学资源详细 +export function getResource(resourceId) { + return request({ + url: '/train/resource/' + resourceId, + method: 'get' + }) +} + +// 新增教学资源 +export function addResource(data) { + return request({ + url: '/train/resource', + method: 'post', + data: data + }) +} + +// 修改教学资源 +export function updateResource(data) { + return request({ + url: '/train/resource/' + data.resourceId, + method: 'put', + data: data + }) +} + +// 删除教学资源 +export function delResource(resourceId) { + return request({ + url: '/train/resource/' + resourceId, + method: 'delete' + }) +} diff --git a/build_ui/src/views/train/resource/index.vue b/build_ui/src/views/train/resource/index.vue new file mode 100644 index 000000000..8f80bc6cd --- /dev/null +++ b/build_ui/src/views/train/resource/index.vue @@ -0,0 +1,383 @@ + + +