• 团队冲刺第一阶段 4


    今天主要绘制了图片上传界面,实现了基本页面之间的跳转

     ImaRecohnition.vue

    <template>
    	<view>
    		<view class="sunui-uploader-bd">
    			<view class="sunui-uploader-files">
    				<block v-for="(item, index) in upload_before_list" :key="index">
    					<view class="sunui-uploader-file" :class="[item.upload_percent < 100 ? 'sunui-uploader-file-status' : '']" @click="previewImage(index)">
    						<!-- step1.这里修改服务器返回字段 !!! -->
    						<image class="sunui-uploader-img" :style="upload_img_wh" :src="item.path" mode="aspectFill" />
    						<view class="sunui-img-removeicon right" @click.stop="removeImage(index)" v-show="upimg_move">×</view>
    						<view class="sunui-loader-filecontent" v-if="item.upload_percent < 100">{{ item.upload_percent }}%</view>
    					</view>
    				</block>
    				<view v-show="upload_len < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @click="chooseImage" :style="upload_img_wh">
    					<view><text class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text></view>
    				</view>
    			</view>
    		</view>
    	</view>
    </template>
    
    <script>
    export default {
    	data() {
    		return {
    			upload_len: 0,
    			upload_cache: [],
    			upload_cache_list: [],
    			upload_before_list: []
    		};
    	},
    	name: 'sunui-upimg',
    	props: {
    		// 服务器url
    		url: {
    			type: String,
    			default: 'http://octoberimg.viphk.ngrok.org/SmartCloudAlbum_war_exploded/Cloud/UploadImg/'
    		},
    		// 上传样式宽高
    		upload_img_wh: {
    			type: String,
    			default: '162rpx;height:162rpx;'
    		},
    		// 上传数量
    		upload_count: {
    			type: [Number, String],
    			default: 9
    		},
    		// 是否自动上传? 可以先用变量为false然后再改为true即为手动上传
    		upload_auto: {
    			type: Boolean,
    			default: true
    		},
    		// 是否显示删除
    		upimg_move: {
    			type: Boolean,
    			default: true
    		},
    		// 服务器预览图片
    		upimg_preview: {
    			type: Array,
    			default: () => {
    				return [];
    			}
    		},
    		// 服务器返回预览(看服务器卡顿情况设定)
    		upimg_delaytime: {
    			type: [Number, String],
    			default: 300
    		},
    		// 请求头信息
    		header: {
    			type: Object,
    			default: () => {
    				return {};
    			}
    		}
    	},
    	async created() {
    		let _self = this;
    		setTimeout(() => {
    			this.upload_before_list = this.upload_before_list.concat(this.upimg_preview);
    			this.upload_len = this.upload_before_list.length;
    			this.upimg_preview.map(item => {
    				// step2.这里修改服务器返回字段 !!!
    				this.upload_cache_list.push(item.path);
    			});
    			this.emit();
    		}, this.upimg_delaytime);
    	},
    	methods: {
    		upImage(paths,header) {
    			let _self = this;
    			const promises = paths.map(function(path) {
    				return promisify(upload)({
    					url: _self.url,
    					path: path,
    					name: 'file',
    					extra: header,
    					_self: _self
    				});
    			});
    
    			uni.showLoading({
    				title: `正在上传...`
    			});
    	
    			Promise.all(promises)
    				.then(function(data) {
    					uni.hideLoading();
    					_self.upload_cache_list.push(...data);
    					_self.emit();
    				})
    				.catch(function(res) {
    					uni.hideLoading();
    				});
    		},
    		chooseImage() {
    			let _self = this;
    			uni.chooseImage({
    				count: _self.upload_count - _self.upload_before_list.length,
    				sizeType: ['compressed', 'original'],
    				sourceType: ['album', 'camera'],
    				success: function(res) {
    					for (let i = 0, len = res.tempFiles.length; i < len; i++) {
    						res.tempFiles[i]['upload_percent'] = 0;
    						_self.upload_before_list.push(res.tempFiles[i]);
    					}
    					_self.upload_cache = res.tempFilePaths;
    					_self.upload(_self.upload_auto);
    				},
    				fail: function(err) {
    					console.log(err);
    				}
    			});
    		},
    		async upload(upload_auto) {
    			let _self = this;
    			upload_auto ? await _self.upImage(_self.upload_cache,_self.header) : console.warn(`传输参数:this.$refs.xx.upload(true)才可上传,默认false`);
    		},
    		previewImage(idx) {
    			let _self = this;
    			let preview = [];
    			for (let i = 0, len = _self.upload_before_list.length; i < len; i++) {
    				// step3.这里修改服务器返回字段 !!!
    				preview.push(_self.upload_before_list[i].path);
    			}
    			uni.previewImage({
    				current: idx,
    				urls: preview
    			});
    		},
    		removeImage(idx) {
    			let _self = this;
    			_self.upload_before_list.splice(idx, 1);
    			_self.upload_cache_list.splice(idx, 1);
    			_self.upload_len = _self.upload_before_list.length;
    			_self.emit();
    		},
    		emit() {
    			let _self = this;
    			_self.$emit('change', _self.upload_cache_list);
    		}
    	}
    };
    
    const promisify = api => {
    	return function(options, ...params) {
    		return new Promise(function(resolve, reject) {
    			api(
    				Object.assign({}, options, {
    					success: resolve,
    					fail: reject
    				}),
    				...params
    			);
    		});
    	};
    };
    
    const upload = function(options) {
    	let url = options.url,
    		_self = options._self,
    		path = options.path,
    		name = options.name,
    		// data = options.data,
    		extra = options.extra,
    		success = options.success,
    		progress = options.progress,
    		fail = options.fail;
    
    	const uploadTask = uni.uploadFile({
    		url: url,
    		filePath: path,
    		name: name,
    		formData: extra,
    		success: function(res) {
    			var data = res.data;
    			console.warn('sunui-upimg - 如发现没有获取到返回值请到源码191行修改后端返回图片路径以便正常使用插件', JSON.parse(data));
    			try {
    				//Tip : 切记->主要修改这里图片的返回值为真实返回路径!!! 详情见示例
    				data = JSON.parse(res.data);
    			} catch (e) {
    				throw (e, data);
    			}
    			console.log(data.msg);
    			// 根据自己的返回数据做相应判断,服务器返回200即代表成功请求
    			if (res.statusCode == 200) {
    				if (data.msg=='successful') {
    					success(data);
    					for (let i = 0, len = _self.upload_before_list.length; i < len; i++) {
    						_self.upload_before_list[i]['upload_percent'] = 100;
    					}
    				}
    			} else {
    				if (fail) {
    					fail(data);
    				}
    			}
    		},
    		fail: function(res) {
    			console.log(res);
    			if (fail) {
    				fail(res);
    			}
    		}
    	});
    	uploadTask.onProgressUpdate(async function(res) {
    		for (let i = 0, len = _self.upload_before_list.length; i < len; i++) {
    			_self.upload_before_list[i]['upload_percent'] = await res.progress;
    		}
    		_self.upload_before_list = _self.upload_before_list;
    		_self.upload_len = _self.upload_before_list.length;
    	});
    };
    </script>
    
    <style lang="scss">
    @font-face {
    	font-family: 'iconfont';
    	src: url('//at.alicdn.com/iconfont.eot?t=1574391686418');
    	/* IE9 */
    	src: url('//at.alicdn.com/iconfont.eot?t=1574391686418#iefix') format('embedded-opentype'),
    		/* IE6-IE8 */
    			url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMkAAsAAAAAB2QAAALYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAqCYIJEATYCJAMICwYABCAFhG0HPRt3BhEVlCNkH4dxmzUXNsJHc1SNfR9KTkCtiXv/l+QDBQSFRBJdKoEsg60HUgCsOpWVnWxNx3BvVITqkj3fepbtzM/OfDo4D86iFEIiJAeX02+Bh/O84TLmsrEnYBxQoHtgm6xACoxTkN0zFsgEdQynCShpq7cwbsK0eTKROSkgbNu8cbUspRFrkoNMkC9ZGYWjcrJkX/IIR/zPhz/6hIxELmWmzdowfp1RvxdbYWm1VrUMCO54JvDrSNEbkTCv1DJDGvp6S5VUX9SRdSUHfi+u1cBZ7R+PQMgzEyugNcU5J67DO9VfJiCigD042iuNQqXSunGRfvrWV6/mvX49/+3bhW/eLHr4puOFtxMfvO5w9tX8yv7rIbf3Rrl84Mbe66XSzWet46nn/etMuALua5LqNZUqpKdfDKjsv2qef+yambJsTWM2zDtKIQ0pS7msvSTUpn1tNyts2xZmWUyw3LI4bPisSZNyOUc2y4/scfZs3QZ1UcgqUWtkVednsvnVs7NOHzmqglXIBnqU7+/M9Hp3y3L2RLWYA9uhlat61/LGGwVqt9Nvafv/8R2fmg/pu7LesH9ZOYL3/6e3P6Z2O0rbIztra+Dtc1u2RY1vapOocEtDiT0Kd1VUUkIN42joS19Fk1s1BVmKy0OioA2kMp1REdcbcsr6QV5mJJT0MnF9mbQRchZiET29CAT1fSBR1y1I1fdFRdwPcpr6Q179cIaSBaHRjmVdgxFjCSvGFuonmGYcpK1nESRfUC1dRUm+T3ggeeOEOIiywRwHpDHm+FUlzBIkjT1k5DzsuhEmGi02HGjmKQ1DWfaioBn7gzAWQRWGWqD2BIzGaCDRm4nc+y+QsuhUqKaqyviAiGcGB7FA1AKVS4ZWVddyibdSEoxJQCKjHsjIMNTpjMBUPsxCDRbQPTyTVGh1k20lwfyy/un2QYmpTII1I9Vo+1B4XQ2q0QvwvExGfTgA')
    			format('woff2'),
    		url('//at.alicdn.com/iconfont.woff?t=1574391686418') format('woff'), url('//at.alicdn.com/iconfont.ttf?t=1574391686418') format('truetype'),
    		/* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url('//at.alicdn.com/iconfont.svg?t=1574391686418#iconfont') format('svg');
    	/* iOS 4.1- */
    }
    
    @charset "UTF-8";
    
    .iconfont {
    	font-family: 'iconfont' !important;
    	font-size: 16px;
    	font-style: normal;
    	-webkit-font-smoothing: antialiased;
    	-moz-osx-font-smoothing: grayscale;
    }
    
    .icon-mn_shangchuantupian {
    	&:before {
    		content: 'e559';
    	}
    	font-size: 3em;
    }
    
    .sunui-uploader-img {
    	display: block;
    }
    
    .sunui-uploader-input {
    	position: absolute;
    	z-index: 1;
    	top: 0;
    	left: 0;
    	 100%;
    	height: 100%;
    	opacity: 0;
    }
    
    .sunui-uploader-inputbox {
    	position: relative;
    	margin-bottom: 16rpx;
    	box-sizing: border-box;
    	background-color: #ededed;
    	display: flex;
    	flex-wrap: wrap;
    	align-items: center;
    	justify-content: center;
    }
    
    .sunui-img-removeicon {
    	position: absolute;
    	color: #fff;
    	 40upx;
    	height: 40upx;
    	line-height: 40upx;
    	z-index: 2;
    	text-align: center;
    	background-color: #e54d42;
    
    	&.right {
    		top: 0;
    		right: 0;
    	}
    }
    
    .sunui-uploader-file {
    	position: relative;
    	margin-right: 16rpx;
    	margin-bottom: 16rpx;
    }
    
    .sunui-uploader-file-status:before {
    	content: ' ';
    	position: absolute;
    	top: 0;
    	right: 0;
    	bottom: 0;
    	left: 0;
    	background-color: rgba(0, 0, 0, 0.5);
    }
    
    .sunui-loader-filecontent {
    	position: absolute;
    	top: 50%;
    	left: 50%;
    	transform: translate(-50%, -50%);
    	color: #fff;
    	z-index: 9;
    }
    
    .sunui-uploader-bd {
    	padding: 26rpx;
    	margin: 0;
    }
    
    .sunui-uploader-files {
    	display: flex;
    	flex-wrap: wrap;
    }
    
    .sunui-uploader-file:nth-child(4n + 0) {
    	margin-right: 0;
    }
    
    .sunui-uploader-inputbox > view {
    	text-align: center;
    }
    
    .sunui-uploader-file-status:after {
    	content: ' ';
    	position: absolute;
    	top: 0;
    	right: 0;
    	bottom: 0;
    	left: 0;
    	background-color: rgba(0, 0, 0, 0.5);
    }
    
    .sunui-uploader-hover {
    	box-shadow: 0 0 0 #e5e5e5;
    	background: #e5e5e5;
    }
    </style>
    

      

  • 相关阅读:
    python之filter()函数
    figure margins too large错误解决
    “一个字等于多少个字节?”是一个不严谨的问法
    如何区分按字节编址与按字编址
    (stm32学习总结)—LCD—液晶显示
    (stm32学习总结)—GPIO位带操作
    (stm32学习总结)—SPI-FLASH 实验
    修改寄存器的位操作方法
    (stm32学习总结)—对寄存器的理解
    (stm32f103学习总结)—初识stm32
  • 原文地址:https://www.cnblogs.com/ltw222/p/14915460.html
Copyright © 2020-2023  润新知