<template> <view class="set-page"> <navBar :name="$t('设置')" left="0"></navBar> <image @click="editAvatarFn" :src="userInfo.headimg || defaultHeadImg" class="head-img" /> <view class="list-wrap"> <view v-for="(item, index) in list" :key="index" class="item" @tap="routerLink(item.url)"> <view class="title">{{ item.title }}</view> <view :class="['text-right', item.hideArrow && 'hide-arrow']"> <view v-if="item.textProp == 'registrationTime' && userInfo.ctime"> {{ formatTimestamp(userInfo.ctime) }} </view> <view v-if="item.textProp == 'version'"> {{"V " + app_version}} </view> <input class="inp" @input="handleInput" @blur="inpfn" maxlength="22" v-if="item.textProp == 'nickname'" v-model="userInfo[item.textProp]" type="text" /> <block v-else> {{ userInfo[item.textProp] || '' }} </block> </view> </view> </view> <view class="zx-form-btn fix-bottom-btn logout-btn" @tap="handleQuit">{{ $t('退出登录') }}</view> </view> </template> <script> const storage = require('@/common/storage.js') import { QINIU_URL, defaultHeadImg } from '@/common/constant' var config = require('../../common/config_gyq.js'); var http = require('../../common/request'); const common = require('../../common/common.js'); import dayjs from 'dayjs' import 'dayjs/locale/zh-cn'; export default { data() { return { isComposing: false, QINIU_URL, defaultHeadImg, userInfo: {}, app_version: '', list: [{ title: this.$t('昵称'), url: '', textProp: 'nickname' }, { title: this.$t('注册时间'), textProp: 'registrationTime', hideArrow: true }, { title: this.$t('修改密码'), url: '/pages/loginRegister/changePassword' }, { title: this.$t('关于我们'), url: '/pages/aboutMy/aboutMy', textProp: 'version', hideArrow: true }, { title: this.$t('隐私协议'), url: '/pages/contract/contract?contract_id=270' }, { title: this.$t('用户条款'), url: '/pages/contract/contract?contract_id=102' } ] } }, onLoad() { let getAppBaseInfo = uni.getAppBaseInfo() this.setData({ // app_logo: appConfig.app_logo, app_version: getAppBaseInfo.appVersion || '', appName: getAppBaseInfo.appName || '' }) }, onShow() { const user_token = storage.getUserToken() user_token && this.loadUserInfo() }, methods: { // 输入处理 handleInput(e) { // 延迟处理输入法组合输入 setTimeout(() => { const value = e.detail.value; const truncated = this.truncateToMaxBytes(value, 22); // 更新值(避免无限触发,需判断) if (truncated !== value) { this.userInfo.nickname = truncated; } }, 0); }, // 截断字符串至指定字节 truncateToMaxBytes(str, maxBytes) { let totalBytes = 0; let result = ''; for (const char of str) { // 判断字符是否为双字节(如中文) const charBytes = /[^\x00-\xff]/.test(char) ? 2 : 1; if (totalBytes + charBytes > maxBytes) break; totalBytes += charBytes; result += char; } return result; }, formatTimestamp(timestamp) { dayjs.locale('zh-cn'); return dayjs.unix(timestamp).format('YYYY/M/D'); // 严格中文格式 }, inpfn(e) { console.log(e.detail.value) this.editUserInfoFn() }, editAvatarFn() { let _this = this common.upLoadImgQiNiu((imgUrl) => { _this.userInfo.headimg = imgUrl _this.editUserInfoFn() }); }, async editUserInfoFn() { let { data } = await http.postApi(config.API_USER_MODIFY_USER_INFO, { nickname: this.userInfo.nickname, head_img: this.userInfo.headimg, }) storage.setUserInfoData(this.userInfo) }, loadUserInfo() { const userInfo = storage.getUserInfoData() this.setData({ userInfo }) }, routerLink(url) { uni.navigateTo({ url }) }, handleQuit() { uni.showModal({ title: this.$t('提示'), content: this.$t('您确定要退出当前账号吗?'), showCancel: true, cancelText: this.$t('取消'), confirmText: this.$t('确定'), success: function(res) { if (res.confirm) { storage.clearStorage() uni.reLaunch({ url: '/pages/index/index' }) } } }) } } } </script> <style lang="scss"> @import "@/libs/css/layout.scss"; .inp { font-size: 30rpx; color: #060809; text-align: right; } .set-page { display: flex; flex-direction: column; align-items: center; padding: 0 32rpx 48rpx; .head-img { width: 174rpx; height: 174rpx; margin: 0 auto 40rpx; border-radius: 50%; margin-top: 60rpx; } .list-wrap { width: 100%; background: #FFFFFF; border-radius: 40rpx; padding: 8rpx 32rpx; .item { padding: 40rpx 0; display: flex; justify-content: space-between; border-bottom: 2px solid #F1F4F5; &:last-child { border-bottom: 0; } .title { font-family: PingFangSC, PingFang SC; font-weight: bold; font-size: 32rpx; color: #060809; } .text-right { font-family: Futura, Futura; font-weight: 500; font-size: 30rpx; color: #060809; display: flex; align-items: center; &::after { content: ""; width: 28rpx; height: 28rpx; margin-left: 12rpx; background: url('https://qiniu.bms16.com/FtGhNkwKlhR7hOZsaj0gmRl9KjPx'); background-size: 100%; } &.hide-arrow { &::after { display: none; } } } } } .logout-btn { color: #FA2918; background: #E4E7EC; } } </style>