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. const baseFormRef = ref<FormInstance>();
  59. const props = defineProps<{
  60. user: UserType,
  61. submit: (data: ChangePasswordParam) => Promise<any>;
  62. }>();
  63. const data = ref<UserType>({
  64. nickName: "",
  65. orgId: undefined,
  66. password: "",
  67. msgAuthCode: "",
  68. confirmPwd: "",
  69. status: 0,
  70. userName: "",
  71. createBy: "",
  72. createTime: "",
  73. fdkkId: 0,
  74. head: "",
  75. orgName: "",
  76. tbStatus: 0,
  77. updateBy: "",
  78. updateTime: "",
  79. userId: 0,
  80. roleNames: ""
  81. });
  82. const equalToPassword = (_, value: any, callback: any) => {
  83. if (data.value.password !== value) {
  84. callback(new Error("两次输入的密码不一致"));
  85. } else {
  86. callback();
  87. }
  88. };
  89. const rules = reactive<FormRules>({
  90. userName: [
  91. { required: true, message: "请输入账号", trigger: "blur" },
  92. ],
  93. msgAuthCode: [
  94. { required: true, message: "请输入验证码", trigger: "change" },
  95. ],
  96. password: [
  97. { required: true, pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\s\S]{8,16}$/, message: "请输入8-16位数字、字母大小写组合", trigger: "blur" },
  98. { required: true, min: 8, message: '密码太短!', trigger: "blur" },
  99. ],
  100. confirmPwd: [
  101. { required: true, pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\s\S]{8,16}$/, message: "请输入8-16位数字、字母大小写组合", trigger: "blur" },
  102. { required: true, min: 8, message: '密码太短!', trigger: "blur" },
  103. { required: true, validator: equalToPassword, trigger: "blur" }
  104. ]
  105. },)
  106. let checkCodeBtn = reactive<any>({
  107. text: '获取验证码',
  108. loading: false,
  109. disabled: false,
  110. duration: 60,
  111. timer: null
  112. })
  113. onMounted(async () => {
  114. })
  115. onUnmounted(() => {
  116. // 清除掉定时器
  117. checkCodeBtn.timer && clearInterval(checkCodeBtn.timer)
  118. })
  119. watchEffect(() => {
  120. if (props.user) {
  121. data.value = { ...props.user }
  122. console.log('data', data)
  123. }
  124. })
  125. const getCheckCode = async () => {
  126. // 倒计时期间按钮不能单击
  127. const phoneNum = data.value.userName
  128. console.log('getMsgCode', phoneNum)
  129. const res = await getMsgAuthCode('+86', phoneNum)
  130. if (res.success) {
  131. ElMessage.success(res.data);
  132. }
  133. if (checkCodeBtn.duration == 60) {
  134. checkCodeBtn.disabled = true
  135. }
  136. // 清除掉定时器
  137. checkCodeBtn.timer && clearInterval(checkCodeBtn.timer)
  138. // 开启定时器
  139. checkCodeBtn.timer = setInterval(() => {
  140. const tmp = checkCodeBtn.duration--
  141. checkCodeBtn.text = `${tmp}秒`
  142. if (tmp <= 0) {
  143. // 清除掉定时器
  144. clearInterval(checkCodeBtn.timer)
  145. checkCodeBtn.duration = 60
  146. checkCodeBtn.text = '重新获取'
  147. // 设置按钮可以单击
  148. checkCodeBtn.disabled = false
  149. }
  150. console.info(checkCodeBtn.duration)
  151. }, 1000)
  152. }
  153. // const handleSelect = (orgId: number) => {
  154. // const item = Array.from(allOrgs.value).find(i => i.id === orgId)
  155. // if (item) {
  156. // data.value.orgName = item.value
  157. // }
  158. // }
  159. defineExpose<QuiskExpose>({
  160. async submit() {
  161. if (unref(baseFormRef)) {
  162. const res = await unref(baseFormRef)?.validate();
  163. if (res) {
  164. await props.submit(data.value as any as UserType);
  165. ElMessage.success('编辑成功!');
  166. }
  167. } else {
  168. throw "";
  169. }
  170. },
  171. });
  172. </script>