VS Code插件开发教程--树视图+网页视图--完整demo+图--2

VS Code插件开发教程--树视图+网页视图--完整demo+图--2

简介

你好!

本人为 2019.7 毕业的应届毕业生,目前从事前端工程师的职业。对知识充满渴望。如果本文中有什么错误的地方,还请各位指正。谢谢。

本文定位为初次接触vs code插件开发的小伙伴,开始有详细的教程如何一步一步的运用基础的插件开发

接下来会用完成的 demo 教大家 treeView 和 webView 的初级完成开发流程。小伙伴耐心跟着代码敲一遍能学会的哈。

先给小伙伴们看一下本文的目录架构:

  • 一、介绍
  • 二、安装
  • 三、初识 VS code 插件 demo
  • 四、treeView: 重识 package.json
  • 五、treeView: 在视图中显示想要的 item
  • 六、创建 webView 并嵌入百度页面
  • 七、不同 item 显示不同的页面(数据传递: VS code -> html)
  • 八、iframe 页面的数据传递指 VS code(iframe -> html -> vscode)

此文章为第二部分,如需从头开始阅读,请移步第一部分

四、treeView: 在视图中显示想要的 item

首先,我们先在 src 下创建 TreeViewProvider.ts 文件。重要的代码都展示在这里了。

import {
    TreeItem, TreeItemCollapsibleState, TreeDataProvider, Uri, window } from 'vscode';
import {
    join } from 'path';

这里重点讲解一下上面这两句代码:

vscode 提供了很多的 API 让我们使用,我们可以打开官网 VS code API

我讲解一下上面需要用到的几个项:

TreeItem:

在这里插入图片描述

创建 TreeItem 类型的构造函数,传递参数 labelcollapsibleState.

label: tree 该项的标题。

collapsibleState: 该项是否折叠状态。参数有三: Collapsed(折叠状态)、Expanded(展开状态)、None(无状态)。

?: 代表参数为非必填项,可不传。注意:非必填项,必须放在最后面

TreeItemCollapsibleState: 就是 collapsibleState 的类型。

TreeDataProvider: 为树数据的数据提供程序(如果不理解,可以先放着,一会看代码)。

Uri: 通用资源标识符,表示磁盘上的文件或其他资源(用来读取文件路径)。

join: 用来拼接文件路径。

import {
    TreeItem, TreeItemCollapsibleState, TreeDataProvider, Uri, window } from 'vscode';
import {
    join } from 'path';

// 创建每一项 label 对应的图片名称
// 其实就是一个Map集合,用 ts 的写法
const ITEM_ICON_MAP = new Map<string, string>([
    ['pig1', 'pig1.svg'],
    ['pig2', 'pig2.svg'],
    ['pig3', 'pig3.svg']
]);

// 第一步:创建单项的节点(item)的类
export class TreeItemNode extends TreeItem {
   

    constructor(
        // readonly 只可读
        public readonly label: string,
        public readonly collapsibleState: TreeItemCollapsibleState,
    ){
   
        super(label, collapsibleState);
    }

    // command: 为每项添加点击事件的命令
    command = {
   
        title: this.label,          // 标题
        command: 'itemClick',       // 命令 ID
        tooltip: this.label,
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
在Vue3中使用el-upload组件上传片到Django的后端服务器(使用ImageField),可以按照以下步骤: 1. 在Vue3中安装并引入el-upload组件,使用el-upload组件进行文件上传。例如: ```vue <template> <el-upload class="upload-demo" action="/api/upload/" :on-success="handleSuccess" :before-upload="beforeUpload" :headers="headers" multiple> <el-button slot="trigger">选取文件</el-button> <el-button style="margin-left: 10px;" type="primary">上传文件</el-button> </el-upload> </template> <script> import { ElUpload, ElButton, ElMessage } from 'element-plus' import { defineComponent } from 'vue' export default defineComponent({ name: 'UploadDemo', components: { ElUpload, ElButton }, data() { return { headers: { Authorization: `Bearer ${localStorage.getItem('token')}` } } }, methods: { beforeUpload(file) { const isJPG = file.type === 'image/jpeg' const isPNG = file.type === 'image/png' const isGIF = file.type === 'image/gif' if (!isJPG && !isPNG && !isGIF) { ElMessage.error('上传片只能是 JPG/PNG/GIF 格式!') return false } const isLt2M = file.size / 1024 / 1024 < 2 if (!isLt2M) { ElMessage.error('上传片大小不能超过 2MB!') return false } return true }, handleSuccess(response) { const { code, data, message } = response if (code === 0) { this.$emit('success', data) } else { ElMessage.error(message) } } } }) </script> ``` 2. 在Django后端创建一个视图函数,用于处理片上传的请求。可以使用Django自带的FileUploadHandler来处理上传的文件。在视图函数中,可以通过request.FILES获取上传的文件。例如: ```python from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse @csrf_exempt def upload_view(request): if request.method == 'POST': file_obj = request.FILES.get('file') if file_obj: with open(file_obj.name, 'wb+') as f: for chunk in file_obj.chunks(): f.write(chunk) return JsonResponse({'code': 0, 'message': '上传成功'}) else: return JsonResponse({'code': -1, 'message': '上传失败'}) ``` 3. 在Django的models.py文件中,定义一个ImageField来保存上传的片。例如: ```python from django.db import models class Image(models.Model): image = models.ImageField(upload_to='images/') ``` 4. 在Vue3中,使用axios或者fetch等方式,将上传的片发送到Django后端服务器。在发送请求时,需要将片数据转换成FormData格式,并且设置Content-Type为multipart/form-data。例如: ```javascript import axios from 'axios' const uploadImage = async (file) => { const formData = new FormData() formData.append('file', file) const headers = { 'Content-Type': 'multipart/form-data' } const response = await axios.post('/api/upload/', formData, { headers }) const { code, message } = response.data if (code === 0) { return message } else { throw new Error(message) } } ``` 5. 在Django后端服务器中,通过ImageField.save()方法将上传的片保存到服务器的指定路径中。例如: ```python from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse from django.conf import settings import os @csrf_exempt def upload_view(request): if request.method == 'POST': file_obj = request.FILES.get('file') if file_obj: image = Image.objects.create(image=file_obj) return JsonResponse({'code': 0, 'message': f'{settings.MEDIA_URL}{image.image.name}'}) else: return JsonResponse({'code': -1, 'message': '上传失败'}) ``` 6. 完成上传后,Django后端服务器返回保存的片路径,Vue3前端根据路径显示片或保存路径到数据库中。例如: ```vue <template> <img :src="imageUrl" alt="片" v-if="imageUrl"> </template> <script> import { ref } from 'vue' import { get } from '@/utils/http' export default { name: 'ImageDemo', props: { imgId: { type: Number, required: true } }, setup(props) { const imageUrl = ref('') const getImageUrl = async () => { try { const response = await get(`/api/images/${props.imgId}/`) imageUrl.value = response.data.url } catch (error) { console.error(error) } } getImageUrl() return { imageUrl } } } </script> ``` 注意事项: 1. 在进行片上传时,需要注意Django后端服务器的文件上传大小限制。 2. 在Vue3中,需要使用FormData格式向后端服务器发送文件数据,需要注意文件大小限制。 3. 在Django后端服务器中,需要根据上传的文件类型进行校验和处理,防止文件类型不符合要求。 4. 在使用ImageField保存片时,需要注意文件名的生成方式,避免文件名重复导致覆盖文件。 5. 如果需要对上传的片进行缩放或压缩,可以使用第三方库Pillow来处理。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值