zoukankan      html  css  js  c++  java
  • 小程序网易云(三)

    一,登录后,将客户信息保存在微信小程序本地中

    1,1,wx.setstorege(),

    将登录信息存储到本地,将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。
    单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB

     //用于发送登录请求的函数
       async handleLogin(){
        let {phone,password} = this.data;
        let result = await request('/login/cellphone',{
          phone,
          password
          
        });
        /*
        登录接口
        用户名错误->状态为400
        密码错误  ->状态为502
        登陆成功  ->状态为200
         */
        // console.log('result',result)
        if (result.code===400){
          wx.showToast({
            title: '用户名错误',
            icon:"none"
          })
        } else if (result.code === 502) {
          wx.showToast({
            title: '密码错误',
            icon: "none"
          })
        }else if(result.code===200){
          wx.showToast({
            title: '登陆成功,即将跳转',
            icon: "success",
            // 成功的回调
            success() {
              wx.setStorage({
                key:"userinfo",
                // 字符串的形式存储
                data: JSON.stringify(result.profile) ,
                success(){
                  console.log('存储成功')
                }
              })
              // 登录成功后,跳转到个人中心
              wx.switchTab({
                url: '/pages/personal/personal'
              })
            }
          })
        }
      },

    1,2,此时个人中心页personal,从本地中获取客户信息,此时在onshow函数中获取,不是在onload中获取,因为从个人中心页跳转登录页,没有销毁该页,onload的周期已过,

     onShow: async function () {
        // 解析成数组
        let userinfo = JSON.parse(wx.getStorageSync("userinfo")) || "{}";
        // console.log(userinfo)
        this.setData({
          userinfo
        });
        // 有登录信息后,才请求播放记录
        if(userinfo){
          let result = await request('/user/record',{type:0,uid:userinfo.userId});
          // console.log(result)
          this.setData({
          //数组 playList:result.weekData }) } },

    1.3,最近播放记录发送请求获取数据,此时必须是用户登录过才可以,此时客户登录信息已从本地获取到了,可以发送请求获取播放信息记录了

     data: {
        moveDistance:0,
        moveTransition:"none",
        playList:null,
        userinfo:{}
      },

    1.4,数据渲染

      <view class="playList">
            <view class="playTitle">最近播放</view>
            <scroll-view class="playScroll" scroll-x enable-flex wx:if="{{playList}}">
              <!-- <view><image src="/static/images/nvsheng.jpg"></image></view> -->
              <image src="{{item.song.al.picUrl}}" wx:for="{{playList}}"></image>
             
            </scroll-view>
            <view class="noData" wx:else>暂时没有数据</view>
          </view>

    客户登录过,图片更改,昵称更改

     <view class="user-info-box" bindtap="toLogin">
          <view class="portrait-box">
            <image class="portrait"  src="{{userinfo.avatarUrl?userinfo.avatarUrl:'/static/images/personal/missing-face.png'}}" ></image>
          </view>
          <view class="info-box">
            <text class="username">{{userinfo.nickname?userinfo.nickname:'游客'}}</text>
          </view>
        </view>

    客户已经登录过,点击后不用再跳转到登录页了

     toLogin(){
        // 如果已经登录,不需要在跳转登录页
        if(this.data.userinfo.nickname)return;
        wx.navigateTo({
          url: '/pages/login/login'
        })
      },

    二,视频页面导航条静态页面,以及动态渲染

    1,flex-grow:1;生长系数,如果父级开启了flex,三个子元素的宽度没有父级的宽度长,那么空白区域给设置了生长系数属性的子级

    2,scroll-view组件有默认高度,需要自己设置 高度,
    3.小程序支持placeholder-class="placeholder"属性,对水印设置样式
     
      <input type="text" placeholder="光辉岁月" placeholder-class="placeholder"></input>
    .videoContainer .header input .placeholder{
      text-align: center;
      font-size:28rpx;
      color:red;
    }

    4,发送请求,获取导航条的数据

     let result = await request('/video/group/list');
        console.log(result);
        this.setData({
          // 截取多余的数据
          videoGroup:result.data.slice(0,14)
        })
     data: {
        videoGroup:[],
        videoList:[]
      },

    5,渲染数据

     <scroll-view class="navScroll" enable-flex scroll-x>
        <view class="navItem active" wx:for="{{videoGroup}}" wx:key="id"
        >{{item.name}}</view>
      </scroll-view>

    三,视频模块(视频列表获取数据)

    video组件,要播放视频的资源地址,支持网络路径、本地临时路径、云文件ID

    获取视频标签下对应的视频数据
        必选参数 : id: videoGroup 的 id
        接口地址 : /video/group
        调用例子 : /video/group?id=9104
        注意事项: 
        需要先登录
        发请求需要携带用户cookie
        返回数据: 

    此时cookie只有发送登录请求成功后,才会携带cookies

     1,我们需要在请求登录接口时,需要传入一个登录标识,此时在接口函数中,就可以判断是登录状态的,就可以将cookies保存在本地,然后将cookies在请求头header中携带cookie

    //用于发送登录请求的函数
       async handleLogin(){
        let {phone,password} = this.data;
        let result = await request('/login/cellphone',{
          phone,
          password,
          isLogin:true
        });

    2.在接口函数中将cookies保存在本地

    import lj from './config.js'
    export default function(url,data={}, method='get'){
    
      return new Promise((resolve,reject)=>{
        wx.request({
          url:lj.host+url,
          method,
          data,
          header:{
            // 必须设置成数组的字符串形式
            cookie:JSON.parse(wx.getStorageSync("cookies")||"[]").toString()
          },
          success:(res)=>{
            console.log(res)
            // console.log(res.dates)
            // console.log(res.cookies)
            //获取请求头中的cookies;
            let cookies=res.cookies;
            let {isLogin} = data;
            //cookies只有在登录接口中才会返回
            if(isLogin){
              // 字符串形式存储
              wx.setStorageSync("cookies", JSON.stringify(cookies));
            }
            resolve(res.data)
          }
      
        })
      })
     
    }
    JSON.parse(wx.getStorageSync("cookies")||"[]") , 此时如果cookie是undefind, 就会报错,如果为undefind,就为空数组

    3,此时cookies已经在请求头携带了,我们可以发送请求,获取视频列表数据了,id是每个视频标签下视频列表数据,此时58100的id是现场的id

    let videoListData = await request("/video/group", { id: 58100});
        this.setData({
          videoList:videoListData.datas
        })
        console.log(videoListData)

    数据渲染, 小程序没有a.b.c数据undefind问题,可以放心使用

    <scroll-view class="videoList" scroll-y> 
      
        <view class="videoItem " wx:for="{{videoList}}"  wx:key="vid">
          <video class="common" src="{{item.data.urlInfo.url}}"></video>
          <!-- <image id="{{item.data.vid}}" class="common" bindtap="handleTrigger" src="{{item.data.coverUrl}}"></image> -->
          <view class="content">{{item.data.title}}</view>

    四,视频列表动态情况

    4,1,我们需要滑动视频列表,视频滚动,但是不需要顶部的页面页跟着一起滚动

    4.2,可滚动视图区域。使用竖向滚动时,需要给scroll-view一个固定高度,通过 WXSS 设置 height。组件属性的长度单位默认为px,2.4.0起支持传入单位(rpx/px)。

    calc,计算属性,不包括底部的tarbar

    .videoList{
      padding-top:40rpx;
      height:calc(100vh - 212rpx);
    }

    4.3,点击视频标签页,也就是更新id,重新发送请求,获取视频数据。默认页面加载时,获取第一个id的视频

    onLoad: async function (options) {
        let result = await request('/video/group/list');
        console.log(result);
        this.setData({
          // 截取多余的数据
          videoGroup:result.data.slice(0,14)
        })
    
        let id = result.data[0].id
        
        //第一页面渲染时,获取视频列表数据
        let videoListData = await request("/video/group", { id});
        this.setData({
          id,
          videoList:result.data.slice(0,14)
        })
        console.log(id)
      },
     data: {
        videoGroup:[],
        videoList:[],
        id:null
      },

    点击视频标签,跟新id,重新发送请求,

    <scroll-view class="navScroll" enable-flex scroll-x>
        <view class="navItem {{id===item.id?'active':''}}" wx:for="{{videoGroup}}" wx:key="id"
        bindtap="changeId"  data-id="{{item.id}}"
        >{{item.name}}</view>
      </scroll-view>

    js

     1, 视频在请求时,先搞个加载状态,  wx.showLoading({
          title:"加载中,请稍等"
        })
    2,2s后,加载状态消失
    setTimeout(wx.hideLoading,2000)
     
     // 用于控制导航条内部下边框的显示
       changeId(event){
         //获取自定义的属性的id
        let {id} = event.target.dataset
        // 跟新id
        this.setData({
          id
        })
        // 调用请求函数
        this.getVideoList(id);
      },
    
       //用于请求视频列表数据
       async getVideoList(id){
        //  显示加载状态
        wx.showLoading({
          title:"加载中,请稍等"
        })
        // 清空之前的视频数据
        this.setData({videoList:[]})
        let videoListData = await request("/video/group", { id });
        // 2s后清空加载状态
        setTimeout(wx.hideLoading,2000)
        // wx.hideLoading();
        this.setData({
          videoList: videoListData.datas
        })
        // console.log(videoListData)
      },

    五,视频模块,(常见功能)

    5,1,下拉功能

    1.refresher-enabled,开启自定义下拉刷新,默认为false

    2,bindrefresherrefresh,自定义下拉刷新被触发,

    3,refresher-triggered,设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发

    4,bindscrolltolower, 滚动到底部/右边时触发

    5,scroll-into-view,值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素

     6,scroll-with-animation  过渡效果
     
     
     
     <scroll-view class="videoList" 
      scroll-y 
      refresher-enabled
      refresher-triggered="{{trigger}}"
      bindrefresherrefresh="pullUpdate"
      bindscrolltolower="scrollToLower"
      >

    下拉的js,此时下拉视频后,下拉状态还在,我们需要下拉成功后,还需要自动回去,此时需要设定属性refresher-triggered

      // 用于响应用户的下拉刷新效果
      pullUpdate(){
        // console.log('pullUpdate')
        // 重新发送请求,获取列表数据
        this.getVideoList(this.data.id);
      },

    发送请求成后,下拉状态回去

     data: {
        videoGroup:[],
        videoList:[],
        id:null,
        trigger:false
      },
     //用于请求视频列表数据
      async getVideoList(id){
        wx.showLoading({
          title:"加载中,请稍等"
        })
        this.setData({videoList:[]})
        let videoListData = await request("/video/group", { id });
        setTimeout(wx.hideLoading,2000)
        // wx.hideLoading();
        this.setData({
          videoList: videoListData.datas,
          trigger:false
        })
        // console.log(videoListData)
      },

    6,上拉触底加载

    绑定scrolltolower事件,监听用户上拉触底的操作
    由于没有真实的上拉加载更多接口,需要自己模拟数据,并将模拟的数据与旧数据合并,更新到状态中

    7,

    导航条内容滑动
    使用scroll-into-view标签属性,实现点击某个选项,让其移动到最前面
    注意:scroll-into-view的值必须是某个选项的id,id的值必须要以字母开头
    提升用户体验,使用scroll-with-animation标签属性给移动效果添加动画

    瞄点的功能

      <!-- 导航栏区域 -->
      <scroll-view class="navScroll" 
        enable-flex 
        scroll-x
        scroll-with-animation
        scroll-into-view="{{'scroll'+id}}">
        <view id="{{'scroll'+item.id}}" class="navItem {{id===item.id?'active':''}}"
          bindtap="changeId"
          data-id="{{item.id}}"
          wx:for="{{videoGroup}}"
          wx:key="id"
        >
          <text>{{item.name}}</text>
        </view>
      </scroll-view>
  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/fsg6/p/13634223.html
Copyright © 2011-2022 走看看