Commit 4b096572c05735062288f6940a2d96733de93981

Authored by sqy
2 parents 6ad47a24 7846a407

'fix:解决冲突'

1 1 <script>
2 2 import base from '@/config/baseUrl';
3 3 import store from '@/store';
4   -// #ifdef APP-PLUS
5   -import APPUpdate from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';
6   -// #endif
7 4
8 5 import { mpUpData, scene } from '@/config/common';
9 6 export default {
... ... @@ -16,9 +13,6 @@ export default {
16 13 store.commit('setCacheData');
17 14 //获取二维码信息
18 15 scene(e);
19   - // #ifdef APP-PLUS
20   - APPUpdate(); //检测app更新
21   - // #endif
22 16 },
23 17 onShow(e) {
24 18 // #ifdef MP
... ...
... ... @@ -70,8 +70,12 @@
70 70 <view><u--textarea border="none" height="96" placeholder="请输入处理结果" v-model="formModel.result" count></u--textarea></view>
71 71 </view>
72 72 <!-- #endif -->
73   - <view v-if="list.status !== 'CLEARED_ACK'" style="margin-top: 44rpx;display: flex;align-items: center;justify-content: center;">
74   - <view class="u-flex" style="width: 400rpx"><u-button @click="handleSubmit" type="primary" shape="circle" text="处理"></u-button></view>
  73 + <view style="margin-top: 44rpx;display: flex;align-items: center;justify-content: space-between;">
  74 + <view v-if="list.status !== 'CLEARED_ACK' && list.status !== 'ACTIVE_ACK'" class="u-flex" style="width: 260rpx">
  75 + <u-button @click="handleSubmit" type="primary" shape="circle" text="处理"></u-button>
  76 + </view>
  77 + <view style="width: 30rpx;"></view>
  78 + <view v-if="list.status == 'ACTIVE_ACK'" class="u-flex" style="width: 260rpx"><u-button @click="handleRemove" type="error" shape="circle" text="清除"></u-button></view>
75 79 </view>
76 80 </view>
77 81 </template>
... ... @@ -95,6 +99,7 @@ export default {
95 99 uni.hideTabBar();
96 100 },
97 101 methods: {
  102 + //处理
98 103 handleSubmit() {
99 104 if (this.formModel.result == '') return uni.$u.toast('请输入处理结果');
100 105 else
... ... @@ -121,6 +126,31 @@ export default {
121 126 uni.$u.toast(e.data?.message);
122 127 });
123 128 },
  129 + //清除
  130 + handleRemove() {
  131 + uni.$u.http
  132 + .post(`/alarm/${this.list.id}/clear`)
  133 + .then(res => {
  134 + if (res == '') {
  135 + uni.showToast({
  136 + title: '清除成功~',
  137 + icon: 'none'
  138 + });
  139 + let pages = getCurrentPages(); //获取所有页面栈实例列表
  140 + let nowPage = pages[pages.length - 1]; //当前页页面实例
  141 + let prevPage = pages[pages.length - 2]; //上一页页面实例
  142 + prevPage.$vm.detailStatus = true;
  143 + setTimeout(() => {
  144 + uni.navigateBack({
  145 + delta: 1
  146 + });
  147 + }, 500);
  148 + }
  149 + })
  150 + .catch(e => {
  151 + uni.$u.toast(e.data?.message);
  152 + });
  153 + },
124 154 formatDetailText(e) {
125 155 //去除字符串双引号
126 156 const jsonStr = JSON.stringify(e);
... ...
1 1 .alarm-detail-page {
2 2 padding: 30rpx;
3 3 }
4   -.alarm-detail-column {
5   - border-radius: 20px;
  4 +.alarm- {
  5 + border-radius: 10px;
6 6 width: 688rpx;
7 7 height: 573rpx;
8 8 background-color: #ffffff;
... ... @@ -54,7 +54,7 @@
54 54 }
55 55 .hanle-main {
56 56 margin-top: 30rpx;
57   - border-radius: 20px;
  57 + border-radius: 10px;
58 58 width: 688rpx;
59 59 height: 273rpx;
60 60 background-color: #ffffff;
... ...
... ... @@ -128,30 +128,7 @@ export const judgeLogin = (callback) => {
128 128 }
129 129 if (!storeUserInfo.isToken) {
130 130 // #ifdef MP
131   - return uni.$u.toast('请登录')
132   - // uni.$showModal({
133   - // title: "登录提示",
134   - // confirmVal: '去登录',
135   - // cancelVal: '再逛会',
136   - // content: '此时此刻需要您登录喔~',
137   - // }).then(res => {
138   - // uni.navigateTo({
139   - // url: "/pages/personal/login"
140   - // });
141   - // }).catch(res => {})
142   - // store.commit('setLoginPopupShow', true);
143   - // #endif
144   - // #ifdef APP-PLUS
145   - uni.$showModal({
146   - title: "登录提示",
147   - confirmVal: '去登录',
148   - cancelVal: '再逛会',
149   - content: '此时此刻需要您登录喔~',
150   - }).then(res => {
151   - uni.navigateTo({
152   - url: "/pages/personal/login"
153   - });
154   - }).catch(res => {})
  131 + return
155 132 // #endif
156 133 // #ifdef H5
157 134 h5Login();
... ...
... ... @@ -31,6 +31,11 @@ uni.$u.http.setConfig((config) => {
31 31 // 请求拦截
32 32 uni.$u.http.interceptors.request.use(
33 33 (config) => {
  34 + if (store.state.userInfo.isThirdLogin) {
  35 + uni.switchTab({
  36 + url: "../pages/personal/personal",
  37 + });
  38 + }
34 39 // 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
35 40 config.data = config.data || {};
36 41 // 根据custom参数中配置的是否需要token,添加对应的请求头
... ... @@ -71,7 +76,6 @@ uni.$u.http.interceptors.response.use(
71 76 } else {}
72 77 },
73 78 (response) => {
74   - console.log('Response error', response)
75 79 // 关闭加载动画
76 80 store.commit("setLoadingShow", false);
77 81 let show = true;
... ... @@ -82,12 +86,19 @@ uni.$u.http.interceptors.response.use(
82 86 } else if (message == "request:fail timeout") {
83 87 errorData = "请求超时:请检查网络";
84 88 } else if (response.data.status == 401) {
85   - uni.reLaunch({
86   - url: "/publicLoginSubPage/public/login",
87   - });
88   - // 清空登录信息
89   - store.commit("emptyUserInfo");
90   - show = false;
  89 + if (!store.state.userInfo.isThirdLogin) {
  90 + uni.reLaunch({
  91 + url: "/publicLoginSubPage/public/login",
  92 + });
  93 + // 清空登录信息
  94 + store.commit("emptyUserInfo");
  95 + show = false;
  96 + } else {
  97 + uni.switchTab({
  98 + url: "../pages/personal/personal",
  99 + });
  100 + show = false;
  101 + }
91 102 } else {
92 103 errorData = message || "";
93 104 }
... ...
... ... @@ -12,7 +12,6 @@
12 12 "author": "",
13 13 "license": "ISC",
14 14 "dependencies": {
15   - "crypto": "^1.0.1",
16 15 "moment": "^2.29.2"
17 16 }
18 17 }
... ...
... ... @@ -30,7 +30,12 @@
30 30 <!-- 吸顶组件 -->
31 31 <!-- 自带分页组件 -->
32 32 <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" @up="upCallback">
33   - <view class="device-list">
  33 + <!-- 无数据图片 -->
  34 + <view v-if="list.length == 0" style="position: relative;top: 100rpx;flex-direction: column;" class="u-flex">
  35 + <view><image style="width: 280rpx;height: 250rpx;" src="../../static/empty.png"></image></view>
  36 + <view style="text-align: center;"><text style="font-size: 12px;color: gray;">~ 空空如也 ~</text></view>
  37 + </view>
  38 + <view v-else class="device-list">
34 39 <view @click="openAlertDetail(item)" class="list-item" v-for="(item, index) in list" :key="index">
35 40 <view class="u-flex item">
36 41 <view class="item-text text-clip">
... ... @@ -164,7 +169,7 @@
164 169 <view class="u-flex popup-alarm-child">
165 170 <view class="home-text-muted">选择日期</view>
166 171 <view style="width: 623rpx;margin-left: 5rpx;margin-right: 70rpx;margin-top: 35rpx;">
167   - <uni-datetime-picker v-model="range" type="daterange" />
  172 + <uni-datetime-picker v-model="range" type="datetimerange" rangeSeparator="至" />
168 173 </view>
169 174 </view>
170 175 </view>
... ... @@ -197,7 +202,7 @@ export default {
197 202 },
198 203 data() {
199 204 return {
200   - range: ['', ''],
  205 + range: [],
201 206 alertStatusVal: '',
202 207 deviceTypeVal: '',
203 208 alertLevelVal: '',
... ... @@ -297,7 +302,7 @@ export default {
297 302 this.selectTimeVal = e.value;
298 303 let curTime = new Date();
299 304 const formatS = curTime.getTime();
300   - let addMinute = new Date(curTime.setMinutes(curTime.getMinutes() + this.selectTimeVal));
  305 + let addMinute = new Date(curTime.setMinutes(curTime.getMinutes() - this.selectTimeVal));
301 306 const formatE = addMinute.getTime();
302 307 this.timeData.getTimeGapS = formatS;
303 308 this.timeData.getTimeGapE = formatE;
... ... @@ -318,8 +323,8 @@ export default {
318 323 this.startTimeArea = '';
319 324 this.endTimeArea = '';
320 325 } else {
321   - this.startTimeArea = this.timeData.getTimeGapS;
322   - this.endTimeArea = this.timeData.getTimeGapE;
  326 + this.startTimeArea = this.timeData.getTimeGapE;
  327 + this.endTimeArea = this.timeData.getTimeGapS;
323 328 }
324 329 this.loadData(
325 330 1,
... ... @@ -378,7 +383,7 @@ export default {
378 383 topBack() {
379 384 uni.pageScrollTo({
380 385 scrollTop: 0, // 滚动到页面的目标位置 这个是滚动到顶部, 0
381   - duration: 300 // 滚动动画的时长
  386 + duration: 10 // 滚动动画的时长
382 387 });
383 388 },
384 389 /*下拉刷新的回调 */
... ... @@ -451,7 +456,6 @@ export default {
451 456 }
452 457 })
453 458 .catch(e => {
454   - uni.$u.toast(e.data?.message);
455 459 //联网失败, 结束加载
456 460 that.mescroll.endErr();
457 461 });
... ...
... ... @@ -41,9 +41,7 @@ export default {
41 41 this.tree = list;
42 42 }
43 43 })
44   - .catch(e => {
45   - uni.$u.toast(e.data.message);
46   - });
  44 + .catch(e => {});
47 45 },
48 46 confirm(val) {
49 47 this.id = val[0].id;
... ...
... ... @@ -125,14 +125,18 @@
125 125 justify-content: space-between;
126 126
127 127 .item {
128   - margin: 30rpx;
129 128 justify-content: flex-start;
130 129 flex-direction: column;
131 130 align-items: center;
  131 + height: 211rpx;
  132 + margin-top: 8rpx;
  133 + margin-left: 37rpx;
132 134
133 135 .item-text {
134 136 width: 400rpx;
135 137 text-align: left;
  138 + margin-top: 13rpx;
  139 + line-height: 40rpx;
136 140
137 141 .text {
138 142 color: #666666;
... ... @@ -152,7 +156,8 @@
152 156
153 157 .item-right {
154 158 flex-direction: row;
155   - margin-top: -15rpx;
  159 + margin-top: -3rpx;
  160 + margin-right: 25rpx;
156 161
157 162 .right-image {
158 163 width: 30rpx;
... ...
... ... @@ -5,12 +5,12 @@
5 5 <view class="org-sty">
6 6 <view @click="openOrg" class="org-item">
7 7 <view class="u-flex org-contact"><text class="text">组织关系</text></view>
8   - <view class="u-flex org-device">
  8 + <view @click="openOrg" class="u-flex org-device">
9 9 <image class="device-image" src="../../../static/org.png"></image>
10   - <text class="device-text">设备数:{{ deviceTotal }}</text>
  10 + <text class="device-text">摄像头数:{{ cameraTotal }}</text>
11 11 </view>
12 12 </view>
13   - <view class="org-item"><image class="image" src="../../../static/arrow-right.png"></image></view>
  13 + <view @click="openOrg" class="org-item"><image class="image" src="../../../static/arrow-right.png"></image></view>
14 14 </view>
15 15 <view style="height: 150rpx;"></view>
16 16 <!-- 自带分页组件 -->
... ... @@ -54,7 +54,7 @@ export default {
54 54 auto: false // 不自动加载
55 55 },
56 56 current: 0,
57   - deviceTotal: 0,
  57 + cameraTotal: 0,
58 58 list: [],
59 59 ordId: ''
60 60 };
... ... @@ -72,7 +72,7 @@ export default {
72 72 onLoad() {
73 73 // 隐藏原生的tabbar
74 74 uni.hideTabBar();
75   - this.getDeviceTotalData();
  75 + this.getcameraTotalData();
76 76 },
77 77 methods: {
78 78 /*下拉刷新的回调 */
... ... @@ -98,6 +98,7 @@ export default {
98 98 .then(res => {
99 99 uni.stopPullDownRefresh();
100 100 this.mescroll.endByPage(res.items.length, res.total);
  101 + this.cameraTotal = res.total;
101 102 if (pageNo == 1) {
102 103 this.list = res.items;
103 104 } else {
... ... @@ -105,7 +106,6 @@ export default {
105 106 }
106 107 })
107 108 .catch(e => {
108   - uni.$u.toast(e.data?.message);
109 109 //联网失败, 结束加载
110 110 this.mescroll.endErr();
111 111 });
... ... @@ -113,22 +113,6 @@ export default {
113 113 hideImageUrl(item, index) {
114 114 this.current = index;
115 115 },
116   - getDeviceTotalData() {
117   - let httpData = {
118   - page: 1,
119   - pageSize: 10
120   - };
121   - uni.$u.http
122   - .get('/yt/device', { params: httpData, custom: { load: false } })
123   - .then(res => {
124   - if (res) {
125   - this.deviceTotal = res.total;
126   - }
127   - })
128   - .catch(e => {
129   - uni.$u.toast(e.data?.message);
130   - });
131   - },
132 116 openCameraDetail(e) {
133 117 console.log(e);
134 118 },
... ...
... ... @@ -41,9 +41,7 @@ export default {
41 41 this.tree = list;
42 42 }
43 43 })
44   - .catch(e => {
45   - uni.$u.toast(e.data.message);
46   - });
  44 + .catch(e => {});
47 45 },
48 46 confirm(val) {
49 47 this.id = val[0].id;
... ...
... ... @@ -144,9 +144,9 @@ export default {
144 144 });
145 145 },
146 146 openOrgStatus() {
147   - uni.navigateTo({
148   - url: 'configuration/configuration'
149   - });
  147 + // uni.navigateTo({
  148 + // url: 'configuration/configuration'
  149 + // });
150 150 },
151 151 //告警状态查询
152 152 navigatorAlarmStatus(e) {
... ...
... ... @@ -67,11 +67,11 @@
67 67 width: 330rpx;
68 68 height: 200rpx;
69 69 background-color: #fff;
70   - border-radius: 20px;
  70 + border-radius: 10px;
71 71 margin-left: 25rpx;
72 72 margin-right: 21rpx;
73 73 .video {
74   - border-radius: 20px;
  74 + border-radius: 10px;
75 75 width: 330rpx;
76 76 height: 200rpx;
77 77 }
... ... @@ -92,7 +92,7 @@
92 92 .image {
93 93 width: 330rpx;
94 94 height: 200rpx;
95   - border-radius: 20px;
  95 + border-radius: 10px;
96 96 }
97 97 }
98 98 }
... ...
... ... @@ -20,7 +20,7 @@
20 20 background-color: #fff;
21 21 border: 0.01rpx solid #fff;
22 22 padding: 40rpx;
23   - border-radius: 20px;
  23 + border-radius: 10px;
24 24 .item-center {
25 25 width: 290rpx;
26 26 height: 150rpx;
... ... @@ -80,7 +80,7 @@
80 80 justify-content: space-between;
81 81 align-items: flex-start;
82 82 flex-direction: column;
83   - border-radius: 20px;
  83 + border-radius: 10px;
84 84 .item-child-top {
85 85 justify-content: space-between;
86 86 padding: 30rpx;
... ...
... ... @@ -8,7 +8,7 @@
8 8 <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30">
9 9 <block v-if="userInfo.isToken || userInfo.isThirdLogin">
10 10 <view @click="openPersonalInfo" class="u-m-r-20">
11   - <image class="avatar" mode="aspectFill" :src="userInfo.avatar == '' ? '/static/logo.png' : userInfo.avatar"></image>
  11 + <image class="avatar" mode="aspectFill" :src="!userInfo.avatar ? '../../static/logo.png' : userInfo.avatar || thirdObj.avatarUrl"></image>
12 12 </view>
13 13 <view class="u-flex-1">
14 14 <view class="nickName u-flex">
... ... @@ -154,17 +154,19 @@ export default {
154 154 appUserKey: '',
155 155 appUserSecret: ''
156 156 },
157   - thirdObj: {}
  157 + thirdObj: {},
  158 + getOpenId: ''
158 159 };
159 160 },
160 161 onLoad(e) {
161 162 // 隐藏原生的tabbar
162 163 uni.hideTabBar();
163   - if (e.obj != null) {
164   - const params = JSON.parse(decodeURIComponent(e.obj));
165   - this.thirdObj = params;
166   - }
167   - console.log('UserInfo', this.userInfo);
  164 + // if (e.obj != null) {
  165 + // const params = JSON.parse(decodeURIComponent(e.obj));
  166 + // // uni.$u.toast('eee', params.avatarUrl);
  167 + // this.thirdObj = params;
  168 + // }
  169 + this.getOpenId = getApp().globalData.openId;
168 170 },
169 171 computed: {
170 172 ...mapState(['userInfo'])
... ... @@ -232,7 +234,7 @@ export default {
232 234 loginMethod: 'ACCOUNT',
233 235 ...this.bindAccountObj,
234 236 platformName: 'WECHAT',
235   - ...this.thirdObj
  237 + thirdUserId: this.getOpenId
236 238 };
237 239 uni.$u.http
238 240 .post('/yt/third/bind', postData)
... ... @@ -260,8 +262,8 @@ export default {
260 262 }
261 263 })
262 264 .catch(e => {
263   - uni.$u.toast(e.data?.msg || e.data?.message);
264   - this.show = false;
  265 + uni.$u.toast(e.data?.msg);
  266 + this.show = true;
265 267 });
266 268 } else {
267 269 const phoneRegular = /^1\d{10}$/;
... ... @@ -295,7 +297,7 @@ export default {
295 297 loginMethod: 'PHONE',
296 298 ...this.bindPhoneObj,
297 299 platformName: 'WECHAT',
298   - ...this.thirdObj
  300 + thirdUserId: this.getOpenId
299 301 };
300 302 uni.$u.http
301 303 .post('/yt/third/bind', postData)
... ... @@ -321,8 +323,8 @@ export default {
321 323 this.saveUserInfo();
322 324 })
323 325 .catch(e => {
324   - uni.$u.toast(e.data?.msg || e.data?.message);
325   - this.show = false;
  326 + uni.$u.toast(e.data?.msg);
  327 + this.show = true;
326 328 });
327 329 }
328 330 },
... ...
... ... @@ -11,8 +11,10 @@
11 11 width: 50px;
12 12 height: 50px;
13 13 border-radius: 25px;
14   - background-color: #ccc;
  14 + background: #d8d8d8;
15 15 justify-content: center;
  16 + border: 2px solid #ffffff;
  17 + box-shadow: 0px 14px 26px 0px rgba(4, 7, 26, 0.2);
16 18 }
17 19 .click-login {
18 20 font-size: 18px;
... ...
1 1 import Vue from 'vue';
2 2 import moment from 'moment';
3   -// #ifdef APP-PLUS
4   -import {judgePermission} from './permission'
5   -// #endif
6 3 const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
7 4 //金额过滤
8 5 Vue.filter('money', function(val) {
... ... @@ -26,68 +23,68 @@ Vue.filter('money', function(val) {
26 23 });
27 24 //手机号中间4位为*
28 25 Vue.filter('phone', function(val) {
29   - var tel = val;
30   - tel = "" + tel;
31   - var telShort = tel.replace(tel.substring(3, 7), "****")
32   - return telShort
  26 + var tel = val;
  27 + tel = "" + tel;
  28 + var telShort = tel.replace(tel.substring(3, 7), "****")
  29 + return telShort
33 30 })
34 31 //获取系统信息、判断ipX安全距离
35 32 export const getTabbarHeight = function() {
36   - var systemInfo = uni.getSystemInfoSync()
37   - var data = {
38   - ...systemInfo,
39   - tabbarH: 50,//tabbar高度--单位px
40   - tabbarPaddingB: 0,//tabbar底部安全距离高度--单位px
41   - device: systemInfo.system.indexOf('iOS') != -1?'iOS':'Android', //苹果或者安卓设备
42   - }
43   - let modelArr = ['10,3','10,6','X', 'XR', 'XS', '11', '12', '13', '14', '15', '16'];
44   - let model = systemInfo.model;
45   - model && modelArr.forEach(item => {
46   - //适配iphoneX以上的底部,给tabbar一定高度的padding-bottom
47   - if(model.indexOf(item) != -1 && (model.indexOf('iPhone') != -1 || model.indexOf('iphone') != -1)) {
48   - data.tabbarH = 70
49   - data.tabbarPaddingB = 20
50   - }
51   - })
52   - return data;
  33 + var systemInfo = uni.getSystemInfoSync()
  34 + var data = {
  35 + ...systemInfo,
  36 + tabbarH: 50, //tabbar高度--单位px
  37 + tabbarPaddingB: 0, //tabbar底部安全距离高度--单位px
  38 + device: systemInfo.system.indexOf('iOS') != -1 ? 'iOS' : 'Android', //苹果或者安卓设备
  39 + }
  40 + let modelArr = ['10,3', '10,6', 'X', 'XR', 'XS', '11', '12', '13', '14', '15', '16'];
  41 + let model = systemInfo.model;
  42 + model && modelArr.forEach(item => {
  43 + //适配iphoneX以上的底部,给tabbar一定高度的padding-bottom
  44 + if (model.indexOf(item) != -1 && (model.indexOf('iPhone') != -1 || model.indexOf('iphone') != -1)) {
  45 + data.tabbarH = 70
  46 + data.tabbarPaddingB = 20
  47 + }
  48 + })
  49 + return data;
53 50 }
54 51
55 52 //计算两点距离
56   -export const commonDistance = function(lat1, lng1, lat2, lng2) {
57   - var f = ((lat1 + lat2) / 2) * Math.PI / 180.0;
58   - var g = ((lat1 - lat2) / 2) * Math.PI / 180.0;
59   - var l = ((lng1 - lng2) / 2) * Math.PI / 180.0;
60   - var sg = Math.sin(g);
61   - var sl = Math.sin(l);
62   - var sf = Math.sin(f); 
63   - var s, c, w, r, d, h1, h2;
64   - var a = 6378137.0; //地球的直径
65   - var fl = 1 / 298.257;
66   - sg = sg * sg;  
67   - sl = sl * sl;  
68   - sf = sf * sf;  
69   - s = sg * (1 - sl) + (1 - sf) * sl;  
70   - c = (1 - sg) * (1 - sl) + sf * sl;  
71   - w = Math.atan(Math.sqrt(s / c));  
72   - r = Math.sqrt(s * c) / w;  
73   - d = 2 * w * a;  
74   - h1 = (3 * r - 1) / 2 / c;  
75   - h2 = (3 * r + 1) / 2 / s;  
76   - var num = d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg))  
77   - // 换算单位
78   - if (num == undefined) {
79   - num = "0.0 m"
80   - };
81   - if (num < 1000) {
82   - num = (Math.round(num)).toFixed(1) + "m"
83   - } else if (num > 1000) {
84   - num = (Math.round(num / 100) / 10).toFixed(1) + "km"
85   - }
86   - return num
  53 +export const commonDistance = function(lat1, lng1, lat2, lng2) {
  54 + var f = ((lat1 + lat2) / 2) * Math.PI / 180.0;
  55 + var g = ((lat1 - lat2) / 2) * Math.PI / 180.0;
  56 + var l = ((lng1 - lng2) / 2) * Math.PI / 180.0;
  57 + var sg = Math.sin(g);
  58 + var sl = Math.sin(l);
  59 + var sf = Math.sin(f);
  60 + var s, c, w, r, d, h1, h2;
  61 + var a = 6378137.0; //地球的直径
  62 + var fl = 1 / 298.257;
  63 + sg = sg * sg;
  64 + sl = sl * sl;
  65 + sf = sf * sf;
  66 + s = sg * (1 - sl) + (1 - sf) * sl;
  67 + c = (1 - sg) * (1 - sl) + sf * sl;
  68 + w = Math.atan(Math.sqrt(s / c));
  69 + r = Math.sqrt(s * c) / w;
  70 + d = 2 * w * a;
  71 + h1 = (3 * r - 1) / 2 / c;
  72 + h2 = (3 * r + 1) / 2 / s;
  73 + var num = d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg))
  74 + // 换算单位
  75 + if (num == undefined) {
  76 + num = "0.0 m"
  77 + };
  78 + if (num < 1000) {
  79 + num = (Math.round(num)).toFixed(1) + "m"
  80 + } else if (num > 1000) {
  81 + num = (Math.round(num / 100) / 10).toFixed(1) + "km"
  82 + }
  83 + return num
87 84 }
88 85 // px转upx
89   -export const px2upx = function(n){
90   - return n/(uni.upx2px(n)/n);
  86 +export const px2upx = function(n) {
  87 + return n / (uni.upx2px(n) / n);
91 88 }
92 89
93 90 // 判断两时间段之间活动状态、判断活动还有多长时间开始、多长时间结束----添加定时器运行此方法可倒计时
... ... @@ -95,53 +92,59 @@ export const px2upx = function(n){
95 92 // var closeTime = new Date(item.closeTime.replace(/-/g, '/')).getTime(); //转时间戳
96 93 // var djs = this.djsTime(startTime, closeTime);
97 94 export const djsTime = function(startTime, endTime) {
98   - var bbb = new Date().getTime(),
99   - leftTime = startTime - bbb,
100   - rightTime = endTime - bbb,
101   - djsTime = '',
102   - speed = 0,
103   - activityStatus = 0, //活动状态 1:未开始 2:进行中 3:已结束
104   - dd,hh,mm,ss;
105   - if (leftTime > 0) { //还未开始
106   - activityStatus = 1
107   - dd = Math.floor(leftTime / 1000 / 60 / 60 / 24);
108   - hh = Math.floor((leftTime / 1000 / 60 / 60) % 24) < 10 ? '0' + Math.floor((leftTime / 1000 / 60 / 60) % 24) : Math.floor((leftTime / 1000 / 60 / 60) % 24);
109   - mm = Math.floor((leftTime / 1000 / 60) % 60) < 10 ? '0' + Math.floor((leftTime / 1000 / 60) % 60) : Math.floor((leftTime / 1000 / 60) % 60);
110   - ss = Math.floor((leftTime / 1000) % 60) < 10 ? '0' + Math.floor((leftTime / 1000) % 60) : Math.floor((leftTime / 1000) % 60);
111   - if (dd != 0) {
112   - djsTime = dd + "天 " + hh + ":" + mm + ":" + ss;
113   - } else {
114   - djsTime = hh + ":" + mm + ":" + ss;
115   - }
116   - } else if (leftTime <= 0) {
117   - if (rightTime > 0) { //进行中
118   - activityStatus = 2;
119   - speed = (1 - rightTime / (endTime - startTime)) * 100;
120   - dd = Math.floor(rightTime / 1000 / 60 / 60 / 24);
121   - hh = Math.floor((rightTime / 1000 / 60 / 60) % 24) < 10 ? '0' + Math.floor((rightTime / 1000 / 60 / 60) % 24) : Math.floor((rightTime / 1000 / 60 / 60) % 24);
122   - mm = Math.floor((rightTime / 1000 / 60) % 60) < 10 ? '0' + Math.floor((rightTime / 1000 / 60) % 60) : Math.floor((rightTime / 1000 / 60) % 60);
123   - ss = Math.floor((rightTime / 1000) % 60) < 10 ? '0' + Math.floor((rightTime / 1000) % 60) : Math.floor((rightTime / 1000) % 60);
124   - if (dd != 0) {
125   - djsTime = dd + "天 " + hh + ":" + mm + ":" + ss;
126   - } else {
127   - djsTime = hh + ":" + mm + ":" + ss;
128   - }
129   - } else { //已结束
130   - speed = 100;
131   - djsTime = '已结束';
132   - activityStatus = 3;
133   - }
134   - }
135   - var item = {
136   - djsTime: djsTime, //距离当前时间差
137   - activityStatus: activityStatus, //活动状态 1:未开始 2:进行中 3:已结束
138   - speed: speed, //进度(单位%)
139   - dd: dd, //天
140   - hh: hh, //小时
141   - mm: mm, //分
142   - ss: ss, //秒
143   - }
144   - return item;
  95 + var bbb = new Date().getTime(),
  96 + leftTime = startTime - bbb,
  97 + rightTime = endTime - bbb,
  98 + djsTime = '',
  99 + speed = 0,
  100 + activityStatus = 0, //活动状态 1:未开始 2:进行中 3:已结束
  101 + dd, hh, mm, ss;
  102 + if (leftTime > 0) { //还未开始
  103 + activityStatus = 1
  104 + dd = Math.floor(leftTime / 1000 / 60 / 60 / 24);
  105 + hh = Math.floor((leftTime / 1000 / 60 / 60) % 24) < 10 ? '0' + Math.floor((leftTime / 1000 / 60 / 60) %
  106 + 24) : Math.floor((leftTime / 1000 / 60 / 60) % 24);
  107 + mm = Math.floor((leftTime / 1000 / 60) % 60) < 10 ? '0' + Math.floor((leftTime / 1000 / 60) % 60) : Math
  108 + .floor((leftTime / 1000 / 60) % 60);
  109 + ss = Math.floor((leftTime / 1000) % 60) < 10 ? '0' + Math.floor((leftTime / 1000) % 60) : Math.floor((
  110 + leftTime / 1000) % 60);
  111 + if (dd != 0) {
  112 + djsTime = dd + "天 " + hh + ":" + mm + ":" + ss;
  113 + } else {
  114 + djsTime = hh + ":" + mm + ":" + ss;
  115 + }
  116 + } else if (leftTime <= 0) {
  117 + if (rightTime > 0) { //进行中
  118 + activityStatus = 2;
  119 + speed = (1 - rightTime / (endTime - startTime)) * 100;
  120 + dd = Math.floor(rightTime / 1000 / 60 / 60 / 24);
  121 + hh = Math.floor((rightTime / 1000 / 60 / 60) % 24) < 10 ? '0' + Math.floor((rightTime / 1000 / 60 /
  122 + 60) % 24) : Math.floor((rightTime / 1000 / 60 / 60) % 24);
  123 + mm = Math.floor((rightTime / 1000 / 60) % 60) < 10 ? '0' + Math.floor((rightTime / 1000 / 60) % 60) :
  124 + Math.floor((rightTime / 1000 / 60) % 60);
  125 + ss = Math.floor((rightTime / 1000) % 60) < 10 ? '0' + Math.floor((rightTime / 1000) % 60) : Math.floor((
  126 + rightTime / 1000) % 60);
  127 + if (dd != 0) {
  128 + djsTime = dd + "天 " + hh + ":" + mm + ":" + ss;
  129 + } else {
  130 + djsTime = hh + ":" + mm + ":" + ss;
  131 + }
  132 + } else { //已结束
  133 + speed = 100;
  134 + djsTime = '已结束';
  135 + activityStatus = 3;
  136 + }
  137 + }
  138 + var item = {
  139 + djsTime: djsTime, //距离当前时间差
  140 + activityStatus: activityStatus, //活动状态 1:未开始 2:进行中 3:已结束
  141 + speed: speed, //进度(单位%)
  142 + dd: dd, //天
  143 + hh: hh, //小时
  144 + mm: mm, //分
  145 + ss: ss, //秒
  146 + }
  147 + return item;
145 148 }
146 149
147 150 // 小程序获取定位权限判断
... ... @@ -151,14 +154,14 @@ function getMpLocation(successCallback, errCallback, isOpenSetting) {
151 154 success: res => {
152 155 if (res.authSetting['scope.userLocation'] || !isOpenSetting) {
153 156 uni.getLocation({
154   - // #ifndef MP-ALIPAY
155   - type: 'gcj02',
156   - // #endif
157   - success(res){
158   - console.log('successCallback')
  157 + // #ifndef MP-ALIPAY
  158 + type: 'gcj02',
  159 + // #endif
  160 + success(res) {
  161 + console.log('successCallback')
159 162 successCallback(res);
160 163 },
161   - fail(err){
  164 + fail(err) {
162 165 console.log("位置信息错误", err);
163 166 errCallback("位置信息获取失败");
164 167 }
... ... @@ -200,40 +203,24 @@ export const getAppLatLon = function(successCallback, errCallback, isOpenSetting
200 203 getMpLocation(successCallback, errCallback, isOpenSetting);
201 204 }
202 205 // #endif
203   - // #ifdef MP-ALIPAY
204   - getMpLocation(successCallback, errCallback, false);
205   - // #endif
206   - // #ifdef H5
207   - uni.getLocation({
208   - type: 'gcj02',
209   - success(res){
210   - console.log('successCallback')
211   - successCallback(res);
212   - },
213   - fail(err){
214   - console.log("位置信息错误", err);
215   - errCallback("位置信息获取失败");
216   - }
217   - });
218   - // #endif
219   - // #ifdef APP-PLUS
220   - judgePermission("location", function(result) {
221   - if (result == 1) {
222   - uni.getLocation({
223   - type: 'gcj02',
224   - success: res => {
225   - successCallback(res);
226   - },
227   - fail: (err) => {
228   - console.log("位置信息错误", err);
229   - errCallback("位置信息获取失败");
230   - }
231   - });
  206 + // #ifdef MP-ALIPAY
  207 + getMpLocation(successCallback, errCallback, false);
  208 + // #endif
  209 + // #ifdef H5
  210 + uni.getLocation({
  211 + type: 'gcj02',
  212 + success(res) {
  213 + console.log('successCallback')
  214 + successCallback(res);
  215 + },
  216 + fail(err) {
  217 + console.log("位置信息错误", err);
  218 + errCallback("位置信息获取失败");
232 219 }
233 220 });
234 221 // #endif
235 222 }
236 223
237 224 export function formatToDate(date = undefined, format = DATE_TIME_FORMAT) {
238   - return moment(date).format(format);
239   -}
\ No newline at end of file
  225 + return moment(date).format(format);
  226 +}
... ...
... ... @@ -3,12 +3,12 @@
3 3 <!-- 公共组件-每个页面必须引入 -->
4 4 <public-module></public-module>
5 5 <view @click="upAvatar" class="u-flex set-main">
6   - <view class="main-image"><image class="image" :src="avatar || '/static/logo.png'"></image></view>
  6 + <view class="main-image"><image class="image" :src="avatar || '../../static/logo.png'"></image></view>
7 7 <view class="main-right-image"><image class="image" src="../../static/arrow-right.png"></image></view>
8 8 </view>
9 9 <view class="u-m-t-20 basic-text"><text class="text">基本资料</text></view>
10 10 <view class="basic-main">
11   - <u--form labelPosition="left" :model="myInfoModel" :rules="rules" ref="myInfoFormRef">
  11 + <u--form labelPosition="left" :model="myInfoModel">
12 12 <u-form-item labelWidth="80px" label="真实姓名" prop="userInfo.realName" borderBottom ref="item1">
13 13 <u--input placeholder="请输入真实姓名" v-model="myInfoModel.userInfo.realName" border="none"></u--input>
14 14 </u-form-item>
... ... @@ -46,8 +46,12 @@
46 46 </u--form>
47 47 </view>
48 48 <view class="basic-bottom u-flex">
49   - <view class="item" v-if="info.data.isToken"><button class="submit" size="default" @click="clearAccountFunc" :style="{ background: InfoColor }">解绑</button></view>
50   - <view class="item" style="margin-right: 60rpx;"><button class="submit" size="default" @click="onSubmitFunc" :style="{ background: PrimaryColor }">确认</button></view>
  49 + <view class="item" v-if="info.data.isThirdLogin">
  50 + <button class="submit" size="default" @click="clearAccountFunc" :style="{ background: InfoColor }"><text class="un-bind-text">解绑</text></button>
  51 + </view>
  52 + <view class="item" style="margin-right: 60rpx;" :style="[{ position: info.data.isThirdLogin ? '' : 'relative' }, { right: info.data.isThirdLogin ? '' : '-190rpx' }]">
  53 + <button class="submit" size="default" @click="onSubmitFunc" :style="{ background: PrimaryColor }"><text class="un-bind-text">确认</text></button>
  54 + </view>
51 55 </view>
52 56 <!-- #ifdef MP -->
53 57 <view class="u-m-t-40"><text style="visibility: hidden;">#</text></view>
... ... @@ -67,12 +71,16 @@
67 71 </template>
68 72
69 73 <script>
  74 +import { mapMutations } from 'vuex';
  75 +import baseUrl from '@/config/baseUrl.js';
  76 +import { mapState } from 'vuex';
  77 +
70 78 export default {
71 79 data() {
72 80 return {
73 81 showBind: false,
74 82 PrimaryColor: '#377DFF', //主题色
75   - InfoColor: '#E3E4E5', //主题色
  83 + InfoColor: '#00C9A7', //主题色
76 84 myInfoModel: {
77 85 userInfo: {
78 86 realName: '',
... ... @@ -86,56 +94,9 @@ export default {
86 94 dateTime: Number(new Date()),
87 95 avatar: '',
88 96 id: '',
89   - rules: {
90   - 'userInfo.realName': [
91   - {
92   - type: 'string',
93   - required: true,
94   - message: '请填写姓名',
95   - trigger: ['blur', 'change']
96   - },
97   - {
98   - validator: (rule, value, callback) => {
99   - return uni.$u.test.chinese(value);
100   - },
101   - message: '姓名必须为中文',
102   - trigger: ['change', 'blur']
103   - }
104   - ],
105   - 'userInfo.phoneNumber': [
106   - {
107   - type: 'string',
108   - required: true,
109   - message: '请填写手机号码',
110   - trigger: ['blur', 'change']
111   - },
112   - {
113   - // 此为同步验证,可以直接返回true或者false,如果是异步验证,稍微不同,见下方说明
114   - validator: (rule, value, callback) => {
115   - return uni.$u.test.mobile(value);
116   - },
117   - message: '手机必须为数字',
118   - trigger: ['change', 'blur']
119   - }
120   - ],
121   - 'userInfo.email': [
122   - {
123   - type: 'string',
124   - required: true,
125   - message: '请填写邮箱',
126   - trigger: ['blur', 'change']
127   - },
128   - {
129   - validator: (rule, value, callback) => {
130   - return uni.$u.test.email(value);
131   - },
132   - message: '邮箱必须带有@',
133   - trigger: ['change', 'blur']
134   - }
135   - ]
136   - },
137 97 info: {},
138   - openIds: ''
  98 + openIds: '',
  99 + isUpdatePersonOrLoginInfo: false
139 100 };
140 101 },
141 102 onLoad(e) {
... ... @@ -147,21 +108,23 @@ export default {
147 108 this.myInfoModel.userInfo.username = params.data.username;
148 109 this.myInfoModel.userInfo.email = params.data.email;
149 110 this.myInfoModel.userInfo.accountExpireTime = params.data.accountExpireTime;
150   - this.avatar = params.data.avatar == undefined ? '../../static/avatar-test.png' : params.data.avatar;
  111 + this.avatar = params.data.avatar == undefined ? '../../static/logo.png' : params.data.avatar;
151 112 this.id = params.data.userId;
152 113 }
153 114 },
154 115 onShow() {
155 116 let getOpenId = getApp().globalData.openId;
156   - console.log('获取全局openId', getOpenId);
157 117 if (getOpenId) {
158 118 this.openIds = getOpenId;
159 119 }
160 120 },
  121 + computed: {
  122 + ...mapState(['userInfo'])
  123 + },
161 124 methods: {
  125 + ...mapMutations(['setUserInfo']),
162 126 confrimBind(e) {
163 127 if (e) {
164   - console.log('Bind', e.third?.thirdUserId);
165 128 //解绑
166 129 let httpData = {
167 130 appUserId: e.data?.userId,
... ... @@ -186,8 +149,13 @@ export default {
186 149 this.showBind = true;
187 150 },
188 151 // 修改头像
189   - upAvatar() {
190   - var that = this;
  152 + async upAvatar() {
  153 + let token;
  154 + token = this.userInfo.isToken || uni.getStorageSync('userInfo').isToken || undefined;
  155 + // #ifdef H5
  156 + token = window.sessionStorage.getItem('userInfo').isToken;
  157 + // #endif
  158 + if (!token) return uni.$u.toast('请登录后上传图片');
191 159 uni.chooseImage({
192 160 count: 1,
193 161 sourceType: ['camera', 'album'],
... ... @@ -216,52 +184,50 @@ export default {
216 184 });
217 185 return;
218 186 }
219   - uni.$u.http
220   - .upload('/yt/oss/upload', {
221   - filePath: tempFilePaths[0],
222   - name: 'file'
223   - })
224   - .then(res => {
225   - if (res) {
226   - that.avatar = res.fileStaticUri;
227   - return uni.$u.toast('头像上传成功');
228   - }
229   - });
  187 + uni.uploadFile({
  188 + url: `${baseUrl.baseUrl}/yt/oss/upload`,
  189 + filePath: tempFilePaths[0],
  190 + name: 'file',
  191 + header: {
  192 + 'content-type': 'multipart/form-data',
  193 + Authorization: 'Bearer ' + token
  194 + },
  195 + formData: {},
  196 + success: res => {
  197 + let objImage = JSON.parse(res.data);
  198 + this.avatar = objImage.fileStaticUri;
  199 + uni.$u.toast('头像上传成功');
  200 + }
  201 + });
230 202 }
231 203 });
232 204 },
233 205 onSubmitFunc() {
234   - this.$refs.myInfoFormRef
235   - .validate()
  206 + let httpData = {
  207 + avatar: this.avatar,
  208 + email: this.myInfoModel.userInfo.email,
  209 + id: this.id,
  210 + phoneNumber: this.myInfoModel.userInfo.phoneNumber,
  211 + realName: this.myInfoModel.userInfo.realName
  212 + };
  213 + uni.$u.http
  214 + .put('/yt/user/center', httpData)
236 215 .then(res => {
237   - let httpData = {
238   - avatar: this.avatar,
239   - email: this.myInfoModel.userInfo.email,
240   - id: this.id,
241   - phoneNumber: this.myInfoModel.userInfo.phoneNumber,
242   - realName: this.myInfoModel.userInfo.realName
243   - };
244   - uni.$u.http
245   - .put('/yt/user/center', httpData)
246   - .then(res => {
247   - if (res) {
248   - uni.showToast({
249   - title: '更新个人资料成功~',
250   - icon: 'none'
251   - });
252   - setTimeout(() => {
253   - uni.navigateBack({
254   - delta: 1
255   - });
256   - }, 500);
257   - }
258   - })
259   - .catch(e => {
260   - uni.$u.toast(e.data.message);
  216 + if (res) {
  217 + this.setUserInfo(res);
  218 + uni.showToast({
  219 + title: '更新个人资料成功~',
  220 + icon: 'none'
261 221 });
  222 + setTimeout(() => {
  223 + uni.navigateBack({
  224 + delta: 1
  225 + });
  226 + }, 500);
  227 + }
262 228 })
263   - .catch(errors => {
264   - uni.$u.toast('校验失败');
  229 + .catch(e => {
  230 + uni.$u.toast(e.data.message);
265 231 });
266 232 },
267 233 dateClose() {
... ...
1 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 class="circleStyle"></view>
10   - </view>
11   - </view>
12   - <view class="f__login">
13   - <view class="loginPhone">
14   - <view class="form-row u-flex">
15   - <view class="v-input"><input type="text" v-model="loginForm.username" maxlength="32" placeholder="请输入登录账号" /></view>
16   - <u-icon></u-icon>
17   - </view>
18   - <view class="form-row u-flex">
19   - <view class="v-input"><input type="text" v-model="loginForm.password" maxlength="32" placeholder="请输入登录密码" :password="!showPassword" /></view>
20   - <view class="v-password" @click="showPasswordMode"><u-icon color="#9a9a9a" size="25" :name="showPassword ? 'eye-fill' : 'eye-off'"></u-icon></view>
21   - <u-icon></u-icon>
22   - </view>
23   - <button class="submit" size="default" @click="onSubmitFunc"><text class="text">登录</text></button>
24   - <view class="u-flex row-item">
25   - <view class="row-phone login-text-gray" @click="openCodeFunc">手机验证码登录</view>
26   - <view class="row-reset login-text-gray" @click="findPassrordFunc">忘记密码</view>
27   - </view>
28   - <view class="u-flex link-login">
29   - <view class="link-text login-text-gray">第三方账号登录</view>
30   - <view style="height:20rpx"></view>
31   - <view @click="onAuthorization" class="link-image"><image class="image" src="../../static/weixin.png" mode="aspectFill"></image></view>
32   - <view class="circleStyleBottom"></view>
33   - </view>
34   - </view>
35   - </view>
36   - </view>
  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>
37 81 </template>
38 82
39 83 <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';
  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";
45 93
46 94 export default {
47   - data() {
48   - return {
49   - loginForm: {
50   - username: '',
51   - password: ''
52   - },
53   - showPassword: false,
54   - code: '',
55   - openid: '',
56   - session_key: ''
57   - };
58   - },
59   - onLoad() {
60   - //#ifdef MP-WEIXIN
61   - wx.login({
62   - success: res => {
63   - if (res.code) {
64   - this.code = res.code;
65   - wx.request({
66   - url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecrect}&js_code=${this.code}&grant_type=authorization_code`,
67   - method: 'GET',
68   - success: res => {
69   - if (res.statusCode == 200) {
70   - this.openid = res.data.openid;
71   - this.session_key = res.data.session_key;
72   - //设置全局变量openId
73   - getApp().globalData.openId = res.data.openid;
74   - }
75   - },
76   - complete: e => {
77   - if (e.data.errcode != null) {
78   - return;
79   - // return uni.$u.toast('获取用户唯一id失败');
80   - }
81   - }
82   - });
83   - } else {
84   - }
85   - }
86   - });
87   - //#endif
88   - },
89   - methods: {
90   - ...mapMutations(['setUserInfo']),
91   - ...mapActions(['updateBadgeTotal']),
92   - //微信授权登录
93   - //#ifdef MP-WEIXIN
94   - onAuthorization() {
95   - /**
96   - * 注意:通过wx.getUserProfile并不能获取用户的openid,openid是唯一识别用户的标识,
97   - * 所以最好在用户授权登录时就获取。调用wx.login()获取
98   - */
99   - wx.getUserProfile({
100   - desc: '获取用户授权信息',
101   - success: res => {
102   - if (res) {
103   - //微信官方自带解密(node.js实现)
104   - let pc = new WXBizDataCrypt(appId, this.session_key);
105   - let data = pc.decryptData(res.encryptedData, res.iv);
106   - let obj = {
107   - avatarUrl: data.avatarUrl,
108   - nickName: data.nickName,
109   - thirdUserId: this.openid
110   - };
111   - //判断是否需要绑定
112   - uni.$u.http
113   - .get(`/yt/third/login/${this.openid}`)
114   - .then(res => {
115   - if (res.token == '' || res.token == null) {
116   - //需要绑定,跳转我的页面进行绑定,显示绑定按钮
117   - uni.reLaunch({
118   - url: '../../pages/personal/personal'
119   - });
120   - let userInfo = {
121   - isThirdLogin: true //token用于判断是否登录
122   - };
123   - this.setUserInfo(userInfo);
124   - } else {
125   - // 不需要绑定
126   - // 储存登录信息
127   - let resObj = {
128   - refreshToken: res.refreshToken,
129   - isToken: res.token
130   - };
131   - let userInfo = {
132   - ...resObj,
133   - token: true //token用于判断是否登录
134   - };
135   - if (userInfo.token) {
136   - this.setUserInfo(userInfo);
137   - }
138   - uni.showToast({
139   - title: '第三方账号登录成功~',
140   - icon: 'none'
141   - });
142   - this.saveUserInfo();
143   - this.getAlarmTotalData();
144   - uni.reLaunch({
145   - url: '../../pages/personal/personal'
146   - });
147   - }
148   - })
149   - .catch(e => {
150   - uni.$u.toast(e.data?.message);
151   - });
152   - /**
153   - * 有些时候uni.navigatorBack({})没有返回到上级页面
154   - * 才使用uni.reLaunch()进行跳转
155   - */
156   - // #ifdef MP
157   - setTimeout(() => {
158   - uni.reLaunch({
159   - url: '../../pages/personal/personal?obj=' + encodeURIComponent(JSON.stringify(obj))
160   - });
161   - }, 500);
162   - // #endif
163   - }
164   - }
165   - });
166   - },
167   - //#endif
168   - saveUserInfo() {
169   - //储存个人信息
170   - uni.$u.http.get('/yt/user/me/info').then(res => {
171   - if (res) {
172   - this.setUserInfo(res);
173   - }
174   - });
175   - },
176   - async getAlarmTotalData() {
177   - const res = await uni.$u.http.get('/yt/homepage/app');
178   - if (res) {
179   - //异步实时更新告警徽标数
180   - this.updateBadgeTotal(res.totalAlarm.activedAlarm);
181   - }
182   - },
183   - onSubmitFunc() {
184   - if (this.loginForm.username == '') {
185   - return uni.$u.toast('请输入登录账号~');
186   - }
187   - const passReg = /^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{8,}$/;
188   - if (this.loginForm.password == '') {
189   - uni.showToast({
190   - title: '请输入登录密码~',
191   - icon: 'none'
192   - });
193   - return;
194   - } else if (!passReg.test(this.loginForm.password)) {
195   - uni.showToast({
196   - title: '密码格式不正确(至少一个大写英文字母、至少一个小写英文字母、至少一位数字、至少一个特殊字符、最少八个字符)~',
197   - icon: 'none',
198   - duration: 3000
199   - });
200   - return;
201   - }
202   - uni.$u.http
203   - .post('/auth/login', this.loginForm)
204   - .then(res => {
205   - if (res) {
206   - // 储存登录信息
207   - let resObj = {
208   - refreshToken: res.refreshToken,
209   - isToken: res.token
210   - };
211   - let userInfo = {
212   - ...resObj,
213   - token: true, //token用于判断是否登录
214   - isThirdLogin: false
215   - };
216   - if (userInfo.token) {
217   - this.setUserInfo(userInfo);
218   - }
219   - uni
220   - .showToast({
221   - title: '登录成功~',
222   - icon: 'none'
223   - })
224   - .then(async res => {
225   - this.saveUserInfo();
226   - await this.getAlarmTotalData();
227   - // #ifdef APP-PLUS||MP
228   - uni.reLaunch({
229   - url: '/pages/personal/personal'
230   - });
231   - // #endif
232   - });
233   - }
234   - })
235   - .catch(e => {
236   - uni.$u.toast(e.data?.message);
237   - });
238   - },
239   - saveUserInfo() {
240   - //储存个人信息
241   - uni.$u.http.get('/yt/user/me/info').then(res => {
242   - if (res) {
243   - this.setUserInfo(res);
244   - }
245   - });
246   - },
247   - openCodeFunc() {
248   - uni.navigateTo({
249   - url: '../other/code'
250   - });
251   - },
252   - findPassrordFunc() {
253   - uni.navigateTo({
254   - url: '../other/findPassword'
255   - });
256   - },
257   - showPasswordMode() {
258   - this.showPassword = !this.showPassword;
259   - }
260   - }
  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 + },
261 366 };
262 367 </script>
263 368
264 369 <style lang="scss" scoped>
265   -@import './static/login.scss';
266   -</style>
  370 +@import "./static/login.scss";
  371 +
  372 +/deep/ button {
  373 + background: rgba(0, 0, 0, 0);
  374 +}
  375 +</style>
... ...
1 1 .login-page {
2 2 min-height: 100vh;
3   - background-color: #fff;
  3 + width: 750rpx;
  4 + background: url(/static/login.png) no-repeat;
4 5 .login-main {
5 6 flex-direction: column;
6 7 .content {
7 8 height: 250rpx;
8 9 margin-top: 90rpx;
9 10 margin-left: -107rpx;
  11 + position: relative;
  12 + top: 50rpx;
  13 + left: -15rpx;
10 14 .hello {
11 15 font-size: 30px;
12 16 color: #3a4759;
... ... @@ -21,16 +25,6 @@
21 25 }
22 26 }
23 27 }
24   - .circleStyle {
25   - position: absolute;
26   - width: 145rpx;
27   - height: 300rpx;
28   - left: -31rpx;
29   - top: 10rpx;
30   - border-radius: 0 100rpx 100rpx 0/0 150rpx 150rpx 0;
31   - background-color: #f0f2f5;
32   - opacity: 0.5;
33   - }
34 28 }
35 29
36 30 .f__login {
... ... @@ -47,7 +41,7 @@
47 41 margin-top: 60rpx;
48 42 .v-input {
49 43 width: 690rpx;
50   - border-bottom: 2px solid #e5e5e5;
  44 + border-bottom: 1px solid #e5e5e5;
51 45 }
52 46 .v-password {
53 47 position: absolute;
... ... @@ -107,19 +101,4 @@
107 101 }
108 102 }
109 103 }
110   - .circleStyleBottom {
111   - position: absolute;
112   - width: 145rpx;
113   - height: 300rpx;
114   - right: -31rpx;
115   - top: 404rpx;
116   - //#ifndef MP
117   - top: 504rpx;
118   - //#endif
119   - border-radius: 0 100rpx 100rpx 0/0 150rpx 150rpx 0;
120   - background: linear-gradient(241deg, #00c9a7 0%, rgba(0, 223, 252, 0.5) 100%);
121   - opacity: 0.1;
122   - transform: rotate(180deg);
123   - z-index: -9999;
124   - }
125 104 }
... ...

976 Bytes

... ... @@ -14,6 +14,7 @@ export const mutations = {
14 14 // #endif
15 15 // #ifndef H5
16 16 uni.setStorageSync('userInfo', state.userInfo);
  17 + wx.setStorageSync('userInfo', state.userInfo);
17 18 // #endif
18 19 }
19 20 },
... ... @@ -25,10 +26,11 @@ export const mutations = {
25 26 // #endif
26 27 // #ifndef H5
27 28 uni.removeStorageSync("userInfo");
  29 + uni.removeStorageSync('storagePre');
28 30 // #endif
29   - },
30   - setBadgeInfo(state,payload){
31   - state.badgeInfo = payload;
  31 + },
  32 + setBadgeInfo(state,payload){
  33 + state.badgeInfo = payload;
32 34 }
33 35 };
34 36 export const actions = {
... ... @@ -36,7 +38,7 @@ export const actions = {
36 38 updateBadgeTotal({
37 39 state,
38 40 commit
39   - }, data) {
  41 + }, data) {
40 42 commit('setBadgeInfo',data)
41 43 console.log('Change total', data,state);
42 44 }
... ...
... ... @@ -64,7 +64,7 @@ button {
64 64 .text-bold {
65 65 color: #333333;
66 66 font-family: PingFangSC-Medium, PingFang SC;
67   - font-weight: 500;
  67 + font-weight: bold;
68 68 font-size: 15px;
69 69 }
70 70 //(设备、告警,适用设备详情基础信息文本(右边的值的文本))第二个文本
... ... @@ -132,7 +132,7 @@ button {
132 132 .home-text-total {
133 133 font-size: 17px;
134 134 font-family: PingFangSC-Regular, PingFang SC;
135   - font-weight: 500;
  135 + font-weight: bold;
136 136 color: #333333;
137 137 }
138 138 .home-text-total-bottom {
... ... @@ -185,6 +185,13 @@ button {
185 185 font-weight: 400;
186 186 color: #333333 !important;
187 187 }
  188 +.un-bind-text {
  189 + font-size: 16px;
  190 + font-family: PingFangSC-Regular, PingFang SC;
  191 + font-weight: 400;
  192 + // color: #333333;
  193 + color: #ffffff;
  194 +}
188 195 // 定义flex等分
189 196 @for $i from 0 through 12 {
190 197 .u-flex-#{$i} {
... ...
... ... @@ -13,9 +13,9 @@
13 13 </u-list>
14 14 <view class="bottom-text">
15 15 <view class="u-flex column">
16   - <text class="text">{{ notifyList.title }}</text>
  16 + <text class="text" style="font-weight: bold;">{{ notifyList.title }}</text>
17 17 </view>
18   - <view style="margin-top: 20rpx;">
  18 + <view style="margin-top: 21rpx;">
19 19 <!-- 富文本解析 -->
20 20 <u-parse :content="notifyList.content"></u-parse>
21 21 <!-- 富文本解析 -->
... ...
... ... @@ -2,9 +2,11 @@
2 2 <view class="notify-page">
3 3 <!-- 公共组件-每个页面必须引入 -->
4 4 <public-module></public-module>
5   - <view @click="openTypeClick" style="width: 700rpx;position: fixed;top: 0;z-index: 1;">
6   - <u--input suffixIcon="arrow-down" shape="circle" disabled v-model="model1.userInfo.type" placeholder="请选择类型" border="surround"></u--input>
7   - <u-action-sheet :show="showType" :actions="actions" title="请选择类型" @close="showType = false" @select="typeSelect"></u-action-sheet>
  5 + <view style="width: 750rpx;height:53rpx;background-color: #f8f9fa;position:fixed;top:0;z-index: 99999;">
  6 + <view @click="openTypeClick" style="background-color: #f8f9fa;width: 700rpx;position: relative;top: 10rpx;">
  7 + <u--input suffixIcon="arrow-down" shape="circle" disabled v-model="model1.userInfo.type" placeholder="请选择类型" border="surround"></u--input>
  8 + <u-action-sheet :show="showType" :actions="actions" title="请选择类型" @close="showType = false" @select="typeSelect"></u-action-sheet>
  9 + </view>
8 10 </view>
9 11 <view style="height: 76rpx;"></view>
10 12 <view class="notify-main">
... ... @@ -82,7 +84,8 @@ export default {
82 84 onShow() {
83 85 this.pre = uni.getStorageSync('storagePre');
84 86 if (this.pre) {
85   - this.loadData(1);
  87 + this.page.num = 1;
  88 + this.loadData(this.page.num);
86 89 }
87 90 },
88 91 onHide() {
... ... @@ -97,25 +100,19 @@ export default {
97 100 uni.hideKeyboard();
98 101 },
99 102 typeSelect(e) {
100   - this.topBack();
101 103 this.isJudgeNextPage = e.value;
102 104 this.page.num = 1;
103 105 this.model1.userInfo.type = e.name;
104 106 this.loadData(1, this.isJudgeNextPage == '' ? null : this.isJudgeNextPage);
105 107 },
106   - //筛选数据让它回到顶部
107   - topBack() {
108   - uni.pageScrollTo({
109   - scrollTop: 0, // 滚动到页面的目标位置 这个是滚动到顶部, 0
110   - duration: 300 // 滚动动画的时长
111   - });
112   - },
113 108 /*下拉刷新的回调 */
114 109 downCallback() {
115 110 //联网加载数据
116 111 this.list.length = 0;
117 112 this.page.num = 1;
118 113 this.loadData(1);
  114 + this.isJudgeNextPage = '';
  115 + this.model1.userInfo.type = '';
119 116 },
120 117 /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
121 118 upCallback() {
... ...