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>
  • 相关阅读:
    HZNU1015: 矩阵排序
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemK:K-Nice
    The 6th Zhejiang Provincial Collegiate Programming Contest->Problem I:A Stack or A Queue?
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemF:80ers' Memory
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemB:Light Bulb
    The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemA:Second-price Auction
    The 5th Zhejiang Provincial Collegiate Programming Contest------ProblemK:Kinds of Fuwas
    The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemG:Give Me the Number
    The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemF:Faster, Higher, Stronger
    The 5th Zhejiang Provincial Collegiate Programming Contest---ProblemE:Easy Task
  • 原文地址:https://www.cnblogs.com/fsg6/p/13634223.html
Copyright © 2011-2022 走看看