profile.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <el-form :model="profile" ref="form" v-loading="loading" label-position="top">
  3. <Upload class="w-28 h-28 rounded-full mx-auto" action="upload/image" :show-file-list="false" name="image" :on-success="uploadAvatar">
  4. <img :src="profile.avatar" class="h-28 rounded-full" v-if="profile.avatar" />
  5. <Icon name="plus" v-else />
  6. </Upload>
  7. <el-form-item
  8. label="昵称"
  9. prop="username"
  10. class="mt-2"
  11. :rules="[
  12. {
  13. required: true,
  14. message: '昵称必须填写',
  15. },
  16. ]"
  17. >
  18. <el-input v-model="profile.username" placeholder="请填写昵称" />
  19. </el-form-item>
  20. <el-form-item
  21. label="邮箱"
  22. prop="email"
  23. :rules="[
  24. {
  25. required: true,
  26. message: '邮箱必须填写',
  27. },
  28. {
  29. type: 'email',
  30. message: '邮箱格式不正确',
  31. },
  32. ]"
  33. >
  34. <el-input v-model="profile.email" placeholder="请填写邮箱" />
  35. </el-form-item>
  36. <el-form-item
  37. label="密码"
  38. prop="password"
  39. :rules="[
  40. {
  41. pattern: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$/,
  42. message: '必须包含大小写字母和数字的组合,可以使用特殊字符,长度在6-20之间',
  43. },
  44. ]"
  45. >
  46. <el-input v-model="profile.password" type="password" show-password placeholder="请输入密码" />
  47. </el-form-item>
  48. <div class="flex justify-center">
  49. <el-button type="primary" @click="submitForm(form)">{{ $t('system.update') }}</el-button>
  50. </div>
  51. </el-form>
  52. </template>
  53. <script lang="ts" setup>
  54. import {onMounted, ref} from 'vue'
  55. import {useCreate} from '/admin/composables/curd/useCreate'
  56. import http from '/admin/support/http'
  57. import {Code} from '/admin/enum/app'
  58. import Message from '/admin/support/message'
  59. import {useUserStore} from '/admin/stores/modules/user'
  60. interface profile {
  61. avatar: string
  62. username: string
  63. email: string
  64. password: string
  65. }
  66. const profile = ref<profile>(
  67. Object.assign({
  68. avatar: '',
  69. username: '',
  70. email: '',
  71. password: '',
  72. }),
  73. )
  74. const { form, loading, submitForm, afterCreate } = useCreate('user/online', null, profile)
  75. const getUserInfo = () => {
  76. loading.value = true
  77. http.get('user/online').then(r => {
  78. profile.value.username = r.data.data.username
  79. profile.value.avatar = r.data.data.avatar
  80. profile.value.email = r.data.data.email
  81. loading.value = false
  82. })
  83. }
  84. onMounted(() => {
  85. getUserInfo()
  86. })
  87. const userStore = useUserStore()
  88. const uploadAvatar = (response, uploadFile) => {
  89. if (response.code === Code.SUCCESS) {
  90. form.value.avatar = response.data.path
  91. profile.value.avatar = response.data.path
  92. } else {
  93. Message.error(response.message)
  94. }
  95. }
  96. afterCreate.value = () => {
  97. userStore.getUserInfo()
  98. }
  99. </script>
  100. <style scoped lang="scss">
  101. :deep(.el-upload) {
  102. @apply h-full w-full;
  103. }
  104. </style>