Vue项目常见的文档导入调接口

简介: Vue项目常见的文档导入调接口

本期为Vue项目常见的文档导入调接口需求, 提供给不太懂的朋友, 本人萌新一枚, 写的不好各位大佬还请谅解, 感谢!!!


本文分为两阶段 —— 1: 代码块阶段     2: 图文阶段 (框架为 ElementUI)


代码块阶段

结构样式👇

以下upload-file, 是我自己封装的ElementUI的<el-upload></el-upload>

<div style="float: right; margin-left: 10px;">
     <upload-file
        text="模板导入" 
        :data="otherData" 
        :url="uploadURL" 
        @success="uploadSuccess"
>
     </upload-file>
 </div>

为了方便学习, 下面代码块为封装结构(--建议还是写el-upload吧--)👇

<template>
  <!--使用说明:
        <upload-file text="导入" :url="uploadUrl" @success="uploadCallback"></upload-file>
        属性
            text:为上传按钮显示的文字,必填
            url:为上传的url地址,必填
            btnQx:权限按钮控制,若不需控制按钮权限,不传即可,有权限按钮控制,值为是否有权限的boolear值
            accept:上传文件类型,默认为excel
            disabled:禁用 默认false
        事件:
            success:上传成功的回调函数,返回后台返回的值
  -->
  <el-upload
    class="upload-demo"
    v-if="btnQx"
    :action="url"
    :data="data"
    :drag="drag"
    :headers="importHeaders"
    :on-success="uploadSuccess"
    :on-progress="uploadLoading"
    :before-upload="beforeAvatarUpload"
    :on-error="uploadError"
    :show-file-list="false"
    :accept="accept"
    style="display: inline-block;"
    :disabled="disabled"
  >
    <slot>
      <el-button :type="btnType" size="mini" :disabled="disabled">
        <i class="iconfont icon-daoru1"></i>
        {{ text }}
      </el-button>
    </slot>
  </el-upload>
</template>
<script>
import { getToken } from '@/util/auth'
import website from '@/config/website'
import { Base64 } from 'js-base64'
export default {
  name: 'UploadFile',
  props: {
    btnType: {
      type: String,
      default: 'primary',
    },
    text: {
      type: String,
      default: '导入',
    },
    drag: {
      type: Boolean,
      default: false
    },
    btnQx: {
      type: Boolean,
      default: () => true,
    },
    data: {
      type: Object,
      default: () => {
        return {}
      },
    },
    url: {
      type: String,
      required: true,
    },
    accept: {
      type: String,
      default: '.xls,.xlsx',
    },
    disabled: {
      type: Boolean,
      default: () => false,
    }
  },
  data() {
    return {
      importHeaders: {
        Authorization: `Basic ${Base64.encode(
          `${website.clientId}:${website.clientSecret}`
        )}`,
        'MagicCube-Auth': 'bearer ' + getToken(),
      },
      loading: false,
      imgQuality: 0.3,
    }
  },
  methods: {
    uploadSuccess(res) {
      // this.loading.close();
      this.$emit('success', res)
    },
    uploadLoading() {
      this.loading = this.$loading({
        lock: true,
        text: '正在努力上传,请稍后...',
        spinner: 'el-icon-loading',
      })
    },
    uploadError(err) {
      let obj = JSON.parse(err.toString().replace(/(Error: )/, ''))
      // this.loading.close();
      this.$message.error(obj.msg)
    },
    dataURItoBlob(dataURI, type) {
      var binary = atob(dataURI.split(',')[1])
      var array = []
      for (var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i))
      }
      return new Blob([new Uint8Array(array)], { type: type })
    },
    beforeAvatarUpload(file) {
      if (file.name.search('[.]+(jpg|jpeg|swf|gif|png|JPG|JPEG|SWF|GIF|PNG)$') != -1) {
        const _this = this
        return new Promise((resolve) => {
          const reader = new FileReader()
          const image = new Image()
          image.onload = () => {//(imageEvent) => {
            const canvas = document.createElement('canvas')
            const context = canvas.getContext('2d')
            const width = image.width * _this.imgQuality
            const height = image.height * _this.imgQuality
            canvas.width = width
            canvas.height = height
            context.clearRect(0, 0, width, height)
            context.drawImage(image, 0, 0, width, height)
            const dataUrl = canvas.toDataURL(file.type)
            const blobData = _this.dataURItoBlob(dataUrl, file.type)
            resolve(blobData)
          }
          reader.onload = (e) => {
            image.src = e.target.result
          }
          reader.readAsDataURL(file)
          console.log(file.size)
        })
      }else if (file.name.search('[.]+(pdf|PDF|doc|DOC|docx|DOCX|XLSX|xlsx|xls|XLS)$') != -1){
          console.log(file)
          if (file.size > 5242880){
              this.$message.warning('上传文件不能大于5M!');
              return false
          }
      }
    },
  },
}
</script>
<style lang="scss" scoped>
.fileImage {
  margin-top: 10px;
}
</style>

数据结构👇

export default {
  components: { UploadFile }, // 引入的封装结构
  name: "upload", // 完全自定义name, 不会有人不知道吧, 不会吧不会吧(doge)
  data () {
    return {
      uploadURL: importCompanyExcel, // 接口的url地址
      otherData: {
        CompanyDetailId: this.$store.getters.customer.id // 接口需要的参数
      }
    }
  }
}
// 此代码块为存放接口的 JS 文件
// 文档导入操作
export const importCompanyExcel = "请求的接口URL";

上传成功钩子函数👇

uploadSuccess (res) {
  if (res.code == 200) { // 接口返回200(成功)
    this.getList(this.pagination); // 调用其他接口
    this.$alert(res.msg, '提示', {
      confirmButtonText: '确定',
      callback: () => {
        this.page.currentPage = 1
        this.onLoad(this.page, this.query) // 调用其他接口
      },
    })
  } else {
    this.$message.error(res.msg) // 失败
  }
},

 


图文阶段(简单暴力上图)👇

结构样式

 

 数据结构

 

引入接口

 



    本文比较简单粗暴, 不会讲解太详细, 希望各位见谅, 本人还是萌新🤗

感谢各位佬

相关文章
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
7天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
16 3
|
1月前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
29 1
|
1月前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
1月前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
41 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
30 1
|
1月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
38 1
vue学习第四章
|
1月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
25 1
vue学习第7章(循环)

热门文章

最新文章