chenjun 5 сар өмнө
commit
e36aa48a4d
100 өөрчлөгдсөн 14277 нэмэгдсэн , 0 устгасан
  1. 23 0
      .gitignore
  2. 20 0
      .hbuilderx/launch.json
  3. 50 0
      App.vue
  4. 174 0
      components/YSteps/YSteps.vue
  5. 288 0
      components/flightInfo/flightInfo.vue
  6. 188 0
      components/header/nav.vue
  7. 129 0
      components/header/navs.vue
  8. 42 0
      components/mask-model/README.md
  9. 229 0
      components/mask-model/mask-model.vue
  10. 184 0
      components/mk-upload/mk-upload.md
  11. 378 0
      components/mk-upload/mk-upload.vue
  12. 117 0
      components/scan-code/scan-code.js
  13. 391 0
      components/sunui-upimg/sunui-upimg.vue
  14. 119 0
      components/table/tabler.vue
  15. 127 0
      components/utils/scanCode - 副本.js
  16. 208 0
      components/utils/scanCode.js
  17. 53 0
      components/utils/validate.js
  18. 1361 0
      components/yq-avatar/yq-avatar.vue
  19. 6 0
      config.js
  20. 20 0
      index.html
  21. 47 0
      main.js
  22. 147 0
      manifest.json
  23. BIN
      nativeplugins/Lizii-uhfmagic-sdk/android/uhfmagicrf-android-release.aar
  24. 28 0
      nativeplugins/Lizii-uhfmagic-sdk/package.json
  25. 22 0
      package.json
  26. 174 0
      pages.json
  27. 380 0
      pages/abnormal/index.vue
  28. 128 0
      pages/baggageEntry/index.vue
  29. 536 0
      pages/baggagecheck/index.vue
  30. 315 0
      pages/delisting/index.vue
  31. 419 0
      pages/delisting/info.vue
  32. 771 0
      pages/detail/index.vue
  33. 227 0
      pages/detailNode/index.vue
  34. 409 0
      pages/express/index.vue
  35. 383 0
      pages/express/info.vue
  36. 579 0
      pages/extract/index.vue
  37. 444 0
      pages/flightdetails/index.vue
  38. 210 0
      pages/help/index.vue
  39. 379 0
      pages/index/index.vue
  40. 180 0
      pages/individual/index.vue
  41. 229 0
      pages/loadingdetails/index.vue
  42. 98 0
      pages/locationEntry/index.vue
  43. 215 0
      pages/login/index.vue
  44. 152 0
      pages/message/message.vue
  45. 536 0
      pages/mypage/index.vue
  46. 339 0
      pages/myrecords/index.vue
  47. 357 0
      pages/search/index.vue
  48. 1052 0
      pages/sorting/index.vue
  49. BIN
      static/Icon@1x.png
  50. BIN
      static/bagzu.png
  51. BIN
      static/bei.png
  52. BIN
      static/beijing.png
  53. BIN
      static/bg.png
  54. BIN
      static/czhb.mp3
  55. BIN
      static/czsb.mp3
  56. BIN
      static/gongzuo.png
  57. BIN
      static/gou.png
  58. BIN
      static/hang.png
  59. BIN
      static/hqhb.mp3
  60. BIN
      static/hqxl.mp3
  61. BIN
      static/ic_code_dark.png
  62. BIN
      static/ic_home_tabbar_check.png
  63. BIN
      static/ic_home_tabbar_default.png
  64. BIN
      static/ic_message_tabbar_check.png
  65. BIN
      static/ic_message_tabbar_default.png
  66. BIN
      static/ic_user_tabbar_check.png
  67. BIN
      static/ic_user_tabbar_default.png
  68. BIN
      static/ico.png
  69. BIN
      static/ico@1x.png
  70. 539 0
      static/iconfont/demo.css
  71. 395 0
      static/iconfont/demo_index.html
  72. 51 0
      static/iconfont/iconfont.css
  73. 0 0
      static/iconfont/iconfont.js
  74. 72 0
      static/iconfont/iconfont.json
  75. BIN
      static/iconfont/iconfont.ttf
  76. BIN
      static/iconfont/iconfont.woff
  77. BIN
      static/iconfont/iconfont.woff2
  78. BIN
      static/icos.png
  79. BIN
      static/jilu.png
  80. BIN
      static/kaiguan.png
  81. BIN
      static/kscz.mp3
  82. BIN
      static/lg 64 brs.png
  83. BIN
      static/login.png
  84. BIN
      static/logo.png
  85. BIN
      static/mima.png
  86. BIN
      static/qzcz.mp3
  87. BIN
      static/radio.png
  88. BIN
      static/saoma.png
  89. BIN
      static/search.png
  90. BIN
      static/sflx.mp3
  91. BIN
      static/shi.png
  92. BIN
      static/shuai.png
  93. BIN
      static/vector@1x.png
  94. BIN
      static/voice.mp3
  95. BIN
      static/xia.png
  96. BIN
      static/yjzc.mp3
  97. 76 0
      uni.scss
  98. 6 0
      uni_modules/liu-goods-swiper/changelog.md
  99. 190 0
      uni_modules/liu-goods-swiper/components/liu-goods-swiper/liu-goods-swiper.vue
  100. 85 0
      uni_modules/liu-goods-swiper/package.json

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
+package-lock.json
+yarn.lock

+ 20 - 0
.hbuilderx/launch.json

@@ -0,0 +1,20 @@
+{
+    // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+    // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version" : "0.0",
+    "configurations" : [
+        {
+            "app-plus" : {
+                "launchtype" : "local"
+            },
+            "default" : {
+                "launchtype" : "local"
+            },
+            "type" : "uniCloud"
+        },
+        {
+            "playground" : "custom",
+            "type" : "uni-app:app-android"
+        }
+    ]
+}

+ 50 - 0
App.vue

@@ -0,0 +1,50 @@
+<script>
+	export default {
+		data() {
+			return {
+				main: null,
+				poll: null,
+				filter:null,
+				pusher:null,
+				scanObj:null
+			}
+		},
+		onLaunch: function() {
+			console.log("onLaunch")
+			const users = this.$storage.getJson("users")
+			if(!users){
+				uni.reLaunch({
+					url: "/pages/login/index",
+					success:() => {
+						plus.navigator.closeSplashscreen()
+					}
+				});
+			}
+			else{
+				this.$msg.getMsg(this.$storage.get('airportName'))
+				plus.navigator.closeSplashscreen()
+			}
+		},
+		onShow: function() {
+			this.$devapi.TYPE_DEV_JQHWGEVIQUWVILBE = this.$storage.get("device")?Number(this.$storage.get("device")):0
+			this.$devapi.RFIDIntervalTime = this.$storage.get("times")?Number(this.$storage.get("times")):0
+			if(this.$storage.getJson("users")){
+				this.$msg.getMsg(this.$storage.get('airportName'))
+			}
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+			this.$msg.stopMsg()
+			if(this.$devapi.RFIDIntervalTime!=0){
+				this.$devapi.RFIDStopInventory()
+				this.$devapi.ISRFIDOPEN = false
+			}
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+	@import url("static/iconfont/iconfont.css");
+</style>

+ 174 - 0
components/YSteps/YSteps.vue

@@ -0,0 +1,174 @@
+<template>
+	<!-- 
+		stepList: [
+			{
+				date: '08-28', // 左侧日期 -- 必选
+				time: '11:22', // 左侧时间 -- 必选
+				info: '开卡', // 右侧内容 -- 可选
+				index: '1', // 中间 Index -- 可选
+				isFinished: true, // 是否已完成(完成 index 为 √)-- 可选
+				isActive: false, // 是否为当前节点 Active(当前节点 即使完成 index 也不会显示 √)-- 可选
+				isShowSlot: false // 右侧是否有 Slot(显示在 右侧内容下方)-- 可选
+			},
+			{
+				date: '08-30',
+				time: '15:33',
+				info: '激活',
+				index: '2',
+				isFinished: false,
+				isActive: true,
+				isShowSlot: true
+			}
+		]
+
+		slot 示例:
+		<y-steps :stepList="stepList">
+			<mx-button type="danger" value="激活网点查看" />
+		</y-steps>
+
+		可按自己需求修改 css 中颜色变量
+	 -->
+	<view class="steps">
+		<view
+			v-for="(step, index) in stepList"
+			:key="'stepsItem' + index"
+      		:class="['steps-item', step.isActive ? 'steps-item-active' : '', step.isFinished ? 'steps-item-finished' : '']">
+			<view class="steps-item-left">
+				<text class="steps-item-left-date">{{ step.date }}<br><text class="steps-item-left-time">{{ step.time }}</text></text>
+			</view>
+			<view class="steps-item-index">
+				<view :class="['line', index != 0 ? '' : 'line-transparent']"></view>
+				<view v-if="!step.isActive && step.isFinished" class="index index-success"><icon type="success_no_circle" size="16" /></view>
+				<view v-else class="index">{{ step.index ? step.index : index + 1 }}</view>
+				<view :class="['line', index != stepList.length - 1 ? '' : 'line-transparent']"></view>
+			</view>
+			<view class="steps-item-right">
+				<view class="right-info-item">
+					<view>{{ step.info }}</view>
+					<view v-if="step.isShowSlot">
+						<slot></slot>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'YSteps',
+		props: {
+			stepList: {
+				type: Array,
+				default: () => []
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$normolColor: #009688;
+	$activeColor: #ff3838;
+	$finishedColor: #4DB6AC;
+	$normolBgColor: #80CBC4;
+	$activeBgColor: #F8BBD0;
+	$finishedBgColor: #B2DFDB;
+	.steps {
+		display: flex;
+		flex-direction: column;
+		.steps-item {
+			display: flex;
+			.steps-item-left {
+				display: flex;
+				align-items: center;
+				color: $normolColor;
+				.steps-item-left-date {
+					font-size: 30rpx;
+					padding-top: 32rpx;
+					line-height: 40rpx;
+				}
+				.steps-item-left-time {
+					font-size: 26rpx;
+				}
+			}
+			.steps-item-index {
+				padding: 0 20rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				.line {
+					flex: 1;
+					width: 5rpx;
+					background-color: $normolBgColor;
+				}
+				.line-transparent {
+					background-color: transparent;
+				}
+				.index {
+					width: 50rpx;
+					height: 50rpx;
+					font-size: 25rpx;
+					font-weight: 900;
+					text-align: center;
+					line-height: 50rpx;
+					border-radius: 50rpx;
+					color: $normolColor;
+					background-color: $normolBgColor;
+				}
+				/deep/ .index-success {
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					.uni-icon-success_no_circle {
+						color: $normolColor;
+					}
+				}
+			}
+			.steps-item-right {
+				display: flex;
+				flex-direction: column;
+				padding: 20rpx 0;
+				color: $normolColor;
+				.right-info-item {
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					padding: 30rpx;
+					text {
+						font-size: 30rpx;
+						font-weight: 600;
+						line-height: 30rpx;
+					}
+				}
+			}
+		}
+		.steps-item-finished {
+			.steps-item-left {
+				color: $finishedColor;
+			}
+			.steps-item-index {
+				.index {
+					color: $finishedColor;
+					background-color: $finishedBgColor;
+				}
+			}
+			.steps-item-right {
+				color: $finishedColor;
+			}
+		}
+		.steps-item-active {
+			.steps-item-left {
+				color: $activeColor;
+			}
+			.steps-item-index {
+				.index {
+					color: $activeColor;
+					background-color: $activeBgColor;
+				}
+			}
+			.steps-item-right {
+				color: $activeColor;
+			}
+		}
+	}
+</style>

+ 288 - 0
components/flightInfo/flightInfo.vue

@@ -0,0 +1,288 @@
+<template>
+	<view class="flightBox">
+		<view class="flight" v-if="flightDetail">
+			<view class="top">
+				<view class="flightNo">
+					{{flightDetail.carrierFlights}}
+				</view>
+				<view class="flightNo">
+					{{flightDetail.carrierFlightsDate}}
+				</view>
+			</view>
+			<view class="flightInfo" @tap="toFlight()">
+				<view class="fight_card start">
+					<p>{{flightDetail.outAirport}}</p>
+					<span>{{flightDetail.scheduleTakeOffTime?flightDetail.scheduleTakeOffTime:"-"}}</span>
+				</view>
+				<view class="fight_center">
+					<view class="type">
+						{{flightDetail.normalState}}
+					</view>
+					<view class="aircraft"></view>
+				</view>
+				<view class="fight_card end">
+					<p>{{flightDetail.landAirport}}</p>
+					<span>{{flightDetail.scheduleLandInTime?flightDetail.scheduleLandInTime:"-"}}</span>
+				</view>
+			</view>
+			<view class="foot" v-if="isSite!=''">
+				<view :class="isSite=='LOAD'?'setSite':'containerNo'">
+					<view class="">
+						位置:{{site}}
+					</view>
+					<view class="" @click="showBox('site')">
+						<uni-icons type="compose" color="#fff" size="24"></uni-icons>
+					</view>
+				</view>
+				<view class="passenger_cabin" v-if="isSite=='LOAD'">
+					<view class="">
+						仓位:{{passenger_cabin}}
+					</view>
+					<view class="" @click="showBox('passenger_cabin')">
+						<uni-icons type="compose" color="#fff" size="24"></uni-icons>
+					</view>
+				</view>
+				<view class="containerNo" v-if="isSite=='LOAD'">
+					<view class="">
+						容器:{{containerNo}}
+					</view>
+					<view class="" @click="showBox('containerNo')">
+						<uni-icons type="compose" color="#fff" size="24"></uni-icons>
+					</view>
+				</view>
+				<view class="luggageNo">
+					<view class="">
+						录入行李:{{luggageNo}}
+					</view>
+					<view class="" @click="showBox('luggageNo')">
+						<uni-icons type="compose" color="#fff" size="24"></uni-icons>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="flight" v-else>
+			<view class="noMore">
+				暂无航班信息
+			</view>
+		</view>
+		<view class=""> 
+			<uni-popup ref="inputDialog" type="dialog">
+				<uni-popup-dialog ref="inputClose" mode="input" title="请扫描或输入" value="" placeholder="请输入内容"
+					@confirm="dialogInputConfirm"></uni-popup-dialog>
+			</uni-popup>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "flifgtInfo",
+		data() {
+			return {
+				type:""
+			};
+		},
+		props: {
+			flightDetail: {
+				type: Object,
+				default: null
+			},
+			isSite: {
+				type: String,
+				default: ''
+			},
+			site: {
+				type: String,
+				default: "-"
+			},
+			containerNo: {
+				type: String,
+				default: ""
+			},
+			passenger_cabin: {
+				type: String,
+				default: ""
+			},
+			luggageNo: {
+				type: String,
+				default: ""
+			},
+		},
+		methods: {
+			toFlight: function() {
+				this.$emit("toFlight", true)
+			},
+			showBox: function(val) {
+				this.type = val;
+				this.$refs.inputDialog.open()
+			},
+			dialogInputConfirm:function(val){
+				this.$emit('setVal',val,this.type)
+				this.$refs.inputDialog.close()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.flightBox {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 1rem 15px 1rem 15px;
+		box-sizing: border-box;
+
+		>.flight {
+			width: 100%;
+			min-height: 96px;
+			background: rgba(0, 0, 0, 0.25);
+			border-radius: 5px;
+			padding: 5px 10px;
+
+			.top {
+				height: 26px;
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				border-bottom: 1px solid #333;
+
+				.flightNo {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					line-height: 24px;
+					font-weight: 700;
+				}
+
+				.fightDate {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					line-height: 24px;
+					font-weight: 700;
+				}
+			}
+
+			.flightInfo {
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: space-around;
+				height: 70px;
+
+				>.fight_card {
+					width: 33.3%;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: center;
+
+					>p {
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						line-height: 24px;
+						font-weight: 700;
+					}
+
+					>span {
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 13px;
+						font-weight: 500;
+					}
+				}
+
+				.end {
+					display: flex;
+					flex-direction: column;
+					align-items: flex-end;
+					justify-content: center;
+				}
+
+				.fight_center {
+					width: 33.3%;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					line-height: 24px;
+					font-weight: 700;
+
+					>.aircraft {
+						width: 1.75rem;
+						height: 1.75rem;
+						background: url('../../static/hang.png') no-repeat;
+						background-size: 100% 100%;
+					}
+				}
+
+			}
+
+			.foot {
+				border-top: 1px solid #333;
+				width: 100%;
+				padding: 5px;
+				color: #fff;
+				display: flex;
+				flex-direction: row;
+				flex-wrap: wrap;
+				justify-content: space-between;
+				box-sizing: border-box;
+
+				.setSite {
+					width: 50%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					padding: 5px 0;
+					box-sizing: border-box;
+				}
+
+				.containerNo {
+					width: 100%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					padding: 5px 0;
+					box-sizing: border-box;
+				}
+
+				.passenger_cabin {
+					width: 45%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					padding: 5px 0;
+					box-sizing: border-box;
+				}
+
+				.luggageNo {
+					width: 100%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					padding: 5px 0;
+					box-sizing: border-box;
+				}
+			}
+
+			.noMore {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+				line-height: 24px;
+				font-weight: 700;
+				min-height: 96px;
+			}
+		}
+	}
+</style>

+ 188 - 0
components/header/nav.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="nav-content">
+		<view class="nav">
+			<view class="log" v-if="navtype" @tap="clickOrder">
+
+			</view>
+			<view class="nav-sech">
+				<picker v-if="airportList && airportList.length>0" class="secah" @change="change" :value="valueIndex" :range="airportList">
+					<view>{{airportList[valueIndex]}}</view>
+				</picker>
+				<input class="uni-input input-nav" @tap="test" disabled="true" v-model="flightNo" :placeholder="placeholder" />
+				<uni-icons type="clear" size="26" @tap="clear" color="#fff" v-if="flightNo!=''"></uni-icons>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				searchText: '', //搜索内容
+				placeholder: '请输入航班号或行李号',
+				array: [],
+				airportList:[],
+				valueIndex:this.index
+			}
+		},
+		props: {
+			navname: {
+				type: String,
+				default: ''
+			},
+			navtype: {
+				type: Boolean,
+				default: true
+			},
+			navtypes: {
+				type: Boolean,
+				default: false
+			},
+			index:{
+				type: Number,
+				default: 0
+			},
+			flightNo:{
+				type: String,
+				default: ''
+			},
+		},
+		created(option) {
+			this.airportList =this.$storage.getJson('airportList');
+			if(!this.airportList){
+				this.getAirportList()
+			}
+		},
+		onUnload() {},
+		onShow() {
+		},
+		mounted() {},
+		methods: {
+			clear(){
+				this.$emit("clear")
+			},
+			async getAirportList(){
+				let data={
+						"serviceId": 14,
+						"dataContent": [],
+						"event": "0"
+					}
+				await this.$http.httpPost('/openApi/query',data).then(res => {
+					this.airportList = []
+					if(res.code == "0"){
+						res.returnData.map(item =>{
+							this.airportList.push(item['IATACode'])
+							
+							this.airportList.sort()
+						})
+						this.$storage.setJson('airportList',this.airportList);
+						let num = this.valueIndex;
+						this.$storage.set('airportName',this.airportList[num])
+					}
+				})
+			},
+			change(e){
+				this.valueIndex = e.detail.value
+				this.$emit('airport',this.airportList[this.valueIndex])
+				this.$storage.set('airportName',this.airportList[this.valueIndex])
+				this.$storage.set('airport',this.valueIndex);
+				this.$msg.getMsg(this.$storage.get('airportName'))
+			},
+			test() {
+				uni.navigateTo({
+					url: "/pages/search/index"
+				})
+			},
+			compareDesc(propertyName) {
+			  return function(object1, object2) {
+			    var value1 = object1[propertyName];
+			    var value2 = object2[propertyName];
+			    if(value2 < value1) {
+			      return -1;
+			    } else if(value2 > value1) {
+			      return 1;
+			    } else {
+			      return 0;
+			    }
+			  }
+			},
+			//搜索框输入事件
+			inputSearch() {
+				this.$emit('input', this.searchText)
+			},
+			clickOrder() {
+				this.$emit('fall')
+			}
+		},
+	}
+</script>
+<style lang="scss" scoped>
+	.nav-content {
+		>.nav {
+			width: 100%;
+			height: 2.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			padding-top: 2.25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			// background: rgba(234, 241, 245,0.2);
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+			>.nav-sech {
+				width: 20.5rem;
+				height: 1.875rem;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				background: rgba(234, 241, 245, 0.2);
+				border-radius: 4px;
+				text-align: center;
+				.secah {
+					width: 3.75rem;
+					height: 80%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 14px;
+					font-weight: 400;
+					border-right: .0625rem solid rgb(255, 255, 255);
+				}
+
+				.my-input-placeholder {
+					color: rgb(170, 195, 207);
+				}
+
+				.input-nav {
+					padding-left: .625rem;
+					color: rgb(170, 195, 207);
+					margin-right: 50px;
+				}
+
+			}
+
+			>.up {
+				position: absolute;
+				right: 1.5rem;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: .875rem;
+				font-weight: 500;
+			}
+		}
+	}
+</style>

+ 129 - 0
components/header/navs.vue

@@ -0,0 +1,129 @@
+<template>
+	<view class="nav-content">
+		<view class="nav"><view class="log" v-if="navtype" @tap="clickOrder"></view><view class="name">{{ navname }}</view>
+		<!-- <view class="nav-sech"><view class="secah">CAN</view><view class="input-nav" @tap="test">{{ placeholder }}</view> -->
+		</view></view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				searchText: '', //搜索内容
+				placeholder: '请输入航班号或行李号'
+			}
+		},
+    props:{
+			navname:{
+				type:String,
+				default:''
+			},
+			navtype:{
+				type:Boolean,
+				default:true
+			},
+			navtypes:{
+				type:Boolean,
+				default:false
+			}
+		},
+		created(option) {
+		},
+		onLoad(){
+		},
+		onUnload() {
+		},
+		onShow() {
+		},
+		mounted() {
+		},
+		methods: {
+			test(){
+        uni.redirectTo({
+					url: "/pages/search/index"
+				})
+		  },
+
+			//搜索框输入事件
+			inputSearch() {
+				this.$emit('input', this.searchText)
+			},
+      clickOrder () {
+        this.$emit('fall')
+			}
+		},
+	}
+</script>
+<style lang="scss" scoped>
+.nav-content{
+	>.nav{
+		width: 100%;
+		height: 2.375rem;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		padding-top: 1.25rem;
+		color: rgb(255, 255, 255);
+		font-family: Noto Sans SC;
+		font-size: 1rem;
+		position: relative;
+    >.name{
+      width: 4.5rem;
+			padding: 0 .5rem 0 .5rem;
+      color: rgb(255, 255, 255);
+      font-family: Noto Sans SC;
+      font-size: 16px;
+      font-weight: 500;
+      display: flex;
+      justify-content: center;
+    }
+		// background: rgba(234, 241, 245,0.2);
+		>.log{
+			width: .375rem;
+			height: .75rem;
+			font-size: .75rem;
+			position: absolute;
+			left: 1.2rem;
+			background: url('../../static/ico.png') no-repeat;
+			background-size: 100% 100%;
+		}
+		>.nav-sech{
+			width: 15.5625rem;
+      height: 1.875rem;
+			display: flex;
+			align-items: center;
+			background: rgba(234, 241, 245,0.2);
+			border-radius:4px;
+			.secah{
+				width: 3.75rem;
+				height: 80%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 14px;
+				font-weight: 400;
+				border-right: .0625rem solid rgb(255, 255, 255);
+			}
+			.my-input-placeholder{
+				color: rgb(170, 195, 207);
+			}
+			.input-nav{
+				padding-left: .625rem;
+				color: rgb(170, 195, 207);
+			}
+
+		}
+		>.up{
+			position: absolute;
+			right: 1.5rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: .875rem;
+			font-weight: 500;
+		}
+	}
+}
+
+</style>

+ 42 - 0
components/mask-model/README.md

@@ -0,0 +1,42 @@
+### 组件开篇
+<h4>可自定义按钮颜色,提示内容及字体颜色,支持微信小程序、app、H5,其他未测试,理论支持,</h4>
+### 使用方法
+```html
+<template>
+	<div>
+		<view class="openModel" @click="showModel">打开弹窗</view>
+		<mask-model ref="showMask" btnType="1" @confirm="confirm" @cancel="cancel" titleColoe="#666666" cancelColor="#666666" confirmColor="#007AFF" :maskTitle="maskTitle"></mask-model>
+	</div>
+</template>
+```
+```javascript
+  <script>
+  	import maskModel from '../../components/mask-model/mask-model.vue'
+  	export default {
+  		components:{
+  			maskModel:maskModel,
+  		},
+  		data() {
+  			return {
+  				maskTitle:'提示语'
+  			}
+  		},
+  		onLoad() {
+  			
+  		},
+  		methods: {
+			confirm:function(e){//确定按钮
+				console.log('您点击了确定按钮');
+			},
+			cancel:function(){//取消按钮
+				console.log('您点击了取消按钮');
+			},
+  			showModel:function(e){//打开询问弹窗
+  				this.$refs.showMask.show();
+  			}
+  		}
+  	}
+  </script>
+```
+
+

+ 229 - 0
components/mask-model/mask-model.vue

@@ -0,0 +1,229 @@
+<template>
+	<view class="mask-model" v-show="showMask">
+		<view class="mask" @click="hide"></view>
+		<view class="model-count">
+			<view class="amen-tit">{{ headername }}</view>
+			<view class="count" :style="{'color':titleColoe}">{{maskTitle}}</view>
+			<button form-type="submit" class="switchBtn" v-if="typeShow" @tap="next()">切换<span>{{tabname}}</span></button>
+			<button form-type="submit" class="switchBtn" v-if="typeShow" @tap="load()">强制装载</button>
+			<button form-type="submit" class="eleBtn" @click="hide" v-if="typeShow">取消</button>
+			<view class="bot"  v-if="!typeShow">
+				<button form-type="submit" class="eleBtns" @click="hide">取消</button>
+				<button form-type="submit" class="switchBtndel" @tap="confirm">确定</button>
+				</view>
+			<!-- <view class="btm-box">
+				<view v-show="btnType==1" class="btn cancel" @click="hide" :style="{'color':cancelColor}">取消</view>
+				<view class="btn confirm" @click="confirm" :style="{'color':confirmColor}">确定</view>
+			</view> -->
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		props: {
+			maskTitle: {//提示内容
+				type: String,
+				default:'提示消息'
+			},
+			titleColoe:{//提示信息字体颜色
+				type: String,
+				default:'#666666'
+			},
+			confirmColor:{//确定按钮字体颜色
+				type: String,
+				default:'#007AFF'
+			},
+			cancelColor:{//取消按钮字体颜色
+				type: String,
+				default:'#666666'
+			},
+			btnType:{//1显示取消按钮
+				type: String,
+				default:'1'
+			},
+			tabname:{//名称
+				type: String,
+				default:'1'
+			},
+			typeShow: {
+				type: Boolean,
+			},
+			headername: {//标题
+				type: String,
+			}
+		},
+		data() {
+			return {
+				showMask:false,
+			};
+		},
+		mounted() {
+		},
+		created() {
+
+		},
+		computed: {
+			
+		},
+		methods: {
+			show:function(){
+				this.showMask = true;
+			},
+			hide:function(){
+				this.$emit('cancel');
+				this.showMask = false;
+			},
+			confirm:function(e){
+				this.showMask = false;
+				this.$emit('confirm');
+			},
+			next(){
+				this.showMask = false;
+				this.$emit('next',this.tabname);
+			},
+			load(){
+				this.showMask = false;
+				this.$emit('load');
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.mask-model{
+		position: fixed;
+		width: 100%;
+		height: 100%;
+		left: 0;
+		top: 0;
+		z-index: 999;
+	}
+	.bot{
+		width: 100%;
+		/* padding: 0 .55rem 0 .55rem; */
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		margin-top: 1.25rem;
+	}
+	.mask-model .mask{
+		width: 100%;
+		height: 100%;
+		background: rgba(0,0,0,0.65);
+	}
+	.switchBtn{
+		width: 12rem;
+    height: 2.125rem;
+		background: linear-gradient(179.11deg, rgba(51,161,165,1.00) 1.866%,rgba(59,111,142,1.00) 137.144%,rgba(59,111,142,1.00) 137.144%,rgba(59,111,142,1.00) 137.144%);
+		border-radius:
+		4px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		color: rgb(255, 255, 255);
+		font-family: Noto Sans SC;
+		font-size: 15px;
+		font-weight: 700;
+		margin-bottom: 1rem;
+	}
+	.switchBtndel{
+		width: 5rem;
+    height: 2rem;
+		background: linear-gradient(179.11deg, rgba(51,161,165,1.00) 1.866%,rgba(59,111,142,1.00) 137.144%,rgba(59,111,142,1.00) 137.144%,rgba(59,111,142,1.00) 137.144%);
+		border-radius:
+		4px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		color: rgb(255, 255, 255);
+		font-family: Noto Sans SC;
+		font-size: 15px;
+		font-weight: 700;
+	}
+	.eleBtns{
+		width: 5rem;
+    height: 2rem;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: rgb(243, 253, 255);
+		border: 1px solid rgb(172, 218, 230);
+		border-radius:
+		4px;
+		color: rgb(59, 150, 159);
+		font-family: Noto Sans SC;
+		font-size: 15px;
+		font-weight: 500;
+	}
+	.eleBtn{
+		width: 12rem;
+    height: 2.125rem;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: rgb(243, 253, 255);
+		border: 1px solid rgb(172, 218, 230);
+		border-radius:
+		4px;
+		color: rgb(59, 150, 159);
+		font-family: Noto Sans SC;
+		font-size: 15px;
+		font-weight: 500;
+	}
+	.model-count{
+		width: 14.5rem;
+		border-radius: 20rpx;
+		background: #FFFFFF;
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%,-50%);
+		z-index: 9;
+		min-height: 9.375rem;
+		padding: 1.5rem 0 1.5rem 0;
+		overflow: hidden;
+	}
+	.amen-tit{
+		text-align: center;
+		color: rgb(48, 51, 57);
+		font-family: Noto Sans SC;
+		font-size: 1rem;
+		font-weight: 700;
+		line-height: 80rpx;
+	}
+	.count{
+		/* text-align: center; */
+		/* padding:30rpx; */
+		padding: .625rem .875rem 1.875rem .875rem;
+		color: rgb(106, 113, 125);
+		font-family: Noto Sans SC;
+		font-size: 14px;
+		font-weight: 500;
+		max-height: 300rpx;
+		overflow-y: scroll;
+	}
+	.btm-box{
+		position: absolute;
+		width: 100%;
+		left: 0;
+		bottom: 0;
+		z-index: 9;
+		display: flex;
+		border-top: 1px solid #F5F5F5;
+	}
+	.btm-box .btn{
+		flex: 1;
+		box-sizing: border-box;
+		height: 96rpx;
+		line-height: 96rpx;
+		text-align: center;
+		font-size: 30rpx;
+	}
+	.btm-box .btn.confirm{
+		color: #007AFF;
+	}
+	.btm-box .btn.cancel{
+		color: #666666;
+		border-right: 1px solid #F5F5F5;
+	}
+</style>

+ 184 - 0
components/mk-upload/mk-upload.md

@@ -0,0 +1,184 @@
+
+## 特别提醒
+- 默认样式可能无法满足你,如果修改样式,变量样式必须放在最外层`app.vue`里面,当然你可以直接修改插件
+- 组件使用less编译,HBuilderX需要安装less插件 【工具-插件安装-搜索less】
+- 所有数据交互,组件不做任何处理,请自行使用`onChoose`,`onDelete`事件处理完毕后返回给组件`imglist`, 注意使用了两级反转,`index`也是正序的,和`原imglist`数组对应,不要参考看见的视图index
+- 上传成功后,`imglist`更新条数,只需要使用数组方法`push`即可,两级反转只是视图更新,和数据不关联
+- 页面使用`flex`布局,理论上只要支持`flex`布局,就不会存在问题
+- 如果使用中,有任何问题,欢迎留言
+
+### 在页面script中引入组件,并注册组件
+```
+import mkUpload from "@/components/mk-upload/mk-upload.vue"
+export default {
+   components: {
+	  mkUpload
+   },
+}
+```
+
+### 页面中使用
+```
+<mk-upload :imgList="imgList" />
+```
+
+### 下面是一个完整示例
+```
+<template>
+	<view class="test">
+		<view class="demo-title">修改皮肤样式</view>
+		<mk-upload :imgList="imgList" />
+		
+		<view class="demo-title">删除位置左上</view>
+		<mk-upload :imgList="imgList" deletePosition="topLeft" />
+		
+		<view class="demo-title">删除位置左下</view>
+		<mk-upload :imgList="imgList" deletePosition="bottomLeft" />
+		
+		<view class="demo-title">删除位置右下</view>
+		<mk-upload :imgList="imgList" deletePosition="bottomRight" /> 
+		
+		<view class="demo-title">显示4个</view>
+		<mk-upload :imgList="imgList" column="4" />
+		
+		<view class="demo-title">显示5个</view>
+		<mk-upload :imgList="imgList" column="5" />
+		
+		
+		<view class="demo-title">两级反转</view>
+		<mk-upload
+			reverse
+			:imgList="imgList"
+		/>
+		
+		<view class="demo-title">事件接管,看console控制台</view>
+		<mk-upload 
+			:imgList="imgList"
+			@onDeleteTake="onDeleteTake" 
+			@onPreviewTake="onPreviewTake"
+		/>
+		
+		<view class="demo-title">只展示</view>
+		<mk-upload
+			:deleteShow="false"
+			:controlShow="false"
+			:imgList="imgList"
+		/>
+		
+		
+		
+		
+	</view>
+</template>
+
+<script>
+	import mkUpload from "@/components/mk-upload/mk-upload.vue"
+	export default {
+		components: {
+			mkUpload
+		},
+		data() {
+			return {
+				imgList: [
+					'../../static/1.jpeg',
+					'../../static/2.jpeg',
+					'../../static/2.jpeg',
+					'../../static/2.jpeg'
+				]
+			}
+		},
+		onLoad(){
+			
+		},
+		methods: {
+			onDelete(index){
+				console.log(index)
+			},
+			onChoose(e){
+				console.log(e)
+			},
+			onPreviewTake(index){
+				console.log(index)
+			},
+			onDeleteTake(index){
+				console.log(index)
+			}
+		}
+	}
+</script> 
+
+<style lang="less" scoped>
+page{
+	// --mk-upload-img-height: 200upx;
+	// --mk-upload-item-margin: 30upx;
+	// --mk-upload_remove_color: #D1372C;
+	// --mk-upload_remove_size: 50upx;
+	// --mk-upload-add-size: 60upx;
+	// --mk-upload-add-bgcolor: #f1f1f1;
+}
+.demo-title{
+	padding: 15upx 0 0 30upx;
+}
+</style>
+
+```
+
+
+
+### 属性介绍
+| 名称                         | 类型             | 默认值                      | 描述       |
+| ----------------------------| --------------- | ---------------------------- | ------------
+| imgList                     | Array           | []                         | 图片数组列表 |
+| column                      | Number, String  | 3                          | 一行显示几个,可选址`2,3,4,5` |
+| reverse                     | Boolean         | false                      | 两级反转,对列表进行反转,添加符号在上面 |
+| controlShow                 | Boolean         | true                       | 是否显示上传按钮 |
+| deleteShow                  | Boolean         | true                       | 是否显示删除按钮 |
+| deletePosition              | String          | topRight                   | 删除按钮位置, 可选值`topLeft`,`topRight`,`bottomLeft`,`bottomRight`|
+| sourceType                  | Array           | ['camera', 'album']        | `album` 从相册选图,`camera` 使用相机, H5不支持 |
+| sizeType                    | Array           | ['original', 'compressed'] | `original` 原图,`compressed` 压缩图 |
+| maxChooseCount              | Number          | 9                          | 最大一次可以选择数量,最高为9 |
+| maxCount                    | Number          | 100                        | 列表最大数量,超出将不在展示新增按钮 |
+
+
+
+
+### 事件介绍
+| 名称                 | 说明            |
+| ------------------  |------------------
+| onDelete            | 删除图片的下标index|
+| onChoose            | 选择图片后返回的值:选择文件的所有信息 |
+| onPreviewTake       | 接管自定义图片预览,如果想点击图片做其他事情,可以添加此事件,接管后,默认预览事件会失效,返回当前图片下标index|
+| onDeleteTake        | 接管自定义删除图片,如果想点击删除做其他事情,可以添加此事件, 接管后,默认删除事件失效,返回当前图片下标index|
+
+> 注意使用了两级翻转,index也是正序的,和原imglist数组对应,不要参考看见的视图index
+
+
+
+
+### 修改尺寸和自定义样式
+如果默认尺寸默认无法达到你的需求,那么自定义样式你可以自由配置。根据需求添加即可
+注意样式变量需要放在 `app.vue`里面全部公用。为全局变量样式,不会影响其他样式
+
+```
+page{
+	--mk-upload-img-height: 200upx;
+	--mk-upload-img-width: 100%;
+	--mk-upload-item-margin: 30upx;
+	--mk-upload_remove_color: #D1372C;
+	--mk-upload_remove_size: 50upx;
+	--mk-upload-add-size: 60upx;
+	--mk-upload-add-bgcolor: #f1f1f1;
+}
+```
+
+| 名称                 | 说明            |
+| ------------------  |------------------
+| --mk-upload-img-height            | 图片的宽度 |
+| --mk-upload-item-margin       | 图片列与列之间的间距|
+| --mk-upload_remove_color        | 删除按钮的颜色|
+| --mk-upload_remove_size        | 删除按钮的大小|
+| --mk-upload-add-size        | 上传图标的大小|
+| --mk-upload-add-bgcolor        | 上传图片的背景色|
+
+
+

+ 378 - 0
components/mk-upload/mk-upload.vue

@@ -0,0 +1,378 @@
+<template>
+	<view 
+		class="mk-upload" 
+		:class="{'reverse': reverse}"
+	>
+		<!--进行flex占位-->
+		<block v-if="imgList.length >= column && reverse">
+			<block v-if="imgItemAppendLength === 0">
+				<view
+					class="mk-upload_item"
+					:class="uploadItemColumn"
+					v-for="(item, index) in (imgItemAppendLength + (column -1))"
+				/>
+			</block>
+			<block v-if="imgItemAppendLength === 1">
+				<block v-if="column == 3">
+					<view
+						class="mk-upload_item"
+						:class="uploadItemColumn"
+						v-for="(item, index) in imgItemAppendLength"
+					/>
+				</block>
+				<block v-if="column == 4">
+					<view
+						class="mk-upload_item"
+						:class="uploadItemColumn"
+						v-for="(item, index) in (imgItemAppendLength + 1)"
+					/>
+				</block>
+				<block v-if="column == 5">
+					<view
+						class="mk-upload_item"
+						:class="uploadItemColumn"
+						v-for="(item, index) in (imgItemAppendLength + 2)"
+					/>
+				</block>
+			</block>
+			<block v-if="imgItemAppendLength === 2">
+				<block v-if="column == 4">
+					<view
+						class="mk-upload_item"
+						:class="uploadItemColumn"
+						v-for="(item, index) in (imgItemAppendLength - 1)"
+					/>
+				</block>
+				<block v-if="column == 5">
+					<view
+						class="mk-upload_item"
+						:class="uploadItemColumn"
+						v-for="(item, index) in imgItemAppendLength"
+					/>
+				</block>
+			</block>
+			<block v-if="imgItemAppendLength === 3">
+				<block v-if="column == 5">
+					<view class="mk-upload_item" :class="uploadItemColumn"/>
+				</block>
+			</block>
+		</block>
+		<!--进行flex占位-->
+		
+		<view 
+			class="mk-upload_item"
+			:class="uploadItemColumn"
+			v-for="(item, index) in imgList"
+			:key="index"
+		>
+			<view 
+				class="mk-upload_remove" 
+				:class="deletePosition"
+				@tap="onDeleteThis(index)"
+				v-if="deleteShow"
+			>
+				<text>✕</text>
+			</view>
+			<image
+				:src="item"
+				class="mk-upload_item_img" 
+				@tap="onPreviewImage(index)" 
+				mode="aspectFill"
+			/>
+		</view>
+		<!-- 列表end -->
+		
+		
+		<view
+			class="mk-upload_item"
+			:class="uploadItemColumn"
+			v-if="controlShow && imgList.length < maxCount"
+		>
+			<view 
+				class="mk-upload_add"
+				@tap="onChooseImage"
+			>+</view>
+		</view>
+		<!-- 上传按钮 -->
+		
+			
+	</view>
+</template>
+
+<script>
+	export default {
+		//组件传参
+		props: {
+			//图片数组
+			imgList: {
+				type: Array,
+				default: function() {
+				  return []
+				}
+			},
+			//行数量
+			column: {
+				type: [Number, String],
+				default: 3
+			},
+			reverse: {
+				type: Boolean,
+				default: false
+			},
+			//是否显示上传按钮
+			controlShow: {
+				type: Boolean,
+				default: true
+			},
+			//是否显示删除按钮
+			deleteShow: {
+				type: Boolean,
+				default: true
+			},
+			//删除按钮位置
+			deletePosition: {
+				type: String,
+				default: 'topRight'
+			},
+			//album 从相册选图,camera 使用相机
+			sourceType: {
+				type: Array,
+				default: function() {
+					return ['camera', 'album']
+				}
+			},
+			//original 原图,compressed 压缩图
+			sizeType: {
+				type: Array,
+				default: function() {
+					return ['original', 'compressed']
+				}
+			},
+			//最多可以选择的图片张
+			maxChooseCount: {
+				type: Number,
+				default: 9
+			},
+			//最大条数
+			maxCount: {
+				type: Number,
+				default: 100
+			}
+		},
+		data() {
+			return {
+			}
+		},
+		//计算属性
+		computed: {
+			uploadItemColumn(){
+				return `mk-upload_item_column${this.column}`
+			},
+			imgItemAppendLength(){
+				return this.imgList.length % this.column;
+			}
+		},
+		//检测属性
+		watch: {
+		},
+		//组件加载后
+		created() {
+		},
+		methods: {
+			//删除指定图片
+			onDeleteThis(index){
+				if(this.$listeners.onDeleteTake){
+					this.$emit('onDeleteTake', index);
+					return;
+				}
+				uni.showModal({
+					title: '提示',
+					content: '您确定删除吗?',
+					success: (res)=> {
+						if(res.confirm) {
+							this.$emit('onDelete', index);
+						}
+					}
+				});
+			},
+			//预览图片
+			onPreviewImage(index) {
+				if(this.$listeners.onPreviewTake){
+					this.$emit('onPreviewTake', index);
+					return;
+				}
+				const imgList = this.imgList;
+				const isReverse = this.reverse;
+				const currentIndex = isReverse ? (imgList.length - index) - 1 : index
+				const imgLists = isReverse ? imgList.reverse() : imgList;
+				uni.previewImage({
+					current: currentIndex,
+					urls: imgLists
+				});
+			},
+			//选择图片
+			onChooseImage(){
+				uni.chooseImage({
+					sizeType: this.sizeType,
+					sourceType: this.sourceType,
+					count: this.maxChooseCount,
+					success: (res) => {
+						this.$emit('onChoose', res);
+					}
+				});
+			}
+		}
+	}
+</script> 
+
+<style lang="less" scoped>
+	.mk-upload{
+		
+		display: flex;
+		flex-wrap: wrap;
+		box-sizing: border-box;
+		padding-left: var(--mk-upload_item_margin, 15px);
+		padding-bottom: var(--mk-upload_item_margin, 15px);
+		flex-direction: row;
+		&.reverse{
+			flex-direction: row-reverse;
+			flex-wrap: wrap-reverse;
+			justify-content: flex-end;
+		}
+		
+		.mk-upload_item{
+			position: relative;
+			margin-top: var(--mk-upload_item_margin, 15px);
+			margin-right: var(--mk-upload_item_margin, 15px);
+			flex: 0 calc(33.3% - var(--mk-upload_item_margin, 15px));
+			.mk-upload_remove{
+				background-color: var(--mk-upload_remove_color, #D1372C);
+				color: #fff;
+				width: var(--mk-upload_remove_size, 24px);
+				height: var(--mk-upload_remove_size, 24px);
+				display: flex;
+				justify-content: center;
+				align-items: flex-start;
+				opacity: 0.8;
+				position: absolute;
+				z-index: 2;
+				cursor: pointer;
+				box-sizing: border-box;
+				text{
+					transform: scale(0.8);
+					position: absolute;
+					top: -2upx;
+					line-height: var(--mk-upload_remove_size, 24px);
+				}
+				&:active{
+					opacity: 0.6;
+				}
+				&.topLeft{
+					top: 0;
+					left: 0;
+					border-radius: 0 0 100% 0;
+					text{
+						left: 8upx;
+					}
+				}
+				&.topRight{
+					top: 0;
+					right: 0;
+					border-radius: 0 0 0 100%;
+					text{
+						left: 18upx;
+					}
+				}
+				&.bottomLeft{
+					bottom: 0;
+					left: 0;
+					border-radius: 0 100% 0 0;
+					text{
+						left: 8upx;
+						top: 6upx;
+					}
+				}
+				&.bottomRight{
+					bottom: 0;
+					right: 0;
+					border-radius: 100% 0 0 0;
+					text{
+						top: 6upx;
+						left: 16upx;
+					}
+				}
+			}
+			.mk-upload_add{
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				background-color: var(--mk-upload_add_bgcolor, #f1f1f1);
+				font-size: var(--mk-upload_add_size, 30px);
+				height: var(--mk-upload_img_height, 100px);
+				width: 100%;
+			}
+			.mk-upload_item_img{
+				display: block;
+				width: 100%;
+				height: var(--mk-upload_img_height, 100px);
+			}
+			&.mk-upload_item_column2{
+				flex: 0 calc(50% - var(--mk-upload_item_margin, 15px));
+			}
+			&.mk-upload_item_column3{
+				flex: 0 calc(33.3% - var(--mk-upload_item_margin, 15px));
+			}
+			&.mk-upload_item_column4{
+				flex: 0 calc(25% - var(--mk-upload_item_margin, 15px));
+				.mk-upload_item_img,
+				.mk-upload_add{
+					height: var(--mk-upload_img_height, 70px);
+					font-size: var(--mk-upload_add_size, 25px);
+				}
+			}
+			&.mk-upload_item_column5{
+				flex: 0 calc(20% - var(--mk-upload_item_margin, 15px));
+				.mk-upload_item_img,
+				.mk-upload_add{
+					height: var(--mk-upload_img_height, 55px);
+					font-size: var(--mk-upload_add_size, 25px);
+				}
+			}
+			&.mk-upload_item_column4,
+			&.mk-upload_item_column5{
+				.mk-upload_remove{
+					width: var(--mk-upload_remove_size, 20px);
+					height: var(--mk-upload_remove_size, 20px);
+					text{
+						transform: scale(0.6);
+					}
+					&.topLeft{
+						text{
+							left: 6upx;
+							top: -6upx;
+						}
+					}
+					&.topRight{
+						text{
+							left: 10upx;
+							top: -6upx;
+						}
+					}
+					&.bottomLeft{
+						text{
+							left: 4upx;
+							top: 0;
+						}
+					}
+					&.bottomRight{
+						text{
+							left: 10upx;
+							top: 0;
+						}
+					}
+				}
+			}
+			
+		}
+	}
+</style>

+ 117 - 0
components/scan-code/scan-code.js

@@ -0,0 +1,117 @@
+class DEVAPI {
+    // html5+ 对象
+    HTML5_PLUS_REFLECT_BROADCASTRECEIVER = "io.dcloud.feature.internal.reflect.BroadcastReceiver" // html5+ 创建数据监听api
+    HTML5_PLUS_CONTENT_INTENT = "android.content.Intent" // html5+ 初始化上下文
+    HTML5_PLUS_CONTENT_INTENTFILTER = "android.content.IntentFilter" // html5+ 暴露接口
+    HTML5_PLUS_RUNTIME_MAIN_ACTIVITY = null // 设备活动
+    HTML5_PLUS_KEY_DOWN = "com.aoro.poc.key.down" // 按钮被按下
+    // 广播对象
+    POC_KEY_DOWN_OBJ = null
+
+    // 扫描对象
+    SCANOBJ = {
+		ACTION_SCAN_RESULT : "com.action.SCAN_RESULT",
+        SCAN_SERVICE: "com.action.INIT_SCAN", // 扫描权限
+        SCAN_RESULT: "com.action.SCAN_RESULT", // 扫描结果
+        SCAN_BEGIN: "com.action.START_SCAN", // 开始扫描
+        SCAN_END: "com.action.STOP_SCAN", // 关闭扫描
+    }
+
+    // RFID 对象
+    RFID_SDK_WX = null
+    // 0红外扫描  1 RFID
+    TYPE_DEV_JQHWGEVIQUWVILBE = 0
+    // RFID 时间
+    RFIDIntervalTime = null
+    // RFID type 
+    ISRFIDOPEN = false
+
+    constructor() {}
+
+    // 监听按钮被按下--
+    initDevAPI() {
+		//this.initRFID() // RFID 初始化
+		        // 意图
+		        let HTML5_PLUS_CONTENT_INTENT_CLASS = plus.android.importClass(this.HTML5_PLUS_CONTENT_INTENT);
+		        this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY = plus.android.runtimeMainActivity(); // HTML5_PLUS 获取 activity
+		
+		        // 权限
+		        let intentServer = new HTML5_PLUS_CONTENT_INTENT_CLASS(this.SCANOBJ.SCAN_SERVICE);
+		        this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.sendBroadcast(intentServer);
+		
+		        // HTML5_PLUS 创建数据监听函数
+		        this.POC_KEY_DOWN_OBJ = plus.android.implements(
+		            this.HTML5_PLUS_REFLECT_BROADCASTRECEIVER, {
+		                onReceive: (context, intent) => {
+		                  
+		                    // 红外扫描结果
+		                    if (intent.getAction() === this.SCANOBJ.SCAN_RESULT) {
+		                        let _data_ = intent.getByteArrayExtra("scanContext")
+								let codeStr = this.byteToString(_data_)
+		                        console.log(`回调数据:${codeStr}`)
+		                        uni.$emit('scancodemsg', {
+		                            msg: _data_
+		                        })
+		                    }
+		
+		                    // 按钮按下
+		                    if (intent.getAction() === this.HTML5_PLUS_KEY_DOWN && this
+		                        .TYPE_DEV_JQHWGEVIQUWVILBE ===
+		                        0) {
+		                        // 调用扫描头
+		                        console.log("按键被按下,开始扫描")
+		                        let intents = new HTML5_PLUS_CONTENT_INTENT_CLASS(this.SCANOBJ
+		                            .SCAN_BEGIN); // 红外扫描开启
+		                        this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.sendBroadcast(intents);
+		                    } else if (intent.getAction() === this.HTML5_PLUS_KEY_DOWN &&
+		                        this.TYPE_DEV_JQHWGEVIQUWVILBE === 1) {
+		                        console.log("按键被按下,开启RFID")
+		                        this.ISRFIDOPEN = !this.ISRFIDOPEN
+		                        if (this.ISRFIDOPEN === true) {
+		                            console.log("开启RFID")
+		                            this.RFIDStartInventory()
+		                        } else {
+		                            console.log("关闭RFID")
+		                            this.RFIDStopInventory()
+		                        }
+		                    }
+		                }
+		            }
+		        );
+		        let IntentFilter = plus.android.importClass(this.HTML5_PLUS_CONTENT_INTENTFILTER); // 暴露接口对象
+		        let filter = new IntentFilter();
+				filter.addAction(this.SCANOBJ.ACTION_SCAN_RESULT); // 红外 扫描结果,广播
+		        filter.addAction(this.HTML5_PLUS_KEY_DOWN); // 按钮对按钮,广播
+		        filter.addAction(this.SCANOBJ.SCAN_RESULT); // 红外 扫描结果,广播
+		        this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.registerReceiver(this.POC_KEY_DOWN_OBJ, filter); // 注册功能开始
+	}
+	
+	byteToString(arr) {
+				if(typeof arr === 'string') {
+					return arr;
+				}
+				var str = '',
+					_arr = arr;
+				for(var i = 0; i < _arr.length; i++) {
+					var one = _arr[i].toString(2),
+						v = one.match(/^1+?(?=0)/);
+					if(v && one.length == 8) {
+						var bytesLength = v[0].length;
+						var store = _arr[i].toString(2).slice(7 - bytesLength);
+						for(var st = 1; st < bytesLength; st++) {
+							store += _arr[st + i].toString(2).slice(2);
+						}
+						str += String.fromCharCode(parseInt(store, 2));
+						i += bytesLength - 1;
+					} else {
+						str += String.fromCharCode(_arr[i]);
+					}
+				}
+				return str;
+			}
+
+}
+
+export {
+    DEVAPI
+}

+ 391 - 0
components/sunui-upimg/sunui-upimg.vue

@@ -0,0 +1,391 @@
+<template>
+	<view class="s-add-list">
+		<view class="s-add-list-items" :style="{
+				height: size[0],
+				width: size[1]
+			}" v-for="(item, index) in imageList" :key="index">
+			<image :src="item[filedImage]" :url="item.url" @tap="showImgs" class="s-add-list-img" :mode="imgMode">
+			</image>
+			<view class="s-add-list-remove s-icons icon-close" @tap.stop="removeImg" :id="'s-items-img-' + index">
+				<icon type="clear" :color="closeColor"></icon>
+			</view>
+			<view class="upload-progress" :style="{ width: size[1] }">
+				<progress :percent="item.progress" :stroke-width="progressSize" :activeColor="progressColor"
+					:backgroundColor="progressBgColor" />
+			</view>
+			<view class="s-add-list-reup" @tap.stop="retry" :data-index="index" v-if="item.error">
+				<text class="s-add-list-reup-icon s-icons icon-retry"></text>
+				<text class="s-add-list-reup-text">失败重试</text>
+			</view>
+		</view>
+		<view class="s-add-list-items s-add-list-btn" :style="{
+				height: size[0],
+				width: size[1],
+				backgroundColor: backgroundColor
+			}" :class="disabled ? 's-disabled' : ''" @tap="addImg" v-if="imageList.length < number">
+			<slot name="icon"></slot>
+			<view class="s-add-list-btn-text">{{ title }}</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		props: {
+			// 图片字段
+			filedImage: {
+				type: String,
+				default: 'url'
+			},
+			// 背景颜色
+			backgroundColor: {
+				type: String,
+				default: '#f7f7f7'
+			},
+			// 是否禁用
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 上传数量
+			number: {
+				type: Number,
+				default: 9
+			},
+			// 按钮名称
+			title: {
+				type: String,
+				default: '添加照片'
+			},
+			// 上传文字颜色
+			titleColor: {
+				type: String,
+				default: "#999"
+			},
+			// 图片大小
+			size: {
+				type: Array,
+				default: () => ['222rpx', '222rpx']
+			},
+			// 上传前钩子
+			beforeUpload: {
+				type: Function
+			},
+			// 关闭按钮颜色
+			closeColor: {
+				type: String,
+				default: "#999"
+			},
+			// 服务器地址
+			url: {
+				type: String,
+				default: ''
+			},
+			// 进度条进度
+			progressSize: {
+				type: Number,
+				default: 1
+			},
+			// 进度条颜色
+			progressColor: {
+				type: String,
+				default: "#09A0F7"
+			},
+			// 进度条背景颜色
+			progressBgColor: {
+				type: String,
+				default: "#999"
+			},
+			// 上传文件名称
+			fileName: {
+				type: String,
+				default: 'img'
+			},
+			// 携带的form数据
+			formData: {
+				type: Object,
+				default: () => {
+					return {};
+				}
+			},
+			// 图片模式
+			imgMode: {
+				type: String,
+				default: 'widthFix'
+			},
+			// 携带的请求头
+			header: {
+				type: Object,
+				default: () => {
+					return {};
+				}
+			},
+			// 返回状态码,默认0
+			statusCode: {
+				type: Number,
+				default: 0
+			},
+			// 返回状态判断字段
+			statusField: {
+				type: String,
+				default: 'errno'
+			},
+		},
+		data() {
+			return {
+				imageList: [],
+				upDate: false
+			};
+		},
+		watch: {
+			imageList(newVal, oldVal) {
+				if (!this.upDate) {
+					this.$emit('change', newVal);
+				}
+			}
+		},
+		methods: {
+			clearAllImgs() {
+				this.imageList = [];
+			},
+			addImg() {
+				if (this.disabled) return;
+				let num = this.number - this.imageList.length;
+				if (num < 1) {
+					return false;
+				}
+				uni.chooseImage({
+					count: num,
+					sizeType: ['compressed'],
+					success: async res => {
+						let file = res.tempFiles;
+						for (let i = 0; i < res.tempFilePaths.length; i++) {
+							if (this.beforeUpload) {
+								const valid = await this.beforeUpload(file[i], i);
+								if (valid === false) {
+									return false;
+								}
+							}
+							this.imageList.push({
+								url: res.tempFilePaths[i],
+								progress: 0,
+								error: false
+							});
+						}
+					}
+				});
+			},
+			removeImg(e) {
+				let index = e.currentTarget.id.replace('s-items-img-', '');
+				let removeImg = this.imageList.splice(index, 1);
+				this.$emit('remove', removeImg[0]);
+			},
+			showImgs(e) {
+				let currentImg = e.currentTarget.dataset.url;
+				let imgs = [];
+				for (let i = 0; i < this.imageList.length; i++) {
+					imgs.push(this.imageList[i][this.filedImage]);
+				}
+				uni.previewImage({
+					urls: imgs,
+					current: currentImg
+				});
+			},
+			upload(index) {
+				if (this.upDate) {
+					return;
+				}
+				this.upDate = true;
+				if (!index) {
+					index = 0;
+				}
+				uni.showLoading({
+					title: '图片上传中'
+				});
+				this.uploadBase(index);
+			},
+			retry(e) {
+				let index = e.currentTarget.dataset.index;
+				this.upload(index);
+			},
+			uploadBase(index) {
+				// 全部上传完成
+				if (index > this.imageList.length - 1) {
+					uni.hideLoading();
+					this.upDate = false;
+					this.$emit('upload', this.imageList);
+					return;
+				}
+				// 验证后端
+				if (this.url == '') {
+					uni.showToast({
+						title: '请设置上传服务器地址',
+						icon: 'none'
+					});
+					return;
+				}
+				// 检查是否是默认值
+				if (this.imageList[index].progress >= 1) {
+					this.uploadBase(index + 1);
+					return;
+				}
+				this.imageList[index].error = false;
+				// 创建上传对象
+				const upTask = uni.uploadFile({
+					url: this.url,
+					filePath: this.imageList[index].url,
+					name: 'file' || this.fileName,
+					formData: this.formData,
+					header: this.header,
+					// #ifdef MP-ALIPAY
+					fileType: 'image',
+					// #endif
+					success: uploadRes => {
+						uploadRes = JSON.parse(uploadRes.data);
+						if (uploadRes[this.statusField] != this.statusCode) {
+							uni.showToast({
+								title: '上传失败 : ' + uploadRes.data,
+								icon: 'none'
+							});
+							this.error(index);
+						} else {
+							//上传图片成功
+							this.imageList[index].progress = 100;
+							this.imageList[index].url = uploadRes.data;
+							this.imageList[index].result = uploadRes;
+							this.uploadBase(index + 1);
+						}
+					},
+					fail: e => {
+						uni.showToast({
+							title: '上传失败,请点击图片重试',
+							icon: 'none'
+						});
+						this.error(index);
+					}
+				});
+				upTask.onProgressUpdate(res => {
+					if (res.progress > 0) {
+						this.imageList[index].progress = res.progress;
+						this.imageList.splice(index, 1, this.imageList[index]);
+					}
+				});
+			},
+			// 上传错误
+			error(index) {
+				this.upDate = false;
+				setTimeout(() => {
+					this.imageList[index].progress = 0;
+					this.imageList[index].error = true;
+					this.$emit('uploaderror');
+				}, 500);
+			},
+			// 设置默认值
+			setItems(items) {
+				if (items.length) {
+					this.imageList = [];
+					for (let i = 0; i < items.length; i++) {
+						this.imageList.push({
+							url: items[i],
+							progress: 100
+						});
+					}
+				}
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.s-disabled {
+		cursor: not-allowed;
+	}
+
+	.s-add-list {
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.s-add-list-btn {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.s-add-list-btn-text {
+		font-size: 1.875rem;
+		line-height: 36rpx;
+		text-align: center;
+		color: #999;
+		width: 100%;
+	}
+
+	.s-add-list-items {
+		width: 222rpx;
+		height: 222rpx;
+		overflow: hidden;
+		margin-bottom: 10rpx;
+		margin-right: 11rpx;
+		/* background: #f6f7f8; */
+		font-size: 0;
+		position: relative;
+		border-radius: 10rpx;
+	}
+
+	.s-add-list-image {
+		width: 222rpx;
+	}
+
+	.s-add-list-remove {
+		position: absolute;
+		z-index: 15;
+		right: 10rpx;
+		top: 0;
+		color: #888888;
+	}
+
+	.upload-progress {
+		position: absolute;
+		z-index: 99;
+		left: 0;
+		bottom: 10rpx;
+		// width: 180rpx;
+		padding: 0 21rpx;
+	}
+
+	.s-add-list-reup {
+		position: absolute;
+		z-index: 3;
+		left: 0;
+		top: 0rpx;
+		width: 100%;
+		height: 222rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background-color: rgba(0, 0, 0, 0.3);
+		flex-direction: column;
+	}
+
+	.s-add-list-reup-icon {
+		text-align: center;
+		width: 100%;
+		color: #ffffff;
+		display: block;
+		font-size: 80rpx;
+		line-height: 100rpx;
+	}
+
+	.s-add-list-reup-text {
+		text-align: center;
+		width: 100%;
+		color: #ffffff;
+		display: block;
+		font-size: 20rpx;
+		line-height: 30rpx;
+	}
+
+	.s-add-list-img {
+		width: 100%;
+		height: 100%;
+	}
+</style>

+ 119 - 0
components/table/tabler.vue

@@ -0,0 +1,119 @@
+<template>
+  <!-- 底部导航 -->
+  <view class="tabbar" :style="{'padding-bottom': paddingBottomHeight + 'rpx'}">
+     <view class="tabbar-item" v-for="(item, index) in list" :key="index" @click="tabbarChange(item.path)">
+        <image class="item-img" :src="item.iconPath" v-if="current == index"></image>
+        <image class="item-img1" :src="item.icon" v-else></image>
+     </view>
+  </view>
+</template>
+
+<script>
+  export default {
+     props: {
+        current: String
+     },
+     data() {
+        return {
+           paddingBottomHeight: 0, //苹果X以上手机底部适配高度
+           list: [{
+                 text: '', //首页
+                 icon: '/static/tabbar/index.png', //未选中图标
+                 iconPath: '/static/tabbar/indexSelected.png', //选中图片
+                 path: "/pages/index/indexx", //页面路径
+              },
+              {
+                 text: '', //喜欢
+                 icon: '/static/tabbar/like.png',
+                 iconPath: '/static/tabbar/likeSelected.png',
+                 path: "/pages/like/like/like",
+              },
+              {
+                 text: '', //通知
+                 icon: '/static/tabbar/notice.png',
+                 iconPath: '/static/tabbar/noticeSelected.png',
+                 path: '/pages/notice/notice/notice',
+              },
+              {
+                 text: '', //我的
+                 icon: '/static/tabbar/my.png',
+                 iconPath: '/static/tabbar/mySelected.png',
+                 path: "/pages/my/my/my",
+              }
+           ]
+        };
+     },
+     created() {
+        let that = this;
+        uni.getSystemInfo({
+           success: function(res) {
+              let model = ['X', 'XR', 'XS', '11', '12', '13', '14', '15'];
+              model.forEach(item => {
+                 //适配iphoneX以上的底部,给tabbar一定高度的padding-bottom
+                 if (res.model.indexOf(item) != -1 && res.model.indexOf('iPhone') != -1) {
+                    that.paddingBottomHeight = 40;
+                 }
+              })
+           }
+        });
+     },
+     watch: {
+
+     },
+     methods: {
+        tabbarChange(path) {
+           uni.switchTab({
+              url: path
+           })
+        }
+     }
+  };
+</script>
+
+<style scoped>
+  .tabbarActive {
+     color: #79D5AD !important;
+  }
+
+  .tabbar {
+     position: fixed;
+     bottom: 48rpx;
+     left: 45rpx;
+     right: 30rpx;
+     display: flex;
+     justify-content: space-around;
+     align-items: center;
+     width: 600rpx;
+     height: 126rpx;
+     border-radius: 100rpx;
+     background-color: #F5F6F7;
+     padding: 0 30rpx;
+     z-index: 99;
+  }
+
+  .tabbar-item {
+     display: flex;
+     flex-direction: column;
+     align-items: center;
+     justify-content: center;
+     height: 100rpx;
+  }
+  
+  /* 选中后 */
+  .item-img {
+     width: 104rpx;
+     height: 104rpx;
+     border-radius: 50%;
+     box-shadow: 0rpx 0rpx 10rpx 10rpx #EEEFF0;
+  }
+  
+  /* 选中前 */
+  .item-img1 {
+     width: 50rpx;
+     height: 50rpx;
+  }
+
+</style>
+————————————————
+版权声明:本文为CSDN博主「lmy云棉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
+原文链接:https://blog.csdn.net/weixin_43340308/article/details/127055272

+ 127 - 0
components/utils/scanCode - 副本.js

@@ -0,0 +1,127 @@
+//初始化?
+let obj1 = null
+let obj2 = null
+let uhfApi = uni.requireNativePlugin("Lizii-uhfmagic-sdk");
+let rfidStart = true
+export function allScan(HTML5_PLUS_RUNTIME_MAIN_ACTIVITY, POC_KEY_DOWN_OBJ, filter, typeset) {
+	let HTML5_PLUS_REFLECT_BROADCASTRECEIVER =
+		"io.dcloud.feature.internal.reflect.BroadcastReceiver" // html5+ 创建数据监听api
+	let HTML5_PLUS_CONTENT_INTENT = "android.content.Intent" // html5+ 初始化上下文
+	let HTML5_PLUS_CONTENT_INTENTFILTER = "android.content.IntentFilter" // html5+ 暴露接口
+	let HTML5_PLUS_KEY_DOWN = "com.aoro.poc.key.down" // 按钮被按下
+	// 广播对象
+	// 扫描对象
+	let SCANOBJ = {
+		ACTION_SCAN_RESULT: "com.action.SCAN_RESULT",
+		SCAN_SERVICE: "com.action.INIT_SCAN", // 扫描权限
+		SCAN_RESULT: "com.action.SCAN_RESULT", // 扫描结果
+		SCAN_BEGIN: "com.action.START_SCAN", // 开始扫描
+		SCAN_END: "com.action.STOP_SCAN", // 关闭扫描
+	}
+	//初始化
+	let HTML5_PLUS_CONTENT_INTENT_CLASS = plus.android.importClass(HTML5_PLUS_CONTENT_INTENT);
+	HTML5_PLUS_RUNTIME_MAIN_ACTIVITY = plus.android.runtimeMainActivity(); // HTML5_PLUS 获取 activity
+
+	// 权限
+	let intentServer = new HTML5_PLUS_CONTENT_INTENT_CLASS(SCANOBJ.SCAN_SERVICE);
+	HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.sendBroadcast(intentServer);
+
+	// HTML5_PLUS 创建数据监听函数
+	POC_KEY_DOWN_OBJ = plus.android.implements(
+		HTML5_PLUS_REFLECT_BROADCASTRECEIVER, {
+			onReceive: (context, intent) => {
+				plus.android.importClass(intent);
+				// 红外扫描结果
+				if (intent.getAction() === SCANOBJ.SCAN_RESULT) {
+					let _data_ = intent.getByteArrayExtra("scanContext")
+					let codeStr = byteToString(_data_)
+					console.log(`回调数据:${codeStr}`)
+					uni.$emit('scancodemsg', {
+						msg: codeStr
+					})
+				}
+			}
+		}
+	);
+	let IntentFilter = plus.android.importClass(HTML5_PLUS_CONTENT_INTENTFILTER); // 暴露接口对象
+	filter = new IntentFilter();
+	filter.addAction(SCANOBJ.ACTION_SCAN_RESULT); // 红外 扫描结果,广播
+	filter.addAction(HTML5_PLUS_KEY_DOWN); // 按钮对按钮,广播
+	filter.addAction(SCANOBJ.SCAN_RESULT); // 红外 扫描结果,广播
+	obj1 = HTML5_PLUS_RUNTIME_MAIN_ACTIVITY
+	obj2 = POC_KEY_DOWN_OBJ
+	let arr = [HTML5_PLUS_RUNTIME_MAIN_ACTIVITY, POC_KEY_DOWN_OBJ, filter]
+	return arr
+}
+
+//开始
+export function startScan(HTML5_PLUS_RUNTIME_MAIN_ACTIVITY, POC_KEY_DOWN_OBJ, filter) {
+	obj1.registerReceiver(obj2, filter);
+	console.log("开始监听扫描设备-" + obj2 + "进程")
+}
+//结束
+export function stopScan(HTML5_PLUS_RUNTIME_MAIN_ACTIVITY, POC_KEY_DOWN_OBJ) {
+	obj1.unregisterReceiver(obj2);
+	console.log("结束监听扫描设备-" + obj2 + "进程")
+}
+
+//初始化RFID
+export function initRFID() {
+	//setCallback 可以多次调用 扫码结果回调
+	uhfApi.setCallback(function(res) {
+		console.log(res);
+		var event = res.event;
+		if (event == "onEpc") {
+			// res.data  epc 数组  没有信号强度
+			let arr = []
+			res.data.map(item => {
+				arr.push(byteToString(item))
+				console.log(arr)
+			})
+		}
+
+	});
+	uhfApi.init({
+		serialPortPath: "/dev/ttyWK2", //串口地址 ,不传默认为‘/dev/ttysWK2’
+		power: 26 //功率,不传默认26 取值14-26
+	});
+}
+
+//RFID开始存盘
+export function inventoryRealTime() {
+	//true 开始 false 停止
+	uhfApi.inventoryRealTime(rfidStart);
+	rfidStart = false
+},
+
+//RFID停止存盘
+export function inventoryRealTime() {
+	//true 开始 false 停止
+	uhfApi.inventoryRealTime(rfidStart);
+	rfidStart = false
+},
+
+
+export function byteToString(arr) {
+	if (typeof arr === 'string') {
+		return arr;
+	}
+	var str = '',
+		_arr = arr;
+	for (var i = 0; i < _arr.length; i++) {
+		var one = _arr[i].toString(2),
+			v = one.match(/^1+?(?=0)/);
+		if (v && one.length == 8) {
+			var bytesLength = v[0].length;
+			var store = _arr[i].toString(2).slice(7 - bytesLength);
+			for (var st = 1; st < bytesLength; st++) {
+				store += _arr[st + i].toString(2).slice(2);
+			}
+			str += String.fromCharCode(parseInt(store, 2));
+			i += bytesLength - 1;
+		} else {
+			str += String.fromCharCode(_arr[i]);
+		}
+	}
+	return str;
+}

+ 208 - 0
components/utils/scanCode.js

@@ -0,0 +1,208 @@
+class DEVAPI {
+	// html5+ 对象
+	HTML5_PLUS_REFLECT_BROADCASTRECEIVER = "io.dcloud.feature.internal.reflect.BroadcastReceiver" // html5+ 创建数据监听api
+	HTML5_PLUS_CONTENT_INTENT = "android.content.Intent" // html5+ 初始化上下文
+	HTML5_PLUS_CONTENT_INTENTFILTER = "android.content.IntentFilter" // html5+ 暴露接口
+	HTML5_PLUS_KEY_DOWN = "com.aoro.poc.key.down" // 按钮被按下
+	HTML5_PLUS_RUNTIME_MAIN_ACTIVITY = null // 设备活动
+
+	// 广播对象
+	POC_KEY_DOWN_OBJ = null
+
+	// 扫描对象
+	SCANOBJ = {
+		SCAN_SERVICE: "com.action.INIT_SCAN", // 扫描权限
+		SCAN_RESULT: "com.action.SCAN_RESULT", // 扫描结果
+		SCAN_BEGIN: "com.action.START_SCAN", // 开始扫描
+		SCAN_POCKEY_ENABLE: "com.action.SCAN_POCKEY_ENABLE", // 按键功能
+		SCAN_END: "com.action.STOP_SCAN", // 关闭扫描
+	}
+
+	// RFID 对象
+	RFID_SDK_WX = null
+	// 0红外扫描  1 RFID
+	TYPE_DEV_JQHWGEVIQUWVILBE = 1
+
+	// RFID 时间
+	RFIDIntervalTime = null
+
+	// RFID type 
+	ISRFIDOPEN = false
+
+	constructor() {}
+	// 监听按钮被按下--
+	initDevAPI() {
+		this.initRFID() // RFID 初始化
+		// 意图
+		let HTML5_PLUS_CONTENT_INTENT_CLASS = plus.android.importClass(this.HTML5_PLUS_CONTENT_INTENT);
+		this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY = plus.android.runtimeMainActivity(); // HTML5_PLUS 获取 activity
+		// 权限
+		let intentServer = new HTML5_PLUS_CONTENT_INTENT_CLASS(this.SCANOBJ.SCAN_SERVICE);
+		this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.sendBroadcast(intentServer);
+		
+		// HTML5_PLUS 创建数据监听函数
+		this.POC_KEY_DOWN_OBJ = plus.android.implements(
+			this.HTML5_PLUS_REFLECT_BROADCASTRECEIVER, {
+				onReceive: (context, intent) => {
+					// 红外扫描结果
+					if (intent.getAction() === this.SCANOBJ.SCAN_RESULT) {
+						let _data_ = intent.getByteArrayExtra("scanContext")
+						let codeStr = this.byteToString(_data_)
+						console.log(`回调数据:${codeStr}`)
+						uni.$emit('scancodemsg', {
+							msg: codeStr
+						})
+					}
+					else{
+						uni.showToast({
+							icon: 'none',
+							title: "红外扫描结果获取失败",
+							duration: 5000
+						});
+						return
+					}
+				}
+			}
+		);
+		// ============
+		this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.unregisterReceiver(this.POC_KEY_DOWN_OBJ); // 注册
+		let IntentFilter = plus.android.importClass(this.HTML5_PLUS_CONTENT_INTENTFILTER); // 暴露接口对象
+		let filter = new IntentFilter();
+		filter.addAction(this.SCANOBJ.SCAN_RESULT); // 红外 扫描结果,广播
+		this.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.registerReceiver(this.POC_KEY_DOWN_OBJ,filter); // 注册功能 
+		// ============
+		let that = this
+		plus.key.addEventListener("keyup", function(e) {
+			if (e.keyCode == 131 && that.TYPE_DEV_JQHWGEVIQUWVILBE === 0) {
+				console.log("按键被按下,开启红外扫描")
+				that.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.unregisterReceiver(that.POC_KEY_DOWN_OBJ); // 注册
+				let IntentFilter = plus.android.importClass(that.HTML5_PLUS_CONTENT_INTENTFILTER); // 暴露接口对象
+				let filter = new IntentFilter();
+				filter.addAction(that.SCANOBJ.SCAN_RESULT); // 红外 扫描结果,广播
+				that.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.registerReceiver(that.POC_KEY_DOWN_OBJ,filter); // 注册功能 
+			} else if (e.keyCode == 131 && that.TYPE_DEV_JQHWGEVIQUWVILBE === 1) {
+				console.log("按键被按下,开启RFID")
+				that.HTML5_PLUS_RUNTIME_MAIN_ACTIVITY.unregisterReceiver(that.POC_KEY_DOWN_OBJ); // 注册
+				console.log(that.RFIDIntervalTime)
+				console.log(that.ISRFIDOPEN)
+				if (that.RFIDIntervalTime ==0) {
+					console.log("开启RFID")
+					that.RFIDStartInventory()
+				}
+				else if(that.RFIDIntervalTime!=0 && that.ISRFIDOPEN === false){
+					console.log("开启RFID连续")
+					that.RFIDStartInventory()
+					that.ISRFIDOPEN = true
+				}
+				else if(that.ISRFIDOPEN === true&&that.RFIDIntervalTime!=0){
+					console.log("关闭RFID" +that.ISRFIDOPEN)
+					that.ISRFIDOPEN = false
+					that.RFIDStopInventory()
+				}
+			}
+			else{
+				return;
+			}
+
+		}, false);
+	}
+	// 设置扫描和RFID的开关 0扫描  1RFID
+	isRFIDAndSCAN(type) {
+		this.TYPE_DEV_JQHWGEVIQUWVILBE = type
+	}
+
+	// 初始化RFID
+	initRFID() {
+		console.log("初始化RFID")
+		// RFID 插件对象
+		this.RFID_SDK_WX = uni.requireNativePlugin("Lizii-uhfmagic-sdk");
+		//初始化sdk,在启动的第一个页面调用一次即可
+		let that = this
+		this.RFID_SDK_WX.setCallback(function(res) {
+			var event = res.event;
+			if (event == "onInventoryOnce") {
+				// res.data  epc 数组  没有信号强度
+				let arr = []
+				res.data.map(item => {
+					let codeStr = item.slice(6, 14)
+					codeStr = parseInt(codeStr, 16) + ""
+					uni.$emit('scancodemsg', {
+						msg: codeStr
+					})
+					console.log(`回调数据:${codeStr}`)
+				})
+			}
+			if (event == "onEpc") {
+				// res.data  epc 数组  没有信号强度
+				let arr = []
+				res.data.map(item => {
+					let codeStr = item.slice(6, 14)
+					codeStr = parseInt(codeStr, 16) + ""
+					arr.push(codeStr)
+				})
+				uni.$emit('scancodeList', {
+					msg: arr
+				})
+				console.log(`回调数据:${arr}`)
+			}
+		});
+
+		this.RFID_SDK_WX.init({
+			serialPortPath: "/dev/ttysWK2", //串口地址 ,不传默认为‘/dev/ttysWK2’
+			power: 26 //功率,不传默认26 取值14-26
+		});
+	}
+
+	// 开始存盘
+	RFIDStartInventory() {
+		if (this.RFIDIntervalTime === 0) {
+			console.log("开始单次存盘")
+			this.RFID_SDK_WX.inventoryOnce(true);
+		} else {
+			console.log("开始连续存盘")
+			this.RFID_SDK_WX.inventoryRealTime(true);
+		}
+	}
+
+	// 停止存盘
+	RFIDStopInventory() {
+		this.RFID_SDK_WX.inventoryRealTime(false);
+	}
+
+	// 获取设备 数据列表
+	RFIDGetDATAList() {
+		if (this.RFID_SDK_WX) {
+			var tagList = this.RFID_SDK_WX.getTagList();
+			return tagList
+		}
+	}
+
+	byteToString(arr) {
+		if (typeof arr === 'string') {
+			return arr;
+		}
+		var str = '',
+			_arr = arr;
+		for (var i = 0; i < _arr.length; i++) {
+			var one = _arr[i].toString(2),
+				v = one.match(/^1+?(?=0)/);
+			if (v && one.length == 8) {
+				var bytesLength = v[0].length;
+				var store = _arr[i].toString(2).slice(7 - bytesLength);
+				for (var st = 1; st < bytesLength; st++) {
+					store += _arr[st + i].toString(2).slice(2);
+				}
+				str += String.fromCharCode(parseInt(store, 2));
+				i += bytesLength - 1;
+			} else {
+				str += String.fromCharCode(_arr[i]);
+			}
+		}
+		return str;
+	}
+
+}
+
+export {
+	DEVAPI
+}

+ 53 - 0
components/utils/validate.js

@@ -0,0 +1,53 @@
+export function byteToString (arr) {
+  if(typeof arr === 'string') {
+    return arr;
+  }
+  var str = '',
+    _arr = arr;
+  for(var i = 0; i < _arr.length; i++) {
+    var one = _arr[i].toString(2),
+      v = one.match(/^1+?(?=0)/);
+    if(v && one.length == 8) {
+      var bytesLength = v[0].length;
+      var store = _arr[i].toString(2).slice(7 - bytesLength);
+      for(var st = 1; st < bytesLength; st++) {
+        store += _arr[st + i].toString(2).slice(2);
+      }
+      str += String.fromCharCode(parseInt(store, 2));
+      i += bytesLength - 1;
+    } else {
+      str += String.fromCharCode(_arr[i]);
+    }
+  }
+  return str;
+}
+export const broadcastScan = {
+  // init,
+};
+
+export const Format = (fmt, date) => {
+  let o = {
+    "M+": date.getMonth() + 1, // 月份
+    "d+": date.getDate(), // 日
+    "h+": date.getHours(), // 小时
+    "m+": date.getMinutes(), // 分
+    "s+": date.getSeconds(), // 秒
+    "q+": Math.floor((date.getMonth() + 3) / 3), // 季度
+    S: date.getMilliseconds(), // 毫秒
+  };
+  if (/(y+)/.test(fmt)) {
+    fmt = fmt.replace(
+      RegExp.$1,
+      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
+    );
+  }
+  for (var k in o) {
+    if (new RegExp("(" + k + ")").test(fmt)) {
+      fmt = fmt.replace(
+        RegExp.$1,
+        RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
+      );
+    }
+  }
+  return fmt;
+};

+ 1361 - 0
components/yq-avatar/yq-avatar.vue

@@ -0,0 +1,1361 @@
+<template name="yq-avatar">
+	<view>
+		<image :src="imgSrc.imgSrc" @click="fSelect" :style="[ iS ]" class="my-avatar"></image>
+		<canvas canvas-id="avatar-canvas" id="avatar-canvas" class="my-canvas" :style="{top: sT, height: csH}"
+		 disable-scroll="false"></canvas>
+		<canvas canvas-id="oper-canvas" id="oper-canvas" class="oper-canvas" :style="{top: sT, height: csH}"
+		 disable-scroll="false" @touchstart="fStart" @touchmove="fMove" @touchend="fEnd"></canvas>
+		<canvas canvas-id="prv-canvas" id="prv-canvas" class="prv-canvas" disable-scroll="false" 
+		@touchstart="fHideImg" :style="{ height: csH, top: pT }"></canvas>
+		<view class="oper-wrapper" :style="{display: sD, top:tp}">
+			<view class="oper">
+				<view class="btn-wrapper" v-if="sO">
+					<view @click="fSelect" hover-class="hover" :style="{width: bW}"><text>重选</text></view>
+					<view @click="fClose" hover-class="hover" :style="{width: bW}"><text>关闭</text></view>
+					<view @click="fRotate" hover-class="hover" :style="{width: bW, display: bD}"><text>旋转</text></view>
+					<view @click="fPreview" hover-class="hover" :style="{width: bW}"><text>预览</text></view>
+					<view @click="fUpload" hover-class="hover" :style="{width: bW}"><text>上传</text></view>
+				</view>
+				<view class="clr-wrapper" v-else>
+					<slider class="my-slider" @change="fColorChange" block-size="25" value="0" min="-100" max="100" activeColor="red"
+					 backgroundColor="green" block-color="grey" show-value></slider>
+					<view @click="fPrvUpload" hover-class="hover" :style="{width: bW}"><text>上传</text></view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	"use strict";
+	const tH = 50;
+	export default {
+		name: "yq-avatar",
+		data() {
+			return {
+				csH: '0px',
+				sD: 'none',
+				sT: '-10000px',
+				pT: '-10000px',
+				iS: {},
+				sS: {},
+				sO: true,
+				bW: '19%',
+				bD: 'flex',
+				tp: 0,
+				imgSrc: {
+					imgSrc: ''
+				}
+			};
+		},
+		watch: {
+			avatarSrc() {
+				this.imgSrc.imgSrc = this.avatarSrc;
+			}
+		},
+		props: {
+			avatarSrc: '',
+			avatarStyle: '',
+			selWidth: '',
+			selHeight: '',
+			expWidth: '',
+			expHeight: '',
+			minScale: '',
+			maxScale: '',
+			canScale: '',
+			canRotate: '',
+			lockWidth: '',
+			lockHeight: '',
+			stretch: '',
+			lock: '',
+			fileType: '',
+			noTab: '',
+			inner: '',
+			quality: '',
+			index: '',
+			bgImage: '',
+		},
+		created() {
+			this.cc = uni.createCanvasContext('avatar-canvas', this);
+			this.cco = uni.createCanvasContext('oper-canvas', this);
+			this.ccp = uni.createCanvasContext('prv-canvas', this);
+			this.qlty = parseFloat(this.quality) || 1;
+			this.imgSrc.imgSrc = this.avatarSrc;
+			this.letRotate = (this.canRotate === false || this.inner === true || this.inner === 'true' || this.canRotate === 'false') ? 0 : 1;
+			this.letScale = (this.canScale === false || this.canScale === 'false') ? 0 : 1;
+			this.isin = (this.inner === true || this.inner === 'true') ? 1 : 0;
+			this.indx = this.index || undefined;
+			this.mnScale = parseFloat(this.minScale) || 0.3;
+			this.mxScale = parseFloat(this.maxScale) || 4;
+			this.noBar = (this.noTab === true || this.noTab === 'true') ? 1 : 0;
+			this.stc = this.stretch;
+			this.lck = this.lock;
+			this.fType = this.fileType === 'jpg' ? 'jpg' : 'png';
+			if (this.isin||!this.letRotate) {
+				this.bW = '24%';
+				this.bD = 'none';
+			} else {
+				this.bW = '19%';
+				this.bD = 'flex';
+			}
+			
+			if (this.noBar) {
+				this.fWindowResize();
+			} else {
+				uni.showTabBar({
+					fail: ()=>{
+						this.noBar = 1;
+					},
+					success: ()=>{
+						this.noBar = 0;
+					},
+					complete: (res) => {
+						this.fWindowResize();
+					}
+				});
+			}
+		},
+		methods: {
+			fWindowResize() {
+				let sysInfo = uni.getSystemInfoSync();
+				this.platform = sysInfo.platform;
+				this.wW = sysInfo.windowWidth;
+
+				// #ifdef H5
+				this.drawTop = sysInfo.windowTop;
+				// #endif
+				// #ifndef H5
+				this.drawTop = 0;
+				// #endif
+				
+				// #ifdef MP-ALIPAY
+				this.wH = sysInfo.screenHeight - sysInfo.statusBarHeight - sysInfo.titleBarHeight;
+				this.csH = this.wH - tH  + 'px';
+				// #endif
+				
+				// #ifndef MP-ALIPAY
+				this.wH = sysInfo.windowHeight;
+				if(!this.noBar) this.wH += tH;
+				this.csH = this.wH - tH  + 'px';
+				// #endif
+				
+				this.tp = this.csH;
+				// #ifdef H5
+				this.tp =  sysInfo.windowTop + parseInt(this.csH)+ 'px';
+				// #endif
+				
+				this.pxRatio = this.wW / 750;
+
+				let style = this.avatarStyle;
+				if (style && style !== true && (style = style.trim())) {
+					style = style.split(';');
+					let obj = {};
+					for (let v of style) {
+						if (!v) continue;
+						v = v.trim().split(':');
+						if (v[1].toString().indexOf('upx') >= 0) {
+							let arr = v[1].trim().split(' ');
+							for (let k in arr) {
+								if (!arr[k]) continue;
+								if (arr[k].toString().indexOf('upx') >= 0) {
+									arr[k] = parseFloat(arr[k]) * this.pxRatio + 'px';
+								}
+							}
+							v[1] = arr.join(' ');
+						}
+						obj[v[0].trim()] = v[1].trim();
+					}
+					this.iS = obj;
+				}
+
+				this.expWidth && (this.eW = this.expWidth.toString().indexOf('upx') >= 0 ? parseInt(this.expWidth) * this.pxRatio :
+					parseInt(this.expWidth));
+				this.expHeight && (this.eH = this.expHeight.toString().indexOf('upx') >= 0 ? parseInt(this.expHeight) * this.pxRatio :
+					parseInt(this.expHeight));
+				
+				if (this.sD === 'flex') {
+					this.fDrawInit(true);
+				}
+				this.fHideImg();
+			},
+			fSelect() {
+				if (this.fSelecting) return;
+				this.fSelecting = true;
+				setTimeout(() => {
+					this.fSelecting = false;
+				}, 500);
+
+				uni.chooseImage({
+					count: 1,
+					sizeType: ['original', 'compressed'],
+					sourceType: ['album', 'camera'],
+					success: (r) => {
+						// #ifdef MP-ALIPAY
+						uni.showLoading();
+						// #endif
+						// #ifndef MP-ALIPAY
+						uni.showLoading({
+							title: '加载中...',
+							mask: true
+						});
+						// #endif
+
+						let path = this.imgPath = r.tempFilePaths[0];
+						uni.getImageInfo({
+							src: path,
+							success: r => {
+								this.imgWidth = r.width;
+								this.imgHeight = r.height;
+								this.path = path;
+								if (!this.hasSel) {
+									let style = this.sS || {};
+									if (this.selWidth && this.selHeight) {
+										let sW = this.selWidth.toString().indexOf('upx') >= 0 ? parseInt(this.selWidth) * this.pxRatio : parseInt(
+												this.selWidth),
+											sH = this.selHeight.toString().indexOf('upx') >= 0 ? parseInt(this.selHeight) * this.pxRatio : parseInt(
+												this.selHeight);
+										style.width = sW + 'px';
+										style.height = sH + 'px';
+										style.top = ((this.wH - sH - tH)|0) / 2 + 'px';
+										style.left = ((this.wW - sW)|0) / 2 + 'px';
+									} else {
+										uni.showModal({
+											title: '裁剪框的宽或高没有设置',
+											showCancel: false
+										})
+										return;
+									}
+									this.sS = style;
+								}
+
+								if (this.noBar) {
+									this.fDrawInit(true);
+								} else {
+									uni.hideTabBar({
+										complete: () => {
+											this.fDrawInit(true);
+										}
+									});
+								}
+							},
+							fail: () => {
+								uni.showToast({
+									title: "请选择正确图片",
+									duration: 2000,
+								})
+							},
+							complete() {
+								uni.hideLoading();
+							}
+						});
+					}
+				})
+			},
+			fUpload() {
+				if (this.fUploading) return;
+				this.fUploading = true;
+				setTimeout(() => {
+					this.fUploading = false;
+				}, 1000)
+
+				let style = this.sS,
+					x = parseInt(style.left),
+					y = parseInt(style.top),
+					width = parseInt(style.width),
+					height = parseInt(style.height),
+					expWidth = this.eW || (width* this.pixelRatio),
+					expHeight = this.eH || (height* this.pixelRatio);
+
+				// #ifdef MP-ALIPAY
+				uni.showLoading();
+				// #endif
+				// #ifndef MP-ALIPAY
+				uni.showLoading({
+					title: '加载中...',
+					mask: true
+				});
+				// #endif
+
+				this.sD = 'none';
+				this.sT = '-10000px';
+				this.hasSel = false;
+				this.fHideImg();
+				// #ifdef MP-ALIPAY
+				this.cc.toTempFilePath({
+					x: x,
+					y: y,
+					width: width,
+					height: height,
+					destWidth: expWidth,
+					destHeight: expHeight,
+					fileType: this.fType,
+					quality: this.qlty,
+					success: (r) => {
+						r = r.apFilePath;
+						this.$emit("upload", {
+							avatar: this.imgSrc,
+							path: r,
+							index: this.indx,
+							data: this.rtn,
+							base64: this.base64 || null
+						});
+					},
+					fail: (res) => {
+						uni.showToast({
+							title: "error1",
+							duration: 2000,
+						})
+					},
+					complete: () => {
+						uni.hideLoading();
+						this.noBar || uni.showTabBar();
+						this.$emit("end");
+					}
+				});
+				// #endif
+				// #ifndef MP-ALIPAY
+				uni.canvasToTempFilePath({
+					x: x,
+					y: y,
+					width: width,
+					height: height,
+					destWidth: expWidth,
+					destHeight: expHeight,
+					canvasId: 'avatar-canvas',
+					fileType: this.fType,
+					quality: this.qlty,
+					success: (r) => {
+						r = r.tempFilePath;
+						// #ifdef H5
+						this.btop(r).then((r) => {
+							this.$emit("upload", {
+								avatar: this.imgSrc,
+								path: r,
+								index: this.indx,
+								data: this.rtn,
+								base64: this.base64 || null
+							});
+							return;
+						})
+						// #endif
+						// #ifndef H5
+						this.$emit("upload", {
+							avatar: this.imgSrc,
+							path: r,
+							index: this.indx,
+							data: this.rtn,
+							base64: this.base64 || null
+						});
+						// #endif
+					},
+					fail: (res) => {
+						uni.showToast({
+							title: "error1",
+							duration: 2000,
+						})
+					},
+					complete: () => {
+						uni.hideLoading();
+						this.noBar || uni.showTabBar();
+						this.$emit("end");
+					}
+				}, this);
+				// #endif
+			},
+			fPrvUpload() {
+				if (this.fPrvUploading) return;
+				this.fPrvUploading = true;
+				setTimeout(() => {
+					this.fPrvUploading = false;
+				}, 1000)
+
+				let style = this.sS,
+					destWidth = parseInt(style.width),
+					destHeight = parseInt(style.height),
+					prvX = this.prvX,
+					prvY = this.prvY,
+					prvWidth = this.prvWidth,
+					prvHeight = this.prvHeight,
+					expWidth = this.eW || (parseInt(style.width) * this.pixelRatio),
+					expHeight = this.eH || (parseInt(style.height) * this.pixelRatio);
+
+				// #ifdef MP-ALIPAY
+				uni.showLoading();
+				// #endif
+				// #ifndef MP-ALIPAY
+				uni.showLoading({
+					title: '加载中...',
+					mask: true
+				});
+				// #endif
+
+				this.sD = 'none';
+				this.sT = '-10000px';
+				this.hasSel = false;
+				this.fHideImg();
+				// #ifdef MP-ALIPAY
+				this.ccp.toTempFilePath({
+					x: prvX,
+					y: prvY,
+					width: prvWidth,
+					height: prvHeight,
+					destWidth: expWidth,
+					destHeight: expHeight,
+					fileType: this.fType,
+					quality: this.qlty,
+					success: (r) => {
+						r = r.apFilePath;
+						this.$emit("upload", {
+							avatar: this.imgSrc,
+							path: r,
+							index: this.indx,
+							data: this.rtn,
+							base64: this.base64 || null
+						});
+					},
+					fail: () => {
+						uni.showToast({
+							title: "error_prv",
+							duration: 2000,
+						})
+					},
+					complete: () => {
+						uni.hideLoading();
+						this.noBar || uni.showTabBar();
+						this.$emit("end");
+					}
+				});
+				// #endif
+				// #ifndef MP-ALIPAY
+				uni.canvasToTempFilePath({
+					x: prvX,
+					y: prvY,
+					width: prvWidth,
+					height: prvHeight,
+					destWidth: expWidth,
+					destHeight: expHeight,
+					canvasId: 'prv-canvas',
+					fileType: this.fType,
+					quality: this.qlty,
+					success: (r) => {
+						r = r.tempFilePath;
+						// #ifdef H5
+						this.btop(r).then((r) => {
+							this.$emit("upload", {
+								avatar: this.imgSrc,
+								path: r,
+								index: this.indx,
+								data: this.rtn,
+								base64: this.base64 || null
+							});
+						})
+						// #endif
+						// #ifndef H5
+						this.$emit("upload", {
+							avatar: this.imgSrc,
+							path: r,
+							index: this.indx,
+							data: this.rtn,
+							base64: this.base64 || null
+						});
+						// #endif
+					},
+					fail: () => {
+						uni.showToast({
+							title: "error_prv",
+							duration: 2000,
+						})
+					},
+					complete: () => {
+						uni.hideLoading();
+						this.noBar || uni.showTabBar();
+						this.$emit("end");
+					}
+				}, this);
+				// #endif
+			},
+			fDrawInit(ini = false) {
+				let allWidth = this.wW,
+					allHeight = this.wH,
+					imgWidth = this.imgWidth,
+					imgHeight = this.imgHeight,
+					imgRadio = imgWidth / imgHeight,
+					useWidth = allWidth - 40,
+					useHeight = allHeight - tH - 80,
+					useRadio = useWidth / useHeight,
+					sW = parseInt(this.sS.width),
+					sH = parseInt(this.sS.height);
+
+				this.fixWidth = 0;
+				this.fixHeight = 0;
+				this.lckWidth = 0;
+				this.lckHeight = 0;
+				switch (this.stc) {
+					case 'x':
+						this.fixWidth = 1;
+						break;
+					case 'y':
+						this.fixHeight = 1;
+						break;
+					case 'long':
+						if (imgRadio > 1) this.fixWidth = 1;
+						else this.fixHeight = 1;
+						break;
+					case 'short':
+						if (imgRadio > 1) this.fixHeight = 1;
+						else this.fixWidth = 1;
+						break;
+					case 'longSel':
+						if (sW > sH) this.fixWidth = 1;
+						else this.fixHeight = 1;
+						break;
+					case 'shortSel':
+						if (sW > sH) this.fixHeight = 1;
+						else this.fixWidth = 1;
+						break;
+				}
+				switch (this.lck) {
+					case 'x':
+						this.lckWidth = 1;
+						break;
+					case 'y':
+						this.lckHeight = 1;
+						break;
+					case 'long':
+						if (imgRadio > 1) this.lckWidth = 1;
+						else this.lckHeight = 1;
+						break;
+					case 'short':
+						if (imgRadio > 1) this.lckHeight = 1;
+						else this.lckWidth = 1;
+						break;
+					case 'longSel':
+						if (sW > sH) this.lckWidth = 1;
+						else this.lckHeight = 1;
+						break;
+					case 'shortSel':
+						if (sW > sH) this.lckHeight = 1;
+						else this.lckWidth = 1;
+						break;
+				}
+				if (this.fixWidth) {
+					useWidth = sW;
+					useHeight = useWidth / imgRadio;
+				} else if (this.fixHeight) {
+					useHeight = sH;
+					useWidth = useHeight * imgRadio;
+				} else if (imgRadio < useRadio) {
+					if (imgHeight < useHeight) {
+						useWidth = imgWidth;
+						useHeight = imgHeight;
+					} else {
+						useWidth = useHeight * imgRadio;
+					}
+				} else {
+					if (imgWidth < useWidth) {
+						useWidth = imgWidth;
+						useHeight = imgHeight;
+					} else {
+						useHeight = useWidth / imgRadio;
+					}
+				}
+				if (this.isin) {
+					if (useWidth < sW) {
+						useWidth = sW;
+						useHeight = useWidth / imgRadio;
+						this.lckHeight = 0;
+					}
+					if (useHeight < sH) {
+						useHeight = sH;
+						useWidth = useHeight * imgRadio;
+						this.lckWidth = 0;
+					}
+				}
+
+				this.scaleSize = 1;
+				this.rotateDeg = 0;
+				this.posWidth = (allWidth - useWidth) / 2 | 0;
+				this.posHeight = (allHeight - useHeight - tH) / 2 | 0;
+				this.useWidth = useWidth | 0;
+				this.useHeight = useHeight | 0;
+				this.centerX = this.posWidth + useWidth / 2;
+				this.centerY = this.posHeight + useHeight / 2;
+				this.focusX = 0;
+				this.focusY = 0;
+
+				let style = this.sS,
+					left = parseInt(style.left),
+					top = parseInt(style.top),
+					width = parseInt(style.width),
+					height = parseInt(style.height),
+					canvas = this.canvas,
+					canvasOper = this.canvasOper,
+					cc = this.cc,
+					cco = this.cco;
+					
+				cco.beginPath();
+				cco.setLineWidth(3);
+				cco.setGlobalAlpha(1);
+				cco.setStrokeStyle('white');
+				cco.strokeRect(left, top, width, height);
+				
+				cco.setFillStyle('black');
+				cco.setGlobalAlpha(0.5);
+				cco.fillRect(0, 0, this.wW, top);
+				cco.fillRect(0, top, left, height);
+				cco.fillRect(0, top + height, this.wW, this.wH - height - top - tH);
+				cco.fillRect(left + width, top, this.wW - width - left, height);
+				
+				cco.setGlobalAlpha(1);
+				cco.setStrokeStyle('red');
+				cco.moveTo(left+15, top);
+				cco.lineTo(left, top);
+				cco.lineTo(left, top+15);
+				cco.moveTo(left+width-15, top);
+				cco.lineTo(left+width, top);
+				cco.lineTo(left+width, top+15);
+				cco.moveTo(left+15, top+height);
+				cco.lineTo(left, top+height);
+				cco.lineTo(left, top+height-15);
+				cco.moveTo(left+width-15, top+height);
+				cco.lineTo(left+width, top+height);
+				cco.lineTo(left+width, top+height-15);
+				cco.stroke();
+				
+				cco.draw(false, () => {
+					if (ini) {
+						this.sD = 'flex';
+						this.sT = this.drawTop + 'px';
+						this.fDrawImage(true);
+					}
+				});
+				this.$emit("init");
+			},
+			fDrawImage(ini = false) {
+				let tm_now = Date.now();
+				if (tm_now - this.drawTm < 20) return;
+				this.drawTm = tm_now;
+
+				let cc = this.cc,
+					imgWidth = this.useWidth * this.scaleSize,
+					imgHeight = this.useHeight * this.scaleSize;
+
+				// #ifdef MP-ALIPAY	
+				cc.save();
+				// #endif
+				
+				if (this.bgImage) {
+					// #ifdef MP-ALIPAY
+					cc.clearRect(0, 0, this.wW, this.wH - tH);
+					// #endif
+					// #ifndef MP-ALIPAY
+					cc.drawImage(this.bgImage, 0, 0, this.wW, this.wH - tH);
+					// #endif
+				} else {
+					cc.fillRect(0, 0, this.wW, this.wH - tH);
+				}
+
+				if (this.isin) {
+					let cx = this.focusX * (this.scaleSize - 1),
+						cy = this.focusY * (this.scaleSize - 1);
+
+					cc.translate(this.centerX, this.centerY);
+					cc.rotate(this.rotateDeg * Math.PI / 180);
+					cc.drawImage(this.imgPath, this.posWidth-this.centerX-cx, this.posHeight-this.centerY-cy, imgWidth, imgHeight);
+				
+				} else {
+					cc.translate(this.posWidth + imgWidth / 2, this.posHeight + imgHeight / 2);
+					cc.rotate(this.rotateDeg * Math.PI / 180);
+					cc.drawImage(this.imgPath, -imgWidth / 2, -imgHeight / 2, imgWidth, imgHeight);
+				}
+
+				cc.draw(false);
+
+				// #ifdef MP-ALIPAY
+				cc.restore();
+				// #endif
+			},
+			fPreview() {
+				if (this.fPreviewing) return;
+				this.fPreviewing = true;
+				setTimeout(() => {
+					this.fPreviewing = false;
+				}, 1000);
+
+				let style = this.sS,
+					x = parseInt(style.left),
+					y = parseInt(style.top),
+					width = parseInt(style.width),
+					height = parseInt(style.height);
+
+				// #ifdef MP-ALIPAY
+				uni.showLoading();
+				// #endif
+				// #ifndef MP-ALIPAY
+				uni.showLoading({
+					title: '加载中...',
+					mask: true
+				});
+				// #endif
+
+				// #ifdef MP-ALIPAY
+				this.cc.toTempFilePath({
+					x: x,
+					y: y,
+					width: width,
+					height: height,
+					expWidth: width * this.pixelRatio,
+					expHeight: height * this.pixelRatio,
+					fileType: this.fType,
+					quality: this.qlty,
+					success: (r) => {
+						this.prvImgTmp = r = r.apFilePath;
+						let ccp = this.ccp,
+							prvX = this.wW,
+							prvY = parseInt(this.csH),
+							prvWidth = parseInt(this.sS.width),
+							prvHeight = parseInt(this.sS.height),
+							useWidth = prvX - 40,
+							useHeight = prvY - 80,
+							radio = useWidth / prvWidth,
+							rHeight = prvHeight * radio;
+						if (rHeight < useHeight) {
+							prvWidth = useWidth;
+							prvHeight = rHeight;
+						} else {
+							radio = useHeight / prvHeight;
+							prvWidth *= radio;
+							prvHeight = useHeight;
+						}
+						ccp.fillRect(0, 0, prvX, prvY);
+						this.prvX = prvX = ((prvX - prvWidth) / 2) | 0;
+						this.prvY = prvY = ((prvY - prvHeight) / 2) | 0;
+						this.prvWidth = prvWidth = prvWidth | 0;
+						this.prvHeight = prvHeight = prvHeight | 0;
+						ccp.drawImage(r, prvX, prvY, prvWidth, prvHeight);
+						ccp.draw(false);
+
+						this.sO = false;
+						this.pT = '0';
+					},
+					fail: () => {
+						uni.showToast({
+							title: "error2",
+							duration: 2000,
+						})
+					},
+					complete: () => {
+						uni.hideLoading();
+					}
+				});
+				// #endif
+
+				// #ifndef MP-ALIPAY
+				uni.canvasToTempFilePath({
+					x: x,
+					y: y,
+					width: width,
+					height: height,
+					expWidth: width * this.pixelRatio,
+					expHeight: height * this.pixelRatio,
+					canvasId: 'avatar-canvas',
+					fileType: this.fType,
+					quality: this.qlty,
+					success: (r) => {
+						this.prvImgTmp = r = r.tempFilePath;
+
+						let ccp = this.ccp,
+							prvX = this.wW,
+							prvY = parseInt(this.csH);
+
+						// #ifndef H5||MP-WEIXIN||APP-PLUS
+						prvY += tH;
+						// #endif
+						// #ifdef APP-PLUS
+						if (this.platform === 'android') {
+							prvY += tH;
+						}
+						// #endif
+
+						let prvWidth = parseInt(this.sS.width),
+							prvHeight = parseInt(this.sS.height),
+							useWidth = prvX - 40,
+							useHeight = prvY - 80,
+							radio = useWidth / prvWidth,
+							rHeight = prvHeight * radio;
+						if (rHeight < useHeight) {
+							prvWidth = useWidth;
+							prvHeight = rHeight;
+						} else {
+							radio = useHeight / prvHeight;
+							prvWidth *= radio;
+							prvHeight = useHeight;
+						}
+
+						ccp.fillRect(0, 0, prvX, prvY);
+						this.prvX = prvX = ((prvX - prvWidth) / 2) | 0;
+						this.prvY = prvY = ((prvY - prvHeight) / 2) | 0;
+						this.prvWidth = prvWidth = prvWidth | 0;
+						this.prvHeight = prvHeight = prvHeight | 0;
+						ccp.drawImage(r, prvX, prvY, prvWidth, prvHeight);
+						ccp.draw(false);
+
+						// #ifdef H5
+						this.btop(r).then((r) => {
+							this.sO = false;
+							this.pT = this.drawTop + 'px';
+						})
+						// #endif
+						
+						this.sO = false; 
+						// if (this.platform === 'android') this.sO = false;
+						this.pT = this.drawTop + 'px';
+					},
+					fail: () => {
+						uni.showToast({
+							title: "error2",
+							duration: 2000,
+						})
+					},
+					complete: () => {
+						uni.hideLoading();
+					}
+				}, this);
+				// #endif
+			},
+			fChooseImg(index = undefined, params = undefined, data = undefined) {
+				if (params) {
+					let sW = params.selWidth,
+						sH = params.selHeight,
+						expWidth = params.expWidth,
+						expHeight = params.expHeight,
+						quality = params.quality,
+						canRotate = params.canRotate,
+						canScale = params.canScale,
+						minScale = params.minScale,
+						maxScale = params.maxScale,
+						stretch = params.stretch,
+						fileType = params.fileType,
+						inner = params.inner,
+						lock = params.lock;
+
+					expWidth && (this.eW = expWidth.toString().indexOf('upx') >= 0 ? parseInt(expWidth) * this.pxRatio : parseInt(
+						expWidth));
+					expHeight && (this.eH = expHeight.toString().indexOf('upx') >= 0 ? parseInt(expHeight) * this.pxRatio : parseInt(
+						expHeight));
+					this.letRotate = (canRotate === false || inner === true || inner === 'true' || canRotate === 'false') ? 0 : 1;
+					this.letScale = (canScale === false || canScale === 'false') ? 0 : 1;
+					this.qlty = parseFloat(quality) || 1;
+					this.mnScale = parseFloat(minScale) || 0.3;
+					this.mxScale = parseFloat(maxScale) || 4;
+					this.stc = stretch;
+					this.isin = (inner === true || inner === 'true') ? 1 : 0;
+					this.fType = fileType === 'jpg' ? 'jpg' : 'png';
+					this.lck = lock;
+					if (this.isin||!this.letRotate) {
+						this.bW = '24%';
+						this.bD = 'none';
+					} else {
+						this.bW = '19%';
+						this.bD = 'flex';
+					}
+
+					if (sW && sH) {
+						sW = sW.toString().indexOf('upx') >= 0 ? parseInt(sW) * this.pxRatio : parseInt(sW);
+						sH = sH.toString().indexOf('upx') >= 0 ? parseInt(sH) * this.pxRatio : parseInt(sH);
+						this.sS.width = sW + 'px';
+						this.sS.height = sH + 'px';
+						this.sS.top = ((this.wH - sH - tH)|0) / 2 + 'px';
+						this.sS.left = ((this.wW - sW)|0) / 2 + 'px';
+						this.hasSel = true;
+					}
+				}
+				this.rtn = data;
+				this.indx = index;
+				this.fSelect();
+			},
+			fRotate() {
+				this.rotateDeg += 90 - this.rotateDeg % 90;
+				this.fDrawImage();
+			},
+			fStart(e) {
+				let touches = e.touches,
+					touch0 = touches[0],
+					touch1 = touches[1];
+
+				this.touch0 = touch0;
+				this.touch1 = touch1;
+
+				if (touch1) {
+					let x = touch1.x - touch0.x,
+						y = touch1.y - touch0.y;
+					this.fgDistance = Math.sqrt(x * x + y * y);
+				}
+			},
+			fMove(e) {
+				let touches = e.touches,
+					touch0 = touches[0],
+					touch1 = touches[1];
+
+				if (touch1) {
+					let x = touch1.x - touch0.x,
+						y = touch1.y - touch0.y,
+						fgDistance = Math.sqrt(x * x + y * y),
+						scaleSize = 0.005 * (fgDistance - this.fgDistance),
+						beScaleSize = this.scaleSize + scaleSize;
+
+					do {
+						if (!this.letScale) break;
+						if (beScaleSize < this.mnScale) break;
+						if (beScaleSize > this.mxScale) break;
+
+						let growX = this.useWidth * scaleSize / 2,
+							growY = this.useHeight * scaleSize / 2;
+						if (this.isin) {
+							let imgWidth = this.useWidth * beScaleSize,
+								imgHeight = this.useHeight * beScaleSize,
+								l = this.posWidth - growX,
+								t = this.posHeight - growY,
+								r = l + imgWidth,
+								b = t + imgHeight,
+								left = parseInt(this.sS.left),
+								top = parseInt(this.sS.top),
+								width = parseInt(this.sS.width),
+								height = parseInt(this.sS.height),
+								right = left + width,
+								bottom = top + height,
+								cx, cy;
+
+							if (imgWidth <= width || imgHeight <= height) break;
+							this.cx = cx = this.focusX * beScaleSize - this.focusX,
+								this.cy = cy = this.focusY * beScaleSize - this.focusY;
+							this.posWidth -= growX;
+							this.posHeight -= growY;
+							if (this.posWidth - cx > left) {
+								this.posWidth = left + cx;
+							}
+							if (this.posWidth + imgWidth - cx < right) {
+								this.posWidth = right - imgWidth + cx;
+							}
+							if (this.posHeight - cy > top) {
+								this.posHeight = top + cy;
+							}
+							if (this.posHeight + imgHeight - cy < bottom) {
+								this.posHeight = bottom - imgHeight + cy;
+							}
+						} else {
+							this.posWidth -= growX;
+							this.posHeight -= growY;
+						}
+
+						this.scaleSize = beScaleSize;
+					} while (0);
+					this.fgDistance = fgDistance;
+					if (touch1.x !== touch0.x && this.letRotate) {
+						x = (this.touch1.y - this.touch0.y) / (this.touch1.x - this.touch0.x);
+						y = (touch1.y - touch0.y) / (touch1.x - touch0.x);
+						this.rotateDeg += Math.atan((y - x) / (1 + x * y)) * 180 / Math.PI;
+						this.touch0 = touch0;
+						this.touch1 = touch1;
+					}
+
+					this.fDrawImage();
+				} else if (this.touch0) {
+					let x = touch0.x - this.touch0.x,
+						y = touch0.y - this.touch0.y,
+						beX = this.posWidth + x,
+						beY = this.posHeight + y;
+					if (this.isin) {
+						let imgWidth = this.useWidth * this.scaleSize,
+							imgHeight = this.useHeight * this.scaleSize,
+							l = beX,
+							t = beY,
+							r = l + imgWidth,
+							b = t + imgHeight,
+							left = parseInt(this.sS.left),
+							top = parseInt(this.sS.top),
+							right = left + parseInt(this.sS.width),
+							bottom = top + parseInt(this.sS.height),
+							cx, cy;
+
+						this.cx = cx = this.focusX * this.scaleSize - this.focusX;
+						this.cy = cy = this.focusY * this.scaleSize - this.focusY;
+
+						if (!this.lckWidth && Math.abs(x) < 100) {
+							if (left < l - cx) {
+								this.posWidth = left + cx;
+							} else if (right > r - cx) {
+								this.posWidth = right - imgWidth + cx;
+							} else {
+								this.posWidth = beX;
+								this.focusX -= x;
+							}
+						}
+						if (!this.lckHeight && Math.abs(y) < 100) {
+							if (top < t - cy) {
+								this.focusY -= (top + cy - this.posHeight);
+								this.posHeight = top + cy;
+							} else if (bottom > b - cy) {
+								this.focusY -= (bottom + cy - (this.posHeight + imgHeight));
+								this.posHeight = bottom - imgHeight + cy;
+							} else {
+								this.posHeight = beY;
+								this.focusY -= y;
+							}
+						}
+					} else {
+						if (Math.abs(x) < 100 && !this.lckWidth) this.posWidth = beX;
+						if (Math.abs(y) < 100 && !this.lckHeight) this.posHeight = beY;
+						this.focusX -= x;
+						this.focusY -= y;
+					}
+
+					this.touch0 = touch0;
+					this.fDrawImage();
+				}
+			},
+			fEnd(e) {
+				let touches = e.touches,
+					touch0 = touches && touches[0],
+					touch1 = touches && touches[1];
+				if (touch0) {
+					this.touch0 = touch0;
+				} else {
+					this.touch0 = null;
+					this.touch1 = null;
+				}
+			},
+			fHideImg() {
+				this.prvImg = '';
+				this.pT = '-10000px';
+				this.sO = true;
+				this.prvImgData = null;
+				this.target = null;
+			},
+			fClose() {
+				this.sD = 'none';
+				this.sT = '-10000px';
+				this.hasSel = false;
+				this.fHideImg();
+				this.noBar || uni.showTabBar();
+				this.$emit("end");
+			},
+			fGetImgData() {
+				return new Promise((resolve, reject) => {
+					let prvX = this.prvX,
+						prvY = this.prvY,
+						prvWidth = this.prvWidth,
+						prvHeight = this.prvHeight;
+					// #ifdef MP-ALIPAY
+					this.ccp.getImageData({
+						x: prvX,
+						y: prvY,
+						width: prvWidth,
+						height: prvHeight,
+						success(res) {
+							resolve(res.data);
+						},
+						fail(err) {
+							reject(err);
+						}
+					}, this);
+					// #endif
+					// #ifndef MP-ALIPAY
+					uni.canvasGetImageData({
+						canvasId: 'prv-canvas',
+						x: prvX,
+						y: prvY,
+						width: prvWidth,
+						height: prvHeight,
+						success(res) {
+							resolve(res.data);
+						},
+						fail(err) {
+							reject(err);
+						}
+					}, this);
+					// #endif
+				});
+			},
+			async fColorChange(e) {
+				let tm_now = Date.now();
+				if (tm_now - this.prvTm < 100) return;
+				this.prvTm = tm_now;
+
+				// #ifdef MP-ALIPAY
+				uni.showLoading();
+				// #endif
+				// #ifndef MP-ALIPAY
+				uni.showLoading({
+					title: '加载中...',
+					mask: true
+				});
+				// #endif
+
+				if (!this.prvImgData) {
+					if (!(this.prvImgData = await this.fGetImgData().catch(() => {
+							uni.showToast({
+								title: "error_read",
+								duration: 2000,
+							})
+						}))) return;
+
+					this.target = new Uint8ClampedArray(this.prvImgData.length);
+				}
+
+				let data = this.prvImgData,
+					target = this.target,
+					i = e.detail.value,
+					r, g, b, a, h, s, l, d, p, q, t, min, max, hK, tR, tG, tB;
+
+				if (i === 0) {
+					target = data;
+				} else {
+					i = (i + 100) / 200;
+					if (i < 0.005) i = 0;
+					if (i > 0.995) i = 1;
+					for (let n = data.length - 1; n >= 0; n -= 4) {
+						r = data[n - 3] / 255;
+						g = data[n - 2] / 255;
+						b = data[n - 1] / 255;
+						max = Math.max(r, g, b);
+						min = Math.min(r, g, b);
+						d = max - min;
+						if (max === min) {
+							h = 0;
+						} else if (max === r && g >= b) {
+							h = 60 * ((g - b) / d);
+						} else if (max === r && g < b) {
+							h = 60 * ((g - b) / d) + 360;
+						} else if (max === g) {
+							h = 60 * ((b - r) / d) + 120;
+						} else if (max === b) {
+							h = 60 * ((r - g) / d) + 240;
+						}
+						l = (max + min) / 2;
+						if (l === 0 || max === min) {
+							s = 0;
+						} else if (0 < l && l <= 0.5) {
+							s = d / (2 * l);
+						} else if (l > 0.5) {
+							s = d / (2 - 2 * l);
+						}
+						data[n] && (a = data[n]);
+
+						if (i < 0.5) {
+							s = s * i / 0.5;
+						} else if (i > 0.5) {
+							s = 2 * s + 2 * i - (s * i / 0.5) - 1;
+						}
+
+						if (s === 0) {
+							r = g = b = Math.round(l * 255);
+						} else {
+							if (l < 0.5) {
+								q = l * (1 + s);
+							} else if (l >= 0.5) {
+								q = l + s - (l * s);
+							}
+							p = 2 * l - q;
+							hK = h / 360;
+							tR = hK + 1 / 3;
+							tG = hK;
+							tB = hK - 1 / 3;
+							let correctRGB = (t) => {
+								if (t < 0) {
+									return t + 1.0;
+								}
+								if (t > 1) {
+									return t - 1.0;
+								}
+								return t;
+							};
+							let createRGB = (t) => {
+								if (t < (1 / 6)) {
+									return p + ((q - p) * 6 * t);
+								} else if (t >= (1 / 6) && t < (1 / 2)) {
+									return q;
+								} else if (t >= (1 / 2) && t < (2 / 3)) {
+									return p + ((q - p) * 6 * ((2 / 3) - t));
+								}
+								return p;
+							};
+							r = tR = Math.round(createRGB(correctRGB(tR)) * 255);
+							g = tG = Math.round(createRGB(correctRGB(tG)) * 255);
+							b = tB = Math.round(createRGB(correctRGB(tB)) * 255);
+						}
+						a && (target[n] = a);
+						target[n - 3] = r;
+						target[n - 2] = g;
+						target[n - 1] = b;
+					}
+				}
+
+				let prvX = this.prvX,
+					prvY = this.prvY,
+					prvWidth = this.prvWidth,
+					prvHeight = this.prvHeight;
+
+				// #ifdef MP-ALIPAY
+				this.ccp.putImageData({
+					x: prvX,
+					y: prvY,
+					width: prvWidth,
+					height: prvHeight,
+					data: target,
+					fail() {
+						uni.showToast({
+							title: 'error_put',
+							duration: 2000
+						})
+					},
+					complete() {
+						uni.hideLoading();
+					}
+				}, this);
+				// #endif
+
+				// #ifndef MP-ALIPAY
+				uni.canvasPutImageData({
+					canvasId: 'prv-canvas',
+					x: prvX,
+					y: prvY,
+					width: prvWidth,
+					height: prvHeight,
+					data: target,
+					fail() {
+						uni.showToast({
+							title: 'error_put',
+							duration: 2000
+						})
+					},
+					complete() {
+						uni.hideLoading();
+					}
+				}, this);
+				// #endif
+			},
+			btop(base64) {
+				this.base64 = base64;
+				return new Promise(function(resolve, reject) {
+					var arr = base64.split(','),
+						mime = arr[0].match(/:(.*?);/)[1],
+						bstr = atob(arr[1]),
+						n = bstr.length,
+						u8arr = new Uint8Array(n);
+					while (n--) {
+						u8arr[n] = bstr.charCodeAt(n);
+					}
+					return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([u8arr], {
+						type: mime
+					})));
+				});
+			},
+		}
+	}
+</script>
+
+<style>
+	.my-canvas {
+		display: flex;
+		position: fixed !important;
+		background: #000000;
+		left: 0;
+		z-index: 100000;
+		width: 100%;
+	}
+
+	.my-avatar {
+		width: 150upx;
+		height: 150upx;
+		border-radius: 100%;
+	}
+
+	.oper-canvas {
+		display: flex;
+		position: fixed !important;
+		left: 0;
+		z-index: 100001;
+		width: 100%;
+	}
+
+	.prv-canvas {
+		display: flex;
+		position: fixed !important;
+		background: #000000;
+		left: 0;
+		z-index: 200000;
+		width: 100%;
+	}
+
+	.oper-wrapper {
+		height: 50px;
+		position: fixed !important;
+		box-sizing: border-box;
+		border: 1px solid #F1F1F1;
+		background: #ffffff;
+		width: 100%;
+		left: 0;
+		bottom: 0;
+		z-index: 100009;
+		flex-direction: row;
+	}
+
+	.oper {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		padding: 10upx 20upx;
+		width: 100%;
+		height: 100%;
+		box-sizing: border-box;
+		align-self: center;
+	}
+
+	.btn-wrapper {
+		display: flex;
+		flex-direction: row;
+		/* #ifndef H5 */
+		flex-grow: 1;
+		/* #endif */
+		/* #ifdef H5 */
+		height: 50px;
+		/* #endif */
+		justify-content: space-between;
+	}
+
+	.btn-wrapper view {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 16px;
+		color: #333;
+		border: 1px solid #f1f1f1;
+		border-radius: 6%;
+	}
+
+	.hover {
+		background: #f1f1f1;
+		border-radius: 6%;
+	}
+
+	.clr-wrapper {
+		display: flex;
+		flex-direction: row;
+		flex-grow: 1;
+	}
+
+	.clr-wrapper view {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 16px;
+		color: #333;
+		border: 1px solid #f1f1f1;
+		border-radius: 6%;
+	}
+
+	.my-slider {
+		flex-grow: 1;
+	}
+</style>

+ 6 - 0
config.js

@@ -0,0 +1,6 @@
+export default {
+	web_name: "BRS", 
+	// uni_app_web_url: "http://mimall.lovemi.ren/", // h5域名PC域名,用于分享图片或者拼接图片时使用,结尾必须加 “/”
+	uni_app_web_api_url: "https://10.199.7.18:8883", // 请求接口的地址
+	debug: true
+}

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 47 - 0
main.js

@@ -0,0 +1,47 @@
+import App from './App'
+import * as http from './utils/http' // http请求接口
+import * as utils from './utils/utils' // 工具文件
+import storage from 'utils/storage' // 缓存文件
+import config from '@/config' // 配置
+import MD5 from 'js-md5'
+import * as msg from './utils/msg' // 工具文件
+import _ from 'lodash'
+// import * as scanCode from '@/components/utils/scanCode'
+// ********** devapi *********
+import { DEVAPI } from "@/components/utils/scanCode"
+let devAPI = new DEVAPI()
+devAPI.initDevAPI()
+// import lodash
+Vue.prototype.$storage = storage
+Vue.prototype.$http = http
+Vue.prototype.$config = config
+Vue.prototype.$utils = utils
+Vue.prototype.$msg = msg
+// Vue.prototype.$scanCode = scanCode
+Vue.prototype.$md5 = MD5
+Vue.prototype.$scanAudio = uni.createInnerAudioContext();
+Vue.prototype.$devapi = devAPI; // 设备api
+Vue.prototype._ = _
+
+// #ifndef VUE3
+import Vue from 'vue'
+
+
+
+
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 147 - 0
manifest.json

@@ -0,0 +1,147 @@
+{
+    "name" : "BRS",
+    "appid" : "__UNI__5D0FFCC",
+    "description" : "BRS",
+    "versionName" : "1.0.2",
+    "versionCode" : 102,
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "compatible" : {
+            "ignoreVersion" : true
+        },
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : false,
+            "waiting" : true,
+            "autoclose" : false,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {
+            "Barcode" : {},
+            "Camera" : {},
+            "VideoPlayer" : {},
+            "Record" : {},
+            "Webview-x5" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ],
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
+            },
+            /* ios打包配置 */
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* SDK配置 */
+            "sdkConfigs" : {
+                // "push" : {
+                //     "unipush" : null
+                // },
+                "ad" : {}
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            },
+            "splashscreen" : {
+                "androidStyle" : "default",
+                "android" : {
+                    "hdpi" : "C:/Users/chenjun/Documents/WeChat Files/june2593/FileStorage/File/2023-05/BRS导出(3)/BRS导出/bg.png",
+                    "xhdpi" : "C:/Users/chenjun/Documents/WeChat Files/june2593/FileStorage/File/2023-05/BRS导出(3)/BRS导出/bg.png",
+                    "xxhdpi" : "C:/Users/chenjun/Documents/WeChat Files/june2593/FileStorage/File/2023-05/BRS导出(3)/BRS导出/bg.png"
+                }
+            }
+        },
+        "nativePlugins" : {
+            "Lizii-uhfmagic-sdk" : {
+                "__plugin_info__" : {
+                    "name" : "Lizii-magic RFID 插件",
+                    "description" : "Lizii-uhfmagic RFID 插件",
+                    "platforms" : "Android",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {}
+                }
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "fallbackLocale" : "zh-Hans",
+    "locale" : "zh-Hans"
+}

BIN
nativeplugins/Lizii-uhfmagic-sdk/android/uhfmagicrf-android-release.aar


+ 28 - 0
nativeplugins/Lizii-uhfmagic-sdk/package.json

@@ -0,0 +1,28 @@
+{
+	"name": "Lizii-magic RFID 插件",  
+	"id": "Lizii-uhfmagic-sdk",  
+	"version": "1.0",  
+	"description": "Lizii-uhfmagic RFID 插件",  
+	"_dp_type":"nativeplugin",  
+	"_dp_nativeplugin":{ 
+		"android": {
+			"plugins": [  
+				{
+					"type": "module",  
+					"name": "Lizii-uhfmagic-sdk",
+				    "class": "cn.lizii.uhfmagicrf.UhfMagicModule"
+				}
+			],  
+			"hooksClass": "cn.lizii.uhfmagicrf.UHFMagicAppProxy",  
+			"integrateType": "aar",  
+			"dependencies": [
+			], 
+			"abis": [
+				"armeabi",
+				"armeabi-v7a",
+				"arm64-v8a"
+			],
+			"minSdkVersion": "19"
+		}
+	}
+}

+ 22 - 0
package.json

@@ -0,0 +1,22 @@
+{
+    "id": "dumenghanfeng-monitorScanCode",
+    "name": "PDA广播模式下监听扫描组件",
+    "version": "1.0.0",
+    "description": "改插件为基于uniAPP所开发的使用在PDA上面,对PDA扫描头部的监听,可以在PDA扫码后获取到对应的数据;该插件仅限于PDA扫描模式为广播模式;目前仅在安卓系统测试;使用的是重新加载组件的方式实现",
+    "keywords": [
+        "PDA,方便,快捷"
+    ],
+    "dcloudext": {
+        "category": [
+            "前端组件",
+            "通用组件"
+        ]
+    },
+    "devDependencies": {
+        "js-md5": "^0.7.3"
+    },
+    "dependencies": {
+        "image-tools": "^1.4.0",
+        "lodash": "^4.17.21"
+    }
+}

+ 174 - 0
pages.json

@@ -0,0 +1,174 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "首页"
+			}
+		},
+		{
+			"path": "pages/login/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/flightdetails/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/sorting/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/baggagecheck/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/mypage/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/myrecords/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/search/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/loadingdetails/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/help/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/individual/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/extract/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		}, {
+			"path": "pages/abnormal/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		}, {
+			"path": "pages/baggageEntry/index",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/locationEntry/index",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/detail/index",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/detailNode/index",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/message/message",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/express/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path" : "pages/express/info",
+			"style" : 
+			{
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path" : "pages/delisting/index",
+			"style" : 
+			{
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path" : "pages/delisting/info",
+			"style" : 
+			{
+				"navigationBarTitleText" : "",
+				"enablePullDownRefresh" : false
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8",
+		"navigationStyle": "custom"
+	},
+	"tabBar": {
+		"color": "#7A7E83",
+		"selectedColor": "#33A1A5",
+		"borderStyle": "black",
+		"fontSize": "14px",
+		"backgroundColor": "#ffffff",
+		"list": [{
+			"pagePath": "pages/index/index",
+			"text": "首页",
+			"iconPath": "static/ic_home_tabbar_default.png",
+			"selectedIconPath": "static/ic_home_tabbar_check.png"
+		}, {
+			"pagePath": "pages/message/message",
+			"text": "消息",
+			"iconPath": "static/ic_message_tabbar_default.png",
+			"selectedIconPath": "static/ic_message_tabbar_check.png"
+		}, {
+			"pagePath": "pages/mypage/index",
+			"text": "我的",
+			"iconPath": "static/ic_user_tabbar_default.png",
+			"selectedIconPath": "static/ic_user_tabbar_check.png"
+		}]
+	},
+	"uniIdRouter": {}
+}

+ 380 - 0
pages/abnormal/index.vue

@@ -0,0 +1,380 @@
+<template>
+	<view class="app-content">
+		<Navs :navname.sync="navname" @fall="fall"></Navs>
+		<img :src="icon" alt="" class="tuku">
+		<view class="scanning">
+			<view class="scanning_cds">
+				<input class="input"  v-model.trim="currentLuggageNum" disabled="true" @tap="baggageEntry" type="text"
+					placeholder-style="font-size:.8125rem;color:rgb(189, 214, 231);display:flex;justify-content: start;"
+					placeholder="请输入行李号" />
+				<view class="log_l"></view>
+				<uni-icons type="clear" size="30"  @tap="clear()" color="#fff"></uni-icons>
+			</view>
+		</view>
+		<view class="content">
+			<view class="content_bootom" style="top:0">
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view class="up" v-for="(item, index) in listdata" :key="index" @tap="toDetail(item.luggageNum)">
+						<view class="list">
+							<p>{{ item.luggageNum }}</p>
+						</view>
+						<view class="normal">
+							{{item.specialType!=null?specialTypeList[item.specialType]:" "}}
+						</view>
+						<view :class="item.exception_type != null?'error':'normal'">{{item.exception_type!=null?item.exception_name:"正常"}}</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Navs from '../../components/header/navs.vue'
+	export default {
+		data() {
+			return {
+				isShow: true,
+				navname: '异常行李',
+				icon: 'static/beijing.png',
+				action: true,
+				listdata:[],
+				exceptionList:[
+					{
+						"type":null,
+						"name":"非异常行李"
+					},
+					{
+						"type":"DPR",
+						"name":"破损"
+					},
+					{
+						"type":"AHL",
+						"name":"少收"
+					},
+					{
+						"type":"OHD",
+						"name":"多收"
+					}
+				],
+				exceptionNameList:["非异常行李","破损","少收","多收"],
+				airport:null,
+				currentLuggageNum:null,
+				specialTypeList:{
+					"AVIH":"装笼动物",
+					"CREW":"机组行李",
+					"RFAG":"易碎行李",
+					"HVY":"重型行李",
+					"PRIO":"优先行李",
+					"RUSH":"无人行李",
+					"SCON":"急转行李",
+					"SPEQ":"运动装备",
+					"VIP":"VIP行李",
+					"WCHR":"轮椅",
+					"WFAP":"武器枪支",
+					"SJ05":"到港行李破损",
+					"SJ34":"超大柜台接收",
+				}
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.airport = this.$storage.get("airportName")
+			this.getluggageList(this.airport)
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			if(this.airport){
+				this.getluggageList(this.airport)
+			}
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/baggagecheck/index?luggageNum="+data.msg
+					})
+				}
+			});
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {
+		},
+		computed: {
+		},
+		components: {
+			Navs,
+		},
+		methods: {
+			async getluggageList(airport){
+				let data = {
+					"serviceId": 3006,
+					
+					"dataContent": [{
+						"outAirport": airport
+					}],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					console.log(res)
+					if (res.code == "0") {
+						res.returnData.map(item => {
+							this.exceptionList.map(item2 => {
+								if(item.exception_type == item2.type){
+									item["exception_name"] = item2.name
+								}
+							})
+						})
+						this.listdata = res.returnData;
+					}
+	
+				})
+			},
+			toDetail(luggageNum){
+				this.currentLuggageNum = luggageNum;
+				uni.navigateTo({
+					url: "/pages/baggagecheck/index?luggageNum="+this.currentLuggageNum
+				})
+			},
+			async getluggage(n,t){
+				let data = {
+				    "serviceId": 3002,
+				    "page": 1,
+				    "pageSize": 1,
+				    "dataContent": {
+				        "luggageNum":n,//行李号
+				    },
+				    "event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if(res.code == "0"&&res.returnData.length>0){
+						uni.navigateTo({
+							url: "/pages/baggagecheck/index?luggageNum="+n
+						})
+					}
+					else{
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon:'none',
+							title: "未查询到"+this.currentLuggageNum+"行李信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			baggageEntry(){
+				uni.navigateTo({
+					url: "/pages/baggageEntry/index"
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta:1
+				})
+			},
+			clear(){
+				this.currentLuggageNum = null
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		background: rgb(49, 85, 99);
+		width: 100vw;
+		height: 100vh;
+		overflow: hidden;
+		>.tuku {
+			position: absolute;
+			z-index: -1;
+			width: 100%;
+			top: -250px;
+			let:20px;
+		}
+		>.scanning {
+			// height: 12rem;
+			padding: 0 1.5rem 0 1.5rem;
+			opacity: 1;
+			transition: all 3s;
+			.scanning_cds {
+				width: 100%;
+				height: 3rem;
+				opacity: 1;
+				transition: all 3s;
+				background: rgb(51, 161, 165);
+				margin-top: 1rem;
+				margin-bottom: .5rem;
+				border-radius: 4px;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+		
+				>.log {
+					width: .875rem;
+					height: .875rem;
+					background: url('../../static/saoma.png') no-repeat;
+					background-size: 100% 100%;
+					margin-left: 1rem;
+				}
+		
+				>.log_l {
+					width: .125rem;
+					height: 1.3125rem;
+					margin-left: 4rem;
+					margin-right: .7rem;
+					background: rgb(255, 255, 255);
+				}
+			}
+		}
+		>.content {
+			width: 100%;
+			height: calc(100vh - 7.5rem);
+			position: relative;
+			margin-top: 2.5rem;
+			// overflow: hidden;
+			// background: rgb(49, 85, 99);
+			>.content_top {
+				width: 100%;
+				// background: rgb(49, 85, 99);
+				padding-bottom: 1.3125rem;
+
+				>.craid {
+					// width: 100%;
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: space-between;
+					flex-wrap: wrap;
+					align-items: center;
+
+					>.craid_data {
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: start;
+
+						>p {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 18px;
+							font-weight: 700;
+						}
+
+						>span {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+						}
+					}
+
+					>.aircraft {
+						width: 1.75rem;
+						height: 1.75rem;
+						background: url('../../static/hang.png') no-repeat;
+						background-size: 100% 100%;
+					}
+				}
+			}
+
+			>.content_bootom {
+				width: 100%;
+				// height: calc(100vh - 20.9375rem - 4.375rem);
+				padding-bottom: 0;
+				position: absolute;
+				bottom: 0;
+				top: 20.75rem;
+				// border-radius: 6px 6px 0px 0px;
+				overflow: hidden;
+				background: rgb(255, 255, 255);
+				padding: 0 10px;
+				box-sizing: border-box;
+				.up {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-left: 1rem;
+					border-bottom: 1px solid rgb(238, 238, 238);
+				
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+					
+					>.error{
+						width: 60px;
+						color:red
+					}
+					>.normal{
+						width: 160px;
+						color:#4682b4 
+					}
+					>.list {
+						position: relative;
+						height: 3rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+				
+					>.delete {
+						width: 3.75rem;
+						height: 3.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: -3.75rem;
+						transform: all 3s;
+				
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+				
+				.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					height: calc(100% - 2.5rem - 2.75rem);
+				}
+
+				.but {
+					width: 20.5625rem;
+					height: 2.5rem;
+					background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+					border-radius: .25rem;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					margin: 0 auto;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-top: 0.25rem;
+					margin-bottom: 2.25rem;
+				}
+			}
+		}
+	}
+</style>

+ 128 - 0
pages/baggageEntry/index.vue

@@ -0,0 +1,128 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="fall"></view>{{ navname }}
+		</view>
+		<view class="searchInput">
+			<uni-easyinput class="uni-mt-5" :inputBorder='false' v-model="value" placeholder="请输入行李号"
+				@iconClick="iconClick"></uni-easyinput>
+		</view>
+		<button type="default" v-if="value==''" class="defaultBtn">保存并提交</button>
+		<button type="default" v-else class="sendBtn" @tap="send">保存并提交</button>
+		<!-- 提示信息和下拉弹窗 -->
+		<mask-model :headername="headername" :typeShow="typeShow" :tabname="tabname" ref="showMask" btnType="1"
+			@confirm="confirm" @cancel="cancel" titleColoe="#666666" cancelColor="#666666" confirmColor="#007AFF"
+			:maskTitle="maskTitle"></mask-model>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import maskModel from '../../components/mask-model/mask-model.vue'
+	export default {
+		data() {
+			return {
+				navname: '行李号录入',
+				value: "",
+				maskTitle: '请核对录入的行李号是否正确',
+				tabname: '', //按钮名称
+				typeShow: true,
+				headername: '请核对信息',
+			}
+		},
+		created(option) {},
+		onLoad() {},
+		onUnload() {},
+		onShow() {},
+		mounted() {},
+		components: {
+			Nav
+		},
+		methods: {
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			iconClick() {
+			},
+			send() {
+				this.typeShow = false
+				this.maskTitle = '请核对录入的行李号是否正确'
+				this.headername = '请核对信息'
+				this.$refs.showMask.show();
+			},
+			confirm: function(e) { //确定按钮
+				if(this.value.length>9){
+					let pages = getCurrentPages()
+					let prevPage = pages[pages.length - 2]
+					prevPage.$vm.getluggage(this.value,true)
+					prevPage.$vm.currentLuggageNum = this.value
+					uni.navigateBack({
+						delta: 1
+					})
+				}
+			},
+			cancel: function() { //取消按钮
+				console.log('您点击了取消按钮');
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+		}
+
+		>.searchInput {
+			width: calc(100% - 2rem);
+			margin-left: 1rem;
+			border-bottom: 1px solid rgb(224, 230, 238);
+			color: rgb(48, 51, 57);
+		}
+
+		>.defaultBtn {
+			width: calc(100% - 2rem);
+			margin-left: 1rem;
+			height: 44px;
+			top: 204px;
+			background: rgb(180, 191, 196);
+			color: rgb(255, 255, 255);
+			border-radius: 4px;
+			border: none;
+			top: 4rem;
+		}
+
+		>.sendBtn {
+			width: calc(100% - 2rem);
+			margin-left: 1rem;
+			height: 44px;
+			top: 204px;
+			background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+			color: rgb(255, 255, 255);
+			border-radius: 4px;
+			border: none;
+			top: 4rem;
+		}
+	}
+</style>

+ 536 - 0
pages/baggagecheck/index.vue

@@ -0,0 +1,536 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="fall"></view>{{ navname }}
+
+		</view>
+		<view class="craids" v-if="!luggageData">
+			<p>暂无行李信息</p>
+			<p>请扫描需要操作的行李牌条码</p>
+		</view>
+		<view class="content" v-if="luggageData">
+			<view class="list">
+				<p>行李编号</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.luggageNum" disabled="true"
+					value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);" placeholder="" />
+			</view>
+			<view class="list">
+				<p>航班信息</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.carrierFlights"
+					disabled="true" value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);"
+					placeholder="" />
+			</view>
+			<view class="list">
+				<p>航班日期</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.carrierFlightsDate"
+					disabled="true" value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);"
+					placeholder="" />
+			</view>
+			<view class="list">
+				<p>当前节点</p>
+				<picker @change="bindPickerChange1" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :value="index1"
+					:range-key="'nodeName'" :range="nodeList">
+					<view class="uni-input">{{nodeNameList[index1]}}</view>
+				</picker>
+			</view>
+			<view class="list">
+				<p>当前位置</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="luggageData.location_describe" type="text"
+					placeholder="操作位置" />
+				</uni-forms>
+			</view>
+			<view class="list">
+				<p>当前状态</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="luggageData.currentResult" type="text"
+					placeholder="当前状态" />
+			</view>
+			<view class="list">
+				<p>异常类型</p>
+				<picker @change="bindPickerChange" style="line-height: 2.375rem;background-color: antiquewhite;" :value="index" :range-key="'name'" :range="exceptionList">
+					<view class="uni-input">{{exceptionList[index].type?exceptionList[index].name:"无"}}</view>
+				</picker>
+			</view>
+			<view class="picturearea">
+				
+				<view class="name">图片上传</view>
+				<mk-upload :imgList="imgList" @onDelete="onDelete" @onChoose="onChoose" />
+			</view>
+		</view>
+		<view class="up" v-if="luggageData" @tap="sendData()">提交</view>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import mkUpload from "@/components/mk-upload/mk-upload.vue"
+	import {
+		translateapp
+	} from "@/utils/compress.js"
+	import {
+		pathToBase64,
+		base64ToPath
+	} from 'image-tools'
+	export default {
+		data() {
+			return {
+				placeholderStyle: "color:000;",
+				style: {
+					disableColor: "#fff",
+					color: "#000"
+				},
+				isShow: true,
+				dataheight: '20.75rem',
+				scrollTop: 0,
+				old: {
+					scrollTop: 0
+				},
+				input: '',
+				main: null,
+				poll: null,
+				filter: null,
+				pusher: null,
+				intentServer: null,
+				arr: [],
+				navname: '异常行李登记',
+				imgList: [],
+				ImgObjList: [],
+				luggageNum: null,
+				luggageData: null,
+				index: 0,
+				index1: 0,
+				exceptionList: [{
+						"type": null,
+						"name": "非异常行李"
+					},
+					{
+						"type": "DPR",
+						"name": "破损"
+					},
+					{
+						"type": "AHL",
+						"name": "少收"
+					},
+					{
+						"type": "OHD",
+						"name": "多收"
+					}
+				],
+				exceptionNameList: ["非异常行李", "破损", "少收", "多收"],
+				nodeList: [],
+				nodeNameList: [],
+				isGet:true
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.luggageNum = option.luggageNum;
+			this.getNode()
+			if (this.luggageNum.length > 9) {
+				this.getDetial(this.luggageNum)
+			}
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			uni.$off("scancodemsg");
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					this.luggageNum = data.msg.trim()
+					if (this.luggageNum.length > 9) {
+						if(this.isGet==true){
+							this.getDetial(this.luggageNum);
+							this.isGet = false;
+							setTimeout(function(){
+								this.isGet = true;
+							},500)
+						}
+					}
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: "请扫描规范条码",
+						duration: 5000
+					});
+				}
+			})
+
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {},
+		components: {
+			Nav,
+			mkUpload
+		},
+		methods: {
+			async getNode() {
+				let data = {
+					"serviceId": 3003,
+					"dataContent": {},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.nodeList = res.returnData;
+						this.nodeList.map(item => {
+							this.nodeNameList.push(item.nodeName)
+						})
+					}
+				})
+			},
+			async getDetial(num) {
+				let data = {
+					"serviceId": 3002,
+					"page": 1,
+					"pageSize": 1,
+					"dataContent": {
+						"luggageNum": num, //行李号
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length > 0) {
+						this.luggageData = res.returnData[0]
+						this.getImgList()
+						this.nodeList.map((item, index) => {
+							if (res.returnData[0].nodeCode == item.nodeCode) {
+								this.index1 = index
+								if(!this.luggageData.location_describe){
+									this.luggageData.location_describe = item.nodeDescribe
+								}
+							}
+						})
+						this.exceptionList.map((item, index) => {
+							if (res.returnData[0].exception_type == item.type) {
+								this.index = index
+							}
+						})
+					} else {
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "未查询到该行李信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			bindPickerChange(e) {
+				this.index = e.detail.value
+				this.luggageData.exception_type = this.exceptionList[this.index].type;
+			},
+			bindPickerChange1(e) {
+				this.index1 = e.detail.value
+				this.luggageData.nodeCode = this.nodeList[this.index1].nodeCode;
+				this.luggageData.location_describe = this.nodeList[this.index1].nodeDescribe;
+			},
+			async sendData() {
+				this.luggageData.sourceAirport = this.$storage.get('airportName');
+				this.luggageData.ID = null;
+				this.luggageData.dataType = "BPM";
+				this.luggageData.agentNumber = this.$storage.getJson("users").user_name;
+				this.luggageData.device_ID = uni.getDeviceInfo().deviceId;
+				let data = {
+					"serviceId": 3005,
+					"dataContent": [
+						this.luggageData
+					],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						uni.showToast({
+							icon: 'none',
+							title: "操作成功",
+							duration: 5000
+						});
+					} else {
+						this.$scanAudio.src = "../../static/czsb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "操作失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			async sendImg(upImgList) {
+				let data = {
+					"serviceId": 30051,
+					"dataContent": upImgList,
+					"event": "1"
+				}
+				await this.$http.httpPost('/openApi/newdata', data).then(res => {
+					if (res.code == "0") {
+						uni.hideLoading();
+						this.getImgList()
+						uni.showToast({
+							icon: 'none',
+							title: "上传成功",
+							duration: 5000
+						});
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "上传失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async getImgList() {
+				let data = {
+					"serviceId": 30051,
+					"page": 1,
+					"pageSize": 999,
+					"dataContent": {
+						"carrflights": this.luggageData.carrierFlights,
+						"carrierFlightsDate": this.luggageData.carrierFlightsDate,
+						"luggageNum": this.luggageData.luggageNum
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.imgList = [];
+						this.ImgObjList = res.returnData;
+						res.returnData.map(item => {
+							if (item.luggagePic) {
+								this.imgList.push(item.luggagePic);
+							}
+						})
+
+					} else {
+						this.imgList = [];
+						uni.showToast({
+							icon: 'none',
+							title: "获取图片失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async deleteImg(index) {
+				let data = {
+					"serviceId": 30051,
+					"dataContent": [{
+						"filter": [{
+							"left": "(",
+							"column": "id",
+							"comparator": "=",
+							"value": this.ImgObjList[index].id, 
+							"right": ")",
+							"connector": "and"
+						}]
+					}],
+					"event": "3"
+				}
+				await this.$http.httpPost('/openApi/movedata', data).then(res => {
+					if (res.code == "0") {
+						this.getImgList()
+						wx.showToast({
+							title: '删除成功',
+							icon: 'success',
+							duration: 3000
+						});
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "删除图片失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			onDelete(index) {
+				console.log(index)
+				//删除成功回调后执行 只做演示
+				uni.showLoading({
+					title: '删除中'
+				});
+				this.deleteImg(index)
+			},
+			onChoose(e) {
+				console.log(e)
+				uni.showLoading({
+					title: '上传中'
+				});
+				// let upImgList = []
+				// this.newImgList = []
+				e.tempFilePaths.map(item => {
+					translateapp(item, 70, imgUrl => {
+						pathToBase64(imgUrl).then(path => {
+							let upImgList = []
+							let newData = {
+								"carrflights": this.luggageData.carrierFlights,
+								"carrierFlightsDate": this.luggageData.carrierFlightsDate,
+								"luggageNum": this.luggageData.luggageNum,
+								"luggagePic": path,
+								"piclocation":this.luggageData.location_describe
+							}
+							// this.newImgList.push(path)
+							upImgList.push(newData)
+							this.sendImg(upImgList)
+							// upImgList.push(newData)
+						}).catch(error => {
+							uni.hideLoading();
+						})
+					})
+				})
+			},
+			onPreviewTake(index) {
+				console.log(index)
+				wx.showActionSheet({
+					itemList: ['预览图片', '删除图片'],
+					success(res) {
+						console.log(res.tapIndex)
+					},
+					fail(res) {
+						console.log(res.errMsg)
+					}
+				})
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		>.up {
+			position: fixed;
+			bottom: 10px;
+			left: calc((100% - 20.5625rem) / 2);
+			width: 20.5625rem;
+			height: 3rem;
+			background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+			border-radius: .25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			margin: 0 auto;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+
+		}
+
+		>.craids {
+			margin-top: 10rem;
+			height: 5.625rem;
+			padding: 0 2.5625rem 0 2.5625rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			>p {
+				color: rgb(75, 84, 91);
+				font-family: Noto Sans SC;
+				font-size: 13px;
+				font-weight: 500;
+			}
+		}
+
+		>.content {
+			margin-left: 1.5rem;
+			height: calc(100vh - 8rem);
+			overflow-x: hidden;
+			overflow-y: auto;
+
+			>.list {
+				height: 3.375rem;
+				display: flex;
+				align-items: center;
+				border-bottom: 1px solid rgb(238, 238, 238);
+				.uni-input {
+							width: 240px;
+							padding-left: 10px;
+						}
+				>p {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-right: 2.1875rem;
+				}
+
+				>.listup {
+					width: .25rem;
+					height: .5rem;
+					background: url('../../static/icos.png') no-repeat;
+					background-size: 100% 100%;
+					position: absolute;
+					right: 1.5rem;
+				}
+			}
+
+			>.picturearea {
+				margin-top: 1.875rem;
+
+				>.name {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-bottom: 1.25rem;
+				}
+
+				>.content_list {
+					width: 100%;
+					display: flex;
+					margin-top: 1.25rem;
+
+					>.mg {
+						width: 5.5rem;
+						height: 5.5rem;
+						background: rgb(197, 207, 211);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						margin-right: .625rem;
+
+						>.mg_lg {
+							width: 1.75rem;
+							height: 1.75rem;
+							background: url('../../static/shi.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 315 - 0
pages/delisting/index.vue

@@ -0,0 +1,315 @@
+<template>
+	<view class="app-content">
+		<Navs :navname.sync="navname" @fall="fall"></Navs>
+		<img :src="icon" alt="" class="tuku">
+		<view class="content">
+			<view class="content_bootom" style="top:0">
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view class="up" v-for="(item, index) in listdata" :key="index" @tap="toDetail(item.ID)">
+						<view class="list">
+							<p>{{ item.location_descride }}</p>
+						</view>
+						<view class="list">
+							{{item.processing_time}}
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+		<view class="up" @tap="toPage">录入</view>
+	</view>
+</template>
+
+<script>
+	import Navs from '../../components/header/navs.vue'
+	export default {
+		data() {
+			return {
+				current:0,
+				isShow: true,
+				navname: '脱牌行李',
+				icon: 'static/beijing.png',
+				action: true,
+				listdata: [],
+				airport: null,
+				currentLuggageNum: null,
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.airport = this.$storage.get("airportName")
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			if (this.airport) {
+				this.getluggageList(this.airport)
+			}
+		},
+		onHide() {
+		},
+		mounted() {},
+		computed: {},
+		components: {
+			Navs,
+		},
+		methods: {
+
+			async getluggageList(airport) {
+				console.log(this.$storage.getJson("users"))
+				let data = {
+					"serviceId": 3013,
+					"dataContent": [{
+						"agentNumber": this.$storage.getJson("users").user_name
+					}],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.listdata = res.returnData;
+					}
+				})
+			},
+			toDetail(luggageNum){
+				uni.navigateTo({
+					url: "/pages/delisting/info?id="+luggageNum
+				})
+			},
+			toPage() {
+				uni.navigateTo({
+					url: "/pages/delisting/info"
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			clear() {
+				this.currentLuggageNum = null
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		background: rgb(49, 85, 99);
+		width: 100vw;
+		height: 100vh;
+		overflow: hidden;
+		>.up {
+			position: fixed;
+			bottom: 10px;
+			left: calc((100% - 20.5625rem) / 2);
+			width: 20.5625rem;
+			height: 3rem;
+			background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+			border-radius: .25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			margin: 0 auto;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+		>.tuku {
+			position: absolute;
+			z-index: -1;
+			width: 100%;
+			top: -250px;
+			let: 20px;
+		}
+
+		>.scanning {
+			// height: 12rem;
+			padding: 0 1.5rem 0 1.5rem;
+			opacity: 1;
+			transition: all 3s;
+
+			.scanning_cds {
+				width: 100%;
+				height: 3rem;
+				opacity: 1;
+				transition: all 3s;
+				background: rgb(51, 161, 165);
+				margin-top: 1rem;
+				margin-bottom: .5rem;
+				border-radius: 4px;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+
+				>.log {
+					width: .875rem;
+					height: .875rem;
+					background: url('../../static/saoma.png') no-repeat;
+					background-size: 100% 100%;
+					margin-left: 1rem;
+				}
+
+				>.log_l {
+					width: .125rem;
+					height: 1.3125rem;
+					margin-left: 4rem;
+					margin-right: .7rem;
+					background: rgb(255, 255, 255);
+				}
+			}
+		}
+
+		>.content {
+			width: 100%;
+			height: calc(100vh - 8rem);
+			position: relative;
+			margin-top: .5rem;
+
+			// overflow: hidden;
+			// background: rgb(49, 85, 99);
+			>.content_top {
+				width: 100%;
+				// background: rgb(49, 85, 99);
+				padding-bottom: 1.3125rem;
+
+				>.craid {
+					// width: 100%;
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: space-between;
+					flex-wrap: wrap;
+					align-items: center;
+
+					>.craid_data {
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: start;
+
+						>p {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 18px;
+							font-weight: 700;
+						}
+
+						>span {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+						}
+					}
+
+					>.aircraft {
+						width: 1.75rem;
+						height: 1.75rem;
+						background: url('../../static/hang.png') no-repeat;
+						background-size: 100% 100%;
+					}
+				}
+			}
+
+			>.content_bootom {
+				width: 100%;
+				// height: calc(100vh - 20.9375rem - 4.375rem);
+				padding-bottom: 0;
+				position: absolute;
+				bottom: 0;
+				top: 10.75rem;
+				// border-radius: 6px 6px 0px 0px;
+				overflow: hidden;
+				background: rgb(255, 255, 255);
+				padding: 0 10px;
+				box-sizing: border-box;
+				
+				.up {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					padding: 0 5px;
+					border-bottom: 1px solid rgb(238, 238, 238);
+					box-sizing: border-box;
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					>.error {
+						width: 60px;
+						color: red
+					}
+
+					>.normal {
+						width: 160px;
+						color: #4682b4
+					}
+
+					>.list {
+						position: relative;
+						height: 3rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+
+					>.delete {
+						width: 3.75rem;
+						height: 3.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: -3.75rem;
+						transform: all 3s;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+
+				.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					height: calc(100% - 2rem);
+					margin-top: 10px;
+				}
+
+				.but {
+					width: 20.5625rem;
+					height: 2.5rem;
+					background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+					border-radius: .25rem;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					margin: 0 auto;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-top: 0.25rem;
+					margin-bottom: 2.25rem;
+				}
+			}
+		}
+	}
+</style>

+ 419 - 0
pages/delisting/info.vue

@@ -0,0 +1,419 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="fall"></view>{{ navname }}
+
+		</view>
+		<view class="content">
+			<view class="list">
+				<p>操作位置</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="location_code" type="text"
+					placeholder="操作位置" />
+				</uni-forms>
+			</view>
+			<view class="list">
+				<p>操作描述</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="location_descride" type="text"
+					placeholder="操作描述" />
+			</view>
+			<view class="picturearea">
+				<view class="name">图片上传</view>
+				<mk-upload :imgList="imgList" @onDelete="onDelete" @onChoose="onChoose" />
+			</view>
+		</view>
+		<view class="up" @tap="sendData()">提交</view>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import mkUpload from "@/components/mk-upload/mk-upload.vue"
+	import {
+		translateapp
+	} from "@/utils/compress.js"
+	import {
+		pathToBase64,
+		base64ToPath
+	} from 'image-tools'
+	export default {
+		data() {
+			return {
+				placeholderStyle: "color:000;",
+				style: {
+					disableColor: "#fff",
+					color: "#000"
+				},
+				isShow: true,
+				dataheight: '20.75rem',
+				scrollTop: 0,
+				old: {
+					scrollTop: 0
+				},
+				input: '',
+				main: null,
+				poll: null,
+				filter: null,
+				pusher: null,
+				intentServer: null,
+				arr: [],
+				navname: '脱牌行李登记',
+				imgList: [],
+				ImgObjList: [],
+				luggageNum: null,
+				luggageData: {},
+				index: 0,
+				index1: 0,
+				isGet:true,
+				location_descride:"",
+				location_code:"",
+				picPath:""
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			console.log(option)
+			this.luggageNum = option.id
+			if(this.luggageNum){
+				this.getData()
+			}
+		},
+		onUnload() {
+		},
+		onShow() {
+		},
+		onHide() {
+		},
+		mounted() {},
+		components: {
+			Nav,
+			mkUpload
+		},
+		methods: {
+			async getData(){
+				let data = {
+					"serviceId": 3011,
+					"page": 1,
+					"pageSize": 999,
+					"dataContent": {
+						"ID": this.luggageNum,
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.location_code = res.returnData[0].location_code
+						this.location_descride = res.returnData[0].location_descride
+						this.imgList = [res.returnData[0].picture]
+						this.picPath = res.returnData[0].picture
+				
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "获取信息失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async sendData() {
+				// this.luggageData.ID = null;
+				this.luggageData["agentNumber"] = this.$storage.getJson("users").user_name;
+				// this.luggageData["agentNumber"] ="syq";
+				this.luggageData["device_ID"] = uni.getDeviceInfo().deviceId;
+				this.luggageData["secondary_code"]="H";
+				this.luggageData["location_code"]=this.location_code;
+				this.luggageData["location_descride"]=this.location_descride;
+				this.luggageData["picture"]=this.picPath;
+				let data = {
+					"serviceId": 3011,
+					"dataContent": [
+						{
+							"Value":this.luggageData
+						}
+					],
+					"event": "1"
+				}
+				await this.$http.httpPost('/openApi/newdata', data).then(res => {
+					if (res.code == "0") {
+						uni.showToast({
+							icon: 'none',
+							title: "操作成功",
+							duration: 5000
+						});
+					} else {
+						this.$scanAudio.src = "../../static/czsb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "操作失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			async sendImg(upImgList) {
+				let data = {
+					"serviceId": 30051,
+					"dataContent": upImgList,
+					"event": "1"
+				}
+				await this.$http.httpPost('/openApi/newdata', data).then(res => {
+					if (res.code == "0") {
+						uni.hideLoading();
+						this.getImgList()
+						uni.showToast({
+							icon: 'none',
+							title: "上传成功",
+							duration: 5000
+						});
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "上传失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async getImgList() {
+				let data = {
+					"serviceId": 30051,
+					"page": 1,
+					"pageSize": 999,
+					"dataContent": {
+						"carrflights": this.luggageData.carrierFlights,
+						"carrierFlightsDate": this.luggageData.carrierFlightsDate,
+						"luggageNum": this.luggageData.luggageNum
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.imgList = [];
+						this.ImgObjList = res.returnData;
+						res.returnData.map(item => {
+							if (item.luggagePic) {
+								this.imgList.push(item.luggagePic);
+							}
+						})
+
+					} else {
+						this.imgList = [];
+						uni.showToast({
+							icon: 'none',
+							title: "获取图片失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async deleteImg(index) {
+				let data = {
+					"serviceId": 30051,
+					"dataContent": [{
+						"filter": [{
+							"left": "(",
+							"column": "id",
+							"comparator": "=",
+							"value": this.ImgObjList[index].id, 
+							"right": ")",
+							"connector": "and"
+						}]
+					}],
+					"event": "3"
+				}
+				await this.$http.httpPost('/openApi/movedata', data).then(res => {
+					if (res.code == "0") {
+						this.getImgList()
+						wx.showToast({
+							title: '删除成功',
+							icon: 'success',
+							duration: 3000
+						});
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "删除图片失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			onDelete(index) {
+				console.log(index)
+				//删除成功回调后执行 只做演示
+				uni.showLoading({
+					title: '删除中'
+				});
+				this.deleteImg(index)
+			},
+			onChoose(e) {
+				console.log(e)
+				uni.showLoading({
+					title: '上传中'
+				});
+				// let upImgList = []
+				// this.newImgList = []
+				e.tempFilePaths.map(item => {
+					translateapp(item, 70, imgUrl => {
+						pathToBase64(imgUrl).then(path => {
+							this.imgList=[path];
+							this.picPath = path;
+						}).catch(error => {
+							uni.hideLoading();
+						})
+					})
+				})
+			},
+			onPreviewTake(index) {
+				console.log(index)
+				wx.showActionSheet({
+					itemList: ['预览图片', '删除图片'],
+					success(res) {
+						console.log(res.tapIndex)
+					},
+					fail(res) {
+						console.log(res.errMsg)
+					}
+				})
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		>.up {
+			position: fixed;
+			bottom: 10px;
+			left: calc((100% - 20.5625rem) / 2);
+			width: 20.5625rem;
+			height: 3rem;
+			background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+			border-radius: .25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			margin: 0 auto;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+
+		}
+
+		>.craids {
+			margin-top: 10rem;
+			height: 5.625rem;
+			padding: 0 2.5625rem 0 2.5625rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			>p {
+				color: rgb(75, 84, 91);
+				font-family: Noto Sans SC;
+				font-size: 13px;
+				font-weight: 500;
+			}
+		}
+
+		>.content {
+			margin-left: 1.5rem;
+			height: calc(100vh - 8rem);
+			overflow-x: hidden;
+			overflow-y: auto;
+
+			>.list {
+				height: 3.375rem;
+				display: flex;
+				align-items: center;
+				border-bottom: 1px solid rgb(238, 238, 238);
+				.uni-input {
+							width: 240px;
+							padding-left: 10px;
+						}
+				>p {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-right: 2.1875rem;
+				}
+
+				>.listup {
+					width: .25rem;
+					height: .5rem;
+					background: url('../../static/icos.png') no-repeat;
+					background-size: 100% 100%;
+					position: absolute;
+					right: 1.5rem;
+				}
+			}
+
+			>.picturearea {
+				margin-top: 1.875rem;
+
+				>.name {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-bottom: 1.25rem;
+				}
+
+				>.content_list {
+					width: 100%;
+					display: flex;
+					margin-top: 1.25rem;
+
+					>.mg {
+						width: 5.5rem;
+						height: 5.5rem;
+						background: rgb(197, 207, 211);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						margin-right: .625rem;
+
+						>.mg_lg {
+							width: 1.75rem;
+							height: 1.75rem;
+							background: url('../../static/shi.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 771 - 0
pages/detail/index.vue

@@ -0,0 +1,771 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="fall"></view>
+		</view>
+		<!--    <view class="nav">
+      <view :class="action === index ? 'nav_lists': 'nav_list'" v-for="(item, index) in list" :key="index" @tap="lop(index)">{{item.name}}</view>
+    </view> -->
+		<uni-swiper-dot :info="imgList" :current="current" field="content" :mode="mode">
+			<swiper class="swiper-box" @change="change" style="height:11rem">
+				<swiper-item v-for="(item ,index) in imgList" :key="index" @tap="openImg(index)">
+					<view class="swiper-item">
+						<image style="width:100%" :src="item" mode="scaleToFill"></image>
+					</view>
+				</swiper-item>
+			</swiper>
+		</uni-swiper-dot>
+		<view class="content" :style="{top:dataheight}">
+			<uni-section title="行李详情" type="line"></uni-section>
+			<view class="choice" @touchmove="movetran" v-if="luggageData">
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view class="list">
+						<view class="lable">航班号</view>
+						<span>{{luggageData.carrierFlights}}</span>
+						<button class="nodeList" @tap="toNode()">路径详情</button>
+					</view>
+					<view class="list">
+						<view class="lable">航班日期</view>
+						<span>{{luggageData.carrierFlightsDate}}</span>
+					</view>
+					<view class="list">
+						<view class="lable">行李牌号</view>
+						<span>{{luggageData.luggageNum}}</span>
+					</view>
+					<view class="list">
+						<view class="lable">操作时间</view>
+						<span>{{luggageData.processing_time}}</span>
+					</view>
+					<view class="list">
+						<view class="lable">操作人</view>
+						<span>{{luggageData.agentNumber}}</span>
+					</view>
+					<view class="list">
+						<view class="lable">操作节点</view>
+						<picker @change="bindPickerChange" style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :value="index" :range-key="'nodeName'"
+							:range="nodeList">
+							<view class="uni-input">{{nodeNameList[index]}}</view>
+						</picker>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">操作位置</view>
+						<uni-easyinput :inputBorder="false"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :clearable="false" :styles="style" :disabled="false"
+							v-model="luggageData.location_describe" type="text" placeholder="操作位置" />
+						</uni-forms>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+
+					<view class="list">
+						<view class="lable">发往节点</view>
+						<picker @change="bindPickerChange2"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :value="index2" :range-key="'nodeName'"
+							:range="nodeList">
+							<view class="uni-input">{{nodeNameList[index2]}}</view>
+						</picker>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">发往位置</view>
+						<uni-easyinput :inputBorder="false"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :clearable="false" :styles="style" :disabled="false"
+							v-model="luggageData.to_location_describe" type="text" placeholder="发往位置" />
+						</uni-forms>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">特殊行李类型</view>
+						<picker @change="bindPickerChange3"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :value="index3" :range-key="'specialTypeName'"
+							:range="specialTypeList">
+							<view class="uni-input">
+								{{specialTypeList[index3].specialType?specialTypeList[index3].specialTypeName:"无"}}
+							</view>
+						</picker>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+
+					<view class="list">
+						<view class="lable">异常类型</view>
+						<picker @change="bindPickerChange4"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :value="index4" :range-key="'name'"
+							:range="exceptionList">
+							<view class="uni-input">{{exceptionList[index4].type?exceptionList[index4].name:"无"}}</view>
+						</picker>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">非正常状态码</view>
+						<picker @change="bindPickerChange5"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :value="index5" :range-key="'name'"
+							:range="abnormalList">
+							<view class="uni-input">{{abnormalList[index5].type?abnormalList[index5].name:"无"}}</view>
+						</picker>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">装载序号</view>
+						<uni-easyinput :inputBorder="false"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :clearable="false" :styles="style" :disabled="false"
+							v-model="luggageData.loadNumber" type="text" placeholder="装载序号" />
+						</uni-forms>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">容器编号</view>
+						<uni-easyinput :inputBorder="false"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :clearable="false" :styles="style" :disabled="false"
+							v-model="luggageData.container_ID" type="text" placeholder="容器编号" />
+						</uni-forms>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<view class="list">
+						<view class="lable">备注</view>
+						<uni-easyinput :inputBorder="false"
+							style="line-height: 2.375rem;background-color: antiquewhite;"
+							:placeholderStyle="placeholderStyle" :clearable="false" :styles="style" :disabled="false"
+							v-model="luggageData.luggage_describe" type="text" placeholder="备注" />
+						</uni-forms>
+						<!-- <view class="listup"><uni-icons type="gear" size="25"></uni-icons></view> -->
+					</view>
+					<mk-upload :imgList="imgList" @onDelete="onDelete" @onChoose="onChoose" />
+				</scroll-view>
+			</view>
+
+		</view>
+		<button type="primary" class="send" size="small" v-if="luggageData" @tap="sendData()">提交</button>
+		<luanqing-date-picker ref="datePickerObj" :isSimple="mode === 'simple'" :isMultiple="mode === 'multiple'"
+			@finishSelectDate="finishSelectDate" :defaultCheckedList="['2023-03-28','2023-09-25']">
+		</luanqing-date-picker>
+		<uv-datetime-picker :show="show" v-model="value1" mode="datetime" @confirm='confirm'
+			@close='show = false'></uv-datetime-picker>
+	</view>
+</template>
+<script>
+	import mkUpload from "@/components/mk-upload/mk-upload.vue"
+	import {
+		translateapp
+	} from "@/utils/compress.js"
+	import {
+		pathToBase64,
+		base64ToPath
+	} from 'image-tools'
+	export default {
+		data() {
+			return {
+				imgList: [],
+				ImgObjList: [],
+				placeholderStyle: "color:000",
+				style: {
+					disableColor: "#fff",
+					color: "#000"
+				},
+				dataheight: '10.75rem',
+				datatime: '2023-06-02',
+				datacontime: '',
+				luggageData: null,
+				luggageDataOld: null,
+				current: 0,
+				mode: 'round',
+				show: false,
+				value1: Number(new Date()),
+				formatter: 'yy',
+				index: 0,
+				index2: 0,
+				index3: 0,
+				index4: 0,
+				index5: 0,
+				nodeList: [],
+				nodeNameList: [],
+				nextNode: null,
+				luggageNum: null,
+				specialTypeList: [],
+				specialTypeNameList: [],
+				exceptionList: [{
+						"type": null,
+						"name": "非异常行李"
+					},
+					{
+						"type": "DPR",
+						"name": "破损"
+					},
+					{
+						"type": "AHL",
+						"name": "少收"
+					},
+					{
+						"type": "OHD",
+						"name": "多收"
+					}
+				],
+				exceptionNameList: ["非异常行李", "破损", "少收", "多收"],
+				abnormalList: [{
+						"type": null,
+						"name": "无"
+					},
+					{
+						"type": "NAL",
+						"name": "未授权装载"
+					},
+					{
+						"type": "OFF",
+						"name": "已卸载"
+					},
+					{
+						"type": "PFF",
+						"name": "预卸载"
+					},
+					{
+						"type": "UNS",
+						"name": "未找到"
+					},
+					{
+						"type": "OND",
+						"name": "在场未装载,未授权"
+					},
+					{
+						"type": "ONA",
+						"name": "在场未装载,已授权"
+					}
+				],
+				abnormalNameList: ["无", "未被授权的装载", "已卸载", "未找到", "在场未装载,未被授权", "在场未装载,已授权"],
+				isShow: true,
+				sourceData: null
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.luggageNum = option.luggageNum
+			this.getNode()
+			this.getSpecialTypeList()
+			this.getDetial(this.luggageNum)
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.trim().length > 9) {
+					this.luggageNum = data.msg.trim()
+					this.getDetial(this.luggageNum)
+				}
+				if (data.msg.trim().length < 9) {
+					this.luggageData.container_ID = data.msg.trim()
+				}
+			});
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		components: {
+			mkUpload
+		},
+		methods: {
+			async getNode() {
+				let data = {
+					"serviceId": 3003,
+					"dataContent": {},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.nodeList = res.returnData;
+						this.nodeList.map(item => {
+							this.nodeNameList.push(item.nodeName)
+						})
+					}
+				})
+			},
+			async getSpecialTypeList() {
+				let data = {
+					"serviceId": 16,
+					"dataContent": {},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.specialTypeList = res.returnData;
+						this.specialTypeList.unshift({
+							"specialType": null,
+							"specialTypeName": "非特殊行李",
+						})
+						this.specialTypeList.map(item => {
+							this.specialTypeNameList.push(item.specialTypeName)
+						})
+					}
+				})
+			},
+			async getDetial(num) {
+				let data = {
+					"serviceId": 3002,
+					"page": 1,
+					"pageSize": 1,
+					"dataContent": {
+						"luggageNum": num, //行李号
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					this.luggageData = null
+					if (res.code == "0" && res.returnData.length > 0) {
+						this.luggageData = res.returnData[0]
+						this.getImgList()
+						this.luggageDataOld = JSON.parse(JSON.stringify(res.returnData[0]))
+						this.nodeList.map((item, index) => {
+							if (res.returnData[0].nodeCode == item.nodeCode) {
+								this.index = index
+								this.index2 = index + 1
+								if(!this.luggageData.location_describe){
+									this.luggageData.location_describe = item.nodeDescribe
+								}
+							}
+						})
+						this.specialTypeList.map((item, index) => {
+							if (res.returnData[0].specialType == item.specialType) {
+								this.index3 = index
+							}
+						})
+						this.exceptionList.map((item, index) => {
+							if (res.returnData[0].exception_type == item.type) {
+								this.index4 = index
+							}
+						})
+						this.abnormalList.map((item, index) => {
+							if (res.returnData[0].abnormalState == item.type) {
+								this.index5 = index
+							}
+						})
+					} else {
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						this.imgList = []
+						uni.showToast({
+							icon: 'none',
+							title: "未查询到该行李信息",
+							duration: 5000
+						});
+						this.fall()
+					}
+				})
+			},
+			async sendData() {
+				this.luggageData.sourceAirport = this.$storage.get('airportName');
+				this.luggageData.ID = null;
+				this.luggageData.dataType = "BPM";
+				this.luggageData.agentNumber = this.$storage.getJson("users").user_name;
+				this.luggageData.device_ID = uni.getDeviceInfo().deviceId;
+				let data = {
+					"serviceId": 3005,
+					"dataContent": [
+						this.luggageData
+					],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						uni.showToast({
+							icon: 'none',
+							title: "操作成功",
+							duration: 5000
+						});
+					} else {
+						this.$scanAudio.src = "../../static/czsb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "操作失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			bindPickerChange(e) {
+				this.index = e.detail.value
+				this.luggageData.nodeCode = this.nodeList[this.index].nodeCode;
+				this.luggageData.location_describe = this.nodeList[this.index].nodeDescribe;
+				this.index2 = this.index + 1
+				this.luggageData.to_location_describe = this.nodeList[this.index2].nodeDescribe;
+			},
+			bindPickerChange2(e) {
+				this.index2 = e.detail.value
+				this.luggageData.to_location_describe = this.nodeList[this.index2].nodeDescribe;
+			},
+			bindPickerChange3(e) {
+				this.index3 = e.detail.value
+				this.luggageData.specialType = this.specialTypeList[this.index3].specialType;
+			},
+			bindPickerChange4(e) {
+				this.index4 = e.detail.value
+				this.luggageData.exception_type = this.exceptionList[this.index4].type;
+			},
+			bindPickerChange5(e) {
+				this.index5 = e.detail.value
+				this.luggageData.abnormalState = this.abnormalList[this.index5].type;
+			},
+			confirm(e) {
+				this.show = false
+				console.log(e.value)
+				let timestamp = e.value
+				// 此处时间戳以毫秒为单位
+				let date = new Date(parseInt(timestamp));
+				let Year = date.getFullYear();
+				let Moth = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
+				let Day = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
+				let Hour = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours());
+				let Minute = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
+				let Sechond = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
+				let GMT = Year + '-' + Moth + '-' + Day + '   ' + Hour + ':' + Minute
+				this.datacontime = GMT
+			},
+
+			async sendImg(upImgList) {
+				let data = {
+					"serviceId": 30051,
+					"dataContent": upImgList,
+					"event": "1"
+				}
+				await this.$http.httpPost('/openApi/newdata', data).then(res => {
+					if (res.code == "0") {
+						uni.hideLoading();
+						this.getImgList()
+						uni.showToast({
+							icon: 'none',
+							title: "上传成功",
+							duration: 5000
+						});
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "上传失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async getImgList() {
+				let data = {
+					"serviceId": 30051,
+					"page": 1,
+					"pageSize": 999,
+					"dataContent": {
+						"carrflights": this.luggageData.carrierFlights,
+						"carrierFlightsDate": this.luggageData.carrierFlightsDate,
+						"luggageNum": this.luggageData.luggageNum
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.imgList = [];
+						this.ImgObjList = res.returnData;
+						res.returnData.map(item => {
+							if (item.luggagePic) {
+								this.imgList.push(item.luggagePic);
+							}
+						})
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "获取图片失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async deleteImg(index) {
+				let data = {
+					"serviceId": 30051,
+					"dataContent": [{
+						"filter": [{
+							"left": "(",
+							"column": "id",
+							"comparator": "=",
+							"value": this.ImgObjList[index].id,
+							"right": ")",
+							"connector": "and"
+						}]
+					}],
+					"event": "3"
+				}
+				await this.$http.httpPost('/openApi/movedata', data).then(res => {
+					if (res.code == "0") {
+						this.getImgList()
+						wx.showToast({
+							title: '删除成功',
+							icon: 'success',
+							duration: 3000
+						});
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "删除图片失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			onDelete(index) {
+				console.log(index)
+				//删除成功回调后执行 只做演示
+				uni.showLoading({
+					title: '删除中'
+				});
+				this.deleteImg(index)
+			},
+			onChoose(e) {
+				console.log(e)
+				uni.showLoading({
+					title: '上传中'
+				});
+				// let upImgList = []
+				// this.newImgList = []
+				e.tempFilePaths.map(item => {
+					translateapp(item, 70, imgUrl => {
+						pathToBase64(imgUrl).then(path => {
+							let upImgList = []
+							let newData = {
+								"carrflights": this.luggageData.carrierFlights,
+								"carrierFlightsDate": this.luggageData.carrierFlightsDate,
+								"luggageNum": this.luggageData.luggageNum,
+								"luggagePic": path,
+								"piclocation":this.luggageData.location_describe
+							}
+							upImgList.push(newData)
+							this.sendImg(upImgList)
+						}).catch(error => {
+							uni.hideLoading();
+						})
+					})
+				})
+			},
+			onPreviewTake(index) {
+				console.log(index)
+				wx.showActionSheet({
+					itemList: ['预览图片', '删除图片'],
+					success(res) {
+						console.log(res.tapIndex)
+					},
+					fail(res) {
+						console.log(res.errMsg)
+					}
+				})
+			},
+			openImg(index) {
+				const imgList = this.imgList;
+				const isReverse = false;
+				const currentIndex = isReverse ? (imgList.length - index) - 1 : index
+				const imgLists = isReverse ? imgList.reverse() : imgList;
+				uni.previewImage({
+					current: currentIndex,
+					urls: imgLists
+				});
+			},
+
+
+			finishSelectDate(e) {
+				this.datatime = e[0]
+				console.error("选择了日期:", e);
+			},
+			movetran(e) {
+				let arr = uni.getSystemInfoSync().windowHeight;
+				this.dataheight = (e.changedTouches[0].clientY / 16) + 'rem'
+				if (e.changedTouches[0].clientY / 16 > 10.75) {
+					this.dataheight = 10.75 + 'rem'
+				} else if (e.changedTouches[0].clientY / 16 < 3.75) {
+					this.dataheight = 3.75 + 'rem'
+				}
+			},
+			toNode() {
+				uni.navigateTo({
+					url: "/pages/detailNode/index?luggageNum=" + this.luggageData.luggageNum + "&carrierFlights=" +
+						this.luggageData.carrierFlights + "&carrierFlightsDate=" + this.luggageData
+						.carrierFlightsDate
+				})
+			},
+			uplist() {
+				uni.redirectTo({
+					url: "/pages/loadingdetails/index"
+				})
+			},
+			lop(index) {
+				this.action = index
+			},
+			seach() {
+				uni.redirectTo({
+					url: "/pages/search/index"
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			change(e) {
+				this.current = e.detail.current;
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		>.send {
+			position: fixed;
+			bottom: 10px;
+			left: calc((100% - 20.5625rem) / 2);
+			width: 20.5625rem;
+			height: 3rem;
+			background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+			border-radius: .25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			margin: 0 auto;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: fixed;
+			left: 0;
+			top: 0;
+			z-index: 1;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+			>.up {
+				width: .8456rem;
+				height: .8456rem;
+				position: absolute;
+				right: 1.5rem;
+				background: url('../../static/search.png') no-repeat;
+				background-size: 100% 100%;
+				// color: rgb(37, 121, 160);
+				// font-family: Noto Sans SC;
+				// font-size: .875rem;
+				// font-weight: 500;
+			}
+		}
+
+		>.content {
+			width: 100%;
+			// height: calc(100vh - 20.9375rem - 4.375rem);
+			padding-bottom: 0;
+			position: absolute;
+			bottom: 0;
+			top: 10.75rem;
+			border-radius: 6px 6px 0px 0px;
+			overflow: hidden;
+			background: rgb(255, 255, 255);
+
+			>.choice {
+				width: 100%;
+				// height: 3.75rem;
+				display: flex;
+				align-items: center;
+				padding: 0 0 0 0.8rem;
+				box-sizing: border-box;
+
+				>.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					width: 100%;
+					height: 27.75rem;
+
+					.list {
+						height: 3.375rem;
+						display: flex;
+						align-items: center;
+						border-bottom: 1px solid rgb(238, 238, 238);
+						position: relative;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 13px;
+						font-weight: 400;
+
+						.uni-input {
+							width: 240px;
+							padding-left: 10px;
+						}
+
+						>.lable {
+							color: rgb(0, 0, 0);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+							line-height: 19px;
+							letter-spacing: 0px;
+							text-align: left;
+							width: 6rem;
+						}
+
+						>.listup {
+							// width: .25rem;
+							// height: .5rem;
+							// background: url('../../static/icos.png') no-repeat;
+							// background-size: 100% 100%;
+							position: absolute;
+							right: 5px;
+						}
+
+						>.nodeList {
+							background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+							border-radius: .25rem;
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 1rem;
+							float: right;
+							margin-right: 10px;
+						}
+					}
+				}
+			}
+
+
+
+			.but {
+				width: 20.5625rem;
+				height: 2.5rem;
+				background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+				border-radius: .25rem;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 1rem;
+				margin: 0 auto;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				margin-top: 0.25rem;
+				margin-bottom: 2.25rem;
+			}
+		}
+	}
+</style>

+ 227 - 0
pages/detailNode/index.vue

@@ -0,0 +1,227 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="title">
+				行李路径
+			</view>
+			<view class="log" @tap="fall"></view> 
+		</view>
+		<view class="content">
+			<uni-section class="mb-10" :title="'行李编号:'+luggageNum" type="circle"></uni-section>
+			<uni-section class="mb-10" :title="'航班号:'+carrierFlights" type="circle"></uni-section>
+			<uni-section class="mb-10" :title="'航班日期:'+carrierFlightsDate" type="circle"></uni-section>
+			<y-steps :stepList="stepList"></y-steps>
+		</view>
+	</view>
+</template>
+
+<script>
+	import YSteps from '@/components/YSteps/YSteps.vue'
+	export default {
+			components: { YSteps },
+			data() {
+				return {
+					luggageNum:null,
+					carrierFlightsDate:null,
+					carrierFlights:null,
+					active: 0,
+					stepList: [
+					    {
+					        date: '值机', // 左侧日期 -- 必选
+					        time: '-', // 左侧时间 -- 必选
+					        info: '', // 右侧内容 -- 可选
+					        index: '1', // 中间 Index -- 可选
+					        isFinished: false, // 是否已完成(完成 index 为 √)-- 可选
+					        isActive: true, // 是否为当前节点 Active(当前节点 即使完成 index 也不会显示 √)-- 可选
+					        isShowSlot: true // 右侧是否有 Slot(显示在 右侧内容下方)-- 可选
+					    },
+					    {
+					        date: '安检',
+					        time: '-',
+					        info: '',
+					        index: '2',
+					        isFinished: false,
+					        isActive: true,
+					        isShowSlot: true
+					    },
+					    {
+					        date: '分拣',
+					        time: '-',
+					        info: '',
+					        index: '3',
+					        isFinished: false,
+					        isActive: true,
+					        isShowSlot: true
+					    },
+					    {
+					        date: '装车',
+					        time: '-',
+					        info: '',
+					        index: '4',
+					        isFinished: false,
+					        isActive: true,
+					        isShowSlot: true
+					    },
+					    {
+					        date: '装机',
+					        time: '-',
+					        info: '',
+					        index: '5',
+					        isFinished: false,
+					        isActive: true,
+					        isShowSlot: true
+					    },
+					    {
+					        date: '到达',
+					        time: '-',
+					        info: '',
+					        index: '6',
+					        isFinished: false,
+					        isActive: true,
+					        isShowSlot: true
+					    },
+					    {
+					        date: '卸机',
+					        time: '-',
+					        info: '',
+					        index: '7',
+					        isFinished: false,
+					        isActive: true,
+					        isShowSlot: true
+					    }
+					]
+				}
+			},
+			onLoad(option) {
+				this.luggageNum = option.luggageNum;
+				this.carrierFlights = option.carrierFlights;
+				this.carrierFlightsDate = option.carrierFlightsDate;
+				this.getNode()
+			},
+			methods: {
+				fall() {
+					uni.navigateBack({
+						delta: 1
+					})
+				},
+				async getNode(){
+					let data = {
+						"serviceId": 3009,
+						"dataContent": {
+							"luggageNum":this.luggageNum,
+							"carrierFlights":this.carrierFlights,
+							"carrierFlightsDate":this.carrierFlightsDate
+						},
+						"event": "0"
+					}
+					await this.$http.httpPost('/openApi/query', data).then(res => {
+						if (res.code == "0" && res.returnData.length > 0) {
+							console.log(res)
+							let luggageData = res.returnData[0]
+							if(luggageData.checkInDate!=null){
+								this.stepList[0].info = luggageData.checkInDate;
+								this.stepList[0].time = luggageData.checkInlocation?luggageData.checkInlocation:"-";
+								this.stepList[0].isFinished = true;
+								this.stepList[0].isActive = false;
+							}
+							if(luggageData.security_check_time!=null){
+								this.stepList[1].info = luggageData.security_check_time;
+								this.stepList[1].time = luggageData.security_location?luggageData.security_location:"-";
+								this.stepList[1].isFinished = true;
+								this.stepList[1].isActive = false;
+							}
+							if(luggageData.sorting_time!=null){
+								this.stepList[2].info = luggageData.sorting_time;
+								this.stepList[2].time = luggageData.sorting_location?luggageData.sorting_location:"-";
+								this.stepList[2].isFinished = true;
+								this.stepList[2].isActive = false;
+							}
+							if(luggageData.loading_time!=null){
+								this.stepList[3].info = luggageData.loading_time;
+								this.stepList[3].time = luggageData.installationAddress?luggageData.installationAddress:"-";
+								this.stepList[3].isFinished = true;
+								this.stepList[3].isActive = false;
+							}
+							if(luggageData.installation_time!=null){
+								this.stepList[4].info = luggageData.installation_time;
+								this.stepList[4].time = luggageData.installation_location?luggageData.installation_location:"-";
+								this.stepList[4].isFinished = true;
+								this.stepList[4].isActive = false;
+							}
+							if(luggageData.arrivedtime!=null){
+								this.stepList[5].info = luggageData.arrivedtime;
+								this.stepList[5].time = luggageData.arrviedLocation?luggageData.arrviedLocation:"-";
+								this.stepList[5].isFinished = true;
+								this.stepList[5].isActive = false;
+							}
+							if(luggageData.unloadtime!=null){
+								this.stepList[6].info = luggageData.unloadtime;
+								this.stepList[6].time = luggageData.unloadLocation?luggageData.unloadLocation:"-";
+								this.stepList[6].isFinished = true;
+								this.stepList[6].isActive = false;
+							}
+						}
+					})
+				},
+				
+			}
+		}
+</script>
+
+
+<style lang="scss" scoped>
+	.app-content {
+		>.header {
+			width: 100%;
+			height: 3.375rem;
+			padding-top: 15px;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			background: rgba(49,85,99,1);
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: fixed;
+			left: 0;
+			top: 0;
+			z-index: 1;
+			
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+			
+			>.up {
+				width: .8456rem;
+				height: .8456rem;
+				position: absolute;
+				right: 1.5rem;
+				background: url('../../static/search.png') no-repeat;
+				background-size: 100% 100%;
+				// color: rgb(37, 121, 160);
+				// font-family: Noto Sans SC;
+				// font-size: .875rem;
+				// font-weight: 500;
+			}
+		}
+		>.content {
+			box-sizing: border-box;
+			width: 100%;
+			// height: calc(100vh - 20.9375rem - 4.375rem);
+			padding-bottom: 0;
+			padding-left: 50px;
+			position: absolute;
+			bottom: 0;
+			top: 5rem;
+			border-radius: 6px 6px 0px 0px;
+			overflow: hidden;
+			background: rgb(255, 255, 255);
+		}
+	}
+</style>

+ 409 - 0
pages/express/index.vue

@@ -0,0 +1,409 @@
+<template>
+	<view class="app-content">
+		<Navs :navname.sync="navname" @fall="fall"></Navs>
+		<img :src="icon" alt="" class="tuku">
+		<view class="scanning">
+			<view class="scanning_cds">
+				<input class="input" v-model.trim="currentLuggageNum" disabled="true" @tap="baggageEntry" type="text"
+					placeholder-style="font-size:.8125rem;color:rgb(189, 214, 231);display:flex;justify-content: start;"
+					placeholder="请输入行李号" />
+				<view class="log_l"></view>
+				<uni-icons type="clear" size="30" @tap="clear()" color="#fff"></uni-icons>
+			</view>
+		</view>
+		<view class="content">
+			<view class="content_bootom" style="top:0">
+				<view class="">
+					<uni-segmented-control :current="current" :values="items" style-type="text" active-color="#007aff"
+						@clickItem="onClickItem" />
+				</view>
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view class="up" v-for="(item, index) in listdata" :key="index" @tap="toDetail(item.luggageNum)">
+						<view class="list">
+							<p>{{ item.luggageNum }}</p>
+						</view>
+						<view class="normal">
+							{{item.carrierFlights}}
+						</view>
+						<view class="normal2">
+							{{item.carrierFlightsDate}}
+						</view>
+						<view :class="item.specialType != 'RUSH'?'error':'normal'">
+							{{item.specialType}}</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Navs from '../../components/header/navs.vue'
+	export default {
+		data() {
+			return {
+				items: ["速运","改签"],
+				current:0,
+				isShow: true,
+				navname: '速运/改签',
+				icon: 'static/beijing.png',
+				action: true,
+				listdata: [],
+				exceptionList: [{
+						"type": null,
+						"name": "无"
+					},
+					{
+						"type": "RUSH",
+						"name": "速运"
+					},
+					{
+						"type": "REBOOK",
+						"name": "改签"
+					}
+				],
+				airport: null,
+				currentLuggageNum: null,
+				specialTypeList: {
+					"AVIH": "装笼动物",
+					"CREW": "机组行李",
+					"RFAG": "易碎行李",
+					"HVY": "重型行李",
+					"PRIO": "优先行李",
+					"RUSH": "无人行李",
+					"SCON": "急转行李",
+					"SPEQ": "运动装备",
+					"VIP": "VIP行李",
+					"WCHR": "轮椅",
+					"WFAP": "武器枪支",
+					"SJ05": "到港行李破损",
+					"SJ34": "超大柜台接收",
+				}
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.airport = this.$storage.get("airportName")
+			// this.getluggageList(this.airport)
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			if (this.airport) {
+				this.getluggageList(this.airport)
+			}
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/baggagecheck/index?luggageNum=" + data.msg
+					})
+				}
+			});
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {},
+		computed: {},
+		components: {
+			Navs,
+		},
+		methods: {
+			onClickItem(e){
+				if (this.current !== e.currentIndex) {
+					this.current = e.currentIndex
+				}
+				this.getluggageList(this.airport)
+			},
+			async getluggageList(airport) {
+				console.log(this.$storage.getJson("users"))
+				let type = ""
+				if(this.current == 0){
+					type = "RUSH"
+				}
+				else{
+					type = "REBOOK"
+				}
+				let data = {
+					"serviceId": 3012,
+					"dataContent": [{
+						"specialType": type,
+						"agentNumber": this.$storage.getJson("users").user_name
+						// "agentNumber": "syq"
+					}],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					console.log(res)
+					if (res.code == "0") {
+						res.returnData.map(item => {
+							this.exceptionList.map(item2 => {
+								if (item.exception_type == item2.type) {
+									item["exception_name"] = item2.name
+								}
+							})
+						})
+						this.listdata = res.returnData;
+					}
+
+				})
+			},
+			// toDetail(luggageNum){
+			// 	this.currentLuggageNum = luggageNum;
+			// 	uni.navigateTo({
+			// 		url: "/pages/baggagecheck/index?luggageNum="+this.currentLuggageNum
+			// 	})
+			// },
+			async getluggage(n, t) {
+				let data = {
+					"serviceId": 3002,
+					"page": 1,
+					"pageSize": 1,
+					"dataContent": {
+						"luggageNum": n, //行李号
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length > 0) {
+						uni.navigateTo({
+							url: "/pages/express/info?luggageNum=" + n
+						})
+					} else {
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "未查询到" + this.currentLuggageNum + "行李信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			baggageEntry() {
+				uni.navigateTo({
+					url: "/pages/baggageEntry/index"
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			clear() {
+				this.currentLuggageNum = null
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		background: rgb(49, 85, 99);
+		width: 100vw;
+		height: 100vh;
+		overflow: hidden;
+
+		>.tuku {
+			position: absolute;
+			z-index: -1;
+			width: 100%;
+			top: -250px;
+			let: 20px;
+		}
+
+		>.scanning {
+			// height: 12rem;
+			padding: 0 1.5rem 0 1.5rem;
+			opacity: 1;
+			transition: all 3s;
+
+			.scanning_cds {
+				width: 100%;
+				height: 3rem;
+				opacity: 1;
+				transition: all 3s;
+				background: rgb(51, 161, 165);
+				margin-top: 1rem;
+				margin-bottom: .5rem;
+				border-radius: 4px;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+
+				>.log {
+					width: .875rem;
+					height: .875rem;
+					background: url('../../static/saoma.png') no-repeat;
+					background-size: 100% 100%;
+					margin-left: 1rem;
+				}
+
+				>.log_l {
+					width: .125rem;
+					height: 1.3125rem;
+					margin-left: 4rem;
+					margin-right: .7rem;
+					background: rgb(255, 255, 255);
+				}
+			}
+		}
+
+		>.content {
+			width: 100%;
+			height: calc(100vh - 7.5rem);
+			position: relative;
+			margin-top: 2.5rem;
+
+			// overflow: hidden;
+			// background: rgb(49, 85, 99);
+			>.content_top {
+				width: 100%;
+				// background: rgb(49, 85, 99);
+				padding-bottom: 1.3125rem;
+
+				>.craid {
+					// width: 100%;
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: space-between;
+					flex-wrap: wrap;
+					align-items: center;
+
+					>.craid_data {
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: start;
+
+						>p {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 18px;
+							font-weight: 700;
+						}
+
+						>span {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+						}
+					}
+
+					>.aircraft {
+						width: 1.75rem;
+						height: 1.75rem;
+						background: url('../../static/hang.png') no-repeat;
+						background-size: 100% 100%;
+					}
+				}
+			}
+
+			>.content_bootom {
+				width: 100%;
+				// height: calc(100vh - 20.9375rem - 4.375rem);
+				padding-bottom: 0;
+				position: absolute;
+				bottom: 0;
+				top: 20.75rem;
+				// border-radius: 6px 6px 0px 0px;
+				overflow: hidden;
+				background: rgb(255, 255, 255);
+				padding: 0 10px;
+				box-sizing: border-box;
+
+				.up {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-left: 1rem;
+					border-bottom: 1px solid rgb(238, 238, 238);
+
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					>.error {
+						width: 60px;
+						color: red
+					}
+
+					>.normal {
+						width: 110px;
+						color: #4682b4;
+						margin-left: 10px;
+					}
+					>.normal2 {
+						width: 180px;
+						color: #4682b4;
+						margin-left: 5px;
+					}
+					>.list {
+						position: relative;
+						height: 3rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+
+					>.delete {
+						width: 3.75rem;
+						height: 3.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: -3.75rem;
+						transform: all 3s;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+
+				.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					height: calc(100% - 2.5rem - 2.75rem);
+				}
+
+				.but {
+					width: 20.5625rem;
+					height: 2.5rem;
+					background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+					border-radius: .25rem;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					margin: 0 auto;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-top: 0.25rem;
+					margin-bottom: 2.25rem;
+				}
+			}
+		}
+	}
+</style>

+ 383 - 0
pages/express/info.vue

@@ -0,0 +1,383 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="fall"></view>{{ navname }}
+
+		</view>
+		<view class="craids" v-if="!luggageData">
+			<p>暂无行李信息</p>
+			<p>请扫描需要操作的行李牌条码</p>
+		</view>
+		<view class="content" v-if="luggageData">
+			<uni-section class="mb-10" title="当前行李" type="line"></uni-section>
+			<view class="list">
+				<p>行李编号</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.luggageNum" disabled="true"
+					value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);" placeholder="" />
+			</view>
+			<view class="list">
+				<p>航班信息</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.carrierFlights"
+					disabled="true" value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);"
+					placeholder="" />
+			</view>
+			<view class="list">
+				<p>航班日期</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.carrierFlightsDate"
+					disabled="true" value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);"
+					placeholder="" />
+			</view>
+			<view class="list">
+				<p>旅客姓名</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.passengerName" disabled="true"
+					value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);" placeholder="" />
+			</view>
+			<view class="list">
+				<p>降落机场</p>
+				<input class="input" name="yonghuming" type="text" v-model.trim="luggageData.landAirport" disabled="true"
+					value="" placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);" placeholder="" />
+			</view>
+			<uni-section class="mb-10" title="变更后信息" type="line"></uni-section>
+			<view class="list">
+				<p>变更类型</p>
+				<picker @change="bindPickerChange" style="line-height: 2.375rem;background-color: antiquewhite;" :value="index" :range-key="'name'" :range="expressList">
+					<view class="uni-input">{{expressList[index].type?expressList[index].name:"无"}}</view>
+				</picker>
+			</view>
+			<view class="list">
+				<p>行李编号</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="luggageDataNew.luggageNum" type="text"
+					placeholder="变更后行李编号" />
+				</uni-forms>
+			</view>
+			<view class="list">
+				<p>航班信息</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="luggageDataNew.carrierFlights" type="text"
+					placeholder="变更后航班号" />
+			</view>
+			<view class="list">
+				<p>航班日期</p>
+				<uni-datetime-picker  style="line-height: 2.375rem;background-color: antiquewhite;" type="date" :clear-icon="false" v-model="luggageDataNew.carrierFlightsDate" @change="maskClick" />
+			</view>
+			<view class="list">
+				<p>降落机场</p>
+				<uni-easyinput :inputBorder="false" style="line-height: 2.375rem;background-color: antiquewhite;" :placeholderStyle="placeholderStyle" :clearable="false"
+					:styles="style" :disabled="false" v-model="luggageDataNew.landAirport" type="text"
+					placeholder="变更后降落机场" />
+			</view>
+		</view>
+		<view class="up" v-if="luggageDataNew.luggageNum && luggageDataNew.carrierFlights && luggageDataNew.carrierFlightsDate && luggageDataNew.landAirport" @tap="sendData()">提交</view>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import mkUpload from "@/components/mk-upload/mk-upload.vue"
+	import {
+		translateapp
+	} from "@/utils/compress.js"
+	import {
+		pathToBase64,
+		base64ToPath
+	} from 'image-tools'
+	export default {
+		data() {
+			return {
+				placeholderStyle: "color:000;",
+				style: {
+					disableColor: "#fff",
+					color: "#000"
+				},
+				isShow: true,
+				dataheight: '20.75rem',
+				scrollTop: 0,
+				old: {
+					scrollTop: 0
+				},
+				input: '',
+				main: null,
+				poll: null,
+				filter: null,
+				pusher: null,
+				intentServer: null,
+				arr: [],
+				navname: '速运/改签',
+				luggageNum: null,
+				luggageData: null,
+				luggageDataNew: null,
+				index: 0,
+				index1: 0,
+				expressList: [{
+						"type": null,
+						"name": "无"
+					},
+					{
+						"type": "RUSH",
+						"name": "速运"
+					},
+					{
+						"type": "REBOOK",
+						"name": "改签"
+					}
+				],
+				exceptionNameList: ["无", "速运", "改签"],
+				nodeNameList: [],
+				isGet:true
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.luggageNum = option.luggageNum;
+			if (this.luggageNum.length > 9) {
+				this.getDetial(this.luggageNum)
+			}
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			uni.$off("scancodemsg");
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					this.luggageNum = data.msg.trim()
+					if (this.luggageNum.length > 9) {
+						if(this.isGet==true){
+							this.getDetial(this.luggageNum);
+							this.isGet = false;
+							setTimeout(function(){
+								this.isGet = true;
+							},500)
+						}
+					}
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: "请扫描规范条码",
+						duration: 5000
+					});
+				}
+			})
+
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {},
+		components: {
+			Nav,
+			mkUpload
+		},
+		methods: {
+			async getDetial(num) {
+				let data = {
+					"serviceId": 3002,
+					"page": 1,
+					"pageSize": 1,
+					"dataContent": {
+						"luggageNum": num, //行李号
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length > 0) {
+						this.luggageData = res.returnData[0]
+						this.luggageDataNew = _.cloneDeep(res.returnData[0])
+						this.luggageDataNew.luggageNum = ""
+						this.luggageDataNew.carrierFlights = ""
+						this.luggageDataNew.carrierFlightsDate = ""
+						this.luggageDataNew.landAirport = ""
+						this.expressList.map((item, index) => {
+							if (res.returnData[0].specialType == item.type) {
+								this.index = index
+							}
+						})
+					} else {
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "未查询到该行李信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			bindPickerChange(e) {
+				this.index = e.detail.value
+				this.luggageDataNew.specialType = this.expressList[this.index].type;
+			},
+			async sendData() {
+				this.luggageDataNew.sourceAirport = this.$storage.get('airportName');
+				this.luggageDataNew.ID = null;
+				this.luggageDataNew.dataType = "BPM";
+				this.luggageDataNew.agentNumber = this.$storage.getJson("users").user_name;
+				// this.luggageDataNew.agentNumber = "syq";
+				this.luggageDataNew.device_ID = uni.getDeviceInfo().deviceId;
+				let data = {
+					"serviceId": 3005,
+					"dataContent": [
+						this.luggageDataNew
+					],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						uni.showToast({
+							icon: 'none',
+							title: "操作成功",
+							duration: 5000
+						});
+					} else {
+						this.$scanAudio.src = "../../static/czsb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "操作失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			maskClick(e){
+				console.log(e)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		>.up {
+			position: fixed;
+			bottom: 10px;
+			left: calc((100% - 20.5625rem) / 2);
+			width: 20.5625rem;
+			height: 3rem;
+			background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+			border-radius: .25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			margin: 0 auto;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+
+		}
+
+		>.craids {
+			margin-top: 10rem;
+			height: 5.625rem;
+			padding: 0 2.5625rem 0 2.5625rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			>p {
+				color: rgb(75, 84, 91);
+				font-family: Noto Sans SC;
+				font-size: 13px;
+				font-weight: 500;
+			}
+		}
+
+		>.content {
+			margin-left: 1.5rem;
+			height: calc(100vh - 8rem);
+			overflow-x: hidden;
+			overflow-y: auto;
+
+			>.list {
+				height: 3.375rem;
+				display: flex;
+				align-items: center;
+				border-bottom: 1px solid rgb(238, 238, 238);
+				.uni-input {
+							width: 240px;
+							padding-left: 10px;
+						}
+				>p {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-right: 2.1875rem;
+				}
+
+				>.listup {
+					width: .25rem;
+					height: .5rem;
+					background: url('../../static/icos.png') no-repeat;
+					background-size: 100% 100%;
+					position: absolute;
+					right: 1.5rem;
+				}
+			}
+
+			>.picturearea {
+				margin-top: 1.875rem;
+
+				>.name {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-bottom: 1.25rem;
+				}
+
+				>.content_list {
+					width: 100%;
+					display: flex;
+					margin-top: 1.25rem;
+
+					>.mg {
+						width: 5.5rem;
+						height: 5.5rem;
+						background: rgb(197, 207, 211);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						margin-right: .625rem;
+
+						>.mg_lg {
+							width: 1.75rem;
+							height: 1.75rem;
+							background: url('../../static/shi.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 579 - 0
pages/extract/index.vue

@@ -0,0 +1,579 @@
+<template>
+  <view class="app-content">
+		<!-- <img src="../../static/beijing.png" alt="" class="tuku"> -->
+		<Navs :navname="navname" @fall="fall"></Navs>
+		<view class="content">
+			<view class="content_top">
+				<view class="craid" v-if="cap">
+					<view class="craid_data">
+						<p>{{cap.carrierFlights}}</p>
+					  <span>{{cap.carrierFlightsDate}}</span>
+					</view>
+					<view class="craid_data">
+						<p>{{cap.outAirport}}</p>
+					  <!-- <span>{{cap.time2}}</span> -->
+					</view>
+					<view class="aircraft"></view>
+					<view class="craid_data">
+						<p>{{cap.landAirport}}</p>
+					  <!-- <span>{{cap.time3}}</span> -->
+					</view>
+				</view>
+				<view class="craids" v-if="!cap">
+          <p>暂无航班信息</p>
+				</view>
+				<view class="scanning">
+					<view class="scanning_cd">
+						<input  class="input"  v-model.trim="capluggageNum" disabled  type="text" value=""  placeholder-style="font-size:.8125rem;color:rgb(189, 214, 231);display:flex;justify-content: start;" placeholder="请扫描机票信息"/>
+						<view class="log_l"></view>
+						<view class="log" @tap="scan('1')"></view>
+					</view>
+				</view>
+			</view>
+			<view class="content_top">
+				<view class="craid" v-if="caps">
+					<view class="craid_data">
+						<p>{{caps.carrierFlights}}</p>
+					  <span>{{caps.carrierFlightsDate}}</span>
+					</view>
+					<view class="craid_data">
+						<p>{{caps.outAirport}}</p>
+					  <!-- <span>{{caps.time2}}</span> -->
+					</view>
+					<view class="aircraft"></view>
+					<view class="craid_data">
+						<p>{{caps.landAirport}}</p>
+					  <!-- <span>{{caps.time3}}</span> -->
+					</view>
+				</view>
+				<view class="craids" v-if="!caps">
+					<p>暂无航班信息</p>
+				</view>
+				<view class="scanning">
+					<view class="scanning_cd">
+						<input  class="input"  v-model.trim="capsluggageNum" disabled type="text" value=""  placeholder-style="font-size:.8125rem;color:rgb(189, 214, 231);display:flex;justify-content: start;" placeholder="请扫描行李牌号"/>
+						<view class="log_l"></view>
+						<view class="log" @tap="scan('2')"></view>
+					</view>
+					<view class="gao" v-if="!isMatch">*行李信息不一致,请上报处理</view>
+				</view>
+			</view>
+			<view class="footer">
+				<button form-type="submit" class="switchBtndel" @tap="abnormal()">异常处理</button>
+				<button form-type="submit" class="btnyes" v-if="isSend" @tap="sendData()">确认提取</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Navs from '../../components/header/navs.vue'
+	import maskModel from '../../components/mask-model/mask-model.vue'
+	import {
+		Format
+	} from '@/components/utils/validate'
+	export default {
+		data() {
+			return {
+				isShow: true,
+				input: '',
+				navname: '提取',
+				cap:null,
+				caps:null,
+				luggageNum:null,
+				capluggageNum:null,
+				capsluggageNum:null,
+				isMatch:true,
+				isSend:false,
+			}
+		},
+		created(option) {
+		},
+		onLoad(option){
+			// this.navname = JSON.parse(decodeURIComponent(option.item))
+			// if (this.navname == '分拣') {
+      //   this.tabname = '航班'
+			// }
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					this.luggageNum = data.msg.trim()
+					// this.luggageNum = 3784730658
+					this.getDetial(this.luggageNum)
+				}
+			});
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+			
+		},
+		mounted() {
+			// this.$refs.showMask.show();
+			// console.log(this.stratvalue.length)
+		},
+		computed: {
+			// getFooterClass () {
+			// 	return this.cap.luggageNum ? 'scanning_cds' : 'scanning_cd'
+			// },
+			// getlooterClasser () {
+			// 	return this.caps.luggageNum ? 'scanning_cds' : 'scanning_cd'
+			// }
+		},
+		components: {
+			Navs,
+			maskModel:maskModel,
+		},
+		methods: {
+			scan(type){
+				let that = this
+				uni.scanCode({
+					onlyFromCamera: true,
+					success: function (res) {
+						that.luggageNum = Number(res.result)
+						// this.luggageNum = 3784730658
+						that.getDetial(Number(res.result))
+					}
+				});
+			},
+			datatime() {
+				let dataTime = Format("yyyy-MM-dd hh:mm:ss", new Date());
+				return dataTime
+			},
+			async getDetial(num) {
+				let data = {
+					"serviceId": 3002,
+					"page": 1,
+					"pageSize": 1,
+					"dataContent": {
+						"luggageNum": num, //行李号
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length>0) {
+						if(!this.cap){
+							this.cap = res.returnData[0]
+							this.capluggageNum = this.luggageNum
+						}
+						else if(this.cap&&!this.caps){
+							this.caps = res.returnData[0]
+							this.capsluggageNum = this.luggageNum
+							
+						}
+						else if(this.cap&&this.caps){
+							this.cap = null
+							this.caps = null
+							this.capluggageNum = null
+							this.capsluggageNum = null
+							this.cap = res.returnData[0]
+							this.capluggageNum = this.luggageNum
+							this.isSend = false
+						}
+						if(this.caps.luggageNum == this.cap.luggageNum){
+							this.isSend = true
+							this.isMatch = true
+						}
+						if(!this.caps){
+							this.isSend = false
+							this.isMatch = true
+						}
+						if(this.caps&&this.caps.luggageNum != this.cap.luggageNum){
+							this.isSend = false
+							this.isMatch = false
+						}
+					}
+					else{
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon:'none',
+							title: "未查询到该行李信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async sendData(){
+				this.caps.nodeCode = "extract"
+				this.caps.nodeName = "提取"
+				this.caps.processing_time = this.datatime();
+				this.caps.sourceAirport = this.$storage.get('airportName');
+				this.caps.ID = null;
+				this.caps.dataType = "BPM";
+				this.caps.agentNumber = this.$storage.getJson("users").user_name;
+				this.caps.device_ID = uni.getDeviceInfo().deviceId;
+				let data = {
+					"serviceId": 3005,
+					"dataContent": [
+						this.caps
+					],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						uni.showToast({
+							icon:'none',
+							title: "操作提取成功",
+							duration: 5000
+						});
+					}
+					else{
+						this.$scanAudio.src = "../../static/czsb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon:'none',
+							title: "操作失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			abnormal(){
+				if(this.luggageNum){
+					uni.navigateTo({
+						url: "/pages/baggagecheck/index?luggageNum="+this.luggageNum
+					})
+				}
+				else{
+					uni.navigateTo({
+						url: "/pages/baggagecheck/index?luggageNum="
+					})
+				}
+			},
+			fall () {
+				uni.switchTab({
+					url: "/pages/index/index"
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+.app-content{
+  position: relative;
+	background: rgb(49, 85, 99);
+	>.content{
+		width: 100%;
+		height: calc(100vh - 4.625rem);
+		position: relative;
+		// overflow: hidden;
+		// background: rgb(49, 85, 99);
+		>.content_top{
+			width: 100%;
+			// background: rgb(49, 85, 99);
+			padding-bottom: 1.3125rem;
+			>.craid{
+				// width: 100%;
+				height: 5.625rem;
+				padding: 0 2.5625rem 0 2.5625rem;
+				display: flex;
+				justify-content: space-between;
+				flex-wrap: wrap;
+				align-items: center;
+				>.craid_data{
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					align-items: start;
+					>p{
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 18px;
+						font-weight: 700;
+					}
+					>span{
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 13px;
+						font-weight: 500;
+					}
+				}
+				>.aircraft{
+					width: 1.75rem;
+          height: 1.75rem;
+					background: url('../../static/hang.png') no-repeat;
+					background-size: 100% 100%;
+				}
+			}
+			>.craids{
+				height: 5.625rem;
+				padding: 0 2.5625rem 0 2.5625rem;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				>p{
+					color: rgb(189, 214, 231);
+					font-family: Noto Sans SC;
+					font-size: 13px;
+					font-weight: 500;
+				}
+			}
+			>.scanning{
+				// height: 12rem;
+				padding: 0 1.5rem 0 1.5rem;
+				opacity: 1;
+				transition: all 3s;
+				>.gao{
+					color: yellow;
+				}
+				.scanning_cd{
+					width: 100%;
+					height: 3rem;
+					opacity: 1;
+					transition: all 3s;
+					background: rgb(59, 103, 123);
+					margin-top: 1rem;
+					margin-bottom: .5rem;
+					border-radius: 4px;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					>.log{
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/saoma.png') no-repeat;
+						background-size: 100% 100%;
+						margin-left: 1rem;
+					}
+					>.log_l{
+						width: .125rem;
+						height: 1.3125rem;
+						margin-left: 4rem;
+						background: rgb(255, 255, 255);
+					}
+				}
+				.scanning_cds{
+					width: 100%;
+					height: 3rem;
+					opacity: 1;
+					transition: all 3s;
+					background: rgb(51, 161, 165);
+					margin-top: 1rem;
+					margin-bottom: .5rem;
+					border-radius: 4px;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					>.log{
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/saoma.png') no-repeat;
+						background-size: 100% 100%;
+						margin-left: 1rem;
+					}
+					>.log_l{
+						width: .125rem;
+						height: 1.3125rem;
+						margin-left: 4rem;
+						background: rgb(255, 255, 255);
+					}
+				}
+			}
+		}
+		>.content_bootom{
+			width: 100%;
+			// height: calc(100vh - 20.9375rem - 4.375rem);
+			padding-bottom: 0;
+			position: absolute;
+			bottom: 0;
+			top: 20.75rem;
+			border-radius: 6px 6px 0px 0px;
+			overflow: hidden;
+			background: rgb(255, 255, 255);	
+			>.choice{
+				width: 100%;
+				height: 2.5rem;
+				display: flex;
+				background: rgb(240, 241, 243);
+				>.handle{
+					width: 50%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: 15px;
+					font-weight: 700;
+					border-radius: 6px 6px 0px 0px;
+					background: rgb(255, 255, 255);
+				}
+			  >.handles{
+					width: 50%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: 15px;
+					font-weight: 700;		
+				}
+			}
+			.up{
+				width: 100%;
+				display: flex;
+				align-items: center;
+				margin-left: 1rem;
+				border-bottom: 1px solid rgb(238, 238, 238);
+				// transform: all 3s;
+				>.down_up{
+					width: .875rem;
+					height: .875rem;
+					background: url('../../static/xia.png') no-repeat;
+					background-size: 100% 100%;
+				}
+				>.list{
+					width: 97%;
+					position: relative;
+					height: 3.75rem;
+					display: flex;
+					align-items: center;
+					transform: all 3s;
+					right: 0;
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: 13px;
+					font-weight: 500;
+				}
+				>.delete{
+					width: 3.75rem;
+					height: 3.75rem;
+					background: rgb(237, 101, 101);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					position: relative;
+					right: -3.75rem;
+					transform: all 3s;
+					>.log{
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/vector@1x.png') no-repeat;
+					  background-size: 100% 100%;
+					}
+				}
+			}
+			.ups{
+				width: 100%;
+				display: flex;
+				align-items: center;
+				margin-left: 1rem;
+				border-bottom: 1px solid rgb(238, 238, 238);
+				// transform: all 3s;
+				>.down_up{
+					width: .875rem;
+					height: .875rem;
+					position: relative;
+					right:  1.875rem;
+					background: url('../../static/xia.png') no-repeat;
+					background-size: 100% 100%;
+				}
+				>.list{
+					width: 97%;
+					position: relative;
+					height: 3.75rem;
+					display: flex;
+					align-items: center;
+					right: 3.75rem;
+					// right: 0;
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: 13px;
+					font-weight: 500;
+					transform: all 3s;
+				}
+				>.delete{
+					width: 3.75rem;
+					height: 3.75rem;
+					background: rgb(237, 101, 101);
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					position: relative;
+					right: 1rem;
+					transform: all 3s;
+					// right: -3.75rem;
+					>.log{
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/vector@1x.png') no-repeat;
+					  background-size: 100% 100%;
+					}
+				}
+			}
+			.scroll-Y {
+				height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+			}
+			.but{
+				width: 20.5625rem;
+        height: 2.75rem;
+				background: linear-gradient(179.10deg, rgba(51,161,165,1.00) 11.326%,rgba(59,111,142,1.00) 119.032%,rgba(59,111,142,1.00) 119.032%,rgba(59,111,142,1.00) 119.032%);
+        border-radius: .25rem;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 1rem;
+				margin: 0 auto;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				margin-top: 2.25rem;
+				margin-bottom: 2.25rem;
+			}
+		}
+		>.footer{
+			width: 100%;
+			height: 7.4375rem;
+			position: absolute;
+			bottom: 0;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			>.switchBtndel{
+				width: 9.4375rem;
+				height: 2.75rem;
+				box-sizing: border-box;
+				background: rgb(243, 253, 255);
+				border: 1px solid rgb(172, 218, 230);
+				border-radius:
+				4px;
+				color: rgb(59, 150, 159);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+				font-weight: 700;
+			}
+			>.btnyes{
+				width: 9.4375rem;
+				height: 2.75rem;
+				background: linear-gradient(179.10deg, rgba(51,161,165,1.00) 11.326%,rgba(59,111,142,1.00) 119.032%,rgba(59,111,142,1.00) 119.032%,rgba(59,111,142,1.00) 119.032%);
+				border-radius:
+				4px;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+				font-weight: 700;
+			}
+			>.unbtnyes{
+				width: 9.4375rem;
+				height: 2.75rem;
+				background: rgb(126, 138, 143);
+				border-radius:
+				4px;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+				font-weight: 700;
+			}
+		}
+	}
+}
+</style>

+ 444 - 0
pages/flightdetails/index.vue

@@ -0,0 +1,444 @@
+<template>
+	<view class="app-content">
+		<img :src="icon" alt="" class="tuku">
+		<Navs :navname.sync="navname" @fall="fall"></Navs>
+		<view class="fight">
+			<view class="fight_card">
+				<p>{{flightDetail.carrierFlights}}</p>
+				<span>{{flightDetail.carrierFlightsDate}}</span>
+			</view>
+			<view class="fight_card">
+				<p>{{flightDetail.outAirport}}</p>
+				<span>{{flightDetail.scheduleTakeOffTime?flightDetail.scheduleTakeOffTime:"-"}}</span>
+			</view>
+			<view class="fight_center">
+				<view class="type">
+					{{flightDetail.normalState}}
+				</view>
+				<view class="aircraft"></view>
+			</view>
+			<view class="fight_card">
+				<p>{{flightDetail.landAirport}}</p>
+				<span>{{flightDetail.scheduleLandInTime?flightDetail.scheduleLandInTime:"-"}}</span>
+			</view>
+		</view>
+		<view class="content">
+			<view class="content_bootom" style="top:0">
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view class="up" v-for="(item, index) in listdata" :key="index">
+						<view class="list" @tap="toDetail(item.luggageNum)">
+							<p>{{ item.luggageNum }}</p>
+						</view>
+						<view class="normal">
+							{{item.specialType!=null?specialTypeList[item.specialType]:" "}}
+						</view>
+						<view :class="item.exception_type != null?'error':'normal'">
+							{{item.exception_type!=null?exceptionList[item.exception_type]:"正常"}}
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import Navs from '../../components/header/navs.vue'
+	import {
+		Format
+	} from '@/components/utils/validate'
+	export default {
+		data() {
+			return {
+				flightDetail: null,
+				input: '',
+				main: null,
+				poll: null,
+				filter: null,
+				pusher: null,
+				intentServer: null,
+				timeShow: true,
+				arr: [],
+				navname: '航班详情',
+				icon: 'static/beijing.png',
+				newData: '',
+				newDataday: '',
+				listdata:[],
+				exceptionList:{
+					"DPR":"破损",
+					"AHL":"少收",
+					"OHD":"多收"
+				},
+				specialTypeList:{
+					"AVIH":"装笼动物",
+					"CREW":"机组行李",
+					"RFAG":"易碎行李",
+					"HVY":"重型行李",
+					"PRIO":"优先行李",
+					"RUSH":"无人行李",
+					"SCON":"急转行李",
+					"SPEQ":"运动装备",
+					"VIP":"VIP行李",
+					"WCHR":"轮椅",
+					"WFAP":"武器枪支",
+					"SJ05":"到港行李破损",
+					"SJ34":"超大柜台接收",
+				}
+			}
+		},
+		created(option) {},
+		onLoad() {
+			this.flightDetail = this.$storage.getJson('searchData')
+			this.getluggageList()
+		},
+		onUnload() {uni.$off("scancodemsg");},
+		onShow() {
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/detail/index?luggageNum=" + data.msg
+					})
+				}
+			});
+			if(this.flightDetail){
+				this.getluggageList()
+			}
+		},
+		mounted() {
+		},
+		beforeDestroy() {
+		},
+		components: {
+			Navs
+		},
+		methods: {
+			fall() {
+				uni.navigateBack({
+					delta:1
+				})
+			},
+			async getluggageList() {
+				let data = {
+					"serviceId": 3001,
+					"page": 1,
+					"pageSize": 999,
+					"dataContent": {
+						"carrierFlights": this.flightDetail.carrierFlights,
+						"carrierFlightsDate": this.flightDetail.carrierFlightsDate,
+						"outAirport":this.flightDetail.outAirport,
+						"landAirport":this.flightDetail.landAirport
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.listdata = res.returnData;
+					}
+
+				})
+			},
+			toDetail(luggageNum){
+				this.currentLuggageNum = luggageNum;
+				uni.navigateTo({
+					url: "/pages/detail/index?luggageNum="+this.currentLuggageNum
+				})
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		width: 100vw;
+		height: 100vh;
+		overflow: hidden;
+		>.tuku {
+			position: absolute;
+			z-index: -1;
+			width: 100%;
+			top: -250px;
+			let:20px;
+		}
+
+		>.fight {
+			padding: 0 1.75rem 5rem 1.75rem;
+			// height: 3.75rem;
+			display: flex;
+			align-items: center;
+			justify-content: space-around;
+			margin-top: 1.375rem;
+			
+			.fight_center {
+				width: 3rem;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+				line-height: 24px;
+				font-weight: 700;
+
+				>.aircraft {
+					width: 1.75rem;
+					height: 1.75rem;
+					background: url('../../static/hang.png') no-repeat;
+					background-size: 100% 100%;
+				}
+			}
+
+			>.fight_card {
+				display: flex;
+				flex-direction: column;
+				align-items: start;
+				justify-content: center;
+
+				>p {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					line-height: 24px;
+					font-weight: 700;
+				}
+
+				>span {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 11px;
+					font-weight: 500;
+				}
+			}
+		}
+
+		>.times {
+			width: 100%;
+			height: 3.6875rem;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 18px;
+			font-weight: 700;
+
+			p {
+				margin-right: .625rem;
+			}
+		}
+
+		.content {
+			width: 100%;
+			height: calc(100vh - 10rem);
+			position: relative;
+			
+			// overflow: hidden;
+			// background: rgb(49, 85, 99);
+			>.content_top {
+				width: 100%;
+				// background: rgb(49, 85, 99);
+				padding-bottom: 1.3125rem;
+
+				>.craid {
+					// width: 100%;
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: space-between;
+					flex-wrap: wrap;
+					align-items: center;
+
+					>.craid_data {
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: start;
+
+						>p {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 18px;
+							font-weight: 700;
+						}
+
+						>span {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+						}
+					}
+
+					>.aircraft {
+						width: 1.75rem;
+						height: 1.75rem;
+						background: url('../../static/hang.png') no-repeat;
+						background-size: 100% 100%;
+					}
+				}
+
+				>.scanning {
+					height: 12rem;
+					padding: 0 1.5rem 0 1.5rem;
+					opacity: 1;
+					transition: all 3s;
+
+					.scanning_cd {
+						width: 100%;
+						height: 3rem;
+						opacity: 1;
+						transition: all 3s;
+						background: rgb(59, 103, 123);
+						margin-top: 1rem;
+						margin-bottom: .5rem;
+						border-radius: 4px;
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/saoma.png') no-repeat;
+							background-size: 100% 100%;
+							margin-left: 1rem;
+						}
+
+						>.log_l {
+							width: .125rem;
+							height: 1.3125rem;
+							margin-left: 4rem;
+							background: rgb(255, 255, 255);
+						}
+					}
+
+					.scanning_cds {
+						width: 100%;
+						height: 3rem;
+						opacity: 1;
+						transition: all 3s;
+						background: rgb(51, 161, 165);
+						margin-top: 1rem;
+						margin-bottom: .5rem;
+						border-radius: 4px;
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/saoma.png') no-repeat;
+							background-size: 100% 100%;
+							margin-left: 1rem;
+						}
+
+						>.log_l {
+							width: .125rem;
+							height: 1.3125rem;
+							margin-left: 4rem;
+							background: rgb(255, 255, 255);
+						}
+					}
+				}
+			}
+
+			>.content_bootom {
+				width: 100%;
+				// height: calc(100vh - 20.9375rem - 4.375rem);
+				padding-bottom: 0;
+				position: absolute;
+				bottom: 0;
+				top: 20.75rem;
+				// border-radius: 6px 6px 0px 0px;
+				overflow: hidden;
+				background: rgb(255, 255, 255);
+				padding: 0 10px;
+				box-sizing: border-box;
+				.up {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-left: 1rem;
+					border-bottom: 1px solid rgb(238, 238, 238);
+				
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+					
+					>.error{
+						width: 80px;
+						color:red
+					}
+					>.normal{
+						width: 80px;
+						color:#4682b4 
+					}
+					>.list {
+						position: relative;
+						height: 3rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+				
+					>.delete {
+						width: 3.75rem;
+						height: 3.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: -3.75rem;
+						transform: all 3s;
+				
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+				
+				.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					height: calc(100% - 2.5rem - 2.75rem);
+				}
+
+				.but {
+					width: 20.5625rem;
+					height: 2.5rem;
+					background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+					border-radius: .25rem;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					margin: 0 auto;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-top: 0.25rem;
+					margin-bottom: 2.25rem;
+				}
+			}
+		}
+	}
+</style>

+ 210 - 0
pages/help/index.vue

@@ -0,0 +1,210 @@
+<template>
+  <view class="app-content">
+    <view class="header"><view class="log" @tap="fall"></view>{{ navname }}<view class="up" @tap="seach"></view></view>
+    <view class="nav">
+      <view :class="action === index ? 'nav_lists': 'nav_list'" v-for="(item, index) in list" :key="index" @tap="lop(index)">{{item.name}}</view>
+    </view>
+    <view class="content">
+      <view class="list" v-for="(item, index) in detailedTable" :key="index" @tap = 'uplist(item)'>
+        {{ item.name }}
+        <view class="listup"></view>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	export default {
+		data() {
+			return {
+				navname: '帮助',
+        action:0,
+        list: [{
+          name: '功能模块'
+        },{
+          name: '业务流程'
+        },{
+          name: '常见问题'
+        }],
+        detailedTable: [
+          {
+            name: 'App启动'
+          },
+          {
+            name: '用户登录'
+          },
+          {
+            name: '首页'
+          },
+          {
+            name: '行李处理'
+          },
+          {
+            name: '行李提取'
+          },
+          {
+            name: '消息'
+          },
+          {
+            name: '我的'
+          },
+        ]
+			}
+		},
+		created(option) {
+		},
+		onLoad(){
+		},
+		onUnload() {
+		},
+		onShow() {
+		},
+		mounted() {
+		},
+		components: {
+			Nav
+		},
+		methods: {
+      uplist (item) {
+        if (item.name) {
+
+        }
+        // uni.redirectTo({
+				// 	url: "/pages/loadingdetails/index"
+				// })
+      },
+      lop(index) {
+        this.action = index
+      },
+			seach () {
+				uni.redirectTo({
+					url: "/pages/search/index"
+				})
+			},
+      fall () {
+        uni.switchTab({
+					url: "/pages/mypage/index"
+				})
+      }
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+.app-content{
+  >.header{
+    width: 100%;
+    height: 4.375rem;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    // background: rgba(49,85,99,1);
+    color: rgb(16, 17, 22);
+    font-family: Noto Sans SC;
+    font-size: 1rem;
+    position: relative;
+    >.log{
+      width: .375rem;
+      height: .75rem;
+      font-size: .75rem;
+      position: absolute;
+      left: 1.5rem;
+      background: url('../../static/ico@1x.png') no-repeat;
+      background-size: 100% 100%;
+    }
+    >.up{
+      width: .8456rem;
+      height: .8456rem;
+      position: absolute;
+      right: 1.5rem;
+      // background: url('../../static/search.png') no-repeat;
+      // background-size: 100% 100%;
+      // color: rgb(37, 121, 160);
+      // font-family: Noto Sans SC;
+      // font-size: .875rem;
+      // font-weight: 500;
+    }
+  }
+  >.nav{
+    height: 2rem;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 0 .75rem 0 .75rem;
+    >.nav_list{
+      margin: 0 .75rem 0 .75rem;
+      color: rgb(16, 17, 22);
+      font-family: Noto Sans SC;
+      font-size: 14px;
+      height: 100%;
+    }
+    >.nav_lists{
+      margin: 0 .75rem 0 .75rem;
+      color: rgb(37, 121, 160);
+      font-family: Noto Sans SC;
+      font-size: 14px;
+      font-size: 14px;
+      height: 100%;
+      border-bottom: 2px solid rgb(37, 121, 160);
+    }
+  }
+  >.content{
+    margin-left: 1.5rem;
+    >.list{
+      height: 3.375rem;
+      display: flex;
+      align-items: center;
+      border-bottom: 1px solid rgb(238, 238, 238);
+      position: relative;
+      color: rgb(0, 0, 0);
+      font-family: Noto Sans SC;
+      font-size: 13px;
+      font-weight: 400;
+      >p{
+        color: rgb(0, 0, 0);
+        font-family: Noto Sans SC;
+        font-size: 13px;
+        font-weight: 400;
+        margin-right: 2.1875rem;
+      }
+      >.listup{
+        width: .25rem;
+        height: .5rem;
+        background: url('../../static/icos.png') no-repeat;
+        background-size: 100% 100%;
+        position: absolute;
+        right: 1.5rem;
+      }
+    }
+    >.picturearea{
+      margin-top: 1.875rem;
+      >.name{
+        color: rgb(0, 0, 0);
+        font-family: Noto Sans SC;
+        font-size: .8125rem;
+        font-weight: 500;
+      }
+      >.content_list{
+        width: 100%;
+        display: flex;
+        margin-top: 1.25rem;
+        >.mg{
+          width: 5.5rem;
+          height: 5.5rem;
+          background: rgb(197, 207, 211);
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          margin-right: .625rem;
+          >.mg_lg{
+            width: 1.75rem;
+            height: 1.75rem;
+            background: url('../../static/shi.png') no-repeat;
+            background-size: 100% 100%;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 379 - 0
pages/index/index.vue

@@ -0,0 +1,379 @@
+<template>
+	<view class="app-content">
+		<img :src="icon" alt="" class="tuku">
+		<Nav :navname.sync="navname" :navtype="false" :index="index" @clear="clear" :flightNo="searchFlightNo"></Nav>
+		<flightInfo :flightDetail="flightDetail" @toFlight="toFlight"></flightInfo>	
+		<!-- <view class="times">
+			<p>{{ newData }}</p>{{ newDataday }}
+		</view> -->
+		
+		<view class="content">
+			<!-- <view class="card" v-if="APP_SORT" @tap="clickOrder('SORT')">
+				<view class="icon iconfont icon-check-in"></view>
+				<p>值机</p>
+			</view> -->
+			<view class="card" v-if="APP_SORT" @tap="clickOrder('SORT')">
+				<view class="icon iconfont icon-huiyuan"></view>
+				<p>分拣</p>
+			</view>
+			<view class="card" v-if="APP_LOAD" @tap="clickOrder('LOAD')">
+				<view class="icon iconfont icon-zhuangche"></view>
+				<p>装车</p>
+			</view>
+			<view class="card" v-if="APP_INFL" @tap="clickOrder('INFL')">
+				<view class="icon iconfont icon-zhuangjidan"></view>
+				<p>装机</p>
+			</view>
+			<view class="card" v-if="APP_UNLOAD" @tap="clickOrder('UNLOAD')">
+				<view class="icon iconfont icon-xieji"></view>
+				<p>卸机</p>
+			</view>
+			<view class="card" v-if="APP_ARRIVED" @tap="clickOrder('ARRIVED')">
+				<view class="icon iconfont icon--landing"></view>
+				<p>到达</p>
+			</view>
+			<view class="card" v-if="APP_EXTRACT" @tap="clickOrder('extract')">
+				<view class="icon iconfont icon-icon-test-copy"></view>
+				<p>提取</p>
+			</view>
+			<view class="card" v-if="APP_EXTRACT" @tap="clickOrder('express')">
+				<view class="icon iconfont icon-kuaisuyunxing01"></view>
+				<p>速运/改签</p>
+			</view>
+			<view class="card" v-if="APP_Abnormal" @tap="clickOrder('abnormal')">
+				<view class="icon iconfont icon-hanglidiushi"></view>
+				<p>异常登记</p>
+			</view>
+			<view class="card" v-if="APP_SORT" @tap="clickOrder('delisting')">
+				<view class="icon iconfont icon-check-in"></view>
+				<p>脱牌</p>
+			</view>
+			<view class="card" v-if="APP_SORT" @tap="clickOrder('RETURN')">
+				<view class="icon iconfont icon-xieji"></view>
+				<p>退运</p>
+			</view>
+			<view class="card_no">
+			</view>
+			<view class="card_no">
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import flightInfo from '@/components/flightInfo/flightInfo.vue'
+	import {
+		Format
+	} from '@/components/utils/validate'
+	export default {
+		data() {
+			return {
+				btnArr:[
+					{
+						type:"SORT",
+						name:"分拣",
+					},
+					{
+						type:"LOAD",
+						name:"装车",
+					},
+					{
+						type:"INFL",
+						name:"装机",
+					},
+					{
+						type:"UNLOAD",
+						name:"卸机",
+					},
+					{
+						type:"ARRIVED",
+						name:"到达",
+					},
+					{
+						type:"extract",
+						name:"提取",
+					},
+					{
+						type:"abnormal",
+						name:"异常登记",
+					},
+					
+					],
+				APP_SORT: false,
+				APP_LOAD: false,
+				APP_INFL: false,
+				APP_UNLOAD: false,
+				APP_ARRIVED: false,
+				APP_EXTRACT: false,
+				APP_Abnormal: false,
+				input: '',
+				main: null,
+				poll: null,
+				filter: null,
+				pusher: null,
+				intentServer: null,
+				timeShow: true,
+				arr: [],
+				navname: '首页',
+				icon: 'static/beijing.png',
+				newData: '',
+				newDataday: '',
+				index: 0,
+				flightDetail: null,
+				flightNO: null,
+				airportName: null,
+				flightDate: null,
+				outAirport :null,
+				landAirport :null,
+				searchFlightNo: ""
+			}
+		},
+		created(option) {
+			let authList = this.$storage.getJson('authList');
+			authList.map(item => {
+				switch (item.auth_ident) {
+					case "APP_SORT":
+						this.APP_SORT = true;
+						break;
+					case "APP_LOAD":
+						this.APP_LOAD = true;
+						break;
+					case "APP_INFL":
+						this.APP_INFL = true;
+						break;
+					case "APP_UNLOAD":
+						this.APP_UNLOAD = true;
+						break;
+					case "APP_ARRIVED":
+						this.APP_ARRIVED = true;
+						break;
+					case "APP_EXTRACT":
+						this.APP_EXTRACT = true;
+						break;
+					case "APP_Abnormal_registration":
+						this.APP_Abnormal = true;
+						break;
+					default:
+						break;
+				}
+			})
+
+		},
+		onLoad(option) {},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/detail/index?luggageNum=" + data.msg
+					})
+				}
+			});
+			if (this.$storage.get('airport')) {
+				this.index = this.$storage.get('airport')
+			}
+			if (this.$storage.get('flightDate')) {
+				this.flightDate = this.$storage.get('flightDate')
+			}
+			if (this.$storage.getJson('searchData')) {
+				this.flightDetail = this.$storage.getJson('searchData')
+				this.flightNO = this.flightDetail.carrierFlights
+				this.searchFlightNo = this.flightDetail.carrierFlights
+				this.flightDate = this.flightDetail.carrierFlightsDate
+				this.outAirport = this.flightDetail.outAirport
+				this.landAirport = this.flightDetail.landAirport
+			}
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {
+			this.datatime()
+		},
+		beforeDestroy() {
+			// console.log(this.arr[0],this.arr[1])
+		},
+		components: {
+			Nav,
+			flightInfo
+		},
+		methods: {
+			toFlight() {
+				uni.navigateTo({
+					url: "/pages/flightdetails/index"
+				})
+			},
+			clear() {
+				this.$storage.remove('searchData')
+				this.flightDetail = null
+				this.flightNO = null
+				this.searchFlightNo = ""
+				this.flightDate = null
+			},
+			datatime() {
+				setInterval(() => {
+					this.newDataday = Format("yyyy/MM/dd", new Date());
+					this.newData = Format("hh:mm", new Date());
+				}, 1000);
+			},
+			clickOrder(data) {
+				if (data == "extract") { //提取
+					uni.navigateTo({
+						url: "/pages/extract/index"
+					})
+				} 
+				else if(data == "express"){//速运改签
+					uni.navigateTo({
+						url: "/pages/express/index?airport=" + this.airportName
+					})
+				}
+				else if (data == "abnormal") { //异常行李
+					uni.navigateTo({
+						url: "/pages/abnormal/index?airport=" + this.airportName
+					})
+				}else if (data == "delisting") { //脱牌行李
+					uni.navigateTo({
+						url: "/pages/delisting/index?airport=" + this.airportName
+					})
+				} else {
+					uni.navigateTo({
+						url: "/pages/sorting/index?item=" + data + "&flightNO=" + this.flightNO + "&date="+this.flightDate+ "&outAirport="+this.outAirport+ "&landAirport="+this.landAirport 
+					})
+				}
+
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		>.tuku {
+			position: absolute;
+			z-index: -1;
+			width: 100%;
+			top: 0;
+		}
+		>.fight {
+			padding: 0 1.75rem 0 1.75rem;
+			// height: 3.75rem;
+			display: flex;
+			align-items: center;
+			justify-content: space-around;
+			margin-top: 1.375rem;
+			background: #000;
+			width: 20rem;
+			box-sizing: border-box;
+			margin-left: 2rem;
+			.fight_center {
+				width: 3rem;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				color: rgb(255, 255, 255);
+				font-family: Noto Sans SC;
+				font-size: 16px;
+				line-height: 24px;
+				font-weight: 700;
+
+				>.aircraft {
+					width: 1.75rem;
+					height: 1.75rem;
+					background: url('../../static/hang.png') no-repeat;
+					background-size: 100% 100%;
+				}
+			}
+
+			>.fight_card {
+				display: flex;
+				flex-direction: column;
+				align-items: start;
+				justify-content: center;
+
+				>p {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					line-height: 24px;
+					font-weight: 700;
+				}
+
+				>span {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 11px;
+					font-weight: 500;
+				}
+			}
+		}
+
+		>.times {
+			width: 100%;
+			height: 2.6875rem;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 18px;
+			font-weight: 700;
+			margin-top: 10px;
+
+			p {
+				margin-right: .625rem;
+			}
+		}
+
+		.content {
+			padding: 0 10px 0 10px;
+			display: flex;
+			justify-content: space-around;
+			flex-wrap: wrap;
+
+			.card {
+				width: 6.5rem;
+				height: 6.5rem;
+				/* 卡片渐变 */
+				background: linear-gradient(188.06deg, rgba(65.49, 109.04, 128.64, 1.00) 3.551%, rgba(38, 68.32, 81.96, 1.00) 110.878%);
+				box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+				border-radius: 4px;
+				margin-bottom: 10px;
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+				.iconfont {
+					font-family: iconfont;
+					font-size: 38px;
+					color: #fff;
+					margin-bottom: 5px;
+				}
+				>p {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 16px;
+					font-weight: 500;
+					// margin-bottom: .375rem;
+					// line-height: 1.6875rem;
+				}
+
+				>span {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 13px;
+					font-weight: 500;
+					line-height: 1.1875rem;
+				}
+			}
+
+			.card_no {
+				width: 6.5rem;
+				height: 6.5rem;
+			}
+		}
+	}
+</style>

+ 180 - 0
pages/individual/index.vue

@@ -0,0 +1,180 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="clickOrder"></view>{{ navname }}
+			<view class="up">完成</view>
+		</view>
+		<view class="cont">
+			<view class="photograph">
+				<!-- <view class="log"  @click="clk(0)"></view> -->
+				<!-- <image :src="urls[0]" @click="clk(0)"></image>
+        <image :src="urls[1]" @click="clk(1)"></image> -->
+				<!-- <button @click="clk(0)">按钮触发</button> -->
+				<avatar selWidth="200px" selHeight="400upx" @upload="myUpload" :avatarSrc="url"
+					avatarStyle="width: 200upx; height: 200upx; border-radius: 100%;"></avatar>
+			</view>
+		</view>
+		<view class="content">
+			<view class="list">
+				<p>名称</p>
+				<input class="input" name="yonghuming" type="text" v-model="form.user_name" value=""
+					placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);" placeholder="请输入名称" />
+			</view>
+			<view class="list">
+				<p>工号</p>
+				<input class="input" name="yonghuming" type="text" v-model="form.user_id" value=""
+					placeholder-style="font-size:.8125rem;color:rgb(197, 197, 197);" placeholder="请输入工号" />
+			</view>
+		</view>
+		<view class="butele" @tap="loginOut">退出登录</view>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import avatar from "../../components/yq-avatar/yq-avatar.vue";
+	export default {
+		data() {
+			return {
+				navname: '个人信息',
+				url: [],
+				form:{
+					user_name:"",
+					user_id:""
+				}
+			}
+		},
+		created(option) {},
+		onLoad() {
+			this.form.user_name = this.$storage.getJson("users").user_name
+			this.form.user_id = this.$storage.getJson("users").user_id
+		},
+		onUnload() {},
+		onShow() {},
+		mounted() {},
+		components: {
+			Nav,
+			avatar
+		},
+		methods: {
+			loginOut(){
+				this.$storage.clear()
+				uni.reLaunch({
+					url: "/pages/login/index"
+				})
+			},
+			clickOrder() {
+				uni.switchTab({
+					url: "/pages/mypage/index"
+				})
+			},
+			myUpload(rsp) {
+				this.$set(this.urls, rsp.index, rsp.path);
+			},
+			clk(index) {
+				this.$refs.avatar.fChooseImg(index, {
+					selWidth: "300upx",
+					selHeight: "300upx",
+					expWidth: '260upx',
+					expHeight: '260upx'
+				});
+			},
+			myUpload(rsp) {
+				this.url = rsp.path; //更新头像方式一
+				//rsp.avatar.imgSrc = rsp.path; //更新头像方式二
+			}
+		},
+	}
+</script>
+<style lang="scss" scoped>
+	.app-content {
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+			>.up {
+				position: absolute;
+				right: 1.5rem;
+				color: rgb(37, 121, 160);
+				font-family: Noto Sans SC;
+				font-size: .875rem;
+				font-weight: 500;
+			}
+		}
+
+		>.cont {
+			>.photograph {
+				width: 6rem;
+				height: 6rem;
+				background: rgb(197, 207, 211);
+				// background: red;
+				border-radius: 50%;
+				margin: 0 auto;
+				margin-top: .625rem;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				>.log {
+					width: 1.75rem;
+					height: 1.75rem;
+					background: url('../../static/shi.png') no-repeat;
+					background-size: 100% 100%;
+				}
+			}
+		}
+
+		>.content {
+			margin-left: 1.5rem;
+			margin-top: 2.125rem;
+			margin-bottom: 3rem;
+
+			>.list {
+				height: 3.375rem;
+				display: flex;
+				align-items: center;
+				border-bottom: 1px solid rgb(238, 238, 238);
+
+				>p {
+					color: rgb(0, 0, 0);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+					margin-right: 2.1875rem;
+				}
+			}
+		}
+
+		>.butele {
+			width: 20.5625rem;
+			height: 2.75rem;
+			background: linear-gradient(165.96deg, rgba(248.17, 101.23, 53.02, 1) -34%, rgba(231.09, 13.66, 13.66, 1) 166%);
+			border-radius: 4px;
+			margin: 0 auto;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			font-weight: 700;
+		}
+	}
+</style>

+ 229 - 0
pages/loadingdetails/index.vue

@@ -0,0 +1,229 @@
+<template>
+  <view class="app-content">
+    <view class="header"><view class="log" @tap="fall"></view>{{ navname }}<view class="up"></view></view>
+    <view class="navdetails">
+      <p>航班信息</p>
+      <span>{{ information }}</span>
+    </view>
+    <liu-goods-swiper  :goodsList="goodsList" :imgWidth="192" :imgHeight="152" @="chooseItem"></liu-goods-swiper>
+    <view class="content">
+      <view class="list" v-for="(item, index) in detailedTable" :key="index">
+        {{ item.name }}
+        <p>{{item.state == 0 ? '完好': '完好'}}</p>
+        <!-- <view class="listup"></view> -->
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	export default {
+		data() {
+			return {
+				navname: '装车详情',
+        action:0,
+        information: 'HU7410 CKG - CSX 离港',
+        goodsList:[
+          {
+            id: 1,
+            name: '拖车CKG3UCKRT00007',
+            descr: '10件',
+          },
+          {
+            id: 2,
+            name: '拖车CKG3UCKRT00007',
+            descr: '10件',
+          },
+          {
+            id: 3,
+            name: '拖车CKG3UCKRT00007',
+            descr: '10件',
+          },
+          {
+            id: 4,
+            name: '拖车CKG3UCKRT00007',
+            descr: '10件',
+          }
+        ],
+        detailedTable: [
+          {
+            name: '行李编号  3880324451111',
+            state: 0
+          },
+          {
+            name: '行李编号  3880324451111',
+            state: 0
+          },
+          {
+            name: '行李编号  3880324451111',
+            state: 0
+          },
+          {
+            name: '行李编号  3880324451111',
+            state: 0
+          },
+          {
+            name: '行李编号  3880324451111',
+            state: 1
+          }
+        ]
+			}
+		},
+		created(option) {
+		},
+		onLoad(){
+		},
+		onUnload() {
+		},
+		onShow() {
+		},
+		mounted() {
+		},
+		components: {
+			Nav
+		},
+		methods: {
+      lop(index) {
+        this.action = index
+      },
+			fall () {
+				uni.redirectTo({
+					url: "/pages/myrecords/index"
+				})
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+.app-content{
+  >.header{
+    width: 100%;
+    height: 4.375rem;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    // background: rgba(49,85,99,1);
+    color: rgb(16, 17, 22);
+    font-family: Noto Sans SC;
+    font-size: 1rem;
+    position: relative;
+    >.log{
+      width: .375rem;
+      height: .75rem;
+      font-size: .75rem;
+      position: absolute;
+      left: 1.5rem;
+      background: url('../../static/ico@1x.png') no-repeat;
+      background-size: 100% 100%;
+    }
+    >.up{
+      width: .8456rem;
+      height: .8456rem;
+      position: absolute;
+      right: 1.5rem;
+      // background: url('../../static/search.png') no-repeat;
+      // background-size: 100% 100%;
+      // color: rgb(37, 121, 160);
+      // font-family: Noto Sans SC;
+      // font-size: .875rem;
+      // font-weight: 500;
+    }
+  }
+  >.navdetails{
+    width: 100%;
+    height: 5.1875rem;
+    display: flex;
+    flex-direction: column;
+    align-content: start;
+    justify-content: center;
+    padding: 0 1.5rem 0 1.5rem;
+    background: linear-gradient(180.00deg, rgba(49,85,99,1.00),rgba(25.37,45.98,53.94,1.00) 100%);
+    >p{
+      color: rgb(255, 255, 255);
+      font-family: Noto Sans SC;
+      font-size: 16px;
+      font-weight: 700;
+      margin-bottom: .25rem;
+    }
+    >span{
+      color: rgb(255, 255, 255);
+      font-family: Noto Sans SC;
+      font-size: 14px;
+      font-weight: 700;
+    }
+  }
+  >.select{
+    height: 5.1875rem;
+    >.list{
+      float: left;
+      width: 10rem;
+      height: 4.125rem;
+      box-sizing: border-box;
+      background: rgb(234, 241, 245);
+      border: 1px solid rgb(37, 121, 160);
+      box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);
+      border-radius:.125rem;
+    }
+  }
+  >.content{
+    margin-left: 1.5rem;
+    >.list{
+      height: 3.375rem;
+      display: flex;
+      align-items: center;
+      border-bottom: 1px solid rgb(238, 238, 238);
+      position: relative;
+      color: rgb(0, 0, 0);
+      font-family: Noto Sans SC;
+      font-size: 13px;
+      font-weight: 400;
+      >p{
+        color: rgb(50, 182, 117);
+        font-family: Noto Sans SC;
+        font-size: 13px;
+        font-weight: 700;
+        position: absolute;
+        right: 1.5rem;
+      }
+      // >.listup{
+      //   width: .25rem;
+      //   height: .5rem;
+      //   background: url('../../static/icos.png') no-repeat;
+      //   background-size: 100% 100%;
+      //   position: absolute;
+      //   right: 1.5rem;
+      // }
+    }
+    >.picturearea{
+      margin-top: 1.875rem;
+      >.name{
+        color: rgb(0, 0, 0);
+        font-family: Noto Sans SC;
+        font-size: .8125rem;
+        font-weight: 500;
+      }
+      >.content_list{
+        width: 100%;
+        display: flex;
+        margin-top: 1.25rem;
+        >.mg{
+          width: 5.5rem;
+          height: 5.5rem;
+          background: rgb(197, 207, 211);
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          margin-right: .625rem;
+          >.mg_lg{
+            width: 1.75rem;
+            height: 1.75rem;
+            background: url('../../static/shi.png') no-repeat;
+            background-size: 100% 100%;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 98 - 0
pages/locationEntry/index.vue

@@ -0,0 +1,98 @@
+<template>
+  <view class="app-content">
+    <view class="header"><view class="log" @tap="fall"></view>{{ navname }}</view>
+	<view class="searchInput">
+		<uni-easyinput class="uni-mt-5" :inputBorder='false' suffixIcon="scan" v-model="value" placeholder="请输入操作位置" @iconClick="iconClick"></uni-easyinput>
+	</view>
+	<button type="default" v-if="value==''" class="defaultBtn">保存并提交</button>
+	<button type="default" v-else class="sendBtn">保存并提交</button>
+  </view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	export default {
+		data() {
+			return {
+				navname: '操作位置录入',
+				value:"",
+			}
+		},
+		created(option) {
+		},
+		onLoad(){
+		},
+		onUnload() {
+		},
+		onShow() {
+		},
+		mounted() {
+		},
+		components: {
+			Nav
+		},
+		methods: {
+		  fall () {
+			uni.navigateBack({
+				delta: 1
+			})
+		  },
+		  iconClick(){
+			alert("点击")
+		  }
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+.app-content{
+  >.header{
+    width: 100%;
+    height: 4.375rem;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    // background: rgba(49,85,99,1);
+    color: rgb(16, 17, 22);
+    font-family: Noto Sans SC;
+    font-size: 1rem;
+    position: relative;
+    >.log{
+      width: .375rem;
+      height: .75rem;
+      font-size: .75rem;
+      position: absolute;
+      left: 1.5rem;
+      background: url('../../static/ico@1x.png') no-repeat;
+      background-size: 100% 100%;
+    }
+  }
+  >.searchInput{
+	  width: calc(100% - 2rem);
+	  margin-left: 1rem;
+	  border-bottom:1px solid rgb(224, 230, 238);
+	  color: rgb(48, 51, 57);
+  }
+  >.defaultBtn{
+	  width: calc(100% - 2rem);
+	  margin-left: 1rem;
+	  height: 44px;
+	  top: 204px;
+	  background: rgb(180, 191, 196);
+	  color: rgb(255, 255, 255);
+	  border-radius:4px;
+	  border: none;
+	  top: 4rem;
+  }
+  >.sendBtn{
+  	  width: calc(100% - 2rem);
+  	  margin-left: 1rem;
+  	  height: 44px;
+  	  top: 204px;
+  	  background: linear-gradient(179.10deg, rgba(51,161,165,1.00) 11.326%,rgba(59,111,142,1.00) 119.032%,rgba(59,111,142,1.00) 119.032%,rgba(59,111,142,1.00) 119.032%);
+  	  color: rgb(255, 255, 255);
+  	  border-radius:4px;
+  	  border: none;
+  	  top: 4rem;
+  }
+}
+</style>

+ 215 - 0
pages/login/index.vue

@@ -0,0 +1,215 @@
+<template>
+	<view class="content">
+		<!-- <img src="../../static/bei.png" alt="" class="tubei"> -->
+		<form>
+		<view class="avatorWrapper">
+		</view>
+    <view class="name">中小型机场手持终端</view>
+		<view class="form">
+			<view class="inputWrapper">
+				<view class="log"></view>
+				<input  class="input" name="username"  type="text" v-model="username"  placeholder-style="font-size:.8125rem;color:rgb(223, 223, 223);display:flex;justify-content: start;" placeholder="请输入登录账号"/>			
+			</view>
+			<view class="inputWrapper">
+				<view class="pass"></view>
+				<input  class="input"  name="password"  type="password" v-model="password" placeholder-style="font-size:.8125rem;color:rgb(223, 223, 223);display:flex;justify-content: start;" placeholder="请输入密码"/>
+			</view>
+			
+			
+		</view>
+		<button form-type="submit" class="loginBtn" @tap="login">登录</button>
+		</form>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				title: '',
+				username:"",
+				password:"",
+			}
+		},
+		created() {
+			this.getToken()
+		},
+		onLoad() {
+
+		},
+		methods: {
+			async getToken(){
+				let that = this;
+				let data = {
+						"appid": "appdjmmaf0kerwpf",
+						"appSecret": "appu7zpllz1folzsljm498dcpi0lsog1"
+					}
+				await that.$http.httpPost('/foxlibc/getToken',data).then(res => {
+					if(res.code == "0"){
+						that.$storage.setJson('apps',res.returnData);
+					}
+				})
+			},
+			async login () {
+				const apps = this.$storage.getJson("apps")
+				let that = this;
+				let passWordMD5 = this.$md5(that.password)
+				let data = {
+					"app_token": apps.app_token,
+					"username": that.username,
+					"password": passWordMD5
+				}
+				if(data.username==""||data.password==""){
+					uni.showToast({
+						title: '请输入正确账号密码',
+						icon: 'none',
+						duration: 500
+					});
+					return;
+				}
+				await that.$http.httpPost('/foxlibc/sign-in',data).then(res => {
+					if(res.code=="-1"){
+						uni.showToast({
+							title: '用户名或密码错误',
+							icon: 'none',
+							duration: 500
+						});	
+					}
+					else if(res.code=="0"){
+						res.returnData["user_name"] =res.returnData["user_name"]?res.returnData["user_name"]:that.username
+						that.$storage.setJson('users',res.returnData);
+						this.getAuth(res.returnData.user_id);
+					}
+					else{
+						uni.showToast({
+							title: '登录失败请联系管理员',
+							icon: 'none',
+							duration: 5000
+						});	
+					}
+				})
+			},
+			async getAuth(user_id){
+				let data = {"serviceId":2,"dataContent":[{"user_id":user_id}],"page":1,"pageSize":999,"event":"0"}
+				await this.$http.httpPost('/openApi/query',data).then(res => {
+					if(res.code=="0"){
+						let isAPP = res.returnData.filter(function(item){
+							return item.auth_ident==="APP_auth"
+						})
+						if(isAPP.length>0){
+							this.$storage.setJson("authList",res.returnData)
+							uni.switchTab({
+								url: "/pages/index/index"
+							});	
+						}
+						else{
+							this.$storage.remove('users');
+							uni.showToast({
+								title: '该账户没有APP登录权限',
+								icon: 'none',
+								duration: 5000
+							});	
+						}
+					}
+				})
+			}
+
+		}
+	}
+</script>
+<style scoped>
+	.content {
+		background: #377EB4;
+		width: 100vw;
+		height: 100vh;
+		background: url('../../static/bg.png') no-repeat;
+		background-size: 100% 100%;
+	}
+	.avatorWrapper{
+		height: 15vh;
+		width: 100vw;
+		display: flex;
+		justify-content: center;
+		align-items: flex-end;
+	}
+	.avator{
+		width: 200upx;
+		height: 200upx;
+		overflow: hidden;
+	}
+	.avator .img{
+		width: 100%
+	}
+	.name{
+		/* padding: 0 90upx 50upx 90upx; */
+		padding-left: 90upx;
+		color: rgb(255, 255, 255);
+		font-family: Noto Sans SC;
+		font-size: 24px;
+		font-weight: 700;
+	}
+	.form{
+		padding: 0 100upx;
+		margin-top: .625rem;
+	}
+	.inputWrapper{
+		width: 100%;
+		height: 80upx;
+		background: rgba(0, 0, 0, 0);
+		box-sizing: border-box;
+		/* padding: 0 20px; */
+		margin-top: 25px;
+		border-bottom: 1px solid rgb(223, 223, 223);
+		display: flex;
+		align-items: center;
+	}
+	.log{
+		width: .875rem;
+		height: .875rem;
+		background: url('../../static/login.png') no-repeat;
+    background-size: 100% 100%;
+		margin-right: .75rem;
+	}
+	.pass{
+		width: .875rem;
+		height: .875rem;
+		background: url('../../static/mima.png') no-repeat;
+    background-size: 100% 100%;
+		margin-right: .75rem;
+	}
+	.inputWrapper .input{
+		width: 100%;
+		height: 100%;
+		/* text-align: center; */
+		color: rgb(223, 223, 223);
+		font-family: Noto Sans SC;
+		font-size: .8125rem;
+		font-weight: 500;
+
+	}
+	.loginBtn{
+		width: 16.8rem;
+		/* padding: 0 23px 0 23px; */
+    height: 2.5rem;
+		background: linear-gradient(179.11deg, rgba(51,161,165,1.00) 11.422%,rgba(59,111,142,1.00) 118.849%,rgba(59,111,142,1.00) 118.849%,rgba(59,111,142,1.00) 118.849%);
+    border-radius: 2px;
+		margin-top: 50px;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		color: rgb(223, 223, 223);
+		font-family: Noto Sans SC;
+		font-size: 15px;
+		font-weight: 700;
+		
+	}
+	.loginBtn .btnValue{
+		color: white;
+	}
+	.forgotBtn{
+		text-align: center;
+		color: #EAF6F9;
+		font-size: 15px;
+		margin-top: 20px;
+	}
+</style>

+ 152 - 0
pages/message/message.vue

@@ -0,0 +1,152 @@
+<template>
+	<view class="app-content">
+		<view class="title-box">{{navname}}</view>
+
+		<uni-section title="消息列表" type="line" class="box">
+			<uni-list class="messageList">
+				<uni-list-item v-for="(item, index) in msgList" :key="index" :title="item.msg" />
+			</uni-list>
+		</uni-section>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				navname: "消息",
+				msgList: [],
+				msgSJ: null
+			}
+		},
+		onShow() {
+			let that = this;
+			this.$msg.stopMsg()
+			uni.removeTabBarBadge({
+				index: 1
+			})
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/detail/index?luggageNum=" + data.msg
+					})
+				}
+			});
+			this.msgList = this.$storage.getJson('msgList')
+			this.msgList.map(item => {
+				if (item.abnormalState == "DLY") {
+					item['msg'] = item.carrierFlightsDate + ",航班:" + item.carrierFlights +
+						"(" + item.outAirport + "-" + item.landAirport + "),延误"
+				}
+				if (item.abnormalState == "CAN") {
+					item['msg'] = item.carrierFlightsDate + ",航班:" + item.carrierFlights +
+						"(" + item.outAirport + "-" + item.landAirport + "),取消"
+				}
+			})
+			this.msgSJ = setInterval(function() {
+				that.getMsg()
+			}, 3000)
+		},
+		onLoad() {},
+		onUnload() {
+			this.$msg.getMsg()
+			clearInterval(this.msgSJ)
+			uni.$off("scancodemsg");
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+			clearInterval(this.msgSJ)
+		},
+		methods: {
+			getMsg() {
+				let airPort = "CAN"
+				if (this.$storage.get("airportName")) {
+					airPort = this.$storage.get("airportName")
+				}
+				let data = {
+					"serviceId": 3021,
+					"page": 1,
+					"pageSize": 9999,
+					"dataContent": [{
+						"outAirport": airPort
+					}]
+				}
+
+				this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.$storage.setJson('msgList', res.returnData)
+						this.msgList = res.returnData
+						this.msgList.map(item => {
+							if (item.abnormalState == "DLY") {
+								item['msg'] = item.carrierFlightsDate + ",航班:" + item.carrierFlights +
+									"(" + item.outAirport + "-" + item.landAirport + "),延误"
+							}
+							if (item.abnormalState == "CAN") {
+								item['msg'] = item.carrierFlightsDate + ",航班:" + item.carrierFlights +
+									"(" + item.outAirport + "-" + item.landAirport + "),取消"
+							}
+						})
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "查询信息失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			scan() {
+				uni.scanCode({
+					onlyFromCamera: true,
+					success: function(res) {
+						if (res.result.length > 9) {
+							uni.navigateTo({
+								url: "/pages/detail/index?luggageNum=" + res.result
+							})
+						}
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		background: rgb(49, 85, 99);
+		padding-top: 3.6rem;
+		box-sizing: border-box;
+		height: 100vh;
+
+		>.title-box {
+			width: 100%;
+			height: 2.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			padding-top: 1.25rem;
+			color: rgb(255, 255, 255);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 1000;
+		}
+		>.box{
+			width: 100%;
+			height:calc(100vh - 3rem);
+			overflow-x: hidden;
+			overflow-y: auto;
+			// >.messageList {
+			// 	width: 100%;
+			// 	height:calc(100% - 1rem);
+			// 	overflow-x: hidden;
+			// 	overflow-y: auto;
+			// }
+		}
+		
+	}
+</style>

+ 536 - 0
pages/mypage/index.vue

@@ -0,0 +1,536 @@
+<template>
+	<view class="app-content">
+		<img src="static/beijing.png" alt="" class="tuku">
+		<!-- <Nav :navname.sync="navname" :navtype="false" :navtypes="true" :index="index"></Nav> -->
+		<view class="cont" style="margin-top: 3rem;">
+			<view class="photograph" @tap="upindiv">
+				<img src="static/shuai.png" alt="">
+			</view>
+			<view class="details">
+				<p>{{$storage.getJson("users").user_name?$storage.getJson("users").user_name:""}}</p>
+				<span>工号:{{$storage.getJson("users").user_id?$storage.getJson("users").user_id:""}}</span>
+			</view>
+			<view class="detail_list">
+				<view class="list_child" @tap="recup('SORT')">
+					<p>分拣</p>
+					<span>{{SORTCount}}</span>
+				</view>
+				<view class="list_child" @tap="recup('LOAD')">
+					<p>装车</p>
+					<span>{{LOADCount}}</span>
+				</view>
+				<view class="list_child" @tap="recup('INFL')">
+					<p>装机</p>
+					<span>{{INFLCount}}</span>
+				</view>
+				<view class="list_child" @tap="recup('UNLOAD')">
+					<p>卸机</p>
+					<span>{{UNLOADCount}}</span>
+				</view>
+				<view class="list_child" @tap="recup('ARRIVED')">
+					<p>到达</p>
+					<span>{{ARRIVEDCount}}</span>
+				</view>
+				<view class="list_child" @tap="recup('extract')">
+					<p>提取</p>
+					<span>{{extractCount}}</span>
+				</view>
+			</view>
+			<view class="detail_type">
+				<view class="list_child" @tap="recup()">
+					<view class="log bg1"></view>
+					<p>我的记录</p>
+				</view>
+				<view class="list_child" @tap="uppop">
+					<view class="log bg2"></view>
+					<p>扫码开关</p>
+				</view>
+				<view class="list_child" @tap="uppops">
+					<view class="log bg3"></view>
+					<p>工作方式</p>
+				</view>
+				<view class="list_child" @tap="uphelp">
+					<view class="log bg4"></view>
+					<p>帮助</p>
+				</view>
+			</view>
+		</view>
+		<z-popup v-model="all">
+			<view class="popup_title">
+				<p>请选择扫码开关</p>
+			</view>
+			<view class="popup_content">
+				<ul>
+					<li v-for="(item, index) in list" :key="index" @tap="()=>selectup(index)">
+						<p>{{item.name}}</p>
+						<view class="start" v-if="action === index ? true: false">
+							<img src="static/gou.png" alt="">
+						</view>
+					</li>
+				</ul>
+				<view class="top"></view>
+				<view class="cancel" @tap="()=>topup()">取消</view>
+			</view>
+		</z-popup>
+		<z-popup v-model="allshow">
+			<view class="popup_title">
+				<p>请选择工作方式</p>
+			</view>
+			<view class="popup_content">
+				<ul>
+					<li v-for="(item, index) in lists" :key="index" @tap="()=>selectup2(index)">
+						<p>{{item.name}}</p>
+						<view class="start" v-if="action2 === index ? true: false">
+							<img src="static/gou.png" alt="">
+						</view>
+					</li>
+				</ul>
+				<view class="top"></view>
+				<view class="cancel" @tap="()=>topup()">取消</view>
+			</view>
+		</z-popup>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	// import Popup from '../../uni_modules/z-popup/components/z-popup'
+	export default {
+		data() {
+			return {
+				SORTCount: 0,
+				LOADCount: 0,
+				INFLCount: 0,
+				UNLOADCount: 0,
+				ARRIVEDCount: 0,
+				extractCount: 0,
+				main: null,
+				poll: null,
+				filter: null,
+				pusher: null,
+				intentServer: null,
+				navname: '我的',
+				all: false,
+				allshow: false,
+				action: 0,
+				action2: 0,
+				index: 0,
+				list: [{
+						name: '激光扫描枪'
+					},
+					{
+						name: 'RFID读取器'
+					}
+				],
+				lists: [{
+						name: '单次扫描'
+					},
+					{
+						name: '连续扫描'
+					}
+				]
+			}
+		},
+		created(option) {},
+		onLoad() {},
+		onUnload() {
+			uni.$off("scancodemsg");
+		},
+		onShow() {
+			// uni.hideTabBar()//关闭导航栏
+			// uni.showTabBar()//显示导航栏
+			this.action = this.$storage.get("device")?Number(this.$storage.get("device")):0
+			this.$devapi.TYPE_DEV_JQHWGEVIQUWVILBE = this.action
+			this.action2 = this.$storage.get("times")?Number(this.$storage.get("times")):0
+			this.$devapi.RFIDIntervalTime = this.action2
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/detail/index?luggageNum=" + data.msg
+						// url: "/pages/detail/index?luggageNum=3999483183"
+					})
+				}
+			});
+			if (this.$storage.get('airport')) {
+				this.index = this.$storage.get('airport')
+			}
+			this.SORTCount = 0;
+			this.LOADCount = 0;
+			this.INFLCount = 0;
+			this.UNLOADCount = 0;
+			this.ARRIVEDCount = 0;
+			this.extractCount = 0;
+			if (this.$storage.getJson("users").user_name) {
+				this.$nextTick(e=>{
+					this.getDataCount()
+				})
+			}
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {},
+		components: {
+			Nav
+		},
+		watch: {
+			allshow() {
+				if (this.allshow) {
+					uni.hideTabBar({})
+				} else {
+					uni.showTabBar()
+				}
+			},
+			all() {
+				if (this.all) {
+					uni.hideTabBar({})
+				} else {
+					uni.showTabBar()
+				}
+			}
+		},
+		methods: {
+			async getDataCount() {
+				let data = {
+					"serviceId": 3018,
+					"dataContent": [{
+							"agentNumber": this.$storage.getJson("users").user_name
+						}
+					]
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						res.returnData.map(item => {
+							if(item.nodeCode == "SORT"){
+								this.SORTCount = item.total
+							}
+							if(item.nodeCode == "LOAD"){
+								this.LOADCount = item.total
+							}
+							if(item.nodeCode == "INFL"){
+								this.INFLCount = item.total
+							}
+							if(item.nodeCode == "UNLOAD"){
+								this.UNLOADCount = item.total
+							}
+							if(item.nodeCode == "ARRIVED"){
+								this.ARRIVEDCount = item.total
+							}
+							if(item.nodeCode == "extract"){
+								this.extractCount = item.total
+							}
+						})
+					}
+					else{
+						uni.showToast({
+							icon:'none',
+							title: "查询信息失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			recup(type) {
+				if(type){
+					uni.navigateTo({
+						url: "/pages/myrecords/index?nodeCode="+type
+					})
+				}
+				else{
+					uni.navigateTo({
+						url: "/pages/myrecords/index"
+					})
+				}
+			},
+			fall() {
+				uni.redirectTo({
+					url: "/pages/index/index"
+				})
+			},
+			upindiv() {
+				uni.navigateTo({
+					url: "/pages/individual/index"
+				})
+			},
+			uphelp() {
+				uni.navigateTo({
+					url: "/pages/help/index"
+				})
+			},
+			uppop() {
+				uni.hideTabBar({})
+				this.all = true
+			},
+			uppops() {
+				uni.hideTabBar({})
+				this.allshow = true
+			},
+			selectup(index) {
+				this.$devapi.TYPE_DEV_JQHWGEVIQUWVILBE = Number(index)
+				this.$storage.set("device",index)
+				this.action = index
+				if(Number(index) == 0){ 
+					uni.showToast({
+						icon:'none',
+						title: "切换激光扫描枪",
+						duration: 3000
+					});
+					this.$storage.set("times",0)
+					this.action2 = 0
+					this.$devapi.RFIDIntervalTime = 0
+				}
+				else{
+					uni.showToast({
+						icon:'none',
+						title: "切换RFID读取器",
+						duration: 3000
+					});
+				}
+			},
+			selectup2(index) {
+				if(Number(this.$storage.get("device")) == 0 && Number(index)==1){
+					uni.showToast({
+						icon:'none',
+						title: "激光扫描枪不支持多扫",
+						duration: 3000
+					});
+				}
+				else{
+					if(Number(index)==1){
+						uni.showToast({
+							icon:'none',
+							title: "切换为多扫",
+							duration: 3000
+						});
+					}
+					else{
+						uni.showToast({
+							icon:'none',
+							title: "切换为单扫",
+							duration: 3000
+						});
+					}
+					this.$storage.set("times",index)
+					this.action2 = index
+					this.$devapi.RFIDIntervalTime = this.action2
+				}
+			},
+			topup() {
+				this.all = false
+				this.allshow = false
+				uni.showTabBar() //显示导航栏
+			}
+		},
+	}
+</script>
+<style lang="scss" scoped>
+	.app-content {
+
+		// position: relative;
+		>.tuku {
+			position: absolute;
+			z-index: -1;
+			width: 100%;
+			top: 0;
+		}
+
+		>.cont {
+			z-index: 999;
+
+			>.photograph {
+				width: 6rem;
+				height: 6rem;
+				// background: red;
+				border-radius: 50%;
+				margin: 0 auto;
+				margin-top: .625rem;
+			}
+
+			>.details {
+				width: 100%;
+				height: 3.125rem;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				// background: red;
+				margin-top: .625rem;
+
+				>p {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					font-weight: 500;
+				}
+
+				>span {
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: .8125rem;
+					font-weight: 500;
+				}
+			}
+
+			>.detail_list {
+				width: 100%;
+				// background: red;
+				display: flex;
+				flex-wrap: wrap;
+				margin-top: 1rem;
+
+				>.list_child {
+					width: 33%;
+					display: flex;
+					flex-direction: column;
+					justify-items: center;
+					align-items: center;
+					margin-bottom: 1rem;
+
+					>p {
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: .8125rem;
+						font-weight: 500;
+					}
+
+					>span {
+						color: rgb(255, 255, 255);
+						font-family: Helvetica;
+						font-size: 1rem;
+						font-weight: 700;
+					}
+				}
+
+			}
+
+			>.detail_type {
+				height: calc(100vh - 35.875rem);
+				padding: 0 3.125rem 0 3.125rem;
+				display: flex;
+				justify-content: space-around;
+				flex-wrap: wrap;
+				flex: 1;
+
+				>.list_child {
+					width: 7.5rem;
+					height: 7.5rem;
+					background: linear-gradient(188.06deg, rgba(65.49, 109.04, 128.64, 1.00) 3.551%, rgba(38, 68.32, 81.96, 1.00) 110.878%);
+					box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+					border-radius: 4px;
+					margin-bottom: 4%;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					align-items: center;
+
+					>.log {
+						width: 2.25rem;
+						height: 2.25rem;
+						// background: rgb(196, 196, 196);
+						margin-bottom: .5rem;
+					}
+
+					.bg1 {
+						background: url('../../static/jilu.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					.bg2 {
+						background: url('../../static/kaiguan.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					.bg3 {
+						background: url('../../static/gongzuo.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					.bg4 {
+						background: url('../../static/bagzu.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					>p {
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: .9375rem;
+						font-weight: 500;
+					}
+				}
+			}
+		}
+
+		.popup_title {
+			width: 100%;
+			height: 4.5rem;
+			background: rgb(255, 255, 255);
+			border-radius: 10px 10px 0px 0px;
+			display: flex;
+			align-items: center;
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			font-weight: 700;
+
+			>p {
+				margin-left: 1.5rem;
+				color: rgb(16, 17, 22);
+				font-family: Noto Sans SC;
+				font-size: 1rem;
+				font-weight: 700;
+			}
+
+		}
+
+		.popup_content {
+			width: 100%;
+			background: rgb(255, 255, 255);
+
+			>ul {
+				width: 100%;
+
+				>li {
+					width: 82%;
+					height: 2.6875rem;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+
+					>p {
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: .8125rem;
+						font-weight: 400;
+					}
+
+					>.start {
+						width: 1rem;
+						height: 1rem;
+						background: rgb(37, 121, 160);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						border-radius: 50%;
+					}
+				}
+			}
+
+			>.top {
+				width: 100%;
+				height: .875rem;
+				background: rgb(249, 249, 249);
+			}
+
+			>.cancel {
+				width: 100%;
+				height: 3.3125rem;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				color: rgb(0, 0, 0);
+				font-family: Noto Sans SC;
+				font-size: .9375rem;
+				font-weight: 500;
+			}
+		}
+	}
+</style>

+ 339 - 0
pages/myrecords/index.vue

@@ -0,0 +1,339 @@
+<template>
+	<view class="app-content">
+		<view class="header">
+			<view class="log" @tap="fall"></view>{{ navname }}
+		</view>
+		<view class="nav">
+			<view :class="action === index ? 'nav_lists': 'nav_list'" v-for="(item, index) in list" :key="index"
+				@tap="lop(index)">{{item.name}}</view>
+		</view>
+		<view class="content">
+			<view class="content_bootom" style="top:0">
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view class="up" v-for="(item, index) in listdata" :key="index">
+						<view class="list"  @tap="toDetail(item.luggageNum)">
+							<p>{{ item.luggageNum }}</p>
+						</view>
+						<view class="normal">
+							{{item.carrierFlightsDate!=null?item.carrierFlightsDate:"-"}}
+						</view>
+						<view class="normal">
+							{{item.carrierFlights!=null?item.carrierFlights:"-"}}
+						</view>
+						
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	export default {
+		data() {
+			return {
+				navname: '我的记录',
+				action: 0,
+				list: [{
+					name: '分拣',
+					type: 'SORT'
+				}, {
+					name: '装车',
+					type: 'LOAD'
+				}, {
+					name: '装机',
+					type: 'INFL'
+				}, {
+					name: '卸机',
+					type: 'UNLOAD'
+				}, {
+					name: '到达',
+					type: 'ARRIVED'
+				}, {
+					name: '提取',
+					type: 'extract'
+				}],
+				listdata: [],
+				nodeCode:null
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			if(option.nodeCode){
+				this.list.map((item,index) =>{
+					if(item.type==option.nodeCode){
+						this.action = index
+					}
+				})
+				this.nodeCode = option.nodeCode
+				this.getList()
+			}
+			else{
+				this.nodeCode = this.list[this.action].type
+				this.getList()
+			}
+		},
+		onUnload() {},
+		onShow() {
+			if(this.nodeCode){
+				this.getList()
+			}
+		},
+		mounted() {},
+		components: {
+			Nav
+		},
+		methods: {
+			uplist() {
+				uni.redirectTo({
+					url: "/pages/loadingdetails/index"
+				})
+			},
+			lop(index) {
+				this.action = index
+				this.nodeCode = this.list[index].type
+				this.getList()
+			},
+			async getList() {
+				let data = {
+					"serviceId": 3008,
+					"page": 1,
+					"pageSize": 9999,
+					"dataContent": [{
+						"agentNumber": this.$storage.getJson("users").user_name,
+						"nodeCode": this.nodeCode
+					}]
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						this.listdata = res.returnData
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "查询信息失败",
+							duration: 5000
+						});
+					}
+				})
+			},
+			toDetail(luggageNum){
+				uni.navigateTo({
+					url: "/pages/detail/index?luggageNum="+luggageNum
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta:1
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		height: 100vh;
+		overflow: hidden;
+		>.header {
+			width: 100%;
+			height: 4.375rem;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			// background: rgba(49,85,99,1);
+			color: rgb(16, 17, 22);
+			font-family: Noto Sans SC;
+			font-size: 1rem;
+			position: relative;
+
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+
+			>.up {
+				width: .8456rem;
+				height: .8456rem;
+				position: absolute;
+				right: 1.5rem;
+				background: url('../../static/search.png') no-repeat;
+				background-size: 100% 100%;
+				// color: rgb(37, 121, 160);
+				// font-family: Noto Sans SC;
+				// font-size: .875rem;
+				// font-weight: 500;
+			}
+		}
+
+		>.nav {
+			height: 2rem;
+			display: flex;
+			align-items: center;
+			padding: 0 .75rem 0 .75rem;
+
+			>.nav_list {
+				margin: 0 .75rem 0 .75rem;
+				color: rgb(16, 17, 22);
+				font-family: Noto Sans SC;
+				font-size: 14px;
+				height: 100%;
+			}
+
+			>.nav_lists {
+				margin: 0 .75rem 0 .75rem;
+				color: rgb(37, 121, 160);
+				font-family: Noto Sans SC;
+				font-size: 14px;
+				font-size: 14px;
+				height: 100%;
+				border-bottom: 2px solid rgb(37, 121, 160);
+			}
+		}
+
+		>.content {
+			width: 100%;
+			height: calc(100vh - 3.5rem);
+			position: relative;
+			// margin-top: 2.5rem;
+			// overflow: hidden;
+			// background: rgb(49, 85, 99);
+			>.content_top {
+				width: 100%;
+				// background: rgb(49, 85, 99);
+				padding-bottom: 1.3125rem;
+
+				>.craid {
+					// width: 100%;
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: space-between;
+					flex-wrap: wrap;
+					align-items: center;
+
+					>.craid_data {
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: start;
+
+						>p {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 18px;
+							font-weight: 700;
+						}
+
+						>span {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+						}
+					}
+
+					>.aircraft {
+						width: 1.75rem;
+						height: 1.75rem;
+						background: url('../../static/hang.png') no-repeat;
+						background-size: 100% 100%;
+					}
+				}
+			}
+
+			>.content_bootom {
+				width: 100%;
+				// height: calc(100vh - 20.9375rem - 4.375rem);
+				padding-bottom: 0;
+				position: absolute;
+				bottom: 0;
+				top: 20.75rem;
+				// border-radius: 6px 6px 0px 0px;
+				overflow: hidden;
+				background: rgb(255, 255, 255);
+				padding: 0 10px;
+				box-sizing: border-box;
+				padding-left: 1rem;
+				.up {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					border-bottom: 1px solid rgb(238, 238, 238);
+					box-sizing: border-box;
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+					
+					>.error{
+						color:red
+					}
+					>.normal{
+						color:#4682b4 
+					}
+					>.list {
+						position: relative;
+						height: 3rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+				
+					>.delete {
+						width: 3.75rem;
+						height: 3.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: -3.75rem;
+						transform: all 3s;
+				
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+				
+				.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					height: calc(100% - 2.5rem - 2.75rem);
+				}
+
+				.but {
+					width: 20.5625rem;
+					height: 2.5rem;
+					background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+					border-radius: .25rem;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					margin: 0 auto;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-top: 0.25rem;
+					margin-bottom: 2.25rem;
+				}
+			}
+		}
+	}
+</style>

+ 357 - 0
pages/search/index.vue

@@ -0,0 +1,357 @@
+<template>
+	<view class="app-content">
+		<view class="nav">
+			<liu-search @fall="fall" @input="input" @change="change"
+				@changes='changes'></liu-search>
+		</view>
+		<view class="title">
+			<!-- <view class="date">
+				<uni-datetime-picker type="date" :clear-icon="false" v-model="date" @change="maskClick" />
+			</view> -->
+			<view class="inOut">
+				<uni-data-checkbox v-model="inOut" :localdata="inOutList" @change="inOutChange"></uni-data-checkbox>
+			</view>
+		</view>
+		 <scroll-view  class="content" scroll-y="true" @scrolltolower="scrolltolower">
+			 <!-- <view class="craid" v-for="(item,index) in flightList" :key="index"  @tap="toIndex(item)">
+			 	<view class="craid_data">
+			 		{{item.carrierFlights}}
+			 	</view>
+				<view class="craid_data">
+					{{item.carrierFlightsDate}}
+				</view>
+			 </view> -->
+			 <uni-list>
+			 	<uni-list-item  v-for="(item,index) in flightList" :key="index" :clickable= 'true'  @click="toIndex(item)">
+					<template v-slot:body>
+						<view style="display: flex;flex-direction: row;justify-content: space-between;">
+							<view style="margin-right: 30px;width: 80px;">{{item.carrierFlights}}</view>
+							<view style="margin-right: 30px;width: 90px;">{{item.outAirport}} - {{item.landAirport}}</view>
+							<view>{{item.carrierFlightsDate}}</view>
+						</view>
+					</template>
+				</uni-list-item>
+			 </uni-list>
+		 </scroll-view>
+		<!-- <view class="content" v-if="flightList.length">
+			<button class="craid" v-for="(item,index) in flightList" :key="index"  @tap="toIndex(item)">
+				<view class="craid_data">
+					<p>{{item.carrierFlights}}</p>
+					<span>{{item.carrierFlightsDate}}</span>
+				</view>
+				<view class="craid_data">
+					<p>{{item.outAirport}}</p>
+					<span>{{item.scheduleTakeOffTime}}</span>
+				</view>
+				<view class="aircraft">To</view>
+				<view class="craid_data">
+					<p>{{item.landAirport}}</p>
+					<span>{{item.scheduleLandInTime}}</span>
+				</view>
+			</button>
+		</view> -->
+		<!-- 提示信息和下拉弹窗 -->
+		<mask-model :headername="headername" :typeShow="typeShow" :tabname="tabname" ref="showMask" btnType="1"
+			@confirm="confirm" @cancel="cancel" titleColoe="#666666" cancelColor="#666666" confirmColor="#007AFF"
+			:maskTitle="maskTitle"></mask-model>
+	</view>
+</template>
+<script>
+	import Nav from '../../components/header/nav.vue'
+	import maskModel from '../../components/mask-model/mask-model.vue'
+	import {
+		Format
+	} from '@/components/utils/validate'
+	export default {
+		data() {
+			return {
+				// date:null,
+				historyList: [],
+				maskTitle: '请核对录入的航班号或行李号是否正确',
+				tabname: '', //按钮名称
+				typeShow: true,
+				headername: '请核对信息',
+				value:null,
+				flightList:[],
+				inOut:1,
+				inOutList: [ {
+					text: '离港',
+					value: 1
+				}, {
+					text: '进港',
+					value: 2
+				}],
+				page:1
+			}
+		},
+		created(option) {},
+		onLoad() {},
+		onUnload() {uni.$off("scancodemsg");},
+		onShow() {
+			// this.date = this.datatime()
+			uni.$on("scancodemsg", (data) => {
+				if (data.msg.length > 9) {
+					uni.navigateTo({
+						url: "/pages/detail/index?luggageNum=" + data.msg
+					})
+				}
+			});
+			this.getDataList()
+		},
+		onHide() {uni.$off("scancodemsg");},
+		mounted() {
+		},
+		components: {
+			Nav
+		},
+		methods: {
+			// maskClick(e){
+			// 	console.log(e)
+			// },
+			inOutChange(){
+				this.page = 1;
+				this.flightList = [];
+				this.getDataList();
+			},
+			scrolltolower(){
+				this.getDataList()
+			},
+			toIndex(item){
+				this.$storage.setJson('searchData',item);
+				// this.$storage.set('flightDate',item.carrierFlightsDate);
+				uni.switchTab({
+					url: "/pages/index/index"
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			changes() {
+				//     uni.redirectTo({
+				// 	url: "/pages/myrecords/index"
+				// })
+			},
+			//搜索内容
+			change(e) {
+				this.value = e
+				this.typeShow = false
+				this.maskTitle = '请核对录入的航班号或行李号是否正确'
+				this.headername = '请核对信息'
+				this.$refs.showMask.show();
+			},
+			confirm: function() { //确定按钮
+				if(this.value.length>9){
+					uni.navigateTo({
+						url: "/pages/detail/index?luggageNum=" + Number(this.value)
+					})
+				}
+				else if(this.value.length<=9 && this.value.length>0){
+					this.getFlightData(this.value)
+					this.cancel()
+				}
+				else{
+					this.flightList = [];
+					this.page = 1;
+					this.getDataList()
+				}
+			},
+			async getFlightData(num) {
+				let data = {
+					"serviceId": 3000,
+					"page": 1,
+					"pageSize": 20,
+					"dataContent": [{
+						"carrierFlights":num
+					}],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length>0) {
+						this.$storage.remove('searchData')
+						this.$storage.remove('flightDate');
+						if(res.returnData.length==1){
+							if(res.returnData[0].scheduleTakeOffTime){
+								res.returnData[0].scheduleTakeOffTime = res.returnData[0].scheduleTakeOffTime.split("T")[1]
+							}
+							if(res.returnData[0].scheduleLandInTime){
+								res.returnData[0].scheduleLandInTime = res.returnData[0].scheduleLandInTime.split("T")[1]
+							}
+							this.$storage.setJson('searchData',res.returnData[0]);
+							uni.switchTab({
+								url: "/pages/index/index"
+							})
+						}
+						else {
+							this.flightList = res.returnData
+							this.flightList.map(item => {
+								if(item.scheduleTakeOffTime){
+									item.scheduleTakeOffTime = item.scheduleTakeOffTime.split("T")[1]
+								}
+								else{
+									item.scheduleTakeOffTime = "-"
+								}
+								if(item.scheduleLandInTime){
+									item.scheduleLandInTime = item.scheduleLandInTime.split("T")[1]
+								}
+								else{
+									item.scheduleLandInTime = "-"
+								}
+							})
+						}
+					}
+					else if(res.code == "0" && res.returnData.length==0){
+						uni.showToast({
+							icon:'none',
+							title: "没有更多信息",
+							duration: 5000
+						});
+					}
+					else{
+						this.$scanAudio.src = "../../static/hqhb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon:'none',
+							title: "无此航班号信息,请确认航班号",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async getDataList(){
+				let data = {
+					"serviceId": 3010,
+					"page": this.page,
+					"pageSize": 20,
+					"dataContent": [{
+					}],
+					"event": "0"
+				}
+				if(this.inOut == 1){
+					data.dataContent = [{
+						"outAirport": this.$storage.get("airportName")
+					}]
+				}
+				else{
+					data.dataContent = [{
+						"landAirport": this.$storage.get("airportName")
+					}]
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length>0) {
+						this.$storage.remove('searchData')
+						this.$storage.remove('flightDate');
+						let list = res.returnData
+						list.map(item => {
+							if(item.scheduleTakeOffTime){
+								item.scheduleTakeOffTime = item.scheduleTakeOffTime.split("T")[1]
+							}
+							else{
+								item.scheduleTakeOffTime = "-"
+							}
+							if(item.scheduleLandInTime){
+								item.scheduleLandInTime = item.scheduleLandInTime.split("T")[1]
+							}
+							else{
+								item.scheduleLandInTime = "-"
+							}
+							this.flightList.push(item)
+						})
+						this.page++
+					}
+				})
+			},
+			cancel(){},
+			//input事件
+			input(e) {
+				console.log('搜索框输入的内容:' + e)
+				if(e.length==0){
+					this.flightList = [];
+					this.page = 1;
+					this.getDataList()
+				}
+			},
+			datatime() {
+				let dataTime = Format("yyyy-MM-dd", new Date());
+				return dataTime
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		height:100vh;
+		overflow: hidden;
+		>.nav {
+			width: 100%;
+			position: relative;
+			display: flex;
+			margin-top: 1.875rem;
+			height: 3.5rem;
+			>.log {
+				width: .375rem;
+				height: .75rem;
+				font-size: .75rem;
+				position: absolute;
+				left: 1.5rem;
+				background: url('../../static/ico@1x.png') no-repeat;
+				background-size: 100% 100%;
+			}
+		}
+		>.title{
+			height: 3rem;
+			padding: 0 35px;
+			box-sizing: border-box;
+			>.date{
+				margin-bottom: 15px;
+			}
+		}
+		>.content{
+			height: calc(100vh - 9.5rem);
+			>.craid {
+				// width: 100%;
+				border-radius: 0!important;
+				border-color: none;
+				border: none;
+				z-index: 10;
+				height: 5.625rem;
+				padding: 0 2.5625rem 0 2.5625rem;
+				display: flex;
+				justify-content: space-between;
+				flex-wrap: wrap;
+				align-items: center;
+				border-bottom: 1px solid rgba(59, 111, 142, 1.00);
+				>.craid_data {
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					align-items: start;
+			
+					>p {
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 18px;
+						font-weight: 700;
+					}
+			
+					>span {
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 13px;
+						font-weight: 500;
+					}
+				}
+			
+				>.aircraft {
+					width: 1.75rem;
+					height: 1.75rem;
+					background: url('../../static/hang.png') no-repeat;
+					background-size: 100% 100%;
+				}
+			}
+		}
+		
+	}
+</style>

+ 1052 - 0
pages/sorting/index.vue

@@ -0,0 +1,1052 @@
+<template>
+	<view class="app-content">
+		<!-- <img src="../../static/beijing.png" alt="" class="tuku"> -->
+		<Navs :navname.sync="navname" @fall="fall" :index='index'></Navs>
+		<view class="content">
+			<flightInfo :flightDetail="flightDetail" :isSite="pagename" :site="stratvalue" :containerNo="container_ID" :passenger_cabin="passenger_cabin" :luggageNo="currentLuggageNum" @setVal='setVal'></flightInfo>
+			<view class="content_bootom" :style="{top:dataheight}">
+				<view class="choice">
+					<view :class="action === true ?'handle':'handles'" @tap="clicker(true)">已处理/{{listdate1.length}}件
+					</view>
+					<view :class="action !== true ?'handle':'handles'" @tap="clicker(false)">未处理/{{listdate2.length}}件
+					</view>
+				</view>
+				<scroll-view scroll-y="true" class="scroll-Y">
+					<view v-if="action === true" :class="item.types ? 'ups':'up'" v-for="(item, index) in listdate1"
+						:key="index">
+						<view class="list" @tap="toDetail(item.luggageNum)">{{ item.luggageNum }}</view>
+						<view class="normal" @tap="toDetail(item.luggageNum)">
+							{{item.specialType!=null?specialTypeList[item.specialType]:" "}}
+						</view>
+						<view :class="item.abnormalType!=null?'error':'normal'" @tap="toDetail(item.luggageNum)">
+							{{item.abnormalType!=null?item.abnormalName:"正常"}}</view>
+						<view class="down_up" v-if="pagename == 'LOAD' && item.abnormalType!='OFF' && item.abnormalType!='POFF'"
+							@tap="up(item,index)"></view>
+						<view class="delete" v-if="pagename == 'LOAD' && item.abnormalType!='OFF' && item.abnormalType!='POFF'">
+							<view class="log" @click="()=>up(item,index)"></view>
+						</view>
+					</view>
+					<view v-if="action !== true" :class="item.types ? 'ups':'up'" v-for="(item, index) in listdate2"
+						:key="index" @tap="toDetail(item.luggageNum)">
+						<view class="list" >{{ item.luggageNum }}</view>
+						<view class="normal">
+							{{item.specialType!=null?specialTypeList[item.specialType]:" "}}
+						</view>
+						<view :class="item.abnormalType!=null?'error':'normal'">
+							{{item.abnormalType!=null?item.abnormalName:"正常"}}</view>
+					</view>
+				</scroll-view>
+				<view class="but" v-if="!action&&listdate2.length>0" @tap="clickOrder">一键处理</view>
+			</view>
+		</view>
+		<!-- 提示信息和下拉弹窗 -->
+		<mask-model :headername="headername" :typeShow="typeShow" :tabname="tabname" ref="showMask" btnType="1"
+			@confirm="confirm" @next="next" @load="load" @cancel="cancel" titleColoe="#666666" cancelColor="#666666"
+			confirmColor="#007AFF" :maskTitle="maskTitle"></mask-model>
+		<!-- 一键弹窗 -->
+		<mask-model :headername="headername" :typeShow="typeShow" ref="showMask2" btnType="1" @confirm="confirm2"
+			@cancel="cancel" titleColoe="#666666" cancelColor="#666666" confirmColor="#007AFF"
+			:maskTitle="maskTitle2"></mask-model>
+		<!-- 航班开始操作弹窗 -->
+		<mask-model :headername="headername" :typeShow="typeShow" ref="showMask3" btnType="1" @confirm="confirm3"
+			@cancel="cancel3" titleColoe="#666666" cancelColor="#666666" confirmColor="#007AFF"
+			:maskTitle="maskTitle3"></mask-model>
+	</view>
+</template>
+
+<script>
+	import Navs from '../../components/header/navs.vue'
+	import maskModel from '../../components/mask-model/mask-model.vue'
+	import flightInfo from '@/components/flightInfo/flightInfo.vue'
+	import {
+		Format
+	} from '@/components/utils/validate'
+	export default {
+		data() {
+			return {
+				isShow: true,
+				dataheight: '15.5rem',
+				scrollTop: 0,
+				input: '',
+				arr: [],
+				navname: '',
+				action: true,
+				listdate: [],
+				listdate1: [],
+				loadNumber: 0,
+				listdate2: [],
+				startData: {
+					clientX: 0,
+					clientY: 0
+				},
+				stratvalue: '', //开始位置
+				container_ID: '',//容器编号
+				passenger_cabin:'',//仓位号
+				endvalue: '', //结束位置
+				maskTitle: '该行李不属于当前航班,请选择处理方式。',
+				maskTitle2: "",
+				maskTitle3: "",
+				tabname: '', //航班名称
+				typeShow: true,
+				headername: '提示信息',
+				flightNO: "null",
+				flightDate: null,
+				outAirport:null,
+				landAirport:null,
+				onFlightDate: null,
+				flightDetail: {},
+				index: 0,
+				currentLuggageNum: null,
+				pagename: "",
+				currentLuggage: null,
+				currentIndex: null,
+				abnormalList: [{
+						"type": null,
+						"name": "无"
+					},
+					{
+						"type": "NAL",
+						"name": "未授权装载"
+					},
+					{
+						"type": "OFF",
+						"name": "已卸载"
+					},
+					{
+						"type": "PFF",
+						"name": "预卸载"
+					},
+					{
+						"type": "UNS",
+						"name": "未找到"
+					},
+					{
+						"type": "OND",
+						"name": "在场未装载,未授权"
+					},
+					{
+						"type": "ONA",
+						"name": "在场未装载,已授权"
+					}
+				],
+				oldRfidList: [],
+				specialTypeList:{
+					"AVIH":"装笼动物",
+					"CREW":"机组行李",
+					"RFAG":"易碎行李",
+					"HVY":"重型行李",
+					"PRIO":"优先行李",
+					"RUSH":"无人行李",
+					"SCON":"急转行李",
+					"SPEQ":"运动装备",
+					"VIP":"VIP行李",
+					"WCHR":"轮椅",
+					"WFAP":"武器枪支",
+					"SJ05":"到港行李破损",
+					"SJ34":"超大柜台接收",
+				}
+			}
+		},
+		created(option) {},
+		onLoad(option) {
+			this.pagename = option.item
+			this.flightNO = option.flightNO
+			this.flightDate = option.date
+			this.outAirport  = option.outAirport 
+			this.landAirport  = option.landAirport 
+			this.getNode()
+			switch (this.pagename) {
+				case "SORT":
+					this.navname = "分拣"
+					break;
+				case "LOAD":
+					this.navname = "装车"
+					break;
+				case "INFL":
+					this.navname = "装机"
+					break;
+				case "UNLOAD":
+					this.navname = "卸机"
+					break;
+				case "ARRIVED":
+					this.navname = "到达"
+					break;
+				case "RETURN":
+					this.navname = "退运"
+					break;
+				default:
+					break;
+			}
+			if (this.flightNO != "null" && this.flightNO) {
+				this.getFlightData()
+			}
+			console.log("onLoad")
+		},
+		onUnload() {
+			uni.$off("scancodemsg");
+			if(this.$devapi.RFIDIntervalTime!=0){
+				this.$devapi.RFIDStopInventory()
+				this.$devapi.ISRFIDOPEN = false
+			}
+		},
+		onShow() {
+			uni.$on("scancodemsg", (data) => {
+				// data.msg = '0089580761'
+				if (data.msg.trim().length > 9) {
+					this.currentLuggageNum = data.msg.trim()
+					this.getluggage(this.currentLuggageNum, true)
+				}
+				if (data.msg.trim().length < 9) {
+					this.container_ID = data.msg.trim()
+				}
+			});
+			uni.$on("scancodeList", (data) => {
+				// data.msg = ['0089580818','0089580819','0089580820', '0089580783', '0089580816']
+				if (this.flightNO == "null" && data.msg.length > 0) {
+					this.currentLuggageNum = data.msg[0].trim()
+					this.getluggage(this.currentLuggageNum, true)
+					this.$devapi.RFIDStopInventory()
+					this.$devapi.ISRFIDOPEN = false
+				} else if (this.flightNO && data.msg.length > 0) {
+					data.msg.map(item => {
+						if (_.findIndex(this.listdate1, function(o) {
+								return o.luggageNum == item
+							}) < 0) {
+							if (item.trim().length > 9) {
+								this.currentLuggageNum = item.trim()
+								this.getluggage(this.currentLuggageNum, true)
+							}
+						}
+					})
+				}
+			});
+			if (this.$storage.getJson('airport')) {
+				this.index = this.$storage.getJson('airport')
+			}
+			if (this.flightNO != "null" && this.flightNO) {
+				this.getFlightData()
+			}
+			console.log("onShow")
+		},
+		onHide() {
+			uni.$off("scancodemsg");
+		},
+		mounted() {
+			// this.$refs.showMask.show();
+			// console.log(this.stratvalue.length)
+		},
+		computed: {
+			getFooterClass() {
+				return this.stratvalue ? 'scanning_cds' : 'scanning_cd'
+			},
+			getlooterClass() {
+				return this.currentLuggageNum ? 'scanning_cds' : 'scanning_cd'
+			},
+			getFooterClasser() {
+				return this.container_ID ? 'scanning_cds' : 'scanning_cd'
+			},
+		},
+		components: {
+			Navs,
+			maskModel: maskModel,
+			flightInfo
+		},
+		methods: {
+			setVal(a,b){
+				if(b == "site"){
+					this.stratvalue = a.trim();
+				}
+				else if(b == "passenger_cabin"){
+					this.passenger_cabin = a.trim();
+				}
+				else if(b == "containerNo"){
+					this.container_ID = a.trim();
+				}
+				else if(b == "luggageNo"){
+					this.currentLuggageNum = a.trim();
+					this.getluggage(a,true)
+				}
+			},
+			scan(type) {
+				let that = this
+				uni.scanCode({
+					onlyFromCamera: true,
+					success: function(res) {
+						if (type == "1") {
+							that.stratvalue = res.result;
+						} else if (type == "2") {
+							that.container_ID = res.result;
+						} else {
+							that.currentLuggageNum = res.result
+							that.getluggage(that.currentLuggageNum, true)
+						}
+					}
+				});
+			},
+			async getNode() {
+				let data = {
+					"serviceId": 3003,
+					"dataContent": {},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						res.returnData.map(item => {
+							if (item.nodeCode == this.pagename) {
+								this.stratvalue = item.nodeDescribe;
+							}
+						})
+					}
+				})
+			},
+			next(data) {
+				this.flightNO = this.currentLuggage.carrierFlights;
+				this.flightDate = this.currentLuggage.carrierFlightsDate;
+				this.outAirport = this.currentLuggage.outAirport;
+				this.landAirport = this.currentLuggage.landAirport;
+				this.loadNumber = 0;
+				this.getFlightData()
+				this.$refs.showMask.hide();
+			},
+			load() {
+				this.currentLuggage.carrierFlights = this.flightNO
+				this.currentLuggage.carrierFlightsDate = this.flightDate;
+				this.currentLuggage.outAirport = this.outAirport;
+				this.currentLuggage.landAirport = this.landAirport;
+				let datas = this.setLuggage()
+				this.sendData(datas)
+			},
+			async getFlightData() {
+				let data = {
+					"serviceId": 3000,
+					"page": 1,
+					"pageSize": 10,
+					"dataContent": [{
+						"carrierFlights": this.flightNO
+					}],
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length > 0) {
+						this.flightDetail = []
+						if (this.flightDate && this.flightDate != "null") {
+							console.log(this.outAirport)
+							console.log(this.landAirport)
+							res.returnData.map(item => {
+								if (this.flightDate == item.carrierFlightsDate && this.outAirport == item.outAirport&& this.landAirport == item.landAirport) {
+									this.flightDetail = item
+									this.getluggageList()
+								}
+							})
+						} else {
+							this.flightDetail = res.returnData[0]
+							this.getluggageList()
+						}	
+						if (this.flightDetail.scheduleTakeOffTime) {
+							this.flightDetail.scheduleTakeOffTime = this.flightDetail.scheduleTakeOffTime
+								.split("T")[1]
+						} else {
+							item.scheduleTakeOffTime = "-"
+						}
+						if (this.flightDetail.scheduleLandInTime) {
+							this.flightDetail.scheduleLandInTime = this.flightDetail.scheduleLandInTime.split(
+								"T")[1]
+						} else {
+							item.scheduleLandInTime = "-"
+						}
+						
+					} else {
+						this.$scanAudio.src = "../../static/hqhb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "未查询到" + this.flightNO + "航班信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			async getluggageList() {
+				let data = {
+					"serviceId": 3001,
+					"page": 1,
+					"pageSize": 999,
+					"dataContent": {
+						"carrierFlights": this.flightDetail.carrierFlights,
+						"carrierFlightsDate": this.flightDetail.carrierFlightsDate,
+						"outAirport":this.flightDetail.outAirport,
+						"landAirport":this.flightDetail.landAirport
+					},
+					"event": "0"
+				}
+
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					this.listdate1 = []
+					this.listdate2 = []
+					if (res.code == "0") {
+						this.listdate = res.returnData;
+						res.returnData.map(item => {
+							this.abnormalList.map(item2 => {
+								if (item.abnormalType == item2.type) {
+									item.abnormalName = item2.name
+								}
+							})
+							switch (this.pagename) {
+								case "SORT":
+									if (item.sorting_time != null) {
+										this.listdate1.push(item)
+										this.listdate1.sort(this.compareDesc("sorting_time"))
+									} else {
+										this.listdate2.push(item)
+									}
+									break;
+								case "LOAD":
+									if (item.loading_time != null) {
+										this.listdate1.push(item)
+										this.listdate1.sort(this.compareDesc("loading_time"))
+									} else {
+										this.listdate2.push(item)
+									}
+									break;
+								case "INFL":
+									if (item.installation_time != null) {
+										this.listdate1.push(item)
+										this.listdate1.sort(this.compareDesc("installation_time"))
+									} else {
+										this.listdate2.push(item)
+									}
+									break;
+								case "UNLOAD":
+									if (item.unloadtime != null) {
+										this.listdate1.push(item)
+										this.listdate1.sort(this.compareDesc("unloadtime"))
+									} else {
+										this.listdate2.push(item)
+									}
+									break;
+								case "ARRIVED":
+									if (item.arrivedtime != null) {
+										this.listdate1.push(item)
+										this.listdate1.sort(this.compareDesc("arrivedtime"))
+									} else {
+										this.listdate2.push(item)
+									}
+									break;
+								case "RETURN":
+									if (item.luggage_describe != null) {
+										this.listdate1.push(item)
+									} else {
+										this.listdate2.push(item)
+									}
+									break;
+								default:
+									break;
+							}
+						})
+						if (this.loadNumber == 0 && this.currentLuggageNum != null) {
+							this.loadNumber = this.listdate1.length;
+							let datas = this.setLuggage()
+							this.sendData(datas)
+						} else {
+							this.loadNumber = this.listdate1.length;
+						}
+					}
+
+				})
+			},
+			async getluggage(num, isSend) {
+				let data = {
+					"serviceId": 3002,
+					"page": 1,
+					"pageSize": 1,
+					"dataContent": {
+						"luggageNum": num, //行李号
+					},
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0" && res.returnData.length > 0) {
+						this.currentLuggage = res.returnData[0];
+						if (this.flightNO != "null" && this.flightNO && this.flightNO == res.returnData[0]
+							.carrierFlights && isSend == true) {
+							let datas = this.setLuggage()
+							this.sendData(datas)
+						} else if (this.flightNO != "null" && this.flightNO && this.flightNO != res.returnData[
+								0].carrierFlights) {
+							if (this.$storage.get('times') == 1 && this.$storage.get('device') == 1) {
+								return
+							} else {
+								this.tabname = res.returnData[0].carrierFlights
+								this.typeShow = true
+								this.$refs.showMask.show();
+								this.$scanAudio.src = "../../static/qzcz.mp3"
+								this.$scanAudio.play()
+							}
+
+						} else if (this.flightNO == "null") {
+							this.typeShow = false
+							this.maskTitle3 = '是否对航班:' + res.returnData[0].carrierFlights + "行李进行" + this
+								.navname + "操作?"
+							this.headername = '提示'
+							this.$refs.showMask3.show();
+							this.$scanAudio.src = "../../static/kscz.mp3"
+							this.$scanAudio.play()
+						}
+					} else {
+						if(this.$devapi.RFIDIntervalTime!=0){
+							this.$devapi.RFIDStopInventory()
+							this.$devapi.ISRFIDOPEN = false
+						}
+						this.$scanAudio.src = "../../static/hqxl.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "未查询到" + this.currentLuggageNum + "行李信息",
+							duration: 5000
+						});
+					}
+				})
+			},
+			setLuggage(data) {
+				let arr = []
+				if (data) {
+					data.map(item => {
+						if(this.pagename=="RETURN"){
+							item.luggage_describe = "退运"
+						}
+						else{
+							item.nodeCode = this.pagename;
+							item.nodeName = this.navname;
+						}
+						item.location_code = this.stratvalue!=""?this.stratvalue:item.location_code;
+						item.container_ID = this.container_ID!=""?this.container_ID:item.container_ID;
+						item.passenger_cabin = this.passenger_cabin!=""?this.passenger_cabin:item.passenger_cabin;
+						item.loadNumber = this.loadNumber++;
+						item.sourceAirport = this.$storage.get('airportName');
+						item.ID = null;
+						item.dataType = "BPM";
+						item.agentNumber = this.$storage.getJson("users").user_name;
+						item.device_ID = uni.getDeviceInfo().deviceId;
+						arr.push(item)
+					})
+					return arr
+				} else {
+					if(this.pagename=="RETURN"){
+						this.currentLuggage.luggage_describe = "退运"
+					}
+					else{
+						this.currentLuggage.nodeCode = this.pagename;
+						this.currentLuggage.nodeName = this.navname;
+					}
+					this.currentLuggage.location_code = this.stratvalue!=""?this.stratvalue:this.currentLuggage.location_code;
+					this.currentLuggage.container_ID = this.container_ID!=""?this.container_ID:this.currentLuggage.container_ID;
+					this.currentLuggage.passenger_cabin = this.passenger_cabin!=""?this.passenger_cabin:this.currentLuggage.passenger_cabin;
+					this.currentLuggage.loadNumber = this.loadNumber++;
+					this.currentLuggage.sourceAirport = this.$storage.get('airportName');
+					this.currentLuggage.ID = null;
+					this.currentLuggage.dataType = "BPM";
+					this.currentLuggage.agentNumber = this.$storage.getJson("users").user_name;
+					this.currentLuggage.device_ID = uni.getDeviceInfo().deviceId;
+					arr.push(this.currentLuggage)
+					return arr
+				}
+
+			},
+			async sendData(result) {
+				let that = this;
+				let data = {
+					"serviceId": 3005,
+					"dataContent": result,
+					"event": "0"
+				}
+				await this.$http.httpPost('/openApi/query', data).then(res => {
+					if (res.code == "0") {
+						if (result.length > 1) {
+							setTimeout(function() {
+								uni.showToast({
+									icon: 'none',
+									title: "操作行李成功",
+									duration: 5000
+								});
+								that.getluggageList()
+							}, 3000)
+						} else {
+							this.getluggageList()
+						}
+					} else {
+						this.$scanAudio.src = "../../static/czsb.mp3"
+						this.$scanAudio.play()
+						uni.showToast({
+							icon: 'none',
+							title: "操作失败",
+							duration: 5000
+						});
+					}
+				})
+
+			},
+			datatime() {
+				let dataTime = Format("yyyy-MM-dd hh:mm:ss", new Date());
+				return dataTime
+			},
+			//下拉
+			up(item, index) {
+				this.currentLuggageNum = item.luggageNum;
+				this.getluggage(this.currentLuggageNum, false);
+				this.currentIndex = index
+				this.typeShow = false
+				this.maskTitle = '是否确定要拉下该件行李?'
+				this.headername = '拉下提示'
+				this.$refs.showMask.show();
+				this.$scanAudio.src = "../../static/sflx.mp3"
+				this.$scanAudio.play()
+			},
+			confirm: function(e) { //确定按钮
+				this.currentLuggage.abnormalState = "PFF"
+				this.currentLuggage.abnormalName = "预卸载"
+				let datas = this.setLuggage()
+				this.sendData(datas)
+			},
+			confirm2(e) { //确定一键操作按钮
+				uni.showToast({
+					icon: 'none',
+					title: "操作中",
+					duration: 5000
+				});
+				let data = this.listdate2
+				let datas = this.setLuggage(data)
+				this.sendData(datas)
+			},
+
+			confirm3: function(e) { //确定按钮
+				this.flightNO = this.currentLuggage.carrierFlights
+				this.flightDate = this.currentLuggage.carrierFlightsDate
+				this.landAirport = this.currentLuggage.landAirport
+				this.outAirport = this.currentLuggage.outAirport
+				this.getFlightData();
+				if (this.$devapi.RFIDIntervalTime!=0) {//继续连续操作
+					this.$devapi.RFIDStartInventory()
+					this.$devapi.ISRFIDOPEN = true
+				}
+			},
+			cancel3: function() { //取消按钮
+				this.flightNO = "null"
+			},
+			cancel: function() { //取消按钮
+				console.log('您点击了取消按钮');
+			},
+			toDetail(num) {
+				uni.navigateTo({
+					// url: "/pages/detail/index?luggageNum=" + data.msg
+					url: "/pages/detail/index?luggageNum=" + num
+				})
+			},
+			clickOrder() {
+				this.typeShow = false
+				this.maskTitle2 = '是否确定要一键' + this.navname + '全部行李?'
+				this.headername = '操作提示'
+				this.$refs.showMask2.show();
+				this.$scanAudio.src = "../../static/yjzc.mp3"
+				this.$scanAudio.play()
+			},
+			baggageEntry() {
+				uni.navigateTo({
+					url: "/pages/baggageEntry/index"
+				})
+			},
+			locationEntry() {
+				uni.navigateTo({
+					url: "/pages/locationEntry/index"
+				})
+			},
+			fall() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			clicker(e) {
+				this.action = !this.action
+				if (e != this.action) {
+					this.action = e
+				}
+			},
+
+			compareDesc(propertyName) {
+				return function(object1, object2) {
+					var value1 = object1[propertyName];
+					var value2 = object2[propertyName];
+					if (value2 < value1) {
+						return -1;
+					} else if (value2 > value1) {
+						return 1;
+					} else {
+						return 0;
+					}
+				}
+			},
+
+			movetran(e) {
+				let arr = uni.getSystemInfoSync().windowHeight;
+				this.dataheight = (e.changedTouches[0].clientY / 16) + 'rem'
+				if (e.changedTouches[0].clientY / 16 > 20.75) {
+					this.dataheight = 20.75 + 'rem'
+				} else if (e.changedTouches[0].clientY / 16 < 7.3125) {
+					this.dataheight = 6.3125 + 'rem'
+				}
+			},
+			start(e) {
+				this.startData.clientX = e.changedTouches[0].clientX;
+			},
+			end(e, item) {
+				const subX = e.changedTouches[0].clientX - this.startData.clientX;
+				if (subX > 50) {
+					// console.log('右滑')
+					item.types = false
+				} else if (subX < -50) {
+					item.types = true
+					// console.log('左滑')
+				}
+			},
+			checkMore(item) {
+				console.log(item)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		position: relative;
+		background: rgb(49, 85, 99);
+
+		>.content {
+			width: 100%;
+			height: calc(100vh - 5.375rem);
+			position: relative;
+
+			// overflow: hidden;
+			// background: rgb(49, 85, 99);
+			>.content_top {
+				width: 100%;
+				// background: rgb(49, 85, 99);
+				padding-bottom: 1.3125rem;
+
+				>.craid {
+					// width: 100%;
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: space-between;
+					flex-wrap: wrap;
+					align-items: center;
+
+					>.craid_data {
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: start;
+
+						>p {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 18px;
+							font-weight: 700;
+						}
+
+						>span {
+							color: rgb(255, 255, 255);
+							font-family: Noto Sans SC;
+							font-size: 13px;
+							font-weight: 500;
+						}
+					}
+
+					.fight_center {
+						width: 3rem;
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						justify-content: center;
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						line-height: 24px;
+						font-weight: 700;
+
+						>.aircraft {
+							width: 1.75rem;
+							height: 1.75rem;
+							background: url('../../static/hang.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+
+				>.craids {
+					height: 5.625rem;
+					padding: 0 2.5625rem 0 2.5625rem;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+
+					>p {
+						color: rgb(189, 214, 231);
+						font-family: Noto Sans SC;
+						font-size: 13px;
+						font-weight: 500;
+					}
+				}
+
+				>.scanning {
+					height: 12rem;
+					padding: 0 1.5rem 0 1.5rem;
+					opacity: 1;
+					transition: all 3s;
+
+					.scanning_cd {
+						width: 100%;
+						height: 3rem;
+						opacity: 1;
+						transition: all 3s;
+						background: rgb(59, 103, 123);
+						margin-top: 1rem;
+						margin-bottom: .5rem;
+						border-radius: 4px;
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/saoma.png') no-repeat;
+							background-size: 100% 100%;
+							margin-left: 1rem;
+						}
+
+						>.log_l {
+							width: .125rem;
+							height: 1.3125rem;
+							margin-left: 4rem;
+							background: rgb(255, 255, 255);
+						}
+					}
+
+					.scanning_cds {
+						width: 100%;
+						height: 3rem;
+						opacity: 1;
+						transition: all 3s;
+						background: rgb(51, 161, 165);
+						margin-top: 1rem;
+						margin-bottom: .5rem;
+						border-radius: 4px;
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						color: rgb(255, 255, 255);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/saoma.png') no-repeat;
+							background-size: 100% 100%;
+							margin-left: 1rem;
+						}
+
+						>.log_l {
+							width: .125rem;
+							height: 1.3125rem;
+							margin-left: 4rem;
+							background: rgb(255, 255, 255);
+						}
+					}
+				}
+			}
+
+			>.content_bootom {
+				width: 100%;
+				// height: calc(100vh - 20.9375rem - 4.375rem);
+				padding-bottom: 0;
+				position: absolute;
+				bottom: 0;
+				top: 20.75rem;
+				border-radius: 6px 6px 0px 0px;
+				overflow: hidden;
+				background: rgb(255, 255, 255);
+
+				>.choice {
+					width: 100%;
+					height: 2.5rem;
+					display: flex;
+					background: rgb(240, 241, 243);
+
+					>.handle {
+						width: 50%;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 15px;
+						font-weight: 700;
+						border-radius: 6px 6px 0px 0px;
+						background: rgb(255, 255, 255);
+					}
+
+					>.handles {
+						width: 50%;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 15px;
+						font-weight: 700;
+					}
+				}
+
+				.up {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-left: 1rem;
+					border-bottom: 1px solid rgb(238, 238, 238);
+
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					>.error {
+						width: 20%;
+						color: red
+					}
+
+					>.normal {
+						width: 20%;
+						color: #4682b4
+					}
+
+					>.list {
+						position: relative;
+						height: 2.75rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+
+					>.delete {
+						width: 3.75rem;
+						height: 2.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: -3.75rem;
+						transform: all 3s;
+
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+
+				.ups {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-left: 1rem;
+					border-bottom: 1px solid rgb(238, 238, 238);
+
+					// transform: all 3s;
+					>.down_up {
+						width: .875rem;
+						height: .875rem;
+						position: relative;
+						right: 1.875rem;
+						background: url('../../static/xia.png') no-repeat;
+						background-size: 100% 100%;
+					}
+
+					>.list {
+						position: relative;
+						height: 2.75rem;
+						display: flex;
+						align-items: center;
+						transform: all 3s;
+						right: 0;
+						color: rgb(0, 0, 0);
+						font-family: Noto Sans SC;
+						font-size: 16px;
+						font-weight: 500;
+					}
+
+					>.delete {
+						width: 3.75rem;
+						height: 2.75rem;
+						background: rgb(237, 101, 101);
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						right: 1rem;
+						transform: all 3s;
+
+						// right: -3.75rem;
+						>.log {
+							width: .875rem;
+							height: .875rem;
+							background: url('../../static/vector@1x.png') no-repeat;
+							background-size: 100% 100%;
+						}
+					}
+				}
+
+				.scroll-Y {
+					// height: calc(100% - 2.5rem - 2.75rem - 2.25rem - 2.25rem);
+					height: calc(100% - 4rem);
+				}
+
+				.but {
+					width: 20.5625rem;
+					height: 2.5rem;
+					background: linear-gradient(179.10deg, rgba(51, 161, 165, 1.00) 11.326%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%, rgba(59, 111, 142, 1.00) 119.032%);
+					border-radius: .25rem;
+					color: rgb(255, 255, 255);
+					font-family: Noto Sans SC;
+					font-size: 1rem;
+					margin: 0 auto;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					margin-top: 0.25rem;
+					margin-bottom: 2.25rem;
+					z-index: 11;
+					position: fixed;
+					left: 50%;
+					margin-left: -10.25rem;
+				}
+			}
+		}
+	}
+</style>

BIN
static/Icon@1x.png


BIN
static/bagzu.png


BIN
static/bei.png


BIN
static/beijing.png


BIN
static/bg.png


BIN
static/czhb.mp3


BIN
static/czsb.mp3


BIN
static/gongzuo.png


BIN
static/gou.png


BIN
static/hang.png


BIN
static/hqhb.mp3


BIN
static/hqxl.mp3


BIN
static/ic_code_dark.png


BIN
static/ic_home_tabbar_check.png


BIN
static/ic_home_tabbar_default.png


BIN
static/ic_message_tabbar_check.png


BIN
static/ic_message_tabbar_default.png


BIN
static/ic_user_tabbar_check.png


BIN
static/ic_user_tabbar_default.png


BIN
static/ico.png


BIN
static/ico@1x.png


+ 539 - 0
static/iconfont/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 395 - 0
static/iconfont/demo_index.html

@@ -0,0 +1,395 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4416009" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe614;</span>
+                <div class="name">快速运行-01</div>
+                <div class="code-name">&amp;#xe614;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe601;</span>
+                <div class="name">在线值机</div>
+                <div class="code-name">&amp;#xe601;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66b;</span>
+                <div class="name">装机单</div>
+                <div class="code-name">&amp;#xe66b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe600;</span>
+                <div class="name">装车</div>
+                <div class="code-name">&amp;#xe600;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe710;</span>
+                <div class="name">行李提取</div>
+                <div class="code-name">&amp;#xe710;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe609;</span>
+                <div class="name">降落、到达</div>
+                <div class="code-name">&amp;#xe609;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60f;</span>
+                <div class="name">分拣</div>
+                <div class="code-name">&amp;#xe60f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe705;</span>
+                <div class="name">卸机</div>
+                <div class="code-name">&amp;#xe705;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe62f;</span>
+                <div class="name">行李丢失</div>
+                <div class="code-name">&amp;#xe62f;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1705568981672') format('woff2'),
+       url('iconfont.woff?t=1705568981672') format('woff'),
+       url('iconfont.ttf?t=1705568981672') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-kuaisuyunxing01"></span>
+            <div class="name">
+              快速运行-01
+            </div>
+            <div class="code-name">.icon-kuaisuyunxing01
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-check-in"></span>
+            <div class="name">
+              在线值机
+            </div>
+            <div class="code-name">.icon-check-in
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-zhuangjidan"></span>
+            <div class="name">
+              装机单
+            </div>
+            <div class="code-name">.icon-zhuangjidan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-zhuangche"></span>
+            <div class="name">
+              装车
+            </div>
+            <div class="code-name">.icon-zhuangche
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-icon-test-copy"></span>
+            <div class="name">
+              行李提取
+            </div>
+            <div class="code-name">.icon-icon-test-copy
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon--landing"></span>
+            <div class="name">
+              降落、到达
+            </div>
+            <div class="code-name">.icon--landing
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-huiyuan"></span>
+            <div class="name">
+              分拣
+            </div>
+            <div class="code-name">.icon-huiyuan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-xieji"></span>
+            <div class="name">
+              卸机
+            </div>
+            <div class="code-name">.icon-xieji
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-hanglidiushi"></span>
+            <div class="name">
+              行李丢失
+            </div>
+            <div class="code-name">.icon-hanglidiushi
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-kuaisuyunxing01"></use>
+                </svg>
+                <div class="name">快速运行-01</div>
+                <div class="code-name">#icon-kuaisuyunxing01</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-check-in"></use>
+                </svg>
+                <div class="name">在线值机</div>
+                <div class="code-name">#icon-check-in</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-zhuangjidan"></use>
+                </svg>
+                <div class="name">装机单</div>
+                <div class="code-name">#icon-zhuangjidan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-zhuangche"></use>
+                </svg>
+                <div class="name">装车</div>
+                <div class="code-name">#icon-zhuangche</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-icon-test-copy"></use>
+                </svg>
+                <div class="name">行李提取</div>
+                <div class="code-name">#icon-icon-test-copy</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon--landing"></use>
+                </svg>
+                <div class="name">降落、到达</div>
+                <div class="code-name">#icon--landing</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-huiyuan"></use>
+                </svg>
+                <div class="name">分拣</div>
+                <div class="code-name">#icon-huiyuan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-xieji"></use>
+                </svg>
+                <div class="name">卸机</div>
+                <div class="code-name">#icon-xieji</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-hanglidiushi"></use>
+                </svg>
+                <div class="name">行李丢失</div>
+                <div class="code-name">#icon-hanglidiushi</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 51 - 0
static/iconfont/iconfont.css

@@ -0,0 +1,51 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4416009 */
+  src: url('~@/static/iconfont/iconfont.woff2?t=1705568981672') format('woff2'),
+       url('~@/static/iconfont/iconfont.woff?t=1705568981672') format('woff'),
+       url('~@/static/iconfont/iconfont.ttf?t=1705568981672') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-kuaisuyunxing01:before {
+  content: "\e614";
+}
+
+.icon-check-in:before {
+  content: "\e601";
+}
+
+.icon-zhuangjidan:before {
+  content: "\e66b";
+}
+
+.icon-zhuangche:before {
+  content: "\e600";
+}
+
+.icon-icon-test-copy:before {
+  content: "\e710";
+}
+
+.icon--landing:before {
+  content: "\e609";
+}
+
+.icon-huiyuan:before {
+  content: "\e60f";
+}
+
+.icon-xieji:before {
+  content: "\e705";
+}
+
+.icon-hanglidiushi:before {
+  content: "\e62f";
+}
+

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
static/iconfont/iconfont.js


+ 72 - 0
static/iconfont/iconfont.json

@@ -0,0 +1,72 @@
+{
+  "id": "4416009",
+  "name": "手持机",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "1112506",
+      "name": "快速运行-01",
+      "font_class": "kuaisuyunxing01",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "4157727",
+      "name": "在线值机",
+      "font_class": "check-in",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "4273397",
+      "name": "装机单",
+      "font_class": "zhuangjidan",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "4361003",
+      "name": "装车",
+      "font_class": "zhuangche",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "5074330",
+      "name": "行李提取",
+      "font_class": "icon-test-copy",
+      "unicode": "e710",
+      "unicode_decimal": 59152
+    },
+    {
+      "icon_id": "6936773",
+      "name": "降落、到达",
+      "font_class": "-landing",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "9024670",
+      "name": "分拣",
+      "font_class": "huiyuan",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "18192672",
+      "name": "卸机",
+      "font_class": "xieji",
+      "unicode": "e705",
+      "unicode_decimal": 59141
+    },
+    {
+      "icon_id": "25102237",
+      "name": "行李丢失",
+      "font_class": "hanglidiushi",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    }
+  ]
+}

BIN
static/iconfont/iconfont.ttf


BIN
static/iconfont/iconfont.woff


BIN
static/iconfont/iconfont.woff2


BIN
static/icos.png


BIN
static/jilu.png


BIN
static/kaiguan.png


BIN
static/kscz.mp3


BIN
static/lg 64 brs.png


BIN
static/login.png


BIN
static/logo.png


BIN
static/mima.png


BIN
static/qzcz.mp3


BIN
static/radio.png


BIN
static/saoma.png


BIN
static/search.png


BIN
static/sflx.mp3


BIN
static/shi.png


BIN
static/shuai.png


BIN
static/vector@1x.png


BIN
static/voice.mp3


BIN
static/xia.png


BIN
static/yjzc.mp3


+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;

+ 6 - 0
uni_modules/liu-goods-swiper/changelog.md

@@ -0,0 +1,6 @@
+## 1.0.2(2023-04-14)
+增加示例
+## 1.0.1(2023-04-11)
+增加示例图片
+## 1.0.0(2023-03-31)
+初始发布

+ 190 - 0
uni_modules/liu-goods-swiper/components/liu-goods-swiper/liu-goods-swiper.vue

@@ -0,0 +1,190 @@
+<template>
+	<view>
+		<view class="subtitle">{{listTitle}}</view>
+		<scroll-view scroll-x="true" class="scroll-box">
+			<view :class="action === index? 'item-box': 'item-boxs'" v-for="(item,index) in goodsList"
+				:key="index" @click="chooseItem(item,index)">
+				<!-- <image :src="item.icon" :style="'width:'+imgWidth+'rpx;'+'height:'+imgHeight+'rpx;'" mode=""></image> -->
+				<view class="item-name">{{item.name}}</view>
+				<view class="item-descr">{{item.descr}}</view>
+				<view class="item-isfi" v-if="action === index"></view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			listTitle: {
+				type: String,
+				default: ''
+			},
+			goodsList: {
+				type: Array,
+				default: () => []
+			},
+			imgWidth: {
+				type: Number,
+				default: 128
+			},
+			imgHeight: {
+				type: Number,
+				default: 128
+			}
+		},
+		data() {
+			return {
+				action: 0
+			}
+		},
+		mounted() {},
+		methods: {
+			//点击某个item
+			chooseItem(item,index){
+				this.action = index
+				this.$emit("onClick", item)
+			}
+		}
+	}
+</script>
+
+<style>
+	::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		color: transparent;
+		display: none;
+	}
+</style>
+<style scoped>
+	.subtitle {
+		padding: 16rpx 32rpx;
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333333;
+		line-height: 48rpx;
+	}
+
+	.scroll-box {
+		display: flex;
+		white-space: nowrap;
+		width: 100%;
+		min-height: 5.1875rem;
+	}
+
+	.item-box {
+		display: inline-block;
+		width: 10rem;
+		height: 4.125rem;
+		padding: 16rpx;
+		margin-right: 8rpx;
+		border-radius: 12rpx;
+		border: 4rpx solid #FFFFFF;
+		box-shadow: 0px 4rpx 8rpx 0px rgba(0, 0, 0, 0.1);
+		text-align: center;
+		position: relative;
+		box-sizing: border-box;
+
+		background: rgb(234, 241, 245);
+		border: 1px solid rgb(37, 121, 160);
+		box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);
+		border-radius:
+		2px;
+		position: relative;
+	}
+
+	.item-boxs {
+		display: inline-block;
+		width: 10rem;
+		height: 4.125rem;
+		padding: 16rpx;
+		margin-right: 8rpx;
+		border-radius: 12rpx;
+		border: 4rpx solid #FFFFFF;
+		box-shadow: 0px 4rpx 8rpx 0px rgba(0, 0, 0, 0.1);
+		text-align: center;
+		position: relative;
+		box-sizing: border-box;
+    
+		background: rgb(255, 255, 255);
+    border: 1px solid rgb(239, 239, 239);
+		/* background: rgb(234, 241, 245);
+		border: 1px solid rgb(37, 121, 160);
+		box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.1);
+		border-radius:
+		2px; */
+		position: relative;
+	}
+
+	.item-name {
+		width: 100%;
+		font-weight: bold;
+		/* white-space: pre-wrap; */
+		color: rgb(16, 17, 22);
+		font-family: Noto Sans SC;
+		font-size: .8125rem;
+		font-weight: 700;
+		margin-top: 8rpx;
+		/* display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 1;
+		overflow: hidden; */
+		display: flex;
+	}
+	
+	.item-descr {
+		width: 100%;
+		line-height: 24rpx;
+		white-space: pre-wrap;
+		color: rgb(16, 17, 22);
+		font-family: Noto Sans SC;
+		font-size: 16px;
+		font-weight: 700;
+		margin-top: 12rpx;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 1;
+		overflow: hidden;
+		display: flex;
+		position: absolute;
+		bottom: .725rem;
+	}
+  .item-isfi{
+		width: 1rem;
+    height: 1rem;
+		background: url('../../../../static/radio.png') no-repeat;
+		background-size: 100% 100%;
+		position: absolute;
+		right: .625rem;
+		bottom: .625rem;
+
+	}
+	.bg0 {
+		background: linear-gradient(180deg, #FFE8C2 0%, #FFFFFF 100%);
+	}
+	
+	.bg1 {
+		background: linear-gradient(180deg, #D3DBFF 0%, #FFFFFF 100%);
+	}
+	
+	.bg2 {
+		background: linear-gradient(360deg, #FFFFFF 0%, #D7C4FF 100%);
+	}
+
+	.bg3 {
+		background: linear-gradient(180deg, #FFD3D3 0%, #FFFFFF 100%);
+	}
+
+	.bg4 {
+		background: linear-gradient(180deg, #D3FFFB 0%, #FFFFFF 100%);
+	}
+
+	.bg5 {
+		background: linear-gradient(180deg, #D3FFE7 0%, #FFFFFF 100%);
+	}
+
+	.bg6 {
+		background: linear-gradient(180deg, #FFD3FB 0%, #FFFFFF 100%);
+	}
+</style>

+ 85 - 0
uni_modules/liu-goods-swiper/package.json

@@ -0,0 +1,85 @@
+{
+  "id": "liu-goods-swiper",
+  "displayName": "横向滑动、左右滑动商品列表模版",
+  "version": "1.0.2",
+  "description": "简单好用的左右滑动商品列表,支持各类样式自定义,简单易修改",
+  "keywords": [
+    "列表",
+    "商品",
+    "滑动",
+    "商品展示",
+    "分类"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": "2364518038"
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "y",
+          "vue3": "u"
+        },
+        "App": {
+          "app-vue": "u",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "u",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "u",
+          "百度": "u",
+          "字节跳动": "u",
+          "QQ": "u",
+          "钉钉": "u",
+          "快手": "u",
+          "飞书": "u",
+          "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно