移动端下载器改版:重构为底部三标签的信息架构

- 以 TabBar + 三个视图(任务/搜索/设置)替换原有 DashBoard/Side/HentaiSearch 单页结构
- 拆分 TaskView / TaskRow / TaskDetailSheet / SearchView / SettingsView / AuthScreen
- 统一 theme.css 视觉规范,补 AppIcon 与缩略图工具 thumbnail.js 及其单测
- 提交弹层默认选中最高可用分辨率,缩略图加载失败走占位
- E站搜索结果与远端抽屉补回「在线看」入口
This commit is contained in:
2026-09-20 18:41:00 +08:00
parent 169925c197
commit abb1cdb952
16 changed files with 2112 additions and 883 deletions
+44 -3
View File
@@ -311,6 +311,16 @@ const mutations = {
_changePage(state, targetPage){
state.page = targetPage
},
_setActiveTab(state, tab){
state.activeTab = tab
},
_setDetailGallery(state, gallery){
state.detailGallery = gallery
},
// The mobile list grows in place instead of paging through a footer control.
_showMoreTasks(state){
state.visiblePages += 1
},
_authed(state, data){
state.AuthCode = data.AuthCode
state.userId = data.userId
@@ -329,12 +339,14 @@ const mutations = {
_searchLocalByLink(state, link){
let tasks = state.currentTasks
let gid = link.split("/")[4]
let matched = null
let name = null
if(gid === undefined)
for (let i = 0; i < tasks.length; i++) {
if (tasks[i].link === link) {
state.page = Math.floor(i / state.length) + 1
matched = tasks[i]
name = tasks[i].name
break
}
@@ -342,19 +354,27 @@ const mutations = {
else for (let i = 0; i < tasks.length; i++)
if (String(tasks[i].gid) === gid) {
state.page = Math.floor(i / state.length) + 1
matched = tasks[i]
name = state.sortType === "shortName" ? tasks[i].shortName: tasks[i].name
break
}
if(!name)
ElMessage("未找到此任务")
else
else {
state.searchTask.splice(0)
if(matched)
state.searchTask.push(matched)
state.isSearch = true
state.visiblePages = 1
ElMessage("已跳转到该任务所在页数,任务名:" + name)
}
},
_searchLocalByKeyword(state, keyword){
state.searchTask.splice(0)
if(keyword.trim() !== '') {
state.page = 1
state.visiblePages = 1
let tasks = state.currentTasks
tasks.forEach((task) => {
if (task.name.includes(keyword))
@@ -381,11 +401,13 @@ const mutations = {
},
_setCategory(state, category){
state.category = category
state.visiblePages = 1
confirmCurrentTask(state)
sortTasks(state)
},
_setSortType(state, sortType){
state.sortType = sortType
state.visiblePages = 1
sortTasks(state)
},
_setGalleryNameType(state, galleryNameType){
@@ -451,6 +473,9 @@ const state = {
isInclude: false, //是否搜索到任务
searchTask: [], //搜索到的任务
isShowHistory: false, //是否打开面板
activeTab: 'tasks', //移动端底部标签 tasks search settings
detailGallery: null, //详情抽屉里正在看的任务
visiblePages: 1, //列表已展开的页数,用于“继续加载”
galleryNameType: 'shortName', //名字类型 shortName name
category: 'myDownload', //分类 myDownload myCollect total
sortType:'shortName', //排序类型 shortName name createTime
@@ -468,6 +493,18 @@ const getters = {
min(){
return 1
},
visibleTasks(state){
return (state.currentTasks || []).slice(0, state.visiblePages * state.length)
},
taskTotal(state){
return (state.currentTasks || []).length
},
taskRemaining(state, getters){
return Math.max(0, getters.taskTotal - state.visiblePages * state.length)
},
searchResults(state){
return (state.searchTask || []).slice(0, state.visiblePages * state.length)
},
max(state){
let max = 0
let tasks
@@ -500,8 +537,12 @@ function getShortname(name){
if (!name.includes("[")) return name
// 截取最后一个 [ 之前的部分,然后移除所有 [...] 和 (...) 标签
name = name.substring(0, name.lastIndexOf("["))
return name.replace(/\s*\[[^\]]*\]\s*/g, '').replace(/\s*\([^\)]*\)\s*/g, '').trim()
const trimmed = name.substring(0, name.lastIndexOf("["))
.replace(/\s*\[[^\]]*\]\s*/g, '')
.replace(/\s*\([^\)]*\)\s*/g, '')
.trim()
// 名字以 [...] 开头时截取结果为空,退回原名避免整列空白
return trimmed === '' ? name.trim() : trimmed
}
function buildGalleryDownloadUrl(gid, AuthCode){