Skip to content

Commit 1ad2534

Browse files
committed
修复一些bug
1 parent 0012e9c commit 1ad2534

File tree

14 files changed

+198
-191
lines changed

14 files changed

+198
-191
lines changed

locales/code_comment.yml

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,4 +777,76 @@ rendering_liquid_file:
777777
uk: рендеринг liquid файлу
778778
th: การเรนเดอร์ไฟล์ liquid
779779
el: απόδοση αρχείου liquid
780-
da: rendering af liquid-fil
780+
da: rendering af liquid-fil
781+
onion_model_middleware:
782+
en: Middleware implementing the onion model with pre and post logic
783+
zh_CN: 实现洋葱模型的中间件,具有前置和后置逻辑
784+
zh_TW: 實現洋蔥模型的中間件,具有前置和後置邏輯
785+
fr: Middleware implémentant le modèle en oignon avec une logique avant et après
786+
ja: 前処理と後処理のロジックを持つオニオンモデルを実装するミドルウェア
787+
es: Middleware que implementa el modelo de cebolla con lógica previa y posterior
788+
de: Middleware, das das Zwiebelmodell mit Vor- und Nachlogik implementiert
789+
ru: Промежуточное ПО, реализующее модель луковицы с предварительной и последующей логикой
790+
it: Middleware che implementa il modello a cipolla con logica pre e post
791+
pt: Middleware que implementa o modelo de cebola com lógica pré e pós
792+
ko: 사전 및 사후 로직이 있는 양파 모델을 구현하는 미들웨어
793+
no: Mellomvare som implementerer løkmodellen med pre- og postlogikk
794+
is: Milliforrit sem útfærir lauklíkan með for- og eftirrökfræði
795+
uk: Проміжне ПЗ, яке реалізує модель цибулі з попередньою та наступною логікою
796+
th: มิดเดิลแวร์ที่ใช้โมเดลหัวหอมพร้อมตรรกะก่อนและหลัง
797+
el: Middleware που υλοποιεί το μοντέλο κρεμμυδιού με προ- και μετα-λογική
798+
da: Middleware, der implementerer løgmodellen med for- og efterlogik
799+
skip_remaining_handlers:
800+
en: Middleware to skip remaining handlers
801+
zh_CN: 跳过剩余处理程序的中间件
802+
zh_TW: 跳過剩餘處理程序的中間件
803+
fr: Middleware pour ignorer les gestionnaires restants
804+
ja: 残りのハンドラーをスキップするミドルウェア
805+
es: Middleware para omitir los manejadores restantes
806+
de: Middleware zum Überspringen der verbleibenden Handler
807+
ru: Промежуточное ПО для пропуска оставшихся обработчиков
808+
it: Middleware per saltare i gestori rimanenti
809+
pt: Middleware para pular os manipuladores restantes
810+
ko: 남은 핸들러를 건너뛰는 미들웨어
811+
no: Mellomvare for å hoppe over gjenværende håndterere
812+
is: Milliforrit til að sleppa eftirfarandi meðhöndlum
813+
uk: Проміжне ПЗ для пропуску залишкових обробників
814+
th: มิดเดิลแวร์เพื่อข้ามตัวจัดการที่เหลือ
815+
el: Middleware για να παραλείψετε τους υπόλοιπους χειριστές
816+
da: Middleware til at springe de resterende håndterere over
817+
pre_processing_middleware:
818+
en: Middleware that executes logic before the matched handler (Pre-processing)
819+
zh_CN: 在命中的handle处理之前执行逻辑的中间件(预处理)
820+
zh_TW: 在命中的handle處理之前執行邏輯的中間件(預處理)
821+
fr: Middleware qui exécute la logique avant le gestionnaire correspondant (Pré-traitement)
822+
ja: 命中したハンドラーの前にロジックを実行するミドルウェア(前処理)
823+
es: Middleware que ejecuta lógica antes del manejador coincidente (Pre-procesamiento)
824+
de: Middleware, die Logik vor dem übereinstimmenden Handler ausführt (Vorverarbeitung)
825+
ru: Промежуточное ПО, выполняющее логику перед совпадающим обработчиком (Предварительная обработка)
826+
it: Middleware che esegue la logica prima del gestore corrispondente (Pre-elaborazione)
827+
pt: Middleware que executa lógica antes do manipulador correspondente (Pré-processamento)
828+
ko: 일치하는 핸들러 전에 로직을 실행하는 미들웨어 (전처리)
829+
no: Mellomvare som utfører logikk før den samsvarende håndtereren (Forbehandling)
830+
is: Milliforrit sem framkvæmir rökfræði áður en samsvarandi meðhöndlari (Forvinnsla)
831+
uk: Проміжне ПЗ, яке виконує логіку перед відповідним обробником (Попередня обробка)
832+
th: มิดเดิลแวร์ที่ดำเนินการตรรกะก่อนตัวจัดการที่ตรงกัน (การประมวลผลล่วงหน้า)
833+
el: Middleware που εκτελεί λογική πριν από τον αντίστοιχο χειριστή (Προ-επεξεργασία)
834+
da: Middleware, der udfører logik før den matchende handler (Forbehandling)
835+
post_processing_middleware:
836+
en: Middleware that executes logic after the next handler (Post-processing)
837+
zh_CN: 在命中的handle处理之后执行逻辑的中间件(后处理)
838+
zh_TW: 在命中的handle處理之後執行邏輯的中間件(後處理)
839+
fr: Middleware qui exécute la logique après le prochain gestionnaire (Post-traitement)
840+
ja: 次のハンドラーの後にロジックを実行するミドルウェア(後処理)
841+
es: Middleware que ejecuta lógica después del siguiente manejador (Post-procesamiento)
842+
de: Middleware, die Logik nach dem nächsten Handler ausführt (Nachbearbeitung)
843+
ru: Промежуточное ПО, выполняющее логику после следующего обработчика (Пост-обработка)
844+
it: Middleware che esegue la logica dopo il prossimo gestore (Post-elaborazione)
845+
pt: Middleware que executa lógica após o próximo manipulador (Pós-processamento)
846+
ko: 다음 핸들러 후에 로직을 실행하는 미들웨어 (후처리)
847+
no: Mellomvare som utfører logikk etter neste håndterer (Etterbehandling)
848+
is: Milliforrit sem framkvæmir rökfræði eftir næsta meðhöndlara (Eftirvinnsla)
849+
uk: Проміжне ПЗ, яке виконує логіку після наступного обробника (Пост-обробка)
850+
th: มิดเดิลแวร์ที่ดำเนินการตรรกะหลังจากตัวจัดการถัดไป (การประมวลผลภายหลัง)
851+
el: Middleware που εκτελεί λογική μετά τον επόμενο χειριστή (Μετα-επεξεργασία)
852+
da: Middleware, der udfører logik efter den næste handler (Efterbehandling)

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ mod utils;
77
use i18n::set_locale;
88
mod git;
99
mod i18n;
10+
mod namer;
11+
mod printer;
1012
mod project;
1113
mod templates;
1214
mod updater;
13-
mod namer;
14-
mod printer;
1515

1616
rust_i18n::i18n!("locales", fallback = "en");
1717
#[derive(Parser, Debug)]

src/templates/classic/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ pub(crate) fn create_files(project_path: &Path, selected: Selected, proj: &Proje
110110
"initialization_rbatis_cli_not_sqlite": t!("initialization_rbatis_cli_not_sqlite").replace(r"\n", "\n"),
111111
"seaorm_cli_website": t!("seaorm_cli_website").replace(r"\n", "\n"),
112112
"diesel_cli_website": t!("diesel_cli_website").replace(r"\n", "\n"),
113+
"onion_model_middleware": t!("onion_model_middleware"),
114+
"skip_remaining_handlers": t!("skip_remaining_handlers"),
115+
"pre_processing_middleware": t!("pre_processing_middleware"),
116+
"post_processing_middleware": t!("post_processing_middleware"),
113117
});
114118

115119
let db_lib_str = &*selected.db_lib.to_string();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use salvo::prelude::*;
2+
3+
/// {{post_processing_middleware}}
4+
#[allow(dead_code)]
5+
#[handler]
6+
async fn post_processing_middleware(&self, req: &mut Request, depot: &mut Depot, res: &mut Response, ctrl: &mut FlowCtrl) {
7+
ctrl.call_next(req, depot, res).await;
8+
// {{post_processing_middleware}}
9+
}
10+
11+
/// {{onion_model_middleware}}
12+
#[allow(dead_code)]
13+
#[handler]
14+
async fn onion_model_middleware(&self, req: &mut Request, depot: &mut Depot, res: &mut Response, ctrl: &mut FlowCtrl) {
15+
// {{pre_processing_middleware}}
16+
ctrl.call_next(req, depot, res).await;
17+
// {{post_processing_middleware}}
18+
}
19+
20+
/// {{pre_processing_middleware}}
21+
#[allow(dead_code)]
22+
#[handler]
23+
async fn pre_processing_middleware(&self, req: &mut Request, depot: &mut Depot, res: &mut Response, ctrl: &mut FlowCtrl) {
24+
// {{pre_processing_middleware}}
25+
ctrl.call_next(req, depot, res).await;
26+
}
27+
28+
29+
/// {{skip_remaining_handlers}}
30+
#[allow(dead_code)]
31+
#[handler]
32+
async fn skip_handler_middleware(&self, _req: &mut Request, _depot: &mut Depot, _res: &mut Response, ctrl: &mut FlowCtrl) {
33+
// {{skip_remaining_handlers}}
34+
ctrl.skip_rest();
35+
}

templates/classic/_base/src/hoops/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use rinja::Template;
22
use salvo::http::ResBody;
33
use salvo::prelude::*;
44

5+
pub mod custom_middleware_example;
56
pub mod jwt;
67
pub use jwt::auth_hoop;
78
mod cors;

templates/classic/_base/src/main.rs.liquid

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use dotenvy::dotenv;
21
use salvo::catcher::Catcher;
32
use salvo::conn::rustls::{Keycert, RustlsConfig};
43
use salvo::prelude::*;
@@ -37,10 +36,6 @@ pub fn empty_ok() -> JsonResult<Empty> {
3736

3837
#[tokio::main]
3938
async fn main() {
40-
if let Err(e) = dotenv() {
41-
println!("dotenv error: {:?}", e);
42-
}
43-
4439
crate::config::init();
4540
let config = crate::config::get();
4641
{%- if db_lib == "diesel" %}

templates/classic/_base/views/login.html.liquid

Lines changed: 1 addition & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
</head>
99
<body id="body" class="bg-gradient-to-br from-blue-400 via-teal-400 to-green-500 min-h-screen">
1010
<div x-data="loginForm()">
11-
<template x-if="!isLoggedIn">
1211
<div class="flex min-h-screen items-center justify-center py-12 px-4 sm:px-6 lg:px-8">
1312
<div class="w-full max-w-md space-y-6 bg-white bg-opacity-80 p-10 rounded-3xl shadow-xl border border-blue-200">
1413
<div>
@@ -65,10 +64,6 @@
6564
</div>
6665
</div>
6766
</div>
68-
</template>
69-
<template x-if="isLoggedIn">
70-
<div x-html="userList"></div>
71-
</template>
7267
</div>
7368
</body>
7469
<script src="assets/js/tailwindcss.js" defer></script>
@@ -79,7 +74,6 @@
7974
return {
8075
username: "",
8176
password: "",
82-
isLoggedIn: false,
8377
userList: "",
8478
async submit() {
8579
try {
@@ -98,14 +92,7 @@
9892
const data = await response.json();
9993
throw new Error(`${data.error.brief}`);
10094
}
101-
this.isLoggedIn = true;
102-
const userListResponse = await fetch("/users", {
103-
headers: {
104-
"X-Fragment-Header": "true",
105-
},
106-
});
107-
this.userList = await userListResponse.text();
108-
history.pushState(null, '', '/users');
95+
window.location.href = "/users";
10996
} catch (error) {
11097
Swal.fire({
11198
title: "Error!",
@@ -117,151 +104,5 @@
117104
},
118105
};
119106
}
120-
function userForm() {
121-
return {
122-
users: [],
123-
total: 0,
124-
currentPage: 1,
125-
pageSize: 10,
126-
searchUsername: '',
127-
fetchData() {
128-
const params = new URLSearchParams({
129-
page: this.currentPage,
130-
size: this.pageSize,
131-
username: this.searchUsername
132-
});
133-
fetch(`/api/users?${params.toString()}`)
134-
.then((response) => {
135-
if (!response.ok) {
136-
throw new Error("Network response was not ok");
137-
}
138-
return response.json();
139-
})
140-
.then((data) => {
141-
this.users = data.data;
142-
this.total = data.total;
143-
})
144-
.catch((error) => {
145-
console.error(
146-
"There has been a problem with your fetch operation:",
147-
error
148-
);
149-
});
150-
},
151-
search() {
152-
this.currentPage = 1;
153-
this.fetchData();
154-
},
155-
prevPage() {
156-
if (this.currentPage > 1) {
157-
this.currentPage--;
158-
this.fetchData();
159-
}
160-
},
161-
nextPage() {
162-
if (this.currentPage < Math.ceil(this.total / this.pageSize)) {
163-
this.currentPage++;
164-
this.fetchData();
165-
}
166-
},
167-
addUser() {
168-
Swal.fire({
169-
title: "{{add_user}}",
170-
showCancelButton: true,
171-
confirmButtonText: "{{yes}}",
172-
cancelButtonText: "{{cancel}}",
173-
html: `
174-
<input id="swal-input1" class="swal2-input" placeholder="{{username}}">
175-
<input id="swal-input2" class="swal2-input" placeholder="{{password}}" type="password">
176-
`,
177-
preConfirm: () => {
178-
return fetch("/api/users", {
179-
method: "POST",
180-
headers: {
181-
"Content-Type": "application/json",
182-
},
183-
body: JSON.stringify({
184-
username: document.getElementById("swal-input1").value,
185-
password: document.getElementById("swal-input2").value,
186-
}),
187-
})
188-
.then((response) => {
189-
if (!response.ok) {
190-
throw new Error(response.statusText);
191-
}
192-
this.fetchData();
193-
return;
194-
})
195-
.catch((error) => {
196-
Swal.showValidationMessage(`Request failed: ${error}`);
197-
});
198-
},
199-
allowOutsideClick: () => !Swal.isLoading(),
200-
});
201-
},
202-
updateUser(id, currentUsername) {
203-
Swal.fire({
204-
title: "{{update}}",
205-
showCancelButton: true,
206-
confirmButtonText: "{{yes}}",
207-
cancelButtonText: "{{cancel}}",
208-
html: `
209-
<input id="swal-input1" class="swal2-input" placeholder="{{username}}" value="${currentUsername}">
210-
<input id="swal-input2" class="swal2-input" placeholder="{{password}}" type="password">
211-
`,
212-
preConfirm: () => {
213-
return fetch(`/api/users/${id}`, {
214-
method: "PUT",
215-
headers: {
216-
"Content-Type": "application/json",
217-
},
218-
body: JSON.stringify({
219-
username: document.getElementById("swal-input1").value,
220-
password: document.getElementById("swal-input2").value,
221-
}),
222-
})
223-
.then((response) => {
224-
if (!response.ok) {
225-
throw new Error(response.statusText);
226-
}
227-
this.fetchData();
228-
return;
229-
})
230-
.catch((error) => {
231-
Swal.showValidationMessage(`Request failed: ${error}`);
232-
});
233-
},
234-
allowOutsideClick: () => !Swal.isLoading(),
235-
});
236-
},
237-
deleteUser(id) {
238-
Swal.fire({
239-
title: "{{are_you_sure_you_want_to_delete}}",
240-
text: "{{you_wont_be_able_to_revert_this}}",
241-
icon: "warning",
242-
showCancelButton: true,
243-
confirmButtonText: "{{yes}}",
244-
cancelButtonText: "{{cancel}}",
245-
preConfirm: () => {
246-
return fetch(`/api/users/${id}`, {
247-
method: "DELETE",
248-
})
249-
.then((response) => {
250-
if (!response.ok) {
251-
throw new Error(response.statusText);
252-
}
253-
this.fetchData();
254-
return;
255-
})
256-
.catch((error) => {
257-
Swal.showValidationMessage(`Request failed: ${error}`);
258-
});
259-
},
260-
allowOutsideClick: () => !Swal.isLoading(),
261-
});
262-
},
263-
};
264-
}
265-
266107
</script>
267108
</html>

templates/classic/diesel/src/routers/user.rs.liquid

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use serde::{Deserialize, Serialize};
66
use ulid::Ulid;
77
use validator::Validate;
88
use diesel::dsl::*;
9+
use crate::hoops::jwt;
910

1011
use crate::models::{SafeUser, User};
1112
use crate::schema::*;
@@ -22,6 +23,12 @@ pub struct UserListFragTemplate {}
2223
#[handler]
2324
pub async fn list_page(req: &mut Request, res: &mut Response) -> AppResult<()> {
2425
let is_fragment = req.headers().get("X-Fragment-Header");
26+
if let Some(cookie) = res.cookies().get("jwt_token") {
27+
let token = cookie.value().to_string();
28+
if !jwt::decode_token(&token) {
29+
res.render(Redirect::other("/login"));
30+
}
31+
}
2532
match is_fragment {
2633
Some(_) => {
2734
let hello_tmpl = UserListFragTemplate {};

0 commit comments

Comments
 (0)