提交代码
This commit is contained in:
1 parent
2b5db607f6
commit
0ed820d7ce
36 files changed
+5167
-249
No files matched your search
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user