当前位置: 首页 > news >正文

《从零搭建Vue3项目实战》零基础入门一篇通关(AI辅助搭建Vue3+ElemntPlus后台管理项目)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

  • 《从零搭建Vue3项目实战》零基础入门一篇通关(AI辅助搭建Vue3+ElemntPlus后台管理项目)
    • 1. 开发环境准备
      • 1.1 Node环境安装和配置
      • 1.2 VsCode开发工具安装和配置
      • 1.3 AI辅助工具插件安装
      • 1.4 Vue官方插件
      • 1.5 浏览器跳转插件Live Server
      • 1.6 VSCode自动保存
    • 2. 项目创建
      • 2.1 创建命令
      • 2.2 配置镜像源
      • 2.3 创建过程
    • 3. 项目启动
    • 4. 初始化项目
      • 4.1 项目文件(夹)说明
      • 4.2 运行服务
      • 4.3 删除、修改代码
      • 4.5 阶段源码
    • 5. 引入ElementPlus
      • 5.1 安装ElementPlus
      • 5.2 引入ElementPlus
      • 5.3 使用ElementPlus组件
    • 6. 登陆页面
      • 6.1 LoginView.vue
      • 6.2 src/main.js
      • 6.3 src/router/index.js
      • 6.4 登录页背景图
      • 6.5 调试工具插件
    • 7. 如何使用AI学习代码
    • 8. 页面优化
      • 8.1 main.js
      • 8.2 main.css
      • 8.3 页面效果
    • 9. 页面跳转
      • 9.1 安装Router
      • 9.2 配置Router
      • 9.3 使用路由Router
      • 9.4 登录页代码使用router进行页面跳转
      • 9.5 首页代码更新(HomeView.vue)
      • 9.6 页面跳转测试
    • 10. 菜单栏实现
      • 10.1 提示词
      • 10.2 AI生成代码
      • 10.3 代码使用
      • 10.4 代码内容
      • 10.5 代码调试
    • 11. 菜单栏优化
      • 11.1 菜单栏右侧展示选中菜单内容
      • 11.2 菜单栏背景色优化
      • 11.3 菜单栏菜单跳转页面优化
      • 11.4 element-plus图标全局引入
    • 12. 阶段项目代码
    • 13. 用户管理
      • 13.1 AI提示词
      • 13.2 生成代码(UsermanagementView.vue)
      • 13.3 页面效果
    • 14. 商品管理
      • 14.1 AI提示词
      • 14.2 代码更新
      • 14.3 页面效果
    • 15. 订单管理
      • 15.1 线上订单
        • 15.1.1 AI提示词
        • 15.1.2 生成代码
        • 15.1.3 页面效果
      • 15.2 线下订单
        • 15.2.1 AI提示词
        • 15.2.2 生成代码
        • 15.2.3 页面效果
    • 16. 数据统计
      • 16.1 使用echarts
      • 16.2 折线图实现
      • 16.3 折线图优化
    • 17. 项目源码(完结)


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

《从零搭建Vue3项目实战》零基础入门一篇通关(AI辅助搭建Vue3+ElemntPlus后台管理项目)

从零搭建Vue3项目实战,借助AI工具辅助学习和代码生成,零基础小白亦可轻松上手实现。

1. 开发环境准备

1.1 Node环境安装和配置

检查环境
返回版本则表示已经安装配置,否则则参考文章进行安装配置:node的下载、安装、配置和使用(node.js下载安装和配置、npm命令汇总、cnpm的使用)

node -v
npm -v

在这里插入图片描述

1.2 VsCode开发工具安装和配置

VSCode下载安装指南

1.3 AI辅助工具插件安装

VSCode中搜索插件Lingma(Lingma - Alibaba Cloud AI Coding Assistant)
检查是否已安装,未安装直接安装,并登录阿里云账号,可用淘宝、支付宝、阿里云、钉钉登录
在这里插入图片描述

1.4 Vue官方插件

Vue插件安装
搜索Vue Officail插件,如未安装直接安装,Vue official 用于前端框架vue开发项目
在这里插入图片描述

1.5 浏览器跳转插件Live Server

Live Server 用于从vscode中打开页面到浏览器
安装Live Server后可直接在代码页面鼠标右键跳转到浏览器打开
在这里插入图片描述

1.6 VSCode自动保存

SettingsUserCommonly UsedFiles: Auto Save项,默认off,修改为afterDelay
修改后会自动保存你修改的代码,无需按Ctrl+S,(页面自动刷新)
在这里插入图片描述


2. 项目创建

2.1 创建命令

在任意文件夹下(这里创建一个vue3文件夹),路径中输入cmd回车,打开cmd窗口
在这里插入图片描述

输入命令

npm create vue

2.2 配置镜像源

如果由于网络问题,通过默认的node地址拉取失败
可参考如下,将拉去地址修改为淘宝镜像地址,最新的淘宝镜像源已更新为

npm config set registry https://registry.npmmirror.com

回车后再用下面命令查看更新后的镜像地址

npm config get registry

然后再次执行创建命令

npm create vue

2.3 创建过程

创建过程如下
输入y继续创建
在这里插入图片描述

输入项目名称,这里自定义为vue3-demo001
然后回车
选择需要的模块,这里直接选择Router和Pinia,上下箭头切换,空格键选择,回车确认
在这里插入图片描述

回车后,创建成功
项目生成后,输出内容中有三条命令如下图红框
在这里插入图片描述


3. 项目启动

依次执行红框中的三条命令,运行项目

cd vue3-demo001
npm install
npm run dev

执行结束后如下,会有本地的服务访问地址,如红框
在这里插入图片描述

浏览器输入访问地址即可访问服务,如下访问成功
在这里插入图片描述


4. 初始化项目

创建后的项目,页面是默认的,很多东西不需要,不删除的话对后续的页面效果会有影响
在删之前我们先用VSCode打开项目文件夹(后续就在VSCode中开发项目)
注:将之前打开的cmd窗口(服务运行的窗口)关闭

4.1 项目文件(夹)说明

选择项目文件夹,鼠标右键使用VSCode打开
在这里插入图片描述

项目文件夹中的各文件夹和文件的描述:参考文章–vue项目结构详解
在这里插入图片描述

4.2 运行服务

菜单栏中TerminalNew Terminal打开终端窗口
在这里插入图片描述

执行命令运行项目

npm install
npm run dev

输出内容中有Local:本地访问地址
按Ctrl+鼠标左键点击地址即可跳转到服务页面
在这里插入图片描述

4.3 删除、修改代码

删除代码如下
需要删除的文件
src/components/HelloWorld.vue
src/components/TheWelcome.vue
src/components/WelcomeItem.vue
src/views/AboutView.vue

删除以下红框中的文件
在这里插入图片描述

需要修改的文件
src/App.vue
src/main.js
src/views/HomeView.vue
如如中红框(AboutView.vue除外)
在这里插入图片描述

App.vue
对App.vue文件进行修改如下
将内容删除,只留框架,并引入router-view标签,动态加载
代码如下

<script setup>

</script>

<template>
  <router-view />
</template>

<style scoped>

</style>

main.js
对main.js文件的修改如下
将样式注释,否则内容会被默认样式设置为居中
代码如下

// import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'

const app = createApp(App)

app.use(createPinia())
app.use(router)

app.mount('#app')

HomeView.vue
对HomeView.vue文件的修改如下
将内容删除只留框架
代码如下

<script setup>

</script>

<template>
    <div>HomeView</div>
</template>

<style scoped>

</style>

运行项目,访问页面,页面如下
在这里插入图片描述

经过以上操作,项目的初始化状态完成,接下来就可以开始项目的开发

4.5 阶段源码

初始化后项目源码
CSDN下载:前端 vue3 vue3入门实战 从零搭建vue3+element-plus后台管理项目 阶段0项目源码 项目初始化源码


5. 引入ElementPlus

开发中会使用到ElementPlus,这里先引入
可以通过AI进行提问:

vue3中如何引入ElementPlus

在这里插入图片描述
如图中给出的回答,并且会跳出一个代码对比窗口,左侧为main.js的旧代码,右侧为AI给出的含有引入element-plus的新代码

第一步先安装element-plus库,第二步引入

5.1 安装ElementPlus

命令(在终端窗口中执行,如果项目正在运行,可以新开一个Terminal窗口进行执行命令)

npm install element-plus --save

安装截图(我这里已经安装过了,再次安装就是更新内容)
在这里插入图片描述

5.2 引入ElementPlus

在代码对此窗口中选择需要使用的代码,这里直接使用引入element-plus的部分就可以
在在代码对比界面右上角有一个Accept,直接点击即可接收AI推荐代码
在这里插入图片描述如果没有使用成功,可以再输入vue3中如何引入ElementPlus给AI,回车后再点Accept进行使用
引入后的完整main.js代码如下

// import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.use(ElementPlus) // 添加: 使用ElementPlus

app.mount('#app')

5.3 使用ElementPlus组件

引入后,可访问Elementplus的网址选择自己需要的组件进行复制修改使用
这里以按钮为例
ElementPlus官网组件地址

在组件界面找到左侧Basic基础组件–Button按钮–基础用法,代开代码,复制红框的代码
在这里插入图片描述

    <el-button>Default</el-button>
    <el-button type="primary">Primary</el-button>
    <el-button type="success">Success</el-button>
    <el-button type="info">Info</el-button>
    <el-button type="warning">Warning</el-button>
    <el-button type="danger">Danger</el-button>

粘贴到项目的src/views/HomeView.vue代码中,粘贴后的HomeView.vue代码如下
HomeView.vue

<script setup>

</script>

<template>
    <div>HomeView</div>
    <div>
        <el-button>Default</el-button>
        <el-button type="primary">Primary</el-button>
        <el-button type="success">Success</el-button>
        <el-button type="info">Info</el-button>
        <el-button type="warning">Warning</el-button>
        <el-button type="danger">Danger</el-button>
    </div>
</template>

<style scoped>

</style>

此时项目报错了,如图
在这里插入图片描述这是因为之前的路由地址中的AboutView.vue组件已经被删除了,现在找到不到,报错了,注释那部分即可
找到src/router/index.js代码,注释或删除以下红框部分代码
在这里插入图片描述注释后的src/router/index.js代码如下

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView,
    },
    // {
    //   path: '/about',
    //   name: 'about',
    //   // route level code-splitting
    //   // this generates a separate chunk (About.[hash].js) for this route
    //   // which is lazy-loaded when the route is visited.
    //   component: () => import('../views/AboutView.vue'),
    // },
  ],
})

export default router

此时项目正常运行,浏览器访问界面如下
在这里插入图片描述
出现了刚刚配置的按钮
以上就是安装、引入、使用ElementPlus的内容


6. 登陆页面

提问ai

帮我生成一个登录页,内容需要有账号、密码输入框,一个登录按钮,登录页面背景使用一张风景图,页面尽量美观大方

回答如下
在这里插入图片描述

页面跳转到登录页组件的代码内容,如下,右侧就是生成的LoginView.vue组件的代码
在这里插入图片描述

直接在ai回答的最下面有文件名,鼠标悬浮在上面会出现Reject和Accept
在这里插入图片描述

6.1 LoginView.vue

在LoginView.vue文件上选择Accept,即可自动创建文件并填入代码
在这里插入图片描述

(也可以在src/views下创建要给LoginView.vue组件文件,然后将上面的代码复制粘贴进来)

组件代码如下
LoginView.vue

<template>
  <div class="login-container">
    <div class="login-form">
      <h2>Login</h2>
      <el-form :model="loginForm" label-width="100px">
        <el-form-item label="Account">
          <el-input v-model="loginForm.account"></el-input>
        </el-form-item>
        <el-form-item label="Password">
          <el-input type="password" v-model="loginForm.password" show-password></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleLogin">Login</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script setup>
import { reactive } from 'vue';

const loginForm = reactive({
  account: '',
  password: ''
});

const handleLogin = () => {
  // 登录逻辑
  console.log('Login form:', loginForm);
};
</script>

<style scoped>
.login-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-image: url('@/assets/login-background.jpg'); /* 确保路径正确 */
  background-size: cover;
  background-position: center;
}

.login-form {
  background: rgba(255, 255, 255, 0.8);
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
</style>

6.2 src/main.js

该部分无需修改,但在ai回答的底部仍然会有该文件,选择Accept即可
代码内容如下

// import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.use(ElementPlus) // 添加: 使用ElementPlus

app.mount('#app')

6.3 src/router/index.js

该文件代码需要加入新建登录页对应的路由,同样在文件上选择Accept接受代码
在这里插入图片描述

完成后的代码内容如下

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import LoginView from '../views/LoginView.vue' // 添加: 导入LoginView组件

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView,
    },
    {
      path: '/login', // 添加: 登录页面路由
      name: 'login',
      component: LoginView,
    },
    // {
    //   path: '/about',
    //   name: 'about',
    //   // route level code-splitting
    //   // this generates a separate chunk (About.[hash].js) for this route
    //   // which is lazy-loaded when the route is visited.
    //   component: () => import('../views/AboutView.vue'),
    // },
  ],
})

export default router

除了上面这种引入方式,如下

import LoginView from '../views/LoginView.vue' // 添加: 导入LoginView组件
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/login', // 添加: 登录页面路由
      name: 'login',
      component: LoginView,
    },
  ],
})

还可以用下面这种方式引入组件

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/login', // 添加: 登录页面路由
      name: 'login',
      component: () => import('../views/LoginView.vue'),
    },
  ],
})

现在查看浏览器页面,并无变化,也没有登录页的内容,因为当前浏览器展示的页面对应的HomeView.vue组件,
想要展示登录页组件对应页面需要将对应的路由改为LoginView.vue组件
最终修改后的src/router/index.js代码如下

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/', // 添加: 登录页面路由
      name: 'login',
      component: () => import('../views/LoginView.vue'),
    },
    {
      path: '/home',
      name: 'home',
      component: HomeView,
    },

  ],
})

export default router

访问浏览器页面,如下
在这里插入图片描述

6.4 登录页背景图

准备一张图片,最好是宽的,即横图,如下
在这里插入图片描述

然后放到src/assets目录下
在这里插入图片描述修改src/views/LoginView.vue组件中的代码路径,如下图位置代码修改为刚刚存入的图片路径即可
在这里插入图片描述

  background-image: url('@/assets/login01img.jpg'); /* 确保路径正确 */

修改后的组件完整代码如下
LoginView.vue

<template>
  <div class="login-container">
    <div class="login-form">
      <h2>Login</h2>
      <el-form :model="loginForm" label-width="100px">
        <el-form-item label="Account">
          <el-input v-model="loginForm.account"></el-input>
        </el-form-item>
        <el-form-item label="Password">
          <el-input type="password" v-model="loginForm.password" show-password></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleLogin">Login</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script setup>
import { reactive } from 'vue';

const loginForm = reactive({
  account: '',
  password: ''
});

const handleLogin = () => {
  // 登录逻辑
  console.log('Login form:', loginForm);
};
</script>

<style scoped>
.login-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-image: url('@/assets/login01img.jpg'); /* 确保路径正确 */
  background-size: cover;
  background-position: center;
}

.login-form {
  background: rgba(255, 255, 255, 0.8);
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
</style>

查看浏览器页面,登录页已有背景图,如下
在这里插入图片描述

6.5 调试工具插件

不知道是不是新版的vue创建都会自带调试工具插件,这里登录页面出现了一个小图标,如下
在这里插入图片描述
鼠标悬浮上面则会出现如下图标
在这里插入图片描述
点击打开是这样的
在这里插入图片描述这是Vue的调试插件,‌VueDevTool是一款用于调试和开发Vue.js应用的浏览器扩展工具‌。它提供了丰富的功能,帮助开发者更高效地调试和优化Vue.js应用。
暂时用不到,先关了
关闭方法,在项目中找到vite.config.js文件(一般在最下面),在其中将下面这行代码注释即可
在这里插入图片描述注释后的完整代码如下
vite.config.js

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    // vueDevTools(),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    },
  },
})

查看浏览器登录页面,组件图标已经没了
在这里插入图片描述以上就是登录页的实现

7. 如何使用AI学习代码

实现登录页代码后,对代码内容不太理解,可通过AI学习代码
打开LoginView.vue组件代码,选中想要学习的代码,右键选择通义灵码Lingma)然后选择解释代码Explain
在这里插入图片描述解释结果如下
在这里插入图片描述
这里解释内容有点少,我们让他详细一些
提示词输入

详细一点

在这里插入图片描述
英文看不太懂,让他使用中文解释一遍
提示词

使用中文解释

在这里插入图片描述

代码解释内容如下

# 代码解释  
这段代码是一个基于 Vue 3 的登录页面组件 (`LoginView.vue`),包含以下功能:  
1. **模板部分**- 使用 `el-form``el-form-item` 组件(来自 Element Plus)构建了一个登录表单。  
   - 表单包含两个输入框:一个是账户名(`Account`),另一个是密码(`Password`,支持密码显示/隐藏)。  
   - 提交按钮绑定 `handleLogin` 方法,点击时触发登录逻辑。  

2. **脚本部分**- 使用 Vue 3`reactive` API 定义了一个响应式对象 `loginForm`,包含 `account``password` 两个字段。  
   - `handleLogin` 方法目前仅打印登录表单数据到控制台,实际登录逻辑可以在此扩展。  

3. **样式部分**- 页面背景使用了图片(`login01img.jpg`),并通过 CSS 设置了全屏居中布局。  
   - 登录表单区域设置了半透明背景、圆角边框和阴影效果,提升视觉体验。  

# 控制流图  
flowchart TD
    A[用户访问登录页] --> B[加载登录表单]
    B --> C[用户输入账号和密码]
    C --> D[用户点击登录按钮]
    D --> E[调用 handleLogin 方法]
    E --> F[打印登录表单数据]

解释相当详细,可以跟着学习,其他代码学习方法同理

除了上面的选中右键使用通义灵码,也可以将代码复制,然后打开TongYi Lingma问答窗口粘贴内容进行提问学习

帮我解释以下代码"代码内容"

8. 页面优化

现在看到页面中背景图并没有全部铺满整个屏幕,四周边上都有空白
在这里插入图片描述

想要铺满,我们需要修改一些代码
首先是在src/main.js打开默认的样式配置,然后注释原来的src/assets/main.css样式中的代码,不使用默认的设置

8.1 main.js

在src/main.js中放开下面这行代码,使用默认引入的样式文件main.css

// import './assets/main.css'

在这里插入图片描述
修改后的main.js代码如下

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.use(ElementPlus) // 添加: 使用ElementPlus

app.mount('#app')

8.2 main.css

修改默认的样式代码src/assets/main.css,将第二行开始到最后的代码全部注释掉,如下图
在这里插入图片描述

修改后的main.css代码如下

@import './base.css';
/* 
#app {
  max-width: 1280px;
  margin: 0 auto;
  padding: 2rem;
  font-weight: normal;
}

a,
.green {
  text-decoration: none;
  color: hsla(160, 100%, 37%, 1);
  transition: 0.4s;
  padding: 3px;
}

@media (hover: hover) {
  a:hover {
    background-color: hsla(160, 100%, 37%, 0.2);
  }
}

@media (min-width: 1024px) {
  body {
    display: flex;
    place-items: center;
  }

  #app {
    display: grid;
    grid-template-columns: 1fr 1fr;
    padding: 0 2rem;
  }
} */

8.3 页面效果

此时页面效果如下,边框无空白,且右侧的滚动条也没了,背景铺满
在这里插入图片描述以上就是页面边框优化部分内容


9. 页面跳转

在完成登录页的功能后,如何实现登录后跳转到首页,下面进行实现
提问AI:

如何使用router进行页面跳转

ai回答先让安装router,然后配置router,最后使用router,我们之前在创建项目时已经勾选了router,所以安装和引入就不需要了,直接使用即可,但为了更熟悉router的内容,这里也将安装和引入步骤写上,你无需操作,直接从使用那一步开始即可

9.1 安装Router

安装router的命令,默认下载最新版本

npm install vue-router

如图中的命令不是完全正确,@符号后跟的是版本号,可指定版本
在这里插入图片描述

9.2 配置Router

在src/router/index.js代码中配置router,注意,这里可能和之前的代码有所区别,无需修改原来的代码,这里也可以参考

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import LoginView from '../views/LoginView.vue';
import HomeView from '../views/HomeView.vue'; // 假设你有一个 HomeView.vue 页面

const routes = [
  {
    path: '/',
    name: 'Login',
    component: LoginView
  },
  {
    path: '/home',
    name: 'Home',
    component: HomeView
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

如下图
在这里插入图片描述

9.3 使用路由Router

在main.js中使用路由配置,ai回答的main.js的代码如下(无需修改原来的代码,这里知识ai回答的使用方法)

// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

const app = createApp(App);
app.use(router);
app.mount('#app');

ai回答如下图
在这里插入图片描述

9.4 登录页代码使用router进行页面跳转

ai回答第四步,在LoginView.vue中修改handleLogin方法中的代码,使用router进行页面跳转
应用后的代码如下,先将原来的LoginVeiw.vue代码内容全部删除,将ai回答的代码使用右上角的使用代码图标应用代码,如下图
在这里插入图片描述
在这里插入图片描述

更新后的完整代码如下(最终使用的代码)
LoginView.vue

<template>
  <div class="login-container">
    <div class="login-form">
      <h2>Login</h2>
      <el-form :model="loginForm" label-width="100px">
        <el-form-item label="Account">
          <el-input v-model="loginForm.account"></el-input>
        </el-form-item>
        <el-form-item label="Password">
          <el-input type="password" v-model="loginForm.password" show-password></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleLogin">Login</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script setup>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';

const router = useRouter();

const loginForm = reactive({
  account: '',
  password: ''
});

const handleLogin = () => {
  // 登录逻辑
  console.log('Login form:', loginForm);
  // 假设登录成功后跳转到 Home 页面
  router.push({ name: 'Home' });
};
</script>

<style scoped>
.login-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-image: url('@/assets/login01img.jpg'); /* 确保路径正确 */
  background-size: cover;
  background-position: center;
}

.login-form {
  background: rgba(255, 255, 255, 0.8);
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
</style>

9.5 首页代码更新(HomeView.vue)

跳转后的首页界面代码修改,将原来的代码删除,然后在ai回答的HomeView.vue代码内容右上角使用代码
在这里插入图片描述

更新后的代码如下
HomeView.vue

<!-- src/views/HomeView.vue -->
<template>
  <div class="home-container">
    <h1>Welcome to Home Page</h1>
  </div>
</template>

<style scoped>
.home-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #f0f0f0;
}
</style>

9.6 页面跳转测试

打开浏览器,访问登录页,输入内容后点击登录按钮
出现问题了,并没有正确跳转到首页页面,浏览器页面鼠标右键打开检查Inspect),打开控制台,如下
在这里插入图片描述报错内容如下

runtime-core.esm-bundler.js:268 
 Uncaught Error: No match for
 {"name":"Home","params":{}}
    at handleLogin (LoginView.vue:35:10)

no match for name Home表示无法匹配路由地址名Home,代码在LoginView.vue的35行
这里跳转过去的路由地址的名称为Home
在这里插入图片描述

但路由router/index.js中配置的是home,如下图
在这里插入图片描述两个地方的名称不一致,现在修改为一致即可
将LoginView.vue中的Home修改为home
修改后的LoginView.vue代码如下

<template>
  <div class="login-container">
    <div class="login-form">
      <h2>Login</h2>
      <el-form :model="loginForm" label-width="100px">
        <el-form-item label="Account">
          <el-input v-model="loginForm.account"></el-input>
        </el-form-item>
        <el-form-item label="Password">
          <el-input type="password" v-model="loginForm.password" show-password></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleLogin">Login</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script setup>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';

const router = useRouter();

const loginForm = reactive({
  account: '',
  password: ''
});

const handleLogin = () => {
  // 登录逻辑
  console.log('Login form:', loginForm);
  // 假设登录成功后跳转到 Home 页面
  router.push({ name: 'home' });
};
</script>

<style scoped>
.login-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-image: url('@/assets/login01img.jpg'); /* 确保路径正确 */
  background-size: cover;
  background-position: center;
}

.login-form {
  background: rgba(255, 255, 255, 0.8);
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
</style>

再次访问浏览器,登录,页面正常跳转到HomeView.vue对应的页面,如下
在这里插入图片描述
以上就是页面跳转的内容


10. 菜单栏实现

在首页组件HomeView.vue中实现菜单栏功能
对ai提问,注意,ai有两个入口,左边是AI chat右边是AI Deverloper
正常学习问答选左边,解释代码也是默认左边AI chat
代码开发,功能代码提问来实现代码则选右边AI Deverloper

10.1 提示词

如下选择右侧AI Deverloper
提问词:

帮我实现左侧菜单栏,菜单包含:用户管理、商品管理、订单管理、数据统计。其中订单管理菜单下有两个子菜单分别是线上订单和线下订单

ai回答结果如下
在这里插入图片描述
这里是英文(VSCode未使用中文插件),向让他回答中文,下拉到最底下,点击中文即可
在这里插入图片描述

10.2 AI生成代码

中文回答如下,修改代码的组件为router/index.js和src/views/HomeView.vue
在这里插入图片描述

10.3 代码使用

我们可以想之前一样在上图中红框内文件位置选择Accept接受代码,也可以像下面界面右上角选择Accept接受(鼠标先左键点击一下右边代码界面才会出现Accept)
注意:鼠标左键点击一侧后,再点Accept就表示接受刚刚鼠标点的那一侧的代码,故鼠标点击右侧新生成的代码,然后点击Accept接受新代码
在这里插入图片描述接收后代码更新,然后会弹出下一个需要修改的代码文件router/index.js
同样选择接受Accept,选择后代码更新
在这里插入图片描述

10.4 代码内容

如下贴出AI生成的两个文件中的完整代码
src/views/HomeView.vue

<template>
  <div class="home-container">
    <el-menu
      default-active="1"
      class="el-menu-vertical-demo"
      :collapse="isCollapse"
    >
      <el-sub-menu index="1">
        <template #title>
          <el-icon><user /></el-icon>
          <span>User Management</span>
        </template>
        <el-menu-item index="1-1" @click="navigateTo('user-management')">Users</el-menu-item>
        <el-menu-item index="1-2" @click="navigateTo('roles')">Roles</el-menu-item>
      </el-sub-menu>
      <el-sub-menu index="2">
        <template #title>
          <el-icon><goods /></el-icon>
          <span>Product Management</span>
        </template>
        <el-menu-item index="2-1" @click="navigateTo('products')">Products</el-menu-item>
        <el-menu-item index="2-2" @click="navigateTo('categories')">Categories</el-menu-item>
      </el-sub-menu>
      <el-sub-menu index="3">
        <template #title>
          <el-icon><tickets /></el-icon>
          <span>Order Management</span>
        </template>
        <el-menu-item index="3-1" @click="navigateTo('online-orders')">Online Orders</el-menu-item>
        <el-menu-item index="3-2" @click="navigateTo('offline-orders')">Offline Orders</el-menu-item>
      </el-sub-menu>
      <el-menu-item index="4" @click="navigateTo('data-statistics')">
        <el-icon><data-analysis /></el-icon>
        <span>Data Statistics</span>
      </el-menu-item>
    </el-menu>
    <div class="content">
      <h1>Welcome to Home Page</h1>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import {
  User,
  Goods,
  Tickets,
  DataAnalysis,
} from '@element-plus/icons-vue';

const router = useRouter();
const isCollapse = ref(false);

const navigateTo = (routeName) => {
  router.push({ name: routeName });
};
</script>

<style scoped>
.home-container {
  display: flex;
  height: 100vh;
  background-color: #f0f0f0;
}

.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}

.content {
  flex: 1;
  padding: 20px;
}
</style>

src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'login',
      component: () => import('../views/LoginView.vue'),
    },
    {
      path: '/home',
      name: 'home',
      component: HomeView,
    },
    {
      path: '/user-management',
      name: 'user-management',
      component: () => import('../views/UserManagementView.vue'),
    },
    {
      path: '/roles',
      name: 'roles',
      component: () => import('../views/RolesView.vue'),
    },
    {
      path: '/products',
      name: 'products',
      component: () => import('../views/ProductsView.vue'),
    },
    {
      path: '/categories',
      name: 'categories',
      component: () => import('../views/CategoriesView.vue'),
    },
    {
      path: '/online-orders',
      name: 'online-orders',
      component: () => import('../views/OnlineOrdersView.vue'),
    },
    {
      path: '/offline-orders',
      name: 'offline-orders',
      component: () => import('../views/OfflineOrdersView.vue'),
    },
    {
      path: '/data-statistics',
      name: 'data-statistics',
      component: () => import('../views/DataStatisticsView.vue'),
    },
  ],
})

export default router

10.5 代码调试

将上面的代码更新后访问浏览器页面,报错了
在这里插入图片描述

不管你报错内容是什么,先跟着做一遍以下尝试

首先菜单栏对应的组件我们之前是没有的,现在它需要创建所有菜单的组件文件,以下依次在src/views目录下创建src/index.js中新增的组件文件
组件列表如下

UserManagementView.vue
RolesView.vue
ProductsView.vue
CategoriesView.vue
OnlineOrdersView.vue
OfflineOrdersView.vue
DataStatisticsView.vue

每一个组件创建后都要填入初始代码结构,以用户管理组件UserManagementView.vue为例,代码内容如下

<template>
    <div>UserManagementView</div>
</template>
  
<script setup>

</script>

<style scoped>

</style>

创建后如下
在这里插入图片描述
此时再访问浏览器,登录界面如下
在这里插入图片描述随便输入账号密码,登录进去,菜单栏已经有了,如下
在这里插入图片描述点击尝试子菜单功能是否正常
在这里插入图片描述
点击子菜单Users,跳转到对应页面
在这里插入图片描述

以上就是菜单栏的实现内容


11. 菜单栏优化

11.1 菜单栏右侧展示选中菜单内容

每次点击菜单栏中的某个菜单时,右侧显示菜单对应页面的内容
AI提示词

补充上次的描述,HomeView.vue组件是首页,首页的左侧为菜单栏,右侧则为菜单导航栏对应点的页面内容,项目已经引入router和elementplus,请帮我实现以上功能

注,不是每次都可以完整使用ai的代码,如果有问题可以自行修改或者继续问ai解决方法,最直接的办法就是使用我的代码,复制粘贴即可
优化后的代码如下
src/views/HomeView.vue

<template>
  <div class="home-container">
    <el-menu
      default-active="1"
      class="el-menu-vertical-demo"
      :collapse="isCollapse"
    >
      <el-sub-menu index="1">
        <template #title>
          <el-icon><User /></el-icon>
          <span>User Management</span>
        </template>
        <el-menu-item index="1-1" @click="navigateTo('user-management')">Users</el-menu-item>
        <el-menu-item index="1-2" @click="navigateTo('roles')">Roles</el-menu-item>
      </el-sub-menu>
      <el-sub-menu index="2">
        <template #title>
          <el-icon><Goods /></el-icon>
          <span>Product Management</span>
        </template>
        <el-menu-item index="2-1" @click="navigateTo('products')">Products</el-menu-item>
        <el-menu-item index="2-2" @click="navigateTo('categories')">Categories</el-menu-item>
      </el-sub-menu>
      <el-sub-menu index="3">
        <template #title>
          <el-icon><Tickets /></el-icon>
          <span>Order Management</span>
        </template>
        <el-menu-item index="3-1" @click="navigateTo('online-orders')">Online Orders</el-menu-item>
        <el-menu-item index="3-2" @click="navigateTo('offline-orders')">Offline Orders</el-menu-item>
      </el-sub-menu>
      <el-menu-item index="4" @click="navigateTo('data-statistics')">
        <el-icon><DataAnalysis /></el-icon>
        <span>Data Statistics</span>
      </el-menu-item>
    </el-menu>
    <div class="content">
      <router-view></router-view>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import {
  User,
  Goods,
  Tickets,
  DataAnalysis,
} from '@element-plus/icons-vue';

const router = useRouter();
const isCollapse = ref(false);

const navigateTo = (routeName) => {
  router.push({ name: routeName });
};
</script>

<style scoped>
.home-container {
  display: flex;
  height: 100vh;
  background-color: #f0f0f0;
}

.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}

.content {
  flex: 1;
  padding: 20px;
}
</style>

更新代码后,好像页面跳转并不能实现,先接着看,这个问题在后面解决,我们先给菜单栏搞个深一点的颜色

11.2 菜单栏背景色优化

给菜单栏换个深色背景
A提示词:

将HomeView.vue组件中的内容使用vue-router实现,并且导航栏背景色使用深色系

AI给出的代码如下
src/views/HomeView.vue

<template>
  <div class="home-container">
    <el-menu
      default-active="1"
      class="el-menu-vertical-demo"
      :collapse="isCollapse"
      background-color="#304156"  <!-- 修改: 导航栏背景色改为深色系 -->
      text-color="#fff"           <!-- 修改: 导航栏文字颜色改为白色 -->
      active-text-color="#ffd04b" <!-- 修改: 导航栏激活文字颜色改为亮黄色 -->
    >
      <el-sub-menu index="1">
        <template #title>
          <el-icon><User /></el-icon>
          <span>User Management</span>
        </template>
        <el-menu-item index="1-1" @click="navigateTo('user-management')">Users</el-menu-item>
        <el-menu-item index="1-2" @click="navigateTo('roles')">Roles</el-menu-item>
      </el-sub-menu>
      <el-sub-menu index="2">
        <template #title>
          <el-icon><Goods /></el-icon>
          <span>Product Management</span>
        </template>
        <el-menu-item index="2-1" @click="navigateTo('products')">Products</el-menu-item>
        <el-menu-item index="2-2" @click="navigateTo('categories')">Categories</el-menu-item>
      </el-sub-menu>
      <el-sub-menu index="3">
        <template #title>
          <el-icon><Tickets /></el-icon>
          <span>Order Management</span>
        </template>
        <el-menu-item index="3-1" @click="navigateTo('online-orders')">Online Orders</el-menu-item>
        <el-menu-item index="3-2" @click="navigateTo('offline-orders')">Offline Orders</el-menu-item>
      </el-sub-menu>
      <el-menu-item index="4" @click="navigateTo('data-statistics')">
        <el-icon><DataAnalysis /></el-icon>
        <span>Data Statistics</span>
      </el-menu-item>
    </el-menu>
    <div class="content">
      <router-view></router-view>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';
import {
  User,
  Goods,
  Tickets,
  DataAnalysis,
} from '@element-plus/icons-vue';

const router = useRouter();
const isCollapse = ref(false);

const navigateTo = (routeName) => {
  router.push({ name: routeName });
};
</script>

<style scoped>
.home-container {
  display: flex;
  height: 100vh;
  background-color: #f0f0f0;
}

.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
}

.content {
  flex: 1;
  padding: 20px;
}
</style>

更新代码后,页面的背景色变成了暗色,如下
在这里插入图片描述

11.3 菜单栏菜单跳转页面优化

上面我们实现了菜单栏以及背景色,但是页面跳转到对应菜单时,是整个页面都变成了对应菜单的页面,这个好像不太正常
正常的应该是右侧部分展示菜单对应的页面内容,左侧还是菜单栏,接下来实现这个效果
App.vue组件是整个项目的单页面应用组件,即相当于项目的门面,一切页面展示都是从这个组件进来的
我们来看一下此时此刻App.vue组件中的代码内容
App.vue

<script setup>

</script>

<template>
  <router-view />
</template>

<style scoped>

</style>

这里看到代码中的内容是展示路由对应的页面(标签router-view就是动态展示路由对应的页面),会直接整个页面都展示,所以跳转后左侧菜单栏就没了,如何解决,只需要将这里的展示页面换成首页HomeView.vue页面即可
修改后的代码如下
src/view/HomeView.vue

<script setup>
import HomeView from './views/HomeView.vue';


</script>

<template>
  <HomeView />
</template>

<style scoped>

</style>

代码更新后,点击菜单,右侧展示对应菜单内容,左侧依旧是菜单栏
以下依次为默认的用户管理页面、用户角色页面、商品管理页面的菜单内容展示
在这里插入图片描述

11.4 element-plus图标全局引入

上面我们在HomeView.vue中使用了element-plus的图标,引入方式是在组件中直接临时引入,为了方便使用,我们可以全局引入,后续无需再在新建组件中再次引入
AI提示词

全局引入elementplus图标

更新代码
src/main.js

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

// 导入 Element Plus 图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

const app = createApp(App)

// 注册 Element Plus 图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}

app.use(createPinia())
app.use(router)
app.use(ElementPlus) // 使用ElementPlus

app.mount('#app')

12. 阶段项目代码

以上算是一个大的阶段,实现了基础的项目架构和页面菜单,下面为以上实现的项目代码,后续也是在此基础上继续开发
CSDN下载:前端 vue3 vue3入门实战 从零搭建vue3+element-plus后台管理项目 阶段1项目源码
GitHub下载:


13. 用户管理

实现用户管理对应的页面组件
打开组件代码,对AI提问

13.1 AI提示词

AI提示词:

你是一名资深的前端开发,现在已经使用vue3和elemetPlus搭建了项目的基础框架,且实现了左侧菜单栏,其中有一个用户管理菜单,现在需要在原有项目基础上开发一个用户管理菜单组件对应的页面内容,在UserManegementView.vue组件中开发一个用户数据表格,表格字段有id、姓名、邮箱、角色、状态、创建时间等,数据需要你来模拟,模拟出不少于100条,并且实现分页功能,页面中展示的表格数据需要美观且宽度可以占满UsermanegementView.vue页面

在这里插入图片描述注意:生成的代码如果不满意,可以点最后的retry或者重新生成,直到满意为止,还有一点就是需要给他一些前提,如你的项目是vue3和elementplus实现的,你需要把这两个前提加上,不然他可能会不适用elementplus等实现代码

13.2 生成代码(UsermanagementView.vue)

更新后的内容如下

src/views/UserManagementView.vue

<template>
    <div class="user-management-container">
        <el-table :data="paginatedUsers" style="width: 100%">
            <el-table-column prop="id" label="ID" width="80" />
            <el-table-column prop="name" label="Name" />
            <el-table-column prop="email" label="Email" />
            <el-table-column prop="role" label="Role" width="120" />
            <el-table-column prop="status" label="Status" width="120" />
            <el-table-column prop="createdAt" label="Created At" width="160" />
        </el-table>
        <div class="pagination">
            <el-pagination
                background
                layout="prev, pager, next"
                :total="totalUsers"
                :page-size="itemsPerPage"
                :current-page="currentPage"
                @current-change="handlePageChange"
            />
        </div>
    </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const users = ref(generateMockUsers(100)); // Generate 100 mock users
const itemsPerPage = 10;
const currentPage = ref(1);

const totalUsers = computed(() => users.value.length);
const totalPages = computed(() => Math.ceil(totalUsers.value / itemsPerPage));
const paginatedUsers = computed(() => {
    const start = (currentPage.value - 1) * itemsPerPage;
    const end = start + itemsPerPage;
    return users.value.slice(start, end);
});

function generateMockUsers(count) {
    const users = [];
    for (let i = 1; i <= count; i++) {
        users.push({
            id: i,
            name: `User ${i}`,
            email: `user${i}@example.com`,
            role: i % 2 === 0 ? 'Admin' : 'User',
            status: i % 2 === 0 ? 'Active' : 'Inactive',
            createdAt: new Date().toLocaleDateString()
        });
    }
    return users;
}

function handlePageChange(page) {
    currentPage.value = page;
}
</script>

<style scoped>
.user-management-container {
    padding: 20px;
}

.el-table {
    margin-bottom: 20px;
}

.pagination {
    display: flex;
    justify-content: center;
}
</style>

13.3 页面效果

页面效果展示
在这里插入图片描述虽然不是很好看,但也凑合


14. 商品管理

接下来就是跟前面一样,让ai生成各个组件对应的功能代码

14.1 AI提示词

提问ai

你是一名资深的前端开发,已经使用vue3和elemetPlus搭建了项目的基础框架,现在需要实现商品管理菜单对应组件ProductsView.vue页面的相关功能,请在该组件页面实现商品管理数据表格,其中列名包含id、名称、分类、价格、库存、状态、操作,在操作列中有编辑、上架、下架、删除的图标按钮,模拟100条数据并实现分页功能,页面尽量美观,表格宽度占满页面

14.2 代码更新

使用ai生成的代码,应用到项目对应的ProductsView.vue文件中
scr/views/ProductsView.vue

<template>
    <div>
        <el-table :data="paginatedProducts" style="width: 100%">
            <el-table-column prop="id" label="ID" width="80"></el-table-column>
            <el-table-column prop="name" label="名称" width="180"></el-table-column>
            <el-table-column prop="category" label="分类" width="120"></el-table-column>
            <el-table-column prop="price" label="价格" width="100"></el-table-column>
            <el-table-column prop="stock" label="库存" width="100"></el-table-column>
            <el-table-column prop="status" label="状态" width="100"></el-table-column>
            <el-table-column label="操作" width="200">
                <template #default="scope">
                    <el-button type="text" @click="editProduct(scope.row)">编辑</el-button>
                    <el-button type="text" @click="toggleStatus(scope.row, '上架')">上架</el-button>
                    <el-button type="text" @click="toggleStatus(scope.row, '下架')">下架</el-button>
                    <el-button type="text" @click="deleteProduct(scope.row)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-size="pageSize"
            :total="products.length"
            layout="prev, pager, next"
            style="margin-top: 20px; text-align: center;"
        ></el-pagination>
    </div>
</template>

<script setup>
import { ref, computed } from 'vue';
import { ElTable, ElTableColumn, ElPagination, ElButton } from 'element-plus';

// 模拟100条商品数据
const products = ref(Array.from({ length: 100 }, (_, index) => ({
    id: index + 1,
    name: `商品${index + 1}`,
    category: `分类${index % 5 + 1}`,
    price: (Math.random() * 1000).toFixed(2),
    stock: Math.floor(Math.random() * 100),
    status: Math.random() > 0.5 ? '上架' : '下架',
})));

// 分页相关数据
const currentPage = ref(1);
const pageSize = 10;

// 分页计算属性
const paginatedProducts = computed(() => {
    const start = (currentPage.value - 1) * pageSize;
    const end = start + pageSize;
    return products.value.slice(start, end);
});

// 处理页码变化
const handleCurrentChange = (page) => {
    currentPage.value = page;
};

// 操作列按钮事件
const editProduct = (product) => {
    console.log('编辑商品:', product);
};

const toggleStatus = (product, status) => {
    product.status = status;
    console.log('状态切换:', product);
};

const deleteProduct = (product) => {
    const index = products.value.indexOf(product);
    if (index !== -1) {
        products.value.splice(index, 1);
    }
    console.log('删除商品:', product);
};
</script>

<style scoped>

</style>

14.3 页面效果

刷新页面查看效果
在这里插入图片描述
看起来还可以,其中上架、下架是可以实现的,编辑好像并未实现,后续可以自己尝试
以上就是商品管理的功能实现


15. 订单管理

订单管理的实现

15.1 线上订单

15.1.1 AI提示词

提问ai

你是一名资深的前端开发,现在已经使用vue3和elementplus搭建了项目的基础框架,现在需要你来实现订单管理下的线上订单菜单对应的组件OnlineOrdersView.vue页面功能,页面中的线上订单表格需要有订单相关数据信息,包括id、订单号、客户名、总价、下单时间、状态、操作,其中操作列有编辑和删除图标按钮,点击编辑可以弹出编辑订单的弹窗,订单状态分为:待配送、已送达、待评价、已完成、已取消。模拟50条数据并实现分页功能,最终页面尽量美观,表格宽度占满页面
15.1.2 生成代码

scr/views/OnlineOrdersView.vue

<template>
    <div>
        <el-table :data="paginatedOrders" style="width: 100%">
            <el-table-column prop="id" label="ID" width="80"></el-table-column>
            <el-table-column prop="orderNumber" label="订单号" width="150"></el-table-column>
            <el-table-column prop="customerName" label="客户名" width="150"></el-table-column>
            <el-table-column prop="totalPrice" label="总价" width="120"></el-table-column>
            <el-table-column prop="orderTime" label="下单时间" width="200"></el-table-column>
            <el-table-column prop="status" label="状态" width="120"></el-table-column>
            <el-table-column label="操作" width="200">
                <template #default="scope">
                    <el-button type="text" @click="editOrder(scope.row)">编辑</el-button>
                    <el-button type="text" @click="deleteOrder(scope.row)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-size="pageSize"
            :total="orders.length"
            layout="prev, pager, next"
            style="margin-top: 20px; text-align: center;"
        ></el-pagination>

        <!-- 编辑弹窗 -->
        <el-dialog v-model="editDialogVisible" title="编辑订单">
            <el-form :model="editingOrder" label-width="100px">
                <el-form-item label="订单号">
                    <el-input v-model="editingOrder.orderNumber" disabled></el-input>
                </el-form-item>
                <el-form-item label="客户名">
                    <el-input v-model="editingOrder.customerName"></el-input>
                </el-form-item>
                <el-form-item label="总价">
                    <el-input v-model="editingOrder.totalPrice"></el-input>
                </el-form-item>
                <el-form-item label="状态">
                    <el-select v-model="editingOrder.status">
                        <el-option value="待配送">待配送</el-option>
                        <el-option value="已送达">已送达</el-option>
                        <el-option value="待评价">待评价</el-option>
                        <el-option value="已完成">已完成</el-option>
                        <el-option value="已取消">已取消</el-option>
                    </el-select>
                </el-form-item>
            </el-form>
            <template #footer>
                <span class="dialog-footer">
                    <el-button @click="editDialogVisible = false">取 消</el-button>
                    <el-button type="primary" @click="saveEdit">确 定</el-button>
                </span>
            </template>
        </el-dialog>
    </div>
</template>

<script setup>
import { ref, computed } from 'vue';
import { ElTable, ElTableColumn, ElPagination, ElButton, ElDialog, ElForm, ElFormItem, ElInput, ElSelect, ElOption } from 'element-plus';

// 模拟50条订单数据
const orders = ref(Array.from({ length: 50 }, (_, index) => ({
    id: index + 1,
    orderNumber: `ORDER${index + 1}`,
    customerName: `客户${index % 10 + 1}`,
    totalPrice: (Math.random() * 1000).toFixed(2),
    orderTime: new Date(Date.now() - Math.random() * 1000000000).toLocaleString(),
    status: ['待配送', '已送达', '待评价', '已完成', '已取消'][Math.floor(Math.random() * 5)],
})));

// 分页相关数据
const currentPage = ref(1);
const pageSize = 10;

// 分页计算属性
const paginatedOrders = computed(() => {
    const start = (currentPage.value - 1) * pageSize;
    const end = start + pageSize;
    return orders.value.slice(start, end);
});

// 处理页码变化
const handleCurrentChange = (page) => {
    currentPage.value = page;
};

// 操作列按钮事件
let editingOrder = ref(null);
const editDialogVisible = ref(false);

const editOrder = (order) => {
    editingOrder.value = { ...order }; // 创建副本以避免直接修改原数据
    editDialogVisible.value = true;
};

const saveEdit = () => {
    const targetOrder = orders.value.find(o => o.id === editingOrder.value.id);
    if (targetOrder) {
        Object.assign(targetOrder, editingOrder.value); // 更新原数据
    }
    editDialogVisible.value = false;
    console.log('保存编辑:', editingOrder.value);
};

const deleteOrder = (order) => {
    const index = orders.value.indexOf(order);
    if (index !== -1) {
        orders.value.splice(index, 1);
    }
    console.log('删除订单:', order);
};
</script>

<style scoped>
.dialog-footer {
    display: flex;
    justify-content: space-between;
}
</style>
15.1.3 页面效果

页面效果如下
在这里插入图片描述

点击编辑出现弹窗,如下
在这里插入图片描述

15.2 线下订单

线下订单实现

15.2.1 AI提示词

提问ai

你是一名资深的前端开发,现在已经使用vue3和elementplus搭建了项目的基础框架,现在需要你来实现订单管理下的线上订单菜单对应的组件OfflineOrdersView.vue页面功能,页面中的线上订单表格需要有订单相关数据信息,包括id、订单号、客户名、总价、下单时间、状态、操作,其中操作列有编辑和删除图标按钮,点击编辑可以弹出编辑订单的弹窗,订单状态分为:待配送、已送达、待评价、已完成、已取消。模拟50条数据并实现分页功能,在表格数据上方实现搜索框,可根据订单号、客户名、订单状态进行查询数据,最终页面尽量美观,表格宽度占满页面

新增功能:搜索框

15.2.2 生成代码

scr/views/OfflineOrdersView.vue

<template>
    <div>
        <el-input
            v-model="searchQuery"
            placeholder="搜索订单号、客户名、订单状态"
            style="margin-bottom: 20px; width: 300px;"
        ></el-input>
        <el-table :data="filteredPaginatedOrders" style="width: 100%">
            <el-table-column prop="id" label="ID" width="80"></el-table-column>
            <el-table-column prop="orderNumber" label="订单号" width="180"></el-table-column>
            <el-table-column prop="customerName" label="客户名" width="120"></el-table-column>
            <el-table-column prop="totalPrice" label="总价" width="100"></el-table-column>
            <el-table-column prop="orderTime" label="下单时间" width="180"></el-table-column>
            <el-table-column prop="status" label="状态" width="120"></el-table-column>
            <el-table-column label="操作" width="200">
                <template #default="scope">
                    <el-button type="text" @click="editOrder(scope.row)">编辑</el-button>
                    <el-button type="text" @click="deleteOrder(scope.row)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-size="pageSize"
            :total="filteredOrders.length"
            layout="prev, pager, next"
            style="margin-top: 20px; text-align: center;"
        ></el-pagination>
        <el-dialog v-model="editDialogVisible" title="编辑订单">
            <el-form :model="editingOrder" label-width="100px">
                <el-form-item label="订单号">
                    <el-input v-model="editingOrder.orderNumber"></el-input>
                </el-form-item>
                <el-form-item label="客户名">
                    <el-input v-model="editingOrder.customerName"></el-input>
                </el-form-item>
                <el-form-item label="总价">
                    <el-input v-model="editingOrder.totalPrice"></el-input>
                </el-form-item>
                <el-form-item label="下单时间">
                    <el-input v-model="editingOrder.orderTime"></el-input>
                </el-form-item>
                <el-form-item label="状态">
                    <el-select v-model="editingOrder.status" placeholder="请选择状态">
                        <el-option label="待配送" value="待配送"></el-option>
                        <el-option label="已送达" value="已送达"></el-option>
                        <el-option label="待评价" value="待评价"></el-option>
                        <el-option label="已完成" value="已完成"></el-option>
                        <el-option label="已取消" value="已取消"></el-option>
                    </el-select>
                </el-form-item>
            </el-form>
            <template #footer>
                <span class="dialog-footer">
                    <el-button @click="editDialogVisible = false">取消</el-button>
                    <el-button type="primary" @click="saveOrder">保存</el-button>
                </span>
            </template>
        </el-dialog>
    </div>
</template>

<script setup>
import { ref, computed } from 'vue';
import { ElTable, ElTableColumn, ElPagination, ElButton, ElInput, ElDialog, ElForm, ElFormItem, ElSelect, ElOption } from 'element-plus';

// 模拟50条订单数据
const orders = ref(Array.from({ length: 50 }, (_, index) => ({
    id: index + 1,
    orderNumber: `ORD${index + 1}`,
    customerName: `客户${index % 10 + 1}`,
    totalPrice: (Math.random() * 1000).toFixed(2),
    orderTime: new Date().toLocaleString(),
    status: ['待配送', '已送达', '待评价', '已完成', '已取消'][Math.floor(Math.random() * 5)],
})));

// 分页相关数据
const currentPage = ref(1);
const pageSize = 10;

// 搜索相关数据
const searchQuery = ref('');

// 计算属性:过滤后的订单
const filteredOrders = computed(() => {
    return orders.value.filter(order => 
        order.orderNumber.includes(searchQuery.value) ||
        order.customerName.includes(searchQuery.value) ||
        order.status.includes(searchQuery.value)
    );
});

// 计算属性:分页后的订单
const filteredPaginatedOrders = computed(() => {
    const start = (currentPage.value - 1) * pageSize;
    const end = start + pageSize;
    return filteredOrders.value.slice(start, end);
});

// 处理页码变化
const handleCurrentChange = (page) => {
    currentPage.value = page;
};

// 操作列按钮事件
const editDialogVisible = ref(false);
const editingOrder = ref({});

const editOrder = (order) => {
    editingOrder.value = { ...order };
    editDialogVisible.value = true;
};

const saveOrder = () => {
    const index = orders.value.findIndex(order => order.id === editingOrder.value.id);
    if (index !== -1) {
        orders.value[index] = { ...editingOrder.value };
    }
    editDialogVisible.value = false;
};

const deleteOrder = (order) => {
    const index = orders.value.indexOf(order);
    if (index !== -1) {
        orders.value.splice(index, 1);
    }
};
</script>

<style scoped>

</style>
15.2.3 页面效果

页面效果如下
在这里插入图片描述搜索框搜索:已送达
结果如下
在这里插入图片描述
以上就是订单管理实现的所有内容


16. 数据统计

数据统计使用echarts实现,使用柱状图来分析数据

使用以折线图为例实现功能

16.1 使用echarts

提问ai

如何在vue3项目中使用echarts

根据ai回答,安装echarts
打开新的终端(Terminal)窗口,执行命令安装echarts
安装echarts

npm install echarts --save

注意:如果ai给出了数据统计页面的新代码,先不管,直接看下一步继续提问ai生成折线图

16.2 折线图实现

使用echarts实现折线图,展示订单与日期
提示词

你是一名资深前端开发,现在已经使用vue3+elementplus搭建了一个基础项目,需要你来实现数据统计页面DataStatisticsView.vue组件中的代码,使用echarts中的折线图显示订单和时间,样式尽量美观

生成代码如下
src/views/DataStaticsView.vue

<template>
    <div>
        <div ref="chart" style="width: 100%; height: 400px;"></div>
    </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';

const chart = ref(null);

// 模拟订单数据
const orders = [
    { time: '2023-10-01', count: 10 },
    { time: '2023-10-02', count: 15 },
    { time: '2023-10-03', count: 20 },
    { time: '2023-10-04', count: 25 },
    { time: '2023-10-05', count: 30 },
    { time: '2023-10-06', count: 35 },
    { time: '2023-10-07', count: 40 },
];

onMounted(() => {
    const myChart = echarts.init(chart.value);
    const option = {
        title: {
            text: '订单数量统计',
            left: 'center',
            textStyle: {
                fontSize: 18,
                fontWeight: 'bold',
            },
        },
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'cross',
                label: {
                    backgroundColor: '#6a7985',
                },
            },
        },
        xAxis: {
            type: 'category',
            data: orders.map(order => order.time),
            axisLabel: {
                interval: 0,
                rotate: 45,
                fontSize: 12,
            },
        },
        yAxis: {
            type: 'value',
            name: '订单数量',
            nameTextStyle: {
                fontSize: 14,
            },
            axisLabel: {
                formatter: '{value} 单',
            },
        },
        series: [
            {
                name: '订单数量',
                type: 'line',
                data: orders.map(order => order.count),
                smooth: true,
                itemStyle: {
                    color: '#409EFF',
                },
                areaStyle: {
                    color: {
                        type: 'linear',
                        x: 0,
                        y: 0,
                        x2: 0,
                        y2: 1,
                        colorStops: [
                            { offset: 0, color: 'rgba(64, 158, 255, 0.5)' },
                            { offset: 1, color: 'rgba(64, 158, 255, 0)' },
                        ],
                        global: false,
                    },
                },
            },
        ],
        grid: {
            left: '10%',
            right: '10%',
            bottom: '15%',
        },
    };
    myChart.setOption(option);
});
</script>

<style scoped>

</style>

页面效果
在这里插入图片描述

这个模拟的数据有点不太正常,每日都比前一日多,我们修改一下数据,将后面几个订单量减少一些

16.3 折线图优化

修改后的代码如下
src/views/DataStaticsView.vue

<template>
    <div>
        <div ref="chart" style="width: 100%; height: 400px;"></div>
    </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';

const chart = ref(null);

// 模拟订单数据
const orders = [
    { time: '2025-01-01', count: 10 },
    { time: '2025-01-02', count: 15 },
    { time: '2025-01-03', count: 20 },
    { time: '2025-01-04', count: 50 },
    { time: '2025-01-05', count: 20 },
    { time: '2025-01-06', count: 35 },
    { time: '2025-01-07', count: 16 },
];

onMounted(() => {
    const myChart = echarts.init(chart.value);
    const option = {
        title: {
            text: '订单数量统计',
            left: 'center',
            textStyle: {
                fontSize: 18,
                fontWeight: 'bold',
            },
        },
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'cross',
                label: {
                    backgroundColor: '#6a7985',
                },
            },
        },
        xAxis: {
            type: 'category',
            data: orders.map(order => order.time),
            axisLabel: {
                interval: 0,
                rotate: 45,
                fontSize: 12,
            },
        },
        yAxis: {
            type: 'value',
            name: '订单数量',
            nameTextStyle: {
                fontSize: 14,
            },
            axisLabel: {
                formatter: '{value} 单',
            },
        },
        series: [
            {
                name: '订单数量',
                type: 'line',
                data: orders.map(order => order.count),
                smooth: true,
                itemStyle: {
                    color: '#409EFF',
                },
                areaStyle: {
                    color: {
                        type: 'linear',
                        x: 0,
                        y: 0,
                        x2: 0,
                        y2: 1,
                        colorStops: [
                            { offset: 0, color: 'rgba(64, 158, 255, 0.5)' },
                            { offset: 1, color: 'rgba(64, 158, 255, 0)' },
                        ],
                        global: false,
                    },
                },
            },
        ],
        grid: {
            left: '10%',
            right: '10%',
            bottom: '15%',
        },
    };
    myChart.setOption(option);
});
</script>

<style scoped>

</style>

修改后的页面效果如下
在这里插入图片描述

除此之外还可以按照上面的提问让ai生成饼状图、柱状图等


17. 项目源码(完结)

CSDN下载:前端 vue3 vue3入门实战 从零搭建vue3+element-plus后台管理项目 阶段2项目源码
GitHub源码:


以上就是全部内容,如需更多实现细节或功能,可订阅博主专栏,更多vue相关文章可供阅读学习


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

相关文章:

  • c++:new关键字
  • 深度学习(对抗)
  • forms实现快读阅读器
  • 操作系统 第三章 内存管理
  • 爬虫:IP代理
  • HTTP 1.1 比 HTTP1.0 多了什么?(详尽版)
  • Arm CPU安全通告:基于TrustZone的Cortex-M系统面临多重故障注入攻击
  • linux多线(进)程编程——(5)虚拟内存与内存映射
  • 14、nRF52xx蓝牙学习(串口 UART 和 UARTE 外设应用)
  • 【Linux】what is pam?PAM模块学习笔记
  • CTF-WEB排行榜制作
  • JavaWeb 课堂笔记 —— 10 MySQL DML + DQL
  • Node.js介绍
  • vue入门:函数式组件
  • 实现一个动态验证码生成器:Canvas与JavaScript的完美结合
  • 《C语言中的形参与实参:理解函数调用的核心概念》
  • NVIDIA AI Aerial
  • docker 安装 jenkins
  • SpringBoot实战2
  • 【强化学习-蘑菇书-3】马尔可夫性质,马尔可夫链,马尔可夫过程,马尔可夫奖励过程,如何计算马尔可夫奖励过程里面的价值
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 遭车祸罹难的村医遇“身份”难题:镇卫生院否认劳动关系,家属上诉后二审将开庭
  • 张巍任中共河南省委副书记
  • 证监会强化上市公司募资监管七要点:超募资金不得补流、还贷
  • 国家卫健委通报:吊销肖某医师执业证书,撤销董某莹四项证书
  • 泽连斯基抵达安卡拉,称乌将派出最高级别代表团参与谈判