一、程序效果实现
二、实验目标
1、结合所学知识创建完整的前端新闻小程序;2、能够在开发过程中熟练掌握调试、真机预览
三、实验步骤
列出实验的关键步骤、代码解析、截图。
1.创建项目,删除模板中自带的多余的代码
2.在app.json中修改pages属性,Ctrl+s保存即可生成另外两个子文件
{
"pages": [
"pages/index/index",
"pages/detail/detail",
"pages/my/my"
],
3.添加图片素材,创建images文件夹,选择资源文件打开,把图片素材复制粘贴到里面。
同上,创建utils文件,存放公共js文件。
图片和js资源:https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/demo4_file.zip
4.导航栏设计:
在app.json中:
{
"pages": [
"pages/index/index",
"pages/detail/detail",
"pages/my/my"
],
"window": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "我的新闻网",
"navigationBarBackgroundColor": "#328EEB"
},
}
编译运行效果:
5.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": "我的"
}
]
}
编译运行效果:
6.页面设计:
在index.wxml中设计幻灯片播放和新闻列表:
<swiper indicator-dots="true" autoplay interval="5000" duration="500">
<block wx:for="{{swiperImg}}"wx:key='swiper{{index}}'>
<swiper-item>
<image src="{{item.src}}"class='slide-image'/>
</swiper-item>
</block>
</swiper>
<view id='new-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>
在index.wxss调整布局参数中:
swiper{
height:400rpx;
}
/*1-2 swiper 中的图片*/
swiper image{
width:100%;
height:100%;
}
/*新闻列表区城样式*/
/*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.js文件中添加临时数据,用来检验代码效果:
data: {
//幻灯片素材
swiperImg: [
{src:'/images/newsimage1.jpg'},
{src: '/images/newsimage2.jpg'},
{src: '/images/newsimage3.jpg'}
],
newsList:[{
id: '264698',
title: '省退役军人事务厅来校交流对接工作',
poster: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg',
content: ' 8月19日,省退役军人事务厅二级巡视员蔡元和、办公室主任刘恒贵、就业创业处副处长钟俊武一行来校就联合共建安徽退役军人学院事宜进行交流对接。校党委常委、副校长陆林,芜湖市退役军人事务局党组成员、副局长张桂芬,学校办公室、人事处、教务处、招就处、学生处、研究生院、体育学院负责同志参加会议。',
add_date: '2022-08-19'}]
},
编译运行后结果:
7.个人中心页面设计:
在my.wxml中:
<view id='mylogin'>
<block>
<image id='myIcon'src='{{src}}'></image>
<text id='nickname'>{{nickName}}</text>
</block>
</view>
<view id='myFavorites'>
<text>我的收藏</text>
<view id='new-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>
在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;
}
/*我的收藏*/
.myFavorites{
padding: 20rpx;
}
由于新闻列表样式与index中完全相同,我们直接把index.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;
}
在my.js中添加临时数据:
data: {
nickName:'未登录',
src:'/images/index.png',
newsList:[{
id: '264698',
title: '省退役军人事务厅来校交流对接工作',
poster: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg',
content: ' 8月19日,省退役军人事务厅二级巡视员蔡元和、办公室主任刘恒贵、就业创业处副处长钟俊武一行来校就联合共建安徽退役军人学院事宜进行交流对接。校党委常委、副校长陆林,芜湖市退役军人事务局党组成员、副局长张桂芬,学校办公室、人事处、教务处、招就处、学生处、研究生院、体育学院负责同志参加会议。',
add_date: '2022-08-19'}]
},
编译运行后的结果:
8.新闻页设计:
由于我们目前没制作从 首页’index’到 新闻页’detail’的逻辑,所以我们将编译模式从’普通编译’调为’添加编译模式’,然后确定,即可直接编译运行新闻页
9.设计新闻页:
在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>
</view>
在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;
}
在js中添加临时数据来预览效果:
data: {
article:{
id: '264698',
title: '省退役军人事务厅来校交流对接工作',
poster: 'https://gaopursuit.oss-cn-beijing.aliyuncs.com/2022/newsimage1.jpg',
content: ' 8月19日,省退役军人事务厅二级巡视员蔡元和、办公室主任刘恒贵、就业创业处副处长钟俊武一行来校就联合共建安徽退役军人学院事宜进行交流对接。校党委常委、副校长陆林,芜湖市退役军人事务局党组成员、副局长张桂芬,学校办公室、人事处、教务处、招就处、学生处、研究生院、体育学院负责同志参加会议。',
add_date: '2022-08-19'}
},
编译后运行效果如下:
10.逻辑实现:
创建utils文件夹,导入已经编写好的common.js文件,然后在每一个js文件的顶端引用公有js文件:
var common = require('../../utils/common.js')
11.首页:逻辑实现获取新闻列表
在index.js中:
onLoad: function(options) {
//获取新闻列表
let list = common.getNewsList()
//更新列表数据
this.setData({
newsList: list
})
},
12.逻辑实现跳转新闻:
在index.wxml中实现点击效果:
<view id='new-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>
在detail.js中:
goToDetail: function(e) {
//获取携带的data-id数据
let id = e.currentTarget.dataset.id;
console.log(id)
//携带新闻id进行页面跳转
wx.navigateTo({
url: '../detail/detail?id=' + id
})
},
onLoad(options) {
let id=options.id;
let result=common.getNewsDetail(id)
if(result.code=='200'){
this.setData({article:result.news})
}
},
编译运行效果如下:
13.新闻收藏和取消逻辑实现:
在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中:
button{
width:250rpx;
height:100rpx;
margin:20rpx auto;
}
在js文件中实现对用的逻辑:
onLoad(options) {
let id = options.id
console.log(id)
//检查当前新闻是否在收藏夹中
var newartical = wx.getStorageSync(id)
//存在
if(newartical != '')
{
this.setData({
isAdd:true,
artical:newartical
})
}
//不存在
else{
let result = common.getNewsDetail(id)
console.log(result)
//获取新闻内容
if(result.code == '200'){
this.setData({
artical:result.news,
isAdd:false
})
}
}
},
/*添加收藏*/
addFavorites:function () {
let artical = this.data.artical
wx.setStorageSync(artical.id, artical) //将文章放入缓存区
this.setData({
isAdd:true
})
},
/*取消收藏 */
cancelFavorites:function() {
let artical = this.data.artical
wx.removeStorageSync(artical.id)
this.setData({
isAdd:false
})
},
编译运行效果如下:
14.实现个人中心的逻辑:
获取微信信息:
在my.wxml中:
<!--pages/my/my.wxml-->
<view class="myLogin">
<block wx:if="{{isLogin}}">
<image class="myIcon" src="{{src}}"></image>
<text class="nickName">{{nickName}}</text>
</block>
<button wx:else open-type="getUserInfo" bindtap="getMyInfo">未登录,点此登录</button>
</view>
<view id='myFavorites'>
<view id='new-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>
在js中添加函数:
getMyInfo: function(e) {
wx.getUserProfile({
desc: '展示用户信息',
success: (res) => {
console.log(res)
this.setData({
isLogin: true,
src: res.userInfo.avatarUrl,
nickName: res.userInfo.nickName
})
}
})
// this.getMyfavorites();
},
15.收藏列表逻辑实现:
在my.wxml中:
<text>我的收藏({{num}})</text>
对应,在detail.js中date内添加:
num:0,
在my.js中追加函数:
// 获取用户信息
getMyInfo: function(e) {
wx.getUserProfile({
desc: '展示用户信息',
success: (res) => {
console.log(res)
this.setData({
isLogin: true,
src: res.userInfo.avatarUrl,
nickName: res.userInfo.nickName
})
}
})
this.getMyfavorites();
},
//获取收藏列表
getMyfavorites:function(){
let info = wx.getStorageInfoSync();
let keys = info.keys;
let num = keys.length;
console.log(keys)
let myList = [];
for(var i = 0;i<num-1;i++){
let obj = wx.getStorageSync(keys[i]);
myList.push(obj);
}
//更新收藏列表
this.setData({
newsList:myList,
num:num-1
})
},
onShow:function() {
//如果已经登录
if(this.data.isLogin === true){
console.log("更新列表")
//更新收藏列表
this.getMyfavorites()
}
},
然后给收藏列表的新闻添加点击再浏览的功能,在my.wxml中:
<view id='myFavorites'>
<text>我的收藏({{num}})</text>
<view id='new-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.js中:
goToDetail:function(e){
//获取携带的data-id数据
let id = e.currentTarget.dataset.id;
//携带新闻的ID进行页面的跳转
wx.navigateTo({
url: '../detail/detail?id='+id
})
},
编译运行即可:
四、问题总结与体会
本次实验着重于逻辑实现和代码从0的迭代设计过程,使我的逻辑能力和动手能力得到了很大的提高。
同时,也发现了老师留下的问题:detail 页面的 wxss 文件中, .poster image 中的 width 设置为 100% 的话,图片总是无法显示。修改为 700rpx 就可以显示,我不清楚什么原因,大家如果知道为什么可以告诉我。
问题反思:.poster的父级容器为.container,使用了 mode="widthFix"
,它会按照宽度进行缩放,高度自动变化。如果图片的宽度设置为 100%
,但父容器宽度异常(如为 0),图片可能无法正常显示。
额外功能:
按照海大首页三个新闻重新整理:“中国海大志愿者完成第五届跨国公司领导人青岛峰会志愿服务”,“贵州省人大干部综合能力提升培训班在中国海洋大学举办”,“中国海洋大学开展2024级本科生集中入学教育”
完成截图: