This commit is contained in:
2025-09-05 22:43:39 +08:00
parent 913c2ba036
commit dba965344a
9 changed files with 432 additions and 396 deletions
-163
View File
@@ -1,163 +0,0 @@
# Pages 目录优化报告
## 优化概览
本次优化对 `pages` 目录下的页面组件进行了全面的代码质量、性能和可维护性优化。
## 1. Auth 模块优化 ✅
### pages/auth/phone-auth.vue
**优化内容:**
- ✅ **错误处理优化**:提取了 `handleError` 方法,统一处理各种错误类型
- ✅ **代码结构优化**:简化了错误处理逻辑,减少重复代码
- ✅ **用户体验提升**:改进了错误提示信息的准确性和友好性
**优化前后对比:**
```javascript
// 优化前:重复的错误处理逻辑
} catch (error) {
// 30+ 行重复的错误处理代码
}
// 优化后:统一的错误处理方法
} catch (error) {
handleError(error)
}
```
## 2. Profile 模块优化 ✅
### pages/profile/profile.vue
**优化内容:**
- ✅ **数据结构优化**:清理了多余的空行,优化了响应式数据的组织
- ✅ **方法重构**:提取了 `resetStatsToDefault` 方法,避免重复的数据重置逻辑
- ✅ **导航优化**:改进了 `navigateTo` 方法,添加了更好的错误处理和自定义选项
- ✅ **代码清理**:移除了多余的空行和注释
**优化前后对比:**
```javascript
// 优化前:重复的数据重置
petStats.petCount = 0
petStats.recordCount = 0
// ... 更多重复代码
// 优化后:统一的重置方法
resetStatsToDefault()
```
### pages/profile/user-info.vue
**优化内容:**
- ✅ **选择器配置优化**:统一了选择器数据的管理
- ✅ **事件处理简化**:移除了不必要的 `@change` 事件处理器
- ✅ **代码清理**:删除了未使用的方法(`onNickNameChange`, `onBioChange`)
**优化前后对比:**
```javascript
// 优化前:不必要的事件处理
<u-input v-model="userInfo.nickName" @change="onNickNameChange" />
// 优化后:直接使用 v-model
<u-input v-model="userInfo.nickName" />
```
## 3. Pets 模块优化 ✅
### pages/pets/pets.vue
**优化内容:**
- ✅ **配置数据提取**:将硬编码的配置数据提取到文件顶部
- ✅ **方法重构**:创建了 `generateDefaultPets` 方法,分离了数据生成逻辑
- ✅ **代码组织**:优化了 `getPetEmoji` 方法,使用配置映射
**优化前后对比:**
```javascript
// 优化前:硬编码的表情映射
getPetEmoji(breed) {
const emojiMap = {
'橘猫': '🐱',
// ... 更多硬编码
}
return emojiMap[breed] || '🐾'
}
// 优化后:使用配置常量
getPetEmoji(breed) {
return PET_EMOJI_MAP[breed] || '🐾'
}
```
## 4. Adoption 模块优化 ✅
### pages/adoption/adoption.vue
**优化内容:**
- ✅ **数据结构优化**:重新组织了 data 中的属性,按功能分组
- ✅ **代码清理**:清理了多余的空行和注释
- ✅ **可读性提升**:改进了数据属性的分组和命名
## 5. 全局优化成果
### 代码质量提升
- ✅ **减少重复代码**:提取了公共方法和配置
- ✅ **统一错误处理**:建立了一致的错误处理模式
- ✅ **改进代码结构**:优化了方法组织和数据结构
### 性能优化
- ✅ **减少不必要的事件监听**:移除了冗余的 change 事件
- ✅ **优化数据初始化**:改进了默认数据的生成方式
- ✅ **提升渲染效率**:减少了不必要的响应式更新
### 可维护性提升
- ✅ **配置化管理**:将硬编码数据提取为配置常量
- ✅ **方法职责单一**:每个方法都有明确的职责
- ✅ **代码组织清晰**:按功能模块组织代码结构
## 6. 保留的功能特性
### 登录流程功能 ✅
- ✅ 保留了所有登录流程重构中新添加的功能
- ✅ 保持了页面间的数据传递和状态管理
- ✅ 确保了所有页面的路由配置正确
### 用户体验 ✅
- ✅ 维护了现有的用户体验和交互逻辑
- ✅ 保持了页面的响应式设计
- ✅ 确保了样式的一致性
## 7. 优化统计
### 文件修改统计
- **优化文件数量**: 5个主要文件
- **代码行数减少**: ~150行
- **方法提取**: 6个新的工具方法
- **配置常量**: 3个新的配置对象
### 质量指标改进
- 📊 **代码复用率**: 提升 25%
- 🚀 **错误处理一致性**: 提升 40%
- 🔧 **可维护性**: 提升 30%
- 📚 **代码可读性**: 提升 35%
## 8. 后续建议
### 进一步优化方向
1. **组件化重构**: 将重复的UI组件提取为公共组件
2. **状态管理**: 考虑引入 Pinia 进行全局状态管理
3. **类型安全**: 考虑引入 TypeScript 提升代码安全性
4. **性能监控**: 添加性能监控和错误上报机制
### 维护建议
1. **代码规范**: 建立统一的代码规范和 ESLint 配置
2. **文档完善**: 为复杂的业务逻辑添加详细注释
3. **测试覆盖**: 为关键功能添加单元测试
4. **持续优化**: 定期进行代码审查和重构
## 总结
本次优化成功提升了 pages 目录下代码的质量、性能和可维护性,同时保持了所有现有功能的完整性。新的代码结构更加清晰、易于维护,为后续开发提供了良好的基础。
优化重点关注了:
- 代码复用和模块化
- 错误处理的统一性
- 配置数据的管理
- 用户体验的保持
所有优化都经过了仔细的测试和验证,确保不会影响现有功能的正常运行。
+21 -24
View File
@@ -62,7 +62,7 @@
<script>
import { ref } from 'vue'
import { wxPhoneLogin } from '@/http/api/auth.js'
import { updatePhoneNumber } from '@/http/api/auth.js'
import {
savePhoneAuthData,
markPhoneSkipped,
@@ -173,47 +173,44 @@ export default {
console.log(phoneData)
console.log('准备调用手机号授权API:', {
hasCode: !!phoneData.code,
console.log('准备调用手机号更新API:', {
hasEncryptedData: !!phoneData.encryptedData,
hasIv: !!phoneData.iv,
apiUrl: '/auth/wx-phone-login'
apiUrl: '/user/wechat/mini/phone-update'
})
// 调用真实API接口
const result = await wxPhoneLogin(phoneData, {
// 调用手机号更新API(需要用户已登录)
const phoneNumber = await updatePhoneNumber({
encryptedData: phoneData.encryptedData,
iv: phoneData.iv
}, {
custom: {
loading: false, // 使用页面自己的loading状态
catch: true // 确保错误能被catch到
}
})
console.log('手机号授权API调用成功:', {
hasToken: !!(result && result.token),
hasUserInfo: !!(result && result.userInfo)
})
// 使用状态管理工具保存手机号授权数据
if (result && result.token) {
savePhoneAuthData(result)
} else {
throw new Error('API返回数据格式错误')
console.log('手机号更新成功:', phoneNumber)
// 更新本地用户信息
const userInfo = authStore.userInfo
if (userInfo) {
userInfo.phone = phoneNumber
authStore.setUserInfo(userInfo)
}
uni.showToast({
title: '授权成功',
title: '手机号更新成功',
icon: 'success'
})
// 跳转到个人信息设置页面
// 返回上一页
setTimeout(() => {
uni.navigateTo({
url: '/pages/profile/user-info?mode=setup'
})
uni.navigateBack()
}, 1500)
} catch (error) {
console.error('手机号授权失败:', error)
console.error('手机号更新失败:', error)
handleError(error)
} finally {
authorizing.value = false
+10 -68
View File
@@ -144,13 +144,6 @@
import { reactive, ref, onMounted, computed } from 'vue'
import { uploadImage } from '@/http/api/common.js'
import { updateUserInfo } from '@/http/api/profile.js'
import {
getCurrentLoginStep,
isLoginCompleted,
checkAndResumeLogin,
saveWxLoginData,
clearTempLoginData
} from '@/utils/loginState.js'
export default {
name: 'ProfilePage',
@@ -189,30 +182,16 @@ export default {
// 方法定义
const initPage = () => {
checkLogin()
loadUserInfo()
loadUserStats()
}
const checkLogin = () => {
// 检查登录状态(仅用于显示,不强制跳转)
console.log('Profile页面登录状态检查')
const currentStep = getCurrentLoginStep()
console.log('当前登录步骤:', currentStep)
// 不再自动跳转,让用户自主选择是否登录
// 登录状态会在调用需要鉴权的接口时自动处理
// 检查是否已完成登录
if (isLoginCompleted()) {
const savedUserInfo = uni.getStorageSync('userInfo')
if (savedUserInfo) {
userInfo.value = savedUserInfo
calculateLoginDays()
// 清理临时登录数据
clearTempLoginData()
}
const loadUserInfo = () => {
// 尝试从本地存储加载用户信息
const savedUserInfo = uni.getStorageSync('userInfo')
if (savedUserInfo) {
userInfo.value = savedUserInfo
calculateLoginDays()
}
}
@@ -289,46 +268,8 @@ export default {
}
const handleUserAction = () => {
if (userInfo.value.nickName) {
// 已登录,跳转到个人信息设置
navigateTo('/pages/profile/user-info')
} else {
// 未登录,执行登录
wxLogin()
}
}
const wxLogin = () => {
uni.login({
provider: 'weixin',
success: (res) => {
console.log('登录成功', res)
// 使用状态管理工具保存微信登录数据
saveWxLoginData(res)
calculateLoginDays()
uni.showToast({
title: '登录成功',
icon: 'success',
duration: 1500
})
// 跳转到手机号授权页面
setTimeout(() => {
uni.navigateTo({
url: '/pages/auth/phone-auth'
})
}, 1500)
},
fail: (err) => {
console.error('登录失败', err)
uni.showToast({
title: '登录失败,请重试',
icon: 'none'
})
}
})
// 直接跳转到个人信息设置,如果需要登录会在API调用时自动处理
navigateTo('/pages/profile/user-info')
}
// 统一的页面导航方法
@@ -427,6 +368,7 @@ export default {
petStats,
familyStats,
adoptionStats,
loadUserInfo,
handleUserAction,
navigateTo,
navigateToFamily,
+1 -21
View File
@@ -231,28 +231,9 @@ export default {
// 生命周期
onMounted(() => {
initPageMode()
validateLoginState()
loadUserInfo()
})
// 验证登录状态
const validateLoginState = () => {
if (isSetupMode.value) {
// 首次设置模式需要验证登录状态
console.log('个人信息设置页面状态验证')
// 检查是否有有效的登录状态
const currentStep = uni.getStorageSync(STORAGE_KEYS.LOGIN_STEP)
if (!currentStep || currentStep === 'not_logged') {
console.warn('无效的登录状态,返回profile页面')
uni.reLaunch({
url: '/pages/profile/profile'
})
return
}
}
}
// 方法定义
const initPageMode = () => {
// 获取页面参数
@@ -548,8 +529,7 @@ export default {
// 新增的模式相关变量和方法
isSetupMode,
phoneSkipped,
skipSetup,
validateLoginState
skipSetup
}
}
}