index.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { BASE_URL } from "@/config";
  2. /**
  3. * 获取当前页面路径
  4. * @returns 当前页面路径
  5. */
  6. export function getCurrentPath() {
  7. const pages = getCurrentPages();
  8. const currentPage = pages[pages.length - 1];
  9. return currentPage.route || "";
  10. }
  11. /**
  12. * 通用表单赋值方法
  13. * @param form 表单数据对象
  14. * @param data 需要赋值的数据
  15. * @param options 配置选项
  16. */
  17. function assignFormValues<T extends Record<string, any>>(
  18. form: T,
  19. data: Partial<T>,
  20. options?: {
  21. /**
  22. * 是否忽略空值(null, undefined, '')
  23. * @default false
  24. */
  25. ignoreEmpty?: boolean;
  26. /**
  27. * 自定义字段映射
  28. * @example { 'oldKey': 'newKey' }
  29. */
  30. fieldMap?: Record<string, string>;
  31. /**
  32. * 需要特殊处理的字段
  33. */
  34. transform?: Partial<Record<string, (value: any) => any>>;
  35. },
  36. ): void {
  37. const { ignoreEmpty = false, fieldMap = {}, transform = {} } = options || {};
  38. for (const key in data) {
  39. if (Object.prototype.hasOwnProperty.call(data, key)) {
  40. const targetKey = fieldMap[key] || key;
  41. // 检查目标表单是否有这个字段
  42. if (!(targetKey in form)) {
  43. continue;
  44. }
  45. let value = data[key];
  46. // 处理空值
  47. if (
  48. ignoreEmpty &&
  49. (value === null || value === undefined || value === "")
  50. ) {
  51. continue;
  52. }
  53. // 处理特殊转换
  54. if (targetKey in transform) {
  55. value = transform[targetKey]!(value);
  56. } else if (typeof value === "string") {
  57. // 字符串特殊处理
  58. if (
  59. key.includes("Img") ||
  60. key.includes("image") ||
  61. key.includes("photo") ||
  62. key.includes("certificate")
  63. ) {
  64. // 图片字段处理
  65. if (value) {
  66. value = value.split(",").map((url: string) => ({ url }));
  67. } else {
  68. value = [] as unknown as T[keyof T];
  69. }
  70. } else if (key === "selecteddeparts" || key.includes("selected")) {
  71. // 选择字段处理
  72. value = value ? value.split(",") : [];
  73. }
  74. }
  75. // 类数组对象特殊处理
  76. if (
  77. Array.isArray(form[targetKey]) &&
  78. !Array.isArray(value) &&
  79. typeof value === "string"
  80. ) {
  81. try {
  82. const parsed = JSON.parse(value);
  83. if (Array.isArray(parsed)) {
  84. form[targetKey as keyof T] = parsed as T[keyof T];
  85. continue;
  86. }
  87. } catch (e) {
  88. // 解析失败,继续使用原值
  89. }
  90. }
  91. form[targetKey as keyof T] = value as T[keyof T];
  92. }
  93. }
  94. }
  95. export default assignFormValues;
  96. export function getImageURL(url?: string) {
  97. return BASE_URL + "/sys/common/static/" + url;
  98. }
  99. /**
  100. * 判断一个对象的所有字段是否有值(非 null 和 undefined)
  101. * @param obj 要检查的对象
  102. * @returns 所有字段有值返回 true,否则 false
  103. */
  104. function areAllFieldsFilled(obj: Record<string, any>): boolean {
  105. return Object.values(obj).every(
  106. (value) =>
  107. unref(value) !== null &&
  108. unref(value) !== undefined &&
  109. unref(value) !== "",
  110. );
  111. }
  112. /**
  113. * 判断数组中每个对象是否所有字段都有值
  114. * @param arr 要检查的对象数组
  115. * @returns 所有对象字段都有值返回 true,否则 false
  116. */
  117. export function areAllItemsAllFieldsFilled(
  118. arr: Array<Record<string, any>>,
  119. ): boolean {
  120. // return arr.every((item) => areAllFieldsFilled(item));
  121. //修复新增的时候id校验
  122. return arr.every((item) => {
  123. const { coursesId, id, ...rest } = item;
  124. return areAllFieldsFilled(rest);
  125. });
  126. }