mcwl-pc/app/components/EditUserInfo.vue

206 lines
5.8 KiB
Vue

<script setup lang="ts">
import type { FormInst } from 'naive-ui'
import { ref } from 'vue'
import { uploadImagesInBatches } from '../utils/uploadImg.ts'
const userStore = useUserStore()
const userInfo = userStore.userInfo
const message = useMessage()
const ruleForm = ref({})
// function onShowModel() {
// ruleForm.value.nickName = userInfo.nickName
// ruleForm.value.avatar = userInfo.avatar
// ruleForm.value.brief = userInfo.brief
// ruleForm.value.userId = userInfo.userId
// }
const rules = ref({
nickName: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 2, max: 15, message: '长度在 2 到 15 个字符', trigger: 'blur' },
],
})
// 文件输入引用
const pictureInput = ref<HTMLInputElement | null>(null)
function handlePictureInput() {
pictureInput.value?.click()
}
// 处理图片上传
async function handlePictureChange(event: Event) {
const files = (event.target as HTMLInputElement).files
if (!files || files.length === 0)
return
if (files.length > 1) {
message.error('只能选择 1 张图片')
return
}
const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'))
if (imageFiles.length === 0) {
message.error('请选择有效的图片文件')
return
}
try {
const pictureResultList = await uploadImagesInBatches(imageFiles)
ruleForm.value.avatar = pictureResultList[0].url
event.target.value = ''
}
catch (error: any) {
message.error('图片上传失败')
}
}
const formRef = ref<FormInst | null>(null)
async function saveInfo() {
formRef.value?.validate(async (errors: any) => {
if (!errors) {
const res1 = await request.post('/system/user/updateUserInfo', ruleForm.value)
if (res1.code === 200) {
await userStore.getUserInfo()
onCloseModel()
// const res = await request.get('/system/user/selectUserById')
// if (res.code === 200) {
// message.success('修改成功!')
// userStore.setUserInfo(res.data)
// onCloseModel()
// }
}
}
})
}
watch(
() => userStore.userInfo, // 监听 userInfo
(newUserInfo: any) => {
if (newUserInfo) {
ruleForm.value.nickName = newUserInfo.nickName
ruleForm.value.avatar = newUserInfo.avatar
ruleForm.value.brief = newUserInfo.brief
ruleForm.value.userId = newUserInfo.userId
ruleForm.value.invitationName = newUserInfo.invitationName
ruleForm.value.invitationCode = newUserInfo.invitationCode
}
},
{ immediate: true, deep: true }, // 立即执行一次,初始化 ruleForm
)
const isVisible = ref(false)
function onCloseModel() {
isVisible.value = false
}
defineExpose({
isVisible,
})
// 生命周期钩子
onMounted(() => {
// initFormData()
})
</script>
<template>
<NModal
v-model:show="isVisible"
:on-after-leave="onCloseModel"
:on-after-enter="onShowModel"
preset="card"
style="width: 400px"
:mask-closable="false"
>
<div class="rounded-full flex justify-center overflow-hidden mb-4">
<client-only>
<img class="block w-[60px] h-[60px] rounded-full" :src="ruleForm.avatar" alt="编辑">
</client-only>
</div>
<div class="flex justify-center mb-2">
<button class="cursor-pointer text-center text-base text-[#222] dark:text-[#fff] dark:border-[#AABEFF1A] border-0 bg-[#F1F2F8] hover:bg-[#ECEEF5] dark:bg-[#1C1D29] dark:hover:bg-[#2A2D3D] font-medium leading-[3rem] w-[116px] h-12 rounded-lg" @click="handlePictureInput">
</button>
<input
ref="pictureInput"
type="file"
accept="image/*"
class="hidden"
@change="handlePictureChange"
>
</div>
<n-form ref="formRef" :model="ruleForm" :rules="rules">
<n-form-item path="nickName" label="用户名">
<n-input v-model:value="ruleForm.nickName" placeholder="请输入用户名" @keydown.enter.prevent />
</n-form-item>
<div v-if="userStore.userInfo.invitationName" class="mb-3">
已经填写: {{ userStore.userInfo.invitationName }} 的邀请码
</div>
<!-- <n-form-item v-if="userInfo.invitationName" path="invitationCode">
</n-form-item> -->
<n-form-item v-else path="invitationCode" label="邀请码">
<n-input v-model:value="ruleForm.invitationCode" placeholder="请输入邀请码" @keydown.enter.prevent />
</n-form-item>
<n-form-item label="简介" path="textareaValue">
<n-input
v-model:value="ruleForm.brief"
placeholder="请输入简介"
type="textarea"
:autosize="{
minRows: 3,
maxRows: 5,
}"
/>
</n-form-item>
</n-form>
<div class="flex justify-center items-center ">
<button class="w-1/2 flex justify-center mx-1 bg-[#f1f2f2] py-3 rounded-lg align-middle border-0 cursor-pointer" @click="onCloseModel">
暂不修改
</button>
<!-- <div class="w-1/2 flex justify-center mx-1 bg-[#f1f2f2] py-3 rounded-lg align-middle">
暂不修改
</div> -->
<button class="w-1/2 flex justify-center mx-1 bg-[#213df5] py-3 rounded-lg align-middle text-[#fff] border-0 cursor-pointer" @click="saveInfo">
确定修改
</button>
<!-- <div class="w-1/2 flex justify-center mx-1 bg-[#213df5] py-3 rounded-lg align-middle color-[#fff]">
</div> -->
</div>
</NModal>
</template>
<style scoped>
.form {
/* cursor: pointer; */
margin-top: 20px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.form-item {
margin-bottom: 10px;
}
.form-item label {
display: block;
margin-bottom: 5px;
}
.form-item input {
width: 200px;
padding: 5px;
border: 1px solid #ccc;
border-radius: 3px;
}
.form-item button {
padding: 5px 10px;
background-color: #007bff;
color: #fff;
border: none;
}
</style>