|
@@ -1,50 +1,53 @@
|
|
|
<template>
|
|
|
- <div class="login">
|
|
|
- <div class="login-l">
|
|
|
- <div><span>德迈仕</span>数字化平台</div>
|
|
|
- </div>
|
|
|
- <div class="login-r">
|
|
|
- <img class="logo" referrerpolicy="no-referrer" src="@/assets/logo/logo.png" />
|
|
|
- <span class="title">欢迎使用德迈仕数字化平台</span>
|
|
|
- <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
|
|
|
- <el-form-item prop="supplierId">
|
|
|
- <el-select
|
|
|
- class="supplier-select"
|
|
|
- v-model="loginForm.supplierId"
|
|
|
- filterable
|
|
|
- remote
|
|
|
- size="large"
|
|
|
- placeholder="输入公司名-选择公司"
|
|
|
- :remote-method="remoteMethod"
|
|
|
- :loading="loading"
|
|
|
- @change="handleSupplierChange"
|
|
|
- >
|
|
|
- <el-option v-for="item in supplierOptions" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="username">
|
|
|
- <el-input v-model.trim="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
|
|
|
- <template #prefix>
|
|
|
- <svg-icon icon-class="user" class="el-input__icon input-icon" />
|
|
|
- </template>
|
|
|
- </el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="password">
|
|
|
- <el-input
|
|
|
- v-model.trim="loginForm.password"
|
|
|
- type="password"
|
|
|
- size="large"
|
|
|
- auto-complete="off"
|
|
|
- placeholder="密码"
|
|
|
- show-password
|
|
|
- @keyup.enter="handleLogin"
|
|
|
- >
|
|
|
- <template #prefix>
|
|
|
- <svg-icon icon-class="password" class="el-input__icon input-icon" />
|
|
|
- </template>
|
|
|
- </el-input>
|
|
|
- </el-form-item>
|
|
|
- <!-- <el-form-item prop="code" v-if="captchaEnabled">
|
|
|
+ <div class="login">
|
|
|
+ <div class="login-l">
|
|
|
+ <div><span>德迈仕</span>数字化平台</div>
|
|
|
+ </div>
|
|
|
+ <div class="login-r">
|
|
|
+ <img class="logo" referrerpolicy="no-referrer" src="@/assets/logo/logo.png" />
|
|
|
+ <span class="title">欢迎使用德迈仕数字化平台</span>
|
|
|
+ <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
|
|
|
+ <el-form-item prop="mnemonicCode">
|
|
|
+ <!--
|
|
|
+ <el-select
|
|
|
+ class="supplier-select"
|
|
|
+ v-model="loginForm.supplierId"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ size="large"
|
|
|
+ placeholder="输入公司名-选择公司"
|
|
|
+ :remote-method="remoteMethod"
|
|
|
+ :loading="loading"
|
|
|
+ @change="handleSupplierChange"
|
|
|
+ >
|
|
|
+ <el-option v-for="item in supplierOptions" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
+ </el-select>
|
|
|
+ -->
|
|
|
+ <el-input v-model.trim="loginForm.mnemonicCode" type="text" size="large" placeholder="公司助记码" @blur="handleGetSupplierByMnemonicCode" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="username">
|
|
|
+ <el-input v-model.trim="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
|
|
|
+ <template #prefix>
|
|
|
+ <svg-icon icon-class="user" class="el-input__icon input-icon" />
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="password">
|
|
|
+ <el-input
|
|
|
+ v-model.trim="loginForm.password"
|
|
|
+ type="password"
|
|
|
+ size="large"
|
|
|
+ auto-complete="off"
|
|
|
+ placeholder="密码"
|
|
|
+ show-password
|
|
|
+ @keyup.enter="handleLogin"
|
|
|
+ >
|
|
|
+ <template #prefix>
|
|
|
+ <svg-icon icon-class="password" class="el-input__icon input-icon" />
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <!-- <el-form-item prop="code" v-if="captchaEnabled">
|
|
|
<el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter="handleLogin">
|
|
|
<template #prefix>
|
|
|
<svg-icon icon-class="validCode" class="el-input__icon input-icon" />
|
|
@@ -53,32 +56,28 @@
|
|
|
<div class="login-code">
|
|
|
<img :src="codeUrl" @click="getCode" class="login-code-img" />
|
|
|
</div>
|
|
|
- </el-form-item> -->
|
|
|
- <div class="tool">
|
|
|
- <el-checkbox v-model="loginForm.rememberMe">5天自动登录</el-checkbox>
|
|
|
- <span style="font-size: 14px">忘记密码</span>
|
|
|
- </div>
|
|
|
- <el-form-item style="width: 100%">
|
|
|
- <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin">
|
|
|
- <span v-if="!loading">立即登录</span>
|
|
|
- <span v-else>登 录 中...</span>
|
|
|
- </el-button>
|
|
|
- <!--
|
|
|
- <div style="float: right;" v-if="register">
|
|
|
+ </el-form-item>
|
|
|
+ <div class="tool">
|
|
|
+ <el-checkbox v-model="loginForm.rememberMe">5天自动登录</el-checkbox>
|
|
|
+ <span style="font-size: 14px">忘记密码</span>
|
|
|
+ </div>
|
|
|
+ -->
|
|
|
+ <el-form-item style="width: 100%">
|
|
|
+ <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin">
|
|
|
+ <span v-if="!loading">立即登录</span>
|
|
|
+ <span v-else>登 录 中...</span>
|
|
|
+ </el-button>
|
|
|
+ <!-- <div style="float: right;" v-if="register">
|
|
|
<router-link class="link-type" :to="'/register'">立即注册</router-link>
|
|
|
- </div>
|
|
|
- -->
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- <!-- 底部 -->
|
|
|
- <div class="login-footer">
|
|
|
- <span
|
|
|
- >Copyright © 2023-2033 <a href="http://www.cdms-china.com/" target="_blank">www.cdms-china.com</a> All Rights
|
|
|
- Reserved.</span
|
|
|
- >
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ </div> -->
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <!-- 底部 -->
|
|
|
+ <div class="login-footer">
|
|
|
+ <span>Copyright © 2023-2033 <a href="http://www.cdms-china.com/" target="_blank">www.cdms-china.com</a> All Rights Reserved.</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
@@ -87,38 +86,38 @@ import Cookies from 'js-cookie'
|
|
|
import { setTenant } from '@/utils/auth'
|
|
|
import { encrypt, decrypt } from '@/utils/jsencrypt'
|
|
|
import useUserStore from '@/store/modules/user'
|
|
|
-import { listEmployee } from '@/api/system/user'
|
|
|
+//import { listEmployee } from '@/api/system/user'
|
|
|
const userStore = useUserStore()
|
|
|
const router = useRouter()
|
|
|
const { proxy } = getCurrentInstance()
|
|
|
const supplierOptions = ref([])
|
|
|
|
|
|
const loginForm = ref({
|
|
|
- supplierId: '0',
|
|
|
- supplierName: '',
|
|
|
- username: '',
|
|
|
- password: '',
|
|
|
- rememberMe: false,
|
|
|
- code: '',
|
|
|
- uuid: ''
|
|
|
+ supplierId: '0',
|
|
|
+ mnemonicCode: '',
|
|
|
+ username: '',
|
|
|
+ password: '',
|
|
|
+ rememberMe: false,
|
|
|
+ code: '',
|
|
|
+ uuid: ''
|
|
|
})
|
|
|
|
|
|
const loginRules = {
|
|
|
- supplierId: [
|
|
|
- { required: true, trigger: 'blur', message: '请输入公司名' },
|
|
|
- {
|
|
|
- validator: (rule, value, callback) => {
|
|
|
- if (value === '0') {
|
|
|
- callback(new Error('请输入公司名'))
|
|
|
- } else {
|
|
|
- callback()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- ],
|
|
|
- username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
|
|
|
- password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
|
|
|
- code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
|
|
|
+ supplierId: [
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (value === '0') {
|
|
|
+ callback(new Error('未匹配到企业,公司助记码有误'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ mnemonicCode: [{ required: true, trigger: 'blur', message: '请输入公司助记码' }],
|
|
|
+ username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
|
|
|
+ password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
|
|
|
+ code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
|
|
|
}
|
|
|
|
|
|
const loading = ref(false)
|
|
@@ -130,59 +129,74 @@ const loading = ref(false)
|
|
|
const redirect = ref(undefined)
|
|
|
|
|
|
function remoteMethod(query) {
|
|
|
- if (query) {
|
|
|
- loading.value = true
|
|
|
- userStore.getSuppliers(query).then((res) => {
|
|
|
- supplierOptions.value = res.data
|
|
|
- loading.value = false
|
|
|
- })
|
|
|
- } else {
|
|
|
- supplierOptions.value = []
|
|
|
- }
|
|
|
+ if (query) {
|
|
|
+ loading.value = true
|
|
|
+ userStore.getSuppliers(query).then((res) => {
|
|
|
+ supplierOptions.value = res.data
|
|
|
+ loading.value = false
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ supplierOptions.value = []
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function handleSupplierChange(val) {
|
|
|
- console.log(val)
|
|
|
- if (supplierOptions.value.length > 0) {
|
|
|
- const supplier = supplierOptions.value.find((item) => item.id === val)
|
|
|
- setTenant({ tenantId: val, tenantName: supplier.name })
|
|
|
- }
|
|
|
+ console.log(val)
|
|
|
+ if (supplierOptions.value.length > 0) {
|
|
|
+ const supplier = supplierOptions.value.find((item) => item.id === val)
|
|
|
+ setTenant({ tenantId: val, tenantName: supplier.name })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function handleGetSupplierByMnemonicCode() {
|
|
|
+ const mnemonicCode = loginForm.value.mnemonicCode
|
|
|
+ if (mnemonicCode) {
|
|
|
+ userStore.getSupplierByMnemonicCode(mnemonicCode).then((res) => {
|
|
|
+ console.log(res)
|
|
|
+ if (res.code === 200) {
|
|
|
+ loginForm.value.supplierId = res.data.id
|
|
|
+ setTenant({ tenantId: res.data.id, tenantName: res.data.name })
|
|
|
+ } else {
|
|
|
+ proxy.$message.error(res.msg)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function handleLogin() {
|
|
|
- proxy.$refs.loginRef.validate((valid) => {
|
|
|
- if (valid) {
|
|
|
- loading.value = true
|
|
|
- // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
|
|
|
- if (loginForm.value.rememberMe) {
|
|
|
- Cookies.set('username', loginForm.value.username, { expires: 30 })
|
|
|
- Cookies.set('password', encrypt(loginForm.value.password), { expires: 30 })
|
|
|
- Cookies.set('rememberMe', loginForm.value.rememberMe, { expires: 30 })
|
|
|
- } else {
|
|
|
- // 否则移除
|
|
|
- Cookies.remove('username')
|
|
|
- Cookies.remove('password')
|
|
|
- Cookies.remove('rememberMe')
|
|
|
- }
|
|
|
- // listEmployee({ userName: loginForm.value.username }).then(res =>{})
|
|
|
- // 调用action的登录方法
|
|
|
+ proxy.$refs.loginRef.validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ loading.value = true
|
|
|
+ // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
|
|
|
+ if (loginForm.value.rememberMe) {
|
|
|
+ Cookies.set('username', loginForm.value.username, { expires: 30 })
|
|
|
+ Cookies.set('password', encrypt(loginForm.value.password), { expires: 30 })
|
|
|
+ Cookies.set('rememberMe', loginForm.value.rememberMe, { expires: 30 })
|
|
|
+ } else {
|
|
|
+ // 否则移除
|
|
|
+ Cookies.remove('username')
|
|
|
+ Cookies.remove('password')
|
|
|
+ Cookies.remove('rememberMe')
|
|
|
+ }
|
|
|
+ // listEmployee({ userName: loginForm.value.username }).then(res =>{})
|
|
|
+ // 调用action的登录方法
|
|
|
|
|
|
- userStore
|
|
|
- .login(loginForm.value)
|
|
|
- .then(() => {
|
|
|
- router.push({ path: redirect.value || '/' })
|
|
|
- })
|
|
|
- .catch(() => {
|
|
|
- loading.value = false
|
|
|
- /*
|
|
|
+ userStore
|
|
|
+ .login(loginForm.value)
|
|
|
+ .then(() => {
|
|
|
+ router.push({ path: redirect.value || '/' })
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ loading.value = false
|
|
|
+ /*
|
|
|
// 重新获取验证码
|
|
|
if (captchaEnabled.value) {
|
|
|
getCode()
|
|
|
}
|
|
|
*/
|
|
|
- })
|
|
|
- }
|
|
|
- })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -198,14 +212,14 @@ function getCode() {
|
|
|
*/
|
|
|
|
|
|
function getCookie() {
|
|
|
- const username = Cookies.get('username')
|
|
|
- const password = Cookies.get('password')
|
|
|
- const rememberMe = Cookies.get('rememberMe')
|
|
|
- loginForm.value = {
|
|
|
- username: username === undefined ? loginForm.value.username : username,
|
|
|
- password: password === undefined ? loginForm.value.password : decrypt(password),
|
|
|
- rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
|
|
|
- }
|
|
|
+ const username = Cookies.get('username')
|
|
|
+ const password = Cookies.get('password')
|
|
|
+ const rememberMe = Cookies.get('rememberMe')
|
|
|
+ loginForm.value = {
|
|
|
+ username: username === undefined ? loginForm.value.username : username,
|
|
|
+ password: password === undefined ? loginForm.value.password : decrypt(password),
|
|
|
+ rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// getCode()
|
|
@@ -214,104 +228,104 @@ getCookie()
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
.login {
|
|
|
- position: relative;
|
|
|
- display: flex;
|
|
|
- height: 100%;
|
|
|
- background-size: cover;
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ height: 100%;
|
|
|
+ background-size: cover;
|
|
|
|
|
|
- .login-l {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- flex: 3;
|
|
|
- background: url('../assets/images/login-bg.jpg') no-repeat center center/cover #efefef;
|
|
|
- align-items: center;
|
|
|
+ .login-l {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ flex: 3;
|
|
|
+ background: url('../assets/images/login-bg.jpg') no-repeat center center/cover #efefef;
|
|
|
+ align-items: center;
|
|
|
|
|
|
- div {
|
|
|
- color: #fff;
|
|
|
- }
|
|
|
- div:first-child {
|
|
|
- padding-top: 120px;
|
|
|
- font-size: 48px;
|
|
|
- font-weight: bold;
|
|
|
- letter-spacing: 4px;
|
|
|
+ div {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ div:first-child {
|
|
|
+ padding-top: 120px;
|
|
|
+ font-size: 48px;
|
|
|
+ font-weight: bold;
|
|
|
+ letter-spacing: 4px;
|
|
|
|
|
|
- span {
|
|
|
- color: #00fff6;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- .login-r {
|
|
|
- position: relative;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- flex: 2;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
+ span {
|
|
|
+ color: #00fff6;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .login-r {
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ flex: 2;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
|
|
|
- .logo {
|
|
|
- width: 120px;
|
|
|
- }
|
|
|
+ .logo {
|
|
|
+ width: 120px;
|
|
|
+ }
|
|
|
|
|
|
- .title {
|
|
|
- color: #333;
|
|
|
- font-size: 20px;
|
|
|
- font-family: 微软雅黑;
|
|
|
- text-align: center;
|
|
|
- margin-top: 16px;
|
|
|
- letter-spacing: 2px;
|
|
|
- }
|
|
|
+ .title {
|
|
|
+ color: #333;
|
|
|
+ font-size: 20px;
|
|
|
+ font-family: 微软雅黑;
|
|
|
+ text-align: center;
|
|
|
+ margin-top: 16px;
|
|
|
+ letter-spacing: 2px;
|
|
|
+ }
|
|
|
|
|
|
- .login-form {
|
|
|
- --el-component-size-large: 48px;
|
|
|
+ .login-form {
|
|
|
+ --el-component-size-large: 48px;
|
|
|
|
|
|
- width: 400px;
|
|
|
- padding-top: 40px;
|
|
|
+ width: 400px;
|
|
|
+ padding-top: 40px;
|
|
|
|
|
|
- .el-select {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- .el-input {
|
|
|
- height: 48px;
|
|
|
- }
|
|
|
- }
|
|
|
+ .el-select {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ .el-input {
|
|
|
+ height: 48px;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- .tool {
|
|
|
- display: flex;
|
|
|
- margin-bottom: 25px;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
+ .tool {
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 25px;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
|
|
|
- span {
|
|
|
- color: #409eff;
|
|
|
- cursor: pointer;
|
|
|
- }
|
|
|
- }
|
|
|
+ span {
|
|
|
+ color: #409eff;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- button {
|
|
|
- height: 48px;
|
|
|
- letter-spacing: 2px;
|
|
|
- }
|
|
|
+ button {
|
|
|
+ height: 48px;
|
|
|
+ letter-spacing: 2px;
|
|
|
+ }
|
|
|
|
|
|
- .warning-text {
|
|
|
- font-size: 14px;
|
|
|
- text-align: center;
|
|
|
- color: #333;
|
|
|
+ .warning-text {
|
|
|
+ font-size: 14px;
|
|
|
+ text-align: center;
|
|
|
+ color: #333;
|
|
|
|
|
|
- a {
|
|
|
- color: #409eff;
|
|
|
- text-decoration: none;
|
|
|
- }
|
|
|
- }
|
|
|
- .login-footer {
|
|
|
- position: fixed;
|
|
|
- bottom: 0;
|
|
|
- width: 100%;
|
|
|
- text-align: center;
|
|
|
- color: #333;
|
|
|
- font-family: Arial;
|
|
|
- font-size: 12px;
|
|
|
- letter-spacing: 1px;
|
|
|
- }
|
|
|
- }
|
|
|
+ a {
|
|
|
+ color: #409eff;
|
|
|
+ text-decoration: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .login-footer {
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ width: 100%;
|
|
|
+ text-align: center;
|
|
|
+ color: #333;
|
|
|
+ font-family: Arial;
|
|
|
+ font-size: 12px;
|
|
|
+ letter-spacing: 1px;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|