index.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <el-container class="user-container">
  3. <el-card header="个人信息">
  4. <el-avatar :size="70"><sc-iconify icon="ep:avatar" size="45"></sc-iconify></el-avatar>
  5. <el-form>
  6. <el-divider></el-divider>
  7. <el-form-item>
  8. <template #label><sc-iconify icon="material-symbols:login-rounded"></sc-iconify>登录账号</template>
  9. <vxe-text-ellipsis :title="$TOOL.data.get('USER_INFO').username" :content="$TOOL.data.get('USER_INFO').username"></vxe-text-ellipsis>
  10. </el-form-item>
  11. <el-divider></el-divider>
  12. <el-form-item>
  13. <template #label><sc-iconify icon="Nickname"></sc-iconify>用户昵称</template>
  14. <vxe-text-ellipsis :title="$TOOL.data.get('USER_INFO').nickName" :content="$TOOL.data.get('USER_INFO').nickName"></vxe-text-ellipsis>
  15. </el-form-item>
  16. <el-divider></el-divider>
  17. <el-form-item>
  18. <template #label><sc-iconify icon="ant-design:apartment-outlined"></sc-iconify>所属企业</template>
  19. <vxe-text-ellipsis :title="XEUtils.get($TOOL.data.get('USER_INFO'), 'dept.name', '暂未设置')" :content="XEUtils.get($TOOL.data.get('USER_INFO'), 'dept.name', '暂未设置')"></vxe-text-ellipsis>
  20. </el-form-item>
  21. <el-divider></el-divider>
  22. <el-form-item>
  23. <template #label><sc-iconify icon="roentgen:phone"></sc-iconify>手机号码</template>
  24. <vxe-text-ellipsis :title="$TOOL.data.get('USER_INFO').phone" :content="$TOOL.data.get('USER_INFO').phone"></vxe-text-ellipsis>
  25. </el-form-item>
  26. <el-divider></el-divider>
  27. <el-form-item>
  28. <template #label><sc-iconify icon="mdi:email-outline"></sc-iconify>用户邮箱</template>
  29. <vxe-text-ellipsis :title="$TOOL.data.get('USER_INFO').email" :content="$TOOL.data.get('USER_INFO').email"></vxe-text-ellipsis>
  30. </el-form-item>
  31. <el-divider></el-divider>
  32. </el-form>
  33. </el-card>
  34. <el-card header="基本资料">
  35. <el-form ref="formRef" :model="form" :rules="rules" label-width="100">
  36. <el-form-item label="用户昵称" prop="nickName">
  37. <el-input v-model="form.nickName" placeholder="请输入用户昵称"></el-input>
  38. </el-form-item>
  39. <el-form-item label="手机号码" prop="phone">
  40. <el-input v-model="form.phone" placeholder="请输入手机号码"></el-input>
  41. </el-form-item>
  42. <el-form-item label="用户邮箱">
  43. <el-input v-model="form.email" placeholder="请输入用户邮箱"></el-input>
  44. </el-form-item>
  45. <el-form-item label="用户性别">
  46. <el-radio-group v-model="form.gender">
  47. <el-radio label="男"></el-radio>
  48. <el-radio label="女"></el-radio>
  49. </el-radio-group>
  50. </el-form-item>
  51. <el-form-item>
  52. <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit">保存</el-button>
  53. </el-form-item>
  54. </el-form>
  55. </el-card>
  56. </el-container>
  57. </template>
  58. <script setup>
  59. import XEUtils from "xe-utils";
  60. import API from "@/api";
  61. import TOOL from "@/utils/tool";
  62. const store = useStore();
  63. const isSaving = ref(false);
  64. const form = ref(XEUtils.clone(TOOL.data.get("USER_INFO"), true));
  65. const rules = reactive({
  66. nickName: [{ required: true, message: "用户昵称不能为空" }],
  67. phone: [{ pattern: /^\d{11}$/, message: "请输入11位手机号码" }]
  68. });
  69. const formRef = ref();
  70. const submit = () => {
  71. formRef.value.validate(valid => {
  72. if (valid) {
  73. const data = XEUtils.omit(form.value, "dept", "password", "pwdResetTime", "roleList");
  74. XEUtils.set(data, "roleList", XEUtils.map(form.value.roleList, item => ({ id: item.id })));
  75. isSaving.value = true;
  76. API.auth.user.edit(data).then(res => {
  77. isSaving.value = false;
  78. ElMessage.success("操作成功");
  79. TOOL.data.set("USER_INFO", form.value);
  80. setTimeout(() => {
  81. store.commit("setRouteShow", false);
  82. nextTick(() => store.commit("setRouteShow", true));
  83. }, 0);
  84. }).catch(() => isSaving.value = false);
  85. } else {
  86. return false;
  87. }
  88. });
  89. }
  90. </script>
  91. <style lang="scss" scoped>
  92. .user-container {padding: 20px;}
  93. .user-container .el-card {
  94. --el-card-border-radius: 8px;width: 300px;height: fit-content;
  95. :deep(.el-card__body) {padding: 24px;text-align: center;}
  96. .el-avatar {margin-top: 10px;margin-bottom: 24px;}
  97. .el-avatar .sc-iconify-icon {top: -2px;}
  98. .el-divider {margin: 4px 0;border-color: var(--el-border-color-lighter);}
  99. .el-form .el-form-item {margin-bottom: 0;color: rgba(0, 0, 0, 0.88);}
  100. .el-form :deep(.el-form-item__label) {display: flex;align-items: center;color: rgba(0, 0, 0, 0.88);}
  101. .el-form :deep(.el-form-item__label) .sc-iconify-icon {margin-right: 6px;}
  102. }
  103. .el-card + .el-card {flex: 1;margin-left: 20px;
  104. .el-form {padding-right: 16px;}
  105. .el-form .el-form-item {margin-bottom: 18px;}
  106. }
  107. @media (max-width: 992px) {
  108. .user-container .el-card {width: 100%;}
  109. .el-card + .el-card {margin-top: 15px;margin-left: 0;}
  110. }
  111. </style>