微信小程序实战之百思不得姐精简版

原文:微信小程序实战之百思不得姐精简版

微信小程序基本组件和API已撸完,总归要回到正题的,花了大半天时间做了个精简版的百思不得姐,包括段子,图片,音频,视频,四个模块。这篇就带着大家简述下这个小的APP,源码会放到GitHub上欢迎star。

地址: https://github.com/shuncaigao/BS

项目中我能学到什么?

  • tabbar使用方式
  • 网络调用真实接口
  • loading使用
  • scroll-view实现下拉刷新上拉加载
  • image组件对图片的处理,
  • 音乐和视频组件的使用
  • 跳转传值使用
  • 等等等。。。。

app.json全局配置文件

{
  "pages":[
    "pages/word/word",
    "pages/image/image",
    "pages/voice/voice",
    "pages/video/video",
    "pages/detail/detail"
  ],
  "tabBar": {
    "color": "#a9b7b7",
    "selectedColor": "#eb4f38",
    "borderStyle": "white",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "pages/word/word",
        "text": "段子",
        "iconPath": "image/wordN.png",
        "selectedIconPath": "image/wordS.png"
      },
      {
        "pagePath": "pages/image/image",
        "text": "图片",
        "iconPath": "image/imageN.png",
        "selectedIconPath": "image/imageS.png"
      },
      {
        "pagePath": "pages/voice/voice",
        "text": "声音",
        "iconPath": "image/voiceN.png",
        "selectedIconPath": "image/voiceS.png"
      },
      {
        "pagePath": "pages/video/video",
        "text": "视频",
        "iconPath": "image/videoN.png",
        "selectedIconPath": "image/videoS.png"
      }

    ]
  },
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#eb4f38",
    "navigationBarTextStyle":"white"
  }
}

这里我们只要配置下程序全局属性,每个页面需要在pags属性中引入,有时候tabbar不显示有可能是因为这个,tabbar底部导航Item分为四个就是list里面的,这里主要配置选中未选中颜色背景色及每个底部选项页面页面引入和图片引入。window 属性主要配置窗体整体的颜色文字颜色和背景色,这里的window属性会被每个页面的window属性给覆盖。

app.wxss

/*整体view样式*/
.containsView{
  padding: 15rpx 15rpx 15rpx 15rpx;
  margin-top: 15rpx;
  margin-bottom: 15rpx;
  background-color: white;
}
/*头部整体样式*/
.topContainsView{
  display: flex;
  flex-direction: row;
  align-items: center;
  margin-bottom: 18rpx;
}

/**
 * 头像样式
*/
.profileImage{
  width: 60rpx;
  height: 60rpx;
  border-radius: 30rpx;
}

/*头部显示名字和时间整体样式*/
.topRightView{
  margin-left: 15rpx;
  display: flex;
  flex-direction: column;
}
/*用户名称样式*/
.topRightName{
  font-size: 18rpx;
}
/*时间样式*/
.topRightTime{
  font-size: 14rpx;
  color: #b8b2b2;
  margin-top: 10rpx;
}

/*因为中间部分不一样不放在整体样式中*/

/*底部view整体样式*/
.bottomView{
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
}
/*每个Item样式*/
.bottomItemView{
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  margin-top: 18rpx;
  padding-left: 10rpx;
  padding-right: 10rpx;
}
/*Item样式中的图标样式 顶 踩 分享 评论*/
.bottomItemImage{
  width: 45rpx;
  height: 45rpx;
}
/*Item中的文字样式  顶 踩 分享 评论*/
.bottomItemText{
  font-size: 15rpx;
  color: #b8b2b2;
  margin-left: 10rpx;
  margin-top: 8rpx;
}

/*分割线样式*/
.divLine{
  background: #f3f3f3;
  width: 100%;
  height: 15rpx;
}

app.wxss我将四个模块分为三个部分 头部,内容区域, 底部因为每个页面头部,底部样式都一样而中间部分不一样所以我把1,3抽到全局中,注释比较清晰

段子模块

word.wxml

<loading hidden="{{loadingHidden}}">正在加载...</loading>
<scroll-view scroll-y="true" bindscrolltoupper="bindscrolltoupper" bindscrolltolower="bindscrolltolower" style="height: 100%">
  <block wx:for-items="{{list}}">
    <!-- 分割线 -->
    <view class="divLine"></view>
    <!-- 整体item样式 -->
    <view class="containsView">
      <view class="topContainsView">
        <image class="profileImage" src="{{item.profile_image}}" />
        <view class="topRightView">
          <text class="topRightName">{{item.name}}</text>
          <text class="topRightTime">{{item.passtime}}</text>
        </view>
      </view>
      <!-- 中间内容 -->
      <text class="centerContent">{{item.text}}</text>
      <!-- 底部view样式 -->
      <view class="bottomView">
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/ding.png" />
          <text class="bottomItemText">{{item.ding}}</text>
        </view>
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/cai.png" />
          <text class="bottomItemText">{{item.cai}}</text>
        </view>
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/share.png" />
          <text class="bottomItemText">{{item.repost}}</text>
        </view>
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/comment.png" />
          <text class="bottomItemText">{{item.comment}}</text>
        </view>
      </view>
    </view>
  </block>
</scroll-view>

外层我们用scroll-view包裹以实现加载更多和上拉刷新 bindscrolltoupper=”bindscrolltoupper” 这个属性当滑动到顶部会调用这个方法bindscrolltolower=”bindscrolltolower”这个则滑到底部会调用,起始这里还可以将头部和底部布局抽出来通过引入方式使用,就不用四个页面都写了,自己可以弄下

word.js

Page({
  data: {
    list: [],
    maxtime: ‘‘,
    loadingHidden: false
  },
  onLoad: function (options) {
    // 页面初始化 options为页面跳转所带来的参数
    //加载最新
    this.requestData(‘newlist‘);
  },

  /**
   * 上拉刷新
   */
  bindscrolltoupper: function () {
    //加载最新
    // this.requestData(‘newlist‘);
  },

  /**
   * 加载更多
   */
  bindscrolltolower: function () {
    console.log(‘到底部‘)
    //加载更多
    this.requestData(‘list‘);
  },

  /**
   * 请求数据
   */
  requestData: function (a) {
    var that = this;
    console.log(that.data.maxtime)
    wx.request({
      url: ‘http://api.budejie.com/api/api_open.php‘,
      data: {
        a: a,
        c: ‘data‘,
        maxtime: that.data.maxtime,
        type: ‘29‘,
      },
      method: ‘GET‘,
      success: function (res) {
        console.log(res)
        console.log(‘上一页‘, that.data.list)
        that.setData({
          // 拼接数组
          list: that.data.list.concat(res.data.list),
          loadingHidden: true,
          maxtime: res.data.info.maxtime
        })

      }
    })
  },
  onReady: function () {
    // 页面渲染完成
  },
  onShow: function () {
    // 页面显示
  },
  onHide: function () {
    // 页面隐藏
  },
  onUnload: function () {
    // 页面关闭
  }
})

这里通过requestData方法加载数据,这个方法接受个参数,就是通过这个参数加载最新还是更多,通过maxtime这个参数去加载下一页,上一页的maxtime作为加载下一页的条件, 加载下一页数据我们通过concat方法将数组进行拼接,并改变加载状态loading。word.wxml和word.json中一个设置内容字体大小,一个设置导航条字,就不贴了。

图片模块

image.wxml

<loading hidden="{{loadingHidden}}">正在加载...</loading>
<scroll-view scroll-y="true" bindscrolltolower="bindscrolltolower" style="height: 100%">
  <block wx:for-items="{{list}}">
    <!-- 分割线 -->
    <view class="divLine"></view>
    <!-- 整体item样式 -->
    <view class="containsView">
      <view class="topContainsView">
        <image class="profileImage" src="{{item.profile_image}}" />
        <view class="topRightView">
          <text class="topRightName">{{item.name}}</text>
          <text class="topRightTime">{{item.passtime}}</text>
        </view>
      </view>
      <text style="font-size: 30rpx">{{item.text}}</text>
      <!-- 当时gif图 -->
      <view wx:if="{{item.is_gif != 0}}" style="position: relative;">
        <image class="centerContent" src="{{item.cdn_img}}" mode="aspectFill" />
      </view>
      <!-- 普通大图 可点击查看全部图片 -->
      <view data-url="{{item.cdn_img}}" data-height="{{item.height}}" data-width="{{item.width}}"
            bindtap="lookBigPicture" wx:elif="{{item.is_gif == 0}}" style="position: relative;">
        <!-- 图片资源 -->
        <image class="centerContent" src="{{item.cdn_img}}" mode="aspectFill" />
        <!-- 图片上浮动的点击查看详情图片view -->
        <view class="flexView">
          <image src="../../image/seeBigPicture.png" style="width: 60rpx; height: 60rpx;" />
          <text class="flexText">点击查看全图</text>
        </view>
      </view>
      <!-- 底部view样式 -->
      <view class="bottomView">
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/ding.png" />
          <text class="bottomItemText">{{item.ding}}</text>
        </view>
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/cai.png" />
          <text class="bottomItemText">{{item.cai}}</text>
        </view>
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/share.png" />
          <text class="bottomItemText">{{item.repost}}</text>
        </view>
        <view class="bottomItemView">
          <image class="bottomItemImage" src="../../image/comment.png" />
          <text class="bottomItemText">{{item.comment}}</text>
        </view>
      </view>
    </view>
  </block>
</scroll-view>

这里主要看中间部分我们通过是否是gif来区分处理图片,不是gif可以点击查看大图,这里有个view悬浮效果,结合界面和image.wxss看

image.wxss

/*中间文字样式*/
.centerContent{
  margin-top: 20rpx;
  width: 100%;
  height: 600rpx;

}
/*中间浮动文字样式*/
.flexView{
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 80rpx;
position: absolute;
z-index: 2;
top: 540rpx;
background: #000000;
opacity: 0.6

}
/*浮动文字*/
.flexText{
  color: white;
  font-size: 35rpx;
}

image.js

var detail = ‘../detail/detail‘
Page({
  data: {
    list: [],
    maxtime: ‘‘,
    loadingHidden: false
  },
  onLoad: function (options) {
    // 页面初始化 options为页面跳转所带来的参数
    this.requestData(‘newlist‘);

  },
  /**
   * 滚动到底部时加载下一页
   */
  bindscrolltolower: function () {
    console.log(‘到底部‘)
    this.requestData(‘list‘);

  },

  /**
   * 加载数据
   */
  requestData: function (a) {
    var that = this;
    wx.request({
      url: ‘http://api.budejie.com/api/api_open.php‘,
      data: {
        a: a,
        c: ‘data‘,
        // 上一页的maxtime作为加载下一页的条件,
        maxtime: this.data.maxtime,
        type: ‘10‘,
      },
      method: ‘GET‘,
      success: function (res) {
        console.log(res)
        console.log(‘上一页‘, that.datalist)
        that.setData({
          // 拼接数组
          list: that.data.list.concat(res.data.list),
          loadingHidden: true,
          maxtime: res.data.info.maxtime
        })

      }
    })
  },
  /**
   * 查看大图
   */
  lookBigPicture: function (e) {
    console.log(e);
    console.log(e.currentTarget.id)
    //图片url 对应wxml中data-url="{{item.url}}"
    var url = e.currentTarget.dataset.url;
    //获取图片高度 对应wxml中data-height="{{item.height}}"
    var height = e.currentTarget.dataset.height;
    //获取图片高度 对应wxml中data-width="{{item.width}}"
    var width = e.currentTarget.dataset.width;
    // 传参方式向GET请求
    wx.navigateTo({
      url: detail + ‘?‘ + ‘url=‘ + url + "&height=" + height + "&width=" + width,
      success: function (res) {
        console.log(res)
      },
      fail: function (err) {
        console.log(err)
      },
    })
  },
  onReady: function () {
    // 页面渲染完成
  },
  onShow: function () {
    // 页面显示
  },
  onHide: function () {
    // 页面隐藏
  },
  onUnload: function () {
    // 页面关闭
  }
})

这里主要看lookBigPicture方法 view data-url=”{{item.cdn_img}}” data-height=”{{item.height}}” data-width=”{{item.width}}”会在逻辑代码中装换成.语法使用 var url = e.currentTarget.dataset.url; 传值调转则向GET发送请求一样按照格式来就行了

音频和视频模块大致雷同看代码去吧!!!

地址: https://github.com/shuncaigao/BS 欢迎star

时间: 2024-12-20 20:00:38

微信小程序实战之百思不得姐精简版的相关文章

微信小程序实战教程

微信小程序实战教程(第1篇) 课程观看地址:http://www.xuetuwuyou.com/course/154 课程出自学途无忧网:http://www.xuetuwuyou.com 课时1:1.开篇 课时2:2.文档概览  课时3:3.认识小程序  课时4:4.小程序设计指南 课时5:5.响应的数据绑定  课时6:6.微信小程序游戏的演示  课时7:7.基础组件 课时8:8.view 课时9:9.文件结构  课时10:10.配置  课时11:11.逻辑层  课时12:12.注册小程序 

微信小程序之购物数量加减 —— 微信小程序实战商城系列(3)

我们在购买宝贝的时候,购物的数量,经常是我们需要使用的,如下所示: 在宝贝详情页里: 在购物车里: 现在就为大家介绍这个小组件,在小程序中,该如何去写 下图为本项目的图: wxml: <!-- 主容器 --> <view class="stepper"> <!-- 减号 --> <text class="{{minusStatus}}" bindtap="bindMinus">-</text&

微信小程序实战之天气预报

原文:微信小程序实战之天气预报 这个案例是仿UC中天气界面做的中间也有点出入,预留了显示当前城市名字和刷新图标的位置,自己可以写下,也可以添加搜索城市.值得注意的是100%这个设置好像已经不好使了,可以通过获取设备的高度通过数据绑定设置高度.地址:https://github.com/shuncaigao/Weather 界面主要分为四部分: 第一部分 这里是预留的一块可以自行添加补充下 <view class="newTopView"> <!--左边添加当前城市名字

微信小程序客服系统手机版五大功能介绍

很多朋友小程序上线后,客服消息这块一直没得到解决.小程序客服消息只能在PC端回复,是让众多小程序运营商及商家头疼的问题,因为一个再牛逼的客服,也不可能随时随地都抱着电脑,这就导致很多用户的留言不能及时得到回复,从而影响用户的使用体验,严重的可能导致顾客投诉.跳单,甚至直接把你的小程序打入"冷宫",挥挥手再也不见. ①微信小程序客服消息可以直接在手机回复吗? ②客服不在线会有消息提示吗? ③可以设置多客服吗? ④一个客服可以服务多个小程序免登入切换吗? ⑤消息可以分类,批量处理吗? 这是

微信小程序实战

前言: 微信小程序最近刚从鹅厂生产出来,我有幸参与了一次小程序的实战,有必要记录我的开发过程.看上去小程序很简单,但是在深入开发的时候才能具体体会里面的变化,接下来记录我的第一个微信小程序的点点滴滴! 想做微信小程序就要先了解微信官方给出的API:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=20161122

微信小程序实战开发【爱创课堂】

微信小程序开发实战教程一.微信小程序它是一种混合开发的方式. 是安装在微信中的程序(一个程序最多2M空间). 1.1 注册 2 点击立即注册:进入下方页面 3 4 点击小程序进入表单填写页面 5 6 填写完毕之后提交,会让你去邮箱中激活.激活之后就可以进入小程序开发了. 1.2 安装开发工具经过1.1注册之后,我们有了开发账号,但是没有办法凭空开发内容,我们需要下载开发工具.使用微信提供的开发工具进行开发. 下载地址: 1 https://developers.weixin.qq.com/min

Web前端_微信小程序实战开发

微信小程序开发实战教程 一.微信小程序 它是一种混合开发的方式. 是安装在微信中的程序(一个程序最多2M空间). 1.1 注册 1  2 点击立即注册:进入下方页面 3  4 点击小程序进入表单填写页面 5  6 填写完毕之后提交,会让你去邮箱中激活.激活之后就可以进入小程序开发了. 1.2 安装开发工具 经过1.1注册之后,我们有了开发账号,但是没有办法凭空开发内容,我们需要下载开发工具.使用微信提供的开发工具进行开发. 下载地址: 1 https://developers.weixin.qq

微信小程序实战(商城)

github地址(欢迎star):https://github.com/xiaobinwu/dj 版本:0.15.152900(暂未升级原因:升级后需要图片无法本地引用,必须使用image或是远程路径引用) 目录结构 css => 放置公用wxss,目前只有一个font.wcss image => 静态资源目录 lib => 第三方库(如:qqmap-wx-jssdk.min.js) pages => 小程序页面(包括四个文件,.wxml/.wxss/.js/.json) temp

微信小程序实战(一)之仿美丽说

被美丽说少女粉吸引,就想着自己也写一个来练练手,正好最近在学习微信小程序.接下来让我们分享一下我的学习历程吧! 选题 其实纠结了好久该仿什么,看到别人都写的差不多了,自己却还没有动手,很着急,那两天一直在思考在查找,弄得自己特别烦躁,后来想明白了,其实写什么都不要紧,关键在于这个过程中学到了什么,之前觉得要选一个看起来高大上的小程序,其实不然,只要自己喜欢,愿意认真的去完成它,它就是值得你去做的.好啦,我们还是一起来看看我项目吧!!! 已实现功能 图片自动切换 页面跳转 加入购物车 商品数量的增