HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

2021插件大赛和行业服务商招标启动!200万元等你来分!

插件大赛

2021年,DCloud的生态建设,力度空前,200万元奖金池等你来分。
本次同时举办2个活动:1、插件大赛,30万奖金池;2、“DCloud行业认证服务商”招标,170万元扶持资金。

2021插件大赛

前年的插件大赛奖金只有几万,去年的插件大赛提升到十几万,而今年,插件大赛的总奖金池达到了30万

大赛奖品设置

  • 特等奖:
    奖品:5万元插件包销 + 旗舰手机1部(iphone 12 5G 或 华为P40 Pro 5G 2选1)+ 插件市场置顶推荐1个月 + HBuilderX预置 + DCloud奖牌
    名额:1名
  • 一等奖:
    奖品:3万元插件包销 + 旗舰手机1部(iphone 12 5G 或 华为P40 Pro 5G 2选1)+ 插件市场置顶推荐半个月 + DCloud奖牌
    名额:3名
  • 二等奖
    奖品:1万元插件包销 + 极客外设1台(HHKB 机械键盘 或 小米 34寸曲面显示器 2选1)+ 插件市场置顶推荐1个星期 + DCloud奖牌
    名额:5名
  • 三等奖
    奖品:500元uniCloud代金券 + HBuilderX超大鼠标垫 + DCloud奖牌
    名额:10名
  • 贡献奖
    奖品:HBuilderX超大鼠标垫
    名额:70名
  • 合作伙伴赞助
    奖品:个推限量定制款双肩包、个推定制款精美马克杯
    名额:各30名

中奖范围88人!

“插件包销”,是指获奖插件通过插件市场销售,DCloud兜底包销。以特等奖的5万元包销为例,如果获奖插件在插件市场1年内销售额没有达到5万元,则由DCloud付差额给获奖者进行兜底。包销只针对付费插件,如免费插件获得二等奖及以上奖励,其中的包销奖励无效。

“插件包销”即不虚、也不遥远,去年插件大赛获包销奖励的插件,均提前完成包销。其价值就是实实在在的人民币。

“HBuilderX预置”,是在HBuilderX新建项目界面,可直接选择该项目模板。这为插件带来大量的流量。下图为去年获奖插件在HBuilderX预置的效果:

DCloud奖牌是实体奖品,并附有二维码,如下图:

除上述奖品外,

  • 所有获奖插件作者,都将进入DCloud VIP技术支持群,享受优先的技术支付、问题反馈。
  • 所有获奖插件的集锦页面,还将通过HBuilderX工具、论坛、QQ微信群进行全量推广,给予优秀插件充分的曝光。

本次插件大赛的参赛要求:

  1. 组件类、JSSDK类插件必须符合uni_modules规范
  2. 组件类插件,必须符合DataCom规范
  3. 项目类插件,必须是云端一体项目。前端部分使用uni-app(如涉及pc端,pc端也需uni-app),云端使用uniCloud。如果涉及账户体系,需使用uni-id。(项目根目录下有uni_modules的package.json规范文件即可,不是要把项目放到uni_modules目录下。)
  4. ide类、原生插件类无需遵循上述限制
  5. 在本次大赛有效期内提交插件到插件市场,且下载人数不低于50人。

4类鼓励插件说明

有4类插件,属于鼓励类型,拥有更高的获奖概率。

1. uniCloud插件

尤其鼓励

  • 项目模板类:包括问卷调研、投票、报名、电子书、漫画、小游戏、小工具
  • 客服类插件:可方便嵌入其他App,提供客服能力
  • DB Schema:各种相对通用的表模板
  • 数据导入:从其他系统迁移到uniCloud,例如从wordpress、discuz、ecshop等导数据到uniCloud中
  • 数据统计分析:图表类、基于opendb的各种统计:订单销量统计、文章阅读统计...

DCloud会提供uniCloud插件的产权保护、试用、付费销售、流量供应。除了获奖之外,还可以在插件市场进行销售

2. 全端、全球适配插件

  • PC、H5、App-vue、App-nvue、微信/阿里/百度/字节跳动/QQ小程序,全端支持
  • 支持国际化、多语言(DCloud今年设定了出海战略,欢迎开发者一起参与)

3. HBuilderX插件

欢迎所有为开发者提供服务的公司,来通过HBuilderX插件的方式获取进入DCloud生态,获取开发者流量。
尤其鼓励:

  • 源码托管
  • App一键发布
  • 手机测试服务
  • 持续集成
  • 或其他vscode的流行插件迁移到HBuilderX中

为其他开发者提供服务的专业服务商,可以通过HBuilderX的用户开放平台,打通HBuilderX用户和自己服务的链路。

4. 有助于变现和运营的插件

插件里包含 uni-AD 的插件,以帮助开发者更好的运营变现。

  • 电子书模板阅读一定章节后,需观看激励视频
  • 激励视频与积分、区块链相结合的模板
  • 基于uni-id的签到激励,提供帮助开发者提升留存手段的插件
  • 基于uni-id裂变模型的分享海报插件
  • 基于uni-id的拼团插件
  • 基于uniCloud的抽奖、红包插件

如果这些模板同时包含uniCloud,那大奖就离你非常近了:)

注:鼓励的4类插件将占据大部分获奖名额,非鼓励插件如果插件做的确实好(参考用户的下载量、评价、赞赏量、销量),也会获奖。

大赛起止时间

  • 即日起至2021年5月31日24点之前更新插件
  • 2021年6月1-4日,评委评选获奖者。
  • 2021年6月7日,公布获奖名单并发放奖品(更新:因部分可以获奖的优秀插件的最新版更新出错误,需要处理,为了让开发者在拿到获奖名单后可以顺畅的体验这些优秀作品,公布获奖名单的时间推后到6月9日)

参赛方式

  1. 注册插件市场并登陆账号,https://ext.dcloud.net.cn/
  2. 点击发布插件,插件开发指南参考:https://ask.dcloud.net.cn/article/35408
  3. 填写插件描述信息并提交发布

获奖结果

2021年插件大赛获奖结果已经公布:https://ask.dcloud.net.cn/article/39133

DCloud行业认证服务商招标

“DCloud行业认证服务商”,是DCloud官方认可的在某行业的企业级合作伙伴。

“DCloud行业认证服务商”将享受:

  1. DCloud官方背书,获得奖牌和电子证书,可在DCloud官网查询
  2. DCloud为每个行业认证服务商提供10万元扶持金(不是插件包销,也不影响插件继续在插件市场定价销售)
  3. DCloud在该行业所得的销售线索、外包订单将都交给行业认证服务商
  4. DCloud产品的销售代理资质(uniCloud公用云返佣,同时今年会推出私有云,有更高的代理价差空间)
  5. DCloud提供专属技术支持

如何成为“DCloud行业认证服务商”?

  1. 向DCloud发邮件提交“DCloud行业认证服务商”申请表(见附件)
  2. 在插件市场提交所擅长行业的云端一体项目模板。比如“企业办公”行业的服务商,就需要在插件市场提交一个办公OA类的项目模板。所有模板需基于uni-id,因为这将使需要数字应用的企业主方便的整合,选一个OA模板,再选一个CRM模板,快速组合成一个应用,天然打通账户。
  3. DCloud会与申请者详细沟通,签署资金资助合同

DCloud计划招标的17个行业清单:

  • 可视化拖拽、低代码
  • 社区论坛(DCloud问答社区有意向改版为uniCloud模式,希望行业服务商提供方案,要求支持PC/H5/App/小程序,支持国际化)
  • 电商(全端、裂变、拼团、促销,各种功能完善)
  • 网赚游戏
  • BPM流程管理
  • 政企内部办公(可以基于钉钉、企业微信等平台)
  • 电子政务(智慧城市、或工商、税务等各个委办局业务系统)
  • 线下商户(社区团购、超市、KTV、饭店、饮品店、旅游景点等)
  • 地方信息港
  • 直播
  • 企业自助建站
  • 教育(学校、线上教育)
  • 医疗(各种医院、相关机构普遍需求的应用)
  • CRM
  • 招聘
  • 研发任务管理
  • 研发质量管理

本次行业认证服务商招标预算170万。在电子政务和线下商户等范围较大的领域,可额外增加扶持资金。

若开发商属于其他行业,也可与DCloud沟通探讨扩展新行业。对于有意义的行业,DCloud可以继续追加预算。

“DCloud行业认证服务商”只面向企业。个人可以参加插件大赛,不能申报“DCloud行业认证服务商”。

“DCloud行业认证服务商”需要对所处行业有丰富经验。提交的行业应用项目插件,需在该行业的各种竞品应用中有足够的竞争力。并且有较为广泛的B端需求。

“DCloud行业认证服务商”长期招募,但给予扶持金的招标截止时间是2021年7月1日(与插件大赛截止时间不同)。每个行业只有第一家认证服务商可以拿到扶持金,先到先得,有意向请从速报名。

申请表见附件《DCloud行业认证服务商申请表.doc》

本活动解释权归DCloud.io所有

后记

不管插件大赛还是行业认证服务商招标,截止时间表面看似紧张,实则足够。因为DCloud的开发平台效率实在太高了。如果开发者真的掌握了 HBuilder + uni-app + uniCloud 三剑客,开发效率至少高出其他开发平台10倍。

中国的数字化,全球领先。其他国家生产数字应用的效率和成本远不如中国。而DCloud平台的800多万开发者,开发了十几亿月活的应用,为中国数字化做出了重要贡献。疫情期间,DCloud平台快速完成数百个抗疫项目的上线,这在任何其他国家都不可想象。

没有最好,只有更好。成功的插件大赛和优秀的行业应用,可以让中国的数字化进程继续加速。欢迎广大开发者参与到这一进程中,让应用开发变得更快更好。

HBuilderX和uni系列的文档,同时在紧锣密鼓的筹备多语言版本。接下里,欢迎开发者和我们一起,把中国高效的开发工具和生态输出到海外,为全球数字化贡献中国智慧!

行业认证服务商清单

经过评定,目前已经获得行业服务商资格的公司包括:

继续阅读 »

2021年,DCloud的生态建设,力度空前,200万元奖金池等你来分。
本次同时举办2个活动:1、插件大赛,30万奖金池;2、“DCloud行业认证服务商”招标,170万元扶持资金。

2021插件大赛

前年的插件大赛奖金只有几万,去年的插件大赛提升到十几万,而今年,插件大赛的总奖金池达到了30万

大赛奖品设置

  • 特等奖:
    奖品:5万元插件包销 + 旗舰手机1部(iphone 12 5G 或 华为P40 Pro 5G 2选1)+ 插件市场置顶推荐1个月 + HBuilderX预置 + DCloud奖牌
    名额:1名
  • 一等奖:
    奖品:3万元插件包销 + 旗舰手机1部(iphone 12 5G 或 华为P40 Pro 5G 2选1)+ 插件市场置顶推荐半个月 + DCloud奖牌
    名额:3名
  • 二等奖
    奖品:1万元插件包销 + 极客外设1台(HHKB 机械键盘 或 小米 34寸曲面显示器 2选1)+ 插件市场置顶推荐1个星期 + DCloud奖牌
    名额:5名
  • 三等奖
    奖品:500元uniCloud代金券 + HBuilderX超大鼠标垫 + DCloud奖牌
    名额:10名
  • 贡献奖
    奖品:HBuilderX超大鼠标垫
    名额:70名
  • 合作伙伴赞助
    奖品:个推限量定制款双肩包、个推定制款精美马克杯
    名额:各30名

中奖范围88人!

“插件包销”,是指获奖插件通过插件市场销售,DCloud兜底包销。以特等奖的5万元包销为例,如果获奖插件在插件市场1年内销售额没有达到5万元,则由DCloud付差额给获奖者进行兜底。包销只针对付费插件,如免费插件获得二等奖及以上奖励,其中的包销奖励无效。

“插件包销”即不虚、也不遥远,去年插件大赛获包销奖励的插件,均提前完成包销。其价值就是实实在在的人民币。

“HBuilderX预置”,是在HBuilderX新建项目界面,可直接选择该项目模板。这为插件带来大量的流量。下图为去年获奖插件在HBuilderX预置的效果:

DCloud奖牌是实体奖品,并附有二维码,如下图:

除上述奖品外,

  • 所有获奖插件作者,都将进入DCloud VIP技术支持群,享受优先的技术支付、问题反馈。
  • 所有获奖插件的集锦页面,还将通过HBuilderX工具、论坛、QQ微信群进行全量推广,给予优秀插件充分的曝光。

本次插件大赛的参赛要求:

  1. 组件类、JSSDK类插件必须符合uni_modules规范
  2. 组件类插件,必须符合DataCom规范
  3. 项目类插件,必须是云端一体项目。前端部分使用uni-app(如涉及pc端,pc端也需uni-app),云端使用uniCloud。如果涉及账户体系,需使用uni-id。(项目根目录下有uni_modules的package.json规范文件即可,不是要把项目放到uni_modules目录下。)
  4. ide类、原生插件类无需遵循上述限制
  5. 在本次大赛有效期内提交插件到插件市场,且下载人数不低于50人。

4类鼓励插件说明

有4类插件,属于鼓励类型,拥有更高的获奖概率。

1. uniCloud插件

尤其鼓励

  • 项目模板类:包括问卷调研、投票、报名、电子书、漫画、小游戏、小工具
  • 客服类插件:可方便嵌入其他App,提供客服能力
  • DB Schema:各种相对通用的表模板
  • 数据导入:从其他系统迁移到uniCloud,例如从wordpress、discuz、ecshop等导数据到uniCloud中
  • 数据统计分析:图表类、基于opendb的各种统计:订单销量统计、文章阅读统计...

DCloud会提供uniCloud插件的产权保护、试用、付费销售、流量供应。除了获奖之外,还可以在插件市场进行销售

2. 全端、全球适配插件

  • PC、H5、App-vue、App-nvue、微信/阿里/百度/字节跳动/QQ小程序,全端支持
  • 支持国际化、多语言(DCloud今年设定了出海战略,欢迎开发者一起参与)

3. HBuilderX插件

欢迎所有为开发者提供服务的公司,来通过HBuilderX插件的方式获取进入DCloud生态,获取开发者流量。
尤其鼓励:

  • 源码托管
  • App一键发布
  • 手机测试服务
  • 持续集成
  • 或其他vscode的流行插件迁移到HBuilderX中

为其他开发者提供服务的专业服务商,可以通过HBuilderX的用户开放平台,打通HBuilderX用户和自己服务的链路。

4. 有助于变现和运营的插件

插件里包含 uni-AD 的插件,以帮助开发者更好的运营变现。

  • 电子书模板阅读一定章节后,需观看激励视频
  • 激励视频与积分、区块链相结合的模板
  • 基于uni-id的签到激励,提供帮助开发者提升留存手段的插件
  • 基于uni-id裂变模型的分享海报插件
  • 基于uni-id的拼团插件
  • 基于uniCloud的抽奖、红包插件

如果这些模板同时包含uniCloud,那大奖就离你非常近了:)

注:鼓励的4类插件将占据大部分获奖名额,非鼓励插件如果插件做的确实好(参考用户的下载量、评价、赞赏量、销量),也会获奖。

大赛起止时间

  • 即日起至2021年5月31日24点之前更新插件
  • 2021年6月1-4日,评委评选获奖者。
  • 2021年6月7日,公布获奖名单并发放奖品(更新:因部分可以获奖的优秀插件的最新版更新出错误,需要处理,为了让开发者在拿到获奖名单后可以顺畅的体验这些优秀作品,公布获奖名单的时间推后到6月9日)

参赛方式

  1. 注册插件市场并登陆账号,https://ext.dcloud.net.cn/
  2. 点击发布插件,插件开发指南参考:https://ask.dcloud.net.cn/article/35408
  3. 填写插件描述信息并提交发布

获奖结果

2021年插件大赛获奖结果已经公布:https://ask.dcloud.net.cn/article/39133

DCloud行业认证服务商招标

“DCloud行业认证服务商”,是DCloud官方认可的在某行业的企业级合作伙伴。

“DCloud行业认证服务商”将享受:

  1. DCloud官方背书,获得奖牌和电子证书,可在DCloud官网查询
  2. DCloud为每个行业认证服务商提供10万元扶持金(不是插件包销,也不影响插件继续在插件市场定价销售)
  3. DCloud在该行业所得的销售线索、外包订单将都交给行业认证服务商
  4. DCloud产品的销售代理资质(uniCloud公用云返佣,同时今年会推出私有云,有更高的代理价差空间)
  5. DCloud提供专属技术支持

如何成为“DCloud行业认证服务商”?

  1. 向DCloud发邮件提交“DCloud行业认证服务商”申请表(见附件)
  2. 在插件市场提交所擅长行业的云端一体项目模板。比如“企业办公”行业的服务商,就需要在插件市场提交一个办公OA类的项目模板。所有模板需基于uni-id,因为这将使需要数字应用的企业主方便的整合,选一个OA模板,再选一个CRM模板,快速组合成一个应用,天然打通账户。
  3. DCloud会与申请者详细沟通,签署资金资助合同

DCloud计划招标的17个行业清单:

  • 可视化拖拽、低代码
  • 社区论坛(DCloud问答社区有意向改版为uniCloud模式,希望行业服务商提供方案,要求支持PC/H5/App/小程序,支持国际化)
  • 电商(全端、裂变、拼团、促销,各种功能完善)
  • 网赚游戏
  • BPM流程管理
  • 政企内部办公(可以基于钉钉、企业微信等平台)
  • 电子政务(智慧城市、或工商、税务等各个委办局业务系统)
  • 线下商户(社区团购、超市、KTV、饭店、饮品店、旅游景点等)
  • 地方信息港
  • 直播
  • 企业自助建站
  • 教育(学校、线上教育)
  • 医疗(各种医院、相关机构普遍需求的应用)
  • CRM
  • 招聘
  • 研发任务管理
  • 研发质量管理

本次行业认证服务商招标预算170万。在电子政务和线下商户等范围较大的领域,可额外增加扶持资金。

若开发商属于其他行业,也可与DCloud沟通探讨扩展新行业。对于有意义的行业,DCloud可以继续追加预算。

“DCloud行业认证服务商”只面向企业。个人可以参加插件大赛,不能申报“DCloud行业认证服务商”。

“DCloud行业认证服务商”需要对所处行业有丰富经验。提交的行业应用项目插件,需在该行业的各种竞品应用中有足够的竞争力。并且有较为广泛的B端需求。

“DCloud行业认证服务商”长期招募,但给予扶持金的招标截止时间是2021年7月1日(与插件大赛截止时间不同)。每个行业只有第一家认证服务商可以拿到扶持金,先到先得,有意向请从速报名。

申请表见附件《DCloud行业认证服务商申请表.doc》

本活动解释权归DCloud.io所有

后记

不管插件大赛还是行业认证服务商招标,截止时间表面看似紧张,实则足够。因为DCloud的开发平台效率实在太高了。如果开发者真的掌握了 HBuilder + uni-app + uniCloud 三剑客,开发效率至少高出其他开发平台10倍。

中国的数字化,全球领先。其他国家生产数字应用的效率和成本远不如中国。而DCloud平台的800多万开发者,开发了十几亿月活的应用,为中国数字化做出了重要贡献。疫情期间,DCloud平台快速完成数百个抗疫项目的上线,这在任何其他国家都不可想象。

没有最好,只有更好。成功的插件大赛和优秀的行业应用,可以让中国的数字化进程继续加速。欢迎广大开发者参与到这一进程中,让应用开发变得更快更好。

HBuilderX和uni系列的文档,同时在紧锣密鼓的筹备多语言版本。接下里,欢迎开发者和我们一起,把中国高效的开发工具和生态输出到海外,为全球数字化贡献中国智慧!

行业认证服务商清单

经过评定,目前已经获得行业服务商资格的公司包括:

收起阅读 »

关于部分网络无法打开DCloud网址的问题

网络

近期(2021年3月下旬),个别地方网络运营商解析dcloud.net.cn时,错误解析到127.0.0.1。
此问题原因已查清,有故障的地方运营商正在陆续恢复中。
期间遇到问题的开发者,临时方案有2种:

方案1. 修改 DNS 为:114.114.114.114

windows上修改dns步骤如下:

  1. 首先在打开:控制面板\所有控制面板项\网络连接,然后选中当前正在联网的网络适配器,然后点击“更改此连接的设置”。
  2. 选中“Internet 协议版本 4(TCP/IPv4)”,然后点“属性”
  3. 选择“使用下面的DNS服务器地址”,在下面的输入框中输入 114.114.114.114,然后点确认关闭对话框

mac上修改dns如下

https://www.pc841.com/article/20141208-39054.html

方案2. 切换网络运营商

比如当地的联通有问题,可以切换移动或电信等网络。

继续阅读 »

近期(2021年3月下旬),个别地方网络运营商解析dcloud.net.cn时,错误解析到127.0.0.1。
此问题原因已查清,有故障的地方运营商正在陆续恢复中。
期间遇到问题的开发者,临时方案有2种:

方案1. 修改 DNS 为:114.114.114.114

windows上修改dns步骤如下:

  1. 首先在打开:控制面板\所有控制面板项\网络连接,然后选中当前正在联网的网络适配器,然后点击“更改此连接的设置”。
  2. 选中“Internet 协议版本 4(TCP/IPv4)”,然后点“属性”
  3. 选择“使用下面的DNS服务器地址”,在下面的输入框中输入 114.114.114.114,然后点确认关闭对话框

mac上修改dns如下

https://www.pc841.com/article/20141208-39054.html

方案2. 切换网络运营商

比如当地的联通有问题,可以切换移动或电信等网络。

收起阅读 »

uniapp做微信公众号网页支付

const base_url = encodeURIComponent('xxxxxx/wx/index.html')// 前端域名  
        const wx_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxx+'&redirect_uri='+base_url+'&response_type=code&scope=snsapi_base&state=123#wechat_redirect'  
onLoad() {  
             // 获取URL 上code  

             if(!this.isWechat()){  
                   window.location.href="http://www." ;    
                  return  
             }   
               const code = this.getUrlParam('code')  
                // 判断是否存在code  
                if(code == null || code == '') {  
                    // 重新获取code  
                    // console.log(code)  
                   window.location.href = wx_url  
                } else {  
                    // 发送code             
                        this.postCode(code)  
                }  
            this.init()  
            var uanew = window.navigator.userAgent.toLowerCase();  
            if (uanew.match(/micromessenger/i) == 'micromessenger') {  
                //console.log('是微信客户端')    
                this.iswechat=false  
            } else {  
                //console.log('不是微信客户端')    
                this.iswechat=true  
            }  
        },  

method:{  

 // 解析URL 参数  
                    getUrlParam(name) {  
                        let reg = new RegExp('(^|&)'+ name + '=([^&]*)(&|$)')  
                        let r = window.location.search.substr(1).match(reg)  
                        if(r!=null){  
                            return unescape(r[2])  
                        }   
                        return null  
                    },  

    //判断是否在微信中  
            isWechat() {  
                var ua = window.navigator.userAgent.toLowerCase();  
                if (ua.match(/micromessenger/i) == 'micromessenger') {  
                    //console.log('是微信客户端')    
                    return true;  
                } else {  
                    //console.log('不是微信客户端')    
                    return false;  
                }  
            },  
}  

不懂的联系我(找昵称)

继续阅读 »
const base_url = encodeURIComponent('xxxxxx/wx/index.html')// 前端域名  
        const wx_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxx+'&redirect_uri='+base_url+'&response_type=code&scope=snsapi_base&state=123#wechat_redirect'  
onLoad() {  
             // 获取URL 上code  

             if(!this.isWechat()){  
                   window.location.href="http://www." ;    
                  return  
             }   
               const code = this.getUrlParam('code')  
                // 判断是否存在code  
                if(code == null || code == '') {  
                    // 重新获取code  
                    // console.log(code)  
                   window.location.href = wx_url  
                } else {  
                    // 发送code             
                        this.postCode(code)  
                }  
            this.init()  
            var uanew = window.navigator.userAgent.toLowerCase();  
            if (uanew.match(/micromessenger/i) == 'micromessenger') {  
                //console.log('是微信客户端')    
                this.iswechat=false  
            } else {  
                //console.log('不是微信客户端')    
                this.iswechat=true  
            }  
        },  

method:{  

 // 解析URL 参数  
                    getUrlParam(name) {  
                        let reg = new RegExp('(^|&)'+ name + '=([^&]*)(&|$)')  
                        let r = window.location.search.substr(1).match(reg)  
                        if(r!=null){  
                            return unescape(r[2])  
                        }   
                        return null  
                    },  

    //判断是否在微信中  
            isWechat() {  
                var ua = window.navigator.userAgent.toLowerCase();  
                if (ua.match(/micromessenger/i) == 'micromessenger') {  
                    //console.log('是微信客户端')    
                    return true;  
                } else {  
                    //console.log('不是微信客户端')    
                    return false;  
                }  
            },  
}  

不懂的联系我(找昵称)

收起阅读 »

如何让弹框覆盖底部导航栏和顶部导航栏!

经验分享

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

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

uni-app研发需求

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

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

video 模块是否增加AliPlayer播放SDK

VideoPlayer video

现在默认使用的是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解密,保证视频安全。
安全下载 支持对下载的视频进行二次加密,保证被下载的视频仅能通过唯一的应用播放,高级别的防盗措施。
视频缓存 提供视频边播边缓存功能,满足短视频场景下的循环播放,节约用户流量。
视频截图 支持截取播放画面的当前帧,可用于视频封面选取、存储本地或分享精彩画面给朋友。

更新历史

Android更新历史地址

IOS更新历史地址

看更新频率还是比较高的.

计费方式

计费方式

计费说明都是云播及储存计费.并未说明播放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解密,保证视频安全。
安全下载 支持对下载的视频进行二次加密,保证被下载的视频仅能通过唯一的应用播放,高级别的防盗措施。
视频缓存 提供视频边播边缓存功能,满足短视频场景下的循环播放,节约用户流量。
视频截图 支持截取播放画面的当前帧,可用于视频封面选取、存储本地或分享精彩画面给朋友。

更新历史

Android更新历史地址

IOS更新历史地址

看更新频率还是比较高的.

计费方式

计费方式

计费说明都是云播及储存计费.并未说明播放SDK需要收费授权.希望官方能沟通跟进一下!

收起阅读 »

【报Bug】750rpx 在某些机型下,与实际屏幕宽度不符

我们发现在 Android 某些机型下, 宽度 750rpx 会小于实际屏幕宽度,导致750rpx的页面显示会漏出底层页面

目前发现的机型有: 一加7T、三星 S8、S8+、S10、S10+
截图参考附件。

希望能尽快解决,非常感谢!

继续阅读 »

我们发现在 Android 某些机型下, 宽度 750rpx 会小于实际屏幕宽度,导致750rpx的页面显示会漏出底层页面

目前发现的机型有: 一加7T、三星 S8、S8+、S10、S10+
截图参考附件。

希望能尽快解决,非常感谢!

收起阅读 »

uniapp条件语法不生效以及配置问题

Vue uniapp

1.检查pack.json 如图

  1. 没有自定义条件命令 只能支持 官方条件语法
  2. 自定义命令检测命令 如图
  3. vscode运行命令 npm run dev:custom mp-weixin-production 或者 npm run build:custom mp-weixin-production
继续阅读 »

1.检查pack.json 如图

  1. 没有自定义条件命令 只能支持 官方条件语法
  2. 自定义命令检测命令 如图
  3. 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前端消息存储本地数据库

WEBSOCKET 聊天
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

收起阅读 »