From 39b5e3774b696b60da58db42ee7fe4439b338132 Mon Sep 17 00:00:00 2001
From: fhysy <1149505133@qq.com>
Date: Fri, 25 Apr 2025 14:06:05 +0800
Subject: [PATCH] =?UTF-8?q?feat(network):=20=E9=A1=B9=E7=9B=AE=E5=88=9D?=
=?UTF-8?q?=E5=A7=8B=E5=8C=96=E3=80=81=E8=AF=B7=E6=B1=82=E5=B0=81=E8=A3=85?=
=?UTF-8?q?=EF=BC=8C=E4=B8=BB=E5=8C=85=E9=83=A8=E5=88=86=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=E5=BC=80=E5=8F=91=E5=92=8C=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?=
=?UTF-8?q?=E7=AD=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 完成登录、配置、统计、设备、我的、修改密码页开发
- 初始化项目tabbar图标、默认图片等
- 重构请求封装,项目配置等
---
App.vue | 6 +-
manifest.json | 10 +-
network/api/index.js | 37 +-
network/api/iots/index.js | 54 ++-
network/config.js | 4 +-
network/request.js | 6 +-
pages.json | 30 +-
pages/my/reset-password.vue | 4 +-
pages/tabbar/config.vue | 467 ++++++++++---------
pages/tabbar/dashboard.vue | 458 ++++++++++++++++++
pages/tabbar/device.vue | 405 ++++++++++++++++
pages/tabbar/login.vue | 194 +++++---
pages/tabbar/my.vue | 47 +-
static/app-plus/image/device/device-card.png | Bin 0 -> 7357 bytes
static/image/tabbar/app-scan.png | Bin 4251 -> 2788 bytes
static/image/tabbar/dashboard-active.png | Bin 0 -> 521 bytes
static/image/tabbar/dashboard.png | Bin 0 -> 474 bytes
static/image/tabbar/iot-active.png | Bin 0 -> 783 bytes
static/image/tabbar/iot.png | Bin 0 -> 705 bytes
static/image/tabbar/my-active.png | Bin 1776 -> 534 bytes
static/image/tabbar/my.png | Bin 2020 -> 494 bytes
static/image/tabbar/new-active.png | Bin 1567 -> 527 bytes
static/image/tabbar/new.png | Bin 1785 -> 493 bytes
static/image/tabbar/scan-active.png | Bin 1856 -> 560 bytes
static/image/tabbar/scan.png | Bin 1313 -> 510 bytes
25 files changed, 1404 insertions(+), 318 deletions(-)
create mode 100644 pages/tabbar/dashboard.vue
create mode 100644 pages/tabbar/device.vue
create mode 100644 static/app-plus/image/device/device-card.png
create mode 100644 static/image/tabbar/dashboard-active.png
create mode 100644 static/image/tabbar/dashboard.png
create mode 100644 static/image/tabbar/iot-active.png
create mode 100644 static/image/tabbar/iot.png
diff --git a/App.vue b/App.vue
index 415eb00..ff6cd74 100644
--- a/App.vue
+++ b/App.vue
@@ -10,14 +10,14 @@
if(!configList || configList.length == 0){
let configList = [{
id:this.$u.guid(32),
- protocol:'https://',
- address:'cloud.iot-fast.com',
+ protocol:'http://',
+ address:'192.168.1.17:8848',
}]
// #ifdef APP-PLUS
configList.push({
id:this.$u.guid(32),
protocol:'http://',
- address:'192.168.21.22',
+ address:'192.168.1.17:8848',
})
// #endif
uni.setStorageSync('configList',configList)
diff --git a/manifest.json b/manifest.json
index 8fa087c..6613ec4 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,9 +1,9 @@
{
- "name" : "物联网可视化",
- "appid" : "__UNI__604B8F1",
+ "name" : "德润物联网",
+ "appid" : "__UNI__B7FE99B",
"description" : "",
- "versionName" : "1.0.34",
- "versionCode" : 1034,
+ "versionName" : "1.0.0",
+ "versionCode" : 100,
"transformPx" : false,
/* 5+App特有相关 */
"app-plus" : {
@@ -135,7 +135,7 @@
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
- "appid" : "wx27c271b0cb420015",
+ "appid" : "wxc1dd0068f0f85026",
"setting" : {
"urlCheck" : false,
"postcss" : true,
diff --git a/network/api/index.js b/network/api/index.js
index a11a67c..4266822 100644
--- a/network/api/index.js
+++ b/network/api/index.js
@@ -14,7 +14,7 @@ export default {
getAppConfig(data){
return new Promise((resolve, reject) => {
request.customRequest({
- url: '/admin/admin/site/config',
+ url: '/system/config/front',
method: 'GET',
},data)
.then((res) =>{
@@ -58,7 +58,7 @@ export default {
passwordLogin(data){
return new Promise((resolve, reject) => {
request.customRequest({
- url: '/user/admin/site/accountLogin',
+ url: '/authorize/login',
method: 'POST',
},data)
.then((res) =>{
@@ -68,6 +68,20 @@ export default {
})
})
},
+ // 获取用户信息
+ userLogout(data){
+ return new Promise((resolve, reject) => {
+ request.TokenRequest({
+ url: '/user-token/reset',
+ method: 'GET',
+ },data)
+ .then((res) =>{
+ resolve(res);
+ }).catch(err =>{
+ reject(err);
+ })
+ })
+ },
// 发送短信验证码
sendSms(data){
@@ -103,7 +117,7 @@ export default {
getUserInfo(data){
return new Promise((resolve, reject) => {
request.TokenRequest({
- url: '/user/admin/member/info',
+ url: '/user/detail',
method: 'GET',
},data)
.then((res) =>{
@@ -134,7 +148,22 @@ export default {
updatePwd(data){
return new Promise((resolve, reject) => {
request.TokenRequest({
- url: '/user/admin/member/updatePwd',
+ url: '/user/passwd',
+ method: 'PUT',
+ },data)
+ .then((res) =>{
+ resolve(res);
+ }).catch(err =>{
+ reject(err);
+ })
+ })
+ },
+
+ // 看板统计查询
+ getDashboardSelect(data){
+ return new Promise((resolve, reject) => {
+ request.TokenRequest({
+ url: '/dashboard/_multi',
method: 'POST',
},data)
.then((res) =>{
diff --git a/network/api/iots/index.js b/network/api/iots/index.js
index e93e05a..20e09b1 100644
--- a/network/api/iots/index.js
+++ b/network/api/iots/index.js
@@ -1,6 +1,21 @@
import request from "../../request.js"
export default {
+ // 获取设备数
+ getDeviceInstanceCount(data){
+ return new Promise((resolve, reject) => {
+ request.TokenRequest({
+ url: '/device/instance/_count',
+ method: 'GET',
+ },data)
+ .then((res) =>{
+ resolve(res);
+ }).catch(err =>{
+ reject(err);
+ })
+ })
+ },
+
// 获取设备统计数量
getDeviceCount(data){
return new Promise((resolve, reject) => {
@@ -20,8 +35,8 @@ export default {
getProductList(data){
return new Promise((resolve, reject) => {
request.TokenRequest({
- url: '/iot/admin/product/list',
- method: 'GET',
+ url: '/device-product/_query/no-paging',
+ method: 'POST',
},data)
.then((res) =>{
resolve(res);
@@ -35,7 +50,7 @@ export default {
getDeviceList(data){
return new Promise((resolve, reject) => {
request.TokenRequest({
- url: '/iot/admin/device/list',
+ url: '/device-instance/_query',
method: 'POST',
},data)
.then((res) =>{
@@ -136,12 +151,25 @@ export default {
})
})
},
-
- // 告警级别列表
+ // 获取告警记录列表
+ getAlarmList(data){
+ return new Promise((resolve, reject) => {
+ request.TokenRequest({
+ url: '/alarm/record/_query',
+ method: 'POST',
+ },data)
+ .then((res) =>{
+ resolve(res);
+ }).catch(err =>{
+ reject(err);
+ })
+ })
+ },
+ // 获取默认告警级别
getAlarmLevelList(data){
return new Promise((resolve, reject) => {
request.TokenRequest({
- url: '/iot/admin/alarm/level/list',
+ url: '/alarm/config/default/level',
method: 'GET',
},data)
.then((res) =>{
@@ -151,6 +179,20 @@ export default {
})
})
},
+ // // 告警级别列表
+ // getAlarmLevelList(data){
+ // return new Promise((resolve, reject) => {
+ // request.TokenRequest({
+ // url: '/iot/admin/alarm/level/list',
+ // method: 'GET',
+ // },data)
+ // .then((res) =>{
+ // resolve(res);
+ // }).catch(err =>{
+ // reject(err);
+ // })
+ // })
+ // },
// 概览页统计(图表)
getAlarmRecordStat(data){
diff --git a/network/config.js b/network/config.js
index 95b9535..be6a0ec 100644
--- a/network/config.js
+++ b/network/config.js
@@ -14,8 +14,8 @@ if(process.env.NODE_ENV === 'development'){
// wsUrl = "ws://iotos-ui-dev.iotos.192.168.10.243.nip.io:32764"
// configurationUrl = "http://192.168.18.139:8855"
// configurationhtmlUrl = "http://hceditor-2d-dev.hceditor.192.168.10.243.nip.io:30405"
- url = 'https://miot.gkiiot.com'
- wsUrl = 'wss://miot.gkiiot.com'
+ url = 'http://192.168.1.17:8848'
+ wsUrl = 'ws://192.168.1.17:8848'
configurationUrl = 'https://2d.gkiiot.com/prod-api'
configurationhtmlUrl = 'https://2d.gkiiot.com'
}else{
diff --git a/network/request.js b/network/request.js
index 499d0d4..6ce21f6 100644
--- a/network/request.js
+++ b/network/request.js
@@ -94,7 +94,7 @@ const TokenRequest = (opts, data) => {
data: data,
method: opts.method,
header: {
- 'Authorization': tokenKey,
+ 'x-access-token': tokenKey,
},
}
let promise = new Promise(function(resolve, reject) {
@@ -102,7 +102,7 @@ const TokenRequest = (opts, data) => {
(res) => {
// console.log("请求返回",res)
// 令牌过期关闭所有页面跳转登录页
- if(res[1].data.code==61){
+ if(res[1].data.status==401){
uni.showToast({
title: '登录已过期,请重新登录',
icon: 'none',
@@ -114,7 +114,7 @@ const TokenRequest = (opts, data) => {
setTimeout(()=>{
uni.reLaunch({url:'/pages/tabbar/login'});
},1500)
- }else if(res[1].data.code>0){
+ }else if(res[1].data.status!=200){
uni.showToast({
title: res[1].data.message,
icon: 'none',
diff --git a/pages.json b/pages.json
index cf199e8..fd1705a 100644
--- a/pages.json
+++ b/pages.json
@@ -29,6 +29,20 @@
// "navigationStyle":"custom"
// }
// },
+ {
+ "path": "pages/tabbar/dashboard",
+ "style": {
+ "navigationBarTitleText": "统计看板",
+ "navigationBarBackgroundColor": "#FFFFFF"
+ }
+ },
+ {
+ "path": "pages/tabbar/device",
+ "style": {
+ "navigationBarTitleText": "设备",
+ "navigationBarBackgroundColor": "#FFFFFF"
+ }
+ },
{
"path": "pages/tabbar/new",
"style": {
@@ -343,15 +357,15 @@
},
// #endif
"list": [{
- "pagePath": "pages/tabbar/home",
- "iconPath": "static/image/tabbar/home.png",
- "selectedIconPath": "static/image/tabbar/home-active.png",
- "text": "首页"
+ "pagePath": "pages/tabbar/dashboard",
+ "iconPath": "static/image/tabbar/dashboard.png",
+ "selectedIconPath": "static/image/tabbar/dashboard-active.png",
+ "text": "统计"
},{
- "pagePath": "pages/tabbar/workbench",
- "iconPath": "static/image/tabbar/workbench.png",
- "selectedIconPath": "static/image/tabbar/workbench-active.png",
- "text": "工作台"
+ "pagePath": "pages/tabbar/device",
+ "iconPath": "static/image/tabbar/iot.png",
+ "selectedIconPath": "static/image/tabbar/iot-active.png",
+ "text": "设备"
},
// #ifdef MP-WEIXIN
{
diff --git a/pages/my/reset-password.vue b/pages/my/reset-password.vue
index a4feb49..3f66a84 100644
--- a/pages/my/reset-password.vue
+++ b/pages/my/reset-password.vue
@@ -56,13 +56,13 @@
submit(){
if(this.verification()){
let params={
- id:this.infoData.id,
+ // id:this.infoData.id,
newPassword:this.newPassword,
oldPassword:this.oldPassword,
}
this.$api.updatePwd(params).then(res => {
console.log("submit",res);
- if(res.code==0){
+ if(res.status == 200){
this.$u.toast(res.message);
this.$store.commit('setTokenKey', '');
uni.$u.toast('退出登录成功');
diff --git a/pages/tabbar/config.vue b/pages/tabbar/config.vue
index 34016f9..e20b859 100644
--- a/pages/tabbar/config.vue
+++ b/pages/tabbar/config.vue
@@ -1,46 +1,91 @@
-
-
-
-
-
- 已选择
-
-
- {{item.protocol+item.address}}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.protocol.includes('https') ? 'HTTPS' : 'HTTP' }}
+
+
+
+
+ {{ item.address }}
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+ + 添加域名
-
+
+
+
+
- 网络协议:
+ 网络协议
- {{form.protocol?form.protocol:'请选择'}}
-
+ {{ form.protocol ? form.protocol : '请选择' }}
+
+
+
+
+
- 域名或ip:
+ 域名
-
+
+
+
+
+
@@ -49,122 +94,122 @@
export default {
data() {
return {
- configIndex:0,
- configList:[],
- form:{
- id:'',
- protocol:'',
- address:'',
+ configIndex: 0,
+ configList: [],
+ form: {
+ id: '',
+ protocol: '',
+ address: '',
},
- protocolShow:false,
- protocolList:[
- {
- value: 'http://',
- label: 'http://'
- },
+ protocolShow: false,
+ protocolList: [
{
value: 'https://',
- label: 'https://'
+ label: 'HTTPS'
+ },
+ {
+ value: 'http://',
+ label: 'HTTP'
}
],
- show:false,
+ show: false,
};
},
onLoad() {
// 小程序只使用https
// #ifdef MP-WEIXIN
- this.protocolList = [
- {
- value: 'https://',
- label: 'https://'
- }
- ]
+ // this.protocolList = [
+ // {
+ // value: 'https://',
+ // label: 'HTTPS'
+ // }
+ // ]
// #endif
this.getConfigList();
},
- methods:{
- getConfigList(){
+ methods: {
+ getConfigList() {
uni.getStorage({
- key:'configList',
+ key: 'configList',
}).then(res => {
// 如果返回数组为两位就是正确
- if(res.length==2){
+ if (res.length == 2) {
this.configList = res[1].data;
}
return uni.getStorage({
- key:'configIndex',
+ key: 'configIndex',
})
}).then(res => {
- console.log("configIndex",res)
- if(res.length==2){
+ console.log("configIndex", res)
+ if (res.length == 2) {
this.configIndex = res[1].data;
}
})
},
- changeConfig(i){
- console.log("index",i)
- if(i !== this.configIndex){
+ changeConfig(i) {
+ console.log("index", i)
+ if (i !== this.configIndex) {
this.configIndex = i;
uni.setStorage({
- key:'configIndex',
+ key: 'configIndex',
data: i,
}).then(res => {
console.log("修改索引")
})
}
},
- verification(){
- if(!this.form.protocol){
+ verification() {
+ if (!this.form.protocol) {
this.$refs.uToast.show({
title: '请先选择协议!',
type: 'error'
})
return false;
- }else if(!this.form.address){
+ } else if (!this.form.address) {
this.$refs.uToast.show({
title: '请先输入地址',
type: 'error',
})
return false;
- }else if(!this.$u.test.url(this.form.protocol+this.form.address)){
+ } else if (!this.$u.test.url(this.form.protocol + this.form.address)) {
this.$refs.uToast.show({
title: '请确认输入地址正确',
type: 'error',
})
return false;
- }else{
+ } else {
return true;
}
},
- openAdd(){
- if(this.configList.length == 0){
+ openAdd() {
+ if (this.configList.length == 0) {
this.form = {
- id:'',
- protocol:'https://',
- address:'cloud.iot-fast.com',
+ id: '',
+ protocol: 'http://',
+ address: '192.168.1.17:8848',
}
- }else{
+ } else {
this.form = {
- id:'',
- protocol:'',
- address:'',
+ id: '',
+ protocol: '',
+ address: '',
}
}
-
+
this.show = true;
},
- addConfig(){
- console.log("添加页面",this.form)
- if(this.verification()){
- if(this.form.id===''){
+ addConfig() {
+ console.log("添加页面", this.form)
+ if (this.verification()) {
+ if (this.form.id === '') {
// 新增
this.configList.push({
- id:this.$u.guid(32),
- protocol:this.form.protocol,
- address:this.form.address,
+ id: this.$u.guid(32),
+ protocol: this.form.protocol,
+ address: this.form.address,
})
uni.setStorage({
- key:'configList',
+ key: 'configList',
data: this.configList,
}).then(res => {
this.$refs.uToast.show({
@@ -172,9 +217,9 @@
type: 'success',
})
})
- if(this.configList.length==1){
+ if (this.configList.length == 1) {
uni.setStorage({
- key:'configIndex',
+ key: 'configIndex',
data: 0,
}).then(res => {
console.log("添加第一个域名索引为0")
@@ -182,18 +227,18 @@
}
this.show = false;
this.getConfigList()
- console.log("configList",this.configList)
- }else{
+ console.log("configList", this.configList)
+ } else {
// 编辑
- this.configList.map(item=>{
- if(item.id == this.form.id){
- item.protocol=this.form.protocol;
- item.address=this.form.address;
+ this.configList.map(item => {
+ if (item.id == this.form.id) {
+ item.protocol = this.form.protocol;
+ item.address = this.form.address;
}
return item;
})
uni.setStorage({
- key:'configList',
+ key: 'configList',
data: this.configList,
}).then(res => {
this.$refs.uToast.show({
@@ -204,28 +249,29 @@
this.show = false;
this.getConfigList()
}
- }else{
+ } else {
this.$refs.uModal.clearLoading();
}
},
- confirmProtocol(e){
+ confirmProtocol(e) {
this.form.protocol = e[0].value;
},
- openEdit(index){
- this.form = this.configList[index];
+ openEdit(index) {
+ console.log("编辑",index)
+ this.form = JSON.parse(JSON.stringify(this.configList[index]));
this.show = true;
},
- delConfig(index){
+ delConfig(index) {
uni.showModal({
title: '提示',
content: '确认要删除域名吗?',
- success: (res)=>{
+ success: (res) => {
if (res.confirm) {
console.log('用户点击确定');
-
+
this.configList.splice(index, 1);
uni.setStorage({
- key:'configList',
+ key: 'configList',
data: this.configList,
}).then(res => {
this.$refs.uToast.show({
@@ -233,19 +279,19 @@
type: 'success',
})
})
- if(this.configIndexindex){
+ if (this.configIndex < index) {
+ } else {
+ if (this.configIndex > index) {
this.configIndex = this.configIndex - 1;
- }else if(this.configIndex==index){
- if(this.configList.length==0){
+ } else if (this.configIndex == index) {
+ if (this.configList.length == 0) {
this.configIndex = -1;
- }else{
+ } else {
this.configIndex = 0;
}
}
uni.setStorage({
- key:'configIndex',
+ key: 'configIndex',
data: this.configIndex,
}).then(res => {
console.log("修改索引")
@@ -261,129 +307,130 @@
}
}
-
+
+ .add-button-wrapper {
+ padding: 30rpx 20rpx;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background-color: #fff;
+ box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
+ }
+
+ .slot-content {
+ padding: 20rpx 30rpx;
+ }
+
+ .form-item {
+ margin-bottom: 30rpx;
+
+ .form-label {
+ font-size: 28rpx;
+ color: #666;
+ margin-bottom: 20rpx;
+ }
+
+ .form-value {
+ background-color: #f5f5f5;
+ border-radius: 8rpx;
+ height: 80rpx;
+ display: flex;
+ align-items: center;
+ padding: 0 20rpx;
+ position: relative;
+
+ input {
+ width: 100%;
+ height: 100%;
+ }
+
+ .arrow-icon {
+ position: absolute;
+ right: 20rpx;
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/pages/tabbar/dashboard.vue b/pages/tabbar/dashboard.vue
new file mode 100644
index 0000000..bb68d60
--- /dev/null
+++ b/pages/tabbar/dashboard.vue
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+ {{deviceInfo.deviceNum || 0}}
+ 设备数量
+
+
+ {{deviceInfo.deviceOnlineNum || 0}}
+ 在线数
+
+
+ {{deviceInfo.deviceOfflineNum || 0}}
+ 离线数
+
+
+
+
+
+
+ {{deviceInfo.todayMessageNum || 0}}
+ 今日设备消息量
+
+
+ {{deviceInfo.thisMonthMessageNum || 0}}
+ 当月设备消息量
+
+
+
+
+
+
+
+
+
+
+
+ {{alarmInfo.todayMessageNum || 0}}
+ 今日告警数
+
+
+ {{alarmInfo.thisMonthMessageNum || 0}}
+ 当月告警数
+
+
+
+
+
+ 最新告警列表
+
+
+
+
+
+ {{ item.alarmName }}
+ {{ item.state.text }}
+
+
+ {{ getAlarmName(item.level) }}
+ {{$u.timeFormat(item.time, 'yyyy-mm-dd hh:MM:ss')}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/tabbar/device.vue b/pages/tabbar/device.vue
new file mode 100644
index 0000000..7c4bb7b
--- /dev/null
+++ b/pages/tabbar/device.vue
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设备总数: {{total}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.state.text }}
+
+
+
+ {{ item.deviceType.text }}
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pages/tabbar/login.vue b/pages/tabbar/login.vue
index 2f6566d..12ac0c4 100644
--- a/pages/tabbar/login.vue
+++ b/pages/tabbar/login.vue
@@ -1,12 +1,15 @@
-
-
-
-
- {{appName}}
-
-
+
+
+ 配置
+
+
+
+ {{appName}}
+
+
+
@@ -37,12 +40,17 @@
-
-
+
+
+
+ {{recordNumber?'备案号:' + recordNumber :''}}
+
+
@@ -69,8 +77,8 @@
],
tabCurrent:0,
ipAddress: null,
- username:'',
- password:'',
+ username:'admin',
+ password:'admin',
passwordIsShow: true,
passImgCode:'',
codeShow:false,
@@ -79,9 +87,10 @@
imgCodeTxt:'',
phone:null,
code:'',
- appName: '物联网可视化',
- isImgCode:true,
- logoPath:'https://hcwl-cdn.cdn.bcebos.com/hcapp/hc-work/img/logo.png',
+ appName: '物联网平台',
+ recordNumber: '',
+ isImgCode:false,
+ logoPath:'http://static.drgyen.com/app/iot-ui-app/image/icon-192x192.png',
}
},
components:{
@@ -91,10 +100,10 @@
onLoad() {
let configList = uni.getStorageSync('configList');
let configIndex = uni.getStorageSync('configIndex');
- this.logoPath = configList[configIndex].protocol + configList[configIndex].address + '/admin/static/image/logo.png';
+ // this.logoPath = configList[configIndex].protocol + configList[configIndex].address + '/admin/static/image/logo.png';
},
onShow() {
- this.getLoginConfig();
+ // this.getLoginConfig();
// 获取应用名称
this.getAppConfig();
if(this.isImgCode){
@@ -140,8 +149,8 @@
// 验证token是否有效
verifyToken(){
this.$api.getUserInfo({}).then(res => {
- if(res.code == 0){
- uni.switchTab({url:'/pages/tabbar/workbench'})
+ if(res.status == 200){
+ uni.switchTab({url:'/pages/tabbar/device'})
}
}, error => {
})
@@ -244,12 +253,15 @@
},
getAppConfig(){
this.$api.getAppConfig({}).then(res => {
- if(res.code == 0){
- if(res.data.basicName && res.data.basicName!==this.appName){
- this.appName = res.data.basicName;
+ if(res.status == 200){
+ if(res.result.title && res.result.title!==this.appName){
+ this.appName = res.result.title;
+ if(res.result && res.result.logo){
+ this.logoPath = res.result.logo;
+ }
uni.setStorage({
key:'appName',
- data: res.data.basicName,
+ data: res.result.title,
})
}
@@ -276,23 +288,27 @@
if(this.verification()){
let params = {
username: this.username,
- password: encrypt(this.password),
+ password: this.password,
+ remember: false,
+ expires: 3600000,
+ verifyCode: this.imgCodeTxt,
+ verifyKey: this.imgCodeKey,
// grant_type: 'password'
- autoLogin:true,
- code:this.imgCodeTxt,
- cid:this.imgCodeKey
+ // autoLogin:true,
+ // code:this.imgCodeTxt,
+ // cid:this.imgCodeKey
}
this.$api.passwordLogin(params).then(res => {
- if (res.code == 0) {
+ if (res.status == 200) {
// 保存数据到vuex
- this.$store.commit('setTokenKey', res.data.token);
+ this.$store.commit('setTokenKey', res.result.token);
// this.$store.commit('setHtpUrl', this.$htoProtocol + this.ipAddress);
// token过期时间
- let expire = res.data.expires*1000 + new Date().getTime();
+ let expire = res.result.expires + new Date().getTime();
// 缓存信息
uni.setStorage({
key:'token',
- data: res.data.token,
+ data: res.result.token,
}).then(res => {
return uni.setStorage({
key:'expire',
@@ -312,7 +328,7 @@
this.$refs.uToast.show({
title: '登录成功',
type: 'success',
- url: '/pages/tabbar/workbench',
+ url: '/pages/tabbar/device',
isTab:true,
duration:1000
})
@@ -361,7 +377,7 @@
this.$refs.uToast.show({
title: '登录成功',
type: 'success',
- url: '/pages/tabbar/workbench',
+ url: '/pages/tabbar/device',
isTab:true,
duration:1000
})
@@ -431,66 +447,116 @@
diff --git a/pages/tabbar/my.vue b/pages/tabbar/my.vue
index ffc1022..680db4f 100644
--- a/pages/tabbar/my.vue
+++ b/pages/tabbar/my.vue
@@ -46,7 +46,7 @@
-
+
@@ -172,12 +172,13 @@
},
onShow() {
let userInfo = uni.getStorageSync('userInfo');
+ console.log("userInfo",userInfo)
if(userInfo){
this.userInfo = {
- name:userInfo.username,
- company:userInfo.realName,
+ name:userInfo.name,
+ company:userInfo.realName || '物联网平台',
imgPath:userInfo.avatar,
- phone:phoneHide(userInfo.mobile)
+ // phone:phoneHide(userInfo.telephone)
}
}
},
@@ -238,16 +239,32 @@
if (res.confirm) {
console.log('用户点击确定');
// this.$store.commit('logout');
- this.$store.commit('setTokenKey', '');
- uni.$u.toast('退出登录成功');
- uni.removeStorageSync('token')
- uni.removeStorageSync('expire')
- setTimeout(()=>{
- uni.reLaunch({
- url:"../tabbar/login"
- })
- return;
- },200)
+ this.$api.userLogout({}).then(res => {
+ if(res.status == 200){
+ this.$store.commit('setTokenKey', '');
+ uni.$u.toast('退出登录成功');
+ uni.removeStorageSync('token')
+ uni.removeStorageSync('expire')
+ setTimeout(()=>{
+ uni.reLaunch({
+ url:"../tabbar/login"
+ })
+ return;
+ },200)
+ }
+ }, error => {
+ this.$store.commit('setTokenKey', '');
+ uni.$u.toast('退出登录成功');
+ uni.removeStorageSync('token')
+ uni.removeStorageSync('expire')
+ setTimeout(()=>{
+ uni.reLaunch({
+ url:"../tabbar/login"
+ })
+ return;
+ },200)
+ })
+
} else if (res.cancel) {
console.log('用户点击取消');
}
diff --git a/static/app-plus/image/device/device-card.png b/static/app-plus/image/device/device-card.png
new file mode 100644
index 0000000000000000000000000000000000000000..2eedfa20d56b65a31d9eef11e774f6ba55aebf28
GIT binary patch
literal 7357
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
Qvj6}907*qoM6N<$f;TSDApigX
literal 0
HcmV?d00001
diff --git a/static/image/tabbar/iot-active.png b/static/image/tabbar/iot-active.png
new file mode 100644
index 0000000000000000000000000000000000000000..248821ac7c11706e557f990693be5782b9461aac
GIT binary patch
literal 783
zcmV+q1MvKbP)Px%$w@>(R9HvlSX*}5Fc7`NMw#C)
zk}yzC>vK39TVu`jyzXcOSANNr<3l#U;Z$!n3#sgby6#J4QwGWgIGU-7V)?O<$?!?X
zqIg%u<7Of2yQ#jb;NkO4ZmFmNUY+hwKn(2=}YXs;%m;iHS|80Pb
zrNIDWRov4;02qV(-T0r~bB)*9|7XdHqN;%v!{m@9560kdst+Qd>&|{zEVn5-2+#-q
z`0VHaSn?GCw7|avKuf43K%adV!gNqg-M?DDc33ytm<*<%iE)RtK5v9FqaC
zAJsJg{dpvex4kmcQuL$qOWelg#bAQ!m|YVQM}bWVV$4}rZ13|x6@xZ85w{i=dW!xh
zRF~q=9_#(7u7~oRSMy@9i|TT;^pNRKbv=}qzIq(hm1-%J&vS7X)fFl%5)*zIS6`4aXbt=)>;A(T6L*En|{KmM6Hn#xfl1?G^akk1d&4mB^;_7tIHA
zM{0i!V0=m@9iS3&vyJaO2d-w@db908<;CYdt##&jld0?{9#Lsz;u8ea`>@
N002ovPDHLkV1jM(d7S_N
literal 0
HcmV?d00001
diff --git a/static/image/tabbar/iot.png b/static/image/tabbar/iot.png
new file mode 100644
index 0000000000000000000000000000000000000000..b767f3fdc2aa5dd719d309697b562f0cc0c7f2b9
GIT binary patch
literal 705
zcmV;y0zUnTP)Px%dr3q=R9HvtSc`1}F$^`6v`o@^63QeklN2T~Oj0&!c~N{aCYKL)Iia?Z5L|GQ
zcaHs@lNCL9TRk{Fss<<`&&+(*7s@@i*p?jB0`QxN_RPE$kvAgxBqCJXL
zpomo4&JFMgL`me$by`lD4JbZrS3iD`1!L+3Vq)
n?Q8%`6ZQJP+Jn6Sl;-^bOD!cwa`v8u00000NkvXXu0mjfnNC7h
literal 0
HcmV?d00001
diff --git a/static/image/tabbar/my-active.png b/static/image/tabbar/my-active.png
index 51f3b3b8b9e456fbdd1b7848e1a226b2ef2462ed..bd77d8645a0f657fe7267c995806928512e7bf1c 100644
GIT binary patch
delta 508
zcmV)98427R^k;0C03OEVj
z7L-k41GxqCBuy^?*^yo(YTW@QlM-99N+vVKTg&6mPquzc==q?Y^WlF0j+UGzzyKAV
zems)kv#O8-D2t3ri%v`Yk>OZ6ek$sBT#e)7rimK{UM1Yp;
z(MBz80fK<{fYYQtFW_HP&>_EvDr_&HBvXU{Li3?a({&2ig?f@c#Rq8aKSJu&09*T%
zegJyRHSx$tFQSx0?$&NrLqH
yK`BPKZCEAvK!sfLkt6~%@|c!C08R3JFa81_?b|73S3-&a0000c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#6rQ`QqR!L
z#K720N5ROz&{E&PLf_C>*TB%qz|6|jTmcG{fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8fo2%#8yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab
zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi
zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1tXx76g0v!^HTE5
zi#5R-e0{Av^NLFn^O93NU2K(rM(AZ`rU1jz$<@@&&Dheyz|qjq)z#6$%*5Hu+||s;
z%-qG))CH#3B|o_|H#M&WrZ)wl*950tP+G_>0NU)5T9jFqn&MWJpQ`}&vsET;w;19y
z52`l>w_A*G>eUB2MjsTjNHGl)0wy026P|8?9C*r4%>yR)B4D~cTX$|6FuNpsx;TbZ
z+&UBCn<4Bda?Wg{shm{slFXtFU5^|Ct~BLN6bo50T_kHMmy(=_rq&F(HD8pDzH;nh
zU%kNT7DrHvhDpF)&ZZ9c<_Eqmu8M0dBf8pu$?s>^H_9=dJ@aPn9d`NrvTtXr@1Hw&
zrh0eS$`Gy}k*}ES#P199bc#<)&9u(g8Q0}Jm!Yar*FhwL;T}VO!B=**>VGm48ulozHikF
z<}oDBl1LDL6TkA@f|Gi3X+P0Fw_M!8b?@F$@d}rgARg-Fd%FPIpu{!!q#q--{
zrRNXS7EHXodDZSoZ_|Emn)r7O$HBCPe*=r(sCUZyb9QxB_ddI^;Yj~-mit_9%g%0m
zD`bC9;K-qST&Bt;Ul-&reiX6kwcxI_8}rRs9==hTUn}cm{`QDT`qZpQ^|Rkn740j(
zz3x+(6Vo`0MM~?=J^m*No5PHz{VL8$7yo2_^50n_PPYESRjbtEE2hok+F2oAz?Bgs
zVc)hmBV=_1!_LD2H>IZ4xjTGn6mp#4?XWkjrfPl5y+dXbbXGihG@I+miwCvq1ZJFC
z-F{%VR++EN^~%W!-^!f6YO}mMcDc+sesxm0RN0moKFuF*p8x3EUE%U^>KgGk^F4Dm
zDNKL%t;}`5@}*dr`5XZge?}H9x$%_wdKq`cD=|Cu$J=rozwdwak8R6JwjPZifBB9)
z3u-*-WjrH9#ofu#m?N+8h|MkL1Nw?57$$QU?vxMwa$8|a$!U(V%y)bC6&apteOdWV
zUT9U?uY^}uzT8$-zL8d7(~~@{%=jedFP7GQho$q@ADgxA#9_Y;R}V-&y`gi$W#*Gu
zwe5Uaw?1rM6zXP>RdM29biYqu37dz+ukKSEY_Ta#c8P0CKh0+g<~+qA7Q1Y9)oin=
zi+U37ssHc!WYlCiz0W%5R!Gq%AE9SF6AB*AF$z3$v|?47net>E-Pw*Zf>$hGe0rIz
zcbwm-|I|^YJi9il-}A5Clk9u{$Cqhwbd8TlmP^m0FG}xn@8%0dO+Mbx95VC6_O_>t
v3x(uWEAI(hew00R+Mha+`~O}3Yad`xRZzPVxMgTe~DWM4fq%*fZ
diff --git a/static/image/tabbar/my.png b/static/image/tabbar/my.png
index 30c1f94d346f24d60260fc886e77ba0e7733f96c..f06c96d2bb957dbc644e9c8d9d1b0ed9f2b7d827 100644
GIT binary patch
delta 468
zcmV;_0W1FG5AFkyB!2;OQb$4nuFf3k0004~Nkl
z5GqlqgwP3DIL~AsGZQm_%n5SJLKkZqu%O}&i;qzcu~|T*8099KYC5&;
zM^b=ovYACr6@U8lI99m?IHeoK`|;ra@WgPD2FNOQ8c!?O
z=|7?jsXiqP80bHupj4j{0!&(b4>)wHxPTXeYw#}Q5b#V6+Ea4qusy)YN#Ox_?}sPN
zEZ`rh*WhPW908uA|M1jn?`K{1QUGWBl%)Xj3KooMG)=87Zs--gU0kvEQP5$R7cJEA
zdr|is1w&k|P#-yGz~MfoT~IO*z1R;J+Q>zct6-I+I{yY(Rqz|V{G%z*vh`2^0000<
KMNUMnLSTX>-_arf
literal 2020
zcmaJ?X;f3!77hvqC{Q$nK@ma#;b}8N43S6z3B!v41e7qSWVnGW$Y64T$fHmZ45$bS
zf>KS95|x592+IN911#2xZAB?UggQLIrczN@3_fLgH&$$al-{-OJ?HGTzi)s0>~F1G
z6d4|3ZMoJG27_6Lg)*a{)!X=*uY$fu7OqO5#R+6_!DyKX%;YHm7(*!I1E??wFByme
zc*1>qy8(X~Y^A$6h6{2z+o%GW1j{q#U{w-1goeTV15|RJAQb>nd>~mYrJ-N7b)ZpV
zAq^et%fWNxK|qQ)G)nq)MuahJMFOh4#iU
z4vl)30;bZ?zl-8>B2hsy1%UF!k}(2;4+XW^4@)5X;7R09P((bz4~M7V2qX-iK*f`(
zzME0+A2d`=Arw)gn8ELBK_?nI1q9_(94<366ProG$`r{sf}bD6LBtV>7$^gy+$RNj
zDvVU=zQn);lmdlV4vJ+`l#!9gm!*R=G^F(R79{cyv{L2!Yl1Eer{c+R1T5az(o!Oa
z^Y^I|$%kwu7zO;H_b-W+G5h2IE(%b}(iH+|a3XhODLFMr0q{VXB1R@lTe`)_6d5Q}
zrpV+dA|wgr9V?a!WtqxN7IO*9lnK%$fD~N93je^8mc<&qAdy3rnSer^0SJQ?G70Kk&s6d9
zTJX#Ay~hfd*Fsnpi-W}AjFbJ-q?baFeT>@=zJ(4SoDWDLyDK1H^PgO4gTYK=!
z!T5oXSG(50n-Fep8V7#yNZdC{>FZDTPS3PvX}a6G>qZ+JThrh6U;HWo8K#Yj$Fkiq
z-+3A=$Q8I_q0C(eq+l@hssQ
z=*e|D3%yNE$GU^n(h)bB;ZcGPK
zr&$ctm8o*H`WdZS)3BzT&5UW1^aVxiwAhO1>9QNLnY>%(nb&&HL43m7Nqx!1WM~He
z+v16h{gqIZ@WsGZu~}8otSYv<<+m5ZZ+ok*aAh=$(O{?EdHUAMpKaMU9jn)-$N#HE
zBFVWjDt4y#O(@&z26|l;UiXTB{PzwmuwG~FXq9MIrF;Xw+>2~-K-3k`6B;MY9IgFf
zWc`%%W>m{|4EJtvU1&tne8z_I)AocsvM69gyINCZ^e*V`I+=}7-0~ZGF7bKBpzSkrM-n%2|ND++%^pF)EzZPZ_
zuYb*E)ZXZN-H-P>9^x|V^L)?qdmY8qNMX1gJFvK9IKtpvB@76iX^ty7=>MPm>=EVR
z%078+)q{?2yYA-^njWpc{&=5D74KW>gaLCam;RM!S*rSlN9pbx4%G{rzDV)%+`w)(
zf9`A=QeVyvAeEUtTrht)ux!y3h
zjkH)bzD2QsG!fjKePMZAeIP0G&MPzPVBUJFHwU>uIX(G`Zqe?AL~G8IU2O6sl*QUL
zArIyVm`#y6dk7wEy^3P~OVLG6w8yn*F6!v(+qUpa{s}Kp|Erj+DK$J3>RpA;MZ^C^
zoqWVt#m8)H`0h-}+cO$upH0hz+_u5qFo1C@eE4iGzVI@D^>;QcnVilS1$(!i-INj7
z#_F(YJNWr@#o_vL%H+6}J^!f{`;xj#tLn!sHt;aby8=1%JqA)i!r@~(2eU^r3Y&G0
z(=boRx7}V-I)wD8IodSc>eI>ESbPV4>Ga@ywUqf|Vw<
zJPeRMWhg*LF@MnJj`w>H7$qNoUcp|$QUNxLKLScCO59{ISQe#?6*EQR>BOALUIoXQ
z4n<(pyIX6kY`lQ?*q|F$>b;^m0q=4Cx@_=S?F5`GHF;uq;>3A}_5miTp4s4am0wSz
z;CUybrp5f-7&NP4F6OL-jp`_J3~=?`PpFfmX>j`*P;Sped;et1`yh)MWvq+T_v?ZA
zPZY1Ur#PH<(piYkKN=8buVl|$=N`!@c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#6rQ`QqR!L
z#K720N5ROz&{E&PLf_C>*TB%qz|6|jTmcG{fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8fo2%#8yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab
zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi
zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1tXx76g0v!^HTE5
zi#5R-e0{Av^NLFn^O93NU2K(rM(AZ`rdXL7nOR!8x*A$q7&saly1H6exVSmGxEUFl
znYp=H7#hL!y5uL9=BDPA!1Sgd^cvyR3rY*Q1wfl!Qj0RnQd8WD@^clyezwZQ=@u6^
zoaRCGrr>sq0ZzU8K*#8VViqZ;VM4&<17gC{Esz6G`Kfup?390uncW=)7nN>baWa{4O*g8;#a^U|
zizT{)J2PBRcXA}>(^X8dUy=izo-8mG&Gen`o&Lz=j`cqC@-5pd*!Rt`e!s8!-1C1m
z?|lPw#DWXA?Fu=g`>i4KuQCVI^WNQUU2AuoeqoXI>BLV#Tc_}6dTi@s&8JR_TX1~=
zx4;g*JIq_Qwl#m2EM@$81<04(5qU*p`n`pj{2QECM4p;|Ax`15-hq;ihUcPpBwi^#
zDB4<5a^s1NYr4w1PWu;|J^Q-;cmAq*(Bt{ru5Whw-xPi>Glban7!<8
zbmN)Jb$yTIrhH`G;(NL3PVp6ig*R>98XfpM;r`N@5#e7gJr2yxa$G;nbmDTuPaKzC
zG|1@cPAlEw@;9;TxYN0&$o$D!U$(q;3qJCC$-mIbrC(<}e5QA2M^ybWF^&y;!w$Rk
znWxT;ce(qdBIe_ag^6P2rboWazL&E(Q0&cR3npz1#qt4ChlG8mx3qA`Tkb1K7wzj*s>u1I*!Ik{H%vQmSIr8h|=eo{5#I~OG
z!F_Y(Vw)Lv`Clwy%03?JG&l8i_F2ZQw$9%#YF>FJynikY7S0Xzl+6y(T73!
z082qBBe&s0tsM--hKy%+GO#BxStPJd`M&c_ecS0*-%nYcW}o=;kWqbvUF2cY$O$#F
llkWdJ?^JXqBym5h1Vg#-2M4YrzE40!wx_F~%Q~loCII;TTaW+%
diff --git a/static/image/tabbar/new.png b/static/image/tabbar/new.png
index e722b1f841d1df28e4a3f5692cebde78c94812b5..c9735d0fb873becc7610b2fdea2726134228fa8e 100644
GIT binary patch
delta 467
zcmV;^0WALc4ebMvB!2;OQb$4nuFf3k0004}NklWBwO}QRz7ws=ac^fsH!R=uQ4JQ5jlnsZoLs2
zVsHjGF##_0LUseHDy+d?ZouNX$KnXUgNS?L!CR
ztgvQ*rOe33Q%kt30iB%lqFJ4jRe+sv6MPk9E#Q}@h@9WEIY|TltivC%AV>!DG2|oO
z=Z+e{QT8S%$|40gDEH>Ju*+aeGzSYfGQ3sA@=QQ#mtg_ZPQ{A~JHG+4rb^Fk1~-E+
zz*h0KqP1epj(^F)*p!w!W)`OOoVzER22~XeDeNsd%stryTw;Nqf2?^#Edma1ue=Bp
zLu~;rQ5YrA;u+ck9NqtU7PIZwY7B-D_PH)~!6^muF3|u0002ov
JPDHLkV1n_t*be{z
literal 1785
zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+*
zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#6rQ`QqR!L
z#K720N5ROz&{E&PLf_C>*TB%qz|6|jTmcG{fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8fo2%#8yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab
zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi
zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1tXx76g0v!^HTE5
zi#5R-e0{Av^NLFn^O93NU2K(rM(AZ`rdXM}I9j-w7&}{97&saly1F_!nmRj~8<-gz
zI$4@JxtYWCy5uL9=BDPA!1Sgd^t#~G3rY*Q1wfl!Qj0RnQd8WD@^clyezwZQ?G{Iz
z=0WwQ;C71>PQCg-$LND%7AdA-Lcrt$V#3ockONQosd>QUUIa|nZ?Cm)1ZI~UPZ!6K
zid%0Yd^3a{MeeN)JW?OLYFkn_`)bQ8^HtOXiv#p;RR{R*`?-%#-KN
z?a|M_S8cpGOKD;NSESbzrs+-UFDBKmSe5lp?QwVDJO(r7RKAirhIfqWQ#y?}MX9=a)G!CFm6BglZ(ai(?sK@p7X9Z*{58Z{M}(YbJFStudI5eX$>i7dKPGR
zb2dZPab|v)Py_Ugtc*W6<)Cjr&L(({xq4=bi0|6W&a{m2{lL`={5m
zm6Abcvbb4}dz{yPd6RLoLZs$a?U(oens7{#-*73+WV^(fkFpt?94;{L5mZb#^7y_2
zXK8PFl`QKwhV2iPmHC>IxlX-3Aeyl2W#+Pz%loFY%L~jDzhpdd&U)s*0Yy9o(JIfb
z9qasfvNEOU{8rnzz`WGiE9wt=ojp*r#hmGTY2|AZ1BTY=4X=2PtlIkh$nTSdqMFKq
z^J4jJwHw5I*FRmW_vpRDO-9wz0rE^`!4rI#zcK&5aDAC;{So=89c!H{MOIw>87?D`
zqW9phowxcc9+&DZiv=Ga*SzJr#_zpd|2q|o1v
zPa-EeQuYa3@LUO4f4<>{u@$qCZQaNlv!kq-o{vcJbX#
zFZKs{zxw>DV#(YUM+H6q$*Ap<`*I=EYX0e06Hjn*K5&sW-6w9W=cmpq{G$EQElIzR
zT820L4{v#BKc!ajypVb=?}v
zgiqiDbOBTnXaf9;(}*v*3`&G8S;C4v#ADC+<+HTfJ)KrZxbuhZ93TE4z~PJ&r7&T}
zV->qZIG$Ft@F_5y@t6p&m18lo9N4EDIuzrs7!+_sc=t`Jzkf4hkZvfeihp?FHvr>+
zF*7DC(-rN^*eige8E=^|F#<{}`T`oh+2FUU!A;UROh#?@+J%F-0l~?cR7#c;XCJ-6Q;Tdw||m@zb9CAp|(lY20)ot3byUo^qv-N0d(bYrvYZfaGD8|5vFf5V0ARU
zGrul_rDXP%n$esW%w=EL2*5gK!sRs^0Vr${VVUP)5*i`{XE@qa)Av3=<n3A*fU)d;
Z0we0uI1s{>zGwgd002ovPDHLkV1kLm?ot2%
literal 1856
zcmaJ?X;c$u6pbQ?9&v#bK}3cD#Dy$F*fJ&1kYR}u2oNPMM~TT0(vX>u3?_g@jaHA#
zv1&D-0wSm=E>+ny2!cyp0dYY^L8zjL;sRJ(Td@-b?T^wqXXabZz4zVszW1G3CyWZW
z89iwqwq6Dx6l`Aj~_^R>@2qLHjHZz#
z!m&u$KrC{_0h0(q4Ko-zosO7#pm#7&KooP;K5GWA*KUAgqg4PnT=vTl0
zDXbNxsZmBOs>M?^Qu5#u-OQoXFi(R@2wWq=@#MiO3X^aG*Cyd=z?-xLOp8}wGF+#f
z{)r$EzrrUL02eburJRyjOWARu>+Vq2nr1i;BkG}OkY+Q4+`@Sfcyu!
z2rf-kp%^j9m3`$RLvqc%pi+~O5mcjCips(?xC;1`Gprce3wKDp0j_LlFCjy68KfD8
z`DFif(t}%M`3kF;+g(HUb=~<&IeA@5_y|{|Z@xB95Fv`82H}%^1$!pN
z@ak$}K^y+Q&|TXM!*7B!yy8z?%1m-a`0e}c%MRLy*}H}w{1F)+x-0ep(h2MAC{%UooGuS$O6$R&QdCh0CkD%6BcjRT&MOVBNMpWiNGg_6pm4>NG3O$}tJ2
zN~4F(O>pQO2Cu{t=)%w^l)vP|Jy)Fj&bT}CP0fsa%3aTfY6`6;wM_}I_Jn(RzqVE{
zouH|9pWW)b<+xYagh0wNt4$UuRMYv(;=m`hLhGKMhmsG!Tgl}?Xy7cg-7LSr=-0KA&49#`Oc6F^C3n`5I)%IHC)Z*rdzRa9X?99c{)s$+*
zs71G4HW@@0%ifP_tc0YajEQz-FI}6rbv2$J+ix&&=Qu62xRsPKb*K~Vc8^I6AjVsw2xjsk|
z&oV?q3^9SJd1JFi5iYrVH&m2RQ@MZLVLFyck#nxko&rj!qF?&B4KmX2k0@tD!@
zx(f4XR4VoRiueyr!VR9YGp^X_19nA$Yr-LIM?U?v?_ILQo@5H?0aq*`t^N2
z^hCv&O%@?b3*{%6&rIiw7Tb0d(QRsLQ=;Qgr^z*f>WYcwXYIBh@i6sWp*>0JduC$vEh{QdPqx1hx^jJ&R~m9h#%v8`)9FGaEWnuA~-}9?x!=RerE6CC;VCc|#$+
z+}&aE#1c-$SQDq(vefkF62{2v(=p9iZN#t(wC*gM-`;hu`c^co!7bwDj?SFh8Kw*E
zPBB?n*ow)|@6Lqz46c2p=-uCFIdl9YXxzH7yV+%Vc5_<;ob(O)1qL8j{qx3qG_f
diff --git a/static/image/tabbar/scan.png b/static/image/tabbar/scan.png
index 48d7f8e25340248553237d8a262fbb35827c7b27..f9e05dfcc41590700106914c6745da99221d3a2c 100644
GIT binary patch
delta 484
zcmVs)`6fT7&EC0e>7q!x-SZW6#?pCkiI>
z#5arO5Hv7IkMZL;1K8F8UQY{PmiTmDBQc)k8?VF+dVmK2JIg1(^SO$||wo1)Kbx}Jex^OChgT+KiYfc4_gzX2q
z_&Mk1DFIquZTi0~fPp;c+u$cd=cGf_#29(3`*6Zwu)32ZCCtPYG8_5H!5-&ho^PQMkIY;muj+_RRcs9StJrOgVk
am)&nW!e%&l8q3rG0000c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#6rQ`QqR!L
z#K720N5ROz&{E&PLf_C>*TB%qz|6|jTmcG{fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8fo2%#8yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab
zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi
zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1tXx76g0v!^HTE5
zi#5R-e0{Av^NLFn^O93NU2K(rM(AZ`rdXMpnHZTEm>ODI7&sdmy1F_#IyqXH8#$Sp
zyBWJWx>>^Xy5uL9=BDPA!1Sgd^cvyR3rY*Q1wfl!Qj0RnQd8WD@^clyezwZQ=@t_=
zoaRCGrr>sq0ZzU8K*#8VViqZ;VM4&<17gC{Esz6G`KfupQAD(6zo+@^uMISDm<6t;hr@+UabdIs$yt_gi%aK%`%|3MvED;w(
z)-Wd>XXG)cQ#i+(XR(VI_~$jrwPB=
z*w|{NEIu60@HKjMAdo$1
zwWC+EjVpm=SJ}Y?|K^X)cN^s;-55=OsZ98HB1_>P?~#QE*j`^}JaO=hf>6hO#<%gE
zaeTL!HgZqlJ@u@8!mMac2dzdnzg-MDd7=wUe=c{FtrmN6!ukYX%CX?X8Vnn4=UVw1
z959X&@3$(r(s7RmOwN3U(gdNo`tuEYm_4upMo>sG)YS@eT76IkTF;KLVY1dDmpw
zupelw^LX=oMK7zzUv{aYVi^|0-7FFO$CJ7rDP*Mmuyf#J-s-E)T&T5Yr>WH`e?