一、VUE3+CSS+VITE+C(工程创建与登录,退出实现, 本地存储localStorage)
1、创建vite项目
npm create vite@latest txwd_vue --template vue
选项如下:

2、运行测试

3、安装必要的依赖
#vue路由和状态管理
npm install vue-router@4 pinia
#可选:UI组件库(如Element Plus)简化样式开发
npm install elements-plus

4、项目结构
plaintext
src/├── router/ # 路由配置
│ └── index.js
├── stores/ # 状态管理
│ └── user.js # 用户登录状态
├── views/ # 页面组件
│ ├── LoginView.vue # 登录页
│ └── HomeView.vue # 首页(登录后访问)
├── App.vue # 根组件
└── main.js # 入口文件
5. 配置路由(src/router/index.js)

1 import {createRouter, createWebHistory} from 'vue-router' 2 import LoginView from '../views/LoginView.vue' 3 import HomeView from '../views/HomeView.vue' 4 import {useUserStore} from '../stores/user' 5 6 //路由守卫:未登录禁止访问首页 7 const requireAuth = (to, from, next) => { 8 const userStore = useUserStore() 9 if(userStore.isLogin) 10 { 11 next(); 12 } 13 else 14 { 15 next('/login') 16 } 17 } 18 19 const routes = [ 20 { 21 path:'/login', 22 component:LoginView 23 }, 24 { 25 path:'/', 26 component:HomeView, 27 beforeEnter:requireAuth 28 }, 29 { 30 //404重定向 31 path:'/:pathMath(.*)', 32 redirect:'/login' 33 } 34 ] 35 36 const router = createRouter({ 37 history:createWebHistory(), 38 routes 39 }) 40 41 export default router
6. 用户状态管理(src/stores/user.js)

1 import {defineStore} from 'pinia' 2 3 export const useUserStore = defineStore('user', { 4 state:() => ({ 5 isLogin:false, 6 userInfo:null 7 }), 8 actions:{ 9 //模拟登录 10 login(userName, password) 11 { 12 //实际项目中替换为接口请求 13 if('admin' === userName && '123' === password) 14 { 15 this.isLogin = true 16 this.userInfo = {userName} 17 localStorage.setItem('user', JSON.stringify(this.userInfo)) //持久化存储 18 return true 19 } 20 return false 21 }, 22 // 退出登录 23 logout() { 24 this.isLogin = false 25 this.userInfo = null 26 localStorage.removeItem('user') 27 }, 28 //初始化:从本地存储恢复状态 29 init(){ 30 const user = localStorage.getItem('user') 31 if(user) 32 { 33 this.isLogin = true 34 this.userInfo = JSON.parse(user) 35 } 36 } 37 } 38 })
7. 登录页面(src/views/LoginView.vue)

1 <template> 2 <div class="login-container"> 3 <h2>登录</h2> 4 <form @submit.prevent="handleLogin"> 5 <div class="form-group"> 6 <label>用户名</label> 7 <input type="text" v-model="userName" required placeholder="请输入用户名"> 8 </div> 9 <div class="form-group"> 10 <label>密码</label> 11 <input type="password" v-model="password" required placeholder="请输入密码"> 12 </div> 13 <button type="submit">登录</button> 14 <p v-if="errorMsg" class="error">{{ errorMsg }}</p> 15 </form> 16 </div> 17 </template> 18 19 <script setup> 20 import { ref } from "vue" 21 import { useRouter } from "vue-router" 22 import { useUserStore } from "../stores/user" 23 24 const userName = ref('') 25 const password = ref('') 26 const errorMsg = ref('') 27 const router = useRouter() 28 const userStore = useUserStore() 29 30 const handleLogin = () => { 31 const success = userStore.login(userName.value, password.value) 32 if(success) 33 { 34 router.push('/') //登录成功首页 35 } 36 else 37 { 38 errorMsg.value = '用户名或密码错误' 39 } 40 } 41 </script> 42 43 <style scoped> 44 .login-container { 45 width: 300px; 46 margin: 100px auto; 47 padding: 20px; 48 border: 1px solid #ccc; 49 border-radius: 8px; 50 } 51 .form-group{ 52 margin-bottom: 15px; 53 } 54 input{ 55 width: 100%; 56 padding: 8px; 57 margin-top: 5px; 58 } 59 button{ 60 width: 100%; 61 padding: 10px; 62 background: #42b983; 63 color: white; 64 border: none; 65 border-radius: 4px; 66 cursor: pointer; 67 } 68 .error{ 69 color: red; 70 margin-top: 0.9em; 71 font-size: 0.9em; 72 } 73 </style>
8. 首页(src/views/HomeView.vue)

1 <template> 2 <div class="home"> 3 <h2>欢迎回来,{{ useUserStore.userInfo?.userName}}</h2> 4 <button @click="handleLogout">退出登录</button> 5 </div> 6 </template> 7 8 <script setup> 9 import { useRouter } from "vue-router" 10 import { useUserStore } from "../stores/user" 11 12 const userStore = useUserStore() 13 const router = useRouter() 14 15 const handleLogout = () => { 16 userStore.logout() 17 alert("logout then login") 18 router.push('/login') 19 } 20 </script> 21 22 <style scoped> 23 .home{ 24 text-align: center; 25 margin-top: 50px; 26 } 27 button{ 28 padding: 8px 16px; 29 background: #ff4444; 30 color: white; 31 border: none; 32 border-radius: 4px; 33 cursor: pointer; 34 } 35 </style>
9. 根组件和入口文件(App.vue)

1 <template> 2 <div> 3 <!-- 4 <a href="https://vite.dev" target="_blank"> 5 <img src="/vite.svg" class="logo" alt="Vite logo" /> 6 </a> 7 <a href="https://vuejs.org/" target="_blank"> 8 <img src="./assets/vue.svg" class="logo vue" alt="Vue logo" /> 9 </a> 10 --> 11 <router-view></router-view> 12 </div> 13 </template> 14 15 <style scoped> 16 </style>
10. 运行项目
访问
http://localhost:5173 即可看到登录页面,使用 admin/123 登录后可进入首页。功能说明
- 登录验证:前端模拟用户名密码校验(实际项目需替换为接口请求)
- 路由守卫:未登录用户无法访问首页,会被重定向到登录页
- 状态持久化:登录状态保存在
localStorage,刷新页面不会丢失 - 退出功能:清除登录状态并跳转回登录页

浙公网安备 33010602011771号