借助云开发搭建专属技术博客小程序丨实战

▌导语

一直对小程序开发很感兴趣,之前就准备做一款属于自己的小程序,无奈还需要购买云服务器和部署后台,有点麻烦,自从知道有了云开发这个免去服务器搭建和运维的一站式后端云服务“神器”,就一鼓作气花了几个周末的时间做了一款自己的博客小程序,如果你也想打造一款自己的博客,那你阅读这篇文章就够啦。

▌博客小程序介绍

主要功能:

包括文章的发布及浏览、评论、点赞、浏览历史、分类、排行榜、分享、生成海报图等。

效果展示:

▌数据库设计

数据库主要就7张表,分别为:用户表,分类表,文章表,文章内容表,评论表,点赞表,历史浏览表。

▌评论功能设计

以文章评论功能为例,我们来看看代码以及小程序云开发的整个流程。

1. 实现思路

一开始的实现思路是准备搞两张表,一张评论主表,一张回复评论的子表,后来想着不用这么复杂,其实就用一张表也能实现评论及回复的功能。

2. 代码实现

发表评论有三种情况,第一种是评论文章,为一级评论,第二种是评论别人的评论,为二级评论,第三种是回复别人的评论,为三级评论。

2.1 如何新增一条评论

结合上面图片,我们再来看看代码,就很清晰了。

/**
   * 发布评论
   */
submit() {
    var comment = this.data.inputData
    if (comment == '') {
      wx.showToast({
        title: '请填写评论',
        icon: 'none'
      })
    } else {
      console.log("我的评论:"   this.data.inputData)
      var type = this.data.type;
      if (type == 1) { // 1是评论别人的评论》二级评论
        this.replyComment(1)
      } else if (type == 2) {
        this.replyComment(2) // 2是回复别人的评论》三级评论
      } else if (type == 3) { // 3是评论文章》一级评论
        this.addComment();
      }
    }
  },
   /**
   * 新增评论
   */
  addComment() {
    var _this = this;
    var openid = wx.getStorageSync("openid")
    wx.showLoading({
      title: '正在加载...',
    })
    var create_date = util.formatTime(new Date());
    console.log("当前时间为:"   create_date);
    var timestamp = Date.parse(new Date());
    timestamp = timestamp / 1000;
    console.log("当前时间戳为:"   timestamp);
    // 调用云函数
    wx.cloud.callFunction({
      name: 'addComment',
      data: {
        //_id: timestamp   _this.data.otherUserInfo._id,
        id: _this.data.articleDetail._id,
        _openid: openid,
        avatarUrl: _this.data.userInfo.avatarUrl,
        nickName: _this.data.userInfo.nickName,
        comment: _this.data.inputData,
        create_date: create_date,
        flag: 0,
        article_id: _this.data.articleDetail.article_id,
        timestamp: timestamp,
        childComment: [],
      },
      success: res => {
        // res.data 包含该记录的数据
        console.log("新增评论成功---")
        wx.showToast({
          title: '评论提交成功',

        })
        wx.navigateBack({
          delta: 1
        })
      },
      fail: err => {
        console.error('[云函数]调用失败', err)
      },
      complete: res => {
        wx.hideLoading()
      }
    })
  },
  /**
   * 回复评论
   */
  replyComment(commentType) {
    var _this = this;
    wx.showLoading({
      title: '正在加载...',
    })
    var create_date = util.formatTime(new Date());
    console.log("当前时间为:"   create_date);
    var timestamp = Date.parse(new Date());
    timestamp = timestamp / 1000;
    wx.cloud.callFunction({
      name: 'replyComment',
      data: {
        id: _this.data.articleDetail._id,
        _id: _this.data.otherUserInfo._id,
        avatarUrl: _this.data.userInfo.avatarUrl,
        nickName: _this.data.userInfo.nickName,
        openId: _this.data.openid,
        comment: _this.data.inputData,
        createDate: create_date,
        flag: commentType,
        opposite_avatarUrl: _this.data.otherUserInfo.avatarUrl,
        opposite_nickName: _this.data.otherUserInfo.nickName,
        opposite_openId: _this.data.otherUserInfo._openid,
        timestamp: timestamp,
      },
      success: res => {
        // res.data 包含该记录的数据
        console.log("回复评论成功---")
        wx.showToast({
          title: '回复提交成功',
        })
        wx.navigateBack({
          delta: 1
        })
      },
      fail: err => {
        console.error('[云函数]调用失败', err)
      },
      complete: res => {
        wx.hideLoading()
      }
    })
  },

下面是新增评论和回复评论的两个云函数,主要用到了async和await这两个函数,让新增和回复函数执行完后我们再更新一下article文章表的评论字段,让其加1,async和await的好处就是可以让函数有序的进行,这里就不赘述。

// 新增评论云函数
const cloud = require('wx-server-sdk')
var env = 'hsf-blog-product-xxxxx'; // 正式环境
// var env = 'xxxxxxxxxxxxx'; // 测试环境
cloud.init({
  env: env
})
const db = cloud.database()
const _ = db.command
exports.main = async(event, context) => {
  try {
    let res = await db.collection('comment').add({
      data: {
        _openid: event._openid,
        avatarUrl: event.avatarUrl,
        nickName: event.nickName,
        comment: event.comment,
        create_date: event.create_date,
        flag: event.flag,
        article_id: event.article_id,
        timestamp: event.timestamp,
        childComment: [],
      }
    }).then(res => {
      return res;
    })
    await db.collection('article').doc(event.id).update({
      data: {
        comment_count: _.inc(1)
      }
    })
    return res;
  } catch (e) {
    console.error(e)
  }
}
// 回复评论云函数
const cloud = require('wx-server-sdk')
var env = 'hsf-blog-product-xxxxx';  // 正式环境
// var env = 'xxxxxxxxxxxxxx'; // 测试环境
cloud.init({
  env: env
})
const db = cloud.database()
const _ = db.command
exports.main = async(event, context) => {
  try {
    let res = await db.collection('comment').doc(event._id).update({
      data: {
        childComment: _.push({
          avatarUrl: event.avatarUrl,
          nickName: event.nickName,
          openId: event.openId,
          comment: event.comment,
          createDate: event.createDate,
          flag: event.flag,
          opposite_avatarUrl: event.opposite_avatarUrl,
          opposite_nickName: event.opposite_nickName,
          opposite_openId: event.opposite_openId,
          timestamp: event.timestamp,
        })
      }
    }).then(res => {
      return res;
    })
    await db.collection('article').doc(event.id).update({
      data: {
        comment_count: _.inc(1)
      }
    })
    return res;
  } catch (e) {
    console.error(e)
  }
}

2.2 如何显示每一条评论

从数据库取出评论的数据,循环遍历每一条父评论,如果有子回复也一并循环。这里每一条评论的唯一标识是用户的openId,那么我们可以用这个做一些事情,如:可以判断如果是自己的评论是不能回复的。

<view class="comment" wx:if="{{commentList.length>0}}">
      <view class="comment-line">
        <text class="comment-text">评论交流</text>
        <view class="bottom-line"></view>
      </view>
      <block wx:for='{{commentList}}' wx:key='*this' wx:for-item="itemfather">
        <view class='commentList'>
          <view class="top-info">
            <view class='img-name'>
              <image src="{{itemfather.avatarUrl}}"></image>
              <label>{{itemfather.nickName}}</label>
            </view>
          </view>
          <view class="father-content">
            <text class="text">{{itemfather.comment}}</text>
            <view class="father-reply-time">
              <text class="create-time">{{itemfather.create_date}}</text>
              <text class="reply" data-item="{{itemfather}}" bindtap='clickFatherConter' wx:if="{{openid != itemfather._openid}}">回复</text>
            </view>
          </view>
          <view class="children-content">
            <block wx:for='{{itemfather.childComment}}' wx:key='*this'>
              <view class='childComment'>
                <view class="child-img-name">
                  <view class="avatar-name">
                    <image src="{{item.avatarUrl}}"></image>
                    <text class='nickName'>{{item.nickName}}</text>
                  </view>
                </view>
                <view class="child-comment" wx:if="{{item.flag==2 }}">
                  <text class='huifu'>回复</text>
                  <text class='opposite-nickName'>{{item.opposite_nickName}}</text>
                  <text class='comment-text'>{{item.comment}}</text>
                </view>
                <view class="child-comment" wx:if="{{item.flag==1}}">
                  <text class='comment-text'>{{item.comment}}</text>
                </view>
                <view class="child-reply-time">
                  <text class="child-create-time">{{item.createDate}}</text>
                  <text class="reply" data-item="{{item}}" data-id="{{itemfather._id}}" bindtap='clickChildrenConter' wx:if="{{openid != item.openId}}">回复</text>
                </view>
              </view>
            </block>
          </view>
        </view>
      </block>
    </view>

▌项目运行

1. 下载源码

在github上将代码下载到本地:

https://github.com/husanfeng/hsf_blog.git

** 2. 环境准备**

(1)下载小程序开发工具;

(2)注册appid;

(3)使用小程序开发工具导入下载的代码,填入自己注册的AppID。

3. 云开发准备

(1)开通云开发功能。

(2)创建测试环境和生产环境。

4. 修改环境ID

(1)修改app.js中的环境ID为自己的环境ID。

(2)修改所有云函数中的环境ID为自己的环境ID。

5. 云函数部署

(1)右键云函数目录,点击在终端中打开,执行npm install。

(2)右键执行上传并部署:所有文件。

6. 构建npm

(1)勾选使用npm模块。

(2)点击顶部功能栏,执行构建npm。

7. 执行编译

▌发布注意事项

小程序现在审核也是越来越严谨了,为了不让大家在审核道路上走弯路,我把我的一些经验分享给大家。

  1. 在微信公众平台上为小程序选择正确恰当的服务类目,例如博客类的小程序就可以选择教育信息服务。

  2. 如果你的小程序需要账号密码登录,提交审核时需要提交一个账号和密码,而且这个账号不能是测试账号,不能出现测试数据。

  3. 提交审核的版本首页需要有数据展示,例如:博客小程序你需要发布一篇或者多篇文章。

  4. 文章内容不能存在敏感内容。

  5. 评论功能审核比较严格了,一旦评论中存在敏感词汇,肯定审核不通过,官方建议调用小程序内容安全API,或使用其他技术、人工审核手段,过滤色情、违法等有害信息,保障发布内容的安全。

源码地址

https://github.com/TencentCloudBase/Good-practice-tutorial-recommended


如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
无需编程,各行业模版直接套用,一键生成,轻松搭建小程序 界面自由DIY,打造个性小程序 可拖拽式DIY布局,开启自定义功能新征程,无需繁琐操作,轻松拖拽即可实现界面布局;同步实时预览,可视化操作让您所见即所得,随心打造个性小程序。 丰富功能组件,应多种场景需求 多样的功能组件,不受行业框架限制,可自由组合适应当前场景,让您轻松满足客户的定制需求。 大量插件可用,实现多样营销功能 积分签到、积分兑换商城、拼团、店内点餐、手机客服等插件可用,满足各种行业场景营销需求,助力客户小程序营销推广。 无需技术基础,轻松玩转小程序 无需代码编程,无需技术基础,简单的操作页面,清晰的模块分划,详尽的功能组件,让您短时间即可轻松玩转小程序。 垂直研发,深度挖掘行业解决方案 深入行业了解不同行业的痛点和需求,致力于解决实际问题,给客户带来实际价值,深度挖掘不同行业的解决方案。 功能介绍 分销模块:帮助企业快速搭建企业独立在线商城,自由选择分销模式,从多方位,多角度提供服务支持,助力商户实现分销渠道裂变销货,连锁门店线上化高效经营。 消息通知:设置商品状态通知、成团通知、预约预定通知、系统表单通知、会员卡开卡通知等消息模板,配置商家收发消息邮箱实现邮件通知。 万能表单:超强大的自定义表单模块,不同行业和岗位的人员不需要特殊技能,都可以方便的创建出符合业务需求的表单小程序。数据收集,简单方便,客户登记、意见反馈、活动报名等轻松搞定。万能表单自动收集并整理数据,帮助用户节省工作时间,高效率、更便捷的完成工作。 文章管理系统:对文章详细内容、所属栏目、访问量、评论、分享操作、底部菜单、关联文章等进行管理。 预约报名:报名设预约报名期,在期限内预约用户进行报名。预约报名期内,用户通过填写和提交个人信息的方式进行报名,在约定期限内报满为止。 充值管理:对充值优惠规则、积分规则等进行设置和管理。 商品管理:对多规格商品、秒杀商品、预约商品进行设置和管理。 组图管理:对图片、幻灯片进行设置和管理。 小程序管理:对小程序跳转进行管理。 评论管理:对文章、组图、商品等内容下的评论进行审核和管理。 内容库管理:对多种模型的内容(文章、组图、商品)进行快速筛选 会员管理:对会员信息,会员开卡,会员卡折扣,会员卡积分等进行设置和管理。 多商户插件:多商户入驻平台插件 自定义菜单:底部菜单栏DIY,自定义外观、功能。 广告设置:对开屏广告、首页广告、弹窗广告等进行设置和管理。 一键模板:多行业优秀模板可选,一键生成场景适用小程序页面。 积分管理:对分享获取积分、充值获取积分、签到获取积分等多种积分获取形式以及积分兑换进行管理。 手机客服插件:商家为客户提供线上的咨询服务,通过手机客服为客户解决需求问题。 订单管理:对多规格商品、秒杀商品、预约预定商品等订单状态操作。 数据分析:对小程序流量数据、订单数据、交易数据等进行分析,统计活跃用户和热销商品等。 支付宝小程序:支付宝小程序制作与发布,无需编程,一键生成。 百度小程序:百度小程序制作,无需编程,一键生成,百变应用,自由组合。 权限管理:自定义配置用户可使用的功能,分别给予权限。 可拖拽DIY:APP设计制作一站式解决方案,创造出独一无二的专属小程序。无需懂代码,都可以借助DIY官网可视化工具,顷刻间打造自已的个性化移动应用。 多门店:多门店共享数据,可切换不同城市显示,搜索门店并显示门店详情。 付费视频系统:付费视频是为了维护视频版权,促进用户知识付费的一种手段。 多规格商城:多规格商城是指在商城中能够选取规格、多规格匹配。点击购买弹出弹框,用来选择规格和选择购买数量,并和库存匹配。 积分兑换商城:用户获得积分后可以在积分商城中兑换优惠券、礼品卡或商家指定商品等。 多栏目管理:对所有内容模型的栏目进行管理。 积分签到插件:用户登陆商家小程序进行每日签到,获取相应积分。 代理商管理:拥有底层源码系统,发展自己的代理商,列表清晰展示各代理商状态,详细设置对代理商账号信息、创建小程序的个数、系统到期时间等进行管理。 店内点餐插件:无需呼叫服务员,省去排队等待时间,立即点餐,即点即用。线上线下零距离对接商家厨房最短时间送餐上桌,一键快捷支付,省时省力。每个订单实时对接后台,财务报表、资金流水、客流量盈亏分析随时掌握。 拼团商城插件:参加拼团的商品都有单独购买价格和拼团价格,在规定时间内达到相应的标准人数购买,则拼团成功。 优惠券:优惠券是一种相对成熟的营销工具,可在后台添加优惠券 付费预约:通过付费缴纳定金的方式进行预约,用户预约成功后在对应时间获得商户指定商品或服务。 秒杀商城插件:商品类型为秒杀商品,设置秒杀时间、限定数量,在规定内买家以秒杀价购买商品。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值