48 lines
1.3 KiB
Vue
48 lines
1.3 KiB
Vue
<template>
|
||
<div class="login-box">
|
||
<h2>系统登录</h2>
|
||
<input v-model="form.username" placeholder="用户名" />
|
||
<input v-model="form.password" type="password" placeholder="密码" />
|
||
<button @click="handleLogin">登录</button>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { reactive } from 'vue'
|
||
import { useRouter } from 'vue-router'
|
||
import { useUserStore } from '../stores/user'
|
||
import axios from '../api/request' // 导入我们封装的 request
|
||
|
||
const router = useRouter()
|
||
const userStore = useUserStore()
|
||
const form = reactive({ username: '', password: '' })
|
||
|
||
const handleLogin = async () => {
|
||
try {
|
||
// 这里暂时模拟后端返回,等您Flask写好了把下面注释解开
|
||
/*
|
||
const res = await axios.post('/login', form)
|
||
userStore.login(res.data) // res.data 包含 token, username, role
|
||
*/
|
||
|
||
// --- 模拟数据开始 ---
|
||
if(form.username) {
|
||
userStore.login({
|
||
token: 'fake-jwt-token-123',
|
||
username: form.username,
|
||
role: form.username === 'admin' ? 'admin' : 'engineer'
|
||
})
|
||
router.push('/dashboard')
|
||
}
|
||
// --- 模拟数据结束 ---
|
||
|
||
} catch (error) {
|
||
alert('登录失败')
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.login-box { width: 300px; margin: 100px auto; display: flex; flex-direction: column; gap: 10px; }
|
||
</style>
|