From b27530657b69687964580997f9ee91b3f30ee1bc Mon Sep 17 00:00:00 2001 From: chuzhongzai Date: Sun, 7 May 2023 21:18:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8D=95=E7=8B=AC=E7=9A=84?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=EF=BC=8C=E7=A7=BB=E9=99=A4=E4=BA=86=E4=BB=A5?= =?UTF-8?q?=E5=89=8D=E4=B8=80=E6=95=B4=E4=B8=AA=E7=9A=84=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E3=80=82=E5=85=81=E8=AE=B8=E6=96=B0=E5=A2=9E=E3=80=81=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=A0=87=E7=AD=BE=E3=80=82=E5=85=81=E8=AE=B8=E5=AF=B9?= =?UTF-8?q?=E6=9C=AC=E5=AD=90=E8=BF=9B=E8=A1=8C=E6=A0=87=E8=AE=B0=EF=BC=88?= =?UTF-8?q?=E4=B8=8E=E6=A0=87=E7=AD=BE=E5=85=B3=E8=81=94=EF=BC=89=E4=B8=8E?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=A0=87=E8=AE=B0=E3=80=82=E9=87=8D=E5=86=99?= =?UTF-8?q?=E4=BA=86=E6=A0=87=E7=AD=BE=E6=9F=A5=E6=89=BE=E3=80=82=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E6=89=80=E6=9C=89=E6=8E=A5=E5=8F=A3=E9=83=BD=E5=B8=A6?= =?UTF-8?q?=E6=9C=89=E6=8E=88=E6=9D=83=E7=A0=81=E3=80=82=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E6=90=9C=E7=B4=A2=E4=BB=BB=E5=8A=A1=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E3=80=82=E4=BF=AE=E5=A4=8D=E5=88=9A=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=97=B6=E7=9A=84=E4=BB=BB=E5=8A=A1=E6=9C=89?= =?UTF-8?q?=E6=A6=82=E7=8E=87=E6=B2=A1=E6=9C=89=E7=AE=80=E5=8D=95=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E7=9A=84bug=E3=80=82(=E5=90=8C=E6=AD=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DashBoard.vue | 175 ++++++++++++++++++++++-- src/components/Side.vue | 80 ++++++++--- src/store/index.js | 252 +++++++++++++++++++++++++++-------- 3 files changed, 423 insertions(+), 84 deletions(-) diff --git a/src/components/DashBoard.vue b/src/components/DashBoard.vue index 4423ac6..5bcbb55 100644 --- a/src/components/DashBoard.vue +++ b/src/components/DashBoard.vue @@ -10,12 +10,22 @@ - 参数: - + + + +
+ + {{store.state.tags.get(tid).tag}} + + +
远程查询 当前页查询 + 清空查询标签
@@ -27,6 +37,7 @@ 夜间模式
里站搜索 + 查看标签
{{thumbnailGallery.shortName}}
@@ -53,11 +64,14 @@ - 自定义标签: + 标签: + {{store.state.tags.get(tid).tag}} + + - 下载 + 清空标签 在线预览 查看封面图 @@ -133,6 +147,33 @@ + +
+ 输入关键字: + 清空 + 刷新 +
+ + + + + + + + + + + + 创建标签前先看看有没有符合的,尽量用统一一点的标签,比如已经有个图包就不要创建图集之类的了。毕竟标签多起来数据挺多的。 + + +
+

是否记住授权码 @@ -145,17 +186,19 @@ import store from "../store"; import {computed, ref, onMounted} from "vue"; import {ElMessage} from "element-plus" import axios from "axios"; +import qs from "qs"; //授权码相关 let AuthCode = ref("") let isRemember = ref(false) let isAlterAuthCode = ref(false) -let isConfigDarkMode = ref(false) -let isDark = ref(false) let newAuthCode = ref("") let tempAuthCode = ref("") let isQuerying = ref(false) +let isViewingTag = ref(false) +let isConfigDarkMode = ref(false) +let isDark = ref(false) let keyword = ref("") let galleries = ref([]) let queryPage = ref({}) @@ -164,15 +207,19 @@ let darkConfig = ref({}) //查询相关 let type = ref("link") let param = ref("") +let paramForTags = ref([]) //tidS let targetResolution = ref("") let tag = ref("") +let tagKeyWord = ref("") //查询tag的关键字 let realAuthCode = computed(() => { return store.state.AuthCode }) let chosenGallery = computed(() => { + paramForTags.value.splice(0) + param.value = '' return store.state.chosenGallery }) @@ -182,11 +229,40 @@ let loadComplete = computed(() => { let weekUsed = computed(() => { return store.state.weekUsed }) +let tags = computed(() => { + let tags = store.state.tags + let result = [] + tags.forEach((tag) => { + result.push(tag) + }) + + if(isViewingTag.value) { //正在查看标签 + if (tagKeyWord.value.trim() === '') + return result + else + return result.filter((tag) => { + return tag.tag.includes(tagKeyWord.value) + }) + } + return result +}) let thumbnailGallery = computed(() => { return store.state.thumbnailGallery }) +function pullNewTag(){ + store.dispatch("loadTags") +} + +function postTag(){ + store.dispatch("postTag", tag.value) +} + +function deleteTag(tid){ + store.dispatch("deleteTag", tid) +} + //修改授权码 function alterAuthCode(){ if(newAuthCode.value.trim() === "" || tempAuthCode.value.trim() === "" || newAuthCode.value !== tempAuthCode.value) @@ -204,7 +280,7 @@ function queryWeekUsedAmount(){ } //提交任务 function postTask(){ - if(!validateLink(param.value)){ + if(!validateLink(chosenGallery.value.link)){ ElMessage("链接错误") return } @@ -212,11 +288,11 @@ function postTask(){ ElMessage("请选择分辨率再提交") return } - let tempLink = coverLink(param.value) + let tempLink = coverLink(chosenGallery.value.link) store.dispatch("postGalleryTask", {link: tempLink, targetResolution: targetResolution.value, - tag:tag.value}) + tags:paramForTags.value}) targetResolution.value = "" } @@ -238,10 +314,89 @@ function queryLocalTask(){ store.commit("_searchLocalByKeyword", param.value) break case "tag": - store.commit("_searchLocalByTag", param.value.includes(",") ? param.value.split(","): [param.value]) + store.commit("_searchLocalByTag", paramForTags.value) break } } +let tagInput = ref({}) //用于查询 +let tagInputForSubmit = ref({}) //用于提交 +function completeQueryTag(keyWord, cb) { + if(keyWord.includes(' ')) { //查询多个标签的时候 + let temp = keyWord.split(' ') + keyWord = temp[temp.length - 1] + }else{ //只有一个标签的时候 + keyWord = param.value + } + let result = [] + let skip + let hit = false //用于检测是否有重复标签 + tags.value.forEach((tag) => { + if(tag.tag.includes(keyWord)) { + skip = false + for (let id of paramForTags.value) { //跳过已选中的标签 + if(tag.id === id){ + if(!hit && tag.tag === keyWord){ //是否命中标签 + hit = true + } + skip = true + break + } + } + if(!skip) + result.push({value: tag.tag, tid: tag.id}) + } + }) + if(result.length === 0 && chosenGallery.value.gid !== undefined && !hit){ //未命中结果并且准备与下载任务一并提交 + result.push({value: '新建 #' + keyWord + ' 标签?', tag:keyWord}) + } + cb(result) +} + +function removeQueryTag(tid){ + for (let i=0; i { + if (res.data.result === 'success') { + ElMessage('创建标签成功') + paramForTags.value.push(parseInt(res.data.tid)) + tagInputForSubmit.value.blur() + store.dispatch("loadTags", false).then() + } + else + ElMessage(res.data.data) + })}else{ + paramForTags.value.push(data.tid) + console.log(chosenGallery) + if(chosenGallery.value.gid === undefined){ + queryLocalTask() + tagInput.value.blur() + }else{ + tagInputForSubmit.value.blur() + } + } + param.value = '' +} + function resetLocalQuery(){ store.commit("_searchLocalByKeyword", "") param.value = "" diff --git a/src/components/Side.vue b/src/components/Side.vue index c698249..47786bd 100644 --- a/src/components/Side.vue +++ b/src/components/Side.vue @@ -23,7 +23,7 @@ 删除 - 编辑标签 + 编辑标签 更新 分享 @@ -95,20 +95,20 @@
- + - - 提交修改 - @@ -136,8 +136,7 @@ let isEditingPage = ref(false) let isEditingTag = ref(false) //临时变量 -let tempTag = ref("") -let tempGid = ref("") +let galleryForTag = ref({}) let category = ref("myDownload") //myDownload myCollect total let galleryNameType = ref("shortName") // shortName name @@ -192,6 +191,12 @@ let imagePadding = computed(() => { return store.state.imagePadding }) +//标签 +let tags = computed(() => { + return store.state.tags +}) +let newTag = ref("") + //翻页 function next() { if(targetPage.value < max.value) { @@ -243,16 +248,59 @@ function changeGalleryCollect(gid, isCollect){ else store.dispatch("collectGallery", gid) } -function editGalleryTag(gid, tag){ - tempTag.value = tag - tempGid.value = gid +function editGalleryTag(gallery){ + galleryForTag.value = gallery isEditingTag.value = true } -function submitGalleryTag(){ - store.dispatch("updateGalleryTag", {gid:tempGid.value, tag:tempTag.value}) - tempTag.value = '' - tempGid.value = '' - isEditingTag.value = false +let tagInput = ref() + +function querySimilarTag(keyWord, cb){ + let result = [] + let hit = false //用于检测是否有重复标签 + let skip //用于过滤已经有了的标签 + for(const [key, tag] of store.state.tags){ + skip = false + for(let id of galleryForTag.value.tags) + if(id === key) { + if(!hit && tag.tag === keyWord) //是否命中标签 + hit = true + skip = true + break + }else{ + console.log("id:", id, key) + } + if(skip) + continue + if(tag.tag.includes(keyWord)) + result.push({value: tag.tag, tag:tag}) + } + + if(keyWord.trim() !== '' && !hit && !keyWord.includes("?") && result.length === 0) + result.push({value: '新建 #' + keyWord + ' 标签?', tag:{tag:keyWord}}) + cb(result) +} + +function handleTagSelect(data){ + if(data.value.includes('#')) { + if(data.tag.tag.includes("?")) { + ElMessage("非法字符?") + return + } + else + store.dispatch("createTagAndMark", {tag: data.tag.tag.replace('#', ''), gid: galleryForTag.value.gid}) + } + else + store.dispatch("mark", {gid:galleryForTag.value.gid, tid:data.tag.id}) + newTag.value = "" + tagInput.value.blur() +} + +function mark(gid, tid){ + store.dispatch("mark", {gid, tid}) +} + +function disMark(gid, tid){ + store.dispatch("disMark", {gid, tid}) } //下载,删除,在线看 diff --git a/src/store/index.js b/src/store/index.js index b62e8cd..7679020 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -35,15 +35,17 @@ const actions = { }) }, postGalleryTask(context, data){ - axios.post(GalleryManageUrl, qs.stringify({ + axios.post(GalleryManageUrl + '?' + qs.stringify({ AuthCode: state.AuthCode, link: data.link, targetResolution: data.targetResolution, - tag: data.tag - })).then((res) => { + tags: data.tags + }, {indices:false})).then((res) => { if(res.data.result === "success") { ElMessage("提交成功") - context.commit("_setChosenGallery", {gallery: false, resolution:data.targetResolution, tag: data.tag}) + context.commit("_setChosenGallery", {gallery: false, + resolution:data.targetResolution, + tags: data.tags}) if(state.galleryRefreshTimer === 0) state.galleryRefreshTimer = setInterval(() => { context.dispatch("updateGalleryTasks", "undone").then() @@ -111,6 +113,7 @@ const actions = { if(res.data.result === 'success'){ context.commit("_authed", {AuthCode, ...JSON.parse(res.data.data)}) //初始化 + context.dispatch("loadTags", true).then() context.dispatch("loadWeekUsedAmount").then() context.dispatch("updateGalleryTasks", "all").then(() => confirmCurrentTask(context.state)) @@ -145,10 +148,85 @@ const actions = { ElMessage("查询用量失败") }) }, + loadTags(context, isShowTip){ + axios.get(GalleryManageUrl + "/allTag", { + params: { + AuthCode: state.AuthCode + } + }).then((res) => { + if(res.data.result === "success"){ + context.commit("_loadTags", JSON.parse(res.data.data)) + if(isShowTip) + ElMessage("加载标签成功") + }else + ElMessage(res.data.data) + }) + }, + postTag(context, tag){ + axios.post(GalleryManageUrl + "/tag?" + qs.stringify({ + tag, + AuthCode: state.AuthCode + }) + ).then((res) => { + if (res.data.result === 'success') { + ElMessage('创建标签成功') + context.commit("_postTag", {tag:tag, id:parseInt(res.data.tid), usage: 0}) + } + else + ElMessage(res.data.data) + }) + }, + deleteTag(context, tid){ + axios.delete(GalleryManageUrl + "/tag?" + qs.stringify({ + tid, + AuthCode: state.AuthCode + })).then((res) => { + if (res.data.result === 'success') { + ElMessage('删除标签成功') + context.commit("_deleteTag", tid) + } + else + ElMessage(res.data.data) + }) + }, + mark(context, data){ + data.AuthCode = context.state.AuthCode + axios.post(GalleryManageUrl + "/mark?" + qs.stringify(data)).then((res) => { + if(res.data.result === 'success'){ + ElMessage("标记成功") + context.commit("_mark", data) + }else{ + ElMessage(res.data.data) + } + }) + }, + disMark(context, data){ + data.AuthCode = context.state.AuthCode + axios.post(GalleryManageUrl + "/disMark?" + qs.stringify(data)).then((res) => { + if(res.data.result === 'success'){ + ElMessage("取消标记成功") + context.commit("_disMark", data) + }else { + ElMessage(res.data.data) + } + }) + }, + createTagAndMark(context, data){ + data.AuthCode = context.state.AuthCode + axios.post(GalleryManageUrl + '/tagAndMark?' + qs.stringify(data)).then((res) => { + if(res.data.result === 'success') { + ElMessage("创建标签并标记成功") + context.commit("_mark", {tid:parseInt(res.data.tid), gid: data.gid, usage: 1, tag:data.tag}) + + }else { + ElMessage(res.data.data) + } + }) + }, collectGallery(context, gid){ axios.post(GalleryManageUrl + "/collect?" +qs.stringify( { gid, - id:state.userId + AuthCode:state.AuthCode })).then((res) => { ElMessage(res.data.data) if(res.data.result === 'success') @@ -158,20 +236,13 @@ const actions = { disCollectGallery(context, gid){ axios.post(GalleryManageUrl + "/disCollect?" + qs.stringify({ gid, - id:state.userId + AuthCode:state.AuthCode })).then((res) => { ElMessage(res.data.data) if(res.data.result === 'success') context.commit("_disCollectGallery", gid) }) }, - updateGalleryTag(context, data){ - axios.post(GalleryManageUrl + "/tag?" + qs.stringify(data)).then((res) => { - ElMessage(res.data.data) - if(res.data.result === 'success') - context.commit("_updateGalleryTag", data) - }) - }, deleteGallery(context, gid){ axios.delete(GalleryManageUrl, { params:{ @@ -222,14 +293,6 @@ const mutations = { state.collectGallery[index].isCollect = false state.collectGallery.splice(index, 1) }, - _updateGalleryTag(state, data){ - for(let i=0; i < state.totalGalleryTask.length; i++){ - if(state.totalGalleryTask[i].gid === data.gid){ - state.totalGalleryTask[i].tag = data.tag - break - } - } - }, _updateGalleryTasks(state, data){ let {tasks, type} = data if(type === 'all') { @@ -261,25 +324,23 @@ const mutations = { task.createTimeDisplay = new Date(task.createTime * 1000).toLocaleString("zh") //处理标签 - if (!'tag' in task) { - task.tag = "" + if ('tags' in task) { + task.tag = '' + task.tags.forEach((tid) => { + task.tag += ' ' + state.tags.get(tid).tag + }) + task.tag = task.tag.trim() + + }else{ + task.tag = "" + task.tags = [] } //处理是否收藏 - if('collector' in task){ - let collector = task.collector.split(",") - delete task.collector - for(let i=0; i { + if(gallery.gid === data.gid){ + gallery.tags.push(data.tid) + if('tag' in data) //新建的tag + state.tags.set(data.tid, {id:data.tid, tag: data.tag, usage:data.usage}) + else + state.tags.get(data.tid).usage++ + generateNewTag(state, gallery) + } + }) + }, + _disMark(state, data){ + state.totalGalleryTask.forEach((gallery) => { + if(gallery.gid === data.gid){ + let index + for(index=0; index 0) { tasks.forEach((task) => { - if('tag' in task) { + if(tidS.length <= task.tags.length) { + hitAmount = 0 - tags.forEach((tag) => { - if (task.tag.includes(tag)) - hitAmount++ - }) - if (hitAmount === tagAmount) + for(let i=0; i 0){ + for (let tag of data.tags) { + state.chosenGallery.tags.push(parseInt(tag)) + } + } + generateNewTag(state, state.chosenGallery) state.totalGalleryTask.push(state.chosenGallery) state.downloadGallery.push(state.chosenGallery) } @@ -489,6 +606,8 @@ const state = { thumbnailGallery: {}, //缩略图链接 collectGallery: [], //收藏的本子 downloadGallery: [], //下载的本子 + tags: new Map(), //可用tag + isSearch: false, //用于决定是否显示搜索结果 onlineLinks: {}, //在线本子链接 isOnlineReading: false, //是否在线看 @@ -519,14 +638,21 @@ const state = { const getters = { currentTasks(state){ - return state.currentTasks.slice((state.page-1)*state.length, state.page*state.length) + if(state.isSearch) + return state.searchTask.slice((state.page - 1) * state.length, state.page * state.length) + else + return state.currentTasks.slice((state.page - 1) * state.length, state.page * state.length) }, min(){ return 1 }, max(state){ let max = 0 - let tasks = state.currentTasks + let tasks + if(state.isSearch) + tasks = state.searchTask + else + tasks = state.currentTasks if(!tasks) return 1 @@ -618,6 +744,16 @@ function deleteTask(tasks, key, value){ for(let i=0; i { + tag += state.tags.get(tid).tag + ' ' + }) + gallery.tag = tag.trim() } \ No newline at end of file