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
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
257 additions
and
194 deletions
+257
-194
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
+66
-82
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
...
...
@@ -15,6 +15,7 @@
<User
/>
</el-icon>
{{
userName
}}
<!--
{{
authStore
.
user
?.
username
}}
-->
<el-icon>
<ArrowDown
/>
</el-icon>
...
...
@@ -52,7 +53,7 @@
<el-button
@
click=
"selectExcelFile(row.batchId)"
type=
"primary"
size=
"small"
>
选择
</el-button>
<el-button
@
click=
"deleteExcelFile(row.batchId)"
type=
"danger"
size=
"small"
>
<el-button
@
click=
"deleteExcelFile(row.batchId
, row.uploadName
)"
type=
"danger"
size=
"small"
>
删除
</el-button>
</
template
>
...
...
@@ -248,9 +249,9 @@
<
el
-
button
@
click
=
"downloadCurrentPage"
type
=
"info"
size
=
"small"
>
下载当前页
<
/el-button
>
<
el
-
button
@
click
=
"pauseCurrentPage"
type
=
"warning"
size
=
"small"
>
<
!--
<
el
-
button
@
click
=
"pauseCurrentPage"
type
=
"warning"
size
=
"small"
>
暂停当前页
<
/el-button
>
<
/el-button>
--
>
<
el
-
divider
direction
=
"vertical"
/>
<
el
-
button
@
click
=
"clearCompleted"
size
=
"small"
>
清除已完成
...
...
@@ -269,7 +270,6 @@
<
h3
>
暂无下载任务
<
/h3
>
<
p
>
请在上方配置区域上传
Excel
文件并解析添加下载任务
<
/p
>
<
/div
>
<
div
v
-
else
class
=
"download-table-container"
>
<!--
分页表格
-->
<
el
-
table
:
data
=
"paginatedDownloads"
style
=
"width: 100%"
border
stripe
highlight
-
current
-
row
>
...
...
@@ -295,9 +295,6 @@
<
/div
>
<
div
class
=
"file-details"
>
<
div
class
=
"file-name"
>
<!--
<
span
v
-
if
=
"downloadStore.customSubFolder"
class
=
"file-prefix"
>
{{
downloadStore
.
customSubFolder
}}
_
<
/span> --
>
<
span
v
-
if
=
"row.filePrefix"
class
=
"file-prefix"
>
{{
row
.
filePrefix
}}
_
<
/span
>
...
...
@@ -317,32 +314,6 @@
<
/template
>
<
/el-table-column
>
<!--
<
el
-
table
-
column
label
=
"进度"
width
=
"200"
align
=
"center"
>
<
template
#
default
=
"{ row
}
"
>
<
div
v
-
if
=
"row.status === 'downloading'"
class
=
"progress-container"
>
<
el
-
progress
:
percentage
=
"row.progress"
:
format
=
"(percentage) => `${percentage
}
%`"
size
=
"small"
:
stroke
-
width
=
"8"
/>
<
div
class
=
"speed-info"
>
{{
formatSpeed
(
row
.
speed
)
}}
<
/div
>
<
/div
>
<
span
v
-
else
-
if
=
"row.status === 'completed'"
class
=
"completed-text"
>
100
%
<
/span
>
<
span
v
-
else
class
=
"pending-text"
>
{{
row
.
progress
}}
%
<
/span
>
<
/template
>
<
/el-table-column> --
>
<!--
<
el
-
table
-
column
label
=
"大小"
width
=
"120"
align
=
"center"
prop
=
"fileLength"
>
<
template
#
default
=
"{ row
}
"
>
<
span
v
-
if
=
"row.totalBytes > 0"
class
=
"size-info"
>
{{
formatBytes
(
row
.
downloadedBytes
)
}}
/
{{
formatBytes
(
row
.
totalBytes
)
}}
<
/span
>
<
span
v
-
else
class
=
"size-info"
>-<
/span
>
<
/template
>
<
/el-table-column> --
>
<
el
-
table
-
column
label
=
"大小"
width
=
"120"
align
=
"center"
>
<
template
#
default
=
"{ row
}
"
>
<
span
v
-
if
=
"row.status == 'pending'"
>-<
/span
>
...
...
@@ -365,10 +336,10 @@
暂停
<
/el-button> --
>
<
el
-
button
v
-
if
=
"row.status === 'paused'"
@
click
=
"resumeSingleDownload(row.id)"
type
=
"success"
<
!--
<
el
-
button
v
-
if
=
"row.status === 'paused'"
@
click
=
"resumeSingleDownload(row.id)"
type
=
"success"
size
=
"small"
>
继续
<
/el-button
>
<
/el-button>
--
>
<
el
-
button
v
-
if
=
"row.status === 'error'"
@
click
=
"startSingleDownload(row)"
type
=
"warning"
size
=
"small"
>
...
...
@@ -459,6 +430,23 @@ let columnMapping = ref({
// 状态筛选
let
statusFilter
=
ref
(
''
)
// 组件挂载时初始化
onMounted
(()
=>
{
// 先初始化下载store
downloadStore
.
initialize
()
const
userInfo
=
JSON
.
parse
(
sessionStorage
.
getItem
(
'userInfo'
)
||
'{
}
'
)
userName
.
value
=
userInfo
.
username
customSubFolder
.
value
=
userInfo
.
settings
?.
fileNamePrefix
||
''
// 从下载store中同步文件名前缀
// customSubFolder.value = downloadStore.customSubFolder || ''
detectBrowserDownloadPath
()
loadUpTableData
()
loadDetailTableData
()
}
)
// 计算是否可以解析
const
canParse
=
computed
(()
=>
{
return
selectedFile
.
value
&&
...
...
@@ -519,7 +507,7 @@ const selectExcelFile = async (fileId) => {
http.post(config.uploadBatchQueryUpload, { batchId: fileId
}
).then(res => {
if (res.code === 200) {
if (!res.data || res.data.details.length === 0) {
ElMessage.error('文件信息不存在')
ElMessage.error('文件信息不存在
或已删除
')
return
}
downloadStore.setCurrentExcelFile(fileId)
...
...
@@ -544,7 +532,7 @@ const selectExcelFile = async (fileId) => {
}
else {
previewData.value = list || []
}
customSubFolder.value = res.data.filePrefix || ''
//
customSubFolder.value = res.data.filePrefix || ''
}
else {
ElMessage.error(res.message)
}
...
...
@@ -552,30 +540,40 @@ const selectExcelFile = async (fileId) => {
}
// 删除Excel文件
const deleteExcelFile = async (fileId) => {
const deleteExcelFile = async (fileId
, uploadName
) => {
// 先尝试简单的确认
const confirmed = confirm('确定要删除这个Excel文件吗?删除后将无法恢复。')
if (!confirmed) {
return
}
try {
await downloadStore.deleteExcelFile(fileId)
ElMessage.success('Excel文件已删除')
http.post(config.uploadBatchDelete, { batchId: fileId
}
).then(res => {
if (res.code === 200) {
loadUpTableData()
loadDetailTableData()
}
else {
ElMessage.error(res.message)
// 由后端batchId获取本地localstorage中vue-downloader-excel-files中 Excel 的 id, 获取不到则只删除后端数据
const excelFiles = JSON.parse(localStorage.getItem('vue-downloader-excel-files') || '[]')
if (excelFiles) {
const excelFile = excelFiles.find(file => file.fileName === uploadName)
console.log('excelFile-->', excelFile)
if (excelFile) {
try {
await downloadStore.deleteExcelFile(excelFile.id)
uploadBatchDelete(fileId)
}
catch (error) {
console.error('删除Excel文件失败:', error)
ElMessage.error('删除Excel文件失败: ' + (error.message || '未知错误'))
}
}
)
}
catch (error) {
console.error('删除Excel文件失败:', error
)
ElMessage.error('删除Excel文件失败: ' + (error.message || '未知错误'))
}
else {
ElMessage.error('将删除后端数据, 本地缓存未找到当前数据,无法清除本地缓存数据')
uploadBatchDelete(fileId
)
}
}
}
function uploadBatchDelete(batchId) {
http.post(config.uploadBatchDelete, { batchId
}
).then(res => {
if (res.code === 200) {
loadUpTableData()
loadDetailTableData()
}
else {
ElMessage.error(res.message)
}
}
)
}
// 处理文件选择
...
...
@@ -802,23 +800,11 @@ const detectBrowserDownloadPath = () => {
// 更新文件名前缀
const updateDownloadPath = () => {
sessionStorage.setItem('cur_fileNamePrefix', customSubFolder.value)
// 更新store中的文件名前缀
downloadStore.setCustomSubFolder(customSubFolder.value)
}
// 组件挂载时初始化
onMounted(() => {
// 先初始化下载store
downloadStore.initialize()
userName.value = sessionStorage.getItem('userName') || ''
// 从下载store中同步文件名前缀
customSubFolder.value = downloadStore.customSubFolder || ''
detectBrowserDownloadPath()
loadUpTableData()
loadDetailTableData()
}
)
// 已上传 Excel 文件列表数据加载
const loadUpTableData = () => {
...
...
@@ -843,9 +829,7 @@ function loadDetailTableData() {
}
).then(res => {
if (res.code === 200) {
var list = []
var filePrefix = ''
for (const element of res.data.rows) {
filePrefix = element.filePrefix
list.push({
"id": element.detailId,
"fileName": element.fileName,
...
...
@@ -868,8 +852,6 @@ function loadDetailTableData() {
}
// console.log('--lsit:',list)
downloadStore.downloads = list
downloadStore.setCustomSubFolder(filePrefix)
customSubFolder.value = filePrefix
deTotal.value = res.data.total
loadUploadDetailTotalNum()
}
else {
...
...
@@ -891,6 +873,9 @@ function loadUploadDetailTotalNum() {
http.post(config.uploadDetailTotalNum).then(res => {
if (res.code === 200) {
totalNumObj.value.countNum = res.data.countNum
totalNumObj.value.status0 = res.data.status0
totalNumObj.value.status1 = res.data.status1
totalNumObj.value.status2 = res.data.status2
totalNumObj.value.status3 = res.data.status3
totalNumObj.value.status4 = res.data.status4
totalNumObj.value.fileLength = res.data.fileLength
...
...
@@ -919,6 +904,7 @@ function clearCompleted() {
// 清除所有
function clearAll() {
downloadStore.clearAll()
http.post(config.uploadDetailDeleteAll, {
type: 1
}
).then(res => {
...
...
@@ -936,7 +922,7 @@ function clearAll() {
function deleteRow(row) {
downloadStore.cancelDownload(row.id)
http.post(config.uploadDetailDelete, {
detailId: row.
detailI
d
detailId: row.
i
d
}
).then(res => {
if (res.code === 200) {
ElMessage.success(res.message)
...
...
@@ -978,6 +964,7 @@ const parseExcelFile = async () => {
// 获取完整数据(从原始数据或当前数据)
const allData = window.originalExcelData || rawExcelData.value
console.log('---allData:', allData)
// 过滤有效数据(分批处理)
const batchSize = 1000 // 每批处理1000行
const validData = []
...
...
@@ -995,13 +982,11 @@ const parseExcelFile = async () => {
const fileNameParts = columnMapping.value.fileNameColumns.map(col => row[col] || '').filter(part => part)
let fileName = fileNameParts.join('-')
const url = row[columnMapping.value.url]
// 从URL中提取扩展名
const extension = getFileExtensionFromUrl(url)
if (extension) {
fileName += extension
}
return fileName && url
}
)
...
...
@@ -1017,8 +1002,6 @@ const parseExcelFile = async () => {
ElMessage.warning('Excel文件中没有找到有效数据')
return
}
// 保存文件到本地之前先删除本地所有文件
downloadStore.clearAll()
// 保存Excel文件到本地存储
processingProgress.value = 30
processingMessage.value = '正在保存Excel文件到本地...'
...
...
@@ -1138,7 +1121,6 @@ function getDetailList() {
var upDetailId = ''
let detailList = reactive([])
function uploadDetails() {
detailList = getDetailList()
http.post(config.uploadBatchFileUpload, {
...
...
@@ -1307,10 +1289,11 @@ const startSingleDownload = async (row) => {
downloadStore.isSingleDownloading = true
try {
await downloadStore.startDownload(row.id)
loadDetailTableData()
loadUploadDetailTotalNum()
}
finally {
downloadStore.isSingleDownloading = false
setTimeout(() => {
loadDetailTableData()
}
, 1000);
}
}
...
...
@@ -1319,8 +1302,6 @@ const resumeSingleDownload = async (downloadId) => {
downloadStore.isSingleDownloading = true
try {
await downloadStore.resumeDownload(downloadId)
loadDetailTableData()
loadUploadDetailTotalNum()
}
finally {
downloadStore.isSingleDownloading = false
}
...
...
@@ -1524,7 +1505,10 @@ const handleLogout = async () => {
type: 'warning'
}
)
authStore.logout()
// authStore.logout()
// sessionStorage.removeItem('userName')
sessionStorage.removeItem('userInfo')
sessionStorage.removeItem('token')
ElMessage.success('已退出登录')
router.push('/login')
}
catch {
...
...
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