xiongzhu 3 лет назад
Родитель
Сommit
d70e26ce34
6 измененных файлов с 82 добавлено и 45 удалено
  1. 1 0
      src/App.vue
  2. 1 1
      src/main.js
  3. 39 35
      src/router/index.js
  4. 4 4
      src/stores/user.js
  5. 0 1
      src/views/LoginPage.vue
  6. 37 4
      src/views/RegisterPage.vue

+ 1 - 0
src/App.vue

@@ -8,5 +8,6 @@
 
 
 <script setup>
 <script setup>
 import { useDark } from '@vueuse/core'
 import { useDark } from '@vueuse/core'
+import { ConfigProvider as VantConfigProvider } from 'vant'
 const dark = useDark()
 const dark = useDark()
 </script>
 </script>

+ 1 - 1
src/main.js

@@ -40,9 +40,9 @@ import common from './mixins/common'
 
 
 const app = createApp(App)
 const app = createApp(App)
 app.use(i18n)
 app.use(i18n)
-app.use(createPinia())
 app.use(IonicVue)
 app.use(IonicVue)
 app.use(router)
 app.use(router)
+app.use(createPinia())
 app.use(http)
 app.use(http)
 app.use(Vant)
 app.use(Vant)
 app.use(toast)
 app.use(toast)

+ 39 - 35
src/router/index.js

@@ -9,28 +9,37 @@ const router = createRouter({
     routes: [
     routes: [
         {
         {
             path: '/',
             path: '/',
-            redirect: '/home'
+            redirect: '/home',
+            meta: {
+                allowGuest: true
+            }
         },
         },
         {
         {
             path: '/',
             path: '/',
             component: TabsPage,
             component: TabsPage,
+            meta: {
+                allowGuest: true
+            },
             children: [
             children: [
                 {
                 {
                     path: '',
                     path: '',
-                    redirect: '/home'
+                    redirect: '/home',
+                    meta: {
+                        allowGuest: true
+                    }
                 },
                 },
                 {
                 {
                     path: 'home',
                     path: 'home',
                     component: () => import('@/views/HomePage.vue'),
                     component: () => import('@/views/HomePage.vue'),
                     meta: {
                     meta: {
-                        pageType: Page.Every
+                        allowGuest: true
                     }
                     }
                 },
                 },
                 {
                 {
                     path: 'mine',
                     path: 'mine',
                     component: () => import('@/views/MinePage.vue'),
                     component: () => import('@/views/MinePage.vue'),
                     meta: {
                     meta: {
-                        pageType: Page.Every
+                        allowGuest: true
                     }
                     }
                 }
                 }
             ]
             ]
@@ -40,7 +49,8 @@ const router = createRouter({
             name: 'login',
             name: 'login',
             component: () => import('@/views/LoginPage.vue'),
             component: () => import('@/views/LoginPage.vue'),
             meta: {
             meta: {
-                pageType: Page.Login
+                allowGuest: true,
+                guestOnly: true
             }
             }
         },
         },
         {
         {
@@ -48,7 +58,8 @@ const router = createRouter({
             name: 'loginPhone',
             name: 'loginPhone',
             component: () => import('@/views/LoginPhonePage.vue'),
             component: () => import('@/views/LoginPhonePage.vue'),
             meta: {
             meta: {
-                pageType: Page.Login
+                allowGuest: true,
+                guestOnly: true
             }
             }
         },
         },
         {
         {
@@ -56,7 +67,8 @@ const router = createRouter({
             name: 'register',
             name: 'register',
             component: () => import('@/views/RegisterPage.vue'),
             component: () => import('@/views/RegisterPage.vue'),
             meta: {
             meta: {
-                pageType: Page.Login
+                allowGuest: true,
+                guestOnly: true
             }
             }
         },
         },
         {
         {
@@ -84,7 +96,7 @@ const router = createRouter({
             name: 'productList',
             name: 'productList',
             component: () => import('@/views/ProductListPage.vue'),
             component: () => import('@/views/ProductListPage.vue'),
             meta: {
             meta: {
-                pageType: Page.Every
+                allowGuest: true
             }
             }
         },
         },
         {
         {
@@ -92,7 +104,7 @@ const router = createRouter({
             name: 'productDetail',
             name: 'productDetail',
             component: () => import('@/views/ProductDetailPage.vue'),
             component: () => import('@/views/ProductDetailPage.vue'),
             meta: {
             meta: {
-                pageType: Page.Every
+                allowGuest: true
             }
             }
         },
         },
         {
         {
@@ -100,7 +112,7 @@ const router = createRouter({
             name: 'productSearch',
             name: 'productSearch',
             component: () => import('@/views/ProductSearchPage.vue'),
             component: () => import('@/views/ProductSearchPage.vue'),
             meta: {
             meta: {
-                pageType: Page.Every
+                allowGuest: true
             }
             }
         },
         },
         {
         {
@@ -130,34 +142,26 @@ const router = createRouter({
         }
         }
     ]
     ]
 })
 })
-
-router.beforeEach((to, from, next) => {
-    const userStore = useUserStore()
-    if (to.meta.pageType != Page.Every) {
-        if (!userStore.user && to.meta.pageType !== Page.Login) {
-            userStore
-                .get()
-                .then(() => {
-                    next()
-                })
-                .catch(() => {
-                    showConfirmDialog({
-                        title: '提示',
-                        message: '用户未登录,是否立即登录'
-                    })
-                        .then(() => {
-                            next('/login')
-                        })
-                        .catch(() => {
-                            next(false)
-                        })
-                })
-        } else {
+router.beforeEach(async (to, from, next) => {
+    const { user, get: getUser } = useUserStore()
+    if (!to.meta.allowGuest && !user) {
+        try {
+            await getUser()
             next()
             next()
+        } catch (error) {
+            const confirm = await showConfirmDialog({
+                title: '提示',
+                message: '用户未登录,是否立即登录'
+            }).catch(() => {
+                next(false)
+            })
+            if (confirm) {
+                next('/login')
+            }
         }
         }
     } else {
     } else {
-        if (!userStore.user) {
-            userStore.get()
+        if (!user) {
+            getUser().catch(() => {})
         }
         }
         next()
         next()
     }
     }

+ 4 - 4
src/stores/user.js

@@ -36,9 +36,9 @@ export const useUserStore = defineStore('user', () => {
                 })
                 })
         })
         })
     }
     }
-    const loginByCode = (phone, code) => {
+    const loginByCode = (phone, code, invitor) => {
         return new Promise((resolve, reject) => {
         return new Promise((resolve, reject) => {
-            http.post('/auth/phoneLogin', { phone, code })
+            http.post('/auth/phoneLogin', { phone, code, invitor })
                 .then(token => {
                 .then(token => {
                     http.setToken(token)
                     http.setToken(token)
                     return http.get('/user/my')
                     return http.get('/user/my')
@@ -52,9 +52,9 @@ export const useUserStore = defineStore('user', () => {
                 })
                 })
         })
         })
     }
     }
-    const register = (phone, code, password) => {
+    const register = (phone, code, password, invitor) => {
         return new Promise((resolve, reject) => {
         return new Promise((resolve, reject) => {
-            http.post('/auth/register', { phone, code, password })
+            http.post('/auth/register', { phone, code, password, invitor })
                 .then(token => {
                 .then(token => {
                     http.setToken(token)
                     http.setToken(token)
                     return http.get('/user/my')
                     return http.get('/user/my')

+ 0 - 1
src/views/LoginPage.vue

@@ -84,7 +84,6 @@ export default {
     },
     },
     beforeRouteEnter(to, from) {
     beforeRouteEnter(to, from) {
         fromRoute = from
         fromRoute = from
-        console.log(to, from)
     },
     },
     methods: {
     methods: {
         onSubmit(e) {
         onSubmit(e) {

+ 37 - 4
src/views/RegisterPage.vue

@@ -94,6 +94,19 @@
                             </div>
                             </div>
                         </template>
                         </template>
                     </van-field>
                     </van-field>
+                    <van-field
+                        v-model="formData.invitor"
+                        name="邀请码"
+                        placeholder="邀请码(选填)"
+                        type="digit"
+                        clearable
+                    >
+                        <template #left-icon>
+                            <div class="icon-wrapper">
+                                <ion-icon :icon="personAddOutline"></ion-icon>
+                            </div>
+                        </template>
+                    </van-field>
                     <van-cell class="xieyi">
                     <van-cell class="xieyi">
                         <van-checkbox v-model="checked">
                         <van-checkbox v-model="checked">
                             已阅读并同意
                             已阅读并同意
@@ -103,7 +116,7 @@
                     </van-cell>
                     </van-cell>
                 </van-cell-group>
                 </van-cell-group>
                 <div class="submit">
                 <div class="submit">
-                    <van-button radius="4" block type="primary" native-type="submit"> 登录 </van-button>
+                    <van-button radius="4" block type="primary" native-type="submit"> 注册 </van-button>
                 </div>
                 </div>
 
 
                 <div class="btns">
                 <div class="btns">
@@ -117,6 +130,7 @@
 import phone from '../mixins/phone'
 import phone from '../mixins/phone'
 import { ref } from 'vue'
 import { ref } from 'vue'
 import { useUserStore } from '../stores/user'
 import { useUserStore } from '../stores/user'
+import { phonePortraitOutline, lockOpenOutline, shieldCheckmarkOutline, personAddOutline } from 'ionicons/icons'
 
 
 let fromRoute = null
 let fromRoute = null
 export default {
 export default {
@@ -135,7 +149,16 @@ export default {
 
 
         const userStore = useUserStore()
         const userStore = useUserStore()
 
 
-        return { formData, checked, showPsd, userStore }
+        return {
+            formData,
+            checked,
+            showPsd,
+            userStore,
+            phonePortraitOutline,
+            lockOpenOutline,
+            shieldCheckmarkOutline,
+            personAddOutline
+        }
     },
     },
     beforeRouteEnter(to, from) {
     beforeRouteEnter(to, from) {
         fromRoute = from
         fromRoute = from
@@ -164,11 +187,12 @@ export default {
             })
             })
 
 
             this.userStore
             this.userStore
-                .register(this.formData.phone, this.formData.code, this.formData.password)
+                .register(this.formData.phone, this.formData.code, this.formData.password, this.formData.invitor)
                 .then(() => {
                 .then(() => {
                     this.$toast.success('注册成功')
                     this.$toast.success('注册成功')
                     setTimeout(() => {
                     setTimeout(() => {
                         if (
                         if (
+                            !fromRoute ||
                             !fromRoute.name ||
                             !fromRoute.name ||
                             fromRoute.name === 'register' ||
                             fromRoute.name === 'register' ||
                             fromRoute.name === 'login' ||
                             fromRoute.name === 'login' ||
@@ -204,7 +228,16 @@ ion-back-button {
 
 
 .van-form {
 .van-form {
     padding: 30px 40px;
     padding: 30px 40px;
-
+    .icon-wrapper {
+        width: 24px;
+        height: 24px;
+        .f();
+        justify-content: center;
+    }
+    ion-icon {
+        font-size: 20px;
+        color: #a108ff;
+    }
     .title {
     .title {
         font-size: 24px;
         font-size: 24px;
         font-weight: bold;
         font-weight: bold;