1+ /* global CONFIG */
2+ // eslint-disable-next-line no-console
3+
4+ ( function ( window , document ) {
5+ var supabaseUrl = CONFIG . web_analytics . supabase . server_url ;
6+ var supabaseKey = CONFIG . web_analytics . supabase . anon_key ;
7+
8+ if ( ! supabaseUrl ) {
9+ throw new Error ( 'Supabase serverUrl is empty' ) ;
10+ }
11+ if ( ! supabaseKey ) {
12+ throw new Error ( 'Supabase anonKey is empty' ) ;
13+ }
14+
15+ // 参数: target (slug), amount (增加的数量,1 或 0)
16+ // 这个 RPC 调用同时包含了更新和查询逻辑
17+ function updateCounter ( target , amount ) {
18+ return fetch ( `${ supabaseUrl } /rest/v1/rpc/update_counter` , {
19+ method : 'POST' ,
20+ headers : {
21+ 'apikey' : supabaseKey ,
22+ 'Authorization' : `Bearer ${ supabaseKey } ` ,
23+ 'Content-Type' : 'application/json' ,
24+ } ,
25+ body : JSON . stringify ( {
26+ slug_input : target ,
27+ increment_amount : amount
28+ } )
29+ } )
30+ . then ( res => res . json ( ) )
31+ . then ( data => data )
32+ . catch ( err => {
33+ console . error ( 'Supabase Error:' , err ) ;
34+ return 0 ;
35+ } ) ;
36+ }
37+
38+ // 校验是否为有效的 Host
39+ function validHost ( ) {
40+ if ( window . location . protocol === 'file:' ) {
41+ return false ;
42+ }
43+
44+ if ( CONFIG . web_analytics . supabase . ignore_local ) {
45+ var hostname = window . location . hostname ;
46+ if ( hostname === 'localhost' || hostname === '127.0.0.1' ) {
47+ return false ;
48+ }
49+ }
50+ return true ;
51+ }
52+
53+ // 校验是否为有效的 UV
54+ function validUV ( ) {
55+ var key = 'supabase_UV_Flag' ;
56+ var flag = localStorage . getItem ( key ) ;
57+ if ( flag ) {
58+ // 距离标记小于 24 小时则不计为 UV
59+ if ( new Date ( ) . getTime ( ) - parseInt ( flag , 10 ) <= 86400000 ) {
60+ return false ;
61+ }
62+ }
63+ localStorage . setItem ( key , new Date ( ) . getTime ( ) . toString ( ) ) ;
64+ return true ;
65+ }
66+
67+ function addCount ( ) {
68+ var enableIncr = CONFIG . web_analytics . enable && ! Fluid . ctx . dnt && validHost ( ) ;
69+
70+ // 请求 PV 并自增
71+ var pvCtn = document . querySelector ( '#supabase-site-pv-container' ) ;
72+ if ( pvCtn ) {
73+ // 如果允许统计则 +1,否则 +0 (只读)
74+ var amount = enableIncr ? 1 : 0 ;
75+ updateCounter ( 'site-pv' , amount ) . then ( count => {
76+ var ele = document . querySelector ( '#supabase-site-pv' ) ;
77+ if ( ele ) {
78+ ele . innerText = count ;
79+ pvCtn . style . display = 'inline' ;
80+ }
81+ } ) ;
82+ }
83+
84+ // 请求 UV 并自增
85+ var uvCtn = document . querySelector ( '#supabase-site-uv-container' ) ;
86+ if ( uvCtn ) {
87+ var amount = ( enableIncr && validUV ( ) ) ? 1 : 0 ;
88+ updateCounter ( 'site-uv' , amount ) . then ( count => {
89+ var ele = document . querySelector ( '#supabase-site-uv' ) ;
90+ if ( ele ) {
91+ ele . innerText = count ;
92+ uvCtn . style . display = 'inline' ;
93+ }
94+ } ) ;
95+ }
96+
97+ // 如果有页面浏览数节点,则请求浏览数并自增
98+ var viewCtn = document . querySelector ( '#supabase-page-views-container' ) ;
99+ if ( viewCtn ) {
100+ var path = eval ( CONFIG . web_analytics . supabase . path || 'window.location.pathname' ) ;
101+ var target = decodeURI ( path . replace ( / \/ * ( i n d e x .h t m l ) ? $ / , '/' ) ) ;
102+
103+ var amount = enableIncr ? 1 : 0 ;
104+ updateCounter ( target , amount ) . then ( count => {
105+ var ele = document . querySelector ( '#supabase-page-views' ) ;
106+ if ( ele ) {
107+ ele . innerText = count ;
108+ viewCtn . style . display = 'inline' ;
109+ }
110+ } ) ;
111+ }
112+ }
113+ addCount ( ) ;
114+ } ) ( window , document ) ;
0 commit comments