Showing
19 changed files
with
1567 additions
and
408 deletions
| ... | ... | @@ -68,8 +68,8 @@ |
| 68 | 68 | <view><u--textarea border="none" height="96" placeholder="请输入处理结果" v-model="formModel.result" count></u--textarea></view> |
| 69 | 69 | </view> |
| 70 | 70 | <!-- #endif --> |
| 71 | - <view v-if="list.status !== 'CLEARED_ACK'" style="width: 500rpx;margin-left: 80rpx;margin-top: 44rpx;"> | |
| 72 | - <u-button @click="handleSubmit" type="primary" shape="circle" text="处理"></u-button> | |
| 71 | + <view v-if="list.status !== 'CLEARED_ACK'" style="margin-top: 44rpx;"> | |
| 72 | + <view class="u-flex" style="justify-content: center;align-items: center;"><u-button @click="handleSubmit" type="primary" shape="circle" text="处理"></u-button></view> | |
| 73 | 73 | </view> |
| 74 | 74 | </view> |
| 75 | 75 | </template> | ... | ... |
| ... | ... | @@ -4,10 +4,10 @@ import { |
| 4 | 4 | let baseUrl = ""; |
| 5 | 5 | if (process.env.NODE_ENV === 'development') { |
| 6 | 6 | // 开发环境 |
| 7 | - baseUrl = 'http://47.99.141.212:8080/api' | |
| 7 | + baseUrl = 'https://dev.thingskit.com/api' | |
| 8 | 8 | } else if (process.env.NODE_ENV === 'production') { |
| 9 | 9 | // 生产环境 |
| 10 | - baseUrl = 'http://47.99.141.212:8080/api' | |
| 10 | + // baseUrl = 'http://47.99.141.212:8080/api' | |
| 11 | 11 | } |
| 12 | 12 | |
| 13 | 13 | let systemInfo = { | ... | ... |
| ... | ... | @@ -39,7 +39,7 @@ uni.$u.http.interceptors.request.use( |
| 39 | 39 | uni.getStorageSync("userInfo").isToken || |
| 40 | 40 | undefined; |
| 41 | 41 | } |
| 42 | - console.log("请求开始", config); | |
| 42 | + // console.log("请求开始", config); | |
| 43 | 43 | if (config?.custom?.load) { |
| 44 | 44 | //打开加载动画 |
| 45 | 45 | store.commit("setLoadingShow", true); | ... | ... |
| ... | ... | @@ -95,7 +95,7 @@ export default { |
| 95 | 95 | ], |
| 96 | 96 | 'feedbackInfo.phone': [ |
| 97 | 97 | { |
| 98 | - type: 'string', | |
| 98 | + type: 'number', | |
| 99 | 99 | required: true, |
| 100 | 100 | message: '请填写手机号码', |
| 101 | 101 | trigger: ['blur', 'change'] |
| ... | ... | @@ -104,7 +104,7 @@ export default { |
| 104 | 104 | validator: (rule, value, callback) => { |
| 105 | 105 | return uni.$u.test.mobile(value); |
| 106 | 106 | }, |
| 107 | - message: '手机必须为数字', | |
| 107 | + message: '手机号码不正确', | |
| 108 | 108 | trigger: ['change', 'blur'] |
| 109 | 109 | } |
| 110 | 110 | ], |
| ... | ... | @@ -119,7 +119,7 @@ export default { |
| 119 | 119 | validator: (rule, value, callback) => { |
| 120 | 120 | return uni.$u.test.email(value); |
| 121 | 121 | }, |
| 122 | - message: '邮箱必须带有@', | |
| 122 | + message: '邮箱不正确', | |
| 123 | 123 | trigger: ['change', 'blur'] |
| 124 | 124 | } |
| 125 | 125 | ], |
| ... | ... | @@ -141,6 +141,10 @@ export default { |
| 141 | 141 | } |
| 142 | 142 | }; |
| 143 | 143 | }, |
| 144 | + onReady() { | |
| 145 | + // 如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则 | |
| 146 | + this.$refs.myfeedBackFormRef.setRules(this.rules); | |
| 147 | + }, | |
| 144 | 148 | onLoad() { |
| 145 | 149 | // 隐藏原生的tabbar |
| 146 | 150 | uni.hideTabBar(); | ... | ... |
| ... | ... | @@ -158,17 +158,7 @@ |
| 158 | 158 | :rules="rules" |
| 159 | 159 | ref="form1" |
| 160 | 160 | > |
| 161 | - <u-form-item | |
| 162 | - style="font-size: 14px" | |
| 163 | - label="选择日期" | |
| 164 | - prop="selectTime" | |
| 165 | - labelWidth="80" | |
| 166 | - borderBottom | |
| 167 | - @click=" | |
| 168 | - showCalendar = true; | |
| 169 | - hideKeyboard(); | |
| 170 | - " | |
| 171 | - > | |
| 161 | + <u-form-item style="font-size: 14px" label="选择日期" prop="selectTime" labelWidth="80" borderBottom @click="openTime"> | |
| 172 | 162 | <u--input v-model="timeData.selectTime" placeholder="请选择日期" border="none"></u--input> |
| 173 | 163 | </u-form-item> |
| 174 | 164 | </u--form> |
| ... | ... | @@ -404,7 +394,8 @@ export default { |
| 404 | 394 | this.show = true; |
| 405 | 395 | this.resetData(); |
| 406 | 396 | }, |
| 407 | - hideKeyboard() { | |
| 397 | + openTime() { | |
| 398 | + this.showCalendar = true; | |
| 408 | 399 | uni.hideKeyboard(); |
| 409 | 400 | }, |
| 410 | 401 | calendarConfirm(e) { |
| ... | ... | @@ -427,7 +418,7 @@ export default { |
| 427 | 418 | status: e.status |
| 428 | 419 | }; |
| 429 | 420 | uni.navigateTo({ |
| 430 | - url:'/alarmSubPage/alarmDetailPage/alarmDetail?data='+JSON.stringify(obj) | |
| 421 | + url: '/alarmSubPage/alarmDetailPage/alarmDetail?data=' + JSON.stringify(obj) | |
| 431 | 422 | // url: '/' + JSON.stringify(obj) |
| 432 | 423 | }); |
| 433 | 424 | } | ... | ... |
| ... | ... | @@ -12,99 +12,93 @@ |
| 12 | 12 | </view> |
| 13 | 13 | <view class="org-item"><image class="image" src="../../../static/right-arrow.png"></image></view> |
| 14 | 14 | </view> |
| 15 | - <view class="camera-container"> | |
| 16 | - <view class="container-item"> | |
| 17 | - <view @click="openCameraDetail(item.url)" v-for="(item, index) in list" :key="index" class="item"> | |
| 18 | - <video class="video" :src="item.videoUrl" controls></video> | |
| 19 | - <view class="bottom-text"> | |
| 20 | - <text class="text">{{ item.name }}</text> | |
| 21 | - </view> | |
| 22 | - <view @click="hideImageUrl(item, index)" :style="[index == current ? { display: 'none' } : { display: 'block' }]" class="avatar-cover"> | |
| 23 | - <image class="image" :src="item.avatar"></image> | |
| 15 | + <!-- 自带分页组件 --> | |
| 16 | + <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" @up="upCallback"> | |
| 17 | + <view class="camera-container"> | |
| 18 | + <view class="container-item"> | |
| 19 | + <view @click="openCameraDetail(item.url)" v-for="(item, index) in list" :key="index" class="item"> | |
| 20 | + <video class="video" :src="item.videoUrl" controls></video> | |
| 21 | + <view class="bottom-text"> | |
| 22 | + <text class="text">{{ item.name }}</text> | |
| 23 | + </view> | |
| 24 | + <!-- #ifdef MP --> | |
| 25 | + <view @click="hideImageUrl(item, index)" :style="[index == current ? { display: 'none' } : { display: 'block' }]" class="avatar-cover"> | |
| 26 | + <image class="image" :src="item.avatar"></image> | |
| 27 | + </view> | |
| 28 | + <!-- #endif --> | |
| 24 | 29 | </view> |
| 25 | 30 | </view> |
| 26 | 31 | </view> |
| 27 | - </view> | |
| 32 | + </mescroll-body> | |
| 33 | + <!-- 自带分页组件 --> | |
| 28 | 34 | <view style="height: 30rpx;"></view> |
| 29 | 35 | </view> |
| 30 | 36 | </template> |
| 31 | 37 | |
| 32 | 38 | <script> |
| 39 | +import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | |
| 40 | + | |
| 33 | 41 | export default { |
| 42 | + mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | |
| 34 | 43 | data() { |
| 35 | 44 | return { |
| 45 | + page: { | |
| 46 | + num: 0, | |
| 47 | + size: 10 | |
| 48 | + }, | |
| 49 | + downOption: { | |
| 50 | + auto: true //是否在初始化后,自动执行downCallback; 默认true | |
| 51 | + }, | |
| 52 | + upOption: { | |
| 53 | + auto: false // 不自动加载 | |
| 54 | + }, | |
| 36 | 55 | current: 0, |
| 37 | 56 | deviceTotal: 0, |
| 38 | - list: [ | |
| 39 | - { | |
| 40 | - videoUrl: 'http://113.204.115.250:83/openUrl/e5NZg76/live.m3u8', | |
| 41 | - name: '摄像头1', | |
| 42 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 43 | - }, | |
| 44 | - { | |
| 45 | - videoUrl: 'https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg2.mp4', | |
| 46 | - name: '摄像头2', | |
| 47 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 48 | - }, | |
| 49 | - { | |
| 50 | - videoUrl: 'https://stream7.iqilu.com/10339/article/202002/18/2fca1c77730e54c7b500573c2437003f.mp4', | |
| 51 | - name: '摄像头3', | |
| 52 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 53 | - }, | |
| 54 | - { | |
| 55 | - videoUrl: 'https://stream7.iqilu.com/10339/article/202002/17/c292033ef110de9f42d7d539fe0423cf.mp4', | |
| 56 | - name: '摄像头4', | |
| 57 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 58 | - }, | |
| 59 | - { | |
| 60 | - videoUrl: 'https://stream7.iqilu.com/10339/article/202002/16/3be2e4ef4aa21bfe7493064a7415c34d.mp4', | |
| 61 | - name: '摄像头5', | |
| 62 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 63 | - }, | |
| 64 | - { | |
| 65 | - videoUrl: 'https://stream7.iqilu.com/10339/upload_transcode/202002/09/20200209104902N3v5Vpxuvb.mp4', | |
| 66 | - name: '摄像头6', | |
| 67 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 68 | - }, | |
| 69 | - { | |
| 70 | - videoUrl: 'https://stream7.iqilu.com/10339/upload_transcode/202002/09/20200209104902N3v5Vpxuvb.mp4', | |
| 71 | - name: '摄像头6', | |
| 72 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 73 | - }, | |
| 74 | - { | |
| 75 | - videoUrl: 'https://stream7.iqilu.com/10339/upload_transcode/202002/09/20200209104902N3v5Vpxuvb.mp4', | |
| 76 | - name: '摄像头6', | |
| 77 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 78 | - }, | |
| 79 | - { | |
| 80 | - videoUrl: 'https://stream7.iqilu.com/10339/upload_transcode/202002/09/20200209104902N3v5Vpxuvb.mp4', | |
| 81 | - name: '摄像头6', | |
| 82 | - avatar: 'http://47.99.141.212:9000/yunteng/bdNZzPQReLufzqx.jpg' | |
| 83 | - } | |
| 84 | - ] | |
| 57 | + list: [] | |
| 85 | 58 | }; |
| 86 | 59 | }, |
| 87 | 60 | onLoad() { |
| 88 | 61 | // 隐藏原生的tabbar |
| 89 | 62 | uni.hideTabBar(); |
| 90 | 63 | this.getDeviceTotalData(); |
| 91 | - this.getCameraList(); | |
| 92 | 64 | }, |
| 93 | 65 | methods: { |
| 94 | - hideImageUrl(item, index) { | |
| 95 | - this.current = index; | |
| 66 | + /*下拉刷新的回调 */ | |
| 67 | + downCallback() { | |
| 68 | + //联网加载数据 | |
| 69 | + this.page.num = 1; | |
| 70 | + this.loadData(1); | |
| 96 | 71 | }, |
| 97 | - getCameraList() { | |
| 72 | + /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ | |
| 73 | + upCallback() { | |
| 74 | + //联网加载数据 | |
| 75 | + this.page.num += 1; | |
| 76 | + this.loadData(this.page.num); | |
| 77 | + }, | |
| 78 | + loadData(pageNo) { | |
| 98 | 79 | let httpData = { |
| 99 | - page: 1, | |
| 80 | + page: pageNo, | |
| 100 | 81 | pageSize: 10 |
| 101 | 82 | }; |
| 102 | - uni.$u.http.get('/yt/video', { params: httpData, custom: { load: false } }).then(res => { | |
| 103 | - if (res) { | |
| 104 | - console.log('Video', res); | |
| 105 | - this.list = res.items; | |
| 106 | - } | |
| 107 | - }); | |
| 83 | + uni.$u.http | |
| 84 | + .get('/yt/video', { params: httpData, custom: { load: false } }) | |
| 85 | + .then(res => { | |
| 86 | + uni.stopPullDownRefresh(); | |
| 87 | + this.mescroll.endByPage(res.items.length, res.total); | |
| 88 | + if (pageNo == 1) { | |
| 89 | + this.list = res.items; | |
| 90 | + } else { | |
| 91 | + this.list = this.list.concat(res.items); | |
| 92 | + } | |
| 93 | + }) | |
| 94 | + .catch(e => { | |
| 95 | + uni.$u.toast(e.data?.message); | |
| 96 | + //联网失败, 结束加载 | |
| 97 | + this.mescroll.endErr(); | |
| 98 | + }); | |
| 99 | + }, | |
| 100 | + hideImageUrl(item, index) { | |
| 101 | + this.current = index; | |
| 108 | 102 | }, |
| 109 | 103 | getDeviceTotalData() { |
| 110 | 104 | let httpData = { | ... | ... |
| 1 | 1 | <template> |
| 2 | - <view class="personal"> | |
| 3 | - <!-- 公共组件-每个页面必须引入 --> | |
| 4 | - <public-module></public-module> | |
| 5 | - <view class="headBox"> | |
| 6 | - <!-- #ifdef MP --> | |
| 7 | - <!-- 登录 --> | |
| 8 | - <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30"> | |
| 9 | - <block v-if="userInfo.isToken"> | |
| 10 | - <view @click="openPersonalInfo" class="u-m-r-20"><image class="avatar" mode="aspectFill" :src="userInfo.avatar"></image></view> | |
| 11 | - <view @click="openPersonalInfo" class="u-flex-1"> | |
| 12 | - <view class="nickName u-flex"> | |
| 13 | - <view class="name u-m-r-10" v-if="userInfo.realName"> | |
| 14 | - <text style="#FFFFFF;font-size: 18px;">{{ userInfo.realName }}</text> | |
| 15 | - </view> | |
| 16 | - </view> | |
| 17 | - <view style="#FFFFFF;font-size: 14px;" v-if="userInfo.phoneNumber">手机号:{{ userInfo.phoneNumber | phone }}</view> | |
| 18 | - <view v-else><text style="#FFFFFF;font-size: 14px;">手机号:未绑定</text></view> | |
| 19 | - </view> | |
| 20 | - </block> | |
| 21 | - <block v-else> | |
| 22 | - <view class="u-m-r-20"> | |
| 23 | - <view class="avatar u-flex"><u-icon name="account-fill" color="black" size="30"></u-icon></view> | |
| 24 | - </view> | |
| 25 | - <view class="u-flex-1"> | |
| 26 | - <view @click="openLoginFunc" class="u-font-lg click-login">请点击登录</view> | |
| 27 | - <view @click="clickAccountFunc" class="detail"><text class="text">绑定账号</text></view> | |
| 28 | - </view> | |
| 29 | - </block> | |
| 30 | - <view><u-icon name="arrow-right" color="black" size="13"></u-icon></view> | |
| 31 | - </view> | |
| 32 | - <!-- #endif --> | |
| 33 | - <!-- #ifndef MP --> | |
| 34 | - <!-- 登录 --> | |
| 35 | - <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30"> | |
| 36 | - <block v-if="userInfo.isToken"> | |
| 37 | - <view @click="openPersonalInfo" class="u-m-r-20"><image class="avatar" mode="aspectFill" :src="userInfo.avatar"></image></view> | |
| 38 | - <view @click="openPersonalInfo" class="u-flex-1"> | |
| 39 | - <view class="nickName u-flex"> | |
| 40 | - <view class="name u-m-r-10" v-if="userInfo.realName"> | |
| 41 | - <text style="#FFFFFF;font-size: 18px;">{{ userInfo.realName }}</text> | |
| 42 | - </view> | |
| 43 | - </view> | |
| 44 | - <view style="#FFFFFF;font-size: 14px;" v-if="userInfo.phoneNumber">手机号:{{ userInfo.phoneNumber | phone }}</view> | |
| 45 | - <view v-else><text style="#FFFFFF;font-size: 14px;">手机号:未绑定</text></view> | |
| 46 | - </view> | |
| 47 | - </block> | |
| 48 | - <block v-else> | |
| 49 | - <view class="u-m-r-20"> | |
| 50 | - <view class="avatar u-flex" style="justify-content: center;"><u-icon name="account-fill" color="black" size="30"></u-icon></view> | |
| 51 | - </view> | |
| 52 | - <view class="u-flex-1"> | |
| 53 | - <view @click="openLoginFunc" class="u-font-lg" style="color: black;font-weight: bold;">登录</view> | |
| 54 | - <view @click="clickAccountFunc" style="color:black;" class="detail">绑定账号</view> | |
| 55 | - </view> | |
| 56 | - </block> | |
| 57 | - <view><u-icon name="arrow-right" color="black" size="13"></u-icon></view> | |
| 58 | - </view> | |
| 59 | - <!-- #endif --> | |
| 60 | - </view> | |
| 61 | - <view class="u-flex my-nav"> | |
| 62 | - <view class="nav-main"> | |
| 63 | - <view @click="onTokenJump('/sysNotifySubPage/sysNotifyPage/systemNotify')" class="u-flex nav-link"> | |
| 64 | - <view class="nav-image"><image class="image" src="../../static/sys-not.png"></image></view> | |
| 65 | - <view class="nav-center"><text class="text">系统通知</text></view> | |
| 66 | - <view class="nav-right"><image class="image" src="../../static/arrow-right.png"></image></view> | |
| 67 | - </view> | |
| 68 | - <view @click="onTokenJump('/feedBackSubPage/feedback/feedback')" class="u-flex nav-link"> | |
| 69 | - <view class="nav-image"><image class="image" src="../../static/find-sugg.png"></image></view> | |
| 70 | - <view class="nav-center"><text class="text">意见反馈</text></view> | |
| 71 | - <view class="nav-right"><image class="image" src="../../static/arrow-right.png"></image></view> | |
| 72 | - </view> | |
| 73 | - </view> | |
| 74 | - <view v-if="userInfo.isToken" class="u-flex" style="justify-content: center;width: 600rpx;"> | |
| 75 | - <u-button @click="onLoginoutFunc" type="primary" shape="circle" text="退出账号"></u-button> | |
| 76 | - </view> | |
| 77 | - </view> | |
| 78 | - <!-- 绑定账号 --> | |
| 79 | - <view> | |
| 80 | - <u-modal :showConfirmButton="false" :show="show" :title="title"> | |
| 81 | - <view v-if="!bindPhone" class="loginPhone"> | |
| 82 | - <view class="form-row"><u--input shape="circle" class="input" prefixIcon="account-fill" type="text" placeholder="登录账号" v-model="account"></u--input></view> | |
| 83 | - <view class="form-row item-bind"> | |
| 84 | - <u--input | |
| 85 | - class="input" | |
| 86 | - shape="circle" | |
| 87 | - prefixIcon="lock-fill" | |
| 88 | - suffixIconStyle="color: #909399" | |
| 89 | - type="password" | |
| 90 | - placeholder="登录密码" | |
| 91 | - v-model="password" | |
| 92 | - @change="passwordChange" | |
| 93 | - ></u--input> | |
| 94 | - </view> | |
| 95 | - <view class="u-flex item-phone"> | |
| 96 | - <view class="phone-hide">手机验证码登录</view> | |
| 97 | - <view class="bind-phone-text" @click="bindPhoneFunc">手机绑定</view> | |
| 98 | - </view> | |
| 99 | - </view> | |
| 100 | - <view v-else class="loginPhone"> | |
| 101 | - <view class="form-row"> | |
| 102 | - <u--input | |
| 103 | - shape="circle" | |
| 104 | - class="input" | |
| 105 | - type="text" | |
| 106 | - v-model="phone" | |
| 107 | - placeholder="请输入手机号码" | |
| 108 | - placeholder-style="font-weight:normal;color:#bbbbbb;" | |
| 109 | - ></u--input> | |
| 110 | - </view> | |
| 111 | - <view class="form-row row-top"> | |
| 112 | - <u--input | |
| 113 | - shape="circle" | |
| 114 | - class="input" | |
| 115 | - type="text" | |
| 116 | - v-model="vCode" | |
| 117 | - placeholder="请输入验证码" | |
| 118 | - placeholder-style="font-weight:normal;color:#bbbbbb;" | |
| 119 | - ></u--input> | |
| 120 | - <view style="color:#377DFF" class="getvcode" :class="{ forhidden: readonly }" @click="getVcode">{{ codeText }}</view> | |
| 121 | - </view> | |
| 122 | - <view class="u-flex item-phone"> | |
| 123 | - <view class="phone-hide">手机验证码登录</view> | |
| 124 | - <view class="bind-phone-text" @click="bindAccountFunc">账号绑定</view> | |
| 125 | - </view> | |
| 126 | - </view> | |
| 127 | - <view class="bottom-content"> | |
| 128 | - <view class="u-flex content"> | |
| 129 | - <view class="cancel"><u-button @click="show = false" type="info" shape="circle" text="取消"></u-button></view> | |
| 130 | - <view class="confrim"><u-button @click="bindConfirm" type="primary" shape="circle" text="确认"></u-button></view> | |
| 131 | - </view> | |
| 132 | - </view> | |
| 133 | - </u-modal> | |
| 134 | - </view> | |
| 135 | - <!-- 退出登录 --> | |
| 136 | - <view> | |
| 137 | - <u-popup bgColor="transparent" :overlay="true" :show="showLogout" mode="bottom"> | |
| 138 | - <view class="u-flex logout-main"> | |
| 139 | - <view class="main"><text style="color:#999999">确定要退出当前账号?</text></view> | |
| 140 | - <view @click="logoutBtn" class="main"><text style="color:#f95e5a">退出登录</text></view> | |
| 141 | - <view class="main"><text @click="closeLogout" style="color:#3478f7">取消</text></view> | |
| 142 | - </view> | |
| 143 | - </u-popup> | |
| 144 | - </view> | |
| 145 | - <!-- 退出登录 --> | |
| 146 | - <f-tabbar></f-tabbar> | |
| 147 | - </view> | |
| 2 | + <view class="personal"> | |
| 3 | + <!-- 公共组件-每个页面必须引入 --> | |
| 4 | + <public-module></public-module> | |
| 5 | + <view class="headBox"> | |
| 6 | + <!-- #ifdef MP --> | |
| 7 | + <!-- 登录 --> | |
| 8 | + <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30"> | |
| 9 | + <block v-if="userInfo.isToken"> | |
| 10 | + <view @click="openPersonalInfo" class="u-m-r-20" | |
| 11 | + ><image | |
| 12 | + class="avatar" | |
| 13 | + mode="aspectFill" | |
| 14 | + :src="userInfo.avatar || '/static/default.png'" | |
| 15 | + ></image | |
| 16 | + ></view> | |
| 17 | + <view @click="openPersonalInfo" class="u-flex-1"> | |
| 18 | + <view class="nickName u-flex"> | |
| 19 | + <view class="name u-m-r-10" v-if="userInfo.realName"> | |
| 20 | + <text style="#FFFFFF;font-size: 18px;">{{ | |
| 21 | + userInfo.realName | |
| 22 | + }}</text> | |
| 23 | + </view> | |
| 24 | + </view> | |
| 25 | + <view style="#FFFFFF;font-size: 14px;" v-if="userInfo.phoneNumber" | |
| 26 | + >手机号:{{ userInfo.phoneNumber | phone }}</view | |
| 27 | + > | |
| 28 | + <view v-else | |
| 29 | + ><text style="#FFFFFF;font-size: 14px;">手机号:未绑定</text></view | |
| 30 | + > | |
| 31 | + </view> | |
| 32 | + </block> | |
| 33 | + <block v-else> | |
| 34 | + <view class="u-m-r-20"> | |
| 35 | + <view class="avatar u-flex" | |
| 36 | + ><u-icon name="account-fill" color="black" size="30"></u-icon | |
| 37 | + ></view> | |
| 38 | + </view> | |
| 39 | + <view class="u-flex-1"> | |
| 40 | + <view @click="openLoginFunc" class="u-font-lg click-login" | |
| 41 | + >请点击登录</view | |
| 42 | + > | |
| 43 | + <view @click="clickAccountFunc" class="detail" | |
| 44 | + ><text class="text">绑定账号</text></view | |
| 45 | + > | |
| 46 | + </view> | |
| 47 | + </block> | |
| 48 | + <view | |
| 49 | + ><u-icon name="arrow-right" color="black" size="13"></u-icon | |
| 50 | + ></view> | |
| 51 | + </view> | |
| 52 | + <!-- #endif --> | |
| 53 | + <!-- #ifndef MP --> | |
| 54 | + <!-- 登录 --> | |
| 55 | + <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30"> | |
| 56 | + <block v-if="userInfo.isToken"> | |
| 57 | + <view @click="openPersonalInfo" class="u-m-r-20" | |
| 58 | + ><image | |
| 59 | + class="avatar" | |
| 60 | + mode="aspectFill" | |
| 61 | + :src="userInfo.avatar || '/static/default.png'" | |
| 62 | + ></image | |
| 63 | + ></view> | |
| 64 | + <view @click="openPersonalInfo" class="u-flex-1"> | |
| 65 | + <view class="nickName u-flex"> | |
| 66 | + <view class="name u-m-r-10" v-if="userInfo.realName"> | |
| 67 | + <text style="#FFFFFF;font-size: 18px;">{{ | |
| 68 | + userInfo.realName | |
| 69 | + }}</text> | |
| 70 | + </view> | |
| 71 | + </view> | |
| 72 | + <view style="#FFFFFF;font-size: 14px;" v-if="userInfo.phoneNumber" | |
| 73 | + >手机号:{{ userInfo.phoneNumber | phone }}</view | |
| 74 | + > | |
| 75 | + <view v-else | |
| 76 | + ><text style="#FFFFFF;font-size: 14px;">手机号:未绑定</text></view | |
| 77 | + > | |
| 78 | + </view> | |
| 79 | + </block> | |
| 80 | + <block v-else> | |
| 81 | + <view class="u-m-r-20"> | |
| 82 | + <view class="avatar u-flex" style="justify-content: center" | |
| 83 | + ><u-icon name="account-fill" color="black" size="30"></u-icon | |
| 84 | + ></view> | |
| 85 | + </view> | |
| 86 | + <view class="u-flex-1"> | |
| 87 | + <view | |
| 88 | + @click="openLoginFunc" | |
| 89 | + class="u-font-lg" | |
| 90 | + style="color: black; font-weight: bold" | |
| 91 | + >登录</view | |
| 92 | + > | |
| 93 | + <view @click="clickAccountFunc" style="color: black" class="detail" | |
| 94 | + >绑定账号</view | |
| 95 | + > | |
| 96 | + </view> | |
| 97 | + </block> | |
| 98 | + <view | |
| 99 | + ><u-icon name="arrow-right" color="black" size="13"></u-icon | |
| 100 | + ></view> | |
| 101 | + </view> | |
| 102 | + <!-- #endif --> | |
| 103 | + </view> | |
| 104 | + <view class="u-flex my-nav"> | |
| 105 | + <view class="nav-main"> | |
| 106 | + <view | |
| 107 | + @click="onTokenJump('/sysNotifySubPage/sysNotifyPage/systemNotify')" | |
| 108 | + class="u-flex nav-link" | |
| 109 | + > | |
| 110 | + <view class="nav-image" | |
| 111 | + ><image class="image" src="../../static/sys-not.png"></image | |
| 112 | + ></view> | |
| 113 | + <view class="nav-center"><text class="text">系统通知</text></view> | |
| 114 | + <view class="nav-right" | |
| 115 | + ><image class="image" src="../../static/arrow-right.png"></image | |
| 116 | + ></view> | |
| 117 | + </view> | |
| 118 | + <view | |
| 119 | + @click="onTokenJump('/feedBackSubPage/feedback/feedback')" | |
| 120 | + class="u-flex nav-link" | |
| 121 | + > | |
| 122 | + <view class="nav-image" | |
| 123 | + ><image class="image" src="../../static/find-sugg.png"></image | |
| 124 | + ></view> | |
| 125 | + <view class="nav-center"><text class="text">意见反馈</text></view> | |
| 126 | + <view class="nav-right" | |
| 127 | + ><image class="image" src="../../static/arrow-right.png"></image | |
| 128 | + ></view> | |
| 129 | + </view> | |
| 130 | + </view> | |
| 131 | + <view | |
| 132 | + v-if="userInfo.isToken" | |
| 133 | + class="u-flex" | |
| 134 | + style="justify-content: center; width: 600rpx" | |
| 135 | + > | |
| 136 | + <u-button | |
| 137 | + @click="onLoginoutFunc" | |
| 138 | + type="primary" | |
| 139 | + shape="circle" | |
| 140 | + text="退出账号" | |
| 141 | + ></u-button> | |
| 142 | + </view> | |
| 143 | + </view> | |
| 144 | + <!-- 绑定账号 --> | |
| 145 | + <view> | |
| 146 | + <u-modal :showConfirmButton="false" :show="show" :title="title"> | |
| 147 | + <view v-if="!bindPhone" class="loginPhone"> | |
| 148 | + <view class="form-row" | |
| 149 | + ><u--input | |
| 150 | + shape="circle" | |
| 151 | + class="input" | |
| 152 | + prefixIcon="account-fill" | |
| 153 | + type="text" | |
| 154 | + placeholder="登录账号" | |
| 155 | + v-model="account" | |
| 156 | + ></u--input | |
| 157 | + ></view> | |
| 158 | + <view class="form-row item-bind"> | |
| 159 | + <u--input | |
| 160 | + class="input" | |
| 161 | + shape="circle" | |
| 162 | + prefixIcon="lock-fill" | |
| 163 | + suffixIconStyle="color: #909399" | |
| 164 | + type="password" | |
| 165 | + placeholder="登录密码" | |
| 166 | + v-model="password" | |
| 167 | + @change="passwordChange" | |
| 168 | + ></u--input> | |
| 169 | + </view> | |
| 170 | + <view class="u-flex item-phone"> | |
| 171 | + <view class="phone-hide">手机验证码登录</view> | |
| 172 | + <view class="bind-phone-text" @click="bindPhoneFunc">手机绑定</view> | |
| 173 | + </view> | |
| 174 | + </view> | |
| 175 | + <view v-else class="loginPhone"> | |
| 176 | + <view class="form-row"> | |
| 177 | + <u--input | |
| 178 | + shape="circle" | |
| 179 | + class="input" | |
| 180 | + type="text" | |
| 181 | + v-model="phone" | |
| 182 | + placeholder="请输入手机号码" | |
| 183 | + placeholder-style="font-weight:normal;color:#bbbbbb;" | |
| 184 | + ></u--input> | |
| 185 | + </view> | |
| 186 | + <view class="form-row row-top"> | |
| 187 | + <u--input | |
| 188 | + shape="circle" | |
| 189 | + class="input" | |
| 190 | + type="text" | |
| 191 | + v-model="vCode" | |
| 192 | + placeholder="请输入验证码" | |
| 193 | + placeholder-style="font-weight:normal;color:#bbbbbb;" | |
| 194 | + ></u--input> | |
| 195 | + <view | |
| 196 | + style="color: #377dff" | |
| 197 | + class="getvcode" | |
| 198 | + :class="{ forhidden: readonly }" | |
| 199 | + @click="getVcode" | |
| 200 | + >{{ codeText }}</view | |
| 201 | + > | |
| 202 | + </view> | |
| 203 | + <view class="u-flex item-phone"> | |
| 204 | + <view class="phone-hide">手机验证码登录</view> | |
| 205 | + <view class="bind-phone-text" @click="bindAccountFunc" | |
| 206 | + >账号绑定</view | |
| 207 | + > | |
| 208 | + </view> | |
| 209 | + </view> | |
| 210 | + <view class="bottom-content"> | |
| 211 | + <view class="u-flex content"> | |
| 212 | + <view class="cancel" | |
| 213 | + ><u-button | |
| 214 | + @click="show = false" | |
| 215 | + type="info" | |
| 216 | + shape="circle" | |
| 217 | + text="取消" | |
| 218 | + ></u-button | |
| 219 | + ></view> | |
| 220 | + <view class="confrim" | |
| 221 | + ><u-button | |
| 222 | + @click="bindConfirm" | |
| 223 | + type="primary" | |
| 224 | + shape="circle" | |
| 225 | + text="确认" | |
| 226 | + ></u-button | |
| 227 | + ></view> | |
| 228 | + </view> | |
| 229 | + </view> | |
| 230 | + </u-modal> | |
| 231 | + </view> | |
| 232 | + <!-- 退出登录 --> | |
| 233 | + <view> | |
| 234 | + <u-popup | |
| 235 | + bgColor="transparent" | |
| 236 | + :overlay="true" | |
| 237 | + :show="showLogout" | |
| 238 | + mode="bottom" | |
| 239 | + > | |
| 240 | + <view class="u-flex logout-main"> | |
| 241 | + <view class="main" | |
| 242 | + ><text style="color: #999999">确定要退出当前账号?</text></view | |
| 243 | + > | |
| 244 | + <view @click="logoutBtn" class="main" | |
| 245 | + ><text style="color: #f95e5a">退出登录</text></view | |
| 246 | + > | |
| 247 | + <view class="main" | |
| 248 | + ><text @click="closeLogout" style="color: #3478f7">取消</text></view | |
| 249 | + > | |
| 250 | + </view> | |
| 251 | + </u-popup> | |
| 252 | + </view> | |
| 253 | + <!-- 退出登录 --> | |
| 254 | + <f-tabbar></f-tabbar> | |
| 255 | + </view> | |
| 148 | 256 | </template> |
| 149 | 257 | |
| 150 | 258 | <script> |
| 151 | 259 | var clear; |
| 152 | -import base from '@/config/baseUrl'; | |
| 153 | -import fTabbar from '@/components/module/f-tabbar/f-tabbar'; | |
| 154 | -import fNavbar from '@/components/module/f-navbar/f-navbar'; | |
| 155 | -import { mapState, mapMutations } from 'vuex'; | |
| 260 | +import base from "@/config/baseUrl"; | |
| 261 | +import fTabbar from "@/components/module/f-tabbar/f-tabbar"; | |
| 262 | +import fNavbar from "@/components/module/f-navbar/f-navbar"; | |
| 263 | +import { mapState, mapMutations } from "vuex"; | |
| 156 | 264 | |
| 157 | 265 | export default { |
| 158 | - components: { | |
| 159 | - fTabbar, | |
| 160 | - fNavbar | |
| 161 | - }, | |
| 162 | - data() { | |
| 163 | - return { | |
| 164 | - PrimaryColor: '#0079fe', //主题色 | |
| 165 | - showLogout: false, | |
| 166 | - readonly: false, | |
| 167 | - codeText: '获取验证码', | |
| 168 | - phone: '', //号码 | |
| 169 | - vCode: '', //验证码 | |
| 170 | - tips: '验证码', | |
| 171 | - bindPhone: false, | |
| 172 | - show: false, | |
| 173 | - title: '绑定账号', | |
| 174 | - systemInfo: base.systemInfo, | |
| 175 | - PrimaryButtonColor: '#0079fe', //主题色 | |
| 176 | - }; | |
| 177 | - }, | |
| 178 | - onLoad() { | |
| 179 | - // 隐藏原生的tabbar | |
| 180 | - uni.hideTabBar(); | |
| 181 | - }, | |
| 182 | - computed: { | |
| 183 | - ...mapState(['userInfo']) | |
| 184 | - }, | |
| 185 | - methods: { | |
| 186 | - ...mapMutations(['emptyUserInfo']), | |
| 187 | - // 跳转前判断登录 | |
| 188 | - onTokenJump(url) { | |
| 189 | - this.judgeLogin(() => { | |
| 190 | - uni.navigateTo({ | |
| 191 | - url: url | |
| 192 | - }); | |
| 193 | - }); | |
| 194 | - }, | |
| 195 | - onJump(url) { | |
| 196 | - uni.navigateTo({ | |
| 197 | - url: url | |
| 198 | - }); | |
| 199 | - }, | |
| 200 | - openLoginFunc() { | |
| 201 | - uni.navigateTo({ | |
| 202 | - url: '/publicLoginSubPage/public/login' | |
| 203 | - }); | |
| 204 | - }, | |
| 205 | - openPersonalInfo() { | |
| 206 | - let obj = { | |
| 207 | - data: this.userInfo | |
| 208 | - }; | |
| 209 | - uni.navigateTo({ | |
| 210 | - url: '/publicLoginSubPage/other/set?data=' + JSON.stringify(obj) | |
| 211 | - }); | |
| 212 | - }, | |
| 213 | - clickAccountFunc() { | |
| 214 | - this.show = true; | |
| 215 | - }, | |
| 216 | - bindConfirm() {}, | |
| 217 | - bindPhoneFunc() { | |
| 218 | - this.bindPhone = true; | |
| 219 | - }, | |
| 220 | - bindAccountFunc() { | |
| 221 | - this.bindPhone = false; | |
| 222 | - }, | |
| 223 | - //验证码按钮文字状态 | |
| 224 | - getCodeState() { | |
| 225 | - const _this = this; | |
| 226 | - this.readonly = true; | |
| 227 | - this.codeText = '60S后重新获取'; | |
| 228 | - var s = 60; | |
| 229 | - clear = setInterval(() => { | |
| 230 | - s--; | |
| 231 | - _this.codeText = s + 'S后重新获取'; | |
| 232 | - if (s <= 0) { | |
| 233 | - clearInterval(clear); | |
| 234 | - _this.codeText = '获取验证码'; | |
| 235 | - _this.readonly = false; | |
| 236 | - } | |
| 237 | - }, 1000); | |
| 238 | - }, | |
| 239 | - //获取验证码 | |
| 240 | - getVcode() { | |
| 241 | - console.log('getVcode'); | |
| 242 | - if (this.readonly) { | |
| 243 | - uni.showToast({ | |
| 244 | - title: '验证码已发送~', | |
| 245 | - icon: 'none' | |
| 246 | - }); | |
| 247 | - return; | |
| 248 | - } | |
| 249 | - if (this.phone == '') { | |
| 250 | - uni.showToast({ | |
| 251 | - title: '请输入手机号~', | |
| 252 | - icon: 'none' | |
| 253 | - }); | |
| 254 | - return; | |
| 255 | - } | |
| 256 | - const phoneRegular = /^1\d{10}$/; | |
| 257 | - if (!phoneRegular.test(this.phone)) { | |
| 258 | - uni.showToast({ | |
| 259 | - title: '手机号格式不正确~', | |
| 260 | - icon: 'none' | |
| 261 | - }); | |
| 262 | - return; | |
| 263 | - } | |
| 264 | - let httpData = {}; | |
| 265 | - // 获取验证码接口 | |
| 266 | - // uni.$u.http.post('您的接口', httpData).then(res => { | |
| 267 | - this.getCodeState(); //开始倒计时 | |
| 268 | - // }) | |
| 269 | - }, | |
| 270 | - onLoginoutFunc() { | |
| 271 | - this.showLogout = true; | |
| 272 | - }, | |
| 273 | - closeLogout() { | |
| 274 | - this.showLogout = false; | |
| 275 | - }, | |
| 276 | - logoutBtn() { | |
| 277 | - let that = this; | |
| 278 | - uni.showModal({ | |
| 279 | - title: '退出登录', | |
| 280 | - content: '你确定退出登录吗?', | |
| 281 | - success(res) { | |
| 282 | - if (res.confirm) { | |
| 283 | - that.emptyUserInfo(); | |
| 284 | - that.showLogout = false; | |
| 285 | - setTimeout(() => { | |
| 286 | - uni.navigateTo({ | |
| 287 | - url: '/publicLoginSubPage/public/login' | |
| 288 | - }); | |
| 289 | - }, 500); | |
| 290 | - } else if (res.cancel) { | |
| 291 | - } | |
| 292 | - } | |
| 293 | - }); | |
| 294 | - } | |
| 295 | - } | |
| 266 | + components: { | |
| 267 | + fTabbar, | |
| 268 | + fNavbar, | |
| 269 | + }, | |
| 270 | + data() { | |
| 271 | + return { | |
| 272 | + PrimaryColor: "#0079fe", //主题色 | |
| 273 | + showLogout: false, | |
| 274 | + readonly: false, | |
| 275 | + codeText: "获取验证码", | |
| 276 | + phone: "", //号码 | |
| 277 | + vCode: "", //验证码 | |
| 278 | + tips: "验证码", | |
| 279 | + bindPhone: false, | |
| 280 | + show: false, | |
| 281 | + title: "绑定账号", | |
| 282 | + systemInfo: base.systemInfo, | |
| 283 | + PrimaryButtonColor: "#0079fe", //主题色 | |
| 284 | + }; | |
| 285 | + }, | |
| 286 | + onLoad() { | |
| 287 | + // 隐藏原生的tabbar | |
| 288 | + uni.hideTabBar(); | |
| 289 | + }, | |
| 290 | + computed: { | |
| 291 | + ...mapState(["userInfo"]), | |
| 292 | + }, | |
| 293 | + methods: { | |
| 294 | + ...mapMutations(["emptyUserInfo"]), | |
| 295 | + // 跳转前判断登录 | |
| 296 | + onTokenJump(url) { | |
| 297 | + this.judgeLogin(() => { | |
| 298 | + uni.navigateTo({ | |
| 299 | + url: url, | |
| 300 | + }); | |
| 301 | + }); | |
| 302 | + }, | |
| 303 | + onJump(url) { | |
| 304 | + uni.navigateTo({ | |
| 305 | + url: url, | |
| 306 | + }); | |
| 307 | + }, | |
| 308 | + openLoginFunc() { | |
| 309 | + uni.navigateTo({ | |
| 310 | + url: "/publicLoginSubPage/public/login", | |
| 311 | + }); | |
| 312 | + }, | |
| 313 | + openPersonalInfo() { | |
| 314 | + let obj = { | |
| 315 | + data: this.userInfo, | |
| 316 | + }; | |
| 317 | + uni.navigateTo({ | |
| 318 | + url: "/publicLoginSubPage/other/set?data=" + JSON.stringify(obj), | |
| 319 | + }); | |
| 320 | + }, | |
| 321 | + clickAccountFunc() { | |
| 322 | + this.show = true; | |
| 323 | + }, | |
| 324 | + bindConfirm() {}, | |
| 325 | + bindPhoneFunc() { | |
| 326 | + this.bindPhone = true; | |
| 327 | + }, | |
| 328 | + bindAccountFunc() { | |
| 329 | + this.bindPhone = false; | |
| 330 | + }, | |
| 331 | + //验证码按钮文字状态 | |
| 332 | + getCodeState() { | |
| 333 | + const _this = this; | |
| 334 | + this.readonly = true; | |
| 335 | + this.codeText = "60S后重新获取"; | |
| 336 | + var s = 60; | |
| 337 | + clear = setInterval(() => { | |
| 338 | + s--; | |
| 339 | + _this.codeText = s + "S后重新获取"; | |
| 340 | + if (s <= 0) { | |
| 341 | + clearInterval(clear); | |
| 342 | + _this.codeText = "获取验证码"; | |
| 343 | + _this.readonly = false; | |
| 344 | + } | |
| 345 | + }, 1000); | |
| 346 | + }, | |
| 347 | + //获取验证码 | |
| 348 | + getVcode() { | |
| 349 | + console.log("getVcode"); | |
| 350 | + if (this.readonly) { | |
| 351 | + uni.showToast({ | |
| 352 | + title: "验证码已发送~", | |
| 353 | + icon: "none", | |
| 354 | + }); | |
| 355 | + return; | |
| 356 | + } | |
| 357 | + if (this.phone == "") { | |
| 358 | + uni.showToast({ | |
| 359 | + title: "请输入手机号~", | |
| 360 | + icon: "none", | |
| 361 | + }); | |
| 362 | + return; | |
| 363 | + } | |
| 364 | + const phoneRegular = /^1\d{10}$/; | |
| 365 | + if (!phoneRegular.test(this.phone)) { | |
| 366 | + uni.showToast({ | |
| 367 | + title: "手机号格式不正确~", | |
| 368 | + icon: "none", | |
| 369 | + }); | |
| 370 | + return; | |
| 371 | + } | |
| 372 | + let httpData = {}; | |
| 373 | + // 获取验证码接口 | |
| 374 | + // uni.$u.http.post('您的接口', httpData).then(res => { | |
| 375 | + this.getCodeState(); //开始倒计时 | |
| 376 | + // }) | |
| 377 | + }, | |
| 378 | + onLoginoutFunc() { | |
| 379 | + this.showLogout = true; | |
| 380 | + }, | |
| 381 | + closeLogout() { | |
| 382 | + this.showLogout = false; | |
| 383 | + }, | |
| 384 | + logoutBtn() { | |
| 385 | + let that = this; | |
| 386 | + uni.showModal({ | |
| 387 | + title: "退出登录", | |
| 388 | + content: "你确定退出登录吗?", | |
| 389 | + success(res) { | |
| 390 | + if (res.confirm) { | |
| 391 | + that.emptyUserInfo(); | |
| 392 | + that.showLogout = false; | |
| 393 | + setTimeout(() => { | |
| 394 | + uni.navigateTo({ | |
| 395 | + url: "/publicLoginSubPage/public/login", | |
| 396 | + }); | |
| 397 | + }, 500); | |
| 398 | + } else if (res.cancel) { | |
| 399 | + } | |
| 400 | + }, | |
| 401 | + }); | |
| 402 | + }, | |
| 403 | + }, | |
| 296 | 404 | }; |
| 297 | 405 | </script> |
| 298 | 406 | |
| 299 | 407 | <style lang="scss" scoped> |
| 300 | -@import './static/personal.scss'; | |
| 408 | +@import "./static/personal.scss"; | |
| 301 | 409 | </style> | ... | ... |
| ... | ... | @@ -137,18 +137,13 @@ |
| 137 | 137 | uni.showToast({ |
| 138 | 138 | title: '登录成功~', |
| 139 | 139 | icon: 'none' |
| 140 | + }).then(res => { | |
| 141 | + uni.reLaunch({ | |
| 142 | + url: '/pages/personal/personal' | |
| 143 | + }); | |
| 140 | 144 | }); |
| 141 | 145 | this.saveUserInfo(); |
| 142 | - // #ifndef MP | |
| 143 | - uni.switchTab({ | |
| 144 | - url: './personal' | |
| 145 | - }); | |
| 146 | - // #endif | |
| 147 | - // #ifdef MP | |
| 148 | - uni.switchTab({ | |
| 149 | - url: './personal' | |
| 150 | - }); | |
| 151 | - // #endif | |
| 146 | + | |
| 152 | 147 | } |
| 153 | 148 | }); |
| 154 | 149 | }, | ... | ... |
| ... | ... | @@ -3,7 +3,7 @@ |
| 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/default-avatar.png'"></image></view> | |
| 6 | + <view class="main-image"><image class="image" :src="avatar || '/static/default.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> | ... | ... |
static/default.png
0 → 100644
8.23 KB
| ... | ... | @@ -4,15 +4,7 @@ |
| 4 | 4 | <public-module></public-module> |
| 5 | 5 | <view> |
| 6 | 6 | <u--form labelPosition="left" :model="model1" :rules="rules" ref="form1"> |
| 7 | - <u-form-item | |
| 8 | - label="类型" | |
| 9 | - prop="userInfo.sex" | |
| 10 | - @click=" | |
| 11 | - showType = true; | |
| 12 | - hideKeyboard(); | |
| 13 | - " | |
| 14 | - ref="item1" | |
| 15 | - > | |
| 7 | + <u-form-item label="类型" prop="userInfo.sex" @click="openTypeClick" ref="item1"> | |
| 16 | 8 | <u--input v-model="model1.userInfo.type" placeholder="请选择类型" border="surround"></u--input> |
| 17 | 9 | <u-icon slot="right" name="arrow-right"></u-icon> |
| 18 | 10 | </u-form-item> |
| ... | ... | @@ -85,18 +77,27 @@ export default { |
| 85 | 77 | onLoad(e) { |
| 86 | 78 | // 隐藏原生的tabbar |
| 87 | 79 | uni.hideTabBar(); |
| 80 | + this.stop(); | |
| 88 | 81 | }, |
| 89 | 82 | methods: { |
| 90 | - typeSelect(e) { | |
| 91 | - this.model1.userInfo.type = e.name; | |
| 92 | - this.loadData(1, e.value); | |
| 83 | + stop() { | |
| 84 | + let interval = setInterval(function() { | |
| 85 | + uni.hideKeyboard(); //隐藏软键盘 | |
| 86 | + console.log('刷新'); | |
| 87 | + }, 20); | |
| 93 | 88 | setTimeout(() => { |
| 94 | - uni.hideKeyboard(); | |
| 95 | - }, 10); | |
| 89 | + clearInterval(interval); | |
| 90 | + console.log('停止刷新'); | |
| 91 | + }, 3000); | |
| 96 | 92 | }, |
| 97 | - hideKeyboard() { | |
| 93 | + openTypeClick() { | |
| 94 | + this.showType = true; | |
| 98 | 95 | uni.hideKeyboard(); |
| 99 | 96 | }, |
| 97 | + typeSelect(e) { | |
| 98 | + this.model1.userInfo.type = e.name; | |
| 99 | + this.loadData(1, e.value); | |
| 100 | + }, | |
| 100 | 101 | /*下拉刷新的回调 */ |
| 101 | 102 | downCallback() { |
| 102 | 103 | //联网加载数据 | ... | ... |
uni_modules/zhouWei-APPUpdate/changelog.md
0 → 100644
| 1 | +// #ifdef APP-PLUS | |
| 2 | +import componentConfig from "@/config/componentConfig" | |
| 3 | +const platform = uni.getSystemInfoSync().platform; | |
| 4 | +// 主颜色 | |
| 5 | +const $mainColor = componentConfig.appUpdateColor ? componentConfig.appUpdateColor : "FF5B78"; | |
| 6 | +// 弹窗图标url | |
| 7 | +const $iconUrl = componentConfig.appUpdateIcon ? componentConfig.appUpdateIcon : "/uni_modules/zhouWei-APPUpdate/static/ic_ar.png"; | |
| 8 | + | |
| 9 | +// 获取当前应用的版本号 | |
| 10 | +export const getCurrentNo = function(callback) { | |
| 11 | + // 获取本地应用资源版本号 | |
| 12 | + plus.runtime.getProperty(plus.runtime.appid, function(inf) { | |
| 13 | + callback && callback({ | |
| 14 | + versionCode: inf.versionCode, | |
| 15 | + versionName: inf.version | |
| 16 | + }); | |
| 17 | + }); | |
| 18 | +} | |
| 19 | +// 从服务器下载应用资源包(wgt文件) | |
| 20 | +const getDownload = function(data) { | |
| 21 | + let dtask; | |
| 22 | + if(data.updateType == 'forcibly' || data.updateType == 'solicit'){ | |
| 23 | + let popupData = { | |
| 24 | + progress: true, | |
| 25 | + buttonNum: 2 | |
| 26 | + }; | |
| 27 | + if(data.updateType == 'forcibly'){ | |
| 28 | + popupData.buttonNum = 0; | |
| 29 | + } | |
| 30 | + let lastProgressValue = 0; | |
| 31 | + let popupObj = downloadPopup(popupData); | |
| 32 | + dtask = plus.downloader.createDownload(data.downloadUrl, { | |
| 33 | + filename: "_doc/update/" | |
| 34 | + }, function(download, status) { | |
| 35 | + if (status == 200) { | |
| 36 | + popupObj.change({ | |
| 37 | + progressValue: 100, | |
| 38 | + progressTip:"正在安装文件...", | |
| 39 | + progress: true, | |
| 40 | + buttonNum: 0 | |
| 41 | + }); | |
| 42 | + plus.runtime.install(download.filename, {}, function() { | |
| 43 | + popupObj.change({ | |
| 44 | + contentText: "应用资源更新完成!", | |
| 45 | + buttonNum: 1, | |
| 46 | + progress: false | |
| 47 | + }); | |
| 48 | + }, function(e) { | |
| 49 | + popupObj.cancel(); | |
| 50 | + plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message); | |
| 51 | + }); | |
| 52 | + } else { | |
| 53 | + popupObj.change({ | |
| 54 | + contentText: "文件下载失败...", | |
| 55 | + buttonNum: 1, | |
| 56 | + progress: false | |
| 57 | + }); | |
| 58 | + } | |
| 59 | + }); | |
| 60 | + dtask.start(); | |
| 61 | + dtask.addEventListener("statechanged", function(task, status) { | |
| 62 | + switch (task.state) { | |
| 63 | + case 1: // 开始 | |
| 64 | + popupObj.change({ | |
| 65 | + progressValue:0, | |
| 66 | + progressTip:"准备下载...", | |
| 67 | + progress: true | |
| 68 | + }); | |
| 69 | + break; | |
| 70 | + case 2: // 已连接到服务器 | |
| 71 | + popupObj.change({ | |
| 72 | + progressValue:0, | |
| 73 | + progressTip:"开始下载...", | |
| 74 | + progress: true | |
| 75 | + }); | |
| 76 | + break; | |
| 77 | + case 3: | |
| 78 | + const progress = parseInt(task.downloadedSize / task.totalSize * 100); | |
| 79 | + if(progress - lastProgressValue >= 2){ | |
| 80 | + lastProgressValue = progress; | |
| 81 | + popupObj.change({ | |
| 82 | + progressValue:progress, | |
| 83 | + progressTip: "已下载" + progress + "%", | |
| 84 | + progress: true | |
| 85 | + }); | |
| 86 | + } | |
| 87 | + break; | |
| 88 | + } | |
| 89 | + }); | |
| 90 | + // 取消下载 | |
| 91 | + popupObj.cancelDownload = function(){ | |
| 92 | + dtask && dtask.abort(); | |
| 93 | + uni.showToast({ | |
| 94 | + title: "已取消下载", | |
| 95 | + icon:"none" | |
| 96 | + }); | |
| 97 | + } | |
| 98 | + // 重启APP | |
| 99 | + popupObj.reboot = function(){ | |
| 100 | + plus.runtime.restart(); | |
| 101 | + } | |
| 102 | + } else if(data.updateType == "silent"){ | |
| 103 | + dtask = plus.downloader.createDownload(data.downloadUrl, { | |
| 104 | + filename: "_doc/update/" | |
| 105 | + }, function(download, status) { | |
| 106 | + if (status == 200) { | |
| 107 | + plus.runtime.install(download.filename, {}, function() { | |
| 108 | + console.log("应用资源更新完成"); | |
| 109 | + }, function(e) { | |
| 110 | + plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message); | |
| 111 | + }); | |
| 112 | + } else { | |
| 113 | + plus.nativeUI.alert("文件下载失败..."); | |
| 114 | + } | |
| 115 | + }); | |
| 116 | + dtask.start(); | |
| 117 | + } | |
| 118 | +} | |
| 119 | +// 文字换行 | |
| 120 | +function drawtext(text, maxWidth) { | |
| 121 | + let textArr = text.split(""); | |
| 122 | + let len = textArr.length; | |
| 123 | + // 上个节点 | |
| 124 | + let previousNode = 0; | |
| 125 | + // 记录节点宽度 | |
| 126 | + let nodeWidth = 0; | |
| 127 | + // 文本换行数组 | |
| 128 | + let rowText = []; | |
| 129 | + // 如果是字母,侧保存长度 | |
| 130 | + let letterWidth = 0; | |
| 131 | + // 汉字宽度 | |
| 132 | + let chineseWidth = 14; | |
| 133 | + // otherFont宽度 | |
| 134 | + let otherWidth = 7; | |
| 135 | + for (let i = 0; i < len; i++) { | |
| 136 | + if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) { | |
| 137 | + if(letterWidth > 0){ | |
| 138 | + if(nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth){ | |
| 139 | + rowText.push({ | |
| 140 | + type: "text", | |
| 141 | + content: text.substring(previousNode, i) | |
| 142 | + }); | |
| 143 | + previousNode = i; | |
| 144 | + nodeWidth = chineseWidth; | |
| 145 | + letterWidth = 0; | |
| 146 | + } else { | |
| 147 | + nodeWidth += chineseWidth + letterWidth * otherWidth; | |
| 148 | + letterWidth = 0; | |
| 149 | + } | |
| 150 | + } else { | |
| 151 | + if(nodeWidth + chineseWidth > maxWidth){ | |
| 152 | + rowText.push({ | |
| 153 | + type: "text", | |
| 154 | + content: text.substring(previousNode, i) | |
| 155 | + }); | |
| 156 | + previousNode = i; | |
| 157 | + nodeWidth = chineseWidth; | |
| 158 | + }else{ | |
| 159 | + nodeWidth += chineseWidth; | |
| 160 | + } | |
| 161 | + } | |
| 162 | + } else { | |
| 163 | + if(/\n/g.test(textArr[i])){ | |
| 164 | + rowText.push({ | |
| 165 | + type: "break", | |
| 166 | + content: text.substring(previousNode, i) | |
| 167 | + }); | |
| 168 | + previousNode = i + 1; | |
| 169 | + nodeWidth = 0; | |
| 170 | + letterWidth = 0; | |
| 171 | + }else if(textArr[i] == "\\" && textArr[i + 1] == "n"){ | |
| 172 | + rowText.push({ | |
| 173 | + type: "break", | |
| 174 | + content: text.substring(previousNode, i) | |
| 175 | + }); | |
| 176 | + previousNode = i + 2; | |
| 177 | + nodeWidth = 0; | |
| 178 | + letterWidth = 0; | |
| 179 | + }else if(/[a-zA-Z0-9]/g.test(textArr[i])){ | |
| 180 | + letterWidth += 1; | |
| 181 | + if(nodeWidth + letterWidth * otherWidth > maxWidth){ | |
| 182 | + rowText.push({ | |
| 183 | + type: "text", | |
| 184 | + content: text.substring(previousNode, i + 1 - letterWidth) | |
| 185 | + }); | |
| 186 | + previousNode = i + 1 - letterWidth; | |
| 187 | + nodeWidth = letterWidth * otherWidth; | |
| 188 | + letterWidth = 0; | |
| 189 | + } | |
| 190 | + } else{ | |
| 191 | + if(nodeWidth + otherWidth > maxWidth){ | |
| 192 | + rowText.push({ | |
| 193 | + type: "text", | |
| 194 | + content: text.substring(previousNode, i) | |
| 195 | + }); | |
| 196 | + previousNode = i; | |
| 197 | + nodeWidth = otherWidth; | |
| 198 | + }else{ | |
| 199 | + nodeWidth += otherWidth; | |
| 200 | + } | |
| 201 | + } | |
| 202 | + } | |
| 203 | + } | |
| 204 | + if (previousNode < len) { | |
| 205 | + rowText.push({ | |
| 206 | + type: "text", | |
| 207 | + content: text.substring(previousNode, len) | |
| 208 | + }); | |
| 209 | + } | |
| 210 | + return rowText; | |
| 211 | +} | |
| 212 | +// 是否更新弹窗 | |
| 213 | +function updatePopup(data, callback) { | |
| 214 | + // 弹窗遮罩层 | |
| 215 | + let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层 | |
| 216 | + top: '0px', | |
| 217 | + left: '0px', | |
| 218 | + height: '100%', | |
| 219 | + width: '100%', | |
| 220 | + backgroundColor: 'rgba(0,0,0,0.5)' | |
| 221 | + }); | |
| 222 | + | |
| 223 | + // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 | |
| 224 | + const screenWidth = plus.screen.resolutionWidth; | |
| 225 | + const screenHeight = plus.screen.resolutionHeight; | |
| 226 | + //弹窗容器宽度 | |
| 227 | + const popupViewWidth = screenWidth * 0.7; | |
| 228 | + // 弹窗容器的Padding | |
| 229 | + const viewContentPadding = 20; | |
| 230 | + // 弹窗容器的宽度 | |
| 231 | + const viewContentWidth = parseInt(popupViewWidth - (viewContentPadding * 2)); | |
| 232 | + // 描述的列表 | |
| 233 | + const descriptionList = drawtext(data.versionInfo, viewContentWidth); | |
| 234 | + // 弹窗容器高度 | |
| 235 | + let popupViewHeight = 80 + 20 + 20 + 90 + 10; | |
| 236 | + | |
| 237 | + let popupViewContentList = [{ | |
| 238 | + src: $iconUrl, | |
| 239 | + id: "logo", | |
| 240 | + tag: "img", | |
| 241 | + position: { | |
| 242 | + top: "0px", | |
| 243 | + left: (popupViewWidth - 124) / 2 + "px", | |
| 244 | + width: "124px", | |
| 245 | + height: "80px", | |
| 246 | + } | |
| 247 | + }, | |
| 248 | + { | |
| 249 | + tag: 'font', | |
| 250 | + id: 'title', | |
| 251 | + text: "发现新版本" + data.versionName, | |
| 252 | + textStyles: { | |
| 253 | + size: '18px', | |
| 254 | + color: "#333", | |
| 255 | + weight: "bold", | |
| 256 | + whiteSpace: "normal" | |
| 257 | + }, | |
| 258 | + position: { | |
| 259 | + top: '90px', | |
| 260 | + left: viewContentPadding + "px", | |
| 261 | + width: viewContentWidth + "px", | |
| 262 | + height: "30px", | |
| 263 | + } | |
| 264 | + }]; | |
| 265 | + const textHeight = 18; | |
| 266 | + let contentTop = 130; | |
| 267 | + descriptionList.forEach((item,index) => { | |
| 268 | + if(index > 0){ | |
| 269 | + popupViewHeight += textHeight; | |
| 270 | + contentTop += textHeight; | |
| 271 | + } | |
| 272 | + popupViewContentList.push({ | |
| 273 | + tag: 'font', | |
| 274 | + id: 'content' + index + 1, | |
| 275 | + text: item.content, | |
| 276 | + textStyles: { | |
| 277 | + size: '14px', | |
| 278 | + color: "#666", | |
| 279 | + lineSpacing: "50%", | |
| 280 | + align: "left" | |
| 281 | + }, | |
| 282 | + position: { | |
| 283 | + top: contentTop + "px", | |
| 284 | + left: viewContentPadding + "px", | |
| 285 | + width: viewContentWidth + "px", | |
| 286 | + height: textHeight + "px", | |
| 287 | + } | |
| 288 | + }); | |
| 289 | + if(item.type == "break"){ | |
| 290 | + contentTop += 10; | |
| 291 | + popupViewHeight += 10; | |
| 292 | + } | |
| 293 | + }); | |
| 294 | + | |
| 295 | + if(data.updateType == "forcibly"){ | |
| 296 | + popupViewContentList.push({ | |
| 297 | + tag: 'rect', //绘制底边按钮 | |
| 298 | + rectStyles:{ | |
| 299 | + radius: "6px", | |
| 300 | + color: $mainColor | |
| 301 | + }, | |
| 302 | + position:{ | |
| 303 | + bottom: viewContentPadding + 'px', | |
| 304 | + left: viewContentPadding + "px", | |
| 305 | + width: viewContentWidth + "px", | |
| 306 | + height: "30px" | |
| 307 | + } | |
| 308 | + }); | |
| 309 | + popupViewContentList.push({ | |
| 310 | + tag: 'font', | |
| 311 | + id: 'confirmText', | |
| 312 | + text: "立即升级", | |
| 313 | + textStyles: { | |
| 314 | + size: '14px', | |
| 315 | + color: "#FFF", | |
| 316 | + lineSpacing: "0%", | |
| 317 | + }, | |
| 318 | + position: { | |
| 319 | + bottom: viewContentPadding + 'px', | |
| 320 | + left: viewContentPadding + "px", | |
| 321 | + width: viewContentWidth + "px", | |
| 322 | + height: "30px" | |
| 323 | + } | |
| 324 | + }); | |
| 325 | + } else { | |
| 326 | + // 绘制底边按钮 | |
| 327 | + popupViewContentList.push({ | |
| 328 | + tag: 'rect', | |
| 329 | + id: 'cancelBox', | |
| 330 | + rectStyles: { | |
| 331 | + radius: "3px", | |
| 332 | + borderColor: "#f1f1f1", | |
| 333 | + borderWidth: "1px", | |
| 334 | + }, | |
| 335 | + position: { | |
| 336 | + bottom: viewContentPadding + 'px', | |
| 337 | + left: viewContentPadding + "px", | |
| 338 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 339 | + height: "30px", | |
| 340 | + } | |
| 341 | + }); | |
| 342 | + popupViewContentList.push({ | |
| 343 | + tag: 'rect', | |
| 344 | + id: 'confirmBox', | |
| 345 | + rectStyles: { | |
| 346 | + radius: "3px", | |
| 347 | + color: $mainColor, | |
| 348 | + }, | |
| 349 | + position: { | |
| 350 | + bottom: viewContentPadding + 'px', | |
| 351 | + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", | |
| 352 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 353 | + height: "30px", | |
| 354 | + } | |
| 355 | + }); | |
| 356 | + popupViewContentList.push({ | |
| 357 | + tag: 'font', | |
| 358 | + id: 'cancelText', | |
| 359 | + text: "暂不升级", | |
| 360 | + textStyles: { | |
| 361 | + size: '14px', | |
| 362 | + color: "#666", | |
| 363 | + lineSpacing: "0%", | |
| 364 | + whiteSpace: "normal" | |
| 365 | + }, | |
| 366 | + position: { | |
| 367 | + bottom: viewContentPadding + 'px', | |
| 368 | + left: viewContentPadding + "px", | |
| 369 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 370 | + height: "30px", | |
| 371 | + } | |
| 372 | + }); | |
| 373 | + popupViewContentList.push({ | |
| 374 | + tag: 'font', | |
| 375 | + id: 'confirmText', | |
| 376 | + text: "立即升级", | |
| 377 | + textStyles: { | |
| 378 | + size: '14px', | |
| 379 | + color: "#FFF", | |
| 380 | + lineSpacing: "0%", | |
| 381 | + whiteSpace: "normal" | |
| 382 | + }, | |
| 383 | + position: { | |
| 384 | + bottom: viewContentPadding + 'px', | |
| 385 | + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", | |
| 386 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 387 | + height: "30px", | |
| 388 | + } | |
| 389 | + }); | |
| 390 | + } | |
| 391 | + // 弹窗内容 | |
| 392 | + let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单 | |
| 393 | + tag: "rect", | |
| 394 | + top: (screenHeight - popupViewHeight) / 2 + "px", | |
| 395 | + left: '15%', | |
| 396 | + height: popupViewHeight + "px", | |
| 397 | + width: "70%" | |
| 398 | + }); | |
| 399 | + // 绘制白色背景 | |
| 400 | + popupView.drawRect({ | |
| 401 | + color: "#FFFFFF", | |
| 402 | + radius: "8px" | |
| 403 | + }, { | |
| 404 | + top: "40px", | |
| 405 | + height: popupViewHeight - 40 + "px", | |
| 406 | + }); | |
| 407 | + | |
| 408 | + popupView.draw(popupViewContentList); | |
| 409 | + popupView.addEventListener("click", function(e) { | |
| 410 | + let maxTop = popupViewHeight - viewContentPadding; | |
| 411 | + let maxLeft = popupViewWidth - viewContentPadding; | |
| 412 | + let buttonWidth = (viewContentWidth - viewContentPadding) / 2; | |
| 413 | + if (e.clientY > maxTop - 30 && e.clientY < maxTop) { | |
| 414 | + if(data.updateType == "forcibly"){ | |
| 415 | + if(e.clientX > viewContentPadding && e.clientX < maxLeft){ | |
| 416 | + // 立即升级 | |
| 417 | + maskLayer.hide(); | |
| 418 | + popupView.hide(); | |
| 419 | + callback && callback(); | |
| 420 | + } | |
| 421 | + } else { | |
| 422 | + // 暂不升级 | |
| 423 | + if (e.clientX > viewContentPadding && e.clientX < maxLeft - buttonWidth - viewContentPadding) { | |
| 424 | + maskLayer.hide(); | |
| 425 | + popupView.hide(); | |
| 426 | + } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { | |
| 427 | + // 立即升级 | |
| 428 | + maskLayer.hide(); | |
| 429 | + popupView.hide(); | |
| 430 | + callback && callback(); | |
| 431 | + } | |
| 432 | + } | |
| 433 | + | |
| 434 | + } | |
| 435 | + }); | |
| 436 | + if(data.updateType == "solicit"){ | |
| 437 | + // 点击遮罩层 | |
| 438 | + maskLayer.addEventListener("click", function() { //处理遮罩层点击 | |
| 439 | + maskLayer.hide(); | |
| 440 | + popupView.hide(); | |
| 441 | + }); | |
| 442 | + } | |
| 443 | + // 显示弹窗 | |
| 444 | + maskLayer.show(); | |
| 445 | + popupView.show(); | |
| 446 | +} | |
| 447 | +// 文件下载的弹窗绘图 | |
| 448 | +function downloadPopupDrawing(data){ | |
| 449 | + // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 | |
| 450 | + const screenWidth = plus.screen.resolutionWidth; | |
| 451 | + const screenHeight = plus.screen.resolutionHeight; | |
| 452 | + //弹窗容器宽度 | |
| 453 | + const popupViewWidth = screenWidth * 0.7; | |
| 454 | + // 弹窗容器的Padding | |
| 455 | + const viewContentPadding = 20; | |
| 456 | + // 弹窗容器的宽度 | |
| 457 | + const viewContentWidth = popupViewWidth - (viewContentPadding * 2); | |
| 458 | + // 弹窗容器高度 | |
| 459 | + let popupViewHeight = viewContentPadding * 3 + 60; | |
| 460 | + let progressTip = data.progressTip || "准备下载..."; | |
| 461 | + let contentText = data.contentText || "正在为您更新,请耐心等待"; | |
| 462 | + let elementList = [ | |
| 463 | + { | |
| 464 | + tag: 'rect', //背景色 | |
| 465 | + color: '#FFFFFF', | |
| 466 | + rectStyles:{ | |
| 467 | + radius: "8px" | |
| 468 | + } | |
| 469 | + }, | |
| 470 | + { | |
| 471 | + tag: 'font', | |
| 472 | + id: 'title', | |
| 473 | + text: "升级APP", | |
| 474 | + textStyles: { | |
| 475 | + size: '16px', | |
| 476 | + color: "#333", | |
| 477 | + weight: "bold", | |
| 478 | + verticalAlign: "middle", | |
| 479 | + whiteSpace: "normal" | |
| 480 | + }, | |
| 481 | + position: { | |
| 482 | + top: viewContentPadding + 'px', | |
| 483 | + height: "30px", | |
| 484 | + } | |
| 485 | + }, | |
| 486 | + { | |
| 487 | + tag: 'font', | |
| 488 | + id: 'content', | |
| 489 | + text: contentText, | |
| 490 | + textStyles: { | |
| 491 | + size: '14px', | |
| 492 | + color: "#333", | |
| 493 | + verticalAlign: "middle", | |
| 494 | + whiteSpace: "normal" | |
| 495 | + }, | |
| 496 | + position: { | |
| 497 | + top: viewContentPadding * 2 + 30 + 'px', | |
| 498 | + height: "20px", | |
| 499 | + } | |
| 500 | + } | |
| 501 | + ]; | |
| 502 | + // 是否有进度条 | |
| 503 | + if(data.progress){ | |
| 504 | + popupViewHeight += viewContentPadding + 40; | |
| 505 | + elementList = elementList.concat([ | |
| 506 | + { | |
| 507 | + tag: 'font', | |
| 508 | + id: 'progressValue', | |
| 509 | + text: progressTip, | |
| 510 | + textStyles: { | |
| 511 | + size: '14px', | |
| 512 | + color: $mainColor, | |
| 513 | + whiteSpace: "normal" | |
| 514 | + }, | |
| 515 | + position: { | |
| 516 | + top: viewContentPadding * 4 + 20 + 'px', | |
| 517 | + height: "30px" | |
| 518 | + } | |
| 519 | + }, | |
| 520 | + { | |
| 521 | + tag: 'rect', //绘制进度条背景 | |
| 522 | + id: 'progressBg', | |
| 523 | + rectStyles:{ | |
| 524 | + radius: "4px", | |
| 525 | + borderColor: "#f1f1f1", | |
| 526 | + borderWidth: "1px", | |
| 527 | + }, | |
| 528 | + position:{ | |
| 529 | + top: viewContentPadding * 4 + 60 + 'px', | |
| 530 | + left: viewContentPadding + "px", | |
| 531 | + width: viewContentWidth + "px", | |
| 532 | + height: "8px" | |
| 533 | + } | |
| 534 | + }, | |
| 535 | + ]); | |
| 536 | + } | |
| 537 | + if (data.buttonNum == 2) { | |
| 538 | + popupViewHeight += viewContentPadding + 30; | |
| 539 | + elementList = elementList.concat([ | |
| 540 | + { | |
| 541 | + tag: 'rect', //绘制底边按钮 | |
| 542 | + rectStyles:{ | |
| 543 | + radius: "3px", | |
| 544 | + borderColor: "#f1f1f1", | |
| 545 | + borderWidth: "1px", | |
| 546 | + }, | |
| 547 | + position:{ | |
| 548 | + bottom: viewContentPadding + 'px', | |
| 549 | + left: viewContentPadding + "px", | |
| 550 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 551 | + height: "30px" | |
| 552 | + } | |
| 553 | + }, | |
| 554 | + { | |
| 555 | + tag: 'rect', //绘制底边按钮 | |
| 556 | + rectStyles:{ | |
| 557 | + radius: "3px", | |
| 558 | + color: $mainColor | |
| 559 | + }, | |
| 560 | + position:{ | |
| 561 | + bottom: viewContentPadding + 'px', | |
| 562 | + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", | |
| 563 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 564 | + height: "30px" | |
| 565 | + } | |
| 566 | + }, | |
| 567 | + { | |
| 568 | + tag: 'font', | |
| 569 | + id: 'cancelText', | |
| 570 | + text: "取消下载", | |
| 571 | + textStyles: { | |
| 572 | + size: '14px', | |
| 573 | + color: "#666", | |
| 574 | + lineSpacing: "0%", | |
| 575 | + whiteSpace: "normal" | |
| 576 | + }, | |
| 577 | + position: { | |
| 578 | + bottom: viewContentPadding + 'px', | |
| 579 | + left: viewContentPadding + "px", | |
| 580 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 581 | + height: "30px", | |
| 582 | + } | |
| 583 | + }, | |
| 584 | + { | |
| 585 | + tag: 'font', | |
| 586 | + id: 'confirmText', | |
| 587 | + text: "后台下载", | |
| 588 | + textStyles: { | |
| 589 | + size: '14px', | |
| 590 | + color: "#FFF", | |
| 591 | + lineSpacing: "0%", | |
| 592 | + whiteSpace: "normal" | |
| 593 | + }, | |
| 594 | + position: { | |
| 595 | + bottom: viewContentPadding + 'px', | |
| 596 | + left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", | |
| 597 | + width: (viewContentWidth - viewContentPadding) / 2 + "px", | |
| 598 | + height: "30px", | |
| 599 | + } | |
| 600 | + } | |
| 601 | + ]); | |
| 602 | + } | |
| 603 | + if (data.buttonNum == 1) { | |
| 604 | + popupViewHeight += viewContentPadding + 40; | |
| 605 | + elementList = elementList.concat([ | |
| 606 | + { | |
| 607 | + tag: 'rect', //绘制底边按钮 | |
| 608 | + rectStyles:{ | |
| 609 | + radius: "6px", | |
| 610 | + color: $mainColor | |
| 611 | + }, | |
| 612 | + position:{ | |
| 613 | + bottom: viewContentPadding + 'px', | |
| 614 | + left: viewContentPadding + "px", | |
| 615 | + width: viewContentWidth + "px", | |
| 616 | + height: "40px" | |
| 617 | + } | |
| 618 | + }, | |
| 619 | + { | |
| 620 | + tag: 'font', | |
| 621 | + id: 'confirmText', | |
| 622 | + text: "关闭", | |
| 623 | + textStyles: { | |
| 624 | + size: '14px', | |
| 625 | + color: "#FFF", | |
| 626 | + lineSpacing: "0%", | |
| 627 | + }, | |
| 628 | + position: { | |
| 629 | + bottom: viewContentPadding + 'px', | |
| 630 | + left: viewContentPadding + "px", | |
| 631 | + width: viewContentWidth + "px", | |
| 632 | + height: "40px" | |
| 633 | + } | |
| 634 | + } | |
| 635 | + ]); | |
| 636 | + } | |
| 637 | + return { | |
| 638 | + popupViewHeight:popupViewHeight, | |
| 639 | + popupViewWidth:popupViewWidth, | |
| 640 | + screenHeight:screenHeight, | |
| 641 | + viewContentWidth:viewContentWidth, | |
| 642 | + viewContentPadding:viewContentPadding, | |
| 643 | + elementList: elementList | |
| 644 | + }; | |
| 645 | +} | |
| 646 | +// 文件下载的弹窗 | |
| 647 | +function downloadPopup(data) { | |
| 648 | + // 弹窗遮罩层 | |
| 649 | + let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层 | |
| 650 | + top: '0px', | |
| 651 | + left: '0px', | |
| 652 | + height: '100%', | |
| 653 | + width: '100%', | |
| 654 | + backgroundColor: 'rgba(0,0,0,0.5)' | |
| 655 | + }); | |
| 656 | + let popupViewData = downloadPopupDrawing(data); | |
| 657 | + // 弹窗内容 | |
| 658 | + let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单 | |
| 659 | + tag: "rect", | |
| 660 | + top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", | |
| 661 | + left: '15%', | |
| 662 | + height: popupViewData.popupViewHeight + "px", | |
| 663 | + width: "70%", | |
| 664 | + }); | |
| 665 | + let progressValue = 0; | |
| 666 | + let progressTip = 0; | |
| 667 | + let contentText = 0; | |
| 668 | + let buttonNum = 2; | |
| 669 | + if(data.buttonNum >= 0){ | |
| 670 | + buttonNum = data.buttonNum; | |
| 671 | + } | |
| 672 | + popupView.draw(popupViewData.elementList); | |
| 673 | + let callbackData = { | |
| 674 | + change: function(res) { | |
| 675 | + let progressElement = []; | |
| 676 | + if(res.progressValue){ | |
| 677 | + progressValue = res.progressValue; | |
| 678 | + // 绘制进度条 | |
| 679 | + progressElement.push({ | |
| 680 | + tag: 'rect', //绘制进度条背景 | |
| 681 | + id: 'progressValueBg', | |
| 682 | + rectStyles:{ | |
| 683 | + radius: "4px", | |
| 684 | + color: $mainColor | |
| 685 | + }, | |
| 686 | + position:{ | |
| 687 | + top: popupViewData.viewContentPadding * 4 + 60 + 'px', | |
| 688 | + left: popupViewData.viewContentPadding + "px", | |
| 689 | + width: popupViewData.viewContentWidth * (res.progressValue / 100) + "px", | |
| 690 | + height: "8px" | |
| 691 | + } | |
| 692 | + }); | |
| 693 | + } | |
| 694 | + if(res.progressTip){ | |
| 695 | + progressTip = res.progressTip; | |
| 696 | + progressElement.push({ | |
| 697 | + tag: 'font', | |
| 698 | + id: 'progressValue', | |
| 699 | + text: res.progressTip, | |
| 700 | + textStyles: { | |
| 701 | + size: '14px', | |
| 702 | + color: $mainColor, | |
| 703 | + whiteSpace: "normal" | |
| 704 | + }, | |
| 705 | + position: { | |
| 706 | + top: popupViewData.viewContentPadding * 4 + 20 + 'px', | |
| 707 | + height: "30px" | |
| 708 | + } | |
| 709 | + }); | |
| 710 | + } | |
| 711 | + if(res.contentText){ | |
| 712 | + contentText = res.contentText; | |
| 713 | + progressElement.push({ | |
| 714 | + tag: 'font', | |
| 715 | + id: 'content', | |
| 716 | + text: res.contentText, | |
| 717 | + textStyles: { | |
| 718 | + size: '16px', | |
| 719 | + color: "#333", | |
| 720 | + whiteSpace: "normal" | |
| 721 | + }, | |
| 722 | + position: { | |
| 723 | + top: popupViewData.viewContentPadding * 2 + 30 + 'px', | |
| 724 | + height: "30px", | |
| 725 | + } | |
| 726 | + }); | |
| 727 | + } | |
| 728 | + if(res.buttonNum >= 0 && buttonNum != res.buttonNum){ | |
| 729 | + buttonNum = res.buttonNum; | |
| 730 | + popupView.reset(); | |
| 731 | + popupViewData = downloadPopupDrawing(Object.assign({ | |
| 732 | + progressValue:progressValue, | |
| 733 | + progressTip:progressTip, | |
| 734 | + contentText:contentText, | |
| 735 | + },res)); | |
| 736 | + let newElement = []; | |
| 737 | + popupViewData.elementList.map((item,index) => { | |
| 738 | + let have = false; | |
| 739 | + progressElement.forEach((childItem,childIndex) => { | |
| 740 | + if(item.id == childItem.id){ | |
| 741 | + have = true; | |
| 742 | + } | |
| 743 | + }); | |
| 744 | + if(!have){ | |
| 745 | + newElement.push(item); | |
| 746 | + } | |
| 747 | + }); | |
| 748 | + progressElement = newElement.concat(progressElement); | |
| 749 | + popupView.setStyle({ | |
| 750 | + tag: "rect", | |
| 751 | + top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", | |
| 752 | + left: '15%', | |
| 753 | + height: popupViewData.popupViewHeight + "px", | |
| 754 | + width: "70%", | |
| 755 | + }); | |
| 756 | + popupView.draw(progressElement); | |
| 757 | + }else{ | |
| 758 | + popupView.draw(progressElement); | |
| 759 | + } | |
| 760 | + }, | |
| 761 | + cancel: function() { | |
| 762 | + maskLayer.hide(); | |
| 763 | + popupView.hide(); | |
| 764 | + } | |
| 765 | + } | |
| 766 | + popupView.addEventListener("click", function(e) { | |
| 767 | + let maxTop = popupViewData.popupViewHeight - popupViewData.viewContentPadding; | |
| 768 | + let maxLeft = popupViewData.popupViewWidth - popupViewData.viewContentPadding; | |
| 769 | + if (e.clientY > maxTop - 40 && e.clientY < maxTop) { | |
| 770 | + if(buttonNum == 1){ | |
| 771 | + // 单按钮 | |
| 772 | + if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft) { | |
| 773 | + maskLayer.hide(); | |
| 774 | + popupView.hide(); | |
| 775 | + callbackData.reboot(); | |
| 776 | + } | |
| 777 | + }else if(buttonNum == 2){ | |
| 778 | + // 双按钮 | |
| 779 | + let buttonWidth = (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / 2; | |
| 780 | + if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding) { | |
| 781 | + maskLayer.hide(); | |
| 782 | + popupView.hide(); | |
| 783 | + callbackData.cancelDownload(); | |
| 784 | + } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { | |
| 785 | + maskLayer.hide(); | |
| 786 | + popupView.hide(); | |
| 787 | + } | |
| 788 | + } | |
| 789 | + } | |
| 790 | + }); | |
| 791 | + // 显示弹窗 | |
| 792 | + maskLayer.show(); | |
| 793 | + popupView.show(); | |
| 794 | + // 改变进度条 | |
| 795 | + return callbackData; | |
| 796 | +} | |
| 797 | +export default function(isPrompt = false) { | |
| 798 | + getCurrentNo(versionInfo => { | |
| 799 | + componentConfig.getServerNo(versionInfo, isPrompt, res => { | |
| 800 | + if (res.updateType == "forcibly" || res.updateType == "silent") { | |
| 801 | + if (/\.wgt$/i.test(res.downloadUrl)) { | |
| 802 | + getDownload(res); | |
| 803 | + } else if(/\.html$/i.test(res.downloadUrl)){ | |
| 804 | + plus.runtime.openURL(res.downloadUrl); | |
| 805 | + } else { | |
| 806 | + if (platform == "android") { | |
| 807 | + getDownload(res); | |
| 808 | + } else { | |
| 809 | + plus.runtime.openURL(res.downloadUrl); | |
| 810 | + } | |
| 811 | + } | |
| 812 | + } else if(res.updateType == "solicit"){ | |
| 813 | + updatePopup(res, function() { | |
| 814 | + if (/\.wgt$/i.test(res.downloadUrl)) { | |
| 815 | + getDownload(res); | |
| 816 | + } else if(/\.html$/i.test(res.downloadUrl)){ | |
| 817 | + plus.runtime.openURL(res.downloadUrl); | |
| 818 | + } else { | |
| 819 | + if (platform == "android") { | |
| 820 | + getDownload(res); | |
| 821 | + } else { | |
| 822 | + plus.runtime.openURL(res.downloadUrl); | |
| 823 | + } | |
| 824 | + } | |
| 825 | + }); | |
| 826 | + } | |
| 827 | + }); | |
| 828 | + }); | |
| 829 | +} | |
| 830 | +// #endif | |
| \ No newline at end of file | ... | ... |
uni_modules/zhouWei-APPUpdate/package.json
0 → 100644
| 1 | +{ | |
| 2 | + "id": "zhouWei-APPUpdate", | |
| 3 | + "displayName": "APP版本更新、强制更新、静默更新、下载进度(wgt更新)", | |
| 4 | + "version": "3.0.1", | |
| 5 | + "description": "APP版本更新、强制更新、静默更新、漂亮弹窗、下载进度(wgt更新)", | |
| 6 | + "keywords": [ | |
| 7 | + "APP版本更新", | |
| 8 | + "强制更新", | |
| 9 | + "版本更新", | |
| 10 | + "静默更新" | |
| 11 | +], | |
| 12 | + "repository": "https://github.com/zhouwei1994/uni-app-demo", | |
| 13 | + "engines": { | |
| 14 | + "HBuilderX": "^3.1.0" | |
| 15 | + }, | |
| 16 | + "dcloudext": { | |
| 17 | + "category": [ | |
| 18 | + "JS SDK", | |
| 19 | + "通用 SDK" | |
| 20 | + ], | |
| 21 | + "sale": { | |
| 22 | + "regular": { | |
| 23 | + "price": "0.00" | |
| 24 | + }, | |
| 25 | + "sourcecode": { | |
| 26 | + "price": "0.00" | |
| 27 | + } | |
| 28 | + }, | |
| 29 | + "contact": { | |
| 30 | + "qq": "465081029" | |
| 31 | + }, | |
| 32 | + "declaration": { | |
| 33 | + "ads": "无", | |
| 34 | + "data": "无", | |
| 35 | + "permissions": "<uses-permission android:name=\\\"android.permission.INSTALL_PACKAGES\\\"/> \n<uses-permission android:name=\\\"android.permission.REQUEST_INSTALL_PACKAGES\\\"/>" | |
| 36 | + }, | |
| 37 | + "npmurl": "" | |
| 38 | + }, | |
| 39 | + "uni_modules": { | |
| 40 | + "dependencies": [], | |
| 41 | + "encrypt": [], | |
| 42 | + "platforms": { | |
| 43 | + "cloud": { | |
| 44 | + "tcb": "y", | |
| 45 | + "aliyun": "y" | |
| 46 | + }, | |
| 47 | + "client": { | |
| 48 | + "App": { | |
| 49 | + "app-vue": "y", | |
| 50 | + "app-nvue": "y" | |
| 51 | + }, | |
| 52 | + "H5-mobile": { | |
| 53 | + "Safari": "n", | |
| 54 | + "Android Browser": "n", | |
| 55 | + "微信浏览器(Android)": "n", | |
| 56 | + "QQ浏览器(Android)": "n" | |
| 57 | + }, | |
| 58 | + "H5-pc": { | |
| 59 | + "Chrome": "n", | |
| 60 | + "IE": "n", | |
| 61 | + "Edge": "n", | |
| 62 | + "Firefox": "n", | |
| 63 | + "Safari": "n" | |
| 64 | + }, | |
| 65 | + "小程序": { | |
| 66 | + "微信": "n", | |
| 67 | + "阿里": "n", | |
| 68 | + "百度": "n", | |
| 69 | + "字节跳动": "n", | |
| 70 | + "QQ": "n" | |
| 71 | + }, | |
| 72 | + "快应用": { | |
| 73 | + "华为": "n", | |
| 74 | + "联盟": "n" | |
| 75 | + } | |
| 76 | + } | |
| 77 | + } | |
| 78 | + } | |
| 79 | +} | |
| \ No newline at end of file | ... | ... |
uni_modules/zhouWei-APPUpdate/readme.md
0 → 100644
| 1 | +### 常见问题 | |
| 2 | +1.安卓apk下载完成后没有更新APP? | |
| 3 | + | |
| 4 | +答:问题是因为没有添加APP安装应用的权限,解决方法在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限 | |
| 5 | +``` | |
| 6 | +<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/> | |
| 7 | +<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/> | |
| 8 | +``` | |
| 9 | +若还有问题请看[安装apk无法执行的解决方案](https://ask.dcloud.net.cn/article/35703 "安装apk无法执行的解决方案") | |
| 10 | + | |
| 11 | +2.APP更新后版本号没变,还是之前的版本号? | |
| 12 | + | |
| 13 | +答:可能是更新的安装包没有升级版本号,`manifest.json`文件里面基本设置`应用版本号`和`应用版本名称`需要升高(保持一直减少问题) | |
| 14 | + | |
| 15 | +3.APP更新后没有覆盖之前的APP? | |
| 16 | + | |
| 17 | +答:可能是更新的安装包`包名`和APP的`包名`不一样 | |
| 18 | + | |
| 19 | +4.弹窗的图标不显示? | |
| 20 | + | |
| 21 | +答:检查图片是不是放项目资源文件`static`,然后重新运行项目 | |
| 22 | + | |
| 23 | +5.版本号是在前端对比还是在后端接口对比? | |
| 24 | + | |
| 25 | +答:当前案例是本地的版本号通过接口传递给后台,是后台对比的,若需要前端对比,请在接口返回数据的地方修改,不更新就不要调用`callback`方法 | |
| 26 | + | |
| 27 | +6.本地的版本号比接口的版本号高还弹窗升级窗口? | |
| 28 | + | |
| 29 | +答:当前案例是本地的版本号通过接口传递给后台,后台对比是否需要升级,不需要升级就不要返回数据(特别是需要wgt更新的,建议这种方式) | |
| 30 | + | |
| 31 | +### 第一步`关键`配置APP更新接口(可以参考上面的示例) | |
| 32 | +在项目目录下`config/componentConfig.js`里面如下配置 | |
| 33 | +``` | |
| 34 | +// 此方法是接口请求方法 | |
| 35 | +import $http from '@/config/requestConfig' | |
| 36 | +export default { | |
| 37 | + // 发起ajax请求获取服务端版本号 | |
| 38 | + getServerNo: (version, isPrompt = false, callback) => { | |
| 39 | + let httpData = { | |
| 40 | + version: version.versionCode, | |
| 41 | + // 版本名称 | |
| 42 | + versionName: version.versionName, | |
| 43 | + // setupPage参数说明(判断用户是不是从设置页面点击的更新,如果是设置页面点击的更新,有不要用静默更新了,不然用户点击没反应很奇怪的) | |
| 44 | + setupPage: isPrompt | |
| 45 | + }; | |
| 46 | + if (platform == "android") { | |
| 47 | + httpData.type = 1101; | |
| 48 | + } else { | |
| 49 | + httpData.type = 1102; | |
| 50 | + } | |
| 51 | + /* 接口入参说明 | |
| 52 | + * version: 应用当前版本号(已自动获取) | |
| 53 | + * versionName: 应用当前版本名称(已自动获取) | |
| 54 | + * type:平台(1101是安卓,1102是IOS) | |
| 55 | + */ | |
| 56 | + /****************以下是示例*******************/ | |
| 57 | + // 可以用自己项目的请求方法(接口自己找后台要,插件不提供) | |
| 58 | + $http.get("api/common/v1/app_version", httpData,{ | |
| 59 | + isPrompt: isPrompt | |
| 60 | + }).then(res => { | |
| 61 | + /* res的数据说明 | |
| 62 | + * | 参数名称 | 一定返回 | 类型 | 描述 | |
| 63 | + * | -------------|--------- | --------- | ------------- | | |
| 64 | + * | versionCode | y | int | 版本号 | | |
| 65 | + * | versionName | y | String | 版本名称 | | |
| 66 | + * | versionInfo | y | String | 版本信息 | | |
| 67 | + * | updateType | y | String | forcibly = 强制更新, solicit = 弹窗确认更新, silent = 静默更新 | | |
| 68 | + * | downloadUrl | y | String | 版本下载链接(IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接) | | |
| 69 | + */ | |
| 70 | + if (res && res.downloadUrl) { | |
| 71 | + // 兼容之前的版本(updateType是新版才有的参数) | |
| 72 | + if(res.updateType){ | |
| 73 | + callback && callback(res); | |
| 74 | + } else { | |
| 75 | + if(res.forceUpdate){ | |
| 76 | + res.updateType = "forcibly"; | |
| 77 | + } else { | |
| 78 | + res.updateType = "solicit"; | |
| 79 | + } | |
| 80 | + callback && callback(res); | |
| 81 | + } | |
| 82 | + } else if (isPrompt) { | |
| 83 | + uni.showToast({ | |
| 84 | + title: "暂无新版本", | |
| 85 | + icon: "none" | |
| 86 | + }); | |
| 87 | + } | |
| 88 | + }); | |
| 89 | + /****************以上是示例*******************/ | |
| 90 | + }, | |
| 91 | + // 弹窗主颜色(不填默认粉色) | |
| 92 | + appUpdateColor: "f00", | |
| 93 | + // 弹窗图标(不填显示默认图标,链接配置示例如: '/static/demo/ic_attention.png') | |
| 94 | + appUpdateIcon: '' | |
| 95 | +} | |
| 96 | +``` | |
| 97 | + | |
| 98 | +### 第二步 使用方法 | |
| 99 | +``` | |
| 100 | +// App.vue页面 | |
| 101 | + | |
| 102 | +// #ifdef APP-PLUS | |
| 103 | +import APPUpdate from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate'; | |
| 104 | +// #endif | |
| 105 | + | |
| 106 | +onLaunch: function(e) { | |
| 107 | + // #ifdef APP-PLUS | |
| 108 | + APPUpdate(); | |
| 109 | + // #endif | |
| 110 | +} | |
| 111 | +``` | |
| 112 | + | |
| 113 | +### 第三步 添加APP安装应用的权限 | |
| 114 | +在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限 | |
| 115 | +``` | |
| 116 | +<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/> | |
| 117 | +<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/> | |
| 118 | +``` | |
| 119 | + | |
| 120 | +### 修改弹窗的主题色或弹窗图标 | |
| 121 | +在`APPUpdate/index.js`里面上面`$mainColor`常量中定义主题颜色,`$iconUrl`常量中定义图标地址 | |
| 122 | + | |
| 123 | +### 检查APP是否有新版本(一般在设置页面使用) | |
| 124 | +``` | |
| 125 | +// #ifdef APP-PLUS | |
| 126 | +import APPUpdate, { getCurrentNo } from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate'; | |
| 127 | +// #endif | |
| 128 | +export default { | |
| 129 | + data() { | |
| 130 | + return { | |
| 131 | + version: "" // 版本号 | |
| 132 | + }; | |
| 133 | + }, | |
| 134 | + //第一次加载 | |
| 135 | + onLoad(e) { | |
| 136 | + // #ifdef APP-PLUS | |
| 137 | + getCurrentNo(res => { | |
| 138 | + // 进页面获取当前APP版本号(用于页面显示) | |
| 139 | + this.version = res.version; | |
| 140 | + }); | |
| 141 | + // #endif | |
| 142 | + }, | |
| 143 | + //方法 | |
| 144 | + methods: { | |
| 145 | + // 检查APP是否有新版本 | |
| 146 | + onAPPUpdate() { | |
| 147 | + // true 没有新版本的时候有提示,默认:false | |
| 148 | + APPUpdate(true); | |
| 149 | + } | |
| 150 | + } | |
| 151 | +} | |
| 152 | +``` | |
| \ No newline at end of file | ... | ... |
30.7 KB