xw 3 дней назад
Родитель
Сommit
a092668b08
19 измененных файлов с 225 добавлено и 97 удалено
  1. 1 1
      fs-admin/src/main/java/com/fs/FSApplication.java
  2. 8 38
      fs-admin/src/main/java/com/fs/course/controller/FsUserVideoController.java
  3. 9 2
      fs-admin/src/main/java/com/fs/web/controller/common/CommonController.java
  4. 1 1
      fs-company-app/src/main/java/com/fs/app/controller/CommonController.java
  5. 14 6
      fs-company/src/main/java/com/fs/company/controller/common/CommonController.java
  6. 4 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  7. 1 1
      fs-doctor-app/src/main/java/com/fs/app/controller/CommonController.java
  8. 2 2
      fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java
  9. 1 1
      fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java
  10. 3 0
      fs-service/src/main/java/com/fs/system/oss/CloudConstant.java
  11. 17 0
      fs-service/src/main/java/com/fs/system/oss/CloudStorageService.java
  12. 13 0
      fs-service/src/main/java/com/fs/system/oss/OSSFactory.java
  13. 90 6
      fs-service/src/main/java/com/fs/system/oss/QcloudCloudStorageService.java
  14. 43 20
      fs-service/src/main/java/com/fs/utils/VideoUtil.java
  15. 2 2
      fs-service/src/main/resources/application-config-dev-jnlzjk.yml
  16. 12 12
      fs-service/src/main/resources/application-config-druid-jshz.yml
  17. 2 2
      fs-store/src/main/java/com/fs/store/controller/common/CommonController.java
  18. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/CommonController.java
  19. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/store/CommonScrmController.java

+ 1 - 1
fs-admin/src/main/java/com/fs/FSApplication.java

@@ -13,7 +13,7 @@ import org.springframework.transaction.annotation.Transactional;
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @Transactional
 @EnableAsync
-@EnableScheduling
+//@EnableScheduling
 public class FSApplication {
     public static void main(String[] args) {
         // System.setProperty("spring.devtools.restart.enabled", "false");

+ 8 - 38
fs-admin/src/main/java/com/fs/course/controller/FsUserVideoController.java

@@ -24,6 +24,7 @@ import com.fs.his.service.IFsPackageService;
 import com.fs.his.vo.FsPackageVO;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
+import com.fs.utils.VideoUtil;
 import com.volcengine.model.response.AssumeRoleResponse;
 import com.volcengine.service.vod.IVodService;
 import lombok.extern.slf4j.Slf4j;
@@ -207,15 +208,14 @@ public class FsUserVideoController extends BaseController
             return R.error("仅支持MP4类型");
         }
 
-        // 保存上传的视频文件
-        String videoFileName = System.currentTimeMillis() + "_" + UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
+        // 保存上传的视频文件(保留 .mp4 后缀,便于 ffmpeg 识别格式)
+        String videoFileName = System.currentTimeMillis() + "_" + UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16) + ".mp4";
         createDir(VIDEO_UPLOAD_DIR);
         File videoFile = new File(VIDEO_UPLOAD_DIR, videoFileName);
         try {
             file.transferTo(videoFile);
         } catch (IOException e) {
-            e.printStackTrace();
-            // 记录错误日志
+            log.error("保存临时视频失败, path={}", videoFile.getAbsolutePath(), e);
             return R.error("获取封面失败");
         }
 
@@ -224,10 +224,11 @@ public class FsUserVideoController extends BaseController
         createDir(FRAME_OUTPUT_DIR);
         File frameFile = new File(FRAME_OUTPUT_DIR, frameFileName);
         try {
-            extractFirstFrame(videoFile.getAbsolutePath(), frameFile.getAbsolutePath());
+            VideoUtil.extractFirstFrame(videoFile.getAbsolutePath(), frameFile.getAbsolutePath());
         } catch (Exception e) {
-            e.printStackTrace();
-            // 记录错误日志
+            log.error("提取第一帧失败, video={}, size={}, frame={}",
+                    videoFile.getAbsolutePath(), videoFile.length(), frameFile.getAbsolutePath(), e);
+            videoFile.delete();
             return R.error("提取第一帧失败");
         }
 
@@ -251,37 +252,6 @@ public class FsUserVideoController extends BaseController
         return R.ok().put("url", url);
     }
 
-    // 提取视频第一帧的方法
-    private void extractFirstFrame(String videoPath, String outputImagePath) throws IOException, InterruptedException {
-        String[] command = {
-                "ffmpeg",
-                "-i", videoPath,
-//                "-ss", "00:00:01.000", // 截取1秒处的帧
-                "-frames:v", "1",
-                "-f", "image2",
-                "-update", "1",
-                "-q:v", "10", // 质量,1为最好,31为最差
-                outputImagePath
-        };
-        ProcessBuilder processBuilder = new ProcessBuilder(command);
-        processBuilder.redirectErrorStream(true); // 将标准错误和标准输出合并
-        Process process = processBuilder.start();
-//        process.waitFor();
-
-        // 处理进程的标准输出和错误流
-        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                System.out.println(line); // 输出到控制台或日志
-            }
-        }
-
-        int exitCode = process.waitFor();
-        if (exitCode != 0) {
-            throw new RuntimeException("FFmpeg 执行失败,退出代码:" + exitCode);
-        }
-    }
-
     private void createDir(String path){
         File videoUploadDir = new File(path);
         if (!videoUploadDir.exists()) {

+ 9 - 2
fs-admin/src/main/java/com/fs/web/controller/common/CommonController.java

@@ -179,7 +179,14 @@ public class CommonController
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(file.getBytes(), suffix);
-        return R.ok().put("url", url);
+        return storage.buildUploadResponse(url);
+    }
+    @RateLimiter(time = 60, count = 30, limitType = LimitType.IP, msg = "上传过于频繁,请稍后再试")
+    @GetMapping("/common/getSignedUrl")
+    public R getSignedUrl(@RequestParam("url") String url)
+    {
+        CloudStorageService storage = OSSFactory.build();
+        return R.ok().put("url", url).put("accessUrl", storage.getAccessUrl(url));
     }
     @RateLimiter(time = 60, count = 30, limitType = LimitType.IP, msg = "上传过于频繁,请稍后再试")
     @PostMapping("/common/uploadWang")
@@ -195,7 +202,7 @@ public class CommonController
             vo.setErrno(0);
             List<WangUploadVO.WangUploadItem> items = new ArrayList<>();
             WangUploadVO.WangUploadItem item = new WangUploadVO.WangUploadItem();
-            item.setUrl(url);
+            item.setUrl(storage.getAccessUrl(url));
             items.add(item);
             vo.setData(items);
             return vo;

+ 1 - 1
fs-company-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -219,7 +219,7 @@ public class CommonController extends AppBaseController {
 		String suffix = OssUploadUtils.validateAndGetSuffix(file);
 		CloudStorageService storage = OSSFactory.build();
 		String url = storage.uploadSuffix(file.getBytes(), suffix);
-		return R.ok().put("url", url);
+		return storage.buildUploadResponse(url);
 	}
 
 

+ 14 - 6
fs-company/src/main/java/com/fs/company/controller/common/CommonController.java

@@ -233,7 +233,7 @@ public class CommonController
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(file.getBytes(), suffix);
-        return R.ok().put("url", url);
+        return storage.buildUploadResponse(url);
     }
 
     @PostMapping("common/uploadOSS2")
@@ -242,7 +242,14 @@ public class CommonController
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(file.getBytes(), suffix);
-        return R.ok().put("url", url).put("fileName", file.getOriginalFilename());
+        return storage.buildUploadResponse(url).put("fileName", file.getOriginalFilename());
+    }
+
+    @GetMapping("/common/getSignedUrl")
+    public R getSignedUrl(@RequestParam("url") String url)
+    {
+        CloudStorageService storage = OSSFactory.build();
+        return R.ok().put("url", url).put("accessUrl", storage.getAccessUrl(url));
     }
 
     @PostMapping("common/uploadOSSByHOOKImage")
@@ -269,7 +276,7 @@ public class CommonController
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(pngBytes, ".png");
 
-        return R.ok().put("url", url);
+        return storage.buildUploadResponse(url);
     }
 
 
@@ -280,14 +287,15 @@ public class CommonController
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String mp3Url = storage.uploadSuffix(file.getBytes(), suffix);
+        String mp3AccessUrl = storage.getAccessUrl(mp3Url);
         String silkUrl="";
         try {
-            silkUrl = AudioUtils.transferAudioSilkFromUrl(mp3Url,true);
+            silkUrl = AudioUtils.transferAudioSilkFromUrl(mp3AccessUrl,true);
         }catch (Exception e){
             throw new Exception("音频转换失败:"+e);
         }
 
-        return R.ok().put("mp3Url", mp3Url).put("silkUrl", silkUrl);
+        return storage.buildUploadResponse(mp3Url).put("mp3Url", mp3Url).put("silkUrl", silkUrl);
     }
     @RateLimiter(time = 60, count = 30, limitType = LimitType.IP, msg = "上传过于频繁,请稍后再试")
     @PostMapping("/common/uploadWang")
@@ -303,7 +311,7 @@ public class CommonController
             vo.setErrno(0);
             List<WangUploadVO.WangUploadItem> items = new ArrayList<>();
             WangUploadVO.WangUploadItem item = new WangUploadVO.WangUploadItem();
-            item.setUrl(url);
+            item.setUrl(storage.getAccessUrl(url));
             items.add(item);
             vo.setData(items);
             return vo;

+ 4 - 1
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -45,6 +45,8 @@ import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwUserVO;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
@@ -727,7 +729,8 @@ public class CompanyUserController extends BaseController {
     public R uploadOSS(@RequestParam("file") MultipartFile file,
                        @RequestParam("userId") String userId) throws Exception {
         String url = companyUserService.uploadQrCode(file, userId);
-        return R.ok().put("url", url);
+        CloudStorageService storage = OSSFactory.build();
+        return storage.buildUploadResponse(url);
     }
 
 

+ 1 - 1
fs-doctor-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -165,7 +165,7 @@ public class CommonController {
 		String suffix = OssUploadUtils.validateAndGetSuffix(file);
 		CloudStorageService storage = OSSFactory.build();
 		String url = storage.uploadSuffix(file.getBytes(), suffix);
-		return R.ok().put("url", url);
+		return storage.buildUploadResponse(url);
 	}
 
 

+ 2 - 2
fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java

@@ -52,8 +52,8 @@ public class ScheduleConfig
         // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
         factory.setOverwriteExistingJobs(true);
         // 设置自动启动,默认为true 切记调整为true
-        factory.setAutoStartup(true);
-//        factory.setAutoStartup(false);
+//        factory.setAutoStartup(true);
+        factory.setAutoStartup(false);
 
         return factory;
     }

+ 1 - 1
fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -35,7 +35,7 @@ public class CommonController {
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(file.getBytes(), suffix);
-        return R.ok().put("url", url);
+        return storage.buildUploadResponse(url);
     }
 
 }

+ 3 - 0
fs-service/src/main/java/com/fs/system/oss/CloudConstant.java

@@ -7,6 +7,9 @@ public class CloudConstant
      */
     public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloudStorage";
 
+    /** 腾讯云 COS 预签名 URL 有效期:7 天(秒) */
+    public final static long QCLOUD_PRESIGNED_URL_EXPIRE_SECONDS = 7L * 24 * 3600;
+
     /**
        * 云服务商
        */

+ 17 - 0
fs-service/src/main/java/com/fs/system/oss/CloudStorageService.java

@@ -1,5 +1,6 @@
 package com.fs.system.oss;
 
+import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 
@@ -69,4 +70,20 @@ public abstract class CloudStorageService
      * @return             返回http地址
      */
     public abstract String uploadSuffix(InputStream inputStream, String suffix);
+
+    /**
+     * 将存储 URL 转为可访问 URL(腾讯云私有桶返回预签名 URL,其他云存储原样返回)
+     */
+    public String getAccessUrl(String storedUrl)
+    {
+        return storedUrl;
+    }
+
+    /**
+     * 构建上传响应:url 为持久化地址,accessUrl 为带签名的可访问地址
+     */
+    public R buildUploadResponse(String url)
+    {
+        return R.ok().put("url", url).put("accessUrl", getAccessUrl(url));
+    }
 }

+ 13 - 0
fs-service/src/main/java/com/fs/system/oss/OSSFactory.java

@@ -39,4 +39,17 @@ public final class OSSFactory
         }
         return null;
     }
+
+    /**
+     * 将存储 URL 转为可访问 URL(腾讯云私有桶返回预签名 URL)
+     */
+    public static String getAccessUrl(String storedUrl)
+    {
+        CloudStorageService storage = build();
+        if (storage == null)
+        {
+            return storedUrl;
+        }
+        return storage.getAccessUrl(storedUrl);
+    }
 }

+ 90 - 6
fs-service/src/main/java/com/fs/system/oss/QcloudCloudStorageService.java

@@ -1,10 +1,12 @@
 package com.fs.system.oss;
 
 import com.fs.common.exception.file.OssException;
+import com.fs.common.utils.StringUtils;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.auth.BasicCOSCredentials;
 import com.qcloud.cos.auth.COSCredentials;
+import com.qcloud.cos.http.HttpMethodName;
 import com.qcloud.cos.model.ObjectMetadata;
 import com.qcloud.cos.model.PutObjectRequest;
 import com.qcloud.cos.region.Region;
@@ -13,6 +15,9 @@ import org.apache.commons.io.IOUtils;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.Date;
 
 /**
  * 腾讯云存储
@@ -24,14 +29,12 @@ public class QcloudCloudStorageService extends CloudStorageService
     public QcloudCloudStorageService(CloudStorageConfig config)
     {
         this.config = config;
-        // 初始化
         init();
     }
 
     private void init()
     {
         COSCredentials credentials = new BasicCOSCredentials(config.getQcloudSecretId(), config.getQcloudSecretKey());
-        // 设置bucket所在的区域,最新sdk不再支持简写,请填写完整
         Region region = new Region(config.getQcloudRegion());
         ClientConfig clientConfig = new ClientConfig(region);
         client = new COSClient(credentials, clientConfig);
@@ -43,19 +46,16 @@ public class QcloudCloudStorageService extends CloudStorageService
         try
         {
             ObjectMetadata objectMetadata = new ObjectMetadata();
-            // 从输入流上传必须制定content length, 否则http客户端可能会缓存所有数据,存在内存OOM的情况
             objectMetadata.setContentLength(data.length);
             PutObjectRequest putObjectRequest = new PutObjectRequest(config.getQcloudBucketName(), path,
                     new ByteArrayInputStream(data), objectMetadata);
-            // 设置存储类型, 默认是标准(Standard), 低频(standard_ia)
-            // putObjectRequest.setStorageClass(StorageClass.Standard_IA);
             client.putObject(putObjectRequest);
         }
         catch (Exception e)
         {
             throw new OssException("文件上传失败," + e.getMessage());
         }
-        return config.getQcloudDomain() +"/"+ path;
+        return buildPublicUrl(path);
     }
 
     @Override
@@ -83,4 +83,88 @@ public class QcloudCloudStorageService extends CloudStorageService
     {
         return upload(inputStream, getPath(config.getQcloudPrefix(), suffix));
     }
+
+    @Override
+    public String getAccessUrl(String storedUrl)
+    {
+        if (StringUtils.isBlank(storedUrl))
+        {
+            return storedUrl;
+        }
+        String objectKey = extractObjectKey(storedUrl);
+        if (StringUtils.isBlank(objectKey))
+        {
+            return storedUrl;
+        }
+        return generatePresignedUrl(objectKey);
+    }
+
+    private String buildPublicUrl(String path)
+    {
+        String domain = config.getQcloudDomain();
+        if (domain.endsWith("/"))
+        {
+            domain = domain.substring(0, domain.length() - 1);
+        }
+        if (path.startsWith("/"))
+        {
+            path = path.substring(1);
+        }
+        return domain + "/" + path;
+    }
+
+    private String generatePresignedUrl(String objectKey)
+    {
+        try
+        {
+            Date expiration = new Date(System.currentTimeMillis()
+                    + CloudConstant.QCLOUD_PRESIGNED_URL_EXPIRE_SECONDS * 1000);
+            URL url = client.generatePresignedUrl(config.getQcloudBucketName(), objectKey, expiration,
+                    HttpMethodName.GET);
+            return url.toString();
+        }
+        catch (Exception e)
+        {
+            throw new OssException("生成预签名 URL 失败," + e.getMessage());
+        }
+    }
+
+    private String extractObjectKey(String urlOrPath)
+    {
+        String path = urlOrPath.trim();
+        int queryIndex = path.indexOf('?');
+        if (queryIndex > 0)
+        {
+            path = path.substring(0, queryIndex);
+        }
+
+        String domain = config.getQcloudDomain();
+        if (domain.endsWith("/"))
+        {
+            domain = domain.substring(0, domain.length() - 1);
+        }
+
+        if (path.startsWith("http://") || path.startsWith("https://"))
+        {
+            if (path.startsWith(domain + "/"))
+            {
+                return path.substring(domain.length() + 1);
+            }
+            try
+            {
+                String uriPath = new URI(path).getPath();
+                if (StringUtils.isNotBlank(uriPath))
+                {
+                    return uriPath.startsWith("/") ? uriPath.substring(1) : uriPath;
+                }
+            }
+            catch (Exception ignored)
+            {
+                return null;
+            }
+            return null;
+        }
+
+        return path.startsWith("/") ? path.substring(1) : path;
+    }
 }

+ 43 - 20
fs-service/src/main/java/com/fs/utils/VideoUtil.java

@@ -14,11 +14,17 @@ import java.util.regex.Pattern;
 @Slf4j
 public class VideoUtil {
 
-    /** 与项目 AudioUtils 等模块一致:优先 C:\ffmpeg.exe,其次 PATH 中的 ffmpeg */
+    /** Windows: C:\ffmpeg.exe;Linux: /usr/bin/ffmpeg;其次 FFMPEG_PATH 环境变量;最后 PATH 中的 ffmpeg */
     private static String resolveFfmpegCommand() {
-        String winPath = "C:\\ffmpeg.exe";
-        if (new File(winPath).exists()) {
-            return winPath;
+        String[] candidates = {
+                "C:\\ffmpeg.exe",
+                "/usr/bin/ffmpeg",
+                "/usr/local/bin/ffmpeg"
+        };
+        for (String path : candidates) {
+            if (new File(path).exists()) {
+                return path;
+            }
         }
         String envPath = System.getenv("FFMPEG_PATH");
         if (envPath != null && !envPath.isEmpty() && new File(envPath).exists()) {
@@ -86,34 +92,51 @@ public class VideoUtil {
     }
 
     /**
-     * 提取缩略图
+     * 提取缩略图(优先第一帧,兼容短视频)
      */
     public static void extractFirstFrame(String videoPath, String outputImagePath) throws IOException, InterruptedException {
-        String[] command = {
-                resolveFfmpegCommand(),
-                "-ss", "00:00:01.000",  // 精准定位到第1秒
-                "-i", videoPath,        // 输入视频路径
-                "-vframes", "1",        // 只提取1帧
-                "-q:v", "2",            // 质量控制(2=高质量,范围1-31)
-                "-y",                   // 覆盖输出文件
-                outputImagePath         // 输出图片路径(如 cover.jpg)
-        };
+        File videoFile = new File(videoPath);
+        if (!videoFile.exists() || videoFile.length() == 0) {
+            throw new RuntimeException("视频文件不存在或为空:" + videoPath + ",size=" + videoFile.length());
+        }
+
+        // 先提取第一帧(接口语义是"第一帧",且兼容不足1秒的短视频)
+        if (runFfmpegExtract(videoPath, outputImagePath, false)) {
+            return;
+        }
+        // 第一帧失败时,回退到第1秒处(规避部分视频开头黑屏)
+        if (runFfmpegExtract(videoPath, outputImagePath, true)) {
+            return;
+        }
+        throw new RuntimeException("FFmpeg 未能生成封面图片:" + outputImagePath);
+    }
+
+    private static boolean runFfmpegExtract(String videoPath, String outputImagePath, boolean seekToOneSecond)
+            throws IOException, InterruptedException {
+        String ffmpeg = resolveFfmpegCommand();
+        String[] command = seekToOneSecond
+                ? new String[]{ffmpeg, "-ss", "00:00:01.000", "-i", videoPath, "-vframes", "1", "-q:v", "2", "-y", outputImagePath}
+                : new String[]{ffmpeg, "-i", videoPath, "-vframes", "1", "-q:v", "2", "-y", outputImagePath};
+
         ProcessBuilder processBuilder = new ProcessBuilder(command);
-        processBuilder.redirectErrorStream(true); // 将标准错误和标准输出合并
+        processBuilder.redirectErrorStream(true);
         Process process = processBuilder.start();
-//        process.waitFor();
 
-        // 处理进程的标准输出和错误流
+        StringBuilder output = new StringBuilder();
         try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
             String line;
             while ((line = reader.readLine()) != null) {
-                log.info(line); // 输出到控制台或日志
+                output.append(line).append('\n');
             }
         }
 
         int exitCode = process.waitFor();
-        if (exitCode != 0 && exitCode != 1) {
-            throw new RuntimeException("FFmpeg 执行失败,退出代码:" + exitCode);
+        File outputFile = new File(outputImagePath);
+        boolean success = exitCode == 0 && outputFile.exists() && outputFile.length() > 0;
+        if (!success) {
+            log.warn("FFmpeg 截帧失败, seekToOneSecond={}, exitCode={}, video={}, frame={}, output=\n{}",
+                    seekToOneSecond, exitCode, videoPath, outputImagePath, output);
         }
+        return success;
     }
 }

+ 2 - 2
fs-service/src/main/resources/application-config-dev-jnlzjk.yml

@@ -72,10 +72,10 @@ nuonuo:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
-  bucket: jnlzjk-1323137866
+  bucket: bjjs-1323137866
   app_id: 1323137866
   region: ap-chongqing
-  proxy: jnlzjk
+  proxy: bjjs
 tmp_secret_config:
   secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
   secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT

+ 12 - 12
fs-service/src/main/resources/application-config-druid-jshz.yml

@@ -14,16 +14,16 @@ wx:
     secret:
   miniapp:
     configs:
-      - appid:   #京视杭州
-        secret:  #京视杭州
+      - appid:   #北京京视
+        secret:  #北京京视
         token: Ncbnd7lJvkripxxna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
   cp:
-    corpId:  #企业ID京视杭州
+    corpId:  #企业ID北京京视
     appConfigs:
-      - agentId:       #京视杭州
-        secret:  #京视杭州
+      - agentId:       #北京京视
+        secret:  #北京京视
         token: PPKOdAlCoMO
         aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
   pay:
@@ -41,8 +41,8 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wxe704b34112659eb1 # 第一个公众号的appid  //公众号名称:京视杭州
-        secret: eaf3a1f3b326bf12c6b1a03e19faca6e # 公众号的appsecret--京视杭州
+      - appId: wxe704b34112659eb1 # 第一个公众号的appid  //公众号名称:北京京视
+        secret: eaf3a1f3b326bf12c6b1a03e19faca6e # 公众号的appsecret--北京京视
         token: PPKOdAlCoMO # 接口配置里的Token值
         aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
 aifabu:  #爱链接
@@ -75,10 +75,10 @@ nuonuo:
 tencent_cloud_config:
   secret_id: AKIDLl1tguyrZ6QddTCi2BLJ4e3OXVIuJVVK
   secret_key: g9R6kLrMp8EDzXszylLispiQxHRN6cw5
-  bucket: jshz-1323137866
+  bucket: bjjs-1323137866
   app_id: 1323137866
   region: ap-chongqing
-  proxy: jshz
+  proxy: bjjs
 tmp_secret_config:
   secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
   secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
@@ -87,10 +87,10 @@ tmp_secret_config:
   region: ap-chongqing
   proxy: fs
 cloud_host:
-  company_name: 京视杭州
+  company_name: 北京京视
   projectCode: JSHZ
-  spaceName: jshz-2114522511
-  volcengineUrl: https://jshzvolcengine.ylrztop.com
+  spaceName: bjjs-2026
+  volcengineUrl: https://bjjshs.ylrztop.com
 headerImg:
   imgUrl:
 

+ 2 - 2
fs-store/src/main/java/com/fs/store/controller/common/CommonController.java

@@ -137,7 +137,7 @@ public class CommonController
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(file.getBytes(), suffix);
-        return R.ok().put("url", url);
+        return storage.buildUploadResponse(url);
     }
     @RateLimiter(time = 60, count = 30, limitType = LimitType.IP, msg = "上传过于频繁,请稍后再试")
     @PostMapping("/common/uploadWang")
@@ -153,7 +153,7 @@ public class CommonController
             vo.setErrno(0);
             List<WangUploadVO.WangUploadItem> items = new ArrayList<>();
             WangUploadVO.WangUploadItem item = new WangUploadVO.WangUploadItem();
-            item.setUrl(url);
+            item.setUrl(storage.getAccessUrl(url));
             items.add(item);
             vo.setData(items);
             return vo;

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -353,7 +353,7 @@ public class CommonController {
 		String suffix = OssUploadUtils.validateAndGetSuffix(file);
 		CloudStorageService storage = OSSFactory.build();
 		String url = storage.uploadSuffix(file.getBytes(), suffix);
-		return R.ok().put("url", url);
+		return storage.buildUploadResponse(url);
 	}
 
 	@PostMapping("/uploadHuaWeiVod")

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/CommonScrmController.java

@@ -361,7 +361,7 @@ public class CommonScrmController extends AppBaseController {
         String suffix = OssUploadUtils.validateAndGetSuffix(file);
         CloudStorageService storage = OSSFactory.build();
         String url = storage.uploadSuffix(file.getBytes(), suffix);
-        return R.ok().put("url", url);
+        return storage.buildUploadResponse(url);
     }
 
     @ApiOperation("获取数据字典")