在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

微信小程序可開發案例:豆瓣圖書小程序

微信小程序可開發案例:豆瓣圖書小程序

更新時間:2025-10-12 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
最近微信小程序被炒得很火熱,本人也抱著試一試的態度下載了微信web開發者工具,開發工具比較簡潔,功能相對比較少,個性化設置也沒有。了解完開發工具之后,順便看了一下小程序的官方開發文檔,大概了解了小程序的開發流程和一些常用的API。

了解了小程序之后,自己就有了想要做一個小demo的沖動,雖然自己對小程序還沒有做過很多實踐,只是在官方例子上徘徊,但是還是想做出點小東西。既然要做一個demo,自然需要到數據,自己有又不想獨自搭建服務端,所以在網上搜索可以用來提供測試數據的免費api,最后我選擇了豆瓣圖書。豆瓣圖書提供的api功能比較少,加上不開放appkey申請,所以無法操作用戶數據。只能做點簡單的圖書查詢和圖書詳細信息展示,這個demo只有兩個頁面,非常之簡單。

豆瓣圖書API

demo中用到的豆瓣圖書api只有兩個,一個是圖書搜索,另一個是獲取圖書詳情。

搜索圖書

參數意義備注
q查詢關鍵字q和tag必傳其一
tag查詢的tagq和tag必傳其一
start取結果的offset默認為0
count取結果的條數默認為20,最大為100

返回status=200

{
  "start": 0,
  "count": 10,
  "total": 30,
  "books" : [Book, ...]
}

獲取圖書詳情

GET http://www.php.cn/:id

參數意義
:id圖書id

以下是具體圖書的詳情信息,部分demo中用不到的信息省略

{
    "id":"1003078",
    "title":"小王子",
    "alt":"https:\/\/book.douban.com\/subject\/1003078\/",
    "image":"https://img3.doubanio.com\/mpic\/s1001902.jpg",
    "author":[
        "(法)圣埃克蘇佩里"
        ],
    "publisher":"中國友誼出版公司",
    "pubdate":"2000-9-1",
    "rating":{"max":10,"numRaters":9438,"average":"9.1","min":0},
    "author_intro":"圣?颂K佩里(1900-1944)1900年,瑪雅·戴斯特萊姆......",
    "catalog":"序言:法蘭西玫瑰\n小王子\n圣?颂K佩里年表\n"
}

Demo編寫

創建項目

項目取名為DouBanBookApp,項目的結構小程序默認的結構一樣

DouBanBookApp
    pages
        index 首頁
            index.js
            index.wxml
            index.wxss
        detail 詳情頁
            detail.js
            detail.wxml
            detail.wxss
    requests 
        api.js API地址
        request.js 網絡請求
    utils
        util.js 工具
    app.js
    app.json
    app.wxss

應用的主調色參考了豆瓣app的色調,采用了偏綠色。

首頁

首頁頂部展示搜索輸入框,用戶輸入圖書名稱,點擊搜索按鈕,展示圖書列表。圖書可能會很多,不能一下子全部展示,需要用到分頁,app上最常見的列表分頁就是上拉加載模式,根據小程序提供的組件中,找到了一個比較符合場景的scroll-view組件,這個組件有一個上拉到底部自動觸發的bindscrolltolower事件。

先制作出界面的靜態效果,之后再整合API,由于本人對界面設計不敏感,所以隨便弄了一個粗糙的布局,看得過去就行了,嘿嘿~~

index.wxml


<view class="search-container">
  <input type="text" placeholder="輸入書名搜索"></input><icon type="search" size="20"/></view><scroll-view scroll-y="true" style="width:100%;position:relative;top:40px;height:200px">

    <view style="text-align:center;padding-top:50rpx;">
      <icon type="cancel" color="red" size="40" />
      <view><text>沒有找到相關圖書</text></view>
    </view>

    <view style="text-align:center;padding-top:50rpx;">
      <icon type="search" size="60" />
      <view><text>豆瓣圖書</text></view>
    </view>
    
    <view class="header">
      <text>圖書 10本圖書</text>
    </view>

    <view class="common-list">

    <view class="list-item">
      <view class="index-list-item">
        <view class="cover">
          <image class="cover-img" src="images/demo.png"></image>
        </view>
        <view class="content">
          <view class="title">圖書標圖</view>
          <text class="desc">9.0/oopsguy/2016-07-08</text>
        </view>
      </view>
    </view>

    </view>

    <view class="refresh-footer">
      <icon type="waiting" size="30" color="reed"  />
    </view></scroll-view>


index.wxss


page {
  background: #F2F1EE;}/*seach*/.search-container {
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  background-color: #42BD56;
  color: #FFF;
  height: 40px;
  padding: 0 10rpx;
  z-index: 100;}.search-container input {
  background: #FFF;
  color: #AAA;
  margin-top: 5px;
  padding: 5px 10rpx;
  height: 20px;
  border-radius: 8rpx;}.search-container icon {
  position: absolute;
  top: 10px;
  right: 20rpx;}/*header*/.header {
  padding: 20rpx 30rpx;}.header text {
  color: #A6A6A6;}/*common list*/.list-item {
  position: relative;
  overflow: hidden}/*index list*/.index-list-item {
  background: #FFF;
  padding: 15rpx 30rpx;
  overflow: hidden;}.index-list-item::active {
  background: #EEE;}.index-list-item .cover {
  float: left;
  width: 120rpx;
  height: 160rpx;
  overflow: hidden}.index-list-item .cover image.cover-img {
  width: 120rpx;
  height: 160rpx;}.index-list-item .content {
  margin-left: 140rpx;}.index-list-item .title {
  display: inline-block;
  height: 90rpx;
  padding-top: 20rpx;
  overflow: hidden;}.index-list-item .desc  {
  display: block;
  font-size: 30rpx;
  padding-top: 10rpx;
  color: #AAA;
  white-space:nowrap;
  overflow: hidden;
  text-overflow: ellipsis;}.refresh-footer {
  text-align: center;
  padding: 10rpx 0;}


圖書詳細頁面

圖書詳細頁面就是展示具體的圖書信息,通用首頁穿過了的圖書id來獲取圖書信息之后在展示出來,獲取的過程中可能有延遲,需要一個加載效果來過渡。

detail.wxml

<view>
    <view class="cover-container">
        <image src="images/demo.png"></image>
    </view>

    <view class="book-meta">
        <view class="meta-info">
            <text class="book-title">圖書標題</text>
            <text class="other-meta">作者:作者名稱</text>
            <text class="other-meta">出版社:xxx出版社</text>
            <text class="other-meta">出版日期:2010-05-07</text>
        </view>
        <view class="range">
            <text class="score">0</text>
            <text class="viewers">0</text>
        </view>
    </view>

    <view class="book-intro">
        <view class="intro-header"><text>簡介</text></view>
        <text class="intro-content">
            這是圖書簡介        </text>
    </view>

    <view class="book-intro">
        <view class="intro-header"><text>作者</text></view>
        <text class="intro-content">
            這是作者簡介        </text>
    </view></view><loading>
    加載中...</loading>

detail.wxss


page {
    background: #EEE;}.cover-container {
    background: #42BD56;
    text-align: center;
    padding: 50rpx 0;}.cover-container image {
    display: inline-block;
    width: 300rpx;
    height: 400rpx;}.book-meta {
    position: relative;
    padding: 20rpx;
    overflow: hidden;}.book-meta .range {
    position: absolute;
    top: 30rpx;
    right: 20rpx;
    width: 180rpx;
    background: #FFF;
    padding: 20rpx 10rpx;
    text-align: center;
    box-shadow: 2px 2px 10px #CCC;}.book-meta .meta-info {
    margin-right: 200rpx;}.meta-info text {
    display: block}.book-title {
    font-weight: bold;
    font-size: 50rpx;}.other-meta {
    padding-top: 10rpx;
    color: #888;
    font-size: 30rpx;}.range text {
    display: block;}.range .score {
    font-size: 50rpx;
    font-weight: bold;}.range .starts {
    font-size: 40rpx;}.range .viewers {
    font-size: 30rpx;}.book-intro {
    padding: 20rpx;
    font-size: 40rpx;}.book-intro .intro-header {
    color: #888}.book-intro .intro-content {
    font-size: 35rpx;
    line-height: 45rpx;}


做好了首頁和詳細頁的靜態頁面,接下來就是通過網絡請求api來獲取數據,并顯示到頁面上來。

網絡請求和數據處理

為了更好的管理api,我把api專門放到了一個單獨的api.js文件中

api.js


const API_BASE = "https://api.douban.com/v2/book";module.exports = {
  API_BOOK_SEARCH: API_BASE + "/search",
  API_BOOK_DETAIL: API_BASE + "/:id"}


有些經常用到的工具函數放到了util.js中

util.js

function isFunction( obj ) {
  return typeof obj === 'function';
}

module.exports = {
  isFunction: isFunction
}

微信小程序提供了一個用于網絡請求的api:wx.request(OBJECT),具體的參數跟jquery的ajax方法差不多,為了方便調用,我把網絡請求放到了request.js中

request.js


var api = require('./api.js');var utils = require('../utils/util.js');/** * 網路請求 */function request(url, data, successCb, errorCb, completeCb) {
    wx.request({
        url: url,
        method: 'GET',
        data: data,
        success: function(res) {
            utils.isFunction(successCb) && successCb(res.data);
        },
        error: function() {
            utils.isFunction(errorCb) && errorCb();
        },
        complete: function() {
            utils.isFunction(completeCb) && completeCb();
        }
    });}/** * 搜索圖書 */function requestSearchBook(data, successCb, errorCb, completeCb) {
    request(api.API_BOOK_SEARCH, data, successCb, errorCb, completeCb);}/** * 獲取圖書詳細信息 */function requestBookDokDetail(id, data, successCb, errorCb, completeCb) {
    request(api.API_BOOK_DETAIL.replace(':id', id), data, successCb, errorCb, completeCb);}module.exports = {
  requestSearchBook: requestSearchBook,
  requestBookDokDetail: requestBookDokDetail}


首頁有圖書搜索和列表展示,上拉加載的效果。微信小程序中沒有了DOM操作的概念,一切的界面元素的改變都要通過數據變化來改變,所以需要在js中的Page中的data中聲明很多數據成員。

用戶在輸入數據時,輸入框的input綁定了searchInputEvent事件,就回捕獲到輸入的數據,把輸入的數據更新的data中的searchKey中。


searchInputEvent: function( e ) {
    this.setData( { searchKey: e.detail.value });}


當點擊搜索按鈕是,觸發tap事件,其綁定了searchClickEvent


searchClickEvent: function( e ) {
    if( !this.data.searchKey )      return;
    this.setData( { pageIndex: 0, pageData: [] });
    requestData.call( this );}


requestData中封裝了請求圖書列表的方法


/** * 請求圖書信息 */function requestData() {
  var _this = this;
  var q = this.data.searchKey;
  var start = this.data.pageIndex;

  this.setData( { loadingMore: true, isInit: false });
  updateRefreshBall.call( this );

  requests.requestSearchBook( { q: q, start: start }, ( data ) => {
    if( data.total == 0 ) {
      //沒有記錄
      _this.setData( { totalRecord: 0 });
    } else {
      _this.setData( {
        pageData: _this.data.pageData.concat( data.books ),
        pageIndex: start + 1,
        totalRecord: data.total
      });
    }
  }, () => {
    _this.setData( { totalRecord: 0 });
  }, () => {
    _this.setData( { loadingMore: false });
  });}


上拉加載的效果是一個小球不停的變換顏色,需要一個顏色列表


//刷新動態球顏色var iconColor = [  '#353535', '#888888'];


然后用一個定時器來動態改變小球圖標的顏色


/** * 刷新上拉加載效果變色球 */function updateRefreshBall() {
  var cIndex = 0;
  var _this = this;
  var timer = setInterval( function() {
    if( !_this.data[ 'loadingMore' ] ) {
      clearInterval( timer );
    }
    if( cIndex >= iconColor.length )
      cIndex = 0;
    _this.setData( { footerIconColor: iconColor[ cIndex++ ] });
  }, 100 );}


詳細頁面的顯示需要到首頁點擊了具體圖書的id,所以需要首頁傳值過來,這里用到了小程序土工的wx.navigateTo方法,給其指定的url參數后面帶以查詢字符串格式形式的參數,被跳轉的頁面就會在onLoad方法中得到值。


//跳轉到詳細頁面toDetailPage: function( e ) {
    var bid = e.currentTarget.dataset.bid; //圖書id [data-bid]
    wx.navigateTo( {
      url: '../detail/detail?id=' + bid    });}


detail.js中接受參數


onLoad: function( option ) {
    this.setData({
      id: option.id
    });}


其實小程序的頁面制作跟平時的html和css差不多,只是頁面中不能用傳統的html標簽,而是改用了小程序提供的自定義標簽,小程序對css的支持也有限制,注意哪些寫法不兼容也差不多懂了。操作頁面變化是通過數據變化來表現出來的,這點有點像react和vue。以上的demo用到的知識點并不多,主要是頁面的數據綁定、事件綁定、模版知識和網絡請求等相關api。仔細看看文檔也差不多可以做出一個小例子。
qi

最終效果圖

總體來說,Demo很簡單,只有兩個頁面,界面也是丑丑的T_T,算是我入門小程序的第一課吧。

DouBanBookApp首頁

DouBanBookApp列表

DouBanBookApp詳情

更多微信小程序可開發實例請關注php中文網!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • www.com毛片| 黄色三级中文字幕| 成人手机在线播放| 狠狠操精品视频| 无码人妻丰满熟妇区96| 午夜啪啪福利视频| 欧美日韩一道本| www国产精品内射老熟女| 69精品丰满人妻无码视频a片| 亚洲男人天堂2021| 色免费在线视频| 91高清国产视频| 国产成人免费高清视频| 美国av在线播放| 老汉色影院首页| 国产极品尤物在线| 国产成人a亚洲精v品无码| 午夜精品久久久久久久99热影院| 91手机视频在线| 久久综合伊人77777麻豆最新章节| 欧美三级午夜理伦三级富婆| 国产三级国产精品国产专区50| 免费黄色特级片| 国产二区视频在线| 在线观看av网页| 91 视频免费观看| 国产视频一区二区三区在线播放| 国产xxxxx在线观看| 超碰成人在线播放| 免费cad大片在线观看| 成人网站免费观看入口| 中文久久久久久| 91免费视频黄| 免费黄色一级网站| 女性女同性aⅴ免费观女性恋| 人妻有码中文字幕| 一级淫片在线观看| 日韩av高清在线看片| 欧美性猛交xxxx乱大交91| 欧美黑人在线观看| 污污的网站免费| 日韩av黄色网址| 亚洲黄色网址在线观看| 成人在线看视频| 亚洲国产一二三精品无码 | 少妇一级淫免费播放| 91免费国产精品| 中文字幕一区二区三区四| 国产va亚洲va在线va| 视色视频在线观看| 黄色片视频在线播放| 三级在线免费观看| 日韩a一级欧美一级| 可以免费观看av毛片| 男女猛烈激情xx00免费视频| av中文字幕网址| 欧美女同在线观看| 97xxxxx| 国产二级片在线观看| 六月婷婷激情网| 好吊色这里只有精品| 小泽玛利亚视频在线观看| 免费成人午夜视频| 女人帮男人橹视频播放| 日韩专区第三页| 中文字幕 日韩 欧美| 亚洲成熟丰满熟妇高潮xxxxx| 青青草成人免费在线视频| 成人一区二区av| mm131午夜| 91免费黄视频| 免费国产a级片| 欧美一级片中文字幕| 国产福利一区视频| 亚洲天堂av线| 欧美成人福利在线观看| 亚洲免费999| 视频一区二区视频| 影音先锋成人资源网站| 青青草视频国产| 欧美国产亚洲一区| 中文字幕有码av| 特级黄色录像片| 国产原创中文在线观看 | 妞干网在线观看视频| 男人日女人逼逼| 青青青国产在线视频| 亚洲图片 自拍偷拍| 日本a在线天堂| 国产aaa一级片| 亚洲18在线看污www麻豆| dy888午夜| 精品一区二区中文字幕| 九色91popny| 青草网在线观看| av五月天在线| www.亚洲成人网| 91女神在线观看| 成人午夜视频在线观看免费| 日本新janpanese乱熟| www.久久com| 自拍偷拍 国产| 久久精品无码中文字幕| 91国产精品视频在线观看| 国产片侵犯亲女视频播放| 日韩精品免费播放| 美女黄色免费看| 五月六月丁香婷婷| 免费国产成人av| 欧美 国产 综合| 亚洲乱码日产精品bd在线观看| 天天操天天摸天天爽| 成年人看的毛片| 日韩欧美理论片| 三级a在线观看| 黄色片一级视频| 亚洲人成无码网站久久99热国产 | 无码人妻精品一区二区三区在线| 国产精品又粗又长| 欧美一级小视频| 欧美亚洲日本在线观看| 天堂…中文在线最新版在线| 午夜视频在线网站| 国产精品动漫网站| 无码 制服 丝袜 国产 另类| 99re6在线观看| www.夜夜爽| 日本在线一二三区| 日本成人中文字幕在线| 国产91对白刺激露脸在线观看| 大伊香蕉精品视频在线| 男女爱爱视频网站| 日本美女爱爱视频| 欧美日韩精品区别| 午夜xxxxx| 亚洲自拍偷拍一区二区三区| www.久久av.com| 国产免费色视频| 激情五月五月婷婷| 超碰超碰超碰超碰超碰| av磁力番号网| www.国产在线视频| 乱妇乱女熟妇熟女网站| 国产毛片视频网站| 日本少妇高潮喷水视频| 亚洲成熟丰满熟妇高潮xxxxx| 亚洲色欲综合一区二区三区| 国语对白做受xxxxx在线中国 | 中文字幕亚洲乱码| 自拍一级黄色片| 黄色片免费在线观看视频| 可以看毛片的网址| 免费激情视频在线观看| 日本www.色| 日本a在线天堂| 无码人妻h动漫| 中文字幕黄色大片| 日韩不卡视频一区二区| 国产免费一区二区视频| 91传媒久久久| 99精品视频国产| 青青草原av在线播放| 在线一区二区不卡| 欧美日韩激情四射| av污在线观看| www.好吊操| 九九热精品国产| 97超碰国产精品| 永久免费黄色片| 日韩黄色片视频| 四虎4hu永久免费入口| 欧美亚洲另类色图| 99久re热视频精品98| 美女黄色片视频| 成人在线免费观看视频网站| 99视频免费播放| 人妻av无码专区| www,av在线| 蜜桃免费在线视频| 欧美s码亚洲码精品m码| 国产一级片中文字幕| 日韩精品一区二区三区久久| 免费在线精品视频| 不卡的在线视频| 欧美婷婷精品激情| 久久久久免费精品| 精品国产一二三四区| 欧美日韩午夜爽爽| 国产又大又长又粗又黄| 黄色免费网址大全| 男人亚洲天堂网| 青青视频在线播放| 男人操女人免费软件| 你真棒插曲来救救我在线观看| 天天做天天爱天天高潮| 午夜一级免费视频| 亚洲在线观看网站| 亚洲黄色网址在线观看| 手机精品视频在线| 日本丰满大乳奶|