国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue3后臺(tái)管理系統(tǒng)(十)文件上傳

這篇具有很好參考價(jià)值的文章主要介紹了Vue3后臺(tái)管理系統(tǒng)(十)文件上傳。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、文件上傳api?

二、封裝組件

三、使用案例


一、文件上傳api?

在src/api下新建file文件夾,并在file文件夾下新建index.ts和types.ts

// src/api/file/types.ts
/**
 * 文件API類(lèi)型聲明
 */
export interface FileInfo {
  name: string;
  url: string;
}
// src/api/file/index.ts
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { FileInfo } from './types';

/**
 * 上傳文件
 *
 * @param file
 */
export function uploadFileApi(file: File): AxiosPromise<FileInfo> {
  const formData = new FormData();
  formData.append('file', file);
  return request({
    url: '/api/v1/files',
    method: 'post',
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  });
}

/**
 * 刪除文件
 *
 * @param filePath 文件完整路徑
 */
export function deleteFileApi(filePath?: string) {
  return request({
    url: '/api/v1/files',
    method: 'delete',
    params: { filePath: filePath }
  });
}

二、封裝組件

單文件上傳組件多文件上傳組件

在src/components下新建Upload文件夾,并在Upload文件夾中新建SingleUpload.vue和MultiUpload.vue

<!--src/components/Upload/SingleUpload.vue-->
<template>
  <!-- 上傳組件 -->
  <el-upload
    class="single-uploader"
    v-model="imgUrl"
    :show-file-list="false"
    list-type="picture-card"
    :before-upload="handleBeforeUpload"
    :http-request="uploadFile"
  >
    <img v-if="imgUrl" :src="imgUrl" class="single" />
    <el-icon v-else class="single-uploader-icon"><Plus /></el-icon>
  </el-upload>
</template>

<script setup lang="ts">
import { computed } from 'vue';
import { Plus } from '@element-plus/icons-vue';
import {
  ElMessage,
  ElUpload,
  UploadRawFile,
  UploadRequestOptions
} from 'element-plus';
import { uploadFileApi } from '@/api/file';

const emit = defineEmits(['update:modelValue']);

const props = defineProps({
  modelValue: {
    type: String,
    default: ''
  }
});

const imgUrl = computed<string | undefined>({
  get() {
    return props.modelValue;
  },
  set(val) {
    // imgUrl改變時(shí)觸發(fā)修改父組件綁定的v-model的值
    emit('update:modelValue', val);
  }
});

/**
 * 自定義圖片上傳
 *
 * @param options
 */
async function uploadFile(options: UploadRequestOptions): Promise<any> {
  const { data: fileInfo } = await uploadFileApi(options.file);
  imgUrl.value = fileInfo.url;
}

/**
 * 限制用戶(hù)上傳文件的格式和大小
 */
function handleBeforeUpload(file: UploadRawFile) {
  if (file.size > 2 * 1048 * 1048) {
    ElMessage.warning('上傳圖片不能大于2M');
    return false;
  }
  return true;
}
</script>

<style scoped>
.single-uploader .single {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

<style>
.single-uploader .el-upload {
  border: 1px dashed var(--el-border-color);
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  transition: var(--el-transition-duration-fast);
}

.single-uploader .el-upload:hover {
  border-color: var(--el-color-primary);
}

.el-icon.single-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  text-align: center;
}
</style>
<!--src/components/Upload/MultiUpload.vue-->
<!--
  多圖上傳組件
  @author: youlaitech
  @date 2022/11/20
-->

<template>
  <el-upload
    v-model:file-list="fileList"
    list-type="picture-card"
    :before-upload="handleBeforeUpload"
    :http-request="handleUpload"
    :on-remove="handleRemove"
    :on-preview="handlePreview"
    :limit="props.limit"
  >
    <el-icon><Plus /></el-icon>
  </el-upload>

  <el-dialog v-model="dialogVisible">
    <img w-full :src="dialogImageUrl" alt="Preview Image" />
  </el-dialog>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue';
import { Plus } from '@element-plus/icons-vue';
import {
  ElMessage,
  ElUpload,
  UploadRawFile,
  UploadRequestOptions,
  UploadUserFile,
  UploadFile,
  UploadProps
} from 'element-plus';
import { uploadFileApi, deleteFileApi } from '@/api/file';

const emit = defineEmits(['update:modelValue']);

const props = defineProps({
  /**
   * 文件路徑集合
   */
  modelValue: {
    type: Array<string>,
    default: [] as Array<string>
  },
  /**
   * 文件上傳數(shù)量限制
   */
  limit: {
    type: Number,
    default: 5
  }
});

const dialogImageUrl = ref('');
const dialogVisible = ref(false);

const fileList = ref([] as UploadUserFile[]);
watch(
  () => props.modelValue,
  (newVal: string[]) => {
    const filePaths = fileList.value.map(file => file.url);
    // 監(jiān)聽(tīng)modelValue文件集合值未變化時(shí),跳過(guò)賦值
    if (
      filePaths.length > 0 &&
      filePaths.length === newVal.length &&
      filePaths.every(x => newVal.some(y => y === x)) &&
      newVal.every(y => filePaths.some(x => x === y))
    ) {
      return;
    }

    fileList.value = newVal.map(filePath => {
      return { url: filePath } as UploadUserFile;
    });
  },
  { immediate: true }
);

/**
 * 自定義圖片上傳
 *
 * @param params
 */
async function handleUpload(options: UploadRequestOptions): Promise<any> {
  // 上傳API調(diào)用
  const { data: fileInfo } = await uploadFileApi(options.file);

  // 上傳成功需手動(dòng)替換文件路徑為遠(yuǎn)程URL,否則圖片地址為預(yù)覽地址 blob:http://
  const fileIndex = fileList.value.findIndex(
    file => file.uid == (options.file as any).uid
  );

  fileList.value.splice(fileIndex, 1, {
    name: fileInfo.name,
    url: fileInfo.url
  } as UploadUserFile);

  emit(
    'update:modelValue',
    fileList.value.map(file => file.url)
  );
}

/**
 * 刪除圖片
 */
function handleRemove(removeFile: UploadFile) {
  const filePath = removeFile.url;

  if (filePath) {
    deleteFileApi(filePath).then(() => {
      // 刪除成功回調(diào)
      emit(
        'update:modelValue',
        fileList.value.map(file => file.url)
      );
    });
  }
}

/**
 * 限制用戶(hù)上傳文件的格式和大小
 */
function handleBeforeUpload(file: UploadRawFile) {
  if (file.size > 2 * 1048 * 1048) {
    ElMessage.warning('上傳圖片不能大于2M');
    return false;
  }
  return true;
}

/**
 * 圖片預(yù)覽
 */
const handlePreview: UploadProps['onPreview'] = uploadFile => {
  dialogImageUrl.value = uploadFile.url!;
  dialogVisible.value = true;
};
</script>

三、使用案例

在src/views/component下新建uploader.vue

<!--src/views/component/uploader.vue-->
<script setup lang="ts">
import SingleUpload from '@/components/Upload/SingleUpload.vue';
import MultiUpload from '@/components/Upload/MultiUpload.vue';
import { ElForm } from 'element-plus';
import { reactive, ref, toRefs } from 'vue';

const dataFormRef = ref(ElForm);

const state = reactive({
  formData: {
    picUrl:
      'https://oss.youlai.tech/default/2022/11/20/18e206dae97b40329661537d1e433639.jpg',
    picUrls: [
      'https://oss.youlai.tech/default/2022/11/20/8af5567816094545b53e76b38ae9c974.webp',
      'https://oss.youlai.tech/default/2022/11/20/13dbfd7feaf848c2acec2b21675eb9d3.webp'
    ]
  }
});

const { formData } = toRefs(state);
</script>
<template>
  <div class="app-container">
    <el-form ref="dataFormRef" :model="formData">
      <el-form-item label="單圖上傳">
        <single-upload v-model="formData.picUrl"></single-upload>
      </el-form-item>
      <el-form-item label="多圖上傳">
        <multi-upload v-model="formData.picUrls"></multi-upload>
      </el-form-item>
    </el-form>
  </div>
</template>

vue3文件上傳,Vue3后臺(tái)管理系統(tǒng)搭建和開(kāi)發(fā),前端,javascript,vue.js

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-759040.html

到了這里,關(guān)于Vue3后臺(tái)管理系統(tǒng)(十)文件上傳的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3+element-plus的后臺(tái)管理系統(tǒng)模板 和 vue3+ant-design-vue的后臺(tái)管理系統(tǒng)模板

    vue3+element-plus的后臺(tái)管理系統(tǒng)模板 和 vue3+ant-design-vue的后臺(tái)管理系統(tǒng)模板

    規(guī)范 :后臺(tái)系統(tǒng)模板,按照企業(yè)級(jí)別的規(guī)范搭建的。 權(quán)限控制 :通過(guò)后端返回的路由表(這個(gè)路由表是由前端這邊在系統(tǒng)配好的然后存儲(chǔ)在后端的)來(lái)動(dòng)態(tài)渲染菜單和注冊(cè)路由,同時(shí)也根據(jù)頁(yè)面內(nèi)的接口權(quán)限對(duì)頁(yè)面中的按鈕做了是否可見(jiàn)的設(shè)置。前端這邊有 路由、角色、用

    2024年02月08日
    瀏覽(20)
  • vue3管理系統(tǒng)中后臺(tái)返回pdf格式的文件流,前端如何預(yù)覽?以及uniapp微信小程序中后臺(tái)返回的base64位的pdf文件如何預(yù)覽?

    vue3管理系統(tǒng)中后臺(tái)返回pdf格式的文件流,前端如何預(yù)覽?以及uniapp微信小程序中后臺(tái)返回的base64位的pdf文件如何預(yù)覽?

    后臺(tái)返回的是base64格式的pdf文件,首先需要解析base64文件的插件 image-tools 1 安裝并引入插件 2 封裝預(yù)覽pdf的函數(shù) 3 調(diào)用接口獲取數(shù)據(jù)

    2024年01月18日
    瀏覽(176)
  • vue3 + tsrpc +mongodb 實(shí)現(xiàn)后臺(tái)管理系統(tǒng)

    之前上線了一個(gè)vue后臺(tái)管理系統(tǒng),有小伙伴問(wèn)我有沒(méi)有后端代碼,咱只是個(gè)小前端,這就有點(diǎn)為難我了。不過(guò)不能辜負(fù)小伙伴的信任,nodejs也可以啊,廢話不多說(shuō),開(kāi)搞!后端采用 TSRPC 框架實(shí)現(xiàn) API 接口,前端采用 vue-manage-system 后臺(tái)管理系統(tǒng)框架,數(shù)據(jù)庫(kù)采用 mongodb。TSRPC 是

    2024年01月16日
    瀏覽(26)
  • vue3后臺(tái)管理系統(tǒng)之實(shí)現(xiàn)分頁(yè)功能

    vue3后臺(tái)管理系統(tǒng)之實(shí)現(xiàn)分頁(yè)功能

    例子:用戶(hù) 請(qǐng)求格式 返回?cái)?shù)據(jù)類(lèi)型 設(shè)置返回?cái)?shù)據(jù)類(lèi)型 屬性 首先我們先要了解分頁(yè)器的屬性 v-model:current-page當(dāng)前頁(yè)碼 v-model:page-size設(shè)置每頁(yè)展示數(shù)據(jù)的條數(shù) page-sizes每頁(yè)顯示個(gè)數(shù)選擇器的個(gè)數(shù) small是否使用小型分頁(yè)樣式 disabled 是否禁用分頁(yè) background 是否為分頁(yè)按鈕添加背景

    2024年02月06日
    瀏覽(23)
  • vue3后臺(tái)管理系統(tǒng)實(shí)現(xiàn)動(dòng)態(tài)側(cè)邊導(dǎo)航菜單管理(ElementPlus組件)

    vue3后臺(tái)管理系統(tǒng)實(shí)現(xiàn)動(dòng)態(tài)側(cè)邊導(dǎo)航菜單管理(ElementPlus組件)

    記住 一級(jí)(el-sub-menu)的都是只是展示的 點(diǎn)擊跳轉(zhuǎn)的都是一級(jí)下的子級(jí)(el-menu-item) 完整展示 1:在登陸功能進(jìn)行登陸 獲取menu列表 注冊(cè)路由表的時(shí)候 把文件進(jìn)行創(chuàng)建好 因?yàn)樽?cè)的方法需要獲取這個(gè)路徑 整個(gè)router下的main product等等都要?jiǎng)?chuàng)建 2:側(cè)邊菜單界面 router/index.ts

    2024年02月16日
    瀏覽(31)
  • Vue+SpringBoot后臺(tái)管理系統(tǒng):Vue3+TypeScript項(xiàng)目搭建(一)

    Vue+SpringBoot后臺(tái)管理系統(tǒng):Vue3+TypeScript項(xiàng)目搭建(一)

    查看Note版本 查看npm版本 然后將npm升級(jí)至最新版本 將npm下載源換至http://registry.npm.taobao.org 可以在后續(xù)的npm下載提高下載速度 安裝vue cli node版本v18.16.1 vue-cli版本v5.0.8 創(chuàng)建項(xiàng)目命令 vue_typescript_elementplus_demo 是項(xiàng)目名,可以自定義 選擇 Manually select features ,進(jìn)行自定義 然后選擇

    2024年02月13日
    瀏覽(29)
  • Vue3+element-plus實(shí)現(xiàn)后臺(tái)管理系統(tǒng)

    Vue3+element-plus實(shí)現(xiàn)后臺(tái)管理系統(tǒng)

    ?環(huán)境:node.js軟件 、Vs code、vite、elemnt-plus、windicss(樣式框架) ? ? 1、首先,使用npm 命令構(gòu)建項(xiàng)目( vscode安裝的插件 vscode中文顯示插件 ? 2、高亮提示插件volar ? 3、vue 3 sni 代碼提示) 快速上手 | Vue.js ? ?a. npm -v 查看node.js 版本 ? ?b. ?npm ?config get registry ? 查看注冊(cè)鏡像是

    2024年02月09日
    瀏覽(33)
  • 超詳細(xì)!10分鐘開(kāi)發(fā)一個(gè)Vue3的后臺(tái)管理系統(tǒng)

    超詳細(xì)!10分鐘開(kāi)發(fā)一個(gè)Vue3的后臺(tái)管理系統(tǒng)

    有很多人說(shuō) vue2 早就過(guò)時(shí)了,都 23年了竟然還有人在用 vue2?簡(jiǎn)直就是個(gè)土老帽! “你有說(shuō)話的權(quán)利,但我不認(rèn)同你的觀點(diǎn)?!比魏喂镜募夹g(shù)架構(gòu)不是一蹴而就的,而是隨著業(yè)務(wù)的增長(zhǎng)不斷升級(jí)變化的。技術(shù)越新,用的人不一定會(huì)很多。 其實(shí)我敢說(shuō)現(xiàn)在國(guó)內(nèi)跟多公司還在用

    2024年02月16日
    瀏覽(27)
  • 基于Vue3 + Element Plus 的后臺(tái)管理系統(tǒng)詳細(xì)教程

    Vue3 概述 Vue.js 是一種輕量級(jí)MVVM框架,它通過(guò)雙向綁定的方式,將視圖與數(shù)據(jù)進(jìn)行關(guān)聯(lián),簡(jiǎn)化了前端開(kāi)發(fā)的流程。Vue3 是 Vue.js 的下一個(gè)版本,與早期版本相比,它具有更高的性能和更好的開(kāi)發(fā)體驗(yàn)。 Composition API Vue 3 中最大的新特性是引入了 Composition API,它允許開(kāi)發(fā)人員按照

    2024年02月09日
    瀏覽(27)
  • Vue--》Vue3打造可擴(kuò)展的項(xiàng)目管理系統(tǒng)后臺(tái)的完整指南(二)

    Vue--》Vue3打造可擴(kuò)展的項(xiàng)目管理系統(tǒng)后臺(tái)的完整指南(二)

    今天開(kāi)始使用 vue3 + ts 搭建一個(gè)項(xiàng)目管理的后臺(tái),因?yàn)槲恼聲?huì)將項(xiàng)目的每一個(gè)地方代碼的書(shū)寫(xiě)都會(huì)講解到,所以本項(xiàng)目會(huì)分成好幾篇文章進(jìn)行講解,我會(huì)在最后一篇文章中會(huì)將項(xiàng)目代碼開(kāi)源到我的 GithHub 上,大家可以自行去進(jìn)行下載運(yùn)行,希望本文章對(duì)有幫助的朋友們能多多

    2024年02月07日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包