73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | ||
|   <el-dialog v-model="visible" title="修改密码" width="600px" @close="fnClose">
 | ||
|     <app-form-builder v-model="form" :options="options" label-width="80px" ref="formRef" :span="24" />
 | ||
|     <template #footer>
 | ||
|       <el-button type="primary" @click="fnSubmit">确认修改</el-button>
 | ||
|       <el-button @click="fnClose">关闭</el-button>
 | ||
|     </template>
 | ||
|   </el-dialog>
 | ||
| </template>
 | ||
| 
 | ||
| <script setup>
 | ||
| import {debounce} from "throttle-debounce";
 | ||
| import useForm from "../../../hooks/useForm/index.js";
 | ||
| import { ref } from "vue";
 | ||
| import { postRequest } from "../../../axios/index.js";
 | ||
| import AppFormBuilder from "../../../components/form_builder/index.vue";
 | ||
| import { STRONG_PASSWORD } from "../../../regular/index.js";
 | ||
| import { ElDialog, ElButton } from 'element-plus'
 | ||
| import "element-plus/es/components/dialog/style/css";
 | ||
| import "element-plus/es/components/button/style/css";
 | ||
| 
 | ||
| const props = defineProps({
 | ||
|   changePasswordUrl: { type: String, required: true },
 | ||
| })
 | ||
| const emits = defineEmits(["submit"]);
 | ||
| const visible = defineModel("visible", { type: Boolean, required: true });
 | ||
| const form = ref({
 | ||
|   password: "",
 | ||
|   newPassword: "",
 | ||
|   newPasswordConfirm: "",
 | ||
| });
 | ||
| const { formRef, validate, reset } = useForm();
 | ||
| const options = [
 | ||
|   { key: "password", label: "旧密码", attrs: { type: "password" } },
 | ||
|   {
 | ||
|     key: "newPassword",
 | ||
|     label: "新密码",
 | ||
|     attrs: { type: "password" },
 | ||
|     rules: { pattern: STRONG_PASSWORD, message: "至少8个字符,包含大小写字母、数字和特殊字符", trigger: "blur" }
 | ||
|   },
 | ||
|   {
 | ||
|     key: "newPasswordConfirm",
 | ||
|     label: "确认密码",
 | ||
|     attrs: { type: "password" },
 | ||
|     rules: {
 | ||
|       required: true,
 | ||
|       validator: (_rule, value, callback) => {
 | ||
|         if (value === "") callback(new Error("请再次输入新密码"));
 | ||
|         else if (value !== form.value.newPassword) callback(new Error("两次输入密码不一致!"));
 | ||
|         else callback();
 | ||
|       },
 | ||
|       trigger: "blur"
 | ||
|     }
 | ||
|   },
 | ||
| ]
 | ||
| const fnClose = () => {
 | ||
|   reset();
 | ||
|   visible.value = false;
 | ||
| };
 | ||
| const fnSubmit = debounce(
 | ||
|   1000,
 | ||
|   async () => {
 | ||
|     await validate();
 | ||
|     await postRequest(props.changePasswordUrl, {...form.value});
 | ||
|     fnClose();
 | ||
|     emits("submit");
 | ||
|   },
 | ||
|   { atBegin: true }
 | ||
| );
 | ||
| </script>
 | ||
| 
 | ||
| <style scoped lang="scss"></style>
 |