From 93de43267e1663031fe5dc2f5ae40d128a182a76 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 18 六月 2026 17:24:51 +0800
Subject: [PATCH] 新增智能电表、空调管理

---
 h5/pages/login.vue |  351 +++++++++++++++++++++++-----------------------------------
 1 files changed, 138 insertions(+), 213 deletions(-)

diff --git a/h5/pages/login.vue b/h5/pages/login.vue
index 4c32dbc..899344a 100644
--- a/h5/pages/login.vue
+++ b/h5/pages/login.vue
@@ -1,213 +1,138 @@
-<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.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 } from '@/api'
-import { mapState, mapMutations } from 'vuex'
-export default {
-  name: 'login',
-
-  data() {
-    return {
-      form: {
-				phone: '18888888888',
-				code: '1'
-      },
-			downTime: 0
-    }
-  },
-
-  onLoad() {
-  },
-  onBackPress(options) {
-    uni.redirectTo({
-      url: '/pages/login/login'
-    })
-    return true
-  },
-  methods: {
-    ...mapMutations(["setToken", "setUserInfo"]),
-		sendSms() {
-			this.downTime = 60
-			let timer = setInterval(() => {
-				if(this.downTime == 0) return clearInterval(timer)
-				this.downTime = this.downTime - 1
-			}, 1000)
-			const { form } = this
-			sendSMsPost({
-				phone: form.phone,
-				type: 0
-			}).then(res => {
-				this.showToast('鐭俊鍙戦�佹垚鍔�')
-			})
-		},
-    onLogin() {
-      const { form, ProtocolFlag } = this
-      // if (!ProtocolFlag) return uni.showToast({
-      //   title: '璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁�',
-      //   icon: 'none'
-      // })
-      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)
-            uni.redirectTo({
-              url: "/pages/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;
-				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>
+<template>
+  <view class="cu-login">
+    <view class="cu-auth-topbar">
+      <view class="cu-auth-topbar__btn" @click="goRoleSelect">
+        <u-icon name="reload" color="#2080f7" size="22" />
+      </view>
+    </view>
+
+    <view class="cu-login__brand">
+      <view class="cu-login__title">娆㈣繋鐧诲綍</view>
+      <view class="cu-login__sub">闃滃畞鏂囦綋涓績 路 杩愮淮鏈嶅姟骞冲彴</view>
+    </view>
+
+    <view v-if="devMockTip" class="cu-login__tip">{{ devMockTip }}</view>
+
+    <view class="cu-input-wrap">
+      <input v-model="form.phone" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
+    </view>
+    <view class="cu-input-wrap">
+      <input v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" />
+      <view v-if="downTime == 0" class="cu-sms-btn" @click="sendSms">鑾峰彇楠岃瘉鐮�</view>
+      <view v-else class="cu-sms-btn cu-sms-btn--disabled">{{ downTime }}s</view>
+    </view>
+
+    <view class="cu-btn cu-btn--primary" @click="onLogin">鐧诲綍</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 { mapMutations } from 'vuex'
+
+export default {
+  name: 'login',
+  data () {
+    return {
+      form: { phone: '', code: '' },
+      ywinfo: {},
+      downTime: 0,
+      code: '',
+      devMockTip: devWechatMock.enabled ? `寮�鍙戞ā寮忥細妯℃嫙 openid ${devWechatMock.openId}` : ''
+    }
+  },
+  onLoad (option) {
+    uni.setStorageSync('userType', 0)
+    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']),
+    goRoleSelect () {
+      uni.redirectTo({ url: '/pages/roleSelect?switch=1' })
+    },
+    onLogin () {
+      const { form } = 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)
+          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 => {
+                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>

--
Gitblit v1.9.3