From ea689dd91eaa72425dc01759042c3b4eb2186512 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 17 六月 2026 10:14:44 +0800
Subject: [PATCH] 新增智能电表、空调管理

---
 h5/pages/login.vue |  538 ++++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 313 insertions(+), 225 deletions(-)

diff --git a/h5/pages/login.vue b/h5/pages/login.vue
index 0b3b772..a7ce852 100644
--- a/h5/pages/login.vue
+++ b/h5/pages/login.vue
@@ -1,225 +1,313 @@
-<template>
-  <view class="login">
-    <view class="login_title">娆㈣繋鐧诲綍</view>
-    <view class="login_title login_title2">闃滃畞鏂囦綋涓績</view>
-    <view class="login_list">
-      <view class="login_list_item">
-        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
-        <input v-model="form.username" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
-      </view>
-<!--      <view class="login_list_item">
-        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
-        <input v-model="form.password" type="password" placeholder="瀵嗙爜" />
-      </view> -->
-      <view class="login_list_item">
-        <image src="@/static/login_ic_password@2x.png" mode="widthFix"></image>
-        <input v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" type="text" />
-        <view class="btn">鑾峰彇楠岃瘉鐮�</view>
-      </view>
-    </view>
-    <view class="login_btn">
-      <view class="login_btn_n" @click="onLogin">鐧诲綍</view>
-    </view>
-  </view>
-</template>
-
-<script>
-import { loginPost, loginCaptcha, getUserInfo, getSystemDictData } from '@/api'
-import { mapState, mapMutations } from 'vuex'
-export default {
-  name: 'login',
-
-  data() {
-    return {
-      form: {
-        // username: '18056814089',
-        username: '',
-        password: '',
-				code: ''
-      },
-      isShowProtocol: false,
-      ProtocolFlag: false,
-      captcha: {},
-      htmlText: ''
-    }
-  },
-
-  onLoad() {
-    this.initCaptcha()
-  },
-  onBackPress(options) {
-    uni.redirectTo({
-      url: '/pages/login/login'
-    })
-    return true
-  },
-  methods: {
-    ...mapMutations(["setToken", "setUserInfo"]),
-    changeFalg() {
-      this.ProtocolFlag = !this.ProtocolFlag
-    },
-    getContent() {
-      getSystemDictData({
-        dictCode: 'SYSTEM',
-        label: 'USER_PROTOCOL'
-      }).then(res => {
-        this.htmlText = res.data.code
-        this.isShowProtocol = true
-      })
-    },
-    showContent() {
-      this.getContent()
-    },
-    initCaptcha() {
-      loginCaptcha().then(res => {
-        this.captcha = res.data
-      })
-    },
-
-    onLogin() {
-      const { form, ProtocolFlag } = this
-      if (!ProtocolFlag) return uni.showToast({
-        title: '璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁�',
-        icon: 'none'
-      })
-      if (!form.username) return uni.showToast({
-        title: '璐﹀彿涓嶈兘涓虹┖',
-        icon: 'none'
-      })
-      if (!form.password) return uni.showToast({
-        title: '瀵嗙爜涓嶈兘涓虹┖',
-        icon: 'none'
-      })
-      if (!form.code) return uni.showToast({
-        title: '楠岃瘉鐮佷笉鑳戒负绌�',
-        icon: 'none'
-      })
-      loginPost({
-        ...form,
-        uuid: this.captcha.uuid,
-        openId: this.$store.state.openId
-      }).then(res => {
-        if (res.code === 200) {
-          this.setToken(res.data)
-          getUserInfo().then(ress => {
-            this.setUserInfo(ress.data)
-            uni.redirectTo({
-              url: "/pages/staff/index"
-            })
-          })
-        }
-      })
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.login {
-  width: 100%;
-  height: 100vh;
-  display: flex;
-  padding-top: 130rpx;
-  box-sizing: border-box;
-  align-items: center;
-  flex-direction: column;
-  background: linear-gradient( 180deg, #C5DDFF 0%, #FFFFFF 100%);
-  .login_title {
-    font-weight: 500;
-    font-size: 52rpx;
-    color: #222222;
-    margin-top: 180rpx;
-		width: 100%;
-		padding-left: 60rpx;
-  }
-	.login_title2{
-		margin-top: 10rpx;
-		margin-bottom: 80rpx;
-	}
-  .login_list {
-    width: 100%;
-    padding: 0 60rpx;
-    box-sizing: border-box;
-    .login_list_item {
-      width: 100%;
-      border-radius: 50rpx;
-      height: 98rpx;
-      padding: 0 40rpx;
-      box-sizing: border-box;
-      background: #ffffff;
-      margin-bottom: 40rpx;
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      &:last-child {
-        margin-bottom: 0 !important;
-      }
-      image {
-        flex-shrink: 0;
-        width: 40rpx;
-        height: 40rpx;
-      }
-      .btn{
-      	width: 145rpx;
-      	color:  $primaryColor;
-      }
-      input {
-        flex: 1;
-        height: 100%;
-        color: #666666;
-        margin-left: 24rpx;
-        border: none;
-      }
-    }
-  }
-  .login_btn {
-    width: 100%;
-    padding: 0 60rpx;
-    box-sizing: border-box;
-    margin-top: 60rpx;
-    .for_psd {
-      color: $uni-color-primary;
-      width: 140rpx;
-      text-align: center;
-      margin: 40rpx auto;
-    }
-    .login_btn_n {
-      width: 100%;
-      height: 98rpx;
-      background: $uni-color-primary;
-      box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      color: #ffffff;
-      border-radius: 50rpx;
-			font-weight: 500;
-			font-size: 32rpx;
-    }
-  }
-  .deal_wrap {
-    position: absolute;
-    width: 100%;
-    left: 0;
-    text-align: center;
-    bottom: 88rpx;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    .deal {
-      color: $uni-color-primary;
-    }
-    .checked {
-      width: 48rpx;
-      margin-right: 12rpx;
-    }
-  }
-}
-.modal {
-  width: 690rpx;
-  min-height: 920rpx;
-  max-height: 720px;
-  border-radius: 24rpx;
-  padding: 32rpx;
-}
-</style>
+<template>
+	<view class="login">
+		<view class="login_title">娆㈣繋鐧诲綍</view>
+		<view class="login_title login_title2">闃滃畞鏂囦綋涓績</view>
+		<view v-if="devMockTip" class="dev-tip">{{ devMockTip }}</view>
+		<view class="login_list">
+			<view class="login_list_item">
+				<image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
+				<input v-model="form.phone" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
+			</view>
+			<!--     <view class="login_list_item">
+        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
+        <input v-model="form.password" type="password" placeholder="瀵嗙爜" />
+      </view> -->
+			<view class="login_list_item">
+				<image src="@/static/login_ic_password@2x.png" mode="widthFix"></image>
+				<input v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" type="text" />
+				<view v-if="downTime == 0" class="btn" @click="sendSms">鑾峰彇楠岃瘉鐮�</view>
+				<view v-else class="btn gray">{{ downTime }}</view>
+			</view>
+		</view>
+		<view class="login_btn">
+			<view class="login_btn_n" @click="onLogin">鐧诲綍</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		loginPost,
+		getUserInfo,
+		sendSMsPost,
+		ywWxAuthorize,
+
+		getRecordByUserPoint
+	} from '@/api'
+	import { devWechatMock } from '@/utils/config.js'
+	import { runWechatOAuthFlow } from '@/utils/wechatAuth.js'
+	import { requestLoginSmsCode } from '@/utils/loginSms.js'
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'login',
+
+		data() {
+			return {
+				form: {
+					phone: '',
+					code: ''
+				},
+				ywinfo: {},
+				downTime: 0,
+				code: '',
+				devMockTip: devWechatMock.enabled ? `寮�鍙戞ā寮忥細妯℃嫙 openid ${devWechatMock.openId}` : ''
+			}
+		},
+		onLoad(option) {
+			console.log('onLoad');
+			// https://zhcg.fnwtzx.com/#/pages/login?type=0&ywid=ywid
+			const ywinfo = uni.getStorageSync('ywinfo') || {}
+			if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
+				this.ywinfo = ywinfo
+				uni.setStorageSync('ywinfo', {})
+			}
+			if (option.ywid || option.ywid == 0) {
+				uni.setStorageSync('ywinfo', {
+					type: option.type,
+					ywid: option.ywid
+				})
+			}
+		},
+		onShow() {
+			const that = this
+			runWechatOAuthFlow({
+				authorizeApi: ywWxAuthorize,
+				fallbackCode: this.code,
+				onSuccess: (res) => {
+					if (res.data.openid) {
+						that.$store.commit('setOpenId', res.data.openid)
+					}
+					if (res.data.token && res.data.token != '') {
+						that.$store.commit('setToken', res.data.token)
+						getUserInfo().then(ress => {
+							that.$store.commit('setUserInfo', ress.data)
+						})
+						const ywinfo = this.ywinfo
+						if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
+							getRecordByUserPoint({
+								pointCode: ywinfo.ywid
+							}).then(res => {
+								if (res.data && res.data.id) {
+									uni.redirectTo({
+										url: "/pages/polling/point?id=" + res.data.id
+									})
+								} else {
+									uni.redirectTo({
+										url: "/pages/polling/empty?message=" + res.message
+									})
+								}
+							})
+						} else {
+							setTimeout(() => {
+								uni.redirectTo({
+									url: "/pages/index"
+								})
+							}, 300)
+						}
+					}
+				}
+			})
+		},
+		methods: {
+			...mapMutations(["setToken", "setUserInfo"]),
+			onLogin() {
+				const {
+					form,
+					ProtocolFlag
+				} = this
+				if (!form.phone) return uni.showToast({
+					title: '鎵嬫満鍙蜂笉鑳戒负绌�',
+					icon: 'none'
+				})
+				if (!form.code) return uni.showToast({
+					title: '楠岃瘉鐮佷笉鑳戒负绌�',
+					icon: 'none'
+				})
+
+				loginPost({
+					...form,
+					openid: this.$store.state.openId
+				}).then(res => {
+					if (res.code === 200) {
+						this.setToken(res.data)
+						this.showToast('鐧诲綍鎴愬姛')
+						getUserInfo().then(ress => {
+							this.setUserInfo(ress.data)
+							const ywinfo = this.ywinfo
+							if (ywinfo.ywid && (ywinfo.type || ywinfo.type == 0)) {
+								// getRecordByUserPoint({pointCode: ywinfo.ywid}).then(res => {
+								getRecordByUserPoint({
+									pointCode: ywinfo.ywid
+								}).then(res => {
+									if (res.data && res.data.id) {
+										uni.redirectTo({
+											url: "/pages/polling/point?id=" + res.data.id
+										})
+									} else {
+										uni.redirectTo({
+											url: "/pages/polling/empty?message=" + res.message
+										})
+									}
+								})
+								// })
+							} else {
+								uni.redirectTo({
+									url: "/pages/index"
+								})
+							}
+						})
+					}
+				})
+
+
+
+			},
+			sendSms() {
+				requestLoginSmsCode(this, this.form.phone, sendSMsPost, { phone: this.form.phone, userType: 0 })
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.login {
+		width: 100%;
+		height: 100vh;
+		display: flex;
+		padding-top: 130rpx;
+		box-sizing: border-box;
+		align-items: center;
+		flex-direction: column;
+		background: linear-gradient(180deg, #C5DDFF 0%, #FFFFFF 100%);
+
+		.login_title {
+			font-weight: 500;
+			font-size: 52rpx;
+			color: #222222;
+			margin-top: 180rpx;
+			width: 100%;
+			padding-left: 60rpx;
+		}
+
+		.login_title2 {
+			margin-top: 10rpx;
+			margin-bottom: 40rpx;
+		}
+
+		.dev-tip {
+			width: 100%;
+			padding: 0 60rpx;
+			box-sizing: border-box;
+			font-size: 24rpx;
+			color: #e6a23c;
+			margin-bottom: 40rpx;
+			line-height: 1.5;
+		}
+
+		.login_list {
+			width: 100%;
+			padding: 0 60rpx;
+			box-sizing: border-box;
+
+			.login_list_item {
+				width: 100%;
+				border-radius: 50rpx;
+				height: 98rpx;
+				padding: 0 40rpx;
+				box-sizing: border-box;
+				background: #ffffff;
+				margin-bottom: 40rpx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				&:last-child {
+					margin-bottom: 0 !important;
+				}
+
+				image {
+					flex-shrink: 0;
+					width: 40rpx;
+					height: 40rpx;
+				}
+
+				.btn {
+					width: 145rpx;
+					color: $primaryColor;
+					text-align: center;
+				}
+
+				.gray {
+					color: #999999;
+				}
+
+				input {
+					flex: 1;
+					height: 100%;
+					color: #666666;
+					margin-left: 24rpx;
+					border: none;
+				}
+			}
+		}
+
+		.login_btn {
+			width: 100%;
+			padding: 0 60rpx;
+			box-sizing: border-box;
+			margin-top: 60rpx;
+
+			.for_psd {
+				color: $uni-color-primary;
+				width: 140rpx;
+				text-align: center;
+				margin: 40rpx auto;
+			}
+
+			.login_btn_n {
+				width: 100%;
+				height: 98rpx;
+				background: $uni-color-primary;
+				box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				color: #ffffff;
+				border-radius: 50rpx;
+				font-weight: 500;
+				font-size: 32rpx;
+			}
+		}
+
+		.deal_wrap {
+			position: absolute;
+			width: 100%;
+			left: 0;
+			text-align: center;
+			bottom: 88rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			.deal {
+				color: $uni-color-primary;
+			}
+
+			.checked {
+				width: 48rpx;
+				margin-right: 12rpx;
+			}
+		}
+	}
+
+	.modal {
+		width: 690rpx;
+		min-height: 920rpx;
+		max-height: 720px;
+		border-radius: 24rpx;
+		padding: 32rpx;
+	}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3