|
|
@@ -0,0 +1,163 @@
|
|
|
+<template>
|
|
|
+ <div class="form-title">
|
|
|
+ {{ formType ? $t('login.registerModel') : $t('login.loginModel') }}
|
|
|
+ </div>
|
|
|
+ <a-form
|
|
|
+ ref="refForm"
|
|
|
+ :model="form"
|
|
|
+ :rules="rules"
|
|
|
+ layout="validate"
|
|
|
+ :style="{ width: 'calc(100% - 40px)' }"
|
|
|
+ @submit-success="handleSubmit"
|
|
|
+ >
|
|
|
+ <a-form-item field="username">
|
|
|
+ <a-input v-model="form.username" :placeholder="$t('login.usernameTips')">
|
|
|
+ <template #prefix> <icon-user /> </template>
|
|
|
+ </a-input>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item field="email" v-if="formType">
|
|
|
+ <a-input v-model="form.email" :placeholder="$t('login.emailTips')">
|
|
|
+ <template #prefix> <icon-email /> </template>
|
|
|
+ </a-input>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item field="password">
|
|
|
+ <a-input-password
|
|
|
+ v-model="form.password"
|
|
|
+ :placeholder="$t('login.passwordTips')"
|
|
|
+ :defaultVisibility="true"
|
|
|
+ allow-clear
|
|
|
+ >
|
|
|
+ <template #prefix>
|
|
|
+ <icon-user />
|
|
|
+ </template>
|
|
|
+ </a-input-password>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item>
|
|
|
+ <a-button v-if="!formType" :loading="loading" class="submit-btn" type="primary" html-type="submit"
|
|
|
+ >{{ $t('login.loginBtn') }}
|
|
|
+ </a-button>
|
|
|
+ <a-button v-if="formType" :loading="loading" class="submit-btn" type="primary" html-type="submit"
|
|
|
+ >{{ $t('login.registerBtn') }}
|
|
|
+ </a-button>
|
|
|
+ </a-form-item>
|
|
|
+ </a-form>
|
|
|
+ <div class="tips-register" v-if="!formType">
|
|
|
+ {{ $t('login.noAccount') }} <a class="reg-link" href="#" @click="changeFormType">{{ $t('login.registerBtn') }}</a>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { register } from '../../base/api/login';
|
|
|
+import { loginFormRules } from '../../utils/auth';
|
|
|
+import { ref, reactive, getCurrentInstance, nextTick } from 'vue';
|
|
|
+import { useCurrentUserStore } from '../../base/store/use-current-user';
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
+
|
|
|
+const router = useRouter();
|
|
|
+
|
|
|
+const { appContext } = getCurrentInstance();
|
|
|
+const userStore = useCurrentUserStore();
|
|
|
+
|
|
|
+const $message = appContext.config.globalProperties.$message;
|
|
|
+const refForm = ref();
|
|
|
+const form = reactive({
|
|
|
+ username: '',
|
|
|
+ email: '', // 非必填
|
|
|
+ password: ''
|
|
|
+});
|
|
|
+const rules = loginFormRules;
|
|
|
+/**
|
|
|
+ * 表单类型
|
|
|
+ * 0:登录
|
|
|
+ * 1:注册
|
|
|
+ */
|
|
|
+const formType = ref(0);
|
|
|
+const loading = ref(false);
|
|
|
+
|
|
|
+const handleSubmit = (data) => {
|
|
|
+ loading.value = true;
|
|
|
+ if (formType.value) {
|
|
|
+ // 注册
|
|
|
+ toRegister();
|
|
|
+ } else {
|
|
|
+ // 登录
|
|
|
+ userStore
|
|
|
+ .toLogin({ username: data.username, password: data.password })
|
|
|
+ .then((res) => {
|
|
|
+ $message.success(res);
|
|
|
+ router.push('/');
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ $message.error(err);
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ loading.value = false;
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+const toRegister = () => {
|
|
|
+ register({ username: form.username, email: form.email, password: form.password })
|
|
|
+ .then((res) => {
|
|
|
+ if (res.code == 200 && res.data.username) {
|
|
|
+ $message.success(res.msg);
|
|
|
+ formType.value = 0;
|
|
|
+ refForm.value.resetFields();
|
|
|
+ nextTick(() => {
|
|
|
+ form.username = res.data.username;
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ $message.error(res.msg);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ loading.value = false;
|
|
|
+ });
|
|
|
+};
|
|
|
+const changeFormType = (e) => {
|
|
|
+ e.preventDefault();
|
|
|
+ refForm.value.resetFields();
|
|
|
+ formType.value = 1;
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style scoped>
|
|
|
+.form-title {
|
|
|
+ font-size: 30px;
|
|
|
+ line-height: 42px;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+.submit-btn {
|
|
|
+ width: 100%;
|
|
|
+ height: 54px;
|
|
|
+ background-color: rgb(var(--arcoblue-6));
|
|
|
+ border-radius: 3px;
|
|
|
+ color: var(--color-neutral-1);
|
|
|
+ font-size: 20px;
|
|
|
+}
|
|
|
+.submit-btn:hover {
|
|
|
+ background-color: rgba(var(--arcoblue-6), 0.8);
|
|
|
+ color: var(--color-neutral-1);
|
|
|
+}
|
|
|
+.tips-register {
|
|
|
+ position: absolute;
|
|
|
+ right: 20px;
|
|
|
+ bottom: 100px;
|
|
|
+ font-size: 20px;
|
|
|
+ color: var(--color-neutral-4);
|
|
|
+}
|
|
|
+.reg-link {
|
|
|
+ color: rgb(var(--arcoblue-6));
|
|
|
+}
|
|
|
+</style>
|
|
|
+<style>
|
|
|
+.arco-form-item-label-col {
|
|
|
+ padding: 0px;
|
|
|
+}
|
|
|
+.arco-input-wrapper {
|
|
|
+ height: 54px;
|
|
|
+ background-color: var(--color-bg-1);
|
|
|
+ border-color: var(--color-neutral-3);
|
|
|
+}
|
|
|
+.arco-form-item-label {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+</style>
|