whx 10 months ago
parent
commit
d0deddab1f
100 changed files with 3782 additions and 237 deletions
  1. 187 0
      virgo.wzfrontend/yui_wx/components/common/process.vue
  2. 84 0
      virgo.wzfrontend/yui_wx/components/common/upload.vue
  3. 10 0
      virgo.wzfrontend/yui_wx/pages.json
  4. 0 96
      virgo.wzfrontend/yui_wx/pages/clientDetail/clientDetail.vue
  5. 0 1
      virgo.wzfrontend/yui_wx/pages/fans/fans.vue
  6. 3 3
      virgo.wzfrontend/yui_wx/pages/index/index.vue
  7. 128 0
      virgo.wzfrontend/yui_wx/pages/order/order.vue
  8. 123 0
      virgo.wzfrontend/yui_wx/pages/orderDetail/orderDetail.vue
  9. 1 1
      virgo.wzfrontend/yui_wx/pages/projectList/projectList.vue
  10. 25 0
      virgo.wzfrontend/yui_wx/request/api/order.js
  11. 102 0
      virgo.wzfrontend/yui_wx/static/scss/common.scss
  12. 9 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/changelog.md
  13. 25 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/components/uv-overlay/props.js
  14. 85 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue
  15. 88 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/package.json
  16. 11 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/readme.md
  17. 18 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-popup/changelog.md
  18. 45 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-popup/components/uv-popup/keypress.js
  19. 539 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-popup/components/uv-popup/uv-popup.vue
  20. 92 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-popup/package.json
  21. 21 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-popup/readme.md
  22. 11 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/changelog.md
  23. 67 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.vue
  24. 87 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/package.json
  25. 11 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/readme.md
  26. 7 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/changelog.md
  27. 8 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/components/uv-status-bar/props.js
  28. 54 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/components/uv-status-bar/uv-status-bar.vue
  29. 87 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/package.json
  30. 10 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/readme.md
  31. 19 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-transition/changelog.md
  32. 131 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-transition/components/uv-transition/createAnimation.js
  33. 31 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-transition/components/uv-transition/props.js
  34. 320 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-transition/components/uv-transition/uv-transition.vue
  35. 87 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-transition/package.json
  36. 15 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-transition/readme.md
  37. 1 1
      virgo.wzfrontend/yui_wx/uni_modules/uv-ui-tools/libs/css/components.scss
  38. 17 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/changelog.md
  39. 52 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-preview-video/uv-preview-video.vue
  40. 22 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/mixin.js
  41. 130 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/props.js
  42. 151 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/utils.js
  43. 488 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/uv-upload.vue
  44. 90 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/package.json
  45. 11 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-upload/readme.md
  46. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  47. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  48. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/components/common/process.js.map
  49. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/components/common/upload.js.map
  50. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/clientDetail/clientDetail.js.map
  51. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/fans/fans.js.map
  52. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
  53. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/message/message.js.map
  54. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/myHouse/myHouse.js.map
  55. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/order.js.map
  56. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/orderDetail/orderDetail.js.map
  57. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/projectList/projectList.js.map
  58. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js.map
  59. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js.map
  60. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js.map
  61. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-section/components/uni-section/uni-section.js.map
  62. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.js.map
  63. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-popup/components/uv-popup/uv-popup.js.map
  64. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.js.map
  65. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-status-bar/components/uv-status-bar/uv-status-bar.js.map
  66. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-transition/components/uv-transition/uv-transition.js.map
  67. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-upload/components/uv-preview-video/uv-preview-video.js.map
  68. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-upload/components/uv-upload/uv-upload.js.map
  69. 3 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/app.json
  70. 87 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/main.wxss
  71. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/runtime.js
  72. 5 5
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/vendor.js
  73. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/Winglau14-lotusCalendar/Winglau14-lotusCalendar.js
  74. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/city-select/city-select.js
  75. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/navbar.js
  76. 11 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.js
  77. 7 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.json
  78. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.wxml
  79. 95 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.wxss
  80. 11 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/upload.js
  81. 6 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/upload.json
  82. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/upload.wxml
  83. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/house/houseItem.js
  84. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/house/houseItems.js
  85. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/login/imageCode.js
  86. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/pinapp-empty-page/pinapp-empty-page.js
  87. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/uni-mall-head/uni-mall-head.js
  88. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/uni-mall-list/uni-mall-list.js
  89. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/attention/attention.js
  90. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/chat/chat.js
  91. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/city/city.js
  92. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/client/client.js
  93. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/clientDetail/clientDetail.js
  94. 0 92
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/clientDetail/clientDetail.wxss
  95. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/collect/collect.js
  96. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/data/data.js
  97. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/fans/fans.js
  98. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/highseas/highseas.js
  99. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/house/house.js
  100. 0 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/index/index.js

+ 187 - 0
virgo.wzfrontend/yui_wx/components/common/process.vue

@@ -0,0 +1,187 @@
+<template>
+	<view class="process-list">
+		<view class="process-box">
+			<view class="process-item" v-for="(item,index) in list" :key="index">
+				<view class="user-avatar-box">
+					<view class="user-avatar">{{index+1}}</view>
+					<view :class="'user-avatar-status '+ returnStatus(item.status).className">
+						<uni-icons :type="returnStatus(item.status).icon" size="10" color="#fff"></uni-icons>
+					</view>
+				</view>
+				<view class="process-content">
+					<view class="user-name">
+						<view class="name">{{item.operatorName}}</view>
+						<view v-if="item.status" class="date"><text>{{item.date}}</text></view>
+					</view>
+					<view class="user-content" v-if="item.remark">
+						<view class="remark">
+							{{item.remark}}
+						</view>
+						<view class="remark-file" v-if="item.attachment && item.attachment != '[]'">
+							<upload :list="item.attachment ? JSON.parse(item.attachment) : []" type="preview"></upload>
+						</view>
+					</view>
+				</view>
+				<view class="user-line" v-if="index < list.length-1"></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import upload from '@/components/common/upload'
+	export default {
+		props: ['process'],
+		data() {
+			return {
+				list: [],
+				visible: false
+			}
+		},
+		created() {
+			this.list = this.process;
+		},
+		methods: {
+			returnStatus(state) {
+				let className = '',
+					icon = '';
+				switch (state) {
+					case 0:
+						className = 'info';
+						icon = 'link';
+						break;
+					case 1:
+						className = 'success'
+						icon = 'checkmarkempty';
+						break;
+					case 2:
+						className = 'failed'
+						icon = 'closeempty';
+						break;
+					default:
+						className = 'info'
+						icon = 'link';
+						break;
+				}
+				return {
+					className: className,
+					icon: icon
+				};
+			}
+		},
+		watch: {
+			process() {
+				this.list = this.process;
+			}
+		},
+		components: {
+			upload
+		},
+	}
+</script>
+
+<style lang="scss">
+	.process-list {
+		padding-top: 20rpx;
+
+		.process-item {
+			position: relative;
+			display: flex;
+
+			.user-avatar-box {
+				position: relative;
+
+				.user-avatar {
+					width: 64rpx;
+					height: 64rpx;
+					background: $uni-primary;
+					border-radius: 50%;
+					margin-right: 20rpx;
+					margin-top: 16rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					overprocess: hidden;
+					color: #fff;
+				}
+
+				.user-avatar-status {
+					width: 28rpx;
+					height: 28rpx;
+					border-radius: 50%;
+					border: 2rpx solid #fff;
+					position: absolute;
+					top: 60rpx;
+					right: 20rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+
+				.user-avatar-status.success {
+					background: $uni-success;
+				}
+
+				.user-avatar-status.failed {
+					background: $uni-error;
+				}
+
+				.user-avatar-status.waiting {
+					background: $uni-warning;
+				}
+
+				.user-avatar-status.info {
+					background: $uni-info;
+				}
+			}
+
+
+			.process-content {
+				flex: 1;
+				width: 0;
+
+
+				.user-name {
+					height: 96rpx;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+
+					.name {
+						font-size: 32rpx;
+						font-weight: 600;
+					}
+
+					.date {
+						font-size: 24rpx;
+						color: $uni-secondary-color;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+					}
+				}
+
+				.user-content {
+					background-color: #f5f5f5;
+					border-radius: 16rpx;
+					padding: 20rpx 20rpx 10rpx 20rpx;
+
+					.remark {
+						line-height: 17px;
+						font-weight: 400;
+						padding-bottom: 10rpx;
+					}
+				}
+			}
+
+			.user-line {
+				width: 1px;
+				border-left: 1px solid $uni-border-4;
+				position: absolute;
+				top: 80rpx;
+				bottom: -16rpx;
+				left: 30rpx;
+			}
+		}
+	}
+</style>

+ 84 - 0
virgo.wzfrontend/yui_wx/components/common/upload.vue

@@ -0,0 +1,84 @@
+<template>
+	<view class="upload-index">
+		<uv-upload :fileList="fileList" name="1" multiple :maxCount="type === 'insert' ? 5 : list.length"
+			:deletable="type === 'insert'" @afterRead="afterRead" @delete="deletePic">
+		</uv-upload>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "preview",
+		props: {
+			list: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			type: {
+				type: String,
+				default: 'preview'
+			},
+		},
+		data() {
+			return {
+				fileList: []
+			};
+		},
+		created() {
+			this.fileList = this.list;
+			console.log(this.list);
+		},
+		methods: {
+			// 删除图片
+			deletePic(event) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url)
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+				}
+			},
+			uploadFilePromise(url) {
+				return new Promise((resolve, reject) => {
+					let a = uni.uploadFile({
+						url: 'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
+						filePath: url,
+						name: 'file',
+						formData: {
+							user: 'test'
+						},
+						success: (res) => {
+							setTimeout(() => {
+								resolve(res.data.data)
+							}, 1000)
+						}
+					});
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 10 - 0
virgo.wzfrontend/yui_wx/pages.json

@@ -1,5 +1,10 @@
 {
 	"pages": [{
+		"path": "pages/orderDetail/orderDetail",
+		"style": {
+			"navigationBarTitleText": "工单详情"
+		}
+	}, {
 		"path": "pages/highseas/highseas",
 		"style": {
 			"navigationStyle": "custom",
@@ -120,6 +125,11 @@
 		"style": {
 			"navigationBarTitleText": "项目列表"
 		}
+	}, {
+		"path": "pages/order/order",
+		"style": {
+			"navigationBarTitleText": ""
+		}
 	}],
 	"tabBar": {
 		"color": "#8c8c8c",

+ 0 - 96
virgo.wzfrontend/yui_wx/pages/clientDetail/clientDetail.vue

@@ -122,101 +122,5 @@
 </script>
 
 <style lang="scss">
-	.detail {
-		padding: 30rpx;
 
-		.detail-box {
-			background-color: #ffffff;
-			border-radius: 16rpx;
-			box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.08);
-			padding: 30rpx;
-			position: relative;
-			margin-bottom: 30rpx;
-		}
-
-		.sub-title {
-			display: flex;
-			align-items: center;
-			margin-left: -8rpx;
-
-			.sub-label {
-				font-size: 32rpx;
-				font-weight: 600;
-				margin-left: 14rpx;
-			}
-		}
-
-		.title-box {
-			padding-left: 90rpx;
-			position: relative;
-
-			.title-icon {
-				width: 70rpx;
-				height: 70rpx;
-				text-align: center;
-				line-height: 70rpx;
-				background: $uni-primary;
-				border-radius: 70rpx;
-				position: absolute;
-				left: 0;
-				top: 50%;
-				margin-top: -35rpx;
-			}
-
-			.title {
-				font-size: 32rpx;
-				font-weight: 600;
-			}
-
-			.date {
-				font-size: 24rpx;
-				color: $uni-secondary-color;
-			}
-		}
-
-		.other {
-			margin-top: 20rpx;
-
-			.item {
-				margin-top: 10rpx;
-			}
-
-			.label {
-				color: $uni-secondary-color;
-				font-size: 24rpx;
-			}
-
-			.value {
-				margin-top: 6rpx;
-				font-weight: 400;
-			}
-		}
-
-		.state {
-			margin-top: 20rpx;
-			display: flex;
-			justify-content: space-between;
-
-			.create {
-				height: 48rpx;
-				border-radius: 48rpx;
-				border: 1px solid $uni-primary;
-				display: flex;
-				align-items: center;
-				color: $uni-primary;
-				padding: 0 10rpx;
-
-				.name {
-					font-size: 24rpx;
-					flex: 1;
-					max-width: 150rpx;
-					min-width: 70rpx;
-					overflow: hidden;
-					margin-left: 10rpx;
-					line-height: 36rpx;
-					padding-right: 10rpx;
-				}
-			}
-		}
-	}
 </style>

+ 0 - 1
virgo.wzfrontend/yui_wx/pages/fans/fans.vue

@@ -16,7 +16,6 @@
 				</view>
 			</view>
 		</mescroll-body>
-
 	</view>
 </template>
 

+ 3 - 3
virgo.wzfrontend/yui_wx/pages/index/index.vue

@@ -18,7 +18,7 @@
 			<view class="group-box">
 				<view class="small-box">
 					<view class="small">
-						<view class="group-veiw bg1">
+						<view class="group-veiw bg1" @click="$navigateTo('/pages/order/order?type=1')">
 							<text class="label">维修工单</text>
 							<view class="group-icon">
 								<uni-icons custom-prefix="iconfont" type="icon-weixiugongdan" color="#fff" size="30">
@@ -27,7 +27,7 @@
 						</view>
 					</view>
 					<view class="small">
-						<view class="group-veiw bg2">
+						<view class="group-veiw bg2" @click="$navigateTo('/pages/order/order?type=2')">
 							<text class="label">保洁工单</text>
 							<view class="group-icon">
 								<uni-icons custom-prefix="iconfont" type="icon-jinribaojie" color="#fff" size="30">
@@ -37,7 +37,7 @@
 					</view>
 				</view>
 				<view class="group-item">
-					<view class="group-veiw bg3">
+					<view class="group-veiw bg3" @click="$navigateTo('/pages/order/order?type=3')">
 						<text class="label">运维工单</text>
 						<view class="group-icon">
 							<uni-icons custom-prefix="iconfont" type="icon-yunwei-jiancebaogao" color="#fff" size="30">

+ 128 - 0
virgo.wzfrontend/yui_wx/pages/order/order.vue

@@ -0,0 +1,128 @@
+<template>
+	<view>
+		<mescroll-body top="30" bottom="40" @init="mescrollInit" @down="downCallback" @up="upCallback" :option="{}">
+			<view class="common-list">
+				<view class="common-item" v-for="(item,index) in list" :key="item.id">
+					<view class="title">{{item.name}}</view>
+					<view class="date">{{item.date}}</view>
+					<view>
+						<view class="space" v-for="(node,index) in item.roomMap" :key="index">{{node}}</view>
+					</view>
+					<view class="other">
+						<view class="item" v-if="type === 3">
+							<view class="label">合同编码</view>
+							<view class="value">{{item.contractCode}}</view>
+						</view>
+						<view class="item" v-if="type !== 3">
+							<view class="label">关联租客</view>
+							<view class="value">{{item.tenantType === 1 ? item.merchantName: item.clientName}}</view>
+						</view>
+						<view class="item" v-if="type !== 3">
+							<view class="label">服务方式</view>
+							<view class="value">
+								{{type === 1?$field.findTypeName('serviceWorkWay',item.workWay):$field.findTypeName('clearWorkWay',item.workWay)}}
+							</view>
+						</view>
+					</view>
+					<view class="state">
+						<view class="create">
+							<uni-icons class="inherit-icons" type="staff-filled" color="#08979c" size="18"></uni-icons>
+							<text class="name hui-ellipsis">{{item.followUpPersonName || '-'}}</text>
+						</view>
+						<view class="tag">
+							<div class="status-tag info" v-if="!item.status">待提交</div>
+							<div class="status-tag primary" v-else-if="item.status === 1">待处理</div>
+							<div class="status-tag warning" v-else-if="item.status === 2">处理中</div>
+							<div class="status-tag success" v-else>已处理</div>
+						</view>
+					</view>
+					<view class="icon">
+						<uni-icons custom-prefix="iconfont" :type="menu.iconClass" color="#08979c" size="30">
+						</uni-icons>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {
+		getOrderPageListByQuery
+	} from '@/request/api/order.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				list: [],
+				type: '',
+				menu: {}
+			}
+		},
+		onLoad(body) {
+			this.type = parseInt(body.type);
+			this.menu = this.title();
+			uni.setNavigationBarTitle({
+				title: this.menu.title
+			});
+		},
+		methods: {
+			title() {
+				let str = {
+					title: '',
+					iconClass: 'icon-weixiugongdan'
+				};
+				switch (this.type) {
+					case 1:
+						str = {
+							title: '维修工单',
+							iconClass: 'icon-weixiugongdan'
+						};
+						break;
+					case 2:
+						str = {
+							title: '保洁工单',
+							iconClass: 'icon-jinribaojie'
+						};
+						break;
+					case 3:
+						str = {
+							title: '运维工单',
+							iconClass: 'icon-yunwei-jiancebaogao'
+						};
+						break;
+					default:
+						break;
+				}
+				return str;
+			},
+			/*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
+			upCallback(page) {
+				getOrderPageListByQuery({
+					currPage: page.num,
+					pageSize: 10,
+					organizationId: this.$store.getters.organization.id,
+					projectId: this.$store.getters.project.id,
+					type: this.type
+				}).then(res => {
+					if (res.code === 200) {
+						this.mescroll.endBySize(res.data.dataList.length, res.data.totalCount);
+						if (page.num == 1) this.list = []; //如果是第一页需手动制空列表
+						let data = res.data.dataList;
+						this.list = this.list.concat(data); //追加新数据
+					} else {
+						this.mescroll.endErr();
+					}
+				}).catch(() => {
+					//联网失败, 结束加载
+					this.mescroll.endErr();
+				})
+			},
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 123 - 0
virgo.wzfrontend/yui_wx/pages/orderDetail/orderDetail.vue

@@ -0,0 +1,123 @@
+<template>
+	<view class="client-detail detail" v-if="detail.id">
+		<view class="detail-box">
+			<view class="title-box">
+				<view class="title">{{detail.name}}</view>
+				<view class="date">{{detail.date}}</view>
+				<view class="title-icon">
+					<uni-icons type="wallet-filled" color="#fff" size="20"></uni-icons>
+				</view>
+			</view>
+			<view class="other">
+				<div class="item" v-if="detail.type !== 3">
+					<div class="label">关联租客</div>
+					<div class="value"> {{detail.tenantType === 1 ? detail.merchantName: detail.clientName}}</div>
+				</div>
+				<view class="item" v-if="detail.type === 3">
+					<view class="label">合同编码</view>
+					<view class="value">{{detail.contractCode}}</view>
+				</view>
+				<div class="item">
+					<div class="label">跟进人</div>
+					<div class="value">{{detail.followUpPersonName}}</div>
+				</div>
+				<div class="item">
+					<div class="label">联系电话</div>
+					<div class="value">{{detail.followUpPersonPhone}}</div>
+				</div>
+				<div class="item" v-if="detail.type !== 3">
+					<div class="label">服务方式</div>
+					<div class="value">
+						{{detail.type === 1?$field.findTypeName('serviceWorkWay',detail.workWay):$field.findTypeName('clearWorkWay',detail.workWay)}}
+					</div>
+				</div>
+				<div class="item">
+					<div class="label">摘要</div>
+					<div class="value">{{detail.compendious}}</div>
+				</div>
+			</view>
+			<view class="state">
+				<view class="create">
+					<uni-icons class="inherit-icons" type="staff-filled" color="#08979c" size="18"></uni-icons>
+					<text class="name hui-ellipsis">{{detail.followUpPersonName || '-'}}</text>
+				</view>
+				<view class="tag">
+					<div class="status-tag info" v-if="!detail.status">待提交</div>
+					<div class="status-tag primary" v-else-if="detail.status === 1">待处理</div>
+					<div class="status-tag warning" v-else-if="detail.status === 2">处理中</div>
+					<div class="status-tag success" v-else>已处理</div>
+				</view>
+			</view>
+		</view>
+		<view class="detail-box file-box">
+			<view class="sub-title">
+				<uni-icons type="images-filled" class="inherit-icons" size="26" color="#08979c"></uni-icons>
+				<text class="sub-label">工单附件</text>
+			</view>
+			<view class="other">
+				<upload ref="upload" :list="detail.attachment ? JSON.parse(detail.attachment) : []" type="preview">
+				</upload>
+			</view>
+		</view>
+		<view class="detail-box" v-if="detail.data && detail.data != '[]'">
+			<view class="sub-title">
+				<uni-icons type="calendar-filled" class="inherit-icons" size="26" color="#08979c"></uni-icons>
+				<text class="sub-label">自定义信息</text>
+			</view>
+			<view class="other">
+				<div class="item" v-for="(item,index) in JSON.parse(detail.data)" :key="index">
+					<div class="label">{{item.keyName}}</div>
+					<div class="value">{{item.value}}</div>
+				</div>
+			</view>
+		</view>
+		<view class="detail-box" v-if="detail.workOrderProcessList.length > 0">
+			<view class="sub-title">
+				<uni-icons type="map-filled" class="inherit-icons" size="24" color="#08979c"></uni-icons>
+				<text class="sub-label">工单过程</text>
+			</view>
+			<process :process="detail.workOrderProcessList" v-if="detail.workOrderProcessList.length > 0">
+			</process>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getOrderDetailById
+	} from '@/request/api/order.js'
+	import upload from '@/components/common/upload.vue';
+	import process from '@/components/common/process.vue';
+	export default {
+		data() {
+			return {
+				orderId: 3,
+				detail: {},
+				user: {}
+			}
+		},
+		onLoad(body) {
+			if (body.orderId) this.orderId = body.orderId;
+			this.init();
+			this.user = this.$store.getters.user;
+		},
+		methods: {
+			init() {
+				if (!this.orderId) return;
+				getOrderDetailById(this.orderId).then(res => {
+					if (res.code === 200) {
+						this.detail = res.data;
+					}
+				})
+			}
+		},
+		components: {
+			upload,
+			process
+		},
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 1 - 1
virgo.wzfrontend/yui_wx/pages/projectList/projectList.vue

@@ -7,7 +7,7 @@
 				<view class="space">{{JSON.parse(item.address).join('-')}}</view>
 				<view class="state">
 					<view class="create">
-						<uni-icons class="inherit-icons" type="person-filled" color="#08979c" size="18"></uni-icons>
+						<uni-icons class="inherit-icons" type="staff-filled" color="#08979c" size="18"></uni-icons>
 						<text class="name hui-ellipsis">{{item.organizationName || '-'}}</text>
 					</view>
 					<view class="tag">

+ 25 - 0
virgo.wzfrontend/yui_wx/request/api/order.js

@@ -0,0 +1,25 @@
+import {
+	request
+} from '@/request/request.js';
+/* 
+ * 获取工单分页列表
+ * 
+ */
+export function getOrderPageListByQuery(data) {
+	return request({
+		url: `/api/workOrder/${data.currPage}/${data.pageSize}`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取工单详情
+ * 
+ * 
+ */
+export function getOrderDetailById(id) {
+	return request({
+		url: `/api/workOrder/${id}`,
+		method: 'get'
+	})
+}

+ 102 - 0
virgo.wzfrontend/yui_wx/static/scss/common.scss

@@ -282,3 +282,105 @@ button[type=primary]{
 		background-color: $uni-error;
 	}
 }
+//详情
+.detail {
+	padding: 30rpx;
+
+	.detail-box {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.08);
+		padding: 30rpx;
+		position: relative;
+		margin-bottom: 30rpx;
+		&.file-box{
+			padding-bottom: 20rpx;
+		}
+	}
+
+	.sub-title {
+		display: flex;
+		align-items: center;
+		margin-left: -8rpx;
+
+		.sub-label {
+			font-size: 32rpx;
+			font-weight: 600;
+			margin-left: 14rpx;
+		}
+	}
+
+	.title-box {
+		padding-left: 90rpx;
+		position: relative;
+
+		.title-icon {
+			width: 70rpx;
+			height: 70rpx;
+			text-align: center;
+			line-height: 70rpx;
+			background: $uni-primary;
+			border-radius: 70rpx;
+			position: absolute;
+			left: 0;
+			top: 50%;
+			margin-top: -35rpx;
+		}
+
+		.title {
+			font-size: 32rpx;
+			font-weight: 600;
+			margin-bottom: 8rpx;
+		}
+
+		.date {
+			font-size: 24rpx;
+			color: $uni-secondary-color;
+		}
+	}
+
+	.other {
+		margin-top: 20rpx;
+
+		.item {
+			margin-top: 16rpx;
+		}
+
+		.label {
+			color: $uni-secondary-color;
+			font-size: 24rpx;
+		}
+
+		.value {
+			margin-top: 10rpx;
+			font-weight: 400;
+		}
+	}
+
+	.state {
+		margin-top: 20rpx;
+		display: flex;
+		justify-content: space-between;
+
+		.create {
+			height: 48rpx;
+			border-radius: 48rpx;
+			border: 1px solid $uni-primary;
+			display: flex;
+			align-items: center;
+			color: $uni-primary;
+			padding: 0 10rpx;
+
+			.name {
+				font-size: 24rpx;
+				flex: 1;
+				max-width: 150rpx;
+				min-width: 70rpx;
+				overflow: hidden;
+				margin-left: 10rpx;
+				line-height: 36rpx;
+				padding-right: 10rpx;
+			}
+		}
+	}
+}

+ 9 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/changelog.md

@@ -0,0 +1,9 @@
+## 1.0.3(2023-07-02)
+uv-overlay  由于弹出层uv-transition的修改,组件内部做了相应的修改,参数不变。
+## 1.0.2(2023-06-29)
+1. 优化,H5端禁止穿透滚动
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+1. 新增uv-overlay组件

+ 25 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/components/uv-overlay/props.js

@@ -0,0 +1,25 @@
+export default {
+	props: {
+		// 是否显示遮罩
+		show: {
+			type: Boolean,
+			default: false
+		},
+		// 层级z-index
+		zIndex: {
+			type: [String, Number],
+			default: 10070
+		},
+		// 遮罩的过渡时间,单位为ms
+		duration: {
+			type: [String, Number],
+			default: 300
+		},
+		// 不透明度值,当做rgba的第四个参数
+		opacity: {
+			type: [String, Number],
+			default: 0.5
+		},
+		...uni.$uv?.props?.overlay
+	}
+}

+ 85 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.vue

@@ -0,0 +1,85 @@
+<template>
+	<uv-transition
+	  :show="show"
+		mode="fade"
+	  custom-class="uv-overlay"
+	  :duration="duration"
+	  :custom-style="overlayStyle"
+	  @click="clickHandler"
+		@touchmove.stop.prevent="clear"
+	>
+		<slot />
+	</uv-transition>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+
+	/**
+	 * overlay 遮罩
+	 * @description 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景
+	 * @tutorial https://www.uvui.cn/components/overlay.html
+	 * @property {Boolean}			show		是否显示遮罩(默认 false )
+	 * @property {String | Number}	zIndex		zIndex 层级(默认 10070 )
+	 * @property {String | Number}	duration	动画时长,单位毫秒(默认 300 )
+	 * @property {String | Number}	opacity		不透明度值,当做rgba的第四个参数 (默认 0.5 )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event {Function} click 点击遮罩发送事件
+	 * @example <uv-overlay :show="show" @click="show = false"></uv-overlay>
+	 */
+	export default {
+		name: "uv-overlay",
+		emits: ['click'],
+		mixins: [mpMixin, mixin, props],
+		watch: {
+			show(newVal){
+				// #ifdef H5
+				if(newVal){
+					document.querySelector('body').style.overflow = 'hidden';
+				}else{
+					document.querySelector('body').style.overflow = '';
+				}
+				// #endif
+			}
+		},
+		computed: {
+			overlayStyle() {
+				const style = {
+					position: 'fixed',
+					top: 0,
+					left: 0,
+					right: 0,
+					zIndex: this.zIndex,
+					bottom: 0,
+					'background-color': `rgba(0, 0, 0, ${this.opacity})`
+				}
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
+			}
+		},
+		methods: {
+			clickHandler() {
+				this.$emit('click')
+			},
+			clear() {}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+/* #ifndef APP-NVUE */
+$uv-overlay-top:0 !default;
+$uv-overlay-left:0 !default;
+$uv-overlay-width:100% !default;
+$uv-overlay-height:100% !default;
+$uv-overlay-background-color:rgba(0, 0, 0, .7) !default;
+.uv-overlay {
+	position: fixed;
+	top:$uv-overlay-top;
+	left:$uv-overlay-left;
+	width: $uv-overlay-width;
+	height:$uv-overlay-height;
+	background-color:$uv-overlay-background-color;
+}
+/* #endif */
+</style>

+ 88 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/package.json

@@ -0,0 +1,88 @@
+{
+  "id": "uv-overlay",
+  "displayName": "uv-overlay 遮罩层  全面兼容小程序、nvue、vue2、vue3等多端",
+  "version": "1.0.3",
+  "description": "uv-overlay 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景,uv-popup、uv-toast、uv-tooltip等组件就是用了该组件。",
+  "keywords": [
+    "uv-overlay",
+    "uvui",
+    "uv-ui",
+    "overlay",
+    "遮罩层"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools",
+			"uv-transition"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 11 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-overlay/readme.md

@@ -0,0 +1,11 @@
+## Overlay 遮罩层
+
+> **组件名:uv-overlay**
+
+创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景,uv-popup、uv-toast、uv-tooltip等组件就是用了该组件。
+
+### <a href="https://www.uvui.cn/components/overlay.html" target="_blank">查看文档</a>
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 18 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-popup/changelog.md

@@ -0,0 +1,18 @@
+## 1.0.7(2023-11-20)
+修复issues问题:https://gitee.com/climblee/uv-ui/issues/I8HDLO
+## 1.0.6(2023-10-13)
+1. 优化vue,内容有背景色,设置圆角被遮挡的情况
+## 1.0.5(2023-09-10)
+1. 修复H5默认层级过高的问题
+2. 修复全局设置prop无效的问题
+## 1.0.4(2023-08-08)
+1. 修复修改zIndex不生效的BUG
+## 1.0.3(2023-07-02)
+uv-popup  弹出层,代码重构优化,性能翻倍,小程序体验性能更加,避免卡顿。打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/popup.html
+## 1.0.2(2023-06-11)
+1. 修复zIndex层级问题
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+1. 新增uv-popup组件

+ 45 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-popup/components/uv-popup/keypress.js

@@ -0,0 +1,45 @@
+// #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

+ 539 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-popup/components/uv-popup/uv-popup.vue

@@ -0,0 +1,539 @@
+<template>
+	<view 
+		v-if="showPopup" 
+		class="uv-popup" 
+		:class="[popupClass, isDesktop ? 'fixforpc-z-index' : '']"
+		:style="[{zIndex: zIndex}]"
+	>
+		<view @touchstart="touchstart">
+			<!-- 遮罩层 -->
+			<uv-overlay
+				key="1"
+				v-if="maskShow && overlay"
+				:show="showTrans"
+				:duration="duration"
+				:custom-style="overlayStyle"
+				:opacity="overlayOpacity"
+			  :zIndex="zIndex"
+				@click="onTap"
+			></uv-overlay>
+			<uv-transition 
+				key="2" 
+				:mode="ani" 
+				name="content" 
+				:custom-style="transitionStyle" 
+				:duration="duration"
+				:show="showTrans" 
+				@click="onTap"
+			>
+				<view 
+					class="uv-popup__content" 
+					:style="[contentStyle]" 
+					:class="[popupClass]" 
+					@click="clear"
+				>
+					<uv-status-bar v-if="safeAreaInsetTop"></uv-status-bar>
+					<slot />
+					<uv-safe-bottom v-if="safeAreaInsetBottom"></uv-safe-bottom>
+					<view
+						v-if="closeable"
+						@tap.stop="close"
+						class="uv-popup__content__close"
+						:class="['uv-popup__content__close--' + closeIconPos]"
+						hover-class="uv-popup__content__close--hover"
+						hover-stay-time="150"
+					>
+						<uv-icon
+							name="close"
+							color="#909399"
+							size="18"
+							bold
+						></uv-icon>
+					</view>
+				</view>
+			</uv-transition>
+		</view>
+		<!-- #ifdef H5 -->
+		<keypress v-if="maskShow" @esc="onTap" />
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	// #ifdef H5
+	import keypress from './keypress.js'
+	// #endif
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	/**
+	* PopUp 弹出层
+	* @description 弹出层组件,为了解决遮罩弹层的问题
+	* @tutorial https://www.uvui.cn/components/popup.html
+	* @property {String} mode = [top|center|bottom|left|right] 弹出方式
+	* 	@value top 顶部弹出
+	* 	@value center 中间弹出
+	* 	@value bottom 底部弹出
+	* 	@value left		左侧弹出
+	* 	@value right  右侧弹出
+	* @property {Number} duration 动画时长,默认300
+	* @property {Boolean} overlay 是否显示遮罩,默认true
+	* @property {Boolean} overlayOpacity 遮罩透明度,默认0.5 
+	* @property {Object} overlayStyle 遮罩自定义样式
+	* @property {Boolean} closeOnClickOverlay = [true|false] 蒙版点击是否关闭弹窗,默认true
+	* @property {Number | String} zIndex 弹出层的层级
+	* @property {Boolean} safeAreaInsetTop 是否留出顶部安全区(状态栏高度),默认false
+	* @property {Boolean} safeAreaInsetBottom 是否为留出底部安全区适配,默认true
+	* @property {Boolean} closeable 是否显示关闭图标,默认false
+	* @property {Boolean} closeIconPos 自定义关闭图标位置,`top-left`-左上角,`top-right`-右上角,`bottom-left`-左下角,`bottom-right`-右下角,默认top-right
+	* @property {String}  bgColor 主窗口背景色
+	* @property {String}  maskBackgroundColor 蒙版颜色
+	* @property {Boolean} customStyle 自定义样式
+	* @event {Function} change 打开关闭弹窗触发,e={show: false}
+	* @event {Function} maskClick 点击遮罩触发
+	*/
+	export default {
+		name: 'uv-popup',
+		components: {
+			// #ifdef H5
+			keypress
+			// #endif
+		},
+		mixins: [mpMixin, mixin],
+		emits: ['change', 'maskClick'],
+		props: {
+			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+			// message: 消息提示 ; dialog : 对话框
+			mode: {
+				type: String,
+				default: 'center'
+			},
+			// 动画时长,单位ms
+			duration: {
+				type: [String, Number],
+				default: 300
+			},
+			// 层级
+			zIndex: {
+				type: [String, Number],
+				// #ifdef H5
+				default: 997
+				// #endif
+				// #ifndef H5
+				default: 10075
+				// #endif
+			},
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			safeArea: {
+				type: Boolean,
+				default: true
+			},
+			// 是否显示遮罩
+			overlay: {
+				type: Boolean,
+				default: true
+			},
+			// 点击遮罩是否关闭弹窗
+			closeOnClickOverlay: {
+				type: Boolean,
+				default: true
+			},
+			// 遮罩的透明度,0-1之间
+			overlayOpacity: {
+				type: [Number, String],
+				default: 0.4
+			},
+			// 自定义遮罩的样式
+			overlayStyle: {
+				type: [Object, String],
+				default: ''
+			},
+			// 是否为iPhoneX留出底部安全距离
+			safeAreaInsetBottom: {
+				type: Boolean,
+				default: true
+			},
+			// 是否留出顶部安全距离(状态栏高度)
+			safeAreaInsetTop: {
+				type: Boolean,
+				default: false
+			},
+			// 是否显示关闭图标
+			closeable: {
+				type: Boolean,
+				default: false
+			},
+			// 自定义关闭图标位置,top-left为左上角,top-right为右上角,bottom-left为左下角,bottom-right为右下角
+			closeIconPos: {
+				type: String,
+				default: 'top-right'
+			},
+			// mode=center,也即中部弹出时,是否使用缩放模式
+			zoom: {
+				type: Boolean,
+				default: true
+			},
+			round: {
+				type: [Number, String],
+				default: 0
+			},
+			...uni.$uv?.props?.popup
+		},
+		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.mode]](true)
+				},
+				immediate: true
+			},
+			// H5 下禁止底部滚动
+			showPopup(show) {
+				// #ifdef H5
+				// fix by mehaotian 处理 h5 滚动穿透的问题
+				document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
+				// #endif
+			}
+		},
+		data() {
+			return {
+				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'
+				},
+				transitionStyle: {
+					position: 'fixed',
+					left: 0,
+					right: 0
+				},
+				maskShow: true,
+				mkclick: true,
+				popupClass: this.isDesktop ? 'fixforpc-top' : 'top',
+				direction: ''
+			}
+		},
+		computed: {
+			isDesktop() {
+				return this.popupWidth >= 500 && this.popupHeight >= 500
+			},
+			bg() {
+				if (this.bgColor === '' || this.bgColor === 'none' || this.$uv.getPx(this.round)>0) {
+					return 'transparent'
+				}
+				return this.bgColor
+			},
+			contentStyle() {
+				const style = {};
+				if (this.bgColor) {
+					style.backgroundColor = this.bg
+				}
+				if(this.round) {
+					const value = this.$uv.addUnit(this.round)
+					const mode = this.direction?this.direction:this.mode
+					style.backgroundColor = this.bgColor
+					if(mode === 'top') {
+						style.borderBottomLeftRadius = value
+						style.borderBottomRightRadius = value
+					} else if(mode === 'bottom') {
+						style.borderTopLeftRadius = value
+						style.borderTopRightRadius = value
+					} else if(mode === 'center') {
+						style.borderRadius = value
+					} 
+				}
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
+			}
+		},
+		// #ifndef VUE3
+		// TODO vue2
+		destroyed() {
+			this.setH5Visible()
+		},
+		// #endif
+		// #ifdef VUE3
+		// TODO vue3
+		unmounted() {
+			this.setH5Visible()
+		},
+		// #endif
+		created() {
+			// TODO 处理 message 组件生命周期异常的问题
+			this.messageChild = null
+			// TODO 解决头条冒泡的问题
+			this.clearPropagation = false
+		},
+		methods: {
+			setH5Visible() {
+				// #ifdef H5
+				// fix by mehaotian 处理 h5 滚动穿透的问题
+				document.getElementsByTagName('body')[0].style.overflow = 'visible'
+				// #endif
+			},
+			/**
+			 * 公用方法,不显示遮罩层
+			 */
+			closeMask() {
+				this.maskShow = 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.mode
+				}else {
+					this.direction = direction;
+				}
+				if (!this.config[direction]) {
+					return this.$uv.error(`缺少类型:${direction}`);
+				}
+				this[this.config[direction]]()
+				this.$emit('change', {
+					show: true,
+					type: direction
+				})
+			},
+			close(type) {
+				this.showTrans = false
+				this.$emit('change', {
+					show: false,
+					type: this.mode
+				})
+				clearTimeout(this.timer)
+				// // 自定义关闭事件
+				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.closeOnClickOverlay) return
+				this.close()
+			},
+			/**
+			 * 顶部弹出样式处理
+			 */
+			top(type) {
+				this.popupClass = this.isDesktop ? 'fixforpc-top' : 'top'
+				this.ani = ['slide-top']
+				this.transitionStyle = {
+					position: 'fixed',
+					zIndex: this.zIndex,
+					left: 0,
+					right: 0,
+					backgroundColor: this.bg
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+				this.$nextTick(() => {
+					if (this.messageChild && this.mode === 'message') {
+						this.messageChild.timerClose()
+					}
+				})
+			},
+			/**
+			 * 底部弹出样式处理
+			 */
+			bottom(type) {
+				this.popupClass = 'bottom'
+				this.ani = ['slide-bottom']
+				this.transitionStyle = {
+					position: 'fixed',
+					zIndex: this.zIndex,
+					left: 0,
+					right: 0,
+					bottom: 0,
+					backgroundColor: this.bg
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			/**
+			 * 中间弹出样式处理
+			 */
+			center(type) {
+				this.popupClass = 'center'
+				this.ani = this.zoom?['zoom-in', 'fade']:['fade'];
+				this.transitionStyle = {
+					position: 'fixed',
+					zIndex: this.zIndex,
+					/* #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.popupClass = 'left'
+				this.ani = ['slide-left']
+				this.transitionStyle = {
+					position: 'fixed',
+					zIndex: this.zIndex,
+					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.popupClass = 'right'
+				this.ani = ['slide-right']
+				this.transitionStyle = {
+					position: 'fixed',
+					zIndex: this.zIndex,
+					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" scoped>
+	.uv-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 */
+		}
+
+		.uv-popup__content {
+			/* #ifndef APP-NVUE */
+			display: block;
+			overflow: hidden;
+			/* #endif */
+			position: relative;
+
+			&.left,
+			&.right {
+				/* #ifdef H5 */
+				padding-top: var(--window-top);
+				/* #endif */
+				/* #ifndef H5 */
+				padding-top: 0;
+				/* #endif */
+				flex: 1;
+			}
+			&__close {
+				position: absolute;
+
+				&--hover {
+					opacity: 0.4;
+				}
+			}
+			
+			&__close--top-left {
+				top: 15px;
+				left: 15px;
+			}
+			
+			&__close--top-right {
+				top: 15px;
+				right: 15px;
+			}
+			
+			&__close--bottom-left {
+				bottom: 15px;
+				left: 15px;
+			}
+			
+			&__close--bottom-right {
+				right: 15px;
+				bottom: 15px;
+			}
+		}
+	}
+
+	.fixforpc-z-index {
+		/* #ifndef APP-NVUE */
+		z-index: 999;
+		/* #endif */
+	}
+
+	.fixforpc-top {
+		top: 0;
+	}
+</style>

+ 92 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-popup/package.json

@@ -0,0 +1,92 @@
+{
+  "id": "uv-popup",
+  "displayName": "uv-popup 弹出层 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.7",
+  "description": "uv-popup 弹出层容器,用于展示弹窗、信息提示等内容,支持上、下、左、右和中部弹出。组件只提供容器,内部内容由用户自定义。",
+  "keywords": [
+    "uv-popup",
+    "uvui",
+    "uv-ui",
+    "popup",
+    "弹出层"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools",
+			"uv-overlay",
+			"uv-transition",
+			"uv-icon",
+			"uv-status-bar",
+			"uv-safe-bottom"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 21 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-popup/readme.md

@@ -0,0 +1,21 @@
+## Popup 弹出层
+
+> **组件名:uv-popup**
+
+弹出层容器,用于展示弹窗、信息提示等内容,支持上、下、左、右和中部弹出。组件只提供容器,内部内容由用户自定义。
+
+该组件已经放弃原来`uview2.x`的写法,参照了官方`uni-popup`的写法进行重构。在小程序端的性能大大提升,打开和关闭避免延迟,调用方法与之前相比也有所差异,具体请查看文档。
+
+# <a href="https://www.uvui.cn/components/popup.html" target="_blank">查看文档</a>
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) <small>(请不要 下载插件ZIP)</small>
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=uv-ui" target="_blank">
+
+![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png)
+
+</a>
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 11 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/changelog.md

@@ -0,0 +1,11 @@
+## 1.0.4(2023-09-14)
+1. 飞书小程序支持
+## 1.0.3(2023-08-14)
+1. 修复百度报错的BUG
+## 1.0.2(2023-07-02)
+uv-safe-bottom 修复,在百度程序,抖音小程序不生效的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-safe-bottom 底部安全区组件

+ 67 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.vue

@@ -0,0 +1,67 @@
+<template>
+	<view
+		class="uv-safe-bottom"
+		:style="[style]"
+		:class="[!isNvue && 'uv-safe-area-inset-bottom']"
+	>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	/**
+	 * SafeBottom 底部安全区
+	 * @description 这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
+	 * @tutorial https://www.uvui.cn/components/safeAreaInset.html
+	 * @property {type}		prop_name
+	 * @property {Object}	customStyle	定义需要用到的外部样式
+	 *
+	 * @event {Function()}
+	 * @example <uv-status-bar></uv-status-bar>
+	 */
+	export default {
+		name: "uv-safe-bottom",
+		mixins: [mpMixin, mixin],
+		data() {
+			return {
+				safeAreaBottomHeight: 0,
+				isNvue: false,
+			};
+		},
+		computed: {
+			style() {
+				const style = {};
+				// #ifdef APP-NVUE || MP-TOUTIAO || MP-LARK
+				// nvue下,高度使用js计算填充
+				style.height = this.$uv.addUnit(this.$uv.sys()?.safeAreaInsets?.bottom, 'px');
+				// #endif
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle));
+			},
+		},
+		mounted() {
+			// #ifdef APP-NVUE
+			// 标识为是否nvue
+			this.isNvue = true;
+			// #endif
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	.uv-safe-bottom {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+	}
+	/* #ifndef APP-NVUE */
+	// 历遍生成4个方向的底部安全区
+	@each $d in top, right, bottom, left {
+		.uv-safe-area-inset-#{$d} {
+			padding-#{$d}: 0;
+			padding-#{$d}: constant(safe-area-inset-#{$d});  
+			padding-#{$d}: env(safe-area-inset-#{$d});  
+		}
+	}
+	/* #endif */
+</style>

+ 87 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uv-safe-bottom",
+  "displayName": "uv-safe-bottom 底部安全区  全面兼容小程序、nvue、vue2、vue3等多端",
+  "version": "1.0.4",
+  "description": "这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。",
+  "keywords": [
+    "uv-safe-bottom",
+    "uvui",
+    "uv-ui",
+    "bottom",
+    "底部安全区"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 11 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-safe-bottom/readme.md

@@ -0,0 +1,11 @@
+## SafeBottom 底部安全区 
+
+> **组件名:uv-safe-bottom**
+
+这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
+
+### <a href="https://www.uvui.cn/guide/safeAreaInset.html" target="_blank">查看文档</a>
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 7 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/changelog.md

@@ -0,0 +1,7 @@
+## 1.0.2(2023-06-05)
+1. 兼容渐变背景色
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+1. 新增uv-status-bar组件

+ 8 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/components/uv-status-bar/props.js

@@ -0,0 +1,8 @@
+export default {
+    props: {
+        bgColor: {
+            type: String,
+            default: 'transparent'
+        }
+    }
+}

+ 54 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/components/uv-status-bar/uv-status-bar.vue

@@ -0,0 +1,54 @@
+<template>
+	<view
+	    :style="[style]"
+	    class="uv-status-bar"
+	>
+		<slot />
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+	/**
+	 * StatbusBar 状态栏占位
+	 * @description 本组件主要用于状态填充,比如在自定导航栏的时候,它会自动适配一个恰当的状态栏高度。
+	 * @tutorial https://www.uvui.cn/components/statusBar.html
+	 * @property {String}			bgColor			背景色 (默认 'transparent' )
+	 * @property {String | Object}	customStyle		自定义样式 
+	 * @example <uv-status-bar></uv-status-bar>
+	 */
+	export default {
+		name: 'uv-status-bar',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+			}
+		},
+		computed: {
+			style() {
+				const style = {}
+				// 状态栏高度,由于某些安卓和微信开发工具无法识别css的顶部状态栏变量,所以使用js获取的方式
+				style.height = this.$uv.addUnit(this.$uv.sys().statusBarHeight, 'px')
+				if(this.bgColor){
+					if (this.bgColor.indexOf("gradient") > -1) {// 渐变色
+						style.backgroundImage = this.bgColor;
+					}else{
+						style.background = this.bgColor;
+					}
+				}
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uv-status-bar {
+		// nvue会默认100%,如果nvue下,显式写100%的话,会导致宽度不为100%而异常
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+	}
+</style>

+ 87 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uv-status-bar",
+  "displayName": "uv-status-bar 状态栏占位",
+  "version": "1.0.2",
+  "description": "状态栏占位组件主要用于状态填充,比如在自定导航栏的时候,它会自动适配一个恰当的状态栏高度。",
+  "keywords": [
+    "uv-status-bar",
+    "uvui",
+    "uv-ui",
+    "status-bar",
+    "状态栏"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 10 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-status-bar/readme.md

@@ -0,0 +1,10 @@
+## StatbusBar 状态栏占位
+
+> **组件名:uv-status-bar**
+
+本组件主要用于状态填充,比如在自定导航栏的时候,它会自动适配一个恰当的状态栏高度。
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>
+

+ 19 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-transition/changelog.md

@@ -0,0 +1,19 @@
+## 1.0.8(2023-10-18)
+1. 修复在APP上不能正常显示的BUG
+## 1.0.7(2023-10-12)
+1. 修复部分情况,修改某属性自动关闭的BUG
+## 1.0.6(2023-07-24)
+1. 优化  nvue模式下增加cellChild参数,是否在list中cell节点下,nvue中cell下建议设置成true
+## 1.0.5(2023-07-02)
+修改VUE3模式下可能存在的BUG
+## 1.0.4(2023-07-02)
+uv-transition  动画组件,代码重构优化,性能更加友好,增加自定义动画功能。详情参考文档:https://www.uvui.cn/components/transition.html
+## 1.0.3(2023-06-12)
+1. 恢复this.$nextTick的使用,经过测试百度等平台无问题
+## 1.0.2(2023-05-23)
+1. 百度小程序等平台不支持this.$nextick,修改成延时
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+1. 新增动画组件

+ 131 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-transition/components/uv-transition/createAnimation.js

@@ -0,0 +1,131 @@
+// const defaultOption = {
+// 	duration: 300,
+// 	timingFunction: 'linear',
+// 	delay: 0,
+// 	transformOrigin: '50% 50% 0'
+// }
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+// #endif
+class MPAnimation {
+	constructor(options, _this) {
+		this.options = options
+		// 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+		this.animation = uni.createAnimation({
+			...options
+		})
+		this.currentStepAnimates = {}
+		this.next = 0
+		this.$ = _this
+
+	}
+
+	_nvuePushAnimates(type, args) {
+		let aniObj = this.currentStepAnimates[this.next]
+		let styles = {}
+		if (!aniObj) {
+			styles = {
+				styles: {},
+				config: {}
+			}
+		} else {
+			styles = aniObj
+		}
+		if (animateTypes1.includes(type)) {
+			if (!styles.styles.transform) {
+				styles.styles.transform = ''
+			}
+			let unit = ''
+			if(type === 'rotate'){
+				unit = 'deg'
+			}
+			styles.styles.transform += `${type}(${args+unit}) `
+		} else {
+			styles.styles[type] = `${args}`
+		}
+		this.currentStepAnimates[this.next] = styles
+	}
+	_animateRun(styles = {}, config = {}) {
+		let ref = this.$.$refs['ani'].ref
+		if (!ref) return
+		return new Promise((resolve, reject) => {
+			nvueAnimation.transition(ref, {
+				styles,
+				...config
+			}, res => {
+				resolve()
+			})
+		})
+	}
+
+	_nvueNextAnimate(animates, step = 0, fn) {
+		let obj = animates[step]
+		if (obj) {
+			let {
+				styles,
+				config
+			} = obj
+			this._animateRun(styles, config).then(() => {
+				step += 1
+				this._nvueNextAnimate(animates, step, fn)
+			})
+		} else {
+			this.currentStepAnimates = {}
+			typeof fn === 'function' && fn()
+			this.isEnd = true
+		}
+	}
+
+	step(config = {}) {
+		// #ifndef APP-NVUE
+		this.animation.step(config)
+		// #endif
+		// #ifdef APP-NVUE
+		this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+		this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+		this.next++
+		// #endif
+		return this
+	}
+
+	run(fn) {
+		// #ifndef APP-NVUE
+		this.$.animationData = this.animation.export()
+		this.$.timer = setTimeout(() => {
+			typeof fn === 'function' && fn()
+		}, this.$.durationTime)
+		// #endif
+		// #ifdef APP-NVUE
+		this.isEnd = false
+		let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
+		if(!ref) return
+		this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
+		this.next = 0
+		// #endif
+	}
+}
+
+
+const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+	'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+	'translateZ'
+]
+const animateTypes2 = ['opacity', 'backgroundColor']
+const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+	MPAnimation.prototype[type] = function(...args) {
+		// #ifndef APP-NVUE
+		this.animation[type](...args)
+		// #endif
+		// #ifdef APP-NVUE
+		this._nvuePushAnimates(type, args)
+		// #endif
+		return this
+	}
+})
+
+export function createAnimation(option, _this) {
+	if(!_this) return
+	clearTimeout(_this.timer)
+	return new MPAnimation(option, _this)
+}

+ 31 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-transition/components/uv-transition/props.js

@@ -0,0 +1,31 @@
+export default {
+	props: {
+		// 是否展示组件
+		show: {
+			type: Boolean,
+			default: false
+		},
+		// 使用的动画模式
+		mode: {
+			type: [Array, String, null],
+			default() {
+				return 'fade'
+			}
+		},
+		// 动画的执行时间,单位ms
+		duration: {
+			type: [String, Number],
+			default: 300
+		},
+		// 使用的动画过渡函数
+		timingFunction: {
+			type: String,
+			default: 'ease-out'
+		},
+		customClass: {
+			type: String,
+			default: ''
+		},
+		...uni.$uv?.props?.transition
+	}
+}

+ 320 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-transition/components/uv-transition/uv-transition.vue

@@ -0,0 +1,320 @@
+<template>
+  <!-- #ifndef APP-NVUE -->
+  <view 
+		v-if="isShow" 
+		ref="ani" 
+		:animation="animationData" 
+		:class="customClass" 
+		:style="transformStyles" 
+		@click="onClick">
+		<slot></slot>
+	</view>
+  <!-- #endif -->
+  <!-- #ifdef APP-NVUE -->
+  <view 
+		v-if="isShow" 
+		ref="ani" 
+		:animation="animationData" 
+		:class="customClass" 
+		:style="transformStyles" 
+		@click="onClick">
+		<slot></slot>
+	</view>
+  <!-- #endif -->
+</template>
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import { createAnimation } from './createAnimation'
+	/**
+	* transition  动画组件
+	* @description
+	* @tutorial
+	* @property {Boolean}	show	控制组件显示或关闭 (默认 false )
+	* @property {Array | String	}	mode	内置过渡动画类型 (默认 'fade' )
+	* @value fade 渐隐渐出过渡
+	* @value slide-top 由上至下过渡
+	* @value slide-bottom 由下至上过渡
+	* @value slide-left 由左至右过渡
+	* @value slide-right 由右至左过渡
+	* @value zoom-in 由小到大过渡
+	* @value zoom-out 由大到小过渡
+	* @property {String | Number}	duration	动画的执行时间,单位ms (默认 300 )
+	* @property {String} timingFunction	使用的动画过渡函数 (默认 'ease-out' )
+	* @property {Object} customStyle	自定义样式
+	* @property {String} customClass	自定义类名
+	* @event {Function} click 点击组件触发	
+	* @event {Function} change	过渡动画结束时触发	
+	* @example 
+	*/
+	export default {
+		name: 'uv-transition',
+		mixins: [mpMixin,mixin],
+		emits:['click','change'],
+		props: {
+			// 是否展示组件
+			show: {
+				type: Boolean,
+				default: false
+			},
+			// 使用的动画模式
+			mode: {
+				type: [Array, String, null],
+				default() {
+					return 'fade'
+				}
+			},
+			// 动画的执行时间,单位ms
+			duration: {
+				type: [String, Number],
+				default: 300
+			},
+			// 使用的动画过渡函数
+			timingFunction: {
+				type: String,
+				default: 'ease-out'
+			},
+			customClass: {
+				type: String,
+				default: ''
+			},
+			// nvue模式下 是否直接显示,在uv-list等cell下面使用就需要设置
+			cellChild: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data(){
+			return {
+				isShow: false,
+				transform: '',
+				opacity: 1,
+				animationData: {},
+				durationTime: 300,
+				config: {}
+			}
+		},
+		watch: {
+			show: {
+				handler(newVal) {
+					if (newVal) {
+						this.open();
+					} else {
+						// 避免上来就执行 close,导致动画错乱
+						if (this.isShow) {
+							this.close();
+						}
+					}
+				},
+				immediate: true
+			}
+		},
+		computed: {
+			// 初始化动画条件
+			transformStyles() {
+				const style = {
+					transform: this.transform,
+					opacity: this.opacity,
+					...this.$uv.addStyle(this.customStyle),
+					'transition-duration': `${this.duration / 1000}s`
+				};
+				return this.$uv.addStyle(style,'string');
+			}
+		},
+		created() {
+			// 动画默认配置
+			this.config = {
+				duration: this.duration,
+				timingFunction: this.timingFunction,
+				transformOrigin: '50% 50%',
+				delay: 0
+			};
+			this.durationTime = this.duration;
+		},
+		methods: {
+			/**
+			 *  ref 触发 初始化动画
+			 */
+			init(obj = {}) {
+				if (obj.duration) {
+					this.durationTime = obj.duration;
+				}
+				this.animation = createAnimation(Object.assign(this.config, obj),this);
+			},
+			/**
+			 * 点击组件触发回调
+			 */
+			onClick() {
+				this.$emit('click', {
+					detail: this.isShow
+				})
+			},
+			/**
+			 * ref 触发 动画分组
+			 * @param {Object} obj
+			 */
+			step(obj, config = {}) {
+				if (!this.animation) return;
+				for (let i in obj) {
+					try {
+						if(typeof obj[i] === 'object'){
+							this.animation[i](...obj[i]);
+						}else{
+							this.animation[i](obj[i]);
+						}
+					} catch (e) {
+						console.error(`方法 ${i} 不存在`);
+					}
+				}
+				this.animation.step(config);
+				return this;
+			},
+			/**
+			 *  ref 触发 执行动画
+			 */
+			run(fn) {
+				if (!this.animation) return;
+				this.animation.run(fn);
+			},
+			// 开始过度动画
+			open() {
+				clearTimeout(this.timer);
+				this.transform = '';
+				this.isShow = true;
+				let { opacity, transform } = this.styleInit(false);
+				if (typeof opacity !== 'undefined') {
+					this.opacity = opacity;
+				}
+				this.transform = transform;
+				// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
+				this.$nextTick(() => {
+					// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
+					this.timer = setTimeout(() => {
+						this.animation = createAnimation(this.config, this);
+						this.tranfromInit(false).step();
+						// #ifdef APP-NVUE
+						if(this.cellChild) {
+							this.opacity = 1;
+						} else{
+							this.animation.run();
+						}
+						// #endif
+						// #ifndef APP-NVUE
+						this.animation.run();
+						// #endif
+						// #ifdef VUE3
+						// #ifdef H5
+						this.opacity = 1;
+						// #endif
+						// #endif
+						this.$emit('change', {
+							detail: this.isShow
+						})
+						// #ifdef H5
+						// #ifdef VUE3
+						this.transform = '';
+						// #endif
+						// #endif
+					}, 20);
+				})
+			},
+			// 关闭过渡动画
+			close(type) {
+				if (!this.animation) return;
+				this.tranfromInit(true)
+					.step()
+					.run(() => {
+						this.isShow = false;
+						this.animationData = null;
+						this.animation = null;
+						let { opacity, transform } = this.styleInit(false);
+						this.opacity = opacity || 1;
+						this.transform = transform;
+						this.$emit('change', {
+							detail: this.isShow
+						});
+					})
+			},
+			// 处理动画开始前的默认样式
+			styleInit(type) {
+				let styles = {
+					transform: ''
+				};
+				let buildStyle = (type, mode) => {
+					if (mode === 'fade') {
+						styles.opacity = this.animationType(type)[mode];
+					} else {
+						styles.transform += this.animationType(type)[mode] + ' ';
+					}
+				}
+				if (typeof this.mode === 'string') {
+					buildStyle(type, this.mode);
+				} else {
+					this.mode.forEach(mode => {
+						buildStyle(type, mode)
+					})
+				}
+				return styles
+			},
+			// 处理内置组合动画
+			tranfromInit(type) {
+				let buildTranfrom = (type, mode) => {
+					let aniNum = null;
+					if (mode === 'fade') {
+						aniNum = type ? 0 : 1;
+					} else {
+						aniNum = type ? '-100%' : '0';
+						if (mode === 'zoom-in') {
+							aniNum = type ? 0.8 : 1
+						}
+						if (mode === 'zoom-out') {
+							aniNum = type ? 1.2 : 1
+						}
+						if (mode === 'slide-right') {
+							aniNum = type ? '100%' : '0'
+						}
+						if (mode === 'slide-bottom') {
+							aniNum = type ? '100%' : '0'
+						}
+					}
+					this.animation[this.animationMode()[mode]](aniNum)
+				}
+				if (typeof this.mode === 'string') {
+					buildTranfrom(type, this.mode)
+				} else {
+					this.mode.forEach(mode => {
+						buildTranfrom(type, mode)
+					})
+				}
+				return this.animation;
+			},
+			animationType(type) {
+				return {
+					fade: type ? 1 : 0,
+					'slide-top': `translateY(${type ? '0' : '-100%'})`,
+					'slide-right': `translateX(${type ? '0' : '100%'})`,
+					'slide-bottom': `translateY(${type ? '0' : '100%'})`,
+					'slide-left': `translateX(${type ? '0' : '-100%'})`,
+					'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
+					'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
+				}
+			},
+			// 内置动画类型与实际动画对应字典
+			animationMode() {
+				return {
+					fade: 'opacity',
+					'slide-top': 'translateY',
+					'slide-right': 'translateX',
+					'slide-bottom': 'translateY',
+					'slide-left': 'translateX',
+					'zoom-in': 'scale',
+					'zoom-out': 'scale'
+				}
+			},
+			// 驼峰转中横线
+			toLine(name) {
+				return name.replace(/([A-Z])/g, '-$1').toLowerCase()
+			}
+		}
+	}
+</script>

+ 87 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-transition/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uv-transition",
+  "displayName": "uv-transition 动画 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.8",
+  "description": "transition 该组件用于组件的动画过渡效果。",
+  "keywords": [
+    "uv-transition",
+    "uvui",
+    "uv-ui",
+    "transition",
+    "动画"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 15 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-transition/readme.md

@@ -0,0 +1,15 @@
+## Transition 动画
+
+> **组件名:uv-transition**
+
+该组件用于组件的动画过渡效果,支持自定义动画,开箱即用。
+
+# <a href="https://www.uvui.cn/components/transition.html" target="_blank">查看文档</a>
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png)
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 1 - 1
virgo.wzfrontend/yui_wx/uni_modules/uv-ui-tools/libs/css/components.scss

@@ -10,7 +10,7 @@
 // 所以在非nvue中,需要对元素进行重置为flex-direction: column; 否则可能会表现异常
 $uvui-nvue-style: true !default;
 @if $uvui-nvue-style == true {
-	.uv-swiper, .uv-swiper__wrapper, .uv-swiper__wrapper__item {
+	view, scroll-view, swiper-item {
 		display: flex;
 		flex-direction: column;
 		flex-shrink: 0;

+ 17 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/changelog.md

@@ -0,0 +1,17 @@
+## 1.0.6(2023-12-20)
+1. 修复动态设置deletable为false不生效的BUG
+## 1.0.5(2023-08-31)
+1. 添加uv-popup依赖
+## 1.0.4(2023-08-18)
+1. 修复图片预览位置错误的BUG
+2. 修复视频预览不生效的BUG
+3. 修复改变上传视频宽高不生效的BUG
+## 1.0.3(2023-07-03)
+去除插槽判断,避免某些平台不显示的BUG
+## 1.0.2(2023-05-24)
+1. 优化fileList,watch中增加deep属性
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-upload 上传

+ 52 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-preview-video/uv-preview-video.vue

@@ -0,0 +1,52 @@
+<template>
+	<uv-popup ref="popup" @change="change">
+		<view class="video-view" v-if="show">
+			<video class="video" :src="getSec" :autoplay="autoplay"></video>
+		</view>
+	</uv-popup>
+</template>
+<script>
+	export default {
+		props: {
+			src: {
+				type: String,
+				default: ''
+			},
+			autoplay: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				videoSrc: '',
+				show: false
+			}
+		},
+		computed: {
+			getSec() {
+				return this.src || this.videoSrc;
+			}
+		},
+		methods: {
+			open(url) {
+				this.videoSrc = url;
+				this.$refs.popup.open();
+			},
+			close() {
+				this.$refs.popup.close();
+			},
+			change(e) {
+				this.show = e.show;
+			}
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.video-view {
+		width: 750rpx;
+		.video {
+			width: 750rpx;
+		}
+	}
+</style>

+ 22 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/mixin.js

@@ -0,0 +1,22 @@
+import { error } from '@/uni_modules/uv-ui-tools/libs/function/index.js'
+export default {
+    watch: {
+        // 监听accept的变化,判断是否符合个平台要求
+        // 只有微信小程序才支持选择媒体,文件类型,所以这里做一个判断提示
+        accept: {
+            immediate: true,
+            handler(val) {
+                // #ifndef MP-WEIXIN
+                if (val === 'all' || val === 'media') {
+                    error('只有微信小程序才支持把accept配置为all、media之一')
+                }
+                // #endif
+                // #ifndef H5 || MP-WEIXIN
+                if (val === 'file') {
+                    error('只有微信小程序和H5(HX2.9.9)才支持把accept配置为file')
+                }
+                // #endif
+            }
+        }
+    }
+}

+ 130 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/props.js

@@ -0,0 +1,130 @@
+export default {
+	props: {
+		// 接受的文件类型, 可选值为all media image file video
+		accept: {
+			type: String,
+			default: 'image'
+		},
+		// 	图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头
+		capture: {
+			type: [String, Array],
+			default: () => ['album', 'camera']
+		},
+		// 当accept为video时生效,是否压缩视频,默认为true
+		compressed: {
+			type: Boolean,
+			default: true
+		},
+		// 当accept为video时生效,可选值为back或front
+		camera: {
+			type: String,
+			default: 'back'
+		},
+		// 当accept为video时生效,拍摄视频最长拍摄时间,单位秒
+		maxDuration: {
+			type: Number,
+			default: 60
+		},
+		// 上传区域的图标,只能内置图标
+		uploadIcon: {
+			type: String,
+			default: 'camera-fill'
+		},
+		// 上传区域的图标的颜色,默认
+		uploadIconColor: {
+			type: String,
+			default: '#D3D4D6'
+		},
+		// 是否开启文件读取前事件
+		useBeforeRead: {
+			type: Boolean,
+			default: false
+		},
+		// 读取后的处理函数
+		afterRead: {
+			type: Function,
+			default: null
+		},
+		// 读取前的处理函数
+		beforeRead: {
+			type: Function,
+			default: null
+		},
+		// 是否开启图片预览功能
+		previewFullImage: {
+			type: Boolean,
+			default: true
+		},
+		// 是否开启视频预览功能
+		previewFullVideo: {
+			type: Boolean,
+			default: true
+		},
+		// 最大上传数量
+		maxCount: {
+			type: [String, Number],
+			default: 52
+		},
+		// 是否禁用
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 预览上传的图片时的裁剪模式,和image组件mode属性一致
+		imageMode: {
+			type: String,
+			default: 'aspectFill'
+		},
+		// 标识符,可以在回调函数的第二项参数中获取
+		name: {
+			type: String,
+			default: ''
+		},
+		// 所选的图片的尺寸, 可选值为original compressed
+		sizeType: {
+			type: Array,
+			default: () => ['original', 'compressed']
+		},
+		// 是否开启图片多选,部分安卓机型不支持
+		multiple: {
+			type: Boolean,
+			default: false
+		},
+		// 是否展示删除按钮
+		deletable: {
+			type: Boolean,
+			default: true
+		},
+		// 文件大小限制,单位为byte
+		maxSize: {
+			type: [String, Number],
+			default: Number.MAX_VALUE
+		},
+		// 显示已上传的文件列表
+		fileList: {
+			type: Array,
+			default: () => []
+		},
+		// 上传区域的提示文字
+		uploadText: {
+			type: String,
+			default: ''
+		},
+		// 内部预览图片区域和选择图片按钮的区域宽度
+		width: {
+			type: [String, Number],
+			default: 80
+		},
+		// 内部预览图片区域和选择图片按钮的区域高度
+		height: {
+			type: [String, Number],
+			default: 80
+		},
+		// 是否在上传完成后展示预览图
+		previewImage: {
+			type: Boolean,
+			default: true
+		},
+		...uni.$uv?.props?.upload
+	}
+}

+ 151 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/utils.js

@@ -0,0 +1,151 @@
+function pickExclude(obj, keys) {
+	// 某些情况下,type可能会为
+    if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) {
+        return {}
+    }
+    return Object.keys(obj).reduce((prev, key) => {
+        if (!keys.includes(key)) {
+            prev[key] = obj[key]
+        }
+        return prev
+    }, {})
+}
+
+function formatImage(res) {
+    return res.tempFiles.map((item) => ({
+        ...pickExclude(item, ['path']),
+        type: 'image',
+        url: item.path,
+        thumb: item.path,
+		size: item.size,
+		// #ifdef H5
+		name: item.name
+		// #endif
+    }))
+}
+
+function formatVideo(res) {
+    return [
+        {
+            ...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']),
+            type: 'video',
+            url: res.tempFilePath,
+            thumb: res.thumbTempFilePath,
+			size: res.size,
+			// #ifdef H5
+			name: res.name
+			// #endif
+        }
+    ]
+}
+
+function formatMedia(res) {
+    return res.tempFiles.map((item) => ({
+        ...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']),
+        type: res.type,
+        url: item.tempFilePath,
+        thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath,
+		size: item.size
+    }))
+}
+
+function formatFile(res) {
+    return res.tempFiles.map((item) => ({ 
+		...pickExclude(item, ['path']), 
+		url: item.path, 
+		size:item.size,
+		// #ifdef H5
+		name: item.name,
+		type: item.type
+		// #endif 
+	}))
+}
+export function chooseFile({
+    accept,
+    multiple,
+    capture,
+    compressed,
+    maxDuration,
+    sizeType,
+    camera,
+    maxCount
+}) {
+    return new Promise((resolve, reject) => {
+        switch (accept) {
+        case 'image':
+            uni.chooseImage({
+                count: multiple ? Math.min(maxCount, 9) : 1,
+                sourceType: capture,
+                sizeType,
+                success: (res) => resolve(formatImage(res)),
+                fail: reject
+            })
+            break
+            // #ifdef MP-WEIXIN
+            // 只有微信小程序才支持chooseMedia接口
+        case 'media':
+            wx.chooseMedia({
+                count: multiple ? Math.min(maxCount, 9) : 1,
+                sourceType: capture,
+                maxDuration,
+                sizeType,
+                camera,
+                success: (res) => resolve(formatMedia(res)),
+                fail: reject
+            })
+            break
+            // #endif
+        case 'video':
+            uni.chooseVideo({
+                sourceType: capture,
+                compressed,
+                maxDuration,
+                camera,
+                success: (res) => resolve(formatVideo(res)),
+                fail: reject
+            })
+            break
+            // #ifdef MP-WEIXIN || H5
+            // 只有微信小程序才支持chooseMessageFile接口
+        case 'file':
+            // #ifdef MP-WEIXIN
+            wx.chooseMessageFile({
+                count: multiple ? maxCount : 1,
+                type: accept,
+                success: (res) => resolve(formatFile(res)),
+                fail: reject
+            })
+            // #endif
+            // #ifdef H5
+            // 需要hx2.9.9以上才支持uni.chooseFile
+            uni.chooseFile({
+                count: multiple ? maxCount : 1,
+                type: accept,
+                success: (res) => resolve(formatFile(res)),
+                fail: reject
+            })
+            // #endif
+            break
+				// #endif
+		default: 
+			// 此为保底选项,在accept不为上面任意一项的时候选取全部文件
+			// #ifdef MP-WEIXIN
+			wx.chooseMessageFile({
+			    count: multiple ? maxCount : 1,
+			    type: 'all',
+			    success: (res) => resolve(formatFile(res)),
+			    fail: reject
+			})
+			// #endif
+			// #ifdef H5
+			// 需要hx2.9.9以上才支持uni.chooseFile
+			uni.chooseFile({
+				count: multiple ? maxCount : 1,
+				type: 'all',
+				success: (res) => resolve(formatFile(res)),
+				fail: reject
+			})
+			// #endif
+        }
+    })
+}

File diff suppressed because it is too large
+ 488 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/components/uv-upload/uv-upload.vue


+ 90 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/package.json

@@ -0,0 +1,90 @@
+{
+  "id": "uv-upload",
+  "displayName": "uv-upload 上传  全面兼容小程序、nvue、vue2、vue3等多端",
+  "version": "1.0.6",
+  "description": "该组件用于上传图片等文件场景。",
+  "keywords": [
+    "uv-upload",
+    "uvui",
+    "uv-ui",
+    "upload",
+    "上传"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools",
+			"uv-icon",
+			"uv-loading-icon",
+			"uv-popup"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"微信浏览器(Android)": "y",
+					"QQ浏览器(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"小程序": {
+					"微信": "y",
+					"阿里": "y",
+					"百度": "y",
+					"字节跳动": "y",
+					"QQ": "y",
+					"钉钉": "u",
+					"快手": "u",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 11 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-upload/readme.md

@@ -0,0 +1,11 @@
+## Upload 上传
+
+> **组件名:uv-upload**
+
+该组件用于上传图片等文件场景。
+
+### <a href="https://www.uvui.cn/components/upload.html" target="_blank">查看文档</a>
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/components/common/process.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/components/common/upload.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/clientDetail/clientDetail.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/fans/fans.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/message/message.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/myHouse/myHouse.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/order.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/orderDetail/orderDetail.js.map


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/projectList/projectList.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-section/components/uni-section/uni-section.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-overlay/components/uv-overlay/uv-overlay.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-popup/components/uv-popup/uv-popup.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-status-bar/components/uv-status-bar/uv-status-bar.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-transition/components/uv-transition/uv-transition.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-upload/components/uv-preview-video/uv-preview-video.js.map


File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-upload/components/uv-upload/uv-upload.js.map


+ 3 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/app.json

@@ -1,5 +1,6 @@
 {
   "pages": [
+    "pages/orderDetail/orderDetail",
     "pages/highseas/highseas",
     "pages/index/index",
     "pages/my/my",
@@ -23,7 +24,8 @@
     "pages/client/client",
     "pages/organization/organization",
     "pages/search/search",
-    "pages/projectList/projectList"
+    "pages/projectList/projectList",
+    "pages/order/order"
   ],
   "subPackages": [],
   "window": {

+ 87 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/main.wxss

@@ -329,6 +329,93 @@ button[type=primary] {
 .hui-tag.error {
   background-color: #ff4d4f;
 }
+.detail {
+  padding: 30rpx;
+}
+.detail .detail-box {
+  background-color: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.08);
+  padding: 30rpx;
+  position: relative;
+  margin-bottom: 30rpx;
+}
+.detail .detail-box.file-box {
+  padding-bottom: 20rpx;
+}
+.detail .sub-title {
+  display: flex;
+  align-items: center;
+  margin-left: -8rpx;
+}
+.detail .sub-title .sub-label {
+  font-size: 32rpx;
+  font-weight: 600;
+  margin-left: 14rpx;
+}
+.detail .title-box {
+  padding-left: 90rpx;
+  position: relative;
+}
+.detail .title-box .title-icon {
+  width: 70rpx;
+  height: 70rpx;
+  text-align: center;
+  line-height: 70rpx;
+  background: #08979c;
+  border-radius: 70rpx;
+  position: absolute;
+  left: 0;
+  top: 50%;
+  margin-top: -35rpx;
+}
+.detail .title-box .title {
+  font-size: 32rpx;
+  font-weight: 600;
+  margin-bottom: 8rpx;
+}
+.detail .title-box .date {
+  font-size: 24rpx;
+  color: #8c8c8c;
+}
+.detail .other {
+  margin-top: 20rpx;
+}
+.detail .other .item {
+  margin-top: 16rpx;
+}
+.detail .other .label {
+  color: #8c8c8c;
+  font-size: 24rpx;
+}
+.detail .other .value {
+  margin-top: 10rpx;
+  font-weight: 400;
+}
+.detail .state {
+  margin-top: 20rpx;
+  display: flex;
+  justify-content: space-between;
+}
+.detail .state .create {
+  height: 48rpx;
+  border-radius: 48rpx;
+  border: 1px solid #08979c;
+  display: flex;
+  align-items: center;
+  color: #08979c;
+  padding: 0 10rpx;
+}
+.detail .state .create .name {
+  font-size: 24rpx;
+  flex: 1;
+  max-width: 150rpx;
+  min-width: 70rpx;
+  overflow: hidden;
+  margin-left: 10rpx;
+  line-height: 36rpx;
+  padding-right: 10rpx;
+}
 page {
   color: #1f1f1f;
   font-size: 28rpx;

File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/runtime.js


File diff suppressed because it is too large
+ 5 - 5
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/vendor.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/Winglau14-lotusCalendar/Winglau14-lotusCalendar.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/city-select/city-select.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/navbar.js


File diff suppressed because it is too large
+ 11 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.js


+ 7 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.json

@@ -0,0 +1,7 @@
+{
+  "usingComponents": {
+    "uni-icons": "/uni_modules/uni-icons/components/uni-icons/uni-icons",
+    "upload": "/components/common/upload"
+  },
+  "component": true
+}

File diff suppressed because it is too large
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.wxml


+ 95 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/process.wxss

@@ -0,0 +1,95 @@
+@charset "UTF-8";
+/* 需要放到文件最上面 */
+/* 水平间距 */
+/* 水平间距 */
+/*
+ 以下变量是默认值,如不需要修改可以不用给下面的变量重新赋值
+ */
+/* 水平间距 */
+.process-list {
+  padding-top: 20rpx;
+}
+.process-list .process-item {
+  position: relative;
+  display: flex;
+}
+.process-list .process-item .user-avatar-box {
+  position: relative;
+}
+.process-list .process-item .user-avatar-box .user-avatar {
+  width: 64rpx;
+  height: 64rpx;
+  background: #08979c;
+  border-radius: 50%;
+  margin-right: 20rpx;
+  margin-top: 16rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  overprocess: hidden;
+  color: #fff;
+}
+.process-list .process-item .user-avatar-box .user-avatar-status {
+  width: 28rpx;
+  height: 28rpx;
+  border-radius: 50%;
+  border: 2rpx solid #fff;
+  position: absolute;
+  top: 60rpx;
+  right: 20rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.process-list .process-item .user-avatar-box .user-avatar-status.success {
+  background: #389e0d;
+}
+.process-list .process-item .user-avatar-box .user-avatar-status.failed {
+  background: #ff4d4f;
+}
+.process-list .process-item .user-avatar-box .user-avatar-status.waiting {
+  background: #fa8c16;
+}
+.process-list .process-item .user-avatar-box .user-avatar-status.info {
+  background: #8f939c;
+}
+.process-list .process-item .process-content {
+  flex: 1;
+  width: 0;
+}
+.process-list .process-item .process-content .user-name {
+  height: 96rpx;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+.process-list .process-item .process-content .user-name .name {
+  font-size: 32rpx;
+  font-weight: 600;
+}
+.process-list .process-item .process-content .user-name .date {
+  font-size: 24rpx;
+  color: #8c8c8c;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.process-list .process-item .process-content .user-content {
+  background-color: #f5f5f5;
+  border-radius: 16rpx;
+  padding: 20rpx 20rpx 10rpx 20rpx;
+}
+.process-list .process-item .process-content .user-content .remark {
+  line-height: 17px;
+  font-weight: 400;
+  padding-bottom: 10rpx;
+}
+.process-list .process-item .user-line {
+  width: 1px;
+  border-left: 1px solid #B9B9B9;
+  position: absolute;
+  top: 80rpx;
+  bottom: -16rpx;
+  left: 30rpx;
+}
+

File diff suppressed because it is too large
+ 11 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/upload.js


+ 6 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/upload.json

@@ -0,0 +1,6 @@
+{
+  "usingComponents": {
+    "uv-upload": "/uni_modules/uv-upload/components/uv-upload/uv-upload"
+  },
+  "component": true
+}

+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/common/upload.wxml

@@ -0,0 +1 @@
+<view class="upload-index"><uv-upload vue-id="00863568-1" fileList="{{fileList}}" name="1" multiple="{{true}}" maxCount="{{type==='insert'?5:$root.g0}}" deletable="{{type==='insert'}}" data-event-opts="{{[['^afterRead',[['afterRead']]],['^delete',[['deletePic']]]]}}" bind:afterRead="__e" bind:delete="__e" bind:__l="__l"></uv-upload></view>

File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/house/houseItem.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/house/houseItems.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/login/imageCode.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/pinapp-empty-page/pinapp-empty-page.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/uni-mall-head/uni-mall-head.js


File diff suppressed because it is too large
+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/components/uni-mall-list/uni-mall-list.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/attention/attention.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/chat/chat.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/city/city.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/client/client.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/clientDetail/clientDetail.js


+ 0 - 92
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/clientDetail/clientDetail.wxss

@@ -1,92 +0,0 @@
-@charset "UTF-8";
-/* 需要放到文件最上面 */
-/* 水平间距 */
-/* 水平间距 */
-/*
- 以下变量是默认值,如不需要修改可以不用给下面的变量重新赋值
- */
-/* 水平间距 */
-.detail {
-  padding: 30rpx;
-}
-.detail .detail-box {
-  background-color: #ffffff;
-  border-radius: 16rpx;
-  box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.08);
-  padding: 30rpx;
-  position: relative;
-  margin-bottom: 30rpx;
-}
-.detail .sub-title {
-  display: flex;
-  align-items: center;
-  margin-left: -8rpx;
-}
-.detail .sub-title .sub-label {
-  font-size: 32rpx;
-  font-weight: 600;
-  margin-left: 14rpx;
-}
-.detail .title-box {
-  padding-left: 90rpx;
-  position: relative;
-}
-.detail .title-box .title-icon {
-  width: 70rpx;
-  height: 70rpx;
-  text-align: center;
-  line-height: 70rpx;
-  background: #08979c;
-  border-radius: 70rpx;
-  position: absolute;
-  left: 0;
-  top: 50%;
-  margin-top: -35rpx;
-}
-.detail .title-box .title {
-  font-size: 32rpx;
-  font-weight: 600;
-}
-.detail .title-box .date {
-  font-size: 24rpx;
-  color: #8c8c8c;
-}
-.detail .other {
-  margin-top: 20rpx;
-}
-.detail .other .item {
-  margin-top: 10rpx;
-}
-.detail .other .label {
-  color: #8c8c8c;
-  font-size: 24rpx;
-}
-.detail .other .value {
-  margin-top: 6rpx;
-  font-weight: 400;
-}
-.detail .state {
-  margin-top: 20rpx;
-  display: flex;
-  justify-content: space-between;
-}
-.detail .state .create {
-  height: 48rpx;
-  border-radius: 48rpx;
-  border: 1px solid #08979c;
-  display: flex;
-  align-items: center;
-  color: #08979c;
-  padding: 0 10rpx;
-}
-.detail .state .create .name {
-  font-size: 24rpx;
-  flex: 1;
-  max-width: 150rpx;
-  min-width: 70rpx;
-  overflow: hidden;
-  margin-left: 10rpx;
-  line-height: 36rpx;
-  padding-right: 10rpx;
-}
-

File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/collect/collect.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/data/data.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/fans/fans.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/highseas/highseas.js


File diff suppressed because it is too large
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/house/house.js


+ 0 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/index/index.js


Some files were not shown because too many files changed in this diff