uniapp小程序上传pdf文件

news2024/9/23 3:19:22

<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,要登录小程序管理后台,设置用户隐私协议:设置--基本信息--服务内容声明。

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

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

相关文章

抖音seo短视频账号矩阵系统源码-SaaS开源部署流程开发者技术分享

抖音seo账号矩阵系统&#xff0c;短视频矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。使用矩阵系统也能保证账号的稳定性&#xff0c;降低账号的风险…

数据结构之双向链表(赋源码)

数据结构之双向链表(源码) 线性表 双向链表是线性表链式存储结构的一种&#xff0c;若对链式存储结构进行分类可以分为八种。 带头、不带头&#xff1a;指的是该连链表有无头节点&#xff0c;头节点不存放任何内容&#xff0c;它不一定是链表必备的元素&#xff0c;而一个链…

ros2--launch

是什么 ros2的多节点启动工具。 作用 通过launch工具执行launch文件&#xff0c;可以启动launch文件中配置的多个节点&#xff0c;以及这些启动的节点配置数据。 launch文件的实现 ROS2的launch文件有三种格式&#xff0c;python、xml、yaml。 链接 python语言创建launch文…

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…

微服务实战系列之玩转Docker(三)

前言 镜像&#xff08;Image&#xff09;作为Docker的“水源”&#xff0c;取之于它&#xff0c;用之于它。这对于立志成为运维管理的撒手锏——Docker而言&#xff0c;重要性不言而喻。 我们在虚拟机时代&#xff08;当然现在依然ing…&#xff09;&#xff0c;如何快速完成…

硅谷裸机云多IP服务器怎么样?

硅谷裸机云多IP服务器是一种在硅谷地区提供的、具有多个IP地址的裸机云服务器。这种服务器结合了裸机服务器的高性能和云服务器的灵活性&#xff0c;同时提供了多个IP地址&#xff0c;为用户的各种需求提供了支持。以下是关于硅谷裸机云多IP服务器的一些详细信息&#xff0c;ra…

3.RabbitMQ安装-Centos7

官方网址&#xff1a;gInstalling RabbitMQ | RabbitMQ 安装前提&#xff0c;需要一个erlang语言环境。 下载 erlang: Releases rabbitmq/erlang-rpm GitHub rabbitmq-server: 3.8.8 Releases rabbitmq/rabbitmq-server GitHub 安装命令 (说明i表示安装&#xff…

华清数据结构day2 24-7-17

1> 完成班级的创建&#xff0c;创建时&#xff0c;需要传递班级实际人数 2> 完成班级学生的信息录入工作 3> 完成将班级学生按成绩进行降序排序工作 4> 输出班级中成绩最好和最差学生的信息 5> 完成信息的输出工作 6> 完成班级的销毁工作 要求&#xff1a;班…

基于springboot+vue+uniapp的驾校预约平台小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

小程序图片下载保存方法,图片源文件保存!

引言 现在很多时候我们在观看到小程序中的图片的时候&#xff0c;想保存图片的原文件格式的话&#xff0c;很多小程序是禁止保存的&#xff0c;即使是让保存的话&#xff0c;很多小程序也会限制不让保存原文件&#xff0c;只让保存一些分辨率很低的&#xff0c;非常模糊的图片…

leetcode简单题27 N.119 杨辉三角II rust描述

// 直接生成杨辉三角当前行 pub fn get_row(row_index: i32) -> Vec<i32> {let mut row vec![1; (row_index 1) as usize];for i in 1..row_index as usize {for j in (1..i).rev() {row[j] row[j] row[j - 1];}}row } // 空间优化的方法 pub fn get_row2(row_ind…

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点&#xff0c;就使整个单链表形成一 个环&#xff0c;这种头尾相接的单链表称为单循环链表&#xff0c;简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…

stm32学习:(寄存器3)系统架构

时钟系统 时钟树 在STM32中有3种不同的时钟源用来驱动系统时钟(SYSCLK)&#xff1a; HSI振荡器时钟&#xff08;High Speed Internal oscillator&#xff0c;高速内部时钟&#xff09;HSE振荡器时钟&#xff08;High Speed External&#xff08;Oscillator / Clock&#xff…

RK3588读取不到显示器edid

问题描述 3588HDMIout接老的显示器或者HDMI转DVI接DVI显示器显示不了或者显示内容是彩色条纹,但是这种显示器测试过如果接笔记本或者主机是可以直接显示的。这一类问题是HDMI下的i2c与显示器通讯没成功,读取不到设备的edid。问题包括全志的H3 、AML的S905都有遇到 测试环境…

基于Web的特产美食销售系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

用太空办公桌spacedesk把废旧平板利用起来

正文共&#xff1a;1500 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 这些年积攒了不少电子设备&#xff0c;比如我现在手头上还有6部手机、4台电脑、2个平板。手机的话&#xff0c;之前研究过作为Linux服务器来使用&#xff08;使用UserLAnd给华为平板装个Linux系统&…

网络安全(含面试题版)

一、网络概念 网络&#xff1a;一组相互连接的计算机&#xff0c;多台计算机组成&#xff0c;使用物理线路进行连接 作用&#xff1a; 数据交换 资源共享 二、网络分类 计算机网络覆盖的地理区域决定了它的类型。一般分为局域网(LAN)、城域网(MAN)、广域网(WAN)。 三、www万维网…

分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法

前言 树形结构是一种很常见的数据结构&#xff0c;类似于现实生活中的树的结构&#xff0c;具有根节点、父子关系和层级结构。 所谓根节点&#xff0c;就是整个树的起始节点。 节点则是树中的元素&#xff0c;每个节点可以有零个或多个子节点&#xff0c;节点按照层级排列&a…

js | Core

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ Object 是什么&#xff1f; 属性[[prototype]]对象。 例如&#xff0c;下面的&#xff0c;son是对象&#xff0c;foo不是对象。打印出来的son&#xff0c;能看到有一个prototype 对象。 prototype vs _proto_ v…

水利行业的智慧革命:深度剖析智慧水利解决方案,看其如何以科技力量提升水资源管理效率,保障水生态安全

目录 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心要素 1. 感知层&#xff1a;全面监测&#xff0c;精准感知 2. 网络层&#xff1a;互联互通&#xff0c;信息共享 3. 平台层&#xff1a;数据分析&#xff0c;智能决策 4. 应用层&#xff1a;精准施策&#xff0…