allen 1 月之前
父節點
當前提交
f314a03292
共有 27 個文件被更改,包括 1255 次插入47 次删除
  1. 2 3
      ips-admin/src/main/java/com/ips/IpsApplication.java
  2. 2 2
      ips-admin/src/main/java/com/ips/IpsServletInitializer.java
  3. 104 0
      ips-admin/src/main/java/com/ips/system/controller/TimeFrequencyImagesController.java
  4. 3 0
      ips-admin/src/main/java/com/ips/system/domain/BizTraining.java
  5. 6 0
      ips-admin/src/main/java/com/ips/system/domain/ClassifyTest.java
  6. 3 0
      ips-admin/src/main/java/com/ips/system/domain/Distillation.java
  7. 51 0
      ips-admin/src/main/java/com/ips/system/domain/TimeFrequencyImages.java
  8. 61 0
      ips-admin/src/main/java/com/ips/system/mapper/TimeFrequencyImagesMapper.java
  9. 61 0
      ips-admin/src/main/java/com/ips/system/service/ITimeFrequencyImagesService.java
  10. 96 0
      ips-admin/src/main/java/com/ips/system/service/impl/TimeFrequencyImagesServiceImpl.java
  11. 3 3
      ips-admin/src/main/resources/application.yml
  12. 5 0
      ips-admin/src/main/resources/mapper/biz/BizTrainingMapper.xml
  13. 10 0
      ips-admin/src/main/resources/mapper/biz/ClassifyTestMapper.xml
  14. 5 0
      ips-admin/src/main/resources/mapper/biz/DistillationMapper.xml
  15. 126 0
      ips-admin/src/main/resources/mapper/biz/TimeFrequencyImagesMapper.xml
  16. 44 0
      ips-ui/src/api/biz/images.js
  17. 7 0
      ips-ui/src/background.js
  18. 87 0
      ips-ui/src/components/FilePicker/index.vue
  19. 2 3
      ips-ui/src/views/biz/config/index.vue
  20. 26 8
      ips-ui/src/views/biz/distillation/index.vue
  21. 21 8
      ips-ui/src/views/biz/features/index.vue
  22. 414 0
      ips-ui/src/views/biz/images/index.vue
  23. 2 2
      ips-ui/src/views/biz/preprocessed/index.vue
  24. 29 8
      ips-ui/src/views/biz/test/index.vue
  25. 26 8
      ips-ui/src/views/biz/training/index.vue
  26. 13 1
      ips-ui/src/views/index.vue
  27. 46 1
      sql/biz.sql

+ 2 - 3
ips-admin/src/main/java/com/ips/RuoYiApplication.java → ips-admin/src/main/java/com/ips/IpsApplication.java

@@ -6,7 +6,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.context.ApplicationContext;
 import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -18,12 +17,12 @@ import org.springframework.web.bind.annotation.RestController;
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @MapperScan(basePackages = "com.ips.system.mapper")
 @EnableAsync
-public class RuoYiApplication
+public class IpsApplication
 {
     private static ApplicationContext applicationContext;
     public static void main(String[] args)
     {
-        SpringApplication.run(RuoYiApplication.class, args);
+        SpringApplication.run(IpsApplication.class, args);
         System.out.println("(♥◠‿◠)ノ゙  启动成功   ლ(´ڡ`ლ)゙  ");
     }
 

+ 2 - 2
ips-admin/src/main/java/com/ips/RuoYiServletInitializer.java → ips-admin/src/main/java/com/ips/IpsServletInitializer.java

@@ -8,11 +8,11 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
  * 
  * @author ruoyi
  */
-public class RuoYiServletInitializer extends SpringBootServletInitializer
+public class IpsServletInitializer extends SpringBootServletInitializer
 {
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
     {
-        return application.sources(RuoYiApplication.class);
+        return application.sources(IpsApplication.class);
     }
 }

+ 104 - 0
ips-admin/src/main/java/com/ips/system/controller/TimeFrequencyImagesController.java

@@ -0,0 +1,104 @@
+package com.ips.system.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ips.common.annotation.Log;
+import com.ips.common.core.controller.BaseController;
+import com.ips.common.core.domain.AjaxResult;
+import com.ips.common.enums.BusinessType;
+import com.ips.system.domain.TimeFrequencyImages;
+import com.ips.system.service.ITimeFrequencyImagesService;
+import com.ips.common.utils.poi.ExcelUtil;
+import com.ips.common.core.page.TableDataInfo;
+
+/**
+ * 时频图生成Controller
+ * 
+ * @author Allen
+ * @date 2025-05-28
+ */
+@RestController
+@RequestMapping("/biz/images")
+public class TimeFrequencyImagesController extends BaseController
+{
+    @Autowired
+    private ITimeFrequencyImagesService timeFrequencyImagesService;
+
+    /**
+     * 查询时频图生成列表
+     */
+    @PreAuthorize("@ss.hasPermi('biz:images:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TimeFrequencyImages timeFrequencyImages)
+    {
+        startPage();
+        List<TimeFrequencyImages> list = timeFrequencyImagesService.selectTimeFrequencyImagesList(timeFrequencyImages);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出时频图生成列表
+     */
+    @PreAuthorize("@ss.hasPermi('biz:images:export')")
+    @Log(title = "时频图生成", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, TimeFrequencyImages timeFrequencyImages)
+    {
+        List<TimeFrequencyImages> list = timeFrequencyImagesService.selectTimeFrequencyImagesList(timeFrequencyImages);
+        ExcelUtil<TimeFrequencyImages> util = new ExcelUtil<TimeFrequencyImages>(TimeFrequencyImages.class);
+        util.exportExcel(response, list, "时频图生成数据");
+    }
+
+    /**
+     * 获取时频图生成详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('biz:images:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(timeFrequencyImagesService.selectTimeFrequencyImagesById(id));
+    }
+
+    /**
+     * 新增时频图生成
+     */
+    @PreAuthorize("@ss.hasPermi('biz:images:add')")
+    @Log(title = "时频图生成", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TimeFrequencyImages timeFrequencyImages)
+    {
+        return toAjax(timeFrequencyImagesService.insertTimeFrequencyImages(timeFrequencyImages));
+    }
+
+    /**
+     * 修改时频图生成
+     */
+    @PreAuthorize("@ss.hasPermi('biz:images:edit')")
+    @Log(title = "时频图生成", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TimeFrequencyImages timeFrequencyImages)
+    {
+        return toAjax(timeFrequencyImagesService.updateTimeFrequencyImages(timeFrequencyImages));
+    }
+
+    /**
+     * 删除时频图生成
+     */
+    @PreAuthorize("@ss.hasPermi('biz:images:remove')")
+    @Log(title = "时频图生成", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(timeFrequencyImagesService.deleteTimeFrequencyImagesByIds(ids));
+    }
+}

+ 3 - 0
ips-admin/src/main/java/com/ips/system/domain/BizTraining.java

@@ -30,6 +30,9 @@ public class BizTraining extends BaseEntity
     @Excel(name = "算法")
     private Long algorithmId;
 
+    /** 模型 */
+    private String modelPath;
+
     /** 输入路径 */
     private String inputPath;
 

+ 6 - 0
ips-admin/src/main/java/com/ips/system/domain/ClassifyTest.java

@@ -30,6 +30,12 @@ public class ClassifyTest extends BaseEntity
     @Excel(name = "算法")
     private Long algorithmId;
 
+    /** 模型 */
+    private String modelPath;
+
+    /** 模型pkl */
+    private String modelPklPath;
+
     /** 输入路径 */
     private String inputPath;
 

+ 3 - 0
ips-admin/src/main/java/com/ips/system/domain/Distillation.java

@@ -30,6 +30,9 @@ public class Distillation extends BaseEntity
     @Excel(name = "算法")
     private Long algorithmId;
 
+    /** 模型 */
+    private String modelPath;
+
     /** 输入路径 */
     private String inputPath;
 

+ 51 - 0
ips-admin/src/main/java/com/ips/system/domain/TimeFrequencyImages.java

@@ -0,0 +1,51 @@
+package com.ips.system.domain;
+
+import java.util.Date;
+import com.ips.common.annotation.Excel;
+import com.ips.common.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 时频图生成对象 biz_time_frequency_images
+ * 
+ * @author Allen
+ * @date 2025-05-28
+ */
+@Data
+public class TimeFrequencyImages extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 编号 */
+    private Long id;
+
+    /** 任务名称 */
+    @Excel(name = "任务名称")
+    private String taskName;
+
+    /** 算法 */
+    @Excel(name = "算法")
+    private Long algorithmId;
+
+    /** 输入路径 */
+    @Excel(name = "输入路径")
+    private String inputPath;
+
+    /** 输出路径 */
+    private String outputPath;
+
+    /** 算法参数 */
+    private String algorithmParams;
+
+    /** 状态(0未运行,1运行中,2已完成,3失败) */
+    @Excel(name = "状态", readConverterExp = "0=未运行,1运行中,2已完成,3失败")
+    private String status;
+
+    /** 开始时间 */
+    private Date startTime;
+
+    /** 结束时间 */
+    private Date endTime;
+
+    private String algorithmName;
+}

+ 61 - 0
ips-admin/src/main/java/com/ips/system/mapper/TimeFrequencyImagesMapper.java

@@ -0,0 +1,61 @@
+package com.ips.system.mapper;
+
+import java.util.List;
+import com.ips.system.domain.TimeFrequencyImages;
+
+/**
+ * 时频图生成Mapper接口
+ * 
+ * @author Allen
+ * @date 2025-05-28
+ */
+public interface TimeFrequencyImagesMapper 
+{
+    /**
+     * 查询时频图生成
+     * 
+     * @param id 时频图生成主键
+     * @return 时频图生成
+     */
+    public TimeFrequencyImages selectTimeFrequencyImagesById(Long id);
+
+    /**
+     * 查询时频图生成列表
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 时频图生成集合
+     */
+    public List<TimeFrequencyImages> selectTimeFrequencyImagesList(TimeFrequencyImages timeFrequencyImages);
+
+    /**
+     * 新增时频图生成
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 结果
+     */
+    public int insertTimeFrequencyImages(TimeFrequencyImages timeFrequencyImages);
+
+    /**
+     * 修改时频图生成
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 结果
+     */
+    public int updateTimeFrequencyImages(TimeFrequencyImages timeFrequencyImages);
+
+    /**
+     * 删除时频图生成
+     * 
+     * @param id 时频图生成主键
+     * @return 结果
+     */
+    public int deleteTimeFrequencyImagesById(Long id);
+
+    /**
+     * 批量删除时频图生成
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteTimeFrequencyImagesByIds(Long[] ids);
+}

+ 61 - 0
ips-admin/src/main/java/com/ips/system/service/ITimeFrequencyImagesService.java

@@ -0,0 +1,61 @@
+package com.ips.system.service;
+
+import java.util.List;
+import com.ips.system.domain.TimeFrequencyImages;
+
+/**
+ * 时频图生成Service接口
+ * 
+ * @author Allen
+ * @date 2025-05-28
+ */
+public interface ITimeFrequencyImagesService 
+{
+    /**
+     * 查询时频图生成
+     * 
+     * @param id 时频图生成主键
+     * @return 时频图生成
+     */
+    public TimeFrequencyImages selectTimeFrequencyImagesById(Long id);
+
+    /**
+     * 查询时频图生成列表
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 时频图生成集合
+     */
+    public List<TimeFrequencyImages> selectTimeFrequencyImagesList(TimeFrequencyImages timeFrequencyImages);
+
+    /**
+     * 新增时频图生成
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 结果
+     */
+    public int insertTimeFrequencyImages(TimeFrequencyImages timeFrequencyImages);
+
+    /**
+     * 修改时频图生成
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 结果
+     */
+    public int updateTimeFrequencyImages(TimeFrequencyImages timeFrequencyImages);
+
+    /**
+     * 批量删除时频图生成
+     * 
+     * @param ids 需要删除的时频图生成主键集合
+     * @return 结果
+     */
+    public int deleteTimeFrequencyImagesByIds(Long[] ids);
+
+    /**
+     * 删除时频图生成信息
+     * 
+     * @param id 时频图生成主键
+     * @return 结果
+     */
+    public int deleteTimeFrequencyImagesById(Long id);
+}

+ 96 - 0
ips-admin/src/main/java/com/ips/system/service/impl/TimeFrequencyImagesServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ips.system.service.impl;
+
+import java.util.List;
+import com.ips.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ips.system.mapper.TimeFrequencyImagesMapper;
+import com.ips.system.domain.TimeFrequencyImages;
+import com.ips.system.service.ITimeFrequencyImagesService;
+
+/**
+ * 时频图生成Service业务层处理
+ * 
+ * @author Allen
+ * @date 2025-05-28
+ */
+@Service
+public class TimeFrequencyImagesServiceImpl implements ITimeFrequencyImagesService 
+{
+    @Autowired
+    private TimeFrequencyImagesMapper timeFrequencyImagesMapper;
+
+    /**
+     * 查询时频图生成
+     * 
+     * @param id 时频图生成主键
+     * @return 时频图生成
+     */
+    @Override
+    public TimeFrequencyImages selectTimeFrequencyImagesById(Long id)
+    {
+        return timeFrequencyImagesMapper.selectTimeFrequencyImagesById(id);
+    }
+
+    /**
+     * 查询时频图生成列表
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 时频图生成
+     */
+    @Override
+    public List<TimeFrequencyImages> selectTimeFrequencyImagesList(TimeFrequencyImages timeFrequencyImages)
+    {
+        return timeFrequencyImagesMapper.selectTimeFrequencyImagesList(timeFrequencyImages);
+    }
+
+    /**
+     * 新增时频图生成
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 结果
+     */
+    @Override
+    public int insertTimeFrequencyImages(TimeFrequencyImages timeFrequencyImages)
+    {
+        timeFrequencyImages.setCreateTime(DateUtils.getNowDate());
+        return timeFrequencyImagesMapper.insertTimeFrequencyImages(timeFrequencyImages);
+    }
+
+    /**
+     * 修改时频图生成
+     * 
+     * @param timeFrequencyImages 时频图生成
+     * @return 结果
+     */
+    @Override
+    public int updateTimeFrequencyImages(TimeFrequencyImages timeFrequencyImages)
+    {
+        timeFrequencyImages.setUpdateTime(DateUtils.getNowDate());
+        return timeFrequencyImagesMapper.updateTimeFrequencyImages(timeFrequencyImages);
+    }
+
+    /**
+     * 批量删除时频图生成
+     * 
+     * @param ids 需要删除的时频图生成主键
+     * @return 结果
+     */
+    @Override
+    public int deleteTimeFrequencyImagesByIds(Long[] ids)
+    {
+        return timeFrequencyImagesMapper.deleteTimeFrequencyImagesByIds(ids);
+    }
+
+    /**
+     * 删除时频图生成信息
+     * 
+     * @param id 时频图生成主键
+     * @return 结果
+     */
+    @Override
+    public int deleteTimeFrequencyImagesById(Long id)
+    {
+        return timeFrequencyImagesMapper.deleteTimeFrequencyImagesById(id);
+    }
+}

+ 3 - 3
ips-admin/src/main/resources/application.yml

@@ -66,14 +66,14 @@ spring:
   # redis 配置
   redis:
     # 地址
-#    host: 101.126.133.7
-    host: 127.0.0.1
+    host: 101.126.133.7
+#    host: 127.0.0.1
     # 端口,默认为6379
     port: 6379
     # 数据库索引
     database: 0
     # 密码 Z;G4AS:Vor'YF#p?
-    password:
+    password: Z;G4AS:Vor'YF#p?
     # 连接超时时间
     timeout: 10s
     jedis:

+ 5 - 0
ips-admin/src/main/resources/mapper/biz/BizTrainingMapper.xml

@@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="id"    column="id"    />
         <result property="taskName"    column="task_name"    />
         <result property="algorithmId"    column="algorithm_id"    />
+        <result property="modelPath"    column="model_path"    />
         <result property="inputPath"    column="input_path"    />
         <result property="outputPath"    column="output_path"    />
         <result property="algorithmParams"    column="algorithm_params"    />
@@ -27,6 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             bt.id,
             bt.task_name,
             bt.algorithm_id,
+            bt.model_path,
             bt.input_path,
             bt.output_path,
             bt.algorithm_params,
@@ -67,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="taskName != null">task_name,</if>
             <if test="algorithmId != null">algorithm_id,</if>
+            <if test="modelPath != null">model_path,</if>
             <if test="inputPath != null">input_path,</if>
             <if test="outputPath != null">output_path,</if>
             <if test="algorithmParams != null">algorithm_params,</if>
@@ -82,6 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="taskName != null">#{taskName},</if>
             <if test="algorithmId != null">#{algorithmId},</if>
+            <if test="modelPath != null">#{modelPath},</if>
             <if test="inputPath != null">#{inputPath},</if>
             <if test="outputPath != null">#{outputPath},</if>
             <if test="algorithmParams != null">#{algorithmParams},</if>
@@ -101,6 +105,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SET" suffixOverrides=",">
             <if test="taskName != null">task_name = #{taskName},</if>
             <if test="algorithmId != null">algorithm_id = #{algorithmId},</if>
+            <if test="modelPath != null">model_path = #{modelPath},</if>
             <if test="inputPath != null">input_path = #{inputPath},</if>
             <if test="outputPath != null">output_path = #{outputPath},</if>
             <if test="algorithmParams != null">algorithm_params = #{algorithmParams},</if>

+ 10 - 0
ips-admin/src/main/resources/mapper/biz/ClassifyTestMapper.xml

@@ -8,6 +8,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="id"    column="id"    />
         <result property="taskName"    column="task_name"    />
         <result property="algorithmId"    column="algorithm_id"    />
+        <result property="modelPath"    column="model_path"    />
+        <result property="modelPklPath"    column="model_pkl_path"    />
         <result property="inputPath"    column="input_path"    />
         <result property="outputPath"    column="output_path"    />
         <result property="algorithmParams"    column="algorithm_params"    />
@@ -27,6 +29,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             bct.id,
             bct.task_name,
             bct.algorithm_id,
+            bct.model_path,
+            bct.model_pkl_path,
             bct.input_path,
             bct.output_path,
             bct.algorithm_params,
@@ -67,6 +71,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="taskName != null">task_name,</if>
             <if test="algorithmId != null">algorithm_id,</if>
+            <if test="modelPath != null">model_path,</if>
+            <if test="modelPklPath != null">model_pkl_path,</if>
             <if test="inputPath != null">input_path,</if>
             <if test="outputPath != null">output_path,</if>
             <if test="algorithmParams != null">algorithm_params,</if>
@@ -82,6 +88,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="taskName != null">#{taskName},</if>
             <if test="algorithmId != null">#{algorithmId},</if>
+            <if test="modelPath != null">#{modelPath},</if>
+            <if test="modelPklPath != null">#{modelPklPath},</if>
             <if test="inputPath != null">#{inputPath},</if>
             <if test="outputPath != null">#{outputPath},</if>
             <if test="algorithmParams != null">#{algorithmParams},</if>
@@ -101,6 +109,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SET" suffixOverrides=",">
             <if test="taskName != null">task_name = #{taskName},</if>
             <if test="algorithmId != null">algorithm_id = #{algorithmId},</if>
+            <if test="modelPath != null">model_path = #{modelPath},</if>
+            <if test="modelPklPath != null">model_pkl_path = #{modelPklPath},</if>
             <if test="inputPath != null">input_path = #{inputPath},</if>
             <if test="outputPath != null">output_path = #{outputPath},</if>
             <if test="algorithmParams != null">algorithm_params = #{algorithmParams},</if>

+ 5 - 0
ips-admin/src/main/resources/mapper/biz/DistillationMapper.xml

@@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="id"    column="id"    />
         <result property="taskName"    column="task_name"    />
         <result property="algorithmId"    column="algorithm_id"    />
+        <result property="modelPath"    column="model_path"    />
         <result property="inputPath"    column="input_path"    />
         <result property="outputPath"    column="output_path"    />
         <result property="algorithmParams"    column="algorithm_params"    />
@@ -27,6 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             bd.id,
             bd.task_name,
             bd.algorithm_id,
+            bd.model_path,
             bd.input_path,
             bd.output_path,
             bd.algorithm_params,
@@ -67,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="taskName != null">task_name,</if>
             <if test="algorithmId != null">algorithm_id,</if>
+            <if test="modelPath != null">model_path,</if>
             <if test="inputPath != null">input_path,</if>
             <if test="outputPath != null">output_path,</if>
             <if test="algorithmParams != null">algorithm_params,</if>
@@ -82,6 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="taskName != null">#{taskName},</if>
             <if test="algorithmId != null">#{algorithmId},</if>
+            <if test="modelPath != null">#{modelPath},</if>
             <if test="inputPath != null">#{inputPath},</if>
             <if test="outputPath != null">#{outputPath},</if>
             <if test="algorithmParams != null">#{algorithmParams},</if>
@@ -101,6 +105,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SET" suffixOverrides=",">
             <if test="taskName != null">task_name = #{taskName},</if>
             <if test="algorithmId != null">algorithm_id = #{algorithmId},</if>
+            <if test="modelPath != null">model_path = #{modelPath},</if>
             <if test="inputPath != null">input_path = #{inputPath},</if>
             <if test="outputPath != null">output_path = #{outputPath},</if>
             <if test="algorithmParams != null">algorithm_params = #{algorithmParams},</if>

+ 126 - 0
ips-admin/src/main/resources/mapper/biz/TimeFrequencyImagesMapper.xml

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ips.system.mapper.TimeFrequencyImagesMapper">
+    
+    <resultMap type="TimeFrequencyImages" id="TimeFrequencyImagesResult">
+        <result property="id"    column="id"    />
+        <result property="taskName"    column="task_name"    />
+        <result property="algorithmId"    column="algorithm_id"    />
+        <result property="inputPath"    column="input_path"    />
+        <result property="outputPath"    column="output_path"    />
+        <result property="algorithmParams"    column="algorithm_params"    />
+        <result property="status"    column="status"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="endTime"    column="end_time"    />
+        <result property="remark"    column="remark"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="algorithmName"    column="algorithm_name"    />
+    </resultMap>
+
+    <sql id="selectTimeFrequencyImagesVo">
+        SELECT
+            tfi.id,
+            tfi.task_name,
+            tfi.algorithm_id,
+            tfi.input_path,
+            tfi.output_path,
+            tfi.algorithm_params,
+            tfi.STATUS,
+            tfi.start_time,
+            tfi.end_time,
+            tfi.remark,
+            tfi.create_by,
+            tfi.create_time,
+            tfi.update_by,
+            tfi.update_time,
+            bac.algorithm_name
+        FROM
+            biz_time_frequency_images tfi
+            LEFT JOIN biz_algorithm_config bac ON bac.id = tfi.algorithm_id
+    </sql>
+
+    <select id="selectTimeFrequencyImagesList" parameterType="TimeFrequencyImages" resultMap="TimeFrequencyImagesResult">
+        <include refid="selectTimeFrequencyImagesVo"/>
+        <where>  
+            <if test="taskName != null  and taskName != ''"> and tfi.task_name like concat('%', #{taskName}, '%')</if>
+            <if test="algorithmId != null "> and tfi.algorithm_id = #{algorithmId}</if>
+            <if test="inputPath != null  and inputPath != ''"> and tfi.input_path = #{inputPath}</if>
+            <if test="status != null  and status != ''"> and tfi.status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectTimeFrequencyImagesById" parameterType="Long" resultMap="TimeFrequencyImagesResult">
+        <include refid="selectTimeFrequencyImagesVo"/>
+        where tfi.id = #{id}
+    </select>
+
+    <insert id="insertTimeFrequencyImages" parameterType="TimeFrequencyImages" useGeneratedKeys="true" keyProperty="id">
+        insert into biz_time_frequency_images
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="taskName != null">task_name,</if>
+            <if test="algorithmId != null">algorithm_id,</if>
+            <if test="inputPath != null">input_path,</if>
+            <if test="outputPath != null">output_path,</if>
+            <if test="algorithmParams != null">algorithm_params,</if>
+            <if test="status != null">status,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="taskName != null">#{taskName},</if>
+            <if test="algorithmId != null">#{algorithmId},</if>
+            <if test="inputPath != null">#{inputPath},</if>
+            <if test="outputPath != null">#{outputPath},</if>
+            <if test="algorithmParams != null">#{algorithmParams},</if>
+            <if test="status != null">#{status},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTimeFrequencyImages" parameterType="TimeFrequencyImages">
+        update biz_time_frequency_images
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="taskName != null">task_name = #{taskName},</if>
+            <if test="algorithmId != null">algorithm_id = #{algorithmId},</if>
+            <if test="inputPath != null">input_path = #{inputPath},</if>
+            <if test="outputPath != null">output_path = #{outputPath},</if>
+            <if test="algorithmParams != null">algorithm_params = #{algorithmParams},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="endTime != null">end_time = #{endTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteTimeFrequencyImagesById" parameterType="Long">
+        delete from biz_time_frequency_images where id = #{id}
+    </delete>
+
+    <delete id="deleteTimeFrequencyImagesByIds" parameterType="String">
+        delete from biz_time_frequency_images where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 44 - 0
ips-ui/src/api/biz/images.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询时频图生成列表
+export function listImages(query) {
+  return request({
+    url: '/biz/images/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询时频图生成详细
+export function getImages(id) {
+  return request({
+    url: '/biz/images/' + id,
+    method: 'get'
+  })
+}
+
+// 新增时频图生成
+export function addImages(data) {
+  return request({
+    url: '/biz/images',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改时频图生成
+export function updateImages(data) {
+  return request({
+    url: '/biz/images',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除时频图生成
+export function delImages(id) {
+  return request({
+    url: '/biz/images/' + id,
+    method: 'delete'
+  })
+}

+ 7 - 0
ips-ui/src/background.js

@@ -48,6 +48,13 @@ async function createWindow() {
     return result.canceled ? null : result.filePaths[0];
   });
 
+  ipcMain.handle("select-file", async () => {
+    const result = await dialog.showOpenDialog(win, {
+      properties: ["openFile"],
+    });
+    return result.canceled ? null : result.filePaths[0];
+  });
+
   // 替换原来的对话框处理程序
   ipcMain.handle("show-dialog", async (event, options) => {
     const result = await dialog.showOpenDialog({

+ 87 - 0
ips-ui/src/components/FilePicker/index.vue

@@ -0,0 +1,87 @@
+<!-- src/components/FolderPicker.vue -->
+<template>
+  <div class="folder-picker">
+    <el-input v-model="selectedPath" :placeholder="placeholderText" readonly>
+      <template #append>
+        <el-button @click="handleSelection" :icon="selectionIcon">
+          {{ buttonText }}
+        </el-button>
+      </template>
+    </el-input>
+  </div>
+</template>
+
+<script>
+const { ipcRenderer } = require("electron");
+
+export default {
+  name: "FolderPicker",
+  props: {
+    value: {
+      type: String,
+      default: "",
+    },
+    filters: {
+      type: Array,
+      default: () => [],
+    },
+    buttonText: {
+      type: String,
+      default: "选择",
+    },
+  },
+  data() {
+    return {
+      selectedPath: this.value,
+    };
+  },
+  computed: {
+    selectionIcon() {
+      if (!this.selectedPath) return "el-icon-folder-opened";
+      return "el-icon-document";
+    },
+    placeholderText() {
+      return "请选择文件";
+    },
+  },
+  watch: {
+    value(newVal) {
+      this.selectedPath = newVal;
+    },
+    selectedPath(newVal) {
+      this.$emit("input", newVal);
+    },
+  },
+  methods: {
+    async handleSelection() {
+      try {
+        const options = {
+          defaultPath: this.selectedPath || undefined,
+          filters: this.filters,
+        };
+
+        options.properties = ["openFile"];
+        if (this.filters.length === 0) {
+          options.properties.push("multiSelections");
+        }
+
+        const path = await ipcRenderer.invoke("select-file", options);
+
+        if (path) {
+          this.selectedPath = path;
+        }
+      } catch (error) {
+        console.error("选择操作出错:", error);
+        this.$message.error(error.message || "选择操作失败");
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.folder-picker {
+  display: flex;
+  align-items: center;
+}
+</style>

+ 2 - 3
ips-ui/src/views/biz/config/index.vue

@@ -80,7 +80,7 @@
           >删除</el-button
         >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -90,7 +90,7 @@
           v-hasPermi="['biz:config:export']"
           >导出</el-button
         >
-      </el-col>
+      </el-col> -->
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
@@ -204,7 +204,6 @@ import {
   addConfig,
   updateConfig,
 } from "@/api/biz/config";
-
 export default {
   name: "Config",
   dicts: ["biz_algorithm_type"],

+ 26 - 8
ips-ui/src/views/biz/distillation/index.vue

@@ -115,7 +115,7 @@
           >删除</el-button
         >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -125,7 +125,7 @@
           v-hasPermi="['biz:distillation:export']"
           >导出</el-button
         >
-      </el-col>
+      </el-col> -->
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
@@ -244,17 +244,21 @@
             />
           </el-select>
         </el-form-item>
+        <el-form-item label="模型" prop="modelPath">
+          <file-picker v-model="form.modelPath" />
+        </el-form-item>
         <el-form-item label="输入路径" prop="inputPath">
-          <el-input v-model="form.inputPath" placeholder="请输入输入路径" />
+          <folder-picker v-model="form.inputPath" />
         </el-form-item>
         <el-form-item label="输出路径" prop="outputPath">
-          <el-input v-model="form.outputPath" placeholder="请输入输出路径" />
+          <folder-picker v-model="form.outputPath" />
         </el-form-item>
         <el-form-item label="算法参数" prop="algorithmParams">
-          <el-input
-            v-model="form.algorithmParams"
-            type="textarea"
-            placeholder="请输入内容"
+          <el-button @click="showParamsDialog = true">设置参数</el-button>
+          <dynamic-form-dialog
+            :json-str="form.algorithmParams"
+            :visible.sync="showParamsDialog"
+            @submit="handleConfigSubmit"
           />
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -284,11 +288,19 @@ import {
   getResultDetails,
 } from "@/api/biz/distillation";
 
+import FolderPicker from "@/components/FolderPicker";
+import FilePicker from "@/components/FilePicker";
 import { getStatic } from "@/api/biz/common";
 import { getOptionsByType } from "@/api/biz/config";
+import DynamicFormDialog from "@/components/DynamicFormDialog";
 export default {
   name: "Distillation",
   dicts: ["biz_status"],
+  components: {
+    FolderPicker,
+    FilePicker,
+    DynamicFormDialog,
+  },
   data() {
     return {
       staticsUrl: process.env.VUE_APP_BASE_API + "/biz/common/getStatic",
@@ -330,6 +342,7 @@ export default {
       detailsOpen: false,
       jsonResult: {},
       selectFileName: "",
+      showParamsDialog: false,
     };
   },
   created() {
@@ -480,6 +493,11 @@ export default {
         this.detailsOpen = true;
       });
     },
+    handleConfigSubmit(modifiedJson) {
+      this.form.algorithmParams = modifiedJson;
+      // 这里可以添加处理配置更新的逻辑
+      console.log("更新后的配置:", JSON.parse(modifiedJson));
+    },
   },
 };
 </script>

+ 21 - 8
ips-ui/src/views/biz/features/index.vue

@@ -123,7 +123,7 @@
           >删除</el-button
         >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -133,7 +133,7 @@
           v-hasPermi="['biz:features:export']"
           >导出</el-button
         >
-      </el-col>
+      </el-col> -->
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
@@ -253,16 +253,17 @@
           </el-select>
         </el-form-item>
         <el-form-item label="输入路径" prop="inputPath">
-          <el-input v-model="form.inputPath" placeholder="请输入输入路径" />
+          <folder-picker v-model="form.inputPath" />
         </el-form-item>
         <el-form-item label="输出路径" prop="outputPath">
-          <el-input v-model="form.outputPath" placeholder="请输入输出路径" />
+          <folder-picker v-model="form.outputPath" />
         </el-form-item>
         <el-form-item label="算法参数" prop="algorithmParams">
-          <el-input
-            v-model="form.algorithmParams"
-            type="textarea"
-            placeholder="请输入内容"
+          <el-button @click="showParamsDialog = true">设置参数</el-button>
+          <dynamic-form-dialog
+            :json-str="form.algorithmParams"
+            :visible.sync="showParamsDialog"
+            @submit="handleConfigSubmit"
           />
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -288,11 +289,17 @@ import {
   getResultDetails,
 } from "@/api/biz/features";
 
+import FolderPicker from "@/components/FolderPicker";
 import { getStatic } from "@/api/biz/common";
 import { getOptionsByType } from "@/api/biz/config";
+import DynamicFormDialog from "@/components/DynamicFormDialog";
 export default {
   name: "Features",
   dicts: ["biz_status"],
+  components: {
+    FolderPicker,
+    DynamicFormDialog,
+  },
   data() {
     return {
       staticsUrl: process.env.VUE_APP_BASE_API + "/biz/common/getStatic",
@@ -334,6 +341,7 @@ export default {
       detailsOpen: false,
       jsonResult: {},
       selectFileName: "",
+      showParamsDialog: false,
     };
   },
   created() {
@@ -484,6 +492,11 @@ export default {
         this.detailsOpen = true;
       });
     },
+    handleConfigSubmit(modifiedJson) {
+      this.form.algorithmParams = modifiedJson;
+      // 这里可以添加处理配置更新的逻辑
+      console.log("更新后的配置:", JSON.parse(modifiedJson));
+    },
   },
 };
 </script>

+ 414 - 0
ips-ui/src/views/biz/images/index.vue

@@ -0,0 +1,414 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="任务名称" prop="taskName">
+        <el-input
+          v-model="queryParams.taskName"
+          placeholder="请输入任务名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="算法" prop="algorithmId">
+        <el-select
+          v-model="queryParams.algorithmId"
+          placeholder="请选择算法"
+          @keyup.enter.native="handleQuery"
+          clearable
+        >
+          <el-option
+            v-for="option in configOptions"
+            :key="option.id"
+            :label="option.name"
+            :value="option.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="输入路径" prop="inputPath">
+        <el-input
+          v-model="queryParams.inputPath"
+          placeholder="请输入输入路径"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择状态"
+          clearable
+        >
+          <el-option
+            v-for="dict in dict.type.biz_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['biz:images:add']"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['biz:images:edit']"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['biz:images:remove']"
+          >删除</el-button
+        >
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['biz:images:export']"
+          >导出</el-button
+        >
+      </el-col> -->
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="imagesList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="任务名称" align="center" prop="taskName" />
+      <el-table-column label="算法" align="center" prop="algorithmName" />
+      <el-table-column label="输入路径" align="center" prop="inputPath" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.biz_status" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['biz:images:edit']"
+            >修改</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['biz:images:remove']"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改时频图生成对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="任务名称" prop="taskName">
+          <el-input v-model="form.taskName" placeholder="请输入任务名称" />
+        </el-form-item>
+        <el-form-item label="算法" prop="algorithmId">
+          <el-select
+            v-model="form.algorithmId"
+            placeholder="请选择算法"
+            @change="changeAlgorithmId"
+            clearable
+          >
+            <el-option
+              v-for="option in configOptions"
+              :key="option.id"
+              :label="option.name"
+              :value="option.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="输入路径" prop="inputPath">
+          <folder-picker v-model="form.inputPath" />
+        </el-form-item>
+        <el-form-item label="输出路径" prop="outputPath">
+          <folder-picker v-model="form.outputPath" />
+        </el-form-item>
+        <el-form-item label="算法参数" prop="algorithmParams">
+          <el-button @click="showParamsDialog = true">设置参数</el-button>
+          <dynamic-form-dialog
+            :json-str="form.algorithmParams"
+            :visible.sync="showParamsDialog"
+            @submit="handleConfigSubmit"
+          />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listImages,
+  getImages,
+  delImages,
+  addImages,
+  updateImages,
+} from "@/api/biz/images";
+import { getOptionsByType } from "@/api/biz/config";
+import FolderPicker from "@/components/FolderPicker";
+import DynamicFormDialog from "@/components/DynamicFormDialog";
+export default {
+  name: "Images",
+  dicts: ["biz_status"],
+  components: {
+    FolderPicker,
+    DynamicFormDialog,
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 时频图生成表格数据
+      imagesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskName: null,
+        algorithmId: null,
+        inputPath: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {},
+      configOptions: [],
+      showParamsDialog: false,
+    };
+  },
+  created() {
+    this.getList();
+    this.getOptions();
+  },
+  activated() {
+    this.getList();
+    this.getOptions();
+  },
+  methods: {
+    /** 查询时频图生成列表 */
+    getList() {
+      this.loading = true;
+      listImages(this.queryParams).then((response) => {
+        this.imagesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        taskName: null,
+        algorithmId: null,
+        inputPath: null,
+        outputPath: null,
+        algorithmParams: null,
+        status: null,
+        startTime: null,
+        endTime: null,
+        remark: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加时频图生成";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getImages(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改时频图生成";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateImages(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addImages(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal
+        .confirm('是否确认删除时频图生成编号为"' + ids + '"的数据项?')
+        .then(function () {
+          return delImages(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "biz/images/export",
+        {
+          ...this.queryParams,
+        },
+        `images_${new Date().getTime()}.xlsx`
+      );
+    },
+    getOptions() {
+      getOptionsByType("6").then((response) => {
+        this.configOptions = response.data;
+      });
+    },
+    handleConfigSubmit(modifiedJson) {
+      this.form.algorithmParams = modifiedJson;
+      // 这里可以添加处理配置更新的逻辑
+      console.log("更新后的配置:", JSON.parse(modifiedJson));
+    },
+    changeAlgorithmId() {
+      const algorithmId = this.form.algorithmId;
+      const config = this.configOptions.find((item) => item.id === algorithmId);
+      if (config && config.params) {
+        this.form.algorithmParams = config.params;
+      } else {
+        this.form.algorithmParams = "";
+      }
+    },
+  },
+};
+</script>

+ 2 - 2
ips-ui/src/views/biz/preprocessed/index.vue

@@ -115,7 +115,7 @@
           >删除</el-button
         >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -125,7 +125,7 @@
           v-hasPermi="['biz:preprocessed:export']"
           >导出</el-button
         >
-      </el-col>
+      </el-col> -->
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"

+ 29 - 8
ips-ui/src/views/biz/test/index.vue

@@ -115,7 +115,7 @@
           >删除</el-button
         >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -125,7 +125,7 @@
           v-hasPermi="['biz:test:export']"
           >导出</el-button
         >
-      </el-col>
+      </el-col> -->
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
@@ -244,17 +244,24 @@
             />
           </el-select>
         </el-form-item>
+        <el-form-item label="pth模型" prop="modelPath">
+          <file-picker v-model="form.modelPath" />
+        </el-form-item>
+        <el-form-item label="pkl模型" prop="modelPklPath">
+          <file-picker v-model="form.modelPklPath" />
+        </el-form-item>
         <el-form-item label="输入路径" prop="inputPath">
-          <el-input v-model="form.inputPath" placeholder="请输入输入路径" />
+          <folder-picker v-model="form.inputPath" />
         </el-form-item>
         <el-form-item label="输出路径" prop="outputPath">
-          <el-input v-model="form.outputPath" placeholder="请输入输出路径" />
+          <folder-picker v-model="form.outputPath" />
         </el-form-item>
         <el-form-item label="算法参数" prop="algorithmParams">
-          <el-input
-            v-model="form.algorithmParams"
-            type="textarea"
-            placeholder="请输入内容"
+          <el-button @click="showParamsDialog = true">设置参数</el-button>
+          <dynamic-form-dialog
+            :json-str="form.algorithmParams"
+            :visible.sync="showParamsDialog"
+            @submit="handleConfigSubmit"
           />
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -285,9 +292,17 @@ import {
 } from "@/api/biz/test";
 import { getStatic } from "@/api/biz/common";
 import { getOptionsByType } from "@/api/biz/config";
+import FolderPicker from "@/components/FolderPicker";
+import FilePicker from "@/components/FilePicker";
+import DynamicFormDialog from "@/components/DynamicFormDialog";
 export default {
   name: "Test",
   dicts: ["biz_status"],
+  components: {
+    FolderPicker,
+    FilePicker,
+    DynamicFormDialog,
+  },
   data() {
     return {
       staticsUrl: process.env.VUE_APP_BASE_API + "/biz/common/getStatic",
@@ -329,6 +344,7 @@ export default {
       detailsOpen: false,
       jsonResult: {},
       selectFileName: "",
+      showParamsDialog: false,
     };
   },
   created() {
@@ -479,6 +495,11 @@ export default {
         this.detailsOpen = true;
       });
     },
+    handleConfigSubmit(modifiedJson) {
+      this.form.algorithmParams = modifiedJson;
+      // 这里可以添加处理配置更新的逻辑
+      console.log("更新后的配置:", JSON.parse(modifiedJson));
+    },
   },
 };
 </script>

+ 26 - 8
ips-ui/src/views/biz/training/index.vue

@@ -115,7 +115,7 @@
           >删除</el-button
         >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -125,7 +125,7 @@
           v-hasPermi="['biz:training:export']"
           >导出</el-button
         >
-      </el-col>
+      </el-col> -->
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
@@ -244,17 +244,21 @@
             />
           </el-select>
         </el-form-item>
+        <el-form-item label="模型" prop="modelPath">
+          <file-picker v-model="form.modelPath" />
+        </el-form-item>
         <el-form-item label="输入路径" prop="inputPath">
-          <el-input v-model="form.inputPath" placeholder="请输入输入路径" />
+          <folder-picker v-model="form.inputPath" />
         </el-form-item>
         <el-form-item label="输出路径" prop="outputPath">
-          <el-input v-model="form.outputPath" placeholder="请输入输出路径" />
+          <folder-picker v-model="form.outputPath" />
         </el-form-item>
         <el-form-item label="算法参数" prop="algorithmParams">
-          <el-input
-            v-model="form.algorithmParams"
-            type="textarea"
-            placeholder="请输入内容"
+          <el-button @click="showParamsDialog = true">设置参数</el-button>
+          <dynamic-form-dialog
+            :json-str="form.algorithmParams"
+            :visible.sync="showParamsDialog"
+            @submit="handleConfigSubmit"
           />
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -285,9 +289,17 @@ import {
 } from "@/api/biz/training";
 import { getStatic } from "@/api/biz/common";
 import { getOptionsByType } from "@/api/biz/config";
+import FolderPicker from "@/components/FolderPicker";
+import FilePicker from "@/components/FilePicker";
+import DynamicFormDialog from "@/components/DynamicFormDialog";
 export default {
   name: "Training",
   dicts: ["biz_status"],
+  components: {
+    FolderPicker,
+    DynamicFormDialog,
+    FilePicker,
+  },
   data() {
     return {
       staticsUrl: process.env.VUE_APP_BASE_API + "/biz/common/getStatic",
@@ -329,6 +341,7 @@ export default {
       detailsOpen: false,
       jsonResult: {},
       selectFileName: "",
+      showParamsDialog: false,
     };
   },
   created() {
@@ -479,6 +492,11 @@ export default {
         this.detailsOpen = true;
       });
     },
+    handleConfigSubmit(modifiedJson) {
+      this.form.algorithmParams = modifiedJson;
+      // 这里可以添加处理配置更新的逻辑
+      console.log("更新后的配置:", JSON.parse(modifiedJson));
+    },
   },
 };
 </script>

+ 13 - 1
ips-ui/src/views/index.vue

@@ -5,12 +5,13 @@
         <el-button @click="selectFolder">选择文件夹</el-button>
       </template>
     </el-input> -->
+    <el-button @click="openFolder('D:\ips')"> 打开文档文件夹 </el-button>
   </div>
 </template>
 
 <script>
 const { ipcRenderer } = require("electron");
-
+const { shell } = window.require("electron");
 export default {
   data() {
     return {
@@ -30,6 +31,17 @@ export default {
         this.$message.error("选择文件夹失败");
       }
     },
+    openFolder(path) {
+      try {
+        shell.openPath(path).then((result) => {
+          if (result) {
+            this.$message.error(`打开文件夹失败: ${result}`);
+          }
+        });
+      } catch (error) {
+        this.$message.error(`打开文件夹出错: ${error.message}`);
+      }
+    },
   },
 };
 </script>

+ 46 - 1
sql/biz.sql

@@ -56,6 +56,7 @@ create table biz_training (
   id           bigint(20)      not null auto_increment    comment '编号',
   task_name         varchar(50)      default ''                comment '任务名称',
   algorithm_id      bigint(20)                                 comment '算法',
+  model_path        varchar(255)     default ''                comment '模型',
   input_path        varchar(255)     default ''                comment '输入路径',
   output_path       varchar(255)     default ''                comment '输出路径',
   algorithm_params  text                                       comment '算法参数',
@@ -75,6 +76,7 @@ create table biz_distillation (
   id           bigint(20)      not null auto_increment    comment '编号',
   task_name         varchar(50)      default ''                comment '任务名称',
   algorithm_id      bigint(20)                                 comment '算法',
+  model_path        varchar(255)     default ''                comment '模型',
   input_path        varchar(255)     default ''                comment '输入路径',
   output_path       varchar(255)     default ''                comment '输出路径',
   algorithm_params  text                                       comment '算法参数',
@@ -94,6 +96,8 @@ create table biz_classify_test (
   id           bigint(20)      not null auto_increment    comment '编号',
   task_name         varchar(50)      default ''                comment '任务名称',
   algorithm_id      bigint(20)                                 comment '算法',
+  model_path        varchar(255)     default ''                comment '模型',
+  model_pkl_path        varchar(255)     default ''            comment '模型pkl',
   input_path        varchar(255)     default ''                comment '输入路径',
   output_path       varchar(255)     default ''                comment '输出路径',
   algorithm_params  text                                       comment '算法参数',
@@ -108,6 +112,24 @@ create table biz_classify_test (
   primary key (id)
 ) engine=innodb comment = '分类测试表';
 
+drop table if exists biz_time_frequency_images;
+create table biz_time_frequency_images(
+  id           bigint(20)      not null auto_increment    comment '编号',
+  task_name         varchar(50)      default ''                comment '任务名称',
+  algorithm_id      bigint(20)                                 comment '算法',
+  input_path        varchar(255)     default ''                comment '输入路径',
+  output_path       varchar(255)     default ''                comment '输出路径',
+  algorithm_params  text                                       comment '算法参数',
+  status            char(1)          default '0'               comment '状态(0未运行,1运行中,2已完成,3失败)',
+  start_time        datetime                                   comment '开始时间',
+  end_time          datetime                                   comment '结束时间',
+  remark            varchar(255)          default ''           comment '备注',
+  create_by         varchar(64)     default ''                 comment '创建者',
+  create_time 	    datetime                                   comment '创建时间',
+  update_by         varchar(64)     default ''                 comment '更新者',
+  update_time       datetime                                   comment '更新时间',
+  primary key (id)
+) engine=innodb comment = '时频图生成表';
 --drop table if exists gen_child_tables;
 --CREATE TABLE `gen_child_tables` (
 --  `table_ref_id` varchar(64) NOT NULL COMMENT '主键ID',
@@ -280,4 +302,27 @@ insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame
 values('知识蒸馏删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'biz:distillation:remove',       '#', 'admin', sysdate(), '', null, '');
 
 insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('知识蒸馏导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'biz:distillation:export',       '#', 'admin', sysdate(), '', null, '');
+values('知识蒸馏导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'biz:distillation:export',       '#', 'admin', sysdate(), '', null, '');
+
+-- 菜单 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('时频图生成', '0', '1', 'images', 'biz/images/index', 1, 0, 'C', '0', '0', 'biz:images:list', '#', 'admin', sysdate(), '', null, '时频图生成菜单');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('时频图生成查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'biz:images:query',        '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('时频图生成新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'biz:images:add',          '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('时频图生成修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'biz:images:edit',         '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('时频图生成删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'biz:images:remove',       '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('时频图生成导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'biz:images:export',       '#', 'admin', sysdate(), '', null, '');