Bläddra i källkod

允许闪送凭证使用相对图片路径

取消凭证图片地址的协议和主机名限制,保留非空、长度及地址格式校验,并补充相对路径保存断言。
qmj 2 dagar sedan
förälder
incheckning
8152036be7

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryCreateRequest.java

@@ -36,7 +36,7 @@ public class FlashDeliveryCreateRequest extends FlashDeliveryQuoteRequest {
     /** 是否启用四位交付 PIN,选填;不传时默认为 true。 */
     private Boolean pinRequired;
 
-    /** 寄件图片 URL,选填,最多 9 张;每项必须是最长 1000 字符的完整 HTTP(S) URL。 */
+    /** 寄件图片地址,选填,最多 9 张;每项最长 1000 个字符,允许相对路径。 */
     private List<String> senderImageUrls;
 
     /** 用户对本次闪送的备注,选填,最长 500 个字符。 */

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryProofRequest.java

@@ -9,7 +9,7 @@ import java.util.List;
 public class FlashDeliveryProofRequest {
     /**
      * 履约凭证图片 URL,必填,数量为 1 至 9 张。
-     * 每项必须是最长 1000 个字符且包含主机名的完整 HTTP(S) URL
+     * 每项最长 1000 个字符,允许相对路径
      */
     private List<String> imageUrls;
 }

+ 2 - 3
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationService.java

@@ -597,11 +597,10 @@ public class FlashDeliveryApplicationService {
         for (String value : values) {
             try {
                 String url = value == null ? null : value.trim();
-                URI uri = url == null ? null : URI.create(url);
-                if (uri == null || url.length() > 1000 || uri.getHost() == null
-                        || !("http".equalsIgnoreCase(uri.getScheme()) || "https".equalsIgnoreCase(uri.getScheme()))) {
+                if (url == null || url.isEmpty() || url.length() > 1000) {
                     throw new IllegalArgumentException();
                 }
+                URI.create(url);
                 urls.add(url);
             } catch (IllegalArgumentException exception) {
                 throw fail("flash.delivery.proof.url.invalid");

+ 3 - 1
ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationServiceTest.java

@@ -160,7 +160,7 @@ class FlashDeliveryApplicationServiceTest {
     }
 
     @Test
-    void scheduledCreateGeneratesUserOnlyPinAndStoresSenderProof() {
+    void scheduledCreateGeneratesUserOnlyPinAndStoresRelativeSenderProof() {
         Fixture fixture = new Fixture();
         when(fixture.userMapper.selectOrdinaryUserIdsByNormalizedPhone("0922222222"))
                 .thenReturn(List.of(88L));
@@ -174,6 +174,7 @@ class FlashDeliveryApplicationServiceTest {
         when(fixture.imageMapper.selectList(any(Wrapper.class))).thenReturn(List.of());
         when(fixture.logMapper.selectList(any(Wrapper.class))).thenReturn(List.of());
         FlashDeliveryCreateRequest request = createRequest();
+        request.setSenderImageUrls(List.of("/profile/upload/2026/09/07/sender.jpg"));
 
         var result = fixture.service.create(7L, request);
 
@@ -183,6 +184,7 @@ class FlashDeliveryApplicationServiceTest {
         verify(fixture.imageMapper).insert(image.capture());
         assertEquals("SENDER", image.getValue().getProofType());
         assertEquals("USER", image.getValue().getOperatorType());
+        assertEquals("/profile/upload/2026/09/07/sender.jpg", image.getValue().getImageUrl());
         ArgumentCaptor<FlashDeliveryOrder> saved = ArgumentCaptor.forClass(FlashDeliveryOrder.class);
         verify(fixture.orderMapper).insert(saved.capture());
         assertEquals("SCHEDULED", saved.getValue().getDeliveryMode());