Commit e4db60f6 by zhangmeng

ecm

parent 482d3b2b
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=/marketing/static/css/app.4b293cbfbc1cce3d6284acc40f20a078.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.162b0e6539b2dd8ccf95.js></script><script type=text/javascript src=/marketing/static/js/app.79af0217abf4eb3eab29.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=/marketing/static/css/app.5296ef48442f7cb2584ff83e80d2e972.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.162b0e6539b2dd8ccf95.js></script><script type=text/javascript src=/marketing/static/js/app.0066977c2f71c91bf08c.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -8,6 +8,7 @@ export default {
path: '/test',
name: '测试组件',
component: test,
redirect:'/test/marketingEvent',
children:[
{
path: 'staticcom',
......
File mode changed from 100755 to 100644
File mode changed from 100755 to 100644
/* reset样式 */
.w100 {
width: 100px;
width: 100px;
}
.w200 {
width: 200px;
width: 200px;
}
.mr5 {
margin-right: 5px;
}
.w240 {
width: 240px;
width: 240px;
}
.vertical-middle {
vertical-align: middle;
}
.vertical-baseline {
vertical-align: baseline;
}
.inline-block {
vertical-align: middle;
display:inline-block!important;
vertical-align: middle;
display: inline-block!important;
}
.block{
display: block!important;
.block {
display: block!important;
}
.gray-color{
color:#909399;
.gray-color {
color: #909399;
}
.fz13 {
font-size: 13px;
font-size: 13px;
}
.fz12 {
font-size: 12px;
font-size: 12px;
}
.fl {
float: left;
float: left;
}
.fr {
float: right;
float: right;
}
.clearfix:after{
display: block;
clear: both;
content: '';
visibility: hidden;
height: 0;
.clearfix:after {
display: block;
clear: both;
content: '';
visibility: hidden;
height: 0;
}
.clearfix{
zoom: 1;
.clearfix {
zoom: 1;
}
.vertical-middle {
vertical-align: middle;
vertical-align: middle;
}
.block{
display: block;
overflow: hidden;
.block {
display: block;
overflow: hidden;
}
.text-center{
text-align: center;
}
/* reset样式end */
/* reset样式end */
/* 公共样式START */
.dm-store__btn{
text-align: right;
height: 18px;
line-height: 28px;
.dm-store__btn {
text-align: right;
height: 18px;
line-height: 28px;
}
.dm-store__btn--border {
border-top:1px solid #E4E7ED;
border-top: 1px solid #E4E7ED;
}
.dm-store__btn--cancel {
font-size: 13px;
margin-right: 8px;
font-size: 13px;
margin-right: 8px;
}
/* 左右移动的组件 */
.dm-store__wrap{
width: 500px;
height: 378px;
overflow: hidden;
.dm-store__wrap {
width: 500px;
height: 378px;
overflow: hidden;
}
.dm-store__left,.dm-store__right{
display: inline-block;
width: 200px;
height:376px;
overflow: hidden;
border:1px solid #E4E7ED;
border-radius:4px;
vertical-align: middle;
background: #fff;
.dm-store__left,
.dm-store__right {
display: inline-block;
width: 200px;
height: 376px;
overflow: hidden;
border: 1px solid #E4E7ED;
border-radius: 4px;
vertical-align: middle;
background: #fff;
}
.dm-store__state {
display: flex;
justify-content: space-between;
background:#F5F7FA;
border-bottom: 1px solid #E4E7ED;
height: 40px;
padding:0 10px;
line-height: 40px;
overflow: hidden;
display: flex;
justify-content: space-between;
background: #F5F7FA;
border-bottom: 1px solid #E4E7ED;
height: 40px;
padding: 0 10px;
line-height: 40px;
overflow: hidden;
}
.dm-store__state > * {
vertical-align: middle;
.dm-store__state>* {
vertical-align: middle;
}
.dm-store__search {
margin: 10px;
margin: 10px;
}
.dm-store__search .el-input__inner {
border-radius: 30px;
border-radius: 30px;
}
.dm-store__list{
margin: 0;
overflow-y: auto;
overflow-x: hidden;
height: 284px;
.dm-store__list {
margin: 0;
overflow-y: auto;
overflow-x: hidden;
height: 284px;
}
.dm-store__item{
height: 34px;
display: flex;
justify-content: space-between;
line-height: 34px;
padding:0 10px;
.dm-store__item {
height: 34px;
display: flex;
justify-content: space-between;
line-height: 34px;
padding: 0 10px;
}
.dm-store__item--52 {
height: 52px;
line-height: 52px;
height: 52px;
line-height: 52px;
}
.dm-store__item:hover {
background: #F5F7FA;
background: #F5F7FA;
}
.dm-store__item >i {
line-height: 34px;
.dm-store__item>i {
line-height: 34px;
}
.dm-store__item--52>i {
line-height: 52px;
}
.dm-store__item--52 >i {
line-height: 52px;
.dm-store__item .el-checkbox__label {
white-space: nowrap;
text-overflow: ellipsis;
width: 136px;
overflow: hidden;
vertical-align: middle;
}
.dm-store__item .el-checkbox__label{
white-space: nowrap;
text-overflow: ellipsis;
width: 136px;
overflow: hidden;
vertical-align: middle;
.dm-store__list--more{
text-align: center;
padding:10px 0;
}
.dm-store__center{
display: inline-block;
vertical-align: middle;
width: 78px;
.dm-store__center {
display: inline-block;
vertical-align: middle;
width: 78px;
}
.dm-store__center .el-button {
display: block;
margin: 10px auto;
display: block;
margin: 10px auto;
}
.dm-store__reference {
position: relative;
position: relative;
}
.dm-store__inputtag{
white-space: nowrap;
overflow: hidden;
padding:0 6px;
line-height: 28px;
vertical-align: middle;
.dm-store__inputtag {
white-space: nowrap;
overflow: hidden;
padding: 0 6px;
line-height: 28px;
vertical-align: middle;
}
.dm-store__inputtag--tips {
padding:6px;
padding: 6px;
}
.dm-store__inputtag .el-tag{
margin-right:4px;
.dm-store__inputtag .el-tag {
margin-right: 4px;
}
.dm-store__inputtag--total{
position: absolute;
top: 1px;
right: 1px;
background:#fff;
border-radius: 4px;
height: 30px;
line-height: 30px;
font-size: 12px;
padding: 0 6px;
.dm-store__inputtag--total {
position: absolute;
top: 1px;
right: 1px;
background: #fff;
border-radius: 4px;
height: 30px;
line-height: 30px;
font-size: 12px;
padding: 0 6px;
}
.dm-store__total--tag{
margin:5px;
.dm-store__total--tag {
margin: 5px;
}
/* 公共样式END */
/* 公共样式END */
.dm-store__area{
width: 412px;
height: 403px;
overflow: hidden;
.dm-store__area {
width: 412px;
height: 403px;
overflow: hidden;
}
.dm-store__type__item {
height: 34px;
line-height: 34px;
padding:0 10px;
height: 34px;
line-height: 34px;
padding: 0 10px;
}
.dm-store__type__item:hover {
background: #F5F7FA;
background: #F5F7FA;
}
.dm-store__inner {
position: relative;
vertical-align: middle;
position: relative;
vertical-align: middle;
}
.dm-store__card{
width: 490px;
height: 378px;
overflow: hidden;
/* background: #fff; */
.dm-store__card {
width: 490px;
height: 378px;
overflow: hidden;
/* background: #fff; */
}
File mode changed from 100755 to 100644
......@@ -8,7 +8,6 @@
<option-area v-if="storeType === 3" :uuid="newUuid"></option-area>
<option-group v-if="storeType === 4" :uuid="newUuid"></option-group>
<option-part v-if="storeType === 5" :uuid="newUuid"></option-part>
<el-button @click="isStoreSave">判断门店是否保存</el-button>{{isSave}}
</section>
</template>
......@@ -68,7 +67,6 @@ export default {
},
data() {
return {
isSave:false,
storeType:0, // 一级选择值
leftList:[],
newUuid:uuidv1().replace(/-/g,'') // 生成uuid
......@@ -121,7 +119,7 @@ export default {
console.log(err)
})
},
// 判断门店是否保存
// 判断门店是否保存
isStoreSave() {
return new Promise((resolve,reject) => {
let params = {
......@@ -141,7 +139,7 @@ export default {
})
},
}
}
</script>
......
<template>
<el-popover class="inline-block" placement="bottom-start" width="406" height="400" trigger="click" v-model="popoverShow">
<el-popover class="vertical-baseline" placement="bottom-start" width="406" height="400" trigger="click" v-model="popoverShow">
<div class="dm-store__area" style="height: 400px;">
<!-- 左侧 -->
<div class="dm-store__left">
......@@ -60,7 +60,7 @@ export default {
this.totalCity = 0;
this.areaList.map(v => {
// 半勾选计算市数量
if (v.indeterminate && v.isCheck && v.children.length) {
if ( v.isCheck && v.children.length) {
v.children.map(w => {
if (w.isCheck) {
this.totalCity ++
......
<template>
<el-popover class="inline-block" placement="bottom-start" width="490" height="378" trigger="click">
<el-popover class="vertical-baseline" placement="bottom-start" width="490" height="378" trigger="click">
<div class="dm-store__wrap" style="height: 378px;">
<!-- 左侧 -->
<div class="dm-store__left">
......
<template>
<el-popover class="inline-block" placement="bottom-start" width="490" height="378" trigger="click">
<el-popover class="vertical-baseline" placement="bottom-start" width="490" height="378" trigger="click">
<div class="dm-store__wrap" style="height: 378px;">
<div class="dm-store__left">
<div class="dm-store__state">
......@@ -37,7 +37,9 @@
<i class="el-icon-close" v-show="rightHoverIndex !== i"></i>
<i class="el-icon-circle-close" v-show="rightHoverIndex === i" @click.stop="deleteRightItems(v.id)"></i>
</p>
<p class="dm-store__list--more"><el-button type="text" @click="loadMore">加载更多</el-button></p>
</el-checkbox-group>
</div>
</div>
<div class="el-input dm-store__reference w240" slot="reference">
......@@ -49,7 +51,7 @@
<el-tag class="dm-store__total--tag" v-for="v in rightList" :key="v.id" @close="deleteRightItems(v.id)" closable>
{{v.name}}
</el-tag>
<span slot="reference" class="dm-store__inputtag--total" v-show="rightList.length">{{params.isAll?rightTotal:rightList.length}}</span>
<span slot="reference" class="dm-store__inputtag--total" v-show="rightList.length">{{rightTotal}}</span>
</el-popover>
</div>
</el-popover>
......@@ -57,6 +59,7 @@
<script>
import qs from 'qs';
import { baseUrl } from '../config';
let loadMoreFlag = false;
export default {
name:'options-part',
props:{
......@@ -80,6 +83,13 @@ export default {
value:'', //否 string isAll=0时,必填,选中项id,多个逗号分隔
removeItems:'', //否 string isAll=1,取消选中项的id,多个逗号分隔
},
rightParams:{
key:this.uuid,
selectType:5,
search:this.rightValue,
currentPage:1,
pageSize:20
},
isIndeterminate: true,
rightHoverIndex:null,
rightTotal:0,
......@@ -102,19 +112,14 @@ export default {
},
// 拉取右侧数据
getRightList() {
let params = {
key:this.uuid,
selectType:5,
search:this.rightValue,
currentPage:1,
pageSize:20
}
this.rightParams.key = this.uuid;
this.rightParams.search = this.rightValue;
this.axios.post(baseUrl + '/api-plug/list-right-data?requestProject=gic-web',qs.stringify(params)).then(res => {
this.rightList = (res.data.result && res.data.result.result) || [];
this.rightTotal = (res.data.result && res.data.result.totalCount) || 0;
}).catch(err => {
console.log(err)
})
});
},
// 左侧数据移动到右侧
saveToRight() {
......@@ -166,6 +171,10 @@ export default {
handleCheckAllChange(val) {
this.leftCheckList = val ? this.leftList.map(v => v.storeId) : [];
},
// 加载更多
loadMore() {
this.rightParams.currentPage += 1;
}
}
}
</script>
......
<template>
<el-popover class="inline-block" placement="bottom-start" width="490" height="378" trigger="click">
<el-popover class="vertical-baseline" placement="bottom-start" width="490" height="378" trigger="click">
<div class="dm-store__wrap" style="height: 378px;">
<div class="dm-store__left">
<div class="dm-store__state">
......
<template>
<el-popover class="inline-block" placement="bottom-start" width="214" trigger="click" v-model="popoverShow">
<el-popover class="vertical-baseline" placement="bottom-start" width="214" trigger="click" v-model="popoverShow">
<el-checkbox-group v-model="checkedList">
<div class="dm-store__type__item" v-for="(v,i) in typeList" :key="i">
<el-checkbox :label="v.value">{{v.label}}</el-checkbox>
......@@ -11,7 +11,7 @@
</div>
<div class="el-input dm-store__reference w240" slot="reference">
<div class="el-input__inner dm-store__inputtag">
<el-tag v-for="(v,i) in checkedList" size="small" :key="i" closable @close="delItem(i)">{{filterLabel(v)}}</el-tag>
<el-tag v-for="(v,i) in checkedList" size="small" :key="i" closable @close="delItem(v)">{{filterLabel(v)}}</el-tag>
<span class="gray-color dm-store__inputtag--tips" v-show="checkedList.length === 0">请选择门店</span>
</div>
<el-popover placement="top-start" popper-class="select-shop__popper" width="300" trigger="hover">
......@@ -98,10 +98,19 @@ export default {
console.log(err)
})
},
// 删除
delItem(index) {
this.checkedList.splice(index,1);
}
// 删除右侧单选或者多选数据
delItem(v) {
let params = {
key:this.uuid,
removeItems:v,
value:''
}
this.axios.post(baseUrl + '/api-plug/remove-items?requestProject=gic-web',qs.stringify(params)).then(res => {
this.getRightList();
}).catch(err => {
console.log(err)
})
},
}
}
</script>
......
File mode changed from 100755 to 100644
......@@ -4,18 +4,15 @@
<el-aside width="200px" style="background-color: rgb(238, 241, 246);height:100%;">
<el-menu :default-openeds="['1', '3']" style="background-color: rgb(238, 241, 246);height:100%;">
<el-submenu index="1">
<template slot="title"><i class="el-icon-message"></i>GIC后台组件</template>
<el-menu-item index="1-1">营销事件</el-menu-item>
<el-menu-item index="1-2">门店组件</el-menu-item>
<template slot="title">GIC后台组件</template>
<el-menu-item index="1-1" @click="$router.push('/test/marketingEvent')">营销事件</el-menu-item>
<el-menu-item index="1-2" @click="$router.push('/test/storeNew')">门店组件</el-menu-item>
<!-- <el-menu-item index="1-3">选项3</el-menu-item> -->
</el-submenu>
<el-submenu index="2">
<template slot="title"><i class="el-icon-menu"></i>静态组件</template>
<el-menu-item index="2-1">静态组件</el-menu-item>
<el-menu-item index="2-2">选项3</el-menu-item>
</el-submenu>
<el-menu-item index="2" @click="$router.push('/test/staticcom')">静态组件
</el-menu-item>
<el-submenu index="3">
<template slot="title"><i class="el-icon-setting"></i>其他组件</template>
<template slot="title">其他组件</template>
<el-menu-item index="3-1">选项1</el-menu-item>
<el-menu-item index="3-2">选项2</el-menu-item>
<el-menu-item index="3-3">选项3</el-menu-item>
......
......@@ -108,8 +108,10 @@
</el-form-item>
<el-form-item prop="cardCodeCount" :label="form.useCustomCode?'默认数量':'新建数量'">
<div v-if="!form.useCustomCode"><el-input-number controls-position="right" :min="0" :max="100000" :disabled="isEdit || isInfo" class="w200" v-model="form.cardCodeCount"></el-input-number><span class="fz13 gray">优惠券创建数量,如不填,则默认为100,000张</span></div>
<div v-if="form.useCustomCode"><el-input-number controls-position="right" :min="0" :max="100000" disabled class="w200" :value="form.customCodeEnd - form.customCodeBegin + 1"></el-input-number><span class="fz13 gray">优惠券创建数量,如不填,则默认为100,000张</span></div>
<div v-if="!form.useCustomCode">
<el-input-number controls-position="right" :min="0" :max="10000000" :disabled="isEdit || isInfo" class="w200" v-model="form.cardCodeCount"></el-input-number><span class="fz13 gray">优惠券创建数量,如不填,则默认为100,000张</span></div>
<div v-if="form.useCustomCode">
<el-input-number controls-position="right" :min="0" :max="100000" disabled class="w200" :value="form.customCodeEnd - form.customCodeBegin + 1"></el-input-number><span class="fz13 gray">优惠券创建数量,如不填,则默认为100,000张</span></div>
</el-form-item>
<el-form-item class="is-required" prop="useCustomCode" label="有效期">
......
......@@ -19,18 +19,20 @@
</el-form-item>
<el-form-item label="常用场景" class="width50" v-if="form.effectType">
<div class="fz12 gray">选填,勾选后生效</div>
<div class="pb10">
<el-radio v-model="radio" class="w150" label="brithday_day">会员生日前 </el-radio>
<el-input-number controls-position="right" :min="0" style="width:244px;" :disabled="radio !== 'brithday_day'" v-model="form.brithday_day"></el-input-number>
</div>
<div class="pb10">
<el-radio v-model="radio" class="w150" label="attention_day">关注时长超过 </el-radio>
<el-input-number controls-position="right" :min="0" :max="100000" style="width:244px;" :disabled="radio !== 'attention_day'" v-model="form.attention_day"></el-input-number>
</div>
<div class="pb10">
<el-radio v-model="radio" class="w150" label="lastCost_day">最近消费间隔 </el-radio>
<el-input-number controls-position="right" :min="0" style="width:244px;" :disabled="radio !== 'lastCost_day'" v-model="form.lastCost_day"></el-input-number>
</div>
<el-checkbox-group v-model="checked" :max="1">
<div class="pb10">
<el-checkbox class="w150" label="brithday_day">会员生日前 </el-checkbox>
<el-input-number controls-position="right" :min="0" style="width:244px;" :disabled="checked[0] !== 'brithday_day'" v-model="form.brithday_day"></el-input-number>
</div>
<div class="pb10">
<el-checkbox class="w150" label="attention_day">关注时长超过 </el-checkbox>
<el-input-number controls-position="right" :min="0" :max="100000" style="width:244px;" :disabled="checked[0] !== 'attention_day'" v-model="form.attention_day"></el-input-number>
</div>
<div class="pb10">
<el-checkbox class="w150" label="lastCost_day">最近消费间隔 </el-checkbox>
<el-input-number controls-position="right" :min="0" style="width:244px;" :disabled="checked[0] !== 'lastCost_day'" v-model="form.lastCost_day"></el-input-number>
</div>
</el-checkbox-group>
</el-form-item>
<el-form-item label="营销场景">
<span v-if="isEdit">{{form.sceneSettingName}}</span>
......@@ -151,7 +153,7 @@ export default {
return time.getTime() < Date.now() - 8.64e7;
}
},
radio:'',
checked:[],
rules:{
ecmPlanName:{type:'string', required: true, message: '计划名称不能为空', trigger: 'blur' },
},
......@@ -246,6 +248,11 @@ export default {
this.form.sceneSettingId = result.sceneSettingId;
this.form.sceneSettingName = result.sceneSettingName;
this.form.memberSearchDTO = result.filterJson;
this.form.expireType = result.expireType;
if (this.form.expireType){
this.form.beginDate = result.beginDate || '';
this.form.endDate = result.endDate || '';
}
if (res.result.searchId) {
this.useId = res.result.searchId
this.hasSearchData = result.filterJson;
......@@ -255,11 +262,11 @@ export default {
this.form.attention_day = commonScene.attention_day;
this.form.lastCost_day = commonScene.lastCost_day;
if (this.form.brithday_day) {
this.radio = 'brithday_day'
this.checked = ['brithday_day']
} else if (this.form.attention_day) {
this.radio = 'attention_day'
this.checked = ['attention_day']
} else if (this.form.lastCost_day) {
this.radio = 'lastCost_day'
this.checked = ['lastCost_day']
}
}
} else if (this.isAdd) {
......@@ -267,31 +274,31 @@ export default {
}
},
//提交表单验证人数 只有人员筛选需要
async checkMessageSendCount() {
if (this.form.effectType) {
const params = {
memberSearchDTO:this.form.memberSearchDTO
}
const res = await checkMessageSendCount(params);
if (res.errorCode === 0) {
let msg = `合计发送${res.result}人,是否发送?`
if (this.form.marketingType === 'message') {
msg = `合计发送${res.result}人,短信按67字/条分割成多条并按条计费,请注意控制短信文本长度,是否发送?`
}
this.$confirm(msg,'提示', {
confirmButtonText: '确定',
cancelBUttonText: '取消',
type: 'warning'
}).then(() => {
this.saveEcmInfo();
}).catch(() => {
this.$tips({type: 'info',message: '已取消发送'});
});
}
} else {
this.saveEcmInfo();
}
},
// async checkMessageSendCount() {
// if (this.form.effectType) {
// const params = {
// memberSearchDTO:this.form.memberSearchDTO
// }
// const res = await checkMessageSendCount(params);
// if (res.errorCode === 0) {
// let msg = `合计发送${res.result}人,是否发送?`
// if (this.form.marketingType === 'message') {
// msg = `合计发送${res.result}人,短信按67字/条分割成多条并按条计费,请注意控制短信文本长度,是否发送?`
// }
// this.$confirm(msg,'提示', {
// confirmButtonText: '确定',
// cancelBUttonText: '取消',
// type: 'warning'
// }).then(() => {
// this.saveEcmInfo();
// }).catch(() => {
// this.$tips({type: 'info',message: '已取消发送'});
// });
// }
// } else {
// this.saveEcmInfo();
// }
// },
//提交保存
submit (formName) {
if(this.checkBeginEndTime()) return;
......@@ -305,7 +312,7 @@ export default {
}
this.$refs[formName].validate((valid) => {
if (valid) {
this.checkMessageSendCount();
this.saveEcmInfo();
} else {
this.$tips({type:'warning',message:'表单填写不完整'});
return false;
......@@ -329,7 +336,7 @@ export default {
endDate:this.form.expireType ? formateDateTimeByType(this.form.endDate,'yyyy-MM-dd-HH-mm-ss') : ''
}
if (this.form.effectType) {
params[this.radio] = this.form[this.radio] || 0;
params[this.checked[0]] = this.form[this.checked[0]] || 0;
}
if (this.isAdd) {
......
......@@ -100,6 +100,7 @@ export default {
created() {
this.ecmCurrentSendInfos();
this.$store.commit('mutations_breadcrumb',[{name:'营销管理',path:''},{name:'智能营销',path:'/ecm'},{name:this.$route.params.name + ' - 实时发送记录',path:''}]);
this.$message({type:'warning',duration:5000,message:'历史数据限制:2018年11月15日之前的历史营销计划,没有详细数据'});
},
methods: {
handleSelectionChange(val) {
......
......@@ -119,7 +119,7 @@ export default {
this.close();
},
add() {
winodw.open('/marketing/#/card/add');
window.open('/marketing/#/card/add');
},
refresh() {
this.listParams.currentPage = 1;
......
......@@ -95,7 +95,7 @@ export default {
this.$emit('update:show',false);
},
add() {
winodw.open('/marketing/#/message/temp/add');
window.open('/marketing/#/message/temp/add');
},
refresh() {
this.listParams.currentPage = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment