Skip to content

Commit

Permalink
展示会员列表
Browse files Browse the repository at this point in the history
  • Loading branch information
naiba committed Feb 1, 2022
1 parent 14f935e commit 86f0545
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 27 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.DS_Store
/target
.env
/data
37 changes: 24 additions & 13 deletions src/app_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@ 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;
use tracing::info;

pub type DynContext = Arc<Context>;

pub enum VistorType {
Referrer,
Badge,
}

pub struct Context {
pub badge: BoringFace,
pub favicon: BoringFace,
Expand Down Expand Up @@ -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<i64, anyhow::Error> {
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 {
Expand All @@ -159,8 +170,8 @@ impl Context {
.unwrap();
info!("country {}", country);

return tend;
return Ok(tend);
}
1
return Err(anyhow!("not a member"));
}
}
29 changes: 19 additions & 10 deletions src/app_router.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>,
headers: HeaderMap,
Extension(ctx): Extension<DynContext>,
) -> 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;
Expand All @@ -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
Expand All @@ -34,7 +36,9 @@ pub async fn show_favicon(
headers: HeaderMap,
Extension(ctx): Extension<DynContext>,
) -> 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;
Expand All @@ -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
Expand All @@ -56,7 +60,9 @@ pub async fn show_icon(
headers: HeaderMap,
Extension(ctx): Extension<DynContext>,
) -> 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;
Expand All @@ -65,20 +71,23 @@ 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
};
(headers, content)
}

pub async fn home_page() -> Result<Html<String>, String> {
let tpl = HelloTemplate {};
pub async fn home_page(Extension(ctx): Extension<DynContext>) -> Result<Html<String>, 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<Membership>,
}
2 changes: 1 addition & 1 deletion src/membership_model.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use serde::Deserialize;

#[derive(Deserialize)]
#[derive(Deserialize, Clone)]
pub struct Membership {
pub domain: String,
pub name: String,
Expand Down
42 changes: 39 additions & 3 deletions templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>无聊湾 🥱 The Boring Bay</title>
<link rel="shortcut icon" href="/api/favicon/boringbay.com" type="image/x-icon">
<link rel="shortcut icon" href="https://boringbay.com/api/favicon/boringbay.com" type="image/x-icon">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"
integrity="sha512-Fo3rlrZj/k7ujTnHg4CGR2D7kSs0v4LLanw2qksYuRlEzO+tcaEPQogQ0KaoGN26/zrn20ImR1DfuLWnOo7aBA=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
Expand All @@ -29,6 +29,14 @@
color: #d0273e;
font-weight: 900;
}

.member-list>div {
line-height: 1.8rem;
}

.member-list>div a {
color: unset;
}
</style>
</head>

Expand All @@ -37,7 +45,7 @@
<nav class="navbar">
<div class="container">
<a href="https://boringbay.com" class="navbar-brand">
<img src="/api/icon/boringbay.com" alt="The Boring Bay"> 无聊湾
<img src="https://boringbay.com/api/icon/boringbay.com" alt="The Boring Bay"> 无聊湾
</a>
<div class="navbar-content ml-auto">
<button class="btn btn-action mr-5" onclick="toggleDarkMode()">
Expand All @@ -49,8 +57,36 @@
</nav>

<div class="content-wrapper">
...
<div class="container">
<div class="content">
<h2 class="font-size-18 text-center">会员列表</h2>
<div class="d-flex flex-wrap member-list">

{% for m in membership %}
<div class="w-md-quarter p-5">
<div class="d-flex p-5 border rounded shadow">
<img class="d-block w-50 h-50 rounded" src="{{ m.icon }}">
<div class="flex-grow-1 pl-10">
<a class="text-reset font-weight-bolder" href="https://{{ m.domain }}">
{{ m.name|e }}
</a><br>
<small>{{ m.description|e }}</small><br>
<a href="https://github.com/{{ m.github_username }}"><small><i class="fab fa-github"></i>
{{ m.github_username }}</small></a>
</div>
</div>
</div>
{% endfor %}

</div>
</div>
</div>

<footer class="font-size-12 text-center">
&copy; <a class="text-reset" href="https://boringbay.com">无聊湾 boringbay.com</a>
</footer>
</div>

</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/Halfmoon/1.1.1/js/halfmoon.min.js"
Expand Down

0 comments on commit 86f0545

Please sign in to comment.