Skip to content

Commit 3fe1343

Browse files
committed
[shared] feat: welcome
1 parent 53ad303 commit 3fe1343

33 files changed

Lines changed: 604 additions & 107 deletions

apps/app/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export const fullscreen = ref(false);
1717
if (platform() == "macos") {
1818
watchEffect(() => {
1919
windowButtonsExists.value = !fullscreen.value;
20-
console.log(windowButtonsExists);
2120
});
2221
} else {
2322
windowButtonsExists.value = true;

apps/web/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
"@repo/configs": "workspace:*",
1919
"@repo/shared": "workspace:*",
2020
"@repo/ui": "workspace:*",
21+
"@vueuse/core": "^13.7.0",
22+
"axios": "^1.13.2",
2123
"eslint": "^9.33.0",
24+
"pinia": "^3.0.3",
2225
"vue": "^3.5.18",
2326
"yup": "^1.7.0"
2427
},

apps/web/src-frontend/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
import { load } from "@repo/shared/src";
22
import App from "@repo/shared/src/App.vue";
3+
import router from "@repo/shared/src/router.ts";
4+
import { useAccount } from "./utils/store.ts";
35

46
(async () => {
57
await load("web", App);
8+
9+
router.beforeEach((to, _from, next) => {
10+
if (useAccount().loggedIn) {
11+
if (to.path.startsWith("/auth")) {
12+
next("/");
13+
}
14+
} else {
15+
if (!to.path.startsWith("/auth") && !to.path.startsWith("/welcome")) {
16+
next("/auth");
17+
}
18+
}
19+
20+
next();
21+
});
622
})();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { defineStore } from "pinia";
2+
import { computed } from "vue";
3+
import { useLocalStorage, useSessionStorage } from "@vueuse/core";
4+
import router from "@repo/shared/src/router.ts";
5+
6+
export const useAccount = defineStore("account", () => {
7+
const tokenPermanent = useLocalStorage<string | null>("mcsl-web-token", null);
8+
const tokenTemporary = useSessionStorage<string | null>(
9+
"mcsl-web-token",
10+
null,
11+
);
12+
13+
const token = computed(() => {
14+
return tokenPermanent.value ?? tokenTemporary.value;
15+
});
16+
17+
const loggedIn = computed(() => {
18+
return token.value != null;
19+
});
20+
21+
function setToken(token: string | null, isPermanent?: boolean) {
22+
if (isPermanent === true || isPermanent == undefined) {
23+
tokenPermanent.value = token;
24+
}
25+
if (isPermanent === false || isPermanent == undefined) {
26+
tokenTemporary.value = token;
27+
}
28+
}
29+
30+
async function logout() {
31+
setToken(null);
32+
await router.push("/");
33+
}
34+
35+
return {
36+
token,
37+
setToken,
38+
logout,
39+
loggedIn,
40+
};
41+
});
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,11 @@
11
<script setup lang="ts">
22
import Button from "@repo/ui/src/components/form/button/Button.vue";
3-
import { useTheme } from "@repo/ui/src/utils/stores.ts";
4-
import { computed } from "vue";
53
import { createForm } from "@repo/ui/src/utils/form.ts";
64
import * as yup from "yup";
75
import Form from "@repo/ui/src/components/form/Form.vue";
86
import FormEntry from "@repo/ui/src/components/form/FormEntry.vue";
97
import InputText from "@repo/ui/src/components/form/entries/InputText.vue";
10-
import Setup from "packages/shared/src/layouts/Setup.vue";
11-
12-
const theme = useTheme();
13-
const nextTheme = computed(() => {
14-
switch (theme.theme) {
15-
case "system":
16-
return "light";
17-
case "light":
18-
return "dark";
19-
case "dark":
20-
return "system";
21-
default:
22-
return "light";
23-
}
24-
});
25-
26-
function changeTheme(event: MouseEvent) {
27-
theme.change(nextTheme.value, "viewTransition", event);
28-
}
8+
import SetupLayout from "packages/shared/src/layouts/SetupLayout.vue";
299
3010
const form = createForm(
3111
{
@@ -49,14 +29,7 @@ const form = createForm(
4929
</script>
5030

5131
<template>
52-
<Setup>
53-
<Button
54-
shadow="always"
55-
icon="fa fa-moon"
56-
:rounded="true"
57-
@click="changeTheme"
58-
style="position: absolute; top: 2rem; left: 2rem"
59-
/>
32+
<SetupLayout>
6033
<h2>注册管理员账户</h2>
6134
<Form :form="form" @submit="console.log('submit', form.data.value)">
6235
<FormEntry name="name">
@@ -72,7 +45,7 @@ const form = createForm(
7245
>注册</Button
7346
>
7447
</Form>
75-
</Setup>
48+
</SetupLayout>
7649
</template>
7750

7851
<style scoped lang="scss"></style>

apps/web/src/api.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,21 @@ pub async fn api_user_refresh(
131131
}
132132
}
133133

134+
#[get("/user/should-register")]
135+
pub async fn api_user_should_register() -> impl Responder {
136+
HttpResponse::Ok().json(SuccessResponse {
137+
status: "success",
138+
data: get_users().is_empty(),
139+
})
140+
}
141+
134142
#[post("/user/register")]
135143
pub async fn api_user_register(data: web::Json<LoginRequest>) -> impl Responder {
136144
if !get_users().is_empty() {
137-
return HttpResponse::NotFound().body("");
145+
return HttpResponse::Forbidden().json(FailedResponse {
146+
status: "failed",
147+
err: "admin-exists",
148+
});
138149
}
139150

140151
match user::add_user(UserInput {

apps/web/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ async fn main() -> std::io::Result<()> {
5757
.service(api::api_user_update)
5858
.service(api::api_user_update_password)
5959
.service(api::api_user_delete)
60-
.service(api::api_user_get_self),
60+
.service(api::api_user_get_self)
61+
.service(api::api_user_should_register),
6162
);
6263

6364
#[cfg(not(debug_assertions))]

packages/shared/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"semver-utils": "^1.1.4",
3535
"vue": "^3.5.18",
3636
"vue-i18n": "^11.1.11",
37-
"vue-router": "^4.5.1"
37+
"vue-router": "^4.5.1",
38+
"yup": "^1.7.0"
3839
}
3940
}

packages/shared/src/App.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ const layout = computed(() => {
1818
</script>
1919

2020
<template>
21-
<component v-if="layout" :is="layout">
22-
<RouterView />
23-
</component>
24-
<RouterView v-else />
21+
<component v-if="layout" :is="layout" />
22+
<RouterView v-else v-slot="{ Component }">
23+
<transition name="fade" mode="in-out">
24+
<component :is="Component" />
25+
</transition>
26+
</RouterView>
2527
<NotificationTemplate id="default">
2628
<template v-slot="data">
2729
<p>{{ (data as any).message }}</p>

0 commit comments

Comments
 (0)