caojunjie 1 vuosi sitten
vanhempi
commit
5982f66c55

+ 2 - 1
https/index.js

@@ -1,5 +1,6 @@
 export default {
-	url: 'http://192.168.8.110:8080'
+	// url: 'http://192.168.8.111:8080'
+	url: 'http://192.168.8.105:8080'
 	// url: 'https://byy-api.ningmengdou.com',
 	// url: 'http://59.110.231.49:8880',
 	// url: 'http://192.168.0.189:8888'

+ 12 - 6
pages/index/index.vue

@@ -6,7 +6,8 @@
 			<view class="menu-box" v-for="(item, index) in menuList" :key="index">
 				<view class="title">{{item.meta.title}}</view>
 				<view class="menu-item" v-for="(children, i) in item.children" :key="i" @click="toPage(children.path)">
-					<image :src="children.meta.icon" class="icon_menu"></image>
+					<!-- <image :src="children.meta.icon" class="icon_menu"></image> -->
+					<u-icon :name="children.meta.icon" :color="children.meta.color" size="70"></u-icon>
 					<view class="menu-title">{{children.meta.title}}</view>
 					</image>
 				</view>
@@ -27,35 +28,40 @@
 						children:[
 							{
 								meta:{
-									icon:'http://boyo.oss-cn-beijing.aliyuncs.com/2922f690-5871-11ee-90ae-8375f0aa48d2dingdan.png',
+									icon:'file-text',
+									color:'#FEFA83',
 									title:'所有订单'
 								},
 								path:'/subPackages/orderforGoods/index'
 							},
 							{
 								meta:{
-									icon:'http://boyo.oss-cn-beijing.aliyuncs.com/3e138740-5871-11ee-90ae-8375f0aa48d2zhijian.png',
+									icon:'file-text',
+									color:'#A2EF4D',
 									title:'生产中',
 								},
 								path:'/subPackages/orderforGoods/index?status=生产中' 
 							},
 							{
 								meta:{
-									icon:'http://boyo.oss-cn-beijing.aliyuncs.com/2922f690-5871-11ee-90ae-8375f0aa48d2dingdan.png',
+									icon:'file-text',
+									color:'#F71313',
 									title:'逾期'
 								},
 								path:'/subPackages/orderforGoods/index?status=已逾期' 
 							},
 							{
 								meta:{
-									icon:'http://boyo.oss-cn-beijing.aliyuncs.com/2922f690-5871-11ee-90ae-8375f0aa48d2dingdan.png',
+									icon:'file-text',
+									color:'#FFBF6B',
 									title:'已发货'
 								},
 								path:'/subPackages/orderforGoods/index?status=已发货' 
 							},
 							{
 								meta:{
-									icon:'http://boyo.oss-cn-beijing.aliyuncs.com/2922f690-5871-11ee-90ae-8375f0aa48d2dingdan.png',
+									icon:'file-text',
+									color:'#B4FDFF',
 									title:'已签收'
 								},
 								path:'/subPackages/orderforGoods/index?status=已签收' 

+ 2 - 2
pages/login/index.vue

@@ -5,10 +5,10 @@
 		<view class="loginContent">
 			<p class="title">企业数字应用平台</p>
 			<uni-forms :modelValue="formData" :rules="rules" ref="form">
-				<uni-forms-item name="enterpriseCode">
+				<!-- <uni-forms-item name="enterpriseCode">
 					<uni-easyinput type="text" prefixIcon="vip-filled" v-model="formData.enterpriseCode"
 						placeholder="请输入企业简称" />
-				</uni-forms-item>
+				</uni-forms-item> -->
 				<uni-forms-item name="username">
 					<uni-easyinput type="text" prefixIcon="person" v-model="formData.username" placeholder="请输入用户名" />
 				</uni-forms-item>

+ 3 - 2
subPackages/orderforGoods/details.vue

@@ -23,7 +23,7 @@
 				
 				<view class="item-text flex-box">
 					<view class="item-text-left">订单生产时间:</view>
-					<view>2023.08.09 ~ 2023.08.27</view>
+					<view>{{requestData.startTime}}</view>
 				</view>
 				
 				<view class="item-text flex-box">
@@ -56,7 +56,7 @@
 							<uni-th style="color: #000;" align="left">完成时间</uni-th>
 						</uni-tr>
 						<!-- 表格数据行 -->
-						<uni-tr v-for="item of requestData.productOrderList || []" :key="item.id">
+						<uni-tr v-for="item of requestData.productOrderDetailList || []" :key="item.id">
 							<uni-td>{{item.processName}}</uni-td>
 							<uni-td>
 								<text v-if="item.status == 0">执行中</text>
@@ -115,6 +115,7 @@
 		},
 		onLoad(e) {
 			this.form.id = e.id
+			this.form.url = decodeURIComponent(e.url)
 			this.orderDetailsfun()
 		},
 		onShow() {

+ 1 - 1
subPackages/orderforGoods/index.vue

@@ -85,7 +85,7 @@
 			// 跳转方法
 			Jumpfun(item){
 				uni.navigateTo({
-					url: '/subPackages/orderforGoods/details?id=' + item.id
+					url: '/subPackages/orderforGoods/details?id=' + item.id + '&url=' + encodeURIComponent(item.url)
 				});
 			},
 			// 搜索事件

+ 32 - 0
uni_modules/zxz-uni-data-select/changelog.md

@@ -0,0 +1,32 @@
+## 1.0.11(2023-09-05)
+更换change事件执行顺序
+修复多选更改值时未即时更改下拉框选项
+修复单选搜索框选中了
+修复多选筛选输入时点击其他未清空筛选值
+## 1.0.10(2023-08-29)
+修复单选搜索回显问题
+## 1.0.9(2023-08-28)
+更新文档
+## 1.0.8(2023-08-28)
+更新文档
+## 1.0.7(2023-08-16)
+修复组件禁用bug
+修复数据回显问题
+添加多选搜索功能
+## 1.0.6(2023-08-05)
+修复清空值多选下拉列表还是被选中bug
+## 1.0.5(2023-07-10)
+修复多选初始化异步数据不显示问题
+## 1.0.4(2023-07-07)
+修复微信小程序多选显示兼容问题
+## 1.0.3(2023-07-06)
+修复bug
+多选情况下   初始化之后重新选择第一个不显示
+## 1.0.2(2023-07-06)
+更新VUE3兼容
+## 1.0.1(2023-06-30)
+添加多选合并功能
+## 1.0.0(2023-06-16)
+添加下拉框检索,多选功能,自定义数据
+## 1.0.4(2023-06-16)
+ 添加下拉框检索,多选功能,自定义数据

+ 759 - 0
uni_modules/zxz-uni-data-select/components/zxz-uni-data-select/zxz-uni-data-select.vue

@@ -0,0 +1,759 @@
+<template>
+	<view class="uni-stat__select">
+		<!-- hide-on-phone -->
+		<span v-if="label" class="uni-label-text">{{label + ':'}}</span>
+		<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
+			<view class="uni-select" :style="{height:multiple?'100%':' 35px;'}"
+				:class="{'uni-select--disabled':disabled}">
+				<view class="uni-select__input-box" :style="{height:multiple?'100%':'35px;'}" @click="toggleSelector">
+					<view class="" style="display: flex;flex-wrap: wrap;width: 100%;" v-if="multiple&&current.length>0">
+						<view class="tag-calss"
+							v-for="(item,index) in collapseTags?current.slice(0,collapseTagsNum):current"
+							:key="item[dataValue]">
+							<span class="text">{{item[dataKey]}}</span>
+							<view class="" @click.stop="delItem(item)">
+								<uni-icons type="clear" style="margin-left: 4px;" color="#c0c4cc" />
+							</view>
+						</view>
+						<view v-if="current.length>collapseTagsNum&&collapseTags" class="tag-calss">
+							<span class="text">+{{current.length-collapseTagsNum}}</span>
+						</view>
+						<input v-if="filterable&&!disabled" @input="inputChange" class="uni-select__input-text"
+							type="text" style="font-size: 12px;height: 52rpx;margin-left: 6px;width: auto;"
+							placeholder="请输入" v-model="filterInput">
+					</view>
+					<view v-else-if="current&&current.length>0&&!showSelector" class="uni-select__input-text">
+						{{current}}
+					</view>
+					<input v-else-if="filterable&&showSelector" :focus="isFocus" @input="inputChange"
+						:disabled="disabled" @click.stop="" class="uni-select__input-text" type="text"
+						style="font-size: 12px;position: absolute;z-index: 1;" :placeholder="placeholderOld"
+						v-model="filterInput">
+					<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
+					<uni-icons v-if="current && clear&&!disabled" type="clear" color="#c0c4cc" size="24"
+						style="position: absolute;right: 0;" @click="clearVal" />
+					<uni-icons v-else :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
+				</view>
+				<view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
+				<view class="uni-select__selector" v-if="showSelector">
+					<view class="uni-popper__arrow"></view>
+					<scroll-view scroll-y="true" class="uni-select__selector-scroll">
+						<view class="uni-select__selector-empty" v-if="filterMixinDatacomResData.length === 0">
+							<span>{{emptyTips}}</span>
+						</view>
+						<view v-else class="uni-select__selector-item"
+							style="display: flex;justify-content: space-between;align-items: center;"
+							v-for="(item,index) in filterMixinDatacomResData" :key="index" @click="change(item)">
+							<span
+								:class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</span>
+							<uni-icons v-if="multiple&&currentArr.includes(item[dataValue])" type="checkmarkempty"
+								color="#007aff" />
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * DataChecklist 数据选择器
+	 * @description 通过数据渲染的下拉框组件
+	 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
+	 * @property {String} value 默认值
+	 * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}]
+	 * @property {Boolean} clear 是否可以清空已选项
+	 * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效
+	 * @property {String} label 左侧标题
+	 * @property {String} placeholder 输入框的提示文字
+	 * @property {Boolean} disabled 是否禁用
+	 * @event {Function} change  选中发生变化触发
+	 */
+
+	export default {
+		name: "uni-stat-select",
+		mixins: [uniCloud.mixinDatacom || {}],
+		props: {
+			collapseTagsNum: {
+				type: Number,
+				default: 1
+			},
+			collapseTags: {
+				type: Boolean,
+				default: false
+			},
+			dataKey: {
+				type: [String],
+				default: 'text'
+			},
+			dataValue: {
+				type: [String],
+				default: 'value'
+			},
+			multiple: {
+				type: Boolean,
+				default: false
+			},
+			filterable: {
+				type: Boolean,
+				default: false
+			},
+			localdata: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// #ifndef VUE3
+			value: {
+				type: [String, Number, Array],
+				default: ''
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				type: [String, Number, Array],
+				default: ''
+			},
+			// #endif
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '请选择'
+			},
+			emptyTips: {
+				type: String,
+				default: '无选项'
+			},
+			clear: {
+				type: Boolean,
+				default: true
+			},
+			defItem: {
+				type: Number,
+				default: 0
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 格式化输出 用法 field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
+			format: {
+				type: String,
+				default: ''
+			},
+		},
+		data() {
+			return {
+				showSelector: false,
+				current: [],
+				mixinDatacomResData: [],
+				apps: [],
+				channels: [],
+				cacheKey: "uni-data-select-lastSelectedValue",
+				placeholderOld: "",
+				currentArr: [],
+				filterInput: "",
+				isFocus: false
+			};
+		},
+		created() {
+			if (this.multiple) {
+				// #ifndef VUE3
+				this.currentArr = this.value || []
+				// #endif
+				// #ifdef VUE3
+				this.currentArr = this.modelValue || []
+				// #endif
+				if (this.current.length > 0) {
+					this.current = []
+				}
+				// #ifndef VUE3
+				if (this.value && this.value.length > 0 && this.filterMixinDatacomResData.length > 0) {
+					this.current = this.value.map(item => {
+						let current = this.mixinDatacomResData.find(e =>
+							e[this.dataValue] == item
+						)
+						return {
+							...current
+						}
+					})
+				}
+				// #endif
+				// #ifdef VUE3
+				if (this.modelValue && this.modelValue.length > 0 && this.filterMixinDatacomResData.length > 0) {
+					this.current = this.modelValue.map(item => {
+						let current = this.mixinDatacomResData.find(e =>
+							e[this.dataValue] == item
+						)
+						return {
+							...current
+						}
+					})
+				}
+				// #endif
+
+			} else {
+
+				// #ifndef VUE3
+				if (this.value || this.value == 0) {
+					this.current = this.formatItemName(this.filterMixinDatacomResData.find(e =>
+						e[this.dataValue] == this.value
+					))
+				}
+				// #endif
+				// #ifdef VUE3
+				if (this.modelValue || this.value == 0) {
+					this.current = this.formatItemName(this.filterMixinDatacomResData.find(e =>
+						e[this.dataValue] == this.modelValue
+					))
+				}
+				// #endif
+			}
+			this.placeholderOld = this.placeholder
+			this.debounceGet = this.debounce(() => {
+				this.query();
+			}, 300);
+			if (this.collection && !this.localdata.length) {
+				this.debounceGet();
+			}
+		},
+		computed: {
+			filterMixinDatacomResData() {
+				if (this.filterable && this.filterInput) {
+					return this.mixinDatacomResData.filter(e => e[this.dataKey].includes(this.filterInput))
+				} else {
+					return this.mixinDatacomResData
+				}
+			},
+			typePlaceholder() {
+				const text = {
+					'opendb-stat-app-versions': '版本',
+					'opendb-app-channels': '渠道',
+					'opendb-app-list': '应用'
+				}
+				const common = this.placeholder
+				const placeholder = text[this.collection]
+				return placeholder ?
+					common + placeholder :
+					common
+			},
+			valueCom() {
+				// #ifdef VUE3
+				return this.modelValue;
+				// #endif
+				// #ifndef VUE3
+				return this.value;
+				// #endif
+			}
+		},
+		watch: {
+			localdata: {
+				immediate: true,
+				handler(val, old) {
+					if (Array.isArray(val) && old !== val) {
+						this.mixinDatacomResData = val
+					}
+
+				}
+			},
+			valueCom(val, old) {
+				this.initDefVal()
+			},
+			mixinDatacomResData: {
+				immediate: true,
+				handler(val) {
+					if (val.length) {
+						this.initDefVal()
+					}
+				}
+			},
+		},
+		methods: {
+			debounce(fn, time = 100) {
+				let timer = null
+				return function(...args) {
+					if (timer) clearTimeout(timer)
+					timer = setTimeout(() => {
+						fn.apply(this, args)
+					}, time)
+				}
+			},
+			// 执行数据库查询
+			query() {
+				this.mixinDatacomEasyGet();
+			},
+			// 监听查询条件变更事件
+			onMixinDatacomPropsChange() {
+				if (this.collection) {
+					this.debounceGet();
+				}
+			},
+			initDefVal() {
+				let defValue = ''
+				if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
+					defValue = this.valueCom
+				} else {
+					let strogeValue
+					if (this.collection) {
+						strogeValue = this.getCache()
+					}
+					if (strogeValue || strogeValue === 0) {
+						defValue = strogeValue
+					} else {
+						let defItem = ''
+						if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
+							defItem = this.mixinDatacomResData[this.defItem - 1][this.dataValue]
+						}
+						defValue = defItem
+					}
+					if (defValue || defValue === 0) {
+						this.emit(defValue)
+					}
+				}
+				if (this.multiple) {
+					const mixinDatacomResData = this.mixinDatacomResData
+					this.current = defValue.map(item => {
+						const current = mixinDatacomResData.find(e => {
+							return e[this.dataValue] == item
+						})
+						return {
+							...current
+						}
+					})
+					this.currentArr = this.current.map(e => e[this.dataValue])
+					if (this.valueCom.length < 1) {
+						this.currentArr = []
+					}
+				} else {
+					const def = this.mixinDatacomResData.find(item => item[this.dataValue] === defValue)
+					this.current = def ? this.formatItemName(def) : ''
+				}
+			},
+			/**
+			 * @param {[String, Number]} value
+			 * 判断用户给的 value 是否同时为禁用状态
+			 */
+			isDisabled(value) {
+				let isDisabled = false;
+
+				this.mixinDatacomResData.forEach(item => {
+					if (item[this.dataValue] === value) {
+						isDisabled = item.disable
+					}
+				})
+				return isDisabled;
+			},
+			inputChange(e) {
+				this.$emit('inputChange', e.detail.value)
+			},
+			clearVal() {
+				if (this.disabled) {
+					return
+				}
+				if (this.multiple) {
+					this.current = []
+					this.currentArr = []
+					this.emit([])
+				} else {
+					this.current = ""
+					this.currentArr = []
+					this.emit('')
+				}
+				if (this.collection) {
+					this.removeCache()
+				}
+				this.placeholderOld = this.placeholder
+				this.filterInput = ""
+			},
+			change(item) {
+				if (!item.disable) {
+					this.showSelector = false
+					if (this.multiple) {
+						if (!this.current) {
+							this.current = []
+						}
+						if (!this.currentArr) {
+							this.currentArr = []
+						}
+						if (this.currentArr.includes(item[this.dataValue])) {
+							let index = this.current.findIndex(e => {
+								return e[this.dataValue] == item[this.dataValue]
+							})
+							this.current.splice(index, 1)
+							this.currentArr.splice(index, 1)
+							this.emit(this.current)
+						} else {
+							this.current.push(item)
+							this.currentArr.push(item[this.dataValue])
+							this.emit(this.current)
+
+						}
+						this.filterInput = ""
+					} else {
+						this.current = this.formatItemName(item)
+						if (this.filterable) {
+							this.filterInput = item[this.dataKey]
+						}
+						this.emit(item[this.dataValue])
+					}
+				}
+			},
+			delItem(item) {
+				if (this.disabled) {
+					return
+				}
+				if (this.currentArr.includes(item[this.dataValue])) {
+					let index = this.current.findIndex(e => {
+						return e[this.dataValue] == item[this.dataValue]
+					})
+					this.current.splice(index, 1)
+					this.currentArr.splice(index, 1)
+					this.emit(this.current)
+				}
+			},
+			emit(val) {
+				if (this.multiple) {
+					this.$emit('input', this.currentArr)
+					this.$emit('update:modelValue', this.currentArr)
+				} else {
+					this.$emit('input', val)
+					this.$emit('update:modelValue', val)
+				}
+				if (this.collection) {
+					this.setCache(val);
+				}
+				this.$emit('change', val)
+			},
+			toggleSelector() {
+				if (this.disabled) {
+					return
+				}
+				// if (this.filterable && this.filterInput && this.mixinDatacomResData.findIndex(e => {
+				// 		return e[this.dataKey] == this
+				// 			.filterInput
+				// 	}) < 0) {
+				// 	if (!this.multiple) {
+				// 		this.filterInput = ""
+				// 	}
+
+				// }
+				this.showSelector = !this.showSelector
+				this.isFocus = this.showSelector
+				if (this.filterable && this.current && this.showSelector) {
+					if (!this.multiple) {
+						this.placeholderOld = this.current
+						// this.filterInput = ""
+					}
+				} else if (this.filterable && !this.current && !this.showSelector) {
+					if (this.placeholderOld != this.placeholder) {
+						if (!this.multiple) {
+							this.current = this.placeholderOld
+						}
+					}
+				}
+				this.filterInput = ""
+
+			},
+			formatItemName(item) {
+				if (!item) {
+					return ""
+				}
+				let text = item[this.dataKey]
+				let value = item[this.dataValue]
+				let {
+					channel_code
+				} = item
+				channel_code = channel_code ? `(${channel_code})` : ''
+				if (this.format) {
+					// 格式化输出
+					let str = "";
+					str = this.format;
+					for (let key in item) {
+						str = str.replace(new RegExp(`{${key}}`, "g"), item[key]);
+					}
+					return str;
+				} else {
+					return this.collection.indexOf('app-list') > 0 ?
+						`${text}(${value})` :
+						(
+							text ?
+							text :
+							`未命名${channel_code}`
+						)
+				}
+			},
+			// 获取当前加载的数据
+			getLoadData() {
+				return this.mixinDatacomResData;
+			},
+			// 获取当前缓存key
+			getCurrentCacheKey() {
+				return this.collection;
+			},
+			// 获取缓存
+			getCache(name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				return cacheData[name];
+			},
+			// 设置缓存
+			setCache(value, name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				cacheData[name] = value;
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+			// 删除缓存
+			removeCache(name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				delete cacheData[name];
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-base-color: #6a6a6a !default;
+	$uni-main-color: #333 !default;
+	$uni-secondary-color: #909399 !default;
+	$uni-border-3: #e5e5e5;
+
+
+	/* #ifndef APP-NVUE */
+	@media screen and (max-width: 500px) {
+		.hide-on-phone {
+			display: none;
+		}
+	}
+
+	/* #endif */
+	.uni-stat__select {
+		display: flex;
+		align-items: center;
+		// padding: 15px;
+		cursor: pointer;
+		width: 100%;
+		flex: 1;
+		box-sizing: border-box;
+	}
+
+	.uni-stat-box {
+		width: 100%;
+		flex: 1;
+	}
+
+	.uni-stat__actived {
+		width: 100%;
+		flex: 1;
+		// outline: 1px solid #2979ff;
+	}
+
+	.uni-label-text {
+		font-size: 14px;
+		font-weight: bold;
+		color: $uni-base-color;
+		margin: auto 0;
+		margin-right: 5px;
+	}
+
+	.uni-select {
+		font-size: 14px;
+		border: 1px solid $uni-border-3;
+		box-sizing: border-box;
+		border-radius: 4px;
+		padding: 0 5px;
+		padding-left: 10px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		user-select: none;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		border-bottom: solid 1px $uni-border-3;
+		width: 100%;
+		flex: 1;
+		height: 35px;
+		min-height: 35px;
+
+		&--disabled {
+			background-color: #f5f7fa;
+			cursor: not-allowed;
+		}
+	}
+
+	.uni-select__label {
+		font-size: 16px;
+		// line-height: 22px;
+		min-height: 35px;
+		height: 35px;
+		padding-right: 10px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__input-box {
+		height: 35px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+
+		.tag-calss {
+			font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif;
+			font-weight: 400;
+			-webkit-font-smoothing: antialiased;
+			-webkit-tap-highlight-color: transparent;
+			font-size: 12px;
+			border: 1px solid #d9ecff;
+			border-radius: 4px;
+			white-space: nowrap;
+			height: 24px;
+			padding: 0 4px 0px 8px;
+			line-height: 22px;
+			box-sizing: border-box;
+			margin: 2px 0 2px 6px;
+			display: flex;
+			max-width: 100%;
+			align-items: center;
+			background-color: #f4f4f5;
+			border-color: #e9e9eb;
+			color: #909399;
+
+			.text {
+				font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif;
+				font-weight: 400;
+				-webkit-font-smoothing: antialiased;
+				-webkit-tap-highlight-color: transparent;
+				font-size: 12px;
+				white-space: nowrap;
+				line-height: 22px;
+				color: #909399;
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+		}
+	}
+
+	.uni-select__input {
+		flex: 1;
+		font-size: 14px;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-select__input-plac {
+		font-size: 14px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		top: calc(100% + 12px);
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border: 1px solid #EBEEF5;
+		border-radius: 6px;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		z-index: 3;
+		padding: 4px 0;
+	}
+
+	.uni-select__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-select__selector-empty,
+	.uni-select__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 35px;
+		font-size: 14px;
+		text-align: center;
+		/* border-bottom: solid 1px $uni-border-3; */
+		padding: 0px 10px;
+	}
+
+	.uni-select__selector-item:hover {
+		background-color: #f9f9f9;
+	}
+
+	.uni-select__selector-empty:last-child,
+	.uni-select__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+
+	.uni-select__selector__disabled {
+		opacity: 0.4;
+		cursor: default;
+	}
+
+	/* picker 弹出层通用的指示小三角 */
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border-color: transparent;
+		border-style: solid;
+		border-width: 6px;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+
+	.uni-select__input-text {
+		// width: 280px;
+		width: 100%;
+		color: $uni-main-color;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow: ellipsis;
+		overflow: hidden;
+	}
+
+	.uni-select__input-placeholder {
+		color: $uni-base-color;
+		font-size: 12px;
+	}
+
+	.uni-select--mask {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		right: 0;
+		left: 0;
+	}
+</style>

+ 85 - 0
uni_modules/zxz-uni-data-select/package.json

@@ -0,0 +1,85 @@
+{
+  "id": "zxz-uni-data-select",
+  "displayName": "zxz-uni-data-select 下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义数据)",
+  "version": "1.0.11",
+  "description": "通过数据驱动的下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义数据)",
+  "keywords": [
+    "uni-ui",
+    "select",
+    "uni-data-select",
+    "下拉框",
+    "下拉选"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.1"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-load-more"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "u",
+          "app-nvue": "u"
+        },
+        "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",
+        "京东": "y"
+        },
+        "快应用": {
+          "华为": "y",
+          "联盟": "y"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 26 - 0
uni_modules/zxz-uni-data-select/readme.md

@@ -0,0 +1,26 @@
+## DataSelect 下拉框选择器
+> **组件名:zxz-uni-data-select**
+> 代码块: `zxz-uni-data-select`
+
+当选项过多时,使用下拉菜单展示并选择内容
+## API
+
+### zxz-uni-data-select Props
+
+|  属性名		|    类型				| 默认值	| 说明								|
+| -				| -						| -			| -									|
+| v-model		| String、Array、Number	|-			| 选中项绑定值						|
+| multiple		| Boolean				| false		| 是否多选							|
+| disabled		| Boolean				|false		| 是否禁用							|
+| dataKey		| String				|"key"		| 作为 key 唯一标识的键名			|
+| dataValue		| String				| "value"	| 作为 value 唯一标识的键名			|
+| collapseTags	| Boolean				| false		| 多选时是否将选中值按文字的形式展示|
+|collapseTagsNum|Number					| 1			| 多选时选中值按文字的形式展示的数量|
+| localdata		| Array					|-			| 下拉列表本地数据					|
+|label	| String	| -	| 左侧标题
+|placeholder	| String	| "请选择"	| 输入框的提示文字
+|emptyTips	| String	|"无选项"	| 无选项提示
+|clear	| Boolean	| true| 是否清空
+|format	| String	| -	| 格式化输出 用法 field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
+		
+#### 如使用过程中有任何问题,或者您对组件有一些好的建议,欢迎加微weiyila520