zuy 2 роки тому
батько
коміт
722580b5e2

+ 1 - 0
package.json

@@ -12,6 +12,7 @@
     "@dcloudio/uni-components": "3.0.0-3090920231225001",
     "@dcloudio/uni-h5": "3.0.0-3090920231225001",
     "@dcloudio/uni-mp-weixin": "3.0.0-3090920231225001",
+    "@dcloudio/uni-ui": "^1.5.2",
     "vue": "^3.2.45",
     "vue-i18n": "^9.1.9"
   },

+ 4 - 1
src/App.vue

@@ -1,5 +1,8 @@
 <script>
 export default {
+  globalData: {
+    name: '快与慢'
+  },
   onLaunch: function () {
     console.log('App Launch')
   },
@@ -14,5 +17,5 @@ export default {
 
 <style lang="scss">
 /*每个页面公共css */
-@import "@/style/app.scss";
+@import "./style/app.scss";
 </style>

+ 0 - 272
src/components/uni-card/uni-card.vue

@@ -1,272 +0,0 @@
-<template>
-	<view class="uni-card" :class="{ 'uni-card--full': isFull, 'uni-card--shadow': isShadow,'uni-card--border':border}"
-		:style="{'margin':isFull?0:margin,'padding':spacing,'box-shadow':isShadow?shadow:''}">
-		<!-- 封面 -->
-		<slot name="cover">
-			<view v-if="cover" class="uni-card__cover">
-				<image class="uni-card__cover-image" mode="widthFix" @click="onClick('cover')" :src="cover"></image>
-			</view>
-		</slot>
-		<slot name="title">
-			<view v-if="title || extra" class="uni-card__header">
-				<!-- 卡片标题 -->
-				<view class="uni-card__header-box" @click="onClick('title')">
-					<view v-if="thumbnail" class="uni-card__header-avatar">
-						<image class="uni-card__header-avatar-image" :src="thumbnail" mode="aspectFit" />
-					</view>
-					<view class="uni-card__header-content">
-						<text class="uni-card__header-content-title uni-ellipsis">{{ title }}</text>
-						<text v-if="title&&subTitle"
-							class="uni-card__header-content-subtitle uni-ellipsis">{{ subTitle }}</text>
-					</view>
-				</view>
-				<view class="uni-card__header-extra" @click="onClick('extra')">
-					<slot name="extra">
-						<text class="uni-card__header-extra-text">{{ extra }}</text>
-					</slot>
-				</view>
-			</view>
-		</slot>
-		<!-- 卡片内容 -->
-		<view class="uni-card__content" :style="{padding:padding}" @click="onClick('content')">
-			<slot></slot>
-		</view>
-		<view class="uni-card__actions" @click="onClick('actions')">
-			<slot name="actions"></slot>
-		</view>
-	</view>
-</template>
-
-<script>
-	/**
-	 * Card 卡片
-	 * @description 卡片视图组件
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=22
-	 * @property {String} title 标题文字
-	 * @property {String} subTitle 副标题
-	 * @property {Number} padding 内容内边距
-	 * @property {Number} margin 卡片外边距
-	 * @property {Number} spacing 卡片内边距
-	 * @property {String} extra 标题额外信息
-	 * @property {String} cover 封面图(本地路径需要引入)
-	 * @property {String} thumbnail 标题左侧缩略图
-	 * @property {Boolean} is-full = [true | false] 卡片内容是否通栏,为 true 时将去除padding值
-	 * @property {Boolean} is-shadow = [true | false] 卡片内容是否开启阴影
-	 * @property {String} shadow 卡片阴影
-	 * @property {Boolean} border 卡片边框
-	 * @event {Function} click 点击 Card 触发事件
-	 */
-	export default {
-		name: 'UniCard',
-		emits: ['click'],
-		props: {
-			title: {
-				type: String,
-				default: ''
-			},
-			subTitle: {
-				type: String,
-				default: ''
-			},
-			padding: {
-				type: String,
-				default: '10px'
-			},
-			margin: {
-				type: String,
-				default: '15px'
-			},
-			spacing: {
-				type: String,
-				default: '0 10px'
-			},
-			extra: {
-				type: String,
-				default: ''
-			},
-			cover: {
-				type: String,
-				default: ''
-			},
-			thumbnail: {
-				type: String,
-				default: ''
-			},
-			isFull: {
-				// 内容区域是否通栏
-				type: Boolean,
-				default: false
-			},
-			isShadow: {
-				// 是否开启阴影
-				type: Boolean,
-				default: true
-			},
-			shadow: {
-				type: String,
-				default: '0px 0px 3px 1px rgba(0, 0, 0, 0.08)'
-			},
-			border: {
-				type: Boolean,
-				default: true
-			}
-		},
-		methods: {
-			onClick(type) {
-				this.$emit('click', type)
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	$uni-border-3: #EBEEF5 !default;
-	$uni-shadow-base:0 0px 6px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
-	$uni-main-color: #3a3a3a !default;
-	$uni-base-color: #6a6a6a !default;
-	$uni-secondary-color: #909399 !default;
-	$uni-spacing-sm: 8px !default;
-	$uni-border-color:$uni-border-3;
-	$uni-shadow: $uni-shadow-base;
-	$uni-card-title: 15px;
-	$uni-cart-title-color:$uni-main-color;
-	$uni-card-subtitle: 12px;
-	$uni-cart-subtitle-color:$uni-secondary-color;
-	$uni-card-spacing: 10px;
-	$uni-card-content-color: $uni-base-color;
-
-	.uni-card {
-		margin: $uni-card-spacing;
-		padding: 0 $uni-spacing-sm;
-		border-radius: 4px;
-		overflow: hidden;
-		font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif;
-		background-color: #fff;
-		flex: 1;
-
-		.uni-card__cover {
-			position: relative;
-			margin-top: $uni-card-spacing;
-			flex-direction: row;
-			overflow: hidden;
-			border-radius: 4px;
-			.uni-card__cover-image {
-				flex: 1;
-				// width: 100%;
-				/* #ifndef APP-PLUS */
-				vertical-align: middle;
-				/* #endif */
-			}
-		}
-
-		.uni-card__header {
-			display: flex;
-			border-bottom: 1px $uni-border-color solid;
-			flex-direction: row;
-			align-items: center;
-			padding: $uni-card-spacing;
-			overflow: hidden;
-
-			.uni-card__header-box {
-				/* #ifndef APP-NVUE */
-				display: flex;
-				/* #endif */
-				flex: 1;
-				flex-direction: row;
-				align-items: center;
-				overflow: hidden;
-			}
-
-			.uni-card__header-avatar {
-				width: 40px;
-				height: 40px;
-				overflow: hidden;
-				border-radius: 5px;
-				margin-right: $uni-card-spacing;
-				.uni-card__header-avatar-image {
-					flex: 1;
-					width: 40px;
-					height: 40px;
-				}
-			}
-
-			.uni-card__header-content {
-				/* #ifndef APP-NVUE */
-				display: flex;
-				/* #endif */
-				flex-direction: column;
-				justify-content: center;
-				flex: 1;
-				// height: 40px;
-				overflow: hidden;
-
-				.uni-card__header-content-title {
-					font-size: $uni-card-title;
-					color: $uni-cart-title-color;
-					// line-height: 22px;
-				}
-
-				.uni-card__header-content-subtitle {
-					font-size: $uni-card-subtitle;
-					margin-top: 5px;
-					color: $uni-cart-subtitle-color;
-				}
-			}
-
-			.uni-card__header-extra {
-				line-height: 12px;
-
-				.uni-card__header-extra-text {
-					font-size: 12px;
-					color: $uni-cart-subtitle-color;
-				}
-			}
-		}
-
-		.uni-card__content {
-			padding: $uni-card-spacing;
-			font-size: 14px;
-			color: $uni-card-content-color;
-			line-height: 22px;
-		}
-
-		.uni-card__actions {
-			font-size: 12px;
-		}
-	}
-
-	.uni-card--border {
-		border: 1px solid $uni-border-color;
-	}
-
-	.uni-card--shadow {
-		position: relative;
-		/* #ifndef APP-NVUE */
-		box-shadow: $uni-shadow;
-		/* #endif */
-	}
-
-	.uni-card--full {
-		margin: 0;
-		border-left-width: 0;
-		border-left-width: 0;
-		border-radius: 0;
-	}
-
-	/* #ifndef APP-NVUE */
-	.uni-card--full:after {
-		border-radius: 0;
-	}
-
-	/* #endif */
-	.uni-ellipsis {
-		/* #ifndef APP-NVUE */
-		overflow: hidden;
-		white-space: nowrap;
-		text-overflow: ellipsis;
-		/* #endif */
-		/* #ifdef APP-NVUE */
-		lines: 1;
-		/* #endif */
-	}
-</style>

+ 0 - 317
src/components/uni-col/uni-col.vue

@@ -1,317 +0,0 @@
-<template>
-	<!-- #ifndef APP-NVUE -->
-	<view :class="['uni-col', sizeClass, pointClassList]" :style="{
-		paddingLeft:`${Number(gutter)}rpx`,
-		paddingRight:`${Number(gutter)}rpx`,
-	}">
-		<slot></slot>
-	</view>
-	<!-- #endif -->
-	<!-- #ifdef APP-NVUE -->
-	<!-- 在nvue上,类名样式不生效,换为style -->
-	<!-- 设置right正值失效,设置 left 负值 -->
-	<view :class="['uni-col']" :style="{
-		paddingLeft:`${Number(gutter)}rpx`,
-		paddingRight:`${Number(gutter)}rpx`,
-		width:`${nvueWidth}rpx`,
-		position:'relative',
-		marginLeft:`${marginLeft}rpx`,
-		left:`${right === 0 ? left : -right}rpx`
-	}">
-		<slot></slot>
-	</view>
-	<!-- #endif -->
-</template>
-
-<script>
-	/**
-	 * Col	布局-列
-	 * @description	搭配uni-row使用,构建布局。
-	 * @tutorial	https://ext.dcloud.net.cn/plugin?id=3958
-	 *
-	 * @property	{span} type = Number 栅格占据的列数
-	 * 						默认 24
-	 * @property	{offset} type = Number 栅格左侧的间隔格数
-	 * @property	{push} type = Number 栅格向右移动格数
-	 * @property	{pull} type = Number 栅格向左移动格数
-	 * @property	{xs} type = [Number, Object] <768px 响应式栅格数或者栅格属性对象
-	 * 						@description	Number时表示在此屏幕宽度下,栅格占据的列数。Object时可配置多个描述{span: 4, offset: 4}
-	 * @property	{sm} type = [Number, Object] ≥768px 响应式栅格数或者栅格属性对象
-	 * 						@description	Number时表示在此屏幕宽度下,栅格占据的列数。Object时可配置多个描述{span: 4, offset: 4}
-	 * @property	{md} type = [Number, Object] ≥992px 响应式栅格数或者栅格属性对象
-	 * 						@description	Number时表示在此屏幕宽度下,栅格占据的列数。Object时可配置多个描述{span: 4, offset: 4}
-	 * @property	{lg} type = [Number, Object] ≥1200px 响应式栅格数或者栅格属性对象
-	 * 						@description	Number时表示在此屏幕宽度下,栅格占据的列数。Object时可配置多个描述{span: 4, offset: 4}
-	 * @property	{xl} type = [Number, Object] ≥1920px 响应式栅格数或者栅格属性对象
-	 * 						@description	Number时表示在此屏幕宽度下,栅格占据的列数。Object时可配置多个描述{span: 4, offset: 4}
-	 */
-	const ComponentClass = 'uni-col';
-
-	// -1 默认值,因为在微信小程序端只给Number会有默认值0
-	export default {
-		name: 'uniCol',
-		// #ifdef MP-WEIXIN
-		options: {
-			virtualHost: true // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现
-		},
-		// #endif
-		props: {
-			span: {
-				type: Number,
-				default: 24
-			},
-			offset: {
-				type: Number,
-				default: -1
-			},
-			pull: {
-				type: Number,
-				default: -1
-			},
-			push: {
-				type: Number,
-				default: -1
-			},
-			xs: [Number, Object],
-			sm: [Number, Object],
-			md: [Number, Object],
-			lg: [Number, Object],
-			xl: [Number, Object]
-		},
-		data() {
-			return {
-				gutter: 0,
-				sizeClass: '',
-				parentWidth: 0,
-				nvueWidth: 0,
-				marginLeft: 0,
-				right: 0,
-				left: 0
-			}
-		},
-		created() {
-			// 字节小程序中,在computed中读取$parent为undefined
-			let parent = this.$parent;
-
-			while (parent && parent.$options.componentName !== 'uniRow') {
-				parent = parent.$parent;
-			}
-
-			this.updateGutter(parent.gutter)
-			parent.$watch('gutter', (gutter) => {
-				this.updateGutter(gutter)
-			})
-
-			// #ifdef APP-NVUE
-			this.updateNvueWidth(parent.width)
-			parent.$watch('width', (width) => {
-				this.updateNvueWidth(width)
-			})
-			// #endif
-		},
-		computed: {
-			sizeList() {
-				let {
-					span,
-					offset,
-					pull,
-					push
-				} = this;
-
-				return {
-					span,
-					offset,
-					pull,
-					push
-				}
-			},
-			// #ifndef APP-NVUE
-			pointClassList() {
-				let classList = [];
-
-				['xs', 'sm', 'md', 'lg', 'xl'].forEach(point => {
-					const props = this[point];
-					if (typeof props === 'number') {
-						classList.push(`${ComponentClass}-${point}-${props}`)
-					} else if (typeof props === 'object' && props) {
-						Object.keys(props).forEach(pointProp => {
-							classList.push(
-								pointProp === 'span' ?
-								`${ComponentClass}-${point}-${props[pointProp]}` :
-								`${ComponentClass}-${point}-${pointProp}-${props[pointProp]}`
-							)
-						})
-					}
-				});
-
-				// 支付宝小程序使用 :class=[ ['a','b'] ],渲染错误
-				return classList.join(' ');
-			}
-			// #endif
-		},
-		methods: {
-			updateGutter(parentGutter) {
-				parentGutter = Number(parentGutter);
-				if (!isNaN(parentGutter)) {
-					this.gutter = parentGutter / 2
-				}
-			},
-			// #ifdef APP-NVUE
-			updateNvueWidth(width) {
-				// 用于在nvue端,span,offset,pull,push的计算
-				this.parentWidth = width;
-				['span', 'offset', 'pull', 'push'].forEach(size => {
-					const curSize = this[size];
-					if ((curSize || curSize === 0) && curSize !== -1) {
-						let RPX = 1 / 24 * curSize * width
-						RPX = Number(RPX);
-						switch (size) {
-							case 'span':
-								this.nvueWidth = RPX
-								break;
-							case 'offset':
-								this.marginLeft = RPX
-								break;
-							case 'pull':
-								this.right = RPX
-								break;
-							case 'push':
-								this.left = RPX
-								break;
-						}
-					}
-				});
-			}
-			// #endif
-		},
-		watch: {
-			sizeList: {
-				immediate: true,
-				handler(newVal) {
-					// #ifndef APP-NVUE
-					let classList = [];
-					for (let size in newVal) {
-						const curSize = newVal[size];
-						if ((curSize || curSize === 0) && curSize !== -1) {
-							classList.push(
-								size === 'span' ?
-								`${ComponentClass}-${curSize}` :
-								`${ComponentClass}-${size}-${curSize}`
-							)
-						}
-					}
-					// 支付宝小程序使用 :class=[ ['a','b'] ],渲染错误
-					this.sizeClass = classList.join(' ');
-					// #endif
-					// #ifdef APP-NVUE
-					this.updateNvueWidth(this.parentWidth);
-					// #endif
-				}
-			}
-		}
-	}
-</script>
-
-<style lang='scss' >
-	/* breakpoints */
-	$--sm: 768px !default;
-	$--md: 992px !default;
-	$--lg: 1200px !default;
-	$--xl: 1920px !default;
-
-	$breakpoints: ('xs' : (max-width: $--sm - 1),
-	'sm' : (min-width: $--sm),
-	'md' : (min-width: $--md),
-	'lg' : (min-width: $--lg),
-	'xl' : (min-width: $--xl));
-
-	$layout-namespace: ".uni-";
-	$col: $layout-namespace+"col";
-
-	@function getSize($size) {
-		/* TODO 1/24 * $size * 100 * 1%; 使用计算后的值,为了解决 vue3 控制台报错 */
-		@return 0.04166666666 * $size * 100 * 1%;
-	}
-
-	@mixin res($key, $map:$breakpoints) {
-		@if map-has-key($map, $key) {
-			@media screen and #{inspect(map-get($map,$key))} {
-				@content;
-			}
-		}
-
-		@else {
-			@warn "Undeinfed point: `#{$key}`";
-		}
-	}
-
-	/* #ifndef APP-NVUE */
-	#{$col} {
-		float: left;
-		box-sizing: border-box;
-	}
-
-	#{$col}-0 {
-		/* #ifdef APP-NVUE */
-		width: 0;
-		height: 0;
-		margin-top: 0;
-		margin-right: 0;
-		margin-bottom: 0;
-		margin-left: 0;
-		/* #endif */
-		/* #ifndef APP-NVUE */
-		display: none;
-		/* #endif */
-	}
-
-	@for $i from 0 through 24 {
-		#{$col}-#{$i} {
-			width: getSize($i);
-		}
-
-		#{$col}-offset-#{$i} {
-			margin-left: getSize($i);
-		}
-
-		#{$col}-pull-#{$i} {
-			position: relative;
-			right: getSize($i);
-		}
-
-		#{$col}-push-#{$i} {
-			position: relative;
-			left: getSize($i);
-		}
-	}
-
-	@each $point in map-keys($breakpoints) {
-		@include res($point) {
-			#{$col}-#{$point}-0 {
-				display: none;
-			}
-
-			@for $i from 0 through 24 {
-				#{$col}-#{$point}-#{$i} {
-					width: getSize($i);
-				}
-
-				#{$col}-#{$point}-offset-#{$i} {
-					margin-left: getSize($i);
-				}
-
-				#{$col}-#{$point}-pull-#{$i} {
-					position: relative;
-					right: getSize($i);
-				}
-
-				#{$col}-#{$point}-push-#{$i} {
-					position: relative;
-					left: getSize($i);
-				}
-			}
-		}
-	}
-
-	/* #endif */
-</style>

+ 0 - 224
src/components/uni-file-picker/choose-and-upload-file.js

@@ -1,224 +0,0 @@
-'use strict';
-
-const ERR_MSG_OK = 'chooseAndUploadFile:ok';
-const ERR_MSG_FAIL = 'chooseAndUploadFile:fail';
-
-function chooseImage(opts) {
-	const {
-		count,
-		sizeType = ['original', 'compressed'],
-		sourceType,
-		extension
-	} = opts
-	return new Promise((resolve, reject) => {
-		uni.chooseImage({
-			count,
-			sizeType,
-			sourceType,
-			extension,
-			success(res) {
-				resolve(normalizeChooseAndUploadFileRes(res, 'image'));
-			},
-			fail(res) {
-				reject({
-					errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
-				});
-			},
-		});
-	});
-}
-
-function chooseVideo(opts) {
-	const {
-		camera,
-		compressed,
-		maxDuration,
-		sourceType,
-		extension
-	} = opts;
-	return new Promise((resolve, reject) => {
-		uni.chooseVideo({
-			camera,
-			compressed,
-			maxDuration,
-			sourceType,
-			extension,
-			success(res) {
-				const {
-					tempFilePath,
-					duration,
-					size,
-					height,
-					width
-				} = res;
-				resolve(normalizeChooseAndUploadFileRes({
-					errMsg: 'chooseVideo:ok',
-					tempFilePaths: [tempFilePath],
-					tempFiles: [
-					{
-						name: (res.tempFile && res.tempFile.name) || '',
-						path: tempFilePath,
-						size,
-						type: (res.tempFile && res.tempFile.type) || '',
-						width,
-						height,
-						duration,
-						fileType: 'video',
-						cloudPath: '',
-					}, ],
-				}, 'video'));
-			},
-			fail(res) {
-				reject({
-					errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL),
-				});
-			},
-		});
-	});
-}
-
-function chooseAll(opts) {
-	const {
-		count,
-		extension
-	} = opts;
-	return new Promise((resolve, reject) => {
-		let chooseFile = uni.chooseFile;
-		if (typeof wx !== 'undefined' &&
-			typeof wx.chooseMessageFile === 'function') {
-			chooseFile = wx.chooseMessageFile;
-		}
-		if (typeof chooseFile !== 'function') {
-			return reject({
-				errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。',
-			});
-		}
-		chooseFile({
-			type: 'all',
-			count,
-			extension,
-			success(res) {
-				resolve(normalizeChooseAndUploadFileRes(res));
-			},
-			fail(res) {
-				reject({
-					errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL),
-				});
-			},
-		});
-	});
-}
-
-function normalizeChooseAndUploadFileRes(res, fileType) {
-	res.tempFiles.forEach((item, index) => {
-		if (!item.name) {
-			item.name = item.path.substring(item.path.lastIndexOf('/') + 1);
-		}
-		if (fileType) {
-			item.fileType = fileType;
-		}
-		item.cloudPath =
-			Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.'));
-	});
-	if (!res.tempFilePaths) {
-		res.tempFilePaths = res.tempFiles.map((file) => file.path);
-	}
-	return res;
-}
-
-function uploadCloudFiles(files, max = 5, onUploadProgress) {
-	files = JSON.parse(JSON.stringify(files))
-	const len = files.length
-	let count = 0
-	let self = this
-	return new Promise(resolve => {
-		while (count < max) {
-			next()
-		}
-
-		function next() {
-			let cur = count++
-			if (cur >= len) {
-				!files.find(item => !item.url && !item.errMsg) && resolve(files)
-				return
-			}
-			const fileItem = files[cur]
-			const index = self.files.findIndex(v => v.uuid === fileItem.uuid)
-			fileItem.url = ''
-			delete fileItem.errMsg
-
-			uniCloud
-				.uploadFile({
-					filePath: fileItem.path,
-					cloudPath: fileItem.cloudPath,
-					fileType: fileItem.fileType,
-					onUploadProgress: res => {
-						res.index = index
-						onUploadProgress && onUploadProgress(res)
-					}
-				})
-				.then(res => {
-					fileItem.url = res.fileID
-					fileItem.index = index
-					if (cur < len) {
-						next()
-					}
-				})
-				.catch(res => {
-					fileItem.errMsg = res.errMsg || res.message
-					fileItem.index = index
-					if (cur < len) {
-						next()
-					}
-				})
-		}
-	})
-}
-
-
-
-
-
-function uploadFiles(choosePromise, {
-	onChooseFile,
-	onUploadProgress
-}) {
-	return choosePromise
-		.then((res) => {
-			if (onChooseFile) {
-				const customChooseRes = onChooseFile(res);
-				if (typeof customChooseRes !== 'undefined') {
-					return Promise.resolve(customChooseRes).then((chooseRes) => typeof chooseRes === 'undefined' ?
-						res : chooseRes);
-				}
-			}
-			return res;
-		})
-		.then((res) => {
-			if (res === false) {
-				return {
-					errMsg: ERR_MSG_OK,
-					tempFilePaths: [],
-					tempFiles: [],
-				};
-			}
-			return res
-		})
-}
-
-function chooseAndUploadFile(opts = {
-	type: 'all'
-}) {
-	if (opts.type === 'image') {
-		return uploadFiles(chooseImage(opts), opts);
-	}
-	else if (opts.type === 'video') {
-		return uploadFiles(chooseVideo(opts), opts);
-	}
-	return uploadFiles(chooseAll(opts), opts);
-}
-
-export {
-	chooseAndUploadFile,
-	uploadCloudFiles
-};

+ 0 - 667
src/components/uni-file-picker/uni-file-picker.vue

@@ -1,667 +0,0 @@
-<template>
-	<view class="uni-file-picker">
-		<view v-if="title" class="uni-file-picker__header">
-			<text class="file-title">{{ title }}</text>
-			<text class="file-count">{{ filesList.length }}/{{ limitLength }}</text>
-		</view>
-		<upload-image v-if="fileMediatype === 'image' && showType === 'grid'" :readonly="readonly"
-			:image-styles="imageStyles" :files-list="filesList" :limit="limitLength" :disablePreview="disablePreview"
-			:delIcon="delIcon" @uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
-			<slot>
-				<view class="is-add">
-					<view class="icon-add"></view>
-					<view class="icon-add rotate"></view>
-				</view>
-			</slot>
-		</upload-image>
-		<upload-file v-if="fileMediatype !== 'image' || showType !== 'grid'" :readonly="readonly"
-			:list-styles="listStyles" :files-list="filesList" :showType="showType" :delIcon="delIcon"
-			@uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
-			<slot><button type="primary" size="mini">选择文件</button></slot>
-		</upload-file>
-	</view>
-</template>
-
-<script>
-	import {
-		chooseAndUploadFile,
-		uploadCloudFiles
-	} from './choose-and-upload-file.js'
-	import {
-		get_file_ext,
-		get_extname,
-		get_files_and_is_max,
-		get_file_info,
-		get_file_data
-	} from './utils.js'
-	import uploadImage from './upload-image.vue'
-	import uploadFile from './upload-file.vue'
-	let fileInput = null
-	/**
-	 * FilePicker 文件选择上传
-	 * @description 文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=4079
-	 * @property {Object|Array}	value	组件数据,通常用来回显 ,类型由return-type属性决定
-	 * @property {Boolean}	disabled = [true|false]	组件禁用
-	 * 	@value true 	禁用
-	 * 	@value false 	取消禁用
-	 * @property {Boolean}	readonly = [true|false]	组件只读,不可选择,不显示进度,不显示删除按钮
-	 * 	@value true 	只读
-	 * 	@value false 	取消只读
-	 * @property {String}	return-type = [array|object]	限制 value 格式,当为 object 时 ,组件只能单选,且会覆盖
-	 * 	@value array	规定 value 属性的类型为数组
-	 * 	@value object	规定 value 属性的类型为对象
-	 * @property {Boolean}	disable-preview = [true|false]	禁用图片预览,仅 mode:grid 时生效
-	 * 	@value true 	禁用图片预览
-	 * 	@value false 	取消禁用图片预览
-	 * @property {Boolean}	del-icon = [true|false]	是否显示删除按钮
-	 * 	@value true 	显示删除按钮
-	 * 	@value false 	不显示删除按钮
-	 * @property {Boolean}	auto-upload = [true|false]	是否自动上传,值为true则只触发@select,可自行上传
-	 * 	@value true 	自动上传
-	 * 	@value false 	取消自动上传
-	 * @property {Number|String}	limit	最大选择个数 ,h5 会自动忽略多选的部分
-	 * @property {String}	title	组件标题,右侧显示上传计数
-	 * @property {String}	mode = [list|grid]	选择文件后的文件列表样式
-	 * 	@value list 	列表显示
-	 * 	@value grid 	宫格显示
-	 * @property {String}	file-mediatype = [image|video|all]	选择文件类型
-	 * 	@value image	只选择图片
-	 * 	@value video	只选择视频
-	 * 	@value all		选择所有文件
-	 * @property {Array}	file-extname	选择文件后缀,根据 file-mediatype 属性而不同
-	 * @property {Object}	list-style	mode:list 时的样式
-	 * @property {Object}	image-styles	选择文件后缀,根据 file-mediatype 属性而不同
-	 * @event {Function} select 	选择文件后触发
-	 * @event {Function} progress 文件上传时触发
-	 * @event {Function} success 	上传成功触发
-	 * @event {Function} fail 		上传失败触发
-	 * @event {Function} delete 	文件从列表移除时触发
-	 */
-	export default {
-		name: 'uniFilePicker',
-		components: {
-			uploadImage,
-			uploadFile
-		},
-		options: {
-			virtualHost: true
-		},
-		emits: ['select', 'success', 'fail', 'progress', 'delete', 'update:modelValue', 'input'],
-		props: {
-			// #ifdef VUE3
-			modelValue: {
-				type: [Array, Object],
-				default () {
-					return []
-				}
-			},
-			// #endif
-
-			// #ifndef VUE3
-			value: {
-				type: [Array, Object],
-				default () {
-					return []
-				}
-			},
-			// #endif
-
-			disabled: {
-				type: Boolean,
-				default: false
-			},
-			disablePreview: {
-				type: Boolean,
-				default: false
-			},
-			delIcon: {
-				type: Boolean,
-				default: true
-			},
-			// 自动上传
-			autoUpload: {
-				type: Boolean,
-				default: true
-			},
-			// 最大选择个数 ,h5只能限制单选或是多选
-			limit: {
-				type: [Number, String],
-				default: 9
-			},
-			// 列表样式 grid | list | list-card
-			mode: {
-				type: String,
-				default: 'grid'
-			},
-			// 选择文件类型  image/video/all
-			fileMediatype: {
-				type: String,
-				default: 'image'
-			},
-			// 文件类型筛选
-			fileExtname: {
-				type: [Array, String],
-				default () {
-					return []
-				}
-			},
-			title: {
-				type: String,
-				default: ''
-			},
-			listStyles: {
-				type: Object,
-				default () {
-					return {
-						// 是否显示边框
-						border: true,
-						// 是否显示分隔线
-						dividline: true,
-						// 线条样式
-						borderStyle: {}
-					}
-				}
-			},
-			imageStyles: {
-				type: Object,
-				default () {
-					return {
-						width: 'auto',
-						height: 'auto'
-					}
-				}
-			},
-			readonly: {
-				type: Boolean,
-				default: false
-			},
-			returnType: {
-				type: String,
-				default: 'array'
-			},
-			sizeType: {
-				type: Array,
-				default () {
-					return ['original', 'compressed']
-				}
-			},
-			sourceType: {
-				type: Array,
-				default () {
-					return  ['album', 'camera']
-				}
-			}
-		},
-		data() {
-			return {
-				files: [],
-				localValue: []
-			}
-		},
-		watch: {
-			// #ifndef VUE3
-			value: {
-				handler(newVal, oldVal) {
-					this.setValue(newVal, oldVal)
-				},
-				immediate: true
-			},
-			// #endif
-			// #ifdef VUE3
-			modelValue: {
-				handler(newVal, oldVal) {
-					this.setValue(newVal, oldVal)
-				},
-				immediate: true
-			},
-			// #endif
-		},
-		computed: {
-			filesList() {
-				let files = []
-				this.files.forEach(v => {
-					files.push(v)
-				})
-				return files
-			},
-			showType() {
-				if (this.fileMediatype === 'image') {
-					return this.mode
-				}
-				return 'list'
-			},
-			limitLength() {
-				if (this.returnType === 'object') {
-					return 1
-				}
-				if (!this.limit) {
-					return 1
-				}
-				if (this.limit >= 9) {
-					return 9
-				}
-				return this.limit
-			}
-		},
-		created() {
-			// TODO 兼容不开通服务空间的情况
-			if (!(uniCloud.config && uniCloud.config.provider)) {
-				this.noSpace = true
-				uniCloud.chooseAndUploadFile = chooseAndUploadFile
-			}
-			this.form = this.getForm('uniForms')
-			this.formItem = this.getForm('uniFormsItem')
-			if (this.form && this.formItem) {
-				if (this.formItem.name) {
-					this.rename = this.formItem.name
-					this.form.inputChildrens.push(this)
-				}
-			}
-		},
-		methods: {
-			/**
-			 * 公开用户使用,清空文件
-			 * @param {Object} index
-			 */
-			clearFiles(index) {
-				if (index !== 0 && !index) {
-					this.files = []
-					this.$nextTick(() => {
-						this.setEmit()
-					})
-				} else {
-					this.files.splice(index, 1)
-				}
-				this.$nextTick(() => {
-					this.setEmit()
-				})
-			},
-			/**
-			 * 公开用户使用,继续上传
-			 */
-			upload() {
-				let files = []
-				this.files.forEach((v, index) => {
-					if (v.status === 'ready' || v.status === 'error') {
-						files.push(Object.assign({}, v))
-					}
-				})
-				return this.uploadFiles(files)
-			},
-			async setValue(newVal, oldVal) {
-				const newData =  async (v) => {
-					const reg = /cloud:\/\/([\w.]+\/?)\S*/
-					let url = ''
-					if(v.fileID){
-						url = v.fileID
-					}else{
-						url = v.url
-					}
-					if (reg.test(url)) {
-						v.fileID = url
-						v.url = await this.getTempFileURL(url)
-					}
-					if(v.url) v.path = v.url
-					return v
-				}
-				if (this.returnType === 'object') {
-					if (newVal) {
-						await newData(newVal)
-					} else {
-						newVal = {}
-					}
-				} else {
-					if (!newVal) newVal = []
-					for(let i =0 ;i < newVal.length ;i++){
-						let v = newVal[i]
-						await newData(v)
-					}
-				}
-				this.localValue = newVal
-				if (this.form && this.formItem &&!this.is_reset) {
-					this.is_reset = false
-					this.formItem.setValue(this.localValue)
-				}
-				let filesData = Object.keys(newVal).length > 0 ? newVal : [];
-				this.files = [].concat(filesData)
-			},
-
-			/**
-			 * 选择文件
-			 */
-			choose() {
-
-				if (this.disabled) return
-				if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
-					'array') {
-					uni.showToast({
-						title: `您最多选择 ${this.limitLength} 个文件`,
-						icon: 'none'
-					})
-					return
-				}
-				this.chooseFiles()
-			},
-
-			/**
-			 * 选择文件并上传
-			 */
-			chooseFiles() {
-				const _extname = get_extname(this.fileExtname)
-				// 获取后缀
-				uniCloud
-					.chooseAndUploadFile({
-						type: this.fileMediatype,
-						compressed: false,
-						sizeType: this.sizeType,
-						sourceType: this.sourceType,
-						// TODO 如果为空,video 有问题
-						extension: _extname.length > 0 ? _extname : undefined,
-						count: this.limitLength - this.files.length, //默认9
-						onChooseFile: this.chooseFileCallback,
-						onUploadProgress: progressEvent => {
-							this.setProgress(progressEvent, progressEvent.index)
-						}
-					})
-					.then(result => {
-						this.setSuccessAndError(result.tempFiles)
-					})
-					.catch(err => {
-						console.log('选择失败', err)
-					})
-			},
-
-			/**
-			 * 选择文件回调
-			 * @param {Object} res
-			 */
-			async chooseFileCallback(res) {
-				const _extname = get_extname(this.fileExtname)
-				const is_one = (Number(this.limitLength) === 1 &&
-						this.disablePreview &&
-						!this.disabled) ||
-					this.returnType === 'object'
-				// 如果这有一个文件 ,需要清空本地缓存数据
-				if (is_one) {
-					this.files = []
-				}
-
-				let {
-					filePaths,
-					files
-				} = get_files_and_is_max(res, _extname)
-				if (!(_extname && _extname.length > 0)) {
-					filePaths = res.tempFilePaths
-					files = res.tempFiles
-				}
-
-				let currentData = []
-				for (let i = 0; i < files.length; i++) {
-					if (this.limitLength - this.files.length <= 0) break
-					files[i].uuid = Date.now()
-					let filedata = await get_file_data(files[i], this.fileMediatype)
-					filedata.progress = 0
-					filedata.status = 'ready'
-					this.files.push(filedata)
-					currentData.push({
-						...filedata,
-						file: files[i]
-					})
-				}
-				this.$emit('select', {
-					tempFiles: currentData,
-					tempFilePaths: filePaths
-				})
-				res.tempFiles = files
-				// 停止自动上传
-				if (!this.autoUpload || this.noSpace) {
-					res.tempFiles = []
-				}
-			},
-
-			/**
-			 * 批传
-			 * @param {Object} e
-			 */
-			uploadFiles(files) {
-				files = [].concat(files)
-				return uploadCloudFiles.call(this, files, 5, res => {
-						this.setProgress(res, res.index, true)
-					})
-					.then(result => {
-						this.setSuccessAndError(result)
-						return result;
-					})
-					.catch(err => {
-						console.log(err)
-					})
-			},
-
-			/**
-			 * 成功或失败
-			 */
-			async setSuccessAndError(res, fn) {
-				let successData = []
-				let errorData = []
-				let tempFilePath = []
-				let errorTempFilePath = []
-				for (let i = 0; i < res.length; i++) {
-					const item = res[i]
-					const index = item.uuid ? this.files.findIndex(p => p.uuid === item.uuid) : item.index
-
-					if (index === -1 || !this.files) break
-					if (item.errMsg === 'request:fail') {
-						this.files[index].url = item.path
-						this.files[index].status = 'error'
-						this.files[index].errMsg = item.errMsg
-						// this.files[index].progress = -1
-						errorData.push(this.files[index])
-						errorTempFilePath.push(this.files[index].url)
-					} else {
-						this.files[index].errMsg = ''
-						this.files[index].fileID = item.url
-						const reg = /cloud:\/\/([\w.]+\/?)\S*/
-						if (reg.test(item.url)) {
-							this.files[index].url = await this.getTempFileURL(item.url)
-						}else{
-							this.files[index].url = item.url
-						}
-
-						this.files[index].status = 'success'
-						this.files[index].progress += 1
-						successData.push(this.files[index])
-						tempFilePath.push(this.files[index].fileID)
-					}
-				}
-
-				if (successData.length > 0) {
-					this.setEmit()
-					// 状态改变返回
-					this.$emit('success', {
-						tempFiles: this.backObject(successData),
-						tempFilePaths: tempFilePath
-					})
-				}
-
-				if (errorData.length > 0) {
-					this.$emit('fail', {
-						tempFiles: this.backObject(errorData),
-						tempFilePaths: errorTempFilePath
-					})
-				}
-			},
-
-			/**
-			 * 获取进度
-			 * @param {Object} progressEvent
-			 * @param {Object} index
-			 * @param {Object} type
-			 */
-			setProgress(progressEvent, index, type) {
-				const fileLenth = this.files.length
-				const percentNum = (index / fileLenth) * 100
-				const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
-				let idx = index
-				if (!type) {
-					idx = this.files.findIndex(p => p.uuid === progressEvent.tempFile.uuid)
-				}
-				if (idx === -1 || !this.files[idx]) return
-				// fix by mehaotian 100 就会消失,-1 是为了让进度条消失
-				this.files[idx].progress = percentCompleted - 1
-				// 上传中
-				this.$emit('progress', {
-					index: idx,
-					progress: parseInt(percentCompleted),
-					tempFile: this.files[idx]
-				})
-			},
-
-			/**
-			 * 删除文件
-			 * @param {Object} index
-			 */
-			delFile(index) {
-				this.$emit('delete', {
-					tempFile: this.files[index],
-					tempFilePath: this.files[index].url
-				})
-				this.files.splice(index, 1)
-				this.$nextTick(() => {
-					this.setEmit()
-				})
-			},
-
-			/**
-			 * 获取文件名和后缀
-			 * @param {Object} name
-			 */
-			getFileExt(name) {
-				const last_len = name.lastIndexOf('.')
-				const len = name.length
-				return {
-					name: name.substring(0, last_len),
-					ext: name.substring(last_len + 1, len)
-				}
-			},
-
-			/**
-			 * 处理返回事件
-			 */
-			setEmit() {
-				let data = []
-				if (this.returnType === 'object') {
-					data = this.backObject(this.files)[0]
-					this.localValue = data?data:null
-				} else {
-					data = this.backObject(this.files)
-					if (!this.localValue) {
-						this.localValue = []
-					}
-					this.localValue = [...data]
-				}
-				// #ifdef VUE3
-				this.$emit('update:modelValue', this.localValue)
-				// #endif
-				// #ifndef VUE3
-				this.$emit('input', this.localValue)
-				// #endif
-			},
-
-			/**
-			 * 处理返回参数
-			 * @param {Object} files
-			 */
-			backObject(files) {
-				let newFilesData = []
-				files.forEach(v => {
-					newFilesData.push({
-						extname: v.extname,
-						fileType: v.fileType,
-						image: v.image,
-						name: v.name,
-						path: v.path,
-						size: v.size,
-						fileID:v.fileID,
-						url: v.url,
-						// 修改删除一个文件后不能再上传的bug, #694
-            uuid: v.uuid,
-            status: v.status,
-            cloudPath: v.cloudPath
-					})
-				})
-				return newFilesData
-			},
-			async getTempFileURL(fileList) {
-				fileList = {
-					fileList: [].concat(fileList)
-				}
-				const urls = await uniCloud.getTempFileURL(fileList)
-				return urls.fileList[0].tempFileURL || ''
-			},
-			/**
-			 * 获取父元素实例
-			 */
-			getForm(name = 'uniForms') {
-				let parent = this.$parent;
-				let parentName = parent.$options.name;
-				while (parentName !== name) {
-					parent = parent.$parent;
-					if (!parent) return false;
-					parentName = parent.$options.name;
-				}
-				return parent;
-			}
-		}
-	}
-</script>
-
-<style>
-	.uni-file-picker {
-		/* #ifndef APP-NVUE */
-		box-sizing: border-box;
-		overflow: hidden;
-		width: 100%;
-		/* #endif */
-		flex: 1;
-	}
-
-	.uni-file-picker__header {
-		padding-top: 5px;
-		padding-bottom: 10px;
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		justify-content: space-between;
-	}
-
-	.file-title {
-		font-size: 14px;
-		color: #333;
-	}
-
-	.file-count {
-		font-size: 14px;
-		color: #999;
-	}
-
-	.is-add {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		align-items: center;
-		justify-content: center;
-	}
-
-	.icon-add {
-		width: 50px;
-		height: 5px;
-		background-color: #f1f1f1;
-		border-radius: 2px;
-	}
-
-	.rotate {
-		position: absolute;
-		transform: rotate(90deg);
-	}
-</style>

+ 0 - 325
src/components/uni-file-picker/upload-file.vue

@@ -1,325 +0,0 @@
-<template>
-	<view class="uni-file-picker__files">
-		<view v-if="!readonly" class="files-button" @click="choose">
-			<slot></slot>
-		</view>
-		<!-- :class="{'is-text-box':showType === 'list'}" -->
-		<view v-if="list.length > 0" class="uni-file-picker__lists is-text-box" :style="borderStyle">
-			<!-- ,'is-list-card':showType === 'list-card' -->
-
-			<view class="uni-file-picker__lists-box" v-for="(item ,index) in list" :key="index" :class="{
-				'files-border':index !== 0 && styles.dividline}"
-			 :style="index !== 0 && styles.dividline &&borderLineStyle">
-				<view class="uni-file-picker__item">
-					<!-- :class="{'is-text-image':showType === 'list'}" -->
-					<!-- 	<view class="files__image is-text-image">
-						<image class="header-image" :src="item.logo" mode="aspectFit"></image>
-					</view> -->
-					<view class="files__name">{{item.name}}</view>
-					<view v-if="delIcon&&!readonly" class="icon-del-box icon-files" @click="delFile(index)">
-						<view class="icon-del icon-files"></view>
-						<view class="icon-del rotate"></view>
-					</view>
-				</view>
-				<view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress">
-					<progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4"
-					 :backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" />
-				</view>
-				<view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item,index)">
-					点击重试
-				</view>
-			</view>
-
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "uploadFile",
-		emits:['uploadFiles','choose','delFile'],
-		props: {
-			filesList: {
-				type: Array,
-				default () {
-					return []
-				}
-			},
-			delIcon: {
-				type: Boolean,
-				default: true
-			},
-			limit: {
-				type: [Number, String],
-				default: 9
-			},
-			showType: {
-				type: String,
-				default: ''
-			},
-			listStyles: {
-				type: Object,
-				default () {
-					return {
-						// 是否显示边框
-						border: true,
-						// 是否显示分隔线
-						dividline: true,
-						// 线条样式
-						borderStyle: {}
-					}
-				}
-			},
-			readonly:{
-				type:Boolean,
-				default:false
-			}
-		},
-		computed: {
-			list() {
-				let files = []
-				this.filesList.forEach(v => {
-					files.push(v)
-				})
-				return files
-			},
-			styles() {
-				let styles = {
-					border: true,
-					dividline: true,
-					'border-style': {}
-				}
-				return Object.assign(styles, this.listStyles)
-			},
-			borderStyle() {
-				let {
-					borderStyle,
-					border
-				} = this.styles
-				let obj = {}
-				if (!border) {
-					obj.border = 'none'
-				} else {
-					let width = (borderStyle && borderStyle.width) || 1
-					width = this.value2px(width)
-					let radius = (borderStyle && borderStyle.radius) || 5
-					radius = this.value2px(radius)
-					obj = {
-						'border-width': width,
-						'border-style': (borderStyle && borderStyle.style) || 'solid',
-						'border-color': (borderStyle && borderStyle.color) || '#eee',
-						'border-radius': radius
-					}
-				}
-				let classles = ''
-				for (let i in obj) {
-					classles += `${i}:${obj[i]};`
-				}
-				return classles
-			},
-			borderLineStyle() {
-				let obj = {}
-				let {
-					borderStyle
-				} = this.styles
-				if (borderStyle && borderStyle.color) {
-					obj['border-color'] = borderStyle.color
-				}
-				if (borderStyle && borderStyle.width) {
-					let width = borderStyle && borderStyle.width || 1
-					let style = borderStyle && borderStyle.style || 0
-					if (typeof width === 'number') {
-						width += 'px'
-					} else {
-						width = width.indexOf('px') ? width : width + 'px'
-					}
-					obj['border-width'] = width
-
-					if (typeof style === 'number') {
-						style += 'px'
-					} else {
-						style = style.indexOf('px') ? style : style + 'px'
-					}
-					obj['border-top-style'] = style
-				}
-				let classles = ''
-				for (let i in obj) {
-					classles += `${i}:${obj[i]};`
-				}
-				return classles
-			}
-		},
-
-		methods: {
-			uploadFiles(item, index) {
-				this.$emit("uploadFiles", {
-					item,
-					index
-				})
-			},
-			choose() {
-				this.$emit("choose")
-			},
-			delFile(index) {
-				this.$emit('delFile', index)
-			},
-			value2px(value) {
-				if (typeof value === 'number') {
-					value += 'px'
-				} else {
-					value = value.indexOf('px') !== -1 ? value : value + 'px'
-				}
-				return value
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.uni-file-picker__files {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		justify-content: flex-start;
-	}
-
-	.files-button {
-		// border: 1px red solid;
-	}
-
-	.uni-file-picker__lists {
-		position: relative;
-		margin-top: 5px;
-		overflow: hidden;
-	}
-
-	.file-picker__mask {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		justify-content: center;
-		align-items: center;
-		position: absolute;
-		right: 0;
-		top: 0;
-		bottom: 0;
-		left: 0;
-		color: #fff;
-		font-size: 14px;
-		background-color: rgba(0, 0, 0, 0.4);
-	}
-
-	.uni-file-picker__lists-box {
-		position: relative;
-	}
-
-	.uni-file-picker__item {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		align-items: center;
-		padding: 8px 10px;
-		padding-right: 5px;
-		padding-left: 10px;
-	}
-
-	.files-border {
-		border-top: 1px #eee solid;
-	}
-
-	.files__name {
-		flex: 1;
-		font-size: 14px;
-		color: #666;
-		margin-right: 25px;
-		/* #ifndef APP-NVUE */
-		word-break: break-all;
-		word-wrap: break-word;
-		/* #endif */
-	}
-
-	.icon-files {
-		/* #ifndef APP-NVUE */
-		position: static;
-		background-color: initial;
-		/* #endif */
-	}
-
-	// .icon-files .icon-del {
-	// 	background-color: #333;
-	// 	width: 12px;
-	// 	height: 1px;
-	// }
-
-
-	.is-list-card {
-		border: 1px #eee solid;
-		margin-bottom: 5px;
-		border-radius: 5px;
-		box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.1);
-		padding: 5px;
-	}
-
-	.files__image {
-		width: 40px;
-		height: 40px;
-		margin-right: 10px;
-	}
-
-	.header-image {
-		width: 100%;
-		height: 100%;
-	}
-
-	.is-text-box {
-		border: 1px #eee solid;
-		border-radius: 5px;
-	}
-
-	.is-text-image {
-		width: 25px;
-		height: 25px;
-		margin-left: 5px;
-	}
-
-	.rotate {
-		position: absolute;
-		transform: rotate(90deg);
-	}
-
-	.icon-del-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		margin: auto 0;
-		/* #endif */
-		align-items: center;
-		justify-content: center;
-		position: absolute;
-		top: 0px;
-		bottom: 0;
-		right: 5px;
-		height: 26px;
-		width: 26px;
-		// border-radius: 50%;
-		// background-color: rgba(0, 0, 0, 0.5);
-		z-index: 2;
-		transform: rotate(-45deg);
-	}
-
-	.icon-del {
-		width: 15px;
-		height: 1px;
-		background-color: #333;
-		// border-radius: 1px;
-	}
-
-	/* #ifdef H5 */
-	@media all and (min-width: 768px) {
-		.uni-file-picker__files {
-			max-width: 375px;
-		}
-	}
-
-	/* #endif */
-</style>

+ 0 - 292
src/components/uni-file-picker/upload-image.vue

@@ -1,292 +0,0 @@
-<template>
-	<view class="uni-file-picker__container">
-		<view class="file-picker__box" v-for="(item,index) in filesList" :key="index" :style="boxStyle">
-			<view class="file-picker__box-content" :style="borderStyle">
-				<image class="file-image" :src="item.url" mode="aspectFill" @click.stop="prviewImage(item,index)"></image>
-				<view v-if="delIcon && !readonly" class="icon-del-box" @click.stop="delFile(index)">
-					<view class="icon-del"></view>
-					<view class="icon-del rotate"></view>
-				</view>
-				<view v-if="(item.progress && item.progress !== 100) ||item.progress===0 " class="file-picker__progress">
-					<progress class="file-picker__progress-item" :percent="item.progress === -1?0:item.progress" stroke-width="4"
-					 :backgroundColor="item.errMsg?'#ff5a5f':'#EBEBEB'" />
-				</view>
-				<view v-if="item.errMsg" class="file-picker__mask" @click.stop="uploadFiles(item,index)">
-					点击重试
-				</view>
-			</view>
-		</view>
-		<view v-if="filesList.length < limit && !readonly" class="file-picker__box" :style="boxStyle">
-			<view class="file-picker__box-content is-add" :style="borderStyle" @click="choose">
-				<slot>
-					<view class="icon-add"></view>
-					<view class="icon-add rotate"></view>
-				</slot>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "uploadImage",
-		emits:['uploadFiles','choose','delFile'],
-		props: {
-			filesList: {
-				type: Array,
-				default () {
-					return []
-				}
-			},
-			disabled:{
-				type: Boolean,
-				default: false
-			},
-			disablePreview: {
-				type: Boolean,
-				default: false
-			},
-			limit: {
-				type: [Number, String],
-				default: 9
-			},
-			imageStyles: {
-				type: Object,
-				default () {
-					return {
-						width: 'auto',
-						height: 'auto',
-						border: {}
-					}
-				}
-			},
-			delIcon: {
-				type: Boolean,
-				default: true
-			},
-			readonly:{
-				type:Boolean,
-				default:false
-			}
-		},
-		computed: {
-			styles() {
-				let styles = {
-					width: 'auto',
-					height: 'auto',
-					border: {}
-				}
-				return Object.assign(styles, this.imageStyles)
-			},
-			boxStyle() {
-				const {
-					width = 'auto',
-						height = 'auto'
-				} = this.styles
-				let obj = {}
-				if (height === 'auto') {
-					if (width !== 'auto') {
-						obj.height = this.value2px(width)
-						obj['padding-top'] = 0
-					} else {
-						obj.height = 0
-					}
-				} else {
-					obj.height = this.value2px(height)
-					obj['padding-top'] = 0
-				}
-
-				if (width === 'auto') {
-					if (height !== 'auto') {
-						obj.width = this.value2px(height)
-					} else {
-						obj.width = '33.3%'
-					}
-				} else {
-					obj.width = this.value2px(width)
-				}
-
-				let classles = ''
-				for(let i in obj){
-					classles+= `${i}:${obj[i]};`
-				}
-				return classles
-			},
-			borderStyle() {
-				let {
-					border
-				} = this.styles
-				let obj = {}
-				const widthDefaultValue = 1
-				const radiusDefaultValue = 3
-				if (typeof border === 'boolean') {
-					obj.border = border ? '1px #eee solid' : 'none'
-				} else {
-					let width = (border && border.width) || widthDefaultValue
-					width = this.value2px(width)
-					let radius = (border && border.radius) || radiusDefaultValue
-					radius = this.value2px(radius)
-					obj = {
-						'border-width': width,
-						'border-style': (border && border.style) || 'solid',
-						'border-color': (border && border.color) || '#eee',
-						'border-radius': radius
-					}
-				}
-				let classles = ''
-				for(let i in obj){
-					classles+= `${i}:${obj[i]};`
-				}
-				return classles
-			}
-		},
-		methods: {
-			uploadFiles(item, index) {
-				this.$emit("uploadFiles", item)
-			},
-			choose() {
-				this.$emit("choose")
-			},
-			delFile(index) {
-				this.$emit('delFile', index)
-			},
-			prviewImage(img, index) {
-				let urls = []
-				if(Number(this.limit) === 1&&this.disablePreview&&!this.disabled){
-					this.$emit("choose")
-				}
-				if(this.disablePreview) return
-				this.filesList.forEach(i => {
-					urls.push(i.url)
-				})
-
-				uni.previewImage({
-					urls: urls,
-					current: index
-				});
-			},
-			value2px(value) {
-				if (typeof value === 'number') {
-					value += 'px'
-				} else {
-					if (value.indexOf('%') === -1) {
-						value = value.indexOf('px') !== -1 ? value : value + 'px'
-					}
-				}
-				return value
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.uni-file-picker__container {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		box-sizing: border-box;
-		/* #endif */
-		flex-wrap: wrap;
-		margin: -5px;
-	}
-
-	.file-picker__box {
-		position: relative;
-		// flex: 0 0 33.3%;
-		width: 33.3%;
-		height: 0;
-		padding-top: 33.33%;
-		/* #ifndef APP-NVUE */
-		box-sizing: border-box;
-		/* #endif */
-	}
-
-	.file-picker__box-content {
-		position: absolute;
-		top: 0;
-		right: 0;
-		bottom: 0;
-		left: 0;
-		margin: 5px;
-		border: 1px #eee solid;
-		border-radius: 5px;
-		overflow: hidden;
-	}
-
-	.file-picker__progress {
-		position: absolute;
-		bottom: 0;
-		left: 0;
-		right: 0;
-		/* border: 1px red solid; */
-		z-index: 2;
-	}
-
-	.file-picker__progress-item {
-		width: 100%;
-	}
-
-	.file-picker__mask {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		justify-content: center;
-		align-items: center;
-		position: absolute;
-		right: 0;
-		top: 0;
-		bottom: 0;
-		left: 0;
-		color: #fff;
-		font-size: 12px;
-		background-color: rgba(0, 0, 0, 0.4);
-	}
-
-	.file-image {
-		width: 100%;
-		height: 100%;
-	}
-
-	.is-add {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		align-items: center;
-		justify-content: center;
-	}
-
-	.icon-add {
-		width: 50px;
-		height: 5px;
-		background-color: #f1f1f1;
-		border-radius: 2px;
-	}
-
-	.rotate {
-		position: absolute;
-		transform: rotate(90deg);
-	}
-
-	.icon-del-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		align-items: center;
-		justify-content: center;
-		position: absolute;
-		top: 3px;
-		right: 3px;
-		height: 26px;
-		width: 26px;
-		border-radius: 50%;
-		background-color: rgba(0, 0, 0, 0.5);
-		z-index: 2;
-		transform: rotate(-45deg);
-	}
-
-	.icon-del {
-		width: 15px;
-		height: 2px;
-		background-color: #fff;
-		border-radius: 2px;
-	}
-</style>

+ 0 - 109
src/components/uni-file-picker/utils.js

@@ -1,109 +0,0 @@
-/**
- * 获取文件名和后缀
- * @param {String} name
- */
-export const get_file_ext = (name) => {
-	const last_len = name.lastIndexOf('.')
-	const len = name.length
-	return {
-		name: name.substring(0, last_len),
-		ext: name.substring(last_len + 1, len)
-	}
-}
-
-/**
- * 获取扩展名
- * @param {Array} fileExtname
- */
-export const get_extname = (fileExtname) => {
-	if (!Array.isArray(fileExtname)) {
-		let extname = fileExtname.replace(/(\[|\])/g, '')
-		return extname.split(',')
-	} else {
-		return fileExtname
-	}
-	return []
-}
-
-/**
- * 获取文件和检测是否可选
- */
-export const get_files_and_is_max = (res, _extname) => {
-	let filePaths = []
-	let files = []
-	if(!_extname || _extname.length === 0){
-		return {
-			filePaths,
-			files
-		}
-	}
-	res.tempFiles.forEach(v => {
-		let fileFullName = get_file_ext(v.name)
-		const extname = fileFullName.ext.toLowerCase()
-		if (_extname.indexOf(extname) !== -1) {
-			files.push(v)
-			filePaths.push(v.path)
-		}
-	})
-	if (files.length !== res.tempFiles.length) {
-		uni.showToast({
-			title: `当前选择了${res.tempFiles.length}个文件 ,${res.tempFiles.length - files.length} 个文件格式不正确`,
-			icon: 'none',
-			duration: 5000
-		})
-	}
-
-	return {
-		filePaths,
-		files
-	}
-}
-
-
-/**
- * 获取图片信息
- * @param {Object} filepath
- */
-export const get_file_info = (filepath) => {
-	return new Promise((resolve, reject) => {
-		uni.getImageInfo({
-			src: filepath,
-			success(res) {
-				resolve(res)
-			},
-			fail(err) {
-				reject(err)
-			}
-		})
-	})
-}
-/**
- * 获取封装数据
- */
-export const get_file_data = async (files, type = 'image') => {
-	// 最终需要上传数据库的数据
-	let fileFullName = get_file_ext(files.name)
-	const extname = fileFullName.ext.toLowerCase()
-	let filedata = {
-		name: files.name,
-		uuid: files.uuid,
-		extname: extname || '',
-		cloudPath: files.cloudPath,
-		fileType: files.fileType,
-		url: files.path || files.path,
-		size: files.size, //单位是字节
-		image: {},
-		path: files.path,
-		video: {}
-	}
-	if (type === 'image') {
-		const imageinfo = await get_file_info(files.path)
-		delete filedata.video
-		filedata.image.width = imageinfo.width
-		filedata.image.height = imageinfo.height
-		filedata.image.location = imageinfo.path
-	} else {
-		delete filedata.image
-	}
-	return filedata
-}

+ 0 - 45
src/components/uni-popup-dialog/keypress.js

@@ -1,45 +0,0 @@
-// #ifdef H5
-export default {
-  name: 'Keypress',
-  props: {
-    disable: {
-      type: Boolean,
-      default: false
-    }
-  },
-  mounted () {
-    const keyNames = {
-      esc: ['Esc', 'Escape'],
-      tab: 'Tab',
-      enter: 'Enter',
-      space: [' ', 'Spacebar'],
-      up: ['Up', 'ArrowUp'],
-      left: ['Left', 'ArrowLeft'],
-      right: ['Right', 'ArrowRight'],
-      down: ['Down', 'ArrowDown'],
-      delete: ['Backspace', 'Delete', 'Del']
-    }
-    const listener = ($event) => {
-      if (this.disable) {
-        return
-      }
-      const keyName = Object.keys(keyNames).find(key => {
-        const keyName = $event.key
-        const value = keyNames[key]
-        return value === keyName || (Array.isArray(value) && value.includes(keyName))
-      })
-      if (keyName) {
-        // 避免和其他按键事件冲突
-        setTimeout(() => {
-          this.$emit(keyName, {})
-        }, 0)
-      }
-    }
-    document.addEventListener('keyup', listener)
-    this.$once('hook:beforeDestroy', () => {
-      document.removeEventListener('keyup', listener)
-    })
-  },
-	render: () => {}
-}
-// #endif

+ 0 - 275
src/components/uni-popup-dialog/uni-popup-dialog.vue

@@ -1,275 +0,0 @@
-<template>
-	<view class="uni-popup-dialog">
-		<view class="uni-dialog-title">
-			<text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{titleText}}</text>
-		</view>
-		<view v-if="mode === 'base'" class="uni-dialog-content">
-			<slot>
-				<text class="uni-dialog-content-text">{{content}}</text>
-			</slot>
-		</view>
-		<view v-else class="uni-dialog-content">
-			<slot>
-				<input class="uni-dialog-input" v-model="val" :type="inputType" :placeholder="placeholderText" :focus="focus" >
-			</slot>
-		</view>
-		<view class="uni-dialog-button-group">
-			<view class="uni-dialog-button" @click="closeDialog">
-				<text class="uni-dialog-button-text">{{closeText}}</text>
-			</view>
-			<view class="uni-dialog-button uni-border-left" @click="onOk">
-				<text class="uni-dialog-button-text uni-button-color">{{okText}}</text>
-			</view>
-		</view>
-
-	</view>
-</template>
-
-<script>
-	import popup from '../uni-popup/popup.js'
-	import {
-	initVueI18n
-	} from '@dcloudio/uni-i18n'
-	import messages from '../uni-popup/i18n/index.js'
-	const {	t } = initVueI18n(messages)
-	/**
-	 * PopUp 弹出层-对话框样式
-	 * @description 弹出层-对话框样式
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
-	 * @property {String} value input 模式下的默认值
-	 * @property {String} placeholder input 模式下输入提示
-	 * @property {String} type = [success|warning|info|error] 主题样式
-	 *  @value success 成功
-	 * 	@value warning 提示
-	 * 	@value info 消息
-	 * 	@value error 错误
-	 * @property {String} mode = [base|input] 模式、
-	 * 	@value base 基础对话框
-	 * 	@value input 可输入对话框
-	 * @property {String} content 对话框内容
-	 * @property {Boolean} beforeClose 是否拦截取消事件
-	 * @event {Function} confirm 点击确认按钮触发
-	 * @event {Function} close 点击取消按钮触发
-	 */
-
-	export default {
-		name: "uniPopupDialog",
-		mixins: [popup],
-		emits:['confirm','close'],
-		props: {
-			inputType:{
-				type: String,
-				default: 'text'
-			},
-			value: {
-				type: [String, Number],
-				default: ''
-			},
-			placeholder: {
-				type: [String, Number],
-				default: ''
-			},
-			type: {
-				type: String,
-				default: 'error'
-			},
-			mode: {
-				type: String,
-				default: 'base'
-			},
-			title: {
-				type: String,
-				default: ''
-			},
-			content: {
-				type: String,
-				default: ''
-			},
-			beforeClose: {
-				type: Boolean,
-				default: false
-			},
-			cancelText:{
-				type: String,
-				default: ''
-			},
-			confirmText:{
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				dialogType: 'error',
-				focus: false,
-				val: ""
-			}
-		},
-		computed: {
-			okText() {
-				return this.confirmText || t("uni-popup.ok")
-			},
-			closeText() {
-				return this.cancelText || t("uni-popup.cancel")
-			},
-			placeholderText() {
-				return this.placeholder || t("uni-popup.placeholder")
-			},
-			titleText() {
-				return this.title || t("uni-popup.title")
-			}
-		},
-		watch: {
-			type(val) {
-				this.dialogType = val
-			},
-			mode(val) {
-				if (val === 'input') {
-					this.dialogType = 'info'
-				}
-			},
-			value(val) {
-				this.val = val
-			}
-		},
-		created() {
-			// 对话框遮罩不可点击
-			this.popup.disableMask()
-			// this.popup.closeMask()
-			if (this.mode === 'input') {
-				this.dialogType = 'info'
-				this.val = this.value
-			} else {
-				this.dialogType = this.type
-			}
-		},
-		mounted() {
-			this.focus = true
-		},
-		methods: {
-			/**
-			 * 点击确认按钮
-			 */
-			onOk() {
-				if (this.mode === 'input'){
-					this.$emit('confirm', this.val)
-				}else{
-					this.$emit('confirm')
-				}
-				if(this.beforeClose) return
-				this.popup.close()
-			},
-			/**
-			 * 点击取消按钮
-			 */
-			closeDialog() {
-				this.$emit('close')
-				if(this.beforeClose) return
-				this.popup.close()
-			},
-			close(){
-				this.popup.close()
-			}
-		}
-	}
-</script>
-
-<style lang="scss" >
-	.uni-popup-dialog {
-		width: 300px;
-		border-radius: 11px;
-		background-color: #fff;
-	}
-
-	.uni-dialog-title {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		justify-content: center;
-		padding-top: 25px;
-	}
-
-	.uni-dialog-title-text {
-		font-size: 16px;
-		font-weight: 500;
-	}
-
-	.uni-dialog-content {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-		padding: 20px;
-	}
-
-	.uni-dialog-content-text {
-		font-size: 14px;
-		color: #6C6C6C;
-	}
-
-	.uni-dialog-button-group {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		border-top-color: #f5f5f5;
-		border-top-style: solid;
-		border-top-width: 1px;
-	}
-
-	.uni-dialog-button {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-
-		flex: 1;
-		flex-direction: row;
-		justify-content: center;
-		align-items: center;
-		height: 45px;
-	}
-
-	.uni-border-left {
-		border-left-color: #f0f0f0;
-		border-left-style: solid;
-		border-left-width: 1px;
-	}
-
-	.uni-dialog-button-text {
-		font-size: 16px;
-		color: #333;
-	}
-
-	.uni-button-color {
-		color: #007aff;
-	}
-
-	.uni-dialog-input {
-		flex: 1;
-		font-size: 14px;
-		border: 1px #eee solid;
-		height: 40px;
-		padding: 0 10px;
-		border-radius: 5px;
-		color: #555;
-	}
-
-	.uni-popup__success {
-		color: #4cd964;
-	}
-
-	.uni-popup__warn {
-		color: #f0ad4e;
-	}
-
-	.uni-popup__error {
-		color: #dd524d;
-	}
-
-	.uni-popup__info {
-		color: #909399;
-	}
-</style>

+ 0 - 143
src/components/uni-popup-message/uni-popup-message.vue

@@ -1,143 +0,0 @@
-<template>
-	<view class="uni-popup-message">
-		<view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type">
-			<slot>
-				<text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text>
-			</slot>
-		</view>
-	</view>
-</template>
-
-<script>
-	import popup from '../uni-popup/popup.js'
-	/**
-	 * PopUp 弹出层-消息提示
-	 * @description 弹出层-消息提示
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
-	 * @property {String} type = [success|warning|info|error] 主题样式
-	 *  @value success 成功
-	 * 	@value warning 提示
-	 * 	@value info 消息
-	 * 	@value error 错误
-	 * @property {String} message 消息提示文字
-	 * @property {String} duration 显示时间,设置为 0 则不会自动关闭
-	 */
-
-	export default {
-		name: 'uniPopupMessage',
-		mixins:[popup],
-		props: {
-			/**
-			 * 主题 success/warning/info/error	  默认 success
-			 */
-			type: {
-				type: String,
-				default: 'success'
-			},
-			/**
-			 * 消息文字
-			 */
-			message: {
-				type: String,
-				default: ''
-			},
-			/**
-			 * 显示时间,设置为 0 则不会自动关闭
-			 */
-			duration: {
-				type: Number,
-				default: 3000
-			},
-			maskShow:{
-				type:Boolean,
-				default:false
-			}
-		},
-		data() {
-			return {}
-		},
-		created() {
-			this.popup.maskShow = this.maskShow
-			this.popup.messageChild = this
-		},
-		methods: {
-			timerClose(){
-				if(this.duration === 0) return
-				clearTimeout(this.timer) 
-				this.timer = setTimeout(()=>{
-					this.popup.close()
-				},this.duration)
-			}
-		}
-	}
-</script>
-<style lang="scss" >
-	.uni-popup-message {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		justify-content: center;
-	}
-
-	.uni-popup-message__box {
-		background-color: #e1f3d8;
-		padding: 10px 15px;
-		border-color: #eee;
-		border-style: solid;
-		border-width: 1px;
-		flex: 1;
-	}
-
-	@media screen and (min-width: 500px) {
-		.fixforpc-width {
-			margin-top: 20px;
-			border-radius: 4px;
-			flex: none;
-			min-width: 380px;
-			/* #ifndef APP-NVUE */
-			max-width: 50%;
-			/* #endif */
-			/* #ifdef APP-NVUE */
-			max-width: 500px;
-			/* #endif */
-		}
-	}
-
-	.uni-popup-message-text {
-		font-size: 14px;
-		padding: 0;
-	}
-
-	.uni-popup__success {
-		background-color: #e1f3d8;
-	}
-
-	.uni-popup__success-text {
-		color: #67C23A;
-	}
-
-	.uni-popup__warn {
-		background-color: #faecd8;
-	}
-
-	.uni-popup__warn-text {
-		color: #E6A23C;
-	}
-
-	.uni-popup__error {
-		background-color: #fde2e2;
-	}
-
-	.uni-popup__error-text {
-		color: #F56C6C;
-	}
-
-	.uni-popup__info {
-		background-color: #F2F6FC;
-	}
-
-	.uni-popup__info-text {
-		color: #909399;
-	}
-</style>

+ 0 - 187
src/components/uni-popup-share/uni-popup-share.vue

@@ -1,187 +0,0 @@
-<template>
-	<view class="uni-popup-share">
-		<view class="uni-share-title"><text class="uni-share-title-text">{{shareTitleText}}</text></view>
-		<view class="uni-share-content">
-			<view class="uni-share-content-box">
-				<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
-					<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
-					<text class="uni-share-text">{{item.text}}</text>
-				</view>
-
-			</view>
-		</view>
-		<view class="uni-share-button-box">
-			<button class="uni-share-button" @click="close">{{cancelText}}</button>
-		</view>
-	</view>
-</template>
-
-<script>
-	import popup from '../uni-popup/popup.js'
-	import {
-	initVueI18n
-	} from '@dcloudio/uni-i18n'
-	import messages from '../uni-popup/i18n/index.js'
-	const {	t	} = initVueI18n(messages)
-	export default {
-		name: 'UniPopupShare',
-		mixins:[popup],
-		emits:['select'],
-		props: {
-			title: {
-				type: String,
-				default: ''
-			},
-			beforeClose: {
-				type: Boolean,
-				default: false
-			}
-		},
-		data() {
-			return {
-				bottomData: [{
-						text: '微信',
-						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png',
-						name: 'wx'
-					},
-					{
-						text: '支付宝',
-						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png',
-						name: 'wx'
-					},
-					{
-						text: 'QQ',
-						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.png',
-						name: 'qq'
-					},
-					{
-						text: '新浪',
-						icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png',
-						name: 'sina'
-					},
-					// {
-					// 	text: '百度',
-					// 	icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png',
-					// 	name: 'copy'
-					// },
-					// {
-					// 	text: '其他',
-					// 	icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png',
-					// 	name: 'more'
-					// }
-				]
-			}
-		},
-		created() {},
-		computed: {
-			cancelText() {
-				return t("uni-popup.cancel")
-			},
-		shareTitleText() {
-				return this.title || t("uni-popup.shareTitle")
-			}
-		},
-		methods: {
-			/**
-			 * 选择内容
-			 */
-			select(item, index) {
-				this.$emit('select', {
-					item,
-					index
-				})
-				this.close()
-
-			},
-			/**
-			 * 关闭窗口
-			 */
-			close() {
-				if(this.beforeClose) return
-				this.popup.close()
-			}
-		}
-	}
-</script>
-<style lang="scss" >
-	.uni-popup-share {
-		background-color: #fff;
-		border-top-left-radius: 11px;
-		border-top-right-radius: 11px;
-	}
-	.uni-share-title {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		align-items: center;
-		justify-content: center;
-		height: 40px;
-	}
-	.uni-share-title-text {
-		font-size: 14px;
-		color: #666;
-	}
-	.uni-share-content {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		justify-content: center;
-		padding-top: 10px;
-	}
-
-	.uni-share-content-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		flex-wrap: wrap;
-		width: 360px;
-	}
-
-	.uni-share-content-item {
-		width: 90px;
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		justify-content: center;
-		padding: 10px 0;
-		align-items: center;
-	}
-
-	.uni-share-content-item:active {
-		background-color: #f5f5f5;
-	}
-
-	.uni-share-image {
-		width: 30px;
-		height: 30px;
-	}
-
-	.uni-share-text {
-		margin-top: 10px;
-		font-size: 14px;
-		color: #3B4144;
-	}
-
-	.uni-share-button-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		padding: 10px 15px;
-	}
-
-	.uni-share-button {
-		flex: 1;
-		border-radius: 50px;
-		color: #666;
-		font-size: 16px;
-	}
-
-	.uni-share-button::after {
-		border-radius: 50px;
-	}
-</style>

+ 0 - 7
src/components/uni-popup/i18n/en.json

@@ -1,7 +0,0 @@
-{
-	"uni-popup.cancel": "cancel",
-	"uni-popup.ok": "ok",
-	"uni-popup.placeholder": "pleace enter",
-	"uni-popup.title": "Hint",
-	"uni-popup.shareTitle": "Share to"
-}

+ 0 - 8
src/components/uni-popup/i18n/index.js

@@ -1,8 +0,0 @@
-import en from './en.json'
-import zhHans from './zh-Hans.json'
-import zhHant from './zh-Hant.json'
-export default {
-	en,
-	'zh-Hans': zhHans,
-	'zh-Hant': zhHant
-}

+ 0 - 7
src/components/uni-popup/i18n/zh-Hans.json

@@ -1,7 +0,0 @@
-{
-	"uni-popup.cancel": "取消",
-	"uni-popup.ok": "确定",
-	"uni-popup.placeholder": "请输入",
-		"uni-popup.title": "提示",
-		"uni-popup.shareTitle": "分享到"
-}

+ 0 - 7
src/components/uni-popup/i18n/zh-Hant.json

@@ -1,7 +0,0 @@
-{
-	"uni-popup.cancel": "取消",
-	"uni-popup.ok": "確定",
-	"uni-popup.placeholder": "請輸入",
-	"uni-popup.title": "提示",
-	"uni-popup.shareTitle": "分享到"
-}

+ 0 - 45
src/components/uni-popup/keypress.js

@@ -1,45 +0,0 @@
-// #ifdef H5
-export default {
-  name: 'Keypress',
-  props: {
-    disable: {
-      type: Boolean,
-      default: false
-    }
-  },
-  mounted () {
-    const keyNames = {
-      esc: ['Esc', 'Escape'],
-      tab: 'Tab',
-      enter: 'Enter',
-      space: [' ', 'Spacebar'],
-      up: ['Up', 'ArrowUp'],
-      left: ['Left', 'ArrowLeft'],
-      right: ['Right', 'ArrowRight'],
-      down: ['Down', 'ArrowDown'],
-      delete: ['Backspace', 'Delete', 'Del']
-    }
-    const listener = ($event) => {
-      if (this.disable) {
-        return
-      }
-      const keyName = Object.keys(keyNames).find(key => {
-        const keyName = $event.key
-        const value = keyNames[key]
-        return value === keyName || (Array.isArray(value) && value.includes(keyName))
-      })
-      if (keyName) {
-        // 避免和其他按键事件冲突
-        setTimeout(() => {
-          this.$emit(keyName, {})
-        }, 0)
-      }
-    }
-    document.addEventListener('keyup', listener)
-    // this.$once('hook:beforeDestroy', () => {
-    //   document.removeEventListener('keyup', listener)
-    // })
-  },
-	render: () => {}
-}
-// #endif

+ 0 - 26
src/components/uni-popup/popup.js

@@ -1,26 +0,0 @@
-
-export default {
-	data() {
-		return {
-			
-		}
-	},
-	created(){
-		this.popup = this.getParent()
-	},
-	methods:{
-		/**
-		 * 获取父元素实例
-		 */
-		getParent(name = 'uniPopup') {
-			let parent = this.$parent;
-			let parentName = parent.$options.name;
-			while (parentName !== name) {
-				parent = parent.$parent;
-				if (!parent) return false
-				parentName = parent.$options.name;
-			}
-			return parent;
-		},
-	}
-}

+ 0 - 473
src/components/uni-popup/uni-popup.vue

@@ -1,473 +0,0 @@
-<template>
-	<view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']">
-		<view @touchstart="touchstart">
-			<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass"
-				:duration="duration" :show="showTrans" @click="onTap" />
-			<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration"
-				:show="showTrans" @click="onTap">
-				<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear">
-					<slot />
-				</view>
-			</uni-transition>
-		</view>
-		<!-- #ifdef H5 -->
-		<keypress v-if="maskShow" @esc="onTap" />
-		<!-- #endif -->
-	</view>
-</template>
-
-<script>
-	// #ifdef H5
-	import keypress from './keypress.js'
-	// #endif
-
-	/**
-	 * PopUp 弹出层
-	 * @description 弹出层组件,为了解决遮罩弹层的问题
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
-	 * @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
-	 * 	@value top 顶部弹出
-	 * 	@value center 中间弹出
-	 * 	@value bottom 底部弹出
-	 * 	@value left		左侧弹出
-	 * 	@value right  右侧弹出
-	 * 	@value message 消息提示
-	 * 	@value dialog 对话框
-	 * 	@value share 底部分享示例
-	 * @property {Boolean} animation = [true|false] 是否开启动画
-	 * @property {Boolean} maskClick = [true|false] 蒙版点击是否关闭弹窗(废弃)
-	 * @property {Boolean} isMaskClick = [true|false] 蒙版点击是否关闭弹窗
-	 * @property {String}  backgroundColor 主窗口背景色
-	 * @property {String}  maskBackgroundColor 蒙版颜色
-	 * @property {Boolean} safeArea		   是否适配底部安全区
-	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
-	 * @event {Function} maskClick 点击遮罩触发
-	 */
-
-	export default {
-		name: 'uniPopup',
-		components: {
-			// #ifdef H5
-			keypress
-			// #endif
-		},
-		emits: ['change', 'maskClick'],
-		props: {
-			// 开启动画
-			animation: {
-				type: Boolean,
-				default: true
-			},
-			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
-			// message: 消息提示 ; dialog : 对话框
-			type: {
-				type: String,
-				default: 'center'
-			},
-			// maskClick
-			isMaskClick: {
-				type: Boolean,
-				default: null
-			},
-			// TODO 2 个版本后废弃属性 ,使用 isMaskClick
-			maskClick: {
-				type: Boolean,
-				default: null
-			},
-			backgroundColor: {
-				type: String,
-				default: 'none'
-			},
-			safeArea: {
-				type: Boolean,
-				default: true
-			},
-			maskBackgroundColor: {
-				type: String,
-				default: 'rgba(0, 0, 0, 0.4)'
-			},
-		},
-
-		watch: {
-			/**
-			 * 监听type类型
-			 */
-			type: {
-				handler: function(type) {
-					if (!this.config[type]) return
-					this[this.config[type]](true)
-				},
-				immediate: true
-			},
-			isDesktop: {
-				handler: function(newVal) {
-					if (!this.config[newVal]) return
-					this[this.config[this.type]](true)
-				},
-				immediate: true
-			},
-			/**
-			 * 监听遮罩是否可点击
-			 * @param {Object} val
-			 */
-			maskClick: {
-				handler: function(val) {
-					this.mkclick = val
-				},
-				immediate: true
-			},
-			isMaskClick: {
-				handler: function(val) {
-					this.mkclick = val
-				},
-				immediate: true
-			},
-			// H5 下禁止底部滚动
-			showPopup(show) {
-				// #ifdef H5
-				// fix by mehaotian 处理 h5 滚动穿透的问题
-				document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
-				// #endif
-			}
-		},
-		data() {
-			return {
-				duration: 300,
-				ani: [],
-				showPopup: false,
-				showTrans: false,
-				popupWidth: 0,
-				popupHeight: 0,
-				config: {
-					top: 'top',
-					bottom: 'bottom',
-					center: 'center',
-					left: 'left',
-					right: 'right',
-					message: 'top',
-					dialog: 'center',
-					share: 'bottom'
-				},
-				maskClass: {
-					position: 'fixed',
-					bottom: 0,
-					top: 0,
-					left: 0,
-					right: 0,
-					backgroundColor: 'rgba(0, 0, 0, 0.4)'
-				},
-				transClass: {
-					position: 'fixed',
-					left: 0,
-					right: 0
-				},
-				maskShow: true,
-				mkclick: true,
-				popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
-			}
-		},
-		computed: {
-			isDesktop() {
-				return this.popupWidth >= 500 && this.popupHeight >= 500
-			},
-			bg() {
-				if (this.backgroundColor === '' || this.backgroundColor === 'none') {
-					return 'transparent'
-				}
-				return this.backgroundColor
-			}
-		},
-		mounted() {
-			const fixSize = () => {
-				const {
-					windowWidth,
-					windowHeight,
-					windowTop,
-					safeArea,
-					screenHeight,
-					safeAreaInsets
-				} = uni.getSystemInfoSync()
-				this.popupWidth = windowWidth
-				this.popupHeight = windowHeight + (windowTop || 0)
-				// TODO fix by mehaotian 是否适配底部安全区 ,目前微信ios 、和 app ios 计算有差异,需要框架修复
-				if (safeArea && this.safeArea) {
-					// #ifdef MP-WEIXIN
-					this.safeAreaInsets = screenHeight - safeArea.bottom
-					// #endif
-					// #ifndef MP-WEIXIN
-					this.safeAreaInsets = safeAreaInsets.bottom
-					// #endif
-				} else {
-					this.safeAreaInsets = 0
-				}
-			}
-			fixSize()
-			// #ifdef H5
-			// window.addEventListener('resize', fixSize)
-			// this.$once('hook:beforeDestroy', () => {
-			// 	window.removeEventListener('resize', fixSize)
-			// })
-			// #endif
-		},
-		// #ifndef VUE3
-		// TODO vue2
-		destroyed() {
-			this.setH5Visible()
-		},
-		// #endif
-		// #ifdef VUE3
-		// TODO vue3
-		unmounted() {
-			this.setH5Visible()
-		},
-		// #endif
-		created() {
-			// this.mkclick =  this.isMaskClick || this.maskClick
-			if (this.isMaskClick === null && this.maskClick === null) {
-				this.mkclick = true
-			} else {
-				this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick
-			}
-			if (this.animation) {
-				this.duration = 300
-			} else {
-				this.duration = 0
-			}
-			// TODO 处理 message 组件生命周期异常的问题
-			this.messageChild = null
-			// TODO 解决头条冒泡的问题
-			this.clearPropagation = false
-			this.maskClass.backgroundColor = this.maskBackgroundColor
-		},
-		methods: {
-			setH5Visible() {
-				// #ifdef H5
-				// fix by mehaotian 处理 h5 滚动穿透的问题
-				document.getElementsByTagName('body')[0].style.overflow = 'visible'
-				// #endif
-			},
-			/**
-			 * 公用方法,不显示遮罩层
-			 */
-			closeMask() {
-				this.maskShow = false
-			},
-			/**
-			 * 公用方法,遮罩层禁止点击
-			 */
-			disableMask() {
-				this.mkclick = false
-			},
-			// TODO nvue 取消冒泡
-			clear(e) {
-				// #ifndef APP-NVUE
-				e.stopPropagation()
-				// #endif
-				this.clearPropagation = true
-			},
-
-			open(direction) {
-				// fix by mehaotian 处理快速打开关闭的情况
-				if (this.showPopup) {
-					return
-				}
-				let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
-				if (!(direction && innerType.indexOf(direction) !== -1)) {
-					direction = this.type
-				}
-				if (!this.config[direction]) {
-					console.error('缺少类型:', direction)
-					return
-				}
-				this[this.config[direction]]()
-				this.$emit('change', {
-					show: true,
-					type: direction
-				})
-			},
-			close(type) {
-				this.showTrans = false
-				this.$emit('change', {
-					show: false,
-					type: this.type
-				})
-				clearTimeout(this.timer)
-				// // 自定义关闭事件
-				// this.customOpen && this.customClose()
-				this.timer = setTimeout(() => {
-					this.showPopup = false
-				}, 300)
-			},
-			// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
-			touchstart() {
-				this.clearPropagation = false
-			},
-
-			onTap() {
-				if (this.clearPropagation) {
-					// fix by mehaotian 兼容 nvue
-					this.clearPropagation = false
-					return
-				}
-				this.$emit('maskClick')
-				if (!this.mkclick) return
-				this.close()
-			},
-			/**
-			 * 顶部弹出样式处理
-			 */
-			top(type) {
-				this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
-				this.ani = ['slide-top']
-				this.transClass = {
-					position: 'fixed',
-					left: 0,
-					right: 0,
-					backgroundColor: this.bg
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-				this.$nextTick(() => {
-					if (this.messageChild && this.type === 'message') {
-						this.messageChild.timerClose()
-					}
-				})
-			},
-			/**
-			 * 底部弹出样式处理
-			 */
-			bottom(type) {
-				this.popupstyle = 'bottom'
-				this.ani = ['slide-bottom']
-				this.transClass = {
-					position: 'fixed',
-					left: 0,
-					right: 0,
-					bottom: 0,
-					paddingBottom: this.safeAreaInsets + 'px',
-					backgroundColor: this.bg
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			},
-			/**
-			 * 中间弹出样式处理
-			 */
-			center(type) {
-				this.popupstyle = 'center'
-				this.ani = ['zoom-out', 'fade']
-				this.transClass = {
-					position: 'fixed',
-					/* #ifndef APP-NVUE */
-					display: 'flex',
-					flexDirection: 'column',
-					/* #endif */
-					bottom: 0,
-					left: 0,
-					right: 0,
-					top: 0,
-					justifyContent: 'center',
-					alignItems: 'center'
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			},
-			left(type) {
-				this.popupstyle = 'left'
-				this.ani = ['slide-left']
-				this.transClass = {
-					position: 'fixed',
-					left: 0,
-					bottom: 0,
-					top: 0,
-					backgroundColor: this.bg,
-					/* #ifndef APP-NVUE */
-					display: 'flex',
-					flexDirection: 'column'
-					/* #endif */
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			},
-			right(type) {
-				this.popupstyle = 'right'
-				this.ani = ['slide-right']
-				this.transClass = {
-					position: 'fixed',
-					bottom: 0,
-					right: 0,
-					top: 0,
-					backgroundColor: this.bg,
-					/* #ifndef APP-NVUE */
-					display: 'flex',
-					flexDirection: 'column'
-					/* #endif */
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			}
-		}
-	}
-</script>
-<style lang="scss">
-	.uni-popup {
-		position: fixed;
-		/* #ifndef APP-NVUE */
-		z-index: 99;
-
-		/* #endif */
-		&.top,
-		&.left,
-		&.right {
-			/* #ifdef H5 */
-			top: var(--window-top);
-			/* #endif */
-			/* #ifndef H5 */
-			top: 0;
-			/* #endif */
-		}
-
-		.uni-popup__wrapper {
-			/* #ifndef APP-NVUE */
-			display: block;
-			/* #endif */
-			position: relative;
-
-			/* iphonex 等安全区设置,底部安全区适配 */
-			/* #ifndef APP-NVUE */
-			// padding-bottom: constant(safe-area-inset-bottom);
-			// padding-bottom: env(safe-area-inset-bottom);
-			/* #endif */
-			&.left,
-			&.right {
-				/* #ifdef H5 */
-				padding-top: var(--window-top);
-				/* #endif */
-				/* #ifndef H5 */
-				padding-top: 0;
-				/* #endif */
-				flex: 1;
-			}
-		}
-	}
-
-	.fixforpc-z-index {
-		/* #ifndef APP-NVUE */
-		z-index: 999;
-		/* #endif */
-	}
-
-	.fixforpc-top {
-		top: 0;
-	}
-</style>

+ 0 - 190
src/components/uni-row/uni-row.vue

@@ -1,190 +0,0 @@
-<template>
-	<view :class="[ 'uni-row', typeClass , justifyClass, alignClass, ]" :style="{
-		marginLeft:`${Number(marginValue)}rpx`,
-		marginRight:`${Number(marginValue)}rpx`,
-	}">
-		<slot></slot>
-	</view>
-</template>
-
-<script>
-	const ComponentClass = 'uni-row';
-	const modifierSeparator = '--';
-	/**
-	 * Row	布局-行
-	 * @description	流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。
-	 * @tutorial	https://ext.dcloud.net.cn/plugin?id=3958
-	 *
-	 * @property	{gutter} type = Number 栅格间隔
-	 * @property	{justify} type = String flex 布局下的水平排列方式
-	 * 						可选	start/end/center/space-around/space-between	start
-	 * 						默认值	start
-	 * @property	{align} type = String flex 布局下的垂直排列方式
-	 * 						可选	top/middle/bottom
-	 * 						默认值	top
-	 * @property	{width} type = String|Number nvue下需要自行配置宽度用于计算
-	 * 						默认值 750
-	 */
-
-
-	export default {
-		name: 'uniRow',
-		componentName: 'uniRow',
-		// #ifdef MP-WEIXIN
-		options: {
-			virtualHost: true // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现,可使用flex布局
-		},
-		// #endif
-		props: {
-			type: String,
-			gutter: Number,
-			justify: {
-				type: String,
-				default: 'start'
-			},
-			align: {
-				type: String,
-				default: 'top'
-			},
-			// nvue如果使用span等属性,需要配置宽度
-			width: {
-				type: [String, Number],
-				default: 750
-			}
-		},
-		created() {
-			// #ifdef APP-NVUE
-			this.type = 'flex';
-			// #endif
-		},
-		computed: {
-			marginValue() {
-				// #ifndef APP-NVUE
-				if (this.gutter) {
-					return -(this.gutter / 2);
-				}
-				// #endif
-				return 0;
-			},
-			typeClass() {
-				return this.type === 'flex' ? `${ComponentClass + modifierSeparator}flex` : '';
-			},
-			justifyClass() {
-				return this.justify !== 'start' ? `${ComponentClass + modifierSeparator}flex-justify-${this.justify}` : ''
-			},
-			alignClass() {
-				return this.align !== 'top' ? `${ComponentClass + modifierSeparator}flex-align-${this.align}` : ''
-			}
-		}
-	};
-</script>
-
-<style lang="scss">
-	$layout-namespace: ".uni-";
-	$row:$layout-namespace+"row";
-	$modifier-separator: "--";
-
-	@mixin utils-clearfix {
-		$selector: &;
-
-		@at-root {
-
-			/* #ifndef APP-NVUE */
-			#{$selector}::before,
-			#{$selector}::after {
-				display: table;
-				content: "";
-			}
-
-			#{$selector}::after {
-				clear: both;
-			}
-
-			/* #endif */
-		}
-
-	}
-
-	@mixin utils-flex ($direction: row) {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: $direction;
-	}
-
-	@mixin set-flex($state) {
-		@at-root &-#{$state} {
-			@content
-		}
-	}
-
-	#{$row} {
-		position: relative;
-		flex-direction: row;
-
-		/* #ifdef APP-NVUE */
-		flex: 1;
-		/* #endif */
-
-		/* #ifndef APP-NVUE */
-		box-sizing: border-box;
-		/* #endif */
-
-		// 非nvue使用float布局
-		@include utils-clearfix;
-
-		// 在QQ、字节、百度小程序平台,编译后使用shadow dom,不可使用flex布局,使用float
-		@at-root {
-
-			/* #ifndef MP-QQ || MP-TOUTIAO || MP-BAIDU */
-			&#{$modifier-separator}flex {
-				@include utils-flex;
-				flex-wrap: wrap;
-				flex: 1;
-
-				&:before,
-				&:after {
-					/* #ifndef APP-NVUE */
-					display: none;
-					/* #endif */
-				}
-
-				@include set-flex(justify-center) {
-					justify-content: center;
-				}
-
-				@include set-flex(justify-end) {
-					justify-content: flex-end;
-				}
-
-				@include set-flex(justify-space-between) {
-					justify-content: space-between;
-				}
-
-				@include set-flex(justify-space-around) {
-					justify-content: space-around;
-				}
-
-				@include set-flex(align-middle) {
-					align-items: center;
-				}
-
-				@include set-flex(align-bottom) {
-					align-items: flex-end;
-				}
-			}
-
-			/* #endif */
-		}
-
-	}
-
-	// 字节、QQ配置后不生效
-	// 此处用法无法使用
-	/* #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ */
-	:host {
-		display: block;
-	}
-
-	/* #endif */
-</style>

+ 7 - 0
src/pages.json

@@ -1,4 +1,11 @@
 {
+	"easycom": {
+		"autoscan": true,
+		"custom": {
+			// uni-ui 规则如下配置
+			"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
+		}
+	},
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
 			"path": "pages/index/index",

+ 125 - 43
src/pages/index/index.vue

@@ -5,52 +5,69 @@
           <text class="title">{{ state.title }}</text>
         </view>-->
     <div class="header">
-      <view class="header-left">站点选择</view>
-      <view class="header-right">用户XXX</view>
+      <uni-row class="w100">
+        <uni-col :span="18" class="header-left">
+<!--          <view >站点:</view>-->
+          <picker mode="selector"  @change="handleStationCheck" :value="state.index" range-key="stationName"  :range="state.stationList">
+            <view class="uni-input">{{state.stationList[state.index].stationName}}</view>
+          </picker>
+        </uni-col>
+        <uni-col :span="6"  >
+          <view class="header-right">{{state.user.username}}</view>
+        </uni-col>
+      </uni-row>
     </div>
-    <view class="content">
-      <view class="content-summary">
-        <view v-for="item in state.statList" class="content-summary-item" :key="item.label">
-          <view>{{ item.label }}</view>
-          <view>{{ item.value }}</view>
+
+
+    <uni-card title="概要统计" type="line" class="w100">
+        <view class="content-summary">
+          <view v-for="item in state.statList" class="content-summary-item" :key="item.label">
+            <view>{{ item.label }}</view>
+            <view>{{ item.value }}</view>
+          </view>
         </view>
-      </view>
-
-      <view>
-        <text>运营数据</text>
-        <button>7天</button>
-        <button>30天</button>
-        <button>90天</button>
-      </view>
-
-      <view>
-        <canvas id="charge-ele-total" canvas-id="charge-ele-total" class="charts" @tap="tap"></canvas>
-      </view>
-      <view>
-        <canvas id="charge-order-money" canvas-id="charge-order-money" class="charts" @tap="tap"></canvas>
-      </view>
-      <view>
-        <canvas id="charge-ele-fee" canvas-id="charge-ele-fee" class="charts" @tap="tap"></canvas>
-      </view>
-      <view>
-        <canvas id="charge-service-money" canvas-id="charge-service-money" class="charts" @tap="tap"></canvas>
-      </view>
-      <view>
-        <canvas id="charge-order-user" canvas-id="charge-order-user" class="charts" @tap="tap"></canvas>
-      </view>
-      <view>
-        <canvas id="charge-order-num" canvas-id="charge-order-num" class="charts" @tap="tap"></canvas>
-      </view>
+      </uni-card>
+    <view class="content1 w100">
+
+
+      <block class="w100">
+        <uni-card title="运营数据" padding="10px 0"  >
+          <uni-segmented-control :current="state.current"
+                                 :values="state.items"
+                                 @clickItem="handleClickPeriod"
+                                 styleType="text" activeColor="#4cd964"></uni-segmented-control>
+          <view>
+            <canvas id="charge-ele-total" canvas-id="charge-ele-total" class="charts" @tap="tap"></canvas>
+          </view>
+          <view>
+            <canvas id="charge-order-money" canvas-id="charge-order-money" class="charts" @tap="tap"></canvas>
+          </view>
+          <view>
+            <canvas id="charge-ele-fee" canvas-id="charge-ele-fee" class="charts" @tap="tap"></canvas>
+          </view>
+          <view>
+            <canvas id="charge-service-money" canvas-id="charge-service-money" class="charts" @tap="tap"></canvas>
+          </view>
+          <view>
+            <canvas id="charge-order-user" canvas-id="charge-order-user" class="charts" @tap="tap"></canvas>
+          </view>
+          <view>
+            <canvas id="charge-order-num" canvas-id="charge-order-num" class="charts" @tap="tap"></canvas>
+          </view>
+        </uni-card>
+      </block>
+
+
     </view>
   </view>
 </template>
 
 <script setup>
 import {reactive} from 'vue';
-import {onLoad} from '@dcloudio/uni-app'
+import {onLoad,onShow} from '@dcloudio/uni-app'
 
 import uCharts from "../../assets/u-charts.min";
-import {cfg} from "../../assets/utils";
+import {cfg,get} from "../../assets/utils";
 
 const uChartsInstance = {};
 
@@ -66,7 +83,12 @@ const state = reactive({
     {label: '今日实付总服务费', value: '100'},
     {label: '今日充电人数', value: '100'},
     {label: '今日充电订单数', value: '100'},
-  ]
+  ],
+  user:null,
+  stationList:[],
+  index:0,
+  items:['7天','30天','90天'],
+  current:0
 })
 
 
@@ -78,6 +100,25 @@ onLoad(() => {
   checkLogin();
 })
 
+onShow(()=>{
+  state.user=uni.getStorageSync(cfg.key.user);
+  if(state.user){
+    loadStationList();
+  }
+})
+
+const loadStationList = () => {
+  get(`station/listStation`, {pageNum: 1024}).then((res) => {
+    state.stationList = res;
+  }).catch(e => {
+    console.error(e)
+  })
+}
+
+const handleStationCheck = (e) => {
+
+}
+
 const checkLogin = () => {
   let user = uni.getStorageSync(cfg.key.user);
   if(user){
@@ -121,21 +162,62 @@ const drawCharts = (canvasId, data) => {
 
 </script>
 
-<style>
+<style lang="scss">
 .content {
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
+  padding: 15rpx 15rpx;
 }
 
+.header{
+  width: 100%;
+
+  .header-left{
+    display: inline-flex;
+    align-content: center;
+  }
+
+  .header-left{
+   text-align: right;
+  }
+}
+
+.content-summary{
+  display: flex;
+  justify-content: space-between;
+  width: 100%;
+  margin-top: 30rpx;
+  margin-bottom: 30rpx;
+  flex-wrap: wrap;
+
+  .content-summary-item{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    width: 33.33%;
+    box-shadow: 2px   2px  2px 2px #e6e6e6;
+  }
+}
+
+.kanban-title{
+  display: inline-flex;
+}
+
+.content-chart{
+  width: 100%;;
+}
+
+
 .logo {
-  height: 200 rpx;
-  width: 200 rpx;
-  margin-top: 200 rpx;
+  height: 200rpx;
+  width: 200rpx;
+  margin-top: 200rpx;
   margin-left: auto;
   margin-right: auto;
-  margin-bottom: 5 rpx;
+  margin-bottom: 5rpx;
 }
 
 .text-area {
@@ -144,7 +226,7 @@ const drawCharts = (canvasId, data) => {
 }
 
 .title {
-  font-size: 36 rpx;
+  font-size: 36rpx;
   color: #8f8f94;
 }
 </style>

+ 39 - 26
src/pages/login/index.vue

@@ -44,17 +44,17 @@
         </view>
         <view class='content'>
           <view>申请获取以下权限</view>
-          <text>获得你的公开信息(昵称,头像、地区等)</text>
+          <text>获得你的公开信息(昵称,头像、地区、手机号等)</text>
         </view>
 
         <!--        <button class='bottom' type='primary' open-type="getUserInfo" withCredentials="true" lang="zh_CN" @getuserinfo="handleGetUserInfo">
                   微信授权登录
                 </button>-->
-        <button v-if="state.requireMobile"  class='bottom' type='primary' open-type="getPhoneNumber" withCredentials="true" lang="zh_CN" @getuserinfo="handleRequestPhoneNumber">
+        <button v-if="state.requireMobile" class='bottom' type='primary' @tap.stop="handleOpenPhonePop">
           获取手机号
         </button>
         <uni-popup ref="mobilePopupRef" type="dialog">
-          <uni-popup-dialog ref="inputClose"  mode="input" title="绑定手机号" value=""
+          <uni-popup-dialog ref="inputClose" mode="input" title="本次登录需要绑定手机号" value=""
                             placeholder="请输入内容" @confirm="handleInputMobile"></uni-popup-dialog>
         </uni-popup>
       </view>
@@ -63,12 +63,12 @@
   </view>
 </template>
 <script setup>
-import {onLoad, onUnload} from '@dcloudio/uni-app';
-import {reactive,ref} from 'vue';
-import {msg, cfg, post,get} from '../../assets/utils.js'
+import {onShow, onUnload} from '@dcloudio/uni-app';
+import {reactive, ref} from 'vue';
+import {msg, cfg, post, get} from '../../assets/utils.js'
 
-import UniPopupDialog from "../../components/uni-popup-dialog/uni-popup-dialog";
-import UniPopup from "@/components/uni-popup/uni-popup.vue";
+/*import UniPopupDialog from "../../components/uni-popup-dialog/uni-popup-dialog";
+import UniPopup from "@/components/uni-popup/uni-popup.vue";*/
 // import {
 //     mapMutations
 // } from 'vuex';
@@ -82,7 +82,7 @@ const state = reactive({
   nickName: null,
   avatarUrl: null,
   isCanUse: uni.getStorageSync('isCanUse') || true,//默认为true,
-  requireMobile:false
+  requireMobile: false
 })
 
 /**
@@ -124,13 +124,13 @@ const initLogin = () => {
 
 }
 
-const loginByUnion=()=>{
-  post(`wx/loginByOpenId`,{openId:state.openid}).then(res => {
+const loginByUnion = () => {
+  post(`wx/loginByOpenId`, {openId: state.openid}).then(res => {
     let user = res;
-    if(!res||!res.user||!res.user.mobilePhone){
+    if (!res || !res.user || !res.user.mobilePhone) {
       state.requireMobile = true;
-      mobilePopupRef.value.open();
-    }else{
+      handleOpenPhonePop();
+    } else {
       loginSuccess(res);
     }
   })
@@ -166,16 +166,22 @@ const handleGetUserInfo = () => {
 const handleInputMobile = (e) => {
   //TODO 校验是否有效的手机号
   console.log(e)
-  post(`wx/login`,{unionId:state.openid,mobilePhone:e}).then(res1 => {
-    loginSuccess(res1);
-  })
+  let reg = /^[1][3,4,5,7,8][0-9]{9}$/;
+  if (reg.test(e)) {
+    post(`wx/login`, {openId: state.openid, mobilePhone: e}).then(res1 => {
+      loginSuccess(res1);
+    })
+  } else {
+    msg("请输入有效的手机号");
+  }
+
 }
 
 const handleRequestPhoneNumber = (e) => {
   console.log(e)
   get(`wx/getPhoneNumber?code=${e.detail.code}`).then(res => {
     state.phoneNumber = res.phoneNumber;
-    post(`wx/login`,{unionId:state.openid,mobilePhone:res.phoneNumber}).then(res1 => {
+    post(`wx/login`, {openId: state.openid, mobilePhone: res.phoneNumber}).then(res1 => {
       loginSuccess(res1);
     })
   })
@@ -194,7 +200,7 @@ const updateUserInfo = (userInfo) => {
 
 }
 
-const loginSuccess = (res)=>{
+const loginSuccess = (res) => {
   let {user, satoken} = res;
   uni.setStorageSync(//缓存用户登陆状态
       cfg.key.user,
@@ -204,23 +210,30 @@ const loginSuccess = (res)=>{
       cfg.key.token,
       satoken
   );
-  msg("登录成功");
+  msg("登录成功",'success');
   // login(res);
   // _this.$store.commit("login",res.account)
   // uni.reLaunch({//信息更新成功后跳转到小程序首页
   //     url: '/pages/index/index'
   // });
-  uni.navigateBack();
+  // uni.navigateBack();
+  uni.navigateTo({
+    url:'/pages/index/index'
+  });
 }
 
-onLoad((Option) => {
+const handleOpenPhonePop = () => {
+  mobilePopupRef.value?.open();
+}
+
+onShow((Option) => {
   console.log(Option)
-  // initLogin();
+  initLogin();
   // accountLogin();
   console.log(mobilePopupRef)
-  setTimeout(()=>{
-  mobilePopupRef.value?.open();
-  },1000)
+  /*  setTimeout(()=>{
+    mobilePopupRef.value?.open();
+    },1000)*/
 })
 
 onUnload(() => {

+ 0 - 1
vite.config.js

@@ -5,5 +5,4 @@ export default defineConfig({
   plugins: [
     uni(),
   ],
-  transpileDependencies:['@dcloudio/uni-ui']
 })

+ 5 - 0
yarn.lock

@@ -1271,6 +1271,11 @@
     "@dcloudio/uni-shared" "3.0.0-3090920231225001"
     debug "^4.3.3"
 
+"@dcloudio/uni-ui@^1.5.2":
+  version "1.5.2"
+  resolved "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.2.tgz#514b1d7f2bf5d1868e69780d21abf3bdc9170b10"
+  integrity sha512-/MO31TELyHcKt3nS5bo1t8lQmLSnP9EKlHcShjqM27gL0QeYtoc9UekOITRbA9zi8rnlII3Aw91DHtny3IodFg==
+
 "@dcloudio/vite-plugin-uni@3.0.0-3090920231225001":
   version "3.0.0-3090920231225001"
   resolved "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-3090920231225001.tgz#7893b5949445c64c40b165e53ae89fb44c00f478"