| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- import dayjs from 'dayjs';
- import { EnableStatus, DeleteStatus, AuditStatus } from '../share/types.ts';
- // 日期格式化
- export const formatDate = (date: string | Date, format = 'YYYY-MM-DD HH:mm:ss'): string => {
- if (!date) return '-';
- return dayjs(date).format(format);
- };
- // 格式化时间为相对时间(如:3小时前)
- export const formatRelativeTime = (date: string | Date): string => {
- if (!date) return '-';
- const now = dayjs();
- const dateObj = dayjs(date);
- const diffInSeconds = now.diff(dateObj, 'second');
-
- if (diffInSeconds < 60) {
- return `${diffInSeconds}秒前`;
- } else if (diffInSeconds < 3600) {
- return `${Math.floor(diffInSeconds / 60)}分钟前`;
- } else if (diffInSeconds < 86400) {
- return `${Math.floor(diffInSeconds / 3600)}小时前`;
- } else if (diffInSeconds < 2592000) {
- return `${Math.floor(diffInSeconds / 86400)}天前`;
- } else {
- return formatDate(date, 'YYYY-MM-DD');
- }
- };
- // 获取枚举的选项(用于下拉菜单等)
- export const getEnumOptions = (enumObj: Record<string | number, string | number>) => {
- return Object.entries(enumObj)
- .filter(([key]) => !isNaN(Number(key))) // 过滤掉映射对象中的字符串键
- .map(([value, label]) => ({
- value: Number(value),
- label: String(label)
- }));
- };
- // 获取启用状态选项
- export const getEnableStatusOptions = () => {
- return [
- { value: EnableStatus.ENABLED, label: '启用' },
- { value: EnableStatus.DISABLED, label: '禁用' }
- ];
- };
- // 获取删除状态选项
- export const getDeleteStatusOptions = () => {
- return [
- { value: DeleteStatus.NOT_DELETED, label: '未删除' },
- { value: DeleteStatus.DELETED, label: '已删除' }
- ];
- };
- // 获取审核状态选项
- export const getAuditStatusOptions = () => {
- return [
- { value: AuditStatus.PENDING, label: '待审核' },
- { value: AuditStatus.APPROVED, label: '已通过' },
- { value: AuditStatus.REJECTED, label: '已拒绝' }
- ];
- };
- // 格式化文件大小
- export const formatFileSize = (bytes: number): string => {
- if (bytes === 0) return '0 B';
-
- const k = 1024;
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
- const i = Math.floor(Math.log(bytes) / Math.log(k));
-
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
- };
- // 处理API错误
- export const handleApiError = (error: any): string => {
- if (error.response) {
- // 服务器响应错误
- const status = error.response.status;
- const data = error.response.data;
-
- if (status === 401) {
- return '您的登录已过期,请重新登录';
- } else if (status === 403) {
- return '您没有权限执行此操作';
- } else if (status === 404) {
- return '请求的资源不存在';
- } else if (status === 422) {
- // 表单验证错误
- return data.message || '输入数据无效';
- } else {
- return data.message || `服务器错误 (${status})`;
- }
- } else if (error.request) {
- // 请求发送成功但没有收到响应
- return '网络连接错误,请检查您的网络连接';
- } else {
- // 请求设置错误
- return '应用程序错误,请稍后再试';
- }
- };
- // 复制文本到剪贴板
- export const copyToClipboard = async (text: string): Promise<boolean> => {
- try {
- await navigator.clipboard.writeText(text);
- return true;
- } catch (error) {
- console.error('复制到剪贴板失败:', error);
- return false;
- }
- };
- // 防抖函数
- export const debounce = <T extends (...args: any[]) => any>(
- func: T,
- wait: number
- ): ((...args: Parameters<T>) => void) => {
- let timeout: number | null = null;
-
- return (...args: Parameters<T>) => {
- if (timeout) {
- clearTimeout(timeout);
- }
-
- timeout = setTimeout(() => {
- func(...args);
- }, wait) as unknown as number;
- };
- };
- // 生成随机颜色
- export const getRandomColor = (): string => {
- const letters = '0123456789ABCDEF';
- let color = '#';
- for (let i = 0; i < 6; i++) {
- color += letters[Math.floor(Math.random() * 16)];
- }
- return color;
- };
- // 获取本地存储值,带过期检查
- export const getLocalStorageWithExpiry = (key: string) => {
- const itemStr = localStorage.getItem(key);
-
- if (!itemStr) return null;
-
- const item = JSON.parse(itemStr);
- const now = new Date();
-
- if (item.expiry && now.getTime() > item.expiry) {
- localStorage.removeItem(key);
- return null;
- }
-
- return item.value;
- };
- // 设置本地存储值,带过期时间
- export const setLocalStorageWithExpiry = (key: string, value: any, expiryHours = 24) => {
- const now = new Date();
- const item = {
- value: value,
- expiry: now.getTime() + expiryHours * 60 * 60 * 1000
- };
-
- localStorage.setItem(key, JSON.stringify(item));
- };
|