index.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <div class="top" :class="{system: isSystem}">
  3. <div class="title">
  4. <img src="@/assets/image/img_login_logo.png">
  5. <h2>广东省消防救援总队火场三维数据平台<span>Three-dimensional data platform of fire scene of Guangdong Fire Rescue</span></h2>
  6. </div>
  7. <div class="oper-btns" v-if="!isSystem && info">
  8. <div class="user-menu">
  9. <img :src="info.avatar ? info.avatar : defAvatar">
  10. <span>{{info.department && info.department.name}}</span>
  11. <el-dropdown>
  12. <div style="outline: none;">
  13. <span class="oper-down">{{info.nickName}}</span>
  14. <i class="el-icon-arrow-down el-icon--right"></i>
  15. </div>
  16. <template v-slot:dropdown>
  17. <el-dropdown-menu class="menu-items-user">
  18. <el-dropdown-item @click="data.show = true">修改密码</el-dropdown-item>
  19. <el-dropdown-item @click="logout"><span style="color:#FA5555">退出登录</span></el-dropdown-item>
  20. </el-dropdown-menu>
  21. </template>
  22. </el-dropdown>
  23. </div>
  24. <!-- <div class="info">
  25. <img src="@/assets/image/top_my.png">
  26. <span>{{info.nickName}}</span>
  27. <span>{{info.userName}}</span>
  28. </div>
  29. <span @click="data.show = true"><img src="@/assets/image/top_set.png"></span>
  30. <span @click="logout"><img src="@/assets/image/top_exit.png"></span> -->
  31. </div>
  32. </div>
  33. <com-dialog title="修改密码" v-model:show="data.show" @submit="updatePsw" enterText="确 定" width="486">
  34. <el-form ref="form" :model="data" label-width="90px">
  35. <div class="stop-psw">
  36. <input type="text">
  37. <input type="password" name="" id="">
  38. </div>
  39. <el-form-item label="手机号:" class="mandatory">
  40. <el-input v-model="data.phone" placeholder="请输入手机号码" disabled></el-input>
  41. </el-form-item>
  42. <el-form-item label="验证码:" class="mandatory">
  43. <el-input v-model="data.code" placeholder="请输入验证码">
  44. <template v-slot:suffix>
  45. <el-button type="primary" plain class="input-inner-btn" @click="sendCode" :disabled="msgStatus.status !== 0">
  46. {{msgStatus.status === 2 ? `${msgStatus.miss}S后可重新发送` : '获取验证码' }}
  47. </el-button>
  48. </template>
  49. </el-input>
  50. </el-form-item>
  51. <el-form-item label="新密码:" class="mandatory">
  52. <el-input v-model="data.password" type="password" placeholder="请输入8-16位数字、英文大小写组合"></el-input>
  53. </el-form-item>
  54. <el-form-item label="密码确认:" class="mandatory">
  55. <el-input v-model="data.confimPsw" type="password" placeholder="请输入8-16位数字、英文大小写组合"></el-input>
  56. </el-form-item>
  57. </el-form>
  58. </com-dialog>
  59. </template>
  60. <script>
  61. import { encryption } from '@/util'
  62. import comDialog from "@/components/dialog";
  63. import axios from 'axios';
  64. import { updatePsw, userLogout } from '@/request/config'
  65. import { sendUserMsg } from '@/request/config'
  66. import { setToken, setPermission, setInfo } from '@/state/user'
  67. import { computed, ref, reactive, watch } from 'vue'
  68. import user from '@/state/user'
  69. import {PSW} from '@/constant/REG'
  70. import { openErrorMsg } from '@/request/errorMsg.js'
  71. import defAvatar from '@/assets/image/top_my.png'
  72. export default {
  73. props: ['isSystem'],
  74. setup() {
  75. const info = computed(() => user.value.info)
  76. const data = ref({show: false, oldPassword: '', password: '', confimPsw: '', phone: info.value.userName, code: ''})
  77. const msgStatus = reactive({status: 0, miss: 0})
  78. watch(info, () => {
  79. data.value.phone = info.value.userName
  80. })
  81. return { data, info, defAvatar, msgStatus }
  82. },
  83. methods: {
  84. async updatePsw() {
  85. if (this.data.password !== this.data.confimPsw) {
  86. return this.$message.error('两次密码不一致!', '提示')
  87. }
  88. if (!PSW.REG.test(this.data.password)) {
  89. return this.$message.error(PSW.tip, '提示')
  90. }
  91. let psw = encryption(this.data.password)
  92. await axios.post(updatePsw, {
  93. userName: this.data.phone,
  94. code: this.data.code,
  95. password: psw,
  96. confirmPwd: psw
  97. })
  98. this.data.show = false
  99. this.data.oldPassword = this.data.password = this.data.confimPsw = ''
  100. openErrorMsg('密码修改成功,请重新登录。')
  101. this._loginout()
  102. },
  103. async _loginout() {
  104. await axios.post(userLogout)
  105. setToken('')
  106. setPermission()
  107. console.log('----------')
  108. setInfo({})
  109. this.$router.replace({name: 'login'})
  110. },
  111. async logout() {
  112. if (await this.$confirm('确定要退出登录吗?', '提示')) {
  113. this._loginout()
  114. }
  115. },
  116. async sendCode() {
  117. if (this.msgStatus.status !== 0) {
  118. return;
  119. }
  120. this.msgStatus.status = 1
  121. try {
  122. await axios.get(sendUserMsg, {
  123. params: {
  124. areaNum: 86,
  125. phoneNum: this.data.phone,
  126. type: 2
  127. }
  128. })
  129. this.msgStatus.status = 2
  130. this.msgStatus.miss = 60
  131. let interval = setInterval(() => {
  132. if (--this.msgStatus.miss < 0) {
  133. clearInterval(interval)
  134. this.msgStatus.status = 0
  135. }
  136. }, 1000)
  137. } catch {
  138. this.msgStatus.status = 0
  139. }
  140. }
  141. },
  142. components: {
  143. "com-dialog": comDialog,
  144. },
  145. }
  146. </script>
  147. <style lang="scss" scoped>
  148. @import './style.scss';
  149. </style>
  150. <style>
  151. .menu-items-user {
  152. transform: translate(-38px, -15px);
  153. }
  154. </style>