Explorar o código

Implemented login logic, updated routing, changed some file structure

Nivek %!s(int64=2) %!d(string=hai) anos
pai
achega
e66704e59c
Modificáronse 9 ficheiros con 87 adicións e 23 borrados
  1. 1 4
      components.d.ts
  2. 1 2
      index.html
  3. 1 1
      src/App.vue
  4. 9 0
      src/components/Dashboard.vue
  5. 3 1
      src/components/Header.vue
  6. 53 12
      src/components/Login.vue
  7. 4 0
      src/main.ts
  8. 14 3
      src/router/index.ts
  9. 1 0
      src/views/Home.vue

+ 1 - 4
components.d.ts

@@ -8,18 +8,15 @@ export {}
 declare module 'vue' {
   export interface GlobalComponents {
     Dashboard: typeof import('./src/components/Dashboard.vue')['default']
-    DashboardPage: typeof import('./src/components/DashboardPage.vue')['default']
+    ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElCard: typeof import('element-plus/es')['ElCard']
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElIcon: typeof import('element-plus/es')['ElIcon']
     Header: typeof import('./src/components/Header.vue')['default']
-    HeaderComponent: typeof import('./src/components/HeaderComponent.vue')['default']
     HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
     Login: typeof import('./src/components/Login.vue')['default']
-    LoginComponent: typeof import('./src/components/LoginComponent.vue')['default']
     Register: typeof import('./src/components/Register.vue')['default']
-    RegisterComponent: typeof import('./src/components/RegisterComponent.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
   }

+ 1 - 2
index.html

@@ -2,9 +2,8 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Vite + Vue + TS</title>
+    <title>Bluewhale Online</title>
   </head>
   <body>
     <div id="app"></div>

+ 1 - 1
src/App.vue

@@ -4,7 +4,7 @@
 
 <template>
 
-  <router-view />
+    <router-view />
 
 </template>
 

+ 9 - 0
src/components/Dashboard.vue

@@ -4,6 +4,15 @@
 
 <template>
 
+  <div class="flex m-3 p-3">
+    <el-card class="w-full h-full flex">
+      <el-avatar />
+      <el-card class="w-4" />
+
+    </el-card>
+  </div>
+
+
 </template>
 
 <style scoped>

+ 3 - 1
src/components/Header.vue

@@ -9,8 +9,10 @@ import {UserFilled, SwitchButton} from "@element-plus/icons-vue";
       <div class="flex items-center justify-between">
 
         <div class="flex items-center space-x-4">
+          <router-link to="/home" v-slot="{navigate}">
+            <h1 @click="navigate" class="text-xl text-white"> Blue Whale Shopping Online </h1>
+          </router-link>
 
-          <h1 class="text-xl text-white"> Blue Whale Shopping Online </h1>
         </div>
 
         <div class="flex items-center space-x-4">

+ 53 - 12
src/components/Login.vue

@@ -4,22 +4,52 @@
   import axios from "axios";
   import {router} from '../router'
 
-  // 输入框的ref
+  // 输入框
   const account = ref('')
   const password = ref('')
 
-  // 用于计算
+  // 用于前端阻拦不合法输入
+  // const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+  const hasAccountInput = computed(() => account.value != '');
+  const hasPasswordInput = computed(() => password.value != '');
+
+  const chinaMobileRegex = /^1(3[0-9]|4[579]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[189])\d{8}$/;
+  const accountLegal = computed(() => chinaMobileRegex.test(account.value));
+
+  // 密码有就行
+  const passwordLegal = hasPasswordInput;
+
   const loginDisabled = computed(() => {
-    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
-    return !(emailRegex.test(account.value) && password.value.trim() !== '');
+    return !(accountLegal.value && passwordLegal.value);
   });
 
-  function handleLogin() {
-    axios.post(
 
-    )
-    console.log(account.value)
-    router.push({ path: "/home" })
+  // POST /api/user/login
+  // params
+  //    phone: string
+  //    password: string
+  async function handleLogin() {
+
+    try {
+      const response = await axios.post('/user/login', {
+        params: {
+          phone: account.value,
+          password: password.value,
+        }
+      })
+      console.log(response)
+      // token塞入饼干中
+      const token = response.data.token;
+      document.cookie = `token=${token}`
+
+      // 路由跳转
+      router.push({ path: "/home" })
+    } catch (e) {
+      console.log(e)
+      // 可以给用户弹窗
+    }
+
+    // router.push({ path: "/home" })
   }
 
 </script>
@@ -44,14 +74,25 @@
         <el-form class="space-y-4 md:space-y-6">
 
           <el-form-item>
-            <label for="email" class="block mb-2 text-sm font-medium text-gray-900">注册邮箱</label>
-            <input id="email" type="email" v-model="account"
+            <label v-if="!hasAccountInput" for="tel" class="inline-block mb-2 text-sm font-medium text-gray-900">
+              注册手机号
+            </label>
+            <label v-else-if="!accountLegal" for="tel"
+                   class="inline-block mb-2 font-medium text-red-500 text-sm">
+              手机号内容不合法
+            </label>
+            <label v-else for="tel" class="inline-block mb-2 text-sm font-medium text-gray-900">
+              注册手机号
+            </label>
+
+            <input id="tel" type="tel" v-model="account"
                    required
                    class="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5"
-                   placeholder="name@company.com">
+                   placeholder="">
           </el-form-item>
 
           <el-form-item>
+<!--            因为密码目前设定是有就行,所以也没有做条件渲染-->
             <label for="password" class="block mb-2 text-sm font-medium text-gray-900">账户密码</label>
             <input id="password" type="password" v-model="password"
                    required

+ 4 - 0
src/main.ts

@@ -2,5 +2,9 @@ import { createApp } from 'vue'
 import './style.css'
 import {router} from './router'
 import App from './App.vue'
+import axios from 'axios'
+
+axios.defaults.baseURL = ("http://localhost:1234/api")
+axios.defaults.timeout = 30000;
 
 createApp(App).use(router).mount('#app')

+ 14 - 3
src/router/index.ts

@@ -1,19 +1,30 @@
 import { createRouter, createWebHistory } from "vue-router";
+import Login from "../components/Login.vue"
 
 const router = createRouter({
     history: createWebHistory(),
     routes: [{
         path: '/',
-        redirect: '/login',
+        component: Login,
     },{
         path: '/login',
-        component: () => import('../components/Login.vue'),
+        component: Login,
     },{
         path: '/register',
         component: () => import('../components/Register.vue'),
     }, {
         path: '/home',
-        component: () => import('../views/HomePage.vue'),
+        component: () => import('../views/Home.vue'),
+        children: [
+            {
+                path: '/dashboard',
+                name: 'Dashboard',
+                component: () => import('../components/Dashboard.vue'),
+                meta: {
+                    title: '个人信息'
+                }
+            },
+        ]
     }]
 })
 

+ 1 - 0
src/views/HomePage.vue → src/views/Home.vue

@@ -5,6 +5,7 @@
 <template>
 
   <Header/>
+  <router-view />
 
 </template>