diff --git a/backend/services/trading-service/src/api/controllers/c2c.controller.ts b/backend/services/trading-service/src/api/controllers/c2c.controller.ts index 485b3538..544f0df8 100644 --- a/backend/services/trading-service/src/api/controllers/c2c.controller.ts +++ b/backend/services/trading-service/src/api/controllers/c2c.controller.ts @@ -25,6 +25,7 @@ import { } from '@nestjs/swagger'; import * as path from 'path'; import * as fs from 'fs'; +import { Public } from '../../shared/guards/jwt-auth.guard'; import { C2cService } from '../../application/services/c2c.service'; import { CreateC2cOrderDto, @@ -295,6 +296,7 @@ export class C2cController { return this.toResponseDto(order); } + @Public() @Get('proofs/:filename') @ApiOperation({ summary: '获取付款水单图片' }) @ApiParam({ name: 'filename', description: '文件名' }) diff --git a/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart b/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart index 9553ccdc..e91b81fd 100644 --- a/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart +++ b/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; +import '../../../core/constants/app_constants.dart'; import '../../../core/utils/format_utils.dart'; import '../../../data/models/c2c_order_model.dart'; import '../../providers/c2c_providers.dart'; @@ -881,6 +882,12 @@ class _C2cOrderDetailPageState extends ConsumerState { ); } + /// 将后端返回的相对路径转为完整图片 URL + String _buildProofImageUrl(String relativePath) { + if (relativePath.startsWith('http')) return relativePath; + return '${AppConstants.baseUrl}$relativePath'; + } + Widget _buildPaymentProofCard(C2cOrderModel order, bool isBuyer) { final hasProof = order.paymentProofUrl != null && order.paymentProofUrl!.isNotEmpty; @@ -934,11 +941,11 @@ class _C2cOrderDetailPageState extends ConsumerState { const SizedBox(height: 16), if (hasProof) GestureDetector( - onTap: () => _showProofFullScreen(order.paymentProofUrl!), + onTap: () => _showProofFullScreen(_buildProofImageUrl(order.paymentProofUrl!)), child: ClipRRect( borderRadius: BorderRadius.circular(8), child: Image.network( - order.paymentProofUrl!, + _buildProofImageUrl(order.paymentProofUrl!), height: 200, width: double.infinity, fit: BoxFit.cover,