|
|
@@ -1,112 +0,0 @@
|
|
|
-<script setup lang="ts">
|
|
|
-import { ref, reactive } from 'vue'
|
|
|
-import { useRouter, useRoute } from 'vue-router'
|
|
|
-import { ElMessage } from 'element-plus'
|
|
|
-import type { FormInstance, FormRules } from 'element-plus'
|
|
|
-import { useUserStore } from '@/store/modules/user'
|
|
|
-
|
|
|
-const router = useRouter()
|
|
|
-const route = useRoute()
|
|
|
-const userStore = useUserStore()
|
|
|
-
|
|
|
-const formRef = ref<FormInstance>()
|
|
|
-const loading = ref(false)
|
|
|
-
|
|
|
-const form = reactive({ username: 'admin', password: '123456' })
|
|
|
-
|
|
|
-const rules: FormRules = {
|
|
|
- username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
|
|
|
- password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
|
|
|
-}
|
|
|
-
|
|
|
-async function handleLogin() {
|
|
|
- const valid = await formRef.value?.validate().catch(() => false)
|
|
|
- if (!valid) return
|
|
|
-
|
|
|
- loading.value = true
|
|
|
- try {
|
|
|
- await userStore.login(form.username, form.password)
|
|
|
- const redirect = (route.query.redirect as string) || '/'
|
|
|
- await router.replace(redirect)
|
|
|
- ElMessage.success('登录成功')
|
|
|
- } catch (error: unknown) {
|
|
|
- ElMessage.error(error instanceof Error ? error.message : '登录失败')
|
|
|
- } finally {
|
|
|
- loading.value = false
|
|
|
- }
|
|
|
-}
|
|
|
-</script>
|
|
|
-
|
|
|
-<template>
|
|
|
- <div class="login-page">
|
|
|
- <div class="login-box">
|
|
|
- <h2 class="login-title">后台管理系统</h2>
|
|
|
-
|
|
|
- <el-form ref="formRef" :model="form" :rules="rules" size="large">
|
|
|
- <el-form-item prop="username">
|
|
|
- <el-input v-model="form.username" placeholder="用户名" prefix-icon="User" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="password">
|
|
|
- <el-input
|
|
|
- v-model="form.password"
|
|
|
- type="password"
|
|
|
- placeholder="密码"
|
|
|
- prefix-icon="Lock"
|
|
|
- show-password
|
|
|
- @keyup.enter="handleLogin"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- :loading="loading"
|
|
|
- style="width: 100%"
|
|
|
- @click="handleLogin"
|
|
|
- >
|
|
|
- 登 录
|
|
|
- </el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
-
|
|
|
- <div class="login-hint">
|
|
|
- <p>管理员:admin / 123456 (可见所有菜单)</p>
|
|
|
- <p>编辑员:editor / 123456 (仅内容管理)</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-</template>
|
|
|
-
|
|
|
-<style scoped lang="scss">
|
|
|
-.login-page {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- height: 100vh;
|
|
|
- background: #0d0d12;
|
|
|
-}
|
|
|
-
|
|
|
-.login-box {
|
|
|
- width: 420px;
|
|
|
- padding: 48px 40px;
|
|
|
- background: #1a1a24;
|
|
|
- border-radius: 12px;
|
|
|
- border: 1px solid rgba(255, 255, 255, 0.06);
|
|
|
-}
|
|
|
-
|
|
|
-.login-title {
|
|
|
- color: #fff;
|
|
|
- text-align: center;
|
|
|
- margin: 0 0 32px;
|
|
|
- font-size: 22px;
|
|
|
- font-weight: 600;
|
|
|
-}
|
|
|
-
|
|
|
-.login-hint {
|
|
|
- margin-top: 16px;
|
|
|
- text-align: center;
|
|
|
- font-size: 12px;
|
|
|
- color: rgba(255, 255, 255, 0.3);
|
|
|
- line-height: 1.8;
|
|
|
- p { margin: 0; }
|
|
|
-}
|
|
|
-</style>
|