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

一、实验目标

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

二、实验步骤

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

步骤一 基础设计

先是顶部信息与底部导航栏的设计,这些设计都在app.json中实现。

顶部小程序信息与配色

{
  "pages": [
    "pages/index/index",
    "pages/my/my",
    
    "pages/detail/detail"
    
  ],
  "window": {
    "navigationBarBackgroundColor": "#328EEB",
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "我的新闻网",
    "backgroundColor": "#eeeeee",
    "backgroundTextStyle": "light",
    "enablePullDownRefresh": false
  },
  "tabBar": {
    "color": "#000000",
    "selectedColor": "#328EEB",
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首页",
        "iconPath": "image/index.png",
        "selectedIconPath": "image/index_blue.png"
      },
      {
        "pagePath": "pages/my/my",
        "text": "我的",
        "iconPath": "image/my.png",
        "selectedIconPath": "image/my_blue.png"
      }
    ]
  },
  "sitemapLocation": "sitemap.json"
}

下面的信息显示,结合html和css的设计,主要就是新闻列表,这个新闻列表在首页和我的页都要使用,所以写在app.wxss中最方便,可以用于index和my两页的html。

wxss部分

/**app.wxss**/
/* 新闻列表 */
.news-list{
  min-height: 600rpx;
  padding: 15rpx;
}
.news-item{
  display: flex;
  flex-direction: row;
  border-bottom:1rpx solid black;
}
.news-item image{
  height: 150rpx;
  width: 230rpx;
  margin: 10rpx;
}
.news-item text{
  width:100%;
  line-height: 60rpx;
  font-size:40rpx;
}

步骤二 首页设计

首页的UI设计主要包括两部分内容,即幻灯片滚动和新闻列表。

首页的功能设计主要有两个功能需要实现,一是展示新闻列表,二是点击新闻标题可以跳转对应的内容页面进行浏览。

index.wxml如下

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

index.wxss如下

/**index.wxss**/
.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
  color: #aaa;
}
​
.userinfo-avatar {
  overflow: hidden;
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}
​
.usermotto {
  margin-top: 200px;
}
​
/* 幻灯片部分 */
swiper{
  height: 400rpx;
  width:100%;
}
swiper image{
  height: 100%;
  width:100%;
}

index.js如下

// pages/detail/detail.js
var common = require('../../utils/util.js')
​
Page({
​
  /**
   * 页面的初始数据
   */
  data: {
    swiperImg: [
      { src: "/image/newsimage1.jpg" },
      { src: "/image/newsimage2.jpg" },
      { src: "/image/newsimage3.jpg" }
    ],
    newsList:[]
  },
  goToDetail:function(e){
    //获取携带data-id的数据
    let id = e.currentTarget.dataset.id
    //console.log(e)
    //携带新闻ID进行页面跳转
    wx.navigateTo({
      url: '../detail/detail?id=' + id,
    })
​
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    let list = common.getNewList()
    this.setData({
      newsList:list
    })
  },
​
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
​
  },
​
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
​
  },
​
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
​
  },
​
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
​
  }
})

步骤三 个人主页设计

个人中心页主要包含两个版块,即登录面板和“我的收藏”。登录面板用于显示用户的微信头像和昵称,“我的收藏”用于显示收藏在本地的新闻列表。

<!-- 登陆页面 -->
<view class="myLogin">
  <block wx:if="{{is_Login}}">
    <image src="{{src}}"></image>
    <text>{{nickName}}</text>
  </block>
  <button wx:else="" open-type="getUserInfo" bindtap="getMyInfo">点击获取头像和昵称</button>
</view>
<!-- 收藏列表 -->
<view class="myFavorite"> 
  <text>我的收藏({{number - 1}})</text>
  <view class="news-list">
    <view class="news-item" wx:for="{{newsList}}" wx:key="{{item.id}}">
      <image src="{{item.poster}}"></image>
      <text bindtap = 'goToDetail' data-id="{{item.id}}">{{item.title}}————{{item.add_date}}</text>
    </view>
  </view>
</view>
/* 登陆页面 */
.myLogin{
  height: 400rpx;
  background-color: #328EEB;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;
}
.myLogin image{
  height: 200rpx;
  width:200rpx;
  border-radius: 50%;
}
.myLogin text{
  color: white;
}
/* 收藏列表 */
.myFavorite{
  padding: 20rpx;
}
​
// pages/my/my.js
Page({
​
  /**
   * 页面的初始数据
   */
  data: {
    number:  1,
    nickName: "未登录",
    src: "/images/index1.png",
    newsList: [],
    is_Login : false,
  },
​
  getMyInfo: function (e) {
    wx.getUserProfile({
      desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: (res) => {
        console.log(res)
        this.setData({
          src: res.userInfo.avatarUrl,
          nickName: res.userInfo.nickName,
          is_Login : true
        })
      }
    })
    this.getMyFavorites()
  },
​
  //更新number
  getMyFavorites: function () {
    let info = wx.getStorageInfoSync() //读取本地缓存信息
    console.log(info)
    let keys = info.keys //获取全部key信息 
    let num = keys.length //获取收藏新闻数量
​
    let myList = [];
    for (var i = 0; i < num - 1; i++) {
      let obj = wx.getStorageSync(keys[i])
      myList.push(obj)
    }
    //更新收藏列表
    this.setData({
      newsList: myList,
      number: num
    })
  },
  goToDetail: function (e) {
    //获取携带data-id的数据
    let id = e.currentTarget.dataset.id
    //console.log(e)
    //携带新闻ID进行页面跳转
    wx.navigateTo({
      url: '../detail/detail?id=' + id,
    })
​
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    
  },
​
  onLoad() {
 
  },
​
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    if (this.data.is_Login) {
      this.getMyFavorites()
    }
  },
​
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
​
  },
​
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
​
  },
​
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
​
  },
​
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
​
  },  
})

步骤四 文章详细页

新闻页是用于给用户浏览新闻全文的,需要用户点击首页的新闻列表,然后在新窗口中打开该页面。新闻页包括新闻标题、新闻图片、新闻正文和新闻日期。

<view class="container">
  <view class="title">{{article.title}}</view>
  <view class="poster">
    <image src="{{article.poster}}"></image>
  </view>
  <view class="content">
    <text>{{article.content}}</text>
  </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>

计划使用view组件进行整体布局,对自定义的class名称解释如下。 container:整体容器; title:新闻标题区域; poster:新闻图片区域; content:新闻正文区域: add_date:新闻日期区域。

.container{
  padding:15rpx;
  /* text-align: center; */
}
.title{
  font-size: 35rpx;
  line-height: 35rpx;
  text-align: center;
}
.poster image{
  width: 100%;
}
.content text{
  text-align: left;
  font-size: 30rpx;
  line-height: 35rpx;
}
.add_date{
  font-size: 30rpx;
  text-align: right;
  line-height: 30rpx;
  margin-right: 25rpx;
  margin-top:20rpx;
}
button{
  width: 250rpx;
  height:100rpx;
  margin:20rpx auto;
}

新闻页主要有两个功能需要实现,一是显示对应新闻,二是可以添加/取消新闻收藏。

// pages/detail/detail.js
var common = require('../../utils/util.js')
​
Page({
​
  /**
   * 页面的初始数据
   */
  data: {
    article: {
      id: '',
      title: '666',
      poster: '',
      add_date: '',
      content: ''
    },
    isAdd:false
  },
  //添加收藏
  addFavorites:function(){
    let article = this.data.article
    wx.setStorageSync(article.id, article)
    this.setData({
      isAdd:true,
    })
    
  },
  //取消收藏
  cancelFavorites:function(){
    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({
        isAdd:true,
        article:newarticle
      })
    }
    //不存在
    else{
      let result = common.getNewsDetail(id)
      //获取新闻内容
      if( result.code == '200' ){
        this.setData({
          article:result.news,
          isAdd:false
        })
      }
    }
    
    },
​
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
​
  },
​
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
​
  },
​
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
​
  },
​
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
​
  },
​
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
​
  }
})

步骤五 细节补充

修改my.wxml代码,将“我的收藏”后面的数字更改为动态数据效果。

<view class="myFavorite"> 
  <text>我的收藏({{number - 1}})</text>
  <view class="news-list">
    <view class="news-item" wx:for="{{newsList}}" wx:key="{{item.id}}">
      <image src="{{item.poster}}"></image>
      <text bindtap = 'goToDetail' data-id="{{item.id}}">{{item.title}}————{{item.add_date}}</text>
    </view>
  </view>
</view>

继续在my.js文件中追加getMyFavorites函数,用于展示真正的新闻收藏列表。

getMyFavorites: function () {
    let info = wx.getStorageInfoSync() //读取本地缓存信息
    console.log(info)
    let keys = info.keys //获取全部key信息 
    let num = keys.length //获取收藏新闻数量
​
    let myList = [];
    for (var i = 0; i < num - 1; i++) {
      let obj = wx.getStorageSync(keys[i])
      myList.push(obj)
    }
    //更新收藏列表
    this.setData({
      newsList: myList,
      number: num
    })
  },

三、程序运行结果

首页

 

拖动效果,同时为了体现这个效果,自己加了几篇文章。

 

划动效果

 

个人页

 

 

进入一篇文章

收藏:

收藏列表更新

四、问题总结与体会

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

问题

首先是页面切换,借助微信小程序开发已有的语法,简单修改app.js文件即可实现,这个过程中突然发现了整个开发程序的简洁性。

第二个问题是获取登录信息不成功,检查了多次语法之后,都没有找到问题所在。最后发现居然是因为网络原因。切换网络之后就好了。

最后是收藏不能及时更新,其实本来是可以正常自动更新的,在my.js中的函数使用的变量名是isLogin,但是在data中定义的是is_Login,可是又没有报错,一直卡了好久,最后终于发现了这个变量名字的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

now i see

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值