- 浏览: 34028 次
最新评论
2016年小程序的推出,刷爆了朋友圈。作为一名好奇的程序猿,当然是要学习一下。于是就在2个月前在小黄象发了个demo 图书管理系统(社区API版).个人在写这个demo的时候发现小程序有一些不方便的地方:
不能使用promise(后来发现手动引用第三方promise库还是可以的)
不能使用promise意味着一定要使用回调这种写法,当回调的层次深了后,代码的可读性将大幅下降,日后维护也麻烦。
开发模式不利于代码的重复利用
后来发现Gcaufy大神有开发了一个wepy框架,能解决小程序的一些问题。以下摘自于wepy的介绍.
主要解决的问题
开发模式转换
支持组件化开发
支持加载外部NPM包
单文件模式,使得目录结构更加清晰
默认使用babel编译,支持ES6/7的一些新特性
针对原生API进行优化
(更详细的内容请点击这里)
在学习了一波wepy后,于是有了今天的微信小程序之图书管理系统(wepy版),数据的存储还是使用社区的API,大家可以直接把源码下载下来运行。本demo在外观和功能上与图书管理系统(社区API版)没有多大的区别,更多的是一种组件化的开发思路(本文不对样式进行介绍)。好了,开始进入正题。
完成效果图
index页面分析index页面其实很简单,就包含两个组件,分别是searchbar 和 booklist。我们只需通过css控制这两个组件的布局就可以。剩下的就是searchbar 和 booklist的开发。
searchbar组件searchbar组件的功能也很单纯,只是需要告诉父组件用户输入了什么信息。看一下代码
// searchbar.vue
<template>
<view class="search-bar">
<input placeholder="请输入书名" bindinput="inputChange" />
<button type="primary" bindtap="queryBooks">查詢</button>
</view>
</template>
<script>
import wepy from 'wepy';
export default class SearchBar extends wepy.component {
props = {};
data = {};
events = {
'index-broadcast': ($event, ...args) => {
console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
}
};
methods = {
inputChange(e) {
this.$emit('inputChange', e.detail.value);
},
};
}
</script>
当用户在输入的时候会触发inputChange事件,而inputChange会emit一个叫“inputChange”的事件。在父组件中(page也是组件,这里指index页面),会监听inputChange事件,从而获取到从子组件传递出来的数据,继而过滤数据。
// index.vue
events = {
// 监听searchbar emit出来的事件,从而获得searchbar的输入
'inputChange': ($event, ...args) => {
this.searchFilter = args[0];
let filterBooks = [];
if (this.searchFilter.trim().length === 0) {
filterBooks = this.booksCopy;
} else {
this.books.forEach((book) => {
if (this.searchFilter.trim() &&
book.title.toUpperCase().indexOf(this.searchFilter.toUpperCase()) >= 0) {
filterBooks.push(book);
}
});
}
this.books = filterBooks;
this.$apply();
},
// 点击book list组件时候转跳到明细页面,book list组件把被点击的book传递出来
'goToDetailPage': ($event, ...args) => {
let book = args[0];
wx.navigateTo({
url: 'bookdetail?book=' + JSON.stringify(book),
});
},
};
booklist组件booklist组件接收一个book数组,然后for循环把book的概要信息显示出来.父组件(index)需要在onLoad的时候发起请求获取book信息,然后通过props把信息传递给booklist。index页面在发起请求的时候使用了wepy封装后的wx.request,返回promise。然后利用async/await可以让异步请求看起来像同步,是不是很爽!!
// index
async onShow() {
var op1 = {
url: Config.clubApi.list,
data: {
appkey: Config.appKey,
type: 'bookLibrary'
}
};
let res = await wx.request(op1);
let clubBooks = res.data.result;
let clubBooksArray = [];
if (clubBooks.length > 0) {
try{
clubBooks.forEach((clubBook) => {
clubBooksArray.push(clubBook.value);
});
this.books = clubBooksArray;
this.booksCopy = this.books;
}catch(err){
this.books=[];
this.booksCopy=[];
}
}
this.$apply();
}
//booklist组件 ,通过props获取从父组件传递过来的数据
<template>
<view class="book-content">
<view wx:for="{{books}}" wx:key="isbn13" id="{{item.isbn13}}" data-qty="{{item.qty}}" bindtap="goToDetailPage({{item}})">
<view class="book-list">
<view class="book-image">
<image src="{{item.image}}" mode="aspectFit"></image>
</view>
<view class="book-info">
<view class="book-info-style">
<view>书名:{{item.title}}</view>
<view>作者:{{item.author}}
</view>
<view>价格:{{item.price}}
</view>
<view>出版信息:{{item.publisher}}
</view>
<view>可借数量:{{item.qty}}
</view>
</view>
</view>
</view>
<view class="line"></view>
</view>
</view>
</template>
props = {
// 接收父组件传递的books数组
books: {},
};
然后,我们回到index页面,把两个组件引用进来就可以了,index页面完成!
<view class="main-wrapper">
<view class="search-bar-wrapper">
<component id="searchBar"></component> //searchbar组件
</view>
<view class="book-list-wrapper">
<component id="bookList" :books.sync="books"></component> //booklist组件
</view>
</view>
book detail页面接着我们再看看book detail 页面的结构。其实也是由3部分组成。最上方是booklist 组件,中间是book info组件,最下面是btn wrapper,如下图。大家可以发现,这个页面也是有book list的,那我们是否需要把代码copy过来的。No!我们只需要引用过来就好了,这个是组件化开发的好处之一,重用性高。
以下是book detail的页面结构,非常的简单。
<view class="main-wrapper">
<view class="book-list-wrapper">
<component id="bookList" :books.sync="book"></component>
</view>
<view class="book-detail-wrapper">
<component id="bookInfo" :books.sync="bookInfo" :height.sync="windowHeight"></component>
</view>
<view class="control-btn-wrapper">
<button type="primary" wx:if="{{bookInfo.qty > 0}}" bindtap="borrowBook"> 借阅 </button>
<button type="primary" wx:if="{{bookInfo.qty === 0}}"> 预约 </button>
<button type="primary" wx:if="{{showAddBook}}"> 录入 </button>
</view>
</view>
现在我们还差一个book info组件,now,一起来把它撸出来。
book info 组件其实book info组件的功能也很单纯。把“内容推荐”,“作者简介”和“目录”信息显示出来就可以。看以下页面结构:
// book info组件
<view class="book-info">
<scroll-view scroll-y="true" style="height:{{height}}px;" >
<view class="book-intro">
<text class="book-title">内容推荐</text>
<text class="book-msg">{{books.summary}}</text>
</view>
<view class="space-line-30"></view>
<view class="book-intro">
<text class="book-title">作者简介</text>
<text class="book-msg">{{books.author_intro}}</text>
</view>
<view class="space-line-30"></view>
<view class="book-intro">
<text class="book-title">目录</text>
<text class="book-msg">{{books.catalog}}</text>
</view>
</scroll-view>
</view>
这里使用到scroll view,小程序的scroll view是需要指定高度的,否则无法滚动。所以我们要动态计算中间那部分的高度。但是,组件本身是不知道它的容器的有多高的,所以需要父组件通过props告诉组件。
// book info 组件
props = {
books: {},//接收要显示的书本的信息
height:Number,//接收scroll view的高度
};
//book detail 组件
async onLoad(options) {
this.book = [];
this.book.push(JSON.parse(options.book));
this.bookInfo = JSON.parse(options.book);
if (this.windowHeight === 0) {
// 获取设备的高度,然后减去book list组件的高度,减去btn wrapper的高度再减去margin top 的高度
let res = await wx.getSystemInfo();
this.windowHeight = res.windowHeight - 66 - 136 - 10;
this.$apply();
}
}
原文链接:http://bbs.jointforce.com/topic/25380
不能使用promise(后来发现手动引用第三方promise库还是可以的)
不能使用promise意味着一定要使用回调这种写法,当回调的层次深了后,代码的可读性将大幅下降,日后维护也麻烦。
开发模式不利于代码的重复利用
后来发现Gcaufy大神有开发了一个wepy框架,能解决小程序的一些问题。以下摘自于wepy的介绍.
主要解决的问题
开发模式转换
支持组件化开发
支持加载外部NPM包
单文件模式,使得目录结构更加清晰
默认使用babel编译,支持ES6/7的一些新特性
针对原生API进行优化
(更详细的内容请点击这里)
在学习了一波wepy后,于是有了今天的微信小程序之图书管理系统(wepy版),数据的存储还是使用社区的API,大家可以直接把源码下载下来运行。本demo在外观和功能上与图书管理系统(社区API版)没有多大的区别,更多的是一种组件化的开发思路(本文不对样式进行介绍)。好了,开始进入正题。
完成效果图
index页面分析index页面其实很简单,就包含两个组件,分别是searchbar 和 booklist。我们只需通过css控制这两个组件的布局就可以。剩下的就是searchbar 和 booklist的开发。
searchbar组件searchbar组件的功能也很单纯,只是需要告诉父组件用户输入了什么信息。看一下代码
// searchbar.vue
<template>
<view class="search-bar">
<input placeholder="请输入书名" bindinput="inputChange" />
<button type="primary" bindtap="queryBooks">查詢</button>
</view>
</template>
<script>
import wepy from 'wepy';
export default class SearchBar extends wepy.component {
props = {};
data = {};
events = {
'index-broadcast': ($event, ...args) => {
console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
}
};
methods = {
inputChange(e) {
this.$emit('inputChange', e.detail.value);
},
};
}
</script>
当用户在输入的时候会触发inputChange事件,而inputChange会emit一个叫“inputChange”的事件。在父组件中(page也是组件,这里指index页面),会监听inputChange事件,从而获取到从子组件传递出来的数据,继而过滤数据。
// index.vue
events = {
// 监听searchbar emit出来的事件,从而获得searchbar的输入
'inputChange': ($event, ...args) => {
this.searchFilter = args[0];
let filterBooks = [];
if (this.searchFilter.trim().length === 0) {
filterBooks = this.booksCopy;
} else {
this.books.forEach((book) => {
if (this.searchFilter.trim() &&
book.title.toUpperCase().indexOf(this.searchFilter.toUpperCase()) >= 0) {
filterBooks.push(book);
}
});
}
this.books = filterBooks;
this.$apply();
},
// 点击book list组件时候转跳到明细页面,book list组件把被点击的book传递出来
'goToDetailPage': ($event, ...args) => {
let book = args[0];
wx.navigateTo({
url: 'bookdetail?book=' + JSON.stringify(book),
});
},
};
booklist组件booklist组件接收一个book数组,然后for循环把book的概要信息显示出来.父组件(index)需要在onLoad的时候发起请求获取book信息,然后通过props把信息传递给booklist。index页面在发起请求的时候使用了wepy封装后的wx.request,返回promise。然后利用async/await可以让异步请求看起来像同步,是不是很爽!!
// index
async onShow() {
var op1 = {
url: Config.clubApi.list,
data: {
appkey: Config.appKey,
type: 'bookLibrary'
}
};
let res = await wx.request(op1);
let clubBooks = res.data.result;
let clubBooksArray = [];
if (clubBooks.length > 0) {
try{
clubBooks.forEach((clubBook) => {
clubBooksArray.push(clubBook.value);
});
this.books = clubBooksArray;
this.booksCopy = this.books;
}catch(err){
this.books=[];
this.booksCopy=[];
}
}
this.$apply();
}
//booklist组件 ,通过props获取从父组件传递过来的数据
<template>
<view class="book-content">
<view wx:for="{{books}}" wx:key="isbn13" id="{{item.isbn13}}" data-qty="{{item.qty}}" bindtap="goToDetailPage({{item}})">
<view class="book-list">
<view class="book-image">
<image src="{{item.image}}" mode="aspectFit"></image>
</view>
<view class="book-info">
<view class="book-info-style">
<view>书名:{{item.title}}</view>
<view>作者:{{item.author}}
</view>
<view>价格:{{item.price}}
</view>
<view>出版信息:{{item.publisher}}
</view>
<view>可借数量:{{item.qty}}
</view>
</view>
</view>
</view>
<view class="line"></view>
</view>
</view>
</template>
props = {
// 接收父组件传递的books数组
books: {},
};
然后,我们回到index页面,把两个组件引用进来就可以了,index页面完成!
<view class="main-wrapper">
<view class="search-bar-wrapper">
<component id="searchBar"></component> //searchbar组件
</view>
<view class="book-list-wrapper">
<component id="bookList" :books.sync="books"></component> //booklist组件
</view>
</view>
book detail页面接着我们再看看book detail 页面的结构。其实也是由3部分组成。最上方是booklist 组件,中间是book info组件,最下面是btn wrapper,如下图。大家可以发现,这个页面也是有book list的,那我们是否需要把代码copy过来的。No!我们只需要引用过来就好了,这个是组件化开发的好处之一,重用性高。
以下是book detail的页面结构,非常的简单。
<view class="main-wrapper">
<view class="book-list-wrapper">
<component id="bookList" :books.sync="book"></component>
</view>
<view class="book-detail-wrapper">
<component id="bookInfo" :books.sync="bookInfo" :height.sync="windowHeight"></component>
</view>
<view class="control-btn-wrapper">
<button type="primary" wx:if="{{bookInfo.qty > 0}}" bindtap="borrowBook"> 借阅 </button>
<button type="primary" wx:if="{{bookInfo.qty === 0}}"> 预约 </button>
<button type="primary" wx:if="{{showAddBook}}"> 录入 </button>
</view>
</view>
现在我们还差一个book info组件,now,一起来把它撸出来。
book info 组件其实book info组件的功能也很单纯。把“内容推荐”,“作者简介”和“目录”信息显示出来就可以。看以下页面结构:
// book info组件
<view class="book-info">
<scroll-view scroll-y="true" style="height:{{height}}px;" >
<view class="book-intro">
<text class="book-title">内容推荐</text>
<text class="book-msg">{{books.summary}}</text>
</view>
<view class="space-line-30"></view>
<view class="book-intro">
<text class="book-title">作者简介</text>
<text class="book-msg">{{books.author_intro}}</text>
</view>
<view class="space-line-30"></view>
<view class="book-intro">
<text class="book-title">目录</text>
<text class="book-msg">{{books.catalog}}</text>
</view>
</scroll-view>
</view>
这里使用到scroll view,小程序的scroll view是需要指定高度的,否则无法滚动。所以我们要动态计算中间那部分的高度。但是,组件本身是不知道它的容器的有多高的,所以需要父组件通过props告诉组件。
// book info 组件
props = {
books: {},//接收要显示的书本的信息
height:Number,//接收scroll view的高度
};
//book detail 组件
async onLoad(options) {
this.book = [];
this.book.push(JSON.parse(options.book));
this.bookInfo = JSON.parse(options.book);
if (this.windowHeight === 0) {
// 获取设备的高度,然后减去book list组件的高度,减去btn wrapper的高度再减去margin top 的高度
let res = await wx.getSystemInfo();
this.windowHeight = res.windowHeight - 66 - 136 - 10;
this.$apply();
}
}
原文链接:http://bbs.jointforce.com/topic/25380
发表评论
-
微信小程序之提高应用速度小技巧
2017-03-17 17:08 10631、提高页面加载速度 ... -
微信小程序支付(java后端)
2017-02-27 14:38 10351第一步 进入小程序,下单,请求下单支付,调用小程序登录AP ... -
高效编写微信小程序
2017-02-22 15:26 464微信小程序是一个工程,就和盖房子一样,打好了地基,才能保证后续 ... -
微信小程序开放部分模糊搜索,你怎么看?
2017-02-13 16:22 410今天看到一则新闻,微信小程序开始开放模糊搜索了,所以亲自测试了 ... -
微信小程序编写tabBar模板,map组件markers属性动态初始化
2017-02-07 16:04 2143一:编写tabBar模板 众所周知,微信小程序的tabBar ... -
目前为止小程序审核不通过原因整理汇总
2017-01-23 14:57 8901、小程序简介没有介绍小程序功能 2、类目与页面提供的内容不一 ... -
微信小程序form组件
2017-01-18 15:29 1056form 组件 表单 主要属性: 效果图: form. ... -
wafer-master小程序
2017-01-13 15:00 592wafer-master小程序 1、Centos 重启ngin ... -
信小程序参数二维码的8大使用场景
2017-01-12 15:13 692一、小程序参数二维码的8大使用场景 1 地推。 使用 ... -
小程序用户反馈-HotApp小程序统计仿微信聊天用户反馈组件...
2017-01-06 14:46 553用户反馈是小程序开发 ... -
小程序是微信最后的机会吗?它能做多大?
2017-01-05 15:46 523微信小程序又刷屏了。 ... -
获得session_key和openId(加解密、签名系列)
2016-12-26 15:57 10301:session_key和openId是什么?session ... -
5个关键词看小程序和App的UI设计异同
2016-12-23 14:20 541关键词一:友好礼貌对应于苹果:Less is more 苹果在 ... -
微信小程序正式发布官方视觉组件库,传递了怎样的信号?
2016-12-21 17:16 55212月16日,微信正式发布了WeUI.js动态视觉组件库。We ... -
微信小程序canvas组件简单运用之涂鸦
2016-12-19 14:17 514源码 index.html <view class ... -
《转》小程序之本地缓存
2016-12-16 15:07 923目前,微信给每个小程序提供了10M的本地缓存空间 有了本地缓存 ... -
深度加速:微信小程序将成为下一个风口
2016-12-09 16:58 3422016年11月3日,“小程 ... -
深度加速:微信小程序将成为下一个风口
2016-12-09 16:55 4402016年11月3日,“小程序 ...
相关推荐
微信小程序 图书管理系统 (源码)微信小程序 图书管理系统 (源码)微信小程序 图书管理系统 (源码)微信小程序 图书管理系统 (源码)微信小程序 图书管理系统 (源码)微信小程序 图书管理系统 (源码)微信小程序 图书管理...
微信小程序——图书管理系统(截图+源码).zip 微信小程序——图书管理系统(截图+源码).zip 微信小程序——图书管理系统(截图+源码).zip 微信小程序——图书管理系统(截图+源码).zip 微信小程序——图书管理...
基于微信小程序的图书管理系统小程序设计与实现源码(可做小程序毕业设计+含毕业论文)。基于微信小程序的图书管理系统小程序设计与实现源码(可做小程序毕业设计+含毕业论文)。基于微信小程序的图书管理系统小程序...
微信小程序源码 图书管理系统(学习版)微信小程序源码 图书管理系统(学习版)微信小程序源码 图书管理系统(学习版)微信小程序源码 图书管理系统(学习版)微信小程序源码 图书管理系统(学习版)微信小程序源码 图书管理...
微信小程序在移动网络时代越来越受到人 们的认可,其即扫即用的服务特性与图书馆系统移动服务,随时借阅的特 点非常适合,基于微信小程序的产品特性构建图书馆管理系统。提出了一种图书馆管理系统设计方案,该管理系统...
该项目是后台基于SSM框架,前台基于微信小程序的图书信息管理系统,可以实现对书籍信息的录入,全览,删除,修改单一属性,修改全部属性,以及根据属性进行查询或筛选,并进行了线上发布,可以作为个人的书籍记录...
wepy-books:微信小程序wepy版图书管理系统 wxYuHanStore:基于wepy开发的商城(微店)微信小程序 wepy-Jz:使用wepy框架开发的电商类小程序 cardiovascular-tracker:使用wepy框架开发的心血管健康助理小程序 we川大...
微信小程序的图书管理系统是一个基于微信平台的在线图书管理应用,旨在为用户提供便捷的图书查询、借阅和归还等服务。本项目采用了微信小程序开发技术,结合云服务器和数据库,实现了一个高效、易用的图书管理系统。...
《基于微信小程序的图书管理系统详解》 在当今数字化时代,图书管理系统的开发已经成为图书馆和私人藏书者不可或缺的一部分。本文将深入探讨一个基于微信小程序的图书管理系统,它利用了Java和小程序开发技术,实现...
程序亲测可用,程序开发软件:Eclipse 数据库:mysql api接口采用技术: SSM框架(SpringMVC + Spring + Mybatis)客户端开发工具:微信开发者工具基于微信小程序图书管理系统技术要点:1 此系统web端接口采用java...
《基于微信小程序的图书管理系统App设计源码解析》 微信小程序作为移动端轻量级的应用开发平台,因其无需安装、即扫即用的特性,近年来在移动应用领域得到了广泛应用。本项目是一个基于微信小程序的图书管理系统App...
微信小程序是一种轻量级的应用...构建一个完整的微信小程序图书管理系统,需要综合运用前端开发、后端开发、数据库管理和云计算等多方面技术,同时注重用户体验和系统稳定性,确保为用户提供便捷、高效的图书管理服务。
基于微信小程序的图书借阅系统实现了图书管理的智能化和用户借阅的便捷化,降低了图书馆的运营成本,提高了图书流通效率。随着移动互联网的普及,这种模式有望在更多图书馆中得到应用,为读者提供更优质的服务。 ...
【微信小程序图书馆座位预约系统设计与实现】 随着信息化时代的快速发展,图书馆作为知识的集散地,其服务方式也需要不断更新以满足用户日益增长的需求。传统的图书馆座位管理模式已无法适应现代高校师生的学习需求...
基于springboot+Mysql+微信小程序的图书捐赠管理系统.zip 基于springboot+Mysql+微信小程序的图书捐赠管理系统.zip 基于springboot+Mysql+微信小程序的图书捐赠管理系统.zip 基于springboot+Mysql+微信小程序的图书...
本项目是基于微信小程序的云开发实现的一个图书管理小程序,利用了微信提供的云端能力,包括数据库、存储和计算等服务。 云开发(Tencent Cloud Base,TCB)是微信小程序生态中的一项重要服务,它为开发者提供了...
基于微信小程序的图书借阅管理系统源码
【微信小程序源码——图书管理系统】是一个针对毕业设计的项目,它利用了微信小程序这一流行的移动端开发框架,为用户提供了一套完整的图书管理解决方案。在这个系统中,你可以实现对图书馆藏书的录入、查询、借阅、...