Переглянути джерело

死胖希
npm install uni-simple-router
npm install uni-read-pages

19124812874 5 роки тому
батько
коміт
5d44f31aa1
55 змінених файлів з 3089 додано та 754 видалено
  1. 1 1
      assets/colorui/app.css
  2. 68 4
      assets/http/api.js
  3. 4 9
      assets/http/service.js
  4. 125 0
      components/car-card/car-card.vue
  5. 299 0
      components/keyboard-package/keyboard-package.vue
  6. 22 0
      components/uni-popup/message.js
  7. 25 0
      components/uni-popup/popup.js
  8. 243 0
      components/uni-popup/uni-popup-dialog.vue
  9. 116 0
      components/uni-popup/uni-popup-message.vue
  10. 165 0
      components/uni-popup/uni-popup-share.vue
  11. 294 0
      components/uni-popup/uni-popup.vue
  12. 279 0
      components/uni-transition/uni-transition.vue
  13. 1 0
      main.js
  14. 30 2
      pages.json
  15. 4 7
      pages/auth/auth.vue
  16. 18 21
      pages/company/company.vue
  17. 51 28
      pages/device/device.vue
  18. 109 0
      pages/healthCode/healthCode.vue
  19. 17 10
      pages/index/agency/agency.vue
  20. 204 0
      pages/index/car/car.vue
  21. 140 0
      pages/index/car/card.vue
  22. 161 0
      pages/index/car/detail.vue
  23. 112 0
      pages/index/car/item.vue
  24. 94 0
      pages/index/car/list.vue
  25. 74 18
      pages/index/fire/alarm-record.vue
  26. 28 9
      pages/index/fire/detail.vue
  27. 15 12
      pages/index/fire/list/card.vue
  28. 5 2
      pages/index/fire/list/item.vue
  29. 4 0
      pages/index/fire/list/list.vue
  30. 71 25
      pages/index/index.vue
  31. 2 2
      pages/index/myinfo/myinfo.vue
  32. 4 4
      pages/index/notice/list.vue
  33. 15 1
      pages/index/staff-temperature/card.vue
  34. 50 69
      pages/index/staff-temperature/detail.vue
  35. 4 3
      pages/index/staff-temperature/item.vue
  36. 2 8
      pages/index/staff-temperature/list.vue
  37. 4 3
      pages/index/staffAudit/card.vue
  38. 43 32
      pages/index/staffAudit/detail.vue
  39. 23 36
      pages/index/staffAudit/item.vue
  40. 0 250
      pages/index/staffAudit/item1.vue
  41. 99 3
      pages/index/staffAudit/list.vue
  42. 0 125
      pages/index/staffAudit/list1.vue
  43. 5 2
      pages/login/login.vue
  44. 2 1
      pages/mine/changePass/changePass.vue
  45. 0 31
      pages/mine/changePassword/changePassword.vue
  46. 2 2
      pages/mine/editPhone/editPhone.vue
  47. 53 23
      pages/mine/healthcode/healthcode.vue
  48. 2 11
      pages/mine/mine.vue
  49. BIN
      static/delete.png
  50. BIN
      static/index/fire/dianbiao.png
  51. BIN
      static/index/gander/car.png
  52. BIN
      static/index/gander/health.png
  53. BIN
      static/index/noimg2.png
  54. BIN
      static/index/noimg3.png
  55. BIN
      static/index/top.jpg

+ 1 - 1
assets/colorui/app.css

@@ -198,7 +198,7 @@
 
 .footer-fixed {
 	position: fixed;
-	z-index: 99999;
+	z-index: 99;
 	width: 100%;
 	bottom: 0;
 	left: 0;

+ 68 - 4
assets/http/api.js

@@ -94,22 +94,39 @@ let CMSUrl={
 	detail:'/estate/article/detail',
 	addReaderCount:'/estate/article/addReaderCount'
 }
-let CMS={
+const CMS={
 	page:p => http.get(CMSUrl.page, {params:p}),
 	detail:p => http.get(CMSUrl.detail, {params:p}),
 	addReaderCount:p => http.post(CMSUrl.addReaderCount, p),
 }
 
+//banner 轮播图
+let bannerUrl={
+	page:'/estate/banners/list'
+}
+const banner={
+	page:p => http.get(bannerUrl.page, {params:p}),
+}
+
+
+
 //消防设备
 let fireDeviceUrl={
 	page:'/smartapplication/smartdevice/list',
 	agencyPage:'/smartapplication/smartdevice/getDeviceList',
-	alarmRecord:'/smartapplication/smartdevice/getAlarmRecord'
+	alarmRecord:'/smartapplication/smartdevice/getAlarmRecord',
+	//电表抄表记录
+	electricmeterrecord:'/electricmeterrecord/electricmeterrecord/list'
 }
-let fireDevice={
+const fireDevice={
+	//企业角色的设备列表接口
 	page:p => http.get(fireDeviceUrl.page, {params:p}),
+	//园区角色的设备列表接口
 	agencyPage:p => http.get(fireDeviceUrl.agencyPage, {params:p}),
+	//报警记录接口
 	alarmRecord:p => http.get(fireDeviceUrl.alarmRecord, {params:p}),
+	//电表抄表记录
+	electricmeterrecord:p => http.get(fireDeviceUrl.electricmeterrecord, {params:p}),
 }
 //用户反馈
 let feedbackUrl={
@@ -137,6 +154,8 @@ let temperatureRecordUrl={
 const temperatureRecord = {
 	page:p => http.get(temperatureRecordUrl.page, {params:p}),
 }
+
+
 //健康码
 let healthCodeUrl={
 	getCode:'/health/getCode'
@@ -144,6 +163,43 @@ let healthCodeUrl={
 const healthCode = {
 	getCode:p => http.post(healthCodeUrl.getCode, p)
 }
+
+ //车辆出入
+ let carUrl={
+	 //出入记录
+	 condition:'carenterrecord/carenterrecord/queryRecord',
+	 //入场记录
+	 enterPage:'/carenterrecord/carenterrecord/list',
+	 //出场记录
+	 outPage:'/caroutrecord/caroutrecord/list'
+ }
+ const car = {
+	 page:p => http.get(carUrl.page, {params:p}),
+	 condition:p => http.get(carUrl.condition, {params:p}),
+	 enterPage:p => http.get(carUrl.enterPage, {params:p}),
+	 outPage:p => http.get(carUrl.outPage, {params:p}),
+ }
+ 
+ //开门设备
+ let deviceUrl={
+	 page:'facedevice/facedevice/list',
+	 open:'facedevice/facedevice/remoteOpenDoor'
+ }
+ 
+ const device={
+	 page:p => http.get(deviceUrl.page, {params:p}),
+	 open:p => http.post(deviceUrl.open, p)
+ }
+ 
+ //园区统计
+ let statisticalUrl={
+	 //当日动态数据
+	 todayData:'/statistics/screen/park/todayData'
+ }
+ const statistical={
+ 	 todayData:p => http.get(statisticalUrl.todayData, {params:p}),
+ }
+
 export const api={
 	//上传文件
 	uploadFile,
@@ -163,6 +219,8 @@ export const api={
 	enterprisestaff,
 	//CMS
 	CMS,
+	//banner 轮播图
+	banner,
 	//消防设备
 	fireDevice,
 	//用户反馈
@@ -172,6 +230,12 @@ export const api={
 	//测温记录
 	temperatureRecord,
 	//健康码
-	healthCode
+	healthCode,
+	//车辆出入
+	car,
+	//开门设备
+	device,
+	//统计
+	statistical
 	
 }

+ 4 - 9
assets/http/service.js

@@ -1,15 +1,10 @@
 import Request from '../../utils/my-request/index.js'
-//w3 wifi
-// let baseURL='http://192.168.0.105:9527/'
-//w2 wifi
-// let baseURL='http://192.168.0.101:9527/'
-//思奇特
-// let baseURL='http://192.168.2.200:9527/'
-// let baseURL='http://192.168.2.229:9527/'
+
+// let baseURL='http://192.168.1.211:9527/'
+// let baseURL='http://192.168.1.117:9527/'
 //远程
 // let baseURL='http://139.9.103.171:9527/'
-//let baseURL='https://park.58fo.com/api/'
-let baseURL='http://localhost:9527/'
+let baseURL='https://park.58fo.com/api/'
 
 
 let tokenUrl=baseURL+"blade-auth/oauth/token?tenantId=804981&password=ea3c40c0df5477c525543b0e85548004&username=wpadmin"

+ 125 - 0
components/car-card/car-card.vue

@@ -0,0 +1,125 @@
+<template>
+	<view >
+		<view class="recommend-info" >
+		  <view class="goods-list">
+		    <view @click="showDetail(item)"  class="list" v-for="(item,index) in list" :key="index">
+		      <view class="pictrue" >
+		        <image :src="item.outImgPath?item.outImgPath:'/static/index/noimg3.png'" mode="scaleToFill"></image>
+				<view class="car">{{item.carNo}}</view>
+		      </view>
+			  <view class="content">
+				  <view class="">
+						<text class="cuIcon-time margin-right-10"></text>
+						<text>进:{{formatDate(item.enterTime)}}</text>
+				  </view>
+				  <view style="padding-top: 8rpx;">
+						<text class="cuIcon-time margin-right-10"></text>
+						<text>出:{{formatDate(item.outTime)}}</text>
+				  </view>
+				  
+				  <view class="flex justify-center" style="margin: 20rpx 0;">
+				  	<view  class="cu-btn line-blue round df" style="width: 70%;">
+				  		查看详情
+				  	</view>
+				  </view>
+			  </view>
+		    </view>
+		  </view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:{
+			list: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				
+			}
+		},
+		computed:{
+			formatDate(){
+				return val=>{
+					if (this.$isEmpty(val)) {
+						return '未知'
+					}
+					return this.$u.timeFormat(new Date(val).getTime(), 'mm-dd hh:MM:ss') 
+				}
+			},
+		},
+		methods: {
+			showDetail(item){
+				uni.navigateTo({
+					url:"/pages/index/car/detail?id="+item.id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	/* 为你推荐 */
+	.recommend-info{
+	  width: 100%;
+	  .recommend-title{
+	    display: flex;
+	    align-items: center;
+	    justify-content: center;
+	    width: 100%;
+	    height: 100rpx;
+	    .title{
+	      display: flex;
+	      align-items: center;
+	      image{
+	        width: 416rpx;
+	        height: 40rpx;
+	      }
+	    }
+	  }
+	  .goods-list{
+	    display: flex;
+	    flex-wrap: wrap;
+	    justify-content: space-between;
+	    padding: 0 30rpx;
+	    .list{
+	      width: 49%;
+	      height: 540rpx;
+	      margin-bottom: 20rpx;
+	      background-color: #FFFFFF;
+	      border-radius: 10rpx;
+	      overflow: hidden;
+	      .pictrue{
+	        width: 100%;
+			position: relative;
+	        image{
+				border-top-right-radius: 12rpx;
+				border-top-left-radius: 12rpx;
+	            height: 330rpx;
+	        }
+			.car{
+				position: absolute;
+				bottom: 20rpx;
+				left: 10rpx;
+				color: #FFFFFF;
+			}
+	      }
+		  
+		  .content{
+			  padding: 20rpx;
+			  text{
+				  padding: 10rpx 0;
+			  }
+		  }
+	      
+	    }
+	  }
+	}
+
+</style>

+ 299 - 0
components/keyboard-package/keyboard-package.vue

@@ -0,0 +1,299 @@
+<template>
+	<uni-popup :custom="true" type="bottom" ref="keyboardPackage">
+		<view class="keyboardbox">
+			<view class="numkeyboard" v-if="type==='number'">
+				<view class="num-area">
+					<view class="row" v-for="(item,index) in numKeybordList" :key="index">
+						<view :class="['item',ite===0?'z':'',(disableDot && ite==='.')?'disabled':'']" v-for="(ite,idx) in item"
+						 hover-class="active" :hover-start-time="0" :hover-stay-time="5" :key="idx" @tap="input(ite)">{{ite}}</view>
+					</view>
+				</view>
+				<view class="btn-area">
+					<view :class="['item','del']" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="deleteVal">
+						删除
+					</view>
+					<view class="confirem item" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="confirm">
+						完成
+					</view>
+				</view>
+			</view>
+
+			<view class="numkeyboard" v-if="type==='idCard'">
+				<view class="num-area">
+					<view class="row" v-for="(item,index) in idCardList" :key="index">
+						<view :class="['item',ite===0?'z':'',(disableDot && ite==='.')?'disabled':'']" v-for="(ite,idx) in item"
+						 hover-class="active" :hover-start-time="0" :hover-stay-time="5" :key="idx" @tap="input(ite)">{{ite}}</view>
+					</view>
+				</view>
+				<view class="btn-area">
+					<view :class="['item','del']" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="deleteVal">
+						删除
+					</view>
+					<view class="confirem item" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="confirm">
+						完成
+					</view>
+				</view>
+			</view>
+
+			<view class="platenumber" v-if="type==='plateNumber'">
+				<view class="header">
+					<view @tap="active=active===1?2:1" hover-class="active" :hover-start-time="0" :hover-stay-time="5">{{active===1?'地区':'车牌号'}}</view>
+					<view hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="confirm">完成</view>
+				</view>
+				<view class="main">
+					<view class="normal" v-show="active===1">
+						<view class="row" v-for="(item,index) in EngKeyBoardList" :key="index">
+							<view class="item" v-for="(ite,idx) in item" :key="idx" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="input(ite)">
+								{{ite}}
+							</view>
+							<view class="item img" v-if="index===EngKeyBoardList.length-1" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="deleteVal">
+								<image src="/static/delete.png" mode=""></image>
+							</view>
+						</view>
+					</view>
+					<view class="area" v-show="active===2">
+						<view class="row" v-for="(item,index) in areaList" :key="index">
+							<view class="item" v-for="(ite,idx) in item" :key="idx" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="input(ite)">
+								{{ite}}
+							</view>
+							<view class="item img" v-if="index===EngKeyBoardList.length-1" hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="deleteVal">
+								<image src="/static/delete.png" mode=""></image>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="safe-area" v-if="safeAreaInsetBottom"></view>
+	</uni-popup>
+</template>
+
+<script>
+	import uniPopup from "@/components/uni-popup/uni-popup.vue"
+	export default {
+		components: {
+			uniPopup
+		},
+		props: {
+			type: {
+				type: String,
+				default: 'number'
+			},
+			safeAreaInsetBottom: { //是否设置安全区
+				type: Boolean,
+				default: false
+			},
+			disableDot: { //数字键盘是否禁止点击.仅type为number生效
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				numKeybordList: [
+					[1, 2, 3],
+					[4, 5, 6],
+					[7, 8, 9],
+					[0, '.']
+				],
+				idCardList: [
+					[1, 2, 3],
+					[4, 5, 6],
+					[7, 8, 9],
+					[0, 'X']
+				],
+				areaList: [
+					['京', '沪', '粤', '津', '冀', '豫', '云', '辽', '黑', '湘'],
+					['皖', '鲁', '苏', '浙', '赣', '鄂', '桂', '甘', '晋', '陕'],
+					['蒙', '吉', '闽', '贵', '渝', '川', '青', '琼', '宁'],
+					['藏', '新', '使', '港', '澳', '学']
+				],
+				EngKeyBoardList: [
+					[1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
+					['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],
+					['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'],
+					['Z', 'X', 'C', 'V', 'B', 'N', 'M']
+				],
+				active: 2
+			};
+		},
+		methods: {
+			open() {
+				this.$refs.keyboardPackage.open();
+			},
+			confirm() {
+				this.close();
+				this.$emit('onConfirm');
+			},
+			deleteVal() {
+				this.$emit('onDelete');
+			},
+			input(val) {
+				if (val === '.' && this.disableDot) return;
+				this.$emit('onInput', val);
+				if(this.active === 2){
+					this.active = 1;
+				}
+			},
+			close() {
+				this.$refs.keyboardPackage.close();
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.keyboardbox {
+		background-color: #FFFFFF;
+
+		.numkeyboard {
+			height: 432rpx;
+			display: flex;
+			background-color: #ebedf0;
+
+			.btn-area {
+				width: 180rpx;
+				height: 100%;
+				display: flex;
+				flex-direction: column;
+
+				.item {
+					width: 100%;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					flex-grow: 1;
+				}
+
+				.del {
+					background-color: #ebedf0;
+					color: #333;
+
+					&.active {
+						background-color: #f1f3f5;
+					}
+				}
+
+				.confirem {
+					background-color: #1989fa;
+					color: #FFFFFF;
+
+					&.active {
+						background-color: #0570db;
+					}
+				}
+			}
+
+			.num-area {
+				flex-grow: 1;
+				display: flex;
+				flex-wrap: wrap;
+
+				.row {
+					width: 100%;
+					height: 25%;
+					display: flex;
+					margin-top: 1px;
+
+					.item {
+						flex-grow: 1;
+						height: 100%;
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						background-color: #FFFFFF;
+						border-right: 1px solid #ebedf0;
+						width: 33.33%;
+						
+						&.active {
+							background-color: #ebedf0;
+						}
+
+						&.z {
+							flex-grow: 2;
+							width: 66.66%;
+						}
+
+						&.disabled {
+							background: #FFFFFF;
+							color: #B9B9B9;
+						}
+					}
+				}
+
+			}
+		}
+	}
+
+	.safe-area {
+		padding-bottom: 0rpx;
+		padding-bottom: constant(safe-area-inset-bottom);
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+
+	.platenumber {
+		background-color: #f5f5f5;
+
+		.header {
+			height: 76rpx;
+			background-color: #FFFFFF;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			font-size: 28rpx;
+			border-top: 1px solid #f5f5f5;
+
+			&>view {
+				padding: 0 45rpx;
+				color: #00a7ea;
+				height: 100%;
+				display: flex;
+				align-items: center;
+				&.active {
+					background-color: #ebedf0;
+				}
+			}
+		}
+
+		.main {
+			height: 435rpx;
+
+			.row {
+				margin: 13rpx 0;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+
+				.item {
+					width: 56rpx;
+					height: 94rpx;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					background-color: #FFFFFF;
+					border-radius: 6rpx;
+					margin: 0 7rpx;
+					font-size: 24rpx;
+					&.active {
+						background-color: #ebedf0;
+					}
+
+					&.img {
+						background-color: #c2cacc;
+						width: 94rpx;
+
+						&.active {
+							background-color: #ddd;
+						}
+
+						&>image {
+							width: 49rpx;
+							height: 48rpx;
+						}
+					}
+				}
+			}
+
+		}
+	}
+</style>

+ 22 - 0
components/uni-popup/message.js

@@ -0,0 +1,22 @@
+export default {
+	created() {
+		if (this.type === 'message') {
+			// 不显示遮罩
+			this.maskShow = false 
+			// 获取子组件对象
+			this.childrenMsg = null
+		}
+	},
+	methods: {
+		customOpen() {
+			if (this.childrenMsg) {
+				this.childrenMsg.open()
+			}
+		},
+		customClose() {
+			if (this.childrenMsg) {
+				this.childrenMsg.close()
+			}
+		}
+	}
+}

+ 25 - 0
components/uni-popup/popup.js

@@ -0,0 +1,25 @@
+import message from './message.js';
+// 定义 type 类型:弹出类型:top/bottom/center
+const config = {
+	// 顶部弹出
+	top:'top',
+	// 底部弹出
+	bottom:'bottom',
+	// 居中弹出
+	center:'center',
+	// 消息提示
+	message:'top',
+	// 对话框
+	dialog:'center',
+	// 分享
+	share:'bottom',
+}
+
+export default {
+	data(){
+		return {
+			config:config
+		}
+	},
+	mixins: [message],
+}

+ 243 - 0
components/uni-popup/uni-popup-dialog.vue

@@ -0,0 +1,243 @@
+<template>
+	<view class="uni-popup-dialog">
+		<view class="uni-dialog-title">
+			<text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{title}}</text>
+		</view>
+		<view class="uni-dialog-content">
+			<text class="uni-dialog-content-text" v-if="mode === 'base'">{{content}}</text>
+			<input v-else class="uni-dialog-input" v-model="val" type="text" :placeholder="placeholder" :focus="focus" >
+		</view>
+		<view class="uni-dialog-button-group">
+			<view class="uni-dialog-button" @click="close">
+				<text class="uni-dialog-button-text">取消</text>
+			</view>
+			<view class="uni-dialog-button uni-border-left" @click="onOk">
+				<text class="uni-dialog-button-text uni-button-color">确定</text>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	/**
+	 * PopUp 弹出层-对话框样式
+	 * @description 弹出层-对话框样式
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} value input 模式下的默认值
+	 * @property {String} placeholder input 模式下输入提示
+	 * @property {String} type = [success|warning|info|error] 主题样式
+	 *  @value success 成功
+	 * 	@value warning 提示
+	 * 	@value info 消息
+	 * 	@value error 错误
+	 * @property {String} mode = [base|input] 模式、
+	 * 	@value base 基础对话框
+	 * 	@value input 可输入对话框
+	 * @property {String} content 对话框内容
+	 * @property {Boolean} beforeClose 是否拦截取消事件
+	 * @event {Function} confirm 点击确认按钮触发
+	 * @event {Function} close 点击取消按钮触发
+	 */
+
+	export default {
+		name: "uniPopupDialog",
+		props: {
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			placeholder: {
+				type: [String, Number],
+				default: '请输入内容'
+			},
+			/**
+			 * 对话框主题 success/warning/info/error	  默认 success
+			 */
+			type: {
+				type: String,
+				default: 'error'
+			},
+			/**
+			 * 对话框模式 base/input
+			 */
+			mode: {
+				type: String,
+				default: 'base'
+			},
+			/**
+			 * 对话框标题
+			 */
+			title: {
+				type: String,
+				default: '提示'
+			},
+			/**
+			 * 对话框内容
+			 */
+			content: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 拦截取消事件 ,如果拦截取消事件,必须监听close事件,执行 done()
+			 */
+			beforeClose: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				dialogType: 'error',
+				focus: false,
+				val: ""
+			}
+		},
+		inject: ['popup'],
+		watch: {
+			type(val) {
+				this.dialogType = val
+			},
+			mode(val) {
+				if (val === 'input') {
+					this.dialogType = 'info'
+				}
+			},
+			value(val) {
+				this.val = val
+			}
+		},
+		created() {
+			// 对话框遮罩不可点击
+			this.popup.mkclick = false
+			if (this.mode === 'input') {
+				this.dialogType = 'info'
+				this.val = this.value
+			} else {
+				this.dialogType = this.type
+			}
+		},
+		mounted() {
+			this.focus = true
+		},
+		methods: {
+			/**
+			 * 点击确认按钮
+			 */
+			onOk() {
+				this.$emit('confirm', () => {
+					this.popup.close()
+					if (this.mode === 'input') this.val = this.value
+				}, this.mode === 'input' ? this.val : '')
+			},
+			/**
+			 * 点击取消按钮
+			 */
+			close() {
+				if (this.beforeClose) {
+					this.$emit('close', () => {
+						this.popup.close()
+					})
+					return
+				}
+				this.popup.close()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-popup-dialog {
+		width: 300px;
+		border-radius: 15px;
+		background-color: #fff;
+	}
+
+	.uni-dialog-title {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		padding-top: 15px;
+		padding-bottom: 5px;
+	}
+
+	.uni-dialog-title-text {
+		font-size: 16px;
+		font-weight: 500;
+	}
+
+	.uni-dialog-content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		padding: 5px 15px 15px 15px;
+	}
+
+	.uni-dialog-content-text {
+		font-size: 14px;
+		color: #6e6e6e;
+	}
+
+	.uni-dialog-button-group {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		border-top-color: #f5f5f5;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-dialog-button {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 45px;
+	}
+
+	.uni-border-left {
+		border-left-color: #f0f0f0;
+		border-left-style: solid;
+		border-left-width: 1px;
+	}
+
+	.uni-dialog-button-text {
+		font-size: 14px;
+	}
+
+	.uni-button-color {
+		color: $uni-color-primary;
+	}
+
+	.uni-dialog-input {
+		flex: 1;
+		font-size: 14px;
+	}
+
+	.uni-popup__success {
+		color: $uni-color-success;
+	}
+
+	.uni-popup__warn {
+		color: $uni-color-warning;
+	}
+
+	.uni-popup__error {
+		color: $uni-color-error;
+	}
+
+	.uni-popup__info {
+		color: #909399;
+	}
+</style>

+ 116 - 0
components/uni-popup/uni-popup-message.vue

@@ -0,0 +1,116 @@
+<template>
+	<view class="uni-popup-message" :class="'uni-popup__'+[type]">
+		<text class="uni-popup-message-text" :class="'uni-popup__'+[type]+'-text'">{{message}}</text>
+	</view>
+</template>
+
+<script>
+	
+	/**
+	 * PopUp 弹出层-消息提示
+	 * @description 弹出层-消息提示
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [success|warning|info|error] 主题样式
+	 *  @value success 成功
+	 * 	@value warning 提示
+	 * 	@value info 消息
+	 * 	@value error 错误
+	 * @property {String} message 消息提示文字
+	 * @property {String} duration 显示时间,设置为 0 则不会自动关闭
+	 */
+	
+	export default {
+		name: 'UniPopupMessage',
+		props: {
+			/**
+			 * 主题 success/warning/info/error	  默认 success
+			 */
+			type: {
+				type: String,
+				default: 'success'
+			},
+			/**
+			 * 消息文字
+			 */
+			message: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 显示时间,设置为 0 则不会自动关闭
+			 */
+			duration: {
+				type: Number,
+				default: 3000
+			}
+		},
+		inject: ['popup'],
+		data() {
+			return {}
+		},
+		created() {
+			this.popup.childrenMsg = this
+		},
+		methods: {
+			open() {
+				if (this.duration === 0) return
+				clearTimeout(this.popuptimer)
+				this.popuptimer = setTimeout(() => {
+					this.popup.close()
+				}, this.duration)
+			},
+			close() {
+				clearTimeout(this.popuptimer)
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup-message {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		background-color: #e1f3d8;
+		padding: 10px 15px;
+		border-color: #eee;
+		border-style: solid;
+		border-width: 1px;
+	}
+	.uni-popup-message-text {
+		font-size: 14px;
+		padding: 0;
+	}
+
+	.uni-popup__success {
+		background-color: #e1f3d8;
+	}
+
+	.uni-popup__success-text {
+		color: #67C23A;
+	}
+
+	.uni-popup__warn {
+		background-color: #faecd8;
+	}
+
+	.uni-popup__warn-text {
+		color: #E6A23C;
+	}
+
+	.uni-popup__error {
+		background-color: #fde2e2;
+	}
+
+	.uni-popup__error-text {
+		color: #F56C6C;
+	}
+
+	.uni-popup__info {
+		background-color: #F2F6FC;
+	}
+
+	.uni-popup__info-text {
+		color: #909399;
+	}
+</style>

+ 165 - 0
components/uni-popup/uni-popup-share.vue

@@ -0,0 +1,165 @@
+<template>
+	<view class="uni-popup-share">
+		<view class="uni-share-title"><text class="uni-share-title-text">{{title}}</text></view>
+		<view class="uni-share-content">
+			<view class="uni-share-content-box">
+				<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
+					<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
+					<text class="uni-share-text">{{item.text}}</text>
+				</view>
+
+			</view>
+		</view>
+		<view class="uni-share-button-box">
+			<button class="uni-share-button" @click="close">取消</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'UniPopupShare',
+		props: {
+			title: {
+				type: String,
+				default: '分享到'
+			}
+		},
+		inject: ['popup'],
+		data() {
+			return {
+				bottomData: [{
+						text: '微信',
+						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-2.png',
+						name: 'wx'
+					},
+					{
+						text: '支付宝',
+						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-8.png',
+						name: 'wx'
+					},
+					{
+						text: 'QQ',
+						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/gird-3.png',
+						name: 'qq'
+					},
+					{
+						text: '新浪',
+						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-1.png',
+						name: 'sina'
+					},
+					{
+						text: '百度',
+						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-7.png',
+						name: 'copy'
+					},
+					{
+						text: '其他',
+						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-5.png',
+						name: 'more'
+					}
+				]
+			}
+		},
+		created() {},
+		methods: {
+			/**
+			 * 选择内容
+			 */
+			select(item, index) {
+				this.$emit('select', {
+					item,
+					index
+				}, () => {
+					this.popup.close()
+				})
+			},
+			/**
+			 * 关闭窗口
+			 */
+			close() {
+				this.popup.close()
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup-share {
+		background-color: #fff;
+	}
+	.uni-share-title {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		height: 40px;
+	}
+	.uni-share-title-text {
+		font-size: 14px;
+		color: #666;
+	}
+	.uni-share-content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		padding-top: 10px;
+	}
+	
+	.uni-share-content-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: wrap;
+		width: 360px;
+	}
+	
+	.uni-share-content-item {
+		width: 90px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		padding: 10px 0;
+		align-items: center;
+	}
+	
+	.uni-share-content-item:active {
+		background-color: #f5f5f5;
+	}
+	
+	.uni-share-image {
+		width: 30px;
+		height: 30px;
+	}
+	
+	.uni-share-text {
+		margin-top: 10px;
+		font-size: 14px;
+		color: #3B4144;
+	}
+	
+	.uni-share-button-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		padding: 10px 15px;
+	}
+	
+	.uni-share-button {
+		flex: 1;
+		border-radius: 50px;
+		color: #666;
+		font-size: 16px;
+	}
+	
+	.uni-share-button::after {
+		border-radius: 50px;
+	}
+</style>

+ 294 - 0
components/uni-popup/uni-popup.vue

@@ -0,0 +1,294 @@
+<template>
+	<view v-if="showPopup" class="uni-popup" :class="[popupstyle]" @touchmove.stop.prevent="clear">
+		<uni-transition v-if="maskShow" :mode-class="['fade']" :styles="maskClass" :duration="duration" :show="showTrans"
+		 @click="onTap" />
+		<uni-transition :mode-class="ani" :styles="transClass" :duration="duration" :show="showTrans" @click="onTap">
+			<view class="uni-popup__wrapper-box" @click.stop="clear">
+				<slot />
+			</view>
+		</uni-transition>
+	</view>
+</template>
+
+<script>
+	import uniTransition from '../uni-transition/uni-transition.vue'
+	import popup from './popup.js'
+	/**
+	 * PopUp 弹出层
+	 * @description 弹出层组件,为了解决遮罩弹层的问题
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [top|center|bottom] 弹出方式
+	 * 	@value top 顶部弹出
+	 * 	@value center 中间弹出
+	 * 	@value bottom 底部弹出
+	 * 	@value message 消息提示
+	 * 	@value dialog 对话框
+	 * 	@value share 底部分享示例
+	 * @property {Boolean} animation = [ture|false] 是否开启动画
+	 * @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗
+	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
+	 */
+
+	export default {
+		name: 'UniPopup',
+		components: {
+			uniTransition
+		},
+		props: {
+			// 开启动画
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+			// message: 消息提示 ; dialog : 对话框
+			type: {
+				type: String,
+				default: 'center'
+			},
+			// maskClick
+			maskClick: {
+				type: Boolean,
+				default: true
+			}
+		},
+		provide() {
+			return {
+				popup: this
+			}
+		},
+		mixins: [popup],
+		watch: {
+			/**
+			 * 监听type类型
+			 */
+			type: {
+				handler: function(newVal) {
+					this[this.config[newVal]]()
+				},
+				immediate: true
+			},
+			/**
+			 * 监听遮罩是否可点击
+			 * @param {Object} val
+			 */
+			maskClick(val) {
+				this.mkclick = val
+			}
+		},
+		data() {
+			return {
+				duration: 300,
+				ani: [],
+				showPopup: false,
+				showTrans: false,
+				maskClass: {
+					'position': 'fixed',
+					'bottom': 0,
+					'top': 0,
+					'left': 0,
+					'right': 0,
+					'backgroundColor': 'rgba(0, 0, 0, 0.4)'
+				},
+				transClass: {
+					'position': 'fixed',
+					'left': 0,
+					'right': 0,
+				},
+				maskShow: true,
+				mkclick: true,
+				popupstyle: 'top'
+			}
+		},
+		created() {
+			this.mkclick = this.maskClick
+			if (this.animation) {
+				this.duration = 300
+			} else {
+				this.duration = 0
+			}
+		},
+		methods: {
+			clear(e) {
+				// TODO nvue 取消冒泡
+				e.stopPropagation()
+			},
+			open() {
+				this.showPopup = true
+				this.$nextTick(() => {
+					new Promise(resolve => {
+						clearTimeout(this.timer)
+						this.timer = setTimeout(() => {
+							this.showTrans = true
+							// fixed by mehaotian 兼容 app 端
+							this.$nextTick(() => {
+								resolve();
+							})
+						}, 50);
+					}).then(res => {
+						// 自定义打开事件
+						clearTimeout(this.msgtimer)
+						this.msgtimer = setTimeout(() => {
+							this.customOpen && this.customOpen()
+						}, 100)
+						this.$emit('change', {
+							show: true,
+							type: this.type
+						})
+					})
+				})
+			},
+			close(type) {
+				this.showTrans = false
+				this.$nextTick(() => {
+					this.$emit('change', {
+						show: false,
+						type: this.type
+					})
+					clearTimeout(this.timer)
+					// 自定义关闭事件
+					this.customOpen && this.customClose()
+					this.timer = setTimeout(() => {
+						this.showPopup = false
+					}, 300)
+				})
+			},
+			onTap() {
+				if (!this.mkclick) return
+				this.close()
+			},
+			/**
+			 * 顶部弹出样式处理
+			 */
+			top() {
+				this.popupstyle = 'top'
+				this.ani = ['slide-top']
+				this.transClass = {
+					'position': 'fixed',
+					'left': 0,
+					'right': 0,
+				}
+			},
+			/**
+			 * 底部弹出样式处理
+			 */
+			bottom() {
+				this.popupstyle = 'bottom'
+				this.ani = ['slide-bottom']
+				this.transClass = {
+					'position': 'fixed',
+					'left': 0,
+					'right': 0,
+					'bottom': 0
+				}
+			},
+			/**
+			 * 中间弹出样式处理
+			 */
+			center() {
+				this.popupstyle = 'center'
+				this.ani = ['zoom-out', 'fade']
+				this.transClass = {
+					'position': 'fixed',
+					/* #ifndef APP-NVUE */
+					'display': 'flex',
+					'flexDirection': 'column',
+					/* #endif */
+					'bottom': 0,
+					'left': 0,
+					'right': 0,
+					'top': 0,
+					'justifyContent': 'center',
+					'alignItems': 'center'
+				}
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-popup__mask {
+		position: absolute;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: $uni-bg-color-mask;
+		opacity: 0;
+	}
+
+	.mask-ani {
+		transition-property: opacity;
+		transition-duration: 0.2s;
+	}
+
+	.uni-top-mask {
+		opacity: 1;
+	}
+
+	.uni-bottom-mask {
+		opacity: 1;
+	}
+
+	.uni-center-mask {
+		opacity: 1;
+	}
+
+	.uni-popup__wrapper {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: absolute;
+	}
+
+	.top {
+		/* #ifdef H5 */
+		top: var(--window-top);
+		/* #endif */
+		/* #ifndef H5 */
+		top: 0;
+		/* #endif */
+	}
+
+	.bottom {
+		bottom: 0;
+	}
+
+	.uni-popup__wrapper-box {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: relative;
+		/* iphonex 等安全区设置,底部安全区适配 */
+		/* #ifndef APP-NVUE */
+		padding-bottom: constant(safe-area-inset-bottom);
+		padding-bottom: env(safe-area-inset-bottom);
+		/* #endif */
+	}
+
+	.content-ani {
+		// transition: transform 0.3s;
+		transition-property: transform, opacity;
+		transition-duration: 0.2s;
+	}
+
+
+	.uni-top-content {
+		transform: translateY(0);
+	}
+
+	.uni-bottom-content {
+		transform: translateY(0);
+	}
+
+	.uni-center-content {
+		transform: scale(1);
+		opacity: 1;
+	}
+</style>

+ 279 - 0
components/uni-transition/uni-transition.vue

@@ -0,0 +1,279 @@
+<template>
+	<view v-if="isShow" ref="ani" class="uni-transition" :class="[ani.in]" :style="'transform:' +transform+';'+stylesObject"
+	 @click="change">
+		 <slot></slot>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const animation = uni.requireNativePlugin('animation');
+	// #endif
+	/**
+	 * Transition 过渡动画
+	 * @description 简单过渡动画组件
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=985
+	 * @property {Boolean} show = [false|true] 控制组件显示或隐藏
+     * @property {Array} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
+     *  @value fade 渐隐渐出过渡
+     *  @value slide-top 由上至下过渡
+     *  @value slide-right 由右至左过渡
+     *  @value slide-bottom 由下至上过渡
+     *  @value slide-left 由左至右过渡
+     *  @value zoom-in 由小到大过渡
+     *  @value zoom-out 由大到小过渡
+	 * @property {Number} duration 过渡动画持续时间
+	 * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+	 */
+	export default {
+		name: 'uniTransition',
+		props: {
+			show: {
+				type: Boolean,
+				default: false
+			},
+			modeClass: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			duration: {
+				type: Number,
+				default: 300
+			},
+			styles: {
+				type: Object,
+				default () {
+					return {}
+				}
+			}
+		},
+		data() {
+			return {
+				isShow: false,
+				transform: '',
+				ani: { in: '',
+					active: ''
+				}
+			};
+		},
+		watch: {
+			show: {
+				handler(newVal) {
+					if (newVal) {
+						this.open()
+					} else {
+						this.close()
+					}
+				},
+				immediate: true
+			}
+		},
+		computed: {
+			stylesObject() {
+				let styles = {
+					...this.styles,
+					'transition-duration': this.duration / 1000 + 's'
+				}
+				let transfrom = ''
+				for (let i in styles) {
+					let line = this.toLine(i)
+					transfrom += line + ':' + styles[i] + ';'
+				}
+				return transfrom
+			}
+		},
+		created() {
+			// this.timer = null
+			// this.nextTick = (time = 50) => new Promise(resolve => {
+			// 	clearTimeout(this.timer)
+			// 	this.timer = setTimeout(resolve, time)
+			// 	return this.timer
+			// });
+		},
+		methods: {
+			change() {
+				this.$emit('click', {
+					detail: this.isShow
+				})
+			},
+			open() {
+				clearTimeout(this.timer)
+				this.isShow = true
+				this.transform = ''
+				this.ani.in = ''
+				for (let i in this.getTranfrom(false)) {
+					if (i === 'opacity') {
+						this.ani.in = 'fade-in'
+					} else {
+						this.transform += `${this.getTranfrom(false)[i]} `
+					}
+				}
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this._animation(true)
+					}, 50)
+				})
+
+			},
+			close(type) {
+				clearTimeout(this.timer)
+				this._animation(false)
+			},
+			_animation(type) {
+				let styles = this.getTranfrom(type)
+				// #ifdef APP-NVUE
+				if(!this.$refs['ani']) return
+				animation.transition(this.$refs['ani'].ref, {
+					styles,
+					duration: this.duration, //ms
+					timingFunction: 'ease',
+					needLayout: false,
+					delay: 0 //ms
+				}, () => {
+					if (!type) {
+						this.isShow = false
+					}
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				})
+				// #endif
+				// #ifndef APP-NVUE
+				this.transform = ''
+				for (let i in styles) {
+					if (i === 'opacity') {
+						this.ani.in = `fade-${type?'out':'in'}`
+					} else {
+						this.transform += `${styles[i]} `
+					}
+				}
+				this.timer = setTimeout(() => {
+					if (!type) {
+						this.isShow = false
+					}
+					this.$emit('change', {
+						detail: this.isShow
+					})
+
+				}, this.duration)
+				// #endif
+
+			},
+			getTranfrom(type) {
+				let styles = {
+					transform: ''
+				}
+				this.modeClass.forEach((mode) => {
+					switch (mode) {
+						case 'fade':
+							styles.opacity = type ? 1 : 0
+							break;
+						case 'slide-top':
+							styles.transform += `translateY(${type?'0':'-100%'}) `
+							break;
+						case 'slide-right':
+							styles.transform += `translateX(${type?'0':'100%'}) `
+							break;
+						case 'slide-bottom':
+							styles.transform += `translateY(${type?'0':'100%'}) `
+							break;
+						case 'slide-left':
+							styles.transform += `translateX(${type?'0':'-100%'}) `
+							break;
+						case 'zoom-in':
+							styles.transform += `scale(${type?1:0.8}) `
+							break;
+						case 'zoom-out':
+							styles.transform += `scale(${type?1:1.2}) `
+							break;
+					}
+				})
+				return styles
+			},
+			_modeClassArr(type) {
+				let mode = this.modeClass
+				if (typeof(mode) !== "string") {
+					let modestr = ''
+					mode.forEach((item) => {
+						modestr += (item + '-' + type + ',')
+					})
+					return modestr.substr(0, modestr.length - 1)
+				} else {
+					return mode + '-' + type
+				}
+			},
+			// getEl(el) {
+			// 	console.log(el || el.ref || null);
+			// 	return el || el.ref || null
+			// },
+			toLine(name) {
+				return name.replace(/([A-Z])/g, "-$1").toLowerCase();
+			}
+		}
+	}
+</script>
+
+<style>
+	.uni-transition {
+		transition-timing-function: ease;
+		transition-duration: 0.3s;
+		transition-property: transform, opacity;
+	}
+
+	.fade-in {
+		opacity: 0;
+	}
+
+	.fade-active {
+		opacity: 1;
+	}
+
+	.slide-top-in {
+		/* transition-property: transform, opacity; */
+		transform: translateY(-100%);
+	}
+
+	.slide-top-active {
+		transform: translateY(0);
+		/* opacity: 1; */
+	}
+
+	.slide-right-in {
+		transform: translateX(100%);
+	}
+
+	.slide-right-active {
+		transform: translateX(0);
+	}
+
+	.slide-bottom-in {
+		transform: translateY(100%);
+	}
+
+	.slide-bottom-active {
+		transform: translateY(0);
+	}
+
+	.slide-left-in {
+		transform: translateX(-100%);
+	}
+
+	.slide-left-active {
+		transform: translateX(0);
+		opacity: 1;
+	}
+
+	.zoom-in-in {
+		transform: scale(0.8);
+	}
+
+	.zoom-out-active {
+		transform: scale(1);
+	}
+
+	.zoom-out-in {
+		transform: scale(1.2);
+	}
+</style>

+ 1 - 0
main.js

@@ -37,6 +37,7 @@ Vue.prototype.$device_prefix={
 //设备类型【通过设备类型查找】
 Vue.prototype.$device_type={ 
 	FIRE_HYDRANT:'960417', //消防栓
+	ELECTRIC_METER:'100030'//电表
 }
 
 //订阅消息模板

+ 30 - 2
pages.json

@@ -357,6 +357,33 @@
             }
             
         }
+        ,{
+            "path" : "pages/index/car/car",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "车辆记录",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/index/car/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "记录详情",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/index/car/list",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "车辆记录",
+                "enablePullDownRefresh": false
+            }
+            
+        }
     ],
 	"tabBar": {
 		  "list": [
@@ -373,8 +400,9 @@
 	 },
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "uni-app",
+		"navigationBarTitleText": "新邻园区",
 		"navigationBarBackgroundColor": "#FFFFFF",
-		"backgroundColor": "#F8F8F8"
+		"backgroundColor": "#F8F8F8",
+		"backgroundColorTop":"#FFFFFF"
 	}
 }

+ 4 - 7
pages/auth/auth.vue

@@ -15,10 +15,10 @@
 							<u-input  type="select" :select-open="sexSelectShow" v-model="sexSelectList[sexSelectIndex].text" placeholder="请选择性别" @click="sexSelectShow = true"></u-input>
 						</u-form-item>
 						<u-form-item   label="身份证号"  :label-width="labelWidth">
-							<u-input maxlength="18"  placeholder="请输入身份证号" v-model="model.idcard" type="idcard"></u-input>
+							<u-input maxlength="18"  placeholder="请输入身份证号" v-model="model.idcard" ></u-input>
 						</u-form-item>
 						<u-form-item   label="手机号码"  :label-width="labelWidth">
-							<u-input maxlength="11"  placeholder="请输入手机号" v-model="model.phone" type="number"></u-input>
+							<u-input maxlength="11" disabled  placeholder="请输入手机号" v-model="model.phone" type="number"></u-input>
 						</u-form-item>
 						<u-form-item :border-bottom="false"  label="脸部信息采集"  :label-width="labelWidth"></u-form-item>
 					</u-form>
@@ -261,16 +261,13 @@
 					})
 				}
 			},
-			tip(){
-				this.$showModel('认证审核通过后将通过微信服务通知您',false,'通知功能')
-			},
 			/**
 			 * 重新审核操作时,加载用户的认证信息
 			 */
 			async fetchUserInfo(){
 				if (this.$isEmpty(getApp().globalData.userInfo)) {
-					let res=await this.$api.enterprisestaff.detail({phone:this.phone})
-					this.model=res.data
+					let res=await this.$api.enterprisestaff.page({phone:this.phone})
+					this.model=res.data.records[0]
 				}else{
 					this.model=getApp().globalData.userInfo
 				}

+ 18 - 21
pages/company/company.vue

@@ -3,7 +3,7 @@
 		<swiper   class="screen-swiper square-dot "  :indicator-dots="true" :circular="true"
 		 :autoplay="true" interval="5000" duration="500">
 			<swiper-item v-for="(item,index) in bannerList" :key="index">
-				<image   :src="item.image" mode="aspectFill" ></image>
+				<image   :src="item.banners" mode="aspectFill" ></image>
 			</swiper-item>
 		</swiper>
 		
@@ -126,13 +126,17 @@
 			return {
 				id:this.$cache.get('enterpriseId'),
 				detail:{},
-				bannerList: [],
+				bannerList: [
+					{
+					  'banners': "http://139.9.103.171:1888/miniofile/xlyq/banner01.jpg"
+					},
+				],
 				historyList:[],
 			}
 		},
 		onLoad() {
 			this.fetchDeatil()
-			this.fetchStaticData()
+			this.fetchBanner()
 		},
 		methods: {
 			fetchDeatil(){
@@ -140,24 +144,17 @@
 					this.detail=res.data
 				})
 			},
-			fetchStaticData(){
-				this.bannerList=[
-					{
-					  'image': "http://139.9.103.171:1888/miniofile/xlyq/banner01.jpg"
-					},
-				]
-				
-				this.historyList=[
-					{
-						time:'2020',
-						content:'荣获国家环保部2020年度「中国环境社会责任企业J淮安园区高端HDI及先进SLP类载板智能制造工厂项目“云签约”,鹏鼎控股在深圳特区40周年“最受尊敬40家上市公司及人物”评选活动中,鹏鼎控股荣获“最受尊敬40家上市公司”、董事长沈庆芳荣获“最受尊敬40位企业家”'
-					},
-					{
-						time:'2019',
-						content:'建设印度园区举行全球合作伙伴大会鹏鼎控股荣获2019中国上市公司品牌价值榜《第十八届(2018)中国电子电路行业排行榜》中位列PCB企业第一位'
-					},
-				]
-			}
+			fetchBanner(){
+				let params={
+					tenantId:this.$cache.get('agencyTenantId')
+				}
+				this.$api.banner.page(params).then(res=>{
+					if (!this.$isEmpty(res.data.records)) {
+						this.bannerList=res.data.records
+						console.log(this.bannerList);
+					}
+				})
+			},
 		}
 	}
 </script>

+ 51 - 28
pages/device/device.vue

@@ -2,8 +2,8 @@
 	<view class="page" style="position: relative;">
 		<view class="content">
 			<loading  isFullScreen color="#59a5f0" :active="isloading" text="开门中..."></loading>
-			<view @click="open" class="device u-border-bottom" v-for="(item,index) in device_list" :key="index">
-				<text>{{item.name}}</text>
+			<view @click="openDoor(item.macAddress)" class="device u-border-bottom" v-for="(item,index) in device_list" :key="index">
+				<text>{{item.cameraName}}</text>
 				<view class="cu-btn bg-blue round sm">
 					<text class="cuIcon-lock padding-right-10"></text>
 					<text>开门</text>
@@ -30,6 +30,9 @@ export default {
 	},
 	data() {
 		return {
+			//员工id
+			userId:'',
+			
 			//tabbar
 			tabbarCurr:1,
 			tabbar:tabbar,
@@ -38,26 +41,41 @@ export default {
 			//是否展示动画
 			isloading:false,
 			//设备列表
-			device_list:[
-				{
-					id:'3265',
-					name:'德锐斯工业园大门'
-				},
-				{
-					id:'5678',
-					name:'德锐斯工业园南门'
-				},
-				{
-					id:'1577',
-					name:'德锐斯工业园北门'
-				},
-			]
+			device_list:[]
 		};
 	},
 	onLoad() {
 		that=this
+		this.fetchDeviceList()
+		
+		let loginType=this.$cache.get('loginType')
+		if (loginType==this.$loginType.STAFF) {
+			this.getUserId()
+		}
+		
 	},
 	methods:{
+		/**
+		 * 获取员工id
+		 */
+		getUserId(){
+			if (this.$isEmpty(getApp().globalData.userInfo)) {
+				let phone=this.$cache.get('phone')
+				this.$api.enterprisestaff.page({phone:phone,examine:1}).then(res=>{
+					let userInfo=res.data.records[0]
+					this.userId=userInfo.id
+				})
+			}else{
+				let userInfo=getApp().globalData.userInfo
+				this.userId=userInfo.id
+			}
+			
+		},
+		fetchDeviceList(){
+			this.$api.device.page().then(res=>{
+				this.device_list= res.data.records
+			})
+		},
 		open(){
 			//进度条加载
 			this.isloading=true
@@ -70,18 +88,23 @@ export default {
 		/**
 		 * 立即开门
 		 */
-		openDoor() {
-			 let params = {};
-			 params['member_id'] = app.globalData.member.id;
-			 params['device_id'] = device_id;
-			 let operation = 'member/openDoor';
-			 app.globalData.postRequest(params, operation, function (res) {
-				 that.isloading=false
-				 that.isopen=true
-			   app.globalData.oneFailHint(res.data.result_msg,function(){
-				   that.isopen=false
-			   });
-			 });
+		openDoor(macAddress) {
+			let params={
+				userId:this.userId || 123,
+				macAddress:macAddress
+			}
+			this.isloading=true
+			setTimeout(()=>{
+				this.$api.device.open(params).then(res=>{
+					if (res.success) {
+						this.isloading=false
+						this.isopen=true
+						that.$showModel('开门成功',false)
+					}else{
+						that.isopen=false
+					}
+				})
+			},2300)
 		},
 	}
 };

+ 109 - 0
pages/healthCode/healthCode.vue

@@ -0,0 +1,109 @@
+<template>
+	<view>
+			<view class="codeBox" :class="{ 'bg-red': healthCode.color=='red', 'bg-blue': healthCode.color=='green'}" >
+				<view class="timeBar">{{name}}</view>
+				<view class="timeBar">{{nowStr}}</view>
+				<image class="code" :src="healthCode.code"></image>
+				<view v-if="healthCode.color=='green'" class="timeBar" style="height: 250rpx;letter-spacing: 20rpx;">
+					<icon type="success" size="35"/>
+					未见异常
+				</view>
+				<view v-if="healthCode.color=='red'" class="timeBar" style="height: 250rpx;letter-spacing: 20rpx;">
+					<icon type="warn" size="35"/>
+					体温异常
+				</view>
+			</view>
+			<view class="tips">{{tips}}</view>
+			<view class="link"> 测温记录</view>
+	</view>
+</template>
+
+<script>
+	import util from "@/utils/util.js"
+	export default {
+		data() {
+			return {
+				personInfo: {
+					name: "梁汉强",
+					idNumber: "440981199612222852"
+				},
+				timer: '',
+				nowStr: "",
+				healthCode: {
+					code: "http://120.92.153.151:3000/public/recog_images/2021-01-09/06d56a9f7fca42c6",
+					color: "red"
+				},
+				tips: "按照目前掌握的防疫相关数据,暂未发现您存在与防疫相关异常健康状况。防疫相关数据会随着疫情发展及时更新。此次查询并不会排除您的防疫相关健康风险。"
+			}
+		},
+		onLoad() {
+			this.timer = setInterval(()=>{
+				this.nowStr = util.dateFormat(new Date(),"yyyy-MM-dd hh:mm:ss");
+			},1000);
+		},
+		beforeDestroy() {
+			clearInterval(this.timer);
+		},
+		computed:{
+			name(){
+				let chars = this.personInfo.name.split("");
+				return "**"+ chars[chars.length-1]
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+	.timeBar{
+		width: 400rpx;
+		height: 100rpx;
+		color: white;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 40rpx;
+		/* background-color: rgba(255,255,255,0.5); */
+	}
+	.code{
+		background: white;
+		border-radius: 15rpx;
+		padding: 5rpx;
+		width: 400rpx;
+		height: 400rpx;
+	}
+	.codeBox{
+		width: 100%;
+		height: 1000rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		border-radius: 5rpx;
+	}
+	.tips{
+		height: 300rpx;
+		width: 90%;
+		line-height: 50rpx;
+		text-indent: 2em;
+		margin: auto;
+		color: gray;
+		/* background: #18B566; */
+		font-size: 30rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	.link{
+		height: 100rpx;
+		width: 100%;
+		color: #007AFF;
+		display: flex;
+		text-decoration: underline;
+		font-style: italic;
+		align-items: center;
+		justify-content: center;
+	}
+</style>

+ 17 - 10
pages/index/agency/agency.vue

@@ -3,7 +3,7 @@
 		<swiper   class="screen-swiper square-dot "  :indicator-dots="true" :circular="true"
 		 :autoplay="true" interval="5000" duration="500">
 			<swiper-item v-for="(item,index) in bannerList" :key="index">
-				<image   :src="item.image" mode="aspectFill" ></image>
+				<image   :src="item.banners" mode="aspectFill" ></image>
 			</swiper-item>
 		</swiper>
 		
@@ -54,26 +54,33 @@
 			return {
 				id:this.$cache.get('agency'),
 				detail:{},
-				bannerList: [],
+				bannerList: [
+					{
+					  'image': "http://139.9.103.171:1888/miniofile/xlyq/banner01.jpg"
+					},
+				],
 			}
 		},
 		onLoad() {
 			this.fetchDeatil()
-			this.fetchStaticData()
+			this.fetchBanner()
 		},
 		methods: {
+			fetchBanner(){
+				let params={
+					tenantId:this.$cache.get('agencyTenantId')
+				}
+				this.$api.banner.page(params).then(res=>{
+					if (!this.$isEmpty(res.data.records)) {
+						this.bannerList=res.data.records
+					}
+				})
+			},
 			fetchDeatil(){
 				this.$api.agency.page({id:this.id}).then(res=>{
 					this.detail=res.data[0]
 				})
 			},
-			fetchStaticData(){
-				this.bannerList=[
-					{
-					  'image': "http://139.9.103.171:1888/miniofile/xlyq/banner01.jpg"
-					},
-				]
-			}
 		}
 	}
 </script>

+ 204 - 0
pages/index/car/car.vue

@@ -0,0 +1,204 @@
+<template>
+	<view>
+		 <mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="margin-top-20">
+				<car-card  :list="dataList"></car-card>
+			</view>
+		 </mescroll-body>
+		 <view @click="filterShow=true" class="cuIcon cu-btn round  bg-blue" style="position: fixed;bottom: 20%;right: 20rpx;width: 80rpx;height: 80rpx;">
+		 	<text class="cuIcon-filter" style="font-size: 45rpx;"></text>
+			<u-badge size="mini" type="error" :is-center="true" :count="filterCount"></u-badge>
+		 </view>
+		 <u-toast ref="uToast"/>
+		 <u-modal negative-top="300" z-index="88" cancel-text="重置" cancel-color="#000000" @cancel="filterReset" :show-cancel-button="true"  @confirm="filterConfirm" title="筛选" :mask-close-able="true" v-model="filterShow" >
+		 	<view class="slot-content" style="margin: 20rpx;">
+		 		<u-form label-width="150"  ref="uForm">
+		 			<u-form-item label="车牌号"><u-input placeholder="请输入车牌号" disabled @click="openKeyBoard" v-model="plateNumberStr" /></u-form-item>
+		 			<!-- <u-form-item label="入场时间">
+		 				<u-input placeholder="请选择入场时间" type="select" @click="enterTimeShow=true" :selectOpen="enterTimeShow" v-model="params.enterTime" />
+		 			</u-form-item>
+		 			<u-form-item :border-bottom="false" label="出场时间">
+		 				<u-input placeholder="请选择出场时间" @click="outTimeShow=true" :selectOpen="outTimeShow" type="select"  v-model="params.outTime"   />
+		 			</u-form-item> -->
+		 		</u-form>
+		 	</view>
+		 </u-modal>
+		 <keyboard-package z-index="999" ref="plateNumber" type="plateNumber"  @onInput="onInput" @onDelete="onDelete" @onConfirm="onConfirm"/>
+		 <u-picker @confirm="enterTimeConfirm" v-model="enterTimeShow" mode="time"></u-picker>
+		 <u-picker @confirm="outTimeConfirm" v-model="outTimeShow" mode="time"></u-picker>
+	</view>
+</template>
+
+<script>
+	import carCard from "@/components/car-card/car-card.vue"
+	import keyboardPackage from "@/components/keyboard-package/keyboard-package.vue"
+	import MescrollMixin from "@/components/mescroll-body/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		components:{
+			keyboardPackage,carCard
+		},
+		data() {
+			return {
+				iconStyle:{
+					color:"#59a5f0"
+				},
+				
+				filterShow:false,
+				filterCount:0,
+				params:{
+					carNo:'',
+					enterTime:'',
+					outTime:''
+				},
+				enterTimeShow:false,
+				outTimeShow:false,
+				carNoInputList:[],
+				
+				//园区tenantId
+				tenantId:'',
+				dataList: [],
+				
+				upOption: {
+					noMoreSize: 4, 
+					auto: true,
+					page: {
+						page: 0,
+						size: 10
+					}
+				},
+				// 下拉配置参数
+				downOption: {
+					use: true, 
+					auto: false
+				}
+			}
+		},
+		computed:{
+			plateNumberStr(){
+				let str='';
+				this.carNoInputList.forEach(item=>{
+					str+=item.toString();
+				})
+				this.params.carNo=str
+				return str;
+			}
+		},
+		onLoad() {
+			this.tenantId=this.$cache.get('agencyTenantId')
+		},
+		methods: {			
+			enterTimeConfirm(e){
+				this.params.enterTime=e.year+"-"+e.month+"-"+e.day
+			},
+			outTimeConfirm(e){
+				this.params.outTime=e.year+"-"+e.month+"-"+e.day
+			},
+			filterConfirm(){
+				let n=0
+				if (this.$isEmpty()) {
+					
+				}
+				if (!this.$isEmpty(this.params.carNo)) {
+					n++
+				}
+				if (!this.$isEmpty(this.params.enterTime)) {
+					n++
+				}
+				if (!this.$isEmpty(this.params.outTime)) {
+					n++
+				}
+				this.filterCount=n
+				this.dataList=[]
+				this.mescroll.resetUpScroll();
+			},
+			filterReset(){
+				this.filterCount=0
+				this.carNoInputList=[]
+				this.params.carNo=''
+				this.params.enterTime=''
+				this.params.outTime=''
+				this.dataList=[]
+				this.mescroll.resetUpScroll();
+			},
+			/**
+			 * 下拉刷新回调
+			 */
+			downCallback(){
+				setTimeout(()=>{
+					this.$showToast('刷新成功')
+					this.mescroll.resetUpScroll();
+				},1500)
+			},
+			/**
+			 * 上拉加载回调
+			 */
+			upCallback(page){
+				let params={
+					current:page.num,
+					size:page.size,
+					tenantId:this.tenantId,
+				}
+				if (!this.$isEmpty(this.params.carNo)) {
+					params.carNo=this.params.carNo
+				}
+				// if (!this.$isEmpty(this.params.enterTime)) {
+				// 	params.enterTime=this.params.enterTime
+				// }
+				// if (!this.$isEmpty(this.params.outTime)) {
+				// 	params.outTime=this.params.outTime
+				// }
+				try{
+					this.$api.car.page(params).then(res=>{
+						let data=res.data.records
+						this.mescroll.endBySize(data.length, res.total)
+						if (page.num==1) this.dataList=[]
+						this.dataList=this.dataList.concat(data)
+						console.log(this);
+					})
+				}catch(e){
+					this.mescroll.endErr();
+				}
+			},
+			
+			//车牌号键盘
+			onInput(val){
+				console.log(val);
+				this.carNoInputList.push(val)
+			},
+			onDelete(){
+				this.carNoInputList.pop();
+			},
+			onConfirm(){
+				this.params.carNo=this.plateNumberStr
+				console.log(this.params.carNo);
+			},
+			openKeyBoard() {
+				this.$refs.plateNumber.open();
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.demo-warter {
+		height: 530rpx;
+		margin: 20rpx 8rpx;
+		background-color: #ffffff;
+		position: relative;
+		border-top-right-radius: 12rpx;
+		border-top-left-radius: 12rpx;
+		.time{
+			font-size: 26rpx;
+			padding: 20rpx 0 10rpx 20rpx;
+		}
+	}
+	
+	.demo-image {
+		border-top-right-radius: 12rpx;
+		border-top-left-radius: 12rpx;
+		height: 360rpx;
+		width: 100%;
+	}
+</style>

+ 140 - 0
pages/index/car/card.vue

@@ -0,0 +1,140 @@
+<template>
+	<view >
+		<view class="recommend-info" >
+		  <view class="goods-list">
+		    <view @click="showDetail(item)"  class="list" v-for="(item,index) in list" :key="index">
+		      <view class="pictrue" >
+				  <!-- 入场记录 -->
+				<image v-if="current==0" :src="item.enterImgPath?item.enterImgPath:'/static/index/noimg3.png'" mode="scaleToFill"></image>
+				  <!-- 出场记录 -->
+				<image v-if="current==1"  :src="item.outImgPath?item.outImgPath:'/static/index/noimg3.png'" mode="scaleToFill"></image>
+				
+				<view class="car">{{item.carNo}}</view>
+		      </view>
+			  <view class="content">
+				  <view>
+						<text class="cuIcon-time  margin-right-10"></text>
+						<text>进:{{formatDate(item.enterTime)}}</text>
+				  </view>
+				  <!-- 出场时间 -->
+				  <view v-if="current==1" style="padding-top: 8rpx;">
+						<text class="cuIcon-time  margin-right-10"></text>
+						<text>出:{{formatDate(item.outTime)}}</text>
+				  </view>
+				  <!-- 入场车道 -->
+				  <view v-if="current==0" style="padding-top: 8rpx;">
+					    <u-icon style="margin-right: 10rpx;" name="map"></u-icon>
+						<text>{{item.enterGateName}}</text>
+				  </view>
+				  <view class="flex justify-center" style="margin: 20rpx 0;">
+				  	<view  class="cu-btn line-blue round df" style="width: 70%;">
+				  		查看详情
+				  	</view>
+				  </view>
+			  </view>
+		    </view>
+		  </view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:{
+			list: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			current: {
+				type: Number,
+				default: () => {
+					return 0
+				}
+			},
+		},
+		data() {
+			return {
+				
+			}
+		},
+		computed:{
+			formatDate(){
+				return val=>{
+					if (this.$isEmpty(val)) {
+						return '未知'
+					}
+					return this.$u.timeFormat(new Date(val).getTime(), 'mm-dd hh:MM:ss') 
+				}
+			},
+		},
+		methods: {
+			showDetail(item){
+				uni.navigateTo({
+					url:"/pages/index/car/detail?id="+item.id+"&current="+this.current
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	/* 为你推荐 */
+	.recommend-info{
+	  width: 100%;
+	  .recommend-title{
+	    display: flex;
+	    align-items: center;
+	    justify-content: center;
+	    width: 100%;
+	    height: 100rpx;
+	    .title{
+	      display: flex;
+	      align-items: center;
+	      image{
+	        width: 416rpx;
+	        height: 40rpx;
+	      }
+	    }
+	  }
+	  .goods-list{
+	    display: flex;
+	    flex-wrap: wrap;
+	    justify-content: space-between;
+	    padding: 0 30rpx;
+	    .list{
+	      width: 49%;
+	      height: 540rpx;
+	      margin-bottom: 20rpx;
+	      background-color: #FFFFFF;
+	      border-radius: 10rpx;
+	      overflow: hidden;
+	      .pictrue{
+	        width: 100%;
+			position: relative;
+	        image{
+				border-top-right-radius: 12rpx;
+				border-top-left-radius: 12rpx;
+	            height: 330rpx;
+	        }
+			.car{
+				position: absolute;
+				bottom: 20rpx;
+				left: 10rpx;
+				color: #FFFFFF;
+			}
+	      }
+		  
+		  .content{
+			  padding: 20rpx;
+			  text{
+				  padding: 10rpx 0;
+			  }
+		  }
+	      
+	    }
+	  }
+	}
+
+</style>

+ 161 - 0
pages/index/car/detail.vue

@@ -0,0 +1,161 @@
+<template>
+	<view style="background-color: #FFFFFF;min-height: 100vh;">
+		<view style="padding: 20rpx;">
+			<view style="position: relative;">
+				<image v-if="current==0" @click="previewImg(detailData.enterImgPath)":src="detailData.enterImgPath?detailData.enterImgPath:'/static/index/noimg3.png'"  style="width: 100%;height: 400rpx;"></image>
+				<image v-if="current==1" @click="previewImg(detailData.outImgPath)" :src="detailData.outImgPath?detailData.outImgPath:'/static/index/noimg3.png'"  style="width: 100%;height: 400rpx;"></image>
+				<text style="font-size: 32rpx;color: #FFFFFF;position: absolute;bottom: 20rpx;left: 20rpx;">{{detailData.carNo}}</text>
+			</view>
+			<u-cell-group >
+				<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="bookmark-fill"  title="车牌号:" :value="detailData.carNo"></u-cell-item>
+				<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="map-fill"  title="入场车道:" :value="detailData.enterGateName"></u-cell-item>
+				<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="clock-fill"  title="入场时间:" :value="detailData.enterTime"></u-cell-item>
+				<u-cell-item v-if="current==1" :icon-style="iconStyle"  :arrow="false"  icon="map-fill"  title="出口车道:" :value="detailData.outGateName"></u-cell-item>
+				<u-cell-item v-if="current==1" :icon-style="iconStyle"  :arrow="false"  icon="clock-fill"  title="出场时间:" :value="detailData.outTime"></u-cell-item>
+				<u-cell-item :icon-style="iconStyle" :border-bottom="false"  :arrow="false"  icon="rmb-circle-fill"  title="进出费用:" :value="'¥'+detailData.totalAmount"></u-cell-item>
+			</u-cell-group>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: '',
+	data() {
+		return {
+			id:'',
+			current:0,
+			detailData:{},
+			iconStyle:{
+				color:"#59a5f0"
+			},
+		};
+	},
+	onLoad(options) {
+		this.id=options.id
+		this.current=options.current
+		this.fetchDetail()
+	},
+	methods:{
+		fetchDetail(id,current){
+			if (this.current==0) {
+				//入场
+				this.$api.car.enterPage({id:this.id}).then(res=>{
+					this.detailData=res.data.records[0]
+				})
+			}else if (this.current==1) {
+				//出场
+				this.$api.car.outPage({id:this.id}).then(res=>{
+					this.detailData=res.data.records[0]
+				})
+			}
+			
+		},
+		previewImg(img){
+			let imgs=[]
+			imgs.push(img)
+			uni.previewImage({
+				urls:imgs
+			})
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+	
+</style>
+
+<!-- <template>
+	<view class="content ">
+		<view class="flex">
+			<view class="flex flex-direction ">
+				<view class="flex justify-between">
+					<view class="">
+						<view class="item">
+							<text class="cuIcon-newfill text-blue margin-right-10"></text>
+							<text class="text-bold padding-right-10">车牌号:</text>
+							<view class="padding-top-20">{{dataDetail.carNo}}</view>
+						</view>
+						<view class="item">
+							<text class="cuIcon-locationfill text-blue margin-right-10"></text>
+							<text class="text-bold padding-right-10">入口车道:</text>
+							<view class="padding-top-20">{{dataDetail.enterGateName}}</view>
+						</view>
+						<view class="item">
+							<text class="cuIcon-timefill text-blue margin-right-10"></text>
+							<text class="text-bold padding-right-10">进入时间:</text>
+							<view class="padding-top-20">{{dataDetail.enterTime}}</view>
+						</view>
+					</view>
+					<view style="padding-left: 80rpx;">
+						<image @click="previewImg(dataDetail.outImgPath)" style="width: 250rpx;height: 280rpx;border-radius: 12rpx;" mode="scaleToFill" :src="dataDetail.outImgPath"></image>
+					</view>
+				</view>
+				<view class="item">
+					<text class="cuIcon-locationfill text-blue margin-right-10"></text>
+					<text class="text-bold padding-right-10">出口车道:</text>
+					<view class="padding-top-20">{{dataDetail.outGateName}}</view>
+				</view>
+				<view class="item">
+					<text class="cuIcon-timefill text-blue margin-right-10"></text>
+					<text class="text-bold padding-right-10">出去时间:</text>
+					<view class="padding-top-20">{{dataDetail.outTime}}</view>
+				</view>
+				<view class="item">
+					<text class="cuIcon-rechargefill text-blue margin-right-10"></text>
+					<text class="text-bold padding-right-10">进出费用:</text>
+					<view class="padding-top-20 text-price">{{dataDetail.totalAmount}}</view>
+				</view>
+				<view class="item">
+					<text class="cuIcon-peoplefill text-blue margin-right-10"></text>
+					<text class="text-bold padding-right-10">操作人员:</text>
+					<view class="padding-top-20">{{dataDetail.outOperatorName}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	var app=getApp()
+	export default {
+		data() {
+			return {
+				id:'',
+				dataDetail:{}
+			}
+		},
+		onLoad(options) {
+			this.id=options.id
+			this.fetchDetail()
+		},
+		methods: {
+			fetchDetail(){
+				this.$api.car.page({id:this.id}).then(res=>{
+					this.dataDetail=res.data.records[0]
+				})
+			},
+			previewImg(img){
+				let imgs=[]
+				imgs.push(img)
+				uni.previewImage({
+					urls:imgs
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background-color: #FFFFFF;
+	}
+	.content{
+		padding:70rpx 60rpx;
+		.item{
+			padding: 22rpx 0;
+		}
+	}
+</style>
+ -->

+ 112 - 0
pages/index/car/item.vue

@@ -0,0 +1,112 @@
+<template>
+	<view class="">
+		<u-toast ref="uToast"/>
+		<MeScroll  :up="up" :down="down" @up="upFn" :fixed="false" @down="downFn" @init="initMeScroll">
+			<card :list="dataList" :current="i"></card>
+		</MeScroll>
+	</view>
+	
+</template>
+<script>
+	import MeScroll from '@/components/mescroll-body/mescroll-uni.vue'
+	import card from './card.vue'
+	var app=getApp()
+	export default {
+		components:{
+			MeScroll,card
+		},
+		props: {
+			type: Number,
+			i: Number,
+			item:Object
+		},
+		data() {
+			return {
+				tenantId:'',
+				
+				isInit: false, // 是否初始化
+				dataList: [], // 列表数据
+				mescroll: null, // mescroll 对象
+				// 上拉配置参数
+				up: {
+					noMoreSize: 2, 
+					auto: false,
+					page: {
+						page: 0,
+						size: 10
+					}
+				},
+				// 下拉配置参数
+				down: {
+					use: true, 
+					auto: false
+				}
+			}
+		},
+		created() {
+			this.tenantId=this.$cache.get('agencyTenantId')
+		},
+		watch:{
+			type(val) {
+				if(!this.isInit && val === this.i) {
+					this.mescroll.resetUpScroll()
+				}
+			}
+		},
+		mounted() {
+			if(!this.isInit && this.i === 0) {
+				this.mescroll.resetUpScroll()
+			}
+		},
+		methods: {
+			/**
+			 * @param {Object} mescroll 初始化组件
+			 */
+			initMeScroll(mescroll) {
+				this.mescroll = mescroll
+			},
+			/**
+			 * @param {Object} mescroll 上拉回调
+			 */
+			async upFn(mescroll) {
+				let that=this
+				let params={
+					current:mescroll.num,
+					size:mescroll.size,
+					tenantId:this.tenantId,
+				}
+				let res=null
+				try{
+					if (this.i==0) {
+						//入场记录
+						res=await this.$api.car.enterPage(params)
+					}else if (this.i==1) {
+						//出场记录
+						res=await this.$api.car.outPage(params)
+					}
+					let data=res.data.records
+					this.mescroll.endBySize(data.length, res.total)
+					if (mescroll.num==1) this.dataList=[]
+					this.dataList=this.dataList.concat(data)
+				}catch(e){
+					this.mescroll.endErr();
+				}
+			},
+			/**
+			 * 下拉回调
+			 * */
+			downFn(mescroll) {
+				setTimeout(()=>{
+					this.$showToast('刷新成功')
+					this.mescroll.resetUpScroll()
+				},1500)
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	view{
+		box-sizing: border-box;
+	}
+</style>

+ 94 - 0
pages/index/car/list.vue

@@ -0,0 +1,94 @@
+<template>
+	<view class="container">
+		<view class="tabs" style="width: 420rpx;margin: 0rpx  auto;padding-top: 20rpx;">
+			<scroll-view scroll-x class="nav" >
+				<view class="flex text-center">
+					<view  style="border: 1rpx solid #59a5f0;padding:15rpx 20rpx;" class="flex-sub" 
+					:class="index==current?'nav-checked':'nav-unchecked'" 
+					v-for="(item,index) in tabs" :key="index" @tap="tabChange(index)" >
+						{{item.name}}
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+		<view style="height: 100%;margin-top: 20rpx;">
+			<swiper style="height: 100%;" :current="current"  @change="swiperChange"
+				@animationfinish="animationfinish">
+				<swiper-item v-for="(item,index) in tabs" :key="index">
+					<scroll-view scroll-y style="height: 100%;">
+						<item  :i="index" :item="item" :type="current"></item>
+					</scroll-view>
+				</swiper-item>
+			</swiper>
+		</view>
+	</view>
+</template>
+<script>
+	import item from "./item.vue"
+	export default {
+		components: {
+			item
+		},
+		data() {
+			return {
+				scrollLeft:0,
+				current: 0,
+				swiperCurrent:0,
+				tabs: [
+					{
+						name: '入场记录',
+						value:1
+					},
+					{
+						name: '出场记录',
+						value:2
+					}
+				],
+			}
+		},
+		methods:{
+			tabChange(index) {
+				this.current = index
+			},
+			swiperChange(e) {
+			  uni.pageScrollTo({
+			      scrollTop: 0,
+			      duration: 0
+			  });
+			  this.current = e.detail.current
+			},
+			animationfinish({detail: { current }}) {
+				this.swiperCurrent = current;
+				this.current = current;
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		  height: calc(100vh);
+		  background-color: #F6F6F6;
+		  padding: 100rpx 0rpx 0rpx;
+		 .tabs {
+			 height: 100rpx;
+		    position: fixed;
+		    top: 0rpx;
+			left: 0;
+			right: 0;
+			width: 100%;
+			z-index: 3;
+		  }
+	}
+	
+	.nav-checked{
+		background-color: #59a5f0;
+		color: #FFFFFF;
+		font-weight: 800;
+	}
+	
+	.nav-unchecked{
+		background-color: #FFFFFF;
+		color: #59a5f0;
+	}
+</style>

+ 74 - 18
pages/index/fire/alarm-record.vue

@@ -1,13 +1,14 @@
 <template>
 	<view  :class="$isEmpty(list)?'bg-white':'container'">
 		<u-calendar v-model="dateShow" mode="date" @change="change"></u-calendar>
-		<view v-if="!$isEmpty(list)" class="top fixed" >
+		<view  class="top bg-white " style="position: fixed;top: 0;z-index: 999;width: 100%;">
 			<view class="flex justify-between">
 				<view class="flex">
 					<view class="flex justify-center align-center">
 						<image v-if="fireType==0" style="width: 80rpx;height: 80rpx;" src="/static/index/fire/yanwu1.png"></image>
 						<image v-if="fireType==1" style="width: 80rpx;height: 80rpx;" src="/static/index/fire/ranqi2.png"></image>
 						<image v-if="fireType==2" style="width: 80rpx;height: 80rpx;" src="/static/index/fire/xiaofang.png"></image>
+						<image v-if="fireType==3" style="width: 80rpx;height: 80rpx;" src="/static/index/fire/dianbiao.png"></image>
 					</view>
 					<view class="padding-left-40">
 						<view >
@@ -15,16 +16,20 @@
 							<text v-if="fireType==0">烟感报警器</text>
 							<text v-if="fireType==1">燃气报警器</text>
 							<text v-if="fireType==2">消防栓</text>
+							<text v-if="fireType==3">电表设备</text>
 						</view>
 						<view class="padding-top-10">
-							<text class="text-bold">告警记录:</text>
+							<text class="text-bold" v-text="fireType==3?'抄表记录:':'告警记录:'"></text>
 							<text class="text-red padding-right-10 text-bold text-lg">{{total?total:0}}</text>条
 						</view>
 					</view>
 				</view>
-				<view @click="dateShow=true" class="flex text-blue  justify-center align-center">
-					<text class="cuIcon-filter padding-right-20"></text>
-					<text class="">筛选</text>
+				<view @click="dateShow=true" class="flex text-blue flex-direction justify-center align-center">
+					<view class="padding-bottom-20">
+						<text class="cuIcon-filter padding-right-20"></text>
+						<text class="">筛选</text>
+					</view>
+					<u-tag :text="filterDate" @close="tagClick" :show="!$isEmpty(filterDate)"  size="mini" :closeable="true" mode="plain" type="error"/>
 				</view>
 			</view>
 		</view>
@@ -38,7 +43,36 @@
 							</view>
 						</template>
 						<template v-slot:content>
-							<view>
+							<view v-if="fireType==3">
+								<view class="u-order-title">抄表时间:{{item.readTime}}</view>
+								<view class="content" style="width: 636rpx;">
+									<view class="nav-title">
+										<text class="">设备厂家:</text>
+										<text >{{item.deviceFactory}}</text>
+									</view>
+									<view class="nav-title">
+										<text class="">安装位置:</text>
+										<text v-text="item.installAddress"></text>
+									</view>
+									<view class="nav-title">
+										<text class="">年用量:</text>
+										<text>{{item.yearValue}} Kwh</text>
+									</view>
+									<view class="nav-title">
+										<text class="">月用量:</text>
+										<text>{{item.monthValue}} Kwh</text>
+									</view>
+									<view class="nav-title">
+										<text class="">日用量:</text>
+										<text>{{item.dayValue}} Kwh</text>
+									</view>
+									<view class="nav-title">
+										<text class="">总用量:</text>
+										<text>{{item.totalValue}} Kwh</text>
+									</view>
+								</view>
+							</view>
+							<view v-else>
 								<view class="u-order-title">{{item.recordTime}}</view>
 								<view class="content" style="width: 636rpx;">
 									<view >
@@ -79,15 +113,20 @@
 		mixins:[MescrollMixin],
 		data() {
 			return {
+				//设备类型
 				fireType:0,
+				deviceId:'' ,//设备列表的imei等于设备告警记录的deviceId
 				
+				//日期筛选
 				dateShow:false,
+				filterDate:'',
+				filterTagShow:false,
+				
 				list:[],
 				total:'',
-				deviceId:'' ,//设备列表的imei等于设备告警激励的deviceId
 				
 				downOption: {
-					use: true,
+					use: false,
 					auto: false
 				},
 				upOption: {
@@ -124,29 +163,46 @@
 		},
 		methods: {
 			change(e) {
-				console.log(e);
+				this.filterDate=e.result
+				this.mescroll.resetUpScroll()
+			},
+			tagClick(){
+				this.filterDate=''
+				this.mescroll.resetUpScroll()
 			},
+			
 			downCallback(){
 				setTimeout(()=>{
 					this.list=[]
 					this.mescroll.resetUpScroll()
 				},1500)
 			},
-			upCallback(mescroll) {
+			async upCallback(mescroll) {
 				let params={
 					current:mescroll.num,
 					size:mescroll.size,
 					deviceId:this.deviceId
 				}
+				if (!this.$isEmpty(this.filterDate)) {
+					params.recordTime=this.filterDate
+				}
 				try{
-					this.$api.fireDevice.alarmRecord(params).then(res=>{
-						let data=res.data.records
-						let length=data.length
-						this.total=res.data.total
-						mescroll.endBySize(length, this.total);
-						if(mescroll.num == 1) this.list = []; //如果是第一页需手动制空列表
-						this.list=this.list.concat(data); //追加新数据
-					})
+					
+					let res=null
+					if (this.fireType==3) {
+						//抄表记录
+						 res=await this.$api.fireDevice.electricmeterrecord({imei:this.deviceId})
+					}else{
+						//设备报警记录
+						res=await this.$api.fireDevice.alarmRecord(params)
+					}
+					let data=res.data.records
+					let length=data.length
+					this.total=res.data.total
+					mescroll.endBySize(length, this.total);
+					if(mescroll.num == 1) this.list = []; //如果是第一页需手动制空列表
+					this.list=this.list.concat(data); //追加新数据
+					
 				}catch(e){
 					console.log(e);
 					mescroll.endErr();

+ 28 - 9
pages/index/fire/detail.vue

@@ -38,7 +38,8 @@
 								</view>
 							</view>
 						</view>
-						<view class="content flex">
+						<!-- 电表没有这个字段 -->
+						<view class="content flex"  v-if="dataDetail.deviceType!=100030">
 							<view class="flex">
 								<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/wifi.png"></u-icon>
 								<text class="text-bold padding-left-10">信号强弱:</text>
@@ -49,21 +50,39 @@
 								</view>
 							</view>
 						</view>
+<!-- 						<view  class="content flex">
+							<view class="flex justify-start " style="width: 200rpx;">
+								<u-icon  size="36" name="map" color="#fd9510"></u-icon>
+								<text class="text-bold padding-left-10" >安装位置:</text>
+							</view>
+							<view class="">
+								<text  v-text="dataDetail.deviceInstallAddress?dataDetail.deviceInstallAddress:'未知'" class="text-unknow" style="padding-top: 8rpx;" ></text>
+							</view>
+						</view> -->
+						
+						<view class="content flex align-center justify-start">
+							<u-icon  size="36" name="map" color="#72a6f9"></u-icon>
+							<text class="text-bold padding-left-10">安装位置:</text>
+							<text  v-text="dataDetail.deviceInstallAddress?dataDetail.deviceInstallAddress:'未知'"  style="padding-top: 8rpx;" ></text>
+						</view>
+						
+						<view class="content flex align-center justify-start">
+							<u-icon  size="36" name="home" color="#fd9510"></u-icon>
+							<text class="text-bold padding-left-10">所属企业:</text>
+							<text  v-text="dataDetail.enterpriseNames?dataDetail.enterpriseNames:'未知'"  style="padding-top: 8rpx;" ></text>
+						</view>
+						
+						
 						<view  class="content flex">
-							<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/jiance.png"></u-icon>
-							<text class="text-bold padding-left-10">监测值:</text>
-							<text class="text-bold text-red" v-text="dataDetail.monitorValue?dataDetail.monitorValue:'未知'" ></text>
+							<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/updateTime2.png"></u-icon>
+							<text class="text-bold padding-left-10">更新时间:</text>
+							<text class="text-unknow" style="padding-top: 8rpx;"  v-text="dataDetail.updateTime?dataDetail.updateTime:'未知'"></text>
 						</view>
 						<view  class="content flex">
 							<u-icon name="changshangguanliyuan" custom-prefix="custom-icon" size="32" color="#00aa00"></u-icon>
 							<text class="text-bold padding-left-10">厂商名称:</text>
 							<text :class="dataDetail.manufacturers?'':'text-unknow'"  v-text="dataDetail.manufacturers?dataDetail.manufacturers:'未知'"></text>
 						</view>
-						<view  class="content flex">
-							<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/updateTime2.png"></u-icon>
-							<text class="text-bold padding-left-10">更新时间:</text>
-							<text class="text-unknow"  v-text="dataDetail.lastUpdateTime?dataDetail.lastUpdateTime:'未知'"></text>
-						</view>
 						<view  class="content flex">
 							<u-icon name="ICCID" custom-prefix="custom-icon" size="32" color="#55aaff"></u-icon>
 							<text class="text-bold padding-left-10">ICCID:</text>

+ 15 - 12
pages/index/fire/list/card.vue

@@ -1,10 +1,10 @@
 <template>
 	<view class="">
-		<view  class="data" v-for="(item, index) in list" :key="index">
+		<view @click="goDetail(item)"  class="data" v-for="(item, index) in list" :key="index">
 			<view class="top">
 				<view class="left">
 					<view class="title">
-						<text>IEMI:{{item.imei}}</text>
+						<text>IMEI:{{item.imei}}</text>
 						<text @click.stop="copy(item.imei)" style="text-decoration: underline;" class="text-blue padding-left-20">复制</text>
 					</view>
 				</view>
@@ -25,6 +25,11 @@
 							<text class="text-bold padding-left-10">设备名称:</text>
 							<text>{{item.deviceName}}</text>
 						</view>
+						<view v-if="item.deviceType==100030" class="content flex align-center justify-start">
+							<u-icon  size="36" name="home" color="#fd9510"></u-icon>
+							<text class="text-bold padding-left-10">所属企业:</text>
+							<text  v-text="item.enterpriseNames?item.enterpriseNames:'未知'"  style="padding-top: 8rpx;" ></text>
+						</view>
 						<view class="content flex">
 							<view class="flex">
 								<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/dianchi.png"></u-icon>
@@ -36,7 +41,8 @@
 								</view>
 							</view>
 						</view>
-						<view class="content flex">
+						<!-- 电表没有这个字段 -->
+						<view class="content flex" v-if="item.deviceType!=100030">
 							<view class="flex">
 								<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/wifi.png"></u-icon>
 								<text class="text-bold padding-left-10">信号强弱:</text>
@@ -47,25 +53,22 @@
 								</view>
 							</view>
 						</view>
-						<view  class="content flex">
-							<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/jiance.png"></u-icon>
-							<text class="text-bold padding-left-10">监测值:</text>
-							<text class="text-bold" v-text="item.monitorValue?item.monitorValue:'未知'" style="color: #1296db;"></text>
-						</view>
 						<view  class="content flex">
 							<u-icon  size="36" name="http://139.9.103.171:1888/miniofile/xlyq/updateTime2.png"></u-icon>
 							<text class="text-bold padding-left-10">更新时间:</text>
-							<text  v-text="item.lastUpdateTime?item.lastUpdateTime:'未知'"></text>
+							<text style="padding-top: 8rpx;" v-text="item.updateTime?item.updateTime:'未知'"></text>
 						</view>
 					</view>
 				</view>
 			</view>
 			<view class="bottom flex" >
-				<view @click="goDetail(item)" class="cu-btn  sm round line-blue" >
+				<view @click.stop="goDetail(item)" class="cu-btn  sm round line-blue" >
 					查看详情
 				</view>
-				<view @click="goAlarm(item)" class="cu-btn  sm round line-blue" style="margin: 0 20rpx;">
-					告警记录
+				<view @click.stop="goAlarm(item)" class="cu-btn  sm round line-blue" style="margin: 0 20rpx;">
+					<text v-if="item.deviceType==100030">抄表记录</text>
+					<text v-else>告警记录</text>
+					
 				</view>
 			</view>
 		</view>

+ 5 - 2
pages/index/fire/list/item.vue

@@ -26,7 +26,7 @@
 				// 上拉配置参数
 				up: {
 					noMoreSize: 2, 
-					auto: true,
+					auto: false,
 					page: {
 						page: 0,
 						size: 10
@@ -92,6 +92,9 @@
 				}else if (this.fireType==2) {
 					//消防水压
 					params.deviceType=this.$device_type.FIRE_HYDRANT
+				}else if (this.fireType==3) {
+					//电表记录
+					params.deviceType=this.$device_type.ELECTRIC_METER
 				}
 				if (!this.$isEmpty(this.item.value)) {
 					params.deviceStatus=this.item.value	//设备状态
@@ -122,7 +125,7 @@
 			downFn(mescroll) {
 				setTimeout(()=>{
 					this.mescroll.resetUpScroll()
-				},1500)
+				},1000)
 			},
 		}
 	}

+ 4 - 0
pages/index/fire/list/list.vue

@@ -76,6 +76,10 @@
 				uni.setNavigationBarTitle({
 				    title: '消防栓'
 				});
+			}else if (this.fireType==3) {
+				uni.setNavigationBarTitle({
+				    title: '电表'
+				});
 			}
 		},
 		methods:{

+ 71 - 25
pages/index/index.vue

@@ -18,7 +18,7 @@
 			<swiper   class="screen-swiper square-dot "  :indicator-dots="true" :circular="true"
 			 :autoplay="true" interval="5000" duration="500">
 				<swiper-item v-for="(item,index) in bannerList" :key="index">
-					<image   :src="item.image" mode="aspectFill" ></image>
+					<image   :src="item.banners" mode="aspectFill" ></image>
 				</swiper-item>
 			</swiper>
 			
@@ -109,7 +109,11 @@ export default {
 			gander:'',
 			
 			//banner
-			bannerList: [],
+			bannerList: [
+				{
+				  'banners': "http://139.9.103.171:1888/miniofile/xlyq/banner01.jpg"
+				},
+			],
 			// 公告
 			noticeList:[],
 			//消防服务
@@ -124,17 +128,30 @@ export default {
 	},
 	onShow() {
 		this.fetchNoticeList()
-		if (this.loginType==this.$loginType.ENTERPRISE) {
+		if (this.loginType!=this.$loginType.STAFF) {
 			this.fetchWaitAuditNum()
 		}
 	},
 	onLoad() {
-		
 		this.fetchStaticData()
+		this.fetchBanner()
 		this.fetchUserInfo()
 		this.fetchNewsList()
 	},
 	methods:{
+		fetchBanner(){
+			let params={
+				tenantId:this.$cache.get('agencyTenantId')
+			}
+			this.$api.banner.page(params).then(res=>{
+				if (!this.$isEmpty(res.data.records)) {
+					this.bannerList=res.data.records
+				}
+			})
+		},
+		/**
+		 * 获取园区动态
+		 */
 		fetchNewsList(){
 			let params={
 				size:5,
@@ -151,10 +168,11 @@ export default {
 		   if (this.loginType==this.$loginType.STAFF) {
 				//员工
 				let phone=this.$cache.get('phone')
-				this.$api.enterprisestaff.detail({phone:phone}).then(res=>{
-					getApp().globalData.userInfo=res.data
-					this.$cache.put("residentialId",res.data.residentialId)
-					this.gander=res.data.agencyName
+				this.$api.enterprisestaff.page({phone:phone,examine:1}).then(res=>{
+					let userInfo=res.data.records[0]
+					getApp().globalData.userInfo=userInfo
+					this.$cache.put("residentialId",userInfo.residentialId)
+					this.gander=userInfo.enterpriseName
 				})
 		   }else if (this.loginType==this.$loginType.ENTERPRISE) {
 			   this.gander=this.$cache.get('enterpriseName')
@@ -173,7 +191,7 @@ export default {
 		fetchWaitAuditNum(){
 			let that=this
 			let params={
-				size:99,
+				size:200,
 				examine:0
 			}
 			if (this.loginType==this.$loginType.ENTERPRISE) {
@@ -207,6 +225,15 @@ export default {
 		 * @param {Object} url
 		 */
 		jump(url){
+			if (url=='/pages/mine/healthcode/healthcode') {
+				uni.navigateToMiniProgram({
+					appId:'wx2eec5fb00157a603',
+					fail: (err) => {
+						console.log(err);
+					}
+				})
+				return
+			}
 			if (!this.$isEmpty(url)) {
 				uni.navigateTo({
 					url:url
@@ -238,16 +265,11 @@ export default {
 		 * 加载静态数据
 		 */
 		fetchStaticData(){
-			this.bannerList=[
-				{
-				  'image': "http://139.9.103.171:1888/miniofile/xlyq/banner01.jpg"
-				},
-			]
 			this.elements=[
 				{
 					title: '我的企业',
 					name: 'My business',
-					color: '#f9f4f1',
+					color: '#e3f5ff',
 					icon: '../../static/index/gander/qiye.png',
 					url:'/pages/company/company',
 					count:0,
@@ -256,7 +278,7 @@ export default {
 				{
 					title: '园区信息',
 					name: 'Campus information',
-					color: '#f9f4f1',
+					color: '#e3f5ff',
 					icon: '../../static/index/gander/qiye.png',
 					url:'/pages/index/agency/agency',
 					count:0,
@@ -267,7 +289,6 @@ export default {
 					name: 'My profile',
 					color: '#ecf3f9',
 					icon: '../../static/index/gander/renzheng.png',
-					// url:'/pages/auth/auth?operationType=1',
 					url:'/pages/index/myinfo/myinfo',
 					count:0,
 					show:this.loginType==this.$loginType.STAFF
@@ -275,7 +296,7 @@ export default {
 				{
 					title: '员工审核',
 					name: 'Staff certification',
-					color: '#ecf3f9',
+					color: '#eaebf9',
 					icon: '../../static/index/gander/renzheng.png',
 					url:'/pages/index/staffAudit/list',
 					count:0,
@@ -284,7 +305,7 @@ export default {
 				{
 					title: '我的测温',
 					name: 'My temperature',
-					color: '#f0f3ff',
+					color: '#e5eef9',
 					icon: '../../static/index/gander/cewen1.png',
 					url:'/pages/index/staff-temperature/list',
 					count:0,
@@ -293,7 +314,7 @@ export default {
 				{
 					title: '测温记录',
 					name: 'Staff temperature',
-					color: '#f0f3ff',
+					color: '#e5eef9',
 					icon: '../../static/index/gander/cewen1.png',
 					url:'/pages/index/staff-temperature/list',
 					count:0,
@@ -302,7 +323,7 @@ export default {
 				{
 					title: '通行记录',
 					name: 'Access records',
-					color: '#f7f7f5',
+					color: '#e9f9f3',
 					icon: '../../static/index/gander/tongxing.png',
 					url:'/pages/index/access-record/access-record',
 					count:0,
@@ -316,30 +337,55 @@ export default {
 					url:'/pages/index/notice/list',
 					count:0,
 					show:this.loginType==this.$loginType.AGENCY
-				}
+				},
+				{
+					title: '健康码',
+					name: 'Staff temperature',
+					color: '#f4f0ff',
+					icon: '../../static/index/gander/health.png',
+					url:'/pages/mine/healthcode/healthcode',
+					count:0,
+					show:this.loginType==this.$loginType.STAFF
+				}, 
+				{
+					title: '车辆记录',
+					name: 'The vehicle record',
+					color: '#fcf5f3',
+					icon: '../../static/index/gander/car.png',
+					url:'/pages/index/car/car',
+					count:0,
+					show:this.loginType==this.$loginType.AGENCY
+				}, 
 			]
 			this.fireList=[
 				{
 					title: '烟感报警',
 					name: 'Smoke alarm',
-					color: '#e5f0f5',
+					color: '#e5eef9',
 					icon: '../../static/index/fire/yangan.png',
 					url:"/pages/index/fire/list/list?fireType=0"
 				},
 				{
 					title: '燃气告警',
 					name: 'Gas alarm',
-					color: '#f0ecea',
+					color: '#ffefef',
 					icon: '../../static/index/fire/ranqi.png',
 					url:"/pages/index/fire/list/list?fireType=1"
 				}, 
 				{
 					title: '消防水压',
 					name: 'Fire water pressure',
-					color: '#ecf3f9',
+					color: '#e9f9f3',
 					icon: '../../static/index/fire/xiaofang.png',
 					url:"/pages/index/fire/list/list?fireType=2"
 				}, 
+				{
+					title: '电表设备',
+					name: 'Metering equipment',
+					color: '#e3f5ff',
+					icon: '../../static/index/fire/dianbiao.png',
+					url:"/pages/index/fire/list/list?fireType=3"
+				}, 
 				
 			]
 		}

+ 2 - 2
pages/index/myinfo/myinfo.vue

@@ -136,8 +136,8 @@
 			async fetchUserInfo(){
 				if (this.$isEmpty(getApp().globalData.userInfo)) {
 					let phone=this.$cache.get('phone')
-					let res=await this.$api.enterprisestaff.detail({phone:phone})
-					this.model=res.data
+					let res=await this.$api.enterprisestaff.page({phone:phone,examine:1})
+					this.model=res.data.records[0]
 				}else{
 					this.model=getApp().globalData.userInfo
 				}

+ 4 - 4
pages/index/notice/list.vue

@@ -1,5 +1,6 @@
 <template>
 	<view>
+		<u-toast ref="uToast"/>
 		<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
 			<view @click="goDetail(item)" class="card" v-for="(item,index) in dataList" :key="index">
 				<view class="title">
@@ -79,11 +80,10 @@
 				this.$showModel('确定要删除该公告吗?').then(res=>{
 					this.$api.notice.remove(params).then(res=>{
 						if (res.success) {
-							this.$showModel('删除成功',false).then(res=>{
+							this.$showToast('删除成功')
+							setTimeout(()=>{
 								this.mescroll.resetUpScroll()
-							})
-						}else{
-							this.$showToast('删除失败','error')
+							},500)
 						}
 					})
 				})

+ 15 - 1
pages/index/staff-temperature/card.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="">
-		<view  v-for="(item,index) in list" :key="index"  @click="goDetail(item)" class="mine_order_statue" >
+		<view  v-for="(item,index) in list" :key="index"  @click="showDetail(item)" class="mine_order_statue" >
 			<view class="flex justify-between" style="padding: 10rpx 0 10rpx 10rpx ;">
 				<view class="flex">
 					<image  :src="item.faceUrl"  ></image>
@@ -35,12 +35,26 @@ export default {
 	data() {
 		return {
 			
+			
 		};
 	},
 	onLoad() {
 		
 	},
 	methods:{
+		showDetail(item){
+			getApp().globalData.staffTemperature=item
+			uni.navigateTo({
+				url:"/pages/index/staff-temperature/detail"
+			})
+		},
+		previewImg(img){
+			let imgs=[]
+			imgs.push(img)
+			uni.previewImage({
+				urls:imgs
+			})
+		},
 		goDetail(item){
 			getApp().globalData.staffTemperature=item
 			uni.navigateTo({

+ 50 - 69
pages/index/staff-temperature/detail.vue

@@ -1,83 +1,64 @@
 <template>
-	<view class="content ">
-		<view class="flex flex-direction ">
-			<view class="flex justify-between">
-				<view class="">
-					<view class="item">
-						<text class="cuIcon-peoplefill text-blue margin-right-10"></text>
-						<text class="text-bold padding-right-10">姓名:</text>
-						<text >{{dataDetail.personName}}</text>
-					</view>
-					<view class="item">
-						<text class="cuIcon-male text-blue margin-right-10"></text>
-						<text class="text-bold padding-right-10">性别:</text>
-						<text v-text="dataDetail.gender==0?'男':'女'"></text>
-					</view>
-					<view class="item">
-						<text class="cuIcon-hotfill text-blue margin-right-10"></text>
-						<text class="text-bold padding-right-10">体温:</text>
-						<text>{{dataDetail.temperature}} ℃</text>
-					</view>
-					<view class="item">
-						<text class="cuIcon-activityfill text-blue margin-right-10"></text>
-						<text class="text-bold padding-right-10">相机名称:</text>
-						<text>{{dataDetail.cameraName}}</text>
-					</view>
+	<view class="page">
+		<view style="padding: 20rpx 5rpx 10rpx;">
+			<view class="flex justify-between padding-right-10">
+				<view class="bg-blue" style="width: 65%;">
+					<u-cell-group :border="false">
+						<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="account-fill"  title="姓名: " :value="detailData.personName || '未知'"></u-cell-item>
+						<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="phone-fill"  title="手机号: " :value="detailData.phone || '未知'"></u-cell-item>
+						<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="info-circle-fill"  title="体温: " :value="detailData.temperature+' ℃'"></u-cell-item>
+					</u-cell-group>
 				</view>
-				<view class="padding-top-20">
-					<image @click="previewImg(dataDetail.faceUrl)"  style="width: 220rpx;height: 250rpx;border-radius: 12rpx;"  :src="dataDetail.faceUrl"></image>
-				</view>
-			</view>
-			<view class="item">
-				<text class="cuIcon-mobilefill text-blue margin-right-10"></text>
-				<text class="text-bold padding-right-10">手机号:</text>
-				<text>{{dataDetail.phone}}</text>
-			</view>
-			<view class="item">
-				<text class="cuIcon-timefill text-blue margin-right-10"></text>
-				<text class="text-bold padding-right-10">测温时间:</text>
-				<text>{{dataDetail.recogTime}}</text>
-			</view>
-			<view class="item">
-				<text class="cuIcon-locationfill text-blue margin-right-10"></text>
-				<text class="text-bold padding-right-10">安装位置:</text>
-				<text>{{dataDetail.address?dataDetail.address:'未知'}}</text>
+				<image @click="previewImg(detailData.faceUrl)" :src="detailData.faceUrl" mode="scaleToFill" style="width: 240rpx;height: 240rpx;"></image>
 			</view>
+			<u-cell-group :border="false">
+				<u-cell-item :value-style="detailData.isException==0?titleStyle0:titleStyle1" :icon-style="iconStyle"  :arrow="false"  icon="question-circle-fill"  title="是否异常:" :value="detailData.isException==0?'否':'异常'"></u-cell-item>
+				<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="bookmark-fill"  title="设备名称:" :value="detailData.cameraName"></u-cell-item>
+				<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="clock-fill"  title="测温时间:" :value="detailData.recogTime"></u-cell-item>
+				<u-cell-item :icon-style="iconStyle"  :arrow="false"  icon="map-fill"  title="安装位置:" :value="detailData.address || '未知'"></u-cell-item>
+			</u-cell-group>
 		</view>
 	</view>
 </template>
 
 <script>
-	var app=getApp()
-	export default {
-		data() {
-			return {
-				dataDetail:{}
-			}
-		},
-		onShow() {
-			this.dataDetail=getApp().globalData.staffTemperature
-		},
-		methods: {
-			previewImg(img){
-				let imgs=[]
-				imgs.push(img)
-				uni.previewImage({
-					urls:imgs
-				})
-			}
+export default {
+	name: '',
+	data() {
+		return {
+			detailData:{},
+			iconStyle:{
+				color:"#59a5f0"
+			},
+			titleStyle0:{
+				color:"#19be6b"
+			},
+			titleStyle1:{
+				color:"#fa3534"
+			},
+		};
+	},
+	onLoad() {
+		
+	},
+	onShow() {
+		this.detailData=getApp().globalData.staffTemperature
+	},
+	methods:{
+		previewImg(img){
+			let imgs=[]
+			imgs.push(img)
+			uni.previewImage({
+				urls:imgs
+			})
 		}
 	}
+};
 </script>
 
-<style lang="scss">
-	page{
+<style lang="scss" scoped>
+	.page{
 		background-color: #FFFFFF;
+		min-height: 100vh;
 	}
-	.content{
-		padding:60rpx;
-		.item{
-			padding: 22rpx 0;
-		}
-	}
-</style>
+</style>

+ 4 - 3
pages/index/staff-temperature/item.vue

@@ -26,7 +26,7 @@
 				// 上拉配置参数
 				up: {
 					noMoreSize: 2, 
-					auto: true,
+					auto: false,
 					page: {
 						page: 0,
 						size: 10
@@ -69,8 +69,9 @@
 					current:mescroll.num,
 					size:mescroll.size
 				}
-				if (!this.$isEmpty(this.item.value)) {
-					params.age=100
+				if (this.i==1) {
+					//异常记录
+					params.isException=1
 				}
 				if (this.loginType==this.$loginType.AGENCY) {
 					//园区登陆

+ 2 - 8
pages/index/staff-temperature/list.vue

@@ -14,15 +14,9 @@
 		<view style="height: 100%;">
 			<swiper style="height: 100%;" :current="current"  @change="swiperChange"
 				@animationfinish="animationfinish">
-				<swiper-item >
+				<swiper-item v-for="(item,index) in tabs" :key="index">
 					<scroll-view scroll-y style="height: 100%;">
-						<item  :i="0" :item="tabs[0]" :type="0"></item>
-						<!-- <item  :i="index" :item="item" :type="current"></item> -->
-					</scroll-view>
-				</swiper-item>
-				<swiper-item>
-					<scroll-view scroll-y style="height: 100%;">
-						<u-empty marginTop="-100"  text="暂无异常记录" src="http://139.9.103.171:1888/miniofile/xlyq/empty/empty.png"></u-empty>
+						<item @showDetail="showDetail"  :i="index" :item="item" :type="current"></item>
 					</scroll-view>
 				</swiper-item>
 			</swiper>

+ 4 - 3
pages/index/staffAudit/card.vue

@@ -38,10 +38,10 @@
 			</view>
 			<view class="bottom" >
 				<!-- 待审核,显示取消工单 -->
-				<view @click.stop="pass(item)" v-if="item.examine==0" class="cu-btn  sm round bg-blue margin-right-20" >
+				<view @click.stop="pass(item)" v-if="item.examine==0" class="cu-btn  sm round bg-blue light margin-right-20" >
 					审核通过
 				</view>
-				<view @click.stop="fail(item)" v-if="item.examine==0" class="cu-btn  sm round bg-blue" >
+				<view @click.stop="fail(item)" v-if="item.examine==0" class="cu-btn  sm round bg-red light" >
 					审核不通过
 				</view>
 			</view>
@@ -108,7 +108,7 @@ export default {
 		display: flex;
 		justify-content: space-between;
 		padding-bottom: 20rpx;
-		border-bottom: 1rpx solid #EEEEEE;
+		border-bottom: 1rpx dashed  #EEEEEE;
 		.left {
 			display: flex;
 			align-items: center;
@@ -136,6 +136,7 @@ export default {
 		}
 	}
 	.bottom {
+		
 		display: flex;
 		margin-top: 30rpx;
 		justify-content: flex-end;

+ 43 - 32
pages/index/staffAudit/detail.vue

@@ -1,8 +1,12 @@
 <template>
 	<view class="">
-		<u-modal :show-cancel-button="true" @confirm="submitFailAudit" v-model="modelShow" >
-			<view class="slot-content margin-10 " style="background-color: #f5f5f5;">
-				<textarea  v-model="opinion" placeholder="请输入审核意见" />
+		<u-modal   :show-cancel-button="true"  @confirm="submitFailAudit" title="审核意见" :mask-close-able="true" v-model="modelShow" >
+			<view class="slot-content" style="margin: 20rpx;">
+				<u-form label-width="150"  ref="uForm">
+					<u-form-item :border-bottom="false">
+						<u-input height="150" placeholder="请输入审核意见(选填)" v-model="opinion" />
+					</u-form-item>
+				</u-form>
 			</view>
 		</u-modal>
 		<view class="data">
@@ -85,11 +89,11 @@
 				</view>
 			</view>
 		</view>
-		<view  class="footer-fixed   padding-20 bg-white flex justify-end margin-right-30" style="box-sizing: border-box;z-index: 999;">
-			<view @click="pass" class="cu-btn df bg-blue round margin-right-20" v-if="dataDetail.examine==0">
+		<view v-if="dataDetail.examine==0" class="footer-fixed   bg-white flex justify-end margin-right-30" style="padding: 25rpx 20rpx;box-sizing: border-box;z-index: 999;border-top: 1rpx solid #DEDEDE;">
+			<view @click="pass" class="cu-btn df bg-blue light round margin-right-20" >
 				审核通过
 			</view>
-			<view @click="fail" class="cu-btn df bg-blue round " v-if="dataDetail.examine==0">
+			<view @click="fail" class="cu-btn df bg-red light round " >
 				审核不通过
 			</view>
 		</view>
@@ -163,8 +167,8 @@ export default {
 			})
 		},
 		fetchDetail(){
-			this.$api.enterprisestaff.detail({id:this.id}).then(res=>{
-				this.dataDetail=res.data
+			this.$api.enterprisestaff.page({id:this.id}).then(res=>{
+				this.dataDetail=res.data.records[0]
 			})
 		},
 		setPreData(data){
@@ -175,19 +179,21 @@ export default {
 			})
 		},
 		pass(){
-			let that=this
+			let item=this.$u.deepClone(this.dataDetail)
 			this.$showModel("确定审核通过该员工信息?").then(res=>{
-				this.dataDetail.examine=1
-				this.dataDetail.auditTime=this.$createDateTime()
-				this.$api.enterprisestaff.submit(this.dataDetail).then(res=>{
-					let msgData={
-						openId:that.dataDetail.openId,
-						content:"审核已通过",
-						remarks:'已审核',
-						enterpriseName:that.dataDetail.enterpriseName
+				item.examine=1
+				item.auditTime=this.$createDateTime()
+				this.$api.enterprisestaff.submit(item).then(res=>{
+					if (res.success==true) {
+						let msgData={
+							openId:item.openId,
+							content:"审核已通过",
+							remarks:'已审核',
+							enterpriseName:item.enterpriseName
+						}
+						this.send(msgData)
 					}
-					that.send(msgData)
-					that.$showModel(res.msg,false).then(res=>{
+					this.$showModel(res.msg,false).then(res=>{
 						this.setPreData(true)
 						uni.navigateBack();
 					})
@@ -199,20 +205,23 @@ export default {
 		 * @param {Object}
 		 */
 		submitFailAudit(){
-			let that=this
-			this.dataDetail.examine=2
-			this.dataDetail.auditTime=this.$createDateTime()
-			this.dataDetail.opinion=that.opinion
-			this.$api.enterprisestaff.submit(this.dataDetail).then(res=>{
-				let msgData={
-					openId:that.dataDetail.openId,
-					content:"审核不通过",
-					remarks:that.opinion || '审核不通过',
-					enterpriseName:that.dataDetail.enterpriseName
+			let item=this.$u.deepClone(this.dataDetail)
+			item.examine=2
+			item.auditTime=this.$createDateTime()
+			item.opinion=this.opinion
+			this.$api.enterprisestaff.submit(item).then(res=>{
+				if (res.success) {
+					let msgData={
+						openId: item.openId,
+						content:"审核不通过",
+						remarks:item.opinion || '审核不通过',
+						enterpriseName:item.enterpriseName
+					}
+					this.send(msgData)
 				}
-				that.send(msgData)
-				that.$showModel(res.msg,false).then(res=>{
-					that.$Router.back()
+				this.$showModel(res.msg,false).then(res=>{
+					this.setPreData(true)
+					this.$Router.back()
 				})
 			})
 		},
@@ -228,6 +237,8 @@ page{
 	background-color: #FFFFFF;
 }
 
+
+
 view{
 	box-sizing: border-box;
 }

+ 23 - 36
pages/index/staffAudit/item.vue

@@ -1,5 +1,6 @@
 <template>
 	<MeScroll  :up="up" :down="down" @up="upFn" :fixed="false" @down="downFn" @init="initMeScroll">
+		<u-toast ref="uToast"/>
 		<card @pass="pass" @fail="fail" :list="list" ></card>
 	</MeScroll>
 </template>
@@ -12,8 +13,14 @@
 			MeScroll,card
 		},
 		props: {
+			//审核意见
+			opinion:String,
+			//真实姓名
 			realName:String,
+			//联系方式
 			phone:String,
+			
+			
 			type: Number,
 			i: Number,
 			fireType: Number,
@@ -24,7 +31,6 @@
 				//审核不通过时展示
 				modelShow:false,
 				//审核不通过的原因
-				opinion:'',
 				dataDetail:{},
 				
 				//所属公司
@@ -40,7 +46,7 @@
 				// 上拉配置参数
 				up: {
 					noMoreSize: 2, 
-					auto: true,
+					auto: false,
 					page: {
 						page: 0,
 						size: 10
@@ -48,7 +54,7 @@
 				},
 				// 下拉配置参数
 				down: {
-					use: true, 
+					use: false, 
 					auto: false
 				}
 			}
@@ -74,53 +80,33 @@
 			/**
 			 * 通过审核
 			 */
-			pass(item){
+			pass(data){
 				let that=this
+				let item=this.$u.deepClone(data)
 				this.$showModel("确定审核通过该员工信息吗?").then(res=>{
 					item.examine=1
 					item.auditTime=this.$createDateTime()
 					this.$api.enterprisestaff.submit(item).then(res=>{
-						that.$u.toast(res.msg)
-						let msgData={
-							openId:item.openId,
-							content:"审核已通过",
-							remarks:"已审核",
-							enterpriseName:item.enterpriseName
+						if (res.success==true) {
+							this.$showToast(res.msg)
+							let msgData={
+								openId:item.openId,
+								content:"审核已通过",
+								remarks:"已审核",
+								enterpriseName:item.enterpriseName
+							}
+							that.send(msgData)
+							that.mescroll.resetUpScroll()
 						}
-						that.send(msgData)
-						that.mescroll.resetUpScroll()
 					})
 				})
 			},
-			/**
-			 * 审核不通过
-			 * @param {Object}
-			 */
-			submitFailAudit(){
-				let item=this.dataDetail
-				let that=this
-				item.examine=2
-				item.opinion=that.opinion
-				item.auditTime=this.$createDateTime()
-				this.$api.enterprisestaff.submit(item).then(res=>{
-					let msgData={
-						openId:item.openId,
-						content:"审核不通过",
-						remarks:that.opinion || '审核不通过',
-						enterpriseName:item.enterpriseName
-					}
-					that.send(msgData)
-					that.$u.toast(res.msg)
-					that.mescroll.resetUpScroll()
-				})
-			},
 			/**
 			 * 显示审核不通过的意见框
 			 * @param {Object} item
 			 */
 			fail(item){
-				this.dataDetail=item
-				this.modelShow=true
+				this.$emit('showOpinion',item)
 			},
 			async send(msgData){
 				let tokenData={
@@ -207,6 +193,7 @@
 			 * */
 			downFn(mescroll) {
 				setTimeout(()=>{
+					this.$showToast('刷新成功')
 					this.mescroll.resetUpScroll()
 				},1500)
 			},

+ 0 - 250
pages/index/staffAudit/item1.vue

@@ -1,250 +0,0 @@
-<template>
-	<MeScroll  :up="up" :down="down" @up="upFn" :fixed="false" @down="downFn" @init="initMeScroll">
-		<u-modal :show-cancel-button="true" @cancel="filterReset" cancel-text="重置" cancel-color="#000000"  @confirm="filterConfirm" title="筛选" :mask-close-able="true" v-model="filterShow" >
-			<view class="slot-content" style="margin: 20rpx;">
-				<u-form label-width="150"  ref="uForm">
-					<u-form-item label="姓名"><u-input v-model="realName" /></u-form-item>
-					<u-form-item :border-bottom="false" label="手机号"><u-input type="number"  v-model="phone" /></u-form-item>
-				</u-form>
-			</view>
-		</u-modal>
-		<card @pass="pass" @fail="fail" :list="list" ></card>
-	</MeScroll>
-</template>
-<script>
-	import MeScroll from '@/components/mescroll-body/mescroll-uni.vue'
-	import card from './card.vue'
-	var app=getApp()
-	export default {
-		components:{
-			MeScroll,card
-		},
-		props: {
-			refresh:Boolean,
-			type: Number,
-			i: Number,
-			fireType: Number,
-			item:Object
-		},
-		data() {
-			return {
-				realName:'',
-				phone:'',
-				filterShow:false,
-				
-				//审核不通过时展示
-				modelShow:false,
-				//审核不通过的原因
-				opinion:'',
-				dataDetail:{},
-				
-				//所属公司
-				enterpriseId:'',
-				//登录类型
-				loginType:'',
-				//园区id
-				agencyId:'',
-				
-				isInit: false, // 是否初始化
-				list: [], // 列表数据
-				mescroll: null, // mescroll 对象
-				// 上拉配置参数
-				up: {
-					noMoreSize: 2, 
-					auto: true,
-					page: {
-						page: 0,
-						size: 10
-					}
-				},
-				// 下拉配置参数
-				down: {
-					use: true, 
-					auto: false
-				}
-			}
-		},
-		created() {
-			this.enterpriseId= this.$cache.get('enterpriseId')
-			this.loginType=this.$cache.get('loginType')
-			this.agencyId=this.$cache.get('agencyId')
-		},
-		watch:{
-			refresh() {
-				console.log("我要刷新了");
-				this.mescroll.resetUpScroll()
-			},
-			type(val) {
-				if(!this.isInit && val === this.i) {
-					this.mescroll.resetUpScroll()
-				}
-			}
-		},
-		mounted() {
-			if(!this.isInit && this.i === 0) {
-				this.mescroll.resetUpScroll()
-			}
-		},
-		methods: {
-			show(){
-				this.filterShow=!this.filterShow
-			},
-			filterConfirm(){
-				this.mescroll.resetUpScroll()
-			},
-			filterReset(){
-				this.realName=''
-				this.phone=''
-				this.mescroll.resetUpScroll()
-			},
-			/**
-			 * 通过审核
-			 */
-			pass(item){
-				let that=this
-				this.$showModel("确定审核通过该员工信息吗?").then(res=>{
-					item.examine=1
-					item.auditTime=this.$createDateTime()
-					this.$api.enterprisestaff.submit(item).then(res=>{
-						that.$u.toast(res.msg)
-						let msgData={
-							openId:item.openId,
-							content:"审核已通过",
-							remarks:"已审核",
-							enterpriseName:item.enterpriseName
-						}
-						that.send(msgData)
-						that.mescroll.resetUpScroll()
-					})
-				})
-			},
-			/**
-			 * 审核不通过
-			 * @param {Object}
-			 */
-			submitFailAudit(){
-				let item=this.dataDetail
-				let that=this
-				item.examine=2
-				item.opinion=that.opinion
-				item.auditTime=this.$createDateTime()
-				this.$api.enterprisestaff.submit(item).then(res=>{
-					let msgData={
-						openId:item.openId,
-						content:"审核不通过",
-						remarks:that.opinion || '审核不通过',
-						enterpriseName:item.enterpriseName
-					}
-					that.send(msgData)
-					that.$u.toast(res.msg)
-					that.mescroll.resetUpScroll()
-				})
-			},
-			/**
-			 * 显示审核不通过的意见框
-			 * @param {Object} item
-			 */
-			fail(item){
-				this.dataDetail=item
-				this.modelShow=true
-			},
-			async send(msgData){
-				let tokenData={
-					grantType:this.$api.wxData.subscribe_grant_type,
-					appId:this.$api.wxData.appId,
-					secret:this.$api.wxData.secret
-				}
-				let res=await this.$api.wxApi.getAccessToken(tokenData)
-				let token=JSON.parse(res.data).access_token
-				let subscribeData={
-					accessToken:token,
-					touser:msgData.openId,
-					lang:"zh_CN",
-					page:'/pages/index/index',
-					miniprogramState:this.$miniprogramState.FORMAL,
-				    templateId: this.$tmplIds[0],
-					  "data": {
-						  "thing13": {
-							  "value": msgData.enterpriseName
-						  },
-						  "thing9":{
-							  "value": "员工认证信息审核"
-						  },
-						  "phrase2": {
-							  "value": msgData.content
-						  },
-						  "thing3": {
-							  "value": msgData.remarks
-						  },
-						}
-				}
-				this.$api.wxApi.subscribe(subscribeData).then(res=>{
-					console.log(res);
-				}).catch(err=>{
-					console.error(err);
-				})
-			},
-			/**
-			 * @param {Object} mescroll 初始化组件
-			 */
-			initMeScroll(mescroll) {
-				this.mescroll = mescroll
-			},
-			/**
-			 * @param {Object} mescroll 上拉回调
-			 */
-			upFn(mescroll) {
-				let that=this
-				let obj={
-					realName:this.realName,
-					phone:this.phone,
-					current:mescroll.num,
-					size:mescroll.size
-				}
-				if (this.loginType==this.$loginType.ENTERPRISE) {
-					//企业登录
-					obj.enterpriseId=this.enterpriseId
-					
-				}else if(this.loginType==this.$loginType.AGENCY){
-					//园区管理员登陆
-					obj.agencyId=this.agencyId
-				}
-				
-				
-				if (this.item.value!=-1) {
-					//不是查询全部就传examine
-					obj.examine=this.item.value
-				}
-				try{
-					this.$api.enterprisestaff.page(obj).then(res=>{
-						let data=res.data.records
-						let length=data.length
-						let total=res.data.total
-						mescroll.endBySize(length, total);
-						if(mescroll.num == 1) that.list = []; //如果是第一页需手动制空列表
-						that.list=that.list.concat(data); //追加新数据
-					})
-				}catch(e){
-					mescroll.endErr();
-				}
-			},
-			/**
-			 * 下拉回调
-			 * */
-			downFn(mescroll) {
-				setTimeout(()=>{
-					this.phone=''
-					this.realName=''
-					this.list=[]
-					this.mescroll.resetUpScroll()
-				},1500)
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	view{
-		box-sizing: border-box;
-	}
-</style>

+ 99 - 3
pages/index/staffAudit/list.vue

@@ -1,13 +1,23 @@
 <template>
 	<view class="container">
+		<u-toast ref="uToast"/>
 		<u-modal cancel-text="重置" cancel-color="#000000" @cancel="filterReset" :show-cancel-button="true"  @confirm="filterConfirm" title="筛选" :mask-close-able="true" v-model="filterShow" >
 			<view class="slot-content" style="margin: 20rpx;">
 				<u-form label-width="150"  ref="uForm">
 					<u-form-item label="员工姓名"><u-input v-model="realName" /></u-form-item>
-					<u-form-item :border-bottom="false" label="手机号"><u-input v-model="phone" type="number"  /></u-form-item>
+					<u-form-item :border-bottom="false" label="手机号"><u-input  v-model="phone" type="number"  /></u-form-item>
 				</u-form>
 			</view>
 		</u-modal>
+		
+		<u-modal   :show-cancel-button="true"  @confirm="opinionConfirm" title="审核意见" :mask-close-able="true" v-model="opinionShow" >
+			<view class="slot-content" style="margin: 20rpx;">
+				<u-form label-width="150"  ref="uForm">
+					<u-form-item :border-bottom="false"><u-input height="150"  placeholder="请输入审核意见(选填)" v-model="opinion" /></u-form-item>
+				</u-form>
+			</view>
+		</u-modal>
+		
 		<view class="tabs flex flex-direction">
 			<view class="flex">
 				<scroll-view scroll-x class="bg-white nav" style="width: 90%;">
@@ -28,7 +38,7 @@
 				@animationfinish="animationfinish">
 				<swiper-item  v-for="(item, index) in tabs" :key="index">
 					<scroll-view scroll-y style="height: 100%;">
-						<item ref="mescrollItem" :realName="realName" :phone="phone" :refresh="refresh" :i="index" :item="item" :type="current"></item>
+						<item @showOpinion="showOpinion" ref="mescrollItem" :opinion="opinion" :realName="realName" :phone="phone" :refresh="refresh" :i="index" :item="item" :type="current"></item>
 					</scroll-view>
 				</swiper-item>
 			</swiper>
@@ -43,6 +53,13 @@
 		},
 		data() {
 			return {
+				// 审核不通过的审核意见
+				opinion:'',
+				// 显示审核不通过对话框
+				opinionShow:false,
+				// 审核不通过的对象
+				failItem:{},
+				
 				filterCount:0,
 				filterShow:false,
 				realName:'',
@@ -83,9 +100,88 @@
 			
 		},
 		methods:{
+			showOpinion(item){
+				this.opinionShow=true
+				this.failItem=item
+			},
+			
+			/**
+			 * 确定审核不通过回调
+			 */
+			opinionConfirm(){
+				this.submitFailAudit()
+			},
+			/**
+			 * 审核不通过
+			 * @param {Object}
+			 */
+			submitFailAudit(){
+				let item=this.$u.deepClone(this.failItem)
+				let that=this
+				item.examine=2
+				item.opinion=that.opinion
+				item.auditTime=this.$createDateTime()
+				that.$api.enterprisestaff.submit(item).then(res=>{
+					if (res.success==true) {
+						this.$showToast(res.msg)
+						let msgData={
+							openId:item.openId,
+							content:"审核不通过",
+							remarks:that.opinion || '审核不通过',
+							enterpriseName:item.enterpriseName
+						}
+						that.send(msgData)
+						that.$nextTick(() => {
+							that.refreshMescroll()
+						})
+					}
+				})
+			},
+			/**
+			 * 发送信息
+			 */
+			async send(msgData){
+				let tokenData={
+					grantType:this.$api.wxData.subscribe_grant_type,
+					appId:this.$api.wxData.appId,
+					secret:this.$api.wxData.secret
+				}
+				let res=await this.$api.wxApi.getAccessToken(tokenData)
+				let token=JSON.parse(res.data).access_token
+				let subscribeData={
+					accessToken:token,
+					touser:msgData.openId,
+					lang:"zh_CN",
+					page:'/pages/index/index',
+					miniprogramState:this.$miniprogramState.FORMAL,
+				    templateId: this.$tmplIds[0],
+					  "data": {
+						  "thing13": {
+							  "value": msgData.enterpriseName
+						  },
+						  "thing9":{
+							  "value": "员工认证信息审核"
+						  },
+						  "phrase2": {
+							  "value": msgData.content
+						  },
+						  "thing3": {
+							  "value": msgData.remarks
+						  },
+						}
+				}
+				this.$api.wxApi.subscribe(subscribeData).then(res=>{
+					console.log(res);
+				}).catch(err=>{
+					console.error(err);
+				})
+			},
+			
+			/**
+			 * 筛选显示
+			 */
 			show(){
 				this.filterShow=true
-				console.log("111");
 			},
 			/**
 			 * 筛选

+ 0 - 125
pages/index/staffAudit/list1.vue

@@ -1,125 +0,0 @@
-<template>
-	<view class="container">
-		<view class="tabs flex">
-			<scroll-view scroll-x class="bg-white nav" style="width: 90%;">
-				<view class="flex text-center">
-					<view class="cu-item flex-sub" :class="index==current?'text-blue text-xl text-bold ':'text-lg'" v-for="(item,index) in tabs" :key="index" @tap="tabChange(index)" >
-						{{item.name}}
-					</view>
-				</view>
-			</scroll-view>
-			<view class="" @click="tapFilterShow">
-				<text class="cuIcon-filter" style="font-size: 40rpx;"></text>
-			</view>
-		</view>
-		<view style="height: 100%;">
-			<swiper style="height: 100%;" :current="current"  @change="swiperChange"
-				@animationfinish="animationfinish">
-				<swiper-item  v-for="(item, index) in tabs" :key="index">
-					<scroll-view scroll-y style="height: 100%;">
-						<item ref="mescrollItem"  :refresh="refresh" :i="index" :item="item" :type="current"></item>
-					</scroll-view>
-				</swiper-item>
-			</swiper>
-		</view>
-	</view>
-</template>
-<script>
-	import item from "./item.vue"
-	export default {
-		components: {
-			item
-		},
-		data() {
-			return {
-				//让item主动刷新
-				refresh:false,
-				scrollLeft:0,
-				current: 0,
-				swiperCurrent:0,
-				tabs: [
-					{
-						name: '全部',
-						value:-1
-					},
-					{
-						name: '待审核',
-						value:0
-					},
-					{
-						name: '已通过',
-						value:1
-					},
-					{
-						name:'未通过',
-						value:2
-					}
-				],
-			}
-		},
-		onShow(){
-			if(this.canReset){
-				let curMescroll = this.getMescroll(this.current)
-				// curMescroll.scrosllTo(0, 100); 
-				curMescroll && curMescroll.resetUpScroll()
-			}
-			this.canReset = true
-		},
-		methods:{
-			tapFilterShow(){
-				let mescrollItems = this.$refs.mescrollItem;
-				if(mescrollItems){
-					let item = mescrollItems[this.current]
-					item.show()
-				}
-			},
-			tabChange(index) {
-				this.current = index
-			},
-			swiperChange(e) {
-			  uni.pageScrollTo({
-			      scrollTop: 0,
-			      duration: 0
-			  });
-			  this.current = e.detail.current
-			},
-			animationfinish({detail: { current }}) {
-				this.swiperCurrent = current;
-				this.current = current;
-			},
-			getMescroll(i){
-				let mescrollItems = this.$refs.mescrollItem;
-				if(mescrollItems){
-					let item = mescrollItems[i]
-					if(item) return item.mescroll
-				}
-				return null
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.text-blue{
-		color: #59a5f0;
-	}
-	.text-xl{
-		font-size: 34rpx;
-	}
-	.container {
-	  height: calc(100vh);
-	  background-color: #F6F6F6;
-	  padding: 78rpx 0rpx 0rpx;
-	 .tabs {
-	    position: fixed;
-	    top: -10rpx;
-		left: 0;
-		display: flex;
-		align-items: center;
-		width: 100%;
-		background-color: #FFFFFF;
-		box-sizing: border-box;
-		z-index: 3;
-	  }
-}
-</style>

+ 5 - 2
pages/login/login.vue

@@ -239,7 +239,7 @@ export default {
 		 * 获取园区列表
 		 */
 		fetchAgencyList(){
-			this.$api.agency.page().then(res=>{
+			this.$api.agency.page({size:200}).then(res=>{
 				this.ganderSelectList=res.data
 			})
 		},
@@ -360,7 +360,7 @@ export default {
 		},
 		//员工登录
 		async staffLogin(){
-			if (this.phone=='17795282222') {
+			if (this.phone=='15622205184') {
 				this.userLogin()
 				return
 			}
@@ -414,6 +414,7 @@ export default {
 						this.$api.enterprisestaff.submit(userInfo)
 					}
 					this.$cache.put('agencyId',userInfo.agencyId)
+					this.$cache.put('agencyTenantId',userInfo.tenantId)
 					getApp().globalData.userInfo=userInfo
 					//存储手机号,便于拉取用户信息
 					this.$cache.put('phone',userInfo.phone)
@@ -448,6 +449,7 @@ export default {
 					let userInfo=res.data.records[0]
 					getApp().globalData.userInfo=userInfo
 					//存储手机号,便于拉取用户信息
+					this.$cache.put('agencyTenantId',userInfo.tenantId)
 					this.$cache.put('phone',userInfo.phone)
 					this.$cache.put('agencyId',userInfo.agencyId)
 					this.$cache.put('enterpriseId',userInfo.enterpriseId)
@@ -481,6 +483,7 @@ export default {
 					})
 					getApp().globalData.userInfo=userInfo
 					//存储公司统一信用代码,便于拉取企业信息
+					this.$cache.put('agencyTenantId',userInfo.tenantId)
 					this.$cache.put('creditCode',this.creditCode)
 					this.$cache.put('enterpriseId',userInfo.id)
 					this.handelSuccessLogin('enterprise')

+ 2 - 1
pages/mine/changePass/changePass.vue

@@ -29,7 +29,8 @@
 				
 				labelWidth:180,
 				password:'',
-				newPass:''
+				newPass:'',
+				confirmPass:''
 			}
 		},
 		onShow() {

+ 0 - 31
pages/mine/changePassword/changePassword.vue

@@ -1,31 +0,0 @@
-<template>
-	<view>
-		<view class="bg-white padding-left-40 padding-right-20">
-			<u-form   ref="uForm" >
-				<u-form-item   label="原密码"  :label-width="labelWidth">
-					<u-input   v-model="password"  type="text"></u-input>
-				</u-form-item>
-				<u-form-item   label="原密码"  :label-width="labelWidth">
-					<u-input   v-model="newPass"  type="text"></u-input>
-				</u-form-item>
-			</u-form>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				labelWidth:120,
-			}
-		},
-		methods: {
-			
-		}
-	}
-</script>
-
-<style>
-
-</style>

+ 2 - 2
pages/mine/editPhone/editPhone.vue

@@ -65,8 +65,8 @@ export default {
 		 * 获取用户信息
 		 */
 		fetchUserInfo(){
-			this.$api.enterprisestaff.detail({phone:this.phone}).then(res=>{
-				this.userInfo=res.data
+			this.$api.enterprisestaff.page({phone:this.phone,examine:1}).then(res=>{
+				this.userInfo=res.data.records[0]
 			})
 		},
 		/**

+ 53 - 23
pages/mine/healthcode/healthcode.vue

@@ -1,20 +1,25 @@
 <template>
 	<view>
+		<view v-if="loading" class="bg-white" style="padding: 0 50rpx;">
+			<image src="https://gdyjht.com.cn/loading.gif" mode="aspectFit" class="gif-white response" style="height:600upx;padding-top: 200rpx;"></image>
+		</view>
+		<view class="flex flex-direction justify-between" style="height: 100vh;" v-else>
 			<view class="codeBox" :class="{ 'bg-red': healthCode.color=='red', 'bg-blue': healthCode.color=='green'}" >
-				<view class="timeBar">{{name}}</view>
+				<view class="timeBar">{{hideName}}</view>
 				<view class="timeBar">{{nowStr}}</view>
 				<image class="code" :src="healthCode.code"></image>
 				<view v-if="healthCode.color=='green'" class="timeBar" style="height: 250rpx;letter-spacing: 20rpx;">
-					<icon type="success" size="45"/>
+					<icon type="success" size="30"/>
 					未见异常
 				</view>
 				<view v-if="healthCode.color=='red'" class="timeBar" style="height: 250rpx;letter-spacing: 20rpx;">
-					<icon type="warn" size="45"/>
+					<icon type="warn" size="30"/>
 					体温异常
 				</view>
 			</view>
 			<view class="tips">{{tips}}</view>
 			<view class="link" @click="navigate('/pages/index/staff-temperature/list')"> 测温记录</view>
+		</view>	
 	</view>
 </template>
 
@@ -23,25 +28,29 @@
 	export default {
 		data() {
 			return {
+				loading:false,
+				
+				hideName:'',
 				personInfo: {
 					name: "*",
 					idNumber: "*"
 				},
 				timer: '',
 				nowStr: "",
-				healthCode: {
-					code: "http://120.92.153.151:3000/public/recog_images/2021-01-09/06d56a9f7fca42c6",
-					color: "green"
-				},
+				healthCode: {},
 				tips: "按照目前掌握的防疫相关数据,暂未发现您存在与防疫相关异常健康状况。防疫相关数据会随着疫情发展及时更新。此次查询并不会排除您的防疫相关健康风险。"
 			}
 		},
-	async	onLoad() {
+	   async onLoad() {
+		   this.loading=true
+		   
 			//获取员工是信息
 			let phone = uni.getStorageSync("phone");
 			let staffRes=await this.$api.enterprisestaff.page({phone});
 			this.personInfo.name = staffRes.data.records[0].realName;
 			this.personInfo.idNumber = staffRes.data.records[0].idcard;
+			//隐藏的姓名
+			this.hideName=this.handelName(this.personInfo.name)
 			//获取实时时间
 			this.getDateStr();
 			
@@ -50,20 +59,32 @@
 			this.healthCode.code = codeRes.data.code;
 			this.healthCode.color = codeRes.data.color;
 			
+			this.loading=false
+			
 		},
 		beforeDestroy() {
 			clearInterval(this.timer);
 		},
-		computed:{
-			name(){
-				let chars = this.personInfo.name.split("");
-				return "**"+ chars[chars.length-1]
-			}
-		},
 		methods: {
+		    handelName(str,frontLen=0,endLen=1) {
+				var newStr;
+				var len = str.length-frontLen-endLen;
+				if (str.length === 2) {
+					newStr = str.substring(0, 1) + '*';
+				} else if (str.length > 2) {
+					var char = '';
+					for (let i = 0; i < len; i++) {
+						char += '*';
+					}
+					newStr = str.substring(0, frontLen) + char + str.substring(str.length-endLen);
+				} else {
+					newStr = str;
+				}
+				return newStr;
+			},
 			getDateStr(){this.timer = setInterval(()=>{
-				this.nowStr = util.dateFormat(new Date(),"yyyy-MM-dd hh:mm:ss");
-			},1000);
+					this.nowStr = util.dateFormat(new Date(),"yyyy-MM-dd hh:mm:ss");
+				},1000);
 			},
 			navigate(path){
 				uni.navigateTo({
@@ -75,6 +96,15 @@
 </script>
 
 <style>
+	page{
+		background-color: #FFFFFF;
+	}
+	
+	.bg-blue{
+		background-color: #4594f1;
+		color: #FFFFFF;
+	}
+	
 	.timeBar{
 		width: 400rpx;
 		height: 100rpx;
@@ -87,23 +117,23 @@
 	}
 	.code{
 		background: white;
-		border-radius: 15rpx;
 		padding: 5rpx;
-		width: 400rpx;
-		height: 400rpx;
+		width: 350rpx;
+		height: 350rpx;
 	}
 	.codeBox{
 		width: 100%;
-		height: 1000rpx;
 		display: flex;
 		flex-direction: column;
 		align-items: center;
 		justify-content: center;
 		border-radius: 5rpx;
+		flex-basis: 95%;
 	}
 	.tips{
-		height: 300rpx;
+		padding: 40rpx 0;
 		width: 90%;
+		line-height: 55rpx;
 		text-indent: 2em;
 		margin: auto;
 		color: gray;
@@ -114,7 +144,7 @@
 		justify-content: center;
 	}
 	.link{
-		height: 100rpx;
+		margin-bottom: 40rpx;
 		width: 100%;
 		color: #007AFF;
 		display: flex;
@@ -123,4 +153,4 @@
 		align-items: center;
 		justify-content: center;
 	}
-</style>
+</style>

+ 2 - 11
pages/mine/mine.vue

@@ -142,12 +142,6 @@ export default {
 					name:'changePsw',
 					show:this.loginType!=this.$loginType.STAFF
 				},
-				{
-					itemName: '健康码',
-					itemIcon: '/static/index/blue/healthcode.png',
-					name:'healthcode',
-					show:true
-				},
 				{
 					itemName: '问题反馈',
 					itemIcon: '/static/index/blue/fankui.png',
@@ -226,8 +220,8 @@ export default {
 		 */
 		fetchStaffInfo(){
 			let phone= this.$cache.get('phone')
-			this.$api.enterprisestaff.detail({phone:phone}).then(res=>{
-				this.staffInfo=res.data
+			this.$api.enterprisestaff.page({phone:phone,examine:1}).then(res=>{
+				this.staffInfo=res.data.records[0]
 			})
 		},
 		/**
@@ -279,9 +273,6 @@ export default {
 				case 'changePsw':
 					url="/pages/mine/changePass/changePass"
 					break;
-				case 'healthcode':
-					url="/pages/mine/healthcode/healthcode"
-					break;
 				default:
 					break;
 			}

BIN
static/delete.png


BIN
static/index/fire/dianbiao.png


BIN
static/index/gander/car.png


BIN
static/index/gander/health.png


BIN
static/index/noimg2.png


BIN
static/index/noimg3.png


BIN
static/index/top.jpg