| <template> | 
|   <div class="verification-code-login-form-wrapper"> | 
|     <nut-form class="verification-code-login-form" ref="formRef" :model-value="form" :rules="rules"> | 
|       <nut-form-item label="" class="bole-form-item" prop="userName" required> | 
|         <nut-input | 
|           v-model.trim="form.userName" | 
|           class="bole-input-text" | 
|           placeholder="请输入账号/手机号/邮箱" | 
|           type="text" | 
|         /> | 
|       </nut-form-item> | 
|       <nut-form-item label="" class="bole-form-item" prop="userPassword" required> | 
|         <nut-input | 
|           v-model.trim="form.userPassword" | 
|           class="bole-input-text" | 
|           placeholder="请输入密码" | 
|           :type="isShowPassword ? 'text' : 'password'" | 
|           :key="isShowPassword ? 'text' : 'password'" | 
|         > | 
|           <template #right> | 
|             <div class="password-icon-wrapper" @click="isShowPassword = !isShowPassword"> | 
|               <Eye v-if="isShowPassword"></Eye> | 
|               <Marshalling v-else></Marshalling> | 
|             </div> | 
|           </template> | 
|         </nut-input> | 
|       </nut-form-item> | 
|     </nut-form> | 
|     <LargeButton class="login-btn" @click="handleLogin" :loading="form.loading">登录</LargeButton> | 
|     <div class="go-register-btn" @click="goRegister">立即注册</div> | 
|   </div> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import { Message } from '@12333/utils'; | 
| import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types'; | 
| import { LargeButton } from '@/components'; | 
| import { useLoginedJump } from '@/hooks'; | 
| import { useUserStore } from '@/stores/modules/user'; | 
| import { Eye, Marshalling } from '@nutui/icons-vue-taro'; | 
| import Taro from '@tarojs/taro'; | 
|   | 
| defineOptions({ | 
|   name: 'AccountLoginForm', | 
| }); | 
|   | 
| type Props = { | 
|   policyChecked?: boolean; | 
| }; | 
|   | 
| const props = withDefaults(defineProps<Props>(), {}); | 
|   | 
| const userStore = useUserStore(); | 
|   | 
| const { jump } = useLoginedJump(); | 
|   | 
| const isShowPassword = ref(false); | 
|   | 
| const formRef = ref(null); | 
|   | 
| const form = reactive({ | 
|   loading: false, | 
|   userName: '', | 
|   userPassword: '', | 
| }); | 
|   | 
| const rules = reactive<FormRules>({ | 
|   userName: [{ required: true, message: '请输入账号/手机号/邮箱' }], | 
|   userPassword: [{ required: true, message: '请输入密码' }], | 
| }); | 
|   | 
| async function handleLogin() { | 
|   try { | 
|     if (props.policyChecked) { | 
|       const { valid } = await formRef.value.validate(); | 
|       if (valid) { | 
|         form.loading = true; | 
|         await userStore.loginByPassword({ | 
|           userName: form.userName, | 
|           password: form.userPassword, | 
|         }); | 
|         jump(); | 
|       } | 
|     } else { | 
|       noAccess(); | 
|     } | 
|   } catch (error) { | 
|   } finally { | 
|     form.loading = false; | 
|   } | 
| } | 
|   | 
| function noAccess() { | 
|   Message.warning('请先阅读并勾选协议'); | 
| } | 
|   | 
| function goRegister() { | 
|   console.log('RouterPath.registerForm: ', RouterPath.registerForm); | 
|   Taro.navigateTo({ | 
|     url: RouterPath.registerForm, | 
|   }); | 
| } | 
| </script> | 
|   | 
| <style lang="scss"> | 
| @import '@/styles/common.scss'; | 
|   | 
| .verification-code-login-form-wrapper { | 
|   .password-icon-wrapper { | 
|     padding: 0 10px; | 
|     display: inline-flex; | 
|   | 
|     .nutui-iconfont { | 
|       font-size: 28px; | 
|     } | 
|   } | 
| } | 
| </style> |