姓名和学号? | |
---|---|
本实验属于哪门课程? | 中国海洋大学22夏《移动软件开发》 |
实验名称? | 实验4:高校新闻网 |
博客地址? | https://blog.csdn.net/weixin_51703554 |
Github仓库地址? |
(备注:将实验报告发布在博客、代码公开至 github 是 加分项,不是必须做的)
一、实验目标
1、综合所学知识创建完整的前端新闻小程序项目;能够在开发过程中熟练掌握真机预览、调试等操作。
二、实验步骤
1、新建项目
2、页面配置
创建其他文件
3、视图设计
1、导航栏设计
在app.json对导航栏进行重新配置
"window":{
"navigationBarBackgroundColor": "#328EEB",
"navigationBarTitleText": "我的新闻网",
"navigationBarTextStyle":"white"
},
2、tabBar设计
在app.json中追加相关属性代码
"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": "我的"
}
]
}
3、页面设计
(1)主页设计
<!--幻灯片滚动-->
<swiper indicator-dots autoplay interval="5000" duration="500"></swiper>
<!--新闻列表-->
<view id='news-list'>这是新闻列表</view>
/*新闻列表区域样式*/
/*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;
}
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 : [
{id: '264698',
title: '省退役军人事务厅来校交流对接工作',
poster: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg',
add_date: '2022-08-19'}
]
},
(2)个人中心页设计
<!--登陆面板-->
<view id='myLogin'>
<block>
<image id="myIcon" src='{{src}}'></image>
<text id='nickName'>{{nickNmae}}</text>
</block>
</view>
<!--我的收藏-->
<view id='myFavorites'>
<text>我的收藏(1)</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>{{news.title}}——{{news.add_date}}</text>
</view>
</view>
</view>
data: {
nickName:'未登录',
src:'/images/index.png',
newsList:[{
id: '264698',
title: '省退役军人事务厅来校交流对接工作',
poster: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg',
add_date: '2022-08-19'
}]
},
(3)新闻页设计
<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>
</view>
/* 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;
}
article:{
id: '264698',
title: '省退役军人事务厅来校交流对接工作',
poster: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg',
content: ' 8月19日,省退役军人事务厅二级巡视员蔡元和、办公室主任刘恒贵、就业创业处副处长钟俊武一行来校就联合共建安徽退役军人学院事宜进行交流对接。校党委常委、副校长陆林,芜湖市退役军人事务局党组成员、副局长张桂芬,学校办公室、人事处、教务处、招就处、学生处、研究生院、体育学院负责同志参加会议。',
add_date: '2022-08-19'
}
4、逻辑实现
1、公共逻辑
将数据放在公共common.js文件中。
在common.js中添加自定义函数getNewList和getNewsDetail,用于获取新闻列表信息和指定ID的新闻正文内容。
//获取新闻列表
function getNewsList() {
let list = [];
for (var i = 0; i < news.length; i++) {
let obj = {};
obj.id = news[i].id;
obj.poster = news[i].poster;
obj.add_date = news[i].add_date;
obj.title = news[i].title;
list.push(obj);
}
return list; //返回新闻列表
}
//获取新闻内容
function getNewsDetail(newsID) {
let msg = {
code: '404', //没有对应的新闻
news: {}
};
for (var i = 0; i < news.length; i++) {
if (newsID == news[i].id) { //匹配新闻id编号
msg.code = '200'; //成功
msg.news = news[i]; //更新当前新闻内容
break;
}
}
return msg; //返回查找结果
}
最后在common.js中使用moudle.exports语句暴露函数出口
// 对外暴露接口
module.exports = {
getNewsList: getNewsList,
getNewsDetail: getNewsDetail
}
2、首页逻辑
新闻列表展示
新闻列需要在页面js文件的onload函数获取新闻列表,并更新到data属性的newList参数中
onLoad: function (options) {
let list=common.getNewsList()
this.setData({newsList:list})
},
点击跳转新闻内容
<text bindtap="gotoDetail" data-id="{{news.id}}">{{news.title}}——{{news.add_date}}</text>
函数在index.js和detail.js中创建
//自定义函数
goToDetail:function(e){
let id = e.currentTarget.dataset.id;
wx.navigateTo({
url: '../detail/detail?id='+id
})
},
同时还需要在detail.js创建onload的函数,显示对应新闻
onLoad: function (options) {
let id = options.id
let result = common.getNewsDetail(id)
if(result.code=='200'){
this.setData({article:result.news})
}
},
3、新闻页逻辑
添加/取消新闻收藏
修改detail.wxml代码,追加两个button组件为收藏新闻的按键
<button wx:if="{{isAdd}}" plain bindtap="cancelFavorites">❤已收藏</button>
<button wx:else plain bindtap='addFavorites'>🤍点击收藏</button>
onLoad: function (options) {
let id = options.id
var article=wx.getStorageSync(id)
if(article!=''){
this.setData({
article:article,
isAdd:true
})
}
else{
let result = common.getNewsDetail(id)
if(result.code=='200'){
this.setData({
article:result.news,
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
})
},
4、个人中心页逻辑
1、获取微信用户信息
<view id='myLogin'>
<block wx:if="{{isLogin}}">
<image id="myIcon" src='{{src}}'></image>
<text id='nickName'>{{nickName}}</text>
</block>
<button wx:else>未登录,点此登录</button>
</view>
// 获取用户信息
getMyInfo: function(e) {
// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,
// 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
wx.getUserProfile({
desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
console.log(res)
this.setData({
isLogin:true,
src: res.userInfo.avatarUrl,
nickName: res.userInfo.nickName
});
// this.getMyFavourites();
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
if (wx.getUserProfile) {
this.setData({
canIUseGetUserProfile: true
})
}
},
2、获取收藏列表
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);
}
whis.setData({
newsList:myList,
num:num
});
},
3、浏览收藏的新闻
//自定义函数
goToDetail:function(e){
let id = e.currentTarget.dataset.id;
wx.navigateTo({
url: '../detail/detail?id='+id
})
},
三、程序运行结果
四、问题总结与体会
问题:
1、版本问题导致登录与教程不同,最终参考实验一的方法完成此部分内容
2、缓冲区中会存有以前的日志,会影响收藏数目,需要对其进行清空
3、在my.js中忘记加入num变量,导致程序出错,找了好长时间
收获:
播放幻灯片,使其自动播放,可以使主页更加美观
学习到了如果页面之间的逻辑还没有写完,想要调试一个页面,可以添加编译模式,来对特定页面进行编译和显示
同时也了解到了一些缓冲区的知识,了解了setStorageSync、getStorageSync、removeStorageSync等函数
使用wx:for进行循环,wx:if或else实现条件判断
再此用到登录获取用户信息,对于登录函数进行一个复习
综合所学知识创建完整的前端新闻小程序项目,为今后的学习打下坚实的基础