Browse Source

页面搭建

zouling 1 năm trước cách đây
mục cha
commit
da8bdddaac

+ 10 - 4
components/toptab/stepbar.vue

@@ -1,10 +1,10 @@
 <template>
   <view class="stepbar" :class="fixeda?'sfixed':''">
 	  <block v-for="(ite,idx) in steps" :key="idx">
-		  <view class="steps" :class="ite.status==1?'act':''">
-		  	<image :src="filln" class="img" v-if="ite.status==0"></image>
-		  	<image :src="fillin" class="img" v-if="ite.status==1"></image>
-		  	<image :src="fillf" class="img" v-if="ite.status==2"></image>
+		  <view class="steps" :class="ite.status==stepval?'act':''">
+		  	<image :src="fillf" class="img" v-if="ite.status<stepval"></image>
+		  	<image :src="fillin" class="img" v-else-if="ite.status==stepval"></image>
+			<image :src="filln" class="img" v-else></image>
 		  	<view class="tit">{{ite.tit}}</view>
 			<image :src="line" class="line"></image>
 		  </view>
@@ -22,6 +22,12 @@
 				return []
 			}
 		},
+		stepval:{
+			type: [Number,String],
+			default () {
+				return 0
+			}
+		},
 		fixeda:{
 			type: Boolean,
 			default () {

+ 36 - 0
pages.json

@@ -211,6 +211,42 @@
 					"h5":{"titleNView":false}
 				}
 			},
+			{
+				"path": "pages/business/sign",
+				"style": {
+					"navigationBarTitleText": "采集签名",
+					"navigationBarBackgroundColor": "#00A9F0",
+					"navigationBarTextStyle": "white",
+					"h5":{"titleNView":false}
+				}
+			},
+			{
+				"path": "pages/file/list",
+				"style": {
+					"navigationBarTitleText": "文件管理",
+					"navigationBarBackgroundColor": "#00A9F0",
+					"navigationBarTextStyle": "white",
+					"h5":{"titleNView":false}
+				}
+			},
+			{
+				"path": "pages/file/details",
+				"style": {
+					"navigationBarTitleText": "文件管理",
+					"navigationBarBackgroundColor": "#00A9F0",
+					"navigationBarTextStyle": "white",
+					"h5":{"titleNView":false}
+				}
+			},
+			{
+				"path": "pages/file/wjdetails",
+				"style": {
+					"navigationBarTitleText": "文件详情列表",
+					"navigationBarBackgroundColor": "#00A9F0",
+					"navigationBarTextStyle": "white",
+					"h5":{"titleNView":false}
+				}
+			},
 			{
 				"path": "pages/custom/details",
 				"style": {

+ 1 - 1
pages/custom/index.vue

@@ -220,7 +220,7 @@ page{background-color: #f6f6f6;}
 }
 .zxbox{ 
 	.bgimg{width: 100%;height: 420rpx;}
-	.zxmain{position: relative;padding: 60rpx 36rpx 0;
+	.zxmain{position: relative;padding: 48rpx 36rpx 0;
 	
 	}
 

+ 5 - 2
pages/index/index.vue

@@ -57,7 +57,7 @@
 						<view class="img"><image :src="topgimg" class="imge"></image></view>
 						<view>台账表</view>
 					</view>
-					<view class="grid-item-box">
+					<view class="grid-item-box" @click="getFileFn">
 						<view class="img"><image :src="tophimg" class="imgf"></image></view>
 						<view>文件管理</view>
 					</view>
@@ -234,6 +234,9 @@
 		getNoticeFn(){
 			this.$tab.navigateTo("/pages/index/notice")
 		},
+		getFileFn(){
+			this.$tab.navigateTo("/work/pages/file/list")
+		},
 		getNoticeDet(){
 			
 		},
@@ -339,7 +342,7 @@ page{background-color: #FFFFFF;}
 	}
 	.topc{border-radius: 34rpx;height:68rpx;box-sizing: border-box;padding:0 32rpx 0 32rpx ;position: relative;flex:1;background-color: #FFFFFF;
 	 input{font-weight: 500;font-size: 26rpx;color: #222327;}
-	 image{width: 30rpx;height: 30rpx;margin-right: 24rpx;}
+	 image{width: 30rpx;height: 30rpx;margin-right: 24rpx;flex: 0 0 auto;}
 	 }
 	.topr{width: 48rpx;height: 38rpx;position: relative;margin-right: 10rpx;
 		image{width: 32rpx;height: 38rpx;margin: 0 auto;}

+ 1 - 0
pages/work/index.vue

@@ -225,6 +225,7 @@
 				pageNum: this.pageNum,
 				// visitType:3
 			}
+			// 业务 是归档后 的数据
 			getReservatList(params).then(res=>{
 				if(res.code==200){
 					if (res.rows.length < this.pageSize) {

BIN
static/images/home/hsearch.png


+ 2 - 1
static/style.css

@@ -84,8 +84,9 @@ font-size: 30rpx;color: #FFFFFF;background: #00A9F0;text-align: center;line-heig
 .fw5{font-weight: 500;}
 .fwn{font-weight: normal;}
 
-.f12{font-size: 24rpx;}
+.f12{font-size: 24rpx !important;}
 .f15{font-size: 30rpx;}
+.f20{font-size: 40rpx !important;}
 .co23{color: #222327;}
 .coa{color: #AAAAAA !important;;}
 .co1y{color: #17CF5F !important;}

+ 108 - 0
uni_modules/lsj-upload/changelog.md

@@ -0,0 +1,108 @@
+## 2.2.6(2023-02-09)
+修复多个文件同时选择时返回多次change回调的问题
+## 2.2.5(2022-12-27)
+1.修复多选文件时未能正常校验数量的问题;
+2.app端与H5端支持单选或多选文件,通过count数量控制,超过1开启多选。
+## 2.2.4(2022-12-27)
+1.修复多选文件时未能正常校验数量的问题;
+2.app端修复多选只取到第一个文件的问题。
+## 2.2.3(2022-12-06)
+修复手动调用show()导致count失效的问题
+## 2.2.2(2022-12-01)
+Vue3自行修改兼容
+## 2.2.1(2022-10-19)
+修复childId警告提示
+## 2.2.0(2022-10-10)
+更新app端webview窗口参数clidId,默认值添加时间戳保证唯一性
+## 2.1.9(2022-07-13)
+[修复] app端选择文件后初始化设置的文件列表被清空问题
+## 2.1.8(2022-07-13)
+[新增] ref方法初始化文件列表,用于已提交后再次编辑时需带入已上传文件:setFiles(files),可传入数组或Map对象,传入格式请与组件选择返回格式保持一致,且name为必须属性。
+## 2.1.7(2022-07-12)
+修复ios端偶现创建webview初始化参数未生效的问题
+## 2.1.6(2022-07-11)
+[修复]:修复上个版本更新导致nvue窗口组件不能选择文件的问题;
+[新增]:
+1.应群友建议(填写禁止格式太多)格式限制formats由原来填写禁止选择的格式改为填写允许被选择的格式;
+2.应群友建议(增加上传结束回调事件),上传结束回调事件@uploadEnd
+3.如能帮到你请留下你的免费好评,组件使用过程中有问题可以加QQ群交流,至于Map对象怎么使用这类前端基础问题请自行百度
+## 2.1.5(2022-07-01)
+app端组件销毁时添加自动销毁webview功能,避免v-if销毁组件的情况控件还能被点击的问题
+## 2.1.4(2022-07-01)
+修复小程序端回显问题
+## 2.1.3(2022-06-30)
+回调事件返回参数新增path字段(文件临时地址),用于回显
+## 2.1.2(2022-06-16)
+修复APP端Tabbar窗口无法选择文件的问题
+## 2.1.1(2022-06-16)
+优化:
+1.组件优化为允许在v-if中使用;
+2.允许option直接在data赋值,不再强制在onRead中初始化;
+## 2.1.0(2022-06-13)
+h5 pc端更改为单次可多选
+## 2.0.9(2022-06-10)
+更新演示内容,部分同学不知道怎么获取服务端返回的数据
+## 2.0.8(2022-06-09)
+优化动态更新上传参数函数,具体查看下方说明:动态更新参数演示
+## 2.0.7(2022-06-07)
+新增wxFileType属性,用于小程序端选择附件时可选文件类型
+## 2.0.6(2022-06-07)
+修复小程序端真机选择文件提示失败的问题
+## 2.0.5(2022-06-02)
+优化小程序端调用hide()后未阻止触发文件选择问题
+## 2.0.4(2022-06-01)
+优化APP端选择器初始定位
+## 2.0.3(2022-05-31)
+修复nvue窗口选择文件报错问题 
+## 2.0.2(2022-05-20)
+修复ios端opiton设置过早未传入webview导致不自动上传问题
+## 2.0.1(2022-05-19)
+修复APP端子窗口点击选择文件不响应问题
+## 2.0.0(2022-05-18)
+此次组件更新至2.0版本,与1.0版本使用上略有差异,已使用1.0的同学请自行斟酌是否需要升级!
+部分差异:
+一、 2.0新增异步触发上传功能;
+二、2.0新增文件批量上传功能;
+三、2.0优化option,剔除属性,只保留上传接口所需字段,且允许异步更改option的值;
+四、组件增加size(文件大小限制)、count(文件个数限制)、formats(文件后缀限制)、accept(文件类型限制)、instantly(是否立即自动上传)、debug(日志打印)等属性;
+五、回调事件取消input事件、callback事件,新增change事件和progress事件;
+六、ref事件新增upload事件、clear事件;
+七、优化组件代码,show和hide函数改为显示隐藏,不再重复开关webview;
+
+## 1.2.3(2022-03-22)
+修复Demo里传入待完善功能[手动上传属性manual=true]导致不自动上传的问题,手动提交上传待下个版本更新
+## 1.2.2(2022-02-21)
+修复上版本APP优化导致H5和小程序端不自动初始化的问题,此次更新仅修复此问题。异步提交功能下个版本更新~
+## 1.2.1(2022-01-25)
+QQ1群已满,已开放2群:469580165
+## 1.2.0(2021-12-09)
+优化APP端页面中DOM重排后每次需要重新定位的问题
+## 1.1.1(2021-12-09)
+优化,与上版本使用方式有改变,请检查后确认是否需要更新,create更名为show,  close更名为hide,取消初始化时手动create, 传参方式改为props=>option
+## 1.1.0(2021-12-09)
+新增refresh方法,用于DOM发生重排时重新定位控件(APP端)
+## 1.0.9(2021-07-15)
+修复上传进度未同步渲染,直接返回100%的BUG
+## 1.0.8(2021-07-12)
+修复H5端传入height和width未生效的bug
+## 1.0.7(2021-07-07)
+修复h5和小程序端上传完成callback未返回fileName字段问题
+## 1.0.6(2021-07-07)
+修复h5端提示信息debug
+## 1.0.5(2021-06-29)
+感谢小伙伴找出bug,上传成功回调success未置为true,已修复
+## 1.0.4(2021-06-28)
+新增兼容APP,H5,小程序手动关闭控件,关闭后不再弹出文件选择框,需要重新create再次开启
+## 1.0.3(2021-06-28)
+close增加条件编译,除app端外不需要close
+## 1.0.2(2021-06-28)
+1.修复页面滚动位置后再create控件导致控件位置不正确的问题;
+2.修复nvue无法create控件;
+3.示例项目新增nvue使用案例;
+## 1.0.1(2021-06-28)
+因为有的朋友不清楚app端切换tab时应该怎么处理webview,现重新上传一版示例项目,需要做tab切换的朋友可以导入示例项目查看
+## 1.0.0(2021-06-25)
+此插件为l-file插件中上传功能改版,更新内容为:
+1. 按钮内嵌入页面,不再强制固定底部,可跟随页面滚动
+2.无需再单独弹框点击上传,减去中间层
+3.通过slot自定义按钮样式

+ 396 - 0
uni_modules/lsj-upload/components/lsj-upload/LsjFile.js

@@ -0,0 +1,396 @@
+export class LsjFile {
+	constructor(data) {
+		this.dom = null;
+		// files.type = waiting(等待上传)|| loading(上传中)|| success(成功) || fail(失败)
+		this.files = new Map();
+		this.debug = data.debug || false;
+		this.id = data.id;
+		this.width = data.width;
+		this.height = data.height;
+		this.option = data.option;
+		this.instantly = data.instantly;
+		this.prohibited = data.prohibited;
+		this.onchange = data.onchange;
+		this.onprogress = data.onprogress;
+		this.uploadHandle = this._uploadHandle;
+		// #ifdef MP-WEIXIN
+		this.uploadHandle = this._uploadHandleWX;
+		// #endif
+	}
+	
+	
+	/**
+	 * 创建File节点
+	 * @param {string}path webview地址
+	 */
+	create(path) {
+		if (!this.dom) {
+			// #ifdef H5
+				let dom = document.createElement('input');
+				dom.type = 'file'
+				dom.value = ''
+				dom.style.height = this.height
+				dom.style.width = this.width
+				dom.style.position = 'absolute'
+				dom.style.top = 0
+				dom.style.left = 0
+				dom.style.right = 0
+				dom.style.bottom = 0
+				dom.style.opacity = 0
+				dom.style.zIndex = 2
+				dom.accept = this.prohibited.accept;
+				if (this.prohibited.count > 1) {
+				dom.multiple = 'multiple';
+				}
+				dom.onchange = event => {
+					for (let file of event.target.files) {
+						if (this.files.size >= this.prohibited.count) {
+							this.toast(`只允许上传${this.prohibited.count}个文件`);
+							this.dom.value = '';
+							break;
+						}
+						this.addFile(file);
+					}
+					
+					this._uploadAfter();
+					
+					this.dom.value = '';
+				};
+				this.dom = dom;
+			// #endif
+		
+			// #ifdef APP-PLUS
+				let styles = {
+					top: '-200px',
+					left: 0,
+					width: '1px',
+					height: '200px',
+					background: 'transparent' 
+				};
+				let extras = {
+					debug: this.debug,
+					instantly: this.instantly,
+					prohibited: this.prohibited,
+				}
+				this.dom = plus.webview.create(path, this.id, styles,extras);
+				this.setData(this.option); 
+				this._overrideUrlLoading();
+			// #endif
+			return this.dom;
+		}
+	}
+	
+	
+	/**
+	 * 设置上传参数
+	 * @param {object|string}name 上传参数,支持a.b 和 a[b]
+	 */
+	setData() {
+		let [name,value = ''] = arguments;
+		if (typeof name === 'object') {
+			Object.assign(this.option,name);
+		}
+		else {
+			this._setValue(this.option,name,value);
+		}
+		
+		this.debug&&console.log(JSON.stringify(this.option));
+		
+		// #ifdef APP-PLUS
+			this.dom.evalJS(`vm.setData('${JSON.stringify(this.option)}')`);
+		// #endif
+	}
+	
+	/**
+	 * 上传
+	 * @param {string}name 文件名称
+	 */
+	async upload(name='') {
+		if (!this.option.url) {
+			throw Error('未设置上传地址');
+		}
+		
+		// #ifndef APP-PLUS
+			if (name && this.files.has(name)) {
+				await this.uploadHandle(this.files.get(name));
+			}
+			else {
+				for (let item of this.files.values()) {
+					if (item.type === 'waiting' || item.type === 'fail') {
+						await this.uploadHandle(item);
+					}
+				}
+			}
+		// #endif
+		
+		// #ifdef APP-PLUS
+			this.dom&&this.dom.evalJS(`vm.upload('${name}')`);
+		// #endif
+	}
+	
+	// 选择文件change
+	addFile(file,isCallChange) {
+		
+		let name = file.name;
+		this.debug&&console.log('文件名称',name,'大小',file.size);
+		
+		if (file) {
+			// 限制文件格式
+			let path = '';
+			let suffix = name.substring(name.lastIndexOf(".")+1).toLowerCase();
+			let formats = this.prohibited.formats.toLowerCase();
+			// #ifndef MP-WEIXIN
+				path = URL.createObjectURL(file);
+			// #endif
+			// #ifdef MP-WEIXIN
+				path = file.path;
+			// #endif
+			if (formats&&!formats.includes(suffix)) {
+				this.toast(`不支持上传${suffix.toUpperCase()}格式文件`);
+				return false;
+			}
+			// 限制文件大小
+			if (file.size > 1024 * 1024 * Math.abs(this.prohibited.size)) {
+				this.toast(`附件大小请勿超过${this.prohibited.size}M`)
+				return false;
+			}
+			this.files.set(file.name,{file,path,name: file.name,size: file.size,progress: 0,type: 'waiting'});
+			return true;
+		}
+	}
+	
+	/**
+	 * 移除文件
+	 * @param {string}name 不传name默认移除所有文件,传入name移除指定name的文件
+	 */
+	clear(name='') {
+		// #ifdef APP-PLUS
+		this.dom&&this.dom.evalJS(`vm.clear('${name}')`);
+		// #endif
+		
+		if (!name) {
+			this.files.clear();
+		}
+		else {
+			this.files.delete(name); 
+		}
+		return this.onchange(this.files);
+	}
+	
+	/**
+	 * 提示框
+	 * @param {string}msg 轻提示内容
+	 */
+	toast(msg) {
+		uni.showToast({
+			title: msg,
+			icon: 'none'
+		});
+	}
+	
+	/**
+	 * 微信小程序选择文件
+	 * @param {number}count 可选择文件数量
+	 */
+	chooseMessageFile(type,count) {
+		wx.chooseMessageFile({
+			count: count,
+			type: type,
+			success: ({ tempFiles }) => {
+				for (let file of tempFiles) {
+					this.addFile(file);
+				}
+				this._uploadAfter();
+			},
+			fail: () => {
+				this.toast(`打开失败`);
+			}
+		})
+	}
+	
+	_copyObject(obj) {
+		if (typeof obj !== "undefined") {
+			return JSON.parse(JSON.stringify(obj));
+		} else {
+			return obj;
+		}
+	}
+	
+	/**
+	 * 自动根据字符串路径设置对象中的值 支持.和[]
+	 * @param	{Object} dataObj 数据源
+	 * @param	{String} name 支持a.b 和 a[b]
+	 * @param	{String} value 值
+	 * setValue(dataObj, name, value);
+	 */
+	_setValue(dataObj, name, value) {
+		// 通过正则表达式  查找路径数据
+		let dataValue;
+		if (typeof value === "object") {
+			dataValue = this._copyObject(value);
+		} else {
+			dataValue = value;
+		}
+		let regExp = new RegExp("([\\w$]+)|\\[(:\\d)\\]", "g");
+		const patten = name.match(regExp);
+		// 遍历路径  逐级查找  最后一级用于直接赋值
+		for (let i = 0; i < patten.length - 1; i++) {
+			let keyName = patten[i];
+			if (typeof dataObj[keyName] !== "object") dataObj[keyName] = {};
+			dataObj = dataObj[keyName];
+		}
+		// 最后一级
+		dataObj[patten[patten.length - 1]] = dataValue;
+		this.debug&&console.log('参数更新后',JSON.stringify(this.option));
+	}
+	
+	_uploadAfter() {
+		this.onchange(this.files);
+		this.instantly&&this.upload();
+	}
+	
+	_overrideUrlLoading() {
+		this.dom.overrideUrlLoading({ mode: 'reject' }, e => {
+			let {retype,item,files,end} = this._getRequest(
+				e.url
+			);
+			let _this = this;
+			switch (retype) {
+				case 'updateOption':
+					this.dom.evalJS(`vm.setData('${JSON.stringify(_this.option)}')`);
+					break
+				case 'change':
+					try {
+						_this.files = new Map([..._this.files,...JSON.parse(unescape(files))]);
+					} catch (e) {
+						return console.error('出错了,请检查代码')
+					}
+					_this.onchange(_this.files);
+					break
+				case 'progress':
+					try {
+						item = JSON.parse(unescape(item));
+					} catch (e) {
+						return console.error('出错了,请检查代码')
+					}
+					_this._changeFilesItem(item,end);
+					break
+				default:
+					break
+			}
+		})
+	}
+	
+	_getRequest(url) {
+		let theRequest = new Object()
+		let index = url.indexOf('?')
+		if (index != -1) {
+			let str = url.substring(index + 1)
+			let strs = str.split('&')
+			for (let i = 0; i < strs.length; i++) {
+				theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1])
+			}
+		}
+		return theRequest
+	}
+	
+	_changeFilesItem(item,end=false) {
+		this.debug&&console.log('onprogress',JSON.stringify(item));
+		this.onprogress(item,end);
+		this.files.set(item.name,item);
+	}
+	
+	_uploadHandle(item) {
+		item.type = 'loading';
+		delete item.responseText;
+		return new Promise((resolve,reject)=>{
+			this.debug&&console.log('option',JSON.stringify(this.option));
+			let {url,name,method='POST',header,formData} = this.option;
+			let form = new FormData();
+			for (let keys in formData) {
+				form.append(keys, formData[keys])
+			}
+			form.append(name, item.file);
+			let xmlRequest = new XMLHttpRequest();
+			xmlRequest.open(method, url, true);
+			for (let keys in header) {
+				xmlRequest.setRequestHeader(keys, header[keys])
+			}
+			
+			xmlRequest.upload.addEventListener(
+				'progress',
+				event => {
+					if (event.lengthComputable) {
+						let progress = Math.ceil((event.loaded * 100) / event.total)
+						if (progress <= 100) {
+							item.progress = progress;
+							this._changeFilesItem(item);
+						}
+					}
+				},
+				false
+			);
+			
+			xmlRequest.ontimeout = () => {
+				console.error('请求超时')
+				item.type = 'fail';
+				this._changeFilesItem(item,true);
+				return resolve(false);
+			}
+			
+			xmlRequest.onreadystatechange = ev => {
+				if (xmlRequest.readyState == 4) {
+					if (xmlRequest.status == 200) {
+						this.debug&&console.log('上传完成:' + xmlRequest.responseText)
+						item['responseText'] = xmlRequest.responseText;
+						item.type = 'success';
+						this._changeFilesItem(item,true);
+						return resolve(true);
+					} else if (xmlRequest.status == 0) {
+						console.error('status = 0 :请检查请求头Content-Type与服务端是否匹配,服务端已正确开启跨域,并且nginx未拦截阻止请求')
+					}
+					console.error('--ERROR--:status = ' + xmlRequest.status)
+					item.type = 'fail';
+					this._changeFilesItem(item,true);
+					return resolve(false);
+				}
+			}
+			xmlRequest.send(form)
+		});
+	}
+	
+	_uploadHandleWX(item) {
+		item.type = 'loading';
+		delete item.responseText;
+		return new Promise((resolve,reject)=>{
+			this.debug&&console.log('option',JSON.stringify(this.option));
+			let form = {filePath: item.file.path,...this.option };
+			form['fail'] = ({ errMsg = '' }) => {
+				console.error('--ERROR--:' + errMsg)
+				item.type = 'fail';
+				this._changeFilesItem(item,true);
+				return resolve(false);
+			}
+			form['success'] = res => {
+				if (res.statusCode == 200) {
+					this.debug&&console.log('上传完成,微信端返回不一定是字符串,根据接口返回格式判断是否需要JSON.parse:' + res.data)
+					item['responseText'] = res.data;
+					item.type = 'success';
+					this._changeFilesItem(item,true);
+					return resolve(true);
+				}
+				item.type = 'fail';
+				this._changeFilesItem(item,true);
+				return resolve(false);
+			}
+			
+			let xmlRequest = uni.uploadFile(form);
+			xmlRequest.onProgressUpdate(({ progress = 0 }) => {
+				if (progress <= 100) {
+					item.progress = progress;
+					this._changeFilesItem(item);
+				}
+			})
+		});
+	}
+}

+ 316 - 0
uni_modules/lsj-upload/components/lsj-upload/lsj-upload.vue

@@ -0,0 +1,316 @@
+<template>
+	<view class="lsj-file" :style="[getStyles]">
+		<view ref="lsj" class="hFile" :style="[getStyles]" @click="onClick">
+			<slot><view class="defview" :style="[getStyles]">附件上传</view></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+// 查看文档:https://ext.dcloud.net.cn/plugin?id=5459
+import {LsjFile} from './LsjFile.js' 
+export default {
+	name: 'Lsj-upload',
+	props: {
+		// 打印日志
+		debug: {type: Boolean,default: false},
+		// 自动上传
+		instantly: {type: Boolean,default: false},
+		// 上传接口参数设置
+		option: {type: Object,default: ()=>{}},
+		// 文件大小上限
+		size: { type: Number, default: 10 },
+		// 文件选择个数上限,超出后不触发点击
+		count: { type: Number, default: 9 },
+		// 允许上传的文件格式(多个以逗号隔开)
+		formats: { type: String, default:''},
+		// input file选择限制
+		accept: {type: String,default: ''},
+		// 微信选择文件类型 
+		//all=从所有文件选择,
+		//video=只能选择视频文件,
+		//image=只能选择图片文件,
+		//file=可以选择除了图片和视频之外的其它的文件
+		wxFileType: { type: String, default: 'all' },
+		// webviewID需唯一,不同窗口也不要同Id
+		childId: { type: String, default: 'lsjUpload'  },
+		// 文件选择触发面宽度
+		width: { type: String, default: '100%' },
+		// 文件选择触发面高度
+		height: { type: String, default: '80rpx' },
+		
+		// top,left,bottom,right仅position=absolute时才需要传入
+		top: { type: [String, Number], default: '' },
+		left: { type: [String, Number], default: '' },
+		bottom: { type: [String, Number], default: '' },
+		right: { type: [String, Number], default: '' },
+		xmtype:{ type: [String, Number], default: '' },
+		// nvue不支持跟随窗口滚动
+		position: { 
+			type: String,
+			// #ifdef APP-NVUE
+			 default: 'absolute',
+			// #endif
+			// #ifndef APP-NVUE
+			default: 'static',
+			// #endif
+		},
+	},
+	data() {
+		return {
+			
+		}
+	},
+	watch: {
+		option(v) {
+			// #ifdef APP-PLUS
+			this.lsjFile&&this.show();
+			// #endif
+		}
+	},
+	updated() {
+		// #ifdef APP-PLUS
+			if (this.isShow) {
+				this.lsjFile&&this.show();
+			}
+		// #endif
+	},
+	computed: {
+		getStyles() {
+			let styles = {
+				width: this.width,
+				height: this.height
+			}
+			if (this.position == 'absolute') {
+				styles['top'] = this.top
+				styles['bottom'] = this.bottom
+				styles['left'] = this.left
+				styles['right'] = this.right
+				styles['position'] = 'fixed'
+			}
+
+			return styles
+		}
+	},
+	mounted() {
+		this._size = 0;
+		let WEBID = this.childId + new Date().getTime();
+		this.lsjFile = new LsjFile({
+			id: WEBID,
+			debug: this.debug,
+			width: this.width,
+			height: this.height,
+			option: this.option,
+			instantly: this.instantly,
+			// 限制条件
+			prohibited: {
+				// 大小
+				size: this.size,
+				// 允许上传的格式
+				formats: this.formats,
+				// 限制选择的格式
+				accept: this.accept,
+				count: this.count
+			},
+			onchange: this.onchange,
+			onprogress: this.onprogress,
+		});
+		this.create();
+		
+	},
+	beforeDestroy() {
+		// #ifdef APP-PLUS
+		this.lsjFile.dom.close();
+		// #endif
+	},
+	methods: {
+		setFiles(array) {
+			if (array instanceof Map) {
+				for (let [key, item] of array) {
+					item['progress'] = 100;
+					item['type'] = 'success';
+					this.lsjFile.files.set(key,item);
+				}
+			}
+			else if (Array.isArray(array)) {
+				array.forEach(item=>{
+					if (item.name) { 
+						item['progress'] = 100;
+						item['type'] = 'success';
+						this.lsjFile.files.set(item.name,item);
+					}
+				});
+			}
+			this.onchange(this.lsjFile.files);
+		},
+		setData() {
+			this.lsjFile&&this.lsjFile.setData(...arguments);
+		},
+		getDomStyles(callback) {
+			// #ifndef APP-NVUE
+			let view = uni
+				.createSelectorQuery()
+				.in(this)
+				.select('.lsj-file')
+			view.fields(
+				{
+					size: true,
+					rect: true
+				},
+				({ height, width, top, left, right, bottom }) => {
+					uni.createSelectorQuery()
+					.selectViewport()
+					.scrollOffset(({ scrollTop }) => {
+						return callback({
+							top: parseInt(top) + parseInt(scrollTop) + 'px',
+							left: parseInt(left) + 'px',
+							width: parseInt(width) + 'px',
+							height: parseInt(height) + 'px'
+						})
+					})
+					.exec()
+				}
+			).exec()
+			// #endif
+			// #ifdef APP-NVUE
+			const dom = weex.requireModule('dom')
+			dom.getComponentRect(this.$refs.lsj, ({ size: { height, width, top, left, right, bottom } }) => {
+				return callback({
+					top: parseInt(top) + 'px',
+					left: parseInt(left) + 'px',
+					width: parseInt(width) + 'px',
+					height: parseInt(height) + 'px',
+					right: parseInt(right) + 'px',
+					bottom: parseInt(bottom) + 'px'
+				})
+			})
+			// #endif
+		},
+		show() {
+			if (this._size && (this._size >= this.count)) {
+				return;
+			}
+			this.isShow = true;
+			// #ifdef APP-PLUS
+			this.lsjFile&&this.getDomStyles(styles => {
+				this.lsjFile.dom.setStyle(styles)
+			});
+			// #endif
+			// #ifdef H5
+			this.lsjFile.dom.style.display = 'inline'
+			// #endif
+		},
+		hide() {
+			this.isShow = false;
+			// #ifdef APP-PLUS
+			this.lsjFile&&this.lsjFile.dom.setStyle({
+				top: '-100px',
+				left:'0px',
+				width: '1px',
+				height: '100px',
+			});
+			// #endif
+			// #ifdef H5
+			this.lsjFile.dom.style.display = 'none'
+			// #endif
+		},
+		/**
+		 * 手动提交上传
+		 * @param {string}name 文件名称,不传则上传所有type等于waiting和fail的文件
+		 */
+		upload(name) {
+			this.lsjFile&&this.lsjFile.upload(name);
+		},
+		/**
+		 * @returns {Map} 已选择的文件Map集
+		 */
+		onchange(files) {
+			this.$emit('getFile',this.xmtype)
+			this.$emit('change',files);
+			this._size = files.size;
+			return files.size >= this.count ? this.hide() : this.show();
+		},
+		/**
+		 * @returns {object} 当前上传中的对象
+		 */
+		onprogress(item,end=false) {
+			this.$emit('progress',item);
+			if (end) {
+				setTimeout(()=>{
+					this.$emit('uploadEnd',item);
+				},0);
+			}
+		},
+		/**
+		 * 移除组件内缓存的某条数据
+		 * @param {string}name 文件名称,不指定默认清除所有文件
+		 */
+		clear(name) {
+			this.lsjFile.clear(name);
+		},
+		// 创建选择器
+		create() {
+			// 若iOS端服务端处理不了跨域就将hybrid目录内的html放到服务端去,并将此处path改成服务器上的地址
+			let path = '/uni_modules/lsj-upload/hybrid/html/uploadFile.html';
+			let dom = this.lsjFile.create(path);
+			// #ifdef H5
+			this.$refs.lsj.$el.appendChild(dom);
+			// #endif
+			// #ifndef APP-PLUS
+			this.show();
+			// #endif
+			// #ifdef APP-PLUS
+			dom.setStyle({position: this.position});
+			dom.loadURL(path);
+			setTimeout(()=>{
+				// #ifdef APP-NVUE
+				plus.webview.currentWebview().append(dom);
+				// #endif
+				// #ifndef APP-NVUE
+				this.$root.$scope.$getAppWebview().append(dom);
+				// #endif
+				this.show();
+			},300)
+			// #endif
+		},
+		// 点击选择附件
+		onClick() {
+			if (this._size >= this.count) {
+				this.toast(`只允许上传${this.count}个文件`);
+				return;
+			}
+			
+			// #ifdef MP-WEIXIN
+			if (!this.isShow) {return;}
+			let count = this.count - this._size;
+			this.lsjFile.chooseMessageFile(this.wxFileType,count);
+			// #endif
+		},
+		toast(msg) {
+			uni.showToast({
+				title: msg,
+				icon: 'none'
+			});
+		}
+	}
+}
+</script>
+
+<style scoped>
+.lsj-file {
+	display: inline-block;
+}
+.defview {
+	background-color: #007aff;
+	color: #fff;
+	border-radius: 10rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 28rpx;
+}
+.hFile {
+	position: relative;
+	overflow: hidden;
+}
+</style>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 5 - 0
uni_modules/lsj-upload/hybrid/html/js/vue.min.js


+ 191 - 0
uni_modules/lsj-upload/hybrid/html/uploadFile.html

@@ -0,0 +1,191 @@
+<!DOCTYPE html>
+<html lang="zh-cn">
+
+	<head>
+		<meta charset="UTF-8">
+		<title class="title">[文件管理器]</title>
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<style type="text/css">
+			.content {background: transparent;}
+			.btn {position: relative;top: 0;left: 0;bottom: 0;right: 0;}
+			.btn .file {position: fixed;z-index: 93;left: 0;right: 0;top: 0;bottom: 0;width: 100%;opacity: 0;}
+		</style>
+	</head>
+
+	<body>
+		
+		<div id="content" class="content">
+			<div class="btn">
+				<input :multiple="multiple" @change="onChange" :accept="accept" ref="file" class="file" type="file" />
+			</div>
+		</div>
+		
+		<script type="text/javascript" src="js/vue.min.js"></script>
+		<script type="text/javascript">
+			let _this;
+			var vm = new Vue({
+				el: '#content',
+				data: {
+					accept: '',
+					multiple: true,
+				},
+				mounted() {
+					console.log('加载webview');
+					_this = this;
+					this.files = new Map();
+					document.addEventListener('plusready', (e)=>{
+					let {debug,instantly,prohibited} = plus.webview.currentWebview();
+					this.debug = debug;
+					this.instantly = instantly;
+					this.prohibited = prohibited;
+					this.accept = prohibited.accept; 
+					this.multiple = prohibited.count > 1;
+					location.href = 'callback?retype=updateOption';
+					}, false);
+				},
+				methods: {
+					toast(msg) {
+						plus.nativeUI.toast(msg);
+					},
+					clear(name) {
+						if (!name) {
+							this.files.clear();
+							return;
+						}
+						this.files.delete(name);
+					},
+					setData(option='{}') {
+						this.debug&&console.log('更新参数:'+option);
+						try{
+							_this.option = JSON.parse(option);
+						}catch(e){
+							console.error('参数设置错误')
+						}
+					},
+					async upload(name=''){
+						if (name && this.files.has(name)) {
+							await this.createUpload(this.files.get(name));
+						}
+						else {
+							for (let item of this.files.values()) {
+								if (item.type === 'waiting' || item.type === 'fail') {
+									await this.createUpload(item);
+								}
+							}
+						}
+					},
+					onChange(e) {
+						let fileDom = this.$refs.file;
+						for (let file of fileDom.files) {
+							if (this.files.size >= this.prohibited.count) {
+								this.toast(`只允许上传${this.prohibited.count}个文件`);
+								fileDom.value = '';
+								break;
+							}
+							this.addFile(file);
+						}
+						this.uploadAfter();
+						fileDom.value = '';
+					},
+					addFile(file) {
+						if (file) {
+							let name = file.name;
+							this.debug&&console.log('文件名称',name,'大小',file.size);
+							// 限制文件格式
+							let suffix = name.substring(name.lastIndexOf(".")+1).toLowerCase();
+							let formats = this.prohibited.formats.toLowerCase();
+							if (formats&&!formats.includes(suffix)) {
+								this.toast(`不支持上传${suffix.toUpperCase()}格式文件`);
+								return;
+							}
+							// 限制文件大小
+							if (file.size > 1024 * 1024 * Math.abs(this.prohibited.size)) {
+								this.toast(`附件大小请勿超过${this.prohibited.size}M`)
+								return;
+							}
+							let path = URL.createObjectURL(file);
+							this.files.set(file.name,{file,path,name: file.name,size: file.size,progress: 0,type: 'waiting'});
+						}
+					},
+					/**
+					 * @returns {Map} 已选择的文件Map集
+					 */
+					callChange() {
+						location.href = 'callback?retype=change&files=' + escape(JSON.stringify([...this.files]));
+					},
+					/**
+					 * @returns {object} 正在处理的当前对象
+					 */
+					changeFilesItem(item,end='') {
+						this.files.set(item.name,item);
+						location.href = 'callback?retype=progress&end='+ end +'&item=' + escape(JSON.stringify(item));
+					},
+					uploadAfter() {
+						this.callChange();
+						this.instantly&&this.upload();
+					},
+					createUpload(item) {
+						this.debug&&console.log('准备上传,option=:'+JSON.stringify(this.option));
+						item.type = 'loading';
+						delete item.responseText;
+						return new Promise((resolve,reject)=>{
+							let {url,name,method='POST',header={},formData={}} = this.option;
+							let form = new FormData();
+							for (let keys in formData) {
+								form.append(keys, formData[keys])
+							}
+							form.append(name, item.file);
+							let xmlRequest = new XMLHttpRequest();
+							xmlRequest.open(method, url, true);
+							for (let keys in header) {
+								xmlRequest.setRequestHeader(keys, header[keys])
+							}
+							xmlRequest.upload.addEventListener(
+								'progress',
+								event => {
+									if (event.lengthComputable) {
+										let progress = Math.ceil((event.loaded * 100) / event.total)
+										if (progress <= 100) {
+											item.progress = progress;
+											this.changeFilesItem(item);
+										}
+									}
+								},
+								false
+							);
+							
+							xmlRequest.ontimeout = () => {
+								console.error('请求超时')
+								item.type = 'fail';
+								this.changeFilesItem(item,true);
+								return resolve(false);
+							}
+							
+							xmlRequest.onreadystatechange = ev => {
+								if (xmlRequest.readyState == 4) {
+									if (xmlRequest.status == 200) {
+										this.debug && console.log('上传完成:' + xmlRequest.responseText)
+										item['responseText'] = xmlRequest.responseText;
+										item.type = 'success';
+										this.changeFilesItem(item,true);
+										return resolve(true);
+									} else if (xmlRequest.status == 0) {
+										console.error('status = 0 :请检查请求头Content-Type与服务端是否匹配,服务端已正确开启跨域,并且nginx未拦截阻止请求')
+									}
+									console.error('--ERROR--:status = ' + xmlRequest.status) 
+									item.type = 'fail';
+									this.changeFilesItem(item,true);
+									return resolve(false);
+								}
+							}
+							xmlRequest.send(form)
+						});
+						
+					}
+				}
+			});
+			
+		</script>
+	</body>
+
+</html>

+ 79 - 0
uni_modules/lsj-upload/package.json

@@ -0,0 +1,79 @@
+{
+    "id": "lsj-upload",
+    "displayName": "全文件上传选择非原生2.0版",
+    "version": "2.2.6",
+    "description": "文件选择上传-支持APP-H5网页-微信小程序",
+    "keywords": [
+        "附件",
+        "file",
+        "upload",
+        "上传",
+        "文件管理器"
+    ],
+    "repository": "",
+    "engines": {
+        "HBuilderX": "^3.3.7"
+    },
+    "dcloudext": {
+        "sale": {
+            "regular": {
+                "price": "0.00"
+            },
+            "sourcecode": {
+                "price": "0.00"
+            }
+        },
+        "contact": {
+            "qq": ""
+        },
+        "declaration": {
+            "ads": "无",
+            "data": "无",
+            "permissions": "无"
+        },
+        "npmurl": "",
+        "type": "component-vue"
+    },
+    "uni_modules": {
+        "platforms": {
+            "cloud": {
+                "tcb": "y",
+                "aliyun": "y"
+            },
+            "client": {
+                "App": {
+                    "app-vue": "y",
+                    "app-nvue": "y"
+                },
+                "H5-mobile": {
+                    "Safari": "y",
+                    "Android Browser": "y",
+                    "微信浏览器(Android)": "y",
+                    "QQ浏览器(Android)": "y"
+                },
+                "H5-pc": {
+                    "Chrome": "y",
+                    "IE": "y",
+                    "Edge": "y",
+                    "Firefox": "y",
+                    "Safari": "y"
+                },
+                "小程序": {
+                    "微信": "y",
+                    "阿里": "u",
+                    "百度": "u",
+                    "字节跳动": "u",
+                    "QQ": "u"
+                },
+                "快应用": {
+                    "华为": "y",
+                    "联盟": "y"
+                },
+                "Vue": {
+                    "vue2": "y",
+                    "vue3": "y"
+                }
+            }
+        }
+    }
+}

+ 352 - 0
uni_modules/lsj-upload/readme.md

@@ -0,0 +1,352 @@
+# lsj-upload
+
+### 插件地址:https://ext.dcloud.net.cn/plugin?id=5459
+
+### 不清楚使用方式可点击右侧导入示例项目运行完整示例
+### 此次更新2.0与1.0使用方式略有差异,已使用1.0的同学自行斟酌是否更新到2.0版本!!!
+
+使用插件有任何问题欢迎加入QQ讨论群:
+- 群1:701468256(已满)
+- 群2:469580165(已满)
+- 群3:667530868
+
+若能帮到你请高抬贵手点亮5颗星~
+------
+## 重要提示
+### 组件是窗口级滚动,不要在scroll-view内使用!!
+### 组件是窗口级滚动,不要在scroll-view内使用!!
+### 组件是窗口级滚动,不要在scroll-view内使用!!
+
+### 控件的height高度应与slot自定义内容高度保持一致
+### nvue窗口只能使用固定模式position=absolute
+### show() 当DOM重排后在this.$nextTick内调用show(),控件定位会更加准确
+### hide() APP端webview层级比view高,如不希望触发点击时,应调用hide隐藏控件,反之调用show
+### 若iOS端跨域服务端同学实在配置不好,可把hybrid下html目录放到服务器去,同源则不存在跨域问题。
+### 小程序端因hybrid不能使用本地HTML,所以插件提供的是从微信消息列表拉取文件并选择,请知悉。
+### file对象不是object对象,也不能转json字符串,如果你打印file那就是{},可以打印file.name和file.size。
+### 返回的path是个blob类型,仅供用于文件回显,插件已内置好上传函数,调用上传会自动提交待上传文件,若非要自己拿path去搞上传那你自己处理。
+------
+
+## 使用说明
+| 属性		| 是否必填	|  值类型	| 默认值	| 说明			|
+| --------- | -------- 	| -----: 	| --: 	| :------------:|
+| width		|	否 		| String	|100%	| 容器宽度		|
+| height	|	是 		| String	|80rpx	| 容器高度		|
+| debug		|	否 		| Boolean	|false	| 打印调试日志	|
+| option	|	是 		| Object	|-		| [文件上传接口相关参数](#p1)|
+| instantly	|	否 		| Boolean	|false	| true=自动上传	|
+| count		|	否 		| Number	|10		| 附件选择上限(个)|
+| size		|	否 		| Number	|10		| 附件大小上限(M)|
+| wxFileType	|	否 		| String	|all		| 微信小程序文件选择器格式限制(all=从所有文件选择,video=只能选择视频文件,image=只能选择图片文件,file=可以选择除了图片和视频之外的其它的文件)|
+| accept	|	否 		| String	|-		| 文件选择器input file格式限制(部分机型不兼容,建议使用formats)|
+| formats	|	否 		| String	|-		| 限制允许上传的格式,空串=不限制,默认为空,多个格式以逗号隔开,例如png,jpg,pdf|
+| childId	|	否 		| String	|lsjUpload| 控件的id(仅APP有效,应用内每个控件命名一个唯一Id,不同窗口也不要同名Id)|
+| position	|	否 		| String	|static	| 控件的定位模式(static=控件随页面滚动;absolute=控件在页面中绝对定位,不随窗口内容滚动)|
+| top,left,right,bottom	|	否 		| [Number,String]	|0		| 设置控件绝对位置,position=absolute时有效|
+| @change	|	否 		| Function	|Map	| 选择文件触发,返回所有已选择文件Map集合|
+| @progress	|	否 		| Function	|Object	| 上传过程中发生状态变化的文件对象,需通过set更新至Map集合|
+| @uploadEnd|	否 		| Function	|Object	| 上传结束回调,返回参数与progress一致|
+
+## <a id="p1">option说明</a>
+|参数 | 是否必填 |  说明|
+|---- | ---- | :--: |
+|url  |	是	| 上传接口地址|
+|name| 否	|上传接口文件key,默认为file|
+|header| 否	|上传接口请求头|
+|formData| 否	|上传接口额外参数|
+
+## ref调用
+|作用 | 方法名| 传入参数|  说明|
+|---- | --------- | -------- | :--: |
+|显示控件| show|-| 控件显示状态下可触发点击|
+|隐藏控件| hide|-| 控件隐藏状态下不触发点击|
+|动态设置文件列表| setFiles|[Array,Map] files| 传入格式请与组件选择返回格式保持一致,且name为必须属性,可查看下方演示|
+|动态更新参数| setData|[String] name,[any] value| name支持a.b 和 a[b],可查看下方演示|
+|移除选择的文件| clear|[String] name| 不传参数清空所有文件,传入文件name时删除该name的文件|
+|手动上传| upload|[String] name| 不传参数默认依次上传所有type=waiting的文件,传入文件name时不关心type是否为waiting,单独上传指定name的文件|
+
+## progress返回对象字段说明
+|字段 |  说明|
+|---- | :--: |
+|file | 文件对象|
+|name |文件名称|
+|size |文件大小|
+|type |文件上传状态:waiting(等待上传)、loading(上传中)、success(成功) 、fail(失败)|
+|responseText|上传成功后服务端返回数据(仅type为success时存在)|
+
+## 以下演示为vue窗口使用方式,nvue使用区别是必须传入控件绝对位置如top,bottom,left,right,且position只能为absolute,如不清楚可点击右侧导入示例项目有详细演示代码。
+
+### vue:
+``` javascript
+<lsj-upload 
+	ref="lsjUpload"
+	childId="upload1"
+	:width="width"
+	:height="height"
+	:option="option"
+	:size="size"
+	:formats="formats"
+	:debug="debug"
+	:instantly="instantly"
+	@progress="onprogress"
+	@change="onChange">
+		<view class="btn" :style="{width: width,height: height}">选择附件</view>
+</lsj-upload>
+
+
+<view class="padding">
+			
+	<view>已选择文件列表:</view>
+	
+	<!-- #ifndef MP-WEIXIN -->
+	<view v-for="(item,index) in files.values()" :key="index">
+		<image style="width: 100rpx;height: 100rpx;" :src="item.path" mode="widthFix"></image>
+		<text>提示:【path主要用于图片视频类文件回显,他用自行处理】:{{item.path}}</text>
+		<text>{{item.name}}</text>
+		<text style="margin-left: 10rpx;">大小:{{item.size}}</text>
+		<text style="margin-left: 10rpx;">状态:{{item.type}}</text>
+		<text style="margin-left: 10rpx;">进度:{{item.progress}}</text>
+		<text style="margin-left: 10rpx;" v-if="item.responseText">服务端返回演示:{{item.responseText}}</text>
+		<text @click="resetUpload(item.name)" v-if="item.type=='fail'" style="margin-left: 10rpx;padding: 0 10rpx;border: 1rpx solid #007AFF;">重新上传</text>
+		<text @click="clear(item.name)" style="margin-left: 10rpx;padding: 0 10rpx;border: 1rpx solid #007AFF;">删除</text>
+	</view>
+	<!-- #endif -->
+	
+	<!-- #ifdef MP-WEIXIN -->
+	<view v-for="(item,index) in wxFiles" :key="index">
+		<text>{{item.name}}</text>
+		<text style="margin-left: 10rpx;">大小:{{item.size}}</text>
+		<text style="margin-left: 10rpx;">状态:{{item.type}}</text>
+		<text style="margin-left: 10rpx;">进度:{{item.progress}}</text>
+		<view>
+			<button @click="resetUpload(item.name)">重新上传</button>
+			<button @click="clear(item.name)">删除</button>
+		</view>
+	</view>
+	<!-- #endif -->
+	
+</view>
+
+
+```
+
+---
+* 函数说明
+
+
+``` javascript
+export default {
+	data() {
+		return {
+			// 上传接口参数
+			option: {
+				// 上传服务器地址,需要替换为你的接口地址
+				url: 'http://hl.j56.com/dropbox/document/upload', // 该地址非真实路径,需替换为你项目自己的接口地址
+				// 上传附件的key
+				name: 'file',
+				// 根据你接口需求自定义请求头,默认不要写content-type,让浏览器自适配
+				header: {
+					// 示例参数可删除
+					'Authorization': 'bearer eyJhbGciOiJSUzI1NiIsI',
+					'uid': '99',
+					'client': 'app',
+					'accountid': 'DP',
+				},
+				// 根据你接口需求自定义body参数
+				formData: {
+					// 'orderId': 1000
+				}
+			},
+			// 选择文件后是否立即自动上传,true=选择后立即上传
+			instantly: true,
+			// 必传宽高且宽高应与slot宽高保持一致
+			width: '180rpx',
+			height: '180rpx',
+			// 限制允许上传的格式,空串=不限制,默认为空
+			formats: '',
+			// 文件上传大小限制
+			size: 30,
+			// 文件数量限制
+			count: 2,
+			// 文件回显列表
+			files: new Map(),
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+			wxFiles: [],
+			// 是否打印日志
+			debug: true,
+			
+			
+			// 演示用
+			tabIndex: 0,
+			list:[], 
+		}
+	},
+	onReady() {
+		setTimeout(()=>{
+			console.log('----演示动态更新参数-----');
+			this.$refs['lsjUpload'+this.tabIndex].setData('formData.orderId','动态设置的参数'); 
+			
+			console.log('以下注释内容为-动态更新参数更多演示,放开后可查看演示效果');
+			// 修改option对象的name属性
+			// this.$refs.lsjUpload.setData('name','myFile');
+			
+			// 修改option对象的formData内的属性
+			// this.$refs.lsjUpload.setData('formData.appid','1111');
+			
+			// 替换option对象的formData
+			// this.$refs.lsjUpload.setData('formData',{appid:'222'});
+			
+			// option对象的formData新增属性
+			// this.$refs.lsjUpload.setData('formData.newkey','新插入到formData的属性');
+			
+			
+			// ---------演示初始化值,用于已提交后再次编辑时需带入已上传文件-------
+			// 方式1=传入数组
+			// let files1 = [{name: '1.png'},{name: '2.png',}];
+			
+			// 方式2=传入Map对象
+			// let files2 = new Map();
+			// files2.set('1.png',{name: '1.png'})
+			
+			// 此处调用setFiles设置初始files
+			// this.$refs.lsjUpload.setFiles(files1);
+			
+			// 初始化tab
+			this.onTab(0);
+		},2000)
+	},
+	methods: {
+		// 某文件上传结束回调(成功失败都回调)
+		onuploadEnd(item) {
+			console.log(`${item.name}已上传结束,上传状态=${item.type}`);
+			
+			// 更新当前窗口状态变化的文件
+			this.files.set(item.name,item);
+			
+			// ---可删除--演示上传完成后取服务端数据
+			if (item['responseText']) {
+				console.log('演示服务器返回的字符串JSON转Object对象');
+				this.files.get(item.name).responseText = JSON.parse(item.responseText);
+			}
+			
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,
+			// 如果你用不惯Map对象,也可以像这样转普通数组,组件使用Map主要是避免反复文件去重操作
+			// #ifdef MP-WEIXIN
+			this.wxFiles = [...this.files.values()];
+			// #endif
+			
+			// 强制更新视图
+			this.$forceUpdate();
+			
+			
+			// ---可删除--演示判断是否所有文件均已上传成功
+			let isAll = [...this.files.values()].find(item=>item.type!=='success');
+			if (!isAll) {
+				console.log('已全部上传完毕');
+			}
+			else {
+				console.log(isAll.name+'待上传');
+			}
+			
+		},
+		// 上传进度回调
+		onprogress(item) {
+			// 更新当前状态变化的文件
+			this.files.set(item.name,item);
+			
+			console.log('打印对象',JSON.stringify(this.files.get(item.name)));
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+			// #ifdef MP-WEIXIN
+			this.wxFiles = [...this.files.values()];
+			// #endif
+			
+			// 强制更新视图
+			this.$forceUpdate();
+			
+		},
+		// 文件选择回调
+		onChange(files) {
+			console.log('当前选择的文件列表:',JSON.stringify([...files.values()]));
+			// 更新选择的文件 
+			this.files = files;
+			// 强制更新视图
+			this.$forceUpdate();
+			
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+			// #ifdef MP-WEIXIN
+			this.wxFiles = [...this.files.values()];
+			// #endif
+			
+			// ---可删除--演示重新定位覆盖层控件
+			this.$nextTick(()=>{
+				console.log('演示重新定位');
+				this.$refs.lsjUpload0.show();
+				this.$refs.lsjUpload1.show();
+				this.$refs.lsjUpload2.show();
+			});
+			
+		},
+		// 手动上传
+		upload() {
+			// name=指定文件名,不指定则上传所有type等于waiting和fail的文件
+			this.$refs['lsjUpload'+this.tabIndex].upload();
+		},
+		// 指定上传某个文件
+		resetUpload(name) {
+			this.$refs['lsjUpload'+this.tabIndex].upload(name);
+		},
+		// 移除某个文件
+		clear(name) {
+			// name=指定文件名,不传name默认移除所有文件
+			this.$refs['lsjUpload'+this.tabIndex].clear(name);
+		},
+		/**
+		 * ---可删除--演示在组件上方添加新内容DOM变化
+		 * DOM重排演示,重排后组件内部updated默认会触发show方法,若特殊情况未能触发updated也可以手动调用一次show()
+		 * 什么是DOM重排?自行百度去
+		 */
+		add() {
+			this.list.push('DOM重排测试');
+		},
+		/**
+		 * ---可删除--演示Tab切换时覆盖层是否能被点击
+		 * APP端因为是webview,层级比view高,此时若不希望点击触发选择文件,需要手动调用hide()
+		 * 手动调用hide后,需要调用show()才能恢复覆盖层的点击
+		 */
+		onTab(tabIndex) {
+			this.$refs.lsjUpload0.hide();
+			this.$refs.lsjUpload1.hide();
+			
+			this.tabIndex = tabIndex;
+			
+			this.$nextTick(()=>{
+				this.$refs['lsjUpload'+this.tabIndex].show();
+			})
+			
+		},
+		/**
+		 * 打开nvue窗口查看非跟随窗口滚动效果
+		 */
+		open() {
+			uni.navigateTo({
+				url: '/pages/nvue-demo/nvue-demo'
+			});
+		}
+	}
+}
+
+```
+
+## 温馨提示
+	
+* 文件上传
+0. 如说明表达还不够清楚,不清楚怎么使用可导入完整示例项目运行体验和查看	
+1. APP端请优先联调Android,上传成功后再运行iOS端,如iOS返回status=0则需要后端开启允许跨域;
+2. header的Content-Type类型需要与服务端要求一致,否则收不到附件(服务端若没有明文规定则可不写,使用默认匹配)
+3. 服务端不清楚怎么配置跨域可加群咨询,具体百度~
+4. 欢迎加入QQ讨论群:701468256(已满)
+5. 欢迎加入QQ讨论群:469580165(已满)
+6. 欢迎加入QQ讨论群:667530868
+7. 若能帮到你还请点亮5颗小星星以作鼓励哈~
+8. 若能帮到你还请点亮5颗小星星以作鼓励哈~
+9. 若能帮到你还请点亮5颗小星星以作鼓励哈~

+ 2 - 2
work/components/business/dfjxx.vue

@@ -8,7 +8,7 @@
 			<text class="txta" @click="getDown(a)">在线查看</text>
 		</view>
 		<view class="mt18" v-if="ite.files&&ite.files.length">
-			<view class="fjlists"  v-for="(fite,fidx) in ite.files" :key='ite.files'>
+			<view class="fjlists"  v-for="(fite,fidx) in ite.files" :key='fidx'>
 				<view class="flext" @click="getDown(fite.url)">
 					<view class="imgl"><image :src="filico" ></image></view>
 					<view class="tit">{{fite.name}}</view>
@@ -100,7 +100,7 @@
 	.imgl{width: 40rpx;height: 40rpx;display: flex;align-items: center;flex: 0 0 auto;
 		image{width: 26rpx;height: 24rpx;}
 	}
-	.tit{font-size: 24rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
+	.tit{font-size: 26rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
 	.delimg{width: 40rpx;height:40rpx;margin-left: 16rpx;display: flex;align-items: center;justify-content: center;flex: 0 0 auto;
 		image{width: 24rpx;height: 24rpx;}
 	}

+ 1 - 1
work/components/business/ewjcj.vue

@@ -96,7 +96,7 @@
 	.imgl{width: 40rpx;height: 40rpx;display: flex;align-items: center;flex: 0 0 auto;
 		image{width: 26rpx;height: 24rpx;}
 	}
-	.tit{font-size: 24rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
+	.tit{font-size: 26rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
 	.delimg{width: 40rpx;height:40rpx;margin-left: 16rpx;display: flex;align-items: center;justify-content: center;flex: 0 0 auto;
 		image{width: 24rpx;height: 24rpx;}
 	}

+ 136 - 23
work/components/business/list.vue

@@ -3,7 +3,7 @@
 	<view v-if="datalist.length>0">
 		<!-- 申报业务 v-if="listtype=='case'"-->
 		<block v-if="type=='work'">
-			<view class="lists" @click="getDetail">
+			<view class="lists" v-for="(ite,idx) in datalist" @click="getDetail">
 				<view class="listtop">
 					<view class="toptit over">安徽嘉欣医疗用品有限公司</view>
 					<view class="statbox">专精特新<image :src="start"></image></view>
@@ -22,29 +22,10 @@
 					</view>
 				</view>
 			</view>
-			<view class="lists">
-				<view class="listtop">
-					<view class="toptit over">安徽嘉欣医疗用品有限公司</view>
-					<view class="statbox">专精特新<image :src="start"></image></view>
-				</view>
-				<view class="listsm">
-					<view class="txt"><text class="tit">审核状态</text><text class="line">|</text><text class="co28">等待申报审核分配</text></view>
-					<view class="txt"><text class="tit">申报时间</text><text class="line">|</text><text>2024-03-21 15:13:48</text></view>
-					<view class="flexcw">
-						<view class="txt"><text class="tit">申请额度</text><text class="line">|</text><text>1000万元</text></view>
-						<view class="txt"><text class="tit">使用期限</text><text class="line">|</text><text>12个月万元</text></view>
-						<view class="txt"><text class="tit">申贷银行</text><text class="line">|</text><text>农商行</text></view>
-						<view class="txt"><text class="tit">担保类型</text><text class="line">|</text><text>担保贷款</text></view>
-						<view class="txt"><text class="tit">资金用途</text><text class="line">|</text><text>流动资金周转</text></view>
-						<view class="txt"><text class="tit">还款来源</text><text class="line">|</text><text>营业收入</text></view>
-					</view>
-					
-				</view>
-			</view>
 		</block>
 		<!-- 客户 -->
 		<block v-if="type=='custom'">
-			<view class="lists" @click="getDetail">
+			<view class="lists" v-for="(ite,idx) in datalist" @click="getDetail">
 				<view class="listtop">
 					<view class="head">林</view>
 					<view class="flex1">
@@ -67,6 +48,92 @@
 				</view>
 			</view>
 		</block>
+		<!-- 企业 -->
+		<block v-if="type=='qy'">
+			<view class="lists qy" v-for="(ite,idx) in datalist" @click="getDetail"  >
+				<view class="listtop" style="display: block;">
+					<view class="flexc">
+						<view class="toptit over f20">安徽嘉欣医疗用品有限公司</view>
+						<view class="statbox">专精特新<image :src="start"></image></view>
+					</view>
+					<view class="adr f12">企业地址 | 潜山市经济开发区</view>
+				</view>
+				
+				<view class="listsm">
+					<view class="txt"><text class="tit">统一社会信用代码:</text><text>91101085620732606</text></view>
+					<view class="txt"><text class="tit">企业类型:</text><text>其他有限责任公司</text></view>
+					<view class="flexcw">
+						<view class="txt"><text class="tit">法人姓名:</text><text>林振宇</text></view>
+						<view class="txt"><text class="tit">注册资金:</text><text>1000万元</text></view>
+					</view>
+					<view class="txt"><text class="tit">成立日期:</text><text>2018年09月20日</text></view>
+					<view class="txt"><text class="tit">营业期限:</text><text>2018年09月20日 至 2038年09月19日</text></view>
+				</view>
+			</view>
+		</block>
+		<!-- 历史申贷记录 -->
+		<block v-if="type=='sdjl'">
+			<view class="lists sdjl" v-for="(ite,idx) in datalist" @click="getDetail"  >
+				<view class="listsm">
+					<view class="txt"><text class="tit">申贷企业:</text><text>安徽嘉欣医疗用品有限公司</text>
+						<text class="flex1"></text>
+						<view class="look flexc">查看<image :src="rimg"></image></view>
+					</view>
+					<view class="txt"><text class="tit">申报时间:</text><text>2024-03-21 15:13:58</text></view>
+					<view class="txt"><text class="tit">归档时间:</text><text>2024-04-18  15:13:58</text></view>
+					<view class="flexcw">
+						<view class="txt"><text class="tit">申请额度:</text><text>1000万元</text></view>
+						<view class="txt"><text class="tit">使用期限:</text><text>12个月</text></view>
+					</view>
+					<view class="flexcw">
+						<view class="txt"><text class="tit">申贷银行:</text><text>农商行</text></view>
+						<view class="txt"><text class="tit">担保类型:</text><text>担保贷款</text></view>
+					</view>
+					<view class="flexcw">
+						<view class="txt"><text class="tit">资金用途:</text><text>流动资金周转</text></view>
+						<view class="txt"><text class="tit">还款来源:</text><text>营业收入</text></view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 文件 -->
+		<block v-if="type=='file'">
+			<view class="lists" v-for="(ite,idx) in datalist" @click="getDetail"  >
+				<view class="listtop" style="display: block;">
+					<view class="toptit over">安徽嘉欣医疗用品有限公司</view>
+				</view>
+				<view class="listsm">
+					<view class="txt"><text class="tit">申贷次数</text><text class="line">|</text><text>2次</text></view>
+					<view class="txt"><text class="tit">最近申贷时间</text><text class="line">|</text><text>2023年08月23日</text>
+						<view class="flex1"></view>
+						<view class="looktxt">查看文件</view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 文件详情列表 -->
+		<block v-if="type=='filedet'">
+			<view class="files" v-for="(ite,idx) in datalist" >
+				<view class="fdtit">
+					<image :src="titimg"></image>
+					<view>2023年08月23日</view>
+				</view>
+				<view class="fdzbox">
+					<image :src="filz"></image>
+					<view>
+						安徽嘉欣医疗用品有限公司230823文档.zip
+					</view>
+				</view>
+				<view class="fdbtns flexcj mt18">
+					<view class="lbtns flexc" @click="getDetail">
+						<image :src="files"></image>文件详情列表
+					</view>
+					<view class="rbtns flexc">
+						<image :src="fup"></image>保存至手机
+					</view>
+				</view>
+			</view>
+		</block>
 		<view class="shax" v-if="wtdt">{{wtdt}}</view>
 	</view>
 	<block v-else>
@@ -107,6 +174,11 @@
 		return{
 			start:require('@/work/static/images/start.png'),
 			copy:require('@/work/static/images/copy.png'),
+			rimg:require('@/work/static/images/rimga.png'),
+			files:require('@/work/static/images/files.png'),
+			filz:require('@/work/static/images/filz.png'),
+			titimg:require('@/work/static/images/infotit.png'),
+			fup:require('@/work/static/images/fup.png'),
 		}
 	},
 	onLoad: function() {
@@ -195,6 +267,26 @@
 
 <style lang="scss" scoped>
 .lists{background: #FFFFFF;box-shadow: 0px 0px 10rpx 0px rgba(216,216,216,0.4);border-radius: 20rpx;padding: 0 20rpx;margin-bottom: 24rpx;
+	&.qy{padding: 0 24rpx;
+		.listtop{
+			padding: 40rpx 14rpx 42rpx;
+		}
+		.listsm{padding: 40rpx 14rpx 2rpx 0;
+			.txt{font-size: 30rpx;margin-bottom: 44rpx;padding-left: 14rpx;
+				text{color: #666666;}
+			}
+		}
+	}
+	&.sdjl{
+		.listsm{padding: 40rpx 10rpx 2rpx 0;
+			.txt{font-size: 30rpx;margin-bottom: 44rpx;padding-left: 10rpx;align-items: flex-start;
+				text{color: #666666;}
+			}
+		}
+		.look{flex: 0 0 auto;display: inline-flex;margin-left: 16rpx;line-height: 40rpx;font-weight: 500;font-size: 26rpx;color: #28C529;
+			image{width: 14rpx;height: 20rpx;margin-left: 14rpx;}
+		}
+	}
 	.listtop{display: flex;align-items: center;overflow: hidden;border-bottom: 2rpx solid #E6E6E6;padding: 34rpx 12rpx;
 		.toptit{font-weight: bold;font-size: 30rpx;color: #222327;}
 		.statbox{min-width: 140rpx;height: 36rpx;background-color: rgba(255,177,50,0.3);padding: 0 14rpx;box-sizing: border-box;font-weight: bold;font-size: 22rpx;color: #FF6924;display: flex;align-items: center;flex: 0 0 auto;border-radius: 10rpx;margin-left: 20rpx;
@@ -206,17 +298,38 @@ font-size: 40rpx;display: flex;align-items: center;justify-content: center;color
 		.headt{font-weight: bold;font-size: 40rpx;color: #222327;margin-bottom: 10rpx;}
 		.headx{font-weight: 500;font-size: 24rpx;color: #666666;}
 	}
-	.listsm{padding: 32rpx 10rpx 16rpx;
+	.adr{font-weight: 500;font-size: 26rpx;color: #666666;margin-top: 12rpx;}
+	.listsm{padding: 32rpx 10rpx 16rpx 0;
 		.tit{font-weight: bold;margin-right: 8rpx;flex: 0 0 auto;}
 		.line{margin-right: 8rpx;color: #aaaaaa;flex: 0 0 auto;}
-		.txt{font-size: 26rpx;color: #222327;margin-bottom: 24rpx;display: flex;}
+		.txt{font-size: 26rpx;color: #222327;margin-bottom: 24rpx;display: flex;padding-left: 10rpx;}
 		.copyimg{width: 30rpx;height: 30rpx;margin-left: 8rpx;display: flex;align-items: center;justify-content: center;
 			image{width: 18rpx;height: 20rpx;}
 		}
+		.looktxt{font-weight: 500;flex: 0 0 auto;font-size: 26rpx;color: #00A9F0;margin-left: 10rpx;}
 		.flexcw{
 			display: flex;align-items: center;flex-wrap: wrap;
 			.txt{min-width: 50%;}
 		}
 	}
 }
+// 文件
+.files{padding:40rpx 36rpx 36rpx;border-bottom: 2rpx solid #E6E6E6;
+	.fdtit{display: flex;font-weight: bold;margin-bottom: 44rpx;
+		view{font-size: 30rpx;color: #00A9F0;}
+		image{width: 30rpx;height: 30rpx;margin-right: 14rpx;flex: 0 0 auto;margin-top: 5rpx;}
+	}
+	.fdzbox{width: 100%;padding: 24rpx 30rpx;box-sizing: border-box;display: flex;align-items: center;background: #E1F3FA;border-radius: 20rpx;
+		image{width: 62rpx;height: 74rpx;margin-right: 32rpx;flex: 0 0 auto;}
+		view{font-weight: bold;font-size: 26rpx;color: #00A9F0;}
+	}
+	.fdbtns{
+		.lbtns{font-weight: 500;font-size: 26rpx;color: #28C529;
+			image{width: 24rpx;height: 20rpx;margin-right: 14rpx;}
+		}
+		.rbtns{font-weight: 500;font-size: 26rpx;color: #00A9F0;
+			image{width: 22rpx;height: 24rpx;margin-right: 12rpx;transform: rotate(180deg);}
+		}
+	}
+}
 </style>

+ 389 - 10
work/components/popup/popup.vue

@@ -32,25 +32,217 @@
 				<textarea class="textar" style="height: 156rpx;" placeholder="若不同意进入初审,请填写理由…"></textarea>
 			</view>
 			<view class="mb16">
-				<view class="ttxt mb18">分配B角</view>
+				<view class="ttxt mb18">分配A角</view>
 				<uni-data-select  v-model="mycdtxt"  placeholder="请选择A角"  :localdata="mycdlist"  ></uni-data-select>
 			</view>
 			<view class="mb16">
-				<view class="ttxt mb18">分配A角</view>
+				<view class="ttxt mb18">分配B角</view>
 				<uni-data-select  v-model="mycdtxt"  placeholder="请选择B角"  :localdata="mycdlist"  ></uni-data-select>
 			</view>
 			<view class="btns">确认并生成担保意向函</view>
 		</view>
+		<!-- a,b角色审核 -->
+		<view class="fixbox" v-if="type=='ajssh'||type=='bjssh'">
+			<view class="cloimg" @click="getClose">
+				<image :src="closeimg"></image>
+			</view>
+			<view class="ttit">担保初审</view>
+			<view class="mb16">
+				<view class="ttxt mb18">是否通过</view>
+				<uni-data-checkbox :selectedColor="actcolor" v-model="isty" :localdata="tyList" />
+			</view>
+			<view class="">
+				<view class="ttxt mb18">审核意见</view>
+				<textarea class="textar" style="height: 156rpx;" placeholder="若资料不予通过,请填写理由…"></textarea>
+			</view>
+			<view class="btns" @click="getupSubmit">确认</view>
+			<view class="shtips" v-if="type=='ajssh'">* 提交后将交由B角复核,误操可撤回</view>
+			<view class="shtips" v-if="type=='bjssh'">* 提交后将交由风险部进行风险审核,误操可撤回</view>
+		</view>
+		<!--  风险审核-->
+		<view class="fixbox" v-if="type=='fxbmsh'">
+			<view class="cloimg" @click="getClose">
+				<image :src="closeimg"></image>
+			</view>
+			<view class="ttit">风险审核</view>
+			<view class="mb16">
+				<view class="ttxt mb18">是否通过</view>
+				<uni-data-checkbox :selectedColor="actcolor" v-model="isty" :localdata="tyList" />
+			</view>
+			<view class="mb16">
+				<view class="ttxt mb18 flexcj">附件信息
+					<lsj-upload ref="lsjUpload" childId="upload1" :width="width" :height="height" :option="option" :size="size" :formats="formats" :debug="debug" :instantly="instantly"
+						    @progress="" @uploadEnd="onuploadEnd" >
+						<view class="fbtns co0a" :style="{width: width,height: height}">上传附件</view>
+					</lsj-upload>
+				</view>
+				<view class="fjlists"  v-for="(fite,fidx) in filelist" :key='fidx'>
+					<view class="flext" @click="getDown(fite.url)">
+						<view class="imgl"><image :src="filico" ></image></view>
+						<view class="tit">{{fite.name}}</view>
+					</view>
+					<view class="delimg flex0" @click.stop="getDelFj(idx)">
+						<image :src="fdelimg"></image>
+					</view>
+				</view>
+			</view>
+			<view class="btns" @click="getupSubmit">确认</view>
+		</view>
+		<!-- 上会管理员审核 shsh -->
+		<view class="fixbox" v-if="type=='shsh'">
+			<view class="cloimg" @click="getClose">
+				<image :src="closeimg"></image>
+			</view>
+			<view class="ttit">上会审核</view>
+			<view class="mb16">
+				<view class="ttxt mb18">是否同意上评审会</view>
+				<uni-data-checkbox :selectedColor="actcolor" v-model="isty" :localdata="tyList" />
+			</view>
+			<view class="mb16">
+				<view class="ttxt mb18">评审会日期</view>
+				<picker mode="date"   @change='bindDateChangea'>
+					<view class="chekt">
+						<view :class="jtri?'':'coa'">{{jtri|| "请选择具体日期"}}</view>
+						<image :src="upimg"></image>
+					</view>
+				</picker>
+			</view>
+			<view class="mb16">
+				<view class="ttxt mb18">审核意见</view>
+				<textarea class="textar" style="height: 156rpx;" placeholder="若不同意上会,请填写理由…"></textarea>
+			</view>
+			<view class="mb16">
+				<view class="ttxt mb18 flexcj">上会人员
+					<view class="addsh">
+						<image :src="addpeimg"></image>添加上会人员
+					</view>
+				</view>
+				<view class="peolists">
+					<view class="plist">
+						<view class="flex1 over">周大吉</view>
+						<image :src="fdelimg"></image>
+					</view>
+					<view class="plist">
+						<view class="flex1 over">周大吉</view>
+						<image :src="fdelimg"></image>
+					</view>
+					<view class="plist">
+						<view class="flex1 over">周大吉</view>
+						<image :src="fdelimg"></image>
+					</view>
+					<view class="plist">
+						<view class="flex1 over">周大吉</view>
+						<image :src="fdelimg"></image>
+					</view>
+					
+				</view>
+			</view>
+			<view class="shshtips">* 确认上会后,即出具评审意见签批表、股东会决议</view>
+			<view class="btns" style="margin-top: 18rpx;" @click="getupSubmit">确认</view>
+		</view>
+		<!-- 上会上传附件 -->
+		<view class="fixbox" v-if="type=='shhj'">
+			<view class="cloimg" @click="getClose">
+				<image :src="closeimg"></image>
+			</view>
+			<view class="ttit">上传附件</view>
+			<view class="mb16">
+				<view class="ttxt mb18 flexcj">附件信息
+					<lsj-upload ref="lsjUpload" childId="upload1" :width="width" :height="height" :option="option" :size="size" :formats="formats" :debug="debug" :instantly="instantly"
+						    @progress="" @uploadEnd="onuploadEnd" >
+						<view class="fbtns co0a" :style="{width: width,height: height}">上传附件</view>
+					</lsj-upload>
+				</view>
+				<view class="fjlists"  v-for="(fite,fidx) in filelist" :key='fidx'>
+					<view class="flext" @click="getDown(fite.url)">
+						<view class="imgl"><image :src="filico" ></image></view>
+						<view class="tit">{{fite.name}}</view>
+					</view>
+					<view class="delimg flex0" @click.stop="getDelFj(idx)">
+						<image :src="fdelimg"></image>
+					</view>
+				</view>
+			</view>
+			<view class="conbtns flexcj">
+				<view class="cbtns bga">暂存</view>
+				<view class="cbtns bgb">确认</view>
+			</view>
+		</view>
+		<!-- 审核结果二次确认弹窗 -->
+		<view class="fixbox con" v-if="type=='confirm'">
+			<view class="cloimg" @click="getClose">
+				<image :src="closeimg"></image>
+			</view>
+			<view class="ttit">确认提交审核意见</view>
+			<view class="conttxt">请您二次确认对该项目资料提交 “<text>通过</text>”的审核意见吗?</view>
+			<view class="conbtns flexcj">
+				<view class="cbtns bga" @click="getClose">取消</view>
+				<view class="cbtns bgb">确认</view>
+			</view>
+		</view>
+		<!-- 尽职调查反馈 -->
+		<view class="fixbox" v-if="type=='jztcsh'">
+			<view class="cloimg" @click="getClose">
+				<image :src="closeimg"></image>
+			</view>
+			<view class="ttit">业务审核</view>
+			<view class="mb16">
+				<view class="ttxt mb18">上传照片</view>
+				<view class="addpbox">
+					<view class="plist addpimg" @click="getaddImage">
+						<image :src="addpimg"></image>
+					</view>
+					<view class="plist">
+						<image :src="addpimg" class="img"></image>
+						<image :src="fdelimg" class="del"></image>
+					</view>
+					<view class="plist">
+						<image :src="addpimg" class="img"></image>
+						<image :src="fdelimg" class="del"></image>
+					</view>
+					<view class="plist">
+						<image :src="addpimg" class="img"></image>
+						<image :src="fdelimg" class="del"></image>
+					</view>
+				</view>
+			</view>
+			<view class="ptips">* 点击添加照片可实时拍摄照片上传,也可由手 机相册中上传</view>
+			<view class="mb16">
+				<view class="ttxt mb18 flexcj">附件信息
+					<lsj-upload ref="lsjUpload" childId="upload1" :width="width" :height="height" :option="option" :size="size" :formats="formats" :debug="debug" :instantly="instantly"
+						    @progress="" @uploadEnd="onuploadEnd" >
+						<view class="fbtns co0a" :style="{width: width,height: height}">上传附件</view>
+					</lsj-upload>
+				</view>
+				<view class="fjlists"  v-for="(fite,fidx) in filelist" :key='fidx'>
+					<view class="flext" @click="getDown(fite.url)">
+						<view class="imgl"><image :src="filico" ></image></view>
+						<view class="tit">{{fite.name}}</view>
+					</view>
+					<view class="delimg flex0" @click.stop="getDelFj(idx)">
+						<image :src="fdelimg"></image>
+					</view>
+				</view>
+			</view>
+			<view class="conbtns flexcj">
+				<view class="cbtns bga" @click="getClose">取消</view>
+				<view class="cbtns bgb">确认</view>
+			</view>
+		</view>
 	</view>
 </template>
 
 <script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import { getToken } from '@/utils/auth'
+	import {uploadmore} from '@/utils/common.js'
 	export default{
 		props:{
 			type: {
-				type: Number,
+				type: String,
 				default () {
-					return 0
+					return ''
 				}
 			},
 			stepList:{
@@ -68,28 +260,154 @@
 		},
 		data(){
 			return{
+				//附件
+				option: {
+				    // 上传服务器地址,需要替换为你的接口地址
+				    url: baseUrl+'/common/upload', // 该地址非真实路径,需替换为你项目自己的接口地址
+				    // 上传附件的key
+				    name: 'file',
+				    // 根据你接口需求自定义请求头,默认不要写content-type,让浏览器自适配
+				    header: {
+				        // 示例参数可删除
+				        'Authorization':  'Bearer ' + getToken(),
+				    },
+				    // 根据你接口需求自定义body参数
+				    formData: {}
+				},
+				// 选择文件后是否立即自动上传,true=选择后立即上传
+				instantly: true,
+				// 必传宽高且宽高应与slot宽高保持一致
+				width: '',
+				height: '40rpx',
+				// 限制允许上传的格式,空串=不限制,默认为空
+				formats: 'doc,docx,xls,xlsx,ppt,txt,pdf,zip,rar,word,png,jpg,jpeg',
+				// 文件上传大小限制
+				size: 100,
+				// 文件数量限制 默认10
+				count: 5,
+				// 文件回显列表
+				files: new Map(),
+				// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+				wxFiles: [],
+				// 是否打印日志
+				debug: false,
+				filelist:[{name:'安徽嘉欣医疗用品有…调查报告.pdf',url:''}],
+				
 				stepa:require('@/work/static/images/busin/stepa.png'),
 				stepb:require('@/work/static/images/busin/stepb.png'),
 				stepc:require('@/work/static/images/busin/stepc.png'),
 				closeimg:require('@/work/static/images/close.png'),
+				filico:require('@/work/static/images/filico.png'),
+				fdelimg:require('@/work/static/images/del.png'),
+				addpimg:require('@/work/static/images/addp.png'),
+				upimg:require('@/work/static/images/aup.png'),
+				addpeimg:require('@/work/static/images/aap.png'),
 				actcolor:'#00A9F0',
 				tyList:[{text: '同意',value: '0'},{text: '不同意',value: '1'}],
 				mycdlist:[{text: 'a',value: '0'},{text: 'b',value: '1'}],
 				isty:'0',
 				mycdtxt:'',
+				jtri:'',//具体日期
 			}
 		},
 		methods:{
 			getClose(){
 				this.$emit('getClose')
-			}
+			},
+			getupSubmit(){
+				this.$emit('getupSubmit')
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.jtri=val;
+			},
+			// 上传图片
+			getaddImage(e){
+				let that = this;
+				let file =[],count=9
+				// if(e=='zj'){
+				// 	file = that.zjfile;
+				// 	count=9
+				// }else{
+				// 	file = that.mjfile;
+				// 	count=9
+				// }
+				uni.chooseImage({
+					count: 1,
+					success:function(res){
+						let img= res.tempFilePaths;
+						if(img.length + file.length > count){
+							uni.showToast({
+								title: '最多上传'+count+'张图片',
+								icon: 'none',
+								duration: 2000
+							})
+						}else{
+							let imglen = res.tempFilePaths.length;
+							var fuwufile = [];
+							uploadmore('/common/upload',img,0,0,0,imglen,fuwufile,function(rs){
+								if(e=='zj'){
+									that.zjfile = that.zjfile.concat(rs);
+									that.datainfo.identificationPhoto=that.zjfile.join(',')
+								}
+							})	
+						}
+					}
+				});
+			},
+			onuploadEnd(item) {
+				var newobj={}
+				var responseText=JSON.parse(item.responseText)
+				newobj.name=responseText.originalFilename;
+				newobj.url=responseText.fileName;
+				this.filelist.push(newobj)
+				// this.datainfo.zsyzFjList=JSON.parse(JSON.stringify(this.filelist))
+			},
+			getDelFj(idx){
+				var that=this;
+				uni.showModal({
+					title: '确认删除',
+					content: "是否确认删除",
+					cancelText: '取消',
+					confirmText: '确认',
+					success: function(res) {
+						if (res.confirm) {
+							that.filelist.splice(idx,1)
+							// that.datainfo.zsyzFjList=JSON.parse(JSON.stringify(that.filelist))
+						} else if (res.cancel) {
+						}
+					}
+				});
+			},
+			getDown(e){
+				uni.showLoading({
+					title: '加载中'
+				});
+				var url=baseUrl+e;
+				uni.downloadFile({
+					url: url,//文件的下载路径
+					success(result) {
+							uni.hideLoading()
+						var filePath = result.tempFilePath;
+						   uni.openDocument({
+						     filePath: filePath,
+						     showMenu: true,
+						     success: function (res) {
+						       // console.log('打开文档成功');
+						     }
+						   });
+					},
+					fail(res) {uni.hideLoading()}
+				})
+			},
 		}
 	}
 </script>
 
 <style lang="scss" scoped>
+// 进度
 .speedbox{background: #FFFFFF;box-shadow: 0px 0px 14rpx 0px rgba(184,184,184,0.76);border-radius: 20rpx;padding: 44rpx 40rpx 0;
-	position: fixed;z-index: 10;left: 220rpx;top: 50%;transform: translateY(-50%);max-height: calc(100vh - 400rpx);overflow: auto;
+	position: fixed;z-index: 10;left: 220rpx;top: 50%;transform: translateY(-50%);max-height: calc(100vh - 200rpx);overflow: auto;
 	.tit{font-weight: bold;font-size: 30rpx;color: #222327;margin-bottom: 36rpx;}
 	.lists{display: flex;align-items: flex-start;position: relative;padding-bottom: 52rpx;
 		&::after{content: '';width: 2rpx;position: absolute;left: 15rpx;top: 56rpx;bottom: 56rpx;height: 60rpx;background: #E6E6E6;}
@@ -116,7 +434,7 @@
 .textar{width: 100%;border-radius: 10rpx;padding: 26rpx 30rpx;font-size: 26rpx;color: #222327;height: 400rpx;background: #EEEEEE;
 	&.texthe{height: 190rpx;}
 }
-.fixbox{position: fixed;left: 56rpx;right: 56rpx;background: #FFFFFF;max-height: calc(100vh - 400rpx);overflow: auto;
+.fixbox{position: fixed;left: 56rpx;right: 56rpx;background: #FFFFFF;max-height: calc(100vh - 200rpx);overflow: auto;
 border-radius: 20rpx;z-index: 10;top: 50%;transform: translateY(-50%);padding: 40rpx 48rpx 52rpx;
 	.cloimg{display: flex;align-items: center;justify-content: center;position: absolute;width: 40rpx;height: 40rpx;
 	top: 40rpx;left: 40rpx;
@@ -124,8 +442,69 @@ border-radius: 20rpx;z-index: 10;top: 50%;transform: translateY(-50%);padding: 4
 	}
 	.ttit{font-weight: bold;text-align: center;font-size: 30rpx;color: #222327;margin-bottom:50rpx;}
 	.ttxt{font-weight: bold;font-size: 30rpx;color: #222327;}
-	.btns{margin-top: 70rpx;
-		width: 100%;background: #00A9F0;border-radius:10rpx;height: 88rpx;display: flex;align-items: center;justify-content: center;font-weight: 500;font-size: 30rpx;color: #FFFFFF;}
-	
+	.btns{margin-top: 70rpx;width: 100%;background: #00A9F0;border-radius:10rpx;height: 88rpx;display: flex;align-items: center;justify-content: center;font-weight: 500;font-size: 30rpx;color: #FFFFFF;}
+	.shtips{font-weight: 500;text-align: center;margin-top: 36rpx;font-size: 24rpx;color: #FF6969;padding-bottom: 20rpx;}
+	//按钮
+	.conbtns{margin-top: 66rpx;
+		.cbtns{flex:1;display: flex;align-items: center;justify-content: center;box-sizing: border-box;height: 88rpx;font-weight: 500;
+	font-size: 30rpx;background: #FFFFFF;border-radius: 10rpx;
+			&.bga{border: 1px solid #00A9F0;background: #FFFFFF;color: #01A9F0;margin-right: 24rpx;}
+			&.bgb{background: #00A9F0;color: #FFFFFF;}
+		}
+	}
+	// 二次确认弹窗
+	&.con{
+		left: 80rpx;right: 80rpx;padding-bottom: 60rpx;
+		.conttxt{font-weight: bold;font-size: 30rpx;color: #222327;padding: 0 34rpx;text-align: center;
+			padding-top: 36rpx;
+			text{color: #00A9F0;}
+			
+		}	
+	}
+	// 上传图片
+	.addpbox{display: flex;flex-wrap: wrap;
+		.plist{width: 160rpx;height: 160rpx;background: #FFFFFF;border-radius: 20rpx;position: relative;margin-bottom: 10rpx;
+			margin-right: 30rpx;border: 2rpx dashed #CDCDCD;display: flex;align-items: center;justify-content: center;
+			&:nth-of-type(3n){margin-right: 0;}
+			&.addpimg{
+				border: 0;
+				image{width: 100%;height: 100%;}
+			}
+			.img{width: 150rpx;height: 150rpx;}
+			.del{width: 24rpx;height: 24rpx;position: absolute;right: -6rpx;top: -6rpx;}
+		}
+	}
+	// 选择日期
+	.chekt{
+		background-color: #EEEEEE;height: 88rpx;border-radius: 8rpx;display: flex;align-items: center;padding: 0 40rpx 0 24rpx;
+		view{font-size: 30rpx;flex: 1;}
+		image{width: 16rpx;height: 10rpx;flex: 0 0 auto;margin-left: 12rpx;}
+	}
+	// 上会人员添加
+	.shshtips{font-weight: 500;padding-top: 14rpx;font-size: 24rpx;color: #FF6969;}
+	.addsh{font-weight: 500;flex:0 0 auto; font-size: 30rpx;color: #00A9F0;display: flex;align-items: center;
+		image{width: 24rpx;height: 24rpx;margin-right: 8rpx;}
+	}
+	.peolists{
+		display: flex;flex-wrap: wrap;
+		.plist{background-color: rgba(0, 169, 240, 0.1);font-weight: 500;font-size: 26rpx;border-radius:10rpx;width: 172rpx;margin: 0 12rpx 18rpx 0;display: flex;align-items: center;padding: 18rpx 16rpx;box-sizing: border-box;
+color: #666666;overflow: hidden;
+			&:nth-of-type(3n){margin-right: 0;}
+			image{width: 26rpx;height: 26rpx;}
+		}
+	}
+	.ptips{font-weight: 500;font-size: 26rpx;color: #FF6969;margin-bottom: 40rpx;}
+	// 附件
+	.fjlists {display: flex;align-items: flex-start;justify-content: space-between;margin-bottom: 20rpx;
+		&:last-child{margin-bottom: 0;}
+		.imgl{width: 40rpx;height: 40rpx;display: flex;align-items: center;flex: 0 0 auto;
+			image{width: 26rpx;height: 24rpx;}
+		}
+		.tit{font-size: 26rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
+		.delimg{width: 40rpx;height:40rpx;margin-left: 16rpx;display: flex;align-items: center;justify-content: center;flex: 0 0 auto;
+			image{width: 24rpx;height: 24rpx;}
+		}
+		.txta{color: #28C529;font-weight: 500;line-height: 40rpx;flex: 0 0 auto;margin-left: 18rpx;padding: 0 6rpx;}
+	}
 }
 </style>

+ 41 - 25
work/pages/business/add.vue

@@ -2,7 +2,7 @@
 	<view class="addbox">
 		<!-- 步骤条 -->
 		<view>
-			<step-bar :steps="steps" :fixeda='true'></step-bar>
+			<step-bar :steps="steps" :fixeda='true' :stepval="stepval"></step-bar>
 		</view>
 		<uni-forms ref="form" :model="datainfo" :rules="rules">
 			<!-- 企业信息 -->
@@ -291,6 +291,7 @@
 					<uni-forms-item label="手机号码" name="email">
 						<uni-easyinput v-model="datainfo.email" type="number" :inputBorder='false' placeholder="请输入手机号码" />
 					</uni-forms-item>
+					<!--  家庭人口选填-->
 					<uni-forms-item label="家庭人口" name="email">
 						<uni-easyinput v-model="datainfo.email" type="number" :inputBorder='false' placeholder="请输入家庭人口" />
 					</uni-forms-item>
@@ -306,15 +307,15 @@
 							</view>
 						</uni-forms-item>
 					</picker>
-					<uni-forms-item label="应收应付款" name="email">
+					<!-- <uni-forms-item label="应收应付款" name="email">
 						<uni-easyinput v-model="datainfo.email" type="number" :inputBorder='false' placeholder="请输入应收应付款" />
-					</uni-forms-item>
-					<uni-forms-item label="经营情况" name="iszcy">
+					</uni-forms-item> -->
+					<!-- <uni-forms-item label="经营情况" name="iszcy">
 						<uni-easyinput type="textarea" autoHeight v-model="datainfo.email" :inputBorder='false' placeholder="请描述近几年经营情况" />
-					</uni-forms-item>
-					<uni-forms-item label="经营效益" name="email">
+					</uni-forms-item> -->
+					<!-- <uni-forms-item label="经营效益" name="email">
 						<uni-easyinput v-model="datainfo.email" type="number" :inputBorder='false' placeholder="请输入经营效益" />
-					</uni-forms-item>
+					</uni-forms-item> -->
 				</view>
 				<!-- * 家庭婚姻信息 -->
 				<view class="addtit mt3"><text>*</text>家庭婚姻信息</view>
@@ -367,6 +368,18 @@
 							</view>
 						</view>
 					</uni-forms-item>
+					<!-- 离婚状态上传 -->
+					<uni-forms-item label="离婚证" name="iszcy">
+						<view class="phobox">
+							<view class="phoboxa">
+								<view class="photop">
+									<image :src="jhico" class="bgimg"></image>
+									<image :src="phoicon" class="addimg"></image>
+								</view>
+								<view class="photit atit">上传离婚证</view>
+							</view>
+						</view>
+					</uni-forms-item>
 				</view>
 				<!-- * 户口簿信息-->
 				<view class="addtit mt3"><text>*</text>户口簿信息</view>
@@ -389,15 +402,15 @@
 									<image :src="hkico" class="bgimg"></image>
 									<image :src="phoicon" class="addimg"></image>
 								</view>
-								<view class="photit atit">上传户口簿本人页</view>
+								<view class="photit atit">上传户口簿每一页</view>
 							</view>
-							<view class="phoboxa">
+							<!-- <view class="phoboxa">
 								<view class="photop">
 									<image :src="hkico" class="bgimg"></image>
 									<image :src="phoicon" class="addimg"></image>
 								</view>
 								<view class="photit atit">上传户口簿配偶页</view>
-							</view>
+							</view> -->
 						</view>
 					</uni-forms-item>
 				</view>
@@ -449,7 +462,7 @@
 					</uni-forms-item>
 				</view>
 				<!-- * 反担保人家庭婚姻信息 -->
-				<view class="addtit mt3"><text>*</text>反担保人家庭婚姻信息</view>
+				<!-- <view class="addtit mt3"><text>*</text>反担保人家庭婚姻信息</view>
 				<view class="bgf plr12">
 					<picker  range-key='label' :value="qyidx" :range="qylist" class="isborder"  @change='bindDateChangea'>
 						<uni-forms-item label="婚姻状态" name="qymc">
@@ -484,9 +497,9 @@
 					<uni-forms-item label="配偶身份证号" name="email">
 						<uni-easyinput v-model="datainfo.email" :inputBorder='false' placeholder="自动识别" />
 					</uni-forms-item>
-				</view>
+				</view> -->
 				<!-- * 反担保人婚姻证明-->
-				<view class="addtit mt3"><text>*</text>反担保人婚姻证明</view>
+				<!-- <view class="addtit mt3"><text>*</text>反担保人婚姻证明</view>
 				<view class="bgf plr12">
 					<uni-forms-item label="结婚证" name="iszcy">
 						<view class="phobox">
@@ -499,9 +512,9 @@
 							</view>
 						</view>
 					</uni-forms-item>
-				</view>
+				</view> -->
 				<!-- * 反担保人户口簿信息-->
-				<view class="addtit mt3"><text>*</text>反担保人户口簿信息</view>
+				<!-- <view class="addtit mt3"><text>*</text>反担保人户口簿信息</view>
 				<view class="bgf plr12">
 					<uni-forms-item label="户口簿首页" name="iszcy">
 						<view class="phobox">
@@ -532,7 +545,7 @@
 							</view>
 						</view>
 					</uni-forms-item>
-				</view>
+				</view> -->
 				<!-- * 反担保人信用担保证明-->
 				<view class="addtit mt3">反担保人信用担保证明</view>
 				<view class="bgf plr12">
@@ -540,14 +553,15 @@
 						<view class="labtxt">个人工作证明
 							<text>(选填)</text>
 						</view>
-						<view class="phobox">
+						<view class="phobox" style="display: flex;flex-wrap: wrap;justify-content: space-between;">
 							<view class="phoboxa">
 								<view class="photop">
 									<image :src="zico" class="bgimg"></image>
 									<image :src="phoicon" class="addimg"></image>
 									<image :src="delimg" class="delimg"></image>
 								</view>
-								<view class="photit atit">上传个人工作证明</view>
+								<!-- <view class="photit atit">上传个人工作证明</view> -->
+								<view class="photit atit">公职人员上传个人工作证明</view>
 							</view>
 						</view>
 					</uni-forms-item>
@@ -587,7 +601,7 @@
 				<view class="bgf plr12">
 					<view class="fjbox">
 						<view class="fjtop flext">
-							<view class="ftit"><text>*</text>委托担保申请书</view>
+							<view class="ftit"><text>*</text>委托担保申请书<text class="mtxt" v-if="sqtype=='gr'">(须面签)</text></view>
 							<view class="fbtns cof64">
 								<image :src="downimg" class="downimg"></image>下载模板
 							</view>
@@ -1148,7 +1162,7 @@
 							</view>
 						</view>
 					</view>
-					<view class="fjbox">
+					<!-- <view class="fjbox">
 						<view class="fjtop flext">
 							<view class="ftit"><text>*</text>完税证明</view>
 							<lsj-upload ref="lsjUpload" childId="upload1" :width="width" :height="height" :option="option" :size="size" :formats="formats" :debug="debug" :instantly="instantly"
@@ -1164,13 +1178,12 @@
 									<view class="imgl"><image :src="filico" ></image></view>
 									<view class="tit">{{ite.name}}</view>
 								</view>
-								<!-- 删除 -->
 								<view class="delimg flex0" @click.stop="getDelFj(idx)">
 									<image :src="fdelimg"></image>
 								</view>
 							</view>
 						</view>
-					</view>
+					</view> -->
 				</view>
 			
 			</view>
@@ -1179,7 +1192,7 @@
 		<!-- btnd -->
 		<view class="addbtns">
 			<view class="addlbtn"><image :src="zancio"></image>暂存</view>
-			<view class="addrbtn">下一步</view>
+			<view class="addrbtn" @click="getNextFn">下一步</view>
 			<view class="addrbtn" @click="getSubmit">提交</view>
 		</view>
 		<!-- <pop-up type='1'></pop-up> -->
@@ -1253,7 +1266,7 @@
 				upimg:require('@/work/static/images/fup.png'),
 				filico:require('@/work/static/images/filico.png'),
 				fdelimg:require('@/work/static/images/del.png'),
-				steps:[{tit:'申请额度',status:2},{tit:'企业信息',status:1},{tit:'法人信息',status:0},{tit:'反担保人信息',status:0},{tit:'添加附件',status:0},],
+				steps:[{tit:'申请额度',status:0},{tit:'企业信息',status:1},{tit:'法人信息',status:2},{tit:'反担保人信息',status:3},{tit:'添加附件',status:4},],
 				stepval:1,
 				datainfo:{
 					qymcid:1,
@@ -1293,6 +1306,9 @@
 			getDbclFn(){
 				this.$tab.navigateTo("/work/pages/prove/dbcltips")
 			},
+			getNextFn(){
+				this.stepval=Number(this.stepval)+1
+			},
 			getDelphtFn(){
 				
 			},
@@ -1524,7 +1540,7 @@ color: #FFFFFF;}
 		.imgl{width: 40rpx;height: 40rpx;display: flex;align-items: center;flex: 0 0 auto;
 			image{width: 26rpx;height: 24rpx;}
 		}
-		.tit{font-size: 24rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
+		.tit{font-size: 26rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
 		.delimg{width: 40rpx;height:40rpx;margin-left: 16rpx;display: flex;align-items: center;justify-content: center;flex: 0 0 auto;
 			image{width: 24rpx;height: 24rpx;}
 		}

+ 192 - 54
work/pages/business/details.vue

@@ -1,56 +1,60 @@
 <template>
 	<view class="details">
-		<view class="detop">
-			<view class="head">
-				<view class="top">
-					<view class="toptit">安徽嘉欣医疗用品有限公司</view>
-					<view class="statbox">专精特新<image :src="start"></image></view>
+		<view class="zxtop">
+			<view class="failtit">该业务申请未通过风险部审核,可完善信息后进行申诉</view>
+			<view class="detop">
+				<!-- 归档 归档后没有业务进度-->
+				<image :src="gdicoimg" class="gdimg" v-if="gdflag"></image>
+				<view class="speed" v-else @click="getSpeedFn" :style="type=='ywjd'?'z-index: 6;':''">
+					<image :src="speedimg"></image>
+					<view>业务进度</view>
 				</view>
-				<view class="adr">企业地址 | 潜山市经济开发区</view>
-				<view class="adr">申报时间 | 2024-03-21 15:12:48</view>
-				<view class="adr">归档时间 | 2024-03-21 15:12:48</view>
-			</view>
-			<view class="deta">
-				<view class="lists">
-					<view class="tit">申请额度</view>
-					<view class="txt">500<text>/万元</text></view>
-				</view>
-				<view class="lists">
-					<view class="tit">使用期限</view>
-					<view class="txt">12<text>/个月</text></view>
-				</view>
-				<view class="lists">
-					<view class="tit">申贷银行</view>
-					<view class="txt">农商行</view>
-				</view>
-				<view class="lists">
-					<view class="tit">资金用途</view>
-					<view class="txt">流动资金周转</view>
+				<view class="head">
+					<view class="top">
+						<view class="toptit">安徽嘉欣医疗用品有限公司</view>
+						<view class="statbox">专精特新<image :src="start"></image></view>
+					</view>
+					<view class="adr">企业地址 | 潜山市经济开发区</view>
+					<view class="adr">申报时间 | 2024-03-21 15:12:48</view>
+					<view class="adr">归档时间 | 2024-03-21 15:12:48</view>
 				</view>
-				<view class="lists">
-					<view class="tit">还款来源</view>
-					<view class="txt">营业收入</view>
-				</view>
-				<view class="lists">
-					<view class="tit">担保类型</view>
-					<view class="txt">担保贷款</view>
+				<view class="deta">
+					<view class="lists">
+						<view class="tit">申请额度</view>
+						<view class="txt">500<text>/万元</text></view>
+					</view>
+					<view class="lists">
+						<view class="tit">使用期限</view>
+						<view class="txt">12<text>/个月</text></view>
+					</view>
+					<view class="lists">
+						<view class="tit">申贷银行</view>
+						<view class="txt">农商行</view>
+					</view>
+					<view class="lists">
+						<view class="tit">资金用途</view>
+						<view class="txt">流动资金周转</view>
+					</view>
+					<view class="lists">
+						<view class="tit">还款来源</view>
+						<view class="txt">营业收入</view>
+					</view>
+					<view class="lists">
+						<view class="tit">担保类型</view>
+						<view class="txt">担保贷款</view>
+					</view>
 				</view>
 			</view>
 		</view>
 		
-		<!-- 归档 归档后没有业务进度-->
-		<image :src="gdicoimg" class="gdimg" v-if="gdflag"></image>
-		<view class="speed" v-else @click="getSpeedFn" :style="type=='ywjd'?'z-index: 6;':''">
-			<image :src="speedimg"></image>
-			<view>业务进度</view>
-		</view>
 		<view class="main">
 			<!-- tab -->
-			<view class="tabs">
+			<view class="tabs" :class="fixedflag?'tabfix':''">
 				<view class="tab" :class="tabval==ite.val?'act':''" v-for="(ite,idx) in tabList" :key="idx" @click="getTab(ite.val)">{{ite.tit}}</view>
 			</view>
+			<view style="height:116rpx;" v-if="fixedflag"></view>
 			<!-- 企业信息 -->
-			<view class="mainb">
+			<view class="mainb" :style="'min-height: ' + minheight + 'px;'">
 				<block v-if="tabval==0">
 					<aqyxx @getDown="getDown" :datainfo="datainfo"></aqyxx>
 				</block>
@@ -73,13 +77,86 @@
 		<block v-if="!gdflag">
 			<view class="h50"></view>
 			<view class="footbtns">
-				<view class="fbtns bga" @click="getShFn">审核</view>
-				<view class="fbtns bgb">上传文件</view>
-				<view class="fbtns bga" @click="getSubmit">查看担保意向函</view>
+				<!-- 申请审核 start-->
+				<view class="fbtns bga" @click="getShFn('sh')">审核</view>
+				<!-- 业务审核后出具担保意向函-->
+				<!-- <view class="fbtns bgb">上传文件</view>
+				<view class="fbtns bga" @click="getSubmit">查看担保意向函</view> -->
+				<!-- end -->
+				<!-- a,b角按钮 start-->
+				<view class="fbtns bgb" @click="getShFn('jztcsh')">尽职调查反馈</view>
+				<view class="fbtns bga" @click="getShFn('ajssh')">a审核</view>
+				<view class="fbtns bga" @click="getShFn('bjssh')">b审核</view>
+				<!-- 审核后 -->
+				<view class="fbtns bga" @click="getMoreFn('more')">更多操作</view>
+				<!-- 未通过申诉 -->
+				<view class="fbtns bga">申诉</view>
+				<!-- end -->
+				<!-- 风险部门 start-->
+				<view class="fbtns bgb" @click="getMoreFn('wb')">外部工具平台</view>
+				<view class="fbtns bga" @click="getMoreFn('fxmore')">更多操作</view>
+				<!-- end -->
+				<!-- 上会管理员 start -->
+				<view class="fbtns bgb" @click="getMoreFn('shmore')">更多操作</view>
+				<view class="fbtns bga" @click="getShFn('shsh')">审核</view>
+				<!-- 上会管理员 end -->
+				<!-- 合同签约start -->
+				<view class="fbtns bgb" @click="getShFn('shhj')">上传附件</view>
+				<view class="fbtns bga" @click="getMoreFn('htqy')">出具合同</view>
+				<view class="fbtns bga" @click="getqmFn">签名</view>
+				<!-- 合同签约end -->
+				<!-- 风险部放款 start-->
+				<view class="fbtns bgb" @click="getShFn('shhj')">上传附件</view>
+				<view class="fbtns bga" @click="">出具放款合规表</view>
+				<!-- end -->
+				<view class="fbtns bga" @click="">放款通知书</view>
+				<view class="fbtns bga" @click="">一键归档</view>
 			</view>
 		</block>
-		
-		<pop-up :type="type" :stepList="stepList" :stepval="stepval" @getClose="getClose"></pop-up>
+		<!-- 更多操作 -->
+		<view class="bgbox" @click="getClose" v-if="moreflag"></view>
+		<view v-if="moreflag" class="morebox">
+			<view class="molists">
+				<!-- 审核详情后 -->
+				<block v-if="mtype=='more'">
+					<view class="mcoa" @click="getShFn('shhj')">上传附件</view>
+					<view>撤回</view>
+				</block>
+				<!--风险部门 start 外部工具平台 -->
+				<block v-if="mtype=='wb'">
+					<view >中国个人信用查询网</view>
+					<view class="mcoa">中国执行信息公开网</view>
+					<view>最高人民法院诉讼服务网</view>
+					<view>国家企业信用信息公示系统</view>
+				</block>
+				<!-- 更多操作 -->
+				<block v-if="mtype=='fxmore'">
+					<view @click="getShFn('fxbmsh')">审核</view>
+					<view class="mcoa">出具材料合规表</view>
+					<view @click="getShFn('shhj')">上传附件</view>
+					<view>撤回</view>
+				</block>
+				<!-- 风险部门 end -->
+				<!-- 上会管理员 start -->
+				<block v-if="mtype=='shmore'">
+					<view>出具评审意见签批表</view>
+					<view class="mcoa">上会纪要</view>
+					<view @click="getShFn('shhj')">上传附件</view>
+				</block>
+				<!-- 上会管理员 end -->
+				<!-- 合同签约 start -->
+				<block v-if="mtype=='htqy'">
+					<view>委托保证合同</view>
+					<view class="mcoa">保证反担保合同(法人)</view>
+					<view>保证反担保合同(自然人)</view>
+					<view>抵押反担保合同(法人)</view>
+					<view>抵押反担保合同(自然人)</view>
+				</block>
+				<!-- 合同签约 end -->
+			</view>
+			<view class="surbtns">确认</view>
+		</view>
+		<pop-up :type="type" :stepList="stepList" :stepval="stepval" @getClose="getClose" @getupSubmit="getupSubmit"></pop-up>
 	</view>
 </template>
 
@@ -118,19 +195,56 @@
 					{tit:"归档",time:'2024-03-10 16:12',val:4},
 				],
 				stepval:2,
-				gdflag:true,
+				gdflag:false,
+				moreflag:false,
+				mtype:'',
+				minheight:0,
+				listTop:0,//距离顶部的距离
+				fixedflag:false,
+			}
+		},
+		mounted() {
+			uni.getSystemInfo({
+				success: (e) => {
+					this.minheight = e.screenHeight- 50;
+				}
+			})
+			this.getHeightFn()
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			var listTop=Number(this.listTop)
+			if(scrollTop>listTop){
+				this.fixedflag=true
+			}else{
+				this.fixedflag=false
 			}
 		},
 		methods:{
 			checkPermi, checkRole,
 			getTab(val){
-				this.tabval=val
+				this.tabval=val;
+				uni.pageScrollTo({
+					scrollTop: Number(this.listTop),
+					duration: 0
+				})
 			},
 			getClose(){
-				this.type=''
+				this.type='';
+				this.moreflag=false;
+			},
+			getupSubmit(){
+				if(this.type=='ajssh'||this.type=='bjssh'||this.type=='fxbmsh'){
+					this.type='confirm'
+				}
 			},
-			getShFn(){
-				this.type='sh'
+			getShFn(type){
+				this.type=type;
+				this.moreflag=false;
+			},
+			getMoreFn(type){
+				this.mtype=type;
+				this.moreflag=true
 			},
 			getSpeedFn(){
 				if(this.type){
@@ -139,9 +253,16 @@
 					this.type='ywjd'
 				}
 			},
-			// getNextFn(){
-			// 	this.$tab.navigateTo("/work/pages/business/add")
-			// },
+			getqmFn(){
+				this.$tab.navigateTo("/work/pages/business/sign")
+			},
+			getHeightFn(){
+				let query = uni.createSelectorQuery().in(this);
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.zxtop').boundingClientRect(data => {
+					this.listTop = data.height//赋值,待会要用
+				}).exec();
+			},
 			getPreview(url) {
 				var newArr=[];
 				newArr.push(url)
@@ -182,7 +303,10 @@
 </script>
 
 <style lang="scss" scoped>
+.failtit{background: #FFECEC;font-weight: 500;font-size: 26rpx;color: #FF6969;text-align: center;line-height: 36rpx;padding: 22rpx;}
+.zxtop{padding-bottom: 2rpx;}
 .detop{background: #FFFFFF;padding:0rpx 24rpx;margin-bottom: 28rpx;flex: 0 0 auto;
+	position: relative;
 	.head{
 		padding: 40rpx 2rpx;border-bottom: 2rpx solid #E6E6E6;
 		.top{display: flex;align-items: center;overflow: hidden;
@@ -211,6 +335,7 @@
 }
 .main{background-color: #FFFFFF;flex: 1;display: flex;flex-direction: column;overflow: hidden;
 	.tabs{padding: 0 6rpx 0 36rpx;display: flex;flex-wrap: nowrap;overflow: auto;flex: 0 0 auto;
+		&.tabfix{position: fixed;left: 0;right: 0;z-index: 2;top: 0;background-color: #ffffff;border-bottom: 2rpx solid #E6E6E6;}
 		.tab{font-weight: 500;font-size: 26rpx;color: #666666;height: 116rpx;display: flex;align-items: center;margin-right: 26rpx;flex: 0 0 auto;position: relative;
 			&.act{color: #00A9F0;font-weight: bold;
 				&::after{width: 100%;background: #00A9F0;position: absolute;left: 0;bottom: 0;
@@ -222,7 +347,7 @@ border-radius: 2rpx;height: 4rpx;content: '';}
 }
 .speed{width: 96rpx;height: 140rpx;background: #FFFFFF;box-shadow: 0px 0px 14rpx 0px rgba(184,184,184,0.76);border-radius: 20rpx;
 	display: flex;align-items: center;flex-direction: column;justify-content: center;
-	position: fixed;right: 28rpx;top: 86rpx;z-index: 2;padding: 0 26rpx; 
+	position: absolute;right: 28rpx;top: 86rpx;z-index: 2;padding: 0 26rpx; 
 	image{width: 26rpx;height: 28rpx;margin-bottom: 8rpx;}
 	view{font-weight: 500;font-size: 22rpx;color: #666666;}
 }
@@ -233,4 +358,17 @@ border-radius: 2rpx;height: 4rpx;content: '';}
 		&.bgb{background: #FFFFFF;;color: $com-cd3;}
 	}	
 }
+.morebox{
+	position: fixed;left: 0;right: 0;bottom: 0;z-index: 10;
+	.molists{
+		view{width: 100%;background: #ffffff;font-weight: 500;font-size: 30rpx;color: #222327;border-bottom: 2rpx solid #E6E6E6;min-height: 100rpx;display: flex;align-items: center;justify-content: center;padding: 10rpx;
+		box-sizing: border-box;
+		 &.mcoa{color: #00A9F0;}
+		}
+	}
+	.surbtns{
+		width: 100%;height: 100rpx;background: #00A9F0;display: flex;align-items: center;justify-content: center;
+		font-size: 30rpx;color: #ffffff;margin-top: 24rpx;
+	}
+}
 </style>

+ 796 - 0
work/pages/business/sign.vue

@@ -0,0 +1,796 @@
+<template>
+	<view class="sign">
+		<view class="wrapper">
+			<view class="handBtn">
+				<!-- <image @click="selectColorEvent('black','#1A1A1A')" :src="selectColor === 'black' ? '../static/other/color_black_selected.png' : '../static/other/color_black.png'"
+				 :class="[selectColor === 'black' ? 'color_select' : '', 'black-select']"></image>
+				<image @click="selectColorEvent('red','#ca262a')" :src="selectColor === 'red' ? '../static/other/color_red_selected.png' : '../static/other/color_red.png'"
+				 :class="[selectColor === 'red' ? 'color_select' : '', 'black-select']"></image> -->
+				<!-- <button @click="retDraw" class="delBtn">重写</button>
+				<button @click="saveCanvasAsImg" class="saveBtn">保存</button>
+				<button @click="previewCanvasImg" class="previewBtn">预览</button>
+				<button @click="uploadCanvasImg" class="uploadBtn">上传</button>
+				<button @click="subCanvas" class="subBtn">完成</button> -->
+				<view class="signtit">请在上方空白处书写您的签名</view>
+				<view class="sinbtns bgb" @click="retDraw">清除重写</view>
+				<view class="sinbtns bga" @click="saveCanvasAsImg">提交签名</view>
+			</view>
+			<view class="handCenter">
+				<canvas class="handWriting" :disable-scroll="true" @touchstart="uploadScaleStart" @touchmove="uploadScaleMove"
+				 @touchend="uploadScaleEnd" canvas-id="handWriting"></canvas>
+			</view>
+			<!-- <view class="handRight">
+				<view class="handTitle">请签名</view>
+			</view> -->
+		</view>
+		<!-- 旋转图片canvas -->
+		<canvas canvas-id="hcamCacnvs" style="position:absolute;top:-2000%;" class="canvsborder"></canvas>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				canvasName: 'handWriting',
+				ctx: '',
+				canvasWidth: 0,
+				canvasHeight: 0,
+				transparent: 1, // 透明度
+				selectColor: 'black',
+				lineColor: '#1A1A1A', // 颜色
+				lineSize: 1.5, // 笔记倍数
+				lineMin: 0.5, // 最小笔画半径
+				lineMax: 4, // 最大笔画半径
+				pressure: 1, // 默认压力
+				smoothness: 60, //顺滑度,用60的距离来计算速度
+				currentPoint: {},
+				currentLine: [], // 当前线条
+				firstTouch: true, // 第一次触发
+				radius: 1, //画圆的半径
+				cutArea: {
+					top: 0,
+					right: 0,
+					bottom: 0,
+					left: 0
+				}, //裁剪区域
+				bethelPoint: [], //保存所有线条 生成的贝塞尔点;
+				lastPoint: 0,
+				chirography: [], //笔迹
+				currentChirography: {}, //当前笔迹
+				linePrack: [] //划线轨迹 , 生成线条的实际点
+			};
+		},
+		onLoad() {
+			let canvasName = this.canvasName;
+			let ctx = wx.createCanvasContext(canvasName);
+
+			this.ctx = ctx;
+			var query = wx.createSelectorQuery();
+			query
+				.select('.handCenter')
+				.boundingClientRect(rect => {
+					this.canvasWidth = rect.width;
+					this.canvasHeight = rect.height;
+
+					/* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 */
+					this.setCanvasBg('#fff');
+				})
+				.exec();
+		},
+		methods: {
+			// 笔迹开始
+			uploadScaleStart(e) {
+				if (e.type != 'touchstart') return false;
+				let ctx = this.ctx;
+				ctx.setFillStyle(this.lineColor); // 初始线条设置颜色
+				ctx.setGlobalAlpha(this.transparent); // 设置半透明
+				let currentPoint = {
+					x: e.touches[0].x,
+					y: e.touches[0].y
+				};
+				let currentLine = this.currentLine;
+				currentLine.unshift({
+					time: new Date().getTime(),
+					dis: 0,
+					x: currentPoint.x,
+					y: currentPoint.y
+				});
+				this.currentPoint = currentPoint;
+				// currentLine
+				if (this.firstTouch) {
+					this.cutArea = {
+						top: currentPoint.y,
+						right: currentPoint.x,
+						bottom: currentPoint.y,
+						left: currentPoint.x
+					};
+					this.firstTouch = false;
+				}
+				this.pointToLine(currentLine);
+			},
+			// 笔迹移动
+			uploadScaleMove(e) {
+				if (e.type != 'touchmove') return false;
+				if (e.cancelable) {
+					// 判断默认行为是否已经被禁用
+					if (!e.defaultPrevented) {
+						e.preventDefault();
+					}
+				}
+				let point = {
+					x: e.touches[0].x,
+					y: e.touches[0].y
+				};
+
+				//测试裁剪
+				if (point.y < this.cutArea.top) {
+					this.cutArea.top = point.y;
+				}
+				if (point.y < 0) this.cutArea.top = 0;
+
+				if (point.x > this.cutArea.right) {
+					this.cutArea.right = point.x;
+				}
+				if (this.canvasWidth - point.x <= 0) {
+					this.cutArea.right = this.canvasWidth;
+				}
+				if (point.y > this.cutArea.bottom) {
+					this.cutArea.bottom = point.y;
+				}
+				if (this.canvasHeight - point.y <= 0) {
+					this.cutArea.bottom = this.canvasHeight;
+				}
+				if (point.x < this.cutArea.left) {
+					this.cutArea.left = point.x;
+				}
+				if (point.x < 0) this.cutArea.left = 0;
+
+				this.lastPoint = this.currentPoint;
+				this.currentPoint = point;
+
+				let currentLine = this.currentLine;
+				currentLine.unshift({
+					time: new Date().getTime(),
+					dis: this.distance(this.currentPoint, this.lastPoint),
+					x: point.x,
+					y: point.y
+				});
+
+				this.pointToLine(currentLine);
+			},
+			// 笔迹结束
+			uploadScaleEnd(e) {
+				if (e.type != 'touchend') return 0;
+				let point = {
+					x: e.changedTouches[0].x,
+					y: e.changedTouches[0].y
+				};
+				this.lastPoint = this.currentPoint;
+				this.currentPoint = point;
+
+				let currentLine = this.currentLine;
+				currentLine.unshift({
+					time: new Date().getTime(),
+					dis: this.distance(this.currentPoint, this.lastPoint),
+					x: point.x,
+					y: point.y
+				});
+
+				if (currentLine.length > 2) {
+					var info = (currentLine[0].time - currentLine[currentLine.length - 1].time) / currentLine.length;
+					//$("#info").text(info.toFixed(2));
+				}
+				//一笔结束,保存笔迹的坐标点,清空,当前笔迹
+				//增加判断是否在手写区域;
+				this.pointToLine(currentLine);
+				var currentChirography = {
+					lineSize: this.lineSize,
+					lineColor: this.lineColor
+				};
+				var chirography = this.chirography;
+				chirography.unshift(currentChirography);
+				this.chirography = chirography;
+
+				var linePrack = this.linePrack;
+				linePrack.unshift(this.currentLine);
+				this.linePrack = linePrack;
+				this.currentLine = [];
+			},
+			retDraw() {
+				this.ctx.clearRect(0, 0, 700, 730);
+				this.ctx.draw();
+
+				//设置canvas背景
+				this.setCanvasBg('#fff');
+			},
+			//画两点之间的线条;参数为:line,会绘制最近的开始的两个点;
+			pointToLine(line) {
+				this.calcBethelLine(line);
+				return;
+			},
+			//计算插值的方式;
+			calcBethelLine(line) {
+				if (line.length <= 1) {
+					line[0].r = this.radius;
+					return;
+				}
+				let x0,
+					x1,
+					x2,
+					y0,
+					y1,
+					y2,
+					r0,
+					r1,
+					r2,
+					len,
+					lastRadius,
+					dis = 0,
+					time = 0,
+					curveValue = 0.5;
+				if (line.length <= 2) {
+					x0 = line[1].x;
+					y0 = line[1].y;
+					x2 = line[1].x + (line[0].x - line[1].x) * curveValue;
+					y2 = line[1].y + (line[0].y - line[1].y) * curveValue;
+					//x2 = line[1].x;
+					//y2 = line[1].y;
+					x1 = x0 + (x2 - x0) * curveValue;
+					y1 = y0 + (y2 - y0) * curveValue;
+				} else {
+					x0 = line[2].x + (line[1].x - line[2].x) * curveValue;
+					y0 = line[2].y + (line[1].y - line[2].y) * curveValue;
+					x1 = line[1].x;
+					y1 = line[1].y;
+					x2 = x1 + (line[0].x - x1) * curveValue;
+					y2 = y1 + (line[0].y - y1) * curveValue;
+				}
+				//从计算公式看,三个点分别是(x0,y0),(x1,y1),(x2,y2) ;(x1,y1)这个是控制点,控制点不会落在曲线上;实际上,这个点还会手写获取的实际点,却落在曲线上
+				len = this.distance({
+					x: x2,
+					y: y2
+				}, {
+					x: x0,
+					y: y0
+				});
+				lastRadius = this.radius;
+				for (let n = 0; n < line.length - 1; n++) {
+					dis += line[n].dis;
+					time += line[n].time - line[n + 1].time;
+					if (dis > this.smoothness) break;
+				}
+
+				this.radius = Math.min((time / len) * this.pressure + this.lineMin, this.lineMax) * this.lineSize;
+				line[0].r = this.radius;
+				//计算笔迹半径;
+				if (line.length <= 2) {
+					r0 = (lastRadius + this.radius) / 2;
+					r1 = r0;
+					r2 = r1;
+					//return;
+				} else {
+					r0 = (line[2].r + line[1].r) / 2;
+					r1 = line[1].r;
+					r2 = (line[1].r + line[0].r) / 2;
+				}
+				let n = 5;
+				let point = [];
+				for (let i = 0; i < n; i++) {
+					let t = i / (n - 1);
+					let x = (1 - t) * (1 - t) * x0 + 2 * t * (1 - t) * x1 + t * t * x2;
+					let y = (1 - t) * (1 - t) * y0 + 2 * t * (1 - t) * y1 + t * t * y2;
+					let r = lastRadius + ((this.radius - lastRadius) / n) * i;
+					point.push({
+						x: x,
+						y: y,
+						r: r
+					});
+					if (point.length == 3) {
+						let a = this.ctaCalc(point[0].x, point[0].y, point[0].r, point[1].x, point[1].y, point[1].r, point[2].x, point[2]
+							.y, point[2].r);
+						a[0].color = this.lineColor;
+						// let bethelPoint = this.bethelPoint;
+						// bethelPoint = bethelPoint.push(a);
+						this.bethelDraw(a, 1);
+						point = [{
+							x: x,
+							y: y,
+							r: r
+						}];
+					}
+				}
+				this.currentLine = line;
+			},
+			//求两点之间距离
+			distance(a, b) {
+				let x = b.x - a.x;
+				let y = b.y - a.y;
+				return Math.sqrt(x * x + y * y);
+			},
+			ctaCalc(x0, y0, r0, x1, y1, r1, x2, y2, r2) {
+				let a = [],
+					vx01,
+					vy01,
+					norm,
+					n_x0,
+					n_y0,
+					vx21,
+					vy21,
+					n_x2,
+					n_y2;
+				vx01 = x1 - x0;
+				vy01 = y1 - y0;
+				norm = Math.sqrt(vx01 * vx01 + vy01 * vy01 + 0.0001) * 2;
+				vx01 = (vx01 / norm) * r0;
+				vy01 = (vy01 / norm) * r0;
+				n_x0 = vy01;
+				n_y0 = -vx01;
+				vx21 = x1 - x2;
+				vy21 = y1 - y2;
+				norm = Math.sqrt(vx21 * vx21 + vy21 * vy21 + 0.0001) * 2;
+				vx21 = (vx21 / norm) * r2;
+				vy21 = (vy21 / norm) * r2;
+				n_x2 = -vy21;
+				n_y2 = vx21;
+				a.push({
+					mx: x0 + n_x0,
+					my: y0 + n_y0,
+					color: '#1A1A1A'
+				});
+				a.push({
+					c1x: x1 + n_x0,
+					c1y: y1 + n_y0,
+					c2x: x1 + n_x2,
+					c2y: y1 + n_y2,
+					ex: x2 + n_x2,
+					ey: y2 + n_y2
+				});
+				a.push({
+					c1x: x2 + n_x2 - vx21,
+					c1y: y2 + n_y2 - vy21,
+					c2x: x2 - n_x2 - vx21,
+					c2y: y2 - n_y2 - vy21,
+					ex: x2 - n_x2,
+					ey: y2 - n_y2
+				});
+				a.push({
+					c1x: x1 - n_x2,
+					c1y: y1 - n_y2,
+					c2x: x1 - n_x0,
+					c2y: y1 - n_y0,
+					ex: x0 - n_x0,
+					ey: y0 - n_y0
+				});
+				a.push({
+					c1x: x0 - n_x0 - vx01,
+					c1y: y0 - n_y0 - vy01,
+					c2x: x0 + n_x0 - vx01,
+					c2y: y0 + n_y0 - vy01,
+					ex: x0 + n_x0,
+					ey: y0 + n_y0
+				});
+				a[0].mx = a[0].mx.toFixed(1);
+				a[0].mx = parseFloat(a[0].mx);
+				a[0].my = a[0].my.toFixed(1);
+				a[0].my = parseFloat(a[0].my);
+				for (let i = 1; i < a.length; i++) {
+					a[i].c1x = a[i].c1x.toFixed(1);
+					a[i].c1x = parseFloat(a[i].c1x);
+					a[i].c1y = a[i].c1y.toFixed(1);
+					a[i].c1y = parseFloat(a[i].c1y);
+					a[i].c2x = a[i].c2x.toFixed(1);
+					a[i].c2x = parseFloat(a[i].c2x);
+					a[i].c2y = a[i].c2y.toFixed(1);
+					a[i].c2y = parseFloat(a[i].c2y);
+					a[i].ex = a[i].ex.toFixed(1);
+					a[i].ex = parseFloat(a[i].ex);
+					a[i].ey = a[i].ey.toFixed(1);
+					a[i].ey = parseFloat(a[i].ey);
+				}
+				return a;
+			},
+			bethelDraw(point, is_fill, color) {
+				let ctx = this.ctx;
+				ctx.beginPath();
+				ctx.moveTo(point[0].mx, point[0].my);
+				if (undefined != color) {
+					ctx.setFillStyle(color);
+					ctx.setStrokeStyle(color);
+				} else {
+					ctx.setFillStyle(point[0].color);
+					ctx.setStrokeStyle(point[0].color);
+				}
+				for (let i = 1; i < point.length; i++) {
+					ctx.bezierCurveTo(point[i].c1x, point[i].c1y, point[i].c2x, point[i].c2y, point[i].ex, point[i].ey);
+				}
+				ctx.stroke();
+				if (undefined != is_fill) {
+					ctx.fill(); //填充图形 ( 后绘制的图形会覆盖前面的图形, 绘制时注意先后顺序 )
+				}
+				ctx.draw(true);
+			},
+			selectColorEvent(str, color) {
+				this.selectColor = str;
+				this.lineColor = color;
+			},
+			//将Canvas内容转成 临时图片 --> cb 为回调函数 形参 tempImgPath 为 生成的图片临时路径
+			canvasToImg(cb) {
+				//这种写法移动端 出不来
+
+				this.ctx.draw(true, () => {
+					wx.canvasToTempFilePath({
+						canvasId: 'handWriting',
+						fileType: 'png',
+						quality: 1, //图片质量
+						success(res) {
+							// console.log(res.tempFilePath, 'canvas生成图片地址');
+
+							wx.showToast({
+								title: '执行了吗?'
+							});
+
+							cb(res.tempFilePath);
+						}
+					});
+				});
+			},
+			//完成
+			subCanvas() {
+				this.ctx.draw(true, () => {
+					wx.canvasToTempFilePath({
+						canvasId: 'handWriting',
+						fileType: 'png',
+						quality: 1, //图片质量
+						success(res) {
+							// console.log(res.tempFilePath, 'canvas生成图片地址');
+							wx.showToast({
+								title: '以保存'
+							});
+							//保存到系统相册
+							wx.saveImageToPhotosAlbum({
+								filePath: res.tempFilePath,
+								success(res) {
+									wx.showToast({
+										title: '已成功保存到相册',
+										duration: 2000
+									});
+								}
+							});
+						}
+					});
+				});
+			},
+			//保存到相册
+			saveCanvasAsImg() {
+
+				/*
+				this.canvasToImg( tempImgPath=>{
+					// console.log(tempImgPath, '临时路径');
+					wx.saveImageToPhotosAlbum({
+						filePath: tempImgPath,
+						success(res) {
+							wx.showToast({
+								title: '已保存到相册',
+								duration: 2000
+							});
+						}
+					})
+				} );
+		*/
+				var that=this;
+				wx.canvasToTempFilePath({
+					canvasId: 'handWriting',
+					fileType: 'png',
+					quality: 1, //图片质量
+					success(res) {
+						// 旋转图片90度在上传
+						//绘制canvas 旋转图片
+						let tempFilePaths = res.tempFilePath;
+						wx.getImageInfo({ // 获取图片的信息
+							src: tempFilePaths,
+							success: (msg) => {
+								// console.log(msg)
+								let height = msg.height / 2 //图片的高
+								let width = msg.width / 2
+								//开始旋转  旋转方向为顺时针  90  180  270  
+								if (width < height) { // 竖变横   左为正底   旋转后 为下为正底
+									// this.canvasWidth = height,
+									// this.canvasHeight = width,
+									console.log('这张图片 是竖的 要变成横屏的')
+									//绘制canvas 旋转图片
+									let canvas = wx.createCanvasContext('hcamCacnvs',that);
+									
+									// 逆时针旋转90度
+									canvas.translate(height / 2, width / 2)
+									canvas.rotate(270 * Math.PI / 180)
+									canvas.drawImage(tempFilePaths, -width / 2, -height / 2, width, height);
+									canvas.draw(false,()=> {
+										// 把当前画布指定区域的内容导出生成指定大小的图片。在 draw() 回调里调用该方法才能保证图片导出成功。
+										wx.canvasToTempFilePath({
+											canvasId: 'hcamCacnvs',
+											// canvas: canvas,
+											destWidth: 150,
+											destHeight: 50,
+											fileType: 'png',
+											quality: 1, //图片质量
+											success(vas) {
+												// that.uploadImg(vas.tempFilePath);  
+												//保存
+												// console.log(that.contractId)
+												uni.saveImageToPhotosAlbum({
+													filePath: vas.tempFilePath,
+													success(res) {
+														wx.showToast({
+															title: '已保存到相册',
+															duration: 2000
+														});
+													}
+												});
+												// uni.uploadFile({
+												// 	url: uni.getStorageSync(
+												// 			'requestPath') +
+												// 		'/app/contract/getSign', //仅为示例,非真实的接口地址
+												// 	filePath: vas.tempFilePath,
+												// 	name: 'file',
+												// 	formData: {
+												// 		'contractId': that
+												// 			.contractId // 上传附带参数
+												// 	},
+												// 	success: (
+												// 		uploadFileRes) => {
+												// 		// 根据接口具体返回格式   赋值具体对应url
+												// 		console.log(
+												// 			uploadFileRes
+												// 		)
+												// 		uni.showToast({
+												// 			title: '签名成功',
+												// 			duration: 500
+												// 		});
+												// 		setTimeout(() => {
+												// 			uni.navigateBack({
+												// 				delta: 1
+												// 			});
+												// 		}, 500)
+												// 	}
+												// });
+											},	
+										}) // 在自定义组件下,当前组件实例的this,以操作组件内 canvas 组件
+									// }, 300));
+										// (data) => { // 将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中
+										// console.log(data,12)
+											
+										})
+								}
+							}
+						})
+						return 
+						// console.log(res.tempFilePath, 'canvas生成图片地址');
+						wx.saveImageToPhotosAlbum({
+							filePath: res.tempFilePath,
+							success(res) {
+								wx.showToast({
+									title: '已保存到相册',
+									duration: 2000
+								});
+							}
+						});
+					}
+				});
+			},
+			//预览
+			previewCanvasImg() {
+				wx.canvasToTempFilePath({
+					canvasId: 'handWriting',
+					fileType: 'jpg',
+					quality: 1, //图片质量
+					success(res) {
+						// console.log(res.tempFilePath, 'canvas生成图片地址');
+
+						wx.previewImage({
+							urls: [res.tempFilePath] //预览图片 数组
+						});
+					}
+				});
+
+				/*	//移动端出不来  ^~^!!
+						this.canvasToImg( tempImgPath=>{
+							wx.previewImage({
+								urls: [tempImgPath], //预览图片 数组
+							})
+						} );
+				*/
+			},
+			//上传
+			uploadCanvasImg() {
+
+				wx.canvasToTempFilePath({
+					canvasId: 'handWriting',
+					fileType: 'png',
+					quality: 1, //图片质量
+					success(res) {
+						// console.log(res.tempFilePath, 'canvas生成图片地址');
+						
+						//上传
+						wx.uploadFile({
+							url: 'https://example.weixin.qq.com/upload', // 仅为示例,非真实的接口地址
+							filePath: res.tempFilePath,
+							name: 'file_signature',
+							formData: {
+								user: 'test'
+							},
+							success(res) {
+								const data = res.data;
+								// do something
+							}
+						});
+					}
+				});
+			},
+			//设置canvas背景色  不设置  导出的canvas的背景为透明
+			//@params:字符串  color
+			setCanvasBg(color) {
+
+				/* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 */
+				//rect() 参数说明  矩形路径左上角的横坐标,左上角的纵坐标, 矩形路径的宽度, 矩形路径的高度
+				//这里是 canvasHeight - 4 是因为下边盖住边框了,所以手动减了写
+				this.ctx.rect(0, 0, this.canvasWidth, this.canvasHeight - 4);
+				// ctx.setFillStyle('red')
+				this.ctx.setFillStyle(color);
+				this.ctx.fill(); //设置填充
+				this.ctx.draw(); //开画
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	page {
+		background: #fbfbfb;
+		height: auto;
+		overflow: hidden;
+	}
+.sign{width: 100%;height: 100vh;padding: 24rpx;}
+.signtit{font-weight: 500;font-size: 30rpx;position: absolute;top: 220rpx;word-break: keep-all;transform: rotate(90deg);
+color: #666666;left: -140rpx;}
+.sinbtns{width: 214rpx;height: 74rpx;display: flex;align-items: center;justify-content: center;font-weight: 500;
+font-size: 30rpx;border-radius: 20rpx;position: absolute;left: -46rpx;transform: rotate(90deg);
+	&.bga{background: #00A9F0;color: #FFFFFF;bottom: 126rpx;}
+	&.bgb{background: #FFDEDE;color: #FF6969;bottom: 380rpx;}
+}
+	.wrapper {
+		border: 2rpx solid  #DADADA;;
+		overflow: hidden;
+		display: flex;
+		align-content: center;
+		flex-direction: row;
+		justify-content: center;
+		font-size: 28rpx;
+		width: 100%;height: 100%;
+	}
+
+	.handWriting {
+		background: #fff;
+		width: 100%;
+		height: 100%;
+	}
+
+	.handRight {
+		display: inline-flex;
+		align-items: center;
+	}
+
+	.handCenter {
+		/* border: 4rpx dashed #e9e9e9; */
+		flex: 1;
+		overflow: hidden;
+		box-sizing: border-box;
+	}
+
+	.handTitle {
+		transform: rotate(90deg);
+		flex: 1;
+		color: #666;
+	}
+
+	.handBtn button {
+		font-size: 28rpx;
+	}
+
+	.handBtn {
+		position: relative;
+		height: 100%;
+		width: 60px;
+		display: inline-flex;
+		flex-direction: column;
+		justify-content: space-between;
+		align-content: space-between;
+		flex: 0 0 auto;
+		border-right: 2rpx solid #DADADA;
+	}
+
+	.delBtn {
+		position: absolute;
+		top: 250rpx;
+		left: 0rpx;
+		transform: rotate(90deg);
+		color: #666;
+	}
+
+	.delBtn image {
+		position: absolute;
+		top: 13rpx;
+		left: 25rpx;
+	}
+
+	.subBtn {
+		position: absolute;
+		bottom: 52rpx;
+		left: -3rpx;
+		display: inline-flex;
+		transform: rotate(90deg);
+		background: #008ef6;
+		color: #fff;
+		margin-bottom: 30rpx;
+		text-align: center;
+		justify-content: center;
+	}
+
+	/*Peach - 新增 - 保存*/
+
+	.saveBtn {
+		position: absolute;
+		top: 375rpx;
+		left: 0rpx;
+		transform: rotate(90deg);
+		color: #666;
+	}
+
+	.previewBtn {
+		position: absolute;
+		top: 500rpx;
+		left: 0rpx;
+		transform: rotate(90deg);
+		color: #666;
+	}
+
+	.uploadBtn {
+		position: absolute;
+		top: 625rpx;
+		left: 0rpx;
+		transform: rotate(90deg);
+		color: #666;
+	}
+
+	/*Peach - 新增 - 保存*/
+
+	.black-select {
+		width: 60rpx;
+		height: 60rpx;
+		position: absolute;
+		top: 30rpx;
+		left: 25rpx;
+	}
+
+	.black-select.color_select {
+		width: 90rpx;
+		height: 90rpx;
+		top: 100rpx;
+		left: 10rpx;
+	}
+
+	.red-select {
+		width: 60rpx;
+		height: 60rpx;
+		position: absolute;
+		top: 140rpx;
+		left: 25rpx;
+	}
+
+	.red-select.color_select {
+		width: 90rpx;
+		height: 90rpx;
+		top: 120rpx;
+		left: 10rpx;
+	}
+</style>

+ 84 - 6
work/pages/custom/details.vue

@@ -1,28 +1,80 @@
 <template>
 	<view class="details">
 		<view class="detop">
-			
+			<view class="headbox">
+				<view class="head">林</view>
+				<view class="flex1">
+					<view class="headt">林振宇</view>
+					<view class="headx">资料更新时间 | 2023年5月24日</view>
+				</view>
+			</view>
+			<view class="tit">
+				<image :src="titimg"></image>客户基本信息
+			</view>
+			<view class="txt">身份证号:<text>34282419730618003X</text></view>
+			<view class="txt">证件有效期:<text>2017.12.27 - 2037.12.27</text></view>
+			<view class="txt">居住地址:<text>安徽省安庆市潜山市梅城镇</text></view>
+			<view class="txt">手机号码:<text>18705568888</text></view>
+		</view>
+		<!-- 已添加关联企业 -->
+		<view class="zhead flexc">
+			<view class="tit">
+				<image :src="titimg"></image>已添加关联企业
+			</view>
+			<view class="zheadr flexc" :class="zheList[0].zheflag?'':'act'" @click="getZheFn(0)">
+				{{zheList[0].zheflag?'折叠信息':'展开信息'}}
+				<image :src="upimg"></image></view>
 		</view>
-		
+		<!-- 列表 -->
+		<block v-if="zheList[0].zheflag">
+			<bus-list :datalist="qylist" type="qy"></bus-list>
+		</block>
+		<!-- 历史申贷记录 -->
+		<view class="zhead flexc">
+			<view class="tit">
+				<image :src="titimg"></image>历史申贷记录
+			</view>
+			<view class="zheadr flexc" :class="zheList[1].zheflag?'':'act'" @click="getZheFn(1)">
+				{{zheList[1].zheflag?'折叠信息':'展开信息'}}
+				<image :src="upimg"></image></view>
+		</view>
+		<!-- 列表 -->
+		<block v-if="zheList[1].zheflag">
+			<bus-list :datalist="sdjllist" type="sdjl" @getDetail="getDetail"></bus-list>
+		</block>
 	</view>
 </template>
 
 <script>
 	import config from '@/config'
 	const baseUrl = config.baseUrl
+	import busList from "@/work/components/business/list.vue"
 	import {uploadmore} from '@/utils/common.js'
 	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
 	export default{
-		components:{},
+		components:{busList},
 		data(){
 			return{
 				titimg:require('@/work/static/images/infotit.png'),
+				upimg:require('@/work/static/images/up.png'),
+				list:[{tit:'123'}],
+				qylist:[{tit:123},{tit:123},],
+				sdjllist:[{tit:123}],
+				zheList:[{zheflag:true},{zheflag:true},{zheflag:true},{zheflag:true}],
+				type:'qy',
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
 			}
 		},
 		methods:{
 			checkPermi, checkRole,
-			getNextFn(){
-				this.$tab.navigateTo("/work/pages/business/add")
+			getDetail(){
+				this.$tab.navigateTo("/work/pages/business/details")
+			},
+			getZheFn(idx){
+				this.zheList[idx].zheflag=!this.zheList[idx].zheflag
 			},
 		}
 	}
@@ -30,6 +82,32 @@
 
 <style lang="scss" scoped>
 .detop{
-	background-color: #ffffff;
+	background-color: #ffffff;padding: 0rpx 24rpx 2rpx;
+	.headbox{display: flex;align-items: center;padding: 42rpx 12rpx;border-bottom: 2rpx solid #E6E6E6;;
+		.head{width: 86rpx;height: 86rpx;background: #00A9F0;border-radius: 10rpx;font-weight: bold;margin-right: 36rpx;flex: 0 0 auto;font-size: 40rpx;display: flex;align-items: center;justify-content: center;color: #FFFFFF;}
+		.headt{font-weight: bold;font-size: 40rpx;color: #222327;margin-bottom: 10rpx;}
+		.headx{font-weight: 500;font-size: 24rpx;color: #666666;}
+			
+	}
+}
+.tit{font-weight: bold;font-size: 30rpx;color: $com-cd3;display: flex;align-items: center;padding-top: 44rpx;margin-bottom:32rpx;padding-left: 14rpx;
+	image{width: 30rpx;height: 30rpx;margin-right: 12rpx;}
+}
+.txt{font-weight: bold;font-size: 30rpx;color: #222327;margin-bottom: 44rpx;padding-left: 14rpx;
+	text{color: #666666;font-weight: 500;
+		&.txta{color: #28C529;}
+	}
+}
+.flexcw{display: flex;
+	.txt{min-width: 50%;padding-right: 20rpx;box-sizing: border-box;}
+}
+.zhead{padding: 30rpx 40rpx 30rpx 24rpx;
+	.tit{margin-bottom: 0;padding-top: 0;flex: 1;}
+	.zheadr{font-weight: 500;font-size: 26rpx;flex: 0 0 auto;color: #666666;
+		&.act{
+			image{transform: rotate(180deg);}
+		}
+		image{width: 26rpx;height: 22rpx;margin-left: 18rpx;transition: all 0.3;}
+	}
 }
 </style>

+ 63 - 0
work/pages/file/details.vue

@@ -0,0 +1,63 @@
+<template>
+	<view class="details">
+		<view class="detop">
+			<view class="head">
+				<view class="top">
+					<view class="toptit">安徽嘉欣医疗用品有限公司</view>
+					<view class="statbox">专精特新<image :src="start"></image></view>
+				</view>
+				<view class="adr">企业地址 | 潜山市经济开发区</view>
+			</view>
+		</view>
+		<!-- 文件列表 -->
+		<view class="main">
+			<bus-list :datalist="list" :wtdt="wtdt" :type="type" @getDetail="getDetail"></bus-list>
+		</view>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import busList from "@/work/components/business/list.vue"
+	import {uploadmore} from '@/utils/common.js'
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{busList},
+		data(){
+			return{
+				start:require('@/work/static/images/start.png'),
+				titimg:require('@/work/static/images/infotit.png'),
+				list:[{tit:'123'},{tit:'123'}],
+				wtdt:'',
+				type:'filedet'
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(){
+				this.$tab.navigateTo("/work/pages/file/wjdetails")
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.detop{background: #FFFFFF;padding:0rpx 24rpx;margin-bottom: 28rpx;flex: 0 0 auto;
+	position: relative;
+	.head{
+		padding: 40rpx 2rpx;
+		.top{display: flex;align-items: center;overflow: hidden;
+			.toptit{font-weight: bold;font-size: 40rpx;color: #222327;}
+			.statbox{min-width: 140rpx;height: 36rpx;background-color: rgba(255,177,50,0.3);padding: 0 14rpx;box-sizing: border-box;font-weight: bold;font-size: 22rpx;color: #FF6924;display: flex;align-items: center;flex: 0 0 auto;border-radius: 10rpx;margin-left: 34rpx;
+				image{width: 22rpx;height: 22rpx;margin-left: 6rpx;}
+			}	
+		}
+		.adr{font-weight: 500;font-size: 26rpx;color: #666666;margin-top: 12rpx;}
+	}
+}
+.main{background-color: #FFFFFF;flex: 1;display: flex;flex-direction: column;overflow: hidden;
+	
+}
+</style>

+ 155 - 0
work/pages/file/list.vue

@@ -0,0 +1,155 @@
+<template>
+	<view class="listbox">
+		<view class="fixedt">
+			<!-- 选择器 -->
+			<view class="flexc checkbox">
+				<picker mode="date"   @change='bindDateChangea'>
+					<view class="chekt">
+						<view>{{sbsj|| "申报时间"}}</view>
+						<image :src="upimg"></image>
+					</view>
+				</picker>
+				<picker range-key='label' :value="shidx" :range="shlist"  @change='bindDateChangeb'>
+					<view class="chekt">
+						<view>{{shzt || "申贷次数"}}</view>
+						<image :src="upimg"></image>
+					</view>
+				</picker>
+				<view class="reset" @click="getResetFn">
+					<image :src="resetimg"></image>
+				</view>
+				<view class="topc flexc">
+					<image :src="secimg"></image>
+					<input  placeholder="请输入客户名称" confirm-type="search" v-model="usename" @confirm="getConfirm"/>
+				</view>
+			</view>
+		</view>
+		<!-- 列表 -->
+		<view class="plr18">
+			<bus-list :datalist="list" :wtdt="wtdt" :type="type" @getDetail="getDetail"></bus-list>
+		</view>
+		<view class="scanbox flexcc">
+			<image :src="scanimg"></image>
+			扫码查看
+		</view>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import busList from "@/work/components/business/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{busList},
+		data(){
+			return{
+				secimg:require("@/static/images/home/hsearch.png"),
+				upimg:require('@/work/static/images/sup.png'),
+				resetimg:require('@/work/static/images/reset.png'),
+				scanimg:require('@/work/static/images/scan.png'),
+				list:[{tit:'123'},{tit:'123'}],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				// limit:''
+				type:'file',
+			}
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			// if (this.reachflag) {
+			// 	this.pageNum++
+			// 	this.getDataFn()
+			// }
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(){
+				this.$tab.navigateTo("/work/pages/file/details")
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.sbsj=val;
+				this.getrefreshData()
+			},
+			bindDateChangeb(e){
+				var val=e.detail.value;
+				this.shzt=this.shlist[val].label;
+				this.shztid=this.shlist[val].value;
+				this.getrefreshData()
+			},
+			getResetFn(){
+				// 重置
+				this.getrefreshData()
+			},
+			getrefreshData(){
+				// this.pageNum=1;
+				// this.list=[];
+				// this.reachflag=true;
+				// this.getDataFn()
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				getCaseListFn(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				}) 
+			},
+		},
+		
+	}
+</script>
+
+<style lang="scss" scoped>
+.fixedt{position: fixed;left: 0;right: 0;top: 0;z-index: 2;}
+.fixedt /deep/ uni-picker{flex: 1;}
+
+.checkbox{padding:16rpx 32rpx;background-color: #efefef;
+	.chekt{display: flex;align-items: center;margin-right: 12rpx;height:88rpx;
+		view{text-align: center;
+			font-weight: bold;font-size: 26rpx;color: #374B61;width: 136rpx;word-break: break-all;text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;white-space: normal;}
+		image{width: 16rpx;height: 12rpx;flex: 0 0 auto;margin-left: 4rpx;}
+	}
+}
+.reset{width:56rpx; height: 88rpx;display: flex;align-items: center;justify-content: center;
+	image{width: 26rpx;height: 30rpx;}
+}
+.topc{border-radius: 34rpx;height:68rpx;box-sizing: border-box;padding:0 28rpx;position: relative;flex:1;background-color:rgba(90, 135, 186, 0.2);width: 260rpx;
+	flex: 0 0 auto;margin-left: 20rpx;
+	input{font-weight: 500;font-size: 26rpx;color: #222327;}
+	image{width: 30rpx;height: 30rpx;margin-right: 16rpx;flex: 0 0 auto;}
+}
+.listbox{padding-top: 120rpx;padding-bottom: 100rpx;}
+.scanbox{position: fixed;left: 0;right: 0;bottom: 0;height: 100rpx;
+background: #00A9F0;font-weight: bold;font-size: 30rpx;color: #FFFFFF;
+	image{width: 26rpx;height: 26rpx;margin-right: 24rpx;}
+}
+</style>

+ 86 - 0
work/pages/file/wjdetails.vue

@@ -0,0 +1,86 @@
+<template>
+	<view class="wjlists">
+		<view class="tabs">
+			<view class="tab" :class="tabval==ite.val?'act':''" v-for="(ite,idx) in tabList" :key="idx" @click="getTab(ite.val)">{{ite.tit}}</view>
+		</view>
+		<view class="fjlists"  v-for="(fite,fidx) in filelist" :key='fidx'>
+			<view class="flext" @click="getDown(fite.url)">
+				<view class="imgl"><image :src="filico" ></image></view>
+				<view class="tit">{{fite.name}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import {uploadmore} from '@/utils/common.js'
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{},
+		data(){
+			return{
+				hrimg:require('@/work/static/images/hrimg.png'),
+				filico:require('@/work/static/images/filico.png'),
+				tabval:0,
+				tabList:[{tit:"客户上传",val:0},{tit:"平台上传",val:1}],
+				filelist:[{name:"安徽嘉欣医疗用品有限公司0403委托担保申请书.pdf"},{name:"安徽嘉欣医疗用品有限公司0403委托担保申请书.pdf"},]
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getTab(val){
+				this.tabval=val
+			},
+			getDown(e){
+				uni.showLoading({
+					title: '加载中'
+				});
+				var url=baseUrl+e;
+				uni.downloadFile({
+					url: url,//文件的下载路径
+					success(result) {
+							uni.hideLoading()
+						var filePath = result.tempFilePath;
+						   uni.openDocument({
+						     filePath: filePath,
+						     showMenu: true,
+						     success: function (res) {
+						       // console.log('打开文档成功');
+						     }
+						   });
+					},
+					fail(res) {uni.hideLoading()}
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+page{background: #ffffff;}
+.tabs{padding: 0 6rpx 0 36rpx;display: flex;flex-wrap: nowrap;overflow: auto;flex: 0 0 auto;border-bottom: 2rpx solid #E6E6E6;position: fixed;left: 0;top: 0;right: 0;z-index: 2;
+	.tab{font-weight: 500;font-size: 26rpx;color: #666666;height: 116rpx;display: flex;align-items: center;margin-right:180rpx;flex: 0 0 auto;position: relative;
+		&.act{color: #00A9F0;font-weight: bold;
+			&::after{width: 100%;background: #00A9F0;position: absolute;left: 0;bottom: 0;
+border-radius: 2rpx;height: 4rpx;content: '';}
+		}
+	}
+}
+.wjlists{
+	padding: 120rpx 0 40rpx;
+	// 附件
+	.fjlists {display: flex;align-items: flex-start;justify-content: space-between;margin-top: 60rpx;padding: 0 36rpx;
+		&:last-child{margin-bottom: 0;}
+		.imgl{width: 40rpx;height: 40rpx;display: flex;align-items: center;flex: 0 0 auto;
+			image{width: 26rpx;height: 24rpx;}
+		}
+		.tit{font-size: 26rpx;color: #222327;font-weight: 500;margin-top: 4rpx;}
+		.delimg{width: 40rpx;height:40rpx;margin-left: 16rpx;display: flex;align-items: center;justify-content: center;flex: 0 0 auto;
+			image{width: 24rpx;height: 24rpx;}
+		}
+		.txta{color: #28C529;font-weight: 500;line-height: 40rpx;flex: 0 0 auto;margin-left: 18rpx;padding: 0 6rpx;}
+	}
+}
+</style>

+ 4 - 0
work/pages/prove/addqy.vue

@@ -41,6 +41,10 @@
 					<uni-forms-item label="营业期限" name="email">
 						<uni-easyinput v-model="user.email" :inputBorder='false' placeholder="自动识别" />
 					</uni-forms-item>
+					<uni-forms-item label="经营范围" name="email">
+						<uni-easyinput type="textarea" :autoHeight="true" v-model="user.email" :inputBorder='false'
+							placeholder="自动识别" />
+					</uni-forms-item>
 				</block>
 				<view class="upbox" :class="zheList[idx].zheflag?'':'act'" @click="getZheFn(idx)">
 					<image :src="upimg"></image>

BIN
work/static/images/aap.png


BIN
work/static/images/addp.png


BIN
work/static/images/aup.png


BIN
work/static/images/files.png


BIN
work/static/images/filz.png


BIN
work/static/images/rimga.png


BIN
work/static/images/scan.png


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác