Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
download-web
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
downloader
download-web
Commits
e43635dc
Commit
e43635dc
authored
Sep 04, 2025
by
焦子成
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1
parent
d03986cd
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
191 additions
and
112 deletions
+191
-112
sample_downloads_少.xlsx
+0
-0
src/api/api.js
+2
-0
src/stores/auth.js
+64
-48
src/stores/download.js
+4
-1
src/views/Downloader.vue
+0
-0
src/views/History.vue
+5
-3
src/views/Login.vue
+39
-15
src/views/Settings.vue
+77
-45
No files found.
sample_downloads_少.xlsx
0 → 100644
View file @
e43635dc
File added
src/api/api.js
View file @
e43635dc
...
...
@@ -31,6 +31,8 @@ const config = {
fileUploadDetail
:
`
${
domain
}
/uploadBatch/fileUploadDetail`
,
queryFileAll
:
`
${
domain
}
/uploadBatch/queryFileAll`
,
detailInfo
:
`
${
domain
}
/uploadDetail/detailInfo`
,
updateInfo
:
`
${
domain
}
/user/updateInfo`
,
getInfo
:
`
${
domain
}
/user/getInfo`
,
};
export
default
config
;
src/stores/auth.js
View file @
e43635dc
...
...
@@ -112,11 +112,11 @@ export const useAuthStore = defineStore('auth', () => {
loadUsersFromStorage
()
}
console
.
log
(
'当前用户列表:'
,
users
.
value
.
map
(
u
=>
u
.
userName
))
//
console.log('当前用户列表:', users.value.map(u => u.userName))
// 查找用户
let
user
=
users
.
value
.
find
(
u
=>
u
.
userName
===
userName
)
console
.
log
(
'--->查找用户:'
,
user
)
//
console.log('--->查找用户:', user)
if
(
!
user
)
{
console
.
log
(
'未找到用户:'
,
userName
)
// user.value.userName = userName
...
...
@@ -154,7 +154,9 @@ console.log('--->查找用户:', user)
// 设置当前用户
const
setCurrentUser
=
(
userData
)
=>
{
console
.
log
(
'setCurrentUser userData->'
,
userData
)
user
.
value
=
userData
console
.
log
(
'setCurrentUser user.value->'
,
user
.
value
)
isAuthenticated
.
value
=
true
// 保存到本地存储
...
...
@@ -164,8 +166,11 @@ console.log('--->查找用户:', user)
// 用户登出
const
logout
=
()
=>
{
user
.
value
=
null
users
.
value
=
[]
isAuthenticated
.
value
=
false
localStorage
.
removeItem
(
'vue_downloader_current_user'
)
localStorage
.
removeItem
(
'vue-downloader-settings'
)
localStorage
.
removeItem
(
'vue_downloader_users'
)
}
// 更新用户设置
...
...
@@ -246,12 +251,13 @@ console.log('--->查找用户:', user)
// 清除用户下载历史
const
clearDownloadHistory
=
()
=>
{
if
(
!
user
.
value
)
return
//
if (!user.value) return
try
{
const
allHistory
=
JSON
.
parse
(
localStorage
.
getItem
(
'vue_downloader_history'
)
||
'[]'
)
const
filteredHistory
=
allHistory
.
filter
(
history
=>
history
.
userId
!==
user
.
value
.
id
)
localStorage
.
setItem
(
'vue_downloader_history'
,
JSON
.
stringify
(
filteredHistory
))
// const allHistory = JSON.parse(localStorage.getItem('vue_downloader_history') || '[]')
// const filteredHistory = allHistory.filter(history => history.userId !== user.value.id)
// localStorage.setItem('vue_downloader_history', JSON.stringify(filteredHistory))
localStorage
.
setItem
(
'vue_downloader_history'
,
JSON
.
stringify
([]))
}
catch
(
error
)
{
console
.
error
(
'清除下载历史失败:'
,
error
)
}
...
...
@@ -259,58 +265,67 @@ console.log('--->查找用户:', user)
// 初始化:从本地存储加载数据
const
initialize
=
()
=>
{
console
.
log
(
'Auth store 初始化开始...'
)
//
console.log('Auth store 初始化开始...')
// 清除旧的用户数据,重新创建默认管理员账号
console
.
log
(
'清除旧的用户数据...'
)
//
console.log('清除旧的用户数据...')
localStorage
.
removeItem
(
'vue_downloader_users'
)
localStorage
.
removeItem
(
'vue_downloader_current_user'
)
loadUsersFromStorage
()
//
loadUsersFromStorage()
// 如果没有用户,创建默认管理员账号
if
(
users
.
value
.
length
===
0
)
{
console
.
log
(
'创建默认管理员账号...'
)
const
adminPassword
=
'123456'
const
adminUser
=
{
id
:
'admin'
,
userName
:
'admin'
,
password
:
btoa
(
adminPassword
),
email
:
''
,
createdAt
:
new
Date
().
toISOString
(),
lastLoginAt
:
null
,
settings
:
{
maxConcurrentDownloads
:
3
,
enableNotifications
:
true
,
fileNamePrefix
:
''
}
}
users
.
value
.
push
(
adminUser
)
saveUsersToStorage
()
console
.
log
(
'默认管理员账号创建完成'
)
console
.
log
(
'管理员密码:'
,
adminPassword
)
console
.
log
(
'管理员密码编码后:'
,
btoa
(
adminPassword
))
}
console
.
log
(
'当前用户列表:'
,
users
.
value
.
map
(
u
=>
u
.
userName
))
//
if (users.value.length === 0) {
//
console.log('创建默认管理员账号...')
//
const adminPassword = '123456'
//
const adminUser = {
//
id: 'admin',
//
userName: 'admin',
//
password: btoa(adminPassword),
//
email: '',
//
createdAt: new Date().toISOString(),
//
lastLoginAt: null,
//
settings: {
//
maxConcurrentDownloads: 3,
//
enableNotifications: true,
//
fileNamePrefix: ''
//
}
//
}
//
users.value.push(adminUser)
//
saveUsersToStorage()
//
console.log('默认管理员账号创建完成')
//
console.log('管理员密码:', adminPassword)
//
console.log('管理员密码编码后:', btoa(adminPassword))
//
}
//
console.log('当前用户列表:', users.value.map(u => u.userName))
// 尝试恢复当前用户会话
try
{
const
storedUser
=
localStorage
.
getItem
(
'vue_downloader_current_user'
)
if
(
storedUser
)
{
const
userData
=
JSON
.
parse
(
storedUser
)
// 验证用户是否仍然存在
const
existingUser
=
users
.
value
.
find
(
u
=>
u
.
id
===
userData
.
id
)
if
(
existingUser
)
{
setCurrentUser
(
existingUser
)
console
.
log
(
'用户会话已恢复:'
,
existingUser
.
userName
)
}
}
}
catch
(
error
)
{
console
.
error
(
'恢复用户会话失败:'
,
error
)
}
// try {
// const storedUser = localStorage.getItem('vue_downloader_current_user')
// if (storedUser) {
// const userData = JSON.parse(storedUser)
// // 验证用户是否仍然存在
// const existingUser = users.value.find(u => u.id === userData.id)
// if (existingUser) {
// setCurrentUser(existingUser)
// console.log('用户会话已恢复:', existingUser.userName)
// }
// }
// } catch (error) {
// console.error('恢复用户会话失败:', error)
// }
// console.log('Auth store 初始化完成')
}
console
.
log
(
'Auth store 初始化完成'
)
// 新加-保存用户信息
function
saveUserInfo
(
userInfo
)
{
// console.log('userInfo->',userInfo)
// users.value.push(userInfo)
// console.log('users->',users.value)
setCurrentUser
(
userInfo
)
// saveUsersToStorage()
}
// 计算属性
...
...
@@ -337,6 +352,7 @@ console.log('--->查找用户:', user)
validatePassword
,
isUsernameExists
,
initialize
,
saveUserInfo
,
// 计算属性
userCount
...
...
src/stores/download.js
View file @
e43635dc
...
...
@@ -30,7 +30,9 @@ export const useDownloadStore = defineStore('download', () => {
const
loadFromStorage
=
()
=>
{
try
{
// 加载用户设置
const
userSettings
=
authStore
.
getUserSettings
()
// const userSettings = authStore.getUserSettings()
const
userSettings
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'userInfo'
))?.
settings
||
{}
console
.
log
(
'download.js userSettings-->'
,
userSettings
)
maxConcurrentDownloads
.
value
=
userSettings
.
maxConcurrentDownloads
||
3
customSubFolder
.
value
=
userSettings
.
fileNamePrefix
||
''
enableNotifications
.
value
=
userSettings
.
enableNotifications
!==
false
...
...
@@ -635,6 +637,7 @@ export const useDownloadStore = defineStore('download', () => {
// 清除所有任务
const clearAll = () => {
downloads.value = []
// excelFiles.value = []
saveToStorage()
}
...
...
src/views/Downloader.vue
View file @
e43635dc
This diff is collapsed.
Click to expand it.
src/views/History.vue
View file @
e43635dc
...
...
@@ -50,6 +50,7 @@
<div
class=
"header-actions"
>
<el-select
v-model=
"statusFilter"
placeholder=
"状态筛选"
size=
"small"
style=
"width: 120px;"
@
change=
"statusChange"
>
<el-option
label=
"全部"
value=
"all"
/>
<el-option
label=
"等待中"
value=
"pending"
/>
<el-option
label=
"已完成"
value=
"completed"
/>
<el-option
label=
"失败"
value=
"error"
/>
<el-option
label=
"暂停"
value=
"paused"
/>
...
...
@@ -246,9 +247,11 @@ function laodFileAll(){
}
const
statusFilterMap
=
{
'all'
:
''
,
'pending'
:
0
,
'downloading'
:
1
,
'paused'
:
2
,
'completed'
:
3
,
'error'
:
4
,
'paused'
:
2
'error'
:
4
}
// 加载历史数据
const
loadHistory
=
()
=>
{
...
...
@@ -268,7 +271,6 @@ const loadHistory = () => {
list
.
push
({
"id"
:
element
.
detailId
,
"fileName"
:
element
.
fileName
,
"fileNamePrefix"
:
""
,
"excelFileName"
:
element
.
uploadName
,
"url"
:
element
.
fileUrl
,
"status"
:
statusMap
[
element
.
fileStatus
],
...
...
src/views/Login.vue
View file @
e43635dc
...
...
@@ -219,6 +219,7 @@ const switchToLogin = () => {
// 切换到注册模式
const
switchToRegister
=
()
=>
{
isLoginMode
.
value
=
false
clearMessages
()
resetForms
()
...
...
@@ -260,22 +261,43 @@ function handleLogin() {
loading
.
value
=
false
if
(
res
.
code
===
200
)
{
sessionStorage
.
setItem
(
"token"
,
res
.
data
)
let
user
=
{
"id"
:
res
.
data
,
"username"
:
loginForm
.
userName
,
"password"
:
loginForm
.
password
,
"email"
:
""
,
"createdAt"
:
new
Date
(),
"lastLoginAt"
:
new
Date
(),
"settings"
:
{
"maxConcurrentDownloads"
:
3
,
"enableNotifications"
:
true
,
"fileNamePrefix"
:
""
loadUserInfo
()
}
else
{
errorMessage
.
value
=
res
.
message
ElMessage
.
error
(
res
.
message
)
}
})
}
function
loadUserInfo
()
{
http
.
post
(
config
.
getInfo
).
then
(
res
=>
{
if
(
res
.
code
===
200
)
{
let
userObj
=
{
id
:
res
.
data
.
userName
,
username
:
res
.
data
.
userName
,
password
:
loginForm
.
password
,
email
:
res
.
data
.
email
||
''
,
createdAt
:
res
.
data
.
createTime
,
lastLoginAt
:
res
.
data
.
lastLoginTime
,
settings
:
{
maxConcurrentDownloads
:
res
.
data
.
maxThread
||
3
,
enableNotifications
:
res
.
data
.
notifyStatus
==
1
?
true
:
false
,
fileNamePrefix
:
res
.
data
.
filePrefix
,
}
}
authStore
.
setCurrentUser
(
user
)
sessionStorage
.
setItem
(
"userName"
,
loginForm
.
userName
)
router
.
push
(
'/downloader'
)
console
.
log
(
'登录用户信息:'
,
userObj
)
console
.
log
(
'登录用户信息1:'
,
userObj
.
settings
)
sessionStorage
.
setItem
(
'userInfo'
,
JSON
.
stringify
(
userObj
))
// authStore.saveUserInfo(userObj)
// authStore.users.value.push(user)
// authStore.saveUsersToStorage()
// authStore.setCurrentUser(user)
// sessionStorage.setItem("userName", loginForm.userName)
setTimeout
(()
=>
{
router
.
push
(
'/downloader'
)
},
1000
);
}
else
{
errorMessage
.
value
=
res
.
message
ElMessage
.
error
(
res
.
message
)
...
...
@@ -377,8 +399,10 @@ function handleRegister() {
loading
.
value
=
false
if
(
res
.
code
===
200
)
{
sessionStorage
.
setItem
(
"token"
,
res
.
data
)
s
witchToLogin
()
s
uccessMessage
.
value
=
'注册成功!请登录'
loginForm
.
userName
=
registerForm
.
userName
isLoginMode
.
value
=
true
// switchToLogin()
}
else
{
errorMessage
.
value
=
res
.
message
ElMessage
.
error
(
res
.
message
)
...
...
src/views/Settings.vue
View file @
e43635dc
...
...
@@ -3,7 +3,9 @@
<!-- 头部 -->
<header
class=
"header"
>
<div
class=
"logo"
>
<el-icon><Setting
/></el-icon>
<el-icon>
<Setting
/>
</el-icon>
个人设置
</div>
<el-button
@
click=
"goBack"
type=
"primary"
size=
"small"
>
...
...
@@ -19,20 +21,20 @@
<span>
用户信息
</span>
</div>
</
template
>
<el-form
:model=
"userInfo"
label-width=
"120px"
>
<el-form-item
label=
"用户名"
>
<el-input
v-model=
"userInfo.userName"
disabled
/>
</el-form-item>
<el-form-item
label=
"邮箱"
>
<el-input
v-model=
"userInfo.email"
disabled
/>
</el-form-item>
<el-form-item
label=
"注册时间"
>
<el-input
v-model=
"userInfo.createdAt"
disabled
/>
</el-form-item>
<el-form-item
label=
"最后登录"
>
<el-input
v-model=
"userInfo.lastLoginAt"
disabled
/>
</el-form-item>
...
...
@@ -43,34 +45,23 @@
<
template
#
header
>
<div
class=
"card-header"
>
<span>
下载设置
</span>
<el-button
type=
"primary"
@
click=
"saveSettings"
>
保存
</el-button>
</div>
</
template
>
<el-form
:model=
"downloadSettings"
label-width=
"120px"
>
<el-form-item
label=
"最大并发数"
>
<el-input-number
v-model=
"downloadSettings.maxConcurrentDownloads"
:min=
"1"
:max=
"10"
@
change=
"saveSettings"
/>
<el-input-number
v-model=
"downloadSettings.maxConcurrentDownloads"
:min=
"1"
:max=
"10"
/>
<span
class=
"form-tip"
>
同时下载的最大文件数量
</span>
</el-form-item>
<el-form-item
label=
"文件名前缀"
>
<el-input
v-model=
"downloadSettings.fileNamePrefix"
placeholder=
"例如: vue-downloader"
@
input=
"saveSettings"
/>
<el-input
v-model=
"downloadSettings.fileNamePrefix"
placeholder=
"例如: vue-downloader"
/>
<span
class=
"form-tip"
>
为所有下载文件添加前缀
</span>
</el-form-item>
<el-form-item
label=
"下载通知"
>
<el-switch
v-model=
"downloadSettings.enableNotifications"
@
change=
"saveSettings"
/>
<el-switch
v-model=
"downloadSettings.enableNotifications"
/>
<span
class=
"form-tip"
>
下载完成后显示通知
</span>
</el-form-item>
</el-form>
...
...
@@ -82,7 +73,7 @@
<span>
数据管理
</span>
</div>
</
template
>
<div
class=
"data-management"
>
<div
class=
"data-item"
>
<div
class=
"data-info"
>
...
...
@@ -93,7 +84,7 @@
清除历史
</el-button>
</div>
<div
class=
"data-item"
>
<div
class=
"data-info"
>
<h4>
用户数据
</h4>
...
...
@@ -138,27 +129,66 @@ const downloadSettings = reactive({
// 初始化数据
const
initializeData
=
()
=>
{
const
user
=
authStore
.
user
// const user = authStore.user
const
user
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'userInfo'
))
console
.
log
(
'Settings.vue initializeData user-->'
,
user
)
if
(
user
)
{
userInfo
.
userName
=
user
.
user
N
ame
userInfo
.
userName
=
user
.
user
n
ame
userInfo
.
email
=
user
.
email
||
'未设置'
userInfo
.
createdAt
=
new
Date
(
user
.
createdAt
).
toLocaleString
()
userInfo
.
lastLoginAt
=
user
.
lastLoginAt
?
new
Date
(
user
.
lastLoginAt
).
toLocaleString
()
:
'从未登录'
// userInfo.createdAt = new Date(user.createdAt).toLocaleString()
// userInfo.lastLoginAt = user.lastLoginAt ? new Date(user.lastLoginAt).toLocaleString() : '从未登录'
userInfo
.
createdAt
=
user
.
createdAt
userInfo
.
lastLoginAt
=
user
.
lastLoginAt
// 加载用户设置
const
settings
=
authStore
.
getUserSettings
()
// const settings = authStore.getUserSettings()
const
settings
=
user
.
settings
Object
.
assign
(
downloadSettings
,
settings
)
}
}
// 保存设置
const
saveSettings
=
()
=>
{
try
{
authStore
.
updateUserSettings
(
downloadSettings
)
ElMessage
.
success
(
'设置已保存'
)
}
catch
(
error
)
{
ElMessage
.
error
(
'保存设置失败'
)
}
// sessionStorage.setItem('userInfo', JSON.stringify({}))
http
.
post
(
config
.
updateInfo
,
{
maxThread
:
downloadSettings
.
maxConcurrentDownloads
,
notifyStatus
:
downloadSettings
.
enableNotifications
?
1
:
0
,
filePrefix
:
downloadSettings
.
fileNamePrefix
}).
then
(
res
=>
{
if
(
res
.
code
===
200
)
{
ElMessage
.
success
(
'设置已保存'
)
loadUserInfo
()
}
else
{
ElMessage
.
error
(
'保存设置失败'
)
}
})
// try {
// authStore.updateUserSettings(downloadSettings)
// } catch (error) {
// ElMessage.error('保存设置失败')
// }
}
function
loadUserInfo
()
{
http
.
post
(
config
.
getInfo
).
then
(
res
=>
{
if
(
res
.
code
===
200
)
{
let
userObj
=
{
id
:
res
.
data
.
userName
,
username
:
res
.
data
.
userName
,
password
:
''
,
email
:
res
.
data
.
email
||
''
,
createdAt
:
res
.
data
.
createTime
,
lastLoginAt
:
res
.
data
.
lastLoginTime
,
settings
:
{
maxConcurrentDownloads
:
res
.
data
.
maxThread
||
3
,
enableNotifications
:
res
.
data
.
notifyStatus
==
1
?
true
:
false
,
fileNamePrefix
:
res
.
data
.
filePrefix
,
}
}
sessionStorage
.
setItem
(
'userInfo'
,
JSON
.
stringify
(
userObj
))
}
else
{
ElMessage
.
error
(
res
.
message
)
}
})
}
// 清除历史记录
...
...
@@ -173,7 +203,7 @@ const clearHistory = async () => {
type
:
'warning'
}
)
authStore
.
clearDownloadHistory
()
ElMessage
.
success
(
'历史记录已清除'
)
http
.
post
(
config
.
uploadDetailDeleteAll
,
{
...
...
@@ -192,7 +222,7 @@ const clearHistory = async () => {
const
deleteUserData
=
async
()
=>
{
try
{
await
ElMessageBox
.
confirm
(
'确定要删除当前用户的所有数据吗?
包括设置、历史记录等,
此操作不可恢复。'
,
'确定要删除当前用户的所有数据吗?此操作不可恢复。'
,
'确认删除'
,
{
confirmButtonText
:
'确定'
,
...
...
@@ -200,10 +230,10 @@ const deleteUserData = async () => {
type
:
'warning'
}
)
// 清除历史记录
authStore
.
clearDownloadHistory
()
// 重置用户设置
const
defaultSettings
=
{
maxConcurrentDownloads
:
3
,
...
...
@@ -212,8 +242,8 @@ const deleteUserData = async () => {
}
authStore
.
updateUserSettings
(
defaultSettings
)
Object
.
assign
(
downloadSettings
,
defaultSettings
)
ElMessage
.
success
(
'
用户
数据已删除'
)
ElMessage
.
success
(
'数据已删除'
)
http
.
post
(
config
.
uploadDetailDeleteAll
,
{
type
:
2
}).
then
(
res
=>
{
...
...
@@ -234,7 +264,7 @@ const goBack = () => {
// 组件挂载时初始化
onMounted
(()
=>
{
initializeData
()
userInfo
.
userName
=
sessionStorage
.
getItem
(
"userName"
)
||
''
//
userInfo.userName = sessionStorage.getItem("userName") || ''
})
</
script
>
...
...
@@ -276,6 +306,8 @@ onMounted(() => {
font-size
:
16px
;
font-weight
:
600
;
color
:
#333
;
display
:
flex
;
justify-content
:
space-between
;
}
.form-tip
{
...
...
@@ -316,7 +348,7 @@ onMounted(() => {
.main-content
{
padding
:
0
10px
;
}
.data-item
{
flex-direction
:
column
;
align-items
:
flex-start
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment