feat: update

This commit is contained in:
yanghao05
2025-04-18 17:41:31 +08:00
parent 62dd5899e0
commit 4165d440ed
7 changed files with 210 additions and 93 deletions

View File

@@ -0,0 +1,16 @@
import dayjs from 'dayjs';
import timezone from 'dayjs/plugin/timezone';
import utc from 'dayjs/plugin/utc';
// Configure dayjs
dayjs.extend(utc);
dayjs.extend(timezone);
/**
* Format date to locale string with timezone
* @param {string|Date} date - The date to format
* @returns {string} Formatted date string
*/
export function formatDate(date) {
return dayjs.tz(date, 'Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
}

View File

@@ -0,0 +1,24 @@
/**
* Format file size to human readable string
* @param {number} bytes - The file size in bytes
* @returns {string} Formatted file size with unit
*/
export function formatFileSize(bytes) {
if (bytes === 0) return "0 B";
const k = BigInt(1024);
const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
// Convert input to BigInt
const bytesValue = BigInt(bytes);
// Calculate the appropriate unit
let i = 0;
let size = bytesValue;
while (size >= k && i < sizes.length - 1) {
size = size / k;
i++;
}
// Convert back to number and format with commas
return `${Number(size).toLocaleString("en-US")} ${sizes[i]}`;
}

View File

@@ -0,0 +1,130 @@
/**
* Get file type category based on MIME type
* @param {string} mime - The MIME type of the file
* @returns {string} The file type category
*/
export function getFileTypeByMime(mime) {
if (!mime) return 'unknown';
const mimeType = mime.toLowerCase();
// Video files
if (mimeType.startsWith('video/')) {
return 'video';
}
// Audio files
if (mimeType.startsWith('audio/')) {
return 'audio';
}
// Image files
if (mimeType.startsWith('image/')) {
return 'image';
}
// PDF files
if (mimeType === 'application/pdf') {
return 'pdf';
}
// Document files
if ([
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/rtf',
'text/plain',
'text/csv'
].includes(mimeType)) {
return 'document';
}
// Compressed files
if ([
'application/zip',
'application/x-rar-compressed',
'application/x-7z-compressed',
'application/x-tar',
'application/gzip'
].includes(mimeType)) {
return 'compressed';
}
return 'other';
}
/**
* Get Chinese file type category based on MIME type
* @param {string} mime - The MIME type of the file
* @returns {string} The Chinese file type category
*/
export function getFileTypeByMimeCN(mime) {
const typeMap = {
'video': '视频',
'audio': '音频',
'image': '图片',
'pdf': 'PDF文档',
'document': '文档',
'compressed': '压缩包',
'other': '其他',
'unknown': '未知'
};
return typeMap[getFileTypeByMime(mime)];
}
/**
* Get file icon component based on file extension
* @param {Object} file - The file object containing name property
* @param {Object} icons - The icons object containing icon components
* @returns {Component} The icon component
*/
export function getFileIcon(file, icons) {
if (!file?.name) return icons.BsFileEarmark;
const ext = file.name.split('.').pop()?.toLowerCase();
// Images
if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'].includes(ext)) {
return icons.BsFileImage;
}
// Videos
if (['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv'].includes(ext)) {
return icons.BsFilePlayFill;
}
// Audio
if (['mp3', 'wav', 'ogg', 'aac', 'm4a'].includes(ext)) {
return icons.BsFileMusic;
}
// Documents
if (['doc', 'docx'].includes(ext)) {
return icons.BsFileWord;
}
if (['xls', 'xlsx'].includes(ext)) {
return icons.BsFileExcel;
}
if (['ppt', 'pptx'].includes(ext)) {
return icons.BsFilePpt;
}
if (ext === 'pdf') {
return icons.BsFilePdf;
}
if (['txt', 'rtf'].includes(ext)) {
return icons.BsFileText;
}
// Archives
if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) {
return icons.BsFileZip;
}
return icons.BsFileEarmark;
}

View File

@@ -1,27 +0,0 @@
import { router } from '@/router';
import { useAuthStore } from '@/stores/auth';
import axios from 'axios';
export const http = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
});
http.interceptors.request.use((config) => {
const authStore = useAuthStore();
if (authStore.token) {
config.headers.Authorization = `Bearer ${authStore.token}`;
}
return config;
});
http.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
const authStore = useAuthStore();
authStore.logout();
router.push('/login');
}
return Promise.reject(error);
}
);