单应用项目,可以创建很多独立工具类页面 ,不用登录 初始化的页面
zhangchen
2025-09-16 c403b0e3fa43b5771565dac51dd07c954cb57ad0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import pinyin from 'pinyin';
 
/**
 * 计算某个类名元素的可用高度(视口高度 - 元素顶部距离)
 * @param className 元素类名(不带.)
 * @returns 可用高度(px),找不到元素则返回 0
 */
export function getAvailableHeightByClass(className: string): number {
  const el = document.querySelector(`.${className}`) as HTMLElement | null
  if (!el) return 0
  const rect = el.getBoundingClientRect()
  return window.innerHeight - rect.top
}
 
/**
 * 将字符串转为数字
 * @param value 
 * @returns 
 */
export function tryConvertToInt(value: string): string | number {
  const num = Number(value);
  // 判断是否是有效数字且是整数(小数部分为 0)
  if (!isNaN(num) && Number.isInteger(num)) {
    return num;
  }
 
  // 判断是否是有效数字且小数部分为 0(例如 "1.0")
  if (!isNaN(num) && Number(value).toString().endsWith('.0')) {
    return parseInt(value, 10);
  }
 
  return value;
}
/**
 * 深拷贝
 * @param obj 
 * @returns 
 */
export function deepClone<T>(obj: T): T {
  if (obj === null || typeof obj !== "object") return obj;
 
  if (Array.isArray(obj)) {
    return obj.map(item => deepClone(item)) as unknown as T;
  }
 
  const result: any = {};
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      result[key] = deepClone(obj[key]);
    }
  }
  return result;
}
 
/**
 * 姓名脱敏:第二个字变成首字母大写
 * @param name 患者姓名
 * @returns 脱敏后的姓名
 */
export function maskName(name: string): string {
  if (!name) return ''
 
  const chars = Array.from(name)
  if (chars.length < 2) return name
 
  const secondChar = chars[1]
  const [pinyinArr] = pinyin(secondChar, { style: pinyin.STYLE_FIRST_LETTER })
  const masked = pinyinArr[0]?.toUpperCase?.() || '*'
 
  chars[1] = masked
  return chars.join('')
}
 
/**
 * 延时函数
 * @param {number} ms - 延时时间,单位毫秒
 */
export function delay(ms: number) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}