大家好我是CloudCoder,译为云时代的码农,专注分享linux/go/java等相关技术。

如何使用前后端统计页面的访问量?


这是我的一个github项目

链接为:https://github.com/music-player

这次我们不谈音乐播放器不谈界面的设计,只讲讲该页面左上角的访问量是如何进行设计的。

前言

在设计一个功能之前,一定要先想好思路。统计页面的访问量,我们可以通过页面的刷新次数去记录。在页面每次刷新的时候去请求后端的接口,后端链接Redis数据库并将对应的键值加1,并将该键值返回给前端。

技术栈

  • Go web框架gin
  • Redis(Key-Value数据库)
  • Vue

为什么使用Redis而不使用Mysql呢?

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
  • 原子 – Redis的所有操作都是原子性的,要么执行要么不执行。

后端核心代码

service层

执行内部逻辑,并去请求Redis数据库返回键值给controller层

使用db.Incr(key string)即可将该键的值加1

有时候db的连接是坏的,因此检测到执行失败的时候进行递归调用,保证本次调用成功执行

最后返回键值

package service

func AddClickCount() string {    //Incr即键值自增     _, err := db.Incr("music_player_count").Result()    //当操作失败时递归调用     if err == io.EOF {      AddClickCount() }    //返回该键值     return get("music_player_count")}

func get(key string) string{     result, err := db.Get(key).Result()     if err != nil {         log.Fatal(err) }     return result}

controller层

返回Json数据给前端

{"code":200, "data":count}

package controller

func ClickCount(c *gin.Context) {    //调用service层的AddClickCount()函数执行逻辑     count := service.AddClickCount()    //返回{"code":200, "data":count}     c.IndentedJSON(200, gin.H{          "code": 200,          "data": count,     })}

router层

router层暴露路由

可以使用http://localhost:8081/api/v1/click进行调用

package router

func LoadRouter(e *gin.Engine) {    //该路由回去请求controller层的ClickCount函数    //controller层又回去调用service层的AddClickCount函数进行操作    e.GET("/api/v1/click", controllers.ClickCount)}

程序入口

package main

    r := gin.Default()     //加载路由    routers.LoadRouter(r)    //后端服务端口8081    err := r.Run(":8081")    if err != nil {         log.Fatal("run err")    }

测试后端程序

每请求一次该路由,值就会加1

前端代码

前端的难点在于

  • 如何与后端进行交互
  • 如何在页面刷新的时候去调用后端请求

解决方案

  • 使用axios与后端进行交互

    methods: {     clickCount:function(){       var that = this;       axios.get('http://localhost:8081/api/v1/click')       .then(function(response) {           that.click = response.data.data;       }, function(err){})     }   }
  • Vue中的mounted可以在模板渲染html后进行调用,可以自动调用methods中的方法,而不必使用按钮点击进行触发

    mounted(){     this.clickCount();   }

前端完整代码

html><html lang="en"><head>  <meta charset="UTF-8" />  <meta name="viewport" content="width=device-width, initial-scale=1.0" />  <meta http-equiv="X-UA-Compatible" content="ie=edge" />  <script src="./js/function.js">script>  <script type="text/javascript">checkLog()script>  <title>abouttitle>head><body>

  <div id="app">    访问量: {{ click }}  div>

  <script src="./js/vue.js">script>  <script src="./js/axios.min.js">script>  <script type="text/javascript">var app = new Vue({el: "#app",data: {click: ''      },methods: {clickCount:function(){var that = this;          axios.get('http://localhost:8081/api/v1/click')          .then(function(response) {              that.click = response.data.data;          }, function(err){})        }      },      mounted(){this.clickCount();      }    })script>body>html>

前端测试



该音乐播放器的完整代码示例在我的Github项目中

链接为:

https://github.com/nj-jay/music-player

欢迎star

【往期推荐】

一起来捋一捋前后端分离登录过程的思路并实现全过程

后端数据成功返回 页面不渲染_如何统计页面访问量,看这一篇就够了相关推荐

  1. 数据产品必备技术知识:机器学习及常见算法,看这一篇就够了

    大家都知道,产品经理需要懂技术,很多面试官都偏好有技术背景的同学,毕竟产品经理经常要和开发同学相爱相杀.当然也不是一定要求能够精通,但是至少不要让这块成为沟通的障碍,懂点技术,实际工作中也能少被开发同 ...

  2. 后端数据成功返回 页面不渲染_在浏览器地址栏输入地址到页面渲染完成发生了什么?(下)...

    上一篇讲了前三步,本篇从第四步开始.下面是正文: 四.进行tcp三次握手,建立tcp连接. 简述一下,第三步我们找到了目标ip,并获得了服务器ip的mac地址.此时浏览器就会请求和服务器连接,用来传输 ...

  3. vue 后端数据成功返回 页面不渲染_vue能获取到数据数据却渲染不到页面上,为什么?...

    问题描述 从后台可以拿到数据,并打印在控制台但是就是渲染不到页面,我也不知道是为什么,感觉都正常 问题出现的环境背景及自己尝试过哪些方法 尝试用let _this = this来代替this但是还是没 ...

  4. 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!

    本期例题:LeetCode 206 - Reverse Linked List[1](Easy) 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL ...

  5. minio存储类型 归档管理页面_软件定义存储,看这一篇就够了

    minio存储类型 归档管理页面_软件定义存储,看这一篇就够了_婷婷与li的博客-CSDN博客 请看链接 文章来源于TaoCloud ,作者刘爱贵 1.SDS科普 SDS(Software Defin ...

  6. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

  7. docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  8. python装饰器功能是冒泡排序怎么做_传说中Python最难理解的点|看这完篇就够了(装饰器)...

    https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...

  9. 视频编码h264怎么看_怎么用短视频带货最有效?看这一篇就够了

    原标题:怎么用短视频带货最有效?看这一篇就够了 在抖音.快手等平台上做"短视频带货",在当下已经不是一个新鲜事儿了.越来越多的品牌方深刻认识到把短视频作为战略级布局,是企业没得选的 ...

最新文章

  1. cocos2d-x 连帧动画实现
  2. 类不能直接通过import得到
  3. EOS生产区块:解析插件producer_plugin
  4. PHP--------微信网页开发实现微信扫码功能
  5. PhpStorm 配置debug断点调试
  6. Uncaught SyntaxError: missing ) after argument list 错误解决
  7. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...
  8. 通过新浪云部署NideShop微信小程序商城(基于Node.js+MySQL+ThinkJS)
  9. POJ3080 ZOJ2784 UVALive3628 Blue Jeans题解
  10. 转载:HTML5及移动端BUG
  11. ElementUI:修改tabs标签鼠标悬浮和选中标签
  12. C语言基础2-C语言条件结构
  13. 英特尔主板快捷启动键_电脑小匠电脑硬件知识科普——主板接口篇
  14. Delphi 2007 TIDHttp HTTPS 出现Error connecting with SSL
  15. DbgView 无法开启Capture Kernel问题
  16. 高等数学学习笔记——第十二讲——正项级数收敛性判别方法
  17. WEB后端服务第22天-Django项目第2天
  18. [视频]K8软件破解脱壳入门教程
  19. 杀毒软件 McAfee 创始人自杀,75 年传奇人生画下句号
  20. 赔97.6万元!腾讯一程序员违反竞业协议,三年白干了!

热门文章

  1. 如何使用Docker Volumes在基于Docker的应用程序上启用实时重新加载
  2. Java 数据类型内存分析
  3. layui 自定义request_layui中使用自定义数据格式对数据表格进行渲染
  4. 复习django项目一——迁移数据库
  5. Please read Security section of the manual to find out how to run mysqld as root!错误解决
  6. 曾经采集朋友圈难倒多少Python大佬,今天手把手教你如何实现!
  7. Python面向对象编程扑克牌发牌程序,另含大量Python代码!
  8. Boss直聘Python爬虫实战
  9. linux03-学习记录
  10. Pandas知识点-equals()与==的区别