| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517 |
- <template>
- <el-dialog
- v-model="showDialog"
- width="354px"
- custom-class="login-dialog"
- append-to-body
- :close-on-click-modal="false"
- :show-close="false"
- @close="emit('update:dialogVisible',false)"
- >
- <div class="login-box">
- <template v-if="pageStatus === 1">
- <el-tabs
- class="login-box__tabs"
- v-model="activeTab"
- >
- <el-tab-pane label="账号密码登录" name="0" />
- <el-tab-pane label="验证码登录" name="1" />
- </el-tabs>
- <el-form
- :model="loginForm"
- :rules="loginRules"
- label-position="left"
- >
- <div class="title__main">欢迎!</div>
- <div class="title_sub">登录拍照机系统</div>
- <el-form-item class="login-input" prop="username">
- <div class="login-icon">
- <img src="@/assets/images/login/login-user.svg" v-if="activeTab === '0'"/>
- <img src="@/assets/images/login/login-code.svg" v-else/>
- </div>
- <el-input
- v-model="loginForm.username"
- placeholder="请输入用户名"
- name="username"
- type="text"
- maxlength="30"
- style="width: 270px;"
- tabindex="1"
- autocomplete="on"
- >
- </el-input>
- </el-form-item>
- <template v-if="activeTab === '0'">
- <el-form-item
- class="login-input"
- prop="password"
- >
- <div class="login-icon">
- <img src="@/assets/images/login/login-lock.svg" />
- </div>
- <el-input
- v-model="loginForm.password"
- placeholder="请输入密码"
- type="password"
- style="width: 270px;"
- show-password
- maxlength="30"
- tabindex="2"
- autocomplete="on"
- >
- </el-input>
- </el-form-item>
- </template>
- <template v-else>
- <el-form-item
- class="login-input"
- prop="code"
- >
- <div class="login-icon">
- <img src="@/assets/images/login/login-lock.svg" />
- </div>
- <el-input
- v-model="loginForm.password"
- placeholder="请输入验证码"
- type="text"
- maxlength="6"
- tabindex="2"
- style="width: 270px;"
- autocomplete="off"
- >
- <template #append>
- <el-button
- :disabled="isCodeSending"
- @click="sendVerificationCode"
- >
- {{ codeButtonText }}
- </el-button>
- </template>
- </el-input>
- </el-form-item>
- </template>
- <el-button class="login-button" type="primary" :loading="loading" @click="handleLogin">
- 登录
- </el-button>
- </el-form>
- </template>
- <template v-if="pageStatus === 2">
- <div class="company-select-box">
- <div class="title__main">请选择企业身份</div>
- <div class="title_sub">您在以下企业均有任职,请问您想代表那个企业进行访问</div>
- <el-select v-model="companyId" class="mar-top-50 w-full" placeholder="请选择">
- <el-option
- v-for="item, key in company"
- :key="key"
- :label="item.abbreviation ? item.abbreviation : item.name"
- :value="item.id">
- </el-option>
- </el-select>
- <div class="mar-top-50">
- <el-button class="login-button s" type="primary" @click="toggleCompany">
- 确认
- </el-button>
- </div>
- </div>
- <!-- <div class="bodyCompany">
- <div class="companyItem" :class="item.is_current == 1?'activeCompany':''" v-for="item, index in company" @click="selectnowCompany(item,index)">
- <div class="companyHeader">
- <div class="companyTitle">{{item.abbreviation ? item.abbreviation : item.name}}</div>
- <div class="companyName">主体信息:{{ item.name }}</div>
- </div>
- <div class="selectCompanyBox">
- <img src="@/assets/images/login/dagou.png" v-if="item.is_current == 1" class="selectIcon"/>
- <div class="unselect" v-else></div>
- </div>
- </div>
- </div>-->
- </template>
- </div>
- </el-dialog>
- </template>
- <script>
- import { defineComponent } from 'vue'
- export default defineComponent({
- name: 'Login',
- })
- </script>
- <script setup>
- import { ref, reactive, computed } from 'vue'
- import { ElMessage } from 'element-plus'
- import { getAccountCompany, selectCompany, sendCode } from '@/apis/user';
- import useUserInfo from "@/stores/modules/user";
- const showDialog = computed(() => props.dialogVisible)
- const props = defineProps({
- dialogVisible: {
- type: Boolean,
- default: false
- }
- })
- const emit = defineEmits(['update:dialogVisible', 'login-success'])
- const useUserInfoStore = useUserInfo();
- const activeTab = ref('0')
- const loading = ref(false)
- const isCodeSending = ref(false)
- const countdown = ref(60)
- const loginForm = reactive({
- username: '',
- password: '',
- code: ''
- })
- const codeButtonText = computed(() => {
- return isCodeSending.value ? `${countdown.value}s后重新获取` : '获取验证码'
- })
- const loginRules = reactive({
- username: [
- { required: true, message: '请输入用户名', trigger: 'blur' },
- { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' }
- ],
- password: [
- { required: true, message: '请输入密码', trigger: 'blur' },
- { min: 6, max: 30, message: '长度在 6 到 30 个字符', trigger: 'blur' }
- ],
- code: [
- { required: true, message: '请输入验证码', trigger: 'blur' },
- { len: 6, message: '验证码长度为6位', trigger: 'blur' }
- ]
- })
- const handleLogin = async () => {
- const res = await useUserInfoStore.loginAction({
- "site":1,
- "username":loginForm.username,
- "password":loginForm.password,
- "type": activeTab.value,
- "device":"aigc-photo"
- })
- switch(res.data.is_need_select_company){
- case 40006:
- showCompany()
- break;
- case 40007:
- ElMessage.error('当前没有所属组织')
- break;
- default:
- await useUserInfoStore.getInfo()
- useUserInfoStore.updateLoginShow(false)
- break;
- }
- }
- const pageStatus = ref(1)
- const companyId = ref('')
- const company = ref([])
- async function showCompany() {
- const res = await getAccountCompany()
- company.value = res.data
- res.data.map((v)=>{
- if(v.is_current == 1){
- companyId.value = Number(v.id)
- }
- })
- pageStatus.value = 2
- }
- /*function selectnowCompany(item,index){
- companyId.value = item.id
- company.value.map((v)=>{
- v.is_current = 0
- })
- company.value[index].is_current = 1
- toggleCompany()
- }*/
- // 切换组织
- async function toggleCompany() {
- if (!companyId.value) return false
- await selectCompany({
- id: companyId.value
- })
- await useUserInfoStore.getInfo()
- useUserInfoStore.updateLoginShow(false)
- }
- const sendVerificationCode = () => {
- if (!loginForm.username) {
- ElMessage.warning('请先输入手机号')
- return
- }
- sendCode({
- phone: loginForm.username
- }).then(() => {
- isCodeSending.value = true
- countdown.value = 60
- // 这里应该调用发送验证码API
- // await sendCode(loginForm.username)
- const timer = setInterval(() => {
- countdown.value--
- if (countdown.value <= 0) {
- clearInterval(timer)
- isCodeSending.value = false
- }
- }, 1000)
- })
- }
- </script>
- <style lang="scss">
- .login-dialog {
- border-radius: 10px !important;
- .el-dialog__header {
- padding: 0;
- }
- .el-dialog__body {
- padding-top: 10px;
- }
- .el-input-group__append{
- background-color: #fff;
- color: #2FB0FF;
- }
- }
- </style>
- <style lang="scss" scoped>
- .login-box {
- width: 100%;
- min-height: 404px;
- background-color: #fff;
- .title__main {
- font-size: 20px;
- font-weight: bold;
- color: #333;
- line-height: 1.4;
- text-align: left;
- }
- .title_sub {
- font-size: 16px;
- color: #666;
- text-align: left;
- line-height: 1.4;
- .selectCompanyTitle{
- font-size: 30px;
- font-weight: 600;
- color: #FFFFFF;
- }
- .selectCompanyContent{
- margin-top: 4px;
- font-size: 14px;
- color: #FFFFFF;
- }
- }
- .bodyCompany{
- flex-grow: 1;
- overflow-y: auto;
- width: 100%;
- padding: 0 20px;
- margin-top: 30px;
- .companyItem{
- background: #454545;
- border-radius: 10px;
- padding: 20px;
- padding-right: 10px;
- color: #EEEEEE;
- width: 100%;
- margin-bottom: 15px;
- text-align: left;
- display: flex;
- align-items: center;
- }
- .activeCompany{
- border: 1px solid #EEEEEE;
- }
- .companyHeader{
- flex-grow: 1;
- }
- .companyTitle{
- font-size: 17px;
- font-weight: 600;
- }
- .companyName{
- margin-top: 10px;
- font-size: 14px;
- }
- .selectCompanyBox{
- flex-shrink: 0;
- }
- .unselect{
- width: 24px;
- height: 24px;
- border: 1px solid #C6C6C6;
- border-radius: 999px;
- }
- .selectIcon{
- width: 24px;
- height: 24px;
- }
- }
- .login-input {
- :deep(.el-form-item__content) {
- display: flex;
- align-items: center;
- }
- :deep(.el-input__inner) {
- height: 40px;
- line-height: 40px;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- }
- :deep(.el-input-group__prepend) {
- padding: 0;
- background-color: initial;
- }
- :deep(.el-input__suffix-inner) {
- line-height: 40px;
- padding: 0 10px;
- }
- .login-icon {
- flex-shrink: 0;
- width: 40px;
- height: 40px;
- border: 1px solid #dcdfe6;
- border-top-left-radius: 4px;
- border-bottom-left-radius: 4px;
- border-right: 0;
- font-size: 22px;
- display: flex;
- align-items: center;
- justify-content: center;
- img{
- width: 22px;
- height: 22px;
- }
- }
- }
- .login-button {
- width: 100%;
- margin-top: 10px;
- background: linear-gradient( 135deg, #2FB0FF 0%, #B863FB 100%);
- }
- :deep(.el-form-item) + .login-button {
- margin-top: 20px;
- }
- .login-box__tabs {
- :deep(.el-tabs__nav) {
- float: initial;
- display: flex;
- }
- :deep(.el-tabs__item) {
- flex-grow: 1;
- text-align: center;
- height: 50px;
- line-height: 50px;
- padding: 0;
- margin: 0;
- &.is-active {
- color: #333;
- }
- }
- :deep(.el-tabs__active-bar) {
- height: 3px;
- }
- :deep(.el-tabs__nav-wrap::after) {
- height: 1px;
- background-color: #ebeef5;
- }
- :deep(.el-tabs__header) {
- margin-bottom: 0;
- }
- :deep(.el-tabs__active-bar) {
- background-color: initial;
- &::before {
- content: '';
- display: flex;
- width: 50px;
- height: 100%;
- background-color: var(--el-color-primary);
- margin: 0 auto;
- }
- }
- :deep(.el-tabs__content) {
- padding: 0;
- }
- }
- :deep(.el-form) {
- padding: 20px 0;
- }
- :deep(.el-form-item) {
- margin-bottom: 0;
- margin-top: 20px;
- }
- .company-list {
- height: 220px;
- overflow-y: auto;
- .item {
- background: #fff;
- border-radius: 3px;
- overflow: hidden;
- margin-top: 10px;
- cursor: pointer;
- &:hover {
- opacity: 0.9;
- }
- &:active {
- opacity: 0.8;
- }
- .abbreviation {
- background: #4f4f4f;
- height: 42px;
- line-height: 42px;
- padding: 0 10px;
- color: #fff;
- font-size: 14px;
- }
- &.active {
- position: relative;
- }
- &.active:before {
- content: '';
- display: block;
- width: 44px;
- height: 42px;
- background: url('/static/images/active.png');
- position: absolute;
- right: 0px;
- }
- }
- }
- }
- .company-select-box{
- display: flex;
- flex-direction: column;
- justify-content: center;
- min-height: 404px;
- }
- </style>
|