index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <div class="app-container">
  3. <div class="header">
  4. <userAvatar />
  5. <div style="margin-top: 20px;">{{ state.user.nickName }}<el-button link type="primary" icon="Edit" @click="getDialog" /></div>
  6. </div>
  7. <el-descriptions title="账号设置" :column="1">
  8. <el-descriptions-item label="手机号码:">{{ state.user.phonenumber }}</el-descriptions-item>
  9. <el-descriptions-item label="账号密码:">
  10. <el-button link type="primary" @click="getDialog_Reset">更改</el-button>
  11. </el-descriptions-item>
  12. <el-descriptions-item label="用户邮箱:">{{ state.user.email }}</el-descriptions-item>
  13. <el-descriptions-item label="所属企业:">
  14. {{ state.user.tenantName }}
  15. </el-descriptions-item>
  16. <el-descriptions-item label="所属角色:">{{ state.roleGroup }}</el-descriptions-item>
  17. <el-descriptions-item label="创建日期:">{{ state.user.createTime }}</el-descriptions-item>
  18. </el-descriptions>
  19. <!-- 昵称修改弹窗 -->
  20. <el-dialog v-model="dialogVisible" title="编辑" width="500" :before-close="close">
  21. <el-form ref="infoRef" :model="data.infoForm" :rules="rules">
  22. <el-form-item label="用户昵称:" prop="nickName">
  23. <el-input v-model="data.infoForm.nickName" maxlength="30" />
  24. </el-form-item>
  25. </el-form>
  26. <template #footer>
  27. <el-button type="primary" @click="submit">确定</el-button>
  28. <el-button @click="close">取消</el-button>
  29. </template>
  30. </el-dialog>
  31. <!-- 修改密码弹窗 -->
  32. <el-dialog v-model="dialogVisible_reset" title="编辑" width="500" :before-close="closeReset">
  33. <el-form ref="pwdRef" :model="data.pwdForm" :rules="pwdRules" label-width="100px">
  34. <el-form-item label="旧密码:" prop="oldPassword">
  35. <el-input v-model="data.pwdForm.oldPassword" placeholder="请输入旧密码" type="password" show-password />
  36. </el-form-item>
  37. <el-form-item label="新密码:" prop="newPassword">
  38. <el-input v-model="data.pwdForm.newPassword" placeholder="请输入新密码" type="password" show-password />
  39. </el-form-item>
  40. <el-form-item label="确认密码:" prop="confirmPassword">
  41. <el-input v-model="data.pwdForm.confirmPassword" placeholder="请确认新密码" type="password" show-password />
  42. </el-form-item>
  43. </el-form>
  44. <template #footer>
  45. <el-button type="primary" @click="submit">确定</el-button>
  46. <el-button @click="closeReset">取消</el-button>
  47. </template>
  48. </el-dialog>
  49. </div>
  50. </template>
  51. <script setup name="Profile">
  52. import userAvatar from "./userAvatar";
  53. import { getUserProfile, updateUserProfile, updateUserPwd } from "@/api/system/user";
  54. import { reactive } from "vue";
  55. const activeTab = ref("userinfo");
  56. const state = reactive({
  57. user: {},
  58. roleGroup: {},
  59. postGroup: {}
  60. });
  61. function getUser() {
  62. getUserProfile().then(response => {
  63. state.user = response.data
  64. state.roleGroup = response.roleGroup
  65. state.postGroup = response.postGroup
  66. })
  67. }
  68. getUser()
  69. const { proxy } = getCurrentInstance()
  70. // 弹窗表单
  71. const data = reactive({
  72. infoForm: {
  73. nickName: undefined
  74. },
  75. pwdForm: {
  76. oldPassword: undefined,
  77. newPassword: undefined,
  78. confirmPassword: undefined
  79. }
  80. })
  81. // 弹窗状态
  82. const dialogVisible = ref(false)
  83. const dialogVisible_reset = ref(false)
  84. // 校验表单
  85. const rules = reactive({
  86. nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }]
  87. })
  88. const equalToPassword = (rule, value, callback) => {
  89. if (data.pwdForm.newPassword !== value) {
  90. callback(new Error("两次输入的密码不一致"));
  91. } else {
  92. callback();
  93. }
  94. };
  95. const pwdRules = reactive({
  96. oldPassword: [{ required: true, message: "旧密码不能为空", trigger: "blur" }],
  97. newPassword: [{ required: true, message: "新密码不能为空", trigger: "blur" }, { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }],
  98. confirmPassword: [{ required: true, message: "确认密码不能为空", trigger: "blur" }, { required: true, validator: equalToPassword, trigger: "blur" }]
  99. });
  100. // 打开弹窗
  101. function getDialog() {
  102. dialogVisible.value = true
  103. data.infoForm = { nickName: state.user.nickName, phonenumber: state.user.phonenumber, email: state.user.email }
  104. }
  105. function getDialog_Reset() {
  106. dialogVisible_reset.value = true
  107. }
  108. // 提交按钮
  109. function submit() {
  110. if (dialogVisible.value) {
  111. proxy.$refs.infoRef.validate(valid => {
  112. if (valid) {
  113. updateUserProfile(data.infoForm).then(response => {
  114. proxy.$modal.msgSuccess("修改成功");
  115. state.user.phonenumber = data.infoForm.phonenumber
  116. state.user.email = data.infoForm.email
  117. close()
  118. getUser()
  119. })
  120. }
  121. })
  122. } else {
  123. proxy.$refs.pwdRef.validate(valid => {
  124. if (valid) {
  125. updateUserPwd(data.pwdForm.oldPassword, data.pwdForm.newPassword).then(response => {
  126. proxy.$modal.msgSuccess("修改成功");
  127. closeReset()
  128. });
  129. }
  130. });
  131. }
  132. }
  133. // 关闭按钮
  134. function close() {
  135. dialogVisible.value = false
  136. proxy.$refs.infoRef.resetFields()
  137. }
  138. function closeReset() {
  139. dialogVisible_reset.value = false
  140. proxy.$refs.pwdRef.resetFields()
  141. }
  142. </script>
  143. <style lang="scss" scoped>
  144. .header {
  145. display: flex;
  146. flex-direction: column;
  147. justify-content: center;
  148. align-items: center;
  149. padding: 20px;
  150. }
  151. .el-descriptions {
  152. border: 1px solid #e4e7ed;
  153. box-shadow: 0px 0px 12px rgba(0, 0, 0, .12);
  154. border-radius: 4px;
  155. padding: 20px;
  156. }
  157. </style>