@@ -19,6 +19,7 @@ const DOMAIN_LABELS = {
1919
2020const DOMAIN_ORDER = Object . keys ( DOMAIN_LABELS ) ;
2121const BASE_URL = "https://api.worldquantbrain.com" ;
22+ const GOATCOUNTER_TOTAL_URL = "https://huahua.goatcounter.com/counter/TOTAL.json" ;
2223
2324const SENSITIVITY_DESCRIPTIONS = {
2425 none : "未发现额外的敏感信息或高风险副作用。" ,
@@ -58,6 +59,8 @@ const elements = typeof document === "undefined" ? {} : {
5859 catalogStatus : document . querySelector ( "#catalog-status" ) ,
5960 statusDot : document . querySelector ( ".status-dot" ) ,
6061 downloadMarkdown : document . querySelector ( "#download-markdown" ) ,
62+ visitorStat : document . querySelector ( "#visitor-stat" ) ,
63+ visitorCount : document . querySelector ( "#visitor-count" ) ,
6164 docPane : document . querySelector ( "#doc-pane" ) ,
6265 parameterForm : document . querySelector ( "#parameter-form" ) ,
6366 parameterSummary : document . querySelector ( "#parameter-summary" ) ,
@@ -1341,6 +1344,23 @@ function downloadVisibleCatalogMarkdown() {
13411344 showToast ( `${ visibleOperations ( ) . length } 个接口的 Markdown 已生成` ) ;
13421345}
13431346
1347+ async function loadVisitorCount ( ) {
1348+ try {
1349+ const response = await fetch ( GOATCOUNTER_TOTAL_URL , {
1350+ cache : "no-store" ,
1351+ credentials : "omit"
1352+ } ) ;
1353+ if ( ! response . ok ) throw new Error ( `HTTP ${ response . status } ` ) ;
1354+ const payload = await response . json ( ) ;
1355+ const count = String ( payload . count ?? "" ) . trim ( ) ;
1356+ if ( ! / ^ \d [ \d , . \s ] * $ / . test ( count ) ) throw new Error ( "invalid visitor count" ) ;
1357+ elements . visitorCount . textContent = count ;
1358+ elements . visitorStat . hidden = false ;
1359+ } catch {
1360+ elements . visitorStat . hidden = true ;
1361+ }
1362+ }
1363+
13441364function bindEvents ( ) {
13451365 elements . domainNav . addEventListener ( "click" , ( event ) => {
13461366 const button = event . target . closest ( "[data-domain]" ) ;
@@ -1415,6 +1435,7 @@ function bindEvents() {
14151435
14161436async function initialize ( ) {
14171437 bindEvents ( ) ;
1438+ void loadVisitorCount ( ) ;
14181439 try {
14191440 const response = await fetch ( "./data/api-catalog.json" , { cache : "no-cache" } ) ;
14201441 if ( ! response . ok ) throw new Error ( `HTTP ${ response . status } ` ) ;
0 commit comments