| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- <template>
- <div
- :class="[
- 'login-wrapper',
- ['', 'login-form-right', 'login-form-left'][direction]
- ]"
- >
- <el-form
- ref="form"
- size="large"
- :model="form"
- :rules="rules"
- class="login-form ele-bg-white"
- @keyup.enter.native="submit"
- >
- <h4>{{ $t('login.title') }}</h4>
- <el-form-item prop="loginName">
- <el-input
- clearable
- v-model="form.loginName"
- prefix-icon="el-icon-user"
- :placeholder="$t('login.loginName')"
- />
- </el-form-item>
- <el-form-item prop="loginPwd">
- <el-input
- show-password
- v-model="form.loginPwd"
- prefix-icon="el-icon-lock"
- :placeholder="$t('login.loginPwd')"
- />
- </el-form-item>
- <!-- <el-form-item prop="code">
- <div class="login-input-group">
- <el-input
- clearable
- v-model="form.code"
- prefix-icon="el-icon-_vercode"
- :placeholder="$t('login.code')"
- />
- <img
- alt=""
- v-if="captcha"
- :src="captcha"
- class="login-captcha"
- @click="changeCaptcha"
- />
- </div>
- </el-form-item> -->
- <div class="el-form-item">
- <el-checkbox v-model="form.remember">
- {{ $t('login.remember') }}
- </el-checkbox>
- <el-link
- type="primary"
- :underline="false"
- class="ele-pull-right"
- @click="$router.push('/forget')"
- >
- 忘记密码
- </el-link>
- </div>
- <div class="el-form-item">
- <el-button
- size="large"
- type="primary"
- class="login-btn"
- :loading="loading"
- @click="submit"
- >
- {{ loading ? $t('login.loading') : $t('login.login') }}
- </el-button>
- </div>
- <div class="ele-text-center" style="margin-bottom: 10px">
- <i class="login-oauth-icon el-icon-_qq" style="background: #3492ed"></i>
- <i
- class="login-oauth-icon el-icon-_wechat"
- style="background: #4daf29"
- ></i>
- <i
- class="login-oauth-icon el-icon-_weibo"
- style="background: #cf1900"
- ></i>
- </div>
- </el-form>
- <div class="login-copyright">
- copyright © 2022 eleadmin.com all rights reserved.
- </div>
- <!-- 多语言切换 -->
- <div style="position: absolute; right: 30px; top: 20px">
- <i18n-icon
- :icon-style="{ fontSize: '22px', color: '#fff', cursor: 'pointer' }"
- />
- </div>
- <!-- 实际项目去掉这段 -->
- <div
- class="hidden-xs-only"
- style="position: absolute; right: 30px; bottom: 20px; z-index: 9"
- >
- <el-radio-group v-model="direction" size="mini">
- <el-radio-button label="2">居左</el-radio-button>
- <el-radio-button label="0">居中</el-radio-button>
- <el-radio-button label="1">居右</el-radio-button>
- </el-radio-group>
- </div>
- </div>
- </template>
- <script>
- import I18nIcon from '@/layout/components/i18n-icon.vue';
- import { getToken } from '@/utils/token-util';
- import { login, getCaptcha, sub } from '@/api/login';
- import { SYSTEM_NAME } from '@/config/setting';
- export default {
- // eslint-disable-next-line vue/multi-word-component-names
- name: 'Login',
- components: { I18nIcon },
- data () {
- return {
- // 登录框方向, 0居中, 1居右, 2居左
- direction: 0,
- // 加载状态
- loading: false,
- // 表单数据
- form: {
- loginName: 'mes111',
- loginPwd: '123456',
- remember: true
- },
- // 验证码base64数据
- captcha: '',
- // 验证码内容, 实际项目去掉
- text: ''
- };
- },
- computed: {
- // 表单验证规则
- rules () {
- return {
- loginName: [
- {
- required: true,
- message: this.$t('login.loginName'),
- type: 'string',
- trigger: 'blur'
- }
- ],
- loginPwd: [
- {
- required: true,
- message: this.$t('login.loginPwd'),
- type: 'string',
- trigger: 'blur'
- }
- ]
- };
- }
- },
- created () {
- if (getToken()) {
- this.goHome();
- } else {
- // 重置菜单权限
- this.$store.commit('user/setMenus', null);
- }
- },
- methods: {
- /* 提交 */
- submit () {
- this.$refs.form.validate((valid) => {
- if (!valid) {
- return false;
- }
- this.loading = true;
- login(this.form)
- .then((res) => {
- localStorage.setItem(`userId-${SYSTEM_NAME}`, res.data.userId);
- // 用户信息
- if (res.data?.loginChangeGroupVOList.length > 0) {
- sessionStorage['currentUser'] = JSON.stringify({
- currentGroupId: res.data.loginChangeGroupVOList[0].groupId,
- currentRoleId:
- res.data.loginChangeGroupVOList[0].loginChangeRoleVOList[0]
- .roleId
- });
- }
- this.$store.commit('user/setUserInfo', res.data);
- this.loading = false;
- this.$message.success(res.message);
- this.$store.dispatch('user/getCurrentUserAuthorityDept');
- this.goHome();
- })
- .catch((e) => {
- this.loading = false;
- // this.$message.error(e.message);
- });
- });
- },
- /* 跳转到首页 */
- goHome () {
- this.$router.push(this.$route?.query?.from ?? '/').catch(() => {});
- },
- /* 更换图形验证码 */
- changeCaptcha () {
- // 这里演示的验证码是后端返回base64格式的形式, 如果后端地址直接是图片请参考忘记密码页面
- getCaptcha()
- .then((data) => {
- this.captcha = data.base64;
- // 实际项目后端一般会返回验证码的key而不是直接返回验证码的内容, 登录用key去验证, 可以根据自己后端接口修改
- this.text = data.text;
- // 自动回填验证码, 实际项目去掉这个
- this.form.code = this.text;
- this.$refs?.form?.clearValidate();
- })
- .catch((e) => {
- // this.$message.error(e.message);
- });
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- /* 背景 */
- .login-wrapper {
- padding: 50px 20px;
- position: relative;
- box-sizing: border-box;
- background-image: url('@/assets/bg-login.jpg');
- background-repeat: no-repeat;
- background-size: cover;
- min-height: 100vh;
- &:before {
- content: '';
- background-color: rgba(0, 0, 0, 0.2);
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- }
- }
- /* 卡片 */
- .login-form {
- margin: 0 auto;
- width: 360px;
- max-width: 100%;
- padding: 25px 30px;
- position: relative;
- box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);
- box-sizing: border-box;
- border-radius: 4px;
- z-index: 2;
- h4 {
- text-align: center;
- margin: 0 0 25px 0;
- }
- & > .el-form-item {
- margin-bottom: 25px;
- }
- }
- .login-form-right .login-form {
- margin: 0 15% 0 auto;
- }
- .login-form-left .login-form {
- margin: 0 auto 0 15%;
- }
- /* 验证码 */
- .login-input-group {
- display: flex;
- align-items: center;
- :deep(.el-input) {
- flex: 1;
- }
- }
- .login-captcha {
- height: 38px;
- width: 102px;
- margin-left: 10px;
- border-radius: 4px;
- border: 1px solid #dcdfe6;
- text-align: center;
- cursor: pointer;
- &:hover {
- opacity: 0.75;
- }
- }
- .login-btn {
- display: block;
- width: 100%;
- }
- /* 第三方登录图标 */
- .login-oauth-icon {
- color: #fff;
- padding: 5px;
- margin: 0 10px;
- font-size: 18px;
- border-radius: 50%;
- cursor: pointer;
- }
- /* 底部版权 */
- .login-copyright {
- color: #eee;
- padding-top: 20px;
- text-align: center;
- position: relative;
- z-index: 1;
- }
- /* 响应式 */
- @media screen and (min-height: 550px) {
- .login-form {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translateX(-50%);
- margin-top: -220px;
- }
- .login-form-right .login-form,
- .login-form-left .login-form {
- left: auto;
- right: 15%;
- transform: translateX(0);
- margin: -220px auto auto auto;
- }
- .login-form-left .login-form {
- right: auto;
- left: 15%;
- }
- .login-copyright {
- position: absolute;
- bottom: 20px;
- right: 0;
- left: 0;
- }
- }
- @media screen and (max-width: 768px) {
- .login-form-right .login-form,
- .login-form-left .login-form {
- left: 50%;
- right: auto;
- transform: translateX(-50%);
- margin-right: auto;
- }
- }
- </style>
|