|
|
@@ -1,6 +1,106 @@
|
|
|
<template>
|
|
|
- <div class="asdf">
|
|
|
- sdlfjslkdfj
|
|
|
+ <div
|
|
|
+ class="sign-up"
|
|
|
+ >
|
|
|
+ <div class="bg-deco" />
|
|
|
+
|
|
|
+ <img
|
|
|
+ class="logo-and-title"
|
|
|
+ src="@/assets/images/logo-and-title.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+
|
|
|
+ <div class="form-item">
|
|
|
+ <div class="title">
|
|
|
+ <img
|
|
|
+ src="@/assets/images/icon-account.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ <span>帐号</span>
|
|
|
+ </div>
|
|
|
+ <input
|
|
|
+ v-model.trim="account"
|
|
|
+ type="text"
|
|
|
+ placeholder="请输入邮箱"
|
|
|
+ aotufocus
|
|
|
+ :class="{
|
|
|
+ invalid: isAccountInputOver && !isAccountValid
|
|
|
+ }"
|
|
|
+ @blur="isAccountInputOver=true"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div class="form-item">
|
|
|
+ <div class="title">
|
|
|
+ <img
|
|
|
+ src="@/assets/images/icon-phone.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ <span>手机号</span>
|
|
|
+ </div>
|
|
|
+ <input
|
|
|
+ v-model="phone"
|
|
|
+ type="number"
|
|
|
+ placeholder="请输入11位手机号"
|
|
|
+ :class="{
|
|
|
+ invalid: isPhoneInputOver && !isPhoneValid
|
|
|
+ }"
|
|
|
+ @blur="isPhoneInputOver=true"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div class="form-item form-item-password">
|
|
|
+ <div class="title">
|
|
|
+ <img
|
|
|
+ src="@/assets/images/icon-lock.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ <span>密码</span>
|
|
|
+ </div>
|
|
|
+ <input
|
|
|
+ v-model="password"
|
|
|
+ type="password"
|
|
|
+ placeholder="6-10个字,数字或字母"
|
|
|
+ :class="{
|
|
|
+ invalid: isPasswordInputOver && !isPasswordValid
|
|
|
+ }"
|
|
|
+ @blur="isPasswordInputOver=true"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div class="form-item form-item-password-repeat">
|
|
|
+ <div class="title">
|
|
|
+ <img
|
|
|
+ src="@/assets/images/icon-lock.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ <span>确认密码</span>
|
|
|
+ </div>
|
|
|
+ <input
|
|
|
+ v-model="passwordRepeat"
|
|
|
+ type="password"
|
|
|
+ placeholder="6-10个字,数字或字母"
|
|
|
+ :class="{
|
|
|
+ invalid: isPasswordRepeatInputOver && !isPasswordRepeatValid
|
|
|
+ }"
|
|
|
+ @blur="isPasswordRepeatInputOver=true"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <button
|
|
|
+ class="submit"
|
|
|
+ @click="submit"
|
|
|
+ >
|
|
|
+ 注册并登录
|
|
|
+ </button>
|
|
|
+ <button
|
|
|
+ class="return"
|
|
|
+ @click="$router.go(-1)"
|
|
|
+ >
|
|
|
+ 返回
|
|
|
+ </button>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -8,13 +108,201 @@
|
|
|
import { ref, computed, watch, onMounted } from "vue"
|
|
|
import { useRoute, useRouter } from "vue-router"
|
|
|
import { useStore } from "vuex"
|
|
|
+import { showDialog } from 'vant'
|
|
|
+import { signUp, login } from '@/api.js'
|
|
|
|
|
|
const route = useRoute()
|
|
|
const router = useRouter()
|
|
|
const store = useStore()
|
|
|
+
|
|
|
+const {
|
|
|
+ windowSizeInCssForRef,
|
|
|
+ windowSizeWhenDesignForRef,
|
|
|
+} = useSizeAdapt(390, 752)
|
|
|
+
|
|
|
+const account = ref('')
|
|
|
+const phone = ref('')
|
|
|
+const password = ref('')
|
|
|
+const passwordRepeat = ref('')
|
|
|
+
|
|
|
+const accountTrimed = computed(() => {
|
|
|
+ return account.value.trim()
|
|
|
+})
|
|
|
+const phoneTrimed = computed(() => {
|
|
|
+ return phone.value.toString().trim()
|
|
|
+})
|
|
|
+const passwordTrimed = computed(() => {
|
|
|
+ return password.value.trim()
|
|
|
+})
|
|
|
+const passwordRepeatTrimed = computed(() => {
|
|
|
+ return passwordRepeat.value.trim()
|
|
|
+})
|
|
|
+
|
|
|
+const isAccountValid = computed(() => {
|
|
|
+ return !!accountTrimed.value
|
|
|
+})
|
|
|
+const isPhoneValid = computed(() => {
|
|
|
+ return phoneTrimed.value.length === 11
|
|
|
+})
|
|
|
+const isPasswordValid = computed(() => {
|
|
|
+ return passwordTrimed.value.length >= 6 && passwordTrimed.value.length <= 10 && passwordTrimed.value.search(/^[0-9a-zA-Z].*$/) === 0
|
|
|
+})
|
|
|
+const isPasswordRepeatValid = computed(() => {
|
|
|
+ return passwordTrimed.value === passwordRepeatTrimed.value
|
|
|
+})
|
|
|
+
|
|
|
+const isAccountInputOver = ref(false)
|
|
|
+const isPhoneInputOver = ref(false)
|
|
|
+const isPasswordInputOver = ref(false)
|
|
|
+const isPasswordRepeatInputOver = ref(false)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function submit() {
|
|
|
+ if (!isAccountValid.value) {
|
|
|
+ showDialog({
|
|
|
+ message: '请正确输入邮箱',
|
|
|
+ theme: 'round-button',
|
|
|
+ })
|
|
|
+ isAccountInputOver.value = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!isPhoneValid.value) {
|
|
|
+ showDialog({
|
|
|
+ message: '请正确输入手机号',
|
|
|
+ theme: 'round-button',
|
|
|
+ })
|
|
|
+ isPhoneInputOver.value = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!isPasswordValid.value) {
|
|
|
+ showDialog({
|
|
|
+ message: '请正确输入密码',
|
|
|
+ theme: 'round-button',
|
|
|
+ })
|
|
|
+ isPasswordInputOver.value = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!isPasswordRepeatValid.value) {
|
|
|
+ showDialog({
|
|
|
+ message: '请正确输入确认密码',
|
|
|
+ theme: 'round-button',
|
|
|
+ })
|
|
|
+ isPasswordRepeatInputOver.value = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ signUp(accountTrimed.value, phoneTrimed.value, passwordTrimed.value, passwordRepeatTrimed.value).then(() => {
|
|
|
+ showDialog({
|
|
|
+ message: '注册成功',
|
|
|
+ theme: 'round-button',
|
|
|
+ }).then(() => {
|
|
|
+ login(accountTrimed.value, passwordTrimed.value)
|
|
|
+ }).then(() => {
|
|
|
+ router.replace({
|
|
|
+ name: 'HomeView'
|
|
|
+ })
|
|
|
+ }).catch((err) => {
|
|
|
+ showDialog({
|
|
|
+ message: err,
|
|
|
+ theme: 'round-button',
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }).catch((err) => {
|
|
|
+ showDialog({
|
|
|
+ message: err,
|
|
|
+ theme: 'round-button',
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
-.asdf{
|
|
|
+.sign-up{
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+ >.bg-deco{
|
|
|
+ position: absolute;
|
|
|
+ left: calc(-67 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ bottom: calc(-130 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ width: calc(250 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ height: calc(250 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ background: #D1B489;
|
|
|
+ filter: blur(calc(100 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')));
|
|
|
+ }
|
|
|
+ >.logo-and-title{
|
|
|
+ margin-top: calc(53 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ width: calc(120 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ margin-bottom: calc(38 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ }
|
|
|
+ >.form-item{
|
|
|
+ width: calc(321 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ margin-bottom: calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ >.title{
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ >img{
|
|
|
+ width: calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ height: calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ margin-right: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ }
|
|
|
+ >span{
|
|
|
+ font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ font-family: Source Han Sans SC, Source Han Sans SC;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #D1B489;
|
|
|
+ line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ >input{
|
|
|
+ width: 100%;
|
|
|
+ height: calc(29 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ border-bottom: 1px solid #D9D9D9;
|
|
|
+ font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ font-family: Source Han Sans SC, Source Han Sans SC;
|
|
|
+ font-weight: 400;
|
|
|
+ color: black;
|
|
|
+ line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ &::placeholder {
|
|
|
+ font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ font-family: Source Han Sans SC, Source Han Sans SC;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #B8B8B8;
|
|
|
+ line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ >input.invalid{
|
|
|
+ border-bottom: 1px solid red;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ >button.submit{
|
|
|
+ width: calc(332 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ height: calc(56 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ background: rgba(197, 161, 108, 0.8);
|
|
|
+ border-radius: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ font-family: Source Han Sans SC, Source Han Sans SC;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #FFFFFF;
|
|
|
+ line-height: calc(23 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ }
|
|
|
+ >button.return{
|
|
|
+ font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ font-family: Source Han Sans SC, Source Han Sans SC;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #A97C46;
|
|
|
+ line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ padding: calc(15 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
|
|
|
+ opacity: 0.5;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|