em-element-ui v1.2.139
使用说明
em-element-ui该组件是基于Vue和element-ui开发,该组件主要用于快速开发列表的增删查改功能,只需配置页面上显示的字段,并对各个字段加上对应的显示规则即可显示。
安装
npm install element-ui -S
npm install em-element-ui -D
安装使用
import Vue from 'vue'
import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(Element)
import emUI from 'em-element-ui'
Vue.use(emUI);
:::
列表属性描述
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
tableListName | 列表对应名称 | string | 必填 | — |
source | table表数据的来源。data表示自定义数据;query是通过URL动态获取,如:table queryURL | string | data/query | query |
sourceData | source值为data时使用 | array | — | [] |
rowKey | 表示table对应的字段显示下三角 | string | — | - |
mode_list | 修改和编译列表时,各个字段显示在不同的mode区域 | array | — | [] |
page_status | 控制显示内容,1:搜索条件;2:选择显示列;4:表格;8:分页功能;16:增加按钮;32:删除按钮;64:全局搜索控件 | int | — | 12 |
page_column | 列表对应字段 | array | 必填 | - |
select_list | 列表中存在select组件,使用key-value对应 | object | — | - |
composeParam | 删除主键 | array | — | 'id' |
buttonsList | 自定义操作按钮{type: 'info',icon: '',event: 'import',name: '导入'} | array/function | — | - |
queryParam | 自定义list分页功能,格式:{type: 1,key: 'page',value: 'pageNum'},{type: 1,key: 'size',value: 'pageSize'},{type: 2,key: 'param',value: {}} | array | — | {type: 1,key: 'page',value: 'pageNum'},{type: 1,key: 'size',value: 'pageSize'} |
dialogFooter | 自定义dialog按钮,正在开发... | array | — | 'id' |
axios | 自定义请求头文件和超时时间,axios定义的参数 | object | — | {timeout: 5000, headers: {}} |
optRules | 删除前校验规则,如:isRules: true,_method: 'post',_url: '/',params: {busCode: function(row,field){//根据key获取删除记录对应的值},pageNum: 1,pageSize: 10},_axios: {},message: '该记录在数据中有关联,请先删除关联数据! | object | — | - |
responseSuccess | response返回字段校验{key:'code', value: 0, message: 'message'} | object | — | - |
列表事件
事件名 | 说明 | 参数 |
---|---|---|
onListEvent | 用于用户自定义事件,扩充接口。type为事件类型,row操作的行 | type, row |
onReqParams | 用于用户自定义参数,扩充接口。type为类型,obj为list对象,callback为回调函数用来输出自定义参数 | type, row, callback |
table queryURL
queryURL是一个自定义请求参数,以key-val方式传递,key代表是请求事件,如:add/edit/list/del和自定义事件,注意:key为name时,是新增和编辑左上角title提示;val为对象,描述如下: | 参数 | 说明 | 类型 | 可选值 | 默认值 | |---------- |-------------- |---------- |-------------------------------- |-------- | | url | 请求地址 | string | - | - | | method | 请求方式 | string | — | - | | name | 删除时回显字段 | string | — | - | | isArray | 多字段组合删除时,支持多个删除 | string | — | - | | success | response返回字段校验{key:'code', value: 0, message: 'message'} | object | — | - |
mode_list
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
ou | 区域的主键 | int | - | - |
name | 区域的名称 | string | — | - |
select_list
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
key | 字段的名字 | string | - | - |
value | 字段值,array:为静态值,如:{value: 0, label: '禁用'},{value: 1, label: '启用'};object:为动态获取值,如:{url: '/',props: {value: 'oid', label: 'name'},node:'data', 'list',params: {page: 1, size: 10}} | array/object | — | - |
page_column table
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
field | 字段 | string | - | - |
stype | 显示信息类型,值:checkbox,opt,tag,list-tag,link,switch,image,list,mapping | string | — | - |
name | 字段名称 | string | — | - |
fixed | 字段是否固定 | string | left/right | - |
width | 字段宽度 | int | — | - |
action | 动态请求该字段值 | string | — | - |
formatter | 根据key-val获取对应的值 | string | — | - |
sort | 字段是否排序 | boolean/string | true/false/custom | false |
ispush | 提交表单时,该字段是否提交 | boolean | — | false |
align | 显示位置 | string | left/center/right | left |
hide | 是否隐藏 | boolean | — | false |
show | 用于控制增加和编辑form表单使用,详细情况:mode_list add/edit | object | — | - |
search | 用于控制查询条件,详细情况:mode_list search | object | — | - |
rules | 用于控制文本框合法校验,详细情况:mode_list rules | array | — | - |
success | response返回字段校验{key:'code', value: 0, message: 'message'} | object | — | - |
mode_list add/edit
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
field | 如果该字段存在,则一个该字段给后台,如果没有默认以list为准 | string | - | - |
parent | field字段归属于该字段 | string | - | - |
type | 文本框类型,值:hide,text,password,text-tag,select,cascader,radio,checkboxall,file,switch,date,time-picker,date-picker,textarea,texttime,dynamic,button,span,task,key-val | string | - | - |
ou | 根据mode主键显示文本框 | int | — | - |
obj | 动态获取对应的值 | array | — | - |
isDisabled | 是否在修改时,可编辑该文本框 | boolean | — | false |
remote | 动态搜索远程服务器功能 | boolean | — | false |
findKey | 搜索的字段 | string | — | - |
paramKey | 参数内参数 | string | — | - |
value | 设置默认值 | string | — | - |
placeholder | 文本框描述 | string | — | - |
action | 动态提交事件 | string | — | - |
param | 动态提交事件,解释值:{key: 'code', value: 200, filename: 'data'} | obj | — | - |
mapping | type为select,当前字段映射显示对应字段值 | string | — | - |
success | response返回字段校验{key:'code', value: 0, message: 'message'} | object | — | - |
mode_list search
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
type | 文本框类型,值:text,date,time-picker,select,time-select,datetimerange | string | - | - |
obj | 动态获取对应的值 | array | — | - |
placeholder | 文本框描述 | string | — | - |
mode_list rules
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
required | 是否必输 | boolean | - | false |
message | 错误提示消息 | string | — | - |
trigger | 触发校验 | array/string | blur/change | - |
min | 最小长度 | int | — | - |
max | 最大长队 | int | — | - |
validator | 自定义校验规则,function代表自定义方法 | string/function | — | - |
DEMO演示
<template>
<div class="template-main">
<em-table-list :tableListName="'collect'" :sourceData="sourceData" :source="source" :mode_list="mode_list" :page_status="page_status" :page_column="page_column" :select_list="select_list" @onListEvent="onListEvent"></em-table-list>
</div>
</template>
<script>
export default {
name: 'collect',
computed: {},
data() {
return {
sourceData: [{
collectPartner: '10001',
businessLicense: '91110108MA01QC0B0T',
companyId: 'ENN123456789012345678',
companyName: 'test',
companyAddress: '河北廊坊',
status: 1
}],
source: 'data',
mode_list: [],
page_status: 29,
page_column: [
{field: "collectPartner", name: "企业代码", fixed: "left", width: 90,
show: {type: 'text', ou: 1, placeholder: '企业代码', default: {}},
search: {type: 'text', obj: 'collectPartner', placeholder: '企业代码', default: {}},
rules: [
{ required: true, message: '请输入名称!', trigger: 'blur' },
{ min: 5, max: 32, message: '长度在 1 到 32 个字符', trigger: 'blur'},
{ validator: function (rule, value, callback) {
}, message: '名称格式为汉字、字符和下划线', trigger:'blur'}]},
{field: "businessLicense", name: "信用代码", width: 190,
show: {type: 'text', ou: 1, placeholder: '社会信用统一代码'}},
{field: "companyId", name: "ID", width: 180},
{field: "companyName", name: "企业名称",
show: {type: 'text', ou: 1, placeholder: '企业名称'},
search: {type: 'text', obj: 'companyName', placeholder: '企业名称'}},
{field: "companyAddress", name: "企业地址",
show: {type: 'text', ou: 1, placeholder: '企业地址'}},
{field: "status", stype:'switch', name: "状态", formatter: 'status', width: 80, surl: '/', switchs: {key: 'companyId'},
show: {type: 'select', ou: 1, obj: 'status', placeholder: '状态'}},
{field: "useropts", stype:'opt', ispush: false, name: "操作", align: 'center', fixed: "right",
list:[
{ type: 'add', size: 'small', icon: '', style: '', name: '新增'},
{ type: 'edit', size: 'small', icon: '', style: '', name: '编辑'},
{ type: 'del', size: 'small', icon: '', style: 'color: red', name: '删除'},
{ type: 'exec', size: 'small', icon: '', name: '抽取'},
]}
],
select_list: {
status: [
{value: 0, label: '禁用'},
{value: 1, label: '启用'}
],
companyList: {
url: '/',
}
}
}
},
created: function() {},
methods: {
onListEvent(){
console.log(arguments)
}
}
}
</script>
手机端图片显示线和柱状图
<template>
<div class="template-main">
<em-charts :webUIType="'f2'" :chartOptions="charts"></em-charts>
</div>
</template>
<script>
export default {
name: "collect",
computed: {},
data() {
return {
charts: {
id: "charts",
class: "",
data: {
status: 2,
series: [
{
release: 0,
year: "1951 年",
sales: 38,
type: 'a'
},
{
release: 0,
year: "1951 年",
sales: 41,
type: 'b'
},
{
release: 1,
year: "1952 年",
sales: 52,
type: 'a'
},
{
release: 1,
year: "1952 年",
sales: 32,
type: 'b'
},
{
release: 2,
year: "1956 年",
sales: 61,
type: 'a'
},
{
release: 2,
year: "1956 年",
sales: 72,
type: 'b'
},
{
release: 3,
year: "1957 年",
sales: 145,
type: 'a'
},
{
release: 3,
year: "1957 年",
sales: 95,
type: 'b'
},
{
release: 4,
year: "1958 年",
sales: 48,
type: 'a'
},
{
release: 4,
year: "1958 年",
sales: 48,
type: 'b'
},
{
release: 5,
year: "1959 年",
sales: 38,
type: 'a'
},
{
release: 5,
year: "1959 年",
sales: 12,
type: 'b'
},
{
release: 6,
year: "1960 年",
sales: 38,
type: 'a'
},
{
release: 6,
year: "1960 年",
sales: 43,
type: 'b'
},
{
release: 7,
year: "1962 年",
sales: 38,
type: 'a'
},
{
release: 7,
year: "1962 年",
sales: 72,
type: 'b'
},
{
release: 8,
year: "1963 年",
sales: 38,
type: 'a'
},
{
release: 8,
year: "1963 年",
sales: 29,
type: 'b'
},
{
release: 9,
year: "1964 年",
sales: 39,
type: 'a'
},
{
release: 9,
year: "1964 年",
sales: 51,
type: 'b'
}
]//柱状图
/*series: [
{
value: 63.4,
city: "New York",
release: 0,
date: "2011-10-01"
},
{
value: 62.7,
city: "Alaska",
release: 1,
date: "2011-10-01"
},
{
value: 72.2,
city: "Austin",
release: 2,
date: "2011-10-01"
},
{
value: 58,
city: "New York",
release: 3,
date: "2011-10-02"
},
{
value: 59.9,
city: "Alaska",
release: 4,
date: "2011-10-02"
},
{
value: 67.7,
city: "Austin",
release: 5,
date: "2011-10-02"
},
{
value: 53.3,
city: "New York",
release: 6,
date: "2011-10-03"
},
{
value: 59.1,
city: "Alaska",
release: 7,
date: "2011-10-03"
},
{
value: 69.4,
city: "Austin",
release: 8,
date: "2011-10-03"
},
{
value: 55.7,
city: "New York",
release: 9,
date: "2011-10-04"
},
{
value: 58.8,
city: "Alaska",
release: 10,
date: "2011-10-04"
},
{
value: 68,
city: "Austin",
release: 11,
date: "2011-10-04"
},
{
value: 64.2,
city: "New York",
release: 12,
date: "2011-10-05"
},
{
value: 58.7,
city: "Alaska",
release: 13,
date: "2011-10-05"
},
{
value: 72.4,
city: "Austin",
release: 14,
date: "2011-10-05"
},
{
value: 58.8,
city: "New York",
release: 15,
date: "2011-10-06"
},
{
value: 57,
city: "Alaska",
release: 16,
date: "2011-10-06"
},
{
value: 77,
city: "Austin",
release: 17,
date: "2011-10-06"
},
{
value: 57.9,
city: "New York",
release: 18,
date: "2011-10-07"
},
{
value: 56.7,
city: "Alaska",
release: 19,
date: "2011-10-07"
},
{
value: 82.3,
city: "Austin",
release: 20,
date: "2011-10-07"
},
{
value: 61.8,
city: "New York",
release: 21,
date: "2011-10-08"
},
{
value: 56.8,
city: "Alaska",
release: 22,
date: "2011-10-08"
},
{
value: 78.9,
city: "Austin",
release: 23,
date: "2011-10-08"
},
{
value: 69.3,
city: "New York",
release: 24,
date: "2011-10-09"
},
{
value: 56.7,
city: "Alaska",
release: 25,
date: "2011-10-09"
},
{
value: 68.8,
city: "Austin",
release: 26,
date: "2011-10-09"
},
{
value: 71.2,
city: "New York",
release: 27,
date: "2011-10-10"
},
{
value: 60.1,
city: "Alaska",
release: 28,
date: "2011-10-10"
},
{
value: 68.7,
city: "Austin",
release: 29,
date: "2011-10-10"
},
{
value: 68.7,
city: "New York",
release: 30,
date: "2011-10-11"
},
{
value: 61.1,
city: "Alaska",
release:31,
date: "2011-10-11"
},
{
value: 70.3,
city: "Austin",
release: 32,
date: "2011-10-11"
},
{
value: 61.8,
city: "New York",
release: 33,
date: "2011-10-12"
},
{
value: 61.5,
city: "Alaska",
release: 34,
date: "2011-10-12"
},
{
value: 75.3,
city: "Austin",
release: 35,
date: "2011-10-12"
},
{
value: 63,
city: "New York",
release: 36,
date: "2011-10-13"
},
{
value: 64.3,
city: "Alaska",
release: 37,
date: "2011-10-13"
},
{
value: 76.6,
city: "Austin",
release: 38,
date: "2011-10-13"
},
{
value: 66.9,
city: "New York",
release: 39,
date: "2011-10-14"
},
{
value: 67.1,
city: "Alaska",
release: 40,
date: "2011-10-14"
},
{
value: 66.6,
city: "Austin",
release: 41,
date: "2011-10-14"
},
{
value: 61.7,
city: "New York",
release: 42,
date: "2011-10-15"
},
{
value: 64.6,
city: "Alaska",
release: 43,
date: "2011-10-15"
},
{
value: 68,
city: "Austin",
release: 44,
date: "2011-10-15"
},
{
value: 61.8,
city: "New York",
release: 45,
date: "2011-10-16"
},
{
value: 61.6,
city: "Alaska",
release: 46,
date: "2011-10-16"
},
{
value: 70.6,
city: "Austin",
release: 47,
date: "2011-10-16"
},
{
value: 62.8,
city: "New York",
release: 48,
date: "2011-10-17"
},
{
value: 61.1,
city: "Alaska",
release: 49,
date: "2011-10-17"
},
{
value: 71.1,
city: "Austin",
release: 50,
date: "2011-10-17"
},
{
value: 60.8,
city: "New York",
release: 51,
date: "2011-10-18"
},
{
value: 59.2,
city: "Alaska",
release: 52,
date: "2011-10-18"
},
{
value: 70,
city: "Austin",
release: 53,
date: "2011-10-18"
},
{
value: 62.1,
city: "New York",
release: 54,
date: "2011-10-19"
},
{
value: 58.9,
city: "Alaska",
release: 55,
date: "2011-10-19"
},
{
value: 61.6,
city: "Austin",
release: 56,
date: "2011-10-19"
},
{
value: 65.1,
city: "New York",
release: 57,
date: "2011-10-20"
},
{
value: 57.2,
city: "Alaska",
release: 58,
date: "2011-10-20"
},
{
value: 57.4,
city: "Austin",
release: 59,
date: "2011-10-20"
},
{
value: 55.6,
city: "New York",
release: 60,
date: "2011-10-21"
},
{
value: 56.4,
city: "Alaska",
release: 61,
date: "2011-10-21"
},
{
value: 64.3,
city: "Austin",
release: 62,
date: "2011-10-21"
},
{
value: 54.4,
city: "New York",
release: 63,
date: "2011-10-22"
},
{
value: 60.7,
city: "Alaska",
release: 64,
date: "2011-10-22"
},
{
value: 72.4,
city: "Austin",
release: 65,
date: "2011-10-22"
},
{
value: 54.4,
city: "New York",
release: 66,
date: "2011-10-23"
},
{
value: 65.1,
city: "Alaska",
release: 67,
date: "2011-10-23"
},
{
value: 72.4,
city: "Austin",
release: 68,
date: "2011-10-23"
},
{
value: 54.8,
city: "New York",
release: 69,
date: "2011-10-24"
},
{
value: 60.9,
city: "Alaska",
release: 70,
date: "2011-10-24"
},
{
value: 72.5,
city: "Austin",
release: 71,
date: "2011-10-24"
},
{
value: 57.9,
city: "New York",
release: 72,
date: "2011-10-25"
},
{
value: 56.1,
city: "Alaska",
release: 73,
date: "2011-10-25"
},
{
value: 72.7,
city: "Austin",
release: 74,
date: "2011-10-25"
},
{
value: 54.6,
city: "New York",
release: 75,
date: "2011-10-26"
},
{
value: 54.6,
city: "Alaska",
release: 76,
date: "2011-10-26"
},
{
value: 73.4,
city: "Austin",
release: 77,
date: "2011-10-26"
},
{
value: 54.4,
city: "New York",
release: 78,
date: "2011-10-27"
},
{
value: 56.1,
city: "Alaska",
release: 79,
date: "2011-10-27"
},
{
value: 70.7,
city: "Austin",
release: 80,
date: "2011-10-27"
},
{
value: 42.5,
city: "New York",
release: 81,
date: "2011-10-28"
},
{
value: 58.1,
city: "Alaska",
release: 82,
date: "2011-10-28"
},
{
value: 56.8,
city: "Austin",
release: 83,
date: "2011-10-28"
},
{
value: 40.9,
city: "New York",
release: 84,
date: "2011-10-29"
},
{
value: 57.5,
city: "Alaska",
release: 85,
date: "2011-10-29"
},
{
value: 51,
city: "Austin",
release: 86,
date: "2011-10-29"
},
{
value: 38.6,
city: "New York",
release: 87,
date: "2011-10-30"
},
{
value: 57.7,
city: "Alaska",
release: 88,
date: "2011-10-30"
},
{
value: 54.9,
city: "Austin",
release: 89,
date: "2011-10-30"
},
{
value: 44.2,
city: "New York",
release: 90,
date: "2011-10-31"
},
{
value: 55.1,
city: "Alaska",
release: 91,
date: "2011-10-31"
},
{
value: 58.8,
city: "Austin",
release: 92,
date: "2011-10-31"
},
{
value: 49.6,
city: "New York",
release: 93,
date: "2011-11-01"
},
{
value: 57.9,
city: "Alaska",
release: 94,
date: "2011-11-01"
},
{
value: 62.6,
city: "Austin",
release: 95,
date: "2011-11-01"
},
{
value: 47.2,
city: "New York",
release: 96,
date: "2011-11-02"
},
{
value: 64.6,
city: "Alaska",
release: 97,
date: "2011-11-02"
},
{
value: 71,
city: "Austin",
release: 98,
date: "2011-11-02"
}
]*///线
},
title: {
text: 'sksdkskd'
},
options: {
x: "year",
y: "sales",
name: "type",
type: "interval",
size: 10,
adjust: {
type: 'dodge',
marginRatio: -0.3
},
mode: 'more',
scroll: true
}//柱状图
/*options: {
x: "release",
name: "city",
y: "value",
type: {
line: true,
point: false,
area: true
},
scroll: true,
size: 5,
style: {
type: "point",
stroke: "#fff",
lineWidth: 1
},
axis: {
key: "release",
mapping: 'date'
}
}*///线图
}
};
}
};
</script>
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago