更新个人资料页实现评估会议记录,明确展示与编辑页字段一致性要求,补充技能字段的展示与编辑需求。优化小程序页面,增加联系方式完善弹窗,确保用户在使用找伙伴功能前填写手机号或微信号。调整相关文档以反映最新进展,提升用户体验与功能一致性。
This commit is contained in:
199
miniprogram/pages/profile-edit/profile-edit.js
Normal file
199
miniprogram/pages/profile-edit/profile-edit.js
Normal file
@@ -0,0 +1,199 @@
|
||||
/**
|
||||
* Soul创业派对 - 资料编辑完整版(comprehensive_profile_editor_v1_1)
|
||||
* 温馨提示、头像、基本信息、核心联系方式、个人故事、互助需求、项目介绍
|
||||
*/
|
||||
const app = getApp()
|
||||
|
||||
const MBTI_OPTIONS = ['INTJ', 'INFP', 'INTP', 'ENTP', 'ENFP', 'ENTJ', 'ENFJ', 'INFJ', 'ISTJ', 'ISFJ', 'ESTJ', 'ESFJ', 'ISTP', 'ISFP', 'ESTP', 'ESFP']
|
||||
|
||||
Page({
|
||||
data: {
|
||||
statusBarHeight: 44,
|
||||
avatar: '',
|
||||
nickname: '',
|
||||
mbti: '',
|
||||
mbtiIndex: 0,
|
||||
region: '',
|
||||
industry: '',
|
||||
businessScale: '',
|
||||
position: '',
|
||||
skills: '',
|
||||
phone: '',
|
||||
wechatId: '',
|
||||
storyBestMonth: '',
|
||||
storyAchievement: '',
|
||||
storyTurning: '',
|
||||
helpOffer: '',
|
||||
helpNeed: '',
|
||||
projectIntro: '',
|
||||
mbtiOptions: MBTI_OPTIONS,
|
||||
showMbtiPicker: false,
|
||||
saving: false,
|
||||
loading: true,
|
||||
},
|
||||
|
||||
onLoad() {
|
||||
this.setData({ statusBarHeight: app.globalData.statusBarHeight || 44 })
|
||||
this.loadProfile()
|
||||
},
|
||||
|
||||
async loadProfile() {
|
||||
const userInfo = app.globalData.userInfo
|
||||
if (!app.globalData.isLoggedIn || !userInfo?.id) {
|
||||
this.setData({ loading: false })
|
||||
wx.showToast({ title: '请先登录', icon: 'none' })
|
||||
setTimeout(() => wx.navigateBack(), 1500)
|
||||
return
|
||||
}
|
||||
try {
|
||||
const res = await app.request({ url: `/api/miniprogram/user/profile?userId=${userInfo.id}`, silent: true })
|
||||
if (res?.success && res.data) {
|
||||
const d = res.data
|
||||
const mbtiIndex = MBTI_OPTIONS.indexOf(d.mbti || '') >= 0 ? MBTI_OPTIONS.indexOf(d.mbti) : 0
|
||||
this.setData({
|
||||
avatar: d.avatar || '',
|
||||
nickname: d.nickname || '',
|
||||
mbti: d.mbti || '',
|
||||
mbtiIndex,
|
||||
region: d.region || '',
|
||||
industry: d.industry || '',
|
||||
businessScale: d.businessScale || '',
|
||||
position: d.position || '',
|
||||
skills: d.skills || '',
|
||||
phone: d.phone || '',
|
||||
wechatId: d.wechatId || wx.getStorageSync('user_wechat') || '',
|
||||
storyBestMonth: d.storyBestMonth || '',
|
||||
storyAchievement: d.storyAchievement || '',
|
||||
storyTurning: d.storyTurning || '',
|
||||
helpOffer: d.helpOffer || '',
|
||||
helpNeed: d.helpNeed || '',
|
||||
projectIntro: d.projectIntro || '',
|
||||
loading: false,
|
||||
})
|
||||
} else {
|
||||
this.setData({ loading: false })
|
||||
}
|
||||
} catch (e) {
|
||||
this.setData({ loading: false })
|
||||
}
|
||||
},
|
||||
|
||||
goBack() { wx.navigateBack() },
|
||||
|
||||
onNicknameInput(e) { this.setData({ nickname: e.detail.value }) },
|
||||
onRegionInput(e) { this.setData({ region: e.detail.value }) },
|
||||
onIndustryInput(e) { this.setData({ industry: e.detail.value }) },
|
||||
onBusinessScaleInput(e) { this.setData({ businessScale: e.detail.value }) },
|
||||
onPositionInput(e) { this.setData({ position: e.detail.value }) },
|
||||
onSkillsInput(e) { this.setData({ skills: e.detail.value }) },
|
||||
onPhoneInput(e) { this.setData({ phone: e.detail.value }) },
|
||||
onWechatInput(e) { this.setData({ wechatId: e.detail.value }) },
|
||||
onStoryBestMonthInput(e) { this.setData({ storyBestMonth: e.detail.value }) },
|
||||
onStoryAchievementInput(e) { this.setData({ storyAchievement: e.detail.value }) },
|
||||
onStoryTurningInput(e) { this.setData({ storyTurning: e.detail.value }) },
|
||||
onHelpOfferInput(e) { this.setData({ helpOffer: e.detail.value }) },
|
||||
onHelpNeedInput(e) { this.setData({ helpNeed: e.detail.value }) },
|
||||
onProjectIntroInput(e) { this.setData({ projectIntro: e.detail.value }) },
|
||||
|
||||
onMbtiPickerChange(e) {
|
||||
const i = parseInt(e.detail.value, 10)
|
||||
this.setData({ mbtiIndex: i, mbti: MBTI_OPTIONS[i] })
|
||||
},
|
||||
|
||||
chooseAvatar() {
|
||||
wx.chooseMedia({
|
||||
count: 1,
|
||||
mediaType: ['image'],
|
||||
sourceType: ['album', 'camera'],
|
||||
success: async (res) => {
|
||||
const tempPath = res.tempFiles[0].tempFilePath
|
||||
wx.showLoading({ title: '上传中...', mask: true })
|
||||
try {
|
||||
const uploadRes = await new Promise((resolve, reject) => {
|
||||
wx.uploadFile({
|
||||
url: app.globalData.baseUrl + '/api/miniprogram/upload',
|
||||
filePath: tempPath,
|
||||
name: 'file',
|
||||
formData: { folder: 'avatars' },
|
||||
success: (r) => {
|
||||
try {
|
||||
const data = JSON.parse(r.data)
|
||||
if (data.success) resolve(data)
|
||||
else reject(new Error(data.error || '上传失败'))
|
||||
} catch { reject(new Error('解析失败')) }
|
||||
},
|
||||
fail: reject,
|
||||
})
|
||||
})
|
||||
const avatarUrl = app.globalData.baseUrl + uploadRes.data.url
|
||||
this.setData({ avatar: avatarUrl })
|
||||
await app.request({
|
||||
url: '/api/miniprogram/user/profile',
|
||||
method: 'POST',
|
||||
data: { userId: app.globalData.userInfo?.id, avatar: avatarUrl },
|
||||
})
|
||||
if (app.globalData.userInfo) {
|
||||
app.globalData.userInfo.avatar = avatarUrl
|
||||
wx.setStorageSync('userInfo', app.globalData.userInfo)
|
||||
}
|
||||
wx.hideLoading()
|
||||
wx.showToast({ title: '头像已更新', icon: 'success' })
|
||||
} catch (e) {
|
||||
wx.hideLoading()
|
||||
wx.showToast({ title: e.message || '上传失败', icon: 'none' })
|
||||
}
|
||||
},
|
||||
})
|
||||
},
|
||||
|
||||
async saveProfile() {
|
||||
const userId = app.globalData.userInfo?.id
|
||||
if (!userId) {
|
||||
wx.showToast({ title: '请先登录', icon: 'none' })
|
||||
return
|
||||
}
|
||||
this.setData({ saving: true })
|
||||
try {
|
||||
const payload = {
|
||||
userId,
|
||||
nickname: this.data.nickname.trim() || undefined,
|
||||
mbti: this.data.mbti || undefined,
|
||||
region: this.data.region.trim() || undefined,
|
||||
industry: this.data.industry.trim() || undefined,
|
||||
businessScale: this.data.businessScale.trim() || undefined,
|
||||
position: this.data.position.trim() || undefined,
|
||||
skills: this.data.skills.trim() || undefined,
|
||||
phone: this.data.phone.trim() || undefined,
|
||||
wechatId: this.data.wechatId.trim() || undefined,
|
||||
storyBestMonth: this.data.storyBestMonth.trim() || undefined,
|
||||
storyAchievement: this.data.storyAchievement.trim() || undefined,
|
||||
storyTurning: this.data.storyTurning.trim() || undefined,
|
||||
helpOffer: this.data.helpOffer.trim() || undefined,
|
||||
helpNeed: this.data.helpNeed.trim() || undefined,
|
||||
projectIntro: this.data.projectIntro.trim() || undefined,
|
||||
}
|
||||
if (payload.wechatId) wx.setStorageSync('user_wechat', payload.wechatId)
|
||||
if (payload.phone) wx.setStorageSync('user_phone', payload.phone)
|
||||
const hasUpdate = Object.keys(payload).some(k => k !== 'userId' && payload[k] != null)
|
||||
if (!hasUpdate) {
|
||||
wx.showToast({ title: '无变更', icon: 'none' })
|
||||
this.setData({ saving: false })
|
||||
return
|
||||
}
|
||||
await app.request({
|
||||
url: '/api/miniprogram/user/profile',
|
||||
method: 'POST',
|
||||
data: payload,
|
||||
})
|
||||
wx.showToast({ title: '保存成功', icon: 'success' })
|
||||
if (app.globalData.userInfo && payload.nickname) {
|
||||
app.globalData.userInfo.nickname = payload.nickname
|
||||
wx.setStorageSync('userInfo', app.globalData.userInfo)
|
||||
}
|
||||
setTimeout(() => wx.navigateBack(), 800)
|
||||
} catch (e) {
|
||||
wx.showToast({ title: e.message || '保存失败', icon: 'none' })
|
||||
}
|
||||
this.setData({ saving: false })
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user