fieldAlias.js 1.6 KB

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