编辑 | blame | 历史 | 原始文档

前端登录页面优化说明

优化内容

为了配合后端支持的**用户名+密码**和**手机号+密码**两种登录方式,前端登录页面进行了以下优化。

修改文件

文件: ruoyi-ui/src/views/login.vue

具体修改

1. 优化输入框提示文字

修改前
vue <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号" >

修改后
vue <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="请输入用户名或手机号" >

2. 优化表单验证提示

修改前
javascript loginRules: { username: [ { required: true, trigger: "blur", message: "请输入您的账号" } ], // ... }

修改后
javascript loginRules: { username: [ { required: true, trigger: "blur", message: "请输入用户名或手机号" } ], // ... }

界面效果

修改前

┌─────────────────────────────┐
│    民航急救调度系统         │
├─────────────────────────────┤
│  [用户图标] 账号            │  ← ❌ 提示不明确
│  [密码图标] 密码            │
│  [验证码] [图片]            │
│  ☐ 记住密码                 │
│  ┌─────────────┐            │
│  │   登 录     │            │
│  └─────────────┘            │
└─────────────────────────────┘

修改后

┌─────────────────────────────┐
│    民航急救调度系统         │
├─────────────────────────────┤
│  [用户图标] 请输入用户名或手│  ← ✅ 提示清晰
│              机号           │
│  [密码图标] 密码            │
│  [验证码] [图片]            │
│  ☐ 记住密码                 │
│  ┌─────────────┐            │
│  │   登 录     │            │
│  └─────────────┘            │
└─────────────────────────────┘

用户体验优化

优化点

  1. 明确提示
  • 用户清楚知道可以使用用户名或手机号登录
  • 减少用户困惑和尝试成本
  1. 统一提示语
  • 输入框placeholder和验证提示保持一致
  • 提升用户体验的连贯性
  1. 无需额外说明
  • 无需添加额外的帮助文字
  • 界面保持简洁

使用示例

场景1: 用户名登录

操作:
1. 在输入框中输入: admin
2. 输入密码
3. 点击登录

效果:
- ✅ 后端自动识别为用户名登录
- ✅ 验证通过后登录成功

场景2: 手机号登录

操作:
1. 在输入框中输入: 13812345678
2. 输入密码
3. 点击登录

效果:
- ✅ 后端自动识别为手机号登录
- ✅ 验证通过后登录成功

场景3: 输入为空

操作:
1. 不输入任何内容
2. 直接点击登录

效果:
- ✅ 显示错误提示: "请输入用户名或手机号"
- ✅ 阻止表单提交

代码变更统计

变更类型 行数 说明
修改placeholder 1行 输入框提示文字
修改验证提示 1行 表单验证消息
总计 2行 极小改动

完整的登录表单代码

<template>
  <div class="login">
    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
      <h3 class="title">{{title}}</h3>
      
      <!-- 用户名/手机号输入框 -->
      <el-form-item prop="username">
        <el-input
          v-model="loginForm.username"
          type="text"
          auto-complete="off"
          placeholder="请输入用户名或手机号"
        >
          <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
        </el-input>
      </el-form-item>
      
      <!-- 密码输入框 -->
      <el-form-item prop="password">
        <el-input
          v-model="loginForm.password"
          type="password"
          auto-complete="off"
          placeholder="密码"
          @keyup.enter.native="handleLogin"
        >
          <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
        </el-input>
      </el-form-item>
      
      <!-- 验证码 -->
      <el-form-item prop="code" v-if="captchaEnabled">
        <el-input
          v-model="loginForm.code"
          auto-complete="off"
          placeholder="验证码"
          style="width: 63%"
          @keyup.enter.native="handleLogin"
        >
          <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
        </el-input>
        <div class="login-code">
          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
        </div>
      </el-form-item>
      
      <!-- 记住密码 -->
      <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">
        记住密码
      </el-checkbox>
      
      <!-- 登录按钮 -->
      <el-form-item style="width:100%;">
        <el-button
          :loading="loading"
          size="medium"
          type="primary"
          style="width:100%;"
          @click.native.prevent="handleLogin"
        >
          <span v-if="!loading">登 录</span>
          <span v-else>登 录 中...</span>
        </el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "Login",
  data() {
    return {
      loginForm: {
        username: "",
        password: "",
        rememberMe: false,
        code: "",
        uuid: ""
      },
      loginRules: {
        username: [
          { required: true, trigger: "blur", message: "请输入用户名或手机号" }
        ],
        password: [
          { required: true, trigger: "blur", message: "请输入您的密码" }
        ],
        code: [
          { required: true, trigger: "change", message: "请输入验证码" }
        ]
      }
    };
  },
  methods: {
    handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          // 登录逻辑
          this.$store.dispatch("Login", this.loginForm).then(() => {
            this.$router.push({ path: this.redirect || "/" });
          });
        }
      });
    }
  }
};
</script>

兼容性说明

浏览器支持

  • ✅ Chrome 60+
  • ✅ Firefox 55+
  • ✅ Safari 11+
  • ✅ Edge 79+
  • ✅ IE 11+

Element UI版本

  • 使用 Element UI 标准组件
  • 无特殊依赖
  • 完全兼容

后续优化建议

1. 添加输入提示图标

<el-input
  v-model="loginForm.username"
  placeholder="请输入用户名或手机号"
>
  <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
  <!-- 添加后缀提示 -->
  <el-tooltip slot="suffix" content="支持用户名或11位手机号登录" placement="top">
    <i class="el-icon-question"></i>
  </el-tooltip>
</el-input>

2. 实时格式验证

watch: {
  'loginForm.username'(val) {
    // 实时显示登录方式
    if (val.match(/^1[3-9]\d{9}$/)) {
      this.loginType = '手机号登录';
    } else {
      this.loginType = '用户名登录';
    }
  }
}

3. 添加切换登录方式的UI

<div class="login-type-switch">
  <span :class="{'active': loginType === 'username'}" @click="switchLoginType('username')">
    用户名登录
  </span>
  <span class="divider">|</span>
  <span :class="{'active': loginType === 'phone'}" @click="switchLoginType('phone')">
    手机号登录
  </span>
</div>

4. 优化移动端体验

<el-input
  v-model="loginForm.username"
  :type="isMobile && isPhoneLogin ? 'tel' : 'text'"
  placeholder="请输入用户名或手机号"
/>

测试检查清单

  • [ ] 输入框placeholder显示正确
  • [ ] 验证提示消息显示正确
  • [ ] 输入用户名可以正常登录
  • [ ] 输入手机号可以正常登录
  • [ ] 输入为空时显示错误提示
  • [ ] 记住密码功能正常
  • [ ] 各浏览器显示一致

注意事项

1. 不改变登录逻辑

前端只修改了提示文字,登录逻辑完全由后端处理:
- ✅ 前端仍然提交 usernamepassword
- ✅ 后端自动识别登录方式
- ✅ 无需前端传递登录类型参数

2. 保持向后兼容

  • ✅ 旧的用户名登录方式完全保留
  • ✅ 已有用户无需重新适应
  • ✅ 登录流程无任何变化

3. 验证规则不变

// 前端验证仍然只检查是否为空
username: [
  { required: true, trigger: "blur", message: "请输入用户名或手机号" }
]

// 具体的格式验证由后端处理

相关文件

文件 路径 说明
登录页面 ruoyi-ui/src/views/login.vue 前端登录界面
登录API ruoyi-ui/src/api/login.js 登录接口调用
Vuex Store ruoyi-ui/src/store/modules/user.js 用户状态管理

总结

前端只需修改**2行代码**,优化用户提示,即可完美支持用户名和手机号两种登录方式。修改简单、影响最小、用户体验最优。

优化效果
- ✅ 提示更清晰
- ✅ 用户体验更好
- ✅ 修改最小化
- ✅ 完全向后兼容


文档版本: v1.0
优化时间: 2025-10-26
作者: AI Assistant
状态: ✅ 已完成