`
郭丶小川
  • 浏览: 33916 次
社区版块
存档分类
最新评论

微信小程序之图书管理系统(wepy版)

阅读更多
  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
分享到:
评论

相关推荐

    电动车上牌管理系统 SSM毕业设计 附带论文.zip

    电动车上牌管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl

    tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl

    【eclipse和idea两个版本运行源码】基于Java Swing +mysql 实现的网吧管理系统

    一、项目简介 本项目是一套基于Java Swing 开发的网吧管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 二、技术实现 ​后台技术:java swing ​数据库:MySQL ​数据库连接池:c3p0 三、系统主要功能 用户登录: 分为 普通用户和管理员 两种角色 菜单模块:上机,下机, 系统设置:管理员设置,会员设置,计费设置, 退出系统 管理模块:增加会员,删除会员,信息修改,信息查询 视图模块:主页视图,在线用户,统计视图, 统计报表模块:人数报表,收入报表 帮助模块:联系我们,关于系统 详见:https://blog.csdn.net/weixin_43860634/article/details/125247764

    pc-dmis软件脚本-输出Excel格式报告

    使用软件自带的basic脚本编辑制作的脚本 低版本软件无法输出Excel报告,可以通过脚本方式实现这一功能

    【java毕业设计】校园失物招领系统源码(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse

    基于java的网上电子书店h答辩PPT.pptx

    基于java的网上电子书店h答辩PPT.pptx

    基于微信小程序的微信小程序校园失物招领答辩PPT.pptx

    基于微信小程序的微信小程序校园失物招领答辩PPT.pptx

    基于java的基于Java的学生综合测评管理系统答辩PPT.pptx

    基于java的基于Java的学生综合测评管理系统答辩PPT.pptx

    pandas-2.1.4-cp39-cp39-win_amd64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    判断题 - 题目列表 - 图-练习题集飒飒阿萨

    springboot体育器材管理系统(附源码+数据库)71175

    管理员功能: 用户管理:管理员可以管理用户账户,包括审核新注册用户、禁用违规用户、重置密码等操作。 器材管理:管理员可以管理器材的信息,包括添加新器材、编辑器材详情、设定器材规则和限制等。 器材预约与借还管理:管理员可以处理用户的器材预约请求,确认或调整预约时间,并记录借还操作。 库存管理:管理员可以监控器材库存情况,及时补充不足的器材并处理损坏或报废的器材。 数据统计与报表:管理员可以分析系统的使用情况和借还记录,生成数据统计报表以了解器材使用情况和借还频率等。 系统设置与维护:管理员可以进行系统设置,包括配置器材规则、设定可用时间段、备份数据、优化系统性能等。 消息通知与提醒:管理员可以向用户发送消息通知,如器材预约成功、归还提醒、系统更新通知等。

    Jira插件安装包Dynamic-forms

    Jira插件安装包Dynamic-forms

    pandas-2.1.4-cp311-cp311-win_amd64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    少儿图形化scratch编程作品源码集100个

    Scratch是一款由麻省理工学院(MIT)的“终身幼儿园团队”开发的图形化编程工具,专为儿童设计,旨在帮助他们学习编程思维和逻辑能力。

    基于java的学生就业管理系统答辩PPT.pptx

    基于java的学生就业管理系统答辩PPT.pptx

    课设毕设基于SpringBoot+Vue的旅游门票信息系统设计与实现源码可运行.zip

    本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac

    大学志愿填报系统.zip

    随着社会对志愿服务活动的日益重视,各大高校也纷纷参与到志愿服务的行列中。为了更好地管理和记录志愿者活动,提高志愿服务的质量和效率,我们开发了这款大学志愿服务系统。 该系统主要包括多个功能模块,如信息管理、活动管理、学生管理等。信息管理模块允许学校管理员录入、修改和删除学校的基本信息,包括学校账号、名称、联系电话、地址、特色以及办学理念等,确保信息的准确性和完整性。活动管理模块则用于记录和管理志愿者活动的相关信息,包括活动的名称、时间、地点、参与人员等,方便志愿者进行报名和签到。 此外,系统还提供了学生管理模块,用于记录学生的志愿服务经历和表现,为学生参与志愿服务提供便利。同时,系统还支持照片上传和展示功能,通过展示志愿者活动的照片,让更多人了解和关注志愿服务事业。 整个系统界面简洁明了,操作便捷,功能强大。通过使用该系统,高校可以更加高效地管理和记录志愿者活动,提高志愿服务的整体水平。同时,该系统也为广大志愿者提供了一个展示自我、服务社会的平台。

    turbo均衡算法研究

    turbo均衡算法研究

    静态编译的Qt6.7.3(win10+MSVC2022+openssl+静态运行时) part01

    https://blog.csdn.net/aggs1990/article/details/143491823 静态编译的Qt6.7.3(win10+MSVC2022+openssl+静态运行时) 压缩包比较大,这是第一部分

    tornado-6.4b1-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4b1-cp38-abi3-musllinux_1_1_i686.whl

Global site tag (gtag.js) - Google Analytics