HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

网约车APP开发能够解决用户哪些问题?

微信小程序

1、地址位置定位功能
一般需要打车服务的人通常都会先了解当前所在的位置,以及目的地的位置,这样才能够了解到到达目的地的具体时间,避免错过一些关键的会议或者是展会等等,网约车APP开发实现了位置的实时定位,让用户快速了解具体位置并进行智能定位功能。
2、具体价格时长展示
用户通过定位之后,可以在网约车APP软件上了解当前路程所需要花费的时间以及所需要支付的金额等等信息,这些透明化的价格服务展示能够方便用户做出判断,确定该路程的使用打车服务的性价比是否合乎自身需求。
3、在线预约功能
网约车APP软件会为用户提供便捷的线上预约服务,预约的车辆型号有多种类型,例如顺风车、专车以及快车等等都会为用户展示出来,让用户可以自由进行关于打车服务的选择预约。
4、打车平台流程管理功能
对于打车平台来说,网约车APP开发能够帮助平台实现多个打车流程的管理,例如订单方面以及出租车接单匹配等等方面,有效提供平台整体的运营效率。

继续阅读 »

1、地址位置定位功能
一般需要打车服务的人通常都会先了解当前所在的位置,以及目的地的位置,这样才能够了解到到达目的地的具体时间,避免错过一些关键的会议或者是展会等等,网约车APP开发实现了位置的实时定位,让用户快速了解具体位置并进行智能定位功能。
2、具体价格时长展示
用户通过定位之后,可以在网约车APP软件上了解当前路程所需要花费的时间以及所需要支付的金额等等信息,这些透明化的价格服务展示能够方便用户做出判断,确定该路程的使用打车服务的性价比是否合乎自身需求。
3、在线预约功能
网约车APP软件会为用户提供便捷的线上预约服务,预约的车辆型号有多种类型,例如顺风车、专车以及快车等等都会为用户展示出来,让用户可以自由进行关于打车服务的选择预约。
4、打车平台流程管理功能
对于打车平台来说,网约车APP开发能够帮助平台实现多个打车流程的管理,例如订单方面以及出租车接单匹配等等方面,有效提供平台整体的运营效率。

收起阅读 »

网约车APP定制开发搭建

App

网约车APP制作核心功能:
1.多种出行方式:网约车APP的出行选择可以有专车出行、快车出行、拼车出行。
2.预估车费:选择出发地点和出发目的地,可以直接计算出行程、时间和车费。
3.预约用车:若用户在未来几个小时候有需要用车,可以提前预约时间段,可以让司机师傅去上车地点接人。
4.查看司机:打开APP即可查看用户自身离周边近有多少车辆。
5.账户充值:APP可以出一些优惠活动,引导用户充值,让用户更加省钱车行。
6.评估服务:可以根据用户提供的建议弥补平台的不足,从而更精进app服务。
7.线上支付:用户可以根据自己合适的支付方式,选择扣除车费。
8.地图导航:用可以通过APP定位知道自己当前的位置和要去的目的地,司机师傅可以根据用户定位上车地点前去接客户上车,两者都可以显示具体的距离和时间。

继续阅读 »

网约车APP制作核心功能:
1.多种出行方式:网约车APP的出行选择可以有专车出行、快车出行、拼车出行。
2.预估车费:选择出发地点和出发目的地,可以直接计算出行程、时间和车费。
3.预约用车:若用户在未来几个小时候有需要用车,可以提前预约时间段,可以让司机师傅去上车地点接人。
4.查看司机:打开APP即可查看用户自身离周边近有多少车辆。
5.账户充值:APP可以出一些优惠活动,引导用户充值,让用户更加省钱车行。
6.评估服务:可以根据用户提供的建议弥补平台的不足,从而更精进app服务。
7.线上支付:用户可以根据自己合适的支付方式,选择扣除车费。
8.地图导航:用可以通过APP定位知道自己当前的位置和要去的目的地,司机师傅可以根据用户定位上车地点前去接客户上车,两者都可以显示具体的距离和时间。

收起阅读 »

男子一口气充了90年爱奇艺会员被刑拘,以后还敢薅羊毛吗?

法律科普

所谓薅羊毛,简单来说,就是通过一些技巧将小的利益批量化,进而取得比较大的效益。

本质上,薅羊毛就是利用互联网平台的促销活动来进行批量操作,或直接利用漏洞来领取福利

如今互联网的繁荣,催生了各式各样的促销活动,于是便由此衍生出了一个专门薅羊毛的群体——羊毛党。

举个例子:一个账号可以领取一个红包,羊毛党可以用N个账号去领取N个红包。

这样就导致了商家的资源没有最大化的利用,而是被羊毛党薅走了。

对于人民群众来说,薅羊毛是一项喜闻乐见的活动。

大部分情况下,只要是通过合法合规的途径薅来的羊毛,都是没什么问题的

但如果通过非法手段薅羊毛的话,那可能就属于违法犯罪行为了。

近日,杭州滨江区警方就破获了一起薅羊毛案件,引发热议。

一口气充近百年的视频会员

鼓励会员通过签到、阅读文章、观看视频、完成任务等方式获取积分、兑换奖品,是很多商家常用的促销方式,但也容易被犯罪分子利用谋取私利。

近日,杭州滨江区警方就宣布破获了一起使用违法手段薅羊毛的案件。

在该案中,一男子通过非法手段为自己的视频会员账号充值逾90年,一直到2111年到期。

据通报,10月10日,滨江某小说软件运营公司发现有人恶意刷取积分,用来兑换QQ、爱奇艺等会员,损失共计1万余元。

警方迅速锁定并抓获重庆的方某。经查,方某通过非法软件,绕开APP抽奖系统次数限制,反复刷取积分,在积分商城兑换成各种网络会员充入自己的账号

如上图所示,方某给自己的爱奇艺视频会员充值到了2111年,一口气充会员逾90年

他还交代了其通过类似手法侵犯多家互联网公司的事实。目前,因涉嫌盗窃罪和破坏计算机信息系统罪,方某已被滨江警方刑事拘留,案件正在进一步侦办中。

同一张优惠券充值近7000次

除了方某这样的单人作案外,作案手法类似的网络黑灰产团伙犯罪案也多不胜数。

今年8月初,某APP推出新注册用户充值任意话费立减27元的优惠活动。8月10日夜间至11日凌晨,其系统被连续攻击,话费充值模块损失十万余元。

警方调查后发现,当晚有168个账号,使用32个IP地址登录该APP,累计充值6900余笔。

最后,警方分赴贵州、山东、安徽、四川、河南、重庆等地,将凡某等11名嫌疑人抓获。

据凡某等人交代,他们先后加入过一些发布网上优惠(系统漏洞)的QQ群。通过群聊,11名“志同道合”的羊毛党组建了自己的QQ群。谁发现优惠活动和漏洞,都会发群里共享。

8月10日夜间至11日凌晨,凡某等人利用掌握的系统漏洞,采取技术手段,绕开风控规则,使用同一张优惠券反复充值,共刷单6918笔,获利十余万元

目前,凡某等11人因涉嫌盗窃罪和破坏计算机信息系统罪,已被滨江警方刑事拘留,案件正在进一步侦办中。

分分钟薅掉400万元羊毛

通关就能提现,这样的游戏推广方式,大家应该也都见到过。

今年9月7日,瑞安警方接某科技有限公司报案,称其公司在核对前期一个游戏推广活动时,发现有人为66元的现金奖励而使用非正常手段进行操作。

该公司发现,异常游戏的用户账号高达6万个,提现金额超400万。

警察当天就将作案人员陈某抓获,并在其住所查获大量作案手机卡。

据悉,杨某是一名程序员,精通外挂软件的制作,该公司推出游戏活动后,杨某就制作了专门用于游戏活动的外挂软件

然后,周某、陈某使用该软件用154个游戏账户进行批量操作,通过8张绑定的银行卡提现,获利过万元。

薅了1000万美金让同事背锅

薅羊毛这种事情,也不仅仅发生在国内。

据外媒报道,前段时间,前微软软件工程师沃罗德米尔·克瓦舒克便因两年内盗窃价值超过1000万美元的数字货币(代金券)而被判处了九年监禁

据悉,他在2016年到2018年于微软工作期间,通过公司的一个系统漏洞窃取了大量的数字货币代金券,并且想办法让他的同事来背锅,愣是薅走了1000万美元的羊毛。

如今,在互联网上有很多的薅羊毛活动,多数情况下,薅羊毛无伤大雅,用户图个开心也没有什么不妥。

薅羊毛的确不违法,但绝不能使用违法手段去薅羊毛,典型案例就有去年的拼多多优惠券事件

警方提醒,用自己的真实信息获取商家优惠券系合理合法利用规则行为,“薅羊毛”的方法一旦涉及非法使用他人信息,甚至利用技术手段突破商家安全机制获利,那就触犯了刑法。

各位在薅羊毛时切记,不能光想着占便宜,否则可能会因小失大。

【转自:程序猿DD】,声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 邮箱地址:pufa@dcloud.io 。

原文链接

继续阅读 »

所谓薅羊毛,简单来说,就是通过一些技巧将小的利益批量化,进而取得比较大的效益。

本质上,薅羊毛就是利用互联网平台的促销活动来进行批量操作,或直接利用漏洞来领取福利

如今互联网的繁荣,催生了各式各样的促销活动,于是便由此衍生出了一个专门薅羊毛的群体——羊毛党。

举个例子:一个账号可以领取一个红包,羊毛党可以用N个账号去领取N个红包。

这样就导致了商家的资源没有最大化的利用,而是被羊毛党薅走了。

对于人民群众来说,薅羊毛是一项喜闻乐见的活动。

大部分情况下,只要是通过合法合规的途径薅来的羊毛,都是没什么问题的

但如果通过非法手段薅羊毛的话,那可能就属于违法犯罪行为了。

近日,杭州滨江区警方就破获了一起薅羊毛案件,引发热议。

一口气充近百年的视频会员

鼓励会员通过签到、阅读文章、观看视频、完成任务等方式获取积分、兑换奖品,是很多商家常用的促销方式,但也容易被犯罪分子利用谋取私利。

近日,杭州滨江区警方就宣布破获了一起使用违法手段薅羊毛的案件。

在该案中,一男子通过非法手段为自己的视频会员账号充值逾90年,一直到2111年到期。

据通报,10月10日,滨江某小说软件运营公司发现有人恶意刷取积分,用来兑换QQ、爱奇艺等会员,损失共计1万余元。

警方迅速锁定并抓获重庆的方某。经查,方某通过非法软件,绕开APP抽奖系统次数限制,反复刷取积分,在积分商城兑换成各种网络会员充入自己的账号

如上图所示,方某给自己的爱奇艺视频会员充值到了2111年,一口气充会员逾90年

他还交代了其通过类似手法侵犯多家互联网公司的事实。目前,因涉嫌盗窃罪和破坏计算机信息系统罪,方某已被滨江警方刑事拘留,案件正在进一步侦办中。

同一张优惠券充值近7000次

除了方某这样的单人作案外,作案手法类似的网络黑灰产团伙犯罪案也多不胜数。

今年8月初,某APP推出新注册用户充值任意话费立减27元的优惠活动。8月10日夜间至11日凌晨,其系统被连续攻击,话费充值模块损失十万余元。

警方调查后发现,当晚有168个账号,使用32个IP地址登录该APP,累计充值6900余笔。

最后,警方分赴贵州、山东、安徽、四川、河南、重庆等地,将凡某等11名嫌疑人抓获。

据凡某等人交代,他们先后加入过一些发布网上优惠(系统漏洞)的QQ群。通过群聊,11名“志同道合”的羊毛党组建了自己的QQ群。谁发现优惠活动和漏洞,都会发群里共享。

8月10日夜间至11日凌晨,凡某等人利用掌握的系统漏洞,采取技术手段,绕开风控规则,使用同一张优惠券反复充值,共刷单6918笔,获利十余万元

目前,凡某等11人因涉嫌盗窃罪和破坏计算机信息系统罪,已被滨江警方刑事拘留,案件正在进一步侦办中。

分分钟薅掉400万元羊毛

通关就能提现,这样的游戏推广方式,大家应该也都见到过。

今年9月7日,瑞安警方接某科技有限公司报案,称其公司在核对前期一个游戏推广活动时,发现有人为66元的现金奖励而使用非正常手段进行操作。

该公司发现,异常游戏的用户账号高达6万个,提现金额超400万。

警察当天就将作案人员陈某抓获,并在其住所查获大量作案手机卡。

据悉,杨某是一名程序员,精通外挂软件的制作,该公司推出游戏活动后,杨某就制作了专门用于游戏活动的外挂软件

然后,周某、陈某使用该软件用154个游戏账户进行批量操作,通过8张绑定的银行卡提现,获利过万元。

薅了1000万美金让同事背锅

薅羊毛这种事情,也不仅仅发生在国内。

据外媒报道,前段时间,前微软软件工程师沃罗德米尔·克瓦舒克便因两年内盗窃价值超过1000万美元的数字货币(代金券)而被判处了九年监禁

据悉,他在2016年到2018年于微软工作期间,通过公司的一个系统漏洞窃取了大量的数字货币代金券,并且想办法让他的同事来背锅,愣是薅走了1000万美元的羊毛。

如今,在互联网上有很多的薅羊毛活动,多数情况下,薅羊毛无伤大雅,用户图个开心也没有什么不妥。

薅羊毛的确不违法,但绝不能使用违法手段去薅羊毛,典型案例就有去年的拼多多优惠券事件

警方提醒,用自己的真实信息获取商家优惠券系合理合法利用规则行为,“薅羊毛”的方法一旦涉及非法使用他人信息,甚至利用技术手段突破商家安全机制获利,那就触犯了刑法。

各位在薅羊毛时切记,不能光想着占便宜,否则可能会因小失大。

【转自:程序猿DD】,声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 邮箱地址:pufa@dcloud.io 。

原文链接

收起阅读 »

uniapp引入第三方js并调用方法

第一步在根目录下新建一个index.html

<!DOCTYPE html>  
<html lang="zh-CN">  
    <head>  
        <meta charset="utf-8">  
        <meta http-equiv="X-UA-Compatible" content="IE=edge">  
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">  
        <title><%= htmlWebpackPlugin.options.title %></title>  
/*  
在static下新建一个index.css,把公共样式放到里边(我之前写在app.vue里了,我怕不行就复制一份到这个文件里了具体没测)  
*/  
        <link rel="stylesheet" href="<%= BASE_URL %>static/index.css" />  
        <!-- 引入外部js -->  
        <script src="你要引入的外部js地址"></script>  
    </hea  
    <body>  
        <noscript>  
            <strong>Please enable JavaScript to continue.</strong>  
        </noscript>  
        <div id="app"></div>  
        <!-- built files will be auto injected -->  
    </body>  
</html>

这里index.html就完事了
第二步就是配置manifest.json文件
我是这么配置的,在源码视图里(仅供参考,我只是好使了,我记录一下有问题随时评论哈我随时改进)

 "h5" : {  
        "router" : {  
            "mode" : "history",  
            "base" : ""  
        },  
        "devServer" : {  
            "port" : 8000,  
            "disableHostCheck" : true,  
            "https" : false  
        },  
        // 这里引入html  
        "template" : "index.html",  
        "optimization" : {  
            "treeShaking" : {  
                "enable" : true  
            }  
        }  
    },

第三步调用
//这个是我的返回的点击事件

goBack() {  
       //调用的第三方js的方法(这里的pa是我jssdk里调用方法的)   
     pa.goback()  
    },

玩活,完事之后样式会变乱,我是关了hbuilder再重进然后就好了,再进hbuilder的时候特别慢页面不显示,我关了好几次又进的,不知道你们会不会遇到,小菜鸡一枚,欢迎大神指点

继续阅读 »

第一步在根目录下新建一个index.html

<!DOCTYPE html>  
<html lang="zh-CN">  
    <head>  
        <meta charset="utf-8">  
        <meta http-equiv="X-UA-Compatible" content="IE=edge">  
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">  
        <title><%= htmlWebpackPlugin.options.title %></title>  
/*  
在static下新建一个index.css,把公共样式放到里边(我之前写在app.vue里了,我怕不行就复制一份到这个文件里了具体没测)  
*/  
        <link rel="stylesheet" href="<%= BASE_URL %>static/index.css" />  
        <!-- 引入外部js -->  
        <script src="你要引入的外部js地址"></script>  
    </hea  
    <body>  
        <noscript>  
            <strong>Please enable JavaScript to continue.</strong>  
        </noscript>  
        <div id="app"></div>  
        <!-- built files will be auto injected -->  
    </body>  
</html>

这里index.html就完事了
第二步就是配置manifest.json文件
我是这么配置的,在源码视图里(仅供参考,我只是好使了,我记录一下有问题随时评论哈我随时改进)

 "h5" : {  
        "router" : {  
            "mode" : "history",  
            "base" : ""  
        },  
        "devServer" : {  
            "port" : 8000,  
            "disableHostCheck" : true,  
            "https" : false  
        },  
        // 这里引入html  
        "template" : "index.html",  
        "optimization" : {  
            "treeShaking" : {  
                "enable" : true  
            }  
        }  
    },

第三步调用
//这个是我的返回的点击事件

goBack() {  
       //调用的第三方js的方法(这里的pa是我jssdk里调用方法的)   
     pa.goback()  
    },

玩活,完事之后样式会变乱,我是关了hbuilder再重进然后就好了,再进hbuilder的时候特别慢页面不显示,我关了好几次又进的,不知道你们会不会遇到,小菜鸡一枚,欢迎大神指点

收起阅读 »

将自己的 uni-app 注册进分享列表,接收其他 app 的分享【Android】

经验分享

社区有很多小伙伴都有此需求,有人实现了但是没有分享经验,经过半天的踩坑,在此分享一下。

  1. 首先最大的跨越是将在线打包改成了离线打包的形式,这一点一定要注意申请 AppKey 且各处 appId 正确。
  2. 找到在 官方的离线打包教程 中关于 AndroidManifest.xml 的部分,找到如下代码:
        <activity  
            android:name="io.dcloud.PandoraEntry"  
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"  
            android:hardwareAccelerated="true"  
            android:label="@string/app_name"  
            android:launchMode="singleTask"  
            android:screenOrientation="user"  
            android:theme="@style/TranslucentTheme"  
            android:windowSoftInputMode="adjustResize">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>

    添加一个 intent-filter

            <!-- 接收分享 -->  
            <intent-filter>  
                <action android:name="android.intent.action.SEND" />  
                <category android:name="android.intent.category.DEFAULT" />  
                <data android:mimeType="text/*" />  
            </intent-filter>

虽然注册很简单,但是离线打包是一个大坎,如果官方云打包支持就很方便了!

这里接收的是文本,可参考 Android把自己应用加入到系统文件分享中 中的其他类型

  1. 在 vue/js 业务代码中使用 plus.runtime.arguments 即可获取到分享的内容了!唤醒启动时可以在 vue 页面中的 onReady 接收到,也可以在 onShow 时获取,但是这里有个坑
    如果 app 在后台直接切回来, onShow 会再次获取到本次以分享形式冷启动时的内容,但如果没有完全退出,保留后台,以分享的形式切回,则是此次分享的内容,需要做好判断。
    分享一下代码:
    // 两个变量在 vue 代码之外  
    let launchArgs = '' // 存储启动时的参数,用于在 onShow 中判断,如果一致则不使用  
    let ready = false // 因为 onShow 在 onReady 之前触发,所以可能会有没渲染完成的情况,直接跳过  
    // 省略...  
        onReady() {  
            ready = true  
            this.onShared()  
        },  
        onShow() {  
            if (launchArgs !== plus.runtime.arguments) {  
                this.onShared()  
            }  
        },  
        methods: {  
            onShared() {  
                if (ready && plus.runtime.arguments) {  
                    launchArgs = plus.runtime.arguments  
                    const sharedText = JSON.parse(launchArgs)['android.intent.extra.TEXT']  
                    // console.log('分享的文本内容是:',sharedText)  
                }  
            },  
        }
继续阅读 »

社区有很多小伙伴都有此需求,有人实现了但是没有分享经验,经过半天的踩坑,在此分享一下。

  1. 首先最大的跨越是将在线打包改成了离线打包的形式,这一点一定要注意申请 AppKey 且各处 appId 正确。
  2. 找到在 官方的离线打包教程 中关于 AndroidManifest.xml 的部分,找到如下代码:
        <activity  
            android:name="io.dcloud.PandoraEntry"  
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"  
            android:hardwareAccelerated="true"  
            android:label="@string/app_name"  
            android:launchMode="singleTask"  
            android:screenOrientation="user"  
            android:theme="@style/TranslucentTheme"  
            android:windowSoftInputMode="adjustResize">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>

    添加一个 intent-filter

            <!-- 接收分享 -->  
            <intent-filter>  
                <action android:name="android.intent.action.SEND" />  
                <category android:name="android.intent.category.DEFAULT" />  
                <data android:mimeType="text/*" />  
            </intent-filter>

虽然注册很简单,但是离线打包是一个大坎,如果官方云打包支持就很方便了!

这里接收的是文本,可参考 Android把自己应用加入到系统文件分享中 中的其他类型

  1. 在 vue/js 业务代码中使用 plus.runtime.arguments 即可获取到分享的内容了!唤醒启动时可以在 vue 页面中的 onReady 接收到,也可以在 onShow 时获取,但是这里有个坑
    如果 app 在后台直接切回来, onShow 会再次获取到本次以分享形式冷启动时的内容,但如果没有完全退出,保留后台,以分享的形式切回,则是此次分享的内容,需要做好判断。
    分享一下代码:
    // 两个变量在 vue 代码之外  
    let launchArgs = '' // 存储启动时的参数,用于在 onShow 中判断,如果一致则不使用  
    let ready = false // 因为 onShow 在 onReady 之前触发,所以可能会有没渲染完成的情况,直接跳过  
    // 省略...  
        onReady() {  
            ready = true  
            this.onShared()  
        },  
        onShow() {  
            if (launchArgs !== plus.runtime.arguments) {  
                this.onShared()  
            }  
        },  
        methods: {  
            onShared() {  
                if (ready && plus.runtime.arguments) {  
                    launchArgs = plus.runtime.arguments  
                    const sharedText = JSON.parse(launchArgs)['android.intent.extra.TEXT']  
                    // console.log('分享的文本内容是:',sharedText)  
                }  
            },  
        }
收起阅读 »

uniapp如何上传AWS S3

chooseAndUploadFile 上传文件

找了很多资料,没有提及uniapp如何上传AWS S3的文件方法。没法子硬着头皮读AWS的英文文档。

开始使用了JS-SDK,搞了半天好不容易安装完成后,尝试调用上传文件的调用,结果发现最后要使用XMLHttpRequest(),结果一读uniapp的文档,不支持。白折腾大半天。只好另想他法。发现了一个基于表单的POST的方法,对比uniapp文档后,感觉uni.uploadFile()应该可以用,尝试了不同的方式,总算是通过uni.uploadFile()成功的传到了AWS S3上。

主要几点搞清楚了,也不是很复杂。

  1. 在AWS S3上,一定要把bucket桶的权限配置上,否则一定会老收到AccessDenied信息。
  2. 如何准备policy和如何计算签名,这个是第二步,可以按照文档的样例去验证签名逻辑。(https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)(https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html)
  3. 准备formData,这个一定要和policy里的定义对上(https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html)
  4. 要配置一个成功上传后返回调用的XML,AWS S3上传成功后会调用这个XML来返回参数。否则上传成功了也收不到正确的响应。

uniapp没有开发底层的网络层日志,确实踩了不少的坑。

继续阅读 »

找了很多资料,没有提及uniapp如何上传AWS S3的文件方法。没法子硬着头皮读AWS的英文文档。

开始使用了JS-SDK,搞了半天好不容易安装完成后,尝试调用上传文件的调用,结果发现最后要使用XMLHttpRequest(),结果一读uniapp的文档,不支持。白折腾大半天。只好另想他法。发现了一个基于表单的POST的方法,对比uniapp文档后,感觉uni.uploadFile()应该可以用,尝试了不同的方式,总算是通过uni.uploadFile()成功的传到了AWS S3上。

主要几点搞清楚了,也不是很复杂。

  1. 在AWS S3上,一定要把bucket桶的权限配置上,否则一定会老收到AccessDenied信息。
  2. 如何准备policy和如何计算签名,这个是第二步,可以按照文档的样例去验证签名逻辑。(https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)(https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html)
  3. 准备formData,这个一定要和policy里的定义对上(https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html)
  4. 要配置一个成功上传后返回调用的XML,AWS S3上传成功后会调用这个XML来返回参数。否则上传成功了也收不到正确的响应。

uniapp没有开发底层的网络层日志,确实踩了不少的坑。

收起阅读 »

Electron-MacWebOS 基于vite2.x+electron13仿osx桌面系统

Vue

前几天有给大家分享一个electron12 vite2中后台管理系统。今天分享的是electron13 vue3仿mac桌面后台。

Electron-Mac-webOSX 一款基于vite2.x electron13结合搭建开发的仿macOS桌面管理应用EXE。流畅的操作体验,经典的桌面图标及鱼眼dock效果,支持桌面图标拖拽排序换位。可自定义桌面壁纸主题。

electron12 vite2.x桌面端后台管理系统

img

拥有极致的操作体验,自定义无边框窗体、支持窗口拖拽/缩放/最大化/全屏等功能。

img

实现技术

  • 技术框架:vite2.3.4 vue3.0.11 vuex4 vue-router4.x
  • 跨端框架:electron13.0.1
  • 组件库:element-plus1.0.2
  • 图表组件:echarts5.1.1
  • 拖拽排序:sortablejs1.13
  • 预处理器:sass1.34
  • 弹窗组件:maclayer

img

功能特性

✅经典的图标 dock菜单模式
✅流畅的操作体验
✅可拖拽桌面 dock菜单
✅符合macOS big sur操作窗口管理
✅丰富的视觉效果,自定义桌面壁纸
✅可视化创建多窗口,支持拖拽/缩放/最大化,可传入自定义组件页面。

img

img

项目结构

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

main.js配置

/**  
 * 渲染进程主入口  
 * @author XiaoYan  
 */  

import { createApp } from 'vue'  
import App from './App.vue'  

// 引入Router和Store  
import Router from './router'  
import Store from './store'  

// 引入公共配置  
import gPlugins from './plugins'  

import { winCfg, loadWin } from './windows/actions'  

loadWin().then(config => {  
    winCfg.window = config  

    createApp(App)  
    .use(Router)  
    .use(Store)  
    .use(gPlugins)  
    .mount('#app')  
})

公共布局模板

img

<template>  
    <div class="macui__wrapper" :style="{'--themeSkin': store.state.skin}">  
        <div v-if="!route.meta.isNewin" class="macui__layouts-main flexbox flex-col">  
            <!-- //顶部导航 -->  
            <div class="layout__topbar">  
                <TopNav />  
            </div>  

            <div class="layout__workpanel flex1 flexbox" @contextmenu="handleCtxMenu">  
                <div class="panel__mainlayer flex1 flexbox" style="margin-bottom: 70px;">  
                    <DeskMenu />  
                </div>  
            </div>  

            <!-- //底部Dock菜单 -->  
            <Dock />  
        </div>  
        <router-view v-else class="macui__layouts-main flexbox flex-col macui__filter"></router-view>  
    </div>  
</template>

vue3仿mac鱼眼dock菜单

img

<template>  
    <div class="macui__dock">  
        <div class="macui__dock-wrap macui__filter" ref="dockRef">  
            <a class="macui__dock-item"><span class="tooltips">appstore</span><img src="/static/mac/appstore.png" /></a>  
            <a class="macui__dock-item active"><span class="tooltips">launchpad</span><img src="/static/mac/launchpad.png" /></a>  
            ...  
        </div>  
    </div>  
</template>

vue3仿mac弹窗效果

img

// 引入组件页面  
import Home from '@/views/home.vue'  

v3layer({  
    type: 'component',  
    content: Home,  
    ...  
})
import Home from '@/views/home/index.vue'  
import ControlPanel from '@/views/home/dashboard.vue'  
import CustomTpl from '@/views/home/customTpl.vue'  
import Table from '@/views/component/table/custom.vue'  
import Form from '@/views/component/form/all.vue'  
import UserSetting from '@/views/setting/manage/user/index.vue'  
import Ucenter from '@/views/setting/ucenter.vue'  

const deskmenu = [  
    {  
        type: 'component',  
        icon: 'el-icon-monitor',  
        title: '首页',  
        component: Home,  
    },  
    {  
        type: 'component',  
        icon: 'icon-gonggao',  
        title: '控制面板',  
        component: ControlPanel,  
    },  
    {  
        type: 'component',  
        img: '/static/mac/reminders.png',  
        title: '自定义组件模板',  
        component: CustomTpl,  
        area: ['600px', '360px'],  
    },  
    {  
        type: 'iframe',  
        img: '/static/vite.png',  
        title: 'vite.js官方文档',  
        component: 'https://cn.vitejs.dev/',  
    },  
    {  
        type: 'component',  
        icon: 'el-icon-s-grid',  
        title: '表格',  
        component: Table,  
    },  
    // ...  
]

ok,基于vite2+electron13开发仿mac桌面管理系统就分享到这里。

链接:https://juejin.cn/post/6977298346905960456/
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

继续阅读 »

前几天有给大家分享一个electron12 vite2中后台管理系统。今天分享的是electron13 vue3仿mac桌面后台。

Electron-Mac-webOSX 一款基于vite2.x electron13结合搭建开发的仿macOS桌面管理应用EXE。流畅的操作体验,经典的桌面图标及鱼眼dock效果,支持桌面图标拖拽排序换位。可自定义桌面壁纸主题。

electron12 vite2.x桌面端后台管理系统

img

拥有极致的操作体验,自定义无边框窗体、支持窗口拖拽/缩放/最大化/全屏等功能。

img

实现技术

  • 技术框架:vite2.3.4 vue3.0.11 vuex4 vue-router4.x
  • 跨端框架:electron13.0.1
  • 组件库:element-plus1.0.2
  • 图表组件:echarts5.1.1
  • 拖拽排序:sortablejs1.13
  • 预处理器:sass1.34
  • 弹窗组件:maclayer

img

功能特性

✅经典的图标 dock菜单模式
✅流畅的操作体验
✅可拖拽桌面 dock菜单
✅符合macOS big sur操作窗口管理
✅丰富的视觉效果,自定义桌面壁纸
✅可视化创建多窗口,支持拖拽/缩放/最大化,可传入自定义组件页面。

img

img

项目结构

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

main.js配置

/**  
 * 渲染进程主入口  
 * @author XiaoYan  
 */  

import { createApp } from 'vue'  
import App from './App.vue'  

// 引入Router和Store  
import Router from './router'  
import Store from './store'  

// 引入公共配置  
import gPlugins from './plugins'  

import { winCfg, loadWin } from './windows/actions'  

loadWin().then(config => {  
    winCfg.window = config  

    createApp(App)  
    .use(Router)  
    .use(Store)  
    .use(gPlugins)  
    .mount('#app')  
})

公共布局模板

img

<template>  
    <div class="macui__wrapper" :style="{'--themeSkin': store.state.skin}">  
        <div v-if="!route.meta.isNewin" class="macui__layouts-main flexbox flex-col">  
            <!-- //顶部导航 -->  
            <div class="layout__topbar">  
                <TopNav />  
            </div>  

            <div class="layout__workpanel flex1 flexbox" @contextmenu="handleCtxMenu">  
                <div class="panel__mainlayer flex1 flexbox" style="margin-bottom: 70px;">  
                    <DeskMenu />  
                </div>  
            </div>  

            <!-- //底部Dock菜单 -->  
            <Dock />  
        </div>  
        <router-view v-else class="macui__layouts-main flexbox flex-col macui__filter"></router-view>  
    </div>  
</template>

vue3仿mac鱼眼dock菜单

img

<template>  
    <div class="macui__dock">  
        <div class="macui__dock-wrap macui__filter" ref="dockRef">  
            <a class="macui__dock-item"><span class="tooltips">appstore</span><img src="/static/mac/appstore.png" /></a>  
            <a class="macui__dock-item active"><span class="tooltips">launchpad</span><img src="/static/mac/launchpad.png" /></a>  
            ...  
        </div>  
    </div>  
</template>

vue3仿mac弹窗效果

img

// 引入组件页面  
import Home from '@/views/home.vue'  

v3layer({  
    type: 'component',  
    content: Home,  
    ...  
})
import Home from '@/views/home/index.vue'  
import ControlPanel from '@/views/home/dashboard.vue'  
import CustomTpl from '@/views/home/customTpl.vue'  
import Table from '@/views/component/table/custom.vue'  
import Form from '@/views/component/form/all.vue'  
import UserSetting from '@/views/setting/manage/user/index.vue'  
import Ucenter from '@/views/setting/ucenter.vue'  

const deskmenu = [  
    {  
        type: 'component',  
        icon: 'el-icon-monitor',  
        title: '首页',  
        component: Home,  
    },  
    {  
        type: 'component',  
        icon: 'icon-gonggao',  
        title: '控制面板',  
        component: ControlPanel,  
    },  
    {  
        type: 'component',  
        img: '/static/mac/reminders.png',  
        title: '自定义组件模板',  
        component: CustomTpl,  
        area: ['600px', '360px'],  
    },  
    {  
        type: 'iframe',  
        img: '/static/vite.png',  
        title: 'vite.js官方文档',  
        component: 'https://cn.vitejs.dev/',  
    },  
    {  
        type: 'component',  
        icon: 'el-icon-s-grid',  
        title: '表格',  
        component: Table,  
    },  
    // ...  
]

ok,基于vite2+electron13开发仿mac桌面管理系统就分享到这里。

链接:https://juejin.cn/post/6977298346905960456/
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

收起阅读 »

【采坑经验分享】uniapp-cli项目sass编译报错的修复方法

vue_cli uniapp 经验分享

uniapp-cli项目创建方法
cli项目如果要使用scss来编写样式,是需要安装sass-loader的。但是按照运行提示安装好后又会出现一系列问题。

正确的打开方式如下

Node版本需要>12
我这里使用的> v14.17.1
执行安装依赖>

npm i sass sass-loader@10.1.1 -D

这里的sass-loader版本需要指定为10.1.1,高了或者低了都会有一系列报错问题。

继续阅读 »

uniapp-cli项目创建方法
cli项目如果要使用scss来编写样式,是需要安装sass-loader的。但是按照运行提示安装好后又会出现一系列问题。

正确的打开方式如下

Node版本需要>12
我这里使用的> v14.17.1
执行安装依赖>

npm i sass sass-loader@10.1.1 -D

这里的sass-loader版本需要指定为10.1.1,高了或者低了都会有一系列报错问题。

收起阅读 »

在uniapp中 一个页面多个视频,控制只播放一个,已解决

话不多说直接上代码

        <view class="" v-for="(item, index) in 4" :key="index">  
            <video  
                src="https://m.baopinstudio.shandongweipai.com/uploads/20210531/5d286b6a973181d96115b1e9c064f8b4.mp4"  
                :id="index"  
                @play="play(index)"  
                @loadedmetadata="loadedmetadata"  
                controls  
            ></video>  
        </view>
data() {  
        return {  
            trailer: []  
        };  
    },
methods: {  
        //执行loadedmetadata 这个函数会显示你video里的信息 视频长度,大小,等等  
        loadedmetadata(e) {  
            console.log(e);  
            //获取所有视频的id,也就是在video里定义的id  
            this.trailer.push(e.target.id);  
        },  
        play(index) {  
            //循环一下得到的下标  
            for (let i = 0; i < this.trailer.length; i++  ) {  
                //排除你播放的那个的下标  
                if (i != index) {  
                    //注意 这里的videoContext 第一个参数要是一个字符串  
                    uni.createVideoContext(i.toString()).pause(); //执行暂停  
                }  
            }  
        }  
        // 如果没有下标的话 可以直接获取e 里面会带有你这个视频的id 获取e的时候 @play不要带参数  
        // play(e){  
        //  console.log(e)  
        //  let createid = e.target.id  
        //      //循环一下得到的下标  
        //      for (let i = 0; i < this.trailer.length; i++  ) {  
        //          //排除你播放的那个的下标  
        //          if (i != createid) {  
        //              //注意 这里的videoContext 第一个参数要是一个字符串  
        //              uni.createVideoContext(i.toString()).pause();//执行暂停  
        //          }  
        //      }  

        // }  
    }
继续阅读 »

话不多说直接上代码

        <view class="" v-for="(item, index) in 4" :key="index">  
            <video  
                src="https://m.baopinstudio.shandongweipai.com/uploads/20210531/5d286b6a973181d96115b1e9c064f8b4.mp4"  
                :id="index"  
                @play="play(index)"  
                @loadedmetadata="loadedmetadata"  
                controls  
            ></video>  
        </view>
data() {  
        return {  
            trailer: []  
        };  
    },
methods: {  
        //执行loadedmetadata 这个函数会显示你video里的信息 视频长度,大小,等等  
        loadedmetadata(e) {  
            console.log(e);  
            //获取所有视频的id,也就是在video里定义的id  
            this.trailer.push(e.target.id);  
        },  
        play(index) {  
            //循环一下得到的下标  
            for (let i = 0; i < this.trailer.length; i++  ) {  
                //排除你播放的那个的下标  
                if (i != index) {  
                    //注意 这里的videoContext 第一个参数要是一个字符串  
                    uni.createVideoContext(i.toString()).pause(); //执行暂停  
                }  
            }  
        }  
        // 如果没有下标的话 可以直接获取e 里面会带有你这个视频的id 获取e的时候 @play不要带参数  
        // play(e){  
        //  console.log(e)  
        //  let createid = e.target.id  
        //      //循环一下得到的下标  
        //      for (let i = 0; i < this.trailer.length; i++  ) {  
        //          //排除你播放的那个的下标  
        //          if (i != createid) {  
        //              //注意 这里的videoContext 第一个参数要是一个字符串  
        //              uni.createVideoContext(i.toString()).pause();//执行暂停  
        //          }  
        //      }  

        // }  
    }
收起阅读 »

美容院小程序需要的功能

小程序

1.预约功能
用户可以通过小程序了预约美容的时间。
2.会员管理功能
会员管理功能,可以帮助商家管理会员用户,通过会员的方式来提高用户端的粘性。
3.次卡消费功能
购买次卡的消费者,可以通过小程序来清楚的了解使用次数以及使用时间。
4.内容产品展示功能
展示功能,是为了让用户清晰的了解到你的品牌故事,优质服务以及产品介绍。

继续阅读 »

1.预约功能
用户可以通过小程序了预约美容的时间。
2.会员管理功能
会员管理功能,可以帮助商家管理会员用户,通过会员的方式来提高用户端的粘性。
3.次卡消费功能
购买次卡的消费者,可以通过小程序来清楚的了解使用次数以及使用时间。
4.内容产品展示功能
展示功能,是为了让用户清晰的了解到你的品牌故事,优质服务以及产品介绍。

收起阅读 »

美容小程序APP定制开发

小程序

传统美容行业发展痛点
1.数据搜集较差,难以针对性制定经营策略
2.服务范围限制以及客户记忆难度
3.线下宣传范围小、效果差、成本高
4.客户管理较差,没有系统的管理维护
美容小程序价值
对于用户来说:
了解门店信息、产品服务、专业知识
了解门店的优惠信息
对于企业来说:
系统的管理客户、有助于挖掘客户潜力
加强门店的管理、联系,有助于门店连锁的发展
美容小程序特点
1.咨询专业化:可以为用户提供专业的资讯服务,还能提供客服服务,引导消费
2.便捷消费:用户可以方便的利用小程序进行消费预订
3.门店管理:美容小程序可以多门店管理进行统一的营销、展示、管理,促进品牌发展
美容小程序的功能
信息展示:门店信息展示、位置导航等功能
在线预约:支持用户在线预约服务,弹性选择消费时间,减少等待
服务展示:美容产品服务展示、效果预览
会员管理:会员积分、账户管理、在线支付、优惠券发放等
在线客服:为用户解答相应的问题
服务点评:客户可以评价服务项目、服务质量

继续阅读 »

传统美容行业发展痛点
1.数据搜集较差,难以针对性制定经营策略
2.服务范围限制以及客户记忆难度
3.线下宣传范围小、效果差、成本高
4.客户管理较差,没有系统的管理维护
美容小程序价值
对于用户来说:
了解门店信息、产品服务、专业知识
了解门店的优惠信息
对于企业来说:
系统的管理客户、有助于挖掘客户潜力
加强门店的管理、联系,有助于门店连锁的发展
美容小程序特点
1.咨询专业化:可以为用户提供专业的资讯服务,还能提供客服服务,引导消费
2.便捷消费:用户可以方便的利用小程序进行消费预订
3.门店管理:美容小程序可以多门店管理进行统一的营销、展示、管理,促进品牌发展
美容小程序的功能
信息展示:门店信息展示、位置导航等功能
在线预约:支持用户在线预约服务,弹性选择消费时间,减少等待
服务展示:美容产品服务展示、效果预览
会员管理:会员积分、账户管理、在线支付、优惠券发放等
在线客服:为用户解答相应的问题
服务点评:客户可以评价服务项目、服务质量

收起阅读 »

uni-app Not found -1,8,1 at view.umd.min.js:1

记录报错 这个报错是因为我把组件名字改成了可能跟本来已有的标签名称相同然后报错了 ,我的是组件改成 <filter>然后报错了 后来改成其他名称就没问题了 比如<m-filter>

记录报错 这个报错是因为我把组件名字改成了可能跟本来已有的标签名称相同然后报错了 ,我的是组件改成 <filter>然后报错了 后来改成其他名称就没问题了 比如<m-filter>