2024年《移动软件开发》实验五:高校新闻网

一、实现功能

(一)基本功能

(1)阅读新闻全文的页面需要显示新闻标题、图片、正文和日期;

(2)允许点击按钮将当前阅读的新闻添加到本地收藏夹中;

(3)已经收藏过的新闻也可以点击按钮取消收藏。

(二)额外功能

(1)开启云服务器,实现幻灯片、收藏、新闻云存储,表单如下;

表单名称存储内容
collect存储我收藏的新闻
news存储所有新闻
imageUrl幻灯片的url

(2)小程序首先通过本地缓存查看收藏的新闻,然后通过云存储获取收藏的新闻。并且将更新的内容存到本地缓存;

(3)点击幻灯片后,跳转到对应新闻的详细页面。

二、效果展示

(1)云数据库:

(2)主页:

(3)点击幻灯片,跳转详细页面:

(4)点击新闻条目,跳转详细页面:

(5)点击收藏:

(6)”我的“页面:

(7)登陆后

(8)点击收藏的新闻

(9)取消收藏

(10)返回页面

三、实现步骤

1.配置云环境:

(1)打开工程文件:

输入代码:

"cloudfunctionRoot": "cloud/",
(2)打开app.js文件:

输入代码:

App({
  onLaunch() {
    wx.cloud.init({
      env:"yulia2233-2g4nu70o1acaa6c0",
      traceUser:true
      })
  },
})

2.整体UI设计:

(1)导航栏设计:
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#328EEB",
    "navigationBarTitleText": "我的新闻网",
    "navigationBarTextStyle": "white"
  },
(2)toolBar设计:
 "tabBar": {
    "color": "#000",
    "selectedColor": "#328eeb",
    "list": [
      {
        "pagePath": "pages/index/index",
        "iconPath": "images/首页.png",
        "selectedIconPath": "images/首页(选中).png",
        "text": "首页"
      },
      {
        "pagePath": "pages/my/my",
        "iconPath": "images/我的.png",
        "selectedIconPath": "images/我的(选中).png",
        "text": "我的"
      }
    ]
  }

3.公共文件(增加了云开发,使用数据库存储news)

(1)导入数据库接口:

const db = wx.cloud.database().collection('news');

(2)编写获取新闻列表的函数(从云端获取)

//获取新闻列表
function getNewsList() {
  return new Promise((resolve, reject) => {
    // 获取数据库实例
    const db = wx.cloud.database();
    
    // 查询数据库中的新闻数据
    db.collection('news').get({
      success: function(res) {
        // 初始化一个空列表用于存储处理后的新闻数据
        let list = [];
        // 遍历从数据库中获取的数据
        for (let i = 0; i < res.data.length; i++) {
          let obj = {};
          obj.id = res.data[i].id;
          obj.poster = res.data[i].poster;
          obj.add_date = res.data[i].add_date;
          obj.title = res.data[i].title;
          list.push(obj);
        }
        console.log(list)
        // 返回处理后的新闻列表
        resolve(list)
      },
      fail: function(err) {
        console.error(err);
        reject(err);
      }
    });
  });
}
(2)获取新闻内容函数(云端获取):
function getNewsDetail(newsID) {
  return new Promise((resolve, reject) => {
    const db = wx.cloud.database();

    // 查询数据库中的新闻数据,匹配新闻ID
    db.collection('news').where({
      id: newsID
    }).get({
      success: function(res) {
        if (res.data.length > 0) {
          // 如果找到了匹配的新闻
          let msg = {
            code: '200', // 成功
            news: res.data[0] // 获取到的新闻内容
          };
          resolve(msg);
        } else {
          // 如果没有找到匹配的新闻
          let msg = {
            code: '404', // 没有对应的新闻
            news: {}
          };
          resolve(msg);
        }
      },
      fail: function(err) {
        // 如果数据库查询失败
        console.error('数据库查询失败', err);
        reject(err);
      }
    });
  });
}
(3)提供接口:
// 对外暴露接口
module.exports = {
  getNewsList: getNewsList,
  getNewsDetail: getNewsDetail
}

4.index"首页"逻辑修改(页面代码同原文件不变):

onLoad函数修改:因为读取数据库是异步处理,所以对函数进行修改:
  onLoad: function(options) {
    //获取新闻列表
    common.getNewsList().then(list => {
      console.log('主页的', list);
      //更新列表数据
      this.setData({
        newsList: list
      });
    }).catch(err => {
      console.error('获取新闻列表失败', err);
    });
  }

5."我的" 页面设计和逻辑

(1)页面设计:
<!--登录面板-->
<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 class="myFavorites">
  <text>我的收藏({{num}})</text>
  <!--收藏的新闻列表-->
  <view class="news-list">
    <view class="list-item" wx:for="{{newsList}}" wx:key="{{item.id}}" data-id="item.id">
      <image src="{{item.poster}}"></image>
      <text bindtap="goToDetail" data-id="{{item.id}}">{{item.title}} ———— {{item.add_date}}</text>
    </view>
  </view>
</view>
/*登录面板*/
.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;
}
/*新闻列表区域样式*/
/*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;
}
(2)逻辑设计:

获取用户信息:

  // 获取用户信息
  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() {
    const db = wx.cloud.database();
  
    // 查询数据库中的 collect 表单,获取所有收藏的新闻
    db.collection('collect').get({
      success: res => {
        let myList = res.data; // res.data 是包含所有收藏新闻记录的数组
        let num = myList.length;
  
        console.log('收藏列表', myList);
  
        // 更新收藏列表
        this.setData({
          newsList: myList,
          num: num
        });
      },
      fail: err => {
        console.error('获取收藏列表失败', err);
      }
    });
  },

跳转到新闻详细页面:

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

每次加载该页面的时候,刷新我的收藏:

  onShow:function() {
    //如果已经登录
    if(this.data.isLogin === true){
      console.log("更新列表")
    //更新收藏列表
      this.getMyfavorites()
    }
  },

6."详细"detail页面设计和逻辑:

(1)页面设计
<!--pages/detail/detail.wxml-->
<view class ="container">
  <view class = "title">{{artical.title}}</view>
  <view class = "poster">
    <image src="{{artical.poster}}" mode="widthFix"></image>
  </view>
  <view class="content">{{artical.content}}</view>
  <view class =" add_date">时间:{{artical.add_date}}</view>

  <button wx:if ='{{isAdd}}'plain bindtap= 'cancelFavorites'>❤已收藏</button>
  <button wx:else plain bindtap='addFavorites'>❤点击收藏</button>
</view>

/* pages/detail/detail.wxss */
/* pages/detail/detail.wxss */
/*整体容器*/
.container{
  padding: 15rpx;
  text-align: center;
}
/*新闻标题*/
.title{
  font-size: 14pt;
  line-height: 80rpx;
}

/*新闻图片*/
.poster image{
  width: 300px;
}

/*新闻正文*/
.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;
  margin-bottom: 50rpx;
}
(2)逻辑

添加收藏函数(存储到云端):

  /*添加收藏*/
  addFavorites:function () {
    let artical = this.data.artical
    wx.setStorageSync(artical.id, artical)    //将文章放入缓存区
    console.log("加入缓存",artical)
      // 将文章保存到数据库的 collect 表单中
    const db = wx.cloud.database();
  
    db.collection('collect').add({
      data: artical, // 直接将文章对象存入数据库
      success: res => {
        console.log('收藏成功,数据库记录ID:', res.id);
        this.setData({
          isAdd: true
        });
      },
      fail: err => {
        console.error('收藏失败', err);
      }
    });
    this.setData({
      isAdd:true
    })
  },

取消收藏函数(存储到云端):

/* 取消收藏 */
cancelFavorites: function() {
  let artical = this.data.artical;
  
  // 从本地缓存中移除
  wx.removeStorageSync(artical.id);
  
  // 从数据库的 collect 表单中删除
  const db = wx.cloud.database();
  
  // 使用文章 ID 删除记录
  db.collection('collect').where({
    id: artical.id
  }).remove({
    success: res => {
      console.log('取消收藏成功', res);
      this.setData({
        isAdd: false
      });
    },
    fail: err => {
      console.error('取消收藏失败', err);
    }
  });
}

加载页面:

如果是收藏的内容,则直接从缓存中读取;否则要在数据库云端读取。

  onLoad(options) {
    let id = options.id
    //检查当前新闻是否在收藏夹中
    var newartical = wx.getStorageSync(id)
    //存在
    if(newartical != '')
    {
      this.setData({
        isAdd:true,
        artical:newartical
      })
    }
    //不存在
    else{
      common.getNewsDetail(id).then(result => {
        console.log(result);
        if (result.code == '200') {
          this.setData({
            artical: result.news,
            isAdd: false
          });
        }
      }).catch(err => {
        console.error('获取新闻详情失败', err);
      });
    }
  },

四、遇到问题

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

问题:在index中调用该getNewsList函数,获取云数据库中的数据时,报错error-50110

解决方案:获取数据库中的数据时异步操作,需要等待Promise,完成后返回list并接收:

收获和体会:学会了使用微信云开发,学会了页面设计

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值