ly-utils-lib 2.8.2 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules/date/index.ts","../src/modules/array/index.ts","../src/modules/string/index.ts","../src/modules/object/index.ts","../src/modules/excel/index.ts","../src/modules/pdf/index.ts","../src/modules/map/index.ts","../src/modules/storage/index.ts","../src/modules/utils/index.ts","../src/modules/crypto/index.ts","../src/modules/websocket/index.ts","../src/modules/event/index.ts"],"names":["dayjs","relativeTime","utc","timezone","durationPlugin","isBetweenPlugin","isSameOrBeforePlugin","isSameOrAfterPlugin","weekOfYear","weekYear","quarterOfYear","isLeapYearPlugin","dayOfYear","minMax","weekday","startDate","endDate","format","diffDays","diff","chunk","compact","difference","flatten","flattenDeep","groupBy","head","intersection","isEqual","last","omit","sample","sortBy","sum","uniq","uniqBy","size","map","camelCase","capitalize","isEmpty","kebabCase","lowerFirst","snakeCase","startCase","trim","upperFirst","cloneDeep","filter","invert","isEmptyObject","merge","pick","keys","values","XLSX","html2canvas","jsPDF","defaultControls","ScaleLine","FullScreen","OlMap","View","fromLonLat","TileLayer","XYZ","VectorSource","GeoJSON","VectorLayer","Feature","Point","Style","Icon","Circle","Fill","Stroke","transform","style","Overlay","Draw","Snap","Modify","Select","toLonLat","extent","boundingExtent","OSM","LineString","Polygon","Cookies","clone","debounce","deepMerge","get","isArray","isBoolean","isFunction","isNumber","isObject","isString","max","min","set","throttle","CryptoJS","uuid","mode","WebSocketState","mitt"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 日期时间工具模块\n * 基于 dayjs 封装,提供常用的日期处理功能\n */\n\nimport dayjs, { type Dayjs } from 'dayjs'\nimport durationPlugin from 'dayjs/plugin/duration'\nimport isBetweenPlugin from 'dayjs/plugin/isBetween'\nimport isSameOrAfterPlugin from 'dayjs/plugin/isSameOrAfter'\nimport isSameOrBeforePlugin from 'dayjs/plugin/isSameOrBefore'\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport timezone from 'dayjs/plugin/timezone'\nimport utc from 'dayjs/plugin/utc'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport weekYear from 'dayjs/plugin/weekYear'\nimport isLeapYearPlugin from 'dayjs/plugin/isLeapYear'\nimport dayOfYear from 'dayjs/plugin/dayOfYear'\nimport minMax from 'dayjs/plugin/minMax'\nimport weekday from 'dayjs/plugin/weekday'\nimport 'dayjs/locale/zh-cn'\n\n// 扩展 dayjs 插件\ndayjs.extend(relativeTime)\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(durationPlugin)\ndayjs.extend(isBetweenPlugin)\ndayjs.extend(isSameOrBeforePlugin)\ndayjs.extend(isSameOrAfterPlugin)\ndayjs.extend(weekOfYear)\ndayjs.extend(weekYear)\ndayjs.extend(quarterOfYear)\ndayjs.extend(isLeapYearPlugin)\ndayjs.extend(dayOfYear)\ndayjs.extend(minMax)\ndayjs.extend(weekday)\n\n// 设置默认语言\ndayjs.locale('zh-cn')\n\nexport type { Dayjs }\n\n/**\n * 时间单位类型\n */\nexport type TimeUnit = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond'\n\n/**\n * 日期格式类型\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYY/MM/DD'\n | 'YYYY/MM/DD HH:mm:ss'\n | 'MM/DD/YYYY'\n | 'DD/MM/YYYY'\n | 'HH:mm:ss'\n | 'HH:mm'\n | 'YYYY-MM-DDTHH:mm:ss'\n | 'YYYY年MM月DD日'\n | 'YYYY年MM月DD日 HH:mm:ss'\n\n/**\n * 获取当前时间\n */\nexport const now = (): Dayjs => dayjs()\n\n/**\n * 格式化日期\n * @param date 日期\n * @param format 格式\n */\nexport const format = (\n date: string | number | Date | Dayjs,\n formatStr = 'YYYY-MM-DD HH:mm:ss'\n): string => {\n return dayjs(date).format(formatStr)\n}\n\n/**\n * 获取日期的年月日\n * @param date 日期\n */\nexport const getDate = (date: string | number | Date | Dayjs = new Date()): string => {\n return dayjs(date).format('YYYY-MM-DD')\n}\n\n/**\n * 获取时间\n * @param date 日期\n */\nexport const getTime = (date: string | number | Date | Dayjs = new Date()): string => {\n return dayjs(date).format('HH:mm:ss')\n}\n\n/**\n * 获取时间戳\n * @param date 日期\n */\nexport const getTimestamp = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).valueOf()\n}\n\n/**\n * 日期加减\n * @param date 日期\n * @param amount 数量\n * @param unit 单位\n */\nexport const add = (\n date: string | number | Date | Dayjs,\n amount: number,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): Dayjs => {\n return dayjs(date).add(amount, unit)\n}\n\n/**\n * 日期减法\n * @param date 日期\n * @param amount 数量\n * @param unit 单位\n */\nexport const subtract = (\n date: string | number | Date | Dayjs,\n amount: number,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): Dayjs => {\n return dayjs(date).subtract(amount, unit)\n}\n\n/**\n * 获取日期的开始时间(当天的 00:00:00)\n * @param date 日期\n */\nexport const startOf = (\n date: string | number | Date | Dayjs,\n unit: 'day' | 'month' | 'year' = 'day'\n): Dayjs => {\n return dayjs(date).startOf(unit)\n}\n\n/**\n * 获取日期的结束时间(当天的 23:59:59)\n * @param date 日期\n */\nexport const endOf = (\n date: string | number | Date | Dayjs,\n unit: 'day' | 'month' | 'year' = 'day'\n): Dayjs => {\n return dayjs(date).endOf(unit)\n}\n\n/**\n * 计算两个日期之间的天数差\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const diffDays = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n return dayjs(date1).diff(dayjs(date2), 'day')\n}\n\n/**\n * 计算两个日期之间的小时差\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const diffHours = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n return dayjs(date1).diff(dayjs(date2), 'hour')\n}\n\n/**\n * 判断是否是今天\n * @param date 日期\n */\nexport const isToday = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'day')\n}\n\n/**\n * 判断是否是昨天\n * @param date 日期\n */\nexport const isYesterday = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs().subtract(1, 'day'), 'day')\n}\n\n/**\n * 判断是否是明天\n * @param date 日期\n */\nexport const isTomorrow = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs().add(1, 'day'), 'day')\n}\n\n/**\n * 判断是否在两个日期之间\n * @param date 日期\n * @param startDate 开始日期\n * @param endDate 结束日期\n */\nexport const isBetween = (\n date: string | number | Date | Dayjs,\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date).isBetween(startDate, endDate, null, '[]')\n}\n\n/**\n * 获取相对时间\n * @param date 日期\n */\nexport const fromNow = (date: string | number | Date | Dayjs): string => {\n return dayjs(date).fromNow()\n}\n\n/**\n * 获取周数\n * @param date 日期\n */\nexport const getWeek = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).week()\n}\n\n/**\n * 计算日期(前移或后移)\n * @param compute 计算方式 'after' | 'before'\n * @param date 日期\n * @param type 计算类型 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param num 计算数量\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const computeDate = (\n compute: 'after' | 'before',\n date: string | number | Date | Dayjs = new Date(),\n type: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond' = 'day',\n num: number = 1,\n format: string = 'YYYY-MM-DD'\n): string => {\n const d = dayjs(date)\n if (compute === 'after') {\n return d.add(num, type as any).format(format)\n }\n if (compute === 'before') {\n return d.subtract(num, type as any).format(format)\n }\n return d.format(format)\n}\n\n/**\n * 获取当前时间单位的开始时间\n * @param type 类型 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const startDate = (\n type: 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond' = 'month',\n format: string = 'YYYY-MM-DD'\n): string => {\n return dayjs().startOf(type as any).format(format)\n}\n\n/**\n * 获取当前时间单位的结束时间\n * @param type 类型 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const endDate = (\n type: 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond' = 'month',\n format: string = 'YYYY-MM-DD'\n): string => {\n return dayjs().endOf(type as any).format(format)\n}\n\n/**\n * 时间戳格式化\n * @param timestamp 时间戳(秒级)\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const formatTimestamp = (\n timestamp: number = 0,\n format: string = 'YYYY-MM-DD HH:mm:ss'\n): string => {\n const ts = timestamp === 0 ? getTimestamp() / 1000 : timestamp\n return dayjs.unix(ts).format(format)\n}\n\n/**\n * 获取两个日期之间的差异(通用版本)\n * @param type 类型 'week' | 'day' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param startDate 起始时间\n * @param endDate 结束时间\n * @returns 差异值\n */\nexport const diff = (\n type: 'week' | 'day' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond',\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs = new Date()\n): number => {\n return dayjs(endDate).diff(dayjs(startDate), type)\n}\n\n/**\n * 获取日期范围内的所有日期\n * @param startDate 起始时间\n * @param endDate 结束时间\n * @param format 格式模板\n * @returns 日期集合(包含日期和时间戳)\n */\nexport const getRangeDate = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs,\n format: string = 'YYYY-MM-DD'\n): Array<{ day: string; timestamp: number }> => {\n const diffDays = diff('day', startDate, endDate)\n const range: Array<{ day: string; timestamp: number }> = []\n\n for (let i = 0; i <= diffDays; i++) {\n const day = computeDate('after', startDate, 'day', i, format)\n range.push({\n day,\n timestamp: getTimestamp(day) / 1000\n })\n }\n\n return range\n}\n\n/**\n * 获取相对时间(中文描述)\n * @param date 日期\n * @returns 相对时间描述\n */\nexport const getRelativeTime = (date: string | number | Date | Dayjs): string => {\n const diffMinutes = diff('minute', date)\n\n if (diffMinutes < 1) {\n return '刚刚'\n }\n if (diffMinutes < 60) {\n return `${diffMinutes}分钟前`\n }\n if (diffMinutes < 1440) {\n return `${Math.floor(diffMinutes / 60)}小时前`\n }\n if (diffMinutes < 43200) {\n return `${Math.floor(diffMinutes / 1440)}天前`\n }\n\n return format(date, 'YYYY-MM-DD')\n}\n\n/**\n * 判断日期是否有效\n * @param date 日期\n * @returns 是否有效\n */\nexport const isValid = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isValid()\n}\n\n/**\n * 获取月份的第一天\n * @param date 日期\n * @returns 日期\n */\nexport const getFirstDayOfMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).date() - dayjs(date).startOf('month').date() + 1\n}\n\n/**\n * 获取月份的最后一天\n * @param date 日期\n * @returns 日期\n */\nexport const getLastDayOfMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).endOf('month').date()\n}\n\n/**\n * 获取季度\n * @param date 日期\n */\nexport const getQuarter = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).quarter()\n}\n\n/**\n * 获取某月有多少天\n * @param date 日期\n */\nexport const getDaysInMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).daysInMonth()\n}\n\n/**\n * 获取当前月份的开始日期和结束日期\n * @param date 日期\n */\nexport const getMonthRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n return [d.startOf('month').format('YYYY-MM-DD'), d.endOf('month').format('YYYY-MM-DD')]\n}\n\n/**\n * 获取当前季度的开始日期和结束日期\n * @param date 日期\n */\nexport const getQuarterRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n const quarter = d.quarter()\n const start = d\n .month((quarter - 1) * 3)\n .startOf('month')\n .format('YYYY-MM-DD')\n const end = d\n .month(quarter * 3 - 1)\n .endOf('month')\n .format('YYYY-MM-DD')\n return [start, end]\n}\n\n/**\n * 获取当前年份的开始日期和结束日期\n * @param date 日期\n */\nexport const getYearRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n return [d.startOf('year').format('YYYY-MM-DD'), d.endOf('year').format('YYYY-MM-DD')]\n}\n\n/**\n * 获取本周的开始日期和结束日期\n * @param date 日期\n * @param startDay 一周的开始日,默认为周日(0)\n */\nexport const getWeekRange = (\n date: string | number | Date | Dayjs = new Date(),\n startDay = 0\n): [string, string] => {\n const d = dayjs(date)\n const day = d.day()\n const diff = day < startDay ? 7 - startDay + day : day - startDay\n const start = d.subtract(diff, 'day').format('YYYY-MM-DD')\n const end = d.subtract(diff, 'day').add(6, 'day').format('YYYY-MM-DD')\n return [start, end]\n}\n\n/**\n * 判断是否是闰年\n * @param year 年份\n */\nexport const isLeapYear = (year: number): boolean => {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0\n}\n\n/**\n * 导出 dayjs 原始方法,方便高级用法\n */\nexport { dayjs }\n\n\n/**\n * 获取年份\n * @param date 日期\n */\nexport const getYear = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).year()\n}\n\n/**\n * 获取月份(1-12)\n * @param date 日期\n */\nexport const getMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).month() + 1\n}\n\n/**\n * 获取日期(1-31)\n * @param date 日期\n */\nexport const getDay = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).date()\n}\n\n/**\n * 获取小时(0-23)\n * @param date 日期\n */\nexport const getHour = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).hour()\n}\n\n/**\n * 获取分钟(0-59)\n * @param date 日期\n */\nexport const getMinute = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).minute()\n}\n\n/**\n * 获取秒数(0-59)\n * @param date 日期\n */\nexport const getSecond = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).second()\n}\n\n/**\n * 获取星期几(0-6,0为周日)\n * @param date 日期\n */\nexport const getWeekday = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).day()\n}\n\n/**\n * 获取星期几的中文名称\n * @param date 日期\n */\nexport const getWeekdayName = (date: string | number | Date | Dayjs = new Date()): string => {\n const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']\n return weekdays[dayjs(date).day()]\n}\n\n/**\n * 获取一年中的第几天\n * @param date 日期\n */\nexport const getDayOfYear = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).dayOfYear()\n}\n\n/**\n * 获取本周第一天(周一)\n * @param date 日期\n */\nexport const getFirstDayOfWeek = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).weekday(0)\n}\n\n/**\n * 获取本周最后一天(周日)\n * @param date 日期\n */\nexport const getLastDayOfWeek = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).weekday(6)\n}\n\n/**\n * 获取本月第一天(Dayjs 对象)\n * @param date 日期\n */\nexport const getFirstDayOfMonthDate = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).startOf('month')\n}\n\n/**\n * 获取本月最后一天(Dayjs 对象)\n * @param date 日期\n */\nexport const getLastDayOfMonthDate = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).endOf('month')\n}\n\n/**\n * 获取本年第一天\n * @param date 日期\n */\nexport const getFirstDayOfYear = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).startOf('year')\n}\n\n/**\n * 获取本年最后一天\n * @param date 日期\n */\nexport const getLastDayOfYear = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).endOf('year')\n}\n\n/**\n * 判断日期是否相同\n * @param date1 日期1\n * @param date2 日期2\n * @param unit 单位\n */\nexport const isSame = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): boolean => {\n return dayjs(date1).isSame(date2, unit)\n}\n\n/**\n * 比较两个日期\n * @param date1 日期1\n * @param date2 日期2\n * @returns 1(date1 > date2)、-1(date1 < date2)、0(date1 = date2)\n */\nexport const compare = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n const d1 = dayjs(date1).valueOf()\n const d2 = dayjs(date2).valueOf()\n if (d1 > d2) return 1\n if (d1 < d2) return -1\n return 0\n}\n\n/**\n * 判断日期是否相同或在之前\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameOrBefore = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSameOrBefore(date2)\n}\n\n/**\n * 判断日期是否相同或在之后\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameOrAfter = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSameOrAfter(date2)\n}\n\n/**\n * 判断日期1是否在日期2之前\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isBefore = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isBefore(date2)\n}\n\n/**\n * 判断日期1是否在日期2之后\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isAfter = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isAfter(date2)\n}\n\n/**\n * 计算年龄\n * @param birthday 生日\n */\nexport const getAge = (birthday: string | number | Date | Dayjs): number => {\n return dayjs().diff(birthday, 'year')\n}\n\n/**\n * 判断是否是工作日(周一到周五)\n * @param date 日期\n */\nexport const isWorkday = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const day = dayjs(date).day()\n return day !== 0 && day !== 6 // 0 是周日,6 是周六\n}\n\n/**\n * 判断是否是周末(周六或周日)\n * @param date 日期\n */\nexport const isWeekend = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const day = dayjs(date).day()\n return day === 0 || day === 6\n}\n\n/**\n * 判断时间段(上午/下午/晚上/深夜)\n * @param date 日期\n */\nexport const getTimeOfDay = (\n date: string | number | Date | Dayjs = new Date()\n): 'morning' | 'noon' | 'afternoon' | 'evening' | 'night' => {\n const hour = dayjs(date).hour()\n if (hour >= 5 && hour < 9) return 'morning'\n if (hour >= 9 && hour < 12) return 'noon'\n if (hour >= 12 && hour < 18) return 'afternoon'\n if (hour >= 18 && hour < 22) return 'evening'\n return 'night'\n}\n\n/**\n * 获取时间段的中文名称\n * @param date 日期\n */\nexport const getTimeOfDayName = (\n date: string | number | Date | Dayjs = new Date()\n): string => {\n const timeOfDay = getTimeOfDay(date)\n const names = {\n morning: '清晨',\n noon: '上午',\n afternoon: '下午',\n evening: '晚上',\n night: '深夜'\n }\n return names[timeOfDay]\n}\n\n/**\n * 计算两个日期之间的工作日天数\n * @param startDate 开始日期\n * @param endDate 结束日期\n */\nexport const getWorkdaysBetween = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs\n): number => {\n let count = 0\n const start = dayjs(startDate)\n const end = dayjs(endDate)\n const days = Math.abs(start.diff(end, 'day'))\n\n for (let i = 0; i <= days; i++) {\n const current = start.add(i, 'day')\n if (isWorkday(current)) {\n count++\n }\n }\n\n return count\n}\n\n/**\n * 生成日期范围数组\n * @param startDate 开始日期\n * @param endDate 结束日期\n * @param unit 单位(默认为天)\n */\nexport const getDateRange = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs,\n unit: TimeUnit = 'day'\n): Dayjs[] => {\n const start = dayjs(startDate)\n const end = dayjs(endDate)\n const dates: Dayjs[] = []\n const diff = end.diff(start, unit)\n\n for (let i = 0; i <= diff; i++) {\n dates.push(start.add(i, unit))\n }\n\n return dates\n}\n\n/**\n * 获取最近N天的日期数组\n * @param days 天数\n */\nexport const getRecentDays = (days: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < days; i++) {\n dates.push(dayjs().subtract(i, 'day'))\n }\n return dates.reverse()\n}\n\n/**\n * 获取最近N个月的日期数组\n * @param months 月数\n */\nexport const getRecentMonths = (months: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < months; i++) {\n dates.push(dayjs().subtract(i, 'month'))\n }\n return dates.reverse()\n}\n\n/**\n * 获取最近N周的日期数组\n * @param weeks 周数\n */\nexport const getRecentWeeks = (weeks: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < weeks; i++) {\n dates.push(dayjs().subtract(i, 'week'))\n }\n return dates.reverse()\n}\n\n/**\n * 转换为 UTC 时间\n * @param date 日期\n */\nexport const toUTC = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs(date).utc()\n}\n\n/**\n * 从 UTC 转换为本地时间\n * @param date 日期\n */\nexport const fromUTC = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs.utc(date).local()\n}\n\n/**\n * 转换为指定时区的时间\n * @param date 日期\n * @param timezone 时区(如 'Asia/Shanghai')\n */\nexport const toTimezone = (\n date: string | number | Date | Dayjs,\n timezone: string\n): Dayjs => {\n return dayjs(date).tz(timezone)\n}\n\n/**\n * 获取时区偏移量(分钟)\n * @param date 日期\n */\nexport const getTimezoneOffset = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).utcOffset()\n}\n\n/**\n * 格式化持续时间\n * @param milliseconds 毫秒数\n */\nexport const formatDuration = (milliseconds: number): string => {\n const d = dayjs.duration(milliseconds)\n const hours = Math.floor(d.asHours())\n const minutes = d.minutes()\n const seconds = d.seconds()\n\n if (hours > 0) {\n return `${hours}小时${minutes}分${seconds}秒`\n }\n if (minutes > 0) {\n return `${minutes}分${seconds}秒`\n }\n return `${seconds}秒`\n}\n\n/**\n * 获取最小日期\n * @param dates 日期数组\n */\nexport const minDate = (dates: Array<string | number | Date | Dayjs>): Dayjs => {\n return dayjs.min(dates.map((d) => dayjs(d)))!\n}\n\n/**\n * 获取最大日期\n * @param dates 日期数组\n */\nexport const maxDate = (dates: Array<string | number | Date | Dayjs>): Dayjs => {\n return dayjs.max(dates.map((d) => dayjs(d)))!\n}\n\n/**\n * 判断是否是本月\n * @param date 日期\n */\nexport const isThisMonth = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'month')\n}\n\n/**\n * 判断是否是本年\n * @param date 日期\n */\nexport const isThisYear = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'year')\n}\n\n/**\n * 判断是否是本周\n * @param date 日期\n */\nexport const isThisWeek = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'week')\n}\n\n/**\n * 判断是否是同月\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameMonth = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSame(date2, 'month')\n}\n\n/**\n * 判断是否是同一年\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameYear = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSame(date2, 'year')\n}\n\n/**\n * 获取农历年份(简化版,仅供参考)\n * @param date 日期\n */\nexport const getChineseYear = (date: string | number | Date | Dayjs = new Date()): string => {\n const animals = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']\n const baseYear = 1900\n const year = dayjs(date).year()\n const index = (year - baseYear) % 12\n return animals[index >= 0 ? index : index + 12] + '年'\n}\n\n/**\n * 获取星座\n * @param date 日期\n */\nexport const getZodiacSign = (date: string | number | Date | Dayjs = new Date()): string => {\n const month = dayjs(date).month() + 1\n const day = dayjs(date).date()\n\n if ((month === 3 && day >= 21) || (month === 4 && day <= 19)) return '白羊座'\n if ((month === 4 && day >= 20) || (month === 5 && day <= 20)) return '金牛座'\n if ((month === 5 && day >= 21) || (month === 6 && day <= 20)) return '双子座'\n if ((month === 6 && day >= 21) || (month === 7 && day <= 22)) return '巨蟹座'\n if ((month === 7 && day >= 23) || (month === 8 && day <= 22)) return '狮子座'\n if ((month === 8 && day >= 23) || (month === 9 && day <= 22)) return '处女座'\n if ((month === 9 && day >= 23) || (month === 10 && day <= 22)) return '天秤座'\n if ((month === 10 && day >= 23) || (month === 11 && day <= 21)) return '天蝎座'\n if ((month === 11 && day >= 22) || (month === 12 && day <= 21)) return '射手座'\n if ((month === 12 && day >= 22) || (month === 1 && day <= 19)) return '摩羯座'\n if ((month === 1 && day >= 20) || (month === 2 && day <= 18)) return '水瓶座'\n return '双鱼座'\n}\n\n/**\n * 判断是否是节日(简化版,仅支持主要节日)\n * @param date 日期\n */\nexport const isHoliday = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const holidays: { [key: string]: string } = {\n '0101': '元旦',\n '0214': '情人节',\n '0308': '妇女节',\n '0401': '愚人节',\n '0501': '劳动节',\n '0504': '青年节',\n '0601': '儿童节',\n '0701': '建党节',\n '0801': '建军节',\n '0910': '教师节',\n '1001': '国庆节',\n '1224': '平安夜',\n '1225': '圣诞节'\n }\n\n const month = dayjs(date).format('MM')\n const day = dayjs(date).format('DD')\n const key = `${month}${day}`\n\n return holidays[key] !== undefined\n}\n\n/**\n * 获取节日名称(简化版)\n * @param date 日期\n */\nexport const getHolidayName = (date: string | number | Date | Dayjs = new Date()): string | null => {\n const holidays: { [key: string]: string } = {\n '0101': '元旦',\n '0214': '情人节',\n '0308': '妇女节',\n '0401': '愚人节',\n '0501': '劳动节',\n '0504': '青年节',\n '0601': '儿童节',\n '0701': '建党节',\n '0801': '建军节',\n '0910': '教师节',\n '1001': '国庆节',\n '1224': '平安夜',\n '1225': '圣诞节'\n }\n\n const month = dayjs(date).format('MM')\n const day = dayjs(date).format('DD')\n const key = `${month}${day}`\n\n return holidays[key] || null\n}\n\n/**\n * 解析字符串为日期\n * @param dateString 日期字符串\n * @param formatStr 格式\n */\nexport const parse = (dateString: string, formatStr?: string): Dayjs => {\n return formatStr ? dayjs(dateString, formatStr) : dayjs(dateString)\n}\n\n/**\n * 格式化为相对时间(未来)\n * @param date 日期\n */\nexport const toNow = (date: string | number | Date | Dayjs): string => {\n return dayjs(date).toNow()\n}\n\n/**\n * 克隆日期\n * @param date 日期\n */\nexport const clone = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs(date).clone()\n}\n\n/**\n * 获取 Unix 时间戳(秒)\n * @param date 日期\n */\nexport const unix = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).unix()\n}\n\n/**\n * 从 Unix 时间戳创建日期\n * @param timestamp Unix 时间戳(秒)\n */\nexport const fromUnix = (timestamp: number): Dayjs => {\n return dayjs.unix(timestamp)\n}\n\n/**\n * 获取毫秒时间戳\n * @param date 日期\n */\nexport const valueOf = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).valueOf()\n}\n\n// 默认导出\nexport default dayjs\n","/**\n * 数组工具模块\n * 基于 es-toolkit 封装,提供常用的数组处理功能\n */\n\nimport {\n chunk,\n compact,\n difference,\n intersection,\n uniq,\n uniqBy,\n groupBy,\n sortBy,\n sample,\n sum,\n flatten,\n flattenDeep,\n head,\n last,\n isEqual,\n omit,\n} from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport {\n chunk,\n compact,\n difference,\n intersection,\n uniq,\n uniqBy,\n groupBy,\n sortBy,\n sample,\n sum,\n flatten,\n flattenDeep,\n head,\n last,\n isEqual,\n omit,\n}\n\n/**\n * 数组去重(支持对象数组的去重)\n * @param arr 数组\n * @param key 对象数组的去重键值\n */\nexport const unique = <T>(arr: T[], key?: keyof T): T[] => {\n if (key) {\n return uniqBy(arr, item => item[key] as any)\n }\n return uniq(arr)\n}\n\n/**\n * 获取数组最小值\n * @param arr 数组\n */\nexport const min = (arr: number[]): number | undefined => {\n if (arr.length === 0) return undefined\n return Math.min(...arr)\n}\n\n/**\n * 获取数组最大值\n * @param arr 数组\n */\nexport const max = (arr: number[]): number | undefined => {\n if (arr.length === 0) return undefined\n return Math.max(...arr)\n}\n\n/**\n * 判断数组是否为空\n * @param arr 数组\n */\nexport const isEmpty = <T>(arr: T[]): boolean => {\n return arr.length === 0\n}\n\n/**\n * 数组分割\n * @param arr 数组\n * @param size 每组大小\n */\nexport const split = <T>(arr: T[], size: number): T[][] => {\n const result: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size))\n }\n return result\n}\n\n/**\n * 数组乱序\n * @param arr 数组\n */\nexport const shuffle = <T>(arr: T[]): T[] => {\n const result = [...arr]\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[result[i], result[j]] = [result[j], result[i]]\n }\n return result\n}\n\n/**\n * 查找元素的索引\n * @param arr 数组\n * @param predicate 查找条件\n */\nexport const findIndex = <T>(arr: T[], predicate: (item: T, index: number) => boolean): number => {\n return arr.findIndex(predicate)\n}\n\n/**\n * 查找元素\n * @param arr 数组\n * @param predicate 查找条件\n */\nexport const find = <T>(\n arr: T[],\n predicate: (item: T, index: number) => boolean\n): T | undefined => {\n return arr.find(predicate)\n}\n\n/**\n * 过滤数组\n * @param arr 数组\n * @param predicate 过滤条件\n */\nexport const filter = <T>(arr: T[], predicate: (item: T, index: number) => boolean): T[] => {\n return arr.filter(predicate)\n}\n\n/**\n * 映射数组\n * @param arr 数组\n * @param mapper 映射函数\n */\nexport const map = <T, R>(arr: T[], mapper: (item: T, index: number) => R): R[] => {\n return arr.map(mapper)\n}\n\n/**\n * 数组求和\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const reduceSum = <T>(arr: T[], mapper?: (item: T) => number): number => {\n if (mapper) {\n return arr.reduce((acc, item) => acc + mapper(item), 0)\n }\n return (arr as number[]).reduce((acc, item) => acc + item, 0)\n}\n\n/**\n * 数组求平均值\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const average = <T>(arr: T[], mapper?: (item: T) => number): number => {\n if (arr.length === 0) return 0\n if (mapper) {\n const sum = arr.reduce((acc, item) => acc + mapper(item), 0)\n return sum / arr.length\n }\n return (arr as number[]).reduce((acc, item) => acc + item, 0) / arr.length\n}\n\n/**\n * 数组最大值\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const maxValue = <T>(arr: T[], mapper?: (item: T) => number): number | undefined => {\n if (arr.length === 0) return undefined\n if (mapper) {\n return Math.max(...arr.map(mapper))\n }\n return Math.max(...(arr as number[]))\n}\n\n/**\n * 数组最小值\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const minValue = <T>(arr: T[], mapper?: (item: T) => number): number | undefined => {\n if (arr.length === 0) return undefined\n if (mapper) {\n return Math.min(...arr.map(mapper))\n }\n return Math.min(...(arr as number[]))\n}\n\n/**\n * 判断数组是否包含某个元素\n * @param arr 数组\n * @param value 值\n */\nexport const includes = <T>(arr: T[], value: T): boolean => {\n return arr.includes(value)\n}\n\n/**\n * 数组删除元素\n * @param arr 数组\n * @param value 值\n */\nexport const remove = <T>(arr: T[], value: T): T[] => {\n return arr.filter(item => item !== value)\n}\n\n/**\n * 数组删除指定索引元素\n * @param arr 数组\n * @param index 索引\n */\nexport const removeAt = <T>(arr: T[], index: number): T[] => {\n return arr.filter((_, i) => i !== index)\n}\n\n/**\n * 数组插入元素\n * @param arr 数组\n * @param index 索引\n * @param value 值\n */\nexport const insert = <T>(arr: T[], index: number, value: T): T[] => {\n return [...arr.slice(0, index), value, ...arr.slice(index)]\n}\n\n/**\n * 数组移动元素\n * @param arr 数组\n * @param from 源索引\n * @param to 目标索引\n */\nexport const move = <T>(arr: T[], from: number, to: number): T[] => {\n const result = [...arr]\n const [removed] = result.splice(from, 1)\n result.splice(to, 0, removed)\n return result\n}\n\n/**\n * 数组转树形结构\n * @param arr 数组\n * @param options 配置\n */\nexport const arrayToTree = <T extends Record<string, any>>(\n arr: T[],\n options: {\n idKey?: string\n parentIdKey?: string\n childrenKey?: string\n } = {}\n): T[] => {\n const { idKey = 'id', parentIdKey = 'parentId', childrenKey = 'children' } = options\n\n const map = new Map<any, T>()\n const roots: T[] = []\n\n // 创建映射\n arr.forEach(item => {\n map.set(item[idKey], { ...item, [childrenKey]: [] })\n })\n\n // 构建树\n map.forEach(item => {\n const parentId = item[parentIdKey]\n if (parentId && map.has(parentId)) {\n const parent = map.get(parentId)\n if (parent) {\n ;(parent[childrenKey] as T[]).push(item)\n }\n } else {\n roots.push(item)\n }\n })\n\n return roots\n}\n\n/**\n * 树形结构转数组\n * @param tree 树\n * @param childrenKey 子节点键名\n */\nexport const treeToArray = <T extends Record<string, any>>(\n tree: T[],\n childrenKey = 'children'\n): T[] => {\n const result: T[] = []\n\n const traverse = (nodes: T[]) => {\n nodes.forEach(node => {\n result.push(node)\n if (node[childrenKey] && node[childrenKey].length > 0) {\n traverse(node[childrenKey])\n }\n })\n }\n\n traverse(tree)\n return result\n}\n\n/**\n * 数组分页\n * @param arr 数组\n * @param page 页码(从1开始)\n * @param pageSize 每页数量\n */\nexport const paginate = <T>(arr: T[], page: number, pageSize: number): T[] => {\n const start = (page - 1) * pageSize\n return arr.slice(start, start + pageSize)\n}\n\n/**\n * 获取分页信息\n * @param total 总数\n * @param page 页码(从1开始)\n * @param pageSize 每页数量\n */\nexport const getPaginationInfo = (total: number, page: number, pageSize: number) => {\n const totalPages = Math.ceil(total / pageSize)\n const startIndex = (page - 1) * pageSize\n const endIndex = Math.min(startIndex + pageSize, total)\n\n return {\n total,\n page,\n pageSize,\n totalPages,\n startIndex,\n endIndex,\n hasNext: page < totalPages,\n hasPrev: page > 1,\n }\n}\n","/**\n * 字符串工具模块\n * 基于 es-toolkit 封装,提供常用的字符串处理功能\n */\n\nimport {\n camelCase,\n kebabCase,\n snakeCase,\n startCase,\n capitalize,\n lowerFirst,\n upperFirst,\n trim,\n} from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport { camelCase, kebabCase, snakeCase, startCase, capitalize, lowerFirst, upperFirst, trim }\n\n/**\n * 判断字符串是否为空\n * @param str 字符串\n */\nexport const isEmpty = (str: string | null | undefined): boolean => {\n if (!str) return true\n return trim(str).length === 0\n}\n\n/**\n * 生成随机字符串\n * @param length 长度\n * @param charset 字符集\n */\nexport const random = (\n length = 8,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string => {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length))\n }\n return result\n}\n\n/**\n * 生成 UUID\n */\nexport const uuid = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\n/**\n * 生成短 ID\n * @param length 长度\n */\nexport const shortId = (length = 6): string => {\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length))\n }\n return result\n}\n\n/**\n * 字符串首字母大写\n * @param str 字符串\n */\nexport const firstUpperCase = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * 字符串首字母小写\n * @param str 字符串\n */\nexport const firstLowerCase = (str: string): string => {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n\n/**\n * 反转字符串\n * @param str 字符串\n */\nexport const reverse = (str: string): string => {\n return str.split('').reverse().join('')\n}\n\n/**\n * 字符串重复\n * @param str 字符串\n * @param count 重复次数\n */\nexport const repeat = (str: string, count: number): string => {\n return str.repeat(count)\n}\n\n/**\n * 填充字符串\n * @param str 字符串\n * @param length 目标长度\n * @param char 填充字符\n * @param isEnd 是否在末尾填充\n */\nexport const pad = (str: string | number, length: number, char = '0', isEnd = false): string => {\n const s = String(str)\n if (isEnd) {\n return s.padEnd(length, char)\n }\n return s.padStart(length, char)\n}\n\n/**\n * 获取文件扩展名\n * @param filename 文件名\n */\nexport const getExtension = (filename: string): string => {\n const idx = filename.lastIndexOf('.')\n if (idx === -1) return ''\n return filename.slice(idx + 1)\n}\n\n/**\n * 获取文件名(不带扩展名)\n * @param filename 文件名\n */\nexport const getFileName = (filename: string): string => {\n const lastSlash = Math.max(filename.lastIndexOf('/'), filename.lastIndexOf('\\\\'))\n const nameWithExt = lastSlash === -1 ? filename : filename.slice(lastSlash + 1)\n const lastDot = nameWithExt.lastIndexOf('.')\n return lastDot === -1 ? nameWithExt : nameWithExt.slice(0, lastDot)\n}\n\n/**\n * 隐藏手机号中间四位\n * @param phone 手机号\n */\nexport const hidePhone = (phone: string): string => {\n return phone.replace(/(\\d{3})\\d{4}(\\d{4})/, '$1****$2')\n}\n\n/**\n * 隐藏邮箱\n * @param email 邮箱\n */\nexport const hideEmail = (email: string): string => {\n const [username, domain] = email.split('@')\n if (username.length <= 2) return email\n return `${username[0]}${'*'.repeat(username.length - 2)}${username[username.length - 1]}@${domain}`\n}\n\n/**\n * 隐藏身份证号中间部分\n * @param idCard 身份证号\n */\nexport const hideIdCard = (idCard: string): string => {\n if (idCard.length < 8) return idCard\n return `${idCard.slice(0, 4)}${'*'.repeat(idCard.length - 8)}${idCard.slice(-4)}`\n}\n\n/**\n * 格式化金额\n * @param amount 金额\n * @param decimals 小数位数\n * @param separator 千位分隔符\n */\nexport const formatMoney = (amount: number, decimals = 2, separator = ','): string => {\n const str = amount.toFixed(decimals)\n const parts = str.split('.')\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n return parts.join('.')\n}\n\n/**\n * 字符串转数字\n * @param str 字符串\n * @param defaultValue 默认值\n */\nexport const toNumber = (str: string | number | null | undefined, defaultValue = 0): number => {\n if (typeof str === 'number') return str\n if (!str) return defaultValue\n const num = Number(str)\n return isNaN(num) ? defaultValue : num\n}\n\n/**\n * 字符串转布尔值\n * @param str 字符串\n * @param defaultValue 默认值\n */\nexport const toBoolean = (\n str: string | boolean | null | undefined,\n defaultValue = false\n): boolean => {\n if (typeof str === 'boolean') return str\n if (!str) return defaultValue\n return ['true', '1', 'yes', 'on'].includes(str.toLowerCase())\n}\n\n/**\n * 提取字符串中的数字\n * @param str 字符串\n */\nexport const extractNumbers = (str: string): number[] => {\n const matches = str.match(/-?\\d+(\\.\\d+)?/g)\n return matches ? matches.map(Number) : []\n}\n\n/**\n * 提取字符串中的手机号\n * @param str 字符串\n */\nexport const extractPhones = (str: string): string[] => {\n const matches = str.match(/1[3-9]\\d{9}/g)\n return matches || []\n}\n\n/**\n * 提取字符串中的邮箱\n * @param str 字符串\n */\nexport const extractEmails = (str: string): string[] => {\n const matches = str.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g)\n return matches || []\n}\n\n/**\n * 验证手机号\n * @param phone 手机号\n */\nexport const isPhone = (phone: string): boolean => {\n return /^1[3-9]\\d{9}$/.test(phone)\n}\n\n/**\n * 验证邮箱\n * @param email 邮箱\n */\nexport const isEmail = (email: string): boolean => {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(email)\n}\n\n/**\n * 验证身份证号\n * @param idCard 身份证号\n */\nexport const isIdCard = (idCard: string): boolean => {\n return /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/.test(idCard)\n}\n\n/**\n * 验证 URL\n * @param url URL\n */\nexport const isUrl = (url: string): boolean => {\n try {\n new URL(url)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * 高亮关键词\n * @param text 文本\n * @param keyword 关键词\n * @param highlightClass 高亮样式类名\n */\nexport const highlight = (text: string, keyword: string, highlightClass = 'highlight'): string => {\n if (!keyword) return text\n const regex = new RegExp(`(${keyword})`, 'gi')\n return text.replace(regex, `<span class=\"${highlightClass}\">$1</span>`)\n}\n\n/**\n * 截断文本(支持 HTML)\n * @param text 文本\n * @param length 最大长度\n * @param suffix 后缀\n */\nexport const truncateText = (text: string, length = 100, suffix = '...'): string => {\n if (text.length <= length) return text\n return text.slice(0, length) + suffix\n}\n\n/**\n * 转义 HTML\n * @param str 字符串\n */\nexport const escapeHtml = (str: string): string => {\n const htmlEscapes: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n }\n return str.replace(/[&<>\"']/g, char => htmlEscapes[char])\n}\n\n/**\n * 反转义 HTML\n * @param str 字符串\n */\nexport const unescapeHtml = (str: string): string => {\n const htmlUnescapes: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n }\n return str.replace(/&(amp|lt|gt|quot|#39);/g, match => htmlUnescapes[match])\n}\n\n/**\n * 移除 HTML 标签\n * @param str 字符串\n */\nexport const stripTags = (str: string): string => {\n return str.replace(/<[^>]*>/g, '')\n}\n\n/**\n * 字节长度\n * @param str 字符串\n */\nexport const byteLength = (str: string): number => {\n let len = 0\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i)\n if (code >= 0x0001 && code <= 0x007e) {\n len += 1\n } else if (code >= 0x0080 && code <= 0x07ff) {\n len += 2\n } else if (code >= 0x0800 && code <= 0xffff) {\n len += 3\n } else {\n len += 4\n }\n }\n return len\n}\n","/**\n * 对象工具模块\n * 基于 es-toolkit 封装,提供常用的对象处理功能\n */\n\nimport { pick, omit, merge, cloneDeep, isEqual, invert, groupBy, isEmptyObject } from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport { pick, omit, merge, cloneDeep, isEqual, invert, groupBy, isEmptyObject }\n\n/**\n * 获取对象的所有键\n * @param obj 对象\n */\nexport const keys = <T extends Record<string, any>>(obj: T): (keyof T)[] => {\n return Object.keys(obj) as (keyof T)[]\n}\n\n/**\n * 获取对象的所有值\n * @param obj 对象\n */\nexport const values = <T extends Record<string, any>>(obj: T): T[keyof T][] => {\n return Object.values(obj)\n}\n\n/**\n * 获取对象的所有键值对\n * @param obj 对象\n */\nexport const entries = <T extends Record<string, any>>(obj: T): [keyof T, T[keyof T]][] => {\n return Object.entries(obj) as [keyof T, T[keyof T]][]\n}\n\n/**\n * 从键值对数组创建对象\n * @param pairs 键值对数组\n */\nexport const fromPairs = <K extends string | number | symbol, V>(pairs: [K, V][]): Record<K, V> => {\n const result = {} as Record<K, V>\n for (const [key, value] of pairs) {\n result[key] = value\n }\n return result\n}\n\n/**\n * 获取对象的嵌套属性值\n * @param obj 对象\n * @param path 路径\n * @param defaultValue 默认值\n */\nexport const get = <T>(obj: Record<string, any>, path: string, defaultValue?: T): T => {\n const keys = path.split('.')\n let result = obj\n for (const key of keys) {\n if (result === null || result === undefined) {\n return defaultValue as T\n }\n result = result[key]\n }\n return (result === undefined ? (defaultValue as T) : result) as T\n}\n\n/**\n * 设置对象的嵌套属性值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\nexport const set = (obj: Record<string, any>, path: string, value: any): void => {\n const keys = path.split('.')\n let result = obj\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!(key in result) || typeof result[key] !== 'object') {\n result[key] = {}\n }\n result = result[key]\n }\n result[keys[keys.length - 1]] = value\n}\n\n/**\n * 判断对象是否有某个路径\n * @param obj 对象\n * @param path 路径\n */\nexport const has = (obj: Record<string, any>, path: string): boolean => {\n const keys = path.split('.')\n let result = obj\n for (const key of keys) {\n if (result === null || result === undefined || !(key in result)) {\n return false\n }\n result = result[key]\n }\n return true\n}\n\n/**\n * 判断对象是否为空\n * @param obj 对象\n */\nexport const isEmpty = (obj: any): boolean => {\n if (obj === null || obj === undefined) return true\n if (Array.isArray(obj)) return obj.length === 0\n if (typeof obj === 'object') return isEmptyObject(obj)\n return false\n}\n\n/**\n * 深度合并对象\n * @param target 目标对象\n * @param sources 源对象\n */\nexport const deepMerge = <T extends Record<string, any>>(\n target: T,\n ...sources: Partial<T>[]\n): T => {\n if (!sources.length) return target\n const source = sources.shift() as Partial<T>\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key]\n const targetValue = (target as any)[key]\n\n if (isObject(sourceValue)) {\n if (!isObject(targetValue)) {\n ;(target as any)[key] = {}\n }\n deepMerge((target as any)[key], sourceValue)\n } else {\n ;(target as any)[key] = sourceValue\n }\n }\n }\n }\n\n return deepMerge(target, ...sources)\n}\n\n/**\n * 判断是否是对象\n * @param obj 值\n */\nexport const isObject = (obj: any): obj is Record<string, any> => {\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj)\n}\n\n/**\n * 判断是否是数组\n * @param obj 值\n */\nexport const isArray = (obj: any): obj is any[] => {\n return Array.isArray(obj)\n}\n\n/**\n * 判断是否是函数\n * @param obj 值\n */\nexport const isFunction = (obj: any): obj is (...args: unknown[]) => unknown => {\n return typeof obj === 'function'\n}\n\n/**\n * 判断是否是数字\n * @param obj 值\n */\nexport const isNumber = (obj: any): obj is number => {\n return typeof obj === 'number' && !isNaN(obj)\n}\n\n/**\n * 判断是否是字符串\n * @param obj 值\n */\nexport const isString = (obj: any): obj is string => {\n return typeof obj === 'string'\n}\n\n/**\n * 判断是否是布尔值\n * @param obj 值\n */\nexport const isBoolean = (obj: any): obj is boolean => {\n return typeof obj === 'boolean'\n}\n\n/**\n * 判断是否是 null 或 undefined\n * @param obj 值\n */\nexport const isNil = (obj: any): boolean => {\n return obj === null || obj === undefined\n}\n\n/**\n * 判断是否是 null\n * @param obj 值\n */\nexport const isNull = (obj: any): obj is null => {\n return obj === null\n}\n\n/**\n * 判断是否是 undefined\n * @param obj 值\n */\nexport const isUndefined = (obj: any): obj is undefined => {\n return obj === undefined\n}\n\n/**\n * 获取对象的键值对数量\n * @param obj 对象\n */\nexport const size = (obj: Record<string, any>): number => {\n return Object.keys(obj).length\n}\n\n/**\n * 清空对象\n * @param obj 对象\n */\nexport const clear = <T extends Record<string, any>>(obj: T): T => {\n Object.keys(obj).forEach(key => {\n delete obj[key]\n })\n return obj\n}\n\n/**\n * 转换为查询字符串\n * @param obj 对象\n */\nexport const toQueryString = (obj: Record<string, any>): string => {\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&')\n}\n\n/**\n * 查询字符串转对象\n * @param queryString 查询字符串\n */\nexport const fromQueryString = (queryString: string): Record<string, string> => {\n const params: Record<string, string> = {}\n const pairs = queryString.slice(1).split('&')\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n if (key) {\n params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : ''\n }\n }\n return params\n}\n\n/**\n * 对象排序\n * @param obj 对象\n * @param compareFn 比较函数\n */\nexport const sortKeys = <T extends Record<string, any>>(\n obj: T,\n compareFn?: (a: string, b: string) => number\n): T => {\n const sortedKeys = Object.keys(obj).sort(compareFn)\n const result: Record<string, any> = {}\n for (const key of sortedKeys) {\n result[key] = obj[key]\n }\n return result as T\n}\n\n/**\n * 重命名对象的键\n * @param obj 对象\n * @param renameMap 重命名映射\n */\nexport const renameKeys = <T extends Record<string, any>>(\n obj: T,\n renameMap: Record<string, string>\n): T => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n const newKey = renameMap[key] || key\n result[newKey] = obj[key]\n }\n return result as T\n}\n\n/**\n * 过滤对象的键值对\n * @param obj 对象\n * @param predicate 过滤函数\n */\nexport const filter = <T extends Record<string, any>>(\n obj: T,\n predicate: (value: any, key: string) => boolean\n): Partial<T> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n if (predicate(obj[key], key)) {\n result[key] = obj[key]\n }\n }\n return result as Partial<T>\n}\n\n/**\n * 映射对象的值\n * @param obj 对象\n * @param mapper 映射函数\n */\nexport const mapValues = <T extends Record<string, any>, R>(\n obj: T,\n mapper: (value: any, key: string) => R\n): Record<string, R> => {\n const result: Record<string, R> = {}\n for (const key in obj) {\n result[key] = mapper(obj[key], key)\n }\n return result\n}\n\n/**\n * 映射对象的键\n * @param obj 对象\n * @param mapper 映射函数\n */\nexport const mapKeys = <T extends Record<string, any>, R extends string>(\n obj: T,\n mapper: (key: string, value: any) => R\n): Record<R, any> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n const newKey = mapper(key, obj[key])\n result[newKey] = obj[key]\n }\n return result as Record<R, any>\n}\n\n/**\n * 获取嵌套路径的值\n * @param obj 对象\n * @param path 路径\n * @param defaultValue 默认值\n */\nexport const getDeep = <T>(obj: Record<string, any>, path: string, defaultValue?: T): T => {\n return get(obj, path, defaultValue)\n}\n\n/**\n * 设置嵌套路径的值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\nexport const setDeep = (obj: Record<string, any>, path: string, value: any): void => {\n set(obj, path, value)\n}\n\n/**\n * 判断对象是否有某个路径\n * @param obj 对象\n * @param path 路径\n */\nexport const hasDeep = (obj: Record<string, any>, path: string): boolean => {\n return has(obj, path)\n}\n\n/**\n * 删除嵌套路径的值\n * @param obj 对象\n * @param path 路径\n */\nexport const deleteDeep = (obj: Record<string, any>, path: string): boolean => {\n const keys = path.split('.')\n let current = obj\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) {\n return false\n }\n current = current[keys[i]]\n }\n const lastKey = keys[keys.length - 1]\n if (lastKey in current) {\n delete current[lastKey]\n return true\n }\n return false\n}\n\n/**\n * 转换为 FormData\n * @param obj 对象\n */\nexport const toFormData = (obj: Record<string, any>): FormData => {\n const formData = new FormData()\n for (const key in obj) {\n const value = obj[key]\n if (value !== undefined && value !== null) {\n if (value instanceof File) {\n formData.append(key, value)\n } else if (Array.isArray(value)) {\n formData.append(key, JSON.stringify(value))\n } else if (typeof value === 'object') {\n formData.append(key, JSON.stringify(value))\n } else {\n formData.append(key, String(value))\n }\n }\n }\n return formData\n}\n\n/**\n * 对象差值(返回在 obj 中但不在 base 中的键值对)\n * @param obj 对象\n * @param base 基础对象\n */\nexport const diff = <T extends Record<string, any>>(obj: T, base: T): Partial<T> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n if (!isEqual(obj[key], base[key])) {\n result[key] = obj[key]\n }\n }\n return result as Partial<T>\n}\n\n/**\n * 深度冻结对象\n * @param obj 对象\n */\nexport const deepFreeze = <T>(obj: T): T => {\n if (isObject(obj) || isArray(obj)) {\n Object.freeze(obj)\n for (const key in obj) {\n deepFreeze((obj as any)[key])\n }\n }\n return obj\n}\n\n/**\n * 获取对象的第一个值\n * @param obj 对象\n */\nexport const first = <T>(obj: Record<string, T>): T | undefined => {\n const values = Object.values(obj)\n return values[0]\n}\n\n/**\n * 获取对象的最后一个值\n * @param obj 对象\n */\nexport const last = <T>(obj: Record<string, T>): T | undefined => {\n const values = Object.values(obj)\n return values[values.length - 1]\n}\n\n/**\n * 按路径分组对象数组\n * @param arr 对象数组\n * @param keyPath 键路径\n */\nexport const groupByPath = <T extends Record<string, any>>(\n arr: T[],\n keyPath: string\n): Record<string, T[]> => {\n return groupBy(arr, item => get(item, keyPath))\n}\n","/**\n * Excel 工具模块\n * 基于 xlsx 封装,提供常用的 Excel 处理功能\n */\n\nimport * as XLSX from 'xlsx'\n\nexport interface ExcelExportOptions {\n filename?: string\n sheetName?: string\n header?: Record<string, string>\n}\n\nexport interface ExcelImportOptions {\n header?: number\n raw?: boolean\n defval?: any\n}\n\n/**\n * 导出 Excel\n * @param data 数据\n * @param options 选项\n */\nexport const exportExcel = <T extends Record<string, any>>(\n data: T[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n // 处理表头映射\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n // 创建工作簿\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n\n // 下载文件\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(多 Sheet)\n * @param sheetsData Sheet 数据\n * @param filename 文件名\n */\nexport const exportMultiSheetExcel = (\n sheetsData: Array<{ name: string; data: Record<string, any>[]; header?: Record<string, string> }>,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.book_new()\n\n sheetsData.forEach(({ name, data, header }) => {\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n XLSX.utils.book_append_sheet(workbook, worksheet, name)\n })\n\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导入 Excel\n * @param file 文件\n * @param options 选项\n */\nexport const importExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<T[]> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[0]\n const worksheet = workbook.Sheets[sheetName]\n\n const jsonData = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n\n resolve(jsonData)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导入 Excel(所有 Sheet)\n * @param file 文件\n * @param options 选项\n */\nexport const importAllSheetsExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<Record<string, T[]>> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const result: Record<string, T[]> = {}\n\n workbook.SheetNames.forEach(sheetName => {\n const worksheet = workbook.Sheets[sheetName]\n result[sheetName] = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n })\n\n resolve(result)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导出 Excel(使用自定义表头)\n * @param data 数据\n * @param headers 表头\n * @param filename 文件名\n * @param sheetName Sheet 名称\n */\nexport const exportExcelWithHeaders = (\n data: Record<string, any>[],\n headers: { key: string; label: string }[],\n filename = 'export.xlsx',\n sheetName = 'Sheet1'\n): void => {\n const worksheet = XLSX.utils.json_to_sheet([])\n\n // 添加表头\n XLSX.utils.sheet_add_aoa(worksheet, [headers.map(h => h.label)], { origin: 'A1' })\n\n // 添加数据\n const rows = data.map(item => headers.map(h => item[h.key]))\n XLSX.utils.sheet_add_aoa(worksheet, rows, { origin: 'A2' })\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(设置列宽)\n * @param data 数据\n * @param columnWidths 列宽\n * @param options 其他选项\n */\nexport const exportExcelWithColumnWidths = (\n data: Record<string, any>[],\n columnWidths: { wch?: number; wpx?: number; width?: number }[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 设置列宽\n worksheet['!cols'] = columnWidths\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(合并单元格)\n * @param data 数据\n * @param merges 合并区域\n * @param options 其他选项\n */\nexport const exportExcelWithMerges = (\n data: Record<string, any>[],\n merges: XLSX.Range[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 合并单元格\n worksheet['!merges'] = merges\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 获取 Excel 的 Sheet 列表\n * @param file 文件\n */\nexport const getSheetNames = (file: File | ArrayBuffer): Promise<string[]> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n resolve(workbook.SheetNames)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 将 HTML 表格导出为 Excel\n * @param tableElement 表格元素\n * @param filename 文件名\n */\nexport const exportTableToExcel = (\n tableElement: HTMLTableElement,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.table_to_book(tableElement)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 将 Excel 转换为 HTML 表格\n * @param file 文件\n * @param sheetIndex Sheet 索引\n */\nexport const excelToTable = (file: File, sheetIndex = 0): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[sheetIndex]\n const worksheet = workbook.Sheets[sheetName]\n\n const html = XLSX.utils.sheet_to_html(worksheet)\n resolve(html)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n reader.readAsBinaryString(file)\n })\n}\n","/**\n * PDF 工具模块\n * 基于 html2canvas 和 jspdf 封装,提供常用的 PDF 处理功能\n */\n\nimport html2canvas, { type Options as Html2CanvasOptions } from 'html2canvas'\nimport { jsPDF } from 'jspdf'\n\nexport interface CaptureToPDFOptions {\n filename?: string\n scale?: number\n useCORS?: boolean\n backgroundColor?: string\n logging?: boolean\n pagebreak?: { mode?: string; before?: string; after?: string }\n margin?: number\n}\n\nexport interface PDFOptions {\n orientation?: 'p' | 'portrait' | 'l' | 'landscape'\n unit?: 'pt' | 'mm' | 'cm' | 'in'\n format?: 'a0' | 'a1' | 'a2' | 'a3' | 'a4' | 'legal' | 'letter' | [number, number]\n}\n\n/**\n * 将 DOM 元素转换为 PDF\n * @param element DOM 元素\n * @param options 选项\n */\nexport const captureToPDF = async (\n element: HTMLElement,\n options: CaptureToPDFOptions = {}\n): Promise<void> => {\n const {\n filename = 'download.pdf',\n scale = 2,\n useCORS = true,\n backgroundColor = '#ffffff',\n logging = false,\n margin = 10,\n } = options\n\n // 使用 html2canvas 将 DOM 转换为 canvas\n const canvas = await html2canvas(element, {\n scale,\n useCORS,\n backgroundColor,\n logging,\n })\n\n // 获取 canvas 的尺寸\n const imgData = canvas.toDataURL('image/png')\n const imgWidth = canvas.width\n const imgHeight = canvas.height\n\n // 计算 PDF 尺寸\n const pdfWidth = imgWidth / scale\n const pdfHeight = imgHeight / scale\n\n // 创建 PDF\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? 'l' : 'p',\n unit: 'pt',\n format: [pdfWidth + margin * 2, pdfHeight + margin * 2],\n })\n\n // 添加图片到 PDF\n pdf.addImage(imgData, 'PNG', margin, margin, pdfWidth, pdfHeight)\n pdf.save(filename)\n}\n\n/**\n * 将 DOM 元素转换为 PDF(分页)\n * @param element DOM 元素\n * @param options 选项\n */\nexport const captureToPDFWithPagination = async (\n element: HTMLElement,\n options: CaptureToPDFOptions = {}\n): Promise<void> => {\n const {\n filename = 'download.pdf',\n scale = 2,\n useCORS = true,\n backgroundColor = '#ffffff',\n logging = false,\n margin = 10,\n } = options\n\n // 使用 html2canvas 将 DOM 转换为 canvas\n const canvas = await html2canvas(element, {\n scale,\n useCORS,\n backgroundColor,\n logging,\n })\n\n // 获取 canvas 的尺寸\n const imgData = canvas.toDataURL('image/png')\n const imgWidth = canvas.width\n const imgHeight = canvas.height\n\n // 创建 PDF (A4)\n const pdf = new jsPDF('p', 'pt', 'a4')\n const pdfWidth = pdf.internal.pageSize.getWidth()\n const pdfHeight = pdf.internal.pageSize.getHeight()\n\n // 计算图片在 PDF 中的尺寸\n const imgWidthInPDF = pdfWidth - margin * 2\n const imgHeightInPDF = (imgHeight / imgWidth) * imgWidthInPDF\n\n let heightLeft = imgHeightInPDF\n let position = margin\n\n // 第一页\n pdf.addImage(imgData, 'PNG', margin, position, imgWidthInPDF, imgHeightInPDF)\n heightLeft -= pdfHeight - margin * 2\n\n // 分页\n while (heightLeft > 0) {\n position = heightLeft - imgHeightInPDF + margin\n pdf.addPage()\n pdf.addImage(imgData, 'PNG', margin, position, imgWidthInPDF, imgHeightInPDF)\n heightLeft -= pdfHeight - margin * 2\n }\n\n pdf.save(filename)\n}\n\n/**\n * 截取 DOM 元素为图片\n * @param element DOM 元素\n * @param options html2canvas 选项\n */\nexport const captureToImage = async (\n element: HTMLElement,\n options: Partial<Html2CanvasOptions> = {}\n): Promise<string> => {\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: '#ffffff',\n logging: false,\n ...options,\n })\n\n return canvas.toDataURL('image/png')\n}\n\n/**\n * 截取 DOM 元素并下载为图片\n * @param element DOM 元素\n * @param filename 文件名\n * @param options html2canvas 选项\n */\nexport const captureToImageDownload = async (\n element: HTMLElement,\n filename = 'screenshot.png',\n options: Partial<Html2CanvasOptions> = {}\n): Promise<void> => {\n const dataUrl = await captureToImage(element, options)\n\n const link = document.createElement('a')\n link.href = dataUrl\n link.download = filename\n link.click()\n}\n\n/**\n * 创建空白 PDF\n * @param options PDF 选项\n */\nexport const createPDF = (options: PDFOptions = {}): jsPDF => {\n return new jsPDF(options)\n}\n\n/**\n * 添加文本到 PDF\n * @param pdf PDF 实例\n * @param text 文本\n * @param x X 坐标\n * @param y Y 坐标\n * @param options 选项\n */\nexport const addTextToPDF = (\n pdf: jsPDF,\n text: string,\n x: number,\n y: number,\n options: {\n maxWidth?: number\n align?: 'left' | 'center' | 'right'\n fontSize?: number\n fontStyle?: 'normal' | 'bold' | 'italic' | 'bolditalic'\n } = {}\n): void => {\n const { maxWidth, align = 'left', fontSize = 12, fontStyle = 'normal' } = options\n\n pdf.setFontSize(fontSize)\n pdf.setFont('helvetica', fontStyle)\n pdf.text(text, x, y, { maxWidth, align })\n}\n\n/**\n * 添加图片到 PDF\n * @param pdf PDF 实例\n * @param imageData 图片数据(DataURL 或 URL)\n * @param x X 坐标\n * @param y Y 坐标\n * @param width 宽度\n * @param height 高度\n */\nexport const addImageToPDF = (\n pdf: jsPDF,\n imageData: string,\n x: number,\n y: number,\n width: number,\n height: number\n): void => {\n pdf.addImage(imageData, 'PNG', x, y, width, height)\n}\n\n/**\n * 添加表格到 PDF\n * @param pdf PDF 实例\n * @param headers 表头\n * @param data 数据\n * @param options 选项\n */\nexport const addTableToPDF = (\n pdf: jsPDF,\n headers: string[],\n data: string[][],\n options: {\n x?: number\n y?: number\n cellWidth?: number\n cellHeight?: number\n headerBackgroundColor?: string\n headerTextColor?: string\n textColor?: string\n fontSize?: number\n lineWidth?: number\n lineColor?: number[]\n } = {}\n): void => {\n const {\n x = 10,\n y = 10,\n cellWidth = 50,\n cellHeight = 20,\n headerBackgroundColor = '#4472C4',\n headerTextColor = '#ffffff',\n textColor = '#000000',\n fontSize = 10,\n lineWidth = 0.1,\n lineColor = [200, 200, 200],\n } = options\n\n pdf.setFontSize(fontSize)\n let currentY = y\n\n // 绘制表头\n headers.forEach((header, index) => {\n const cellX = x + index * cellWidth\n\n // 绘制背景\n pdf.setFillColor(\n parseInt(headerBackgroundColor.slice(1, 3), 16),\n parseInt(headerBackgroundColor.slice(3, 5), 16),\n parseInt(headerBackgroundColor.slice(5, 7), 16)\n )\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'F')\n\n // 绘制边框\n pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2])\n pdf.setLineWidth(lineWidth)\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'S')\n\n // 绘制文本\n pdf.setTextColor(\n parseInt(headerTextColor.slice(1, 3), 16),\n parseInt(headerTextColor.slice(3, 5), 16),\n parseInt(headerTextColor.slice(5, 7), 16)\n )\n pdf.text(header, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {\n align: 'center',\n })\n })\n\n currentY += cellHeight\n\n // 绘制数据\n pdf.setTextColor(\n parseInt(textColor.slice(1, 3), 16),\n parseInt(textColor.slice(3, 5), 16),\n parseInt(textColor.slice(5, 7), 16)\n )\n\n data.forEach(row => {\n row.forEach((cell, index) => {\n const cellX = x + index * cellWidth\n\n // 绘制边框\n pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2])\n pdf.setLineWidth(lineWidth)\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'S')\n\n // 绘制文本\n pdf.text(cell, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {\n align: 'center',\n })\n })\n currentY += cellHeight\n })\n}\n\n/**\n * 添加新页面\n * @param pdf PDF 实例\n */\nexport const addPage = (pdf: jsPDF): void => {\n pdf.addPage()\n}\n\n/**\n * 保存 PDF\n * @param pdf PDF 实例\n * @param filename 文件名\n */\nexport const savePDF = (pdf: jsPDF, filename = 'download.pdf'): void => {\n pdf.save(filename)\n}\n\n/**\n * PDF 转 DataURL\n * @param pdf PDF 实例\n */\nexport const pdfToDataURL = (pdf: jsPDF): string => {\n return pdf.output('dataurlstring')\n}\n\n/**\n * PDF 转 Blob\n * @param pdf PDF 实例\n */\nexport const pdfToBlob = (pdf: jsPDF): Blob => {\n return pdf.output('blob')\n}\n\n/**\n * 合并多个 PDF(需要使用 pdf-lib 库实现)\n * @param _pdfs PDF 实例数组\n */\nexport const mergePDFs = (_pdfs: jsPDF[]): Promise<jsPDF> => {\n return Promise.reject(\n new Error('mergePDFs 功能需要使用 pdf-lib 库实现。请安装 pdf-lib 并使用其提供的合并功能。')\n )\n}\n\n/**\n * 导出 jsPDF 和 html2canvas 原始对象,方便高级用法\n */\nexport { jsPDF, html2canvas }\n","/**\n * Map Module - OpenLayers 高级封装\n *\n * 提供简化的地图操作 API,支持:\n * - 自定义图标样式\n * - GeoJSON 支持\n * - 主题切换(亮/暗)\n * - Overlay 管理\n * - 动态缩放\n */\n\nimport { Feature } from 'ol'\nimport { defaults as defaultControls } from 'ol/control'\nimport { FullScreen } from 'ol/control'\nimport { ScaleLine } from 'ol/control'\nimport { Point, LineString, Polygon } from 'ol/geom'\nimport { Draw, Modify, Snap } from 'ol/interaction'\nimport { Select } from 'ol/interaction'\nimport Overlay from 'ol/Overlay'\nimport TileLayer from 'ol/layer/Tile'\nimport VectorLayer from 'ol/layer/Vector'\nimport { Map as OlMap } from 'ol'\nimport { fromLonLat, toLonLat, transform } from 'ol/proj'\nimport OSM from 'ol/source/OSM'\nimport VectorSource from 'ol/source/Vector'\nimport XYZ from 'ol/source/XYZ'\nimport GeoJSON from 'ol/format/GeoJSON'\nimport { Style, Circle, Fill, Stroke, Icon } from 'ol/style'\nimport { View } from 'ol'\nimport { boundingExtent } from 'ol/extent'\n\n// ==================== 类型定义 ====================\n\n/**\n * 主题类型\n */\nexport type MapTheme = 'light' | 'dark'\n\n/**\n * 地图配置选项\n */\nexport interface MapOptions {\n /** 地图容器 ID */\n container: string\n /** 中心点 [经度, 纬度] */\n center?: [number, number]\n /** 缩放级别 */\n zoom?: number\n /** 最小缩放级别 */\n minZoom?: number\n /** 最大缩放级别 */\n maxZoom?: number\n /** 是否显示比例尺 */\n showScaleLine?: boolean\n /** 是否显示全屏按钮 */\n showFullScreen?: boolean\n /** 默认图层 */\n layers?: Layer[]\n /** 主题 */\n theme?: MapTheme\n /** 主题配置 */\n themeConfig?: ThemeConfig\n /** 自定义图标配置 */\n icons?: Record<string, IconConfig>\n /** 是否启用动态缩放 */\n enableDynamicScale?: boolean\n /** 投影坐标系,默认 EPSG:4326 */\n projection?: string\n}\n\n/**\n * 图层类型\n */\nexport interface Layer {\n /** 图层名称 */\n name: string\n /** 图层实例 */\n layer: import('ol/layer/Base').default\n}\n\n/**\n * 主题配置\n */\nexport interface ThemeConfig {\n /** 亮色地图 URL */\n lightUrl?: string\n /** 暗色地图 URL */\n darkUrl?: string\n}\n\n/**\n * 图标配置\n */\nexport interface IconConfig {\n /** 图标 URL 或 base64 */\n src: string\n /** 锚点位置 [x, y],默认 [0.5, 0.5] */\n anchor?: [number, number]\n /** 缩放比例,默认 1 */\n scale?: number\n}\n\n/**\n * 标记选项\n */\nexport interface MarkerOptions {\n /** 坐标 [经度, 纬度] */\n coordinate: [number, number]\n /** 颜色 */\n color?: string\n /** 半径 */\n radius?: number\n /** 边框颜色 */\n strokeColor?: string\n /** 边框宽度 */\n strokeWidth?: number\n /** 自定义图标名称 */\n icon?: string\n /** 自定义图标配置 */\n iconConfig?: IconConfig\n /** 自定义样式 */\n style?: Style\n}\n\n/**\n * 要素样式选项\n */\nexport interface FeatureStyleOptions {\n /** 图标名称(来自 icons 配置) */\n icon?: string\n /** 自定义图标配置 */\n iconConfig?: IconConfig\n /** 填充颜色(Polygon) */\n fillColor?: string\n /** 边框颜色 */\n strokeColor?: string\n /** 边框宽度 */\n strokeWidth?: number\n /** 自定义样式 */\n style?: Style\n}\n\n/**\n * 绘制类型\n */\nexport type DrawType = 'Point' | 'LineString' | 'Polygon' | 'Circle'\n\n/**\n * 绘制选项\n */\nexport interface DrawOptions {\n /** 绘制类型 */\n type: DrawType\n /** 绘制完成回调 */\n onDrawEnd?: (feature: Feature) => void\n /** 绘制样式 */\n style?: Style\n /** 绘制图层名称 */\n layerName?: string\n}\n\n/**\n * GeoJSON 要素选项\n */\nexport interface GeoJSONFeature {\n type: 'FeatureCollection'\n features: GeoJSONFeatureItem[]\n}\n\n/**\n * GeoJSON 要素项\n */\nexport interface GeoJSONFeatureItem {\n type: 'Feature'\n geometry: {\n type: 'Point' | 'LineString' | 'Polygon'\n coordinates: number[] | number[][] | number[][][]\n }\n properties?: Record<string, any>\n}\n\n/**\n * Overlay 配置\n */\nexport interface OverlayOptions {\n /** Overlay 名称 */\n name: string\n /** DOM 元素 */\n element: HTMLElement\n /** 是否自动平移 */\n autoPan?: boolean\n /** 偏移量 */\n offset?: number[]\n /** 定位方式 */\n positioning?: 'bottom-center' | 'bottom-left' | 'bottom-right' | 'center-center' | 'center-left' | 'center-right' | 'top-center' | 'top-left' | 'top-right'\n}\n\n/**\n * 矢量图层配置\n */\nexport interface VectorLayerConfig {\n /** 图层名称 */\n name: string\n /** 最小缩放级别 */\n minZoom?: number\n /** 最大缩放级别 */\n maxZoom?: number\n /** 图层层级 */\n zIndex?: number\n /** 默认样式 */\n style?: Style\n /** 是否可见 */\n visible?: boolean\n}\n\n// ==================== Map 类 ====================\n\n/**\n * 地图类 - 封装 OpenLayers Map\n */\nexport class MapInstance {\n private map: OlMap\n private vectorSources: Map<string, VectorSource> = new Map()\n private vectorLayers: Map<string, VectorLayer<VectorSource>> = new Map()\n private overlays: Map<string, Overlay> = new Map()\n private themeLayers: Map<MapTheme, TileLayer<XYZ>> = new Map()\n private drawInteraction: Draw | null = null\n private modifyInteraction: Modify | null = null\n private snapInteraction: Snap | null = null\n private selectInteraction: Select | null = null\n private currentTheme: MapTheme = 'light'\n private icons: Map<string, IconConfig> = new Map()\n private enableDynamicScale: boolean = false\n private projection: string = 'EPSG:4326'\n\n constructor(options: MapOptions) {\n this.enableDynamicScale = options.enableDynamicScale || false\n this.projection = options.projection || 'EPSG:4326'\n this.currentTheme = options.theme || 'light'\n\n // 初始化图标\n if (options.icons) {\n Object.entries(options.icons).forEach(([name, config]) => {\n this.icons.set(name, config)\n })\n }\n\n // 创建控件\n const controls = defaultControls({\n zoom: false,\n rotate: false,\n attribution: false\n })\n if (options.showScaleLine !== false) {\n controls.push(new ScaleLine())\n }\n if (options.showFullScreen !== false) {\n controls.push(new FullScreen())\n }\n\n // 创建地图\n this.map = new OlMap({\n target: options.container,\n layers: [],\n view: new View({\n center: fromLonLat(options.center || [116.3974, 39.9093]), // 默认北京\n zoom: options.zoom || 10,\n minZoom: options.minZoom || 1,\n maxZoom: options.maxZoom || 20,\n projection: this.projection,\n constrainResolution: true,\n smoothResolutionConstraint: false\n }),\n controls,\n })\n\n // 添加主题图层\n if (options.themeConfig) {\n this.setupThemeLayers(options.themeConfig)\n }\n\n // 添加默认图层\n if (options.layers) {\n options.layers.forEach(layer => this.map.addLayer(layer.layer))\n }\n\n // 监听缩放事件(用于动态缩放)\n if (this.enableDynamicScale) {\n this.map.on('moveend', () => this.handleZoomChange())\n }\n }\n\n // ==================== 主题管理 ====================\n\n /**\n * 设置主题图层\n */\n private setupThemeLayers(config: ThemeConfig): void {\n const lightUrl = config.lightUrl || 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'\n const darkUrl = config.darkUrl || 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=9&x={x}&y={y}&z={z}'\n\n const lightLayer = new TileLayer({\n preload: Infinity,\n source: new XYZ({ url: lightUrl }),\n })\n\n const darkLayer = new TileLayer({\n preload: Infinity,\n source: new XYZ({ url: darkUrl }),\n })\n\n this.themeLayers.set('light', lightLayer)\n this.themeLayers.set('dark', darkLayer)\n\n this.map.addLayer(lightLayer)\n this.map.addLayer(darkLayer)\n\n // 设置当前主题\n this.setTheme(this.currentTheme)\n }\n\n /**\n * 切换主题\n */\n setTheme(theme: MapTheme): void {\n this.currentTheme = theme\n\n this.themeLayers.forEach((layer: TileLayer<XYZ>, key: MapTheme) => {\n layer.setVisible(key === theme)\n })\n }\n\n /**\n * 获取当前主题\n */\n getTheme(): MapTheme {\n return this.currentTheme\n }\n\n // ==================== 图层管理 ====================\n\n /**\n * 创建矢量图层\n */\n createVectorLayer(config: VectorLayerConfig): void {\n if (this.vectorLayers.has(config.name)) {\n console.warn(`图层 \"${config.name}\" 已存在`)\n return\n }\n\n const source = new VectorSource({\n format: new GeoJSON()\n })\n\n const layer = new VectorLayer({\n source,\n style: config.style,\n minZoom: config.minZoom,\n maxZoom: config.maxZoom,\n zIndex: config.zIndex,\n visible: config.visible !== false\n })\n\n this.vectorSources.set(config.name, source)\n this.vectorLayers.set(config.name, layer)\n this.map.addLayer(layer)\n }\n\n /**\n * 获取矢量图层\n */\n getVectorLayer(name: string): VectorLayer<VectorSource> | undefined {\n return this.vectorLayers.get(name)\n }\n\n /**\n * 获取矢量数据源\n */\n getVectorSource(name: string): VectorSource | undefined {\n return this.vectorSources.get(name)\n }\n\n /**\n * 显示/隐藏矢量图层\n */\n setLayerVisible(name: string, visible: boolean): void {\n const layer = this.vectorLayers.get(name)\n if (layer) {\n layer.setVisible(visible)\n }\n }\n\n /**\n * 设置矢量图层样式\n */\n setLayerStyle(name: string, style: Style): void {\n const layer = this.vectorLayers.get(name)\n if (layer) {\n layer.setStyle(style)\n }\n }\n\n /**\n * 清除矢量图层\n */\n clearLayer(name: string): void {\n const source = this.vectorSources.get(name)\n if (source) {\n source.clear()\n }\n }\n\n /**\n * 删除矢量图层\n */\n removeLayer(name: string): void {\n const layer = this.vectorLayers.get(name)\n if (layer) {\n this.map.removeLayer(layer)\n this.vectorLayers.delete(name)\n this.vectorSources.delete(name)\n }\n }\n\n // ==================== 要素管理 ====================\n\n /**\n * 添加标记\n */\n addMarker(options: MarkerOptions, layerName = 'default'): Feature {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n const feature = new Feature({\n geometry: new Point(fromLonLat(options.coordinate)),\n })\n\n const style = options.style || this.createMarkerStyle(options)\n feature.setStyle(style)\n source.addFeature(feature)\n\n return feature\n }\n\n /**\n * 创建标记样式\n */\n private createMarkerStyle(options: MarkerOptions): Style {\n // 如果指定了图标\n if (options.icon && this.icons.has(options.icon)) {\n const iconConfig = this.icons.get(options.icon)!\n return new Style({\n image: new Icon({\n anchor: iconConfig.anchor || [0.5, 0.5],\n src: iconConfig.src,\n scale: iconConfig.scale || 1\n })\n })\n }\n\n // 如果指定了自定义图标配置\n if (options.iconConfig) {\n return new Style({\n image: new Icon({\n anchor: options.iconConfig.anchor || [0.5, 0.5],\n src: options.iconConfig.src,\n scale: options.iconConfig.scale || 1\n })\n })\n }\n\n // 默认圆形样式\n return new Style({\n image: new Circle({\n radius: options.radius || 7,\n fill: new Fill({ color: options.color || '#ff3333' }),\n stroke: new Stroke({\n color: options.strokeColor || '#ffffff',\n width: options.strokeWidth || 2,\n }),\n }),\n })\n }\n\n /**\n * 移除标记\n */\n removeMarker(feature: Feature, layerName = 'default'): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n source.removeFeature(feature)\n }\n }\n\n /**\n * 从 GeoJSON 添加要素\n */\n addFeaturesFromGeoJSON(geoJson: GeoJSONFeature | string, layerName = 'default'): Feature[] {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n const format = new GeoJSON()\n const features = format.readFeatures(typeof geoJson === 'string' ? geoJson : JSON.stringify(geoJson))\n\n source.addFeatures(features)\n\n return features\n }\n\n /**\n * 添加要素\n */\n addFeature(feature: Feature, layerName = 'default'): void {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n source.addFeature(feature)\n }\n\n /**\n * 批量添加要素\n */\n addFeatures(features: Feature[], layerName = 'default'): void {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n source.addFeatures(features)\n }\n\n /**\n * 移除要素\n */\n removeFeature(feature: Feature, layerName = 'default'): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n source.removeFeature(feature)\n }\n }\n\n /**\n * 清除所有矢量要素\n */\n clearFeatures(layerName = 'default'): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n source.clear()\n }\n }\n\n /**\n * 获取图层中的所有要素\n */\n getFeatures(layerName = 'default'): Feature[] {\n const source = this.vectorSources.get(layerName)\n return source ? source.getFeatures() : []\n }\n\n /**\n * 创建 GeoJSON\n */\n createGeoJSON(type: 'Point' | 'LineString' | 'Polygon', data: any): GeoJSONFeature {\n const coordinates: any = this.getCoordinates(type, data)\n const id = this.generateUUID()\n\n return {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n geometry: {\n type,\n coordinates\n },\n properties: {\n id,\n value: data\n }\n }]\n }\n }\n\n /**\n * 获取坐标\n */\n private getCoordinates(type: string, data: any): any {\n if (type === 'Point') {\n return fromLonLat(transform(data.points, 'EPSG:3857', 'EPSG:4326'))\n } else if (type === 'LineString') {\n return this.setPointArray(data.points)\n } else if (type === 'Polygon') {\n return [this.setPointArray(data.points)]\n }\n return []\n }\n\n /**\n * 设置点数组\n */\n private setPointArray(points: any[]): number[][] {\n return points.map(item => fromLonLat(transform(item, 'EPSG:3857', 'EPSG:4326')))\n }\n\n /**\n * 生成 UUID\n */\n private generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0\n const v = c === 'x' ? r : (r & 0x3 | 0x8)\n return v.toString(16)\n })\n }\n\n /**\n * 设置要素样式\n */\n setFeatureStyle(feature: Feature, options: FeatureStyleOptions): void {\n const style = this.createFeatureStyle(options)\n feature.setStyle(style)\n }\n\n /**\n * 创建要素样式\n */\n private createFeatureStyle(options: FeatureStyleOptions): Style {\n // 自定义样式\n if (options.style) {\n return options.style\n }\n\n // 自定义图标\n if (options.icon && this.icons.has(options.icon)) {\n const iconConfig = this.icons.get(options.icon)!\n return new Style({\n image: new Icon({\n anchor: iconConfig.anchor || [0.5, 0.5],\n src: iconConfig.src,\n scale: iconConfig.scale || 1\n })\n })\n }\n\n // 自定义图标配置\n if (options.iconConfig) {\n return new Style({\n image: new Icon({\n anchor: options.iconConfig.anchor || [0.5, 0.5],\n src: options.iconConfig.src,\n scale: options.iconConfig.scale || 1\n })\n })\n }\n\n // 默认样式\n return new Style({\n stroke: new Stroke({\n color: options.strokeColor || '#3388ff',\n width: options.strokeWidth || 2,\n }),\n fill: new Fill({\n color: options.fillColor || 'rgba(51, 136, 255, 0.2)',\n }),\n image: new Circle({\n radius: 7,\n fill: new Fill({ color: options.strokeColor || '#3388ff' }),\n stroke: new Stroke({\n color: '#ffffff',\n width: 2,\n }),\n }),\n })\n }\n\n // ==================== 动态缩放 ====================\n\n /**\n * 处理缩放变化\n */\n private handleZoomChange(): void {\n const zoom = this.getZoom()\n if (zoom !== undefined) {\n this.updateIconScale(zoom)\n }\n }\n\n /**\n * 更新图标缩放比例\n */\n private updateIconScale(zoom: number): void {\n let scale = 1\n\n if (zoom >= 14) {\n scale = 0.5\n } else if (zoom < 14 && zoom >= 12) {\n scale = 0.4\n } else if (zoom < 12) {\n scale = 0.3\n }\n\n // 更新所有图层的图标样式\n this.vectorLayers.forEach((layer: VectorLayer<VectorSource>) => {\n const features = layer.getSource()?.getFeatures()\n if (features) {\n features.forEach((feature: Feature) => {\n const style = feature.getStyle() as Style\n if (style) {\n const image = style.getImage()\n if (image instanceof Icon) {\n image.setScale(scale)\n }\n }\n })\n }\n })\n }\n\n // ==================== Overlay 管理 ====================\n\n /**\n * 创建 Overlay\n */\n createOverlay(options: OverlayOptions): void {\n const overlay = new Overlay({\n element: options.element,\n autoPan: options.autoPan !== false,\n offset: options.offset,\n positioning: options.positioning || 'bottom-center'\n })\n\n this.overlays.set(options.name, overlay)\n this.map.addOverlay(overlay)\n }\n\n /**\n * 显示 Overlay\n */\n showOverlay(name: string, coordinate: [number, number]): void {\n const overlay = this.overlays.get(name)\n if (overlay) {\n overlay.setPosition(fromLonLat(coordinate))\n }\n }\n\n /**\n * 隐藏 Overlay\n */\n hideOverlay(name: string): void {\n const overlay = this.overlays.get(name)\n if (overlay) {\n overlay.setPosition(undefined)\n }\n }\n\n /**\n * 移除 Overlay\n */\n removeOverlay(name: string): void {\n const overlay = this.overlays.get(name)\n if (overlay) {\n this.map.removeOverlay(overlay)\n this.overlays.delete(name)\n }\n }\n\n // ==================== 交互管理 ====================\n\n /**\n * 开始绘制\n */\n startDraw(options: DrawOptions): void {\n this.stopDraw()\n\n const source = options.layerName && this.vectorSources.has(options.layerName)\n ? this.vectorSources.get(options.layerName)!\n : new VectorSource()\n\n this.drawInteraction = new Draw({\n source,\n type: options.type,\n style: options.style,\n })\n\n this.map.addInteraction(this.drawInteraction)\n\n if (options.onDrawEnd) {\n this.drawInteraction.on('drawend', evt => {\n options.onDrawEnd?.(evt.feature)\n })\n }\n\n // 添加吸附交互\n this.snapInteraction = new Snap({ source })\n this.map.addInteraction(this.snapInteraction)\n }\n\n /**\n * 停止绘制\n */\n stopDraw(): void {\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction)\n this.drawInteraction = null\n }\n if (this.snapInteraction) {\n this.map.removeInteraction(this.snapInteraction)\n this.snapInteraction = null\n }\n }\n\n /**\n * 开始编辑\n */\n startModify(layerName = 'default'): void {\n this.stopModify()\n\n const source = this.vectorSources.get(layerName)\n if (!source) {\n console.warn(`图层 \"${layerName}\" 不存在`)\n return\n }\n\n this.modifyInteraction = new Modify({\n source,\n })\n\n this.map.addInteraction(this.modifyInteraction)\n\n // 添加吸附交互\n this.snapInteraction = new Snap({ source })\n this.map.addInteraction(this.snapInteraction)\n }\n\n /**\n * 停止编辑\n */\n stopModify(): void {\n if (this.modifyInteraction) {\n this.map.removeInteraction(this.modifyInteraction)\n this.modifyInteraction = null\n }\n if (this.snapInteraction) {\n this.map.removeInteraction(this.snapInteraction)\n this.snapInteraction = null\n }\n }\n\n /**\n * 开始选择\n */\n startSelect(layerName = 'default', onSelect?: (features: Feature[]) => void): void {\n this.stopSelect()\n\n this.selectInteraction = new Select({\n layers: this.vectorLayers.get(layerName) ? [this.vectorLayers.get(layerName)!] : undefined\n })\n\n this.map.addInteraction(this.selectInteraction)\n\n if (onSelect) {\n this.selectInteraction.on('select', evt => {\n onSelect(evt.selected)\n })\n }\n }\n\n /**\n * 停止选择\n */\n stopSelect(): void {\n if (this.selectInteraction) {\n this.map.removeInteraction(this.selectInteraction)\n this.selectInteraction = null\n }\n }\n\n /**\n * 获取选中的要素\n */\n getSelectedFeatures(): Feature[] {\n return this.selectInteraction?.getFeatures().getArray() || []\n }\n\n // ==================== 地图控制 ====================\n\n /**\n * 获取原始地图实例\n */\n getOlMap(): OlMap {\n return this.map\n }\n\n /**\n * 获取视图\n */\n getView(): View | undefined {\n return this.map.getView()\n }\n\n /**\n * 设置中心点\n */\n setCenter(coord: [number, number]): void {\n const view = this.getView()\n if (view) {\n view.setCenter(fromLonLat(coord))\n this.map.render()\n }\n }\n\n /**\n * 获取中心点\n */\n getCenter(): [number, number] | undefined {\n const view = this.getView()\n if (view) {\n const center = view.getCenter()\n return center ? (toLonLat(center) as [number, number]) : undefined\n }\n return undefined\n }\n\n /**\n * 设置缩放级别\n */\n setZoom(zoom: number): void {\n const view = this.getView()\n if (view) {\n view.setZoom(zoom)\n this.map.render()\n }\n }\n\n /**\n * 获取缩放级别\n */\n getZoom(): number | undefined {\n return this.getView()?.getZoom()\n }\n\n /**\n * 缩放到指定范围\n */\n fit(extent: number[] | null, options?: { padding?: number[]; duration?: number }): void {\n if (!extent) return\n\n const view = this.getView()\n if (view) {\n view.fit(extent, options)\n this.map.render()\n }\n }\n\n /**\n * 缩放到图层\n */\n fitLayer(layerName: string, options?: { padding?: number[]; duration?: number }): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n const extent = source.getExtent()\n if (extent && extent[0] !== Infinity) {\n this.fit(extent, options)\n }\n }\n }\n\n /**\n * 缩放到坐标数组\n */\n fitCoordinates(coordinates: [number, number][], options?: { padding?: number[]; duration?: number }): void {\n const extent = boundingExtent(coordinates)\n this.fit(extent, options)\n }\n\n /**\n * 添加图层\n */\n addLayer(layer: Layer): void {\n this.map.addLayer(layer.layer)\n }\n\n /**\n * 移除图层\n */\n removeMapLayer(layer: Layer): void {\n this.map.removeLayer(layer.layer)\n }\n\n /**\n * 更新地图大小\n */\n updateSize(): void {\n this.map.updateSize()\n }\n\n /**\n * 地图事件监听\n */\n on(event: string | string[], callback: (...args: unknown[]) => void): void {\n this.map.on(event as never, callback)\n }\n\n /**\n * 移除事件监听\n */\n off(event: string | string[], callback: (...args: unknown[]) => void): void {\n this.map.un(event as never, callback)\n }\n\n /**\n * 销毁地图\n */\n destroy(): void {\n this.stopDraw()\n this.stopModify()\n this.stopSelect()\n\n this.overlays.forEach((overlay: Overlay) => this.map.removeOverlay(overlay))\n this.overlays.clear()\n\n this.vectorLayers.forEach((layer: VectorLayer<VectorSource>) => this.map.removeLayer(layer))\n this.vectorLayers.clear()\n this.vectorSources.clear()\n\n this.map.setTarget(undefined)\n }\n}\n\n// ==================== 图层工厂函数 ====================\n\n/**\n * 创建 OSM 图层\n */\nexport function createOSMLayer(name = 'OSM'): Layer {\n return {\n name,\n layer: new TileLayer({\n source: new OSM(),\n }),\n }\n}\n\n/**\n * 创建 XYZ 图层(适用于高德、百度等)\n */\nexport function createXYZLayer(url: string, name = 'XYZ'): Layer {\n return {\n name,\n layer: new TileLayer({\n source: new XYZ({\n url,\n }),\n }),\n }\n}\n\n/**\n * 创建高德地图图层\n */\nexport function createGaodeLayer(name = '高德地图'): Layer {\n return createXYZLayer(\n 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',\n name\n )\n}\n\n/**\n * 创建天地图图层\n */\nexport function createTiandituLayer(token: string, type = 'vec', name = '天地图'): Layer {\n const url = `https://t{s}.tianditu.gov.cn/DataServer?T=${type}_w&x={x}&y={y}&l={z}&tk=${token}`\n return createXYZLayer(url, name)\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 经纬度转投影坐标\n */\nexport function lonLatToXY(lon: number, lat: number): number[] {\n return fromLonLat([lon, lat])\n}\n\n/**\n * 投影坐标转经纬度\n */\nexport function xyToLonLat(x: number, y: number): [number, number] {\n return toLonLat([x, y]) as [number, number]\n}\n\n/**\n * 创建点要素\n */\nexport function createPointFeature(coordinate: [number, number]): Feature {\n return new Feature({\n geometry: new Point(fromLonLat(coordinate)),\n })\n}\n\n/**\n * 创建线要素\n */\nexport function createLineFeature(coordinates: [number, number][]): Feature {\n return new Feature({\n geometry: new LineString(coordinates.map(coord => fromLonLat(coord))),\n })\n}\n\n/**\n * 创建面要素\n */\nexport function createPolygonFeature(coordinates: [number, number][][]): Feature {\n return new Feature({\n geometry: new Polygon(coordinates.map(ring => ring.map(coord => fromLonLat(coord)))),\n })\n}\n\n/**\n * 创建带样式的点要素\n */\nexport function createStyledPointFeature(coordinate: [number, number], style: Style): Feature {\n const feature = createPointFeature(coordinate)\n feature.setStyle(style)\n return feature\n}\n\n/**\n * 创建带样式的线要素\n */\nexport function createStyledLineFeature(coordinates: [number, number][], style: Style): Feature {\n const feature = createLineFeature(coordinates)\n feature.setStyle(style)\n return feature\n}\n\n/**\n * 创建带样式的面要素\n */\nexport function createStyledPolygonFeature(coordinates: [number, number][][], style: Style): Feature {\n const feature = createPolygonFeature(coordinates)\n feature.setStyle(style)\n return feature\n}\n\n/**\n * 创建图标样式\n */\nexport function createIconStyle(iconUrl: string, options?: {\n anchor?: [number, number]\n scale?: number\n color?: string\n}): Style {\n return new Style({\n image: new Icon({\n anchor: options?.anchor || [0.5, 0.5],\n src: iconUrl,\n scale: options?.scale || 1,\n color: options?.color\n })\n })\n}\n\n/**\n * 创建圆形样式\n */\nexport function createCircleStyle(options?: {\n radius?: number\n fillColor?: string\n strokeColor?: string\n strokeWidth?: number\n}): Style {\n return new Style({\n image: new Circle({\n radius: options?.radius || 7,\n fill: new Fill({ color: options?.fillColor || '#3388ff' }),\n stroke: new Stroke({\n color: options?.strokeColor || '#ffffff',\n width: options?.strokeWidth || 2,\n }),\n }),\n })\n}\n\n/**\n * 创建线样式\n */\nexport function createStrokeStyle(options?: {\n color?: string\n width?: number\n lineDash?: number[]\n}): Style {\n return new Style({\n stroke: new Stroke({\n color: options?.color || '#3388ff',\n width: options?.width || 2,\n lineDash: options?.lineDash\n }),\n })\n}\n\n/**\n * 创建面样式\n */\nexport function createFillStyle(options?: {\n fillColor?: string\n strokeColor?: string\n strokeWidth?: number\n}): Style {\n return new Style({\n stroke: new Stroke({\n color: options?.strokeColor || '#3388ff',\n width: options?.strokeWidth || 2,\n }),\n fill: new Fill({\n color: options?.fillColor || 'rgba(51, 136, 255, 0.2)',\n }),\n })\n}\n","/**\n * Storage Module - 浏览器存储工具\n *\n * 提供统一的浏览器存储操作 API\n */\n\nimport Cookies from 'js-cookie'\n\n// ==================== 类型定义 ====================\n\n/**\n * 存储数据类型\n */\nexport type StorageValue = string | number | boolean | null | undefined | object | unknown[]\n\n/**\n * 存储选项\n */\nexport interface StorageOptions {\n /** 过期时间(毫秒),0 表示永不过期 */\n ttl?: number\n}\n\n/**\n * Cookie 选项\n */\nexport interface CookieOptions extends Cookies.CookieAttributes {\n /** 过期天数 */\n days?: number\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 安全解析 JSON\n */\nfunction safeParse<T = StorageValue>(json: string | null): T | undefined {\n if (!json || json === 'undefined' || json === 'null') {\n return undefined\n }\n try {\n return JSON.parse(json) as T\n } catch {\n return json as T\n }\n}\n\n/**\n * 检查存储是否可用\n */\nfunction isStorageAvailable(storage: Storage): boolean {\n try {\n const testKey = '__storage_test__'\n storage.setItem(testKey, testKey)\n storage.removeItem(testKey)\n return true\n } catch {\n return false\n }\n}\n\n// ==================== LocalStorage ====================\n\n/**\n * 设置永久缓存\n * @param key - 缓存名称\n * @param value - 缓存内容\n * @param options - 存储选项\n * @example\n * ```ts\n * setLocal('user', { name: 'Alice', age: 25 })\n * setLocal('token', 'abc123', { ttl: 3600000 }) // 1小时后过期\n * ```\n */\nexport function setLocal<T = StorageValue>(key: string, value: T, options?: StorageOptions): void {\n if (!isStorageAvailable(window.localStorage)) {\n console.warn('LocalStorage is not available')\n return\n }\n\n const data = options?.ttl\n ? {\n value,\n expires: Date.now() + options.ttl,\n }\n : value\n\n window.localStorage.setItem(key, JSON.stringify(data))\n}\n\n/**\n * 获取永久缓存\n * @param key - 缓存名称\n * @returns 缓存内容,不存在或已过期返回 undefined\n * @example\n * ```ts\n * const user = getLocal<{ name: string; age: number }>('user')\n * console.log(user?.name) // 'Alice'\n * ```\n */\nexport function getLocal<T = StorageValue>(key: string): T | undefined {\n if (!isStorageAvailable(window.localStorage)) {\n return undefined\n }\n\n const json = window.localStorage.getItem(key)\n if (!json) {\n return undefined\n }\n\n const data = safeParse<{ value: T; expires?: number }>(json)\n\n // 检查是否有过期时间\n if (data && typeof data === 'object' && 'expires' in data && 'value' in data) {\n if (data.expires && Date.now() > data.expires) {\n removeLocal(key)\n return undefined\n }\n return data.value\n }\n\n return data as T\n}\n\n/**\n * 移除永久缓存\n * @param key - 缓存名称\n * @example\n * ```ts\n * removeLocal('user')\n * ```\n */\nexport function removeLocal(key: string): void {\n if (isStorageAvailable(window.localStorage)) {\n window.localStorage.removeItem(key)\n }\n}\n\n/**\n * 移除全部永久缓存\n * @example\n * ```ts\n * clearLocal()\n * ```\n */\nexport function clearLocal(): void {\n if (isStorageAvailable(window.localStorage)) {\n window.localStorage.clear()\n }\n}\n\n/**\n * 获取所有 localStorage 的键\n * @returns 键数组\n */\nexport function getLocalKeys(): string[] {\n if (!isStorageAvailable(window.localStorage)) {\n return []\n }\n return Object.keys(window.localStorage)\n}\n\n/**\n * 获取 localStorage 中键的数量\n * @returns 键的数量\n */\nexport function getLocalSize(): number {\n return getLocalKeys().length\n}\n\n// ==================== SessionStorage ====================\n\n/**\n * 设置临时缓存\n * @param key - 缓存名称\n * @param value - 缓存内容\n * @param options - 存储选项\n * @example\n * ```ts\n * setSession('temp', { data: [1, 2, 3] })\n * setSession('session', 'abc123', { ttl: 60000 }) // 1分钟后过期\n * ```\n */\nexport function setSession<T = StorageValue>(\n key: string,\n value: T,\n options?: StorageOptions\n): void {\n if (!isStorageAvailable(window.sessionStorage)) {\n console.warn('SessionStorage is not available')\n return\n }\n\n const data = options?.ttl\n ? {\n value,\n expires: Date.now() + options.ttl,\n }\n : value\n\n window.sessionStorage.setItem(key, JSON.stringify(data))\n}\n\n/**\n * 获取临时缓存\n * @param key - 缓存名称\n * @returns 缓存内容,不存在或已过期返回 undefined\n * @example\n * ```ts\n * const temp = getSession<{ data: number[] }>('temp')\n * console.log(temp?.data) // [1, 2, 3]\n * ```\n */\nexport function getSession<T = StorageValue>(key: string): T | undefined {\n if (!isStorageAvailable(window.sessionStorage)) {\n return undefined\n }\n\n const json = window.sessionStorage.getItem(key)\n if (!json) {\n return undefined\n }\n\n const data = safeParse<{ value: T; expires?: number }>(json)\n\n // 检查是否有过期时间\n if (data && typeof data === 'object' && 'expires' in data && 'value' in data) {\n if (data.expires && Date.now() > data.expires) {\n removeSession(key)\n return undefined\n }\n return data.value\n }\n\n return data as T\n}\n\n/**\n * 移除临时缓存\n * @param key - 缓存名称\n * @example\n * ```ts\n * removeSession('temp')\n * ```\n */\nexport function removeSession(key: string): void {\n if (isStorageAvailable(window.sessionStorage)) {\n window.sessionStorage.removeItem(key)\n }\n}\n\n/**\n * 移除全部临时缓存\n * @example\n * ```ts\n * clearSession()\n * ```\n */\nexport function clearSession(): void {\n if (isStorageAvailable(window.sessionStorage)) {\n window.sessionStorage.clear()\n }\n}\n\n/**\n * 获取所有 sessionStorage 的键\n * @returns 键数组\n */\nexport function getSessionKeys(): string[] {\n if (!isStorageAvailable(window.sessionStorage)) {\n return []\n }\n return Object.keys(window.sessionStorage)\n}\n\n/**\n * 获取 sessionStorage 中键的数量\n * @returns 键的数量\n */\nexport function getSessionSize(): number {\n return getSessionKeys().length\n}\n\n// ==================== Cookie ====================\n\n/**\n * 设置 Cookie\n * @param key - Cookie 名称\n * @param value - Cookie 值\n * @param options - Cookie 选项\n * @example\n * ```ts\n * setCookie('token', 'abc123', { days: 7 })\n * setCookie('user', { name: 'Alice' }, { secure: true }) // 自动序列化对象\n * ```\n */\nexport function setCookie(key: string, value: string | object, options?: CookieOptions): void {\n const cookieOptions: Cookies.CookieAttributes = {}\n\n // 处理过期时间\n if (options?.days) {\n cookieOptions.expires = options.days\n } else if (options?.expires !== undefined) {\n cookieOptions.expires = options.expires\n }\n\n // 复制其他选项\n if (options?.path !== undefined) {\n cookieOptions.path = options.path\n }\n if (options?.domain !== undefined) {\n cookieOptions.domain = options.domain\n }\n if (options?.secure !== undefined) {\n cookieOptions.secure = options.secure\n }\n if (options?.sameSite !== undefined) {\n cookieOptions.sameSite = options.sameSite\n }\n\n // 设置 cookie\n Cookies.set(key, value as any, cookieOptions)\n}\n\n/**\n * 获取 Cookie\n * @param key - Cookie 名称\n * @returns Cookie 值,不存在返回 undefined\n * @example\n * ```ts\n * const token = getCookie('token')\n * console.log(token) // 'abc123'\n * ```\n */\nexport function getCookie(key: string): string | undefined {\n return Cookies.get(key)\n}\n\n/**\n * 移除 Cookie\n * @param key - Cookie 名称\n * @param options - Cookie 选项(需要匹配设置时的 path 和 domain)\n * @example\n * ```ts\n * removeCookie('token')\n * removeCookie('user', { path: '/', domain: '.example.com' })\n * ```\n */\nexport function removeCookie(key: string, options?: CookieOptions): void {\n Cookies.remove(key, options)\n}\n\n/**\n * 获取所有 Cookie\n * @returns Cookie 对象\n * @example\n * ```ts\n * const cookies = getAllCookies()\n * console.log(cookies) // { token: 'abc123', user: '{\"name\":\"Alice\"}' }\n * ```\n */\nexport function getAllCookies(): Record<string, string> {\n return Cookies.get() || {}\n}\n\n/**\n * 检查 Cookie 是否存在\n * @param key - Cookie 名称\n * @returns 是否存在\n * @example\n * ```ts\n * if (hasCookie('token')) {\n * console.log('Token exists')\n * }\n * ```\n */\nexport function hasCookie(key: string): boolean {\n return Cookies.get(key) !== undefined\n}\n\n/**\n * 获取 JSON 格式的 Cookie\n * @param key - Cookie 名称\n * @returns 解析后的对象,不存在或解析失败返回 undefined\n * @example\n * ```ts\n * const user = getCookieJSON<{ name: string; age: number }>('user')\n * console.log(user?.name) // 'Alice'\n * ```\n */\nexport function getCookieJSON<T = object>(key: string): T | undefined {\n const value = Cookies.get(key)\n if (!value) {\n return undefined\n }\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\n/**\n * 设置 JSON 格式的 Cookie(自动序列化)\n * @param key - Cookie 名称\n * @param value - 对象值\n * @param options - Cookie 选项\n * @example\n * ```ts\n * setCookieJSON('user', { name: 'Alice', age: 25 }, { days: 7 })\n * ```\n */\nexport function setCookieJSON<T = object>(key: string, value: T, options?: CookieOptions): void {\n setCookie(key, JSON.stringify(value), options)\n}\n\n/**\n * 获取所有 Cookie 的数量\n * @returns Cookie 数量\n * @example\n * ```ts\n * console.log(getCookieSize()) // 3\n * ```\n */\nexport function getCookieSize(): number {\n return Object.keys(getAllCookies()).length\n}\n\n// ==================== 统一接口 ====================\n\n/**\n * 存储类型\n */\nexport type StorageType = 'local' | 'session' | 'cookie'\n\n/**\n * 统一设置存储\n * @param type - 存储类型\n * @param key - 键\n * @param value - 值\n * @param options - 选项\n * @example\n * ```ts\n * setStorage('local', 'user', { name: 'Alice' })\n * setStorage('cookie', 'token', 'abc123', { days: 7 })\n * ```\n */\nexport function setStorage<T extends string | object>(\n type: 'local',\n key: string,\n value: T,\n options?: StorageOptions\n): void\nexport function setStorage<T extends string | object>(\n type: 'session',\n key: string,\n value: T,\n options?: StorageOptions\n): void\nexport function setStorage<T extends string | object>(\n type: 'cookie',\n key: string,\n value: T,\n options?: CookieOptions\n): void\nexport function setStorage<T extends string | object>(\n type: StorageType,\n key: string,\n value: T,\n options?: StorageOptions | CookieOptions\n): void {\n switch (type) {\n case 'local':\n setLocal(key, value, options as StorageOptions)\n break\n case 'session':\n setSession(key, value, options as StorageOptions)\n break\n case 'cookie':\n setCookie(key, value, options as CookieOptions)\n break\n }\n}\n\n/**\n * 统一获取存储\n * @param type - 存储类型\n * @param key - 键\n * @returns 值\n * @example\n * ```ts\n * const user = getStorage<{ name: string }>('local', 'user')\n * const token = getStorage('cookie', 'token')\n * ```\n */\nexport function getStorage<T = StorageValue>(type: 'local', key: string): T | undefined\nexport function getStorage<T = StorageValue>(type: 'session', key: string): T | undefined\nexport function getStorage(type: 'cookie', key: string): string | undefined\nexport function getStorage<T = StorageValue>(\n type: StorageType,\n key: string\n): T | string | undefined {\n switch (type) {\n case 'local':\n return getLocal<T>(key)\n case 'session':\n return getSession<T>(key)\n case 'cookie':\n return getCookie(key)\n }\n}\n\n/**\n * 统一移除存储\n * @param type - 存储类型\n * @param key - 键\n * @example\n * ```ts\n * removeStorage('local', 'user')\n * removeStorage('cookie', 'token')\n * ```\n */\nexport function removeStorage(type: StorageType, key: string): void {\n switch (type) {\n case 'local':\n removeLocal(key)\n break\n case 'session':\n removeSession(key)\n break\n case 'cookie':\n removeCookie(key)\n break\n }\n}\n\n/**\n * 统一清除存储\n * @param type - 存储类型\n * @example\n * ```ts\n * clearStorage('local')\n * clearStorage('session')\n * clearStorage('cookie') // 注意:cookie 只能逐个删除\n * ```\n */\nexport function clearStorage(type: StorageType): void {\n switch (type) {\n case 'local':\n clearLocal()\n break\n case 'session':\n clearSession()\n break\n case 'cookie': {\n const cookies = getAllCookies()\n for (const key of Object.keys(cookies)) {\n removeCookie(key)\n }\n break\n }\n }\n}\n","/**\n * 通用工具模块\n * 提供颜色转换、图片处理、文件下载、类型判断、数组/对象操作等通用功能\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// clone 函数的类型断言使用 any 是合理的\n\nimport { debounce, throttle, type DebouncedFunction, type ThrottledFunction } from 'es-toolkit'\n\n// ==================== 防抖与节流 ====================\n\n/**\n * 防抖函数(使用 es-toolkit)\n * @param fn 要防抖的函数\n * @param wait 等待时间(毫秒)\n * @returns 防抖后的函数\n */\nexport { debounce, type DebouncedFunction }\n\n/**\n * 节流函数(使用 es-toolkit)\n * @param fn 要节流的函数\n * @param wait 等待时间(毫秒)\n * @returns 节流后的函数\n */\nexport { throttle, type ThrottledFunction }\n\n// ==================== 对象深操作 ====================\n\n/**\n * 深度克隆对象\n * @param obj 要克隆的对象\n * @returns 克隆后的对象\n */\nexport const clone = <T>(obj: T): T => {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T\n }\n if (obj instanceof Array) {\n return obj.map((item) => clone(item)) as T\n }\n if (obj instanceof Object) {\n const copy = {} as T\n Object.keys(obj).forEach((key) => {\n ;(copy as any)[key] = clone((obj as any)[key])\n })\n return copy\n }\n return obj\n}\n\n/**\n * 深度比较两个对象是否相等\n * @param a 对象 a\n * @param b 对象 b\n * @returns 是否相等\n */\nexport const isEqual = (a: any, b: any): boolean => {\n if (a === b) return true\n if (a === null || b === null) return false\n if (typeof a !== typeof b) return false\n\n if (typeof a !== 'object') return a === b\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i])) return false\n }\n return true\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false\n if (!isEqual(a[key], b[key])) return false\n }\n return true\n}\n\n/**\n * 深度合并对象\n * @param objects 要合并的对象\n * @returns 合并后的对象\n */\nexport const deepMerge = <T extends Record<string, any>>(...objects: Partial<T>[]): T => {\n const result = {} as T\n objects.forEach((obj) => {\n if (isObject(obj)) {\n Object.keys(obj).forEach((key) => {\n const value = obj[key]\n if (isObject(value) && isObject(result[key])) {\n ;(result as any)[key] = deepMerge(result[key], value)\n } else {\n ;(result as any)[key] = clone(value)\n }\n })\n }\n })\n return result\n}\n\n/**\n * 获取对象的路径值\n * @param obj 对象\n * @param path 路径(例如:'user.name')\n * @returns 路径对应的值\n */\nexport const get = (obj: any, path: string): any => {\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\n}\n\n/**\n * 设置对象的路径值\n * @param obj 对象\n * @param path 路径(例如:'user.name')\n * @param value 要设置的值\n */\nexport const set = (obj: any, path: string, value: any): void => {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const target = keys.reduce((acc, key) => {\n if (!acc[key]) acc[key] = {}\n return acc[key]\n }, obj)\n target[lastKey] = value\n}\n\n/**\n * 省略对象中的某些属性\n * @param obj 对象\n * @param keys 要省略的键\n * @returns 省略后的对象\n */\nexport const omit = <T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> => {\n const result = { ...obj }\n keys.forEach((key) => delete result[key])\n return result\n}\n\n/**\n * 选择对象中的某些属性\n * @param obj 对象\n * @param keys 要选择的键\n * @returns 选择后的对象\n */\nexport const pick = <T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> => {\n const result = {} as Pick<T, K>\n keys.forEach((key) => {\n if (key in obj) {\n result[key] = obj[key]\n }\n })\n return result\n}\n\n// ==================== 类型判断 ====================\n\n/**\n * 判断是否为对象\n * @param value 要判断的值\n * @returns 是否为对象\n */\nexport const isObject = (value: any): value is Record<string, any> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * 判断是否为数组\n * @param value 要判断的值\n * @returns 是否为数组\n */\nexport const isArray = (value: any): value is any[] => {\n return Array.isArray(value)\n}\n\n/**\n * 判断是否为字符串\n * @param value 要判断的值\n * @returns 是否为字符串\n */\nexport const isString = (value: any): value is string => {\n return typeof value === 'string'\n}\n\n/**\n * 判断是否为数字\n * @param value 要判断的值\n * @returns 是否为数字\n */\nexport const isNumber = (value: any): value is number => {\n return typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * 判断是否为布尔值\n * @param value 要判断的值\n * @returns 是否为布尔值\n */\nexport const isBoolean = (value: any): value is boolean => {\n return typeof value === 'boolean'\n}\n\n/**\n * 判断是否为函数\n * @param value 要判断的值\n * @returns 是否为函数\n */\nexport const isFunction = (value: any): value is Function => {\n return typeof value === 'function'\n}\n\n/**\n * 判断是否为空值\n * @param value 要判断的值\n * @returns 是否为空\n */\nexport const isEmpty = (value: any): boolean => {\n if (value === null || value === undefined) return true\n if (isString(value) || Array.isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n}\n\n// ==================== 数组操作 ====================\n\n/**\n * 数组去重\n * @param array 数组\n * @returns 去重后的数组\n */\nexport const uniq = <T>(array: T[]): T[] => {\n return [...new Set(array)]\n}\n\n/**\n * 数组排序\n * @param array 数组\n * @param key 排序键\n * @returns 排序后的数组\n */\nexport const sortBy = <T>(array: T[], key: keyof T | ((item: T) => any)): T[] => {\n const sortFn = typeof key === 'function' ? key : (item: T) => item[key]\n return [...array].sort((a, b) => {\n const valueA = sortFn(a)\n const valueB = sortFn(b)\n if (valueA < valueB) return -1\n if (valueA > valueB) return 1\n return 0\n })\n}\n\n/**\n * 数组分块\n * @param array 数组\n * @param size 分块大小\n * @returns 分块后的二维数组\n */\nexport const chunk = <T>(array: T[], size: number): T[][] => {\n const result: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size))\n }\n return result\n}\n\n/**\n * 数组分组\n * @param array 数组\n * @param key 分组键\n * @returns 分组后的对象\n */\nexport const groupBy = <T>(\n array: T[],\n key: keyof T | ((item: T) => string)\n): Record<string, T[]> => {\n const groupFn = typeof key === 'function' ? key : (item: T) => String(item[key])\n return array.reduce(\n (result, item) => {\n const groupKey = groupFn(item)\n if (!result[groupKey]) {\n result[groupKey] = []\n }\n result[groupKey].push(item)\n return result\n },\n {} as Record<string, T[]>\n )\n}\n\n/**\n * 数组求和\n * @param array 数组\n * @returns 总和\n */\nexport const sum = (array: number[]): number => {\n return array.reduce((acc, num) => acc + num, 0)\n}\n\n/**\n * 数组平均值\n * @param array 数组\n * @returns 平均值\n */\nexport const avg = (array: number[]): number => {\n return array.length > 0 ? sum(array) / array.length : 0\n}\n\n/**\n * 数组最大值\n * @param array 数组\n * @returns 最大值\n */\nexport const max = (array: number[]): number => {\n return Math.max(...array)\n}\n\n/**\n * 数组最小值\n * @param array 数组\n * @returns 最小值\n */\nexport const min = (array: number[]): number => {\n return Math.min(...array)\n}\n\n// ==================== 字符串转换 ====================\n\n/**\n * 驼峰转下划线\n * @param str 字符串\n * @returns 转换后的字符串\n */\nexport const camelToSnake = (str: string): string => {\n return str.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`)\n}\n\n/**\n * 下划线转驼峰\n * @param str 字符串\n * @returns 转换后的字符串\n */\nexport const snakeToCamel = (str: string): string => {\n return str.replace(/_([a-z])/g, (_, match) => match.toUpperCase())\n}\n\n/**\n * 首字母大写\n * @param str 字符串\n * @returns 转换后的字符串\n */\nexport const capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\n/**\n * 截断字符串\n * @param str 字符串\n * @param length 最大长度\n * @param suffix 后缀\n * @returns 截断后的字符串\n */\nexport const truncate = (str: string, length: number = 100, suffix: string = '...'): string => {\n if (str.length <= length) return str\n return `${str.slice(0, length)}${suffix}`\n}\n\n// ==================== 格式化函数 ====================\n\n/**\n * 格式化文件大小\n * @param bytes 字节数\n * @returns 格式化后的字符串\n */\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n}\n\n/**\n * 格式化数字(千分位)\n * @param num 数字\n * @returns 格式化后的字符串\n */\nexport const formatNumber = (num: number): string => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n}\n\n// ==================== 验证函数 ====================\n\n/**\n * 检查是否为有效的 URL\n * @param str 字符串\n * @returns 是否为有效 URL\n */\nexport const isValidUrl = (str: string): boolean => {\n try {\n new URL(str)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * 检查是否为有效的邮箱\n * @param email 邮箱地址\n * @returns 是否为有效邮箱\n */\nexport const isValidEmail = (email: string): boolean => {\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return regex.test(email)\n}\n\n/**\n * 检查是否为有效的手机号(中国)\n * @param phone 手机号\n * @returns 是否为有效手机号\n */\nexport const isValidPhone = (phone: string): boolean => {\n const regex = /^1[3-9]\\d{9}$/\n return regex.test(phone)\n}\n\n// ==================== 其他工具函数 ====================\n\n/**\n * 生成范围内的随机整数\n * @param min 最小值\n * @param max 最大值\n * @returns 随机整数\n */\nexport const randomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * 生成唯一 ID\n * @param prefix 前缀\n * @returns 唯一 ID\n */\nexport const uniqueId = (prefix: string = ''): string => {\n return `${prefix}${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * 延迟执行\n * @param ms 延迟时间(毫秒)\n * @returns Promise\n */\nexport const delay = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * 重试函数\n * @param fn 要执行的函数\n * @param retries 重试次数\n * @param delayMs 重试延迟\n * @returns Promise\n */\nexport const retry = async <T>(\n fn: () => Promise<T>,\n retries: number = 3,\n delayMs: number = 1000\n): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n if (retries <= 0) {\n throw error\n }\n await delay(delayMs)\n return retry(fn, retries - 1, delayMs)\n }\n}\n\n// ==================== 颜色转换 ====================\n\n/**\n * Hex 颜色转 RGB 颜色\n * @param str Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @returns RGB 颜色数组 [r, g, b]\n */\nexport const hexToRgb = (str: string): number[] | null => {\n const hexRegex = /^#?([0-9A-Fa-f]{6})$/\n if (!hexRegex.test(str)) {\n return null\n }\n\n const hex = str.replace('#', '')\n const r = parseInt(hex.substring(0, 2), 16)\n const g = parseInt(hex.substring(2, 4), 16)\n const b = parseInt(hex.substring(4, 6), 16)\n\n return [r, g, b]\n}\n\n/**\n * Hex 颜色转 RGB 字符串\n * @param str Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @returns RGB 字符串(如 rgb(255, 255, 255))\n */\nexport const hexToRgbString = (str: string): string | null => {\n const rgb = hexToRgb(str)\n if (!rgb) {\n return null\n }\n return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`\n}\n\n/**\n * RGB 颜色转 Hex 颜色\n * @param r 红色值 (0-255)\n * @param g 绿色值 (0-255)\n * @param b 蓝色值 (0-255)\n * @returns Hex 颜色字符串(如 #FFFFFF)\n */\nexport const rgbToHex = (r: number, g: number, b: number): string | null => {\n const numRegex = /^\\d{1,3}$/\n if (!numRegex.test(r.toString()) || !numRegex.test(g.toString()) || !numRegex.test(b.toString())) {\n return null\n }\n\n if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {\n return null\n }\n\n const toHex = (num: number): string => {\n const hex = num.toString(16)\n return hex.length === 1 ? `0${hex}` : hex\n }\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\n}\n\n/**\n * RGB 颜色转 Hex 颜色(数组版本)\n * @param rgb RGB 数组 [r, g, b]\n * @returns Hex 颜色字符串(如 #FFFFFF)\n */\nexport const rgbArrayToHex = (rgb: number[]): string | null => {\n if (rgb.length !== 3) {\n return null\n }\n return rgbToHex(rgb[0], rgb[1], rgb[2])\n}\n\n/**\n * 变浅颜色值\n * @param color Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @param alpha 透明度因子 (0-1),值越大颜色越浅\n * @returns 变浅后的 Hex 颜色\n */\nexport const getLightColor = (color: string, alpha: number): string | null => {\n const rgb = hexToRgb(color)\n if (!rgb) {\n return null\n }\n\n const [r, g, b] = rgb\n const newR = Math.floor((255 - r) * alpha + r)\n const newG = Math.floor((255 - g) * alpha + g)\n const newB = Math.floor((255 - b) * alpha + b)\n\n return rgbToHex(newR, newG, newB)\n}\n\n/**\n * 变深颜色值\n * @param color Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @param alpha 暗化因子 (0-1),值越大颜色越深\n * @returns 变深后的 Hex 颜色\n */\nexport const getDarkColor = (color: string, alpha: number): string | null => {\n const rgb = hexToRgb(color)\n if (!rgb) {\n return null\n }\n\n const [r, g, b] = rgb\n const newR = Math.floor(r * (1 - alpha))\n const newG = Math.floor(g * (1 - alpha))\n const newB = Math.floor(b * (1 - alpha))\n\n return rgbToHex(newR, newG, newB)\n}\n\n// ==================== 图片处理 ====================\n\n/**\n * 图片转 Base64\n * @param url 图片 URL\n * @param type 图片类型(默认 image/png)\n * @returns Base64 字符串\n */\nexport const imgToBase64 = (url: string, type: 'image/jpeg' | 'image/png' = 'image/png'): Promise<string> => {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.crossOrigin = 'anonymous'\n\n image.onload = () => {\n const canvas = document.createElement('canvas')\n canvas.width = image.naturalWidth\n canvas.height = image.naturalHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n reject(new Error('Failed to get canvas context'))\n return\n }\n\n ctx.drawImage(image, 0, 0)\n const base64 = canvas.toDataURL(type)\n resolve(base64)\n }\n\n image.onerror = (err) => {\n reject(new Error(`Failed to load image: ${String(err)}`))\n }\n\n image.src = url\n })\n}\n\n/**\n * Base64 转 File 对象\n * @param base64 Base64 字符串\n * @param fileName 文件名\n * @param mimeType MIME 类型(默认 image/jpeg)\n * @returns File 对象\n */\nexport const base64toFile = (\n base64: string,\n fileName: string,\n mimeType: string = 'image/jpeg'\n): File => {\n const dataArr = base64.split(',')\n const byteString = atob(dataArr[1])\n const u8Arr = new Uint8Array(byteString.length)\n\n for (let i = 0; i < byteString.length; i++) {\n u8Arr[i] = byteString.charCodeAt(i)\n }\n\n return new File([u8Arr], fileName, { type: mimeType })\n}\n\n/**\n * Base64 转 Blob 对象\n * @param base64 Base64 字符串\n * @param mimeType MIME 类型\n * @returns Blob 对象\n */\nexport const base64toBlob = (base64: string, mimeType: string = 'image/jpeg'): Blob => {\n const dataArr = base64.split(',')\n const byteString = atob(dataArr[1])\n const u8Arr = new Uint8Array(byteString.length)\n\n for (let i = 0; i < byteString.length; i++) {\n u8Arr[i] = byteString.charCodeAt(i)\n }\n\n return new Blob([u8Arr], { type: mimeType })\n}\n\n// ==================== 文件下载 ====================\n\n/**\n * 下载文件\n * @param url 文件 URL 或 Data URL\n * @param fileName 文件名\n * @param target 是否在新标签页打开(默认 false)\n */\nexport const downloadFile = (url: string, fileName: string = '文件', target = false): void => {\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = url\n\n if (target) {\n link.target = '_blank'\n } else {\n link.setAttribute('download', fileName)\n }\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n}\n\n/**\n * 下载 Blob 文件\n * @param blob Blob 对象\n * @param fileName 文件名\n */\nexport const downloadBlob = (blob: Blob, fileName: string): void => {\n const url = URL.createObjectURL(blob)\n downloadFile(url, fileName)\n URL.revokeObjectURL(url)\n}\n\n/**\n * 下载 Base64 文件\n * @param base64 Base64 字符串\n * @param fileName 文件名\n * @param mimeType MIME 类型\n */\nexport const downloadBase64 = (base64: string, fileName: string, mimeType: string = 'image/jpeg'): void => {\n const blob = base64toBlob(base64, mimeType)\n downloadBlob(blob, fileName)\n}\n\n// ==================== 剪贴板操作 ====================\n\n/**\n * 复制文本到剪贴板\n * @param text 要复制的文本\n * @returns 是否成功\n */\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text)\n return true\n }\n\n // 降级方案\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n const success = document.execCommand('copy')\n document.body.removeChild(textarea)\n return success\n } catch {\n return false\n }\n}\n\n/**\n * 从剪贴板读取文本\n * @returns 剪贴板文本\n */\nexport const readFromClipboard = async (): Promise<string> => {\n try {\n if (navigator.clipboard && navigator.clipboard.readText) {\n return await navigator.clipboard.readText()\n }\n\n // 降级方案(需要用户权限)\n return ''\n } catch {\n return ''\n }\n}\n","/**\n * 加密解密模块\n * 基于 crypto-js 提供常用的加密解密功能\n */\n\nimport * as CryptoJS from 'crypto-js'\n\n/**\n * 加密模式类型\n */\nexport type CryptoMode = any\n\n/**\n * 填充方式类型\n */\nexport type CryptoPadding = any\n\n/**\n * MD5 加密\n * @param message 要加密的消息\n * @returns MD5 哈希值\n */\nexport const md5 = (message: string): string => {\n return CryptoJS.MD5(message).toString()\n}\n\n/**\n * SHA1 加密\n * @param message 要加密的消息\n * @returns SHA1 哈希值\n */\nexport const sha1 = (message: string): string => {\n return CryptoJS.SHA1(message).toString()\n}\n\n/**\n * SHA256 加密\n * @param message 要加密的消息\n * @returns SHA256 哈希值\n */\nexport const sha256 = (message: string): string => {\n return CryptoJS.SHA256(message).toString()\n}\n\n/**\n * SHA512 加密\n * @param message 要加密的消息\n * @returns SHA512 哈希值\n */\nexport const sha512 = (message: string): string => {\n return CryptoJS.SHA512(message).toString()\n}\n\n/**\n * Hmac-MD5 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-MD5 哈希值\n */\nexport const hmacMD5 = (message: string, key: string): string => {\n return CryptoJS.HmacMD5(message, key).toString()\n}\n\n/**\n * Hmac-SHA1 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-SHA1 哈希值\n */\nexport const hmacSHA1 = (message: string, key: string): string => {\n return CryptoJS.HmacSHA1(message, key).toString()\n}\n\n/**\n * Hmac-SHA256 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-SHA256 哈希值\n */\nexport const hmacSHA256 = (message: string, key: string): string => {\n return CryptoJS.HmacSHA256(message, key).toString()\n}\n\n/**\n * Hmac-SHA512 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-SHA512 哈希值\n */\nexport const hmacSHA512 = (message: string, key: string): string => {\n return CryptoJS.HmacSHA512(message, key).toString()\n}\n\n/**\n * AES 加密\n * @param message 要加密的消息\n * @param key 密钥(16/24/32 字节)\n * @param iv 初始向量(可选,16 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 加密后的密文(Base64 格式)\n */\nexport const aesEncrypt = (\n message: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const encrypted = CryptoJS.AES.encrypt(message, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return encrypted.toString()\n}\n\n/**\n * AES 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥(16/24/32 字节)\n * @param iv 初始向量(可选,16 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 解密后的明文\n */\nexport const aesDecrypt = (\n ciphertext: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const decrypted = CryptoJS.AES.decrypt(ciphertext, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * DES 加密\n * @param message 要加密的消息\n * @param key 密钥(8 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 加密后的密文(Base64 格式)\n */\nexport const desEncrypt = (\n message: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const encrypted = CryptoJS.DES.encrypt(message, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return encrypted.toString()\n}\n\n/**\n * DES 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥(8 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 解密后的明文\n */\nexport const desDecrypt = (\n ciphertext: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const decrypted = CryptoJS.DES.decrypt(ciphertext, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Triple DES (3DES) 加密\n * @param message 要加密的消息\n * @param key 密钥(24 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 加密后的密文(Base64 格式)\n */\nexport const tripleDesEncrypt = (\n message: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const encrypted = CryptoJS.TripleDES.encrypt(message, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return encrypted.toString()\n}\n\n/**\n * Triple DES (3DES) 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥(24 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 解密后的明文\n */\nexport const tripleDesDecrypt = (\n ciphertext: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const decrypted = CryptoJS.TripleDES.decrypt(ciphertext, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * RC4 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns 加密后的密文(Base64 格式)\n */\nexport const rc4Encrypt = (message: string, key: string): string => {\n const encrypted = CryptoJS.RC4.encrypt(message, key)\n return encrypted.toString()\n}\n\n/**\n * RC4 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥\n * @returns 解密后的明文\n */\nexport const rc4Decrypt = (ciphertext: string, key: string): string => {\n const decrypted = CryptoJS.RC4.decrypt(ciphertext, key)\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Rabbit 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns 加密后的密文(Base64 格式)\n */\nexport const rabbitEncrypt = (message: string, key: string): string => {\n const encrypted = CryptoJS.Rabbit.encrypt(message, key)\n return encrypted.toString()\n}\n\n/**\n * Rabbit 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥\n * @returns 解密后的明文\n */\nexport const rabbitDecrypt = (ciphertext: string, key: string): string => {\n const decrypted = CryptoJS.Rabbit.decrypt(ciphertext, key)\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Base64 编码\n * @param message 要编码的消息\n * @returns Base64 编码后的字符串\n */\nexport const base64Encode = (message: string): string => {\n return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(message))\n}\n\n/**\n * Base64 解码\n * @param encoded Base64 编码的字符串\n * @returns 解码后的原始消息\n */\nexport const base64Decode = (encoded: string): string => {\n return CryptoJS.enc.Base64.parse(encoded).toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * UTF-8 编码\n * @param message 要编码的消息\n * @returns UTF-8 编码后的字符串\n */\nexport const utf8Encode = (message: string): string => {\n return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Utf8.parse(message))\n}\n\n/**\n * UTF-8 解码\n * @param encoded UTF-8 编码的字符串\n * @returns 解码后的原始消息\n */\nexport const utf8Decode = (encoded: string): string => {\n return CryptoJS.enc.Utf8.parse(encoded).toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Hex 编码\n * @param message 要编码的消息\n * @returns Hex 编码后的字符串\n */\nexport const hexEncode = (message: string): string => {\n return CryptoJS.enc.Hex.stringify(CryptoJS.enc.Utf8.parse(message))\n}\n\n/**\n * Hex 解码\n * @param encoded Hex 编码的字符串\n * @returns 解码后的原始消息\n */\nexport const hexDecode = (encoded: string): string => {\n return CryptoJS.enc.Hex.parse(encoded).toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * 生成随机密钥\n * @param length 密钥长度(字节)\n * @returns 随机密钥(Base64 格式)\n */\nexport const generateKey = (length: number = 32): string => {\n const key = CryptoJS.lib.WordArray.random(length)\n return CryptoJS.enc.Base64.stringify(key)\n}\n\n/**\n * 生成随机 IV(初始向量)\n * @param length IV 长度(字节,默认 16)\n * @returns 随机 IV(Base64 格式)\n */\nexport const generateIV = (length: number = 16): string => {\n const iv = CryptoJS.lib.WordArray.random(length)\n return CryptoJS.enc.Base64.stringify(iv)\n}\n\n/**\n * PBKDF2 密钥派生\n * @param password 密码\n * @param salt 盐值\n * @param iterations 迭代次数\n * @param keySize 密钥长度(字节)\n * @returns 派生的密钥(Hex 格式)\n */\nexport const pbkdf2 = (password: string, salt: string, iterations: number = 1000, keySize: number = 32): string => {\n const key = CryptoJS.PBKDF2(password, salt, {\n keySize: keySize / 4,\n iterations: iterations\n })\n return key.toString()\n}\n\n/**\n * 生成 UUID v4\n * @returns UUID 字符串\n */\nexport const uuid = (): string => {\n return CryptoJS.lib.WordArray.random(16).toString()\n}\n\n// 导出 CryptoJS 相关类型和常量\nexport { CryptoJS }\n","/**\n * WebSocket Module - WebSocket 工具\n *\n * 提供简化的 WebSocket 连接、消息发送、心跳检测和重连机制\n */\n\n// ==================== 类型定义 ====================\n\n/**\n * WebSocket 连接状态\n */\nexport enum WebSocketState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\n/**\n * WebSocket 配置选项\n */\nexport interface WebSocketOptions {\n /** WebSocket 服务器地址 */\n url: string\n /** 协议(wss:// 或 ws://),默认自动检测 */\n protocol?: 'ws' | 'wss'\n /** 子协议 */\n protocols?: string | string[]\n /** 是否自动重连,默认 true */\n autoReconnect?: boolean\n /** 重连次数,默认 3 */\n reconnectAttempts?: number\n /** 重连间隔(毫秒),默认 3000 */\n reconnectInterval?: number\n /** 心跳检测间隔(毫秒),默认 30000 */\n heartbeatInterval?: number\n /** 心跳消息内容,默认 'ping' */\n heartbeatMessage?: string | object\n /** 心跳超时时间(毫秒),默认 5000 */\n heartbeatTimeout?: number\n /** 连接超时时间(毫秒),默认 10000 */\n connectTimeout?: number\n /** 是否记录日志,默认 true */\n debug?: boolean\n}\n\n/**\n * WebSocket 消息类型\n */\nexport type WebSocketMessage = string | object | ArrayBuffer | Blob\n\n/**\n * WebSocket 事件处理器\n */\nexport interface WebSocketEventHandlers {\n /** 连接成功回调 */\n onOpen?: (event: Event) => void\n /** 接收消息回调 */\n onMessage?: (data: WebSocketMessage, event: MessageEvent) => void\n /** 连接关闭回调 */\n onClose?: (event: CloseEvent) => void\n /** 错误回调 */\n onError?: (event: Event) => void\n /** 重连开始回调 */\n onReconnect?: (attempt: number) => void\n /** 重连成功回调 */\n onReconnectSuccess?: (attempt: number) => void\n /** 重连失败回调 */\n onReconnectFailed?: () => void\n /** 心跳回调 */\n onHeartbeat?: () => void\n /** 心跳超时回调 */\n onHeartbeatTimeout?: () => void\n}\n\n/**\n * WebSocket 实例接口\n */\nexport interface IWebSocketClient {\n /** 连接 WebSocket */\n connect(): void\n /** 断开连接 */\n disconnect(): void\n /** 发送消息 */\n send(data: WebSocketMessage): Promise<void>\n /** 发送消息(不带 Promise) */\n sendSync(data: WebSocketMessage): void\n /** 获取连接状态 */\n getState(): WebSocketState\n /** 是否已连接 */\n isConnected(): boolean\n /** 获取 WebSocket 实例 */\n getInstance(): WebSocket | null\n /** 设置事件处理器 */\n on<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler: WebSocketEventHandlers[K]\n ): void\n /** 移除事件处理器 */\n off<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler?: WebSocketEventHandlers[K]\n ): void\n /** 重新连接 */\n reconnect(): void\n}\n\n// ==================== WebSocket 客户端类 ====================\n\n/**\n * WebSocket 客户端类\n */\nexport class WebSocketClient implements IWebSocketClient {\n private ws: WebSocket | null = null\n private options: Required<Omit<WebSocketOptions, 'protocols' | 'debug'>> &\n Pick<WebSocketOptions, 'protocols' | 'debug'>\n private handlers: WebSocketEventHandlers = {}\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n private heartbeatTimeoutTimer: ReturnType<typeof setTimeout> | null = null\n private reconnectCount = 0\n private isManualDisconnect = false\n private messageQueue: WebSocketMessage[] = []\n private connectResolve: (() => void) | null = null\n private connectReject: ((error: Error) => void) | null = null\n\n constructor(options: WebSocketOptions) {\n this.options = {\n url: options.url,\n protocol: options.protocol || (options.url.startsWith('https') ? 'wss' : 'ws'),\n protocols: options.protocols || [],\n autoReconnect: options.autoReconnect ?? true,\n reconnectAttempts: options.reconnectAttempts ?? 3,\n reconnectInterval: options.reconnectInterval ?? 3000,\n heartbeatInterval: options.heartbeatInterval ?? 30000,\n heartbeatMessage: options.heartbeatMessage ?? 'ping',\n heartbeatTimeout: options.heartbeatTimeout ?? 5000,\n connectTimeout: options.connectTimeout ?? 10000,\n debug: options.debug ?? true,\n }\n\n // 自动连接\n if (options.autoReconnect !== false) {\n this.connect()\n }\n }\n\n /**\n * 连接 WebSocket\n */\n connect(): void {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n this.log('WebSocket already connected or connecting')\n return\n }\n\n this.isManualDisconnect = false\n this.reconnectCount = 0\n\n const protocol = this.options.url.startsWith('ws://') || this.options.url.startsWith('wss://')\n ? ''\n : `${this.options.protocol}://`\n\n const wsUrl = protocol ? `${protocol}${this.options.url}` : this.options.url\n\n this.log(`Connecting to ${wsUrl}`)\n\n try {\n this.ws = new WebSocket(wsUrl, this.options.protocols)\n\n this.setupEventHandlers()\n\n // 设置连接超时\n setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close()\n this.log('Connection timeout')\n if (this.connectReject) {\n this.connectReject(new Error('Connection timeout'))\n this.connectResolve = null\n this.connectReject = null\n }\n }\n }, this.options.connectTimeout)\n } catch (error) {\n this.log('Connection failed:', error)\n this.handleError(error as Error)\n }\n }\n\n /**\n * 断开连接\n */\n disconnect(): void {\n this.isManualDisconnect = true\n this.cleanup()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.log('Disconnected manually')\n }\n\n /**\n * 发送消息(异步)\n */\n async send(data: WebSocketMessage): Promise<void> {\n if (!this.isConnected()) {\n return new Promise((resolve, reject) => {\n this.messageQueue.push(data)\n const checkConnection = () => {\n if (this.isConnected()) {\n this.sendSync(data)\n resolve()\n } else if (!this.ws) {\n reject(new Error('WebSocket is not connected'))\n } else {\n setTimeout(checkConnection, 100)\n }\n }\n checkConnection()\n })\n }\n\n this.sendSync(data)\n }\n\n /**\n * 发送消息(同步)\n */\n sendSync(data: WebSocketMessage): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log('WebSocket is not connected, message queued')\n this.messageQueue.push(data)\n return\n }\n\n try {\n const message = typeof data === 'object' ? JSON.stringify(data) : data\n this.ws.send(message)\n this.log('Message sent:', message)\n } catch (error) {\n this.log('Send error:', error)\n this.handleError(error as Error)\n }\n }\n\n /**\n * 获取连接状态\n */\n getState(): WebSocketState {\n return this.ws?.readyState ?? WebSocketState.CLOSED\n }\n\n /**\n * 是否已连接\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN\n }\n\n /**\n * 获取 WebSocket 实例\n */\n getInstance(): WebSocket | null {\n return this.ws\n }\n\n /**\n * 设置事件处理器\n */\n on<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler: WebSocketEventHandlers[K]\n ): void {\n this.handlers[event] = handler\n }\n\n /**\n * 移除事件处理器\n */\n off<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler?: WebSocketEventHandlers[K]\n ): void {\n if (!handler || this.handlers[event] === handler) {\n delete this.handlers[event]\n }\n }\n\n /**\n * 重新连接\n */\n reconnect(): void {\n this.disconnect()\n this.reconnectCount = 0\n this.isManualDisconnect = false\n this.connect()\n }\n\n /**\n * 设置事件处理器\n */\n private setupEventHandlers(): void {\n if (!this.ws) return\n\n this.ws.onopen = (event) => {\n this.log('Connected')\n this.reconnectCount = 0\n\n // 发送队列中的消息\n while (this.messageQueue.length > 0) {\n const message = this.messageQueue.shift()\n if (message) {\n this.sendSync(message)\n }\n }\n\n // 启动心跳\n this.startHeartbeat()\n\n // 触发 onOpen 回调\n if (this.handlers.onOpen) {\n this.handlers.onOpen(event)\n }\n\n // 解析连接 Promise\n if (this.connectResolve) {\n this.connectResolve()\n this.connectResolve = null\n this.connectReject = null\n }\n }\n\n this.ws.onmessage = (event) => {\n this.log('Message received:', event.data)\n\n let data: WebSocketMessage = event.data\n\n // 尝试解析 JSON\n if (typeof event.data === 'string') {\n try {\n data = JSON.parse(event.data)\n } catch {\n // 不是 JSON 格式,保持原样\n }\n }\n\n // 触发 onMessage 回调\n if (this.handlers.onMessage) {\n this.handlers.onMessage(data, event)\n }\n }\n\n this.ws.onclose = (event) => {\n this.log('Connection closed:', event.code, event.reason)\n this.cleanup()\n\n // 触发 onClose 回调\n if (this.handlers.onClose) {\n this.handlers.onClose(event)\n }\n\n // 自动重连\n if (!this.isManualDisconnect && this.options.autoReconnect) {\n this.attemptReconnect()\n }\n }\n\n this.ws.onerror = (event) => {\n this.log('Error:', event)\n\n // 触发 onError 回调\n if (this.handlers.onError) {\n this.handlers.onError(event)\n }\n }\n }\n\n /**\n * 尝试重连\n */\n private attemptReconnect(): void {\n if (this.reconnectCount >= this.options.reconnectAttempts) {\n this.log('Reconnect failed, max attempts reached')\n this.cleanup()\n\n // 触发 onReconnectFailed 回调\n if (this.handlers.onReconnectFailed) {\n this.handlers.onReconnectFailed()\n }\n\n if (this.connectReject) {\n this.connectReject(new Error('Reconnect failed'))\n this.connectResolve = null\n this.connectReject = null\n }\n return\n }\n\n this.reconnectCount++\n this.log(`Reconnecting... Attempt ${this.reconnectCount}/${this.options.reconnectAttempts}`)\n\n // 触发 onReconnect 回调\n if (this.handlers.onReconnect) {\n this.handlers.onReconnect(this.reconnectCount)\n }\n\n this.reconnectTimer = setTimeout(() => {\n this.connect()\n }, this.options.reconnectInterval)\n }\n\n /**\n * 启动心跳\n */\n private startHeartbeat(): void {\n this.stopHeartbeat()\n\n this.heartbeatTimer = setInterval(() => {\n if (this.isConnected()) {\n const message = this.options.heartbeatMessage\n this.log('Sending heartbeat')\n\n // 触发 onHeartbeat 回调\n if (this.handlers.onHeartbeat) {\n this.handlers.onHeartbeat()\n }\n\n // 发送心跳消息\n this.sendSync(message)\n\n // 设置心跳超时检测\n this.heartbeatTimeoutTimer = setTimeout(() => {\n this.log('Heartbeat timeout')\n\n // 触发 onHeartbeatTimeout 回调\n if (this.handlers.onHeartbeatTimeout) {\n this.handlers.onHeartbeatTimeout()\n }\n\n // 关闭连接,触发重连\n if (this.ws) {\n this.ws.close()\n }\n }, this.options.heartbeatTimeout)\n }\n }, this.options.heartbeatInterval)\n }\n\n /**\n * 停止心跳\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer)\n this.heartbeatTimer = null\n }\n if (this.heartbeatTimeoutTimer) {\n clearTimeout(this.heartbeatTimeoutTimer)\n this.heartbeatTimeoutTimer = null\n }\n }\n\n /**\n * 清理资源\n */\n private cleanup(): void {\n this.stopHeartbeat()\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n /**\n * 处理错误\n */\n private handleError(error: Error): void {\n this.log('Error:', error.message)\n\n // 触发 onError 回调\n if (this.handlers.onError) {\n this.handlers.onError(new ErrorEvent('error', { error }))\n }\n }\n\n /**\n * 日志输出\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[WebSocket]', ...args)\n }\n }\n}\n\n// ==================== 工厂函数 ====================\n\n/**\n * 创建 WebSocket 客户端\n * @param options - 配置选项\n * @returns WebSocket 客户端实例\n * @example\n * ```ts\n * const ws = createWebSocket({\n * url: 'echo.websocket.org',\n * autoReconnect: true,\n * onMessage: (data) => console.log('Received:', data)\n * })\n *\n * ws.send('Hello, WebSocket!')\n * ```\n */\nexport function createWebSocket(options: WebSocketOptions): IWebSocketClient {\n return new WebSocketClient(options)\n}\n\n/**\n * 快速连接 WebSocket\n * @param url - WebSocket 服务器地址\n * @param handlers - 事件处理器\n * @returns WebSocket 客户端实例\n * @example\n * ```ts\n * const ws = quickConnect('echo.websocket.org', {\n * onMessage: (data) => console.log('Received:', data)\n * })\n * ```\n */\nexport function quickConnect(\n url: string,\n handlers?: WebSocketEventHandlers\n): IWebSocketClient {\n const client = new WebSocketClient({ url, autoReconnect: true })\n\n if (handlers) {\n Object.entries(handlers).forEach(([event, handler]) => {\n client.on(event as keyof WebSocketEventHandlers, handler)\n })\n }\n\n return client\n}\n\n// ==================== 导出 ====================\n\nexport default {\n WebSocketClient,\n createWebSocket,\n quickConnect,\n WebSocketState,\n}\n","/**\n * Event Module - 事件管理工具\n *\n * 基于 mitt 封装的事件发布订阅系统,提供类型安全的事件管理\n */\n\nimport mitt, { Emitter, EventType, Handler } from 'mitt'\n\n// ==================== 类型定义 ====================\n\n/**\n * 事件类型映射\n * 使用字符串索引签名,可以注册任意事件\n */\nexport type EventHandler<T = any> = (data: T) => void | Promise<void>\n\n/**\n * 事件总线配置选项\n */\nexport interface EventBusOptions {\n /** 是否记录日志 */\n debug?: boolean\n /** 事件名称前缀 */\n prefix?: string\n}\n\n/**\n * 事件监听器元数据\n */\nexport interface ListenerMeta {\n /** 事件名称 */\n event: string\n /** 处理函数 */\n handler: EventHandler\n /** 是否只监听一次 */\n once: boolean\n /** 监听时间 */\n timestamp: number\n}\n\n/**\n * 事件总线实例接口\n */\nexport interface IEventBus<E extends Record<EventType, unknown>> {\n /**\n * 订阅事件\n * @param event - 事件名称\n * @param handler - 事件处理函数\n * @returns 取消订阅的函数\n */\n on<K extends keyof E>(event: K, handler: EventHandler<E[K]>): () => void\n on(event: string | string[], handler: EventHandler): () => void\n\n /**\n * 订阅事件(只执行一次)\n * @param event - 事件名称\n * @param handler - 事件处理函数\n * @returns 取消订阅的函数\n */\n once<K extends keyof E>(event: K, handler: EventHandler<E[K]>): () => void\n once(event: string | string[], handler: EventHandler): () => void\n\n /**\n * 取消订阅\n * @param event - 事件名称\n * @param handler - 事件处理函数\n */\n off<K extends keyof E>(event: K, handler?: EventHandler<E[K]>): void\n off(event: string | string[], handler?: EventHandler): void\n\n /**\n * 发布事件\n * @param event - 事件名称\n * @param data - 事件数据\n */\n emit<K extends keyof E>(event: K, data?: E[K]): void\n emit(event: string, data?: unknown): void\n\n /**\n * 清空所有事件监听器\n */\n clear(): void\n\n /**\n * 获取所有事件名称\n */\n all: Emitter<E>['all']\n}\n\n// ==================== EventBus 类 ====================\n\n/**\n * 事件总线类\n * @template E - 事件类型映射\n * @example\n * ```ts\n * // 定义事件类型\n * interface Events {\n * user: { id: number; name: string }\n * message: string\n * error: Error\n * }\n *\n * const bus = createEventBus<Events>()\n *\n * // 订阅事件\n * bus.on('user', (user) => console.log(user.name))\n *\n * // 发布事件\n * bus.emit('user', { id: 1, name: 'Alice' })\n * ```\n */\nexport class EventBus<E extends Record<EventType, unknown> = Record<string, any>>\n implements IEventBus<E>\n{\n private emitter: Emitter<E>\n private options: Required<Omit<EventBusOptions, 'prefix'>> & Pick<EventBusOptions, 'prefix'>\n private listeners: Map<string, ListenerMeta[]> = new Map()\n\n constructor(options: EventBusOptions = {}) {\n this.options = {\n debug: options.debug ?? false,\n prefix: options.prefix ?? '',\n }\n\n this.emitter = mitt<E>()\n this.log('EventBus created')\n }\n\n /**\n * 订阅事件\n */\n on<K extends keyof E>(\n event: K,\n handler: EventHandler<E[K]>\n ): () => void\n on(event: string | string[], handler: EventHandler): () => void\n on(event: any, handler: any): () => void {\n const events = Array.isArray(event) ? event : [event]\n const unsubscribers: (() => void)[] = []\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n\n const wrappedHandler: Handler = (data: any) => {\n this.log(`Event triggered: ${fullName}`, data)\n return handler(data)\n }\n\n this.emitter.on(fullName, wrappedHandler)\n\n // 记录监听器\n const meta: ListenerMeta = {\n event: fullName,\n handler: wrappedHandler,\n once: false,\n timestamp: Date.now(),\n }\n this.addListener(fullName, meta)\n\n // 返回取消订阅函数\n unsubscribers.push(() => {\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n this.log(`Unsubscribed from: ${fullName}`)\n })\n })\n\n // 返回一个取消所有订阅的函数\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n }\n\n /**\n * 订阅事件(只执行一次)\n */\n once<K extends keyof E>(\n event: K,\n handler: EventHandler<E[K]>\n ): () => void\n once(event: string | string[], handler: EventHandler): () => void\n once(event: any, handler: any): () => void {\n const events = Array.isArray(event) ? event : [event]\n const unsubscribers: (() => void)[] = []\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n\n const wrappedHandler: Handler = (data: any) => {\n this.log(`One-time event triggered: ${fullName}`, data)\n\n // 执行后立即取消订阅\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n\n return handler(data)\n }\n\n this.emitter.on(fullName, wrappedHandler)\n\n // 记录监听器\n const meta: ListenerMeta = {\n event: fullName,\n handler: wrappedHandler,\n once: true,\n timestamp: Date.now(),\n }\n this.addListener(fullName, meta)\n\n unsubscribers.push(() => {\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n })\n })\n\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n }\n\n /**\n * 取消订阅\n */\n off<K extends keyof E>(event: K, handler?: EventHandler<E[K]>): void\n off(event: string | string[], handler?: EventHandler): void\n off(event: any, handler?: any): void {\n const events = Array.isArray(event) ? event : [event]\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n const listeners = this.listeners.get(fullName) || []\n\n if (handler) {\n // 移除特定处理函数\n const index = listeners.findIndex((meta) => meta.handler === handler)\n if (index !== -1) {\n this.emitter.off(fullName, listeners[index].handler)\n listeners.splice(index, 1)\n this.log(`Removed handler from: ${fullName}`)\n }\n } else {\n // 移除所有处理函数\n listeners.forEach((meta) => {\n this.emitter.off(fullName, meta.handler)\n })\n this.listeners.delete(fullName)\n this.log(`Cleared all listeners for: ${fullName}`)\n }\n })\n }\n\n /**\n * 发布事件\n */\n emit<K extends keyof E>(event: K, data?: E[K]): void\n emit(event: string, data?: unknown): void\n emit(event: any, data?: any): void {\n const fullName = this.getFullName(event)\n this.log(`Emitting event: ${fullName}`, data)\n this.emitter.emit(fullName, data)\n }\n\n /**\n * 清空所有事件监听器\n */\n clear(): void {\n this.emitter.all.clear()\n this.listeners.clear()\n this.log('All event listeners cleared')\n }\n\n /**\n * 获取所有事件\n */\n get all(): any {\n return this.emitter.all\n }\n\n /**\n * 获取事件监听器数量\n */\n getListenerCount(event?: string): number {\n if (event) {\n const fullName = this.getFullName(event)\n return this.listeners.get(fullName)?.length || 0\n }\n return Array.from(this.listeners.values()).reduce((total, list) => total + list.length, 0)\n }\n\n /**\n * 获取所有事件名称\n */\n getEventNames(): string[] {\n return Array.from(this.listeners.keys())\n }\n\n /**\n * 获取事件监听器列表\n */\n getListeners(event: string): ListenerMeta[] {\n const fullName = this.getFullName(event)\n return this.listeners.get(fullName) || []\n }\n\n /**\n * 添加监听器记录\n */\n private addListener(event: string, meta: ListenerMeta): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, [])\n }\n this.listeners.get(event)!.push(meta)\n }\n\n /**\n * 移除监听器记录\n */\n private removeListener(event: string, handler: Handler): void {\n const listeners = this.listeners.get(event)\n if (listeners) {\n const index = listeners.findIndex((meta) => meta.handler === handler)\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n if (listeners.length === 0) {\n this.listeners.delete(event)\n }\n }\n }\n\n /**\n * 获取完整的事件名称(带前缀)\n */\n private getFullName(event: string): string {\n return this.options.prefix ? `${this.options.prefix}:${event}` : event\n }\n\n /**\n * 日志输出\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[EventBus]', ...args)\n }\n }\n}\n\n// ==================== 工厂函数 ====================\n\n/**\n * 创建事件总线实例\n * @param options - 配置选项\n * @returns 事件总线实例\n * @example\n * ```ts\n * // 创建事件总线\n * const bus = createEventBus({\n * debug: true,\n * prefix: 'app'\n * })\n *\n * // 订阅事件\n * const unsubscribe = bus.on('user:login', (user) => {\n * console.log('User logged in:', user)\n * })\n *\n * // 发布事件\n * bus.emit('user:login', { id: 1, name: 'Alice' })\n *\n * // 取消订阅\n * unsubscribe()\n * ```\n */\nexport function createEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n options?: EventBusOptions\n): IEventBus<E> {\n return new EventBus<E>(options)\n}\n\n/**\n * 创建全局事件总线(单例)\n * @param options - 配置选项\n * @returns 全局事件总线实例\n * @example\n * ```ts\n * // 获取全局事件总线\n * const globalBus = getGlobalEventBus({ debug: true })\n *\n * // 在任何地方使用\n * globalBus.emit('app:ready')\n * ```\n */\nlet globalEventBus: IEventBus<any> | null = null\n\nexport function getGlobalEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n options?: EventBusOptions\n): IEventBus<E> {\n if (!globalEventBus) {\n globalEventBus = createEventBus<E>(options)\n }\n return globalEventBus as IEventBus<E>\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 等待事件触发\n * @param bus - 事件总线\n * @param event - 事件名称\n * @param timeout - 超时时间(毫秒),默认 5000\n * @returns Promise,在事件触发时 resolve\n * @example\n * ```ts\n * const bus = createEventBus()\n *\n * // 等待事件\n * const data = await waitForEvent(bus, 'data:ready')\n * console.log('Data ready:', data)\n * ```\n */\nexport function waitForEvent<T = any>(\n bus: IEventBus<Record<string, any>>,\n event: string,\n timeout: number = 5000\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n unsubscribe()\n reject(new Error(`Timeout waiting for event: ${event}`))\n }, timeout)\n\n const unsubscribe = bus.on(event, (data: T) => {\n clearTimeout(timer)\n unsubscribe()\n resolve(data)\n })\n })\n}\n\n/**\n * 批量订阅事件\n * @param bus - 事件总线\n * @param events - 事件映射\n * @returns 取消所有订阅的函数\n * @example\n * ```ts\n * const bus = createEventBus()\n *\n * const unsubscribe = batchSubscribe(bus, {\n * 'user:login': (user) => console.log('Login:', user),\n * 'user:logout': () => console.log('Logout'),\n * 'error': (error) => console.error('Error:', error)\n * })\n * ```\n */\nexport function batchSubscribe(\n bus: IEventBus<Record<string, any>>,\n events: Record<string, EventHandler<any>>\n): () => void {\n const unsubscribers: (() => void)[] = []\n\n Object.entries(events).forEach(([event, handler]) => {\n unsubscribers.push(bus.on(event, handler))\n })\n\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n}\n\n/**\n * 创建命名空间事件总线\n * @param namespace - 命名空间\n * @param options - 配置选项\n * @returns 事件总线实例\n * @example\n * ```ts\n * const userBus = createNamespacedEventBus('user')\n * const appBus = createNamespacedEventBus('app')\n *\n * userBus.emit('login') // 实际事件名: user:login\n * appBus.emit('ready') // 实际事件名: app:ready\n * ```\n */\nexport function createNamespacedEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n namespace: string,\n options?: Omit<EventBusOptions, 'prefix'>\n): IEventBus<E> {\n return createEventBus<E>({\n ...options,\n prefix: namespace,\n }) as IEventBus<E>\n}\n\n// ==================== 导出 ====================\n\nexport default {\n EventBus,\n createEventBus,\n getGlobalEventBus,\n waitForEvent,\n batchSubscribe,\n createNamespacedEventBus,\n}\n"]}
1
+ {"version":3,"sources":["../src/modules/date/index.ts","../src/modules/array/index.ts","../src/modules/string/index.ts","../src/modules/object/index.ts","../src/modules/excel/index.ts","../src/modules/pdf/index.ts","../src/modules/map/index.ts","../src/modules/storage/index.ts","../src/modules/utils/index.ts","../src/modules/crypto/index.ts","../src/modules/websocket/index.ts","../src/modules/event/index.ts"],"names":["dayjs","relativeTime","utc","timezone","durationPlugin","isBetweenPlugin","isSameOrBeforePlugin","isSameOrAfterPlugin","weekOfYear","weekYear","quarterOfYear","isLeapYearPlugin","dayOfYear","minMax","weekday","startDate","endDate","format","diffDays","diff","chunk","compact","difference","flatten","flattenDeep","forEachAsync","forEachRight","groupBy","head","intersection","isEqual","last","omit","sample","sortBy","sum","uniq","uniqBy","size","map","camelCase","capitalize","isEmpty","kebabCase","lowerFirst","snakeCase","startCase","trim","upperFirst","cloneDeep","filter","invert","isEmptyObject","merge","pick","keys","values","XLSX","html2canvas","jsPDF","defaultControls","ScaleLine","FullScreen","OlMap","View","fromLonLat","TileLayer","XYZ","VectorSource","GeoJSON","VectorLayer","Feature","Point","Style","Icon","Circle","Fill","Stroke","transform","style","Overlay","Draw","Snap","Modify","Select","toLonLat","extent","boundingExtent","OSM","LineString","Polygon","Cookies","clone","debounce","deepMerge","get","isArray","isBoolean","isFunction","isNumber","isObject","isString","max","min","set","throttle","CryptoJS","uuid","mode","WebSocketState","mitt"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 日期时间工具模块\n * 基于 dayjs 封装,提供常用的日期处理功能\n */\n\nimport dayjs, { type Dayjs } from 'dayjs'\nimport durationPlugin from 'dayjs/plugin/duration'\nimport isBetweenPlugin from 'dayjs/plugin/isBetween'\nimport isSameOrAfterPlugin from 'dayjs/plugin/isSameOrAfter'\nimport isSameOrBeforePlugin from 'dayjs/plugin/isSameOrBefore'\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport timezone from 'dayjs/plugin/timezone'\nimport utc from 'dayjs/plugin/utc'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport weekYear from 'dayjs/plugin/weekYear'\nimport isLeapYearPlugin from 'dayjs/plugin/isLeapYear'\nimport dayOfYear from 'dayjs/plugin/dayOfYear'\nimport minMax from 'dayjs/plugin/minMax'\nimport weekday from 'dayjs/plugin/weekday'\nimport 'dayjs/locale/zh-cn'\n\n// 扩展 dayjs 插件\ndayjs.extend(relativeTime)\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(durationPlugin)\ndayjs.extend(isBetweenPlugin)\ndayjs.extend(isSameOrBeforePlugin)\ndayjs.extend(isSameOrAfterPlugin)\ndayjs.extend(weekOfYear)\ndayjs.extend(weekYear)\ndayjs.extend(quarterOfYear)\ndayjs.extend(isLeapYearPlugin)\ndayjs.extend(dayOfYear)\ndayjs.extend(minMax)\ndayjs.extend(weekday)\n\n// 设置默认语言\ndayjs.locale('zh-cn')\n\nexport type { Dayjs }\n\n/**\n * 时间单位类型\n */\nexport type TimeUnit = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond'\n\n/**\n * 日期格式类型\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYY/MM/DD'\n | 'YYYY/MM/DD HH:mm:ss'\n | 'MM/DD/YYYY'\n | 'DD/MM/YYYY'\n | 'HH:mm:ss'\n | 'HH:mm'\n | 'YYYY-MM-DDTHH:mm:ss'\n | 'YYYY年MM月DD日'\n | 'YYYY年MM月DD日 HH:mm:ss'\n\n/**\n * 获取当前时间\n */\nexport const now = (): Dayjs => dayjs()\n\n/**\n * 格式化日期\n * @param date 日期\n * @param format 格式\n */\nexport const format = (\n date: string | number | Date | Dayjs,\n formatStr = 'YYYY-MM-DD HH:mm:ss'\n): string => {\n return dayjs(date).format(formatStr)\n}\n\n/**\n * 获取日期的年月日\n * @param date 日期\n */\nexport const getDate = (date: string | number | Date | Dayjs = new Date()): string => {\n return dayjs(date).format('YYYY-MM-DD')\n}\n\n/**\n * 获取时间\n * @param date 日期\n */\nexport const getTime = (date: string | number | Date | Dayjs = new Date()): string => {\n return dayjs(date).format('HH:mm:ss')\n}\n\n/**\n * 获取时间戳\n * @param date 日期\n */\nexport const getTimestamp = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).valueOf()\n}\n\n/**\n * 日期加减\n * @param date 日期\n * @param amount 数量\n * @param unit 单位\n */\nexport const add = (\n date: string | number | Date | Dayjs,\n amount: number,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): Dayjs => {\n return dayjs(date).add(amount, unit)\n}\n\n/**\n * 日期减法\n * @param date 日期\n * @param amount 数量\n * @param unit 单位\n */\nexport const subtract = (\n date: string | number | Date | Dayjs,\n amount: number,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): Dayjs => {\n return dayjs(date).subtract(amount, unit)\n}\n\n/**\n * 获取日期的开始时间(当天的 00:00:00)\n * @param date 日期\n */\nexport const startOf = (\n date: string | number | Date | Dayjs,\n unit: 'day' | 'month' | 'year' = 'day'\n): Dayjs => {\n return dayjs(date).startOf(unit)\n}\n\n/**\n * 获取日期的结束时间(当天的 23:59:59)\n * @param date 日期\n */\nexport const endOf = (\n date: string | number | Date | Dayjs,\n unit: 'day' | 'month' | 'year' = 'day'\n): Dayjs => {\n return dayjs(date).endOf(unit)\n}\n\n/**\n * 计算两个日期之间的天数差\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const diffDays = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n return dayjs(date1).diff(dayjs(date2), 'day')\n}\n\n/**\n * 计算两个日期之间的小时差\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const diffHours = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n return dayjs(date1).diff(dayjs(date2), 'hour')\n}\n\n/**\n * 判断是否是今天\n * @param date 日期\n */\nexport const isToday = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'day')\n}\n\n/**\n * 判断是否是昨天\n * @param date 日期\n */\nexport const isYesterday = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs().subtract(1, 'day'), 'day')\n}\n\n/**\n * 判断是否是明天\n * @param date 日期\n */\nexport const isTomorrow = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs().add(1, 'day'), 'day')\n}\n\n/**\n * 判断是否在两个日期之间\n * @param date 日期\n * @param startDate 开始日期\n * @param endDate 结束日期\n */\nexport const isBetween = (\n date: string | number | Date | Dayjs,\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date).isBetween(startDate, endDate, null, '[]')\n}\n\n/**\n * 获取相对时间\n * @param date 日期\n */\nexport const fromNow = (date: string | number | Date | Dayjs): string => {\n return dayjs(date).fromNow()\n}\n\n/**\n * 获取周数\n * @param date 日期\n */\nexport const getWeek = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).week()\n}\n\n/**\n * 计算日期(前移或后移)\n * @param compute 计算方式 'after' | 'before'\n * @param date 日期\n * @param type 计算类型 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param num 计算数量\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const computeDate = (\n compute: 'after' | 'before',\n date: string | number | Date | Dayjs = new Date(),\n type: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond' = 'day',\n num: number = 1,\n format: string = 'YYYY-MM-DD'\n): string => {\n const d = dayjs(date)\n if (compute === 'after') {\n return d.add(num, type as any).format(format)\n }\n if (compute === 'before') {\n return d.subtract(num, type as any).format(format)\n }\n return d.format(format)\n}\n\n/**\n * 获取当前时间单位的开始时间\n * @param type 类型 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const startDate = (\n type: 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond' = 'month',\n format: string = 'YYYY-MM-DD'\n): string => {\n return dayjs().startOf(type as any).format(format)\n}\n\n/**\n * 获取当前时间单位的结束时间\n * @param type 类型 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const endDate = (\n type: 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond' = 'month',\n format: string = 'YYYY-MM-DD'\n): string => {\n return dayjs().endOf(type as any).format(format)\n}\n\n/**\n * 时间戳格式化\n * @param timestamp 时间戳(秒级)\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const formatTimestamp = (\n timestamp: number = 0,\n format: string = 'YYYY-MM-DD HH:mm:ss'\n): string => {\n const ts = timestamp === 0 ? getTimestamp() / 1000 : timestamp\n return dayjs.unix(ts).format(format)\n}\n\n/**\n * 获取两个日期之间的差异(通用版本)\n * @param type 类型 'week' | 'day' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param startDate 起始时间\n * @param endDate 结束时间\n * @returns 差异值\n */\nexport const diff = (\n type: 'week' | 'day' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond',\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs = new Date()\n): number => {\n return dayjs(endDate).diff(dayjs(startDate), type)\n}\n\n/**\n * 获取日期范围内的所有日期\n * @param startDate 起始时间\n * @param endDate 结束时间\n * @param format 格式模板\n * @returns 日期集合(包含日期和时间戳)\n */\nexport const getRangeDate = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs,\n format: string = 'YYYY-MM-DD'\n): Array<{ day: string; timestamp: number }> => {\n const diffDays = diff('day', startDate, endDate)\n const range: Array<{ day: string; timestamp: number }> = []\n\n for (let i = 0; i <= diffDays; i++) {\n const day = computeDate('after', startDate, 'day', i, format)\n range.push({\n day,\n timestamp: getTimestamp(day) / 1000\n })\n }\n\n return range\n}\n\n/**\n * 获取相对时间(中文描述)\n * @param date 日期\n * @returns 相对时间描述\n */\nexport const getRelativeTime = (date: string | number | Date | Dayjs): string => {\n const diffMinutes = diff('minute', date)\n\n if (diffMinutes < 1) {\n return '刚刚'\n }\n if (diffMinutes < 60) {\n return `${diffMinutes}分钟前`\n }\n if (diffMinutes < 1440) {\n return `${Math.floor(diffMinutes / 60)}小时前`\n }\n if (diffMinutes < 43200) {\n return `${Math.floor(diffMinutes / 1440)}天前`\n }\n\n return format(date, 'YYYY-MM-DD')\n}\n\n/**\n * 判断日期是否有效\n * @param date 日期\n * @returns 是否有效\n */\nexport const isValid = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isValid()\n}\n\n/**\n * 获取月份的第一天\n * @param date 日期\n * @returns 日期\n */\nexport const getFirstDayOfMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).date() - dayjs(date).startOf('month').date() + 1\n}\n\n/**\n * 获取月份的最后一天\n * @param date 日期\n * @returns 日期\n */\nexport const getLastDayOfMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).endOf('month').date()\n}\n\n/**\n * 获取季度\n * @param date 日期\n */\nexport const getQuarter = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).quarter()\n}\n\n/**\n * 获取某月有多少天\n * @param date 日期\n */\nexport const getDaysInMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).daysInMonth()\n}\n\n/**\n * 获取当前月份的开始日期和结束日期\n * @param date 日期\n */\nexport const getMonthRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n return [d.startOf('month').format('YYYY-MM-DD'), d.endOf('month').format('YYYY-MM-DD')]\n}\n\n/**\n * 获取当前季度的开始日期和结束日期\n * @param date 日期\n */\nexport const getQuarterRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n const quarter = d.quarter()\n const start = d\n .month((quarter - 1) * 3)\n .startOf('month')\n .format('YYYY-MM-DD')\n const end = d\n .month(quarter * 3 - 1)\n .endOf('month')\n .format('YYYY-MM-DD')\n return [start, end]\n}\n\n/**\n * 获取当前年份的开始日期和结束日期\n * @param date 日期\n */\nexport const getYearRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n return [d.startOf('year').format('YYYY-MM-DD'), d.endOf('year').format('YYYY-MM-DD')]\n}\n\n/**\n * 获取本周的开始日期和结束日期\n * @param date 日期\n * @param startDay 一周的开始日,默认为周日(0)\n */\nexport const getWeekRange = (\n date: string | number | Date | Dayjs = new Date(),\n startDay = 0\n): [string, string] => {\n const d = dayjs(date)\n const day = d.day()\n const diff = day < startDay ? 7 - startDay + day : day - startDay\n const start = d.subtract(diff, 'day').format('YYYY-MM-DD')\n const end = d.subtract(diff, 'day').add(6, 'day').format('YYYY-MM-DD')\n return [start, end]\n}\n\n/**\n * 判断是否是闰年\n * @param year 年份\n */\nexport const isLeapYear = (year: number): boolean => {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0\n}\n\n/**\n * 导出 dayjs 原始方法,方便高级用法\n */\nexport { dayjs }\n\n\n/**\n * 获取年份\n * @param date 日期\n */\nexport const getYear = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).year()\n}\n\n/**\n * 获取月份(1-12)\n * @param date 日期\n */\nexport const getMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).month() + 1\n}\n\n/**\n * 获取日期(1-31)\n * @param date 日期\n */\nexport const getDay = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).date()\n}\n\n/**\n * 获取小时(0-23)\n * @param date 日期\n */\nexport const getHour = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).hour()\n}\n\n/**\n * 获取分钟(0-59)\n * @param date 日期\n */\nexport const getMinute = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).minute()\n}\n\n/**\n * 获取秒数(0-59)\n * @param date 日期\n */\nexport const getSecond = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).second()\n}\n\n/**\n * 获取星期几(0-6,0为周日)\n * @param date 日期\n */\nexport const getWeekday = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).day()\n}\n\n/**\n * 获取星期几的中文名称\n * @param date 日期\n */\nexport const getWeekdayName = (date: string | number | Date | Dayjs = new Date()): string => {\n const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']\n return weekdays[dayjs(date).day()]\n}\n\n/**\n * 获取一年中的第几天\n * @param date 日期\n */\nexport const getDayOfYear = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).dayOfYear()\n}\n\n/**\n * 获取本周第一天(周一)\n * @param date 日期\n */\nexport const getFirstDayOfWeek = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).weekday(0)\n}\n\n/**\n * 获取本周最后一天(周日)\n * @param date 日期\n */\nexport const getLastDayOfWeek = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).weekday(6)\n}\n\n/**\n * 获取本月第一天(Dayjs 对象)\n * @param date 日期\n */\nexport const getFirstDayOfMonthDate = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).startOf('month')\n}\n\n/**\n * 获取本月最后一天(Dayjs 对象)\n * @param date 日期\n */\nexport const getLastDayOfMonthDate = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).endOf('month')\n}\n\n/**\n * 获取本年第一天\n * @param date 日期\n */\nexport const getFirstDayOfYear = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).startOf('year')\n}\n\n/**\n * 获取本年最后一天\n * @param date 日期\n */\nexport const getLastDayOfYear = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).endOf('year')\n}\n\n/**\n * 判断日期是否相同\n * @param date1 日期1\n * @param date2 日期2\n * @param unit 单位\n */\nexport const isSame = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): boolean => {\n return dayjs(date1).isSame(date2, unit)\n}\n\n/**\n * 比较两个日期\n * @param date1 日期1\n * @param date2 日期2\n * @returns 1(date1 > date2)、-1(date1 < date2)、0(date1 = date2)\n */\nexport const compare = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n const d1 = dayjs(date1).valueOf()\n const d2 = dayjs(date2).valueOf()\n if (d1 > d2) return 1\n if (d1 < d2) return -1\n return 0\n}\n\n/**\n * 判断日期是否相同或在之前\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameOrBefore = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSameOrBefore(date2)\n}\n\n/**\n * 判断日期是否相同或在之后\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameOrAfter = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSameOrAfter(date2)\n}\n\n/**\n * 判断日期1是否在日期2之前\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isBefore = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isBefore(date2)\n}\n\n/**\n * 判断日期1是否在日期2之后\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isAfter = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isAfter(date2)\n}\n\n/**\n * 计算年龄\n * @param birthday 生日\n */\nexport const getAge = (birthday: string | number | Date | Dayjs): number => {\n return dayjs().diff(birthday, 'year')\n}\n\n/**\n * 判断是否是工作日(周一到周五)\n * @param date 日期\n */\nexport const isWorkday = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const day = dayjs(date).day()\n return day !== 0 && day !== 6 // 0 是周日,6 是周六\n}\n\n/**\n * 判断是否是周末(周六或周日)\n * @param date 日期\n */\nexport const isWeekend = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const day = dayjs(date).day()\n return day === 0 || day === 6\n}\n\n/**\n * 判断时间段(上午/下午/晚上/深夜)\n * @param date 日期\n */\nexport const getTimeOfDay = (\n date: string | number | Date | Dayjs = new Date()\n): 'morning' | 'noon' | 'afternoon' | 'evening' | 'night' => {\n const hour = dayjs(date).hour()\n if (hour >= 5 && hour < 9) return 'morning'\n if (hour >= 9 && hour < 12) return 'noon'\n if (hour >= 12 && hour < 18) return 'afternoon'\n if (hour >= 18 && hour < 22) return 'evening'\n return 'night'\n}\n\n/**\n * 获取时间段的中文名称\n * @param date 日期\n */\nexport const getTimeOfDayName = (\n date: string | number | Date | Dayjs = new Date()\n): string => {\n const timeOfDay = getTimeOfDay(date)\n const names = {\n morning: '清晨',\n noon: '上午',\n afternoon: '下午',\n evening: '晚上',\n night: '深夜'\n }\n return names[timeOfDay]\n}\n\n/**\n * 计算两个日期之间的工作日天数\n * @param startDate 开始日期\n * @param endDate 结束日期\n */\nexport const getWorkdaysBetween = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs\n): number => {\n let count = 0\n const start = dayjs(startDate)\n const end = dayjs(endDate)\n const days = Math.abs(start.diff(end, 'day'))\n\n for (let i = 0; i <= days; i++) {\n const current = start.add(i, 'day')\n if (isWorkday(current)) {\n count++\n }\n }\n\n return count\n}\n\n/**\n * 生成日期范围数组\n * @param startDate 开始日期\n * @param endDate 结束日期\n * @param unit 单位(默认为天)\n */\nexport const getDateRange = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs,\n unit: TimeUnit = 'day'\n): Dayjs[] => {\n const start = dayjs(startDate)\n const end = dayjs(endDate)\n const dates: Dayjs[] = []\n const diff = end.diff(start, unit)\n\n for (let i = 0; i <= diff; i++) {\n dates.push(start.add(i, unit))\n }\n\n return dates\n}\n\n/**\n * 获取最近N天的日期数组\n * @param days 天数\n */\nexport const getRecentDays = (days: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < days; i++) {\n dates.push(dayjs().subtract(i, 'day'))\n }\n return dates.reverse()\n}\n\n/**\n * 获取最近N个月的日期数组\n * @param months 月数\n */\nexport const getRecentMonths = (months: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < months; i++) {\n dates.push(dayjs().subtract(i, 'month'))\n }\n return dates.reverse()\n}\n\n/**\n * 获取最近N周的日期数组\n * @param weeks 周数\n */\nexport const getRecentWeeks = (weeks: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < weeks; i++) {\n dates.push(dayjs().subtract(i, 'week'))\n }\n return dates.reverse()\n}\n\n/**\n * 转换为 UTC 时间\n * @param date 日期\n */\nexport const toUTC = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs(date).utc()\n}\n\n/**\n * 从 UTC 转换为本地时间\n * @param date 日期\n */\nexport const fromUTC = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs.utc(date).local()\n}\n\n/**\n * 转换为指定时区的时间\n * @param date 日期\n * @param timezone 时区(如 'Asia/Shanghai')\n */\nexport const toTimezone = (\n date: string | number | Date | Dayjs,\n timezone: string\n): Dayjs => {\n return dayjs(date).tz(timezone)\n}\n\n/**\n * 获取时区偏移量(分钟)\n * @param date 日期\n */\nexport const getTimezoneOffset = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).utcOffset()\n}\n\n/**\n * 格式化持续时间\n * @param milliseconds 毫秒数\n */\nexport const formatDuration = (milliseconds: number): string => {\n const d = dayjs.duration(milliseconds)\n const hours = Math.floor(d.asHours())\n const minutes = d.minutes()\n const seconds = d.seconds()\n\n if (hours > 0) {\n return `${hours}小时${minutes}分${seconds}秒`\n }\n if (minutes > 0) {\n return `${minutes}分${seconds}秒`\n }\n return `${seconds}秒`\n}\n\n/**\n * 获取最小日期\n * @param dates 日期数组\n */\nexport const minDate = (dates: Array<string | number | Date | Dayjs>): Dayjs => {\n return dayjs.min(dates.map((d) => dayjs(d)))!\n}\n\n/**\n * 获取最大日期\n * @param dates 日期数组\n */\nexport const maxDate = (dates: Array<string | number | Date | Dayjs>): Dayjs => {\n return dayjs.max(dates.map((d) => dayjs(d)))!\n}\n\n/**\n * 判断是否是本月\n * @param date 日期\n */\nexport const isThisMonth = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'month')\n}\n\n/**\n * 判断是否是本年\n * @param date 日期\n */\nexport const isThisYear = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'year')\n}\n\n/**\n * 判断是否是本周\n * @param date 日期\n */\nexport const isThisWeek = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'week')\n}\n\n/**\n * 判断是否是同月\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameMonth = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSame(date2, 'month')\n}\n\n/**\n * 判断是否是同一年\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameYear = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSame(date2, 'year')\n}\n\n/**\n * 获取农历年份(简化版,仅供参考)\n * @param date 日期\n */\nexport const getChineseYear = (date: string | number | Date | Dayjs = new Date()): string => {\n const animals = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']\n const baseYear = 1900\n const year = dayjs(date).year()\n const index = (year - baseYear) % 12\n return animals[index >= 0 ? index : index + 12] + '年'\n}\n\n/**\n * 获取星座\n * @param date 日期\n */\nexport const getZodiacSign = (date: string | number | Date | Dayjs = new Date()): string => {\n const month = dayjs(date).month() + 1\n const day = dayjs(date).date()\n\n if ((month === 3 && day >= 21) || (month === 4 && day <= 19)) return '白羊座'\n if ((month === 4 && day >= 20) || (month === 5 && day <= 20)) return '金牛座'\n if ((month === 5 && day >= 21) || (month === 6 && day <= 20)) return '双子座'\n if ((month === 6 && day >= 21) || (month === 7 && day <= 22)) return '巨蟹座'\n if ((month === 7 && day >= 23) || (month === 8 && day <= 22)) return '狮子座'\n if ((month === 8 && day >= 23) || (month === 9 && day <= 22)) return '处女座'\n if ((month === 9 && day >= 23) || (month === 10 && day <= 22)) return '天秤座'\n if ((month === 10 && day >= 23) || (month === 11 && day <= 21)) return '天蝎座'\n if ((month === 11 && day >= 22) || (month === 12 && day <= 21)) return '射手座'\n if ((month === 12 && day >= 22) || (month === 1 && day <= 19)) return '摩羯座'\n if ((month === 1 && day >= 20) || (month === 2 && day <= 18)) return '水瓶座'\n return '双鱼座'\n}\n\n/**\n * 判断是否是节日(简化版,仅支持主要节日)\n * @param date 日期\n */\nexport const isHoliday = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const holidays: { [key: string]: string } = {\n '0101': '元旦',\n '0214': '情人节',\n '0308': '妇女节',\n '0401': '愚人节',\n '0501': '劳动节',\n '0504': '青年节',\n '0601': '儿童节',\n '0701': '建党节',\n '0801': '建军节',\n '0910': '教师节',\n '1001': '国庆节',\n '1224': '平安夜',\n '1225': '圣诞节'\n }\n\n const month = dayjs(date).format('MM')\n const day = dayjs(date).format('DD')\n const key = `${month}${day}`\n\n return holidays[key] !== undefined\n}\n\n/**\n * 获取节日名称(简化版)\n * @param date 日期\n */\nexport const getHolidayName = (date: string | number | Date | Dayjs = new Date()): string | null => {\n const holidays: { [key: string]: string } = {\n '0101': '元旦',\n '0214': '情人节',\n '0308': '妇女节',\n '0401': '愚人节',\n '0501': '劳动节',\n '0504': '青年节',\n '0601': '儿童节',\n '0701': '建党节',\n '0801': '建军节',\n '0910': '教师节',\n '1001': '国庆节',\n '1224': '平安夜',\n '1225': '圣诞节'\n }\n\n const month = dayjs(date).format('MM')\n const day = dayjs(date).format('DD')\n const key = `${month}${day}`\n\n return holidays[key] || null\n}\n\n/**\n * 解析字符串为日期\n * @param dateString 日期字符串\n * @param formatStr 格式\n */\nexport const parse = (dateString: string, formatStr?: string): Dayjs => {\n return formatStr ? dayjs(dateString, formatStr) : dayjs(dateString)\n}\n\n/**\n * 格式化为相对时间(未来)\n * @param date 日期\n */\nexport const toNow = (date: string | number | Date | Dayjs): string => {\n return dayjs(date).toNow()\n}\n\n/**\n * 克隆日期\n * @param date 日期\n */\nexport const clone = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs(date).clone()\n}\n\n/**\n * 获取 Unix 时间戳(秒)\n * @param date 日期\n */\nexport const unix = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).unix()\n}\n\n/**\n * 从 Unix 时间戳创建日期\n * @param timestamp Unix 时间戳(秒)\n */\nexport const fromUnix = (timestamp: number): Dayjs => {\n return dayjs.unix(timestamp)\n}\n\n/**\n * 获取毫秒时间戳\n * @param date 日期\n */\nexport const valueOf = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).valueOf()\n}\n\n// 默认导出\nexport default dayjs\n","/**\n * 数组工具模块\n * 基于 es-toolkit 封装,提供常用的数组处理功能\n */\n\nimport {\n chunk,\n compact,\n difference,\n intersection,\n uniq,\n uniqBy,\n groupBy,\n sortBy,\n sample,\n sum,\n flatten,\n flattenDeep,\n head,\n last,\n isEqual,\n omit,\n forEachAsync,\n forEachRight,\n} from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport {\n chunk,\n compact,\n difference,\n intersection,\n uniq,\n uniqBy,\n groupBy,\n sortBy,\n sample,\n sum,\n flatten,\n flattenDeep,\n head,\n last,\n isEqual,\n omit,\n forEachAsync,\n forEachRight,\n}\n\n/**\n * 数组去重(支持对象数组的去重)\n * @param arr 数组\n * @param key 对象数组的去重键值\n */\nexport const unique = <T>(arr: T[], key?: keyof T): T[] => {\n if (key) {\n return uniqBy(arr, item => item[key] as any)\n }\n return uniq(arr)\n}\n\n/**\n * 获取数组最小值\n * @param arr 数组\n */\nexport const min = (arr: number[]): number | undefined => {\n if (arr.length === 0) return undefined\n return Math.min(...arr)\n}\n\n/**\n * 获取数组最大值\n * @param arr 数组\n */\nexport const max = (arr: number[]): number | undefined => {\n if (arr.length === 0) return undefined\n return Math.max(...arr)\n}\n\n/**\n * 判断数组是否为空\n * @param arr 数组\n */\nexport const isEmpty = <T>(arr: T[]): boolean => {\n return arr.length === 0\n}\n\n/**\n * 数组分割\n * @param arr 数组\n * @param size 每组大小\n */\nexport const split = <T>(arr: T[], size: number): T[][] => {\n const result: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size))\n }\n return result\n}\n\n/**\n * 数组乱序\n * @param arr 数组\n */\nexport const shuffle = <T>(arr: T[]): T[] => {\n const result = [...arr]\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[result[i], result[j]] = [result[j], result[i]]\n }\n return result\n}\n\n/**\n * 查找元素的索引\n * @param arr 数组\n * @param predicate 查找条件\n */\nexport const findIndex = <T>(arr: T[], predicate: (item: T, index: number) => boolean): number => {\n return arr.findIndex(predicate)\n}\n\n/**\n * 查找元素\n * @param arr 数组\n * @param predicate 查找条件\n */\nexport const find = <T>(\n arr: T[],\n predicate: (item: T, index: number) => boolean\n): T | undefined => {\n return arr.find(predicate)\n}\n\n/**\n * 过滤数组\n * @param arr 数组\n * @param predicate 过滤条件\n */\nexport const filter = <T>(arr: T[], predicate: (item: T, index: number) => boolean): T[] => {\n return arr.filter(predicate)\n}\n\n/**\n * 映射数组\n * @param arr 数组\n * @param mapper 映射函数\n */\nexport const map = <T, R>(arr: T[], mapper: (item: T, index: number) => R): R[] => {\n return arr.map(mapper)\n}\n\n/**\n * 数组求和\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const reduceSum = <T>(arr: T[], mapper?: (item: T) => number): number => {\n if (mapper) {\n return arr.reduce((acc, item) => acc + mapper(item), 0)\n }\n return (arr as number[]).reduce((acc, item) => acc + item, 0)\n}\n\n/**\n * 数组求平均值\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const average = <T>(arr: T[], mapper?: (item: T) => number): number => {\n if (arr.length === 0) return 0\n if (mapper) {\n const sum = arr.reduce((acc, item) => acc + mapper(item), 0)\n return sum / arr.length\n }\n return (arr as number[]).reduce((acc, item) => acc + item, 0) / arr.length\n}\n\n/**\n * 数组最大值\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const maxValue = <T>(arr: T[], mapper?: (item: T) => number): number | undefined => {\n if (arr.length === 0) return undefined\n if (mapper) {\n return Math.max(...arr.map(mapper))\n }\n return Math.max(...(arr as number[]))\n}\n\n/**\n * 数组最小值\n * @param arr 数组\n * @param mapper 转换函数\n */\nexport const minValue = <T>(arr: T[], mapper?: (item: T) => number): number | undefined => {\n if (arr.length === 0) return undefined\n if (mapper) {\n return Math.min(...arr.map(mapper))\n }\n return Math.min(...(arr as number[]))\n}\n\n/**\n * 判断数组是否包含某个元素\n * @param arr 数组\n * @param value 值\n */\nexport const includes = <T>(arr: T[], value: T): boolean => {\n return arr.includes(value)\n}\n\n/**\n * 数组删除元素\n * @param arr 数组\n * @param value 值\n */\nexport const remove = <T>(arr: T[], value: T): T[] => {\n return arr.filter(item => item !== value)\n}\n\n/**\n * 数组删除指定索引元素\n * @param arr 数组\n * @param index 索引\n */\nexport const removeAt = <T>(arr: T[], index: number): T[] => {\n return arr.filter((_, i) => i !== index)\n}\n\n/**\n * 数组插入元素\n * @param arr 数组\n * @param index 索引\n * @param value 值\n */\nexport const insert = <T>(arr: T[], index: number, value: T): T[] => {\n return [...arr.slice(0, index), value, ...arr.slice(index)]\n}\n\n/**\n * 数组移动元素\n * @param arr 数组\n * @param from 源索引\n * @param to 目标索引\n */\nexport const move = <T>(arr: T[], from: number, to: number): T[] => {\n const result = [...arr]\n const [removed] = result.splice(from, 1)\n result.splice(to, 0, removed)\n return result\n}\n\n/**\n * 数组转树形结构\n * @param arr 数组\n * @param options 配置\n */\nexport const arrayToTree = <T extends Record<string, any>>(\n arr: T[],\n options: {\n idKey?: string\n parentIdKey?: string\n childrenKey?: string\n } = {}\n): T[] => {\n const { idKey = 'id', parentIdKey = 'parentId', childrenKey = 'children' } = options\n\n const map = new Map<any, T>()\n const roots: T[] = []\n\n // 创建映射\n arr.forEach(item => {\n map.set(item[idKey], { ...item, [childrenKey]: [] })\n })\n\n // 构建树\n map.forEach(item => {\n const parentId = item[parentIdKey]\n if (parentId && map.has(parentId)) {\n const parent = map.get(parentId)\n if (parent) {\n ;(parent[childrenKey] as T[]).push(item)\n }\n } else {\n roots.push(item)\n }\n })\n\n return roots\n}\n\n/**\n * 树形结构转数组\n * @param tree 树\n * @param childrenKey 子节点键名\n */\nexport const treeToArray = <T extends Record<string, any>>(\n tree: T[],\n childrenKey = 'children'\n): T[] => {\n const result: T[] = []\n\n const traverse = (nodes: T[]) => {\n nodes.forEach(node => {\n result.push(node)\n if (node[childrenKey] && node[childrenKey].length > 0) {\n traverse(node[childrenKey])\n }\n })\n }\n\n traverse(tree)\n return result\n}\n\n/**\n * 数组分页\n * @param arr 数组\n * @param page 页码(从1开始)\n * @param pageSize 每页数量\n */\nexport const paginate = <T>(arr: T[], page: number, pageSize: number): T[] => {\n const start = (page - 1) * pageSize\n return arr.slice(start, start + pageSize)\n}\n\n/**\n * 获取分页信息\n * @param total 总数\n * @param page 页码(从1开始)\n * @param pageSize 每页数量\n */\nexport const getPaginationInfo = (total: number, page: number, pageSize: number) => {\n const totalPages = Math.ceil(total / pageSize)\n const startIndex = (page - 1) * pageSize\n const endIndex = Math.min(startIndex + pageSize, total)\n\n return {\n total,\n page,\n pageSize,\n totalPages,\n startIndex,\n endIndex,\n hasNext: page < totalPages,\n hasPrev: page > 1,\n }\n}\n","/**\n * 字符串工具模块\n * 基于 es-toolkit 封装,提供常用的字符串处理功能\n */\n\nimport {\n camelCase,\n kebabCase,\n snakeCase,\n startCase,\n capitalize,\n lowerFirst,\n upperFirst,\n trim,\n} from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport { camelCase, kebabCase, snakeCase, startCase, capitalize, lowerFirst, upperFirst, trim }\n\n/**\n * 判断字符串是否为空\n * @param str 字符串\n */\nexport const isEmpty = (str: string | null | undefined): boolean => {\n if (!str) return true\n return trim(str).length === 0\n}\n\n/**\n * 生成随机字符串\n * @param length 长度\n * @param charset 字符集\n */\nexport const random = (\n length = 8,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string => {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length))\n }\n return result\n}\n\n/**\n * 生成 UUID\n */\nexport const uuid = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\n/**\n * 生成短 ID\n * @param length 长度\n */\nexport const shortId = (length = 6): string => {\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length))\n }\n return result\n}\n\n/**\n * 字符串首字母大写\n * @param str 字符串\n */\nexport const firstUpperCase = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n/**\n * 字符串首字母小写\n * @param str 字符串\n */\nexport const firstLowerCase = (str: string): string => {\n return str.charAt(0).toLowerCase() + str.slice(1)\n}\n\n/**\n * 反转字符串\n * @param str 字符串\n */\nexport const reverse = (str: string): string => {\n return str.split('').reverse().join('')\n}\n\n/**\n * 字符串重复\n * @param str 字符串\n * @param count 重复次数\n */\nexport const repeat = (str: string, count: number): string => {\n return str.repeat(count)\n}\n\n/**\n * 填充字符串\n * @param str 字符串\n * @param length 目标长度\n * @param char 填充字符\n * @param isEnd 是否在末尾填充\n */\nexport const pad = (str: string | number, length: number, char = '0', isEnd = false): string => {\n const s = String(str)\n if (isEnd) {\n return s.padEnd(length, char)\n }\n return s.padStart(length, char)\n}\n\n/**\n * 获取文件扩展名\n * @param filename 文件名\n */\nexport const getExtension = (filename: string): string => {\n const idx = filename.lastIndexOf('.')\n if (idx === -1) return ''\n return filename.slice(idx + 1)\n}\n\n/**\n * 获取文件名(不带扩展名)\n * @param filename 文件名\n */\nexport const getFileName = (filename: string): string => {\n const lastSlash = Math.max(filename.lastIndexOf('/'), filename.lastIndexOf('\\\\'))\n const nameWithExt = lastSlash === -1 ? filename : filename.slice(lastSlash + 1)\n const lastDot = nameWithExt.lastIndexOf('.')\n return lastDot === -1 ? nameWithExt : nameWithExt.slice(0, lastDot)\n}\n\n/**\n * 隐藏手机号中间四位\n * @param phone 手机号\n */\nexport const hidePhone = (phone: string): string => {\n return phone.replace(/(\\d{3})\\d{4}(\\d{4})/, '$1****$2')\n}\n\n/**\n * 隐藏邮箱\n * @param email 邮箱\n */\nexport const hideEmail = (email: string): string => {\n const [username, domain] = email.split('@')\n if (username.length <= 2) return email\n return `${username[0]}${'*'.repeat(username.length - 2)}${username[username.length - 1]}@${domain}`\n}\n\n/**\n * 隐藏身份证号中间部分\n * @param idCard 身份证号\n */\nexport const hideIdCard = (idCard: string): string => {\n if (idCard.length < 8) return idCard\n return `${idCard.slice(0, 4)}${'*'.repeat(idCard.length - 8)}${idCard.slice(-4)}`\n}\n\n/**\n * 格式化金额\n * @param amount 金额\n * @param decimals 小数位数\n * @param separator 千位分隔符\n */\nexport const formatMoney = (amount: number, decimals = 2, separator = ','): string => {\n const str = amount.toFixed(decimals)\n const parts = str.split('.')\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n return parts.join('.')\n}\n\n/**\n * 字符串转数字\n * @param str 字符串\n * @param defaultValue 默认值\n */\nexport const toNumber = (str: string | number | null | undefined, defaultValue = 0): number => {\n if (typeof str === 'number') return str\n if (!str) return defaultValue\n const num = Number(str)\n return isNaN(num) ? defaultValue : num\n}\n\n/**\n * 字符串转布尔值\n * @param str 字符串\n * @param defaultValue 默认值\n */\nexport const toBoolean = (\n str: string | boolean | null | undefined,\n defaultValue = false\n): boolean => {\n if (typeof str === 'boolean') return str\n if (!str) return defaultValue\n return ['true', '1', 'yes', 'on'].includes(str.toLowerCase())\n}\n\n/**\n * 提取字符串中的数字\n * @param str 字符串\n */\nexport const extractNumbers = (str: string): number[] => {\n const matches = str.match(/-?\\d+(\\.\\d+)?/g)\n return matches ? matches.map(Number) : []\n}\n\n/**\n * 提取字符串中的手机号\n * @param str 字符串\n */\nexport const extractPhones = (str: string): string[] => {\n const matches = str.match(/1[3-9]\\d{9}/g)\n return matches || []\n}\n\n/**\n * 提取字符串中的邮箱\n * @param str 字符串\n */\nexport const extractEmails = (str: string): string[] => {\n const matches = str.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g)\n return matches || []\n}\n\n/**\n * 验证手机号\n * @param phone 手机号\n */\nexport const isPhone = (phone: string): boolean => {\n return /^1[3-9]\\d{9}$/.test(phone)\n}\n\n/**\n * 验证邮箱\n * @param email 邮箱\n */\nexport const isEmail = (email: string): boolean => {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(email)\n}\n\n/**\n * 验证身份证号\n * @param idCard 身份证号\n */\nexport const isIdCard = (idCard: string): boolean => {\n return /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/.test(idCard)\n}\n\n/**\n * 验证 URL\n * @param url URL\n */\nexport const isUrl = (url: string): boolean => {\n try {\n new URL(url)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * 高亮关键词\n * @param text 文本\n * @param keyword 关键词\n * @param highlightClass 高亮样式类名\n */\nexport const highlight = (text: string, keyword: string, highlightClass = 'highlight'): string => {\n if (!keyword) return text\n const regex = new RegExp(`(${keyword})`, 'gi')\n return text.replace(regex, `<span class=\"${highlightClass}\">$1</span>`)\n}\n\n/**\n * 截断文本(支持 HTML)\n * @param text 文本\n * @param length 最大长度\n * @param suffix 后缀\n */\nexport const truncateText = (text: string, length = 100, suffix = '...'): string => {\n if (text.length <= length) return text\n return text.slice(0, length) + suffix\n}\n\n/**\n * 转义 HTML\n * @param str 字符串\n */\nexport const escapeHtml = (str: string): string => {\n const htmlEscapes: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n }\n return str.replace(/[&<>\"']/g, char => htmlEscapes[char])\n}\n\n/**\n * 反转义 HTML\n * @param str 字符串\n */\nexport const unescapeHtml = (str: string): string => {\n const htmlUnescapes: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n }\n return str.replace(/&(amp|lt|gt|quot|#39);/g, match => htmlUnescapes[match])\n}\n\n/**\n * 移除 HTML 标签\n * @param str 字符串\n */\nexport const stripTags = (str: string): string => {\n return str.replace(/<[^>]*>/g, '')\n}\n\n/**\n * 字节长度\n * @param str 字符串\n */\nexport const byteLength = (str: string): number => {\n let len = 0\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i)\n if (code >= 0x0001 && code <= 0x007e) {\n len += 1\n } else if (code >= 0x0080 && code <= 0x07ff) {\n len += 2\n } else if (code >= 0x0800 && code <= 0xffff) {\n len += 3\n } else {\n len += 4\n }\n }\n return len\n}\n","/**\n * 对象工具模块\n * 基于 es-toolkit 封装,提供常用的对象处理功能\n */\n\nimport { pick, omit, merge, cloneDeep, isEqual, invert, groupBy, isEmptyObject } from 'es-toolkit'\n\n// 直接导出 es-toolkit 的常用方法\nexport { pick, omit, merge, cloneDeep, isEqual, invert, groupBy, isEmptyObject }\n\n/**\n * 获取对象的所有键\n * @param obj 对象\n */\nexport const keys = <T extends Record<string, any>>(obj: T): (keyof T)[] => {\n return Object.keys(obj) as (keyof T)[]\n}\n\n/**\n * 获取对象的所有值\n * @param obj 对象\n */\nexport const values = <T extends Record<string, any>>(obj: T): T[keyof T][] => {\n return Object.values(obj)\n}\n\n/**\n * 获取对象的所有键值对\n * @param obj 对象\n */\nexport const entries = <T extends Record<string, any>>(obj: T): [keyof T, T[keyof T]][] => {\n return Object.entries(obj) as [keyof T, T[keyof T]][]\n}\n\n/**\n * 从键值对数组创建对象\n * @param pairs 键值对数组\n */\nexport const fromPairs = <K extends string | number | symbol, V>(pairs: [K, V][]): Record<K, V> => {\n const result = {} as Record<K, V>\n for (const [key, value] of pairs) {\n result[key] = value\n }\n return result\n}\n\n/**\n * 获取对象的嵌套属性值\n * @param obj 对象\n * @param path 路径\n * @param defaultValue 默认值\n */\nexport const get = <T>(obj: Record<string, any>, path: string, defaultValue?: T): T => {\n const keys = path.split('.')\n let result = obj\n for (const key of keys) {\n if (result === null || result === undefined) {\n return defaultValue as T\n }\n result = result[key]\n }\n return (result === undefined ? (defaultValue as T) : result) as T\n}\n\n/**\n * 设置对象的嵌套属性值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\nexport const set = (obj: Record<string, any>, path: string, value: any): void => {\n const keys = path.split('.')\n let result = obj\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!(key in result) || typeof result[key] !== 'object') {\n result[key] = {}\n }\n result = result[key]\n }\n result[keys[keys.length - 1]] = value\n}\n\n/**\n * 判断对象是否有某个路径\n * @param obj 对象\n * @param path 路径\n */\nexport const has = (obj: Record<string, any>, path: string): boolean => {\n const keys = path.split('.')\n let result = obj\n for (const key of keys) {\n if (result === null || result === undefined || !(key in result)) {\n return false\n }\n result = result[key]\n }\n return true\n}\n\n/**\n * 判断对象是否为空\n * @param obj 对象\n */\nexport const isEmpty = (obj: any): boolean => {\n if (obj === null || obj === undefined) return true\n if (Array.isArray(obj)) return obj.length === 0\n if (typeof obj === 'object') return isEmptyObject(obj)\n return false\n}\n\n/**\n * 深度合并对象\n * @param target 目标对象\n * @param sources 源对象\n */\nexport const deepMerge = <T extends Record<string, any>>(\n target: T,\n ...sources: Partial<T>[]\n): T => {\n if (!sources.length) return target\n const source = sources.shift() as Partial<T>\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key]\n const targetValue = (target as any)[key]\n\n if (isObject(sourceValue)) {\n if (!isObject(targetValue)) {\n ;(target as any)[key] = {}\n }\n deepMerge((target as any)[key], sourceValue)\n } else {\n ;(target as any)[key] = sourceValue\n }\n }\n }\n }\n\n return deepMerge(target, ...sources)\n}\n\n/**\n * 判断是否是对象\n * @param obj 值\n */\nexport const isObject = (obj: any): obj is Record<string, any> => {\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj)\n}\n\n/**\n * 判断是否是数组\n * @param obj 值\n */\nexport const isArray = (obj: any): obj is any[] => {\n return Array.isArray(obj)\n}\n\n/**\n * 判断是否是函数\n * @param obj 值\n */\nexport const isFunction = (obj: any): obj is (...args: unknown[]) => unknown => {\n return typeof obj === 'function'\n}\n\n/**\n * 判断是否是数字\n * @param obj 值\n */\nexport const isNumber = (obj: any): obj is number => {\n return typeof obj === 'number' && !isNaN(obj)\n}\n\n/**\n * 判断是否是字符串\n * @param obj 值\n */\nexport const isString = (obj: any): obj is string => {\n return typeof obj === 'string'\n}\n\n/**\n * 判断是否是布尔值\n * @param obj 值\n */\nexport const isBoolean = (obj: any): obj is boolean => {\n return typeof obj === 'boolean'\n}\n\n/**\n * 判断是否是 null 或 undefined\n * @param obj 值\n */\nexport const isNil = (obj: any): boolean => {\n return obj === null || obj === undefined\n}\n\n/**\n * 判断是否是 null\n * @param obj 值\n */\nexport const isNull = (obj: any): obj is null => {\n return obj === null\n}\n\n/**\n * 判断是否是 undefined\n * @param obj 值\n */\nexport const isUndefined = (obj: any): obj is undefined => {\n return obj === undefined\n}\n\n/**\n * 获取对象的键值对数量\n * @param obj 对象\n */\nexport const size = (obj: Record<string, any>): number => {\n return Object.keys(obj).length\n}\n\n/**\n * 清空对象\n * @param obj 对象\n */\nexport const clear = <T extends Record<string, any>>(obj: T): T => {\n Object.keys(obj).forEach(key => {\n delete obj[key]\n })\n return obj\n}\n\n/**\n * 转换为查询字符串\n * @param obj 对象\n */\nexport const toQueryString = (obj: Record<string, any>): string => {\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&')\n}\n\n/**\n * 查询字符串转对象\n * @param queryString 查询字符串\n */\nexport const fromQueryString = (queryString: string): Record<string, string> => {\n const params: Record<string, string> = {}\n const pairs = queryString.slice(1).split('&')\n for (const pair of pairs) {\n const [key, value] = pair.split('=')\n if (key) {\n params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : ''\n }\n }\n return params\n}\n\n/**\n * 对象排序\n * @param obj 对象\n * @param compareFn 比较函数\n */\nexport const sortKeys = <T extends Record<string, any>>(\n obj: T,\n compareFn?: (a: string, b: string) => number\n): T => {\n const sortedKeys = Object.keys(obj).sort(compareFn)\n const result: Record<string, any> = {}\n for (const key of sortedKeys) {\n result[key] = obj[key]\n }\n return result as T\n}\n\n/**\n * 重命名对象的键\n * @param obj 对象\n * @param renameMap 重命名映射\n */\nexport const renameKeys = <T extends Record<string, any>>(\n obj: T,\n renameMap: Record<string, string>\n): T => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n const newKey = renameMap[key] || key\n result[newKey] = obj[key]\n }\n return result as T\n}\n\n/**\n * 过滤对象的键值对\n * @param obj 对象\n * @param predicate 过滤函数\n */\nexport const filter = <T extends Record<string, any>>(\n obj: T,\n predicate: (value: any, key: string) => boolean\n): Partial<T> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n if (predicate(obj[key], key)) {\n result[key] = obj[key]\n }\n }\n return result as Partial<T>\n}\n\n/**\n * 映射对象的值\n * @param obj 对象\n * @param mapper 映射函数\n */\nexport const mapValues = <T extends Record<string, any>, R>(\n obj: T,\n mapper: (value: any, key: string) => R\n): Record<string, R> => {\n const result: Record<string, R> = {}\n for (const key in obj) {\n result[key] = mapper(obj[key], key)\n }\n return result\n}\n\n/**\n * 映射对象的键\n * @param obj 对象\n * @param mapper 映射函数\n */\nexport const mapKeys = <T extends Record<string, any>, R extends string>(\n obj: T,\n mapper: (key: string, value: any) => R\n): Record<R, any> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n const newKey = mapper(key, obj[key])\n result[newKey] = obj[key]\n }\n return result as Record<R, any>\n}\n\n/**\n * 获取嵌套路径的值\n * @param obj 对象\n * @param path 路径\n * @param defaultValue 默认值\n */\nexport const getDeep = <T>(obj: Record<string, any>, path: string, defaultValue?: T): T => {\n return get(obj, path, defaultValue)\n}\n\n/**\n * 设置嵌套路径的值\n * @param obj 对象\n * @param path 路径\n * @param value 值\n */\nexport const setDeep = (obj: Record<string, any>, path: string, value: any): void => {\n set(obj, path, value)\n}\n\n/**\n * 判断对象是否有某个路径\n * @param obj 对象\n * @param path 路径\n */\nexport const hasDeep = (obj: Record<string, any>, path: string): boolean => {\n return has(obj, path)\n}\n\n/**\n * 删除嵌套路径的值\n * @param obj 对象\n * @param path 路径\n */\nexport const deleteDeep = (obj: Record<string, any>, path: string): boolean => {\n const keys = path.split('.')\n let current = obj\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) {\n return false\n }\n current = current[keys[i]]\n }\n const lastKey = keys[keys.length - 1]\n if (lastKey in current) {\n delete current[lastKey]\n return true\n }\n return false\n}\n\n/**\n * 转换为 FormData\n * @param obj 对象\n */\nexport const toFormData = (obj: Record<string, any>): FormData => {\n const formData = new FormData()\n for (const key in obj) {\n const value = obj[key]\n if (value !== undefined && value !== null) {\n if (value instanceof File) {\n formData.append(key, value)\n } else if (Array.isArray(value)) {\n formData.append(key, JSON.stringify(value))\n } else if (typeof value === 'object') {\n formData.append(key, JSON.stringify(value))\n } else {\n formData.append(key, String(value))\n }\n }\n }\n return formData\n}\n\n/**\n * 对象差值(返回在 obj 中但不在 base 中的键值对)\n * @param obj 对象\n * @param base 基础对象\n */\nexport const diff = <T extends Record<string, any>>(obj: T, base: T): Partial<T> => {\n const result: Record<string, any> = {}\n for (const key in obj) {\n if (!isEqual(obj[key], base[key])) {\n result[key] = obj[key]\n }\n }\n return result as Partial<T>\n}\n\n/**\n * 深度冻结对象\n * @param obj 对象\n */\nexport const deepFreeze = <T>(obj: T): T => {\n if (isObject(obj) || isArray(obj)) {\n Object.freeze(obj)\n for (const key in obj) {\n deepFreeze((obj as any)[key])\n }\n }\n return obj\n}\n\n/**\n * 获取对象的第一个值\n * @param obj 对象\n */\nexport const first = <T>(obj: Record<string, T>): T | undefined => {\n const values = Object.values(obj)\n return values[0]\n}\n\n/**\n * 获取对象的最后一个值\n * @param obj 对象\n */\nexport const last = <T>(obj: Record<string, T>): T | undefined => {\n const values = Object.values(obj)\n return values[values.length - 1]\n}\n\n/**\n * 按路径分组对象数组\n * @param arr 对象数组\n * @param keyPath 键路径\n */\nexport const groupByPath = <T extends Record<string, any>>(\n arr: T[],\n keyPath: string\n): Record<string, T[]> => {\n return groupBy(arr, item => get(item, keyPath))\n}\n","/**\n * Excel 工具模块\n * 基于 xlsx 封装,提供常用的 Excel 处理功能\n */\n\nimport * as XLSX from 'xlsx'\n\nexport interface ExcelExportOptions {\n filename?: string\n sheetName?: string\n header?: Record<string, string>\n}\n\nexport interface ExcelImportOptions {\n header?: number\n raw?: boolean\n defval?: any\n}\n\n/**\n * 导出 Excel\n * @param data 数据\n * @param options 选项\n */\nexport const exportExcel = <T extends Record<string, any>>(\n data: T[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n // 处理表头映射\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n // 创建工作簿\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n\n // 下载文件\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(多 Sheet)\n * @param sheetsData Sheet 数据\n * @param filename 文件名\n */\nexport const exportMultiSheetExcel = (\n sheetsData: Array<{ name: string; data: Record<string, any>[]; header?: Record<string, string> }>,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.book_new()\n\n sheetsData.forEach(({ name, data, header }) => {\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n XLSX.utils.book_append_sheet(workbook, worksheet, name)\n })\n\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导入 Excel\n * @param file 文件\n * @param options 选项\n */\nexport const importExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<T[]> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[0]\n const worksheet = workbook.Sheets[sheetName]\n\n const jsonData = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n\n resolve(jsonData)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导入 Excel(所有 Sheet)\n * @param file 文件\n * @param options 选项\n */\nexport const importAllSheetsExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<Record<string, T[]>> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const result: Record<string, T[]> = {}\n\n workbook.SheetNames.forEach(sheetName => {\n const worksheet = workbook.Sheets[sheetName]\n result[sheetName] = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n })\n\n resolve(result)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导出 Excel(使用自定义表头)\n * @param data 数据\n * @param headers 表头\n * @param filename 文件名\n * @param sheetName Sheet 名称\n */\nexport const exportExcelWithHeaders = (\n data: Record<string, any>[],\n headers: { key: string; label: string }[],\n filename = 'export.xlsx',\n sheetName = 'Sheet1'\n): void => {\n const worksheet = XLSX.utils.json_to_sheet([])\n\n // 添加表头\n XLSX.utils.sheet_add_aoa(worksheet, [headers.map(h => h.label)], { origin: 'A1' })\n\n // 添加数据\n const rows = data.map(item => headers.map(h => item[h.key]))\n XLSX.utils.sheet_add_aoa(worksheet, rows, { origin: 'A2' })\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(设置列宽)\n * @param data 数据\n * @param columnWidths 列宽\n * @param options 其他选项\n */\nexport const exportExcelWithColumnWidths = (\n data: Record<string, any>[],\n columnWidths: { wch?: number; wpx?: number; width?: number }[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 设置列宽\n worksheet['!cols'] = columnWidths\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(合并单元格)\n * @param data 数据\n * @param merges 合并区域\n * @param options 其他选项\n */\nexport const exportExcelWithMerges = (\n data: Record<string, any>[],\n merges: XLSX.Range[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 合并单元格\n worksheet['!merges'] = merges\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 获取 Excel 的 Sheet 列表\n * @param file 文件\n */\nexport const getSheetNames = (file: File | ArrayBuffer): Promise<string[]> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n resolve(workbook.SheetNames)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 将 HTML 表格导出为 Excel\n * @param tableElement 表格元素\n * @param filename 文件名\n */\nexport const exportTableToExcel = (\n tableElement: HTMLTableElement,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.table_to_book(tableElement)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 将 Excel 转换为 HTML 表格\n * @param file 文件\n * @param sheetIndex Sheet 索引\n */\nexport const excelToTable = (file: File, sheetIndex = 0): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[sheetIndex]\n const worksheet = workbook.Sheets[sheetName]\n\n const html = XLSX.utils.sheet_to_html(worksheet)\n resolve(html)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n reader.readAsBinaryString(file)\n })\n}\n","/**\n * PDF 工具模块\n * 基于 html2canvas 和 jspdf 封装,提供常用的 PDF 处理功能\n */\n\nimport html2canvas, { type Options as Html2CanvasOptions } from 'html2canvas'\nimport { jsPDF } from 'jspdf'\n\nexport interface CaptureToPDFOptions {\n filename?: string\n scale?: number\n useCORS?: boolean\n backgroundColor?: string\n logging?: boolean\n pagebreak?: { mode?: string; before?: string; after?: string }\n margin?: number\n}\n\nexport interface PDFOptions {\n orientation?: 'p' | 'portrait' | 'l' | 'landscape'\n unit?: 'pt' | 'mm' | 'cm' | 'in'\n format?: 'a0' | 'a1' | 'a2' | 'a3' | 'a4' | 'legal' | 'letter' | [number, number]\n}\n\n/**\n * 将 DOM 元素转换为 PDF\n * @param element DOM 元素\n * @param options 选项\n */\nexport const captureToPDF = async (\n element: HTMLElement,\n options: CaptureToPDFOptions = {}\n): Promise<void> => {\n const {\n filename = 'download.pdf',\n scale = 2,\n useCORS = true,\n backgroundColor = '#ffffff',\n logging = false,\n margin = 10,\n } = options\n\n // 使用 html2canvas 将 DOM 转换为 canvas\n const canvas = await html2canvas(element, {\n scale,\n useCORS,\n backgroundColor,\n logging,\n })\n\n // 获取 canvas 的尺寸\n const imgData = canvas.toDataURL('image/png')\n const imgWidth = canvas.width\n const imgHeight = canvas.height\n\n // 计算 PDF 尺寸\n const pdfWidth = imgWidth / scale\n const pdfHeight = imgHeight / scale\n\n // 创建 PDF\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? 'l' : 'p',\n unit: 'pt',\n format: [pdfWidth + margin * 2, pdfHeight + margin * 2],\n })\n\n // 添加图片到 PDF\n pdf.addImage(imgData, 'PNG', margin, margin, pdfWidth, pdfHeight)\n pdf.save(filename)\n}\n\n/**\n * 将 DOM 元素转换为 PDF(分页)\n * @param element DOM 元素\n * @param options 选项\n */\nexport const captureToPDFWithPagination = async (\n element: HTMLElement,\n options: CaptureToPDFOptions = {}\n): Promise<void> => {\n const {\n filename = 'download.pdf',\n scale = 2,\n useCORS = true,\n backgroundColor = '#ffffff',\n logging = false,\n margin = 10,\n } = options\n\n // 使用 html2canvas 将 DOM 转换为 canvas\n const canvas = await html2canvas(element, {\n scale,\n useCORS,\n backgroundColor,\n logging,\n })\n\n // 获取 canvas 的尺寸\n const imgData = canvas.toDataURL('image/png')\n const imgWidth = canvas.width\n const imgHeight = canvas.height\n\n // 创建 PDF (A4)\n const pdf = new jsPDF('p', 'pt', 'a4')\n const pdfWidth = pdf.internal.pageSize.getWidth()\n const pdfHeight = pdf.internal.pageSize.getHeight()\n\n // 计算图片在 PDF 中的尺寸\n const imgWidthInPDF = pdfWidth - margin * 2\n const imgHeightInPDF = (imgHeight / imgWidth) * imgWidthInPDF\n\n let heightLeft = imgHeightInPDF\n let position = margin\n\n // 第一页\n pdf.addImage(imgData, 'PNG', margin, position, imgWidthInPDF, imgHeightInPDF)\n heightLeft -= pdfHeight - margin * 2\n\n // 分页\n while (heightLeft > 0) {\n position = heightLeft - imgHeightInPDF + margin\n pdf.addPage()\n pdf.addImage(imgData, 'PNG', margin, position, imgWidthInPDF, imgHeightInPDF)\n heightLeft -= pdfHeight - margin * 2\n }\n\n pdf.save(filename)\n}\n\n/**\n * 截取 DOM 元素为图片\n * @param element DOM 元素\n * @param options html2canvas 选项\n */\nexport const captureToImage = async (\n element: HTMLElement,\n options: Partial<Html2CanvasOptions> = {}\n): Promise<string> => {\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: '#ffffff',\n logging: false,\n ...options,\n })\n\n return canvas.toDataURL('image/png')\n}\n\n/**\n * 截取 DOM 元素并下载为图片\n * @param element DOM 元素\n * @param filename 文件名\n * @param options html2canvas 选项\n */\nexport const captureToImageDownload = async (\n element: HTMLElement,\n filename = 'screenshot.png',\n options: Partial<Html2CanvasOptions> = {}\n): Promise<void> => {\n const dataUrl = await captureToImage(element, options)\n\n const link = document.createElement('a')\n link.href = dataUrl\n link.download = filename\n link.click()\n}\n\n/**\n * 创建空白 PDF\n * @param options PDF 选项\n */\nexport const createPDF = (options: PDFOptions = {}): jsPDF => {\n return new jsPDF(options)\n}\n\n/**\n * 添加文本到 PDF\n * @param pdf PDF 实例\n * @param text 文本\n * @param x X 坐标\n * @param y Y 坐标\n * @param options 选项\n */\nexport const addTextToPDF = (\n pdf: jsPDF,\n text: string,\n x: number,\n y: number,\n options: {\n maxWidth?: number\n align?: 'left' | 'center' | 'right'\n fontSize?: number\n fontStyle?: 'normal' | 'bold' | 'italic' | 'bolditalic'\n } = {}\n): void => {\n const { maxWidth, align = 'left', fontSize = 12, fontStyle = 'normal' } = options\n\n pdf.setFontSize(fontSize)\n pdf.setFont('helvetica', fontStyle)\n pdf.text(text, x, y, { maxWidth, align })\n}\n\n/**\n * 添加图片到 PDF\n * @param pdf PDF 实例\n * @param imageData 图片数据(DataURL 或 URL)\n * @param x X 坐标\n * @param y Y 坐标\n * @param width 宽度\n * @param height 高度\n */\nexport const addImageToPDF = (\n pdf: jsPDF,\n imageData: string,\n x: number,\n y: number,\n width: number,\n height: number\n): void => {\n pdf.addImage(imageData, 'PNG', x, y, width, height)\n}\n\n/**\n * 添加表格到 PDF\n * @param pdf PDF 实例\n * @param headers 表头\n * @param data 数据\n * @param options 选项\n */\nexport const addTableToPDF = (\n pdf: jsPDF,\n headers: string[],\n data: string[][],\n options: {\n x?: number\n y?: number\n cellWidth?: number\n cellHeight?: number\n headerBackgroundColor?: string\n headerTextColor?: string\n textColor?: string\n fontSize?: number\n lineWidth?: number\n lineColor?: number[]\n } = {}\n): void => {\n const {\n x = 10,\n y = 10,\n cellWidth = 50,\n cellHeight = 20,\n headerBackgroundColor = '#4472C4',\n headerTextColor = '#ffffff',\n textColor = '#000000',\n fontSize = 10,\n lineWidth = 0.1,\n lineColor = [200, 200, 200],\n } = options\n\n pdf.setFontSize(fontSize)\n let currentY = y\n\n // 绘制表头\n headers.forEach((header, index) => {\n const cellX = x + index * cellWidth\n\n // 绘制背景\n pdf.setFillColor(\n parseInt(headerBackgroundColor.slice(1, 3), 16),\n parseInt(headerBackgroundColor.slice(3, 5), 16),\n parseInt(headerBackgroundColor.slice(5, 7), 16)\n )\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'F')\n\n // 绘制边框\n pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2])\n pdf.setLineWidth(lineWidth)\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'S')\n\n // 绘制文本\n pdf.setTextColor(\n parseInt(headerTextColor.slice(1, 3), 16),\n parseInt(headerTextColor.slice(3, 5), 16),\n parseInt(headerTextColor.slice(5, 7), 16)\n )\n pdf.text(header, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {\n align: 'center',\n })\n })\n\n currentY += cellHeight\n\n // 绘制数据\n pdf.setTextColor(\n parseInt(textColor.slice(1, 3), 16),\n parseInt(textColor.slice(3, 5), 16),\n parseInt(textColor.slice(5, 7), 16)\n )\n\n data.forEach(row => {\n row.forEach((cell, index) => {\n const cellX = x + index * cellWidth\n\n // 绘制边框\n pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2])\n pdf.setLineWidth(lineWidth)\n pdf.rect(cellX, currentY, cellWidth, cellHeight, 'S')\n\n // 绘制文本\n pdf.text(cell, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {\n align: 'center',\n })\n })\n currentY += cellHeight\n })\n}\n\n/**\n * 添加新页面\n * @param pdf PDF 实例\n */\nexport const addPage = (pdf: jsPDF): void => {\n pdf.addPage()\n}\n\n/**\n * 保存 PDF\n * @param pdf PDF 实例\n * @param filename 文件名\n */\nexport const savePDF = (pdf: jsPDF, filename = 'download.pdf'): void => {\n pdf.save(filename)\n}\n\n/**\n * PDF 转 DataURL\n * @param pdf PDF 实例\n */\nexport const pdfToDataURL = (pdf: jsPDF): string => {\n return pdf.output('dataurlstring')\n}\n\n/**\n * PDF 转 Blob\n * @param pdf PDF 实例\n */\nexport const pdfToBlob = (pdf: jsPDF): Blob => {\n return pdf.output('blob')\n}\n\n/**\n * 合并多个 PDF(需要使用 pdf-lib 库实现)\n * @param _pdfs PDF 实例数组\n */\nexport const mergePDFs = (_pdfs: jsPDF[]): Promise<jsPDF> => {\n return Promise.reject(\n new Error('mergePDFs 功能需要使用 pdf-lib 库实现。请安装 pdf-lib 并使用其提供的合并功能。')\n )\n}\n\n/**\n * 导出 jsPDF 和 html2canvas 原始对象,方便高级用法\n */\nexport { jsPDF, html2canvas }\n","/**\n * Map Module - OpenLayers 高级封装\n *\n * 提供简化的地图操作 API,支持:\n * - 自定义图标样式\n * - GeoJSON 支持\n * - 主题切换(亮/暗)\n * - Overlay 管理\n * - 动态缩放\n */\n\nimport { Feature } from 'ol'\nimport { defaults as defaultControls } from 'ol/control'\nimport { FullScreen } from 'ol/control'\nimport { ScaleLine } from 'ol/control'\nimport { Point, LineString, Polygon } from 'ol/geom'\nimport { Draw, Modify, Snap } from 'ol/interaction'\nimport { Select } from 'ol/interaction'\nimport Overlay from 'ol/Overlay'\nimport TileLayer from 'ol/layer/Tile'\nimport VectorLayer from 'ol/layer/Vector'\nimport { Map as OlMap } from 'ol'\nimport { fromLonLat, toLonLat, transform } from 'ol/proj'\nimport OSM from 'ol/source/OSM'\nimport VectorSource from 'ol/source/Vector'\nimport XYZ from 'ol/source/XYZ'\nimport GeoJSON from 'ol/format/GeoJSON'\nimport { Style, Circle, Fill, Stroke, Icon } from 'ol/style'\nimport { View } from 'ol'\nimport { boundingExtent } from 'ol/extent'\n\n// ==================== 类型定义 ====================\n\n/**\n * 主题类型\n */\nexport type MapTheme = 'light' | 'dark'\n\n/**\n * 地图配置选项\n */\nexport interface MapOptions {\n /** 地图容器 ID */\n container: string\n /** 中心点 [经度, 纬度] */\n center?: [number, number]\n /** 缩放级别 */\n zoom?: number\n /** 最小缩放级别 */\n minZoom?: number\n /** 最大缩放级别 */\n maxZoom?: number\n /** 是否显示比例尺 */\n showScaleLine?: boolean\n /** 是否显示全屏按钮 */\n showFullScreen?: boolean\n /** 默认图层 */\n layers?: Layer[]\n /** 主题 */\n theme?: MapTheme\n /** 主题配置 */\n themeConfig?: ThemeConfig\n /** 自定义图标配置 */\n icons?: Record<string, IconConfig>\n /** 是否启用动态缩放 */\n enableDynamicScale?: boolean\n /** 投影坐标系,默认 EPSG:4326 */\n projection?: string\n}\n\n/**\n * 图层类型\n */\nexport interface Layer {\n /** 图层名称 */\n name: string\n /** 图层实例 */\n layer: import('ol/layer/Base').default\n}\n\n/**\n * 主题配置\n */\nexport interface ThemeConfig {\n /** 亮色地图 URL */\n lightUrl?: string\n /** 暗色地图 URL */\n darkUrl?: string\n}\n\n/**\n * 图标配置\n */\nexport interface IconConfig {\n /** 图标 URL 或 base64 */\n src: string\n /** 锚点位置 [x, y],默认 [0.5, 0.5] */\n anchor?: [number, number]\n /** 缩放比例,默认 1 */\n scale?: number\n}\n\n/**\n * 标记选项\n */\nexport interface MarkerOptions {\n /** 坐标 [经度, 纬度] */\n coordinate: [number, number]\n /** 颜色 */\n color?: string\n /** 半径 */\n radius?: number\n /** 边框颜色 */\n strokeColor?: string\n /** 边框宽度 */\n strokeWidth?: number\n /** 自定义图标名称 */\n icon?: string\n /** 自定义图标配置 */\n iconConfig?: IconConfig\n /** 自定义样式 */\n style?: Style\n}\n\n/**\n * 要素样式选项\n */\nexport interface FeatureStyleOptions {\n /** 图标名称(来自 icons 配置) */\n icon?: string\n /** 自定义图标配置 */\n iconConfig?: IconConfig\n /** 填充颜色(Polygon) */\n fillColor?: string\n /** 边框颜色 */\n strokeColor?: string\n /** 边框宽度 */\n strokeWidth?: number\n /** 自定义样式 */\n style?: Style\n}\n\n/**\n * 绘制类型\n */\nexport type DrawType = 'Point' | 'LineString' | 'Polygon' | 'Circle'\n\n/**\n * 绘制选项\n */\nexport interface DrawOptions {\n /** 绘制类型 */\n type: DrawType\n /** 绘制完成回调 */\n onDrawEnd?: (feature: Feature) => void\n /** 绘制样式 */\n style?: Style\n /** 绘制图层名称 */\n layerName?: string\n}\n\n/**\n * GeoJSON 要素选项\n */\nexport interface GeoJSONFeature {\n type: 'FeatureCollection'\n features: GeoJSONFeatureItem[]\n}\n\n/**\n * GeoJSON 要素项\n */\nexport interface GeoJSONFeatureItem {\n type: 'Feature'\n geometry: {\n type: 'Point' | 'LineString' | 'Polygon'\n coordinates: number[] | number[][] | number[][][]\n }\n properties?: Record<string, any>\n}\n\n/**\n * Overlay 配置\n */\nexport interface OverlayOptions {\n /** Overlay 名称 */\n name: string\n /** DOM 元素 */\n element: HTMLElement\n /** 是否自动平移 */\n autoPan?: boolean\n /** 偏移量 */\n offset?: number[]\n /** 定位方式 */\n positioning?: 'bottom-center' | 'bottom-left' | 'bottom-right' | 'center-center' | 'center-left' | 'center-right' | 'top-center' | 'top-left' | 'top-right'\n}\n\n/**\n * 矢量图层配置\n */\nexport interface VectorLayerConfig {\n /** 图层名称 */\n name: string\n /** 最小缩放级别 */\n minZoom?: number\n /** 最大缩放级别 */\n maxZoom?: number\n /** 图层层级 */\n zIndex?: number\n /** 默认样式 */\n style?: Style\n /** 是否可见 */\n visible?: boolean\n}\n\n// ==================== Map 类 ====================\n\n/**\n * 地图类 - 封装 OpenLayers Map\n */\nexport class MapInstance {\n private map: OlMap\n private vectorSources: Map<string, VectorSource> = new Map()\n private vectorLayers: Map<string, VectorLayer<VectorSource>> = new Map()\n private overlays: Map<string, Overlay> = new Map()\n private themeLayers: Map<MapTheme, TileLayer<XYZ>> = new Map()\n private drawInteraction: Draw | null = null\n private modifyInteraction: Modify | null = null\n private snapInteraction: Snap | null = null\n private selectInteraction: Select | null = null\n private currentTheme: MapTheme = 'light'\n private icons: Map<string, IconConfig> = new Map()\n private enableDynamicScale: boolean = false\n private projection: string = 'EPSG:4326'\n\n constructor(options: MapOptions) {\n this.enableDynamicScale = options.enableDynamicScale || false\n this.projection = options.projection || 'EPSG:4326'\n this.currentTheme = options.theme || 'light'\n\n // 初始化图标\n if (options.icons) {\n Object.entries(options.icons).forEach(([name, config]) => {\n this.icons.set(name, config)\n })\n }\n\n // 创建控件\n const controls = defaultControls({\n zoom: false,\n rotate: false,\n attribution: false\n })\n if (options.showScaleLine !== false) {\n controls.push(new ScaleLine())\n }\n if (options.showFullScreen !== false) {\n controls.push(new FullScreen())\n }\n\n // 创建地图\n this.map = new OlMap({\n target: options.container,\n layers: [],\n view: new View({\n center: fromLonLat(options.center || [116.3974, 39.9093]), // 默认北京\n zoom: options.zoom || 10,\n minZoom: options.minZoom || 1,\n maxZoom: options.maxZoom || 20,\n projection: this.projection,\n constrainResolution: true,\n smoothResolutionConstraint: false\n }),\n controls,\n })\n\n // 添加主题图层\n if (options.themeConfig) {\n this.setupThemeLayers(options.themeConfig)\n }\n\n // 添加默认图层\n if (options.layers) {\n options.layers.forEach(layer => this.map.addLayer(layer.layer))\n }\n\n // 监听缩放事件(用于动态缩放)\n if (this.enableDynamicScale) {\n this.map.on('moveend', () => this.handleZoomChange())\n }\n }\n\n // ==================== 主题管理 ====================\n\n /**\n * 设置主题图层\n */\n private setupThemeLayers(config: ThemeConfig): void {\n const lightUrl = config.lightUrl || 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'\n const darkUrl = config.darkUrl || 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=9&x={x}&y={y}&z={z}'\n\n const lightLayer = new TileLayer({\n preload: Infinity,\n source: new XYZ({ url: lightUrl }),\n })\n\n const darkLayer = new TileLayer({\n preload: Infinity,\n source: new XYZ({ url: darkUrl }),\n })\n\n this.themeLayers.set('light', lightLayer)\n this.themeLayers.set('dark', darkLayer)\n\n this.map.addLayer(lightLayer)\n this.map.addLayer(darkLayer)\n\n // 设置当前主题\n this.setTheme(this.currentTheme)\n }\n\n /**\n * 切换主题\n */\n setTheme(theme: MapTheme): void {\n this.currentTheme = theme\n\n this.themeLayers.forEach((layer: TileLayer<XYZ>, key: MapTheme) => {\n layer.setVisible(key === theme)\n })\n }\n\n /**\n * 获取当前主题\n */\n getTheme(): MapTheme {\n return this.currentTheme\n }\n\n // ==================== 图层管理 ====================\n\n /**\n * 创建矢量图层\n */\n createVectorLayer(config: VectorLayerConfig): void {\n if (this.vectorLayers.has(config.name)) {\n console.warn(`图层 \"${config.name}\" 已存在`)\n return\n }\n\n const source = new VectorSource({\n format: new GeoJSON()\n })\n\n const layer = new VectorLayer({\n source,\n style: config.style,\n minZoom: config.minZoom,\n maxZoom: config.maxZoom,\n zIndex: config.zIndex,\n visible: config.visible !== false\n })\n\n this.vectorSources.set(config.name, source)\n this.vectorLayers.set(config.name, layer)\n this.map.addLayer(layer)\n }\n\n /**\n * 获取矢量图层\n */\n getVectorLayer(name: string): VectorLayer<VectorSource> | undefined {\n return this.vectorLayers.get(name)\n }\n\n /**\n * 获取矢量数据源\n */\n getVectorSource(name: string): VectorSource | undefined {\n return this.vectorSources.get(name)\n }\n\n /**\n * 显示/隐藏矢量图层\n */\n setLayerVisible(name: string, visible: boolean): void {\n const layer = this.vectorLayers.get(name)\n if (layer) {\n layer.setVisible(visible)\n }\n }\n\n /**\n * 设置矢量图层样式\n */\n setLayerStyle(name: string, style: Style): void {\n const layer = this.vectorLayers.get(name)\n if (layer) {\n layer.setStyle(style)\n }\n }\n\n /**\n * 清除矢量图层\n */\n clearLayer(name: string): void {\n const source = this.vectorSources.get(name)\n if (source) {\n source.clear()\n }\n }\n\n /**\n * 删除矢量图层\n */\n removeLayer(name: string): void {\n const layer = this.vectorLayers.get(name)\n if (layer) {\n this.map.removeLayer(layer)\n this.vectorLayers.delete(name)\n this.vectorSources.delete(name)\n }\n }\n\n // ==================== 要素管理 ====================\n\n /**\n * 添加标记\n */\n addMarker(options: MarkerOptions, layerName = 'default'): Feature {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n const feature = new Feature({\n geometry: new Point(fromLonLat(options.coordinate)),\n })\n\n const style = options.style || this.createMarkerStyle(options)\n feature.setStyle(style)\n source.addFeature(feature)\n\n return feature\n }\n\n /**\n * 创建标记样式\n */\n private createMarkerStyle(options: MarkerOptions): Style {\n // 如果指定了图标\n if (options.icon && this.icons.has(options.icon)) {\n const iconConfig = this.icons.get(options.icon)!\n return new Style({\n image: new Icon({\n anchor: iconConfig.anchor || [0.5, 0.5],\n src: iconConfig.src,\n scale: iconConfig.scale || 1\n })\n })\n }\n\n // 如果指定了自定义图标配置\n if (options.iconConfig) {\n return new Style({\n image: new Icon({\n anchor: options.iconConfig.anchor || [0.5, 0.5],\n src: options.iconConfig.src,\n scale: options.iconConfig.scale || 1\n })\n })\n }\n\n // 默认圆形样式\n return new Style({\n image: new Circle({\n radius: options.radius || 7,\n fill: new Fill({ color: options.color || '#ff3333' }),\n stroke: new Stroke({\n color: options.strokeColor || '#ffffff',\n width: options.strokeWidth || 2,\n }),\n }),\n })\n }\n\n /**\n * 移除标记\n */\n removeMarker(feature: Feature, layerName = 'default'): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n source.removeFeature(feature)\n }\n }\n\n /**\n * 从 GeoJSON 添加要素\n */\n addFeaturesFromGeoJSON(geoJson: GeoJSONFeature | string, layerName = 'default'): Feature[] {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n const format = new GeoJSON()\n const features = format.readFeatures(typeof geoJson === 'string' ? geoJson : JSON.stringify(geoJson))\n\n source.addFeatures(features)\n\n return features\n }\n\n /**\n * 添加要素\n */\n addFeature(feature: Feature, layerName = 'default'): void {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n source.addFeature(feature)\n }\n\n /**\n * 批量添加要素\n */\n addFeatures(features: Feature[], layerName = 'default'): void {\n // 如果图层不存在,创建默认图层\n if (!this.vectorLayers.has(layerName)) {\n this.createVectorLayer({ name: layerName })\n }\n\n const source = this.vectorSources.get(layerName)!\n source.addFeatures(features)\n }\n\n /**\n * 移除要素\n */\n removeFeature(feature: Feature, layerName = 'default'): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n source.removeFeature(feature)\n }\n }\n\n /**\n * 清除所有矢量要素\n */\n clearFeatures(layerName = 'default'): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n source.clear()\n }\n }\n\n /**\n * 获取图层中的所有要素\n */\n getFeatures(layerName = 'default'): Feature[] {\n const source = this.vectorSources.get(layerName)\n return source ? source.getFeatures() : []\n }\n\n /**\n * 创建 GeoJSON\n */\n createGeoJSON(type: 'Point' | 'LineString' | 'Polygon', data: any): GeoJSONFeature {\n const coordinates: any = this.getCoordinates(type, data)\n const id = this.generateUUID()\n\n return {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n geometry: {\n type,\n coordinates\n },\n properties: {\n id,\n value: data\n }\n }]\n }\n }\n\n /**\n * 获取坐标\n */\n private getCoordinates(type: string, data: any): any {\n if (type === 'Point') {\n return fromLonLat(transform(data.points, 'EPSG:3857', 'EPSG:4326'))\n } else if (type === 'LineString') {\n return this.setPointArray(data.points)\n } else if (type === 'Polygon') {\n return [this.setPointArray(data.points)]\n }\n return []\n }\n\n /**\n * 设置点数组\n */\n private setPointArray(points: any[]): number[][] {\n return points.map(item => fromLonLat(transform(item, 'EPSG:3857', 'EPSG:4326')))\n }\n\n /**\n * 生成 UUID\n */\n private generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0\n const v = c === 'x' ? r : (r & 0x3 | 0x8)\n return v.toString(16)\n })\n }\n\n /**\n * 设置要素样式\n */\n setFeatureStyle(feature: Feature, options: FeatureStyleOptions): void {\n const style = this.createFeatureStyle(options)\n feature.setStyle(style)\n }\n\n /**\n * 创建要素样式\n */\n private createFeatureStyle(options: FeatureStyleOptions): Style {\n // 自定义样式\n if (options.style) {\n return options.style\n }\n\n // 自定义图标\n if (options.icon && this.icons.has(options.icon)) {\n const iconConfig = this.icons.get(options.icon)!\n return new Style({\n image: new Icon({\n anchor: iconConfig.anchor || [0.5, 0.5],\n src: iconConfig.src,\n scale: iconConfig.scale || 1\n })\n })\n }\n\n // 自定义图标配置\n if (options.iconConfig) {\n return new Style({\n image: new Icon({\n anchor: options.iconConfig.anchor || [0.5, 0.5],\n src: options.iconConfig.src,\n scale: options.iconConfig.scale || 1\n })\n })\n }\n\n // 默认样式\n return new Style({\n stroke: new Stroke({\n color: options.strokeColor || '#3388ff',\n width: options.strokeWidth || 2,\n }),\n fill: new Fill({\n color: options.fillColor || 'rgba(51, 136, 255, 0.2)',\n }),\n image: new Circle({\n radius: 7,\n fill: new Fill({ color: options.strokeColor || '#3388ff' }),\n stroke: new Stroke({\n color: '#ffffff',\n width: 2,\n }),\n }),\n })\n }\n\n // ==================== 动态缩放 ====================\n\n /**\n * 处理缩放变化\n */\n private handleZoomChange(): void {\n const zoom = this.getZoom()\n if (zoom !== undefined) {\n this.updateIconScale(zoom)\n }\n }\n\n /**\n * 更新图标缩放比例\n */\n private updateIconScale(zoom: number): void {\n let scale = 1\n\n if (zoom >= 14) {\n scale = 0.5\n } else if (zoom < 14 && zoom >= 12) {\n scale = 0.4\n } else if (zoom < 12) {\n scale = 0.3\n }\n\n // 更新所有图层的图标样式\n this.vectorLayers.forEach((layer: VectorLayer<VectorSource>) => {\n const features = layer.getSource()?.getFeatures()\n if (features) {\n features.forEach((feature: Feature) => {\n const style = feature.getStyle() as Style\n if (style) {\n const image = style.getImage()\n if (image instanceof Icon) {\n image.setScale(scale)\n }\n }\n })\n }\n })\n }\n\n // ==================== Overlay 管理 ====================\n\n /**\n * 创建 Overlay\n */\n createOverlay(options: OverlayOptions): void {\n const overlay = new Overlay({\n element: options.element,\n autoPan: options.autoPan !== false,\n offset: options.offset,\n positioning: options.positioning || 'bottom-center'\n })\n\n this.overlays.set(options.name, overlay)\n this.map.addOverlay(overlay)\n }\n\n /**\n * 显示 Overlay\n */\n showOverlay(name: string, coordinate: [number, number]): void {\n const overlay = this.overlays.get(name)\n if (overlay) {\n overlay.setPosition(fromLonLat(coordinate))\n }\n }\n\n /**\n * 隐藏 Overlay\n */\n hideOverlay(name: string): void {\n const overlay = this.overlays.get(name)\n if (overlay) {\n overlay.setPosition(undefined)\n }\n }\n\n /**\n * 移除 Overlay\n */\n removeOverlay(name: string): void {\n const overlay = this.overlays.get(name)\n if (overlay) {\n this.map.removeOverlay(overlay)\n this.overlays.delete(name)\n }\n }\n\n // ==================== 交互管理 ====================\n\n /**\n * 开始绘制\n */\n startDraw(options: DrawOptions): void {\n this.stopDraw()\n\n const source = options.layerName && this.vectorSources.has(options.layerName)\n ? this.vectorSources.get(options.layerName)!\n : new VectorSource()\n\n this.drawInteraction = new Draw({\n source,\n type: options.type,\n style: options.style,\n })\n\n this.map.addInteraction(this.drawInteraction)\n\n if (options.onDrawEnd) {\n this.drawInteraction.on('drawend', evt => {\n options.onDrawEnd?.(evt.feature)\n })\n }\n\n // 添加吸附交互\n this.snapInteraction = new Snap({ source })\n this.map.addInteraction(this.snapInteraction)\n }\n\n /**\n * 停止绘制\n */\n stopDraw(): void {\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction)\n this.drawInteraction = null\n }\n if (this.snapInteraction) {\n this.map.removeInteraction(this.snapInteraction)\n this.snapInteraction = null\n }\n }\n\n /**\n * 开始编辑\n */\n startModify(layerName = 'default'): void {\n this.stopModify()\n\n const source = this.vectorSources.get(layerName)\n if (!source) {\n console.warn(`图层 \"${layerName}\" 不存在`)\n return\n }\n\n this.modifyInteraction = new Modify({\n source,\n })\n\n this.map.addInteraction(this.modifyInteraction)\n\n // 添加吸附交互\n this.snapInteraction = new Snap({ source })\n this.map.addInteraction(this.snapInteraction)\n }\n\n /**\n * 停止编辑\n */\n stopModify(): void {\n if (this.modifyInteraction) {\n this.map.removeInteraction(this.modifyInteraction)\n this.modifyInteraction = null\n }\n if (this.snapInteraction) {\n this.map.removeInteraction(this.snapInteraction)\n this.snapInteraction = null\n }\n }\n\n /**\n * 开始选择\n */\n startSelect(layerName = 'default', onSelect?: (features: Feature[]) => void): void {\n this.stopSelect()\n\n this.selectInteraction = new Select({\n layers: this.vectorLayers.get(layerName) ? [this.vectorLayers.get(layerName)!] : undefined\n })\n\n this.map.addInteraction(this.selectInteraction)\n\n if (onSelect) {\n this.selectInteraction.on('select', evt => {\n onSelect(evt.selected)\n })\n }\n }\n\n /**\n * 停止选择\n */\n stopSelect(): void {\n if (this.selectInteraction) {\n this.map.removeInteraction(this.selectInteraction)\n this.selectInteraction = null\n }\n }\n\n /**\n * 获取选中的要素\n */\n getSelectedFeatures(): Feature[] {\n return this.selectInteraction?.getFeatures().getArray() || []\n }\n\n // ==================== 地图控制 ====================\n\n /**\n * 获取原始地图实例\n */\n getOlMap(): OlMap {\n return this.map\n }\n\n /**\n * 获取视图\n */\n getView(): View | undefined {\n return this.map.getView()\n }\n\n /**\n * 设置中心点\n */\n setCenter(coord: [number, number]): void {\n const view = this.getView()\n if (view) {\n view.setCenter(fromLonLat(coord))\n this.map.render()\n }\n }\n\n /**\n * 获取中心点\n */\n getCenter(): [number, number] | undefined {\n const view = this.getView()\n if (view) {\n const center = view.getCenter()\n return center ? (toLonLat(center) as [number, number]) : undefined\n }\n return undefined\n }\n\n /**\n * 设置缩放级别\n */\n setZoom(zoom: number): void {\n const view = this.getView()\n if (view) {\n view.setZoom(zoom)\n this.map.render()\n }\n }\n\n /**\n * 获取缩放级别\n */\n getZoom(): number | undefined {\n return this.getView()?.getZoom()\n }\n\n /**\n * 缩放到指定范围\n */\n fit(extent: number[] | null, options?: { padding?: number[]; duration?: number }): void {\n if (!extent) return\n\n const view = this.getView()\n if (view) {\n view.fit(extent, options)\n this.map.render()\n }\n }\n\n /**\n * 缩放到图层\n */\n fitLayer(layerName: string, options?: { padding?: number[]; duration?: number }): void {\n const source = this.vectorSources.get(layerName)\n if (source) {\n const extent = source.getExtent()\n if (extent && extent[0] !== Infinity) {\n this.fit(extent, options)\n }\n }\n }\n\n /**\n * 缩放到坐标数组\n */\n fitCoordinates(coordinates: [number, number][], options?: { padding?: number[]; duration?: number }): void {\n const extent = boundingExtent(coordinates)\n this.fit(extent, options)\n }\n\n /**\n * 添加图层\n */\n addLayer(layer: Layer): void {\n this.map.addLayer(layer.layer)\n }\n\n /**\n * 移除图层\n */\n removeMapLayer(layer: Layer): void {\n this.map.removeLayer(layer.layer)\n }\n\n /**\n * 更新地图大小\n */\n updateSize(): void {\n this.map.updateSize()\n }\n\n /**\n * 地图事件监听\n */\n on(event: string | string[], callback: (...args: unknown[]) => void): void {\n this.map.on(event as never, callback)\n }\n\n /**\n * 移除事件监听\n */\n off(event: string | string[], callback: (...args: unknown[]) => void): void {\n this.map.un(event as never, callback)\n }\n\n /**\n * 销毁地图\n */\n destroy(): void {\n this.stopDraw()\n this.stopModify()\n this.stopSelect()\n\n this.overlays.forEach((overlay: Overlay) => this.map.removeOverlay(overlay))\n this.overlays.clear()\n\n this.vectorLayers.forEach((layer: VectorLayer<VectorSource>) => this.map.removeLayer(layer))\n this.vectorLayers.clear()\n this.vectorSources.clear()\n\n this.map.setTarget(undefined)\n }\n}\n\n// ==================== 图层工厂函数 ====================\n\n/**\n * 创建 OSM 图层\n */\nexport function createOSMLayer(name = 'OSM'): Layer {\n return {\n name,\n layer: new TileLayer({\n source: new OSM(),\n }),\n }\n}\n\n/**\n * 创建 XYZ 图层(适用于高德、百度等)\n */\nexport function createXYZLayer(url: string, name = 'XYZ'): Layer {\n return {\n name,\n layer: new TileLayer({\n source: new XYZ({\n url,\n }),\n }),\n }\n}\n\n/**\n * 创建高德地图图层\n */\nexport function createGaodeLayer(name = '高德地图'): Layer {\n return createXYZLayer(\n 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',\n name\n )\n}\n\n/**\n * 创建天地图图层\n */\nexport function createTiandituLayer(token: string, type = 'vec', name = '天地图'): Layer {\n const url = `https://t{s}.tianditu.gov.cn/DataServer?T=${type}_w&x={x}&y={y}&l={z}&tk=${token}`\n return createXYZLayer(url, name)\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 经纬度转投影坐标\n */\nexport function lonLatToXY(lon: number, lat: number): number[] {\n return fromLonLat([lon, lat])\n}\n\n/**\n * 投影坐标转经纬度\n */\nexport function xyToLonLat(x: number, y: number): [number, number] {\n return toLonLat([x, y]) as [number, number]\n}\n\n/**\n * 创建点要素\n */\nexport function createPointFeature(coordinate: [number, number]): Feature {\n return new Feature({\n geometry: new Point(fromLonLat(coordinate)),\n })\n}\n\n/**\n * 创建线要素\n */\nexport function createLineFeature(coordinates: [number, number][]): Feature {\n return new Feature({\n geometry: new LineString(coordinates.map(coord => fromLonLat(coord))),\n })\n}\n\n/**\n * 创建面要素\n */\nexport function createPolygonFeature(coordinates: [number, number][][]): Feature {\n return new Feature({\n geometry: new Polygon(coordinates.map(ring => ring.map(coord => fromLonLat(coord)))),\n })\n}\n\n/**\n * 创建带样式的点要素\n */\nexport function createStyledPointFeature(coordinate: [number, number], style: Style): Feature {\n const feature = createPointFeature(coordinate)\n feature.setStyle(style)\n return feature\n}\n\n/**\n * 创建带样式的线要素\n */\nexport function createStyledLineFeature(coordinates: [number, number][], style: Style): Feature {\n const feature = createLineFeature(coordinates)\n feature.setStyle(style)\n return feature\n}\n\n/**\n * 创建带样式的面要素\n */\nexport function createStyledPolygonFeature(coordinates: [number, number][][], style: Style): Feature {\n const feature = createPolygonFeature(coordinates)\n feature.setStyle(style)\n return feature\n}\n\n/**\n * 创建图标样式\n */\nexport function createIconStyle(iconUrl: string, options?: {\n anchor?: [number, number]\n scale?: number\n color?: string\n}): Style {\n return new Style({\n image: new Icon({\n anchor: options?.anchor || [0.5, 0.5],\n src: iconUrl,\n scale: options?.scale || 1,\n color: options?.color\n })\n })\n}\n\n/**\n * 创建圆形样式\n */\nexport function createCircleStyle(options?: {\n radius?: number\n fillColor?: string\n strokeColor?: string\n strokeWidth?: number\n}): Style {\n return new Style({\n image: new Circle({\n radius: options?.radius || 7,\n fill: new Fill({ color: options?.fillColor || '#3388ff' }),\n stroke: new Stroke({\n color: options?.strokeColor || '#ffffff',\n width: options?.strokeWidth || 2,\n }),\n }),\n })\n}\n\n/**\n * 创建线样式\n */\nexport function createStrokeStyle(options?: {\n color?: string\n width?: number\n lineDash?: number[]\n}): Style {\n return new Style({\n stroke: new Stroke({\n color: options?.color || '#3388ff',\n width: options?.width || 2,\n lineDash: options?.lineDash\n }),\n })\n}\n\n/**\n * 创建面样式\n */\nexport function createFillStyle(options?: {\n fillColor?: string\n strokeColor?: string\n strokeWidth?: number\n}): Style {\n return new Style({\n stroke: new Stroke({\n color: options?.strokeColor || '#3388ff',\n width: options?.strokeWidth || 2,\n }),\n fill: new Fill({\n color: options?.fillColor || 'rgba(51, 136, 255, 0.2)',\n }),\n })\n}\n","/**\n * Storage Module - 浏览器存储工具\n *\n * 提供统一的浏览器存储操作 API\n */\n\nimport Cookies from 'js-cookie'\n\n// ==================== 类型定义 ====================\n\n/**\n * 存储数据类型\n */\nexport type StorageValue = string | number | boolean | null | undefined | object | unknown[]\n\n/**\n * 存储选项\n */\nexport interface StorageOptions {\n /** 过期时间(毫秒),0 表示永不过期 */\n ttl?: number\n}\n\n/**\n * Cookie 选项\n */\nexport interface CookieOptions extends Cookies.CookieAttributes {\n /** 过期天数 */\n days?: number\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 安全解析 JSON\n */\nfunction safeParse<T = StorageValue>(json: string | null): T | undefined {\n if (!json || json === 'undefined' || json === 'null') {\n return undefined\n }\n try {\n return JSON.parse(json) as T\n } catch {\n return json as T\n }\n}\n\n/**\n * 检查存储是否可用\n */\nfunction isStorageAvailable(storage: Storage): boolean {\n try {\n const testKey = '__storage_test__'\n storage.setItem(testKey, testKey)\n storage.removeItem(testKey)\n return true\n } catch {\n return false\n }\n}\n\n// ==================== LocalStorage ====================\n\n/**\n * 设置永久缓存\n * @param key - 缓存名称\n * @param value - 缓存内容\n * @param options - 存储选项\n * @example\n * ```ts\n * setLocal('user', { name: 'Alice', age: 25 })\n * setLocal('token', 'abc123', { ttl: 3600000 }) // 1小时后过期\n * ```\n */\nexport function setLocal<T = StorageValue>(key: string, value: T, options?: StorageOptions): void {\n if (!isStorageAvailable(window.localStorage)) {\n console.warn('LocalStorage is not available')\n return\n }\n\n const data = options?.ttl\n ? {\n value,\n expires: Date.now() + options.ttl,\n }\n : value\n\n window.localStorage.setItem(key, JSON.stringify(data))\n}\n\n/**\n * 获取永久缓存\n * @param key - 缓存名称\n * @returns 缓存内容,不存在或已过期返回 undefined\n * @example\n * ```ts\n * const user = getLocal<{ name: string; age: number }>('user')\n * console.log(user?.name) // 'Alice'\n * ```\n */\nexport function getLocal<T = StorageValue>(key: string): T | undefined {\n if (!isStorageAvailable(window.localStorage)) {\n return undefined\n }\n\n const json = window.localStorage.getItem(key)\n if (!json) {\n return undefined\n }\n\n const data = safeParse<{ value: T; expires?: number }>(json)\n\n // 检查是否有过期时间\n if (data && typeof data === 'object' && 'expires' in data && 'value' in data) {\n if (data.expires && Date.now() > data.expires) {\n removeLocal(key)\n return undefined\n }\n return data.value\n }\n\n return data as T\n}\n\n/**\n * 移除永久缓存\n * @param key - 缓存名称\n * @example\n * ```ts\n * removeLocal('user')\n * ```\n */\nexport function removeLocal(key: string): void {\n if (isStorageAvailable(window.localStorage)) {\n window.localStorage.removeItem(key)\n }\n}\n\n/**\n * 移除全部永久缓存\n * @example\n * ```ts\n * clearLocal()\n * ```\n */\nexport function clearLocal(): void {\n if (isStorageAvailable(window.localStorage)) {\n window.localStorage.clear()\n }\n}\n\n/**\n * 获取所有 localStorage 的键\n * @returns 键数组\n */\nexport function getLocalKeys(): string[] {\n if (!isStorageAvailable(window.localStorage)) {\n return []\n }\n return Object.keys(window.localStorage)\n}\n\n/**\n * 获取 localStorage 中键的数量\n * @returns 键的数量\n */\nexport function getLocalSize(): number {\n return getLocalKeys().length\n}\n\n// ==================== SessionStorage ====================\n\n/**\n * 设置临时缓存\n * @param key - 缓存名称\n * @param value - 缓存内容\n * @param options - 存储选项\n * @example\n * ```ts\n * setSession('temp', { data: [1, 2, 3] })\n * setSession('session', 'abc123', { ttl: 60000 }) // 1分钟后过期\n * ```\n */\nexport function setSession<T = StorageValue>(\n key: string,\n value: T,\n options?: StorageOptions\n): void {\n if (!isStorageAvailable(window.sessionStorage)) {\n console.warn('SessionStorage is not available')\n return\n }\n\n const data = options?.ttl\n ? {\n value,\n expires: Date.now() + options.ttl,\n }\n : value\n\n window.sessionStorage.setItem(key, JSON.stringify(data))\n}\n\n/**\n * 获取临时缓存\n * @param key - 缓存名称\n * @returns 缓存内容,不存在或已过期返回 undefined\n * @example\n * ```ts\n * const temp = getSession<{ data: number[] }>('temp')\n * console.log(temp?.data) // [1, 2, 3]\n * ```\n */\nexport function getSession<T = StorageValue>(key: string): T | undefined {\n if (!isStorageAvailable(window.sessionStorage)) {\n return undefined\n }\n\n const json = window.sessionStorage.getItem(key)\n if (!json) {\n return undefined\n }\n\n const data = safeParse<{ value: T; expires?: number }>(json)\n\n // 检查是否有过期时间\n if (data && typeof data === 'object' && 'expires' in data && 'value' in data) {\n if (data.expires && Date.now() > data.expires) {\n removeSession(key)\n return undefined\n }\n return data.value\n }\n\n return data as T\n}\n\n/**\n * 移除临时缓存\n * @param key - 缓存名称\n * @example\n * ```ts\n * removeSession('temp')\n * ```\n */\nexport function removeSession(key: string): void {\n if (isStorageAvailable(window.sessionStorage)) {\n window.sessionStorage.removeItem(key)\n }\n}\n\n/**\n * 移除全部临时缓存\n * @example\n * ```ts\n * clearSession()\n * ```\n */\nexport function clearSession(): void {\n if (isStorageAvailable(window.sessionStorage)) {\n window.sessionStorage.clear()\n }\n}\n\n/**\n * 获取所有 sessionStorage 的键\n * @returns 键数组\n */\nexport function getSessionKeys(): string[] {\n if (!isStorageAvailable(window.sessionStorage)) {\n return []\n }\n return Object.keys(window.sessionStorage)\n}\n\n/**\n * 获取 sessionStorage 中键的数量\n * @returns 键的数量\n */\nexport function getSessionSize(): number {\n return getSessionKeys().length\n}\n\n// ==================== Cookie ====================\n\n/**\n * 设置 Cookie\n * @param key - Cookie 名称\n * @param value - Cookie 值\n * @param options - Cookie 选项\n * @example\n * ```ts\n * setCookie('token', 'abc123', { days: 7 })\n * setCookie('user', { name: 'Alice' }, { secure: true }) // 自动序列化对象\n * ```\n */\nexport function setCookie(key: string, value: string | object, options?: CookieOptions): void {\n const cookieOptions: Cookies.CookieAttributes = {}\n\n // 处理过期时间\n if (options?.days) {\n cookieOptions.expires = options.days\n } else if (options?.expires !== undefined) {\n cookieOptions.expires = options.expires\n }\n\n // 复制其他选项\n if (options?.path !== undefined) {\n cookieOptions.path = options.path\n }\n if (options?.domain !== undefined) {\n cookieOptions.domain = options.domain\n }\n if (options?.secure !== undefined) {\n cookieOptions.secure = options.secure\n }\n if (options?.sameSite !== undefined) {\n cookieOptions.sameSite = options.sameSite\n }\n\n // 设置 cookie\n Cookies.set(key, value as any, cookieOptions)\n}\n\n/**\n * 获取 Cookie\n * @param key - Cookie 名称\n * @returns Cookie 值,不存在返回 undefined\n * @example\n * ```ts\n * const token = getCookie('token')\n * console.log(token) // 'abc123'\n * ```\n */\nexport function getCookie(key: string): string | undefined {\n return Cookies.get(key)\n}\n\n/**\n * 移除 Cookie\n * @param key - Cookie 名称\n * @param options - Cookie 选项(需要匹配设置时的 path 和 domain)\n * @example\n * ```ts\n * removeCookie('token')\n * removeCookie('user', { path: '/', domain: '.example.com' })\n * ```\n */\nexport function removeCookie(key: string, options?: CookieOptions): void {\n Cookies.remove(key, options)\n}\n\n/**\n * 获取所有 Cookie\n * @returns Cookie 对象\n * @example\n * ```ts\n * const cookies = getAllCookies()\n * console.log(cookies) // { token: 'abc123', user: '{\"name\":\"Alice\"}' }\n * ```\n */\nexport function getAllCookies(): Record<string, string> {\n return Cookies.get() || {}\n}\n\n/**\n * 检查 Cookie 是否存在\n * @param key - Cookie 名称\n * @returns 是否存在\n * @example\n * ```ts\n * if (hasCookie('token')) {\n * console.log('Token exists')\n * }\n * ```\n */\nexport function hasCookie(key: string): boolean {\n return Cookies.get(key) !== undefined\n}\n\n/**\n * 获取 JSON 格式的 Cookie\n * @param key - Cookie 名称\n * @returns 解析后的对象,不存在或解析失败返回 undefined\n * @example\n * ```ts\n * const user = getCookieJSON<{ name: string; age: number }>('user')\n * console.log(user?.name) // 'Alice'\n * ```\n */\nexport function getCookieJSON<T = object>(key: string): T | undefined {\n const value = Cookies.get(key)\n if (!value) {\n return undefined\n }\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\n/**\n * 设置 JSON 格式的 Cookie(自动序列化)\n * @param key - Cookie 名称\n * @param value - 对象值\n * @param options - Cookie 选项\n * @example\n * ```ts\n * setCookieJSON('user', { name: 'Alice', age: 25 }, { days: 7 })\n * ```\n */\nexport function setCookieJSON<T = object>(key: string, value: T, options?: CookieOptions): void {\n setCookie(key, JSON.stringify(value), options)\n}\n\n/**\n * 获取所有 Cookie 的数量\n * @returns Cookie 数量\n * @example\n * ```ts\n * console.log(getCookieSize()) // 3\n * ```\n */\nexport function getCookieSize(): number {\n return Object.keys(getAllCookies()).length\n}\n\n// ==================== 统一接口 ====================\n\n/**\n * 存储类型\n */\nexport type StorageType = 'local' | 'session' | 'cookie'\n\n/**\n * 统一设置存储\n * @param type - 存储类型\n * @param key - 键\n * @param value - 值\n * @param options - 选项\n * @example\n * ```ts\n * setStorage('local', 'user', { name: 'Alice' })\n * setStorage('cookie', 'token', 'abc123', { days: 7 })\n * ```\n */\nexport function setStorage<T extends string | object>(\n type: 'local',\n key: string,\n value: T,\n options?: StorageOptions\n): void\nexport function setStorage<T extends string | object>(\n type: 'session',\n key: string,\n value: T,\n options?: StorageOptions\n): void\nexport function setStorage<T extends string | object>(\n type: 'cookie',\n key: string,\n value: T,\n options?: CookieOptions\n): void\nexport function setStorage<T extends string | object>(\n type: StorageType,\n key: string,\n value: T,\n options?: StorageOptions | CookieOptions\n): void {\n switch (type) {\n case 'local':\n setLocal(key, value, options as StorageOptions)\n break\n case 'session':\n setSession(key, value, options as StorageOptions)\n break\n case 'cookie':\n setCookie(key, value, options as CookieOptions)\n break\n }\n}\n\n/**\n * 统一获取存储\n * @param type - 存储类型\n * @param key - 键\n * @returns 值\n * @example\n * ```ts\n * const user = getStorage<{ name: string }>('local', 'user')\n * const token = getStorage('cookie', 'token')\n * ```\n */\nexport function getStorage<T = StorageValue>(type: 'local', key: string): T | undefined\nexport function getStorage<T = StorageValue>(type: 'session', key: string): T | undefined\nexport function getStorage(type: 'cookie', key: string): string | undefined\nexport function getStorage<T = StorageValue>(\n type: StorageType,\n key: string\n): T | string | undefined {\n switch (type) {\n case 'local':\n return getLocal<T>(key)\n case 'session':\n return getSession<T>(key)\n case 'cookie':\n return getCookie(key)\n }\n}\n\n/**\n * 统一移除存储\n * @param type - 存储类型\n * @param key - 键\n * @example\n * ```ts\n * removeStorage('local', 'user')\n * removeStorage('cookie', 'token')\n * ```\n */\nexport function removeStorage(type: StorageType, key: string): void {\n switch (type) {\n case 'local':\n removeLocal(key)\n break\n case 'session':\n removeSession(key)\n break\n case 'cookie':\n removeCookie(key)\n break\n }\n}\n\n/**\n * 统一清除存储\n * @param type - 存储类型\n * @example\n * ```ts\n * clearStorage('local')\n * clearStorage('session')\n * clearStorage('cookie') // 注意:cookie 只能逐个删除\n * ```\n */\nexport function clearStorage(type: StorageType): void {\n switch (type) {\n case 'local':\n clearLocal()\n break\n case 'session':\n clearSession()\n break\n case 'cookie': {\n const cookies = getAllCookies()\n for (const key of Object.keys(cookies)) {\n removeCookie(key)\n }\n break\n }\n }\n}\n","/**\n * 通用工具模块\n * 提供颜色转换、图片处理、文件下载、类型判断、数组/对象操作等通用功能\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// clone 函数的类型断言使用 any 是合理的\n\nimport { debounce, throttle, type DebouncedFunction, type ThrottledFunction } from 'es-toolkit'\n\n// ==================== 防抖与节流 ====================\n\n/**\n * 防抖函数(使用 es-toolkit)\n * @param fn 要防抖的函数\n * @param wait 等待时间(毫秒)\n * @returns 防抖后的函数\n */\nexport { debounce, type DebouncedFunction }\n\n/**\n * 节流函数(使用 es-toolkit)\n * @param fn 要节流的函数\n * @param wait 等待时间(毫秒)\n * @returns 节流后的函数\n */\nexport { throttle, type ThrottledFunction }\n\n// ==================== 对象深操作 ====================\n\n/**\n * 深度克隆对象\n * @param obj 要克隆的对象\n * @returns 克隆后的对象\n */\nexport const clone = <T>(obj: T): T => {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T\n }\n if (obj instanceof Array) {\n return obj.map((item) => clone(item)) as T\n }\n if (obj instanceof Object) {\n const copy = {} as T\n Object.keys(obj).forEach((key) => {\n ;(copy as any)[key] = clone((obj as any)[key])\n })\n return copy\n }\n return obj\n}\n\n/**\n * 深度比较两个对象是否相等\n * @param a 对象 a\n * @param b 对象 b\n * @returns 是否相等\n */\nexport const isEqual = (a: any, b: any): boolean => {\n if (a === b) return true\n if (a === null || b === null) return false\n if (typeof a !== typeof b) return false\n\n if (typeof a !== 'object') return a === b\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i])) return false\n }\n return true\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false\n if (!isEqual(a[key], b[key])) return false\n }\n return true\n}\n\n/**\n * 深度合并对象\n * @param objects 要合并的对象\n * @returns 合并后的对象\n */\nexport const deepMerge = <T extends Record<string, any>>(...objects: Partial<T>[]): T => {\n const result = {} as T\n objects.forEach((obj) => {\n if (isObject(obj)) {\n Object.keys(obj).forEach((key) => {\n const value = obj[key]\n if (isObject(value) && isObject(result[key])) {\n ;(result as any)[key] = deepMerge(result[key], value)\n } else {\n ;(result as any)[key] = clone(value)\n }\n })\n }\n })\n return result\n}\n\n/**\n * 获取对象的路径值\n * @param obj 对象\n * @param path 路径(例如:'user.name')\n * @returns 路径对应的值\n */\nexport const get = (obj: any, path: string): any => {\n return path.split('.').reduce((acc, key) => acc?.[key], obj)\n}\n\n/**\n * 设置对象的路径值\n * @param obj 对象\n * @param path 路径(例如:'user.name')\n * @param value 要设置的值\n */\nexport const set = (obj: any, path: string, value: any): void => {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const target = keys.reduce((acc, key) => {\n if (!acc[key]) acc[key] = {}\n return acc[key]\n }, obj)\n target[lastKey] = value\n}\n\n/**\n * 省略对象中的某些属性\n * @param obj 对象\n * @param keys 要省略的键\n * @returns 省略后的对象\n */\nexport const omit = <T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> => {\n const result = { ...obj }\n keys.forEach((key) => delete result[key])\n return result\n}\n\n/**\n * 选择对象中的某些属性\n * @param obj 对象\n * @param keys 要选择的键\n * @returns 选择后的对象\n */\nexport const pick = <T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> => {\n const result = {} as Pick<T, K>\n keys.forEach((key) => {\n if (key in obj) {\n result[key] = obj[key]\n }\n })\n return result\n}\n\n// ==================== 类型判断 ====================\n\n/**\n * 判断是否为对象\n * @param value 要判断的值\n * @returns 是否为对象\n */\nexport const isObject = (value: any): value is Record<string, any> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * 判断是否为数组\n * @param value 要判断的值\n * @returns 是否为数组\n */\nexport const isArray = (value: any): value is any[] => {\n return Array.isArray(value)\n}\n\n/**\n * 判断是否为字符串\n * @param value 要判断的值\n * @returns 是否为字符串\n */\nexport const isString = (value: any): value is string => {\n return typeof value === 'string'\n}\n\n/**\n * 判断是否为数字\n * @param value 要判断的值\n * @returns 是否为数字\n */\nexport const isNumber = (value: any): value is number => {\n return typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * 判断是否为布尔值\n * @param value 要判断的值\n * @returns 是否为布尔值\n */\nexport const isBoolean = (value: any): value is boolean => {\n return typeof value === 'boolean'\n}\n\n/**\n * 判断是否为函数\n * @param value 要判断的值\n * @returns 是否为函数\n */\nexport const isFunction = (value: any): value is Function => {\n return typeof value === 'function'\n}\n\n/**\n * 判断是否为空值\n * @param value 要判断的值\n * @returns 是否为空\n */\nexport const isEmpty = (value: any): boolean => {\n if (value === null || value === undefined) return true\n if (isString(value) || Array.isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n}\n\n// ==================== 数组操作 ====================\n\n/**\n * 数组去重\n * @param array 数组\n * @returns 去重后的数组\n */\nexport const uniq = <T>(array: T[]): T[] => {\n return [...new Set(array)]\n}\n\n/**\n * 数组排序\n * @param array 数组\n * @param key 排序键\n * @returns 排序后的数组\n */\nexport const sortBy = <T>(array: T[], key: keyof T | ((item: T) => any)): T[] => {\n const sortFn = typeof key === 'function' ? key : (item: T) => item[key]\n return [...array].sort((a, b) => {\n const valueA = sortFn(a)\n const valueB = sortFn(b)\n if (valueA < valueB) return -1\n if (valueA > valueB) return 1\n return 0\n })\n}\n\n/**\n * 数组分块\n * @param array 数组\n * @param size 分块大小\n * @returns 分块后的二维数组\n */\nexport const chunk = <T>(array: T[], size: number): T[][] => {\n const result: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size))\n }\n return result\n}\n\n/**\n * 数组分组\n * @param array 数组\n * @param key 分组键\n * @returns 分组后的对象\n */\nexport const groupBy = <T>(\n array: T[],\n key: keyof T | ((item: T) => string)\n): Record<string, T[]> => {\n const groupFn = typeof key === 'function' ? key : (item: T) => String(item[key])\n return array.reduce(\n (result, item) => {\n const groupKey = groupFn(item)\n if (!result[groupKey]) {\n result[groupKey] = []\n }\n result[groupKey].push(item)\n return result\n },\n {} as Record<string, T[]>\n )\n}\n\n/**\n * 数组求和\n * @param array 数组\n * @returns 总和\n */\nexport const sum = (array: number[]): number => {\n return array.reduce((acc, num) => acc + num, 0)\n}\n\n/**\n * 数组平均值\n * @param array 数组\n * @returns 平均值\n */\nexport const avg = (array: number[]): number => {\n return array.length > 0 ? sum(array) / array.length : 0\n}\n\n/**\n * 数组最大值\n * @param array 数组\n * @returns 最大值\n */\nexport const max = (array: number[]): number => {\n return Math.max(...array)\n}\n\n/**\n * 数组最小值\n * @param array 数组\n * @returns 最小值\n */\nexport const min = (array: number[]): number => {\n return Math.min(...array)\n}\n\n// ==================== 字符串转换 ====================\n\n/**\n * 驼峰转下划线\n * @param str 字符串\n * @returns 转换后的字符串\n */\nexport const camelToSnake = (str: string): string => {\n return str.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`)\n}\n\n/**\n * 下划线转驼峰\n * @param str 字符串\n * @returns 转换后的字符串\n */\nexport const snakeToCamel = (str: string): string => {\n return str.replace(/_([a-z])/g, (_, match) => match.toUpperCase())\n}\n\n/**\n * 首字母大写\n * @param str 字符串\n * @returns 转换后的字符串\n */\nexport const capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\n/**\n * 截断字符串\n * @param str 字符串\n * @param length 最大长度\n * @param suffix 后缀\n * @returns 截断后的字符串\n */\nexport const truncate = (str: string, length: number = 100, suffix: string = '...'): string => {\n if (str.length <= length) return str\n return `${str.slice(0, length)}${suffix}`\n}\n\n// ==================== 格式化函数 ====================\n\n/**\n * 格式化文件大小\n * @param bytes 字节数\n * @returns 格式化后的字符串\n */\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B'\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`\n}\n\n/**\n * 格式化数字(千分位)\n * @param num 数字\n * @returns 格式化后的字符串\n */\nexport const formatNumber = (num: number): string => {\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n}\n\n// ==================== 验证函数 ====================\n\n/**\n * 检查是否为有效的 URL\n * @param str 字符串\n * @returns 是否为有效 URL\n */\nexport const isValidUrl = (str: string): boolean => {\n try {\n new URL(str)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * 检查是否为有效的邮箱\n * @param email 邮箱地址\n * @returns 是否为有效邮箱\n */\nexport const isValidEmail = (email: string): boolean => {\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return regex.test(email)\n}\n\n/**\n * 检查是否为有效的手机号(中国)\n * @param phone 手机号\n * @returns 是否为有效手机号\n */\nexport const isValidPhone = (phone: string): boolean => {\n const regex = /^1[3-9]\\d{9}$/\n return regex.test(phone)\n}\n\n// ==================== 其他工具函数 ====================\n\n/**\n * 生成范围内的随机整数\n * @param min 最小值\n * @param max 最大值\n * @returns 随机整数\n */\nexport const randomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * 生成唯一 ID\n * @param prefix 前缀\n * @returns 唯一 ID\n */\nexport const uniqueId = (prefix: string = ''): string => {\n return `${prefix}${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * 延迟执行\n * @param ms 延迟时间(毫秒)\n * @returns Promise\n */\nexport const delay = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * 重试函数\n * @param fn 要执行的函数\n * @param retries 重试次数\n * @param delayMs 重试延迟\n * @returns Promise\n */\nexport const retry = async <T>(\n fn: () => Promise<T>,\n retries: number = 3,\n delayMs: number = 1000\n): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n if (retries <= 0) {\n throw error\n }\n await delay(delayMs)\n return retry(fn, retries - 1, delayMs)\n }\n}\n\n// ==================== 颜色转换 ====================\n\n/**\n * Hex 颜色转 RGB 颜色\n * @param str Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @returns RGB 颜色数组 [r, g, b]\n */\nexport const hexToRgb = (str: string): number[] | null => {\n const hexRegex = /^#?([0-9A-Fa-f]{6})$/\n if (!hexRegex.test(str)) {\n return null\n }\n\n const hex = str.replace('#', '')\n const r = parseInt(hex.substring(0, 2), 16)\n const g = parseInt(hex.substring(2, 4), 16)\n const b = parseInt(hex.substring(4, 6), 16)\n\n return [r, g, b]\n}\n\n/**\n * Hex 颜色转 RGB 字符串\n * @param str Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @returns RGB 字符串(如 rgb(255, 255, 255))\n */\nexport const hexToRgbString = (str: string): string | null => {\n const rgb = hexToRgb(str)\n if (!rgb) {\n return null\n }\n return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`\n}\n\n/**\n * RGB 颜色转 Hex 颜色\n * @param r 红色值 (0-255)\n * @param g 绿色值 (0-255)\n * @param b 蓝色值 (0-255)\n * @returns Hex 颜色字符串(如 #FFFFFF)\n */\nexport const rgbToHex = (r: number, g: number, b: number): string | null => {\n const numRegex = /^\\d{1,3}$/\n if (!numRegex.test(r.toString()) || !numRegex.test(g.toString()) || !numRegex.test(b.toString())) {\n return null\n }\n\n if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {\n return null\n }\n\n const toHex = (num: number): string => {\n const hex = num.toString(16)\n return hex.length === 1 ? `0${hex}` : hex\n }\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\n}\n\n/**\n * RGB 颜色转 Hex 颜色(数组版本)\n * @param rgb RGB 数组 [r, g, b]\n * @returns Hex 颜色字符串(如 #FFFFFF)\n */\nexport const rgbArrayToHex = (rgb: number[]): string | null => {\n if (rgb.length !== 3) {\n return null\n }\n return rgbToHex(rgb[0], rgb[1], rgb[2])\n}\n\n/**\n * 变浅颜色值\n * @param color Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @param alpha 透明度因子 (0-1),值越大颜色越浅\n * @returns 变浅后的 Hex 颜色\n */\nexport const getLightColor = (color: string, alpha: number): string | null => {\n const rgb = hexToRgb(color)\n if (!rgb) {\n return null\n }\n\n const [r, g, b] = rgb\n const newR = Math.floor((255 - r) * alpha + r)\n const newG = Math.floor((255 - g) * alpha + g)\n const newB = Math.floor((255 - b) * alpha + b)\n\n return rgbToHex(newR, newG, newB)\n}\n\n/**\n * 变深颜色值\n * @param color Hex 颜色(如 #FFFFFF 或 FFFFFF)\n * @param alpha 暗化因子 (0-1),值越大颜色越深\n * @returns 变深后的 Hex 颜色\n */\nexport const getDarkColor = (color: string, alpha: number): string | null => {\n const rgb = hexToRgb(color)\n if (!rgb) {\n return null\n }\n\n const [r, g, b] = rgb\n const newR = Math.floor(r * (1 - alpha))\n const newG = Math.floor(g * (1 - alpha))\n const newB = Math.floor(b * (1 - alpha))\n\n return rgbToHex(newR, newG, newB)\n}\n\n// ==================== 图片处理 ====================\n\n/**\n * 图片转 Base64\n * @param url 图片 URL\n * @param type 图片类型(默认 image/png)\n * @returns Base64 字符串\n */\nexport const imgToBase64 = (url: string, type: 'image/jpeg' | 'image/png' = 'image/png'): Promise<string> => {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.crossOrigin = 'anonymous'\n\n image.onload = () => {\n const canvas = document.createElement('canvas')\n canvas.width = image.naturalWidth\n canvas.height = image.naturalHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n reject(new Error('Failed to get canvas context'))\n return\n }\n\n ctx.drawImage(image, 0, 0)\n const base64 = canvas.toDataURL(type)\n resolve(base64)\n }\n\n image.onerror = (err) => {\n reject(new Error(`Failed to load image: ${String(err)}`))\n }\n\n image.src = url\n })\n}\n\n/**\n * Base64 转 File 对象\n * @param base64 Base64 字符串\n * @param fileName 文件名\n * @param mimeType MIME 类型(默认 image/jpeg)\n * @returns File 对象\n */\nexport const base64toFile = (\n base64: string,\n fileName: string,\n mimeType: string = 'image/jpeg'\n): File => {\n const dataArr = base64.split(',')\n const byteString = atob(dataArr[1])\n const u8Arr = new Uint8Array(byteString.length)\n\n for (let i = 0; i < byteString.length; i++) {\n u8Arr[i] = byteString.charCodeAt(i)\n }\n\n return new File([u8Arr], fileName, { type: mimeType })\n}\n\n/**\n * Base64 转 Blob 对象\n * @param base64 Base64 字符串\n * @param mimeType MIME 类型\n * @returns Blob 对象\n */\nexport const base64toBlob = (base64: string, mimeType: string = 'image/jpeg'): Blob => {\n const dataArr = base64.split(',')\n const byteString = atob(dataArr[1])\n const u8Arr = new Uint8Array(byteString.length)\n\n for (let i = 0; i < byteString.length; i++) {\n u8Arr[i] = byteString.charCodeAt(i)\n }\n\n return new Blob([u8Arr], { type: mimeType })\n}\n\n// ==================== 文件下载 ====================\n\n/**\n * 下载文件\n * @param url 文件 URL 或 Data URL\n * @param fileName 文件名\n * @param target 是否在新标签页打开(默认 false)\n */\nexport const downloadFile = (url: string, fileName: string = '文件', target = false): void => {\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = url\n\n if (target) {\n link.target = '_blank'\n } else {\n link.setAttribute('download', fileName)\n }\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n}\n\n/**\n * 下载 Blob 文件\n * @param blob Blob 对象\n * @param fileName 文件名\n */\nexport const downloadBlob = (blob: Blob, fileName: string): void => {\n const url = URL.createObjectURL(blob)\n downloadFile(url, fileName)\n URL.revokeObjectURL(url)\n}\n\n/**\n * 下载 Base64 文件\n * @param base64 Base64 字符串\n * @param fileName 文件名\n * @param mimeType MIME 类型\n */\nexport const downloadBase64 = (base64: string, fileName: string, mimeType: string = 'image/jpeg'): void => {\n const blob = base64toBlob(base64, mimeType)\n downloadBlob(blob, fileName)\n}\n\n// ==================== 剪贴板操作 ====================\n\n/**\n * 复制文本到剪贴板\n * @param text 要复制的文本\n * @returns 是否成功\n */\nexport const copyToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text)\n return true\n }\n\n // 降级方案\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n const success = document.execCommand('copy')\n document.body.removeChild(textarea)\n return success\n } catch {\n return false\n }\n}\n\n/**\n * 从剪贴板读取文本\n * @returns 剪贴板文本\n */\nexport const readFromClipboard = async (): Promise<string> => {\n try {\n if (navigator.clipboard && navigator.clipboard.readText) {\n return await navigator.clipboard.readText()\n }\n\n // 降级方案(需要用户权限)\n return ''\n } catch {\n return ''\n }\n}\n","/**\n * 加密解密模块\n * 基于 crypto-js 提供常用的加密解密功能\n */\n\nimport * as CryptoJS from 'crypto-js'\n\n/**\n * 加密模式类型\n */\nexport type CryptoMode = any\n\n/**\n * 填充方式类型\n */\nexport type CryptoPadding = any\n\n/**\n * MD5 加密\n * @param message 要加密的消息\n * @returns MD5 哈希值\n */\nexport const md5 = (message: string): string => {\n return CryptoJS.MD5(message).toString()\n}\n\n/**\n * SHA1 加密\n * @param message 要加密的消息\n * @returns SHA1 哈希值\n */\nexport const sha1 = (message: string): string => {\n return CryptoJS.SHA1(message).toString()\n}\n\n/**\n * SHA256 加密\n * @param message 要加密的消息\n * @returns SHA256 哈希值\n */\nexport const sha256 = (message: string): string => {\n return CryptoJS.SHA256(message).toString()\n}\n\n/**\n * SHA512 加密\n * @param message 要加密的消息\n * @returns SHA512 哈希值\n */\nexport const sha512 = (message: string): string => {\n return CryptoJS.SHA512(message).toString()\n}\n\n/**\n * Hmac-MD5 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-MD5 哈希值\n */\nexport const hmacMD5 = (message: string, key: string): string => {\n return CryptoJS.HmacMD5(message, key).toString()\n}\n\n/**\n * Hmac-SHA1 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-SHA1 哈希值\n */\nexport const hmacSHA1 = (message: string, key: string): string => {\n return CryptoJS.HmacSHA1(message, key).toString()\n}\n\n/**\n * Hmac-SHA256 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-SHA256 哈希值\n */\nexport const hmacSHA256 = (message: string, key: string): string => {\n return CryptoJS.HmacSHA256(message, key).toString()\n}\n\n/**\n * Hmac-SHA512 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns Hmac-SHA512 哈希值\n */\nexport const hmacSHA512 = (message: string, key: string): string => {\n return CryptoJS.HmacSHA512(message, key).toString()\n}\n\n/**\n * AES 加密\n * @param message 要加密的消息\n * @param key 密钥(16/24/32 字节)\n * @param iv 初始向量(可选,16 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 加密后的密文(Base64 格式)\n */\nexport const aesEncrypt = (\n message: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const encrypted = CryptoJS.AES.encrypt(message, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return encrypted.toString()\n}\n\n/**\n * AES 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥(16/24/32 字节)\n * @param iv 初始向量(可选,16 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 解密后的明文\n */\nexport const aesDecrypt = (\n ciphertext: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const decrypted = CryptoJS.AES.decrypt(ciphertext, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * DES 加密\n * @param message 要加密的消息\n * @param key 密钥(8 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 加密后的密文(Base64 格式)\n */\nexport const desEncrypt = (\n message: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const encrypted = CryptoJS.DES.encrypt(message, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return encrypted.toString()\n}\n\n/**\n * DES 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥(8 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 解密后的明文\n */\nexport const desDecrypt = (\n ciphertext: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const decrypted = CryptoJS.DES.decrypt(ciphertext, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Triple DES (3DES) 加密\n * @param message 要加密的消息\n * @param key 密钥(24 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 加密后的密文(Base64 格式)\n */\nexport const tripleDesEncrypt = (\n message: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const encrypted = CryptoJS.TripleDES.encrypt(message, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return encrypted.toString()\n}\n\n/**\n * Triple DES (3DES) 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥(24 字节)\n * @param iv 初始向量(可选,8 字节)\n * @param mode 加密模式(默认 CBC)\n * @param padding 填充方式(默认 Pkcs7)\n * @returns 解密后的明文\n */\nexport const tripleDesDecrypt = (\n ciphertext: string,\n key: string,\n iv?: string,\n mode: CryptoMode = CryptoJS.mode.CBC,\n padding: CryptoPadding = CryptoJS.pad.Pkcs7\n): string => {\n const keyWord = CryptoJS.enc.Utf8.parse(key)\n const ivWord = iv ? CryptoJS.enc.Utf8.parse(iv) : undefined\n\n const decrypted = CryptoJS.TripleDES.decrypt(ciphertext, keyWord, {\n iv: ivWord,\n mode: mode,\n padding: padding\n })\n\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * RC4 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns 加密后的密文(Base64 格式)\n */\nexport const rc4Encrypt = (message: string, key: string): string => {\n const encrypted = CryptoJS.RC4.encrypt(message, key)\n return encrypted.toString()\n}\n\n/**\n * RC4 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥\n * @returns 解密后的明文\n */\nexport const rc4Decrypt = (ciphertext: string, key: string): string => {\n const decrypted = CryptoJS.RC4.decrypt(ciphertext, key)\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Rabbit 加密\n * @param message 要加密的消息\n * @param key 密钥\n * @returns 加密后的密文(Base64 格式)\n */\nexport const rabbitEncrypt = (message: string, key: string): string => {\n const encrypted = CryptoJS.Rabbit.encrypt(message, key)\n return encrypted.toString()\n}\n\n/**\n * Rabbit 解密\n * @param ciphertext 密文(Base64 格式)\n * @param key 密钥\n * @returns 解密后的明文\n */\nexport const rabbitDecrypt = (ciphertext: string, key: string): string => {\n const decrypted = CryptoJS.Rabbit.decrypt(ciphertext, key)\n return decrypted.toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Base64 编码\n * @param message 要编码的消息\n * @returns Base64 编码后的字符串\n */\nexport const base64Encode = (message: string): string => {\n return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(message))\n}\n\n/**\n * Base64 解码\n * @param encoded Base64 编码的字符串\n * @returns 解码后的原始消息\n */\nexport const base64Decode = (encoded: string): string => {\n return CryptoJS.enc.Base64.parse(encoded).toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * UTF-8 编码\n * @param message 要编码的消息\n * @returns UTF-8 编码后的字符串\n */\nexport const utf8Encode = (message: string): string => {\n return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Utf8.parse(message))\n}\n\n/**\n * UTF-8 解码\n * @param encoded UTF-8 编码的字符串\n * @returns 解码后的原始消息\n */\nexport const utf8Decode = (encoded: string): string => {\n return CryptoJS.enc.Utf8.parse(encoded).toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * Hex 编码\n * @param message 要编码的消息\n * @returns Hex 编码后的字符串\n */\nexport const hexEncode = (message: string): string => {\n return CryptoJS.enc.Hex.stringify(CryptoJS.enc.Utf8.parse(message))\n}\n\n/**\n * Hex 解码\n * @param encoded Hex 编码的字符串\n * @returns 解码后的原始消息\n */\nexport const hexDecode = (encoded: string): string => {\n return CryptoJS.enc.Hex.parse(encoded).toString(CryptoJS.enc.Utf8)\n}\n\n/**\n * 生成随机密钥\n * @param length 密钥长度(字节)\n * @returns 随机密钥(Base64 格式)\n */\nexport const generateKey = (length: number = 32): string => {\n const key = CryptoJS.lib.WordArray.random(length)\n return CryptoJS.enc.Base64.stringify(key)\n}\n\n/**\n * 生成随机 IV(初始向量)\n * @param length IV 长度(字节,默认 16)\n * @returns 随机 IV(Base64 格式)\n */\nexport const generateIV = (length: number = 16): string => {\n const iv = CryptoJS.lib.WordArray.random(length)\n return CryptoJS.enc.Base64.stringify(iv)\n}\n\n/**\n * PBKDF2 密钥派生\n * @param password 密码\n * @param salt 盐值\n * @param iterations 迭代次数\n * @param keySize 密钥长度(字节)\n * @returns 派生的密钥(Hex 格式)\n */\nexport const pbkdf2 = (password: string, salt: string, iterations: number = 1000, keySize: number = 32): string => {\n const key = CryptoJS.PBKDF2(password, salt, {\n keySize: keySize / 4,\n iterations: iterations\n })\n return key.toString()\n}\n\n/**\n * 生成 UUID v4\n * @returns UUID 字符串\n */\nexport const uuid = (): string => {\n return CryptoJS.lib.WordArray.random(16).toString()\n}\n\n// 导出 CryptoJS 相关类型和常量\nexport { CryptoJS }\n","/**\n * WebSocket Module - WebSocket 工具\n *\n * 提供简化的 WebSocket 连接、消息发送、心跳检测和重连机制\n */\n\n// ==================== 类型定义 ====================\n\n/**\n * WebSocket 连接状态\n */\nexport enum WebSocketState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\n/**\n * WebSocket 配置选项\n */\nexport interface WebSocketOptions {\n /** WebSocket 服务器地址 */\n url: string\n /** 协议(wss:// 或 ws://),默认自动检测 */\n protocol?: 'ws' | 'wss'\n /** 子协议 */\n protocols?: string | string[]\n /** 是否自动重连,默认 true */\n autoReconnect?: boolean\n /** 重连次数,默认 3 */\n reconnectAttempts?: number\n /** 重连间隔(毫秒),默认 3000 */\n reconnectInterval?: number\n /** 心跳检测间隔(毫秒),默认 30000 */\n heartbeatInterval?: number\n /** 心跳消息内容,默认 'ping' */\n heartbeatMessage?: string | object\n /** 心跳超时时间(毫秒),默认 5000 */\n heartbeatTimeout?: number\n /** 连接超时时间(毫秒),默认 10000 */\n connectTimeout?: number\n /** 是否记录日志,默认 true */\n debug?: boolean\n}\n\n/**\n * WebSocket 消息类型\n */\nexport type WebSocketMessage = string | object | ArrayBuffer | Blob\n\n/**\n * WebSocket 事件处理器\n */\nexport interface WebSocketEventHandlers {\n /** 连接成功回调 */\n onOpen?: (event: Event) => void\n /** 接收消息回调 */\n onMessage?: (data: WebSocketMessage, event: MessageEvent) => void\n /** 连接关闭回调 */\n onClose?: (event: CloseEvent) => void\n /** 错误回调 */\n onError?: (event: Event) => void\n /** 重连开始回调 */\n onReconnect?: (attempt: number) => void\n /** 重连成功回调 */\n onReconnectSuccess?: (attempt: number) => void\n /** 重连失败回调 */\n onReconnectFailed?: () => void\n /** 心跳回调 */\n onHeartbeat?: () => void\n /** 心跳超时回调 */\n onHeartbeatTimeout?: () => void\n}\n\n/**\n * WebSocket 实例接口\n */\nexport interface IWebSocketClient {\n /** 连接 WebSocket */\n connect(): void\n /** 断开连接 */\n disconnect(): void\n /** 发送消息 */\n send(data: WebSocketMessage): Promise<void>\n /** 发送消息(不带 Promise) */\n sendSync(data: WebSocketMessage): void\n /** 获取连接状态 */\n getState(): WebSocketState\n /** 是否已连接 */\n isConnected(): boolean\n /** 获取 WebSocket 实例 */\n getInstance(): WebSocket | null\n /** 设置事件处理器 */\n on<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler: WebSocketEventHandlers[K]\n ): void\n /** 移除事件处理器 */\n off<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler?: WebSocketEventHandlers[K]\n ): void\n /** 重新连接 */\n reconnect(): void\n}\n\n// ==================== WebSocket 客户端类 ====================\n\n/**\n * WebSocket 客户端类\n */\nexport class WebSocketClient implements IWebSocketClient {\n private ws: WebSocket | null = null\n private options: Required<Omit<WebSocketOptions, 'protocols' | 'debug'>> &\n Pick<WebSocketOptions, 'protocols' | 'debug'>\n private handlers: WebSocketEventHandlers = {}\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n private heartbeatTimeoutTimer: ReturnType<typeof setTimeout> | null = null\n private reconnectCount = 0\n private isManualDisconnect = false\n private messageQueue: WebSocketMessage[] = []\n private connectResolve: (() => void) | null = null\n private connectReject: ((error: Error) => void) | null = null\n\n constructor(options: WebSocketOptions) {\n this.options = {\n url: options.url,\n protocol: options.protocol || (options.url.startsWith('https') ? 'wss' : 'ws'),\n protocols: options.protocols || [],\n autoReconnect: options.autoReconnect ?? true,\n reconnectAttempts: options.reconnectAttempts ?? 3,\n reconnectInterval: options.reconnectInterval ?? 3000,\n heartbeatInterval: options.heartbeatInterval ?? 30000,\n heartbeatMessage: options.heartbeatMessage ?? 'ping',\n heartbeatTimeout: options.heartbeatTimeout ?? 5000,\n connectTimeout: options.connectTimeout ?? 10000,\n debug: options.debug ?? true,\n }\n\n // 自动连接\n if (options.autoReconnect !== false) {\n this.connect()\n }\n }\n\n /**\n * 连接 WebSocket\n */\n connect(): void {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n this.log('WebSocket already connected or connecting')\n return\n }\n\n this.isManualDisconnect = false\n this.reconnectCount = 0\n\n const protocol = this.options.url.startsWith('ws://') || this.options.url.startsWith('wss://')\n ? ''\n : `${this.options.protocol}://`\n\n const wsUrl = protocol ? `${protocol}${this.options.url}` : this.options.url\n\n this.log(`Connecting to ${wsUrl}`)\n\n try {\n this.ws = new WebSocket(wsUrl, this.options.protocols)\n\n this.setupEventHandlers()\n\n // 设置连接超时\n setTimeout(() => {\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close()\n this.log('Connection timeout')\n if (this.connectReject) {\n this.connectReject(new Error('Connection timeout'))\n this.connectResolve = null\n this.connectReject = null\n }\n }\n }, this.options.connectTimeout)\n } catch (error) {\n this.log('Connection failed:', error)\n this.handleError(error as Error)\n }\n }\n\n /**\n * 断开连接\n */\n disconnect(): void {\n this.isManualDisconnect = true\n this.cleanup()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.log('Disconnected manually')\n }\n\n /**\n * 发送消息(异步)\n */\n async send(data: WebSocketMessage): Promise<void> {\n if (!this.isConnected()) {\n return new Promise((resolve, reject) => {\n this.messageQueue.push(data)\n const checkConnection = () => {\n if (this.isConnected()) {\n this.sendSync(data)\n resolve()\n } else if (!this.ws) {\n reject(new Error('WebSocket is not connected'))\n } else {\n setTimeout(checkConnection, 100)\n }\n }\n checkConnection()\n })\n }\n\n this.sendSync(data)\n }\n\n /**\n * 发送消息(同步)\n */\n sendSync(data: WebSocketMessage): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log('WebSocket is not connected, message queued')\n this.messageQueue.push(data)\n return\n }\n\n try {\n const message = typeof data === 'object' ? JSON.stringify(data) : data\n this.ws.send(message)\n this.log('Message sent:', message)\n } catch (error) {\n this.log('Send error:', error)\n this.handleError(error as Error)\n }\n }\n\n /**\n * 获取连接状态\n */\n getState(): WebSocketState {\n return this.ws?.readyState ?? WebSocketState.CLOSED\n }\n\n /**\n * 是否已连接\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN\n }\n\n /**\n * 获取 WebSocket 实例\n */\n getInstance(): WebSocket | null {\n return this.ws\n }\n\n /**\n * 设置事件处理器\n */\n on<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler: WebSocketEventHandlers[K]\n ): void {\n this.handlers[event] = handler\n }\n\n /**\n * 移除事件处理器\n */\n off<K extends keyof WebSocketEventHandlers>(\n event: K,\n handler?: WebSocketEventHandlers[K]\n ): void {\n if (!handler || this.handlers[event] === handler) {\n delete this.handlers[event]\n }\n }\n\n /**\n * 重新连接\n */\n reconnect(): void {\n this.disconnect()\n this.reconnectCount = 0\n this.isManualDisconnect = false\n this.connect()\n }\n\n /**\n * 设置事件处理器\n */\n private setupEventHandlers(): void {\n if (!this.ws) return\n\n this.ws.onopen = (event) => {\n this.log('Connected')\n this.reconnectCount = 0\n\n // 发送队列中的消息\n while (this.messageQueue.length > 0) {\n const message = this.messageQueue.shift()\n if (message) {\n this.sendSync(message)\n }\n }\n\n // 启动心跳\n this.startHeartbeat()\n\n // 触发 onOpen 回调\n if (this.handlers.onOpen) {\n this.handlers.onOpen(event)\n }\n\n // 解析连接 Promise\n if (this.connectResolve) {\n this.connectResolve()\n this.connectResolve = null\n this.connectReject = null\n }\n }\n\n this.ws.onmessage = (event) => {\n this.log('Message received:', event.data)\n\n let data: WebSocketMessage = event.data\n\n // 尝试解析 JSON\n if (typeof event.data === 'string') {\n try {\n data = JSON.parse(event.data)\n } catch {\n // 不是 JSON 格式,保持原样\n }\n }\n\n // 触发 onMessage 回调\n if (this.handlers.onMessage) {\n this.handlers.onMessage(data, event)\n }\n }\n\n this.ws.onclose = (event) => {\n this.log('Connection closed:', event.code, event.reason)\n this.cleanup()\n\n // 触发 onClose 回调\n if (this.handlers.onClose) {\n this.handlers.onClose(event)\n }\n\n // 自动重连\n if (!this.isManualDisconnect && this.options.autoReconnect) {\n this.attemptReconnect()\n }\n }\n\n this.ws.onerror = (event) => {\n this.log('Error:', event)\n\n // 触发 onError 回调\n if (this.handlers.onError) {\n this.handlers.onError(event)\n }\n }\n }\n\n /**\n * 尝试重连\n */\n private attemptReconnect(): void {\n if (this.reconnectCount >= this.options.reconnectAttempts) {\n this.log('Reconnect failed, max attempts reached')\n this.cleanup()\n\n // 触发 onReconnectFailed 回调\n if (this.handlers.onReconnectFailed) {\n this.handlers.onReconnectFailed()\n }\n\n if (this.connectReject) {\n this.connectReject(new Error('Reconnect failed'))\n this.connectResolve = null\n this.connectReject = null\n }\n return\n }\n\n this.reconnectCount++\n this.log(`Reconnecting... Attempt ${this.reconnectCount}/${this.options.reconnectAttempts}`)\n\n // 触发 onReconnect 回调\n if (this.handlers.onReconnect) {\n this.handlers.onReconnect(this.reconnectCount)\n }\n\n this.reconnectTimer = setTimeout(() => {\n this.connect()\n }, this.options.reconnectInterval)\n }\n\n /**\n * 启动心跳\n */\n private startHeartbeat(): void {\n this.stopHeartbeat()\n\n this.heartbeatTimer = setInterval(() => {\n if (this.isConnected()) {\n const message = this.options.heartbeatMessage\n this.log('Sending heartbeat')\n\n // 触发 onHeartbeat 回调\n if (this.handlers.onHeartbeat) {\n this.handlers.onHeartbeat()\n }\n\n // 发送心跳消息\n this.sendSync(message)\n\n // 设置心跳超时检测\n this.heartbeatTimeoutTimer = setTimeout(() => {\n this.log('Heartbeat timeout')\n\n // 触发 onHeartbeatTimeout 回调\n if (this.handlers.onHeartbeatTimeout) {\n this.handlers.onHeartbeatTimeout()\n }\n\n // 关闭连接,触发重连\n if (this.ws) {\n this.ws.close()\n }\n }, this.options.heartbeatTimeout)\n }\n }, this.options.heartbeatInterval)\n }\n\n /**\n * 停止心跳\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer)\n this.heartbeatTimer = null\n }\n if (this.heartbeatTimeoutTimer) {\n clearTimeout(this.heartbeatTimeoutTimer)\n this.heartbeatTimeoutTimer = null\n }\n }\n\n /**\n * 清理资源\n */\n private cleanup(): void {\n this.stopHeartbeat()\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n /**\n * 处理错误\n */\n private handleError(error: Error): void {\n this.log('Error:', error.message)\n\n // 触发 onError 回调\n if (this.handlers.onError) {\n this.handlers.onError(new ErrorEvent('error', { error }))\n }\n }\n\n /**\n * 日志输出\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[WebSocket]', ...args)\n }\n }\n}\n\n// ==================== 工厂函数 ====================\n\n/**\n * 创建 WebSocket 客户端\n * @param options - 配置选项\n * @returns WebSocket 客户端实例\n * @example\n * ```ts\n * const ws = createWebSocket({\n * url: 'echo.websocket.org',\n * autoReconnect: true,\n * onMessage: (data) => console.log('Received:', data)\n * })\n *\n * ws.send('Hello, WebSocket!')\n * ```\n */\nexport function createWebSocket(options: WebSocketOptions): IWebSocketClient {\n return new WebSocketClient(options)\n}\n\n/**\n * 快速连接 WebSocket\n * @param url - WebSocket 服务器地址\n * @param handlers - 事件处理器\n * @returns WebSocket 客户端实例\n * @example\n * ```ts\n * const ws = quickConnect('echo.websocket.org', {\n * onMessage: (data) => console.log('Received:', data)\n * })\n * ```\n */\nexport function quickConnect(\n url: string,\n handlers?: WebSocketEventHandlers\n): IWebSocketClient {\n const client = new WebSocketClient({ url, autoReconnect: true })\n\n if (handlers) {\n Object.entries(handlers).forEach(([event, handler]) => {\n client.on(event as keyof WebSocketEventHandlers, handler)\n })\n }\n\n return client\n}\n\n// ==================== 导出 ====================\n\nexport default {\n WebSocketClient,\n createWebSocket,\n quickConnect,\n WebSocketState,\n}\n","/**\n * Event Module - 事件管理工具\n *\n * 基于 mitt 封装的事件发布订阅系统,提供类型安全的事件管理\n */\n\nimport mitt, { Emitter, EventType, Handler } from 'mitt'\n\n// ==================== 类型定义 ====================\n\n/**\n * 事件类型映射\n * 使用字符串索引签名,可以注册任意事件\n */\nexport type EventHandler<T = any> = (data: T) => void | Promise<void>\n\n/**\n * 事件总线配置选项\n */\nexport interface EventBusOptions {\n /** 是否记录日志 */\n debug?: boolean\n /** 事件名称前缀 */\n prefix?: string\n}\n\n/**\n * 事件监听器元数据\n */\nexport interface ListenerMeta {\n /** 事件名称 */\n event: string\n /** 处理函数 */\n handler: EventHandler\n /** 是否只监听一次 */\n once: boolean\n /** 监听时间 */\n timestamp: number\n}\n\n/**\n * 事件总线实例接口\n */\nexport interface IEventBus<E extends Record<EventType, unknown>> {\n /**\n * 订阅事件\n * @param event - 事件名称\n * @param handler - 事件处理函数\n * @returns 取消订阅的函数\n */\n on<K extends keyof E>(event: K, handler: EventHandler<E[K]>): () => void\n on(event: string | string[], handler: EventHandler): () => void\n\n /**\n * 订阅事件(只执行一次)\n * @param event - 事件名称\n * @param handler - 事件处理函数\n * @returns 取消订阅的函数\n */\n once<K extends keyof E>(event: K, handler: EventHandler<E[K]>): () => void\n once(event: string | string[], handler: EventHandler): () => void\n\n /**\n * 取消订阅\n * @param event - 事件名称\n * @param handler - 事件处理函数\n */\n off<K extends keyof E>(event: K, handler?: EventHandler<E[K]>): void\n off(event: string | string[], handler?: EventHandler): void\n\n /**\n * 发布事件\n * @param event - 事件名称\n * @param data - 事件数据\n */\n emit<K extends keyof E>(event: K, data?: E[K]): void\n emit(event: string, data?: unknown): void\n\n /**\n * 清空所有事件监听器\n */\n clear(): void\n\n /**\n * 获取所有事件名称\n */\n all: Emitter<E>['all']\n}\n\n// ==================== EventBus 类 ====================\n\n/**\n * 事件总线类\n * @template E - 事件类型映射\n * @example\n * ```ts\n * // 定义事件类型\n * interface Events {\n * user: { id: number; name: string }\n * message: string\n * error: Error\n * }\n *\n * const bus = createEventBus<Events>()\n *\n * // 订阅事件\n * bus.on('user', (user) => console.log(user.name))\n *\n * // 发布事件\n * bus.emit('user', { id: 1, name: 'Alice' })\n * ```\n */\nexport class EventBus<E extends Record<EventType, unknown> = Record<string, any>>\n implements IEventBus<E>\n{\n private emitter: Emitter<E>\n private options: Required<Omit<EventBusOptions, 'prefix'>> & Pick<EventBusOptions, 'prefix'>\n private listeners: Map<string, ListenerMeta[]> = new Map()\n\n constructor(options: EventBusOptions = {}) {\n this.options = {\n debug: options.debug ?? false,\n prefix: options.prefix ?? '',\n }\n\n this.emitter = mitt<E>()\n this.log('EventBus created')\n }\n\n /**\n * 订阅事件\n */\n on<K extends keyof E>(\n event: K,\n handler: EventHandler<E[K]>\n ): () => void\n on(event: string | string[], handler: EventHandler): () => void\n on(event: any, handler: any): () => void {\n const events = Array.isArray(event) ? event : [event]\n const unsubscribers: (() => void)[] = []\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n\n const wrappedHandler: Handler = (data: any) => {\n this.log(`Event triggered: ${fullName}`, data)\n return handler(data)\n }\n\n this.emitter.on(fullName, wrappedHandler)\n\n // 记录监听器\n const meta: ListenerMeta = {\n event: fullName,\n handler: wrappedHandler,\n once: false,\n timestamp: Date.now(),\n }\n this.addListener(fullName, meta)\n\n // 返回取消订阅函数\n unsubscribers.push(() => {\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n this.log(`Unsubscribed from: ${fullName}`)\n })\n })\n\n // 返回一个取消所有订阅的函数\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n }\n\n /**\n * 订阅事件(只执行一次)\n */\n once<K extends keyof E>(\n event: K,\n handler: EventHandler<E[K]>\n ): () => void\n once(event: string | string[], handler: EventHandler): () => void\n once(event: any, handler: any): () => void {\n const events = Array.isArray(event) ? event : [event]\n const unsubscribers: (() => void)[] = []\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n\n const wrappedHandler: Handler = (data: any) => {\n this.log(`One-time event triggered: ${fullName}`, data)\n\n // 执行后立即取消订阅\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n\n return handler(data)\n }\n\n this.emitter.on(fullName, wrappedHandler)\n\n // 记录监听器\n const meta: ListenerMeta = {\n event: fullName,\n handler: wrappedHandler,\n once: true,\n timestamp: Date.now(),\n }\n this.addListener(fullName, meta)\n\n unsubscribers.push(() => {\n this.emitter.off(fullName, wrappedHandler)\n this.removeListener(fullName, wrappedHandler)\n })\n })\n\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n }\n\n /**\n * 取消订阅\n */\n off<K extends keyof E>(event: K, handler?: EventHandler<E[K]>): void\n off(event: string | string[], handler?: EventHandler): void\n off(event: any, handler?: any): void {\n const events = Array.isArray(event) ? event : [event]\n\n events.forEach((eventName) => {\n const fullName = this.getFullName(eventName)\n const listeners = this.listeners.get(fullName) || []\n\n if (handler) {\n // 移除特定处理函数\n const index = listeners.findIndex((meta) => meta.handler === handler)\n if (index !== -1) {\n this.emitter.off(fullName, listeners[index].handler)\n listeners.splice(index, 1)\n this.log(`Removed handler from: ${fullName}`)\n }\n } else {\n // 移除所有处理函数\n listeners.forEach((meta) => {\n this.emitter.off(fullName, meta.handler)\n })\n this.listeners.delete(fullName)\n this.log(`Cleared all listeners for: ${fullName}`)\n }\n })\n }\n\n /**\n * 发布事件\n */\n emit<K extends keyof E>(event: K, data?: E[K]): void\n emit(event: string, data?: unknown): void\n emit(event: any, data?: any): void {\n const fullName = this.getFullName(event)\n this.log(`Emitting event: ${fullName}`, data)\n this.emitter.emit(fullName, data)\n }\n\n /**\n * 清空所有事件监听器\n */\n clear(): void {\n this.emitter.all.clear()\n this.listeners.clear()\n this.log('All event listeners cleared')\n }\n\n /**\n * 获取所有事件\n */\n get all(): any {\n return this.emitter.all\n }\n\n /**\n * 获取事件监听器数量\n */\n getListenerCount(event?: string): number {\n if (event) {\n const fullName = this.getFullName(event)\n return this.listeners.get(fullName)?.length || 0\n }\n return Array.from(this.listeners.values()).reduce((total, list) => total + list.length, 0)\n }\n\n /**\n * 获取所有事件名称\n */\n getEventNames(): string[] {\n return Array.from(this.listeners.keys())\n }\n\n /**\n * 获取事件监听器列表\n */\n getListeners(event: string): ListenerMeta[] {\n const fullName = this.getFullName(event)\n return this.listeners.get(fullName) || []\n }\n\n /**\n * 添加监听器记录\n */\n private addListener(event: string, meta: ListenerMeta): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, [])\n }\n this.listeners.get(event)!.push(meta)\n }\n\n /**\n * 移除监听器记录\n */\n private removeListener(event: string, handler: Handler): void {\n const listeners = this.listeners.get(event)\n if (listeners) {\n const index = listeners.findIndex((meta) => meta.handler === handler)\n if (index !== -1) {\n listeners.splice(index, 1)\n }\n if (listeners.length === 0) {\n this.listeners.delete(event)\n }\n }\n }\n\n /**\n * 获取完整的事件名称(带前缀)\n */\n private getFullName(event: string): string {\n return this.options.prefix ? `${this.options.prefix}:${event}` : event\n }\n\n /**\n * 日志输出\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[EventBus]', ...args)\n }\n }\n}\n\n// ==================== 工厂函数 ====================\n\n/**\n * 创建事件总线实例\n * @param options - 配置选项\n * @returns 事件总线实例\n * @example\n * ```ts\n * // 创建事件总线\n * const bus = createEventBus({\n * debug: true,\n * prefix: 'app'\n * })\n *\n * // 订阅事件\n * const unsubscribe = bus.on('user:login', (user) => {\n * console.log('User logged in:', user)\n * })\n *\n * // 发布事件\n * bus.emit('user:login', { id: 1, name: 'Alice' })\n *\n * // 取消订阅\n * unsubscribe()\n * ```\n */\nexport function createEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n options?: EventBusOptions\n): IEventBus<E> {\n return new EventBus<E>(options)\n}\n\n/**\n * 创建全局事件总线(单例)\n * @param options - 配置选项\n * @returns 全局事件总线实例\n * @example\n * ```ts\n * // 获取全局事件总线\n * const globalBus = getGlobalEventBus({ debug: true })\n *\n * // 在任何地方使用\n * globalBus.emit('app:ready')\n * ```\n */\nlet globalEventBus: IEventBus<any> | null = null\n\nexport function getGlobalEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n options?: EventBusOptions\n): IEventBus<E> {\n if (!globalEventBus) {\n globalEventBus = createEventBus<E>(options)\n }\n return globalEventBus as IEventBus<E>\n}\n\n// ==================== 工具函数 ====================\n\n/**\n * 等待事件触发\n * @param bus - 事件总线\n * @param event - 事件名称\n * @param timeout - 超时时间(毫秒),默认 5000\n * @returns Promise,在事件触发时 resolve\n * @example\n * ```ts\n * const bus = createEventBus()\n *\n * // 等待事件\n * const data = await waitForEvent(bus, 'data:ready')\n * console.log('Data ready:', data)\n * ```\n */\nexport function waitForEvent<T = any>(\n bus: IEventBus<Record<string, any>>,\n event: string,\n timeout: number = 5000\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n unsubscribe()\n reject(new Error(`Timeout waiting for event: ${event}`))\n }, timeout)\n\n const unsubscribe = bus.on(event, (data: T) => {\n clearTimeout(timer)\n unsubscribe()\n resolve(data)\n })\n })\n}\n\n/**\n * 批量订阅事件\n * @param bus - 事件总线\n * @param events - 事件映射\n * @returns 取消所有订阅的函数\n * @example\n * ```ts\n * const bus = createEventBus()\n *\n * const unsubscribe = batchSubscribe(bus, {\n * 'user:login': (user) => console.log('Login:', user),\n * 'user:logout': () => console.log('Logout'),\n * 'error': (error) => console.error('Error:', error)\n * })\n * ```\n */\nexport function batchSubscribe(\n bus: IEventBus<Record<string, any>>,\n events: Record<string, EventHandler<any>>\n): () => void {\n const unsubscribers: (() => void)[] = []\n\n Object.entries(events).forEach(([event, handler]) => {\n unsubscribers.push(bus.on(event, handler))\n })\n\n return () => {\n unsubscribers.forEach((unsub) => unsub())\n }\n}\n\n/**\n * 创建命名空间事件总线\n * @param namespace - 命名空间\n * @param options - 配置选项\n * @returns 事件总线实例\n * @example\n * ```ts\n * const userBus = createNamespacedEventBus('user')\n * const appBus = createNamespacedEventBus('app')\n *\n * userBus.emit('login') // 实际事件名: user:login\n * appBus.emit('ready') // 实际事件名: app:ready\n * ```\n */\nexport function createNamespacedEventBus<E extends Record<EventType, unknown> = Record<string, any>>(\n namespace: string,\n options?: Omit<EventBusOptions, 'prefix'>\n): IEventBus<E> {\n return createEventBus<E>({\n ...options,\n prefix: namespace,\n }) as IEventBus<E>\n}\n\n// ==================== 导出 ====================\n\nexport default {\n EventBus,\n createEventBus,\n getGlobalEventBus,\n waitForEvent,\n batchSubscribe,\n createNamespacedEventBus,\n}\n"]}