diff --git a/backend/app/api/controller/v1/order/CenterOrderController.php b/backend/app/api/controller/v1/order/CenterOrderController.php
index c3f615524..65712a6cd 100644
--- a/backend/app/api/controller/v1/order/CenterOrderController.php
+++ b/backend/app/api/controller/v1/order/CenterOrderController.php
@@ -1365,15 +1365,19 @@ class CenterOrderController
$detailExtend = $handler->getDetailExtend($productId);
$productCustomForm = $detailExtend['custom_form'] ?? [];
$fieldTitleMap = [];
+ $fieldTypeMap = [];
// 循环变量不得使用 $key:外层 $key 是订单确认缓存凭证,覆盖后 consumeOrderCache 会因类型错误崩溃
foreach ($productCustomForm as $fieldKey => $fieldItem) {
$fieldTitleMap['custom_field_' . $fieldKey] = $fieldItem['title'] ?? ('自定义字段' . ($fieldKey + 1));
+ // 记录字段类型(管理端类型值 text/number/data/time/img 等),订单回显按类型渲染(图片字段展示缩略图)
+ $fieldTypeMap['custom_field_' . $fieldKey] = $fieldItem['label'] ?? '';
}
$structured = [];
foreach ($submittedCustomForm as $field => $value) {
$structured[] = [
'label' => $field,
'title' => $fieldTitleMap[$field] ?? $field,
+ 'type' => $fieldTypeMap[$field] ?? '',
'value' => $value,
];
}
diff --git a/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue b/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue
index 9d738dd5b..f48b61144 100644
--- a/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue
+++ b/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue
@@ -211,13 +211,13 @@
表单信息
- -
-
+
-
+
{{ item.title }}:{{ item.value }}
{{ item.title }}:
-
+
@@ -288,6 +288,28 @@ function buildAddress(addr) {
if (addr.postal_code) parts.push(`(${addr.postal_code})`);
return parts.join('');
}
+
+// 图片扩展名判断
+const IMAGE_EXT_RE = /\.(jpe?g|png|gif|webp|bmp)(\?.*)?$/i;
+
+/** 自定义表单字段值规范化为图片 URL 数组(兼容字符串单图 / 数组多图) */
+function formImageUrls(item) {
+ if (!item || !item.value) return [];
+ const list = Array.isArray(item.value) ? item.value : [item.value];
+ return list.filter((v) => typeof v === 'string' && v.indexOf('http') === 0);
+}
+
+/**
+ * 图片字段判断:新订单 type=img,或存量订单无类型但值是图片链接
+ * (新数据 label 是 custom_field_N,不能再按 label == 'img' 判断)
+ */
+function isImageItem(item) {
+ if (!item) return false;
+ if (item.type === 'img') return true;
+ if (item.type) return false;
+ const urls = formImageUrls(item);
+ return urls.length > 0 && urls.every((v) => IMAGE_EXT_RE.test(v) || v.indexOf('/uploads/') !== -1);
+}
diff --git a/frontend/uni-app/src/pages/goods/order_details/index.vue b/frontend/uni-app/src/pages/goods/order_details/index.vue
index 722b57afa..0f9de314b 100644
--- a/frontend/uni-app/src/pages/goods/order_details/index.vue
+++ b/frontend/uni-app/src/pages/goods/order_details/index.vue
@@ -338,14 +338,17 @@
-
+
+
{{ item.title }}:
-
-
+
+
- {{ item.title }}:
- {{ item.value }}
+
+ {{ item.title }}:
+ {{ item.value }}
+
{{ $t(`复制`) }}
@@ -607,6 +610,30 @@ const { isLogin } = storeToRefs(appStore);
// ---------- data ----------
const imgHost = HTTP_REQUEST_URL;
const customForm = ref(''); //自定义留言
+
+/**
+ * 自定义表单图片字段判断:新格式 type=img,或存量订单无类型但值是图片链接
+ * (旧数据 label 存类型值,新数据 label 是 custom_field_N,不能再用 label 判断)
+ */
+const IMAGE_EXT_RE = /\.(jpe?g|png|gif|webp|bmp)(\?.*)?$/i;
+function formImageUrls(item) {
+ if (!item || !item.value) return [];
+ const list = Array.isArray(item.value) ? item.value : [item.value];
+ return list.filter((v) => typeof v === 'string' && v.indexOf('http') === 0);
+}
+function isImageFormItem(item) {
+ if (!item) return false;
+ if (item.type === 'img') return true;
+ if (item.type) return false;
+ const urls = formImageUrls(item);
+ return urls.length > 0 && urls.every((v) => IMAGE_EXT_RE.test(v) || v.indexOf('/uploads/') !== -1);
+}
+function previewFormImages(item, index) {
+ const urls = formImageUrls(item);
+ if (!urls.length) return;
+ uni.previewImage({ urls, current: index });
+}
+
//二维码参数
const codeShow = ref(false);
const cid = ref('1');