
如何让弹框覆盖底部导航栏和顶部导航栏!
很多时候底部的tabbar页面由于是原生的,所以弹框背景无法覆盖到,插件市场很多方案都不完美,最近突发奇想一个绝妙的办法,完美解决,由于公司代码不好放出来,需要方案的可以联系我QQ728045048
很多时候底部的tabbar页面由于是原生的,所以弹框背景无法覆盖到,插件市场很多方案都不完美,最近突发奇想一个绝妙的办法,完美解决,由于公司代码不好放出来,需要方案的可以联系我QQ728045048

uni-app研发需求
公司有uni-app 研发的办公软件,要求有实时定位功能,要ios和安卓都保活,有此方面研发者联系
公司有uni-app 研发的办公软件,要求有实时定位功能,要ios和安卓都保活,有此方面研发者联系

video 模块是否增加AliPlayer播放SDK
现在默认使用的是ijkplayer播放SDK.官方是否可增加一个可选的AliPlayer播放SDK.
文档地址
文档摘要说明:
格式和编码 支持MP4、M3U8、FLV、MKV视频格式和MP3音频格式。支持H.264、H.265视频编码和AAC音频编码,iOS支持AC3音频编码。
完整UI SDK包含多套完整UI,用户可以根据自己的应用风格选用。
播放控制 支持开始、结束、暂停、恢复、重播和循环播放等播放控制功能。
列表播放 SDK内部支持列表播放功能,提升加载速度。
填充模式 支持画面填充和画面裁剪两种填充模式。
静音 支持开启和关闭静音功能。
音量调节 支持实时调节系统音量(UI支持手势)。
亮度调节 支持系统的亮度调节(UI支持手势)。
纯音频播放 支持AAC编码的MP3音频文件播放。
多实例 支持在一个界面添加多个播放器同时播放。
点播或直播支持 可以同时支持点播和直播功能。
URL播放 支持本地视频和网络视频的URL方式播放。
vid播放 支持点播提供的视频播放方式。
自动播放 支持视频准备后自动播放。
Seek 支持拖动到指定位置(UI支持手势)。
锁屏 支持锁屏功能,包含锁定旋转和隐藏界面元素(UI支持)。
清晰度切换 支持点播和转码的多路清晰度流切换。
加密播放 支持点播转码的加密流播放。
安全下载 支持通过唯一应用下载视频并进行加密。
直播时移 支持直播时移视频流播放,可设置开始、结束和当前支持时间,支持拖动。
边播边下缓存 支持视频边播边缓存功能,适合短视频的循环播放场景。
倍数播放 支持0.5~2倍的变速播放,支持音频变速不变调。
后台播放 支持界面切到后台后继续播放音频。
首屏秒开 支持点播和直播的首屏秒开功能。
动态追帧 支持直播的动态追帧,降低延时。
自动重连 支持直播的自动重连功能。
视频截图 支持截取播放画面的任意一帧。
cache内seek 支持已经缓冲的视频内容在拖动时不清除缓冲内容并快速拖动。
渲染角度 支持0°、90°、180°和270°四个视频画面渲染角度设置。
渲染镜像 支持无镜像、水平镜像和垂直镜像三种镜像模式设置。
多码率切换 支持多码率HLS的无缝切换。
试看功能 支持点播服务的试看功能。
硬解码 支持H.264和H.265的硬解码功能,并支持切换。
解码黑名单 支持设置硬解码黑名单。
设置Http Header 用户可以添加自定义的请求。
短视频场景 支持短视频场景下的循环播放,滑动切换视频后秒级播放等能力。更多信息,请参见趣视频解决方案。
倍数播放 支持0.5~2倍的实时变速功能,实现在变速的情况下声音变速不变调。
加密播放 支持在云端转码为加密流,加密流仅能通过播放器SDK解密,保证视频安全。
安全下载 支持对下载的视频进行二次加密,保证被下载的视频仅能通过唯一的应用播放,高级别的防盗措施。
视频缓存 提供视频边播边缓存功能,满足短视频场景下的循环播放,节约用户流量。
视频截图 支持截取播放画面的当前帧,可用于视频封面选取、存储本地或分享精彩画面给朋友。
更新历史
看更新频率还是比较高的.
计费方式
计费说明都是云播及储存计费.并未说明播放SDK需要收费授权.希望官方能沟通跟进一下!
现在默认使用的是ijkplayer播放SDK.官方是否可增加一个可选的AliPlayer播放SDK.
文档地址
文档摘要说明:
格式和编码 支持MP4、M3U8、FLV、MKV视频格式和MP3音频格式。支持H.264、H.265视频编码和AAC音频编码,iOS支持AC3音频编码。
完整UI SDK包含多套完整UI,用户可以根据自己的应用风格选用。
播放控制 支持开始、结束、暂停、恢复、重播和循环播放等播放控制功能。
列表播放 SDK内部支持列表播放功能,提升加载速度。
填充模式 支持画面填充和画面裁剪两种填充模式。
静音 支持开启和关闭静音功能。
音量调节 支持实时调节系统音量(UI支持手势)。
亮度调节 支持系统的亮度调节(UI支持手势)。
纯音频播放 支持AAC编码的MP3音频文件播放。
多实例 支持在一个界面添加多个播放器同时播放。
点播或直播支持 可以同时支持点播和直播功能。
URL播放 支持本地视频和网络视频的URL方式播放。
vid播放 支持点播提供的视频播放方式。
自动播放 支持视频准备后自动播放。
Seek 支持拖动到指定位置(UI支持手势)。
锁屏 支持锁屏功能,包含锁定旋转和隐藏界面元素(UI支持)。
清晰度切换 支持点播和转码的多路清晰度流切换。
加密播放 支持点播转码的加密流播放。
安全下载 支持通过唯一应用下载视频并进行加密。
直播时移 支持直播时移视频流播放,可设置开始、结束和当前支持时间,支持拖动。
边播边下缓存 支持视频边播边缓存功能,适合短视频的循环播放场景。
倍数播放 支持0.5~2倍的变速播放,支持音频变速不变调。
后台播放 支持界面切到后台后继续播放音频。
首屏秒开 支持点播和直播的首屏秒开功能。
动态追帧 支持直播的动态追帧,降低延时。
自动重连 支持直播的自动重连功能。
视频截图 支持截取播放画面的任意一帧。
cache内seek 支持已经缓冲的视频内容在拖动时不清除缓冲内容并快速拖动。
渲染角度 支持0°、90°、180°和270°四个视频画面渲染角度设置。
渲染镜像 支持无镜像、水平镜像和垂直镜像三种镜像模式设置。
多码率切换 支持多码率HLS的无缝切换。
试看功能 支持点播服务的试看功能。
硬解码 支持H.264和H.265的硬解码功能,并支持切换。
解码黑名单 支持设置硬解码黑名单。
设置Http Header 用户可以添加自定义的请求。
短视频场景 支持短视频场景下的循环播放,滑动切换视频后秒级播放等能力。更多信息,请参见趣视频解决方案。
倍数播放 支持0.5~2倍的实时变速功能,实现在变速的情况下声音变速不变调。
加密播放 支持在云端转码为加密流,加密流仅能通过播放器SDK解密,保证视频安全。
安全下载 支持对下载的视频进行二次加密,保证被下载的视频仅能通过唯一的应用播放,高级别的防盗措施。
视频缓存 提供视频边播边缓存功能,满足短视频场景下的循环播放,节约用户流量。
视频截图 支持截取播放画面的当前帧,可用于视频封面选取、存储本地或分享精彩画面给朋友。
更新历史
看更新频率还是比较高的.
计费方式
计费说明都是云播及储存计费.并未说明播放SDK需要收费授权.希望官方能沟通跟进一下!
收起阅读 »
uniapp条件语法不生效以及配置问题
1.检查pack.json 如图
- 没有自定义条件命令 只能支持 官方条件语法
- 自定义命令检测命令 如图
- vscode运行命令 npm run dev:custom mp-weixin-production 或者 npm run build:custom mp-weixin-production
1.检查pack.json 如图
- 没有自定义条件命令 只能支持 官方条件语法
- 自定义命令检测命令 如图
- vscode运行命令 npm run dev:custom mp-weixin-production 或者 npm run build:custom mp-weixin-production

图片缓存方案,上拉加载后图片缓存,第二次秒打开
watch: {
realSrc: {
async handler(src) {
const sign = 'cachednewmage#';
const _img = uni.getStorageSync(sign + src); // 同步方法
if (_img) {
// 得到缓存的图片 , 直接使用缓存的图片
this.img_url = _img.path;
}else{
uni.getImageInfo({ src: src })
.then(data => {
//data为一个数组,数组第一项为错误信息,第二项为返回数据
let [error, res] = data;
// console.log(data);
if (error) {
this.img_url =src
} else {
// 拿到获取的图片信息
this.img_url = res.path;
uni.saveFile({
tempFilePath: res.path
})
.then(data => {
let [saveFile_error, saveFile_res] = data;
if (saveFile_res) {
uni.setStorage({
key: sign + src,
data: {path:saveFile_res.savedFilePath}
})
}
})
}
})
.catch(err => {
console.error('uni.getImageInfo err', err);
});
}
},
immediate: true
}
},
有问题可以随时咨询我,联系方式找头像昵称
watch: {
realSrc: {
async handler(src) {
const sign = 'cachednewmage#';
const _img = uni.getStorageSync(sign + src); // 同步方法
if (_img) {
// 得到缓存的图片 , 直接使用缓存的图片
this.img_url = _img.path;
}else{
uni.getImageInfo({ src: src })
.then(data => {
//data为一个数组,数组第一项为错误信息,第二项为返回数据
let [error, res] = data;
// console.log(data);
if (error) {
this.img_url =src
} else {
// 拿到获取的图片信息
this.img_url = res.path;
uni.saveFile({
tempFilePath: res.path
})
.then(data => {
let [saveFile_error, saveFile_res] = data;
if (saveFile_res) {
uni.setStorage({
key: sign + src,
data: {path:saveFile_res.savedFilePath}
})
}
})
}
})
.catch(err => {
console.error('uni.getImageInfo err', err);
});
}
},
immediate: true
}
},
有问题可以随时咨询我,联系方式找头像昵称
收起阅读 »
北京顺义,需要一个有经验的uni-app,有3个以上项目经验,能独立打包,全职,工资可以商量,非诚勿扰。。。
北京顺义,需要一个有经验的uni-app,
全职,工作稳定,有晋升空间,
要求有3个以上项目经验,能独立打包,
非诚勿扰。。。
有意的可加微信:wzy460269199,备注:uni
北京顺义,需要一个有经验的uni-app,
全职,工作稳定,有晋升空间,
要求有3个以上项目经验,能独立打包,
非诚勿扰。。。
有意的可加微信:wzy460269199,备注:uni

防范电信网络诈骗,“黑灰产”犯罪你应该了解一下
2019年10月,最高人民法院、最高人民检察院联合发布《关于办理非法利用信息网络、帮助信息网络犯罪活动等刑事案件适用法律若干问题的解释》对《刑法修正案九》新增网络犯罪罪名作出了进一步的明确。
2018年,全球每分钟因网络犯罪导致的经济损失高达290万美元,每分钟泄露的可标识数据记录为8100条,而头部企业每分钟为网络安全漏洞所付出的成本则达到25美元。
治理网络犯罪、打击网络黑产,已成为互联网发展中的必答题。
2020年4月,渝北警方成功打掉一个买卖对公账户“黑灰产”犯罪团伙,先后在渝北区、南岸区、沙坪坝区、綦江区抓获犯罪嫌疑人14,扣押对公账户材料260套,银行卡55张,手机29部,手机卡44张,电脑9台。
对公账户本用于企业间资金往来,但非法兜售对公账户卖给从事电信网络诈骗人员,为电信诈骗等违法犯罪洗钱,逐渐形成了一条网络黑色、灰色产业链条。为进一步强化源头防范,严厉打击治理电信网络违法犯罪,公安部“长城2号”专项行动启动以来,渝北分局刑侦支队牵头,联合网安支队聚集精干警力,强化线索研判,经侦查发现辖区存在开设对公账户后转卖,为电信网络诈骗违法犯罪洗钱的犯罪行为。民警高度重视,立即开展深挖工作,逐步明确一个“黑灰产”犯罪团伙。该团伙以犯罪嫌疑人丁某、田某为主要头目,以“代办公司”为掩护,指示团伙成员招募社会闲散人员注册空壳公司,在各大银行开设含法人信息、公章、网银U盾、银行法人卡等全套资料的公司对公账户,并给予数百元至千元不等的报酬,随后以5000以上价格转卖给从事电信网络诈骗犯罪的人员手中,用于电诈不发分子“洗钱”。
近日,丁某、田某等14名涉嫌买卖国家机关证件罪被依法采取刑事强制措施。
法律的缰绳勒的越来越紧。但这只是个开始……

网络黑灰产是什么
所谓网络黑灰产,指的是电信诈骗、钓鱼网站、木马病毒、黑客勒索等利用网络开展违法犯罪活动的行为。稍有不同的是,“黑产”指的是直接触犯国家法律的网络犯罪,“灰产”则是游走在法律边缘,往往为“黑产”提供辅助的争议行为。
目前,网络黑产犯罪已形成分工明确的上、下游黑产链条,而为各类网络黑产提供支撑的供给链也划分出物料、流量和支付三大要件。其中,物料为网络黑产提供犯罪原料和技术工具,流量负责触达受害人群,支付解决黑产获取赃款的资金通道。
随着新技术的发展,这三个要素也正在发生变化。其中,网络黑产的物料由此前的包括居民身份证件、银行卡、手机卡、U盾的个人信息“四件套”,扩展到指纹、面容、声音等生物信息。例如,有人利用“换脸”制作虚假的淫秽视频进行传播,还有犯罪团伙通过3D软件合成“假脸”认证网络平台账号,在受害人不知情的情况下,进行虚假注册、刷单、薅羊毛、诈骗等不法行为。
在非法支付结算环节,包括恶意注册账号仍然是源头,虚拟商品交易成为主要渠道,非法支付渠道向普通个人账号转移的趋势明显,商户支付接口被聚合支付平台违法挪用情形增多,电商、通信运营商等大型可信商户成为新焦点。
警方提示:网络黑灰产犯罪形式较为复杂。抵制网络黑产,要提高警惕,不轻易打开有风险的网站、短信、链接等,尽量访问具备安全协议的网站,受到网络黑灰产侵权时,应及时向有关部门和网络平台反映维权。而不要因小利而违国家之大法,甚至走上犯罪道路。
此文章【来源:平安渝北】,转载自潇湘晨报,如有不当联系邮箱:pufa@dcloud.io 。
原文链接
2019年10月,最高人民法院、最高人民检察院联合发布《关于办理非法利用信息网络、帮助信息网络犯罪活动等刑事案件适用法律若干问题的解释》对《刑法修正案九》新增网络犯罪罪名作出了进一步的明确。
2018年,全球每分钟因网络犯罪导致的经济损失高达290万美元,每分钟泄露的可标识数据记录为8100条,而头部企业每分钟为网络安全漏洞所付出的成本则达到25美元。
治理网络犯罪、打击网络黑产,已成为互联网发展中的必答题。
2020年4月,渝北警方成功打掉一个买卖对公账户“黑灰产”犯罪团伙,先后在渝北区、南岸区、沙坪坝区、綦江区抓获犯罪嫌疑人14,扣押对公账户材料260套,银行卡55张,手机29部,手机卡44张,电脑9台。
对公账户本用于企业间资金往来,但非法兜售对公账户卖给从事电信网络诈骗人员,为电信诈骗等违法犯罪洗钱,逐渐形成了一条网络黑色、灰色产业链条。为进一步强化源头防范,严厉打击治理电信网络违法犯罪,公安部“长城2号”专项行动启动以来,渝北分局刑侦支队牵头,联合网安支队聚集精干警力,强化线索研判,经侦查发现辖区存在开设对公账户后转卖,为电信网络诈骗违法犯罪洗钱的犯罪行为。民警高度重视,立即开展深挖工作,逐步明确一个“黑灰产”犯罪团伙。该团伙以犯罪嫌疑人丁某、田某为主要头目,以“代办公司”为掩护,指示团伙成员招募社会闲散人员注册空壳公司,在各大银行开设含法人信息、公章、网银U盾、银行法人卡等全套资料的公司对公账户,并给予数百元至千元不等的报酬,随后以5000以上价格转卖给从事电信网络诈骗犯罪的人员手中,用于电诈不发分子“洗钱”。
近日,丁某、田某等14名涉嫌买卖国家机关证件罪被依法采取刑事强制措施。
法律的缰绳勒的越来越紧。但这只是个开始……
网络黑灰产是什么
所谓网络黑灰产,指的是电信诈骗、钓鱼网站、木马病毒、黑客勒索等利用网络开展违法犯罪活动的行为。稍有不同的是,“黑产”指的是直接触犯国家法律的网络犯罪,“灰产”则是游走在法律边缘,往往为“黑产”提供辅助的争议行为。
目前,网络黑产犯罪已形成分工明确的上、下游黑产链条,而为各类网络黑产提供支撑的供给链也划分出物料、流量和支付三大要件。其中,物料为网络黑产提供犯罪原料和技术工具,流量负责触达受害人群,支付解决黑产获取赃款的资金通道。
随着新技术的发展,这三个要素也正在发生变化。其中,网络黑产的物料由此前的包括居民身份证件、银行卡、手机卡、U盾的个人信息“四件套”,扩展到指纹、面容、声音等生物信息。例如,有人利用“换脸”制作虚假的淫秽视频进行传播,还有犯罪团伙通过3D软件合成“假脸”认证网络平台账号,在受害人不知情的情况下,进行虚假注册、刷单、薅羊毛、诈骗等不法行为。
在非法支付结算环节,包括恶意注册账号仍然是源头,虚拟商品交易成为主要渠道,非法支付渠道向普通个人账号转移的趋势明显,商户支付接口被聚合支付平台违法挪用情形增多,电商、通信运营商等大型可信商户成为新焦点。
警方提示:网络黑灰产犯罪形式较为复杂。抵制网络黑产,要提高警惕,不轻易打开有风险的网站、短信、链接等,尽量访问具备安全协议的网站,受到网络黑灰产侵权时,应及时向有关部门和网络平台反映维权。而不要因小利而违国家之大法,甚至走上犯罪道路。
此文章【来源:平安渝北】,转载自潇湘晨报,如有不当联系邮箱:pufa@dcloud.io 。
原文链接

websocket聊天+plus.sqlite.executeSql前端消息存储本地数据库
import Vue from 'vue'
import Vuex from 'vuex'
import baseUrl from '@/Api/baseUrl.js'
const app=getApp();
Vue.use(Vuex)
export default new Vuex.Store({
state: {
socketTask: null,
interval:null,//心跳事件
timeout:120000,
connectNum : 0,//重连次数
//断线重连定时器
timer:null,
isConnect:false, //连接标识 避免重复连接
sucees:null,
eventlist: '',//单聊信息
grouplist:'',//群聊信息
advice:'',//通知
newadvice:0,//订单消息数量
newevent:0//聊天消息数量
},
mutations: {
WEBSOCKET_INIT(state, url) {
uni.getNetworkType({
success: function (result) {
if (result.networkType != 'none') {
if(state.isConnect) return
const wsuri = baseUrl.websocketapi.url;
const _this = this;
// 创建一个this.socketTask对象【发送、接收、关闭socket都由这个对象操作】
state.socketTask = uni.connectSocket({
url: wsuri,
// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
success(data) {
console.log("websocket连接成功");
},
});
// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
state.socketTask.onOpen((res) => {
console.log("WebSocket连接正常打开中...!");
// 注:只有连接正常打开中 ,才能正常收到消息
if(uni.getStorageSync('userinfo')){
let _data={
userId: uni.getStorageSync('userinfo').id,
type:'REGISTER'
}
state.socketTask.send({
data: JSON.stringify(_data),
async success() {
state.isConnect=true;
console.log("消息发送成功");
},
});
}else{
return
}
//开启心跳
// state.interval=setInterval(() => {
// //发送心跳
// var dataxt = {
// 'userId': uni.getStorageSync("userinfo").id, //
// 'type': 'HEARTBEAT'
// }
// state.socketTask.send({
// data: JSON.stringify(dataxt),
// success() {
// console.log("心跳消息发送成功");
// },
// fail(e){
// console.log('心跳发送失败了 ...执行重连');
// state.isConnect=false;
// clearInterval(state.interval);
// state.socketTask.close({})
// _this.dispatch('reConnect');
// }
// });
// }, state.timeout);
state.socketTask.onMessage((res) => {
console.log("收到服务器内容111111:" + res.data);
let datas=res.data;
if(datas.includes('msg')&&!datas.includes('HEARTBEAT')){
//console.log("收到服务器内容:" + JSON.stringify(state.eventlist));
let {id,fromGodId,toGodId,headImg,toGroupId,address,msgType,src,latitude,content,width,name,time,contentType,height,longitude,longTime}=JSON.parse(datas).data
if(contentType=="SINGLE_SENDING"&&msgType<5){
uni.showTabBarRedDot({index:2})
state.eventlist=JSON.parse(datas).data;
plus.sqlite.executeSql({
name: 'first',
sql: `insert into databasedl values('${id}','${fromGodId}','${toGodId}','${toGroupId}','${headImg}','${longTime}','${width}','${height}','${name}','${address}','${latitude}','${longitude}','${content}','${src}','${msgType}','${contentType}','${time}')`,
success: function(e) {
console.log('插入数据成功')
//plus.nativeUI.alert('插入数据成功');
},
fail: function(e) {
console.log('插入数据失败 ')
//plus.nativeUI.alert('插入数据失败');
}
});
}else if(contentType=="GROUP_SENDING"&&msgType<5){
state.grouplist=JSON.parse(datas).data;
console.log(JSON.parse(datas).data)
// plus.sqlite.executeSql({
// name: 'first',
// sql: `insert into databaseql values('${id}','${fromGodId}','${toGodId}','${toGroupId}','${headImg}','${longTime}','${width}','${height}','${name}','${address}','${latitude}','${longitude}','${content}','${src}','${msgType}','${contentType}','${time}')`,
// success: function(e) {
// console.log('插入数据成功')
// //plus.nativeUI.alert('插入数据成功');
// },
// fail: function(e) {
// console.log('插入数据失败 ')
// //plus.nativeUI.alert('插入数据失败');
// }
// });
}else if(contentType=="ADVICE"&&msgType>=5){
console.log("收到服务器通知55555:" + datas);
state.advice=JSON.parse(datas).data;
}
}
});
})
// 监听关闭
state.socketTask.onClose(()=>{
// state.socketTask = null;
//清除定时器
state.isConnect=false;
// clearInterval(state.interval);
//state.interval = null
});
// 监听错误
state.socketTask.onError((e)=>{
//state.socketTask = null;
state.isConnect=false;
// clearInterval(state.interval);
});
uni.onNetworkStatusChange(function (res) {
if(!res.isConnected){
_this.dispatch('reConnect');
}
});
}else{
console.log('网络已断开');
state.isConnect=false;
// 网络断开后显示model
uni.showModal({
title: '网络错误',
content: '请重新打开网络',
showCancel: false,
success: function(res) {
if (res.confirm) {
console.log('用户点击确定')
}
}
})
}
}
});
},
EMPTY(state){
state.newadvice=0;
},
WEBSOCKET_CLOSE(state){
state.isConnect=false;
//clearInterval(state.interval);
console.log('熄灯了111')
state.socketTask.close({})
},
WEBSOCKET_SEND(state, p) {
const that=this;
state.sucees=null;
console.log("ws发送!");
state.socketTask.send({
data: p,
async success() {
state.sucees=true
console.log('发送成功')
},
async fail(e){
console.log('发送失败')
if( state.connectNum>10){
uni.showToast({
title: '聊天服务器不稳定,正在重连...',
icon:'none'
});
}
state.isConnect=false;
state.sucees=false
state.socketTask.close({})
that.dispatch('WEBSOCKET_INIT');
setTimeout(()=>{
that.dispatch('WEBSOCKET_SEND',p);
state.connectNum += 1;
},300)
}
});
},
},
actions: {
EMPTY({
commit
}){
commit('EMPTY')
},
WEBSOCKET_INIT({
commit
}, url) {
commit('WEBSOCKET_INIT', url)
},
WEBSOCKET_CLOSE({
commit,state
}) {
console.log('灯熄灭了')
commit('WEBSOCKET_CLOSE')
},
WEBSOCKET_SEND({
commit,state
}, p) {
commit('WEBSOCKET_SEND', p)
},
reConnect({commit,state}) {
console.log('重连1111')
if (state.connectNum > 5) {
state.socketTask.close({})
state.isConnect=false;
clearInterval(state.interval);
uni.showToast({
title: '聊天服务中断,请重新登录',
icon:'none'
});
uni.reLaunch({
url: '/pages/login/index'
});
state.connectNum += 1;
}else if (state.connectNum > 50) {
state.timer = setTimeout(() => {
commit('WEBSOCKET_INIT')
}, 50000)
state.connectNum += 1;
} else {
console.log('重连')
state.timer = setTimeout(() => {
commit('WEBSOCKET_INIT')
}, 3000)
state.connectNum += 1;
}
},
JYJPUSH_INIT({
commit
}){
commit('JYJPUSH_INIT')
}
}
})
欢迎咨询问题,带前端徒弟小白QQ728045048
import Vue from 'vue'
import Vuex from 'vuex'
import baseUrl from '@/Api/baseUrl.js'
const app=getApp();
Vue.use(Vuex)
export default new Vuex.Store({
state: {
socketTask: null,
interval:null,//心跳事件
timeout:120000,
connectNum : 0,//重连次数
//断线重连定时器
timer:null,
isConnect:false, //连接标识 避免重复连接
sucees:null,
eventlist: '',//单聊信息
grouplist:'',//群聊信息
advice:'',//通知
newadvice:0,//订单消息数量
newevent:0//聊天消息数量
},
mutations: {
WEBSOCKET_INIT(state, url) {
uni.getNetworkType({
success: function (result) {
if (result.networkType != 'none') {
if(state.isConnect) return
const wsuri = baseUrl.websocketapi.url;
const _this = this;
// 创建一个this.socketTask对象【发送、接收、关闭socket都由这个对象操作】
state.socketTask = uni.connectSocket({
url: wsuri,
// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
success(data) {
console.log("websocket连接成功");
},
});
// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
state.socketTask.onOpen((res) => {
console.log("WebSocket连接正常打开中...!");
// 注:只有连接正常打开中 ,才能正常收到消息
if(uni.getStorageSync('userinfo')){
let _data={
userId: uni.getStorageSync('userinfo').id,
type:'REGISTER'
}
state.socketTask.send({
data: JSON.stringify(_data),
async success() {
state.isConnect=true;
console.log("消息发送成功");
},
});
}else{
return
}
//开启心跳
// state.interval=setInterval(() => {
// //发送心跳
// var dataxt = {
// 'userId': uni.getStorageSync("userinfo").id, //
// 'type': 'HEARTBEAT'
// }
// state.socketTask.send({
// data: JSON.stringify(dataxt),
// success() {
// console.log("心跳消息发送成功");
// },
// fail(e){
// console.log('心跳发送失败了 ...执行重连');
// state.isConnect=false;
// clearInterval(state.interval);
// state.socketTask.close({})
// _this.dispatch('reConnect');
// }
// });
// }, state.timeout);
state.socketTask.onMessage((res) => {
console.log("收到服务器内容111111:" + res.data);
let datas=res.data;
if(datas.includes('msg')&&!datas.includes('HEARTBEAT')){
//console.log("收到服务器内容:" + JSON.stringify(state.eventlist));
let {id,fromGodId,toGodId,headImg,toGroupId,address,msgType,src,latitude,content,width,name,time,contentType,height,longitude,longTime}=JSON.parse(datas).data
if(contentType=="SINGLE_SENDING"&&msgType<5){
uni.showTabBarRedDot({index:2})
state.eventlist=JSON.parse(datas).data;
plus.sqlite.executeSql({
name: 'first',
sql: `insert into databasedl values('${id}','${fromGodId}','${toGodId}','${toGroupId}','${headImg}','${longTime}','${width}','${height}','${name}','${address}','${latitude}','${longitude}','${content}','${src}','${msgType}','${contentType}','${time}')`,
success: function(e) {
console.log('插入数据成功')
//plus.nativeUI.alert('插入数据成功');
},
fail: function(e) {
console.log('插入数据失败 ')
//plus.nativeUI.alert('插入数据失败');
}
});
}else if(contentType=="GROUP_SENDING"&&msgType<5){
state.grouplist=JSON.parse(datas).data;
console.log(JSON.parse(datas).data)
// plus.sqlite.executeSql({
// name: 'first',
// sql: `insert into databaseql values('${id}','${fromGodId}','${toGodId}','${toGroupId}','${headImg}','${longTime}','${width}','${height}','${name}','${address}','${latitude}','${longitude}','${content}','${src}','${msgType}','${contentType}','${time}')`,
// success: function(e) {
// console.log('插入数据成功')
// //plus.nativeUI.alert('插入数据成功');
// },
// fail: function(e) {
// console.log('插入数据失败 ')
// //plus.nativeUI.alert('插入数据失败');
// }
// });
}else if(contentType=="ADVICE"&&msgType>=5){
console.log("收到服务器通知55555:" + datas);
state.advice=JSON.parse(datas).data;
}
}
});
})
// 监听关闭
state.socketTask.onClose(()=>{
// state.socketTask = null;
//清除定时器
state.isConnect=false;
// clearInterval(state.interval);
//state.interval = null
});
// 监听错误
state.socketTask.onError((e)=>{
//state.socketTask = null;
state.isConnect=false;
// clearInterval(state.interval);
});
uni.onNetworkStatusChange(function (res) {
if(!res.isConnected){
_this.dispatch('reConnect');
}
});
}else{
console.log('网络已断开');
state.isConnect=false;
// 网络断开后显示model
uni.showModal({
title: '网络错误',
content: '请重新打开网络',
showCancel: false,
success: function(res) {
if (res.confirm) {
console.log('用户点击确定')
}
}
})
}
}
});
},
EMPTY(state){
state.newadvice=0;
},
WEBSOCKET_CLOSE(state){
state.isConnect=false;
//clearInterval(state.interval);
console.log('熄灯了111')
state.socketTask.close({})
},
WEBSOCKET_SEND(state, p) {
const that=this;
state.sucees=null;
console.log("ws发送!");
state.socketTask.send({
data: p,
async success() {
state.sucees=true
console.log('发送成功')
},
async fail(e){
console.log('发送失败')
if( state.connectNum>10){
uni.showToast({
title: '聊天服务器不稳定,正在重连...',
icon:'none'
});
}
state.isConnect=false;
state.sucees=false
state.socketTask.close({})
that.dispatch('WEBSOCKET_INIT');
setTimeout(()=>{
that.dispatch('WEBSOCKET_SEND',p);
state.connectNum += 1;
},300)
}
});
},
},
actions: {
EMPTY({
commit
}){
commit('EMPTY')
},
WEBSOCKET_INIT({
commit
}, url) {
commit('WEBSOCKET_INIT', url)
},
WEBSOCKET_CLOSE({
commit,state
}) {
console.log('灯熄灭了')
commit('WEBSOCKET_CLOSE')
},
WEBSOCKET_SEND({
commit,state
}, p) {
commit('WEBSOCKET_SEND', p)
},
reConnect({commit,state}) {
console.log('重连1111')
if (state.connectNum > 5) {
state.socketTask.close({})
state.isConnect=false;
clearInterval(state.interval);
uni.showToast({
title: '聊天服务中断,请重新登录',
icon:'none'
});
uni.reLaunch({
url: '/pages/login/index'
});
state.connectNum += 1;
}else if (state.connectNum > 50) {
state.timer = setTimeout(() => {
commit('WEBSOCKET_INIT')
}, 50000)
state.connectNum += 1;
} else {
console.log('重连')
state.timer = setTimeout(() => {
commit('WEBSOCKET_INIT')
}, 3000)
state.connectNum += 1;
}
},
JYJPUSH_INIT({
commit
}){
commit('JYJPUSH_INIT')
}
}
})
欢迎咨询问题,带前端徒弟小白QQ728045048
收起阅读 »
关于打包后相机相册无法使用以及无法成功更新安装包的问题
无法使用模块功能首先考虑模块权限是否开启
如果都开启了而且本机测试也没问题,
那么十有八九是因为打包使用公共签名的原因。
改私有签名就可以了。
另外如果无法成功更新安装包也有这个原因
就是之前打包是公有签名,后面打了私有签名包,就无法正常更新。
无法使用模块功能首先考虑模块权限是否开启
如果都开启了而且本机测试也没问题,
那么十有八九是因为打包使用公共签名的原因。
改私有签名就可以了。
另外如果无法成功更新安装包也有这个原因
就是之前打包是公有签名,后面打了私有签名包,就无法正常更新。

招聘,坐标 河南郑州 职位 前端开发工程师 有Uni-APP实际项目开发经验
岗位职责:
1、负责前端界面的构建,组件的开发,各类交互的设计和实现;
2、参与系统需求分析,设计,编码等开发工作;
3、熟悉、调研公司竞品信息,并从开发角度为公司核心产品完善提出有价值建议;
4、持续为自己负责,为产品负责,为团队负责的精神自我迭代。
岗位要求:
1、1-3年工作经验,计算机专业科班出身 本科及以上学历,优秀毕业生也可以;
2、有Uni-APP实际项目开发经验 ;
2、精通html,css,JavaScript,具有一定框架设计能力,熟练使用git;
3、熟练使用vue前端开发框架及衍生框架;
4、能够提供完善的webapp技术方案,有熟悉的前端工程化经验;
5、有进取心,具有良好的沟通能力 和团队合作精神,具有优秀的分析问题和解决问题的能力;
特别说明
1、公司为自己研发产品,对开发人员综合素养要求偏高,重视职业素养,同样公司也为开发工程师提供了最优的设备,开发环境 ,学习环境;
2、我们是创业公司,产品已经迭代两年多,超过1万项的更新,我们还在持续迭代新零售场景的数智化解决方案,我们希望你是一个有极客精神的,对零售行业数智化有兴趣的开发者;
3、我们认为,工资是你工作的最低汇报,我们希望你在工作中不是只收获了一份儿工资,还能收获能力的成长,精神层次的提升;
4、我们希望你是一个有趣的人,我们一起去做一些有趣的事,让这个社会更美好一些,让我们的技术不单单为自己和家人养家糊口,还为这个社会的其他人创造了价值;
5、用技术为零售企业创造价值,我们不是一句口号,为此我们已经践行了超过1000天;
福利待遇:
1、薪资+社保+国家法定带薪休假+各种团建活动+员工旅游+中午员工餐;
2、大牛带队+广阔的晋升空间。
上班时间:9:30-12:00 13:30-18:30 。周末休息:大小周。
工作地点:郑州市高新区大学科技园(东区) 11号楼。
岗位职责:
1、负责前端界面的构建,组件的开发,各类交互的设计和实现;
2、参与系统需求分析,设计,编码等开发工作;
3、熟悉、调研公司竞品信息,并从开发角度为公司核心产品完善提出有价值建议;
4、持续为自己负责,为产品负责,为团队负责的精神自我迭代。
岗位要求:
1、1-3年工作经验,计算机专业科班出身 本科及以上学历,优秀毕业生也可以;
2、有Uni-APP实际项目开发经验 ;
2、精通html,css,JavaScript,具有一定框架设计能力,熟练使用git;
3、熟练使用vue前端开发框架及衍生框架;
4、能够提供完善的webapp技术方案,有熟悉的前端工程化经验;
5、有进取心,具有良好的沟通能力 和团队合作精神,具有优秀的分析问题和解决问题的能力;
特别说明
1、公司为自己研发产品,对开发人员综合素养要求偏高,重视职业素养,同样公司也为开发工程师提供了最优的设备,开发环境 ,学习环境;
2、我们是创业公司,产品已经迭代两年多,超过1万项的更新,我们还在持续迭代新零售场景的数智化解决方案,我们希望你是一个有极客精神的,对零售行业数智化有兴趣的开发者;
3、我们认为,工资是你工作的最低汇报,我们希望你在工作中不是只收获了一份儿工资,还能收获能力的成长,精神层次的提升;
4、我们希望你是一个有趣的人,我们一起去做一些有趣的事,让这个社会更美好一些,让我们的技术不单单为自己和家人养家糊口,还为这个社会的其他人创造了价值;
5、用技术为零售企业创造价值,我们不是一句口号,为此我们已经践行了超过1000天;
福利待遇:
1、薪资+社保+国家法定带薪休假+各种团建活动+员工旅游+中午员工餐;
2、大牛带队+广阔的晋升空间。
上班时间:9:30-12:00 13:30-18:30 。周末休息:大小周。
工作地点:郑州市高新区大学科技园(东区) 11号楼。