
【全开源+免费更新】doodoo.js快速入门教程
简介
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端动态修改原生导航栏
在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 根据国家统计局数据生成的最新地区三级联动数据
刚刚发现 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组件引用 动态控制数值
再引用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系统,增强了权限控制。应用程序,访问照片、访达、磁盘、通讯录、网络等都需要授权。
如果你首次安装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 安卓版本兼容性的问题
这个问题在我开发时快要逼疯我了,官方文档也没写
http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.getCookie
只能人肉排雷了,话说html+的接口都没有测过吗?
平台 genymotion 模拟器 android 6.0/android 7.0 window10 1803
- 新建项目
- 打开7.0 模拟器
- hbuilderx 运行.运行到模拟器, 自动安装基座
- 打开webview调试
- 打开Application选项卡,找到cookie,可以看到,里面有一条name为sessionid的记录
- 打开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
- 新建项目
- 打开7.0 模拟器
- hbuilderx 运行.运行到模拟器, 自动安装基座
- 打开webview调试
- 打开Application选项卡,找到cookie,可以看到,里面有一条name为sessionid的记录
- 打开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即时通讯组件,支持 文本、图片、语音多种模式,完善的录音、图片预览、历史记录功能
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框架!
一次性收费永久免费更新 ~
官网 :
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框架!
一次性收费永久免费更新 ~
官网 :
收起阅读 »
车牌号虚拟软键盘组件
手上有一个练手的停车场的项目,需要绑定车牌号,既(省)+(英文大写/数字)。但是现有的键盘是没法满足这个需求的。
鉴于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
简介:
开发者神器库是一款集合前后端开发者常用工具的仓库。图片处理、逆向破解工具、设计师/美工、等等一系列工具......
收起阅读 »