|
|
|
@ -12,21 +12,29 @@
|
|
|
|
<div class="brand-section">
|
|
|
|
<div class="brand-section">
|
|
|
|
<div class="brand-content">
|
|
|
|
<div class="brand-content">
|
|
|
|
<div class="brand-icon">
|
|
|
|
<div class="brand-icon">
|
|
|
|
<el-icon :size="48"><DataAnalysis /></el-icon>
|
|
|
|
<el-icon :size="48">
|
|
|
|
|
|
|
|
<DataAnalysis/>
|
|
|
|
|
|
|
|
</el-icon>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<h1 class="brand-title">数据工厂</h1>
|
|
|
|
<h1 class="brand-title">数据工厂</h1>
|
|
|
|
<p class="brand-desc">智能数据处理与分析平台</p>
|
|
|
|
<p class="brand-desc">智能数据处理与分析平台</p>
|
|
|
|
<div class="brand-features">
|
|
|
|
<div class="brand-features">
|
|
|
|
<div class="feature-item">
|
|
|
|
<div class="feature-item">
|
|
|
|
<el-icon><Check /></el-icon>
|
|
|
|
<el-icon>
|
|
|
|
|
|
|
|
<Check/>
|
|
|
|
|
|
|
|
</el-icon>
|
|
|
|
<span>数据连接与集成</span>
|
|
|
|
<span>数据连接与集成</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="feature-item">
|
|
|
|
<div class="feature-item">
|
|
|
|
<el-icon><Check /></el-icon>
|
|
|
|
<el-icon>
|
|
|
|
|
|
|
|
<Check/>
|
|
|
|
|
|
|
|
</el-icon>
|
|
|
|
<span>流程自动化处理</span>
|
|
|
|
<span>流程自动化处理</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="feature-item">
|
|
|
|
<div class="feature-item">
|
|
|
|
<el-icon><Check /></el-icon>
|
|
|
|
<el-icon>
|
|
|
|
|
|
|
|
<Check/>
|
|
|
|
|
|
|
|
</el-icon>
|
|
|
|
<span>智能数据标注</span>
|
|
|
|
<span>智能数据标注</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
@ -83,7 +91,8 @@
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item>
|
|
|
|
<el-form-item>
|
|
|
|
<div class="register-link">
|
|
|
|
<div class="register-link">
|
|
|
|
还没有账号?<router-link to="/register">立即注册</router-link>
|
|
|
|
还没有账号?
|
|
|
|
|
|
|
|
<router-link to="/register">立即注册</router-link>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
</el-form>
|
|
|
|
@ -94,10 +103,10 @@
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
<script setup lang="ts">
|
|
|
|
import { User, Lock, DataAnalysis, Check } from '@element-plus/icons-vue'
|
|
|
|
import {User, Lock, DataAnalysis, Check} from '@element-plus/icons-vue'
|
|
|
|
import { ElMessage, FormInstance, FormRules } from 'element-plus'
|
|
|
|
import {ElMessage, FormInstance, FormRules} from 'element-plus'
|
|
|
|
import { useUserStore } from '@/stores/modules/user'
|
|
|
|
import {useUserStore} from '@/stores/modules/user'
|
|
|
|
import { useRouter, useRoute } from 'vue-router'
|
|
|
|
import {useRouter, useRoute} from 'vue-router'
|
|
|
|
|
|
|
|
|
|
|
|
const router = useRouter()
|
|
|
|
const router = useRouter()
|
|
|
|
const route = useRoute()
|
|
|
|
const route = useRoute()
|
|
|
|
@ -114,11 +123,11 @@ const loginForm = reactive({
|
|
|
|
|
|
|
|
|
|
|
|
const loginRules: FormRules = {
|
|
|
|
const loginRules: FormRules = {
|
|
|
|
username: [
|
|
|
|
username: [
|
|
|
|
{ required: true, message: '请输入用户名', trigger: 'blur' },
|
|
|
|
{required: true, message: '请输入用户名', trigger: 'blur'},
|
|
|
|
{ min: 1, max: 50, message: '用户名长度不超过50字符', trigger: 'blur' }
|
|
|
|
{min: 1, max: 50, message: '用户名长度不超过50字符', trigger: 'blur'}
|
|
|
|
],
|
|
|
|
],
|
|
|
|
password: [
|
|
|
|
password: [
|
|
|
|
{ required: true, message: '请输入密码', trigger: 'blur' }
|
|
|
|
{required: true, message: '请输入密码', trigger: 'blur'}
|
|
|
|
]
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -127,7 +136,7 @@ onMounted(() => {
|
|
|
|
const savedCredentials = localStorage.getItem('login-credentials')
|
|
|
|
const savedCredentials = localStorage.getItem('login-credentials')
|
|
|
|
if (savedCredentials) {
|
|
|
|
if (savedCredentials) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const { username, password } = JSON.parse(atob(savedCredentials))
|
|
|
|
const {username, password} = JSON.parse(atob(savedCredentials))
|
|
|
|
loginForm.username = username || ''
|
|
|
|
loginForm.username = username || ''
|
|
|
|
loginForm.password = password || ''
|
|
|
|
loginForm.password = password || ''
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
@ -153,7 +162,7 @@ const handleLogin = async () => {
|
|
|
|
if (rememberPassword.value) {
|
|
|
|
if (rememberPassword.value) {
|
|
|
|
localStorage.setItem(
|
|
|
|
localStorage.setItem(
|
|
|
|
'login-credentials',
|
|
|
|
'login-credentials',
|
|
|
|
btoa(JSON.stringify({ username: loginForm.username, password: loginForm.password }))
|
|
|
|
btoa(JSON.stringify({username: loginForm.username, password: loginForm.password}))
|
|
|
|
)
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
localStorage.removeItem('login-credentials')
|
|
|
|
localStorage.removeItem('login-credentials')
|
|
|
|
@ -247,8 +256,7 @@ const handleLogin = async () => {
|
|
|
|
content: '';
|
|
|
|
content: '';
|
|
|
|
position: absolute;
|
|
|
|
position: absolute;
|
|
|
|
inset: 0;
|
|
|
|
inset: 0;
|
|
|
|
background:
|
|
|
|
background: radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
|
|
|
|
radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
|
|
|
|
|
|
|
|
radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%);
|
|
|
|
radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|