关于微信小程序制作消息部分时方法

这篇具有很好参考价值的文章主要介绍了关于微信小程序制作消息部分时方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个界面主要以两个界面组成:

1、展示用户接收到的消息

关于微信小程序制作消息部分时方法,微信小程序,小程序

2、用户与用户的聊天界面

关于微信小程序制作消息部分时方法,微信小程序,小程序

1.上传云端的数据

如果去做这个,首先第一就是如何将信息部分放入数据库,以及从数据库中调用

在上传的时候可以上传形似data这样的形式:

{
  const data={
    sender: "person1"   //消息的发送者openid
    receiver: "person2" //消息的接收者openid
    content: {message:"hello world",time:""}  //正文内容,存放文本内容,以及文本的发送时间
    num:id //为信息标号
    //其他信息    
  }
}

2.界面一的主要数据部分

pages({
  data:{
    sender_user=[] //存放发送者的openid
  }

  onLoad(){
    this.getSender()
  }

  getSender(){ //获取发送者openid
    var sender_user=[] //存放发送者的openid
    var that=this
    wx.cloud.database().collection('chat').where({receiver:"MyOpenid"}).get().then(res=>{
      for(var i=0;i<res.data.length;i++) sender_user.push(res.data[i].sender)
      let message = Array.from(new Set(sender_user));//去除sender_user里的重复元素
      that.setData({sender_user:message)}
    })
  }

})

也就是说在这个代码里面,sender是消息的发送者,而receiver是消息的接收者,这样就成功把聊天的信息上传到了自己的云服务器,那么在调用

的时候应该怎么去调用呢,这个也是个问题

如果是我上述的第一个界面,也就是取用户的信息,将其展示出来,并且点击后能跳到对应的聊天窗口。那么就必须要知道用户的openid,和我的openid,在这里由于我是信息的接收者,所以在查找数据的时候要满足一个条件,也就是where({receiver:"MyOpenid"}),那么我们在寻找的时候就可以把sender的openid找出来,存放再sender_user里面,代码如下


 

找出sender的openid后就可以通过其openid找出具体的用户信息,也就是找出用户的名字和头像,让其渲染出来,那么假设我在数据库中有一个集合user,里面存放着用户信息,其中就有用户头像(avatarUrl)和用户名字(nickName),那么就会有如下代码:

pages({
  data:{
    sender_user:[] //存放sender的openid
    sender_message:[]//存放sender的用户信息
  }

  onLoad(){
    this.getSender()
  }

  getSender(){ //获取发送者openid、头像以及头像名字
    var sender_user=[] //存放发送者的openid
    var sender_message=[]//存放sender的用户信息
    var that=this

    wx.cloud.database().collection('chat').where({receiver:"MyOpenid"}).get().then(res=>{
      for(var i=0;i<res.data.length;i++) sender_user.push(res.data[i].sender)
      let message = Array.from(new Set(sender_user));//去除sender_user里的重复元素
      that.setData({sender_user:message)}

      wx.cloud.database().collection('user').get().then(res=>{
        var user=res.data//用user存放所有用户的信息
        for(var i=0;i<message.length;i++){ //取用message[i]的信息,也就是用户openid
          for(var j=0;j<user.length;j++){ //通过message[i]查找对应的用户信息
            if(message[i]==user[j]._openid){ //如果查找到了
              avatarUrl=user[j].avatarUrl //获取头像信息
              nickName=user[j].nickName   //获取用户名字
              sender_message.push({avatarUrl:avatarUrl,nickName:nickName})
            }
          }
        }
        that.setData({sender_message:sender_message})
      })
    })
  }

})

那么,到目前位置,这个界面的数据构造就完成了,接下来就是渲染部分:

<!--wxml-->
<view class="menu">
  <view wx:for="{{sender_message}}" data-index="{{index}}" class="user" bindtap="jump_chat" data-username="User1">
    <image class="avatar" src="{{item.avatarUrl}}"></image>
    <text>{{item.nickName}}</text>
  </view>
  <!-- More user bars go here -->
</view>
/* wxss */
.menu {
  padding: 10px;
}

.user {
  display: flex;
  align-items: center;
  padding: 10px;
  margin-bottom: 10px;
  background-color: #f2f2f2;
  cursor: pointer;
}

.avatar {
  width: 60px; 
  height: 60px;
  border-radius: 50%;
  margin-right: 10px;
}

.user text {
  font-size: 18px; 
}

在上述wxml里面有个bindtap部分没有对其进行介绍,这个事件使用户点击其他用户框时会跳转到对应的聊天界面下面就是这个bindtap的具体代码 ,在这串代码中,yourID,也就是receiver将会是用户自己,故在进行这个事件时需要获取用户自己的openid

  jump_chat(e){
    console.log(e.currentTarget.dataset.index)
    let user=this.data.user
    var x=user[e.currentTarget.dataset.index]
    var chat_user={sender:"openid_1",receiver:"yourID"}//存放二者的openid
    wx.setStorageSync('chat_user', chat_user)
/*这样做方便从这个界面把sender和receiver的openid传送到chat.js*/
    wx.navigateTo({
      url: '/pages/chat/chat',
    })
  },

 现在进入界面二,chat.wxml:

{
  const data={
    sender: "person1"   //消息的发送者openid
    receiver: "person2" //消息的接收者openid
    content: {message:"hello world",time:""}  //正文内容,存放文本内容,以及文本的发送时间
    num:id //为信息标号
    //其他信息    
  }
}

在界面二中,两个元素:发送者(sender)和接收者(receiver)的openid,我们首先需要将缓存中的chat_user取出来,这个时候不同的时,发送者(sender)将会变成用户自己,这个时候就要注意在上传chat数据时sender=yourID,在这里我们去调用数据库chat的时候只需要调用用户接受的信息,以及用户发送给目标的信息,这里我计划使用content_sender和content_receiver这两个appdata,

但是仅仅通过这种方式去显示,会发现一个问题,那就是显示出来content_sender和content_receiver的信息集中分成两坨,并没有时间顺序了,那么在这里信息标号就起到作用了,我们就要调取上述代码所提到的四个数据(sender,receiver,content,num),我们在获取了content_sender和content_receiver之后,把他们集中在一个数组中,我假设这个数组是content_show。步骤如下:

step1:从数据库chat中获取信息where({sender:yourID,receiver:openid_1})=>获取用户发送的信息,存放在content_sender

step2:从数据库chat中获取信息where({sender:openid_1,receiver:yourID})=>获取用户接收到的信息,存放在content_receiver

step3:将content_sender和content_receiver合并存入content_show

step4:在content_show里面使元素按照num的正序排列

step5:显示的收以content_show里的元素渲染,并且分出sender是否为yourID,如果是的话,那么这个部分的content显示在右边,反之,则在左边

那么下面就是代码

js:

// pages/chat/chat.js
/*|->receiver      |
  |        sender<-|*/
Page({

  /**
   * 页面的初始数据
   */
  data: {
    chat_user:{},
    content_receiver:[],
    content_sender:[],
    message:"",
    time:"",
    userInfo:{},
    content_show:[]
  },
  get_input(e){
    console.log(e.detail.value)
    this.setData({message:e.detail.value})
  },
  sendMessage() {//发送信息
    let content_sender=this.data.content_sender
    let message = this.data.message;
    let chat_user=this.data.chat_user
    var that=this
    if(message.length==0){
      wx.showToast({
        title:"文本不能为空",
        icon:"error",
        duration:1500
      })
      return 0;
    }
    this.get_time()
    let time=this.data.time
    console.log(content_sender);
    wx.cloud.database().collection('chat').get().then(res=>{
      console.log(res.data.length)
      var num=res.data.length+1
      const chat={
        num:num,
        receiver: chat_user.sender,
        sender: chat_user.receiver,
        content: {time:time,message:message},
        time: time,
        receiver_onload:false,
        show:true
      };console.log(chat)
      content_sender.push(chat)
      wx.cloud.database().collection('chat').add({data:chat})
      this.setData({content_sender:content_sender})
      this.make_message_showContent()
      this.setData({message:""})
    })
  },
  get_time(){// app.js

    // 获取当前时间
    const now = new Date();
    const year = now.getFullYear(); // 获取年份
    const month = String(now.getMonth() + 1).padStart(2, '0'); // 获取月份,并在前面补零
    const date = String(now.getDate()).padStart(2, '0'); // 获取日期,并在前面补零
    const hours = String(now.getHours()).padStart(2, '0'); // 获取小时,并在前面补零
    const minutes = String(now.getMinutes()).padStart(2, '0'); // 获取分钟,并在前面补零
    
    // 格式化时间
    const formattedTime = `${year}-${month}-${date} ${hours}:${minutes}`;
    console.log('格式化后的时间:', formattedTime);
    this.setData({time:formattedTime})
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    let chat_user = wx.getStorageSync('chat_user');
    this.setData({ chat_user: chat_user });
    this.get_message_sender();
    this.get_message_receiver();
  }
  get_message_sender() {
    let chat_user = this.data.chat_user;
    var that = this;
    wx.cloud.database().collection('chat').where({ receiver: chat_user.receiver, sender: chat_user.sender }).get().then(res => {
      var content_sender=[]
      for(var i=0;i<res.data.length;i++) content_sender.push(res.data[i])
      that.setData({ content_sender: content_sender }, () => {
        this.make_message_showContent();
      });
    });
  },
  get_message_receiver() {
    let chat_user = this.data.chat_user;
    var that = this;
    wx.cloud.database().collection('chat').where({ receiver: chat_user.sender, sender: chat_user.receiver }).get().then(res => {
      var content_receiver=[]
      for(var i=0;i<res.data.length;i++) content_receiver.push(res.data[i])
      that.setData({ content_receiver: content_receiver }, () => {
        this.make_message_showContent();
      });
    });
  },
  make_message_showContent() {
    let content_receiver = this.data.content_receiver, content_sender = this.data.content_sender;
    console.log(this.data, content_receiver);
    let content_show = content_receiver.concat(content_sender);
    content_show.sort((a, b) => a.num - b.num);
    console.log(content_show, content_receiver);
    this.setData({ content_show: content_show });
  },
  
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    console.log("onshow")
    this.make_message_showContent()
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

wxml:

<!--pages/notice/intendant/pulish_all/pulish_all.wxml-->
<!-- pages/chat/chat.wxml -->
<view class="container">
  <scroll-view class="chat-history" id="myScrollView" scroll-y="true">
    <!-- 这里显示聊天历史记录 -->
    <view wx:for="{{content_show}}" wx:key="id" class="chat-container">
      <view wx:if="{{item.sender==chat_user.sender}}" class="chat-message from-other">
        <text class="message-content">{{item.content.message}}</text>
      </view>
      <view wx:if="{{item.sender==chat_user.receiver}}" class="chat-message from-me">
        <text class="message-content">{{item.content.message}}</text>
      </view>
    </view>
  </scroll-view>
  <view class="input-box">
    <textarea class="input" placeholder="请输入消息" bindinput="get_input" value="{{message}}"></textarea>
    <button class="send-button" bindtap="sendMessage" size="mini">发送</button>
  </view>
</view>

wxss:

​
/* 在对应的样式文件中 */
.container {
  display: flex;
  flex-direction: column;
  height: 100vh;
  padding: 5vw; /* 使用vw作为长度单位 */
}

.chat-history {
  flex: 1;
  background-color: #f2f2f2;
  padding: 5vw; /* 使用vw作为长度单位 */
  margin-bottom: 5vw; /* 使用vw作为长度单位 */
  border-radius: 2vw; /* 使用vw作为长度单位 */
  overflow-y: auto;
}

.input-box {
  display: flex;
  align-items: center;
}

.input {
  flex: 1;
  height: 10vw; /* 使用vw作为长度单位 */
  padding: 5vw; /* 使用vw作为长度单位 */
  border: 0.5vw solid #cccccc; /* 使用vw作为长度单位 */
  border-radius: 2vw; /* 使用vw作为长度单位 */
  margin-right: 5vw; /* 使用vw作为长度单位 */
  width: 60vw;
}

.send-button {
  width: 30vw; /* 使用vw作为长度单位 */
  height: 10vw; /* 使用vw作为长度单位 */
  background-color: #F44336;
  color: #ffffff;
  border: 0;
  border-radius: 2vw; /* 使用vw作为长度单位 */
}

/* chat.wxss */
.chat-container {
  padding: 20rpx;
  display: flex;
  flex-direction: column;
  align-items: flex-end; /* 将内容靠右对齐 */
}

.chat-message {
  max-width: 90%; /* 调整为更宽的宽度 */
  padding: 10rpx;
  margin-bottom: 10rpx;
  border-radius: 10rpx;
  word-wrap: break-word; /* 或者 white-space: pre-wrap; */
}

.from-other {
  background-color: #e0e0e0;
  align-self: flex-start;
}

.from-me {
  background-color: #b2edc4;
  align-self: flex-end;
}

.message-content {
  font-size: 30rpx;
  color: #333; /* 设置文字颜色 */
}

​

 目前这个聊天显示还不算成熟,也还有很多元素为加进来,之后如果有新内容必会更新文章来源地址https://www.toymoban.com/news/detail-829505.html

到了这里,关于关于微信小程序制作消息部分时方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于uniapp中微信小程序获取最新昵称和头像的方法

    哎,最近项目中遇到一个需求就是直接获取微信头像和昵称,可是去官方查阅后发现原先的接口已经不能获取了,返回的是灰色头像和微信用户,后来只能采用亡羊补牢的方法,就是用内置按钮组件的开放能力,引用了插件市场的代码,地址链接获取昵称、头像的弹窗,适用

    2024年02月08日
    浏览(46)
  • 微信小程序关于wxs语法、以及能否引入js中的方法(不能调用)

    页面中使用wxs 或者  参考:WXS | 微信开放文档 wxs能引入外部js文件吗 | 微信开放社区 微信小程序中的WXS语法 1、WXS 中不支持let和const,不支持箭头函数。 2、变量命名必须符合下面两个规则: 首字符必须是:字母(a-zA-Z),下划线(_) 剩余字符可以是:字母(a-zA-Z),下划

    2024年02月06日
    浏览(64)
  • 微信小程序怎么制作?制作一个微信小程序需要多少钱?

    随着移动互联网的快速发展,微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性,为各类企业和个人提供了一个全新的展示和交易平台。那么,如何制作一个微信小程序?又需要投入多少资金呢?本文将为您提供全面的解答。 制作微信小程序的步骤 1 、准

    2024年04月10日
    浏览(51)
  • 关于微信小程序警告“Do not have handler in component: pages/xxx/xxx. “的解决方法

    📚文章目录 📌关于警告 📄简单翻译一下 🎯出现原因 📝解决方法 💻测试代码 Do not have  handler in component: pages/register/register.  Please make sure that  handler has been defined in pages/register/register. 使用model:value=\\\"{{xxx}}\\\",对表单进行数据的双向绑定,绑定后,在表单输入信息是弹出警

    2024年02月11日
    浏览(55)
  • 关于uniapp开发微信小程序,实现聊天消息,最新消息最底部展示

    关于uniapp开发微信小程序,实现聊天消息最新消息最底部展示 uniappvue 此处我觉得最要注意的点就是看是谁产生的滚动条。 : scrollTop,scrollHeight 最终效果展示 录制的聊天功能

    2024年02月09日
    浏览(43)
  • 微信小程序包含哪几部分

    微信小程序由以下几个部分组成: 1. **app.json:**    - `app.json` 是小程序的全局配置文件,用于配置小程序的窗口、页面路径、网络超时时间、底部tab栏等全局设置。在这里可以定义小程序的全局样式、颜色主题等。 2. **app.js:**    - `app.js` 是小程序的全局逻辑文件,用于处理

    2024年02月03日
    浏览(31)
  • 【微信小程序怎么开店铺】微信小程序店铺怎么制作?

    【微信小程序怎么开店铺】微信小程序店铺怎么制作?线上开店已经是当下非常主流的经营模式之一,尤其是微信小程序,微信小程序在近几年的普及和发展下,大有超越app的使用率。因此,把线上开店铺和微信小程序结合起来,就成为了当下许多企业商家的共同选择。那么

    2024年02月09日
    浏览(46)
  • 【微信小程序模板直接套用】微信小程序制作模板套用平台

    微信小程序模板直接套用是小程序制作的好工具,特别是对于没有太多代码基础的企业。下面我分享一个微信小程序模板直接套用平台,超60个行业的微信小程序制作模板套用,页面内容丰富样式多样的微信小程序制作模板套用。 微信小程序模板直接套用平台的存在,就是为

    2024年02月09日
    浏览(52)
  • 微信小程序订阅消息

    subscribeMessage.send | 微信开放文档 由于业务需求 , 需要实现小程序订单状态发送给用户 , 于是微信小程序发送订阅消息就被找到了 这里前端是使用了uniapp , 具体实现方式不清楚,就不瞎bb了 后端这里就是上面的接口文档 , 总共需要是三个步骤 1. 获取小程序 appid 和 密钥 2. 订阅消

    2024年02月09日
    浏览(54)
  • 微信小程序--订阅消息

    关于小程序订阅消息之一次性订阅: 一次性订阅是指授权一次方可接收一次消息;这个最好的应用场景就是自己给自己发送消息,比如订单,当自己下单成功时,调用此接口,会在微信服务消息收到下单成功通知等具体详情。 如果是给别人发,一次性订阅就不适合,类似你

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包