|
|
- <template>
- <view class="profile-page">
- <!-- 头部导航栏 -->
- <navbar title="资料修改" bgColor="#019245" color="#fff" leftClick @leftClick="$utils.navigateBack" />
-
-
- <!-- 基本资料区域 -->
- <view class="main-content">
- <view class="section-title">
- <view class="title-indicator"></view>
- <text>基本资料</text>
- </view>
-
- <!-- 头像选择区域 -->
- <view class="avatar-section">
- <button class="chooseAvatar" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
- <image class="avatar-img" :src="form.headImage" mode="aspectFill" />
- <!-- <image class="avatar-img" src="https://img.yzcdn.cn/vant/ipad.png" mode="aspectFill"></image> -->
- </button>
- <text class="avatar-hint">点击更换头像</text>
- </view>
-
- <!-- 表单区域 -->
- <view class="form-section">
- <view class="form-item">
- <text class="label">昵称</text>
- <input class="input" type="nickname" placeholder="请输入" v-model="form.nickName" id="nickName"
- placeholderStyle="color: #999; text-align: right;" />
- </view>
-
- <view class="form-item">
- <text class="label">手机号</text>
- <input class="input" type="tel" placeholder="请输入" v-model="form.phone"
- placeholderStyle="color: #999; text-align: right;" />
- </view>
- </view>
-
- <!-- 保存按钮 -->
- <view class="save-button" @tap="submit">
- <text>保存</text>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- import { mapState } from 'vuex'
- import { mockUserInfo } from '@/static/js/mockUserInfo.js'
- import navbar from '@/components/base/navbar.vue'
-
- export default {
- components: {
- navbar
- },
- data() {
- return {
- form: {
- headImage: '',
- nickName: '',
- phone: ''
- },
- back: '',
- }
- },
- computed: {
- ...mapState(['userInfo']),
- },
- onLoad({ back }) {
- this.back = back
- },
- onShow() {
- this.getUserInfo()
- },
- methods: {
- onChooseAvatar(res) {
- let self = this
- self.$Oss.ossUpload(res.detail.avatarUrl)
- .then(url => {
- self.form.headImage = url
- })
- },
- getUserInfo() {
- // 使用mock数据
- this.form.headImage = this.userInfo.headImage || this.form.headImage
- this.form.nickName = this.userInfo.nickName || this.form.nickName
- this.form.phone = this.userInfo.phone || this.form.phone
- },
- submit() {
- let self = this
-
- // 之所以手动获取dom的input值 而不是v-model 是为了保证跨平台安全生效
- uni.createSelectorQuery().in(this)
- .select("#nickName")
- .fields({
- properties: ["value"],
- })
- .exec((res) => {
- const nickName = res?.[0]?.value
- self.form.nickName = nickName
-
- if (self.$utils.verificationAll(self.form, {
- headImage: '请选择头像',
- nickName: '请填写昵称',
- phone: '请填写手机号'
- })) {
- return
- }
-
- if (!self.$utils.verificationPhone(self.form.phone)) {
- uni.showToast({
- icon: 'none',
- title: '请填写正确的手机号'
- })
- return
- }
-
- this.$api('updateUser', {
- ...this.form,
- }, res => {
- if (res.code == 200) {
- uni.showToast({
- title: '保存成功',
- icon: 'success'
- })
- this.$store.commit('getUserInfo')
- // 返回上一页
- setTimeout(() => {
- this.$utils.navigateBack()
- }, 1500)
- }
- })
-
- })
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .profile-page {
- min-height: 100vh;
- background-color: #f5f5f5;
- }
-
- .nav-bar {
- height: 180rpx;
- background-color: #019245;
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 30rpx;
- padding-top: 60rpx;
- box-sizing: border-box;
- color: #fff;
-
- .back-btn {
- width: 60rpx;
- height: 60rpx;
- display: flex;
- align-items: center;
- }
-
- .nav-title {
- font-size: 36rpx;
- font-weight: 500;
- }
-
- .right-actions {
- display: flex;
- align-items: center;
-
- .icon-divider {
- width: 2rpx;
- height: 30rpx;
- background-color: rgba(255, 255, 255, 0.5);
- margin: 0 20rpx;
- }
- }
- }
-
- .main-content {
- padding: 30rpx;
- }
-
- .section-title {
- display: flex;
- align-items: center;
- margin-bottom: 30rpx;
-
- .title-indicator {
- width: 8rpx;
- height: 32rpx;
- background-color: $uni-color;
- margin-right: 15rpx;
- border-radius: 4rpx;
- }
-
- text {
- font-size: 32rpx;
- font-weight: 500;
- color: #333;
- }
- }
-
- .avatar-section {
- display: flex;
- flex-direction: column;
- align-items: center;
- margin: 50rpx 0;
-
- .chooseAvatar {
- width: 180rpx;
- height: 180rpx;
- border-radius: 50%;
- overflow: hidden;
- padding: 0;
- margin: 0;
- background: none;
-
- &::after {
- border: none;
- }
-
- .avatar-img {
- width: 100%;
- height: 100%;
- border-radius: 50%;
- }
- }
-
- .avatar-hint {
- font-size: 26rpx;
- color: $uni-color-third;
- margin-top: 20rpx;
- }
- }
-
- .form-section {
- background-color: #fff;
- border-radius: 30rpx;
- overflow: hidden;
- margin-bottom: 60rpx;
-
- .form-item {
- display: flex;
- height: 100rpx;
- align-items: center;
- padding: 0 30rpx;
- border-bottom: 1rpx solid #f5f5f5;
-
- &:last-child {
- border-bottom: none;
- }
-
- .label {
- width: 150rpx;
- font-size: 30rpx;
- color: $uni-color-third;
- }
-
- .input {
- flex: 1;
- height: 100%;
- font-size: 30rpx;
- color: #666;
- }
- }
- }
-
- .save-button {
- width: 90%;
- margin: 160rpx auto 0;
- height: 100rpx;
- background-color: $uni-color;
- border-radius: 45rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- color: #fff;
- font-size: 32rpx;
- box-shadow: 0 6rpx 20rpx rgba(1, 146, 69, 0.3);
- }
- </style>
|