Добавил возможность удалять пользователей и менять им пароли
This commit is contained in:
parent
a287fec381
commit
8a7231cdd2
5 changed files with 239 additions and 0 deletions
112
src/pages/users.astro
Normal file
112
src/pages/users.astro
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
---
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
|
||||
import { getUserSession, searchUsers, getSessionUser } from "../db";
|
||||
import Navbar from "../components/Navbar.astro";
|
||||
|
||||
if (Astro.cookies.has("session")) {
|
||||
const sessId = Astro.cookies.get("session").value!;
|
||||
const dbSess = await getUserSession(sessId);
|
||||
if (dbSess === null) {
|
||||
Astro.cookies.delete("session");
|
||||
return Astro.redirect("/login");
|
||||
}
|
||||
} else {
|
||||
return Astro.redirect("/login");
|
||||
}
|
||||
|
||||
const sessId = Astro.cookies.get("session").value!;
|
||||
const user = (await getSessionUser(sessId))!;
|
||||
if (!user.is_admin) {
|
||||
return Astro.redirect("/");
|
||||
}
|
||||
|
||||
const users = await searchUsers({});
|
||||
---
|
||||
|
||||
<Layout title="Пользователи">
|
||||
<main>
|
||||
<Navbar is_user_admin={user.is_admin} />
|
||||
<div class="container mt-4 d-flex flex-column gap-4">
|
||||
{
|
||||
users.map((e) => (
|
||||
<div class="card flex-grow-1">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{e.fullName}</h5>
|
||||
<h6 class="card-subtitle mb-2 text-muted">{e.login}</h6>
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick={`doChangePassword("${e.login}")`}>
|
||||
Изменить пароль
|
||||
</button>
|
||||
<a href={`/user/${e.id}`} class="btn btn-primary btn-sm">
|
||||
Открыть профиль
|
||||
</a>
|
||||
<a href={`/timetable?userId=${e.id}`} class="btn btn-primary btn-sm">
|
||||
Редактировать расписание
|
||||
</a>
|
||||
<button type="button" class="btn btn-danger btn-sm" onclick={`doDeleteUser("${e.login}")`}>
|
||||
Удалить пользователя
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
|
||||
<script is:inline>
|
||||
async function doChangePassword(login) {
|
||||
const newPassword = prompt("Введите новый пароль пользователя");
|
||||
if (newPassword === null) return;
|
||||
|
||||
try {
|
||||
const fd = new FormData();
|
||||
fd.append("login", login);
|
||||
fd.append("password", newPassword);
|
||||
const resp = await fetch("/userapi/updatePassword", {
|
||||
method: "POST",
|
||||
body: fd,
|
||||
});
|
||||
const json = await resp.json();
|
||||
if (json.ok) {
|
||||
alert("Успех");
|
||||
} else {
|
||||
throw new Error(json.reason);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
if (e instanceof Error) {
|
||||
alert(e.message);
|
||||
} else {
|
||||
alert("Неизвестная ошибка");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function doDeleteUser(login) {
|
||||
const confirmLogin = prompt(`Это действие невозможно отменить. \nВведите логин пользователя '${login}' для подтверждения`);
|
||||
if (confirmLogin !== login) return;
|
||||
|
||||
try {
|
||||
const fd = new FormData();
|
||||
fd.append("login", login);
|
||||
const resp = await fetch("/userapi/deleteUser", {
|
||||
method: "POST",
|
||||
body: fd,
|
||||
});
|
||||
const json = await resp.json();
|
||||
if (json.ok) {
|
||||
location.reload();
|
||||
} else {
|
||||
throw new Error(json.reason);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
if (e instanceof Error) {
|
||||
alert(e.message);
|
||||
} else {
|
||||
alert("Неизвестная ошибка");
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
Loading…
Add table
Add a link
Reference in a new issue