瀏覽代碼

更新v0.7.7相关功能

xieyunhui 3 年之前
父節點
當前提交
d6ffdba77e
共有 65 個文件被更改,包括 7368 次插入879 次删除
  1. 71 0
      components/tm-input/tm-input.vue
  2. 2 2
      components/tm-tabbar/tm-tabbar.vue
  3. 4 4
      components/tm-upload-img/tm-upload-img.vue
  4. 1 1
      manifest.json
  5. 27 0
      pages.json
  6. 32 5
      pages/auditItemDetails/auditItemDetails.vue
  7. 443 71
      pages/batchDistribution/batchDistribution.vue
  8. 429 145
      pages/checkList/checkList.vue
  9. 6 4
      pages/checkMainPoints/checkMainPoints.vue
  10. 103 15
      pages/creatingSituations/components/checkRent.vue
  11. 1 1
      pages/creatingSituations/server.js
  12. 575 279
      pages/editCheckList/editCheckList.vue
  13. 18 3
      pages/home/home.vue
  14. 1 1
      pages/login/login.vue
  15. 11 7
      pages/mission-action/mission-action.vue
  16. 17 9
      pages/mission-details/mission-details.vue
  17. 3 1
      pages/model.js
  18. 103 72
      pages/planList/planList.vue
  19. 12 0
      pages/planList/server.js
  20. 45 0
      pages/reportPage/reportPage.vue
  21. 23 0
      pages/reports/model.js
  22. 102 0
      pages/reports/reports.vue
  23. 14 0
      pages/reports/server.js
  24. 二進制
      static/clearIcon.png
  25. 二進制
      static/fillBlackArrow.png
  26. 31 0
      uni_modules/uni-easyinput/changelog.md
  27. 56 0
      uni_modules/uni-easyinput/components/uni-easyinput/common.js
  28. 461 0
      uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
  29. 90 0
      uni_modules/uni-easyinput/package.json
  30. 11 0
      uni_modules/uni-easyinput/readme.md
  31. 20 2
      uni_modules/uni-icons/changelog.md
  32. 1168 131
      uni_modules/uni-icons/components/uni-icons/icons.js
  33. 13 3
      uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  34. 663 0
      uni_modules/uni-icons/components/uni-icons/uniicons.css
  35. 二進制
      uni_modules/uni-icons/components/uni-icons/uniicons.ttf
  36. 85 81
      uni_modules/uni-icons/package.json
  37. 2 40
      uni_modules/uni-icons/readme.md
  38. 8 0
      uni_modules/uni-scss/changelog.md
  39. 1 0
      uni_modules/uni-scss/index.scss
  40. 82 0
      uni_modules/uni-scss/package.json
  41. 4 0
      uni_modules/uni-scss/readme.md
  42. 7 0
      uni_modules/uni-scss/styles/index.scss
  43. 3 0
      uni_modules/uni-scss/styles/setting/_border.scss
  44. 66 0
      uni_modules/uni-scss/styles/setting/_color.scss
  45. 55 0
      uni_modules/uni-scss/styles/setting/_radius.scss
  46. 56 0
      uni_modules/uni-scss/styles/setting/_space.scss
  47. 167 0
      uni_modules/uni-scss/styles/setting/_styles.scss
  48. 24 0
      uni_modules/uni-scss/styles/setting/_text.scss
  49. 146 0
      uni_modules/uni-scss/styles/setting/_variables.scss
  50. 19 0
      uni_modules/uni-scss/styles/tools/functions.scss
  51. 31 0
      uni_modules/uni-scss/theme.scss
  52. 62 0
      uni_modules/uni-scss/variables.scss
  53. 33 0
      uni_modules/uni-swipe-action/changelog.md
  54. 300 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js
  55. 12 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js
  56. 193 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js
  57. 257 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js
  58. 82 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js
  59. 270 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js
  60. 344 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue
  61. 341 0
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs
  62. 60 0
      uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue
  63. 87 0
      uni_modules/uni-swipe-action/package.json
  64. 11 0
      uni_modules/uni-swipe-action/readme.md
  65. 4 2
      utils/requestUrl.js

+ 71 - 0
components/tm-input/tm-input.vue

@@ -0,0 +1,71 @@
+<template>
+	<view class="tm-input">
+		<input class="inputArea" type="text" :value="inputValue"  :placeholder="placeholder" 
+		        @input="inputHandle"
+				placeholder-style="font-size:25rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #B8BECC;" 
+				
+		/>
+		<image @click="clearhandle" v-show="inputValue.length>0" class="clearIcon" src="../../static/clearIcon.png" mode=""></image>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tm-input",
+		props: {
+			placeholder: {
+				type: String,
+				default: () => {
+					return '请输入'
+				}
+			},
+			clear:{
+				type: Boolean,
+				default: () => {
+					return false
+				}
+			}
+		},
+		data() {
+			return {
+                inputValue:''
+			};
+		},
+		watch:{
+			inputValue(val){
+				this.$emit('onChange',val);
+			},
+			clear(val){
+				if(val){
+					  this.inputValue = ''
+				}
+			}
+		},
+		methods:{
+			inputHandle(event){
+				this.inputValue = event.target.value
+			},
+			clearhandle(){
+				this.inputValue = ''
+			}
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	.tm-input {
+		position: relative;
+		.inputArea {}
+		.clearIcon {
+			position: absolute;
+			right:25rpx;
+			top:50%;
+			width:25rpx;
+			height: 25rpx;
+			margin-top: -12.5rpx;
+		}
+	}
+</style>

+ 2 - 2
components/tm-tabbar/tm-tabbar.vue

@@ -69,8 +69,8 @@
 				],
 				// 不同角色的拥有 tabbar下标(1、管理员 2、查核组长 3、查核组员 4、单位负责人 5、改善者)
 				rolList: [
-					{permission: 1, name: '管理员', tabBarIndexs: [0, 1, 2, 3]}, // tabBarIndexs:tabBarList种对应的下标
-					{permission: 2, name: '查核组长', tabBarIndexs: [0, 4, 3]},
+					{permission: 1, name: '管理员', tabBarIndexs: [0,2, 3]}, // tabBarIndexs:tabBarList种对应的下标
+					{permission: 2, name: '查核组长', tabBarIndexs: [0,1, 4, 3]},
 					{permission: 3, name: '查核组员', tabBarIndexs: [0, 4, 3]},
 					{permission: 4, name: '单位负责人', tabBarIndexs: [1, 3]},
 					{permission: 5, name: '改善者', tabBarIndexs: [1, 3]}

+ 4 - 4
components/tm-upload-img/tm-upload-img.vue

@@ -74,10 +74,10 @@
 						'position':index, // 0 开始算  最大值为   listPic 数组数量 减一 
 					},
 					(ret) => {
-						modal.toast({
-							message: ret,
-							duration: 1.5
-						});
+						// modal.toast({
+						// 	message: ret,
+						// 	duration: 1.5
+						// });
 					});
 				// #endif
 			},

+ 1 - 1
manifest.json

@@ -2,7 +2,7 @@
     "name" : "追踪方法学",
     "appid" : "__UNI__03C4C69",
     "description" : "",
-    "versionName" : "0.7.5",
+    "versionName" : "0.7.6",
     "versionCode" : 100,
     "transformPx" : false,
     "app-plus" : {

+ 27 - 0
pages.json

@@ -231,6 +231,33 @@
             }
             
         }
+        ,{
+            "path" : "pages/reports/reports",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "报表",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/reportPage/reportPage",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/reportPage/reportPage",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
     ],
 	"easycom": {
 			"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"

+ 32 - 5
pages/auditItemDetails/auditItemDetails.vue

@@ -41,7 +41,7 @@
 			<view class="box-item">
 				<view>图片展示</view>
 				<view class="img-wrap">
-					<image mode="widthFix" v-for="(img, i) in getArr(item.checkResultUrl)" :key="i" :src="img"></image>
+					<image @click="previewHandle(i,item.checkResultUrl)" mode="widthFix" v-for="(img, i) in getArr(item.checkResultUrl)" :key="i" :src="img"></image>
 				</view>
 			</view>
 		</view>
@@ -61,6 +61,12 @@
 	/**
 	 * 查核项详情
 	 */
+
+	// #ifdef APP
+	const pictureModule = uni.requireNativePlugin("Wlake-PictureView")
+	const modal = uni.requireNativePlugin('modal');
+	// #endif
+
 	import {
 		_goBackFresh
 	} from '../../utils/compatible.js';
@@ -122,7 +128,26 @@
 			}
 
 		},
-		methods: {
+		methods: {
+			/**
+			 * @param {number} index
+			 * @param {string} imgUrls 
+			 */
+			previewHandle(index,imgUrls) {
+				const picList = imgUrls ? imgUrls.split(',') : [] ;
+				// #ifdef APP
+				pictureModule.PictureViewerMain({
+						'listPic': picList,
+						'position':index, // 0 开始算  最大值为   listPic 数组数量 减一 
+					},
+					(ret) => {
+						// modal.toast({
+						// 	message: ret,
+						// 	duration: 1.5
+						// });
+					});
+				// #endif
+			},
 			getArr(value) {
 				return value ? value.split(',') : [];
 			},
@@ -140,8 +165,10 @@
 				});
 			},
 			goToPrevPage() {
-				_goBackFresh('pages/checkMainPoints/checkMainPoints');
-
+				// _goBackFresh('pages/checkMainPoints/checkMainPoints');
+                uni.navigateBack({
+                    delta: 1
+                });
 			},
 			loadItemDetail(id) {
 				this.dispatch('checkTaskDetail', {
@@ -328,7 +355,7 @@
 
 						image {
 							margin-bottom: 12.5rpx;
-							width: calc(50% - 12.5rpx);
+							width:160rpx;
 
 							&:nth-child(2n) {
 								margin-left: 12.5rpx;

+ 443 - 71
pages/batchDistribution/batchDistribution.vue

@@ -4,31 +4,59 @@
 			<template>
 				<view class="blockTitle">计划时间</view>
 				<div class="date-view">
-					<view class="row">
+					<view class="row">
 						<!-- 已经分配过的病区,再次修改禁止修改时间 -->
 						<text class="label">开始时间</text>
 						<view class="date-box">
-							<date-time-picker :disabled="details.isDistribution" :height="100" :start="details.planStartDate" :end="details.planEndDate"
-								:defaultValue="details.startDate" placeholder="请选择起始时间" pickType="startDate"
-								@change="changeDateTime" />
+							<date-time-picker :disabled="details.isDistribution" :height="100"
+								:start="details.startDate" :end="details.planEndDate" :defaultValue="details.startDate"
+								placeholder="请选择起始时间" pickType="startDate" @change="changeDateTime" />
 						</view>
 					</view>
 					<view class="row">
 						<text class="label">结束时间</text>
 						<view class="date-box">
-							<date-time-picker :disabled="details.isDistribution" :height="100" :start="details.planStartDate" :end="details.planEndDate"
+							<date-time-picker :disabled="details.isDistribution" :height="100"
+								:start="details.planStartDate" :end="details.planEndDate"
 								:defaultValue="details.endDate" placeholder="请选择结束时间" pickType="endDate"
 								@change="changeDateTime" />
 						</view>
 					</view>
-				</div>
-				<view class="blockTitle">查核人</view>
-				<tm-checked-group :list="empList" :defaultValue='checkPresonList' :setting="{
-				  value: 'employeeId',
-				  name: 'employeeName'
-				}" :openkeys="[0]" @change="onCheckPerosonChanged" />
-				<view class="blockTitle" v-if="details.situationType == 3">要点分类</view>
-				<tm-checked-group v-if="details.situationType == 3" :list="checkPointList"
+				</div>
+				
+				<view class="tabWrap" v-if="checkPointList.length >0">
+					<view :class="[currentSelectedTab==0?'on tab':'tab']" @click="tabChangeHandle(0)" >{{`查核人(${checkPresonList.length})`}}</view>
+					<view :class="[currentSelectedTab==1?'on tab':'tab']" @click="tabChangeHandle(1)">{{`要点分类(${checkedPointList.length})`}}</view>
+				</view>
+				
+                <view class="blockTitle noBottomBlockTitle" v-if="checkPointList.length == 0">查核人<text>{{`已选择${checkPresonList.length}人`}}</text></view>
+				
+                <view v-if="currentSelectedTab==0">
+					<view class="filter">
+						<view class="selecter" @click="selecterHandle">
+							<text>{{selectedDeptStr}}</text>
+							<image src="../../static/fillBlackArrow.png" mode=""></image>
+						</view>
+						<view class="searchBar">
+							<image class="serachIcon" src="../../static/searchIcon.png" mode=""></image>
+							<tm-input class="searchVal" :clear="ifclearSearch" @onChange="searchInputHandle"
+								placeholder="请输入搜索姓名"></tm-input>
+							<view class="searchBtn" @click="searchHandle">搜索</view>
+						</view>
+					</view>
+                	 <view class="empListWrapper" v-if="empList.length>0" :style="{height:empListWrapperH}">
+                	 	<tm-checked-group :list="empList" :defaultValue='checkPresonList' :setting="{
+                	 	  value: 'employeeId',
+                	 	  name: 'label'
+                	 	}" :openkeys="[0]" @change="onCheckPerosonChanged" />
+                	 </view>
+                	 <view class="empty" v-if="empList.length==0">
+                	 	<image src="../../static/no-data.png" mode=""></image>
+                	 	<text>暂无内容</text>
+                	 </view>
+                </view> 
+				
+				<tm-checked-group v-if="details.situationType == 3&&currentSelectedTab==1" :list="checkPointList"
 					:defaultValue='checkedPointList' :setting="{
 				  value: 'categoryId',
 				  name: 'categoryName'
@@ -39,6 +67,22 @@
 		<view class="fixed-buttom-btn" @click="sure">
 			<text class="btn-text">确定</text>
 		</view>
+		<uni-popup ref="popup" type="bottom" :maskClick="true">
+			<view class="selectableList">
+				<scroll-view scroll-y="true" class="listWrap">
+					<view :class="getClass(v.id)" v-for="(v,i) in departments" @click="listClickHandle(v)">{{v.name}}
+					</view>
+				</scroll-view>
+				<!-- <view class="listWrap">
+					<view :class="getClass(v.id)" v-for="(v,i) in departments" @click="listClickHandle(v)">{{v.name}}
+					</view>
+				</view> -->
+				<view class="btnGroup">
+					<view class="cancelBtn btn" @click="btnGroupClickHandle(false)">取消</view>
+					<view class="confirmBtn btn" @click="btnGroupClickHandle(true)">确定</view>
+				</view>
+			</view>
+		</uni-popup>
 	</view>
 </template>
 
@@ -49,8 +93,30 @@
 	} from "vuex";
 	import moment from 'moment';
 	export default {
-		computed: {
-	
+		computed: {
+			selectedDeptStr() {
+				const {
+					deptIdStr
+				} = this.filter;
+				return (deptIdStr.map(t => t.name)).join(',')
+			},
+			empListWrapperH(){
+				if(this.checkPointList.length >0){
+					  return 'calc(100vh - 485rpx)'
+				}else{
+					  return 'calc(100vh - 460rpx)'
+				}
+			},
+			ifclearSearch() {
+				return this.filter.keyword.length == 0
+			},
+		},
+		watch: {
+			filter(val, oldVal) {
+				if (val.keyword.length == 0) {
+					this.searchHandle();
+				}
+			}
 		},
 		data() {
 			return {
@@ -70,18 +136,29 @@
 				isSubmit: false,
 				//选中的查核要点
 				checkedPointList: [],
+				//可选单位列表
+				departments: [],
+				currentSelectedTab:0,//0 查核人 1 要点分类
+				//筛选条件
+				filter: {
+					keyword: '',
+					deptIdStr: [{
+						name: '全部',
+						id: 0
+					}], //单位
+				},
 			}
 		},
 		onLoad({
 			details
 		}) {
-			const _details = details ? JSON.parse(details) : {};
-			//初始化默认时间
-			const currentDate = new Date();
-			_details.startDate = `${currentDate.getFullYear()}-${currentDate.getMonth()+1}-${currentDate.getDate()} 00:00`;
-			_details.endDate = _details.planEndDate;
-			
-			
+			const _details = details ? JSON.parse(details) : {};
+			//初始化默认时间
+			const currentDate = new Date();
+			_details.startDate = `${currentDate.getFullYear()}-${currentDate.getMonth()+1}-${currentDate.getDate()} 00:00`;
+			_details.endDate = _details.planEndDate;
+
+
 			// 强制刷新返回查核列表页面
 			if (getCurrentPages().length === 1) {
 				const {
@@ -95,64 +172,154 @@
 					url: `/pages/editCheckList/editCheckList?situationId=${situationId}&checkId=${checkId}&checkGroupId=${checkGroupId}&startDate=${planStartDate}&endDate=${planEndDate}`
 				});
 			}
+			this.pageQueryParams = _details;
 			this.getComponentInfo(_details);
 		},
 		destroyed() {
 			this.clearTimer();
 		},
-		methods: {
-			getComponentInfo(details) {
-		
+		methods: {
+			tabChangeHandle(num){
+				  this.currentSelectedTab = num;
+			},
+			getClass(id) {
+				const index = this.filter.deptIdStr.findIndex(t => t.id == id)
+				if (index != -1) {
+					return "list on"
+				}
+				return "list"
+			},
+			searchHandle() {
 				const {
 					checkGroupId,
 					situationType,
-					checkId,
-					// deptId,
-					checkedList,
-					empId,
-					empName,
+					checkedList,
+				} = this.details;
+				const deptId = checkedList.join(',');
+				this.getEmpDeptTree(checkGroupId, situationType, deptId)
+			},
+			/**
+			 * @param {boolean} flag true确定按钮点击,false取消按钮
+			 */
+			btnGroupClickHandle(flag) {
+				this.$refs.popup.close();
+				//清空搜索
+				this.filter = {
+					...this.filter,
+					keyword: ''
+				}
+			},
+			listClickHandle(item) {
+				const _filter = this.filter;
+				const {
+					deptIdStr
+				} = _filter;
+				const index = _filter.deptIdStr.findIndex(t => t.id == item.id);
+
+				if (item.id == 0) {
+					//全部
+					this.filter = {
+						...this.filter,
+						deptIdStr: [{
+							name: '全部',
+							id: 0
+						}]
+					};
+					return;
+				}
+				//去除全部选项选中
+				deptIdStr.splice(_filter.deptIdStr.findIndex(t => t.id == 0), 1);
+
+				if (index != -1) {
+					deptIdStr.splice(index, 1)
+				} else {
+					deptIdStr.push({
+						name: item.name,
+						id: item.id
+					})
+				}
+				this.filter = _filter;
+			},
+			selecterHandle() {
+				this.$refs.popup.open();
+			},
+			/**
+			 * @param {string} val
+			 */
+			searchInputHandle(val) {
+				this.filter = {
+					...this.filter,
+					keyword: val
+				};
+			},
+			getComponentInfo(details) {
+
+				const {
+					checkGroupId,
+					situationType,
+					checkId,
+					// deptId,
+					checkedList,
+					empId,
+					empName,
 					categoryId
 				} = details;
-				this.details = details;
-				const deptId = checkedList.join(',');
-				this.getEmpDeptTree(checkGroupId, situationType,deptId);
-				//查核人回显
-				if(empId&&empName){
-					const empIdArr = empId.split(',');
-					const empNameArr = empName.split(',');
-					this.checkPresonList = empIdArr.map((item,index)=>({
-						  employeeId:Number(item),
-						  employeeName:empNameArr[index]
-					}));
-				}
-				//查核要点回显
-				if(categoryId){
-					this.checkedPointList = categoryId.map((item)=>({
-						  categoryId:Number(item),
-					}));
+				this.details = details;
+				const deptId = checkedList.join(',');
+				this.getEmpDeptTree(checkGroupId, situationType, deptId);
+				//查核人回显
+				if (empId && empName) {
+					const empIdArr = empId.split(',');
+					const empNameArr = empName.split(',');
+					this.checkPresonList = empIdArr.map((item, index) => ({
+						employeeId: Number(item),
+						employeeName: empNameArr[index]
+					}));
 				}
-				
+				//查核要点回显
+				if (categoryId) {
+					this.checkedPointList = categoryId.map((item) => ({
+						categoryId: Number(item),
+					}));
+				}
+
 			},
 			// 查询部门人员树
-			getEmpDeptTree(checkGroupId, situationType,deptId) {
+			getEmpDeptTree(checkGroupId, situationType, deptId) {
 				this.$store.dispatch({
 					type: 'allocationPerson/commActions',
 					key: "getGroupEmpList",
 					data: {
 						checkGroupId,
-						situationType,
-						deptId
+						situationType,
+						deptId,
+						name: this.filter.keyword,
+						deptIdStr: (this.filter.deptIdStr.map(t => t.id == 0 ? '' : t.id)).join(',')
 					}
 				}).then(data => {
 					if (data) {
-						this.empList = data.sysCheckGroupEmployees || [];
-						if (situationType == 3) this.checkPointList = data.pointCategoryBOs || [] ;
+						let empList = [];
+						if (data.sysCheckGroupEmployees) {
+							empList = data.sysCheckGroupEmployees.map(t => ({
+								...t,
+								label: `${t.employeeName}  |  ${t.code}  |  ${t.deptName}`
+							}))
+						} else {
+							empList = [];
+						}
+						
+
+						this.empList = empList;
+						this.departments = [{
+							name: '全部',
+							id: 0
+						}, ...data.departments] || [];
+						if (situationType == 3) this.checkPointList = data.pointCategoryBOs || [];
 					}
 				});
 			},
 			//查核要点选择回调
 			checkChanged(data) {
-				// console.log({data});
 				const {
 					checkedList
 				} = data;
@@ -193,11 +360,14 @@
 				}
 			},
 			// 点击确定
-			sure() {
-				const {startDate,endDate} = this.details;
-                const empId = (this.checkPresonList.map(item => item.employeeId)).join(',');
-                const empName = (this.checkPresonList.map(item => item.employeeName)).join(',');
-				
+			sure() {
+				const {
+					startDate,
+					endDate
+				} = this.details;
+				const empId = (this.checkPresonList.map(item => item.employeeId)).join(',');
+				const empName = (this.checkPresonList.map(item => item.employeeName)).join(',');
+
 				if (!empId) {
 					return this.showModal('请选择查核人');
 				}
@@ -206,22 +376,31 @@
 				}
 				if (!endDate) {
 					return this.showModal('请选择结束时间');
+				}
+				if (this.checkPointList.length>0&&this.checkedPointList.length==0) {
+					//当未选择要点分类时
+					return this.showModal('请选择要点分类!');
 				}
-				const {checkId,checkedList,checkNo,situationType} = this.details;
-				const categoryIds = this.checkedPointList.map(item=>item.categoryId);
+				const {
+					checkId,
+					checkedList,
+					checkNo,
+					situationType
+				} = this.details;
+				const categoryIds = this.checkedPointList.map(item => item.categoryId);
 				const data = {
 					"checkId": checkId, //  计划id
 					"deptId": JSON.parse(JSON.stringify(checkedList)), // 多个单位id列表
 					"empId": empId, // 查核者id
 					"empName": empName, // 查核者名字
 					"startDate": startDate, // 开始时间
-					"endDate":endDate, // 结束时间
-					"checkNo":checkNo,
-					"situationType":Number(situationType),
-					"categoryIds":categoryIds
-					
+					"endDate": endDate, // 结束时间
+					"checkNo": checkNo,
+					"situationType": Number(situationType),
+					"categoryIds": categoryIds
+
 				}
-		
+
 				this.$store.dispatch({
 					type: 'batchDistribution/commActions',
 					key: 'batchCheckEmp',
@@ -281,22 +460,215 @@
 	}
 </script>
 
-<style lang="less">
+<style lang="less" scoped>
 	.allocationPerson-page {
 		height: 100%;
 
+		.selectableList {
+			display: flex;
+			width: 100%;
+			flex-direction: column;
+			height: 50vh;
+			padding-top: 50rpx;
+			box-sizing: border-box;
+			border-radius: 25rpx 25rpx 0px 0px;
+			background-color: #FFFFFF;
+
+			.listWrap {
+				height: calc(50vh - 75rpx);
+				overflow-y: scroll;
+
+				.list {
+					height: 87.5rpx;
+					line-height: 87.5rpx;
+					text-align: center;
+					font-size: 30rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #8A8F99;
+
+					&.on {
+						font-weight: 500;
+						color: #3377FF;
+					}
+				}
+			}
+
+			.btnGroup {
+				display: flex;
+				width: 100%;
+				flex-direction: row;
+				justify-content: center;
+				align-items: center;
+
+				.btn {
+					width: 50%;
+					height: 75rpx;
+					line-height: 75rpx;
+					text-align: center;
+					font-size: 22.5rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #3377FF;
+				}
+
+				.cancelBtn {
+					border-top: 0.62rpx solid #DADEE6;
+				}
+
+				.confirmBtn {
+					color: #FFFFFF;
+					background: #3377FF;
+				}
+			}
+		}
+
 		.scroll-y {
 			height: calc(100% - 87.5rpx);
 			padding-top: 15rpx;
-
 			.blockTitle {
+				display: flex;
+				flex-direction: row;
+				justify-content: space-between;
+				align-items: center;
 				font-size: 22.5rpx;
 				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
 				font-weight: 400;
 				color: #666F80;
-				padding: 15rpx 0;
-				padding-left: 25rpx;
+				padding: 15rpx 25rpx;
 				border-bottom: 0.62rpx solid #DADEE6;
+
+				&.noBottomBlockTitle {
+					border-bottom: none;
+				}
+			}
+			
+			.tabWrap {
+				display: flex;
+				flex-direction: row;
+				justify-content: space-around;
+				align-items: center;
+				padding: 25rpx 0;
+				padding-top: 12.5rpx;
+				
+				.tab {
+					width: 250rpx;
+					height: 50rpx;
+					background: #FFFFFF;
+					border-radius: 25rpx;
+					font-size: 22.5rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					text-align: center;
+					line-height:50rpx;;
+					color: #525866;
+					&.on {
+						color: #FFFFFF;
+						background: #3377FF;
+					}
+				}
+			}
+
+			.filter {
+				display: flex;
+				flex-direction: row;
+				justify-content: space-between;
+				align-items: center;
+				margin-bottom: 15rpx;
+				padding: 0 25rpx;
+				background: #FFFFFF;
+
+				.selecter {
+					display: flex;
+					width: 25%;
+					height: 87.5rpx;
+					flex-direction: row;
+					justify-content: space-between;
+					align-items: center;
+					padding-right: 25rpx;
+					border-right: 0.62rpx solid #DADEE6;
+
+					&>text {
+						width: 112.5rpx;
+						font-size: 25rpx;
+						font-family: SourceHanSansCN-Medium, SourceHanSansCN;
+						font-weight: 500;
+						color: #292C33;
+						text-overflow: ellipsis;
+						overflow: hidden;
+						white-space: nowrap;
+
+					}
+
+					&>image {
+						width: 11.25rpx;
+						height: 7.5rpx;
+					}
+				}
+
+				.searchBar {
+					display: flex;
+					width: 75%;
+					flex-direction: row;
+					align-items: center;
+					height: 87.5rpx;
+					padding-left: 25rpx;
+
+					.serachIcon {
+						width: 30rpx;
+						height: 30rpx;
+					}
+
+					.searchVal {
+						width: 79%;
+						padding-left: 25rpx;
+						font-size: 25rpx;
+						font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						font-weight: 400;
+						color: #292C33;
+
+					}
+
+					.searchBtn {
+						padding-left: 25rpx;
+						font-size: 25rpx;
+						font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						font-weight: 400;
+						color: #3377FF;
+						white-space: nowrap;
+						border-left: 1rpx solid #DADEE6;
+					}
+				}
+			}
+
+			.empListWrapper {
+				// height: 40vh;
+				overflow-y: scroll;
+				margin-bottom: 25rpx;
+				background-color: #FFFFFF;
+			}
+
+			.empty {
+				display: flex;
+				height: 40vh;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+				margin-bottom: 25rpx;
+				background-color: #FFFFFF;
+
+				&>image {
+					width: 175rpx;
+					height: 190rpx;
+					margin-bottom: 40rpx;
+				}
+
+				&>text {
+					font-size: 22.5rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #828899;
+				}
 			}
 
 			.date-view {

+ 429 - 145
pages/checkList/checkList.vue

@@ -1,22 +1,40 @@
 <template>
-	<view :class="[showModal?'check-map-list-page preventScroll':'check-map-list-page']">
-		<tm-top-menu>
-			<view class="top-menu" @click="showModalHandle(!showModal)">
-				<text>{{createTitle}}</text>
-				<image :src="`../../static/${showModal?'open':'close'}-icon.png`"></image>
-			</view>
+	<view :class="[showModal?'check-map-list-page preventScroll':'check-map-list-page']">
+		<tm-top-menu>
+			<view class="top-menu" @click="showModalHandle(!showModal)">
+				<text>{{createTitle}}</text>
+				<image :src="`../../static/${showModal?'open':'close'}-icon.png`"></image>
+			</view>
 		</tm-top-menu>
+
+		<view class="searchBar" v-if="depList.length>0">
+			<view class="filter">
+				<view class="selecter" @click="selecterHandle">
+					<text>{{selectedStr}}</text>
+					<image src="../../static/fillBlackArrow.png" mode=""></image>
+				</view>
+				<view class="searchBar">
+					<image class="serachIcon" src="../../static/searchIcon.png" mode=""></image>
+					<tm-input class="searchVal" :clear="ifclearSearch" @onChange="searchInputHandle"
+						placeholder="请输入单位名称"></tm-input>
+					<view class="searchBtn" @click="searchHandle">搜索</view>
+				</view>
+			</view>
+		</view>
+
 		<scroll-view scroll-y="true" class="check-map-list">
-			<view class="item" v-for="(item, index) in depList" @click="gotoCheckMainPointsPage(item)" :key="index">
+			<view class="item" v-for="(item, index) in copiedDepList" @click="gotoCheckMainPointsPage(item)"
+				:key="index">
 				<view class="title-wrap">
 					<text>{{item.deptName}}</text>
 					<view>
 						<image src="../../static/icon-map.png"></image>
 						<text>{{item.deptClassName}}</text>
-					</view>
-					<view class="scoreAndStatus">
-						<text v-if="item.scoreInfo">{{item.scoreInfo&&((item.scoreInfo.split('/')).map(t=>Number(t).toFixed(1))).join('/')}}</text>
-						<view :class="getStatus(item.completeDes)">{{item.completeDes}}</view>
+					</view>
+					<view class="scoreAndStatus">
+						<text
+							v-if="item.scoreInfo">{{item.scoreInfo&&((item.scoreInfo.split('/')).map(t=>Number(t).toFixed(1))).join('/')}}</text>
+						<view :class="getStatus(item.completeDes)">{{item.completeDes}}</view>
 					</view>
 				</view>
 				<view class="content">
@@ -36,30 +54,44 @@
 					<text>{{item.completeDes}}</text>
 				</view>
 			</view>
-		</scroll-view>
-		<tm-no-data v-if="depList.length === 0" :textArr="['暂时没有内容可以展示哦', '请返回上一页面或尝试刷新页面']" />
-		<tm-modal v-show="showModal" v-on:click="showModalHandle(false)">
-			<scroll-view scroll-y="true" class="content-list">
-				<view class="list-item" v-for="(item, index) in planList" :class="{active: checkId === item.id}"
-					@click="checkItem($event, item.id)" :key="index">
-					<view>
-						<text>{{item.name}}({{item.startDate}} ~ {{item.endDate}})</text>
-						<view class="item-icon" :class="{icon2: Number(item.status) === 2}"
-							v-if="Number(item.status) !== 1">
-							{{Number(item.status) === 2 ? '进行中' : '已完成'}}
-						</view>
-					</view>
-					<image class="check-img" v-if="checkId === item.id" src="../../static/checkStatus.png"></image>
-				</view>
-			</scroll-view>
+		</scroll-view>
+		<tm-no-data v-if="depList.length === 0||copiedDepList.length==0" :textArr="['暂时没有内容可以展示哦', '请返回上一页面或尝试刷新页面']" />
+		<tm-modal v-show="showModal" v-on:click="showModalHandle(false)">
+			<scroll-view scroll-y="true" class="content-list">
+				<view class="list-item" v-for="(item, index) in planList" :class="{active: checkId === item.id}"
+					@click="checkItem($event, item.id)" :key="index">
+					<view>
+						<text>{{item.name}}({{item.startDate}} ~ {{item.endDate}})</text>
+						<view class="item-icon" :class="{icon2: Number(item.status) === 2}"
+							v-if="Number(item.status) !== 1">
+							{{Number(item.status) === 2 ? '进行中' : '已完成'}}
+						</view>
+					</view>
+					<image class="check-img" v-if="checkId === item.id" src="../../static/checkStatus.png"></image>
+				</view>
+			</scroll-view>
 		</tm-modal>
 		<tm-callback-listpage />
+
+		<uni-popup ref="popup" type="bottom" :maskClick="true">
+			<view class="selectableList">
+				<scroll-view scroll-y="true" class="listWrap">
+					<view :class="getClass(v.id)" v-for="(v,i) in selectables" @click="listClickHandle(v)">{{v.name}}
+					</view>
+				</scroll-view>
+				<view class="btnGroup">
+					<view class="cancelBtn btn" @click="btnGroupClickHandle(false)">取消</view>
+					<view class="confirmBtn btn" @click="btnGroupClickHandle(true)">确定</view>
+				</view>
+			</view>
+		</uni-popup>
+
 	</view>
 </template>
 
-<script>
-	import {
-		mapState
+<script>
+	import {
+		mapState
 	} from 'vuex';
 	import {
 		_stopPropagation
@@ -71,17 +103,39 @@
 				showModal: false,
 				planList: [],
 				checkId: '',
-				depList: [],
-				searchKey:'',
-				ifSearchMod:false
-				
+				depList: [],
+				copiedDepList: [], //筛选后结果
+				//筛选条件
+				filter: {
+					keyword: '',
+					status: [{
+						name: '全部',
+						id: 0
+					}]
+				},
+				ifSearchMod: false,
+				ifclearSearch: false,
+				selectables: [{
+						id: 0,
+						name: '全部'
+					},
+					{
+						id: 1,
+						name: '进行中'
+					},
+					{
+						id: 2,
+						name: '已完成'
+					}
+				]
+
 			};
 		},
-		computed: {
-			...mapState({
-				ifReloadPageData:state=>{
-					return state.checkList.ifReloadPageData
-				},
+		computed: {
+			...mapState({
+				ifReloadPageData: state => {
+					return state.checkList.ifReloadPageData
+				},
 			}),
 			createTitle: function() {
 				let item = this.planList.find((item) => item.id === this.checkId);
@@ -91,68 +145,152 @@
 				} else {
 					return '';
 				}
+			},
+			selectedStr() {
+				const {
+					status
+				} = this.filter;
+				return (status.map(t => t.name)).join(',')
+			},
+		},
+		watch: {
+			/**
+			 * @param {Boolen} newVal
+			 */
+			ifReloadPageData: function(newVal) {
+				if (newVal) {
+					this.getPageList();
+				}
+			},
+			filter(val, oldVal) {
+				if (val.keyword.length == 0) {
+					this.searchHandle();
+				}
 			}
-		},
-		watch:{
-			/**
-			 * @param {Boolen} newVal
-			 */
-			 ifReloadPageData:function(newVal){
-				 if(newVal){
-					 this.getPageList();
-				 }
-			 }
 		},
 		onLoad: function({
 			situationId,
 			situationType
 		}) {
-			this.situationType = situationType;
+			this.situationType = situationType;
 			this.situationId = situationId;
 			this.getPageList();
-		},
-		onHide(){
-			this.$store.commit('checkList/comChangeState', {
-				key: 'ifReloadPageData',
-				data: false
-			});
-		},
-		onUnload() {
-			this.$store.commit('checkList/comChangeState', {
-				key: 'ifReloadPageData',
-				data: false
-			});
 		},
-		methods: {
-			getPageList:function(){
-				this.dispatch('planList', {
-					situationId:this.situationId
-				}).then((data) => {
-					if (data && data.length > 0) {
-						this.planList = data;
-						let checkArr = data.filter((item) => Number(item.status) === 2).sort((a, b) => a
-							.createTime - b.createTime);
-						this.checkId = checkArr ? checkArr[checkArr.length - 1].id :
-							data.length > 0 ? data[0].id : '';
-						this.getDepList();
-					}
-				});
-			},
-			/**
-			 * @str string [noStart,checking,completed]
-			 */
-			getStatus:function(str){  //设置状态颜色
-			    switch(str){
-					 case '未分配':
-					      return 'status noStart'
-					 	 break;
-					 case '进行中':
-					      return 'status checking'
-					 	 break;
-					 case '已完成':
-					      return 'status completed'
-					 	 break;	
-				}
+		onHide() {
+			this.$store.commit('checkList/comChangeState', {
+				key: 'ifReloadPageData',
+				data: false
+			});
+		},
+		onUnload() {
+			this.$store.commit('checkList/comChangeState', {
+				key: 'ifReloadPageData',
+				data: false
+			});
+		},
+		methods: {
+			getClass(id) {
+				const ids = this.filter.status.map(item => item.id);
+				if (ids.indexOf(id) != -1) {
+					return "list on"
+				}
+				return "list"
+			},
+			/**
+			 * @param {boolean} flag true确定按钮点击,false取消按钮
+			 */
+			btnGroupClickHandle(flag) {
+				this.$refs.popup.close();
+				//清空搜索
+				this.filter = {
+					...this.filter,
+					keyword: ''
+				}
+			},
+			listClickHandle(item) {
+				const _filter = this.filter;
+				const {
+					status
+				} = _filter;
+				const index = _filter.status.findIndex(t => t.id == item.id);
+
+				if (item.id == 0) {
+					//全部
+					this.filter = {
+						...this.filter,
+						status: [{
+							name: '全部',
+							id: 0
+						}]
+					};
+					return;
+				}
+				//去除全部选项选中
+				status.splice(_filter.status.findIndex(t => t.id == 0), 1);
+
+				if (index != -1) {
+					status.splice(index, 1)
+				} else {
+					status.push({
+						name: item.name,
+						id: item.id
+					})
+				}
+				this.filter = _filter;
+			},
+			selecterHandle() {
+				this.$refs.popup.open();
+			},
+			searchInputHandle(val) {
+				this.filter = {
+					...this.filter,
+					keyword: val
+				};
+			},
+			searchHandle() {
+				let tempArr = this.depList;
+
+				if (this.filter.status[0].id == 2) {
+					//进行中
+					tempArr = this.depList.filter(item => item.status == 2);
+				}
+
+				if (this.filter.status[0].id == 1) {
+					//已完成
+					tempArr = this.depList.filter(item => item.status != 2);
+				}
+
+				this.copiedDepList = tempArr.filter(item => item.deptName.indexOf(this.filter.keyword) != -1);
+			},
+			getPageList: function() {
+				this.dispatch('planList', {
+					situationId: this.situationId
+				}).then((data) => {
+					if (data && data.length > 0) {
+						this.planList = data;
+						let checkArr = data.filter((item) => Number(item.status) === 2).sort((a, b) => a
+							.createTime - b.createTime);
+						this.checkId = checkArr ? checkArr[checkArr.length - 1].id :
+							data.length > 0 ? data[0].id : '';
+						this.getDepList();
+					}
+				});
+			},
+			/**
+			 * @str string [noStart,checking,completed]
+			 */
+			getStatus: function(str) { //设置状态颜色
+				switch (str) {
+					case '未分配':
+						return 'status noStart'
+						break;
+					case '进行中':
+						return 'status checking'
+						break;
+					case '已完成':
+						return 'status completed'
+						break;
+				}
 			},
 			checkItem: function(e, id) {
 				_stopPropagation(e);
@@ -166,9 +304,11 @@
 					situationType: this.situationType
 				}).then((data) => {
 					if (data) {
-						this.depList = data.sort((a, b) => {
+						const list = data.sort((a, b) => {
 							if (a.sort && b.sort) return a.sort - b.sort;
 						});
+						this.depList = list;
+						this.copiedDepList = list;
 						this.showModalHandle(false);
 					}
 				});
@@ -179,7 +319,7 @@
 			gotoCheckMainPointsPage({
 				checkId,
 				deptId,
-				finishedStatus,
+				finishedStatus,
 				pageTemplateId,
 			}) {
 				//跳转到查核要点
@@ -200,60 +340,204 @@
 
 <style lang="less" scoped>
 	.check-map-list-page {
-		position: relative;
-		padding-top: 30rpx;
-		.tm-top-menu {
-			width: 93%;
-			margin:0 auto;
-		}
-		.top-menu {
-			overflow: hidden;
-			display: flex;
-			flex-direction: row;
-			justify-content: center;
-			align-items: center;
-			height: 50rpx;
-		    margin-bottom: 20rpx;
-			image {
-				margin-left: 9.37rpx;
-				width: 12.5rpx;
-				height: 12.5rpx;
-			}
-		}
-		
-		&.preventScroll {
-			position: fixed;
+		position: relative;
+		padding-top: 30rpx;
+
+		.tm-top-menu {
+			width: 93%;
+			margin: 0 auto;
+		}
+
+		.top-menu {
+			overflow: hidden;
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+			height: 50rpx;
+			margin-bottom: 20rpx;
+
+			image {
+				margin-left: 9.37rpx;
+				width: 12.5rpx;
+				height: 12.5rpx;
+			}
+		}
+
+		.selectableList {
+			display: flex;
+			width: 100%;
+			flex-direction: column;
+			height: 50vh;
+			padding-top: 50rpx;
+			box-sizing: border-box;
+			border-radius: 25rpx 25rpx 0px 0px;
+			background-color: #FFFFFF;
+
+			.listWrap {
+				height: calc(50vh - 75rpx);
+				overflow-y: scroll;
+
+				.list {
+					height: 87.5rpx;
+					line-height: 87.5rpx;
+					text-align: center;
+					font-size: 30rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #8A8F99;
+
+					&.on {
+						font-weight: 500;
+						color: #3377FF;
+					}
+				}
+			}
+
+			.btnGroup {
+				display: flex;
+				width: 100%;
+				flex-direction: row;
+				justify-content: center;
+				align-items: center;
+
+				.btn {
+					width: 50%;
+					height: 75rpx;
+					line-height: 75rpx;
+					text-align: center;
+					font-size: 22.5rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #3377FF;
+				}
+
+				.cancelBtn {
+					border-top: 0.62rpx solid #DADEE6;
+				}
+
+				.confirmBtn {
+					color: #FFFFFF;
+					background: #3377FF;
+				}
+			}
+		}
+
+		.searchBar {
+			width: 93%;
+			margin: 0 auto;
+
+			.filter {
+				display: flex;
+				flex-direction: row;
+				justify-content: space-between;
+				align-items: center;
+				margin-bottom: 15rpx;
+				padding: 0 25rpx;
+				background: #FFFFFF;
+
+				.selecter {
+					display: flex;
+					width: 25%;
+					height: 70rpx;
+					flex-direction: row;
+					justify-content: space-between;
+					align-items: center;
+					padding-right: 25rpx;
+					border-right: 0.62rpx solid #DADEE6;
+
+					&>text {
+						width: 112.5rpx;
+						font-size: 25rpx;
+						font-family: SourceHanSansCN-Medium, SourceHanSansCN;
+						font-weight: 500;
+						color: #292C33;
+						text-overflow: ellipsis;
+						overflow: hidden;
+						white-space: nowrap;
+
+					}
+
+					&>image {
+						width: 11.25rpx;
+						height: 7.5rpx;
+					}
+				}
+
+				.searchBar {
+					display: flex;
+					width: 75%;
+					flex-direction: row;
+					align-items: center;
+					height: 70rpx;
+					padding-left: 25rpx;
+
+					.serachIcon {
+						width: 25rpx;
+						height: 25rpx;
+					}
+
+					.searchVal {
+						width: 79%;
+						padding-left: 25rpx;
+						font-size: 25rpx;
+						font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						font-weight: 400;
+						color: #292C33;
+					}
+
+					.searchBtn {
+						padding-left: 25rpx;
+						font-size: 25rpx;
+						font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						font-weight: 400;
+						color: #3377FF;
+						white-space: nowrap;
+						border-left: 1rpx solid #DADEE6;
+					}
+				}
+			}
+		}
+
+		&.preventScroll {
+			position: fixed;
 		}
 	}
 
-	.check-map-list {
+	.check-map-list {
 		height: 100%;
+
 		.item {
 			position: relative;
-			.title-wrap {
-				.scoreAndStatus {
-					 position: absolute;
-					 right:20rpx;
-					 .status {
-					 	display: flex;
-					 	justify-content: center;
-					 	width: 150rpx;
-					 	height: 35rpx;
-					 	font-size: 17.5rpx;
-					 	font-family: SourceHanSansCN-Medium, SourceHanSansCN;
-					 	font-weight: 500;
-					 	color: #FFFFFF;
-					 	border-radius: 20rpx;
-						&.noStart {
-							background-color:#eee;
-						}
-						&.checking {
-							background-color:#FFCC66;
-						}
-						&.completed {
-							background-color:#29CC96;
-						}
-					 }
+
+			.title-wrap {
+				.scoreAndStatus {
+					position: absolute;
+					right: 20rpx;
+
+					.status {
+						display: flex;
+						justify-content: center;
+						width: 150rpx;
+						height: 35rpx;
+						font-size: 17.5rpx;
+						font-family: SourceHanSansCN-Medium, SourceHanSansCN;
+						font-weight: 500;
+						color: #FFFFFF;
+						border-radius: 20rpx;
+
+						&.noStart {
+							background-color: #eee;
+						}
+
+						&.checking {
+							background-color: #FFCC66;
+						}
+
+						&.completed {
+							background-color: #29CC96;
+						}
+					}
 				}
 			}
 		}
@@ -294,11 +578,11 @@
 	}
 
 	.content-list {
-		padding-top: 50rpx;
+		padding-top: 50rpx;
 		padding-bottom: 50rpx;
 		width: 100%;
-		height: 70vh;
-		overflow-y: scroll;
+		height: 70vh;
+		overflow-y: scroll;
 		box-sizing: border-box;
 		background-color: #fff;
 

+ 6 - 4
pages/checkMainPoints/checkMainPoints.vue

@@ -134,7 +134,7 @@
 		</view>
 		<tm-callback-listpage />
 		<view class="bottomBtnGroup" v-if="!ifSearchMod">
-			<view v-if="!subtotalScore&&subtotalScore != 0" class="score">
+			<view v-if="!isShowSubtotal" class="score">
 				<view class="box">
 					<text class="label">得分</text>
 					<text class="currentScore">{{currentScore}}</text>
@@ -145,7 +145,7 @@
 					<text class="totalScore">{{totalScore}}</text>
 				</view>
 			</view>
-			<view v-if="subtotalScore != null&&subtotalScore>=0" class="score scoreTypeTwo">
+			<view v-if="isShowSubtotal" class="score scoreTypeTwo">
 				<view class="box">
 					<view class="rowOne">
 						<text class="currentScore">{{currentScore}}</text>
@@ -211,7 +211,8 @@
 				totalScore: 0,
 				currentScore: 0,
 				subtotalScore: 0, //小计得分
-				totalSubtotalScore: 0, //小计总分
+				totalSubtotalScore: 0, //小计总分
+				isShowSubtotal:false,//是否展示小计
 				animationData: {}, //动画对象
 				ifOpenFilter: false,
 				searchKey: '', //搜索关键字
@@ -656,7 +657,8 @@
 						this.copyDetailList = renderList;
 						this.currentScore = data.getScore;
 						this.totalScore = data.totalScore;
-						this.subtotalScore = data.subtotalScore;
+						this.subtotalScore = data.subtotalScore;
+						this.isShowSubtotal = data.isShowSubtotal;
 						this.totalSubtotalScore = data.totalSubtotalScore;
 						this.checkDetailMapResponses = renderList;
 						renderList.map(({

+ 103 - 15
pages/creatingSituations/components/checkRent.vue

@@ -1,8 +1,14 @@
 <template>
 	<view class="check-rent">
 		<view class="title">请指定负责查核的查核组</view>
+		<view class="searchBar">
+			<image class="serachIcon" src="../../../static/searchIcon.png" mode=""></image>
+			<tm-input class="searchVal" @onChange="searchInputHandle" placeholder="搜索查核组名称" ></tm-input>
+			<view class="searchBtn" @click="searchHandle">搜索</view>
+		</view>
 		<view class="list">
 			<view class="item" 
+			    v-if="checkRent.list.length>0"
 				v-for="(item, index) in checkRent.list" 
 				:key="index"
 				@click="openItemHandle(item.id)">
@@ -34,6 +40,10 @@
 					</view>
 				</view>
 			</view>
+			<view class="empty" v-if="checkRent.list.length==0">
+			    <image src="../../../static/no-data.png" mode=""></image>
+				<text>暂无内容</text>
+			</view>
 		</view>
 	</view>
 </template>
@@ -47,7 +57,8 @@
 	export default {
 		data() {
 			return {
-				openItems: []
+				openItems: [],
+				keyword:''
 			}
 		},
 		computed: {
@@ -58,6 +69,13 @@
 				editConfig: state => state.creatingSituations.editConfig
 			})
 		},
+		watch:{
+			keyword(val,oldVal){
+				  if(val.length == 0){
+					 this.getData();
+				  }
+			}
+		},
 		created:function(){
 			// 编辑的时候不用获取数据
 			if(this.editConfig && arrayEquality(this.condition.conditionIds, this.editConfig.condition.conditionIds) && this.editConfig.checkRent) {
@@ -67,23 +85,45 @@
 					data: this.editConfig.checkRent
 				});
 			} else if(this.needReload) { // 点击上一步不用获取数据
-				this.$store.dispatch({
-					type: 'creatingSituations/commActions',
-					key: 'checkGroupList',
-					data: { conditionIds: this.condition.conditionIds}
-				}).then((data)=> {
-					if(data) {
-						this.myCommit('list', data);
-						const {checkedItem} = this.checkRent;
-						if(checkedItem.id) { // 如果选中过,要去更新数据
-							let obj = data.find(({id})=>id === checkedItem.id);
-							this.myCommit('checkedItem', obj?obj:{id:null});
-						}
-					} 
-				});
+				  this.getData();
 			}
 		},
 		methods: {
+			/**
+			 * @param {string} val
+			 */
+			searchInputHandle(val){
+				  this.keyword = val;
+			},
+			searchHandle(){
+				  const {list,checkedItem} = this.checkRent;
+				  const filtedList = list.filter(t=>t.name.indexOf(this.keyword) != -1);
+				  
+				  this.myCommit('list', filtedList);
+				  if(checkedItem.id) { // 如果选中过,要去更新数据
+				  	let obj = filtedList.find(({id})=>id === checkedItem.id);
+				  	this.myCommit('checkedItem', obj?obj:{id:null});
+				  }  
+			},
+			/**
+			 * @param {string} searchKey
+			 */
+			getData(){
+				 this.$store.dispatch({
+				 	type: 'creatingSituations/commActions',
+				 	key: 'checkGroupList',
+				 	data:this.condition.conditionIds
+				 }).then((data)=> {
+				 	if(data) {
+				 		this.myCommit('list', data);
+				 		const {checkedItem} = this.checkRent;
+				 		if(checkedItem.id) { // 如果选中过,要去更新数据
+				 			let obj = data.find(({id})=>id === checkedItem.id);
+				 			this.myCommit('checkedItem', obj?obj:{id:null});
+				 		}
+				 	} 
+				 });
+			},
 			openItemHandle: function(key) {
 				this.openItems = arrFilter(key, this.openItems);
 			},
@@ -111,7 +151,55 @@
 
 <style lang="less">
 	.check-rent {
+		.searchBar {
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			height: 87.5rpx;
+			padding: 0 25rpx;
+			margin-bottom: 15rpx;
+			background: #FFFFFF;
+			.serachIcon {
+				width: 30rpx;
+				height:30rpx;
+			}
+			.searchVal {
+				width:85%;
+				padding-left: 25rpx;
+				font-size: 25rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #292C33;
+			
+			}
+			.searchBtn {
+				padding-left: 25rpx;
+				font-size: 25rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #3377FF;
+				border-left: 1rpx solid #DADEE6;
+			}
+		}
 		.list {
+			.empty {
+				display: flex;
+				height: 500rpx;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+				&>image {
+					width: 175rpx;
+					height: 190rpx;
+					margin-bottom: 40rpx;
+				}
+				&>text {
+					font-size: 22.5rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #828899;
+				}
+			}
 			.item {
 				display: flex;
 				flex-direction: row;

+ 1 - 1
pages/creatingSituations/server.js

@@ -11,7 +11,7 @@ const requestList = {
 	// 查核组列表
   checkGroupList: {
     method: 'POST',
-    url: 'situation/checkGroupList',
+    url: 'situation/getCheckGroupByCondition ',
   },
 	// 查核地图列表
   checkDeptList: {

+ 575 - 279
pages/editCheckList/editCheckList.vue

@@ -1,63 +1,96 @@
 <template>
-	<view class="check-map-list">
-		<scroll-view :class="[ifAllPlanListHasDistribution==true?'scroll-y noBottom':'scroll-y']" scroll-y="true" v-if="checkList.length > 0">
-			<view class="item" v-for="(item, index) in checkList" :key="index">
-				<view 
-				    v-if="item.finishedStatus != 1"
-					:class="{'checkPoint':true,checked:(checkedList.findIndex(t=>t.deptId == item.deptId) != -1)}"
-					@click="checkedHandle(item)">
-					<image class="innerImg" v-if="(checkedList.findIndex(t=>t.deptId == item.deptId) != -1)"
-						src="../../static/check-checkbox.png" mode=""></image>
+	<view class="editCheckList">
+		<view class="searchBar" v-if="checkList.length>0">
+			<view class="filter">
+				<view class="selecter" @click="selecterHandle">
+					<text>{{selectedStr}}</text>
+					<image src="../../static/fillBlackArrow.png" mode=""></image>
 				</view>
-				<view class="title-wrap">
-					<text>{{item.deptName}}</text>
-					<view>
-						<image src="../../static/icon-map.png"></image>
-						<text>{{item.deptClassName}}</text>
-					</view>
-					<view :class="getStatus(item.completeDes)"  >{{item.completeDes}}</view>
-				</view>
-				<view class="content">
-					<text>{{item.decs}}</text>
-					<text>
-						要点概览:{{item.checkPointNames}}
-					</text>
+				<view class="searchBar">
+					<image class="serachIcon" src="../../static/searchIcon.png" mode=""></image>
+					<tm-input class="searchVal" :clear="ifclearSearch" @onChange="searchInputHandle"
+						placeholder="请输入单位名称"></tm-input>
+					<view class="searchBtn" @click="searchHandle">搜索</view>
 				</view>
-				<view class="footer">
-					<view class="row" @click="checkEdit(item, index, '指派查核人员')">
-						<text class="label">查核人</text>
-						<view class="content">
-							<text :class="['base-text', item.empName ? 'black-color' : '']">
-								{{ item.empName?item.empName : '选择查核成员'}}
-							</text>
+			</view>
+		</view>
+	
+		<view class="check-map-list">
+			<scroll-view :class="[ifAllPlanListHasDistribution==true?'scroll-y noBottom':'scroll-y']" scroll-y="true"
+				v-if="checkList.length > 0">
+				<view class="item" v-for="(item, index) in copiedCheckList" :key="index">
+					<view v-if="item.finishedStatus != 1"
+						:class="{'checkPoint':true,checked:(checkedList.findIndex(t=>t.deptId == item.deptId) != -1)}"
+						@click="checkedHandle(item)">
+						<image class="innerImg" v-if="(checkedList.findIndex(t=>t.deptId == item.deptId) != -1)"
+							src="../../static/check-checkbox.png" mode=""></image>
+					</view>
+					<view class="title-wrap">
+						<text>{{item.deptName}}</text>
+						<view>
+							<image src="../../static/icon-map.png"></image>
+							<text>{{item.deptClassName}}</text>
 						</view>
-						<image class="arrow" src="/static/images/icon-more.png"></image>
+						<view :class="getStatus(item.completeDes)">{{item.completeDes}}</view>
+					</view>
+					<view class="content">
+						<text>{{item.decs}}</text>
+						<text>
+							要点概览:{{item.checkPointNames}}
+						</text>
 					</view>
-					<view class="row" @click="checkEdit(item, index, '设置查核时间')">
-						<text class="label">计划时间</text>
-						<view class="content">
-							<text :class="['base-text', item.startDate ? 'black-color' : '']">
-								{{ item.startDate ? item.startDate : '选择起始时间' }}
-							</text>
-							<text class="center-text">至</text>
-							<text :class="['base-text', item.endDate ? 'black-color' : '']">
-								{{ item.endDate ? item.endDate : '选择结束时间' }}
-							</text>
+					<view class="footer">
+						<view class="row" @click="checkEdit(item, index, '指派查核人员')">
+							<text class="label">查核人</text>
+							<view class="content">
+								<text :class="['base-text', item.empName ? 'black-color' : '']">
+									{{ item.empName?item.empName : '选择查核成员'}}
+								</text>
+							</view>
+							<image class="arrow" src="/static/images/icon-more.png"></image>
+						</view>
+						<view class="row" @click="checkEdit(item, index, '设置查核时间')">
+							<text class="label">计划时间</text>
+							<view class="content">
+								<text :class="['base-text', item.startDate ? 'black-color' : '']">
+									{{ item.startDate ? item.startDate : '选择起始时间' }}
+								</text>
+								<text class="center-text">至</text>
+								<text :class="['base-text', item.endDate ? 'black-color' : '']">
+									{{ item.endDate ? item.endDate : '选择结束时间' }}
+								</text>
+							</view>
+							<image class="arrow" src="/static/images/icon-more.png"></image>
 						</view>
-						<image class="arrow" src="/static/images/icon-more.png"></image>
 					</view>
 				</view>
+			</scroll-view>
+			<view class="null" v-else>暂无数据</view>
+			<view class="fixed-buttom-btn" @click="submit" v-if="multiple == 'true'">
+				<text class="btn-text">完成</text>
+			</view>
+			<view class="bottomBtnGroup" v-if="multiple != 'true'">
+				<view class="selectAll" @click="bottomBtnClickHandle('left')">{{ifSlectedAllCheckList?'取消':'全选'}}</view>
+				<view class="leftBtn" @click="bottomBtnClickHandle('middle')">{{`(已选${checkedList.length}项)撤销分配`}}
+				</view>
+				<view class="rightBtn" @click="bottomBtnClickHandle('right')">{{`(已选${checkedList.length}项)批量分配`}}
+				</view>
 			</view>
-		</scroll-view>
-		<view class="null" v-else>暂无数据</view>
-		<view class="fixed-buttom-btn" @click="submit" v-if="multiple == 'true'">
-			<text class="btn-text">完成</text>
-		</view>
-		<view class="bottomBtnGroup" v-if="multiple != 'true'">
-			<view class="selectAll" @click="bottomBtnClickHandle('left')">{{ifSlectedAllCheckList?'取消':'全选'}}</view>
-			<view class="leftBtn" @click="bottomBtnClickHandle('middle')">{{`(已选${checkedList.length}项)撤销分配`}}</view>
-			<view class="rightBtn" @click="bottomBtnClickHandle('right')">{{`(已选${checkedList.length}项)批量分配`}}</view>
-		</view>
+		</view>
+		
+		<uni-popup ref="popup" type="bottom" :maskClick="true">
+			<view class="selectableList">
+				<scroll-view scroll-y="true" class="listWrap">
+					<view :class="getClass(v.id)" v-for="(v,i) in selectables" @click="listClickHandle(v)">{{v.name}}
+					</view>
+				</scroll-view>
+				<view class="btnGroup">
+					<view class="cancelBtn btn" @click="btnGroupClickHandle(false)">取消</view>
+					<view class="confirmBtn btn" @click="btnGroupClickHandle(true)">确定</view>
+				</view>
+			</view>
+		</uni-popup>
+		
 	</view>
 </template>
 
@@ -76,16 +109,29 @@
 			ifAllPlanListHasDistribution: function() {
 				const tempData = this.checkList.filter(item => (!item.empId && !item.empName));
 				return tempData.length == 0
-			},
-			ifSlectedAllCheckList:function(){
-				 if(this.checkedList.length == this.checkList.length){ //选中集合==总集合
-				        this.ifCheckAll = true;
-					    return true;
-				 }else {
-					    this.ifCheckAll = false;
-					    return false; 
-				 }
-			}
+			},
+			ifSlectedAllCheckList: function() {
+				if (this.checkedList.length == this.checkList.length) { //选中集合==总集合
+					this.ifCheckAll = true;
+					return true;
+				} else {
+					this.ifCheckAll = false;
+					return false;
+				}
+			},
+			selectedStr() {
+				const {
+					status
+				} = this.filter;
+				return (status.map(t => t.name)).join(',')
+			},
+		},
+		watch:{
+			filter(val, oldVal) {
+				if (val.keyword.length == 0) {
+					this.searchHandle();
+				}
+			}
 		},
 		data() {
 			return {
@@ -104,11 +150,33 @@
 				hasStartedCheck: [], //查核已经开始的集合
 				ifInit: null,
 				ifshowBottom: false,
-				checkedList: [], //批量选中的集合
-				ifCheckAll:false,//是否全选
+				checkedList: [], //批量选中的集合
+				ifCheckAll: false, //是否全选
+				copiedCheckList:[],
+				ifclearSearch: false,
+				filter: {
+					keyword: '',
+					status: [{
+						name: '全部',
+						id: 0
+					}]
+				},
+				selectables: [{
+						id: 0,
+						name: '全部'
+					},
+					{
+						id: 1,
+						name: '进行中'
+					},
+					{
+						id: 2,
+						name: '未分配'
+					}
+				]
 			};
-		},
-	
+		},
+
 		onLoad({
 			situationId,
 			checkId,
@@ -116,7 +184,7 @@
 			startDate,
 			endDate,
 			multiple,
-			situationType,
+			situationType,
 			checkNo
 		}) {
 			this.init(situationId,
@@ -124,10 +192,10 @@
 				checkGroupId,
 				startDate,
 				endDate,
-				multiple,
-				situationType,
-				checkNo
-		    );
+				multiple,
+				situationType,
+				checkNo
+			);
 		},
 		onShow() {
 			let pages = getCurrentPages(); // 获取当前页面栈
@@ -140,17 +208,20 @@
 					this.checkGroupId,
 					this.startDate,
 					this.endDate,
-					this.multiple,
-					this.situationType,
+					this.multiple,
+					this.situationType,
 					this.checkNo
 				) // A页面 method中的方法,用来刷新页面A
 			}
 
 		},
-		mounted() {},
-		onUnload() {
-			//页面卸载或返回
-			this.$store.commit('planList/comChangeState',{key:'ifReloadData',data:true})
+		mounted() {},
+		onUnload() {
+			//页面卸载或返回
+			this.$store.commit('planList/comChangeState', {
+				key: 'ifReloadData',
+				data: true
+			})
 		},
 		methods: {
 			init(situationId,
@@ -161,16 +232,16 @@
 				multiple,
 				situationType,
 				checkNo) {
-						this.getCheckList(checkId, situationType);
-						this.checkGroupId = checkGroupId ? +checkGroupId : 0;
-						this.situationId = situationId ? +situationId : 0;
-						this.checkId = checkId ? +checkId : 0;
-						this.startDate = startDate;
-						this.endDate = endDate;
-						this.multiple = multiple;
-						this.checkedList = [];
-						this.situationType = situationType;
-						this.checkNo = checkNo;
+				this.getCheckList(checkId, situationType);
+				this.checkGroupId = checkGroupId ? +checkGroupId : 0;
+				this.situationId = situationId ? +situationId : 0;
+				this.checkId = checkId ? +checkId : 0;
+				this.startDate = startDate;
+				this.endDate = endDate;
+				this.multiple = multiple;
+				this.checkedList = [];
+				this.situationType = situationType;
+				this.checkNo = checkNo;
 			},
 			ifStartCheck(timeStr) {
 				if (timeStr) {
@@ -185,47 +256,120 @@
 				this.ifshowBottom = true;
 				return true;
 
-			},
-			/**
-			 * @str string [noStart,checking,completed]
-			 */
-			getStatus:function(str){  //设置状态颜色
-			    switch(str){
-					 case '未分配':
-					      return 'status noStart'
-					 	 break;
-					 case '进行中':
-					      return 'status checking'
-					 	 break;
-					 case '已完成':
-					      return 'status completed'
-					 	 break;	
-				}
-			},
-			batchCancelDistri(){ //批量撤销
-			      const _that = this;
-				  this.$store.dispatch({
-				  	type: 'editCheckList/commActions',
-				  	key: "batchCancelCheckDistribution",
-				  	data: {
-				  		checkId:this.checkId,
-				  		deptIds:this.checkedList.map(t=>t.deptId)
-				  	}
-				  }).then(data=>{
-					    if(data){
-							  uni.showModal({
-							  	title: '提示',
-							  	content: '撤销分配成功!',
-							  	showCancel: false,
-								success(res) {
-									if(res.confirm){
-										  _that.checkedList = [];
-										  _that.getCheckList(_that.checkId,_that.situationType);
-									}
-								}
-							  });
-						}
-				  })
+			},
+			/**
+			 * @str string [noStart,checking,completed]
+			 */
+			getStatus: function(str) { //设置状态颜色
+				switch (str) {
+					case '未分配':
+						return 'status noStart'
+						break;
+					case '进行中':
+						return 'status checking'
+						break;
+					case '已完成':
+						return 'status completed'
+						break;
+				}
+			},
+			getClass(id) {
+				const ids = this.filter.status.map(item => item.id);
+				if (ids.indexOf(id) != -1) {
+					return "list on"
+				}
+				return "list"
+			},
+			/**
+			 * @param {boolean} flag true确定按钮点击,false取消按钮
+			 */
+			btnGroupClickHandle(flag) {
+				this.$refs.popup.close();
+				//清空搜索
+				this.filter = {
+					...this.filter,
+					keyword: ''
+				}
+			},
+			listClickHandle(item) {
+					const _filter = this.filter;
+					const {
+						status
+					} = _filter;
+					const index = _filter.status.findIndex(t => t.id == item.id);
+
+					if (item.id == 0) {
+						//全部
+						this.filter = {
+							...this.filter,
+							status: [{
+								name: '全部',
+								id: 0
+							}]
+						};
+						return;
+					}
+					//去除全部选项选中
+					status.splice(_filter.status.findIndex(t => t.id == 0), 1);
+
+					if (index != -1) {
+						status.splice(index, 1)
+					} else {
+						status.push({
+							name: item.name,
+							id: item.id
+						})
+					}
+					this.filter = _filter;
+			},
+			selecterHandle() {
+				this.$refs.popup.open();
+			},
+			searchInputHandle(val) {
+				this.filter = {
+					...this.filter,
+					keyword: val
+				};
+			},
+			searchHandle() {
+					let tempArr = this.checkList;
+
+					if (this.filter.status[0].id == 1) {
+						//进行中
+						tempArr = this.checkList.filter(item => item.completeDes == '进行中');
+					}
+
+					if (this.filter.status[0].id == 2) {
+						//未分配
+						tempArr = this.checkList.filter(item => item.completeDes == '未分配');
+					}
+
+					this.copiedCheckList = tempArr.filter(item => item.deptName.indexOf(this.filter.keyword) != -1);
+			},
+			batchCancelDistri() { //批量撤销
+				const _that = this;
+				this.$store.dispatch({
+					type: 'editCheckList/commActions',
+					key: "batchCancelCheckDistribution",
+					data: {
+						checkId: this.checkId,
+						deptIds: this.checkedList.map(t => t.deptId)
+					}
+				}).then(data => {
+					if (data) {
+						uni.showModal({
+							title: '提示',
+							content: '撤销分配成功!',
+							showCancel: false,
+							success(res) {
+								if (res.confirm) {
+									_that.checkedList = [];
+									_that.getCheckList(_that.checkId, _that.situationType);
+								}
+							}
+						});
+					}
+				})
 			},
 			bottomBtnClickHandle(key) {
 				let details = {
@@ -235,9 +379,9 @@
 					empName: '',
 					startDate: '',
 					endDate: '',
-					situationType: this.situationType,
-					checkNo:this.checkNo,
-					checkedList: this.checkedList.map(t=>t.deptId),
+					situationType: this.situationType,
+					checkNo: this.checkNo,
+					checkedList: this.checkedList.map(t => t.deptId),
 					situationId: this.situationId, //  情境id (批量修改有,不然为0)
 					checkId: this.checkId, // 查核id
 					checkGroupId: this.checkGroupId, //查核组id
@@ -245,53 +389,53 @@
 					planEndDate: this.endDate // 计划结束时间
 				}
 
-				if (key == 'left') {  //全选
-                    this.ifCheckAll = !this.ifCheckAll;
-					if(this.ifCheckAll){
-						this.checkedList = this.checkList;
-					}else {
-						this.checkedList = [];
+				if (key == 'left') { //全选
+					this.ifCheckAll = !this.ifCheckAll;
+					if (this.ifCheckAll) {
+						this.checkedList = this.checkList;
+					} else {
+						this.checkedList = [];
 					}
-					
-					
-				}
-				
-				if(key == 'middle'){  //批量撤销
-					if(this.checkedList.findIndex(item=>item.completeDes == '未分配') != -1){
-						//选中项包含未分配
-						uni.showModal({
-							title: '提示',
-							content: '选择的病区里包含未分配项!是否继续操作?',
-							success:(res)=>{
-								if (res.confirm) {
-								     this.batchCancelDistri(); 
-								}
-							}
-						});
-					}else {
-						this.batchCancelDistri();
-					}
-				}
-				
-				if (key == 'right') {  //批量分配
-					if (this.checkedList.length > 0) {
-						if(this.checkedList.findIndex(item=>item.completeDes == '进行中') != -1){
-							//选中项包含已分配
-							uni.showModal({
-								title: '提示',
-								content: '选择的病区里包含已进行中项!是否继续操作?',
-								success:(res)=>{
-									if (res.confirm) {
-									     uni.navigateTo({
-									     	url: `/pages/batchDistribution/batchDistribution?details=${encodeURIComponent(JSON.stringify(details))}`
-									     });
-									}
-								}
-							});
-						}else {
-							uni.navigateTo({
-								url: `/pages/batchDistribution/batchDistribution?details=${encodeURIComponent(JSON.stringify(details))}`
-							});
+
+
+				}
+
+				if (key == 'middle') { //批量撤销
+					if (this.checkedList.findIndex(item => item.completeDes == '未分配') != -1) {
+						//选中项包含未分配
+						uni.showModal({
+							title: '提示',
+							content: '选择的病区里包含未分配项!是否继续操作?',
+							success: (res) => {
+								if (res.confirm) {
+									this.batchCancelDistri();
+								}
+							}
+						});
+					} else {
+						this.batchCancelDistri();
+					}
+				}
+
+				if (key == 'right') { //批量分配
+					if (this.checkedList.length > 0) {
+						if (this.checkedList.findIndex(item => item.completeDes == '进行中') != -1) {
+							//选中项包含已分配
+							uni.showModal({
+								title: '提示',
+								content: '选择的病区里包含已进行中项!是否继续操作?',
+								success: (res) => {
+									if (res.confirm) {
+										uni.navigateTo({
+											url: `/pages/batchDistribution/batchDistribution?details=${encodeURIComponent(JSON.stringify(details))}`
+										});
+									}
+								}
+							});
+						} else {
+							uni.navigateTo({
+								url: `/pages/batchDistribution/batchDistribution?details=${encodeURIComponent(JSON.stringify(details))}`
+							});
 						}
 					} else {
 						uni.showModal({
@@ -303,35 +447,35 @@
 				}
 			},
 			checkedHandle(item) {
-				let temp = this.checkedList;
-				let index = temp.findIndex(val=>val.deptId == item.deptId)
-				if ( index != -1) {
+				let temp = this.checkedList;
+				let index = temp.findIndex(val => val.deptId == item.deptId)
+				if (index != -1) {
 					temp.splice(index, 1);
 					this.checkedList = temp;
 				} else {
 					this.checkedList = this.checkedList.concat([item]);
 				}
 			},
-			// 完成
-			submit(){
-				const hadDistributionList = this.checkList.filter((item,index)=>{
-					 return item.isDistribution||item.empId;
-				});
-				const commitData = hadDistributionList.map(item=>({
-					     "checkId": item.checkId, 
-					     "deptId": item.deptId,
-					     "empId":item.empId,
-					     "empName":item.empName,
-					     "startDate":item.startDate,
-					     "endDate": item.endDate,
-					     "categoryIds":item.categoryIds
-					   
-				}));
-				// console.log({commitData});
-				this.batchDistribute(commitData);
-				
+			// 完成
+			submit() {
+				const hadDistributionList = this.checkList.filter((item, index) => {
+					return item.isDistribution || item.empId;
+				});
+				const commitData = hadDistributionList.map(item => ({
+					"checkId": item.checkId,
+					"deptId": item.deptId,
+					"empId": item.empId,
+					"empName": item.empName,
+					"startDate": item.startDate,
+					"endDate": item.endDate,
+					"categoryIds": item.categoryIds
+
+				}));
+				// console.log({commitData});
+				this.batchDistribute(commitData);
+
 			},
-			
+
 			/**
 			 * 获取时间字符串
 			 * @param {Number} startTimestamp 计划开始时间戳
@@ -387,8 +531,8 @@
 						empName,
 						startDate,
 						endDate,
-						deptId,
-						categoryId,
+						deptId,
+						categoryId,
 						isDistribution,
 					} = data;
 					let details = {
@@ -397,12 +541,12 @@
 						empId,
 						empName,
 						startDate,
-						endDate,
-						deptId,
-						categoryId,
+						endDate,
+						deptId,
+						categoryId,
 						isDistribution,
-						situationType: this.situationType,
-						checkNo:this.checkNo,
+						situationType: this.situationType,
+						checkNo: this.checkNo,
 						situationId: this.situationId, //  情境id (批量修改有,不然为0)
 						checkId: this.checkId, // 查核id
 						checkGroupId: this.checkGroupId, //查核组id
@@ -410,7 +554,7 @@
 						planEndDate: this.endDate // 计划结束时间
 					}
 
-			
+
 					if (this.multiple == 'true') {
 						uni.navigateTo({
 							url: `/pages/allocationPerson/allocationPerson?details=${encodeURIComponent(JSON.stringify(details))}`
@@ -429,7 +573,8 @@
 				}
 			},
 			// 获取查核列表
-			getCheckList(checkId, situationType) {
+			getCheckList(checkId, situationType) {
+				const that = this;
 				this.$store.dispatch({
 					type: 'editCheckList/commActions',
 					key: "getCheckList",
@@ -442,21 +587,25 @@
 						type: "commActions",
 						key: "getDateStr",
 					}).then((dateStr) => {
-						if (dateStr) {
+						if (dateStr) {
+							const _data = data.map(item => {
+								if (item.endDate && moment(item.endDate)
+									.valueOf() < moment(dateStr).valueOf()) {
+									return {
+										...item,
+										completeState: true // true:说明计划已结束, 不能编辑查核人和计划时间
+									}
+								} else {
+									return item
+								}
+							});
+							//copiedCheckList用于搜索/筛选
+							that.copiedCheckList = _data;
+							
 							this.$store.commit({
 								type: 'editCheckList/comChangeState',
 								key: 'checkList',
-								data: (data || []).map(item => {
-									if (item.endDate && moment(item.endDate)
-										.valueOf() < moment(dateStr).valueOf()) {
-										return {
-											...item,
-											completeState: true // true:说明计划已结束, 不能编辑查核人和计划时间
-										}
-									} else {
-										return item
-									}
-								})
+								data: _data
 							});
 						}
 					});
@@ -480,48 +629,192 @@
 	}
 </script>
 
-<style lang="less">
-	.check-map-list {
+<style lang="less" scoped>
+	.editCheckList {
+		padding-top: 30rpx;
+	}
+	
+	.selectableList {
 		display: flex;
+		width: 100%;
+		flex-direction: column;
+		height: 50vh;
+		padding-top: 50rpx;
+		box-sizing: border-box;
+		border-radius: 25rpx 25rpx 0px 0px;
+		background-color: #FFFFFF;
+	
+		.listWrap {
+			height: calc(50vh - 75rpx);
+			overflow-y: scroll;
+	
+			.list {
+				height: 87.5rpx;
+				line-height: 87.5rpx;
+				text-align: center;
+				font-size: 30rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #8A8F99;
+	
+				&.on {
+					font-weight: 500;
+					color: #3377FF;
+				}
+			}
+		}
+	
+		.btnGroup {
+			display: flex;
+			width: 100%;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+	
+			.btn {
+				width: 50%;
+				height: 75rpx;
+				line-height: 75rpx;
+				text-align: center;
+				font-size: 22.5rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #3377FF;
+			}
+	
+			.cancelBtn {
+				border-top: 0.62rpx solid #DADEE6;
+			}
+	
+			.confirmBtn {
+				color: #FFFFFF;
+				background: #3377FF;
+			}
+		}
+	}
+	
+	.searchBar {
+		width: 93%;
+		margin: 0 auto;
+
+		.filter {
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			align-items: center;
+			margin-bottom: 15rpx;
+			padding: 0 25rpx;
+			background: #FFFFFF;
+
+			.selecter {
+				display: flex;
+				width: 25%;
+				height: 70rpx;
+				flex-direction: row;
+				justify-content: space-between;
+				align-items: center;
+				padding-right: 25rpx;
+				border-right: 0.62rpx solid #DADEE6;
+
+				&>text {
+					width: 112.5rpx;
+					font-size: 25rpx;
+					font-family: SourceHanSansCN-Medium, SourceHanSansCN;
+					font-weight: 500;
+					color: #292C33;
+					text-overflow: ellipsis;
+					overflow: hidden;
+					white-space: nowrap;
+
+				}
+
+				&>image {
+					width: 11.25rpx;
+					height: 7.5rpx;
+				}
+			}
+
+			.searchBar {
+				display: flex;
+				width: 75%;
+				flex-direction: row;
+				align-items: center;
+				height: 70rpx;
+				padding-left: 25rpx;
+
+				.serachIcon {
+					width: 25rpx;
+					height: 25rpx;
+				}
+
+				.searchVal {
+					width: 79%;
+					padding-left: 25rpx;
+					font-size: 25rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #292C33;
+				}
+
+				.searchBtn {
+					padding-left: 25rpx;
+					font-size: 25rpx;
+					font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					font-weight: 400;
+					color: #3377FF;
+					white-space: nowrap;
+					border-left: 1rpx solid #DADEE6;
+				}
+			}
+		}
+	}
+
+	.check-map-list {
+		display: flex;
 		flex-direction: column;
 		height: 100%;
-		.scroll-y {
-			flex: 1;
+
+		.scroll-y {
+			flex: 1;
 			height: 100%;
-			// height: calc(100% - 87.5rpx);
-			padding-top: 25rpx;
-            padding-bottom:95rpx;
-			
-			&.noBottom {
-				padding-bottom:0;
+			padding-bottom: 95rpx;
+
+			&.noBottom {
+				padding-bottom: 0;
 			}
+
 			.item {
-				position: relative;
-				.title-wrap {
-					text {
-						white-space: nowrap;
-						text-overflow:ellipsis;
-						overflow:hidden;
-					}
-				}
-				.status {
-					display: flex;
-					justify-content: center;
-					width: 100rpx;
-					height: 35rpx;
-					color: #FFFFFF;
-					text-align: center;
-					line-height: 35rpx;
-					border-radius:20rpx;
-					&.noStart {
-						background-color:#eee;
-					}
-					&.checking {
-						background-color:#FFCC66;
-					}
-					&.completed {
-						background-color:#29CC96;
-					}
+				position: relative;
+
+				.title-wrap {
+					text {
+						white-space: nowrap;
+						text-overflow: ellipsis;
+						overflow: hidden;
+					}
+				}
+
+				.status {
+					display: flex;
+					justify-content: center;
+					width: 100rpx;
+					height: 35rpx;
+					color: #FFFFFF;
+					text-align: center;
+					line-height: 35rpx;
+					border-radius: 20rpx;
+
+					&.noStart {
+						background-color: #eee;
+					}
+
+					&.checking {
+						background-color: #FFCC66;
+					}
+
+					&.completed {
+						background-color: #29CC96;
+					}
 				}
 			}
 
@@ -530,7 +823,7 @@
 				top: 30rpx;
 				right: 25rpx;
 				width: 25rpx;
-				height: 25rpx;
+				height: 25rpx;
 				z-index: 2;
 				border-radius: 50%;
 				border: 2.5rpx solid #C3CAD9;
@@ -543,8 +836,8 @@
 				&.checked {
 					border: none;
 				}
-			}
-			
+			}
+
 			.footer {
 
 				.row {
@@ -604,31 +897,34 @@
 			display: flex;
 			flex-direction: row;
 			background-color: #FFFFFF;
-            .selectAll {
-				position: relative;
-				display: flex;
-				width:20%;
-				height: 100%;
-				justify-content: center;
-				align-items: center;
-				font-size: 22.5rpx;
-				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
-				font-weight: 400;
-				color: #3377FF;
-				&::after {
-					position: absolute;
-					display: inline-block;
-					content: '';
-					right: 0;
-					width: 1rpx;
-					height:40%;
-					background-color: #82848A;
-				}
+
+			.selectAll {
+				position: relative;
+				display: flex;
+				width: 20%;
+				height: 100%;
+				justify-content: center;
+				align-items: center;
+				font-size: 22.5rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #3377FF;
+
+				&::after {
+					position: absolute;
+					display: inline-block;
+					content: '';
+					right: 0;
+					width: 1rpx;
+					height: 40%;
+					background-color: #82848A;
+				}
 			}
+
 			.leftBtn,
 			.rightBtn {
 				display: flex;
-				width:40%;
+				width: 40%;
 				height: 100%;
 				justify-content: center;
 				align-items: center;

+ 18 - 3
pages/home/home.vue

@@ -53,6 +53,10 @@
 					<text class="func-text">修改密码</text>
 					<image class="icon-more" src="/static/images/icon-more.png"></image>
 				</view>
+				<view class="viewReport-btn" @click="viewReportHandle">
+					<text class="func-text">查看报表</text>
+					<image class="icon-more" src="/static/images/icon-more.png"></image>
+				</view>
 				<!-- <view class="resetPsd-btn" @click="resetFontSizeFunc">
 					<text class="func-text">修改字体大小</text>
 					<image class="icon-more" src="/static/images/icon-more.png"></image>
@@ -103,7 +107,7 @@
 			return {
 				ifshowVersionInfo:false,
 				showJournal: false,
-				version: '0.7.5',
+				version: '0.7.6',
 				versionData: {
 					versionNo: '',
 					versionId: '',
@@ -269,10 +273,14 @@
 				});
 			},
 			resetFontSizeFunc(){
-				console.log('changeSize')
 				uni.navigateTo({
 					url: '/pages/changeSize/changeSize'
 				});
+			},
+			viewReportHandle(){
+				uni.navigateTo({
+					url: '/pages/reports/reports'
+				});
 			},
 			journalOk() {
 				this.showJournal = false;
@@ -382,7 +390,7 @@
 		height: 100%;
 
 		.content-info {
-			height: 596.25rpx;
+			height: 700.25rpx;
 			background-color: #FFFFFF;
 
 			.top-box {
@@ -550,6 +558,13 @@
 					width: 725rpx;
 					margin-left: 25rpx;
 					background: #FFFFFF;
+					border-bottom: 0.5px solid #DADEE6;
+				}
+				.viewReport-btn {
+					height: 100rpx;
+					width: 725rpx;
+					margin-left: 25rpx;
+					background: #FFFFFF;
 				}
 				.func-text {
 					font-size: 22.5rpx;

+ 1 - 1
pages/login/login.vue

@@ -34,7 +34,7 @@
 		data() {
 			return {
 				index:0,
-				appHospSign:'8CJYqxlGIdLEIwaG',//app端更新hospSign
+				appHospSign:'d4miD82MvwFI6gY5',//app端更新hospSign
 				showInputModal:false,
 				hospSign: '', // 医院标识
 				username: '', // 用户名

+ 11 - 7
pages/mission-action/mission-action.vue

@@ -73,7 +73,7 @@
 		methods: {
 			// 获取组件信息
 			getComponentInfo(details) {
-				console.log({details});
+				
 				const {
 					nextPermission,
 					nextPermissionName,
@@ -115,21 +115,25 @@
 				this.pdcaSetting = pdcaSetting;
 			},
 			// 公共改善任务接口
-			comTaskCirculation(data) {
+			comTaskCirculation(data) {
+
 				this.$store.dispatch({
 					type: 'mission/commActions',
 					payload: {
 						key: "comTaskCirculation",
 						data
 					}
-				}).then(data1 => {
+				}).then(data1 => {
+                    
 					if (data1) {
 						let taskId = uni.getStorageSync('taskId');
-						uni.redirectTo({
-							url: `/pages/mission-details/mission-details?taskId=${taskId}`
-						});
+						uni.redirectTo({
+							url:`/pages/mission-details/mission-details?taskId=${taskId}`
+						})
+
 					}
-				});
+				});
+				
 			}
 		},
 		components: {

+ 17 - 9
pages/mission-details/mission-details.vue

@@ -107,20 +107,27 @@
 				pathName
 			} = option;
 			this.taskId = taskId;
-			
-			// console.log('missionDetails',this.missionDetails);
-		
+			
 			this.botBtnText = pathName == 'missionDetails' ? '返回改善任务列表' : '返回改善消息列表'
 		},
 		created() {
 			this.getMissionDetails();
 		},
 		methods: {
-			goBack() {
-				// window.history.back();
-				uni.navigateBack({
-				    delta: 1
-				});
+			goBack() {
+				//解决page页面栈的重复,同伙返回道该页面
+				const pages = getCurrentPages();
+				for(let i = pages.length - 1;i>=0;i--){
+					if(pages[i].route != pages[pages.length - 1].route){
+						  console.log({i});
+						  uni.navigateBack({
+						      delta:(pages.length - 1) - i 
+						  });
+						  return;
+						  
+					}
+				}
+
 			},
 			// 获取改善任务列表
 			getMissionDetails(data) {
@@ -135,7 +142,8 @@
 				});
 			},
 			// 点击按钮
-			clickBtn(currentInfo, btnInfo) {
+			clickBtn(currentInfo, btnInfo) {
+		
 				if (btnInfo.componentName) { // 有组件名,则跳转页面
 					if (btnInfo.componentName === 'pdca') {
 						const {

+ 3 - 1
pages/model.js

@@ -20,6 +20,7 @@ import batchDistribution from './batchDistribution/model.js';
 import checkMainPoints from './checkMainPoints/model.js';
 import responsibleList from './responsibleList/model.js';
 import selectVisitPerson from './selectVisitPerson/model.js'; 
+import reports from './reports/model.js'
 
 
 export default module = {
@@ -45,5 +46,6 @@ export default module = {
   batchDistribution,
   checkMainPoints,
   responsibleList,
-  selectVisitPerson
+  selectVisitPerson,
+  reports
 }

+ 103 - 72
pages/planList/planList.vue

@@ -1,21 +1,27 @@
 <template>
 	<view class="planList-page">
 		<scroll-view class="list-box" scroll-y="true" :style="{'height':listHeight+'rpx'}">
-			<view class="item-box" v-for="(item,index) in planList" @click="gotoCheckList(false,item)" :key="index">
-				<view class="row1">
-					<text class="title">{{item.name}}</text>
-					<view class="compeleted-box" v-if="item.isCompeleted">
-						<text class="compeleted-text">已完成</text>
+			<uni-swipe-action>
+				<uni-swipe-action-item v-for="(item,index) in planList"  :key="index"
+				    :disabled="!item.planFlag"
+					:threshold="20" :right-options="options" @click="delPlanHandle(item)" >
+					<view class="item-box" @click.stop="gotoCheckList(false,item)">
+						<view class="row1">
+							<text class="title">{{item.name}}</text>
+							<view class="compeleted-box" v-if="item.isCompeleted">
+								<text class="compeleted-text">已完成</text>
+							</view>
+							<view class="continued-box" v-if="item.isContinued">
+								<text class="continued-text">进行中</text>
+							</view>
+						</view>
+						<view class="row2">
+							<text class="TobeDistributed">剩余{{item.toDistribute}}个单位待分配</text>
+							<text class="startEndTime">起止时间:{{item.startDate}} ~ {{item.endDate}}</text>
+						</view>
 					</view>
-					<view class="continued-box" v-if="item.isContinued">
-						<text class="continued-text">进行中</text>
-					</view>
-				</view>
-				<view class="row2">
-					<text class="TobeDistributed">剩余{{item.toDistribute}}个单位待分配</text>
-					<text class="startEndTime">起止时间:{{item.startDate}} ~ {{item.endDate}}</text>
-				</view>
-			</view>
+				</uni-swipe-action-item>
+			</uni-swipe-action>
 		</scroll-view>
 		<view class="btn-distribution" @click="gotoCheckList(true, planList[0])" v-if="isShowDistribution">
 			<text class="btn-text">批量分配</text>
@@ -26,11 +32,20 @@
 
 <script>
 	import modal from './components/modal.vue'
-	import moment from 'moment';
-	import {mapState,mapGetters} from 'vuex';
+	import moment from 'moment';
+	import {
+		mapState,
+		mapGetters
+	} from 'vuex';
 	export default {
 		data() {
 			return {
+				options: [{
+					text: '删除',
+					style: {
+						backgroundColor: '#F56C6C'
+					}
+				}],
 				situationID: '', //情境id
 				planList: [], //计划列表
 				firstFlag: 1, //是否为第一次分配的标志,为1时表示是第一次,弹框提示
@@ -39,21 +54,21 @@
 				checkGroupId: 0, // 查核组id
 				showModal: false,
 			}
-		},
-		computed:{
-			...mapState({
-				ifReloadData:state=>{
-					return !state.planList.ifReloadData?false:true;
-				},
-			})
-		},
-		watch:{
-			ifReloadData(newVal,oldVal){
-				if(newVal != oldVal){
-					console.log('更新列表');
-					this.getPlanList();
-				}
-			},
+		},
+		computed: {
+			...mapState({
+				ifReloadData: state => {
+					return !state.planList.ifReloadData ? false : true;
+				},
+			})
+		},
+		watch: {
+			ifReloadData(newVal, oldVal) {
+				if (newVal != oldVal) {
+					console.log('更新列表');
+					this.getPlanList();
+				}
+			},
 		},
 		onLoad({
 			situationId,
@@ -65,47 +80,59 @@
 		created: function() {
 			this.getPlanList();
 		},
-		methods: {
+		methods: {
+			delPlanHandle(data){
+				 this.$store.dispatch({
+				 	type: 'planList/commActions',
+				 	payload: {
+				 		key: 'delOutofPlan',
+				 		data:data.id
+				 	}
+				 }).then(()=>{
+					 this.getPlanList();
+				 })
+			},
 			callback(flage) {
 				this.showModal = false;
 				if (flage && this.planList.length > 0) {
 					this.gotoCheckList(true, this.planList[0]);
 				}
-			},
-			getPlanList(){
-				this.$store.dispatch({
-					type: 'planList/commActions',
-					payload: {
-						key: 'planList',
-						data: {
-							situationId: this.situationID
-						}
-					}
-				}).then((data) => {
-					if (data) {
-						this.compareTime(data);
-						this.planList = data.map((item, index) => {
-							if (item.empList.length != item.toDistribute) {
-								this.firstFlag = 0;
-							}
-							return {
-								id: item.id,
-								name: item.name,
-								startDate: item.startDate,
-								endDate: item.endDate,
+			},
+			getPlanList() {
+				this.$store.dispatch({
+					type: 'planList/commActions',
+					payload: {
+						key: 'planList',
+						data: {
+							situationId: this.situationID
+						}
+					}
+				}).then((data) => {
+					if (data) {
+						this.compareTime(data);
+						this.planList = data.map((item, index) => {
+							if (item.empList.length != item.toDistribute) {
+								this.firstFlag = 0;
+							}
+							return {
+								id: item.id,
+								name: item.name,
+								startDate: item.startDate,
+								endDate: item.endDate,
 								status: item.status,
-								situationType:item.situationType,
-								checkNo:item.checkNo,
-								isCompeleted: item.status == 3 ? true : false,
-								isContinued: item.status == 2 ? true : false,
-								toDistribute: item.toDistribute,
-							}
-						});
-						if (this.firstFlag == 1) {
-							this.showModal = true;
-						}
-					}
-				});
+								planFlag:item.planFlag,
+								situationType: item.situationType,
+								checkNo: item.checkNo,
+								isCompeleted: item.status == 3 ? true : false,
+								isContinued: item.status == 2 ? true : false,
+								toDistribute: item.toDistribute,
+							}
+						});
+						if (this.firstFlag == 1) {
+							this.showModal = true;
+						}
+					}
+				});
 			},
 			compareTime(planList) {
 				this.$store.dispatch({
@@ -114,7 +141,7 @@
 				}).then((dateStr) => {
 					if (dateStr) {
 						if (planList.some((item) => moment(item.startDate).valueOf() < moment(dateStr)
-						.valueOf())) {
+								.valueOf())) {
 							this.listHeight = 1200;
 						} else {
 							this.isShowDistribution = true;
@@ -131,14 +158,17 @@
 				const {
 					id,
 					startDate,
-					endDate,
-					situationType,
+					endDate,
+					situationType,
 					checkNo
 				} = currentObj;
 				let _startDate = startDate ? startDate + ' 00:00' : ''; // 计划开始时间
 				let _endDate = endDate ? endDate + ' 23:59' : ''; // 计划结束时间
-				//跳转到查核列表
-				this.$store.commit('planList/comChangeState',{key:'ifReloadData',data:false});
+				//跳转到查核列表
+				this.$store.commit('planList/comChangeState', {
+					key: 'ifReloadData',
+					data: false
+				});
 				uni.navigateTo({
 					url: `/pages/editCheckList/editCheckList?situationId=${this.situationID}&checkId=${id}&checkGroupId=${this.checkGroupId}&startDate=${_startDate}&endDate=${_endDate}&multiple=${multiple}&situationType=${situationType}&checkNo=${checkNo}`
 				});
@@ -150,7 +180,7 @@
 	}
 </script>
 
-<style lang="less">
+<style lang="less" scoped>
 	.planList-page {
 		height: 100%;
 
@@ -235,6 +265,7 @@
 					}
 				}
 			}
+
 		}
 
 		.btn-distribution {

+ 12 - 0
pages/planList/server.js

@@ -11,9 +11,21 @@ const requestList = {
 		method:'POST',
 		url: 'plan/batchDistribute'
 	},
+	//删除计划外查核
+	delOutofPlan:{
+		method:'POST',
+		url: 'plan/delCheckTask'
+	}
 
 };
 export const commServer = ({ key, data }) => {
   let obj = requestList[key];
+  
+  if(key=='delOutofPlan'){
+	  return creatRequest({
+		    method:'POST',
+		    url: `plan/delCheckTask?checkId=${data}`
+	  },{});
+  }
   return creatRequest(obj, data);
 }

+ 45 - 0
pages/reportPage/reportPage.vue

@@ -0,0 +1,45 @@
+<template>
+	<view class="pageContainer">
+		<web-view v-if="url" :webview-styles="webviewStyles" 
+		    class="web-view"
+			:src="url"></web-view>
+	</view>
+</template>
+
+<script>
+	var wv;//计划创建的webview
+	export default {
+		data() {
+			return {
+				webviewStyles: {
+					progress: {
+						color: '#FF3333'
+					}
+				},
+				url:''
+			};
+		},
+		onReady() {
+			// // #ifdef APP-PLUS
+			// var currentWebview = this.$scope
+			// .$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
+			// setTimeout(function() {
+			// 	wv = currentWebview.children()[0]
+			// 	wv.setStyle({
+			// 		top: 150,
+			// 		height: 300
+			// 	})
+			// }, 1000); //如果是页面初始化调用时,需要延时一下
+			// // #endif
+		},
+		onLoad({url}) {
+			this.url = url
+		}
+	}
+</script>
+     
+<style lang="less">
+	.pageContainer {
+		overflow: scroll;
+	}
+</style>

+ 23 - 0
pages/reports/model.js

@@ -0,0 +1,23 @@
+import {
+	commServer
+} from './server.js';
+
+export default {
+	namespaced: true,
+	state: {
+
+	},
+	mutations: {
+
+	},
+	actions: {
+		commActions({
+			commit,
+			state
+		}, {
+			payload
+		}) {
+			return commServer(payload);
+		},
+	}
+}

+ 102 - 0
pages/reports/reports.vue

@@ -0,0 +1,102 @@
+<template>
+	<view class="pageContainer">
+		<scroll-view scroll-y="true" class="scroll-Y">
+			<view class="list" v-for="(item,index) in list" @click="viewHandle(item)">
+				<view class="name">{{item.name}}</view>
+				<image class="arrowIcon" src="../../static/list-open.png" ></image>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	
+	import { networkType } from '../../utils/requestUrl.js';
+	export default {
+		data() {
+			return {
+				list: [{
+						name: '报表一',
+						url: ''
+					},
+					{
+						name: '报表一',
+						url: ''
+					}
+				]
+			};
+		},
+		onLoad() {
+			   this.getList(`${networkType}`);
+		},
+		methods:{
+			/**
+			 * @param {
+				   url:string;
+				   name:string;
+			 } reportDetail
+			 */
+			 viewHandle(reportDetail){
+				   uni.navigateTo({
+				   	  url: '/pages/reportPage/reportPage?url='+reportDetail.url
+				   });
+			 },
+			 /**
+			  * @param {string} networkType  网络环境(0. 内网,1.外网)
+			  */
+			 getList(networkType){
+				 this.$store.dispatch({
+				 	type: 'reports/commActions',
+				 	payload: {
+				 		key: 'getReportList',
+						data:{
+							networkType:networkType
+						}
+				 	}
+				 }).then(res=>{
+					   this.list = res.map(t=>({
+						     name:t.name,
+							 url:t.url
+					   }))
+				 })
+			 }
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	.pageContainer {
+		display: flex;
+		width: 100%;
+		height: 100vh;
+		.scroll-Y {
+			.list {
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content:space-between;
+				width: 100%;
+				height: 100rpx;
+				padding: 30rpx 30rpx;
+				border-bottom: 1rpx solid #CCCCCC;
+				background-color: #FFFFFF;
+				.name {
+					font-size:27rpx;
+				}
+				.arrowIcon {
+					display:none;
+					width:25rpx;
+					height: 18rpx;
+					transform:rotate(-90deg);
+				}
+				
+				&:last-child {
+					border-bottom: 0;
+				}
+				
+			}
+		}
+	}
+</style>
+
+

+ 14 - 0
pages/reports/server.js

@@ -0,0 +1,14 @@
+import { creatRequest } from '../../utils/request.js';
+
+const requestList = {
+	// 获取报表列表
+	getReportList: {
+		method: 'GET',
+		url: '/user/getFrUrl'
+	}
+};
+
+export const commServer = ({ key, data }) => {
+  let obj = requestList[key];
+  return creatRequest(obj, data);
+}

二進制
static/clearIcon.png


二進制
static/fillBlackArrow.png


+ 31 - 0
uni_modules/uni-easyinput/changelog.md

@@ -0,0 +1,31 @@
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+## 0.1.4(2021-08-20)
+- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
+## 0.1.3(2021-08-11)
+- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+## 0.1.2(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 0.1.1
+- 优化 errorMessage 属性支持 Boolean 类型
+## 0.1.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.0.16(2021-06-29)
+- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug
+## 0.0.15(2021-06-21)
+- 修复 passwordIcon 属性拼写错误的 bug
+## 0.0.14(2021-06-18)
+- 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标
+- 修复 confirmType 属性不生效的问题
+## 0.0.13(2021-06-04)
+- 修复 disabled 状态可清出内容的 bug
+## 0.0.12(2021-05-12)
+- 新增 组件示例地址
+## 0.0.11(2021-05-07)
+- 修复 input-border 属性不生效的问题
+## 0.0.10(2021-04-30)
+- 修复 ios 遮挡文字、显示一半的问题
+## 0.0.9(2021-02-05)
+- 调整为uni_modules目录规范
+- 优化 兼容 nvue 页面

+ 56 - 0
uni_modules/uni-easyinput/components/uni-easyinput/common.js

@@ -0,0 +1,56 @@
+/**
+ * @desc 函数防抖
+ * @param func 目标函数
+ * @param wait 延迟执行毫秒数
+ * @param immediate true - 立即执行, false - 延迟执行
+ */
+export const debounce = function(func, wait = 1000, immediate = true) {
+	let timer;
+	console.log(1);
+	return function() {
+		console.log(123);
+		let context = this,
+			args = arguments;
+		if (timer) clearTimeout(timer);
+		if (immediate) {
+			let callNow = !timer;
+			timer = setTimeout(() => {
+				timer = null;
+			}, wait);
+			if (callNow) func.apply(context, args);
+		} else {
+			timer = setTimeout(() => {
+				func.apply(context, args);
+			}, wait)
+		}
+	}
+}
+/**
+ * @desc 函数节流
+ * @param func 函数
+ * @param wait 延迟执行毫秒数
+ * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发
+ */
+export const throttle = (func, wait = 1000, type = 1) => {
+	let previous = 0;
+	let timeout;
+	return function() {
+		let context = this;
+		let args = arguments;
+		if (type === 1) {
+			let now = Date.now();
+
+			if (now - previous > wait) {
+				func.apply(context, args);
+				previous = now;
+			}
+		} else if (type === 2) {
+			if (!timeout) {
+				timeout = setTimeout(() => {
+					timeout = null;
+					func.apply(context, args)
+				}, wait)
+			}
+		}
+	}
+}

+ 461 - 0
uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue

@@ -0,0 +1,461 @@
+<template>
+	<view class="uni-easyinput" :class="{'uni-easyinput-error':msg}" :style="{color:inputBorder && msg?'#e43d33':styles.color}">
+		<view class="uni-easyinput__content" :class="{'is-input-border':inputBorder ,'is-input-error-border':inputBorder && msg,'is-textarea':type==='textarea','is-disabled':disabled}"
+		 :style="{'border-color':inputBorder && msg?'#dd524d':styles.borderColor,'background-color':disabled?styles.disableColor:''}">
+			<uni-icons v-if="prefixIcon" class="content-clear-icon" :type="prefixIcon" color="#c0c4cc" @click="onClickIcon('prefix')"></uni-icons>
+			<textarea v-if="type === 'textarea'" class="uni-easyinput__content-textarea" :class="{'input-padding':inputBorder}"
+			 :name="name" :value="val" :placeholder="placeholder" :placeholderStyle="placeholderStyle" :disabled="disabled" placeholder-class="uni-easyinput__placeholder-class"
+			 :maxlength="inputMaxlength" :focus="focused" :autoHeight="autoHeight" @input="onInput" @blur="onBlur"  @focus="onFocus"
+			 @confirm="onConfirm"></textarea>
+			<input v-else :type="type === 'password'?'text':type" class="uni-easyinput__content-input" :style="{
+				 'padding-right':type === 'password' ||clearable || prefixIcon?'':'10px',
+				 'padding-left':prefixIcon?'':'10px'
+			 }"
+			 :name="name" :value="val" :password="!showPassword && type === 'password'" :placeholder="placeholder"
+			 :placeholderStyle="placeholderStyle" placeholder-class="uni-easyinput__placeholder-class" :disabled="disabled" :maxlength="inputMaxlength" :focus="focused" :confirmType="confirmType" @focus="onFocus"
+			 @blur="onBlur" @input="onInput" @confirm="onConfirm" />
+			<template v-if="type === 'password' && passwordIcon" >
+				<uni-icons v-if="val != '' " class="content-clear-icon" :class="{'is-textarea-icon':type==='textarea'}" :type="showPassword?'eye-slash-filled':'eye-filled'"
+				 :size="18" color="#c0c4cc" @click="onEyes"></uni-icons>
+			</template>
+			<template v-else-if="suffixIcon">
+				<uni-icons v-if="suffixIcon" class="content-clear-icon" :type="suffixIcon" color="#c0c4cc" @click="onClickIcon('suffix')"></uni-icons>
+			</template>
+			<template v-else>
+				<uni-icons class="content-clear-icon" :class="{'is-textarea-icon':type==='textarea'}" type="clear" :size="clearSize"
+				 v-if="clearable && val && !disabled" color="#c0c4cc" @click="onClear"></uni-icons>
+			</template>
+			<slot name="right"></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	// import {
+	// 	debounce,
+	// 	throttle
+	// } from './common.js'
+	/**
+	 * Easyinput 输入框
+	 * @description 此组件可以实现表单的输入与校验,包括 "text" 和 "textarea" 类型。
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3455
+	 * @property {String}	value	输入内容
+	 * @property {String }	type	输入框的类型(默认text) password/text/textarea/..
+	 * 	@value text			文本输入键盘
+	 * 	@value textarea	多行文本输入键盘
+	 * 	@value password	密码输入键盘
+	 * 	@value number		数字输入键盘,注意iOS上app-vue弹出的数字键盘并非9宫格方式
+	 * 	@value idcard		身份证输入键盘,信、支付宝、百度、QQ小程序
+	 * 	@value digit		带小数点的数字键盘	,App的nvue页面、微信、支付宝、百度、头条、QQ小程序支持
+	 * @property {Boolean}	clearable	是否显示右侧清空内容的图标控件,点击可清空输入框内容(默认true)
+	 * @property {Boolean}	autoHeight	是否自动增高输入区域,type为textarea时有效(默认true)
+	 * @property {String }	placeholder	输入框的提示文字
+	 * @property {String }	placeholderStyle	placeholder的样式(内联样式,字符串),如"color: #ddd"
+	 * @property {Boolean}	focus	是否自动获得焦点(默认false)
+	 * @property {Boolean}	disabled	是否禁用(默认false)
+	 * @property {Number }	maxlength	最大输入长度,设置为 -1 的时候不限制最大长度(默认140)
+	 * @property {String }	confirmType	设置键盘右下角按钮的文字,仅在type="text"时生效(默认done)
+	 * @property {Number }	clearSize	清除图标的大小,单位px(默认15)
+	 * @property {String}	prefixIcon	输入框头部图标
+	 * @property {String}	suffixIcon	输入框尾部图标
+	 * @property {Boolean}	trim	是否自动去除两端的空格
+	 * @value both	去除两端空格
+	 * @value left	去除左侧空格
+	 * @value right	去除右侧空格
+	 * @value start	去除左侧空格
+	 * @value end		去除右侧空格
+	 * @value all		去除全部空格
+	 * @value none	不去除空格
+	 * @property {Boolean}	inputBorder	是否显示input输入框的边框(默认true)
+	 * @property {Boolean}	passwordIcon	type=password时是否显示小眼睛图标
+	 * @property {Object}	styles	自定义颜色
+	 * @event {Function}	input	输入框内容发生变化时触发
+	 * @event {Function}	focus	输入框获得焦点时触发
+	 * @event {Function}	blur	输入框失去焦点时触发
+	 * @event {Function}	confirm	点击完成按钮时触发
+	 * @event {Function}	iconClick	点击图标时触发
+	 * @example <uni-easyinput v-model="mobile"></uni-easyinput>
+	 */
+
+	 export default {
+		name: 'uni-easyinput',
+		emits:['click','iconClick','update:modelValue','input','focus','blur','confirm'],
+		model:{
+			prop:'modelValue',
+			event:'update:modelValue'
+		},
+		props: {
+			name: String,
+			value: [Number, String],
+			modelValue: [Number, String],
+			type: {
+				type: String,
+				default: 'text'
+			},
+			clearable: {
+				type: Boolean,
+				default: true
+			},
+			autoHeight: {
+				type: Boolean,
+				default: false
+			},
+			placeholder: String,
+			placeholderStyle: String,
+			focus: {
+				type: Boolean,
+				default: false
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			maxlength: {
+				type: [Number, String],
+				default: 140
+			},
+			confirmType: {
+				type: String,
+				default: 'done'
+			},
+			clearSize: {
+				type: [Number, String],
+				default: 15
+			},
+			inputBorder: {
+				type: Boolean,
+				default: true
+			},
+			prefixIcon: {
+				type: String,
+				default: ''
+			},
+			suffixIcon: {
+				type: String,
+				default: ''
+			},
+			trim: {
+				type: [Boolean, String],
+				default: true
+			},
+			passwordIcon:{
+				type: Boolean,
+				default: true
+			},
+			styles: {
+				type: Object,
+				default () {
+					return {
+						color: '#333',
+						disableColor: '#F7F6F6',
+						borderColor: '#e5e5e5'
+					}
+				}
+			},
+			errorMessage:{
+				type:[String,Boolean],
+				default:''
+			}
+		},
+		data() {
+			return {
+				focused: false,
+				errMsg: '',
+				val: '',
+				showMsg: '',
+				border: false,
+				isFirstBorder: false,
+				showClearIcon: false,
+				showPassword: false
+			};
+		},
+		computed: {
+			msg() {
+				return this.errorMessage || this.errMsg;
+			},
+			// 因为uniapp的input组件的maxlength组件必须要数值,这里转为数值,用户可以传入字符串数值
+			inputMaxlength() {
+				return Number(this.maxlength);
+			},
+		},
+		watch: {
+			value(newVal) {
+				if (this.errMsg) this.errMsg = ''
+				this.val = newVal
+				// fix by mehaotian is_reset 在 uni-forms 中定义
+				if (this.form && this.formItem &&!this.is_reset) {
+					this.is_reset = false
+					this.formItem.setValue(newVal)
+				}
+			},
+			modelValue(newVal) {
+				if (this.errMsg) this.errMsg = ''
+				this.val = newVal
+				if (this.form && this.formItem &&!this.is_reset) {
+					this.is_reset = false
+					this.formItem.setValue(newVal)
+				}
+			},
+			focus(newVal) {
+				this.$nextTick(() => {
+					this.focused = this.focus
+				})
+			}
+		},
+		created() {
+			if(!this.value){
+				this.val = this.modelValue
+			}
+			if(!this.modelValue){
+				this.val = this.value
+			}
+			this.form = this.getForm('uniForms')
+			this.formItem = this.getForm('uniFormsItem')
+			if (this.form && this.formItem) {
+				if (this.formItem.name) {
+					if(!this.is_reset){
+						this.is_reset = false
+						this.formItem.setValue(this.val)
+					}
+					this.rename = this.formItem.name
+					this.form.inputChildrens.push(this)
+				}
+			}
+		},
+		mounted() {
+			this.$nextTick(() => {
+				this.focused = this.focus
+			})
+		},
+		methods: {
+			/**
+			 * 初始化变量值
+			 */
+			init() {
+
+			},
+			onClickIcon(type) {
+				this.$emit('iconClick', type)
+			},
+			/**
+			 * 获取父元素实例
+			 */
+			getForm(name = 'uniForms') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false;
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+
+			onEyes() {
+				this.showPassword = !this.showPassword
+			},
+			onInput(event) {
+				let value = event.detail.value;
+				// 判断是否去除空格
+				if (this.trim) {
+					if (typeof(this.trim) === 'boolean' && this.trim) {
+						value = this.trimStr(value)
+					}
+					if (typeof(this.trim) === 'string') {
+						value = this.trimStr(value, this.trim)
+					}
+				};
+				if (this.errMsg) this.errMsg = ''
+				this.val = value
+				// TODO 兼容 vue2
+				this.$emit('input', value);
+				// TODO 兼容 vue3
+				this.$emit('update:modelValue',value)
+			},
+
+			onFocus(event) {
+				this.$emit('focus', event);
+			},
+			onBlur(event) {
+				let value = event.detail.value;
+				this.$emit('blur', event);
+			},
+			onConfirm(e) {
+				this.$emit('confirm', e.detail.value);
+			},
+			onClear(event) {
+				this.val = '';
+				// TODO 兼容 vue2
+				this.$emit('input', '');
+				// TODO 兼容 vue2
+				// TODO 兼容 vue3
+				this.$emit('update:modelValue','')
+			},
+			fieldClick() {
+				this.$emit('click');
+			},
+			trimStr(str, pos = 'both') {
+				if (pos === 'both') {
+					return str.trim();
+				} else if (pos === 'left') {
+					return str.trimLeft();
+				} else if (pos === 'right') {
+					return str.trimRight();
+				} else if (pos === 'start') {
+					return str.trimStart()
+				} else if (pos === 'end') {
+					return str.trimEnd()
+				} else if (pos === 'all') {
+					return str.replace(/\s+/g, '');
+				} else if (pos === 'none') {
+					return str;
+				}
+				return str;
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$uni-error: #e43d33;
+	$uni-border-1: #DCDFE6 !default;
+	.uni-easyinput {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+		flex: 1;
+		position: relative;
+		text-align: left;
+		color: #333;
+		font-size: 14px;
+	}
+
+	.uni-easyinput__content {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		display: flex;
+		box-sizing: border-box;
+		min-height: 36px;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-easyinput__content-input {
+		/* #ifndef APP-NVUE */
+		width: auto;
+		/* #endif */
+		position: relative;
+		overflow: hidden;
+		flex: 1;
+		line-height: 1;
+		font-size: 14px;
+	}
+	.uni-easyinput__placeholder-class {
+		color: #999;
+		font-size: 12px;
+		font-weight: 200;
+	}
+	.is-textarea {
+		align-items: flex-start;
+	}
+
+	.is-textarea-icon {
+		margin-top: 5px;
+	}
+
+	.uni-easyinput__content-textarea {
+		position: relative;
+		overflow: hidden;
+		flex: 1;
+		line-height: 1.5;
+		font-size: 14px;
+		padding-top: 6px;
+		padding-bottom: 10px;
+		height: 80px;
+		/* #ifndef APP-NVUE */
+		min-height: 80px;
+		width: auto;
+		/* #endif */
+	}
+
+	.input-padding {
+		padding-left: 10px;
+	}
+
+	.content-clear-icon {
+		padding: 0 5px;
+	}
+
+	.label-icon {
+		margin-right: 5px;
+		margin-top: -1px;
+	}
+
+	// 显示边框
+	.is-input-border {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		border: 1px solid $uni-border-1;
+		border-radius: 4px;
+	}
+
+	.uni-error-message {
+		position: absolute;
+		bottom: -17px;
+		left: 0;
+		line-height: 12px;
+		color: $uni-error;
+		font-size: 12px;
+		text-align: left;
+	}
+
+	.uni-error-msg--boeder {
+		position: relative;
+		bottom: 0;
+		line-height: 22px;
+	}
+
+	.is-input-error-border {
+		border-color: $uni-error;
+		.uni-easyinput__placeholder-class {
+			color: mix(#fff, $uni-error, 50%);;
+		}
+	}
+
+
+	.uni-easyinput--border {
+		margin-bottom: 0;
+		padding: 10px 15px;
+		// padding-bottom: 0;
+		border-top: 1px #eee solid;
+	}
+
+	.uni-easyinput-error {
+		padding-bottom: 0;
+	}
+
+	.is-first-border {
+		/* #ifndef APP-NVUE */
+		border: none;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		border-width: 0;
+		/* #endif */
+	}
+
+	.is-disabled {
+		border-color: red;
+		background-color: #F7F6F6;
+		color: #D5D5D5;
+		.uni-easyinput__placeholder-class {
+			color: #D5D5D5;
+			font-size: 12px;
+		}
+	}
+</style>

+ 90 - 0
uni_modules/uni-easyinput/package.json

@@ -0,0 +1,90 @@
+{
+  "id": "uni-easyinput",
+  "displayName": "uni-easyinput 增强输入框",
+  "version": "1.0.0",
+  "description": "Easyinput 组件是对原生input组件的增强",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "input",
+    "uni-easyinput",
+    "输入框"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+      "uni-icons"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "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"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
uni_modules/uni-easyinput/readme.md

@@ -0,0 +1,11 @@
+
+
+### Easyinput 增强输入框
+> **组件名:uni-easyinput**
+> 代码块: `uEasyinput`
+
+
+easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 20 - 2
uni_modules/uni-icons/changelog.md

@@ -1,4 +1,22 @@
+## 1.3.5(2022-01-24)
+- 优化 size 属性可以传入不带单位的字符串数值
+## 1.3.4(2022-01-24)
+- 优化 size 支持其他单位
+## 1.3.3(2022-01-17)
+- 修复 nvue 有些图标不显示的bug,兼容老版本图标
+## 1.3.2(2021-12-01)
+- 优化 示例可复制图标名称
+## 1.3.1(2021-11-23)
+- 优化 兼容旧组件 type 值
+## 1.3.0(2021-11-19)
+- 新增 更多图标
+- 优化 自定义图标使用方式
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7(2021-11-08)
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
 ## 1.1.5(2021-05-12)
 - 新增 组件示例地址
-## 1.1.4(2021-02-05)
-- 调整为uni_modules目录规范
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范

+ 1168 - 131
uni_modules/uni-icons/components/uni-icons/icons.js

@@ -1,132 +1,1169 @@
-export default {
-	"pulldown": "\ue588",
-	"refreshempty": "\ue461",
-	"back": "\ue471",
-	"forward": "\ue470",
-	"more": "\ue507",
-	"more-filled": "\ue537",
-	"scan": "\ue612",
-	"qq": "\ue264",
-	"weibo": "\ue260",
-	"weixin": "\ue261",
-	"pengyouquan": "\ue262",
-	"loop": "\ue565",
-	"refresh": "\ue407",
-	"refresh-filled": "\ue437",
-	"arrowthindown": "\ue585",
-	"arrowthinleft": "\ue586",
-	"arrowthinright": "\ue587",
-	"arrowthinup": "\ue584",
-	"undo-filled": "\ue7d6",
-	"undo": "\ue406",
-	"redo": "\ue405",
-	"redo-filled": "\ue7d9",
-	"bars": "\ue563",
-	"chatboxes": "\ue203",
-	"camera": "\ue301",
-	"chatboxes-filled": "\ue233",
-	"camera-filled": "\ue7ef",
-	"cart-filled": "\ue7f4",
-	"cart": "\ue7f5",
-	"checkbox-filled": "\ue442",
-	"checkbox": "\ue7fa",
-	"arrowleft": "\ue582",
-	"arrowdown": "\ue581",
-	"arrowright": "\ue583",
-	"smallcircle-filled": "\ue801",
-	"arrowup": "\ue580",
-	"circle": "\ue411",
-	"eye-filled": "\ue568",
-	"eye-slash-filled": "\ue822",
-	"eye-slash": "\ue823",
-	"eye": "\ue824",
-	"flag-filled": "\ue825",
-	"flag": "\ue508",
-	"gear-filled": "\ue532",
-	"reload": "\ue462",
-	"gear": "\ue502",
-	"hand-thumbsdown-filled": "\ue83b",
-	"hand-thumbsdown": "\ue83c",
-	"hand-thumbsup-filled": "\ue83d",
-	"heart-filled": "\ue83e",
-	"hand-thumbsup": "\ue83f",
-	"heart": "\ue840",
-	"home": "\ue500",
-	"info": "\ue504",
-	"home-filled": "\ue530",
-	"info-filled": "\ue534",
-	"circle-filled": "\ue441",
-	"chat-filled": "\ue847",
-	"chat": "\ue263",
-	"mail-open-filled": "\ue84d",
-	"email-filled": "\ue231",
-	"mail-open": "\ue84e",
-	"email": "\ue201",
-	"checkmarkempty": "\ue472",
-	"list": "\ue562",
-	"locked-filled": "\ue856",
-	"locked": "\ue506",
-	"map-filled": "\ue85c",
-	"map-pin": "\ue85e",
-	"map-pin-ellipse": "\ue864",
-	"map": "\ue364",
-	"minus-filled": "\ue440",
-	"mic-filled": "\ue332",
-	"minus": "\ue410",
-	"micoff": "\ue360",
-	"mic": "\ue302",
-	"clear": "\ue434",
-	"smallcircle": "\ue868",
-	"close": "\ue404",
-	"closeempty": "\ue460",
-	"paperclip": "\ue567",
-	"paperplane": "\ue503",
-	"paperplane-filled": "\ue86e",
-	"person-filled": "\ue131",
-	"contact-filled": "\ue130",
-	"person": "\ue101",
-	"contact": "\ue100",
-	"images-filled": "\ue87a",
-	"phone": "\ue200",
-	"images": "\ue87b",
-	"image": "\ue363",
-	"image-filled": "\ue877",
-	"location-filled": "\ue333",
-	"location": "\ue303",
-	"plus-filled": "\ue439",
-	"plus": "\ue409",
-	"plusempty": "\ue468",
-	"help-filled": "\ue535",
-	"help": "\ue505",
-	"navigate-filled": "\ue884",
-	"navigate": "\ue501",
-	"mic-slash-filled": "\ue892",
-	"search": "\ue466",
-	"settings": "\ue560",
-	"sound": "\ue590",
-	"sound-filled": "\ue8a1",
-	"spinner-cycle": "\ue465",
-	"download-filled": "\ue8a4",
-	"personadd-filled": "\ue132",
-	"videocam-filled": "\ue8af",
-	"personadd": "\ue102",
-	"upload": "\ue402",
-	"upload-filled": "\ue8b1",
-	"starhalf": "\ue463",
-	"star-filled": "\ue438",
-	"star": "\ue408",
-	"trash": "\ue401",
-	"phone-filled": "\ue230",
-	"compose": "\ue400",
-	"videocam": "\ue300",
-	"trash-filled": "\ue8dc",
-	"download": "\ue403",
-	"chatbubble-filled": "\ue232",
-	"chatbubble": "\ue202",
-	"cloud-download": "\ue8e4",
-	"cloud-upload-filled": "\ue8e5",
-	"cloud-upload": "\ue8e6",
-	"cloud-download-filled": "\ue8e9",
-	"headphones":"\ue8bf",
-	"shop":"\ue609"
+export default {
+  "id": "2852637",
+  "name": "uniui图标库",
+  "font_family": "uniicons",
+  "css_prefix_text": "uniui-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "25027049",
+      "name": "yanse",
+      "font_class": "color",
+      "unicode": "e6cf",
+      "unicode_decimal": 59087
+    },
+    {
+      "icon_id": "25027048",
+      "name": "wallet",
+      "font_class": "wallet",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
+      "icon_id": "25015720",
+      "name": "settings-filled",
+      "font_class": "settings-filled",
+      "unicode": "e6ce",
+      "unicode_decimal": 59086
+    },
+    {
+      "icon_id": "25015434",
+      "name": "shimingrenzheng-filled",
+      "font_class": "auth-filled",
+      "unicode": "e6cc",
+      "unicode_decimal": 59084
+    },
+    {
+      "icon_id": "24934246",
+      "name": "shop-filled",
+      "font_class": "shop-filled",
+      "unicode": "e6cd",
+      "unicode_decimal": 59085
+    },
+    {
+      "icon_id": "24934159",
+      "name": "staff-filled-01",
+      "font_class": "staff-filled",
+      "unicode": "e6cb",
+      "unicode_decimal": 59083
+    },
+    {
+      "icon_id": "24932461",
+      "name": "VIP-filled",
+      "font_class": "vip-filled",
+      "unicode": "e6c6",
+      "unicode_decimal": 59078
+    },
+    {
+      "icon_id": "24932462",
+      "name": "plus_circle_fill",
+      "font_class": "plus-filled",
+      "unicode": "e6c7",
+      "unicode_decimal": 59079
+    },
+    {
+      "icon_id": "24932463",
+      "name": "folder_add-filled",
+      "font_class": "folder-add-filled",
+      "unicode": "e6c8",
+      "unicode_decimal": 59080
+    },
+    {
+      "icon_id": "24932464",
+      "name": "yanse-filled",
+      "font_class": "color-filled",
+      "unicode": "e6c9",
+      "unicode_decimal": 59081
+    },
+    {
+      "icon_id": "24932465",
+      "name": "tune-filled",
+      "font_class": "tune-filled",
+      "unicode": "e6ca",
+      "unicode_decimal": 59082
+    },
+    {
+      "icon_id": "24932455",
+      "name": "a-rilidaka-filled",
+      "font_class": "calendar-filled",
+      "unicode": "e6c0",
+      "unicode_decimal": 59072
+    },
+    {
+      "icon_id": "24932456",
+      "name": "notification-filled",
+      "font_class": "notification-filled",
+      "unicode": "e6c1",
+      "unicode_decimal": 59073
+    },
+    {
+      "icon_id": "24932457",
+      "name": "wallet-filled",
+      "font_class": "wallet-filled",
+      "unicode": "e6c2",
+      "unicode_decimal": 59074
+    },
+    {
+      "icon_id": "24932458",
+      "name": "paihangbang-filled",
+      "font_class": "medal-filled",
+      "unicode": "e6c3",
+      "unicode_decimal": 59075
+    },
+    {
+      "icon_id": "24932459",
+      "name": "gift-filled",
+      "font_class": "gift-filled",
+      "unicode": "e6c4",
+      "unicode_decimal": 59076
+    },
+    {
+      "icon_id": "24932460",
+      "name": "fire-filled",
+      "font_class": "fire-filled",
+      "unicode": "e6c5",
+      "unicode_decimal": 59077
+    },
+    {
+      "icon_id": "24928001",
+      "name": "refreshempty",
+      "font_class": "refreshempty",
+      "unicode": "e6bf",
+      "unicode_decimal": 59071
+    },
+    {
+      "icon_id": "24926853",
+      "name": "location-ellipse",
+      "font_class": "location-filled",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
+      "icon_id": "24926735",
+      "name": "person-filled",
+      "font_class": "person-filled",
+      "unicode": "e69d",
+      "unicode_decimal": 59037
+    },
+    {
+      "icon_id": "24926703",
+      "name": "personadd-filled",
+      "font_class": "personadd-filled",
+      "unicode": "e698",
+      "unicode_decimal": 59032
+    },
+    {
+      "icon_id": "24923351",
+      "name": "back",
+      "font_class": "back",
+      "unicode": "e6b9",
+      "unicode_decimal": 59065
+    },
+    {
+      "icon_id": "24923352",
+      "name": "forward",
+      "font_class": "forward",
+      "unicode": "e6ba",
+      "unicode_decimal": 59066
+    },
+    {
+      "icon_id": "24923353",
+      "name": "arrowthinright",
+      "font_class": "arrow-right",
+      "unicode": "e6bb",
+      "unicode_decimal": 59067
+    },
+		{
+		  "icon_id": "24923353",
+		  "name": "arrowthinright",
+		  "font_class": "arrowthinright",
+		  "unicode": "e6bb",
+		  "unicode_decimal": 59067
+		},
+    {
+      "icon_id": "24923354",
+      "name": "arrowthinleft",
+      "font_class": "arrow-left",
+      "unicode": "e6bc",
+      "unicode_decimal": 59068
+    },
+		{
+		  "icon_id": "24923354",
+		  "name": "arrowthinleft",
+		  "font_class": "arrowthinleft",
+		  "unicode": "e6bc",
+		  "unicode_decimal": 59068
+		},
+    {
+      "icon_id": "24923355",
+      "name": "arrowthinup",
+      "font_class": "arrow-up",
+      "unicode": "e6bd",
+      "unicode_decimal": 59069
+    },
+		{
+		  "icon_id": "24923355",
+		  "name": "arrowthinup",
+		  "font_class": "arrowthinup",
+		  "unicode": "e6bd",
+		  "unicode_decimal": 59069
+		},
+    {
+      "icon_id": "24923356",
+      "name": "arrowthindown",
+      "font_class": "arrow-down",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },{
+      "icon_id": "24923356",
+      "name": "arrowthindown",
+      "font_class": "arrowthindown",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },
+    {
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "bottom",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },{
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "arrowdown",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },
+    {
+      "icon_id": "24923346",
+      "name": "arrowright",
+      "font_class": "right",
+      "unicode": "e6b5",
+      "unicode_decimal": 59061
+    },
+		{
+		  "icon_id": "24923346",
+		  "name": "arrowright",
+		  "font_class": "arrowright",
+		  "unicode": "e6b5",
+		  "unicode_decimal": 59061
+		},
+    {
+      "icon_id": "24923347",
+      "name": "arrowup",
+      "font_class": "top",
+      "unicode": "e6b6",
+      "unicode_decimal": 59062
+    },
+		{
+		  "icon_id": "24923347",
+		  "name": "arrowup",
+		  "font_class": "arrowup",
+		  "unicode": "e6b6",
+		  "unicode_decimal": 59062
+		},
+    {
+      "icon_id": "24923348",
+      "name": "arrowleft",
+      "font_class": "left",
+      "unicode": "e6b7",
+      "unicode_decimal": 59063
+    },
+		{
+		  "icon_id": "24923348",
+		  "name": "arrowleft",
+		  "font_class": "arrowleft",
+		  "unicode": "e6b7",
+		  "unicode_decimal": 59063
+		},
+    {
+      "icon_id": "24923334",
+      "name": "eye",
+      "font_class": "eye",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "24923335",
+      "name": "eye-filled",
+      "font_class": "eye-filled",
+      "unicode": "e66a",
+      "unicode_decimal": 58986
+    },
+    {
+      "icon_id": "24923336",
+      "name": "eye-slash",
+      "font_class": "eye-slash",
+      "unicode": "e6b3",
+      "unicode_decimal": 59059
+    },
+    {
+      "icon_id": "24923337",
+      "name": "eye-slash-filled",
+      "font_class": "eye-slash-filled",
+      "unicode": "e6b4",
+      "unicode_decimal": 59060
+    },
+    {
+      "icon_id": "24923305",
+      "name": "info-filled",
+      "font_class": "info-filled",
+      "unicode": "e649",
+      "unicode_decimal": 58953
+    },
+    {
+      "icon_id": "24923299",
+      "name": "reload-01",
+      "font_class": "reload",
+      "unicode": "e6b2",
+      "unicode_decimal": 59058
+    },
+    {
+      "icon_id": "24923195",
+      "name": "mic_slash_fill",
+      "font_class": "micoff-filled",
+      "unicode": "e6b0",
+      "unicode_decimal": 59056
+    },
+    {
+      "icon_id": "24923165",
+      "name": "map-pin-ellipse",
+      "font_class": "map-pin-ellipse",
+      "unicode": "e6ac",
+      "unicode_decimal": 59052
+    },
+    {
+      "icon_id": "24923166",
+      "name": "map-pin",
+      "font_class": "map-pin",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "24923167",
+      "name": "location",
+      "font_class": "location",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "24923064",
+      "name": "starhalf",
+      "font_class": "starhalf",
+      "unicode": "e683",
+      "unicode_decimal": 59011
+    },
+    {
+      "icon_id": "24923065",
+      "name": "star",
+      "font_class": "star",
+      "unicode": "e688",
+      "unicode_decimal": 59016
+    },
+    {
+      "icon_id": "24923066",
+      "name": "star-filled",
+      "font_class": "star-filled",
+      "unicode": "e68f",
+      "unicode_decimal": 59023
+    },
+    {
+      "icon_id": "24899646",
+      "name": "a-rilidaka",
+      "font_class": "calendar",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "24899647",
+      "name": "fire",
+      "font_class": "fire",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "24899648",
+      "name": "paihangbang",
+      "font_class": "medal",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "24899649",
+      "name": "font",
+      "font_class": "font",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "24899650",
+      "name": "gift",
+      "font_class": "gift",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "24899651",
+      "name": "link",
+      "font_class": "link",
+      "unicode": "e6a5",
+      "unicode_decimal": 59045
+    },
+    {
+      "icon_id": "24899652",
+      "name": "notification",
+      "font_class": "notification",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "24899653",
+      "name": "staff",
+      "font_class": "staff",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "24899654",
+      "name": "VIP",
+      "font_class": "vip",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "24899655",
+      "name": "folder_add",
+      "font_class": "folder-add",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "24899656",
+      "name": "tune",
+      "font_class": "tune",
+      "unicode": "e6aa",
+      "unicode_decimal": 59050
+    },
+    {
+      "icon_id": "24899657",
+      "name": "shimingrenzheng",
+      "font_class": "auth",
+      "unicode": "e6ab",
+      "unicode_decimal": 59051
+    },
+    {
+      "icon_id": "24899565",
+      "name": "person",
+      "font_class": "person",
+      "unicode": "e699",
+      "unicode_decimal": 59033
+    },
+    {
+      "icon_id": "24899566",
+      "name": "email-filled",
+      "font_class": "email-filled",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "24899567",
+      "name": "phone-filled",
+      "font_class": "phone-filled",
+      "unicode": "e69b",
+      "unicode_decimal": 59035
+    },
+    {
+      "icon_id": "24899568",
+      "name": "phone",
+      "font_class": "phone",
+      "unicode": "e69c",
+      "unicode_decimal": 59036
+    },
+    {
+      "icon_id": "24899570",
+      "name": "email",
+      "font_class": "email",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "24899571",
+      "name": "personadd",
+      "font_class": "personadd",
+      "unicode": "e69f",
+      "unicode_decimal": 59039
+    },
+    {
+      "icon_id": "24899558",
+      "name": "chatboxes-filled",
+      "font_class": "chatboxes-filled",
+      "unicode": "e692",
+      "unicode_decimal": 59026
+    },
+    {
+      "icon_id": "24899559",
+      "name": "contact",
+      "font_class": "contact",
+      "unicode": "e693",
+      "unicode_decimal": 59027
+    },
+    {
+      "icon_id": "24899560",
+      "name": "chatbubble-filled",
+      "font_class": "chatbubble-filled",
+      "unicode": "e694",
+      "unicode_decimal": 59028
+    },
+    {
+      "icon_id": "24899561",
+      "name": "contact-filled",
+      "font_class": "contact-filled",
+      "unicode": "e695",
+      "unicode_decimal": 59029
+    },
+    {
+      "icon_id": "24899562",
+      "name": "chatboxes",
+      "font_class": "chatboxes",
+      "unicode": "e696",
+      "unicode_decimal": 59030
+    },
+    {
+      "icon_id": "24899563",
+      "name": "chatbubble",
+      "font_class": "chatbubble",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    },
+    {
+      "icon_id": "24881290",
+      "name": "upload-filled",
+      "font_class": "upload-filled",
+      "unicode": "e68e",
+      "unicode_decimal": 59022
+    },
+    {
+      "icon_id": "24881292",
+      "name": "upload",
+      "font_class": "upload",
+      "unicode": "e690",
+      "unicode_decimal": 59024
+    },
+    {
+      "icon_id": "24881293",
+      "name": "weixin",
+      "font_class": "weixin",
+      "unicode": "e691",
+      "unicode_decimal": 59025
+    },
+    {
+      "icon_id": "24881274",
+      "name": "compose",
+      "font_class": "compose",
+      "unicode": "e67f",
+      "unicode_decimal": 59007
+    },
+    {
+      "icon_id": "24881275",
+      "name": "qq",
+      "font_class": "qq",
+      "unicode": "e680",
+      "unicode_decimal": 59008
+    },
+    {
+      "icon_id": "24881276",
+      "name": "download-filled",
+      "font_class": "download-filled",
+      "unicode": "e681",
+      "unicode_decimal": 59009
+    },
+    {
+      "icon_id": "24881277",
+      "name": "pengyouquan",
+      "font_class": "pyq",
+      "unicode": "e682",
+      "unicode_decimal": 59010
+    },
+    {
+      "icon_id": "24881279",
+      "name": "sound",
+      "font_class": "sound",
+      "unicode": "e684",
+      "unicode_decimal": 59012
+    },
+    {
+      "icon_id": "24881280",
+      "name": "trash-filled",
+      "font_class": "trash-filled",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "24881281",
+      "name": "sound-filled",
+      "font_class": "sound-filled",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    },
+    {
+      "icon_id": "24881282",
+      "name": "trash",
+      "font_class": "trash",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "24881284",
+      "name": "videocam-filled",
+      "font_class": "videocam-filled",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "24881285",
+      "name": "spinner-cycle",
+      "font_class": "spinner-cycle",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "24881286",
+      "name": "weibo",
+      "font_class": "weibo",
+      "unicode": "e68b",
+      "unicode_decimal": 59019
+    },
+    {
+      "icon_id": "24881288",
+      "name": "videocam",
+      "font_class": "videocam",
+      "unicode": "e68c",
+      "unicode_decimal": 59020
+    },
+    {
+      "icon_id": "24881289",
+      "name": "download",
+      "font_class": "download",
+      "unicode": "e68d",
+      "unicode_decimal": 59021
+    },
+    {
+      "icon_id": "24879601",
+      "name": "help",
+      "font_class": "help",
+      "unicode": "e679",
+      "unicode_decimal": 59001
+    },
+    {
+      "icon_id": "24879602",
+      "name": "navigate-filled",
+      "font_class": "navigate-filled",
+      "unicode": "e67a",
+      "unicode_decimal": 59002
+    },
+    {
+      "icon_id": "24879603",
+      "name": "plusempty",
+      "font_class": "plusempty",
+      "unicode": "e67b",
+      "unicode_decimal": 59003
+    },
+    {
+      "icon_id": "24879604",
+      "name": "smallcircle",
+      "font_class": "smallcircle",
+      "unicode": "e67c",
+      "unicode_decimal": 59004
+    },
+    {
+      "icon_id": "24879605",
+      "name": "minus-filled",
+      "font_class": "minus-filled",
+      "unicode": "e67d",
+      "unicode_decimal": 59005
+    },
+    {
+      "icon_id": "24879606",
+      "name": "micoff",
+      "font_class": "micoff",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "24879588",
+      "name": "closeempty",
+      "font_class": "closeempty",
+      "unicode": "e66c",
+      "unicode_decimal": 58988
+    },
+    {
+      "icon_id": "24879589",
+      "name": "clear",
+      "font_class": "clear",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "24879590",
+      "name": "navigate",
+      "font_class": "navigate",
+      "unicode": "e66e",
+      "unicode_decimal": 58990
+    },
+    {
+      "icon_id": "24879591",
+      "name": "minus",
+      "font_class": "minus",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "24879592",
+      "name": "image",
+      "font_class": "image",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "24879593",
+      "name": "mic",
+      "font_class": "mic",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "24879594",
+      "name": "paperplane",
+      "font_class": "paperplane",
+      "unicode": "e672",
+      "unicode_decimal": 58994
+    },
+    {
+      "icon_id": "24879595",
+      "name": "close",
+      "font_class": "close",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "24879596",
+      "name": "help-filled",
+      "font_class": "help-filled",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "24879597",
+      "name": "plus-filled",
+      "font_class": "paperplane-filled",
+      "unicode": "e675",
+      "unicode_decimal": 58997
+    },
+    {
+      "icon_id": "24879598",
+      "name": "plus",
+      "font_class": "plus",
+      "unicode": "e676",
+      "unicode_decimal": 58998
+    },
+    {
+      "icon_id": "24879599",
+      "name": "mic-filled",
+      "font_class": "mic-filled",
+      "unicode": "e677",
+      "unicode_decimal": 58999
+    },
+    {
+      "icon_id": "24879600",
+      "name": "image-filled",
+      "font_class": "image-filled",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "24855900",
+      "name": "locked-filled",
+      "font_class": "locked-filled",
+      "unicode": "e668",
+      "unicode_decimal": 58984
+    },
+    {
+      "icon_id": "24855901",
+      "name": "info",
+      "font_class": "info",
+      "unicode": "e669",
+      "unicode_decimal": 58985
+    },
+    {
+      "icon_id": "24855903",
+      "name": "locked",
+      "font_class": "locked",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "24855884",
+      "name": "camera-filled",
+      "font_class": "camera-filled",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "24855885",
+      "name": "chat-filled",
+      "font_class": "chat-filled",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "24855886",
+      "name": "camera",
+      "font_class": "camera",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "24855887",
+      "name": "circle",
+      "font_class": "circle",
+      "unicode": "e65b",
+      "unicode_decimal": 58971
+    },
+    {
+      "icon_id": "24855888",
+      "name": "checkmarkempty",
+      "font_class": "checkmarkempty",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "24855889",
+      "name": "chat",
+      "font_class": "chat",
+      "unicode": "e65d",
+      "unicode_decimal": 58973
+    },
+    {
+      "icon_id": "24855890",
+      "name": "circle-filled",
+      "font_class": "circle-filled",
+      "unicode": "e65e",
+      "unicode_decimal": 58974
+    },
+    {
+      "icon_id": "24855891",
+      "name": "flag",
+      "font_class": "flag",
+      "unicode": "e65f",
+      "unicode_decimal": 58975
+    },
+    {
+      "icon_id": "24855892",
+      "name": "flag-filled",
+      "font_class": "flag-filled",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "24855893",
+      "name": "gear-filled",
+      "font_class": "gear-filled",
+      "unicode": "e661",
+      "unicode_decimal": 58977
+    },
+    {
+      "icon_id": "24855894",
+      "name": "home",
+      "font_class": "home",
+      "unicode": "e662",
+      "unicode_decimal": 58978
+    },
+    {
+      "icon_id": "24855895",
+      "name": "home-filled",
+      "font_class": "home-filled",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "24855896",
+      "name": "gear",
+      "font_class": "gear",
+      "unicode": "e664",
+      "unicode_decimal": 58980
+    },
+    {
+      "icon_id": "24855897",
+      "name": "smallcircle-filled",
+      "font_class": "smallcircle-filled",
+      "unicode": "e665",
+      "unicode_decimal": 58981
+    },
+    {
+      "icon_id": "24855898",
+      "name": "map-filled",
+      "font_class": "map-filled",
+      "unicode": "e666",
+      "unicode_decimal": 58982
+    },
+    {
+      "icon_id": "24855899",
+      "name": "map",
+      "font_class": "map",
+      "unicode": "e667",
+      "unicode_decimal": 58983
+    },
+    {
+      "icon_id": "24855825",
+      "name": "refresh-filled",
+      "font_class": "refresh-filled",
+      "unicode": "e656",
+      "unicode_decimal": 58966
+    },
+    {
+      "icon_id": "24855826",
+      "name": "refresh",
+      "font_class": "refresh",
+      "unicode": "e657",
+      "unicode_decimal": 58967
+    },
+    {
+      "icon_id": "24855808",
+      "name": "cloud-upload",
+      "font_class": "cloud-upload",
+      "unicode": "e645",
+      "unicode_decimal": 58949
+    },
+    {
+      "icon_id": "24855809",
+      "name": "cloud-download-filled",
+      "font_class": "cloud-download-filled",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "24855810",
+      "name": "cloud-download",
+      "font_class": "cloud-download",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "24855811",
+      "name": "cloud-upload-filled",
+      "font_class": "cloud-upload-filled",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "24855813",
+      "name": "redo",
+      "font_class": "redo",
+      "unicode": "e64a",
+      "unicode_decimal": 58954
+    },
+    {
+      "icon_id": "24855814",
+      "name": "images-filled",
+      "font_class": "images-filled",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "24855815",
+      "name": "undo-filled",
+      "font_class": "undo-filled",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "24855816",
+      "name": "more",
+      "font_class": "more",
+      "unicode": "e64d",
+      "unicode_decimal": 58957
+    },
+    {
+      "icon_id": "24855817",
+      "name": "more-filled",
+      "font_class": "more-filled",
+      "unicode": "e64e",
+      "unicode_decimal": 58958
+    },
+    {
+      "icon_id": "24855818",
+      "name": "undo",
+      "font_class": "undo",
+      "unicode": "e64f",
+      "unicode_decimal": 58959
+    },
+    {
+      "icon_id": "24855819",
+      "name": "images",
+      "font_class": "images",
+      "unicode": "e650",
+      "unicode_decimal": 58960
+    },
+    {
+      "icon_id": "24855821",
+      "name": "paperclip",
+      "font_class": "paperclip",
+      "unicode": "e652",
+      "unicode_decimal": 58962
+    },
+    {
+      "icon_id": "24855822",
+      "name": "settings",
+      "font_class": "settings",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "24855823",
+      "name": "search",
+      "font_class": "search",
+      "unicode": "e654",
+      "unicode_decimal": 58964
+    },
+    {
+      "icon_id": "24855824",
+      "name": "redo-filled",
+      "font_class": "redo-filled",
+      "unicode": "e655",
+      "unicode_decimal": 58965
+    },
+    {
+      "icon_id": "24841702",
+      "name": "list",
+      "font_class": "list",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "24841489",
+      "name": "mail-open-filled",
+      "font_class": "mail-open-filled",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "24841491",
+      "name": "hand-thumbsdown-filled",
+      "font_class": "hand-down-filled",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "24841492",
+      "name": "hand-thumbsdown",
+      "font_class": "hand-down",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "24841493",
+      "name": "hand-thumbsup-filled",
+      "font_class": "hand-up-filled",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "24841494",
+      "name": "hand-thumbsup",
+      "font_class": "hand-up",
+      "unicode": "e63f",
+      "unicode_decimal": 58943
+    },
+    {
+      "icon_id": "24841496",
+      "name": "heart-filled",
+      "font_class": "heart-filled",
+      "unicode": "e641",
+      "unicode_decimal": 58945
+    },
+    {
+      "icon_id": "24841498",
+      "name": "mail-open",
+      "font_class": "mail-open",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
+    {
+      "icon_id": "24841488",
+      "name": "heart",
+      "font_class": "heart",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "24839963",
+      "name": "loop",
+      "font_class": "loop",
+      "unicode": "e633",
+      "unicode_decimal": 58931
+    },
+    {
+      "icon_id": "24839866",
+      "name": "pulldown",
+      "font_class": "pulldown",
+      "unicode": "e632",
+      "unicode_decimal": 58930
+    },
+    {
+      "icon_id": "24813798",
+      "name": "scan",
+      "font_class": "scan",
+      "unicode": "e62a",
+      "unicode_decimal": 58922
+    },
+    {
+      "icon_id": "24813786",
+      "name": "bars",
+      "font_class": "bars",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "24813788",
+      "name": "cart-filled",
+      "font_class": "cart-filled",
+      "unicode": "e629",
+      "unicode_decimal": 58921
+    },
+    {
+      "icon_id": "24813790",
+      "name": "checkbox",
+      "font_class": "checkbox",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "24813791",
+      "name": "checkbox-filled",
+      "font_class": "checkbox-filled",
+      "unicode": "e62c",
+      "unicode_decimal": 58924
+    },
+    {
+      "icon_id": "24813794",
+      "name": "shop",
+      "font_class": "shop",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
+      "icon_id": "24813795",
+      "name": "headphones",
+      "font_class": "headphones",
+      "unicode": "e630",
+      "unicode_decimal": 58928
+    },
+    {
+      "icon_id": "24813796",
+      "name": "cart",
+      "font_class": "cart",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    }
+  ]
 }

文件差異過大導致無法顯示
+ 13 - 3
uni_modules/uni-icons/components/uni-icons/uni-icons.vue


+ 663 - 0
uni_modules/uni-icons/components/uni-icons/uniicons.css

@@ -0,0 +1,663 @@
+.uniui-color:before {
+  content: "\e6cf";
+}
+
+.uniui-wallet:before {
+  content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+  content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+  content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+  content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+  content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+  content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+  content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+  content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+  content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+  content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+  content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+  content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+  content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+  content: "\e6c3";
+}
+
+.uniui-gift-filled:before {
+  content: "\e6c4";
+}
+
+.uniui-fire-filled:before {
+  content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+  content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+  content: "\e6af";
+}
+
+.uniui-person-filled:before {
+  content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+  content: "\e698";
+}
+
+.uniui-back:before {
+  content: "\e6b9";
+}
+
+.uniui-forward:before {
+  content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+  content: "\e6bb";
+}
+
+.uniui-arrowthinright:before {
+  content: "\e6bb";
+}
+
+.uniui-arrow-left:before {
+  content: "\e6bc";
+}
+
+.uniui-arrowthinleft:before {
+  content: "\e6bc";
+}
+
+.uniui-arrow-up:before {
+  content: "\e6bd";
+}
+
+.uniui-arrowthinup:before {
+  content: "\e6bd";
+}
+
+.uniui-arrow-down:before {
+  content: "\e6be";
+}
+
+.uniui-arrowthindown:before {
+  content: "\e6be";
+}
+
+.uniui-bottom:before {
+  content: "\e6b8";
+}
+
+.uniui-arrowdown:before {
+  content: "\e6b8";
+}
+
+.uniui-right:before {
+  content: "\e6b5";
+}
+
+.uniui-arrowright:before {
+  content: "\e6b5";
+}
+
+.uniui-top:before {
+  content: "\e6b6";
+}
+
+.uniui-arrowup:before {
+  content: "\e6b6";
+}
+
+.uniui-left:before {
+  content: "\e6b7";
+}
+
+.uniui-arrowleft:before {
+  content: "\e6b7";
+}
+
+.uniui-eye:before {
+  content: "\e651";
+}
+
+.uniui-eye-filled:before {
+  content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+  content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+  content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+  content: "\e649";
+}
+
+.uniui-reload:before {
+  content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+  content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+  content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+  content: "\e6ad";
+}
+
+.uniui-location:before {
+  content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+  content: "\e683";
+}
+
+.uniui-star:before {
+  content: "\e688";
+}
+
+.uniui-star-filled:before {
+  content: "\e68f";
+}
+
+.uniui-calendar:before {
+  content: "\e6a0";
+}
+
+.uniui-fire:before {
+  content: "\e6a1";
+}
+
+.uniui-medal:before {
+  content: "\e6a2";
+}
+
+.uniui-font:before {
+  content: "\e6a3";
+}
+
+.uniui-gift:before {
+  content: "\e6a4";
+}
+
+.uniui-link:before {
+  content: "\e6a5";
+}
+
+.uniui-notification:before {
+  content: "\e6a6";
+}
+
+.uniui-staff:before {
+  content: "\e6a7";
+}
+
+.uniui-vip:before {
+  content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+  content: "\e6a9";
+}
+
+.uniui-tune:before {
+  content: "\e6aa";
+}
+
+.uniui-auth:before {
+  content: "\e6ab";
+}
+
+.uniui-person:before {
+  content: "\e699";
+}
+
+.uniui-email-filled:before {
+  content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+  content: "\e69b";
+}
+
+.uniui-phone:before {
+  content: "\e69c";
+}
+
+.uniui-email:before {
+  content: "\e69e";
+}
+
+.uniui-personadd:before {
+  content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+  content: "\e692";
+}
+
+.uniui-contact:before {
+  content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+  content: "\e694";
+}
+
+.uniui-contact-filled:before {
+  content: "\e695";
+}
+
+.uniui-chatboxes:before {
+  content: "\e696";
+}
+
+.uniui-chatbubble:before {
+  content: "\e697";
+}
+
+.uniui-upload-filled:before {
+  content: "\e68e";
+}
+
+.uniui-upload:before {
+  content: "\e690";
+}
+
+.uniui-weixin:before {
+  content: "\e691";
+}
+
+.uniui-compose:before {
+  content: "\e67f";
+}
+
+.uniui-qq:before {
+  content: "\e680";
+}
+
+.uniui-download-filled:before {
+  content: "\e681";
+}
+
+.uniui-pyq:before {
+  content: "\e682";
+}
+
+.uniui-sound:before {
+  content: "\e684";
+}
+
+.uniui-trash-filled:before {
+  content: "\e685";
+}
+
+.uniui-sound-filled:before {
+  content: "\e686";
+}
+
+.uniui-trash:before {
+  content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+  content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+  content: "\e68a";
+}
+
+.uniui-weibo:before {
+  content: "\e68b";
+}
+
+.uniui-videocam:before {
+  content: "\e68c";
+}
+
+.uniui-download:before {
+  content: "\e68d";
+}
+
+.uniui-help:before {
+  content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+  content: "\e67a";
+}
+
+.uniui-plusempty:before {
+  content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+  content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+  content: "\e67d";
+}
+
+.uniui-micoff:before {
+  content: "\e67e";
+}
+
+.uniui-closeempty:before {
+  content: "\e66c";
+}
+
+.uniui-clear:before {
+  content: "\e66d";
+}
+
+.uniui-navigate:before {
+  content: "\e66e";
+}
+
+.uniui-minus:before {
+  content: "\e66f";
+}
+
+.uniui-image:before {
+  content: "\e670";
+}
+
+.uniui-mic:before {
+  content: "\e671";
+}
+
+.uniui-paperplane:before {
+  content: "\e672";
+}
+
+.uniui-close:before {
+  content: "\e673";
+}
+
+.uniui-help-filled:before {
+  content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+  content: "\e675";
+}
+
+.uniui-plus:before {
+  content: "\e676";
+}
+
+.uniui-mic-filled:before {
+  content: "\e677";
+}
+
+.uniui-image-filled:before {
+  content: "\e678";
+}
+
+.uniui-locked-filled:before {
+  content: "\e668";
+}
+
+.uniui-info:before {
+  content: "\e669";
+}
+
+.uniui-locked:before {
+  content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+  content: "\e658";
+}
+
+.uniui-chat-filled:before {
+  content: "\e659";
+}
+
+.uniui-camera:before {
+  content: "\e65a";
+}
+
+.uniui-circle:before {
+  content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+  content: "\e65c";
+}
+
+.uniui-chat:before {
+  content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+  content: "\e65e";
+}
+
+.uniui-flag:before {
+  content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+  content: "\e660";
+}
+
+.uniui-gear-filled:before {
+  content: "\e661";
+}
+
+.uniui-home:before {
+  content: "\e662";
+}
+
+.uniui-home-filled:before {
+  content: "\e663";
+}
+
+.uniui-gear:before {
+  content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+  content: "\e665";
+}
+
+.uniui-map-filled:before {
+  content: "\e666";
+}
+
+.uniui-map:before {
+  content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+  content: "\e656";
+}
+
+.uniui-refresh:before {
+  content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+  content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+  content: "\e646";
+}
+
+.uniui-cloud-download:before {
+  content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+  content: "\e648";
+}
+
+.uniui-redo:before {
+  content: "\e64a";
+}
+
+.uniui-images-filled:before {
+  content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+  content: "\e64c";
+}
+
+.uniui-more:before {
+  content: "\e64d";
+}
+
+.uniui-more-filled:before {
+  content: "\e64e";
+}
+
+.uniui-undo:before {
+  content: "\e64f";
+}
+
+.uniui-images:before {
+  content: "\e650";
+}
+
+.uniui-paperclip:before {
+  content: "\e652";
+}
+
+.uniui-settings:before {
+  content: "\e653";
+}
+
+.uniui-search:before {
+  content: "\e654";
+}
+
+.uniui-redo-filled:before {
+  content: "\e655";
+}
+
+.uniui-list:before {
+  content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+  content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+  content: "\e63c";
+}
+
+.uniui-hand-down:before {
+  content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+  content: "\e63e";
+}
+
+.uniui-hand-up:before {
+  content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+  content: "\e641";
+}
+
+.uniui-mail-open:before {
+  content: "\e643";
+}
+
+.uniui-heart:before {
+  content: "\e639";
+}
+
+.uniui-loop:before {
+  content: "\e633";
+}
+
+.uniui-pulldown:before {
+  content: "\e632";
+}
+
+.uniui-scan:before {
+  content: "\e62a";
+}
+
+.uniui-bars:before {
+  content: "\e627";
+}
+
+.uniui-cart-filled:before {
+  content: "\e629";
+}
+
+.uniui-checkbox:before {
+  content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+  content: "\e62c";
+}
+
+.uniui-shop:before {
+  content: "\e62f";
+}
+
+.uniui-headphones:before {
+  content: "\e630";
+}
+
+.uniui-cart:before {
+  content: "\e631";
+}

二進制
uni_modules/uni-icons/components/uni-icons/uniicons.ttf


+ 85 - 81
uni_modules/uni-icons/package.json

@@ -1,82 +1,86 @@
-{
-  "id": "uni-icons",
-  "displayName": "uni-icons 图标",
-  "version": "1.1.5",
-  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
-  "keywords": [
-    "uni-ui",
-    "uniui",
-    "icon",
-    "图标"
-],
-  "repository": "https://github.com/dcloudio/uni-ui",
-  "engines": {
-    "HBuilderX": ""
-  },
-  "directories": {
-    "example": "../../temps/example_temps"
-  },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
-    "sale": {
-      "regular": {
-        "price": "0.00"
-      },
-      "sourcecode": {
-        "price": "0.00"
-      }
-    },
-    "contact": {
-      "qq": ""
-    },
-    "declaration": {
-      "ads": "无",
-      "data": "无",
-      "permissions": "无"
-    },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
-  },
-  "uni_modules": {
-    "dependencies": [],
-    "encrypt": [],
-    "platforms": {
-      "cloud": {
-        "tcb": "y",
-        "aliyun": "y"
-      },
-      "client": {
-        "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"
-        }
-      }
-    }
-  }
+{
+  "id": "uni-icons",
+  "displayName": "uni-icons 图标",
+  "version": "1.3.5",
+  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "icon",
+    "图标"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.2.14"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "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"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
 }

+ 2 - 40
uni_modules/uni-icons/readme.md

@@ -1,46 +1,8 @@
-
-
 ## Icons 图标
 > **组件名:uni-icons**
 > 代码块: `uIcons`
 
-
 用于展示 icons 图标 。
 
-### 安装方式
-
-本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
-
-如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
-
-### 基本用法
-
-在 ``template`` 中使用组件
-
-```html
-<uni-icons type="contact" size="30"></uni-icons>
-```
-
-
-
-## API
-
-### Icons Props
-
-|属性名	|类型		|默认值	|说明				|
-|:-:	|:-:		|:-:	|:-:				|
-|size	|Number		|24		|图标大小			|
-|type	|String		|-		|图标图案,参考示例	|
-|color	|String		|-		|图标颜色			|
-
-
-### Icons Events
-|事件名	|说明			|返回值|
-|:-:	|:-:			|:-:  |
-|@click|点击 Icon 触发事件|-    |
-
-
-
-## 组件示例
-
-点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons](https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons)
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 8 - 0
uni_modules/uni-scss/changelog.md

@@ -0,0 +1,8 @@
+## 1.0.3(2022-01-21)
+- 优化 组件示例
+## 1.0.2(2021-11-22)
+- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题
+## 1.0.1(2021-11-22)
+- 修复 vue3中scss语法兼容问题
+## 1.0.0(2021-11-18)
+- init

+ 1 - 0
uni_modules/uni-scss/index.scss

@@ -0,0 +1 @@
+@import './styles/index.scss';

+ 82 - 0
uni_modules/uni-scss/package.json

@@ -0,0 +1,82 @@
+{
+  "id": "uni-scss",
+  "displayName": "uni-scss 辅助样式",
+  "version": "1.0.3",
+  "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
+  "keywords": [
+    "uni-scss",
+    "uni-ui",
+    "辅助样式"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "category": [
+        "JS SDK",
+        "通用 SDK"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "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"
+        },
+        "快应用": {
+          "华为": "n",
+          "联盟": "n"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 4 - 0
uni_modules/uni-scss/readme.md

@@ -0,0 +1,4 @@
+`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 7 - 0
uni_modules/uni-scss/styles/index.scss

@@ -0,0 +1,7 @@
+@import './setting/_variables.scss';
+@import './setting/_border.scss';
+@import './setting/_color.scss';
+@import './setting/_space.scss';
+@import './setting/_radius.scss';
+@import './setting/_text.scss';
+@import './setting/_styles.scss';

+ 3 - 0
uni_modules/uni-scss/styles/setting/_border.scss

@@ -0,0 +1,3 @@
+.uni-border {
+	border: 1px $uni-border-1 solid;
+}

+ 66 - 0
uni_modules/uni-scss/styles/setting/_color.scss

@@ -0,0 +1,66 @@
+
+// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐
+// @mixin get-styles($k,$c) {
+// 	@if $k == size or $k == weight{
+// 		font-#{$k}:#{$c}
+// 	}@else{
+// 		#{$k}:#{$c}
+// 	}
+// }
+$uni-ui-color:(
+	// 主色
+	primary: $uni-primary,
+	primary-disable: $uni-primary-disable,
+	primary-light: $uni-primary-light,
+	// 辅助色
+	success: $uni-success,
+	success-disable: $uni-success-disable,
+	success-light: $uni-success-light,
+	warning: $uni-warning,
+	warning-disable: $uni-warning-disable,
+	warning-light: $uni-warning-light,
+	error: $uni-error,
+	error-disable: $uni-error-disable,
+	error-light: $uni-error-light,
+	info: $uni-info,
+	info-disable: $uni-info-disable,
+	info-light: $uni-info-light,
+	// 中性色
+	main-color: $uni-main-color,
+	base-color: $uni-base-color,
+	secondary-color: $uni-secondary-color,
+	extra-color: $uni-extra-color,
+	// 背景色
+	bg-color: $uni-bg-color,
+	// 边框颜色
+	border-1: $uni-border-1,
+	border-2: $uni-border-2,
+	border-3: $uni-border-3,
+	border-4: $uni-border-4,
+	// 黑色
+	black:$uni-black,
+	// 白色
+	white:$uni-white,
+	// 透明
+	transparent:$uni-transparent
+) !default;
+@each $key, $child in $uni-ui-color {
+	.uni-#{"" + $key} {
+		color: $child;
+	}
+	.uni-#{"" + $key}-bg {
+		background-color: $child;
+	}
+}
+.uni-shadow-sm {
+	box-shadow: $uni-shadow-sm;
+}
+.uni-shadow-base {
+	box-shadow: $uni-shadow-base;
+}
+.uni-shadow-lg {
+	box-shadow: $uni-shadow-lg;
+}
+.uni-mask {
+	background-color:$uni-mask;
+}

+ 55 - 0
uni_modules/uni-scss/styles/setting/_radius.scss

@@ -0,0 +1,55 @@
+@mixin radius($r,$d:null ,$important: false){
+  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
+  // Key exists within the $uni-radius variable
+  @if (map-has-key($uni-radius, $r) and  $d){
+		@if $d == t {
+				border-top-left-radius:$radius-value;
+				border-top-right-radius:$radius-value;
+		}@else if $d == r {
+				border-top-right-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == b {
+				border-bottom-left-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == l {
+				border-top-left-radius:$radius-value;
+				border-bottom-left-radius:$radius-value;
+		}@else if $d == tl {
+				border-top-left-radius:$radius-value;
+		}@else if $d == tr {
+				border-top-right-radius:$radius-value;
+		}@else if $d == br {
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == bl {
+				border-bottom-left-radius:$radius-value;
+		}
+  }@else{
+		border-radius:$radius-value;
+  }
+}
+
+@each $key, $child in $uni-radius {
+	@if($key){
+		.uni-radius-#{"" + $key} {
+				@include radius($key)
+		}
+	}@else{
+		.uni-radius {
+				@include radius($key)
+		}
+	}
+}
+
+@each $direction in t, r, b, l,tl, tr, br, bl {
+	@each $key, $child in $uni-radius {
+		@if($key){
+			.uni-radius-#{"" + $direction}-#{"" + $key} {
+				@include radius($key,$direction,false)
+			}
+		}@else{
+			.uni-radius-#{$direction} {
+				@include radius($key,$direction,false)
+			}
+		}
+	}
+}

+ 56 - 0
uni_modules/uni-scss/styles/setting/_space.scss

@@ -0,0 +1,56 @@
+
+@mixin fn($space,$direction,$size,$n) {
+	@if $n {
+		#{$space}-#{$direction}: #{$size*$uni-space-root}px
+	} @else {
+		 #{$space}-#{$direction}: #{-$size*$uni-space-root}px
+	}
+}
+@mixin get-styles($direction,$i,$space,$n){
+	@if $direction == t {
+		@include fn($space, top,$i,$n);
+	} 
+	@if $direction == r {
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == b {
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == l {
+	 @include fn($space, left,$i,$n);
+	} 
+	@if $direction == x {
+		@include fn($space, left,$i,$n);
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == y {
+		@include fn($space, top,$i,$n);
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == a {
+		@if $n {
+			#{$space}:#{$i*$uni-space-root}px;
+		} @else {
+			#{$space}:#{-$i*$uni-space-root}px;
+		}
+	} 
+}
+
+@each $orientation in m,p {
+	$space: margin;
+	@if $orientation == m {
+		$space: margin;
+	} @else {
+		$space: padding;
+	}
+	@for $i from 0 through 16 {
+		@each $direction in t, r, b, l, x, y, a {
+			.uni-#{$orientation}#{$direction}-#{$i} { 
+				@include  get-styles($direction,$i,$space,true);
+			} 
+			.uni-#{$orientation}#{$direction}-n#{$i} { 
+				@include  get-styles($direction,$i,$space,false);
+			}
+		}
+	}
+}

+ 167 - 0
uni_modules/uni-scss/styles/setting/_styles.scss

@@ -0,0 +1,167 @@
+/* #ifndef APP-NVUE */
+
+$-color-white:#fff;
+$-color-black:#000;
+@mixin base-style($color) {
+	color: #fff;
+	background-color: $color;
+	border-color: mix($-color-black, $color, 8%);
+	&:not([hover-class]):active {
+		background: mix($-color-black, $color, 10%);
+		border-color: mix($-color-black, $color, 20%);
+		color: $-color-white;
+		outline: none;
+	}
+}
+@mixin is-color($color) {
+	@include base-style($color);
+	&[loading] {
+		@include base-style($color);
+		&::before {
+			margin-right:5px;
+		}
+	}
+	&[disabled] {
+	  &,
+		&[loading],
+	  &:not([hover-class]):active {
+	    color: $-color-white;
+			border-color: mix(darken($color,10%), $-color-white);
+	    background-color: mix($color, $-color-white);
+	  }
+	}
+
+}
+@mixin base-plain-style($color) {
+	color:$color;
+	background-color: mix($-color-white, $color, 90%);
+	border-color: mix($-color-white, $color, 70%);
+	&:not([hover-class]):active {
+	  background: mix($-color-white, $color, 80%);
+	  color: $color;
+	  outline: none;
+		border-color: mix($-color-white, $color, 50%);
+	}
+}
+@mixin is-plain($color){
+	&[plain] {
+		@include base-plain-style($color);
+		&[loading] {
+			@include base-plain-style($color);
+			&::before {
+				margin-right:5px;
+			}
+		}
+		&[disabled] {
+		  &,
+		  &:active {
+		    color: mix($-color-white, $color, 40%);
+		    background-color: mix($-color-white, $color, 90%);
+				border-color: mix($-color-white, $color, 80%);
+		  }
+		}
+	}
+}
+
+
+.uni-btn {
+	margin: 5px;
+	color: #393939;
+	border:1px solid #ccc;
+	font-size: 16px;
+	font-weight: 200;
+	background-color: #F9F9F9;
+	// TODO 暂时处理边框隐藏一边的问题
+	overflow: visible;
+	&::after{
+		border: none;
+	}
+
+	&:not([type]),&[type=default] {
+		color: #999;
+		&[loading] {
+			background: none;
+			&::before {
+				margin-right:5px;
+			}
+		}
+
+
+
+		&[disabled]{
+			color: mix($-color-white, #999, 60%);
+		  &,
+			&[loading],
+		  &:active {
+				color: mix($-color-white, #999, 60%);
+		    background-color: mix($-color-white,$-color-black , 98%);
+				border-color: mix($-color-white,  #999, 85%);
+		  }
+		}
+
+		&[plain] {
+			color: #999;
+			background: none;
+			border-color: $uni-border-1;
+			&:not([hover-class]):active {
+				background: none;
+			  color: mix($-color-white, $-color-black, 80%);
+				border-color: mix($-color-white, $-color-black, 90%);
+			  outline: none;
+			}
+			&[disabled]{
+			  &,
+				&[loading],
+			  &:active {
+			    background: none;
+					color: mix($-color-white, #999, 60%);
+					border-color: mix($-color-white,  #999, 85%);
+			  }
+			}
+		}
+	}
+
+	&:not([hover-class]):active {
+	  color: mix($-color-white, $-color-black, 50%);
+	}
+
+	&[size=mini] {
+		font-size: 16px;
+		font-weight: 200;
+		border-radius: 8px;
+	}
+
+
+
+	&.uni-btn-small {
+		font-size: 14px;
+	}
+	&.uni-btn-mini {
+		font-size: 12px;
+	}
+
+	&.uni-btn-radius {
+		border-radius: 999px;
+	}
+	&[type=primary] {
+		@include is-color($uni-primary);
+		@include is-plain($uni-primary)
+	}
+	&[type=success] {
+		@include is-color($uni-success);
+		@include is-plain($uni-success)
+	}
+	&[type=error] {
+		@include is-color($uni-error);
+		@include is-plain($uni-error)
+	}
+	&[type=warning] {
+		@include is-color($uni-warning);
+		@include is-plain($uni-warning)
+	}
+	&[type=info] {
+		@include is-color($uni-info);
+		@include is-plain($uni-info)
+	}
+}
+/* #endif */

+ 24 - 0
uni_modules/uni-scss/styles/setting/_text.scss

@@ -0,0 +1,24 @@
+@mixin get-styles($k,$c) {
+	@if $k == size or $k == weight{
+		font-#{$k}:#{$c}
+	}@else{
+		#{$k}:#{$c}
+	}
+}
+
+@each $key, $child in $uni-headings {
+	/* #ifndef APP-NVUE */
+	.uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	.container .uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+}

+ 146 - 0
uni_modules/uni-scss/styles/setting/_variables.scss

@@ -0,0 +1,146 @@
+// @use "sass:math";
+@import  '../tools/functions.scss';
+// 间距基础倍数
+$uni-space-root: 2 !default;
+// 边框半径默认值
+$uni-radius-root:5px !default;
+$uni-radius: () !default;
+// 边框半径断点
+$uni-radius: map-deep-merge(
+  (
+    0: 0,
+		// TODO 当前版本暂时不支持 sm 属性
+    // 'sm': math.div($uni-radius-root, 2),
+    null: $uni-radius-root,
+    'lg': $uni-radius-root * 2,
+    'xl': $uni-radius-root * 6,
+    'pill': 9999px,
+    'circle': 50%
+  ),
+  $uni-radius
+);
+// 字体家族
+$body-font-family: 'Roboto', sans-serif !default;
+// 文本
+$heading-font-family: $body-font-family !default;
+$uni-headings: () !default;
+$letterSpacing: -0.01562em;
+$uni-headings: map-deep-merge(
+  (
+    'h1': (
+      size: 32px,
+			weight: 300,
+			line-height: 50px,
+			// letter-spacing:-0.01562em
+    ),
+    'h2': (
+      size: 28px,
+      weight: 300,
+      line-height: 40px,
+      // letter-spacing: -0.00833em
+    ),
+    'h3': (
+      size: 24px,
+      weight: 400,
+      line-height: 32px,
+      // letter-spacing: normal
+    ),
+    'h4': (
+      size: 20px,
+      weight: 400,
+      line-height: 30px,
+      // letter-spacing: 0.00735em
+    ),
+    'h5': (
+      size: 16px,
+      weight: 400,
+      line-height: 24px,
+      // letter-spacing: normal
+    ),
+    'h6': (
+      size: 14px,
+      weight: 500,
+      line-height: 18px,
+      // letter-spacing: 0.0125em
+    ),
+    'subtitle': (
+      size: 12px,
+      weight: 400,
+      line-height: 20px,
+      // letter-spacing: 0.00937em
+    ),
+    'body': (
+      font-size: 14px,
+			font-weight: 400,
+			line-height: 22px,
+			// letter-spacing: 0.03125em
+    ),
+    'caption': (
+      'size': 12px,
+      'weight': 400,
+      'line-height': 20px,
+      // 'letter-spacing': 0.03333em,
+      // 'text-transform': false
+    )
+  ),
+  $uni-headings
+);
+
+
+
+// 主色
+$uni-primary: #2979ff !default;
+$uni-primary-disable:lighten($uni-primary,20%) !default;
+$uni-primary-light: lighten($uni-primary,25%) !default;
+
+// 辅助色
+// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+$uni-success: #18bc37 !default;
+$uni-success-disable:lighten($uni-success,20%) !default;
+$uni-success-light: lighten($uni-success,25%) !default;
+
+$uni-warning: #f3a73f !default;
+$uni-warning-disable:lighten($uni-warning,20%) !default;
+$uni-warning-light: lighten($uni-warning,25%) !default;
+
+$uni-error: #e43d33 !default;
+$uni-error-disable:lighten($uni-error,20%) !default;
+$uni-error-light: lighten($uni-error,25%) !default;
+
+$uni-info: #8f939c !default;
+$uni-info-disable:lighten($uni-info,20%) !default;
+$uni-info-light: lighten($uni-info,25%) !default;
+
+// 中性色
+// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+$uni-main-color: #3a3a3a !default; 			// 主要文字
+$uni-base-color: #6a6a6a !default;			// 常规文字
+$uni-secondary-color: #909399 !default;	// 次要文字
+$uni-extra-color: #c7c7c7 !default;			// 辅助说明
+
+// 边框颜色
+$uni-border-1: #F0F0F0 !default;
+$uni-border-2: #EDEDED !default;
+$uni-border-3: #DCDCDC !default;
+$uni-border-4: #B9B9B9 !default;
+
+// 常规色
+$uni-black: #000000 !default;
+$uni-white: #ffffff !default;
+$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
+
+// 背景色
+$uni-bg-color: #f7f7f7 !default;
+
+/* 水平间距 */
+$uni-spacing-sm: 8px !default;
+$uni-spacing-base: 15px !default;
+$uni-spacing-lg: 30px !default;
+
+// 阴影
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
+
+// 蒙版
+$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;

+ 19 - 0
uni_modules/uni-scss/styles/tools/functions.scss

@@ -0,0 +1,19 @@
+// 合并 map
+@function map-deep-merge($parent-map, $child-map){
+	$result: $parent-map;
+	@each $key, $child in $child-map {
+		$parent-has-key: map-has-key($result, $key);
+		$parent-value: map-get($result, $key);
+		$parent-type: type-of($parent-value);
+		$child-type: type-of($child);
+		$parent-is-map: $parent-type == map;
+		$child-is-map: $child-type == map;
+			
+		@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
+			$result: map-merge($result, ( $key: $child ));
+		}@else {
+			$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
+		}
+	}
+	@return $result;
+};

+ 31 - 0
uni_modules/uni-scss/theme.scss

@@ -0,0 +1,31 @@
+// 间距基础倍数
+$uni-space-root: 2;
+// 边框半径默认值
+$uni-radius-root:5px;
+// 主色
+$uni-primary: #2979ff;
+// 辅助色
+$uni-success: #4cd964;
+// 警告色
+$uni-warning: #f0ad4e;
+// 错误色
+$uni-error: #dd524d;
+// 描述色
+$uni-info: #909399;
+// 中性色
+$uni-main-color: #303133;
+$uni-base-color: #606266;
+$uni-secondary-color: #909399;
+$uni-extra-color: #C0C4CC;
+// 背景色
+$uni-bg-color: #f5f5f5;
+// 边框颜色
+$uni-border-1: #DCDFE6;
+$uni-border-2: #E4E7ED;
+$uni-border-3: #EBEEF5;
+$uni-border-4: #F2F6FC;
+
+// 常规色
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);

+ 62 - 0
uni_modules/uni-scss/variables.scss

@@ -0,0 +1,62 @@
+@import './styles/setting/_variables.scss';
+// 间距基础倍数
+$uni-space-root: 2;
+// 边框半径默认值
+$uni-radius-root:5px;
+
+// 主色
+$uni-primary: #2979ff;
+$uni-primary-disable:mix(#fff,$uni-primary,50%);
+$uni-primary-light: mix(#fff,$uni-primary,80%);
+
+// 辅助色
+// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+$uni-success: #18bc37;
+$uni-success-disable:mix(#fff,$uni-success,50%);
+$uni-success-light: mix(#fff,$uni-success,80%);
+
+$uni-warning: #f3a73f;
+$uni-warning-disable:mix(#fff,$uni-warning,50%);
+$uni-warning-light: mix(#fff,$uni-warning,80%);
+
+$uni-error: #e43d33;
+$uni-error-disable:mix(#fff,$uni-error,50%);
+$uni-error-light: mix(#fff,$uni-error,80%);
+
+$uni-info: #8f939c;
+$uni-info-disable:mix(#fff,$uni-info,50%);
+$uni-info-light: mix(#fff,$uni-info,80%);
+
+// 中性色
+// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+$uni-main-color: #3a3a3a; 			// 主要文字
+$uni-base-color: #6a6a6a;			// 常规文字
+$uni-secondary-color: #909399;	// 次要文字
+$uni-extra-color: #c7c7c7;			// 辅助说明
+
+// 边框颜色
+$uni-border-1: #F0F0F0;
+$uni-border-2: #EDEDED;
+$uni-border-3: #DCDCDC;
+$uni-border-4: #B9B9B9;
+
+// 常规色
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
+
+// 背景色
+$uni-bg-color: #f7f7f7;
+
+/* 水平间距 */
+$uni-spacing-sm: 8px;
+$uni-spacing-base: 15px;
+$uni-spacing-lg: 30px;
+
+// 阴影
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
+
+// 蒙版
+$uni-mask: rgba($color: #000000, $alpha: 0.4);

+ 33 - 0
uni_modules/uni-swipe-action/changelog.md

@@ -0,0 +1,33 @@
+## 1.3.3(2022-03-31)
+- 修复 按钮字体大小不能设置的bug
+## 1.3.2(2022-03-16)
+- 修复 h5和app端下报el错误的bug
+## 1.3.1(2022-03-07)
+- 修复 HBuilderX 1.4.X 版本中,h5和app端下报错的bug
+## 1.3.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swipe-action](https://uniapp.dcloud.io/component/uniui/uni-swipe-action)
+## 1.2.4(2021-08-20)
+- 优化 close-all 方法
+## 1.2.3(2021-08-20)
+- 新增 close-all 方法,关闭所有已打开的组件
+## 1.2.2(2021-08-17)
+- 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件
+- 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 
+- 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题
+## 1.2.1(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+- 修复 跨页面修改组件数据 ,导致不能滑动的问题
+## 1.1.10(2021-06-17)
+- 修复 按钮点击执行两次的bug
+## 1.1.9(2021-05-12)
+- 新增 项目示例地址
+## 1.1.8(2021-03-26)
+- 修复 微信小程序 nv_navigator is not defined 报错的bug
+## 1.1.7(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 左侧滑动
+- 新增 插槽使用方式
+- 新增 threshold 属性,可以控制滑动缺省值
+- 优化 长列表滚动性能
+- 修复 滚动页面时触发组件滑动的Bug

+ 300 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js

@@ -0,0 +1,300 @@
+let bindIngXMixins = {}
+
+// #ifdef APP-NVUE
+const BindingX = uni.requireNativePlugin('bindingx');
+const dom = uni.requireNativePlugin('dom');
+const animation = uni.requireNativePlugin('animation');
+
+bindIngXMixins = {
+	data() {
+		return {}
+	},
+
+	watch: {
+		show(newVal) {
+			if (this.autoClose) return
+			if (this.stop) return
+			this.stop = true
+			if (newVal) {
+				this.open(newVal)
+			} else {
+				this.close()
+			}
+		},
+		leftOptions() {
+			this.getSelectorQuery()
+			this.init()
+		},
+		rightOptions(newVal) {
+			this.init()
+		}
+	},
+	created() {
+		this.swipeaction = this.getSwipeAction()
+		if (this.swipeaction.children !== undefined) {
+			this.swipeaction.children.push(this)
+		}
+	},
+	mounted() {
+		this.box = this.getEl(this.$refs['selector-box--hock'])
+		this.selector = this.getEl(this.$refs['selector-content--hock']);
+		this.leftButton = this.getEl(this.$refs['selector-left-button--hock']);
+		this.rightButton = this.getEl(this.$refs['selector-right-button--hock']);
+		this.init()
+	},
+	// beforeDestroy() {
+	// 	this.swipeaction.children.forEach((item, index) => {
+	// 		if (item === this) {
+	// 			this.swipeaction.children.splice(index, 1)
+	// 		}
+	// 	})
+	// },
+	methods: {
+		init() {
+			this.$nextTick(() => {
+				this.x = 0
+				this.button = {
+					show: false
+				}
+				setTimeout(() => {
+					this.getSelectorQuery()
+				}, 200)
+			})
+		},
+		onClick(index, item, position) {
+			this.$emit('click', {
+				content: item,
+				index,
+				position
+			})
+		},
+		touchstart(e) {
+			// 每次只触发一次,避免多次监听造成闪烁
+			if (this.stop) return
+			this.stop = true
+			if (this.autoClose) {
+				this.swipeaction.closeOther(this)
+			}
+
+			const leftWidth = this.button.left.width
+			const rightWidth = this.button.right.width
+			let expression = this.range(this.x, -rightWidth, leftWidth)
+			let leftExpression = this.range(this.x - leftWidth, -leftWidth, 0)
+			let rightExpression = this.range(this.x + rightWidth, 0, rightWidth)
+
+			this.eventpan = BindingX.bind({
+				anchor: this.box,
+				eventType: 'pan',
+				props: [{
+					element: this.selector,
+					property: 'transform.translateX',
+					expression
+				}, {
+					element: this.leftButton,
+					property: 'transform.translateX',
+					expression: leftExpression
+				}, {
+					element: this.rightButton,
+					property: 'transform.translateX',
+					expression: rightExpression
+				}, ]
+			}, (e) => {
+				// nope
+				if (e.state === 'end') {
+					this.x = e.deltaX + this.x;
+					this.isclick = true
+					this.bindTiming(e.deltaX)
+				}
+			});
+		},
+		touchend(e) {
+			if (this.isopen !== 'none' && !this.isclick) {
+				this.open('none')
+			}
+		},
+		bindTiming(x) {
+			const left = this.x
+			const leftWidth = this.button.left.width
+			const rightWidth = this.button.right.width
+			const threshold = this.threshold
+			if (!this.isopen || this.isopen === 'none') {
+				if (left > threshold) {
+					this.open('left')
+				} else if (left < -threshold) {
+					this.open('right')
+				} else {
+					this.open('none')
+				}
+			} else {
+				if ((x > -leftWidth && x < 0) || x > rightWidth) {
+					if ((x > -threshold && x < 0) || (x - rightWidth > threshold)) {
+						this.open('left')
+					} else {
+						this.open('none')
+					}
+				} else {
+					if ((x < threshold && x > 0) || (x + leftWidth < -threshold)) {
+						this.open('right')
+					} else {
+						this.open('none')
+					}
+				}
+			}
+		},
+
+		/**
+		 * 移动范围
+		 * @param {Object} num
+		 * @param {Object} mix
+		 * @param {Object} max
+		 */
+		range(num, mix, max) {
+			return `min(max(x+${num}, ${mix}), ${max})`
+		},
+
+		/**
+		 * 开启swipe
+		 */
+		open(type) {
+			this.animation(type)
+		},
+
+		/**
+		 * 关闭swipe
+		 */
+		close() {
+			this.animation('none')
+		},
+
+		/**
+		 * 开启关闭动画
+		 * @param {Object} type
+		 */
+		animation(type) {
+			const time = 300
+			const leftWidth = this.button.left.width
+			const rightWidth = this.button.right.width
+			if (this.eventpan && this.eventpan.token) {
+				BindingX.unbind({
+					token: this.eventpan.token,
+					eventType: 'pan'
+				})
+			}
+
+			switch (type) {
+				case 'left':
+					Promise.all([
+						this.move(this.selector, leftWidth),
+						this.move(this.leftButton, 0),
+						this.move(this.rightButton, rightWidth * 2)
+					]).then(() => {
+						this.setEmit(leftWidth, type)
+					})
+					break
+				case 'right':
+					Promise.all([
+						this.move(this.selector, -rightWidth),
+						this.move(this.leftButton, -leftWidth * 2),
+						this.move(this.rightButton, 0)
+					]).then(() => {
+						this.setEmit(-rightWidth, type)
+					})
+					break
+				default:
+					Promise.all([
+						this.move(this.selector, 0),
+						this.move(this.leftButton, -leftWidth),
+						this.move(this.rightButton, rightWidth)
+					]).then(() => {
+						this.setEmit(0, type)
+					})
+
+			}
+		},
+		setEmit(x, type) {
+			const leftWidth = this.button.left.width
+			const rightWidth = this.button.right.width
+			this.isopen = this.isopen || 'none'
+			this.stop = false
+			this.isclick = false
+			// 只有状态不一致才会返回结果
+			if (this.isopen !== type && this.x !== x) {
+				if (type === 'left' && leftWidth > 0) {
+					this.$emit('change', 'left')
+				}
+				if (type === 'right' && rightWidth > 0) {
+					this.$emit('change', 'right')
+				}
+				if (type === 'none') {
+					this.$emit('change', 'none')
+				}
+			}
+			this.x = x
+			this.isopen = type
+		},
+		move(ref, value) {
+			return new Promise((resolve, reject) => {
+				animation.transition(ref, {
+					styles: {
+						transform: `translateX(${value})`,
+					},
+					duration: 150, //ms
+					timingFunction: 'linear',
+					needLayout: false,
+					delay: 0 //ms
+				}, function(res) {
+					resolve(res)
+				})
+			})
+
+		},
+
+		/**
+		 * 获取ref
+		 * @param {Object} el
+		 */
+		getEl(el) {
+			return el.ref
+		},
+		/**
+		 * 获取节点信息
+		 */
+		getSelectorQuery() {
+			Promise.all([
+				this.getDom('left'),
+				this.getDom('right'),
+			]).then((data) => {
+				let show = 'none'
+				if (this.autoClose) {
+					show = 'none'
+				} else {
+					show = this.show
+				}
+
+				if (show === 'none') {
+					// this.close()
+				} else {
+					this.open(show)
+				}
+
+			})
+
+		},
+		getDom(str) {
+			return new Promise((resolve, reject) => {
+				dom.getComponentRect(this.$refs[`selector-${str}-button--hock`], (data) => {
+					if (data) {
+						this.button[str] = data.size
+						resolve(data)
+					} else {
+						reject()
+					}
+				})
+			})
+		}
+	}
+}
+
+// #endif
+
+export default bindIngXMixins

+ 12 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js

@@ -0,0 +1,12 @@
+export function isPC() {
+	var userAgentInfo = navigator.userAgent;
+	var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+	var flag = true;
+	for (let v = 0; v < Agents.length - 1; v++) {
+		if (userAgentInfo.indexOf(Agents[v]) > 0) {
+			flag = false;
+			break;
+		}
+	}
+	return flag;
+}

+ 193 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js

@@ -0,0 +1,193 @@
+export default {
+	data() {
+		return {
+			x: 0,
+			transition: false,
+			width: 0,
+			viewWidth: 0,
+			swipeShow: 0
+		}
+	},
+	watch: {
+		show(newVal) {
+			if (this.autoClose) return
+			if (newVal && newVal !== 'none' ) {
+				this.transition = true
+				this.open(newVal)
+			} else {
+				this.close()
+			}
+		}
+	},
+	created() {
+		this.swipeaction = this.getSwipeAction()
+		if (this.swipeaction.children !== undefined) {
+			this.swipeaction.children.push(this)
+		}
+	},
+	mounted() {
+		this.isopen = false
+		setTimeout(() => {
+			this.getQuerySelect()
+		}, 50)
+	},
+	methods: {
+		appTouchStart(e) {
+			const {
+				clientX
+			} = e.changedTouches[0]
+			this.clientX = clientX
+			this.timestamp = new Date().getTime()
+		},
+		appTouchEnd(e, index, item, position) {
+			const {
+				clientX
+			} = e.changedTouches[0]
+			// fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
+			let diff = Math.abs(this.clientX - clientX)
+			let time = (new Date().getTime()) - this.timestamp
+			if (diff < 40 && time < 300) {
+				this.$emit('click', {
+					content: item,
+					index,
+					position
+				})
+			}
+		},
+		/**
+		 * 移动触发
+		 * @param {Object} e
+		 */
+		onChange(e) {
+			this.moveX = e.detail.x
+			this.isclose = false
+		},
+		touchstart(e) {
+			this.transition = false
+			this.isclose = true
+			this.autoClose && this.swipeaction.closeOther(this)
+		},
+		touchmove(e) {},
+		touchend(e) {
+			// 0的位置什么都不执行
+			if (this.isclose && this.isopen === 'none') return
+			if (this.isclose && this.isopen !== 'none') {
+				this.transition = true
+				this.close()
+			} else {
+				this.move(this.moveX + this.leftWidth)
+			}
+		},
+
+		/**
+		 * 移动
+		 * @param {Object} moveX
+		 */
+		move(moveX) {
+			// 打开关闭的处理逻辑不太一样
+			this.transition = true
+			// 未打开状态
+			if (!this.isopen || this.isopen === 'none') {
+				if (moveX > this.threshold) {
+					this.open('left')
+				} else if (moveX < -this.threshold) {
+					this.open('right')
+				} else {
+					this.close()
+				}
+			} else {
+				if (moveX < 0 && moveX < this.rightWidth) {
+					const rightX = this.rightWidth + moveX
+					if (rightX < this.threshold) {
+						this.open('right')
+					} else {
+						this.close()
+					}
+				} else if (moveX > 0 && moveX < this.leftWidth) {
+					const leftX = this.leftWidth - moveX
+					if (leftX < this.threshold) {
+						this.open('left')
+					} else {
+						this.close()
+					}
+				}
+
+			}
+
+		},
+
+		/**
+		 * 打开
+		 */
+		open(type) {
+			this.x = this.moveX
+			this.animation(type)
+		},
+
+		/**
+		 * 关闭
+		 */
+		close() {
+			this.x = this.moveX
+			// TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化
+			this.$nextTick(() => {
+				this.x = -this.leftWidth
+				if(this.isopen!=='none'){
+					this.$emit('change', 'none')
+				}
+				this.isopen = 'none'
+			})
+		},
+
+		/**
+		 * 执行结束动画
+		 * @param {Object} type
+		 */
+		animation(type) {
+			this.$nextTick(() => {
+				if (type === 'left') {
+					this.x = 0
+				} else {
+					this.x = -this.rightWidth - this.leftWidth
+				}
+				
+				if(this.isopen!==type){
+					this.$emit('change', type)
+				}
+				this.isopen = type
+			})
+
+		},
+		getSlide(x) {},
+		getQuerySelect() {
+			const query = uni.createSelectorQuery().in(this);
+			query.selectAll('.movable-view--hock').boundingClientRect(data => {
+				this.leftWidth = data[1].width
+				this.rightWidth = data[2].width
+				this.width = data[0].width
+				this.viewWidth = this.width + this.rightWidth + this.leftWidth
+				if (this.leftWidth === 0) {
+					// TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点
+					this.x = -0.1
+				} else {
+					this.x = -this.leftWidth
+				}
+				this.moveX = this.x
+				this.$nextTick(() => {
+					this.swipeShow = 1
+				})
+
+				if (!this.buttonWidth) {
+					this.disabledView = true
+				}
+
+				if (this.autoClose) return
+				if (this.show !== 'none') {
+					this.transition = true
+					this.open(this.shows)
+				}
+			}).exec();
+
+		}
+	}
+}

+ 257 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js

@@ -0,0 +1,257 @@
+let otherMixins = {}
+
+// #ifndef APP-PLUS|| MP-WEIXIN  ||  H5
+const MIN_DISTANCE = 10;
+otherMixins =  {
+	data() {
+		// TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug
+		const elClass = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+		return {
+			uniShow: false,
+			left: 0,
+			buttonShow: 'none',
+			ani: false,
+			moveLeft:'',
+			elClass
+		}
+	},
+	watch: {
+		show(newVal) {
+			if (this.autoClose) return
+			this.openState(newVal)
+		},
+		left(){
+			this.moveLeft = `translateX(${this.left}px)`
+		},
+		buttonShow(newVal){
+			if (this.autoClose) return
+			this.openState(newVal)
+		},
+		leftOptions() {
+			this.init()
+		},
+		rightOptions() {
+			this.init()
+		}
+	},
+	mounted() {
+		this.swipeaction = this.getSwipeAction()
+		if (this.swipeaction.children !== undefined) {
+			this.swipeaction.children.push(this)
+		}
+		this.init()
+	},
+	methods: {
+		init(){
+			clearTimeout(this.timer)
+			this.timer = setTimeout(() => {
+				this.getSelectorQuery()
+			}, 100)
+			// 移动距离
+			this.left = 0
+			this.x = 0
+		},
+
+		closeSwipe(e) {
+			if (!this.autoClose) return
+			this.swipeaction.closeOther(this)
+		},
+		appTouchStart(e) {
+			const {
+				clientX
+			} = e.changedTouches[0]
+			this.clientX = clientX
+			this.timestamp = new Date().getTime()
+		},
+		appTouchEnd(e, index, item, position) {
+			const {
+				clientX
+			} = e.changedTouches[0]
+			// fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
+			let diff = Math.abs(this.clientX - clientX)
+			let time = (new Date().getTime()) - this.timestamp
+			if (diff < 40 && time < 300) {
+				this.$emit('click', {
+					content: item,
+					index,
+					position
+				})
+			}
+		},
+		touchstart(e) {
+			if (this.disabled) return
+			this.ani = false
+			this.x = this.left || 0
+			this.stopTouchStart(e)
+			this.autoClose && this.closeSwipe()
+		},
+		touchmove(e) {
+			if (this.disabled) return
+			// 是否可以滑动页面
+			this.stopTouchMove(e);
+			if (this.direction !== 'horizontal') {
+				return;
+			}
+			this.move(this.x + this.deltaX)
+			return false
+		},
+		touchend() {
+			if (this.disabled) return
+			this.moveDirection(this.left)
+		},
+		/**
+		 * 设置移动距离
+		 * @param {Object} value
+		 */
+		move(value) {
+			value = value || 0
+			const leftWidth = this.leftWidth
+			const rightWidth = this.rightWidth
+			// 获取可滑动范围
+			this.left = this.range(value, -rightWidth, leftWidth);
+		},
+
+		/**
+		 * 获取范围
+		 * @param {Object} num
+		 * @param {Object} min
+		 * @param {Object} max
+		 */
+		range(num, min, max) {
+			return Math.min(Math.max(num, min), max);
+		},
+		/**
+		 * 移动方向判断
+		 * @param {Object} left
+		 * @param {Object} value
+		 */
+		moveDirection(left) {
+			const threshold = this.threshold
+			const isopen = this.isopen || 'none'
+			const leftWidth = this.leftWidth
+			const rightWidth = this.rightWidth
+			if (this.deltaX === 0) {
+				this.openState('none')
+				return
+			}
+			if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && rightWidth +
+					left < threshold)) {
+				// right
+				this.openState('right')
+			} else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&
+					leftWidth - left < threshold)) {
+				// left
+				this.openState('left')
+			} else {
+				// default
+				this.openState('none')
+			}
+		},
+
+		/**
+		 * 开启状态
+		 * @param {Boolean} type
+		 */
+		openState(type) {
+			const leftWidth = this.leftWidth
+			const rightWidth = this.rightWidth
+			let left = ''
+			this.isopen = this.isopen ? this.isopen : 'none'
+			switch (type) {
+				case "left":
+					left = leftWidth
+					break
+				case "right":
+					left = -rightWidth
+					break
+				default:
+					left = 0
+			}
+
+
+			if (this.isopen !== type) {
+				this.throttle = true
+				this.$emit('change', type)
+			}
+
+			this.isopen = type
+			// 添加动画类
+			this.ani = true
+			this.$nextTick(() => {
+				this.move(left)
+			})
+			// 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的
+		},
+		close() {
+			this.openState('none')
+		},
+		getDirection(x, y) {
+			if (x > y && x > MIN_DISTANCE) {
+				return 'horizontal';
+			}
+			if (y > x && y > MIN_DISTANCE) {
+				return 'vertical';
+			}
+			return '';
+		},
+
+		/**
+		 * 重置滑动状态
+		 * @param {Object} event
+		 */
+		resetTouchStatus() {
+			this.direction = '';
+			this.deltaX = 0;
+			this.deltaY = 0;
+			this.offsetX = 0;
+			this.offsetY = 0;
+		},
+
+		/**
+		 * 设置滑动开始位置
+		 * @param {Object} event
+		 */
+		stopTouchStart(event) {
+			this.resetTouchStatus();
+			const touch = event.touches[0];
+			this.startX = touch.clientX;
+			this.startY = touch.clientY;
+		},
+
+		/**
+		 * 滑动中,是否禁止打开
+		 * @param {Object} event
+		 */
+		stopTouchMove(event) {
+			const touch = event.touches[0];
+			this.deltaX = touch.clientX - this.startX;
+			this.deltaY = touch.clientY - this.startY;
+			this.offsetX = Math.abs(this.deltaX);
+			this.offsetY = Math.abs(this.deltaY);
+			this.direction = this.direction || this.getDirection(this.offsetX, this.offsetY);
+		},
+
+		getSelectorQuery() {
+			const views = uni.createSelectorQuery().in(this)
+			views
+				.selectAll('.'+this.elClass)
+				.boundingClientRect(data => {
+					if(data.length === 0) return
+					let show = 'none'
+					if (this.autoClose) {
+						show = 'none'
+					} else {
+						show = this.show
+					}
+					this.leftWidth = data[0].width || 0
+					this.rightWidth = data[1].width || 0
+					this.buttonShow = show
+				})
+				.exec()
+		}
+	}
+}
+
+// #endif
+
+export default otherMixins

+ 82 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js

@@ -0,0 +1,82 @@
+let mpMixins = {}
+// #ifdef APP-VUE|| MP-WEIXIN || H5
+import {
+	isPC
+} from "./isPC"
+mpMixins = {
+	data() {
+		return {
+			is_show: 'none'
+		}
+	},
+	watch: {
+		show(newVal) {
+			this.is_show = this.show
+		}
+	},
+	created() {
+		this.swipeaction = this.getSwipeAction()
+		if (this.swipeaction.children !== undefined) {
+			this.swipeaction.children.push(this)
+		}
+	},
+	mounted() {
+		this.is_show = this.show
+	},
+	methods: {
+		// wxs 中调用
+		closeSwipe(e) {
+			if (!this.autoClose) return
+			this.swipeaction.closeOther(this)
+		},
+
+		change(e) {
+			this.$emit('change', e.open)
+			if (this.is_show !== e.open) {
+				this.is_show = e.open
+			}
+		},
+
+		appTouchStart(e) {
+			// #ifdef H5
+			if (isPC()) return
+			// #endif
+			const {
+				clientX
+			} = e.changedTouches[0]
+			this.clientX = clientX
+			this.timestamp = new Date().getTime()
+		},
+		appTouchEnd(e, index, item, position) {
+			// #ifdef H5
+			if (isPC()) return
+			// #endif
+			const {
+				clientX
+			} = e.changedTouches[0]
+			// fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
+			let diff = Math.abs(this.clientX - clientX)
+			let time = (new Date().getTime()) - this.timestamp
+			if (diff < 40 && time < 300) {
+				this.$emit('click', {
+					content: item,
+					index,
+					position
+				})
+			}
+		},
+		onClickForPC(index, item, position) {
+			// #ifdef H5
+			if (!isPC()) return
+			this.$emit('click', {
+				content: item,
+				index,
+				position
+			})
+			// #endif
+		}
+	}
+}
+
+// #endif
+export default mpMixins

+ 270 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js

@@ -0,0 +1,270 @@
+const MIN_DISTANCE = 10;
+export default {
+	showWatch(newVal, oldVal, ownerInstance, instance,self) {
+		var state = self.state
+		var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el
+		if(!$el) return
+		this.getDom(instance, ownerInstance,self)
+		if (newVal && newVal !== 'none') {
+			this.openState(newVal, instance, ownerInstance,self)
+			return
+		}
+
+		if (state.left) {
+			this.openState('none', instance, ownerInstance,self)
+		}
+		this.resetTouchStatus(instance,self)
+	},
+
+	/**
+	 * 开始触摸操作
+	 * @param {Object} e
+	 * @param {Object} ins
+	 */
+	touchstart(e, ownerInstance, self) {
+		let instance = e.instance;
+		let disabled = instance.getDataset().disabled
+		let state = self.state;
+		this.getDom(instance, ownerInstance, self)
+		// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+		disabled = this.getDisabledType(disabled)
+		if (disabled) return
+		// 开始触摸时移除动画类
+		instance.requestAnimationFrame(function() {
+			instance.removeClass('ani');
+			ownerInstance.callMethod('closeSwipe');
+		})
+
+		// 记录上次的位置
+		state.x = state.left || 0
+		// 计算滑动开始位置
+		this.stopTouchStart(e, ownerInstance, self)
+	},
+
+	/**
+	 * 开始滑动操作
+	 * @param {Object} e
+	 * @param {Object} ownerInstance
+	 */
+	touchmove(e, ownerInstance, self) {
+		let instance = e.instance;
+		// 删除之后已经那不到实例了
+		if(!instance) return;
+		let disabled = instance.getDataset().disabled
+		let state = self.state
+		// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+		disabled = this.getDisabledType(disabled)
+		if (disabled) return
+		// 是否可以滑动页面
+		this.stopTouchMove(e, self);
+		if (state.direction !== 'horizontal') {
+			return;
+		}
+		if (e.preventDefault) {
+			// 阻止页面滚动
+			e.preventDefault()
+		}
+		let x = state.x + state.deltaX
+		this.move(x, instance, ownerInstance, self)
+	},
+
+	/**
+	 * 结束触摸操作
+	 * @param {Object} e
+	 * @param {Object} ownerInstance
+	 */
+	touchend(e, ownerInstance, self) {
+		let instance = e.instance;
+		let disabled = instance.getDataset().disabled
+		let state = self.state
+		// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+		disabled = this.getDisabledType(disabled)
+
+		if (disabled) return
+		// 滑动过程中触摸结束,通过阙值判断是开启还是关闭
+		// fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13
+		this.moveDirection(state.left, instance, ownerInstance, self)
+
+	},
+
+	/**
+	 * 设置移动距离
+	 * @param {Object} value
+	 * @param {Object} instance
+	 * @param {Object} ownerInstance
+	 */
+	move(value, instance, ownerInstance, self) {
+		value = value || 0
+		let state = self.state
+		let leftWidth = state.leftWidth
+		let rightWidth = state.rightWidth
+		// 获取可滑动范围
+		state.left = this.range(value, -rightWidth, leftWidth);
+		instance.requestAnimationFrame(function() {
+			instance.setStyle({
+				transform: 'translateX(' + state.left + 'px)',
+				'-webkit-transform': 'translateX(' + state.left + 'px)'
+			})
+		})
+
+	},
+
+	/**
+	 * 获取元素信息
+	 * @param {Object} instance
+	 * @param {Object} ownerInstance
+	 */
+	getDom(instance, ownerInstance, self) {
+		var state = self.state
+		var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el
+		var leftDom = $el.querySelector('.button-group--left')
+		var rightDom = $el.querySelector('.button-group--right')
+
+		state.leftWidth = leftDom.offsetWidth || 0
+		state.rightWidth = rightDom.offsetWidth || 0
+		state.threshold = instance.getDataset().threshold
+	},
+
+	getDisabledType(value) {
+		return (typeof(value) === 'string' ? JSON.parse(value) : value) || false;
+	},
+
+	/**
+	 * 获取范围
+	 * @param {Object} num
+	 * @param {Object} min
+	 * @param {Object} max
+	 */
+	range(num, min, max) {
+		return Math.min(Math.max(num, min), max);
+	},
+
+
+	/**
+	 * 移动方向判断
+	 * @param {Object} left
+	 * @param {Object} value
+	 * @param {Object} ownerInstance
+	 * @param {Object} ins
+	 */
+	moveDirection(left, ins, ownerInstance, self) {
+		var state = self.state
+		var threshold = state.threshold
+		var position = state.position
+		var isopen = state.isopen || 'none'
+		var leftWidth = state.leftWidth
+		var rightWidth = state.rightWidth
+		if (state.deltaX === 0) {
+			this.openState('none', ins, ownerInstance, self)
+			return
+		}
+		if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 &&
+				rightWidth +
+				left < threshold)) {
+			// right
+			this.openState('right', ins, ownerInstance, self)
+		} else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&
+				leftWidth - left < threshold)) {
+			// left
+			this.openState('left', ins, ownerInstance, self)
+		} else {
+			// default
+			this.openState('none', ins, ownerInstance, self)
+		}
+	},
+
+
+	/**
+	 * 开启状态
+	 * @param {Boolean} type
+	 * @param {Object} ins
+	 * @param {Object} ownerInstance
+	 */
+	openState(type, ins, ownerInstance, self) {
+		let state = self.state
+		let leftWidth = state.leftWidth
+		let rightWidth = state.rightWidth
+		let left = ''
+		state.isopen = state.isopen ? state.isopen : 'none'
+		switch (type) {
+			case "left":
+				left = leftWidth
+				break
+			case "right":
+				left = -rightWidth
+				break
+			default:
+				left = 0
+		}
+
+		// && !state.throttle
+
+		if (state.isopen !== type) {
+			state.throttle = true
+			ownerInstance.callMethod('change', {
+				open: type
+			})
+
+		}
+
+		state.isopen = type
+		// 添加动画类
+		ins.requestAnimationFrame(()=> {
+			ins.addClass('ani');
+			this.move(left, ins, ownerInstance, self)
+		})
+	},
+
+
+	getDirection(x, y) {
+		if (x > y && x > MIN_DISTANCE) {
+			return 'horizontal';
+		}
+		if (y > x && y > MIN_DISTANCE) {
+			return 'vertical';
+		}
+		return '';
+	},
+
+	/**
+	 * 重置滑动状态
+	 * @param {Object} event
+	 */
+	resetTouchStatus(instance, self) {
+		let state = self.state;
+		state.direction = '';
+		state.deltaX = 0;
+		state.deltaY = 0;
+		state.offsetX = 0;
+		state.offsetY = 0;
+	},
+
+	/**
+	 * 设置滑动开始位置
+	 * @param {Object} event
+	 */
+	stopTouchStart(event, ownerInstance, self) {
+		let instance = event.instance;
+		let state = self.state
+		this.resetTouchStatus(instance, self);
+		var touch = event.touches[0];
+		state.startX = touch.clientX;
+		state.startY = touch.clientY;
+	},
+
+	/**
+	 * 滑动中,是否禁止打开
+	 * @param {Object} event
+	 */
+	stopTouchMove(event, self) {
+		let instance = event.instance;
+		let state = self.state;
+		let touch = event.touches[0];
+
+		state.deltaX = touch.clientX - state.startX;
+		state.deltaY = touch.clientY - state.startY;
+		state.offsetY = Math.abs(state.deltaY);
+		state.offsetX = Math.abs(state.deltaX);
+		state.direction = state.direction || this.getDirection(state.offsetX, state.offsetY);
+	}
+}

+ 344 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue

@@ -0,0 +1,344 @@
+<template>
+	<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
+	<!-- #ifdef APP-VUE || MP-WEIXIN || H5 -->
+	<view class="uni-swipe">
+		<!--  #ifdef MP-WEIXIN || VUE3 -->
+		<view class="uni-swipe_box" :change:prop="wxsswipe.showWatch"
+			:prop="is_show" :data-threshold="threshold" :data-disabled="disabled" @touchstart="wxsswipe.touchstart" @touchmove="wxsswipe.touchmove" @touchend="wxsswipe.touchend">
+		<!-- #endif -->
+		<!--  #ifndef MP-WEIXIN || VUE3 -->
+		<view class="uni-swipe_box" :change:prop="renderswipe.showWatch"
+			:prop="is_show" :data-threshold="threshold" :data-disabled="disabled+''" @touchstart="renderswipe.touchstart" @touchmove="renderswipe.touchmove" @touchend="renderswipe.touchend">
+		<!-- #endif -->
+			<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
+			<view class="uni-swipe_button-group button-group--left">
+				<slot name="left">
+					<view v-for="(item,index) in leftOptions"  :key="index" :style="{
+					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
+					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
+						@touchend="appTouchEnd($event,index,item,'left')" @click.stop="onClickForPC(index,item,'left')">
+						<text class="uni-swipe_button-text"
+							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
+					</view>
+				</slot>
+			</view>
+			<view class="uni-swipe_text--center">
+				<slot></slot>
+			</view>
+			<view class="uni-swipe_button-group button-group--right">
+				<slot name="right">
+					<view v-for="(item,index) in rightOptions"  :key="index" :style="{
+					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
+					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
+						@touchend="appTouchEnd($event,index,item,'right')"
+						@click.stop="onClickForPC(index,item,'right')"><text class="uni-swipe_button-text"
+							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
+					</view>
+				</slot>
+			</view>
+		</view>
+	</view>
+	<!-- #endif -->
+	<!-- app nvue端 使用 bindingx -->
+	<!-- #ifdef APP-NVUE -->
+	<view ref="selector-box--hock" class="uni-swipe" @horizontalpan="touchstart" @touchend="touchend">
+		<view ref='selector-left-button--hock' class="uni-swipe_button-group button-group--left">
+			<slot name="left">
+				<view v-for="(item,index) in leftOptions" :data-button="btn" :key="index" :style="{
+				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
+				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'left')"><text
+						class="uni-swipe_button-text"
+						:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF', fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
+				</view>
+			</slot>
+		</view>
+		<view ref='selector-right-button--hock' class="uni-swipe_button-group button-group--right">
+			<slot name="right">
+				<view v-for="(item,index) in rightOptions" :data-button="btn" :key="index" :style="{
+				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
+				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'right')"><text
+						class="uni-swipe_button-text"
+						:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
+				</view>
+			</slot>
+		</view>
+		<view ref='selector-content--hock' class="uni-swipe_box">
+			<slot></slot>
+		</view>
+	</view>
+	<!-- #endif -->
+	<!-- 其他平台使用 js ,长列表性能可能会有影响-->
+	<!-- #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ -->
+	<view class="uni-swipe">
+		<view class="uni-swipe_box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"
+			:style="{transform:moveLeft}" :class="{ani:ani}">
+			<view class="uni-swipe_button-group button-group--left" :class="[elClass]">
+				<slot name="left">
+					<view v-for="(item,index) in leftOptions" :data-button="btn" :key="index" :style="{
+					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
+					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
+					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
+						@touchend="appTouchEnd($event,index,item,'left')"><text class="uni-swipe_button-text"
+							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text>
+					</view>
+				</slot>
+			</view>
+			<slot></slot>
+			<view class="uni-swipe_button-group button-group--right" :class="[elClass]">
+				<slot name="right">
+					<view v-for="(item,index) in rightOptions" :data-button="btn" :key="index" :style="{
+					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
+					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
+					}" @touchstart="appTouchStart" @touchend="appTouchEnd($event,index,item,'right')"
+						class="uni-swipe_button button-hock"><text class="uni-swipe_button-text"
+							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text>
+					</view>
+				</slot>
+			</view>
+		</view>
+	</view>
+	<!-- #endif -->
+
+</template>
+<script src="./wx.wxs" module="wxsswipe" lang="wxs"></script>
+
+<script module="renderswipe" lang="renderjs">
+	import render from './render.js'
+	export default {
+		mounted(e,ins,owner) {
+			this.state = {}
+		},
+		methods:{
+			showWatch(newVal, oldVal, ownerInstance, instance){
+				render.showWatch(newVal, oldVal, ownerInstance, instance,this)
+			},
+			touchstart(e,ownerInstance){
+				render.touchstart(e,ownerInstance,this)
+			},
+			touchmove(e, ownerInstance){
+				render.touchmove(e,ownerInstance,this)
+			},
+			touchend(e,ownerInstance){
+				render.touchend(e,ownerInstance,this)
+			}
+		}
+	}
+</script>
+<script>
+	import mpwxs from './mpwxs'
+	import bindingx from './bindingx.js'
+	import mpother from './mpother'
+
+	/**
+	 * SwipeActionItem 滑动操作子组件
+	 * @description 通过滑动触发选项的容器
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=181
+	 * @property {Boolean} show = [left|right|none] 	开启关闭组件,auto-close = false 时生效
+	 * @property {Boolean} disabled = [true|false] 		是否禁止滑动
+	 * @property {Boolean} autoClose = [true|false] 	滑动打开当前组件,是否关闭其他组件
+	 * @property {Number}  threshold 					滑动缺省值
+	 * @property {Array} leftOptions 					左侧选项内容及样式
+	 * @property {Array} rgihtOptions 					右侧选项内容及样式
+	 * @event {Function} click 							点击选项按钮时触发事件,e = {content,index} ,content(点击内容)、index(下标)
+	 * @event {Function} change 						组件打开或关闭时触发,left\right\none
+	 */
+
+	export default {
+		mixins: [mpwxs,bindingx,mpother],
+		emits:['click','change'],
+		props: {
+			// 控制开关
+			show: {
+				type: String,
+				default: 'none'
+			},
+
+			// 禁用
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+
+			// 是否自动关闭
+			autoClose: {
+				type: Boolean,
+				default: true
+			},
+
+			// 滑动缺省距离
+			threshold: {
+				type: Number,
+				default: 20
+			},
+
+			// 左侧按钮内容
+			leftOptions: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+
+			// 右侧按钮内容
+			rightOptions: {
+				type: Array,
+				default () {
+					return []
+				}
+			}
+
+		},
+		// #ifndef VUE3
+		// TODO vue2
+		destroyed() {
+			if (this.__isUnmounted) return
+			this.uninstall()
+		},
+		// #endif
+		// #ifdef VUE3
+		// TODO vue3
+		unmounted() {
+			this.__isUnmounted = true
+			this.uninstall()
+		},
+		// #endif
+
+		methods: {
+			uninstall() {
+				if (this.swipeaction) {
+					this.swipeaction.children.forEach((item, index) => {
+						if (item === this) {
+							this.swipeaction.children.splice(index, 1)
+						}
+					})
+				}
+			},
+			/**
+			 * 获取父元素实例
+			 */
+			getSwipeAction(name = 'uniSwipeAction') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false;
+					parentName = parent.$options.name;
+				}
+				return parent;
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.uni-swipe {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		/* #endif */
+	}
+
+	.uni-swipe_box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex-shrink: 0;
+		// touch-action: none;
+		/* #endif */
+		position: relative;
+	}
+
+	.uni-swipe_content {
+		// border: 1px red solid;
+	}
+
+	.uni-swipe_text--center {
+		width: 100%;
+		/* #ifndef APP-NVUE */
+		cursor: grab;
+		/* #endif */
+	}
+
+	.uni-swipe_button-group {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		position: absolute;
+		top: 0;
+		bottom: 0;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.button-group--left {
+		left: 0;
+		transform: translateX(-100%)
+	}
+
+	.button-group--right {
+		right: 0;
+		transform: translateX(100%)
+	}
+
+	.uni-swipe_button {
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		padding: 0 20px;
+	}
+
+	.uni-swipe_button-text {
+		/* #ifndef APP-NVUE */
+		flex-shrink: 0;
+		/* #endif */
+		font-size: 14px;
+	}
+
+	.ani {
+		transition-property: transform;
+		transition-duration: 0.3s;
+		transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);
+	}
+
+	/* #ifdef MP-ALIPAY */
+	.movable-area {
+		/* width: 100%; */
+		height: 45px;
+	}
+
+	.movable-view {
+		display: flex;
+		/* justify-content: center; */
+		position: relative;
+		flex: 1;
+		height: 45px;
+		z-index: 2;
+	}
+
+	.movable-view-button {
+		display: flex;
+		flex-shrink: 0;
+		flex-direction: row;
+		height: 100%;
+		background: #C0C0C0;
+	}
+
+	/* .transition {
+		transition: all 0.3s;
+	} */
+
+	.movable-view-box {
+		flex-shrink: 0;
+		height: 100%;
+		background-color: #fff;
+	}
+
+	/* #endif */
+</style>

+ 341 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs

@@ -0,0 +1,341 @@
+var MIN_DISTANCE = 10;
+
+/**
+ * 判断当前是否为H5、app-vue
+ */
+var IS_HTML5 = false
+if (typeof window === 'object') IS_HTML5 = true
+
+/**
+ * 监听页面内值的变化,主要用于动态开关swipe-action
+ * @param {Object} newValue
+ * @param {Object} oldValue
+ * @param {Object} ownerInstance
+ * @param {Object} instance
+ */
+function showWatch(newVal, oldVal, ownerInstance, instance) {
+	var state = instance.getState()
+	getDom(instance, ownerInstance)
+	if (newVal && newVal !== 'none') {
+		openState(newVal, instance, ownerInstance)
+		return
+	}
+
+	if (state.left) {
+		openState('none', instance, ownerInstance)
+	}
+	resetTouchStatus(instance)
+}
+
+/**
+ * 开始触摸操作
+ * @param {Object} e
+ * @param {Object} ins
+ */
+function touchstart(e, ownerInstance) {
+	var instance = e.instance;
+	var disabled = instance.getDataset().disabled
+	var state = instance.getState();
+	getDom(instance, ownerInstance)
+	// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+	disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
+	if (disabled) return
+	// 开始触摸时移除动画类
+	instance.requestAnimationFrame(function() {
+		instance.removeClass('ani');
+		ownerInstance.callMethod('closeSwipe');
+	})
+
+	// 记录上次的位置
+	state.x = state.left || 0
+	// 计算滑动开始位置
+	stopTouchStart(e, ownerInstance)
+}
+
+/**
+ * 开始滑动操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+function touchmove(e, ownerInstance) {
+	var instance = e.instance;
+	var disabled = instance.getDataset().disabled
+	var state = instance.getState()
+	// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+	disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
+	if (disabled) return
+	// 是否可以滑动页面
+	stopTouchMove(e);
+	if (state.direction !== 'horizontal') {
+		return;
+	}
+
+	if (e.preventDefault) {
+		// 阻止页面滚动
+		e.preventDefault()
+	}
+
+	move(state.x + state.deltaX, instance, ownerInstance)
+}
+
+/**
+ * 结束触摸操作
+ * @param {Object} e
+ * @param {Object} ownerInstance
+ */
+function touchend(e, ownerInstance) {
+	var instance = e.instance;
+	var disabled = instance.getDataset().disabled
+	var state = instance.getState()
+	// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
+	disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
+
+	if (disabled) return
+	// 滑动过程中触摸结束,通过阙值判断是开启还是关闭
+	// fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13
+	moveDirection(state.left, instance, ownerInstance)
+
+}
+
+/**
+ * 设置移动距离
+ * @param {Object} value
+ * @param {Object} instance
+ * @param {Object} ownerInstance
+ */
+function move(value, instance, ownerInstance) {
+	value = value || 0
+	var state = instance.getState()
+	var leftWidth = state.leftWidth
+	var rightWidth = state.rightWidth
+	// 获取可滑动范围
+	state.left = range(value, -rightWidth, leftWidth);
+	instance.requestAnimationFrame(function() {
+		instance.setStyle({
+			transform: 'translateX(' + state.left + 'px)',
+			'-webkit-transform': 'translateX(' + state.left + 'px)'
+		})
+	})
+
+}
+
+/**
+ * 获取元素信息
+ * @param {Object} instance
+ * @param {Object} ownerInstance
+ */
+function getDom(instance, ownerInstance) {
+	var state = instance.getState()
+	var leftDom = ownerInstance.selectComponent('.button-group--left')
+	var rightDom = ownerInstance.selectComponent('.button-group--right')
+	var leftStyles = {
+		width: 0
+	}
+	var rightStyles = {
+		width: 0
+	}
+	leftStyles = leftDom.getBoundingClientRect()
+	rightStyles = rightDom.getBoundingClientRect()
+
+	state.leftWidth = leftStyles.width || 0
+	state.rightWidth = rightStyles.width || 0
+	state.threshold = instance.getDataset().threshold
+}
+
+/**
+ * 获取范围
+ * @param {Object} num
+ * @param {Object} min
+ * @param {Object} max
+ */
+function range(num, min, max) {
+	return Math.min(Math.max(num, min), max);
+}
+
+
+/**
+ * 移动方向判断
+ * @param {Object} left
+ * @param {Object} value
+ * @param {Object} ownerInstance
+ * @param {Object} ins
+ */
+function moveDirection(left, ins, ownerInstance) {
+	var state = ins.getState()
+	var threshold = state.threshold
+	var position = state.position
+	var isopen = state.isopen || 'none'
+	var leftWidth = state.leftWidth
+	var rightWidth = state.rightWidth
+	if (state.deltaX === 0) {
+		openState('none', ins, ownerInstance)
+		return
+	}
+	if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 &&
+			rightWidth +
+			left < threshold)) {
+		// right
+		openState('right', ins, ownerInstance)
+	} else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&
+			leftWidth - left < threshold)) {
+		// left
+		openState('left', ins, ownerInstance)
+	} else {
+		// default
+		openState('none', ins, ownerInstance)
+	}
+}
+
+
+/**
+ * 开启状态
+ * @param {Boolean} type
+ * @param {Object} ins
+ * @param {Object} ownerInstance
+ */
+function openState(type, ins, ownerInstance) {
+	var state = ins.getState()
+	var leftWidth = state.leftWidth
+	var rightWidth = state.rightWidth
+	var left = ''
+	state.isopen = state.isopen ? state.isopen : 'none'
+	switch (type) {
+		case "left":
+			left = leftWidth
+			break
+		case "right":
+			left = -rightWidth
+			break
+		default:
+			left = 0
+	}
+
+	// && !state.throttle
+
+	if (state.isopen !== type) {
+		state.throttle = true
+		ownerInstance.callMethod('change', {
+			open: type
+		})
+
+	}
+
+	state.isopen = type
+	// 添加动画类
+	ins.requestAnimationFrame(function() {
+		ins.addClass('ani');
+		move(left, ins, ownerInstance)
+	})
+	// 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的
+}
+
+
+function getDirection(x, y) {
+	if (x > y && x > MIN_DISTANCE) {
+		return 'horizontal';
+	}
+	if (y > x && y > MIN_DISTANCE) {
+		return 'vertical';
+	}
+	return '';
+}
+
+/**
+ * 重置滑动状态
+ * @param {Object} event
+ */
+function resetTouchStatus(instance) {
+	var state = instance.getState();
+	state.direction = '';
+	state.deltaX = 0;
+	state.deltaY = 0;
+	state.offsetX = 0;
+	state.offsetY = 0;
+}
+
+/**
+ * 设置滑动开始位置
+ * @param {Object} event
+ */
+function stopTouchStart(event) {
+	var instance = event.instance;
+	var state = instance.getState();
+	resetTouchStatus(instance);
+	var touch = event.touches[0];
+	if (IS_HTML5 && isPC()) {
+		touch = event;
+	}
+	state.startX = touch.clientX;
+	state.startY = touch.clientY;
+}
+
+/**
+ * 滑动中,是否禁止打开
+ * @param {Object} event
+ */
+function stopTouchMove(event) {
+	var instance = event.instance;
+	var state = instance.getState();
+	var touch = event.touches[0];
+	if (IS_HTML5 && isPC()) {
+		touch = event;
+	}
+	state.deltaX = touch.clientX - state.startX;
+	state.deltaY = touch.clientY - state.startY;
+	state.offsetY = Math.abs(state.deltaY);
+	state.offsetX = Math.abs(state.deltaX);
+	state.direction = state.direction || getDirection(state.offsetX, state.offsetY);
+}
+
+function isPC() {
+	var userAgentInfo = navigator.userAgent;
+	var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+	var flag = true;
+	for (var v = 0; v < Agents.length - 1; v++) {
+		if (userAgentInfo.indexOf(Agents[v]) > 0) {
+			flag = false;
+			break;
+		}
+	}
+	return flag;
+}
+
+var movable = false
+
+function mousedown(e, ins) {
+	if (!IS_HTML5) return
+	if (!isPC()) return
+	touchstart(e, ins)
+	movable = true
+}
+
+function mousemove(e, ins) {
+	if (!IS_HTML5) return
+	if (!isPC()) return
+	if (!movable) return
+	touchmove(e, ins)
+}
+
+function mouseup(e, ins) {
+	if (!IS_HTML5) return
+	if (!isPC()) return
+	touchend(e, ins)
+	movable = false
+}
+
+function mouseleave(e, ins) {
+	if (!IS_HTML5) return
+	if (!isPC()) return
+	movable = false
+}
+
+module.exports = {
+	showWatch: showWatch,
+	touchstart: touchstart,
+	touchmove: touchmove,
+	touchend: touchend,
+	mousedown: mousedown,
+	mousemove: mousemove,
+	mouseup: mouseup,
+	mouseleave: mouseleave
+}

+ 60 - 0
uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue

@@ -0,0 +1,60 @@
+<template>
+	<view>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	/**
+	 * SwipeAction 滑动操作
+	 * @description 通过滑动触发选项的容器
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=181
+	 */
+	export default {
+		name:"uniSwipeAction",
+		data() {
+			return {};
+		},
+		created() {
+			this.children = [];
+		},
+		methods: {
+			// 公开给用户使用,重制组件样式
+			resize(){
+				// wxs 会自己计算组件大小,所以无需执行下面代码
+				// #ifndef APP-VUE || H5 || MP-WEIXIN
+				this.children.forEach(vm=>{
+					vm.init()
+				})
+				// #endif
+			},
+			// 公开给用户使用,关闭全部 已经打开的组件
+			closeAll(){
+				this.children.forEach(vm=>{
+					// #ifdef APP-VUE || H5 || MP-WEIXIN
+					vm.is_show = 'none'
+					// #endif
+
+					// #ifndef APP-VUE || H5 || MP-WEIXIN
+					vm.close()
+					// #endif
+				})
+			},
+			closeOther(vm) {
+				if (this.openItem && this.openItem !== vm) {
+					// #ifdef APP-VUE || H5 || MP-WEIXIN
+					this.openItem.is_show = 'none'
+					// #endif
+
+					// #ifndef APP-VUE || H5 || MP-WEIXIN
+					this.openItem.close()
+					// #endif
+				}
+				// 记录上一个打开的 swipe-action-item ,用于 auto-close
+				this.openItem = vm
+			}
+		}
+	};
+</script>
+
+<style></style>

+ 87 - 0
uni_modules/uni-swipe-action/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uni-swipe-action",
+  "displayName": "uni-swipe-action 滑动操作",
+  "version": "1.3.3",
+  "description": "SwipeAction 滑动操作操作组件",
+  "keywords": [
+    "",
+    "uni-ui",
+    "uniui",
+    "滑动删除",
+    "侧滑删除"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "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"
+        },
+        "快应用": {
+          "华为": "y",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
uni_modules/uni-swipe-action/readme.md

@@ -0,0 +1,11 @@
+
+
+## SwipeAction 滑动操作
+> **组件名:uni-swipe-action**
+> 代码块: `uSwipeAction`、`uSwipeActionItem`
+
+
+通过滑动触发选项的容器
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swipe-action)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 4 - 2
utils/requestUrl.js

@@ -8,10 +8,12 @@
  */
 // const base = '192.168.51.80:8801/imed/pfm/';
 
+export const networkType = 1; //网络类型:内网=0,外网=1
+
 // export const URL = '192.168.50.190:8801/imed/pfm/'; // 本地
 export const URL = '112.124.59.133:8802/imed/pfm/'; //线上测试
-// export const URL = '118.31.245.65:8802/imed/pfm/';
-// export const URL = '192.168.200.56:8111/imed/pfm/'; //横店
+// export const URL = '118.31.245.65:8802/imed/pfm/'; //线上
+// export const URL = '112.12.21.134:8111/imed/pfm/'; //横店
 
 // export const URL = '192.168.1.253:8111/imed/pfm/';
 // export const URL = '192.168.1.45:8088/imed/pfm/'; //内网

部分文件因文件數量過多而無法顯示