Files
h5/src/views/login/index.vue
T
2024-04-22 17:57:12 +08:00

491 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="login">
<div class="login-weaper">
<div class="login-left">
<div class="login-time">{{ time.txt }}</div>
<div class="login-left-box">
<div>
<!-- <div class="logo">{{ getThemeConfig.globalViceTitle }}</div> -->
<div class="logo">数字校园教育管理平台</div>
<!-- <h2 class="title">{{ getThemeConfig.globalViceDes }}</h2> -->
<h2 class="title">数字校园</h2>
<div class="msg">
<div class="msg-author">
<span>{{ quotations.name }}</span>
<span>{{ quotations.comeFrom }}</span>
</div>
<div class="msg-txt">{{ quotations.content }}</div>
</div>
</div>
</div>
</div>
<div class="login-right">
<div class="login-main">
<!-- <h4 class="login-title">{{ getThemeConfig.globalTitle }}</h4> -->
<h4 class="login-title">数字校园教育管理平台</h4>
<!-- <h5>请使用钉钉小程序扫码登录</h5> -->
<el-form class="el-form login-form">
<el-form-item style="margin-left: 0px" prop="phone">
<el-input
type="text"
:placeholder="$t('message.login.placeholder1')"
prefix-icon="el-icon-user"
v-model="loginForm.phone"
clearable
autocomplete="off"
>
</el-input>
</el-form-item>
<!-- <el-form-item style="margin-left: 0px" prop="code">
<el-input
type="code"
:placeholder="$t('message.login.placeholder2')"
prefix-icon="el-icon-lock"
v-model="loginForm.code"
autocomplete="off"
:show-code="true"
>
</el-input>
</el-form-item> -->
<el-form-item style="margin-left: 0px" prop="code">
<div class="el-row" span="24">
<div class="el-col el-col-14">
<el-input
type="text"
maxlength="4"
:placeholder="$t('message.login.placeholder2')"
prefix-icon="el-icon-lock"
v-model="loginForm.code"
clearable
autocomplete="off"
></el-input>
</div>
<div class="el-col el-col-10">
<div @click="onClickSendCode" class="login-code">
<!-- <span class="login-code-img" > -->
<!-- <i class="el-icon-position">{{ sendText }}</i> -->
<!-- </span> -->
<el-button class="el-icon-position" style="width: 100%">{{
sendText
}}</el-button>
</div>
</div>
</div>
</el-form-item>
<el-form-item style="margin: 40px 0px 0">
<el-button
type="primary"
class="login-submit"
@click="submitForm"
:loading="submit.loading"
>
<span>{{ $t("message.login.btnText") }}</span>
</el-button>
</el-form-item>
</el-form>
<div>版本:v2.2</div>
<!-- 第三方登录友情链接 -->
<!-- <div class="login-menu">
<a href="javascript:;">{{ $t("message.login.link.one1") }}</a>
<a href="javascript:;">{{ $t("message.login.link.one2") }}</a>
</div> -->
</div>
</div>
</div>
<div class="vue-particles">
<vue-particles
color="#dedede"
shapeType="star"
linesColor="#dedede"
hoverMode="grab"
clickMode="push"
style="height: 100%"
></vue-particles>
</div>
</div>
</template>
<script>
import { Session } from "@/utils/storage";
import { formatDate, formatAxis } from "@/utils/formatTime";
import { PrevLoading } from "@/utils/loading.js";
import { quotationsList } from "./mock";
import { useLoginApi } from "@/api/login";
import { Message } from "element-ui";
import { rulesPhone } from "@/com/index.js";
import { getSmsCaptcha, login } from "./api";
const LoginApi = useLoginApi();
export default {
name: "login",
data() {
return {
quotationsList,
quotations: {},
isView: false,
submit: {
loading: false,
},
loginForm: {
phone: "18015724687",
code: "",
},
time: {
txt: "",
fun: null,
},
sendText: "发送",
};
},
computed: {
// 获取当前时间
currentTime() {
return formatAxis(new Date());
},
// 获取布局配置信息
getThemeConfig() {
return this.$store.state.themeConfig.themeConfig;
},
},
created() {
const paragraph = "I think Ruth's dog is cuter than your dog! Ruth";
console.log(paragraph.replace("Ruth", "my"));
this.initTime();
},
mounted() {
this.initRandomQuotations();
// console.log(localStorage.getItem('user'))
console.log("this.$store.state.loginConfig");
console.log(this.$store.state.loginConfig.loginConfig);
},
methods: {
// 随机语录
initRandomQuotations() {
this.quotations = this.quotationsList[
Math.floor(Math.random() * this.quotationsList.length)
];
},
// 初始化左上角时间显示
initTime() {
this.time.txt = formatDate(new Date(), "YYYY-mm-dd HH:MM:SS WWW QQQQ");
this.time.fun = setInterval(() => {
this.time.txt = formatDate(new Date(), "YYYY-mm-dd HH:MM:SS WWW QQQQ");
}, 1000);
},
// 登录按钮点击
submitForm() {
console.log(this.$router);
if (rulesPhone(this.loginForm.phone)) {
// 判断是否存在手机号验证码
if (this.loginForm.code) {
this.submit.loading = true;
// 登录发请求获取用户信息
let obj = { ...this.$store.state.loginConfig.loginConfig, ...this.loginForm };
let formData = new FormData();
for (let key in obj) {
formData.append(key, obj[key]);
}
this.$store
.dispatch("loginIn", formData)
.then((res) => {
this.$message.success("登录成功!");
Session.set("token", res.token_type + " " + res.access_token);
// 设置用户信息 学校信息 班级信息
let user = this.$store.state.user;
if (user.campusInfo) {
if (user.campusInfo.length >= 1) {
// 说明只有一个校区
if (user.campusInfo[0].classInfo) {
this.$store.commit("setSchool", user.campusInfo[0]); // 设置默认校区
}
}
} else {
// 未查到校区信息
}
this.oldSet();
})
.finally((err) => {
this.submit.loading = false;
this.sendText = "发送";
});
} else {
this.$message.error("请输入验证码!");
}
} else {
this.$message.error("请输入正确的手机号!");
}
},
// 点击发送验证码
onClickSendCode() {
if (rulesPhone(this.loginForm.phone)) {
if (this.sendText == "发送" || this.sendText == "重新发送") {
getSmsCaptcha(this.loginForm.phone)
.then((res) => {
this.sendText = "发送成功";
})
.catch((err) => {
this.sendText = "重新发送";
});
}
} else {
this.$message.error("请输入正确的手机号!");
}
},
oldSet() {
let defaultRoles = [];
let defaultAuthBtnList = [];
// admin 页面权限标识,对应路由 meta.roles
let adminRoles = ["admin"];
// admin 按钮权限标识
let adminAuthBtnList = ["btn.add", "btn.del", "btn.edit", "btn.link"];
// common 页面权限标识,对应路由 meta.roles
let testAuthPageList = ["common"];
// test 按钮权限标识
let testAuthBtnList = ["btn.add", "btn.link"];
if (this.loginForm.phone === "admin") {
defaultRoles = adminRoles;
defaultAuthBtnList = adminAuthBtnList;
} else {
defaultRoles = testAuthPageList;
defaultAuthBtnList = testAuthBtnList;
}
const userInfos = {
phone: this.loginForm.phone === "admin" ? "admin" : "test",
photo:
this.loginForm.phone === "admin"
? "https://img0.baidu.com/it/u=1833472230,3849481738&fm=253&fmt=auto?w=200&h=200"
: "https://img2.baidu.com/it/u=2187913762,2708298335&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200",
time: new Date().getTime(),
roles: defaultRoles,
authBtnList: defaultAuthBtnList,
};
// 存储用户信息到浏览器缓存
Session.set("userInfo", userInfos);
// 存储用户信息到vuex
this.$store.dispatch("userInfos/setUserInfos", userInfos);
PrevLoading.start();
this.$router.push("/");
setTimeout(() => {
this.$message.success(
`${this.currentTime}${this.$t("message.login.signInText")}`
);
}, 300);
},
},
destroyed() {
clearInterval(this.time.fun);
},
/*
setTimeout(() => {
let defaultRoles = [];
let defaultAuthBtnList = [];
// admin 页面权限标识,对应路由 meta.roles
let adminRoles = ["admin"];
// admin 按钮权限标识
let adminAuthBtnList = ["btn.add", "btn.del", "btn.edit", "btn.link"];
// common 页面权限标识,对应路由 meta.roles
let testAuthPageList = ["common"];
// test 按钮权限标识
let testAuthBtnList = ["btn.add", "btn.link"];
if (this.loginForm.phone === "admin") {
defaultRoles = adminRoles;
defaultAuthBtnList = adminAuthBtnList;
} else {
defaultRoles = testAuthPageList;
defaultAuthBtnList = testAuthBtnList;
}
const userInfos = {
phone: this.loginForm.phone === "admin" ? "admin" : "test",
photo:
this.loginForm.phone === "admin"
? "https://img0.baidu.com/it/u=1833472230,3849481738&fm=253&fmt=auto?w=200&h=200"
: "https://img2.baidu.com/it/u=2187913762,2708298335&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200",
time: new Date().getTime(),
roles: defaultRoles,
authBtnList: defaultAuthBtnList,
};
// 存储 token 到浏览器缓存
Session.set("token", Math.random().toString(36).substr(0));
// 存储用户信息到浏览器缓存
Session.set("userInfo", userInfos);
// 存储用户信息到vuex
this.$store.dispatch("userInfos/setUserInfos", userInfos);
PrevLoading.start();
this.$router.push("/");
setTimeout(() => {
this.$message.success(
`${this.currentTime}${this.$t("message.login.signInText")}`
);
}, 300);
}, 300);
*/
};
</script>
<style scoped lang="scss">
.login {
height: 100%;
width: 100%;
overflow: hidden;
display: flex;
position: relative;
.vue-particles {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(
ellipse at top left,
rgba(105, 155, 200, 1) 0%,
rgba(181, 197, 216, 1) 57%
);
}
.login-weaper {
margin: auto;
height: 500px;
display: flex;
box-sizing: border-box;
position: relative;
z-index: 1;
border: none;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.login-left {
width: 491px;
padding: 20px;
font-size: 16px;
color: var(--prev-color-text-white);
position: relative;
background-color: var(--prev-color-primary);
display: flex;
flex-direction: column;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
.login-time {
width: 100%;
color: var(--prev-color-text-white);
opacity: 0.9;
font-size: 14px;
overflow: hidden;
}
.login-left-box {
flex: 1;
overflow: hidden;
position: relative;
z-index: 1;
display: flex;
align-items: center;
padding: 80px 45px;
.logo {
font-size: 22px;
margin-bottom: 15px;
}
.title {
color: var(--prev-color-text-white);
font-weight: 300;
letter-spacing: 2px;
font-size: 16px;
}
.msg {
color: var(--prev-color-text-white);
font-size: 13px;
margin-top: 35px;
.msg-author {
opacity: 0.6;
span:last-of-type {
margin-left: 15px;
}
}
.msg-txt {
margin-top: 15px;
line-height: 22px;
}
}
}
}
.login-right {
width: 491px;
padding: 20px;
position: relative;
align-items: center;
display: flex;
background-color: var(--prev-bg-white);
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
.login-main {
margin: 0 auto;
width: 70%;
.login-title {
color: var(--prev-color-text-primary);
margin-bottom: 40px;
font-weight: 500;
font-size: 22px;
text-align: center;
letter-spacing: 4px;
}
.login-form {
margin: 10px 0;
i {
color: var(--prev-color-text-primary);
}
.el-form-item {
margin-bottom: 20px !important;
.login-code {
display: flex;
align-items: center;
justify-content: space-around;
margin: 0 0 0 10px;
user-select: none;
.login-code-img {
margin-top: 2px;
width: 100px;
height: 38px;
border: 1px solid var(--prev-border-color-base);
color: var(--prev-color-text-primary);
font-size: 14px;
font-weight: 700;
letter-spacing: 5px;
line-height: 38px;
text-indent: 5px;
text-align: center;
cursor: pointer;
transition: all ease 0.2s;
border-radius: 4px;
font-weight: 400;
&:hover {
border-color: var(--prev-border-color-hover);
transition: all ease 0.2s;
}
}
}
.login-submit {
width: 100%;
letter-spacing: 2px;
}
}
}
.login-menu {
margin-top: 30px;
width: 100%;
text-align: left;
a {
color: var(--prev-color-text-secondary);
font-size: 12px;
margin: 0 8px;
text-decoration: none;
&:hover {
color: var(--prev-color-primary);
text-decoration: underline;
}
}
}
}
}
}
}
</style>