header.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <div class="head_content">
  3. <div class="head_content_left">
  4. <div class="big_head">后台管理系统</div>
  5. <div class="small_head">大数据精准教学平台</div>
  6. </div>
  7. <div class="head_content_right">
  8. <el-dropdown trigger="click" @command="UserCommand" placement="bottom-end">
  9. <span class="userName">
  10. {{ userInfo.nickname }}
  11. <el-icon class="el-icon--right">
  12. <arrow-down />
  13. </el-icon>
  14. </span>
  15. <template #dropdown>
  16. <el-dropdown-menu>
  17. <el-dropdown-item command="setPassWord">修改密码</el-dropdown-item>
  18. <el-dropdown-item command="loginOut">退出登录</el-dropdown-item>
  19. </el-dropdown-menu>
  20. </template>
  21. </el-dropdown>
  22. </div>
  23. </div>
  24. <div class="page_dialog">
  25. <el-dialog v-model="dialogShow" title="修改密码" width="450px">
  26. <el-form
  27. :model="editPassWordData"
  28. label-width="80px"
  29. :rules="editPassWordDataRules"
  30. ref="editPassWordForm"
  31. >
  32. <el-form-item label="原密码" prop="passWord">
  33. <el-input v-model="editPassWordData.passWord" type="password" placeholder="请输入原密码" />
  34. </el-form-item>
  35. <el-form-item label="新密码" prop="newPassWord">
  36. <el-input v-model="editPassWordData.newPassWord" type="password" placeholder="请输入新密码" />
  37. </el-form-item>
  38. <el-form-item label="确认密码" prop="confirmNewPassWord">
  39. <el-input v-model="editPassWordData.confirmNewPassWord" type="password" placeholder="请输入确认新密码" />
  40. </el-form-item>
  41. </el-form>
  42. <template #footer>
  43. <el-button class="button_border_grag cancel" @click="dialogShow = false">取 消</el-button>
  44. <el-button class="button_background" :loading="submitLoading" @click="confirmPassWord(editPassWordForm)">确 定</el-button>
  45. </template>
  46. </el-dialog>
  47. </div>
  48. </template>
  49. <script lang="ts">
  50. export default {
  51. name: 'Header'
  52. }
  53. </script>
  54. <script lang="ts" setup>
  55. import router from '@/router'
  56. import { ArrowDown } from '@element-plus/icons-vue'
  57. import { ref, reactive, computed } from 'vue'
  58. import { loginOut, changePassWord } from '@/api/login'
  59. import { ElMessage } from 'element-plus'
  60. import type { FormInstance, FormRules } from 'element-plus'
  61. const userInfo = computed(() => {
  62. const user = localStorage.getItem('userInfo')
  63. if (user) {
  64. return JSON.parse(user)
  65. }
  66. return null
  67. })
  68. const dialogShow = ref(false)
  69. interface EditPassWordData {
  70. passWord: string
  71. newPassWord: string
  72. confirmNewPassWord: string
  73. }
  74. const editPassWordData = reactive<EditPassWordData>({
  75. passWord: '',
  76. newPassWord: '',
  77. confirmNewPassWord: ''
  78. }) // 修改密码弹窗数据
  79. const editPassWordForm = ref<FormInstance>()
  80. const editPassWordDataRules = reactive<FormRules<EditPassWordData>>({
  81. passWord: [
  82. { required: true, message: '请输入旧密码', trigger: 'blur' }
  83. ],
  84. newPassWord: [
  85. { required: true, message: '请输入新密码', trigger: 'blur' },
  86. { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' },
  87. ],
  88. confirmNewPassWord: [
  89. { required: true, message: '请输入确认新密码', trigger: 'blur' }
  90. ]
  91. })
  92. const UserCommand = (command: string) => {
  93. console.log(command)
  94. if(command == 'setPassWord') {
  95. setPassWord()
  96. }else if(command == 'loginOut') {
  97. loginOutFn()
  98. }
  99. }
  100. const setPassWord = () => {
  101. dialogShow.value = true
  102. }
  103. const loginOutFn = async () => {
  104. console.log(userInfo.value.username)
  105. const res = await loginOut(userInfo.value.userid)
  106. if(res.code == 200) {
  107. localStorage.removeItem('token')
  108. localStorage.removeItem('userInfo')
  109. router.push('/login')
  110. }else {
  111. ElMessage.error(res.msg)
  112. }
  113. }
  114. const submitLoading = ref(false)
  115. const confirmPassWord = async (formEl: FormInstance | undefined) => {
  116. if (!formEl) return
  117. await formEl.validate(async(valid) => {
  118. if (valid) {
  119. submitLoading.value = true
  120. try {
  121. const res = await changePassWord({
  122. oldPassword: editPassWordData.passWord,
  123. newPassword: editPassWordData.newPassWord,
  124. confirmNewPassword: editPassWordData.confirmNewPassWord,
  125. })
  126. if(res.code == 200) {
  127. ElMessage.success(res.msg)
  128. dialogShow.value = false
  129. }else {
  130. ElMessage.error(res.msg)
  131. }
  132. }catch {}finally {
  133. submitLoading.value = false
  134. }
  135. }
  136. })
  137. }
  138. </script>
  139. <style lang="scss" scoped>
  140. .head_content {
  141. height: 65px;
  142. padding: 0 50px;
  143. display: flex;
  144. justify-content: space-between;
  145. align-items: center;
  146. background-color: #2E64FA;
  147. }
  148. .big_head {
  149. font-size: 24px;
  150. color: #fff;
  151. }
  152. .small_head {
  153. font-size: 14px;
  154. color: #fff;
  155. }
  156. .head_content_right {
  157. .userName {
  158. height: 24px;
  159. line-height: 24px;
  160. color: #fff;
  161. cursor: pointer;
  162. .el-icon svg {
  163. margin-top: 2px;
  164. }
  165. }
  166. }
  167. </style>