diff --git a/Cargo.lock b/Cargo.lock index bdf520f..bc4a394 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,7 +45,7 @@ checksum = "84704cab5b7ae0fd3a9f78ee5eb7b27f3749df445f04623db6633459ae283267" dependencies = [ "askama_shared", "proc-macro2", - "syn", + "syn 1.0.81", ] [[package]] @@ -68,7 +68,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.81", "toml", ] @@ -89,7 +89,7 @@ checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -263,14 +263,14 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.0.0-rc.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212ba0cdc611523c37f26c7b3b4aedb4af7cbfe9239c4e7736a8a7c82284d77b" +checksum = "0ad74fdcf086be3d4fdd142f67937678fe60ed431c3b2f08599e7687269410c4" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -655,6 +655,7 @@ dependencies = [ "regex", "serde", "serde_json", + "serde_repr", "tokio", "tracing", "tracing-subscriber", @@ -829,7 +830,7 @@ checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -865,7 +866,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.81", "version_check", ] @@ -882,18 +883,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.10" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1031,7 +1032,7 @@ checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -1045,6 +1046,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.43", +] + [[package]] name = "serde_urlencoded" version = "0.7.0" @@ -1127,6 +1139,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syn" +version = "2.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "0.1.1" @@ -1150,7 +1173,7 @@ checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -1216,7 +1239,7 @@ checksum = "114383b041aa6212c579467afa0075fbbdd0718de036100bc0ba7961d8cb9095" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -1322,7 +1345,7 @@ checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.81", ] [[package]] @@ -1409,6 +1432,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + [[package]] name = "unicode-normalization" version = "0.1.19" diff --git a/Cargo.toml b/Cargo.toml index c7d1088..ac6f128 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ r-cache = "0.4.4" regex = "1.5.4" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +serde_repr = "0.1" tokio = { version = "1.0", features = ["full"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/migrations/2023-12-28-150535_statistics_v4/down.sql b/migrations/2023-12-28-150535_statistics_v4/down.sql new file mode 100644 index 0000000..a1fb728 --- /dev/null +++ b/migrations/2023-12-28-150535_statistics_v4/down.sql @@ -0,0 +1,2 @@ +ALTER TABLE + `statistics` RENAME COLUMN latest_referrer_at TO latest_referrered_at; \ No newline at end of file diff --git a/migrations/2023-12-28-150535_statistics_v4/up.sql b/migrations/2023-12-28-150535_statistics_v4/up.sql new file mode 100644 index 0000000..3eb5c17 --- /dev/null +++ b/migrations/2023-12-28-150535_statistics_v4/up.sql @@ -0,0 +1,2 @@ +ALTER TABLE + `statistics` RENAME COLUMN latest_referrered_at TO latest_referrer_at; \ No newline at end of file diff --git a/src/app_model.rs b/src/app_model.rs index ec511de..f04f94c 100644 --- a/src/app_model.rs +++ b/src/app_model.rs @@ -13,6 +13,7 @@ use headers::HeaderMap; use lazy_static::lazy_static; use regex::Regex; use serde::Serialize; +use serde_repr::*; use tokio::sync::watch::{self, Receiver, Sender}; use tokio::sync::RwLock; use tracing::info; @@ -29,13 +30,15 @@ struct VistEvent { ip: String, country: String, member: Membership, + vt: VisitorType, } -#[derive(Debug, PartialEq)] +#[derive(Serialize_repr, Debug, PartialEq)] +#[repr(u8)] pub enum VisitorType { - Referrer, - Badge, - ICON, + Referer = 1, + Badge = 2, + ICON = 3, } pub struct Context { @@ -77,7 +80,7 @@ impl Context { domain: &str, headers: &HeaderMap, ) -> Result<(&str, i64, i64, i64), anyhow::Error> { - if v_type == VisitorType::Referrer && domain.eq(&*SYSTEM_DOMAIN) { + if v_type == VisitorType::Referer && domain.eq(&*SYSTEM_DOMAIN) { return Err(anyhow!("system domain")); } if let Some(id) = self.domain2id.get(domain) { @@ -104,10 +107,11 @@ impl Context { let mut referrer = self.referrer.write().await; let mut dist_r = referrer.get(id).unwrap_or(&(0, now_shanghai())).to_owned(); - if matches!(v_type, VisitorType::Referrer) && visitor_cache.is_none() { + if matches!(v_type, VisitorType::Referer) && visitor_cache.is_none() { dist_r.0 += 1; dist_r.1 = now_shanghai(); referrer.insert(*id, dist_r); + notification = true; } drop(referrer); @@ -126,7 +130,6 @@ impl Context { let tend = self.get_tend_from_uv_and_rv(dist_uv.0, dist_r.0).await; if notification { - // 广播访客信息 let mut member = self.id2member.get(id).unwrap().to_owned(); member.description = "".to_string(); member.icon = "".to_string(); @@ -139,6 +142,7 @@ impl Context { .to_string(), country, member, + vt: v_type, }) .to_string(), ); @@ -162,7 +166,7 @@ impl Context { statistics.iter().for_each(|s| { page_view.insert(s.membership_id, (s.unique_visitor, s.updated_at)); - referrer.insert(s.membership_id, (s.referrer, s.latest_referrered_at)); + referrer.insert(s.membership_id, (s.referrer, s.latest_referrer_at)); }); let mut membership: HashMap = @@ -257,7 +261,7 @@ impl Context { unique_visitor: id_uv.0, updated_at: id_uv.1, referrer: id_referrer.0, - latest_referrered_at: id_referrer.1, + latest_referrer_at: id_referrer.1, id: 0, }, ) diff --git a/src/app_router.rs b/src/app_router.rs index 145811e..0756aa8 100644 --- a/src/app_router.rs +++ b/src/app_router.rs @@ -139,7 +139,7 @@ pub async fn home_page( if domain.is_ok() { let _ = ctx .boring_visitor( - crate::app_model::VisitorType::Referrer, + crate::app_model::VisitorType::Referer, &domain.unwrap(), &headers, ) @@ -252,7 +252,7 @@ pub async fn rank_page( if domain.is_ok() { let _ = ctx .boring_visitor( - crate::app_model::VisitorType::Referrer, + crate::app_model::VisitorType::Referer, &domain.unwrap(), &headers, ) diff --git a/src/boring_face.rs b/src/boring_face.rs index 1bd7ada..0236624 100644 --- a/src/boring_face.rs +++ b/src/boring_face.rs @@ -38,7 +38,7 @@ static SVG_HEADER: &str = r###" static SVG_BORDER: &str = r###" #site_name# 🥱 -UV: #site_uv# Referrer: #site_referrer# Level: #site_rank# +UV: #site_uv# Referer: #site_referrer# Level: #site_rank# "###; static SVG_FOOTER: &str = r###" diff --git a/src/main.rs b/src/main.rs index 671fd44..c87c3c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -100,7 +100,7 @@ async fn shutdown_signal(ctx: Arc) { unique_visitor: uv.0, updated_at: uv.1, referrer: referrer.0, - latest_referrered_at: referrer.1, + latest_referrer_at: referrer.1, id: 0, }, ) diff --git a/src/schema.rs b/src/schema.rs index 3b70c13..6637bf0 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -8,6 +8,6 @@ diesel::table! { membership_id -> BigInt, unique_visitor -> BigInt, referrer -> BigInt, - latest_referrered_at -> Timestamp, + latest_referrer_at -> Timestamp, } } diff --git a/src/statistics_model.rs b/src/statistics_model.rs index 701f6a7..1031411 100644 --- a/src/statistics_model.rs +++ b/src/statistics_model.rs @@ -19,7 +19,7 @@ pub struct Statistics { pub membership_id: i64, pub unique_visitor: i64, pub referrer: i64, - pub latest_referrered_at: NaiveDateTime, + pub latest_referrer_at: NaiveDateTime, } impl Statistics { @@ -34,6 +34,7 @@ impl Statistics { membership_id.eq(stat.membership_id), unique_visitor.eq(stat.unique_visitor), referrer.eq(stat.referrer), + latest_referrer_at.eq(stat.latest_referrer_at), )) .on_conflict((membership_id, created_at)) .do_update() @@ -41,6 +42,7 @@ impl Statistics { unique_visitor.eq(stat.unique_visitor), referrer.eq(stat.referrer), updated_at.eq(stat.updated_at), + latest_referrer_at.eq(stat.latest_referrer_at), )); println!("sql: {}", debug_query::(&statement)); statement.execute(&mut conn) @@ -114,19 +116,19 @@ impl Statistics { .map(|s| (s.0, s.1)) .collect::>(); - let latest_referrered_at_list = statistics + let latest_referrer_at_list = statistics .select(( membership_id, sql::( - "MAX(latest_referrered_at) as m_latest_referrered_at", + "MAX(latest_referrer_at) as m_latest_referrer_at", ), )) .filter(unique_visitor.gt(0).or(referrer.gt(0))) .group_by(membership_id) - .order(sql::("m_latest_referrered_at")) + .order(sql::("m_latest_referrer_at")) .load::<(i64, NaiveDateTime)>(&mut conn); - let id_to_latest_referrered_at = latest_referrered_at_list + let id_to_latest_referrer_at = latest_referrer_at_list .unwrap_or(Vec::new()) .iter() .map(|s| (s.0, s.1)) @@ -143,7 +145,7 @@ impl Statistics { .get(&s.0) .unwrap_or(&NaiveDateTime::from_timestamp(0, 0)) .to_owned(), - latest_referrered_at: id_to_latest_referrered_at + latest_referrer_at: id_to_latest_referrer_at .get(&s.0) .unwrap_or(&NaiveDateTime::from_timestamp(0, 0)) .to_owned(), diff --git a/templates/base.html b/templates/base.html index 01fcc47..6e292cd 100644 --- a/templates/base.html +++ b/templates/base.html @@ -85,7 +85,7 @@
QQ交流群:136231667(仅限会员加入)
- +
@@ -119,18 +119,26 @@ const styles = ['', "alert-success", "alert-primary", "alert-secondary", "alert-danger"] var styleIndex = 0 + function getWelcome(data) { + if (data.vt == 2) { + return "来自「" + data.country + "」的「" + data.ip + "」访问了 " + data.member.name + "。" + } + return "来自「" + data.country + "」的「" + data.ip + "」从 " + data.member.name + " 访问了本站。" + } + function connect() { const protocol = 'https:' == document.location.protocol ? 'wss' : 'ws' var ws = new WebSocket(protocol + '://' + document.location.host + '/api/ws'); ws.onmessage = function (e) { if (e.data) { const data = JSON.parse(e.data) + console.log(data); const styleIndexInner = styleIndex++ if (styleIndex >= styles.length) { styleIndex = 0 } halfmoon.initStickyAlert({ - content: "来自「" + data.country + "」的「" + data.ip + "」访问了 " + data.member.name + "。", + content: getWelcome(data), title: "无聊的沙雕 +1", alertType: styles[styleIndexInner], fillType: "filled-lm", diff --git a/templates/index.html b/templates/index.html index 7c3cc55..bf42ca9 100644 --- a/templates/index.html +++ b/templates/index.html @@ -67,7 +67,7 @@

30 天排行

{{ r.rank.unique_visitor }} {{ r.rank.referrer }} - {{ r.rank.latest_referrered_at.format("%Y-%m-%d %H:%M:%S") }} + {{ r.rank.latest_referrer_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.updated_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.created_at.format("%Y-%m-%d %H:%M:%S") }} @@ -113,7 +113,7 @@

即将移除

{{ r.rank.unique_visitor }} {{ r.rank.referrer }} - {{ r.rank.latest_referrered_at.format("%Y-%m-%d %H:%M:%S") }} + {{ r.rank.latest_referrer_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.updated_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.created_at.format("%Y-%m-%d %H:%M:%S") }} diff --git a/templates/rank.html b/templates/rank.html index 2b5ee7f..e6600bd 100644 --- a/templates/rank.html +++ b/templates/rank.html @@ -35,7 +35,7 @@

总排行

{{ r.rank.unique_visitor }} {{ r.rank.referrer }} - {{ r.rank.latest_referrered_at.format("%Y-%m-%d %H:%M:%S") }} + {{ r.rank.latest_referrer_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.updated_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.created_at.format("%Y-%m-%d %H:%M:%S") }} @@ -81,7 +81,7 @@

即将移除

{{ r.rank.unique_visitor }} {{ r.rank.referrer }} - {{ r.rank.latest_referrered_at.format("%Y-%m-%d %H:%M:%S") }} + {{ r.rank.latest_referrer_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.updated_at.format("%Y-%m-%d %H:%M:%S") }} {{ r.rank.created_at.format("%Y-%m-%d %H:%M:%S") }}