From 8a63418dabd4e05917eb6379fa7d2e4fcbe77be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 15 Mar 2023 20:26:43 +0800 Subject: [PATCH] finish del of filelist --- frontend/vben/mock/page/filelist.ts | 23 ++++- frontend/vben/src/api/page/index.ts | 12 ++- .../vben/src/api/page/model/fileListModel.ts | 4 + .../vben/src/views/page/filelist/data.tsx | 86 +++++++++++++++---- .../vben/src/views/page/filelist/index.vue | 48 ++++------- 5 files changed, 125 insertions(+), 48 deletions(-) diff --git a/frontend/vben/mock/page/filelist.ts b/frontend/vben/mock/page/filelist.ts index bbaf4ff..24973b9 100644 --- a/frontend/vben/mock/page/filelist.ts +++ b/frontend/vben/mock/page/filelist.ts @@ -1,9 +1,13 @@ +import { randomInt } from 'crypto' import { MockMethod } from 'vite-plugin-mock' import { resultError, resultSuccess, getRequestToken, requestParams } from '../_util' -export function createFileList() { +const deletedIDs: number[] = [] + +function createFileList() { const lst: any[] = [] for (let i = 100; i > 0; i--) { + if (deletedIDs.includes(i)) continue lst.push({ id: i, title: '接入网2020B卷', @@ -12,7 +16,7 @@ export function createFileList() { questions: 10, author: '课程组长', datetime: '2020-11-26 17:39', - percent: i - 1, + percent: randomInt(0, 100) + 1, }) } return lst @@ -50,4 +54,19 @@ export default [ }) }, }, + { + url: '/basic-api/delFile', + timeout: 200, + method: 'get', + response: (request: requestParams) => { + const token = getRequestToken(request) + if (!token) return resultError('Invalid token') + const id = Number(request.query.id) + if (!id || id < 0) return resultError('Invalid id') + deletedIDs.push(id) + return resultSuccess({ + msg: '已成功删除文件' + id + '.', + }) + }, + }, ] as MockMethod[] diff --git a/frontend/vben/src/api/page/index.ts b/frontend/vben/src/api/page/index.ts index 90d0ba1..8c47866 100644 --- a/frontend/vben/src/api/page/index.ts +++ b/frontend/vben/src/api/page/index.ts @@ -1,9 +1,10 @@ import { defHttp } from '/@/utils/http/axios' -import { getFileListModel, FilePercent } from './model/fileListModel' +import { getFileListModel, FilePercent, DelFile } from './model/fileListModel' enum Api { GetFileList = '/getFileList', GetFilePercent = '/getFilePercent', + DelFile = '/delFile', } /** @@ -14,8 +15,15 @@ export const getFileList = (count?: number) => { } /** - * @description: Get file percant + * @description: Get file percent */ export const getFilePercent = (id: number) => { return defHttp.get({ url: Api.GetFilePercent, params: { id: id } }) } + +/** + * @description: Get file percant + */ +export const delFile = (id: number) => { + return defHttp.get({ url: Api.DelFile, params: { id: id } }) +} diff --git a/frontend/vben/src/api/page/model/fileListModel.ts b/frontend/vben/src/api/page/model/fileListModel.ts index c63bc37..91b756c 100644 --- a/frontend/vben/src/api/page/model/fileListModel.ts +++ b/frontend/vben/src/api/page/model/fileListModel.ts @@ -17,3 +17,7 @@ export type getFileListModel = FileListGroupItem[] export interface FilePercent { percent: number } + +export interface DelFile { + msg: string +} diff --git a/frontend/vben/src/views/page/filelist/data.tsx b/frontend/vben/src/views/page/filelist/data.tsx index 23f8933..250a232 100644 --- a/frontend/vben/src/views/page/filelist/data.tsx +++ b/frontend/vben/src/views/page/filelist/data.tsx @@ -1,6 +1,9 @@ +import { reactive } from 'vue' import { getFileList, getFilePercent } from '/@/api/page' import { getFileListModel } from '/@/api/page/model/fileListModel' +const random = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1) + min) + function refreshFilePercent(arr: any[], i: number) { return async () => { const p = await getFilePercent(arr[i].id) @@ -11,13 +14,28 @@ function refreshFilePercent(arr: any[], i: number) { } } -export const { cardList, totalSize, totalQuestions } = await (async () => { - const cardList: any[] = [] +export function getListOfPage(pageSize: number, page: number): any[] { + const i = page - 1 + let lst: any[] = [] + if (i < cardList._cardList.length / pageSize) + lst = reactive(cardList._cardList.slice(i * pageSize, page * pageSize)) + else lst = reactive(cardList._cardList.slice((cardList._cardList.length / pageSize) * pageSize)) + for (let i = 0; i < lst.length; i++) { + if (!lst[i].hassettimeout && lst[i].percent > 0 && lst[i].percent < 100) { + setTimeout(refreshFilePercent(lst, i), 1000 + random(0, 1000)) + lst[i].hassettimeout = true + } + } + return lst +} + +async function refreshFileList() { + const __cardList: any[] = [] const lst = (await getFileList()) as getFileListModel - let totalSize = 0 - let totalQuestions = 0 - for (let i = 0; i < 100; i++) { - cardList.push({ + let __totalSize = 0 + let __totalQuestions = 0 + for (let i = 0; i < lst.length; i++) { + __cardList.push({ id: lst[i].id, title: lst[i].title, description: lst[i].description, @@ -28,16 +46,54 @@ export const { cardList, totalSize, totalQuestions } = await (async () => { color: '#1890ff', author: lst[i].author, percent: lst[i].percent, + hassettimeout: false, }) - if (cardList[i].percent < 100) { - setTimeout(refreshFilePercent(cardList, i), 10000) - } - totalSize += lst[i].size - totalQuestions += lst[i].questions + __totalSize += lst[i].size + __totalQuestions += lst[i].questions } return { - cardList, - totalSize, - totalQuestions, + _cardList: __cardList, + _totalSize: __totalSize, + _totalQuestions: __totalQuestions, } -})() +} + +export let cardList = reactive(await refreshFileList()) + +export let pagination = reactive({ + current: 1, + total: cardList._cardList.length, + show: true, + pageSize: 10, + onChange: function (page: number, pageSize: number) { + this.current = page + this.pageSize = pageSize + }, +}) + +export function refreshCardList() { + refreshFileList().then((value) => { + cardList = reactive(value) + pagination = reactive({ + current: 1, + total: cardList._cardList.length, + show: true, + pageSize: 10, + onChange: function (page: number, pageSize: number) { + this.current = page + this.pageSize = pageSize + }, + }) + }) +} + +export function deleteFileByID(id: number) { + cardList._cardList.map((value: any, index: number) => { + if (value.id == id) { + cardList._cardList.splice(index, 1) + cardList._totalSize -= value.size + cardList._totalQuestions -= value.questions + pagination.total = cardList._cardList.length + } + }) +} diff --git a/frontend/vben/src/views/page/filelist/index.vue b/frontend/vben/src/views/page/filelist/index.vue index 8ad9270..3df8860 100644 --- a/frontend/vben/src/views/page/filelist/index.vue +++ b/frontend/vben/src/views/page/filelist/index.vue @@ -18,11 +18,11 @@
占用空间
-

{{ totalSize }}MB

+

{{ cardList._totalSize }}MB

总题目数
-

{{ totalQuestions }}

+

{{ cardList._totalQuestions }}

@@ -30,7 +30,7 @@