HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

【全开源+免费更新】doodoo.js快速入门教程

node nodejs 支付宝小程序 微信小程序 小程序

简介

​ Doodoo.js -- 中文最佳实践Node.js快速开发框架。支持Koa.js, Express.js中间件,支持模块机制,插件机制,钩子机制,让开发 Node.js 项目更加简单、高效、灵活。

特性

支持koa全部中间件
支持使用 ES6+ 全部特性来开发项目
支持断点调试 ES6+ 项目
支持多种项目结构和多种项目环境
支持 Route, Controller 中使用Koa.js的所有API
支持多级 Controller
支持模块化开发
支持钩子机制
支持插件机制
支持错误处理
支持全局 doodoo 变量
支持 mysql, mongodb 数据库
支持前置,后置操作
支持 Restful 设计
支持启动自定义
支持环境加载配置
...

安装

环境要求:node >= 7.6.0

//npm  
npm install doodoo.js --save  
//yarn  
yarn add doodoo.js

使用 ES6/7 特性来开发项目

//base controller, app/demo/controller/base.js  
module.exports = class extends doodoo.Controller {  

    async _initialize() {  
        console.log('base _initialize');  
    }  

    async isLogin() {  
        console.log('base isLogin');  
    }  
}  

//index controller, app/demo/controller/index.js  
const base = require('./base');  
module.exports = class extends base {  

    async _initialize() {  
        await super._initialize();  
    }  

    async index() {  
        this.success("Hello Doodoo.js");  
    }  

    async index2() {  
        this.fail("Hello Doodoo.js");  
    }  
}

详细的日志

服务 启动日志

[doodoo] Version: 2.0.0  
[doodoo] Website: 127.0.0.1  
[doodoo] Nodejs Version: v8.12.0  
[doodoo] Nodejs Platform: darwin x64  
[doodoo] Server Enviroment: development  
[doodoo] Server Startup Time: 212ms  
[doodoo] Server Current Time: 2018-08-21 11:17:19  
[doodoo] Server Running At: http://127.0.0.1:3000

HTTP 请求日志

<-- GET /demo/index/index  
--> GET /demo/index/index 200 4ms

doodoo.js官方文档:https://doodooke.github.io/doodoo.js/#/
【案例】多多客小程序官网:doodooke.com

继续阅读 »

简介

​ Doodoo.js -- 中文最佳实践Node.js快速开发框架。支持Koa.js, Express.js中间件,支持模块机制,插件机制,钩子机制,让开发 Node.js 项目更加简单、高效、灵活。

特性

支持koa全部中间件
支持使用 ES6+ 全部特性来开发项目
支持断点调试 ES6+ 项目
支持多种项目结构和多种项目环境
支持 Route, Controller 中使用Koa.js的所有API
支持多级 Controller
支持模块化开发
支持钩子机制
支持插件机制
支持错误处理
支持全局 doodoo 变量
支持 mysql, mongodb 数据库
支持前置,后置操作
支持 Restful 设计
支持启动自定义
支持环境加载配置
...

安装

环境要求:node >= 7.6.0

//npm  
npm install doodoo.js --save  
//yarn  
yarn add doodoo.js

使用 ES6/7 特性来开发项目

//base controller, app/demo/controller/base.js  
module.exports = class extends doodoo.Controller {  

    async _initialize() {  
        console.log('base _initialize');  
    }  

    async isLogin() {  
        console.log('base isLogin');  
    }  
}  

//index controller, app/demo/controller/index.js  
const base = require('./base');  
module.exports = class extends base {  

    async _initialize() {  
        await super._initialize();  
    }  

    async index() {  
        this.success("Hello Doodoo.js");  
    }  

    async index2() {  
        this.fail("Hello Doodoo.js");  
    }  
}

详细的日志

服务 启动日志

[doodoo] Version: 2.0.0  
[doodoo] Website: 127.0.0.1  
[doodoo] Nodejs Version: v8.12.0  
[doodoo] Nodejs Platform: darwin x64  
[doodoo] Server Enviroment: development  
[doodoo] Server Startup Time: 212ms  
[doodoo] Server Current Time: 2018-08-21 11:17:19  
[doodoo] Server Running At: http://127.0.0.1:3000

HTTP 请求日志

<-- GET /demo/index/index  
--> GET /demo/index/index 200 4ms

doodoo.js官方文档:https://doodooke.github.io/doodoo.js/#/
【案例】多多客小程序官网:doodooke.com

收起阅读 »

uni-app在App端动态修改原生导航栏

uniapp

在App端可以通过得到webview对象,通过当前 webview 对象的 setTitleNViewButtonBadge, setTitleNViewButtonStyle, setTitleNViewSearchInputFocus,setTitleNViewSearchInputText 分别对 TitleNView 上的按钮角标,按钮,输入框等组件的样式进行修改。

对于 searchInput 还支持: 通过 webview的getStyle(),得到一个json对象,然后用json的.来获取titleNView,拿到的还是json对象,然后修改json对象,再用webview的setstyle方法把这个json对象赋值进去。

具体实现如下:

// #ifdef APP-PLUS  
var webView = this.$mp.page.$getAppWebview();  

// 修改buttons  
// index: 按钮索引, style {WebviewTitleNViewButtonStyles }  
webView.setTitleNViewButtonStyle(0, {  
    text: 'hello',  
});  

// 修改按钮上的角标  
// index: 按钮索引, text: 角标文本内容  
webView.setTitleNViewButtonBadge({  
    index: 0,  
    text: 10,  
});  

// 设置 searchInput的 focus  
// focus: true | false  
webView.setTitleNViewSearchInputFocus(true)  

// 设置 searchInput的 text  
webView.setTitleNViewSearchInputText(text)  

// searchInput 通过 webview 的 setStyle 方法进行更新  
var tn = currentWebview.getStyle().titleNView;  
if (tn.buttons) {    
uni.getSystemInfo({    
    success:function(res){    
        if (res.platform=="ios") { // 这里在HBuilderX 1.9.9版本有个bug,searchInput的I变小写了 ,临时绕过下。更高版本会修复此bug    
            tn.searchinput.placeholder = 'test';    
            currentWebview.setStyle({    
                titleNView: tn    
            });    
        } else{    
            tn.searchInput.placeholder = 'test'; //这里有个已知bug,HBuilderX 1.9.9上,当searchInput位于首页时,动态设置placehold会导致buttons的点击事件消失。更高版本会修复此bug    
            currentWebview.setStyle({    
                titleNView: tn    
            });    
        }    
    }    
})    
}    

// #endif

参考这个原理,可以任意修改titleNView的所有内容,titleNView的style内容详见:
https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewStyles

button的相关属性参考:http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewButtonStyles

searchInput的相关属性参考:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewSearchInputStyles

附件为测试buttons的demo,可下载体验。

继续阅读 »

在App端可以通过得到webview对象,通过当前 webview 对象的 setTitleNViewButtonBadge, setTitleNViewButtonStyle, setTitleNViewSearchInputFocus,setTitleNViewSearchInputText 分别对 TitleNView 上的按钮角标,按钮,输入框等组件的样式进行修改。

对于 searchInput 还支持: 通过 webview的getStyle(),得到一个json对象,然后用json的.来获取titleNView,拿到的还是json对象,然后修改json对象,再用webview的setstyle方法把这个json对象赋值进去。

具体实现如下:

// #ifdef APP-PLUS  
var webView = this.$mp.page.$getAppWebview();  

// 修改buttons  
// index: 按钮索引, style {WebviewTitleNViewButtonStyles }  
webView.setTitleNViewButtonStyle(0, {  
    text: 'hello',  
});  

// 修改按钮上的角标  
// index: 按钮索引, text: 角标文本内容  
webView.setTitleNViewButtonBadge({  
    index: 0,  
    text: 10,  
});  

// 设置 searchInput的 focus  
// focus: true | false  
webView.setTitleNViewSearchInputFocus(true)  

// 设置 searchInput的 text  
webView.setTitleNViewSearchInputText(text)  

// searchInput 通过 webview 的 setStyle 方法进行更新  
var tn = currentWebview.getStyle().titleNView;  
if (tn.buttons) {    
uni.getSystemInfo({    
    success:function(res){    
        if (res.platform=="ios") { // 这里在HBuilderX 1.9.9版本有个bug,searchInput的I变小写了 ,临时绕过下。更高版本会修复此bug    
            tn.searchinput.placeholder = 'test';    
            currentWebview.setStyle({    
                titleNView: tn    
            });    
        } else{    
            tn.searchInput.placeholder = 'test'; //这里有个已知bug,HBuilderX 1.9.9上,当searchInput位于首页时,动态设置placehold会导致buttons的点击事件消失。更高版本会修复此bug    
            currentWebview.setStyle({    
                titleNView: tn    
            });    
        }    
    }    
})    
}    

// #endif

参考这个原理,可以任意修改titleNView的所有内容,titleNView的style内容详见:
https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewStyles

button的相关属性参考:http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewButtonStyles

searchInput的相关属性参考:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewSearchInputStyles

附件为测试buttons的demo,可下载体验。

收起阅读 »

city.data-3.js 根据国家统计局数据生成的最新地区三级联动数据

bug提交

刚刚发现 city.data-3.js 数据比较老,有些新增的区域没有显示!! 然后我重新做了一份,分享给需要的大家!!!

刚刚发现 city.data-3.js 数据比较老,有些新增的区域没有显示!! 然后我重新做了一份,分享给需要的大家!!!

小米推送

小米推送的配置对吗

"mipush": {
"appid_android": "288230334457912743",
"appkey_android": "54451230743",
}
还是下面的这种配置

"mkeypush":{
"appid":"必选,mkey推送应用标示",
"appkey":"必选,mkey推送应用的appkey",
"server" :"必选,mkey推送服务器地址"
},

怎么小米推送一直收不到。 两总方式试过了,都收不到

继续阅读 »

小米推送的配置对吗

"mipush": {
"appid_android": "288230334457912743",
"appkey_android": "54451230743",
}
还是下面的这种配置

"mkeypush":{
"appid":"必选,mkey推送应用标示",
"appkey":"必选,mkey推送应用的appkey",
"server" :"必选,mkey推送服务器地址"
},

怎么小米推送一直收不到。 两总方式试过了,都收不到

收起阅读 »

uni-app number-box组件引用 动态控制数值

uniapp 教程 uniapp

再引用number-box组件时,使用过程中根据业务需要,数值的增加比如商城需要考虑实时库存?虽然在列表中增加max库存数,但根据业务需要使用的时增加数量先查询库存的业务,因此就需要动态控制数量值!
只需要做一个小小的优化就可以了!

组件原文件:

<template>  
    <view class="uni-numbox">  
        <view class="uni-numbox-minus" :class="{'uni-numbox-disabled': disableSubtract}" @click="_calcValue('subtract')">-</view>  
        <input class="uni-numbox-value" type="number" :disabled="disabled" :value="inputValue" @blur="_onBlur">  
        <view class="uni-numbox-plus" :class="{'uni-numbox-disabled': disableAdd}" @click="_calcValue('add')">+</view>  
    </view>  
</template>  
<script>  
    export default {  
        name: 'uni-number-box',  
        props: {  
            value: {  
                type: Number,  
                default: 0  
            },  
            min: {  
                type: Number,  
                default: -Infinity  
            },  
            max: {  
                type: Number,  
                default: Infinity  
            },  
            step: {  
                type: Number,  
                default: 1  
            },  
            disabled: {  
                type: Boolean,  
                default: false  
            }  
        },  
        data() {  
            return {  
                inputValue: this.value  
            }  
        },  
        computed: {  
            disableSubtract() {  
                return this.value <= this.min  
            },  
            disableAdd() {  
                return this.value >= this.max  
            }  
        },  
        watch: {  
            value(val) {  
                this.inputValue = val;  
            },  
            inputValue(val) {  
                this.$emit('change', val);  
            }  
        },  
        methods: {  
            _calcValue(type) {  
                const scale = this._getDecimalScale();  
                let value = this.inputValue * scale;  
                let step = this.step * scale;  

                if (type === 'subtract') {  
                    value -= step  
                } else if (type === 'add') {  
                    value += step  
                }  
                if (value < this.min || value > this.max) {  
                    return  
                }  
                this.inputValue = value / scale;  
            },  
            _getDecimalScale() {  
                let scale = 1;  
                // 浮点型  
                if (~~this.step !== this.step) {  
                    scale = Math.pow(10, (this.step + '').split('.')[1].length);  
                }  
                return scale;  
            },  
            _onBlur(event) {  
                let value = event.detail.value;  
                if (!value) {  
                    this.inputValue = 0;  
                    return  
                }  
                value = +value;  
                if (value > this.max) {  
                    value = this.max;  
                } else if (value < this.min) {  
                    value = this.min  
                }  
                this.inputValue = value  
            }  
        }  
    }  
</script>  
<style>  
    .uni-numbox {  
        display: flex;  
        flex-direction: row;  
        justify-content: flex-start;  
        height: 70upx;  
    }  

    .uni-numbox-minus,  
    .uni-numbox-plus {  
        margin: 0;  
        background-color: #f9f9f9;  
        width: 80upx;  
        height: 100%;  
        line-height: 70upx;  
        text-align: center;  
        color: #555555;  
    }  

    .uni-numbox-minus {  
        border: 2upx solid #cccccc;  
        border-right: none;  
        border-top-left-radius: 6upx;  
        border-bottom-left-radius: 6upx;  
    }  

    .uni-numbox-plus {  
        border: 2upx solid #cccccc;  
        border-left: none;  
        border-top-right-radius: 6upx;  
        border-bottom-right-radius: 6upx;  
    }  

    .uni-numbox-value {  
        border: 2upx solid #cccccc;  
        background-color: #ffffff;  
        width: 80upx;  
        height: 100%;  
        text-align: center;  
    }  

    .uni-numbox-disabled {  
        color: #c0c0c0;  
    }  
</style>  

引用组件web中代码:(其中item.num为动态值,item为列表循环项目)

<block v-for="(item,index) in cartList" :key="index">  
<uni-number-box :value="item.num" :min="1" v-on:change="onNumberChange($event,item)"></uni-number-box>  
</block>

组件返回的信息

            onNumberChange(value,e) {   
                if(value==e.num){ //防止重复传送  
                    return false;  
                }  
                uni.request({  
                    url: '',  
                    method: 'POST',  
                    header: {'content-type': 'application/x-www-form-urlencoded'},  
                    data: {},  
                    success: res => {  
                        if(!res.data.datas.error){  
                            e.num = res.data.datas.num; //服务器返回值 根据业务需要写  
                            }else{  
                                uni.showToast({ title: res.data.datas.error,icon:"none"});  
                            }  
                    }  
                });  
            }

使用过程中,我们会发现,服务器接受了数量后才会同意该值,当不接受的时候 我们就得把后来增加的值恢复到没增加之前,动态改变item.num为原来的值的时候,而组件并为更新,原来才原值没有变化或相同的情况下组件并不会更新!
那么我们就需要修改一下组件,让它能实时更新和掌控
找到组件中以下代码

        watch: {  
            value(val) {  
                this.inputValue = val;  
            },  
            inputValue(val) {  
                this.$emit('change', val);  
            }  
        }

修改为:

        watch: {  
            value(val) {  
                this.inputValue = val;  
            },  
            inputValue(val) {  
                this.$emit('change', val);  
                if(this.value){  
                if(this.value!=this.inputValue){  
                    this.inputValue = this.value;  
                }}  
            }  
        }

这样就完成了后端控制数量的增减过程

继续阅读 »

再引用number-box组件时,使用过程中根据业务需要,数值的增加比如商城需要考虑实时库存?虽然在列表中增加max库存数,但根据业务需要使用的时增加数量先查询库存的业务,因此就需要动态控制数量值!
只需要做一个小小的优化就可以了!

组件原文件:

<template>  
    <view class="uni-numbox">  
        <view class="uni-numbox-minus" :class="{'uni-numbox-disabled': disableSubtract}" @click="_calcValue('subtract')">-</view>  
        <input class="uni-numbox-value" type="number" :disabled="disabled" :value="inputValue" @blur="_onBlur">  
        <view class="uni-numbox-plus" :class="{'uni-numbox-disabled': disableAdd}" @click="_calcValue('add')">+</view>  
    </view>  
</template>  
<script>  
    export default {  
        name: 'uni-number-box',  
        props: {  
            value: {  
                type: Number,  
                default: 0  
            },  
            min: {  
                type: Number,  
                default: -Infinity  
            },  
            max: {  
                type: Number,  
                default: Infinity  
            },  
            step: {  
                type: Number,  
                default: 1  
            },  
            disabled: {  
                type: Boolean,  
                default: false  
            }  
        },  
        data() {  
            return {  
                inputValue: this.value  
            }  
        },  
        computed: {  
            disableSubtract() {  
                return this.value <= this.min  
            },  
            disableAdd() {  
                return this.value >= this.max  
            }  
        },  
        watch: {  
            value(val) {  
                this.inputValue = val;  
            },  
            inputValue(val) {  
                this.$emit('change', val);  
            }  
        },  
        methods: {  
            _calcValue(type) {  
                const scale = this._getDecimalScale();  
                let value = this.inputValue * scale;  
                let step = this.step * scale;  

                if (type === 'subtract') {  
                    value -= step  
                } else if (type === 'add') {  
                    value += step  
                }  
                if (value < this.min || value > this.max) {  
                    return  
                }  
                this.inputValue = value / scale;  
            },  
            _getDecimalScale() {  
                let scale = 1;  
                // 浮点型  
                if (~~this.step !== this.step) {  
                    scale = Math.pow(10, (this.step + '').split('.')[1].length);  
                }  
                return scale;  
            },  
            _onBlur(event) {  
                let value = event.detail.value;  
                if (!value) {  
                    this.inputValue = 0;  
                    return  
                }  
                value = +value;  
                if (value > this.max) {  
                    value = this.max;  
                } else if (value < this.min) {  
                    value = this.min  
                }  
                this.inputValue = value  
            }  
        }  
    }  
</script>  
<style>  
    .uni-numbox {  
        display: flex;  
        flex-direction: row;  
        justify-content: flex-start;  
        height: 70upx;  
    }  

    .uni-numbox-minus,  
    .uni-numbox-plus {  
        margin: 0;  
        background-color: #f9f9f9;  
        width: 80upx;  
        height: 100%;  
        line-height: 70upx;  
        text-align: center;  
        color: #555555;  
    }  

    .uni-numbox-minus {  
        border: 2upx solid #cccccc;  
        border-right: none;  
        border-top-left-radius: 6upx;  
        border-bottom-left-radius: 6upx;  
    }  

    .uni-numbox-plus {  
        border: 2upx solid #cccccc;  
        border-left: none;  
        border-top-right-radius: 6upx;  
        border-bottom-right-radius: 6upx;  
    }  

    .uni-numbox-value {  
        border: 2upx solid #cccccc;  
        background-color: #ffffff;  
        width: 80upx;  
        height: 100%;  
        text-align: center;  
    }  

    .uni-numbox-disabled {  
        color: #c0c0c0;  
    }  
</style>  

引用组件web中代码:(其中item.num为动态值,item为列表循环项目)

<block v-for="(item,index) in cartList" :key="index">  
<uni-number-box :value="item.num" :min="1" v-on:change="onNumberChange($event,item)"></uni-number-box>  
</block>

组件返回的信息

            onNumberChange(value,e) {   
                if(value==e.num){ //防止重复传送  
                    return false;  
                }  
                uni.request({  
                    url: '',  
                    method: 'POST',  
                    header: {'content-type': 'application/x-www-form-urlencoded'},  
                    data: {},  
                    success: res => {  
                        if(!res.data.datas.error){  
                            e.num = res.data.datas.num; //服务器返回值 根据业务需要写  
                            }else{  
                                uni.showToast({ title: res.data.datas.error,icon:"none"});  
                            }  
                    }  
                });  
            }

使用过程中,我们会发现,服务器接受了数量后才会同意该值,当不接受的时候 我们就得把后来增加的值恢复到没增加之前,动态改变item.num为原来的值的时候,而组件并为更新,原来才原值没有变化或相同的情况下组件并不会更新!
那么我们就需要修改一下组件,让它能实时更新和掌控
找到组件中以下代码

        watch: {  
            value(val) {  
                this.inputValue = val;  
            },  
            inputValue(val) {  
                this.$emit('change', val);  
            }  
        }

修改为:

        watch: {  
            value(val) {  
                this.inputValue = val;  
            },  
            inputValue(val) {  
                this.$emit('change', val);  
                if(this.value){  
                if(this.value!=this.inputValue){  
                    this.inputValue = this.value;  
                }}  
            }  
        }

这样就完成了后端控制数量的增减过程

收起阅读 »

关于Mac Mojave系统,权限控制的问题

权限 Mac mojave Mac Mojave

Mac Mojave系统,增强了权限控制。应用程序,访问照片、访达、磁盘、通讯录、网络等都需要授权。

如果你首次安装HBuilderX, 打开后,进行文件删除操作,会弹窗提示是否授权(如下图1)
Mac Mojave: 文件创建、重命名等是不需要授权的,只有删除操作,系统会弹窗要求授权

如果不允许操作,HBuilderX会出现无法删除文件的情况。

如果不小心点了不允许,怎么办?

方法1:

打开【设置】--->【安全性与隐私】--->【隐私】--->【自动化】,如下图: 把HBuilderX勾选上

方法2:

打开终端,重置一下权限,重置命令:

tccutil reset AppleEvents 

方法3:

重新安装HBuilderX

继续阅读 »

Mac Mojave系统,增强了权限控制。应用程序,访问照片、访达、磁盘、通讯录、网络等都需要授权。

如果你首次安装HBuilderX, 打开后,进行文件删除操作,会弹窗提示是否授权(如下图1)
Mac Mojave: 文件创建、重命名等是不需要授权的,只有删除操作,系统会弹窗要求授权

如果不允许操作,HBuilderX会出现无法删除文件的情况。

如果不小心点了不允许,怎么办?

方法1:

打开【设置】--->【安全性与隐私】--->【隐私】--->【自动化】,如下图: 把HBuilderX勾选上

方法2:

打开终端,重置一下权限,重置命令:

tccutil reset AppleEvents 

方法3:

重新安装HBuilderX

收起阅读 »

HTML5+ plus.navigator cookie 安卓版本兼容性的问题

plus HTML5 HTML5+ navigator Cookie

这个问题在我开发时快要逼疯我了,官方文档也没写
http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.getCookie

只能人肉排雷了,话说html+的接口都没有测过吗?

平台 genymotion 模拟器 android 6.0/android 7.0 window10 1803

  1. 新建项目
  2. 打开7.0 模拟器
  3. hbuilderx 运行.运行到模拟器, 自动安装基座
  4. 打开webview调试
  5. 打开Application选项卡,找到cookie,可以看到,里面有一条name为sessionid的记录
  6. 打开Console 执行 plus.navigator.getCookie(url); 返回null

重复以上步骤,用的是6.0的模拟器 可以得到cookie记录

关于 HTML+ cookie 的api还有很多问题,而且官网上也没写

希望官方能尽快核实

这是我人肉趟雷一星期,才发现的. 开发的时候用的是6.0的系统,装7.0系统上不管用,悲哀啊

继续阅读 »

这个问题在我开发时快要逼疯我了,官方文档也没写
http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.getCookie

只能人肉排雷了,话说html+的接口都没有测过吗?

平台 genymotion 模拟器 android 6.0/android 7.0 window10 1803

  1. 新建项目
  2. 打开7.0 模拟器
  3. hbuilderx 运行.运行到模拟器, 自动安装基座
  4. 打开webview调试
  5. 打开Application选项卡,找到cookie,可以看到,里面有一条name为sessionid的记录
  6. 打开Console 执行 plus.navigator.getCookie(url); 返回null

重复以上步骤,用的是6.0的模拟器 可以得到cookie记录

关于 HTML+ cookie 的api还有很多问题,而且官网上也没写

希望官方能尽快核实

这是我人肉趟雷一星期,才发现的. 开发的时候用的是6.0的系统,装7.0系统上不管用,悲哀啊

收起阅读 »

关于uni-app中试用 vuex 的 moduls 的问题

如果按照 vuex 的 modules 写法,在组件中拿不到 modules 中 state 中定义的数据 ,
写到 store/index 的 state 才可以,
有没有遇到这样的问题,对 vuex 中 支持是不是有限?

如果按照 vuex 的 modules 写法,在组件中拿不到 modules 中 state 中定义的数据 ,
写到 store/index 的 state 才可以,
有没有遇到这样的问题,对 vuex 中 支持是不是有限?

graceUI 发布 IM即时通讯组件,支持 文本、图片、语音多种模式,完善的录音、图片预览、历史记录功能

graceUI uniapp

2022年06月13日 GraceUI 6.0 版本正式发布

GraceUI 是一款成熟完善的、为uni-app量身打造的优秀的UI框架!经过近4年的维护已经成为组件多、界面丰富、运行稳定的 uni-app 专业UI框架 !
GraceUI 第一版发布于2018年9月,4年多来我们一直坚持收集反馈,高效、高频更新!从1.0到6.0 GraceUI 已经变得更加丰富、兼容性更好~
在此也感谢近万名使用者的一路相伴,感谢你们的支持与反馈~
官网 : https://www.graceui.com/

1. 丰富的组件及样式

GraceUI 的组件、样式、布局、界面非常丰富,总量 150+!您可以使用他们快速的完成应用页面的布局~

1.1 基础布局组件及样式

页面布局 · Flex布局 · 元素定位 · 文本颜色 · 背景样式 · 阴影效果 · 圆角边框 · 文本样式 · 内置图标 · 样式动画

1.2 常用布局

宫格布局 · 头部导航 · 底部导航 · 切换导航 · 吸顶容器 · 动态吸顶 · 通用列表 · 滑动列表 · 新闻列表 · 评论列表 · 图文卡片 · 名片卡片 · 滚动区域 · 遮罩弹层 · 局部选项卡 · 全屏选项卡 · 分段切换 · 折叠面板 · 普通表格 · 数据表格 · 分类展示 · 横向公告 · 返回顶部 · 弹出菜单 · 功能菜单 · 时间轴 · 侧边抽屉 · 图标分类 · 横向日期

1.3 加载组件

加载组件 · 全屏加载 · 下拉刷新 · 刷新组件 · 上拉加载

1.4 常用组件

徽章组件 · 标签组件 · 滚动公告 · 无缝滚动 · 按钮组件 · 进度按钮 · 搜索组件 · 星级评价 · 通用标题 · 倒计时 · 轮播组件 · 日历时间 · 区间滑块 · 进度圆环 · 城市选择 · 地区联动 · 步骤提示 · 链接组件 · 优惠券组件 · 为空展示 · 图片选择 · 多图上传 · 头像群组 · 数值动画 · 日期时间选择 · 时间段选择器

1.5 对话框组件

顶部消息框 · 模态对话框 · 底部对话框 · 底部消息框

1.6 表单相关

表单元素 · 表单验证 · 数值框 · 数字键盘 · 可选标签 · 点选按钮 · 下拉选择

1.7 文章相关

文本编辑器 · 编辑器解析 · 富文本加强 · 展开全文

1.8 JS 工具库

时间转换 · 网络请求 · 随机数值 · md5转换 · 系统信息

1.9 常用界面库

搜索界面 · 登录注册 · 个人中心 · 购物车 · 订单中心 · 图片剪裁 · 商品详情 · 图片懒加载 · 骨架加载 · 抽奖活动 · 瀑布流 · 选择问卷 · 地址列表 · 添加地址 · 证件上传 · 滚动推荐 · 短信验证 · 排行榜 · 商城套装 · 即时通讯

2. 强大的版本支持 业界首款成熟的基于uni-app 的 nvue UI 框架

GraceUI 6.0 基于 vue3.0 同时支持 nvue,为app端更流畅的体验提供了极大的便利~
nvue 普通版本基本同步,想优化您的app?添加一个 .nuve 复制 vue 代码即可迅速完成~

3. 更好的兼容性、更稳定

GraceUI 自发布以来已经有上万名使用者,在开发的过程中不断给我们最真实的反馈,我们更是以积极的心态面对每一个反馈,及时确认问题并及时修正(最快10分钟哦)~经过一年多的 "锤炼",GraceUI 变得极度稳定、兼容性极好~ 感谢每一份反馈,感谢每一位支持者~

您不需要费力的去布局,有 GraceUI 就够了 ^_^

4. Grace.JS 化繁为简,只为热爱 ~

Grace.js 是 GraceUI 框架的 js 框架,目标是 " 简化您的 uni-app 及 微信小程序 api 操作,同时提供丰富、好用的 js 工具,大幅度提高您的开发效率" 。

5. 收费说明

GraceUI 6.0 版本售价 299元
收费只是最基本的维护开销,不是"赚钱的买卖",我们更认为是您的一种信任,对于我们更多的是责任!所以这里不是淘宝,不是简单的交易!我们希望得到正向的反馈、正向的帮助,不断完善,最终成为"组件多、稳定性好" 的UI框架!
一次性收费永久免费更新 ~

官网 :

https://www.graceui.com/

继续阅读 »

2022年06月13日 GraceUI 6.0 版本正式发布

GraceUI 是一款成熟完善的、为uni-app量身打造的优秀的UI框架!经过近4年的维护已经成为组件多、界面丰富、运行稳定的 uni-app 专业UI框架 !
GraceUI 第一版发布于2018年9月,4年多来我们一直坚持收集反馈,高效、高频更新!从1.0到6.0 GraceUI 已经变得更加丰富、兼容性更好~
在此也感谢近万名使用者的一路相伴,感谢你们的支持与反馈~
官网 : https://www.graceui.com/

1. 丰富的组件及样式

GraceUI 的组件、样式、布局、界面非常丰富,总量 150+!您可以使用他们快速的完成应用页面的布局~

1.1 基础布局组件及样式

页面布局 · Flex布局 · 元素定位 · 文本颜色 · 背景样式 · 阴影效果 · 圆角边框 · 文本样式 · 内置图标 · 样式动画

1.2 常用布局

宫格布局 · 头部导航 · 底部导航 · 切换导航 · 吸顶容器 · 动态吸顶 · 通用列表 · 滑动列表 · 新闻列表 · 评论列表 · 图文卡片 · 名片卡片 · 滚动区域 · 遮罩弹层 · 局部选项卡 · 全屏选项卡 · 分段切换 · 折叠面板 · 普通表格 · 数据表格 · 分类展示 · 横向公告 · 返回顶部 · 弹出菜单 · 功能菜单 · 时间轴 · 侧边抽屉 · 图标分类 · 横向日期

1.3 加载组件

加载组件 · 全屏加载 · 下拉刷新 · 刷新组件 · 上拉加载

1.4 常用组件

徽章组件 · 标签组件 · 滚动公告 · 无缝滚动 · 按钮组件 · 进度按钮 · 搜索组件 · 星级评价 · 通用标题 · 倒计时 · 轮播组件 · 日历时间 · 区间滑块 · 进度圆环 · 城市选择 · 地区联动 · 步骤提示 · 链接组件 · 优惠券组件 · 为空展示 · 图片选择 · 多图上传 · 头像群组 · 数值动画 · 日期时间选择 · 时间段选择器

1.5 对话框组件

顶部消息框 · 模态对话框 · 底部对话框 · 底部消息框

1.6 表单相关

表单元素 · 表单验证 · 数值框 · 数字键盘 · 可选标签 · 点选按钮 · 下拉选择

1.7 文章相关

文本编辑器 · 编辑器解析 · 富文本加强 · 展开全文

1.8 JS 工具库

时间转换 · 网络请求 · 随机数值 · md5转换 · 系统信息

1.9 常用界面库

搜索界面 · 登录注册 · 个人中心 · 购物车 · 订单中心 · 图片剪裁 · 商品详情 · 图片懒加载 · 骨架加载 · 抽奖活动 · 瀑布流 · 选择问卷 · 地址列表 · 添加地址 · 证件上传 · 滚动推荐 · 短信验证 · 排行榜 · 商城套装 · 即时通讯

2. 强大的版本支持 业界首款成熟的基于uni-app 的 nvue UI 框架

GraceUI 6.0 基于 vue3.0 同时支持 nvue,为app端更流畅的体验提供了极大的便利~
nvue 普通版本基本同步,想优化您的app?添加一个 .nuve 复制 vue 代码即可迅速完成~

3. 更好的兼容性、更稳定

GraceUI 自发布以来已经有上万名使用者,在开发的过程中不断给我们最真实的反馈,我们更是以积极的心态面对每一个反馈,及时确认问题并及时修正(最快10分钟哦)~经过一年多的 "锤炼",GraceUI 变得极度稳定、兼容性极好~ 感谢每一份反馈,感谢每一位支持者~

您不需要费力的去布局,有 GraceUI 就够了 ^_^

4. Grace.JS 化繁为简,只为热爱 ~

Grace.js 是 GraceUI 框架的 js 框架,目标是 " 简化您的 uni-app 及 微信小程序 api 操作,同时提供丰富、好用的 js 工具,大幅度提高您的开发效率" 。

5. 收费说明

GraceUI 6.0 版本售价 299元
收费只是最基本的维护开销,不是"赚钱的买卖",我们更认为是您的一种信任,对于我们更多的是责任!所以这里不是淘宝,不是简单的交易!我们希望得到正向的反馈、正向的帮助,不断完善,最终成为"组件多、稳定性好" 的UI框架!
一次性收费永久免费更新 ~

官网 :

https://www.graceui.com/

收起阅读 »

车牌号虚拟软键盘组件

uniapp插件 uniapp 虚拟键盘 组件

手上有一个练手的停车场的项目,需要绑定车牌号,既(省)+(英文大写/数字)。但是现有的键盘是没法满足这个需求的。
鉴于uni-app的强大生态圈,于是我决定做了这个键盘。效果如下


附件可下载
使用方法

        <plate-keyboard :type='keyboardType' :show='keyboardShow' @hit="hitKeyboard" @complete="complete"></plate-keyboard>

type:键盘类型 1、省份键盘 2、数字英文键盘
show: 显示键盘 true/false
hit: 点击键盘回调,会直接返回点击内容,键盘类型用type自行判断,点击删除返回的是delete
complete: 点击完成的回调

继续阅读 »

手上有一个练手的停车场的项目,需要绑定车牌号,既(省)+(英文大写/数字)。但是现有的键盘是没法满足这个需求的。
鉴于uni-app的强大生态圈,于是我决定做了这个键盘。效果如下


附件可下载
使用方法

        <plate-keyboard :type='keyboardType' :show='keyboardShow' @hit="hitKeyboard" @complete="complete"></plate-keyboard>

type:键盘类型 1、省份键盘 2、数字英文键盘
show: 显示键盘 true/false
hit: 点击键盘回调,会直接返回点击内容,键盘类型用type自行判断,点击删除返回的是delete
complete: 点击完成的回调

收起阅读 »

[分享经验]开发者工具箱---很多好用的工具在里面

名称: 开发者神器库1.0

语言: 中文

平台: win7/win8/win10

下载地址: https://pan.baidu.com/s/14Bz45GuCyL7lSiZANmT0xw

简介:

开发者神器库是一款集合前后端开发者常用工具的仓库。图片处理、逆向破解工具、设计师/美工、等等一系列工具......

继续阅读 »

名称: 开发者神器库1.0

语言: 中文

平台: win7/win8/win10

下载地址: https://pan.baidu.com/s/14Bz45GuCyL7lSiZANmT0xw

简介:

开发者神器库是一款集合前后端开发者常用工具的仓库。图片处理、逆向破解工具、设计师/美工、等等一系列工具......

收起阅读 »