Преглед изворни кода

修复本地联调:apiUrl 改回 http,并补字段下划线别名兼容层

- config.js:apiUrl 由 https://localhost:18080 改为 http://localhost:18080
  (Java 后端只有 HTTP,https 直接握手失败,是所有接口不通的首要原因)
- 新增 utils/fieldAlias.js:递归为驼峰字段追加下划线别名(原字段保留),
  request 的 dataFactory 在 status=200 时调用;开关 config.enableFieldAlias
- 背景:Java 后端自 2026-10-17 起统一输出驼峰(goodsName/goodsPriceMin),
  而页面仍按 PHP 版的下划线字段取值(goods_name/goods_price_min),
  不加别名会导致接口 200 但页面全空
- 该兼容层是联调期过渡方案,页面字段整体转驼峰后把开关关掉即可下线
tanlie пре 4 дана
родитељ
комит
deae382e9d
4 измењених фајлова са 68 додато и 3 уклоњено
  1. 10 2
      config.js
  2. 7 1
      core/config/defaultConfig.js
  3. 45 0
      utils/fieldAlias.js
  4. 6 0
      utils/request/index.js

+ 10 - 2
config.js

@@ -7,12 +7,20 @@ export default {
    * 后端api地址 (必填; 斜杠/结尾; 请确保能访问)
    * 例如: https://www.你的域名.com/index.php?s=/api/
    */
-  apiUrl: "https://shop.qinys.cn/index.php?s=/api/",
+  // 本地 Java 后端(HTTP,非 HTTPS;H5 调试用 localhost,真机/微信开发者工具改成局域网 IP)
+  apiUrl: "http://localhost:18080/api/",
 
   /**
    * 是否启用商城设置缓存
    * 将减少用户端重复请求; 正式运营时请设为true, 开启后商城设置同步前端需10分钟缓存
    */
-  enabledSettingCache: true
+  enabledSettingCache: true,
+
+  /**
+   * 联调期字段兼容:Java 后端返回驼峰字段,页面按 PHP 的下划线字段取值,
+   * 开启后接口响应会自动补一份下划线别名(原字段保留)。
+   * 页面字段整体转驼峰后可设为 false。
+   */
+  enableFieldAlias: true
 
 }

+ 7 - 1
core/config/defaultConfig.js

@@ -15,6 +15,12 @@ export default {
    * 是否启用商城设置缓存
    * 将减少用户端重复请求; 正式运营时请设为true, 开启后商城设置同步前端需10分钟缓存
    */
-  enabledSettingCache: true
+  enabledSettingCache: true,
+
+  /**
+   * 联调期字段兼容:Java 后端返回驼峰字段,页面按 PHP 的下划线字段取值,
+   * 开启后接口响应会自动补一份下划线别名(原字段保留)。
+   */
+  enableFieldAlias: true
 
 }

+ 45 - 0
utils/fieldAlias.js

@@ -0,0 +1,45 @@
+/**
+ * 字段别名兼容层(联调期临时方案)
+ *
+ * 背景:Java 后端自 2026-10-17 起统一输出驼峰字段(goodsName / goodsPriceMin),
+ * 而本项目页面代码是按 PHP 版接口写的,引用的是下划线字段(goods_name / goods_price_min)。
+ *
+ * 做法:接口返回后,为每个驼峰字段追加一份下划线别名(原字段保留),
+ * 两种写法都能取到值,页面无需逐个改动。
+ *
+ * 注意:这是过渡手段。后续把页面字段整体转成驼峰后,把 config.js 的
+ * enableFieldAlias 设为 false(或删除本文件引用)即可下线。
+ */
+
+/** goodsName -> goods_name;已是下划线或单词的保持不变 */
+export function toSnakeCase(key) {
+  return key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()
+}
+
+/**
+ * 递归为对象/数组中的驼峰字段添加下划线别名(原地修改,返回值便于链式使用)
+ */
+export function addSnakeAliases(target) {
+  if (Array.isArray(target)) {
+    target.forEach(item => addSnakeAliases(item))
+    return target
+  }
+  if (!target || typeof target !== 'object') {
+    return target
+  }
+  // Object.keys 先取快照,循环内新增别名不影响遍历
+  Object.keys(target).forEach(key => {
+    const value = target[key]
+    addSnakeAliases(value)
+    if (/[A-Z]/.test(key)) {
+      const snakeKey = toSnakeCase(key)
+      // 后端本身就可能同时给出两种写法,已存在时不覆盖
+      if (!(snakeKey in target)) {
+        target[snakeKey] = value
+      }
+    }
+  })
+  return target
+}
+
+export default { toSnakeCase, addSnakeAliases }

+ 6 - 0
utils/request/index.js

@@ -5,9 +5,12 @@ import store from '@/store'
 import { hasOwnProperty, isEmptyObject, filterNull } from '@/utils/util'
 import request from './request'
 import Config from '@/core/config'
+import { addSnakeAliases } from '@/utils/fieldAlias'
 
 // 后端api地址
 const apiUrl = Config.get('apiUrl')
+// 联调期:为驼峰字段补充下划线别名,兼容按 PHP 接口写的页面(详见 utils/fieldAlias.js)
+const enableFieldAlias = Config.get('enableFieldAlias', true)
 
 // 可以new多个request来支持多个域名请求
 const $http = new request({
@@ -135,6 +138,9 @@ $http.dataFactory = async res => {
   // result.status [ 200正常 500有错误 401未登录 403没有权限访问 ]
   if (httpData.status == 200) {
     // 返回正确的结果(then接受数据)
+    if (enableFieldAlias) {
+      addSnakeAliases(httpData)
+    }
     return Promise.resolve(httpData)
   }