仿微信朋友圈项目梳理

项目功能简介:

用户通过手机号验证码进行登录和注册 可以浏览动态列表中的所有动态 登录成功后用户可以发表自己的动态 也可以对自己认可欣赏的动态进行点赞和评论 也可以通过动态结识志同道合的朋友 进行聊天和探讨

  • 前端:采用Vue框架搭建 weui进行页面布局
  • 后端:采用node.js
  • 数据库:mangoDB库

1. 登录注册功能:

在这里插入图片描述

  1. 通过weui中weui-form进行的页面布局
  2. 使用 /^1[3456789]\d{9}$/ 此正则表达式验证手机号是否合法
  3. 用户点击获取验证码后按钮变成60秒倒计时
  4. 调用后端接口通过调用阿里云短信服务向用户输入的手机号码发送验证码
  5. 验证码输入后点击同意并阅读相关条款后 注册/确定按钮变成激活状态
  6. 登录成功后该页面跳转至上一需登录页面
  7. 将用户信息存入store中(Vuex)

2. 主页:

在这里插入图片描述

2.1 上半部分:

  • 头部导航 返回按钮 相机标志(见主题3)
  • 背景图 头像 用户昵称 如果用户未登录是系统随机匹配的图片

2.1.1 头部:

在这里插入图片描述
当导航条在最顶部时此导航部分为透明,并且不显示朋友圈文字,当用户向下混动一定距离时,导航部分为灰色背景色显示文字,并且相机颜色为黑色,点击相机图标跳转到发布动态页面

2.1.1.1导航栏的变色实现
  • 检测当滚动条的滚动具体大于100时为导航栏元素添加一个类名小于时取消类名
  • 使用交集选择器 判断元素具备两个类名时才添加背景颜色 隐藏文字 切换相机图片
2.1.1.2点击相机发表动态
  1. 判断用户是否登录 上面当用户登录成功后会将用户的信息存入公共可访问的store 中,所有可以在store数据中查询用户是否登录
  2. 如果未登录跳转到login登录页面 (见主题1)
  3. 若登录后跳转动态发表页面 (见主题3)

2.1.2 背景图的切换

  • 点击背景图像运用weui.actionSheet会弹出一选择框
    在这里插入图片描述
  • 点击取消后选框消失
  • 点击从相册选择 会通过ref属性 用代码进行对uploader中的单击事件的触发
  • 我们将weui-uploader这模块隐藏不显示
  • 但uploader被单击时会执行像主题3.3中的步骤进行图片的上传
onSuccess: function (ret) {// 更换用户的背景图像self.submit(ret)}
  • 上传成功后我们会触发submit函数并且将ret图片的信息作为参数进行传递
async submit (obj) {// 更新数据库中的背景图像const res = await service.post('users/update', {userId: this.$store.state.currentUser._id,bgurl: obj.data.url})// 更新本地中的北背景图像if (res.data.code === 0) {this.$store.dispatch('setUser', {...this.$store.state.currentUser,bgurl: obj.data.url})}
  • 通过调用接口 更新用户的背景图 成功后我们将调用store中的方法改变本地的背景图
  • 在调用store中的方法时我们传过去的参数中是运用对象的深拷贝(…)

2.1.3 点击头像进入用户中心

  • 判断用户如果没有登录跳转到login登录页面如果已经登录跳转到个人中心页面
  • 个人中心功能见主题4

2.2 下半部分

在这里插入图片描述

  • 动态列表
  • 点赞评论
  • 头像点击查看对方信息
  • 图片的查看

2.2.1 动态列表

  • 显示的头像信息 昵称
  • 显示帖子的内容(如果文字较多设置只显示三行超出隐藏)
 overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;
  • 显示动态中携带的图片(一张图片按照图片的最长边进行成比例缩放,,多张图片按照固定宽高设置)
 <!-- 帖子中如果有多张图片 按照列表显示 图片的尺寸都一样 --><div class="img-content" v-if="data.picList.length>1"><img v-for="imgInfo in data.picList":key="imgInfo.id":preview="data._id":src="imgInfo.url"class="img-warp"></div><!-- 如果帖子中只有一张图片 图片可以放大显示 要求狂傲不能超过200px --><div class="img-content-one" v-if="data.picList.length===1"><img:src="data.picList[0].url"class="img-warp-one":preview="data._id":style="initImgSize(data.picList[0])"></div>
  • 帖子的发表时间,通过moment来进行时间格式化

2.2.2 点赞评论

  • 点赞
    • 用户点击 - - 的时候 出现点赞评论的标识
    • 当该用户已经点过赞时,显示取消点赞,用户未点赞时,显示点赞
    • 点赞宇取消点赞都是用过点击时判断点赞还是取消来请求后端的不同接口进行修改
    • 成功后也要修改store中的本地数据
  • 评论
    • 获取当前手指的坐标 并触发bus中的showInput事件

      addComment (e) {// 获取当前点击的坐标this.data.pageY = e.pageYthis.data.clientY = e.clientYthis.$bus.$emit('showInput', this.data)}
      
    • 当用户触发showInput事件后显示文本框

    • 通过os进行检测用户的手机系统评论的文本框也是不同的

      this.$bus.$on('showInput', (currentData) => {if (this.$refs.inputBar) {// 显示输入框this.showInput = true// 调用输入框组件的focusInput事件,以弹起键盘this.$refs.inputBar.focusInput(currentData)// this.$refs.inputWrap.style.top = currentData.pageY + 'px'// 调整页面的位置if (os.isIOS) {this.$refs.inputWrap.style.top = currentData.pageY + 'px'// 计算页面的滚动距离setTimeout(() => {const y = currentData.pageY - window.keyboradHeightwindow.scroll(0, y)}, 300)}}})
      
      • 调用输入框组件的focusInput事件,以弹起键盘
      • 调整页面的位置
      • 计算页面的滚动距离

2.2.3 点击图片查看大图

在这里插入图片描述

  • 通过使用preview来实现图片的查看
  • preview作为元素的动态属性 值为每组图片公共值 这里使用发表用户的_id
  • 可以左右滑动进行切换图片

2.2.4 点击头像查看作者信息

  • 点击自己的头像则会跳转到主题4
  • 点击其他作者的头像则会跳转到用户信息(传递用户id在路径中)
    在这里插入图片描述
  • 通过传递过来的id进行查寻用户信息在此进行展示
  • 点击发消息跳转到聊天页面(传递参数用户id用户昵称到路径中)主题5

2.3 上划加载更多

2.4 下拉更新

3. 发表动态页面

在这里插入图片描述

3.1 第一部分(取消发表按钮)

3.1.1 取消按钮————回到上一页面

3.1.2 发布按钮

  • 验证文字是否为空
  • 文字的数量是否合法
  • 请求接口进行发布
  • 成功后会跳转到主页(见主题2)

3.2 第二部分(文本区域)

3.2.1 用户输入的文字数量

  • 将展示用户输入文字数量使用动态数据,通过input事件实时得到文字数量不断改变变量的值

3.2.2 限定用户输入的文字数量为100

  • 采用weui中的form文本域
  • 通过双向绑定的元素得知用户输入的文字数量,当用户输入的文字数量超过100时,获取文字的内容通过substr属性取前一百个文字复制给双向绑定的文字内容的变量造成超出100字不能输入的现象。

3.3 第三部分(上传图片)

3.3.1 采用weui中的uploader技术进行图片的上传

在weui中的this指向并不是Vue实例所以在第一行中加入const self=this 让self常量指向我们的Vue实例

  const self = thisweui.uploader('#uploader', {url: service.baseURL + '/post/uploadimg',auto: true,type: 'file',fileVal: 'image',compress: {width: 1600,height: 1600,quality: 0.8},onBeforeQueued: function (files) {// `this` 是轮询到的文件, `files` 是所有文件if (['image/jpg', 'image/jpeg', 'image/png', 'image/gif'].indexOf(this.type) < 0) {weui.alert('请上传符合条件的图片')return false // 阻止文件添加}if (this.size > 10 * 1024 * 1024) {weui.alert('请上传不超过10M的图片')return false}// 控制多元每次不能超过五张if (files.length > self.totalUploadCount) {weui.alert('最多只能上传' + self.totalUploadCount + '张图片,请重新选择')return false}// 如果已经上传五张图片 作为不能继续上传if (self.uploadCount + 1 > self.totalUploadCount) {weui.alert('最多只能上传' + self.totalUploadCount + '张图片')return false}self.uploadCount++// return true; // 阻止默认行为,不插入预览图的框架},onBeforeSend: function (data, headers) {const token = document.cookie.split('=')[1]headers['wec-access-token'] = token},onProgress: function (procent) {// console.log(this, procent)// return true; // 阻止默认行为,不使用默认的进度显示},onSuccess: function (ret) {ret.data.id = this.idself.picList.push(ret.data)},onError: function (err) {console.log('error:' + err)// return true; // 阻止默认行为,不使用默认的失败态}})
  • onBeforeQueued
    选择要上传的图片时触发(验证图片是否符合要求)
    • 验证图片的格式
    • 验证图片的大小不能超过10M
    • 控制每次选择图片不能超过五张
    • 控制如果已经选择五中图片不能继续上传
  • onBeforeSend
    图片上传前触发
    • 我们将用户登录成功后存入Local Storage中的cuser(token)放到请求头headers中
  • onSuccess
    图片上传成功后触发
    • 将图片的id存到 ret.data中
    • 将图片的所有信息添加到picList数组中

3.3.2 查看图片

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

  • 点击小图片时可以展现大图 点击图片时会通过e.target拿到事件源
  • 通过getAttribute(‘style’)方法获取style中属性background-image: url(“blob:http://192.168.0.107:8080/c1e0e8bf-4ac6-4184-a839-0cdcce473aa4”);
  • 通过“ " ”进行分割得到第二个元素 也就是路径
  • 将得到的路径复制给weui.gallery 他具有两个参数,一个是图片的路径,一个是删除图片我们在第二个参数中调用删除图片的函数并且将图片的信息以及查看大图的 div作为参数传递过去(见主题3.3.3)(self指向的是this Vue的实例)
 preImg (e) {const self = thisconst url = e.target.getAttribute('style').split('"')[1]var gallery = weui.gallery(url, {onDelete: function () {self.deleteImg(e.target, gallery)}})}

3.3.3 删除图片

deleteImg (target, gallery) {const self = thisweui.confirm('确认删除图片吗', () => {const id = target.getAttribute('data-id')const index = self.picList.findIndex(item => {return item.id === id})self.picList.splice(index, 1)// 删除对应的DOM元素target.remove()self.uploadCount--})gallery.hide(function () {console.log('`gallery`has been hidden')})}
  • 运用weui中的confirm确定是否对删除图片
  • 确定删除:通过id找出picList数组中与之相同的图片信息进行删除,同时将对应的DOM元素进行删除
  • 上面执行的同时会执行hide事件,将我们现实大图的div进行隐藏

4. 用户个人中心

在这里插入图片描述

  • 导航部分为公用组件 通过父子组件prop进行传值(头部导航的文字内容)
  • 点击<按钮跳转上一页面

4.1 更换头像

  • 点击用户的头像时 依靠ref属性使用代码触发隐藏的上传图片插件的单击事件,进而激活uploader进行图片的上传
  • 上传成功后分为以下两步
 onSuccess: async function (ret) {// console.log(ret)const res = await service.post('users/update', {userId: self.$store.state.currentUser._id,avatar: ret.data.url})if (res.data.code === 0) {self.$store.dispatch('setUser', {...self.$store.state.currentUser,avatar: ret.data.url})weui.toast('上传成功', 2000)}}
  • 上传下成功后在此函数中ret中就是上传成功图片的所有信息
  • 访问接口并且将用户id从store中取出以及图片的地址一并放到请求体中 更新数据库中的头像
  • 数据库中的数据更新成功后 会通过调用store中的方法来改变本地的头像地址 同样请求体中还是使用对象的深拷贝

4.2 修改用户昵称

在这里插入图片描述

  • 点击用户昵称时会跳转页面
  • 点击提交按钮 验证文本框内容不能为空
  • 请求后端接口修改数据库中的昵称
  • 成功后通过store中的方法修改本地昵称
  • 最后将文本框内容清空,提示修改成功,2秒后跳转至个人中心

4.3 更换/发表用户个性签名

在这里插入图片描述

  • 点击个性签名时会跳转页面
  • 展示已有的个性签名 可更改 可添加
  • 点击提交按钮 验证文本框内容不能为空
  • 请求后端接口修改数据库中的个性签名
  • 成功后通过store中的方法修改本地数据
  • 最后提示修改成功,2秒后跳转至个人中心

4.4 切换性别

在这里插入图片描述

  • 点击性别时会弹出选项框运用weui中的actionSheet进行性别选择
 weui.actionSheet([{label: '男',onClick: async function () {const res = await service.post('users/update', {userId: self.$store.state.currentUser._id,gender: '1'})if (res.data.code === 0) {self.$store.dispatch('setUser', {...self.$store.state.currentUser,gender: '1'})weui.toast('修改成功', 1000)}}},{label: '女',onClick: async function () {const res = await service.post('users/update', {userId: self.$store.state.currentUser._id,gender: '0'})if (res.data.code === 0) {self.$store.dispatch('setUser', {...self.$store.state.currentUser,gender: '0'})weui.toast('修改成功', 1000)}}}], [{label: '取消',onClick: function () {console.log('取消')}}])
  • 点击取消则会隐藏选项框
  • 点击男,会请求后端接口将gender属性值设置为‘1’进行更改,成功后更改本地数据
  • 点击女,会请求后端接口将gender属性值设置为‘0’进行更改,成功后更改本地数据

5. 聊天窗口

在这里插入图片描述

  • 通过用户传递过来的用户昵称显示在最上方
  • 点击返回按钮跳转上一页面
  • 运用vue-socket.io和socket.io-client实现前后端的聊天数据的交互
  • 页面加载时,首先当前用户登录socket,获取当前登录用户与当前指定用户的聊天记录

6. 页面之间切换的动画效果

我们采用animate实现页面之间的切换 animate样式官网点击查看 我们应该将样式应用到所有组件切换需要必经之路–App.vue

  • 首先我要安装animate

    $ npm install animate.css --save

  • 在main.js中引用

    import ‘animate.css’

  • 需要将运用动画的元素使用标签包裹起来

        <transition:enter-active-class="transitionIN":leave-active-class="transitionOut"><router-view/></transition>
    
  • 里面的enter-active-class是为要切换来的(进场)设置动画

  • leave-active-class是为要切出(出场)设置动画,两属性值均为动态

  • 考虑到不同的页面切换的动画应该不同 so我们采用侦听器来检测路由的变化进而对个别的页面做出个性动画

    // 侦听器:侦听路由的变化进而应用不同的转场动画watch: {$route (to, from) {if (to.name === 'Publish') {this.transitionIN = 'animate__animated animate__slideInUp'this.transitionOut = ''} else if (from.name === 'Publish') {this.transitionIN = ''this.transitionOut = 'animate__animated animate__slideOutDown'} else {this.transitionIN = 'animate__animated animate__slideInLeft'this.transitionOut = 'animate__animated animate__slideOutLeft'}}}
    
    • $route就是监测此时路由 里面的参数: to要跳转到那个路由,from是从哪里来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/63134.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现朋友圈快速裂变 ?

相信大家都有过帮朋友砍一刀的经验&#xff0c;无论是实物商品、还是火车票、好友助力&#xff0c;都可以通过砍价来实现裂变传播&#xff0c;那么对于商家来说&#xff0c;怎样才能用好砍价这个功能呢&#xff1f;不妨一起来了解下砍价营销玩法吧&#xff01; 什么是砍价? …

一场分销裂变活动,不止是发发朋友圈这么简单

现在&#xff0c;无论是大平台&#xff0c;还是小公司&#xff0c;都在做分销裂变&#xff0c;很多商家通过分销活动&#xff0c;收获了流量红利&#xff0c;实现了获客、裂变、复购。但也有很大一部分商家&#xff0c;尽管也在做分销&#xff0c;但却没有在分销活动中取得预期…

2021超级热门引流红包裂变微信分享朋友圈广告游戏源码

维信超级引流红包裂变游戏源码 维信超级引流红包裂变游戏源码&#xff0c;H5 拆红包源码 强制分享朋友圈&#xff0c;可以强制分享两次朋友圈、三个群&#xff0c;分享成功后自动跳转到你的广告页面&#xff0c;访客点击返回跳转广告页面&#xff0c;可以强制分享两次朋友圈&a…

朋友圈裂变营销活动怎么做?有什么玩法?裂变海报?积分

要问目前**运营圈里最火爆的涨粉途径是什么&#xff0c;【裂变海报】绝对当属第一。**甚至可以说是运营人必备的涨粉必杀技。 如果你对裂变海报的功能还不太清楚&#xff0c;接下来的内容就一定不要错过了&#xff0c;小金会从功能介绍到需要用到的工具&#xff0c;给大家进行详…

微信营销七(微信朋友圈发文技巧)

我们的发文可以是软文&#xff0c;也可以是硬广。但是不管怎么说&#xff0c;我们在发文的时候要注意一些问题。1. 要注意软度 什么是软度&#xff1f;那就是你的文章&#xff0c;或者是广告&#xff0c;不能太生硬了。我们在发文的时候尽量发一些软文&#xff0c;比如说我们有…

6个顶级动态数据可视化工具

作为一名数据分析师&#xff0c;一提到动态数据可视化就会感到莫名兴奋&#xff0c;我认为数据可视化有两个非常重要的部分&#xff1a;一个是动态&#xff0c;一个是数据可视化。要使数据分析真正有价值和有洞察力&#xff0c;就需要高质量的动态可视化工具。市场上有很多产品…

【1】数据可视化:基于 Echarts + Python 实现的动态实时大屏 - 互联网企业数据

目录 精彩案例汇总 效果展示 1、首先看动态效果图 2、再看实时分片数据图 一、 确定需求方案 1、确定产品上线部署的屏幕LED分辨率 2、功能模块 3、部署方式 二、整体架构设计 三、编码实现 &#xff08;基于篇幅及可读性考虑&#xff0c;此处展示部分关键代码&…

【qstock量化】动态交互数据可视化

qstock简介 qstock由“Python金融量化”开发&#xff0c;试图打造成个人量化投研分析开源库&#xff0c;目前包括数据获取&#xff08;data&#xff09;、可视化(plot)、选股(stock)和量化回测&#xff08;backtest&#xff09;四个模块。其中数据模块&#xff08;data&#xf…

新一代开源数据可视化开放平台,是如何做实时大屏/报表的?

先看两张简单配置的习作 datart 实时大屏——决策驾驶舱 datart——生产大屏 上面是在国产开源的数据可视化 datart 上简单配置的两个实时大屏&#xff0c;截图展现不出来交互的效果&#xff0c;下面传一段视频&#xff1a; 生产大屏页面 下面是安利时间 数据可视化 datart&a…

数据可视化:BI热力地图制作

热力图时以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。热力图可以显示不可点击区域发生的事情。 热力图可以直观清楚地看到页面上每一个区域的访客兴趣焦点&#xff0c;无须报告数据分析&#xff0c;图形化展现&#xff0c;无需任何页面分析经验。 上…

海量数据如何在Web端实现动态可视化?看看这家企业是怎么做的

“我们TestLogger公司是一家赛车行业的软件公司&#xff0c;主要是通过分析在赛道上多个传感器收集到的赛车数据&#xff0c;帮助提高赛车性能。TestLogger Analyzer就是其中的一款核心数据分析工具&#xff0c;在我们构建该工具的第一个产品原型时&#xff0c;就发现由于不同类…

动态数据可视化图表制作

动态数据可视化图表制作的5个基本流程&#xff1a;原始数据分析、确定所需图表类型、导入数据&#xff0c;进行初步优化、整体优化和检验成效这五个流程。 1.原始数据分析&#xff1a; 明确动态数据分析并清楚认识到数据的类型、与其他数据之间的关联、需要哪些数据元素、舍弃…

数据动态可视化

数据动态可视化 0 前言1 所需工具2 制作步骤 0 前言 最近做数据分析时&#xff0c;需要绘制一些动态变化图&#xff0c;想到之前见过网上有很多展示世界各国综合实力、GDP这样的视频&#xff0c;便想要找一找有没有相关资源&#xff0c;结果发现教程较少&#xff0c;因此将我的…

数据可视化_EChat

如何获取echart Apache ECharts 实例化1 主要核心文件是这三个 将这三个文件放入webstorm 的 js文件夹中 按照官网文档的实例创建一个html&#xff0c;将body 的内容全部替换 引入js文件 <!DOCTYPE html> <html lang"en"> <head><meta chars…

手把手教你做出数据可视化项目(七)可视化图表数据动态获取及界面跳转

数据可视化前言&#xff1a;https://blog.csdn.net/diviner_s/article/details/115933789 Apache Echarts简介&#xff1a;https://blog.csdn.net/diviner_s/article/details/115934089 项目最终效果图&#xff1a; 此篇博客为自己学习pink老师的课后完成的项目的总结与记录&a…

会展行业年度总结,鲸会务深入探索双线会议领域

2021的日历只剩单薄的几页&#xff0c;又到了盘点与回顾这一年的时间。因为众所周知的原因&#xff0c;整个会议会展行业都在震荡中发展&#xff0c;而防控政策也客观上加速了行业的数字化升级&#xff0c;双线会议会展甚至线上会议会展成为大势所趋。在此过程中&#xff0c;一…

ChatGPT有几个版本,哪个版本最强,如何选择适合自己的?

​ChatGPT就像内容生产界的瑞士军刀。它可以是数学导师、治疗师、职业顾问、编程助手&#xff0c;甚至是旅行指南。只要你知道如何让它做你想做的事&#xff0c;ChatGPT几乎可以提供你要的任何东西。 但重要的是&#xff0c;你知道哪个版本的ChatGPT最能满足你的需求吗&#x…

明朝第一才子杨慎十首诗词

杨慎(1488&#xff5e;1559)&#xff0c;公认为明朝三大才子之首。“相如赋&#xff0c;太白诗&#xff0c;东坡文&#xff0c;升庵科第。”前面的几个大家可能都猜得出来&#xff0c;司马相如的赋&#xff0c;李白的诗&#xff0c;苏东坡的文&#xff0c;而所谓的“升庵科第”…

Python爬虫——爬取古诗词

文章目录 前言一、基本目标二、使用步骤1.进行分析2.整体代码 结果总结 前言 &#x1f338;当你喜欢哪个诗人&#xff0c;想获取他的全部诗词数据的时候&#xff0c;可以通过爬虫来解决这个问题&#xff0c;用爬虫把诗词全部爬下来&#xff0c;然后存到txt文档中&#xff0c;打…

LLM-GPT系列:GPT-1(201806)【1.17亿、5GB】、GPT-2(201902)【15亿、40GB】、GPT-3(202005)【1750亿、45TB】【OpenAI】

GPT1:Imporoving Language Understanding By Generative Pre-training GPT2:Lanuage Models Are Unsupervised Multitask Learners GPT3:Language Models Are Few-shot Learners GitHub:https://github.com/openai/gpt-3 从GPT三个版本的论文名也能看出各版本模型的重点…