|
|
- <template>
- <view class="profile-page">
-
-
- <view class="profile-content">
- <!-- 头像上传区域 -->
- <view class="avatar-section">
- <!-- 基本资料标签 -->
- <view class="profile-label">
- <text class="label-text">基本资料</text>
- </view>
-
- <view class="avatar-container" @click="uploadAvatar">
- <image
- v-if="userInfo.headImage"
- :src="userInfo.headImage"
- class="avatar-image"
- mode="aspectFill"
- />
- <view v-else class="avatar-placeholder">
- <image src="@/static/待上传头像.png" class="placeholder-image" mode="aspectFit" />
- </view>
- </view>
- <text class="avatar-tip">点击更换头像</text>
- </view>
-
- <!-- 表单区域 -->
- <view class="form-section">
- <!-- 昵称 -->
- <view class="form-item">
- <text class="form-label">昵称</text>
- <uv-input
- v-model="userInfo.nickName"
- placeholder="请输入"
- border="none"
- class="form-input"
- ></uv-input>
- </view>
-
- <!-- 手机号 -->
- <view class="form-item">
- <text class="form-label">手机号</text>
- <uv-input
- v-model="userInfo.phone"
- placeholder="请输入"
- border="none"
- class="form-input"
- ></uv-input>
- </view>
- </view>
-
- <!-- 保存按钮 -->
- <view class="save-section">
- <uv-button
- type="primary"
- text="保存"
- @click="saveProfile"
- :custom-style="saveButtonStyle"
- ></uv-button>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- export default {
- data() {
- return {
- userInfo: {
- headImage: '',
- nickName: '',
- phone: ''
- },
- saveButtonStyle: {
- backgroundColor: '#C70019',
- borderRadius: '41rpx',
- height: '94rpx',
- width: '594rpx',
- border: 'none'
- }
- }
- },
- methods: {
- // 返回上一页
- goBack() {
- uni.navigateBack()
- },
-
- // 上传头像
- async uploadAvatar() {
- try {
- const result = await this.$utils.chooseAndUpload()
- if (result && result.success) {
- console.log(result);
-
- this.userInfo.headImage = result.url
- }
- } catch (error) {
- console.error('头像上传失败:', error)
- uni.showToast({
- title: '头像上传失败',
- icon: 'error'
- })
- }
-
- },
-
- // 保存资料
- async saveProfile() {
- if (!this.userInfo.nickName.trim()) {
- uni.showToast({
- title: '请输入昵称',
- icon: 'none'
- })
- return
- }
-
- if (!this.userInfo.phone.trim()) {
- uni.showToast({
- title: '请输入手机号',
- icon: 'none'
- })
- return
- }
-
- // 简单的手机号验证
- const phoneReg = /^1[3-9]\d{9}$/
- if (!phoneReg.test(this.userInfo.phone)) {
- uni.showToast({
- title: '请输入正确的手机号',
- icon: 'none'
- })
- return
- }
-
- // TODO: 调用API保存用户信息
- const res = await this.$api.user.updateUser({
- headImage: this.userInfo.headImage,
- nickName: this.userInfo.nickName,
- phone: this.userInfo.phone
- })
- if (res.code === 200) {
- uni.showToast({
- title: '保存成功',
- icon: 'success'
- })
-
- // 延迟返回上一页
- setTimeout(() => {
- uni.navigateBack()
- }, 1500)
- }
- },
-
- // 获取个人信息
- async getProfile() {
- const res = await this.$api.user.queryUser()
- if (res.code === 200) {
- this.userInfo = res.result
- }
- }
- },
- onLoad() {
- this.getProfile()
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .profile-page {
- min-height: 100vh;
- // background-color: #f5f5f5;
- }
-
- .profile-content {
- padding:45rpx 32rpx;
- }
-
- .avatar-section {
- display: flex;
- flex-direction: column;
- align-items: center;
- margin-bottom: 80rpx;
- position: relative;
-
- .profile-label {
- position: absolute;
- top: 0;
- left: 28rpx;
- z-index: 10;
-
- .label-text {
- font-size: 30rpx;
- // font-weight: bold;
- color: $primary-text-color;
- position: relative;
-
- &::before {
- content: '';
- position: absolute;
- left: -16rpx;
- top: 50%;
- transform: translateY(-50%);
- width: 9rpx;
- height: 33rpx;
- background-color: $primary-color;
- border-radius: 5rpx;
- }
- }
- }
-
- .avatar-container {
- width: 160rpx;
- height: 160rpx;
- border-radius: 50%;
- overflow: hidden;
- margin-bottom: 20rpx;
- margin-top: 66rpx;
-
- .avatar-image {
- width: 100%;
- height: 100%;
- }
-
- .avatar-placeholder {
- width: 100%;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- background-color: #f0f0f0;
-
- .placeholder-image {
- width: 80rpx;
- height: 80rpx;
- }
- }
- }
-
- .avatar-tip {
- font-size: 28rpx;
- color: $secondary-text-color;
- }
- }
-
- .form-section {
- // background-color: #fff;
- // border-radius: 16rpx;
- padding: 0 32rpx;
- margin-bottom: 500rpx;
-
- .form-item {
- display: flex;
- align-items: center;
- padding: 40rpx 0;
- border-bottom: 0.5rpx solid #f0f0f0;
-
-
-
- .form-label {
- font-size: 30rpx;
- color: $secondary-text-color;
- width: 120rpx;
- flex-shrink: 0;
- }
-
- .form-input {
- flex: 1;
- margin-left: 40rpx;
-
- }
- }
- }
-
- .save-section {
- display: flex;
- justify-content: center;
- }
- </style>
|