停车场系统、智慧城市停车、智慧社区、物业管理、新能源充电、人脸门禁 uniapp 系统源码

1. 智慧停车

  • 支持模式

    • 封闭性单个停车场
    • 路边停车(车位级管理)
    • 大小场(场中场),多场子并行或嵌套
  • 所有者模式

    • 统一平台管理
    • 总平台下子账号(区域代理)自建场地资源,自行维护数据
    • 总平台下子账号(区域代理)再分配和单个停车场管理人员(物业管理/维保/保安/财务等人员)
  • 场站管理

    • 车位控制
      精准的实时车位统计和数据及时推送到场地led/lcd屏幕,车位满后禁止车辆进入
      
    • 责任制
      每个场地标记所有者,负责人信息,有需要直连联系实际控制负责人
      
    • 完整证据链
      详细实时记录每一辆车进出时间/场地/进出口/值班人员/图片/视频/金额/优惠/车辆情况(车辆类型|套餐|颜色|品牌)/开闸情况
      
  • 值班调度

    • 值守模式
      支持有人值守/无人值守/统一远程值守调度,数字数据全自动化录入,处理,资产数据产出并计算汇报展现
      
    • 重复过滤
      支持入场二次确认,避免路过和倒车车辆误拍产生歧义账单。短时间内重复多次抓拍只记录一条数据
      
    • 无处可逃
      出场跟车逃费标记,逃费入场提示追缴,补缴入场。支持单场追缴和全网追缴。黑名单通知,违法在逃车辆协同公安网络实时上报
      
    • 万无一失
      入场车牌识别错误可手动校正车牌,出场识别错误自动模糊相似车牌尝试匹配
      
    • 应急响应
      支持一键放行,处理紧急情况,手动免单。支持远程可视对讲。
      
    • 特殊群体
      支持自定义公务车自动免单放行,例如警车,军车,大使馆车,消防车等
      
    • 断电断网
      断电支持值守人员手机一键进出场拍照录入,入场录入人工放行入场,出场时值守人员向车主展示账单,车主扫码支付离场。
      断网支持硬件设备白名单快速自动放行。保障断网解决方案:增加车牌识别相机4G模块/或者使用双网络路由器(4G/有线智能切换)
      
    • 安保互动
      支持入场时值守人员留言,出场时备注留言提示
      
    • 一码识车
      新车无牌/车牌受污/车牌变形/非常规车牌无法识别/三轮代步车等,一键扫码自助入场,扫码缴费出场。公众号/小程序/APP数据一号互通
      
  • 进出控制与显示

    • 私人定制
      支持自定义车辆类型,每个停车场都可以单独对每种车辆类型设定独立的进出收费规则,放行规则,文字播报,语音提示,图片,视频等
      例如黑名单禁止入场,且禁止录入数据,并提示。免费车,在有效期内,享受不一样的停车特权
      
    • 停车VIP
      每个停车场都可以独立发行内部和公开的车辆套餐产品,车主可以通过手机端新购和续费停车套餐,生效期进出无阻,套餐即将过期通知续费
      例如黑名单禁止入场,且禁止录入数据,并提示。免费车,在有效期内,享受不一样的停车特权
      
    • 特殊车辆
      例如日包车(白天停车免费),夜包车(晚上停车免费)。支持特殊车辆自助购买和续费,弥补车辆套餐不够灵活的缺陷
      
  • 车位管理

    • 多位多车
      支持一位多车和多位多车自动切换享受套餐停车特权
      
    • 神圣私产
      支持车位级别管理,车位主人一键扫码升降地锁
      
    • 车位共享
      支持公共车位扫码降锁入位,计时,超时扫码缴费降锁离场
      
    • 快速停车
      手机端实时数据显示当前位置和目的地附近停车场车位情况(余位/价格/免停时长/禁停时段/车场图片/具体位置),可一键导航到空位车
      
    • 反向寻车
      面对复杂多层大型停车场(例如:大型商场地下停车场,机场,超大型立体停车楼等),忘记了自己停在几楼哪个车位,利用车位相机自动记录
      您车辆所在楼层和车位,使用室内导航实时引导您走到你的车辆跟前,导航精度0.5米左右
      

2. 智慧充电

  • 新能源汽车充电

  • 两轮/三轮电动车充电

3. 智慧社区

  • 社区管理

  • 物业管理

  • 人脸门禁

  • 上门维修

4. 电子支付

  • 本平台聚合支付

  • 第三方聚合支付

  • 银行支付

  • 无感支付

5. 用户资源

  • 权限分配

  • 资源分配

<template>
	<view>
		<view class="bgBox">
			<view class="flex">
				<image class="backIcon" src="../../static/images/jiantouLeft.png" mode="" @click="intoBack"></image>
				<view class="navTitle">车场详情</view>
			</view>
			<view class="infoBox flex-col bb">
				<view class="name">{{ changeInfo.stationName }}</view>
				<view class="address flex">
					<view class="single-line">{{ changeInfo.address }}</view>
				</view>
				<view class="spaces flex flex-row-between">
					<view class="flex">
						停车费:免费停车{{ (changeInfo.freeParkTime / 60000).toFixed(0) }}分钟
					</view>

					<view class="flex">
						<image src="../../static/images/man@2x.png" mode="" style="width: 32rpx; height: 32rpx" />
						<view style="margin-left: 8rpx">
							{{
                changeInfo.stationName == null ? '暂无数据' : changeInfo.usedSlowChargeNumber + '/' + changeInfo.slowChargeNumber
              }}
						</view>
						<image src="../../static/images/kuai@2x.png" mode=""
							style="width: 32rpx; height: 32rpx; margin-left: 14rpx" />
						<view style="margin-left: 8rpx">
							{{
                changeInfo.stationName == null ? '暂无数据' : changeInfo.usedFastChargeNumber + '/' + changeInfo.fastChargeNumber
              }}
						</view>
					</view>
				</view>
				<view class="price flex flex-col-center flex-row-between">
					<view class="flex distance">
						<image src="../../static/images/daohang@2x.png" mode="" style="width: 32rpx; height: 32rpx">
						</image>
						<view>距你{{(changeInfo.distance / 1000).toFixed(2)}}km</view>
					</view>
				</view>
				<view class="line"></view>
				<view class="flex flex-row-between" style="margin-top: 32rpx;">
					<view class="flex-col flex-col-center" v-for="item in iconStatusArr" :key="item.icon">
						<image :src="'../../static/images/' + item.icon + '.png'" mode=""
							style="width: 48rpx;height: 48rpx;">
						</image>
						<view style="font-size: 22rpx;font-weight: 400;color: #323233;margin-top: 8rpx;">{{ item.name }}
						</view>
					</view>
				</view>
			</view>
		</view>
		<view class="imageBox">
			<scroll-view :scroll-x="true" style="width: 100%;height: 100%;display: flex; white-space:nowrap;">
				<image class="scrollViewImage" :src="item" v-for="item,index in changeInfo.newImageUrl" :key="item"
					@click="previewImage(index)"></image>
			</scroll-view>
		</view>
		<view class="feeBox bb">
			<view class="name">忙闲情况</view>
			<view class="flex flex-row-between" style="margin-top: 54rpx;">
				<view class="flex-col flex-col-center">
					<view class="changeStatusBox_text flex">
						<view style="line-height: 42rpx;">闲</view>
						<view style="font-size: 42rpx;color: #000;font-weight: 900;margin-left: 6rpx;">
							{{changeInfo.usedFastChargeNumber}}
						</view>
						<view style="line-height: 42rpx;margin-left: 6rpx;">/{{changeInfo.fastChargeNumber}}</view>
					</view>
					<view class="changeStatusBox_red">快桩空闲</view>
				</view>
				<view class="flex-col flex-col-center">
					<view class="changeStatusBox_text flex">
						<view style="line-height: 42rpx;">闲</view>
						<view style="font-size: 42rpx;color: #000;font-weight: 900;margin-left: 6rpx;">
							{{changeInfo.usedSlowChargeNumber}}
						</view>
						<view style="line-height: 42rpx;margin-left: 6rpx;">/{{changeInfo.slowChargeNumber}}</view>
					</view>
					<view class="changeStatusBox_blue">慢桩空闲</view>
				</view>
				<view class="flex-col flex-col-center">
					<view
						style="line-height: 22rpx;font-size: 42rpx;color: #000;font-weight: 900;text-align: center;height: 66rpx;">
						-
					</view>
					<view class="changeStatusBox_gray">即将充满</view>
				</view>
			</view>
		</view>
		<view class="feeBox bb">
			<view class="name">充电费用</view>
			<view class="feeBox_item1 bb flex flex-col-center">
				<view style="margin-left: 32rpx;">
					收费时段
				</view>
				<view style="margin-left: 156rpx;">充电费</view>
				<view style="margin-left: 26rpx;">=</view>
				<view style="margin-left: 34rpx;">电费</view>
				<view style="margin-left: 50rpx;">服务费</view>
			</view>

			<view class="feeBox_item2 bb flex flex-col-center" v-for="item in rulesList" :key="item.id">
				<view style="font-size: 24rpx;color: #434343;font-weight: 500;margin-left: 24rpx;">
					{{ item.startTimeString + ' - ' + item.endTimeTimeString }}
				</view>
				<view
					style="font-size: 24rpx;color: #434343;font-weight: 500;margin-left: 62rpx;width: 60rpx;text-align: center;">
					{{item.fee + item.serviceFee}}
				</view>
				<view
					style="font-size: 24rpx;color: #434343;font-weight: 500;margin-left: 72rpx;width: 60rpx;text-align: center;">
					{{item.fee}}
				</view>
				<view
					style="font-size: 24rpx;color: #434343;font-weight: 500;margin-left: 56rpx;width: 60rpx;text-align: center;">
					{{item.serviceFee}}
				</view>
			</view>
		</view>
		<view class="feeBox bb" v-if="changeInfo.stationType !== 1">
			<view class="name">停车费</view>
			<view class="flex" style="margin-top: 40rpx;">
				<view class="feeBoxItem1 bb">停车费</view>
				<view class="feeBoxItem2 bb">免费停车 {{changeInfo.freeParkTime / 60000}} 分钟</view>
			</view>
			<view class="feeBoxText">该站点充电即可免费停车 {{changeInfo.freeParkTime / 60000}}分钟(充电启动前,请确认输入车牌是否准确)</view>
		</view>
		<uni-safe-area>
			<view class="bottomBox bb flex flex-col-center flex-row-between">
				<view class="left flex flex-col-center flex-row-center" @click="onNavigation">
					<image src="../../static/images/feiji@2x.png" mode=""></image>
					<view class="text">导航</view>
				</view>

				<view class="right flex flex-col-center flex-row-center" @click="onScanChange">
					<image src="../../static/images/VIP@2x(3).png" mode=""></image>
					<view class="text">开始充电</view>
				</view>
			</view>
		</uni-safe-area>
	</view>
</template>

<script>
	import {
		cfChargingStationGetInfoById,
		getChargeRulesListByQuery
	} from '../../network/api.js'

	export default {
		data() {
			return {
				iconStatusArr: [{
					name: '充电桩',
					icon: 'cdz@2x',
					status: false
				}, {
					name: '便利店',
					icon: 'bianlidian@2x',
					status: false
				}, {
					name: '卫生间',
					icon: 'wsj@2x',
					status: false
				}, {
					name: '休息室',
					icon: 'xxs@2x',
					status: false
				}, {
					name: '雨棚',
					icon: 'yupeng@2x',
					status: false
				}, {
					name: '简餐',
					icon: 'jz@2x',
					status: false
				}, {
					name: '人工值守',
					icon: 'rgzs@2x',
					status: false
				}],
				chargeId: '',
				changeInfo: {
					name: '',
					address: '',
					freeTime: '',
					parkingSpaceNumber: '',
					usedParkingSpaceNumber: '',
					distance: 0,
					freeParkTime: 0,
					usedFastChargeNumber: 0,
					fastChargeNumber: 0,
					usedSlowChargeNumber: 0,
					slowChargeNumber: 0,
				},
				rulesList: [],
				locationInfo: {
					longitude: "",
					latitude: "",
				},
			}
		},
		onLoad(e) {
			this.chargeId = e.id
			this.getLocation()
		},
		methods: {
			getLocation() {
				uni.getLocation({
					type: "wgs84",
					success: (res) => {
						console.log("当前位置的经度:" + res.longitude);
						console.log("当前位置的纬度:" + res.latitude);
						this.locationInfo.longitude = res.longitude;
						this.locationInfo.latitude = res.latitude;
						this.fenchData()
						this.fenchRulesData()
					},
				});
			},
			onScanChange() {
				uni.showActionSheet({
					itemList: ['扫码充电', '查看充电桩'],
					success: ({
						tapIndex
					}) => {
						if (tapIndex === 0) {
							uni.scanCode({
								success: (scanRes) => {
									console.log(scanRes);
								}
							})
						} else if (tapIndex === 1) {
							if (this.changeInfo.stationType === 2) {
								uni.navigateTo({
									url: '/pages/chargeDetail/electricVehicleStart?chargeId=' + this
										.chargeId
								})
							} else {
								uni.navigateTo({
									url: '/pages/chargeDetail/bicycleStart?chargeId=' + this
										.chargeId
								})
							}
						}
					}
				})
			},
			intoBack() {
				uni.navigateBack()
			},
			onNavigation() {
				uni.openLocation({
					latitude: this.changeInfo.positionY,
					longitude: this.changeInfo.positionX,
					name: this.changeInfo.stationName,
					address: this.changeInfo.address,
					success: function() {
						console.log('success');
					}
				});
			},
			async fenchRulesData() {
				const {
					data,
					code,
					message
				} = await getChargeRulesListByQuery({
					chargingStationId: this.chargeId,
					page: 1,
					size: 100
				})
				console.log(data, code);
				if (code == 10002) {
					this.rulesList = data
				} else {
					uni.showToast({
						title: message,
						icon: 'none'
					})
				}
			},
			async fenchData() {
				const {
					data,
					code
				} = await cfChargingStationGetInfoById({
					id: this.chargeId,
					positionX: this.locationInfo.longitude,
					positionY: this.locationInfo.latitude,
				})
				console.log(data, code);
				if (code == 10002) {
					this.changeInfo = data
					this.changeInfo.newImageUrl = this.changeInfo.imageUrl.split(',')
				} else {
					uni.showToast({
						title: '获取停车场详情失败',
						icon: 'none'
					})
					setTimeout(function() {
						uni.navigateBack()
					}, 1500);
				}
			},
			previewImage(index) {
				uni.previewImage({
					current: index,
					urls: this.changeInfo.newImageUrl
				})
			}
		}
	}
</script>

<style lang="scss">
	page {
		background: #F5F7FF;
		padding-bottom: 200rpx;
	}

	.bottomBox {
		width: 750rpx;
		height: 165rpx;
		background: #FFFFFF;
		box-shadow: 0rpx -12rpx 14rpx 0rpx rgba(222, 220, 238, 0.5);
		position: fixed;
		left: 0;
		bottom: 0;
		padding: 0 32rpx;
		overflow: hidden;
		padding-bottom: 20rpx;

		.left {
			width: 332rpx;
			height: 100rpx;
			background: rgba(03, 148, 246, 0.18);
			border-radius: 10rpx;

			image {
				width: 40rpx;
				height: 40rpx;
			}

			.text {
				height: 50rpx;
				font-size: 36rpx;
				font-weight: 600;
				color: #6794F6;
				line-height: 50rpx;
				margin-left: 12rpx;
			}
		}

		.right {
			width: 332rpx;
			height: 100rpx;
			background: #6794F6;
			border-radius: 10rpx;

			image {
				width: 40rpx;
				height: 40rpx;
			}

			.text {
				height: 50rpx;
				font-size: 36rpx;
				font-weight: 600;
				color: #FFFFFF;
				line-height: 50rpx;
				margin-left: 12rpx;
			}
		}
	}

	.imageBox {
		width: 686rpx;
		height: 216rpx;
		background: #FFFFFF;
		border-radius: 10rpx;
		margin-left: 32rpx;
	}

	.feeBox {
		width: 686rpx;
		background: #FFFFFF;
		border-radius: 10rpx;
		margin: 32rpx 0 0 32rpx;
		padding: 32rpx;

		.feeBox_item2 {
			width: 622rpx;
			height: 70rpx;
			background: #F8F8F8;
			border-radius: 8rpx;
			margin-top: 28rpx;
			// padding: 20rpx 24rpx;
		}

		.feeBox_item1 {
			width: 622rpx;
			height: 70rpx;
			background: rgba(103, 148, 246, 0.1);
			border-radius: 8rpx;
			border: 2rpx solid #6794F6;
			margin-top: 24rpx;
			font-size: 24rpx;
			color: #6794F6;
			font-weight: 400;
			// padding: 20rpx 24rpx 16rpx 24rpx;
		}

		.name {
			height: 50rpx;
			font-size: 36rpx;
			font-weight: 600;
			color: #323233;
			line-height: 50rpx;
		}
	}

	.scrollViewImage {
		width: 262rpx;
		height: 152rpx;
		border-radius: 16rpx;
		margin: 32rpx 0 0 32rpx;
		display: inline-block;
	}

	.price {
		margin-top: 24rpx;

		.distance {
			view:nth-child(2) {
				height: 34rpx;
				font-size: 24rpx;

				font-weight: 400;
				color: #434343;
				line-height: 34rpx;
				margin-left: 8rpx;
			}
		}
	}

	.changeStatusBox_text {
		height: 66rpx;
		font-size: 24rpx;
		font-weight: 400;
		color: rgba(50, 50, 51, 0.5);
		line-height: 34rpx;
	}

	.changeStatusBox_red {
		width: 120rpx;
		height: 44rpx;
		background: rgba(255, 158, 158, .34);
		border-radius: 22rpx;
		font-size: 22rpx;
		font-weight: 600;
		color: #FF7777;
		line-height: 44rpx;
		text-align: center;
	}

	.changeStatusBox_blue {
		background: rgba(168, 179, 255, .34);
		color: #8393FD;
		@extend .changeStatusBox_red;
	}

	.changeStatusBox_gray {
		background: rgba(190, 194, 223, .34);
		color: #A1A3B1;
		@extend .changeStatusBox_red;
	}

	.bgBox {
		width: 750rpx;
		height: 666rpx;
		background: linear-gradient(360deg, #F5F7FF 0%, #A6C1FB 100%);

		.backIcon {
			width: 64rpx;
			height: 64rpx;
			margin: 100rpx 0 0 32rpx;
		}

		.navTitle {
			width: 160rpx;
			height: 56rpx;
			font-size: 40rpx;
			font-weight: 600;
			color: #FFFFFF;
			line-height: 56rpx;
			margin: 100rpx 0 0 190rpx;
		}

		.infoBox {
			width: 686rpx;
			height: 415rpx;
			background: #FFFFFF;
			border-radius: 10rpx;
			margin: 60rpx 0 0 32rpx;
			padding: 32rpx;

			.line {
				width: 630rpx;
				opacity: 0.43;
				border: 2rpx dashed #979797;
				margin: 42rpx 0 0 0;
			}

			.name {
				height: 50rpx;
				font-size: 36rpx;
				font-weight: 600;
				color: #323233;
				line-height: 50rpx;
			}

			.address {
				margin-top: 8rpx;

				view:nth-child(1) {
					width: 514rpx;
					height: 32rpx;
					font-size: 24rpx;

					font-weight: 400;
					color: #434343;
					line-height: 34rpx;
				}
			}

			.spaces {
				height: 32rpx;
				font-size: 24rpx;

				font-weight: 400;
				color: #323233;
				line-height: 32rpx;
				margin-top: 16rpx;
			}
		}
	}

	.feeBoxItem1 {
		width: 92rpx;
		height: 50rpx;
		background: linear-gradient(138deg, #A0C6FB 0%, #6794F6 100%);
		border-radius: 6rpx 0rpx 0rpx 6rpx;
		font-size: 24rpx;
		font-weight: 400;
		color: #FFFFFF;
		line-height: 50rpx;
		text-align: center;
	}

	.feeBoxItem2 {
		height: 50rpx;
		border-radius: 0rpx 6rpx 6rpx 0;
		border: 2rpx solid #6794F6;
		font-size: 24rpx;
		font-weight: 400;
		color: #6D99F7;
		line-height: 50rpx;
		text-align: center;
		padding: 0 16rpx;
	}

	.feeBoxText {
		width: 622rpx;
		height: 70rpx;
		font-size: 24rpx;
		font-family: PingFangSC-Regular, PingFang SC;
		font-weight: 400;
		color: #434343;
		line-height: 34rpx;
		margin-top: 24rpx;
	}
</style>

源码下载地址(小程序开源地址):停车场系统小程序,新能源电动车充电系统,智慧社区物业人脸门禁小程序: 【涵盖内容】:城市智慧停车系统,汽车新能源充电,两轮电动车充电,物业缴费,社区到访记录,人脸门禁,上门报修等。【开发框】架:union【使用场景】:微信小程序,支付宝小程序,其它平台小程序,混合app【使用教程】:本代码全开源且完整,没有任何缺失和加密,不会存在我们故意动手脚导致你跑不起来的情况,建议使用HBuilder打开和运行本代码

源码下载地址(后台管理开源地址):停车场系统后台管理,新能源电动车充电系统,智慧社区物业人脸门禁后台管理: 城市智慧停车系统,汽车新能源充电,两轮电动车充电,物业缴费,社区到访记录,人脸门禁,上门报修等

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值