
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号楼。

百度一 29 岁程序员因“篡改数据”被抓
近日,中国裁判文书网公布了一起非法控制计算机信息系统、给赌博网站“大开方便之门”的案件,涉及金额达374万元。
据案件显示,在百度时代网络技术(北京)有限公司担任研发工程师的陈某,出生于1992年,利用其职务之便,超越权限,通过篡改数据、编写脚本等方式,违规通过了735个媒体网站账号加入“百度联盟”的申请,致使公司374万元广告分成遭到损害。
经查,陈某在2017年9月至2018年3月的半年间,以审核每个网站300元的价格,据此收受他人给予的人民币235935.4元。
一、为“挣外快”,92年程序员被“拉下水”
根据裁判文书显示,2015年9月16日,陈某入职百度时代网络技术(北京)有限公司,担任研发工程师,所在部门为展示广告平台部的union团队,主要负责展示广告平台部流量端系统的开发工作,权限范围是百度联盟流量端系统的功能开发以及日常上线与维护。
陈某负责该系统的开发与维护工作,无权审核媒体资质,也没有权限对媒体审核服务器计算机系统程序里的数据进行非研发、调试和维护性需要的修改。
2017年8月,自称刘某的男子通过微信联系到陈某,称有“私活”可以“挣外快”,问其能否做快速审核(审核网站是否能有资质承接百度联盟广告),但被陈某拒绝了。
没过多久,刘某从哈尔滨到了北京,在对外经贸大学附近一个饭馆约陈某吃饭,说还是想做审核网站的事情,需要使用百度在职员工的权限,帮助其快速通过审核网站。
这一次,陈某动摇了。他找刘某要了9000元钱,审核每个网站300元,共审核30个。
二、程序员改当“审核员”,篡改数据违规“开绿灯”
百度公司进行网站审核的正常方式是审核部门的员工,依据联盟业务审核标准,对百度联盟风险防控平台待审核联盟潜在客户进行审核。联盟的网站需要通过两道审核,方可上线。
正常流程是客户提交网站先过机器审核策略,机器审核策略过滤掉问题网站(如包含无ICP备案,网址打不开等情况的),将没有触犯机器审核策略的网站推送至人工待审列表中,最终上线需要经过人工审核。
按照流程,百度公司与任何媒体进行广告合作,应该首先由媒体通过流量端系统进行登记网站信息,而后由公司业务审核部门员工进行审核,对符合合作标准的媒体才能通过审核,这些合作媒体后续才能通过百度系统投放线上百度接入的广告,从而获得百度公司的广告分成。
但陈某就职于展示平台广告部,工作职责不包括审核工作。
据裁判文书显示,陈某违规登录联盟风控平台篡改了待审核客户的状态,将不能通过审核的网站直接变更为审核通过状态,从而直接上线。
陈某使用的其中一种方式是通过CURL命令调用流量端系统的媒体审核接口,另一种是通过编写脚本批量操作的方式调用了流量端系统的媒体审核接口,从而篡改数据。
据悉,经过陈某走“绿灯”通过的网站内容,甚至涉及到赌博、彩票等业务。
三、事情败露,陈某当场承认违规操作获利
2018年2月27日,百度公司相关部门发现在风控平台审核媒体时,部分媒体无法进行正常审核操作。
经排查发现,这些媒体在UNION平台中是审核通过状态,但这些媒体在风控平台和UNION平台的审核状态不一致,可能存在人工调用审核接口使这些媒体绕过业审,有异常审核通过的情况存在;
进一步排查分析,发现疑似存在陈某在相关机器上进行了工作职责不相符合的操作,对部分没有经过业审审核的媒体,进行了“媒体审核通过”的操作,异常审核通过的媒体有735个,分成金额3745054元。
2018年3月2日,百度公司相关部门将上述情况以电子邮件形式发送给百度时代网络技术(北京)有限公司职业道德委员会。
公司得知此事后,于2018年3月5日指派相关工作人员找到陈某商谈此事,他当场就承认了通过CURL命令调用流量端系统的媒体审核接口,以及通过编写脚本批量操作的方式调用了流量端系统的媒体审核接口,从而篡改数据,使得部分媒体获利的情况。
公安机关于2018年3月11日接到百度公司报案称公司员工陈某涉嫌破坏计算机信息信息系统犯罪,后于同年4月20日将前往百度公司接受约谈的被告人陈某传唤到案。
四、法院这样判
北京市海淀区人民法院一审认为,陈某违反国家规定,对计算机信息系统中存储、处理的数据进行修改,后果特别严重,其行为已构成破坏计算机信息系统罪,应予惩处。
法院指出,被告人陈某利用其工作便利,在没有得到单位授权,也不是基于对单位计算机信息系统进行研发、维护、调试等工作需要的情况下,而是为了谋取其个人私利,超越其工作权限,采用技术手段擅自调用媒体接口,违规使大量网站通过媒体资质审核,将待审核的数据变更为审核通过的数据,系违规修改百度时代网络技术(北京)有限公司计算机信息系统内所存储、处理的相应分类数据的范围,因此该行为符合破坏计算机信息系统罪中对破坏行为的定义。
鉴于被告人陈某犯罪以后主动投案,到案后能如实供述其所犯罪行,系自首,且积极退缴全部违法所得,并赔偿了所在单位因本案而支出的信息技术服务费,亦取得了所在单位的谅解,有较好的悔罪表现,故本院对其依法减轻处罚。
最终,被告人陈某以犯破坏计算机信息系统罪,被判处有期徒刑一年九个月,并没收所有违法所得。
————————————————
版权声明:本文为CSDN博主「CSDN 程序人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csdnsevenn/article/details/114683563
此文章转载自CSDN博主「CSDN 程序人生」的原创文章,如有不当联系邮箱:pufa@dcloud.io 。
近日,中国裁判文书网公布了一起非法控制计算机信息系统、给赌博网站“大开方便之门”的案件,涉及金额达374万元。
据案件显示,在百度时代网络技术(北京)有限公司担任研发工程师的陈某,出生于1992年,利用其职务之便,超越权限,通过篡改数据、编写脚本等方式,违规通过了735个媒体网站账号加入“百度联盟”的申请,致使公司374万元广告分成遭到损害。
经查,陈某在2017年9月至2018年3月的半年间,以审核每个网站300元的价格,据此收受他人给予的人民币235935.4元。
一、为“挣外快”,92年程序员被“拉下水”
根据裁判文书显示,2015年9月16日,陈某入职百度时代网络技术(北京)有限公司,担任研发工程师,所在部门为展示广告平台部的union团队,主要负责展示广告平台部流量端系统的开发工作,权限范围是百度联盟流量端系统的功能开发以及日常上线与维护。
陈某负责该系统的开发与维护工作,无权审核媒体资质,也没有权限对媒体审核服务器计算机系统程序里的数据进行非研发、调试和维护性需要的修改。
2017年8月,自称刘某的男子通过微信联系到陈某,称有“私活”可以“挣外快”,问其能否做快速审核(审核网站是否能有资质承接百度联盟广告),但被陈某拒绝了。
没过多久,刘某从哈尔滨到了北京,在对外经贸大学附近一个饭馆约陈某吃饭,说还是想做审核网站的事情,需要使用百度在职员工的权限,帮助其快速通过审核网站。
这一次,陈某动摇了。他找刘某要了9000元钱,审核每个网站300元,共审核30个。
二、程序员改当“审核员”,篡改数据违规“开绿灯”
百度公司进行网站审核的正常方式是审核部门的员工,依据联盟业务审核标准,对百度联盟风险防控平台待审核联盟潜在客户进行审核。联盟的网站需要通过两道审核,方可上线。
正常流程是客户提交网站先过机器审核策略,机器审核策略过滤掉问题网站(如包含无ICP备案,网址打不开等情况的),将没有触犯机器审核策略的网站推送至人工待审列表中,最终上线需要经过人工审核。
按照流程,百度公司与任何媒体进行广告合作,应该首先由媒体通过流量端系统进行登记网站信息,而后由公司业务审核部门员工进行审核,对符合合作标准的媒体才能通过审核,这些合作媒体后续才能通过百度系统投放线上百度接入的广告,从而获得百度公司的广告分成。
但陈某就职于展示平台广告部,工作职责不包括审核工作。
据裁判文书显示,陈某违规登录联盟风控平台篡改了待审核客户的状态,将不能通过审核的网站直接变更为审核通过状态,从而直接上线。
陈某使用的其中一种方式是通过CURL命令调用流量端系统的媒体审核接口,另一种是通过编写脚本批量操作的方式调用了流量端系统的媒体审核接口,从而篡改数据。
据悉,经过陈某走“绿灯”通过的网站内容,甚至涉及到赌博、彩票等业务。
三、事情败露,陈某当场承认违规操作获利
2018年2月27日,百度公司相关部门发现在风控平台审核媒体时,部分媒体无法进行正常审核操作。
经排查发现,这些媒体在UNION平台中是审核通过状态,但这些媒体在风控平台和UNION平台的审核状态不一致,可能存在人工调用审核接口使这些媒体绕过业审,有异常审核通过的情况存在;
进一步排查分析,发现疑似存在陈某在相关机器上进行了工作职责不相符合的操作,对部分没有经过业审审核的媒体,进行了“媒体审核通过”的操作,异常审核通过的媒体有735个,分成金额3745054元。
2018年3月2日,百度公司相关部门将上述情况以电子邮件形式发送给百度时代网络技术(北京)有限公司职业道德委员会。
公司得知此事后,于2018年3月5日指派相关工作人员找到陈某商谈此事,他当场就承认了通过CURL命令调用流量端系统的媒体审核接口,以及通过编写脚本批量操作的方式调用了流量端系统的媒体审核接口,从而篡改数据,使得部分媒体获利的情况。
公安机关于2018年3月11日接到百度公司报案称公司员工陈某涉嫌破坏计算机信息信息系统犯罪,后于同年4月20日将前往百度公司接受约谈的被告人陈某传唤到案。
四、法院这样判
北京市海淀区人民法院一审认为,陈某违反国家规定,对计算机信息系统中存储、处理的数据进行修改,后果特别严重,其行为已构成破坏计算机信息系统罪,应予惩处。
法院指出,被告人陈某利用其工作便利,在没有得到单位授权,也不是基于对单位计算机信息系统进行研发、维护、调试等工作需要的情况下,而是为了谋取其个人私利,超越其工作权限,采用技术手段擅自调用媒体接口,违规使大量网站通过媒体资质审核,将待审核的数据变更为审核通过的数据,系违规修改百度时代网络技术(北京)有限公司计算机信息系统内所存储、处理的相应分类数据的范围,因此该行为符合破坏计算机信息系统罪中对破坏行为的定义。
鉴于被告人陈某犯罪以后主动投案,到案后能如实供述其所犯罪行,系自首,且积极退缴全部违法所得,并赔偿了所在单位因本案而支出的信息技术服务费,亦取得了所在单位的谅解,有较好的悔罪表现,故本院对其依法减轻处罚。
最终,被告人陈某以犯破坏计算机信息系统罪,被判处有期徒刑一年九个月,并没收所有违法所得。
————————————————
版权声明:本文为CSDN博主「CSDN 程序人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csdnsevenn/article/details/114683563
此文章转载自CSDN博主「CSDN 程序人生」的原创文章,如有不当联系邮箱:pufa@dcloud.io 。
收起阅读 »
HBuilderX云打包ios证书的获取方法
使用HBuilderX进行云打包的时候,假如打包的是ios项目,则需要自有证书。
平时这个证书是需要在mac电脑申请的,而我们没有mac电脑,则我们可以使用香蕉云编来生成ios证书:
https://www.yunedit.com/xueyuan/jx/createcert
按照它里面的流程说明创建,就可以完成证书的创建了。
使用HBuilderX进行云打包的时候,假如打包的是ios项目,则需要自有证书。
平时这个证书是需要在mac电脑申请的,而我们没有mac电脑,则我们可以使用香蕉云编来生成ios证书:
https://www.yunedit.com/xueyuan/jx/createcert
按照它里面的流程说明创建,就可以完成证书的创建了。
收起阅读 »