记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董敬伟
liquidnet-bus-v1
Commits
a5a03f2f
Commit
a5a03f2f
authored
Feb 21, 2022
by
dongchun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新品推荐部分逻辑
parent
a8cc61d5
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
419 additions
and
2 deletions
+419
-2
LocalAdminController.java
...t/admin/web/controller/zhengzai/LocalAdminController.java
+5
-0
RubikArea.html
...resources/templates/zhengzai/store/homeSet/RubikArea.html
+4
-2
index.html
...ain/resources/templates/zhengzai/store/homeSet/index.html
+3
-0
newRecommended.html
...rces/templates/zhengzai/store/homeSet/newRecommended.html
+396
-0
topBanner.html
...resources/templates/zhengzai/store/homeSet/topBanner.html
+11
-0
No files found.
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/java/com/liquidnet/client/admin/web/controller/zhengzai/LocalAdminController.java
View file @
a5a03f2f
...
@@ -148,5 +148,10 @@ public class LocalAdminController extends BaseController
...
@@ -148,5 +148,10 @@ public class LocalAdminController extends BaseController
{
{
return
prefix2
+
"/goodsIntersection/index"
;
return
prefix2
+
"/goodsIntersection/index"
;
}
}
@GetMapping
(
"/newRecommended"
)
public
String
newRecommended
()
{
return
prefix2
+
"/homeSet/newRecommended"
;
}
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/store/homeSet/RubikArea.html
View file @
a5a03f2f
...
@@ -187,7 +187,7 @@
...
@@ -187,7 +187,7 @@
}
}
})
})
})
})
promiseMethods
(
'/goblin-front-cube/list'
,
'post'
).
then
(
res
=>
{
promiseMethods
(
'/goblin-front-cube/list'
,
'post'
,
{
type
:
1
}
).
then
(
res
=>
{
let
{
data
}
=
res
;
let
{
data
}
=
res
;
if
(
data
&&
data
.
length
>
0
)
{
if
(
data
&&
data
.
length
>
0
)
{
let
arr
=
data
[
0
].
spuId
.
split
(
','
);
let
arr
=
data
[
0
].
spuId
.
split
(
','
);
...
@@ -201,6 +201,7 @@
...
@@ -201,6 +201,7 @@
$
(
"#optionsRadios4"
).
attr
(
'checked'
,
true
).
parent
().
siblings
().
children
().
removeAttr
(
'checked'
);
$
(
"#optionsRadios4"
).
attr
(
'checked'
,
true
).
parent
().
siblings
().
children
().
removeAttr
(
'checked'
);
}
}
mid
=
data
[
0
].
mid
;
mid
=
data
[
0
].
mid
;
cubeId
=
data
[
0
].
cubeId
;
for
(
var
i
=
0
;
i
<
data
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
data
.
length
;
i
++
)
{
let
str
=
''
;
let
str
=
''
;
str
+=
`<div class="items" data-id="
${
data
[
i
].
mid
}
">
str
+=
`<div class="items" data-id="
${
data
[
i
].
mid
}
">
...
@@ -261,7 +262,7 @@
...
@@ -261,7 +262,7 @@
$
(
"input[name=optionsRadios]"
).
change
(
function
(
e
){
$
(
"input[name=optionsRadios]"
).
change
(
function
(
e
){
$
(
"#bannerList"
).
empty
();
$
(
"#bannerList"
).
empty
();
count
=
e
.
target
.
value
;
count
=
e
.
target
.
value
;
promiseMethods
(
'/goblin-front-cube/list'
,
'post'
).
then
(
res
=>
{
promiseMethods
(
'/goblin-front-cube/list'
,
'post'
,
{
type
:
1
}
).
then
(
res
=>
{
let
{
data
}
=
res
;
let
{
data
}
=
res
;
if
(
data
&&
data
.
length
>
0
)
{
if
(
data
&&
data
.
length
>
0
)
{
let
arr
=
data
[
0
].
spuId
.
split
(
','
);
let
arr
=
data
[
0
].
spuId
.
split
(
','
);
...
@@ -390,6 +391,7 @@
...
@@ -390,6 +391,7 @@
rowType
:
$
(
'input[name="optionsRadios"]:checked'
).
val
(),
rowType
:
$
(
'input[name="optionsRadios"]:checked'
).
val
(),
spuId
:
[],
spuId
:
[],
spuName
:
''
,
spuName
:
''
,
type
:
1
,
updateTime
:
updateTime
||
''
updateTime
:
updateTime
||
''
}];
}];
let
domData
=
$
(
'.items'
);
let
domData
=
$
(
'.items'
);
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/store/homeSet/index.html
View file @
a5a03f2f
...
@@ -155,6 +155,7 @@
...
@@ -155,6 +155,7 @@
<button
type=
"button"
class=
"btn btn-warning"
onclick=
"goArea(2)"
>
活动banner
</button>
<button
type=
"button"
class=
"btn btn-warning"
onclick=
"goArea(2)"
>
活动banner
</button>
<button
type=
"button"
class=
"btn btn-success"
onclick=
"goArea(4)"
>
魔方
</button>
<button
type=
"button"
class=
"btn btn-success"
onclick=
"goArea(4)"
>
魔方
</button>
<button
type=
"button"
class=
"btn btn-info"
onclick=
"goArea(7)"
>
精选商品
</button>
<button
type=
"button"
class=
"btn btn-info"
onclick=
"goArea(7)"
>
精选商品
</button>
<button
type=
"button"
class=
"btn btn-info"
onclick=
"goArea(8)"
>
新品推荐
</button>
<!-- <button type="button" class="btn" disabled onclick="goArea(3)">限时秒杀</button> -->
<!-- <button type="button" class="btn" disabled onclick="goArea(3)">限时秒杀</button> -->
</div>
</div>
<button
type=
"button"
class=
"btn btn-danger gitHot"
onclick=
"git()"
>
上线
</button>
<button
type=
"button"
class=
"btn btn-danger gitHot"
onclick=
"git()"
>
上线
</button>
...
@@ -235,6 +236,8 @@
...
@@ -235,6 +236,8 @@
$
.
modal
.
open
(
'精选商品'
,
prefix2
+
"/carefullyGoods?id="
+
num
,
900
,
800
,
cancel
)
$
.
modal
.
open
(
'精选商品'
,
prefix2
+
"/carefullyGoods?id="
+
num
,
900
,
800
,
cancel
)
// $.modal.openTab('精选商品', prefix2 + "/carefullyGoods?id=" + num)
// $.modal.openTab('精选商品', prefix2 + "/carefullyGoods?id=" + num)
break
;
break
;
case
8
:
$
.
modal
.
open
(
'新品推荐'
,
prefix2
+
"/newRecommended?id="
+
num
,
900
,
800
,
cancel
)
}
}
}
}
function
delSp
(
num
)
{
function
delSp
(
num
)
{
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/store/homeSet/newRecommended.html
0 → 100644
View file @
a5a03f2f
<!DOCTYPE html>
<html
lang=
"zh"
xmlns:th=
"http://www.thymeleaf.org"
xmlns:shiro=
"http://www.pollix.at/thymeleaf/shiro"
>
<head>
<th:block
th:include=
"include :: header('新品推荐')"
/>
<th:block
th:include=
"include :: bootstrap-fileinput-css"
/>
<style>
.home_page
{
display
:
flex
;
justify-content
:
center
;
padding
:
20px
;
}
.right_content
{
font-size
:
16px
;
font-weight
:
600
;
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
width
:
50%
;
}
.left_content
{
flex
:
1
;
}
.left_title
,
.right_title
{
margin-bottom
:
12px
;
}
.function_btn
,
.first_content
{
display
:
flex
;
align-items
:
center
;
margin-bottom
:
12px
;
}
.function_btn
.hot_title
{
font-size
:
16px
;
font-weight
:
600
;
}
.function_btn
.tags
{
display
:
flex
;
align-items
:
center
;
}
.function_btn
.tags_content
{
display
:
flex
;
flex-direction
:
column
;
}
label
{
margin
:
0
;
display
:
flex
;
align-items
:
center
;
}
.function_btn
.tags
label
input
{
margin
:
0
4px
0
12px
;
}
.function_btn
.tags
.tag
{
padding
:
6px
12px
4px
;
border
:
1px
solid
#ccc
;
border-radius
:
5px
;
position
:
relative
;
margin-right
:
12px
;
}
.function_btn
.tags
.tag
span
{
display
:
inline-block
;
position
:
absolute
;
top
:
-8px
;
right
:
-8px
;
width
:
18px
;
height
:
18px
;
line-height
:
16px
;
border
:
1px
solid
#aaa
;
border-radius
:
50%
;
background
:
#fff
;
text-align
:
center
;
cursor
:
pointer
;
}
.banner_list
{
display
:
flex
;
flex-direction
:
column
;
width
:
100%
;
}
.banner_item
,
.items
{
border
:
1px
dashed
#ccc
;
border-radius
:
10px
;
padding
:
12px
;
margin-bottom
:
20px
;
}
.img_show
,
.set_method
,
.set_function
{
display
:
flex
;
}
.title
{
font-size
:
16px
;
font-weight
:
600
;
width
:
80px
;
text-align
:
right
;
}
.kv-upload-progress
{
display
:
none
!important
;
}
.ibox-content
.imgBox
{
width
:
350px
;
max-height
:
180px
;
}
.jump
,
.ticket_name
,
.set_function_time
{
display
:
flex
;
flex-grow
:
1
;
align-items
:
center
;
}
.iptOrSelect
{
flex
:
1
;
}
.img_box
{
display
:
flex
;
flex-direction
:
column
;
}
</style>
</head>
<body>
<div
class=
"home_page"
>
<div
class=
"left_content"
>
<!-- <div class="function_btn">
<div class="hot_title">
展示形式新页面:
</div>
<div class="tags">
<label>
<input type="radio" value="1" id="optionsRadios1" name="optionsRadios"><span>一行一个</span></label>
<label>
<input type="radio" value="2" id="optionsRadios2" name="optionsRadios"><span>一行两个</span></label>
<label>
<input type="radio" value="3" id="optionsRadios3" name="optionsRadios"><span>一行三个</span></label>
<label>
<input type="radio" value="4" id="optionsRadios4" name="optionsRadios"><span>上一下三</span></label>
</div>
</div> -->
<div
class=
"function_btn"
>
<div
class=
"hot_title"
>
位置顺序:
</div>
<div
class=
"tags"
>
<input
type=
"text"
class=
"layui-input form-control titleIpt"
id=
"sorting"
value=
""
autocomplete=
"off"
placeholder=
"请输入模块顺序"
>
</div>
</div>
<div
class=
"left_title"
>
<button
type=
"button"
class=
"btn btn-info"
onclick=
"addItem()"
>
添加
</button>
</div>
<div
class=
"function_btn"
>
</div>
<div
class=
"function_btn"
>
<div
id=
"bannerList"
class=
"banner_list"
>
</div>
</div>
<div
class=
"footer_btn"
>
<button
type=
"button"
class=
"btn btn-success"
onclick=
"save()"
>
保存
</button>
</div>
</div>
<!-- <div class="right_content">
<div class="right_title">
</div>
<div class="function_area">
<iframe id="iframe" src="http://172.16.3.82:8080/#/goods/home?place=admin" width="375" height="1190" frameborder="0"></iframe>
</div>
</div> -->
</div>
<th:block
th:include=
"include :: footer"
/>
<th:block
th:include=
"include :: bootstrap-fileinput-js"
/>
<th:block
th:include=
"include :: bootstrap-suggest-js"
/>
<script
th:inline=
"javascript"
>
var
prefix2
=
ctx
+
"local"
;
var
platformUrl
=
[[
$
{
platformUrl
}]];
let
count
=
-
1
;
let
compilationsId
=
''
;
let
createTime
=
''
;
let
cubeId
=
''
;
let
mid
=
''
;
let
updateTime
=
''
;
$
(
function
()
{
// addItem (1);
let
url
=
window
.
location
.
hostname
;
if
(
url
.
includes
(
'test'
))
{
$
(
"#iframe"
).
attr
(
'src'
,
'https://ttestm.zhengzai.tv/#/goods/home?place=admin'
);
}
else
if
(
!
url
.
includes
(
'test'
)
&&
url
.
includes
(
'admin'
))
{
$
(
"#iframe"
).
attr
(
'src'
,
'https://m.zhengzai.tv/#/goods/home?place=admin'
);
}
else
{
}
promiseMethods
(
'/front-index/list'
,
'post'
).
then
(
res
=>
{
let
{
data
}
=
res
;
data
.
forEach
(
item
=>
{
if
(
item
.
moudleName
==
"XINPINTUIJIAN"
)
{
$
(
"#sorting"
).
val
(
item
.
indexs
)
}
})
})
promiseMethods
(
'/goblin-front-cube/list'
,
'post'
,
{
type
:
2
}).
then
(
res
=>
{
let
{
data
}
=
res
;
if
(
data
&&
data
.
length
>
0
)
{
let
arr
=
data
[
0
].
spuId
.
split
(
','
);
mid
=
data
[
0
].
mid
;
cubeId
=
data
[
0
].
cubeId
;
for
(
var
i
=
0
;
i
<
data
.
length
;
i
++
)
{
addItem
(
data
,
i
,
arr
)
}
}
else
{
addItem
()
}
// refreshItem()
})
})
// $("input[name=optionsRadios]").change(function(e){
// $("#bannerList").empty();
// count = e.target.value;
// promiseMethods('/goblin-front-cube/list', 'post').then(res => {
// let { data } = res;
// if (data && data.length > 0) {
// let arr = data[0].spuId.split(',');
// if (count == data[0].rowType) {
// for (var i = 0; i
<
data
.
length
;
i
++
)
{
// let str = '';
// str += `
<
div
class
=
"items"
data
-
id
=
"${data[i].mid}"
>
//
<
div
class
=
"first_content"
style
=
"align-items: flex-start;"
>
//
<
div
class
=
"hot_title"
>
// 选择商品:
//
<
/div
>
//
<
div
class
=
"tags_content"
style
=
"width: 553px;"
>
//
<
div
class
=
"input-group"
>
//
<
input
id
=
"goodsName${i}"
data
-
id
=
"${arr[i]}"
type
=
"text"
class
=
"form-control storeList"
placeholder
=
"${data[i].goblinGoods.name}"
>
//
<
div
class
=
"input-group-btn"
>
//
<
ul
class
=
"dropdown-menu dropdown-menu-right"
role
=
"menu"
>
//
<
/ul
>
//
<
/div
>
//
<
/div
>
//
<
div
class
=
"img_box"
>
//
<
img
id
=
"goodsImg${i}"
src
=
"${data[i].goblinGoods.coverPic}"
alt
=
""
style
=
"max-height: 180px;max-width:180px;margin: 12px 0;"
>
//
<
p
id
=
"goodsTitle${i}"
style
=
"width:180px;"
>
$
{
data
[
i
].
goblinGoods
.
name
}
<
/p
>
//
<
p
id
=
"goodsPrice${i}"
>
$
{
data
[
i
].
goblinGoods
.
priceLe
}
<
/p
>
//
<
/div
>
//
<
button
id
=
"del${i}"
type
=
"button"
class
=
"btn btn-danger"
style
=
"width: 60px;"
onclick
=
"del('${i}')"
>
删除
<
/button
>
//
<
/div
>
//
<
/div
>
//
<
/div>
`
// $("#bannerList").append(str);
// common(i)
// }
// } else {
// addItem (count);
// }
// } else {
// addItem (count);
// }
// // refreshItem()
// })
// })
function
addItem
(
data
,
i
,
arr
)
{
let
str
=
''
;
if
(
data
)
{
count
=
i
;
str
=
`<div id="item
${
count
}
" class="items" data-id="
${
data
[
i
].
mid
}
">
<div class="first_content" style="align-items: flex-start;">
<div class="hot_title">
选择商品:
</div>
<div class="tags_content" style="width: 553px;">
<div class="input-group">
<input id="goodsName
${
i
}
" data-id="
${
arr
[
i
]}
" type="text" class="form-control storeList" placeholder="
${
data
[
i
].
goblinGoods
.
name
}
">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>
<div class="img_box">
<img id="goodsImg
${
i
}
" src="
${
data
[
i
].
goblinGoods
.
coverPic
}
" alt="" style="max-height: 180px;max-width:180px;margin: 12px 0;">
<p id="goodsTitle
${
i
}
" style="width:180px;">
${
data
[
i
].
goblinGoods
.
name
}
</p>
<p id="goodsPrice
${
i
}
">
${
data
[
i
].
goblinGoods
.
priceLe
}
</p>
</div>
<button id="del
${
i
}
" type="button" class="btn btn-danger" style="width: 60px;" onclick="del('
${
i
}
')">删除</button>
</div>
</div>
</div>`
}
else
{
count
++
;
str
=
`<div id="item
${
count
}
" class="items">
<div class="first_content" style="align-items: flex-start;">
<div class="hot_title">
选择商品:
</div>
<div class="tags_content" style="width: 553px;">
<div class="input-group">
<input id="goodsName
${
count
}
" type="text" class="form-control storeList" placeholder="搜索商品名称">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>
<div class="img_box">
<img id="goodsImg
${
count
}
" src="" alt="" style="max-height: 180px;max-width:180px;margin: 12px 0;">
<p id="goodsTitle
${
count
}
" style="width:180px;"></p>
<p id="goodsPrice
${
count
}
"></p>
</div>
<button id="del
${
count
}
" type="button" class="btn btn-danger" style="width: 60px;" onclick="del('
${
count
}
')">删除</button>
</div>
</div>
</div>`
}
$
(
"#bannerList"
).
append
(
str
);
common
(
count
)
}
function
save
()
{
let
data
=
[{
compilationsId
:
compilationsId
||
''
,
createTime
:
createTime
||
''
,
cubeId
:
cubeId
||
''
,
goblinGoods
:
{},
informationA
:
''
,
informationB
:
''
,
informationC
:
''
,
informationD
:
''
,
mid
:
mid
||
'0'
,
delTag
:
'0'
,
pageType
:
''
,
rowType
:
''
,
type
:
2
,
spuId
:
[],
spuName
:
''
,
updateTime
:
updateTime
||
''
}];
let
domData
=
$
(
'.items'
);
Array
.
prototype
.
forEach
.
call
(
domData
,
function
(
item
,
index
)
{
data
[
0
].
spuId
.
push
(
item
.
querySelector
(
'.storeList'
).
getAttribute
(
'data-id'
)
||
''
);
});
//foreach js6章封装
data
[
0
].
spuId
=
data
[
0
].
spuId
.
toString
();
promiseMethods
(
'/goblin-front-cube/updateOrCreate'
,
'post'
,
JSON
.
stringify
(
data
),
'application/json'
).
then
(()
=>
{
let
data
=
{
"mid"
:
5
,
"moudleIndexId"
:
"70875412096233472977232"
,
"moudleName"
:
"XINPINTUIJIAN"
,
"indexs"
:
$
(
'#sorting'
).
val
(),
"updateTime"
:
"2022-01-06 13:55:31"
,
"createTime"
:
"2022-01-06 13:55:34"
,
"delTag"
:
0
,
"status"
:
0
};
return
promiseMethods
(
'/front-index/update'
,
'post'
,
JSON
.
stringify
(
data
),
'application/json'
)
}).
then
((
res
)
=>
{
layer
.
msg
(
"保存成功!"
)
$
.
operate
.
successCallback
(
res
);
})
}
function
del
(
num
)
{
$
(
"#item"
+
num
+
""
).
remove
();
}
function
common
(
num
)
{
$
(
".storeList"
).
bsSuggest
({
idField
:
'spuId'
,
// data.value 的第几个数据,作为input输入框的内容
keyField
:
'name'
,
// data.value 的第几个数据,作为input输入框的内容
allowNoKeyword
:
false
,
//是否允许无关键字时请求数据
showBtn
:
false
,
multiWord
:
true
,
//以分隔符号分割的多关键字支持
hideOnSelect
:
true
,
getDataMethod
:
"url"
,
//获取数据的方式,总是从 URL 获取
effectiveFields
:
[
'name'
],
url
:
'/compilations/goodsList?name='
,
/*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
processData
:
function
(
json
)
{
// url 获取数据时,对数据的处理,作为 getData 的回调函数
//字符串转化为 js 对象
let
data
=
{};
data
.
value
=
json
.
data
return
data
}
}).
on
(
'onDataRequestSuccess'
,
function
(
e
,
result
)
{
}).
on
(
'onSetSelectValue'
,
function
(
e
,
selectedData
,
selectedRawData
)
{
// 当前行的所有值都能拿到
let
index
=
e
.
target
.
id
.
replace
(
/
[^\d]
/g
,
''
);
// 选中的是第几组
$
(
"#goodsImg"
+
index
+
""
).
attr
(
'src'
,
selectedRawData
.
coverPic
);
$
(
"#goodsTitle"
+
index
+
""
).
text
(
selectedRawData
.
name
);
$
(
"#goodsPrice"
+
index
+
""
).
text
(
'¥'
+
selectedRawData
.
priceLe
);
$
(
'#del'
+
index
+
''
).
show
();
}).
on
(
'onUnsetSelectValue'
,
function
(
e
)
{
});;
}
function
promiseMethods
(
url
,
type
,
data
,
contentType
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
$
.
ajax
({
url
,
type
,
data
,
contentType
,
success
:
function
(
res
)
{
resolve
(
res
);
}
})
})
}
</script>
</body>
</html>
\ No newline at end of file
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/store/homeSet/topBanner.html
View file @
a5a03f2f
...
@@ -544,9 +544,20 @@
...
@@ -544,9 +544,20 @@
showCancel
:
false
,
showCancel
:
false
,
showClose
:
false
,
showClose
:
false
,
autoReplace
:
true
,
autoReplace
:
true
,
minImageWidth
:
'764'
,
maxImageWidth
:
'764'
,
minImageHeight
:
'1018'
,
maxImageHeight
:
'1018'
,
previewSettings
:
{
image
:
{
width
:
'764px'
,
height
:
'1018px'
}
},
dropZoneTitle
:
"请上传文件"
,
dropZoneTitle
:
"请上传文件"
,
maxFileCount
:
1
maxFileCount
:
1
}).
on
(
"filebatchselected"
,
function
(
event
,
files
)
{
//默认上传
}).
on
(
"filebatchselected"
,
function
(
event
,
files
)
{
//默认上传
console
.
log
(
files
,
$
(
this
))
$
(
this
).
fileinput
(
"upload"
);
$
(
this
).
fileinput
(
"upload"
);
})
})
.
on
(
"fileuploaded"
,
function
(
event
,
data
)
{
//上传回调事件
.
on
(
"fileuploaded"
,
function
(
event
,
data
)
{
//上传回调事件
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment