Vue3-后台管理系统

目录

一、完成项目历程

1、构建项目

2、项目的自定义选项

3、 封装组件

4、配置对应页面的路由

5、从后端调接口的方式

二、引入Element Plus、Echarts、国际化组件

1、Element Plus安装

2、Echarts安装

 3、国际化

 三、介绍项目以及展示

1、项目是基于Vue3、Element Plus、Ts、vite完成等完成

2、总共分10多个页面的一个后端管理系统

3、页面展示效果


一、完成项目历程

1、构建项目

npm create vite 项目名

2、项目的自定义选项

3、 封装组件

3.1主页面写在compoent文件里

3.2子页面写在view文件里

4、配置对应页面的路由

在router文件 index.ts文件里

import { createRouter, createWebHistory } from 'vue-router'
import LoginView from '../components/LoginView.vue'
import BackstageView from '@/components/BackstageView.vue'
import StageHomePage from '@/views/StageHomePage.vue'
import OrderManage from '@/views/OrderManage.vue'
import ProductList from '@/views/ProductList.vue'
import ProductAdd from '@/views/ProductAdd.vue'
import ProductClass from '@/views/ProductClass.vue'
import ShopManage from '@/views/ShopManage.vue'
import AccountList from '@/views/AccountList.vue'
import AccountAdd from '@/views/AccountAdd.vue'
import AccountCenter from '@/views/AccountCenter.vue'
import AccountUpdatePwd from '@/views/AccountUpdatePwd.vue'
import GoodsStats from '@/views/GoodsStats.vue'
import OrderStats from '@/views/OrderStats.vue'const routes = [{path: '/',component: LoginView,},{path: '/login',component: LoginView,meta: { title: '登录页' },},{path: '/backstage',component: BackstageView,children: [//后端首页{path: '/home',component: StageHomePage,meta: { title: '后台首页' , role:['super','normal']},},//订单管理的路由{path: '/order',component: OrderManage,meta: { title: '后台首页' , role:['super','normal']},},//订单编辑{path: '/edit',name: 'edit',meta: { title: '后台首页' , role:['super']},component: () => import('@/views/OrderEdit.vue'),},//商品管理{path: '/product/list',component: ProductList,meta: { title: '后台首页' , role:['super','normal']},},{path: '/product/add',component: ProductAdd,meta: { title: '后台首页' , role:['super']},},{path: '/product/class',component: ProductClass,meta: { title: '后台首页' , role:['super','normal']},},//店铺管理{path: '/shop',component: ShopManage,meta: { title: '后台首页' , role:['super','normal']},},//账号管理{path: '/user/list',component: AccountList,meta: { title: '后台首页' , role:['super','normal']},},{path: '/user/add',component: AccountAdd,meta: { title: '后台首页' , role:['super','normal']},},{path: '/user/center',component: AccountCenter,meta: { title: '后台首页' , role:['super','normal']},},{path: '/user/updatepwd',component: AccountUpdatePwd,meta: { title: '后台首页' , role:['super','normal']},},//销售统计{path: '/goods/stats',component: GoodsStats,meta: { title: '后台首页' , role:['super']},},{path: '/order/stats',component: OrderStats,meta: { title: '后台首页' , role:['super']},},],},
]//递归控制权限路由
function AccessRoutes(routes: any[]) {return routes.filter((item: { meta: { role: string[] }; children: any[] }) => {if (item.meta?.role) {if (item.meta.role[0] === 'normal') {if (item.children) {console.log(item); //一级 把符合条件的返回出去item.children = item.children.filter(item1 => {if (child.meta?.role) {if (item1.meta.role[0] === 'normal') {// 递归调用处理三级路由if (item1.children) {item1.children = AccessRoutes(item1.children);}console.log(item1);return true;} else {return false;}} else {return false;}})}return true;} else {return false;}} else {return false;}})
}console.log(AccessRoutes(routes));const router = createRouter({history: createWebHistory(),routes,
})export default router

5、从后端调接口的方式

5.1使用封装axios

新建api/users/index.ts

import request from '@/utils/request'
import { ElMessage } from 'element-plus'
/*** 登录接口异步方法* @param data 请求参数* @returns*/
export const fetchLogin = async (data: any) => {// 在这里可以写一些其它的逻辑,比如(对请求参数做一些特殊处理)const res = await request.post('/users/checkLogin', data)if (res.code === 0) {// 成功的提示ElMessage.success(res.msg)} else {// 失败的提示ElMessage.error('失败')}return res
}//订单接口的方法
export const fetchOrderList = async (data: any) => {const res1 = await request.get('/order/list', data)return res1
}//订单详情接口方法
export const fetchOrderdetail = async (data: any) => {const res5 = await request.get('/order/detail', data)return res5
}//订单修改接口方法
export const fetchOrderdedit = async (data: any) => {const res6 = await request.post('/order/edit', data)return res6
}//商品列表接口方法
export const fetchGoodList = async (data: any) => {const res2 = await request.get('/goods/list', data)return res2
}//商品修改接口方法
export const fetchGoodedit = async (data: any) => {const res3 = await request.post('/goods/edit', data)return res3
}//删除商品接口
export const fetchGooddel = async (data: any) => {const res3 = await request.get('/goods/del', data)return res3
}//添加商品接口
export const fetchGoodadd = async (data: any) => {const res4 = await request.post('/goods/add', data)return res4
}//商品分类接口
export const fetchGoodclass = async (data: any) => {const res7 = await request.get('/goods/catelist', data)return res7
}//商品分类修改接口
export const fetchGoodeditcate = async (data: any) => {const res8 = await request.post('/goods/editcate', data)return res8
}//商品分类删除接口export const fetchGoodeddelcate = async (data: any) => {const res9 = await request.get('/goods/delcate', data)return res9
}//商品分类添加接口
export const fetchGoodaddcate = async (data: any) => {const res9 = await request.post('/goods/addcate', data)return res9
}//店铺详情接口 get
export const fetchShopinfo = async (data: any) => {const res9 = await request.get('/shop/info', data)return res9
}//店铺修改接口
export const fetchShopedit = async (data: any) => {const res10 = await request.post('/shop/edit', data)return res10
}//账号列表接口
export const fetchUserlist = async (data: any) => {const res11 = await request.get('/users/list', data)return res11
}//账号添加接口 (account pwd userGroup)
export const fetchUseradd = async (data: any) => {const res10 = await request.post('/users/add', data)return res10
}//账号批量删除 (ids)
export const fetchUsersdel = async (data: any) => {const res10 = await request.get('/users/batchdel', data)return res10
}//账号删除 (id)
export const fetchUserdel = async (data: any) => {const res10 = await request.get('/users/del', data)return res10
}//账号修改
export const fetchUseredit = async (data: any) => {const res11 = await request.post('/users/edit', data)return res11
}//核对账号密码
export const fetchUsercheckoldpwd = async (data: any) => {const res11 = await request.get('/users/checkoldpwd', data)return res11
}//导出账号
export const fetchUserexport = async (data: any) => {const res11 = await request.get('/users/export', data)return res11
}//密码修改
export const fetchUsereditpwd = async (data: any) => {const res11 = await request.post('/users/editpwd', data)return res11
}//首页报表接口
export const fetchOedertotaldata = async (data: any) => {const res12 = await request.get('/order/totaldata', data)return res12
}//订单报表接口
//http://127.0.0.1:5000/order/ordertotal
export const fetchOrdertotal = async (data: any) => {const res13 = await request.get('/order/ordertotal', data)return res13
}//商品报表接口
export const fetchGoodstotal = async (data: any) => {const res13 = await request.get('/goods/goodstotal', data)return res13
}//账号信息  http://127.0.0.1:5000/users/info
export const fetchUsersinfo = async (data: any) => {const res13 = await request.get('/users/info', data)return res13
}//修改头像
export const fetchUseravataredit = async (data: any) => {const res13 = await request.get('/users/avataredit', data)return res13
}

 新建utils/request.ts

import axios from 'axios'
import qs from 'qs'// 创建axios的实例
const instance = axios.create({baseURL: 'http://127.0.0.1:5000', // 请求的基路径timeout: 5000, // 请求超时时间
})
// 拦截器,对请求和响应做统一处理
// 请求拦截器:对前端的所有请求做统一处理,比如统一给所有请求添加请求头
instance.interceptors.request.use((config: any) => {// 对所有请求做统一处理(给鉴权接口添加鉴权字段)const token = JSON.parse(localStorage.getItem('t_k')!)// console.log(token);if (token) {config.headers.Authorization = token}return config},(err) => {console.error(err)},
)// 响应拦截器:对后端的所有响应结果做统一处理,比如异常处理
instance.interceptors.response.use((response: any) => {// TODO: 在这里判断接口异常处理逻辑(比如token失效后跳转到登录页)// console.log(response)return response.data},(err) => {// TODO: 在这里判断接口网络异常处理逻辑(比如网络超时、网络错误)console.error(err)},
)// 创建基于restful接口规范的异步请求方法
const get = async (url: string, params: any = {}) => {return await instance.get(url, { params })
}
/*** post请求方法* @param url 请求地址,eg:/users/list* @param data 请求参数,eg:{ account: '', password: '' }* @returns*/
const post = async (url: string, data: any): Promise<any> => {return await instance.post(url, qs.stringify(data))
}
const put = () => {}
const del = () => {}export default {get,post,put,del,
}

5.2在组件中使用

//首先import引入调对应接口的方法//登录的接口
import { fetchLogin } from '@/api/users';async function login() {try {const res = await fetchLogin({account: username.value,password: password.value,});console.log('登录的信息', res);} catch (error) {console.log('报错', error);}
}

二、引入Element Plus、Echarts、国际化组件

Element Puls官网icon-default.png?t=O83Ahttps://element-plus-docs.bklab.cn/zh-CN/guide/quickstart.html

1、Element Plus安装

npm install element-plus --save

1.2、全局引入

import { createApp } from 'vue';
import App from './App.vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');

1.3、vite配置

// vite.config.ts
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({// ...plugins: [// ...AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],
})

 1.4、测试使用

//引入
import {Check,Delete,Edit,Message,Search,Star,
} from '@element-plus/icons-vue'<el-button>Default</el-button>

2、Echarts安装

2.2.1、安装

npm install echarts --save

2.2.2、全局引入

import { createApp } from 'vue';
import App from './App.vue';
import * as echarts from 'echarts';const app = createApp(App);
app.config.globalProperties.$echarts = echarts;
app.mount('#app');

2.2.3、组件中使用

<template><div ref="chartDom" style="width: 600px; height: 400px;"></div>
</template><script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
import * as echarts from 'echarts';const chartDom = ref(null);
let chartInstance = null;onMounted(async () => {await nextTick();chartInstance = echarts.init(chartDom.value);const option = {title: { text: 'ECharts 示例图表' },tooltip: {},xAxis: { data: ["类别1", "类别2", "类别3", "类别4", "类别5"] },yAxis: {},series: [{ name: '数据系列', type: 'line', data: [120, 200, 150, 80, 70] }]};chartInstance.setOption(option);
});onUnmounted(() => {if (chartInstance != null && chartInstance.dispose) {chartInstance.dispose();}
});
</script>

 3、国际化

i18n官方文档icon-default.png?t=O83Ahttps://kazupon.github.io/vue-i18n/zh/introduction.html

  1. 安装vue-i18n: 使用npm或yarn来安装vue-i18n。对于Vue 3项目,确保安装的是9.x版本。

    npm install vue-i18n@9 --save
    # 或者
    yarn add vue-i18n@9
  2. 定义语言包: 在项目中创建一个locales文件夹,用于存放不同语言的资源文件。例如,创建en.jszh.js分别存放英文和中文的语言资源。

    // locales/en.js
    export default {message: {hello: 'Hello World!'}
    };// locales/zh.js
    export default {message: {hello: '你好,世界!'}
    };
  3. 创建i18n实例: 在main.js或单独的配置文件中创建vue-i18n实例,并配置语言资源和默认语言。

    import { createApp } from 'vue';
    import App from './App.vue';
    import { createI18n } from 'vue-i18n';
    import enUS from './locales/en-US.json';
    import zhCN from './locales/zh-CN.json';const i18n = createI18n({locale: 'zh-CN', // 默认语言fallbackLocale: 'en-US', // 备用语言messages: {'zh-CN': zhCN,'en-US': enUS}
    });const app = createApp(App);
    app.use(i18n);
    app.mount('#app');
  4. 在组件中使用: 在组件中使用国际化文本非常简单,只需使用$t方法。

    <template><div><p>{{ $t('message.hello') }}</p></div>
    </template>
  5. 动态切换语言: 你可以通过修改i18n.global.locale来动态切换语言。

    methods: {changeLanguage(newLocale) {this.$i18n.locale = newLocale;}
    }

 三、介绍项目以及展示

1、项目是基于Vue3、Element Plus、Ts、vite完成等完成

2、总共分10多个页面的一个后端管理系统

3、页面展示效果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477139.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mq 消费慢处理方式,rocketmq消费慢如何处理,mq如何处理消费端消费速率慢。rocketmq优化

1. 问题&#xff1a;mq消费慢&#xff0c;如何加快处理速度 2. 分析&#xff1a; 没想到吧&#xff0c;官网上就有处理方式。&#xff01; 3.链接&#xff1a; 基本最佳实践 | RocketMQ 4. 处理方式&#xff1a; 4.1 提高消费并行度 4.1.1 加机器&#xff0c;配置多个消费服…

内存级文件原理——Linux

目录 进程与文件 Linux下的文件系统 文件操作&#xff0c;及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时&#xff0c;文件必…

MATLAB矩阵元素的修改及删除

利用等号赋值来进行修改 A ( m , n ) c A(m,n)c A(m,n)c将将矩阵第 m m m行第 n n n列的元素改为 c c c&#xff0c;如果 m m m或 n n n超出原来的行或列&#xff0c;则会自动补充行或列&#xff0c;目标元素改为要求的&#xff0c;其余为 0 0 0 A ( m ) c A(m)c A(m)c将索引…

并行IO接口8255

文章目录 8255A芯片组成外设接口三个端口两组端口关于C口&#xff08;★&#xff09; 内部逻辑CPU接口 8255A的控制字&#xff08;★&#xff09;位控字&#xff08;D70&#xff09;方式选择控制字&#xff08;D71&#xff09; 8255A的工作方式工作方式0&#xff08;基本输入/输…

springboot3如何集成knife4j 4.x版本及如何进行API注解

1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…

js高级06-ajax封装和跨域

8.1、ajax简介及相关知识 8.1.1、原生ajax 8.1.1.1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 按需请求&#xff0c;可…

自然色调人像自拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 自然色调人像自拍照后期通过 Lightroom 调色&#xff0c;旨在打造出清新、自然、真实的人像效果。这种风格强调还原人物的本来面貌&#xff0c;同时增强照片的色彩和光影表现力&#xff0c;让自拍照更加生动和吸引人。 预设信息 调色风格&#xff1a;清晰透明风格预…

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…

计算机网络(14)ip地址超详解

先看图&#xff1a; 注意看第三列蓝色标注的点不会改变&#xff0c;A类地址第一个比特只会是0&#xff0c;B类是10&#xff0c;C类是110&#xff0c;D类是1110&#xff0c;E类是1111. IPv4地址根据其用途和网络规模的不同&#xff0c;分为五个主要类别&#xff08;A、B、C、D、…

挂壁式空气净化器哪个品牌的质量好?排名top3优秀产品测评分析

随着挂壁式空气净化器市场的不断扩大&#xff0c;各类品牌与型号琳琅满目。但遗憾的是&#xff0c;一些跨界网红品牌过于追求短期效益&#xff0c;导致产品在净化效果与去除异味方面表现平平&#xff0c;使用体验不佳&#xff0c;甚至可能带来二次污染风险&#xff0c;影响人体…

分布式 Data Warebase - 构筑 AI 时代数据基石

导读&#xff1a;作者以人类世界一个信息层次模型 DIKW 为出发点&#xff0c;引出对计算机世界&#xff08;系统&#xff09;处理数据过程的介绍。接着以一个民宿平台数据架构随业务发展而不断演进的过程&#xff0c;展示了这场信息革命中&#xff0c;在具体应用场景下&#xf…

如何将Latex的文章内容快速用word+Endnote排版

1 第一步 Endnote文件是无法直接导入bib文件的。需要将reference.bib的参考文献内容&#xff0c;通过JabRef软件打开并另存为refefence.ris文件 下载JabRef软件&#xff1a;https://www.jabref.org/#download 导出为ris格式文件 2 第二步 通过Endnote导入ris文件&#xff0…

[论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录

《深度异常检测综述》总结梳理 目录 一、研究背景与挑战二、深度异常检测方法分类三、实验评估四、结论在这篇文章中&#xff0c;**异常检测的异构性**主要从以下几个方面来理解&#xff1a;如何理解多源数据融合的困难“学习正常性的特征表示”与“用于特征提取的深度学习”在…

网络爬虫——爬虫项目案例

本节将全面讲解如何通过实战爬虫项目解决复杂问题。结合最新技术和实际开发需求&#xff0c;案例将涵盖完整开发流程&#xff0c;包括需求分析、实现代码、优化方法和常见问题解决。力求实现高效、可扩展的爬虫项目架构&#xff0c;帮助开发者提升实战能力。 案例 1&#xff1a…

实时质检-静音检测分析流程(运维人员使用)

前言 用户在实时质检时&#xff0c;开启了主叫或被叫静音检测功能&#xff0c;但是听录音时&#xff0c;主叫或被叫明明没有任何声音&#xff0c;但是通话没有被挂断。 说明主叫或被叫的静音阈值太低&#xff0c;导致系统没有把很小的声音认定为静音&#xff1b;或者检测非静音…

MetaGPT实现多动作Agent

异步编程学习链接 智能体 LLM观察思考行动记忆 多智能体 智能体环境SOP评审路由订阅经济 教程地址 多动作的agent的本质是react&#xff0c;这包括了think&#xff08;考虑接下来该采取啥动作&#xff09;act&#xff08;采取行动&#xff09; 在MetaGPT的examples/write_…

【MySQL】MySQL数据库基础

【MySQL】MySQL数据库基础 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;MySQL&#x1f34b; &#x1f33c;文章目录&#x1f33c; 1. 数据库基础 1.1 什么是数据库 1.2 主流数据库 1.3 MySQL基本使用 1.3.1 服务器&#xff0c;数据…

进程控制(详解)

一.进程创建 1.fork函数 在linux中fork函数是⾮常重要的函数&#xff0c;它从已存在进程中创建⼀个新进程。新进程为⼦进程&#xff0c;⽽原进 程为⽗进程。 #include <unistd.h>pid_t fork(void);返回值&#xff1a;⾃进程中返回0&#xff0c;⽗进程返回⼦进程id&…

RFSOC 49dr 开发板,支持12收5发

硬件支持: 1,12收5发 2.4X25G光模块 3.J30J扩展接口 4.支持多板同步&#xff0c;多TILE同步

生产制造领域的多元化模式探索

在当今全球化和信息化的时代背景下&#xff0c;生产制造领域正经历着前所未有的变革。随着消费者需求的多样化、市场竞争的加剧以及技术的不断进步&#xff0c;传统的生产制造模式已经难以满足现代企业的需求。因此&#xff0c;多种生产制造模式应运而生&#xff0c;以适应不同…