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 | }; |