提交代码

This commit is contained in:
zlwu committed 2025-08-02 21:06:47 +08:00
1 parent 2b5db607f6
commit 0ed820d7ce
36 files changed
+5167 -249

No files matched your search

+124
View File
@@ -0,0 +1,124 @@
import request from '@/utils/request'
/**
* 重置bucket访问密码
* @param bucketName bucket名称
* @param newPassword 新密码
* @returns 操作结果
*/
export function resetBucketPassword(bucketName: string, newPassword: string) {
return request({
url: '/system/bucket-password/reset',
method: 'post',
params: { bucketName, newPassword }
})
}
/**
* 获取bucket密码信息
* @param bucketName bucket名称
* @returns bucket密码信息
*/
export function getBucketPasswordInfo(bucketName: string) {
return request({
url: `/system/bucket-password/info/${bucketName}`,
method: 'get'
})
}
/**
* 获取bucket访问记录
* @param bucketName bucket名称
* @param limit 限制数量,默认10条
* @returns 访问记录列表
*/
export function getBucketAccessRecords(bucketName: string, limit: number = 10) {
return request({
url: `/system/bucket-password/records/${bucketName}`,
method: 'get',
params: { limit }
})
}
/**
* 验证bucket密码
* @param bucketName bucket名称
* @param password 密码
* @returns 验证结果
*/
export function validateBucketPassword(bucketName: string, password: string) {
return request({
url: '/system/bucket-password/validate',
method: 'post',
params: { bucketName, password }
})
}
/**
* 生成强密码
* @param length 密码长度,默认12位
* @returns 生成的密码
*/
export function generateStrongPassword(length: number = 12): string {
const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
let password = ''
for (let i = 0; i < length; i++) {
password += charset.charAt(Math.floor(Math.random() * charset.length))
}
return password
}
/**
* 验证密码强度
* @param password 密码
* @returns 密码强度评估
*/
export function validatePasswordStrength(password: string): {
isValid: boolean
score: number
suggestions: string[]
} {
const suggestions: string[] = []
let score = 0
// 长度检查
if (password.length >= 8) {
score += 1
} else {
suggestions.push('密码长度至少8位')
}
// 包含大写字母
if (/[A-Z]/.test(password)) {
score += 1
} else {
suggestions.push('包含大写字母')
}
// 包含小写字母
if (/[a-z]/.test(password)) {
score += 1
} else {
suggestions.push('包含小写字母')
}
// 包含数字
if (/\d/.test(password)) {
score += 1
} else {
suggestions.push('包含数字')
}
// 包含特殊字符
if (/[!@#$%^&*]/.test(password)) {
score += 1
} else {
suggestions.push('包含特殊字符')
}
return {
isValid: score >= 4,
score,
suggestions
}
}
+161
View File
@@ -0,0 +1,161 @@
import request from '@/utils/request'
/**
* 获取文件临时访问URL
* @param ossId 文件ID
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 临时访问URL
*/
export function getFileAccessUrl(ossId: number, bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: `/resource/file/access/${ossId}`,
method: 'get',
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 批量获取文件临时访问URL
* @param ossIds 文件ID列表
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 文件ID与临时URL的映射
*/
export function getBatchFileAccessUrl(ossIds: number[], bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: '/resource/file/access/batch',
method: 'post',
data: ossIds,
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 获取文件下载URL(带权限检查)
* @param ossId 文件ID
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 下载URL
*/
export function getFileDownloadUrl(ossId: number, bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: `/resource/file/download/${ossId}`,
method: 'get',
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 获取文件预览URL(带权限检查)
* @param ossId 文件ID
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 预览URL
*/
export function getFilePreviewUrl(ossId: number, bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: `/resource/file/preview/${ossId}`,
method: 'get',
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 安全下载文件(带bucket密码验证)
* @param ossId 文件ID
* @param fileName 文件名
* @param bucketPassword bucket访问密码
* @returns Promise<void>
*/
export async function secureDownloadFile(ossId: number, fileName: string, bucketPassword?: string) {
try {
// 获取临时下载URL
const { data: downloadUrl } = await getFileDownloadUrl(ossId, bucketPassword)
// 使用fetch下载文件
const response = await fetch(downloadUrl)
if (!response.ok) {
throw new Error('下载失败')
}
const blob = await response.blob()
// 创建下载链接
const url = URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = fileName
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
// 释放内存
URL.revokeObjectURL(url)
return Promise.resolve()
} catch (error) {
console.error('文件下载失败:', error)
return Promise.reject(error)
}
}
/**
* 安全预览文件(带bucket密码验证)
* @param ossId 文件ID
* @param contentType 文件类型
* @param bucketPassword bucket访问密码
* @returns Promise<string> 预览URL
*/
export async function securePreviewFile(ossId: number, contentType?: string, bucketPassword?: string) {
try {
// 获取临时预览URL
const { data: previewUrl } = await getFilePreviewUrl(ossId, bucketPassword)
// 根据文件类型选择预览方式
if (contentType?.startsWith('image/')) {
// 图片直接返回URL用于预览
return Promise.resolve(previewUrl)
} else {
// 其他文件在新窗口打开
window.open(previewUrl, '_blank')
return Promise.resolve(previewUrl)
}
} catch (error) {
console.error('文件预览失败:', error)
return Promise.reject(error)
}
}
/**
* 获取bucket访问密码提示
* @param bucketName bucket名称
* @returns 密码提示信息
*/
export function getBucketPasswordHint(bucketName: string) {
// 这里可以根据bucket名称返回相应的密码提示
// 例如:从配置中获取密码提示信息
return `请输入 ${bucketName} bucket 的访问密码`
}
/**
* 验证bucket密码格式
* @param password 密码
* @returns 验证结果
*/
export function validateBucketPassword(password: string): boolean {
// 简单的密码格式验证
return password && password.length >= 6
}