吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1102|回复: 9
上一主题 下一主题
收起左侧

[其他原创] 开源极简网页计数器

[复制链接]
跳转到指定楼层
楼主
iLy_y 发表于 2024-10-25 19:07 回帖奖励
本帖最后由 iLy_y 于 2024-10-25 19:08 编辑

项目地址
演示demo
使用教程

部署准备

  1. 注册https://turso.tech
  2. 创建数据库 记录数据库链接 TOKEN
  3. 填入环境变量
    TURSO_DATABASE_URL =
    TURSO_AUTH_TOKEN =

一键部署Vercel

Deploy to Vercel

部署完成后访问https://example.com/api/init-db初始化数据库

搭配cdn使用

引入 JS 使用

1. HTML 结构

<div id="visit-counter" class="visit-counter">统计数据加载中...</div>

2. 引入 JS

<script src="https://unpkg.com/visit-monitor@latest/dist/visit-monitor.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/visit-monitor@latest/dist/visit-monitor.min.js"></script>

3. 使用

<script>
    document.addEventListener('DOMContentLoaded', () => {
        const monitor = new VisitMonitor({
            apiUrl: 'https://example.com/api/log-visit',
        });

        monitor.onUpdate((pv, uv) => {
            const counterElement = document.getElementById('visit-counter');
            counterElement.innerHTML = `
                <span>访问次数:<strong>${pv}</strong></span> |
                <span>访客数量:<strong>${uv}</strong></span>
            `;
        });

        monitor.init();
    });
</script>

在 Vue 中使用

1. 安装

npm i visit-monitor

2. 使用

<template>
  <div class="visit-counter">
    <slot :pvCount="pvCount" :uvCount="uvCount">
      <template v-if="!pvCount && !uvCount">统计数据加载中...</template>
      <template v-else>
        <span>访问次数:<strong>{{ pvCount }}</strong></span> |
        <span>访客数量:<strong>{{ uvCount }}</strong></span>
      </template>
    </slot>
  </div>
</template>

<script setup>
import VisitMonitor from "visit-monitor";

const pvCount = ref();
const uvCount = ref();

onMounted(() => {
    const monitor = new VisitMonitor({
        apiUrl: "https://example.com/api/log-visit",
    });

    monitor.onUpdate((pv, uv) => {
        pvCount.value = pv;
        uvCount.value = uv;
    });

    monitor.init();
});
</script>

在 React 中使用

1. 安装

npm install visit-monitor

2. 使用

// VisitCounter.jsx
import React, { useEffect, useState } from 'react';
import VisitMonitor from 'visit-monitor';

const VisitCounter = () => {
    const [pvCount, setPvCount] = useState(null);
    const [uvCount, setUvCount] = useState(null);

    useEffect(() => {
        const monitor = new VisitMonitor({
            apiUrl: 'https://example.com/api/log-visit',
        });

        monitor.onUpdate((pv, uv) => {
            setPvCount(pv);
            setUvCount(uv);
        });

        monitor.init();
    }, []);

    return (
        <div className="visit-counter">
            {pvCount === null && uvCount === null ? (
                <span>统计数据加载中...</span>
            ) : (
                <>
                    <span>访问次数:<strong>{pvCount}</strong></span> |
                    <span>访客数量:<strong>{uvCount}</strong></span>
                </>
            )}
        </div>
    );
};

export default VisitCounter;

不搭配cdn使用

(function () {
  function getOrCreateVisitorId() {
    let visitorId = localStorage.getItem('visitor_id');
    if (!visitorId) {
      visitorId = 'visitor_' + Math.random().toString(36).substr(2, 9);
      localStorage.setItem('visitor_id', visitorId);
    }
    return visitorId;
  }

  function logVisit() {
    const url = window.location.href;
    const visitorId = getOrCreateVisitorId();

    fetch('https://example.com/api/log-visit', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Visitor-ID': visitorId,
      },
      body: JSON.stringify({ url }),
    })
      .then((response) => response.json())
      .then((data) => {
        console.log('访问记录成功:', data);
        updateVisitCount(data.pvCount, data.uvCount);
      })
      .catch((error) => {
        console.error('访问记录出错:', error);
        updateVisitCount('N/A', 'N/A');
      });
  }

  function updateVisitCount(pvCount, uvCount) {
    const counterElement = document.getElementById('visit-counter');
    if (counterElement) {
      counterElement.innerHTML = `
        <span>访问次数:<strong>${pvCount}</strong></span> |
        <span>访客数量:<strong>${uvCount}</strong></span>
      `;
      counterElement.classList.remove('loading');
      counterElement.classList.add('loaded');
    }
  }

  window.addEventListener('load', () => {
    const counterElement = document.getElementById('visit-counter');
    if (counterElement) counterElement.classList.add('loading');
    logVisit();
  });
})();

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
anorith 发表于 2024-10-26 08:42
感谢分享
3#
逐雅斋 发表于 2024-10-26 10:15
4#
三滑稽甲苯 发表于 2024-10-26 12:01
5#
 楼主| iLy_y 发表于 2024-10-26 12:05 |楼主
三滑稽甲苯 发表于 2024-10-26 12:01
我记得有一个免费服务不需要注册就能用

不蒜子吗 最近好像经常打不开
6#
aiguohou 发表于 2024-10-26 13:09
不蒜子不行了
7#
LuGuanDi 发表于 2024-10-26 17:17
感谢分享
8#
chgf 发表于 2024-10-28 09:53
感谢楼主分享,下来研究研究
9#
FXG 发表于 2024-10-28 18:26
感谢分享
10#
Tianc86 发表于 2024-10-30 15:52
计算器是最难实现的,厉害了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 09:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表