current-user.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <el-card class="h-full shadow-sm hover:shadow-md transition-shadow">
  3. <div class="flex items-center justify-between">
  4. <!-- 用户信息 -->
  5. <div class="flex items-center gap-4">
  6. <el-avatar
  7. :size="56"
  8. shape="circle"
  9. :src="baseURL + userData.avatar"
  10. class="ring-1 ring-gray-100"
  11. />
  12. <div>
  13. <h3 class="text-lg font-semibold text-gray-800 mb-2">{{ userData.name }}</h3>
  14. <div class="flex items-center gap-2 text-sm">
  15. <span class="px-3 py-1 bg-blue-50 text-blue-600 rounded-full">{{ userData?.dept?.name }}</span>
  16. <span v-if="userData.postName" class="px-3 py-1 bg-green-50 text-green-600 rounded-full">{{ userData.postName }}</span>
  17. </div>
  18. </div>
  19. </div>
  20. <!-- 时间 -->
  21. <div class="flex items-center gap-2 text-sm text-gray-500">
  22. <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  23. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  24. </svg>
  25. <span>{{ parseTime(date) }}</span>
  26. </div>
  27. </div>
  28. </el-card>
  29. </template>
  30. <script setup lang="ts" name="currentUser">
  31. import { useUserInfo } from '/@/stores/userInfo';
  32. import { getObj } from '/@/api/admin/user';
  33. const date = ref(new Date());
  34. const userData = ref({
  35. postName: '',
  36. name: '',
  37. username: '',
  38. userId: '',
  39. avatar: '',
  40. deptName: '',
  41. } as any);
  42. const loading = ref(false);
  43. setInterval(() => {
  44. date.value = new Date();
  45. }, 1000);
  46. onMounted(() => {
  47. const data = useUserInfo().userInfos;
  48. initUserInfo(data.user.userId);
  49. });
  50. /**
  51. * 根据用户 ID 初始化用户信息。
  52. * @param {any} userId - 要查询的用户 ID。
  53. * @returns {Promise<void>} - 初始化用户信息的 Promise 实例。
  54. */
  55. const initUserInfo = async (userId: any): Promise<void> => {
  56. try {
  57. loading.value = true; // 显示加载状态
  58. const res = await getObj(userId); // 执行查询操作
  59. userData.value = res.data; // 将查询到的数据保存到 userData 变量中
  60. userData.value.postName = res.data?.postList?.map((item: any) => item.postName).join(',') || ''; // 将 postList 中的 postName 合并成字符串并保存到 userData 变量中
  61. // 文件上传增加后端前缀
  62. userData.value.avatar = res.data.avatar;
  63. } finally {
  64. loading.value = false; // 结束加载状态
  65. }
  66. };
  67. </script>
  68. <style scoped>
  69. .el-card {
  70. border: 1px solid #e5e7eb;
  71. border-radius: 12px;
  72. transition: all 0.2s ease;
  73. }
  74. .el-card :deep(.el-card__body) {
  75. padding: 24px;
  76. }
  77. /* 头像轻微悬停效果 */
  78. .el-avatar {
  79. transition: transform 0.2s ease;
  80. }
  81. .el-avatar:hover {
  82. transform: scale(1.05);
  83. }
  84. /* 标签悬停效果 */
  85. .px-3.py-1 {
  86. transition: all 0.2s ease;
  87. font-weight: 500;
  88. }
  89. .px-3.py-1:hover {
  90. transform: translateY(-1px);
  91. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  92. }
  93. /* 响应式适配 */
  94. @media (max-width: 640px) {
  95. .flex.items-center.justify-between {
  96. flex-direction: column;
  97. align-items: flex-start;
  98. gap: 16px;
  99. }
  100. .el-card :deep(.el-card__body) {
  101. padding: 16px;
  102. }
  103. }
  104. </style>