| <template> | 
|   <el-dialog | 
|     :width="width" | 
|     :title="title" | 
|     :visible.sync="visible" | 
|     append-to-body | 
|     custom-class="eva-dialog two-fa-window" | 
|     :close-on-click-modal="false" | 
|     :close-on-press-escape="false" | 
|     :show-close="false" | 
|   > | 
|     <slot name="beforeForm"><p class="two-fa-window__message">{{message}}</p></slot> | 
|     <el-form ref="form" :model="form" :rules="rules" inline> | 
|       <el-form-item label="登录密码" prop="password" label-width="85px" required> | 
|         <PasswordInput v-model="form.password"/> | 
|       </el-form-item> | 
|     </el-form> | 
|     <slot name="afterForm"></slot> | 
|     <div slot="footer" class="two-fa-window__footer"> | 
|       <div class="remember-pwd"> | 
|         <el-checkbox v-model="rememberPwd"/><span>记住密码</span> | 
|       </div> | 
|       <div class="opera"> | 
|         <el-button @click="cancel">{{cancelText}}</el-button> | 
|         <el-button type="primary" @click="confirm" :loading="isWorking">{{confirmText}}</el-button> | 
|       </div> | 
|     </div> | 
|   </el-dialog> | 
| </template> | 
|   | 
| <script> | 
| import PasswordInput from './PasswordInput' | 
| export default { | 
|   name: 'TwoFAWindow', | 
|   components: { PasswordInput }, | 
|   props: { | 
|     // 标题 | 
|     title: { | 
|       type: String, | 
|       default: '安全验证' | 
|     }, | 
|     // 消息内容 | 
|     message: { | 
|       type: String, | 
|       required: false | 
|     }, | 
|     // 确认按钮文案 | 
|     confirmText: { | 
|       type: String, | 
|       default: '确定' | 
|     }, | 
|     // 取消按钮文案 | 
|     cancelText: { | 
|       type: String, | 
|       default: '取消' | 
|     }, | 
|     // 宽度 | 
|     width: { | 
|       type: String, | 
|       default: '400px' | 
|     } | 
|   }, | 
|   data () { | 
|     return { | 
|       visible: false, | 
|       isWorking: false, | 
|       // 记住密码 | 
|       rememberPwd: false, | 
|       // 请求对象 | 
|       request: null, | 
|       // 请求方式 | 
|       method: null, | 
|       // 请求参数 | 
|       requestArguments: null, | 
|       // 表单 | 
|       form: { | 
|         password: '' | 
|       }, | 
|       // 表单验证规则 | 
|       rules: { | 
|         password: { required: true, message: '请输入登录密码' } | 
|       } | 
|     } | 
|   }, | 
|   methods: { | 
|     /** | 
|      * 打开窗口(通常情况下由2FA机制自动调用) | 
|      * | 
|      * @param axiosInstance axios实例 | 
|      * @param method 请求方式 | 
|      * @param requestArguments 请求参数 | 
|      */ | 
|     open (axiosInstance, method, requestArguments) { | 
|       this.request = axiosInstance | 
|       this.method = method | 
|       this.requestArguments = requestArguments | 
|       this.visible = true | 
|       this.$nextTick(() => { | 
|         this.$refs.form.resetFields() | 
|       }) | 
|     }, | 
|     /** | 
|      * 确定 | 
|      */ | 
|     confirm () { | 
|       this.$refs.form.validate(valid => { | 
|         if (!valid) { | 
|           return | 
|         } | 
|         // 写入密码 | 
|         this.$cache.twoFA.setPassword(this.form.password, this.rememberPwd) | 
|         // 接口2fa调用 | 
|         if (this.request != null) { | 
|           this.isWorking = true | 
|           this.request[this.method].apply(this.request, this.requestArguments) | 
|             .then(data => { | 
|               this.$emit('then', data) | 
|               // 销毁窗口 | 
|               this.close() | 
|             }) | 
|             .catch(e => { | 
|               this.$emit('catch', e) | 
|             }) | 
|             .finally(() => { | 
|               this.isWorking = false | 
|             }) | 
|           return | 
|         } | 
|         // 手动调用 | 
|         this.$emit('confirm', this.form) | 
|       }) | 
|     }, | 
|     /** | 
|      * 取消 | 
|      */ | 
|     cancel () { | 
|       // 销毁窗口 | 
|       this.close() | 
|       // 接口2fa调用 | 
|       if (this.request != null) { | 
|         this.$emit('cancel', new Error('#ignore#: cancel 2fa')) | 
|         return | 
|       } | 
|       // 手动调用 | 
|       this.$emit('cancel') | 
|     }, | 
|     /** | 
|      * 关闭窗口 | 
|      */ | 
|     close () { | 
|       this.visible = false | 
|       setTimeout(() => { | 
|         document.body.removeChild(this.$el) | 
|       }, 300) | 
|     } | 
|   } | 
| } | 
| </script> | 
|   | 
| <style scoped lang="scss"> | 
| .two-fa-window { | 
|   // 提示消息 | 
|   .two-fa-window__message { | 
|     margin: 0 0 10px 0; | 
|   } | 
|   // 底部操作 | 
|   .two-fa-window__footer { | 
|     display: flex; | 
|     .remember-pwd { | 
|       width: 100px; | 
|       flex-shrink: 0; | 
|       text-align: left; | 
|       font-size: 13px; | 
|       display: flex; | 
|       align-items: center; | 
|       .el-checkbox { | 
|         margin-right: 10px; | 
|       } | 
|       & > * { | 
|         vertical-align: middle; | 
|       } | 
|     } | 
|     .opera { | 
|       flex-grow: 1; | 
|     } | 
|   } | 
| } | 
| </style> |