前端论坛小程序参考

138 阅读3分钟

01. 情书站点

第一个项目是校园小情书的微信小程序,该项目功能包括表白墙、树洞、校园论坛。

项目地址:

后端:GitHub - oubingbing/wechatAlliance: 微信小程序--校园小情书后台源码,好玩的表白墙,告白墙。

前端:GitHub - oubingbing/school_wechat: 校园小情书前端代码,好玩的表白墙、树洞、校园论坛,可独立部署,也可以使用我部署的后台服务,毕业设计的好项目。

02. vue论坛

1. 主要功能:

  • 论坛帖子查看、收藏
  • 登陆发布新帖子
  • 评论和消息管理

2. 目录结构

|——README.md          <= 项目介绍
|——app.js             <= 主要逻辑文件
|——app.json           <= 全局配置文件
|——app.wxss           <= 公共样式文件 
|——component          <= 组件库
|  |——timeTeanslate   <= 时间格式转换组件
|  |——wxParse         <= 富文本解析组件
|  |——weui            <= weui样式库
|——pages              <= 页面文件
|  |——detail
|  |——index           
|  |——user
|  |——api.js          <= 接口文件
|  |——const.js        <= 常量定义文件
|——static             <= 静态资源
|  |——image
复制代码

3. 效果演示

3.1 主页

3.2 文章详情

3.3 登陆

3.4 个人中心

3.5 发布文章

3.6 我的收藏

3.7 我的消息

4.总结

4.1 小程序的基本功能

  • 小程序的文件类型:
js ---------- 主要逻辑
json -------- 项目配置文件,负责窗口颜色等等
wxml ------- 类似HTML文件
wxss ------- 类似CSS文件

复制代码
  • 创建一个页面:

在page文件夹下创建一个页面的文件夹,里面新建4个必要的基本文件,然后再app.json中配置路由:

{
  "pages":[
    "pages/index/index",
    "pages/detail/detail",
    "pages/user/user/user",
    "pages/user/login/login",
    "pages/user/message/message",
    "pages/user/collect/collect",
    "pages/user/newtopic/newtopic"
  ]
}

复制代码
  • 发起一个API请求:
    wx.request({
      url: API.API.Post_mark_all,    // 请求url
      method: 'POST',                // 请求方式
      data: {
        'accesstoken': token         // 参数
      },
      success: function (res) {
        if (res.data.success) {
          wx.showToast({
            title: '标记成功',
            icon: 'success',
            duration: 1000
          })
          that.getMessage()
        }else {
          wx.showToast({
            title: res.data.error_msg,
            icon: 'success',
            duration: 1000
          })
复制代码
  • 本地缓存 由于没有类似Vuex的状态管理工具,一些公用的数据保存在本地缓存中,例如登陆的状态、accesstoken、用户的信息等。 操作本地缓存的方法有:
// 设置
wx.setStorage()   //异步
wx.setStorageSync() //同步
// 获取
wx.getStorage()   //异步
wx.getStorageSync() //同步
//清除
wx.clearStorage()   //异步
wx.clearStorageSync() //同步

复制代码
  • 页面的生命周期的方法:
onLoad   //页面加载
onReady  //页面渲染完成
onShow   //页面显示
onHide   //页面隐藏
onUnload  //页面卸载
复制代码

4.2 未实现的功能

由于时间原因,以下2个功能尚未完成:

  • 针对于某个特定用户的回复功能
  • 点赞功能

4.3 有待优化的地方

  • 文章的富文本解析
  • 小程序的状态管理

4.4 个值得推荐的组件和库

  • wxParse 富文本解析组件
  • weui 微信官方UI库

最后

项目的github地址:

作者:NeroHua
链接:juejin.cn/post/684490…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

03. 论坛小程序

功能分析

该小程序功能目前较为简单(发布帖子、浏览帖子、发布评论)

image.png

由架构图可知,云开发的数据库(存帖子、存评论)、存储(图片)、云函数(读、写、更新数据库等)都将涉及,很好地达到了练手的目的

发布帖子

如果帖子不带图片,直接写数据库即可,如果带图片则需要先存入图片到云开发提供的存储中,拿到返回的fileId(可理解为图片的url)再一并写入数据库,核心代码:

    for (let i = 0; i < img_url.length; i++) {
      var str = img_url[i];
      var obj = str.lastIndexOf("/");
      var fileName = str.substr(obj + 1)
      console.log(fileName)
      wx.cloud.uploadFile({
        cloudPath: 'post_images/' + fileName,//必须指定文件名,否则返回的文件id不对
        filePath: img_url[i], // 小程序临时文件路径
        success: res => {
          // get resource ID: 
          console.log(res)
          //把上传成功的图片的地址放入数组中
          img_url_ok.push(res.fileID)
          //如果全部传完,则可以将图片路径保存到数据库
          if (img_url_ok.length == img_url.length) {
            console.log(img_url_ok)
            that.publish(img_url_ok)
          }
        },
        fail: err => {
          // handle error
          console.log('fail: ' + err.errMsg)
        }
      })
    }  

通过img_url_ok.length == img_url.length我们确定所有图片已经上传完成并返回了对应的id,然后执行写入数据库的操作:

  /**
   * 执行发布时图片已经上传完成,写入数据库的是图片的fileId
   */
  publish: function(img_url_ok) {
    wx.cloud.init()
    wx.cloud.callFunction({
      name: 'publish_post',
      data: {
        openid: app.globalData.openId,// 这个云端其实能直接拿到
        author_name: app.globalData.userInfo.nickName,
        content: this.data.content,
        image_url: img_url_ok,
        publish_time: "",
        update_time: ""//目前让服务器自己生成这两个时间
      },
      success: function (res) {
        // 强制刷新,这个传参很粗暴
        var pages = getCurrentPages();             //  获取页面栈
        var prevPage = pages[pages.length - 2];    // 上一个页面
        prevPage.setData({
          update: true
        })
        wx.hideLoading()
        wx.navigateBack({
          delta: 1
        })
      },
      fail: console.error
    })
  },

通过wx.cloud.callFunction我们调用了一个云函数(通过name指定函数名),并将帖子内容content和图片image_url以及其他信息(发布者昵称、id等)一并传到云端。然后再看看这个云函数:

exports.main = async (event, context) => {
  try {
    return await db.collection('post_collection').add({
      // data 字段表示需新增的 JSON 数据
      data: {
        // 发布时小程序传入
        //author_id: event.openid,不要自己传,用sdk自带的
        author_id: event.userInfo.openId,
        author_name: event.author_name,
        content: event.content,
        image_url: event.image_url,
        // 服务器时间和本地时间会造成什么影响,需要评估
        publish_time: new Date(),
        // update_time: event.update_time,// 最近一次更新时间,发布或者评论触发更新,目前用服务器端时间
        update_time: new Date(),
        // 默认值,一些目前还没开发,所以没设置
        // comment_count: 0,//评论数,直接读数据库,避免两个数据表示同一含义
        watch_count: 3,//浏览数
        // star_count: 0,//TODO:收藏人数
      }
    })
  } catch (e) {
    console.error(e)
  }
}

可以看到,云函数写入了一条数据库记录,我们的参数通过event这个变量带了进来。

获取帖子列表

所谓获取帖子列表其实就是读上一节写入的数据库,但是我们并不需要全部信息(例如图片url),并且要求按照时间排序,如果熟悉数据库的话,会发现这又是一条查询语句罢了:

exports.main = async (event, context) => {
  return {
    postlist: await db.collection('post_collection').field({// 指定需要返回的字段
      _id: true,
      author_name: true,
      content: true,
      title: true,
      watch_count: true
    }).orderBy('update_time', 'desc').get(),//指定排序依据

  }
}

浏览帖子内容

浏览帖子内容及给定一个帖子的id,由帖子列表点击时带入:

  onItemClick: function (e) {
    console.log(e.currentTarget.dataset.postid)
    wx.navigateTo({
      url: '../postdetail/postdetail?postid=' + e.currentTarget.dataset.postid,
    })
  },

然后在云函数中根据这个id拿到全部数据:

exports.main = async (event, context) => {
  
  return {
    postdetail: await db.collection('post_collection').where({
      _id: event.postid
    }).get(),
  }
}

拿到全部数据后,再根据图片id去加载贴子的图片:

    // 获取内容
    wx.cloud.callFunction({
      // 云函数名称 
      name: 'get_post_detail',
      data: {
        postid: options.postid
      },
      success: function (res) {
        var postdetail = res.result.postdetail.data[0];
        that.setData({
          detail: postdetail,
          contentLoaded: true
        })
        that.downloadImages(postdetail.image_url)
      },
      fail: console.error
    })

这里that.downloadImages(postdetail.image_url)即加载图片:

  /**
   * 从数据库获取图片的fileId,然后去云存储下载,最后加载出来
   */
  downloadImages: function(image_urls){
    var that = this
    if(image_urls.length == 0){
      return
    } else {
      var urls = []
      for(let i = 0; i < image_urls.length; i++) {
        wx.cloud.downloadFile({
          fileID: image_urls[i],
          success: res => {
            // get temp file path
            console.log(res.tempFilePath)
            urls.push(res.tempFilePath)
            if (urls.length == image_urls.length) {
              console.log(urls)
              that.setData({
                imageUrls: urls,
                imagesLoaded: true
              })
            }
          },
          fail: err => {
            // handle error
          }
        })
      }
    }
  },

发表评论

发表评论和发布帖子逻辑类似,只是写入的数据不同,不做赘述。

04. 校园论坛

链接:(10条消息) 基于微信小程序的校园论坛系统开发过程_前端晓晓的博客-CSDN博客_微信小程序搭建论坛