移动软件开发实验5

2023年夏季《移动软件开发》实验报告

一、实验目标

1、综合所学知识创建完整的前端新闻小程序项目;能够在开发过程中熟练掌握真机预览、调试等操作。

二、实验步骤

列出实验的关键步骤、代码解析、截图。

1.创建一个小程序,创建index,detail,my三个页面,将所需要的图片以及数据common.js放入images文件夹和utils文件夹中。

目录如图:

在这里插入图片描述

2.关键代码

首先页面设计,上方的导航栏,下方的tabBar设计,以及在多个页面都会用到的公共页面样式,可以放在app.wxss里

app.json

{
  "pages": [
    "pages/index/index",
    "pages/my/my",
    "pages/detail/detail"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#328EEB",
    "navigationBarTitleText": "我的新闻网",
    "navigationBarTextStyle": "white"
  },
  "tabBar":{
    "color":"#000",
    "selectedColor":"#328EEB",
    "list":[
      {
        "pagePath":"pages/index/index",
        "iconPath":"images/index.png",
        "selectedIconPath":"images/index_blue.png",
        "text":"首页"
      },
      {
        "pagePath":"pages/my/my",
        "iconPath":"images/my.png",
        "selectedIconPath":"images/my_blue.png",
        "text":"我的"
      }
  ]
  }
}

app.wxss

/**app.wxss**/
/*新闻列表区域样式*/
/*2-1新闻列表容器*/
#news-list {
  min-height: 600rpx;
  padding: 15rpx;
}
/*2-2列表项目*/
.list-item{
  display: flex;
  flex-direction: row;
  border-bottom: 1rpx solid gray;
}
/*2-3新闻图片*/
.list-item image{
  width:230rpx;
  height: 150rpx;
  margin: 10rpx;
}
/*2-4新闻标题*/
.list-item text{
  width: 100%;
  line-height: 60rpx;
  font-size: 10pt;
}

主页index页面,分为上方幻灯片滚动区域,和下方的新闻列表的区域

index.wxml

<!--pages/index/index.wxml-->
<!--幻灯片滚动-->
<swiper indicator-dots="true" autoplay="true" interval="5000" duration="500">
  <block wx:for="{{swiperImg}}" wx:key='swiper{{index}}'>
    <swiper-item>
      <image src="{{item.src}}"></image>
    </swiper-item>
  </block>
</swiper>
<!--新闻列表-->
<view id='news-list'>
  <view class='list-item' wx:for="{{newsList}}" wx:for-item="news" wx:key="{{news.id}}">
    <image src='{{news.poster}}'></image>
    <text bindtap='goToDetail' data-id='{{news.id}}'>{{news.title}}——{{news.add_date}}</text>
  </view>
</view>

主页面的设计样式

index.wxss

/*新闻列表区域样式*/
/*2-1新闻列表容器*/
.news-list {
  min-height: 600rpx;
  padding: 15rpx;
}
/*2-2列表项目*/
.list-item{
  display: flex;
  flex-direction: row;
  border-bottom: 1rpx solid gray;
}
/*2-3新闻图片*/
.list-item image{
  width:230rpx;
  height: 150rpx;
  margin: 10rpx;
}
/*2-4新闻标题*/
.list-item text{
  width: 100%;
  line-height: 60rpx;
  font-size: 10pt;
}

以及点进新闻以后得详情页面,包含题目,图片,具体内容,时间以及一个是否选择收藏的按钮

detail.wxml

<!--pages/detail/detail.wxml-->
<view class="container">
  <view class="title">{{article.title}}</view>
  <view class="poster">
    <image src="{{article.poster}}" mode="widthFix"></image>
  </view>
  <view class="content">{{article.content}}</view>
  <view class="add_date">时间:{{article.add_date}}</view>
  <button wx:if="{{isAdd}}" plain bindtap="cancelFavorites">❤已收藏</button>
  <button wx:else plain bindtap="addFavorites">❤点击收藏</button>
</view>

详情页面的页面设计样式

detail.wxss

/* pages/detail/detail.wxss */
/*整体容器*/
.container{
  padding: 15rpx;
  text-align: center;
}
/*新闻标题*/
.title{
  font-size: 14pt;
  line-height: 80rpx;
}
/*新闻图片*/
.poster image{
  width:700rpx;
}
/*新闻正文*/
.content{
  text-align: left;
  font-size: 12pt;
  line-height: 60rpx;
}
/*新闻时间*/
.add_date{
  font-size: 12pt;
  text-align: right;
  line-height: 30rpx;
  margin-right: 25rpx;
  margin-top: 20rpx;
}
/*点击收藏按钮*/
button{
  width: 300rpx;
  height: 100rpx;
  margin: 20rpx auto;
}

"我的"主页,首先未登录的话有点击登录页面,已登录的话,有头像和昵称的内容,下方有对新闻的收藏列表

my.wxml

<!--pages/my/my.wxml-->
<!--登录面板-->
<view id="myLogin">
  <block wx:if="{{isLogin}}">
    <image id='myIcon' src='{{src}}'></image>
    <text id='nickName'>{{nickName}}</text>
  </block>
  <button wx:else bindtap="getMyInfo">未登录,点此登录</button>
</view>
<!--我的收藏-->
<view id="myFavorites">
  <text>我的收藏({{num}})</text>
  <!--收藏的新闻列表-->
  <view id="news-list">
    <view class='list-item' wx:for="{{newsList}}" wx:for-item="news" wx:key="{{news.id}}">
      <image src='{{news.poster}}'></image>
      <text bindtap="goToDetail" data-id="{{news.id}}">{{news.title}}--{{news.add_date}}</text>
    </view>
  </view>
</view>

“我的”页面设计样式

my.wxss

/* pages/my/my.wxss */
/* 登录面板*/
#myLogin{
  background-color: #328EEB;
  height: 400rpx;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;
}
/*1-1头像图片*/
#myIcon{
  width: 200rpx;
  height: 200rpx;
  border-radius: 50%;
}
/*1-2微信昵称*/
#nickName{
  color: white;
}
/*1-3我的收藏*/
#myFavorites{
  padding: 20rpx;
}

以下是逻辑实现:

主页面逻辑实现,重要的就是实现页面的跳转,这里用goToDetail方法实现

index.js

// pages/index/index.js
var common = require('../../utils/common.js') //引用公共JS文件
Page({

  /**
   * 页面的初始数据
   */
  data: {
    //幻灯片素材
    swiperImg: [
      {src: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg'},
      {src: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage2.jpg'},
      {src: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage3.jpg'}
    ],
    newsList:[]
  },

  /**
   * 自定义函数--跳转新页面浏览新闻内容
   */
  goToDetail: function(e) {
    //获取携带的data-id数据
    let id = e.currentTarget.dataset.id;
    //携带新闻id进行页面跳转
    wx.navigateTo({
      url: '../detail/detail?id=' + id
    })
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    //获取新闻列表
    let list = common.getNewsList()
    //更新列表数据
    this.setData({
      newsList: list
    })
  }
})

详情页面逻辑实现,接收主页面的跳转,以及收藏按钮的实现,新闻数据都在common.js里,即收藏新闻,只需要往本地缓存里加入数据,取消收藏即从本地缓存里移除数据。

detail.js

// pages/detail/detail.js
var common=require('../../utils/common.js')
Page({

  /**
   * 页面的初始数据
   */
  data: {
    isAdd:false,
    num:0,
    article:""
  },
  /**
   * 
   * 自定义函数--跳转新页面游览新闻内容
   */
  goToDetail:function(e)  
  {
    //获取携带的data-id数据
    let id=e.currentTarget.dataset.id;
    //携带新闻id进行跳转
    wx.navigateTo({
      url: '../detail/detail?id='+id
    })
  },
  //添加到收藏夹
  addFavorites:function(options)
  {
    //获取当天新闻
    let article=this.data.article;
    //添加到本地缓存
    wx.setStorageSync(article.id, article)
    //更新按钮显示
    this.setData({isAdd:true});
  },
  //取消收藏
cancelFavorites:function(options)
{
    //获取当天新闻
    let article=this.data.article;
    //从本地缓存里删除
    wx.removeStorageSync(article.id);
    //更新按钮显示
    this.setData({isAdd:false});
},

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad:function(options) {
    //获取页面跳转来时获取到的数据
    let id=options.id;
    //检查当前新闻是否在收藏夹中
    var newarticle=wx.getStorageSync(id)
    //已存在
    if(newarticle!="") {
      this.setData({
        article:newarticle,
        isAdd:true
      })
    }
    //不存在
    else{
      let result=common.getNewsDetail(id)
      //获取到新闻内容
      if(result.code=='200')
      {
        this.setData({
          article:result.news,
          isAdd:false
        });
      }
  
    }
    
  }
})

我的页面的逻辑实现,首先是要实现用户登录问题,第二就是,实现收藏列表的更新

my.js

// pages/my/my.js
var common=require('../../utils/common.js')

Page({

  /**
   * 页面的初始数据
   */
  data: {
    //临时微信用户头像和昵称
    //nickName:"",
    //src:" ",
    num:0,
    //临时收藏夹中新闻素材
    newsList:[]
  },
  getMyFavorites:function()
  {
    let info=wx.getStorageInfoSync();
    let keys=info.keys;
    let num=keys.length;
    let myList=[];
    for(var i=0;i<num;i++)
    {
      let obj=wx.getStorageSync(keys[i]);
      myList.push(obj);
    }
    //更新收藏列表
    this.setData({
      newsList:myList,
      num:num
    });
  },
  goToDetail:function(e)
  {
    //获取携带的data-id的数据
    let id=e.currentTarget.dataset.id;
    wx.navigateTo({
      url: '../detail/detail?id='+id,
    })
  },
  getMyInfo:function()
  {
     let that=this;
     wx.getUserProfile({
        desc:'获取用户信息',
        success(res){
          console.log("获取用户信息成功",res)
          that.setData({
            isLogin:true,
            src:res.userInfo.avatarUrl,
            nickName:res.userInfo.nickName
          })
        }
      })
      this.getMyFavorites();
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    wx.clearStorage()
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    //如果已经登录
    if(this.data.isLogin)
    {
      //更新收藏列表
      this.getMyFavorites()
    }
  }
})

最后初始页面
在这里插入图片描述

三、程序运行结果

列出程序的最终运行结果及截图。

初始页面

在这里插入图片描述

点进新闻详情页

在这里插入图片描述

点击收藏以后

在这里插入图片描述

“我的”页面

在这里插入图片描述

点击登录

在这里插入图片描述

登录以后,暂时还没有收藏新闻

在这里插入图片描述

收藏部分新闻以后

在这里插入图片描述

从收藏页点击新闻进去游览查看

在这里插入图片描述

四、问题总结与体会

描述实验过程中所遇到的问题,以及是如何解决的。有哪些收获和体会,对于课程的安排有哪些建议。

总结:

1.第一个遇到的问题果然还是因为打字手快,以及查看不仔细造成的拼写错误

2.第二个问题,就是获取用户头像和昵称中getUserInfo的弃用,但这次我发现就算是换成getUserProfile也仍然返回匿名用户信息

在这里插入图片描述
在这里插入图片描述

如果这样的话,很可能是因为调试基础库版本问题,在详情本地设置里面,将版本调到2.27以下,或者为了更准确,上网搜一下接口对应的可行版本

在这里插入图片描述

3.最后一个问题,也是困扰了我很久的,就是在登录以后收藏列表里会出现一则新闻,尽管我并没有点击收藏:

在这里插入图片描述

上网搜查以后,发现是缓存中又log日志,占用了一个长度空间,所以要在my.js的onLoad函数里面调用wx.clearStorage函数清除缓存即可以解决这个问题。

体会

通过这次实验,巩固了前面所学的知识,也加深了对小程序里数据本地缓存的理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值