Skip to content

Commit d09fed9

Browse files
committed
feat: improve auth session controls and terminal workflow
1 parent 970b916 commit d09fed9

15 files changed

Lines changed: 678 additions & 98 deletions

File tree

frontend/src/client/auth.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
11
const TOKEN_KEY = 'token'
2+
const REMEMBER_LOGIN_KEY = 'rememberLogin'
23

34
export const getAuthToken = () => {
45
const sessionToken = sessionStorage.getItem(TOKEN_KEY)
56
if (sessionToken) return sessionToken
67

7-
// Backward compatibility: migrate old localStorage token once.
8-
const legacyToken = localStorage.getItem(TOKEN_KEY)
9-
if (!legacyToken) return ''
10-
sessionStorage.setItem(TOKEN_KEY, legacyToken)
11-
localStorage.removeItem(TOKEN_KEY)
12-
return legacyToken
8+
const rememberedToken = localStorage.getItem(TOKEN_KEY)
9+
if (rememberedToken) return rememberedToken
10+
11+
return ''
1312
}
1413

15-
export const setAuthToken = (token: string) => {
14+
export const setAuthToken = (token: string, remember = false) => {
15+
if (remember) {
16+
localStorage.setItem(TOKEN_KEY, token)
17+
localStorage.setItem(REMEMBER_LOGIN_KEY, '1')
18+
sessionStorage.removeItem(TOKEN_KEY)
19+
return
20+
}
21+
1622
sessionStorage.setItem(TOKEN_KEY, token)
23+
sessionStorage.setItem(REMEMBER_LOGIN_KEY, '0')
1724
localStorage.removeItem(TOKEN_KEY)
25+
localStorage.removeItem(REMEMBER_LOGIN_KEY)
1826
}
1927

2028
export const clearAuthToken = () => {
2129
sessionStorage.removeItem(TOKEN_KEY)
30+
sessionStorage.removeItem(REMEMBER_LOGIN_KEY)
2231
localStorage.removeItem(TOKEN_KEY)
32+
localStorage.removeItem(REMEMBER_LOGIN_KEY)
2333
}
34+
35+
export const getRememberLogin = () => localStorage.getItem(REMEMBER_LOGIN_KEY) === '1'

frontend/src/views/Login/LoginForm.vue

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup lang="ts">
2-
import { ref } from 'vue'
2+
import { onMounted, ref } from 'vue'
33
import { client, AuthService } from '@/client/api'
4-
import { setAuthToken } from '@/client/auth'
4+
import { getRememberLogin, setAuthToken } from '@/client/auth'
55
import { createDebugApiBaseUrl, getDefaultApiBaseUrl } from '@/client/base'
66
import { getErrorMessage } from '@/client/utils'
77
import router from '@/router'
@@ -18,6 +18,7 @@ const toast = useToastStore()
1818
const nonebotStore = useNoneBotStore()
1919
2020
const token = ref('')
21+
const rememberLogin = ref(false)
2122
const isDebug = ref(false)
2223
const host = ref('')
2324
const port = ref('')
@@ -51,7 +52,7 @@ const login = async () => {
5152
}
5253
5354
if (data?.detail) {
54-
setAuthToken(data.detail)
55+
setAuthToken(data.detail, rememberLogin.value)
5556
client.interceptors.request.use((request: ClientRequest) => {
5657
request.headers.set('Authorization', `Bearer ${data.detail}`)
5758
return request
@@ -61,6 +62,10 @@ const login = async () => {
6162
toast.add('success', '登录成功', '', 5000)
6263
}
6364
}
65+
66+
onMounted(() => {
67+
rememberLogin.value = getRememberLogin()
68+
})
6469
</script>
6570

6671
<template>
@@ -76,13 +81,19 @@ const login = async () => {
7681
required
7782
/>
7883
<div class="label">
79-
<span class="label-text">开发模式</span>
80-
<input
81-
type="checkbox"
82-
class="checkbox checkbox-xs"
83-
:checked="isDebug"
84-
@click="isDebug = !isDebug"
85-
/>
84+
<div class="flex items-center gap-2">
85+
<span class="label-text">记住登录</span>
86+
<input v-model="rememberLogin" type="checkbox" class="checkbox checkbox-xs" />
87+
</div>
88+
<div class="flex items-center gap-2">
89+
<span class="label-text">开发模式</span>
90+
<input
91+
type="checkbox"
92+
class="checkbox checkbox-xs"
93+
:checked="isDebug"
94+
@click="isDebug = !isDebug"
95+
/>
96+
</div>
8697
</div>
8798
</label>
8899

0 commit comments

Comments
 (0)