230 lines
6.1 KiB
Vue
230 lines
6.1 KiB
Vue
<template>
|
|
<section class="AppSign">
|
|
<div class="left signLeftBg">
|
|
<el-row type="flex" align="middle">
|
|
<img class="AiIcon" v-if="/[\\\/]/.test(logo.icon)" :src="logo.icon" alt=""/>
|
|
<ai-icon v-else-if="logo.icon" type="logo" :icon="logo.icon"/>
|
|
<div v-if="logo.text" class="logoText mar-l8" v-text="logo.text"/>
|
|
</el-row>
|
|
<div class="signLeftContent">
|
|
<div class="titlePane">
|
|
<b v-text="system.name"/>
|
|
<div v-text="system.title"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="right">
|
|
<div class="projectName mar-b48" :title="system.fullTitle">{{ system.fullTitle }}</div>
|
|
<el-card class="signBox">
|
|
<div class="choosePlatform flex column" v-if="!isAdmin&&!form.type">
|
|
<div class="font-20 mar-b40 t-center t-bold">请选择业务端后登陆</div>
|
|
<div class="selectPlatform fill">
|
|
<div class="flex center pointer" v-for="op in platforms" :key="op.dictValue"
|
|
v-text="op.dictName" @click="$set(form,'type',op.dictValue)"/>
|
|
</div>
|
|
<div class="mar-t32 font-12" style="align-self: flex-end">
|
|
未注册用户请扫码添加客服咨询
|
|
<i class="iconfont iconEwm" style="font-size: 20px"/>
|
|
</div>
|
|
</div>
|
|
<template v-else>
|
|
<div class="font-20 mar-b40 t-center t-bold"><i v-if="!isAdmin" class="el-icon-back" @click="form.type=null"/>账号登录</div>
|
|
<el-form :model="form" ref="form" :rules="rules">
|
|
<el-form-item prop="username">
|
|
<el-input v-model="form.username" placeholder="请输入您的账号"/>
|
|
</el-form-item>
|
|
<el-form-item prop="password">
|
|
<el-input type="password" v-model="form.password" placeholder="请输入您的密码" show-password/>
|
|
</el-form-item>
|
|
</el-form>
|
|
<div class="t-right font-12">忘记密码请联系客服处理</div>
|
|
<el-button type="primary" class="login-btn" @click="handleSignIn">登录</el-button>
|
|
</template>
|
|
</el-card>
|
|
<el-row type="flex" align="middle" class="bottomRecord">
|
|
<div v-if="system.recordDesc" v-text="system.recordDesc"/>
|
|
<el-link v-if="system.recordNo" v-text="system.recordNo" :href="system.recordURL"/>
|
|
<div v-if="system.ssl" v-html="system.ssl"/>
|
|
</el-row>
|
|
</div>
|
|
</section>
|
|
</template>
|
|
|
|
<script>
|
|
import {mapMutations, mapState} from 'vuex'
|
|
|
|
const rules = {
|
|
username: [{required: true, message: '请输入您的账号', trigger: 'blur'}],
|
|
password: [{required: true, message: '请输入您的密码', trigger: 'blur'}]
|
|
}
|
|
|
|
export default {
|
|
name: "AppSign",
|
|
label: "登录页",
|
|
data() {
|
|
return {
|
|
rules,
|
|
form: {}
|
|
}
|
|
},
|
|
computed: {
|
|
...mapState(['user', 'sys']),
|
|
instance: v => v.$request,
|
|
system: v => v.sys?.info || {
|
|
fullTitle: '畜牧养殖产业一体化平台'
|
|
},
|
|
logo: v => !!v.system.loginLogo ? {icon: v.system.loginLogo, text: v.system.loginLogoText} : {icon: v.system.logo, text: v.system.logoText},
|
|
isAdmin: v => v.$route.hash == "#sinoecare", //用来判断是否是管理员登录,
|
|
dict: v => v.$dict,
|
|
platforms: v => v.dict.getDict('roleType').filter(e => !['platform', 'other', 'service'].includes(e.dictValue))
|
|
},
|
|
created() {
|
|
this.dict.load("roleType")
|
|
if (this.user.token) {
|
|
this.handleGotoHome()
|
|
} else {
|
|
const {code} = this.$route.query
|
|
if (code) {
|
|
this.toLogin(code)
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
...mapMutations(['setToken']),
|
|
login(data) {
|
|
if (data?.access_token) {
|
|
this.setToken([data.token_type, data.access_token].join(" "))
|
|
this.handleGotoHome()
|
|
}
|
|
},
|
|
handleGotoHome() {
|
|
this.$message.success("登录成功!")
|
|
if (this.$route.hash == "#dv") {
|
|
this.$router.push({name: "数据大屏入口", hash: "#dv"})
|
|
} else {
|
|
this.$router.push({name: "Home"})
|
|
}
|
|
},
|
|
handleSignIn() {
|
|
this.$refs.form.validate().then(() => {
|
|
const password = this.$encryption(this.form.password)
|
|
this.form.type = this.form.type || "platform"
|
|
this.$request.post("/oauth/token", null, {
|
|
auth: {username: 'villcloud', password: "villcloud"},
|
|
params: {grant_type: 'password', scope: 'server', ...this.form, password}
|
|
}).then(data => {
|
|
this.login(data)
|
|
})
|
|
})
|
|
}
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.AppSign {
|
|
display: flex;
|
|
box-sizing: border-box;
|
|
height: 100%;
|
|
|
|
|
|
.selectPlatform {
|
|
width: 100%;
|
|
display: grid;
|
|
grid-template-columns: repeat(2, 1fr);
|
|
grid-gap: 10px;
|
|
|
|
& > div {
|
|
color: #fff;
|
|
background: $primaryBtnColor;
|
|
border-radius: 4px;
|
|
|
|
&:hover {
|
|
opacity: 0.8;
|
|
}
|
|
}
|
|
}
|
|
|
|
.signBox {
|
|
width: 500px;
|
|
min-height: 300px;
|
|
position: relative;
|
|
color: $primaryColor;
|
|
|
|
.choosePlatform {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
padding: inherit;
|
|
}
|
|
|
|
.el-icon-back {
|
|
position: absolute;
|
|
left: 20px;
|
|
top: 25px;
|
|
}
|
|
|
|
.login-btn {
|
|
font-size: 16px;
|
|
width: 100%;
|
|
height: 40px;
|
|
line-height: 40px;
|
|
margin: 16px auto;
|
|
padding: 0;
|
|
}
|
|
}
|
|
|
|
.AiIcon {
|
|
font-size: 40px;
|
|
height: 40px;
|
|
}
|
|
|
|
.logoText {
|
|
font-size: 20px;
|
|
}
|
|
|
|
:deep(.left) {
|
|
width: 480px;
|
|
flex-shrink: 0;
|
|
background-size: 100% 100%;
|
|
background-repeat: no-repeat;
|
|
padding-left: 64px;
|
|
padding-top: 40px;
|
|
box-sizing: border-box;
|
|
color: #fff;
|
|
font-size: 16px;
|
|
|
|
.iconcunwei1 {
|
|
font-size: 36px;
|
|
}
|
|
}
|
|
|
|
:deep(.right) {
|
|
flex: 1;
|
|
min-width: 0;
|
|
background-color: #F6F8FB;
|
|
background-repeat: no-repeat;
|
|
background-position: calc(100% - 80px) 0, calc(100% - 40px) 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
|
|
.bottomRecord {
|
|
font-size: 12px;
|
|
color: #999;
|
|
gap: 16px;
|
|
position: fixed;
|
|
bottom: 20px;
|
|
|
|
.el-link {
|
|
font-size: inherit;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
</style>
|