Commit 388fbf63306ed8c29f3e48d0c5e207aba727545b
Merge branch 'sqy_dev' into 'main'
Sqy dev See merge request huang/thingskit-app!42
Showing
8 changed files
with
607 additions
and
478 deletions
| @@ -26,18 +26,17 @@ export default { | @@ -26,18 +26,17 @@ export default { | ||
| 26 | </script> | 26 | </script> | 
| 27 | 27 | ||
| 28 | <style lang="scss"> | 28 | <style lang="scss"> | 
| 29 | -/* #ifndef APP-NVUE */ | ||
| 30 | @import '@/uni_modules/uview-ui/index.scss'; | 29 | @import '@/uni_modules/uview-ui/index.scss'; | 
| 31 | @import './style/iconfont.scss'; | 30 | @import './style/iconfont.scss'; | 
| 32 | @import './style/common.scss'; | 31 | @import './style/common.scss'; | 
| 33 | page { | 32 | page { | 
| 34 | background-color: #f5f5f5; | 33 | background-color: #f5f5f5; | 
| 34 | +} | ||
| 35 | +::-webkit-scrollbar { | ||
| 36 | + display: none; | ||
| 37 | + width: 0 !important; | ||
| 38 | + height: 0 !important; | ||
| 39 | + -webkit-appearance: none; | ||
| 40 | + background: transparent; | ||
| 35 | } | 41 | } | 
| 36 | -// 隐藏滚动条 | ||
| 37 | -::-webkit-scrollbar { | ||
| 38 | - width: 0; | ||
| 39 | - height: 0; | ||
| 40 | - color: transparent; | ||
| 41 | -} | ||
| 42 | -/* #endif */ | ||
| 43 | </style> | 42 | </style> | 
| 1 | -<template> | ||
| 2 | - <view> | ||
| 3 | - <view :class="[isFixed ? 'f-fixed' : '']"> | ||
| 4 | - <!-- 二次封装tabbar --> | ||
| 5 | - <u-tabbar | ||
| 6 | - :value="tabIndex" | ||
| 7 | - @change="onTabbar" | ||
| 8 | - :fixed="false" | ||
| 9 | - :placeholder="false" | ||
| 10 | - :safeAreaInsetBottom="false" | ||
| 11 | - :activeColor="activeColor" | ||
| 12 | - :inactiveColor="inactiveColor" | ||
| 13 | - :border="border" | ||
| 14 | - > | ||
| 15 | - <block v-for="(item, index) in list" :key="index"> | ||
| 16 | - <!-- 自定义icon --> | ||
| 17 | - <u-tabbar-item :text="item.name" :badge="item.badge" :dot="item.dot" :badgeStyle="item.badgeStyle"> | ||
| 18 | - <view slot="active-icon"><image style="width:50rpx;height: 50rpx;" :src="item.iconFill" mode=""></image></view> | ||
| 19 | - <view slot="inactive-icon"><image style="width:50rpx;height: 50rpx;" :src="item.icon" mode=""></image></view> | ||
| 20 | - </u-tabbar-item> | ||
| 21 | - </block> | ||
| 22 | - </u-tabbar> | ||
| 23 | - <!-- 苹果安全距离-默认20px --> | ||
| 24 | - <view :style="{ paddingBottom: systemInfo.tabbarPaddingB + 'px', background: '#fff' }"></view> | ||
| 25 | - </view> | ||
| 26 | - <!-- 防止塌陷高度 --> | ||
| 27 | - <view v-if="isFixed && isFillHeight" :style="{ height: systemInfo.tabbarH + 'px' }"></view> | ||
| 28 | - </view> | ||
| 29 | -</template> | ||
| 30 | - | ||
| 31 | -<script> | ||
| 32 | -import base from '@/config/baseUrl.js'; | ||
| 33 | -import { mapState } from 'vuex'; | ||
| 34 | - | ||
| 35 | -export default { | ||
| 36 | - name: 'f-tabbar', | ||
| 37 | - props: { | ||
| 38 | - // 是否固定在底部 | ||
| 39 | - isFixed: { | ||
| 40 | - type: Boolean, | ||
| 41 | - default: true | ||
| 42 | - }, | ||
| 43 | - // 是否设置防止塌陷高度 | ||
| 44 | - isFillHeight: { | ||
| 45 | - type: Boolean, | ||
| 46 | - default: true | ||
| 47 | - }, | ||
| 48 | - // 选中的颜色 | ||
| 49 | - activeColor: { | ||
| 50 | - type: String, | ||
| 51 | - default: '#377dff' | ||
| 52 | - }, | ||
| 53 | - // 未选中颜色 | ||
| 54 | - inactiveColor: { | ||
| 55 | - type: String, | ||
| 56 | - default: '#606266' | ||
| 57 | - }, | ||
| 58 | - // 是否显示边框色 | ||
| 59 | - border: { | ||
| 60 | - type: Boolean, | ||
| 61 | - default: function() { | ||
| 62 | - return true; | ||
| 63 | - } | ||
| 64 | - }, | ||
| 65 | - // 右上角的角标提示信息 | ||
| 66 | - badge: { | ||
| 67 | - type: [String, Number, null], | ||
| 68 | - default: uni.$u.props.tabbarItem.badge | ||
| 69 | - }, | ||
| 70 | - // 是否显示圆点,将会覆盖badge参数 | ||
| 71 | - dot: { | ||
| 72 | - type: Boolean, | ||
| 73 | - default: uni.$u.props.tabbarItem.dot | ||
| 74 | - }, | ||
| 75 | - // 控制徽标的位置,对象或者字符串形式,可以设置top和right属性 | ||
| 76 | - badgeStyle: { | ||
| 77 | - type: [Object, String], | ||
| 78 | - default: uni.$u.props.tabbarItem.badgeStyle | ||
| 79 | - } | ||
| 80 | - }, | ||
| 81 | - data() { | ||
| 82 | - return { | ||
| 83 | - systemInfo: base.systemInfo, | ||
| 84 | - tabIndex: 0, | ||
| 85 | - path: '', //当前路径 | ||
| 86 | - list: [ | ||
| 87 | - { | ||
| 88 | - name: '首页', | ||
| 89 | - url: 'pages/index/index', | ||
| 90 | - icon: '../../../static/home-un.png', | ||
| 91 | - iconFill: '../../../static/home-yes.png' | ||
| 92 | - }, | ||
| 93 | - { | ||
| 94 | - name: '设备', | ||
| 95 | - url: 'pages/device/device', | ||
| 96 | - icon: '../../../static/device-un.png', | ||
| 97 | - iconFill: '../../../static/device-yes.png' | ||
| 98 | - }, | ||
| 99 | - { | ||
| 100 | - name: '告警', | ||
| 101 | - url: 'pages/alarm/alarm', | ||
| 102 | - icon: '../../../static/alert-un.png', | ||
| 103 | - iconFill: '../../../static/alert-yes.png', | ||
| 104 | - badge: 0 | ||
| 105 | - }, | ||
| 106 | - { | ||
| 107 | - name: '我的', | ||
| 108 | - url: 'pages/personal/personal', | ||
| 109 | - icon: '../../../static/my-un.png', | ||
| 110 | - iconFill: '../../../static/my-yes.png' | ||
| 111 | - } | ||
| 112 | - ], | ||
| 113 | - badgeTotal: { | ||
| 114 | - t1: 0, | ||
| 115 | - t2: 0, | ||
| 116 | - t3: 0 | ||
| 117 | - } | ||
| 118 | - }; | ||
| 119 | - }, | ||
| 120 | - onLoad() { | ||
| 121 | - console.log('Onload the dofunc'); | ||
| 122 | - }, | ||
| 123 | - created() { | ||
| 124 | - this.loadData(); | ||
| 125 | - //获取页面路径 | ||
| 126 | - let currentPages = getCurrentPages(); | ||
| 127 | - let page = currentPages[currentPages.length - 1]; | ||
| 128 | - this.path = page.route; | ||
| 129 | - if (this.list.length > 0) { | ||
| 130 | - this.list?.forEach((item, index) => { | ||
| 131 | - if (this.path == item.url) { | ||
| 132 | - this.tabIndex = index; | ||
| 133 | - } | ||
| 134 | - }); | ||
| 135 | - } | ||
| 136 | - }, | ||
| 137 | - computed: { | ||
| 138 | - ...mapState({ | ||
| 139 | - info: state => state.badgeInfo | ||
| 140 | - }) | ||
| 141 | - }, | ||
| 142 | - methods: { | ||
| 143 | - loadData() { | ||
| 144 | - this.list[2].badge = this.info; | ||
| 145 | - }, | ||
| 146 | - onTabbar(index) { | ||
| 147 | - setTimeout(() => { | ||
| 148 | - this.loadData(); | ||
| 149 | - }, 100); | ||
| 150 | - if (this.list[index].url) { | ||
| 151 | - if (this.path !== this.list[index].url) { | ||
| 152 | - uni.switchTab({ | ||
| 153 | - url: '/' + this.list[index].url | ||
| 154 | - }); | ||
| 155 | - } | ||
| 156 | - } | ||
| 157 | - } | ||
| 158 | - } | ||
| 159 | -}; | ||
| 160 | -</script> | ||
| 161 | - | ||
| 162 | -<style lang="scss" scoped> | ||
| 163 | -.f-fixed { | ||
| 164 | - position: fixed; | ||
| 165 | - bottom: 0; | ||
| 166 | - left: 0; | ||
| 167 | - right: 0; | ||
| 168 | - z-index: 1000; | ||
| 169 | -} | ||
| 170 | -</style> | 1 | +<template> | 
| 2 | + <view> | ||
| 3 | + <view :class="[isFixed ? 'f-fixed' : '']"> | ||
| 4 | + <!-- 二次封装tabbar --> | ||
| 5 | + <u-tabbar | ||
| 6 | + :value="tabIndex" | ||
| 7 | + @change="onTabbar" | ||
| 8 | + :fixed="false" | ||
| 9 | + :placeholder="false" | ||
| 10 | + :safeAreaInsetBottom="false" | ||
| 11 | + :activeColor="activeColor" | ||
| 12 | + :inactiveColor="inactiveColor" | ||
| 13 | + :border="border" | ||
| 14 | + > | ||
| 15 | + <block v-for="(item, index) in list" :key="index"> | ||
| 16 | + <!-- 自定义icon --> | ||
| 17 | + <u-tabbar-item :text="item.name" :badge="item.badge" :dot="item.dot" :badgeStyle="item.badgeStyle"> | ||
| 18 | + <view slot="active-icon"><image style="width:50rpx;height: 50rpx;" :src="item.iconFill" mode=""></image></view> | ||
| 19 | + <view slot="inactive-icon"><image style="width:50rpx;height: 50rpx;" :src="item.icon" mode=""></image></view> | ||
| 20 | + </u-tabbar-item> | ||
| 21 | + </block> | ||
| 22 | + </u-tabbar> | ||
| 23 | + <!-- 苹果安全距离-默认20px --> | ||
| 24 | + <view :style="{ paddingBottom: systemInfo.tabbarPaddingB + 'px', background: '#fff' }"></view> | ||
| 25 | + </view> | ||
| 26 | + <!-- 防止塌陷高度 --> | ||
| 27 | + <view v-if="isFixed && isFillHeight" :style="{ height: systemInfo.tabbarH + 'px' }"></view> | ||
| 28 | + </view> | ||
| 29 | +</template> | ||
| 30 | + | ||
| 31 | +<script> | ||
| 32 | +import base from '@/config/baseUrl.js'; | ||
| 33 | +import { mapState } from 'vuex'; | ||
| 34 | + | ||
| 35 | +export default { | ||
| 36 | + name: 'f-tabbar', | ||
| 37 | + props: { | ||
| 38 | + // 是否固定在底部 | ||
| 39 | + isFixed: { | ||
| 40 | + type: Boolean, | ||
| 41 | + default: true | ||
| 42 | + }, | ||
| 43 | + // 是否设置防止塌陷高度 | ||
| 44 | + isFillHeight: { | ||
| 45 | + type: Boolean, | ||
| 46 | + default: true | ||
| 47 | + }, | ||
| 48 | + // 选中的颜色 | ||
| 49 | + activeColor: { | ||
| 50 | + type: String, | ||
| 51 | + default: '#377dff' | ||
| 52 | + }, | ||
| 53 | + // 未选中颜色 | ||
| 54 | + inactiveColor: { | ||
| 55 | + type: String, | ||
| 56 | + default: '#606266' | ||
| 57 | + }, | ||
| 58 | + // 是否显示边框色 | ||
| 59 | + border: { | ||
| 60 | + type: Boolean, | ||
| 61 | + default: true | ||
| 62 | + }, | ||
| 63 | + // 右上角的角标提示信息 | ||
| 64 | + badge: { | ||
| 65 | + type: [String, Number, null], | ||
| 66 | + default: uni.$u.props.tabbarItem.badge | ||
| 67 | + }, | ||
| 68 | + // 是否显示圆点,将会覆盖badge参数 | ||
| 69 | + dot: { | ||
| 70 | + type: Boolean, | ||
| 71 | + default: uni.$u.props.tabbarItem.dot | ||
| 72 | + }, | ||
| 73 | + // 控制徽标的位置,对象或者字符串形式,可以设置top和right属性 | ||
| 74 | + badgeStyle: { | ||
| 75 | + type: [Object, String], | ||
| 76 | + default: uni.$u.props.tabbarItem.badgeStyle | ||
| 77 | + } | ||
| 78 | + }, | ||
| 79 | + data() { | ||
| 80 | + return { | ||
| 81 | + systemInfo: base.systemInfo, | ||
| 82 | + tabIndex: 0, | ||
| 83 | + path: '', //当前路径 | ||
| 84 | + list: [ | ||
| 85 | + { | ||
| 86 | + name: '首页', | ||
| 87 | + url: 'pages/index/index', | ||
| 88 | + icon: '../../../static/home-un.png', | ||
| 89 | + iconFill: '../../../static/home-yes.png' | ||
| 90 | + }, | ||
| 91 | + { | ||
| 92 | + name: '设备', | ||
| 93 | + url: 'pages/device/device', | ||
| 94 | + icon: '../../../static/device-un.png', | ||
| 95 | + iconFill: '../../../static/device-yes.png' | ||
| 96 | + }, | ||
| 97 | + { | ||
| 98 | + name: '告警', | ||
| 99 | + url: 'pages/alarm/alarm', | ||
| 100 | + icon: '../../../static/alert-un.png', | ||
| 101 | + iconFill: '../../../static/alert-yes.png', | ||
| 102 | + badge: this.$store.state.badgeInfo | ||
| 103 | + }, | ||
| 104 | + { | ||
| 105 | + name: '我的', | ||
| 106 | + url: 'pages/personal/personal', | ||
| 107 | + icon: '../../../static/my-un.png', | ||
| 108 | + iconFill: '../../../static/my-yes.png' | ||
| 109 | + } | ||
| 110 | + ] | ||
| 111 | + }; | ||
| 112 | + }, | ||
| 113 | + created() { | ||
| 114 | + //获取页面路径 | ||
| 115 | + let currentPages = getCurrentPages(); | ||
| 116 | + let page = currentPages[currentPages.length - 1]; | ||
| 117 | + this.path = page.route; | ||
| 118 | + if (this.list.length > 0) { | ||
| 119 | + this.list.forEach((item, index) => { | ||
| 120 | + if (this.path == item.url) { | ||
| 121 | + this.tabIndex = index; | ||
| 122 | + } | ||
| 123 | + }); | ||
| 124 | + } | ||
| 125 | + }, | ||
| 126 | + methods: { | ||
| 127 | + onTabbar(index) { | ||
| 128 | + this.list[2].badge =this.$store.state.badgeInfo | ||
| 129 | + | ||
| 130 | + if (this.list[index].url) { | ||
| 131 | + if (this.path !== this.list[index].url) { | ||
| 132 | + uni.switchTab({ | ||
| 133 | + url: '/' + this.list[index].url | ||
| 134 | + }); | ||
| 135 | + } | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | + } | ||
| 139 | +}; | ||
| 140 | +</script> | ||
| 141 | + | ||
| 142 | +<style lang="scss" scoped> | ||
| 143 | +.f-fixed { | ||
| 144 | + position: fixed; | ||
| 145 | + bottom: 0; | ||
| 146 | + left: 0; | ||
| 147 | + right: 0; | ||
| 148 | + z-index: 1000; | ||
| 149 | +} | ||
| 150 | +</style> | 
| @@ -47,8 +47,10 @@ import historyData from './tabDetail/historyData.vue'; | @@ -47,8 +47,10 @@ import historyData from './tabDetail/historyData.vue'; | ||
| 47 | import commondRecord from './tabDetail/CommandRecord.vue'; | 47 | import commondRecord from './tabDetail/CommandRecord.vue'; | 
| 48 | import { getDeviceKeys, getHistoryData } from './api/index.js'; | 48 | import { getDeviceKeys, getHistoryData } from './api/index.js'; | 
| 49 | import { formatToDate } from '@/plugins/utils.js'; | 49 | import { formatToDate } from '@/plugins/utils.js'; | 
| 50 | +import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js"; | ||
| 50 | import moment from 'moment'; | 51 | import moment from 'moment'; | 
| 51 | export default { | 52 | export default { | 
| 53 | + mixins: [MescrollCompMixin], | ||
| 52 | components: { | 54 | components: { | 
| 53 | fTabbar, | 55 | fTabbar, | 
| 54 | basicInfo, | 56 | basicInfo, | 
| @@ -49,18 +49,19 @@ | @@ -49,18 +49,19 @@ | ||
| 49 | </view> | 49 | </view> | 
| 50 | 50 | ||
| 51 | <!-- 下发命令 --> | 51 | <!-- 下发命令 --> | 
| 52 | - <u-modal :show="showModel" closeOnClickOverlay :showConfirmButton="false" width="350px" @close="hiddenModal"> | 52 | + <u-modal :show="showModel" closeOnClickOverlay :showConfirmButton="false" width="720rpx" @close="hiddenModal" @touchmove.stop.prevent="disabledScroll"> | 
| 53 | <view style="width: 100%; padding: 0 30rpx;"> | 53 | <view style="width: 100%; padding: 0 30rpx;"> | 
| 54 | <view style="text-align: center; font-weight:700;margin-bottom: 40rpx;">命令下发</view> | 54 | <view style="text-align: center; font-weight:700;margin-bottom: 40rpx;">命令下发</view> | 
| 55 | <view class="u-flex"> | 55 | <view class="u-flex"> | 
| 56 | <text style="color: #333; font-size: 28rpx;font-weight:700;margin-right: 30rpx;">下发类型:</text> | 56 | <text style="color: #333; font-size: 28rpx;font-weight:700;margin-right: 30rpx;">下发类型:</text> | 
| 57 | - <u-radio-group v-model="commandType" placement="row" size="14"> | 57 | + | 
| 58 | + <u-radio-group v-model="commandType" placement="row"> | ||
| 58 | <u-radio activeColor="#3388FF" label="OneWay" name="OneWay"></u-radio> | 59 | <u-radio activeColor="#3388FF" label="OneWay" name="OneWay"></u-radio> | 
| 59 | <view style="margin: 0 20rpx;"></view> | 60 | <view style="margin: 0 20rpx;"></view> | 
| 60 | <u-radio activeColor="#3388FF" label="TwoWay" name="TwoWay"></u-radio> | 61 | <u-radio activeColor="#3388FF" label="TwoWay" name="TwoWay"></u-radio> | 
| 61 | </u-radio-group> | 62 | </u-radio-group> | 
| 62 | </view> | 63 | </view> | 
| 63 | - <view style="margin-top: 28rpx;"><u--textarea placeholder="请输入命令内容" v-model="commandValue" /></view> | 64 | + <view style="margin-top: 28rpx;width: 100%;"><u--textarea placeholder="请输入命令内容" v-model="commandValue" /></view> | 
| 64 | 65 | ||
| 65 | <view class="button-group"> | 66 | <view class="button-group"> | 
| 66 | <view><u-button :customStyle="{ color: '#333' }" color="#e3e3e5" shape="circle" text="取消" @click="cancelCommand"></u-button></view> | 67 | <view><u-button :customStyle="{ color: '#333' }" color="#e3e3e5" shape="circle" text="取消" @click="cancelCommand"></u-button></view> | 
| @@ -122,6 +123,9 @@ export default { | @@ -122,6 +123,9 @@ export default { | ||
| 122 | showModal() { | 123 | showModal() { | 
| 123 | this.showModel = true; | 124 | this.showModel = true; | 
| 124 | }, | 125 | }, | 
| 126 | + disabledScroll() { | ||
| 127 | + return; | ||
| 128 | + }, | ||
| 125 | hiddenModal() { | 129 | hiddenModal() { | 
| 126 | this.showModel = false; | 130 | this.showModel = false; | 
| 127 | }, | 131 | }, | 
| @@ -132,7 +136,7 @@ export default { | @@ -132,7 +136,7 @@ export default { | ||
| 132 | commandValue.additionalInfo = { | 136 | commandValue.additionalInfo = { | 
| 133 | cmdType: 'API' | 137 | cmdType: 'API' | 
| 134 | }; | 138 | }; | 
| 135 | - await issueCommand(this.commandType, this.deviceDetail.tbDeviceId,commandValue); | 139 | + await issueCommand(this.commandType, this.deviceDetail.tbDeviceId, commandValue); | 
| 136 | this.hiddenModal(); | 140 | this.hiddenModal(); | 
| 137 | } catch (e) { | 141 | } catch (e) { | 
| 138 | uni.$u.toast('下发失败~'); | 142 | uni.$u.toast('下发失败~'); | 
| @@ -5,7 +5,8 @@ | @@ -5,7 +5,8 @@ | ||
| 5 | "pages": [{ | 5 | "pages": [{ | 
| 6 | "path": "pages/index/index", | 6 | "path": "pages/index/index", | 
| 7 | "style": { | 7 | "style": { | 
| 8 | - "navigationBarTitleText": "首页" | 8 | + "navigationBarTitleText": "首页", | 
| 9 | + "disableScroll": true | ||
| 9 | } | 10 | } | 
| 10 | }, | 11 | }, | 
| 11 | { | 12 | { | 
| @@ -146,7 +147,8 @@ | @@ -146,7 +147,8 @@ | ||
| 146 | "navigationBarTextStyle": "black", | 147 | "navigationBarTextStyle": "black", | 
| 147 | "navigationBarTitleText": "云腾app", | 148 | "navigationBarTitleText": "云腾app", | 
| 148 | "navigationBarBackgroundColor": "#FFFFFF", | 149 | "navigationBarBackgroundColor": "#FFFFFF", | 
| 149 | - "backgroundColor": "#FFFFFF" | 150 | + "backgroundColor": "#FFFFFF", | 
| 151 | + "backgroundColorTop": "#FFFFFF" | ||
| 150 | }, | 152 | }, | 
| 151 | "tabBar": { | 153 | "tabBar": { | 
| 152 | "color": "#ffffff", | 154 | "color": "#ffffff", | 
| @@ -25,66 +25,66 @@ | @@ -25,66 +25,66 @@ | ||
| 25 | </view> | 25 | </view> | 
| 26 | </view> | 26 | </view> | 
| 27 | </u-sticky> | 27 | </u-sticky> | 
| 28 | - <mescroll-body ref="mescrollRef" @init="mescrollInit" :up="upOption" :down="downOption" @down="downCallback" @up="upCallback"> | ||
| 29 | - <view class="device-list"> | ||
| 30 | - <view @click="openDeviceDetail(item.id, item.alarmStatus, item.lastOnlineTime, item.tbDeviceId)" class="list-item" v-for="item in list" :key="item.id"> | ||
| 31 | - <view | ||
| 32 | - class="u-flex item" | ||
| 33 | - style=" | ||
| 34 | - justify-content: flex-start; | ||
| 35 | - flex-direction: column; | ||
| 36 | - align-items: center; | ||
| 37 | - " | ||
| 38 | - > | ||
| 39 | - <view style="width: 450rpx; text-align: left"> | ||
| 40 | - <text style="color: #333; font-size: 30rpx;font-weight: bold;">{{ item.name }}</text> | ||
| 41 | - </view> | ||
| 42 | - <view style="width: 450rpx; text-align: left; margin-top: 10rpx"> | ||
| 43 | - <view style="color: #666; font-size: 14px;display: flex;"> | ||
| 44 | - 设备编号: | ||
| 45 | - <view style="margin-left:16rpx">{{ item.sn }}</view> | 28 | + <mescroll-body ref="mescrollRef" @init="mescrollInit" :up="upOption" :down="downOption" @down="downCallback" @up="upCallback"> | 
| 29 | + <view class="device-list"> | ||
| 30 | + <view @click="openDeviceDetail(item.id, item.alarmStatus, item.lastOnlineTime, item.tbDeviceId)" class="list-item" v-for="item in list" :key="item.id"> | ||
| 31 | + <view | ||
| 32 | + class="u-flex item" | ||
| 33 | + style=" | ||
| 34 | + justify-content: flex-start; | ||
| 35 | + flex-direction: column; | ||
| 36 | + align-items: center; | ||
| 37 | + " | ||
| 38 | + > | ||
| 39 | + <view style="width: 450rpx; text-align: left"> | ||
| 40 | + <text style="color: #333; font-size: 30rpx;font-weight: bold;">{{ item.name }}</text> | ||
| 46 | </view> | 41 | </view> | 
| 47 | - </view> | ||
| 48 | - <view style="width: 450rpx; text-align: left; margin-top: 10rpx"> | ||
| 49 | - <view style="color: #666; font-size: 14px;display: flex;"> | ||
| 50 | - 所属组织: | ||
| 51 | - <view style="margin-left:16rpx">{{ item.organizationDTO.name }}</view> | 42 | + <view style="width: 450rpx; text-align: left; margin-top: 10rpx"> | 
| 43 | + <view style="color: #666; font-size: 14px;display: flex;"> | ||
| 44 | + 设备编号: | ||
| 45 | + <view style="margin-left:16rpx">{{ item.sn }}</view> | ||
| 46 | + </view> | ||
| 47 | + </view> | ||
| 48 | + <view style="width: 450rpx; text-align: left; margin-top: 10rpx"> | ||
| 49 | + <view style="color: #666; font-size: 14px;display: flex;"> | ||
| 50 | + 所属组织: | ||
| 51 | + <view style="margin-left:16rpx">{{ item.organizationDTO.name }}</view> | ||
| 52 | + </view> | ||
| 52 | </view> | 53 | </view> | 
| 53 | </view> | 54 | </view> | 
| 54 | - </view> | ||
| 55 | - <view class="item"> | ||
| 56 | - <view class="u-flex" style="margin-top: -6rpx"> | ||
| 57 | - <image | ||
| 58 | - style=" | ||
| 59 | - width: 30rpx; | ||
| 60 | - height: 30rpx; | ||
| 61 | - margin-top: 5rpx; | ||
| 62 | - margin-right: 5rpx; | ||
| 63 | - " | ||
| 64 | - :src="item.deviceState === 'ONLINE' ? '../../static/online.png' : item.deviceState === 'INACTIVE' ? '../../static/unonline.png' : '../../static/baojing.png'" | ||
| 65 | - /> | ||
| 66 | - | ||
| 67 | - <view> | ||
| 68 | - <text | 55 | + <view class="item"> | 
| 56 | + <view class="u-flex" style="margin-top: -6rpx"> | ||
| 57 | + <image | ||
| 69 | style=" | 58 | style=" | 
| 70 | - color: #377dff; | ||
| 71 | - font-size: 13px; | ||
| 72 | - margin-left: 5rpx; | ||
| 73 | - margin-top: 20rpx; | ||
| 74 | - " | ||
| 75 | - :style="{ color: item.deviceState === 'ONLINE' ? '#377DFF' : item.deviceState === 'INACTIVE' ? '#666666' : '#DE4437' }" | ||
| 76 | - > | ||
| 77 | - {{ item.deviceState === 'ONLINE' ? '在线' : item.deviceState === 'INACTIVE' ? '待激活' : '离线' }} | ||
| 78 | - </text> | 59 | + width: 30rpx; | 
| 60 | + height: 30rpx; | ||
| 61 | + margin-top: 5rpx; | ||
| 62 | + margin-right: 5rpx; | ||
| 63 | + " | ||
| 64 | + :src="item.deviceState === 'ONLINE' ? '../../static/online.png' : item.deviceState === 'INACTIVE' ? '../../static/unonline.png' : '../../static/baojing.png'" | ||
| 65 | + /> | ||
| 66 | + | ||
| 67 | + <view> | ||
| 68 | + <text | ||
| 69 | + style=" | ||
| 70 | + color: #377dff; | ||
| 71 | + font-size: 13px; | ||
| 72 | + margin-left: 5rpx; | ||
| 73 | + margin-top: 20rpx; | ||
| 74 | + " | ||
| 75 | + :style="{ color: item.deviceState === 'ONLINE' ? '#377DFF' : item.deviceState === 'INACTIVE' ? '#666666' : '#DE4437' }" | ||
| 76 | + > | ||
| 77 | + {{ item.deviceState === 'ONLINE' ? '在线' : item.deviceState === 'INACTIVE' ? '待激活' : '离线' }} | ||
| 78 | + </text> | ||
| 79 | + </view> | ||
| 79 | </view> | 80 | </view> | 
| 80 | </view> | 81 | </view> | 
| 81 | </view> | 82 | </view> | 
| 82 | </view> | 83 | </view> | 
| 83 | - </view> | ||
| 84 | - </mescroll-body> | 84 | + </mescroll-body> | 
| 85 | <!-- 设备筛选 --> | 85 | <!-- 设备筛选 --> | 
| 86 | - <u-popup @close="close" closeable bgColor="#fff" :show="show" mode="bottom" :round="20"> | ||
| 87 | - <view class="filter"> | 86 | + <u-popup @close="close" closeable bgColor="#fff" :show="show" mode="bottom" :round="20" @touchmove.stop.prevent="disabledScroll"> | 
| 87 | + <view class="filter" @touchmove.stop.prevent="disabledScroll"> | ||
| 88 | <view class="filter-title"><text>筛选条件</text></view> | 88 | <view class="filter-title"><text>筛选条件</text></view> | 
| 89 | <FilterItem :filterList="deviceStatus" title="设备状态" @clickTag="currentIndex => handleClickTag(currentIndex, deviceStatus)"></FilterItem> | 89 | <FilterItem :filterList="deviceStatus" title="设备状态" @clickTag="currentIndex => handleClickTag(currentIndex, deviceStatus)"></FilterItem> | 
| 90 | <FilterItem :filterList="alarmStatus" title="告警状态" @clickTag="currentIndex => handleClickTag(currentIndex, alarmStatus)"></FilterItem> | 90 | <FilterItem :filterList="alarmStatus" title="告警状态" @clickTag="currentIndex => handleClickTag(currentIndex, alarmStatus)"></FilterItem> | 
| @@ -116,6 +116,7 @@ export default { | @@ -116,6 +116,7 @@ export default { | ||
| 116 | auto: false //是否在初始化后,自动执行downCallback; 默认true | 116 | auto: false //是否在初始化后,自动执行downCallback; 默认true | 
| 117 | }, | 117 | }, | 
| 118 | upOption: { | 118 | upOption: { | 
| 119 | + isBounce: false, | ||
| 119 | auto: false // 不自动加载 | 120 | auto: false // 不自动加载 | 
| 120 | }, | 121 | }, | 
| 121 | show: false, | 122 | show: false, | 
| @@ -217,6 +218,9 @@ export default { | @@ -217,6 +218,9 @@ export default { | ||
| 217 | } | 218 | } | 
| 218 | }, | 219 | }, | 
| 219 | methods: { | 220 | methods: { | 
| 221 | + disabledScroll() { | ||
| 222 | + return; | ||
| 223 | + }, | ||
| 220 | /*下拉刷新的回调 */ | 224 | /*下拉刷新的回调 */ | 
| 221 | downCallback() { | 225 | downCallback() { | 
| 222 | //联网加载数据 | 226 | //联网加载数据 | 
| @@ -379,4 +383,4 @@ export default { | @@ -379,4 +383,4 @@ export default { | ||
| 379 | } | 383 | } | 
| 380 | } | 384 | } | 
| 381 | } | 385 | } | 
| 382 | -</style> | 386 | +</style> | 
| 1 | -<template> | ||
| 2 | - <view class="login-page"> | ||
| 3 | - <!-- 公共组件-每个页面必须引入 --> | ||
| 4 | - <public-module></public-module> | ||
| 5 | - <view class="u-flex login-main"> | ||
| 6 | - <view class="content"> | ||
| 7 | - <view class="hello login-text-muted">您好,</view> | ||
| 8 | - <view class="hello-welcome login-text-muted">欢迎来到ThingsKit!</view> | ||
| 9 | - </view> | ||
| 10 | - </view> | ||
| 11 | - <view class="f__login"> | ||
| 12 | - <view class="loginPhone"> | ||
| 13 | - <view class="form-row u-flex"> | ||
| 14 | - <view class="v-input"><input type="text" v-model="loginForm.username" maxlength="32" placeholder="请输入登录账号" /></view> | ||
| 15 | - <u-icon></u-icon> | ||
| 16 | - </view> | ||
| 17 | - <view class="form-row u-flex"> | ||
| 18 | - <view class="v-input"><input type="text" v-model="loginForm.password" maxlength="32" placeholder="请输入登录密码" :password="!showPassword" /></view> | ||
| 19 | - <view class="v-password" @click="showPasswordMode"> | ||
| 20 | - <u-icon color="#9a9a9a" width="18" height="15" :name="showPassword ? '/static/eye.png' : '/static/eye-hide.png'"></u-icon> | ||
| 21 | - </view> | ||
| 22 | - <u-icon></u-icon> | ||
| 23 | - </view> | ||
| 24 | - <button class="submit" size="default" @click="onSubmitFunc"><text class="text">登录</text></button> | ||
| 25 | - <view class="u-flex row-item"> | ||
| 26 | - <view class="row-phone login-text-gray" @click="openCodeFunc">手机验证码登录</view> | ||
| 27 | - <view class="row-reset login-text-gray" @click="findPassrordFunc">忘记密码</view> | ||
| 28 | - </view> | ||
| 29 | - <view class="u-flex link-login"> | ||
| 30 | - <view class="link-text login-text-gray">第三方账号登录</view> | ||
| 31 | - <view style="height:20rpx"></view> | ||
| 32 | - <button class="link-image" @tap="onWenxinAuthorization"><image class="image" src="../../static/weixin.png" mode="aspectFill"></image></button> | ||
| 33 | - </view> | ||
| 34 | - </view> | ||
| 35 | - </view> | ||
| 36 | - </view> | ||
| 37 | -</template> | ||
| 38 | - | ||
| 39 | -<script> | ||
| 40 | -import { mapMutations, mapActions } from 'vuex'; | ||
| 41 | -import { loginApp } from '@/config/login'; | ||
| 42 | -import baseUrl from '@/config/baseUrl.js'; | ||
| 43 | -import WXBizDataCrypt from '@/config/WXBizDataCrypt.js'; | ||
| 44 | -import { appId, appSecrect } from '@/config/constant.js'; | ||
| 45 | - | ||
| 46 | -export default { | ||
| 47 | - data() { | ||
| 48 | - return { | ||
| 49 | - loginForm: { | ||
| 50 | - username: '', | ||
| 51 | - password: '' | ||
| 52 | - }, | ||
| 53 | - showPassword: false, | ||
| 54 | - code: '', | ||
| 55 | - openid: '' | ||
| 56 | - }; | ||
| 57 | - }, | ||
| 58 | - onLoad() { | ||
| 59 | - wx.login({ | ||
| 60 | - success: res => { | ||
| 61 | - if (res.code) { | ||
| 62 | - this.code = res.code; | ||
| 63 | - //这里获取openid | ||
| 64 | - } else { | ||
| 65 | - return; | ||
| 66 | - } | ||
| 67 | - } | ||
| 68 | - }); | ||
| 69 | - }, | ||
| 70 | - methods: { | ||
| 71 | - ...mapMutations(['setUserInfo']), | ||
| 72 | - ...mapActions(['updateBadgeTotal']), | ||
| 73 | - //微信授权登录 | ||
| 74 | - //#ifdef MP-WEIXIN | ||
| 75 | - onWenxinAuthorization() { | ||
| 76 | - wx.getUserProfile({ | ||
| 77 | - desc: '微信第三方授权', | ||
| 78 | - success: reswenxin => { | ||
| 79 | - console.log('res=======>', reswenxin); | ||
| 80 | - if (reswenxin.errMsg === 'getUserProfile:ok' && reswenxin.encryptedData) { | ||
| 81 | - console.log('获取code', this.code); | ||
| 82 | - //获取用户信息 | ||
| 83 | - let obj = { | ||
| 84 | - avatarUrl: reswenxin.userInfo.avatarUrl, | ||
| 85 | - thirdUserId: this.openid | ||
| 86 | - }; | ||
| 87 | - //判断是否需要绑定 | ||
| 88 | - uni.$u.http | ||
| 89 | - .get(`/yt/third/login/${this.code}`) | ||
| 90 | - .then(res => { | ||
| 91 | - console.log('Res', res); | ||
| 92 | - //设置全局变量openId | ||
| 93 | - // getApp().globalData.openId = res.data.openid; | ||
| 94 | - if (res.token == '' || (res.token == null && res.refreshToken)) { | ||
| 95 | - //需要绑定 | ||
| 96 | - let userInfo = { | ||
| 97 | - isThirdLogin: true, //用于判断是否是第三方登录并且需要绑定账号 | ||
| 98 | - avatar: obj.avatarUrl | ||
| 99 | - }; | ||
| 100 | - this.setUserInfo(userInfo); | ||
| 101 | - //设置全局变量openId | ||
| 102 | - getApp().globalData.openId = res.refreshToken; | ||
| 103 | - uni.reLaunch({ | ||
| 104 | - url: '../../pages/personal/personal' | ||
| 105 | - }); | ||
| 106 | - } else { | ||
| 107 | - // 不需要绑定,直接第三方登录使用 | ||
| 108 | - let resObj = { | ||
| 109 | - refreshToken: res.refreshToken, | ||
| 110 | - isToken: res.token | ||
| 111 | - }; | ||
| 112 | - let userInfo = { | ||
| 113 | - ...resObj, | ||
| 114 | - token: true, //token用于判断是否登录 | ||
| 115 | - isThirdLoginAndNoDind: true //用于判断是否是第三方登录并且不需要绑定账号 | ||
| 116 | - }; | ||
| 117 | - if (userInfo.token) { | ||
| 118 | - this.setUserInfo(userInfo); | ||
| 119 | - } | ||
| 120 | - uni.showToast({ | ||
| 121 | - title: '第三方账号登录成功~', | ||
| 122 | - icon: 'none' | ||
| 123 | - }); | ||
| 124 | - this.saveUserInfo(); | ||
| 125 | - this.getAlarmTotalData(); | ||
| 126 | - uni.reLaunch({ | ||
| 127 | - url: '../../pages/personal/personal' | ||
| 128 | - }); | ||
| 129 | - } | ||
| 130 | - }) | ||
| 131 | - .catch(e => { | ||
| 132 | - uni.$u.toast(e.data?.message); | ||
| 133 | - }); | ||
| 134 | - } | ||
| 135 | - }, | ||
| 136 | - fail: res => { | ||
| 137 | - //拒绝授权 | ||
| 138 | - return; | ||
| 139 | - } | ||
| 140 | - }); | ||
| 141 | - }, | ||
| 142 | - //#endif | ||
| 143 | - saveUserInfo() { | ||
| 144 | - //储存个人信息 | ||
| 145 | - uni.$u.http.get('/yt/user/me/info').then(res => { | ||
| 146 | - if (res) { | ||
| 147 | - this.setUserInfo(res); | ||
| 148 | - } | ||
| 149 | - }); | ||
| 150 | - }, | ||
| 151 | - getAlarmTotalData() { | ||
| 152 | - uni.$u.http.get('/yt/homepage/app').then(res => { | ||
| 153 | - if (res) { | ||
| 154 | - //异步实时更新告警徽标数 | ||
| 155 | - this.updateBadgeTotal(res.totalAlarm.activedAlarm); | ||
| 156 | - } | ||
| 157 | - }); | ||
| 158 | - }, | ||
| 159 | - onSubmitFunc() { | ||
| 160 | - if (this.loginForm.username == '') { | ||
| 161 | - return uni.$u.toast('请输入登录账号~'); | ||
| 162 | - } | ||
| 163 | - const passReg = /^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{8,}$/; | ||
| 164 | - if (this.loginForm.password == '') { | ||
| 165 | - uni.showToast({ | ||
| 166 | - title: '请输入登录密码~', | ||
| 167 | - icon: 'none' | ||
| 168 | - }); | ||
| 169 | - return; | ||
| 170 | - } else if (!passReg.test(this.loginForm.password)) { | ||
| 171 | - uni.showToast({ | ||
| 172 | - title: '密码格式不正确(至少一个大写英文字母、至少一个小写英文字母、至少一位数字、至少一个特殊字符、最少八个字符)~', | ||
| 173 | - icon: 'none', | ||
| 174 | - duration: 3000 | ||
| 175 | - }); | ||
| 176 | - return; | ||
| 177 | - } | ||
| 178 | - uni.$u.http | ||
| 179 | - .post('/auth/login', this.loginForm) | ||
| 180 | - .then(res => { | ||
| 181 | - if (res) { | ||
| 182 | - // 储存登录信息 | ||
| 183 | - let resObj = { | ||
| 184 | - refreshToken: res.refreshToken, | ||
| 185 | - isToken: res.token | ||
| 186 | - }; | ||
| 187 | - let userInfo = { | ||
| 188 | - ...resObj, | ||
| 189 | - token: true, //token用于判断是否登录 | ||
| 190 | - isThirdLogin: false | ||
| 191 | - }; | ||
| 192 | - if (userInfo.token) { | ||
| 193 | - this.setUserInfo(userInfo); | ||
| 194 | - } | ||
| 195 | - uni.showToast({ | ||
| 196 | - title: '登录成功~', | ||
| 197 | - icon: 'none' | ||
| 198 | - }).then(res => { | ||
| 199 | - /** | ||
| 200 | - * 有些时候不起作用 | ||
| 201 | - */ | ||
| 202 | - // uni.navigateBack({ | ||
| 203 | - // delta: 1 | ||
| 204 | - // }); | ||
| 205 | - // #ifdef APP-PLUS||MP | ||
| 206 | - uni.reLaunch({ | ||
| 207 | - url: '/pages/personal/personal' | ||
| 208 | - }); | ||
| 209 | - // #endif | ||
| 210 | - }); | ||
| 211 | - this.saveUserInfo(); | ||
| 212 | - this.getAlarmTotalData(); | ||
| 213 | - } | ||
| 214 | - }) | ||
| 215 | - .catch(e => { | ||
| 216 | - uni.$u.toast(e.data?.message); | ||
| 217 | - }); | ||
| 218 | - }, | ||
| 219 | - openCodeFunc() { | ||
| 220 | - uni.navigateTo({ | ||
| 221 | - url: '../other/code' | ||
| 222 | - }); | ||
| 223 | - }, | ||
| 224 | - findPassrordFunc() { | ||
| 225 | - uni.navigateTo({ | ||
| 226 | - url: '../other/findPassword' | ||
| 227 | - }); | ||
| 228 | - }, | ||
| 229 | - showPasswordMode() { | ||
| 230 | - this.showPassword = !this.showPassword; | ||
| 231 | - } | ||
| 232 | - } | ||
| 233 | -}; | ||
| 234 | -</script> | ||
| 235 | - | ||
| 236 | -<style lang="scss" scoped> | ||
| 237 | -@import './static/login.scss'; | ||
| 238 | -/deep/ button { | ||
| 239 | - background: rgba(0, 0, 0, 0); | ||
| 240 | -} | ||
| 241 | -</style> | 1 | +<template> | 
| 2 | + <view class="login-page"> | ||
| 3 | + <!-- 公共组件-每个页面必须引入 --> | ||
| 4 | + | ||
| 5 | + <public-module></public-module> | ||
| 6 | + | ||
| 7 | + <view class="u-flex login-main"> | ||
| 8 | + <view class="content"> | ||
| 9 | + <view class="hello login-text-muted">您好,</view> | ||
| 10 | + | ||
| 11 | + <view class="hello-welcome login-text-muted">欢迎来到ThingsKit!</view> | ||
| 12 | + </view> | ||
| 13 | + </view> | ||
| 14 | + | ||
| 15 | + <view class="f__login"> | ||
| 16 | + <view class="loginPhone"> | ||
| 17 | + <view class="form-row u-flex"> | ||
| 18 | + <view class="v-input" | ||
| 19 | + ><input | ||
| 20 | + type="text" | ||
| 21 | + v-model="loginForm.username" | ||
| 22 | + maxlength="32" | ||
| 23 | + placeholder="请输入登录账号" | ||
| 24 | + /></view> | ||
| 25 | + | ||
| 26 | + <u-icon></u-icon> | ||
| 27 | + </view> | ||
| 28 | + | ||
| 29 | + <view class="form-row u-flex"> | ||
| 30 | + <view class="v-input" | ||
| 31 | + ><input | ||
| 32 | + type="text" | ||
| 33 | + v-model="loginForm.password" | ||
| 34 | + maxlength="32" | ||
| 35 | + placeholder="请输入登录密码" | ||
| 36 | + :password="!showPassword" | ||
| 37 | + /></view> | ||
| 38 | + | ||
| 39 | + <view class="v-password" @click="showPasswordMode"> | ||
| 40 | + <u-icon | ||
| 41 | + color="#9a9a9a" | ||
| 42 | + width="18" | ||
| 43 | + height="15" | ||
| 44 | + :name="showPassword ? '/static/eye.png' : '/static/eye-hide.png'" | ||
| 45 | + ></u-icon> | ||
| 46 | + </view> | ||
| 47 | + | ||
| 48 | + <u-icon></u-icon> | ||
| 49 | + </view> | ||
| 50 | + | ||
| 51 | + <button class="submit" size="default" @click="onSubmitFunc"> | ||
| 52 | + <text class="text">登录</text> | ||
| 53 | + </button> | ||
| 54 | + | ||
| 55 | + <view class="u-flex row-item"> | ||
| 56 | + <view class="row-phone login-text-gray" @click="openCodeFunc" | ||
| 57 | + >手机验证码登录</view | ||
| 58 | + > | ||
| 59 | + | ||
| 60 | + <view class="row-reset login-text-gray" @click="findPassrordFunc" | ||
| 61 | + >忘记密码</view | ||
| 62 | + > | ||
| 63 | + </view> | ||
| 64 | + | ||
| 65 | + <view class="u-flex link-login"> | ||
| 66 | + <view class="link-text login-text-gray">第三方账号登录</view> | ||
| 67 | + | ||
| 68 | + <view style="height: 20rpx"></view> | ||
| 69 | + | ||
| 70 | + <button class="link-image" @tap="onWenxinAuthorization"> | ||
| 71 | + <image | ||
| 72 | + class="image" | ||
| 73 | + src="../../static/weixin.png" | ||
| 74 | + mode="aspectFill" | ||
| 75 | + ></image> | ||
| 76 | + </button> | ||
| 77 | + </view> | ||
| 78 | + </view> | ||
| 79 | + </view> | ||
| 80 | + </view> | ||
| 81 | +</template> | ||
| 82 | + | ||
| 83 | +<script> | ||
| 84 | +import { mapMutations, mapActions } from "vuex"; | ||
| 85 | + | ||
| 86 | +import { loginApp } from "@/config/login"; | ||
| 87 | + | ||
| 88 | +import baseUrl from "@/config/baseUrl.js"; | ||
| 89 | + | ||
| 90 | +import WXBizDataCrypt from "@/config/WXBizDataCrypt.js"; | ||
| 91 | + | ||
| 92 | +import { appId, appSecrect } from "@/config/constant.js"; | ||
| 93 | + | ||
| 94 | +export default { | ||
| 95 | + data() { | ||
| 96 | + return { | ||
| 97 | + loginForm: { | ||
| 98 | + username: "", | ||
| 99 | + | ||
| 100 | + password: "", | ||
| 101 | + }, | ||
| 102 | + | ||
| 103 | + showPassword: false, | ||
| 104 | + | ||
| 105 | + code: "", | ||
| 106 | + | ||
| 107 | + openid: "", | ||
| 108 | + }; | ||
| 109 | + }, | ||
| 110 | + | ||
| 111 | + onLoad() { | ||
| 112 | + wx.login({ | ||
| 113 | + success: (res) => { | ||
| 114 | + if (res.code) { | ||
| 115 | + this.code = res.code; | ||
| 116 | + | ||
| 117 | + //这里获取openid | ||
| 118 | + } else { | ||
| 119 | + return; | ||
| 120 | + } | ||
| 121 | + }, | ||
| 122 | + }); | ||
| 123 | + }, | ||
| 124 | + | ||
| 125 | + methods: { | ||
| 126 | + ...mapMutations(["setUserInfo"]), | ||
| 127 | + | ||
| 128 | + ...mapActions(["updateBadgeTotal"]), | ||
| 129 | + | ||
| 130 | + //微信授权登录 | ||
| 131 | + | ||
| 132 | + //#ifdef MP-WEIXIN | ||
| 133 | + | ||
| 134 | + onWenxinAuthorization() { | ||
| 135 | + wx.getUserProfile({ | ||
| 136 | + desc: "微信第三方授权", | ||
| 137 | + | ||
| 138 | + success: (reswenxin) => { | ||
| 139 | + console.log("res=======>", reswenxin); | ||
| 140 | + | ||
| 141 | + if ( | ||
| 142 | + reswenxin.errMsg === "getUserProfile:ok" && | ||
| 143 | + reswenxin.encryptedData | ||
| 144 | + ) { | ||
| 145 | + console.log("获取code", this.code); | ||
| 146 | + | ||
| 147 | + //获取用户信息 | ||
| 148 | + | ||
| 149 | + let obj = { | ||
| 150 | + avatarUrl: reswenxin.userInfo.avatarUrl, | ||
| 151 | + | ||
| 152 | + thirdUserId: this.openid, | ||
| 153 | + }; | ||
| 154 | + | ||
| 155 | + //判断是否需要绑定 | ||
| 156 | + | ||
| 157 | + uni.$u.http | ||
| 158 | + | ||
| 159 | + .get(`/yt/third/login/${this.code}`) | ||
| 160 | + | ||
| 161 | + .then((res) => { | ||
| 162 | + console.log("Res", res); | ||
| 163 | + | ||
| 164 | + //设置全局变量openId | ||
| 165 | + | ||
| 166 | + // getApp().globalData.openId = res.data.openid; | ||
| 167 | + | ||
| 168 | + if ( | ||
| 169 | + res.token == "" || | ||
| 170 | + (res.token == null && res.refreshToken) | ||
| 171 | + ) { | ||
| 172 | + //需要绑定 | ||
| 173 | + | ||
| 174 | + let userInfo = { | ||
| 175 | + isThirdLogin: true, //用于判断是否是第三方登录并且需要绑定账号 | ||
| 176 | + | ||
| 177 | + avatar: obj.avatarUrl, | ||
| 178 | + }; | ||
| 179 | + | ||
| 180 | + this.setUserInfo(userInfo); | ||
| 181 | + | ||
| 182 | + //设置全局变量openId | ||
| 183 | + | ||
| 184 | + getApp().globalData.openId = res.refreshToken; | ||
| 185 | + | ||
| 186 | + uni.reLaunch({ | ||
| 187 | + url: "../../pages/personal/personal", | ||
| 188 | + }); | ||
| 189 | + } else { | ||
| 190 | + // 不需要绑定,直接第三方登录使用 | ||
| 191 | + | ||
| 192 | + let resObj = { | ||
| 193 | + refreshToken: res.refreshToken, | ||
| 194 | + | ||
| 195 | + isToken: res.token, | ||
| 196 | + }; | ||
| 197 | + | ||
| 198 | + let userInfo = { | ||
| 199 | + ...resObj, | ||
| 200 | + | ||
| 201 | + token: true, //token用于判断是否登录 | ||
| 202 | + | ||
| 203 | + isThirdLoginAndNoDind: true, //用于判断是否是第三方登录并且不需要绑定账号 | ||
| 204 | + }; | ||
| 205 | + | ||
| 206 | + if (userInfo.token) { | ||
| 207 | + this.setUserInfo(userInfo); | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | + uni.showToast({ | ||
| 211 | + title: "第三方账号登录成功~", | ||
| 212 | + | ||
| 213 | + icon: "none", | ||
| 214 | + }); | ||
| 215 | + | ||
| 216 | + this.saveUserInfo(); | ||
| 217 | + | ||
| 218 | + this.getAlarmTotalData(); | ||
| 219 | + | ||
| 220 | + uni.reLaunch({ | ||
| 221 | + url: "../../pages/personal/personal", | ||
| 222 | + }); | ||
| 223 | + } | ||
| 224 | + }) | ||
| 225 | + | ||
| 226 | + .catch((e) => { | ||
| 227 | + uni.$u.toast(e.data?.message); | ||
| 228 | + }); | ||
| 229 | + } | ||
| 230 | + }, | ||
| 231 | + | ||
| 232 | + fail: (res) => { | ||
| 233 | + //拒绝授权 | ||
| 234 | + | ||
| 235 | + return; | ||
| 236 | + }, | ||
| 237 | + }); | ||
| 238 | + }, | ||
| 239 | + | ||
| 240 | + //#endif | ||
| 241 | + | ||
| 242 | + saveUserInfo() { | ||
| 243 | + //储存个人信息 | ||
| 244 | + | ||
| 245 | + uni.$u.http.get("/yt/user/me/info").then((res) => { | ||
| 246 | + if (res) { | ||
| 247 | + this.setUserInfo(res); | ||
| 248 | + } | ||
| 249 | + }); | ||
| 250 | + }, | ||
| 251 | + | ||
| 252 | + async getAlarmTotalData() { | ||
| 253 | + const res = await uni.$u.http.get("/yt/homepage/app"); | ||
| 254 | + if (res) { | ||
| 255 | + //异步实时更新告警徽标数 | ||
| 256 | + this.updateBadgeTotal(res.totalAlarm.activedAlarm); | ||
| 257 | + } | ||
| 258 | + }, | ||
| 259 | + | ||
| 260 | + onSubmitFunc() { | ||
| 261 | + if (this.loginForm.username == "") { | ||
| 262 | + return uni.$u.toast("请输入登录账号~"); | ||
| 263 | + } | ||
| 264 | + const passReg = | ||
| 265 | + /^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{8,}$/; | ||
| 266 | + | ||
| 267 | + if (this.loginForm.password == "") { | ||
| 268 | + uni.showToast({ | ||
| 269 | + title: "请输入登录密码~", | ||
| 270 | + | ||
| 271 | + icon: "none", | ||
| 272 | + }); | ||
| 273 | + return; | ||
| 274 | + } else if (!passReg.test(this.loginForm.password)) { | ||
| 275 | + uni.showToast({ | ||
| 276 | + title: | ||
| 277 | + "密码格式不正确(至少一个大写英文字母、至少一个小写英文字母、至少一位数字、至少一个特殊字符、最少八个字符)~", | ||
| 278 | + | ||
| 279 | + icon: "none", | ||
| 280 | + | ||
| 281 | + duration: 3000, | ||
| 282 | + }); | ||
| 283 | + | ||
| 284 | + return; | ||
| 285 | + } | ||
| 286 | + uni.$u.http | ||
| 287 | + .post("/auth/login", this.loginForm) | ||
| 288 | + | ||
| 289 | + .then((res) => { | ||
| 290 | + if (res) { | ||
| 291 | + // 储存登录信息 | ||
| 292 | + | ||
| 293 | + let resObj = { | ||
| 294 | + refreshToken: res.refreshToken, | ||
| 295 | + | ||
| 296 | + isToken: res.token, | ||
| 297 | + }; | ||
| 298 | + | ||
| 299 | + let userInfo = { | ||
| 300 | + ...resObj, | ||
| 301 | + | ||
| 302 | + token: true, //token用于判断是否登录 | ||
| 303 | + | ||
| 304 | + isThirdLogin: false, | ||
| 305 | + }; | ||
| 306 | + | ||
| 307 | + if (userInfo.token) { | ||
| 308 | + this.setUserInfo(userInfo); | ||
| 309 | + } | ||
| 310 | + | ||
| 311 | + uni | ||
| 312 | + .showToast({ | ||
| 313 | + title: "登录成功~", | ||
| 314 | + | ||
| 315 | + icon: "none", | ||
| 316 | + }) | ||
| 317 | + .then((res) => { | ||
| 318 | + /** | ||
| 319 | + | ||
| 320 | + * 有些时候不起作用 | ||
| 321 | + | ||
| 322 | + */ | ||
| 323 | + | ||
| 324 | + // uni.navigateBack({ | ||
| 325 | + | ||
| 326 | + // delta: 1 | ||
| 327 | + | ||
| 328 | + // }); | ||
| 329 | + | ||
| 330 | + // #ifdef APP-PLUS||MP | ||
| 331 | + | ||
| 332 | + uni.reLaunch({ | ||
| 333 | + url: "/pages/personal/personal", | ||
| 334 | + }); | ||
| 335 | + | ||
| 336 | + // #endif | ||
| 337 | + }); | ||
| 338 | + | ||
| 339 | + this.saveUserInfo(); | ||
| 340 | + | ||
| 341 | + this.getAlarmTotalData(); | ||
| 342 | + } | ||
| 343 | + }) | ||
| 344 | + | ||
| 345 | + .catch((e) => { | ||
| 346 | + uni.$u.toast(e.data?.message); | ||
| 347 | + }); | ||
| 348 | + }, | ||
| 349 | + | ||
| 350 | + openCodeFunc() { | ||
| 351 | + uni.navigateTo({ | ||
| 352 | + url: "../other/code", | ||
| 353 | + }); | ||
| 354 | + }, | ||
| 355 | + | ||
| 356 | + findPassrordFunc() { | ||
| 357 | + uni.navigateTo({ | ||
| 358 | + url: "../other/findPassword", | ||
| 359 | + }); | ||
| 360 | + }, | ||
| 361 | + | ||
| 362 | + showPasswordMode() { | ||
| 363 | + this.showPassword = !this.showPassword; | ||
| 364 | + }, | ||
| 365 | + }, | ||
| 366 | +}; | ||
| 367 | +</script> | ||
| 368 | + | ||
| 369 | +<style lang="scss" scoped> | ||
| 370 | +@import "./static/login.scss"; | ||
| 371 | + | ||
| 372 | +/deep/ button { | ||
| 373 | + background: rgba(0, 0, 0, 0); | ||
| 374 | +} | ||
| 375 | +</style> | 
| @@ -29,6 +29,9 @@ export const mutations = { | @@ -29,6 +29,9 @@ export const mutations = { | ||
| 29 | uni.removeStorageSync('storagePre'); | 29 | uni.removeStorageSync('storagePre'); | 
| 30 | // #endif | 30 | // #endif | 
| 31 | }, | 31 | }, | 
| 32 | + setBadgeInfo(state,payload){ | ||
| 33 | + state.badgeInfo = payload; | ||
| 34 | + } | ||
| 32 | }; | 35 | }; | 
| 33 | export const actions = { | 36 | export const actions = { | 
| 34 | //更新告警徽标数 | 37 | //更新告警徽标数 | 
| @@ -36,6 +39,7 @@ export const actions = { | @@ -36,6 +39,7 @@ export const actions = { | ||
| 36 | state, | 39 | state, | 
| 37 | commit | 40 | commit | 
| 38 | }, data) { | 41 | }, data) { | 
| 39 | - state.badgeInfo = data | 42 | + commit('setBadgeInfo',data) | 
| 43 | + console.log('Change total', data,state); | ||
| 40 | } | 44 | } | 
| 41 | }; | 45 | }; |