nuxt、vue实现PDF和视频文件的上传、下载、预览

上传

在这里插入图片描述

上传页面

 <el-form-item :label="(form.ququ3 == 1 ? '参培' : form.ququ3 == 2 ? '授课' : '') + '证明材料'" prop="ququ6"><PdfUpload v-model="form.ququ6" :fileType="['pdf', 'mp4', 'avi', 'ts']"></PdfUpload>
</el-form-item>

PdfUpload组件

自定义组件实现v-model,只需要定义props:value属性来接收父组件的v-model绑定的初始值,在子组件改变值时触发$emit(‘input’,值)

<template><div class="upload-file "><el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :limit="limit":on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess" :show-file-list="false":headers="headers" class="upload-file-uploader" ref="upload"><el-button size="small" type="primary">点击上传</el-button><!-- 上传提示 --><div class="el-upload__tip" slot="tip" v-if="showTip"><template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template><template v-if="fileType"> 只能上传PDF文件和视频,格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template></div></el-upload><!-- 文件列表 --><div class="ml-100" style="margin-top: -20px;"><transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"><li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"><el-link :href="file.url" :underline="false" target="_blank"><span :class="getFileName(file.name).includes('pdf') ? 'el-icon-document' : 'el-icon-video-camera'"> {{getFileName(file.name) }}</span></el-link><div class="ele-upload-list__item-content-action ml-60" style="min-width: 40px;"><el-link :underline="false" @click="handleDelete(index)" type="primary" icon="el-icon-circle-close"></el-link></div></li></transition-group></div></div>
</template><script>
// ******自定义组件实现v-model,只需要定义props:value属性来接收父组件的v-model绑定的初始值,在子组件改变值时触发$emit('input',值)
export default {name: "FileUpload",props: {// 文件值,fileListvalue: [String, Object, Array],// 数量限制limit: {type: Number,},// 大小限制(MB)fileSize: {type: Number,// default: 500,},// 文件类型, 例如['png', 'jpg', 'jpeg']fileType: {type: Array,default: () => ['png', 'jpg', 'jpeg'],},// 是否显示文件大小和类型限制提示文字isShowTip: {type: Boolean,default: true},},data() {return {number: 0,uploadList: [],uploadFileUrl: '/prod-api' + "/file/upload", // 上传的图片服务器地址headers: {Authorization: this.$store.state.token,},fileList: [],};},watch: {value: {handler(val) {if (val) {console.log(666, val);// 然后将数组转为对象数组// 首先将值转为数组const list = Array.isArray(val) ? val : this.value.split(",");// 然后将数组转为对象数组this.fileList = list.map((item) => {if (typeof item === "string") {item = { name: item, url: item };}return item;});} else {this.fileList = [];return [];}},deep: true,immediate: true,}},computed: {// 是否显示提示showTip() {return this.isShowTip && (this.fileType || this.fileSize);},},methods: {// 上传前校检格式和大小handleBeforeUpload(file) {console.log('上传前-校验', file, file.name);// 校检文件类型if (this.fileType) {let fileExtension = "";if (file.name.lastIndexOf(".") > -1) {fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);}const isTypeOk = this.fileType.some((type) => {if (file.type.indexOf(type) > -1) return true;if (fileExtension && fileExtension.indexOf(type) > -1) return true;return false;});if (!isTypeOk) {this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);return false;}}// 校检文件大小if (this.fileSize) {const isLt = file.size / 1024 / 1024 < this.fileSize;if (!isLt) {this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);return false;}}this.$modal.loading("正在上传,请稍候...");this.number++;return true;},// 文件个数超出handleExceed() {this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);},// 上传失败handleUploadError(err) {this.$modal.msgError("上传失败,请重试");this.$modal.closeLoading()},// 上传成功回调handleUploadSuccess(res) {// name为 文件console.log('上传成功回调', res);this.uploadList.push({ name: res.data.url, url: res.data.url, });if (this.uploadList.length === this.number) {this.fileList = this.fileList.concat(this.uploadList);console.log(2222, this.fileList)this.uploadList = [];this.number = 0;this.$emit("input", this.listToString(this.fileList));this.$modal.closeLoading();}},// 删除文件handleDelete(index) {this.fileList.splice(index, 1);this.$emit("input", this.listToString(this.fileList));},// 获取文件名称getFileName(name) {if (name.lastIndexOf("-") > -1) {return name.slice(name.lastIndexOf("-") + 1);} else {return "";}},// 对象转成指定字符串分隔listToString(list, separator) {let strs = "";separator = separator || ",";for (let i in list) {strs += list[i].url + separator;}return strs != '' ? strs.substr(0, strs.length - 1) : '';}}
};
</script><style scoped  >
.upload-file-uploader {margin-bottom: 5px;
}::v-deep .el-upload--picture-card {width: 104px;height: 104px;line-height: 104px;
}.upload-file-list {max-height: 240px !important;overflow-y: auto;
}.upload-file-list .el-upload-list__item {line-height: 2;margin-bottom: 10px;position: relative;
}.upload-file-list .ele-upload-list__item-content {display: flex;justify-content: space-between;align-items: center;color: inherit;
}.ele-upload-list__item-content-action .el-link {margin-right: 10px;
}
</style>

整个上传页面

<template><div id="index" class="flex flex-top w ptb-30"><Menu></Menu><div class="flex-1 ml-30  over-hidden"><h3 class="mt-20 mb-40">新增培训</h3><el-form style="width:500px" :model="form" :rules="rules" ref="form" label-width="100px" class="demo-form"><el-form-item label="培训主题名" prop="ququ1"><el-input v-model.trim="form.ququ1" placeholder="请输入培训主题名" clearable /></el-form-item><el-form-item label="培训分类" prop="ququ2"><el-select v-model="form.ququ2" placeholder="请选择培训分类" style="width: 100%;"><el-option label="5" value="5"></el-option></el-select></el-form-item><el-form-item label="所属类别" prop="ququ3"><el-radio-group v-model="form.ququ3"><el-radio label="1">参培人</el-radio><el-radio label="2">授课人</el-radio></el-radio-group></el-form-item><el-form-item label="参与地点" prop="ququ4"><el-input v-model.trim="form.ququ4" placeholder="请输入参与地点" clearable /></el-form-item><el-form-item label="起止日期" prop="ququ5"><el-date-picker v-model="form.ququ5" type="daterange" range-separator="至" start-placeholder="开始日期"end-placeholder="结束日期" value-format="yyyy-MM-dd" style="width: 100%;"></el-date-picker></el-form-item><el-form-item :label="(form.ququ3 == 1 ? '参培' : form.ququ3 == 2 ? '授课' : '') + '证明材料'" prop="ququ6"><PdfUpload v-model="form.ququ6" :fileType="['pdf', 'mp4', 'avi', 'ts']"></PdfUpload></el-form-item><el-form-item label="备注" prop="ququ7"><el-input v-model.trim="form.ququ7" placeholder="请输入备注" clearable type="textarea" /></el-form-item><el-form-item><el-button type="primary" @click="submit('form')">提交审核</el-button><el-button type="primary" plain @click="save">保存草稿</el-button><el-button @click="back">返回</el-button></el-form-item></el-form></div></div>
</template>
<script>export default {data() {return {form: {ququ1: '',ququ2: '',ququ3: '',ququ4: '',ququ5: '',ququ6: [],ququ7: '',},rules: {ququ1: {required: true,message: '请输入主题名',trigger: ['blur']},ququ2: {required: true,message: '请选择培训分类',trigger: ['change']},ququ3: {required: true,message: '请选择所属类别',trigger: ['change']},ququ5: {required: true,message: '请选择起止日期',trigger: ['change']},ququ6: {required: true,message: '请上传证明材料',trigger: ['change']},}};},mounted() {if (localStorage.getItem('form')) {this.$confirm('检测到您有保存的草稿,需要使用吗?', '提示', {confirmButtonText: '使用',cancelButtonText: '删除',type: 'warning'}).then(() => {this.form = JSON.parse(localStorage.getItem('form'))}).catch(() => {localStorage.removeItem('form')});}},methods: {submit(formName) {this.$refs[formName].validate((valid) => {if (valid) {this.$axios.get('/exam/info/queryErrorQuestionQuantity').then(res => {this.back()localStorage.removeItem('form')})} else {return false;}});},resetForm(formName) {this.$refs[formName].resetFields();},back() {this.$router.back()},save() {console.log(this.form.ququ6.map(item => item.url))localStorage.setItem('form', JSON.stringify(this.form))},},
};
</script>
<style scoped></style>

预览和下载

在这里插入图片描述

在这里插入图片描述

预览页面

 <el-button @click="downLoad(item)" type="primary" size="mini">下载</el-button><el-button @click="preview(item)" type="danger" size="mini">预览</el-button>downLoad(item) {let url = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/6a12b9ca-3ae9-435b-b023-0f9c119afad3-1.mp4"let url1 = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/53aa1f60-0735-4203-86b2-c2b8b019e8d9-我的哈哈.pdf"fetch(url).then(res => res.blob()).then(blob => { // 将链接地址字符内容转变成blob地址const a = document.createElement('a')a.href = URL.createObjectURL(blob)a.download = url.split('-')[url.split('-').length - 1]  // 下载文件的名字document.body.appendChild(a)a.click()})},preview(item) {let url = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/6a12b9ca-3ae9-435b-b023-0f9c119afad3-1.mp4"let url1 = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/53aa1f60-0735-4203-86b2-c2b8b019e8d9-我的哈哈.pdf"window.open(url1)}

整个列表加详情弹窗页面

<template><div id="index" class="flex flex-top w ptb-30"><Menu></Menu><div class="flex-1 ml-30  over-hidden"><!-- 搜索 --><el-form :model="queryParams" ref="queryForm" size="small" :inline="true"><el-form-item label="培训名称" prop="ququ1"><el-input v-model.trim="queryParams.ququ1" placeholder="请输入培训名称" clearable @keyup.enter.native="getList(1)" /></el-form-item><el-form-item label="起止日期" prop="ququ2"><el-date-picker v-model="queryParams.ququ2" type="daterange" range-separator="至" start-placeholder="开始日期"end-placeholder="结束日期" value-format="yyyy-MM-dd"></el-date-picker></el-form-item><el-form-item label="培训地点" prop="ququ3"><el-input v-model.trim="queryParams.ququ3" placeholder="请输入培训地点" clearable @keyup.enter.native="getList(1)" /></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" size="mini" @click="getList(1)">查询</el-button><el-button size="mini" @click="resetQuery">重置</el-button></el-form-item></el-form><!-- 新增 --><el-row><el-col :span="24" class="flex_r"><el-button type="success" icon="el-icon-plus" size="mini" @click="add">新增</el-button></el-col></el-row><!-- tab  --><el-tabs v-model="tab" @tab-click="getList(1)"><el-tab-pane label="全部培训" name="1"></el-tab-pane><el-tab-pane label="已通过审批" name="2"></el-tab-pane><el-tab-pane label="未通过审批" name="3"></el-tab-pane></el-tabs><!-- 表格 --><el-table :data="tableData" border><el-table-column prop="paperName" align="center" min-width="140" label="培训名称" :show-overflow-tooltip="true"></el-table-column><el-table-column prop="paperName" align="center" min-width="140" label="培训分类" :show-overflow-tooltip="true"></el-table-column><el-table-column prop="practiceType" align="center" min-width="90" label="所属类别"><template slot-scope="scope"><el-tag size="small">{{ scope.row.practiceType == 1 ? '参培人' : '授课人' }}</el-tag></template></el-table-column><el-table-column prop="paperName" align="center" min-width="100" label="培训地点" :show-overflow-tooltip="true"></el-table-column><el-table-column prop="startTime" align="center" min-width="120" label="开始时间"></el-table-column><el-table-column prop="endTime" align="center" min-width="120" label="结束时间"></el-table-column><el-table-column prop="practiceType" align="center" min-width="90" label="审批状态"><template slot-scope="scope"><el-tag :type="scope.row.practiceType == 1 ? '' : scope.row.practiceType == 2 ? 'success' : 'danger'">{{ scope.row.practiceType == 1 ? '审核中' : scope.row.practiceType == 2 ? '已通过' : '未通过' }}</el-tag></template></el-table-column><el-table-column label="操作" align="center" fixed="right" min-width="100"><template slot-scope="scope"><el-button @click="toDetail(scope.row)" size="mini" type="text" icon="el-icon-document-copy">详情</el-button></template></el-table-column></el-table><!-- 分页 --><div class="center mtb-20"><el-pagination :hide-on-single-page="true" background layout="prev, pager, next" :total="total * 1":current-page.sync="page" @current-change="getList" :page-size="this.pageSize"></el-pagination></div></div><!-- 详情弹窗 --><el-dialog title="培训详情" :visible.sync="show" width="1000px"><el-card shadow="hover" class="flex-1 ml-20 scroll pd-10"><el-descriptions title="培训详情"><el-descriptions-item label="培训主题名">kooriookami</el-descriptions-item><el-descriptions-item label="培训分类">18100000000</el-descriptions-item><el-descriptions-item label="提交时间">苏州市</el-descriptions-item><el-descriptions-item label="本人所属类别"><el-tag size="small">学校</el-tag></el-descriptions-item><el-descriptions-item label="培训起止日期">江苏省苏州市吴中区吴中大道 1188</el-descriptions-item><el-descriptions-item label="参与地点">江苏省苏州市吴中区吴中大道 1188</el-descriptions-item><el-descriptions-item label="备注">江苏省苏州市吴中区吴中大道 1188</el-descriptions-item></el-descriptions></el-card><el-card shadow="hover" class="flex-1 ml-20 scroll pd-10 mt-30"><h3 class="mb-20">附件记录</h3><div class="flex mb-10" v-for="(item, i) in 6"><div>23243232.png</div><div><el-button @click="downLoad(item)" type="primary" size="mini">下载</el-button><el-button @click="preview(item)" type="danger" size="mini">预览</el-button></div></div></el-card></el-dialog></div>
</template>
<script>export default {data() {return {tab: '1',page: 1,pageSize: 10,total: 0,tableData: [],// 搜索queryParams: {ququ1: "",ququ2: "",ququ3: "",},//详情show: false,};},mounted() {this.getList()},methods: {getList(page) {console.log(this.queryParams.ququ2)if (page == 1) {this.page = 1;}this.$axios.get('/exam/practiceHistory/record/listPc', {params: {pageNum: this.page,pageSize: this.pageSize,tab: this.tab,...this.queryParams}}).then(res => {this.tableData = res.rows;this.total = res.total;});},/** 重置按钮操作 */resetQuery() {this.$refs['queryForm'].resetFields();this.queryParams.ququ2 = ''this.getList(1)},add() {this.$router.push({ path: "/train/add" });},toDetail(row) {this.show = true},downLoad(item) {let url = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/6a12b9ca-3ae9-435b-b023-0f9c119afad3-1.mp4"let url1 = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/53aa1f60-0735-4203-86b2-c2b8b019e8d9-我的哈哈.pdf"fetch(url).then(res => res.blob()).then(blob => { // 将链接地址字符内容转变成blob地址const a = document.createElement('a')a.href = URL.createObjectURL(blob)a.download = url.split('-')[url.split('-').length - 1]  // 下载文件的名字document.body.appendChild(a)a.click()})},preview(item) {let url = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/6a12b9ca-3ae9-435b-b023-0f9c119afad3-1.mp4"let url1 = "https://cscec83-learnplatform.oss-cn-shanghai.aliyuncs.com/test/2023-11-27/53aa1f60-0735-4203-86b2-c2b8b019e8d9-我的哈哈.pdf"window.open(url1)}},
};
</script>
<style scoped></style>

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

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

相关文章

亚马逊,shein,temu如何避免爆品评分低被强制下架

近期&#xff0c;一些Temu卖家反映产品下架问题&#xff0c;无论是日出千单的爆品还是其他商品&#xff0c;都有可能面临下架的风险。这其中最主要的原因之一是产品质量问题&#xff0c;导致消费者差评较多&#xff0c;评分降至4.2分或4.0分以下时&#xff0c;平台可能会强制下…

EfficientViT:具有级联群体注意力的内存高效Transformer

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、介绍2、使用 Vision Transformer 加快速度2.1 内存效率2.2 计算效率2.3 参数效率 3、Efficient Vision Transformer3.1 EfficientViT 构建模块3.3 EfficientViT 网络架构 4、实验5、结论 …

YOLOv8独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

💡💡💡本文全网首发独家改进:可改变核卷积(AKConv),赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择,解决具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标的问题点,效果秒殺DSConv 1)AKConv替代标准卷积进行…

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类

有时候我们在MFC项目开发过程中&#xff0c;需要用到一些微软已经提供的功能&#xff0c;如VC使用EXCEL功能&#xff0c;这时候我们就能直接通过VS2019到如EXCEL.EXE方式&#xff0c;生成对应的OLE头文件&#xff0c;然后直接使用功能&#xff0c;那么&#xff0c;我们上篇文章…

【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI

一、Python环境编译 1、处理好venv环境 要生成正常的 requirements.txt 文件&#xff0c;我们就需要先将虚拟环境处理好 创建虚拟环境&#xff08;可选&#xff09;&#xff1a; 在项目目录中&#xff0c;你可以选择使用虚拟环境&#xff0c;这样你的项目依赖将被隔离在一个…

C++基础 -6-二维数组,数组指针

二维数组在内存中的存放方式和一维数组完全相同 下表把二维数组抽象成了行列形式方便理解 a[0]指向第一行首元素地址 a指向第一行的首地址 所以a地址和a[0]地址相同,因为起点相同 但a[0]1往右偏移 但a1往下方向偏移 方便理解 an控制行 a[0]n控制列(相当于*an) 数组指针指向二…

食材管家,轻松搞定!商户选择生鲜配送系统的原因

随着消费者对生鲜食品的需求不断增加&#xff0c;生鲜市场逐渐成为了电商领域中的热门行业。而生鲜配送系统&#xff0c;则是生鲜电商发展中不可或缺的一部分。本文将探讨商户选择生鲜配送系统的几个原因。 1. 提高效率 生鲜配送系统通过智能化的订单处理、路线规划和配送优化…

【MySQL系列】PolarDB入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

不用render_template函数,把html代码放在py文件里,不用单独写html文件

3.猜拳游戏&#xff1a;石头、剪刀、布的游戏 ##不用render_template函数&#xff0c;把html代码放在py文件里&#xff0c;不用单独写html文件 from flask import Flask, request import randomapp Flask(__name__)app.route(/) def index():#下面form标签虽然放在注释里&…

Scanner常用知识点

在Java中&#xff0c;Scanner类是用于读取用户输入的工具类&#xff0c;可以从多种输入源读取数据&#xff0c;如标准输入流、文件或字符串。以下是一些Scanner类的常用知识点&#xff1a; Scanner的初始化&#xff1a;在使用Scanner类之前&#xff0c;需要先将其导入到你的Ja…

Pycharm在debug问题解决方案

Pycharm在debug问题解决方案 前言一、Frames are not available二、查看变量时一直显示collecting data并显示不了任何内容 前言 Pycharm在debug时总是出现一些恼人的问题&#xff0c;以下是博主在训练中遇到的问题及在网上找到的可用解决方案&#xff1a; 一、Frames are not…

C语言基础篇5:指针(二)

接上篇&#xff1a;C语言基础篇5&#xff1a;指针(一) 4 指针作为函数参数 4.1 指针变量作为函数的参数 指针型变量可以作为函数的参数&#xff0c;使用指针作为函数的参数是将函数的参数声明为一个指针&#xff0c;前面提到当数组作为函数的实参时&#xff0c;值传递数组的地址…

搭建你自己的网盘-个人云存储的终极解决方案-nextcloud (一)

在当今数字化时代&#xff0c;我们越来越多地依赖云存储来保存和共享我们的个人和工作文件。而自己搭建网盘不仅可以提供更大的存储空间和更高的隐私保护&#xff0c;还可以让我们完全掌控我们的数据。 在之前我分享过一个文件共享站-Pingvin Share 。 但是今天我将带来一个文件…

西工大网络空间安全学院计算机系统基础实验零

首先&#xff0c;下载VMware17 Pro workstation。为什么要下载VMware17 Pro workstation呢&#xff1f;因为计算机系统基础实验有四个大部分&#xff1a;利用位运算实现诸如a*b&#xff0c;a/b&#xff0c;a*(2^4)等运算&#xff1b;C语言循环语句、switch语句等语句与汇编代码…

【开源】基于Vue+SpringBoot的大学生相亲网站

项目编号&#xff1a; S 048 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S048&#xff0c;文末获取源码。} 项目编号&#xff1a;S048&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4…

OpenVINO异步Stable Diffusion推理优化方案

文章目录 Stable Diffusion 推理优化背景技术讲解&#xff1a;异步优化方案思路&#xff1a;异步推理优化原理OpenVINO异步推理Python API同步和异步实现方式对比 oneflow分布式调度优化优势&#xff1a;实现思路 总结&#xff1a; Stable Diffusion 推理优化 背景 2022年&am…

服务器中启动和停止项目

服务器中启动和停止项目 一、前言二、使用命令启动和关闭项目1、启动项目2、停止项目 三、使用可执行脚本启动和关闭项目1、启动项目2、停止项目 一、前言 在服务器上部署项目&#xff0c;一般就是将项目挂在后台&#xff0c;如果是微服务首选docker-compose&#xff0c;但如果…

深入解析Windows操作系统——系统结构

文章目录 需求和设计目标总体结构可移植性对称多处理可伸缩性 关键的系统组件Windows子系统Ntdll.dll执行体内核硬件支持硬件抽象层HAL设备驱动程序 Windows驱动程序模型执行体组件常用的绝大多数函数名前缀 系统进程空闲进程中断和DPCSystem进程和系统线程会话管理器Winlogon、…

OkHttp的配置

一、拦截器 1.添加拦截器的作用&#xff1a; 每次在请求过程中就会回调一次intercept方法 2.拦截器的回调方法里我们可以做那些事情&#xff1a; 当前的请求还没有发给服务器&#xff0c;比如我们在与服务器通信的时候&#xff0c;一个应用中很多地方都会跟服务器发起通信。…

办公软件PDF转换工具 - pdftool

办公软件PDF转换工具 - pdftool&#xff0c;支持&#xff1a; 1、图片转PDF&#xff0c;支持图片自动压缩&#xff0c;可预览图片 2、合并PDF&#xff0c;支持多个PDF合并成一个PDF 3、PDF转图片&#xff0c;PDF的每页转成一张图片 4、OFD转PDF&#xff0c;OFD办公常用于国内的…