Files
WAI_Project_UNIX/pages/user/edit.uvue
icssoa d4c7467f8b - 弃用 service 请求,重新设计了 request 请求方案。
- 用户信息绑定方式更改为 userInfo
2025-08-27 19:27:52 +08:00

248 lines
5.2 KiB
Plaintext

<template>
<cl-page>
<view class="p-3">
<view class="flex flex-col justify-center items-center py-10 mb-3">
<view class="relative overflow-visible">
<!-- #ifdef MP-WEIXIN -->
<button
class="absolute top-0 left-0 w-full h-full opacity-0 z-10"
open-type="chooseAvatar"
@chooseavatar="uploadAvatar"
></button>
<!-- #endif -->
<cl-avatar
:src="userInfo?.avatarUrl"
:size="150"
:pt="{ className: '!rounded-3xl', icon: { size: 60 } }"
@tap="uploadAvatar"
>
</cl-avatar>
<view
class="flex flex-col justify-center items-center absolute bottom-0 right-[-6rpx] bg-black rounded-full p-1 border border-solid border-white"
>
<cl-icon name="edit-line" color="white" :size="24"></cl-icon>
</view>
</view>
</view>
<cl-list :pt="{ className: 'mb-3' }">
<cl-list-item
:label="t('我的昵称')"
hoverable
arrow
justify="start"
@tap="router.to('/pages/user/edit-name')"
>
<cl-text>{{ userInfo?.nickName }}</cl-text>
</cl-list-item>
<cl-list-item label="手机号" hoverable justify="start">
<cl-text>{{ userInfo?.phone }}</cl-text>
</cl-list-item>
</cl-list>
<cl-list :pt="{ className: 'mb-3' }">
<cl-list-item
:label="t('简介')"
hoverable
arrow
justify="start"
@tap="router.to('/pages/user/edit-description')"
>
<cl-text color="info" v-if="userInfo?.description == null">{{
t("介绍一下自己")
}}</cl-text>
<cl-text ellipsis v-else>{{ userInfo?.description }}</cl-text>
</cl-list-item>
</cl-list>
<cl-list :pt="{ className: 'mb-3' }">
<cl-list-item
:label="t('性别')"
hoverable
arrow
justify="start"
@tap="open('gender')"
>
<cl-text>{{ genderText }}</cl-text>
<cl-text color="info" v-if="genderText == ''">{{ t("编辑性别") }}</cl-text>
</cl-list-item>
<cl-list-item
:label="t('生日')"
hoverable
arrow
justify="start"
@tap="open('birthday')"
>
<cl-text>{{ userInfo?.birthday }}</cl-text>
<cl-text color="info" v-if="userInfo?.birthday == null">{{
t("选择生日")
}}</cl-text>
</cl-list-item>
<cl-list-item
:label="t('地区')"
hoverable
arrow
justify="start"
@tap="open('region')"
>
<cl-text>{{ regionText }}</cl-text>
<cl-text color="info" v-if="regionText == ''">{{
t("选择所在的地区")
}}</cl-text>
</cl-list-item>
</cl-list>
<cl-select
:title="t('选择性别')"
:model-value="userInfo?.gender"
:ref="refs.set('gender')"
:options="genderOptions"
:show-trigger="false"
@change="onGenderChange"
></cl-select>
<cl-select-date
:title="t('选择生日')"
:model-value="userInfo?.birthday"
:ref="refs.set('birthday')"
type="date"
:end="today"
:show-trigger="false"
@change="onBirthdayChange"
></cl-select-date>
<cl-cascader
:title="t('选择所在的地区')"
:ref="refs.set('region')"
:options="regionOptions"
:show-trigger="false"
@change="onRegionChange"
></cl-cascader>
</view>
</cl-page>
</template>
<script setup lang="ts">
import { dayUts, router, upload, useRefs, useStore, type Response, userInfo } from "@/cool";
import { t } from "@/locale";
import { useCascader, useUi, type ClSelectOption } from "@/uni_modules/cool-ui";
import { computed, ref } from "vue";
import pca from "@/data/pca.json";
const { user } = useStore();
const ui = useUi();
const refs = useRefs();
// 今天
const today = dayUts().format("YYYY-MM-DD");
// 性别选项
const genderOptions = ref<ClSelectOption[]>([
{
label: t("保密"),
value: 0
},
{
label: t("男"),
value: 1
},
{
label: t("女"),
value: 2
}
]);
// 性别文本
const genderText = computed(() => {
return [t("保密"), t("男"), t("女")][userInfo.value?.gender!];
});
// 性别改变
function onGenderChange(val: number) {
user.update({
gender: val
});
ui.showToast({
message: t("性别设置成功")
});
}
// 生日改变
function onBirthdayChange(val: string) {
user.update({
birthday: val
});
ui.showToast({
message: t("生日设置成功")
});
}
// 地区选项
const regionOptions = useCascader(pca);
// 地区文本
const regionText = computed(() => {
return [userInfo.value?.province, userInfo.value?.city, userInfo.value?.district]
.filter((e) => e != null)
.join(" - ");
});
// 地区改变
function onRegionChange(arr: string[]) {
user.update({
province: arr[0],
city: arr[1],
district: arr[2]
});
ui.showToast({
message: t("地区设置成功")
});
}
// 打开弹窗
function open(name: string) {
refs.open(name);
}
// 上传头像
function uploadAvatar(e: UniEvent) {
function next(path: string) {
upload(path)
.then((url) => {
ui.showToast({
message: t("头像上传成功")
});
user.update({
avatarUrl: url
});
})
.catch((err) => {
ui.showToast({
message: (err as Response).message!
});
});
}
// #ifdef MP-WEIXIN
next(e.detail.avatarUrl);
// #endif
// #ifndef MP-WEIXIN
uni.chooseImage({
count: 1,
success(res) {
next(res.tempFiles[0].path);
}
});
// #endif
}
</script>