mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-07-07 15:31:29 +08:00
add login
This commit is contained in:
34
src/api/index.ts
Normal file
34
src/api/index.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import router from '@/router'
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
|
||||||
|
// 创建axios实例
|
||||||
|
const api = axios.create({
|
||||||
|
baseURL: 'http://localhost:3001/api/v1',
|
||||||
|
})
|
||||||
|
|
||||||
|
// 添加请求拦截器
|
||||||
|
api.interceptors.request.use(config => {
|
||||||
|
const token = localStorage.getItem('token')
|
||||||
|
|
||||||
|
// 在请求头中添加token
|
||||||
|
if (token) {
|
||||||
|
config.headers['Authorization'] = `Bearer ${token}`
|
||||||
|
}
|
||||||
|
|
||||||
|
return config
|
||||||
|
})
|
||||||
|
|
||||||
|
// 添加响应拦截器
|
||||||
|
api.interceptors.response.use(response => {
|
||||||
|
return response.data
|
||||||
|
}, error => {
|
||||||
|
if (error.response.status === 403) {
|
||||||
|
// token验证失败,跳转到登录页面
|
||||||
|
router.push('/login')
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.reject(error)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default api
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import axios from 'axios'
|
||||||
import { useTheme } from 'vuetify'
|
import { useTheme } from 'vuetify'
|
||||||
import AuthProvider from '@/views/pages/authentication/AuthProvider.vue'
|
|
||||||
|
|
||||||
|
import api from '@/api'
|
||||||
|
import router from '@/router'
|
||||||
import logo from '@images/logo.svg?raw'
|
import logo from '@images/logo.svg?raw'
|
||||||
import authV1MaskDark from '@images/pages/auth-v1-mask-dark.png'
|
import authV1MaskDark from '@images/pages/auth-v1-mask-dark.png'
|
||||||
import authV1MaskLight from '@images/pages/auth-v1-mask-light.png'
|
import authV1MaskLight from '@images/pages/auth-v1-mask-light.png'
|
||||||
@@ -9,9 +11,9 @@ import authV1Tree2 from '@images/pages/auth-v1-tree-2.png'
|
|||||||
import authV1Tree from '@images/pages/auth-v1-tree.png'
|
import authV1Tree from '@images/pages/auth-v1-tree.png'
|
||||||
|
|
||||||
const form = ref({
|
const form = ref({
|
||||||
email: '',
|
username: '',
|
||||||
password: '',
|
password: '',
|
||||||
remember: false,
|
remember: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
const vuetifyTheme = useTheme()
|
const vuetifyTheme = useTheme()
|
||||||
@@ -23,6 +25,46 @@ const authThemeMask = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const isPasswordVisible = ref(false)
|
const isPasswordVisible = ref(false)
|
||||||
|
|
||||||
|
// 登录获取token事件
|
||||||
|
const login = () => {
|
||||||
|
// 用户名密码
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('username', form.value.username);
|
||||||
|
formData.append('password', form.value.password);
|
||||||
|
// 请求token
|
||||||
|
api.post('/login/access-token', formData)
|
||||||
|
.then((response: { access_token: any }) => {
|
||||||
|
// 获取token
|
||||||
|
const token = response.access_token
|
||||||
|
|
||||||
|
// 将token保存在本地存储中,用于后续请求
|
||||||
|
localStorage.setItem('token', token)
|
||||||
|
|
||||||
|
// 跳转到首页
|
||||||
|
router.push('/')
|
||||||
|
})
|
||||||
|
.catch((error: any) => {
|
||||||
|
// 登录失败,显示错误提示
|
||||||
|
alert(error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加请求拦截器
|
||||||
|
axios.interceptors.request.use(
|
||||||
|
config => {
|
||||||
|
const token = localStorage.getItem('token');
|
||||||
|
if (token) {
|
||||||
|
// 在请求头中添加token
|
||||||
|
config.headers.Authorization = `Bearer ${token}`;
|
||||||
|
}
|
||||||
|
return config;
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -54,14 +96,15 @@ const isPasswordVisible = ref(false)
|
|||||||
</VCardText>
|
</VCardText>
|
||||||
|
|
||||||
<VCardText>
|
<VCardText>
|
||||||
<VForm @submit.prevent="() => {}">
|
<VForm @submit.prevent="login">
|
||||||
<VRow>
|
<VRow>
|
||||||
<!-- email -->
|
<!-- username -->
|
||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VTextField
|
<VTextField
|
||||||
v-model="form.email"
|
v-model="form.username"
|
||||||
label="用户名"
|
label="用户名"
|
||||||
type="email"
|
type="text"
|
||||||
|
required
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
|
|
||||||
@@ -73,6 +116,7 @@ const isPasswordVisible = ref(false)
|
|||||||
:type="isPasswordVisible ? 'text' : 'password'"
|
:type="isPasswordVisible ? 'text' : 'password'"
|
||||||
:append-inner-icon="isPasswordVisible ? 'mdi-eye-off-outline' : 'mdi-eye-outline'"
|
:append-inner-icon="isPasswordVisible ? 'mdi-eye-off-outline' : 'mdi-eye-outline'"
|
||||||
@click:append-inner="isPasswordVisible = !isPasswordVisible"
|
@click:append-inner="isPasswordVisible = !isPasswordVisible"
|
||||||
|
required
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- remember me checkbox -->
|
<!-- remember me checkbox -->
|
||||||
@@ -80,6 +124,7 @@ const isPasswordVisible = ref(false)
|
|||||||
<VCheckbox
|
<VCheckbox
|
||||||
v-model="form.remember"
|
v-model="form.remember"
|
||||||
label="保持登录"
|
label="保持登录"
|
||||||
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -87,7 +132,6 @@ const isPasswordVisible = ref(false)
|
|||||||
<VBtn
|
<VBtn
|
||||||
block
|
block
|
||||||
type="submit"
|
type="submit"
|
||||||
to="/"
|
|
||||||
>
|
>
|
||||||
登录
|
登录
|
||||||
</VBtn>
|
</VBtn>
|
||||||
|
|||||||
Reference in New Issue
Block a user