1 changed files with 407 additions and 0 deletions
@ -0,0 +1,407 @@ |
|||
<template> |
|||
<div class="login-page"> |
|||
<div class="login-container"> |
|||
<!-- 左侧品牌区 --> |
|||
<div class="login-brand"> |
|||
<div class="brand-inner"> |
|||
<div class="brand-logo"> |
|||
<svg viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"> |
|||
<!-- 仓库轮廓 --> |
|||
<rect x="6" y="24" width="52" height="32" rx="2" fill="rgba(255,255,255,0.15)" stroke="rgba(255,255,255,0.8)" stroke-width="1.5"/> |
|||
<!-- 屋顶 --> |
|||
<polygon points="2,26 32,8 62,26" fill="rgba(255,255,255,0.25)" stroke="rgba(255,255,255,0.9)" stroke-width="1.5" stroke-linejoin="round"/> |
|||
<!-- 门 --> |
|||
<rect x="24" y="38" width="16" height="18" rx="1" fill="rgba(255,255,255,0.3)" stroke="rgba(255,255,255,0.8)" stroke-width="1.2"/> |
|||
<!-- 货架线 --> |
|||
<line x1="10" y1="36" x2="20" y2="36" stroke="rgba(255,255,255,0.7)" stroke-width="1.2"/> |
|||
<line x1="10" y1="42" x2="20" y2="42" stroke="rgba(255,255,255,0.7)" stroke-width="1.2"/> |
|||
<line x1="44" y1="36" x2="54" y2="36" stroke="rgba(255,255,255,0.7)" stroke-width="1.2"/> |
|||
<line x1="44" y1="42" x2="54" y2="42" stroke="rgba(255,255,255,0.7)" stroke-width="1.2"/> |
|||
</svg> |
|||
</div> |
|||
<h1 class="brand-name">BOYING WMS</h1> |
|||
<p class="brand-desc">智能仓储管理系统</p> |
|||
<div class="brand-divider"></div> |
|||
<div class="brand-features"> |
|||
<div class="feature-item"> |
|||
<i class="el-icon-s-grid"></i> |
|||
<span>库存管理</span> |
|||
</div> |
|||
<div class="feature-item"> |
|||
<i class="el-icon-truck"></i> |
|||
<span>出入库管理</span> |
|||
</div> |
|||
<div class="feature-item"> |
|||
<i class="el-icon-data-analysis"></i> |
|||
<span>报表分析</span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- 右侧登录表单 --> |
|||
<div class="login-form-wrap"> |
|||
<div class="form-header"> |
|||
<h2 class="form-title">用户登录</h2> |
|||
<p class="form-subtitle">欢迎使用,请输入账号密码</p> |
|||
</div> |
|||
|
|||
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()"> |
|||
<el-form-item prop="userName"> |
|||
<div class="input-wrap"> |
|||
<i class="input-icon el-icon-user"></i> |
|||
<el-input v-model="dataForm.userName" placeholder="请输入账号" class="login-input"></el-input> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item prop="password"> |
|||
<div class="input-wrap"> |
|||
<i class="input-icon el-icon-lock"></i> |
|||
<el-input v-model="dataForm.password" type="password" placeholder="请输入密码" class="login-input"></el-input> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button class="login-btn" @click="dataFormSubmit()">登 录</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
<p class="login-footer">Copyright © {{ new Date().getFullYear() }} Boying. All rights reserved.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { getUUID } from '@/utils' |
|||
import {getConfigParams} from '@/api/sysConfig.js' |
|||
export default { |
|||
data () { |
|||
return { |
|||
src: 'http://192.168.1.83/upload/ifs.png', |
|||
dataForm: { |
|||
userName: '', |
|||
password: '', |
|||
uuid: '', |
|||
captcha: '' |
|||
}, |
|||
dataRule: { |
|||
userName: [ |
|||
{ required: true, message: '帐号不能为空', trigger: 'blur' } |
|||
], |
|||
password: [ |
|||
{ required: true, message: '密码不能为空', trigger: 'blur' } |
|||
] |
|||
}, |
|||
captchaPath: '' |
|||
} |
|||
}, |
|||
computed: { |
|||
multiLanguage: { |
|||
get() { |
|||
return this.$store.state.user.multiLanguage |
|||
}, |
|||
set(val) { |
|||
this.$store.commit('user/updateMultiLanguage', val) |
|||
} |
|||
}, |
|||
authControl: { |
|||
get() { |
|||
return this.$store.state.user.authControl |
|||
}, |
|||
set(val) { |
|||
this.$store.commit('user/updateAuthControl', val) |
|||
} |
|||
} |
|||
}, |
|||
created () { |
|||
this.userName(); |
|||
}, |
|||
methods: { |
|||
// 获取上次登陆的用户名 |
|||
userName(){ |
|||
this.dataForm.userName = localStorage.getItem('userName') |
|||
}, |
|||
// 提交表单 |
|||
dataFormSubmit () { |
|||
this.$refs['dataForm'].validate((valid) => { |
|||
if (valid) { |
|||
this.$http({ |
|||
url: this.$http.adornUrl('/sys/login'), |
|||
method: 'post', |
|||
data: this.$http.adornData({ |
|||
'username': this.dataForm.userName, |
|||
'password': this.dataForm.password, |
|||
'uuid': this.dataForm.uuid |
|||
}) |
|||
}).then(({data}) => { |
|||
if (data && data.code === 0) { |
|||
this.$cookie.set('token', data.token) |
|||
this.$router.replace({ name: 'home' }) |
|||
this.$i18n.locale=data.language |
|||
localStorage.setItem('locale', data.language) |
|||
localStorage.setItem('refresh', "0") |
|||
localStorage.setItem('userName', this.dataForm.userName) |
|||
this.getConfigParams() |
|||
} else { |
|||
this.$message.error(data.msg) |
|||
} |
|||
}) |
|||
} |
|||
}) |
|||
}, |
|||
// 获取全局参数变量 |
|||
getConfigParams() { |
|||
getConfigParams().then(({data}) => { |
|||
if (data && data.code == 0) { |
|||
localStorage.setItem('configParams', JSON.stringify(data.data)) |
|||
// this.multiLanguage = JSON.parse(localStorage.getItem('configParams')).multiLanguage |
|||
// this.authControl = JSON.parse(localStorage.getItem('configParams')).authControl |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
$primary: #17B3A3; |
|||
$primary-dark: #13998b; |
|||
$white: #ffffff; |
|||
$text-primary: #303133; |
|||
$text-secondary: #909399; |
|||
$border: #dcdfe6; |
|||
|
|||
.login-page { |
|||
position: fixed; |
|||
inset: 0; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
background-color: #f1f4f5; |
|||
background-image: |
|||
radial-gradient(circle at 20% 50%, rgba(23, 179, 163, 0.06) 0%, transparent 50%), |
|||
radial-gradient(circle at 80% 20%, rgba(23, 179, 163, 0.04) 0%, transparent 40%); |
|||
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Microsoft YaHei", sans-serif; |
|||
} |
|||
|
|||
/* 主容器 */ |
|||
.login-container { |
|||
display: flex; |
|||
width: 840px; |
|||
height: 500px; |
|||
border-radius: 12px; |
|||
background: $white; |
|||
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.1); |
|||
overflow: hidden; |
|||
} |
|||
|
|||
/* 左侧品牌区 */ |
|||
.login-brand { |
|||
width: 360px; |
|||
flex-shrink: 0; |
|||
background: linear-gradient(150deg, $primary 0%, $primary-dark 100%); |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
padding: 48px 40px; |
|||
position: relative; |
|||
overflow: hidden; |
|||
|
|||
&::before { |
|||
content: ''; |
|||
position: absolute; |
|||
top: -60px; |
|||
right: -60px; |
|||
width: 200px; |
|||
height: 200px; |
|||
border-radius: 50%; |
|||
background: rgba(255, 255, 255, 0.06); |
|||
} |
|||
&::after { |
|||
content: ''; |
|||
position: absolute; |
|||
bottom: -80px; |
|||
left: -40px; |
|||
width: 260px; |
|||
height: 260px; |
|||
border-radius: 50%; |
|||
background: rgba(255, 255, 255, 0.05); |
|||
} |
|||
} |
|||
|
|||
.brand-inner { |
|||
position: relative; |
|||
z-index: 1; |
|||
text-align: center; |
|||
width: 100%; |
|||
} |
|||
|
|||
.brand-logo svg { |
|||
width: 72px; |
|||
height: 72px; |
|||
margin-bottom: 20px; |
|||
filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15)); |
|||
} |
|||
|
|||
.brand-name { |
|||
font-size: 26px; |
|||
font-weight: 700; |
|||
color: $white; |
|||
letter-spacing: 3px; |
|||
margin: 0 0 8px 0; |
|||
} |
|||
|
|||
.brand-desc { |
|||
font-size: 13px; |
|||
color: rgba(255, 255, 255, 0.75); |
|||
margin: 0; |
|||
letter-spacing: 1px; |
|||
} |
|||
|
|||
.brand-divider { |
|||
width: 40px; |
|||
height: 2px; |
|||
background: rgba(255, 255, 255, 0.4); |
|||
margin: 24px auto; |
|||
border-radius: 1px; |
|||
} |
|||
|
|||
.brand-features { |
|||
display: flex; |
|||
flex-direction: column; |
|||
gap: 12px; |
|||
text-align: left; |
|||
} |
|||
|
|||
.feature-item { |
|||
display: flex; |
|||
align-items: center; |
|||
gap: 10px; |
|||
color: rgba(255, 255, 255, 0.85); |
|||
font-size: 13px; |
|||
|
|||
i { |
|||
font-size: 15px; |
|||
color: rgba(255, 255, 255, 0.9); |
|||
width: 18px; |
|||
text-align: center; |
|||
} |
|||
} |
|||
|
|||
/* 右侧表单区 */ |
|||
.login-form-wrap { |
|||
flex: 1; |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
padding: 52px 52px 40px; |
|||
} |
|||
|
|||
.form-header { |
|||
margin-bottom: 32px; |
|||
} |
|||
|
|||
.form-title { |
|||
font-size: 22px; |
|||
font-weight: 600; |
|||
color: $text-primary; |
|||
margin: 0 0 8px 0; |
|||
} |
|||
|
|||
.form-subtitle { |
|||
font-size: 13px; |
|||
color: $text-secondary; |
|||
margin: 0; |
|||
} |
|||
|
|||
/* 输入框 */ |
|||
.input-wrap { |
|||
position: relative; |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
|
|||
.input-icon { |
|||
position: absolute; |
|||
left: 12px; |
|||
z-index: 2; |
|||
font-size: 15px; |
|||
color: #c0c4cc; |
|||
pointer-events: none; |
|||
transition: color 0.2s; |
|||
} |
|||
|
|||
.login-input { |
|||
::v-deep .el-input__inner { |
|||
height: 42px; |
|||
line-height: 42px; |
|||
border: 1px solid $border; |
|||
border-radius: 6px; |
|||
color: $text-primary; |
|||
font-size: 13px; |
|||
padding-left: 36px; |
|||
background: $white; |
|||
transition: border-color 0.2s, box-shadow 0.2s; |
|||
|
|||
&::placeholder { |
|||
color: #c0c4cc; |
|||
} |
|||
|
|||
&:hover { |
|||
border-color: #c0c4cc; |
|||
} |
|||
|
|||
&:focus { |
|||
border-color: $primary; |
|||
box-shadow: 0 0 0 2px rgba(23, 179, 163, 0.12); |
|||
} |
|||
} |
|||
} |
|||
|
|||
.input-wrap:focus-within .input-icon { |
|||
color: $primary; |
|||
} |
|||
|
|||
.el-form-item { |
|||
margin-bottom: 18px; |
|||
|
|||
::v-deep .el-form-item__error { |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
|
|||
/* 登录按钮 */ |
|||
.login-btn { |
|||
width: 100%; |
|||
height: 42px; |
|||
margin-top: 4px; |
|||
background-color: $primary; |
|||
border: none; |
|||
border-radius: 6px; |
|||
color: $white; |
|||
font-size: 14px; |
|||
letter-spacing: 3px; |
|||
font-weight: 500; |
|||
cursor: pointer; |
|||
transition: background-color 0.2s, box-shadow 0.2s, transform 0.15s; |
|||
box-shadow: 0 4px 12px rgba(23, 179, 163, 0.3); |
|||
|
|||
&:hover, &:focus { |
|||
background-color: $primary-dark; |
|||
box-shadow: 0 6px 16px rgba(23, 179, 163, 0.4); |
|||
color: $white; |
|||
transform: translateY(-1px); |
|||
} |
|||
|
|||
&:active { |
|||
transform: translateY(0); |
|||
box-shadow: 0 2px 8px rgba(23, 179, 163, 0.25); |
|||
} |
|||
} |
|||
|
|||
.login-footer { |
|||
margin-top: 28px; |
|||
font-size: 11px; |
|||
color: #c0c4cc; |
|||
text-align: center; |
|||
} |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue