Vue3+Element-Plus创建简单后台管理系统模板

源码地址:https://github.com/Mstian/Vue-Onepiece-Admin

Vue3.0 ElementPlus

Project setup

npm install

Start Mock Server

npm run mock

Compiles and hot-reloads for development

npm run serve

Compiles and minifies for production

npm run build

欢迎使用VUE3.0 + ElementPlus 后台管理模板

UI库文档: https://element-plus.gitee.io/#/zh-CN

该项目基于Vuecli 使用Vue3 + 最新版ElementPlus 构建简单版后台管理系统

基本功能:(Home页面有详细介绍可参考)
通过路由自动生成侧边栏menu
打开menu可以自动生成标签页
可以使用less变量控制激活颜色
还可以通过less变量控制主题色

有需要生成menu的路由单独可以配置在一个文件,将不需要生成menu的路由配置在另外一个文件。
没有权限系统,没有登录功能等等。

简单,开箱即用。可以完全胡乱修改。可以作为Vue3项目基本参考。

最后,求个star。源码地址:https://github.com/Mstian/Vue-Onepiece-Admin

preview
在线预览地址:http://admin.tianleilei.cn/#/

开发过程中遇到问题以及解决方法

  1. scss in typescript (sass问题较多,现已采用less)
    报错:Cannot find module ‘./index.module.scss‘ or its corresponding type declarations.ts(2307)
    解决: 需要添加类型声明文件
    https://blog.csdn.net/qq_41804324/article/details/109388570
    https://juejin.cn/post/6844903560056930311

  2. 递归组件
    组件自身调用自身 参考sideBar组件

  3. pug(jade)模板
    文档:https://www.pugjs.cn/api/getting-started.html

  4. resolvePath
    使用path模块高效的处理路径拼接

  5. watch 与watchEffect区别
    watch不会立即执行 watchEffect会立即执行 并且可以手动取消监听

  6. 新版transition使用
    参考 layout /plan/src/layout/index.vue

  7. 浏览器控制台警告Source Map
    https://blog.csdn.net/sundacheng1989/article/details/51118865

  8. 浏览器控制台警告 HMR API usage is out of date.
    https://forum.vuejs.org/t/hmr-api-usage-is-out-of-date-mutiple-warnings/107633

  9. es-lint快速修复
    npm run lint -- --fix

  10. vue-router4 404页面*配置 参考router->defaultRouter.ts

  11. typescript中导入模块几种方式
    https://segmentfault.com/a/1190000018249137

  12. json-server mock数据
    json-server文档地址:https://github.com/typicode/json-server

更新:

2021-01-09周六

新增配置化生成表单查询数据生成表格组件,以下为组件使用说明文档:

功能1:表单查询

表单支持类型:

  1. input
  2. select
  3. cascader
  4. date (date datetimerange)

表格支持功能:
字符串,图片预览(hover),json解析,数字解析,操作栏,select选择

功能预览图:


JsonTable预览图

以下为组件使用示例 以及配置项示例

<JsonTable
    :searchColumns="searchColumns"
    :tableColumns="tableColumns"
    :service="localService"
    :options="tabOptions"
    @onformchange="handlechange"
    @rowselectchange="handleRowSelectChange"
    >
    <!-- 查询表单与表格中间插槽 -->
    <template v-slot:under-search-slot>
        <div>
            <el-button size="mini" type="primary">新增</el-button>
        </div>
    </template>
    <!-- 操作栏插槽 -->
    <template v-slot:op="scope">
        <el-button type="danger" size="mini" @click="handleDelete(scope)">删除</el-button>
        <el-button type="primary" size="mini" @click="handleCheck(scope)">查看</el-button>
    </template>
</JsonTable>

Props:
searchColumns: 表单查询属性配置
tableColumns: 查询结果行字段配置
service: 请求,主要是配置查询请求
options: 表格设置
onformchange: 表单查询项change事件监听 参数为查询属性
rowselectchange: 带有select的表格选择时的select监听事件 参数为当前选中项

表单查询属性:searchColumns Array

配置项说明:

label: String 表单项显示名称
prop: String 表单项属性(传给后端的字段)
clearable: Boolean 表单项内容是否可清除
placeholder: String 表单项placeholder
isSelect: Boolean 是否是select框(默认是input)
options: Array Select框和Cascader的options
isCascader: Boolean 是否是级联
isTime: String [date, datetimerange] 日期 或者日期时间范围(默认时间是Date格式内部已做转换处理为YYYY-MM-DD HH:MM:SS格式 如果需要时间戳格式可在组件源码中自行修改)

配置示例:

[
    {
        label: '姓名',
        prop: 'name',
        clearable: true,
        placeholder: "请输入姓名"
    },
    {
        label: '性别',
        prop: 'sex',
        clearable: true,
        placeholder: "请选择",
        isSelect: true,
        options: [
            {
                prop: 'male',
                name: '男'
            },
            {
                prop: 'female',
                name: '女'
            }
        ]
    },
    {
        label: '技能',
        prop: 'skill',
        clearable: true,
        placeholder: "请选择",
        isCascader: true,
        options: [
              {
                value: "basic",
                label: "Basic",
                children: [
                {
                    value: "layout",
                    label: "Layout 布局"
                },
                {
                    value: "color",
                    label: "Color 色彩"
                },
                {
                    value: "typography",
                    label: "Typography 字体"
                },
                {
                    value: "icon",
                    label: "Icon 图标"
                },
                {
                    value: "button",
                    label: "Button 按钮"
                }
                ]
            }
        ]
    },
    {
        label: '出生日期',
        prop: 'born',
        clearable: true,
        placeholder: "选择日期",
        isTime: 'date',
        valueFormat: '',
        defaultTime: []
    }
]

table表格各属性:

  1. options Object 表格展现形式配置

配置项说明:
canCheck: Boolean 表格是否可勾选
hasIndex: Boolean 表格是否有序号
checkFixed: String [left right] 勾选checkbox固定位置
indexFixed: String [left right] 序号固定位置
opW: Number 操作栏宽度(当操作栏按钮较多时需要较宽宽度,默认为150)
autoRequest: Boolean 是否进入页面执行一次数据请求 默认为false
startUpdate: Date.now() // 监听该项有变化时更新请求
配置示例:

{
    canCheck: true, // 是否可选择
    hasIndex: true, // 是否有序号
    checkFixed: 'left', // 选择固定位置
    indexFixed: 'left', // 表序号固定位置
    opW: 150,// 操作栏宽度
    autoRequest: true, // 自动请求(第一次加载默认请求)
    startUpdate: Date.now()
}
  1. tableColumns 查询结果行字段配置
    属性:tableColumns Array

配置项说明:
prop: String 对应后端返回表格数据字段
label: String 表格当前列名称
width: Number 当前列宽度
expandFunc: Boolean 是否有扩展功能(扩展功能包括图片预览,重写数据等等,当传递imgW,isMultiCell,render时该属性必传)
imgW: Number 图片预览时传递此参数,为预览图片宽度(图片默认是以tooltip展示的)
isMultiCell: Boolean 是否要重写数据(场景:后端返回json字符串,前端需要取其中某一个属性,或者后端给的是0,1这样的标识,需要前端转义为汉字 是 或者否)
render: Function 配合isMultiCell使用参数为当前表格的行数据,可以return可渲染数据,可以参考配置示例

配置示例

[
    {
        prop: 'name',
        label: '姓名',
        width: 150,
        overflow: true
    },
    {
        prop: 'age',
        label: '年龄',
        width: 150,
        overflow: true
    },
    {   // 图片预览
        prop: 'avatar',
        label: '头像',
        width: 150,
        imgW: 300, // 设置该项表示预览图片
        expandFunc: true // 是否有扩展功能,启用表格列插槽
    },
    {
        prop: 'sex',
        label: '性别',
        width: 150,
        overflow: true
    },
    {
        prop: 'born',
        label: '出生日期',
        width: 150,
        overflow: true
    },
    {
        prop: 'phone',
        label: '电话',
        width: 150,
        overflow: true
    },
    {
        prop: 'zip',
        label: '邮编',
        width: 150,
        overflow: true
    },
    {
        prop: 'province',
        label: '省份',
        width: 150,
        overflow: true
    },
    {
        prop: 'city',
        label: '市区',
        width: 150,
        overflow: true
    },
    {
        prop: 'address',
        label: '地址',
        width: 150,
        overflow: true
    },
    {
        prop: 'loc',
        label: '工位',
        width: 150,
        overflow: true
    },
    {
        prop: 'createUser',
        label: '创建人',
        width: 150,
        overflow: true
    },
    {
        prop: 'auditUser',
        label: '审核人',
        width: 150,
        overflow: true
    },
    {
        prop: 'order',
        label: '订单号',
        width: 150,
        overflow: true
    },
    {   // 场景: 后端字段是json字符串,需要前端解析其中某个字段
        prop: 'jsonStr',
        label: 'json解析',
        width: 150,
        overflow: true,
        expandFunc: true,
        isMultiCell: true,
        render: (scope) => {
            if (JSON.stringify(scope.row) !== '{}') {
                return JSON.parse(scope.row.jsonStr).json;
            } 
            return "--";
        }
    },
    {   // 场景: 后端字段是数字0或1, 前端需要自己将数字转成汉字 比如0 待审核 1 已审核
        prop: 'status',
        label: '状态(0 1)',
        width: 150,
        overflow: true,
        expandFunc: true,
        isMultiCell: true,
        render: (scope) => {
            let status = scope.row.status;
            if( status === 0) {
                return "待审核";
            } else if(status === 1) {
                return "已审核";
            }
            return "--";
        }
    }
]

请求接口配置属性

service Obejct
属性用于请求接口的配置,用于在组件内部进行表格数据的请求 默认是一个对象,get属性是默认的请求,参数为如下格式

{
    page: 1,
    psize: 2,
    params: {
        name: 'leilei',
        age: 18
    }
}
export const localService = {
/**
 * {
 *  page: 1,
 *  psize: 20,
 *  params: {}
 * }
 */
    get(data) {
        console.log(data);
        // return axios.get(url, data); 这里是实际发请求的地方
        return new Promise((resolve, reject) => {
            resolve({
                data: {
                    code: 0,
                    data: {
                        totalCount: 1,
                        list: tableData
                    }
                }
            });
        });
    }
};
2021-04-06周二

增加登录界面

主要变化文件如下图

image.png

由于之前组件设计问题,导致登录界面不太好加,所以找了一个比较trick的方案。将登录路由添加到页面中。

<template>
  <div>
    <router-view v-if="$route.path === '/login'"></router-view>
    <layout v-else></layout>
  </div>
</template>

持续更新中。。。比较慢。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容