wlzboy
2025-10-27 559b2e34c983f615b6d6747f52c801022c561803
app/pages/login.vue
@@ -1,9 +1,9 @@
<template>
  <view class="normal-login-container">
  <scroll-view class="normal-login-container" scroll-y="true">
    <view class="logo-content align-center justify-center flex">
      <image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">
      </image>
      <text class="title">若依移动端登录</text>
      <text class="title">民航调度系统</text>
    </view>
    <view class="login-form-content">
      <view class="input-item flex align-center">
@@ -14,28 +14,32 @@
        <view class="iconfont icon-password icon"></view>
        <input v-model="loginForm.password" type="password" class="input" placeholder="请输入密码" maxlength="20" />
      </view>
      <view class="input-item flex align-center" style="width: 60%;margin: 0px;" v-if="captchaEnabled">
      <view class="input-item flex align-center captcha-container" v-if="captchaEnabled">
        <view class="iconfont icon-code icon"></view>
        <input v-model="loginForm.code" type="number" class="input" placeholder="请输入验证码" maxlength="4" />
        <view class="login-code"> 
          <image :src="codeUrl" @click="getCode" class="login-code-img"></image>
          <image :src="codeUrl" @click="getCode" class="login-code-img" mode="aspectFit"></image>
        </view>
      </view>
      <view class="agreement-checkbox">
        <checkbox-group @change="onAgreementChange">
          <label class="checkbox-label">
            <checkbox :checked="agreedToPolicy" value="agreed" color="#007AFF" style="margin-top: 0;" />
            <text class="agreement-text">
              <text class="text-grey1">同意</text>
              <text @click.stop="handleUserAgrement" class="text-blue agreement-link">《用户协议》</text>
              <text class="text-grey1">和</text>
              <text @click.stop="handlePrivacy" class="text-blue agreement-link">《隐私政策》</text>
            </text>
          </label>
        </checkbox-group>
      </view>
      <view class="action-btn">
        <button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">登录</button>
      </view>
      <view class="reg text-center" v-if="register">
        <text class="text-grey1">没有账号?</text>
        <text @click="handleUserRegister" class="text-blue">立即注册</text>
      </view>
      <view class="xieyi text-center">
        <text class="text-grey1">登录即代表同意</text>
        <text @click="handleUserAgrement" class="text-blue">《用户协议》</text>
        <text @click="handlePrivacy" class="text-blue">《隐私协议》</text>
      </view>
    </view>
  </view>
  </scroll-view>
</template>
<script>
@@ -48,10 +52,12 @@
        captchaEnabled: true,
        // 用户注册开关
        register: false,
        // 隐私政策同意状态(默认选中)
        agreedToPolicy: true,
        globalConfig: getApp().globalData.config,
        loginForm: {
          username: "admin",
          password: "admin123",
          username: "",
          password: "",
          code: "",
          uuid: ''
        }
@@ -67,13 +73,15 @@
      },
      // 隐私协议
      handlePrivacy() {
        let site = this.globalConfig.appInfo.agreements[0]
        this.$tab.navigateTo(`/pages/common/webview/index?title=${site.title}&url=${site.url}`)
        this.$tab.navigateTo('/pages/mine/privacy-policy/index')
      },
      // 用户协议
      handleUserAgrement() {
        let site = this.globalConfig.appInfo.agreements[1]
        this.$tab.navigateTo(`/pages/common/webview/index?title=${site.title}&url=${site.url}`)
        this.$tab.navigateTo('/pages/mine/user-agreement/index')
      },
      // 协议同意状态变更
      onAgreementChange(e) {
        this.agreedToPolicy = e.detail.value.length > 0
      },
      // 获取图形验证码
      getCode() {
@@ -87,6 +95,10 @@
      },
      // 登录方法
      async handleLogin() {
        if (!this.agreedToPolicy) {
          this.$modal.msgError("请先阅读并同意用户协议和隐私政策")
          return
        }
        if (this.loginForm.username === "") {
          this.$modal.msgError("请输入您的账号")
        } else if (this.loginForm.password === "") {
@@ -127,6 +139,24 @@
  .normal-login-container {
    width: 100%;
    min-height: 100vh;
    // 隐藏滚动条但保持滚动功能
    ::-webkit-scrollbar {
      display: none;
      width: 0 !important;
      height: 0 !important;
      background: transparent;
    }
    // Firefox滚动条隐藏
    * {
      scrollbar-width: none; /* Firefox */
    }
    // IE/Edge滚动条隐藏
    * {
      -ms-overflow-style: none; /* IE 10+ */
    }
    .logo-content {
      width: 100%;
@@ -158,45 +188,129 @@
        .icon {
          font-size: 38rpx;
          margin-left: 10px;
          color: #999;
        }
        .input {
          margin-left: 20rpx;
          width: 100%;
          font-size: 14px;
          line-height: 20px;
          text-align: left;
          padding-left: 15px;
          height: 45px;
          background: none;
        }
      }
      .captcha-container {
        width: 100%;
        margin: 20px auto;
        background-color: #f5f6f7;
        height: 45px;
        border-radius: 20px;
        padding-right: 10rpx;
        box-sizing: border-box;
        .icon {
          font-size: 38rpx;
          margin-left: 10px;
        }
        .input {
          margin-left: 20rpx;
          width: 60%;
          height: 45px;
          background: none;
        }
        .login-code {
          width: 30%;
          height: 45px;
          margin-left: 10rpx;
          border-left: 1px solid #e0e0e0;
          display: flex;
          align-items: center;
          justify-content: center;
          .login-code-img {
            max-width: 100%;
            max-height: 45px;
            object-fit: contain;
            cursor: pointer;
          }
        }
      }
      .login-btn {
        margin-top: 40px;
        height: 45px;
      .action-btn {
        margin: 40rpx 0;
        .login-btn {
          height: 90rpx;
          font-size: 32rpx;
        }
      }
      .reg {
        margin-top: 15px;
        margin: 20rpx 0;
        .text-grey1 {
          color: #888;
        }
        .text-blue {
          margin: 0 10rpx;
          color: #007AFF;
        }
      }
      
      .xieyi {
        color: #333;
        margin-top: 20px;
      }
      .login-code {
        height: 38px;
        float: right;
        .login-code-img {
          height: 38px;
          position: absolute;
          margin-left: 10px;
          width: 200rpx;
      .agreement-checkbox {
        margin: 50rpx 0 30rpx 0;
        padding: 20rpx;
        display: flex;
        justify-content: flex-start;
        align-items: left;
        checkbox-group {
          display: flex;
          align-items: center;
        }
        .checkbox-label {
          display: flex;
          align-items: center;
          justify-content: flex-start;
          checkbox {
            margin-right: 15rpx;
            transform: scale(1.2);
            flex-shrink: 0;
            vertical-align: middle;
          }
          .agreement-text {
            display: inline-flex;
            align-items: center;
            flex-wrap: wrap;
            line-height: 1.5;
            font-size: 26rpx;
            text-align: left;
            justify-content: flex-start;
            .text-grey1 {
              color: #666;
              font-size: 26rpx;
              line-height: 1.5;
            }
            .text-blue {
              color: #007AFF;
              font-size: 26rpx;
              padding: 8rpx 10rpx;
              margin: 0 5rpx;
              display: inline-block;
              position: relative;
              z-index: 10;
              line-height: 1.5;
            }
          }
        }
      }
    }
  }
</style>
</style>