From 86f054513768a1f0761c2455de1f432b7bb406d9 Mon Sep 17 00:00:00 2001 From: naiba Date: Tue, 1 Feb 2022 22:00:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E4=BC=9A=E5=91=98=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/app_model.rs | 37 +++++++++++++++++++++++------------- src/app_router.rs | 29 ++++++++++++++++++---------- src/membership_model.rs | 2 +- templates/index.html | 42 ++++++++++++++++++++++++++++++++++++++--- 5 files changed, 84 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 7a09d50..b129c69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store /target .env /data \ No newline at end of file diff --git a/src/app_model.rs b/src/app_model.rs index 9d3950c..5e098a0 100644 --- a/src/app_model.rs +++ b/src/app_model.rs @@ -6,6 +6,7 @@ use crate::statistics_model::Statistics; use crate::{boring_face::BoringFace, DbPool}; use crate::membership_model::Membership; +use anyhow::anyhow; use chrono::{NaiveDateTime, NaiveTime, Utc}; use headers::HeaderMap; use tokio::sync::RwLock; @@ -13,6 +14,11 @@ use tracing::info; pub type DynContext = Arc; +pub enum VistorType { + Referrer, + Badge, +} + pub struct Context { pub badge: BoringFace, pub favicon: BoringFace, @@ -125,21 +131,26 @@ impl Context { } } - pub async fn boring_vistor(&self, domain: &str, headers: &HeaderMap) -> i64 { + pub async fn boring_vistor( + &self, + v_type: VistorType, + domain: &str, + headers: &HeaderMap, + ) -> Result { if let Some(id) = self.domain2id.get(domain) { let mut referrer = self.referrer.write().await; - let dist_r = match referrer.get(id) { - Some(r) => r + 1, - None => 1, - }; - referrer.insert(id.clone(), dist_r); + let mut dist_r = referrer.get(id).or(Some(&0)).unwrap().clone(); + if matches!(v_type, VistorType::Referrer) { + dist_r = dist_r + 1; + referrer.insert(id.clone(), dist_r); + } drop(referrer); let mut pv = self.page_view.write().await; - let dist_pv = match pv.get(id) { - Some(r) => r + 1, - None => 1, - }; - pv.insert(id.clone(), dist_pv); + let mut dist_pv = pv.get(id).or(Some(&0)).unwrap().clone(); + if matches!(v_type, VistorType::Badge) { + dist_pv = dist_pv + 1; + pv.insert(id.clone(), dist_pv); + } drop(pv); let mut tend = (dist_r * 5 + dist_pv) / 20; if tend > 10 { @@ -159,8 +170,8 @@ impl Context { .unwrap(); info!("country {}", country); - return tend; + return Ok(tend); } - 1 + return Err(anyhow!("not a member")); } } diff --git a/src/app_router.rs b/src/app_router.rs index 818d0fd..a1a24b8 100644 --- a/src/app_router.rs +++ b/src/app_router.rs @@ -5,14 +5,16 @@ use axum::{ }; use headers::HeaderMap; -use crate::app_model::DynContext; +use crate::{app_model::DynContext, membership_model::Membership}; pub async fn show_badge( Path(domain): Path, headers: HeaderMap, Extension(ctx): Extension, ) -> impl IntoResponse { - let tend = ctx.boring_vistor(&domain, &headers).await; + let tend = ctx + .boring_vistor(crate::app_model::VistorType::Badge, &domain, &headers) + .await; let headers = Headers([("content-type", "image/svg+xml")]); let len: usize = 10; let read = ctx.badge_render_cache.read().await; @@ -21,7 +23,7 @@ pub async fn show_badge( v.clone() } else { drop(read); - let v = ctx.badge.render_svg(tend as usize); + let v = ctx.badge.render_svg(tend.unwrap() as usize); let mut write = ctx.badge_render_cache.write().await; write.insert(len, v.clone()); v @@ -34,7 +36,9 @@ pub async fn show_favicon( headers: HeaderMap, Extension(ctx): Extension, ) -> impl IntoResponse { - let tend = ctx.boring_vistor(&domain, &headers).await; + let tend = ctx + .boring_vistor(crate::app_model::VistorType::Badge, &domain, &headers) + .await; let headers = Headers([("content-type", "image/svg+xml")]); let len: usize = 10; let read = ctx.favicon_render_cache.read().await; @@ -43,7 +47,7 @@ pub async fn show_favicon( v.clone() } else { drop(read); - let v = ctx.favicon.render_svg(tend as usize); + let v = ctx.favicon.render_svg(tend.unwrap() as usize); let mut write = ctx.favicon_render_cache.write().await; write.insert(len, v.clone()); v @@ -56,7 +60,9 @@ pub async fn show_icon( headers: HeaderMap, Extension(ctx): Extension, ) -> impl IntoResponse { - let tend = ctx.boring_vistor(&domain, &headers).await; + let tend = ctx + .boring_vistor(crate::app_model::VistorType::Badge, &domain, &headers) + .await; let headers = Headers([("content-type", "image/svg+xml")]); let len: usize = 10; let read = ctx.icon_render_cache.read().await; @@ -65,7 +71,7 @@ pub async fn show_icon( v.clone() } else { drop(read); - let v = ctx.icon.render_svg(tend as usize); + let v = ctx.icon.render_svg(tend.unwrap() as usize); let mut write = ctx.icon_render_cache.write().await; write.insert(len, v.clone()); v @@ -73,12 +79,15 @@ pub async fn show_icon( (headers, content) } -pub async fn home_page() -> Result, String> { - let tpl = HelloTemplate {}; +pub async fn home_page(Extension(ctx): Extension) -> Result, String> { + let membership = ctx.id2member.values().cloned::<_>().collect(); + let tpl = HomeTemplate { membership }; let html = tpl.render().map_err(|err| err.to_string())?; Ok(Html(html)) } #[derive(Template)] #[template(path = "index.html")] -struct HelloTemplate {} +struct HomeTemplate { + membership: Vec, +} diff --git a/src/membership_model.rs b/src/membership_model.rs index e6a0d72..08e7bdf 100644 --- a/src/membership_model.rs +++ b/src/membership_model.rs @@ -1,6 +1,6 @@ use serde::Deserialize; -#[derive(Deserialize)] +#[derive(Deserialize, Clone)] pub struct Membership { pub domain: String, pub name: String, diff --git a/templates/index.html b/templates/index.html index a10ddbf..183c02e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -6,7 +6,7 @@ 无聊湾 🥱 The Boring Bay - + @@ -29,6 +29,14 @@ color: #d0273e; font-weight: 900; } + + .member-list>div { + line-height: 1.8rem; + } + + .member-list>div a { + color: unset; + } @@ -37,7 +45,7 @@
- ... +
+
+

会员列表

+
+ + {% for m in membership %} +
+
+ + +
+
+ {% endfor %} + +
+
+
+ +
+