微信小程序,实现一个简易的新闻网

废话不多说,先上效果图,功能实现了广播、轮播图、登入微信用户、获取收藏列表、获取新闻详情页面、页面跳转…
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
项目结构图:
在这里插入图片描述
模拟数据库页面data

data.js

/**存放公共js文件 */
//临时新闻数据
const news = [{
  id: '1',
  title: '标题一',
  
  poster: '在线图片链接地址',
  add_date: '2022-05-07',
  detail: '详细内容'
},
{
  id: '2',
  title: '标题2',
  poster: '在线图片链接地址',
  add_date: '2022-05-08',
  detail:'详细内容'
},
{
  id: '3',
  title: '标题三',
  poster: '在线图片链接地址',
  add_date: '2022-05-09',
  detail:'详细内容'
}
]

//获取新闻列表
function getNewList() {
let list = [];
for(var i = 0; i < news.length; i++) {
  let obj = {};
  obj.id = news[i].id;
  obj.poster = news[i].poster;
  obj.content = news[i].detail;
  obj.add_date = news[i].add_date;
  obj.title = news[i].title;
  // console.log('obj',obj);
  list.push(obj);
}
return list;
}

//获取新闻内容
function getNewsDetail(newsID) {
let message = {
  code: '404',
  news: {}
};
for (var i = 0; i < news.length; i++) {
  if (newsID == news[i].id) {
    message.code = '200',
      message.news = news[i];
    break;
  }
}
return message;
}

module.exports = {
getNewList : getNewList,
getNewsDetail : getNewsDetail
}

app.json

{
  "pages": [
    "pages/index/index",
    "pages/mefa/mefa",
    "pages/details/details",
    "data/data.js"
  ],
  "window": {
    "backgroundColor": "#F6F6F6",
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#328EEB",
    "navigationBarTitleText": "大学新闻网",
    "navigationBarTextStyle": "black"
  },
  "tabBar": {
    "list": [
      {
        "text": "首页",
        "pagePath": "pages/index/index",
        "iconPath": "images/1a.png",
        "selectedIconPath": "images/1b.png"
      },
      {
        "text": "我的",
        "pagePath": "pages/mefa/mefa",
        "iconPath": "images/3a.png",
        "selectedIconPath": "images/3b.png"
      }
    ]
  },
  "sitemapLocation": "sitemap.json",
  "style": "v2"
}

index.js

var common = require('../../data/data.js')
Page({

  /**
   * 页面的初始数据
   */
  data: {
      imageUrl:[
        "../../images/b.jpg",
        "../../images/c.jpg",
        "../../images/d.jpg"
      ],
      indicatorDots:true,        // 是否显示面板指示点
      indicatorColor:'rgba(0, 0, 0, .3)',    // 指示点颜色
      indicatorActiveColor:'rgba(0, 0, 0,1)',    // 当前选中的指示点颜色
      autoplay:true,    // 是否是自动切换
      current:0,    // 初始展示的图片
      interval:3000,   // 自动切换时间间隔
      duration:1000,   // 播放时长
      vertical:false,  // 滑动方向是否为纵向(默认false)
      circular:false,  // 是否采用衔接滑动
      previousMargin:"20px",  // 前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值
      nextMargin:"20px",     // 后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值
      snapToEdge:true,        // 当 swiper-item 的个数大于等于 2,关闭 circular 并且开启 previous-margin 或 next-margin 的时候,可以指定这个边距是否应用到第一个、最后一个元素
      displayMultipleItems:"2",  // 同时显示的滑块数量(同屏轮播多个图片)
      easingFunction:"easeInOutCubic",  // 指定 swiper 切换缓动动画类型(default--默认值,linear--线性动画,easeInCubic--缓入动画,easeOutCubic--缓出动画,easeInOutCubic--缓入缓出动画)  
      newsList:[]
  },
  goToDetail:function(e){
    //获取携带data-id的数据
    let id = e.currentTarget.dataset.id
    //携带新闻ID进行页面跳转
    wx.navigateTo({
        url:'../details/details?id='+id,
    })
},
/**生命周期函数--监听页面加载*/
onLoad:function (options) {
  let list = common.getNewList( )
  this.setData({
      newsList:list
  })
},
})

index.wxml

<van-notice-bar left-icon="volume-o" text="欢迎来到大学新闻网,本网收录一切大学校园的精彩新闻故事!" />
<swiper indicator-dots="{{indicatorDots}}" indicator-color="{{indicatorColor}}" indicator-active-color="{{indicatorActiveColor}}" autoplay="{{autoplay}}" current="{{current}}" circular="false" interval="{{interval}}" duration="{{duration}}">
  <block wx:for="{{imageUrl}}">
    <swiper-item>
      <image src="{{item}}"></image>
    </swiper-item>
  </block>
</swiper>
<view class="maintop">
  <view class="main1">
    <view class="a1">
      <view class="tupian1">
        <image src="../../images/a.png" />
      </view>
      <view class="wenzi">校园书刊</view>
    </view>
    <view class="a2">
      <view class="tupian1">
        <image src="../../images/b.png" />
      </view>
      <view class="wenzi">名人传记</view>
    </view>
    <view class="a3">
      <view class="tupian1">
        <image src="../../images/c.png" />
      </view>
      <view class="wenzi">民间传说</view>
    </view>
  </view>
  <view class="main2">
    <view class="a1">
      <view class="tupian1">
        <image src="../../images/d.png" />
      </view>
      <view class="wenzi">历史文化</view>
    </view>
    <view class="a2">
      <view class="tupian1">
        <image src="../../images/e.png" />
      </view>
      <view class="wenzi">歇后语</view>
    </view>
    <view class="a3">
      <view class="tupian1">
        <image src="../../images/f.png" />
      </view>
      <view class="wenzi">诗词</view>
    </view>
  </view>
</view>
<!--新闻列表-->
<view id='news-list'>
  <view class='list-item' wx:for="{{newsList}}" wx:for-item="news" wx:key="{{item.id}}">
      <image src="{{news.poster}}"></image>
      <text bindtap='goToDetail' data-id="{{news.id}}">{{news.title}}
        ——{{news.add_date}}</text>
  </view>
</view>

index.wxss

swiper,swiper-itemm,swiper-item image{
  width: 100%;
  height: 400rpx;
}
image{
  width: 30%;
  height: 50%;
}
.maintop{
height: 300rpx;
width: 90%;
margin-left: 5%;
margin-top: 5%;
border-radius: 5px;
background-color:beige;
}
.main1{
  height: 150rpx;
  width: 100%;
}
.main2{
  height: 150rpx;
  width: 100%;
}
.main3{
  height: 150rpx;
  width: 100%;
}
.a1{
  float: left;   
  width: 30%;
  height: 100%;
}
.a2{
  float: left; 
  margin-left: 5%;  
  width: 30%;
  height: 100%;
}
.a3{
  margin-left: 5%;
  float: left;   
  width: 30%;
  height: 100%;
}
.tupian1
{
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 70%;
}
.wenzi
{
  display: flex;
  justify-content: center;
  font-size: 12px;
  width: 100%;
  height: 30%;

}

/*news-list组件*/
#news-list{
  min-height: 600rpx;
  padding: 15rpx;
  margin-top: 20rpx;
}
/**/
.list-item{
  display: flex;
  flex-direction: row;
  border-bottom: 1rpx solid gray;
}
.list-item image{
  width: 230rpx;
  height: 150rpx;
  margin: 10rpx;
}
.list-item text{
  width: 100%;
  line-height: 60rpx;
  font-size: 12pt;
}


mefa.js

Page({
  data: {
      isLogin: false,
      number: 0,
      nickName: "未登录",
      src: "../../images/login.png",
      newsList: [],
  },
  getUserProfile(e) {
      wx.getUserProfile({
        desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
        success: (res) => {
          //   console.log("用户信息",res)
            let info = res.userInfo
          this.setData({
              src:info.avatarUrl,
              nickName:info.nickName,
              isLogin:true
          });
          //获取新闻列表
          this.getMyFavorites()
        }
      })
    },
  //更新number
  getMyFavorites: function () {
      let info = wx.getStorageInfoSync() //读取本地缓存信息
      console.log('更新number', info);
      let keys = info.keys //获取全部key信息
      let num = keys.length //获取收藏新闻数量
      let myList = [];
      for (var i = 0; i < num; 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: '../details/details?id=' + id,
      })
  },
  onShow: function () {
      if (this.data.isLogin) {
          this.getMyFavorites()
      }
  },
})

mefa.wxml

<!--登陆页面-->
<view class="myLogin">
  <block wx:if="{{isLogin}}">
    <image src="{{src}}"></image>
    <text>{{nickName}}</text>
  </block>

  <button wx:else bindtap="getUserProfile">未登录,点此登录</button>
</view>
<!--收藏列表-->
<view class="myFavorite">
  <text>我的收藏({{number}})</text>
  <view id='news-list'>
    <view class='list-item' wx:for="{{newsList}}" wx:for-item="news" wx:key="{{item.id}}">
      <image src="{{news.poster}}"></image>
      <text bindtap='goToDetail' data-id="{{news.id}}">{{news.title}}
        ——{{news.add_date}}</text>
    </view>
  </view>
</view>

mefa.wxss

.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;
}
/*news-list组件*/
#news-list{
  min-height: 600rpx;
  padding: 15rpx;
  margin-top: 20rpx;
}
/**/
.list-item{
  display: flex;
  flex-direction: row;
  border-bottom: 1rpx solid gray;
}
.list-item image{
  width: 230rpx;
  height: 150rpx;
  margin: 10rpx;
}
.list-item text{
  width: 100%;
  line-height: 60rpx;
  font-size: 12pt;
}

details.js

var common = require('../../data/data.js')
Page({
    data: {
        article: {},
        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{
        else{
            let result = common.getNewsDetail(id)//获取新闻内容
            console.log(result.news)
            if(result.code == '200'){
                this.setData({
                    article:result.news,
                    isAdd :false
                })
            }
        }
    },
    
})

details.wxml

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

details.wxss

/* pages/detail/detail.wxss */
.container {
  padding: 15rpx;
}

.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;
}
  • 12
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

誓言唯美RQL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值