前言

和首页一样,为了方便,个人中心页同样的我不一点一点的写布局和样式,找一个差不多的模板样式,然后修改并补充交互。

初始的样式长这个样子:

手把手教你做短视频去水印微信小程序系列教程(3-个人中心)_微信小程序


一、修改顶部

1.1 颜色修改

因为样板的颜色是橙色,我们改为和首页一样的色值。 首先修改 pages/mine/mine.json 文件:

// pages/mine/mine.json{  "navigationBarTitleText": "我的",  "navigationBarBackgroundColor": "#99CCFF",  "navigationBarTextStyle": "white",  "component": true,  "usingComponents": {"icon": "./icon/index"
  }
}复制代码

然后将 .center  .blue-top 的颜色也改为 #99CCFF。同时,我们将原有的“已为您服务天数”改为“免费解析次数”,并将左右交换位置,这样我们后续可以增加一个逻辑:让用户在超过免费的解析次数后,观看激励广告才能继续解析。

<view class="blue-top">
  <view class="user-card"><view class="card-top">  <view class="user-top"><view class="user-vip" style="position:relative;">  <image class="user-pic" src="{{hasUserInfo ? userInfo.avatarUrl : '/images/my.png'}}"></image></view><view class="user-board">  <button wx:if="{{!hasUserInfo}}" class="user-name" open-type="getUserInfo" bindgetuserinfo="getUserInfo">点击登陆</button>  <view wx:if="{{hasUserInfo}}" class="user-name">{{userInfo.nickName}}</view></view>  </view></view><view class="card-bottom">  <view class="left"><view class="count">  <text class="num">{{dailyFreeParseNum}} 次</text></view><text class="txt">今日免费次数</text>  </view>  <view class="right"><view class="count">  <text class="num">{{totalParseNum}} 次</text></view><text class="txt">共为您解析次数</text>  </view></view>
  </view></view>复制代码

1.2 用户信息展示/登陆

在第一章中,我们封装了http请求方法,以及一个getUserInfo方法登陆并获取用户信息及token,这里我们可以直接复用该方法。

首先我们在data中定义两个变量

data: {  userInfo: null,  hasUserInfo: false,
},  
复制代码

然后可以注意到我们的wxml中,在没有用户信息时展示的是登陆button,绑定了getUserInfo方法

<view class="user-board">
 <button wx:if="{{!hasUserInfo}}" class="user-name" open-type="getUserInfo" bindgetuserinfo="getUserInfo">点击登陆</button>
 <view wx:if="{{hasUserInfo}}" class="user-name">{{userInfo.nickName}}</view></view>复制代码

我们在/pages/mine/mine.js中声明该方法,添加loading提示,核心逻辑复用app.js中的方法:

/**
 * 授权登录
 */getUserInfo(e) {  if (e.detail.errMsg !== 'getUserInfo:ok') {
    wx.showToast({      title: '未授权,登录失败',      icon: 'none'})return false;
  }
  wx.showLoading({title: "正在登录",mask: true
  });  // 执行登录
  app.getUserInfo(res => {this.setData({      userInfo: app.globalData.userInfo,      hasUserInfo: app.globalData.hasUserInfo,
    })
    wx.hideLoading();
  })
}复制代码

这里注意的是我们传入了一个回调,来设置当前页面的userInfo、hasUserInfo变量的值。

1.3 获取解析次数

在data中增加dailyFreeParseNum、totalParseNum两个参数,并将默认值设置为 --,

data: {  dailyFreeParseNum: '--',  totalParseNum: '--',  userInfo: null,  hasUserInfo: false,
},  
复制代码

在onShow阶段获取每日免费解析次数、总解析次数

onShow: function() {  if (app.globalData.hasUserInfo) {this.setData({userInfo: app.globalData.userInfo,hasUserInfo: app.globalData.hasUserInfo,
    })
  }  // 获取每日剩余免费解析次数
  this.getDailyFreeParseNum(),  // 获取当前用户总解析次数
  this.getTotalParseNum();
},复制代码

下面我们来实现这两个方法

1.3.1 今日免费解析次数

每日的免费解析次数使用本地存储,不走服务端,不做强限制。

/**
* 获取当日免费次数
* 使用本地存储,不走服务端
*/getDailyFreeParseNum() { var today = util.formatDate(new Date(), ''); var lastParseDate = wx.getStorageSync('lastParseDate'); if (lastParseDate != today) {
   wx.setStorageSync('lastParseDate', today);
   wx.setStorageSync('dailyFreeParseNum', DEFAULT_DAILY_FREE_PARSE_NUM);   return DEFAULT_DAILY_FREE_PARSE_NUM;
 } else {   return wx.getStorageSync('dailyFreeParseNum');
 }
},复制代码

1.3.2 总解析次数

该处使用的url网络请求的数据。

/**
* 获取总解析次数
* 返回示例:
* {"total_num":354}
*/getTotalParseNum() {
 app.apiRequest({   url: '/records/total',   success: res => {     this.setData({
       totalNum = res.data.total_num
     })
   }
 })
},复制代码
二、修改菜单

2.1 菜单样式

这里我们只保留几个认为有用的菜单项:

<view class="center-list">
  <navigator bindtap="pingMenu" class="center-list-item" url="/pages/history/history"><icon class="icon1" color="#00c8fd" size="50" type="download"></icon><text class="list-text">解析记录查询</text><icon class="icon2" color="#8a8a8a" size="30" type="youjiantou"></icon>
  </navigator>
  <!--navigator target="miniProgram"/--->
  <button class="center-list-item" openType="contact"><icon class="icon1" color="#00c8fd" size="50" type="kefu"></icon><text class="list-text">联系客服</text><icon class="icon2" color="#8a8a8a" size="30" type="youjiantou"></icon>
  </button>
  <button class="center-list-item" openType="share"><icon class="icon1" color="#00c8fd" size="40" type="share"></icon><text class="list-text">分享</text><icon class="icon2" color="#8a8a8a" size="30" type="youjiantou"></icon>
  </button>
  <button bindtap="showQrcode"  open-type="navigate" class="center-list-item" ><icon class="icon1" color="#00c8fd" size="50" type="zan1"></icon><text class="list-text">赞赏支持</text><icon class="icon2" color="#8a8a8a" size="30" type="youjiantou"></icon>
  </button>    </view>复制代码

2.1.1 联系客服

<button class="center-list-item" openType="contact">
  <icon class="icon1" color="#00c8fd" size="50" type="kefu"></icon>
  <text class="list-text">联系客服</text>
  <icon class="icon2" color="#8a8a8a" size="30" type="youjiantou"></icon></button>复制代码

如上,我们只要对button添加openType="contact"即可。

2.1.2 分享

<button class="center-list-item" openType="share">复制代码

如上,同样的,对button添加openType="share"即可,不过要定义分享函数 onShareAppMessage:

//分享小程序
 onShareAppMessage: function() {return {      title: this.data.config_base_list.share_title ? this.data.config_base_list.share_title : '推荐一款超好用的视频去水印工具,免费解析不限次,大家都在用',      path: '/pages/index/index',      imageUrl: this.data.config_base_list.share_imageUrl ? this.data.config_base_list.share_imageUrl : '/images/share.jpg',      success: function(e) {
        wx.showToast({          title: "分享成功",          icon: "success",          duration: 2e3});
      },      fail: function(e) {
        wx.showToast({          title: "分享失败",          icon: "none",          duration: 2e3});
      }
    }
  },
}复制代码

2.1.3 赞赏支持

这里为了菜单多一点,添加了一个打赏菜单,实现简单,点击后弹出个图片就行:

//打赏showQrcode() {
  wx.previewImage({urls: ['http://xxxx/images/xxx.jpg'],current: 'http://xxxx/images/xxxx.jpg' // 当前显示图片的http链接      
  })
},复制代码
三、历史解析列表

该处使用的url网络请求的数据。

3.1 页面样式

<view class="no-data" wx:if="{{!list||list.length==0}}">暂无相关信息~</view><view class="container">
  <view class="scroll-gap"></view>
  <view class="video-box shadow" wx:for="{{list}}" wx:key="id"><view class="video-btm">  <view class="video-title ellipsis" bindtap="Copy_video_info" bindlongpress="Copy_video_info" data-content="{{item.url}}" data-tip="标题已复制">{{item.url}}</view>  <button data-content="{{item}}" openType="share"><icon color="#9cf" size="30" type="share"></icon>  </button></view><video autoplay class="video-item" bindlongpress="Copy_video_info" data-content="{{item.image_url}}" data-tip="图片链接已复制" poster="{{item.image_url}}" src="{{item.no_water_mark_url}}" wx:if="{{index===downloadIndex}}"></video><view class="video-cover" wx:else>  <image class="video-cover-poster" mode="aspectFit" src="{{item.image_url}}" bindtap="Copy_video_info" bindlongpress="Copy_video_info" data-content="{{item.image_url}}" data-tip="图片链接已复制"></image>  <icon bindtap="videoPlay" data-idx="{{index}}" class="video-cover-icon" color="#00c8fd" size="55" type="bofang"></icon>  <text class="video-date">{{item.updated_at}}</text></view><view class="btn">  <button class="btn-left" bindtap="Copy_video_info" bindlongpress="Copy_video_info" data-content="{{item.url}}" data-tip="视频地址已复制">复制链接</button>  <button class="btn-center" bindtap="Download" data-link="{{item.url}}">重新下载</button>  <button class="btn-right" bindtap="DEL" data-key="{{index}}" data-id="{{item.id}}">删除记录</button></view>
  </view>
  <view class="scroll-gap"></view></view>复制代码

3.2 获取历史解析列表

分页获取

/**
 * 历史解析记录
 */history: function() {  this.setData({loading: true
  })
  wx.showLoading({title: '加载中...',
  });
  app.apiRequest({url: '/records',data: {      page: this.data.page,
    },success: res => {      console.log(res);      this.setData({list: this.data.list.concat(res.data.data),
      })
    },complete: (res) => {      this.setData({loading: false  })
      wx.hideLoading();
    }
  })
},复制代码

触底加载下一页

/**
* 页面上拉触底事件的处理函数
*/onReachBottom: function () { this.setData({   page: this.data.page + 1
 }) this.history();
},复制代码

3.3 删除记录

DEL: function(e) {  var id = e.currentTarget.dataset.id;  var key = e.currentTarget.dataset.key;
  wx.showModal({title: '提示',content: '你确定要删除吗?',success: res => {      if (res.confirm) {
        app.apiRequest({          url: '/records/' + id,          method: 'DELETE',          success: res => {this.data.list.splice(key, 1);this.setData({              list: this.data.list
            })
          }
        })
      } else if (res.cancel) {}
    }
  })
},复制代码

3.4 重新下载

/**
 * 重新下载 
 * 复制原始链接跳转首页重新让用户解析
 * @param e 
 */Download: function(e) {  console.log(e)
  wx.setClipboardData({data: e.currentTarget.dataset.link,
  })
  wx.reLaunch({url: "/pages/index/index"
  })
},复制代码

3.5 复制地址

//复制视频详情内容Copy_video_info: function(t) {
  wx.setClipboardData({data: t.currentTarget.dataset.content,success: function(a) {
      wx.showToast({title: t.currentTarget.dataset.tip,duration: 1200  });
    }
  });
},复制代码

总结

最终,我们的个人中心页长这个样子:

手把手教你做短视频去水印微信小程序系列教程(3-个人中心)_微信小程序_02

历史解析记录列表长这个样子:手把手教你做短视频去水印微信小程序系列教程(3-个人中心)_微信小程序_03


系列文章
  • 手把手教你做短视频去水印微信小程序(0-概述)
  • 手把手教你做短视频去水印微信小程序(1-封装网络请求&登陆逻辑)
  • 手把手教你做短视频去水印微信小程序(2-首页)
  • 手把手教你做短视频去水印微信小程序(3-个人中心)
  • 手把手教你做短视频去水印微信小程序(4-转换结果页)
  • 手把手教你做短视频去水印微信小程序(5-服务端代码)
  • 手把手教你做短视频去水印微信小程序(6-广告代码)【待完成】
  • 手把手教你做短视频去水印微信小程序(7-Q&A整理)【待完成】
github源码地址

手把手教你做短视频去水印微信小程序系列教程(3-个人中心)_微信小程序_04