diff --git a/pom.xml b/pom.xml
index 12c7ef1c..eb2da607 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,12 +30,38 @@
4.1.2
2.3
1.18.12
+ 8.5.5
+ 7.4.0
+
+ io.minio
+ minio
+ ${minio.version}
+
+
+ okhttp
+ com.squareup.okhttp3
+
+
+
+
+
+ com.qiniu
+ qiniu-java-sdk
+ ${qiniu.version}
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.9.3
+
+
org.projectlombok
lombok
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 60d3a723..eade666a 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -16,6 +16,16 @@
+
+ io.minio
+ minio
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.9.3
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewMaterialController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewMaterialController.java
new file mode 100644
index 00000000..83a8f658
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewMaterialController.java
@@ -0,0 +1,136 @@
+package com.ruoyi.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ClewMaterial;
+import com.ruoyi.system.service.IClewMaterialService;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 素材Controller
+ *
+ * @author ruoyi
+ * @date 2023-10-07
+ */
+@Controller
+@RequestMapping("/system/material")
+public class ClewMaterialController extends BaseController
+{
+ private String prefix = "system/material";
+
+ @Autowired
+ private IClewMaterialService clewMaterialService;
+
+ @RequiresPermissions("system:material:view")
+ @GetMapping()
+ public String material()
+ {
+ return prefix + "/material";
+ }
+
+ /**
+ * 查询素材列表
+ */
+ @RequiresPermissions("system:material:list")
+ @PostMapping("/list")
+ @ResponseBody
+ public TableDataInfo list(ClewMaterial clewMaterial)
+ {
+ startPage();
+ List list = clewMaterialService.selectClewMaterialList(clewMaterial);
+ return getDataTable(list);
+ }
+
+ @PostMapping("/app/list")
+ @ResponseBody
+ public TableDataInfo appList(ClewMaterial clewMaterial)
+ {
+ startPage();
+ List list = clewMaterialService.selectClewMaterialList(clewMaterial);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出素材列表
+ */
+ @RequiresPermissions("system:material:export")
+ @Log(title = "素材", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ @ResponseBody
+ public AjaxResult export(ClewMaterial clewMaterial)
+ {
+ List list = clewMaterialService.selectClewMaterialList(clewMaterial);
+ ExcelUtil util = new ExcelUtil(ClewMaterial.class);
+ return util.exportExcel(list, "素材数据");
+ }
+
+ /**
+ * 新增素材
+ */
+ @GetMapping("/add")
+ public String add()
+ {
+ return prefix + "/add";
+ }
+
+ /**
+ * 新增保存素材
+ */
+ @RequiresPermissions("system:material:add")
+ @Log(title = "素材", businessType = BusinessType.INSERT)
+ @PostMapping("/add")
+ @ResponseBody
+ public AjaxResult addSave(ClewMaterial clewMaterial)
+ {
+ return toAjax(clewMaterialService.insertClewMaterial(clewMaterial));
+ }
+
+ /**
+ * 修改素材
+ */
+ @RequiresPermissions("system:material:edit")
+ @GetMapping("/edit/{id}")
+ public String edit(@PathVariable("id") Long id, ModelMap mmap)
+ {
+ ClewMaterial clewMaterial = clewMaterialService.selectClewMaterialById(id);
+ mmap.put("clewMaterial", clewMaterial);
+ return prefix + "/edit";
+ }
+
+ /**
+ * 修改保存素材
+ */
+ @RequiresPermissions("system:material:edit")
+ @Log(title = "素材", businessType = BusinessType.UPDATE)
+ @PostMapping("/edit")
+ @ResponseBody
+ public AjaxResult editSave(ClewMaterial clewMaterial)
+ {
+ return toAjax(clewMaterialService.updateClewMaterial(clewMaterial));
+ }
+
+ /**
+ * 删除素材
+ */
+ @RequiresPermissions("system:material:remove")
+ @Log(title = "素材", businessType = BusinessType.DELETE)
+ @PostMapping( "/remove")
+ @ResponseBody
+ public AjaxResult remove(String ids)
+ {
+ return toAjax(clewMaterialService.deleteClewMaterialByIds(ids));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MinioController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MinioController.java
new file mode 100644
index 00000000..cf587657
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/MinioController.java
@@ -0,0 +1,31 @@
+package com.ruoyi.web.controller.tool;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.minio.MinioUtils;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * minio文件服务
+ * @author clunt
+ */
+@Controller
+@RequestMapping("/tool/minio")
+public class MinioController {
+
+ @ResponseBody
+ @PostMapping("/upload")
+ @ApiOperation(value = "文件上传管理-添加minio")
+ public AjaxResult add(@RequestPart("file") MultipartFile file) throws IOException {
+ String url = MinioUtils.uploadFile(file);
+ return AjaxResult.success(url);
+ }
+
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/QiniuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/QiniuController.java
new file mode 100644
index 00000000..740b0848
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/QiniuController.java
@@ -0,0 +1,72 @@
+package com.ruoyi.web.controller.tool;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.QiniuUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 七牛云
+ *
+ * @author clunt
+ */
+@Api
+@Controller
+@RequestMapping("/tool/qiniu")
+public class QiniuController {
+
+ private static final Logger logger = LoggerFactory.getLogger(QiniuController.class);
+
+ /**
+ * 七牛云上传(单个)
+ */
+ @PostMapping(value = "/upload")
+ @ResponseBody
+ @ApiOperation("七牛云上传接口")
+ public AjaxResult uploadFile(HttpServletRequest request, HttpServletResponse response) {
+ try {
+ String name = request.getParameter("name");
+ // 转型为MultipartHttpRequest:
+ MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+ // 获得实际:
+ MultipartFile file= multipartRequest.getFile(name);
+ // 上传后返回的文件路径
+ String fileUrl = QiniuUtils.upload(file.getBytes());
+ logger.info("upload return url is : " + fileUrl);
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("url", fileUrl);
+ return ajax;
+ } catch (Exception e) {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+
+ @PostMapping(value = "/app/upload")
+ @ResponseBody
+ @ApiOperation("app七牛云上传接口")
+ public AjaxResult uploadFile(@RequestParam(value = "uploadFile", required = false) MultipartFile file) {
+ try {
+ // 上传后返回的文件路径
+ String fileUrl = QiniuUtils.upload(file.getBytes());
+ logger.info("upload return url is : " + fileUrl);
+ AjaxResult ajax = AjaxResult.success();
+ ajax.put("url", fileUrl);
+ return ajax;
+ } catch (Exception e) {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+
+}
diff --git a/ruoyi-admin/src/main/resources/templates/system/material/add.html b/ruoyi-admin/src/main/resources/templates/system/material/add.html
new file mode 100644
index 00000000..693c0f00
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/templates/system/material/add.html
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/templates/system/material/edit.html b/ruoyi-admin/src/main/resources/templates/system/material/edit.html
new file mode 100644
index 00000000..bcb58323
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/templates/system/material/edit.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/templates/system/material/material.html b/ruoyi-admin/src/main/resources/templates/system/material/material.html
new file mode 100644
index 00000000..0205ef6b
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/templates/system/material/material.html
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 2ab0d988..dd5807f6 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -106,6 +106,22 @@
2.0.23
+
+ io.minio
+ minio
+
+
+
+ com.qiniu
+ qiniu-java-sdk
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.9.3
+
+
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/QiniuUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/QiniuUtils.java
new file mode 100644
index 00000000..27a5a65d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/QiniuUtils.java
@@ -0,0 +1,39 @@
+package com.ruoyi.common.utils;
+
+import com.google.gson.Gson;
+import com.qiniu.common.QiniuException;
+import com.qiniu.http.Response;
+import com.qiniu.storage.Configuration;
+import com.qiniu.storage.Region;
+import com.qiniu.storage.UploadManager;
+import com.qiniu.storage.model.DefaultPutRet;
+import com.qiniu.util.Auth;
+import com.ruoyi.common.utils.uuid.UUID;
+
+/**
+ * @author clunt
+ */
+public class QiniuUtils {
+
+ public static String getUpToken() {
+ Auth auth = Auth.create("QTNOppkvtufxTxLjt1V7YZwvzV2Rc6WLD5yXLBVY", "V8SM9nkbO-dft4JmG7UaCH6RYxXdqzrvQ0zWO2W3");
+ return auth.uploadToken("suteng");
+ }
+
+ public static String upload(byte[] uploadBytes) throws QiniuException {
+
+ String key = UUID.randomUUID().toString().replaceAll("-", "");
+
+ //设置华南的服务器
+ Configuration cfg = new Configuration(Region.region2());
+ UploadManager uploadManager = new UploadManager(cfg);
+
+ String upToken = getUpToken();
+ Response response = uploadManager.put(uploadBytes, key, upToken);
+ //解析上传成功的结果
+ DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
+
+ return "http://st.opsoul.com/" + putRet.key;
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/minio/MinioUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/minio/MinioUtils.java
new file mode 100644
index 00000000..05c38a14
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/minio/MinioUtils.java
@@ -0,0 +1,165 @@
+package com.ruoyi.common.utils.minio;
+
+import io.minio.*;
+import io.minio.messages.Bucket;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * minio文件服务管理
+ *
+ * @author clunt
+ */
+@Slf4j
+@Component
+public class MinioUtils {
+
+ private static final String MINIO_KEY = "Wiu3PA9eP6wNjrGe";
+ private static final String MINIO_SECRET = "Q2th7VQEuUEc2r6wkywRdygn5c7T71LU";
+ private static final String MINIO_URL = "http://211.99.98.27:9001";
+
+ private static final ThreadLocal dateFormatThreadLocal = ThreadLocal.withInitial(()->new SimpleDateFormat("_yyyyMMddHHmmss"));
+
+ private static final String MINIO_BUCKET = "bwy";
+ public static MinioClient minioClient;
+ /**
+ * 初始化minio配置
+ */
+ @PostConstruct
+ public void init() {
+ try {
+ log.info("Minio Initialize........................");
+ minioClient = MinioClient.builder().endpoint(MINIO_URL).credentials(MINIO_KEY, MINIO_SECRET).build();
+ createBucket(MINIO_BUCKET);
+ log.info("Minio Initialize........................successful");
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("初始化minio配置异常:", e.fillInStackTrace());
+ }
+ }
+
+ /**
+ * 判断bucket是否存在
+ */
+ @SneakyThrows(Exception.class)
+ public static boolean bucketExists(String bucketName) {
+ return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+ }
+
+ /**
+ * 创建bucket
+ */
+ @SneakyThrows(Exception.class)
+ public static void createBucket(String bucketName) {
+ boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+ if (!isExist) {
+ minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+ }
+ }
+
+ /**
+ * 获取全部bucket
+ */
+ @SneakyThrows(Exception.class)
+ public static List getAllBuckets() {
+ return minioClient.listBuckets();
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param bucketName: 桶名
+ * @param fileName: 文件名
+ * @param filePath: 文件路径
+ */
+ @SneakyThrows(Exception.class)
+ public static void upload(String bucketName, String fileName, String filePath) {
+ minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).build());
+ }
+
+ /**
+ * 上传文件
+ * 返回可以直接预览文件的URL
+ */
+ public static String uploadFile(MultipartFile file) {
+ try {
+ //如果存储桶不存在则创建
+ if (!bucketExists(MINIO_BUCKET)) {
+ createBucket(MINIO_BUCKET);
+ }
+ String contentType = file.getContentType();
+ String originalFilename = file.getOriginalFilename();
+ //得到文件流
+ InputStream inputStream = file.getInputStream();
+ //保证文件不重名(并且没有特殊字符)
+ String fileName = MINIO_BUCKET + dateFormatThreadLocal.get().format(new Date()) + originalFilename;
+ minioClient.uploadObject(UploadObjectArgs.builder()
+ .bucket(MINIO_BUCKET)
+ .object(file.getName())
+ .filename(originalFilename)
+ .build()
+ );
+ return getPreviewFileUrl(MINIO_BUCKET, fileName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ /**
+ * 文件上传
+ * 返回下载文件url地址 和下面upload方法仅传参不同
+ * bucketName 也可以直接从ParamConfig对象中获取
+ */
+// @SneakyThrows(Exception.class)
+// public static String upload(String bucketName, String fileName, InputStream stream) {
+// //bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1)
+// minioClient.putObject(PutObjectArgs.builder()..build()));
+// return getPreviewFileUrl(bucketName, fileName);
+// }
+//
+// /**
+// * 文件上传
+// * 返回下载文件url地址 和上面upload方法仅传参不同
+// */
+// @SneakyThrows(Exception.class)
+// public static String upload(String bucketName, MultipartFile file) {
+// final InputStream is = file.getInputStream();
+// final String fileName = file.getOriginalFilename();
+// minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
+// is.close();
+// return getPreviewFileUrl(bucketName, fileName);
+// }
+
+ /**
+ * 删除文件
+ *
+ * @param bucketName: 桶名
+ * @param fileName: 文件名
+ */
+ @SneakyThrows(Exception.class)
+ public static void deleteFile(String bucketName, String fileName) {
+ minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
+ }
+
+ /**
+ * 获取minio文件的下载或者预览地址
+ * 取决于调用本方法的方法中的PutObjectOptions对象有没有设置contentType
+ *
+ * @param bucketName: 桶名
+ * @param fileName: 文件名
+ */
+ @SneakyThrows(Exception.class)
+ public static String getPreviewFileUrl(String bucketName, String fileName) {
+ return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(fileName).build());
+ }
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
index 63c88599..eaec4863 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
@@ -290,10 +290,16 @@ public class ShiroConfig
filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
// 短信验证码接口
filterChainDefinitionMap.put("/tool/notice/**", "anon");
+ // minio文件服务接口
+ filterChainDefinitionMap.put("/tool/minio/**", "anon");
+ // 七牛云
+ filterChainDefinitionMap.put("/tool/qiniu/**", "anon");
// app查询
filterChainDefinitionMap.put("/system/app/app/**", "anon");
// 线索接口
filterChainDefinitionMap.put("/system/clew/app/**", "anon");
+ // 素材接口
+ filterChainDefinitionMap.put("/system/material/app/**", "anon");
// 退出 logout地址,shiro去清除session
filterChainDefinitionMap.put("/logout", "logout");
// 不需要拦截的访问
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/ClewMaterial.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/ClewMaterial.java
new file mode 100644
index 00000000..cec5e160
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/ClewMaterial.java
@@ -0,0 +1,48 @@
+package com.ruoyi.system.domain;
+
+import lombok.Data;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 素材对象 clew_material
+ *
+ * @author ruoyi
+ * @date 2023-10-07
+ */
+@Data
+public class ClewMaterial extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** $column.columnComment */
+ private Long id;
+
+ /** 标题 */
+ @Excel(name = "标题")
+ private String title;
+
+ /** 图片 */
+ @Excel(name = "图片")
+ private String imgUrl;
+
+ @Excel(name = "详情")
+ private String detail;
+
+ /** 视频 */
+ @Excel(name = "视频")
+ private String videoImg;
+
+ /** 标签 */
+ @Excel(name = "标签")
+ private String labels;
+
+ /** 报名人数 */
+ @Excel(name = "报名人数")
+ private String applyNum;
+
+ /** 线索提交内容 */
+ @Excel(name = "线索提交内容")
+ private String clewContent;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMaterialMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMaterialMapper.java
new file mode 100644
index 00000000..9bb3d213
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMaterialMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.ClewMaterial;
+
+/**
+ * 素材Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-10-07
+ */
+public interface ClewMaterialMapper
+{
+ /**
+ * 查询素材
+ *
+ * @param id 素材主键
+ * @return 素材
+ */
+ public ClewMaterial selectClewMaterialById(Long id);
+
+ /**
+ * 查询素材列表
+ *
+ * @param clewMaterial 素材
+ * @return 素材集合
+ */
+ public List selectClewMaterialList(ClewMaterial clewMaterial);
+
+ /**
+ * 新增素材
+ *
+ * @param clewMaterial 素材
+ * @return 结果
+ */
+ public int insertClewMaterial(ClewMaterial clewMaterial);
+
+ /**
+ * 修改素材
+ *
+ * @param clewMaterial 素材
+ * @return 结果
+ */
+ public int updateClewMaterial(ClewMaterial clewMaterial);
+
+ /**
+ * 删除素材
+ *
+ * @param id 素材主键
+ * @return 结果
+ */
+ public int deleteClewMaterialById(Long id);
+
+ /**
+ * 批量删除素材
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteClewMaterialByIds(String[] ids);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewMaterialService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewMaterialService.java
new file mode 100644
index 00000000..62b18f97
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewMaterialService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.ClewMaterial;
+
+/**
+ * 素材Service接口
+ *
+ * @author ruoyi
+ * @date 2023-10-07
+ */
+public interface IClewMaterialService
+{
+ /**
+ * 查询素材
+ *
+ * @param id 素材主键
+ * @return 素材
+ */
+ public ClewMaterial selectClewMaterialById(Long id);
+
+ /**
+ * 查询素材列表
+ *
+ * @param clewMaterial 素材
+ * @return 素材集合
+ */
+ public List selectClewMaterialList(ClewMaterial clewMaterial);
+
+ /**
+ * 新增素材
+ *
+ * @param clewMaterial 素材
+ * @return 结果
+ */
+ public int insertClewMaterial(ClewMaterial clewMaterial);
+
+ /**
+ * 修改素材
+ *
+ * @param clewMaterial 素材
+ * @return 结果
+ */
+ public int updateClewMaterial(ClewMaterial clewMaterial);
+
+ /**
+ * 批量删除素材
+ *
+ * @param ids 需要删除的素材主键集合
+ * @return 结果
+ */
+ public int deleteClewMaterialByIds(String ids);
+
+ /**
+ * 删除素材信息
+ *
+ * @param id 素材主键
+ * @return 结果
+ */
+ public int deleteClewMaterialById(Long id);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewMaterialServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewMaterialServiceImpl.java
new file mode 100644
index 00000000..62120821
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewMaterialServiceImpl.java
@@ -0,0 +1,97 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ClewMaterialMapper;
+import com.ruoyi.system.domain.ClewMaterial;
+import com.ruoyi.system.service.IClewMaterialService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 素材Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-10-07
+ */
+@Service
+public class ClewMaterialServiceImpl implements IClewMaterialService
+{
+ @Autowired
+ private ClewMaterialMapper clewMaterialMapper;
+
+ /**
+ * 查询素材
+ *
+ * @param id 素材主键
+ * @return 素材
+ */
+ @Override
+ public ClewMaterial selectClewMaterialById(Long id)
+ {
+ return clewMaterialMapper.selectClewMaterialById(id);
+ }
+
+ /**
+ * 查询素材列表
+ *
+ * @param clewMaterial 素材
+ * @return 素材
+ */
+ @Override
+ public List selectClewMaterialList(ClewMaterial clewMaterial)
+ {
+ return clewMaterialMapper.selectClewMaterialList(clewMaterial);
+ }
+
+ /**
+ * 新增素材
+ *
+ * @param clewMaterial 素材
+ * @return 结果
+ */
+ @Override
+ public int insertClewMaterial(ClewMaterial clewMaterial)
+ {
+ clewMaterial.setCreateTime(DateUtils.getNowDate());
+ return clewMaterialMapper.insertClewMaterial(clewMaterial);
+ }
+
+ /**
+ * 修改素材
+ *
+ * @param clewMaterial 素材
+ * @return 结果
+ */
+ @Override
+ public int updateClewMaterial(ClewMaterial clewMaterial)
+ {
+ clewMaterial.setUpdateTime(DateUtils.getNowDate());
+ return clewMaterialMapper.updateClewMaterial(clewMaterial);
+ }
+
+ /**
+ * 批量删除素材
+ *
+ * @param ids 需要删除的素材主键
+ * @return 结果
+ */
+ @Override
+ public int deleteClewMaterialByIds(String ids)
+ {
+ return clewMaterialMapper.deleteClewMaterialByIds(Convert.toStrArray(ids));
+ }
+
+ /**
+ * 删除素材信息
+ *
+ * @param id 素材主键
+ * @return 结果
+ */
+ @Override
+ public int deleteClewMaterialById(Long id)
+ {
+ return clewMaterialMapper.deleteClewMaterialById(id);
+ }
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/ClewMaterialMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ClewMaterialMapper.xml
new file mode 100644
index 00000000..0b238caf
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/ClewMaterialMapper.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, title, img_url, video_img, labels, detail, apply_num, clew_content, create_by, create_time, update_by, update_time from clew_material
+
+
+
+
+
+
+
+ insert into clew_material
+
+ title,
+ img_url,
+ video_img,
+ labels,
+ detail,
+ apply_num,
+ clew_content,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+
+
+ #{title},
+ #{imgUrl},
+ #{videoImg},
+ #{labels},
+ #{detail},
+ #{applyNum},
+ #{clewContent},
+ #{createBy},
+ #{createTime},
+ #{updateBy},
+ #{updateTime},
+
+
+
+
+ update clew_material
+
+ title = #{title},
+ img_url = #{imgUrl},
+ video_img = #{videoImg},
+ labels = #{labels},
+ detail = #{detail},
+ apply_num = #{applyNum},
+ clew_content = #{clewContent},
+ create_by = #{createBy},
+ create_time = #{createTime},
+ update_by = #{updateBy},
+ update_time = #{updateTime},
+
+ where id = #{id}
+
+
+
+ delete from clew_material where id = #{id}
+
+
+
+ delete from clew_material where id in
+
+ #{id}
+
+
+
+
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/ClewPhoneMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ClewPhoneMapper.xml
index 96a018c2..c83783e1 100644
--- a/ruoyi-system/src/main/resources/mapper/system/ClewPhoneMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/ClewPhoneMapper.xml
@@ -23,6 +23,7 @@
and phone = #{phone}
+ order by create_time desc