From 5fecc9e46d448df3de987504440c4fdd582f858e Mon Sep 17 00:00:00 2001 From: quanyawei <401863037@qq.com> Date: Tue, 31 Oct 2023 10:35:40 +0800 Subject: [PATCH] fix:小程序秒级数据和登录授权 --- uni_modules/uni-popup/components/uni-popup-dialog/keypress.js | 45 uni_modules/uni-transition/package.json | 84 + pages/actionChange/components/rectificationInfor.vue | 7 uni_modules/uni-popup/components/uni-popup/popup.js | 26 uni_modules/uni-popup/package.json | 87 + uni_modules/uni-transition/readme.md | 11 uni_modules/uni-popup/readme.md | 17 uni_modules/ws-wx-privacy/readme.md | 122 ++ pages/actionChange/secondLevelData/index.vue | 596 ++++++++++ uni_modules/uni-popup/changelog.md | 68 + uni_modules/ws-wx-privacy/components/ws-wx-privacy/util.js | 51 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue | 275 ++++ pages/actionChange/myInfor/index.vue | 2 uni_modules/uni-popup/components/uni-popup/i18n/index.js | 8 .env.dev.js | 2 uni_modules/uni-popup/components/uni-popup/uni-popup.vue | 473 ++++++++ uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue | 187 +++ uni_modules/ws-wx-privacy/package.json | 85 + pages/actionChange/agencyPage/index.vue | 2 pages/login/login.vue | 18 pages/actionChange/newPage/index.vue | 4 uni_modules/uni-transition/components/uni-transition/uni-transition.vue | 286 +++++ pages.json | 7 uni_modules/ws-wx-privacy/components/ws-wx-privacy/ws-wx-privacy.vue | 287 +++++ uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue | 143 ++ uni_modules/uni-popup/components/uni-popup/keypress.js | 45 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json | 7 uni_modules/uni-transition/components/uni-transition/createAnimation.js | 131 ++ uni_modules/uni-transition/changelog.md | 22 /dev/null | 0 pages/actionChange/secondLevelData/parameter.json | 44 uni_modules/uni-popup/components/uni-popup/i18n/en.json | 7 manifest.json | 148 +- uni_modules/ws-wx-privacy/changelog.md | 22 utils/websoket.js | 91 + uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json | 7 36 files changed, 3,336 insertions(+), 81 deletions(-) diff --git a/.env.dev.js b/.env.dev.js index 8093bf2..fc8f4ea 100644 --- a/.env.dev.js +++ b/.env.dev.js @@ -1,6 +1,6 @@ const config = { // baseUrl: "http://120.26.43.34:8081/api/", //������ baseUrl: "https://qx.7drlb.com/api", //������ - // baseUrl: "http://192.168.0.9:8081/api", //������ + // baseUrl: "http://192.168.0.12:8081/api", //������ }; module.exports = config; \ No newline at end of file diff --git a/manifest.json b/manifest.json index 5bf1825..e69eee1 100644 --- a/manifest.json +++ b/manifest.json @@ -1,75 +1,75 @@ { - "name" : "test", - "appid" : "__UNI__93C3197", - "description" : "", - "versionName" : "1.0.0", - "versionCode" : "100", - "transformPx" : false, - /* 5+App������������ */ - "app-plus" : { - "usingComponents" : true, - "nvueStyleCompiler" : "uni-app", - "compilerVersion" : 3, - "splashscreen" : { - "alwaysShowBeforeRender" : true, - "waiting" : true, - "autoclose" : true, - "delay" : 0 - }, - /* ������������ */ - "modules" : {}, - /* ������������������ */ - "distribute" : { - /* android������������ */ - "android" : { - "permissions" : [ - "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", - "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", - "<uses-permission android:name=\"android.permission.VIBRATE\"/>", - "<uses-permission android:name=\"android.permission.READ_LOGS\"/>", - "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", - "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", - "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", - "<uses-permission android:name=\"android.permission.CAMERA\"/>", - "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", - "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", - "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", - "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", - "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", - "<uses-feature android:name=\"android.hardware.camera\"/>", - "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" - ] - }, - /* ios������������ */ - "ios" : {}, - /* SDK������ */ - "sdkConfigs" : {} - } - }, - /* ��������������������� */ - "quickapp" : {}, - /* ��������������������� */ - "mp-weixin" : { - "appid" : "wx41f4c3c007545088", - "setting" : { - "urlCheck" : false, - "es6" : true, - "postcss" : true, - "minified" : true - }, - "usingComponents" : true - }, - "mp-alipay" : { - "usingComponents" : true - }, - "mp-baidu" : { - "usingComponents" : true - }, - "mp-toutiao" : { - "usingComponents" : true - }, - "uniStatistics" : { - "enable" : false - }, - "vueVersion" : "2" -} + "name": "test", + "appid": "__UNI__93C3197", + "description": "", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + /* 5+App������������ */ + "app-plus": { + "usingComponents": true, + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + /* ������������ */ + "modules": {}, + /* ������������������ */ + "distribute": { + /* android������������ */ + "android": { + "permissions": ["<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", + "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", + "<uses-permission android:name=\"android.permission.VIBRATE\"/>", + "<uses-permission android:name=\"android.permission.READ_LOGS\"/>", + "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", + "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", + "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", + "<uses-permission android:name=\"android.permission.CAMERA\"/>", + "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", + "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", + "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", + "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", + "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", + "<uses-feature android:name=\"android.hardware.camera\"/>", + "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" + ] + }, + /* ios������������ */ + "ios": {}, + /* SDK������ */ + "sdkConfigs": {} + } + }, + /* ��������������������� */ + "quickapp": {}, + /* ��������������������� */ + "mp-weixin": { + "appid": "wxf95fb77e0b1f8c09", + "__usePrivacyCheck__": true, + "setting": { + "urlCheck": false, + "es6": true, + "postcss": true, + "minified": true + }, + "usingComponents": true + }, + "mp-alipay": { + "usingComponents": true + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "uniStatistics": { + "enable": false + }, + "vueVersion": "2" +} \ No newline at end of file diff --git a/pages.json b/pages.json index 0122ed8..395274f 100644 --- a/pages.json +++ b/pages.json @@ -44,6 +44,13 @@ "disableSwipeBack": true, "navigationStyle": "custom" } + }, { + "path": "pages/actionChange/secondLevelData/index", + "style": { + "navigationBarTitleText": "������������", + "enablePullDownRefresh": false, + "disableSwipeBack": true + } } ] // "tabBar": { diff --git a/pages/actionChange/agencyPage/index.vue b/pages/actionChange/agencyPage/index.vue index 563f912..68b842e 100644 --- a/pages/actionChange/agencyPage/index.vue +++ b/pages/actionChange/agencyPage/index.vue @@ -349,7 +349,7 @@ id: e.allocationId }).then(res => { let data = res.data - data.pageState = data.state === 50 || data.state === 40 ? 'view' : pageState + data.pageState = e.stateName === '���������' ? pageState : 'view' let myData = JSON.stringify(data) uni.navigateTo({ url: '/pages/actionChange/workOrderDetails/index?infor=' + myData, diff --git a/pages/actionChange/components/rectificationInfor.vue b/pages/actionChange/components/rectificationInfor.vue index fad999f..61e5a2f 100644 --- a/pages/actionChange/components/rectificationInfor.vue +++ b/pages/actionChange/components/rectificationInfor.vue @@ -145,8 +145,11 @@ let name = item.fileType === 1 ? 'name.png' : 'name.mp4' this.fileList.push(`${this.baseUrl}/file/preview/${item.fileId}?${name}`) // ������ }) - console.log('this.fileList', this.basicInfor.fileBaseList) - console.log('this.fileList', this.fileList) + } + let userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}') + console.log('userInfor', userInfor) + if (this.basicInfor.pageState === 'edit') { + this.form.changeName = userInfor.userName } }, methods: { diff --git a/pages/actionChange/myInfor/index.vue b/pages/actionChange/myInfor/index.vue index a186dec..f0169ba 100644 --- a/pages/actionChange/myInfor/index.vue +++ b/pages/actionChange/myInfor/index.vue @@ -11,6 +11,8 @@ <u-cell icon="account-fill" title="������" :value="userInfor.account"></u-cell> <u-cell icon="integral-fill" title="������������" :value="unitName"></u-cell> <u-cell icon="phone-fill" title="���������" :value="userInfor.mobile"></u-cell> + <u-cell icon="clock-fill" title="������������������" v-if="userInfor.device===1" isLink + url="/pages/actionChange/secondLevelData/index"></u-cell> </u-cell-group> </view> <view class="bunts"> diff --git a/pages/actionChange/newPage/index.vue b/pages/actionChange/newPage/index.vue index e84ee88..894ac12 100644 --- a/pages/actionChange/newPage/index.vue +++ b/pages/actionChange/newPage/index.vue @@ -265,8 +265,8 @@ this.form.escalationUnitId = data this.sumbitForm.escalationUnitId = userInfor.unitId } - this.form.escalationName = userInfor.name || '' - this.sumbitForm.escalationName = userInfor.name || '' + this.form.escalationName = userInfor.userName || '' + this.sumbitForm.escalationName = userInfor.userName || '' this.form.investigationType = 1 this.sumbitForm.investigationType = 1 console.log('this.sumbitForm', this.sumbitForm) diff --git a/pages/actionChange/secondLevelData/index.vue b/pages/actionChange/secondLevelData/index.vue new file mode 100644 index 0000000..e6b8a30 --- /dev/null +++ b/pages/actionChange/secondLevelData/index.vue @@ -0,0 +1,596 @@ +<template> + <view class="rootBg"> + <view class=""> + <view class="ridoa"> + <u-radio-group v-model="value" placement="row" :size='radioOption.size' + :labelColor='radioOption.labelColor' :labelSize='radioOption.labelSize' @change='changeSearchType'> + <u-radio activeColor="#19be6b" label="������������������" name="0" :labelSize='radioOption.labelSize' + :labelColor='radioOption.labelColor'></u-radio> + <u-radio activeColor="#19be6b" label="������������������" name="1" :labelSize='radioOption.labelSize' + :labelColor='radioOption.labelColor'></u-radio> + </u-radio-group> + </view> + <view class="" v-if="value==='1'"> + <u-input placeholder="���������Mac���" :placeholderStyle='placeholderStyle' color="#fff" v-model='macName'> + <template slot="suffix"> + <u-button @tap="searchMacList" text="������" type="success" size="small"></u-button> + </template> + </u-input> + </view> + <view class="" v-else> + <u-form ref="uForm" label-width="80" :model="form"> + <u-form-item border-bottom @click="showeEscalationTime = true ;hideKeyboard('orgName','orgId')"> + <u-input v-model="form.orgName" disabled disabled-color="#ffffff" placeholder="���������������" + type="select" /> + </u-form-item> + <u-form-item border-bottom @click="selectSite"> + <u-input v-model="form.siteName" disabled disabled-color="#ffffff" placeholder="���������������" + type="select" /> + </u-form-item> + </u-form> + <u-picker :show="showeEscalationTime" :columns="columns" @confirm="selectBack" keyName="name" + @cancel="showeEscalationTime = false"></u-picker> + </view> + </view> + <view v-if="wsData2"> + <u-cell title="���������" :value="windDirData"></u-cell> + </view> + <view class="boxPadd"> + <u-list v-if="showData.length>0"> + <u-list-item v-for="(item, index) in showData" :key="index"> + <u-row customStyle="margin-bottom: 10px"> + <u-col span="3"> + <view>{{ item.sensorCode | sensorFilter}}</view> + </u-col> + <u-col span="6" textAlign="right"> + <u-line-progress :percentage="item.alarm" :activeColor="item.colour"></u-line-progress> + </u-col> + <u-col span="3" textAlign="right"> + <view>{{ item.value || ''}} </view> + </u-col> + </u-row> + </u-list-item> + </u-list> + </view> + <u-toast ref="uToast"></u-toast> + <u-modal :show="showModel" title='���������Mac���' showCancelButton @cancel='showModel=false' @confirm='selectMac'> + <view class="slot-content"> + <u-radio-group v-model="modeleMacSelect" iconPlacement="right" placement='column' borderBottom='true'> + <view v-for="(item,index) in macList" :key="index" class="ridioBox"> + <u-radio activeColor="#19be6b" :label="item.mac" :name="item.mac"></u-radio> + </view> + </u-radio-group> + </view> + </u-modal> + </view> +</template> +<script> + import json from '@/pages/actionChange/secondLevelData/parameter.json' + import wsRequest from '@/utils/websoket.js' + export default { + data() { + return { + modeleMacSelect: '', + value: '0', + showModel: false, + showeEscalationTime: false, + columns: [], + form: { + orgName: '', + orgId: '', + siteName: '', + siteId: '' + }, + selectForm: { + name: '', + id: '' + }, + macList: [], + radioOption: { + size: '20px', + labelColor: '#fff', + labelSize: '18px' + }, + placeholderStyle: 'color: #fff', + macName: '', + defaultMonitorItems: [], + chartSensorKey: [], + coreMonitorItems: [], + fixedMonitorItems: [], + totalArray: [], + alarmLevel: null, + aqi: 0, + baseUrl: '', + windDir: 'null', + windDeg: 180, + wsData2: null, + // ��������������� + alarmProgress: {}, + // ������������ + alarmColour: {}, + // ������������������ + alarmBg: {}, + timer: '', + isLoading: true + } + }, + filters: { + // ���������������websocket���������������key��� + sensorFilter: function(value) { + if (!value) return '' + return json[value] + } + }, + computed: { + windDirData() { + if (this.wsData2) { + console.log('this.windDir', this.windDir) + return `${this.windDir} (${this.wsData2.a01008})` + } else { + return '' + } + }, + showData() { + return [...this.defaultMonitorItems, ...this.coreMonitorItems] + } + }, + created() { + this.getOrgs() + }, + onUnload() { + let that = this + this.socketTask.close() + that.isLoading = false + that.timer = '' + }, + methods: { + getData() { + this.queryAlarmByMac() + this.getHourlyAqi() + this.sensorLayout() + }, + changeSearchType() { + this.macName = '' + }, + selectMac() { + this.macName = this.modeleMacSelect + this.showModel = false + if (this.socketTask) { + this.socketTask.onClose() + } + this.getData() + }, + searchMacList() { + this.$http.httpGet('/AppDevice/fuzzySearch', { + mac: this.macName + }).then(res => { + this.showModel = true + if (res.data && res.data.length > 10) { + this.macList = res.data.slice(0, 10) + } + }).catch(res => { + uni.$u.toast(res) + }) + }, + selectSite() { + if (this.form.orgId === '') { + uni.showToast({ + title: '���������������������', + icon: 'none', + }) + } else { + this.selectForm = { + name: 'siteName', + id: 'siteId' + }, + this.getSites() + } + }, + hideKeyboard(name, id) { + this.selectForm = { + 'name': name, + 'id': id + } + this.getOrgs() + }, + selectBack(e) { + if (this.selectForm.name === 'orgName') { + this.form = { + orgName: '', + orgId: '', + siteName: '', + siteId: '' + } + } else { + this.macName = e.value[0].mac + if (this.socketTask) { + this.socketTask.onClose() + } + this.getData() + } + this.form[this.selectForm.name] = e.value[0].name + this.form[this.selectForm.id] = e.value[0].id + this.showeEscalationTime = false + }, + getOrgs() { + this.$http.httpGet('/AppDevice/selectOrganization').then(res => { + this.columns = [] + this.columns.push(res.data) + }).catch(res => { + uni.$u.toast(res) + }) + }, + getSites() { + let params = { + organizationId: this.form.orgId + } + this.$http.httpGet('/AppDevice/selectDevice', params).then(res => { + console.log(res) + this.columns = [] + this.columns.push(res.data) + this.showeEscalationTime = true + }).catch(res => { + uni.$u.toast(res) + console.log(res) + }) + }, + sensorLayout() { + let params = { + mac: this.macName + } + this.$http.httpGet('/organizationLayout/getLayoutByMac', params).then(res => { + this.chartSensorKey = res.data.chartSensorKey + this.coreMonitorItems = res.data.coreMonitorItems + this.defaultMonitorItems = res.data.defaultMonitorItems + this.fixedMonitorItems = res.data.fixedMonitorItems + this.totalArray.push(...this.coreMonitorItems, ...this.defaultMonitorItems, ...this + .fixedMonitorItems) + this.getSensorMonthAvg() + this.connectSocket() + }).catch(res => { + uni.$u.toast(res) + console.log(res) + }) + }, + // ��������������������������������������� + getSensorMonthAvg() { + let params = { + sensorCode: this.chartSensorKey[0].sensorCode, + mac: this.macName + } + this.$http.httpGet('/deviceInfo/getMonthAvg', params).then(res => { + this.average = res.data.avg + }).catch(res => { + uni.$u.toast(res) + console.log(res) + }) + }, + // ��������������������� + queryAlarmByMac() { + let params = { + mac: this.macName + } + this.$http.httpGet('/deviceInfo/queryAlarmByMac', params).then(res => { + this.alarmLevel = res.data.alarmLevel + }).catch(res => { + uni.$u.toast(res) + console.log(res) + }) + }, + // ������������������������������ + getHourlyAqi() { + let params = { + mac: this.macName + } + this.$http.httpGet('/deviceInfo/getHourlyAqi', params).then(res => { + this.aqi = res.data.AQI + }).catch(res => { + uni.$u.toast(res) + console.log(res) + }) + }, + handlerMsg(msg) { + this.wsData2 = JSON.parse(msg.data) + if (this.wsData2.dustld) { + this.wsData2.dustld = this.wsData2.dustld.replace(/g/, 'ug') + } + // ������������ + if (this.wsData2.a01008) { + var windDirs = Number(this.wsData2.a01008.substr(0, this.wsData2.a01008.length - 1)) + this.windDeg = windDirs + if (windDirs === 0) { + this.windDir = '������' + } else if (windDirs > 0 && windDirs < 90) { + this.windDir = '���������' + } else if (windDirs === 90) { + this.windDir = '������' + } else if (windDirs > 90 && windDirs < 180) { + this.windDir = '���������' + } else if (windDirs === 180) { + this.windDir = '������' + } else if (windDirs > 180 && windDirs < 270) { + this.windDir = '���������' + } else if (windDirs === 270) { + this.windDir = '������' + } else if (windDirs > 270 && windDirs < 360) { + this.windDir = '���������' + } + } + this.alarmColour = {} + this.alarmProgress = {} + this.alarmBg = {} + // ������������ + for (const key in this.wsData2) { + if (this.chartSensorKey && key === this.chartSensorKey[0].sensorCode) { + this.chartSensorKey[0].value = this.wsData2[key] + } + for (const keys in this.alarmLevel) { + // ��������������������� + if (key === keys && JSON.parse(this.alarmLevel[keys])) { + if (parseFloat(this.wsData2[key]) >= parseFloat(JSON.parse(this.alarmLevel[keys])[5])) { + this.alarmColour[keys] = '#000000' + this.alarmBg[keys] = 5 + } else if (parseFloat(this.wsData2[key]) >= parseFloat(JSON.parse(this.alarmLevel[keys])[4])) { + this.alarmColour[keys] = '#c00261' + this.alarmBg[keys] = 4 + } else if (parseFloat(this.wsData2[key]) >= parseFloat(JSON.parse(this.alarmLevel[keys])[3])) { + this.alarmColour[keys] = '#fc0101' + this.alarmBg[keys] = 3 + } else if (parseFloat(this.wsData2[key]) >= parseFloat(JSON.parse(this.alarmLevel[keys])[2])) { + this.alarmColour[keys] = '#ff8202' + this.alarmBg[keys] = 2 + } else if (parseFloat(this.wsData2[key]) >= parseFloat(JSON.parse(this.alarmLevel[keys])[1])) { + this.alarmColour[keys] = '#fdff00' + this.alarmBg[keys] = 1 + } else { + this.alarmColour[keys] = '#00ff01' + this.alarmBg[keys] = 0 + } + } else if (key === keys) { + this.alarmColour[keys] = '#00ff01' + this.alarmBg[keys] = 0 + } + // ������������������������ + if (key === keys && JSON.parse(this.alarmLevel[keys])) { + if (JSON.parse(this.alarmLevel[keys])[5]) { + const percentage = Math.round( + (parseFloat(this.wsData2[key]) / parseFloat(JSON.parse(this.alarmLevel[keys])[ + 5])) * 100) + this.alarmProgress[keys] = percentage + } else if (JSON.parse(this.alarmLevel[keys])[4]) { + const percentage = Math.round( + (parseFloat(this.wsData2[key]) / parseFloat(JSON.parse(this.alarmLevel[keys])[ + 4])) * 100) + this.alarmProgress[keys] = percentage + } else if (JSON.parse(this.alarmLevel[keys])[3]) { + const percentage = Math.round( + (parseFloat(this.wsData2[key]) / parseFloat(JSON.parse(this.alarmLevel[keys])[ + 3])) * 100) + this.alarmProgress[keys] = percentage + } else if (JSON.parse(this.alarmLevel[keys])[2]) { + const percentage = Math.round( + (parseFloat(this.wsData2[key]) / parseFloat(JSON.parse(this.alarmLevel[keys])[ + 2])) * 100) + this.alarmProgress[keys] = percentage + } else if (JSON.parse(this.alarmLevel[keys])[1]) { + const percentage = Math.round( + (parseFloat(this.wsData2[key]) / parseFloat(JSON.parse(this.alarmLevel[keys])[ + 1])) * 100) + this.alarmProgress[keys] = percentage + } else if (JSON.parse(this.alarmLevel[keys])[0]) { + const percentage = Math.round( + (parseFloat(this.wsData2[key]) / parseFloat(JSON.parse(this.alarmLevel[keys])[ + 0])) * 100) + this.alarmProgress[keys] = percentage + } + } else if (key === keys) { + this.alarmProgress[keys] = 0 + } + if (this.alarmProgress[keys] > 100) { + this.alarmProgress[keys] = 100 + } + } + } + // ������������������������������������ + for (let i = 0; i < this.totalArray.length; i++) { + for (const key in this.wsData2) { + if (key !== 'time') { + // ��������������������� + var tempDecimal = this.wsData2[key].replace(/[^\d.]/g, '').split('.')[1] + if (this.totalArray[i].sensorCode === key) { + // ��������������������������� + if (this.totalArray[i].sensorCode === 'a19002') { + this.totalArray[i].value = parseInt(this.wsData2[key]) + } else if (this.totalArray[i].sensorCode === 'a01002') { + this.totalArray[i].value = parseInt(this.wsData2[key]) + '%' + // ������TVOCQ������������������������������������������������ + } else if (this.totalArray[i].sensorCode !== 'a99054' && Number(tempDecimal) === 0) { + this.totalArray[i].value = parseInt(this.wsData2[key]) + this.wsData2[key].split(' ')[ + 1] + } else { + this.totalArray[i].value = this.wsData2[key] + } + } + } + } + for (const key in this.alarmProgress) { + if (this.totalArray[i].sensorCode === key) { + this.totalArray[i].alarm = this.alarmProgress[key] + } + } + console.log('this.totalArray', this.totalArray) + console.log('this.alarmColour', this.alarmColour) + for (const key in this.alarmColour) { + if (this.totalArray[i].sensorCode === key) { + this.totalArray[i].colour = this.alarmColour[key] + } + } + for (const key in this.alarmBg) { + if (this.totalArray[i].sensorCode === key) { + this.totalArray[i].bg = this.alarmBg[key] + } + } + } + }, + //������websocket + connectSocket() { + if (!this.isLoading) { + this.socketTask.close() + this.socketTask = null + } + this.baseUrl = this.$storage.get('baseUrl') + let that = this + let socketUrl = this.baseUrl + '/singleDevice/' + this.macName + socketUrl = socketUrl.replace('https', 'wss').replace('http', 'ws') + console.log('������������websocket') + this.socketTask = uni.connectSocket({ + url: socketUrl, + success(res) { + console.log('websocket������������') + that.isLoading = true + }, + fail(err) { + console.log('������', err) + } + }, ) + this.socketTask.onOpen(function(res) { + console.log('WebSocket������������������') + that.isLoading = true + // that.getStatus() + // that.heart() + }) + this.socketTask.onMessage(function(res) { + console.log('������������������������' + res.data) + that.handlerMsg(res) //������������������������������������������ + }) + this.socketTask.onError(function(res) { + console.log('WebSocket���������������������������������') + console.log(res) + // this.isSuccess = false + // that.connectSocket() + //������������������ + that.reconnect() + }) + // // ������������������ - + this.socketTask.onClose(e => { + console.log('WebSocket���������������') + clearInterval(that.timer) + that.timer = '' + if (!that.isClose) { + that.reconnect() + } + }) + console.log(this.socketTask) + }, + //������������������ + reconnect() { + console.log('������������������') + this.socketTask.close() + this.socketTask = null + if (this.isLoading) { + this.connectSocket() + } + }, + //������������ + sendSocketMessage(msg) { + console.log('������������') + console.log(msg) + return new Promise((reslove, reject) => { + this.socketTask.send({ + data: msg, + success(res) { + console.log('������������') + reslove(res) + }, + fail(res) { + console.log('������������') + console.log(res) + reject(res) + } + }) + }) + }, + //������ + heart() { + let that = this + clearInterval(this.timer) + this.timer = '' + let msg = { + 'type': 'heartbeat', + } + this.timer = setInterval(() => { + that.sendSocketMessage(JSON.stringify(msg)).then(res => { + console.log('������������') + }).catch(res => { + console.log('������������') + console.log((res)) + }) + }, 2000) + }, + beforeDestroy() { + if (this.socketTask) { + this.socketTask.close() + this.socketTask = null + } + if (this.timer) { + clearInterval(this.timer) // ���Vue������������������������������������������ + } + }, + } + } +</script> +<style scoped lang="scss"> + .rootBg { + min-height: 100%; + color: #fff; + /* ��������������������������������� */ + background-position: center center; + /* ������������������ */ + background-repeat: no-repeat; + /* ���������������������������������������������������������������������viewport������ */ + background-attachment: fixed; + /* ������������������������������������ */ + background-size: cover; + background-image: url('data:image/jpeg;base64,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se1AznigBXAGMU7aMUw570vzYoAFAOaRgAeKBntSEHPNAEm0YpqAGk+bHtQM54oAGAB4pwUYpNuQSTyKQbscUAKo5NTWygXtv/10X+dVxnPHWp7XP263z/z0X+dDGh13/wAftx/10b+dQ96sXo/02f8A66N/OoMUlsUFFAGT1opiEpaAKX60hiYopTz2ooASilxRQIbS0uKMUANopcUYoASloo60wAUUuKVcA8jPtSEJxTgBtznn0ptLQAtLSAU4UAKjsn3TSMSxyeTRRQAlFLS0ANoxTsUYoENxRS0YoATFLRRTATFKAMHP4UUUhAqFs47cmk7UtJQAYGaDjPtSUUwCkpaSgAooxRQAUoxjmkpaAFU4NK5BGKaBk4pzKAMigAUgDFJkb80qqCM0m35sUAOZhtoVgBikZQBkUqoMZoEJuG7PalYgrxQmElBIDAdjQ4HJ6UgFVhtpA2HyKFUY5oC/NigBXbceTye9OyBxnpTXTC7gOKAoxQIQEbiaVyMYo2jdgE496GUAcUDHKUxycACmBhuz604KMUwjBoAc5GKbR6ZoOM8dKACigiigAooFL+HFMQlLn5SMD60maKAEooooAKKVVLZI7cmkoEFFFFAC0lFFACqpY4H60UlOU7WzgH2oAbQaO9FADi25QMAbfTvTaMUUAGaWhlCtjIPuKTvQAtGaSlBI6UAFFJRQAtHJ6mikoELSUUoFACUUUUAFFFFABR2oooAKWijk9KACiiigBy43c0r4xTKKAJFI200Eb6UKMUm35sUgFfGKUEYprKAM0BRimAKcOaHIx70gX5iKVxgZoAchHGenem5XzG28L2oCjFH3m57elAwcjHvSgjFNZcDNNoAD1ooooASilpKACiikoAWiiigAooooAKKKKAEpe1JR2oAKKKKAClIwaONvQ59aCSxyetACUUUUDCneU2wPjIPpTaAzDoSKAEooooAVSo+8M0lFFAB3opKWgBKO9FFABRRSUDCiiigAooooAKKKKACiiigYlFFLxigBKKKKACiiigABIzjvSUtJQAUY4zRRQMKMcZ7UGkoAWkpcUlAEgYYpoYbiacFG3kU0AbiKAFZgRxShhikZQBxShRigBqsNxJ70OQeBQoG4+1DgDpQA4MMU1SAc07aMU1QCaABiCKdvGOtNYACnbRigBqnmhiCKRRk0rgADFAC7hikVgCc0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'); + } + + .boxPadd { + padding: 5px 10px; + } + + /deep/.u-line-progress__text { + color: #000 !important; + } + + /deep/.u-radio-group--row { + justify-content: center; + } + + .ridoa { + text-align: center; + padding: 10px 0px; + } + + /deep/.placeholderColor { + color: #fff; + } + + /deep/.u-form { + display: flex; + justify-content: space-evenly; + } + + .slot-content { + width: 80%; + } + + /deep/.u-cell__body, + /deep/.u-cell__title-text, + /deep/.u-cell__value { + color: #fff !important; + } + + .ridioBox { + margin-bottom: 10px; + } +</style> \ No newline at end of file diff --git a/pages/actionChange/secondLevelData/parameter.json b/pages/actionChange/secondLevelData/parameter.json new file mode 100644 index 0000000..ddf93f4 --- /dev/null +++ b/pages/actionChange/secondLevelData/parameter.json @@ -0,0 +1,44 @@ +{ + "flylon": "������", + "a00e12": "������������", + "a00e34": "TSP", + "a00e13": "������", + "a21005": "������������", + "a21004": "������������", + "a21026": "������������", + "a21028": "���������", + "flyhig": "������", + "a21001": "������", + "a40002": "���������", + "a21022": "������", + "a00e19": "������������", + "a40001": "������������", + "a01001": "������", + "a25005": "���������", + "a05024": "������", + "a21024": "���������", + "a40003": "������������", + "a25003": "������", + "a01002": "������", + "a25002": "���", + "a23001": "������", + "a01007": "������", + "a01006": "������", + "a01008": "������", + "a30001": "������", + "a19002": "������������", + "a19001": "������", + "a34002": "PM10", + "a34004": "PM2.5", + "dustld": "���������", + "PORRST": "������������", + "a00e03": "���������0.3", + "a00e04": "���������2.5", + "a06001": "������", + "a99054": "TVOC", + "a35e21": "���������", + "a01011": "������������", + "a24088": "���������������", + "flylat": "������", + "a31001": "������" +} \ No newline at end of file diff --git a/pages/login/login.vue b/pages/login/login.vue index 04a8c27..97bcf15 100644 --- a/pages/login/login.vue +++ b/pages/login/login.vue @@ -29,6 +29,7 @@ <u-button @click="submit">������</u-button> </view> </view> + <ws-wx-privacy id="privacy-popup" enableAutoProtocol></ws-wx-privacy> </view> </template> <script> @@ -44,6 +45,7 @@ export default { data() { return { + titlePrivacy: '������������������������', labelStyle: { color: '#fff' }, @@ -81,9 +83,23 @@ uni.hideHomeButton() }, methods: { + doRequire() { + uni.requirePrivacyAuthorize({ + success: () => { + console.log('������') + // ������������������ + // ��������������������� + this.getlogin() + }, + fail: () => { + console.log('������') + }, // ������������������ + complete: () => {} + }) + }, submit() { this.$refs.uForm.validate().then(res => { - this.getlogin() + this.doRequire() }).catch(errors => {}) }, //������ diff --git a/static/img/headSculpture.png b/static/img/headSculpture.png deleted file mode 100644 index 479675f..0000000 --- a/static/img/headSculpture.png +++ /dev/null Binary files differ diff --git a/static/img/shouye.png b/static/img/shouye.png deleted file mode 100644 index 6cc733a..0000000 --- a/static/img/shouye.png +++ /dev/null Binary files differ diff --git a/static/img/shouyeClick.png b/static/img/shouyeClick.png deleted file mode 100644 index f0effdd..0000000 --- a/static/img/shouyeClick.png +++ /dev/null Binary files differ diff --git a/static/img/wode-.png b/static/img/wode-.png deleted file mode 100644 index bcc3f2f..0000000 --- a/static/img/wode-.png +++ /dev/null Binary files differ diff --git a/static/img/wodeClick.png b/static/img/wodeClick.png deleted file mode 100644 index 6687d89..0000000 --- a/static/img/wodeClick.png +++ /dev/null Binary files differ diff --git a/static/img/xinjian.png b/static/img/xinjian.png deleted file mode 100644 index 0449374..0000000 --- a/static/img/xinjian.png +++ /dev/null Binary files differ diff --git a/static/img/xinjianClick.png b/static/img/xinjianClick.png deleted file mode 100644 index 69439e8..0000000 --- a/static/img/xinjianClick.png +++ /dev/null Binary files differ diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md new file mode 100644 index 0000000..bc59f07 --- /dev/null +++ b/uni_modules/uni-popup/changelog.md @@ -0,0 +1,68 @@ +## 1.8.3���2023-04-17��� +- ������ uni-popup ������������������ bug +## 1.8.2���2023-02-02��� +- uni-popup-dialog ������������ inputType ������ +## 1.8.1���2022-12-01��� +- ������ nvue ��� v-show ������ +## 1.8.0���2022-11-29��� +- ������ ������������ +## 1.7.9���2022-04-02��� +- ������ ������������������������������bug +## 1.7.8���2022-03-28��� +- ������ ���������������������������bug +## 1.7.7���2022-03-17��� +- ������ ������������open���������������Bug +## 1.7.6���2022-02-14��� +- ������ safeArea ���������������������false���bug +## 1.7.5���2022-01-19��� +- ������ isMaskClick ���������bug +## 1.7.4���2022-01-19��� +- ������ cancelText \ confirmText ������ ��������������������� +- ������ maskBackgroundColor ������ ��������������������������� +- ������ maskClick������ ��������� isMaskClick ��������������������������������������� +## 1.7.3���2022-01-13��� +- ������ ������ safeArea ������������������bug +## 1.7.2���2021-11-26��� +- ������ ������������ +## 1.7.1���2021-11-26��� +- ������ vuedoc ������������ +## 1.7.0���2021-11-19��� +- ������ ������UI���������������������������������:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- ���������������������:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup) +## 1.6.2���2021-08-24��� +- ������ ��������������� +## 1.6.1���2021-07-30��� +- ������ vue3������������������������ +## 1.6.0���2021-07-13��� +- ������������ vue3���������������vue3��������������� [uni-app ������������ vue3 ������](https://ask.dcloud.net.cn/article/37834) +## 1.5.0���2021-06-23��� +- ������ mask-click ��������������������� +## 1.4.5���2021-06-22��� +- ������ nvue ���������������������������������������������������������������������Bug +## 1.4.4���2021-06-18��� +- ������ H5���������������������������������������������������������������������Bug +## 1.4.3���2021-06-08��� +- ������ ��������� watch ������ +- ������ safeArea ������������������������ +- ������ ���������������������������������������������Bug +## 1.4.2���2021-05-12��� +- ������ ������������������ +## 1.4.1���2021-04-29��� +- ������ ��������������� input ���textarea ������������������������������ +## 1.4.0 ���2021-04-29��� +- ������ type ��������� left\right ������������������������ +- ������ open(String:type) ������������ ��������������� type ������ ��������������������������������������� +- ������ backgroundColor ������������������������������������,������������������������ +- ������ safeArea ������������������������������������ +- ������ App\h5\���������������������������������������������Bug +- ������ App ������������������Bug +- ������ ��������������������������������������������������� +- ������ ��������������������������������� +## 1.2.9���2021-02-05��� +- ������ ���������������������������uni_modules������������ +## 1.2.8���2021-02-05��� +- ���������uni_modules������������ +## 1.2.7���2021-02-05��� +- ���������uni_modules������������ +- ������ ������ PC ��� +- ������ uni-popup-message ���uni-popup-dialog������������������ PC ��� diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // ��������������������������������� + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue new file mode 100644 index 0000000..b5eee79 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -0,0 +1,275 @@ +<template> + <view class="uni-popup-dialog"> + <view class="uni-dialog-title"> + <text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{titleText}}</text> + </view> + <view v-if="mode === 'base'" class="uni-dialog-content"> + <slot> + <text class="uni-dialog-content-text">{{content}}</text> + </slot> + </view> + <view v-else class="uni-dialog-content"> + <slot> + <input class="uni-dialog-input" v-model="val" :type="inputType" :placeholder="placeholderText" :focus="focus" > + </slot> + </view> + <view class="uni-dialog-button-group"> + <view class="uni-dialog-button" @click="closeDialog"> + <text class="uni-dialog-button-text">{{closeText}}</text> + </view> + <view class="uni-dialog-button uni-border-left" @click="onOk"> + <text class="uni-dialog-button-text uni-button-color">{{okText}}</text> + </view> + </view> + + </view> +</template> + +<script> + import popup from '../uni-popup/popup.js' + import { + initVueI18n + } from '@dcloudio/uni-i18n' + import messages from '../uni-popup/i18n/index.js' + const { t } = initVueI18n(messages) + /** + * PopUp ���������-��������������� + * @description ���������-��������������� + * @tutorial https://ext.dcloud.net.cn/plugin?id=329 + * @property {String} value input ��������������������� + * @property {String} placeholder input ��������������������� + * @property {String} type = [success|warning|info|error] ������������ + * @value success ������ + * @value warning ������ + * @value info ������ + * @value error ������ + * @property {String} mode = [base|input] ��������� + * @value base ��������������� + * @value input ������������������ + * @property {String} content ��������������� + * @property {Boolean} beforeClose ������������������������ + * @event {Function} confirm ������������������������ + * @event {Function} close ������������������������ + */ + + export default { + name: "uniPopupDialog", + mixins: [popup], + emits:['confirm','close'], + props: { + inputType:{ + type: String, + default: 'text' + }, + value: { + type: [String, Number], + default: '' + }, + placeholder: { + type: [String, Number], + default: '' + }, + type: { + type: String, + default: 'error' + }, + mode: { + type: String, + default: 'base' + }, + title: { + type: String, + default: '' + }, + content: { + type: String, + default: '' + }, + beforeClose: { + type: Boolean, + default: false + }, + cancelText:{ + type: String, + default: '' + }, + confirmText:{ + type: String, + default: '' + } + }, + data() { + return { + dialogType: 'error', + focus: false, + val: "" + } + }, + computed: { + okText() { + return this.confirmText || t("uni-popup.ok") + }, + closeText() { + return this.cancelText || t("uni-popup.cancel") + }, + placeholderText() { + return this.placeholder || t("uni-popup.placeholder") + }, + titleText() { + return this.title || t("uni-popup.title") + } + }, + watch: { + type(val) { + this.dialogType = val + }, + mode(val) { + if (val === 'input') { + this.dialogType = 'info' + } + }, + value(val) { + this.val = val + } + }, + created() { + // ��������������������������� + this.popup.disableMask() + // this.popup.closeMask() + if (this.mode === 'input') { + this.dialogType = 'info' + this.val = this.value + } else { + this.dialogType = this.type + } + }, + mounted() { + this.focus = true + }, + methods: { + /** + * ������������������ + */ + onOk() { + if (this.mode === 'input'){ + this.$emit('confirm', this.val) + }else{ + this.$emit('confirm') + } + if(this.beforeClose) return + this.popup.close() + }, + /** + * ������������������ + */ + closeDialog() { + this.$emit('close') + if(this.beforeClose) return + this.popup.close() + }, + close(){ + this.popup.close() + } + } + } +</script> + +<style lang="scss" > + .uni-popup-dialog { + width: 300px; + border-radius: 11px; + background-color: #fff; + } + + .uni-dialog-title { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: center; + padding-top: 25px; + } + + .uni-dialog-title-text { + font-size: 16px; + font-weight: 500; + } + + .uni-dialog-content { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: center; + align-items: center; + padding: 20px; + } + + .uni-dialog-content-text { + font-size: 14px; + color: #6C6C6C; + } + + .uni-dialog-button-group { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + border-top-color: #f5f5f5; + border-top-style: solid; + border-top-width: 1px; + } + + .uni-dialog-button { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + + flex: 1; + flex-direction: row; + justify-content: center; + align-items: center; + height: 45px; + } + + .uni-border-left { + border-left-color: #f0f0f0; + border-left-style: solid; + border-left-width: 1px; + } + + .uni-dialog-button-text { + font-size: 16px; + color: #333; + } + + .uni-button-color { + color: #007aff; + } + + .uni-dialog-input { + flex: 1; + font-size: 14px; + border: 1px #eee solid; + height: 40px; + padding: 0 10px; + border-radius: 5px; + color: #555; + } + + .uni-popup__success { + color: #4cd964; + } + + .uni-popup__warn { + color: #f0ad4e; + } + + .uni-popup__error { + color: #dd524d; + } + + .uni-popup__info { + color: #909399; + } +</style> diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 0000000..91370a8 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ +<template> + <view class="uni-popup-message"> + <view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type"> + <slot> + <text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text> + </slot> + </view> + </view> +</template> + +<script> + import popup from '../uni-popup/popup.js' + /** + * PopUp ���������-������������ + * @description ���������-������������ + * @tutorial https://ext.dcloud.net.cn/plugin?id=329 + * @property {String} type = [success|warning|info|error] ������������ + * @value success ������ + * @value warning ������ + * @value info ������ + * @value error ������ + * @property {String} message ������������������ + * @property {String} duration ������������������������ 0 ��������������������� + */ + + export default { + name: 'uniPopupMessage', + mixins:[popup], + props: { + /** + * ������ success/warning/info/error ������ success + */ + type: { + type: String, + default: 'success' + }, + /** + * ������������ + */ + message: { + type: String, + default: '' + }, + /** + * ������������������������ 0 ��������������������� + */ + duration: { + type: Number, + default: 3000 + }, + maskShow:{ + type:Boolean, + default:false + } + }, + data() { + return {} + }, + created() { + this.popup.maskShow = this.maskShow + this.popup.messageChild = this + }, + methods: { + timerClose(){ + if(this.duration === 0) return + clearTimeout(this.timer) + this.timer = setTimeout(()=>{ + this.popup.close() + },this.duration) + } + } + } +</script> +<style lang="scss" > + .uni-popup-message { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: center; + } + + .uni-popup-message__box { + background-color: #e1f3d8; + padding: 10px 15px; + border-color: #eee; + border-style: solid; + border-width: 1px; + flex: 1; + } + + @media screen and (min-width: 500px) { + .fixforpc-width { + margin-top: 20px; + border-radius: 4px; + flex: none; + min-width: 380px; + /* #ifndef APP-NVUE */ + max-width: 50%; + /* #endif */ + /* #ifdef APP-NVUE */ + max-width: 500px; + /* #endif */ + } + } + + .uni-popup-message-text { + font-size: 14px; + padding: 0; + } + + .uni-popup__success { + background-color: #e1f3d8; + } + + .uni-popup__success-text { + color: #67C23A; + } + + .uni-popup__warn { + background-color: #faecd8; + } + + .uni-popup__warn-text { + color: #E6A23C; + } + + .uni-popup__error { + background-color: #fde2e2; + } + + .uni-popup__error-text { + color: #F56C6C; + } + + .uni-popup__info { + background-color: #F2F6FC; + } + + .uni-popup__info-text { + color: #909399; + } +</style> diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 0000000..5be7624 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,187 @@ +<template> + <view class="uni-popup-share"> + <view class="uni-share-title"><text class="uni-share-title-text">{{shareTitleText}}</text></view> + <view class="uni-share-content"> + <view class="uni-share-content-box"> + <view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)"> + <image class="uni-share-image" :src="item.icon" mode="aspectFill"></image> + <text class="uni-share-text">{{item.text}}</text> + </view> + + </view> + </view> + <view class="uni-share-button-box"> + <button class="uni-share-button" @click="close">{{cancelText}}</button> + </view> + </view> +</template> + +<script> + import popup from '../uni-popup/popup.js' + import { + initVueI18n + } from '@dcloudio/uni-i18n' + import messages from '../uni-popup/i18n/index.js' + const { t } = initVueI18n(messages) + export default { + name: 'UniPopupShare', + mixins:[popup], + emits:['select'], + props: { + title: { + type: String, + default: '' + }, + beforeClose: { + type: Boolean, + default: false + } + }, + data() { + return { + bottomData: [{ + text: '������', + icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png', + name: 'wx' + }, + { + text: '���������', + icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png', + name: 'wx' + }, + { + text: 'QQ', + icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.png', + name: 'qq' + }, + { + text: '������', + icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png', + name: 'sina' + }, + // { + // text: '������', + // icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png', + // name: 'copy' + // }, + // { + // text: '������', + // icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png', + // name: 'more' + // } + ] + } + }, + created() {}, + computed: { + cancelText() { + return t("uni-popup.cancel") + }, + shareTitleText() { + return this.title || t("uni-popup.shareTitle") + } + }, + methods: { + /** + * ������������ + */ + select(item, index) { + this.$emit('select', { + item, + index + }) + this.close() + + }, + /** + * ������������ + */ + close() { + if(this.beforeClose) return + this.popup.close() + } + } + } +</script> +<style lang="scss" > + .uni-popup-share { + background-color: #fff; + border-top-left-radius: 11px; + border-top-right-radius: 11px; + } + .uni-share-title { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + align-items: center; + justify-content: center; + height: 40px; + } + .uni-share-title-text { + font-size: 14px; + color: #666; + } + .uni-share-content { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: center; + padding-top: 10px; + } + + .uni-share-content-box { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + flex-wrap: wrap; + width: 360px; + } + + .uni-share-content-item { + width: 90px; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + justify-content: center; + padding: 10px 0; + align-items: center; + } + + .uni-share-content-item:active { + background-color: #f5f5f5; + } + + .uni-share-image { + width: 30px; + height: 30px; + } + + .uni-share-text { + margin-top: 10px; + font-size: 14px; + color: #3B4144; + } + + .uni-share-button-box { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + padding: 10px 15px; + } + + .uni-share-button { + flex: 1; + border-radius: 50px; + color: #666; + font-size: 16px; + } + + .uni-share-button::after { + border-radius: 50px; + } +</style> diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 0000000..7f1bd06 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "cancel", + "uni-popup.ok": "ok", + "uni-popup.placeholder": "pleace enter", + "uni-popup.title": "Hint", + "uni-popup.shareTitle": "Share to" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 0000000..5e3003c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "������", + "uni-popup.ok": "������", + "uni-popup.placeholder": "���������", + "uni-popup.title": "������", + "uni-popup.shareTitle": "���������" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 0000000..13e39eb --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "������", + "uni-popup.ok": "������", + "uni-popup.placeholder": "���������", + "uni-popup.title": "������", + "uni-popup.shareTitle": "���������" +} diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // ��������������������������������� + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 0000000..c4e5781 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -0,0 +1,26 @@ + +export default { + data() { + return { + + } + }, + created(){ + this.popup = this.getParent() + }, + methods:{ + /** + * ��������������������� + */ + getParent(name = 'uniPopup') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..54afee2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,473 @@ +<template> + <view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']"> + <view @touchstart="touchstart"> + <uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass" + :duration="duration" :show="showTrans" @click="onTap" /> + <uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration" + :show="showTrans" @click="onTap"> + <view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear"> + <slot /> + </view> + </uni-transition> + </view> + <!-- #ifdef H5 --> + <keypress v-if="maskShow" @esc="onTap" /> + <!-- #endif --> + </view> +</template> + +<script> + // #ifdef H5 + import keypress from './keypress.js' + // #endif + + /** + * PopUp ��������� + * @description ��������������������������������������������������� + * @tutorial https://ext.dcloud.net.cn/plugin?id=329 + * @property {String} type = [top|center|bottom|left|right|message|dialog|share] ������������ + * @value top ������������ + * @value center ������������ + * @value bottom ������������ + * @value left ������������ + * @value right ������������ + * @value message ������������ + * @value dialog ��������� + * @value share ������������������ + * @property {Boolean} animation = [true|false] ������������������ + * @property {Boolean} maskClick = [true|false] ������������������������������(������) + * @property {Boolean} isMaskClick = [true|false] ������������������������������ + * @property {String} backgroundColor ������������������ + * @property {String} maskBackgroundColor ������������ + * @property {Boolean} safeArea ��������������������������� + * @event {Function} change ���������������������������e={show: false} + * @event {Function} maskClick ������������������ + */ + + export default { + name: 'uniPopup', + components: { + // #ifdef H5 + keypress + // #endif + }, + emits: ['change', 'maskClick'], + props: { + // ������������ + animation: { + type: Boolean, + default: true + }, + // ������������������������������top: ������������������bottom���������������������center������������������ + // message: ������������ ; dialog : ��������� + type: { + type: String, + default: 'center' + }, + // maskClick + isMaskClick: { + type: Boolean, + default: null + }, + // TODO 2 ������������������������ ��������� isMaskClick + maskClick: { + type: Boolean, + default: null + }, + backgroundColor: { + type: String, + default: 'none' + }, + safeArea: { + type: Boolean, + default: true + }, + maskBackgroundColor: { + type: String, + default: 'rgba(0, 0, 0, 0.4)' + }, + }, + + watch: { + /** + * ������type������ + */ + type: { + handler: function(type) { + if (!this.config[type]) return + this[this.config[type]](true) + }, + immediate: true + }, + isDesktop: { + handler: function(newVal) { + if (!this.config[newVal]) return + this[this.config[this.type]](true) + }, + immediate: true + }, + /** + * ��������������������������� + * @param {Object} val + */ + maskClick: { + handler: function(val) { + this.mkclick = val + }, + immediate: true + }, + isMaskClick: { + handler: function(val) { + this.mkclick = val + }, + immediate: true + }, + // H5 ��������������������� + showPopup(show) { + // #ifdef H5 + // fix by mehaotian ������ h5 ��������������������� + document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible' + // #endif + } + }, + data() { + return { + duration: 300, + ani: [], + showPopup: false, + showTrans: false, + popupWidth: 0, + popupHeight: 0, + config: { + top: 'top', + bottom: 'bottom', + center: 'center', + left: 'left', + right: 'right', + message: 'top', + dialog: 'center', + share: 'bottom' + }, + maskClass: { + position: 'fixed', + bottom: 0, + top: 0, + left: 0, + right: 0, + backgroundColor: 'rgba(0, 0, 0, 0.4)' + }, + transClass: { + position: 'fixed', + left: 0, + right: 0 + }, + maskShow: true, + mkclick: true, + popupstyle: this.isDesktop ? 'fixforpc-top' : 'top' + } + }, + computed: { + isDesktop() { + return this.popupWidth >= 500 && this.popupHeight >= 500 + }, + bg() { + if (this.backgroundColor === '' || this.backgroundColor === 'none') { + return 'transparent' + } + return this.backgroundColor + } + }, + mounted() { + const fixSize = () => { + const { + windowWidth, + windowHeight, + windowTop, + safeArea, + screenHeight, + safeAreaInsets + } = uni.getSystemInfoSync() + this.popupWidth = windowWidth + this.popupHeight = windowHeight + (windowTop || 0) + // TODO fix by mehaotian ��������������������������� ,������������ios ������ app ios ������������������������������������ + if (safeArea && this.safeArea) { + // #ifdef MP-WEIXIN + this.safeAreaInsets = screenHeight - safeArea.bottom + // #endif + // #ifndef MP-WEIXIN + this.safeAreaInsets = safeAreaInsets.bottom + // #endif + } else { + this.safeAreaInsets = 0 + } + } + fixSize() + // #ifdef H5 + // window.addEventListener('resize', fixSize) + // this.$once('hook:beforeDestroy', () => { + // window.removeEventListener('resize', fixSize) + // }) + // #endif + }, + // #ifndef VUE3 + // TODO vue2 + destroyed() { + this.setH5Visible() + }, + // #endif + // #ifdef VUE3 + // TODO vue3 + unmounted() { + this.setH5Visible() + }, + // #endif + created() { + // this.mkclick = this.isMaskClick || this.maskClick + if (this.isMaskClick === null && this.maskClick === null) { + this.mkclick = true + } else { + this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick + } + if (this.animation) { + this.duration = 300 + } else { + this.duration = 0 + } + // TODO ������ message ��������������������������������� + this.messageChild = null + // TODO ��������������������������� + this.clearPropagation = false + this.maskClass.backgroundColor = this.maskBackgroundColor + }, + methods: { + setH5Visible() { + // #ifdef H5 + // fix by mehaotian ������ h5 ��������������������� + document.getElementsByTagName('body')[0].style.overflow = 'visible' + // #endif + }, + /** + * ��������������������������������� + */ + closeMask() { + this.maskShow = false + }, + /** + * ������������������������������������ + */ + disableMask() { + this.mkclick = false + }, + // TODO nvue ������������ + clear(e) { + // #ifndef APP-NVUE + e.stopPropagation() + // #endif + this.clearPropagation = true + }, + + open(direction) { + // fix by mehaotian ��������������������������������� + if (this.showPopup) { + return + } + let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share'] + if (!(direction && innerType.indexOf(direction) !== -1)) { + direction = this.type + } + if (!this.config[direction]) { + console.error('���������������', direction) + return + } + this[this.config[direction]]() + this.$emit('change', { + show: true, + type: direction + }) + }, + close(type) { + this.showTrans = false + this.$emit('change', { + show: false, + type: this.type + }) + clearTimeout(this.timer) + // // ��������������������� + // this.customOpen && this.customClose() + this.timer = setTimeout(() => { + this.showPopup = false + }, 300) + }, + // TODO ��������������������������������������������������� ������������������ + touchstart() { + this.clearPropagation = false + }, + + onTap() { + if (this.clearPropagation) { + // fix by mehaotian ������ nvue + this.clearPropagation = false + return + } + this.$emit('maskClick') + if (!this.mkclick) return + this.close() + }, + /** + * ������������������������ + */ + top(type) { + this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top' + this.ani = ['slide-top'] + this.transClass = { + position: 'fixed', + left: 0, + right: 0, + backgroundColor: this.bg + } + // TODO ������ type ������ ������������������ + if (type) return + this.showPopup = true + this.showTrans = true + this.$nextTick(() => { + if (this.messageChild && this.type === 'message') { + this.messageChild.timerClose() + } + }) + }, + /** + * ������������������������ + */ + bottom(type) { + this.popupstyle = 'bottom' + this.ani = ['slide-bottom'] + this.transClass = { + position: 'fixed', + left: 0, + right: 0, + bottom: 0, + paddingBottom: this.safeAreaInsets + 'px', + backgroundColor: this.bg + } + // TODO ������ type ������ ������������������ + if (type) return + this.showPopup = true + this.showTrans = true + }, + /** + * ������������������������ + */ + center(type) { + this.popupstyle = 'center' + this.ani = ['zoom-out', 'fade'] + this.transClass = { + position: 'fixed', + /* #ifndef APP-NVUE */ + display: 'flex', + flexDirection: 'column', + /* #endif */ + bottom: 0, + left: 0, + right: 0, + top: 0, + justifyContent: 'center', + alignItems: 'center' + } + // TODO ������ type ������ ������������������ + if (type) return + this.showPopup = true + this.showTrans = true + }, + left(type) { + this.popupstyle = 'left' + this.ani = ['slide-left'] + this.transClass = { + position: 'fixed', + left: 0, + bottom: 0, + top: 0, + backgroundColor: this.bg, + /* #ifndef APP-NVUE */ + display: 'flex', + flexDirection: 'column' + /* #endif */ + } + // TODO ������ type ������ ������������������ + if (type) return + this.showPopup = true + this.showTrans = true + }, + right(type) { + this.popupstyle = 'right' + this.ani = ['slide-right'] + this.transClass = { + position: 'fixed', + bottom: 0, + right: 0, + top: 0, + backgroundColor: this.bg, + /* #ifndef APP-NVUE */ + display: 'flex', + flexDirection: 'column' + /* #endif */ + } + // TODO ������ type ������ ������������������ + if (type) return + this.showPopup = true + this.showTrans = true + } + } + } +</script> +<style lang="scss"> + .uni-popup { + position: fixed; + /* #ifndef APP-NVUE */ + z-index: 99; + + /* #endif */ + &.top, + &.left, + &.right { + /* #ifdef H5 */ + top: var(--window-top); + /* #endif */ + /* #ifndef H5 */ + top: 0; + /* #endif */ + } + + .uni-popup__wrapper { + /* #ifndef APP-NVUE */ + display: block; + /* #endif */ + position: relative; + + /* iphonex ������������������������������������������ */ + /* #ifndef APP-NVUE */ + // padding-bottom: constant(safe-area-inset-bottom); + // padding-bottom: env(safe-area-inset-bottom); + /* #endif */ + &.left, + &.right { + /* #ifdef H5 */ + padding-top: var(--window-top); + /* #endif */ + /* #ifndef H5 */ + padding-top: 0; + /* #endif */ + flex: 1; + } + } + } + + .fixforpc-z-index { + /* #ifndef APP-NVUE */ + z-index: 999; + /* #endif */ + } + + .fixforpc-top { + top: 0; + } +</style> diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json new file mode 100644 index 0000000..f40556b --- /dev/null +++ b/uni_modules/uni-popup/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-popup", + "displayName": "uni-popup ���������", + "version": "1.8.3", + "description": " Popup ������������������������������", + "keywords": [ + "uni-ui", + "���������", + "������", + "popup", + "������" + ], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "���", + "data": "���", + "permissions": "���" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "���������������(Android)": "y", + "QQ���������(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "���������": { + "������": "y", + "������": "y", + "������": "y", + "������������": "y", + "QQ": "y" + }, + "���������": { + "������": "u", + "������": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md new file mode 100644 index 0000000..fdad4b3 --- /dev/null +++ b/uni_modules/uni-popup/readme.md @@ -0,0 +1,17 @@ + + +## Popup ��������� +> **������������uni-popup** +> ������������ `uPopup` +> ���������������`uni-transition` + + +��������������������������������������������������������������������������� + +### [������������](https://uniapp.dcloud.io/component/uniui/uni-popup) +#### ������������������������������������������������uni-ui������������������������������������ uni-ui ������������871950839 + + + + + diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md new file mode 100644 index 0000000..70c1cd4 --- /dev/null +++ b/uni_modules/uni-transition/changelog.md @@ -0,0 +1,22 @@ +## 1.3.2���2023-05-04��� +- ������ NVUE ��������������������� +## 1.3.1���2021-11-23��� +- ������ init ��������������������� +## 1.3.0���2021-11-19��� +- ������ ������UI���������������������������������:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- ���������������������:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) +## 1.2.1���2021-09-27��� +- ������ init ������������������ Bug +## 1.2.0���2021-07-30��� +- ������������ vue3��������������� vue3 ��������������� [uni-app ������������ vue3 ������](https://ask.dcloud.net.cn/article/37834) +## 1.1.1���2021-05-12��� +- ������ ������������ +- ������ ��������������������������� Bug +## 1.1.0���2021-04-22��� +- ������ ��������������������������� +- ������ custom-class ��� NVUE ��������������������� class ������������ +- ������ ��������������������������������������� +- ������ ��������������������������� +- ������ ������������ +## 1.0.2���2021-02-05��� +- ��������� uni_modules ������������ diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 0000000..8f89b18 --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -0,0 +1,131 @@ +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + // ���iOS10+QQ���������������������������������������������������������������������������Proxy���������������������parameter should be Object instead of ProxyObject��������� + this.animation = uni.createAnimation({ + ...options + }) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue new file mode 100644 index 0000000..bfbba93 --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -0,0 +1,286 @@ +<template> + <!-- #ifndef APP-NVUE --> + <view v-show="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view> + <!-- #endif --> + <!-- #ifdef APP-NVUE --> + <view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view> + <!-- #endif --> +</template> + +<script> +import { createAnimation } from './createAnimation' + +/** + * Transition ������������ + * @description ������������������������ + * @tutorial https://ext.dcloud.net.cn/plugin?id=985 + * @property {Boolean} show = [false|true] ��������������������������� + * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] ������������������ + * @value fade ������������������ + * @value slide-top ������������������ + * @value slide-right ������������������ + * @value slide-bottom ������������������ + * @value slide-left ������������������ + * @value zoom-in ������������������ + * @value zoom-out ������������������ + * @property {Number} duration ������������������������ + * @property {Object} styles ������������������ css ���������������������-������������������������������������������������������`backgroundColor:red` + */ +export default { + name: 'uniTransition', + emits:['click','change'], + props: { + show: { + type: Boolean, + default: false + }, + modeClass: { + type: [Array, String], + default() { + return 'fade' + } + }, + duration: { + type: Number, + default: 300 + }, + styles: { + type: Object, + default() { + return {} + } + }, + customClass:{ + type: String, + default: '' + }, + onceRender:{ + type:Boolean, + default:false + }, + }, + data() { + return { + isShow: false, + transform: '', + opacity: 1, + animationData: {}, + durationTime: 300, + config: {} + } + }, + watch: { + show: { + handler(newVal) { + if (newVal) { + this.open() + } else { + // ��������������������� close,������������������ + if (this.isShow) { + this.close() + } + } + }, + immediate: true + } + }, + computed: { + // ������������������ + stylesObject() { + let styles = { + ...this.styles, + 'transition-duration': this.duration / 1000 + 's' + } + let transform = '' + for (let i in styles) { + let line = this.toLine(i) + transform += line + ':' + styles[i] + ';' + } + return transform + }, + // ��������������������� + transformStyles() { + return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject + } + }, + created() { + // ������������������ + this.config = { + duration: this.duration, + timingFunction: 'ease', + transformOrigin: '50% 50%', + delay: 0 + } + this.durationTime = this.duration + }, + methods: { + /** + * ref ������ ��������������� + */ + init(obj = {}) { + if (obj.duration) { + this.durationTime = obj.duration + } + this.animation = createAnimation(Object.assign(this.config, obj),this) + }, + /** + * ������������������������ + */ + onClick() { + this.$emit('click', { + detail: this.isShow + }) + }, + /** + * ref ������ ������������ + * @param {Object} obj + */ + step(obj, config = {}) { + if (!this.animation) return + for (let i in obj) { + try { + if(typeof obj[i] === 'object'){ + this.animation[i](...obj[i]) + }else{ + this.animation[i](obj[i]) + } + } catch (e) { + console.error(`������ ${i} ���������`) + } + } + this.animation.step(config) + return this + }, + /** + * ref ������ ������������ + */ + run(fn) { + if (!this.animation) return + this.animation.run(fn) + }, + // ������������������ + open() { + clearTimeout(this.timer) + this.transform = '' + this.isShow = true + let { opacity, transform } = this.styleInit(false) + if (typeof opacity !== 'undefined') { + this.opacity = opacity + } + this.transform = transform + // ��������������������������������������������������������������� nextTick ������������ wx ������������������ + this.$nextTick(() => { + // TODO ��������������������������������������������������������������������������������� + this.timer = setTimeout(() => { + this.animation = createAnimation(this.config, this) + this.tranfromInit(false).step() + this.animation.run() + this.$emit('change', { + detail: this.isShow + }) + }, 20) + }) + }, + // ������������������ + close(type) { + if (!this.animation) return + this.tranfromInit(true) + .step() + .run(() => { + this.isShow = false + this.animationData = null + this.animation = null + let { opacity, transform } = this.styleInit(false) + this.opacity = opacity || 1 + this.transform = transform + this.$emit('change', { + detail: this.isShow + }) + }) + }, + // ������������������������������������ + styleInit(type) { + let styles = { + transform: '' + } + let buildStyle = (type, mode) => { + if (mode === 'fade') { + styles.opacity = this.animationType(type)[mode] + } else { + styles.transform += this.animationType(type)[mode] + ' ' + } + } + if (typeof this.modeClass === 'string') { + buildStyle(type, this.modeClass) + } else { + this.modeClass.forEach(mode => { + buildStyle(type, mode) + }) + } + return styles + }, + // ������������������������ + tranfromInit(type) { + let buildTranfrom = (type, mode) => { + let aniNum = null + if (mode === 'fade') { + aniNum = type ? 0 : 1 + } else { + aniNum = type ? '-100%' : '0' + if (mode === 'zoom-in') { + aniNum = type ? 0.8 : 1 + } + if (mode === 'zoom-out') { + aniNum = type ? 1.2 : 1 + } + if (mode === 'slide-right') { + aniNum = type ? '100%' : '0' + } + if (mode === 'slide-bottom') { + aniNum = type ? '100%' : '0' + } + } + this.animation[this.animationMode()[mode]](aniNum) + } + if (typeof this.modeClass === 'string') { + buildTranfrom(type, this.modeClass) + } else { + this.modeClass.forEach(mode => { + buildTranfrom(type, mode) + }) + } + + return this.animation + }, + animationType(type) { + return { + fade: type ? 1 : 0, + 'slide-top': `translateY(${type ? '0' : '-100%'})`, + 'slide-right': `translateX(${type ? '0' : '100%'})`, + 'slide-bottom': `translateY(${type ? '0' : '100%'})`, + 'slide-left': `translateX(${type ? '0' : '-100%'})`, + 'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`, + 'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})` + } + }, + // ��������������������������������������������� + animationMode() { + return { + fade: 'opacity', + 'slide-top': 'translateY', + 'slide-right': 'translateX', + 'slide-bottom': 'translateY', + 'slide-left': 'translateX', + 'zoom-in': 'scale', + 'zoom-out': 'scale' + } + }, + // ������������������ + toLine(name) { + return name.replace(/([A-Z])/g, '-$1').toLowerCase() + } + } +} +</script> + +<style></style> diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json new file mode 100644 index 0000000..ea995a2 --- /dev/null +++ b/uni_modules/uni-transition/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-transition", + "displayName": "uni-transition ������������", + "version": "1.3.2", + "description": "���������������������������", + "keywords": [ + "uni-ui", + "uniui", + "������", + "������", + "������������" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "���", + "data": "���", + "permissions": "���" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "���������������(Android)": "y", + "QQ���������(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "���������": { + "������": "y", + "������": "y", + "������": "y", + "������������": "y", + "QQ": "y" + }, + "���������": { + "������": "u", + "������": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md new file mode 100644 index 0000000..2f8a77e --- /dev/null +++ b/uni_modules/uni-transition/readme.md @@ -0,0 +1,11 @@ + + +## Transition ������������ +> **������������uni-transition** +> ������������ `uTransition` + + +������������������ + +### [������������](https://uniapp.dcloud.io/component/uniui/uni-transition) +#### ������������������������������������������������uni-ui������������������������������������ uni-ui ������������871950839 \ No newline at end of file diff --git a/uni_modules/ws-wx-privacy/changelog.md b/uni_modules/ws-wx-privacy/changelog.md new file mode 100644 index 0000000..cd77175 --- /dev/null +++ b/uni_modules/ws-wx-privacy/changelog.md @@ -0,0 +1,22 @@ +## 1.0.10���2023-09-12��� +������������������������������������������������������������������ +## 1.0.9���2023-09-11��� +��������������������������������������� +## 1.0.8���2023-09-11��� +������������������������������������ +## 1.0.7���2023-09-08��� +������������������ +## 1.0.6���2023-09-07��� +������������������������������������������disagreeEnabled���false������������������������������������disagreePromptText��������� +## 1.0.5���2023-09-05��� +## README������������������������������ +## 1.0.4���2023-09-02��� +������������������������������������������������������ +## 1.0.3���2023-09-01��� +# ��������� ������������������������������������������������������������������������������ +## 1.0.2���2023-09-01��� +������������������������������������������������ +## 1.0.1���2023-08-31��� +������������������������������������������������������������������������������������������ +## 1.0.0���2023-08-30��� +������������������������������������vue2���vue3 diff --git a/uni_modules/ws-wx-privacy/components/ws-wx-privacy/util.js b/uni_modules/ws-wx-privacy/components/ws-wx-privacy/util.js new file mode 100644 index 0000000..e6918ea --- /dev/null +++ b/uni_modules/ws-wx-privacy/components/ws-wx-privacy/util.js @@ -0,0 +1,51 @@ +/** + * ��������������������������� + * @returns ������������ + */ +export function getContext() { + // eslint-disable-next-line no-undef + const pages = getCurrentPages() + return pages[pages.length - 1] +} + +/** + * ������������������������������������ + * @param context ��������������������������������������������������������� this ��������������� + * @param selector ������������������������ + */ +export function getComponent(context, selector ) { + let component = null + // #ifdef H5 + context.$children.forEach((child) => { + if (`#${child.$attrs.id}` === selector) { + component = child + } else if (child.$children && child.$children.length) { + if (getComponent(child, selector)) { + component = getComponent(child, selector) + } + } + if (component) { + return component + } + }) + // #endif + // #ifdef MP-WEIXIN + component = context.selectComponent && context.selectComponent(selector) && context.selectComponent(selector).$vm + // #endif + + // #ifdef MP-ALIPAY + const alipay = context.$children ? context.$children : context.$vm && context.$vm.$children ? context.$vm + .$children : [] + component = alipay.find((component) => { + return `#${component.$scope.props.id}` === selector + }) + // #endif + // #ifdef APP-PLUS + const app = context.$children ? context.$children : context.$vm && context.$vm.$children ? context.$vm.$children : + [] + component = app.find((component) => { + return `#${component.$attrs.id}` === selector + }) + // #endif + return component +} \ No newline at end of file diff --git a/uni_modules/ws-wx-privacy/components/ws-wx-privacy/ws-wx-privacy.vue b/uni_modules/ws-wx-privacy/components/ws-wx-privacy/ws-wx-privacy.vue new file mode 100644 index 0000000..2b9dcd2 --- /dev/null +++ b/uni_modules/ws-wx-privacy/components/ws-wx-privacy/ws-wx-privacy.vue @@ -0,0 +1,287 @@ +<template> + <uni-popup id="privacy" type="center" ref="privacyPopup" :maskClick="false"> + <view class="ws-privacy-popup" :style="rootStyle"> + <view class="ws-privacy-popup__header"> + <!--������--> + <view class="ws-picker__title">{{ title }}</view> + </view> + <view class="ws-privacy-popup__container"> + <text>{{ desc }}</text> + <text class="ws-privacy-popup__container-protocol" :style="protocolStyle" + @click="openPrivacyContract">{{ privacyContractName||protocol }}</text> + <text>{{ subDesc }}</text> + </view> + <view class="ws-privacy-popup__footer"> + <button class="is-agree" :style="agreeStyle" id="agree-btn" open-type="agreePrivacyAuthorization" + @agreeprivacyauthorization="handleAgree"> + {{agreeText}} + </button> + <button class="is-disagree" id="disagree-btn" @click="handleDisagree"> + {{disagreeText}} + </button> + </view> + </view> + </uni-popup> +</template> +<script> + import { + getContext, + getComponent + } from './util' + const privacyResolves = new Set() // onNeedPrivacyAuthorization���reslove + + let privacyHandler = null + // ������������ + if (uni.onNeedPrivacyAuthorization) { + uni.onNeedPrivacyAuthorization((resolve) => { + if (typeof privacyHandler === 'function') { + privacyHandler(resolve) + } + }) + } + + export default { + name: 'wsWxPrivacy', + emits: ['disagree', 'agree'], + props: { + // ������ + title: { + type: String, + default: '������������������������' + }, + // ������ + desc: { + type: String, + default: '������������������������������������������������������������������������������������' + }, + // ��������������������������������� + protocol: { + type: String, + default: '������������������������������' + }, + // ������������������������������������������������������������getPrivacySetting��������������� + enableAutoProtocol: { + type: Boolean, + default: false, // ������������������������������������������ + }, + // ��������� + subDesc: { + type: String, + default: '���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������' + }, + /** + * ��������������������������������������������������������� + * ��������������� true��������������������������������������������������������� + * ��������������� false������������������������������������������������������������������������������ + * ��������� true + */ + disagreeEnabled: { + type: Boolean, + default: true, // ��������������������� + }, + /** + * ��������������������������������������������� + */ + disagreePromptText: { + type: String, + default: '���������������������������������������', // ������������������ + }, + // ������������������ + disagreeText: { + type: String, + default: '���������' + }, + // ������������������ + agreeText: { + type: String, + default: '���������������' + }, + // ��������������������� + bgColor: { + type: String, + default: '' + }, + // ��������������������������������������������������������������������������� + themeColor: { + type: String, + default: '' + } + }, + data() { + return { + privacyContractName: '', + } + }, + computed: { + rootStyle() { + if (this.bgColor) { + return `background:${this.bgColor}` + } else { + return '' + } + }, + protocolStyle() { + if (this.themeColor) { + return `color:${this.themeColor}` + } else { + return '' + } + }, + agreeStyle() { + if (this.themeColor) { + return `background:${this.themeColor}` + } else { + return '' + } + } + }, + created() { + privacyHandler = (resolve) => { + const context = getContext() + const privacyPopup = getComponent(context, '#privacy-popup') + if (privacyPopup) { + const privacy = getComponent(privacyPopup, '#privacy') + if (privacy && privacy.open) { + privacy.open() + } + } + privacyResolves.add(resolve) + } + if (this.enableAutoProtocol && uni.getPrivacySetting) { + uni.getPrivacySetting({ + success: res => { + if (res.privacyContractName) { + this.privacyContractName = res.privacyContractName + } + }, + fail: () => {}, + complete: () => {} + }) + } + }, + methods: { + /** + * ������������������ + */ + openPrivacyContract() { + wx.openPrivacyContract({ + success: (res) => { + console.log('openPrivacyContract success') + }, + fail: (res) => { + console.error('openPrivacyContract fail', res) + } + }) + }, + + /** + * ������������������ + */ + handleDisagree() { + if (this.disagreeEnabled) { + this.$refs.privacyPopup.close() + privacyResolves.forEach((resolve) => { + resolve({ + event: 'disagree' + }) + }) + privacyResolves.clear() + this.$emit('disagree') + } else { + uni.showToast({ + icon: 'none', + title: this.disagreePromptText + }) + } + + }, + + /** + * ������������������ + */ + handleAgree() { + this.$refs.privacyPopup.close() + privacyResolves.forEach((resolve) => { + resolve({ + event: 'agree', + buttonId: 'agree-btn' + }) + }) + privacyResolves.clear() + this.$emit('agree') + } + } + } +</script> +<style lang="scss" scoped> + .ws-privacy-popup { + padding: 48rpx; + box-sizing: border-box; + overflow: hidden; + width: 560rpx; + background: linear-gradient(180deg, #e5edff 0%, #ffffff 100%); + border-radius: 24rpx; + + &__header { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 52rpx; + font-size: 36rpx; + font-family: PingFangSC-Medium, PingFang SC; + font-weight: 550; + color: #1a1a1a; + line-height: 52rpx; + margin-bottom: 48rpx; + } + + &__container { + width: 100%; + box-sizing: border-box; + font-size: 28rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #333333; + line-height: 48rpx; + margin-bottom: 48rpx; + + &-protocol { + font-weight: 550; + color: #4D80F0; + } + } + + &__footer { + display: flex; + flex-direction: column; + + .is-disagree, + .is-agree { + width: 100%; + height: 88rpx; + background: #ffffff; + border-radius: 44rpx; + font-size: 32rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #666666; + } + + .is-agree { + background: #4D80F0; + color: #ffffff; + margin-bottom: 18rpx; + } + + button { + border: none; + outline: none; + + &::after { + border: none; + } + } + } + } +</style> \ No newline at end of file diff --git a/uni_modules/ws-wx-privacy/package.json b/uni_modules/ws-wx-privacy/package.json new file mode 100644 index 0000000..8289251 --- /dev/null +++ b/uni_modules/ws-wx-privacy/package.json @@ -0,0 +1,85 @@ +{ + "id": "ws-wx-privacy", + "displayName": "ws-wx-privacy ��������������������������� ���������������������", + "version": "1.0.10", + "description": "��������������������������� ������������������������������vue2���vue3��������������������������������� ws-wx-privacy���������������������������������������������������", + "keywords": [ + "���������������", + "������������", + "������������������", + "������������", + "������" +], + "repository": "", + "engines": { + "HBuilderX": "^3.8.6" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "���", + "data": "���������������������������", + "permissions": "���" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": ["uni-popup"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "n", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "n", + "Android Browser": "n", + "���������������(Android)": "n", + "QQ���������(Android)": "n" + }, + "H5-pc": { + "Chrome": "n", + "IE": "n", + "Edge": "n", + "Firefox": "n", + "Safari": "n" + }, + "���������": { + "������": "y", + "������": "n", + "������": "n", + "������������": "n", + "QQ": "n", + "������": "n", + "������": "n", + "������": "n", + "������": "n" + }, + "���������": { + "������": "n", + "������": "n" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/ws-wx-privacy/readme.md b/uni_modules/ws-wx-privacy/readme.md new file mode 100644 index 0000000..a84483e --- /dev/null +++ b/uni_modules/ws-wx-privacy/readme.md @@ -0,0 +1,122 @@ +# ws-wx-privacy ������������������������ + +���������������������������������������������������[������������������������������������������������](https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801?blockType=1&page=1#comment-list) + +`wsWxPrivacy` ��������������������������������������������������������������������������������������������������� + +# ��������� ������������������������������������������������������������������������������ + +### ������������ +1. ���������HbuilderX������������������������������`uni-popup`������������������������������ +2. ���������������������������`wx.requirePrivacyAuthorize`������������������������������[���������������������������������������](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html) +3. popup���������������������������������������������������������������������������������������������������`util.js`������������������������������������������ref���������������this������������������������������������������ +4. ������demo���������������vue3������������������������������ + +### ��������������������������������������������������������������������� +������������������������������������������������������������������������������������������������������������������������������������ + +#### 1.������������������������������(������) +���������������������������������������������������������������������[������������������](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html)���������������������������������`������������������������`������������������������������������������������������������������������ + +`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������` + +`���������������������������������������������������������������������������������������������������!������������!������������!` + +#### 2.������������������__usePrivacyCheck__ ������������ +������ [���������������������������������������](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html)������������ + +������ `getPrivacySetting`���`onNeedPrivacyAuthorization`���`requirePrivacyAuthorize` ��������������������������������������������������������� + +- ��� 2023 ��� 9 ��� 15 ��������������� app.json ��������� `"__usePrivacyCheck__": true` ������������������������������������������������������������������ false ������������������ + +- ��� 2023 ��� 9 ��� 15 ������������������ app.json ������������������ **usePrivacyCheck**������������������������������������ + +���������������`uni-app`��������������������� 2023 ��� 9 ��� 15 ���������������������������������������������`manifest.json`������`mp-weixin`���������`"__usePrivacyCheck__": true` + +#### 3.��������������������������������������������� +������������������������3.0.0������������������������: +���������������������->������->������������->��������������� + +#### 4.������������������������������������������������������������ +������������getPrivacySetting������������������������������������������������������������������������������������������������������������������ + + +### Props + +| ������ | ������ | ��������� | ������ | +|------------ |-------- |---------------------------------- |------------------------------------------------------------------------------------------ | +| title | String | ������������������������ | ��������������� | +| desc | String | ���������������������������... | ��������������� | +| protocol | String | ������������������������ | ������������������������������ | +| subDesc | String | ���������������������������������... | ��������������������������������������������������������� | +| disagreeEnabled | Boolean | true | ��������������������������������������������������������������������������������������������������� true������������������������������������������������������������������������ false������������������������������������������������������������������������������ | +| disagreePromptText| String | ��������������������������������������� | ��������������������������������������� | +| bgColor | String | - | ������������������������ | +| themeColor | String | - | ������������������������������������������������������������������������������ | + +### Events + +| ������ | ������ | ������ | +|-----------|----------------------------------------|----------------------------------------------------------------------------------------| +| disagree | ��������� | ������������������������������������������������������ | +| agree | ��������� | ��������������������������������������������������� | + + +### ������������ +������������������������������������[uni-modules ������](https://uniapp.dcloud.net.cn/plugin/uni_modules.html#uni-modules) +������hbuildX������������������������������������������import��� + +```vue +<template> + <view> + <!-- #ifdef MP-WEIXIN --> + <ws-wx-privacy id="privacy-popup"></ws-wx-privacy> + <!-- #endif --> + </view> +</template> +<script> + +export default { + components: {}, + methods: { + handleDisagree() { + // ������������������������������������������ + }, + handleAgree() { + // ��������������������������������������� + } + } +} +</script> +``` + +������������������������������������������������������������������������������������������������������������������`id="privacy-popup"`������������������������������������������������������������������������this������������������������ + +## ������������ +``` +1. ������������������������������������ +2. ��������������������������������������������������������������� +3. ��������������������������������������������������������������������������������������������� +``` + +## ������������ +### 1.������������������������ +#### ������������������"���������������������������������������������������������������������"������������������������������������������������������������������API��������������������������������� +#### ��������������������������������������������������� +#### ������������������getPrivacySetting��������������������������������������� + +### 2.��������������������������� +#### ���������������������������vue3���������������������������������vue3��������� + +### 3.������������������vue2 +#### ������ + +### 4.chooseImage������������������������������������������������ +#### ������������������������1���������������������������������������������������������API + +### 5.������������������������������������������������ +#### ���[������������������](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html)���������������������API���������uni.chooseImage������������������������������������������������ ��� + + +## Vue3������������������������ +������������������[wot-design-uni](https://ext.dcloud.net.cn/plugin?id=13889)������������������������������������������������������������������50+��������� \ No newline at end of file diff --git a/utils/websoket.js b/utils/websoket.js new file mode 100644 index 0000000..841f339 --- /dev/null +++ b/utils/websoket.js @@ -0,0 +1,91 @@ +class websocketUtil { + constructor(url, time) { + this.is_open_socket = false //������������������ + this.url = url //������ + this.data = null + //������������ + this.timeout = time //��������������������� + this.heartbeatInterval = null //��������������������������������� + this.reconnectTimeOut = null //������������������������������ + try { + return this.connectSocketInit() + } catch (e) { + console.log('catch'); + this.is_open_socket = false + this.reconnect(); + } + } + // ���������������������������������websocket������������������������������������ + connectSocketInit() { + this.socketTask = uni.connectSocket({ + url: this.url, + success: () => { + console.log("���������������websocket���..."); + // ������������ + return this.socketTask + }, + }); + this.socketTask.onOpen((res) => { + console.log("WebSocket���������������"); + clearTimeout(this.reconnectTimeOut) + clearTimeout(this.heartbeatInterval) + this.is_open_socket = true; + this.start(); + // ��������������������������������� ��������������������������� + this.socketTask.onMessage((res) => { + console.log(res.data) + }); + }) + // ������������������������������������������������������������������������������������������������������onclose������������������������������������������������������������ + // uni.onSocketError((res) => { + // console.log('WebSocket���������������������������������'); + // this.is_open_socket = false; + // this.reconnect(); + // }); + // ���������������������������������socket��������������������� + this.socketTask.onClose(() => { + console.log("������������������") + this.is_open_socket = false; + this.reconnect(); + }) + } + //������������ + send(value) { + // ��������������������������������� ��������������������������������� + this.socketTask.send({ + data: value, + async success() { + console.log("������������������"); + }, + }); + } + //������������������ + start() { + this.heartbeatInterval = setTimeout(() => { + this.data = { + value: "������������", + method: "������������" + } + console.log(this.data) + this.send(JSON.stringify(this.data)); + }, this.timeout) + } + //������������ + reconnect() { + //������������������ + clearInterval(this.heartbeatInterval) + //��������������������������������������������� + if (!this.is_open_socket) { + this.reconnectTimeOut = setTimeout(() => { + this.connectSocketInit(); + }, 3000) + } + } + //������������������ + getMessage(callback) { + this.socketTask.onMessage((res) => { + return callback(res) + }) + } +} +module.exports = websocketUtil \ No newline at end of file -- Gitblit v1.8.0