frontelementpackage
Version:
vue2封装的elementUI 组件
1,158 lines (966 loc) • 26.9 kB
Markdown
<div align="center"><h1>
<br/>
🍰
<br />
frontelementpackage
<br /><br />
</h1>
<sup>
<br />
<br />
<a href="https://gitee.com/Electrolux/front-element-package"><img src="https://img.shields.io/static/v1?label=version&message=v1.2.11&color=blue" alt="npm package" /></a><a href=https://space.bilibili.com/286773126><img src="https://img.shields.io/static/v1?label=Bili&message=Electrolux&color=red" alt="temp" /></a>
<a href="https://gitee.com/Electrolux/front-element-package"> <img src="https://img.shields.io/static/v1?label=Author&message=Electrolux&color=yellow" alt="demos" /></a>
<a href="https://gitee.com/Electrolux/front-element-package"> <img src="https://img.shields.io/static/v1?label=Contribute&message=welcome&color=green" alt="demos" /></a>
<br />
</a>
<br />
Translations: <a href="">🇨🇳 汉语</a>
</sup>
</div>
# 1.使用说明
## 1.1.CommonForm
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/form.png"/>
formlabel示例数据如下:
```js
this.formlabel=[
{
"model": "name",
"label": "姓名",
"type": "input"
},
{
"model": "sex",
"label": "性别",
"type": "select",
"opts": [
{
"label": "男",
"value": 1
},
{
"label": "女",
"value": 0
}
]
},
{
"model": "birth",
"label": "出生日期",
"type": "date"
},
{
"model": "addr",
"label": "地址",
"type": "input"
}
]
this.form 表单元素示例
this.form={
"name": "",
"addr": "",
"age": "",
"birth": "",
"sex": ""
}
incline :true or false 是否放在一列上
```
父组件调用示例(common-form)是我们封装的方法
```
<el-dialog
:title="operateType === 'add' ? '新增用户' : '更新用户'"
:visible.sync="isShow"
>
<common-form
:formLabel="formLabel"
:form="form"
:inline="true"
ref="form"
></common-form>
<div slot="footer" class="dialog-footer">
<el-button ="isShow = false">取消</el-button>
<el-button type="primary" ="confirm">确定</el-button>
</div>
</el-dialog>
```
## 1.2.CommonTable
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/table.png"/>
引入示例:import CommonTable from 'frontelementpackage/src/CommonTable.vue'
tabledata示例
```
this.tabledata=[
{
"id": "46BeC977-dC5b-bB93-2510-9d4AE8CBFc3e",
"name": "龚静",
"addr": "宁夏回族自治区 吴忠市 青铜峡市",
"age": 41,
"birth": "2010-03-22",
"sex": 0,
"sexLabel": "女"
}
]
this.tableLabel=
[
{
"prop": "name",
"label": "姓名"
},
{
"prop": "age",
"label": "年龄"
},
{
"prop": "sexLabel",
"label": "性别"
},
{
"prop": "birth",
"label": "出生日期",
"width": 200
},
{
"prop": "addr",
"label": "地址",
"width": 320
}
]
this.config={
"page": 1,
"total": 200,
"loading": false
}
```
父组件调用示例如下
```
<common-table
:tableData="tableData"
:tableLabel="tableLabel"
="getList()"
="editFirstLevel"
="delFirstLevel"
></common-table>
父组件中
methods中
editFirstLevel(row){
console.log(row)//row 就是这一行的数据
}
delFirstLevel(row){
console.log(row)//row 就是这一行的数据
}
```
## 1.3.CommonTag
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/tag.png"/>
tags变量示例: name指的是router中定义路由的name, label是显示的文字
点击tag可以根据name跳转到指定的路由
```
tags:
[
{ name: "HelloWorld", label:"测试" },
{ name:"echart", label:"测试2" },
{ name: "aside_Test", label:"测试21" },
],
changeMenu(item) {
this.$router.push({ name: item.name });
},
```
注意在调用删除按钮的时候,由于vue子组件不能直接改变父组件的值,
因此我们对应emit的方法(deleteTag)在我们的父组件的method中需要进行method方法的定义
父组件实例如下
```
deleteTag(index){
this.tags.splice(index,1)
console.log(index)
}
```
调用示例如下
<commontag :tags="tags" ="deleteTag"></commontag>
子组件方法
```
handleClose(tag, index) {
console.log(tag);
// console.log(index);
// eslint-disable-next-line
this.$emit('deletetag',index)
}
```
## 1.4.CommonAside
如果要实现伸缩功能,事件总线中监听isCollapse这个变量并且赋值就可以了 //asyncMenu
解决了submenu收缩时的文字显示的问题。在收缩的状态把这玩意隐藏就好了
路由的格式
```js
asyncMenu() {
return [
{
path: "/",
name: "home",
label: "首页",
icon: "s-home",
url: "/pc_home",
},
{
path: "/mall",
name: "mall",
label: "商品管理",
icon: "video-play",
url: "/pc_table",
},
{
path: "/FirstLevel",
name: "FirstLevel",
label: "用户管理",
icon: "FirstLevel",
url: "/pc_table",
},
{
label: "其他",
icon: "location",
children: [
{
path: "/page1",
name: "page1",
label: "页面1",
icon: "setting",
url: "Other/PageOne",
},
{
path: "/page2",
name: "page2",
label: "页面2",
icon: "setting",
url: "Other/PageTwo",
},
],
},
];
}
```
## 1.5.CommonHeader
基本内容都已经写好了
## 1.6.管理界面示例
参照pages/pc_vue_client.vue里面的东西
路由中
```js
{
path: '/pc5',
name: 'card1_pc5',
component: pc5,
meta:{title:"pc后台练习",role:'admin',img:''},
children: [
{
path: '/pc_home',
component:pc_home,
meta:{title:'后台首页',isShowHead:false,isShowFoot:false,isShowBack:true}
},
{
path: '/pc_table',
component:pc_table,
meta:{title:'后台增删改查',isShowHead:false,isShowFoot:false,isShowBack:true}
}
]
},
```
## 1.7.echart
父组件基本调用方法
```vue
<el-card style="height: 200px;width:300px">
<!-- 柱状图 -->
<!-- <div style="height:200px" ref="FirstLevelEcharts"></div> -->
<echart :chartData="echartData.FirstLevel" style="height: 200px" isAxisChart="true" />
</el-card>
```
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/饼状图.png"/>
```js
饼状图传入数据示例
{
"series": [
{
"data": [
{
"name": "魅族",
"value": 2200
},
{
"name": "三星",
"value": 4500
}
],
"type": "pie"
}
]
}
```
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/柱状图.png"/>
```js
柱状图数据
{
"xData": [
"周一",
"周二",
],
"series": [
{
"name": "新增用户",
"data": [
5,
10,
],
"type": "bar"
},
{
"name": "活跃用户",
"data": [
200,
500,
],
"type": "bar"
}
]
}
```
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/折线图.png"/>
```js
折线图数据:
{
"xData": [
"20191001",
"20191002",
"20191003",
],
"series": [
{
"name": "苹果",
"data": [
5920,
4738,
659,
],
"type": "line"
},
{
"name": "vivo",
"data": [
6564,
7380,
3745,
],
"type": "line"
},
]
}
```
## 1.8.表格权限示例
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/数据图.png">
### 8.1 首先是我封装了复选框组件
位置在于 '@/components/checkBox.vue'
调用实例
```vue
<template>
<div class="">
<p-el-checkbox
v-model="result"
resultType="Array"
label="name"
prop="id"
:defaultCheck="defaultCheck"
:checkboxList="checkboxList"
/>
</div>
</template>
<script>
import Pelcheckbox from "https://cdn.jsdelivr.net/npm/frontelementpackage/p-el-checkbox.vue";
export default {
components: {
"p-el-checkbox": Pelcheckbox,
},
props: [],
data() {
return {
defaultCheck: ["1", "3"],
checkboxList: [
{ name: "小红", id: "1" },
{ name: "小明", id: "2" },
{ name: "小芳", id: "3" },
],
result: {},
};
},
mounted() {},
watch: {
result: function () {
console.log("变化了:", this.result);
},
},
methods: {},
};
</script>
<style lang='scss' scoped>
</style>
```
### 8.2 然后就可以直接用
```js
CommonTokenEdit.vue
tableData: [
{
id: "1",
tokenName: "数据库",
describe: "与我相关",
tokenInfo: ["1", "2"],
},
{
id: "2",
tokenName: "车库管理",
describe: "与我相关",
tokenInfo: ["1", "2", "3"],
},
],
```
## 1.9.TableButtonFixed
<img src="https://cdn.jsdelivr.net/npm/frontelementpackage/pirture/tablefix.png"/>
```js
import CommonTable from "frontelementpackage/src/CommonTableButtonFixed.vue";
--1.表头:tableLabel: [
{
prop: "id",
label: "id",
minWidth:"20%"
// position:"right"
},
{
prop: "name",
label: "名字",
minWidth:"20%"
},
{
prop: "phone",
label: "电话",
minWidth:"20%"
},
{
prop: "number",
label: "商铺号",
minWidth:"20%"
},
],
--2.button名称:tableButton: {
width: 300,
data: [
{
name: "编辑",
type: "primary",
size: "small",
},
{
name: "编辑附件",
type: "info",
size: "small",
},
{
name: "删除",
type: "danger",
size: "small",
},
],
},
--3.数据:tableData: [{ id: 1, name: "小红", phone: "19120636444", number: "sad" }],
--4.调用起来
import CommonTable from "frontelementpackage/src/CommonTableButtonFixed.vue";
<common-table
:tableData="tableData"
:tableDropdown="tableDropdown"
:tableLabel="tableLabel"
="editFirstLevel"
></common-table>
<common-table
:tableData="tableData"
:tableButton="tableButton"
:tableLabel="tableLabel"
="editFirstLevel"
></common-table>
```
## 1.10.TableDropdown
```js
--1.表头
tableLabel: [
{
prop: "name",
label: "账户名字",
width: 300,
},
{
prop: "status",
label: "状态",
width: 200,
},
],
--2.按钮:
tableDropdown: [
{ id: 1, name: "测试1" },
{ id: 2, name: "测试2" },
{ id: 3, name: "测试3" },
],
--3.数据:
tableData: [
{
name: "测试",
status: 1,
},
],
--4.调用起来
import CommonTable from "frontelementpackage/src/CommonTableDropdown.vue";
<common-table
:tableData="tableData"
:tableDropdown="tableDropdown"
:tableLabel="tableLabel"
="editFirstLevel"
></common-table>
```
## 1.11 项目封装示例(TableButtonFixed)
```vue
<template>
<div style="">
<div class="commonInputTopBox">
<pageHeader :pagename="'产品库'" />
</div>
<el-form :inline="true" class="demo-form-inline">
<el-form-item label="搜索车库">
<el-input placeholder="车库名,车库id,或地址" v-model="query.keyword"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary">查询</el-button>
</el-form-item>
</el-form>
<div class="commonControl-body">
<el-button type="primary" ="addFormButton()">新增产品类型</el-button>
<common-table
:tableData="tableData"
:tableButton="tableButton"
:tableLabel="tableLabel"
="editFirstLevel"
></common-table>
<div class="layoutBorder">
<el-pagination
-change="handleSizeChange"
-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[5, 10, 20, 40]"
:page-size="pagesize"
layout="total, sizes, prev, pager, next, jumper"
>
</el-pagination>
</div>
</div>
<!-- 点击事件触发 -->
<el-dialog title="编辑产品" :visible.sync="dialogFormVisibleEdit">
<el-form :model="formEdit">
<el-form-item label="产品id" label-width="120px">
<el-input v-model="formEdit.id" autocomplete="off" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="产品系列" label-width="120px">
<el-input v-model="formEdit.product_series" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="产品分类" label-width="120px">
<el-select v-model="optionValue" placeholder="请选择">
<el-option
v-for="item in value"
:key="item.id"
:label="item.product_type_name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="产品名" label-width="120px">
<el-input v-model="formEdit.product_name" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button ="dialogFormVisibleEdit = false">取 消</el-button>
<el-button type="primary" ="updateFirstLevel()">确 定</el-button>
</div>
</el-dialog>
<el-dialog title="新增产品类型" :visible.sync="dialogFormVisibleAdd">
<el-form :model="formAdd">
<el-form-item label="产品类型名字" label-width="120px">
<el-input v-model="formAdd.product_type_name" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button ="dialogFormVisibleAdd = false">取 消</el-button>
<el-button type="primary" ="createFirstLevel()">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
// import {
// product_get,
// product_classify_create,
// product_set,
// product_edit,
// product_classify_get
// } from "@/api/product.js";
import CommonTable from "frontelementpackage/src/CommonTableButtonFixed.vue";
export default {
name: "start",
data() {
return {
query: {
querypage: 1, //获取页码
pagesize: 10, //每页返回数量
keyword: "", //搜索 可搜邮箱 用户名 手机号
},
//分页数据
currentPage: 1, //初始页
pagesize: 10, // 每页的数据
tableData: [],
dialogFormVisibleEdit: false,
formEdit: { group_info: "" },
dialogFormVisibleAdd: false,
formAdd: {},
tableLabel: [
{
prop: "id",
label: "权限组名",
minWidth:"20%"
// position:"right"
},
{
prop: "product_name",
label: "说明",
minWidth:"20%"
},
{
prop: "product_type",
label: "创造时间",
minWidth:"20%"
},
],
tableButton: {
width: 300,
data: [
{
name: "编辑",
type: "primary",
size: "small",
},
{
name: "编辑附件",
type: "info",
size: "small",
},
{
name: "删除",
type: "danger",
size: "small",
},
],
},
value: null,
optionValue: null,
};
},
components: {
CommonTable,
},
created() {
this.getFirstLevel();
this.initOption();
},
methods: {
initOption() {
// product_classify_get({}).then((res) => {
// if (res.code == 200) {
// this.value = res.data;
// } else {
// this.$message.info(res.msg);
// }
// });
},
editFirstLevel(row, methods) {
if (methods == "编辑") {
this.editUser(row);
}
if (methods == "编辑附件") {
this.gotoUser(row);
}
if (methods == "删除") {
this.delUser(row);
}
},
gotoUser(row) {
// this.formEdit = {
// group_id: row.id,
// group_name: row.group_name,
// group_info: row.group_info,
// };
// console.log(this.form,"ddd")
// this.dialogFormVisibleEdit = true;
row;
// this.$router.push({ name: "productLibraryInfo", query: row });
},
editUser(row) {
this.formEdit = row;
// console.log(this.form,"ddd")
this.dialogFormVisibleEdit = true;
// row;
// this.$router.push({ name: "productLibraryInfo", query: { id: row.id } });
},
delUser(row) {
let ids = row.id;
console.log({ group_id: ids });
// this.$confirm("是否确定删除", "确认信息", {
// distinguishCancelAndClose: true,
// confirmButtonText: "删除",
// cancelButtonText: "放弃删除",
// })
// .then(() => {
// product_set({
// product_id: ids, //产品ID
// is_delete: true,
// }).then((res) => {
// if (res.code == 200) {
// this.$message.success("成功删除");
// window.location.reload();
// } else {
// this.$message.info(res.msg);
// }
// });
// })
// .catch((action) => {
// this.$message({
// type: "info",
// message: action === "cancel" ? "放弃删除" : "停留在当前",
// });
// });
},
handleCurrentChange(val) {
this.currentPage = val;
this.query = {
querypage: this.currentPage,
pagesize: this.pagesize,
keyword: "",
};
// console.log("当前页面显示xxx条", this.currentPage,"当前界面是xxx页",this.currentPage);
// user_group_manage_index(this.query).then((res) => {
// console.log(this.tableData, "new");
// this.tableData = res.data.result;
// });
},
handleSizeChange(val) {
this.pagesize = val; //获取page-sizes里的每页显示几条数据的值,赋给我们自定义的每页显示数量的变量pageNum
// console.log("当前页面显示xxx条", val,"当前界面是xxx页",this.currentPage);
this.query = {
querypage: this.currentPage,
pagesize: this.pagesize,
keyword: "",
};
console.log(this.query);
// user_group_manage_index(this.query).then((res) => {
// console.log(this.tableData, "new");
// this.tableData = res.data.result;
// });
},
createFirstLevel() {
// product_classify_create(this.formAdd).then((res) => {
// if (res.code == 200) {
// this.$message.success("成功添加");
// window.location.reload();
// } else {
// this.$message.info(res.msg);
// }
// });
this.dialogFormVisibleAdd = false;
},
addFormButton() {
this.dialogFormVisibleAdd = true;
},
updateFirstLevel() {
// this.formEdit["product_id"] = this.formEdit["id"];
// Reflect.deleteProperty(this.formEdit,"id")
// this.formEdit["product_type"]=this.optionValue
// console.log(this.formEdit);
// product_edit(this.formEdit).then((res) => {
// if (res.code == 200) {
// this.$message.success("成功修改");
// this.getFirstLevel()
// } else {
// this.$message.info(res.msg);
// }
// });
this.dialogFormVisibleEdit = false;
},
getFirstLevel() {
// product_get(this.query).then((res) => {
// console.log(this.tableData, "new");
// this.tableData = res.data.result;
// });
this.tableData = [{id:2,product_name:"测试",product_type:2,product_series:4}]
},
},
};
</script>
<style lang="scss" scoped></style>
```
## 更新日志
### ver 1.2.9 完善文档
### ver 1.2.6 CommonTableButtonFixed 增加min-width+大屏自适应 + 大列表会进行分块渲染
### ver 1.2.0 CommonTableButtonFixed 增加table组件百分比
### ver 1.1.5 CommonTableButtonFixed 增加设备分类的处理
### ver 1.1.5 增加CommonTableButtonFixed, 右侧按钮固定
### ver 1.1.5 CommonTableButtonAn 增加对positition的处理
### ver 1.1.4 CommonTableDropdown 增加对object的处理的 ”关联“ 字段
### ver 1.1.3 CommonTableDropdown 增加对数组的处理
### ver 1.1.2 CommonTableButton获取器的添加,CommonTableDropdown组件的添加
### ver 1.1.0 CommonTableButton完全做好了
父组件
```
import CommonTable from "frontelementpackage/src/CommonTableButton.vue";
html 中
<common-table
:tableData="tableData.slice((currentPage - 1) * pagesize, currentPage * pagesize)"
:tableLabel="tableLabel"
:tableButton="tableButton"
="editFirstLevel"
="delFirstLevel"
></common-table>
data中
tableButton: [
{
name: "11",
type: "danger",
size: "small",
},
{
name: "15",
type: "danger",
size: "small",
},
{
name: "11",
type: "danger",
size: "small",
},
],
tableLabel: [
{
prop: "name",
label: "账户名字",
width: 200,
},
{
prop: "email",
label: "邮箱",
width: 200,
},
{
prop: "phone",
label: "手机号",
width: 200,
},
{
prop: "garage_account_relevance_count",
label: "子账户账号",
reflect:0,
width: 200,
},
{
prop: "status",
label: "状态",
width: 200,
},
],
tableData: [],
method中
editFirstLevel(row,methods) {
console.log(row,methods)
},
```
### ver 1.0.15 CommonTableButton 修复bug
### ver 1.0.14 CommonTableButton 修复一些bug
```
接着修复bug,父组件返回第一个值接受行数据,第二个值接受内容
```
### ver 1.0.13 CommonTableButton 修复一些bug
### ver 1.0.12 CommonTableButton 组件更新获取器方法
```
tableLabel: [
{
prop: "name",
label: "账户名字",
width: 200,
},]
```
### ver 1.0.11 CommonTableButton 组件更新
```
tabledata示例
this.tableButton=[{
name:"",
type:"primary",
size:"small",
}]
this.tabledata=[
{
"id": "46BeC977-dC5b-bB93-2510-9d4AE8CBFc3e",
"name": "龚静",
"addr": "宁夏回族自治区 吴忠市 青铜峡市",
"age": 41,
"birth": "2010-03-22",
"sex": 0,
"sexLabel": "女"
}
]
this.tableLabel=
[
{
"prop": "name",
"label": "姓名"
},
{
"prop": "age",
"label": "年龄"
},
{
"prop": "sexLabel",
"label": "性别"
},
{
"prop": "birth",
"label": "出生日期",
"width": 200
},
{
"prop": "addr",
"label": "地址",
"width": 320
}
]
父组件调用示例如下
<common-table
:tableData="tableData"
:tableLabel="tableLabel"
:config="config"
="getList()"
="editFirstLevel"
="delFirstLevel"
></common-table>
```
### ver 1.0.10 table高度bug优化
### ver 1.0.9 table高度bug优化
### ver 1.0.8 代码细节优化
### ver 1.0.7 对commontable组件进行解耦
### elementui 引入
安装 npm install element-ui@2.15.6
项目引用示例:
frontelementpackage
引入import CommonTable from 'frontelementpackage/src/CommonTable.vue'
npm install 常见错误
1.less提示没有getoptions
解决方法:
npm install less-loader@6 --save-dev
<strong>main.js中</strong>
```
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
```
<br><br>
<strong>这些组件都是直接复制到你的component文件夹下就好了</strong>