一、实验目标
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,可是又没有报错,一直卡了好久,最后终于发现了这个变量名字的问题。