| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <template>
- <div class="login flex flex-col">
- <div class="flex-1 flex items-center justify-center">
- <div class="login-card flex rounded-md">
- <div class="flex-1 h-full hidden md:inline-block">
- <image-contain :src="config.webBackdrop" :width="400" height="100%"/>
- </div>
- <div
- class="login-form bg-body flex flex-col justify-center px-10 py-10 md:w-[400px] w-[375px] flex-none mx-auto"
- >
- <div class="text-center text-3xl font-medium mb-8">{{ config.webName }}</div>
- <div v-if="!showMerchant">
- <el-form ref="formRef" :model="formData" size="large" :rules="rules">
- <el-form-item prop="account">
- <el-input
- v-model.trim="formData.account"
- placeholder="请输入账号"
- @keyup.enter="handleEnter"
- >
- <template #prepend>
- <icon name="el-icon-User"/>
- </template>
- </el-input>
- </el-form-item>
- <el-form-item prop="password">
- <el-input
- ref="passwordRef"
- v-model="formData.password"
- show-password
- placeholder="请输入密码"
- @keyup.enter="handleLogin"
- >
- <template #prepend>
- <icon name="el-icon-Lock"/>
- </template>
- </el-input>
- </el-form-item>
- </el-form>
- <div class="mb-5">
- <el-checkbox v-model="remAccount" label="记住账号"></el-checkbox>
- </div>
- <el-button class="w-80" type="primary" size="large" :loading="isLock" @click="lockLogin">
- 登录
- </el-button>
- </div>
- <!-- 商户列表 -->
- <div v-if="showMerchant">
- <el-table
- :data="tableData" class="w-80" height="180"
- highlight-current-row
- highlight-selection-row
- :showHeader="false"
- @current-change="handleCurrentChange">
- <el-table-column
- prop="name"
- label="店铺名称">
- </el-table-column>
- </el-table>
- <el-button class="w-80" type="primary" size="large" @click="handleEnterStore" style="margin-top: 15px">
- 进入店铺
- </el-button>
- </div>
- </div>
- </div>
- </div>
- <layout-footer/>
- </div>
- </template>
- <script lang="ts" setup>
- import {computed, onMounted, reactive, ref, shallowRef} from 'vue'
- import type {FormInstance, InputInstance} from 'element-plus'
- import LayoutFooter from '@/layout/components/footer.vue'
- import useAppStore from '@/stores/modules/app'
- import useUserStore from '@/stores/modules/user'
- import cache from '@/utils/cache'
- import {ACCOUNT_KEY, SHOP_ID} from '@/enums/cacheEnums'
- import {PageEnum} from '@/enums/pageEnum'
- import {useLockFn} from '@/hooks/useLockFn'
- import {getShopConfigList} from "@/api/shop";
- import feedback from "@/utils/feedback";
- import {clearAuthInfo} from "@/utils/auth";
- const passwordRef = shallowRef<InputInstance>()
- const formRef = shallowRef<FormInstance>()
- const appStore = useAppStore()
- const userStore = useUserStore()
- const route = useRoute()
- const router = useRouter()
- const remAccount = ref(false)
- const config = computed(() => appStore.config)
- const showMerchant = ref(false)
- const currentRow = ref({})
- const formData = reactive({
- account: '',
- password: '',
- // code: '',
- uuid: ''
- })
- const rules = {
- account: [
- {
- required: true,
- message: '请输入账号',
- trigger: ['blur']
- }
- ],
- password: [
- {
- required: true,
- message: '请输入密码',
- trigger: ['blur']
- }
- ]
- }
- const tableData = ref([])
- const handleCurrentChange = (row: any) => {
- currentRow.value = row
- }
- const handleEnterStore = () => {
- if (!currentRow.value.id) {
- feedback.msgWarning('请选择一个店铺进入平台')
- return
- }
- if (currentRow.value.id) {
- cache.set(SHOP_ID, currentRow.value.id)
- window.localStorage.setItem("like_admin_houseId", currentRow.value.houseId)
- config.value.webName = currentRow.name
- if(currentRow.image){
- config.value.webLogo = currentRow.image
- }
- const {
- query: {redirect}
- } = route
- const path = typeof redirect === 'string' ? redirect : PageEnum.INDEX
- router.push(path)
- }
- }
- // 回车按键监听
- const handleEnter = () => {
- if (!formData.password) {
- return passwordRef.value?.focus()
- }
- handleLogin()
- }
- const handleShopConfig = (params: any) => {
- getShopConfigList({"contactTel": formData.account, houseIds: params}).then((res) => {
- if (res && res.length > 0) {
- if (res.length == 1) {
- cache.set(SHOP_ID, res[0].id)
- window.localStorage.setItem("like_admin_houseId",res[0].houseId)
- config.value.webName = res[0].name
- if(res[0].image){
- config.value.webLogo = res[0].image
- }
- const {
- query: {redirect}
- } = route
- const path = typeof redirect === 'string' ? redirect : PageEnum.INDEX
- router.push(path)
- } else {
- showMerchant.value = true
- tableData.value = res.map((item: any) => {
- return {
- id: item.id,
- name: item.name,
- houseId: item.houseId,
- image: item.image
- }
- })
- }
- } else {
- clearAuthInfo()
- router.push(PageEnum.ERROR_403)
- }
- })
- }
- // 登录处理
- const handleLogin = async () => {
- await formRef.value?.validate()
- // 记住账号,缓存
- cache.set(ACCOUNT_KEY, {
- remember: remAccount.value,
- account: formData.account
- })
- try {
- let _data = {
- "mobile": formData.account,
- "passWord": formData.password,
- "platform": 1,//平台 1.大麦数字营销 2.大麦后台 3.麦芽 4.淘房客 5.电商中心
- }
- await userStore.login(_data).then((res: any) => {
- if(res.type === 1){
- clearAuthInfo()
- router.push(PageEnum.ERROR_403)
- } else {
- const houseIds = res.houseList.map((item: any) => item.houseId)
- handleShopConfig(houseIds)
- }
- })
- } catch (error) {
- // getLoginCaptcha()
- }
- /*const {
- query: {redirect}
- } = route
- const path = typeof redirect === 'string' ? redirect : PageEnum.INDEX
- router.push(path)*/
- }
- const {isLock, lockFn: lockLogin} = useLockFn(handleLogin)
- onMounted(() => {
- const value = cache.get(ACCOUNT_KEY)
- // getLoginCaptcha()
- if (value?.remember) {
- remAccount.value = value.remember
- formData.account = value.account
- }
- })
- </script>
- <style lang="scss" scoped>
- .login {
- background-image: url('./images/login_bg.png');
- @apply min-h-screen bg-no-repeat bg-center bg-cover;
- .login-card {
- height: 400px;
- :deep(.el-input-group__prepend) {
- padding: 0 15px;
- }
- }
- }
- </style>
|