users-password-edit.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <el-form label-width="100px" :model="data" :rules="rules" ref="baseFormRef">
  3. <el-form-item label="手机号" prop="userName" required>
  4. <el-input disabled v-model="data.userName" style="width: 300px" :maxlength="500" placeholder="请输入" />
  5. </el-form-item>
  6. <el-form-item label="验证码" prop="msgAuthCode" required>
  7. <el-input v-model="data.msgAuthCode" style="width: 190px" :maxlength="500" placeholder="请输入" />
  8. <el-button :loading="checkCodeBtn.loading" :disabled="checkCodeBtn.disabled" type="danger"
  9. style="margin-left: 10px" @click="getCheckCode"> {{ checkCodeBtn.text }}</el-button>
  10. </el-form-item>
  11. <el-form-item label="密码" prop="password" required>
  12. <el-input autocomplete="off" readonly onfocus="this.removeAttribute('readonly');" v-model="data.password"
  13. :type="addPassFlag ? 'text' : 'password'" style="width: 300px" :maxlength="500"
  14. placeholder="请输入8-16位数字、字母大小写组合">
  15. <template #suffix>
  16. <span @click="addPassFlag = !addPassFlag" style="cursor: pointer;">
  17. <el-icon v-if="addPassFlag">
  18. <View />
  19. </el-icon>
  20. <el-icon v-else>
  21. <Hide />
  22. </el-icon>
  23. </span>
  24. </template>
  25. </el-input>
  26. </el-form-item>
  27. <el-form-item label="密码确认" prop="confirmPwd" required>
  28. <el-input autocomplete="off" readonly onfocus="this.removeAttribute('readonly');" v-model="data.confirmPwd"
  29. :type="addPassFlag ? 'text' : 'password'" style="width: 300px" :maxlength="40"
  30. placeholder="请输入8-16位数字、字母大小写组合">
  31. <template #suffix>
  32. <span @click="addPassFlag = !addPassFlag" style="cursor: pointer;">
  33. <el-icon v-if="addPassFlag">
  34. <View />
  35. </el-icon>
  36. <el-icon v-else>
  37. <Hide />
  38. </el-icon>
  39. </span>
  40. </template>
  41. </el-input>
  42. </el-form-item>
  43. </el-form>
  44. </template>
  45. <script setup lang="ts">
  46. import { QuiskExpose } from "@/helper/mount";
  47. import { ElMessage, type FormInstance, type FormRules } from "element-plus";
  48. import { View, Hide } from '@element-plus/icons-vue';
  49. // import type { OrganizationType } from '@/request/organization'
  50. import {
  51. getMsgAuthCode,
  52. UserType,
  53. ChangePasswordParam
  54. } from "@/request";
  55. import { ref, reactive, unref, onMounted, watchEffect } from "vue";
  56. import { onUnmounted } from "vue";
  57. const addPassFlag = ref(false)//图标显示标识
  58. import { globalPasswordRex } from "@/util/regex";
  59. const baseFormRef = ref<FormInstance>();
  60. const props = defineProps<{
  61. user: UserType,
  62. submit: (data: ChangePasswordParam) => Promise<any>;
  63. }>();
  64. const data = ref<UserType>({
  65. nickName: "",
  66. orgId: undefined,
  67. password: "",
  68. msgAuthCode: "",
  69. confirmPwd: "",
  70. status: 0,
  71. userName: "",
  72. createBy: "",
  73. createTime: "",
  74. fdkkId: 0,
  75. head: "",
  76. orgName: "",
  77. tbStatus: 0,
  78. updateBy: "",
  79. updateTime: "",
  80. userId: 0,
  81. roleNames: ""
  82. });
  83. const equalToPassword = (_, value: any, callback: any) => {
  84. if (data.value.password !== value) {
  85. callback(new Error("两次输入的密码不一致"));
  86. } else {
  87. callback();
  88. }
  89. };
  90. const rules = reactive<FormRules>({
  91. userName: [
  92. { required: true, message: "请输入账号", trigger: "blur" },
  93. ],
  94. msgAuthCode: [
  95. { required: true, message: "请输入验证码", trigger: "change" },
  96. ],
  97. password: [
  98. { required: true, pattern: globalPasswordRex, message: "请输入8-16位数字、字母大小写组合", trigger: "blur" },
  99. { required: true, min: 8, message: '密码太短!', trigger: "blur" },
  100. ],
  101. confirmPwd: [
  102. { required: true, pattern: globalPasswordRex, message: "请输入8-16位数字、字母大小写组合", trigger: "blur" },
  103. { required: true, min: 8, message: '密码太短!', trigger: "blur" },
  104. { required: true, validator: equalToPassword, trigger: "blur" }
  105. ]
  106. },)
  107. let checkCodeBtn = reactive<any>({
  108. text: '获取验证码',
  109. loading: false,
  110. disabled: false,
  111. duration: 60,
  112. timer: null
  113. })
  114. onMounted(async () => {
  115. })
  116. onUnmounted(() => {
  117. // 清除掉定时器
  118. checkCodeBtn.timer && clearInterval(checkCodeBtn.timer)
  119. })
  120. watchEffect(() => {
  121. if (props.user) {
  122. data.value = { ...props.user }
  123. console.log('data', data)
  124. }
  125. })
  126. const getCheckCode = async () => {
  127. // 倒计时期间按钮不能单击
  128. const phoneNum = data.value.userName
  129. console.log('getMsgCode', phoneNum)
  130. const res = await getMsgAuthCode('+86', phoneNum)
  131. if (res.success) {
  132. ElMessage.success(res.data);
  133. }
  134. if (checkCodeBtn.duration == 60) {
  135. checkCodeBtn.disabled = true
  136. }
  137. // 清除掉定时器
  138. checkCodeBtn.timer && clearInterval(checkCodeBtn.timer)
  139. // 开启定时器
  140. checkCodeBtn.timer = setInterval(() => {
  141. const tmp = checkCodeBtn.duration--
  142. checkCodeBtn.text = `${tmp}秒`
  143. if (tmp <= 0) {
  144. // 清除掉定时器
  145. clearInterval(checkCodeBtn.timer)
  146. checkCodeBtn.duration = 60
  147. checkCodeBtn.text = '重新获取'
  148. // 设置按钮可以单击
  149. checkCodeBtn.disabled = false
  150. }
  151. console.info(checkCodeBtn.duration)
  152. }, 1000)
  153. }
  154. // const handleSelect = (orgId: number) => {
  155. // const item = Array.from(allOrgs.value).find(i => i.id === orgId)
  156. // if (item) {
  157. // data.value.orgName = item.value
  158. // }
  159. // }
  160. defineExpose<QuiskExpose>({
  161. async submit() {
  162. if (unref(baseFormRef)) {
  163. const res = await unref(baseFormRef)?.validate();
  164. if (res) {
  165. await props.submit(data.value as any as UserType);
  166. // ElMessage.success('编辑成功!');
  167. }
  168. } else {
  169. throw "";
  170. }
  171. },
  172. });
  173. </script>