图床项目进度(三)——文件展示页

news2025/1/24 14:35:56

前言

该项目作为一个类网盘项目,主要包括上传下载,引用,预览等功能。
在这里插入图片描述

大致功能:

  1. 图片预览
    在这里插入图片描述

这里的图片预览我使用的一个插件
const state: any = reactive({

  image: 'https://pic35.photophoto.cn/20150511/0034034892281415_b.jpg',
  index: 0
});

const previewEvent = () => {
  preview({
    images: state.image
  });
};
  1. 上传图片
    在这里插入图片描述
<el-button type="primary" size="small" @click="dialogVisible = true" :icon=Upload>上传图片</el-button>
  1. 几个自定义标签
    在这里插入图片描述
<el-table-column>
<!--        几个自定义图标-->
        <template v-slot="{row}">
          <div v-if="isPicture(row)" >
            <el-button  type="primary" round size="small" style="margin-right: 50px" @click="previewEvent">预览</el-button>
            <el-tooltip class="item" effect="dark" content="引用" placement="bottom-start">
            <el-button type="text">
              <el-icon>
                <Link/>
              </el-icon>
            </el-button>
           </el-tooltip>
          <el-tooltip class="item" effect="dark" content="下载" placement="bottom-start">
            <el-button type="text">
              <el-icon>
                <Download/>
              </el-icon>
            </el-button>
          </el-tooltip>
          <el-tooltip class="item" effect="dark" content="删除" placement="bottom-start" >
            <el-button type="text"><el-button type="text">
              <el-icon>
                <Delete/>
              </el-icon>
            </el-button></el-button>
          </el-tooltip>
          </div>
        </template>
      </el-table-column>
  1. 文件展示
    在这里插入图片描述

vue组件源码:

<template>
  <div>
    <div class="bt">
      <el-button type="text" size="medium" @click="back" v-if="path.length >= 1">
        <el-icon>
          <ArrowLeft/>
        </el-icon>
        返回上一级
      </el-button>
      <el-button type="primary" size="small" @click="dialogVisible = true" :icon=Upload>上传图片</el-button>
      <el-button size="small"  @click="addFolder = true">
        新建文件夹
      </el-button>
      <el-dialog
          title="输入文件名字"
          v-model="addFolder"
          width="20%"
      >
        <el-input v-model="input" placeholder="请输入内容" :input-style="{}"></el-input>
        <span slot="footer" class="dialog-footer">
            <el-button @click="addFolder = false">取 消</el-button>
            <el-button type="primary" @click="newfolder">确 定</el-button>
        </span>
      </el-dialog>
      <el-dialog
          title="上传"
          v-model="dialogVisible"
          width="30%"
          :before-close="handleClose">
        <el-upload
            class="upload-demo"
            drag
            action="upload"
            :before-upload="beforeUpload"
            multiple

            v-loading="loading"
            element-loading-text="正在上传"
        >
          <el-icon :size="20">
            <Upload />
          </el-icon>
          <div class="el-upload__text">将图片拖到此处,或<em>点击上传</em></div>
          <div class="el-upload__tip" slot="tip"></div>
        </el-upload>
        <span slot="footer" class="dialog-footer">
  </span>
      </el-dialog>
      <div id="search">
        <input placeholder="请输入内容" class="search" v-model="keywords" />
        <el-icon v-if="keywords > 0" style="margin-right: 10px">
          <Close @click="backSearch" />
        </el-icon>

        <el-icon >
          <Search/>
        </el-icon>

      </div>
    </div>
    <el-table :data="filteredTableData" :height="height">
      <el-table-column prop="name" label="文件名" width="600px">
        <template v-slot="{row}">
          <img :src="thumbnail(row)" class="img-mini"/>
          <a href="javascript:void(0)" class="fileName" @click="next(row)">{{ row.name }}</a>
        </template>
      </el-table-column>
      <el-table-column>
<!--        几个自定义图标-->
        <template v-slot="{row}">
          <div v-if="isPicture(row)" >
            <el-button  type="primary" round size="small" style="margin-right: 50px" @click="previewEvent">预览</el-button>
            <el-tooltip class="item" effect="dark" content="引用" placement="bottom-start">
            <el-button type="text">
              <el-icon>
                <Link/>
              </el-icon>
            </el-button>
           </el-tooltip>
          <el-tooltip class="item" effect="dark" content="下载" placement="bottom-start">
            <el-button type="text">
              <el-icon>
                <Download/>
              </el-icon>
            </el-button>
          </el-tooltip>
          <el-tooltip class="item" effect="dark" content="删除" placement="bottom-start" >
            <el-button type="text"><el-button type="text">
              <el-icon>
                <Delete/>
              </el-icon>
            </el-button></el-button>
          </el-tooltip>
          </div>
        </template>
      </el-table-column>
      <el-table-column prop="size" label="大小" width="270"></el-table-column>
      <el-table-column prop="time" label="修改日期" width="220"></el-table-column>
    </el-table>
  </div>
</template>

<script lang="ts" setup>
import {Upload, Search, Download, Delete, Link, ArrowLeft, Close} from "@element-plus/icons-vue";
import {computed, reactive, ref} from "vue";
import {preview, vPreview, Vue3ImagePreview} from 'vue3-image-preview';
const  height =  window.innerHeight - 62 - 80 - 40;
let keywords = ref('');
//当前文件夹目录
let path =  ref([]);
const next = (row) => {
  tableData.value = newTableData;
  path.value.push(row.name);
  console.log(path)

}
const back = () => {
  tableData.value.unshift(
      { name: '文件夹', img: 'image2.jpg', size: '-', time: '2023-08-20' },
  )
  path.value.pop();
  console.log(path);
}
function search(){
  return [];
}
const backSearch = () =>{
  console.log("执行了backSearch")
  keywords.value = '';
}

const filteredTableData = computed(() => {
  if (!keywords.value) {
    return tableData.value;
  }
  const lowerKeywords = keywords.value.toLowerCase();
  return tableData.value.filter(item => item.name.toLowerCase().includes(lowerKeywords));
});
const addFolder = ref(false);
const input = ref();
const  dialogVisible = ref(false);

//核心图片数据区
const tableData = ref([
  { name: '文件夹', img: 'image2.jpg', size: '-', time: '2023-08-20' },
  { name: "文件1", img: 'image1.jpg', size: '1MB', time: '2023-08-21' },
  { name: '文件2', img: 'image2.jpg', size: '500KB', time: '2023-08-20' },

  // ...
]);
const newTableData = [
  { name: "文件1", img: 'image1.jpg', size: '1MB', time: '2023-08-21' },
  { name: '文件2', img: 'image2.jpg', size: '500KB', time: '2023-08-20' },
]
//是否是图片
const isPicture = (row: { size: string | any[]; }) => {
  return row.size.length > 1;
}
//获取缩略图
const thumbnail = (row: { size: string | any[]; }) => {
  if(row.size.length > 1){
    return  "../src/static/img/picture.svg";
  }else{
    return "../src/static/img/folder.svg";
  }
}
//打开预览框
const state: any = reactive<any>({
  image: 'https://pic35.photophoto.cn/20150511/0034034892281415_b.jpg',
  index: 0
});

const previewEvent = () => {
  preview({
    images: state.image
  });
};

</script>



<style lang="less" scoped>

.bt {
  max-width: 100%;
  background-color: white;
  height: 40px;
  font: 12px/1.5 "Microsoft YaHei", arial, SimSun, "宋体";
  line-height: 30px;
}
.nav{
  max-width: 100%;
  background-color: white;
  height: 20px;
  /*font: 12px/1.5 "Microsoft YaHei", arial, SimSun, "宋体";*/
  font-size: 8px;
  line-height: 20px;
}

.el-table-column {
  max-height: 48px;
  line-height: 48px;
}

.el-table {
  max-width: 100%;
  font: 12px/1.5 "Microsoft YaHei", arial, SimSun, "宋体";
}

#search {
  width: 315px;
  border-radius: 33px;
  background-color: #f7f7f7;
  float: right;
  text-align: center;
  height: 32px;
  line-height: 32px;
  input{
     outline: none;

  }

}

.search {
  border: none;
  background-color: #f7f7f7;
  height: 30px;
  width: 248px;
}

img {
  width: 30px;
  height: 30px;
}

a {
  color: #424e67;
  text-decoration: none;
}

a:hover {
  color: #09AAFF;
}
.el-icon-delete{
  color:#F56C6C;
}
.dialog-footer{
  display: flex;
  justify-content: space-between;

}
span{
  margin-top: 5%;
}
.img-mini{
  display: inline-block;
  vertical-align: middle
}
.fileName{
  margin-left: 5px;
}
.custom-icon{

}

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

悲观锁和乐观锁、缓存

悲观锁&#xff1a; 悲观锁的实现通常依赖于数据库提供的机制&#xff0c;在整个处理的过程中数据处于锁定状态&#xff0c;session的load方法有一个重载方法&#xff0c;该重载方法的第三个参数可以设置锁模式&#xff0c;load(object.class , int id,LockMode.?)&#xff0…

deepin 如何卸载软件

文章目录 卸载软件&#xff08;正文&#xff09; 通常来讲在官方的应用商场卸载即可。 但是呢&#xff1f; 很不幸的是&#xff0c;没能够彻底删除软件。还是能够在启动器界面上看到应用。 这时候&#xff0c;你右键卸载&#xff0c;会提示“卸载失败”。如下图&#xff1a; …

VirtualBox RockyLinux9 网络连接

有几次都是隔一段时间之后启动虚拟机&#xff0c;用第三方ssh工具就连接不上了。 简单记录一下。 1、VirtualBox设置 2、IP设置 cd /etc/NetworkManager/system-connections/ vim enp0s3.nmconnection[connection] idenp0s3 uuid9c404b41-4636-397c-8feb-5c2ed38ef404 typeet…

windows nvm 安装 以及常用的命令

1 nvm 下载 链接&#xff1a;https://github.com/coreybutler/nvm-windows/releases 可下载以下版本&#xff1a; nvm-noinstall.zip&#xff1a;绿色免安装版&#xff0c;但使用时需要进行配置。 nvm-setup.zip&#xff1a;安装版&#xff0c;推荐使用 2 安装&#xff08…

python-38-python定时任务框架

Python定时任务 Python任务调度模块 – APScheduler python调度框架APScheduler使用详解 APScheduler动态增、删、改任务 apscheduler mysql 持久化任务 APScheduler调度框架 在项目中&#xff0c;我们可能遇到有定时任务的需求。 其一&#xff1a;定时执行任务。例如每天早上 …

为什么要学习源码之Java篇

为什么学习源码 大厂面试必问。二次开发。提升代码阅读能力&#xff0c;更能输出优质代码。提升技术功底。拥抱开源社区。快速定位线上问题。 学习源码的方式 首先最重要的是学会使用。具有全局观。先对大致有个细节的了解&#xff0c;一开始不要太关注于细节。学会看注释&a…

【计算机网络】TCP传输控制协议——三次握手

文章目录 握手的流程常考考点 握手的流程 一开始&#xff0c;客户端和服务端都处于CLOSE状态&#xff0c;先是服务端监听某个端口&#xff0c;处于LISTEN状态。然后客户端主动发起连接SYN&#xff0c;之后处于SYN-SEND状态。服务端收到发起的连接&#xff0c;返回SYN&#xff0…

Spring Data Commons远程命令执行漏洞复现(CVE-2018-1273)

一、漏洞说明 Spring Data是一个用于简化数据库访问&#xff0c;并支持云服务的开源框架,包含Commons、Gemfire、JPA、JDBC、MongoDB等模块。此漏洞产生于Spring Data Commons组件&#xff0c;该组件为提供共享的基础框架&#xff0c;适合各个子项目使用&#xff0c;支持跨数据…

快速学会git版本管理——创建分支和合并分支

首先创建分支 git创建分支只需要使用switch 命令&#xff1a; git switch -c 分支名 创建分支并切换到该分支 大家看后面的括号里已经变成了dev 说明我们切换成功了。 然后想要合并分支就在 创建的分支中 进行提交修改的内容&#xff0c;还是通过&#xff1a;add 命令和co…

EasyExcel入门(最简单的读)

官网&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) 因为暂时项目没有用到&#xff0c;所以不急&#xff0c;知道了这个技术。就想着学着用一下&#xff01; 最简单的读 先看官方文档给的用法和解释&#xff01;&#xff01;&#xff01…

开开心心带你学习MySQL数据库之第八篇

索引和事务 ~~ 数据库运行的原理知识 面试题 索引 索引(index) > 目录 索引存在的意义,就是为了加快查找速度!!(省略了遍历的过程) 查找速度是快了&#xff0c;但是付出了一定的代价!! 1.需要付出额外的空间代价来保存索引数据 2.索引可能会拖慢新增,删除,修改的速度 ~~ …

信息系统项目管理师(第四版)教材精读思维导图-第十四章项目沟通管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图XMind源文件 14.1 管理基础 14.2 管理过程 14.3 规划沟通管理 14.4 管理沟通 14.…

机器学习:使用PCA简化数据

文章目录 使用场景主成分分析&#xff08;Principal component analysis&#xff09;实验&#xff1a;对半导体数据&#xff08;590个特征&#xff09;进行降维处理 使用场景 我们通过电视看实况足球&#xff0c;电视显示屏有100万个像素点&#xff0c;球所占的点数为100个。人…

Collectors类作用:

一、Collectors类&#xff1a; 1.1、Collectors介绍 Collectors类&#xff0c;是JDK1.8开始提供的一个的工具类&#xff0c;它专门用于对Stream操作流中的元素各种处理操作&#xff0c;Collectors类中提供了一些常用的方法&#xff0c;例如&#xff1a;toList()、toSet()、to…

真的有线上兼职吗?推荐几个靠谱的线上兼职!

在这个互联网普及&#xff0c;信息爆炸的时代&#xff0c;线上赚钱已经成为一个热门的话题。每个人都想通过互联网赚钱&#xff0c;有些人得到钱&#xff0c;给普通人机会&#xff0c;给骗子一些机会&#xff0c;世界是两面&#xff0c;线上兼职赚钱的方式&#xff01;有好有坏…

python中的继承

要理解继承首先要有父类和子类的概念&#xff0c;可以理解成子类从父类中继承父类的属性和方法 创建父类 class Pet:def __init__(self,name,age):self.name nameself.age agedef jump(self):print(self.name"在跳")创建子类 class Cat(Pet):pass mycatCat(&quo…

HTML的有序列表、无序列表、自定义列表

目录 背景: 过程: 无序列表: 简介: 代码展示: 效果展示:​ 无序列表: 简介: 效果展示:​ 自定义列表: 简介&#xff1a; 效果展示: 总结&#xff1a; 背景: 1.有序列表&#xff08;Ordered List&#xff09;&#xff1a; 有序列表是最早的列表类型之一&#xff…

编译器02-词法分析

一&#xff1a;简述 词法分析含义&#xff1a;为了翻译语言&#xff0c;编译器把程序各种成分拆开&#xff0c;那如何拆&#xff0c;首先第一步就是将输入分解成一个个独立的单词(token)&#xff0c;这一过程叫词法分析。 二&#xff1a;单词(token)分为哪些种类 保留字…

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

MAC M1芯片安装mounty读写移动硬盘中的文件

因为移动硬盘中的文件是微软公司NTFS格式&#xff0c;MAC只支持自己的APFS或者HFS&#xff0c;与微软的NTFS不兼容&#xff0c;所以需要第三方的软件来支持读写硬盘中的文件&#xff0c;经过一上午的折腾&#xff0c;最终选择安装mounty这个免费的第三方软件 工具网址连接&am…