实现图床项目
新建一个vue3项目
vue create bmob-viewer
安装 element-plus
yarn add element-plus放一个按钮看下是否引入成功
    <el-card class="bucket-select-card">
      <div>
        <el-button type="primary">按钮</el-button>
        <el-button type="primary" disabled>按钮</el-button>
      </div>
    </el-card>
做一个上传界面,我们使用el-upload 组件
https://s-test.belle.cn/zh-CN/component/upload.html 照片墙代码
<template>
  <el-upload
    v-model:file-list="fileList"
    action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
    list-type="picture-card"
    :on-preview="handlePictureCardPreview"
    :on-remove="handleRemove"
  >
    <el-icon><Plus /></el-icon>
  </el-upload>
  <el-dialog v-model="dialogVisible">
    <img w-full :src="dialogImageUrl" alt="Preview Image" />
  </el-dialog>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile } from 'element-plus'
const fileList = ref<UploadUserFile[]>([
  {
    name: 'food.jpeg',
    url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100',
  },
  {
    name: 'plant-1.png',
    url: '/images/plant-1.png',
  }
])
const dialogImageUrl = ref('')
const dialogVisible = ref(false)
const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
  console.log(uploadFile, uploadFiles)
}
const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
  dialogImageUrl.value = uploadFile.url!
  dialogVisible.value = true
}
</script>

这个列表数据是写死的,我们从服务器文件记录表取出记录,这里我们使用Bmob后端云
安装sdk
npm install hydrogen-js-sdkmain.ts 初始化sdk
import Bmob from 'hydrogen-js-sdk'
// 初始化
Bmob.initialize("e7cebb69e9ed76e9", "111111");取出数据
let fileList = ref<UploadUserFile[]>([])
const query = Bmob.Query('pic_list');
query.find().then(res => {
  // 确保 res 是 UploadUserFile[] 类型
  if (Array.isArray(res)) {
    fileList.value = res;
  } else {
    console.error('查询结果类型不匹配');
  }
});效果

实现删除
const handleRemove: UploadProps['onRemove'] = (uploadFile: ImageInfo, uploadFiles: ImageInfo[]) => {
  console.log(uploadFile);
  const query = Bmob.Query('pic_list');
  const objectId = uploadFile.objectId;
  query.destroy(objectId).then(res => {
    // 传入string是单个文件删除,传入array是批量删除
    const del = Bmob.File("a", "jfdf");
    const val = [uploadFile.url]
    del.destroy(val).then(res => {
      console.log(res);
    }).catch(err => {
      console.log(err)
    })
  }).catch(err => {
    console.error('删除文件失败:', err);
  });
};实现上传
const customUpload = async (options) => {
  const file = Bmob.File(options.file.name, options.file);
  const res = await file.save();
  console.log("File saved successfully:", res);
  // 把URL保存到Bmob pic_list表中
  const query = Bmob.Query('pic_list');
  const data = {
    name: options.file.name,
    url: res[0].url
  };
  query.save(data).then(res => {
    console.log(res)
  }).catch(err => {
    console.log(err)
  })
}最终效果

项目开源代码地址
https://github.com/magic007/Vue3-image-bed
    
评论