基于 Vue3 生态开发校园二手交易管理系统
一、项目概述
1.1 选题背景
校园二手交易效率低、信息不透明,本项目用 Vue3 开发交易管理系统,覆盖商品发布 / 交易 / 后台管理,兼具实用性与技术实践价值。
1.2 技术栈选型
|
技术领域 |
选型工具 / 框架 |
说明 |
|
前端框架 |
Vue3 + Vite |
支持 Composition API |
|
UI 组件库 |
Element Plus |
适配 Vue3 |
|
状态管理 |
Pinia |
替代 Vuex |
|
路由 / 请求 |
Vue Router 4 / Axios |
路由控制 / 接口请求 |
|
后端 |
Node.js + Express + MySQL |
简易接口与数据存储 |
二、系统设计
2.1 核心功能模块
- 前台:登录 / 注册、商品列表 / 详情、发布商品、我的订单
- 后台:用户管理、商品审核、订单管理、数据统计
2.2 核心数据库表
|
-- 用户表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, role ENUM('user','admin') DEFAULT 'user', create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 商品表 CREATE TABLE goods ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, user_id INT, status ENUM('pending','passed','rejected'), FOREIGN KEY (user_id) REFERENCES users(id) ); |
2.3 前端目录结构
三、核心功能实现(精简版)
3.1 项目初始化
|
npm create vite@latest vue-secondhand -- --template vue npm install element-plus pinia vue-router@4 axios |
3.2 路由配置(含权限)
|
import { createRouter, createWebHistory } from 'vue-router' import { useUserStore } from '@/store/user' const routes = [ // 前台路由 { path: '/', component: () => import('@/layouts/FrontLayout.vue'), children: [ { path: '', component: () => import('@/views/front/Index.vue') }, { path: 'publish', component: () => import('@/views/front/PublishGoods.vue'), meta: { requireAuth: true } } ] }, // 后台路由(需管理员权限) { path: '/admin', component: () => import('@/layouts/AdminLayout.vue'), meta: { requireAuth: true, requireAdmin: true }, children: [{ path: 'goods', component: () => import('@/views/admin/GoodsManagement.vue') }] }, { path: '/login', component: () => import('@/views/Login.vue') } ] const router = createRouter({ history: createWebHistory(), routes }) // 路由守卫 router.beforeEach((to, from, next) => { const userStore = useUserStore() if (to.meta.requireAuth && !userStore.token) next('/login') else if (to.meta.requireAdmin && userStore.role !== 'admin') next('/') else next() }) export default router |
3.3 Pinia 状态管理(用户)
|
import { defineStore } from 'pinia' import { login, getUserInfo } from '@/api/user' export const useUserStore = defineStore('user', { state: () => ({ token: localStorage.getItem('token') || '', role: 'user' }), actions: { async login(userInfo) { const res = await login(userInfo) this.token = res.data.token localStorage.setItem('token', this.token) await this.fetchUserInfo() }, async fetchUserInfo() { const res = await getUserInfo() this.role = res.data.role }, logout() { this.token = ''; localStorage.removeItem('token') } } }) |
3.4 商品发布页面(核心代码)
3.4 商品发布页面(核心代码)
|
<template> <el-form :model="form" :rules="rules" ref="formRef"> <el-form-item label="标题" prop="title"><el-input v-model="form.title"></el-input></el-form-item> <el-form-item label="价格" prop="price"><el-input v-model="form.price" type="number"></el-input></el-form-item> <el-button type="primary" @click="submit">提交</el-button> </el-form> </template> <script setup> import { ref } from 'vue' import { ElMessage } from 'element-plus' import { publishGoods } from '@/api/goods' const formRef = ref(null) const form = ref({ title: '', price: '' }) const rules = ref({ title: [{ required: true, message: '请输标题', trigger: 'blur' }], price: [{ required: true, message: '请输价格', trigger: 'blur' }] }) const submit = async () => { await formRef.value.validate() await publishGoods(form.value) ElMessage.success('发布成功') } </script> |
四、关键开发踩坑
- Vue3 生命周期:Composition API 需导入onMounted,而非 Vue2 的mounted
解:import { onMounted } from 'vue'; onMounted(() => { ... })
- Pinia 状态持久化:刷新后状态丢失
解:关键状态(如 token)存入localStorage,初始化时读取
|
src/ ├── api/ # 接口封装 ├── components/ # 公共组件 ├── router/ # 路由配置 ├── store/ # Pinia状态 ├── views/ # 页面(front前台/admin后台) ├── App.vue # 根组件 └── main.js # 入口 |
更多推荐



所有评论(0)