From 8c8945ae88b8f81674ae4585daadf6dec4405a26 Mon Sep 17 00:00:00 2001 From: chuzhongzai Date: Sun, 7 May 2023 21:18:25 +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 | 179 +++++++++++++++++++++++++-- src/components/Side.vue | 80 +++++++++--- src/store/index.js | 234 ++++++++++++++++++++++++++++------- 3 files changed, 422 insertions(+), 71 deletions(-) diff --git a/src/components/DashBoard.vue b/src/components/DashBoard.vue index e966bb6..992f5d6 100644 --- a/src/components/DashBoard.vue +++ b/src/components/DashBoard.vue @@ -10,24 +10,35 @@
- 参数: - + + + +
+ + {{store.state.tags.get(tid).tag}} + + +
远程查询 当前页查询 + 清空查询标签
打开面板 - 里站搜索

+ 里站搜索 修改授权码 删除本地授权码 - 夜间模式配置 + 夜间模式配置
夜间模式 夜间模式
里站搜索 + 查看标签
@@ -54,10 +65,14 @@ - 自定义标签: + 标签: + {{store.state.tags.get(tid).tag}} + + 下载 + 清空标签 在线预览 查看封面图 @@ -134,6 +149,33 @@ + +
+ 输入关键字:
+ 重置关键字 + 刷新 +
+ + + + + + + + + + + + 创建标签前先看看有没有符合的,尽量用统一一点的标签,比如已经有个图包就不要创建图集之类的了。毕竟标签多起来数据挺多的。 + + +
+
@@ -153,12 +195,13 @@ import axios from "axios"; 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("furry yaoi") let galleries = ref([]) let queryPage = ref({}) @@ -167,15 +210,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 }) @@ -186,11 +233,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) @@ -209,7 +285,7 @@ function queryWeekUsedAmount(){ } function postTask(){ - if(!validateLink(param.value)){ + if(!validateLink(chosenGallery.value.link)){ ElMessage("链接错误") return } @@ -217,8 +293,10 @@ function postTask(){ ElMessage("请选择分辨率再提交") return } - let tempLink = coverLink(param.value) - store.dispatch("postGalleryTask", {link: tempLink, targetResolution: targetResolution.value, tag:tag.value}) + let tempLink = coverLink(chosenGallery.value.link) + store.dispatch("postGalleryTask", {link: tempLink, + targetResolution: targetResolution.value, + tags:tag.value}) targetResolution.value = "" } @@ -240,10 +318,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", "") store.commit("_searchLocalByTag", ['']) diff --git a/src/components/Side.vue b/src/components/Side.vue index 2066612..bb5b4e6 100644 --- a/src/components/Side.vue +++ b/src/components/Side.vue @@ -24,7 +24,7 @@ {{props.row.isCollect ? '取消收藏' : '收藏'}} 在线看 预览封面
- 编辑标签 + 编辑标签 更新本子 @@ -88,20 +88,20 @@
- + - - 提交修改 - @@ -126,8 +126,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 @@ -150,6 +149,12 @@ let isOpenHistoryPanel = computed(() => { let isOnlineReading = computed(() => { return store.state.isOnlineReading }) +//标签 +let tags = computed(() => { + return store.state.tags +}) +let newTag = ref("") + let min = computed(() => { return store.getters.min @@ -228,16 +233,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 c65eebd..a9775b7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -39,13 +39,13 @@ const actions = { 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}) + tags: data.tags}) if(state.galleryRefreshTimer === 0) state.galleryRefreshTimer = setInterval(() => { context.dispatch("updateGalleryTasks", "undone").then() @@ -113,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)) @@ -135,10 +136,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') @@ -149,7 +225,7 @@ const actions = { axios.post(GalleryManageUrl + "/disCollect?" + qs.stringify( { gid, - id:state.userId + AuthCode:state.AuthCode })).then((res) => { ElMessage(res.data.data) if(res.data.result === 'success') @@ -213,14 +289,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') { @@ -252,25 +320,23 @@ const mutations = { task.createTimeDisplay = new Date(task.createTime * 1000).toLocaleString("zh") //处理标签 - if (!'tag' in task) { + 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.chosenGallery.downloader = state.userId state.totalGalleryTask.push(state.chosenGallery) state.downloadGallery.push(state.chosenGallery) @@ -483,6 +610,8 @@ const state = { thumbnailGallery: {}, //预览本子 collectGallery: [], //收藏的本子 downloadGallery: [], //下载的本子 + tags: new Map(), //可用tag + isSearch: false, //用于决定是否显示搜索结果 onlineLinks: {}, //在线本子链接 isOnlineReading: false, //是否在线看 @@ -512,14 +641,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 @@ -613,4 +749,14 @@ function deleteTask(tasks, key, value){ tasks[j].splice(i, 1) break } +} + +function generateNewTag(state, gallery){ + let tag = '' + console.log(state.tags) + console.log(gallery.tags) + gallery.tags.forEach((tid) => { + tag += state.tags.get(tid).tag + ' ' + }) + gallery.tag = tag.trim() } \ No newline at end of file