HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

【报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

收起阅读 »

一个人做了个小程序

uniapp uniCloud

工具类的,大概用了半个月左右的时间,每天下了班到家就整一点,今天决定先上一版了,虽然现在功能还比较少,但以后会更新更多实用和有意思的功能,欢迎大家扫码体验、支持……

工具类的,大概用了半个月左右的时间,每天下了班到家就整一点,今天决定先上一版了,虽然现在功能还比较少,但以后会更新更多实用和有意思的功能,欢迎大家扫码体验、支持……

关于打包后相机相册无法使用以及无法成功更新安装包的问题

相机权限 经验分享

无法使用模块功能首先考虑模块权限是否开启
如果都开启了而且本机测试也没问题,
那么十有八九是因为打包使用公共签名的原因。
改私有签名就可以了。

另外如果无法成功更新安装包也有这个原因
就是之前打包是公有签名,后面打了私有签名包,就无法正常更新。

无法使用模块功能首先考虑模块权限是否开启
如果都开启了而且本机测试也没问题,
那么十有八九是因为打包使用公共签名的原因。
改私有签名就可以了。

另外如果无法成功更新安装包也有这个原因
就是之前打包是公有签名,后面打了私有签名包,就无法正常更新。

招聘,坐标 河南郑州 职位 前端开发工程师 有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日将前往百度公司接受约谈的被告人陈某传唤到案。

四、法院这样判

北京市海淀区人民法院一审认为,陈某违反国家规定,对计算机信息系统中存储、处理的数据进行修改,后果特别严重,其行为已构成破坏计算机信息系统罪,应予惩处。

法院指出,被告人陈某利用其工作便利,在没有得到单位授权,也不是基于对单位计算机信息系统进行研发、维护、调试等工作需要的情况下,而是为了谋取其个人私利,超越其工作权限,采用技术手段擅自调用媒体接口,违规使大量网站通过媒体资质审核,将待审核的数据变更为审核通过的数据,系违规修改百度时代网络技术(北京)有限公司计算机信息系统内所存储、处理的相应分类数据的范围,因此该行为符合破坏计算机信息系统罪中对破坏行为的定义。

鉴于被告人陈某犯罪以后主动投案,到案后能如实供述其所犯罪行,系自首,且积极退缴全部违法所得,并赔偿了所在单位因本案而支出的信息技术服务费,亦取得了所在单位的谅解,有较好的悔罪表现,故本院对其依法减轻处罚。

最终,被告人陈某以犯破坏计算机信息系统罪,被判处有期徒刑一年九个月,并没收所有违法所得。

【参考链接】:https://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=07dfdd695dd945c49f1cacd7000e6e91

————————————————
版权声明:本文为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日将前往百度公司接受约谈的被告人陈某传唤到案。

四、法院这样判

北京市海淀区人民法院一审认为,陈某违反国家规定,对计算机信息系统中存储、处理的数据进行修改,后果特别严重,其行为已构成破坏计算机信息系统罪,应予惩处。

法院指出,被告人陈某利用其工作便利,在没有得到单位授权,也不是基于对单位计算机信息系统进行研发、维护、调试等工作需要的情况下,而是为了谋取其个人私利,超越其工作权限,采用技术手段擅自调用媒体接口,违规使大量网站通过媒体资质审核,将待审核的数据变更为审核通过的数据,系违规修改百度时代网络技术(北京)有限公司计算机信息系统内所存储、处理的相应分类数据的范围,因此该行为符合破坏计算机信息系统罪中对破坏行为的定义。

鉴于被告人陈某犯罪以后主动投案,到案后能如实供述其所犯罪行,系自首,且积极退缴全部违法所得,并赔偿了所在单位因本案而支出的信息技术服务费,亦取得了所在单位的谅解,有较好的悔罪表现,故本院对其依法减轻处罚。

最终,被告人陈某以犯破坏计算机信息系统罪,被判处有期徒刑一年九个月,并没收所有违法所得。

【参考链接】:https://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=07dfdd695dd945c49f1cacd7000e6e91

————————————————
版权声明:本文为CSDN博主「CSDN 程序人生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csdnsevenn/article/details/114683563

此文章转载自CSDN博主「CSDN 程序人生」的原创文章,如有不当联系邮箱:pufa@dcloud.io 。

收起阅读 »

HBuilderX云打包ios证书的获取方法

iOS打包 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

按照它里面的流程说明创建,就可以完成证书的创建了。

收起阅读 »

万岳知识付费系统更新内容 v 1.0.6

技术分享 源码分享 开源 uniapp

仓库地址

更新内容:

    为方便新老用户使用,我们将uni-app仓库(移动端)和php仓库(后端+web)合并为一个仓库,方便大家的整合使用。

现有功能:

项目说明(如果对你有用,请点亮右上角的Star!)

部署文档|发行步骤|常见问题|升级日志

系统演示

展示图

目录结构

  • 前端代码 knowledge_uni_app目录
  • 后台代码 knowledge_admin目录

Web版地址

项目介绍

万岳知识付费系统打造沉浸式学习体验,提升教学质量,还原真实课堂。知识付费功能包含热门精选、在线直播、付费视频、付费音频、付费阅读等营销功能,实现用户快速裂变。提高用户工作效率和收入是成为知识付费的刚需,可以从海量信息中寻找到适合自身的产品,利用碎片化时间和少许资金就能获得自己需要的信息。

万岳知识付费深刻理解用户诉求,紧盯市场需求。帮助大家低成本高效率体验知识付费平台,以利用互联网让人们生活更美好为使命,精益求精,创新研发,为客户创造更多价值!

  • 所有使用到的框架或者组件都是基于开源项目,代码保证100%开源。
  • 系统功能通用,无论是个人还是企业都可以利用该系统快速搭建一个属于自己的知识付费系统。

系统前端采用uni-app+socket.io+WebRtc核心技术, 接口采用PhalApi框架配合TP5.1框架ThinkCMF,系统功能如下:

功能展示

展示图展示图展示图展示图展示图

开源版使用须知

  • 允许用于个人学习、教学案例

  • 开源版不适合商用,商用请购买商业版

  • 禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负

商业合作

  • 如果你想使用功能更完善的知识付费系统,请联系QQ客服: 2415408120 获取专业版
  • 如果您想基于知识付费系统进行定制开发,我们提供有偿定制服务支持!
  • 其他合作模式不限,欢迎来撩!
  • 官网地址:http://www.sdwanyue.com

联系我们(加客服经理微信或QQ,免费获取sql脚本)

QQ:2415408120

万岳在线教育讨论群可加 QQ群:995910672

> QQ群:995910672

展示图

继续阅读 »

仓库地址

更新内容:

    为方便新老用户使用,我们将uni-app仓库(移动端)和php仓库(后端+web)合并为一个仓库,方便大家的整合使用。

现有功能:

项目说明(如果对你有用,请点亮右上角的Star!)

部署文档|发行步骤|常见问题|升级日志

系统演示

展示图

目录结构

  • 前端代码 knowledge_uni_app目录
  • 后台代码 knowledge_admin目录

Web版地址

项目介绍

万岳知识付费系统打造沉浸式学习体验,提升教学质量,还原真实课堂。知识付费功能包含热门精选、在线直播、付费视频、付费音频、付费阅读等营销功能,实现用户快速裂变。提高用户工作效率和收入是成为知识付费的刚需,可以从海量信息中寻找到适合自身的产品,利用碎片化时间和少许资金就能获得自己需要的信息。

万岳知识付费深刻理解用户诉求,紧盯市场需求。帮助大家低成本高效率体验知识付费平台,以利用互联网让人们生活更美好为使命,精益求精,创新研发,为客户创造更多价值!

  • 所有使用到的框架或者组件都是基于开源项目,代码保证100%开源。
  • 系统功能通用,无论是个人还是企业都可以利用该系统快速搭建一个属于自己的知识付费系统。

系统前端采用uni-app+socket.io+WebRtc核心技术, 接口采用PhalApi框架配合TP5.1框架ThinkCMF,系统功能如下:

功能展示

展示图展示图展示图展示图展示图

开源版使用须知

  • 允许用于个人学习、教学案例

  • 开源版不适合商用,商用请购买商业版

  • 禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负

商业合作

  • 如果你想使用功能更完善的知识付费系统,请联系QQ客服: 2415408120 获取专业版
  • 如果您想基于知识付费系统进行定制开发,我们提供有偿定制服务支持!
  • 其他合作模式不限,欢迎来撩!
  • 官网地址:http://www.sdwanyue.com

联系我们(加客服经理微信或QQ,免费获取sql脚本)

QQ:2415408120

万岳在线教育讨论群可加 QQ群:995910672

> QQ群:995910672

展示图

收起阅读 »