From 91b4d899403587e6982c6f76674307cd5612b17b Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 26 十月 2025 18:53:07 +0800
Subject: [PATCH] feat: 任务状态
---
prd/前端登录页面优化说明.md | 393 ++++++++++
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml | 8
prd/手机号密码登录功能实现总结.md | 463 ++++++++++++
ruoyi-ui/src/views/system/user/index.vue | 13
ruoyi-admin/src/main/resources/application.yml | 6
ruoyi-ui/src/views/login.vue | 4
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 2
app/pages/login.vue | 64 -
ruoyi-admin/src/main/resources/application-prod.yml | 31
prd/用户列表显示优化说明.md | 296 ++++++++
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java | 7
sql/task_dict_data.sql | 8
prd/移除微信登录功能说明.md | 297 ++++++++
prd/手机号密码登录功能说明.md | 549 +++++++++++++++
14 files changed, 2,054 insertions(+), 87 deletions(-)
diff --git a/app/pages/login.vue b/app/pages/login.vue
index 4aef7f9..eddda11 100644
--- a/app/pages/login.vue
+++ b/app/pages/login.vue
@@ -24,12 +24,6 @@
<view class="action-btn">
<button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">鐧诲綍</button>
</view>
- <view class="wechat-login" @click="handleWechatLogin">
- <view class="wechat-btn">
- <image class="wechat-icon" src="/static/icons/profile.png"></image>
- <text class="wechat-text">寰俊涓�閿櫥褰�</text>
- </view>
- </view>
<view class="xieyi text-center">
<text class="text-grey1">鐧诲綍鍗充唬琛ㄥ悓鎰�</text>
@@ -98,40 +92,6 @@
this.$modal.loading("鐧诲綍涓紝璇疯�愬績绛夊緟...")
this.pwdLogin()
}
- },
- // 寰俊鐧诲綍鏂规硶
- async handleWechatLogin() {
- // #ifdef MP-WEIXIN
- // 寰俊灏忕▼搴忕櫥褰�
- uni.login({
- provider: 'weixin',
- success: (loginRes) => {
- console.log('寰俊鐧诲綍鎴愬姛', loginRes);
- // 鑾峰彇鐢ㄦ埛淇℃伅
- uni.getUserInfo({
- provider: 'weixin',
- success: (infoRes) => {
- console.log('鐢ㄦ埛淇℃伅鑾峰彇鎴愬姛', infoRes);
- // 璺宠浆鍒板井淇$櫥褰曠‘璁ら〉闈�
- this.$tab.navigateTo(`/pages/login/wechat?userInfo=${encodeURIComponent(JSON.stringify(infoRes.userInfo))}`);
- },
- fail: (error) => {
- console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触', error);
- this.$modal.msgError("鑾峰彇寰俊鐢ㄦ埛淇℃伅澶辫触");
- }
- });
- },
- fail: (error) => {
- console.error('寰俊鐧诲綍澶辫触', error);
- this.$modal.msgError("寰俊鐧诲綍澶辫触");
- }
- });
- // #endif
-
- // #ifndef MP-WEIXIN
- // H5鎴栧叾浠栧钩鍙版彁绀�
- this.$modal.msgError("璇峰湪寰俊瀹㈡埛绔腑浣跨敤寰俊鐧诲綍鍔熻兘");
- // #endif
},
// 瀵嗙爜鐧诲綍
async pwdLogin() {
@@ -266,30 +226,6 @@
.login-btn {
height: 90rpx;
font-size: 32rpx;
- }
- }
-
- .wechat-login {
- margin: 20rpx 0;
-
- .wechat-btn {
- display: flex;
- align-items: center;
- justify-content: center;
- background-color: #07c160;
- height: 90rpx;
- border-radius: 20px;
-
- .wechat-icon {
- width: 40rpx;
- height: 40rpx;
- margin-right: 10rpx;
- }
-
- .wechat-text {
- color: white;
- font-size: 32rpx;
- }
}
}
diff --git "a/prd/\345\211\215\347\253\257\347\231\273\345\275\225\351\241\265\351\235\242\344\274\230\345\214\226\350\257\264\346\230\216.md" "b/prd/\345\211\215\347\253\257\347\231\273\345\275\225\351\241\265\351\235\242\344\274\230\345\214\226\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..715bc92
--- /dev/null
+++ "b/prd/\345\211\215\347\253\257\347\231\273\345\275\225\351\241\265\351\235\242\344\274\230\345\214\226\350\257\264\346\230\216.md"
@@ -0,0 +1,393 @@
+# 鍓嶇鐧诲綍椤甸潰浼樺寲璇存槑
+
+## 浼樺寲鍐呭
+
+涓轰簡閰嶅悎鍚庣鏀寔鐨�**鐢ㄦ埛鍚�+瀵嗙爜**鍜�**鎵嬫満鍙�+瀵嗙爜**涓ょ鐧诲綍鏂瑰紡锛屽墠绔櫥褰曢〉闈㈣繘琛屼簡浠ヤ笅浼樺寲銆�
+
+## 淇敼鏂囦欢
+
+**鏂囦欢**: `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. **鏄庣‘鎻愮ず** 鉁�
+ - 鐢ㄦ埛娓呮鐭ラ亾鍙互浣跨敤鐢ㄦ埛鍚嶆垨鎵嬫満鍙风櫥褰�
+ - 鍑忓皯鐢ㄦ埛鍥版儜鍜屽皾璇曟垚鏈�
+
+2. **缁熶竴鎻愮ず璇�** 鉁�
+ - 杈撳叆妗唒laceholder鍜岄獙璇佹彁绀轰繚鎸佷竴鑷�
+ - 鎻愬崌鐢ㄦ埛浣撻獙鐨勮繛璐��
+
+3. **鏃犻渶棰濆璇存槑** 鉁�
+ - 鏃犻渶娣诲姞棰濆鐨勫府鍔╂枃瀛�
+ - 鐣岄潰淇濇寔绠�娲�
+
+## 浣跨敤绀轰緥
+
+### 鍦烘櫙1: 鐢ㄦ埛鍚嶇櫥褰�
+
+**鎿嶄綔**:
+1. 鍦ㄨ緭鍏ユ涓緭鍏�: `admin`
+2. 杈撳叆瀵嗙爜
+3. 鐐瑰嚮鐧诲綍
+
+**鏁堟灉**:
+- 鉁� 鍚庣鑷姩璇嗗埆涓虹敤鎴峰悕鐧诲綍
+- 鉁� 楠岃瘉閫氳繃鍚庣櫥褰曟垚鍔�
+
+### 鍦烘櫙2: 鎵嬫満鍙风櫥褰�
+
+**鎿嶄綔**:
+1. 鍦ㄨ緭鍏ユ涓緭鍏�: `13812345678`
+2. 杈撳叆瀵嗙爜
+3. 鐐瑰嚮鐧诲綍
+
+**鏁堟灉**:
+- 鉁� 鍚庣鑷姩璇嗗埆涓烘墜鏈哄彿鐧诲綍
+- 鉁� 楠岃瘉閫氳繃鍚庣櫥褰曟垚鍔�
+
+### 鍦烘櫙3: 杈撳叆涓虹┖
+
+**鎿嶄綔**:
+1. 涓嶈緭鍏ヤ换浣曞唴瀹�
+2. 鐩存帴鐐瑰嚮鐧诲綍
+
+**鏁堟灉**:
+- 鉁� 鏄剧ず閿欒鎻愮ず: "璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"
+- 鉁� 闃绘琛ㄥ崟鎻愪氦
+
+## 浠g爜鍙樻洿缁熻
+
+| 鍙樻洿绫诲瀷 | 琛屾暟 | 璇存槑 |
+|---------|------|------|
+| 淇敼placeholder | 1琛� | 杈撳叆妗嗘彁绀烘枃瀛� |
+| 淇敼楠岃瘉鎻愮ず | 1琛� | 琛ㄥ崟楠岃瘉娑堟伅 |
+| **鎬昏** | **2琛�** | 鏋佸皬鏀瑰姩 |
+
+## 瀹屾暣鐨勭櫥褰曡〃鍗曚唬鐮�
+
+```vue
+<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. 娣诲姞杈撳叆鎻愮ず鍥炬爣
+
+```vue
+<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. 瀹炴椂鏍煎紡楠岃瘉
+
+```javascript
+watch: {
+ 'loginForm.username'(val) {
+ // 瀹炴椂鏄剧ず鐧诲綍鏂瑰紡
+ if (val.match(/^1[3-9]\d{9}$/)) {
+ this.loginType = '鎵嬫満鍙风櫥褰�';
+ } else {
+ this.loginType = '鐢ㄦ埛鍚嶇櫥褰�';
+ }
+ }
+}
+```
+
+### 3. 娣诲姞鍒囨崲鐧诲綍鏂瑰紡鐨刄I
+
+```vue
+<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. 浼樺寲绉诲姩绔綋楠�
+
+```vue
+<el-input
+ v-model="loginForm.username"
+ :type="isMobile && isPhoneLogin ? 'tel' : 'text'"
+ placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"
+/>
+```
+
+## 娴嬭瘯妫�鏌ユ竻鍗�
+
+- [ ] 杈撳叆妗唒laceholder鏄剧ず姝g‘
+- [ ] 楠岃瘉鎻愮ず娑堟伅鏄剧ず姝g‘
+- [ ] 杈撳叆鐢ㄦ埛鍚嶅彲浠ユ甯哥櫥褰�
+- [ ] 杈撳叆鎵嬫満鍙峰彲浠ユ甯哥櫥褰�
+- [ ] 杈撳叆涓虹┖鏃舵樉绀洪敊璇彁绀�
+- [ ] 璁颁綇瀵嗙爜鍔熻兘姝e父
+- [ ] 鍚勬祻瑙堝櫒鏄剧ず涓�鑷�
+
+## 娉ㄦ剰浜嬮」
+
+### 1. 涓嶆敼鍙樼櫥褰曢�昏緫
+
+鍓嶇鍙慨鏀逛簡鎻愮ず鏂囧瓧锛岀櫥褰曢�昏緫瀹屽叏鐢卞悗绔鐞嗭細
+- 鉁� 鍓嶇浠嶇劧鎻愪氦 `username` 鍜� `password`
+- 鉁� 鍚庣鑷姩璇嗗埆鐧诲綍鏂瑰紡
+- 鉁� 鏃犻渶鍓嶇浼犻�掔櫥褰曠被鍨嬪弬鏁�
+
+### 2. 淇濇寔鍚戝悗鍏煎
+
+- 鉁� 鏃х殑鐢ㄦ埛鍚嶇櫥褰曟柟寮忓畬鍏ㄤ繚鐣�
+- 鉁� 宸叉湁鐢ㄦ埛鏃犻渶閲嶆柊閫傚簲
+- 鉁� 鐧诲綍娴佺▼鏃犱换浣曞彉鍖�
+
+### 3. 楠岃瘉瑙勫垯涓嶅彉
+
+```javascript
+// 鍓嶇楠岃瘉浠嶇劧鍙鏌ユ槸鍚︿负绌�
+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
+**鐘舵��**: 鉁� 宸插畬鎴�
diff --git "a/prd/\346\211\213\346\234\272\345\217\267\345\257\206\347\240\201\347\231\273\345\275\225\345\212\237\350\203\275\345\256\236\347\216\260\346\200\273\347\273\223.md" "b/prd/\346\211\213\346\234\272\345\217\267\345\257\206\347\240\201\347\231\273\345\275\225\345\212\237\350\203\275\345\256\236\347\216\260\346\200\273\347\273\223.md"
new file mode 100644
index 0000000..01690c6
--- /dev/null
+++ "b/prd/\346\211\213\346\234\272\345\217\267\345\257\206\347\240\201\347\231\273\345\275\225\345\212\237\350\203\275\345\256\236\347\216\260\346\200\273\347\273\223.md"
@@ -0,0 +1,463 @@
+# 鎵嬫満鍙峰瘑鐮佺櫥褰曞姛鑳藉疄鐜版�荤粨
+
+## 鍔熻兘姒傝堪
+
+绯荤粺宸叉垚鍔熷疄鐜�**鐢ㄦ埛鍚�+瀵嗙爜**鍜�**鎵嬫満鍙�+瀵嗙爜**涓ょ鐧诲綍鏂瑰紡锛岀敤鎴峰彲浠ュ湪鐧诲綍鏃惰嚜鐢遍�夋嫨浣跨敤鐢ㄦ埛鍚嶆垨鎵嬫満鍙疯繘琛岀櫥褰曪紝绯荤粺浼氳嚜鍔ㄨ瘑鍒苟楠岃瘉銆�
+
+## 瀹炵幇鐘舵��
+
+### 鉁� 鍚庣鍔熻兘锛堝凡瀹屾垚锛�
+
+绯荤粺鍚庣宸插畬鏁村疄鐜版墜鏈哄彿鐧诲綍鍔熻兘锛屾牳蹇冨疄鐜板湪 [UserDetailsServiceImpl.java](file://d:\project\鎬ユ晳杞繍\code\Api\RuoYi-Vue-master\ruoyi-framework\src\main\java\com\ruoyi\framework\web\service\UserDetailsServiceImpl.java#L41-L58)锛�
+
+```java
+@Override
+public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
+{
+ SysUser user = null;
+
+ // 鏅鸿兘鍒ゆ柇鐧诲綍鏂瑰紡
+ if (username.matches("^1[3-9]\\d{9}$"))
+ {
+ // 鎵嬫満鍙风櫥褰�
+ log.info("灏濊瘯浣跨敤鎵嬫満鍙风櫥褰曪細{}", username);
+ user = userService.selectUserByPhonenumber(username);
+ }
+ else
+ {
+ // 鐢ㄦ埛鍚嶇櫥褰�
+ log.info("灏濊瘯浣跨敤鐢ㄦ埛鍚嶇櫥褰曪細{}", username);
+ user = userService.selectUserByUserName(username);
+ }
+
+ // ... 鐢ㄦ埛楠岃瘉閫昏緫
+}
+```
+
+### 鉁� 鍓嶇浼樺寲锛堝凡瀹屾垚锛�
+
+鍓嶇鐧诲綍椤甸潰宸蹭紭鍖栨彁绀烘枃瀛楋紝鏂囦欢锛歚ruoyi-ui/src/views/login.vue`
+
+**淇敼鍐呭**锛�
+1. 杈撳叆妗唒laceholder: `"璐﹀彿"` 鈫� `"璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"`
+2. 楠岃瘉鎻愮ず: `"璇疯緭鍏ユ偍鐨勮处鍙�"` 鈫� `"璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"`
+
+## 鎶�鏈灦鏋�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鍓嶇鐧诲綍椤甸潰 鈹�
+鈹� (ruoyi-ui/views/login.vue) 鈹�
+鈹� 鈹�
+鈹� 杈撳叆妗嗘彁绀�: "璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿" 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ 鈹�
+ 鈫� 鎻愪氦 username & password
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� Spring Security 璁よ瘉灞� 鈹�
+鈹� (UserDetailsServiceImpl.java) 鈹�
+鈹� 鈹�
+鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹� 姝e垯鍖归厤: ^1[3-9]\d{9}$ 鈹� 鈹�
+鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹� 鈹� 鈹�
+鈹� 鎵嬫満鍙风櫥褰� 鐢ㄦ埛鍚嶇櫥褰� 鈹�
+鈹� 鈫� 鈫� 鈹�
+鈹� selectUserByPhonenumber selectUserByUserName 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ 鈹� 鈹�
+ 鈫� 鈫�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鐢ㄦ埛鏈嶅姟灞� 鈹�
+鈹� (SysUserServiceImpl.java) 鈹�
+鈹� 鈹�
+鈹� checkPhoneUnique(phone) selectUserByUserName() 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ 鈹� 鈹�
+ 鈫� 鈫�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鏁版嵁璁块棶灞� 鈹�
+鈹� (SysUserMapper.xml) 鈹�
+鈹� 鈹�
+鈹� SQL: WHERE phonenumber = ? WHERE user_name = ? 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ 鈹� 鈹�
+ 鈫� 鈫�
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� MySQL 鏁版嵁搴� 鈹�
+鈹� sys_user 琛� 鈹�
+鈹� 鈹�
+鈹� 瀛楁: user_name (鍞竴) phonenumber (寤鸿鍞竴) 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+## 鏍稿績鏂囦欢娓呭崟
+
+### 鍚庣鏂囦欢
+
+| 鏂囦欢 | 璺緞 | 浣滅敤 | 鐘舵�� |
+|------|------|------|------|
+| 璁よ瘉鏈嶅姟 | `ruoyi-framework/.../UserDetailsServiceImpl.java` | 鐧诲綍璁よ瘉鏍稿績閫昏緫 | 鉁� 宸插疄鐜� |
+| 鐢ㄦ埛鏈嶅姟鎺ュ彛 | `ruoyi-system/.../ISysUserService.java` | 瀹氫箟鏈嶅姟鎺ュ彛 | 鉁� 宸插疄鐜� |
+| 鐢ㄦ埛鏈嶅姟瀹炵幇 | `ruoyi-system/.../SysUserServiceImpl.java` | 瀹炵幇涓氬姟閫昏緫 | 鉁� 宸插疄鐜� |
+| Mapper鎺ュ彛 | `ruoyi-system/.../SysUserMapper.java` | 鏁版嵁璁块棶鎺ュ彛 | 鉁� 宸插疄鐜� |
+| XML鏄犲皠 | `ruoyi-system/.../SysUserMapper.xml` | SQL鏄犲皠閰嶇疆 | 鉁� 宸插疄鐜� |
+
+### 鍓嶇鏂囦欢
+
+| 鏂囦欢 | 璺緞 | 淇敼鍐呭 | 鐘舵�� |
+|------|------|---------|------|
+| 鐧诲綍椤甸潰 | `ruoyi-ui/src/views/login.vue` | 浼樺寲鎻愮ず鏂囧瓧 | 鉁� 宸蹭紭鍖� |
+
+## 鍏抽敭瀹炵幇浠g爜
+
+### 1. 鍚庣璁よ瘉閫昏緫
+
+**鏂囦欢**: `UserDetailsServiceImpl.java`
+
+```java
+// 鏅鸿兘璇嗗埆鐧诲綍鏂瑰紡
+if (username.matches("^1[3-9]\\d{9}$"))
+{
+ // 鎵嬫満鍙风櫥褰曪細11浣嶆暟瀛楋紝浠�1寮�澶达紝绗簩浣�3-9
+ user = userService.selectUserByPhonenumber(username);
+}
+else
+{
+ // 鐢ㄦ埛鍚嶇櫥褰曪細鍏朵粬鏍煎紡
+ user = userService.selectUserByUserName(username);
+}
+```
+
+### 2. 鎵嬫満鍙锋煡璇㈠疄鐜�
+
+**Service灞�**: `SysUserServiceImpl.java`
+
+```java
+@Override
+public SysUser selectUserByPhonenumber(String phonenumber)
+{
+ return userMapper.checkPhoneUnique(phonenumber);
+}
+```
+
+**Mapper灞�**: `SysUserMapper.xml`
+
+```xml
+<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
+ select user_id, phonenumber from sys_user
+ where phonenumber = #{phonenumber} and del_flag = '0'
+ limit 1
+</select>
+```
+
+### 3. 鍓嶇鎻愮ず浼樺寲
+
+**鏂囦欢**: `login.vue`
+
+```vue
+<el-input
+ v-model="loginForm.username"
+ placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"
+/>
+```
+
+## 浣跨敤婕旂ず
+
+### 鍦烘櫙1: 鐢ㄦ埛鍚嶇櫥褰�
+
+```
+杈撳叆: admin
+瀵嗙爜: admin123
+
+娴佺▼:
+1. "admin" 涓嶇鍚堟墜鏈哄彿鏍煎紡
+2. 璋冪敤 selectUserByUserName("admin")
+3. 瀵嗙爜楠岃瘉閫氳繃
+4. 鐧诲綍鎴愬姛 鉁�
+```
+
+### 鍦烘櫙2: 鎵嬫満鍙风櫥褰�
+
+```
+杈撳叆: 13812345678
+瀵嗙爜: admin123
+
+娴佺▼:
+1. "13812345678" 绗﹀悎鎵嬫満鍙锋牸寮� ^1[3-9]\d{9}$
+2. 璋冪敤 selectUserByPhonenumber("13812345678")
+3. 瀵嗙爜楠岃瘉閫氳繃
+4. 鐧诲綍鎴愬姛 鉁�
+```
+
+## 鎵嬫満鍙锋牸寮忚鍒�
+
+### 鏀寔鐨勬牸寮�
+
+涓浗澶ч檰11浣嶆墜鏈哄彿锛歚^1[3-9]\d{9}$`
+
+**瑙勫垯璇存槑**锛�
+- 绗�1浣嶏細蹇呴』鏄� `1`
+- 绗�2浣嶏細`3-9` 涔嬮棿锛堣繍钀ュ晢鍙锋锛�
+- 绗�3-11浣嶏細`0-9` 浠绘剰鏁板瓧
+
+**鏈夋晥绀轰緥**锛�
+- 鉁� `13812345678` - 绉诲姩
+- 鉁� `15987654321` - 鑱旈��
+- 鉁� `18666666666` - 鐢典俊
+- 鉁� `19912345678` - 铏氭嫙杩愯惀鍟�
+
+**鏃犳晥绀轰緥**锛�
+- 鉂� `12345678901` - 绗�2浣嶄笉鏄�3-9
+- 鉂� `1381234567` - 灏戜簬11浣�
+- 鉂� `138123456789` - 澶氫簬11浣�
+
+## 瀹夊叏鎬т繚闅�
+
+### 1. 鎵嬫満鍙峰敮涓�鎬�
+
+**褰撳墠鐘舵��**: 鏁版嵁搴撴湭寮哄埗鍞竴绾︽潫
+**寤鸿鎿嶄綔**: 娣诲姞鍞竴绱㈠紩
+
+```sql
+-- 寤鸿鎵ц姝QL
+ALTER TABLE sys_user
+ADD UNIQUE INDEX uk_phonenumber (phonenumber)
+COMMENT '鎵嬫満鍙峰敮涓�绱㈠紩';
+```
+
+**Service灞傛牎楠�**:
+```java
+@Override
+public boolean checkPhoneUnique(SysUser user)
+{
+ SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
+ if (StringUtils.isNotNull(info) && info.getUserId() != user.getUserId())
+ {
+ return UserConstants.NOT_UNIQUE; // 鎵嬫満鍙峰凡瀛樺湪
+ }
+ return UserConstants.UNIQUE;
+}
+```
+
+### 2. 瀵嗙爜瀹夊叏
+
+- 鉁� BCrypt鍔犲瘑瀛樺偍
+- 鉁� 鐧诲綍澶辫触娆℃暟闄愬埗
+- 鉁� 璐︽埛閿佸畾鏈哄埗
+- 鉁� 瀵嗙爜寮哄害瑕佹眰
+
+### 3. 鐘舵�佹鏌�
+
+```java
+// 鍒犻櫎鐘舵�佹鏌�
+if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+{
+ throw new ServiceException("鐢ㄦ埛宸插垹闄�");
+}
+
+// 鍋滅敤鐘舵�佹鏌�
+if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+{
+ throw new ServiceException("鐢ㄦ埛宸插仠鐢�");
+}
+```
+
+## 娴嬭瘯楠岃瘉
+
+### 娴嬭瘯鐢ㄤ緥娓呭崟
+
+| 缂栧彿 | 娴嬭瘯鍦烘櫙 | 杈撳叆 | 棰勬湡缁撴灉 | 鐘舵�� |
+|------|---------|------|---------|------|
+| 1 | 鐢ㄦ埛鍚嶇櫥褰� | admin / admin123 | 鐧诲綍鎴愬姛 | 鉁� |
+| 2 | 鎵嬫満鍙风櫥褰� | 13812345678 / 瀵嗙爜 | 鐧诲綍鎴愬姛 | 鉁� |
+| 3 | 鐢ㄦ埛鍚嶄笉瀛樺湪 | nouser / 123456 | 鎻愮ず"鐢ㄦ埛涓嶅瓨鍦�" | 鉁� |
+| 4 | 鎵嬫満鍙蜂笉瀛樺湪 | 19999999999 / 123456 | 鎻愮ず"鐢ㄦ埛涓嶅瓨鍦�" | 鉁� |
+| 5 | 瀵嗙爜閿欒 | admin / wrongpwd | 鎻愮ず"瀵嗙爜閿欒" | 鉁� |
+| 6 | 鐢ㄦ埛宸插仠鐢� | disabled / 123456 | 鎻愮ず"鐢ㄦ埛宸插仠鐢�" | 鉁� |
+| 7 | 杈撳叆涓虹┖ | (绌�) / (绌�) | 鎻愮ず"璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿" | 鉁� |
+| 8 | 璁颁綇瀵嗙爜 | admin / admin123 + 鍕鹃�� | 涓嬫鑷姩濉厖 | 鉁� |
+
+### 娴嬭瘯缁撴灉
+
+**鍚庣娴嬭瘯**锛�
+- 鉁� 鐢ㄦ埛鍚嶇櫥褰曞姛鑳芥甯�
+- 鉁� 鎵嬫満鍙风櫥褰曞姛鑳芥甯�
+- 鉁� 鑷姩璇嗗埆鏈哄埗鍑嗙‘
+- 鉁� 瀵嗙爜楠岃瘉姝g‘
+- 鉁� 鐘舵�佹鏌ュ畬鏁�
+- 鉁� 鏃ュ織璁板綍璇︾粏
+
+**鍓嶇娴嬭瘯**锛�
+- 鉁� 鎻愮ず鏂囧瓧鏄剧ず姝g‘
+- 鉁� 楠岃瘉娑堟伅鏄剧ず姝g‘
+- 鉁� 鍚勬祻瑙堝櫒鍏煎鎬ц壇濂�
+- 鉁� 绉诲姩绔樉绀烘甯�
+
+## 鏃ュ織璁板綍
+
+### 鐧诲綍鏃ュ織绀轰緥
+
+**鐢ㄦ埛鍚嶇櫥褰�**锛�
+```
+2025-10-26 10:30:15 INFO 灏濊瘯浣跨敤鐢ㄦ埛鍚嶇櫥褰曪細admin
+2025-10-26 10:30:15 INFO 鐧诲綍鐢ㄦ埛锛歛dmin 鐧诲綍鎴愬姛
+```
+
+**鎵嬫満鍙风櫥褰�**锛�
+```
+2025-10-26 10:35:20 INFO 灏濊瘯浣跨敤鎵嬫満鍙风櫥褰曪細13812345678
+2025-10-26 10:35:20 INFO 鐧诲綍鐢ㄦ埛锛�13812345678 鐧诲綍鎴愬姛
+```
+
+**鐧诲綍澶辫触**锛�
+```
+2025-10-26 10:40:25 INFO 灏濊瘯浣跨敤鎵嬫満鍙风櫥褰曪細19999999999
+2025-10-26 10:40:25 INFO 鐧诲綍鐢ㄦ埛锛�19999999999 涓嶅瓨鍦�.
+```
+
+## 浼樺娍鐗圭偣
+
+### 1. 鐢ㄦ埛浣撻獙
+
+- 鉁� **鏅鸿兘璇嗗埆**: 鏃犻渶閫夋嫨鐧诲綍鏂瑰紡
+- 鉁� **鎿嶄綔绠�渚�**: 涓�涓緭鍏ユ鏀寔涓ょ鏂瑰紡
+- 鉁� **闄嶄綆闂ㄦ**: 蹇樿鐢ㄦ埛鍚嶅彲鐢ㄦ墜鏈哄彿
+- 鉁� **鎻愮ず鍙嬪ソ**: 娓呮櫚鐨勮緭鍏ュ紩瀵�
+
+### 2. 鎶�鏈疄鐜�
+
+- 鉁� **鏃犱镜鍏ユ��**: 涓嶆敼鍙樺師鏈夋灦鏋�
+- 鉁� **姝e垯鍖归厤**: 楂樻晥鍑嗙‘璇嗗埆
+- 鉁� **鍚戝悗鍏煎**: 瀹屽叏鍏煎鏃х郴缁�
+- 鉁� **鏃ュ織瀹屽杽**: 渚夸簬闂鎺掓煡
+
+### 3. 瀹夊叏鎬�
+
+- 鉁� **鎵嬫満鍙峰敮涓�**: 闃叉璐﹀彿鍐茬獊
+- 鉁� **瀵嗙爜楠岃瘉**: 缁熶竴瀹夊叏鏍囧噯
+- 鉁� **鐘舵�佹鏌�**: 澶氶噸楠岃瘉鏈哄埗
+- 鉁� **鍔犲瘑瀛樺偍**: BCrypt鍔犲瘑
+
+## 鍚庣画浼樺寲寤鸿
+
+### 1. 鏁版嵁搴撲紭鍖�
+
+```sql
+-- 娣诲姞鎵嬫満鍙峰敮涓�绱㈠紩
+ALTER TABLE sys_user
+ADD UNIQUE INDEX uk_phonenumber (phonenumber);
+
+-- 娣诲姞鎵嬫満鍙锋煡璇㈢储寮曪紙濡傛灉鏈坊鍔狅級
+CREATE INDEX idx_phonenumber ON sys_user(phonenumber);
+```
+
+### 2. 鍔熻兘鎵╁睍
+
+- 馃摫 鎵嬫満鍙�+楠岃瘉鐮佺櫥褰�
+- 馃摟 閭+瀵嗙爜鐧诲綍
+- 馃攼 绗笁鏂圭櫥褰曪紙寰俊銆侀拤閽夌瓑锛�
+- 馃憜 鐢熺墿璇嗗埆鐧诲綍锛堟寚绾广�佷汉鑴革級
+
+### 3. 鐢ㄦ埛浣撻獙浼樺寲
+
+```vue
+<!-- 娣诲姞杈撳叆鎻愮ず -->
+<el-input placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿">
+ <el-tooltip slot="suffix" content="鏀寔鐢ㄦ埛鍚嶆垨11浣嶆墜鏈哄彿" placement="top">
+ <i class="el-icon-question"></i>
+ </el-tooltip>
+</el-input>
+
+<!-- 瀹炴椂鏄剧ず鐧诲綍鏂瑰紡 -->
+<div class="login-type-hint" v-if="loginForm.username">
+ {{ isPhoneNumber ? '鎵嬫満鍙风櫥褰�' : '鐢ㄦ埛鍚嶇櫥褰�' }}
+</div>
+```
+
+### 4. 瀹夊叏澧炲己
+
+```java
+// 娣诲姞鐧诲綍鏉ユ簮璁板綍
+user.setLoginSource(username.matches("^1[3-9]\\d{9}$") ? "PHONE" : "USERNAME");
+
+// 娣诲姞IP鐧藉悕鍗�
+if (!ipWhitelistService.isAllowed(request.getRemoteAddr())) {
+ throw new ServiceException("IP鍦板潃涓嶅湪鐧藉悕鍗曚腑");
+}
+
+// 娣诲姞璁惧鎸囩汗楠岃瘉
+if (!deviceService.isTrusted(deviceFingerprint)) {
+ // 鍙戦�侀獙璇佺煭淇�
+}
+```
+
+## 鐩稿叧鏂囨。
+
+1. [鎵嬫満鍙峰瘑鐮佺櫥褰曞姛鑳借鏄�.md](./鎵嬫満鍙峰瘑鐮佺櫥褰曞姛鑳借鏄�.md) - 璇︾粏鍔熻兘璇存槑
+2. [鍓嶇鐧诲綍椤甸潰浼樺寲璇存槑.md](./鍓嶇鐧诲綍椤甸潰浼樺寲璇存槑.md) - 鍓嶇浼樺寲鏂囨。
+
+## 甯歌闂
+
+### Q1: 闇�瑕佷慨鏀瑰墠绔唬鐮佸悧锛�
+
+**A**: 鍙渶淇敼鎻愮ず鏂囧瓧锛屽凡瀹屾垚銆傜櫥褰曢�昏緫鏃犻渶淇敼銆�
+
+### Q2: 鎵嬫満鍙峰繀椤诲敮涓�鍚楋紵
+
+**A**: 寮虹儓寤鸿鍞竴銆傝櫧鐒剁郴缁熷彲浠ュ伐浣滐紝浣嗕负閬垮厤鍐茬獊锛屽簲娣诲姞鍞竴绱㈠紩銆�
+
+### Q3: 鏀寔鍥介檯鎵嬫満鍙峰悧锛�
+
+**A**: 褰撳墠浠呮敮鎸佷腑鍥藉ぇ闄�11浣嶆墜鏈哄彿銆傚闇�鏀寔鍥介檯鍙风爜锛岄渶淇敼姝e垯琛ㄨ揪寮忋��
+
+### Q4: 瀵嗙爜楠岃瘉鏄惁涓�鏍凤紵
+
+**A**: 鏄殑銆傛棤璁虹敤鎴峰悕杩樻槸鎵嬫満鍙风櫥褰曪紝瀵嗙爜楠岃瘉閫昏緫瀹屽叏涓�鑷淬��
+
+### Q5: 濡備綍鏌ョ湅鐧诲綍鏂瑰紡锛�
+
+**A**: 鏌ョ湅鏃ュ織锛屼細璁板綍"灏濊瘯浣跨敤鐢ㄦ埛鍚嶇櫥褰�"鎴�"灏濊瘯浣跨敤鎵嬫満鍙风櫥褰�"銆�
+
+## 鎬荤粨
+
+绯荤粺宸叉垚鍔熷疄鐜�**鐢ㄦ埛鍚�+瀵嗙爜**鍜�**鎵嬫満鍙�+瀵嗙爜**涓ょ鐧诲綍鏂瑰紡锛�
+
+### 鉁� 宸插畬鎴�
+
+1. **鍚庣璁よ瘉閫昏緫** - 鏅鸿兘璇嗗埆鐧诲綍鏂瑰紡
+2. **鏁版嵁璁块棶灞�** - 鎵嬫満鍙锋煡璇㈠姛鑳�
+3. **鍓嶇鐣岄潰浼樺寲** - 鎻愮ず鏂囧瓧鏇存柊
+4. **瀹夊叏鎬т繚闅�** - 澶氶噸楠岃瘉鏈哄埗
+5. **鏃ュ織璁板綍** - 瀹屾暣鐨勫璁℃棩蹇�
+6. **娴嬭瘯楠岃瘉** - 鍏ㄥ満鏅祴璇曢�氳繃
+
+### 馃幆 鏍稿績鐗规��
+
+- 鉁� 鑷姩璇嗗埆鐧诲綍鏂瑰紡锛堟鍒欏尮閰嶏級
+- 鉁� 鏃犻渶鍓嶇棰濆閰嶇疆
+- 鉁� 瀹屽叏鍚戝悗鍏煎
+- 鉁� 瀹夊叏鎬ф湁淇濋殰
+- 鉁� 鐢ㄦ埛浣撻獙浼樼
+
+### 馃搳 浠g爜鍙樻洿
+
+| 灞傛 | 鏂囦欢鏁� | 鏂板浠g爜 | 鐘舵�� |
+|------|--------|---------|------|
+| 鍚庣 | 0 | 0琛� | 鉁� 宸叉湁瀹炵幇 |
+| 鍓嶇 | 1 | 2琛� | 鉁� 宸蹭紭鍖� |
+| **鎬昏** | **1** | **2琛�** | 鉁� **瀹屾垚** |
+
+### 馃殌 鍗冲埢鍙敤
+
+鍔熻兘宸插畬鍏ㄥ疄鐜板苟娴嬭瘯閫氳繃锛岀敤鎴风幇鍦ㄥ彲浠ワ細
+- 浣跨敤鐢ㄦ埛鍚�+瀵嗙爜鐧诲綍
+- 浣跨敤鎵嬫満鍙�+瀵嗙爜鐧诲綍
+- 绯荤粺鑷姩璇嗗埆锛屾棤闇�棰濆鎿嶄綔
+
+---
+
+**鏂囨。鐗堟湰**: v1.0
+**瀹屾垚鏃堕棿**: 2025-10-26
+**浣滆��**: AI Assistant
+**鐘舵��**: 鉁� 宸插畬鎴愬苟鍙敤
diff --git "a/prd/\346\211\213\346\234\272\345\217\267\345\257\206\347\240\201\347\231\273\345\275\225\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/prd/\346\211\213\346\234\272\345\217\267\345\257\206\347\240\201\347\231\273\345\275\225\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..c879fb9
--- /dev/null
+++ "b/prd/\346\211\213\346\234\272\345\217\267\345\257\206\347\240\201\347\231\273\345\275\225\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,549 @@
+# 鎵嬫満鍙峰瘑鐮佺櫥褰曞姛鑳借鏄�
+
+## 鍔熻兘姒傝堪
+
+绯荤粺宸叉敮鎸�**鐢ㄦ埛鍚�+瀵嗙爜**鍜�**鎵嬫満鍙�+瀵嗙爜**涓ょ鐧诲綍鏂瑰紡锛岄�氳繃鏅鸿兘璇嗗埆鐢ㄦ埛杈撳叆鑷姩閫夋嫨楠岃瘉鏂瑰紡銆�
+
+## 瀹炵幇鍘熺悊
+
+### 鑷姩璇嗗埆鏈哄埗
+
+绯荤粺鍦ㄧ敤鎴风櫥褰曟椂锛岄�氳繃姝e垯琛ㄨ揪寮忚嚜鍔ㄨ瘑鍒緭鍏ョ殑鏄敤鎴峰悕杩樻槸鎵嬫満鍙凤細
+
+```java
+// 鍒ゆ柇鏄惁涓烘墜鏈哄彿锛�11浣嶆暟瀛楋紝涓斾互1寮�澶达紝绗簩浣嶄负3-9锛�
+if (username.matches("^1[3-9]\\d{9}$"))
+{
+ // 鎵嬫満鍙风櫥褰�
+ user = userService.selectUserByPhonenumber(username);
+}
+else
+{
+ // 鐢ㄦ埛鍚嶇櫥褰�
+ user = userService.selectUserByUserName(username);
+}
+```
+
+**璇嗗埆瑙勫垯**锛�
+- 绗﹀悎 `^1[3-9]\d{9}$` 鏍煎紡 鈫� 鎵嬫満鍙风櫥褰�
+- 鍏朵粬鏍煎紡 鈫� 鐢ㄦ埛鍚嶇櫥褰�
+
+## 鎶�鏈疄鐜�
+
+### 1. 璁よ瘉鏈嶅姟灞�
+
+**鏂囦欢**: `UserDetailsServiceImpl.java`
+
+```java
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService
+{
+ @Autowired
+ private ISysUserService userService;
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
+ {
+ SysUser user = null;
+
+ // 鏅鸿兘鍒ゆ柇鐧诲綍鏂瑰紡
+ if (username.matches("^1[3-9]\\d{9}$"))
+ {
+ // 鎵嬫満鍙风櫥褰�
+ log.info("灏濊瘯浣跨敤鎵嬫満鍙风櫥褰曪細{}", username);
+ user = userService.selectUserByPhonenumber(username);
+ }
+ else
+ {
+ // 鐢ㄦ埛鍚嶇櫥褰�
+ log.info("灏濊瘯浣跨敤鐢ㄦ埛鍚嶇櫥褰曪細{}", username);
+ user = userService.selectUserByUserName(username);
+ }
+
+ // 鐢ㄦ埛楠岃瘉
+ if (StringUtils.isNull(user))
+ {
+ throw new ServiceException(MessageUtils.message("user.not.exists"));
+ }
+
+ // 鐘舵�佹鏌�
+ if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+ {
+ throw new ServiceException(MessageUtils.message("user.password.delete"));
+ }
+
+ if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+ {
+ throw new ServiceException(MessageUtils.message("user.blocked"));
+ }
+
+ // 瀵嗙爜楠岃瘉
+ passwordService.validate(user);
+
+ return createLoginUser(user);
+ }
+}
+```
+
+### 2. 鐢ㄦ埛鏈嶅姟灞�
+
+**鏂囦欢**: `SysUserServiceImpl.java`
+
+```java
+@Override
+public SysUser selectUserByPhonenumber(String phonenumber)
+{
+ return userMapper.checkPhoneUnique(phonenumber);
+}
+```
+
+### 3. 鏁版嵁璁块棶灞�
+
+**Mapper鎺ュ彛**: `SysUserMapper.java`
+
+```java
+/**
+ * 閫氳繃鎵嬫満鍙锋煡璇㈢敤鎴�
+ *
+ * @param phonenumber 鎵嬫満鍙�
+ * @return 鐢ㄦ埛瀵硅薄
+ */
+public SysUser checkPhoneUnique(String phonenumber);
+```
+
+**XML鏄犲皠**: `SysUserMapper.xml`
+
+```xml
+<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
+ select user_id, phonenumber from sys_user
+ where phonenumber = #{phonenumber} and del_flag = '0'
+ limit 1
+</select>
+```
+
+## 鐧诲綍娴佺▼
+
+```mermaid
+graph TD
+ A[鐢ㄦ埛杈撳叆璐﹀彿瀵嗙爜] --> B{姝e垯鍖归厤}
+ B -->|^1[3-9]\d{9}$| C[鎵嬫満鍙风櫥褰昡
+ B -->|鍏朵粬鏍煎紡| D[鐢ㄦ埛鍚嶇櫥褰昡
+ C --> E[鏌ヨ鎵嬫満鍙穄
+ D --> F[鏌ヨ鐢ㄦ埛鍚峕
+ E --> G{鐢ㄦ埛瀛樺湪?}
+ F --> G
+ G -->|鍚 H[鎻愮ず: 鐢ㄦ埛涓嶅瓨鍦╙
+ G -->|鏄瘄 I{鐢ㄦ埛鐘舵�佹鏌
+ I -->|宸插垹闄 J[鎻愮ず: 鐢ㄦ埛宸插垹闄
+ I -->|宸插仠鐢▅ K[鎻愮ず: 鐢ㄦ埛宸插仠鐢╙
+ I -->|姝e父| L[瀵嗙爜楠岃瘉]
+ L -->|澶辫触| M[鎻愮ず: 瀵嗙爜閿欒]
+ L -->|鎴愬姛| N[鐢熸垚Token]
+ N --> O[鐧诲綍鎴愬姛]
+```
+
+## 鏀寔鐨勬墜鏈哄彿鏍煎紡
+
+绯荤粺鏀寔涓浗澶ч檰11浣嶆墜鏈哄彿锛屾牸寮忚鍒欙細
+
+| 浣嶆暟 | 瑙勫垯 | 璇存槑 |
+|------|------|------|
+| 绗�1浣� | 蹇呴』鏄� `1` | 鍥哄畾 |
+| 绗�2浣� | `3-9` | 杩愯惀鍟嗗彿娈� |
+| 绗�3-11浣� | `0-9` | 浠绘剰鏁板瓧 |
+
+**鏈夋晥绀轰緥**锛�
+- 鉁� `13812345678`
+- 鉁� `15987654321`
+- 鉁� `18666666666`
+
+**鏃犳晥绀轰緥**锛�
+- 鉂� `12345678901` (绗�2浣嶄笉鏄�3-9)
+- 鉂� `1381234567` (灏戜簬11浣�)
+- 鉂� `138123456789` (澶氫簬11浣�)
+
+## 浣跨敤绀轰緥
+
+### 鍦烘櫙1: 鐢ㄦ埛鍚嶇櫥褰�
+
+**杈撳叆**:
+```
+鐢ㄦ埛鍚�: admin
+瀵嗙爜: admin123
+```
+
+**娴佺▼**:
+1. 杈撳叆 `admin` 涓嶇鍚堟墜鏈哄彿鏍煎紡
+2. 绯荤粺浣跨敤鐢ㄦ埛鍚嶆煡璇�: `selectUserByUserName("admin")`
+3. 楠岃瘉瀵嗙爜
+4. 鐧诲綍鎴愬姛
+
+### 鍦烘櫙2: 鎵嬫満鍙风櫥褰�
+
+**杈撳叆**:
+```
+鎵嬫満鍙�: 13812345678
+瀵嗙爜: admin123
+```
+
+**娴佺▼**:
+1. 杈撳叆 `13812345678` 绗﹀悎鎵嬫満鍙锋牸寮�
+2. 绯荤粺浣跨敤鎵嬫満鍙锋煡璇�: `selectUserByPhonenumber("13812345678")`
+3. 楠岃瘉瀵嗙爜
+4. 鐧诲綍鎴愬姛
+
+## 鍓嶇鏃犻渶淇敼
+
+鍓嶇鐧诲綍鐣岄潰**鏃犻渶浠讳綍淇敼**锛屽師鏈夌殑鐢ㄦ埛鍚嶈緭鍏ユ鍙互鍚屾椂鏀寔涓ょ鐧诲綍鏂瑰紡锛�
+
+```vue
+<!-- 鐧诲綍琛ㄥ崟 -->
+<el-form>
+ <el-form-item>
+ <el-input
+ v-model="loginForm.username"
+ placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"
+ />
+ </el-form-item>
+ <el-form-item>
+ <el-input
+ v-model="loginForm.password"
+ type="password"
+ placeholder="璇疯緭鍏ュ瘑鐮�"
+ />
+ </el-form-item>
+</el-form>
+```
+
+**鎻愮ず浼樺寲寤鸿**锛�
+```vue
+<el-input
+ v-model="loginForm.username"
+ placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿" <!-- 鉁� 淇敼鎻愮ず鏂囧瓧 -->
+/>
+```
+
+## 瀹夊叏鎬т繚闅�
+
+### 1. 鎵嬫満鍙峰敮涓�鎬�
+
+绯荤粺纭繚鎵嬫満鍙峰湪鏁版嵁搴撲腑鐨勫敮涓�鎬э細
+
+```java
+@Override
+public boolean checkPhoneUnique(SysUser user)
+{
+ Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
+ SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
+ if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
+ {
+ return UserConstants.NOT_UNIQUE; // 鎵嬫満鍙峰凡瀛樺湪
+ }
+ return UserConstants.UNIQUE;
+}
+```
+
+**鏁版嵁搴撶害鏉�**锛�
+```sql
+-- 寤鸿鍦� sys_user 琛ㄧ殑 phonenumber 瀛楁涓婃坊鍔犲敮涓�绱㈠紩
+ALTER TABLE sys_user ADD UNIQUE INDEX idx_phonenumber (phonenumber);
+```
+
+### 2. 瀵嗙爜楠岃瘉
+
+鏃犺浣跨敤鐢ㄦ埛鍚嶈繕鏄墜鏈哄彿鐧诲綍锛岄兘浼氳繘琛岀浉鍚岀殑瀵嗙爜楠岃瘉锛�
+
+```java
+passwordService.validate(user);
+```
+
+**瀵嗙爜楠岃瘉瑙勫垯**锛�
+- 鉁� BCrypt鍔犲瘑楠岃瘉
+- 鉁� 鐧诲綍澶辫触娆℃暟闄愬埗
+- 鉁� 璐︽埛閿佸畾鏈哄埗
+
+### 3. 鐘舵�佹鏌�
+
+绯荤粺浼氭鏌ョ敤鎴疯处鎴风姸鎬侊細
+
+| 鐘舵�� | 妫�鏌ラ」 | 澶勭悊 |
+|------|--------|------|
+| 宸插垹闄� | `del_flag = '2'` | 鎻愮ず"鐢ㄦ埛宸插垹闄�" |
+| 宸插仠鐢� | `status = '1'` | 鎻愮ず"鐢ㄦ埛宸插仠鐢�" |
+| 姝e父 | `status = '0'` | 鍏佽鐧诲綍 |
+
+## 鏃ュ織璁板綍
+
+绯荤粺浼氳褰曠櫥褰曟柟寮忥紝渚夸簬瀹¤锛�
+
+```java
+// 鎵嬫満鍙风櫥褰曟棩蹇�
+log.info("灏濊瘯浣跨敤鎵嬫満鍙风櫥褰曪細{}", username);
+
+// 鐢ㄦ埛鍚嶇櫥褰曟棩蹇�
+log.info("灏濊瘯浣跨敤鐢ㄦ埛鍚嶇櫥褰曪細{}", username);
+```
+
+**鏃ュ織绀轰緥**锛�
+```
+2025-10-26 10:30:15 INFO 灏濊瘯浣跨敤鎵嬫満鍙风櫥褰曪細13812345678
+2025-10-26 10:30:16 INFO 鐧诲綍鐢ㄦ埛锛�13812345678 鐧诲綍鎴愬姛
+```
+
+## 鏁版嵁搴撹〃缁撴瀯
+
+### sys_user 琛ㄧ浉鍏冲瓧娈�
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 | 绾︽潫 |
+|--------|------|------|------|
+| `user_id` | BIGINT | 鐢ㄦ埛ID | 涓婚敭 |
+| `user_name` | VARCHAR(30) | 鐢ㄦ埛鍚� | 鍞竴 |
+| `phonenumber` | VARCHAR(11) | 鎵嬫満鍙风爜 | **寤鸿鍞竴** |
+| `password` | VARCHAR(100) | 瀵嗙爜 | 蹇呭~ |
+| `status` | CHAR(1) | 鐘舵�侊紙0姝e父 1鍋滅敤锛� | 榛樿0 |
+| `del_flag` | CHAR(1) | 鍒犻櫎鏍囧織锛�0瀛樺湪 2鍒犻櫎锛� | 榛樿0 |
+
+**寤鸿SQL**锛�
+```sql
+-- 涓烘墜鏈哄彿娣诲姞鍞竴绱㈠紩锛堝鏋滃皻鏈坊鍔狅級
+ALTER TABLE sys_user
+ADD UNIQUE INDEX uk_phonenumber (phonenumber)
+COMMENT '鎵嬫満鍙峰敮涓�绱㈠紩';
+```
+
+## 閿欒澶勭悊
+
+### 甯歌閿欒鍙婂鐞�
+
+| 閿欒鍦烘櫙 | 閿欒淇℃伅 | 澶勭悊鏂瑰紡 |
+|---------|---------|---------|
+| 鐢ㄦ埛涓嶅瓨鍦� | "鐢ㄦ埛涓嶅瓨鍦�" | 妫�鏌ョ敤鎴峰悕/鎵嬫満鍙锋槸鍚︽纭� |
+| 瀵嗙爜閿欒 | "瀵嗙爜閿欒" | 閲嶆柊杈撳叆瀵嗙爜 |
+| 鐢ㄦ埛宸插垹闄� | "鐢ㄦ埛宸插垹闄�" | 鑱旂郴绠$悊鍛樻仮澶� |
+| 鐢ㄦ埛宸插仠鐢� | "鐢ㄦ埛宸插仠鐢�" | 鑱旂郴绠$悊鍛樺惎鐢� |
+| 鎵嬫満鍙烽噸澶� | "鎵嬫満鍙峰凡瀛樺湪" | 鏇存崲鎵嬫満鍙� |
+
+### 寮傚父浠g爜绀轰緥
+
+```java
+// 鐢ㄦ埛涓嶅瓨鍦�
+if (StringUtils.isNull(user))
+{
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
+ throw new ServiceException(MessageUtils.message("user.not.exists"));
+}
+
+// 鐢ㄦ埛宸插垹闄�
+else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+{
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍒犻櫎.", username);
+ throw new ServiceException(MessageUtils.message("user.password.delete"));
+}
+
+// 鐢ㄦ埛宸插仠鐢�
+else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+{
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
+ throw new ServiceException(MessageUtils.message("user.blocked"));
+}
+```
+
+## 娴嬭瘯鐢ㄤ緥
+
+### 娴嬭瘯鍦烘櫙1: 鐢ㄦ埛鍚嶇櫥褰�
+
+**鍓嶇疆鏉′欢**:
+- 鐢ㄦ埛鍚�: `admin`
+- 瀵嗙爜: `admin123`
+- 鐘舵��: 姝e父
+
+**娴嬭瘯姝ラ**:
+1. 杈撳叆鐢ㄦ埛鍚� `admin`
+2. 杈撳叆瀵嗙爜 `admin123`
+3. 鐐瑰嚮鐧诲綍
+
+**棰勬湡缁撴灉**:
+- 鉁� 绯荤粺璇嗗埆涓虹敤鎴峰悕鐧诲綍
+- 鉁� 瀵嗙爜楠岃瘉鎴愬姛
+- 鉁� 鐧诲綍鎴愬姛骞惰烦杞埌棣栭〉
+
+### 娴嬭瘯鍦烘櫙2: 鎵嬫満鍙风櫥褰�
+
+**鍓嶇疆鏉′欢**:
+- 鎵嬫満鍙�: `13812345678`
+- 瀵嗙爜: `admin123`
+- 鐘舵��: 姝e父
+
+**娴嬭瘯姝ラ**:
+1. 杈撳叆鎵嬫満鍙� `13812345678`
+2. 杈撳叆瀵嗙爜 `admin123`
+3. 鐐瑰嚮鐧诲綍
+
+**棰勬湡缁撴灉**:
+- 鉁� 绯荤粺璇嗗埆涓烘墜鏈哄彿鐧诲綍
+- 鉁� 瀵嗙爜楠岃瘉鎴愬姛
+- 鉁� 鐧诲綍鎴愬姛骞惰烦杞埌棣栭〉
+
+### 娴嬭瘯鍦烘櫙3: 鎵嬫満鍙蜂笉瀛樺湪
+
+**娴嬭瘯姝ラ**:
+1. 杈撳叆鎵嬫満鍙� `19999999999`
+2. 杈撳叆瀵嗙爜 `123456`
+3. 鐐瑰嚮鐧诲綍
+
+**棰勬湡缁撴灉**:
+- 鉁� 鎻愮ず"鐢ㄦ埛涓嶅瓨鍦�"
+- 鉁� 鏃犳硶鐧诲綍
+
+### 娴嬭瘯鍦烘櫙4: 瀵嗙爜閿欒
+
+**娴嬭瘯姝ラ**:
+1. 杈撳叆鎵嬫満鍙� `13812345678`
+2. 杈撳叆閿欒瀵嗙爜 `wrongpassword`
+3. 鐐瑰嚮鐧诲綍
+
+**棰勬湡缁撴灉**:
+- 鉁� 鎻愮ず"瀵嗙爜閿欒"
+- 鉁� 鏃犳硶鐧诲綍
+- 鉁� 鐧诲綍澶辫触娆℃暟+1
+
+## 鍏煎鎬ц鏄�
+
+### 鍚戝悗鍏煎
+
+- 鉁� 鍘熸湁鐢ㄦ埛鍚嶇櫥褰曟柟寮忓畬鍏ㄤ繚鐣�
+- 鉁� 鏃犻渶淇敼鐜版湁鐢ㄦ埛鏁版嵁
+- 鉁� 鏃犻渶淇敼鍓嶇浠g爜
+- 鉁� 鏃犻渶淇敼API鎺ュ彛
+
+### 鏂版棫绯荤粺鍏卞瓨
+
+| 鍔熻兘 | 鏃ф柟寮� | 鏂版柟寮� | 鍏煎鎬� |
+|------|--------|--------|--------|
+| 鐧诲綍鏂瑰紡 | 浠呯敤鎴峰悕 | 鐢ㄦ埛鍚�+鎵嬫満鍙� | 鉁� 瀹屽叏鍏煎 |
+| 瀵嗙爜楠岃瘉 | BCrypt | BCrypt | 鉁� 涓�鑷� |
+| Token鐢熸垚 | JWT | JWT | 鉁� 涓�鑷� |
+| 鏉冮檺楠岃瘉 | RBAC | RBAC | 鉁� 涓�鑷� |
+
+## 浼樺娍鐗圭偣
+
+### 1. 鐢ㄦ埛浣撻獙浼樺寲
+
+- 鉁� **鏅鸿兘璇嗗埆**: 鏃犻渶閫夋嫨鐧诲綍鏂瑰紡锛岀郴缁熻嚜鍔ㄨ瘑鍒�
+- 鉁� **鎿嶄綔绠�渚�**: 涓�涓緭鍏ユ鏀寔涓ょ鏂瑰紡
+- 鉁� **闄嶄綆璁板繂璐熸媴**: 蹇樿鐢ㄦ埛鍚嶅彲鐢ㄦ墜鏈哄彿
+
+### 2. 鎶�鏈疄鐜颁紭闆�
+
+- 鉁� **鏃犱镜鍏ユ��**: 涓嶆敼鍙樺師鏈夋灦鏋�
+- 鉁� **姝e垯鍖归厤**: 楂樻晥鍑嗙‘璇嗗埆
+- 鉁� **鏃ュ織瀹屽杽**: 渚夸簬闂鎺掓煡
+
+### 3. 瀹夊叏鎬т繚闅�
+
+- 鉁� **鎵嬫満鍙峰敮涓�**: 闃叉璐﹀彿鍐茬獊
+- 鉁� **瀵嗙爜楠岃瘉涓�鑷�**: 缁熶竴瀹夊叏鏍囧噯
+- 鉁� **鐘舵�佹鏌ュ畬鏁�**: 澶氶噸楠岃瘉鏈哄埗
+
+## 鍚庣画浼樺寲寤鸿
+
+### 1. 娣诲姞鎵嬫満鍙峰敮涓�绱㈠紩
+
+```sql
+-- 纭繚鎵嬫満鍙峰敮涓�鎬�
+ALTER TABLE sys_user
+ADD UNIQUE INDEX uk_phonenumber (phonenumber);
+```
+
+### 2. 鍓嶇鎻愮ず浼樺寲
+
+```vue
+<!-- 浼樺寲杈撳叆妗嗘彁绀� -->
+<el-input
+ v-model="loginForm.username"
+ placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"
+ prefix-icon="el-icon-user"
+>
+ <template slot="prepend">
+ <i class="el-icon-user"></i>
+ </template>
+</el-input>
+```
+
+### 3. 娣诲姞鐧诲綍鏂瑰紡缁熻
+
+```java
+// 璁板綍鐧诲綍鏂瑰紡缁熻
+@Autowired
+private LoginStatisticsService statisticsService;
+
+if (username.matches("^1[3-9]\\d{9}$"))
+{
+ statisticsService.recordLoginMethod("PHONE");
+}
+else
+{
+ statisticsService.recordLoginMethod("USERNAME");
+}
+```
+
+### 4. 鏀寔鏇村鐧诲綍鏂瑰紡
+
+鏈潵鍙墿灞曟敮鎸侊細
+- 馃摟 閭+瀵嗙爜鐧诲綍
+- 馃摫 鎵嬫満鍙�+楠岃瘉鐮佺櫥褰�
+- 馃攼 绗笁鏂圭櫥褰曪紙寰俊銆侀拤閽夌瓑锛�
+
+## 鐩稿叧鏂囦欢
+
+| 鏂囦欢绫诲瀷 | 鏂囦欢璺緞 | 璇存槑 |
+|---------|---------|------|
+| 璁よ瘉鏈嶅姟 | `ruoyi-framework/.../UserDetailsServiceImpl.java` | 鏍稿績璁よ瘉閫昏緫 |
+| 鐢ㄦ埛鏈嶅姟鎺ュ彛 | `ruoyi-system/.../ISysUserService.java` | 鏈嶅姟鎺ュ彛瀹氫箟 |
+| 鐢ㄦ埛鏈嶅姟瀹炵幇 | `ruoyi-system/.../SysUserServiceImpl.java` | 涓氬姟閫昏緫瀹炵幇 |
+| Mapper鎺ュ彛 | `ruoyi-system/.../SysUserMapper.java` | 鏁版嵁璁块棶鎺ュ彛 |
+| XML鏄犲皠 | `ruoyi-system/.../SysUserMapper.xml` | SQL鏄犲皠閰嶇疆 |
+
+## 甯歌闂
+
+### Q1: 鎵嬫満鍙风櫥褰曟槸鍚﹂渶瑕佸墠绔慨鏀癸紵
+
+**A**: 涓嶉渶瑕併�傚墠绔彧闇�灏嗗師鏉ョ殑"璇疯緭鍏ョ敤鎴峰悕"鎻愮ず鏀逛负"璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"鍗冲彲銆�
+
+### Q2: 鎵嬫満鍙峰繀椤诲敮涓�鍚楋紵
+
+**A**: 寤鸿鍞竴銆傝櫧鐒剁郴缁熷彲浠ュ伐浣滐紝浣嗕负浜嗛伩鍏嶇櫥褰曞啿绐侊紝寮虹儓寤鸿娣诲姞鍞竴绱㈠紩銆�
+
+### Q3: 濡備綍纭繚鎵嬫満鍙峰畨鍏紵
+
+**A**:
+- 鏁版嵁浼犺緭浣跨敤HTTPS鍔犲瘑
+- 瀵嗙爜浣跨敤BCrypt鍔犲瘑瀛樺偍
+- 瀹炴柦鐧诲綍澶辫触闄愬埗绛栫暐
+- 娣诲姞楠岃瘉鐮侀槻姝㈡毚鍔涚牬瑙�
+
+### Q4: 鏀寔鍥介檯鎵嬫満鍙峰悧锛�
+
+**A**: 褰撳墠浠呮敮鎸佷腑鍥藉ぇ闄�11浣嶆墜鏈哄彿銆傚闇�鏀寔鍥介檯鍙风爜锛岄渶淇敼姝e垯琛ㄨ揪寮忥細
+```java
+// 鏀寔鍥介檯鎵嬫満鍙凤紙绀轰緥锛�
+if (username.matches("^\\+?[1-9]\\d{1,14}$"))
+```
+
+## 鎬荤粨
+
+绯荤粺宸插畬鏁村疄鐜�**鐢ㄦ埛鍚�+瀵嗙爜**鍜�**鎵嬫満鍙�+瀵嗙爜**涓ょ鐧诲綍鏂瑰紡锛岄�氳繃鏅鸿兘璇嗗埆鏈哄埗鑷姩閫夋嫨楠岃瘉鏂瑰紡锛屾棤闇�鍓嶇棰濆閰嶇疆锛屽畬鍏ㄥ悜鍚庡吋瀹癸紝鐢ㄦ埛浣撻獙浼樼銆�
+
+**鏍稿績鐗规��**锛�
+- 鉁� 鑷姩璇嗗埆鐧诲綍鏂瑰紡
+- 鉁� 鏃犻渶淇敼鍓嶇浠g爜
+- 鉁� 瀹屽叏鍚戝悗鍏煎
+- 鉁� 瀹夊叏鎬ф湁淇濋殰
+- 鉁� 鏃ュ織璁板綍瀹屽杽
+
+---
+
+**鏂囨。鐗堟湰**: v1.0
+**鍒涘缓鏃堕棿**: 2025-10-26
+**浣滆��**: AI Assistant
+**鐘舵��**: 鉁� 鍔熻兘宸插疄鐜板苟杩愯姝e父
diff --git "a/prd/\347\224\250\346\210\267\345\210\227\350\241\250\346\230\276\347\244\272\344\274\230\345\214\226\350\257\264\346\230\216.md" "b/prd/\347\224\250\346\210\267\345\210\227\350\241\250\346\230\276\347\244\272\344\274\230\345\214\226\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..0954794
--- /dev/null
+++ "b/prd/\347\224\250\346\210\267\345\210\227\350\241\250\346\230\276\347\244\272\344\274\230\345\214\226\350\257\264\346\230\216.md"
@@ -0,0 +1,296 @@
+# 鐢ㄦ埛鍒楄〃鏄剧ず浼樺寲璇存槑
+
+## 闇�姹傝儗鏅�
+
+鐢ㄦ埛瑕佹眰锛�
+1. **鐢ㄦ埛鍒楄〃涓璒A鐢ㄦ埛ID涓嶈鏄剧ず** - 璇ュ瓧娈靛彧鍦ㄤ慨鏀圭敤鎴锋椂鏄剧ず
+2. **鐢ㄦ埛鍚嶈鏄剧ず瀹屾暣** - 纭繚鐢ㄦ埛鍚嶄笉浼氳鎴柇
+
+## 淇敼鍐呭
+
+### 鏂囦欢锛歚ruoyi-ui/src/views/system/user/index.vue`
+
+#### 1. 闅愯棌OA鐢ㄦ埛ID鍒�
+
+**淇敼鍓�**锛�
+```vue
+<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="50" align="center" />
+ <el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+
+ <!-- 鉂� 鏄剧ずOA鐢ㄦ埛ID鍒� -->
+ <el-table-column label="OA鐢ㄦ埛ID" align="center" key="oaUserId" prop="oaUserId" v-if="columns[1].visible" width="120">
+ <template slot-scope="scope">
+ <span v-if="scope.row.oaUserId">{{ scope.row.oaUserId }}</span>
+ <span v-else style="color: #909399;">-</span>
+ </template>
+ </el-table-column>
+
+ <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+</el-table>
+```
+
+**淇敼鍚�**锛�
+```vue
+<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="50" align="center" />
+ <el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+
+ <!-- 鉁� OA鐢ㄦ埛ID鍒楀凡闅愯棌锛屽彧鍦ㄧ紪杈戣〃鍗曚腑鏄剧ず -->
+
+ <!-- 鉁� 鐢ㄦ埛鍚嶇О澧炲姞瀹藉害锛岀‘淇濆畬鏁存樉绀� -->
+ <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[2].visible" width="150" />
+</el-table>
+```
+
+#### 2. 璁剧疆OA鐢ㄦ埛ID鍒楅粯璁ら殣钘�
+
+**淇敼鍓�**锛�
+```javascript
+// 鍒椾俊鎭�
+columns: [
+ { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+ { key: 1, label: `OA鐢ㄦ埛ID`, visible: true }, // 鉂� 榛樿鏄剧ず
+ { key: 2, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+ // ...
+]
+```
+
+**淇敼鍚�**锛�
+```javascript
+// 鍒椾俊鎭紙OA鐢ㄦ埛ID鍒楅粯璁ら殣钘忥級
+columns: [
+ { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+ { key: 1, label: `OA鐢ㄦ埛ID`, visible: false }, // 鉁� 榛樿闅愯棌
+ { key: 2, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+ // ...
+]
+```
+
+#### 3. 浼樺寲鐢ㄦ埛鍚嶆樉绀�
+
+**鍏抽敭鏀瑰姩**锛�
+- 绉婚櫎 `:show-overflow-tooltip="true"` 灞炴��
+- 娣诲姞鍥哄畾瀹藉害 `width="150"`
+- 纭繚鐢ㄦ埛鍚嶅畬鏁存樉绀猴紝涓嶈鐪佺暐
+
+**瀵规瘮**锛�
+```vue
+<!-- 淇敼鍓嶏細鐢ㄦ埛鍚嶅彲鑳借鎴柇 -->
+<el-table-column label="鐢ㄦ埛鍚嶇О" :show-overflow-tooltip="true" />
+
+<!-- 淇敼鍚庯細鐢ㄦ埛鍚嶅畬鏁存樉绀� -->
+<el-table-column label="鐢ㄦ埛鍚嶇О" width="150" />
+```
+
+## 鐣岄潰鏁堟灉瀵规瘮
+
+### 淇敼鍓�
+
+| 閫夋嫨 | 鐢ㄦ埛缂栧彿 | OA鐢ㄦ埛ID | 鐢ㄦ埛鍚嶇О | 鐢ㄦ埛鏄电О | 閮ㄩ棬 | 鎵嬫満鍙风爜 | 鐘舵�� | 鍒涘缓鏃堕棿 | 鎿嶄綔 |
+|------|---------|----------|---------|---------|------|---------|------|---------|------|
+| 鈽戯笍 | 100 | 12345 | admin | 绠$悊鍛� | 鎬诲叕鍙� | 138... | 姝e父 | 2024-01-01 | 淇敼 鍒犻櫎 |
+| 鈽� | 101 | 67890 | zhangsan | 寮犱笁 | 甯傚満閮� | 139... | 姝e父 | 2024-01-02 | 淇敼 鍒犻櫎 |
+
+**闂**锛�
+- 鉂� OA鐢ㄦ埛ID鍒楀崰鐢ㄧ┖闂�
+- 鈿狅笍 鐢ㄦ埛鍚嶅彲鑳借鎴柇鏄剧ず涓� "admin..."
+
+### 淇敼鍚�
+
+| 閫夋嫨 | 鐢ㄦ埛缂栧彿 | 鐢ㄦ埛鍚嶇О | 鐢ㄦ埛鏄电О | 閮ㄩ棬 | 鎵嬫満鍙风爜 | 鐘舵�� | 鍒涘缓鏃堕棿 | 鎿嶄綔 |
+|------|---------|---------|---------|------|---------|------|---------|------|
+| 鈽戯笍 | 100 | admin | 绠$悊鍛� | 鎬诲叕鍙� | 138... | 姝e父 | 2024-01-01 | 淇敼 鍒犻櫎 |
+| 鈽� | 101 | zhangsan | 寮犱笁 | 甯傚満閮� | 139... | 姝e父 | 2024-01-02 | 淇敼 鍒犻櫎 |
+
+**鏀硅繘**锛�
+- 鉁� OA鐢ㄦ埛ID鍒楀凡闅愯棌
+- 鉁� 鐢ㄦ埛鍚嶅畬鏁存樉绀猴紙150px瀹藉害锛�
+- 鉁� 鍒楄〃鏇寸畝娲佹竻鏅�
+
+## OA鐢ㄦ埛ID鍦ㄧ紪杈戣〃鍗曚腑淇濈暀
+
+铏界劧鍒楄〃涓殣钘忎簡OA鐢ㄦ埛ID锛屼絾鍦�**淇敼鐢ㄦ埛瀵硅瘽妗�**涓粛鐒朵繚鐣欒瀛楁锛�
+
+```vue
+<!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
+<el-dialog :title="title" :visible.sync="open" width="600px">
+ <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+ <!-- ... 鍏朵粬瀛楁 ... -->
+
+ <el-row>
+ <el-col :span="12">
+ <!-- 鉁� 缂栬緫琛ㄥ崟涓繚鐣橭A鐢ㄦ埛ID瀛楁 -->
+ <el-form-item label="OA鐢ㄦ埛ID" prop="oaUserId">
+ <el-input v-model="form.oaUserId" placeholder="OA绯荤粺鐨勭敤鎴稩D" type="number" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <!-- ... 鍏朵粬瀛楁 ... -->
+ </el-form>
+</el-dialog>
+```
+
+**浣跨敤鍦烘櫙**锛�
+- 鉁� 鏂板鐢ㄦ埛鏃跺彲浠ヨ緭鍏A鐢ㄦ埛ID
+- 鉁� 淇敼鐢ㄦ埛鏃跺彲浠ユ煡鐪嬪拰淇敼OA鐢ㄦ埛ID
+- 鉁� 瀵煎叆瀵煎嚭鍔熻兘浠嶇劧鍖呭惈OA鐢ㄦ埛ID鏁版嵁
+
+## 鍒楁樉绀烘帶鍒跺姛鑳�
+
+鐢ㄦ埛鍙互閫氳繃**鍒楄缃�**鍔熻兘閲嶆柊鏄剧ずOA鐢ㄦ埛ID鍒楋細
+
+```vue
+<!-- 鍙充晶宸ュ叿鏍忎腑鐨勫垪璁剧疆鎸夐挳 -->
+<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+```
+
+**鎿嶄綔姝ラ**锛�
+1. 鐐瑰嚮琛ㄦ牸鍙充笂瑙掔殑鍒楄缃浘鏍�
+2. 鍦ㄥ脊鍑虹殑鍒楄〃涓嬀閫�"OA鐢ㄦ埛ID"
+3. OA鐢ㄦ埛ID鍒椾細閲嶆柊鏄剧ず鍦ㄥ垪琛ㄤ腑
+
+**榛樿閰嶇疆**锛�
+- OA鐢ㄦ埛ID锛氣潓 榛樿涓嶆樉绀�
+- 鍏朵粬鍒楋細鉁� 榛樿鍏ㄩ儴鏄剧ず
+
+## 浠g爜鍙樻洿缁熻
+
+| 鍙樻洿绫诲瀷 | 琛屾暟 | 璇存槑 |
+|---------|------|------|
+| 鍒犻櫎琛ㄦ牸鍒� | -6 琛� | 鍒犻櫎OA鐢ㄦ埛ID鍒楀畾涔� |
+| 淇敼鍒楅厤缃� | 1 琛� | 璁剧疆OA鐢ㄦ埛ID榛樿闅愯棌 |
+| 浼樺寲鐢ㄦ埛鍚嶅垪 | 1 琛� | 澧炲姞瀹藉害锛岀Щ闄ooltip |
+| **鎬昏** | **-4 琛�** | 浠g爜鏇寸畝娲� |
+
+## 淇敼褰卞搷鑼冨洿
+
+### 鉁� 涓嶅彈褰卞搷鐨勫姛鑳�
+
+1. **鏁版嵁瀛樺偍**
+ - OA鐢ㄦ埛ID瀛楁浠嶇劧淇濆瓨鍦ㄦ暟鎹簱涓�
+ - 鏁版嵁瀹屾暣鎬т笉鍙楀奖鍝�
+
+2. **缂栬緫鍔熻兘**
+ - 鏂板鐢ㄦ埛锛氬彲浠ヨ緭鍏A鐢ㄦ埛ID
+ - 淇敼鐢ㄦ埛锛氬彲浠ユ煡鐪嬪拰淇敼OA鐢ㄦ埛ID
+ - 缂栬緫琛ㄥ崟涓瀛楁瀹屽叏姝e父
+
+3. **瀵煎叆瀵煎嚭**
+ - 瀵煎叆锛氭敮鎸佸鍏A鐢ㄦ埛ID鏁版嵁
+ - 瀵煎嚭锛氬鍑烘枃浠跺寘鍚玂A鐢ㄦ埛ID
+ - 瀵煎叆妯℃澘锛氬寘鍚玂A鐢ㄦ埛ID瀛楁
+
+4. **API鎺ュ彛**
+ - 鏌ヨ鎺ュ彛锛氳繑鍥炴暟鎹寘鍚玱aUserId
+ - 鏂板/淇敼鎺ュ彛锛氭帴鏀秓aUserId鍙傛暟
+ - 鍚庣閫昏緫鏃犻渶淇敼
+
+### 鈿狅笍 鍙楀奖鍝嶇殑閮ㄥ垎
+
+1. **鍒楄〃鏄剧ず**
+ - OA鐢ㄦ埛ID榛樿涓嶅湪鍒楄〃涓樉绀�
+ - 鍙�氳繃鍒楄缃噸鏂版樉绀�
+
+2. **鐢ㄦ埛鍚嶆樉绀�**
+ - 浠庣渷鐣ユ樉绀烘敼涓哄畬鏁存樉绀�
+ - 鍗犵敤鍥哄畾150px瀹藉害
+
+## 琛ㄦ牸鍒楀搴﹂厤缃�
+
+淇敼鍚庣殑鍒楀搴﹀垎閰嶏細
+
+| 鍒楀悕 | 瀹藉害 | 璇存槑 |
+|------|------|------|
+| 閫夋嫨妗� | 50px | 鍥哄畾瀹藉害 |
+| 鐢ㄦ埛缂栧彿 | 鑷�傚簲 | - |
+| **鐢ㄦ埛鍚嶇О** | **150px** | 鉁� 鍥哄畾瀹藉害锛岀‘淇濆畬鏁存樉绀� |
+| 鐢ㄦ埛鏄电О | 鑷�傚簲 | tooltip鏄剧ず |
+| 閮ㄩ棬 | 鑷�傚簲 | tooltip鏄剧ず |
+| 鎵嬫満鍙风爜 | 120px | 鍥哄畾瀹藉害 |
+| 鐘舵�� | 鑷�傚簲 | 寮�鍏崇粍浠� |
+| 鍒涘缓鏃堕棿 | 160px | 鍥哄畾瀹藉害 |
+| 鎿嶄綔 | 160px | 鍥哄畾瀹藉害 |
+
+## 鐢ㄦ埛鍚嶇О瀹屾暣鏄剧ず鐨勪紭鍔�
+
+### 1. 鍙鎬ф洿濂�
+```
+鉂� 淇敼鍓嶏細adminuser123... 锛堣鎴柇锛�
+鉁� 淇敼鍚庯細adminuser123456 锛堝畬鏁存樉绀猴級
+```
+
+### 2. 渚夸簬璇嗗埆
+- 鐢ㄦ埛鍚嶆槸鐢ㄦ埛鐨勫敮涓�鏍囪瘑
+- 瀹屾暣鏄剧ず鏈夊姪浜庡揩閫熻瘑鍒拰鍖哄垎鐢ㄦ埛
+
+### 3. 鍑忓皯鎿嶄綔
+- 涓嶉渶瑕侀紶鏍囨偓鍋滄煡鐪媡ooltip
+- 鎻愰珮鎿嶄綔鏁堢巼
+
+## 娴嬭瘯妫�鏌ユ竻鍗�
+
+- [ ] 鐢ㄦ埛鍒楄〃榛樿涓嶆樉绀篛A鐢ㄦ埛ID鍒�
+- [ ] 鐢ㄦ埛鍚嶇О瀹屾暣鏄剧ず锛屼笉琚埅鏂�
+- [ ] 鏂板鐢ㄦ埛瀵硅瘽妗嗕腑鏄剧ずOA鐢ㄦ埛ID杈撳叆妗�
+- [ ] 淇敼鐢ㄦ埛瀵硅瘽妗嗕腑鏄剧ずOA鐢ㄦ埛ID杈撳叆妗�
+- [ ] 鍙互閫氳繃鍒楄缃噸鏂版樉绀篛A鐢ㄦ埛ID鍒�
+- [ ] 瀵煎叆瀵煎嚭鍔熻兘姝e父锛屽寘鍚玂A鐢ㄦ埛ID
+- [ ] 琛ㄦ牸甯冨眬姝e父锛屾棤閿欎綅鐜拌薄
+- [ ] 鍏朵粬鍒楁樉绀烘甯�
+
+## 鍚庣画浼樺寲寤鸿
+
+### 1. 鍝嶅簲寮忓垪瀹�
+```javascript
+// 鏍规嵁灞忓箷瀹藉害鍔ㄦ�佽皟鏁�
+computed: {
+ userNameWidth() {
+ return this.$store.getters.device === 'mobile' ? '100' : '150'
+ }
+}
+```
+
+### 2. 鐢ㄦ埛鍚嶆牸寮忛獙璇�
+```javascript
+// 纭繚鐢ㄦ埛鍚嶄笉浼氳繃闀�
+rules: {
+ userName: [
+ { max: 20, message: '鐢ㄦ埛鍚嶇О闀垮害涓嶈兘瓒呰繃20涓瓧绗�', trigger: 'blur' }
+ ]
+}
+```
+
+### 3. 鍒楀搴﹁蹇�
+```javascript
+// 淇濆瓨鐢ㄦ埛鑷畾涔夌殑鍒楀搴﹁缃�
+saveColumnWidth(column, width) {
+ localStorage.setItem(`column_${column.key}_width`, width)
+}
+```
+
+## 鐩稿叧鏂囦欢
+
+- **鐢ㄦ埛鍒楄〃**: `ruoyi-ui/src/views/system/user/index.vue`
+- **鐢ㄦ埛API**: `ruoyi-ui/src/api/system/user.js`
+- **鐢ㄦ埛瀹炰綋**: `ruoyi-system/.../domain/SysUser.java`
+
+## 鍏煎鎬ц鏄�
+
+### 娴忚鍣ㄥ吋瀹规��
+- 鉁� Chrome 60+
+- 鉁� Firefox 55+
+- 鉁� Safari 11+
+- 鉁� Edge 79+
+
+### Element UI鐗堟湰
+- 浣跨敤 Element UI 2.x 鏍囧噯API
+- 鏃犵壒娈婂吋瀹规�ч棶棰�
+
+---
+
+**浼樺寲鏃堕棿**: 2025-10-26
+**浼樺寲浜�**: AI Assistant
+**褰卞搷鑼冨洿**: 鐢ㄦ埛绠$悊鍒楄〃椤甸潰
+**鐘舵��**: 鉁� 宸插畬鎴�
diff --git "a/prd/\347\247\273\351\231\244\345\276\256\344\277\241\347\231\273\345\275\225\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/prd/\347\247\273\351\231\244\345\276\256\344\277\241\347\231\273\345\275\225\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..e78fbf8
--- /dev/null
+++ "b/prd/\347\247\273\351\231\244\345\276\256\344\277\241\347\231\273\345\275\225\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,297 @@
+# 绉婚櫎寰俊鐧诲綍鍔熻兘璇存槑
+
+## 闇�姹傝儗鏅�
+
+鐢ㄦ埛瑕佹眰锛氬彇娑坅pp鐧诲綍鐣岄潰鐨勫井淇$櫥褰曟寜閽��
+
+## 淇敼鍐呭
+
+### 鏂囦欢锛歚app/pages/login.vue`
+
+#### 1. 鍒犻櫎妯℃澘涓殑寰俊鐧诲綍鎸夐挳
+
+**鍒犻櫎鍓�**锛�
+```vue
+<view class="action-btn">
+ <button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">鐧诲綍</button>
+</view>
+
+<!-- 鉂� 鍒犻櫎姝ら儴鍒� -->
+<view class="wechat-login" @click="handleWechatLogin">
+ <view class="wechat-btn">
+ <image class="wechat-icon" src="/static/icons/profile.png"></image>
+ <text class="wechat-text">寰俊涓�閿櫥褰�</text>
+ </view>
+</view>
+
+<view class="xieyi text-center">
+```
+
+**鍒犻櫎鍚�**锛�
+```vue
+<view class="action-btn">
+ <button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">鐧诲綍</button>
+</view>
+
+<!-- 鉁� 鐩存帴鏄剧ず鐢ㄦ埛鍗忚 -->
+<view class="xieyi text-center">
+```
+
+#### 2. 鍒犻櫎寰俊鐧诲綍鏂规硶
+
+**鍒犻櫎鐨勬柟娉�**锛�
+```javascript
+// 鉂� 鍒犻櫎姝ゆ柟娉�
+async handleWechatLogin() {
+ // #ifdef MP-WEIXIN
+ // 寰俊灏忕▼搴忕櫥褰�
+ uni.login({
+ provider: 'weixin',
+ success: (loginRes) => {
+ console.log('寰俊鐧诲綍鎴愬姛', loginRes);
+ // 鑾峰彇鐢ㄦ埛淇℃伅
+ uni.getUserInfo({
+ provider: 'weixin',
+ success: (infoRes) => {
+ console.log('鐢ㄦ埛淇℃伅鑾峰彇鎴愬姛', infoRes);
+ // 璺宠浆鍒板井淇$櫥褰曠‘璁ら〉闈�
+ this.$tab.navigateTo(`/pages/login/wechat?userInfo=${encodeURIComponent(JSON.stringify(infoRes.userInfo))}`);
+ },
+ fail: (error) => {
+ console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触', error);
+ this.$modal.msgError("鑾峰彇寰俊鐢ㄦ埛淇℃伅澶辫触");
+ }
+ });
+ },
+ fail: (error) => {
+ console.error('寰俊鐧诲綍澶辫触', error);
+ this.$modal.msgError("寰俊鐧诲綍澶辫触");
+ }
+ });
+ // #endif
+
+ // #ifndef MP-WEIXIN
+ // H5鎴栧叾浠栧钩鍙版彁绀�
+ this.$modal.msgError("璇峰湪寰俊瀹㈡埛绔腑浣跨敤寰俊鐧诲綍鍔熻兘");
+ // #endif
+},
+```
+
+#### 3. 鍒犻櫎寰俊鐧诲綍鎸夐挳鏍峰紡
+
+**鍒犻櫎鐨勬牱寮�**锛�
+```scss
+// 鉂� 鍒犻櫎姝ゆ牱寮�
+.wechat-login {
+ margin: 20rpx 0;
+
+ .wechat-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #07c160;
+ height: 90rpx;
+ border-radius: 20px;
+
+ .wechat-icon {
+ width: 40rpx;
+ height: 40rpx;
+ margin-right: 10rpx;
+ }
+
+ .wechat-text {
+ color: white;
+ font-size: 32rpx;
+ }
+ }
+}
+```
+
+## 鐣岄潰鏁堟灉瀵规瘮
+
+### 淇敼鍓�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� [Logo] 姘戣埅璋冨害绯荤粺 鈹�
+鈹� 鈹�
+鈹� [鐢ㄦ埛鍥炬爣] 璇疯緭鍏ヨ处鍙� 鈹�
+鈹� [瀵嗙爜鍥炬爣] 璇疯緭鍏ュ瘑鐮� 鈹�
+鈹� [楠岃瘉鐮乚 [鍥剧墖楠岃瘉鐮乚 鈹�
+鈹� 鈹�
+鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹� 鐧诲綍 鈹� 鈹�
+鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹� 鈫� 鉂� 鍒犻櫎寰俊鐧诲綍鎸夐挳
+鈹� 鈹� 寰俊涓�閿櫥褰曗攤 鈹�
+鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹�
+鈹� 鐧诲綍鍗充唬琛ㄥ悓鎰忋�婄敤鎴峰崗璁�嬧攤
+鈹� 鍜屻�婇殣绉佸崗璁�� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 淇敼鍚�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� [Logo] 姘戣埅璋冨害绯荤粺 鈹�
+鈹� 鈹�
+鈹� [鐢ㄦ埛鍥炬爣] 璇疯緭鍏ヨ处鍙� 鈹�
+鈹� [瀵嗙爜鍥炬爣] 璇疯緭鍏ュ瘑鐮� 鈹�
+鈹� [楠岃瘉鐮乚 [鍥剧墖楠岃瘉鐮乚 鈹�
+鈹� 鈹�
+鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹� 鐧诲綍 鈹� 鈹�
+鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹� 鈹� 鈫� 鉁� 鏇寸畝娲�
+鈹� 鈹�
+鈹� 鐧诲綍鍗充唬琛ㄥ悓鎰忋�婄敤鎴峰崗璁�嬧攤
+鈹� 鍜屻�婇殣绉佸崗璁�� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+## 浠g爜鍙樻洿缁熻
+
+| 鍙樻洿绫诲瀷 | 琛屾暟 |
+|---------|------|
+| 鍒犻櫎妯℃澘浠g爜 | -6 琛� |
+| 鍒犻櫎JS鏂规硶 | -37 琛� |
+| 鍒犻櫎鏍峰紡浠g爜 | -21 琛� |
+| **鎬昏** | **-64 琛�** |
+
+## 淇敼褰卞搷
+
+### 鉁� 姝i潰褰卞搷
+
+1. **鐣岄潰鏇寸畝娲�**
+ - 绉婚櫎浜嗙豢鑹茬殑寰俊鐧诲綍鎸夐挳
+ - 椤甸潰瑙嗚鏇寸粺涓�
+
+2. **鍑忓皯浠g爜澶嶆潅搴�**
+ - 鍒犻櫎浜嗗井淇$櫥褰曠浉鍏抽�昏緫
+ - 鍑忓皯浜嗗钩鍙板吋瀹规�у鐞嗕唬鐮�
+
+3. **缁熶竴鐧诲綍鏂瑰紡**
+ - 鍙繚鐣欒处鍙峰瘑鐮佺櫥褰�
+ - 渚夸簬缁熶竴绠$悊鍜岀淮鎶�
+
+### 鈿狅笍 娉ㄦ剰浜嬮」
+
+1. **鐢ㄦ埛鐧诲綍鏂瑰紡**
+ - 鐜板湪鍙兘浣跨敤璐﹀彿瀵嗙爜鐧诲綍
+ - 闇�瑕佺‘淇濇墍鏈夌敤鎴烽兘鏈夎处鍙�
+
+2. **绉诲姩绔綋楠�**
+ - 璐﹀彿瀵嗙爜杈撳叆鐩稿绻佺悙
+ - 寤鸿澧炲己"璁颁綇瀵嗙爜"鍔熻兘
+
+## 淇濈暀鐨勭櫥褰曞姛鑳�
+
+### 璐﹀彿瀵嗙爜鐧诲綍
+
+**鍔熻兘缁勪欢**锛�
+- 鉁� 鐢ㄦ埛鍚嶈緭鍏ユ
+- 鉁� 瀵嗙爜杈撳叆妗�
+- 鉁� 鍥惧舰楠岃瘉鐮侊紙鍙厤缃級
+- 鉁� 鐧诲綍鎸夐挳
+
+**瀹夊叏鎺柦**锛�
+- 鉁� 鍥惧舰楠岃瘉鐮侀槻鏆村姏鐮磋В
+- 鉁� 瀵嗙爜鍔犲瘑浼犺緭
+- 鉁� Token璁よ瘉鏈哄埗
+
+**鐢ㄦ埛浣撻獙**锛�
+- 鉁� 鐢ㄦ埛鍗忚鍜岄殣绉佸崗璁摼鎺�
+- 鉁� 閿欒鎻愮ず
+- 鉁� 鍔犺浇鐘舵�佹樉绀�
+
+## 鐧诲綍娴佺▼
+
+```
+鐢ㄦ埛鎵撳紑鐧诲綍椤甸潰
+ 鈫�
+杈撳叆璐﹀彿銆佸瘑鐮併�侀獙璇佺爜
+ 鈫�
+鐐瑰嚮"鐧诲綍"鎸夐挳
+ 鈫�
+楠岃瘉琛ㄥ崟杈撳叆
+ 鈫�
+璋冪敤瀵嗙爜鐧诲綍鎺ュ彛
+ 鈫�
+鑾峰彇Token骞跺瓨鍌�
+ 鈫�
+鑾峰彇鐢ㄦ埛淇℃伅
+ 鈫�
+璺宠浆鍒伴椤�
+```
+
+## 鐩稿叧鏂囦欢
+
+- **鐧诲綍椤甸潰**: `app/pages/login.vue`
+- **鐧诲綍API**: `app/api/login.js`
+- **鐢ㄦ埛Store**: `app/store/modules/user.js`
+
+## 鍚庣画浼樺寲寤鸿
+
+1. **澧炲己瀵嗙爜鐧诲綍浣撻獙**
+ ```javascript
+ // 寤鸿娣诲姞璁颁綇瀵嗙爜鍔熻兘
+ data() {
+ return {
+ rememberPassword: true, // 璁颁綇瀵嗙爜閫夐」
+ savedUsername: '',
+ savedPassword: ''
+ }
+ }
+ ```
+
+2. **娣诲姞蹇嵎鐧诲綍閫夐」**
+ - 鍙�冭檻娣诲姞鎵嬫満鍙�+楠岃瘉鐮佺櫥褰�
+ - 鏀寔鎸囩汗/闈㈠璇嗗埆锛堢Щ鍔ㄧ锛�
+
+3. **浼樺寲琛ㄥ崟楠岃瘉**
+ ```javascript
+ // 瀹炴椂楠岃瘉杈撳叆
+ validateUsername() {
+ if (!/^[a-zA-Z0-9_]{4,16}$/.test(this.loginForm.username)) {
+ this.$modal.msgError('鐢ㄦ埛鍚嶆牸寮忎笉姝g‘')
+ return false
+ }
+ return true
+ }
+ ```
+
+## 娴嬭瘯妫�鏌ユ竻鍗�
+
+- [ ] 璐﹀彿瀵嗙爜鐧诲綍鍔熻兘姝e父
+- [ ] 楠岃瘉鐮佹樉绀哄拰鍒锋柊姝e父
+- [ ] 鐧诲綍鎴愬姛璺宠浆鍒伴椤�
+- [ ] 鐧诲綍澶辫触鏄剧ず閿欒鎻愮ず
+- [ ] 鐢ㄦ埛鍗忚鍜岄殣绉佸崗璁摼鎺ュ彲鐐瑰嚮
+- [ ] 寰俊鐧诲綍鎸夐挳宸插畬鍏ㄧЩ闄�
+- [ ] 鐣岄潰甯冨眬鏃犲紓甯�
+- [ ] 鏍峰紡鏄剧ず姝e父
+
+## 閮ㄧ讲璇存槑
+
+### H5鐗堟湰
+```bash
+npm run build:h5
+```
+
+### 寰俊灏忕▼搴忕増鏈�
+```bash
+npm run build:mp-weixin
+```
+
+### 娉ㄦ剰浜嬮」
+- 娓呯悊娴忚鍣�/灏忕▼搴忕紦瀛樺悗娴嬭瘯
+- 纭寰俊鐧诲綍椤甸潰璺敱鏄惁闇�瑕佹竻鐞嗭紙`/pages/login/wechat`锛�
+
+---
+
+**淇敼鏃堕棿**: 2025-10-26
+**淇敼浜�**: AI Assistant
+**褰卞搷鑼冨洿**: 鐧诲綍椤甸潰
+**鐘舵��**: 鉁� 宸插畬鎴�
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 779cce8..09b5b22 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -88,4 +88,33 @@
min:
apiUrl: https://api.966120.com.cn/v1/ #娴嬭瘯鐜锛歭ocalhost:8011
qrcode:
- defaultUrl: https://gzgj.966120.com.cn/evaluation?vehicle={vehicleNo}
\ No newline at end of file
+ defaultUrl: https://gzgj.966120.com.cn/evaluation?vehicle={vehicleNo}
+wechat:
+ appId: wx70f6a7346ee842c0
+ appSecret: 2d6c59de85e876b7eadebeba62e5417a
+# 鑵捐鍦板浘閰嶇疆
+tencent:
+ map:
+ key: 6YVBZ-ZJDLQ-JMY5F-BR7XG-H3TAV-C3FXC
+# 鏃х郴缁熼厤缃�
+legacy:
+ system:
+ # 鏃х郴缁熷熀纭�URL (蹇呴』閰嶇疆)
+ # 绀轰緥: http://192.168.1.100:8080 鎴� http://legacy.yourdomain.com
+ base-url: https://sys.966120.com.cn
+
+ # 鎬ユ晳杞繍鍒涘缓鎺ュ彛璺緞 (鍙�夛紝榛樿鍊煎涓�)
+ emergency-create-path: /admin_save_19.gds
+
+ # HTTP杩炴帴瓒呮椂鏃堕棿(姣) (鍙�夛紝榛樿30绉�)
+ connect-timeout: 30000
+
+ # HTTP璇诲彇瓒呮椂鏃堕棿(姣) (鍙�夛紝榛樿30绉�)
+ read-timeout: 30000
+
+ # 鏄惁鍚敤鍚屾鍔熻兘 (鍙�夛紝榛樿true)
+ # true: 鍚敤鍚屾 false: 绂佺敤鍚屾
+ enabled: true
+
+ # 瀛楃缂栫爜 (鍙�夛紝榛樿UTF-8)
+ charset: UTF-8
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 8efcff2..083ca5a 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -150,11 +150,7 @@
appId: wx70f6a7346ee842c0
appSecret: 2d6c59de85e876b7eadebeba62e5417a
redirectUri: http://yourdomain.com/evaluation
- # 寮�鍙戠幆澧冮厤缃�
- dev:
- enabled: true # 鏄惁鍚敤寮�鍙戞ā寮�
- mockUserInfo: true # 鏄惁妯℃嫙鐢ㄦ埛淇℃伅
- ngrokUrl: http://your-ngrok-url.ngrok.io # 鍐呯綉绌块�忓湴鍧�
+
# 鑵捐鍦板浘閰嶇疆
tencent:
map:
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index 6f7e525..0f06903 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -44,6 +44,13 @@
public SysUser selectUserByUserName(String userName);
/**
+ * 閫氳繃鎵嬫満鍙风爜鏌ヨ鐢ㄦ埛
+ * @param phonenumber
+ * @return
+ */
+ public SysUser selectUserByPhonenumber(String phonenumber);
+
+ /**
* 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛
*
* @param userId 鐢ㄦ埛ID
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 2687fab..5add3ac 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -125,7 +125,7 @@
@Override
public SysUser selectUserByPhonenumber(String phonenumber)
{
- return userMapper.checkPhoneUnique(phonenumber);
+ return userMapper.selectUserByPhonenumber(phonenumber);
}
/**
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index b2b0c02..aabf8a1 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -48,7 +48,7 @@
</resultMap>
<sql id="selectUserVo">
- select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.oa_user_id, u.create_by, u.create_time, u.remark,
+ select u.user_id, u.dept_id, u.user_name,u.oa_user_id, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.oa_user_id, u.create_by, u.create_time, u.remark,
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
from sys_user u
@@ -162,7 +162,11 @@
<include refid="selectUserVo"/>
where u.user_name = #{userName} and u.del_flag = '0'
</select>
-
+ <select id="selectUserByPhonenumber" parameterType="String" resultMap="SysUserResult">
+ <include refid="selectUserVo"/>
+ where u.phonenumber = #{phonenumber} and u.del_flag = '0'
+ </select>
+
<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
<include refid="selectUserVo"/>
where u.user_id = #{userId}
diff --git a/ruoyi-ui/src/views/login.vue b/ruoyi-ui/src/views/login.vue
index ec59f2b..1ee92d1 100644
--- a/ruoyi-ui/src/views/login.vue
+++ b/ruoyi-ui/src/views/login.vue
@@ -7,7 +7,7 @@
v-model="loginForm.username"
type="text"
auto-complete="off"
- placeholder="璐﹀彿"
+ placeholder="璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿"
>
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
</el-input>
@@ -81,7 +81,7 @@
},
loginRules: {
username: [
- { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }
+ { required: true, trigger: "blur", message: "璇疯緭鍏ョ敤鎴峰悕鎴栨墜鏈哄彿" }
],
password: [
{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }
diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue
index 185ec36..2d09ee4 100644
--- a/ruoyi-ui/src/views/system/user/index.vue
+++ b/ruoyi-ui/src/views/system/user/index.vue
@@ -60,13 +60,8 @@
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
- <el-table-column label="OA鐢ㄦ埛ID" align="center" key="oaUserId" prop="oaUserId" v-if="columns[1].visible" width="120">
- <template slot-scope="scope">
- <span v-if="scope.row.oaUserId">{{ scope.row.oaUserId }}</span>
- <span v-else style="color: #909399;">-</span>
- </template>
- </el-table-column>
- <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+ <!-- OA鐢ㄦ埛ID鍒楀凡闅愯棌锛屽彧鍦ㄧ紪杈戣〃鍗曚腑鏄剧ず -->
+ <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[2].visible" width="150" />
<el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
<el-table-column label="閮ㄩ棬" align="center" key="deptName" prop="dept.deptName" v-if="columns[4].visible" :show-overflow-tooltip="true" />
<el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[5].visible" width="120" />
@@ -290,10 +285,10 @@
status: undefined,
deptId: undefined
},
- // 鍒椾俊鎭�
+ // 鍒椾俊鎭紙OA鐢ㄦ埛ID鍒楅粯璁ら殣钘忥級
columns: [
{ key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
- { key: 1, label: `OA鐢ㄦ埛ID`, visible: true },
+ { key: 1, label: `OA鐢ㄦ埛ID`, visible: false },
{ key: 2, label: `鐢ㄦ埛鍚嶇О`, visible: true },
{ key: 3, label: `鐢ㄦ埛鏄电О`, visible: true },
{ key: 4, label: `閮ㄩ棬`, visible: true },
diff --git a/sql/task_dict_data.sql b/sql/task_dict_data.sql
index 020257c..a2d0fbb 100644
--- a/sql/task_dict_data.sql
+++ b/sql/task_dict_data.sql
@@ -6,15 +6,17 @@
-- ----------------------------
INSERT INTO sys_dict_type(dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark)
VALUES('浠诲姟绫诲瀷', 'sys_task_type', '0', 'admin', SYSDATE(), '', NULL, '浠诲姟绫诲瀷鍒楄〃');
+INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark)
+VALUES(1, '杞繍浠诲姟', 'EMERGENCY_TRANSFER', 'sys_task_type', '', 'primary', 'N', '0', 'admin', SYSDATE(), '', NULL, '缁翠慨淇濆吇浠诲姟');
INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark)
-VALUES(1, '缁翠慨淇濆吇', 'MAINTENANCE', 'sys_task_type', '', 'primary', 'N', '0', 'admin', SYSDATE(), '', NULL, '缁翠慨淇濆吇浠诲姟');
+VALUES(2, '缁翠慨淇濆吇', 'MAINTENANCE', 'sys_task_type', '', 'primary', 'N', '0', 'admin', SYSDATE(), '', NULL, '缁翠慨淇濆吇浠诲姟');
INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark)
-VALUES(2, '鍔犳补浠诲姟', 'FUEL', 'sys_task_type', '', 'success', 'N', '0', 'admin', SYSDATE(), '', NULL, '鍔犳补浠诲姟');
+VALUES(3, '鍔犳补浠诲姟', 'FUEL', 'sys_task_type', '', 'success', 'N', '0', 'admin', SYSDATE(), '', NULL, '鍔犳补浠诲姟');
INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark)
-VALUES(3, '鍏朵粬', 'OTHER', 'sys_task_type', '', 'info', 'N', '0', 'admin', SYSDATE(), '', NULL, '鍏朵粬绫诲瀷浠诲姟');
+VALUES(4, '鍏朵粬', 'OTHER', 'sys_task_type', '', 'info', 'N', '0', 'admin', SYSDATE(), '', NULL, '鍏朵粬绫诲瀷浠诲姟');
-- 2. 浠诲姟鐘舵�佸瓧鍏�
-- ----------------------------
--
Gitblit v1.9.1