uniapp小程序上传pdf文件

<template>
	<view class="mainInnBox">
		<view class="formBox">
			<!-- 注意,如果需要兼容微信小程序,最好通过setRules方法设置rules规则 -->
			<u-form :model="form" ref="uForm" :rules="rules">
				<u-form-item label="故障车辆" labelWidth="80px" prop="licensePlate" borderBottom>
					<u--input
						:placeholder="vehOptions.licensePlate"
						placeholder-style="color: #333;"
						disabledColor="#ffffff"
						border="none"
						inputAlign="right"
						disabled
						readonly
					/>
				</u-form-item>
				<u-form-item label="发生时间" labelWidth="80px" prop="occurreTime" borderBottom @click="showDate = true">
					<!-- <span class="redStar">*</span> -->
					<u--input
						v-model.trim="form.occurreTime"
						placeholder="请选择发生时间"
						disabledColor="#ffffff"
						border="none"
						inputAlign="right"
						disabled
						readonly
					/>
				</u-form-item>
				<u-form-item label="事件类型" labelWidth="80px" prop="typeName" borderBottom @click="showSelect = true">
					<!-- <span class="redStar">*</span> -->
					<u-input
						v-model="form.typeName"
						placeholder="请选择事件类型"
						disabledColor="#ffffff"
						border="none"
						inputAlign="right"
						disabled
						readonly
					>
						<!-- <template v-show="form.publishCycle" slot="suffix">
							<span>天</span>
						</template> -->
					</u-input>
				</u-form-item>
				<view class="form_label">描述</view>
				<u-form-item label=" " labelWidth="0" labelPosition="top" prop="description" borderBottom>
					<u--textarea
						v-model.trim="form.description"
						border="none"
						placeholder="请输入描述..."
						placeholderStyle="#999999"
						maxlength="100"
						height="50"
						:count="false"
						borderBottom
					/>
				</u-form-item>
				<view class="form_label">附件文件</view>
				<view class="form_label_tip">文件大小不大于10M,支持PDF</view>
				
				<!-- 上传文件展示 -->
				<view class="uploadContent">
					<view class="uploadFileBox" v-if="pdfInfo.length!=0">
						<view class="uploadTexts" @click="jump(pdfInfo[0].url)">
							{{pdfInfo[0].name}}
						</view>
						<u-icon name="close" @click="deleteFile()"></u-icon>
					</view>
					<view v-else class="uploadChoose" @click="selectFile()">
						<u-icon name="plus"></u-icon>
					</view>
				</view>
				<!-- 上传文件按钮 -->

			</u-form>
			
		</view>
		<view class="btnBox">
			<view class="btn" @click="submitFunc">提交</view>
		</view>
		
		
		<view>
			<!-- 发生时间 -->
			<u-datetime-picker :show="showDate" v-model="datetime" mode="datetime" @cancel="closeDate" @confirm="sureDate"></u-datetime-picker>
			<!-- 事件类型 -->
			<u-picker :show="showSelect" :columns="columnsSelect" keyName="label" @cancel="closeSelect" @confirm="confirmSelect"></u-picker>
			
		</view>
		
		<u-modal
			:show="successModalShow"
			confirmText="理赔记录"
			cancelText="返回首页"
			@confirm="confirmFunc"
			@cancel="cancelFunc"
			:showConfirmButton="true"
			:showCancelButton="true"
			confirmColor="#ffffff"
			cancelColor="#333"
		>
			<view class="slot-content">
				<u-icon name="checkmark-circle-fill" color="#70b603" size="28" label="上报成功" labelPos="bottom" labelSize="16px" labelColor="#333"></u-icon>
				<view style="text-align: center;padding: 30rpx 0 0; font-size: 24rpx;">出险信息已上报</view>
			</view>
		</u-modal>
	</view>
</template>

<script>
	import { getToken } from '@/assets/scripts/auth'
	export default {
		data() {
			return {
				imgUrl: this.$imgUrl,
				recordId: '', // 保险记录id
				vehOptions: {},
 
				showDate: false, // 发生时间选择
				datetime: Number(new Date()),
				showSelect: false, // 事件类型选择
				columnsSelect: [
					[{label: '出险', value: 1},{label: '维修', value: 2}, {label: '理赔', value: 3}]
				],
				form: {
					occurreTime: '',
					typeName: '',
					description: '',
				},
				rules: {
					occurreTime: [
						{ required: true, message: '请选择发生时间', trigger: ['change']},
					], 
					typeName: [
						{ required: true, message: '请选择事件类型', trigger: ['change']},
					],
					description: [
						{ required: false, message: '请输入描述', trigger: ['blur', 'change']},
						{ min: 1, max: 100, message: '长度在100个字符之间'},
					],
				},
				btnStatus: false,
				successModalShow: false,
 
				pdfInfo: []
			}
		},
		onShow() {
			
		},
		onLoad(option) {
			// 点击理赔记录-上报--跳转过来。
			console.log(option)
			this.recordId = option.recordId
			this.vehOptions = option
		},
		onReady() {
			this.$nextTick(()=>{
				//如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
				this.$refs.uForm.setRules(this.rules)
			})
		},
		methods: {
			 
			// 发生时间选择
			closeDate () {
				this.showDate = false
			},
			sureDate (e) {
				// console.log(e, this.value1)
				this.form.occurreTime = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss')
				this.$refs.uForm.clearValidate('occurreTime')
				this.showDate = false
			},

			// 事件类型选择
			closeSelect() {
				this.showSelect = false
			},
			confirmSelect(e) {
				// console.log(e)
				this.form.type = e.value[0].value
				this.form.typeName = e.value[0].label
				this.$refs.uForm.clearValidate('typeName')
				this.showSelect = false
			},

			// 上传pdf
			selectFile(){
				// console.log('111', this.pdfInfo)
				if(this.pdfInfo.length != 0){ // this.pdfInfo 要求不可重复上传
					this.$toast('如果重新上传请先删除已有的附件~')
					return
				}
				let that = this
				uni.chooseMessageFile({
					count: 1, //最多可以选择的文件个数,可以 1
					type: 'file', //所选的文件的类型,具体看官方文档
					extension: ['.pdf'], //文件类型, '.docx''.doc', 
					success (res) {
						// console.log('上传', res)
						// // tempFilePath可以作为img标签的src属性显示图片
						const tempFilePaths = res.tempFiles[0].path
						let filename = res.tempFiles[0].name; //用于页面显示的名字
						
						// console.log(filename)
						// 这一步判断可以省略,如果需求没有格式要求的话
						if(filename.indexOf(".pdf")==-1){
							that.$toast('暂时仅支持pdf格式的文件')
							return
						} else if (res.tempFiles[0].size > (10 * 1024 * 1024)) { //这里限制了文件的大小和具体文件类型,如果不限制文件类型则去掉'|| filename.indexOf(".pdf") == -1'
							that.$toast('文件大小不能超过10MB')
							// wx.showToast({
							// 		title: '文件大小不能超过10MB',
							// 		icon: "none",
							// 		duration: 2000,
							// 		mask: true
							// })
             } else {
							// console.log("开始上传")
							uni.uploadFile({
								url: uni.$u.http.config.baseURL + 'file/upload', // '这里是您后台提供文件上传的API':上传的路径
								filePath: tempFilePaths, //刚刚在data保存的文件路径
								name: 'file',   //后台获取的凭据
								formData:{ //如果是需要带参数,请在formData里面添加,不需要就去掉这个就可以的
									fileGroup: 'leasContract'
								},
								header: {
									'Content-Type': 'multipart/form-data',
									'Authorization': 'Bearer ' + getToken(),
								},
								success: (uploadFileRes) => {
									// console.log(uploadFileRes)
									if (uploadFileRes.errMsg === 'uploadFile:ok') {
										let result = JSON.parse(uploadFileRes.data)
										// console.log('=====', result)
										that.pdfInfo.push({name: filename, url: result.data.previewUrl})
										that.$forceUpdate() //有时候页面渲染不上,这里强制刷新
										if (result.code === 200 && result.headImg) {
											this.$toast('保存成功')
										}
									}
								}
							})
							// console.log('上传到服务器')
						}
					},
					fail: (err) => {
						console.log(err, 'err');
						that.$forceUpdate()
					}
				})
			},
			// 删除pdf
			deleteFile() {
				this.pdfInfo = []
			},
			// 预览pdf
			jump(linkUrl) {
        // console.log("发送跳转页面地址112:" + linkUrl)
				if(linkUrl){
					let linkUrlNew = encodeURIComponent(linkUrl)
					// console.log("发送跳转页面地址111:" + linkUrlNew )
					uni.navigateTo({
						url: '/subPackages/home/claim/index?url='+ linkUrlNew
					})
				}
      },
			
 
			// 提交
			submitFunc() {
				if (this.btnStatus) {
					return
				}
				let that = this


				// 限制用户多次触发
				this.btnStatus = true
				that.$refs.uForm.validate().then(res => {
					let params = {
						recordId: that.recordId,
						occurreTime: that.form.occurreTime,
						type: that.form.type,
						description: that.form.description
					}
					// 附件pdf
					if(this.pdfInfo.length>0) {
						params.attachment = this.pdfInfo[0].picUrl
						params.attachmentName = this.pdfInfo[0].name
					}
					console.log('提交的表单', params)
					uni.showLoading({
						title: '提交中'
					})
					this.$http.post('/mobile/leaseContract/insurance/claim', params).then((res) => {
						if (res.code === 200) {
							// console.log(res)
							uni.hideLoading()
							this.successModalShow = true
							setTimeout(function() {
								that.btnStatus = false
							}, 1100)
						}
					})
					.catch((error) => {
						console.log(error)
						uni.hideLoading()
						this.$toast(error.msg)
						// 填好提交,但是接口报错,这里要释放按钮限制
						that.btnStatus = false
					})
				}).catch(errors => {
					// uni.$u.toast('校验失败')
					// 没有填写信息,就点击了提交按钮,校验不通过,然后填好信息后,再点击提交
					that.btnStatus = false
				})
			},
			
			// 提交成功后的弹窗
			cancelFunc () {
				this.successModalShow = false
				// uni.switchTab({ url: '/pages/index' })
				uni.redirectTo({ url: '/pages/index' })
				// uni.navigateBack()
			},
			confirmFunc () {
				this.successModalShow = false
				let params = {
					from: 'addform',
					id: this.vehOptions.vehicleId,
					vin: this.vehOptions.vin,
					licensePlate: this.vehOptions.licensePlate
				}
				uni.redirectTo({ url: '/subPackages/home/record/claim'  + uni.$u.queryParams(params)})
			},
			
		}
	}
</script>

<style scoped lang="scss">
.mainInnBox {
	height: 100vh;
	padding-top: 18rpx;
	padding-bottom: calc(18rpx + constant(safe-area-inset-bottom));
	padding-bottom: calc(18rpx + env(safe-area-inset-bottom));
	background: #FFFFFF;
	border-top: 20rpx solid #EDF1F5;
	.formBox {
		flex: 1;
		// background-color: #fff;
		padding: 0 48rpx 150rpx;
		.item {
			display: flex;
			flex-direction: row;
			padding: 28rpx 0;
			border-bottom: 1rpx solid #EDF1F5;
			position: relative;
			
			.label {
				font-family: PingFangSC, PingFang SC;
				font-weight: 400;
				font-size: 28rpx;
				color: #666666;
				text-align: left;
				font-style: normal;
				margin-right: 40rpx;
			}
			.inBox {
				flex: 1;
				display: flex;
				align-items: center;
				justify-content: flex-end;
				
				.input {
					text-align: right;
					color: #212121;
					font-family: PingFangSC, PingFang SC;
					font-weight: 400;
					font-size: 28rpx;
				}
			}
			
			&.block {
				flex-direction: column;
				border: 0;
				padding: 28rpx 0 0 0;
				
				.inBox {
					flex: 1;
					display: flex;
					align-items: center;
					justify-content: flex-start;
					border-bottom: 1rpx solid #EDF1F5;
					padding: 0 0 24rpx 0;
					
					.input {
						text-align: left;
						color: #212121;
					}
				}
			}
			.dateBox {
				position: absolute;
				left: 0;
				right: 0;
				top: 0;
				bottom: 0;
				z-index: 999;
			}
			.tip {
				font-family: PingFangSC, PingFang SC;
				font-weight: 400;
				font-size: 28rpx;
				color: #999999;
				font-style: normal;
				margin: 16rpx 0 20rpx 0;
			}
			.update {
				width: 136rpx;
				height: 136rpx;
				background: #FFFFFF;
				border-radius: 12rpx;
				border: 2rpx dashed #126DCC;
			}
		}
	}
	
	.form_label {
		color: #303133;
		font-size: 30rpx;
		padding-top: 20rpx;
	}
	.form_label_tip {
		font-weight: 400;
		font-size: 28rpx;
		color: #999999;
	}
	.btnBox {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 1;
		padding-top: 32rpx;
		padding-bottom: calc(32rpx + constant(safe-area-inset-bottom));
		padding-bottom: calc(32rpx + env(safe-area-inset-bottom));
		
		.btn {
			width: 600rpx;
			height: 80rpx;
			background: #4095FF;
			box-shadow: 0rpx -4rpx 20rpx 0rpx rgba(0,0,0,0.06);
			border-radius: 12rpx;
			margin: 0 auto;
			border-radius: 12rpx;
			font-family: PingFangSC, PingFang SC;
			font-weight: 500;
			font-size: 32rpx;
			color: #FFFFFF;
			line-height: 80rpx;
			letter-spacing: 2px;
			text-align: center;
			font-style: normal;
		}
	}
}

.uploadContent {
	padding-top: 20rpx;
	.uploadFileBox {
		display: flex;
		justify-content: space-between;
		background: #eeeeee;
    padding: 18rpx 30rpx;
    border-radius: 4rpx;
	}
	.uploadChoose {
		width: 140rpx;
		height: 140rpx;
		background: #EDF1F5;
		display: flex;
		align-items: center;
		justify-content: center;
	}
	
}
</style>

 pdf.vue

<template>
	<!-- <view>kkkk</view> -->
	<!-- <web-view src="https://www.baidu.com/"></web-view> -->
	<web-view :src="toUrl"></web-view>
</template>

<script>
	// import { getToken } from '@/assets/scripts/auth'
	export default {
		data() {
			return {
				toUrl: '' // http://112.17.37.24:6090/web/country_6_wechart/stealOil_heatmap.html/?token=' + getToken() + '&httpUrl=' + 
			}
		},
		onLoad (option) {
			// console.log(option)
			this.toUrl = decodeURIComponent(option.url)
		}
	}
</script>

<style>
</style>

 pages.json

{
	// 如果您是通过uni_modules形式引入uView,可以忽略此配置
	"easycom": {
		"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
	},
	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
		{
			"path": "pages/index",
			"style": {
				"navigationStyle": "custom",
				"enablePullDownRefresh": true
			}
		},
		{
			"path": "pages/login/login",
			"style": {
				"navigationStyle": "custom",
				"enablePullDownRefresh": false
			}
		},
		{
			"path": "pages/home/index",
			"style": {
				"navigationStyle": "custom",
				"enablePullDownRefresh": true
			}
		},
		{
			"path": "pages/vehicles/index",
			"style": {
				"navigationStyle": "custom"
			}
		},
		{
			"path": "pages/user/index",
			"style": {
				"navigationBarTitleText": "我的"
			}
		},
		{
			"path": "pages/warn/index",
			"style": {
				"navigationBarTitleText": "报警"
			}
		}
	],
	"subPackages": [
		{
			"root": "subPackages",
			"pages": [
				{
					"path": "home/claim/index",
					"style": {
						"navigationBarTitleText": "出险上报",
						"enablePullDownRefresh": false
					}
				},
				{
					"path": "home/claim/pdf",
					"style": {
						"navigationBarTitleText": "预览PDF",
						"enablePullDownRefresh": false
					}
				}, 
			]
		}
	],
	"globalStyle": {
		"navigationBarTextStyle": "black",
		"navigationBarTitleText": "",
		"navigationBarBackgroundColor": "#FFF",
		"backgroundColor": "#FFF",
		"enablePullDownRefresh": false,
		"onReachBottomDistance": 100
	}
}

wx.chooseMessageFile 使用小程序API,要登录小程序管理后台,设置用户隐私协议:设置--基本信息--服务内容声明。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Window版本nginx修改文件访问句柄数被限制,解决大并发量访问时无法响应问题

目录 一、问题背景 二、问题分析 三、解决办法 一、问题背景 Windows版本因为文件访问句柄数被限制为1024了&#xff0c;当大并发量访问时就会无法响应。会有如下错误提示&#xff1a;maximum number of descriptors supported by select() is 1024 while connecting to ups…

C# 基础语法(一篇包学会的)

C#&#xff08;读作"C Sharp"&#xff09;是一种现代的、通用的面向对象编程语言&#xff0c;由微软公司开发。它结合了C和C的强大特性&#xff0c;并去掉了一些复杂性&#xff0c;使得开发者可以更加高效地编写代码。 一、入坑C# (一) 安装和设置 首先&#xff0c…

【LeetCode】从中序与后序遍历序列构造二叉树

目录 一、题目二、解法完整代码 一、题目 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

鸿蒙OpenHarmony Native API【Rawfile】

Rawfile Overview Description: 提供操作rawfile目录和rawfile文件的功能 提供操作rawfile目录和rawfile文件功能 功能包括遍历、打开、搜索、读取和关闭rawfile Since: 8 Version: 1.0 Summary Files File NameDescription[raw_dir.h]提供rawfile目录相关功能[raw…

Debian Linux下rclone挂载谷歌云盘碰到的坑

可能是明月好久没有使用境外服务器挂载境外的云盘缘故吧,今天一个代维客户需要他的Linux服务器挂载谷歌云盘好进行云备份,本来是个很简单的事儿,没想到在rclone连接谷歌云盘的时候卡壳了,可是把明月给难为坏了,搜索到的简体中文教程倒是很多,但没有一个提到这个“坑”,最…

Docker启动PostgreSql并设置时间与主机同步

在 Docker 中启动 PostgreSql 时&#xff0c;需要配置容器的时间与主机同步。可以通过在 Dockerfile 或者 Docker Compose 文件中设置容器的时区&#xff0c;或者使用宿主机的时间来同步容器的时间。这样可以确保容器中的 PostgreSql 与主机的时间保持一致&#xff0c;避免在使…

C语言数组的相关案例

引导案例&#xff1a; 数组的遍历&#xff1a;这里需要注意的是我们在遍历数组时是使用for循环&#xff0c;这里则需要计算数组的长度 计算公式&#xff1a;sizeof(数组名) / sizeof(数组的数据类型) #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8 ,9,…

大厂面试-基本功

大厂面试第4季 服务可用性多少个9是什么意思遍历集合add或remove操作bughashcode冲突案例BigdecimalList去重复IDEA Debugger测试框架ThreaLocal父子线程数据同步 InheritableThreadLocal完美解决线程数据同步方案 TransmittableThreadLocal 服务可用性多少个9是什么意思 遍历集…

增值税发票核验API在Java、Python、PHP中的使用教程

在企业经营中&#xff0c;发票扮演着记录交易、报销和纳税的重要角色。然而&#xff0c;由于发票的众多类型和复杂的制作方式&#xff0c;一些企业可能面临着假发票、冒充发票等风险。为了提高财务管理的效率和准确性&#xff0c;以及防范不法行为&#xff0c;增值税发票核验成…

定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份

定制QCustomPlot 带有ListView的QCustomPlot 文章目录 定制QCustomPlot 带有ListView的QCustomPlot摘要需求描述实现关键字: Qt、 QCustomPlot、 魔改、 定制、 控件 摘要 先上效果,是你想要的,再看下面的分解,顺便点赞搜藏一下;不是直接右上角。 QCustomPlot是一款…

Jenkins-zookeeper-docker-xxljob-rancher

文章目录 Jenkins实战1 新建任务需要的配置pipeline Zookeeper基础 Docker基础实操windows11 docker mysql DockerhouseDockerhubxxl-Job基础实战 Rancher基础思考 实战1 Rancher的某个namespace的scale为0 Jenkins 实战 1 新建任务需要的配置pipeline 该代码是Jenkinsfile&…

【接口自动化_08课_Pytest+Yaml+Allure框架】

上节课一些内容 的补充 1、openxl这个方法&#xff0c;第一个元素是从1开始的&#xff0c;不是从0开始 回写的列在程序里写的是11&#xff0c;是因为是固定值 一、1. Yaml入门及应用 1、什么是yaml YAML&#xff08;/ˈjməl/&#xff0c;尾音类似camel骆驼&#xff09;是一…

探索Python日志管理的优雅之道:Loguru库入门指南

探索Python日志管理的优雅之道&#xff1a;Loguru库入门指南 背景&#xff1a;为何选择Loguru&#xff1f; 在Python开发过程中&#xff0c;日志记录是不可或缺的一部分&#xff0c;它帮助我们追踪程序的运行状态&#xff0c;调试程序错误&#xff0c;并记录关键信息。然而&am…

【Linux】-----权限详解

目录 一、Linux下的权限概念 Ⅰ、是什么&#xff1f; Ⅱ、Linux下的两种角色 角色 如何添加普通用户 身份的转化方式 身份的提权 添加普通用户至白名单 二、Linux下的权限管理 Ⅰ、文件访问者的分类(Linux下的“人”) Ⅱ、文件类型和访问权限(事物属性) 1.文件类型 …

使用AOP优化Spring Boot Controller参数:自动填充常用字段的技巧

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 使用AOP优化Spring Boot Controller参数&#xff1a;自动填充常用字段的技巧 前言为什么使用AOP为…

2-41 基于matlab的小车倒立摆系统的控制及GUI动画演示

基于matlab的小车倒立摆系统的控制及GUI动画演示。输入小车及倒立摆的初始参数&#xff0c;位置参数&#xff0c;对仿真时间和步长进行设置&#xff0c;通过LQR计算K值&#xff0c;进行角度、角速度、位置、速度仿真及曲线输出&#xff0c;程序已调通&#xff0c;可直接运行。 …

昇思MindSpore学习总结十七 —— 基于MindSpore通过GPT实现情感分类

1、要求 2、导入了一些必要的库和模块 以便在使用MindSpore和MindNLP进行深度学习任务时能使用各种功能&#xff0c;比如数据集处理、模型训练、评估和回调功能。 import os # 导入操作系统相关功能的模块&#xff0c;如文件和目录操作import mindspore # 导入MindSpore库&a…

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…

基于WebGoat平台的SQL注入攻击

目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素&#xff08;机密性、完整性、可用性&…