206 lines
6.7 KiB
Vue
206 lines
6.7 KiB
Vue
<template>
|
|
<a-drawer v-model:visible="visible" class="custom-class" title="个人设置" placement="right" @after-visible-change="afterVisibleChange" :maskClosable="true">
|
|
<a-tabs v-model:activeKey="activeKey">
|
|
<!-- <a-tab-pane key="1" style="height:100%">
|
|
<template #tab>
|
|
<span>
|
|
<user-outlined />
|
|
修改头像
|
|
</span>
|
|
</template>
|
|
|
|
<a-upload style="" v-model:file-list="fileList" name="file" list-type="picture-card" class="avatar-uploader" :show-upload-list="false" :action="uploadAction" :before-upload="beforeUpload" @change="handleChange" accept=".jpg, .jpeg, .png">
|
|
<img v-if="imageUrl" :src="imageUrl" alt="avatar" style="height: 112px; width: 112px; border-radius: 50%;" />
|
|
<div v-else>
|
|
<loading-outlined v-if="loading"></loading-outlined>
|
|
<plus-outlined v-else></plus-outlined>
|
|
<div class="ant-upload-text">选择图片</div>
|
|
</div>
|
|
</a-upload>
|
|
<div style="margin-top:20px;">
|
|
上传成功即修改成功
|
|
</div>
|
|
</a-tab-pane> -->
|
|
<a-tab-pane key="2">
|
|
<template #tab>
|
|
<span>
|
|
<safety-outlined />
|
|
修改用户信息
|
|
</span>
|
|
</template>
|
|
<a-form ref="passFromRef" :model="passwordFormData" name="basic" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }" autocomplete="off" @finish="onFinish" @finishFailed="onFinishFailed" validateTrigger="blur">
|
|
<a-form-item label="原密码" ref="OldPassword" name="OldPassword" :rules="[{ required: true, message: '请输入原密码!' }]">
|
|
<a-input-password v-model:value="passwordFormData.OldPassword" />
|
|
</a-form-item>
|
|
|
|
<a-form-item label="新密码" ref="Password" name="Password" :rules="[{ required: true, message: '请输入正确新密码!密码要求6位以上包含大小写与数字' ,validator:checkPassword}]">
|
|
<a-input-password v-model:value="passwordFormData.Password" />
|
|
</a-form-item>
|
|
<a-form-item label="确认密码" ref="ConfirmPassword" name="ConfirmPassword" :rules="[{ required: true, message: '请输入正确新密码!',validator:checkPassword}]">
|
|
<a-input-password v-model:value="passwordFormData.ConfirmPassword" />
|
|
</a-form-item>
|
|
<a-form-item label="修改账户" ref="UserName" name="UserName" :rules="[{ required: true, message: '请输入新账号!' }]">
|
|
<a-input v-model:value="passwordFormData.UserName" />
|
|
</a-form-item>
|
|
<a-form-item :wrapper-col="{ offset: 8, span: 16 }">
|
|
<a-button type="primary" html-type="submit">确认</a-button>
|
|
</a-form-item>
|
|
</a-form>
|
|
</a-tab-pane>
|
|
</a-tabs>
|
|
</a-drawer>
|
|
</template>
|
|
<script lang="ts" setup>
|
|
import { message } from 'ant-design-vue';
|
|
import { defineComponent, ref, onMounted, reactive } from 'vue';
|
|
import type { UploadChangeParam, UploadProps, FormInstance } from 'ant-design-vue';
|
|
import { useApiStore, useAccountStore } from '@/store';
|
|
import http from '@/store/http';
|
|
import { checkPass } from '@/utils/regexHelper';
|
|
import type { Rule } from 'ant-design-vue/es/form';
|
|
|
|
const activeKey = ref<string>('2');
|
|
const uploadAction = ref<string>('');
|
|
const visible = ref<boolean>(false);
|
|
|
|
function show(vis: boolean) {
|
|
visible.value = vis;
|
|
if (vis) loadUserInfo();
|
|
}
|
|
const passFromRef = ref<FormInstance>();
|
|
const afterVisibleChange = (bool: boolean) => {
|
|
if (!bool) {
|
|
if (passFromRef != null && passFromRef.value != null) passFromRef.value.resetFields();
|
|
}
|
|
};
|
|
|
|
function getBase64(img: Blob, callback: (base64Url: string) => void) {
|
|
const reader = new FileReader();
|
|
reader.addEventListener('load', () => callback(reader.result as string));
|
|
reader.readAsDataURL(img);
|
|
}
|
|
const fileList = ref([]);
|
|
const loading = ref<boolean>(false);
|
|
const imageUrl = ref<string>('');
|
|
|
|
const handleChange = (info: UploadChangeParam) => {
|
|
if (info.file.status === 'uploading') {
|
|
loading.value = true;
|
|
return;
|
|
}
|
|
if (info.file.status === 'done') {
|
|
// Get this url from response in real world.
|
|
getBase64(info.file.originFileObj, (base64Url: string) => {
|
|
imageUrl.value = base64Url;
|
|
loading.value = false;
|
|
});
|
|
}
|
|
if (info.file.status === 'error') {
|
|
loading.value = false;
|
|
message.error('upload error');
|
|
}
|
|
};
|
|
|
|
const beforeUpload = (file: UploadProps['fileList'][number]) => {
|
|
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
|
|
if (!isJpgOrPng) {
|
|
message.error('仅允许上传jpg|png|jpeg格式');
|
|
}
|
|
const isLt10M = file.size / 1024 / 1024 < 10;
|
|
if (!isLt10M) {
|
|
message.error('最大允许上传5M的文件!');
|
|
}
|
|
return isJpgOrPng && isLt10M;
|
|
};
|
|
|
|
// const userInfo = ref<string>();
|
|
|
|
const loadUserInfo = () => {
|
|
useApiStore()
|
|
.apiUserInfo()
|
|
.then((res) => {
|
|
if (res.code === 0) {
|
|
if (res.data.avatar != null && res.data.avatar !== '') imageUrl.value = `/upload/${res.data.avatar}`;
|
|
passwordFormData.UserId = res.data.id;
|
|
uploadAction.value = `/api/auth/UpdateUserAvatar?Uid=${res.data.id}`;
|
|
}
|
|
});
|
|
};
|
|
|
|
interface PassFormState {
|
|
UserId: string;
|
|
OldPassword: string;
|
|
Password: string;
|
|
ConfirmPassword: string;
|
|
UserName: string;
|
|
}
|
|
|
|
const onFinish = (values: PassFormState) => {
|
|
if (values.Password !== values.ConfirmPassword) {
|
|
message.error('新密码与确认密码不一致');
|
|
return;
|
|
} else {
|
|
useApiStore()
|
|
.apiChangePwd(passwordFormData)
|
|
.then((res) => {
|
|
console.log(res);
|
|
if (res.code === 0) {
|
|
message.success('修改密码成功,请重新登陆!');
|
|
useAccountStore().setLogged(false);
|
|
visible.value = false;
|
|
http.removeAuthorization();
|
|
} else {
|
|
message.error(res.erro, 8);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
const checkPassword = async (_rule: Rule, value: string) => {
|
|
if (checkPass(value)) {
|
|
return Promise.resolve();
|
|
} else {
|
|
return Promise.reject('密码要求6位以上包含大小写与数字');
|
|
}
|
|
};
|
|
|
|
const onFinishFailed = (errorInfo: any) => {
|
|
console.log('Failed:', errorInfo);
|
|
};
|
|
const passwordFormData = reactive<PassFormState>({
|
|
UserId: '',
|
|
OldPassword: '',
|
|
Password: '',
|
|
ConfirmPassword: '',
|
|
UserName: '',
|
|
});
|
|
// 将updateMessage方法暴露给父组件调用
|
|
defineExpose({
|
|
show,
|
|
});
|
|
</script>
|
|
|
|
<style>
|
|
.avatar-uploader > .ant-upload {
|
|
width: 100px;
|
|
height: 100px;
|
|
}
|
|
.ant-upload-picture-card-wrapper {
|
|
height: 100%;
|
|
}
|
|
.ant-upload-select-picture-card i {
|
|
font-size: 32px;
|
|
color: #999;
|
|
margin-top: 50px !important;
|
|
}
|
|
.ant-upload-select-picture-card {
|
|
margin-top: 50px !important;
|
|
}
|
|
.ant-upload-select-picture-card .ant-upload-text {
|
|
margin-top: 8px;
|
|
color: #666;
|
|
}
|
|
.ant-tabs-content {
|
|
text-align: center;
|
|
}
|
|
</style> |