MrShi
2025-03-12 69a1b3bf45738f048361ee4ccb6bdc64fce35720
pda/pages/index/login.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
<template>
  <view class="login">
    <image class="login_bg" src="@/static/login_bg@2x.png" />
    <image class="login_logo" src="@/static/logo@2x.png" mode="widthFix" />
    <view class="login_title" style="marginTop: 40rpx;">安泰物流智慧园区</view>
    <view class="login_title" style="marginBottom: 60rpx;">数字化月台调度平台</view>
    <view class="login_list">
      <view class="login_list_item">
        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
        <input v-model="form.username" maxlength="18" placeholder="手机号" />
      </view>
      <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
        <input v-model="form.password" type="password" placeholder="密码" />
      </view>
      <!-- <view class="login_list_item">
        <image src="@/static/ic_captcha.png" mode="widthFix"></image>
        <input v-model="form.code" placeholder="验证码" type="text" />
        <image
          @click="initCaptcha"
          :src="captcha.image"
          class="captcha"
          mode="widthFix"
        />
      </view> -->
    </view>
    <view class="login_btn">
      <view class="login_btn_n" @click="onLogin">立即登录</view>
      <!-- <view @click="$jump('/pages/staffLogin/forgetPsd')" class="for_psd"
        >忘记密码</view
      > -->
    </view>
  </view>
</template>
<script>
import { loginPost, loginCaptcha, getUserInfo, getSystemDictData } from '@/api'
import { mapState, mapMutations } from 'vuex'
export default {
  name: 'login',
  data() {
    return {
      form: {
        username: '',
        password: '',
      },
         err: '',
      isShowProtocol: false,
      ProtocolFlag: false,
      captcha: {},
      htmlText: ''
    }
  },
  onLoad() {
    this.initCaptcha()
  },
  methods: {
    ...mapMutations(["setToken", "setUserInfo"]),
    changeFalg() {
      this.ProtocolFlag = !this.ProtocolFlag
    },
      onLogin() {
        const { form, ProtocolFlag } = this
        if (!form.username) return uni.showToast({
          title: '账号不能为空',
          icon: 'none'
        })
        if (!form.password) return uni.showToast({
          title: '密码不能为空',
          icon: 'none'
        })
        loginPost({
          ...form,
            code: 1,
          uuid: this.captcha.uuid,
          openId: this.$store.state.openId
        }).then(res => {
          if (res.code === 200) {
            this.setToken(res.data)
            getUserInfo().then(ress => {
              this.setUserInfo(ress.data)
              uni.redirectTo({
                url: "/pages/index/index"
              })
            })
          }
        }, err => {
            // this.err = JSON.stringify(err)
         })
      },
    getContent() {
      getSystemDictData({
        dictCode: 'SYSTEM',
        label: 'USER_PROTOCOL'
      }).then(res => {
        this.htmlText = res.data.code
        this.isShowProtocol = true
      })
    },
    showContent() {
      this.getContent()
    },
    initCaptcha() {
      loginCaptcha().then(res => {
        this.captcha = res.data
      })
    },
  }
}
</script>
<style lang="scss" scoped>
.login {
  width: 100%;
  display: flex;
  padding-top: 100rpx;
  box-sizing: border-box;
  align-items: center;
  flex-direction: column;
  background: linear-gradient(
    180deg,
    rgba(39, 155, 170, 0.2) 0%,
    rgba(39, 155, 170, 0) 100%
  );
  .login_logo {
    width: 180rpx;
    height: 180rpx;
  }
  .login_bg {
    position: absolute;
    top: 0;
    width: 750rpx;
  }
  .login_title {
    font-size: 44rpx;
    font-weight: 600;
    color: #333333;
  }
  .login_list {
    width: 100%;
    padding: 0 60rpx;
    box-sizing: border-box;
    .login_list_item {
      width: 100%;
      border-radius: 50rpx;
      height: 98rpx;
      padding: 0 40rpx;
      box-sizing: border-box;
      background: #ffffff;
      margin-bottom: 40rpx;
      display: flex;
      align-items: center;
      justify-content: space-between;
      &:last-child {
        margin-bottom: 0 !important;
      }
      image {
        flex-shrink: 0;
        width: 40rpx;
        height: 40rpx;
      }
      .captcha {
        width: 200rpx;
      }
      input {
        flex: 1;
        height: 100%;
        color: #666666;
        margin-left: 24rpx;
        border: none;
      }
    }
  }
  .login_btn {
    width: 100%;
    padding: 0 60rpx;
    box-sizing: border-box;
    margin-top: 60rpx;
    .login_btn_n {
      width: 100%;
      height: 98rpx;
      background: $uni-color-primary;
      box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: 500;
      font-size: 32rpx;
      color: #ffffff;
      border-radius: 50rpx;
    }
  }
  .deal_wrap {
    position: absolute;
    width: 100%;
    left: 0;
    text-align: center;
    bottom: 108rpx;
    display: flex;
    justify-content: center;
    align-items: center;
    .deal {
      color: $uni-color-primary;
    }
    .checked{
      width: 48rpx;
      margin-right: 12rpx;
    }
  }
}
.modal {
  width: 690rpx;
  min-height: 920rpx;
  max-height: 720px;
  border-radius: 24rpx;
  padding: 32rpx;
}
</style>