为了配合后端支持的**用户名+密码**和**手机号+密码**两种登录方式,前端登录页面进行了以下优化。
文件: ruoyi-ui/src/views/login.vue
修改前: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="请输入用户名或手机号" >
修改前:javascript loginRules: { username: [ { required: true, trigger: "blur", message: "请输入您的账号" } ], // ... }
修改后:javascript loginRules: { username: [ { required: true, trigger: "blur", message: "请输入用户名或手机号" } ], // ... }
┌─────────────────────────────┐
│ 民航急救调度系统 │
├─────────────────────────────┤
│ [用户图标] 账号 │ ← ❌ 提示不明确
│ [密码图标] 密码 │
│ [验证码] [图片] │
│ ☐ 记住密码 │
│ ┌─────────────┐ │
│ │ 登 录 │ │
│ └─────────────┘ │
└─────────────────────────────┘
┌─────────────────────────────┐
│ 民航急救调度系统 │
├─────────────────────────────┤
│ [用户图标] 请输入用户名或手│ ← ✅ 提示清晰
│ 机号 │
│ [密码图标] 密码 │
│ [验证码] [图片] │
│ ☐ 记住密码 │
│ ┌─────────────┐ │
│ │ 登 录 │ │
│ └─────────────┘ │
└─────────────────────────────┘
操作:
1. 在输入框中输入: admin
2. 输入密码
3. 点击登录
效果:
- ✅ 后端自动识别为用户名登录
- ✅ 验证通过后登录成功
操作:
1. 在输入框中输入: 13812345678
2. 输入密码
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>
<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>
watch: {
'loginForm.username'(val) {
// 实时显示登录方式
if (val.match(/^1[3-9]\d{9}$/)) {
this.loginType = '手机号登录';
} else {
this.loginType = '用户名登录';
}
}
}
<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>
<el-input
v-model="loginForm.username"
:type="isMobile && isPhoneLogin ? 'tel' : 'text'"
placeholder="请输入用户名或手机号"
/>
前端只修改了提示文字,登录逻辑完全由后端处理:
- ✅ 前端仍然提交 username 和 password
- ✅ 后端自动识别登录方式
- ✅ 无需前端传递登录类型参数
// 前端验证仍然只检查是否为空
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
状态: ✅ 已完成