Răsfoiți Sursa

交接源码版本 -zzx

zouzexu 8 luni în urmă
comite
5e1687fe62
100 a modificat fișierele cu 8097 adăugiri și 0 ștergeri
  1. 16 0
      .hbuilderx/launch.json
  2. 42 0
      App.vue
  3. 131 0
      components/app-navigation/app-navigation.vue
  4. 50 0
      components/ax-body/ax-body.vue
  5. 116 0
      components/ax-custom-title/ax-custom-title.vue
  6. 35 0
      components/ax-ios-indicator/ax-ios-indicator.vue
  7. 219 0
      components/ax-popup/ax-popup.vue
  8. 20 0
      components/ax/ax.css
  9. 3 0
      components/ax/iconblock.css
  10. 3 0
      components/ax/iconline.css
  11. 20 0
      index.html
  12. 28 0
      main.js
  13. 85 0
      manifest.json
  14. 3 0
      package-lock.json
  15. 127 0
      pages.json
  16. 291 0
      pages/charging/charging.css
  17. 236 0
      pages/charging/charging.vue
  18. 359 0
      pages/coupon-buy/coupon-buy.css
  19. 121 0
      pages/coupon-buy/coupon-buy.vue
  20. BIN
      pages/coupon-buy/ysbth.ttf
  21. 149 0
      pages/feedback-reply/feedback-reply.css
  22. 77 0
      pages/feedback-reply/feedback-reply.vue
  23. 201 0
      pages/feedback/feedback.css
  24. 139 0
      pages/feedback/feedback.vue
  25. 341 0
      pages/index/index.css
  26. 476 0
      pages/index/index.vue
  27. 112 0
      pages/login/login.css
  28. 67 0
      pages/login/login.vue
  29. 349 0
      pages/map/map.css
  30. 214 0
      pages/map/map.vue
  31. 166 0
      pages/my/my.css
  32. 153 0
      pages/my/my.vue
  33. 176 0
      pages/order-detail/order-detail.css
  34. 121 0
      pages/order-detail/order-detail.vue
  35. 270 0
      pages/order/order.css
  36. 214 0
      pages/order/order.vue
  37. 100 0
      pages/recharge-log/recharge-log.css
  38. 79 0
      pages/recharge-log/recharge-log.vue
  39. 189 0
      pages/search/search.css
  40. 118 0
      pages/search/search.vue
  41. 298 0
      pages/site-more/site-more.css
  42. 233 0
      pages/site-more/site-more.vue
  43. 337 0
      pages/site/site.css
  44. 335 0
      pages/site/site.vue
  45. BIN
      pages/site/ysbth2.ttf
  46. 275 0
      pages/terminal/terminal.css
  47. 400 0
      pages/terminal/terminal.vue
  48. 30 0
      pages/web/web.vue
  49. 109 0
      static/css/app.css
  50. 22 0
      static/css/vars.css
  51. 15 0
      static/img/appnav-home.active.svg
  52. 7 0
      static/img/appnav-home.svg
  53. 16 0
      static/img/appnav-my.active.svg
  54. 10 0
      static/img/appnav-my.svg
  55. 8 0
      static/img/appnav-scan.svg.svg
  56. 1 0
      static/img/arrow-right.svg
  57. BIN
      static/img/charging-01.png
  58. BIN
      static/img/charging_station_item_background.png
  59. 3 0
      static/img/distance.svg
  60. 0 0
      static/img/empty.svg
  61. 8 0
      static/img/locate.svg
  62. 3 0
      static/img/locate2.svg
  63. 1 0
      static/img/login-bg.svg
  64. 20 0
      static/img/login-logo.svg
  65. BIN
      static/img/logo-small.png
  66. 209 0
      static/img/logo.svg
  67. 9 0
      static/img/map.svg
  68. BIN
      static/img/marker.active.png
  69. BIN
      static/img/marker.png
  70. 21 0
      static/img/my-bg.svg
  71. 9 0
      static/img/my-icon01.svg
  72. 12 0
      static/img/my-icon02.svg
  73. 11 0
      static/img/my-icon03.svg
  74. 9 0
      static/img/my-icon04.svg
  75. 9 0
      static/img/my-icon05.svg
  76. BIN
      static/img/my-sta-bg01.png
  77. BIN
      static/img/my-sta-bg03.png
  78. 3 0
      static/img/order-detail-arrow.svg
  79. BIN
      static/img/order-detail-bg.png
  80. BIN
      static/img/order-detail-icon.png
  81. BIN
      static/img/page-bg00.jpg
  82. BIN
      static/img/page-bg01.png
  83. 3 0
      static/img/parkade.svg
  84. 7 0
      static/img/plug.svg
  85. 8 0
      static/img/power.svg
  86. 1 0
      static/img/search.svg
  87. 4 0
      static/img/seting.svg
  88. BIN
      static/img/shortcut1.png
  89. BIN
      static/img/shortcut2.png
  90. BIN
      static/img/shortcut3.png
  91. BIN
      static/img/shortcut4.png
  92. BIN
      static/img/site-bg01.png
  93. 3 0
      static/img/site-bg02.svg
  94. 3 0
      static/img/site-bg03.svg
  95. 9 0
      static/img/site-bg04.svg
  96. 16 0
      static/img/site-bg05.svg
  97. 3 0
      static/img/site-icon01.svg
  98. BIN
      static/img/site-icon02.png
  99. BIN
      static/img/site-icon03.png
  100. 1 0
      static/img/switch.svg

+ 16 - 0
.hbuilderx/launch.json

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

+ 42 - 0
App.vue

@@ -0,0 +1,42 @@
+<script>
+	import $api from 'static/js/api.js';
+	import $app from 'static/js/app.js';
+	export default {
+		onLaunch: function(options) {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			// 自动更新管理-------------------------------------------------------------------
+			const updateManager = uni.getUpdateManager();
+			updateManager.onUpdateReady(function(res) {
+				uni.showModal({
+					title: '更新提示',
+					content: '新版本已经准备好,是否重启应用?',
+					success(res) {
+						if (res.confirm) updateManager.applyUpdate();
+					}
+				});
+			});
+			updateManager.onUpdateFailed(function(res) {
+				uni.showModal({
+					title: '更新失败',
+					content: '小程序已有新版本,请稍后重试更新!',
+					showCancel: false
+				});
+			});
+
+			// 自动登录用户-------------------------------------------------------------------
+			const userInfo = $app.storage.get("USER_INFO");
+			if (!userInfo) $api.login();
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+	@import "components/ax/ax.css";
+	@import "static/css/app.css";
+</style>

+ 131 - 0
components/app-navigation/app-navigation.vue

@@ -0,0 +1,131 @@
+<template>
+	<view class="app-navigation">
+		<view class="__body">
+			<view @click="act('home')" class="nav-item">
+				<image :src="homeIcon" class="icon"></image>
+				<view class="name">首页</view>
+			</view>
+			<view class="scan" @click="sacn()">
+				<image src="@/static/img/appnav-scan.svg.svg" class="icon-scan"></image>
+			</view>
+			<view class="scan-placeholder"></view>
+			<view @click="act('my')" class="nav-item">
+				<image :src="myIcon" class="icon"></image>
+				<view class="name">我的</view>
+			</view>
+		</view>
+		<ax-ios-indicator min="10"></ax-ios-indicator>
+	</view>
+</template>
+
+<script>
+import { url } from '../../static/js/app';
+	export default {
+		name:"app-navigation",
+		props:{
+			// 激活对象
+			active:{type:String,default:""}
+		},
+		computed:{
+			myIcon(){
+				return `../../static/img/appnav-my${this.active == 'my'?'.active':''}.svg`;
+			},
+			homeIcon(){
+				return `../../static/img/appnav-home${this.active == 'home'?'.active':''}.svg`;
+			}
+		},
+		methods:{
+			act(name){
+				if(name == this.active) return;
+				var url = '';
+				switch (name){
+					case 'home':
+						url = '/pages/index/index';
+					break;
+					case 'my':
+						url = '/pages/my/my';
+					break;
+				}
+				if(url) uni.reLaunch({url});
+			},
+			//扫一扫
+			sacn(){
+				this.$app.act.scan().then(res=>{
+					var paramObj = this.getUrlParams(res.result);
+					if(!paramObj || !paramObj.connectorCode){
+						this.$app.popup.alert("二维码不正确。","温馨提示!");
+						return;
+					}
+					this.getDeviceInfo(paramObj.connectorCode);
+				})
+			},
+			getUrlParams(url) {
+			  const paramsRegex = /[?&]+([^=&]+)=([^&]*)/gi;
+			  const params = {};
+			  let match;
+			  while (match = paramsRegex.exec(url)) {
+			    params[match[1]] = match[2];
+			  }
+			  return params;
+			},
+			//通过充电桩编码(sn)获取设备详情
+			getDeviceInfo(sn){
+				this.$api.base("post","/chargeApi/checkDevicesBySn",{"sn":sn},{}).then(res=>{
+					console.log("设备信息:",res)
+					var item = res.device;
+					//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+					if(item.deviceStatus == 0 || item.deviceStatus == 255 ){
+						return;
+					}
+					this.$app.url.goto('/pages/terminal/terminal?deviceId='+item.id+"&deviceStatus="+item.deviceStatus);
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.app-navigation{
+	background-color: #fff;
+	border-radius: 15px 15px 0 0;
+	filter: drop-shadow(0 -3px 6px rgba(0, 0, 0, 0.05));
+}
+.app-navigation .__body{
+	display: flex;
+	align-items: center;
+	justify-content: space-around;
+	position: relative;
+	padding: 10px;
+	padding-bottom: 0;
+}
+.scan{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 60px;
+	height: 60px;
+	border-radius: 100pc;
+	background-image: linear-gradient(to right,#8FF8FB,#47AEFF);
+	box-shadow: 0 3px 6px #00BFE1 inset;
+	border: 3px solid #fff;
+	position: absolute;
+	transform: translateY(-10px);
+}
+.scan > .icon-scan{
+	display: block;
+	width: 22.5px;
+	height: 22.5px;
+}
+.scan-placeholder{
+	width: 60px;
+}
+.nav-item > .name{
+	font-size: 10px;
+	margin-top: 4px;
+}
+.nav-item > .icon{
+	display: block;
+	width: 22px;
+	height: 22px;
+}
+</style>

+ 50 - 0
components/ax-body/ax-body.vue

@@ -0,0 +1,50 @@
+<template>
+	<view class="ax ax-body" :style="[StyleSheet]">
+		<ax-custom-title v-if="$slots.title" @display="$emit('display',$event)"><slot name="title"></slot></ax-custom-title>
+		<ax-custom-title v-else @display="$emit('display',$event)"></ax-custom-title>
+		<view class="__root"><slot></slot></view>
+		<ax-ios-indicator v-if="hideIndicatorArea==false"></ax-ios-indicator>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"ax-body",
+		props:{
+			// 两侧留白范围
+			blank:{type:[Number,String],default:10},
+			// 隐藏指示器范围占位
+			hideIndicatorArea:{type:Boolean,default:false}
+		},
+		mounted() {
+			uni.createSelectorQuery().in(this).select(".__root").boundingClientRect((data) => {
+				if(data) this.$emit('init',data);
+			}).exec();
+		},
+		computed:{
+			StyleSheet(){
+				return {
+					'--blank': `${Number(this.blank) || 0}px`
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+.ax-body{
+	display: flex;
+	flex-direction: column;
+	height: 100%;
+}
+.ax-body .__root{
+	flex: 1;
+	overflow: auto;
+	padding-left: var(--blank) !important;
+	padding-right: var(--blank) !important;
+}
+ax-custom-title{
+	position: relative;
+	z-index: 99999999;
+}
+</style>

+ 116 - 0
components/ax-custom-title/ax-custom-title.vue

@@ -0,0 +1,116 @@
+<template>
+	<view v-if="visible" class="ax ax-custom-title" :style="{padding}">
+		<view class="__body" :style="{height}">
+			<slot>
+				<view @click="back()">
+					<text v-if="this.pages.length>1"  class="icon-back"></text>
+					<text class="title">{{title || titleText}}</text>
+				</view>
+			</slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	import PagesJSON from "@/pages.json";
+	export default {
+		name:"ax-custom-title",
+		props:{
+			// 显示首页按钮
+			title:{type:String,default:''},
+			// PC模式下无插槽内容也任然显示组件
+			unlock:{type:Boolean,default:false},
+		},
+		data() {
+			return {
+				titleText: '',
+				visible: false,
+				padding: '0px',
+				height: 'auto'
+			};
+		},
+		async created() {
+			const sys = await this.systemInfo();
+			this.visible = sys.windowHeight === sys.screenHeight;
+			if(this.visible==false) return;
+			var rect = {top:0,left:0,right:0,bottom:0,width:0,height:0}
+			if(sys.uniPlatform.indexOf('mp-')===0) rect = uni.getMenuButtonBoundingClientRect();
+			var interval = sys.windowWidth - (rect.right || sys.windowWidth-10);
+			const data = {
+				top: rect.top,
+				left: interval,
+				right: (rect.width || interval*-1) + interval * 2,
+				bottom: interval,
+				componentHeight: rect.top+rect.height+interval,
+				statusBarHeight: sys.statusBarHeight
+			}
+			var top  = `${data.top}px`;
+			var left = `${data.left}px`;
+			var right = `${data.right}px`;
+			var bottom = `${data.bottom}px`;
+			if(['windows','mac'].includes(sys.platform)){
+				top = 0;
+				bottom = 0;
+				right = left;
+				rect.height = 45;
+				if(this.unlock == false && !this.$slots.default) this.visible = false;
+			}
+			this.padding = [top,right,bottom,left].join(' ');
+			this.height = `${rect.height || 50}px`;
+			const currentPage = Array.from(getCurrentPages()).pop();
+			const pageConfig = PagesJSON.pages.find(i=>i.path==currentPage.route);
+			this.titleText = pageConfig.style.navigationBarTitleText;
+			this.$emit('display',data);
+		},
+		computed:{
+			pages(){
+				return getCurrentPages();
+			}
+		},
+		methods:{
+			systemInfo(){
+				return new Promise((resolve,reject)=>{
+					uni.getSystemInfo({
+						success: res=>resolve(res),
+						fail: err=>reject(err)
+					});
+				});
+			},
+			back(){
+				uni.navigateBack({delta: 1});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url(../ax/ax.css);
+.ax-title-bar{
+	width: 100vw;
+	color: #000;
+	position: relative;
+	z-index: 999999;
+}
+.__body{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+.__body::after{
+	content: '';
+}
+.icon-back{
+	margin-right: 5px;
+}
+.icon-back::before{
+	content: "";
+	display: inline-block;
+	width: 10px;
+	height: 10px;
+	border-width: 0 0 2px 2px;
+	border-style: solid;
+	border-color: #000;
+	transform-origin: center center;
+	transform: rotate(45deg) translateY(-3px) translateX(1px);
+}
+</style>

+ 35 - 0
components/ax-ios-indicator/ax-ios-indicator.vue

@@ -0,0 +1,35 @@
+<template>
+	<view class="ax ax-ios-indicator" :style="[style]"></view>
+</template>
+
+<script>
+	export default {
+		name:"ax-ios-indicator",
+		props:{
+			// 偏差调整
+			offset:{type:[Number,String],default:10},
+			// 最小值
+			min:{type:[Number,String],default:0},
+		},
+		computed:{
+			height(){
+				const e = uni.getSystemInfoSync();
+				var h = e.screenHeight - e.safeArea.bottom - (Number(this.offset) || 0);
+				return Math.max( Number(this.min) || 0,h);
+			},
+			style(){
+				return {
+					height: `${this.height}px`
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url(../ax/ax.css);
+
+.ax-ios-indicator{
+	height: 34px;
+}
+</style>

+ 219 - 0
components/ax-popup/ax-popup.vue

@@ -0,0 +1,219 @@
+<template>
+	<view v-if="visible" :class="CssSheet" :style="[StyleSheet]" class="ax ax-popup">
+		<view @animationend="animationend()" class="__body"><slot></slot></view>
+		<view v-if="maskEnable || maskClose" @click="mask()" class="__mask"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"ax-popup",
+		emits: [
+			// 打开弹窗
+			'open',
+			// 已打开弹窗
+			'opened',
+			// 关闭窗口
+			'close',
+			// 已关闭窗口
+			'closed',
+			// 幕布被点击
+			'mask'
+		],
+		props:{
+			// 内容方位 [默认居中 | top 上方 | left 左边 | right 右边 | bottom 下方]
+			position:{type:String,default:''},
+			// 启用幕布
+			maskEnable:{type:Boolean,default:false},
+			// 幕布类型 [默认透明 | black 黑色 | white 白色]
+			maskType:{type:String,default:''},
+			// 幕布模糊
+			maskBlur:{type:[Number,String],default:0},
+			// 幕布关闭
+			maskClose:{type:Boolean,default:false},
+		},
+		data() {
+			return {
+				// 组件可视性
+				visible: false,
+				// 关闭动画
+				closing: false
+			};
+		},
+		computed:{
+			CssSheet(){
+				return [
+					this.position,
+					this.maskType,
+					this.closing?'close':'',
+				]
+			},
+			StyleSheet(){
+				return {
+					'--mask-blur': `blur(${this.maskBlur}px)`,
+				}
+			}
+		},
+		methods:{
+			animationend(e){
+				if(this.visible==true && this.closing==false){
+					this.$emit('opened');
+				}else{
+					this.visible = false;
+					this.closing = false;
+					this.$emit('closed');
+				}
+			},
+			mask(){
+				if(this.maskClose) this.close();
+				this.$emit('mask');
+			},
+			close(){
+				this.closing = true;
+				this.$emit('close');
+			},
+			open(){
+				this.visible = true;
+				this.closing = false;
+				this.$emit('open');
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.ax-popup{
+	--duration: 150ms;
+	--mask-background: transparent;
+	
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	transform-style: preserve-3d;
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	z-index: 99999;
+}
+.ax-popup .__mask{
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	backdrop-filter: var(--mask-blur);
+	background-color: var(--mask-background);
+	z-index: 0;
+	animation: showMask var(--duration) ease-out 1;
+}
+@keyframes showMask{
+	0%{opacity: 0;}
+	100%{opacity: 1;}
+}
+.ax-popup .__body{
+	position: relative;
+	z-index: 1;
+	animation: showBody var(--duration) ease-out 1;
+}
+@keyframes showBody{
+	0%{transform: translateY(75%);opacity: 0;}
+	100%{transform: translateY(0%);opacity: 1;}
+}
+.ax-popup.black .__mask{
+	--mask-background: rgba(0, 0, 0, 0.35);
+}
+.ax-popup.white .__mask{
+	--mask-background: rgba(255, 255, 255, 0.85);
+}
+.ax-popup.close .__mask{
+	animation-name: closeMask;
+	animation-fill-mode: forwards;
+}
+@keyframes closeMask{
+	0%{opacity: 1;}
+	100%{opacity: 0;}
+}
+.ax-popup.close .__body{
+	animation-name: closeBody;
+	animation-fill-mode: forwards;
+}
+@keyframes closeBody{
+	0%{transform: translateY(0%);opacity: 1;}
+	100%{transform: translateY(-75%);opacity: 0;}
+}
+
+.ax-popup.top{
+	justify-content: flex-start;
+}
+.ax-popup.top .__body{
+	animation-name: showTopBody;
+}
+.ax-popup.top.close .__body{
+	animation-name: closeTopBody;
+}
+@keyframes showTopBody{
+	0%{transform: translateY(-100%);opacity: 0;}
+	100%{transform: translateY(0%);opacity: 1;}
+}
+@keyframes closeTopBody{
+	0%{transform: translateY(0%);opacity: 1;}
+	100%{transform: translateY(-100%);opacity: 0;}
+}
+
+.ax-popup.bottom{
+	justify-content: flex-end;
+}
+.ax-popup.bottom .__body{
+	animation-name: showBottomBody;
+}
+.ax-popup.bottom.close .__body{
+	animation-name: closeBottomBody;
+}
+@keyframes showBottomBody{
+	0%{transform: translateY(100%);opacity: 0;}
+	100%{transform: translateY(0%);opacity: 1;}
+}
+@keyframes closeBottomBody{
+	0%{transform: translateY(0%);opacity: 1;}
+	100%{transform: translateY(100%);opacity: 0;}
+}
+
+.ax-popup.left{
+	align-items: flex-start;
+}
+.ax-popup.left .__body{
+	animation-name: showLeftBody;
+}
+.ax-popup.left.close .__body{
+	animation-name: closeLeftBody;
+}
+@keyframes showLeftBody{
+	0%{transform: translateX(-100%);opacity: 0;}
+	100%{transform: translateX(0%);opacity: 1;}
+}
+@keyframes closeLeftBody{
+	0%{transform: translateX(0%);opacity: 1;}
+	100%{transform: translateX(-100%);opacity: 0;}
+}
+
+.ax-popup.right{
+	align-items: flex-end;
+}
+.ax-popup.right .__body{
+	animation-name: showRightBody;
+}
+.ax-popup.right.close .__body{
+	animation-name: closeRightBody;
+}
+@keyframes showRightBody{
+	0%{transform: translateX(100%);opacity: 0;}
+	100%{transform: translateX(0%);opacity: 1;}
+}
+@keyframes closeRightBody{
+	0%{transform: translateX(0%);opacity: 1;}
+	100%{transform: translateX(100%);opacity: 0;}
+}
+</style>

+ 20 - 0
components/ax/ax.css

@@ -0,0 +1,20 @@
+@import url("iconblock.css");
+@import url("iconline.css");
+
+.ax{
+	--ax-color-red: #eb4646;
+	--ax-color-red-light: #ffcdd2;
+	--ax-color-blue: #2196f3;
+	--ax-color-blue-light: #bbdefb;
+	--ax-color-green: #3fb555;
+	--ax-color-green-light: #c8e6c9;
+	--ax-color-orange: #ef9d00;
+	--ax-color-orange-light: #ffe0b2;
+	
+	--ax-size: 36px;
+	--ax-size-huge: 56px;
+	--ax-size-big: 46px;
+	--ax-size-small: 26px;
+	
+	--ax-shadow: 0 0 10px rgba(0,0,0,0.1);
+}

Fișier diff suprimat deoarece este prea mare
+ 3 - 0
components/ax/iconblock.css


Fișier diff suprimat deoarece este prea mare
+ 3 - 0
components/ax/iconline.css


+ 20 - 0
index.html

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

+ 28 - 0
main.js

@@ -0,0 +1,28 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+  ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif
+
+import {$App,$Api,$Config,$Qrcode} from 'static/js/index.js';
+Vue.prototype.$app = $App;
+Vue.prototype.$api = $Api;
+Vue.prototype.$config = $Config;
+Vue.prototype.$qrcode = $Qrcode;

+ 85 - 0
manifest.json

@@ -0,0 +1,85 @@
+{
+    "name" : "chargingPile",
+    "appid" : "__UNI__DA620DA",
+    "description" : "共享充电桩小程序",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx9894a01b9e92c368",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : true,
+            "postcss" : true,
+            "minified" : true
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userFuzzyLocation" : {
+                "desc" : "提供周边线下服务商"
+            },
+            "scope.userLocation" : {
+                "desc" : "提供周边线下服务商" // 高速公路行驶持续后台定位
+            }
+        },
+        "requiredPrivateInfos" : [ "getLocation" ],
+        "lazyCodeLoading" : "requiredComponents"
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 3 - 0
package-lock.json

@@ -0,0 +1,3 @@
+{
+  "lockfileVersion": 1
+}

+ 127 - 0
pages.json

@@ -0,0 +1,127 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path" : "pages/index/index",
+			"style" : 
+			{
+				"navigationBarTitleText" : "首页"
+			}
+		},
+		{
+			"path" : "pages/map/map",
+			"style" : 
+			{
+				"navigationBarTitleText" : "地图模式"
+			}
+		},
+		{
+			"path" : "pages/my/my",
+			"style" : 
+			{
+				"navigationBarTitleText" : "个人中心"
+			}
+		},
+		{
+			"path" : "pages/site/site",
+			"style" : 
+			{
+				"navigationBarTitleText" : "站点详情"
+			}
+		},
+		{
+			"path" : "pages/site-more/site-more",
+			"style" : 
+			{
+				"navigationBarTitleText" : "电站价格"
+			}
+		},
+		{
+			"path" : "pages/charging/charging",
+			"style" : 
+			{
+				"navigationBarTitleText" : "正在充电"
+			}
+		},
+		{
+			"path" : "pages/order-detail/order-detail",
+			"style" : 
+			{
+				"navigationBarTitleText" : "订单详情"
+			}
+		},
+		{
+			"path" : "pages/terminal/terminal",
+			"style" : 
+			{
+				"navigationBarTitleText" : "充电终端"
+			}
+		},
+		{
+			"path" : "pages/coupon-buy/coupon-buy",
+			"style" : 
+			{
+				"navigationBarTitleText" : "购券中心"
+			}
+		},
+		{
+			"path" : "pages/login/login",
+			"style" : 
+			{
+				"navigationBarTitleText" : "用户登录"
+			}
+		},
+		{
+			"path" : "pages/recharge-log/recharge-log",
+			"style" : 
+			{
+				"navigationBarTitleText" : "购券记录"
+			}
+		},
+		{
+			"path" : "pages/feedback/feedback",
+			"style" : 
+			{
+				"navigationBarTitleText" : ""
+			}
+		},
+		{
+			"path" : "pages/order/order",
+			"style" : 
+			{
+				"navigationBarTitleText" : "充电订单"
+			}
+		},
+		{
+			"path" : "pages/search/search",
+			"style" : 
+			{
+				"navigationBarTitleText" : "站点搜索"
+			}
+		},
+		{
+			"path" : "pages/web/web",
+			"style" : 
+			{
+				"navigationBarTitleText" : "",
+				"navigationStyle": "default",
+				"navigationBarBackgroundColor": "#fff",
+				"backgroundColor": "#fff"
+			}
+		},
+		{
+			"path" : "pages/feedback-reply/feedback-reply",
+			"style" : 
+			{
+				"navigationBarTitleText" : "反馈答复"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "中数电动",
+		"navigationBarBackgroundColor": "#C7FFFD",
+		"backgroundColor": "#C7FFFD",
+		"navigationStyle": "custom"
+	},
+	"uniIdRouter": {}
+}

+ 291 - 0
pages/charging/charging.css

@@ -0,0 +1,291 @@
+>>> ax-custom-title {
+	z-index: 9999 !important;
+}
+.page-background{
+	display: block;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.body{
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+/* 退出中 */
+.exiting{
+	content: '正在结束';
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	color: #fff;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	font-size: 14px;
+	overflow: hidden;
+	z-index: 999999;
+}
+.exiting.lock{
+	color: #3EB6F8;
+}
+.exiting .icon{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 14vw;
+	margin-bottom: 10px;
+	color: inherit;
+}
+@keyframes show-long-press{
+	0%{opacity: 0;}
+	100%{opacity: 1;}
+}
+.exiting > .mask{
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	background-color: rgba(0, 0, 0, 0.45);
+	backdrop-filter: blur(10px);
+	transform-origin: top;
+	animation: show-long-press 300ms ease;
+}
+.exiting > .contet{
+	position: relative;
+	z-index: 1;
+}
+.exiting .exiting-title{
+	font-weight: bold;
+	font-size: 18px;
+	transform: translateY(-100%);
+}
+.exiting .close{
+	transform: translateY(150%);
+	border: 1px solid #fff;
+	border-radius: 100px;
+	padding: 5px 15px;
+}
+
+/* 计时器 */
+.timer{
+	text-align: center;
+}
+.timer .value{
+	color: #3EB6F8;
+	font-size: 30px;
+	font-weight: bold;
+}
+.timer .name{
+	font-weight: bold;
+	margin-top: 5px;
+}
+
+/* 主图 */
+.host-graph{
+	margin-top: 20px;
+}
+.host-graph .image{
+	width: 60vw;
+}
+
+/* 主参数 */
+.parameter{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 10px;
+	margin: 0 20px;
+	margin-top: 10px;
+}
+.parameter .param{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.parameter .param .value{
+	font-size: 20px;
+	font-weight: bold;
+}
+.parameter .param .name{
+	font-size: 14px;
+	color: #aaa;
+	margin-top: 7px;
+}
+
+/* 统计栏 */
+.statbar{
+	display: flex;
+	align-items: center;
+	justify-content: space-around;
+	height: 80px;
+	padding: 0 10px;
+	border-radius: 8px;
+	margin: 15px 20px;
+	background-color: #F2F8FF;
+	box-shadow: 0 3px 6px rgba(122, 168, 222, 0.3);
+	/* overflow: hidden; */
+	position: relative;
+}
+.statbar::before{
+	content: '';
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	box-shadow: 0 8px 8px #fff inset;
+}
+.statbar .sta{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.statbar .sta .value{
+	color: #3EB6F8;
+	font-size: 24px;
+	font-weight: bold;
+}
+.statbar .sta .name{
+	font-size: 14px;
+	font-weight: bold;
+}
+.statbar .split{
+	display: block;
+	height: 58px;
+	border-left: 1px solid #E5F1FF;
+}
+
+/* 主信息 */
+.info{
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	background-color: #fff;
+	border-radius: 16px 16px 0 0;
+	padding: 10px;
+	box-sizing: border-box;
+}
+.info .cell{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	height: 32px;
+	padding: 0 10px;
+}
+.info .cell .contet{
+	color: #aaa;
+}
+.info .tips{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 12px;
+	color: #aaa;
+}
+.info .end{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 14px;
+	border-radius: 8px;
+	height: 50px;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}
+.info .end::after{
+	display: none;
+}
+.info .end[disabled]{
+	background: #ddd;
+	color: #aaa;
+}
+
+
+.countdown-ring{
+	--countdown-ring-size: 150px;
+	--countdown-ring-color: var(--color-red);
+	--countdown-ring-duration: 2s;
+	
+	display: flex;
+	width: var(--countdown-ring-size);
+	height: var(--countdown-ring-size);
+	border-radius: 100%;
+	position: relative;
+}
+.countdown-ring > ._button{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	flex-wrap: wrap;
+	width: calc(var(--countdown-ring-size) - 35px);
+	height: calc(var(--countdown-ring-size) - 35px);
+	color: #fff;
+	font-size: 18px;
+	font-weight: bold;
+	background-color: var(--countdown-ring-color);
+	border-radius: 100%;
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%,-50%);
+}
+.countdown-ring > ._half{
+	flex: 1;
+	height: var(--countdown-ring-size);
+	overflow: hidden;
+	position: relative;
+	z-index: 1;
+}
+.countdown-ring > ._half::after{
+	content: '';
+	display: block;
+	width: var(--countdown-ring-size);
+	height: var(--countdown-ring-size);
+	border: 8px solid transparent;
+	border-radius: 100%;
+	box-sizing: border-box;
+	position: absolute;
+	top: 0;
+	transform: rotate(-135deg);
+}
+.countdown-ring > ._half.left::after{
+	left: 0;
+	border-bottom-color: var(--countdown-ring-color);
+	border-left-color: var(--countdown-ring-color);
+}
+.countdown-ring > ._half.right::after{
+	right: 0;
+	border-top-color: var(--countdown-ring-color);
+	border-right-color: var(--countdown-ring-color);
+}
+.countdown-ring.active > ._half.left::after{
+	animation: show calc(var(--countdown-ring-duration) / 2) linear 1;
+	animation-delay: calc(var(--countdown-ring-duration) / 2);
+	animation-fill-mode: forwards;
+}
+.countdown-ring.active > ._half.right::after{
+	transform: rotate(45deg);
+	animation: show calc(var(--countdown-ring-duration) / 2) linear 1;
+}
+
+@keyframes show{
+	0%{
+		transform: rotate(-135deg);
+	}
+	100%{
+		transform: rotate(45deg);
+	}
+}

+ 236 - 0
pages/charging/charging.vue

@@ -0,0 +1,236 @@
+<template>
+	<ax-body blank="0" hideIndicatorArea>
+		<image src="@/static/img/page-bg01.png" class="page-background"></image>
+		<view class="body">
+			<view v-if="exiting.visible" class="exiting">
+				<view class="app-flex c-center column contet">
+					<view class="exiting-title">长按停止按钮结束充电</view>
+					<view class="countdown-ring" :class="{active:exiting.lock}" @touchstart="exiting.lock=true" @touchend="exiting.lock=false">
+						<view class="_half left" @animationend="submitExit()"></view>
+						<view class="_half right"></view>
+						<view class="_button"><view>停止</view><view>充电</view></view>
+					</view>
+					<view class="close" @click="exiting.visible=false">取消</view>
+				</view>
+				<view @click="exiting.visible=false" class="mask"></view>
+			</view>
+			<!-- 计时器 -->
+			<view v-if="orderInfo.status == 1" class="timer">
+				<view class="value">{{timer.text}}</view>
+				<view class="name">充电时间</view>
+			</view>
+			<view v-if="orderInfo.status == 0" class="timer">
+				<view class="value" style="font-size: 22px;">充电正在启动中......</view>	
+				<view v-if="isShowBtn" class="name" style="color: red;font-size: 14px;">长时间无法启动可点击“长按结束充电”按钮结束订单。</view>
+			</view>
+			<!-- 主图 -->
+			<view class="app-flex c-center host-graph">
+				<image src="@/static/img/charging-01.png" mode="widthFix" class="image"></image>
+			</view>
+			<!-- 主参数 -->
+			<view class="parameter">
+				<view class="param"><view class="value">{{deviceInfo.current}}</view><view class="name">电流A</view></view>
+				<view class="param"><view class="value">{{getVolt()}}</view><view class="name">电压V</view></view>
+				<view class="param"><view class="value">{{deviceInfo.power}}</view><view class="name">功率KW</view></view>
+			</view>
+			<!-- 统计兰 -->
+			<view class="statbar">
+				<view class="sta"><view class="value">{{statInfo.electricity}}</view><view class="name">电量/度</view></view>
+				<view class="split"></view>
+				<view class="sta"><view class="value">{{statInfo.cost}}</view><view class="name">费用/元</view></view>
+			</view>
+			<!-- 信息 -->
+			<view id="info" class="info">
+				<view>
+					<view class="cell"><view class="lable">订单编号</view><view class="contet">{{orderInfo.id}}</view></view>
+					<view class="cell"><view class="lable">终端编号</view><view class="contet">{{deviceInfo.deviceNo}}</view></view>
+					<view class="cell"><view class="lable">充电电站</view><view class="contet">{{deviceInfo.thirdPartyStationName}}</view></view>
+					<view class="cell"><view class="lable">充电终端</view><view class="contet">{{deviceInfo.deviceName}}</view></view>
+				</view>
+				<view class="tips">账单信息可能会有所延迟,具体以实际结算为准</view>
+				<view>
+					<button @click="exiting.visible=true" :disabled="!isShowBtn" class="end">结束充电</button>
+					<ax-ios-indicator min="10"></ax-ios-indicator>
+				</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+export default {
+	onLoad(opts) {
+		console.log("启动充值页面的参数:", opts)
+		this.orderInfo.id = opts.orderId;
+		this.deviceInfo.id = opts.deviceId;
+	},
+	onShow() {
+		this.getDeviceInfo();
+		this.getOrderInfo();
+	},
+	data() {
+		return {
+			exiting:{
+				visible: false,
+				lock: false
+			},
+			timer:{
+				id: 0,
+				start: '2024/08/07 09:00:00',
+				text: '00:00:00',
+				isSatrt : false,
+			},
+			orderTimer:{
+				id: 0,
+				isSatrt : false,
+				timeInterval : 10,//每隔多少秒查询一次订单(单位秒:s)
+			},
+			statInfo:{
+				electricity : 0,
+				cost : 0
+			},//统计信息,电量,费用
+			nowPriceTime : {},//当前价格时间段信息
+			deviceInfo : {},//充电桩的信息
+			orderInfo : {id:1},//订单信息
+			isShowBtn : true,//是否显示长按结束按钮 
+		}
+	},
+	destroyed(){
+		console.log("关闭页面了。。。。。。")
+		//关闭页面了,要清除定时器
+		clearInterval(this.timer.id);
+		clearInterval(this.orderTimer.id);
+	},
+	methods: {
+		//获取设备的详情信息
+		getDeviceInfo(deviceId){
+			this.$api.base("post","/chargeApi/getDevicesDetial",{"deviceId":this.deviceInfo.id},{}).then(res=>{
+				this.deviceInfo = res.device;
+				this.nowPriceTime = res.nowPriceTime;
+				
+			})
+		},
+		//是否显示长按结束按钮
+		isShowEendBtn(orderTime){
+			var t1 = new Date(orderTime).getTime();
+			var t2 = new Date().getTime();
+			var t = (t2 - t1)/1000;//单位秒
+			if(t >= 60||this.orderInfo.status == 1){
+				//启动时间大于一分钟,可以显示长按结束按钮
+				this.isShowBtn = true;
+			}
+		},
+		//查询订单详情并进行订单状态的检测
+		getOrderInfo(){
+			this.$api.base("post","/chargeApi/queryIsSuccessStop",{"id":this.orderInfo.id},{loading:false}).then(res=>{
+				this.orderInfo = res.obj.orderInfo;
+				this.timer.start = res.obj.orderInfo.startTime.replaceAll("-","/");
+				this.isShowEendBtn(res.obj.orderInfo.startTime.replaceAll("-","/"));
+				//充电的度数
+				if(this.orderInfo.totalCharge!=null){
+					this.statInfo.electricity = this.orderInfo.totalCharge;
+				}
+				
+				//费用
+				let cost =  (this.statInfo.electricity * this.nowPriceTime.price).toFixed(2);
+				if(!isNaN(cost) && this.orderInfo.thirdPartyElecfee == 0){
+					//如果后台,第三方返回的电费是0按照自己的方式进行计算
+					this.statInfo.cost = cost
+				}
+				if(!isNaN(this.orderInfo.realCost) && this.orderInfo.thirdPartyElecfee > 0){
+					//如果后台有返回第三方的电费,取后台计算的值
+					this.statInfo.cost = this.orderInfo.realCost.toFixed(4);
+				}
+				
+				if( this.orderInfo.status == 3 || this.orderInfo.status == 5){
+					uni.hideLoading();
+					clearInterval(this.timer.id);
+					clearInterval(this.orderTimer.id);
+					this.$app.url.goto('/pages/order-detail/order-detail?orderId='+this.orderInfo.id,false);
+					return ;
+				}
+				if(this.orderInfo.status == 1 && !this.timer.isSatrt){
+					//状态为充电中
+					this.startup();
+				}
+				if(!this.orderTimer.isSatrt){
+					this.orderTimer.isSatrt = true;
+					//开启定时器每隔5s查询订单
+					this.startCheckOrderTimer();
+				}
+				
+			})
+		},
+		getVolt(){
+			if(!this.deviceInfo.power){
+				return 0;
+			}
+			var v = this.deviceInfo.power/this.deviceInfo.current * 1000;
+			return v;
+		},
+		//启动检测订单的定时器,每隔5S
+		startCheckOrderTimer(){
+			clearInterval(this.orderTimer.id);
+			this.orderTimer.id =  setInterval(()=>{
+				this.getOrderInfo(this.orderInfo.id)
+			},this.orderTimer.timeInterval * 1000);
+		},
+		// 启动定时器
+		startup(){
+			const start = new Date(this.timer.start);
+			const obj = {hour:0,minute:0,second:0};
+			const handle = ()=>{
+				this.timer.isSatrt = true;
+				const diff = Date.now() - start.getTime();
+				obj.hour = Math.floor(diff / 1000 / 60 / 60);
+				obj.minute= Math.floor(diff / 1000 / 60 % 60);
+				obj.second = Math.floor(diff / 1000 % 60);
+				this.timer.text = `${String(obj.hour).padStart(2,'0')}:${String(obj.minute).padStart(2,'0')}:${String(obj.second).padStart(2,'0')}`;
+				//console.log(diff,Math.floor(diff / 1000 ))
+				/* //计算在该功率下,
+				var mill = diff / 1000;//充电时间秒
+				if(!this.deviceInfo.power){
+					return;
+				}
+				//充电的度数
+				this.statInfo.electricity = (this.deviceInfo.power/3600 * mill).toFixed(2);
+				//费用
+				this.statInfo.cost = (this.statInfo.electricity * this.nowPriceTime.price).toFixed(2); */
+			}
+			clearInterval(this.timer.id);
+			this.timer.id = setInterval(handle,1000);
+			handle();
+		},
+		// 退出充电
+		exit(){
+			/* this.$app.popup.toast("测试环境,请等待自动结束")
+						return; */
+			var _this = this;
+			this.$api.base("post","/chargeApi/stopCharge",{"id":this.orderInfo.id},{}).then(res=>{
+				this.exiting.lock = false;
+				clearInterval(this.orderTimer.id);
+				this.orderTimer.isSatrt = false;
+				this.orderTimer.timeInterval = 2;
+				this.$app.popup.loading(true,{title:"结算中,请稍候",timeout:120*1000})
+				setTimeout(()=>{
+					this.getOrderInfo(this.orderInfo.id)
+				},2000)
+				
+				/* clearInterval(this.timer.id);
+				clearInterval(this.orderTimer.id);
+				this.$app.url.goto('/pages/order-detail/order-detail?orderId='+this.orderInfo.id,false); */
+			})
+		},
+		// 长按动画结束
+		submitExit(){
+			this.exiting.lock = false;
+			this.exiting.visible = false;
+			this.exit();
+		}
+	}
+}
+</script>
+
+<style scoped>
+@import url("charging.css");
+</style>

+ 359 - 0
pages/coupon-buy/coupon-buy.css

@@ -0,0 +1,359 @@
+@font-face {
+  font-family: "ysbth";
+  src: url('ysbth.ttf') format('truetype');
+}
+
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F6FAFF;
+}
+.body{
+	position: relative;
+	z-index: 1;
+}
+
+/* 页面背景 */
+.page-background{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 0;
+}
+.page-background image{
+	display: block;
+	width: 100%;
+	transform: scaleY(-100%);
+}
+
+/* 统计卡 */
+.sta-card{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	height: 78px;
+	border-radius: 8px;
+	background-color: #F2F8FF;
+	box-shadow: 0 3px 6px rgba(122, 168, 222, 0.3);
+	position: relative;
+	overflow: hidden;
+}
+.sta-card::before{
+	content: '';
+	display: block;
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	box-shadow: 0 8px 8px #fff inset;
+	background-color: transparent !important;
+}
+.sta-card + .sta-card{
+	margin-left: 10px;
+}
+.sta-card .value{
+	font-size: 24px;
+	font-weight: bold;
+	position: relative;
+	z-index: 3;
+}
+.sta-card .name{
+	font-size: 12px;
+	color: #aaa;
+	position: relative;
+	z-index: 3;
+}
+.sta-card .bg{
+	position: absolute;
+	top: 0;
+	right: 0;
+	height: 100%;
+	z-index: 2;
+}
+
+/* 卡片 */
+.card{
+	border-radius: 16px;
+	padding: 15px 0;
+	margin-top: 10px;
+}
+.card .title{
+	display: flex;
+	align-items: flex-end;
+	justify-content: space-between;
+	margin-bottom: 20px;
+	font-weight: bold;
+}
+.card .title .more{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-weight: normal;
+	font-size: 14px;
+	color: #aaa;
+}
+.card .title .more .icon{
+	margin-left: 5px;
+}
+
+/* 温馨提示 */
+.tips .li{
+	font-size: 14px;
+	color: #666;
+}
+.tips .li + .li{
+	margin-top: 7px;
+}
+
+/* 优惠券 */
+.coupons{
+	display: grid;
+	grid-template-columns: 1fr 1fr 1fr;
+	gap: 10px;
+}
+.coupons .item{
+	--item-bg: #3eb6f8;
+	--item-bg-active: #0093e4;
+	--coupon-bg: #fff;
+	--coupon-bg-active: #3ab8ff;
+	--font-color: #3eb6f8;
+	--font-color-active: #fff;
+	
+	padding: 5px;
+	height: 150px;
+	border-radius: 10px;
+	background-color: var(--item-bg);
+	color: var(--font-color);
+}
+.coupons .item .coupon{
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+	border-radius: 10px;
+	filter: drop-shadow(0 1px 6px rgba(102, 102, 102, 0.3));
+}
+.coupons .item .coupon .top{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	background-color: var(--coupon-bg);
+}
+.coupons .item .coupon .top .value{
+	font-size: 36px;
+	font-weight: bold;
+}
+.coupons .item .coupon .top .unit{
+	font-size: 14px;
+}
+.coupons .item .coupon .bottom{
+	text-align: center;
+	font-size: 14px;
+	background-color: var(--coupon-bg);
+	padding: 10px;
+}
+.coupons .item .coupon .middle{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 10px;
+	position: relative;
+	overflow: hidden;
+}
+.coupons .item .coupon .middle::before{
+	content: '';
+	display: block;
+	width: 50%;
+	height: 10px;
+	background: radial-gradient(circle 10px at left, transparent 5px, var(--coupon-bg) 50%);
+}
+.coupons .item .coupon .middle::after{
+	content: '';
+	display: block;
+	width: 50%;
+	height: 10px;
+	background: radial-gradient(circle 10px at right, transparent 5px, var(--coupon-bg) 50%);
+}
+.coupons .item .coupon .middle .line{
+	position: absolute;
+	top: 50%;
+	left: 10px;
+	right: 10px;
+	border-top: 1px dashed var(--font-color);
+}
+.coupons .item.active{
+	background-color: var(--item-bg-active);
+	color: var(--font-color-active);
+}
+.coupons .item.active .coupon .middle .line{
+	border-color: var(--font-color-active);
+}
+.coupons .item.active .coupon .top,
+.coupons .item.active .coupon .bottom{
+	background-color: var(--coupon-bg-active);
+}
+.coupons .item.active .coupon .middle::before{
+	background: radial-gradient(circle 10px at left, transparent 5px, var(--coupon-bg-active) 50%);
+}
+.coupons .item.active .coupon .middle::after{
+	background: radial-gradient(circle 10px at right, transparent 5px, var(--coupon-bg-active) 50%);
+}
+
+.pay-type{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+.pay-type .icon{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	font-size: 14px;
+	margin-right: 5px;
+	border-radius: 100pc;
+	background-color: #04BE02;
+	color: #fff;
+}
+
+.footer{
+	position: fixed;
+	left: 10px;
+	right: 10px;
+	bottom: 0;
+}
+.pay{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 50px;
+	font-size: 14px;
+	margin-top: 20px;
+	border-radius: 8px;
+	color: #2B303A;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}
+.pay::after{
+	content: unset;
+	display: none;
+}
+.pay[disabled]{
+	text-shadow: unset;
+	background: #ddd;
+}
+
+
+.coupon-item{
+	--item-color: #D6F3FF;
+	font-family: 'ysbth';
+	color: #2B303A;
+	background-color: var(--item-color);
+	border-radius: 8px;
+	text-align: center;
+	padding: 0 8px;
+	position: relative;
+	margin-bottom: 10px;
+}
+.coupon-item .ticket{
+	background-color: #F2F8FF;
+	border-radius: 8px;
+	margin-top: -10px;
+	box-shadow: 0 -1px 6px rgba(122, 168, 222, 0.1);
+}
+.coupon-item .ticket .value{
+	display: flex;
+	align-items: flex-end;
+	justify-content: center;
+	padding-top: 10px;
+	color: #2B303A;
+}
+.coupon-item .ticket .value .val{
+	display: inline-block;
+	font-size: 18px;
+	font-weight: bold;
+	transform: translateY(2px);
+	margin-right: 2px;
+}
+.coupon-item .ticket .value .unit{
+	font-size: 12px;
+}
+.coupon-item .ticket .line-wrap{
+	display: flex;
+	align-items: center;
+	position: relative;
+	height: 16px;
+}
+.coupon-item .ticket .line-wrap .line{
+	flex: 1;
+	height: 1px;
+	border-top: 1px dashed #aaa;
+}
+.coupon-item .ticket .line-wrap .circle{
+	width: 16px;
+	height: 16px;
+	border-radius: 100%;
+	background-color: var(--item-color);
+}
+.coupon-item .ticket .line-wrap view:first-child{
+	transform: translateX(-50%);
+}
+.coupon-item .ticket .line-wrap view:last-child{
+	transform: translateX(50%);
+}
+.coupon-item .ticket .margin{
+	height: 15px;
+}
+.coupon-item .trapezium{
+	width: 100%;
+	height: 10px;
+	position: relative;
+	overflow: hidden;
+	margin-top: -10px;
+}
+.coupon-item .trapezium::after{
+	content: '';
+	display: block;
+	width: 50%;
+	height: 10px;
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	transform: skewX(-15deg) translateX(0.3em);
+	border-radius: 10px 0 0 0;
+	background-color: var(--item-color);
+}
+.coupon-item .trapezium::before{
+	content: '';
+	display: block;
+	width: 50%;
+	height: 10px;
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	transform: skewX(15deg) translateX(-0.3em);
+	border-radius: 0 10px 0 0;
+	background-color: var(--item-color);
+}
+.coupon-item .text{
+	margin-top: -8px;
+	position: relative;
+	z-index: 3;
+}
+
+.coupon-item.active{
+	--item-color: #47AEFF !important;
+}
+.coupon-item.active .ticket .value{
+	color: #47AEFF;
+}
+.coupon-item.active .text{
+	color: #fff;
+}

+ 121 - 0
pages/coupon-buy/coupon-buy.vue

@@ -0,0 +1,121 @@
+<template>
+	<ax-body>
+		<view class="page-background"><image src="@/static/img/page-bg01.png" mode="widthFix"></image></view>
+		<view class="body">
+			<!-- 统计卡 -->
+			<view class="app-flex c-between">
+				<view class="sta-card">
+					<view class="value">{{userinfo.integralNum}}</view>
+					<view class="name">我的积分</view>
+					<image src="@/static/img/my-sta-bg01.png" mode="heightFix" class="bg"></image>
+				</view>
+				<view class="sta-card">
+					<view class="value">{{userinfo.params.balance}}</view>
+					<view class="name">可抵扣余量</view>
+					<image src="@/static/img/my-sta-bg03.png" mode="heightFix" class="bg"></image>
+				</view>
+			</view>
+			<!-- 购券 -->
+			<view class="card">
+				<view class="title"><view>请选择抵扣券</view></view>
+				<view class="coupons">
+					<view v-for="(item,index) in coupons.data" :key="index" :class="{active:coupons.index==index}" @click="choose(item,index)" class="coupon-item">
+						<view class="ticket">
+							<view class="value"><text class="val">{{item.levelMoney}}</text><view class="unit">元</view></view>
+							<view class="line-wrap"><view class="circle"></view><view class="line"></view><view class="circle"></view></view>
+							<view class="margin"></view>
+						</view>
+						<view class="trapezium"></view>
+						<view class="text">充电优惠券</view>
+					</view>
+				</view>
+			</view>
+			<!-- 提示 -->
+			<view class="card tips">
+				<view class="title">温馨提示</view>
+				<view class="li">1. 抵扣券仅用于充电结算中抵扣资费,未使用完的余量,可手动发起退还</view>
+				<view class="li">2. 抵扣券为专属专用不可转赠和出售</view>
+				<view class="li">3. 抵扣券金额未抵扣完结,可累计到下次继续抵扣</view>
+			</view>
+			<view class="footer">
+				<button @click="pay()" class="pay" :disabled="coupons.index<0">立即支付购买</button>
+				<ax-ios-indicator></ax-ios-indicator>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				userinfo:{},
+				coupons:{
+					index: -1,
+					data: []
+				}
+			}
+		},
+		onShow() {
+			this.getMyAccount()
+			this.getLevel()
+		},
+		methods: {
+			getLevel(){
+				this.$api.base("post","/orderApi/getReChargeLevel",{},{}).then(res=>{
+					this.coupons.data = res.levels;
+				})
+			},
+			choose(item,index){
+				this.coupons.index = this.coupons.index!=index ? index : -1;
+			},
+			pay(){
+				
+				if(!this.userinfo.phone){
+					this.$app.url.goto('/pages/login/login')
+					return;
+				}
+				
+				
+				this.$api.base("post","/orderApi/addOrder",{levelId:this.coupons.data[this.coupons.index].id},{}).then(addRes=>{
+					if(addRes.orderId){
+						this.$api.base("post","/orderApi/payOrder",{orderId:addRes.orderId},{}).then(res=>{
+							var payInfo = JSON.parse(res.wx.wx.pay_info)
+							uni.requestPayment({
+							    provider: 'wxpay',
+							    timeStamp: payInfo.timeStamp,
+							    nonceStr: payInfo.nonceStr,
+							    package: payInfo.package,
+							    signType:  payInfo.signType,
+							    paySign: payInfo.paySign,
+							    success: (res)=> {
+									console.log('success:',res);
+									//注册一个用户支付成功后点确定的事件
+									this.$app.popup.alert('支付成功','温馨提示',{showCancel:false}).then(()=>{
+										this.$app.url.back()
+									});
+							    },
+							    fail: (err)=> {
+									 console.log('fail:',err);
+									 //注册一个用户取消支付的事件
+							       
+							    }
+							});
+							
+						})
+					}
+				})
+				
+			},
+			getMyAccount(){
+				this.$api.base("post","/userApi/getUserAccount",{},{}).then(res=>{
+					this.userinfo = res.accountInfo
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped>
+@import url("coupon-buy.css");
+</style>

BIN
pages/coupon-buy/ysbth.ttf


+ 149 - 0
pages/feedback-reply/feedback-reply.css

@@ -0,0 +1,149 @@
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F6FAFF;
+}
+.page-background{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 0;
+}
+.page-background image{
+	display: block;
+	width: 100%;
+}
+.body{
+	display: block;
+	width: 100%;
+	height: 100%;
+	position: relative;
+	overflow: auto;
+	z-index: 1;
+}
+
+
+.root{
+	height: 100%;
+	padding: 10px;
+	overflow: auto;
+}
+.item{
+	padding-left: 30px;
+	padding-bottom: 25px;
+	font-size: 12px;
+	color: #999;
+	position: relative;
+}
+.item::after{
+	content: '';
+	width: 2px;
+	background-color: var(--color-main);
+	position: absolute;
+	top: 0;
+	left: 13px;
+	bottom: 0;
+	z-index: 1;
+}
+.list .item:last-child::after{
+	display: none;
+}
+.mask-box{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 20px;
+}
+.mask{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 18px;
+	width: 1em;
+	height: 1em;
+	box-sizing: border-box;
+	border: 3px solid var(--color-main);
+	background-color: #fff;
+	border-radius: 50%;
+	position: absolute;
+	top: 0;
+	left: 5px;
+	z-index: 2;
+}
+.card{
+	margin-top: 10px;
+	background-color: #fff;
+	padding: 10px;
+	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+	border-radius: 6px;
+}
+.reply{
+	position: relative;
+	background-color: #eee;
+	padding: 10px;
+	border-radius: 2px;
+	margin-top: 10px;
+}
+.reply::before{
+	content: '';
+	display: block;
+	width: 0;
+	height: 0;
+	border: 5px solid transparent;
+	border-bottom-color: #eee;
+	position: absolute;
+	left: 0;
+	top: 0;
+	transform: translate(100%,-100%);
+}
+.start-label{
+	margin-right: 10px;
+}
+.start-label.vi{
+	color: var(--color-main);
+}
+.loading-more{
+	text-align: center;
+	position: relative;
+}
+.loading-more::after{
+	content: '';
+	border-top: 1px solid #eee;
+	position: absolute;
+	top: 50%;
+	left: 20px;
+	right: 20px;
+	transform: translateY(-50%);
+}
+.loading-more > .text{
+	color: #aaa;
+	background-color: #fff;
+	padding: 5px 20px;
+	font-size: 13px;
+	position: relative;
+	z-index: 2;
+}
+.item-pic{
+	display: inline-block;
+	margin-left: 5px;
+	white-space: nowrap;
+	text-decoration: underline;
+	color: #444;
+}
+.nothing-wrap{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	height: 100%;
+	background-color: #fff;
+	border-radius: 10px;
+	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+	color: #ccc;
+	font-size: 14px;
+}
+.nothing-wrap .icon{
+	font-size: 17vw;
+	color: #ddd;
+}

+ 77 - 0
pages/feedback-reply/feedback-reply.vue

@@ -0,0 +1,77 @@
+<template>
+	<ax-body>
+		<view class="page-background"><image src="@/static/img/my-bg.svg" mode="widthFix"></image></view>
+		<view class="body app-hide-scrollbar root">
+			<view v-if="list.data.length" class="list">
+				<view v-for="(item,index) in list.data" :key="index" class="item">
+					<view class="mask"></view>
+					<view class="mask-box">
+						<view>{{item.createTime}}</view>
+						<view>{{typesLable(item.problemType)}}</view>
+					</view>
+					<view class="card">
+						<view>
+							<text>{{item.problemDescribe}}</text>
+							<text v-if="item.filesUrl" @click="previewImage(item.filesUrl.split(','))" class="item-pic">查看附件</text>
+						</view>
+						<view v-if="item.reply" class="reply">
+							<text class="start-label">答复:</text>
+							<text>{{item.reply}}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view v-else class="nothing-wrap">
+				<view class="ax ax-iconblock i-kongshuju icon"></view>
+				<view>暂无数据</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list:{
+					data: [],
+					total: 10
+				},
+				types:[{name:'投诉吐槽',value:1},{name:'功能异常',value:2},{name:'体验问题',value:3},{name:'功能建议',value:3},{name:'其他',value:9}]
+			}
+		},
+		onShow() {
+			this.loadListData();
+		},
+		methods: {
+			loadListData(){
+				
+				this.$api.base("post","/userApi/getMyFeekBack",{},{}).then(res=>{
+					this.list.data = res.list
+				})
+				
+			},
+			typesLable(val){
+				if(!this.types.length) return '';
+				var item = this.types.find(i=>i.value==val);
+				return item.name || '';
+			},
+			previewImage(url){
+				if(!url) return;
+				console.log(this.$config.url.request)
+				var newUrl = new Array()
+				url.forEach(i=>{
+					newUrl.push(this.$config.url.request+i)
+				})
+				console.log(newUrl)
+				
+				uni.previewImage({urls:newUrl, indicator:'none'});
+			},
+		}
+	}
+</script>
+
+<style>
+/* @import url("../../components/ax/ax.css"); */
+@import url("feedback-reply.css");
+</style>

+ 201 - 0
pages/feedback/feedback.css

@@ -0,0 +1,201 @@
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F6FAFF;
+}
+.page-background{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 0;
+}
+.page-background image{
+	display: block;
+	width: 100%;
+}
+.body{
+	display: block;
+	width: 100%;
+	height: 100%;
+	position: relative;
+	overflow: auto;
+	z-index: 1;
+}
+/* 标题 */
+.top{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+.title{
+	color: #333;
+	font-size: 18px;
+	font-weight: bold;
+}
+.subtitle{
+	color: #aaa;
+	font-size: 14px;
+	margin-top: 8px;
+}
+
+.card{
+	background-color: #fff;
+	border-radius: 10px;
+	padding: 10px;
+	margin-top: 10px;
+	box-shadow: 0 0 10px #eee;
+}
+.card .lable{
+	color: #333;
+	font-size: 16px;
+	margin-bottom: 10px;
+	margin-top: 5px;
+}
+.card .lable.required::after{
+	content: '*';
+	color: #f44033;
+	margin-left: 5px;
+}
+
+.card.form-type .content{
+	display: grid;
+	grid-template-columns: 1fr 1fr 1fr;
+	gap: 10px;
+}
+.card.form-type .content .tag{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	background-color: #f6f6f6;
+	border-radius: 5px;
+	font-size: 14px;
+	color: #2b303a;
+	height: 36px;
+	transition: all 300ms ease;
+}
+.card.form-type .content .tag.active{
+	background-color: #3eb6f8;
+	color: #fff;
+}
+
+.card.form-describe .content .textarea{
+	width: 100%;
+	height: 60px;
+	font-size: 14px;
+}
+.card.form-describe .footer{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	color: #aaa;
+	margin-top: 10px;
+	padding-top: 10px;
+	border-top: 1px solid #eee;
+}
+
+.card.form-picture .footer{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	color: #aaa;
+	margin-top: 10px;
+}
+.card.form-picture .picture{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	width: 70px;
+	height: 70px;
+	border-radius: 10px;
+	border: 1px solid #ddd;
+}
+.card.form-picture .picture .icon{
+	font-size: 28px;
+	color: #aaa;
+}
+.card.form-picture .picture .name{
+	font-size: 12px;
+	margin-top: 5px;
+	color: #aaa;
+}
+
+.card.form-picture .content{
+	display: flex;
+}
+.card.form-picture .picture.view{
+	position: relative;
+	overflow: hidden;
+	border: none;
+	box-shadow: 0 0 5px rgba(0, 0, 0, 0.6) inset;
+}
+.card.form-picture .picture.view .remove{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	border-radius: 5px;
+	position: absolute;
+	top: 0;
+	right: 0;
+	background-color: rgba(0, 0, 0, 0.3);
+	z-index: 2;
+}
+.card.form-picture .picture.view .remove .icon{
+	color: #fff;
+	font-size: 10px;
+}
+.card.form-picture .picture.view .image{
+	width: 100%;
+	height: 100%;
+}
+.card.form-picture .picture + .picture{
+	margin-left: 10px;
+}
+
+.card.form-contact{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 50px;
+}
+.card.form-contact .lable{
+	margin: 0;
+}
+.card.form-contact .content{
+	flex: 1;
+	margin-left: 20px;
+}
+.card.form-contact .content .input{
+	font-size: 14px;
+}
+
+.tips{
+	display: block;
+	text-align: center;
+	font-size: 14px;
+	margin: 20px 0;
+}
+.em{
+	color: #3eb6f8;
+}
+
+.submit{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 50px;
+	border-radius: 8px;
+	font-size: 14px;
+	color: #2b303a;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}
+.submit::after{
+	content: unset;
+	display: none;
+}

+ 139 - 0
pages/feedback/feedback.vue

@@ -0,0 +1,139 @@
+<template>
+	<ax-body title="">
+		<view class="page-background"><image src="@/static/img/my-bg.svg" mode="widthFix"></image></view>
+		<view class="body app-hide-scrollbar">
+			<view class="top">
+				<view class="app-flex-one">
+					<view class="title">意见反馈</view>
+					<view class="subtitle">感谢您的每一条建议或反馈~</view>
+				</view>
+				<view class="em" style="font-size: 14px;" @click="$app.url.goto('/pages/feedback-reply/feedback-reply')">查看反馈</view>
+			</view>
+			
+			<view class="card form-type">
+				<view class="lable required">请选择问题</view>
+				<view class="content">
+					<view v-for="(item,index) in types.data" :key="index" class="tag" :class="{active:types.index==index}" @click="onTag(item,index)">{{item.name}}</view>
+				</view>
+			</view>
+			
+			<view class="card form-describe">
+				<view class="lable required">问题描述</view>
+				<view class="content">
+					<textarea placeholder="请输入描述内容" maxlength="500" v-model="saveObj.problemDescribe" placeholder-class="app-placeholder" class="textarea"></textarea>
+				</view>
+				<view class="footer"><text>可输入字数</text><text>{{saveObj.problemDescribe.length}}/500</text></view>
+			</view>
+			
+			<view class="card form-picture">
+				<view class="lable">相关截图或图片</view>
+				<view class="content">
+					<view class="picture view" v-for="(item,index) in upFileUrls" :key="index">
+						<view class="remove" @click="clearUpFile(item)"><text class="ax-iconblock i-cancel icon"></text></view>
+						<image :src="item.temUrl" class="image" mode="aspectFill"></image>
+					</view>
+					<view class="picture" v-if="upFileUrls.length < 4" @click="upFile()"><text class="ax-iconblock i-paizhao icon"></text><text class="name">点击上传</text></view>
+				</view>
+				<view class="footer"><text>上传问题截图可以让问题快速解决哦</text><text>{{upFileUrls.length}}/4</text></view>
+			</view>
+			
+			<view class="card form-contact">
+				<view class="lable">联系方式</view>
+				<view class="content">
+					<input placeholder="手机号或邮箱以便我们回复您" v-model="saveObj.contactWay" placeholder-class="app-placeholder" class="input"/>
+				</view>
+			</view>
+			<view class="tips">咨询问题可以联系<text class="em">在线客服</text>哦</view>
+			<button class="submit" @click="saveFeeback()">确认提交</button>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				types:{
+					index: -1,
+					data:[{name:'投诉吐槽',value:1},{name:'功能异常',value:2},{name:'体验问题',value:3},{name:'功能建议',value:3},{name:'其他',value:9}]
+				},
+				upFileUrls : [],//上传的图片地址
+				saveObj:{
+					problemType : 9,//问题类型(1投诉吐槽,2功能异常,3体验问题,4功能建议,9其他 )
+					problemDescribe : "",//问题描述
+					filesUrl : "",//相关图片地址
+					contactWay : "",//联系方式(手机号或者邮箱)
+				}
+			}
+		},
+		methods: {
+			onTag(item,index){
+				this.types.index = this.types.index==index ? -1 : index;
+				this.saveObj.problemType = this.types.data[this.types.index].value;
+			},
+			//删除上传的图片
+			clearUpFile(item){
+				this.upFileUrls = this.upFileUrls.filter(obj => obj.temUrl != item.temUrl);
+			},
+			//上次图片
+			upFile(){
+				var _this = this;
+				uni.chooseImage({
+					count: 6, //默认9
+					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+					sourceType: ['album'], //从相册选择
+					success: function (res) {
+						console.log(res)
+						console.log(JSON.stringify(res.tempFilePaths));
+						uni.uploadFile({
+									url: _this.$config.url.request+"userApi/upFile", //仅为示例,非真实的接口地址
+									filePath: res.tempFilePaths[0],
+									name: 'file',
+									formData: {
+										'user': 'test',//额外参数
+									},
+									success: (uploadFileRes) => {
+										var upObj = JSON.parse(uploadFileRes.data);
+										var tem = {
+											temUrl : res.tempFilePaths[0],
+											url : upObj.fileUrl
+										}
+										_this.upFileUrls.push(tem);
+										console.log(upObj);
+									}
+								});
+					}
+				});
+				
+			},
+			//保存意见反馈
+			saveFeeback(){
+				if(this.types.index == -1){
+					this.$app.popup.alert("请选择一个问题。","温馨提示");
+					return;
+				}
+				if(!this.saveObj.problemDescribe){
+					this.$app.popup.alert("请填写您意见或建议。","温馨提示");
+					return;
+				}
+				if(this.saveObj.problemDescribe.length > 500){
+					this.$app.popup.alert("问题描述只能填写500字以内。","温馨提示");
+					return;
+				}
+				this.saveObj.filesUrl = this.upFileUrls.map(obj=>obj.url).join(",");
+				var obj = this.saveObj;
+				this.$api.base("post","/userApi/addUserFeedback",obj,{}).then(res=>{
+					console.log("设备信息:",res)
+					this.$app.popup.confirm("感谢您的反馈。","温馨提示",{showCancel:false}).then(cRes=>{
+						this.$app.url.back()
+					})
+				})
+			}
+		
+		}
+	}
+</script>
+
+<style scoped>
+@import url("feedback");
+</style>

+ 341 - 0
pages/index/index.css

@@ -0,0 +1,341 @@
+page{
+	font-size: 16px;
+}
+
+ax-body{
+	display: block;
+	height: 100%;
+	background: linear-gradient(to bottom,#C7FFFD,#FFF,#E6F3FF,#8BECFF,#72B8FE,#86D3FD);
+}
+
+ax-body >>> .ax-body .__root{
+	display: flex;
+	flex-direction: column;
+	padding-left: 0 !important;
+	padding-right: 0 !important;
+	position: relative;
+	overflow: hidden !important;
+	padding-bottom: var(--app-navigation-heiht) !important;
+}
+.main-scroll-wrap{
+	flex: 1;
+	position: relative;
+}
+.root-scroll{
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+.contet-root{
+	height: 100%;
+}
+.base{
+	padding-left: 10px;
+	padding-right: 10px;
+}
+
+/* 导航栏 */
+app-navigation{
+	display: block;
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+
+/* 标题栏 */
+.titlebar{
+	display: flex;
+	align-items: center;
+	padding-left: 3px;
+}
+.titlebar .page-title{
+	width: 133px;
+	height: 33px;
+}
+.titlebar .page-subtitle{
+	font-size: 12px;
+}
+
+/* 定位城市 */
+.search-view{
+	position: sticky;
+	top: 0;
+	z-index: 90;
+}
+.locate-city{
+	display: flex;
+	align-items: center;
+	margin-right: 10px;
+}
+.locate-city ._icon{
+	display: inline-block;
+	width: 20px;
+	height: 20px;
+	margin-right: 5px;
+}
+
+/* 搜索条 */
+.search-bar{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	height: 30px;
+	padding: 0 10px;
+	border-radius: 8px;
+	border: 1px solid #2B303A;
+	background-color: #fff;
+}
+.search-bar input{
+	flex: 1;
+	display: block;
+	font-size: 14px;
+	background-color: transparent;
+}
+.search-bar ._icon-search{
+	display: inline-block;
+	width: 20px;
+	height: 20px;
+	margin-left: 10px;
+}
+
+/* 快捷栏 */
+.shortcut-bar{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 15px 10px;
+}
+.shortcut-bar ._item{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.shortcut-bar ._item ._icon{
+	width: 40px;
+	height: 40px;
+}
+.shortcut-bar ._item ._name{
+	font-size: 12px;
+	margin-top: 6px;
+}
+
+/* 版头广告 */
+.banner{
+	width: 100%;
+	height: calc((100vw - 20px) * (5/27));
+}
+.banner .swiper-item{
+	display: flex;
+	width: 100%;
+}
+.banner .swiper-item .swiper-item-image{
+	display: block;
+	width: 100%;
+	border-radius: 5px;
+}
+
+/* 选项条 */
+.options-bar{
+	align-items: center;
+	padding: 15px 0px;
+	font-size: 14px;
+}
+.options-bar .option-item{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	font-size: inherit;
+}
+.options-bar .option-item + .option-item{
+	margin-left: 30px;
+}
+.options-bar .option-item.active{
+	font-size: 18px;
+	font-weight: bold;
+}
+.options-bar .option-item::after{
+	content: '';
+	display: block;
+	width: 30px;
+	height: 6px;
+	transform: translateY(5px) scaleX(0);
+	border-radius: 10pc;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+	transition: all 400ms ease;
+}
+.options-bar .option-item.active::after{
+	transform: translateY(5px) scaleX(1);
+}
+.options-bar .separ{
+	flex: 1;
+}
+.options-bar .separ::before{
+	content: '';
+	display: block;
+	height: 13px;
+	border-left: 1px solid #3EB6F8;
+}
+.options-bar .map-mode{
+	color: #3EB6F8;
+}
+.options-bar .map-mode ._icon{
+	width: 17px;
+	height: 17px;
+	margin-right: 5px;
+}
+
+/* 电站列表 */
+.list-scroll-wrap{
+	height: var(--list-heiht);
+	position: relative;
+}
+.list-scroll-wrap > .list-scroll{
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+.list{
+	padding: 10px;
+}
+.list .item{
+	display: block;
+	border-radius: 8px;
+	background-color: #fff;
+	box-shadow: 0 1px 10px rgba(0, 39, 52, 0.1);
+	overflow: hidden;
+}
+.list .item + .item{
+	margin-top: 10px;
+}
+.list .item .contet{
+	padding: 10px;
+	background: #F6F9FE url('@/static/img/charging_station_item_background.png') no-repeat center;
+}
+.list .item .name{
+	display: flex;
+	font-weight: bold;
+}
+.list .item .name > .txt{
+	flex: 1;
+	line-height: 1.5em;
+}
+.list .item .name > .icon{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	border-radius: 4px;
+	background: linear-gradient(to bottom,#2A67F0,#769FFC);
+	margin-right: 10px;
+}
+.list .item .name > .icon image{
+	display: block;
+	width: 10px;
+}
+.list .item .parkade{
+	display: flex;
+	font-size: 12px;
+	color: #aaa;
+	margin-top: 15px;
+}
+.list .item .parkade > .txt{
+	flex: 1;
+	line-height: 1.5em;
+}
+.list .item .parkade > .icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	background-color: #5BE7FF;
+	margin-right: 10px;
+}
+.list .item .parkade > .icon image{
+	display: block;
+	width: 10px;
+}
+.list .item .info{
+	margin-top: 15px;
+}
+.list .item .info .charge{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+}
+.list .item .info .charge > .icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	color: #fff;
+	font-size: 13px;
+	border-radius: 4px;
+	background: linear-gradient(to bottom,#4FEF86,#00AA3A);
+}
+.list .item .info .charge > .icon.blue{
+	background: linear-gradient(to bottom,#8EB1FF,#3071FF);
+}
+.list .item .info .charge > .value{
+	margin-left: 5px;
+}
+.list .item .info .charge > .max{
+	color: #aaa;
+	font-size: 12px;
+}
+.list .item .info .charge > .max::before{
+	content: '/';
+}
+.list .item .info .charge + .charge{
+	margin-left: 30px;
+}
+.list .item .info .distance{
+	display: flex;
+	align-items: center;
+	height: 22px;
+	border: 1px solid #3EB6F8;
+	border-radius: 100pc;
+	font-size: 12px;
+	color: #3EB6F8;
+	padding-right: 7px;
+	overflow: hidden;
+}
+.list .item .info .distance > .icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	background-color: #3EB6F8;
+	margin-right: 5px;
+}
+.list .item .info .distance > .icon image{
+	display: block;
+	width: 10px;
+}
+.list .item .price{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	background-color: #fff;
+	height: 45px;
+	font-size: 14px;
+	padding: 0 10px;
+	box-shadow: 0 0 5px rgba(0, 0, 0, 0.05);
+}
+.list .item .price .value{
+	font-size: 24px;
+	font-weight: bold;
+}
+.list .item .price .unit{
+	margin-left: 10px;
+}

+ 476 - 0
pages/index/index.vue

@@ -0,0 +1,476 @@
+<template>
+	<ax-body hide-indicator-area :style="[StyleSheet]">
+		<!-- 标题栏 -->
+		<template #title>
+			<view class="titlebar">
+				<image src="@/static/img/title.png" class="page-title"></image>
+				<!-- <text class="page-subtitle">“特惠充电享不停”</text> -->
+			</view>
+		</template>
+		<view class="base">
+			<!-- 搜索块 -->
+			<view id="search" class="app-flex search-view">
+				<view class="locate-city">
+					<image src="@/static/img/locate.svg" class="_icon"></image>
+					<text class="__name">{{city.data[city.index].text}}</text>
+				</view>
+				<label class="search-bar" @click="$app.url.goto('/pages/search/search')">
+					<input placeholder-class="app-placeholder" placeholder="输入目的地/电站名" />
+					<image src="@/static/img/search.svg" class="_icon-search"></image>
+				</label>
+			</view>
+		</view>
+		<!-- 主滚动 -->
+		<view class="main-scroll-wrap">
+			<scroll-view class="root-scroll app-hide-scrollbar" @scrolltolower="scrollLock=true" @scrolltoupper="scrollLock=false" scroll-y>
+				<view class="contet-root">
+					<!-- 内容顶部 -->
+					<view id="roller" class="base">
+						<!-- 快捷栏 -->
+						<view class="shortcut-bar">
+							<view class="_item" @click="$app.url.goto('/pages/order/order')">
+								<image src="@/static/img/shortcut1.png" class="_icon"></image>
+								<view class="_name">订单中心</view>
+							</view>
+							<view class="_item" @click="$app.url.goto('/pages/coupon-buy/coupon-buy')">
+								<image src="@/static/img/shortcut2.png" class="_icon"></image>
+								<view class="_name">购充电券</view>
+							</view>
+							<view class="_item" @click="customerService()">
+								<image src="@/static/img/shortcut3.png" class="_icon"></image>
+								<view class="_name">在线客服</view>
+							</view>
+							<view class="_item" @click="$app.url.goto('/pages/feedback/feedback')">
+								<image src="@/static/img/shortcut4.png" class="_icon"></image>
+								<view class="_name">意见反馈</view>
+							</view>
+						</view>
+						<!-- 版头广告 -->
+						<swiper class="banner" v-if="banners.length>0" autoplay="true" >
+							<swiper-item v-for="(item,index) in banners" :key="index">
+								<view class="swiper-item">
+									<image   @load="bannerLoadCompleted()" :src="showImg(item.pic)" class="swiper-item-image" mode="widthFix"></image>
+								</view>
+							</swiper-item>
+						</swiper>
+					</view>
+					<view id="fixed" class="base">
+						<!-- 选项条 -->
+						<view class="app-flex options-bar">
+							<view class="app-flex middle option-wrap">
+								<view v-for="(item,index) in sorts.data" :key="index" @click="changeSort(index)" 
+								class="option-item" :class="{active:sorts.index==index}">{{item.name}}</view>
+							</view>
+							<view class="app-flex c-center separ"></view>
+							<view @click="$app.url.goto('/pages/map/map',false)" class="app-flex middle map-mode">
+								<image src="@/static/img/map.svg" class="_icon"></image>
+								<text>地图模式</text>
+							</view>
+						</view>
+					</view>
+					<!-- 电站列表 -->
+					<view id="list-box" class="list-scroll-wrap">
+						<scroll-view class="list-scroll" :scroll-y="scrollLock">
+							<view class="list">
+								<view v-for="(item,index) in list.data" :key="index" @click="gotoSiteDetail(item)" class="item">
+									<view class="contet">
+										<view class="name">
+											<view class="icon"><image src="@/static/img/plug.svg" mode="widthFix"></image></view>
+											<view class="txt">{{item.name}}</view>
+										</view>
+										<view class="parkade">
+											<view class="icon"><image src="@/static/img/parkade.svg" mode="widthFix"></image></view>
+											<!-- <view class="txt"><rich-text :nodes="item.parkTips"></rich-text></view> -->
+											<view class="txt">充电减免2小时停车费,超出时长部分计时收费</view>
+										</view>
+										<view class="app-flex c-between info">
+											<view class="app-flex middle">
+												<view class="charge"><text class="icon">快</text><text class="value">{{item.params.emptyFast}}</text><text class="max">{{item.params.totalFast}}</text></view>
+												<view class="charge"><text class="icon blue">慢</text><text class="value">{{item.params.emptySlow}}</text><text class="max">{{item.params.totalSlow}}</text></view>
+											</view>
+											<view class="discount" v-if="discountInfo">
+												<view>
+													{{discountInfo.temp2}}
+												</view>
+											</view>
+											<view class="distance">
+												<view class="icon"><image src="@/static/img/distance.svg" mode="widthFix"></image></view>
+												<text>{{item.params.rangeShow}}</text>
+											</view>
+										</view>
+									</view>
+									<view class="price">
+										<view class="app-flex middle" style="color: #FF5D50;">
+											<text class="value">{{item.params.nowPrice?item.params.nowPrice.toFixed(4):"0.0000"}}</text>
+											<text class="unit">元/度</text>
+										</view>
+										<view>{{item.params.priceShow}}</view>
+									</view>
+								</view>
+							</view>
+						</scroll-view>
+					</view>
+					<!-- <view style="height: 158px;"></view> -->
+				</view>
+			</scroll-view>
+		</view>
+		<app-navigation id="app-navigation" active="home"></app-navigation>
+	</ax-body>
+</template>
+
+<script>
+	var bmap = require('static/js/bmap-wx.js'); 
+	export default {
+		async onLoad(options) {
+			const permit = await this.queryPermit();
+			if(permit.privacy){
+				// 没有通过隐私协议
+				this.privacy.visible = true;
+			}else{
+				// 已通过隐私协议
+				if(permit.location===true){
+					// 可以调用定位能力
+					this.updateLocation();
+				}else if(permit.location===false){
+					// 通过了隐私协议,但是定位被拒绝
+					this.location.visible = true;
+					this.updateLocation();
+				}else if(permit.location===undefined){
+					// 没有申请过定位能力
+					this.updateLocation();
+				}
+			}
+			
+			if (options.hasOwnProperty('q') && options.q) {
+			    // 通过下面这步解码,可以拿到url的值
+				const url = decodeURIComponent(options.q)
+				// 对url中携带的参数提取处理
+				console.log("url:"+url)
+				var device_no = this.getQueryParams(url,"connectorCode")
+				console.log("device_no:"+device_no)
+				if(device_no){
+					this.getDeviceInfo(device_no)
+				}
+				
+			}
+		},
+		mounted() {
+			this.setListHeight();
+			this.setAppNavigationHeight();
+		},
+		data() {
+			return {
+				// 导航栏高度
+				appNavigationHeight: 0,
+				// 页面滚动锁
+				scrollLock: true,
+				
+				sorts:{
+					index: 0,
+					data: [{name:'离我最近',code:"range"},{name:'空闲最多',code:"device"},{name:'电费最低',code:"price"}]
+				},
+				list:{
+					height: 0,
+					data: []
+				},
+				banners:[],
+				location:{
+					visible: false,
+					value: '',
+				},
+				privacy:{
+					visible: false,
+				},
+				city:{
+					index: 0,
+					data:[
+						{text:'贵阳',areaCode:"5201"},
+						{text:'六盘水',areaCode:"5202"},
+						{text:'遵义',areaCode:"5203"},
+						{text:'安顺',areaCode:"5204"},
+						{text:'毕节',areaCode:"5205"},
+						{text:'铜仁',areaCode:"5206"},
+						{text:'黔东南',areaCode:"5226"},
+						{text:'黔南',areaCode:"5227"},
+						{text:'黔西南',areaCode:"5223"},
+					]
+				},
+				discountInfo:null
+			}
+		},
+		onShow() {
+			this.getBanners()
+		},
+		computed:{
+			StyleSheet(){
+				return {
+					'--app-navigation-heiht': `${this.appNavigationHeight}px`,
+					'--list-heiht': `${this.list.height}px`
+				}
+			}
+		},
+		onShareAppMessage(res) {
+			if (res.from === 'button') {
+				// 来自页面内分享按钮
+				console.log(res.target);
+			}
+			return {
+				title: "用券充天天都享会员价", // 标题
+				path: "/pages/index/index", // 分享路径
+				imageUrl: '../../static/img/share.jpg', // 分享图
+				desc: '用券充天天都享会员价'
+			};
+		},
+		onShareTimeline() {
+			return {
+				title: "用券充天天都享会员价", // 标题
+				path: "/pages/index/index", // 分享路径
+				imageUrl: '../../static/img/share.jpg'// 分享图
+			};
+		},
+		methods: {
+			getDeviceInfo(sn){
+				this.$api.base("post","/chargeApi/checkDevicesBySn",{"sn":sn},{}).then(res=>{
+					console.log("设备信息:",res)
+					var item = res.device;
+					//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+					if(item.deviceStatus == 0 || item.deviceStatus == 255 ){
+						return;
+					}
+					this.$app.url.goto('/pages/terminal/terminal?deviceId='+item.id+"&deviceStatus="+item.deviceStatus);
+				})
+			},
+			getQueryParams(url,key) {  
+			    const queryString = url.split('?')[1] || '';  
+			    const params = {};  
+			    const pairs = queryString.split('&');  
+			  
+			    pairs.forEach(pair => {  
+			        const [key, value] = pair.split('=');  
+			        params[decodeURIComponent(key)] = decodeURIComponent(value || '');  
+			    });  
+			  
+			    return params[key];  
+			}, 
+			showImg(img){
+				return this.$config.url.request+img
+			},
+			// 打开客服
+			customerService(){
+				const cs = this.$config.customerService;
+				this.$app.act.customerService(cs.id,cs.url).catch(err=>{
+					console.log(err);
+					this.$app.popup.alert('客服中心失联啦,请联系管理员!');
+				});
+			},
+			// 查询许可
+			queryPermit(){
+				return new Promise((resolve,reject)=>{
+					const data = {};
+					const check = ()=>{
+						if( Object.keys(data).length == 2 ) resolve(data);
+					}
+					if(uni.getPrivacySetting){
+						uni.getPrivacySetting({
+							success: res => {
+								data.privacy = res.needAuthorization;
+							},
+							complete: () => {
+								if(typeof data.privacy !='boolean' && typeof data.privacy !='undefined') data.privacy = null;
+								check();
+							},
+						});
+					}else{
+						data.privacy = false;
+					}
+					uni.getSetting({
+						success: res => {
+							data.location = uni.getLocation ? res.authSetting['scope.userLocation'] : undefined;
+						},
+						complete: () => {
+							if(typeof data.location !='boolean' && typeof data.location !='undefined') data.location = null;
+							check();
+						},
+					})
+				});
+			},
+			// 更新位置
+			updateLocation(){
+				this.getLocation().then(res=>{
+					this.location.value = [res.longitude,res.latitude].join(',');
+					this.getStations(res.longitude,res.latitude)
+					this.$app.storage.set('USER_LOCATION',this.location.value);
+					return this.reverseGeocoder([res.latitude,res.longitude].join(','))
+				});
+			},
+			// 获取定位
+			getLocation(){
+				return new Promise((resolve,reject)=>{
+					// this.loading.visible = true;
+					if(uni.getLocation){
+						uni.getLocation({
+							success: res => resolve(res),
+							fail: err => {
+								console.log(err)
+								console.log('定位失败');
+								// this.location.visible = true;
+								this.getStations("","")
+							},
+							complete: () => {
+								
+							}
+						})
+					}else{
+						console.log('微信版本太低,无定位接口可用');
+						resolve({longitude:'',latitude:''});
+					}
+				});
+			},
+			reverseGeocoder(latlon){
+				console.log(latlon)
+				let lat = latlon.split(",")[0]
+				let lng = latlon.split(",")[1]
+				let baiduLoc = this.convertGcj02ToBd09(lng,lat)
+				latlon = baiduLoc.lat+","+baiduLoc.lng
+				console.log(latlon)
+				return new Promise((resolve,reject)=>{
+					var BMap = new bmap.BMapWX({ 
+					            ak: 'vtQgaPzonb3H4qeUOWGr53ePcNCsmdMj' 
+					        }); 
+					BMap.regeocoding({
+						location:latlon,
+						success:res=>{
+							
+							let code = res.originalData.result.addressComponent.adcode.substr(0,4)
+							for (var i = 0; i < this.city.data.length; i++) {
+								if(this.city.data[i].areaCode==code){
+									this.city.index = i
+									break;
+								}
+							}
+							console.log(res)
+						},
+						fail:err=>{
+							console.log(err)
+						}
+					})
+				});
+			},
+			getBanners(){
+				this.$api.base("post","/userApi/getBanners",{},{}).then(res=>{
+					this.banners = res.banners
+				})
+			},
+			convertBdToTx(lng, lat) {  
+			    // 百度坐标系(BD09)转火星坐标系(GCJ-02,即腾讯地图使用的坐标系)  
+			    // 这里的转换公式是基于经验公式,可能存在一定的误差  
+			    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
+			    let x = lng - 0.0065;  
+			    let y = lat - 0.006;  
+			    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);  
+			    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);  
+			    let lngs = z * Math.cos(theta);  
+			    let lats = z * Math.sin(theta);  
+			    return { lng: lngs, lat: lats };  
+			},
+			getStations(lng,lat){
+				this.$api.base("post","/chargeApi/getStations",{order:this.sorts.index,lat,lng},{}).then(res=>{
+					res.stationList.forEach(i=>{
+						var txPoint = this.convertBdToTx(i.lng,i.lat)
+						i.lng = txPoint.lng
+						i.lat = txPoint.lat
+					})
+					this.list.data = res.stationList
+					if(res.discountInfo){
+						this.discountInfo = res.discountInfo
+					}
+				})
+			},
+			// 设定导航栏高度
+			setAppNavigationHeight(){
+				this.$nextTick(()=>{
+					uni.createSelectorQuery().in(this).select("#app-navigation").boundingClientRect(data=>{
+						this.appNavigationHeight = data.height;
+					}).exec();
+				});
+			},
+			// 设置列表高度
+			setListHeight(){
+				this.$app.act.selectorQuery(this,"#list-box,#roller",true).then(res=>{
+					const win = uni.getWindowInfo();
+					const roller = res.find(i=>i.id=='roller');
+					const list = res.find(i=>i.id=='list-box');
+					this.list.height = win.windowHeight - list.top - this.appNavigationHeight + roller.height;
+				});
+			},
+			// 版头加载完成
+			bannerLoadCompleted(){
+				this.setListHeight();
+			},
+			changeSort(index){
+				this.sorts.index = index;
+				switch(index){
+					case 0:
+						this.list.data.sort((a,b)=>a.params.range-b.params.range)
+					break;
+					case 1:
+						this.list.data.sort((a,b)=>b.params.totalEmpty-a.params.totalEmpty)
+					break;
+					case 2:
+						this.list.data.sort((a,b)=>a.params.nowPrice-b.params.nowPrice)
+					break;
+				}
+			},
+			scrolltolower(){
+				console.log('到底')
+			},
+			gotoSiteDetail(item){
+				this.$app.url.goto('/pages/site/site?item='+JSON.stringify(item));
+			},
+			// 确认隐私协议
+			agreePrivacyAuthorization(){
+				this.privacy.visible = false;
+				this.updateLocation();
+			},
+			// 打开隐私协议
+			openPrivacyContract(){
+				uni.openPrivacyContract();
+			},
+			// 拒绝隐私协议
+			refusePrivacy(){
+				this.privacy.visible = false;
+			},
+			convertGcj02ToBd09(lng, lat) {
+			    const x_pi = 3.14159265358979324 * 3000.0 / 180.0;
+			    const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_pi);
+			    const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_pi);
+			    const bd_lng = z * Math.cos(theta) + 0.0065;
+			    const bd_lat = z * Math.sin(theta) + 0.006;
+			    return {
+			        lng: bd_lng,
+			        lat: bd_lat
+			    };
+			}
+		}
+	}
+</script>
+
+<style>
+@import url('index.css');
+.discount{
+	flex: 1;
+	text-align: right;
+	padding-right: 5px;
+}
+.discount view{
+	display: inline-flex;
+	align-items: center;
+	height: 22px;
+	border: 1px solid #ccc;
+	border-radius: 5px;
+	font-size: 12px;
+	color: #F59C79;
+	padding: 0 7px;
+	overflow: hidden;
+}
+</style>

+ 112 - 0
pages/login/login.css

@@ -0,0 +1,112 @@
+.page-background{
+	display: block;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.body{
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+
+.title{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 20px;
+	padding-bottom: 0px;
+	color: #2B303A;
+}
+.title .h1{
+	font-size: 30px;
+}
+.title .h2{
+	font-size: 20px;
+}
+.title .logo{
+	width: 76px;
+}
+
+.logo-wrap{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.logo-wrap .bg{
+	width: 100%;
+}
+
+.footer{
+	font-size: 14px;
+	color: #999;
+	padding: 0 35px 80px 35px;
+}
+.submit{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 50px;
+	font-size: inherit;
+	border-radius: 100pc;
+	background-color: #04C262;
+	color: #fff;
+}
+.submit::after{
+	display: none;
+}
+.submit[disabled]{
+	background-color: #ddd;
+}
+.submit text + text{
+	margin-left: 10px;
+}
+.submit text.ax{
+	font-size: 30px;
+}
+
+.cancel{
+	font-size: 12px;
+	text-align: center;
+	margin: 15px 0;
+}
+
+.agreement{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-wrap: wrap;
+	text-align: center;
+}
+.agreement .mask{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 1em;
+	height: 1em;
+	font-size: 16px;
+	border-radius: 100%;
+	border: 2px solid #3EB6F8;
+	vertical-align: middle;
+	margin-right: 10px;
+}
+.agreement .mask .ax{
+	color: #fff;
+	font-size: 10px;
+}
+.agreement .mask.active{
+	background-color: #3EB6F8;
+}
+.agreement .mask.active .ax{
+	display: block;
+}
+.agreement .em{
+	color: #3EB6F8;
+}

+ 67 - 0
pages/login/login.vue

@@ -0,0 +1,67 @@
+<template>
+	<ax-body blank="0" hideIndicatorArea>
+		<image src="@/static/img/page-bg01.png" class="page-background"></image>
+		<view class="body">
+			<view class="title">
+				<view>
+					<view class="h1">您好!</view>
+					<view class="h2">欢迎使用中数电动</view>
+				</view>
+				<image src="@/static/img/logo.svg" class="logo" mode="widthFix"></image>
+			</view>
+			<view class="logo-wrap">
+				<image src="@/static/img/login-bg.svg" class="bg" mode="widthFix"></image>
+			</view>
+			<view class="footer" style="padding-left: 0;padding-right: 0;">
+				<button @getphonenumber="onGetPhoneNumber" open-type="getPhoneNumber" class="submit" :disabled="!agreement" style="margin-left: 35px;width: calc(100% - 70px);">
+					<text class="ax ax-iconblock i-weixin"></text>
+					<text>微信用户一键登录</text>
+				</button>
+				<view class="cancel">取消返回</view>
+				<view @click="agreement = !agreement" class="agreement" style="font-size: 17px;">
+					<view class="mask" :class="{active:agreement}"><text class="ax ax-iconline i-select"></text></view>
+					<text>我已阅读并理解和同意</text>
+					<text @click.stop="checkPrivacy()" class="em">《隐私政策协议》</text>
+				</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad() {
+			uni.getPrivacySetting({success:res=>{
+				this.privacy.name = res.privacyContractName;
+				this.privacy.need = res.needAuthorization;
+			}});
+		},
+		data() {
+			return {
+				agreement: false,
+				privacy:{
+					need: true,
+					name: ''
+				},
+			}
+		},
+		methods: {
+			// 查看隐私
+			checkPrivacy(){
+				uni.openPrivacyContract();
+			},
+			onGetPhoneNumber(e){
+				if(e.detail.code){
+					this.$api.base("post",'/userApi/getPhone',{code:e.detail.code}).then(async res=>{
+						await this.$app.storage.set('USER_INFO',res.userInfo);
+						this.$app.url.back()
+					});
+				}
+			},
+		}
+	}
+</script>
+
+<style scoped>
+@import url("login.css");
+</style>

+ 349 - 0
pages/map/map.css

@@ -0,0 +1,349 @@
+ax-body >>> .ax-body .__root{
+	display: flex;
+	flex-direction: column;
+	padding: 0 !important;
+}
+
+ax-popup >>> .ax-popup{
+	z-index: 200 !important;
+}
+ax-popup >>> .ax-popup.bottom.close .__body{
+	animation-name: closeBottomBody2 !important;
+}
+ax-popup >>> .ax-popup .__mask{
+	backdrop-filter: blur(5px) !important;
+}
+@keyframes closeBottomBody2{
+	0%{transform: translateY(0%);opacity: 1;}
+	100%{transform: translateY(-20%);opacity: 0;}
+}
+
+.contet{
+	flex: 1;
+	padding: 0 10px;
+	position: relative;
+}
+
+.event-on{
+	pointer-events: auto;
+}
+.event-off{
+	pointer-events: none;
+}
+
+/* 导航栏 */
+app-navigation{
+	display: block;
+	position: relative;
+	z-index: 9999;
+}
+
+/* 标题栏 */
+.titlebar{
+	display: flex;
+	align-items: center;
+	padding-left: 3px;
+	position: relative;
+	z-index: 9999;
+}
+.titlebar .page-title{
+	width: 133px;
+	height: 33px;
+}
+.titlebar .page-subtitle{
+	font-size: 12px;
+}
+
+/* 地图 */
+.map-box{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	z-index: 10;
+}
+.map-box::before{
+	content: '';
+	display: block;
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	height: 25vh;
+	pointer-events: none;
+	background: linear-gradient(to bottom,#77DFFD,rgba(230,255,254,0));
+	z-index: 2;
+}
+.map-box .map{
+	display: block;
+	width: 100%;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+
+/* 主内容 */
+.contet{
+	position: relative;
+	z-index: 300;
+}
+
+/* 定位城市 */
+.search-view{
+	position: sticky;
+	top: 0;
+	z-index: 90;
+}
+.locate-city{
+	display: flex;
+	align-items: center;
+	margin-right: 10px;
+}
+.locate-city ._icon{
+	display: inline-block;
+	width: 20px;
+	height: 20px;
+	margin-right: 5px;
+}
+/* 搜索条 */
+.search-bar{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	height: 30px;
+	padding: 0 10px;
+	border-radius: 8px;
+	border: 1px solid #2B303A;
+	background-color: #fff;
+}
+.search-bar input{
+	flex: 1;
+	display: block;
+	font-size: 14px;
+	background-color: transparent;
+}
+.search-bar ._icon-search{
+	display: inline-block;
+	width: 20px;
+	height: 20px;
+	margin-left: 10px;
+}
+
+/* 列表模式 */
+.top-subinfo{
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	margin-top: 15px;
+}
+.list-model{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100px;
+	height: 34px;
+	color: #3EB6F8;
+	font-weight: bold;
+	font-size: 14px;
+	background-color: rgba(242, 248, 255, 0.85);
+	border-radius: 100pc;
+	box-shadow: 0 3px 6px rgba(122, 168, 222, 0.2);
+}
+.list-model .icon{
+	display: block;
+	width: 14px;
+	height: 14px;
+	margin-right: 5px;
+}
+
+/* 电站信息 */
+.scroll-view{
+	width: 100%;
+	position: absolute;
+	left: 0;
+	right: 0;
+	bottom: 10px;
+	white-space: nowrap;
+}
+.list{
+	width: 1500px;
+	padding: 10px;
+	white-space: nowrap;
+}
+.list::after{
+	content: '';
+	display: block;
+	clear: both;
+}
+.site + .site{
+	margin-left: 10px;
+}
+.site{
+	display: block;
+	width: calc(100vw - 20px);
+	border-radius: 8px;
+	background-color: #fff;
+	box-shadow: 0 1px 10px rgba(0, 39, 52, 0.1);
+	overflow: hidden;
+	padding: 10px;
+}
+.site.only{
+	position: absolute;
+	left: 10px;
+	right: 10px;
+	bottom: 20px;
+}
+.site .ec-name{
+	color: #aaa;
+	font-size: 12px;
+	margin-top: 10px;
+}
+.site .name-wrap{
+	display: flex;
+	justify-content: space-between;
+}
+.site .name{
+	flex: 1;
+	display: flex;
+	font-weight: bold;
+}
+.site .name > .txt{
+	flex: 1;
+	line-height: 1.5em;
+}
+.site .name > .icon{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	border-radius: 4px;
+	background: linear-gradient(to bottom,#2A67F0,#769FFC);
+	margin-right: 10px;
+}
+.site .name > .icon image{
+	display: block;
+	width: 10px;
+}
+.site .parkade{
+	display: flex;
+	font-size: 12px;
+	color: #aaa;
+	margin-top: 15px;
+}
+.site .parkade > .txt{
+	flex: 1;
+	line-height: 1.5em;
+}
+.site .parkade > .icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	background-color: #5BE7FF;
+	margin-right: 10px;
+}
+.site .parkade > .icon image{
+	display: block;
+	width: 10px;
+}
+.site .info{
+	display: flex;
+	justify-content: space-around;
+	margin-top: 15px;
+}
+.site .info .charge{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	width: 90px;
+	height: 60px;
+	border-radius: 4px;
+	background: linear-gradient(to bottom,rgba(69,230,125,0.2),rgba(218,249,229,0));
+}
+.site .info .charge .icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 50px;
+	height: 20px;
+	color: #fff;
+	font-size: 13px;
+	border-radius: 4px;
+	margin-bottom: 4px;
+	background: linear-gradient(to bottom,#4FEF86,#00AA3A);
+}
+.site .info .charge.purple{
+	background: linear-gradient(to bottom,rgba(190,210,266,0.2),rgba(62,82,128,0));
+}
+.site .info .charge.purple .icon{
+	background: linear-gradient(to bottom,#8EB1FF,#3071FF);
+}
+.site .info .charge.blue{
+	background: linear-gradient(to bottom,rgba(136,241,252,0.2),rgba(68,121,126,0));
+}
+.site .info .charge.blue .icon{
+	background: linear-gradient(to bottom,#8FF8FB,#47AEFF);
+}
+
+.site .info .charge .value{
+	margin-left: 5px;
+}
+.site .info .charge .max{
+	color: #aaa;
+	font-size: 12px;
+}
+.site .info .charge .max::before{
+	content: '/';
+}
+.site .info .charge + .charge{
+	margin-left: 30px;
+}
+
+.site .distance{
+	display: flex;
+	align-items: center;
+	height: 22px;
+	border: 1px solid #3EB6F8;
+	border-radius: 100pc;
+	font-size: 12px;
+	color: #3EB6F8;
+	padding-right: 7px;
+	overflow: hidden;
+	margin-left: 10px;
+}
+.site .distance > .icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	background-color: #3EB6F8;
+	margin-right: 5px;
+}
+.site .distance > .icon image{
+	display: block;
+	width: 10px;
+}
+.site .price{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	background-color: #F2F8FF;
+	border-radius: 8px;
+	height: 45px;
+	font-size: 14px;
+	padding: 0 10px;
+	margin-top: 14px;
+	box-shadow: 0 3px 6px rgba(122, 168, 222, 0.2);
+}
+.site .price .value{
+	font-size: 24px;
+	font-weight: bold;
+}
+.site .price .unit{
+	margin-left: 10px;
+}

+ 214 - 0
pages/map/map.vue

@@ -0,0 +1,214 @@
+<template>
+	<ax-body hide-indicator-area>
+		<!-- 标题栏 -->
+		<template #title>
+			<view class="titlebar event-off">
+				<image src="@/static/img/title.png" class="page-title"></image>
+				<!-- <text class="page-subtitle">“新能源充电新能源”</text> -->
+			</view>
+		</template>
+		<view class="map-box">
+			<map 
+			id="map"
+			class="map" @markertap.stop="markertap" 
+			:latitude="map.latitude" 
+			:show-location="true"
+			:longitude="map.longitude" 
+			:markers="markersData"></map>
+		</view>
+		<view class="contet event-off">
+			<!-- 搜索块 -->
+			<view id="search" class="app-flex search-view event-on">
+				<view class="locate-city">
+					<image src="@/static/img/locate.svg" class="_icon"></image>
+					<text class="__name">贵阳</text>
+				</view>
+				<label class="search-bar" @click="$app.url.goto('/pages/search/search')">
+					<input placeholder-class="app-placeholder" placeholder="输入目的地/电站名" />
+					<image src="@/static/img/search.svg" class="_icon-search"></image>
+				</label>
+			</view>
+			<!-- 列表模式 -->
+			<view class="top-subinfo">
+				<view @click="$app.url.goto('/pages/index/index',false)" class="list-model event-on">
+					<image src="@/static/img/switch.svg" class="icon"></image>
+					<view>列表模式</view>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 电站信息 -->
+		<ax-popup @closed="onClosed" ref="site" position="bottom" maskType="" maskClose>
+			<view class="popup-body">
+				<view @click="gotoSiteDetail()" class="site event-on">
+					<view class="name-wrap">
+						<view class="name">
+							<view class="icon"><image src="@/static/img/plug.svg" mode="widthFix"></image></view>
+							<view class="txt">{{list.data[list.index].name}}</view>
+						</view>
+						<view class="distance">
+							<view class="icon"><image src="@/static/img/distance.svg" mode="widthFix"></image></view>
+							<text>{{list.data[list.index].params.rangeShow}}</text>
+						</view>
+					</view>
+					<view class="ec-name">{{list.data[list.index].equipmentOwnerName}}</view>
+					<view class="app-flex c-between info">
+						<view class="charge">
+							<view class="icon">快充</view>
+							<view><text class="value">{{list.data[list.index].params.emptyFast}}</text><text class="max">{{list.data[list.index].params.totalFast}}</text></view>
+						</view>
+						<view class="charge purple">
+							<view class="icon">慢充</view>
+							<view><text class="value">{{list.data[list.index].params.emptySlow}}</text><text class="max">{{list.data[list.index].params.totalSlow}}</text></view>
+						</view>
+						<view class="charge blue">
+							<view class="icon">停车</view>
+							<view><text class="value">3</text><text class="max">h</text></view>
+						</view>
+					</view>
+					<view class="price">
+						<view class="app-flex middle" style="color: #FF5D50;">
+							<text class="value">{{(list.data[list.index]&&list.data[list.index].params.nowPrice)?list.data[list.index].params.nowPrice.toFixed(4):'0.0000'}}</text>
+							<text class="unit">元/度</text>
+						</view>
+						<view>{{list.data[list.index].params.priceShow}}</view>
+					</view>
+					<view class="parkade">
+						<view class="icon"><image src="@/static/img/parkade.svg" mode="widthFix"></image></view>
+						<!-- <view class="txt" v-html="list.data[list.index].parkTips"></view> -->
+						<view class="txt">充电减免2小时停车费,超出时长部分计时收费</view>
+					</view>
+				</view>
+				<view :style="{height:`${footPad}px`}"></view>
+			</view>
+		</ax-popup>
+		<app-navigation id="app-navigation" active="home"></app-navigation>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad() {
+			this.loadData();
+		},
+		mounted() {
+			this.$nextTick(()=>{
+				this.$app.act.selectorQuery(this,'#app-navigation').then(res=>{
+					this.footPad = res.height + 20;
+				});
+			});
+			var mapCtx = wx.createMapContext('map');
+			
+			let location = this.$app.storage.get('USER_LOCATION')
+			if(location&&location.split(",").length==2){
+				mapCtx.moveToLocation({
+					longitude:location.split(",")[0],
+					latitude:location.split(",")[1]
+				});
+			}else{
+				mapCtx.moveToLocation()
+			}
+			
+			this.mapCtx = mapCtx
+		},
+		data() {
+			return {
+				mapCtx:{},
+				footPad: 0,
+				map:{
+					latitude: 26.646694,
+					longitude: 106.628201,
+				},
+				list: {
+					index: -1,
+					data:[]
+				},
+			}
+		},
+		computed:{
+			markersData(){
+				return this.list.data.map((i,index)=>{
+					i.width = index == this.list.index ?32:28;
+					i.height = index == this.list.index ?32:28;
+					i.iconPath = `../../static/img/logo.png`;
+					return i;
+				});
+			}
+		},
+		onShareAppMessage(res) {
+			if (res.from === 'button') {
+				// 来自页面内分享按钮
+				console.log(res.target);
+			}
+			return {
+				title: "用券充天天都享会员价", // 标题
+				path: "/pages/index/index", // 分享路径
+				imageUrl: '../../static/img/share.jpg', // 分享图
+				desc: '用券充天天都享会员价'
+			};
+		},
+		onShareTimeline() {
+			return {
+				title: "用券充天天都享会员价", // 标题
+				path: "/pages/index/index", // 分享路径
+				imageUrl: '../../static/img/share.jpg'// 分享图
+			};
+		},
+		methods: {
+			convertBdToTx(lng, lat) {
+			    // 百度坐标系(BD09)转火星坐标系(GCJ-02,即腾讯地图使用的坐标系)  
+			    // 这里的转换公式是基于经验公式,可能存在一定的误差  
+			    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
+			    let x = lng - 0.0065;  
+			    let y = lat - 0.006;  
+			    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);  
+			    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);  
+			    let lngs = z * Math.cos(theta);  
+			    let lats = z * Math.sin(theta);  
+			    return { lng: lngs, lat: lats };  
+			},
+			// 载入数据
+			loadData(){
+				
+				let location = this.$app.storage.get('USER_LOCATION')
+				let lng = ""
+				let lat = ""
+				if(location&&location.split(",").length==2){
+					lng = location.split(",")[0]
+					lat = location.split(",")[1]
+				}
+				
+				this.$api.base("post","/chargeApi/getStations",{order:"0",lng,lat},{}).then(res=>{
+					
+					res.stationList.forEach(i=>{
+						var txPoint = this.convertBdToTx(i.lng,i.lat)
+						i.lng = txPoint.lng
+						i.lat = txPoint.lat
+					})
+					
+					res.stationList.forEach(i=>{
+						i.latitude = i.lat
+						i.longitude = i.lng
+					})
+					this.list.data = res.stationList
+				})
+			},
+			// 点击标记
+			markertap(e){
+				this.list.index = this.list.data.findIndex(i=>i.id==e.detail.markerId);
+				this.$refs.site.open();
+			},
+			// 关闭站点信息
+			onClosed(){
+				this.list.index = -1;
+			},
+			gotoSiteDetail(){
+				this.$app.url.goto('/pages/site/site?item='+JSON.stringify(this.list.data[this.list.index]));
+			}
+		}
+	}
+</script>
+
+<style>
+@import url("map.css");
+</style>

+ 166 - 0
pages/my/my.css

@@ -0,0 +1,166 @@
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F6FAFF;
+}
+
+app-navigation{
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+
+.page-background{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 0;
+}
+.page-background image{
+	display: block;
+	width: 100%;
+}
+
+.main{
+	position: relative;
+	z-index: 1;
+}
+
+/* 用户卡 */
+.user-card{
+	padding: 20px 0;
+}
+.user-avatar{
+	display: block;
+	width: 50px;
+	height: 50px;
+	margin-right: 10px;
+}
+.user-name{
+	font-size: 18px;
+	font-weight: bold;
+}
+.user-phone{
+	font-size: 12px;
+	margin-top: 5px;
+}
+.seting-icon{
+	width: 24px;
+	height: 24px;
+}
+.get-phone-number{
+	display: inline-flex;
+	height: unset;
+	border: none;
+	line-height: normal;
+	background-color: transparent;
+	font-size: 12px;
+	color: #2B303A;
+	padding: 0;
+	margin: 0;
+}
+.get-phone-number::after{
+	display: none;
+}
+
+/* 统计卡 */
+.sta-card{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	height: 78px;
+	border-radius: 8px;
+	background-color: #F2F8FF;
+	box-shadow: 0 3px 6px rgba(122, 168, 222, 0.3);
+	position: relative;
+	overflow: hidden;
+}
+.sta-card::before{
+	content: '';
+	display: block;
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	box-shadow: 0 8px 8px #fff inset;
+	background-color: transparent !important;
+}
+.sta-card + .sta-card{
+	margin-left: 10px;
+}
+.sta-card .value{
+	font-size: 24px;
+	font-weight: bold;
+	position: relative;
+	z-index: 3;
+}
+.sta-card .name{
+	font-size: 12px;
+	color: #aaa;
+	position: relative;
+	z-index: 3;
+}
+.sta-card .bg{
+	position: absolute;
+	top: 0;
+	right: 0;
+	height: 100%;
+	z-index: 2;
+}
+
+.buy{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 50px;
+	border-radius: 8px;
+	font-size: 14px;
+	margin-top: 15px;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}
+
+/* 卡片 */
+.card{
+	background-color: #fff;
+	border-radius: 8px;
+	margin-top: 15px;
+	box-shadow: 0 1px 8px rgba(122, 168, 222, 0.1);
+}
+.card-title{
+	padding: 10px 20px 0 20px;
+	font-weight: bold;
+}
+.act-wrap{
+	display: flex;
+	align-items: flex-end;
+	width: 100%;
+	padding: 15px 0px;
+}
+.act-item{
+	display: inline-flex;
+	align-items: center;
+	justify-content: space-between;
+	flex-direction: column;
+	width: 25%;
+	height: 50px;
+}
+.act-item .icon{
+	display: block;
+	width: 30px;
+	height: 30px;
+}
+.act-item .name{
+	font-size: 12px;
+}
+.act-item.about{
+	height: auto;
+}
+.act-item.about .icon{
+	width: 40px;
+	height: 40px;
+}

+ 153 - 0
pages/my/my.vue

@@ -0,0 +1,153 @@
+<template>
+	<ax-body>
+		<template #title></template>
+		<view class="page-background"><image src="@/static/img/my-bg.svg" mode="widthFix"></image></view>
+		
+		<!-- 主内容 -->
+		<view class="main">
+			<!-- 用户信息 -->
+			<view class="app-flex c-between user-card">
+				<view class="app-flex middle">
+					<image src="@/static/img/user-avatar.svg" class="user-avatar"></image>
+					<view>
+						<view class="user-name">{{userinfo.nickName?userinfo.nickName:'匿名'}}</view>
+						<view class="user-phone" v-if="userinfo.phone">{{userinfo.phone?userinfo.phone:'未获取手机'}}</view>
+						<button v-if="!userinfo.phone" @getphonenumber="onGetPhoneNumber" open-type="getPhoneNumber" class="get-phone-number">授权并登录</button>
+					</view>
+				</view>
+				<!-- <image src="@/static/img/seting.svg" class="seting-icon"></image> -->
+			</view>
+			<!-- 统计卡 -->
+			<view class="app-flex c-between">
+				<view class="sta-card">
+					<view class="value">{{userinfo.integralNum}}</view>
+					<view class="name">我的积分</view>
+					<image src="@/static/img/my-sta-bg01.png" mode="heightFix" class="bg"></image>
+				</view>
+				<view class="sta-card">
+					<view class="value">{{userinfo.params.balance}}</view>
+					<view class="name">可抵扣余量</view>
+					<image src="@/static/img/my-sta-bg03.png" mode="heightFix" class="bg"></image>
+					<view class="refund_btn" @click="refund">
+						退还
+					</view>
+				</view>
+			</view>
+			<view @click="$app.url.goto('/pages/coupon-buy/coupon-buy')" class="buy">购买充电券</view>
+			
+			<!-- 常用工具 -->
+			<view class="card">
+				<view class="card-title">常用工具</view>
+				<view class="act-wrap">
+					<view class="act-item" @click="$app.url.goto('/pages/recharge-log/recharge-log')">
+						<image src="@/static/img/my-icon01.svg" class="icon"></image>
+						<view class="name">购券记录</view>
+					</view>
+					<view class="act-item" @click="$app.url.goto('/pages/order/order')">
+						<image src="@/static/img/my-icon02.svg" class="icon"></image>
+						<view class="name">我的订单</view>
+					</view>
+					<view class="act-item" @click="$app.url.goto('/pages/feedback/feedback')">
+						<image src="@/static/img/my-icon03.svg" class="icon"></image>
+						<view class="name">意见反馈</view>
+					</view>
+					<view class="act-item" @click="customerService()">
+						<image src="@/static/img/my-icon04.svg" class="icon"></image>
+						<view class="name">在线客服</view>
+					</view>
+				</view>
+			</view>
+			
+			<!-- 更多功能 -->
+			<view class="card">
+				<view class="card-title">更多功能</view>
+				<view class="act-wrap">
+					<!-- <view class="act-item about">
+						<image src="@/static/img/logo-small.png" class="icon"></image>
+						<view class="name">关于我们</view>
+					</view> -->
+					<view class="act-item" @click="openPrivacyContract">
+						<image src="@/static/img/my-icon05.svg" class="icon"></image>
+						<view class="name">隐私条例</view>
+					</view>
+					
+				</view>
+			</view>
+		</view>
+		
+		<!-- 导航栏 -->
+		<app-navigation active="my"></app-navigation>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				userinfo:{}
+			}
+		},
+		onShow() {
+			this.getMyAccount()
+		},
+		methods: {
+			refund(){
+				this.$app.popup.confirm("退款按照购券记录进行逐笔退款,可能产生多笔退款到账记录,请注意查收。","退款说明").then(confirm=>{
+					if(confirm){
+						this.$api.base("post",'/orderApi/refund',{}).then(res=>{
+							if(res.code==0){
+								this.$app.popup.alert('退款成功!').then(()=>{
+									this.getMyAccount()
+								});
+							}else{
+								this.$app.popup.alert(res.msg);
+							}
+						});
+						
+						
+					}
+				});;
+			},
+			openPrivacyContract(){
+				uni.openPrivacyContract();
+			},
+			// 打开客服
+			customerService(){
+				const cs = this.$config.customerService;
+				this.$app.act.customerService(cs.id,cs.url).catch(err=>{
+					console.log(err);
+					this.$app.popup.alert('客服中心失联啦,请联系管理员!');
+				});
+			},
+			getMyAccount(){
+				this.$api.base("post","/userApi/getUserAccount",{},{}).then(res=>{
+					this.userinfo = res.accountInfo
+				})
+			},
+			onGetPhoneNumber(e){
+				if(e.detail.code){
+					this.$api.base("post",'/userApi/getPhone',{code:e.detail.code}).then(res=>{
+						this.$app.storage.set('USER_INFO',res.userInfo);
+						this.getMyAccount();
+					});
+				}
+				
+			},
+		}
+	}
+</script>
+
+<style scoped>
+@import url("my.css");
+.refund_btn{
+	position: absolute;
+	font-size: 14px;
+	color: #fff;
+	background-color: #3EB6F8;
+	padding: 2px 8px;
+	border-radius: 10px 0 0 10px;
+	bottom: 5px;
+	right: 0;
+	z-index: 99;
+}
+</style>

+ 176 - 0
pages/order-detail/order-detail.css

@@ -0,0 +1,176 @@
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F6FAFF;
+}
+.body{
+	position: relative;
+	z-index: 1;
+}
+/* 页面背景 */
+.page-background{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 0;
+}
+.page-background image{
+	display: block;
+	width: 100%;
+}
+
+/* 基础信息 */
+.base-info{
+	font-size: 14px;
+	position: relative;
+	color: #fff;
+	transform: translateY(5px);
+}
+.base-info .content{
+	padding: 10px;
+	position: relative;
+	z-index: 2;
+}
+.base-info .val{
+	margin-top: 10px;
+}
+.base-info .value{
+	display: inline-block;
+	font-weight: bold;
+	font-size: 30px;
+	margin-right: 5px;
+	transform: translateY(2px);
+}
+.base-info .name{
+	display: flex;
+	align-items: center;
+}
+.base-info .name .icon{
+	width: 24px;
+	margin-right: 10px;
+}
+.base-info .bg{
+	width: 100%;
+	position: absolute;
+	top: 0;
+	left: 0;
+}
+
+/* 卡片 */
+.card{
+	display: flex;
+	align-items: center;
+	padding: 10px;
+	margin-top: 20px;
+	background-color: #fff;
+	border-radius: 8px;
+}
+.card .item{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.card .item .icon{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 30px;
+	height: 30px;
+	color: #fff;
+	background-color: #aaa;
+	border-radius: 4px;
+}
+.card .item .icon.green{
+	background-color: #4EDC86;
+}
+.card .item .icon.red{
+	background-color: #F44033;
+}
+.card .item .date{
+	font-size: 12px;
+	color: #aaa;
+	text-align: center;
+}
+.card .item .time{
+	font-weight: bold;
+}
+.card .item .arrow{
+	width: 8em;
+}
+.card .item.middle{
+	margin: 0 10px;
+	font-size: 14px;
+}
+
+/* 单元格 */
+.cell-group{
+	background-color: #fff;
+	border-radius: 8px;
+	padding: 10px;
+	margin-top: 10px;
+}
+.cell-group .cell{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 32px;
+	font-size: 14px;
+}
+.cell-group .cell .contet{
+	color: #aaa;
+}
+.cell-group .summarize{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	height: 46px;
+}
+.cell-group .sum{
+	font-size: 16px;
+	color: #F44033 !important;
+}
+.cell-group.multi-line{
+	position: relative;
+	z-index: 2;
+}
+.cell-group.multi-line .cell{
+	display: block;
+	height: auto;
+}
+.cell-group.multi-line .cell .lable{
+	height: 28px;
+	color: #AAA;
+}
+.cell-group.multi-line .cell .contet{
+	height: 32px;
+	color: #2B303A;
+	font-size: 16px;
+	font-weight: bold;
+}
+
+
+/* 提示 */
+.tips{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 24px;
+	font-size: 12px;
+	border-radius: 4px;
+	background-color: #E2FDFE;
+	margin-top: 10px;
+}
+.tips .icon{
+	display: block;
+	width: 14px;
+	height: 14px;
+	margin-right: 10px;
+}
+
+.hr{
+	border-top: 1px solid #f0f0f0;
+}

+ 121 - 0
pages/order-detail/order-detail.vue

@@ -0,0 +1,121 @@
+<template>
+	<ax-body>
+		<view class="page-background"><image src="@/static/img/my-bg.svg" mode="widthFix"></image></view>
+		
+		<view class="body">
+			<!-- 基础信息 -->
+			<view class="base-info">
+				<view class="content">
+					<view class="name">
+						<image src="@/static/img/order-detail-icon.png" class="icon" mode="widthFix"></image>
+						<text>充电度数</text>
+					</view>
+					<view class="val"><text class="value">{{orderInfo.totalCharge || 0}}</text><text class="unit">度电</text></view>
+				</view>
+				<image src="@/static/img/order-detail-bg.png" class="bg" mode="widthFix"></image>
+			</view>
+			<!-- 单元格 -->
+			<view class="cell-group multi-line">
+				<view class="cell"><view class="lable">起始时间</view><view class="contet">{{orderInfo.startTime || '未知'}}</view></view>
+				<view class="cell"><view class="lable">终止时间</view><view class="contet">{{orderInfo.endTime || '未知'}}</view></view>
+				<view class="cell"><view class="lable">终止方式</view><view class="contet">{{getStopType()}}</view></view>
+			</view>
+			<!-- 单元格 -->
+			<view class="cell-group">
+				<view class="cell"><view class="lable">订单状态</view><view class="contet">{{getOrderStatus(orderInfo.status)}}</view></view>
+				<view class="cell"><view class="lable">订单编号</view><view class="contet">{{orderInfo.id}}</view></view>
+				<view class="cell"><view class="lable">订单时间</view><view class="contet">{{orderInfo.createTime}}</view></view>
+				<view class="cell"><view class="lable">充电电站</view><view class="contet">{{deviceInfo.thirdPartyStationName}}</view></view>
+				<view class="cell"><view class="lable">终端名称</view><view class="contet">{{deviceInfo.deviceName}}</view></view>
+				<view class="cell"><view class="lable">终端编号</view><view class="contet">{{deviceInfo.deviceNo}}</view></view>
+				<view class="cell"><view class="lable">车位编号</view><view class="contet">{{deviceInfo.parkNo ? deviceInfo.parkNo : "无"}}</view></view>
+				<!-- <view class="cell"><view class="lable">电费</view><view class="contet">{{orderInfo.thirdPartyElecfee?orderInfo.thirdPartyElecfee.toFixed(4):"0.0000"}}元</view></view>
+				<view class="cell"><view class="lable">服务费</view><view class="contet">{{clcaServicePrice(orderInfo)}}元</view></view> -->
+				<view class="hr"></view>
+				<view class="cell" v-if="orderInfo.discountMoney"><view class="lable">{{orderInfo.discountDes}}</view><view class="contet sum">-{{orderInfo.discountMoney?orderInfo.discountMoney.toFixed(4):"0.0000"}}元</view></view>
+				<view class="cell"><view class="lable">实际结算费用</view><view class="contet sum">{{orderInfo.realCost?orderInfo.realCost.toFixed(4):"0.0000"}}元</view></view>
+			</view>
+			<view class="tips">
+				<image src="@/static/img/warn.svg" class="icon"></image>
+				<text>本次充电费用已从您的“充电抵扣券”中抵扣结算</text>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad(opts) {
+			console.log("启动充值页面的参数:", opts)
+			this.getOrderInfo(opts.orderId);
+		},
+		data() {
+			return {
+				orderInfo : {id:1},//订单信息
+				deviceInfo : {},//充电桩详情
+			}
+		},
+		methods: {
+			getStopType(){
+				var str = "用户主动终止";
+				if(this.orderInfo.stopType){
+					if(this.orderInfo.stopType == 1){
+						str = "用户主动终止";
+					}else if(this.orderInfo.stopType == 2){
+						str = "充电桩主动终止";
+					}
+				}
+				return str;
+			},
+			clcaServicePrice(){
+				var serivp = this.orderInfo.realCost - this.orderInfo.thirdPartyElecfee;
+				if(this.orderInfo.discountMoney){
+					//有优惠价,服务费显示把优惠价加回去
+					serivp = serivp + this.orderInfo.discountMoney;
+				}
+				return serivp?serivp.toFixed(4):"0.0000"
+			},
+			//查询订单详情
+			getOrderInfo(orderId){
+				this.$api.base("post","/chargeApi/queryIsSuccessStop",{"id":orderId},{}).then(res=>{
+					console.log("订单详情:", res)
+					this.orderInfo = res.obj.orderInfo;
+					this.deviceInfo = res.obj.deviceInfo;
+				})
+			},
+			//拆解时间
+			splitTime(time,index){
+				if(!time){
+					return;
+				}
+				return time.split(" ")[index];
+			},
+			getOrderStatus(status){
+				var str = "";
+				//状态0待启动 1 充电中 2 结算中 3 已完成, 5未成功充电
+				switch(status){
+					case 0:
+						str = "待启动";
+						break;
+					case 1:
+						str = "充电中";
+						break;
+					case 2:
+						str = "结算中";
+						break;
+					case 3:
+						str = "已完成";
+						break;
+					case 5:
+						str = "未成功充电";
+						break;				
+				}
+				return str;
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url("order-detail.css");
+</style>

+ 270 - 0
pages/order/order.css

@@ -0,0 +1,270 @@
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F5F7FB;
+}
+ax-body >>> .ax-custom-title{
+	background-color: #fff !important;
+}
+
+.body{
+	height: 100%;
+	position: relative;
+	padding-top: 60px;
+}
+.top{
+	height: 60px;
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	padding: 0 10px;
+	background: #fff;
+}
+
+.tabs{
+	display: flex;
+	align-items: center;
+	position: relative;
+	z-index: 99999;
+}
+.tabs .tab{
+	font-size: 14px;
+	color: #2b303a;
+}
+.tabs .tab + .tab{
+	margin-left: 20px;
+}
+.tabs .tab.active{
+	position: relative;
+	font-weight: bold;
+}
+.tabs .tab::after{
+	content: '';
+	display: block;
+	width: 0px;
+	height: 4px;
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	border-radius: 10px;
+	transform: translateY(10px);
+	background: linear-gradient(to right,#8ff8fb,#47aeff);
+}
+.tabs .tab.active::after{
+	width: 40px;
+}
+
+.filter-icon{
+	font-size: 20px;
+	font-weight: bold;
+}
+
+.list{
+	height: 100%;
+	overflow: auto;
+	padding: 10px;
+}
+.list .item{
+	display: block;
+	padding: 10px;
+	background-color: #fff;
+	border-radius: 8px;
+	box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+}
+.list .item + .item{
+	margin-top: 10px;
+}
+.list .item .title{
+	display: flex;
+	justify-content: space-between;
+}
+.list .item .name{
+	font-size: 16px;
+	font-weight: bold;
+	color: #333;
+}
+.list .item .subinfo{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 12px;
+	color: #aaa;
+	margin-top: 13px;
+	line-height: 22px;
+}
+.list .item .invoice{
+	color: var(--color-blue);
+}
+.list .item .state{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 70px;
+	height: 24px;
+	font-size: 12px;
+	color: #777;
+	background-color: #ddd;
+	border-radius: 100pc 0 0 0;
+	margin-right: -10px;
+}
+.list .item .state:before{
+	content: '';
+	display: inline-block;
+	width: 4px;
+	height: 4px;
+	border-radius: 100%;
+	background-color: #fff;
+	margin-right: 5px;
+}
+.list .item .state.green{
+	color: #fff;
+	background-color: #5bc870;
+}
+.list .item .state.blue{
+	color: #fff;
+	background-color: #3eb6f8;
+}
+.list .item .money{
+	text-align: center;
+	font-size: 16px;
+	color: #FF4D3A;
+	margin-top: 6px;
+}
+.list .item .money:before{
+	content: '¥';
+	display: inline-block;
+	font-size: 10px;
+	transform: translateY(-1px);
+}
+.list .item .money-txt{
+	font-size: 14px;
+}
+.list .item .bottom{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-top: 1px solid #f0f0f0;
+	margin-top: 10px;
+	padding-top: 10px;
+}
+
+/* 筛选器 */
+ax-popup >>> .ax-popup{
+	z-index: 9999 !important;
+}
+.filter-box{
+	--filter-padding-top: 150px;
+	
+	width: 100vw;
+	border-radius: 0 0 16px 16px;
+	padding: 20px;
+	padding-top: 0;
+	background-color: #e2f9ff;
+}
+.filter-box .divider{
+	display: block;
+	height: 20px;
+}
+.filter-box::before{
+	content: '';
+	display: block;
+	height: var(--filter-padding-top);
+}
+.filter-box .filter-form{
+	padding: 5px 0;
+	border-radius: 16px 16px 0 0;
+	background-color: #fff;
+}
+.filter-box .cell{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 40px;
+	font-size: 14px;
+	color: #2b303a;
+}
+.filter-box .cell .lable{
+	padding-left: 10px;
+}
+.filter-box .cell .content{
+	flex: 1;
+	margin-left: 20px;
+	text-align: right;
+	padding-right: 5px;
+}
+.filter-box .cell .content .icon{
+	color: #aaa;
+	margin-left: 5px;
+}
+.filter-box .fast{
+	padding: 5px 0;
+	border-radius: 0 0 16px 16px;
+	background-color: #fff;
+	margin-top: 10px;
+}
+.filter-box .shortcut-list{
+	display: grid;
+	grid-template-columns: 1fr 1fr 1fr 1fr;
+	gap: 10px;
+	padding: 0 10px;
+	margin-bottom: 10px;
+}
+.filter-box .shortcut{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 30px;
+	font-size: 14px;
+	color: #2b303a;
+	background-color: #f2f8ff;
+}
+.filter-box .submit{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 50px;
+	border-radius: 8px;
+	font-size: 14px;
+	color: #2b303a;
+	margin-top: 30px;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}
+.filter-box .submit::after{
+	content: unset;
+	display: none;
+}
+
+
+.loadmore{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 50px;
+	color: #aaa;
+	font-size: 14px;
+}
+.loadmore .icon{
+	margin-right: 5px;
+}
+
+.empty{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	border-radius: 16px;
+	background-color: #fff;
+	width: 100%;
+	height: 100%;
+	font-size: 14px;
+	color: #aaa;
+	box-shadow: 0 0 20px rgba(0, 0, 0, 0.05);
+}
+.empty .icon{
+	font-size: 20vw;
+	transform: translateX(5%);
+	margin-bottom: 10px;
+	color: #ccc;
+}

+ 214 - 0
pages/order/order.vue

@@ -0,0 +1,214 @@
+<template>
+	<ax-body @init="initBody" blank="0">
+		<view class="body">
+			<view class="app-flex c-between top">
+				<view class="tabs">
+					<view v-for="(item,index) in tabs.data" :key="index" @click="tabs.index=index" 
+					class="tab" :class="{active:tabs.index==index}">{{item.name}}</view>
+				</view>
+				<view><text @click="openFilter()" class="ax-iconline i-setting filter-icon"></text></view>
+			</view>
+			<view class="list app-hide-scrollbar">
+				<view v-for="(item,index) in orders.data" :key="index" class="item" @click="toOrderDeile(item)">
+					<view class="title">
+						<view class="name">{{item.params.stationName}}</view>
+						<view class="state" :class="[getSates(item).color]">{{getSates(item).name}}</view>
+					</view>
+					<view class="subinfo">
+						<view>
+							<view>订单时间: {{item.createTime}}</view>
+							<view>终端名称:  {{item.params.deviceName}}</view>
+						</view>
+						<view>
+							<view @click.stop="customerService()" class="invoice">开发票</view>
+						</view>
+					</view>
+					<view class="bottom">
+						<view class="money-txt">充电费用:</view>
+						<view class="money">{{item.realCost.toFixed(4) || ''}}</view>
+					</view>
+				</view>
+				<view v-if="orders.data.length==0" class="empty">
+					<icon class="ax-iconblock i-meiyou icon"></icon>
+					<view>暂无数据</view>
+				</view>
+				<view v-if="orders.total>orders.data.length" @click="loadData(true)" class="loadmore"><text>点击加载更多</text></view>
+			</view>
+			<!-- 筛选查询 -->
+			<ax-popup ref="filter" position="top" maskType="black" maskEnable maskClose>
+				<view class="filter-box" :style="{'--filter-padding-top':`${bodyTop+60}px`}">
+					<view class="divider"></view>
+					<view class="filter-form">
+						<view class="cell">
+							<view class="lable">开始时间</view>
+							<picker @change="onChange('start',$event)" :value="filter.start" class="content" mode="date">
+								<text>{{filter.start}}</text>
+								<text class="ax-iconline i-arrow-right icon"></text>
+							</picker>
+						</view>
+						<view class="cell">
+							<view class="lable">结束时间</view>
+							<picker @change="onChange('end',$event)" :value="filter.end" class="content" mode="date">
+								<text>{{filter.end}}</text>
+								<text class="ax-iconline i-arrow-right icon"></text>
+							</picker>
+						</view>
+					</view>
+					<view class="fast">
+						<view class="cell">
+							<view class="lable">快速设定</view>
+						</view>
+						<view class="shortcut-list">
+							<view v-for="(item,index) in shortcuts" :key="index" @click="shortcut(item)" class="shortcut">{{item.name}}</view>
+						</view>
+					</view>
+					<view @click="submit()" class="submit">确认查询</view>
+				</view>
+			</ax-popup>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad() {
+			this.shortcut({code:'currentMonth'});
+			this.loadData();
+		},
+		data() {
+			return {
+				bodyTop: 0,
+				tabs:{
+					index: 0,
+					data:[{name:'全部订单',type:-1},{name:'进行中',type:1},{name:'已完成',type:2}]
+				},
+				shortcuts:[
+					{name:'近7天',code:'7day'},
+					{name:'近30天',code:'30day'},
+					{name:'近三月',code:'3months'},
+					{name:'本月份',code:'currentMonth'},
+				],
+				orders:{
+					total: 0,
+					data:[],
+				},
+				filter:{
+					start: '',
+					end: '',
+				},
+				formSubmitPara : {//提交的参数信息
+					startDate: '',
+					endDate: '',
+					pageNum : 1,
+					pageSize : 10,
+					type:-1,//全部订单
+				}
+			}
+		},
+		watch:{
+			"tabs.index":function(){
+				this.loadData();
+			}
+		},
+		methods: {
+			initBody(data){
+				this.bodyTop = data.top;
+			},
+			shortcut(item){
+				const now = new Date();
+				const format = this.$app.date.format;
+				switch (item.code){
+					case '7day':
+						now.setDate(now.getDate()-7);
+						this.filter.start = format('yyyy-MM-dd',now);
+						this.filter.end = this.$app.date.format('yyyy-MM-dd');
+					break;
+					case '30day':
+						now.setDate(now.getDate()-30);
+						this.filter.start = format('yyyy-MM-dd',now);
+						this.filter.end = this.$app.date.format('yyyy-MM-dd');
+					break;
+					case '3months':
+						this.filter.start = format('yyyy-MM-dd',new Date(now.getFullYear(),now.getMonth()-3,1));
+						this.filter.end = format('yyyy-MM-dd',new Date(now.getFullYear(),now.getMonth()+1,0));
+					break;
+					case 'currentMonth':
+						this.filter.start = format('yyyy-MM-dd',new Date(now.getFullYear(),now.getMonth(),1));
+						this.filter.end = format('yyyy-MM-dd',new Date(now.getFullYear(),now.getMonth()+1,0));
+					break;
+				}
+			},
+			openFilter(){
+				this.$refs.filter.open();
+			},
+			submit(){
+				console.log(this.filter);
+				this.formSubmitPara.startDate = this.filter.start;
+				this.formSubmitPara.endDate = this.filter.end;
+				this.loadData();
+				this.$refs.filter.close();
+			},
+			onChange(name,e){
+				this.filter[name] = e.detail.value;
+			},
+			loadData(append){
+				this.formSubmitPara.type = this.tabs.data[this.tabs.index].type;
+				if(append){
+					//点击加载更多的调用
+					this.formSubmitPara.pageNum = this.formSubmitPara.pageNum + 1;
+				}else{
+					this.formSubmitPara.pageNum = 0;
+					this.orders.data =[];
+					this.orders.total = 0;
+				}
+				this.$api.base("post","/chargeApi/queryOrderList",this.formSubmitPara,{}).then(res=>{
+					console.log("订单列表:",res)
+					this.orders.data = this.orders.data.concat(res.table.rows);
+					this.orders.total = res.table.total;
+				})
+			},
+			//映射状态信息
+			getSates(item){
+				var obj = {color:"",name:"未知"};
+				if(item.status == 0){
+					obj.color = "";
+					obj.name = "待充电";
+				}else if(item.status == 1){
+					obj.color = "green";
+					obj.name = "充电中";
+				}else if(item.status == 2){
+					obj.color = "green";
+					obj.name = "结算中";
+				}else if(item.status == 3){
+					obj.color = "blue";
+					obj.name = "已完成";
+				}else if(item.status == 5){
+					obj.color = "blue";
+					obj.name = "订单取消";
+				}
+				return obj;
+			},
+			toOrderDeile(item){
+				if(item.status == 0 || item.status == 1){
+					//有充电中的订单,点击时跳转到充电中页面进行查看
+					this.$app.url.goto('/pages/charging/charging?orderId='+item.id+"&deviceId="+item.deviceId,true);
+				}else{
+					this.$app.url.goto('/pages/order-detail/order-detail?orderId='+item.id);
+				}
+				
+			},
+			// 打开客服
+			customerService(){
+				const cs = this.$config.customerService;
+				this.$app.act.customerService(cs.id,cs.url).catch(err=>{
+					console.log(err);
+					this.$app.popup.alert('客服中心失联啦,请联系管理员!');
+				});
+			},
+		}
+	}
+</script>
+
+<style scoped>
+@import url("order.css");
+</style>

+ 100 - 0
pages/recharge-log/recharge-log.css

@@ -0,0 +1,100 @@
+ax-body >>> .ax-body{
+	background-color: #F5F7FB;
+}
+>>> .ax-custom-title{
+	background-color: #fff;
+}
+.page-background{
+	display: block;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.body{
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	padding: 10px 0;
+	overflow: auto;
+	position: relative;
+	z-index: 1;
+}
+
+.list .item + .item{
+	margin-top: 10px;
+}
+.list .item{
+	display: block;
+	background-color: #fff;
+	border-radius: 10px;
+	padding: 20px 10px;
+}
+.list .item .title{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-bottom: 1px solid #f0f0f0;
+	padding-bottom: 10px;
+	margin-bottom: 10px;
+}
+.list .item .title .name{
+	font-size: 16px;
+	font-weight: bold;
+}
+.list .item .title .state{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 74px;
+	height: 22px;
+	font-size: 14px;
+	color: #fff;
+	background-color: #4EDC86;
+	border-radius: 100px 0 0 0;
+	margin-right: -10px;
+}
+.list .item .title .state:before{
+	content: '';
+	display: inline-block;
+	width: 4px;
+	height: 4px;
+	border-radius: 100%;
+	background-color: #fff;
+	margin-right: 5px;
+}
+.list .item .cell{
+	font-size: 12px;
+	color: #aaa;
+	line-height: 26px;
+}
+
+.list .loadmore{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 12px;
+	color: #aaa;
+	height: 60px;
+}
+
+.nothing{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	background-color: #fff;
+	border-radius: 16px;
+	box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+	font-size: 14px;
+	color: #ccc;
+}
+.nothing .icon{
+	display: block;
+	width: 25vw;
+	margin-bottom: 10px;
+}

+ 79 - 0
pages/recharge-log/recharge-log.vue

@@ -0,0 +1,79 @@
+<template>
+	<ax-body>
+		<view class="body app-hide-scrollbar">
+			<view v-if="logs.data.length" class="list">
+				<view v-for="(item,index) in logs.data" :key="index" class="item">
+					<view class="title">
+						<view class="name">{{item.params.levelName}}</view>
+						<view class="state" :style="{backgroundColor:item.orderStatus==2?'':'#FF5D50'}">{{getStatusTips(item.orderStatus)}}</view>
+					</view>
+					<view class="cell">
+						<view>订单编号:{{item.outTradeNo}}</view>
+						<view>购券时间:{{item.payTime}}</view>
+						<view>实付金额:{{item.orderMoney}}元</view>
+						<view v-if="item.orderStatus!=2">退款时间:{{item.refundTime}}</view>
+						<view v-if="item.orderStatus!=2">退款金额:{{item.refundMoney}}元</view>
+					</view>
+				</view>
+				<view v-if="logs.total>logs.data.length" @click="loadData(true)" class="loadmore"><text>点击加载更多数据</text></view>
+			</view>
+			<view v-else class="nothing">
+				<image src="@/static/img/empty.svg" mode="widthFix" class="icon"></image>
+				<view>暂无可展示数据</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad() {
+			this.loadData();
+		},
+		data() {
+			return {
+				logs:{
+					total: 0,
+					data:[],
+				},
+				search_data:{
+					pageNum:1,
+					pageSize:10,
+					orderByColumn:'payTime',
+					isAsc:'desc'
+				}
+			}
+		},
+		methods: {
+			getStatusTips(status){
+				if(status==2){
+					return "已到账"
+				}else if(status==4){
+					return "已退款"
+				}else if(status==5){
+					return "退款中"
+				}
+			},
+			loadData(append){
+				if(append){
+					this.search_data.pageNum++
+					// 追加模式,由loadmore触发
+					this.$api.base("post","/orderApi/getOrderList",this.search_data,{}).then(res=>{
+						this.logs.data = this.logs.data.concat(res.orderLsit.rows);
+					})
+				}else{
+					this.search_data.pageNum = 1
+					// 初始化模式,一般由onLoad触发
+					this.$api.base("post","/orderApi/getOrderList",this.search_data,{}).then(res=>{
+						this.logs.total = res.orderLsit.total
+						this.logs.data = res.orderLsit.rows
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url("recharge-log.css");
+</style>

+ 189 - 0
pages/search/search.css

@@ -0,0 +1,189 @@
+ax-body{
+	display: block;
+	height: 100%;
+	background: #F6FAFF;
+}
+.page-background{
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 0;
+}
+.page-background image{
+	display: block;
+	width: 100%;
+}
+
+.body{
+	display: flex;
+	flex-direction: column;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+
+/* 搜索框 */
+.search-box{
+	display: flex;
+	align-items: center;
+	height: 50px;
+	border-radius: 10px;
+	background-color: #fff;
+	font-size: 14px;
+	color: #2b303a;
+	padding: 0 10px;
+	margin: 0 10px;
+}
+.search-box .input{
+	flex: 1;
+	height: 50px;
+	margin: 0 10px;
+}
+.search-box .icon{
+	font-weight: bold;
+}
+.search-box .clear{
+	margin: 0 10px;
+	color: #f44033;
+}
+.search-box .txt{
+	transform: translateY(-1px);
+}
+
+/* 搜索历史 */
+.history{
+	margin-top: 20px;
+}
+.history > .title{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 10px;
+}
+.history > .title > .txt{
+	font-size: 16px;
+	color: #2b303a;
+}
+.history > .title > .icon{
+	font-size: 18px;
+}
+.history > .list{
+	margin-top: 10px;
+	padding: 0 10px;
+	overflow: auto;
+}
+.history > .list .wrap{
+	white-space: nowrap;
+}
+.history > .list .item{
+	display: inline-flex;
+	align-items: center;
+	height: 30px;
+	padding: 0px 15px;
+	font-size: 14px;
+	color: #2b303a;
+	background-color: #fff;
+	border-radius: 100pc;
+	box-shadow: 0 0 5px rgba(0, 0, 0, 0.05);
+}
+.history > .list .item + .item{
+	margin-left: 10px;
+}
+
+/* 搜索结果 */
+.result{
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	margin-top: 20px;
+}
+.result > .title{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 10px;
+}
+.result > .title > .total{
+	font-size: 14px;
+	color: #aaa;
+}
+.result > .list{
+	flex: 1;
+	margin-top: 10px;
+	position: relative;
+}
+.result > .list > .wrap{
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	overflow: auto;
+	padding: 0 10px;
+}
+.result > .list .site{
+	background-color: #fff;
+	border-radius: 8px;
+	padding: 20px;
+	box-shadow: 0 0 10px rgba(0, 0, 0, 0.05);
+}
+.result > .list .site + .site{
+	margin-top: 10px;
+}
+.result > .list .site .name{
+	font-size: 16px;
+	font-weight: bold;
+	color: #2b303a;
+}
+.result > .list .site .aux{
+	font-size: 12px;
+	color: #aaa;
+	margin-top: 10px;
+}
+.result > .list .site .info{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	margin-top: 20px;
+	font-size: 12px;
+}
+.result > .list .site .info .sta > .val{
+	margin: 0 5px;
+	font-size: 16px;
+	font-weight: bold;
+	color: #222;
+}
+.result > .list .site .info .sta > .unit{
+	color: #aaa;
+}
+.result > .list .site .info .sta > .green{
+	color: #00aa3a;
+}
+.result > .list .site .info .sta > .blue{
+	color: #3071ff;
+}
+.result > .list .site .info .sta > .orange{
+	color: #fb9430;
+}
+
+.empty{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	font-size: 14px;
+	height: calc(100% - 10px);
+	border-radius: 8px;
+	background-color: #fff;
+	box-shadow: 0 0 10px rgba(0, 0, 0, 0.05);
+	color: #ccc;
+}
+.empty .icon{
+	font-size: 20vw;
+	margin-bottom: 10px;
+	transform: translateX(5%);
+}
+.empty .txt{
+	color: #aaa;
+}

+ 118 - 0
pages/search/search.vue

@@ -0,0 +1,118 @@
+<template>
+	<ax-body blank="0">
+		<view class="page-background"><image src="@/static/img/my-bg.svg" mode="widthFix"></image></view>
+		<view class="body">
+			<view class="search-box">
+				<icon class="ax-iconline i-search icon"></icon>
+				<input v-model="search" placeholder="输入目的地/电站名" placeholder-class="app-placeholder" class="input"/>
+				<view v-if="search.length" @click="search=''" class="clear"><icon class="ax-iconblock i-cuowu"></icon></view>
+				<text @click="query()" class="txt">搜索</text>
+			</view>
+			<!-- 搜索历史 -->
+			<view v-if="histories.length" class="history">
+				<view class="title">
+					<text class="txt">搜索历史</text>
+					<icon @click="clean()" class="ax-iconline i-delete icon"></icon>
+				</view>
+				<view class="list app-hide-scrollbar">
+					<view class="wrap"><view v-for="(item,index) in histories" :key="index" @click="setSearch(item)" class="item">{{item}}</view></view>
+				</view>
+			</view>
+			<!-- 搜索结果 -->
+			<view class="result">
+				<view class="title">
+					<text class="txt">搜索结果</text>
+					<text class="total">共计 {{result.length}} 条</text>
+				</view>
+				<view class="list">
+					<view class="wrap app-hide-scrollbar">
+						<view v-for="(item,index) in result" :key="index" class="site" @click="gotoSiteDetail(item)" >
+							<view class="name">{{item.name}}</view>
+							<!-- <view class="aux" v-html="item.parkTips"></view> -->
+							<view class="aux">充电减免2小时停车费,超出时长部分计时收费</view>
+							<view class="info">
+								<view class="sta"><text class="txt green">快</text><text class="val">{{item.params.emptyFast}}</text><text class="unit">/{{item.params.totalFast}}</text></view>
+								<view class="sta"><text class="txt blue">慢</text><text class="val">{{item.params.emptySlow}}</text><text class="unit">/{{item.params.totalSlow}}</text></view>
+								<view class="sta"><text class="txt orange">距离</text><text class="val">{{item.params.rangeShow}}</text></view>
+							</view>
+						</view>
+						<view v-if="!result.length" class="empty">
+							<icon class="ax-iconblock i-meiyou icon"></icon>
+							<text class="txt">暂无数据展示</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad() {
+			this.histories = this.$app.storage.get('history-search') || [];
+		},
+		data() {
+			return {
+				search: "",
+				histories:[],
+				result:[]
+			}
+		},
+		methods: {
+			convertBdToTx(lng, lat) {
+			    // 百度坐标系(BD09)转火星坐标系(GCJ-02,即腾讯地图使用的坐标系)  
+			    // 这里的转换公式是基于经验公式,可能存在一定的误差  
+			    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
+			    let x = lng - 0.0065;  
+			    let y = lat - 0.006;  
+			    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);  
+			    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);  
+			    let lngs = z * Math.cos(theta);  
+			    let lats = z * Math.sin(theta);  
+			    return { lng: lngs, lat: lats };  
+			},
+			gotoSiteDetail(item){
+				this.$app.url.goto('/pages/site/site?item='+JSON.stringify(item));
+			},
+			query(){
+				const history = Array.from(new Set([this.search].concat(this.histories)));
+				this.histories = history;
+				this.$app.storage.set('history-search',history);
+				this.result = [{},{},{},{},{}];
+				let location = this.$app.storage.get('USER_LOCATION')
+				let lng = ""
+				let lat = ""
+				if(location&&location.split(",").length==2){
+					lng = location.split(",")[0]
+					lat = location.split(",")[1]
+				}
+				var key = this.search
+				this.$api.base("post","/chargeApi/getStations",{order:"0",lng,lat,key},{}).then(res=>{
+					res.stationList.forEach(i=>{
+						var txPoint = this.convertBdToTx(i.lng,i.lat)
+						i.lng = txPoint.lng
+						i.lat = txPoint.lat
+					})
+					this.result = res.stationList
+				})
+			},
+			setSearch(item){
+				this.search = item;
+				this.query();
+			},
+			clean(){
+				this.$app.popup.confirm('确定是否删除所有历史搜索纪录?','清空历史').then(confirm=>{
+					if(confirm){
+						this.histories = [];
+						this.$app.storage.remove('history-search');
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url("search.css");
+</style>

+ 298 - 0
pages/site-more/site-more.css

@@ -0,0 +1,298 @@
+.page-background{
+	display: block;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.body{
+	width: 100%;
+	height: 100%;
+	position: relative;
+	z-index: 1;
+}
+
+.title{
+	font-size: 16px;
+	font-weight: bold;
+}
+.subtitle{
+	font-size: 12px;
+	color: #aaa;
+	margin-top: 10px;
+}
+
+/* 面包屑 */
+.crumbs{
+	display: flex;
+	align-items: center;
+	height: 60px;
+	border-radius: 8px;
+	background-color: #fff;
+	margin: 15px 0;
+}
+.crumbs .item{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.crumbs .item .value{
+	font-size: 16px;
+	font-weight: bold;
+	color: #3EB6F8;
+}
+.crumbs .item .name{
+	font-size: 12px;
+}
+
+/* 切换 */
+.switch{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	width: 100%;
+	height: 44px;
+	background-color: #fff;
+	border-radius: 100pc;
+	position: relative;
+}
+.switch .bg{
+	width: 50%;
+	height: 40px;
+	background-color: #3EB6F8;
+	border-radius: 100pc;
+	position: absolute;
+	top: 2px;
+	left: 2px;
+	transition: all 200ms ease;
+}
+.switch .contet{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	width: 100%;
+}
+.switch .text{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 14px;
+	position: relative;
+	z-index: 2;
+	transition: color 200ms ease;
+}
+.switch .text:first-child,
+.switch.another .text:last-child{
+	color: #fff;
+}
+.switch.another .text:first-child{
+	color: inherit;
+}
+.switch.another .bg{
+	transform: translateX(100%);
+}
+.list{
+	height: var(--list-height);
+	overflow: auto;
+	padding: 10px 0;
+}
+.list::-webkit-scrollbar{
+	display: none;
+}
+
+/* 设备列表 */
+.terminals{
+	margin-top: 10px;
+}
+.terminal-item{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	background-color: #fff;
+	border-radius: 8px;
+	height: 78px;
+	padding: 10px;
+}
+.terminal-item+.terminal-item{
+	margin-top: 10px;
+}
+.terminal-item .state{
+	display: flex;
+	width: 58px;
+	height: 58px;
+	border-radius: 100%;
+	margin-right: 10px;
+	padding: 4px;
+	background-image: linear-gradient(to right, #ccc 0%, #ccc 35.8%, #c7cccf 65.9%, #e8e8e8 80.4%, #c8c8c8 100%);
+}
+.terminal-item .state .cake{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	border-radius: 100%;
+	background-color: #eee;
+}
+.terminal-item .state .icon{
+	display: block;
+	width: 20px;
+	height: 20px;
+}
+.terminal-item .state .name{
+	font-size: 12px;
+	margin-top: 3px;
+}
+.terminal-item .info{
+	flex: 1;
+}
+.terminal-item .info .name{
+	font-size: 14px;
+	font-weight: bold;
+	margin-bottom: 5px;
+}
+.terminal-item .info .subinfo{
+	font-size: 12px;
+	color: #aaa;
+}
+.terminal-item .state.green{
+	background-image: linear-gradient(to right, #73e6a0 0%, #3eff8a 30%, #4edc86 60%, #b4ffd1 75%, #6be49a 100%);
+}
+.terminal-item .state.green .cake{
+	background-color: #ECFFF4;
+}
+.terminal-item .state.blue{
+	background-image: linear-gradient(to right, #3eb6f8 0%, #81d8ff 35%, #75ceff 65%, #94e2ff 80%, #2cb5ff 100%);
+}
+.terminal-item .state.blue .cake{
+	background-color: #E9F9FF;
+}
+.terminal-item .state.orange{
+	background-image: linear-gradient(to right, #FFE9BC 0%, #FFD070 35%, #FFD887 65%, #FFD887 80%, #FFC246 100%);
+}
+.terminal-item .state.orange .cake{
+	background-color: #FFF8EB;
+}
+.terminal-item .state.err{
+	background-image: linear-gradient(to right, #FFC4C4 0%, #F77474 35%, #FFAAAA 65%, #FFAAAA 80%, #F55B5B 100%);
+}
+.terminal-item .state.err .cake{
+	background-color: #FFE9E9;
+}
+
+/* 价格列表 */
+.price{
+	padding: 10px;
+	background-color: #fff;
+	border-radius: 8px;
+	border: 1px solid transparent;
+	position: relative;
+	overflow: hidden;
+}
+.price + .price{
+	margin-top: 10px;
+}
+.price .header{
+	display: flex;
+	align-items: center;
+}
+.price .header .icon{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 20px;
+	height: 20px;
+	font-size: 14px;
+	color: #fff;
+	border-radius: 4px;
+	background-color: #ccc;
+	margin-right: 14px;
+}
+.price .header .value{
+	font-size: 14px;
+	font-weight: bold;
+}
+.price .info{
+	background-color: #F6F6F6;
+	border-radius: 8px;
+	padding: 10px;
+	font-size: 14px;
+	margin: 10px 0;
+}
+.price .info .row{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 30px;
+}
+.price .info .row .unit{
+	color: #aaa;
+	margin-left: 5px;
+}
+.price .footer{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+}
+.price.active{
+	border-color: #47B9F8;
+}
+.price.active .footer,
+.price.active .header{
+	color: #47B9F8;
+}
+.price.active .header .icon{
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}
+.price.active::after{
+	content: '当前时段';
+	display: flex;
+	width: 76px;
+	height: 30px;
+	font-size: 14px;
+	align-items: center;
+	justify-content: center;
+	color: #fff;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+	position: absolute;
+	top: 0;
+	right: 0;
+	border-radius: 0 0 0 8px;
+	text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.1);
+}
+
+.price.active .row .name{
+	font-weight: bolder;
+}
+.price.active .row .value,.price.active .row .unit{
+	font-size: 18px;
+	font-weight: bolder;
+	color: #FF5D50;
+}
+
+/* 底部 */
+.underside{
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	z-index: 10;
+	padding: 10px;
+	padding-bottom: 0;
+}
+.underside .scan{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 50px;
+	border-radius: 8px;
+	font-size: 14px;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}

+ 233 - 0
pages/site-more/site-more.vue

@@ -0,0 +1,233 @@
+<template>
+	<ax-body>
+		<image src="@/static/img/page-bg01.png" class="page-background"></image>
+		<view class="body" :style="{'--list-height':`${listHeight}px`}">
+			<view class="title">{{stationInfo.name}}</view>
+			<!-- <view class="subtitle" v-html="stationInfo.parkTips"></view> -->
+			<view class="subtitle">充电减免2小时停车费,超出时长部分计时收费</view>
+			<!-- 面包屑 -->
+			<view class="crumbs">
+				<view class="item"><view class="value">{{getStatusNum(1)}}</view><view class="name">空闲</view></view>
+				<view class="item"><view class="value">{{getStatusNum(2)}}</view><view class="name">占用</view></view>
+				<view class="item"><view class="value">{{getStatusNum(0)}}</view><view class="name">离线</view></view>
+			</view>
+			<!-- 数据切换 -->
+			<view id="switch" class="switch" @click="another = !another" :class="{another}">
+				<view class="contet">
+					<view class="text">电站价格</view>
+					<view class="text">充电终端</view>
+				</view>
+				<view class="bg"></view>
+			</view>
+			<!-- 终端列表 -->
+			<view v-if="another" class="terminals list">
+				<view v-for="(item,index) in deviceList" :key="index" @click="goTerminal(item)" class="terminal-item">
+					<view class="state" :class="[getSatesObj(item).color]">
+						<view class="cake">
+							<image src="@/static/img/site-icon01.svg" class="icon"></image>
+							<view class="name">{{getSatesObj(item).name}}</view>
+						</view>
+					</view>
+					<view class="info">
+						<view class="name">{{item.deviceName}}</view>
+						<view class="subinfo">电类分类:{{getdeviceTypeName(item.eType)}}</view>
+						<view class="subinfo">终端编号:{{item.deviceNo}}</view>
+					</view>
+				</view>
+			</view>
+			<!-- 价格列表 -->
+			<view v-else class="prices list">
+				<view v-for="(item,index) in prices.data" :key="index" class="price" :class="{active:prices.index==index}">
+					<view class="header">
+						<view class="icon">{{getPriceLable(item.timeType)}}</view>
+						<view class="value">{{item.time}}</view>
+					</view>
+					<view class="info">
+						<view class="row">
+							<view class="name">抵扣券电价</view>
+							<view ><text class="value" >{{(item.price).toFixed(4)}}</text><text class="unit" >{{item.unit}}</text></view>
+						</view>
+						<!-- <view class="row">
+							<view class="name">服务费</view>
+							<view><text class="value">{{(item.addServicePrice+item.servicePrice).toFixed(4)}}</text><text class="unit">{{item.unit}}</text></view>
+						</view> -->
+					</view>
+					<!-- <view class="footer">
+						<view>合计充电价</view>
+						<view>{{item.price.toFixed(4)}} {{item.unit}}</view>
+					</view> -->
+				</view>
+			</view>
+		</view>
+		<view id="underside" class="underside">
+			<view class="scan"  @click="sacn()">扫码充电</view>
+			<ax-ios-indicator min="10"></ax-ios-indicator>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad(opts) {
+			this.another = !Boolean(opts.show);
+			this.getStationsInfo(opts.stationId);
+		},
+		mounted() {
+			this.$app.act.selectorQuery(this,'#switch,#underside',true).then(res=>{
+				const s = res.find(i=>i.id=='switch');
+				const u = res.find(i=>i.id=='underside');
+				const w = uni.getWindowInfo();
+				this.listHeight = w.windowHeight - s.top - s.height - u.height;
+			});
+		},
+		data() {
+			return {
+				another: false,
+				listHeight: 0,
+				prices:{
+					index: 0,
+					data: []
+				},
+				stationInfo : {},
+				deviceList: [],//该站点桩列表
+				nowPriceTime: {},//当前费用时段信息
+			}
+		},
+		methods: {
+			getStationsInfo(stationId){
+				if(!stationId){
+					return;
+				}
+				this.$api.base("post","/chargeApi/getStationsInfo",{"stationId":stationId},{}).then(res=>{
+					this.deviceList = res.devices;
+					this.prices.data = res.prices;
+					this.nowPriceTime = res.nowPriceTime;
+					this.stationInfo = res.stationInfo;
+					//当前的价格时间断的下标
+					for(var i = 0; i < this.prices.data.length; i++){
+						if(this.nowPriceTime.id == this.prices.data[i].id){
+							this.prices.index = i;
+							break
+						}
+					}
+				})
+			},
+			//获取桩状态的数量
+			getStatusNum(status){
+				var num = 0;
+				//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+				for(var i = 0; i < this.deviceList.length; i++){
+					var device = this.deviceList[i];
+					if(status == 2){
+						if(device.deviceStatus == 2 || device.deviceStatus == 3 || device.deviceStatus == 4){
+							num++;
+							continue;
+						}
+					}
+					if(device.deviceStatus == status){
+						num++;
+					}
+				}
+				return num;
+			},
+			getSatesObj(item){
+				//{name:'离线',color:'grey'},{name:'空闲',color:'green'},{name:'占用',color:'blue'}
+				var obj = {};
+				if(item.deviceStatus == 2 || item.deviceStatus == 4){
+					obj = {name:'占用',color:'blue'};
+				}else if(item.deviceStatus == 3){
+					obj = {name:'充电中',color:'orange'};
+				}else if(item.deviceStatus == 0){
+					obj = {name:'离线',color:'grey'};
+				}else if(item.deviceStatus == 1){
+					obj = {name:'空闲',color:'green'};
+				}else if(item.deviceStatus == 255){
+					obj = {name:'故障',color:'err'};
+				}
+				return obj;
+			},
+			//获取充电桩设备类型
+			getdeviceTypeName(type){
+				//电类型 1:直流设备;2:交流设备3:交直流一体设备;4:无线设备;5:其他
+				var str = "";
+				switch(type){
+					case "1":
+						str = "直流设备";
+						break
+					case "2":
+						str = "交流设备";
+						break
+					case "3":
+						str = "交直流一体设备";
+						break
+					case "4":
+						str = "无线设备";
+						break
+					case "5":
+						str = "其他";
+						break
+				}
+				return str;
+			},
+			//映射 峰  平  谷
+			getPriceLable(type){
+				//时间类型 1 谷 2 平 3 峰
+				var str = "";
+				switch (type){
+					case 1:
+						str = "谷";
+						break;
+					case 2:
+						str = "平";
+						break;
+					case 3:
+						str = "峰";
+						break;
+				}
+				return str;
+			},
+			settitle(title){
+				uni.setNavigationBarTitle({title});
+			},
+			// 跳转充电终端
+			goTerminal(item){
+				//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+				if(item.deviceStatus == 0 || item.deviceStatus == 255 ){
+					return;
+				}
+				this.$app.url.goto('/pages/terminal/terminal?deviceId='+item.id+"&deviceStatus="+item.deviceStatus);
+			},
+			//扫一扫
+			sacn(){
+				this.$app.act.scan().then(res=>{
+					var paramObj = this.getUrlParams(res.result);
+					if(!paramObj || !paramObj.connectorCode){
+						this.$app.popup.alert("二维码不正确。","温馨提示!");
+						return;
+					}
+					this.getDeviceInfo(paramObj.connectorCode);
+				})
+			},
+			getUrlParams(url) {
+			  const paramsRegex = /[?&]+([^=&]+)=([^&]*)/gi;
+			  const params = {};
+			  let match;
+			  while (match = paramsRegex.exec(url)) {
+			    params[match[1]] = match[2];
+			  }
+			  return params;
+			},
+			//通过充电桩编码(sn)获取设备详情
+			getDeviceInfo(sn){
+				this.$api.base("post","/chargeApi/checkDevicesBySn",{"sn":sn},{}).then(res=>{
+					console.log("设备信息:",res)
+					this.goTerminal(res.device);
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url("site-more.css");
+</style>

+ 337 - 0
pages/site/site.css

@@ -0,0 +1,337 @@
+@font-face {
+  font-family: "ysbth";
+  src: url('ysbth2.ttf') format('truetype');
+}
+
+ax-body >>> .ax-body{
+	background-image: linear-gradient(to bottom,#A1DEFF,rgba(209,239,255,0.93) 100px,rgba(209,239,255,0) 258px,transparent);
+	background-color: #F6FAFF;
+}
+.body{
+	height: 100%;
+	color: #2B303A;
+	overflow: auto;
+	padding-bottom: 74px;
+}
+.main{
+	background-color: #fff;
+	border-radius: 8px 8px 0 0;
+	margin-top: -8px;
+	position: relative;
+	z-index: 1;
+	padding: 10px;
+	overflow: auto;
+}
+
+.top{
+	--right-size: 40vw;
+	display: block;
+	padding-right: var(--right-size);
+	position: relative;
+}
+.top > .left{
+	flex: 1;
+}
+.top .site-name{
+	font-size: 18px;
+	font-weight: bold;
+}
+.top .site-parkade{
+	font-size: 12px;
+	line-height: 18px;
+	margin-top: 10px;
+	color: #aaa;
+}
+.top .logo{
+	position: absolute;
+	top: 0;
+	right: 0;
+	width: var(--right-size);
+}
+.top .site-base{
+	margin-bottom: 10px;
+}
+
+.location{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	position: relative;
+	overflow: hidden;
+	border-radius: 8px;
+	height: 70px;
+	padding: 10px;
+	background: linear-gradient(to bottom,#E5FEFF,rgba(143,246,249,0));
+	box-shadow: 0 3px 6px rgba(255, 255, 255, 0.16) inset;
+}
+.location .info{
+	position: relative;
+	z-index: 1;
+}
+.location .info + .info{
+	margin-left: 20px;
+}
+.location .name{
+	font-size: 14px;
+}
+.location .subname{
+	display: block;
+	max-width: 35vw;
+	font-size: 11px;
+	color: #aaa;
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+.location .txt{
+	font-size: 12px;
+}
+.location .bg{
+	display: block;
+	width: 100%;
+	height: 70px;
+	position: absolute;
+	top: 0;
+	left: 0;
+}
+.location .icon{
+	width: 20px;
+	height: 20px;
+}
+
+.card{
+	display: block;
+	padding: 10px;
+	background-color: #fff;
+}
+.card + .card{
+	margin-top: 10px;
+}
+.card .card-title{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 40px;
+	font-size: 16px;
+	font-weight: bold;
+}
+.card .card-title .more{
+	display: flex;
+	align-items: center;
+	font-size: 12px;
+	color: #aaa;
+	font-weight: normal;
+}
+.card .card-title .more .icon{
+	margin-left: 5px;
+}
+
+.info-cell{
+	display: flex;
+	align-items: center;
+	height: 32px;
+	font-size: 14px;
+}
+.info-cell .icon{
+	width: 20px;
+	height: 20px;
+	margin-right: 10px;
+}
+
+.current-price{
+	display: flex;
+	height: 60px;
+	border-radius: 8px;
+	overflow: hidden;
+	background-image: linear-gradient(to right,#FEE4C6,rgba(251,235,198,0));
+	margin-top: 10px;
+}
+.price-wrap{
+	display: flex;
+	align-items: center;
+}
+.price-wrap .price{
+	display: flex;
+	align-items: flex-end;
+	font-size: 24px;
+	font-weight: bold;
+	color: #F5531A;
+	margin-left: 10px;
+}
+.price-wrap .price .symbol{
+	display: inline-block;
+	font-size: 12px;
+	color: #F5531A;
+	transform: translateY(-4px);
+}
+.price-wrap .unit{
+	font-size: 12px;
+	color: #aaa;
+	margin-left: 15px;
+}
+
+.bg5{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	position: relative;
+	color: #fff;
+	height: inherit;
+}
+.bg5 > .text{
+	display: inline-block;
+	position: absolute;
+	font-family: 'ysbth';
+	white-space: nowrap;
+	top: 50%;
+	left: 50%;
+	transform: translate(-65%,-50%);
+	font-size: 16px;
+}
+.bg5 > .bg{
+	height: 100%;
+}
+
+.bread{
+	display: flex;
+	align-items: center;
+	height: 60px;
+	background-color: rgba(62, 182, 248, 0.2);
+	border-radius: 8px;
+}
+.bread .bread-item{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	position: relative;
+}
+.bread .bread-item .value{
+	color: #3EB6F8;
+	font-size: 16px;
+	font-weight: bold;
+}
+.bread .bread-item .name{
+	font-size: 12px;
+	margin-top: 2px;
+}
+.bread .bread-item + .bread-item::before{
+	content: '';
+	height: 30px;
+	border-left: 1px solid #3EB6F8;
+	position: absolute;
+	left: 0;
+	top: 50%;
+	transform: translateY(-50%);
+}
+
+.terminals{
+	margin-top: 10px;
+}
+.terminal-item{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	background-color: #F6F6F6;
+	border-radius: 8px;
+	height: 78px;
+	padding: 10px;
+}
+.terminal-item+.terminal-item{
+	margin-top: 10px;
+}
+.terminal-item .state{
+	display: flex;
+	width: 58px;
+	height: 58px;
+	border-radius: 100%;
+	margin-right: 10px;
+	padding: 4px;
+	background-image: linear-gradient(to right, #ccc 0%, #ccc 35.8%, #c7cccf 65.9%, #e8e8e8 80.4%, #c8c8c8 100%);
+}
+.terminal-item .state .cake{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+	border-radius: 100%;
+	background-color: #eee;
+}
+.terminal-item .state .icon{
+	display: block;
+	width: 20px;
+	height: 20px;
+}
+.terminal-item .state .name{
+	font-size: 12px;
+	margin-top: 3px;
+}
+.terminal-item .info{
+	flex: 1;
+}
+.terminal-item .info .name{
+	font-size: 14px;
+	font-weight: bold;
+	margin-bottom: 5px;
+}
+.terminal-item .info .subinfo{
+	font-size: 12px;
+	color: #aaa;
+}
+.terminal-item .state.green{
+	background-image: linear-gradient(to right, #73e6a0 0%, #3eff8a 30%, #4edc86 60%, #b4ffd1 75%, #6be49a 100%);
+}
+.terminal-item .state.green .cake{
+	background-color: #ECFFF4;
+}
+.terminal-item .state.blue{
+	background-image: linear-gradient(to right, #3eb6f8 0%, #81d8ff 35%, #75ceff 65%, #94e2ff 80%, #2cb5ff 100%);
+}
+.terminal-item .state.blue .cake{
+	background-color: #E9F9FF;
+}
+.terminal-item .state.orange{
+	background-image: linear-gradient(to right, #FFE9BC 0%, #FFD070 35%, #FFD887 65%, #FFD887 80%, #FFC246 100%);
+}
+.terminal-item .state.orange .cake{
+	background-color: #FFF8EB;
+}
+.terminal-item .state.err{
+	background-image: linear-gradient(to right, #FFC4C4 0%, #F77474 35%, #FFAAAA 65%, #FFAAAA 80%, #F55B5B 100%);
+}
+.terminal-item .state.err .cake{
+	background-color: #FFE9E9;
+}
+
+
+.footer{
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	display: flex;
+	align-items: center;
+	height: 84px;
+	overflow: hidden;
+	border-radius: 20px 20px 0 0;
+	background-image: linear-gradient(to right,#fee4c6 0%,rgba(255,255,255,0.533) 75%,rgba(255,255,255,0) 100%);
+	background-color: #fff;
+}
+.footer .price-wrap .price{
+	font-size: 20px;
+}
+.scan{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border-radius: 8px;
+	height: 50px;
+	font-size: 14px;
+	color: #2B303A;
+	background-image: linear-gradient(to right,#8FF8FB,#47AEFF);
+	margin: 0 10px;
+}

+ 335 - 0
pages/site/site.vue

@@ -0,0 +1,335 @@
+<template>
+	<ax-body>
+		<view class="body app-hide-scrollbar">
+			<!-- 顶部 -->
+			<view class="top">
+				<view class="site-base">
+					<view class="site-name">{{stationInfo.name}}</view>
+					<view class="site-parkade">充电减免2小时停车费,超出部分按每小时3元计算</view>
+				</view>
+				<view class="location">
+					<view class="info app-flex-one">
+						<view class="name">距离您{{stationInfo.params.rangeShow}}</view>
+						<view class="subname">{{stationInfo.addr}}</view>
+					</view>
+					<view @click="openLocation()" class="info app-flex c-center column">
+						<image src="@/static/img/locate2.svg" class="icon"></image>
+						<view class="txt">导航</view>
+					</view>
+					<image src="@/static/img/site-bg01.png" class="bg"></image>
+				</view>
+				<image src="@/static/img/logo.svg" class="logo" mode="widthFix"></image>
+			</view>
+			<!-- 费用信息 -->
+			<view class="card">
+				<view class="card-title">
+					<text>费用信息</text>
+					<view @click="toPriceAll()" class="more">
+						<text>查看全部</text>
+						<text class="ax ax-iconline i-arrow-right icon"></text>
+					</view>
+				</view>
+				<view class="info-cell">
+					<image src="@/static/img/site-icon02.png" class="icon"></image>
+					<text>当前时段:</text><text>{{stationInfo.params.priceShow}}</text>
+				</view>
+				<view class="info-cell">
+					<image src="@/static/img/site-icon03.png" class="icon"></image>
+					<text>停车参考:</text><text>充电减免2小时停车费</text>
+				</view>
+				<view class="current-price">
+					<view class="bg5">
+						<view class="text">当前价</view>
+						<image src="@/static/img/site-bg05.svg" class="bg" mode="heightFix"></image>
+					</view>
+					<view class="price-wrap">
+						<view class="price">
+							<text class="symbol">¥</text>
+							<text>{{nowPriceTime.price?parseFloat(nowPriceTime.price).toFixed(4):"0.0000"}}</text>
+						</view>
+						<view class="unit">元/度</view>
+					</view>
+				</view>
+			</view>
+			<!-- 充电终端 -->
+			<view class="card">
+				<view class="card-title">
+					<text>充电终端</text>
+					<view @click="toDeiceAll()" class="more">
+						<text>查看全部</text>
+						<text class="ax ax-iconline i-arrow-right icon"></text>
+					</view>
+				</view>
+				<view class="bread">
+					<view class="bread-item"><view class="value">{{getStatusNum(1)}}</view><view class="name">空闲</view></view>
+					<view class="bread-item"><view class="value">{{getStatusNum(2)}}</view><view class="name">占用</view></view>
+					<view class="bread-item"><view class="value">{{getStatusNum(0)}}</view><view class="name">离线</view></view>
+				</view>
+				<view class="terminals">
+					<view v-for="(item,index) in terminals" :key="index" @click="goTerminal(item)" class="terminal-item">
+						<view class="state" :class="[getSatesObj(item).color]">
+							<view class="cake">
+								<image src="@/static/img/site-icon01.svg" class="icon"></image>
+								<view class="name">{{getSatesObj(item).name}}</view>
+							</view>
+						</view>
+						<view class="info">
+							<view class="name">{{item.deviceName}}</view>
+							<view class="subinfo">电类分类:{{getdeviceTypeName(item.eType)}}</view>
+							<view class="subinfo">终端编号:{{item.deviceNo}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- 扫码充电 -->
+			<view class="footer">
+				<view class="bg5">
+					<view class="text">
+						<view>中数电动</view>
+						<view>特惠价</view>
+					</view>
+					<image src="@/static/img/site-bg05.svg" class="bg" mode="heightFix"></image>
+				</view>
+				<view class="price-wrap">
+					<view class="price">
+						<text class="symbol">¥</text>
+						<text>{{nowPriceTime.price?nowPriceTime.price.toFixed(4):"0.0000"}}</text>
+					</view>
+					<view class="unit">{{nowPriceTime.unit}}</view>
+				</view>
+				<view @click="sacn()" class="scan">扫码充电</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+	export default {
+		onLoad: function (option) {
+				console.log(option); //打印出上个页面传递的参数。
+				this.stationInfo = JSON.parse(option.item);
+				if(this.stationInfo.pictures){
+					//添加站点图片
+					var imgArr = this.stationInfo.pictures.split(",");
+					if(imgArr.length > 0){
+						this.tops = imgArr;
+					}
+				}
+				this.getStationsInfo();
+				this.getConfigStationInfo();
+		},
+		mounted() {
+			this.$app.act.selectorQuery(this,'#footer').then(res=>{
+				const win = uni.getWindowInfo();
+				const tHight = win.windowWidth * 9 /16;
+				this.mainHeight = win.windowHeight - tHight - res.height + 10;
+			});
+		},
+		data() {
+			return {
+				mainHeight: 0,
+				tops:["../../static/img/$temp-site.png"],
+				another: false,
+				terminals: [],
+				entInfo:{
+					title:'服务提供',
+					name: '华能贵州盘州市风电有限责任公司',
+					code: '915205555155625655',
+					tel: '0851-8815158',
+					businessLicenceUrl:"/static/img/$temp-site01.jpg"
+				},
+				stationInfo : "",//站点信息
+				deviceList: [],//该站点桩列表
+				timePricesList: [],//费用时段列表
+				nowPriceTime: {},//当前费用时段信息
+				service:{
+					tel: '400-0000-0000',
+					work: '09:00 至 18:00'
+				},
+				busineHours:"",//营业时间
+			}
+		},
+		methods: {
+			getStationsInfo(){
+				this.$api.base("post","/chargeApi/getStationsInfoAndUpdateDecice",{"stationId":this.stationInfo.id},{}).then(res=>{
+					this.deviceList = res.devices;
+					this.timePricesList = res.prices;
+					this.nowPriceTime = res.nowPriceTime;
+					//只显示三个设备信息
+					for(var i = 0; i < this.deviceList.length; i++){
+						this.terminals.push(this.deviceList[i]);
+						if(i == 2){
+							break;
+						}
+					}
+				})
+			},
+			//获取桩状态的数量
+			getStatusNum(status){
+				var num = 0;
+				//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+				for(var i = 0; i < this.deviceList.length; i++){
+					var device = this.deviceList[i];
+					if(status == 2){
+						if(device.deviceStatus == 2 || device.deviceStatus == 3 || device.deviceStatus == 4){
+							num++;
+							continue;
+						}
+					}
+					if(device.deviceStatus == status){
+						num++;
+					}
+				}
+				return num;
+			},
+			getSatesObj(item){
+				//{name:'离线',color:'grey'},{name:'空闲',color:'green'},{name:'占用',color:'blue'}
+				var obj = {};
+				if(item.deviceStatus == 2 || item.deviceStatus == 4){
+					obj = {name:'占用',color:'blue'};
+				}else if(item.deviceStatus == 3){
+					obj = {name:'充电中',color:'orange'};
+				}else if(item.deviceStatus == 0){
+					obj = {name:'离线',color:'grey'};
+				}else if(item.deviceStatus == 1){
+					obj = {name:'空闲',color:'green'};
+				}else if(item.deviceStatus == 255){
+					obj = {name:'故障',color:'err'};
+				}
+				return obj;
+			},
+			//获取充电桩设备类型
+			getdeviceTypeName(type){
+				//电类型 1:直流设备;2:交流设备3:交直流一体设备;4:无线设备;5:其他
+				var str = "";
+				switch(type){
+					case "1":
+						str = "直流设备";
+						break
+					case "2":
+						str = "交流设备";
+						break
+					case "3":
+						str = "交直流一体设备";
+						break
+					case "4":
+						str = "无线设备";
+						break
+					case "5":
+						str = "其他";
+						break
+				}
+				return str;
+			},
+			//映射 峰  平  谷
+			getPriceLable(type){
+				//时间类型 1 谷 2 平 3 峰
+				var str = "";
+				switch (type){
+					case 1:
+						str = "谷";
+						break;
+					case 2:
+						str = "平";
+						break;
+					case 3:
+						str = "峰";
+						break;
+				}
+				return str;
+			},
+			//获取配置文件信息
+			getConfigStationInfo(){
+				this.$api.static(this.$config.url.configUrl+"stationConfi.json").then(res=>{
+					console.log("获取的配置文件信息:",res);
+					this.entInfo = res.entInfo;
+					this.service = res.service;
+					this.busineHours = res.busineHours;
+				})
+			},
+			// 拨打电话
+			callPhone(phone){
+				this.$app.act.callPhone(phone);
+			},
+			// 打开客服
+			openCustomerService(){
+				this.$refs.service.open();
+			},
+			// 打开服务提供
+			openEnt_Serve(){
+				this.entInfo.title = '服务提供';
+				this.$refs.entInfo.open();
+			},
+			// 打开发票提供
+			openEnt_Invoicing(){
+				this.entInfo.title = '发票提供';
+				this.$refs.entInfo.open();
+			},
+			// 关闭企业弹窗
+			closeEnt(){
+				this.$refs.entInfo.close();
+			},
+			// 关闭服务弹窗
+			closeService(){
+				this.$refs.service.close();
+			},
+			// 打开地图
+			openLocation(){
+				uni.openLocation({
+					latitude: Number(this.stationInfo.lat),
+					longitude:  Number(this.stationInfo.lng),
+				});
+			},
+			// 跳转充电终端
+			goTerminal(item){
+				//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+				if(item.deviceStatus == 0 || item.deviceStatus == 255 ){
+					return;
+				}
+				this.$app.url.goto('/pages/terminal/terminal?deviceId='+item.id+"&deviceStatus="+item.deviceStatus);
+			},
+			//去查看全部电站
+			toDeiceAll(){
+				var strList = JSON.stringify(this.timePricesList);
+				var currPriceId = this.nowPriceTime.id
+				this.$app.url.goto('/pages/site-more/site-more?stationId='+this.stationInfo.id)
+			},
+			//去查看全部电价
+			toPriceAll(){
+				this.$app.url.goto('/pages/site-more/site-more?show=1&stationId='+this.stationInfo.id)
+			},
+			//扫一扫
+			sacn(){
+				this.$app.act.scan().then(res=>{
+					console.log(res);
+					var paramObj = this.getUrlParams(res.result);
+					if(!paramObj || !paramObj.connectorCode){
+						this.$app.popup.alert("二维码不正确。","温馨提示!");
+						return;
+					}
+					this.getDeviceInfo(paramObj.connectorCode);
+				})
+			},
+			getUrlParams(url) {
+			  const paramsRegex = /[?&]+([^=&]+)=([^&]*)/gi;
+			  const params = {};
+			  let match;
+			  while (match = paramsRegex.exec(url)) {
+			    params[match[1]] = match[2];
+			  }
+			  return params;
+			},
+			//通过充电桩编码(sn)获取设备详情
+			getDeviceInfo(sn){
+				this.$api.base("post","/chargeApi/checkDevicesBySn",{"sn":sn},{}).then(res=>{
+					console.log("设备信息:",res)
+					this.goTerminal(res.device);
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped>
+@import url("site.css");
+</style>

BIN
pages/site/ysbth2.ttf


+ 275 - 0
pages/terminal/terminal.css

@@ -0,0 +1,275 @@
+>>> ax-custom-title {
+	z-index: 9999 !important;
+}
+.page-background{
+	display: block;
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.body{
+	width: 100%;
+	height: 100%;
+	overflow: auto;
+	padding-bottom: 130px;
+	position: relative;
+	z-index: 1;
+}
+.body::-webkit-scrollbar{
+	display: none;
+}
+.body.visit{
+	padding-bottom: 0px;
+}
+.block{
+	padding: 0 10px;
+}
+.block + .block{
+	margin-top: 10px;
+}
+
+/* 主图 */
+.host-graph{
+	margin: 20px 0 10px;
+}
+.host-graph .image{
+	width: 60vw;
+}
+
+/* 主参数 */
+.parameter{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 10px;
+	margin: 0 20px;
+	margin-top: 10px;
+	margin-bottom: 20px;
+}
+.parameter .param{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.parameter .param .value{
+	font-size: 20px;
+	font-weight: bold;
+}
+.parameter .param .name{
+	font-size: 14px;
+	color: #aaa;
+	margin-top: 7px;
+}
+
+/* 卡片 */
+.card{
+	background-color: #fff;
+	border-radius: 8px;
+	padding: 10px;
+	box-shadow: 0 0 10px rgba(0,0,0,0.05);
+}
+.card .title{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 15px;
+	font-weight: bold;
+	padding-bottom: 10px;
+	padding-left: 10px;
+	border-bottom: 1px solid #ddd;
+}
+.card .title .more{
+	font-size: 14px;
+	color: #aaa;
+	font-weight: normal;
+}
+.card .title .more .icon{
+	margin-left: 5px;
+}
+.card .cell{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	font-size: 14px;
+	height: 32px;
+	padding: 0 10px;
+}
+.cell .contet{
+	color: #aaa;
+}
+.cell .obsolete{
+	font-size: 12px;
+	text-decoration: line-through;
+	color: #aaa;
+	margin-right: 5px;
+}
+.cell .obsolete .money{
+	font-size: inherit;
+	color: inherit;
+	font-weight: normal;
+}
+.cell .money{
+	font-size: 16px;
+	font-weight: bold;
+	color: #f44033;
+}
+
+/* 开关 */
+.switch{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	width: 110px;
+	height: 30px;
+	font-size: 14px;
+	border-radius: 100pc;
+	background-color: #fff;
+	position: relative;
+	color: #333;
+}
+.switch > text{
+	flex: 1;
+	display: flex;
+	justify-content: center;
+	transform: translateY(-1px);
+	transition: all 300ms ease;
+	position: relative;
+	z-index: 2;
+}
+.switch.personal > text:first-child,
+.switch > text:last-child{
+	color: #fff;
+}
+.switch.personal > text:last-child{
+	color: inherit;
+}
+
+.switch::after{
+	content: '';
+	display: block;
+	width: calc(50% - 3px);
+	height: calc(100% - 6px);
+	border-radius: 100pc;
+	background-color: #3eb6f8;
+	position: absolute;
+	top: 3px;
+	right: 3px;
+	transition: all 200ms ease;
+}
+.switch.personal::after{
+	transform: translateX(-100%);
+}
+
+/* 提示 */
+.tips{
+	font-size: 14px;
+	margin-top: 10px;
+	padding: 0 10px;
+}
+
+/* 优惠券 */
+.coupon{
+	--coupon-height: 80px;
+	--coupon-cut-size: 16px;
+	
+	display: flex;
+	align-items: center;
+	width: 100%;
+	height: var(--coupon-height);
+	padding: 5px;
+	border-radius: 8px;
+	background-color: #3eb6f8;
+	margin-top: 10px;
+}
+.coupon .name{
+	padding: 0 10px;
+}
+.coupon .info{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+}
+.coupon .info .value{
+	font-size: 30px;
+	font-weight: bold;
+}
+.coupon .info .describe{
+	font-size: 12px;
+}
+.coupon .feature{
+	display: block;
+	position: relative;
+	width: var(--coupon-cut-size);
+	height: var(--coupon-height);
+	overflow: hidden;
+}
+.coupon .feature .line{
+	display: block;
+	width: 1px;
+	position: absolute;
+	left: 50%;
+	top: var(--coupon-cut-size);
+	bottom: var(--coupon-cut-size);
+	border-left: 1px dashed #fff;
+}
+.coupon .feature::after,
+.coupon .feature::before{
+	content: '';
+	display: block;
+	width: var(--coupon-cut-size);
+	height: var(--coupon-cut-size);
+	border-radius: 100pc;
+	background-color: #fff;
+	position: absolute;
+}
+.coupon .feature::before{
+	top: 0;
+	transform: translateY(-50%);
+}
+.coupon .feature::after{
+	bottom: 0;
+	transform: translateY(50%);
+}
+.coupon.personal{
+	background-color: #ff7043;
+	color: #fff;
+}
+
+/* 主信息 */
+.footer{
+	display: flex;
+	flex-direction: column;
+	background-color: #fff;
+	border-radius: 16px 16px 0 0;
+	height: 120px;
+	padding: 10px;
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	box-shadow: 0 0 10px rgba(0,0,0,0.1);
+	z-index: 99999;
+}
+.footer .tips{
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 12px;
+	color: #aaa;
+	margin-bottom: 10px;
+}
+.footer .startup{
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 14px;
+	border-radius: 8px;
+	height: 50px;
+	background: linear-gradient(to right,#8FF8FB,#47AEFF);
+}

+ 400 - 0
pages/terminal/terminal.vue

@@ -0,0 +1,400 @@
+<template>
+	<ax-body blank="0" hideIndicatorArea>
+		<image src="@/static/img/page-bg01.png" class="page-background"></image>
+		<view class="body" :class="{visit}">
+			<!-- 主图 -->
+			<view class="app-flex c-center host-graph">
+				<image src="@/static/img/charging-01.png" mode="widthFix" class="image"></image>
+			</view>
+			<!-- 主参数 -->
+			<view class="parameter">
+				<view class="param"><view class="value">{{deviceInfo.current}}</view><view class="name">电流A</view></view>
+				<view class="param"><view class="value">{{getVolt()}}</view><view class="name">电压V</view></view>
+				<view class="param"><view class="value">{{deviceInfo.power}}</view><view class="name">功率KW</view></view>
+			</view>
+			<view class="block">
+				<view class="card">
+					<view class="title">终端信息</view>
+					<view class="cell"><view class="lable">终端状态</view><view class="contet">{{getDeviceStatusLable(deviceInfo.deviceStatus)}}</view></view>
+					<view class="cell"><view class="lable">终端编号</view><view class="contet">{{deviceInfo.deviceNo}}</view></view>
+					<view class="cell"><view class="lable">充电电站</view><view class="contet">{{deviceInfo.thirdPartyStationName}}</view></view>
+					<view class="cell"><view class="lable">充电终端</view><view class="contet">{{deviceInfo.deviceName}}</view></view>
+					<view class="cell"><view class="lable">车位编号</view><view class="contet">{{deviceInfo.parkNo ? deviceInfo.parkNo : "无"}}</view></view>
+				</view>
+			</view>
+			<view class="block">
+				<view class="card">
+					<view class="title">
+						<text>费用信息</text>
+						<view @click="$app.url.goto('/pages/site-more/site-more?show=1&stationId='+stationInfo.id)" class="more"><text>价格详情</text><icon class="ax-iconline i-arrow-right icon"></icon></view>
+					</view>
+					<view class="cell">
+						<view class="lable">{{personal == 1?'当前电价':'集团折扣价'}}</view>
+						<view class="contet app-flex middle">
+							<view v-if="personal == 1"><text class="money">{{nowPriceTime.price?parseFloat(nowPriceTime.price).toFixed(4):"0.0000"}}</text><text> 元/度</text></view>
+							<view v-else>
+								<text class="obsolete"> {{nowPriceTime.price?parseFloat(nowPriceTime.price).toFixed(4):"0.0000"}} 元/度 </text>
+								<text class="money">{{getCurrEcPrice()}}</text><text> 元/度</text>
+							</view>
+						</view>
+					</view>
+					<view class="cell" v-if="discountInfo&&personal == 1">
+						<view class="lable">优惠</view>
+						<view class="contet app-flex middle">
+							<view>{{discountInfo.temp3}}<text class="money">{{discountInfo.discount?parseFloat(discountInfo.discount).toFixed(4):"0.0000"}}</text><text> 元/度</text></view>
+						</view>
+					</view>
+					<view class="cell"><view class="lable">当前时段</view><view class="contet">{{getPriceLable(nowPriceTime.timeType)}}  {{nowPriceTime.time}}</view></view>
+					<!-- <view class="cell" style="height: auto;"><view class="lable">停车参考</view><view class="contet" style="flex: 1;padding-left: 5px;" v-html="stationInfo.parkTips"></view></view> -->
+					<view class="cell"><view class="lable">停车参考</view><view class="contet">充电减免2小时停车费,超出时长部分计时收费</view></view>
+				</view>
+			</view>
+			<view v-if="!visit" class="block">
+				<view class="card">
+					<view class="title">
+						<text>我的抵扣券</text>
+						<view class="more" v-if="isEc"><view  class="switch" :class="{'personal':personal==1}"><text @click="changeAccount(1)">个人</text><text  @click="changeAccount(2)">集团</text></view></view>
+					</view>
+					<view class="coupon" :class="{'personal':personal==1}">
+						<view class="name">{{personal == 1?'充电抵扣券':'集团抵扣券'}}</view>
+						<view class="feature"><view class="line"></view></view>
+						<view class="info">
+							<view class="value">{{accountInfo.balance}}</view>
+							<view class="describe">剩余可抵扣充电费用 (元)</view>
+						</view>
+					</view>
+					<view class="tips">
+						<view class="li">1. 可抵扣按照当前电价进行预估计算</view>
+						<view class="li">2. 实际结算价以具体充电时段为准</view>
+					</view>
+				</view>
+			</view>
+			<!-- 信息 -->
+			<view class="footer">
+				<view class="tips">账单信息可能会有所延迟,具体以实际结算为准</view>
+				<view>
+					<button @click="startup()" class="startup">启动终端充电</button>
+					<ax-ios-indicator min="10"></ax-ios-indicator>
+				</view>
+			</view>
+		</view>
+	</ax-body>
+</template>
+
+<script>
+export default {
+	onLoad(opts) {
+		console.log("参数信息:",opts)
+	   /**
+		* 判断终端是否占用状态
+		* 判断占用终端设备的是不是用户自己
+		*/
+		this.deviceId = opts.deviceId
+		this.deviceStatus = opts.deviceStatus
+	   
+	   
+	},
+	onShow() {
+		
+		this.queryInChange(this.deviceId,this.deviceStatus);
+		
+		/**
+		 * 刷新用户信息
+		 */
+		this.userInfo = this.$app.storage.get(this.$config.keyname.userInfo);
+		if(!this.userInfo.phone){
+			this.$app.url.goto('/pages/login/login')
+			return;
+		}
+		this.$api.login({"checkStatus":1}).then(()=>{
+			this.userInfo = this.$app.storage.get(this.$config.keyname.userInfo);
+			if(this.userInfo.ecId){
+				//查询该集团账户是否正常使用。
+				this.$api.base("post","/chargeApi/queryEcInfo",{"ecId":this.userInfo.ecId},{}).then(res=>{
+					if(res.ecInfo && res.ecInfo.ecStatus == 1){
+						this.isEc = true;
+					}
+				})
+			}
+		})
+		
+		
+		
+	},
+	mounted(){
+		
+		
+	},
+	data() {
+		return {
+			deviceId:0,
+			deviceStatus:0,
+			visit: '',
+			personal: 1,// 1 个人订单 2 集团订单
+			isEc : false,//是否集团的用户
+			nowPriceTime : {},//当前价格时间段信息
+			deviceInfo : {},//充电桩的信息
+			accountInfo : {//账户信息
+				balance : 0,//可用抵用券余额
+			},
+			userInfo : {},
+			stationInfo : {},//站点信息
+			orderInfo : {},//临时订单信息
+			checkNum : 0,//检测订单状态次数
+			ecInfo : {},//集团信息
+			discountInfo:null//优惠信息
+		}
+	},
+	methods: {
+		//通过用户id查询是否还有在充电中的订单
+		queryInChange(deviceId,deviceStatus){
+			if(deviceStatus == 3 || deviceStatus == 4 ){
+				//占用充电状态;终端占用且不是自己,进入访问模式
+				this.visit = true;
+			}
+			this.getDeviceInfo(deviceId);//获取设备、站的详情信息
+			this.getAccountInfo();//获取账户信息
+			/* this.$api.base("post","/chargeApi/queryInChangeByUserId",{},{}).then(res=>{
+				if(res.isChange == 1){
+					this.orderInfo = res.orderInfo;
+					//用户有充电中的订单
+					//if(res.orderInfo.deviceId == deviceId){
+						// 跳转
+						this.$app.url.goto('/pages/charging/charging?orderId='+this.orderInfo.id+"&deviceId="+deviceId,false);
+					//}
+				}else{
+					
+				}
+				
+				
+			}) */
+		},
+		//获取设备的详情信息
+		getDeviceInfo(deviceId){
+			this.$api.base("post","/chargeApi/getDevicesDetial",{"deviceId":deviceId},{}).then(res=>{
+				this.deviceInfo = res.device;
+				this.nowPriceTime = res.nowPriceTime;
+				this.stationInfo = res.stationInfo;
+				if(res.discountInfo){
+					this.discountInfo = res.discountInfo
+				}
+				if(this.deviceInfo.tipsStatus==1){
+					this.$app.popup.alert(this.deviceInfo.tipsContent,"温馨提示");
+				}
+			})
+		},
+		//获取账户信息
+		getAccountInfo(){
+			if(this.personal == 1){
+				//获取个人账户信息
+				this.$api.base("post","/chargeApi/getUserAccount",{},{}).then(res=>{
+					this.accountInfo.balance = res.userAccount.balance;
+					
+				})
+			}else{
+				//获取集团账户信息
+				this.$api.base("post","/chargeApi/getEcUserAccount",{},{error:false}).then(res=>{
+					this.ecInfo = res.ecInfo;
+					this.accountInfo.balance = res.ecUserAccount.balance;
+				}).catch(err=>{
+					this.accountInfo.balance = 0;
+					this.$app.popup.alert(err.msg,"温馨提示");
+				})
+			}
+		},
+		//切换账户
+		changeAccount(type){
+			if(this.personal == type){
+				return;
+			}
+			this.personal = type;
+			 this.getAccountInfo();
+		},
+		//当前集团折扣价
+		getCurrEcPrice(){
+			
+			if(!this.nowPriceTime){
+				return 0;
+			}
+			var currEcP = this.nowPriceTime.price;
+			if(this.ecInfo && this.ecInfo.ecDiscount){
+				
+				var realServicePrice = this.nowPriceTime.servicePrice
+				if(this.stationInfo.contractServicePrice){
+					realServicePrice = this.stationInfo.contractServicePrice
+				}
+				
+				currEcP = (this.nowPriceTime.electrovalence + realServicePrice + this.nowPriceTime.addServicePrice * this.ecInfo.ecDiscount/100);
+			}
+			console.log("dddd",currEcP)
+			if(currEcP){
+				currEcP = currEcP.toFixed(2);
+			}
+			return Number(currEcP).toFixed(4);
+		},
+		//转换出电压值
+		getVolt(){
+			if(!this.deviceInfo.power){
+				return 0;
+			}
+			var v = this.deviceInfo.power/this.deviceInfo.current * 1000;
+			return v;
+		},
+		//映射 峰  平  谷
+		getPriceLable(type){
+			//时间类型 1 谷 2 平 3 峰
+			var str = "";
+			switch (type){
+				case 1:
+					str = "谷";
+					break;
+				case 2:
+					str = "平";
+					break;
+				case 3:
+					str = "峰";
+					break;
+			}
+			return str;
+		},
+		//映射订单状态名称()
+		getDeviceStatusLable(status){
+			//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障
+			var str = "";
+			switch (status){
+				case 0:
+					str = "离网";
+					break;
+				case 1:
+					str = "空闲";
+					break;
+				case 2:
+					str = "占用";
+					break;
+				case 3:
+					str = "占用";
+					break;
+				case 4:
+					str = "占用";
+					break;
+				case 255:
+					str = "故障";
+					break;
+			}
+			return str;
+		},
+		startup(){
+			
+			if(this.visit){
+				this.$app.popup.alert("该充电枪被占用或存在异常,请重新尝试或更换其他充电枪。","温馨提示");
+				return;
+			}
+			
+			//判断账户余额是否大于两元
+			if((this.accountInfo.balance - 2) <= 0){
+				
+				return this.$app.popup.confirm("无法启动充电,抵扣余量需大于2元,请先购买充电券!","温馨提示!",{confirmText:"立即购券"}).then(confirm=>{
+					if(confirm){
+						this.$app.url.goto('/pages/coupon-buy/coupon-buy',true);
+					}
+				});
+			}
+			//统一下单并启动接口
+			this.startChangeAndOrder();
+		},
+		//统一下单并启动接口
+		startChangeAndOrder(){
+			var obj = {
+				userId : this.userInfo.id,
+				deviceId : this.deviceInfo.id,
+				orderType : this.personal == 2 ? 2 : 1,//订单类型 1 个人订单 2 集团订单
+			}
+			this.$api.base("post","/chargeApi/startChangeAndOrder",obj,{}).then(res=>{
+				//下单成功,并进行了订单预充值
+				this.orderInfo = res.orderInfo;
+				if(res.flg && res.flg == 1){
+					//用户有充电中的订单
+					 this.$app.popup.confirm("您有一个进行中充电订单,不可再次启动。",null,{showCancel:false,confirmText:"查看订单"}).then(cres=>{
+						this.$app.url.goto('/pages/charging/charging?orderId='+this.orderInfo.id+"&deviceId="+this.deviceInfo.id,false);
+					 });
+				}else{
+					//正常启动充电订单
+					this.$app.url.goto('/pages/charging/charging?orderId='+this.orderInfo.id+"&deviceId="+this.deviceInfo.id,false);
+				}
+				//this.$app.popup.loading(true,{title:"启动中...."})
+				//延迟5s查询一下订单,看看是否真的启动成功
+				//setTimeout(()=>this.checkedStartStatus(),5000);
+			})	
+		},
+		/* // 通过充电桩编号(sn)检测该设备是否插枪,是否可以进行后续的下单,启动操作
+		checkDeviceReady(){
+			this.$api.base("post","/chargeApi/checkDeviceReady",{"sn":this.deviceInfo.deviceNo},{}).then(res=>{
+				if(res.code == 0){
+					//充电桩已经插枪准备好了,可以进行下单充值操作
+					this.chargeAndOrder();
+				}
+			})
+		},
+		// 进行下单,并进行接口充值,准备启动充电
+		chargeAndOrder(){
+			var obj = {
+				userId : this.userInfo.id,
+				deviceId : this.deviceInfo.id,
+				orderType : this.personal == 2 ? 2 : 1,//订单类型 1 个人订单 2 集团订单
+			}
+			this.$api.base("post","/chargeApi/chargeAndOrder",obj,{}).then(res=>{
+				if(res.code == 0){
+					//下单成功,并进行了订单预充值
+					this.orderInfo = res.orderInfo;
+					//通知已经充值成功,可以进行设备充电的启动
+					this.changePayAndStart();
+				}
+			})
+		},
+		// 支付成功启动充电通知
+		changePayAndStart(){
+			this.$api.base("post","/chargeApi/changePayAndStart",{"id":this.orderInfo.id},{}).then(res=>{
+				if(res.code == 0){
+					this.$app.popup.loading(ture,{title:"启动中...."})
+					//延迟5s查询一下订单,看看是否真的启动成功
+					setTimeout(()=>this.checkedStartStatus(),5000);
+				}
+			})
+		}, */
+		// 延迟5s查询一下订单,看看是否真的启动成功
+		checkedStartStatus(){
+			this.$api.base("post","/chargeApi/checkedStartStatus",{"id":this.orderInfo.id},{}).then(res=>{
+				
+				if(res.code == 0){
+					var respObj = res.obj;
+					if(respObj.code == 200){
+						if(respObj.status == 1){
+							uni.hideLoading();
+							//状态为1说明正常启动
+							this.$app.url.goto('/pages/charging/charging?orderId='+this.orderInfo.id+"&deviceId="+this.deviceInfo.id,false);
+						}else{
+							//其他状态,说明充电桩,未启动。或其他问题,需要再次进行进行验证
+							if(this.checkNum < 20){
+								this.checkNum = this.checkNum + 1;
+								//延迟2s查询一下订单,看看是否真的启动成功
+								setTimeout(()=>this.checkedStartStatus(),2000);
+							}
+						}
+						
+					}else{
+						uni.hideLoading();
+						this.$app.popup.alert(respObj.msg,"温馨提示");
+					}
+					
+				}else{
+					uni.hideLoading();
+				}
+			})
+		},
+	}
+}
+</script>
+
+<style scoped>
+@import url("terminal.css");
+</style>

+ 30 - 0
pages/web/web.vue

@@ -0,0 +1,30 @@
+<template>
+	<web-view v-if="url.length" :src="url" @error="errorHandle"></web-view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				url: '',
+			}
+		},
+		onLoad(param) {
+			if(param.url){
+				console.log(param.url)
+				this.url = param.url;
+			}else{
+				this.$app.popup.alert('未设定访问地址','访问失败').then(()=>{
+					this.$app.url.back();
+				});
+			}
+		},
+		methods:{
+			errorHandle(e){
+				this.$app.popup.alert('失败原因\r\n'+e.detail.errMsg,'访问失败').then(()=>{
+					this.$app.url.back();
+				});
+			},
+		}
+	}
+</script>

+ 109 - 0
static/css/app.css

@@ -0,0 +1,109 @@
+@import 'vars.css';
+
+page{
+	width: 100%;
+	height: 100%;
+	color: #2B303A;
+	font-size: var(--global-size);
+	box-sizing: border-box;
+}
+view,text,scroll-view{
+	box-sizing: border-box;
+}
+icon{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+}
+
+>>> ax-custom-title .title{
+	font-size: 18px;
+}
+
+#root{
+	width: 100%;
+	height: 100%;
+	background-color: var(--global-background);
+	color: var(--font-main);
+	overflow: auto;
+}
+
+/* 占位符样式 */
+.app-placeholder,
+.app-placeholder::placeholder{
+	color: #ccc;
+}
+
+/* 分组标题 */
+.app-group-title{
+	padding: 10px;
+	text-align: center;
+	color: var(--font-des);
+}
+
+/* 状态栏 */
+.app-status-bar{
+	min-height: 34px;
+	background-color: var(--global-background);
+}
+
+/* 弹性盒子模型 */
+.app-flex-one{
+	flex: 1;
+}
+.app-flex{
+	display: flex;
+}
+.app-flex.middle{
+	align-items: center;
+}
+.app-flex.c-center{
+	align-items: center;
+	justify-content: center;
+}
+.app-flex.c-between{
+	align-items: center;
+	justify-content: space-between;
+}
+.app-flex.c-around{
+	align-items: center;
+	justify-content: space-around;
+}
+.app-flex.column{
+	flex-direction: column;
+}
+
+/* 标题栏 */
+.app-title-bar{
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	height: 50px;
+	padding: 0 15px 0 10px;
+	color: #333;
+	background-color: var(--global-background);
+	font-size: 16px;
+}
+.app-title-bar .icon-item{
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 22px;
+	width: 30px;
+	height: 30px;
+}
+.app-title-bar .icon-item.back{
+	font-size: 24px;
+	transform: scaleX(-100%);
+}
+
+/* 隐藏滚动条 */
+scroll-view.app-hide-scrollbar >>> ::-webkit-scrollbar,
+.app-hide-scrollbar::-webkit-scrollbar{
+	display: none;
+}
+
+/* 不可选择 */
+.app-unselectable{
+	user-select: none;
+}

+ 22 - 0
static/css/vars.css

@@ -0,0 +1,22 @@
+page{
+	--color-main: #0c49ac;
+	
+	--color-red: #eb4646;
+	--color-red-light: #ff9898;
+	--color-blue: #2196f3;
+	--color-blue-light: #95d0ff;
+	--color-green: #3fb555;
+	--color-green-light: #89f19c;
+	--color-orange: #ef9d00;
+	--color-orange-light: #facb72;
+	
+	--font-main: #333;
+	--font-aux: #666;
+	--font-des: #999;
+	--font-pla: #ccc;
+	
+	--global-size: 16px;
+	--global-space: 10px;
+	--global-shadow: 0 0 10px rgba(0,0,0,0.1);
+	--global-background: #fff;
+}

+ 15 - 0
static/img/appnav-home.active.svg

@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.05" y1="0.428" x2="0.978" y2="0.575" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#8ff8fb"/>
+      <stop offset="1" stop-color="#47aeff"/>
+    </linearGradient>
+  </defs>
+  <g id="组_8058" data-name="组 8058" transform="translate(-57 -697)">
+    <g id="组_7976" data-name="组 7976" transform="translate(-5.342 3.26)">
+      <path id="联合_5" data-name="联合 5" d="M2.054,20.348A2.055,2.055,0,0,1,0,18.294V6.991a2.054,2.054,0,0,1,.9-1.7L8.148.356a2.055,2.055,0,0,1,2.324.008L17.6,5.292a2.054,2.054,0,0,1,.886,1.69V18.294a2.054,2.054,0,0,1-2.054,2.054Z" transform="translate(64 694.927)" fill="url(#linear-gradient)"/>
+      <path id="路径_7771" data-name="路径 7771" d="M194.4,80.7h-2.024a.377.377,0,0,1-.353-.511l2.012-5.28a.377.377,0,0,1,.352-.243h3.394a.377.377,0,0,1,.349.519l-1.171,2.875h2.2a.377.377,0,0,1,.283.626l-5.406,6.16a.377.377,0,0,1-.648-.345l1.006-3.8Z" transform="translate(-122.525 627.402)" fill="#fff"/>
+    </g>
+    <rect id="矩形_3867" data-name="矩形 3867" width="22" height="22" transform="translate(57 697)" fill="none"/>
+  </g>
+</svg>

+ 7 - 0
static/img/appnav-home.svg

@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="18.487" height="20.348" viewBox="0 0 18.487 20.348">
+  <g id="联合_5" data-name="联合 5" fill="none">
+    <path d="M2.054,20.348A2.055,2.055,0,0,1,0,18.294V6.991a2.054,2.054,0,0,1,.9-1.7L8.148.356a2.055,2.055,0,0,1,2.324.008L17.6,5.292a2.054,2.054,0,0,1,.886,1.69V18.294a2.054,2.054,0,0,1-2.054,2.054Z" stroke="none"/>
+    <path d="M 16.43324851989746 19.34831237792969 C 17.01420783996582 19.34831237792969 17.48685836791992 18.87527275085449 17.48685836791992 18.2938232421875 L 17.48685836791992 6.982012748718262 C 17.48685836791992 6.635762691497803 17.3166389465332 6.311312675476074 17.03175735473633 6.11425256729126 L 9.90418815612793 1.187002658843994 C 9.726967811584473 1.06466269493103 9.519477844238281 1.00000262260437 9.304158210754395 1.00000262260437 C 9.091718673706055 1.00000262260437 8.886808395385742 1.063122630119324 8.711237907409668 1.182792663574219 L 1.460688233375549 6.119912624359131 C 1.172218203544617 6.31639289855957 0.9999982118606567 6.641922473907471 0.9999982118606567 6.990702629089355 L 0.9999982118606567 18.2938232421875 C 0.9999982118606567 18.87527275085449 1.473038196563721 19.34831237792969 2.054478168487549 19.34831237792969 L 16.43324851989746 19.34831237792969 M 16.43324851989746 20.34831237792969 L 2.054478168487549 20.34831237792969 C 0.9194782376289368 20.34831237792969 -1.769714344845852e-06 19.42796325683594 -1.769714344845852e-06 18.2938232421875 L -1.769714344845852e-06 6.990702629089355 C -1.769714344845852e-06 6.311092853546143 0.3363282382488251 5.675802707672119 0.8977482318878174 5.293412685394287 L 8.148398399353027 0.3562226593494415 C 8.849740028381348 -0.1217676103115082 9.773558616638184 -0.1182870268821716 10.47228813171387 0.3640426695346832 L 17.60040855407715 5.291672706604004 C 18.15573883056641 5.675802707672119 18.48685836791992 6.306742668151855 18.48685836791992 6.982012748718262 L 18.48685836791992 18.2938232421875 C 18.48685836791992 19.42796325683594 17.56737899780273 20.34831237792969 16.43324851989746 20.34831237792969 Z" stroke="none" fill="#2b303a"/>
+  </g>
+  <path id="路径_7771" data-name="路径 7771" d="M194.4,80.7h-2.024a.377.377,0,0,1-.353-.511l2.012-5.28a.377.377,0,0,1,.352-.243h3.394a.377.377,0,0,1,.349.519l-1.171,2.875h2.2a.377.377,0,0,1,.283.626l-5.406,6.16a.377.377,0,0,1-.648-.345l1.006-3.8Z" transform="translate(-186.525 -67.526)" fill="#2b303a"/>
+</svg>

+ 16 - 0
static/img/appnav-my.active.svg

@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22" viewBox="0 0 22 22">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.05" y1="0.428" x2="0.978" y2="0.575" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#8ff8fb"/>
+      <stop offset="1" stop-color="#47aeff"/>
+    </linearGradient>
+  </defs>
+  <g id="组_8020" data-name="组 8020" transform="translate(-291 -739)">
+    <g id="组_6368" data-name="组 6368" transform="translate(-3696 -2556)">
+      <path id="路径_6460" data-name="路径 6460" d="M50.9,11.956c8.292,0,8.21,5.133,8.21,5.133a.73.73,0,0,1-.752.844H43.446a.724.724,0,0,1-.752-.844s-.084-5.133,8.21-5.133ZM50.9,0h5.231V5.231A5.231,5.231,0,1,1,50.9,0Z" transform="translate(3946.817 3297.5)" fill="url(#linear-gradient)"/>
+      <rect id="矩形_2853" data-name="矩形 2853" width="22" height="22" transform="translate(3987 3295)" fill="none"/>
+    </g>
+    <rect id="矩形_3895" data-name="矩形 3895" width="1.5" height="3" rx="0.75" transform="translate(299 745)" fill="#fff"/>
+    <rect id="矩形_3896" data-name="矩形 3896" width="1.5" height="3" rx="0.75" transform="translate(302 745)" fill="#fff"/>
+  </g>
+</svg>

+ 10 - 0
static/img/appnav-my.svg

@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 22 22">
+  <g id="组_8020" data-name="组 8020" transform="translate(-291 -739)">
+    <g id="组_6368" data-name="组 6368" transform="translate(-3696 -2556)">
+      <path id="路径_6460" data-name="路径 6460" d="M50.9,11.956c8.292,0,8.21,5.133,8.21,5.133a.73.73,0,0,1-.752.844H43.446a.724.724,0,0,1-.752-.844s-.084-5.133,8.21-5.133ZM50.9,0h5.231V5.231A5.231,5.231,0,1,1,50.9,0Z" transform="translate(3946.817 3297.5)" fill="none" stroke="#2b303a" stroke-width="1.5"/>
+      <rect id="矩形_2853" data-name="矩形 2853" width="22" height="22" transform="translate(3987 3295)" fill="none"/>
+    </g>
+    <rect id="矩形_3895" data-name="矩形 3895" width="1.5" height="3" rx="0.75" transform="translate(299 745)" fill="#2b303a"/>
+    <rect id="矩形_3896" data-name="矩形 3896" width="1.5" height="3" rx="0.75" transform="translate(302 745)" fill="#2b303a"/>
+  </g>
+</svg>

+ 8 - 0
static/img/appnav-scan.svg.svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="22.484" height="22.484" viewBox="0 0 22.484 22.484">
+  <g id="组_7975" data-name="组 7975" transform="translate(-63 -932)">
+    <g id="组_7974" data-name="组 7974" transform="translate(63 932)">
+      <path id="路径_7769" data-name="路径 7769" d="M146.113,128h-1.249a.937.937,0,1,0,0,1.874h1.249a2.5,2.5,0,0,1,2.5,2.5v1.249a.937.937,0,1,0,1.874,0v-1.249A4.377,4.377,0,0,0,146.113,128Zm-12.491,0h-1.249A4.377,4.377,0,0,0,128,132.372v1.249a.937.937,0,1,0,1.874,0v-1.249a2.5,2.5,0,0,1,2.5-2.5h1.249a.937.937,0,1,0,0-1.874Zm0,20.611h-1.249a2.5,2.5,0,0,1-2.5-2.5v-1.249a.937.937,0,1,0-1.874,0v1.249a4.377,4.377,0,0,0,4.372,4.372h1.249a.937.937,0,1,0,0-1.874Zm15.926-4.684a.937.937,0,0,0-.937.937v1.249a2.5,2.5,0,0,1-2.5,2.5h-1.249a.937.937,0,1,0,0,1.874h1.249a4.377,4.377,0,0,0,4.372-4.372v-1.249A.937.937,0,0,0,149.548,143.926Z" transform="translate(-128 -128)" fill="#fff"/>
+    </g>
+    <rect id="矩形_3861" data-name="矩形 3861" width="16.376" height="2.047" rx="1.023" transform="translate(66.07 942.235)" fill="#fff"/>
+  </g>
+</svg>

+ 1 - 0
static/img/arrow-right.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1719999988017" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17429" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M670.976 546.133333a34.133333 34.133333 0 0 1-24.064-9.984L328.874667 218.112a34.133333 34.133333 0 1 1 48.213333-48.298667l318.037333 318.037334A34.133333 34.133333 0 0 1 670.976 546.133333z" p-id="17430"></path><path d="M353.024 864.170667a34.133333 34.133333 0 0 1-24.149333-58.282667l318.037333-318.037333a34.133333 34.133333 0 0 1 48.213333 48.298666L377.088 854.186667a34.133333 34.133333 0 0 1-24.064 9.984z" p-id="17431"></path></svg>

BIN
static/img/charging-01.png


BIN
static/img/charging_station_item_background.png


+ 3 - 0
static/img/distance.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12.702" height="12.702" viewBox="0 0 12.702 12.702">
+  <path id="路径_7773" data-name="路径 7773" d="M89.129,91.691,84.372,90.5a.416.416,0,0,1-.077-.778L96.167,84.1a.416.416,0,0,1,.553.553L91.1,96.525a.416.416,0,0,1-.778-.077l-1.189-4.757Z" transform="translate(-84.058 -84.06)" fill="#fff"/>
+</svg>

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
static/img/empty.svg


+ 8 - 0
static/img/locate.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1716955291732"
+	class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9574"
+	xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
+	<path
+		d="M777.20000029 173.0999999s0-1.10000039 0 0a372.0999999 372.0999999 0 0 0-530.40000058 0c-146.40000029 148.1000001-146.40000029 389.59999981 0 537.75l235.50000029 238.25000039c8.4999999 8.6000001 19.10000039 12.89999971 29.7 12.89999971a41.64999961 41.64999961 0 0 0 29.7-12.89999971l235.50000029-239.3499999c146.40000029-148.1000001 146.40000029-388.50000029 0-536.65000049zM512 608.4000002c-98.2000002 0-177.99999961-80.75000039-177.99999961-180.1000002 0-99.34999981 79.80000029-180.0500001 177.99999961-180.0500001s177.99999961 80.70000029 177.99999961 180.0500001c0 99.34999981-79.80000029 180.1000002-177.99999961 180.1000002z"
+		fill="#2B303A" p-id="9575"></path>
+</svg>

+ 3 - 0
static/img/locate2.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+  <path id="路径_7818" data-name="路径 7818" d="M32,22A10,10,0,1,0,42,32,10,10,0,0,0,32,22Zm4.613,5.668-4.5,10.4a.193.193,0,0,1-.351-.008l-1.835-3.922a.122.122,0,0,0-.061-.061l-3.915-1.837a.192.192,0,0,1-.008-.352l10.382-4.505A.219.219,0,0,1,36.613,27.668Z" transform="translate(-22 -22)" fill="#2b303a"/>
+</svg>

Fișier diff suprimat deoarece este prea mare
+ 1 - 0
static/img/login-bg.svg


+ 20 - 0
static/img/login-logo.svg

@@ -0,0 +1,20 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 92.94 135.27" fill="#fff">
+	<path
+		d="M62.17,55c20.46-15,40.77-30.25,61.31-45.14C104.45,27.49,84.8,44.54,65.56,62c-6.88,5.93-13.38,12.27-20.38,18,7.94-2.65,16.11-4.48,24-7.18C62.75,83.27,55.65,93.24,49,103.52A46.17,46.17,0,0,1,34.84,69.43c-.06-16.3,9.51-32.05,23.79-39.83,10.47-6,23.3-7.25,34.91-4.26C83.2,35.32,72.6,45.05,62.17,55Z"
+		transform="translate(-34.82 -9.81)" />
+	<path
+		d="M92.43,66.66c7.07-10,13.43-20.55,20.42-30.64,15.66,13.91,19.56,38.78,9,56.83-10,18.34-33.16,27.83-53.13,21.81,10.39-9.81,20.52-19.88,31.1-29.47-21.58,15.45-42.89,31.26-64.31,46.92,14-13.36,28.92-25.8,43.23-38.85,12.66-11.05,25.06-22.42,37.78-33.41C108.59,62.51,100.46,64.45,92.43,66.66Z"
+		transform="translate(-34.82 -9.81)" />
+	<path
+		d="M54.33,140.48H48.86l.83-5.79h5.45l.27-1.89-.58-.69h4.11l-.38,2.58h5.49l-.83,5.79H57.75l-.65,4.59H53.68Zm.23-1.71.35-2.37H52.85l-.32,2.37Zm3.77-2.37L58,138.77h2.07l.33-2.37Z"
+		transform="translate(-34.82 -9.81)" />
+	<path
+		d="M76.4,143.06l-1.39,2H69.2l-.45-.41-.58.41H64.75l2.47-1.8L65.87,142l.23-1.71h-.66l.23-1.71h.67l.09-.57h2.39l-.09.57h1.71l.09-.57h2.39l-.09.57h.71l-.24,1.71h-.7L72.37,142l-1.71,1.24,1.74,1.62,2.85-4.14-1.57-3.16h2.74l.43.86.59-.86v0l.33-2.38h-.65l-.61,1.71H73.77l1.55-4.37-.34-.42h3.24l-.49,1.37h3.53L81,135.19H80.5l-.32,2.38L78,140.75l2.16,4.32H77.41Zm-9.33-7.18h-1l.25-1.71H69l.19-1.39-.3-.67h2.79l-.29,2.06h2.74l-.26,1.71H72.8l.83,2.05H71.57l-.5-1.24-.18,1.24H68.5l.19-1.37-.88,1.37h-2Zm1.66-2.06h-2l-.15-1.36h2.06Zm1.37,7.37.11-.87H68.5l-.11.87.75.7Zm2.25-8.73H74.4l-.54,1.36h-2Z"
+		transform="translate(-34.82 -9.81)" />
+	<path
+		d="M86.78,144.77l.44-3.08H82.43l1.1-7.87h4.78l.15-1-.6-.69H92l-.25,1.71h4.8l-1.1,7.87H90.64l-.15,1H96l.76-.67-.38,2.72Zm.67-4.79.2-1.37H85.94l-.2,1.37Zm-1.28-3.08h1.71l.18-1.37H86.37ZM92.58,140l.2-1.37H91.05L90.87,140Zm-1.1-4.45-.18,1.37H93l.2-1.37Z"
+		transform="translate(-34.82 -9.81)" />
+	<path
+		d="M105.13,140.66l-.11,4.41h-2.74v-.48l-4.28.48.25-1.67,1.73-5.47H99l.25-1.71h6.84l-.25,1.71h-3.14l-1.63,5.13,1.26-.15,0-2.25Zm1.09-7.86-.23,1.71H99.83l.24-1.71Zm1.57,3.08h-1l.25-1.71h1.15l.36-1.44-.54-.62h3.42l-.5,2.06h3.29l-1.37,9.72a1.4,1.4,0,0,1-1.4,1.18h-2.86l1.58-1.65,1.06-7.54h-.73l-2.27,9.19h-2.74Z"
+		transform="translate(-34.82 -9.81)" />
+</svg>

BIN
static/img/logo-small.png


+ 209 - 0
static/img/logo.svg

@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 599 600" style="enable-background:new 0 0 599 600;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#A3D625;}
+	.st1{fill:#1677FF;}
+	.st2{clip-path:url(#SVGID_2_);}
+	.st3{fill:url(#SVGID_3_);}
+	.st4{filter:url(#Adobe_OpacityMaskFilter);}
+	.st5{fill:url(#SVGID_4_);}
+	.st6{mask:url(#glossy_1_);fill:#FFFFFF;}
+	.st7{filter:url(#Adobe_OpacityMaskFilter_1_);}
+	.st8{fill:url(#SVGID_6_);}
+	.st9{mask:url(#SVGID_5_);fill:#FFFFFF;}
+</style>
+<g>
+	
+		<image style="overflow:visible;opacity:0.3;" width="106" height="97" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAABhCAYAAAA+5jRUAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACSdJREFUeNrsnety4jgUhGUgBMiN
+SXYy+2D7Gvs0+xr7YjO5QAIEws07VKknTXPksAO2wchVKidUKj/4qvu0jmXJuXjFK177u5L4FeR3
+/fX3fZLxnaf84b///EgjqHLAJBl3hpLSCAKLoPYDhu9J4PdEvm/AWco9tWBFULvBsUaN7jX5TCEt
+PKAF/WzCasSvfic4NRn1wM81qU2AM/eDIS61fkVF7QanLqMh9zrBSqg2LQnQlMbMf/ZLWayqqCgb
+ECDVAnAaNM7ofkafW5BgcYDj5PMkJJ4IylYPvmB82QpmNZp+6M8KiWHM/AC4uf+9lgXp5EEJIFYP
+W5iCOafRpLtCcmJ1DKgeAJNGULa9ad2x4ABKi+4tgQVINaMWzUg9bHOc9Jac+E4eVABQXWxN4bRp
+tGhAYVmA5vQ76tL7zzHx96n8XXrS8TwAiNUTgtOh0SYlQXE1CQozCQwrIOOf403uY4E1l3nUaSkq
+A5Cqp0UwVvcLubfJ5gDYSSCAasYGHAYERbGa5mx/VmeiUWFALhAQYFktAnThxyX9fCEqYkBsZzMB
+shojgTM27G5m1Kk01OtrVFhFNQF0RvbWFjhXdIeK2OZqAmjhv3SAGXo4QwIFOFY9mlshIquD3qio
+zVmAWmRtgIJxTWrqECAoiOdAE4Kjg5X0LjVolpXyPnvM0aigzdWlBrVIQZcEBgOwUIuaBiDUHqhm
+QPeB/3wUsLi52ts2CqoUqIDNcUgAIMC48YMhXVJYaPj/tyRAbwLl1Y+QiqakHo7dy23VUxlQoiLL
+5lRBKzhdusPqUItQh1ID0ArKi9yHVI/GWyrotwAdLSipRZbNISRANV0Z15To2ObmhoJWYPr+zpDY
+5jIB7QKHr+SIrU5trhMA9IXUhFSHsOBocjoWBfUF0oBUhDqkKS7dN6CjAmVYnaa5C7G4LwRIra7p
+/8eSUhwUBDg9gvRKgWFsdBMWeQI6GusLWB2nuStS0ArOLYFCcEAtapCKMA9iBfVoIDSMSEXam1vm
+DegoFJVhdW1REQDdEagbSnRNSXOwuRcC80xK4lqU1ZPLHdDBg/KQNHaf04QVKgIgDNSjC68iDgsT
+/+W/koKeCVZfapHG7U9bPScDKlCPmtSXuxSb+8MPKOnaqEVIcwNS0QrQk9SjgaiI0xzmQq5oSAcH
+KqMesdV1BRAr6cr/7Zn/H3MKC6hDAGRZnUbuUmzuoEF9Uo/Y6u48oK9Uk7r+bxAYUorcAwHEkF6M
+RLcRFsoEdFCgBFLDqEcIDHceENT0herRuQeMRIda1CNADAmx+2BVdFCgCBKWYnE9upLAoJC4HiF2
+c6KDih4JklrdwaroYEAJJCipTR0GtTpA0nqEHt0bJbongcSpbnQMKjoIUAYkKImtDmDuKTgAErrd
+S7I6JLpHAvRE9Wgok9eDVlHpoAKQ2gTplgDdU3DAJPbc1zNOdX1SEEP6zOrSQ4dUSgtpC0ioRStA
+3whS11tik6L3WALDgx9cjzjVbVjdoQMqRVH/A9I3P+4NSI7qEQLDA41H/xmit1rd4lhUVIqiAvOk
+VgDSnwakM4KEegQV/fBDIYVSnTsmSIWBMuZJWUrKgjT1kPoE6bsBSevR0VldmTUqESVdUHAIQepQ
+stsGUl+6DEdrdYWDoi64dsCvKYJrcLjximtQp2G4hd0NqaF61FZXKCh5VAHL444DJzyG1CFIE+rX
+MSTEcMyRONn9gnTsgHIH9UldyoLU9uqbE6RnD4WTHc+RRlayqwqk3EAZCS80of3qx623wjY1VjFH
+4vit9Ujj96KKkPK2Pis8oC7dufUHflqTJoF69CD16M3qNFQNUi6gMsLDlbOfJ6EmnRmQflCye5Bk
+93bMnYZSQQXqUkfqUggSmqsDHxAQv79TW0jnSJWJ34WB2iI83AqkLjVYMZkdEiS2uyeqSZWM30Vb
+3zZ16c7/DkgJtYX6PiyEIFU2fhcCKlCX2m5zMQogXXmQeFTxJuHhQYKDQlpU3er0quVkeS33sTiS
+IVkx3OqCcwQfVn2OVKT1qZrY8m4zIE2MuRK3hMy+3alB2hnUJy2iG4LEC1H48blC4prE86RKz5GK
+UFTiwl1xXrCPJV1YiDKl1hAnvCfpOJxkcNgrKHlaqxPbG4LUlYTHMZwTHhqsr9JxWJw6pN8OE1s8
+COT3kzjh4RF634DEdWlCkE4a0D5SnxUg9H1ZQOJG64tYngVpGuvSjtYXCBCsJn7Lr2PUJViePq4Y
+0lxpESHtrqhQgGA14YVmrUu69q4XUNIiQtoBlFGbzt3m2xY3RueBny2Fnsy+R0j7s77P1ARIWBPO
+HXF+7aXnNpd0xZq0D0VtoSbeHgALJXnlEL9A1g9AWkZIu1sfQCFA6Pu0125zXTj38RRSnCvt2/oy
+1kDA9hAeWm59HR5Snr5AFudKOSvKejsdGz91xPKGZHnPbnMVa5wr7VNRGY8xAAqQ9FUYvGURIRWY
++qwJLm/pyZY3dx8LJnuS8GJdyhEUhwhEct4kF9uoObf+emYv1qWCQAVCxDmBwvY1sLyZqInf9os9
+vBwVZe37wFtP4z1a9PIQx3k3lFiX8gQl51bo7pItw/Km7uON9H6gLkVIOSmKj+Lhzdxbbn2voXdS
+U58sbyM8xNq0f1Bcn9j2eMN25z62+MSGUC8UHqLl5QkqY8ubkJqwnQ3vuxotr0BF8dvrfAwPtp2e
+UxcCO0YOouUVAMrYS1wPHGE1YQHl0G3uYBwtrwBFJRmQeEdJrBnHrpEcxaPl5QzKOoCETx3D3qy8
+BTVDipaXNyjjzL+6Wz8JE4da4Q2/kdvcVT9aXoGK0lPLcDwcLA+buo8CdSmueyjQ+upyd+7j9Jcl
+2R4ffwClpdHy8gVlncHE5/jx4Yo4iidaXpGgjPpUMyDhNOZ3AbXxPm38avNXFCvLieXhdMyJQIpv
+XZRUo3DxubJ8LsXErZ8+xkchxKvACS8AMSRAmBGok9iM41BBpYaSHFnfzK2fJRshlQwKZ/S9exCJ
+Wz9ee6sTmeOVDyhWkwYIR+lPz0J3UU35Xr8WYPovWtUE5UycfXT2Msbxcq1vST8vKAmmEjRibSro
+2thOW44GSmROleqIkEoCZXQpkkAdi3WpbFAGsLUrAopXvOIVr3gVcP0nwAARPm05BWtZVgAAAABJ
+RU5ErkJggg==" transform="matrix(1 0 0 1 151 60)">
+	</image>
+	<g>
+		<path class="st0" d="M194.09,99.02c15.41-13.93,32.88-24.14,51.3-30.7c-20.08,2.65-39.58,11.2-55.73,25.81
+			c-16.15,14.61-26.6,33.16-31.23,52.86C166.79,129.31,178.69,112.95,194.09,99.02z"/>
+	</g>
+</g>
+<g>
+	<path class="st1" d="M221.79,418.97l0.01-0.06h-12.27c-2.43,8.79-3.76,13.59-4.01,14.39h12.33L221.79,418.97z"/>
+	<path class="st1" d="M183.26,418.91h-12.33c0,0.46-0.22,5.26-0.67,14.39h12.27L183.26,418.91z"/>
+	<polygon class="st1" points="434.63,422.56 390.06,422.5 387.2,440.12 431.77,440.18 	"/>
+	<polygon class="st1" points="100.76,419.25 83.59,524.52 104.08,524.52 121.25,419.25 	"/>
+	<path class="st1" d="M87.43,479.08H71.04c0.82-4.8,1.45-8.58,1.9-11.34l3.02-18.6h16.05l2.7-17.62H59.07
+		c-1.6,9.87-2.83,17.54-3.69,23.03c-1.69,10.17-3.5,21.17-5.42,32.99l-1.49,9.16h36.26L87.43,479.08z"/>
+	<path class="st1" d="M123.45,431.52l-2.71,17.68h16.51c-0.71,4.15-1.21,7.12-1.51,8.92l-2.13,13.13c-0.28,1.73-1.06,3.3-2.32,4.72
+		c-2.03,2.07-4.25,3.11-6.67,3.11h-8.46l-2.7,17.62h18.09c0.42,0,1.09,0.02,2.01,0.06c3.15,0,6.38-1,9.7-2.99
+		c4.86-3.42,7.7-7.64,8.51-12.67l8.06-49.57H123.45z"/>
+	<path class="st1" d="M179.94,469.12h16.48l2.92-17.96c3.37,0.04,5.98,0.06,7.83,0.06h9.68l2.54-15.6h-17.51l2.92-17.96H188.3
+		l-2.91,17.91h-17.52l-2.54,15.6h17.52L179.94,469.12z"/>
+	<path class="st1" d="M214.32,454.67h-12.16l-0.13,0.06c0.02,0.12-0.2,4.91-0.67,14.39h12.27c0.41-7.49,0.59-11.34,0.56-11.57
+		C214.35,455.63,214.4,454.67,214.32,454.67z"/>
+	<path class="st1" d="M248.33,417.7l0.01-0.06H229.9c-0.11,0.19-3.15,8.02-9.12,23.49h18.49c0.68-1.8,1.06-2.76,1.16-2.88
+		c0.71-2,1.1-2.99,1.18-2.99h8.24l-0.45,2.76c-2.28,14.01-5.74,27.18-10.39,39.5h-0.06c-0.32-3.92-0.45-8.46-0.37-13.65
+		c0.39-8.79,0.87-15.07,1.45-18.83h-15.27c0,0.23,0,0.37-0.01,0.4c-0.67,4.38-1.3,10.35-1.87,17.91
+		c-0.36,7.18-0.43,13.07-0.22,17.68c0.41,5.99,1.01,10.69,1.8,14.11c0.33,1.54,0.76,3.32,1.32,5.35c-4.49,4.68-9.09,7.02-13.82,7.02
+		h-0.06l-2.5,15.37h0.17c8.76,0,16.67-2.84,23.74-8.52c5.22,5.68,12.17,8.52,20.86,8.52h0.29l2.5-15.37c-4.76,0-8.67-2.3-11.72-6.91
+		c9.15-14.47,15.94-35.35,20.38-62.64l0.44-2.71h2.65l2.09-12.84h-24.26L248.33,417.7z"/>
+	<path class="st1" d="M175.04,469.12c0.3-0.88,1.64-5.7,4.02-14.45h-12.27c-2.61,9.44-3.95,14.24-4.01,14.39l0.11,0.06H175.04z"/>
+	<path class="st1" d="M196.08,507.35c1.85-1.96,3.44-3.93,4.77-5.93c1.89-2.88,3.43-6.01,4.64-9.38h4.72l2.57-15.83
+		c-14.59-0.04-26.07-0.06-34.44-0.06l0.69-4.26h-13.19l-0.27,1.67c-0.09,0.54-0.21,1.38-0.36,2.53l-0.12,0.06h-3.51l-2.58,15.89
+		h4.49c-0.03,1.15,0.08,2.67,0.36,4.55c0.39,2.34,1.03,4.63,1.94,6.85c0.6,1.5,1.55,3.2,2.85,5.12c-4.28,1.27-8.57,1.9-12.87,1.9
+		h-0.06l-2.02,12.44h0.35c9.25,0,17.99-1.63,26.2-4.89c7.19,3.26,15.39,4.89,24.61,4.89h0.35l2.02-12.44
+		c-4.38,0-8.48-0.63-12.31-1.9C195.05,508.37,195.44,507.96,196.08,507.35z M188.64,494.97c-1.24,1.73-3.11,3.68-5.62,5.87
+		c-0.84-1-1.61-2.03-2.32-3.11c-1.31-2.34-2.14-4.22-2.48-5.64l0.01-0.06h12.39C190.08,492.96,189.42,493.93,188.64,494.97z"/>
+	<path class="st1" d="M421.66,502.57c-0.75-1.53-0.87-3.84-0.38-6.91l0.32-1.96h-16.94l-0.59,3.63c-0.39,2.42-0.61,4.72-0.66,6.91
+		h-8.07c7.73-21.8,11.64-32.86,11.73-33.16h20.45c1.11,0,2.86,0.02,5.23,0.06l2.86-17.62h-50.47c-0.27,0-0.67-0.02-1.2-0.06
+		l-0.08,0.11l-2.85,17.5h6.34c-7.81,22.03-11.73,33.14-11.76,33.34l-2.52,15.49h37.22c3.55,2,8.44,2.99,14.66,2.99h0.35l2.66-16.35
+		C425.07,506.54,422.96,505.22,421.66,502.57z"/>
+	<path class="st1" d="M351.88,428.89l-8.01,11.71h6.52c1.37,0,2.6,0.82,3.12,2.09c0.52,1.26,0.23,2.71-0.74,3.67l-53.68,53.27
+		l-1.16,7.16c-0.7,4.3-0.68,7.5,0.05,9.61c1.29,4.38,5.33,6.56,12.13,6.56h48.92l0.86-16.29h-29.14c-0.85,0-1.6-0.06-2.28-0.17
+		c-2.32-0.62-3.26-2.3-2.81-5.07l0.56-3.46h20.35c9.77,0,18.98-7.92,20.57-17.68l8.36-51.41H351.88z"/>
+	<path class="st1" d="M296.09,462.56c-1.21,0-2.32-0.64-2.92-1.69c-0.6-1.04-0.6-2.33,0.01-3.37l16.65-28.6h-27.7l-11.23,69.09
+		h20.36l15.21-35.42H296.09z"/>
+	<path class="st1" d="M565.01,449.82c-4.15,0-8.13,2.17-10.73,5.44h-8.06c-9.89,0-19.24,8.03-20.84,17.89l-5.02,30.89
+		c-0.56,3.47-3.96,6.41-7.42,6.41c-1.47,0-2.73-0.54-3.57-1.52c-0.86-1.01-1.2-2.41-0.95-3.93l9.22-56.71
+		c0.82-5.02-0.42-9.76-3.48-13.36c-3.01-3.54-7.4-5.49-12.36-5.49h-18.55c-0.01,0-0.02,0.01-0.04,0.01h-16.93
+		c0.02-0.12,0.87-4.05,2.55-11.8h-16.77c-1.67,7.64-2.51,11.55-2.54,11.75h-7.84l-2.85,17.56c2.14,0.04,3.81,0.06,5,0.06h1.85
+		c-2.75,12.4-4.16,18.73-4.24,19c-0.54,2.61-4.68,21.57-12.41,56.89h16.71l0.13-0.06c0.1-0.61,0.82-3.99,2.17-10.13l14.42-65.7h6.34
+		l-0.08,0.12l-7.5,46.12c-0.41,2.5-1.09,4.7-2.06,6.62c-1.44,2.46-3.02,3.68-4.75,3.68h-0.35l-3.14,19.35h0.4
+		c8.83,0,15.44-3.05,19.81-9.16c3.15-3.99,5.55-11.11,7.22-21.36l8.21-50.5h14.19c1.47,0,2.73,0.54,3.57,1.52
+		c0.86,1.01,1.2,2.41,0.95,3.93l-9.22,56.71c-0.82,5.02,0.42,9.76,3.48,13.36c3.01,3.54,7.4,5.49,12.36,5.49
+		c9.89,0,19.24-8.03,20.84-17.89l5.02-30.89c0.56-3.47,3.96-6.4,7.42-6.4h7.09c1.54,3.26,4.81,5.44,8.96,5.44h11.2
+		c1.55-6.01,3.74-9.89,5.03-12.18l0.33-0.59c1.65-2.98,3.74-6.59,6.22-10.54H565.01z"/>
+</g>
+<polygon class="st0" points="337.11,444.37 360.44,410.25 325.71,410.25 297.34,458.99 312.23,458.99 295.48,497.98 349.51,444.37 
+	"/>
+<g>
+	<path class="st1" d="M385.55,107.65L335.51,184c-2.36,3.6,1.01,8.2,5.16,7.04l40.81-11.43c3.62-1.01,6.12,3.56,3.32,6.06
+		L191.5,360.05c-1.71,1.52,0.42,4.15,2.27,2.8l159.45-119.46l-93.01,88.94c12.45,3.43,25.64,5.1,39.27,4.7
+		c68.88-2.04,125.31-57.56,128.33-126.36C429.6,169.95,412.97,133.07,385.55,107.65z"/>
+	<path class="st1" d="M203.44,223.17L391.1,54.21c1.73-1.55-0.44-4.21-2.31-2.83L233.66,167.31l96.25-90.46
+		c-12.41-3.33-25.54-4.91-39.1-4.44c-68.14,2.36-123.98,57.04-127.59,125.08c-2.13,40.12,13.63,76.59,40.01,102.19l47.57-71.61
+		c3.25-4.9-1.37-11.19-7.02-9.56l-36.98,10.69C203.18,230.25,200.64,225.69,203.44,223.17z"/>
+</g>
+<g id="gloss1_00000140719910015191806510000000879093940580873901_">
+	<g>
+		<defs>
+			<ellipse id="SVGID_1_" cx="332.89" cy="424.32" rx="13.24" ry="13.24"/>
+		</defs>
+		<clipPath id="SVGID_2_">
+			<use xlink:href="#SVGID_1_"  style="overflow:visible;"/>
+		</clipPath>
+		<g class="st2">
+			
+				<radialGradient id="SVGID_3_" cx="-9313.8955" cy="-3935.9463" r="33.1892" gradientTransform="matrix(0.3628 0.0227 -0.0167 0.2667 3645.5417 1691.3226)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#85FF0A"/>
+				<stop  offset="0.0182" style="stop-color:#80F50A"/>
+				<stop  offset="0.1339" style="stop-color:#62BD07"/>
+				<stop  offset="0.2529" style="stop-color:#488A05"/>
+				<stop  offset="0.3727" style="stop-color:#326004"/>
+				<stop  offset="0.4935" style="stop-color:#203D02"/>
+				<stop  offset="0.6155" style="stop-color:#122201"/>
+				<stop  offset="0.7393" style="stop-color:#080F01"/>
+				<stop  offset="0.8659" style="stop-color:#020400"/>
+				<stop  offset="1" style="stop-color:#000000"/>
+			</radialGradient>
+			<path class="st3" d="M344.01,431.32c-0.31,4.89-5.95,8.51-12.6,8.1c-6.65-0.41-11.79-4.72-11.49-9.6
+				c0.31-4.89,5.95-8.51,12.6-8.1C339.18,422.13,344.32,426.43,344.01,431.32z"/>
+		</g>
+	</g>
+	<defs>
+		<filter id="Adobe_OpacityMaskFilter" filterUnits="userSpaceOnUse" x="326.09" y="413.7" width="18.26" height="16.31">
+			<feColorMatrix  type="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0"/>
+		</filter>
+	</defs>
+	<mask maskUnits="userSpaceOnUse" x="326.09" y="413.7" width="18.26" height="16.31" id="glossy_1_">
+		<g class="st4">
+			
+				<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="186.8262" y1="932.6534" x2="186.8262" y2="948.1934" gradientTransform="matrix(0.898 0.44 -0.44 0.898 581.2453 -504.7709)">
+				<stop  offset="0" style="stop-color:#FFFFFF"/>
+				<stop  offset="0.1092" style="stop-color:#E4E4E4"/>
+				<stop  offset="0.1847" style="stop-color:#BEBEBE"/>
+				<stop  offset="0.2961" style="stop-color:#8C8C8C"/>
+				<stop  offset="0.4102" style="stop-color:#616161"/>
+				<stop  offset="0.5249" style="stop-color:#3E3E3E"/>
+				<stop  offset="0.6405" style="stop-color:#232323"/>
+				<stop  offset="0.7573" style="stop-color:#0F0F0F"/>
+				<stop  offset="0.8761" style="stop-color:#040404"/>
+				<stop  offset="1" style="stop-color:#000000"/>
+			</linearGradient>
+			<path class="st5" d="M338.67,414.83c-4.67-2.29-10-1-11.9,2.88c-1.9,3.88,0.34,8.88,5.01,11.17c4.67,2.29,10,1,11.9-2.88
+				C345.58,422.11,343.34,417.11,338.67,414.83z"/>
+		</g>
+	</mask>
+	<path id="glossy_00000103968256788510311520000016260764353498998662_" class="st6" d="M338.67,414.83c-4.67-2.29-10-1-11.9,2.88
+		c-1.9,3.88,0.34,8.88,5.01,11.17c4.67,2.29,10,1,11.9-2.88C345.58,422.11,343.34,417.11,338.67,414.83z"/>
+	<defs>
+		<filter id="Adobe_OpacityMaskFilter_1_" filterUnits="userSpaceOnUse" x="325.2" y="432.93" width="9.67" height="5.73">
+			<feColorMatrix  type="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0"/>
+		</filter>
+	</defs>
+	<mask maskUnits="userSpaceOnUse" x="325.2" y="432.93" width="9.67" height="5.73" id="SVGID_5_">
+		<g class="st7">
+			
+				<radialGradient id="SVGID_6_" cx="211.7079" cy="924.947" r="2.6035" gradientTransform="matrix(1.8354 0.5393 -0.282 0.9588 202.3267 -565.1746)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0.0397" style="stop-color:#B0B0B0"/>
+				<stop  offset="0.0632" style="stop-color:#A7A7A7"/>
+				<stop  offset="0.2034" style="stop-color:#747474"/>
+				<stop  offset="0.3418" style="stop-color:#4B4B4B"/>
+				<stop  offset="0.4758" style="stop-color:#2A2A2A"/>
+				<stop  offset="0.604" style="stop-color:#131313"/>
+				<stop  offset="0.7241" style="stop-color:#050505"/>
+				<stop  offset="0.8278" style="stop-color:#000000"/>
+			</radialGradient>
+			<path class="st8" d="M334.81,437.2c-0.41,1.38-2.87,1.87-5.51,1.09c-2.64-0.78-4.45-2.52-4.04-3.9c0.41-1.38,2.87-1.87,5.51-1.09
+				C333.41,434.08,335.22,435.82,334.81,437.2z"/>
+		</g>
+	</mask>
+	<path class="st9" d="M334.81,437.2c-0.41,1.38-2.87,1.87-5.51,1.09c-2.64-0.78-4.45-2.52-4.04-3.9c0.41-1.38,2.87-1.87,5.51-1.09
+		C333.41,434.08,335.22,435.82,334.81,437.2z"/>
+</g>
+<path class="st0" d="M440.71,115.76c-6.15,0-11.14,4.99-11.14,11.14c0,6.15,4.99,11.14,11.14,11.14s11.14-4.99,11.14-11.14
+	C451.85,120.74,446.86,115.76,440.71,115.76z M440.73,131.44h-7.81v-1.71l4.66-5.61h-4.44v-2.03h7.57v1.93l-4.41,5.38h4.73
+	L440.73,131.44z M445.52,131.61c-2.58,0-3.95-1.21-4.16-3h2.67c0.16,0.81,0.73,1.16,1.61,1.16c0.83,0,1.21-0.29,1.21-0.83
+	c0-0.61-0.41-0.85-1.89-1.2c-2.76-0.67-3.31-1.67-3.31-2.93c0-1.57,1.15-2.88,3.75-2.88c2.71,0,3.81,1.37,3.94,2.84h-2.65
+	c-0.07-0.5-0.33-1.01-1.3-1.01c-0.63,0-1.01,0.24-1.01,0.74c0,0.51,0.34,0.7,1.78,1.06c2.88,0.72,3.45,1.75,3.45,3.08
+	C449.61,130.4,448.26,131.61,445.52,131.61z"/>
+</svg>

+ 9 - 0
static/img/map.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16.958" height="15.758" viewBox="0 0 16.958 15.758">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.05" y1="0.428" x2="0.978" y2="0.575" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#8ff8fb"/>
+      <stop offset="1" stop-color="#47aeff"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_7779" data-name="路径 7779" d="M44.624,81.4,42.9,76.8a1.152,1.152,0,0,0-1.12-.7H40.448a15.663,15.663,0,0,1-2.935,2.814l-.151.121a1.865,1.865,0,0,1-1.12.393,1.954,1.954,0,0,1-1.15-.393l-.151-.121a15.5,15.5,0,0,1-2.905-2.784H30.553a1.2,1.2,0,0,0-1.15.7l-1.634,4.479c-.272.726.545,1.453,1.422,1.241l3.662-.757a1.4,1.4,0,0,1,1,.182l2.905,1.846A1.508,1.508,0,0,0,37.785,84l5.992-1.3a1.124,1.124,0,0,0,.726-.484.894.894,0,0,0,.121-.817Zm-8.776-3.087a.552.552,0,0,0,.726,0c1.3-1.21,3.783-3.45,3.783-5.961a4.146,4.146,0,0,0-8.291,0C32.066,74.864,34.517,77.073,35.848,78.313Zm.363-7.5a1.528,1.528,0,1,1-1.543,1.513A1.524,1.524,0,0,1,36.211,70.809Zm0,0" transform="translate(-27.715 -68.267)" fill="url(#linear-gradient)"/>
+</svg>

BIN
static/img/marker.active.png


BIN
static/img/marker.png


Fișier diff suprimat deoarece este prea mare
+ 21 - 0
static/img/my-bg.svg


+ 9 - 0
static/img/my-icon01.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30">
+  <g id="组_8046" data-name="组 8046" transform="translate(-78 -375)">
+    <g id="组_8045" data-name="组 8045" transform="translate(15 2.239)">
+      <path id="路径_7808" data-name="路径 7808" d="M27.2.7a1.02,1.02,0,0,1,1.02,1.02V6.391a6.31,6.31,0,0,0,0,11.695v4.672a1.02,1.02,0,0,1-1.02,1.02H2.72a1.02,1.02,0,0,1-1.02-1.02V18.093a6.357,6.357,0,0,0,3.944-5.854A6.357,6.357,0,0,0,1.7,6.384V1.72A1.02,1.02,0,0,1,2.72.7H27.2m0-1.7H2.72A2.72,2.72,0,0,0,0,1.72v5.95a4.61,4.61,0,0,1,3.944,4.569A4.61,4.61,0,0,1,0,16.808v5.95a2.72,2.72,0,0,0,2.72,2.72H27.2a2.72,2.72,0,0,0,2.72-2.72V16.8a4.61,4.61,0,0,1,0-9.124V1.72A2.72,2.72,0,0,0,27.2-1Z" transform="translate(63 375.761)"/>
+      <path id="路径_7809" data-name="路径 7809" d="M376.1,421.4a1.125,1.125,0,1,1,1.949,1.125l-1.82,3.151h1.783a1.125,1.125,0,1,1,0,2.25h-3v2.25h3a1.125,1.125,0,1,1,0,2.251h-3V435.8a1.125,1.125,0,1,1-2.25,0v-3.376h-3a1.125,1.125,0,0,1,0-2.251h3v-2.25h-3a1.125,1.125,0,0,1,0-2.25h1.782l-1.819-3.151a1.125,1.125,0,1,1,1.949-1.125l2.214,3.833Z" transform="translate(-295.64 -40.212)" fill="#8ef7fb"/>
+    </g>
+    <rect id="矩形_3920" data-name="矩形 3920" width="30" height="30" transform="translate(78 375)" fill="none"/>
+  </g>
+</svg>

+ 12 - 0
static/img/my-icon02.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30">
+  <g id="组_8038" data-name="组 8038" transform="translate(-127 -373)">
+    <g id="组_8037" data-name="组 8037" transform="translate(61.437)">
+      <g id="组_8036" data-name="组 8036" transform="translate(0 1)">
+        <path id="路径_7800" data-name="路径 7800" d="M198.267,52.763a4.147,4.147,0,0,1,4.147,4.147V74.537a4.147,4.147,0,0,1-4.147,4.147H185.824a4.147,4.147,0,0,1-4.147-4.147V56.91a4.147,4.147,0,0,1,4.147-4.147h12.442Zm0,2.074H185.824a2.074,2.074,0,0,0-2.074,2.074V74.537a2.074,2.074,0,0,0,2.074,2.074h12.442a2.074,2.074,0,0,0,2.074-2.074V56.91a2.074,2.074,0,0,0-2.074-2.074Z" transform="translate(-111.114 323.316)" fill="#2b303a"/>
+        <rect id="矩形_3915" data-name="矩形 3915" width="10" height="2.6" rx="1.3" transform="translate(76 372)" fill="#2b303a"/>
+      </g>
+      <path id="路径_7801" data-name="路径 7801" d="M88.669,100.865a.932.932,0,0,1-.786-1.346l3.588-6.28a.879.879,0,0,1,.786-.449.853.853,0,0,1,.772.449.842.842,0,0,1,.014.9L90.21,99.07h3.841a.93.93,0,0,1,.784,1.346l-3.588,6.28a.847.847,0,0,1-.545.422.94.94,0,0,1-.687-.1.8.8,0,0,1-.42-.533.987.987,0,0,1,.083-.687l2.831-4.934Z" transform="translate(-10.427 290.387)" fill="#8ef7fb" stroke="#8ef7fb" stroke-width="0.5"/>
+    </g>
+    <rect id="矩形_3916" data-name="矩形 3916" width="30" height="30" transform="translate(127 373)" fill="none"/>
+  </g>
+</svg>

+ 11 - 0
static/img/my-icon03.svg

@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30.2" viewBox="0 0 30 30.2">
+  <g id="组_8040" data-name="组 8040" transform="translate(-219 -372.9)">
+    <g id="组_8039" data-name="组 8039" transform="translate(92.022 307.076)">
+      <path id="路径_7802" data-name="路径 7802" d="M150.528,156.062H131.2a3.222,3.222,0,0,1-3.221-3.221V131.371a3.222,3.222,0,0,1,3.221-3.221h15.03a1.074,1.074,0,0,1,0,2.147H131.2a1.079,1.079,0,0,0-1.074,1.074v21.471a1.075,1.075,0,0,0,1.074,1.074h19.324a1.072,1.072,0,0,0,1.074-1.074V135.659a1.074,1.074,0,0,1,2.147,0v17.177A3.222,3.222,0,0,1,150.528,156.062Z" transform="translate(0 -60.138)" fill="#2b303a" stroke="#2b303a" stroke-width="0.2"/>
+      <path id="路径_7803" data-name="路径 7803" d="M580.98,78.742a1.076,1.076,0,0,1-.762-1.835L590.89,66.24a1.073,1.073,0,1,1,1.518,1.518L581.736,78.43A1.071,1.071,0,0,1,580.98,78.742Z" transform="translate(-436.76 0)" fill="#8ef7fb" stroke="#8ef7fb" stroke-width="0.2"/>
+      <path id="路径_7804" data-name="路径 7804" d="M263.472,386.082h-6.441a1.074,1.074,0,0,1,0-2.147h6.441a1.074,1.074,0,0,1,0,2.147Z" transform="translate(-123.685 -307.34)" fill="#8ef7fb" stroke="#8ef7fb" stroke-width="0.2"/>
+      <path id="路径_7805" data-name="路径 7805" d="M269.919,578.051H257.031a1.074,1.074,0,1,1,0-2.147h12.882a1.074,1.074,0,0,1,.006,2.147Z" transform="translate(-123.685 -492.867)" fill="#8ef7fb" stroke="#8ef7fb" stroke-width="0.2"/>
+    </g>
+    <rect id="矩形_3917" data-name="矩形 3917" width="30" height="30" transform="translate(219 373)" fill="none"/>
+  </g>
+</svg>

+ 9 - 0
static/img/my-icon04.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="30.1" height="30.1" viewBox="0 0 30.1 30.1">
+  <g id="my-icon04" transform="translate(-311.9 -372.9)">
+    <g id="组_8041" data-name="组 8041" transform="translate(308.562 369.345)">
+      <path id="路径_7806" data-name="路径 7806" d="M18.274,33.344a1.531,1.531,0,0,1-.993-.363l-5-4.233a15.643,15.643,0,0,1-2.213-1.072A12.763,12.763,0,0,1,3.438,16.757a11.746,11.746,0,0,1,1.188-5.143A13.134,13.134,0,0,1,7.831,7.448a15.144,15.144,0,0,1,4.712-2.785,16.79,16.79,0,0,1,11.478.006A14.966,14.966,0,0,1,28.733,7.45a13.1,13.1,0,0,1,3.2,4.165,11.7,11.7,0,0,1,1.19,5.148,12.005,12.005,0,0,1-2.7,7.544,14.672,14.672,0,0,1-6.636,4.629L19.3,32.955a1.546,1.546,0,0,1-1.025.389Zm.011-27.626c-7.029,0-12.749,4.951-12.749,11.038A10.726,10.726,0,0,0,11.146,25.9a13.513,13.513,0,0,0,2.061.983l.173.064,4.889,4.139L22.7,27.122l.207-.068c4.863-1.64,8.129-5.773,8.129-10.293,0-6.092-5.718-11.043-12.747-11.043Z" transform="translate(0 0)" fill="#2b303a" stroke="#2a3039" stroke-width="0.2"/>
+      <path id="路径_7807" data-name="路径 7807" d="M296.748,444.182a6.835,6.835,0,0,1-4.513-1.645,5.428,5.428,0,0,1-1.931-4.112,1.047,1.047,0,0,1,2.093,0c0,2.036,1.95,3.689,4.351,3.689s4.351-1.653,4.351-3.689a1.047,1.047,0,0,1,2.093,0,5.431,5.431,0,0,1-1.931,4.114,6.835,6.835,0,0,1-4.513,1.645Z" transform="translate(-278.489 -421.073)" fill="#8ef7fb" stroke="#8ef7fb" stroke-width="0.2"/>
+    </g>
+    <rect id="矩形_3918" data-name="矩形 3918" width="30" height="30" transform="translate(312 373)" fill="none"/>
+  </g>
+</svg>

+ 9 - 0
static/img/my-icon05.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30.4" viewBox="0 0 30 30.4">
+  <g id="组_8048" data-name="组 8048" transform="translate(-155 -514.8)">
+    <g id="组_8047" data-name="组 8047" transform="translate(2)">
+      <path id="路径_7810" data-name="路径 7810" d="M77.172,0c1.95,2.014,7,3.489,13.078,3.686V16.879C90.25,23.417,81.342,30,77.125,30S64,23.4,64,16.879V3.686C70.086,3.5,75.143,2.014,77.093,0Zm-.039,2.372-.694.371A24.812,24.812,0,0,1,65.875,5.466V16.882c0,5.368,7.9,11.252,11.25,11.252s11.25-5.884,11.25-11.252V5.469a24.757,24.757,0,0,1-11.241-3.1Z" transform="translate(91 515)" fill="#2b303a" stroke="#2b303a" stroke-width="0.4"/>
+      <path id="路径_7811" data-name="路径 7811" d="M76.945,8.267l.3.019a4.461,4.461,0,0,1,.806,8.734.859.859,0,0,1,.015.184v3.829a1.276,1.276,0,1,1-2.55,0V17.2a.744.744,0,0,1,.015-.184,4.468,4.468,0,0,1,1.714-8.728Zm-.135,1.9a2.559,2.559,0,1,0,2.563,2.559A2.561,2.561,0,0,0,76.81,10.162Z" transform="translate(91.309 516)" fill="#8ef7fb" stroke="#8ef7fb" stroke-width="0.3"/>
+    </g>
+    <rect id="矩形_3921" data-name="矩形 3921" width="30" height="30" transform="translate(155 515)" fill="none"/>
+  </g>
+</svg>

BIN
static/img/my-sta-bg01.png


BIN
static/img/my-sta-bg03.png


+ 3 - 0
static/img/order-detail-arrow.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="130.066" height="13.689" viewBox="0 0 130.066 13.689">
+  <path id="联合_9" data-name="联合 9" d="M-4737,13.689V9.361h89V9.354h31.027l-6.616-6.616L-4620.85,0l9.354,9.354,4.563,4.334H-4737Z" transform="translate(4737)" fill="#2b303a"/>
+</svg>

BIN
static/img/order-detail-bg.png


BIN
static/img/order-detail-icon.png


BIN
static/img/page-bg00.jpg


BIN
static/img/page-bg01.png


+ 3 - 0
static/img/parkade.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="8.88" height="11.424" viewBox="0 0 8.88 11.424">
+  <path id="路径_7772" data-name="路径 7772" d="M-4.12-11.424V0h1.872V-4.384H.584c2.784,0,4.176-1.184,4.176-3.536,0-2.336-1.392-3.5-4.144-3.5Zm1.872,1.6H.472a2.92,2.92,0,0,1,1.808.448A1.7,1.7,0,0,1,2.872-7.92,1.785,1.785,0,0,1,2.3-6.432a3.053,3.053,0,0,1-1.824.448h-2.72Z" transform="translate(4.12 11.424)" fill="#fff"/>
+</svg>

+ 7 - 0
static/img/plug.svg

@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="10.676" height="14.679" viewBox="0 0 10.676 14.679">
+  <g id="组_7988" data-name="组 7988" transform="translate(-160 -42.688)">
+    <path id="路径_7774" data-name="路径 7774" d="M246.98,214.647a.333.333,0,0,0-.333.333v6.005a.333.333,0,0,0,.333.333h6.005a.333.333,0,0,0,.333-.333V214.98a.333.333,0,0,0-.333-.333Zm-1.668.333a1.669,1.669,0,0,1,1.668-1.668h6.005a1.669,1.669,0,0,1,1.668,1.668v6.005a1.669,1.669,0,0,1-1.668,1.668H246.98a1.669,1.669,0,0,1-1.668-1.668Z" transform="translate(-83.978 -167.956)" fill="#fff"/>
+    <path id="路径_7775" data-name="路径 7775" d="M166.673,53.363V55.7A1.668,1.668,0,0,1,165,57.367h-5V56.033h5a.335.335,0,0,0,.334-.333V53.363Zm-1.334-10.675v4H164v-4Zm2.668,0v4h-1.335v-4Z" fill="#fff"/>
+    <path id="路径_7776" data-name="路径 7776" d="M289,256h6.005a1,1,0,0,1,1,1v6.005a1,1,0,0,1-1,1H289a1,1,0,0,1-1-1V257A1,1,0,0,1,289,256Zm4.337,3.336h-2.669v1.335h2.669Z" transform="translate(-125.998 -209.976)" fill="#fff"/>
+  </g>
+</svg>

+ 8 - 0
static/img/power.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1723000985661"
+	class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12242"
+	xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
+	<path
+		d="M697.6 151.2c13.7-20.6 41.5-26.2 62.1-12.5C880.4 218.9 960 356.1 960 512c0 247.4-200.6 448-448 448S64 759.4 64 512c0-155.9 79.6-293.1 200.2-373.3 20.6-13.7 48.4-8.1 62.1 12.5 13.7 20.6 8.1 48.4-12.5 62.1-96.6 64.3-160.2 174.1-160.2 298.7 0 197.9 160.5 358.4 358.4 358.4 197.9 0 358.4-160.5 358.4-358.4 0-124.6-63.6-234.4-160.2-298.7-20.7-13.7-26.3-41.5-12.6-62.1zM512 64c23 0 41.9 17.3 44.5 39.6l0.3 5.2v352c0 24.7-20.1 44.8-44.8 44.8-23 0-41.9-17.3-44.5-39.6l-0.3-5.2v-352c0-24.7 20.1-44.8 44.8-44.8z"
+		p-id="12243" fill="#fff"></path>
+</svg>

+ 1 - 0
static/img/search.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717029771922" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10594" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M743.232 210.837333c144.896 144.896 149.781333 376.789333 14.656 527.573334l160.32 160.298666a8.533333 8.533333 0 0 1 0 12.074667l-33.173333 33.173333a8.533333 8.533333 0 0 1-12.074667 0l-161.557333-161.557333c-150.762667 120.746667-371.477333 111.253333-511.232-28.501333-149.973333-149.973333-149.973333-393.109333 0-543.061334 149.973333-149.973333 393.088-149.973333 543.061333 0z m-497.813333 45.248c-124.970667 124.970667-124.970667 327.594667 0 452.565334 124.970667 124.949333 327.594667 124.949333 452.565333 0 124.949333-124.970667 124.949333-327.594667 0-452.565334-124.970667-124.970667-327.594667-124.970667-452.565333 0z" fill="#2c2c2c" p-id="10595"></path></svg>

Fișier diff suprimat deoarece este prea mare
+ 4 - 0
static/img/seting.svg


BIN
static/img/shortcut1.png


BIN
static/img/shortcut2.png


BIN
static/img/shortcut3.png


BIN
static/img/shortcut4.png


BIN
static/img/site-bg01.png


+ 3 - 0
static/img/site-bg02.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="172" height="58" viewBox="0 0 172 58">
+  <path id="路径_7821" data-name="路径 7821" d="M8,0H164c4.418,0,8,4.155,8,9.28l-9,39.44c-1.666,4.648-3.582,9.28-8,9.28H8c-4.418,0-8-4.155-8-9.28V9.28C0,4.155,3.582,0,8,0Z" fill="#45e67d" opacity="0.2"/>
+</svg>

+ 3 - 0
static/img/site-bg03.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="172" height="58" viewBox="0 0 172 58">
+  <path id="路径_7822" data-name="路径 7822" d="M164,58H8c-4.418,0-8-4.155-8-9.28L9,9.28C10.666,4.632,12.582,0,17,0H164c4.418,0,8,4.155,8,9.28V48.72C172,53.845,168.418,58,164,58Z" fill="#bed2ff" opacity="0.2"/>
+</svg>

+ 9 - 0
static/img/site-bg04.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="334.85" height="42.155" viewBox="0 0 334.85 42.155">
+  <defs>
+    <linearGradient id="linear-gradient" x1="0.5" y1="-0.466" x2="0.5" y2="0.815" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#d5fdff"/>
+      <stop offset="1" stop-color="#8ad5ff" stop-opacity="0"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_7820" data-name="路径 7820" d="M-164.45-24.15l.95-7.15h30.25l-.95,7.15L-155.3,3.7h18.7l-.5,7.15h-30.7l.95-7.15,21.6-27.855Zm48.9-7.15L-117-14.915h11.15l1.35-13.555-1.45-2.83H-94.9l-3.85,42.155h-9.6l1.9-18.62h-11.2l-1.75,18.62H-129l3.85-40.069L-127.1-31.3Zm56,0a2.42,2.42,0,0,1,1.3.372,3.243,3.243,0,0,1,1.025,1.043,4.179,4.179,0,0,1,.575,1.564,5.9,5.9,0,0,1-.05,2.011l-3.35,37.165h-26.9a2.42,2.42,0,0,1-1.3-.372A3.242,3.242,0,0,1-89.275,9.44a4.207,4.207,0,0,1-.575-1.6,5.654,5.654,0,0,1,.05-1.974L-86.45-31.3ZM-77.8-24.15-80.2,3.7h11.05L-66.3-24.15Zm39.65-7.15L-28.1-4.86l2.4-26.44h8.2l-3.85,42.155h-9.6l-9.6-25.769-2.4,25.769H-51.6l3.85-39.324L-49.7-31.3Zm58.4,12.14h-9.6l.45-4.99H-.4L-2.8,3.7H8.7L9.2-4.86,6.3-12.01H19.25l-1.9,22.865H-9.55a2.42,2.42,0,0,1-1.3-.372A3.243,3.243,0,0,1-11.875,9.44a4.207,4.207,0,0,1-.575-1.6,5.654,5.654,0,0,1,.05-1.974L-9.05-31.3H21.2ZM76.4,2.29l.95-8.565H58.15L60.55-31.3h28.3L87.9-19.16H78.3l.5-4.99H69.65L68.2-13.425H87.4L85.5,5.865a5.945,5.945,0,0,1-.325,1.974,5.2,5.2,0,0,1-.875,1.6,4.237,4.237,0,0,1-1.225,1.043,2.907,2.907,0,0,1-1.425.372H56.7l.95-11.47,1.45,2.9ZM107.3-31.3l-1.45,16.385H117l1.35-13.555L116.9-31.3h11.05L124.1,10.855h-9.6l1.9-18.62H105.2l-1.75,18.62h-9.6L97.7-29.215,95.75-31.3Zm38.6,0-3.35,35h11.5l3.4-32.919L155.5-31.3h11.55L163.2,10.855H135.85a2.325,2.325,0,0,1-2.175-1.415,7.808,7.808,0,0,1-.725-3.575l3.35-35.079L134.85-31.3Z" transform="translate(167.8 31.3)" fill="url(#linear-gradient)"/>
+</svg>

+ 16 - 0
static/img/site-bg05.svg

@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="119.375" height="83" viewBox="0 0 119.375 83">
+  <defs>
+    <linearGradient id="linear-gradient" y1="0.5" x2="0.905" y2="0.5" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f32027"/>
+      <stop offset="1" stop-color="#f67014"/>
+    </linearGradient>
+    <linearGradient id="linear-gradient-2" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#f3a415"/>
+      <stop offset="1" stop-color="#fdce88"/>
+    </linearGradient>
+  </defs>
+  <g id="组_8090" data-name="组 8090" transform="translate(0 -868)">
+    <path id="路径_7855" data-name="路径 7855" d="M16,0H116.267L98,83H0V16A16,16,0,0,1,16,0Z" transform="translate(0 868)" fill="url(#linear-gradient)"/>
+    <path id="路径_7853" data-name="路径 7853" d="M213.292,83l20.3-53.869h-8.426L234.654,0h-14.3l-7.575,44.977h7.347Z" transform="translate(-115.279 868)" fill="url(#linear-gradient-2)"/>
+  </g>
+</svg>

+ 3 - 0
static/img/site-icon01.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="13.903" height="19" viewBox="0 0 13.903 19">
+  <path id="路径_7814" data-name="路径 7814" d="M196.423,85.787h-3.731a.7.7,0,0,1-.65-.942l3.707-9.73a.7.7,0,0,1,.649-.448h6.255a.7.7,0,0,1,.644.957l-2.158,5.3H205.2a.7.7,0,0,1,.522,1.153l-9.962,11.351a.7.7,0,0,1-1.194-.636l1.854-7Z" transform="translate(-191.997 -74.667)" fill="#2b303a"/>
+</svg>

BIN
static/img/site-icon02.png


BIN
static/img/site-icon03.png


Fișier diff suprimat deoarece este prea mare
+ 1 - 0
static/img/switch.svg


Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff