前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >管理后台设计

管理后台设计

原创
作者头像
愤怒的小鸟
修改于 2021-10-19 02:03:56
修改于 2021-10-19 02:03:56
1.7K00
代码可运行
举报
文章被收录于专栏:web shareweb share
运行总次数:0
代码可运行

一、文件配置

1. 项目目录

2. 环境配置封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 环境配置封装
 * con
 */
const env = import.meta.env.MODE || 'prod';
const EnvConfig = {
    dev:{
        baseApi:'/api',
        mockApi:'https://www.fastmock.site/mock/c1c302e8baed9894c48c17e4738c092e/api'
    },
    test:{
        baseApi:'//test.futurefe.com/api',
        mockApi:'https://www.fastmock.site/mock/c1c302e8baed9894c48c17e4738c092e/api'
    },
    prod:{
        baseApi:'//futurefe.com/api',
        mockApi:'https://www.fastmock.site/mock/c1c302e8baed9894c48c17e4738c092e/api'
    }
}
export default {
    env,
    mock:false,
    namespace:'manager',
    ...EnvConfig[env]
}

3. 请求封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * axios二次封装
 * config/index.js
 */
import axios from 'axios'
import config from './../config'
import { ElMessage } from 'element-plus'
import router from './../router'
import storage from './storage'

const TOKEN_INVALID = 'Token认证失败,请重新登录'
const NETWORK_ERROR = '网络请求异常,请稍后重试'

// 创建axios实例对象,添加全局配置
const service = axios.create({
    baseURL: config.baseApi,
    timeout: 8000
})

// 请求拦截
service.interceptors.request.use((req) => {
    const headers = req.headers;
    const { token } = storage.getItem('userInfo');
    if (!headers.Authorization) headers.Authorization = 'Bearer ' + token;
    return req;
})

// 响应拦截
service.interceptors.response.use((res) => {
    const { code, data, msg } = res.data;
    if (code === 200) {
        return data;
    } else if (code === 500001) {
        ElMessage.error(TOKEN_INVALID)
        setTimeout(() => {
            router.push('/login')
        }, 1500)
        return Promise.reject(TOKEN_INVALID)
    } else {
        ElMessage.error(msg || NETWORK_ERROR)
        return Promise.reject(msg || NETWORK_ERROR)
    }
})
/**
 * 请求核心函数
 * @param {*} options 请求配置
 */
function request(options) {
    options.method = options.method || 'get'
    if (options.method.toLowerCase() === 'get') {
        options.params = options.data;
    }
    let isMock = config.mock;
    if (typeof options.mock != 'undefined') {
        isMock = options.mock;
    }
    if (config.env === 'prod') {
        service.defaults.baseURL = config.baseApi
    } else {
        service.defaults.baseURL = isMock ? config.mockApi : config.baseApi
    }

    return service(options)
}

['get', 'post', 'put', 'delete', 'patch'].forEach((item) => {
    request[item] = (url, data, options) => {
        return request({
            url,
            data,
            method: item,
            ...options
        })
    }
})

export default request;

4. 存储方法封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Storage二次封装
 */
import config from './../config'
export default {
    setItem(key,val){
        let storage = this.getStroage();
        storage[key] = val;
        window.localStorage.setItem(config.namespace,JSON.stringify(storage));
    },
    getItem(key){
        return this.getStroage()[key]
    },
    getStroage(){
        return JSON.parse(window.localStorage.getItem(config.namespace) || "{}");
    },
    clearItem(key){
        let storage = this.getStroage()
        delete storage[key]
        window.localStorage.setItem(config.namespace,JSON.stringify(storage));
    },
    clearAll(){
        window.localStorage.clear()
    }
}

5. 共用方法封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 工具函数封装
 */
// 格式化时间
export const formateDate = function(date, rule) {
    let fmt = rule || 'yyyy-MM-dd hh:mm:ss'
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, date.getFullYear())
    }
    const o = {
        // 'y+': date.getFullYear(),
        'M+': date.getMonth() + 1,
        'd+': date.getDate(),
        'h+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds()
    }
    for (let k in o) {
        if (new RegExp(`(${k})`).test(fmt)) {
            const val = o[k] + '';
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? val : ('00' + val).substr(val.length));
        }
    }
    return fmt;
}

// 获取地址参数
export const getQueryString = function (name) {
    var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
    var reg_rewrite = new RegExp('(^|/)' + name + '/([^/]*)(/|$)', 'i')
    var r = window.location.search.substr(1).match(reg)
    var q = window.location.pathname.substr(1).match(reg_rewrite)
    if (r != null) {
       return unescape(r[2])
    } else if (q != null) {
       return unescape(q[2])
    } else {
       return null
    }
 }

6. 路由配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createRouter, createWebHashHistory } from 'vue-router'
import Home from '@/components/Home.vue'

const routes = [
    {
        name: 'home',
        path: '/',
        meta: {
            title: '首页'
        },
        component: Home,
        redirect: '/welcome',
        children: [
            {
                name: 'welcome',
                path: '/welcome',
                meta: {
                    title: '欢迎体验Vue3全栈课程'
                },
                component: () => import('@/views/Welcome.vue')
            },
            {
                name: 'user',
                path: '/system/user',
                meta: {
                    title: '用户管理'
                },
                component: () => import('@/views/User.vue')
            },
            {
                name: 'menu',
                path: '/system/menu',
                meta: {
                    title: '菜单管理'
                },
                component: () => import('@/views/Menu.vue')
            }
        ]
    },
    {
        name: 'login',
        path: '/login',
        meta: {
            title: '登录'
        },
        component: () => import('./../views/Login.vue')
    }
]
const router = createRouter({
    history: createWebHashHistory(),
    routes
})

export default router

7. 接口管理文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * api
 */
import request from './../utils/request'
export default {
    login(params) {
        return request({
            url: '/users/login',
            method: 'post',
            data: params,
        })
    }
}

8. 入口文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/lib/theme-chalk/index.css';
import request from './utils/request'
import storage from './utils/storage'
import api from './api'
import store from './store'

console.log("环境变量=>",import.meta.env)

const app = createApp(App);
app.config.globalProperties.$request = request;
app.config.globalProperties.$api = api;
app.config.globalProperties.$storage = storage;
app.use(router).use(store).use(ElementPlus,{size:'small'}).mount('#app')

9. user文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { getCurrentInstance, onMounted, reactive, ref, toRaw } from "vue";
import utils from "./../utils/utils";
export default {
  name: "user",
  setup() {
    //   获取Composition API 上下文对象
    const { ctx } = getCurrentInstance();
      // 初始化用户列表数据
    const userList = ref([]);
    // 初始化分页对象
    const pager = reactive({
      pageNum: 1,
      pageSize: 10,
    });

    // 初始化接口调用
    onMounted(() => {
      getUserList();
    });
    // 获取用户列表
    const getUserList = async () => {
      let params = { ...user, ...pager };
      try {
        const { list, page } = await ctx.$api.getUserList(params);
        userList.value = list;
        pager.total = page.total;
      } catch (error) {}
    };

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
详解Python字符串编码格式
最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用1个字节来对字符进行编码,最多只能表示256个符号。 随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同的应用领域和场合对字符串编码的要求也略有不同,于是又分别设计了多种不同的编码格式,常见的主要有UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64、CP437等等。UTF-8编码是国际通用的编码,以1个字节表示英语字
Python小屋屋主
2018/04/16
1.9K0
织梦DEDECMS模板编码格式从UTF-8换成GB2312
我们很多朋友在利用DEDECMS织梦程序建站的时候,由于程序本身是有多个编码版本的,比如有UTF-8和GB2312的,我们的主程序安装好之后但是在选择主题模板的时候也是有编码区别的,这个就比较难搞。我们要么就重新安装同主题模板一样编码的主程序,要么就是更换主程序编码。
老蒋
2021/12/27
4.4K0
Python处理Windows记事本utf8编码文件要注意的坑
以Win 10为例,假设当前文件夹中有个ANSI编码的文本文件data.txt,其中包含若干行文本,每行存放一个整数,例如:
Python小屋屋主
2020/04/03
2K0
真棒!彻底解决了一直困扰的编码问题
在批量处理文件(后缀包括 ".csv"、".xlsx"、".xls"的文件)时,可能会出现同一个文件夹内同时存在不同编码的文件;亦或非"utf-8"格式的其他格式,即便相同格式也会出现有些文件能打开,而有些文件不能打开。
数据STUDIO
2021/06/24
1.3K0
linux 文件编码格式转换
师兄在 windows 下写的一段程序 (C/C++ 编写), 传给我在 Linux 下面运行, 编译和运行的时候输出的时候中文乱码了
明哥的运维笔记
2019/01/30
7.4K0
学习笔记 | 如何转换文本文件的编码格式
首先,我们需要一个可以读取和写入不同编码格式的函数。这里使用 Python 内置的 open 函数,它允许我们指定文件打开的模式以及编码格式。 其次,调用 sys 的 argv 进行传递参数方便直接使用脚本
用户11172986
2024/08/21
2490
学习笔记 | 如何转换文本文件的编码格式
UTF-16 Little Endian 编码的记事本文件在powershell里处理字符串时一定要小心
记事本文件c:\teaport6.log每一行最左边都是这个格式的字符串2023/7/1 1:01:33; (时间加一个英文分号)
Windows技术交流
2023/07/08
2750
Node.js文件编码格式的转换
项目很多 lua 文件不是 utf-8格式,使用 EditPlus 查看的时候,显示为ASCII。还有的是带BOM的,带BOM倒好处理,之前写过,有一定规律。
meteoric
2018/11/20
5.7K0
Python学习:如何实现文件编码的检测
文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的文件一般是以“ utf-8 ”或“ GBK ”编码进行保存的,由于编辑器一般设置了默认的保存和打开方式,所以我们在记事本或常见文档编辑器如Word中不容易看到乱码的情况发生,但是,当我们要在内存里读取打开一个文件时,如果文档编码方式和计算机内存默认读取文件的编码不同,或者我们打开文件时未设置正确的编码打开规则,则很有可能出现一堆乱码,无法正常读取文件内容,影响接下来的工作。
Python学习者
2022/09/13
7560
用记事本编写第一个Java程序
编写的,之所以不用开发工具是因为想要了解如何通过doc编译和执行Java程序 系统:windows10 Java:jdk1.8版本 Java文件位置:E盘-test文件夹
小沐沐吖
2022/09/09
6940
用记事本编写第一个Java程序
java判断文本文件编码格式
上篇文章需要读取当前java或者配置文件的编码格式,这里主要支持UTF-8、GBK、UTF-16、Unicode等
一笠风雨任生平
2019/08/07
9.1K6
AVI视频文件编码格式不受支持0xc00d5212怎么解决?「建议收藏」
AVI视频格式的优点是图像质量好,但最普遍的现象就是高版本Windows媒体播放器播放不了采用早期编码编辑的AVI格式视频,而低版本Windows媒体播放器又播放不了采用最新编码编辑的AVI格式视频。
全栈程序员站长
2022/11/14
11K0
AVI视频文件编码格式不受支持0xc00d5212怎么解决?「建议收藏」
从零开始学习PYTHON3讲义(十三)记事本的升级版:网络记事本
网络编程的火热和重要性这里就不多说了,我们直接来看看Python在互联网编程方面的表现。
俺踏月色而来
2019/01/03
8020
【解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG 】
在日常数据处理工作中,我们经常会使用CSV文件进行数据的导入和导出。然而,当CSV文件采用UTF-8编码时,有时候在使用Excel打开这些文件时会遇到乱码的问题,这可能会影响数据的正确性和可读性。在本文中,我们将分享如何解决Excel打开UTF-8编码CSV文件乱码的BUG问题,并提供一些实用的方法。
老虎也淘气
2024/01/30
13.3K0
【解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG 】
[Python零基础入门篇①⑧] - 字符串的编码格式
编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。
哈哥撩编程
2024/06/30
2900
[Python零基础入门篇①⑧] - 字符串的编码格式
中文编码格式都读取不了文件csv,还有什么方法解决吗?
前几天在Python奥特曼交流群【Meiloi】问了一个文件处理的问题。问题如下图所示:这么多中文编码格式都读取不了文件csv,还有什么方法解决吗?
前端皮皮
2024/01/23
1820
中文编码格式都读取不了文件csv,还有什么方法解决吗?
各种编码格式,你懂得!!!
GBK,ISO-8859-1,GB2312的本质区别 编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标准 但是后来计算机普及了 于是就中国要使用计算机了 但是机器不认得中文,于是就有了国际码。 gbk gb2312都是这类。两个其实一个,一个是标准(发布的代号),一个是简称。后来多了个阿拉伯语、日语、韩语......所以就出来统一编码UniCode ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。此字符集主要支持欧洲使用的语言。
李才哥
2019/07/10
11.2K0
各种编码格式,你懂得!!!
视频编码格式和封装格式有什么关系?相机常见的编码格式有哪些?
业内有个很形象的比喻,可以带大家很快弄清楚封装格式和编码的关系:编码格式和封装格式的关系好比酒与酒瓶的关系,编码格式就像酒瓶里的酒,是视频的核心内容,封装格式就像酒瓶,它只是负责把内部的视频轨、音频轨、字幕轨集成在一起。简单说,视频编码格式是视频的内核,封装格式是视频的外壳,因此编码格式与封装格式对文件大小的影响也截然不同。
微帧Visionular
2024/10/30
6080
视频编码格式和封装格式有什么关系?相机常见的编码格式有哪些?
字符编码
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://polaris.blog.51cto.com/1146394/377468
拾点阳光
2018/09/28
2.3K0
Linux下文件字符编码格式检测和转换
目前多数情况下, 我们遇到的非英文字符文件都是使用UTF-8编码的, 这时一般我们查看这些文件的内容都不会有问题. 不过有时, 我们有可能会遇到非UTF-8编码的文件, 比如中文的GBK编码, 或者俄语的CP1251编码. 而文本文件一般不带有自身编码格式的信息, 这就给我们处理带来很多麻烦. 本文介绍几个Linux命令来检测和转换文本文件的编码格式.
别先生
2020/10/10
5.6K0
推荐阅读
相关推荐
详解Python字符串编码格式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档