index.vue 4.59 KB
<template>
  <BasicModal
    width="80%"
    v-bind="$attrs"
    @register="registerModal"
    @ok="handleSubmit"
    :title="t('personal.index.personalInformation')"
    :draggable="false"
    wrap-class-name="personal-info-modal"
  >
    <div class="flex">
      <div class="flex flex-col w-1/2 border border-gray-200">
        <div class="text-center cursor-pointer">
          <div class="text-left text-lg border-gray-200 p-2 border">{{
            t('personal.index.personalPicture')
          }}</div>
          <div class="flex items-center justify-center mt-4">
            <CropperAvatar @change="handleChange" :uploadApi="uploadApi" :value="personalPicture" />
          </div>
        </div>
        <Description @register="registerDesc" class="mt-8 p-4" />
      </div>
      <div class="ml-4 border border-gray-200">
        <div class="text-lg p-2 border border-gray-200"> {{ t('personal.index.basic') }} </div>
        <div class="ml-5">
          <BasicForm @register="registerForm" />
        </div>
      </div>
    </div>
  </BasicModal>
</template>
<script lang="ts">
  import { defineComponent, ref } from 'vue';
  import { BasicModal, useModalInner } from '/@/components/Modal/index';
  import { BasicForm, useForm } from '/@/components/Form/index';
  import { formSchema } from './config';
  import { Description, DescItem, useDescription } from '/@/components/Description/index';
  import { uploadApi, personalPut } from '/@/api/personal/index';
  import { useMessage } from '/@/hooks/web/useMessage';
  import { useUserStore } from '/@/store/modules/user';
  import headerImg from '/@/assets/images/logo.png';
  import { getMyInfo } from '/@/api/sys/user';
  import { UserInfoModel } from '/@/api/sys/model/userModel';
  import { UserInfo } from '/#/store';
  import { CropperAvatar } from '/@/components/Cropper';
  import { useI18n } from '/@/hooks/web/useI18n';

  export default defineComponent({
    name: 'Index',
    components: {
      BasicModal,
      BasicForm,
      Description,
      CropperAvatar,
    },
    emits: ['refreshPersonal', 'register'],
    setup(_, { emit }) {
      const { t } = useI18n();
      const loading = ref(false);
      const { createMessage } = useMessage();

      const schema: DescItem[] = [
        {
          field: 'username',
          label: t('personal.index.schema.t1'),
        },
        {
          field: 'phoneNumber',
          label: t('personal.index.schema.t2'),
        },
        {
          field: 'email',
          label: t('personal.index.schema.t3'),
        },
        {
          field: 'realName',
          label: t('personal.index.schema.t4'),
        },
        {
          field: 'accountExpireTime',
          label: t('personal.index.schema.t5'),
        },
        {
          field: 'createTime',
          label: t('personal.index.schema.t6'),
        },
      ];

      const userStore = useUserStore();
      const personalPicture = ref<string>();

      const personalInfo = ref<UserInfoModel>();

      const [registerDesc, { setDescProps }] = useDescription({
        schema,
        column: 1,
        bordered: true,
      });
      const handleChange = (e) => {
        personalPicture.value = e.data;
      };

      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
        showActionButtonGroup: false,
        schemas: formSchema,
      });

      const [registerModal, { closeModal }] = useModalInner(async () => {
        const info = await getMyInfo();
        personalInfo.value = info;
        personalPicture.value = info.avatar || headerImg;
        setFieldsValue(info);
        setDescProps({ data: info });
      });

      const handleSubmit = async () => {
        const value = await validate();
        const userInfo = userStore.getUserInfo;
        const record = await personalPut({
          ...value,
          id: userInfo.userId,
          avatar: personalPicture.value,
        });

        userStore.setUserInfo(record as unknown as UserInfo);
        createMessage.success(t('common.editOkText'));
        closeModal();
        resetFields();
        emit('refreshPersonal', record);
      };

      return {
        personalInfo,
        registerDesc,
        personalPicture,
        handleSubmit,
        registerModal,
        registerForm,
        loading,
        headerImg,
        uploadApi,
        handleChange,
        t,
      };
    },
  });
</script>
<style scoped lang="less">
  .round {
    border-radius: 50%;
  }
</style>
<style lang="less">
  .personal-info-modal .ant-upload.ant-upload-select-picture-card {
    border-radius: 50%;
    width: 160px;
    height: 160px;
    margin: 0 !important;
  }
</style>