whx 9 ماه پیش
والد
کامیت
52b61e6234
44فایلهای تغییر یافته به همراه1438 افزوده شده و 188 حذف شده
  1. 6 3
      virgo.wzfrontend/yui_wx/pages/bill/bill.vue
  2. 47 9
      virgo.wzfrontend/yui_wx/pages/billDetail/billDetail.vue
  3. 151 22
      virgo.wzfrontend/yui_wx/pages/billInvoice/billInvoice.vue
  4. 33 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-picker/changelog.md
  5. 95 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-picker/components/uv-picker/props.js
  6. 330 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-picker/components/uv-picker/uv-picker.vue
  7. 90 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-picker/package.json
  8. 21 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-picker/readme.md
  9. 2 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/changelog.md
  10. 40 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/components/uv-toolbar/props.js
  11. 109 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.vue
  12. 87 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/package.json
  13. 31 0
      virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/readme.md
  14. 5 5
      virgo.wzfrontend/yui_wx/uni_modules/uv-ui-tools/libs/css/color.scss
  15. 113 114
      virgo.wzfrontend/yui_wx/uni_modules/uv-ui-tools/libs/function/test.js
  16. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  17. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  18. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/bill/bill.js.map
  19. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/billDetail/billDetail.js.map
  20. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/billInvoice/billInvoice.js.map
  21. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.js.map
  22. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.js.map
  23. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/runtime.js
  24. 4 4
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/vendor.js
  25. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/bill/bill.js
  26. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/bill/bill.wxml
  27. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billDetail/billDetail.js
  28. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billDetail/billDetail.wxml
  29. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.js
  30. 9 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.json
  31. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.wxml
  32. 13 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.wxss
  33. 10 10
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-badge/components/uv-badge/uv-badge.wxss
  34. 5 5
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-icon/components/uv-icon/uv-icon.wxss
  35. 11 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.js
  36. 8 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.json
  37. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.wxml
  38. 94 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.wxss
  39. 1 1
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-tabs/components/uv-tabs/uv-tabs.wxss
  40. 11 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.js
  41. 4 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.json
  42. 1 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.wxml
  43. 90 0
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.wxss
  44. 2 2
      virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-upload/components/uv-upload/uv-upload.wxss

+ 6 - 3
virgo.wzfrontend/yui_wx/pages/bill/bill.vue

@@ -25,8 +25,9 @@
 							<div class="status-tag warning" v-else-if="item.status === 1">付款中</div>
 							<div class="status-tag success" v-else-if="item.status === 2">已付款</div>
 						</view>
-						<view class="tag" v-else>
-							<div class="status-tag warning" v-if="item.status === 1">付款中</div>
+						<view class="tag" v-else>
+							<div class="status-tag info" v-if="!item.status">待发送</div>
+							<div class="status-tag warning" v-else-if="item.status === 1">付款中</div>
 							<div class="status-tag success" v-else-if="item.status === 2">已付款</div>
 							<div class="status-tag info" v-else-if="item.status === 3">待付款</div>
 						</view>
@@ -103,7 +104,6 @@
 					pageSize: 10,
 					projectId: this.$store.getters.project.id
 				}
-				console.log(this.$store.getters.identity);
 				if (this.$store.getters.identity.id === 3 || this.$store.getters.identity.id === 6) {
 					postData['organizationId'] = this.$store.getters.organization.id;
 					this.getBillList(postData);
@@ -171,6 +171,9 @@
 						this.mescroll.endErr();
 					})
 				} else {
+					if (this.$store.getters.identity.id === 1 || this.$store.getters.identity.id === 4) {
+						postData['statusList'] = [1, 2, 3];
+					}
 					getCommonPaymentListByPage(postData).then(res => {
 						if (res.code === 200) {
 							this.mescroll.endBySize(res.data.dataList.length, res.data.totalCount);

+ 47 - 9
virgo.wzfrontend/yui_wx/pages/billDetail/billDetail.vue

@@ -28,10 +28,16 @@
 				</view>
 				<view class="state">
 					<view></view>
-					<view class="tag">
-						<view class="status-tag info" v-if="!detail.status">待付款</view>
-						<view class="status-tag warning" v-else-if="detail.status === 1">付款中</view>
-						<view class="status-tag success" v-else-if="detail.status === 2">已付款</view>
+					<view class="tag" v-if="type == 1">
+						<div class="status-tag info" v-if="!detail.status">待付款</div>
+						<div class="status-tag warning" v-else-if="detail.status === 1">付款中</div>
+						<div class="status-tag success" v-else-if="detail.status === 2">已付款</div>
+					</view>
+					<view class="tag" v-else>
+						<div class="status-tag info" v-if="!detail.status">待发送</div>
+						<div class="status-tag warning" v-else-if="detail.status === 1">付款中</div>
+						<div class="status-tag success" v-else-if="detail.status === 2">已付款</div>
+						<div class="status-tag info" v-else-if="detail.status === 3">待付款</div>
 					</view>
 				</view>
 			</view>
@@ -85,8 +91,7 @@
 			</view>
 		</view>
 		<view class="hui-button-box" v-if="operationBtn.length>0">
-			<view class="hui-button" v-for="(item,index) in operationBtn" :key="index"
-				@click="$navigateTo(item.type+'?billId='+billId+'&type='+type)">
+			<view class="hui-button" v-for="(item,index) in operationBtn" :key="index" @click="operation(item)">
 				{{item.name}}
 			</view>
 		</view>
@@ -96,7 +101,8 @@
 <script>
 	import {
 		getPaymentDetailById,
-		getCommonPaymentDetailById
+		getCommonPaymentDetailById,
+		updatePayment
 	} from '@/request/api/bill.js'
 	import upload from '@/components/common/upload.vue'
 	export default {
@@ -119,17 +125,41 @@
 		methods: {
 			init() {
 				if (!this.billId) return;
+				this.operationBtn = [];
 				if (this.type == 1) {
 					getPaymentDetailById(this.billId).then(this.billSuccess);
 				} else {
 					getCommonPaymentDetailById(this.billId).then(this.billSuccess);
 				}
 			},
+			operation(item) {
+				if (item.id == 3) {
+					uni.showModal({
+						title: '有极提示',
+						content: '是否将账单发送给客户?',
+						success: res => {
+							if (res.confirm) {
+								updatePayment({
+									id: this.billId,
+									status: 3
+								}).then(res => {
+									if (res.code === 200) {
+										this.init();
+										this.$toast('操作成功');
+									}
+								})
+							}
+						}
+					});
+				} else {
+					this.$navigateTo(item.type + '?billId=' + this.billId + '&type=' + this.type);
+				}
+			},
 			billSuccess(res) {
 				if (res.code === 200) {
 					this.detail = res.data;
-					if (!this.detail.status && (this.$store.getters.identity.id === 1 || this.$store.getters.identity
-							.id === 4)) {
+					if ((!this.detail.status || this.detail.status == 3) && (this.$store.getters.identity.id === 1 || this
+							.$store.getters.identity.id === 4)) {
 						this.operationBtn.push({
 							id: 1,
 							name: '账单付款',
@@ -143,6 +173,14 @@
 							type: '/pages/billInvoice/billInvoice'
 						})
 					}
+					if (this.type == 2 && !this.detail.status && this.detail.organizationId === this.$store.getters
+						.organization.id) {
+						this.operationBtn.push({
+							id: 3,
+							name: '发送账单给客户',
+							type: '/pages/billInvoice/billInvoice'
+						})
+					}
 				}
 			}
 		},

+ 151 - 22
virgo.wzfrontend/yui_wx/pages/billInvoice/billInvoice.vue

@@ -1,22 +1,151 @@
-<template>
-	<view>
-		
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				
-			}
-		},
-		methods: {
-			
-		}
-	}
-</script>
-
-<style>
-
-</style>
+<template>
+	<view class="form-box file-form-box bill-invoice">
+		<uni-forms label-position="top" :modelValue="formData">
+			<uni-forms-item label="发票名称" name="name">
+				<uni-easyinput type="text" v-model="formData.name" placeholder="请输入发票名称" />
+			</uni-forms-item>
+			<uni-forms-item label="发票类型" name="invoiceType">
+				<view class="select-box" @click="openPicker">
+					<text class="select-text" v-if="formData.invoiceType">{{invoice.name}}</text>
+					<text class="select-label" v-else>请选择发票类型</text>
+					<uni-icons class="form-icon" type="down" size="12" color="#8c8c8c"></uni-icons>
+				</view>
+			</uni-forms-item>
+			<uni-forms-item label="发票代码" name="code">
+				<uni-easyinput type="text" v-model="formData.code" placeholder="请输入发票代码" />
+			</uni-forms-item>
+			<uni-forms-item label="发票号码" name="name">
+				<uni-easyinput type="text" v-model="formData.number" placeholder="请输入发票号码" />
+			</uni-forms-item>
+			<uni-forms-item label="货物名称" name="cargoName">
+				<uni-easyinput type="text" v-model="formData.cargoName" placeholder="请输入货物名称" />
+			</uni-forms-item>
+			<uni-forms-item label="开票日期" name="date">
+				<view class="select-box" @click="openDate">
+					<text class="select-text" v-if="formData.date">{{formData.date}}</text>
+					<text class="select-label" v-else>请选择日期</text>
+					<uni-icons class="form-icon" type="down" size="12" color="#8c8c8c"></uni-icons>
+				</view>
+			</uni-forms-item>
+			<uni-forms-item label="发票附件">
+				<upload ref="upload" accept="all" type="insert"></upload>
+			</uni-forms-item>
+		</uni-forms>
+		<lotusCalendar :calendarData="calendarData" @returnDate="calendarChange" @closeCalendar="closeCalendar">
+		</lotusCalendar>
+		<uv-picker ref="picker" :columns="columns" @confirm="confirm" keyName="name" :key="columns.length"></uv-picker>
+		<view class="hui-button-box">
+			<view class="hui-button" @click="submit">保存</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import upload from '@/components/common/upload.vue'
+	import lotusCalendar from "@/components/Winglau14-lotusCalendar/Winglau14-lotusCalendar.vue";
+	import {
+		insertPaymentInvoice,
+		putPaymentStatus
+	} from '@/request/api/contract.js'
+	import {
+		updatePayment
+	} from '@/request/api/bill.js'
+	export default {
+		data() {
+			return {
+				formData: {
+					name: '',
+					code: '',
+					number: '',
+					cargoName: '',
+					paymentId: '',
+					paymentOrdinaryId: '',
+					date: '',
+					invoiceType: ''
+				},
+				type: '',
+				billId: '',
+				columns: [],
+				calendarData: {
+					isShow: false,
+					choseTime: ''
+				},
+				invoice: {}
+			}
+		},
+		onShow() {
+			this.columns = [this.$field.field.invoiceType];
+		},
+		onLoad(body) {
+			this.type = body.type;
+			this.billId = body.billId;
+			let type = this.type == '1' ? 'paymentId' : 'paymentOrdinaryId';
+			this.formData[type] = body.billId;
+			this.formData['organizationId'] = this.$store.getters.organization.id;
+			if (this.type == '1') {
+				this.formData['cargoName'] = '房租';
+				this.formData['type'] = 1;
+			} else {
+				this.formData['type'] = 2;
+			}
+		},
+		methods: {
+			openPicker() {
+				this.$refs.picker.open();
+			},
+			confirm(item) {
+				let invoice = item.value[0];
+				this.formData.invoiceType = invoice.id;
+				this.invoice = invoice;
+			},
+			openDate() {
+				this.calendarData.isShow = true;
+			},
+			calendarChange(res) {
+				if (res.time) {
+					this.formData.date = res.time;
+				}
+				this.calendarData.isShow = res.isShow;
+			},
+			closeCalendar(res) {
+				this.calendarData.isShow = res.isShow;
+			},
+			submit() {
+				if (!this.formData.name) return this.$toast('请输入发票名称');
+				if (!this.formData.invoiceType) return this.$toast('请选择发票类型');
+				let attachment = this.$refs.upload.getFile();
+				if (attachment.length === 0) return this.$toast('请上传发票附件');
+				let postData = JSON.parse(JSON.stringify(this.formData));
+				postData['attachment'] = JSON.stringify(attachment);
+				insertPaymentInvoice(postData).then(res => {
+					if (res.code === 200) {
+						if (this.type === '1') {
+							putPaymentStatus(this.billId, 2);
+						} else {
+							updatePayment({
+								id: this.billId,
+								status: 2
+							})
+						}
+						this.$toast('操作成功');
+						uni.$emit('reloadBill');
+						setTimeout(() => {
+							this.$navigateBack();
+						}, 400)
+					}
+				})
+			}
+		},
+		components: {
+			upload,
+			lotusCalendar
+		},
+	}
+</script>
+
+<style lang="scss">
+	.bill-invoice {
+		padding: 30rpx;
+		padding-bottom: 130rpx;
+	}
+</style>

+ 33 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-picker/changelog.md

@@ -0,0 +1,33 @@
+## 1.0.14(2023-12-29)
+1. 修复上个版本引出的BUG
+## 1.0.13(2023-12-26)
+1. 修复抖音小程序滚到底不触发change的BUG
+## 1.0.12(2023-11-20)
+1. 修复issues反馈的问题uv-picker在组合式API的自定义组件中,columns动态赋值无法显示选项:https://gitee.com/climblee/uv-ui/issues/I8H0GQ
+## 1.0.11(2023-10-11)
+1. 将immediate-change默认值改为true,该值在于change回调的及时性,微信小程序生效
+## 1.0.10(2023-08-25)
+1. 增加round属性设置弹窗圆角,默认为0
+## 1.0.9(2023-08-24)
+1. 修复cli项目不返回值的问题
+## 1.0.8(2023-08-04)
+1. 优化
+## 1.0.7(2023-08-02)
+1. 改组件中删除uv-toolbar组件,请单独下载uv-toolbar组件
+## 1.0.6(2023-07-02)
+uv-picker  由于弹出层uv-popup的修改,打开和关闭方法更改,详情参考文档:https://www.uvui.cn/components/picker.html
+## 1.0.5(2023-06-26)
+1. 增加color参数
+2. 增加activeColor参数
+## 1.0.4(2023-06-15)
+1. 修改支付宝报错的BUG
+## 1.0.3(2023-06-12)
+1. setColumnValues的使用统一化,避免某些平台报错
+2. 取消change回调回传的组件实例,直接统一通过ref的方式调取setColumnValues方法
+## 1.0.2(2023-05-23)
+1. uv-toolbar组件新增下边框属性 
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-picker 选择器

+ 95 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-picker/components/uv-picker/props.js

@@ -0,0 +1,95 @@
+export default {
+	props: {
+		// 是否展示顶部的操作栏
+		showToolbar: {
+			type: Boolean,
+			default: true
+		},
+		// 顶部标题
+		title: {
+			type: String,
+			default: ''
+		},
+		// 弹窗圆角
+		round: {
+			type: [String, Number],
+			default: 0
+		},
+		// 对象数组,设置每一列的数据
+		columns: {
+			type: Array,
+			default: () => []
+		},
+		// 是否显示加载中状态
+		loading: {
+			type: Boolean,
+			default: false
+		},
+		// 各列中,单个选项的高度
+		itemHeight: {
+			type: [String, Number],
+			default: 44
+		},
+		// 取消按钮的文字
+		cancelText: {
+			type: String,
+			default: '取消'
+		},
+		// 确认按钮的文字
+		confirmText: {
+			type: String,
+			default: '确定'
+		},
+		// 取消按钮的颜色
+		cancelColor: {
+			type: String,
+			default: '#909193'
+		},
+		// 确认按钮的颜色
+		confirmColor: {
+			type: String,
+			default: '#3c9cff'
+		},
+		// 文字颜色
+		color: {
+			type: String,
+			default: ''
+		},
+		// 选中文字的颜色
+		activeColor: {
+			type: String,
+			default: ''
+		},
+		// 每列中可见选项的数量
+		visibleItemCount: {
+			type: [String, Number],
+			default: 5
+		},
+		// 选项对象中,需要展示的属性键名
+		keyName: {
+			type: String,
+			default: 'text'
+		},
+		// 是否允许点击遮罩关闭选择器
+		closeOnClickOverlay: {
+			type: Boolean,
+			default: true
+		},
+		// 是否允许点击确认关闭选择器
+		closeOnClickConfirm: {
+			type: Boolean,
+			default: true
+		},
+		// 各列的默认索引
+		defaultIndex: {
+			type: Array,
+			default: () => [],
+		},
+		// 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件,只在微信2.21.1及以上有效
+		immediateChange: {
+			type: Boolean,
+			default: true
+		},
+		...uni.$uv?.props?.picker
+	}
+}

+ 330 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-picker/components/uv-picker/uv-picker.vue

@@ -0,0 +1,330 @@
+<template>
+	<uv-popup
+		ref="pickerPopup"
+		mode="bottom"
+		:round="round"
+		:close-on-click-overlay="closeOnClickOverlay"
+		@change="popupChange"
+	>
+		<view class="uv-picker">
+			<uv-toolbar
+				v-if="showToolbar"
+				:cancelColor="cancelColor"
+				:confirmColor="confirmColor"
+				:cancelText="cancelText"
+				:confirmText="confirmText"
+				:title="title"
+				@cancel="cancel"
+				@confirm="confirm"
+			></uv-toolbar>
+			<!-- #ifdef MP-TOUTIAO -->
+			<picker-view
+				class="uv-picker__view"
+				:indicatorStyle="`height: ${$uv.addUnit(itemHeight)}`"
+				:value="innerIndex"
+				:immediateChange="immediateChange"
+				:style="{
+					height: `${$uv.addUnit(visibleItemCount * itemHeight)}`
+				}"
+				@pickend="changeHandler"
+			>
+			<!-- #endif -->
+			<!-- #ifndef MP-TOUTIAO -->
+			<picker-view
+				class="uv-picker__view"
+				:indicatorStyle="`height: ${$uv.addUnit(itemHeight)}`"
+				:value="innerIndex"
+				:immediateChange="immediateChange"
+				:style="{
+					height: `${$uv.addUnit(visibleItemCount * itemHeight)}`
+				}"
+				@change="changeHandler"
+			>
+			<!-- #endif -->
+			<!-- @pickend在这里为了解决抖音等滚到底不触发change兼容性问题 -->
+				<picker-view-column
+					v-for="(item, index) in innerColumns"
+					:key="index"
+					class="uv-picker__view__column"
+				>
+					<text
+						v-if="$uv.test.array(item)"
+						class="uv-picker__view__column__item uv-line-1"
+						v-for="(item1, index1) in item"
+						:key="index1"
+						:style="[{
+								height: $uv.addUnit(itemHeight),
+								lineHeight: $uv.addUnit(itemHeight),
+								fontWeight: index1 === innerIndex[index] ? 'bold' : 'normal'
+							},textStyle(index,index1)]"
+					>{{ getItemText(item1) }}</text>
+				</picker-view-column>
+			</picker-view>
+			<view
+				v-if="loading"
+				class="uv-picker--loading"
+			>
+				<uv-loading-icon mode="circle"></uv-loading-icon>
+			</view>
+		</view>
+	</uv-popup>
+</template>
+
+<script>
+/**
+ * uv-picker
+ * @description 选择器
+ * @property {Boolean}			showToolbar			是否显示顶部的操作栏(默认 true )
+ * @property {String}			title				顶部标题
+ * @property {Array}			columns				对象数组,设置每一列的数据
+ * @property {Boolean}			loading				是否显示加载中状态(默认 false )
+ * @property {String | Number}	itemHeight			各列中,单个选项的高度(默认 44 )
+ * @property {String}			cancelText			取消按钮的文字(默认 '取消' )
+ * @property {String}			confirmText			确认按钮的文字(默认 '确定' )
+ * @property {String}			cancelColor			取消按钮的颜色(默认 '#909193' )
+ * @property {String}			confirmColor		确认按钮的颜色(默认 '#3c9cff' )
+ * @property {String}			color		文字颜色(默认 '' )
+ * @property {String}			activeColor		选中文字的颜色(默认 '' )
+ * @property {String | Number}	visibleItemCount	每列中可见选项的数量(默认 5 )
+ * @property {String}			keyName				选项对象中,需要展示的属性键名(默认 'text' )
+ * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩关闭选择器(默认 false )
+ * @property {Array}			defaultIndex		各列的默认索引
+ * @property {Boolean}			immediateChange		是否在手指松开时立即触发change事件(默认 false )
+ * @event {Function} close		关闭选择器时触发
+ * @event {Function} cancel		点击取消按钮触发
+ * @event {Function} change		当选择值变化时触发
+ * @event {Function} confirm	点击确定按钮,返回当前选择的值
+ */
+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';
+export default {
+	name: 'uv-picker',
+	emits: ['confirm','cancel','close','change'],
+	mixins: [mpMixin, mixin, props],
+	computed: {
+		// 为了解决支付宝不生效
+		textStyle(){
+			return (index,index1) => {
+				const style = {};
+				// #ifndef APP-NVUE 
+				style.display = 'block';
+				// #endif
+				if(this.color) {
+					style.color = this.color;
+				}
+				if(this.activeColor && index1 === this.innerIndex[index]) {
+					style.color = this.activeColor;
+				}
+				return style;
+			}
+		}
+	},
+	data() {
+		return {
+			// 上一次选择的列索引
+			lastIndex: [],
+			// 索引值 ,对应picker-view的value
+			innerIndex: [],
+			// 各列的值
+			innerColumns: [],
+			// 上一次的变化列索引
+			columnIndex: 0,
+		}
+	},
+	watch: {
+		// 监听默认索引的变化,重新设置对应的值
+		defaultIndex: {
+			immediate: true,
+			handler(n) {
+				this.setIndexs(n, true)
+			}
+		},
+		// 监听columns参数的变化
+		columns: {
+			deep: true,
+			immediate: true,
+			handler(n) {
+				this.setColumns(n)
+			}
+		},
+	},
+	methods: {
+		open() {
+			this.$refs.pickerPopup.open();
+		},
+		close() {
+			this.$refs.pickerPopup.close();
+		},
+		popupChange(e) {
+			if(!e.show) this.$emit('close');
+		},
+		// 获取item需要显示的文字,判别为对象还是文本
+		getItemText(item) {
+			if (this.$uv.test.object(item)) {
+				return item[this.keyName]
+			} else {
+				return item
+			}
+		},
+		// 点击工具栏的取消按钮
+		cancel() {
+			this.$emit('cancel');
+			this.close();
+		},
+		// 点击工具栏的确定按钮
+		confirm() {
+			// 在这里使用deepClone拷贝后,vue3会自动转换成原始对象,这样处理是因为cli项目可能出现不返回值的情况
+			this.$emit('confirm', this.$uv.deepClone({
+				indexs: this.innerIndex,
+				value: this.innerColumns.map((item, index) => item[this.innerIndex[index]]),
+				values: this.innerColumns
+			}));
+			if(this.closeOnClickConfirm) {
+				this.close();
+			}
+		},
+		// 选择器某一列的数据发生变化时触发
+		changeHandler(e) {
+			const {
+				value
+			} = e.detail
+			let index = 0,
+				columnIndex = 0
+			// 通过对比前后两次的列索引,得出当前变化的是哪一列
+			for (let i = 0; i < value.length; i++) {
+				let item = value[i]
+				if (item !== (this.lastIndex[i] || 0)) { // 把undefined转为合法假值0
+					// 设置columnIndex为当前变化列的索引
+					columnIndex = i
+					// index则为变化列中的变化项的索引
+					index = item
+					break // 终止循环,即使少一次循环,也是性能的提升
+				}
+			}
+			this.columnIndex = columnIndex
+			const values = this.innerColumns
+			// 将当前的各项变化索引,设置为"上一次"的索引变化值
+			this.setLastIndex(value)
+			this.setIndexs(value)
+
+			this.$emit('change', {
+				value: this.innerColumns.map((item, index) => item[value[index]]),
+				index,
+				indexs: value,
+				// values为当前变化列的数组内容
+				values,
+				columnIndex
+			})
+		},
+		// 设置index索引,此方法可被外部调用设置
+		setIndexs(index, setLastIndex) {
+			this.innerIndex = this.$uv.deepClone(index)
+			if (setLastIndex) {
+				this.setLastIndex(index)
+			}
+		},
+		// 记录上一次的各列索引位置
+		setLastIndex(index) {
+			// 当能进入此方法,意味着当前设置的各列默认索引,即为“上一次”的选中值,需要记录,是因为changeHandler中
+			// 需要拿前后的变化值进行对比,得出当前发生改变的是哪一列
+			this.lastIndex = this.$uv.deepClone(index)
+		},
+		// 设置对应列选项的所有值
+		setColumnValues(columnIndex, values) {
+			// 替换innerColumns数组中columnIndex索引的值为values,使用的是数组的splice方法
+			this.innerColumns.splice(columnIndex, 1, values)
+			// 拷贝一份原有的innerIndex做临时变量,将大于当前变化列的所有的列的默认索引设置为0
+			let tmpIndex = this.$uv.deepClone(this.innerIndex)
+			for (let i = 0; i < this.innerColumns.length; i++) {
+				if (i > this.columnIndex) {
+					tmpIndex[i] = 0
+				}
+			}
+			// 一次性赋值,不能单个修改,否则无效
+			this.setIndexs(tmpIndex)
+		},
+		// 获取对应列的所有选项
+		getColumnValues(columnIndex) {
+			// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
+			// 索引如果在外部change的回调中调用getColumnValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
+			(async () => {
+				await this.$uv.sleep()
+			})()
+			return this.innerColumns[columnIndex]
+		},
+		// 设置整体各列的columns的值
+		setColumns(columns) {
+			this.innerColumns = this.$uv.deepClone(columns)
+			// 如果在设置各列数据时,没有被设置默认的各列索引defaultIndex,那么用0去填充它,数组长度为列的数量
+			if (this.innerIndex.length === 0) {
+				this.innerIndex = new Array(columns.length).fill(0)
+			}
+		},
+		// 获取各列选中值对应的索引
+		getIndexs() {
+			return this.innerIndex
+		},
+		// 获取各列选中的值
+		getValues() {
+			// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
+			// 索引如果在外部change的回调中调用getValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
+			(async () => {
+				await this.$uv.sleep()
+			})()
+			return this.innerColumns.map((item, index) => item[this.innerIndex[index]])
+		}
+	},
+}
+</script>
+
+<style lang="scss" scoped>
+	$show-lines: 1;
+	@import '@/uni_modules/uv-ui-tools/libs/css/variable.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss';
+	.uv-picker {
+		position: relative;
+
+		&__view {
+
+			&__column {
+				@include flex;
+				flex: 1;
+				justify-content: center;
+
+				&__item {
+					@include flex;
+					justify-content: center;
+					align-items: center;
+					font-size: 16px;
+					text-align: center;
+					/* #ifndef APP-NVUE */
+					display: block;
+					/* #endif */
+					color: $uv-main-color;
+
+					&--disabled {
+						/* #ifndef APP-NVUE */
+						cursor: not-allowed;
+						/* #endif */
+						opacity: 0.35;
+					}
+				}
+			}
+		}
+
+		&--loading {
+			position: absolute;
+			top: 0;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			@include flex;
+			justify-content: center;
+			align-items: center;
+			background-color: rgba(255, 255, 255, 0.87);
+			z-index: 1000;
+		}
+	}
+</style>

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

@@ -0,0 +1,90 @@
+{
+  "id": "uv-picker",
+  "displayName": "uv-picker 选择器 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.14",
+  "description": "uv-picker 此选择器用于单列,多列,多列联动的选择场景...",
+  "keywords": [
+    "uv-picker",
+    "uvui",
+    "uv-ui",
+    "picker",
+    "联动选择"
+],
+  "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-popup",
+			"uv-loading-icon",
+			"uv-toolbar"
+		],
+    "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-picker/readme.md

@@ -0,0 +1,21 @@
+## Picker 选择器
+
+> **组件名:uv-picker**
+
+此选择器用于单列,多列,多列联动的选择场景。
+
+`uv-datetime-picker`等组件也用到了该组件,功能完善,需要特别注意的是`columns`参数的形式是数组嵌套。
+
+# <a href="https://www.uvui.cn/components/picker.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>

+ 2 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/changelog.md

@@ -0,0 +1,2 @@
+## 1.0.0(2023-08-02)
+1. 新增工具条组件

+ 40 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/components/uv-toolbar/props.js

@@ -0,0 +1,40 @@
+export default {
+	props: {
+		// 是否展示工具条
+		show: {
+			type: Boolean,
+			default: true
+		},
+		// 是否显示下边框
+		showBorder: {
+			type: Boolean,
+			default: false
+		},
+		// 取消按钮的文字
+		cancelText: {
+			type: String,
+			default: '取消'
+		},
+		// 确认按钮的文字
+		confirmText: {
+			type: String,
+			default: '确认'
+		},
+		// 取消按钮的颜色
+		cancelColor: {
+			type: String,
+			default: '#909193'
+		},
+		// 确认按钮的颜色
+		confirmColor: {
+			type: String,
+			default: '#3c9cff'
+		},
+		// 标题文字
+		title: {
+			type: String,
+			default: ''
+		},
+		...uni.$uv?.props?.toolbar
+	}
+}

+ 109 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.vue

@@ -0,0 +1,109 @@
+<template>
+	<view
+		:class="['uv-toolbar',{'uv-border-bottom':showBorder}]"
+		@touchmove.stop.prevent="noop"
+		v-if="show"
+	>
+		<view
+			class="uv-toolbar__cancel__wrapper"
+			hover-class="uv-hover-class"
+		>
+			<text
+				class="uv-toolbar__wrapper__cancel"
+				@tap="cancel"
+				:style="{
+					color: cancelColor
+				}"
+			>{{ cancelText }}</text>
+		</view>
+		<text
+			class="uv-toolbar__title uv-line-1"
+			v-if="title"
+		>{{ title }}</text>
+		<view
+			class="uv-toolbar__confirm__wrapper"
+			hover-class="uv-hover-class"
+		>
+			<text
+				class="uv-toolbar__wrapper__confirm"
+				@tap="confirm"
+				:style="{
+				color: confirmColor
+			}"
+			>{{ confirmText }}</text>
+		</view>
+	</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';
+	/**
+	 * Toolbar 工具条
+	 * @description 
+	 * @tutorial https://www.uvui.cn/components/toolbar.html
+	 * @property {Boolean}	show			是否展示工具条(默认 true )
+	 * @property {Boolean}	showBorder			是否展示工具条下方边框(默认 false )
+	 * @property {String}	cancelText		取消按钮的文字(默认 '取消' )
+	 * @property {String}	confirmText		确认按钮的文字(默认 '确认' )
+	 * @property {String}	cancelColor		取消按钮的颜色(默认 '#909193' )
+	 * @property {String}	confirmColor	确认按钮的颜色(默认 '#3c9cff' )
+	 * @property {String}	title	标题文字
+	 * @event {Function} 
+	 * @example 
+	 */
+	export default {
+		name: 'uv-toolbar',
+		emits: ['confirm', 'cancel'],
+		mixins: [mpMixin, mixin, props],
+		methods: {
+			// 点击取消按钮
+			cancel() {
+				this.$emit('cancel')
+			},
+			// 点击确定按钮
+			confirm() {
+				this.$emit('confirm')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	$show-lines: 1;
+	$show-hover: 1;
+	$show-border: 1;
+	$show-border-bottom: 1;
+	@import '@/uni_modules/uv-ui-tools/libs/css/variable.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	$uv-tips-color: #909193 !default;
+	$uv-main-color: #303133 !default;
+	$uv-primary: #3c9cff !default;
+	.uv-toolbar {
+		height: 42px;
+		@include flex;
+		justify-content: space-between;
+		align-items: center;
+		&__wrapper {
+			&__cancel {
+				color: $uv-tips-color;
+				font-size: 15px;
+				padding: 0 15px;
+			}
+		}
+		&__title {
+			color: $uv-main-color;
+			padding: 0 60rpx;
+			font-size: 16px;
+			flex: 1;
+			text-align: center;
+		}
+		&__wrapper {
+			&__confirm {
+				color: $uv-primary;
+				font-size: 15px;
+				padding: 0 15px;
+			}
+		}
+	}
+</style>

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

@@ -0,0 +1,87 @@
+{
+  "id": "uv-toolbar",
+  "displayName": "uv-toolbar 工具条",
+  "version": "1.0.0",
+  "description": "该组价是仅用于uv-ui中一个公共小工具,提供一个取消和确定的样式,可以设置标题,主要用于弹窗顶部的选择确定工具条",
+  "keywords": [
+    "uv-toolbar",
+    "uvui",
+    "uv-ui",
+    "工具条",
+    "工具"
+],
+  "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"
+				}
+			}
+		}
+  }
+}

+ 31 - 0
virgo.wzfrontend/yui_wx/uni_modules/uv-toolbar/readme.md

@@ -0,0 +1,31 @@
+## Toolbar 工具条
+
+> **组件名:uv-toolbar**
+
+该组价是仅用于uv-ui中一个公共小工具,提供一个取消和确定的样式,可以设置标题,主要用于弹窗顶部的选择确定工具条。
+
+### 基本使用
+
+```vue
+<uv-toolbar title="标题文字"></uv-toolbar>
+```
+
+### Toolbar Props
+
+| 属性名 | 类型 | 默认值 | 说明 |
+|:-|:-|:-|:-|
+| show | Boolean | true | 是否展示工具条 |
+| showBorder | Boolean | false | 是否显示下边框 |
+| cancelText | String | '取消' | 取消按钮的文字 |
+| confirmText | String | '确定' | 确定按钮的文字 |
+| cancelColor | String | '#909193' | 取消按钮的颜色 |
+| confirmColor | String | '#3c9cff' | 确认按钮的颜色 |
+| title | String | - | 标题文字 |
+
+## [下载完整示例项目](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>

+ 5 - 5
virgo.wzfrontend/yui_wx/uni_modules/uv-ui-tools/libs/css/color.scss

@@ -6,27 +6,27 @@ $uv-border-color: #dadbde !default;
 $uv-bg-color: #f3f4f6 !default;
 $uv-disabled-color: #c8c9cc !default;
 
-$uv-primary: #08979c !default;
+$uv-primary: #3c9cff !default;
 $uv-primary-dark: #398ade !default;
 $uv-primary-disabled: #9acafc !default;
 $uv-primary-light: #ecf5ff !default;
 
-$uv-warning: #fa8c16 !default;
+$uv-warning: #f9ae3d !default;
 $uv-warning-dark: #f1a532 !default;
 $uv-warning-disabled: #f9d39b !default;
 $uv-warning-light: #fdf6ec !default;
 
-$uv-success: #389e0d !default;
+$uv-success: #5ac725 !default;
 $uv-success-dark: #53c21d !default;
 $uv-success-disabled: #a9e08f !default;
 $uv-success-light: #f5fff0;
 
-$uv-error: #ff4d4f !default;
+$uv-error: #f56c6c !default;
 $uv-error-dark: #e45656 !default;
 $uv-error-disabled: #f7b2b2 !default;
 $uv-error-light: #fef0f0 !default;
 
-$uv-info: #8f939c !default;
+$uv-info: #909399 !default;
 $uv-info-dark: #767a82 !default;
 $uv-info-disabled: #c4c6c9 !default;
 $uv-info-light: #f4f4f5 !default;

+ 113 - 114
virgo.wzfrontend/yui_wx/uni_modules/uv-ui-tools/libs/function/test.js

@@ -2,215 +2,214 @@
  * 验证电子邮箱格式
  */
 function email(value) {
-	return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
+    return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
 }
 
 /**
  * 验证手机格式
  */
 function mobile(value) {
-	return /^1([3589]\d|4[5-9]|6[1-2,4-7]|7[0-8])\d{8}$/.test(value)
+    return /^1([3589]\d|4[5-9]|6[1-2,4-7]|7[0-8])\d{8}$/.test(value)
 }
 
 /**
  * 验证URL格式
  */
 function url(value) {
-	return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
-		.test(value)
+    return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
+        .test(value)
 }
 
 /**
  * 验证日期格式
  */
 function date(value) {
-	if (!value) return false
-	// 判断是否数值或者字符串数值(意味着为时间戳),转为数值,否则new Date无法识别字符串时间戳
-	if (number(value)) value = +value
-	return !/Invalid|NaN/.test(new Date(value).toString())
+    if (!value) return false
+    // 判断是否数值或者字符串数值(意味着为时间戳),转为数值,否则new Date无法识别字符串时间戳
+    if (number(value)) value = +value
+    return !/Invalid|NaN/.test(new Date(value).toString())
 }
 
 /**
  * 验证ISO类型的日期格式
  */
 function dateISO(value) {
-	return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
+    return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
 }
 
 /**
  * 验证十进制数字
  */
 function number(value) {
-	return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
+    return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
 }
 
 /**
  * 验证字符串
  */
 function string(value) {
-	return typeof value === 'string'
+    return typeof value === 'string'
 }
 
 /**
  * 验证整数
  */
 function digits(value) {
-	return /^\d+$/.test(value)
+    return /^\d+$/.test(value)
 }
 
 /**
  * 验证身份证号码
  */
 function idCard(value) {
-	return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
-		value
-	)
+    return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+        value
+    )
 }
 
 /**
  * 是否车牌号
  */
 function carNo(value) {
-	// 新能源车牌
-	const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
-	// 旧车牌
-	const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
-	if (value.length === 7) {
-		return creg.test(value)
-	}
-	if (value.length === 8) {
-		return xreg.test(value)
-	}
-	return false
+    // 新能源车牌
+    const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
+    // 旧车牌
+    const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
+    if (value.length === 7) {
+        return creg.test(value)
+    } if (value.length === 8) {
+        return xreg.test(value)
+    }
+    return false
 }
 
 /**
  * 金额,只允许2位小数
  */
 function amount(value) {
-	// 金额,只允许保留两位小数
-	return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
+    // 金额,只允许保留两位小数
+    return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
 }
 
 /**
  * 中文
  */
 function chinese(value) {
-	const reg = /^[\u4e00-\u9fa5]+$/gi
-	return reg.test(value)
+    const reg = /^[\u4e00-\u9fa5]+$/gi
+    return reg.test(value)
 }
 
 /**
  * 只能输入字母
  */
 function letter(value) {
-	return /^[a-zA-Z]*$/.test(value)
+    return /^[a-zA-Z]*$/.test(value)
 }
 
 /**
  * 只能是字母或者数字
  */
 function enOrNum(value) {
-	// 英文或者数字
-	const reg = /^[0-9a-zA-Z]*$/g
-	return reg.test(value)
+    // 英文或者数字
+    const reg = /^[0-9a-zA-Z]*$/g
+    return reg.test(value)
 }
 
 /**
  * 验证是否包含某个值
  */
 function contains(value, param) {
-	return value.indexOf(param) >= 0
+    return value.indexOf(param) >= 0
 }
 
 /**
  * 验证一个值范围[min, max]
  */
 function range(value, param) {
-	return value >= param[0] && value <= param[1]
+    return value >= param[0] && value <= param[1]
 }
 
 /**
  * 验证一个长度范围[min, max]
  */
 function rangeLength(value, param) {
-	return value.length >= param[0] && value.length <= param[1]
+    return value.length >= param[0] && value.length <= param[1]
 }
 
 /**
  * 是否固定电话
  */
 function landline(value) {
-	const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
-	return reg.test(value)
+    const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
+    return reg.test(value)
 }
 
 /**
  * 判断是否为空
  */
 function empty(value) {
-	switch (typeof value) {
-		case 'undefined':
-			return true
-		case 'string':
-			if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
-			break
-		case 'boolean':
-			if (!value) return true
-			break
-		case 'number':
-			if (value === 0 || isNaN(value)) return true
-			break
-		case 'object':
-			if (value === null || value.length === 0) return true
-			for (const i in value) {
-				return false
-			}
-			return true
-	}
-	return false
+    switch (typeof value) {
+    case 'undefined':
+        return true
+    case 'string':
+        if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
+        break
+    case 'boolean':
+        if (!value) return true
+        break
+    case 'number':
+        if (value === 0 || isNaN(value)) return true
+        break
+    case 'object':
+        if (value === null || value.length === 0) return true
+        for (const i in value) {
+            return false
+        }
+        return true
+    }
+    return false
 }
 
 /**
  * 是否json字符串
  */
 function jsonString(value) {
-	if (typeof value === 'string') {
-		try {
-			const obj = JSON.parse(value)
-			if (typeof obj === 'object' && obj) {
-				return true
-			}
-			return false
-		} catch (e) {
-			return false
-		}
-	}
-	return false
+    if (typeof value === 'string') {
+        try {
+            const obj = JSON.parse(value)
+            if (typeof obj === 'object' && obj) {
+                return true
+            }
+            return false
+        } catch (e) {
+            return false
+        }
+    }
+    return false
 }
 
 /**
  * 是否数组
  */
 function array(value) {
-	if (typeof Array.isArray === 'function') {
-		return Array.isArray(value)
-	}
-	return Object.prototype.toString.call(value) === '[object Array]'
+    if (typeof Array.isArray === 'function') {
+        return Array.isArray(value)
+    }
+    return Object.prototype.toString.call(value) === '[object Array]'
 }
 
 /**
  * 是否对象
  */
 function object(value) {
-	return Object.prototype.toString.call(value) === '[object Object]'
+    return Object.prototype.toString.call(value) === '[object Object]'
 }
 
 /**
  * 是否短信验证码
  */
 function code(value, len = 6) {
-	return new RegExp(`^\\d{${len}}$`).test(value)
+    return new RegExp(`^\\d{${len}}$`).test(value)
 }
 
 /**
@@ -218,7 +217,7 @@ function code(value, len = 6) {
  * @param {Object} value
  */
 function func(value) {
-	return typeof value === 'function'
+    return typeof value === 'function'
 }
 
 /**
@@ -226,16 +225,16 @@ function func(value) {
  * @param {Object} value
  */
 function promise(value) {
-	return object(value) && func(value.then) && func(value.catch)
+    return object(value) && func(value.then) && func(value.catch)
 }
 
 /** 是否图片格式
  * @param {Object} value
  */
 function image(value) {
-	const newValue = value.split('?')[0]
-	const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
-	return IMAGE_REGEXP.test(newValue)
+    const newValue = value.split('?')[0]
+    const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
+    return IMAGE_REGEXP.test(newValue)
 }
 
 /**
@@ -243,8 +242,8 @@ function image(value) {
  * @param {Object} value
  */
 function video(value) {
-	const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
-	return VIDEO_REGEXP.test(value)
+    const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
+    return VIDEO_REGEXP.test(value)
 }
 
 /**
@@ -253,36 +252,36 @@ function video(value) {
  * @return {Boolean}
  */
 function regExp(o) {
-	return o && Object.prototype.toString.call(o) === '[object RegExp]'
+    return o && Object.prototype.toString.call(o) === '[object RegExp]'
 }
 
 export {
-	email,
-	mobile,
-	url,
-	date,
-	dateISO,
-	number,
-	digits,
-	idCard,
-	carNo,
-	amount,
-	chinese,
-	letter,
-	enOrNum,
-	contains,
-	range,
-	rangeLength,
-	empty,
-	jsonString,
-	landline,
-	object,
-	array,
-	code,
-	func,
-	promise,
-	video,
-	image,
-	regExp,
-	string
-}
+    email,
+    mobile,
+    url,
+    date,
+    dateISO,
+    number,
+    digits,
+    idCard,
+    carNo,
+    amount,
+    chinese,
+    letter,
+    enOrNum,
+    contains,
+    range,
+    rangeLength,
+    empty,
+    jsonString,
+    landline,
+    object,
+    array,
+    code,
+    func,
+    promise,
+    video,
+    image,
+    regExp,
+    string
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/bill/bill.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/billDetail/billDetail.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/pages/billInvoice/billInvoice.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/runtime.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 4 - 4
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/common/vendor.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/bill/bill.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/bill/bill.wxml


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billDetail/billDetail.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billDetail/billDetail.wxml


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.js


+ 9 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.json

@@ -1,4 +1,12 @@
 {
   "navigationBarTitleText": "账单发票",
-  "usingComponents": {}
+  "usingComponents": {
+    "uni-forms": "/uni_modules/uni-forms/components/uni-forms/uni-forms",
+    "uni-forms-item": "/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item",
+    "uni-easyinput": "/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput",
+    "uni-icons": "/uni_modules/uni-icons/components/uni-icons/uni-icons",
+    "uv-picker": "/uni_modules/uv-picker/components/uv-picker/uv-picker",
+    "upload": "/components/common/upload",
+    "lotus-calendar": "/components/Winglau14-lotusCalendar/Winglau14-lotusCalendar"
+  }
 }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.wxml


+ 13 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/pages/billInvoice/billInvoice.wxss

@@ -0,0 +1,13 @@
+@charset "UTF-8";
+/* 需要放到文件最上面 */
+/* 水平间距 */
+/* 水平间距 */
+/*
+ 以下变量是默认值,如不需要修改可以不用给下面的变量重新赋值
+ */
+/* 水平间距 */
+.bill-invoice {
+  padding: 30rpx;
+  padding-bottom: 130rpx;
+}
+

+ 10 - 10
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-badge/components/uv-badge/uv-badge.wxss

@@ -41,33 +41,33 @@ view.data-v-7be88939, scroll-view.data-v-7be88939, swiper-item.data-v-7be88939 {
   border-bottom-left-radius: 0;
 }
 .uv-badge--primary.data-v-7be88939 {
-  background-color: #08979c;
+  background-color: #3c9cff;
 }
 .uv-badge--primary--inverted.data-v-7be88939 {
-  color: #08979c;
+  color: #3c9cff;
 }
 .uv-badge--error.data-v-7be88939 {
-  background-color: #ff4d4f;
+  background-color: #f56c6c;
 }
 .uv-badge--error--inverted.data-v-7be88939 {
-  color: #ff4d4f;
+  color: #f56c6c;
 }
 .uv-badge--success.data-v-7be88939 {
-  background-color: #389e0d;
+  background-color: #5ac725;
 }
 .uv-badge--success--inverted.data-v-7be88939 {
-  color: #389e0d;
+  color: #5ac725;
 }
 .uv-badge--info.data-v-7be88939 {
-  background-color: #8f939c;
+  background-color: #909399;
 }
 .uv-badge--info--inverted.data-v-7be88939 {
-  color: #8f939c;
+  color: #909399;
 }
 .uv-badge--warning.data-v-7be88939 {
-  background-color: #fa8c16;
+  background-color: #f9ae3d;
 }
 .uv-badge--warning--inverted.data-v-7be88939 {
-  color: #fa8c16;
+  color: #f9ae3d;
 }
 

+ 5 - 5
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-icon/components/uv-icon/uv-icon.wxss

@@ -47,19 +47,19 @@ view.data-v-646dc59e, scroll-view.data-v-646dc59e, swiper-item.data-v-646dc59e {
   align-items: center;
 }
 .uv-icon__icon--primary.data-v-646dc59e {
-  color: #08979c;
+  color: #3c9cff;
 }
 .uv-icon__icon--success.data-v-646dc59e {
-  color: #389e0d;
+  color: #5ac725;
 }
 .uv-icon__icon--error.data-v-646dc59e {
-  color: #ff4d4f;
+  color: #f56c6c;
 }
 .uv-icon__icon--warning.data-v-646dc59e {
-  color: #fa8c16;
+  color: #f9ae3d;
 }
 .uv-icon__icon--info.data-v-646dc59e {
-  color: #8f939c;
+  color: #909399;
 }
 .uv-icon__img.data-v-646dc59e {
   height: auto;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 11 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.js


+ 8 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.json

@@ -0,0 +1,8 @@
+{
+  "usingComponents": {
+    "uv-popup": "/uni_modules/uv-popup/components/uv-popup/uv-popup",
+    "uv-toolbar": "/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar",
+    "uv-loading-icon": "/uni_modules/uv-loading-icon/components/uv-loading-icon/uv-loading-icon"
+  },
+  "component": true
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.wxml


+ 94 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-picker/components/uv-picker/uv-picker.wxss

@@ -0,0 +1,94 @@
+@charset "UTF-8";
+/* 需要放到文件最上面 */
+/* 水平间距 */
+/* 水平间距 */
+/*
+ 以下变量是默认值,如不需要修改可以不用给下面的变量重新赋值
+ */
+/* 水平间距 */
+.uv-line-1.data-v-0ce1e1b4 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-2.data-v-0ce1e1b4 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-3.data-v-0ce1e1b4 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-4.data-v-0ce1e1b4 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-5.data-v-0ce1e1b4 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 5;
+  -webkit-box-orient: vertical !important;
+}
+view.data-v-0ce1e1b4, scroll-view.data-v-0ce1e1b4, swiper-item.data-v-0ce1e1b4 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.uv-picker.data-v-0ce1e1b4 {
+  position: relative;
+}
+.uv-picker__view__column.data-v-0ce1e1b4 {
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  justify-content: center;
+}
+.uv-picker__view__column__item.data-v-0ce1e1b4 {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+  font-size: 16px;
+  text-align: center;
+  display: block;
+  color: #303133;
+}
+.uv-picker__view__column__item--disabled.data-v-0ce1e1b4 {
+  cursor: not-allowed;
+  opacity: 0.35;
+}
+.uv-picker--loading.data-v-0ce1e1b4 {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+  background-color: rgba(255, 255, 255, 0.87);
+  z-index: 1000;
+}
+

+ 1 - 1
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-tabs/components/uv-tabs/uv-tabs.wxss

@@ -53,7 +53,7 @@ view.data-v-28a80996, scroll-view.data-v-28a80996, swiper-item.data-v-28a80996 {
 }
 .uv-tabs__wrapper__nav__line.data-v-28a80996 {
   height: 3px;
-  background: #08979c;
+  background: #3c9cff;
   width: 30px;
   position: absolute;
   bottom: 2px;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 11 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.js


+ 4 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.json

@@ -0,0 +1,4 @@
+{
+  "usingComponents": {},
+  "component": true
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.wxml


+ 90 - 0
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-toolbar/components/uv-toolbar/uv-toolbar.wxss

@@ -0,0 +1,90 @@
+@charset "UTF-8";
+/* 需要放到文件最上面 */
+/* 水平间距 */
+/* 水平间距 */
+/*
+ 以下变量是默认值,如不需要修改可以不用给下面的变量重新赋值
+ */
+/* 水平间距 */
+.uv-line-1.data-v-58504ea1 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-2.data-v-58504ea1 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-3.data-v-58504ea1 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-4.data-v-58504ea1 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical !important;
+}
+.uv-line-5.data-v-58504ea1 {
+  display: -webkit-box !important;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-line-clamp: 5;
+  -webkit-box-orient: vertical !important;
+}
+.uv-border-bottom.data-v-58504ea1 {
+  border-bottom-width: 0.5px !important;
+  border-color: #dadbde !important;
+  border-bottom-style: solid;
+}
+.uv-hover-class.data-v-58504ea1 {
+  opacity: 0.7;
+}
+view.data-v-58504ea1, scroll-view.data-v-58504ea1, swiper-item.data-v-58504ea1 {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+  flex-grow: 0;
+  flex-basis: auto;
+  align-items: stretch;
+  align-content: flex-start;
+}
+.uv-toolbar.data-v-58504ea1 {
+  height: 42px;
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+}
+.uv-toolbar__wrapper__cancel.data-v-58504ea1 {
+  color: #909193;
+  font-size: 15px;
+  padding: 0 15px;
+}
+.uv-toolbar__title.data-v-58504ea1 {
+  color: #303133;
+  padding: 0 60rpx;
+  font-size: 16px;
+  flex: 1;
+  text-align: center;
+}
+.uv-toolbar__wrapper__confirm.data-v-58504ea1 {
+  color: #3c9cff;
+  font-size: 15px;
+  padding: 0 15px;
+}
+

+ 2 - 2
virgo.wzfrontend/yui_wx/unpackage/dist/dev/mp-weixin/uni_modules/uv-upload/components/uv-upload/uv-upload.wxss

@@ -83,8 +83,8 @@ view.data-v-2e4c50f9, scroll-view.data-v-2e4c50f9, swiper-item.data-v-2e4c50f9 {
   border-style: solid;
   border-top-color: transparent;
   border-left-color: transparent;
-  border-bottom-color: #389e0d;
-  border-right-color: #389e0d;
+  border-bottom-color: #5ac725;
+  border-right-color: #5ac725;
   border-width: 9px;
   align-items: center;
   justify-content: center;