From 6be85e86aff5f613f1a3efcbc8c6f4b94def2c73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Z=C3=BCrcher?= Date: Wed, 10 Dec 2025 14:05:37 +0100 Subject: [PATCH] add new landing page firstlogin close #18 --- backend/go.mod | 6 +- backend/go.sum | 12 ++-- backend/main.go | 5 +- src/assets/lang/de-CH.yaml | 1 + src/assets/lang/de-DE.yaml | 1 + src/assets/lang/en-US.yaml | 1 + src/boot/restore-route.js | 3 +- src/pages/FirstLogin.vue | 82 +++++++++++++++++++++++++++ src/router/index.ts | 10 +++- src/router/routes.ts | 4 ++ src/vueLib/login/useLogin.ts | 2 + src/vueLib/login/userStore.ts | 4 ++ src/vueLib/models/user.ts | 2 + src/vueLib/tables/users/UserTable.vue | 6 +- 14 files changed, 119 insertions(+), 20 deletions(-) create mode 100644 src/pages/FirstLogin.vue diff --git a/backend/go.mod b/backend/go.mod index e2254f4..d656048 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,8 +3,8 @@ module backend go 1.24.5 require ( - gitea.tecamino.com/paadi/access-handler v1.0.29 - gitea.tecamino.com/paadi/memberDB v1.1.13 + gitea.tecamino.com/paadi/access-handler v1.0.34 + gitea.tecamino.com/paadi/memberDB v1.1.16 gitea.tecamino.com/paadi/tecamino-dbm v0.1.1 gitea.tecamino.com/paadi/tecamino-logger v0.2.1 github.com/gin-contrib/cors v1.7.6 @@ -14,7 +14,7 @@ require ( ) require ( - gitea.tecamino.com/paadi/dbHandler v1.1.7 // indirect + gitea.tecamino.com/paadi/dbHandler v1.1.10 // indirect github.com/bytedance/sonic v1.14.0 // indirect github.com/bytedance/sonic/loader v0.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect diff --git a/backend/go.sum b/backend/go.sum index c7e4934..315f848 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,9 +1,9 @@ -gitea.tecamino.com/paadi/access-handler v1.0.29 h1:FZ67co/rfJffftT6xOp6psZKFtdEReaAR7PnEZi7ltI= -gitea.tecamino.com/paadi/access-handler v1.0.29/go.mod h1:Dmme8URu3lENPhlkZcdEeIKm8VMlAgT/jNLECLLS7Vs= -gitea.tecamino.com/paadi/dbHandler v1.1.7 h1:NqVbxbUwd7EZX6HYntyLYwwPbyTPevOhIBTFqoCVqOU= -gitea.tecamino.com/paadi/dbHandler v1.1.7/go.mod h1:y/xn/POJg1DO++67uKvnO23lJQgh+XFQq7HZCS9Getw= -gitea.tecamino.com/paadi/memberDB v1.1.13 h1:P5UsTt3d8829H9d3vfMAWpDN7ONqwhr8ndIuL9lBuvQ= -gitea.tecamino.com/paadi/memberDB v1.1.13/go.mod h1:FRbhFgXq4jDpfCrCfHCVr7VcA44fR8J3XXQFeO6QSBk= +gitea.tecamino.com/paadi/access-handler v1.0.34 h1:6P65HiusSfvgv/ezOvxSahqyRJMK9UrxtGsz6loLoUk= +gitea.tecamino.com/paadi/access-handler v1.0.34/go.mod h1:HyMp1WvzmqLw8Ljt3r1qlF8fY+T5WFXr9Da/CTIM0H8= +gitea.tecamino.com/paadi/dbHandler v1.1.10 h1:zZQbDTJ0bu6CIW90Zms8yYIzTLHtWPNhVKRxLUXEDuE= +gitea.tecamino.com/paadi/dbHandler v1.1.10/go.mod h1:y/xn/POJg1DO++67uKvnO23lJQgh+XFQq7HZCS9Getw= +gitea.tecamino.com/paadi/memberDB v1.1.16 h1:z8v0BSLaiP7pE+ad2LUycBJf8SFOOlbyASoxvrO1CpM= +gitea.tecamino.com/paadi/memberDB v1.1.16/go.mod h1:xv2MA05nKh45NTnBQewaFeRJ2fs5dgcE7qTjmIjtqIA= gitea.tecamino.com/paadi/tecamino-dbm v0.1.1 h1:vAq7mwUxlxJuLzCQSDMrZCwo8ky5usWi9Qz+UP+WnkI= gitea.tecamino.com/paadi/tecamino-dbm v0.1.1/go.mod h1:+tmf1rjPaKEoNeUcr1vdtoFIFweNG3aUGevDAl3NMBk= gitea.tecamino.com/paadi/tecamino-logger v0.2.1 h1:sQTBKYPdzn9mmWX2JXZBtGBvNQH7cuXIwsl4TD0aMgE= diff --git a/backend/main.go b/backend/main.go index 384f2f3..2535c6f 100644 --- a/backend/main.go +++ b/backend/main.go @@ -109,11 +109,8 @@ func main() { allowOrigins = append(allowOrigins, fmt.Sprintf("%s%s:9000", httpString, localIP), fmt.Sprintf("%s%s:9500", httpString, localIP)) } - fmt.Println(100, allowOrigins) - s.Routes.Use(cors.New(cors.Config{ - AllowOrigins: allowOrigins, - //AllowOrigins: []string{"*"}, + AllowOrigins: allowOrigins, AllowMethods: []string{"POST", "GET", "DELETE", "OPTIONS"}, AllowHeaders: []string{"Origin", "Content-Type"}, ExposeHeaders: []string{"Content-Length"}, diff --git a/src/assets/lang/de-CH.yaml b/src/assets/lang/de-CH.yaml index e11603f..39d3771 100644 --- a/src/assets/lang/de-CH.yaml +++ b/src/assets/lang/de-CH.yaml @@ -140,3 +140,4 @@ Friday: Fritig Saturday: Samstig Sunday: Suntig currentPassword: Aktuelles Passwort +addFirstUser: Füeg erste Admin Benutzer hinzu diff --git a/src/assets/lang/de-DE.yaml b/src/assets/lang/de-DE.yaml index f4845de..6b2c564 100644 --- a/src/assets/lang/de-DE.yaml +++ b/src/assets/lang/de-DE.yaml @@ -140,3 +140,4 @@ Friday: Freitag Saturday: Samstag Sunday: Sonntag currentPassword: Aktuelles Passwort +addFirstUser: Füge erster Admin Benutzer hinzu diff --git a/src/assets/lang/en-US.yaml b/src/assets/lang/en-US.yaml index 3dd15e1..bce4d17 100644 --- a/src/assets/lang/en-US.yaml +++ b/src/assets/lang/en-US.yaml @@ -140,3 +140,4 @@ Friday: Friday Saturday: Saturday Sunday: Sunday currentPassword: Current Password +addFirstUser: Add first Admin User diff --git a/src/boot/restore-route.js b/src/boot/restore-route.js index 2dfe54f..d38742b 100644 --- a/src/boot/restore-route.js +++ b/src/boot/restore-route.js @@ -8,6 +8,7 @@ export default boot(async ({ router }) => { // load user try { const { data } = await appApi.get('/login/me'); + userStore.setFirstLogin(data.newDatabase); data.role.role = data.role; await userStore.setUser(data); @@ -36,7 +37,7 @@ export default boot(async ({ router }) => { // Save the route after every successful navigation router.afterEach((to) => { // Don't save login page as "last route" - if (to.path !== '/login' && to.path !== '/') { + if (to.path !== '/login' && to.path !== '/firstlogin' && to.path !== '/') { setLocalLastRoute(to.fullPath); } }); diff --git a/src/pages/FirstLogin.vue b/src/pages/FirstLogin.vue new file mode 100644 index 0000000..00eec18 --- /dev/null +++ b/src/pages/FirstLogin.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/router/index.ts b/src/router/index.ts index e544b73..90402da 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -17,6 +17,8 @@ import { useUserStore } from 'src/vueLib/login/userStore'; * with the Router instance. */ +export let routerInstance: ReturnType; + export default defineRouter(function (/* { store, ssrContext } */) { const createHistory = process.env.SERVER ? createMemoryHistory @@ -34,10 +36,16 @@ export default defineRouter(function (/* { store, ssrContext } */) { history: createHistory(process.env.VUE_ROUTER_BASE), }); + routerInstance = Router; + Router.beforeEach((to, from, next) => { const userStore = useUserStore(); const isLoggedIn = userStore.isAuthenticated; - if (to.meta.requiresAuth && !isLoggedIn) { + if (!userStore.$state.firstLogin && to.path === '/firstlogin') { + next('/login'); + } else if (userStore.$state.firstLogin && to.path !== '/firstlogin') { + next('/firstlogin'); + } else if (to.meta.requiresAuth && !isLoggedIn) { next('/login'); } else if ( to.meta.requiresAdmin && diff --git a/src/router/routes.ts b/src/router/routes.ts index d6af6e2..936e5f4 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -9,6 +9,10 @@ const routes: RouteRecordRaw[] = [ path: '', component: () => import('pages/LoginPage.vue'), }, + { + path: 'firstlogin', + component: () => import('pages/FirstLogin.vue'), + }, { path: 'login', component: () => import('pages/LoginPage.vue'), diff --git a/src/vueLib/login/useLogin.ts b/src/vueLib/login/useLogin.ts index f5bc6c8..210f5ea 100644 --- a/src/vueLib/login/useLogin.ts +++ b/src/vueLib/login/useLogin.ts @@ -4,6 +4,7 @@ import { useNotify } from '../general/useNotify'; import type { Settings } from '../models/settings'; import { appName, logo } from '../models/settings'; import { clearLocalStorage, setLocalSettings } from 'src/localstorage/localStorage'; +import { routerInstance } from 'src/router'; const refreshTime = 10000; let intervalId: ReturnType | null = null; @@ -55,6 +56,7 @@ export function useLogin() { userStore.clearUser(); clearLocalStorage(); stopRefreshInterval(); + await routerInstance.push('/login'); } async function refresh() { diff --git a/src/vueLib/login/userStore.ts b/src/vueLib/login/userStore.ts index 67a80e7..e2b68dd 100644 --- a/src/vueLib/login/userStore.ts +++ b/src/vueLib/login/userStore.ts @@ -12,6 +12,7 @@ const { NotifyResponse } = useNotify(); export const useUserStore = defineStore('user', { state: (): UserState => ({ user: null, + firstLogin: false, }), getters: { isAuthenticated: (state: UserState): boolean => { @@ -42,6 +43,9 @@ export const useUserStore = defineStore('user', { }, }, actions: { + setFirstLogin(b: boolean) { + this.firstLogin = b; + }, async setUser(user: User) { await appApi .get('roles?role=' + user.role?.role) diff --git a/src/vueLib/models/user.ts b/src/vueLib/models/user.ts index 25dce0d..efb1193 100644 --- a/src/vueLib/models/user.ts +++ b/src/vueLib/models/user.ts @@ -8,8 +8,10 @@ export interface User { role: Role; permissions?: Permissions; settings?: Settings; + newDatabase?: boolean; } export interface UserState { user: User | null; + firstLogin: boolean; } diff --git a/src/vueLib/tables/users/UserTable.vue b/src/vueLib/tables/users/UserTable.vue index 47bd32d..be67121 100644 --- a/src/vueLib/tables/users/UserTable.vue +++ b/src/vueLib/tables/users/UserTable.vue @@ -227,16 +227,12 @@ function openPwdDialog(user: User) { //change password api request async function changePassword(user: User) { - console.log(8, user); if (user.password == user.newPassword) { NotifyResponse(i18n.global.t('samePasswordEntered'), 'error'); return; } - await appApi - .post('/users/new/password', user) - .then((resp) => console.log(67, resp)) - .catch((err) => console.error(err)); + await appApi.post('/users/new/password', user).catch((err) => console.error(err)); changePwdDialog.value.close(); }