index.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <Dialog :flag="passwordDialogVisible" width="496px" msg-title="修改密码" @submit-form="submitHandler" @reset-form="togglePasswordDialog(false)">
  3. <div class="dialog-content">
  4. <div v-if="securityData && securityData.pwd_type == 4" class="ruleDesc">
  5. 特殊字符:!、@、#、$、%、^、&、*、(、)、+、{、}、"、:、?、,、.、/、'、;、=、-、\、|
  6. </div>
  7. <div class="ruleDesc">
  8. 密码规则:长度为6-{{securityData.pwd_cons || ''}}个字符,并且必须包含{{renderText}}
  9. </div>
  10. <el-form ref="formRef" :model="formData" :rules="formRules" label-position="top" class="password-form">
  11. <el-form-item label="旧密码" prop="old">
  12. <el-input v-model="formData.old" autocomplete="off" size="default" placeholder="请输入旧密码" show-password></el-input>
  13. </el-form-item>
  14. <el-form-item label="新密码" prop="new">
  15. <el-input v-model="formData.new" size="default" placeholder="请输入新密码" show-password></el-input>
  16. </el-form-item>
  17. <el-form-item label="再次确认新密码" prop="repeat">
  18. <el-input v-model="formData.repeat" size="default" placeholder="请再次确认新密码" show-password></el-input>
  19. </el-form-item>
  20. </el-form>
  21. </div>
  22. </Dialog>
  23. </template>
  24. <script setup lang="ts">
  25. import { changePassword } from "@/api/newLogin";
  26. import Dialog from "@/components/dialog/index.vue";
  27. import { useUserStore } from "@/store/user";
  28. import { ElMessage, FormInstance } from "element-plus";
  29. import MD5 from "blueimp-md5";
  30. import { Query } from "@/api/webApi";
  31. import { onMounted, computed } from "vue";
  32. const emit = defineEmits(["logout"]);
  33. const userStore = useUserStore();
  34. const { passwordDialogVisible, UserId } = storeToRefs(userStore);
  35. const { togglePasswordDialog } = userStore;
  36. const securityData = ref<any>(sessionStorage.getItem("securityData") || null);
  37. const formRef = ref<FormInstance | null>(null);
  38. const formData = reactive({
  39. old: "",
  40. new: "",
  41. repeat: "",
  42. });
  43. const repeatValidator = (rule: any, value: any, callback: any) => {
  44. if (value !== formData.new) {
  45. return callback(new Error("两次输入的密码不一致,请重新输入"));
  46. }
  47. return callback();
  48. };
  49. // 表单验证
  50. const formRules = {
  51. old: [{ required: true, message: "请输入旧密码", trigger: "blur" }],
  52. new: [{ required: true, message: "请输入新密码", trigger: "blur" }],
  53. repeat: [
  54. { required: true, message: "请再次确认新密码", trigger: "blur" },
  55. { validator: repeatValidator, trigger: "blur" },
  56. ],
  57. };
  58. const renderText = computed(() => {
  59. const renderData = securityData.value;
  60. if (renderData?.pwd_type) {
  61. const { pwd_type, pwd_case } = renderData;
  62. switch (Number(pwd_type)) {
  63. case 1:
  64. return "英文";
  65. break;
  66. case 2:
  67. return "数字";
  68. break;
  69. case 3:
  70. return "英文、数字";
  71. break;
  72. case 4:
  73. let str: string = "";
  74. if (pwd_case == 1) {
  75. str = `(英文不区分大小写)`;
  76. } else {
  77. str = `(英文区分大小写)`;
  78. }
  79. return "英文、数字、特殊字符" + str;
  80. break;
  81. default:
  82. return "英文";
  83. break;
  84. }
  85. } else {
  86. return "";
  87. }
  88. });
  89. const submitHandler = () => {
  90. formRef.value?.validate((valid) => {
  91. if (valid) {
  92. submitNewPassword();
  93. } else {
  94. return false;
  95. }
  96. });
  97. };
  98. const submitNewPassword = async () => {
  99. try {
  100. const { code, message }: any = await changePassword({
  101. userId: UserId.value,
  102. originPassword: MD5(formData.old),
  103. newPassword: formData.new,
  104. });
  105. if (Number(code) !== 0) {
  106. throw new Error("修改失败");
  107. }
  108. ElMessage.success("修改成功");
  109. togglePasswordDialog(false);
  110. setTimeout(() => {
  111. ElMessage.info("请重新登录");
  112. emit("logout");
  113. }, 2000);
  114. } catch (error: any) {
  115. // ElMessage.error(error.message ?? "修改失败");
  116. }
  117. };
  118. const getSecurityPolicy = async () => {
  119. try {
  120. const {
  121. code,
  122. returnData: { listValues },
  123. message,
  124. } = await Query({
  125. id: DATACONTENT_ID.securityPolicy,
  126. dataContent: [],
  127. });
  128. if (String(code) !== "0") {
  129. throw new Error(message ?? "失败");
  130. }
  131. if (!listValues.length) {
  132. throw new Error("未查询到策略信息");
  133. }
  134. const data = listValues[0];
  135. securityData.value = data;
  136. sessionStorage.setItem("securityData", JSON.stringify(data));
  137. } catch (error) {
  138. console.error(error);
  139. }
  140. };
  141. onMounted(() => {
  142. getSecurityPolicy();
  143. });
  144. </script>
  145. <style lang="scss" scoped>
  146. .dialog-content {
  147. margin-left: 20px;
  148. .ruleDesc {
  149. line-height: 2;
  150. margin-bottom: 22px;
  151. color: #101611;
  152. }
  153. }
  154. </style>